Thursday, April 30, 2009

php와 jstl/sql은, 개발에 걸리는 시간이 비슷할 것 같다고 생각합니다.

작년에 아르바이트로 제작했던 프로젝트중에 Spring Context, Spring MVC, Hibernate Template with Transaction AOP, Sitemesh, Acegi, Eh cache를 사용해 DAO, BL로 잘 나눠 제작한 어플리케이션이 있습니다.
이 프로젝트는 1차와 2차로 나뉘어 진행되는데, 1차에서는 그렇게 많은 기능이 실장되지는 않아서, 설계에 치중해. 아주 딱 공부하기 좋은 샘플과 같은 모습을 하고 있습니다.

그런데 이 프로젝트의 2차를 제가 진행하지 않고, 어쩌면 다른 사람에게 갈 것 같습니다.
개발 담당으로 확정은 아닙니다만, 문서를 그리 잘 준비해두지 못해(사실은 config파일이 개발문서를 대신할 수 있다고 생각했습니다.) DB의 연결계정, 소스등을 주고(그는 Sun에서 주는 자격증을 가지고 있습니다.) 어떤 구성인지 살펴봐 달라고 얘기했습니다.
그리고 그 뒤, 2차 예정 개발자로 부터 이런 얘기를 들었습니다.

"거짓말아니고....PHP로 만들면 4일이면 똑같이 만들어놓을 자신있음"

-_ㅜ;

그런데 Symfony나 Smarty등의 잘 알려진 PHP용 프레임웍을 사용하는 것은 아니고 그냥 DB에서 읽어오는 방식을 사용하겠다는 군요.

그렇다면.
단순히 Resultset에서 Iteration하는 방식이라면, JSTL / SQL action을 고려해보라고 했습니다.

아마 개발에 걸리는 시간은 비슷하지 않을까라고 생각합니다. Pagenation등의 재활용 가능한 utility용 custom tag등을 만드는 데 걸리는 시간은, PHP에서도 필요한 function을 만드는 것과 비슷할테고. 오히려 performance라면 php의 컴파일 캐쉬등을 사용하지 않는다면, 컴파일된 class를 사용하는 java쪽이 더 좋은 performance를 내겠지요.

사실 2차 예정 개발자는 친동생이어서,
나름 공부하기에 딱 좋은 자료이니, 보고 익혔으면 했는데,
왠지 가슴이 아팠습니다.

Tuesday, April 28, 2009

웹 개발 팁 -브라우저 측에서 무얼 보내는지 로그를 보고 싶을 때

어제, 동료 한국인 개발자로부터, submit이 두 번일어나는 데, 어디서 그런 문제가 생기는 지 모르겠다고 하는 Help가 있었습니다.

"type=submit인 것에 onClick으로 javascript 걸어놓고, 다시 자바스크립트가 submit하게 되어 있는거 아냐??"

실제로 저런 경우라면 submit이 두 번 발생합니다.
그런데 테스트용으로 보내준 URL에는 그런 내용은 아니었습니다. 거기에다가 IE일 때는 괜찮은데, FireFox인 경우에만 발생한다고 합니다.(서버쪽의 로그까지 보내주어 두 번 기록되어 있는 것은 확인했습니다.)

FF를 보고 있을 때는 Refresh할 때의 Flash등도 없어, 한 번 submit하는 느낌이었습니다만, 이것 만으로 한 번 보내는 지 어떤 지 알 수 없었습니다.

이런 종류의 디버깅에 시간을 많이 뺏기는 것은 정말 속상합니다.
FireFox의 FireBug로 어떤 전송이 일어나는 지 보려고 시도했었습니다만, Net 탭에 있는 전송 히스토리는, 브라우저가 document를 다시 읽을 때 초기화되어버려, 이 경우에는 도움이 되지 못했습니다.

어쩌면 서버측에서 Redirection하고 있는 지 모르겠습니다만, 우선 클라이언트 측의 코드에서 문제가 없는 지 확인하고 넘어가야겠지요.
이런 경우 저는 지금까지 마이크로소프트의 네트웍 모니터를 사용했습니다. 패킷을 캡춰해서 볼 수 있는 유틸리티입니다. 다운로드는 여기
사용방법은 꽤 간단하므로, googling하면 자세히 소개하는 곳이 있을 터입니다.

그런데, 이런 경우라면, 브라우저측에서 전송하는 로그를 기록하는 것이 있다면 해결 할 수 있기 때문에, 파이어 폭스의 플러그인에 무언가 있지 않을까 하는 생각이 들어 검색을 해보고, Tamper Data라고 하는 것을 찾아 실행해봤습니다.


gmail이나, naver를 tamper data로 보고 있으면, 굉장히 열심히 백그라운드로 보내고 받고 하는 것을 볼 수 있습니다. 이정도면 도움이 될 것 같습니다. 오늘은 휴일이기 때문에 내일 회사에 가면 알려주어야겠네요.

외국에서 고생하는 한국인 엔지니어들, 모두 모두 감바레!

Monday, April 27, 2009

자바개발자에게 자바를 누가 만들었는지 물었을 때.

오랫동안 자바로 개발을 해오던 어떤 이에게, 내가 최근 마틴 파울러의 twitter를 following하게되어 그의 twitter를 알려주었데,
"마틴 파울러가 누구야?"
라고 되묻길래, '설마 모를까'하고 장난으로 "그럼 자바는 누가 만들었는지 알아?" 하고 물었더니
"썬"
이라고 대답한 사람이 있었습니다.

'음? -_-;;;'

요새 자주 얘기하는 켄트 벡, 엉클 밥, 로드 존슨, 게빈 킹등은 모른다고 해도... 'java의 아버지'라고 불리우는 이를 몰라??

'혹시 그런걸 알아야 하는걸 당연하게 생각하는 내가 이상한 거야??'
한참 생각하게 하는 일이었습니다.
혹시 몰라서 다른 친구에게 자바를 누가 만들었는지 아느냐고 물어보았습니다.

(Dev) Kim tonghyun
혹시 자바를 누가 만들었는지 검색안하고 바로 말할 수 있엄??
[산소]
도리
(Dev) Kim tonghyun
그런가...
(Dev) Kim tonghyun
흠.
[산소]
델파이는 알아.. 헤즐버그
[산소]
C#도 헤즐버그
(Dev) Kim tonghyun
그런걸 당연히 알고 있어야 한다고 생각하는 내가 이상한가... 아. 원래 델파이 전문이지.
[산소]
응 나 델파이 좋아해 >_<
(Dev) Kim tonghyun
나중에 면접때 평가하기 위해 써먹으면
오히려 면접자가 나를 이상하게 보거나 하지 않을까??
[산소]
음... 100% 평가 기준이 되지는 못하겠지만..
[산소]
나름대로의 평가기준은 될거같은데?
[산소]
단순한 일이라서 하는건지.. 얼마나 즐기면서 하는건지..
[산소]
모른다고 할땐 그걸 물어야지..
[산소]
그럼 다른 존경하는 개발자가 있냐라던지..
(Dev) Kim tonghyun
나루호도
[산소]
꼭 그거 만든 사람을 알아야 될 이유는 없다고 봐
(Dev) Kim tonghyun
나는 C는 누가 만들었는지 몰라. 근데 Charlse Petzold는 알아.
(Dev) Kim tonghyun
Charlse Petzold의 Windows Programming
[산소]
Charlse Petzold는 잘 모르겠고 Windows Programming 는 알겠다
(Dev) Kim tonghyun
ㅎㅎ

뭔가 생각하게 하는 대화였습니다.

단순한 일이라서 하는건지.. 얼마나 즐기면서 하는건지..

...

Sunday, April 26, 2009

Perl 스크립트 개발의 개발부 방식과 운영부 방식

제가 "지금" 하고 있는 호스팅 가상화에 대한 API부분을 하고 있습니다.
"지금"이라는 것은, 원래 하는 일은 아니라는 의미입니다.

웹에이전시에서 여러가지 OS와 여러가지 Language로 작업을 해오다 일본 회사로 전직했는데,
최근 불경기 영향으로 회사에서는 파견사원들을 쓰지 않고, 필요한 Skill을 가지고 있는 사원들을 그때 그때 팀을 재편성해서(소속은 그대로이고, 업무지원형식으로) 작업을 하는 방식으로 진행중입니다.
이러다 보니, 깊이는 옅어지고, 손을 대본 것은 많고 하는 상황이 되어 어떤것이 나의 Speciality인지 잘 모르게 되어버렸습니다.

그중에서 어떤 일을 담당하고 있느냐면,
이 회사의 호스팅부는 Viruozzo라는 가상화 소스프웨어를 이용해 OS를 가상화해 호스팅합니다.
한대의 서버에 약 100대정도의 OS의 가상화가 가능하다는군요. 쉽게 말씀드리면 한대의 서버에 100개의 VMware나 VirtualPC를 동작시키는 셈입니다.

이중에서 제가 맡은 일은, 가상시스템을 생성해서, 관리하고, 파괴하는 일련의 API를 웹, Zend방식(SOAP방식이 아닌)의 API를 만드는 일입니다.
Request를 받아 DB(MySql)에 기록하고, LDAP에 도메인생성이나, 메일계정생성을 호출하는 perl을 system call하고, 가상서버의 Quota를 제어하고,
가상서버에 메일계정을 만든다던지, Ftp서비스를 세운다던지, 심지어는 phpadmin, wiki, MovableType까지 만드는(실제로는 그런 perl script를 call해서 결과만 돌려줍니다) 그러한 부분을 작업하고 있습니다.

개발 환경으로는, 작업언어는 Perl, 웹인터페이스는 HTML::Template 모듈, MySql의 UDF를 사용합니다.
아. 그리고 Python으로 된 Func라고 하는 Tool을 사용하는 Python 스크립트 작업도 약간 참여합니다.
역시 Perl에서 System Call하는 스크립트죠.

이 일을 하게되어, 2001년도를 마지막으로 손댔던 Perl을 다시 만지게 되었습니다.
그 당시는 CGI.pm사용해서 웹을 작성하는 정도로, 다른 언어에의 동경이 많았는데, 지금 다시 사용하게되어보니, Perl이 굉장히 훌륭하네요. (왜 그때는 미처 몰랐지)
특히 Groovy와 비교해 가며 작업하면 재미있습니다. Groovy OneLiner

Perl을 선택한 것은 제가 아닙니다. 여기는 시스템본부 아래에 운영부와 개발부가 있는데, 저는 개발부 소속입니다. 이 작업은 운영부의 책임으로 제작되는 것이고, 저는 여기에 지원을 나와있는 거죠.
운영부이니 Perl이나 Vi와 같은 유닉스 시스템 작업을 잘 하는 사람들이 많습니다.

그런데 이 운영부의 특징이랄까 개발자의 입장에서 보면, 조금 안타까운 점이 있습니다. 객체지향적인 코드보다는 절차지향적인 방식으로 진행하는 경우가 많고,
파일을 분리하는 것보다 하나로 뭉쳐서 개발하는 방식이라던지 하는 부분이 그렇습니다.
하긴, 예전에 어떤 소스를 보면, 300메가정도되는 펄스크립트 파일을 pperl로 돌리더군요. (vi가 가장 손에 익을 에디터라면 나라도 하나의 파일로, ctags정도를 사용해서 하는 것이 편할 것 같군요.)
또 최근에는 Perl도 SQL::Library를 사용해서 SQL과 Perl을 분리하는 것이 가능한 것 같습니다. 이를 사용하고자 하면, "꼭 사용할 필요가 있느냐"라고 얘기하는 군요.
객체로 나누어 하면, 이해해야하는 범위를 캡슐화 하기 좋고, 단위 테스트에 좋다라는 개발자의 입장과
유지보수시의 Simplicity를 우선하고, cron으로 실행할때라던지와 스크립트언어이기 때문에 퍼포먼스를 먼저 생각하는 admin의 입장이 서로 드러나는 부분인 것 같습니다.

만약 운영부에서 python이나 ruby를 시스템관리 언어로 사용한다면 제 의도가 많이 반영될 지 모르겠습니다만, 아직까지는 시스템 관리 언어로 perl이 압도적입니다.
이러한 의미에서 Perl6가 매우 기대되네요. Perl VM이라니, IL을 사용하는 지는 잘 모르겠습니다만, 사용한다면 ruby나 java를 IL로 컴파일 하는 것도 가능할까요?
재미있을 것 같습니다. :-)

Saturday, April 25, 2009

ActivePerl의 Tip - package의 선언후 처리

우선 코드보터 보시죠. 다음의 코드는 파일로 저장해서 실행하는데 아무런 문제가 없습니다.
Moose의 예제입니다.

package Whitecat;
use Moose;

has name => (is => 'ro');
has age => (is => 'ro', isa => 'Int', required => 1);

1;

my $whitecat = Whitecat->new(
name => 'ねこ',
age => 30,
);
print $whitecat->name;

그런데 이 코드를 Emeditor의 매크로로 실행하기 위해
ActivePerl로 넘겨 실행하기위해 살짝 바꾸어 처리를 하면

evalperl #이하의 코드를 ActiverPerl로 실행하게 하는 명령입니다.
package Whitecat;
use Moose;

has name => (is => 'ro');
has age => (is => 'ro', isa => 'Int', required => 1);

1;

my $whitecat = Whitecat->new(
name => 'ねこ',
age => 30,
);
$window->document->writeln($whitecat->name); #window는 Emeditor에서 제공받는 객체입니다.

다음과 같은 에러가 발생합니다.

ScriptControl.ExecuteStatement Error
16389:Global symbol "$window" requires explicit package name
source:PerlScript Error

이 에러를 회피하기 위해서, Compile할 때와, 실행할 때로 나누도록 BEGIN문으로 block을 잡아주니 문제없이 실행되었습니다. 다음은 에러가 없는 전체 코드입니다.
evalperl
BEGIN {
package Whitecat;
use Moose;

has name => (is => 'ro');
has age => (is => 'ro', isa => 'Int', required => 1);

1;
}

my $whitecat = Whitecat->new(
name => 'ねこ',
age => 30,
);
$window->document->writeln($whitecat->name);

perl의 설계상 특성중 동적언어의 유연함을 잘 이용하려면, Scope라고 해야 할까요. Phase라고 해야할까요. 다음의 block을 이용해야 할 때가 있을 것 같습니다.

컴파일시 : BEGIN,
초기화시 : CHECK(역순), INIT
실행시 : 일반코드
종료시 END(역순)

ActivePerl의 Tip - 2바이트언어 주석

나는 Windows환경(2003 server)에서 Perl은 ActivePerl을 사용하고 있습니다.

Strawberry Perl을 사용하면 gcc가 함께 있어 CPAN에 있는 많은 모듈을 사용할 수 있는 반면(유닉스 시스템명령어나 네트웍관련 명령어를 사용하는 모듈, 또는 fedora관리용등의 legacy모듈은 사용할 수 없겠죠.),

ActivePerl은 보통 PPM(perl package manager)으로 누군가의 Repository에서 Win32용으로 컴파일된 모듈을 설치해 사용하는 것이 보통이기 때문에, Strawberry Perl보다 제한된 모듈을 사용할 수 있습니다.

그럼에도 불구하고 ActivePerl을 사용하는 이유는(저도 무척이나 Strawberry Perl을 사용하고 싶습니다...만, 진짜 Perl(?)이 필요한 경우는 Fedora10 VirtualPc를 기동시켜 사용하고 있습니다.) ActiveX를 제공하기 때문입니다. Strawberry Perl는 이 것을 제공하고 있지 않습니다. (참조 http://win32.perl.org/wiki/index.php?title=Win32_Distributions)

Perl의 ActiveX지원 기능이 나에게 중요한 이유중에 가장 중요한 이유로는 바로 Emeditor때문입니다. 파일로 저장해 실행하는 방식만이라면 저도 Strawberry Perl을 추천할 것 같습니다.

이 Emeditor 에디터는 WSH를 이용하여 매크로를 작성하는 것이 가능합니다. 즉 VBS, JScript, ActivePerl, ActivePython, PHPScript, RubyScript(ActiveScriptRuby 의 다운로드는 여기 http://arton.hp.infoseek.co.jp/indexj.html)를 이용하여 매크로를 작성하는 것이 가능하게됩니다.

가까운 사람들의 매크로 작성의 참여를 위해, JScript로 선택해 만들기 시작했던 매크로가 점점 기능이 많아져 꽤 도움이 됩니다. (이 기능 때문에 GVim을 떠났고, HappyHacking 키보드도 사용하지 않게 되어버렸습니다. 에디터가 많은 것을 바꾸게 하는군요.) 그런데 매크로 언어로 선택한 JScript로는 가능하지 못한 작업들도 있습니다. 예를 들면, GD라이브러리로 그래프를 그린다던가, ImageMagic으로 이미지를 손대는 매크로는 JScript로는 시도해 보고 싶지 않습니다. 이러한 경우는 ActivePerl을 사용합니다.(아직까지 ActivePython이나 ActiveRuby등은 사용하고 있지 않습니다.)

그런데, ActivePerl에 한글주석이나, 일본어 주석이 있는 경우, 제대로 실행해 내지 못합니다. 예를 들면 다음과 같은 코드(JScript코드입니다.).

var perlcode = "sub main { return \"Perl ! \"; }";
var perl = new ActiveXObject("ScriptControl");
perl.Language = "PerlScript";
perl.AddCode(perlcode);
var result = perl.Run("main");
document.writeln(result);

제가 사용하는 Emeditor매크로에서는 실제로는 위와 같이 사용하지 않고 있습니다만, 위 예제는 Excel등에서 응용하기 좋은 Sample이라고 생각합니다. 제 Emeditor매크로에서는 #language="PerlScript" 이외에도 몇가지 지저분한 코드를 사용해 사용하고 있습니다.


위 코드를 JScript로 실행하면 예상하듯, Perl ! 이라는 출력을 얻을 수 있습니다. (물론 ActivePerl이 설치되어 있어야 합니다.)

그런데 펄의 코드중에 한글로 주석을 달거나 한글을 출력하도록 다음과 같이 수정했을 때, 제대로 실행되지 않습니다.

var perlcode = "sub main { return \"한글\"; }";

나오는 에러코드는 다양했습니다.
Can't find string terminator '"' anywhere before EOF
Illegal division by zero
...그리고 에러가 발생하지 않는 경우도 있었습니다.

이 코드는 테이타를 파일에서 불러오는 경우는 잘 됩니다. 이 경우는 Strawberry Perl이던지 ActivePerl이던지 문제가 없죠.

오늘의 Tip이란 이 부분의 해결입니다. 해결의 Url은 http://miau.s9.xrea.com/blog/index.php?itemid=642 입니다.

원인이라던지 대책은 다음의 URL에 적혀 있습니다만, 이 이야기는 Tip의 내용을 벗어나네요.
http://miau.s9.xrea.com/blog/index.php?itemid=659
http://undine.sakura.ne.jp/diary/d200608b.html#r18
http://www.namazu.org/~tsuchiya/perl/perl-5.8.html#opened_questions

사실. 이 내용이외에도 2바이트 문자열을 사용하는 경우, 조금 더 문제가 있는 듯 합니다. 예를 들면 윈도우즈 환경이다보니, 파일명에 한글을 넣거나 일본어를 넣었을 경우 file handle하는 부분이라던지.... 이 내용은 경험하게 되면 올리도록 하겠습니다. 파일명을 한글, 일본어가 아닌 영어로 적도록 늘 신경을 쓰고 있어서 아직 경험하지 못한 것도 있습니다만, miau님의 블로그에 그 해결내용이 있었던 것이 기억납니다.

여러 언어를 사용하다보면, 역시 각각의 장점이 있다라는 생각이 듭니다. 그것이 컴퓨터 언어든, 자연어든지 말이죠 ;-)

이상. 잘부탁드리겠습니다. m(__)m

Tuesday, April 7, 2009

블로그 정리하겠습니다.

그만 두겠다는 말이 아니고, 정리해서 다시 잘 쓰겠습니다. :-)