달력

102008  이전 다음

'2008/10'에 해당되는 글 30건

  1. 2008/10/31 웹 기반 정보 시스템 구현에서 고려할 사항(초안) (1)
  2. 2008/10/31 모델링에 대한 짧은 글 (5)
  3. 2008/10/31 서핑 on Intellectual Wanderlust (1)
  4. 2008/10/31 [복구] 돌연 관심을 끄는 녀석, Serializable 인터페이스 (2)
  5. 2008/10/31 [리뷰] 자바스크립트 개발 툴킷(JSDT) 살펴보기
  6. 2008/10/30 IE와 파일 다운로드 구현
  7. 2008/10/30 [리뷰] 자바 이론과 실습: 제네릭스 해부, Part 2
  8. 2008/10/30 마일린(Mylyn) 사용 팁 (1)
  9. 2008/10/30 LAN 환경에서 IE 사용이 어려울 때
  10. 2008/10/29 [리뷰] IBM DeveloperWorks - SpringDM for OSGi 스크린캐스트 첫번째 공개 (2)
  11. 2008/10/29 DateFormat 은 thread-safe하지 않다 (12)
  12. 2008/10/28 서울특별시의회 전자회의시스템 프로젝트 프로그램 개발자 폭행사건 (3)
  13. 2008/10/27 equals() 와 hashCode() 는 이클립스 자동생성 기능을 이용하자
  14. 2008/10/26 자바 스크립트에서의 API 변경 알림 a.k.a Deprecation in JavaScript (3)
  15. 2008/10/25 파이어폭스 사용자를 위한 JSR 검색 (1)
  16. 2008/10/24 토건의 나라, 반 IT 정부(?) (2)
  17. 2008/10/24 기술적인 논쟁, 그리고 ... (4)
  18. 2008/10/23 Non-Goals (2)
  19. 2008/10/23 이클립스 맞춤법 사전에 내가 쓰는 어휘 추가하기
  20. 2008/10/20 또 하나의 DDD (2)
  21. 2008/10/20 다시 보는 Published Interface
  22. 2008/10/18 흔적: AJN 1년의 흔적
  23. 2008/10/16 Hadoop?
  24. 2008/10/14 회의시간 절감을 위한 개발팀 회의 프로세스 (2)
  25. 2008/10/06 업무수행능력의 세 가지 차원
  26. 2008/10/05 왜 뉴스/신문에서는 이런 이야기를 별로 다루지 않을까?
  27. 2008/10/02 Agile Context in Development라... 그림 좋네 (3)
  28. 2008/10/02 자바 기능(Feature) 사용 여부에 대한 판단 근거
  29. 2008/10/01 가니메데 새로운 기능(Problem 뷰 개선 등)
  30. 2008/10/01 Spring IDE 2.2 출시
사용자 삽입 이미지

이 그림을 본 탓인지 다음 주부터 본격적으로 고민해야할 문제에 대해서 먼저 그려봤다. 몇 번 반복하다 보면... 비스무리하게 나올 수 있을까?


Posted by 영회
펌질하다 알게 된 포스트: :::Starry Night::: :: 주기율표

와우~ 놀랍다. 예전에 모델링 하면 UML 다이어그램만 떠올리던 때와 달리.. 요즘에야 '공간을 활용하는 역량', '정보의 응축', '조직화', '균일한 추상화 수준' 같은 것들을 생각할 수 있게 되었다. :::Starry Night::: :: 주기율표의 그림을 보라. 앞에 나열한 단어 같은건 무시하고, 보기만 해도 눈이 즐겁지 않은가.

soldierant님이 촬영한 Flickr User Model, v0.3.

그리고 이 그림[각주:1]. 보는 순간 나도 이런 그림을 그려보고 싶다는 욕심이 생긴다.

Posted by 영회
댓글을 타고 찾아간 강규영님 블로그. 강규영님의 selenium을 이용한 ajax 애플리케이션 테스트 자동화가 떠오르지만, 최근 포스트에는 유머, 유엑스.. 점심 시간을 이용한 서핑 & 펌질

예전에 노무현 대통령님 보고 조중동이 하도 "코드 인사", "코드 인사" 하니깐, 이런게 생각 났었는데 말이죠:

printf("hello world\n");

// 이것이 진정한 코드 인사

출처: 유인촌 욕설을 코드로 나타내면?

  • 최소한의 노력으로 두 개의 윈도를 한 번에 볼 수 있게 배치할 수 있어야 한다.
  • 문서의 높이는 최대로, 넓이는 글읽기에 적합한 크기로 배치할 수 있어야 한다.
  • 실행 중인 윈도를 쉽고 빠르게 확인할 수 있어야 한다.
  • 최대화(maximize), 원래대로(restore)와 같이 자주 쓰이는 액션은 마우스를 정밀하게 조작하지 않고도 쉽게 행할 수 있어야 한다.
  • 시스템을 제어하고 있다는 느낌을 갖도록 해야 한다
출처: Windows 7 UX 에 대해 (part 2)

내 삶에 직접 도움을 줄지는 의문인 목록이다. 그러나, 요구사항의 '명쾌함'에 대한 흔적 + a를 위해...


실패에 대한 오해들

여러 팀의 기획/디자인 방법을 조사하여, "생산적으로 실패하기"를 저해하는 몇 가지 공통적인 실수들을 모아보았다.

실수1 - 명확한 비전 없이 작업하기.
실수2 - 실패 후 분석(introspection)않고 지나가기
실수3 - 실패로부터 배운 교훈들을 공유하지 않기
실수4 - 반복(iteration)이나 실험에 시간을 들이지 않기
실수5 - 변화에 유연하게 대처할 수 없는 플랫폼
실수6 - 피드백 없이 너무 많은 것을 만들기
실수7 - 측정 없이 기획/디자인하기
실수8 - 불충분한 피드백. "도움이 됐습니까? 예/아니오" 정도는 부족하다.

출처: '실패'는 선택이 아니라 필수

위 내용은 '애자일 OOO'를 해보자고 하면서 제일 많이 고민했던 내용. 해보지 않았을 때는 스크럼이니 스파이크니 이런 게 중요한 줄 알았다.@@


테스크바의 역할은 크게 네 가지인데
  • 시작하기(시작버튼)
  • 실행하기(시작메뉴와 빠른실행)
  • 작업전환(테스크밴드)
  • 속삭임(알림 영역, 혹은 System Tray라고 불리던 곳, 즉... Balloon이 뜨는 곳)
입니다.

이 네 가지 역할을 더 잘 수행할 수 있도록 하기 위해 (다양한 연구 결과) 다음과 같은 원칙을 세웠다고 합니다:
  • 더 쉽게 윈도를 전환할 수 있어야 한다.
  • 일상적으로 쓰이는 항목과 작업에 쉽게 접근할 수 있어야 한다.
  • 사용자가 시스템을 원하는대로 제어할 수 있다는 느낌을 주어야 한다.
  • 룩&필이 더 깔끔해져야 한다.
출처: Windows 7 UX 에 대해

업무 화면의 표준 구성과 제어 흐름을 설계해야 하는 시점인데, 영감을 준다. 명확한 역할 정의가 얼마나 오해를 줄여줄 수 있을까? 사뭇 기대된다. 개념을 잘 정의한 윈도우 7 팀의 글도, 명세(specification)의 좋은 사례처럼 보인다.

jslibs - Google Code
이건 어디에 써먹을 수 있을까?

Jack - Confluence
와우... JS Mock... 우리에게도 효용성이 있을까?

사람은 종종 일반적인 감각에서 발생된 혹은 발생될 것이라는 예상에 맞는 것을 상기한다. 하지만 이것은 실제적 사건에 대한 기억이 아닐 수 있다.
출처: 사용자 인터뷰를 할 때 주의할 점들

맞어. 절대 조심할 내용.

JSON-Object-Element Mapper
jQuery? Dojo? 뭘 써야 할까?

사용자 삽입 이미지

'개소리'란 말을 써야 할 때... 품위를 위해 사용할 아이콘으로 펌질[각주:1]

Circular Dependency
소프트웨어 복잡도에 대해 논할 때 인용할만 하다^^

Xquared 20080423 버전 릴리즈
한 동안 잊고 살았던 Xquared. 음... tinyMce를 쓰기로 했는데, 대신할 수 있을까?

테스트 주도 개발이란
이런. 예전에 일민형이란 나눈 대화랑 같구먼.

70개까지만... 읽고 포기

캐싱: 개발과 UI 디자인의 또다른 공통점
71번째
Posted by 영회
* 이글은 과거 엠파스 블로그에 썼던 것을 소실했다가, 제갈갈비님이 펌해둔 것을 통해 복원한 글입니다. 원문 작성 시점: 2005/02/04 (금) 14:46

객체건 뭐건 결국 바이트의 흐름으로 전송하게 된다. 저장도 그렇고...
다시 읽었을 때 객체의 자료구조를 그대로 보존하지 않으면 객체 지향 프로그래밍은 없다.
자바에선 Serializable 인터페이스만 구현하면 알아서 이를 보장해준다.
일명 Serialzation

단지 implements Serializable 만 추가하면 되기에 이 녀석을 관심을 대상에서 배제된다.
공기가 흔해서 고마움을 모르듯이(?)

사용자 삽입 이미지

내가 만든 InvalidEmployeeNameException 클래스는 Exception을 상속받아서 자연스레 Serializable 인터페이스도 구현하게 된다. 늘 그냥 쓰던 것인데 새삼스레 경고가 뜬다. 에러는 아니지만 찜찜해서 코딩하다 말고 중간중간 이녀석을 해결할 것을 고민하게 된다.

경고는static final long 타입의 serialVersionUID 상수를 선언하라는 것이다.

API를 뒤척이다 관련된 내용을 찾았다. 지금 읽고 있다.

찾아보니 Serializable 인터페이스 이외의 경우에도 보안 등의 용도로 많이 쓰였다.
일종의 객체에 대한 지문(fingerprint)으로 이해할 수 있을 것 같다.

음... 중요한 내용인데 어설프게 정리했다가 오해의 소지가 날 수 있어서 일단 해석만 해야겠다.

Serializable 인터페이스를 구현한 클래스는 자신의 serialVersionUID를 명시적으로 선언할 수 있는데, 필드의 이름은 "serialVersionUID"이며, static, final 이어야 하며 long타입이다.

예) private(추천) static final long serialVersionUID = 42L;

만 일 serialVersionUID를 지정하지 않으면 실행시점에서 serialization을 담당하는 모듈이 디폴트 값을 산정하게 되며, 그 알고리즘은 Java(TM) Object Serialization Specification 정의된 것을 따른다. 그러나 모든 serialization이 필요한 클래스에 명시적으로 serialVersionUID 값을 선언해줄 것을 강력하게 권유한다. 그 이유는  디 폴트 serialVersionUID 계산은 클래스의 세부 사항을 매우 민감하게 반영하기 때문에 컴파일러 구현체에 따라서 달라질 수 있어 deserialization(serialization 했던 객체를 복구하는 과정)과정에서 예상하지 못한 InvalidClassExceptions을 유발할 수 있다.
그러므로, 서로 다른 자바 컴파일러 구현체 사이에서도 동일한 serialVersionUID 값을 얻기 위해서는 명시적으로  serialVersionUID 값을 선언해야 한다.가능한 serialVersionUID을 private으로 선언하기를 권장한다. 상속되어 쓰여지는 것은 유용하지 않고, 해당 클래스에서만 쓰일 것이기 때문이다.

A serializable class can declare its own serialVersionUID explicitly by declaring a field named "serialVersionUID" that must be static, final, and of type long:
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L; If a serializable class does not explicitly declare a serialVersionUID, then the serialization runtime will calculate a default serialVersionUID value for that class based on various aspects of the class, as described in the Java(TM) Object Serialization Specification. However, it is strongly recommended that all serializable classes explicitly declare serialVersionUID values, since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations, and can thus result in unexpected InvalidClassExceptions during deserialization. Therefore, to guarantee a consistent serialVersionUID value across different java compiler implementations, a serializable class must declare an explicit serialVersionUID value. It is also strongly advised that explicit serialVersionUID declarations use the private modifier where possible, since such declarations apply only to the immediately declaring class--serialVersionUID fields are not useful as inherited members.
Posted by 영회
자바스크립트 개발 툴킷(JSDT) 살펴보기

문두에서처럼 정말 '자바스크립트 개발은 쉽지 않다.' 더구나, 정적인 타입을 제공하는 언어가 아니기에, 자바나 C# 등에서 쓰는 IDE 같은 편리한 기능은 생각지도 못한다. 지인들의 평가로는 그나마 앱타나 정도가 호평을 받았지만, 웹 전용이면 몰라도 JDT와 같이 쓰기엔 무겁고 불안했다. 

위 글을 따르면, 'JSDT는 JDT(Java Development Toolkit)에서 착안한 핵심 설계와 같은 많은 기능을 제공한다. JSDT는 WTP(Web Tools Platform) V3.0 배포판에 있는 자바스크립트 편집기를 대체할 예정이다.'라고 하는데.. 원문은 5월에 공개했기에 미래형으로 쓰인 것이다. 현재 이클립스 가니메데 JEE 에디션의 경우는 JSDT 1.0.2 버전이 설치된 것을 확인할 수 있었다.

기본적인 편집 기능이 과거에 비해 상당히 개선되었다. 이클립스는 오픈소스로 존재하던 소소한 플러그인들은 빠르게 흡수하는 것 같다. 조만간 자바 스크립트 개발환경에 대해서 고민해야 하는 일이 생겼는데, 여력이 생기면 JSDT에 대해 좀 더 살펴보고 그 내용을 공유할 수 있음 좋겠다.

영문이긴 하지만, 참고 자료 링크의 이클립스 JSDT 위키이클립스 ATF 프로젝트도 둘러봄직하다.
Posted by 영회
파일 다운로드를 테스트 하는데 공백이 더하기(+) 기호로 다운로드 된다고 한다. 그래서 다음과 같은 코드가 들어갔다. 파이어폭스에서는 잘 된다.

            if ( browserType.indexOf( "MSIE" ) >= 0 ) {
                fileName = URLEncoder.encode( fileName, encode ).replaceAll("\\+", "%20");
            }

확장자가 없는 파일을 올려야 하는 특수한 요청이 있었다. 우리 팀원이 다운로드도 잘 되는지 테스트 해봤다. 파이어폭스는 잘 된다. IE는 파일명을 인코딩 한 형태로 다운로드한다. 그 외에도 IE의 경우는 'content-type'을 "application/octet-stream;"으로 설정해야 한다거나 하는 몇 가지 점검할 사항이 더 있다.
Posted by 영회
자바 이론과 실습: 제네릭스 해부, Part 2

아마존 별 다섯개에 빛나는 Java Concurrency in Practice의 저자 Brian Goetz다운 글이다.

  • 자바의 기본에 충실하면서
  • 쉽지 않은
내용을 다루면서 동시에 그다지 길지 않은 글 속에 할 말은 다 담았다. 'List<Integer>는 List<Number>가 아니다' 를 반복하며 글은 시작한다. 다형성 탓에 쉽게 혼란을 겪을 수 있는 부분을 지적하는 전개는 매우 효과적이다. 전형적인 예제를 통해 빠르게 설명을 한 후, 이내 '제네릭 타입 매개변수를 명시하는 대신, 타입 매개변수의 상한 경계(upper-bound) 또는 하한 경계(lower-bound)를 명시'한다는 지네릭스의 비밀(?)을 슬쩍 공개한다. 한편, 자바 표준을 정하는 전문가들의 실수까지 까발려 독자를 독려한다.

java.util.concurrent 패키지의 AbstractExecutorService에서 invokeAll()의 인자는 원래 Collection<Callable<T>>였다. 이 때문에 invokeAll() 사용이 매우 번거로웠다. 정확히 Callable<T>를 매개변수로 지정하는 컬렉션을 써서 작업 집합을 구성해야 했기 때문이다. 자바 6에서는 시그너처가 Collection<? extends Callable<T>>로 변경되었다. 도대체 얼마나 이런 실수를 저지르기 쉬운가 보라. invokeAll() 메서드를 더 정확히 수정한다면, Collection<? extends Callable<? extends T>> 인자를 수용하도록 해야 한다. 후자의 코드가 흉하게 보일지는 몰라도, 사용자 코드에서 고정된 타입으로 굳이 감싸지 않아도 되는 장점이 있다.

Brian GoetzJava Concurrency in Practice은 번역서로도 존재한다.

자바 병렬 프로그래밍 - 10점
더그 리 외 지음, 강철구 옮김/에이콘출판
Posted by 영회
4. 이슈간 링크는 '#번호'
이슈/티켓 사이에 관계가 있는 경우가 비일비재하다. #과 이슈 번호를 붙여 쓰면 마일린 내부 링크가 만들어진다. 좋아~


3. SI 형태로 프로젝트를 수행하는 경우, 고객 사이트의 보안측면에서 프로젝트 룸을 떠나면 개발환경 즉, 각종 저장소에 접근이 힘든 경우가 일반적이다. 이런 경우 오프라인으로 작업할 수 있는 기능은 무척 편리하다. 노트북을 사용하는 경우에 물리적인 공간에 대한 제약이 없지만, 맥락에 대한 유지없어 나홀로(?) 작업을 하는 것이야 언제나 가능하다. 그러나, 완전하지는 않지만, 텍스트 기반으로 이력을 저장하는 svn/cvs류는 협업을 원격에서 할 수 있게 해준다.


 마일린의 경우도 이른 지원한다. 로컬에서만 티켓의 상태나 부가정보를 변경하여 저장하면 위 그림처럼 화살표 아이콘이 등장하고, 이후 제출(submit)하면 동기화가 이러난다. 온라인으로 프로젝트 관리 등을 지원하는 도구들이나 웹 기반 이슈 트래커는 오프라인에서 작업이 불가능한 것이 일반적이란 점을 생각하면, 짜투리 시간까지 활용할 수 있게 하는 정말 유용한 기능이다. 자칫 인터럽트에 의해서 깜빡했던 작업관리/이슈관련 커멘트를 놓쳐버리는 일도 줄여줄 수 있다. ^^

2. Trac에서 Mileston을 적용했는데도, 드롭다운 리스트에 나타나지 않는 경우. 갱신을 해도 마찬가지일 때가 있다. 해당 티켓을 다시 submit하고 다시 드롭다운 리스트를 보라.
사용자 삽입 이미지

1. 마일린의 Planning 탭 스케줄 기능으로 팀원 일정 관리를 하려했더니만... Personal Planning의 경우는 개인별 스케줄 관리로 공유가 안되었다. 주의할 것.. ㅡㅡ;
사용자 삽입 이미지

Posted by 영회
어느날 갑자기 LAN에 존재하는 http 서비스 접근이 파이어폭스에선 가능하고, IE에선 불가능했다. 프로젝트 때문에 SPS(Share Point Services)를 설치해쓰는데 접근이 어려웠다. 업무상 자주 써야 하는데 원인을 몰라 엉뚱한 조치를 했다.[각주:1]

사용자 삽입 이미지

우여곡절 끝에 이유를 알았다. IE의 LAN 설정을 보니 LAN에 프록시 서버 사용을 하게 설정되어 있었다. 명시적으로 이런 일을 하지 않았는데... 기억과 구글을 뒤져보니 Provoxy를 설치한 적이 있는데, 그때 설정했던 듯 하다. @@

위 그림처럼 체크를 지우니까 정상 동작한다.
  1. IE8 Beta가 뜨길래 혹시나 하는 마음에 설치했다. [본문으로]
Posted by 영회


일민형이 예의 차분한 목소리로 스크린 캐스트를 올렸다. 지극히 개인적으로는 '안영회님'으로 소개하는 부분이 듣기에 어색하기도 하고, 작년 12월 KSUG 세미나에서 들은 후, 만 10개월만에 일민형이 세미나 혹은 강의를 하는 모습을 듣는 것이 맨날 채팅으로 얘기하는 사람임에도 새삼스럽게 반가웠다.

캐스팅은 직접 들어보길 바란다. 평소 그가 고민하고 노력한 내용을 응축해서, OSGi를 처음보는 사람까지 고려해서 발표했다. 36.5분이란 제한 시간을 꽉꽉 눌러서 잘 활용했다. 일민형이 올린 포스팅을 보면, 간단한 부가 설명이 뒤따른다:

IBM DeveloperWorks - SpringDM for OSGi 스크린캐스트 첫번째 공개


Posted by 영회
javadoc을 보면 아래 내용을 확인할 수 있다.

Synchronization

Date formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally.

따라서, 아래와 같은 코드는 문제를 유발할 수 있다.

    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

    public static final String calcFullAge(Date today, String s) {
         ...
        String currentDate = sdf.format(today).substring(4);
        ...
    }

다음과 같이 매번 인스턴스를 새로 생성하게 해주는 것이 좋다.

        String currentDate = new SimpleDateFormat("yyyy").format(today);
Posted by 영회
정말 아직도 이런 일이 있을까?

서울특별시의회 전자회의시스템 프로젝트 프로그램 개발자 폭행사건

정말이었다. ㅡㅡ;
Posted by 영회
다음과 같이 equals()를 작성해서 Object.equals()를 오버라이딩 했다고 해보자.

     public boolean equals(Object obj) {
        if (obj == null || ! (obj instanceof SomeClass)) return false;
       
        SomeClass that = (SomeClass)obj;
        return ((this.fieldA== null && that.getFieldA() == null) || this.fieldA.equals(that.getFieldA()))
     && ((this.fieldB == null && that.getFieldB() == null) || this.fieldB .equals(that.getFieldB()));
    }

이 코드가 과연 어떤 문제가 있을까? 실제로 이런 코드에 단위 테스트가 없다면 쉽게 버그를 찾기 힘들다. 자바 기초를 배우는 때라면 오히려 쉬울지 몰라도, 수천 개 혹은 수만 개 클래스에 속한 메소드라면 더욱 어렵다.

아래 테스트 코드로 문제를 찾아낼 수 있었다.

// someObject 는 정상적으로 초기화
    public void testEqualsObject() {
        try{
            new SomeClass (null, null, null, null, null).equals(someObject);
        }catch (NullPointerException e) {
            fail(e.getClass().getName() + " is caught");
        }
    }

또한, 위 코드를 작성했을 때, hashCode() 는 빼먹었다고 하면 hashCode() 의 contract를 위반한다. 더구나 hashCode()를 효율적으로 작성하려면 알고리즘도 고민해야 한다. 고맙게도 이클립스는 알고리즘까지 포함하여 일반화 한 구현을 제공한다. 과거에는 별도 플러그인이 필요했던 것 같은데, 현재는 JDT 안에 기본으로 내장하고 있다.


Source 메뉴(Alt+Shift+S)에서 Generate hashCode() and equals()... 를 찾을 수 있다. 그러나, 이클립스가 은총알(silver bullet)은 아니기 때문에 equals() 에 사용할 필드는 지정해줘야 한다. 또한, 단순 비교가 아닌 방법으로 구현할 문제라면, 생성한 코드를 수정하는 것은 좋은 습관일 듯 하다. 아래는 사례로 올린 화면이라 속성 명은 좀 다르다.


결론적으로 일반적인 환경이라면 equals/hashCode()를 직접 구현하기 보다는 이클립스로 자동생성해서 혹시라도 발생할 수 있는, 그러면서 오류가 잘 드러나지 않는 버그를 만들지 말자.
Posted by 영회
우리 팀은 각종 UI 컴포넌트 조작을 위한 자바스크립트나 ActiveX 설정을 위한 태그를 숨기기 위해 래퍼(Wrapper) 형태의 자바 스크립트 파일을 작성해 공용 라이브러리로 썼다. 그런데, ActiveX 기반의 UI 솔루션이 버전업을 하면서 API 즉, 스크립트 문법을 크게 변경하면서 라이브러리 사용자는 영문도 모르는 오류를 만났다. 즉각 대응할 문제지만, 상용 솔루션이기 때문에 사용법을 익히기가 쉽지 않다. 우여곡절 끝에 우리는 상용 UI 솔루션 대신 우리가 제어할 수 있는 것들로 대체하기로 했다. 그러한 과정에서, 기존에 배포한 자바 스크립트 라이브러리 변경이 불가피했다.

릴리즈 노트 등을 통해 변경할 내용을 설명하는 기본적인 대응책 외에는 뾰족한 수가 없었다. 자바의 deprecate 같은 방법이 자바 스크립트에 없나 보니 쉽게 찾을 수 있었다:

Deprecation.js: easing the 1.5 → 1.6 transition

deprecation.js screenshot


경고(Warning)는 파이어폭스 전용인 Firebug에만 찍힌다는 제약은 있었지만, 자바의 deprecation 메커니즘을 파일 하나로 구현했다. 프로퍼티 설정을 통해 deprecation을 꺼버릴 수도 있다. :)
DeprecationNotifier.logDeprecation = false;
구글링으로 PHP의 사례, How to deprecate a function in PHP? 도 볼 수 있었다. 자바의 경우와 같은 문제를 다루지만, 해결 방식은 조금 달라보였다. 질문자가 만족한 답변은 PHP의 override_function() 이었다.

<?php
override_function
('strlen', '$string', 'return override_strlen($string);');
function
override_strlen($string){
        return
strlen($string); 
}
?>

자바의 override[각주:1]와 달리 override_function 은 시스템 함수를 대치할 때 사용한다. 자바에서와 같이 상속이 전제되는 override가 아니다. 스프링 사용자라면 메소드 교체(Method Replacement)와 유사하다 느낄 수 있을 것이다.

질문자가 원하는 답변은 아니었지만, 나머지 답변은 두 가지로 나눌 수 있다.
  • deprecate 함수를 호출하면 오류를 발생시키기
  • 소스코드 검사(inspection)을 통해 해당 함수 걸러내기
둘은 완전히 다른 관점에서 본 해결책이다. 전자는 내가 짠 코드가 익명의 사용자에게 쓰일 수 있는 환경을 고려한 것이라면, 후자는 소스코드에 대한 통제 혹은 소유권을 갖었다는 맥락(context)하에 내린 답변이다.

PHP 개발자는 아니지만, 잠깐의 곁눈질을 통해 흥미로운 경험을 할 수 있었다.
  1. 우리말로는 어떤 단어로 표현할 수 있단 말인가? '상속받는 것을 무시하고, 덮어버리기?' [본문으로]
Posted by 영회
FireFox 사용 개발자를 위한 검색 엔진 모임으로 이동
Posted by 영회
건강한 삶(?)을 위해 뉴스/신문은 피하려고 노력을 하면 살지만, 그렇다고 세상 소식과 단절할 수는 없어서 대개는 들려오는 뉴스나 다른 사람들의 소견을 통해 뉴스를 접합니다. 요 며칠 출근길에 들은 라디오에서는 특혜 시비를 불러올 수 있는 건설업체 지원 방안, 강만수 장관 경질 논의와 같이 주로 경제 문제더군요. 겨울에 미국에 가야하는지라 환율에 관심을 갖게 되는데 아침에 확인해보니 1400원대까지 올랐더군요. 

매일 아침 신문 대신에 RSS를 구독합니다. 그 중에 경제는 빙하기, IT업계는 핵빙하기라는 글이 눈에 띄었습니다. 몇 일전 외국에 사는 친구가 무슨 소리를 들었는지 '한국 IT가 어렵나?'고 했던 참인지라... 더 관심이 갔습니다. 링크를 따라가 보면 아래와 같은 인용문을 볼 수 있습니다.[각주:1]

“정보화 시대에는 IT(정보기술) 접하는 사람은 소득이 높고 접하지 못하는 쪽은 소득이 낮기 때문에 소득 격차가 벌어집니다. IT 기술은 일자리를 계속 줄였습니다.”

대통령의 발언이라고 하기엔 참담한 수준이지만, 이미 그의 행적을 통해 짐작한 내용을 확인해줬을 뿐이죠. 위 글의 댓글에 있는 이지원님의 견해를 보면 고개를 끄덕이게 됩니다.

그들은 정보화가 싫었을 겁니다. 정보화가 진행되며 그들이 잘,잘못이 만인에게 공개 되었죠. 그들은 예전처럼 정보를 쉽게 접할 수 없는 환경을 만들려고 노력할 것입니다.

대통령의 발언과 행동은 'IT 불평등을 해소하겠다'는 것이 아니라, IT의 역할을 축소하겠다는 것처럼 비춰집니다.

정부의 ‘IT 줄이기’는 내년 예산 편성에서도 확연하다. 행정안전부가 올해 기획재정부에 올린 내년 정보화 예산안은 2300억원. 이 중 1052억원만 확정됐다. 절반 이하다. 올해 예산인 1450억원에 비해서도 27%나 줄었다. 특히 김대중 정부 시절 시작된 ‘전자정부’ 사업 등 마무리 사업뿐이다. 신규사업 예산은 ‘0’이다.
출처: http://h21.hani.co.kr/arti/special/special_general/23546.html

김대중정부의 혜안이 놀랍게 느껴지는군요. 최근에 놀라운 사실을 들었는데, 공공사업을 주로하던 유명 솔루션 업체가 전체 직원의 20% 정도를 감원했습니다. 그 중에는 저와 친분이 있는 후배 녀석도 포함되어 있습니다. 확인해보지는 않았으나, 대형 SI 업체에서도 상당한 감원이 있다고도 하는군요.

한 발, 아니 수천 발 양보해서 IT 기술을 축소하는 것이 국가에 도움이 된다고 쳐봅시다. 그렇다면, 비전은 뭘까요? 9조를 써서 경쟁력 없는 건설업체 보전하면서, IT 예산을 줄이는 배경에는 어떤 비전이 있을까요?
  1. '토건의 나라'라니... 촌철살인이군요.. :) [본문으로]
Posted by 영회
우연하게 Annotations: Don't Mess with Java 라는 글을 읽었다. 아래 글은 무비판적으로 애노테이션(Annotations)이란 기술을 익히기 급급했던 나에게 통찰을 주었다.[각주:1]

Annotations are not MetaData . . .

Sun talks of annotations as being an extension to the existing metadata in Java. I disagree. Let’s define metadata. Metadata is data about data. I consider the reflection API as something that expresses metadata. It tells you about classes and their methods. It tells you about the types of arguments in your methods. It tells you about the structure of your pre-existing Java code.

. . . annotations are "DecorativeData"

Annotations tell you nothing about your Java code, they tell you nothing about the instances of your Java classes, methods or fields. However they supply additional properties about your Java classes, methods or fields. They're meant to supply additional data about how the software is to be compiled, deployed or executed. This is not metadata, it’s decorative data.

다시 한번 찬찬히 순서대로 글을 읽어보니, 이번에는 다른 시각으로 보게 된다. Don't Mess, kludge, don't fit, don't need, framework junkies, abused horribly !!

딱 세 줄을 읽었는데 부정적인 어휘들이 줄줄이다. 글이 쓰여진 시점은 2005년, 애노테이션 등장 초기로 보아도 무방할 듯 하다. 당시에 이런 냉혹한 비판이 있었지만, 그간 애노테이션의 보급은 늘었다.[각주:2] 결과가 이렇다 이런 비판이 틀린 것은 아니고, 무의미한 것은 더욱 아니다.

양자택일 구도로 몰지 않는다면, Robin Sharp 지적에서 분명 얻을 것이 있다. 인용한 글만 봐도 그의 말대로 메타데이터란 표현이 애노테이션에 어울리지 않아 보이기도 한다. 그러나, Walter Harley[각주:3]는 다음과 같이 말했고:

Program metadata – decorations on ordinary Java code

애노테이션은 VM 상에서의 메타데이터가 아니다. 다시 말해서 애플리케이션 수준의 메타데이터가 아니라, 프로그래밍 요소를 정의할 시점에서 메타데이터를 의미한다. 이를 고려하면 Robin Sharp의 지적은 다소 빗나간다고 듯 보이지만, 맞고 틀린 결과에만 초점을 고정하지 않고 살펴보면 다양한 국면을 볼 수 있는 눈을 갖을 수 있다.
  1. Annotation Hammer를 읽다보면 메타 데이터의 정의에 대해 혼란스러워진다. 클래스 정의 시점에서 부가적인 프로퍼티를 부여하는 것은 메타 데이터라기 보다는 데코레이션(Decoration)이라는 설명이다. [본문으로]
  2. EJB를 비롯한 Sun의 JEE 스펙을 빼고서 봐도, Spring, Hibernate, JUnit 등을 보라. [본문으로]
  3. BEA의 엔지니어인 그가 elipseCon 2008에서 발표한 'An introduction to Java Annotations'에서 인용 [본문으로]
Posted by 영회
명세서(Specification)를 보는데 Goals라는 절 다음 절 제목이 Non-goals였다. ;)

Non-Goals
Support for Java versions prior to J2SE 5.0
Annotations were introduced in J2SE 5.0. It is not possible to do annotation processing in versions prior to J2SE 5.0. It is not a goal of this specification to define a way of doing annotation processing of any kind for versions prior to J2SE 5.0.

종종.. 'OOO가 아닌 것'을 언급함으로써 설명하려는 내용을 보다 명확하게 할 수 있다.
Posted by 영회
사용자 삽입 이미지

가니메데를 쓰다보니 맞춤법 검사가 기본적으로 실행하나 보다. 내 이름을 타이핑했더니만, 빨간펜(?)이 따라온다. Quick Fix(Ctrl+1)를 시도하니 annoying을 추천하더니.. ㅋㅋ.
  • 맞춤법 검사(spell checking)을 비활성하거나
  • 현재 세션에선 무시하기에 이어서
  • 사전에 추가하기
같은 조언을 제공한다. Prompt에서 OK하면, Preferences가 자동으로 뜬다. 여기서 User defined dictionary 경로를 지정해야 한다. 텍스트 파일을 하나 만들어서 지정해주니까 빨간줄이 사라진다. ^^
사용자 삽입 이미지

해당 파일을 열어보면 어휘가 추가되어 있는 것을 확인할 수 있다.

사용자 삽입 이미지

R.J. Lorimer의 글을 보면 맞춤법 검사에 대한 이력과 함께, 공개한 사전을 받을 수도 있다.
Posted by 영회
얼마전 Sun Tech days2008에 참석했을 때 내용 자체보다는 다른 것들이 눈에 띄었다.

그 중에서 기조연설에서였나... 자바쪽 기술 변화를 다음 세 가지 구분으로 나눈 것

  • DESIGN
  • DEVELOP
  • DEPLOY
분석/설계, 개발, ... 이런 류의 작업 구분에 생각이 고정되어 있었다는 점을 퍼뜩 느꼈다. 개발자 과점에서 보면 명확한 작업/단계 구분이다. 종종 써먹어야겠다.
Posted by 영회
마틴 파울러가 Published Interface를 다루는 일이 쉽지 않다고 할 때 고개를 끄덕였다. 글을 읽는 간접 경험이 아니라 실제 Published Interface를 본격적으로 다뤄야 하는 입장에 서보니 느낌이 또 다르다.

프로그래밍 API가 바뀌는 것에 대해서는 사전에 대비를 했다. 설계 시점에 가변성이 있는 부분에 대해서는 일반화 한 인터페이스를 두었다. 스프링에서 그렇게 했든 3rd party 솔루션 연계가 있는 경우나 기업마다 다른 정책을 갖는 코드, 사용자 컴포넌트 등의 경우는 추상화 인터페이스가 요긴한 곳이다.

한편, 프로그래밍 API가 아니지만 포괄적인 의미에서 API에 대해서도 Published Interface 이슈를 따져봐야 한다.
  • 참조하는 라이브러리 변경
  • 참조 리소스(파일) 위치 및 디렉토리 구성 변경
  • 참조 리소스 내용(JS, JSP 파일 내용) 변경
  • 사전에 정의한 DB 스키마(테이블 이름 등) 변경
위 항목들은 Programming API 와 달리 deprecate 할 수도 없고, 대개의 경우 디버깅도 힘들어 기존 Published Interface 사용자들을 힘들게 할 수 있다 다.


Posted by 영회
오랫동안 방치했던 데스크탑을 정리하면서, Agile Java Network 운영할 때 자료를 찾았다. 지워버리는게 조금 아쉬워서 자료를 올려본다. 편집한 날짜를 보니까... 대략의 이력을 추적할 수 있다.

2006월 9월 자료: 이쯤에 Agile Java 책으로 처음 스터디 한 모양이다.

Agile java 스터디는 스프링 스터디 하다 말고, 기본의 중요성에 대해 쓴 포스팅에 대해 민재씨가 자바 스터디를 제안하면서 즉흥적으로 만들어졌다. 아쉽게 스터디를 촉발한 내 글을 남아 있지 않지만... 민재씨가 제안했던 흔적은 고스란히 남아 있다.
사용자 삽입 이미지

2006년 11월 자료: Agile Java 책으로 자바 기초 공부하면서.. '상속'에 대해 토론했던 그 자료
녹음 내용이 있다.


같은 날 발표 내용인 8. 9장인데 소리가 작다.



2006년 12월 자료: 가동성 훈련단이라는 제목으로 새로운 시도를 제안했던 자료. 다소 선동적이었는데, 새로움을 추구하는 친구들에게는 지지를 받았지만, 보수적인 분들이 스터디에서 이탈하는 계기이기도 했다.

더 뒤져보니 2006-11-20 에 퇴근 길에 걸어가면서 녹음한 내용이 있다. 기동성 훈련단 기획 내용 공유를 위해 녹음했던 것이었다.

다음날, 회비에 대해서 아이디어를 녹음한 것. 돈 문제는 무얼 하든 민감한 것 같다. AJN이 인기를 얻어 갑자기 커진 2007년 봄. 회비문제는 AJN이 다시 소그룹으로 바뀌는 직접적인 동인으로 작용했다.
 
12월에 발표한 10, 11장 내용

그리고 이벤트님의 Prototype 발표


애자일에 대해 처음 관심을 가질 시점이었나?



비슷한 시기 Agile Java 후반기 챕터인 Multithreading 발표를 위한 PPT(12장)
13장 녹음

DDD 스터디에 대해 논하던 내용


2007년 1월 자료: Agile Java 마지막 챕터로 기억하는 13장. Assertions and Annotations

2007년 5월 자료: Collection 관련 PPT



Posted by 영회
온라인으로 연락하다 한국을 방문한 네덜란드 친구 Rob이 Hadoop 개발자인 통에, 의도치 않게 관심을 갖게 되었다. 처음 만났을 때는 양국의 개발자 문화에 대해 이야기를 나눴다. 어제 SUN Tech days 행사에 참여했는데, 마침 Rob이 근처에 있었고, 통화로 Rob과 약속을 잡을 즈음에 NHN에서 Hadoop을 하시는 김TF팀장님과 만났다. 동석을 제안했고, 김팀장님이 수락해서 즐거운 저녁 시간을 보냈다.

Rob은 Hadoop의 필요성을 언급할 때 오라클의 한계를 항상 거론한다. '오라클'이란 말은 아마도 관계형 데이터베이스를 뜻하는 것이리라. 마침 RSS 피드 중에 Oracle opens Coherence Incubator 를 보았는데...

단일 시스템으로 커버하기 힘든 대용량 데이터의 경우, 만일 기존 RDBMS 중심 접근을 고수한다고 하면 Coherence 류를 적용하는 모습을 관찰(?)할 수 있다. 반면, 구글이 그랬듯 복잡한 쿼리(query) 언어의 강력함을 포기하면 보다 효율적인 검색성능을 얻을 수 있다. 대략, Hadoop 출현 배경에는 이런 고민이 들어 있는 듯 하다. 대화에 참여하여 파악한 수준이라 그저 감일 뿐이다. 물론, SI의 주요 타겟인 정보시스템과 포털, 미디어 도메인은 차이가 있지만... 일반화 할 수 있는 부분도 있다.. 대화를 나누는 와중에, 필연적으로 대두할 'SOA 환경에서의 검색' 같은 화두들도 머리 속을 떠다녔다.

마침 Hadoop-Primer 문서를 발견했다. 그리고 cloudera도 ...


Posted by 영회
프로젝트는 본질적으로 수많은 커뮤니케이션을 요구한다. 커뮤니케이션 수단을 지나치게 회의에 의존하면, 소모적으로 시간을 쓰기 쉽상이다. 종종, 야근이 잦은 프로젝트를 관찰해보면, 일과시간에는 주로 회의를 해서, 일과 후가 실제(?) 근무시간이 되는 경우를 볼 수 있다. 그간 회의에 대해 몇 개의 글을 쓴 흔적이 있구만...

회의에서의 의사진행 기법
지루한 회의? 효과적인 커뮤니케이션
2. 회의 관리자?

이러한 생각의 연장선에서 회의하는 모양새를 튜닝하던 중에 다음과 같은 공지를 올렸다.

회의시간 절감을 위한 개발팀 회의 프로세스
회의시간 절감을 위해 개발팀에서는 다음과 같은 프로세스를 지켜주시기 바랍니다.
1. 회의 주관자는 회의록을 작성하여, 회의의 목적과 결정사항을 분명히 하고, 소요 시간을 명기한다.
2. 회의 주관자는 회의 일정을 공지할 때, 회의록을 첨부하여 참석자가 회의에서 다룰 내용을 사전에 숙지하게 한다.
3. 회의 주관자는 일정에 올린 회의에 대해 참석자에게 공지하여 회의록을 미리 읽어보도록 독려한다.
4. 회의 참석자는 회의록을 미리 보고, 참석하여 주제에 벗어나는 이야기를 하지 않도록 노력한다.
5. 회의 주관자는 시간 내에 회의를 종료하도록 적극적으로 진행하고, 결정사항 위주로 회의록을 갱신한 후 이를 회람하게 한다.

Posted by 영회
Three Dimensions of High Performance 을 보면 공식을 정의하고 있고

Performance = Ability * Passion

패턴을 정의하고 도식화 했다.
http://leadinganswers.typepad.com/.a/6a00d834527c1469e201053549e7e1970b-pi
설명해가는 방식이 효과적으로 보인다.

자세한 내용은 Three Dimensions of High Performance 을 보시라
Posted by 영회
작년에 있었던 한화그룹 김승연회장 사건에 대한 언론의 태도와 비교해보면 너무 큰 변화가 아닌가 싶다. 정권이 바뀌어서 그런가? CJ그룹의 위력인가? 왜 그럴까? 김승연 회장 사건은 우발적인 것으로 기억한다. 그런데 이번에는 아래 기사들만 보아선 계획적인 사건같은데, 그렇다면 죄질이 더 안좋은 것 아닌가? 형평성 측면에서 봐도 고개가 갸웃한다.

CJ간부, ‘회장 돈’ 조폭에 떼이자 청부살인 기도

대기업 회장 차명계좌 둘러싼 엽기적인 살인청부 사건
CJ청부살인 의혹 2라운드 'CNI레저산업'...이재현회장 소유 '제2의 에버랜드?'

Posted by 영회
TAG CJ, 언론

좋아...

http://photos.smugmug.com/photos/384746511_Un8EL-L.gif


이건 한방에 와닿지는 않지만, 경험이 없어서 그런 것 같고...

http://photos.smugmug.com/photos/384746474_PvgoW-L.gif

출처: Agile Product Management: Providing Context

Posted by 영회
"자바 기능에 대해서 이를 썼을 때 장단점을 다룬 글이 있는가?"라는 질문을 받았다. 퍼뜩 떠오르지가 않았다. 각 기술 혹은 기능이 소개되면, 각각의 장단을 알아야 하는 것이 기본일텐데... 소홀하지 않았나 하는 생각이 든다. 어쨌든 관련 내용을 찾는 김에 링크를 남겨본다.

1) Annotation 관련
- To Annotate or Not?
- Annotation-Hammer 에서 To Annotate or Not To 절

2) Generics
- Generics gotchas
- Collections & Generics – Q & A

3) Java5 적용
- InfoQ: JRuby: Java5 or not?

4) 예외처리 메커니즘 관련
- InfoQ: Removing Checked Exceptions from Java
Posted by 영회
사용자 삽입 이미지

Problems 뷰에 개선이 있었다. 위에 보이는 것처럼 사전 정의한 다양한 필터를 제공한다. Problems 뷰의 경우 애플리케이션 개발자 입장에서는 보고 싶지도 않는 온갖 에러정보를 줘서 무시하는 경우가 많았다. 그래서인지 새로운 기능의 효용성에 대한 감이 없다. Congifure Contents 설정을 통해서 복잡한 조합으로도 뷰를 구성할 수 있다.

Form-based configuration dialog

이 보다 눈에 띄는 것이 Marker 뷰의 등장이다. Marker 뷰를 이용하면, problems, bookmarks, tasks 뷰 셋을 통합해서 볼 수 있다.

사용자 삽입 이미지

아래는 Problems 뷰 개선사항 요약이다:

  • Predefined filters for all errors and warnings on selection.
  • Union or intersection of problems showing.
  • A forms based configuration dialog.
  • Use of the commands defined in the workbench rather than custom actions. This means consistency with key bindings and the main window menu.
  • Working sets as first class selection sources. For instance, if the Package Explorer view is showing working sets and the Problems view is filtering on selection, you will only see the problems in that working set.
  • Show multiple content sets. The Problems view allows you to see all markers, or just the problems.

출처: http://download.eclipse.org/eclipse/downloads/drops/R-3.4-200806172000/whatsnew3.4/eclipse-news-all.html

Posted by 영회
버그나 에러를 해결한 것이 대부분인 듯 하다: Change Log

Update site: http://dist.springframework.org/release/IDE
Archived update site: spring-ide_updatesite_2.2.0_v200809261800.zip
Posted by 영회