<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>aero&apos;s Blog</title>
    <link rel="alternate" type="text/html" href="http://aero.sarang.net/blog/" />
    <link rel="self" type="application/atom+xml" href="http://aero.sarang.net/blog/atom.xml" />
    <id>tag:aero.sarang.net,2007-07-27:/blog//1</id>
    <updated>2010-03-08T05:33:57Z</updated>
    <subtitle>Perl, System Architecture, etc.</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.21-en</generator>

<entry>
    <title>Twitter 맞팔로우율 계산기</title>
    <link rel="alternate" type="text/html" href="http://aero.sarang.net/blog/2010/03/twitter.html" />
    <id>tag:aero.sarang.net,2010:/blog//1.154</id>

    <published>2010-03-08T05:22:20Z</published>
    <updated>2010-03-08T05:33:57Z</updated>

    <summary>요즘 트위터에서 맞팔로우율을 계산해주는 서비스가 있길래 남이 만든서비스에 로그인하기도 꺼림직하고...</summary>
    <author>
        <name>aero</name>
        <uri>http://aero.sarang.net/blog</uri>
    </author>
    
    <category term="perlwwwmechanizetwitterfollowingrate" label="perl WWW::Mechanize twitter following rate" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://aero.sarang.net/blog/">
        <![CDATA[요즘 트위터에서 <a href="http://twitaddons.com/">맞팔로우율을 계산해주는 서비스</a>가 있길래 남이 만든서비스에 로그인하기도 꺼림직하고 누가 나를 팔로우하고 있지 않는지 여부도 따로 안 보여주는것 같아서 직접 한번 만들어 봤다. <br /><br />처음엔 Twitter API를 통해서 하려고 했으나 Twitter측에 확인을 받고 white list에 들어가지 않으면 시간당 150번 호출 제한이 걸려서 이것 때문에 따로 요청하고 하는 것도 귀찮아서 Perl의 <a href="http://search.cpan.org/dist/WWW-Mechanize/">WWW::Mechanize</a> 모듈을 사용하여 일반 웹페이지를 긁어서 분석하도록 만들었다.<br /><br /><br />
<script src="http://gist.github.com/324895.js?file=check_follow.pl"></script>프로그램의 동작방식을 간단히 설명하자면 소스에서 아이디와 패스워드 부분을 자기계정정보로 바꾼다음 Perl 스크립트를 실행시키면 로그인한다음 following 페이지를 클릭하고 유저리스트가 끝날때 까지 다음 페이지를 계속 넘겨가며 매 페이지의 HTML소스를 분석하여 direct-messageable인 계정은 서로 맞팔로우하고 있다는 것이므로 이것을 카운트 한다.<br /><br />본인의 실행결과는 다음과 같다.<br /><br />0 al3x<br />1 kwonjuga<br />1 stephenodonnell<br />1 LimeBurst<br />0 planetsysad<br />1 lifewind<br />&nbsp;&nbsp; .<br />&nbsp;&nbsp; .<br />중간생략<br />&nbsp;&nbsp; .<br />&nbsp;&nbsp; .<br />0 clkao<br />1 pung96<br />1 takesako<br />0 bradfitz<br />1 obra<br />0 miyagawa<br />1 hanekomu<br /><br />170/345&nbsp; Cross following rate is 49.28%<br /><br />]]>
        
    </content>
</entry>

<entry>
    <title>FULL cpanm bootstrapping</title>
    <link rel="alternate" type="text/html" href="http://aero.sarang.net/blog/2010/03/full-cpanm-bootstrapping.html" />
    <id>tag:aero.sarang.net,2010:/blog//1.153</id>

    <published>2010-03-02T08:58:15Z</published>
    <updated>2010-03-16T01:48:41Z</updated>

    <summary>jeen님의 [Perl/CPAN] cpanm 이 당신의 Perl 생활을 윤택하게 해드립니다포스팅을 보니...</summary>
    <author>
        <name>aero</name>
        <uri>http://aero.sarang.net/blog</uri>
    </author>
    
    <category term="perlcpanmcpanbootstrapping" label="perl cpanm cpan bootstrapping" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://aero.sarang.net/blog/">
        <![CDATA[jeen님의 <br /><h2><a href="http://jeen.tistory.com/entry/PerlCPAN-cpanm-%EC%9D%B4-%EB%8B%B9%EC%8B%A0%EC%9D%98-Perl-%EC%83%9D%ED%99%9C%EC%9D%84-%EC%9C%A4%ED%83%9D%ED%95%98%EA%B2%8C-%ED%95%B4%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4">[Perl/CPAN]
 cpanm 이 당신의 Perl 생활을 윤택하게 해드립니다</a></h2>포스팅을 보니 처음 사용하는 사람에게는 몇가지 신경써줘야 할 부분이 생략된 것 같아서 전체 bootstrapping 과정을 적용해봄<br /><br />주의! - 다음은 system wide하게 모듈을 인스톨 할 수 있는 root권한이 없으며 이전에 아무런 cpan 사용환경이 구축되지 않은 계정에서 사용자 계정안에 독립적으로 모듈을 설치해서 쓰려고 할 때 적용되는 방법임.<br /><br />1. cpanm 소스를 임시로 받는다.<br />wget http://github.com/miyagawa/cpanminus/raw/master/cpanm<br />또는<br />wget http://xrl.us/cpanm<br />또는<br />wget http://cpanmin.us<br /><br />2. <a href="http://search.cpan.org/dist/local-lib/">local::lib</a> 과 <a href="http://search.cpan.org/dist/App-cpanminus/">App::cpanminus</a>를 임시로 받은 cpanm을 통해 설치한다.<br />(최신 버젼 cpanm은 --local-lib=~/perl5 처럼 명시적인 옵션을 주지 않아도 root권한이 없을 경우 자동으로 local::lib모듈의 기본 경로인 ~/perl5 로 설치한다.&nbsp; )<br />perl cpanm --local-lib=~/perl5 local::lib App::cpanminus<br /><br />3. local::lib사용을 위한 환경변수를 .bashrc에 추가한다.<br />echo 'eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)' &gt;&gt; ~/.bashrc<br /><br />4. .bashrc를 다시 읽어들인다. ( 적절한 local::lib 환경변수 추가됨)<br />. ~/.bashrc<br /><br />5. 기존에 wget으로 받은 cpanm은 App::cpanminus로 새로운 cpanm이 local::lib이 지정하는 경로에 설치되어 더이상 필요 없으므로 지운다.<br />rm cpanm<br /><br />6. 이제 local::lib으로 ~/perl5/bin/ 에 설치된 cpanm을 그냥 실행가능하다.<br />cpanm<br /><br /><br />이제<br />cpanm 모듈명&nbsp;&nbsp; 으로 모듈 설치가능<br /><br />자세한 옵션은 cpanm --help<br /><br />&lt;추가&gt;<br />위 과정을 한번에 끝내려면<br /><br />wget -O - http://cpanmin.us/ | perl - local::lib App::cpanminus &amp;&amp; echo 'eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)' &gt;&gt; ~/.bashrc &amp;&amp; . ~/.bashrc<br /><br />참고: <a href="http://aero.sarang.net/blog/2009/04/locallib-cpan.html">local::lib
 모듈로 CPAN 모듈을 일반계정에 설치하기</a> ]]>
        
    </content>
</entry>

<entry>
    <title>no Moose; or use namespace::clean or use namespace::autoclean ?</title>
    <link rel="alternate" type="text/html" href="http://aero.sarang.net/blog/2010/03/no-moose-or-use-namespaceclean.html" />
    <id>tag:aero.sarang.net,2010:/blog//1.152</id>

    <published>2010-03-01T08:10:03Z</published>
    <updated>2010-03-02T22:33:17Z</updated>

    <summary>요즘 Perl 5의 새로운 OOP프레임웍으로 뜨고있는 Moose로 클래스를 정의할 때...</summary>
    <author>
        <name>aero</name>
        <uri>http://aero.sarang.net/blog</uri>
    </author>
    
    <category term="perloopmoosenamespacecleannamespaceautoclean" label="perl oop Moose namespace::clean namespace::autoclean" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://aero.sarang.net/blog/">
        <![CDATA[요즘 Perl 5의 새로운 OOP프레임웍으로 뜨고있는 <a href="http://www.iinteractive.com/moose/">Moose</a>로 클래스를 정의할 때 각종 문서나 책마다 조금씩은 다른 방법으로 사용하는 부분이 있는데 그것은 네임스페이스를 청소하는 방법이다.<br /><br />package SomeClass;<br />use Moose;<br />&nbsp;.<br />&nbsp;.<br />&nbsp;.<br />__PACKAGE__-&gt;meta-&gt;make_immutable;<br /><i><font style="font-size: 1.25em;"><b>no Moose;</b></font></i><br />1;<br /><br /><br /><br /><br />package SomeClass;<br />use Moose;<br /><i><font style="font-size: 1.25em;"><b>use namespace::clean -except =&gt; 'meta';</b></font></i><br />&nbsp;.<br />&nbsp;.<br />&nbsp;.<br />__PACKAGE__-&gt;meta-&gt;make_immutable;<br />1;<br /><br /><br /><br /><br />package SomeClass;<br />use Moose;<br /><i><font style="font-size: 1.25em;"><b>use namespace::autoclean;</b></font></i><br />&nbsp;.<br />&nbsp;.<br />&nbsp;.<br />__PACKAGE__-&gt;meta-&gt;make_immutable;<br />1;<br /><br />여기서 네임스페이스를 청소한다는 말은 use Moose 하면서 import된 클래스/객체를 구성하기 위해 사용되는 Sugar함수들(has,after,extends등)을 사용이 다 끝나면 제거한다는 말이다.(meta 관련 함수는 meta object protocol 구현과 관련있기 때문에 제거하지 않는다.) 제거를 하지 않아도 문제가 없을 수 있겠지만 어떠한 함수들이 자동으로 import되었는지 알기 어렵고 나중에 해당 클래스를 사용하는 코드에서 그러한 함수들이 예기치 않은 문제를 일으킬 소지가 있기 때문에 제거하는 것이 좋다. ( __PACKAGE__-&gt;meta-&gt;make_immutable; 은 더이상 meta object protocol을 통한 동적인 변화가 없다는 걸 명시하는 것으로 처리속도를 높이기 위해 넣어주는 부분 )<br /><br />그럼 위의 3가지가 어떻게 다른지 한 번 살펴보자.<br /><br />여기서 제일 먼저 이해하고 넘어가야 할 것은 namespace::clean 의 동작방식이다. namespace::clean의 동작방식은 <a href="http://www.effectiveperlprogramming.com/blog/124">Avoid accidently creating methods from module exports</a>( http://www.effectiveperlprogramming.com/blog/124 )와 <a href="http://search.cpan.org/perldoc?namespace::clean">namespace::clean</a> 모듈문서( http://search.cpan.org/perldoc?namespace::clean )를 참고<br /><br />간단하게 말하자면 namespace::clean은 use namespace::clean 이전에 정의되었거나 import된 함수(function)들을 use namespace::clean이 정의된 렉시컬 영역이 끝나는 시점에 제거하며( 여기서 주의할 것은 제거하는 시점은 compile time이 아니라는 것 )&nbsp; no namespace::clean 이 나오면 제거 대상들을 use namespace::clean 다시 나올 때 까지 다시 모은다는 것이다. 그리고 제거에서 제외할 대상을 -except를 사용하여 지정할 수 있다.<br /><br />$ perl -e '{ sub hello { print "hello\n" } } hello()'<br />hello<br />$ perl -e '{ sub hello { print "hello\n" } use namespace::clean; } hello()'<br />Undefined subroutine &amp;main::hello called at -e line 1.<br />$ perl -e '{ sub hello { print "hello\n" } use namespace::clean -except=&gt;"hello"; } hello()'<br />hello<br />$ perl -e '{ sub hello { print "hello\n" } use namespace::clean; sub say_hello { hello() } } say_hello(); hello()'<br />hello<br />Undefined subroutine &amp;main::hello called at -e line 1.<br />$ perl -e '{ use namespace::clean; sub hello2 { print "hello2\n" } no namespace::clean; sub hello3 { print "hello3\n" } use namespace::clean; } hello2(); hello3()'<br />hello2<br />Undefined subroutine &amp;main::hello3 called at -e line 1.<br /><br />위 결과를 보면 이해가 갈 것이다.<br /><br />그러면 이제 <a href="http://www.effectiveperlprogramming.com/blog/124">Avoid accidently creating methods from module exports</a> 에 있는 현재 package에서 정의된 함수들을 보여주는 show_defined_subs 함수가 포함된 Moose 클래스를 처음에 얘기한 3가지 경우와 그것들은 사용하지 않았을 경우를 만들어서 비교해보자.<br /><br /><font style="font-size: 1.25em;"><u><b>&lt;아무것도 사용하지 않을 경우&gt;</b></u></font><br />#!/usr/bin/env perl<br />use strict;<br />use warnings;<br /><br />{<br />&nbsp;&nbsp;&nbsp; package SomeClass;<br />&nbsp;&nbsp;&nbsp; use Moose;<br />&nbsp;&nbsp;&nbsp; use Carp 'croak';<br /><br />&nbsp;&nbsp;&nbsp; sub get_defined_subs<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my( $package ) = @_;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; no strict 'refs';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach my $name ( keys %{"${package}::"} )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next unless defined &amp;{"${package}::$name"};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "$name\n";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; __PACKAGE__-&gt;meta-&gt;make_immutable;<br />}<br /><br />SomeClass-&gt;get_defined_subs;<br /><br /><font style="font-size: 1.25em;"><u><b>&lt;결과&gt;</b></u></font><br />around<br />has<br />blessed<br />meta<br />after<br />augment<br />inner<br />new<br />extends<br />get_defined_subs<br />before<br />super<br />DESTROY<br />croak<br />confess<br />override<br />with<br /><br /><br /><font style="font-size: 1.25em;"><u><b>&lt;no Moose를 사용한 경우&gt;</b></u></font><br />#!/usr/bin/env perl<br />use strict;<br />use warnings;<br /><br />{<br />&nbsp;&nbsp;&nbsp; package SomeClass;<br />&nbsp;&nbsp;&nbsp; use Moose;<br />&nbsp;&nbsp;&nbsp; use Carp 'croak';<br /><br />&nbsp;&nbsp;&nbsp; sub get_defined_subs<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my( $package ) = @_;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; no strict 'refs';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach my $name ( keys %{"${package}::"} )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next unless defined &amp;{"${package}::$name"};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "$name\n";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; __PACKAGE__-&gt;meta-&gt;make_immutable;<br />&nbsp;&nbsp;&nbsp; no Moose;<br />}<br /><br />SomeClass-&gt;get_defined_subs;<br /><br /><font style="font-size: 1.25em;"><u><b>&lt;결과&gt;</b></u></font><br />meta<br />new<br />get_defined_subs<br />DESTROY<br />croak<br /><br /><br /><font style="font-size: 1.25em;"><u><b>&lt;use namespace::clean -except =&gt; 'meta' 를 사용한 경우&gt;</b></u></font><br />#!/usr/bin/env perl<br />use strict;<br />use warnings;<br /><br />{<br />&nbsp;&nbsp;&nbsp; package SomeClass;<br />&nbsp;&nbsp;&nbsp; use Moose;<br />&nbsp;&nbsp;&nbsp; use Carp 'croak';<br />&nbsp;&nbsp;&nbsp; use namespace::clean -except =&gt; 'meta';<br /><br />&nbsp;&nbsp;&nbsp; sub get_defined_subs<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my( $package ) = @_;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; no strict 'refs';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach my $name ( keys %{"${package}::"} )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next unless defined &amp;{"${package}::$name"};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "$name\n";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; __PACKAGE__-&gt;meta-&gt;make_immutable;<br />}<br /><br />SomeClass-&gt;get_defined_subs;<br /><br /><font style="font-size: 1.25em;"><u><b>&lt;결과&gt;</b></u></font><br />meta<br />new<br />get_defined_subs<br />DESTROY<br /><br /><br /><font style="font-size: 1.25em;"><u><b>&lt;use namespace::autoclean 을 사용한 경우&gt;</b></u></font><font style="font-size: 1.25em;"><br /></font>#!/usr/bin/env perl<br />use strict;<br />use warnings;<br /><br />{<br />&nbsp;&nbsp;&nbsp; package SomeClass;<br />&nbsp;&nbsp;&nbsp; use Moose;<br />&nbsp;&nbsp;&nbsp; use Carp 'croak';<br />&nbsp;&nbsp;&nbsp; use namespace::autoclean;<br /><br />&nbsp;&nbsp;&nbsp; sub get_defined_subs<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my( $package ) = @_;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; no strict 'refs';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach my $name ( keys %{"${package}::"} )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next unless defined &amp;{"${package}::$name"};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "$name\n";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; __PACKAGE__-&gt;meta-&gt;make_immutable;<br />}<br /><br />SomeClass-&gt;get_defined_subs;<br /><br /><font style="font-size: 1.25em;"><u><b>&lt;결과&gt;</b></u></font><br />meta<br />new<br />get_defined_subs<br />DESTROY<br /><br />위 결과를 종합해 보면 3가지 모두 Moose와 관련된 Sugar함수들을 제거 하기는 하나 no Moose의 경우 다른 모듈을 통해서 import한 함수(위에서는 Carp의 croak함수)들은 제대로 제거하지 못하며 use namespace::clean -except =&gt; 'meta'; 나 use namespace::autoclean; 은 meta관련 함수들 빼고는 모두 똑같이 제거함을 볼 수 있다.( 다르게 보면 namespace::autoclean 은 namespace::clean의 Moose특화 버젼으로 볼 수 있음 )<br /><br />그러면 Moose로 클래스를 만들때 어떤 방법을 쓰는 게 좋을까? 일단 no Moose는 위에서 보듯 어떤 경우에 완벽하지 못함을 볼 수 있다. 따라서 use namespace::autoclean;을 쓰는 것이 좋아 보인다. 그러면 use namespace::clean -except =&gt; 'meta';은 쓸데없이 길기만 한 방법일까?<br /><br />하지만 꼭 그런건 아니다.&nbsp; <a href="http://www.effectiveperlprogramming.com/blog/124">Avoid accidently creating methods from module exports</a> 에서도 보듯이 클래스 메소드가 아닌 클래스 내부에서만 접근가능한 함수를 정의할 필요가 있을때 namespace::autoclean 모듈은 namespace::clean 의 no namespace::clean 처럼 unimport 기능을 통해 나중에 네임스페이스에서 제거할 함수를 따로 지정할 방법이 없기 때문에 경우에 따라서는 namespace::clean으로만 가능한 경우도 있게 된다.<br /><br />결론을 내리자면 Moose로 클래스를 정의할때 namespace::autoclean을 쓰면 되겠고 위에서 말한 부득이한 경우에만 namespace::clean을 사용하면 된다. 둘다 나름 존재의 이유가 있다고 볼 수 있는 것이다.<br /><br />]]>
        
    </content>
</entry>

<entry>
    <title>Perl 메타프로그래밍</title>
    <link rel="alternate" type="text/html" href="http://aero.sarang.net/blog/2010/01/perl-11.html" />
    <id>tag:aero.sarang.net,2010:/blog//1.151</id>

    <published>2010-01-15T13:37:57Z</published>
    <updated>2010-01-15T16:31:18Z</updated>

    <summary>KLDP에서 어느분이 Ruby로 메타프로그래밍에 대해서 소개하시길래 Perl로 따라해봤다.Perl에서도 현대적이고 최신의...</summary>
    <author>
        <name>aero</name>
        <uri>http://aero.sarang.net/blog</uri>
    </author>
    
    <category term="perlrubymetaprogrammingoopmoose메타프로그래밍" label="perl ruby metaprogramming oop moose 메타프로그래밍" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://aero.sarang.net/blog/">
        <![CDATA[KLDP에서 어느분이 <a href="http://kldp.org/node/111836">Ruby로 메타프로그래밍에 대해서 소개</a>하시길래 Perl로 따라해봤다.<br /><br />Perl에서도 현대적이고 최신의 OOP Framework인 <a href="http://www.iinteractive.com/moose/">Moose</a>를 사용하면 손쉽고 강력한 메타프로그래밍이 가능하다. 그리고 유연하고 풍부한 문법은 다양한 프로그래밍 스타일을 구사하는데 막힘이 없다.<br /><br /><hr><br />use 5.010;<br /><br /># Tool 클래스 정의<br />{<br />&nbsp;&nbsp;&nbsp; package Tool;<br />&nbsp;&nbsp;&nbsp; use MooseX::SingletonMethod;<br /><br />&nbsp;&nbsp;&nbsp; sub setup1 {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; say "setup1";<br />&nbsp;&nbsp;&nbsp; }<br />}<br /><br /># Tool 클래스에 setup2 메소드 추가<br />Tool-&gt;meta-&gt;add_method( setup2 =&gt; sub { say "setup2" } );<br /><br />my $tool = Tool-&gt;new;<br /><br /># $tool 객체에 singleton 메소드 추가<br />$tool-&gt;add_singleton_method( setup3 =&gt; sub { say "setup3" } );<br /><br />$tool-&gt;setup1;<br />$tool-&gt;setup2;<br />$tool-&gt;setup3;<br /><br />my $tool2 = Tool-&gt;new;<br /><br />$tool2-&gt;setup1;<br />$tool2-&gt;setup2;<br />$tool2-&gt;setup3;&nbsp; # error<br /><br /><br /><hr><br />use 5.010;<br /><br /># Brain 클래스 정의<br />{<br />&nbsp;&nbsp;&nbsp; package Brain;<br />&nbsp;&nbsp;&nbsp; use Moose;<br /><br />&nbsp;&nbsp;&nbsp; has iq =&gt; ( isa =&gt; 'Int', is =&gt; 'rw', default =&gt; 100 );<br />}<br /><br />my $brain = Brain-&gt;new;<br /># 클래스 내부 들여다 보기<br />say $brain-&gt;meta-&gt;get_attribute('iq')-&gt;type_constraint;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Int<br />say $brain-&gt;meta-&gt;get_attribute('iq')-&gt;get_value( $brain ); # 100<br /><br /><br /><br /><hr><br /># 블럭 메소드 호출하기<br />use 5.010;<br />sub func {<br />&nbsp;&nbsp;&nbsp; my ( $block ) = @_;<br />&nbsp;&nbsp;&nbsp; $block-&gt;();<br />&nbsp;&nbsp;&nbsp; &amp;$block;&nbsp; # 이렇게도 호출~<br />}<br /><br />sub func2 {<br />&nbsp;&nbsp;&nbsp; $_[0]-&gt;();&nbsp; # 더 간단하게<br />&nbsp;&nbsp;&nbsp; &amp;{ $_[0] }; # 이렇게도 호출~<br />}<br /><br />my $block = sub { say "Block" };<br /><br />func($block);<br />func2($block);<br /><br /><br /><br /><hr><br />use strict;<br />use warnings;<br />use 5.010;<br /><br /># 메소드 호출테이블<br /><br />my $METHOD_TABLE = [ qw/a b c d/ ];<br /><br />sub a { say "sub a" }<br />sub b { say "sub b" }<br />sub c { say "sub c" }<br />sub d { say "sub d" }<br /><br />&amp;{$main::{$_}} for @{$METHOD_TABLE};<br /><br />$main::{$_}-&gt;() for @{$METHOD_TABLE};<br /><br />no strict 'refs';<br />foreach my $i ( 0 .. $#{$METHOD_TABLE} ) {<br />&nbsp;&nbsp;&nbsp; &amp;{ $METHOD_TABLE-&gt;[$i] };<br />}<br /><br />$_-&gt;() for @{$METHOD_TABLE};<br /><br />foreach my $func ( 'a' .. 'd' ) {<br />&nbsp;&nbsp;&nbsp; &amp;$func;<br />}<br /><br />foreach my $func ( 'a' .. 'd' ) {<br />&nbsp;&nbsp;&nbsp; $func-&gt;();<br />}<br /><br /># 이런식이 더 나은?<br /><br />my %METHOD_TABLE2 = (<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a =&gt; sub { say "sub a" },<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b =&gt; sub { say "sub b" },<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c =&gt; sub { say "sub c" },<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d =&gt; sub { say "sub d" },<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br /><br />$METHOD_TABLE2{$_}-&gt;() for 'a'..'d';<br /><br /><hr><br />참고:<br /><br /><a href="http://fingernailsinoatmeal.com/post/292301859/metaprogramming-ruby-vs-javascript">Ruby &amp; Javascript Metaprogramming</a><br /><a href="http://transfixedbutnotdead.com/2010/01/13/anyone_for_metaprogramming/">Perl 5 Metaprogramming</a><br /><a href="http://transfixedbutnotdead.com/2010/01/14/anyone-for-perl-6-metaprogramming/">Perl 6 Metaprogramming</a><br /><br /><br />]]>
        

    </content>
</entry>

<entry>
    <title>CPAN 으로 모듈설치시 의존모듈 자동설치하기</title>
    <link rel="alternate" type="text/html" href="http://aero.sarang.net/blog/2010/01/cpan-1.html" />
    <id>tag:aero.sarang.net,2010:/blog//1.150</id>

    <published>2010-01-03T14:29:16Z</published>
    <updated>2010-01-03T14:44:18Z</updated>

    <summary>Perl에서 CPAN모듈들을 설치할때 해당 모듈이 필요로 하는 모듈이 많을 경우...</summary>
    <author>
        <name>aero</name>
        <uri>http://aero.sarang.net/blog</uri>
    </author>
    
    <category term="perlcpanmoduleinstall" label="perl CPAN module install" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://aero.sarang.net/blog/">
        <![CDATA[Perl에서 CPAN모듈들을 설치할때 해당 모듈이 필요로 하는 모듈이 많을 경우 다음과 같이 기본적으로 설치할 것인지를 물어보는데 이런 모듈의 수가 많아지면 일일이 확인하며 yes를 해주기가 귀찮을 때가 많다. 특히나 Catalyst 웹프레임웍 같이 의존성을 많이 가지는 모듈일 경우는 더더욱..<br /><br />- Catalyst::Plugin::I18N ...loaded. (0.04)<br />[XMLRPC Support]<br />- Catalyst::Plugin::XMLRPC ...missing.<br />==&gt; Auto-install the 1 optional module(s) from CPAN? [y] y<br />[Pluggable Application Support]<br />- Catalyst::Plugin::Pluggable ...loaded. (0.04)<br />[DBIx::Class Support]<br />- Catalyst::Model::DBIC ...missing.<br />- Catalyst::Model::DBIC::Plain ...missing.<br />==&gt; Auto-install the 2 optional module(s) from CPAN? [y] y<br /><br />이럴때 물어보지 않고 필요할 모듈들을 자동으로 설치하려면 어떻게 해야 할까?<br /><br />방법은 크게 2가지가 있다.<br /><br />PERL__MM_USE_DEFAULT 환경변수를 1로 세팅하는 방법<br /><br />$ PERL_MM_USE_DEFAULT=1 cpan<br />cpan&gt; install Some::Module<br /><br />CPAN설정에서 prerequisites_policy 을 follow로 설정하는 방법<br /><br />$ cpan<br />cpan&gt; o conf prerequisites_policy follow<br />cpan&gt; o conf commit<br />cpan&gt; install Some::Module<br /><br /><br />참고:<br />http://sipb.mit.edu/doc/cpan/<br />http://stackoverflow.com/questions/898782/how-do-i-tell-cpan-to-install-all-dependencies<br /><br /><br /><br />  ]]>
        
    </content>
</entry>

<entry>
    <title>Perl Advent Calendar</title>
    <link rel="alternate" type="text/html" href="http://aero.sarang.net/blog/2009/12/perl-advent-calendar.html" />
    <id>tag:aero.sarang.net,2009:/blog//1.149</id>

    <published>2009-12-14T04:15:09Z</published>
    <updated>2009-12-15T01:05:01Z</updated>

    <summary> Perl 커뮤니티에는 매년 크리스마스 4주 전부터 Advent Calendar라는 것을...</summary>
    <author>
        <name>aero</name>
        <uri>http://aero.sarang.net/blog</uri>
    </author>
    
    <category term="perladventcalendar" label="perl advent calendar" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://aero.sarang.net/blog/">
        <![CDATA[<img src="http://nursery.apartmenttherapy.com/images/uploads/2007-11-26-advent.gif" height="281" width="281" />
<br /><br />Perl 커뮤니티에는 매년 크리스마스 4주 전부터 Advent Calendar라는 것을 만들어서 유용한 팁이나 정보들을 크리스마스 때까지 하나씩 올린다.<br /><br /><a href="http://ask.nate.com/qna/view.html?n=8774933">Advent Calendar란?</a><br /><br />올해도 어김없이 Perl 커뮤니티에서는 여러 Advent Calendar가 개설되어 재미있고 유용한 팁들을 올리고 있는데 정리해보면 다음과 같다.<br /><br /><a href="http://perladvent.pm.org/2009/">Perl Advent Calendar 2009</a><br /><br /><a href="http://perl6advent.wordpress.com/">Perl 6 Advent Calendar 2009</a><br /><br /><a href="http://www.catalystframework.org/calendar/2009">Catalyst Advent Calendar 2009</a><br /><br /><a href="http://advent.plackperl.org/">Plack Advent Calendar 2009</a><br /><br /><a href="http://advent.rjbs.manxome.org/">RJBS Advent Calendar 2009</a><br /><br /><a href="http://perl-users.jp/articles/advent-calendar/2009/">Japan Perl Advent Calendar 2009</a><br />네이버 일한번역으로 보기 <a href="http://j2k.naver.com/j2k_frame.php/korean/perl-users.jp/articles/advent-calendar/2009/">Japan Perl Advent Calendar 2009(일한번역)</a><br /><br /><a href="http://perlchina.org/advent/">China Perl Advent Calendar 2009</a><br /><br />보너스로 Perl과는 관계없지만(?) Perl Advent Calendar를 본딴<br /><br /><a href="http://sysadvent.blogspot.com/">System Administrator's Advent Calendar 2009</a><br /><br />매일매일 읽어보면 뼈와 살이 되는 내용들이 올라오니 많은 도움이 될듯~<br /><br />Korea Perl Advent Calendar는 언제쯤? - -;<br /><br />]]>
        
    </content>
</entry>

<entry>
    <title>Twitter 메시지 Google 번역기로 번역해서 보기</title>
    <link rel="alternate" type="text/html" href="http://aero.sarang.net/blog/2009/11/twitter-google.html" />
    <id>tag:aero.sarang.net,2009:/blog//1.148</id>

    <published>2009-11-23T11:33:33Z</published>
    <updated>2009-11-23T11:57:10Z</updated>

    <summary>Twitter를 하다 보면 전세계의 여러 언어들을 접하게 된다. 뭐 영어쯤은...</summary>
    <author>
        <name>aero</name>
        <uri>http://aero.sarang.net/blog</uri>
    </author>
    
    <category term="번역" label="번역" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="greasmonkey" label="greasmonkey" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="트위터" label="트위터" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="translation" label="translation" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="twitter" label="twitter" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://aero.sarang.net/blog/">
        <![CDATA[Twitter를 하다 보면 전세계의 여러 언어들을 접하게 된다. 뭐 영어쯤은 고등교육을 받은 사람이면 해석해서 이해하는데 별 무리가 없지만 그 이외의 언어들은 2외국어로 배우거나 따로 공부하지 않은 사람이면 이해하기 힘들다. 이럴때 인터넷상에 제공되는 각종 온라인 번역기를 사용할 수 있기는 하지만 번역페이지에 가서 원문을 긁어다 붙이는 등의 작업이 귀찮을 때가 많다.<br /><br />그러한 상황에서 편하게 Twitter메시지를 번역해서 볼 수 있는 유용한 스크립트를 소개하고자 한다.<br /><br />일단 브라우저는 Firefox를 사용하고 <a href="https://addons.mozilla.org/en-US/firefox/addon/748">Greasemonkey</a>라는 플러그인을 설치한 후 <a href="http://userscripts.org/scripts/show/43115">Twitter - Google Translate</a> 유저스크립트를 설치한다. (설치는 해당 페이지의 우측 상단의 Install 버튼을 누르면 바로 적용된다.)<br /><br />Greasemonkey 플러그인과 Twitter - Google Transelate 유저스크립트 설치가 끝났다면 Firefox 브라우저 우측하단에 원숭이 모양의 아이콘이 생성되어 있을 것이다. 원숭이 모양이 흑백이라면 Greasemonkey가 활성화 상태가 아니라는 의미이므로 마우스 왼쪽 버튼을 클릭하여 활성화/비활성화 시킬 수 있다.<br /><br />활성화된 상태에서 원숭이 모양의 아이콘에서 왼쪽 마우스 버튼을 누르면 뜨는 메뉴에서 "유저스크립트 관리"를 선택하면 새로운 대화창이 뜬다. 대화창 왼쪽 패널에서 Google Translate를 선택하고 왼쪽 하단의 편집 버튼을 누른후 스크립트 파일을 편집할 편집기를 지정하라는 파일 대화창이 뜨면 C:\windows 폴더로 이동하여 notepad.exe를 지정한다.(이것은 자기가 사용할 다른 에디터를 지정가능) 그러면 자바스크립트 파일이 열리는데 해당 자바스크립트 파일의 첫부분에<br /><br />var url = 'http://ajax.googleapis.com/ajax/services/language/translate?v=1.0',<br />&nbsp;&nbsp;&nbsp; langpair = '%7Cen',<br /><br />에서 번역이 한국어로 되게 하기위하여 langpair = '%7Cen' 을 langpair = '%7Cko' 로 바꾸고 저장한다. <br /><br />위 작업이 끝난 후 Twiiter에 접속하면 다음과 같이 각 메시지 옆에 번역 아이콘이 보이는데 ( t로 안보이고 작은 점으로 보이는 경우도 있음) 그 부분을 마우스로 클릭하면 구글 번역을 통해 자기가 지정한 언어로 번역된 메시지가 하단에 나타나게 된다.<br /><pre class="sh_javascript sh_sourceCode" id="source">  
<img src="http://static.jackhsu.com/greasemonkey/twitter-screenshot.jpg" />
</pre></br></br>
Happy Twitting!
]]>
        
    </content>
</entry>

<entry>
    <title>perl.org 싸이트 새단장</title>
    <link rel="alternate" type="text/html" href="http://aero.sarang.net/blog/2009/11/perlorg.html" />
    <id>tag:aero.sarang.net,2009:/blog//1.147</id>

    <published>2009-11-13T01:23:52Z</published>
    <updated>2009-11-13T01:48:59Z</updated>

    <summary>Perl의 대문 싸이트인 http://www.perl.org가 새단장 되었다.그동안 Perl싸이트들은 오래된 Perl의 역사만큼이나...</summary>
    <author>
        <name>aero</name>
        <uri>http://aero.sarang.net/blog</uri>
    </author>
    
    <category term="새단장" label="새단장" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="renewal" label="renewal" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://aero.sarang.net/blog/">
        <![CDATA[Perl의 대문 싸이트인 http://www.perl.org가 새단장 되었다.<br /><br />그동안 Perl싸이트들은 오래된 Perl의 역사만큼이나 그 외향이 현대적감각과 약간 동떨어진 정적이고 산만한 형태를 띄어서 사용자들에게 매력을 주지 못한점이 있었다.<br />&nbsp;이것을 두고 Perl 커뮤니티에서는 현대적감각에 뒤떨어지고 딱딱해보이는 싸이트들이 새로운 사용자들을 끌어들이는데 장애물이 된다라는 의견과 그런 껍데기를 치장하는데 노력을 쏟는 것은 여타 신진 언어들에서 보이는 fanboy들이나 하는 것이지 내실만 다지면 된다라는 의견이 분분했는데 결국에는 마케팅에 있어 적절한 포장도 중요하다는 결론에 이르른 것 같다.<br /><br />이미 <a href="http://news.perlfoundation.org/2009/10/the_perl_foundation_marketing.html">Perl Foundation에서는 마케팅전문가를 영입하여 Perl을 체계적으로 홍보하기위한 전략수립과 함께 전략을 행동으로 옮기고 있으며</a> 얼마전 리뉴얼한 Perl문서 싸이트 http://perldoc.perl.org 에 이어 Perl의 대표 대문 싸이트인 http://www.perl.org 가 재단장된 것도 다 이런한 작업의 연장선에 있다고 볼 수 있다.<br /><br />어떻게 바뀌었는지는 실제 비교해서 보자<br />(과거 싸이트는 http://www.archive.org 에서 가져옴)<br /><br />* http://perldoc.perl.org<br />&nbsp; <a href="http://web.archive.org/web/20080722175324/http://perldoc.perl.org/">과거</a>&nbsp; <a href="http://perldoc.perl.org/">현재</a><br /><br />* http://www.perl.rog&nbsp;&nbsp; <br />&nbsp; <a href="http://web.archive.org/web/20080618070015/http://www.perl.org/">과거</a>&nbsp; <a href="http://www.perl.org/">현재</a><br /><br /><br /><br /> ]]>
        
    </content>
</entry>

<entry>
    <title>Perl 미신 (개정판)</title>
    <link rel="alternate" type="text/html" href="http://aero.sarang.net/blog/2009/09/perl-10.html" />
    <id>tag:aero.sarang.net,2009:/blog//1.146</id>

    <published>2009-09-24T02:22:15Z</published>
    <updated>2009-09-24T02:38:45Z</updated>

    <summary>작년에 올린적이 있는 Tim Bunce씨의 자료 Perl Myth(펄 미신)의 내용을...</summary>
    <author>
        <name>aero</name>
        <uri>http://aero.sarang.net/blog</uri>
    </author>
    
    <category term="미신" label="미신" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="myth" label="Myth" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="Perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://aero.sarang.net/blog/">
        <![CDATA[작년에 올린적이 있는 <a href="http://www.oreillynet.com/pub/au/653">Tim Bunce</a>씨의 자료 <a href="http://aero.sarang.net/blog/2008/03/perl-4.html">Perl Myth(펄 미신)</a>의 내용을 갱신한 개정판 Perl Myth가 나왔다.<br /><br />더불어 <a href="http://ironman.enlightenedperl.org/">Planet Perl Iron Man</a> 의 RSS 구독하면 현대적 펄의 역동성을 느낄 수 있을 것이다.<br /><br />

<div style="width: 425px; text-align: left;" id="__ss_2044080"><a style="margin: 12px 0pt 3px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; display: block; text-decoration: underline;" href="http://www.slideshare.net/Tim.Bunce/perl-myths-200909" title="Perl Myths 200909">Perl Myths 200909</a><object style="margin: 0px;" height="355" width="425"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=perl-myths-200909-090922145348-phpapp01&amp;stripped_title=perl-myths-200909" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=perl-myths-200909-090922145348-phpapp01&amp;stripped_title=perl-myths-200909" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="525" width="640"></object><div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a style="text-decoration: underline;" href="http://www.slideshare.net/">documents</a> from <a style="text-decoration: underline;" href="http://www.slideshare.net/Tim.Bunce">Tim Bunce</a>.</div></div>]]>
        
    </content>
</entry>

<entry>
    <title>YAPC::Asia 2009</title>
    <link rel="alternate" type="text/html" href="http://aero.sarang.net/blog/2009/09/yapcasia-2009.html" />
    <id>tag:aero.sarang.net,2009:/blog//1.145</id>

    <published>2009-09-19T00:20:38Z</published>
    <updated>2009-09-19T00:32:59Z</updated>

    <summary> 참가자가 500명이 넘을정도의 세계최대의 Perl컨퍼런스로 성장한 YAPC::Asia 2009가 9월...</summary>
    <author>
        <name>aero</name>
        <uri>http://aero.sarang.net/blog</uri>
    </author>
    
    <category term="perl" label="Perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="yapc" label="YAPC" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="yapcasia" label="YAPC::Asia" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://aero.sarang.net/blog/">
        <![CDATA[<img src="http://conferences.yapcasia.org/ya2009/css/themes/ya2009/images/yapc2009_logo.gif" />
<br /><br />참가자가 500명이 넘을정도의 세계최대의 Perl컨퍼런스로 성장한 <a href="http://conferences.yapcasia.org/ya2009/">YAPC::Asia 2009</a>가 9월 10~11 일본 동경에서 개최되었다. 2008년도 YAPC::Asia에는 <a href="http://aero.sarang.net/blog/2008/05/yapc-asia-2008.html">직접 갔었는데</a> 이번에는 사정상 가보지 못해서 많이 아쉽다. 그래서 각종 자료들이나마 정리해본다.<br /><br /><a href="http://conferences.yapcasia.org/ya2009/">YAPC::Asia 2009 공식홈페이지</a><br /><br /><a href="http://www.google.com/translate?u=http%3A%2F%2Fd.hatena.ne.jp%2Fhiratara%2F20090911%2Fp2&amp;hl=ko&amp;ie=UTF8&amp;tl=ko&amp;sl=ja">YAPC::Asia 2009 후기 (구글 번역)</a><br /><br />YAPC::Asia 2009 사진<br /><a href="http://yapcasia2009.ficia.com/"> 사진자료1</a>, <a href="http://www.flickr.com/search/?q=yapcasia2009">사진자료2</a><br /><br />YAPC::Asia 2009 발표자료<br />&nbsp;<a href="http://www.slideshare.net/event/yapcasia-2009/slideshows">slideshare에 올려진 자료</a><br />&nbsp;<a href="http://www.dan.co.jp/%7Edankogai/yapcasia2009/perls.html">Dan Kogai씨의 Which Perl?</a><br /><br /> ]]>
        
    </content>
</entry>

<entry>
    <title>Monitoring Forge</title>
    <link rel="alternate" type="text/html" href="http://aero.sarang.net/blog/2009/09/monitoring-forge.html" />
    <id>tag:aero.sarang.net,2009:/blog//1.144</id>

    <published>2009-09-17T05:39:08Z</published>
    <updated>2009-09-17T06:09:26Z</updated>

    <summary> 각종 서버/네트웍 모니터링 시스템 및 각종 플러그인 정보를 모아놓은...</summary>
    <author>
        <name>aero</name>
        <uri>http://aero.sarang.net/blog</uri>
    </author>
    
    <category term="모니터링시스템" label="모니터링시스템" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="monitoringforge" label="Monitoring Forge" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="nagios" label="Nagios" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://aero.sarang.net/blog/">
        <![CDATA[ <img src="http://monitoringforge.org/themes/monitoring/images/gwlogo.gif" /><br /><br />각종 서버/네트웍 모니터링 시스템 및 각종 플러그인 정보를 모아놓은 새로운 사이트 <a href="http://monitoringforge.org/">Monitoring Forge</a> 란 싸이트가 오픈했다.<br /><br />모니터링 시스템은 아주 종류가 다양하고 지원 수준도 다양하기 때문에 인프라의 규모나 용도 및 요구사항을 잘 분석한다음 적절한 솔루션을 찾아야 한다. 그런 의미에서 다양한 정보를 모아서 보여주는 Monitoring Forge란 싸이트는 많은 도움이 될 수 있을 듯 하다.<br /><br />개인적으로는 이것 저것 많이 써봤지만 <a href="http://nagios.org/">Nagios</a>를 기반으로 하는 모니터링 시스템들이 가장 안정적이고 성능이 뛰어난 것 같다. 겉보기에는 번지르르한 모니터링 시스템들도  많지만 역시나 규모가 커지면 안정성과 성능이 못따라오는 경우가 많았다. 특히 Nagios의 Core와 <a href="http://nagios.sourceforge.net/docs/3_0/tuning.html">각종 최적화등을 위한 설정옵션</a>들을 보고 있자면 오랫동안 얼마나 다양한 상황에 대해서 고민하고 시행착오를 거치면서 만들어졌는지 느낄 수 있다.<br />]]>
        
    </content>
</entry>

<entry>
    <title>Perl 5.10.1 릴리즈</title>
    <link rel="alternate" type="text/html" href="http://aero.sarang.net/blog/2009/08/perl-5101.html" />
    <id>tag:aero.sarang.net,2009:/blog//1.143</id>

    <published>2009-08-24T05:27:13Z</published>
    <updated>2009-08-24T13:59:43Z</updated>

    <summary>2007년 12월 Perl 5.10 버젼( 드디어 Perl 5.10 출시 ,...</summary>
    <author>
        <name>aero</name>
        <uri>http://aero.sarang.net/blog</uri>
    </author>
    
    <category term="5101" label="5.10.1" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="android" label="android" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="출시" label="출시" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="Perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="release" label="Release" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://aero.sarang.net/blog/">
        <![CDATA[2007년 12월 Perl 5.10 버젼( <a href="http://aero.sarang.net/blog/2007/12/-perl-510.html">드디어 Perl 5.10 출시</a> , <a href="http://aero.sarang.net/blog/2007/12/perl-510-1.html">Perl 5.10 추가된 기능 정리</a> 참고 )이 나온지 20여 개월이 지난 2009년 8월 23일 Perl 5.10.1 버젼이 릴리즈 되었다.<br /><br /><a href="http://search.cpan.org/%7Edapm/perl-5.10.1/">Perl 5.10.1 릴리즈</a><br /><br />아직 production 환경에서 5.8.x 버젼대 Perl을 쓰는 곳도 많고 5.10버젼이 초창기 메모리 누수등 소소한 문제점들이 있어서 5.10.x 버젼으로 넘어가기를 꺼리는 사람들도 있었는데 이번에 안정적인 5.10.1 minor patch 버젼이 나와서 5.10.x 버젼대로의 이동이 가속화 되리라 생각된다. 자세한 변경사항은 <a href="http://search.cpan.org/%7Edapm/perl-5.10.1/pod/perl5101delta.pod">perl5101delta</a> 참고<br /><br /><br />perl 5.10.1을 자신의 홈 디렉토리에 독립적으로 설치하려면 다음과 같이 하면 된다.<br /><br />위 5.10.1릴리즈 링크에서 download 링크( http://search.cpan.org/CPAN/authors/id/D/DA/DAPM/perl-5.10.1.tar.gz )로 부터 perl-5.10.1.tar.gz 를 다운 받는다.<br /><br />$ tar zxvf perl-5.10.1.tar.gz<br />$ cd perl-5.10.1<br />$ ./Configure -de -Dprefix=${HOME}/perl/5.10.1/ -Dusethreads<br />$ make<br />$ make test<br />$ make install<br /><br />여기까지 오면 자신의 home디렉토리의 ~/perl/5.10.1 아래에 독립적인 Perl이 설치된다.<br /><br />그러면 다음 행을 .bashrc등에 넣고 재로그인 하거나 쉘상에서 실행시킨다. 그러면 perl 5.10.1 바이너리가 제일 우선순위를 가지게 된다. ( 만약<a href="http://aero.sarang.net/blog/2009/04/locallib-cpan.html"> local::lib 모듈</a>을 써서 추가된 환경변수가 있다면 지워주거나 .bashrc에서 임시로 주석을 넣어 적용되지 않도록 한다. )<br /><br />export PATH=${HOME}/perl/5.10.1/bin:$PATH<br /><br />다음과 같이 version을 확인<br /><br />$ perl -v<br /><br />This is perl, v5.10.1 (*) built for i686-linux<br /><br />Copyright 1987-2009, Larry Wall<br />....<br /><br />추가로 CPAN 사용환경을 자동으로 설정하려면<br />
<br />
$ PERL_MM_USE_DEFAULT=1 cpan Bundle::CPANxxl<br />
<br />
과 같이 명령을 내린다.<br /><br />이제 cpan 명령으로 필요한 모듈을 추가로 설치할 수 있다. 독립적인 Perl 5.10.1 환경에서 설치한 모듈은 ${HOME}/perl/5.10.1/ 아래의 적절한 경로에 설치된다.( Perl 배포폰 자체가 홈 디렉토리에 독립적으로 설치되었으므로 굳이 local::lib을 안써도 자신의 독립적인 환경이 보장 됨 ) <br /><br />다시 이전의 Perl환경으로 돌아가려면 PATH환경변수를 설정하는 줄을 주석걸고 local::lib을 사용한다면 주석걸었던 줄을 풀어주면 된다. 이런 식으로 마음대로 여러 Perl 환경을 바꿔가며 쓸 수 있다.<br /><br />Enjoy Perl 5.10.1<br /><br /><br /><br /><br />아 그리고 기쁜소식 하나더<br />Google Android에 스크립트 언어를 쓰기위한 환경인 ASE(Android Scripting Environment) 0.11 버젼에 Perl 지원이 추가되었다.<br /><br />참고: <a href="http://perlbuzz.com/2009/08/perl-coming-to-android-phones.html">Perl coming to Android phones</a><br /><br />본인이 시작한 <a href="http://code.google.com/p/android-scripting/issues/detail?id=32">청원</a>(?)이라 더 보람이 크다능...<br /><br />]]>
        
    </content>
</entry>

<entry>
    <title>Automating System Administration with Perl 서평</title>
    <link rel="alternate" type="text/html" href="http://aero.sarang.net/blog/2009/07/automating-system-administrati.html" />
    <id>tag:aero.sarang.net,2009:/blog//1.142</id>

    <published>2009-07-31T14:41:39Z</published>
    <updated>2009-07-31T16:10:19Z</updated>

    <summary>예전에 기대되는 Perl 신간 서적에서 Automating System Administrationwith Perl: Tools...</summary>
    <author>
        <name>aero</name>
        <uri>http://aero.sarang.net/blog</uri>
    </author>
    
    <category term="book" label="Book" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="서평" label="서평" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="책" label="책" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="Perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="systemadministration" label="System Administration" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://aero.sarang.net/blog/">
        <![CDATA[예전에 <a href="http://aero.sarang.net/blog/2009/03/-perl-4.html">기대되는 Perl 신간 서적</a>에서 <br /><br /> <img src="http://ecx.images-amazon.com/images/I/51edGImXZbL._SS500_.jpg" /><br /><br /><br /><a href="http://www.amazon.com/Automating-System-Administration-Perl-Efficient/dp/059600639X">Automating System Administration</a><a href="http://www.amazon.com/Automating-System-Administration-Perl-Efficient/dp/059600639X">with Perl: Tools to Make You More Efficient</a> 란 책에 대해서 언급한적이 있는데 오늘 책을 구해서 대강 훑어보았다.<br /><br />이번 2판이 1판과 다른 점은 내용이 보강된 점도 있지만 가장 큰 변화는 뭐니뭐니해도 Perl 코드 형식이 최신경향으로 전부 바뀌었다는 점이다. Perl은 범용언어이지만 시스템관리 쪽에서도 많이 쓰여왔는데 특히 시스템관리쪽 코드들은 과거 Perl 4시절 코드형태를 띄는 경우가 많으며 요즘도 그런 식으로 Perl 코딩하는 사람들을 종종 본다. 일례로 1판과 2판의 같은 기능을 하는 코드를 비교해보자.<br /><br /><font style="font-size: 1.25em;"><b>&lt;1판 코드&gt;</b></font><br /><br />use User::pwent;<br /><br />$shells = "/etc/shells";<br />open (SHELLS,$shells) or die "Unable to open $shells:$!\n";<br />while(&lt;SHELLS&gt;){<br />&nbsp;&nbsp;&nbsp; chomp;<br />&nbsp;&nbsp;&nbsp; $okshell{$_}++;<br />}<br />close(SHELLS);<br /><br />while($pwent = getpwent()){<br />&nbsp;&nbsp; warn $pwent-&gt;name." has a bad shell (".$pwent-&gt;shell.")!\n"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unless (exists $okshell{$pwent-&gt;shell});<br />}<br />endpwent();<br /><br /><br /><b><font style="font-size: 1.25em;">&lt;2판 코드&gt;</font></b><br /><br />use User::pwent;<br /><br />my $shells = '/etc/shells';<br />open my $SHELLS, '&lt;', $shells or die "Unable to open $shells:$!\n";<br /><br />my %okshell;<br />while (&lt;$SHELLS&gt;) {<br />&nbsp;&nbsp;&nbsp; chomp;<br />&nbsp;&nbsp;&nbsp; $okshell{$_}++;<br />}<br />close $SHELLS;<br />while ( my $pwent = getpwent() ) {<br />&nbsp;&nbsp;&nbsp; warn $pwent-&gt;name . ' has a bad shell (' . $pwent-&gt;shell . ")!\n"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unless ( exists $okshell{ $pwent-&gt;shell } );<br />}<br />endpwent();<br /><br /><br />현대 Perl코드는 거의 필수적으로 strict와 warnings 프래그마를 사용하여<br /><br />#!/usr/bin/perl<br />use strict;<br />use warnings;<br /><br />로 코드를 시작한다. 1판의 소스에서 이 두 줄을 추가한다면 $shell = "/etc/shells"; 에서부터<br /><br />Global symbol "$shells" requires explicit package name at ... <br /><br />이런 에러가 나면서 동작하지 않을 것이다. 보통 여기서 strict와 warnings를 쓰라고 하는 건 어디서 들어본 것 같은데 쓰면 변수선언부터 에러가 나고 my는 서브루틴 같은 곳에서 렉시컬 변수로 쓴다고 대강 알고 있지만 이것이 정확히 뭘 의미하는지 모르니 1판 같은 소스를 계속 쓰게 되는 악순환을 겪게 된다. 2판의 소스도 strict와 warnings 프래그마를 넣지는 않았지만 넣어도 완벽하게 아무런 문제를 일으키지 않고 동작하는 코드이다. 특히 전역변수랍치고 $shells = "/etc/shells"; 이런 식으로 my,our,local같은 변수 범위선언자를 붙이지 않고 변수를 선언해서 사용하는 Perl코드를 쓰는 사람을 보면 이 사람 Perl 기초를 제대로 이해하지 못하고 나도는 예제코드들 보고 대강 베껴 쓰는구나 하고 생각하게 된다.<br /><br />1판 소스가 어떻게 2판 소스처럼 바뀌게 되는지 알고 싶으면 <a href="http://aero.sarang.net/presentation/kpw2008_new_perl/">최신 스타일 Perl로 개과천선하기</a>를 읽어보시고 이제 제발 1판 같은 Perl코드는 양산하지 말아 주셨으면 좋겠다.<br /><br />하지만 2판에서도 최신경향 Perl방식을 따르지 않는 부분이 간혹 있는데 그것은 다음과 같은 객체의 메소드를 호출하는 방법이다.<br /><br />use Win32::Perms;<br />$acl&nbsp; = new Win32::Perms();<br /><br />위 코드는 Win32::Perms라는 객체를 간접호출 방식으로 생성하는 코드인데 마치 Java,C++의 new생성자와 유사한 형식이라 익숙해 보일 수도 있지만 Perl에서는 여러 가지 side effect를 회피하기 위해 다음과 같이 직접호출 방식을 쓰는 게 좋으며 그것이 최신 형식이다.<br /><br />use Win32::Perms;<br />my $acl&nbsp; = Win32::Perms-&gt;new();<br /><br />Perl OOP에 관한 내용은 <a href="http://aero.sarang.net/presentation/New_Perl_OOP.pdf">새로운 Perl OOP로 개과천선하기</a>를 참고<br /><br /><br />이상 코드형식에 대해서 얘기했지만, 2판은 요즘 새롭게 등장한 Windows용 <a href="http://strawberryperl.com/">Strawberry Perl</a>도 언급하는 등 Perl의 최신정보들을 최대한 반영하려는 노력을 보이고 있으며 1판에 비해 시스템관리 전 영역에 걸쳐 많은 내용이 보강되었고 Perl이 다양한 플랫폼에 포팅된 언어 인만큼 UNIX/LINUX뿐만 아니라 Windows 플랫폼에 관해서도 많은 부분을 할애하여 Perl을 플랫폼을 가리지 않는 시스템관리용 언어로 사용할 수 있도록 배려하고 있다.<br /><br />책이 포함하고 있는 자세한 내용은 다음과 같으며<br /><br />&nbsp;&nbsp;&nbsp; * Manage user accounts<br />&nbsp;&nbsp;&nbsp; * Monitor filesystems and processes<br />&nbsp;&nbsp;&nbsp; * Work with configuration files in important formats such as XML and YAML<br />&nbsp;&nbsp;&nbsp; * Administer databases, including MySQL, MS-SQL, and Oracle with DBI<br />&nbsp;&nbsp;&nbsp; * Work with directory services like LDAP and Active Directory<br />&nbsp;&nbsp;&nbsp; * Script email protocols and spam control<br />&nbsp;&nbsp;&nbsp; * Effectively create, handle, and analyze log files<br />&nbsp;&nbsp;&nbsp; * Administer network name and configuration services, including NIS, DNS and DHCP<br />&nbsp;&nbsp;&nbsp; * Maintain, monitor, and map network services, using technologies and tools such as SNMP, nmap, libpcap, GraphViz and RRDtool<br />&nbsp;&nbsp;&nbsp; * Improve filesystem, process, and network security <br /><br />This edition includes additional appendixes to get you up to speed on technologies such as XML/XPath, LDAP, SNMP, and SQL. With this book in hand and Perl in your toolbox, you can do more with less -- fewer resources, less effort, and far less hassle.<br /><br />시스템관리자 뿐만 아니라 개발자들에게도 시스템을 이해하는데 아주 도움이 되는 책이라고 생각한다.<br />

]]>
        
    </content>
</entry>

<entry>
    <title>ssh를 socks proxy를 통해서 접속하기</title>
    <link rel="alternate" type="text/html" href="http://aero.sarang.net/blog/2009/07/ssh-socks-proxy.html" />
    <id>tag:aero.sarang.net,2009:/blog//1.141</id>

    <published>2009-07-29T14:57:57Z</published>
    <updated>2009-07-30T02:38:06Z</updated>

    <summary>JEEN님의 [ SSH ] .ssh/config 에 대해서... 라는 블로그 포스팅을...</summary>
    <author>
        <name>aero</name>
        <uri>http://aero.sarang.net/blog</uri>
    </author>
    
    <category term="connect" label="connect" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="proxy" label="proxy" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="socks" label="socks" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="socksify" label="socksify" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ssh" label="ssh" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://aero.sarang.net/blog/">
        <![CDATA[JEEN님의 <a href="http://jeen.tistory.com/entry/SSH-sshconfig-%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C">[ SSH ] .ssh/config 에 대해서...</a> 라는 블로그 포스팅을 보고 뭔가 복잡한 것 같아 윈도우용 ssh클라이언트인 putty에서 socks proxy를 지정해서 ssh접속하는 기능이 생각나서 LINUX의 일반 ssh 명령에서는 어떻게 사용할까 궁금해서 여러자료를 찾아서 시도해봤다.<br /><br />JEEN님의 문제는 A,B 서버가 있다면 B서버는 A서버를 통해서만 접속할 수 있어서 편리하게 B서버에 접속하고 싶다는 것인데 JEEN님의 방법은 ssh설정을 사용해서 B서버에 접속을 하면 차례로 A,B 서버 인증을 거치며 들어가는 것이다.<br /><br />하지만 A가 proxy서버의 역할을 한다면 A서버를 proxy로 지정하고 B에 접속하면 B에 대한 인증만 통과하면 된다. 그럼 먼저 A를 proxy서버 역할을 하도록 ssh의 Dynamic Port Forwarding기능을 이용하여 다음처럼<br /><br />ssh -N -D localhost:8888 user@hostA<br /><br />명령을 내리면 password를 물어보는데 password를 입력하여&nbsp; A서버에 로그인한 상태가 되고나면 이제 localhost의 8888 포트(포트는 마음대로 바꿔도 됨)는 A서버와 ssh채널로 이어져서 proxy처럼(socks4, socks5 proxy프로토콜을 지원한다.) 동작하기 때문에 이것을 proxy로 지정한 모든 접속은 ssh연결을 통해 A서버를 통해서 나가게 된다.<br /><br />그러면 이제 proxy를 지정하고 B서버에 접속하려고 하면 실제 접속은 A서버를 통해서 이루어지게 될 것이므로 문제 없이 접속될 것이다.<br /><br />여기서 일반적인 ssh명령이 proxy( localhost:8888 )를 사용하게 하려면 어떻게 할까?<br /><br />먼저 connect라는 유틸리티를 <a href="http://bent.latency.net/bent/darcs/goto-san-connect-1.85/src/connect.html">여기</a>서 받은 다음 gcc -o connect connect.c 로 컴파일하고 컴파일된 connect 바이너리를 path가 잡힌곳에 복사한다. 그 다음<br /><br />ssh -o "ProxyCommand connect -5 -S localhost:8888 %h %p" user@hostB<br /><br />처럼 명령을 내리면 proxy(ssh채널로 이어진 A서버)를 통해서 B서버로 접속하게 된다.<br /><br />(옵션들의 사용법과 동작방식은 메뉴얼에 다 잘 나와있으므로 자세한 설명은 생략...)<br /><br /><br /><br /><font style="font-size: 1.25em;"><b>추가:</b></font><br />connect를 사용해서 proxy를 지정하는 방법은 별도의 shell 스크립트를 만들거나 ssh설정에 미리 넣어놓을 수 있지만 약간 번거로운 감이 있다. 이때는 dante( http://www.inet.no/dante/ )라는 socks서버에 포함되어 있는 socksify라는 명령을 이용해서도 socks proxy를 통해서 ssh접속을 할 수 있다. ubuntu라면 sudo apt-get install dante-client 로 패키지를 설치하고 나면 socksify라는 명령도 같이 설치된다. socksify가 사용하는 proxy를 지정하기 위해서는 /etc/dante.conf 파일을 열어 다음 내용을 추가해준다.<br /><br />route {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from: 0.0.0.0/0&nbsp;&nbsp; to: 0.0.0.0/0&nbsp;&nbsp; via: 127.0.0.1 port = 8888<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protocol: tcp udp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # server supports tcp and udp.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxyprotocol: socks_v4 socks_v5 # server supports socks v4 and v5.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method: none #username&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # we are willing to authenticate via<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # method "none", not "username".<br />}<br /><br />설정이 어떤 의미를 가지는지는 주석이 다 설명해주고 있으므로 패스~<br /><br />이제<br /><br />socksify ssh user@hostB<br /><br />라고 명령을 내리면 socksify뒤에 오는 명령이 접속하려는 네트웍접속은 후킹되어서 자동으로 socks proxy를 통해서 나가게 된다. socksify는 ssh뿐만 아니라 기본으로 proxy설정을 지원하지 않는 어플리케이션에도&nbsp; 모두 사용할 수 있다는 장점이 있다.<br />]]>
        
    </content>
</entry>

<entry>
    <title>Shebang Line을 바로쓰자</title>
    <link rel="alternate" type="text/html" href="http://aero.sarang.net/blog/2009/07/shebang-line.html" />
    <id>tag:aero.sarang.net,2009:/blog//1.140</id>

    <published>2009-07-27T06:26:43Z</published>
    <updated>2009-07-27T08:28:01Z</updated>

    <summary>보통 UNIX Shell Script를 만들 때 파일의 첫 줄에#!/bin/sh처럼 넣는...</summary>
    <author>
        <name>aero</name>
        <uri>http://aero.sarang.net/blog</uri>
    </author>
    
    <category term="perl" label="Perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="shebangline" label="Shebang Line" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="windows" label="Windows" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://aero.sarang.net/blog/">
        <![CDATA[보통 UNIX Shell Script를 만들 때 파일의 첫 줄에<br /><br />#!/bin/sh<br /><br />처럼 넣는 것을 <a href="http://en.wikipedia.org/wiki/Shebang_%28Unix%29">shebang line</a>이라고 한다.<br /><br />이것은 어떤 스크립트파일이 실행될 수 있도록 권한을 주고 해당 스크립트를 실행시켰을 때 shebang line 이후의 줄들을 어떤 명령이 해석할 것인가를 지정해주는 것으로 Perl같은 동적 스크립트언어( Python,Ruby도 마찬가지)에도 마찬가지로 다음과 같이 적용된다.<br /><br />&lt;test.pl&gt;<br />#!/usr/bin/perl<br />print "Hello World\n";<br /><br />&lt;실행&gt;<br />chmod a+x test.pl<br />./test.pl<br /><br />만약에 shebang line이 없는 상태에서 적절한 해석기를 통해 실행시키려면<br /><br />perl test.pl<br /><br />처럼 [스크립트해석기] [스크립트] 형식으로 명령을 실행시켜야 할 것이다. 이 경우에는 해석기를 지정하여 스크립트를 실행시키므로 스크립트 파일에 굳이 shebang line을 쓸 필요가 없다.<br /><br />그런데 가끔 보면 Windows용 Perl ( <a href="http://www.activestate.com/activeperl/">Activestate Perl</a> 또는 <a href="http://strawberryperl.com/">Strawberry Perl</a> )을 사용해서 Perl 프로그래밍 하는 사람들이 <br /><br />#!C:/Perl/bin/perl.exe<br /><br />print "Hello World\n";<br /><br />이런식으로 UNIX에서 했던 것과 같이 perl실행파일이 있는 Windows 드라이브 상의 path를 그대로 요상한 모양으로 적어주는 경우를 종종 보는데, 간단히 결론만 말하자면 Windows에서는 shebang line은 아무런 의미가 없다.<br /><br />스크립트를 Perl을 통해 실행시키고자 하면 unix에서와 마찬가지로 perl 바이너리가 path에 잡혀 있다면<br /><br />perl test.pl<br /><br />하면 실행된다. 그럼 unix에서 스크립트 파일을 실행가능하도록 해서 스크립트 파일이름만으로 실행되게 하려면 어떻게 해야할까?<br /><br />방법은 단지 Windows가 특정확장자의 파일을 어떤 실행파일을 통해서 열 것인가를 지정하는 기능을 사용하는 것이다.( txt파일을 더블클릭하면 notepad가 실행되며 파일이 열리는 것을 떠올리면 됨 ) 이것은 파일탐색기 메뉴를 통해서 설정할 수도 있고 다음과 같은 dos명령을 통해서도 설정할 수 있다.<br /><br />ASSOC .pl=PerlScript<br />FTYPE PerlScript=C:\strawberry\perl\bin\perl.exe %1 %*<br /><br />하지만 개인적으로 Windows에서 이런 식으로 사용하는 건 별로 좋아하지 않는다.<br /><br />다시 말하면 Windows에서 shebang line은 단지 장식용(?)일 뿐이다. 따라서 응용력을 과도하게 발휘해서 이상한 모양의 shebang line을 쓰지말고 나중에 UNIX에 가져가서라도 그냥 쓸 수 있게 보통 UNIX에서 하던 것처럼 그냥&nbsp; #!/usr/bin/perl 이라고 해주자.<br /><br />그런데 UNIX에서도 shebang line이 꼭 #!/usr/bin/perl 일 필요는 없다. 대게는 UNIX에서 기본으로 perl 바이너리가 /usr/bin에 있기 때문에 저렇게 쓰는 것이지 만약에 자신만의 Perl을 소스를 받아서 따로 컴파일해서 /usr/local/bin/perl 에 깔았고 그 Perl을 이용하고 싶으면&nbsp; shebang line을&nbsp; #!/usr/local/bin/perl 이라고 지정하면 된다.<br /><br />그런데 시스템에 여러 종류의 Perl이 존재할 경우 필요할 때마다 shebang line을 변경하는 것은 매우 귀찮은 일일 것이다. 이런 경우에는 스크립트 소스는 건드리지 않고 PATH 환경변수만 적절하게 바꿔서 유연하게 사용할 수 있는 방법이 있다.<br /><br />사용하고 싶은 Perl 바이너리가 있는 경로를 PATH환경변수에 세팅하고 ( 만약 perl 바이너리가 PATH환경변수의 여러 곳에 있다면 예- /usr/local/bin, /usr/bin PATH환경변수에 먼저 나오는 것이 우선된다. )<br /><br />#!/usr/bin/env perl<br /><br />이라고 shebang line을 적어주면 PATH환경변수에서 가장 우선되는 perl 바이너리를 찾아 스크립트를 실행한다.<br /><br />여기서 env는 뒤따르는 명령의 수정된 환경변수를 스크립트 해석시 적용하는 명령이다. perl은 컴파일되서 설치될 때 자신만의 고유의 라이브러리 경로등의 정보를 가지는데, 따라서 어떤 perl 바이너리가 실행되느냐에 따라 그러한 정보들이 다르게 적용되므로 env를 통해서 실제 실행되는 바이너리의 환경을 자동으로 적용될 수 있게 해주는 것이다.<br /><br /> ]]>
        
    </content>
</entry>

</feed>
