Tuesday, May 26, 2009

[정보공유] Perl DBI / CGI 에서 DBI의 에러처리

Perl DBI / CGI 에서 DBI의 에러처리

아무리 eval{} 로 감쌌어도 $@가 나오지 않았습니다.
다만, 로그파일에는 에러가 제대로 적혀 있었습니다.
이건, DBI의 에러가 warning이 되어 출력되고 있는 것이었습니다.
connect할 때, RaiseError를 사용하는 것을 깜빡하고 있었습니다.

my $dbh = DBI->connect(
'DBI:mysql:dbname', 'user', 'password',
{AutoCommit => 0, RaiseError => 1, PrintError => 0}
) || die;

이것으로 재대로 $@를 catch할 수 있었습니다.

Friday, May 22, 2009

perl로 만드는 win util / tts.pl

보물 하나더,

제 컴퓨터에는 Microsoft SAPI (Speach API)가 설치되어 있고, Voice가 영어, 일본어가 설치되어 있습니다. (중국어는 설치했다가 삭제했습니다만.)
주로 emeditor에서 파일 편집작업을 많이 하는데 emeditor에서 TTS speech하도록 한 매크로가 있습니다만, 음성 출력이 완료되기까지 Editing작업을 할 수 없어 만들어 놓고 그다지 사용하고 있지 않았습니다.
콘솔용으로 만들 수 없는 건 아니지만, 콘솔용으로 만들었을 때, 그 프로그램에 출력하는 문장을 전달하는 것이 좀 만족스럽지 않아서 보류하고 있었습니다만,
다음의 Perl Package의 예제를 발견했습니다.


use Win32::OLE qw( EVENTS );

our $myTTS = new Win32::OLE( "Sapi.SpVoice" );
get_text();

sub get_text{
$output_speech = ;
chomp($output_speech);
if($output_speech eq ":jp"){
$myTTS->{voice} = $myTTS->GetVoices("Name=VW Misaki", "Language=932")->Item(0);
}
elsif($output_speech eq ":en"){
$myTTS->{voice} = $myTTS->GetVoices("Name=VW Kate", "Language=409")->Item(0);
}
if($output_speech ne ":q"){
say_this();
get_text();
}
}

sub say_this{
$myTTS->Speak( "$output_speech" );
while( $myTTS->{Speaking} )
{
Win32::OLE->SpinMessageLoop();
Win32::Sleep( 100 );
}
}


Perl로 하면, speech할 본문을 URL에서 가져온다던지, 어제 발견한 MSNd로부터 입력받은 내용을 speech하게 한다던지, 훨씬 쓰임새가 있어보입니다.
다음에는 인터넷의 자동번역하는 페이지에 post해 일본어<->한글 하는 코드를 javascript로 만들어 둔 것이 있는데 perl로 옮겨두어야 겠습니다.

perl로 만드는 win util / msnd.pl

perl로 만드는 win util / msnd.pl

일본에서 일하든 대부분의 동료들과는 달리 저는 9시 출근입니다.
10시가 되면, 하나 둘 씩 로그인을 하지요. 그럼 저는 "오하요오" 메시지를 보냅니다.

간혹, 이런 메시지를 보내는 것이. 규칙적었는지, 혹시 로그인하면 자동으로 메시지를 보내는 프로그램을 만들어서 하고 있는 것으로 생각하는 사람들이 있었습니다. (그래서 매일 메시지를 조금씩 내용을 바꿉니다. ^^)

그런데 이런 프로그램을 만들려면 어떻게 할까요. 오늘 보물을 발견했습니다.

혹시 심심이라고 하는 MSNBot을 알고 계시다면,
그리고 예전에 있었던, 자동번역 Bot을 알고 계신다면, 그것을 제로부터 직접 만드는 것은 꽤 까다로운 작업입니다만, 아래의 MSN Package를 사용하면 그렇게 어렵지 않게 구현할 수 있습니다.

#!/usr/bin/perl

use lib qw(./MSN/lib);
use strict;
use MSN;

my $msn = MSN->new(Handle => 'youraccont@hotmail.co.jp',
Password => 'password');
$msn->setHandler(Message => \&handler_message);
$msn->connect();

while(1) {
$msn->do_one_loop
}

sub handler_message {
my ($self, $username, $name, $message, %style ) = @_;

print "Msg recv.\n";

$self->sendMessage("hello!");
}


전에 잠시 서버관리를 위해, 뭔가 Notification해야 할 일이 생긴다면 실시간으로 메시지로 받을 수 있도록 Microsoft Alert Service를 사용할까 한 적이 있었습니다.
이 패키지를 발견한 뒤로는, 필요 없을 것 같습니다. 무얼 만들까요.

Source Repository에 업데이트 되면 메시지를 보내는 어플?
CI build 가 깨지면 메시지를 보내는 어플?

다양한 방법으로 사용할 수 있을 것 같습니다. :)

Thursday, May 21, 2009

[정보공유] 최근, 도코모에서 구글의 Android를 탑재한 폰이 공개됨

최근, 도코모에서 구글의 Android를 탑재한 폰이 공개됨
http://k-tai.impress.co.jp/cda/article/news_toppage/45367.html

Iphone에서는 Flash를 보는 것이 불가능한 반면,
이 Android폰에서는 웹에서 플래쉬보는 것이 가능함.

>woo_김택우 says:
>iphone에서 youtube볼수 있어?? youtube전용 어플리케이션이 있음
>(Dev) Kim tonghyun says:
>아하
>woo_김택우 says:
>현재는iPhone의Safari에서 플래쉬를 지원 안하니까
>woo_김택우 says:
>웹사이트에 들어가서는 못보는 상황이지
>(Dev) Kim tonghyun says:
>나루호도네

Iphone에서는 ObjectC로만 개발가능한 반면

Android폰 에서는 당연히 java나 perl, python등을 지원하므로 다른 언어의 개발자가 접근하기 용이함. ActionScripter도 당연히 자기가 Flash를 만들어 올리는 것이 가능

사업적인 측면으로 개발자로서 볼 때 IPhone의 AppStore보다는 접근하기 더 쉽지 않을까 하는 생각이 듬.

>woo_김택우 says:
>내년까지 스마트폰이 이본에서만 300만데 시장으로 성장 할꺼야
>woo_김택우 says:
>아마 반이상이 안드로이드가 들어가겠지
>(Dev) Kim tonghyun says:
>나루호도-
>woo_김택우 says:
>음 아무레도 자바가 쉽겠지
>woo_김택우 says:
>서비스나 브랜드만 만들면, 개발언어는 선택이지
>woo_김택우 says:
>시장이 있으면 진입하면되고
>woo_김택우 says:
>일본에 전화기가 1억7천만데 사용하고 있는데, 300만이면 아직 멀었지만, 배수로 성장한다고봐

이상. 정보공유 끝.

Monday, May 18, 2009

[정보공유] FireFox의 BookMark 기능을 이용하여 일본어페이지 바로 번역해 보기

원리를 지금까지 설명하지 않았는데
안에 %s 는 파이어폭스가 뒤에 파라메터로 받아서 자동으로 바꾸어서 URL을 Query함

북마크 등록정보
Name : google translate web japanese->korean
Location : http://translate.google.com/translate?js=n&prev=_t&hl=en&ie=UTF-8&u=%s&sl=ja&tl=ko&history_state0=
keyword : jako
테스트용 페이지 : http://www.wowkorea.jp

어제 와이프가 구약소 유치원 지원금 페이지를 보느라 애쓰는 걸 보고 생각해냄.
일본어 페이지를 보고 주소창에 앞에 'jako '라고 덧붙여 주면 됨.


[추가 정보공유] 다음과 같이 등록하면 중국어 페이지도 금방 번역해 볼 수 있음.
Name : google translate web chinese->korean
Location : http://translate.google.com/translate?js=n&prev=_t&hl=en&ie=UTF-8&u=%s&sl=zh-CN&tl=ko&history_state0=
keyword : chko
테스트용 페이지 : http://baike.baidu.com/view/29.htm

이상.

[정보공유] FireFox의 BookMark 기능을 이용하여 영어사전 바로보기

Name : Google Dictionary : %s in Korean
Location : http://www.google.com/dictionary?aq=f&langpair=ko%7Cen&q=%s&hl=en
Keyword : eng

이후 FireFox의 Address 입력창에 다음과 같이 입력하면 해당 단어가 번역되어 나옴.

eng school
eng 학교

이상.

[정보공유] 파일업로드 하는 폼을 강제로 파일아닌 일반데이타만 전송하게 하고 싶을 때의 enctype 지정

[정보공유] 파일업로드 하는 폼을 강제로 파일아닌 일반데이타만 전송하게 하고 싶을 때의 enctype 지정

다 알고 있겠지만, 찾으려면 또 까먹어서 -_-;

파일업로드하는 form이어서
ENCTYPE = "multipart/form-data" 했는데,

자바스크립트로 일반데이타 전송하도록 하게 할 때.

ENCTYPE = "application/x-www-form-urlencoded"

로 강제 enctype 지정

http://www.htmlcodetutorial.com/forms/_FORM_ENCTYPE.html

이상.

Sunday, May 17, 2009

[정보공유] FireFox의 BookMark 기능을 이용하여 JDK API 바로보기

FireFox의 BookMark 기능을 이용하여 JDK API 바로보기..

Name : api doc(Java Platform SE 6)
Location : http://www.google.co.kr/search?complete=1&hl=ko&q=site%3Ajava.sun.com%2Fjavase%2F6%2Fdocs%2Fapi+%s&btnI=I%27m+Feeling+Lucky&lr=&aq=f
Keyword : jdk6


이렇게 하고 FireFox의 Address 입력창에
jdk6 Socket
이라고 하면 Socket의 API가 뜸.

원리는
구글의 site: 옵션으로 검색 URL을 제한하고
구글의 I'm Feeling Lucky를 이용해 제일 첫 검색URL을 바로 보게 하는 것

이상.

Saturday, May 16, 2009

perl로 만드는 win util / wget.pl

■ wget.pl
#!/usr/bin/perl -w
use LWP::Simple;
@ARGV == 2
? (getstore($ARGV[0], $ARGV[1]) || die "Cant Download File: $!\n" )
: print "wget.pl to get html";
print @! unless @!;

사용방법은 다음과 같습니다.

C:\>wget.pl http://www.wowkorea.jp/images/logo_wowkorea.gif wowkorea.gif

■ 그러나 저는 wget.pl을 사용하지 않습니다.

리눅스계열 터미널 작업하다가 갑자기 윈도우즈 콘솔에
서 "ls" 라고 명령을 내린 경험이 있으세요?
닷넷 컴파일러 "csc.exe"가 어디에 있는지, "dir /s"로 찾아본 경험이 있으세요?

저는 리눅스 명령어를 win32로 컴파일한 유틸리티를 설치하여 사용하고 있습니다.
cygwin도 사용한 적이 있으나, 자주 사용하는 명령어만 설치하면 되므로 다음의 페이지에서 자주 사용하는 적당한 유틸리티를 다운받아 사용하고 있습니다.

http://gnuwin32.sourceforge.net/packages.html

저는 수동설치를 하지 않고, 자동설치로, 설치되는 곳은 c:\usr\local 로 해서 사용하고 있습니다.
그리고 Path에 c:\usr\local\bin를 등록해 두면 편리합니다.

그러면
C:\usr\local>ls -la 와 같은 명령을 내릴 수 있습니다.


우선은 CoreUtils 과 which, grep(egrep은 grep -E로 사용합니다.) 정도는 설치해 사용하고 있습니다.
그외에도 win32용 vim (지금은 거의 잘 사용하지 않습니다. emeditor를 사용합니다.), apache, tomcat, perl, python, mysql,등은 이쪽 디렉토리에 설치해 사용하고 있습니다.

더 좋은 방법, 정보공유 하시고 싶은 분은 가벼운 마음으로 코멘트 부탁합니다.
m(__)m

perl로 만드는 win util / gdkdoc.pl

perl에는 perldoc이라고 하는 프로그램을 자체로 가지고 있기 때문에 이를 이용하면 콘솔에서 도움말을 볼 수 있습니다.
이 함수는 어떻게 쓰는 거지, 이 패키지는 어떤 함수를 가지고 있지 할 때, 간단하게 살펴볼 수 있으니 매우 편리합니다.

저는 가끔 groovy를 작성합니다. 특별히 프로젝트로 하는 것도 아니지만, 이 groovy, 뭔가 물건이 될 것 같거든요. 작성할 때는 일반 에디터(emeditor)를 사용합니다. eclipse나, IDEA를 사용해서 작성하려면 너무 무거운 느낌이에요. 웹에서 발견한 어떤 샘플을 돌려보는데, 자바프로젝트를 진행하고 있지도 않으니 eclipse라던 지를 실행시키는 데만도 시간이 걸리죠. 그래서 간단히 작성하는, 늘 띄워져 있는 emeditor로 작성합니다.

도움말은 브라우저를 사용하죠. 그런데 perldoc처럼 콘솔에서 볼 수 있는 도움말이 있으면 좋겠다고 생각해 봤습니다. 그래서 작성해 봤습니다.

아이디어는 한번에 도움말 페이지를 가져오도록 site: 옵션을 주어 google의 검색에서 사이트를 groovy.codehaus.org%2Fgroovy-jdk 로 하고, 아마도(!) 가장 위에 있는 아이템이 api 도움말일 것이라고 생각해 구글의 "I'm feeling lucky"으로 바로 열도록 했습니다.

이때 조금 헤맸는데, 코딩해 실행해보니 403을 리턴한다고 하는 것입니다. telnet으로 get으로 request를 보내면 제대로 302 redirect가 받아지는데 말이죠.
해결한 방법은 UserAgent의 설정이었습니다. 소스를 보시죠.

#!perl
use LWP::UserAgent;
use Win32::Console::ANSI;
use Term::ANSIColor;
my $browser = LWP::UserAgent->new;
$browser->agent( 'Mozilla/4.0 (compatible; MSIE 5.12; Mac_PowerPC)' );
my $URL='http://www.google.co.kr/search?complete=1&hl=ko&q=site%3Agroovy.codehaus.org%2Fgroovy-jdk+' . $ARGV[0] . '&btnI=I%27m+Feeling+Lucky&lr=&aq=f';
my $request = HTTP::Request->new;
my $response = $browser->get($URL);
die "Can't get $url -- ", $response->status_line unless $response->is_success;
my $result = $response->content;
$result =~ s/\<[^\>]*\>//g;
$result =~ s/^\s*$>//g;
$result =~ s/\n\n/\n/gm;
$result =~ s/\n\n/\n/gm;
$result =~ s/\n\n/\n/gm;
$result =~ s/(^\(.*\)$)//g;
foreach $line (split "\n", $result) {
if ($line =~ /\(.*\)/) {
print colored( $line, "bold yellow"), "\n";
}
else {
print $line, "\n";
}
}
__END__
Win32::Console::ANSI 는 default가 아니니 인스톨해줘야해요.

보시면 아시겠지만, 괄호가 들어간 라인은 함수의 설명이라고 생각해 노란색으로 표시하게 했습니다. (너무 길어서 "| more"로 보시면 ANSI color값은 없어져 버립니다.)

약 30줄 정도 되는 지저분한 코드입니다만, 그럭저럭 쓸만할 것 같습니다. 좀 더 뼈와 살을 붙이면, 제대로 된 툴이 될 것 같아요. 예를 들면 parameter가 없으면, 클래스 리스트를 보여준다던 지, 리눅스 환경이면 리눅스용 패키지를 use하게 한다던 지 말이죠.




아마 이런 종류의 여러 아류작을 만들 것 같습니다.

Friday, May 15, 2009

perl로 만드는 win util / getprint.pl

최근 Perl을 사용한 작업을 다시하면서, 여러가지 유틸리티를 만들면 좋겠다 라는 아이디어가 떠올라 공유할까 합니다.
굉장히 적은 코드로도 꽤 쓸만한 동작을 하는 유틸리티를 작성할 수 있을 것 같기 때문입니다.

■ perl 실행의 기본.

(1) perl 파일의 실행
activeperl이 설치되어 있다면, 커맨드 프롬프트에서 pl 파일 이름만 써도 바로 실행할 수 있습니다.
예를 들어 다음과 같습니다.

C:\>type test.pl
print "hello";
C:\>test.pl
hello
C:\>

(2) 확장명을 쓰지않고 실행하기
그런데 .pl 까지 쓰지 않고 test 만 입력해서 실행하면 안될까요?
환경변수에 그 내용이 적혀 있습니다.

다음 명령중 하나를 커맨드 프롬프트에서 실행해 보면, 바로 실행할 수 있는 확장자를 볼 수 있습니다.

C:\>set | find "PATHEXT"
C:\>set | find /i "pathext"
C:\>set | find /n /i "pathext"

C:\>set | find "PATHEXT"
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.PSC1;.py;.pyw

여기에 다음과 같이 입력하여 확장자가 .pl인 것도 이름만 입력하여도 실행할 수 있게 합니다.

C:\>set PATHEXT=%PATHEXT%;.PL

C:\>test
hello

이때 주의해야할 점은 2가지 인 것 같습니다.
- 실행의 우선순위는 cmd.exe의 내부명령어, 그리고 PATHEXT에 정의된 순서입니다. 만일 dir.pl이 있다면 dir명령은 cmd의 dir명령이 실행됩니다. dir.pl을 실행하려면 확장명까지 다 써줘야 dir.pl이 실행될 것입니다. 또 test.com이 있다면 test.com이 우선권을 가지므로 test.com이 실행될 것입니다.
- 확장명을 떼고 입력해도 실행하게 하는 것은 cmd.exe라는 쉘이 실행할 때 뿐입니다. 만일 totalcmd와 같은 tool에서 바로 test만 실행해서 test.pl을 실행하고 싶다면 그러한 기능을 tool이 지원하지 않는 한, 실행되지 않을 것입니다. (tool이 cmd.exe를 통해서 실행하게 하는 방법은 있습니다.)

(3) 파라메터를 주는 법
기본적인 파라메터를 주는 방법은 다 알고 계실 것입니다. 스페이스로 구분하죠.
그런데 파라메터안에 스페이스를 포함해야하는 경우는 특정 문자로 묶어서 하나의 parameter로 인식하게 해야합니다.

윈도우즈계열에서 이 묶는 문자는 리눅스계열의 것과 약간 다른데,
리눅스계열은 작은따옴표든, 큰따옴표든, 제일 바깥의 것을 pair로 해 parameter로 인식하는 반면,
윈도우계열은 큰 따옴표만을 parameter로 인식합니다.

윈도우즈에서 만일 큰따옴표 안의 parameter안에 큰따옴표를 써야 한다면 역슬래쉬를 붙여 escape화 해주면 됩니다.
이 방법은 리눅스에서도 동일합니다. 즉. 리눅스의 커맨드로 다음과 같은 명령을 본 적이 있다면

perl -MLWP::Simple -e 'getprint "http://www.yaplog.jp"'

윈도우즈에서 실행해보면 다음과 같이 Annoying합니다.
C:\>perl -MLWP::Simple -e 'getprint "http://www.yaplog.jp"'
Can't find string terminator "'" anywhere before EOF at -e line 1.

그래서 윈도우즈에서는 다음과 같이 고쳐서 사용합니다.

C:\>perl -MLWP::Simple -e "getprint \"http://www.yaplog.jp\""

그리고 위 명령은 리눅스계열에서도 잘 동작합니다.

■ getprint.pl
바로 위의 명령을 파일로 해서 간단히 유틸리티를 만들어 두었습니다.
함수명을 파일명과 동일하게 해서 c:\usr\local\bin\getprint.pl 로 저장해 두었습니다.

#!/usr/bin/perl -w
use LWP::Simple;
@ARGV >0 ? getprint $ARGV[0] : print "getprint <url> to get html";

사용방법은 다음과 같습니다.
C:\>getprint http://www.wowkorea.jp
C:\>getprint file:///c:/test.pl


그동안 브라우저를 사용할 수 없는 터미널 환경에서 서버의 작동을 확인할 때
telnet localhost 80
GET / HTTP/1.0<엔터><엔터>

와 같은 방식으로 테스트 했었다면, 이 작은 유틸리티가 쓸모가 있을 것 같습니다.

Tip입니다만, lynx를 사용할 수 있는 환경이면, 다음의 명령도 쓸만합니다.
lynx -dump http://www.wowkorea.jp
lynx -dump -head http://www.wowkorea.jp

■ 혹시 groovy를 사용하세요?
다음 명령을 실행해 보세요
C:\>groovy -e "print \"http://www.wowkorea.jp\".toURL().getText()"

Thursday, May 14, 2009

"\u82a0"식의 출력을 perl로 "あ"로 변환하기

저는 메신저로, 제 메신저에 등록된 한국사람들에게 "[정보공유]" 메시지를 가끔 보냅니다.

[정보공유] 타이틀이 붙은 메시지의 내용은 대상자의 professional과 관련된 것입니다.
예를 들면, 기획과 관련된 것은 기획자나, 관련자, 또는 관심을 가지고 있는 사람에게, 개발에 관계된 것이면, 관련 개발자에게 보냅니다.
일과 관련된 것이면, 팀원에게도 [정보공유] 타이틀의 메신저를 보내죠.

전에는 java나 c#으로 작업할 때는 많이 보냈습니다만, 최근에는 리눅스 작업인데, 해당자는 그리 많지 않은 것 같아 제가 보내는 것도 뜸합니다.

단방향 정보송신이기 때문에 특별히 답변을 하지 않아도 괜찮다는 의미로, 이런 종류의 메시지의 끝에는 "이상." 이라고 붙입니다.(간혹 "이상."이라고 붙이는 것을 잊어먹기도 합니다만, 특별히 답변이 안오는 경우가 많고 저도 기대하진 않습니다.)
그러면서 가끔. 저도 이런식의 정보를 받기를 바란다는 메시지를 전달합니다.
예를 들어, java에 관련된 작업을 하는 사람이면, 일하면서 뭔가 새로운 라이브러리를 발견했다던가, 조금 시간이 걸리는 어려운 문제를 만나 이렇게 해결했다던가 하는 내용을 저도 받기를 원합니다.
그런데 아직까지 한번도 받아본 적이 없는 것 같습니다.

제가 모르고 있는 것을 정보공유해준다면 저는 공짜로 하나를 알게 되는 것이니 정말 고마운 일이고,
제가 알고 있는 것이라도 [정보공유]의 메시지를 보내 준다면, 동감하거나, 또는 더 나은 방법을 알고 있다면 제가 comment해 줄 수도 있을 것입니다.
그런데 한번도 받아보지 못하고 있는 건 좀 아쉽습니다.

아주 가끔은 제가 질문을 날립니다. 금방 해결이 안됐다거나, 더 좋은 방법을 알고 있는 사람이 있을까 해서입니다.
그런데 이 경우도 답변이 오지 않습니다.. 너무 난이도가 있는 걸 물어봐서 였을까요..
결국 오늘도 스스로 해결하고 자답을 [정보공유]로 날렸습니다.

오늘 질문했던 내용은 이것입니다.

python의 tool을 사용하는 perl이 있는데, tool의 output중에 파이선의 유니코드 표현방식인 \u82a0 과 같이 표현된 문자열이 있었습니다.
이를 적절히 해당 ShiftJis코드인 "あ"로 치환하고자 하는 것인데, perl에서의 unicode표현방식이 달라 바로 치환할 수는 없고 \x{82}\x{a0}와 같이 바꿔서 치환하는 것이었습니다.
이를 정규표현식으로 "\x82\xa0"치환하는 건 하겠는데, "\x{82}\x{a0}"는 어떻게 "あ"로 치환하지? 하는 문제였습니다.

그리고 자답으로 낸 해결책은 이것이었습니다. 답을 보면 간단합니다.

(1) python의 tool을 사용하는 명령을 내리기 전에 "export LANG=C;"명령을 앞에 써주어 영어로만 출력되게 한다.

우선은 (1)로써 작업을 진행하다가, 돌아오는 전철에서 생각난 것은

(2) eval을 이용한다

였습니다.

그리고 집에와서 테스트 코드를 작성해 보았습니다.

#!perl
$text = '\u82a0aaaあああbbb\u82a2';
$text =~ s/\\u(\w{2})(\w{2})/\\x\{$1\}\\x\{$2\}/g;
eval "\$text = \"$text\"";
print $text, "\n";

__END__
あ unicode 0x3042 shiftjis, cp932 0x82a0
ぃ unicode 0x3043 shiftjis, cp932 0x82a1
い unicode 0x3044 shiftjis, cp932 0x82a2
http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP932.TXT

결과는

c:\temp>perl test2.pl
あaaaあああbbbい

eval을 사용하는 것은 대부분의 스크립트 언어에 존재하기 때문에 비슷하게 써먹을 수 있을 것입니다. (groovy에도 eval이 있나??)
이 결과를 질문했던 사람들에게 [정보공유]로 전달해 주었습니다만, 어째 좀 아쉬운 느낌입니다.
메신저에 없는 사람이라도, 가볍게 물어볼 수 있는 곳이 있으면 좋겠습니다.
어째 KDLP등의 유명 개발자 커뮤니티에 올리면 너무 많은 사용자가 보고 많은 댓글이 달리기 때문에 부담스럽운건 저만 그럴까요. ^^;

Wednesday, May 13, 2009

미야시타상의 Punc

최근 Func(https://fedorahosted.org/func/)로 작업을 하고 있는데,
이와 비슷한 Punc(http://coderepos.org/share/wiki/Punc)라는 프로젝트가 있습니다..
coderepos에 올라간지 14개월 밖에 안되는 프로젝트인데, 이 저자는 우리 그룹의 회사중의 하나인 Paper & boys co.에 근무하는 미야시타 고-스케라는 분이 진행하고 있습니다..

분명히 Paper & boys co.에도 호스팅사업을 하고 있고 꽤 실적을 내고 있기 때문에 비슷한 내용의 작업을 많이 할 것이라고는 생각했지만, 이런 정도의 활약을 하고 있는 사람이 있다고는 생각하지 못했네요.
아직 Punc는 프로토타입인데, 호스팅업계에서 Killer App로 성장하게 될 지도 모르겠습니다.

미야시타상의 블로그를 잠깐 보았는데, 재미있는 코드들이 있습니다.
예를 들면, 믹시에 post하는 perl코드.. 마지막 update가 3년전이네요.
http://trac.mizzy.org/public/browser/mixi/trunk/post_blog_to_mixi.pl

그동안 블로그에 기술적인 강좌식의 글을 적는 것을 쓸데없이 정보를 재생산하는 것 같아 좋아하지 않았는데 블로그를 Trac으로 쓰고 있는 것은. 자기가 진행하고 있는 프로젝트를 함께 보게하는 것으로 좋은 방법인 것 같다고 생각이 듭니다.
그런데 조-금. 느린 것 같은 느낌은 있습니다.

Friday, May 8, 2009

잠을 못이루고 일어나, 컴퓨터를 켜고

잠을 청하려고 누웠다가 잠을 못이루고, 일어났습니다.
할 일이 없어서 컴퓨터를 켜고, 회사의 컴퓨터와 Synchronize한 뒤, 로컬에 개발환경을 만듭니다.

예전에는 한참 코딩을 하고 돌아가겠지 하고 돌려보면 한번에는 안돌아가지만, 몇번 수정을 가하고 돌아가게끔 한뒤에 코딩을 계속 진행했지만,
요즘은 test를 만들지 않으면 프로젝트가 진행이 안됩니다.(테스트가 몸에 배어서.. 라고 말하고 싶지만, 전체를 쫙 풀어놓고 갈만큼 충분히 이해를 하고 있지 못하거나, 머리가 나빠져서인 것 같습니다.)

노래는 주현미 재생목록을 youtube로 자동재생하게 해놓았습니다.(가끔 현숙님 노래도 나오네요)

오늘은 토비님이 쓰신 ROO의 소개로 잠 못주무시는 분들이 많은 것 같습니다.
여러분의 블로그가 새벽에 post되고 있습니다.
나도 해보려고 맘먹고 있었지만, 우선 회사일로 나중으로 미룹니다.

꽤 cron으로 자주 실행될 스크립트를 Perl로 작성하고 있습니다.
perl이 빠르다고는 하지만, 매번 컴파일되어 실행해야하므로 속도를 고려해서 작게 만들어야 합니다. 이부분에서는 java가 그렇게 light-weight하다며 자랑하는 것이 이해가 갑니다. daemon타입으로 작성하면 빠르겠지요. 하지만 이 프로젝트는 Maintenance는 system admin이 하므로 perl + python으로 작성해 주어야 합니다.

로컬에 BerkeleyDB를 install했습니다. 혼방이야 페도라지만, 로컬에서의 개발은 activePerl을 사용하니 ppm으로 인스톨한 perl의 BerkeleyDB package 3.3이 최신인 BerkeleyDB 4.7을 사용못하더군요. Uninstall하고 4.5로 다시 설치했습니다.

처음에 설계가 Domain Model, BL, DAO로 머리가 돌아가는 것이, perl을 이렇게 짜면 혼날 것 같아서 Facade로 Model + Manager 정도로 고쳐 디자인했습니다. 이마저도 월요일 Review에서 빵꾸 먹을지 몰라요. 가급적이면 Class로 하지 말아달라고 했거든요. 이정도는 통용되겠지 하고 진행하고 있습니다만, 월요일 봐야 알 것 같습니다.

오늘 회사에서 속상했거든요. 1분기 평가 결과가 오늘 나왔습니다.
java하다가(그것도 struts Action에서 query만들어 날리는 스파게티프로젝트에 참여), VB.Net하다가(그것도 try catch안쓰고 모든 method는 성공여부를 리턴하는 비쥬얼베이직식으로 된, Page초기화 할 때, DB에쿼리 날리는 식으로된 프로젝트에 참여), Perl과 Python할 줄 아는 사람이 없어, 다시 운영부 지원으로 나가게 되어... 전문성을 키우지 못하고, 평가도 만족스럽지 못한 상태여서 입니다. 이번 분기뿐 아니라 여러번 겪었습니다.

nmake test해가며 작업해가고 있는데, 이제는 어느 개발이든 콘솔은 필수로 사용하게 된 것 같습니다. 운영부 애들이 하던 말이 떠오르네요 "got a big raise!".
새벽에 컴퓨터켜고 운영부 지원프로젝트 로컬에 세팅하는 제가 밉습니다. 영어공부나 할것이지..(사실 자려들기전에 좀 했습니다만..)

이런거 블로그에 쓰면 안되는데- 하면서도 적는 건,
이야기할 사람이 적은 일본회사안에서의 한국인이어서라고 너그러이 양해부탁드립니다.

Sunday, May 3, 2009

어떤 언어를 선택할 것인가에서 어떤 솔루션을 선택할 것인가

최근 일련의 경험으로 프로그래밍 언어에 대해 여러가지를 생각하게 됩니다.

회사에서 Perl작업을 하면서 있었던 일입니다만, 시스템본부 운영부의 admin들은 perl에서 class를 사용하는 것은 아무래도 느리기 때문에 하지 말아주길 바라더군요. fast-cgi나 mod_perl이라던지 compile해둔 코드를 관리해 실행하게 하는 방식은, 만일 하나의 스크립트가 잘못되어 halt되면 전체를 망가트릴 수 있고, 만일 CGI방식으로 작동하는 스크립트면, halt되었을 때, 해당 프로세스만 kill하면 되기 때문에 CGI방식으로 작업을 하길 원했습니다. 그렇기 때문에 더더욱 객체로 감싸서 작업하는 것은 곤란하겠지요.

최근 Scala이라고 하는 언어를 알게 되었습니다. Martin Ordersky이 만든 자바 컴파일러입니다.
Perl6 VM과 마찬가지로 Static Typing을 지원하고 groovy와 마찬가지로 java의 객체들을 불러 쓸 수 있고, perl과 비슷한 절차적 언어와 비슷한 문법을 가지고 있습니다. javac을 사용하지 않고 자체 컴파일러를 가지고 있습니다. groovy처럼 자바의 Scripting Engine의 Implementation이 아니라, 독자적인 컴파일러로 자바 IL로 컴파일합니다. 장점과 단점 모두 가질 수 있겠네요.
플러스, 닷넷의 CRL도 지원한다고 합니다만, 이에 대한 언급은 매우 작았습니다.

이미 여러 IDE의 플러그인이 개발되어 나와 있더군요. Twitter의 Message Queue는 Scala로 개발되었다고 합니다.

이번의 프로젝트에는 Python으로 해야하는 개발도 있습니다.
Python도 공부해보면 훌륭한 언어입니다. 특히 시스템관리 스크립트로는 제격인 것 같습니다. 기능과 performance간의 trade off을 잘 조정한 것 같은 느낌입니다. Tab으로 syntax를 조절하는 방식때문에 혐오하는 사람들도 꽤 있더군요. vim을 사용한다면 그럴 것 같다는 생각도 듭니다.

최근에는 여러가지 복잡한(?) 라이브러리를 사용한 j2ee솔루션과 php와의 비교도 있었습니다.



보통은, 어떤 솔루션을 구현하는데는 여러가지 언어로도 가능하며(오히려 가능하지 않은 언어를 찾기 어려운 경우가 많으며), 선택한 언어가운데에서도 많은 Variation으로 구현할 수 있습니다.
그런데 보통 하나의 개발팀은 하나의 언어만 사용하는 경우가 많은 것 같습니다. 그도 그럴 것이, 한가지 언어에 -어느 정도- 능통해지기 까지도 굉장히 많은 시간과 경험을 필요로 합니다.(정말 그럴까요? 나는 몇몇 사람들로 부터 반드시 그렇지 않다는 것을 경험합니다. 우선은 그렇다고 해두죠.) 프로젝트를 진행하면서 얻은 노하우와 스킬은 그 다음 프로젝트에서 오류가 적고 좋은 품질의 솔루션을 만들기 위해 언어를 선택할 때, 매우 큰 Advantage입니다. 반면 새로운 언어를 선택하는 것은 조직에게 있어서 엄청난 Pain일 수 있습니다. 새로운 프로젝트에서도 같은 언어를 선택하는 것은 조직으로서는 타당한 결정일 경우가 많습니다.

하지만 시스템(솔루션)으로서 생각해보면, 각각의 언어는 다른 언어와 구별되는 특징을 가지고 있으며, 이는 어떤 솔루션에 있어서는 큰 advantage 인 경우가 있습니다.
예를 들면, 어떤 CI tool을 선택할까하고 살펴본 CI tool Matrix에는 java나 c#의 implementation이 압도적으로 많습니다. 이는 어떤 종류의 소프트웨어에는 어떤 특성을 가지는 언어가 적합하다고 생각하는 경우가 많다는 것이겠지요.

아직 나로서는 결정을 내리기 어렵습니다. 어쩌면 이 글도 뭔가 일련의 생각들을 정리하기 위해 적는 것일지도 모릅니다. (날을 새서 두서없이 적는 것인지도 모르겠습니다. Issue가 무엇인지 제대로 얘기하는 것 같지 않습니다.)
그러나 인터넷에는 어떤 언어를 정해놓고 많은 솔루션의 토의가 있는 것처럼,
언어를 정해놓지 않고(또는 터놓고) 솔루션에 대한 토의도 많이 있어야 할 것 같습니다.