개발과 관련된 컨퍼런스들이 정기적으로 열리고 있다.

국내에서 주최되는 대형 개발관련 컨퍼런스
    •    JCO : http://jco.zdnet.co.kr
    •    Deview : http://deview.kr
    •    Devon : http://devon.daum.net
    •    H3 : http://h3.kthcorp.com
    •    SK Planet X : http://www.techplanet.kr

  그 중에 JCO는 현재까지 12회 개최된 오랜 역사를 가지고 있는 컨퍼런스다.




이번 JCO(제 13회)에는 약간의 불만이 생겼다.

  요즘 개발 컨퍼런스들이 ’각 분야별 트랙을 구성하여 그 안에서 분야에 대한 발표들을 배치하는 추세’인데 이번 JCO(제 13회)는 프로그램 구성이 뒤섞여 있는 중에 듣고 싶은 것들이 동시간 대에 몰려있어 아쉬움이 많다.

작년 개발 관련 컨퍼런스 프로그램
    •    2012 JCO 프로그램 : http://jco.zdnet.co.kr/12th/program.html?tr=51
    •    2012 Deview 프로그램 : http://deview.kr/2012/xe/index.php?module=timetable&act=dispTimetableTimetable
    •    2012 Devon 프로그램 : http://devon.daum.net/2012/all#.URdSsehFz-k
    •    2012 H3 프로그램 : http://h3.kthcorp.com/2012/schedule/
    •    2012 Planet X 프로그램 : http://www.techplanet.kr/program.html
        ◦    트랙 2개

  발표가 ’트랙별’로 구성이 되어 있으면, 내가 관심있는 트랙을 선택하여 그 트랙 안의 세션들을 집중 청취(자리 이동에 대한 부담감이 줄어든다)하거나 트랙을 오고가면서 세션들을 자신의 취햐에 맞춰서 선택하고 청취할 수 있는 선택의 자유를 얻을 수 있다.

    •    제 13회 JCO 프로그램 : http://jco.zdnet.co.kr/program.html

  제 13회 JCO의 프로그램은 프로그램 구성이 무작위적으로 구성(주최측에서 어떤 기준을 가지고 세션들을 나열했는지는 나로서는 알 수가 없다)되어 있어 들을만한 프로그램이 동시간대에 진행이 되는 느낌이 강하다(발표 주제들에 대한 개인적인 생각으로 나만 그렇게 느끼는 것인지도 모르겠다).


  이번에 발표세션들이 중구난방식으로 구성이 되어 있어서 세션 이동 동선을 잡기가 많이 애매하다. 개발 관련 분야들을 트랙으로 구분짓고 그 트랙에 따라 발표 주제에 따라 진행하거나 발표 주제에 대한 청취자 예측으로 청취자가 어느 발표에 몰릴지를 예측해서 분산배치를 했으면 어땠을까 하는데 말이다(발표 주제에 따라서 개발자들의 선호도가 많이 달라진다).


  작년에 참가비가 1만원에서, 올해 2만원이다. 1~2만원의 참가비야 아까울 것은 없다. ’돈을 내야 돈 아까운 줄 알고 마구잡이식으로 참가신청 안하고 신청한 돈이 아까워서 참석률이 높아진다’라고 생각한다. 고급 기술들을 전달해주는 자바 개발관련 유료 컨퍼런스가 될 것으로 짐작해볼 수가 있는데, 과연 이번 JCO 컨퍼런스가 그런 기대를 충족시켜줄 수 있을지는 두고봐야겠다.


Getter/Setter, toString() 과 hashCode() 등의 메소드들을 Lombok project의 애노테이션을 이용해서 손쉽게 작성해보자. 마크다운Markdown 으로 작성한 글이라서 블로그에 옮기는 과정이 번거로운 탓에 gitblog.ihoney.pe.kr 에 등록하고 링크만 걸도록 하겠다. 소스코드가 들어간 코드들은 앞으로 이렇게 작성해보려고 한다.

Lombok project : http://projectlombok.org/index.html

관련 페이지 : http://gitblog.ihoney.pe.kr/blog/2013/01/23/use-lombok-annotation-in-java-project/

올해도 어김없이! 한국 자바개발자 컨퍼런스가 열린다. ^^

제 13회 JCO 공지 : http://www.ksug.org/179

관련 사이트http://jco.zdnet.co.kr/

사전 참가신청http://jco.zdnet.co.kr/register.html?tr=4

페이스북 JCO 컨퍼런스 : https://www.facebook.com/jcoconf

미리미리 예약해놓는 것이 저렴한 참가비를 내고 참관할 수 있는 지혜다.

클라우드 컴퓨팅 쪽 경험을 해보고 싶어서, 이번에는 실습세션 [클라우드 서버를 이용한 서비스 개발 실습]을 신청했다. 

과연 우리는 기술추종자에서 기술선도자로서 나아갈 수 있을까?


나는 일찍가서 커피한잔의 여유를 즐기면서 개회사 ~ 축사는 Pass할 예정.



위 현상은 IE에서는 나타나지 않는다. 크롬브라우저에서만 나타난다.

 

 문제가 생기는 이유 : 

 

응답헤더에 ContentType 이외에 파일정보를 Header에 추가하는 코드 때문에 나타는 증상이다.  Internet Explore에서는 다운로드에 대한 파일정보를 헤더에 넣어줘도 이상이 없었지만, 크롬에서는 그것을 취약점 공격을 위한 수단으로 판단한 것으로 보인다. 

예제 코드 : 

HttpServletResponse response = (HttpServletResponse) ActionContext.getContext().get(StrutsStatics.HTTP_RESPONSE); response.setContentType("application/octet-stream; charset=utf-8"); try { //다운로드되는 파일의 정보를 헤더에 추가하는 코드 response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(item.getName(), "utf-8") + ";"); } catch (UnsupportedEncodingException ignored) { // do nothing }


 

 해결방법 : application/x-download 를 활용

 

해결 코드 :

HttpServletResponse response = (HttpServletResponse) ActionContext.getContext() .get(StrutsStatics.HTTP_RESPONSE); response.setContentType("application/x-download"); try { HttpServletRequest request = (HttpServletRequest) ActionContext.getContext() .get(StrutsStatics.HTTP_REQUEST); LOG.debug("User-Agent : " + request.getHeader("User-Agent")); if(request.getHeader("User-Agent").contains("Firefox")) { response.setHeader("Content-Disposition", "attachment;filename=\"" + new String(item.getName().getBytes("UTF-8"), "ISO-8859-1") + "\";"); } else { response.setHeader("Content-Disposition", "attachment;filename=\"" + URLEncoder.encode(item.getName(), "utf-8") + "\";"); } } catch (UnsupportedEncodingException ignored) { // do nothing } response.setHeader("Content-Transfer-Encoding", "binary"); LOG.debug("Content-Disposition : " + response.getHeader("Content-Disposition")); LOG.debug("Content Type : " + response.getContentType()); File file = new File(item.getPath()); FileInputStream fileIn = null; ServletOutputStream outstream = null; try { fileIn = new FileInputStream(file); outstream = response.getOutputStream(); byte[] outputByte = new byte[8192]; while (fileIn.read(outputByte, 0, 8192) != -1) { outstream.write(outputByte, 0, 8192); } outstream.flush(); } catch (FileNotFoundException e) { LOG.error(e); } catch (IOException e) { LOG.error(e); } finally { try { fileIn.close(); } catch (IOException e) { } try { outstream.close(); } catch (IOException e) { } }



인터넷을 뒤져봤지만, 쉼표(,)를 다른 문자로 대체하면 된다는 해결책 외에는 딱히 방법이 없었다.

구글을 돌아디나다가 검색해서 찾은 해결책을 기록한다.

출처 : http://stackoverflow.com/questions/2405568/java-webapp-adding-a-content-disposition-header-to-force-browsers-save-as-beh

익스플로러8, 크롬(18.0.1025.151), 파이어폭스(11)에서 정상 동작합니다.

IP주소 문자열을 가지는 목록 List<String> ipList 내부에 있는 IP주소를  정렬하는 방법

사용하는 클래스 java.util.Collections(class), java.util.Comparator(Interface)

정렬하는데 사용식 : 

Collections.sort(ipList, new IpListSortByIp());


IpListSortByIp.java

public class IpListSortByIp implements Comparator<String> {

        @Override
        public int compare(String o1, String o2) {
            try {
                if (InetAddress.getByName(o1).hashCode() > InetAddress.getByName(o2).hashCode()) {
                    return 1;
                } else if (InetAddress.getByName(o1).hashCode() < InetAddress.getByName(o2).hashCode()) {
                    return -1;
                }
            }
            catch (UnknownHostException e) {
                //Exception 처리
            }
            return 0;
        }
    }


간단히 정의를 한다면,

문자열 IP주소를 java.net.InetAddress 객체로 변형하여 그 객체가 가지고 있는 HashCode를 비교하여 정렬하는 방식이다. 

+ Recent posts