<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5137684887780288527</id><updated>2012-02-22T22:43:10.176+09:00</updated><category term='perl'/><title type='text'>aero's blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://aero2blog.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://aero2blog.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>aero's blog</name><uri>http://www.blogger.com/profile/08594337308939199818</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5137684887780288527.post-5808584475478697383</id><published>2011-12-26T16:37:00.007+09:00</published><updated>2011-12-27T09:38:16.709+09:00</updated><title type='text'>윈도우에서 Perl어플리케이션 배포</title><content type='html'>윈도우즈에서 Perl어플리케이션을 만들어 배포하는 방법에는 PAR::Packer 모듈을 쓰는 방법 상용 패키징 툴인 Activestate사의 PerlApp등을 쓰는 방법이 있다. 하지만 패키징시 필요없는 것을 너무 많이넣어 용량이 커지거나 초기실행시 내부적인 압축해제절차에 의해 속도가 느리거나 등등 단지 하나의 실행파일을 만들지 않을 것이면 패키징 하기위해 갖추어야 하는 노력이나 비용등에서 너무 오버인거 아닌가 하는 생각이 들곤한다.&lt;br /&gt;&lt;br /&gt;예전 부터 생각하던 패키징 방식은 필요한 Perl관련 파일만을 추려서 디렉토리구조를 그대로 가져가고 간단한 .exe형태의 launcher를 만들어 그것을 실행하면 주변 환경변수라든지 모듈경로라든지 등등을 알아서 세팅한 다음 프로그램을 실행시키는 구조이다. &lt;a href="http://perl-node-interface.blogspot.com/2011/03/deploy-perl-application-on-windows.html"&gt;http://perl-node-interface.blogspot.com/2011/03/deploy-perl-application-on-windows.html&lt;/a&gt; 에서 설명하는 방식이 그런 방식인데 저기서도 꼭 필요한 파일만 어떻게 정확하게 추려낼 것인가에 대한 방법은 완벽하지 않다.&lt;br /&gt;&lt;br /&gt;그러면 꼭 필요한 파일을 어떻게 추려낼것인가? 를 고민하다 Windows에서 LINUX의 strace같은 프로그램이 있다면 특정 Perl스크립트를 실행시켰을때 파일을 접근하는 시스템콜을 모두 추적하면 정말 필요한 파일만 골라낼 수 있지 않을까는 생각에 Windows에서 strace같은 기능을 하는 프로그램들을 검색해보고 일일히 테스트해 보았는데 &lt;a href="http://www.howzatt.demon.co.uk/NtTrace/"&gt;http://www.howzatt.demon.co.uk/NtTrace/&lt;/a&gt; 라는 프로그램이 제일 원하는 대로 동작을 했다. 우선 패키징 작업전에 해당 싸이트에서 적절한 바이너리를 받는다.( 본인은 Windows 7 x64를 쓰기 때문에 64bit 버젼으로 받았다.)&lt;br /&gt;&lt;br /&gt;패키징을 테스트하기 위해서 GUI면서 적절한 의존 모듈을 포함한 Perl프로그램이 좋겠다 싶어 Win32::GUI와 OpenGL에 의존성을 가진 스크립트를 선정했다. 해당 소스는 &lt;a href="http://www.mail-archive.com/perl-win32-gui-users@lists.sourceforge.net/msg05673.html"&gt;http://www.mail-archive.com/perl-win32-gui-users@lists.sourceforge.net/msg05673.html&lt;/a&gt; 에 있다. 일단 패키징할 Perl스크립트를 win32_opengl.pl 파일이라고 하겠다.&lt;br /&gt;&lt;br /&gt;이제 win32_opengl.pl 파일이 실행될때 필요로 하는 Perl관련 파일들은 뽑아내보자. Nttrace 프로그램을 이용해서&lt;br /&gt;&lt;br /&gt;NtTrace -filter File perl win32_opengl.pl &amp;gt; out.txt&lt;br /&gt;&lt;br /&gt;처럼 명령을 내리면 perl win32_opengl.pl 파일이 실행되면서 접근하는 모든 파일관련 시스템콜들이 out.txt에 저장된다.&lt;br /&gt;프로그램이 떠서 잘 돌아갈때 까지 기다렸다가 접근할 파일이 이제 더 이상 없겠다싶으면 그냥 종료하면 된다. (만약에 동적으로 모듈을 로딩하거나 하는 기능이 있으면 그런 것도 추적되도록 모든 기능을 시험적으로 사용후 종료하길 추천)&lt;br /&gt;&lt;br /&gt;이제 out.txt 파일 안을 열어 보면 다음과 같이 온갖 다양한 시스템콜들이 기록되어 있다.&lt;br /&gt;&lt;br /&gt;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 ) =&amp;gt; 0&lt;br /&gt;NtQueryAttributesFile( ObjectAttributes="\??\C:\strawberry-perl-5.12.3.0-portable\perl\site\5.12.3\lib", Attributes=0x8e308 ) =&amp;gt; 0xc000003a [3 '지정된 경로를 찾을 수 없습니다.']&lt;br /&gt;NtQueryAttributesFile( ObjectAttributes="\??\C:\strawberry-perl-5.12.3.0-portable\perl\site\lib", Attributes=0x8e308 [DIRECTORY] ) =&amp;gt; 0&lt;br /&gt;NtQueryAttributesFile( ObjectAttributes="\??\C:\strawberry-perl-5.12.3.0-portable\perl\site\5.12.3\lib", Attributes=0x8e308 ) =&amp;gt; 0xc000003a [3 '지정된 경로를 찾을 수 없습니다.']&lt;br /&gt;NtQueryAttributesFile( ObjectAttributes="\??\C:\strawberry-perl-5.12.3.0-portable\perl\site\lib", Attributes=0x8e308 [DIRECTORY] ) =&amp;gt; 0&lt;br /&gt;&lt;br /&gt;이제 여기서 필요한 것들은 자기가 쓰고있는 Perl의 base경로를 포함한 파일들이다. 시스템콜 추적 로그파일인 out.txt 에서 필요한 파일을 현재 디렉토리 아래의 dist란 디렉토리를 만들어 뽑아내는 make_dist.pl Perl스크립트를 만들어 보면 다음과 같다.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:perl"&gt;#!/usr/bin/env perl&lt;br /&gt;use 5.010;&lt;br /&gt;use strict;&lt;br /&gt;use warnings;&lt;br /&gt;&lt;br /&gt;my $perl_path = qr/C:\\strawberry-perl-5.12.3.0-portable\\perl\\/;&lt;br /&gt;my %files;&lt;br /&gt;open my $fh , '&amp;lt;', 'out.txt' or die;&lt;br /&gt;while (my $line = &amp;lt;$fh&amp;gt;) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $files{$1}=1 if $line =~ m{($perl_path.*?)".*?=&amp;gt; 0$};&lt;br /&gt;}&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;foreach my $file (sort keys %files) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; next if -d $file;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my $dest = $file;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $dest =~ s/$perl_path//;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; say "$file -&amp;gt; $dest";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; system("echo f | xcopy /C $file .\\dist\\$dest");&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;위에서 $perl_path 변수를 자기 환경에 맞게 바꾸면 된다.&lt;br /&gt;&lt;br /&gt;perl make_dist.pl &lt;br /&gt;&lt;br /&gt;이라고 명령을 내리면 현재 디렉토리 아래 dist란 디렉토리가 생기면서 strawberry perl이면&lt;br /&gt;&lt;br /&gt;bin, lib , site, vendor 같은 디렉토리구조 안에 필요한 파일들만 추려져서 뽑혀져 있을 것이다.( Win32, OpenGL을 사용하는 간단한 GUI어플의 경우 4MB가 약간 넘는 양으로, PAR나 PerlApp들이 패키징하는 용량에 비하면 아주 필요한 파일만 슬림하게 뽑혀졌음을 알 수 있다.)&lt;br /&gt;이 까지 작업이 끝나면 메인 스크립트인 win32_opengl.pl 과 dist\bin 과 dist\site\bin 디렉토리의 안의 모든 파일은 dist 디렉토리로 옮기자. (빈 bin 디렉토리들은 지워도 상관없음)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이제 .exe 형태의 launcher를 만들 차례다. 하지만 .exe 형태의 launcher가 필요하지 않다면 그냥 dist디렉토리에 launch.bat 이란 적절한 batch파일로 다음과 같은 내용으로 만들고 실행하면 깔끔하게 실행된다.&lt;br /&gt;&lt;br /&gt;set PATH=.;%PATH%&lt;br /&gt;perl win32_opengl.pl&lt;br /&gt;&lt;br /&gt;그렇지만 .exe 형태로 아이콘모양도 넣고 제공해야 뭔가 일을 제대로 하는 것 같다면 약간 험난한 길을 더 걸어야 한다. 아래와 같은 명령을 내리면 perlxsi.c 라는 파일이 만들어진다. (이 작업은 dist디렉토리에서 하면 추려진 perl로 동작하므로 dist 디렉토리에서 하지 말것!)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;perl -MExtUtils::Embed -e xsinit&lt;br /&gt;&lt;br /&gt;만들어진 perlxsi.c 파일을 열어서 /* Appended code */ 아랫부분을 아래와 같이 추가하고 저장한다음&lt;br /&gt;( argv[1] = "win32_opengl.pl"; 라인이 자기의 메인 스크립트 이름을 지정하는 것)&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:c"&gt;#include &amp;lt;EXTERN.h&amp;gt;&lt;br /&gt;#include &amp;lt;perl.h&amp;gt;&lt;br /&gt;&lt;br /&gt;EXTERN_C void xs_init (pTHX);&lt;br /&gt;&lt;br /&gt;EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);&lt;br /&gt;EXTERN_C void boot_Win32CORE (pTHX_ CV* cv);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EXTERN_C void&lt;br /&gt;xs_init(pTHX)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char *file = __FILE__;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dXSUB_SYS;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* DynaLoader is a special case */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; newXS("Win32CORE::bootstrap", boot_Win32CORE, file);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* Appended code */&lt;br /&gt;static PerlInterpreter *my_perl; /*** The Perl interpreter ***/&lt;br /&gt;int main(int argc, char **argv, char **env)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; argv[1] = "win32_opengl.pl";&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PERL_SYS_INIT3(&amp;amp;argc,&amp;amp;argv,&amp;amp;env);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my_perl = perl_alloc();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; perl_construct(my_perl);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PL_exit_flags |= PERL_EXIT_DESTRUCT_END;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; perl_parse(my_perl, xs_init, argc, argv, (char **)NULL);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; perl_run(my_perl);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; perl_destruct(my_perl);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; perl_free(my_perl);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PERL_SYS_TERM();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;이제 이 c소스를 컴파일 해보자.(strawberry perl이면 gcc가 기본으로 포함되어 있고 Activestate Perl이면 ppm install MingGW 명령으로 gcc를 설치할 수 있다.)&lt;br /&gt;&lt;br /&gt;gcc -Wall -mwindows -o launch.exe perlxsi.c [이 뒤에는 아래 명령에 의해 나오는 출력결과(컴파일 옵션)들을 각각 긁어 붙인다.&lt;br /&gt;&lt;br /&gt;perl -MExtUtils::Embed -e ccopts&lt;br /&gt;perl -MExtUtils::Embed -e ldopts&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;본인의 경우 컴파일 명령은 다음과 같았다.(실행파일명은 -o 옵션뒤에 원하는 이름으로 하면 됨)&lt;br /&gt;&lt;br /&gt;gcc -Wall -mwindows -o launch.exe perlxsi.c -s -O2 -DWIN32 -DHAVE_DES_FCRYPT&amp;nbsp; -DUSE_SITECUSTOMIZE -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -fno-strict-aliasing -mms-bitfields -DPERL_MSVCRT_READFIX&amp;nbsp; -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"&amp;nbsp; 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&lt;br /&gt;&lt;br /&gt;컴파일 결과로 launch.exe 가 생성되면 해당 파일을 dist 디렉토리로 옮긴다. 이제 launch.exe를 실행해 보자.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;짠! 잘 실행된다.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-4xiAflSNlmk/TvgikBXAaCI/AAAAAAAAAJI/nJOU4EGrjOg/s1600/gui.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/-4xiAflSNlmk/TvgikBXAaCI/AAAAAAAAAJI/nJOU4EGrjOg/s400/gui.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;만약 launch.exe에 특정 icon을 넣고 싶으면 &lt;a href="http://perl-node-interface.blogspot.com/2011/03/deploy-perl-application-on-windows.html"&gt;http://perl-node-interface.blogspot.com/2011/03/deploy-perl-application-on-windows.html&lt;/a&gt; 의 설명대로 적절한 리소스 .rc파일을 만들어서 windres 명령으로 오브젝트 파일로 만든다음 컴파일시 추가하여 해도 되고 그것이 귀찮으면 원하는ico파일을 Win32::Exe 모듈을 깐다음 exe_update(&amp;nbsp; &lt;a href="https://metacpan.org/module/exe_update.pl"&gt;https://metacpan.org/module/exe_update.pl&lt;/a&gt; )을 써서 &lt;br /&gt;&lt;br /&gt;exe_update --icon=my.ico launch.exe&lt;br /&gt;&lt;br /&gt;명령을 통해 쉽게 추가할 수 있다.&lt;br /&gt;&lt;br /&gt;이제 모든게 끝났다. 이제 배포는 dist 디렉토리이름을 적절하게 바꾼다음 zip으로 묶어서 배포하고 사용자는 그냥 zip파일을 풀고 .exe파일만 실행시키면 그만이다.&lt;br /&gt;&lt;br /&gt;&amp;lt;작업이 끝난 디렉토리 내부 모양&amp;gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Uh4MDrsYyqA/TvgizSoX8XI/AAAAAAAAAJU/vOFbzfrNcLY/s1600/directory.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/-Uh4MDrsYyqA/TvgizSoX8XI/AAAAAAAAAJU/vOFbzfrNcLY/s400/directory.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;추가 참고사항: &lt;br /&gt;&lt;br /&gt;* dist디렉토리안의 perl.exe는 위에서 batch 파일을 통한 실행시는 필요하지만 별도로 만든 .exe 실행파일형태의 launcher를 통해 실행시키면 직접 perl dll을 로딩하여 사용하기 때문에 지워도 상관없다.&lt;br /&gt;* 위 절차로 만들어진 .exe파일은 기본적으로 명령 콘솔을 사용하지 않는다. 만약 콘솔을 보이게 하려면 위에서 말한 exe_update 명령으로&lt;br /&gt;&amp;nbsp; exe_update -c launch.exe 로 콘솔창이 보이게 exe_update -g launch.exe 로 콘솔창이 안보이게 바꿀 수 있다.&lt;br /&gt;* 다 쓰고 생각해보니 launch.exe는 메인스크립트 이름을 main.pl 정도로 통일하면 아이콘이랑 실행파일 이름은 임의로 바꿔서 계속 재사용 할 수 있을듯.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5137684887780288527-5808584475478697383?l=aero2blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aero2blog.blogspot.com/feeds/5808584475478697383/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://aero2blog.blogspot.com/2011/12/perl.html#comment-form' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/5808584475478697383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/5808584475478697383'/><link rel='alternate' type='text/html' href='http://aero2blog.blogspot.com/2011/12/perl.html' title='윈도우에서 Perl어플리케이션 배포'/><author><name>aero's blog</name><uri>http://www.blogger.com/profile/08594337308939199818</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-4xiAflSNlmk/TvgikBXAaCI/AAAAAAAAAJI/nJOU4EGrjOg/s72-c/gui.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5137684887780288527.post-9073095723291504053</id><published>2011-12-14T12:23:00.000+09:00</published><updated>2011-12-14T12:23:06.640+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Perl, Python, Ruby, PHP, C, C++, Lua, tcl, javascript, Java 성능비교</title><content type='html'>각종언어에 대한 벤치마크 비교&lt;br /&gt;&lt;br /&gt;포커스가 문자열을 얼마나 빠르고 메모리 효율적으로 처리하느냐에 맞춰져 있는데..&lt;br /&gt;&lt;br /&gt;이렇게 비교를 한 이유가 대부분의 현대적 어플리케이션의 주작업은 문자열을 다루는 것이며&lt;br /&gt;수치계산은 하드웨어 의존적인 면이 있고 컴파일된 native한 코드가 아닌경우 어떤 언어라도&lt;br /&gt;많은 계산을 하기에는 충분히 성능이 나지 않기 때문에 빠른 계산이 필요하다면 컴파일된&lt;br /&gt;native한 코드를 쓰던지 써드파티 수치계산 라이브러리를 각 언어에 붙여 쓰게 되는데&lt;br /&gt;그렇게 하면 언어간 비교가 아니라 수치계산라이브러리의 성능비교가 되기 때문에&lt;br /&gt;의미가 없다.... 뭐 이렇다고 함&lt;br /&gt;&lt;br /&gt;성능비교뿐만 아니라 끝부분에 각 언어에 대한 비평도 읽어볼만 함.. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://onlyjob.blogspot.com/2011/03/perl5-python-ruby-php-c-c-lua-tcl.html" target="_blank"&gt;http://onlyjob.blogspot.com/2011/03/perl5-python-ruby-php-c-c-lua-tcl.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;속도에서는 스크립트 언어인 Perl이 C/C++보다 더 빠르다는게 신기..&lt;br /&gt;Java는 의외로 실망스런수준이고(아마도 Buffered String을 쓰면 그나마 나아지리라 생각하지만....)&lt;br /&gt;&lt;br /&gt;* 제일 빠른 Perl속도를 1로 했을때 언어별 상대적 속도 비교표(숫자가 작을수록 빠름)&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="3" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;b&gt;Line size Kib&lt;/b&gt;&lt;/th&gt;&lt;th bgcolor="#ccffcc" style="color: #352e2c;"&gt;&lt;b&gt;Perl5&lt;/b&gt;&lt;/th&gt;&lt;th bgcolor="#ccffcc" style="color: #352e2c;"&gt;&lt;b&gt;PHP&lt;/b&gt;&lt;/th&gt;&lt;th bgcolor="#ccffcc" style="color: #352e2c;"&gt;&lt;b&gt;Ruby&lt;/b&gt;&lt;/th&gt;&lt;th bgcolor="#ccffcc" style="color: #352e2c;"&gt;&lt;b&gt;Python&lt;/b&gt;&lt;/th&gt;&lt;th bgcolor="#ccffcc" style="color: #352e2c;"&gt;&lt;b&gt;C++ (g++)&lt;/b&gt;&lt;/th&gt;&lt;th bgcolor="#ccffcc" style="color: #352e2c;"&gt;&lt;b&gt;C (gcc)&lt;/b&gt;&lt;/th&gt;&lt;th bgcolor="#ccffcc" style="color: #352e2c;"&gt;&lt;b&gt;Javascript (V8)&lt;/b&gt;&lt;/th&gt;&lt;th bgcolor="#ffff99" style="color: #352e2c;"&gt;&lt;b&gt;Javascript (sm)&lt;/b&gt;&lt;/th&gt;&lt;th bgcolor="#ffff99" style="color: #352e2c;"&gt;&lt;b&gt;Python3&lt;/b&gt;&lt;/th&gt;&lt;th bgcolor="#ffff99" style="color: #352e2c;"&gt;&lt;b&gt;tcl&lt;/b&gt;&lt;/th&gt;&lt;th bgcolor="#ffcc99" style="color: #352e2c;"&gt;&lt;b&gt;Lua&lt;/b&gt;&lt;/th&gt;&lt;th bgcolor="#ffcc99" style="color: #352e2c;"&gt;&lt;b&gt;Java (openJDK)&lt;/b&gt;&lt;/th&gt;&lt;th bgcolor="#ffcc99" style="color: #352e2c;"&gt;&lt;b&gt;Java (Sun)&lt;/b&gt;&lt;/th&gt;&lt;th bgcolor="#ff6600" style="color: #352e2c;"&gt;&lt;b&gt;Java (gcj)&lt;/b&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="left"&gt;&lt;b&gt;Average:&lt;/b&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;b&gt;3.84&lt;/b&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;b&gt;5.21&lt;/b&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;b&gt;5.59&lt;/b&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;b&gt;3.89&lt;/b&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;b&gt;1.23&lt;/b&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;b&gt;3.23&lt;/b&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;b&gt;19.66&lt;/b&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;b&gt;13.92&lt;/b&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;b&gt;21.35&lt;/b&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;b&gt;34.36&lt;/b&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;b&gt;31.16&lt;/b&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;b&gt;31.12&lt;/b&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;b&gt;247.32&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5137684887780288527-9073095723291504053?l=aero2blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aero2blog.blogspot.com/feeds/9073095723291504053/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://aero2blog.blogspot.com/2011/12/perl-python-ruby-php-c-c-lua-tcl.html#comment-form' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/9073095723291504053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/9073095723291504053'/><link rel='alternate' type='text/html' href='http://aero2blog.blogspot.com/2011/12/perl-python-ruby-php-c-c-lua-tcl.html' title='Perl, Python, Ruby, PHP, C, C++, Lua, tcl, javascript, Java 성능비교'/><author><name>aero's blog</name><uri>http://www.blogger.com/profile/08594337308939199818</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5137684887780288527.post-7594763679473491303</id><published>2011-12-01T21:54:00.004+09:00</published><updated>2011-12-20T17:19:05.579+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>바야흐로 Advent Calendar의 시즌</title><content type='html'>&lt;img src="http://advent.perl.kr/2011/title.gif" /&gt;&lt;br /&gt;&lt;br /&gt;2010년( &lt;a href="http://aero2blog.blogspot.com/2010/12/korean-perl-advent-calendar.html"&gt;http://aero2blog.blogspot.com/2010/12/korean-perl-advent-calendar.html&lt;/a&gt; )에 이어 올해도 어김없이 찾아온&lt;br /&gt;&lt;br /&gt;Seoul.pm Perl Advent Calendar 2011&lt;br /&gt;&lt;br /&gt;&lt;a href="http://advent.perl.kr/2011/"&gt;http://advent.perl.kr/2011/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;이웃 일본에는 &lt;a href="http://weblog.bulknews.net/post/13584639153/advent-calendars-big-in-japan"&gt;http://weblog.bulknews.net/post/13584639153/advent-calendars-big-in-japan&lt;/a&gt; 에서 처럼 Perl 커뮤니티에서 시작된 Advent Calendar가 유행처럼 번지고 있음...&lt;br /&gt;&lt;br /&gt;여타 Advent Calendar&lt;br /&gt;Perl - &lt;a href="http://perladvent.org/2011/"&gt;http://perladvent.org/2011/&lt;/a&gt;&lt;br /&gt;Perl Dancer - &lt;a href="http://advent.perldancer.org/"&gt;http://advent.perldancer.org/&lt;/a&gt;&lt;br /&gt;Perl Catalyst - &lt;a href="http://www.catalystframework.org/calendar"&gt;http://www.catalystframework.org/calendar&lt;/a&gt;&lt;br /&gt;Perl 6 - &lt;a href="http://perl6advent.wordpress.com/"&gt;http://perl6advent.wordpress.com/&lt;/a&gt;&lt;br /&gt;Japan Perl - &lt;a href="http://j2k.naver.com/j2k_frame.php/korean/perl-users.jp/articles/advent-calendar/2011/"&gt;http://j2k.naver.com/j2k_frame.php/korean/perl-users.jp/articles/advent-calendar/2011/&amp;nbsp;&lt;/a&gt;&lt;br /&gt;China Perl - &lt;a href="http://perlchina.github.com/advent.perlchina.org/"&gt;http://perlchina.github.com/advent.perlchina.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;이건 보너스&lt;br /&gt;System Admin - &lt;a href="http://sysadvent.blogspot.com/"&gt;http://sysadvent.blogspot.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5137684887780288527-7594763679473491303?l=aero2blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aero2blog.blogspot.com/feeds/7594763679473491303/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://aero2blog.blogspot.com/2011/12/advent-calendar.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/7594763679473491303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/7594763679473491303'/><link rel='alternate' type='text/html' href='http://aero2blog.blogspot.com/2011/12/advent-calendar.html' title='바야흐로 Advent Calendar의 시즌'/><author><name>aero's blog</name><uri>http://www.blogger.com/profile/08594337308939199818</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5137684887780288527.post-982837187480674481</id><published>2011-11-03T21:35:00.001+09:00</published><updated>2012-02-22T22:43:10.183+09:00</updated><title type='text'>Perl 5.10 부터 도입된 스마트매칭 ~~ 연산자와 given~when구문 문제</title><content type='html'>Perl 5.10 부터 도입된&lt;br /&gt;smart match 연산자 ~~ 는 너무 경우의 수가 많아 복잡하고&lt;br /&gt;경우에 따라 일관성을 가지고 동작하지 못하는 부분이 있어&lt;br /&gt;차후 deprecate 시키든지 다시 깔끔하게 정리하려고 하는 것 같습니다.&lt;br /&gt;따라서 그때까지는 쓰지 말기를 추천하더군요.&lt;br /&gt;&lt;br /&gt;참고:&lt;br /&gt;&amp;nbsp;&lt;a href="http://blogs.perl.org/users/brian_d_foy/2011/07/rethinking-smart-matching.html" target="_blank"&gt;http://blogs.perl.org/users/brian_d_foy/2011/07/rethinking-smart-matching.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;그리고 C의 switch 같은 기능의 given ~ when 구문은&lt;br /&gt;given과 같이 사용되는 lexical $_ 변수와 위의 내부적으로 &lt;br /&gt;given ~ when 구문의 비교에 있어 기본으로 사용되는 smart match연산자&lt;br /&gt;와 얽힌 부분에 문제가 있어 역시 향후 기능과 동작이 다시 완벽해지기&lt;br /&gt;전까지는 역시 사용하지 말 것을 추천하고 있습니다.&lt;br /&gt;&lt;br /&gt;참고:&lt;br /&gt;&lt;a href="http://www.effectiveperlprogramming.com/blog/1333" target="_blank"&gt;http://www.effectiveperlprogramming.com/blog/1333&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2011-05/thrd9.html#00768" target="_blank"&gt;http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2011-05/thrd9.html#00768&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.perl.org/users/leon_timmermans/2011/10/why-do-you-want-new-major-features-in-core.html" target="_blank"&gt;http://blogs.perl.org/users/leon_timmermans/2011/10/why-do-you-want-new-major-features-in-core.html&lt;/a&gt;&lt;br /&gt;에 보면&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Smartmatching? I think everyone agrees it is broken.&lt;/li&gt;&lt;li&gt;&lt;code class="prettyprint"&gt;given&lt;/code&gt;/&lt;code class="prettyprint"&gt;when&lt;/code&gt; is even worse as it's almost impossible to predict if it will use smartmatching or not.&lt;/li&gt;&lt;li&gt;Lexical &lt;code class="prettyprint"&gt;$_&lt;/code&gt;? Mostly a new source of bugs, and the &lt;code class="prettyprint"&gt;_&lt;/code&gt; prototype is merely a hack to work around lexical &lt;code class="prettyprint"&gt;$_&lt;/code&gt; issues.&lt;/li&gt;&lt;/ul&gt;라고 말하고 있음.&lt;br /&gt;&lt;br /&gt;Learning Perl 5판 과&amp;nbsp; 한글 번역판인 "거침없이 배우는 펄" 에서 smart match와 given~when 구문에&lt;br /&gt;비교적 많은 분량을 할애하여 설명하고 있는데 그 부분은 그냥 무시하시면 될듯합니다.&lt;br /&gt;(얼마전 나온 Learning Perl 6판에는 이런 부분을 언급하고 사용에 주의하라고 하는 내용이 들어간듯)&lt;br /&gt;&lt;br /&gt;추가:&lt;br /&gt;&amp;nbsp;( Programming Perl 4판에서는 given ~ when은 아직 시험적 상태로 보지만 스마트매칭이 적용되지 않는 명시적인 숫자,문자열 매칭 조건은 향후 어떻게 변하든 문제 없으니 안심하고 사용해도 괜찮다고 함)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5137684887780288527-982837187480674481?l=aero2blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aero2blog.blogspot.com/feeds/982837187480674481/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://aero2blog.blogspot.com/2011/11/perl-510-givenwhen.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/982837187480674481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/982837187480674481'/><link rel='alternate' type='text/html' href='http://aero2blog.blogspot.com/2011/11/perl-510-givenwhen.html' title='Perl 5.10 부터 도입된 스마트매칭 ~~ 연산자와 given~when구문 문제'/><author><name>aero's blog</name><uri>http://www.blogger.com/profile/08594337308939199818</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5137684887780288527.post-1934728231611544269</id><published>2011-10-22T21:42:00.000+09:00</published><updated>2011-10-22T21:42:18.545+09:00</updated><title type='text'>기록의 의미로 다시 정리해보는 CodeGolf 용 Perl one-liner</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/Code_golf"&gt;Code Golf&lt;/a&gt;는 어떤 주어진 문제를 코드의 우아함, 가독성 등등따위는 제껴두고 수단과 방법을 가리지 않고 되도록이면 짧게 프로그래밍 할수록 높은 점수를 얻는 게임이다.&lt;br /&gt;&lt;br /&gt;예전에 풀어본 문제를 기록을 남기는 의미에서 다시 정리해봄&lt;br /&gt;&lt;br /&gt;문제) &lt;br /&gt;&lt;a href="http://kldp.org/node/112089"&gt;http://kldp.org/node/112089&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;예를 들어, A.csv는&lt;br /&gt;&lt;br /&gt;&lt;div class="geshifilter"&gt;&lt;pre class="text geshifilter-text" style="font-family: monospace;"&gt;1   2   3&lt;br /&gt;4   5   6&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;B.csv는&lt;br /&gt;&lt;div class="geshifilter"&gt;&lt;pre class="text geshifilter-text" style="font-family: monospace;"&gt;2   3   4&lt;br /&gt;5   6   7&lt;/pre&gt;&lt;pre class="text geshifilter-text" style="font-family: monospace;"&gt;라면 같은 위치의 요소끼리 사칙연산 하려면?&lt;/pre&gt;&lt;pre class="text geshifilter-text" style="font-family: monospace;"&gt;&lt;/pre&gt;&lt;pre class="text geshifilter-text" style="font-family: monospace;"&gt;답)&lt;/pre&gt;&lt;pre class="text geshifilter-text" style="font-family: monospace;"&gt;같은요소끼리 더하기&lt;/pre&gt;&lt;pre class="text geshifilter-text" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ paste A.csv B.csv | &lt;b&gt;perl -alpe '$_="@{[map$F[$_]+$F[$_+@F/2],0..$#F/2]}"'&lt;/b&gt;&lt;/pre&gt;&lt;pre class="text geshifilter-text" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;3 5 7&lt;br /&gt;9 11 13&lt;/pre&gt;&lt;pre class="text geshifilter-text" style="font-family: monospace;"&gt;&lt;/pre&gt;&lt;pre class="text geshifilter-text" style="font-family: monospace;"&gt;&lt;/pre&gt;&lt;pre class="text geshifilter-text" style="font-family: monospace;"&gt;문제)&lt;/pre&gt;&lt;pre class="text geshifilter-text" style="font-family: monospace;"&gt;&lt;/pre&gt;&lt;pre class="text geshifilter-text" style="font-family: monospace;"&gt;&lt;a href="http://codegolf.stackexchange.com/questions/3095/paint-that-fence"&gt;http://codegolf.stackexchange.com/questions/3095/paint-that-fence&lt;/a&gt;&lt;/pre&gt;&lt;pre class="text geshifilter-text" style="font-family: monospace;"&gt;Paint the fence.&lt;/pre&gt;&lt;pre class="text geshifilter-text" style="font-family: monospace;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="text geshifilter-text" style="font-family: monospace;"&gt;각 라인은 S L C 의 형태로 되어있다. S는 시작위치 L을 길이 C는 색깔을 뜻한다.&lt;br /&gt;(시작위치는 0부터시작)&lt;br /&gt;다음과 같은 라인에 대해서 규칙을 적용해서 펜스를 칠해나가면 펜스의 색은&lt;br /&gt;오른쪽과 같을 것 이다.&lt;br /&gt;&lt;br /&gt;0 3 1                      111...........&lt;br /&gt;2 4 2                      112222........&lt;br /&gt;1 2 3                      133222........&lt;br /&gt;0 4 1                      111122........&lt;br /&gt;7 3 5                      111122.555....&lt;br /&gt;&lt;br /&gt;다 칠하고 난 다음 어떤색의 펜스가 얼만큼 있는지 다음과 같이&lt;br /&gt;&lt;br /&gt;1 4&lt;br /&gt;2 2&lt;br /&gt;5 3&lt;br /&gt;&lt;br /&gt;출력하는 코드를 작성하라.&lt;/pre&gt;&lt;pre class="text geshifilter-text" style="font-family: monospace;"&gt;&lt;/pre&gt;&lt;pre class="text geshifilter-text" style="font-family: monospace;"&gt;&lt;/pre&gt;&lt;pre class="text geshifilter-text" style="font-family: monospace;"&gt;&lt;/pre&gt;&lt;pre class="text geshifilter-text" style="font-family: monospace;"&gt;&lt;/pre&gt;&lt;pre class="text geshifilter-text" style="font-family: monospace;"&gt;답)&lt;/pre&gt;&lt;pre class="text geshifilter-text" style="font-family: monospace;"&gt;&lt;code style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ cat input.txt&lt;br /&gt;0 3 1&lt;br /&gt;2 4 2&lt;br /&gt;1 2 3&lt;br /&gt;0 4 1&lt;br /&gt;7 3 5&lt;br /&gt;&lt;br /&gt;$ cat input.txt  | &lt;b&gt;perl -anE '@a[$F[0]..$F[0]+$F[1]]=($F[2])x$F[1];END{$i[$_]++for@a;$i[$_]&amp;amp;&amp;amp;say"$_ $i[$_]"for 1..$#i}'&lt;/b&gt;&lt;br /&gt;1 4&lt;br /&gt;2 1&lt;br /&gt;5 3&lt;/code&gt;&lt;/pre&gt;&lt;pre class="text geshifilter-text" style="font-family: monospace;"&gt;&lt;code style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class="text geshifilter-text" style="font-family: monospace;"&gt;&lt;code style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class="text geshifilter-text" style="font-family: monospace;"&gt;&lt;code style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;아마 Perl 아니면 이보다 짧게 만들 수 있는 언어는 없을듯...&lt;/code&gt;&lt;/pre&gt;&lt;pre class="text geshifilter-text" style="font-family: monospace;"&gt;&lt;code style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;(요즘 보니 &lt;a href="http://www.jsoftware.com/"&gt;J&lt;/a&gt;란 언어가 다크호스 같긴 하지만서도..)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5137684887780288527-1934728231611544269?l=aero2blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aero2blog.blogspot.com/feeds/1934728231611544269/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://aero2blog.blogspot.com/2011/10/codegolf-perl-one-liner.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/1934728231611544269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/1934728231611544269'/><link rel='alternate' type='text/html' href='http://aero2blog.blogspot.com/2011/10/codegolf-perl-one-liner.html' title='기록의 의미로 다시 정리해보는 CodeGolf 용 Perl one-liner'/><author><name>aero's blog</name><uri>http://www.blogger.com/profile/08594337308939199818</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5137684887780288527.post-1640335924945909375</id><published>2011-07-30T13:36:00.002+09:00</published><updated>2011-07-30T13:45:25.153+09:00</updated><title type='text'>배트맨 공식  그래프 그리기</title><content type='html'>요즘 SNS에서 다음과 같은 배트맨 공식이라는게 회자되고 있어서&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.tumblr.com/photo/1280/8199285804/1/tumblr_lp2r56qYxv1qzfeby" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://www.tumblr.com/photo/1280/8199285804/1/tumblr_lp2r56qYxv1qzfeby" width="387" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;저 공식이 진짜 맞는건지 검증해보는 차원에서 Gnuplot으로 한 번 그려봄&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://plotshare.com/sessions/538486810/Plot1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="http://plotshare.com/sessions/538486810/Plot1.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Gnuplot의 한계로 외곽선만으로만 뽑아내는건 힘들었음(더 찾아보면 가능할 수 도)&lt;br /&gt;&lt;br /&gt;플로팅 소스는 &lt;a href="http://plotshare.com/index.ws/plot/538486810"&gt;http://plotshare.com/index.ws/plot/538486810&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5137684887780288527-1640335924945909375?l=aero2blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aero2blog.blogspot.com/feeds/1640335924945909375/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://aero2blog.blogspot.com/2011/07/blog-post.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/1640335924945909375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/1640335924945909375'/><link rel='alternate' type='text/html' href='http://aero2blog.blogspot.com/2011/07/blog-post.html' title='배트맨 공식  그래프 그리기'/><author><name>aero's blog</name><uri>http://www.blogger.com/profile/08594337308939199818</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5137684887780288527.post-7761994269259171669</id><published>2011-07-29T11:28:00.004+09:00</published><updated>2011-07-29T11:37:42.802+09:00</updated><title type='text'>서울 100년만의? 폭우기념 Visualization(가시화)그래프</title><content type='html'>서울에 100년만의 큰비로 난리났다는 뉴스에 100년만이 맞는 말이냐 아니면 구라냐 말이 많다.&lt;br /&gt;어떤 분은 기상청 싸이트에서 과거 서울 강우량 기록을 긁는 스크립트까지 만드셔서&lt;br /&gt;자료를 긁어 놓으셨길래 숫자만의 나열로는 느낌이 와닿지 않아 약간의 데이터 가공을&lt;br /&gt;거쳐 Gnuplot을 써서 heatmap형태의 그래프로 그려보았다.&lt;br /&gt;&lt;br /&gt;서울강우량 스크랩프로그램 및 데이터: &lt;a href="https://github.com/yy/koweather"&gt;https://github.com/yy/koweather&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.gnuplot.info/"&gt;Gnuplot &lt;/a&gt;그래프를 온라인상에서 공유하게 해주는 &lt;a href="http://plotshare.com/"&gt;Plotshare&lt;/a&gt;에 올린 그래프&lt;br /&gt;&lt;br /&gt;&lt;a href="http://plotshare.com/index.ws/plot/116537618"&gt;http://plotshare.com/index.ws/plot/116537618&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;아래는 위 싸이트에서는 이미지 싸이즈를 지정해도 일정한 크기로만 생성해서 좀 더&lt;br /&gt;보기 쉽게 크게 그린 그래프 이미지.(클릭하면 크게 보임)&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-eM7Ba36-dys/TjIaR0_szgI/AAAAAAAAAHY/pn5tx1q30oQ/s1600/out.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="152" src="http://2.bp.blogspot.com/-eM7Ba36-dys/TjIaR0_szgI/AAAAAAAAAHY/pn5tx1q30oQ/s640/out.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;그래프에서 y축은 년도 x축은 1년 365일중에 몇번째 날인지, 그리고 검은색~노란색점은 강우량(mm)정도를 나타낸다. 나머지 해석은 알아서&amp;nbsp;각자...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5137684887780288527-7761994269259171669?l=aero2blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aero2blog.blogspot.com/feeds/7761994269259171669/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://aero2blog.blogspot.com/2011/07/100-visualization.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/7761994269259171669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/7761994269259171669'/><link rel='alternate' type='text/html' href='http://aero2blog.blogspot.com/2011/07/100-visualization.html' title='서울 100년만의? 폭우기념 Visualization(가시화)그래프'/><author><name>aero's blog</name><uri>http://www.blogger.com/profile/08594337308939199818</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-eM7Ba36-dys/TjIaR0_szgI/AAAAAAAAAHY/pn5tx1q30oQ/s72-c/out.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5137684887780288527.post-1459399371993489230</id><published>2011-07-25T16:45:00.001+09:00</published><updated>2011-07-25T16:46:15.932+09:00</updated><title type='text'>MacOS X 풀어쓰기 한글 -&gt; 모아쓰기 한글 변환 스크립트</title><content type='html'>개인적으로 맥을 별로 좋아하지 않는다.&lt;br /&gt;&lt;br /&gt;그 이유중 몇개를 들자면 Unix like한 OS라고 하면서 파일시스템에서 대소문자를 구분하지 않는다는 것이고.. ( 예를들면 Perl에서 AnyEvent란 모듈을 사용하겠다고 use AnyEvent;가 아니라 use ANYEVENT; 라고 해도 에러가 없이 실행된다. 만약 이런걸 맥에서 개발해서 Linux서비스 서버에 올렸다고 생각해보라.. 어떤일이 벌어질지는 안봐도 비디오다. )&lt;br /&gt;&lt;br /&gt;그리고&amp;nbsp; 맥에서는 한글이 일명 풀어쓰기 포멧(NFD)으로 저장된다. 여기에 대해서는 &lt;a href="http://namoda.springnote.com/pages/4922363"&gt;http://namoda.springnote.com/pages/4922363&lt;/a&gt; 를 보면 자세하게 나와있다.&lt;br /&gt;&lt;br /&gt;하지만 주변에는 많은 맥빠들이 존재하고 그들과 자료를 주고 받으려고 하면 문제들이 한둘씩 발생하게 된다는 것이다. 맥에서 한글파일명으로 저장한 파일들을 리눅스에서 받으면 경우에 따라 사용 터미널이 NFD에 대한 자모 조합을 지원해서 제대로 보이거나 보이기는 하나 이상하게 조합되서 보이거나 아예 쭉 풀어져 버리는등 결과를 종잡을 수 없다. 그래서 NFD형식으로 된 한글 파일명을 NFC형식으로 바꾸는 Perl 스크립트를 만들어 봤다.&lt;br /&gt;&lt;br /&gt;아는 사람끼리 위 같은 맥의 특성을 풍자하여 "맥부기"라고 부르는데 착안하여 이름은 demacboogi.pl (de맥부기)로 하였다.&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1103723.js?file=demacboogi.pl"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;위에서 쓰인 모듈들은 Perl에서 기본적으로 포함되는 core모듈이라 별도로 모듈을 설치할 필요는 없음&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5137684887780288527-1459399371993489230?l=aero2blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aero2blog.blogspot.com/feeds/1459399371993489230/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://aero2blog.blogspot.com/2011/07/macos-x.html#comment-form' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/1459399371993489230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/1459399371993489230'/><link rel='alternate' type='text/html' href='http://aero2blog.blogspot.com/2011/07/macos-x.html' title='MacOS X 풀어쓰기 한글 -&gt; 모아쓰기 한글 변환 스크립트'/><author><name>aero's blog</name><uri>http://www.blogger.com/profile/08594337308939199818</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5137684887780288527.post-547578850473717901</id><published>2011-05-16T10:31:00.001+09:00</published><updated>2011-05-17T22:01:17.829+09:00</updated><title type='text'>Perl 5.14 출시</title><content type='html'>2011년 5월 14일 Perl 5.14가 출시되었다.&lt;br /&gt;5.14 버젼이기 때문에 5월 14일에 맞춰 출시했다는 소문이~&lt;br /&gt;&lt;br /&gt;Perl 5.14 는 Unicode 6.0, IPv6 지원, 더 낮은 CPU,Memory사용, "package Name { ... }" 문법, non-destructive 정규식 지원등 많은 기능이 추가되었다.&lt;br /&gt;&lt;br /&gt;공식릴리즈 포스팅:&lt;br /&gt;&lt;a href="http://news.perlfoundation.org/2011/05/perl-514.html"&gt;http://news.perlfoundation.org/2011/05/perl-514.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;바뀐점 정리:&lt;br /&gt;&lt;a href="http://search.cpan.org/%7Ejesse/perl-5.14.0/pod/perldelta.pod"&gt;http://search.cpan.org/~jesse/perl-5.14.0/pod/perldelta.pod&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;여러 뉴스싸이트의 반응:&lt;br /&gt;&lt;a href="http://slashdot.org/story/11/05/14/2253215/Perl-514-Released"&gt;http://slashdot.org/story/11/05/14/2253215/Perl-514-Released&lt;/a&gt;&lt;br /&gt;&lt;a href="https://lwn.net/Articles/442938/"&gt;https://lwn.net/Articles/442938/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://news.ycombinator.com/item?id=2549077"&gt;http://news.ycombinator.com/item?id=2549077&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.reddit.com/r/programming/comments/hbg40/perl_514_is_out/"&gt;http://www.reddit.com/r/programming/comments/hbg40/perl_514_is_out/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5137684887780288527-547578850473717901?l=aero2blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aero2blog.blogspot.com/feeds/547578850473717901/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://aero2blog.blogspot.com/2011/05/perl-514.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/547578850473717901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/547578850473717901'/><link rel='alternate' type='text/html' href='http://aero2blog.blogspot.com/2011/05/perl-514.html' title='Perl 5.14 출시'/><author><name>aero's blog</name><uri>http://www.blogger.com/profile/08594337308939199818</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5137684887780288527.post-7937515759135680345</id><published>2011-04-05T11:13:00.001+09:00</published><updated>2011-11-04T13:45:25.941+09:00</updated><title type='text'>Any::Moose, Mouse, Moose</title><content type='html'>Perl 5에는 &lt;a href="http://www.iinteractive.com/moose"&gt;Moose&lt;/a&gt;라는 Python, Ruby도 울고갈 OOP프레임웍이 있다.&lt;br /&gt;&lt;br /&gt;Moose는 많은 기능이 있는 반면 상대적으로 메모리를 많이 소비하고 속도가 약간 떨어지는 경향이 있다. 그래서 Moose의 모든 기능이 필요없을 경우 &lt;a href="http://search.cpan.org/dist/Mouse/"&gt;Mouse&lt;/a&gt;라는 Moose의 subset을 사용한다. 하지만 미래에 Moose의 기능을 확장 적용해야 할 경우를 고려하여 &lt;a href="http://search.cpan.org/dist/Any-Moose/"&gt;Any::Moose&lt;/a&gt;라는 모듈을 사용하면 사용자가 신경쓸 필요없이 알아서 최대한 빠른 것으로 적용해주므로 편리하다.&lt;br /&gt;&lt;br /&gt;Moose와 Mouse(Any::Moose가 자동으로 최적화 했을때) 의 속도를 비교해 보았다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Object Creation&lt;/b&gt;&lt;br /&gt;322580.65/s&amp;nbsp; Any::Moose = Mouse&lt;br /&gt;322580.65/s&amp;nbsp; Any::Moose Immutable = Mouse Immutable&lt;br /&gt;&amp;nbsp;11655.01/s&amp;nbsp; Moose&lt;br /&gt;212765.96/s&amp;nbsp; Moose Immutable&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Accessor&lt;/b&gt;&lt;br /&gt;6250000.00/s Any::Moose = Mouse&lt;br /&gt;6250000.00/s Any::Moose Immutable = Mouse Immutable&lt;br /&gt;2127659.57/s Moose&lt;br /&gt;2127659.57/s Moose immutable&lt;br /&gt;&lt;br /&gt;&lt;u&gt;결론&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;__PACKAGE__-&amp;gt;meta-&amp;gt;make_immutable;&lt;br /&gt;은 접근자의 속도에는 영향을 미치지 않으며&lt;br /&gt;Moose의 객체생성속도에만 영향을 미친다.&lt;br /&gt;Any::Moose를 쓰더라도 미래에 Moose 확장을 고려하여&lt;br /&gt;기본 클래스 정의는&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://search.cpan.org/perldoc?Moose::Manual::BestPractices"&gt;http://search.cpan.org/perldoc?Moose::Manual::BestPractices&lt;/a&gt; 의&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:perl"&gt;package Person;&lt;br /&gt;&lt;br /&gt;use Moose;&amp;nbsp; # 또는 use Any::Moose;&lt;br /&gt;use namespace::autoclean;&lt;br /&gt;&lt;br /&gt;# extends, roles, attributes, etc.&lt;br /&gt;&lt;br /&gt;# methods&lt;br /&gt;&lt;br /&gt;__PACKAGE__-&amp;gt;meta-&amp;gt;make_immutable;&lt;br /&gt;&lt;br /&gt;1;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;을 따르도록 하자.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5137684887780288527-7937515759135680345?l=aero2blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aero2blog.blogspot.com/feeds/7937515759135680345/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://aero2blog.blogspot.com/2011/04/anymoose-mouse-moose.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/7937515759135680345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/7937515759135680345'/><link rel='alternate' type='text/html' href='http://aero2blog.blogspot.com/2011/04/anymoose-mouse-moose.html' title='Any::Moose, Mouse, Moose'/><author><name>aero's blog</name><uri>http://www.blogger.com/profile/08594337308939199818</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5137684887780288527.post-6197032336820589678</id><published>2011-03-03T22:39:00.000+09:00</published><updated>2011-03-03T22:39:27.331+09:00</updated><title type='text'>대규모 서비스를 지탱하는 기술</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://cfile22.uf.tistory.com/image/116B7A354D6BAA8A18F6EC" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://cfile22.uf.tistory.com/image/116B7A354D6BAA8A18F6EC" width="287" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;오늘 구입한 책..&lt;br /&gt;&lt;br /&gt;자세한 정보는 &lt;a href="http://jpub.tistory.com/122"&gt;http://jpub.tistory.com/122&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;이 책은 일본의 구글이라고 불리우는 &lt;a href="http://www.hatena.ne.jp/"&gt;Hatena&lt;/a&gt;의 엔지니어가 저술한 책의 번역판이다.&lt;br /&gt;Hatena의 CTO이자 주 저자인 나오야 이토씨는 현재 Hatena를 떠나 &lt;a href="http://gree.jp/"&gt;GREE&lt;/a&gt;라는 회사로 이직했다. (GREE는 &lt;a href="http://www.dena.jp/en/"&gt;DeNA&lt;/a&gt;라는 회사와 함께 일본의 모바일 서비스 시장의 잘나가는 쌍두마차중 하나임)&lt;br /&gt;&lt;br /&gt;이 책은 현대적인 대용량 서비스 인프라에 대한 개발/이론/관리 및 운영등에 관한 폭넓은 정보를 다루고 있어 IT인프라 교양서라고 불릴만하다.&lt;br /&gt;&lt;br /&gt;일본은 이 책이 나온 Hatena와 함께 &lt;a href="http://mixi.jp/"&gt;Mixi&lt;/a&gt;, DeNA, &lt;a href="http://www.livedoor.com/"&gt;livedoor&lt;/a&gt;등의 주요 인터넷 서비스회사들이 Perl기반으로 구축된 경우가 많기 때문에 책에 나오는 예제 코드는 거의가 다 Perl이며 과거 CGI시절 PHP처럼 써 갈기던 조잡한 Perl코드가 아니라 숙련되고 잘 훈련된 프로그래머가 작성한 이른바 Modern Perl코드이기 때문에 현대적 방식의 Perl공부에도 도움이 된다.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5137684887780288527-6197032336820589678?l=aero2blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aero2blog.blogspot.com/feeds/6197032336820589678/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://aero2blog.blogspot.com/2011/03/blog-post.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/6197032336820589678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/6197032336820589678'/><link rel='alternate' type='text/html' href='http://aero2blog.blogspot.com/2011/03/blog-post.html' title='대규모 서비스를 지탱하는 기술'/><author><name>aero's blog</name><uri>http://www.blogger.com/profile/08594337308939199818</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5137684887780288527.post-3585606524370547191</id><published>2010-12-21T23:51:00.001+09:00</published><updated>2010-12-22T00:02:28.031+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>신간 "거침없이 배우는 펄"</title><content type='html'>책이 나온지 한 일주일 됐지만 뒤늦게나마 소개합니다.&lt;br /&gt;&lt;br /&gt;&lt;img border="0" height="320" src="http://image.yes24.com/goods/4433208/L" width="252" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.yes24.com/24/goods/4433208"&gt;http://www.yes24.com/24/goods/4433208&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;이 책은 &lt;a href="http://oreilly.com/catalog/9780596520113"&gt;Learning Perl 5판&lt;/a&gt; 의 번역서이며 &lt;a href="http://twitter.com/#%21/keedi"&gt;@keedi&lt;/a&gt;, &lt;a href="http://twitter.com/#%21/kiseok7"&gt;@kiseok7&lt;/a&gt;, &lt;a href="http://twitter.com/#%21/saillinux"&gt;@saillinux&lt;/a&gt; 님에 의해 번역되었습니다.&lt;br /&gt;&lt;br /&gt;개인적으로 이책에 대한 비평을 &lt;a href="https://github.com/aero/perl_docs/wiki/Learning-perl-5th-review"&gt;https://github.com/aero/perl_docs/wiki/Learning-perl-5th-review&lt;/a&gt; 에 올리고 있으니 같이 보시면 도움이 되실겁니다.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5137684887780288527-3585606524370547191?l=aero2blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aero2blog.blogspot.com/feeds/3585606524370547191/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://aero2blog.blogspot.com/2010/12/blog-post.html#comment-form' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/3585606524370547191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/3585606524370547191'/><link rel='alternate' type='text/html' href='http://aero2blog.blogspot.com/2010/12/blog-post.html' title='신간 &quot;거침없이 배우는 펄&quot;'/><author><name>aero's blog</name><uri>http://www.blogger.com/profile/08594337308939199818</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5137684887780288527.post-3657058762852835981</id><published>2010-12-02T00:40:00.001+09:00</published><updated>2010-12-03T00:01:06.436+09:00</updated><title type='text'>Korean Perl Advent Calendar</title><content type='html'>&lt;img src="http://advent.perl.kr/title.gif" /&gt;&lt;br /&gt;&lt;br /&gt;드디어 한국에도 &lt;a href="http://advent.perl.kr/"&gt;Korean Perl Advent Calendar&lt;/a&gt;가 시작되었다.&lt;br /&gt;참고: &lt;a href="http://aero.sarang.net/blog/2009/12/perl-advent-calendar.html"&gt;Advent Calendar 란?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;다른 Perl관련 Advent Calendar들을 정리하자면&lt;br /&gt;&lt;br /&gt;&lt;a href="http://perladvent.pm.org/2010/"&gt;Perl Advent Calendar&lt;/a&gt;&lt;br /&gt;&lt;a href="http://perl6advent.wordpress.com/"&gt;Perl 6 Advent Calendar&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.catalystframework.org/calendar/2010"&gt;Catalyst Advent Calendar&lt;/a&gt;&lt;br /&gt;&lt;a href="http://advent.rjbs.manxome.org/2010/"&gt;RJBS Advent Calendar&lt;/a&gt;&lt;br /&gt;&lt;a href="http://advent.perldancer.org/2010"&gt;Dancer Advent Calendar&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.perl-uwe.com/2010_12_01_archive.html"&gt;Perl-uwe Advent Calendar&lt;/a&gt;&lt;br /&gt;&lt;a href="http://j2k.naver.com/j2k_frame.php/korean/perl-users.jp/articles/advent-calendar/2010/"&gt;Japan Perl Advent Calendar(일한번역)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://fayland.github.com/advent.perlchina.org/"&gt;China Perl Advent Calendar &lt;/a&gt;&lt;br /&gt;&lt;a href="http://sysadvent.blogspot.com/"&gt;Sysadmin Advent Calendar(보너스)&lt;/a&gt;&lt;br /&gt;가 있다.&lt;br /&gt;&lt;br /&gt;하루하루 새로운 글을 읽는 재미가 솔솔~&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5137684887780288527-3657058762852835981?l=aero2blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aero2blog.blogspot.com/feeds/3657058762852835981/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://aero2blog.blogspot.com/2010/12/korean-perl-advent-calendar.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/3657058762852835981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/3657058762852835981'/><link rel='alternate' type='text/html' href='http://aero2blog.blogspot.com/2010/12/korean-perl-advent-calendar.html' title='Korean Perl Advent Calendar'/><author><name>aero's blog</name><uri>http://www.blogger.com/profile/08594337308939199818</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5137684887780288527.post-7973669262761016077</id><published>2010-11-13T17:39:00.004+09:00</published><updated>2010-11-14T13:37:50.153+09:00</updated><title type='text'>Modern Perl 책 무료로 공개</title><content type='html'>&lt;img src="http://www.onyxneon.com/books/modern_perl/mp_cover_full.png" /&gt;&lt;br /&gt;&lt;br /&gt;Perl커뮤니티에서 &lt;a href="http://search.cpan.org/%7Echromatic/"&gt;chromatic&lt;/a&gt;이란 닉네임으로 활동하고 있는 분이 얼마 전 Modern Perl이란 책을 내놓았다.&lt;br /&gt;&lt;br /&gt;Modern Perl이라 함은 여러버젼을 거쳐서 발전해온 Perl 5의 기능과 장점을 살려 어떻게 현대적 스타일로 Perl 프로그램을 작성할 것인가를 다룬다.&lt;br /&gt;&lt;br /&gt;PHP가 웹프로그래밍언어로 인기를 끌기 전 한때 유행했던 Perl CGI시절 Perl에 대한 기억을 가지고 있는 사람들은 이 책을 본다면 새로운 Perl의 모습을 볼 수 있을 것이다. ( 본인도 예전에 Perl CGI가 유행하던 시절 한가닥했던 국내에서 개발된 Perl CGI기반 게시판 소스들을 받아서 본 적이 있는데 현대적 Perl프로그래밍 스타일에 비하면 거의 스파게티 혹은 쓰레기 코드 수준이어서 실망했던 기억이 있는데 그 시절 Perl은 Perl 5가 아닌 Perl 4혹은 Perl 3스타일 이었다고 할 수 있다.)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;참고:&lt;br /&gt;&lt;a href="http://www.onyxneon.com/books/modern_perl/index.html"&gt;Modern Perl 무료책&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.modernperlbooks.com/mt/"&gt;Modern Perl Blog&amp;nbsp;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;그리고 추가하여 더이상 구시대의 Perl을 사용한다는 말을 듣지 않으려면 &lt;a href="http://perl-begin.org//tutorials/bad-elements/"&gt;http://perl-begin.org//tutorials/bad-elements/&lt;/a&gt;&amp;nbsp; 도 함께 보시길 추천한다.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5137684887780288527-7973669262761016077?l=aero2blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aero2blog.blogspot.com/feeds/7973669262761016077/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://aero2blog.blogspot.com/2010/11/modern-perl.html#comment-form' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/7973669262761016077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/7973669262761016077'/><link rel='alternate' type='text/html' href='http://aero2blog.blogspot.com/2010/11/modern-perl.html' title='Modern Perl 책 무료로 공개'/><author><name>aero's blog</name><uri>http://www.blogger.com/profile/08594337308939199818</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5137684887780288527.post-8487220614607304139</id><published>2010-11-10T16:22:00.000+09:00</published><updated>2010-11-10T16:22:48.555+09:00</updated><title type='text'>흥미로운 프로젝트 OpenTSDB</title><content type='html'>오늘날 IT시스템들은 사용자와 시스템이 생산해내는 각종 컨텐츠와 데이터들의 홍수를 맞고 있다.&lt;br /&gt;&lt;br /&gt;그래서 &lt;a href="http://hadoop.apache.org/"&gt;Hadoop&lt;/a&gt;처럼 &lt;a href="http://en.wikipedia.org/wiki/NoSQL"&gt;NoSQL&lt;/a&gt;이니 하면서 Map,Reduce기술을 사용하여 대용량의 데이터를 빠르게 처리하기 위한 시도들이 나오고 있으며 이제는 그러한 기술들로 대용량 데이터를 다룬다는 것은 특별하지 않고 일상적인 일이 되어가고 있다.&lt;br /&gt;&lt;br /&gt;IT운영조직은 방대해져 가는 IT서비스와 함께 방대해져 가는 IT자원들을 빈틈없이 모니터링해야 하는 상황에 이르렀는데 상용/오픈소스를 가릴 것 없이 고전적인 IT모니터링 솔루션들은 수천~수만대가 넘어가는 IT인프라를 모니터링하고 그 이력과 성능치들을 저장하고 검색하기에는 역부족인 상황이 다가오고 있다.( 일부 솔루션들은 분산화된 Polling 환경을 지원하기 하나 결국에 병목은 뒷단의 고전적인 데이터스토리지인 RRD file이나 RDBMS에서 오게 됨)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이러한 규모의 문제를 만나려면 적어도 수천대 이상의 서버/장비들을 운용해보지 않는 이상 힘들겠지만.. 그런데 이런 상황에 희망을 주는 프로젝트가 생겼다.&lt;br /&gt;&lt;br /&gt;이름 하여 &lt;a href="http://opentsdb.net/"&gt;OpenTSDB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;해당 싸이트는 OpenTSDB의 목적을 다음과 같이 얘기하고 있다.&lt;br /&gt;&lt;br /&gt;OpenTSDB is a distributed, scalable Time Series Database (TSDB) written on top of HBase. OpenTSDB was written to address a common need: store, index and serve metrics collected from computer systems (network gear, operating systems, applications) at a large scale, and make this data easily accessible and graphable.&lt;br /&gt;&lt;br /&gt;앞으로 이것이 모니터링에 있어 규모의 문제에 부딪힌 이들에게 희망을 줄 수 있을듯하다.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5137684887780288527-8487220614607304139?l=aero2blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aero2blog.blogspot.com/feeds/8487220614607304139/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://aero2blog.blogspot.com/2010/11/opentsdb.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/8487220614607304139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/8487220614607304139'/><link rel='alternate' type='text/html' href='http://aero2blog.blogspot.com/2010/11/opentsdb.html' title='흥미로운 프로젝트 OpenTSDB'/><author><name>aero's blog</name><uri>http://www.blogger.com/profile/08594337308939199818</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5137684887780288527.post-2146102534459939726</id><published>2010-11-08T14:17:00.003+09:00</published><updated>2010-11-08T14:19:12.242+09:00</updated><title type='text'>screen session에 이름붙여 사용하기</title><content type='html'>UNIX에서 작업하다 보면 어떤 작업을 그대로 놔두고 로그아웃 했다가 나중에 다시 들어와서 보려면 가상 터미널 프로그램인 &lt;a href="http://www.gnu.org/software/screen/"&gt;screen&lt;/a&gt;을 종종 사용하게 된다.&lt;br /&gt;&lt;br /&gt;터미널에서 screen 명령을 내리면 새로운 세션이 생성되어서 들어가고 이것을 백그라운드?상태로 떼어내려면 ctrl+a를 누른후 d키를 누르면 원래 터미널로 돌아온다. 그리고 다시 떼어낸 특정 screen session에 들어가려면 screen -ls 명령을 내린후 세션넘버를 찾아서 screen -r 명령을 통해서 다시 진입한다.&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;aero@host:~$ screen -ls&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;There are screens on:&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7295.pts-0.sweetpea&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (2010년 11월 08일 13시 56분 14초)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (Detached)&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7271.pts-0.sweetpea&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (2010년 11월 08일 13시 55분 35초)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (Detached)&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;2 Sockets in /var/run/screen/S-aero.&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;aero@host:~$ screen -r 7271&lt;/div&gt;&lt;br /&gt;하지만 이렇게 하면 어느 세션에 어떤 작업을 하는지 나중에 헷갈릴 수 가 있는데 세션번호 대신에 특정 의미있는 단어들을 세션이름으로 지정할 수 있으면 편리할 것이다.그렇게 하려면 다음 처럼 screen -S 세션이름 명령으로 세션이름을 지정해서 새로운 세션을 지정하면 된다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;aero@host:~$ screen -S DB&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;[detached from 7328.DB]&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;aero@host:~$ screen -S WEB&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;[detached from 7347.WEB]&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;aero@host:~$ screen -ls&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;There are screens on:&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7347.WEB&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (2010년 11월 08일 14시 00분 33초)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (Detached)&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7328.DB (2010년 11월 08일 14시 00분 23초)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (Detached)&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;2 Sockets in /var/run/screen/S-aero.&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;aero@host:~$ screen -r DB&lt;/div&gt;&lt;br /&gt;이제 -r 옵션에 세션이름을 지정해서 해당세션을 복구할 수 있다.&lt;br /&gt;&lt;br /&gt;그러면 이미 떠있는 세션이름을 바꿀려면 어떻게 해야 할까?&lt;br /&gt;방법은 두가지가 있다.&lt;br /&gt;&lt;br /&gt;첫번째 방법은 해당 screen session에 들어간 다음 수동으로 ctrl+a 를 누른후 :sessionname 새로운세션이름 을 써서 바꾸는 방법이며 두번째 방법은 아래처럼 screen -ls에서 세션번호나 세션이름을 알아낸 다음처럼 -S 옵션으로 해당 세션번호나 이름을 지정하고 해당 세션에 명령을 날리는 -X 옵션으로 sessionname 새로운세션이름 수동으로 하던 명령을 날리는 것이다.&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;aero@host:~$ screen -ls&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;There is a screen on:&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7374.pts-0.sweetpea&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (2010년 11월 08일 14시 03분 47초)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (Attached)&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;1 Socket in /var/run/screen/S-aero.&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;aero@host:~$ screen -S 7374 -X sessionname aero&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;aero@host:~$ screen -ls&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;There is a screen on:&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7374.aero&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (2010년 11월 08일 14시 03분 47초)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (Detached)&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;1 Socket in /var/run/screen/S-aero. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5137684887780288527-2146102534459939726?l=aero2blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aero2blog.blogspot.com/feeds/2146102534459939726/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://aero2blog.blogspot.com/2010/11/screen-session.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/2146102534459939726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/2146102534459939726'/><link rel='alternate' type='text/html' href='http://aero2blog.blogspot.com/2010/11/screen-session.html' title='screen session에 이름붙여 사용하기'/><author><name>aero's blog</name><uri>http://www.blogger.com/profile/08594337308939199818</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5137684887780288527.post-8762007381909787281</id><published>2010-11-03T17:12:00.003+09:00</published><updated>2010-11-03T18:27:55.724+09:00</updated><title type='text'>Parallelize a job with Parallel::Forker</title><content type='html'>In &lt;a href="http://www.opsview.com/"&gt;Opsview&lt;/a&gt;, Master and Slave monitoring servers collect perfdata from servers and parse and write to rrd files.&lt;br /&gt;&lt;br /&gt;but I encountered rrd file writing timeout(12 seconds) as the number of rrd files increased.&lt;br /&gt;So I started investigating where the performance bottleneck could be occurring ( We have multi-core CPU and there are no cpu or I/O bottlenecks ) and parallelized the time-consuming job in &lt;a href="https://secure.opsera.com/wsvn/wsvn/opsview/trunk/opsview-core/bin/insert.pl"&gt;insert.pl&lt;/a&gt; like this with &lt;a href="http://search.cpan.org/dist/Parallel-Forker/"&gt;Parallel::Forker&lt;/a&gt; module.&lt;br /&gt;&lt;br /&gt;Performance increases almost linearly with increasing N until you meet the limit of I/O bandwidth.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: yellow;"&gt;Original&lt;/div&gt;&lt;br /&gt;&lt;b&gt;JOB FLOW&lt;/b&gt;&lt;br /&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;pre&gt;perfdata in array -&amp;gt; iteration ( parse, write )&lt;br /&gt; [ @perfdata ]       [ processdata(@perfdata) ]&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;CODE&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:perl"&gt;processdata(@perfdata);&lt;br /&gt;debug( 5, 'INSERT nagiosgraph exited' );&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: yellow;"&gt;Parallelized&lt;/div&gt;&lt;br /&gt;&lt;b&gt;JOB FLOW&lt;/b&gt;&lt;br /&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;pre&gt;perfdata in array -&amp;gt; split array into N -+-&amp;gt; array 0  -&amp;gt; iteration ( parse, write ) &lt;br /&gt;                                         +-&amp;gt; array 1  -&amp;gt; iteration ( parse, write ) &lt;br /&gt;                                         +-&amp;gt;    .     -&amp;gt; iteration ( parse, write ) &lt;br /&gt;                                         +-&amp;gt; array N-1-&amp;gt; iteration ( parse, write )&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;CODE&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:perl"&gt;use Parallel::Forker;&lt;br /&gt;&lt;br /&gt;my $fork = Parallel::Forker-&amp;gt;new;&lt;br /&gt;$SIG{CHLD} = sub { Parallel::Forker::sig_child($fork); };&lt;br /&gt;$SIG{TERM} = sub { $fork-&amp;gt;kill_tree_all('TERM') if $fork &amp;amp;&amp;amp; $fork-&amp;gt;in_parent; die "Quitting...\n"; };&lt;br /&gt;&lt;br /&gt;my $n = 4;&lt;br /&gt;my @n_perfdata;&lt;br /&gt;&lt;br /&gt;my $size = int(@perfdata/$n);&lt;br /&gt;foreach ( 0 .. $n-1 ){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $n_perfdata[$_] = [ splice @perfdata, 0, $size ];&lt;br /&gt;}&lt;br /&gt;push @{$n_perfdata[$n-1]}, @perfdata;&lt;br /&gt;&lt;br /&gt;foreach ( 0..$#n_perfdata ) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $fork-&amp;gt;schedule ( name =&amp;gt; $_, run_on_start =&amp;gt; \&amp;amp;child_sub )-&amp;gt;run;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$fork-&amp;gt;wait_all();&lt;br /&gt;&lt;br /&gt;debug( 5, 'INSERT nagiosgraph exited' );&lt;br /&gt;&lt;br /&gt;sub child_sub {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; processdata( @{ $n_perfdata[ $_[0]{name} ] } );&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5137684887780288527-8762007381909787281?l=aero2blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aero2blog.blogspot.com/feeds/8762007381909787281/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://aero2blog.blogspot.com/2010/11/parallelize-job-with-parallelforker.html#comment-form' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/8762007381909787281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/8762007381909787281'/><link rel='alternate' type='text/html' href='http://aero2blog.blogspot.com/2010/11/parallelize-job-with-parallelforker.html' title='Parallelize a job with Parallel::Forker'/><author><name>aero's blog</name><uri>http://www.blogger.com/profile/08594337308939199818</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5137684887780288527.post-5439377795806359687</id><published>2010-10-07T12:42:00.003+09:00</published><updated>2010-10-08T10:33:51.252+09:00</updated><title type='text'>I18N patch for Opsview 3.9.0</title><content type='html'>I love &lt;a href="http://opsview.com/"&gt;Opsview&lt;/a&gt; for my IT infrastructure monitoring system.&lt;br /&gt;But It still has some problems to support non-ascii characters or languages. :(&lt;br /&gt;So I'v made patch for the newest Opsview 3.9.0.&lt;br /&gt;&lt;br /&gt;My patches are&lt;br /&gt;&lt;br /&gt;&lt;a href="http://gist.github.com/614513"&gt;http://gist.github.com/614513&lt;/a&gt;&lt;br /&gt;&lt;a href="http://gist.github.com/614511"&gt;http://gist.github.com/614511&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I hope Opsview will apply these patches to thier product.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5137684887780288527-5439377795806359687?l=aero2blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aero2blog.blogspot.com/feeds/5439377795806359687/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://aero2blog.blogspot.com/2010/10/i18n-patch-for-opsview-390.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/5439377795806359687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/5439377795806359687'/><link rel='alternate' type='text/html' href='http://aero2blog.blogspot.com/2010/10/i18n-patch-for-opsview-390.html' title='I18N patch for Opsview 3.9.0'/><author><name>aero's blog</name><uri>http://www.blogger.com/profile/08594337308939199818</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5137684887780288527.post-169875757659621543</id><published>2010-09-23T00:17:00.006+09:00</published><updated>2010-09-29T12:24:03.467+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Perl 스크립트에 필요한 모듈 같이 넣기 App::FatPacker</title><content type='html'>Perl 스크립트를 만들다 보면 기본 Perl 배포본에는 기본으로 들어가는 &lt;a href="http://perldoc.perl.org/index-modules-A.html"&gt;코어모듈&lt;/a&gt; 이외에 추가로 모듈을 설치하여 사용하게 되는데, 만약 자신에 배포해야 하는 스크립트에 어떤 모듈을 사용해야 하지만 이것을 사용자가 사용할 때 모듈에 대한 의존성을 신경 쓰지 않으며 추가로 모듈을 설치해야하는 수고를 덜어주고 싶을 때가 있다.&lt;br /&gt;&lt;br /&gt;이럴 때 유용하게 써먹을 수 있는 모듈이 바로 &lt;a href="http://search.cpan.org/dist/App-FatPacker/"&gt;App::FatPacker&lt;/a&gt; 모듈이다.&lt;br /&gt;&lt;br /&gt;그럼 예를 들어서 한 번 App::FatPacker를 사용해보자.&lt;br /&gt;CPAN에는 Linux머신의 다양한 성능정보 및 시스템정보를 접근할 수 있는 &lt;a href="http://search.cpan.org/dist/Sys-Statistics-Linux/"&gt;Sys::Statistics::Linux&lt;/a&gt; 라는 훌륭한 모듈이 있다. ( vmstat,iostat 명령등의 결과 ,/proc 디렉토리를 수동으로 노가다 파싱해서 수치를 뽑아내서 썼던 사람이 보면 이렇게 잘 차려진 밥상을 보며 허무감의 눈물을 흘릴만한~ )&lt;br /&gt;&lt;br /&gt;예를 들어 &lt;a href="http://search.cpan.org/perldoc?Sys::Statistics::Linux::SysInfo"&gt;Sys::Statistics::Linux::SysInfo&lt;/a&gt; 를 사용하여 Linux머신의 각종 정보를 뽑아내는 Perl 스크립트를 다음과 같이 만들었다고 했을 때&lt;br /&gt;&lt;br /&gt;&amp;lt;sysinfo.pl&amp;gt;&lt;br /&gt;&lt;pre class="brush:perl"&gt;#!/usr/bin/env perl&lt;br /&gt;use strict;&lt;br /&gt;use warnings;&lt;br /&gt;use Sys::Statistics::Linux::SysInfo;&lt;br /&gt;&lt;br /&gt;my $lxs = Sys::Statistics::Linux::SysInfo-&amp;gt;new;&lt;br /&gt;my $info = $lxs-&amp;gt;get;&lt;br /&gt;print "$_ : $info-&amp;gt;{$_}\n" for keys %$info;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&amp;lt;실행결과 예&amp;gt;&lt;br /&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;swaptotal : 11881464 kB&lt;br /&gt;arch : x86_64 &lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;version : #43-Ubuntu SMP Thu Sep 16 16:05:42 UTC 2010&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;release : 2.6.32-24-server&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;hostname : somehost&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;countcpus : 8&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;domain : (none)&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;idletime : 63d 23h 59m 42s&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;kernel : Linux&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;memtotal : 4055708 kB&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;uptime : 7d 23h 30m 3s &lt;/div&gt;&lt;br /&gt;이것을 사용하려면 Sys::Statistics::Linux 모듈을 따로 설치해야 한다. 만약에 수백,수천대의 서버에 복사해서 각 시스템의 정보를 뽑아오는 작업을 한다고 하면 그 많은 서버에 이 간단한 스크립트 하나를 위해 Sys::Statistics::Linux 를 일일이 설치하기는 부담스럽고 귀찮을 것이다.&lt;br /&gt;&lt;br /&gt;바로 이럴 때 App::FatPacker가 빛을 발한다. 그러면 위에서 예를 든 sysinfo.pl 스크립트에 Sys::Statistics::Linux 모듈을 포함시키는 작업을 진행해보자.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://search.cpan.org/dist/App-FatPacker/"&gt;App::FatPacker&lt;/a&gt; 모듈을 설치한 다음&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ fatpack trace sysinfo.pl&lt;/div&gt;라고 명령을 내리면 필요한 추가 모듈을 분석하여 fatpacker.trace 란 파일을 생성한다.&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ fatpack packlists-for `cat fatpacker.trace` &amp;gt; packlists&lt;/div&gt;의 명령으로 fatpacker.trace 파일에서 포함할 파일의 리스트를 packlists 파일로 뽑는다.&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ fatpack tree `cat packlists`&lt;/div&gt;packlists 에 있는 모듈 파일들을 패키징 할 준비를 한다.&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ (fatpack file; cat sysinfo.pl) &amp;gt; sysinfo.packed.pl&lt;/div&gt;sysinfo.pl에 모듈을 같이 패키징해서 sysinfo.packed.pl 이란 스크립트를 생성한다.&lt;br /&gt;(여기서 홈디렉토리에 ~/lib 디렉토리가 없다고 에러가 나는 경우가 있는데 이때는 lib 디렉토리를 그냥 만들어 주면 된다.)&lt;br /&gt;&lt;br /&gt;이제 sysinfo.packed.pl 스크립트는 자체적으로 의존성 있는 모듈을 파일의 첫 부분에 적절히 패키징하여 포함하므로 따로 필요한 모듈이 설치되어 있지 않아도 잘 실행되게 된다.&lt;br /&gt;&lt;br /&gt;&lt;div style="color: red;"&gt;주의점:&lt;/div&gt;App::FatPacker는 순수한 Perl모듈에 대해서만 동작한다. C라이브러리등과 연동되어서 돌아가는 XS모듈은 동작하지 않는다. 그리고 만능이 아니므로 비교적 크기가 작고 적은 수의 모듈에 대해서만 사용하는 것이 좋다. 아주 많은 모듈을 포함하고 Perl이 독립적으로 패키징되어서 돌아가도록 하고 싶으면 &lt;a href="http://search.cpan.org/dist/PAR-Packer/"&gt;PAR::Packer&lt;/a&gt; 모듈을 참고하길 바란다.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5137684887780288527-169875757659621543?l=aero2blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aero2blog.blogspot.com/feeds/169875757659621543/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://aero2blog.blogspot.com/2010/09/perl-appfatpacker.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/169875757659621543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/169875757659621543'/><link rel='alternate' type='text/html' href='http://aero2blog.blogspot.com/2010/09/perl-appfatpacker.html' title='Perl 스크립트에 필요한 모듈 같이 넣기 App::FatPacker'/><author><name>aero's blog</name><uri>http://www.blogger.com/profile/08594337308939199818</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5137684887780288527.post-4169657615672150248</id><published>2010-09-16T23:00:00.013+09:00</published><updated>2010-09-29T12:39:23.912+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>설치된 Perl CPAN 모듈 목록 뽑아서 다시 설치하기</title><content type='html'>Perl 버젼이 새로나오면 &lt;a href="http://search.cpan.org/dist/App-perlbrew/"&gt;perlbrew&lt;/a&gt;를 이용해서 새로운 버젼의 Perl을 설치할 경우 문제가 되는 것은 기존에 설치한 모듈들을 어떻게 다시 다 설치할 것 인가이다.&lt;br /&gt;&lt;br /&gt;모듈을 별도의 디렉토리를 지정해서 설치해서 사용하면 모듈의 Path를 그대로 지정해주면 사용할 수 있겠지만 여기서 문제는 C라이브러리 및 코드와 연동되어 컴파일되어 설치되는 일명 XS모듈들이다. 이런 모듈들은 Perl 버젼에 따라 호환이 되지 않은 경우가 있기 때문에 깔끔하게 다시 설치해주는 것이 좋은데 그러려면 일단 현재 설치된 모듈들의 목록을 뽑아야 한다.&lt;br /&gt;&lt;br /&gt;현재 설치된 모듈들의 목록을 얻으려면 &lt;a href="http://search.cpan.org/dist/ExtUtils-Install/"&gt;ExtUtils::Installed&lt;/a&gt; 모듈을 이용하여 다음과 같이 명령을 내린다.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="background-color: #cfe2f3;"&gt;perl -MExtUtils::Installed -le 'print for ExtUtils::Installed-&amp;gt;new-&amp;gt;modules' &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;그러면 다음처럼 설치된 모듈들의 목록이 쭉 출력되게 되는데&lt;br /&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Algorithm::Diff&lt;br /&gt;Algorithm::Permute&lt;br /&gt;Any::Moose&lt;br /&gt;AnyEvent&lt;br /&gt;AnyEvent::HTTP&lt;br /&gt;App::CPAN::Fresh&lt;br /&gt;App::Cmd&lt;br /&gt;.&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;.&lt;/div&gt;&lt;div style="background-color: #cfe2f3; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;다음과 같이 리다이렉션으로 목록을 텍스트 파일로 저장해 놓고&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="background-color: #cfe2f3;"&gt;perl -MExtUtils::Installed -le 'print for ExtUtils::Installed-&amp;gt;new-&amp;gt;modules' &amp;gt; modules.txt &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;perlbrew로 새 버젼의 Perl을 설치한 다음&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #cfe2f3;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;cat modules.txt | xargs cpan -i&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;명령이나 &lt;a href="http://search.cpan.org/dist/App-cpanminus/"&gt;cpanm&lt;/a&gt; 을 사용한다면&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #cfe2f3;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;cat modules.txt | cpanm -v&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;명령을 내리면 목록의 모듈들을 모두 다시 설치한다.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5137684887780288527-4169657615672150248?l=aero2blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aero2blog.blogspot.com/feeds/4169657615672150248/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://aero2blog.blogspot.com/2010/09/perl-cpan.html#comment-form' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/4169657615672150248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/4169657615672150248'/><link rel='alternate' type='text/html' href='http://aero2blog.blogspot.com/2010/09/perl-cpan.html' title='설치된 Perl CPAN 모듈 목록 뽑아서 다시 설치하기'/><author><name>aero's blog</name><uri>http://www.blogger.com/profile/08594337308939199818</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5137684887780288527.post-1375492061429237740</id><published>2010-08-26T15:08:00.000+09:00</published><updated>2010-09-15T10:21:49.619+09:00</updated><title type='text'>블로그 변경</title><content type='html'>귀차니즘으로 인해 기존의 설치형 블로그( &lt;a href="http://aero.sarang.net/blog"&gt;http://aero.sarang.net/blog&lt;/a&gt; )를 버리고 옮김&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5137684887780288527-1375492061429237740?l=aero2blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aero2blog.blogspot.com/feeds/1375492061429237740/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://aero2blog.blogspot.com/2010/08/blog-post.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/1375492061429237740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5137684887780288527/posts/default/1375492061429237740'/><link rel='alternate' type='text/html' href='http://aero2blog.blogspot.com/2010/08/blog-post.html' title='블로그 변경'/><author><name>aero's blog</name><uri>http://www.blogger.com/profile/08594337308939199818</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
