Thursday, August 21, 2008

그들이 생활을 잘 하는 이유는

생활을 잘 한다는 것은, 자기자신이 자기자신(건강, 능력)이나 환경(재물, 주변인)을 만족스러운 상태로 만들며 살아가는 것.

그들의 공통적인 특징은 박식한 정보력보다는 판단력.

판단력에 가장 도움이 되는 것은,직접적 또는 간접적 경험.

그 다음 어떤 상황들이 일어날 수 있는지 variation이 pop되어 예측이 가능하기 때문이다.

간접적 경험은,
훈련이나 도구로 성장시키는 것이 가능할 것 같다.

책이외에도,
특별한 훈련과, 특별한 도구.

.

Tuesday, July 29, 2008

Console2


모든 파일이름이 영어로 되어 있고, 콘솔에서 영어만 쓴다면, 꽤 괜찮다고 생각하는 유틸리티.
설치했다가 지웠다. producer, consumer 패턴을 사용하는데 일본어나 한글이 있는 경우 cr/lf의 처리가 잘 되지 않는 경우가 발생했다.

그리고 저런 사진을 띄워놓는다면, 일 못하겠지.ㅎㅎ
사진은 친구 황지호의 딸 황민

Eclipse Console에서 utf-8 사용하기

기본적으로 일본어 윈도우, 일본어 인코딩을 사용하고 있지만, 가끔 테스트 코드라던지에 한글을 쓰기도 한다. 이런 때 Console에 utf-8 설정하기.




아. cmd라면 chcp 65001 (utf-8)을 사용하기도 한다. 일본어로 돌리는 것은 chcp 932

Tuesday, June 24, 2008

지나쳐가는 화두

블로그에 무얼 쓸까하고 화두를 떠올렸다가도 실제 작성하지 못하고 지나가버리는 아이템이 몇몇 있다. (실제로 집에가면 컴퓨터를 거의 하지 못한다.)

다음은 각각의 블로그 주제가 될 뻔 했던 아이템들

■불완전한 정보를 생산하는 사람보다
완전한 정보인지 확인하지 않은 채, 전달하는 일을 했던 사람의 잘못이 더 크다.

■Rich Client Web Application Development
SilverLight2도 나오고,

■OpenSource검색엔진

dictionary생성해서(또는 다운받아서), indexing만드는게 검색엔진의 핵심이니까 나중에 대규모의 엔진을 한번 만들어 보고 싶지만...

http://www.namazu.org/
perl, activeperl
http://qwik.jp/senna/
mysql binding
ruby binding

특히 namazu는 Win32 플랫폼을 지원한다. 이걸로 java source를 indexing해서 검색하면 뭔가 재미있는 것이 나올 수 있을까? Spring이나 Hibernate같은 소스를 로컬에 설치하고 인덱싱해놓고 검색 인터페이스를 하나만들어 놓으면 편리할까?

■어떤 곳에서 저렴한 비용으로 구입을 고려하고 있다고 하는 웹 로드 발란서
http://online.atworks.co.jp/product/network/webbeagle/index.html

■JDK 1.6에서 컴파일 한 것은, JRE 1.5에서 실행시
Bad version number in .class file 에러가 발생하는데 해결방법으로는
그냥 1.5 JDK를 인스톨해서 컴파일 하는 방법이 있고, 그 외에는
컴파일 옵션에 -source 5 -target 5와 -bootclasspath 를 추가하는 법이 있다.
http://java.sun.com/javase/6/docs/technotes/tools/windows/javac.html

예를 들면, 다음과 같이
javac -target 1.5 -bootclasspath jdk1.5.0\lib\rt.jar \ -extdirs "" OldCode.java


이상.

Monday, June 23, 2008

일본어 모지바께

오늘은 이쪽 관련 소스를 수정할 일이 있어서 작업을 하다가, 다른 사람들도 보았으면 하는 내용이 생각나서 적는다.

한번쯤 겪어보았을 만한 일본어의 전각 대쉬, 전각 마이너스등등의 문자가 출력하면 물음표로 나온다고 하는 것인데,
일본사람들 조차도 다음과 같이 테이블을 만들어 변형시키는 코드를 이용하는 경우가 있다.


그런데 이건, 더 간단하게 해결 할 수 있는데, 매 Character를 위의 코드처럼 반복해서 조사하지 않고 다음과 같이 하는 편이 훨씬 간단하다.



performance는 어느쪽이 얼마나 좋은지 측정해 보지 않았지만, 사족을 덧붙이자면...,
String을 New할 때의 Encoding을 지정하는 mapping table로 변환시키는 것이라고 가정할 경우, 후자가 더 빠르겠지..(정말 사족이군!)

Saturday, June 21, 2008

어떤 개발자의 데스크탑 화면


인터넷에서 어떤 개발자의 데스크탑 화면을 보게 되었다. 이 사진은 2004년 8월의 것. 주소를 얘기하자면 이쪽 이다.

이 화면이 재미있어서 한참을 살펴보았다.
2004년 정도에 옆으로 기다란 화면을 하고 있는, early adopter인듯 해 보이는 것은 둘째치고,
gvim으로 java 프로그래밍을 하고 있는 것도 차치하고(그런데 IntelliSense기능없이 이렇게 프로그램을 하는게 가능?) 가장 시간을 들여서 보았던 것은 바로

왼쪽의 GVIM의 소스의 내용!

보면 runnablequery라고 하는 패키지의 어떤 xxxProcessor라고 하는 클래스를 작성하고 있는데, 이 클래스 안에서 public static void main을 정의하고 있다. 아마도 작성하고 있는 클래스를 테스트 하기 위한 코드인 것 같은데,

2004년에 JUnit이 존재하지 않거나 많이 사용되지 않았나?
또는 테스트 프레임웍을 쓰기가 귀찮았나?(실제로 지금의 프로젝트도 20001년부터 작성되어온 시스템이어서 테스트프레임웍을 사용하고 있지 않았는데, 내가 JUnit을 사용한 코드를 commit하기라도 하면(실수로 commit했었다), 다른 개발자들의 환경에 JUnit이 없어 compiling이 broke됐다고 complained되었었다.)

저런 방법은 간혹 사용했던 적이 있지만, 그렇게 멋있어 보이지 않았기 때문에 소스안에서도 제일 마지막에 넣거나 했는데, 지금 저렇게 사용한 화면을 보니, 이 클래스를 어떻게 사용해야 하는지 가장 명시적으로 알려주는 help가 되는 것 같다.
사실 최근에는 Test Framework도 하나가 아니라 여러 종류여서 TestSuite만드는 것도 꺼려지는데, 저 복고풍의 TestCase가 다시 Simple하고 멋있어 보여진다.
deploy할 때 테스트하는 코드가 포함되어져 binary의 크기가 커져버리는 문제만 제외하면(그것도 static function이기 때문에!) 이쪽이 훨씬 우수한 것 같다. 컴파일 할 때 특정 함수만 제외하는 방법이 있을까? Ant로 어쩌면 가능할까? 하긴, GVim이 SDI이기 때문에 여러 파일을 open하는 것이 꺼려지기도 했겠지.

제일 첫 라인을 보면, comment되어 있는 것은 파일이 제대로 있었는지 확인을 하고, 확인을 했으니 comment out 해 놓은 것일 것이고, 두번째 라인을 보면 connectionProviderFactory의 main()을 호출하고 있다. 아마도 context어딘가에 connection을 만들어 넣어두는 것이겠고.
저 main()도 ConnectionProvoiderFactory를 test를 위해서 만들어 둔 것일 텐데 다시 써먹고 있다. ConnectionProvoiderFactory를 Test클래스를 만들어서 test를 했다면 이 클래스를 test하는데 Connection을 얻기 위한 코드를 어딘가에 중복해서 작성해야만 했을 것이다.

이 두라인만 보고도 "오호-"하는 소리가 나왔다.

그다음. 로깅.
apache logging을 사용하고 있다면, 매 클래스에서 static final로 logging클래스를 정의하는 것은 교과서적인 방법이고, 또 귀찮은 방법이다. properties(또는 xml)파일을 수정해야 하는 것도 그렇고.
Log.logToStderr = true;
저렇게 해서 모든 로깅을 볼 수 있다면.
여기서는 "으음-"하는 가벼운 신음소리가 나온다.

또, 저 소스를 보면 runnablequary.xxxProcessor라고 하는 클래스는 SessionCaching이라고 하는 interface(아마도 interface일 것이다.)를 implements하고 있다. 그리고 main은 똑같은 코드를 두번 사용한 것을 보면, caching기능을 테스트 하고 있는 것이 아닌가 생각된다. 아마도 caching을 만들어서 사용하는 것 같은데, 나라면 (공개되어 많이 사용하는 pooling라이브러리 사용을 선택했겠지만,) 그건 아마도 시스템을 다 만들어 놓고 난 뒤의 Performance개선을 위해서 였을 것이다.

이 클래스는 init()한 뒤에 run()하는 것이 주된 function으로 보이고, init()의 parameter로 QueryParameter계열의 클래스를 use하고 있다. 이 parameter를 만들 때를 보면 Dao나 BL을 직접 부르지도 않고 UserFactory로 한 번 더 wrap해서 static으로 호출하고 있다. 이것도 Cool!
Exception이 발생할 가능성도 처리해야겠지만, 여기는 테스트 목적이기 때문에 OK.

아마도, 이 desktop.jpg는, 길다란 스크린을 보여주고 싶은 것이 아니라, 작성하고 싶은 소스를 보여주고 싶었는지도 모르겠다.

나중에 시간이 나면 이 소스와 관련해 뭔가 있을 지, 더 찾아봐야겠다.

Thursday, June 19, 2008

not modified but refactorized

지금 하고 있는 작업은, 뭐랄까. 물론 개발도 하고 있지만, 소스의 교정작업을 하고 있다고 할까... 그런 류의 작업을 하고 있다. 웹 에이전시의 일을 하던 전 직장과는 완전히 대조적으로, 지금의 회사에서는 신규 개발의 안건은 굉장히 드물게 발생하고, 주된 작업이 기존의 시스템에 기능을 추가하는 작업이다.

꽤 오래전(java라면 2001년 정도?)의 현재도 운영중인 소스도 만날 수 있고, 그 뒤에 점점 Spring이니, Struts니 하는 것들이 추가된 코드들도 만나게 된다.
지금은 오픈 소스로 검증된 좋은 라이브러리들이 있지만, 그당시는 존재하지 않았기 때문에, 기능을 만들어서 사용하는, 즉 상당히 legacy한 코드들도 많이 있다.
예를 들면 지금은 ThreadLocal이라는 클래스가 기본으로 JDK에 포함되어 있고, 또 Scheduled Task도 Quartz라는 좋은 라이브러리가 있는데, 이것이 없었을 당시 만들어서 사용하던 코드들도 존재한다.


이중에는 잘 만든 소스도 있고, 잘 못만든 소스도 있다.
잘 못만든 소스도 기능만으로 보면 잘 돌아간다. (정말이지 이건 놀라운 일이다.) 테스트를 많이 했기 때문이다.
교정을 본다라고 하는 의미는, 기능면으로는 문제가 없지만, 비효율적으로 작성된 곳을 효율적으로 수정하는 일, 즉 Refactoring하면서 작업을 진행하고 있다. 이러한 일로는 Java의 경우만 보면;
  • final keyword 붙이기(위의 그림에도 final이 빠져있다!)
  • 중복해서 사용되는 String variables를 static final로 빼기
  • 너무 기다란 소스를 introduce하기
  • int <-> Integer의 Casting하는 부분 지우기
  • String 연산, 또는 StringBuffer를 사용한 곳을 StringBuilder로 바꾸기(필요한 곳만)
  • Spring 적용을 위해 non-Parameter Constructor 만들기(필요한 곳만)
  • new로 instance를 생성하는 곳을 Spring Bean Definition으로 변경하기
  • 변수 이름을 적절한 것으로 바꾸기(<- 상당히 많다. DTO, DAO, Entity의 구별이 전혀 안되는 변수부터, spelling이 잘못된 곳까지)
  • TestCase만들기
그런데, 어떡할 지, 아직도 망설이는 부분이 있는데, 만든 사람의 서명이 있는 부분이다.
거의 대부분의 소스의 제일 위에 이렇게 처음 작성한 사람의 이름이 적혀져 있다.

/**
* @author li-liu
* 作成日: 2005/05/02
*
*/

현재 일하고 있는 사람도 있지만, 지금은 이 회사에 없는 사람들이 더 많다. 원래 개발위주의 회사가 아닌 탓에, 외부의 회사에서 만들어져서 들여온 시스템이 많은 탓이다.

이 서명을 바꿔야 할까
그대로 놔두자니 꽤 소스의 모습이 많이 변형된 것들도 있고(몇 scroll이나 되는 그런 function들은 다 쪼개버렸고, action에서 db query하는 것들도 다 BL, DAO로 나눠버렸기 때문에!)
바꾸어서 내 이름을 적는다면 전체적인 설계를 내가 책임져야 하는 것 같고...

그래서 이렇게 추가해 버렸다.

/**
* @author li-liu
* 作成日: 2005/05/02
* not modified but refactorized by tonghyun-kim, 2008/03/03
*/

li-liu라는 사람(중국인이다)이 보면 기분이 나빠할 수도 있기 때문에 주의해야 하지만, 화일을 닫고 다음 화일로 넘어갈 때는 "and improved "라고 하는 말도 붙이고 싶은 충동이 생기는 것은 어쩔 수가 없다.

Handle잡아먹는 귀신 Eclipse

가끔 Alt-Print Screen을 눌러 화면을 캡춰하는 경우, paint brush등에 붙여넣기가 안되는 경우가 있다. 메시지는 리소스가 부족합니다.
그래서 현재 사용하고 있는 어플리케이션을 보면, 이클립스가 엄청난 핸들을 차지하고 있다.
이클립스를 일주일째 계속 죽이지 않고 사용하고 있기 때문인 이유도 있지만, 저 압도적인 수치란 정말...

아. 핸들이란, windows프로그래밍을 해보면 나오는 버튼이나 inputBox등을 포함한 모든 화면상의 모든 윈도우의 key이다. 이 핸들은 계속 만들어 낼 수 있는 것이 아니고, 32비트 윈도우즈 OS에서는 이론상 최대 16비트(0부터 65535까지 65536개, 그러나 인스톨 한 뒤의 디폴트는 10000, OS에서 제한하고 있는 수치는 18000)의 수치만큼의 제한이 있다.
하나의 핸들은 88바이트를 차지한다고 한다.. 10000개면 880K바이트정도,


이러한 이유때문에 디렉토리에 1만개(디폴트 핸들 수치)가 넘는 파일이 하나의 디렉토리에 있을 경우, 윈도우 탐색기에서 아이콘을 만들어 내는 작업에 심각한 문제가 발생해 버린다. (문제가 생기는 것은 실은 그보다 훨씬 적은 수겠지만)

한 디렉토리에 파일은 더 존재 할 수 있건만... 어쩔 수 없이 나눠야 한다.
#Limitation에 대해서는 이쪽을. http://en.wikipedia.org/wiki/NTFS#Limitations
#이 수치는 파일 시스템이 FAT16인지, FAT32인지, NTFS인지에 따라서 다르다.

WinFX도 handle을 사용하고 있는 것 같은데... .Net은 왠지 일반 C어플리케이션보다 더 많이 사용하는 느낌.

CreateWindow만 하고 DestroyWindow를 안하면 Object Leak이 발생할 수 있는데.
이 핸들에 관한 한, leak을 detection, trace모두 꽤 힘든 작업이다.
http://msdn.microsoft.com/en-us/library/ms725486(VS.85).aspx

디폴트 수치는 65535보다 훨씬 작은데(그래서 메모리가 2기가여도 리소스 Limit은 그대로) 레지스트리를 수정하여 늘리는 방법도 있다. 방법은 여기. 또는 직접 수정
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Windows\USERProcessHandleQuota
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Windows\USERPostMessageLimit
# HKLM는 시스템에 따라 HKey_Local_Machine로 표기되도 한다.

나는 현재 10000개에서 14000개로 늘려 사용하고 있다.

윈도우즈용 JVM인지 Eclipse인지 저 핸들을 바로 바로 놓아주지 않고 Caching하나 본데 그래도 느린거 같애!

캘리퍼스

http://www.iconico.com/caliper/
화면상의 거리를 측정할 수 있는 어플리케이션, 유료지만, 무제한으로 Trial을 이용할 수 있다고 한다. 가로 세로 뿐만이 아니라 각도를 마음대로 주어가며 잴 수도 있고, (그다지 쓸 일이 없다고 생각되지만)COM Automation도 지원하고 있다.(ATL도 지원하는 걸 보면 cpp로 만든 것 같다.)

아직까지는 서버쪽의 업무뿐이서 Client쪽의 업무는 하고 있지 않기 때문에 필요하지 않지만, 예전같았으면 정말 필요했을 것 같은 어플리케이션.

전에 거리를 재는 어플리케이션을 따로 알고 있지 않을 때는, 포토샵등으로 재곤 했는데, 포토샵을 하고 있는 것을 누구에게 보여지기라도 하면 나중에 거절하기 곤란한 요청이 들어와 난감해 지는 경우가 가끔 있었다. 주로 마감이 임박한 경우 디자인된 이미지를 쪼개서 html로 만드는 작업에 투입되어져 버리기도 했으니! (그것도 야근으로!!)

지금 생각하면 웃음이 나오지만, 물론 지금도 이런 작업이 주어진다면(예를 들면, 번역 작업. 컴퓨터가 이상해졌다고 고쳐달라고 하는 작업등) 역시 전직을 심각하게 고려해 보고 있을 듯 하다.

어쨌든, 나중에 언젠가 쓸 일이 있을 것 같은 유틸리티.

Console



보이는 화면에 있는 어플리케이션은 은 Console들을 Tabbing해서 사용하게 해주는 Console이라고 하는 어플리케이션이다.(화면은 http://sourceforge.net/projects/console 의 것.)

닷넷을 사용하고 있고, Producer-Consumer패턴을 사용하고 있다.

이왕 Producer-Consumer라면, 좀 더 몇가지 기능을 추가하면 좋았을 텐데 하는 아쉬움이 살짝 생긴다. 예를 들면 모든 국가언어가 표시되게 한다던지!

닷넷 어플리케이션의 GDI는 리소스를 너무 많이 사용해서, 삭제할까 망설이면서 사용하는 중.

Thursday, May 22, 2008

무제

치환은 결여된 Contecxt을 채우려고 하는 것을 강제하는 것이다.
이 능력은 동물은 갖지 못한 능력.

Wednesday, May 21, 2008

Flex Builder

http://learn.adobe.com/wiki/display/Flex/Flex+and+Java

Thursday, May 15, 2008

interesing today

Amazon Widget
https://widgets.amazon.co.jp/

Aladin TTB Review service
http://blog.naver.com/pillyul?Redirect=Log&logNo=49287008
http://www.aladdin.co.kr/ttb/wmain.aspx

Ant : how-to-use-ant-to-run-sql-scripts
http://www.baccoubonneville.com/blogs/index.php/eclipse/2005/12/06/how-to-use-ant-to-run-sql-scripts

Dynamic DDNS client tool
http://www.hi-ho.ne.jp/yoshihiro_e/dice/#LIST