2011/12/26

윈도우에서 Perl어플리케이션 배포

윈도우즈에서 Perl어플리케이션을 만들어 배포하는 방법에는 PAR::Packer 모듈을 쓰는 방법 상용 패키징 툴인 Activestate사의 PerlApp등을 쓰는 방법이 있다. 하지만 패키징시 필요없는 것을 너무 많이넣어 용량이 커지거나 초기실행시 내부적인 압축해제절차에 의해 속도가 느리거나 등등 단지 하나의 실행파일을 만들지 않을 것이면 패키징 하기위해 갖추어야 하는 노력이나 비용등에서 너무 오버인거 아닌가 하는 생각이 들곤한다.

예전 부터 생각하던 패키징 방식은 필요한 Perl관련 파일만을 추려서 디렉토리구조를 그대로 가져가고 간단한 .exe형태의 launcher를 만들어 그것을 실행하면 주변 환경변수라든지 모듈경로라든지 등등을 알아서 세팅한 다음 프로그램을 실행시키는 구조이다. http://perl-node-interface.blogspot.com/2011/03/deploy-perl-application-on-windows.html 에서 설명하는 방식이 그런 방식인데 저기서도 꼭 필요한 파일만 어떻게 정확하게 추려낼 것인가에 대한 방법은 완벽하지 않다.

그러면 꼭 필요한 파일을 어떻게 추려낼것인가? 를 고민하다 Windows에서 LINUX의 strace같은 프로그램이 있다면 특정 Perl스크립트를 실행시켰을때 파일을 접근하는 시스템콜을 모두 추적하면 정말 필요한 파일만 골라낼 수 있지 않을까는 생각에 Windows에서 strace같은 기능을 하는 프로그램들을 검색해보고 일일히 테스트해 보았는데 http://www.howzatt.demon.co.uk/NtTrace/ 라는 프로그램이 제일 원하는 대로 동작을 했다. 우선 패키징 작업전에 해당 싸이트에서 적절한 바이너리를 받는다.( 본인은 Windows 7 x64를 쓰기 때문에 64bit 버젼으로 받았다.)

패키징을 테스트하기 위해서 GUI면서 적절한 의존 모듈을 포함한 Perl프로그램이 좋겠다 싶어 Win32::GUI와 OpenGL에 의존성을 가진 스크립트를 선정했다. 해당 소스는 http://www.mail-archive.com/perl-win32-gui-users@lists.sourceforge.net/msg05673.html 에 있다. 일단 패키징할 Perl스크립트를 win32_opengl.pl 파일이라고 하겠다.

이제 win32_opengl.pl 파일이 실행될때 필요로 하는 Perl관련 파일들은 뽑아내보자. Nttrace 프로그램을 이용해서

NtTrace -filter File perl win32_opengl.pl > out.txt

처럼 명령을 내리면 perl win32_opengl.pl 파일이 실행되면서 접근하는 모든 파일관련 시스템콜들이 out.txt에 저장된다.
프로그램이 떠서 잘 돌아갈때 까지 기다렸다가 접근할 파일이 이제 더 이상 없겠다싶으면 그냥 종료하면 된다. (만약에 동적으로 모듈을 로딩하거나 하는 기능이 있으면 그런 것도 추적되도록 모든 기능을 시험적으로 사용후 종료하길 추천)

이제 out.txt 파일 안을 열어 보면 다음과 같이 온갖 다양한 시스템콜들이 기록되어 있다.

NtCreateFile( FileHandle=0x8e2e8 [0x78], DesiredAccess=SYNCHRONIZE|GENERIC_READ|0x80, ObjectAttributes="\??\C:\Windows\Globalization\Sorting\sortdefault.nls", IoStatusBlock=0x8e300 [0/1], AllocationSize=null, FileAttributes=0x80, ShareAccess=1, CreateDisposition=0x1, CreateOptions=0x60, EaBuffer=null, EaLength=0 ) => 0
NtQueryAttributesFile( ObjectAttributes="\??\C:\strawberry-perl-5.12.3.0-portable\perl\site\5.12.3\lib", Attributes=0x8e308 ) => 0xc000003a [3 '지정된 경로를 찾을 수 없습니다.']
NtQueryAttributesFile( ObjectAttributes="\??\C:\strawberry-perl-5.12.3.0-portable\perl\site\lib", Attributes=0x8e308 [DIRECTORY] ) => 0
NtQueryAttributesFile( ObjectAttributes="\??\C:\strawberry-perl-5.12.3.0-portable\perl\site\5.12.3\lib", Attributes=0x8e308 ) => 0xc000003a [3 '지정된 경로를 찾을 수 없습니다.']
NtQueryAttributesFile( ObjectAttributes="\??\C:\strawberry-perl-5.12.3.0-portable\perl\site\lib", Attributes=0x8e308 [DIRECTORY] ) => 0

이제 여기서 필요한 것들은 자기가 쓰고있는 Perl의 base경로를 포함한 파일들이다. 시스템콜 추적 로그파일인 out.txt 에서 필요한 파일을 현재 디렉토리 아래의 dist란 디렉토리를 만들어 뽑아내는 make_dist.pl Perl스크립트를 만들어 보면 다음과 같다.

#!/usr/bin/env perl
use 5.010;
use strict;
use warnings;

my $perl_path = qr/C:\\strawberry-perl-5.12.3.0-portable\\perl\\/;
my %files;
open my $fh , '<', 'out.txt' or die;
while (my $line = <$fh>) {
    $files{$1}=1 if $line =~ m{($perl_path.*?)".*?=> 0$};
}   

foreach my $file (sort keys %files) {
    next if -d $file;
    my $dest = $file;
    $dest =~ s/$perl_path//;
    say "$file -> $dest";
    system(qq{echo f | xcopy /C "$file" .\\dist\\"$dest"});
}

위에서 $perl_path 변수를 자기 환경에 맞게 바꾸면 된다.

perl make_dist.pl

이라고 명령을 내리면 현재 디렉토리 아래 dist란 디렉토리가 생기면서 strawberry perl이면

bin, lib , site, vendor 같은 디렉토리구조 안에 필요한 파일들만 추려져서 뽑혀져 있을 것이다.( Win32, OpenGL을 사용하는 간단한 GUI어플의 경우 4MB가 약간 넘는 양으로, PAR나 PerlApp들이 패키징하는 용량에 비하면 아주 필요한 파일만 슬림하게 뽑혀졌음을 알 수 있다.)
이 까지 작업이 끝나면 메인 스크립트인 win32_opengl.pl 과 dist\bin 과 dist\site\bin 디렉토리의 안의 모든 파일은 dist 디렉토리로 옮기자. (빈 bin 디렉토리들은 지워도 상관없음)


이제 .exe 형태의 launcher를 만들 차례다. 하지만 .exe 형태의 launcher가 필요하지 않다면 그냥 dist디렉토리에 launch.bat 이란 적절한 batch파일로 다음과 같은 내용으로 만들고 실행하면 깔끔하게 실행된다.

set PATH=.;%PATH%
perl win32_opengl.pl

그렇지만 .exe 형태로 아이콘모양도 넣고 제공해야 뭔가 일을 제대로 하는 것 같다면 약간 험난한 길을 더 걸어야 한다. 아래와 같은 명령을 내리면 perlxsi.c 라는 파일이 만들어진다. (이 작업은 dist디렉토리에서 하면 추려진 perl로 동작하므로 dist 디렉토리에서 하지 말것!)


perl -MExtUtils::Embed -e xsinit

만들어진 perlxsi.c 파일을 열어서 상단에 #include <windows.h> 와 메인 스크립트 이름을 넣는 부분과 /* Appended code */ 아랫부분을 아래와 같이 추가하고 저장한다음
( #define SRC_NAME "win32_opengl.pl" 라인이 자기의 메인 스크립트 이름을 지정하는 것)

#include <EXTERN.h>
#include <perl.h>
#include <windows.h>

/* main script name */
#define SRC_NAME "win32_opengl.pl"

EXTERN_C void xs_init (pTHX);

EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);
EXTERN_C void boot_Win32CORE (pTHX_ CV* cv);

EXTERN_C void
xs_init(pTHX)
{
 char *file = __FILE__;
 dXSUB_SYS;

 /* DynaLoader is a special case */
 newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
 newXS("Win32CORE::bootstrap", boot_Win32CORE, file);
}

/* Appended code */
static PerlInterpreter *my_perl; /*** The Perl interpreter ***/
int main(int argc, char **argv, char **env)
{
    char bin_path[MAX_PATH];
    char *pos; // work string.
    int n;
    /* unshift argv for reserving the original arguments */
    argv[argc] = strdup(argv[argc-1]);
    for(n=argc; n>1; n--) {
        argv[n] = argv[n-1];
    }

    if (!GetModuleFileName(NULL, bin_path, MAX_PATH)) return 1;
    pos = strrchr(bin_path, '\\'); /* the last occurrence of '\\' */
    if (!pos) return 2;            /* not found */
    pos[0] = '\\';
    pos[1] = '\0';
    /* check for MAX_PATH limit overflow */
    if ( strlen(bin_path)+strlen(SRC_NAME)+1 > MAX_PATH ) return 3;

    strcpy(pos + 1, SRC_NAME);

    argv[1] = bin_path;
    argc++;
 
    PERL_SYS_INIT3(&argc,&argv,&env);
    my_perl = perl_alloc();
    perl_construct(my_perl);
    PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
    perl_parse(my_perl, xs_init, argc, argv, (char **)NULL);
    perl_run(my_perl);
    perl_destruct(my_perl);
    perl_free(my_perl);
    PERL_SYS_TERM();
}


이제 이 c소스를 컴파일 해보자.(strawberry perl이면 gcc가 기본으로 포함되어 있고 Activestate Perl이면 ppm install MingGW 명령으로 gcc를 설치할 수 있다.)

gcc -Wall -mwindows -o launch.exe perlxsi.c [이 뒤에는 아래 명령에 의해 나오는 출력결과(컴파일 옵션)들을 각각 긁어 붙인다.

perl -MExtUtils::Embed -e ccopts
perl -MExtUtils::Embed -e ldopts


본인의 경우 컴파일 명령은 다음과 같았다.(실행파일명은 -o 옵션뒤에 원하는 이름으로 하면 됨)

gcc -Wall -mwindows -o launch.exe perlxsi.c -s -O2 -DWIN32 -DHAVE_DES_FCRYPT  -DUSE_SITECUSTOMIZE -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -fno-strict-aliasing -mms-bitfields -DPERL_MSVCRT_READFIX  -I"C:\strawberry-perl-5.12.3.0-portable\perl\lib\CORE" -s -L"C:\strawberry-perl-5.12.3.0-portable\perl\lib\CORE" -L"C:\strawberry-perl-5.12.3.0-portable\c\lib"  C:\strawberry-perl-5.12.3.0-portable\perl\lib\CORE\libperl512.a C:\strawberry-perl-5.12.3.0-portable\c\i686-w64-mingw32\lib\libmoldname.a C:\strawberry-perl-5.12.3.0-portable\c\i686-w64-mingw32\lib\libkernel32.a C:\strawberry-perl-5.12.3.0-portable\c\i686-w64-mingw32\lib\libuser32.a C:\strawberry-perl-5.12.3.0-portable\c\i686-w64-mingw32\lib\libgdi32.a C:\strawberry-perl-5.12.3.0-portable\c\i686-w64-mingw32\lib\libwinspool.a C:\strawberry-perl-5.12.3.0-portable\c\i686-w64-mingw32\lib\libcomdlg32.a C:\strawberry-perl-5.12.3.0-portable\c\i686-w64-mingw32\lib\libadvapi32.a C:\strawberry-perl-5.12.3.0-portable\c\i686-w64-mingw32\lib\libshell32.a C:\strawberry-perl-5.12.3.0-portable\c\i686-w64-mingw32\lib\libole32.a C:\strawberry-perl-5.12.3.0-portable\c\i686-w64-mingw32\lib\liboleaut32.a C:\strawberry-perl-5.12.3.0-portable\c\i686-w64-mingw32\lib\libnetapi32.a C:\strawberry-perl-5.12.3.0-portable\c\i686-w64-mingw32\lib\libuuid.a C:\strawberry-perl-5.12.3.0-portable\c\i686-w64-mingw32\lib\libws2_32.a C:\strawberry-perl-5.12.3.0-portable\c\i686-w64-mingw32\lib\libmpr.a C:\strawberry-perl-5.12.3.0-portable\c\i686-w64-mingw32\lib\libwinmm.a C:\strawberry-perl-5.12.3.0-portable\c\i686-w64-mingw32\lib\libversion.a C:\strawberry-perl-5.12.3.0-portable\c\i686-w64-mingw32\lib\libodbc32.a C:\strawberry-perl-5.12.3.0-portable\c\i686-w64-mingw32\lib\libodbccp32.a C:\strawberry-perl-5.12.3.0-portable\c\i686-w64-mingw32\lib\libcomctl32.a

컴파일 결과로 launch.exe 가 생성되면 해당 파일을 dist 디렉토리로 옮긴다. 이제 launch.exe를 실행해 보자.



짠! 잘 실행된다.



만약 launch.exe에 특정 icon을 넣고 싶으면 http://perl-node-interface.blogspot.com/2011/03/deploy-perl-application-on-windows.html 의 설명대로 적절한 리소스 .rc파일을 만들어서 windres 명령으로 오브젝트 파일로 만든다음 컴파일시 추가하여 해도 되고 그것이 귀찮으면 원하는ico파일을 Win32::Exe 모듈을 깐다음 exe_update(  https://metacpan.org/module/exe_update.pl )을 써서

exe_update --icon=my.ico launch.exe

명령을 통해 쉽게 추가할 수 있다.

이제 모든게 끝났다. 이제 배포는 dist 디렉토리이름을 적절하게 바꾼다음 zip으로 묶어서 배포하고 사용자는 그냥 zip파일을 풀고 .exe파일만 실행시키면 그만이다.

<작업이 끝난 디렉토리 내부 모양>


추가 참고사항:

* dist디렉토리안의 perl.exe는 위에서 batch 파일을 통한 실행시는 필요하지만 별도로 만든 .exe 실행파일형태의 launcher를 통해 실행시키면 직접 perl dll을 로딩하여 사용하기 때문에 지워도 상관없다.
* 위 절차로 만들어진 .exe파일은 기본적으로 명령 콘솔을 사용하지 않는다. 만약 콘솔을 보이게 하려면 위에서 말한 exe_update 명령으로
  exe_update -c launch.exe 로 콘솔창이 보이게 exe_update -g launch.exe 로 콘솔창이 안보이게 바꿀 수 있다.
* 다 쓰고 생각해보니 launch.exe는 메인스크립트 이름을 main.pl 정도로 통일하면 아이콘이랑 실행파일 이름은 임의로 바꿔서 계속 재사용 할 수 있을듯.

2011/12/14

Perl, Python, Ruby, PHP, C, C++, Lua, tcl, javascript, Java 성능비교

각종언어에 대한 벤치마크 비교

포커스가 문자열을 얼마나 빠르고 메모리 효율적으로 처리하느냐에 맞춰져 있는데..

이렇게 비교를 한 이유가 대부분의 현대적 어플리케이션의 주작업은 문자열을 다루는 것이며
수치계산은 하드웨어 의존적인 면이 있고 컴파일된 native한 코드가 아닌경우 어떤 언어라도
많은 계산을 하기에는 충분히 성능이 나지 않기 때문에 빠른 계산이 필요하다면 컴파일된
native한 코드를 쓰던지 써드파티 수치계산 라이브러리를 각 언어에 붙여 쓰게 되는데
그렇게 하면 언어간 비교가 아니라 수치계산라이브러리의 성능비교가 되기 때문에
의미가 없다.... 뭐 이렇다고 함

성능비교뿐만 아니라 끝부분에 각 언어에 대한 비평도 읽어볼만 함..

http://onlyjob.blogspot.com/2011/03/perl5-python-ruby-php-c-c-lua-tcl.html

속도에서는 스크립트 언어인 Perl이 C/C++보다 더 빠르다는게 신기..
Java는 의외로 실망스런수준이고(아마도 Buffered String을 쓰면 그나마 나아지리라 생각하지만....)

* 제일 빠른 Perl속도를 1로 했을때 언어별 상대적 속도 비교표(숫자가 작을수록 빠름)

Line size KibPerl5PHPRubyPythonC++ (g++)C (gcc)Javascript (V8)Javascript (sm)Python3tclLuaJava (openJDK)Java (Sun)Java (gcj)
Average:13.845.215.593.891.233.2319.6613.9221.3534.3631.1631.12247.32

2011/11/03

Perl 5.10 부터 도입된 스마트매칭 ~~ 연산자와 given~when구문 문제

Perl 5.10 부터 도입된
smart match 연산자 ~~ 는 너무 경우의 수가 많아 복잡하고
경우에 따라 일관성을 가지고 동작하지 못하는 부분이 있어
차후 deprecate 시키든지 다시 깔끔하게 정리하려고 하는 것 같습니다.
따라서 그때까지는 쓰지 말기를 추천하더군요.

참고:
 http://blogs.perl.org/users/brian_d_foy/2011/07/rethinking-smart-matching.html

그리고 C의 switch 같은 기능의 given ~ when 구문은
given과 같이 사용되는 lexical $_ 변수와 위의 내부적으로
given ~ when 구문의 비교에 있어 기본으로 사용되는 smart match연산자
와 얽힌 부분에 문제가 있어 역시 향후 기능과 동작이 다시 완벽해지기
전까지는 역시 사용하지 말 것을 추천하고 있습니다.

참고:
http://www.effectiveperlprogramming.com/blog/1333
http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2011-05/thrd9.html#00768

http://blogs.perl.org/users/leon_timmermans/2011/10/why-do-you-want-new-major-features-in-core.html
에 보면
  • Smartmatching? I think everyone agrees it is broken.
  • given/when is even worse as it's almost impossible to predict if it will use smartmatching or not.
  • Lexical $_? Mostly a new source of bugs, and the _ prototype is merely a hack to work around lexical $_ issues.
라고 말하고 있음.

Learning Perl 5판 과  한글 번역판인 "거침없이 배우는 펄" 에서 smart match와 given~when 구문에
비교적 많은 분량을 할애하여 설명하고 있는데 그 부분은 그냥 무시하시면 될듯합니다.
(얼마전 나온 Learning Perl 6판에는 이런 부분을 언급하고 사용에 주의하라고 하는 내용이 들어간듯)

추가:
 ( Programming Perl 4판에서는 given ~ when은 아직 시험적 상태로 보지만 스마트매칭이 적용되지 않는 명시적인 숫자,문자열 매칭 조건은 향후 어떻게 변하든 문제 없으니 안심하고 사용해도 괜찮다고 함)

2011/10/22

기록의 의미로 다시 정리해보는 CodeGolf 용 Perl one-liner

Code Golf는 어떤 주어진 문제를 코드의 우아함, 가독성 등등따위는 제껴두고 수단과 방법을 가리지 않고 되도록이면 짧게 프로그래밍 할수록 높은 점수를 얻는 게임이다.

예전에 풀어본 문제를 기록을 남기는 의미에서 다시 정리해봄

문제)
http://kldp.org/node/112089

예를 들어, A.csv는

1   2   3
4   5   6

B.csv는
2   3   4
5   6   7
라면 같은 위치의 요소끼리 사칙연산 하려면?
답)
같은요소끼리 더하기
$ paste A.csv B.csv | perl -alpe '$_="@{[map$F[$_]+$F[$_+@F/2],0..$#F/2]}"'
3 5 7
9 11 13
문제)
http://codegolf.stackexchange.com/questions/3095/paint-that-fence
Paint the fence.
 
각 라인은 S L C 의 형태로 되어있다. S는 시작위치 L을 길이 C는 색깔을 뜻한다.
(시작위치는 0부터시작)
다음과 같은 라인에 대해서 규칙을 적용해서 펜스를 칠해나가면 펜스의 색은
오른쪽과 같을 것 이다.

0 3 1                      111...........
2 4 2                      112222........
1 2 3                      133222........
0 4 1                      111122........
7 3 5                      111122.555....

다 칠하고 난 다음 어떤색의 펜스가 얼만큼 있는지 다음과 같이

1 4
2 2
5 3

출력하는 코드를 작성하라.
답)
$ cat input.txt
0 3 1
2 4 2
1 2 3
0 4 1
7 3 5

$ cat input.txt  | perl -anE '@a[$F[0]..$F[0]+$F[1]]=($F[2])x$F[1];END{$i[$_]++for@a;$i[$_]&&say"$_ $i[$_]"for 1..$#i}'
1 4
2 1
5 3


아마 Perl 아니면 이보다 짧게 만들 수 있는 언어는 없을듯...
(요즘 보니 J란 언어가 다크호스 같긴 하지만서도..)

2011/07/30

배트맨 공식 그래프 그리기

요즘 SNS에서 다음과 같은 배트맨 공식이라는게 회자되고 있어서
























저 공식이 진짜 맞는건지 검증해보는 차원에서 Gnuplot으로 한 번 그려봄






















Gnuplot의 한계로 외곽선만으로만 뽑아내는건 힘들었음(더 찾아보면 가능할 수 도)

플로팅 소스는 http://plotshare.com/index.ws/plot/538486810

2011/07/29

서울 100년만의? 폭우기념 Visualization(가시화)그래프

서울에 100년만의 큰비로 난리났다는 뉴스에 100년만이 맞는 말이냐 아니면 구라냐 말이 많다.
어떤 분은 기상청 싸이트에서 과거 서울 강우량 기록을 긁는 스크립트까지 만드셔서
자료를 긁어 놓으셨길래 숫자만의 나열로는 느낌이 와닿지 않아 약간의 데이터 가공을
거쳐 Gnuplot을 써서 heatmap형태의 그래프로 그려보았다.

서울강우량 스크랩프로그램 및 데이터: https://github.com/yy/koweather

Gnuplot 그래프를 온라인상에서 공유하게 해주는 Plotshare에 올린 그래프

http://plotshare.com/index.ws/plot/116537618

아래는 위 싸이트에서는 이미지 싸이즈를 지정해도 일정한 크기로만 생성해서 좀 더
보기 쉽게 크게 그린 그래프 이미지.(클릭하면 크게 보임)


그래프에서 y축은 년도 x축은 1년 365일중에 몇번째 날인지, 그리고 검은색~노란색점은 강우량(mm)정도를 나타낸다. 나머지 해석은 알아서 각자...

2011/07/25

MacOS X 풀어쓰기 한글 -> 모아쓰기 한글 변환 스크립트

개인적으로 맥을 별로 좋아하지 않는다.

그 이유중 몇개를 들자면 Unix like한 OS라고 하면서 파일시스템에서 대소문자를 구분하지 않는다는 것이고.. ( 예를들면 Perl에서 AnyEvent란 모듈을 사용하겠다고 use AnyEvent;가 아니라 use ANYEVENT; 라고 해도 에러가 없이 실행된다. 만약 이런걸 맥에서 개발해서 Linux서비스 서버에 올렸다고 생각해보라.. 어떤일이 벌어질지는 안봐도 비디오다. )

그리고  맥에서는 한글이 일명 풀어쓰기 포멧(NFD)으로 저장된다. 여기에 대해서는 http://namoda.springnote.com/pages/4922363 를 보면 자세하게 나와있다.

하지만 주변에는 많은 맥빠들이 존재하고 그들과 자료를 주고 받으려고 하면 문제들이 한둘씩 발생하게 된다는 것이다. 맥에서 한글파일명으로 저장한 파일들을 리눅스에서 받으면 경우에 따라 사용 터미널이 NFD에 대한 자모 조합을 지원해서 제대로 보이거나 보이기는 하나 이상하게 조합되서 보이거나 아예 쭉 풀어져 버리는등 결과를 종잡을 수 없다. 그래서 NFD형식으로 된 한글 파일명을 NFC형식으로 바꾸는 Perl 스크립트를 만들어 봤다.

아는 사람끼리 위 같은 맥의 특성을 풍자하여 "맥부기"라고 부르는데 착안하여 이름은 demacboogi.pl (de맥부기)로 하였다.



위에서 쓰인 모듈들은 Perl에서 기본적으로 포함되는 core모듈이라 별도로 모듈을 설치할 필요는 없음

2011/05/16

Perl 5.14 출시

2011년 5월 14일 Perl 5.14가 출시되었다.
5.14 버젼이기 때문에 5월 14일에 맞춰 출시했다는 소문이~

Perl 5.14 는 Unicode 6.0, IPv6 지원, 더 낮은 CPU,Memory사용, "package Name { ... }" 문법, non-destructive 정규식 지원등 많은 기능이 추가되었다.

공식릴리즈 포스팅:
http://news.perlfoundation.org/2011/05/perl-514.html

바뀐점 정리:
http://search.cpan.org/~jesse/perl-5.14.0/pod/perldelta.pod

여러 뉴스싸이트의 반응:
http://slashdot.org/story/11/05/14/2253215/Perl-514-Released
https://lwn.net/Articles/442938/
http://news.ycombinator.com/item?id=2549077
http://www.reddit.com/r/programming/comments/hbg40/perl_514_is_out/

2011/04/05

Any::Moose, Mouse, Moose

Perl 5에는 Moose라는 Python, Ruby도 울고갈 OOP프레임웍이 있다.

Moose는 많은 기능이 있는 반면 상대적으로 메모리를 많이 소비하고 속도가 약간 떨어지는 경향이 있다. 그래서 Moose의 모든 기능이 필요없을 경우 Mouse라는 Moose의 subset을 사용한다. 하지만 미래에 Moose의 기능을 확장 적용해야 할 경우를 고려하여 Any::Moose라는 모듈을 사용하면 사용자가 신경쓸 필요없이 알아서 최대한 빠른 것으로 적용해주므로 편리하다.

Moose와 Mouse(Any::Moose가 자동으로 최적화 했을때) 의 속도를 비교해 보았다.

Object Creation
322580.65/s  Any::Moose = Mouse
322580.65/s  Any::Moose Immutable = Mouse Immutable
 11655.01/s  Moose
212765.96/s  Moose Immutable

Accessor
6250000.00/s Any::Moose = Mouse
6250000.00/s Any::Moose Immutable = Mouse Immutable
2127659.57/s Moose
2127659.57/s Moose immutable

결론

__PACKAGE__->meta->make_immutable;
은 접근자의 속도에는 영향을 미치지 않으며
Moose의 객체생성속도에만 영향을 미친다.
Any::Moose를 쓰더라도 미래에 Moose 확장을 고려하여
기본 클래스 정의는


http://search.cpan.org/perldoc?Moose::Manual::BestPractices

package Person;

use Moose;  # 또는 use Any::Moose;
use namespace::autoclean;

# extends, roles, attributes, etc.

# methods

__PACKAGE__->meta->make_immutable;

1;

을 따르도록 하자.

2011/03/03

대규모 서비스를 지탱하는 기술





오늘 구입한 책..

자세한 정보는 http://jpub.tistory.com/122

이 책은 일본의 구글이라고 불리우는 Hatena의 엔지니어가 저술한 책의 번역판이다.
Hatena의 CTO이자 주 저자인 나오야 이토씨는 현재 Hatena를 떠나 GREE라는 회사로 이직했다. (GREE는 DeNA라는 회사와 함께 일본의 모바일 서비스 시장의 잘나가는 쌍두마차중 하나임)

이 책은 현대적인 대용량 서비스 인프라에 대한 개발/이론/관리 및 운영등에 관한 폭넓은 정보를 다루고 있어 IT인프라 교양서라고 불릴만하다.

일본은 이 책이 나온 Hatena와 함께 Mixi, DeNA, livedoor등의 주요 인터넷 서비스회사들이 Perl기반으로 구축된 경우가 많기 때문에 책에 나오는 예제 코드는 거의가 다 Perl이며 과거 CGI시절 PHP처럼 써 갈기던 조잡한 Perl코드가 아니라 숙련되고 잘 훈련된 프로그래머가 작성한 이른바 Modern Perl코드이기 때문에 현대적 방식의 Perl공부에도 도움이 된다.