<?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-08-06T02:13:21Z</updated>
    <subtitle>Perl, System Architecture, etc.</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.21-en</generator>

<entry>
    <title>드디어 Perl 6 출시 !!</title>
    <link rel="alternate" type="text/html" href="http://aero.sarang.net/blog/2010/07/-perl-6.html" />
    <id>tag:aero.sarang.net,2010:/blog//1.161</id>

    <published>2010-07-29T14:21:11Z</published>
    <updated>2010-08-06T02:13:21Z</updated>

    <summary>2010년 7월 29일 약속대로 Perl 6 ( http://perl6.org/ )의 Parrot...</summary>
    <author>
        <name>aero</name>
        <uri>http://aero.sarang.net/blog</uri>
    </author>
    
    <category term="perlperl6rakudo" label="perl perl6 rakudo" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://aero.sarang.net/blog/">
        <![CDATA[<p>2010년 7월 29일 약속대로 Perl 6 ( <a href="http://perl6.org/" title="http://perl6.org/">http://perl6.org/</a> )의 Parrot ( <a href="http://www.parrot.org/" title="http://www.parrot.org/">http://www.parrot.org/</a> ) 위의 구현인<br />
Rakudo ( <a href="http://rakudo.org/" title="http://rakudo.org/">http://rakudo.org/</a> )의 첫 공식릴리즈<br />
Rakudo Star 가 릴리즈 되었습니다.</p>

<p>참고: <a href="http://rakudo.org/node/75" title="http://rakudo.org/node/75">http://rakudo.org/node/75</a></p>

<p>Perl 6는 2010년 7월 16일 말이 나온지 10년째 되는 생일을 맞았고<br />
( Perl 6의 비하인드 스토리: <a href="http://use.perl.org/%7Emasak/journal/40451" title="http://use.perl.org/~masak/journal/40451">http://use.perl.org/~masak/journal/40451</a> )<br />
Perl의 창시자 Larry Wall은 그동안 Perl 6는 언제 나오냐? 는 질문을 받으면<br />
항상 다음 크리스마스에 나온다고 농담삼아 얘기하곤 했었는데<br />
결국 Rakudo Star가 릴리즈 되면서 Perl 6를 기다리던 사람들은<br />
한여름의 크리스마스를 맞게 되었습니다. :)</p>

<p>이번에 출시된 Rakudo Star는 Stable이라는 이름을 달지 않고<br />
a useful, usable, "early adopter" 라는 이름을 달고 출시되었습니다.<br />
이것은 완벽함을 끊임없이 기다리기 보다는 적정한 선에서 선보이고<br />
피드백을 받아들여 개선해나가는 전략이 낫다는 판단에서 나오지 않았나 생각됩니다.</p>

<p>Perl 6가 어떻게 동작하는지를 보고싶으면 다음의 링크들을 참고하시면 됩니다.</p>

<p><a href="http://szabgab.com/perl6.html" title="http://szabgab.com/perl6.html">http://szabgab.com/perl6.html</a></p>

<p><a href="http://j2k.naver.com/j2k_frame.php/korean/d.hatena.ne.jp/uasi/20100730/1280419166" title="http://j2k.naver.com/j2k_frame.php/korean/d.hatena.ne.jp/uasi/20100730/1280419166">http://j2k.naver.com/j2k_frame.php/korean/d.hatena.ne.jp/uasi/20100730/1...</a></p>

<p><a href="http://j2k.naver.com/j2k_frame.php/korean/d.hatena.ne.jp/uasi/20100730/1280472169" title="http://j2k.naver.com/j2k_frame.php/korean/d.hatena.ne.jp/uasi/20100730/1280472169">http://j2k.naver.com/j2k_frame.php/korean/d.hatena.ne.jp/uasi/20100730/1...</a></p>

<p><a href="http://daniel.carrera.bz/2009/06/perl-6-and-the-josephus-problem/" title="http://daniel.carrera.bz/2009/06/perl-6-and-the-josephus-problem/">http://daniel.carrera.bz/2009/06/perl-6-and-the-josephus-problem/</a></p>

<p><a href="http://perl6advent.wordpress.com/" title="http://perl6advent.wordpress.com/">http://perl6advent.wordpress.com/</a></p>

<p><a href="http://github.com/perl6/book/downloads" title="http://github.com/perl6/book/downloads">http://github.com/perl6/book/downloads</a></p>

<p><a href="http://en.wikibooks.org/wiki/Perl_6_Programming" title="http://en.wikibooks.org/wiki/Perl_6_Programming">http://en.wikibooks.org/wiki/Perl_6_Programming</a></p>

<p><a href="http://www.perlfoundation.org/perl6/index.cgi" title="http://www.perlfoundation.org/perl6/index.cgi">http://www.perlfoundation.org/perl6/index.cgi</a></p><p><a href="http://www.perlfoundation.org/perl6/index.cgi" title="http://www.perlfoundation.org/perl6/index.cgi"><br /></a></p>]]>
        
    </content>
</entry>

<entry>
    <title>윈도우 cmd.exe가 싫어요! ckw</title>
    <link rel="alternate" type="text/html" href="http://aero.sarang.net/blog/2010/05/-cmdexe-ckw.html" />
    <id>tag:aero.sarang.net,2010:/blog//1.160</id>

    <published>2010-05-28T02:28:52Z</published>
    <updated>2010-05-29T05:52:22Z</updated>

    <summary>윈도우즈를 사용하다 보면 제일 마음에 안 드는 것 중 하나가...</summary>
    <author>
        <name>aero</name>
        <uri>http://aero.sarang.net/blog</uri>
    </author>
    
    <category term="cmdexewindowsckw대체품" label="cmd.exe windows ckw 대체품" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://aero.sarang.net/blog/">
        <![CDATA[윈도우즈를 사용하다 보면 제일 마음에 안 드는 것 중 하나가 바로 cmd.exe이다.<br /><br />마우스로 싸이즈를 마음대로 조정하기 힘들고( 가로 크기는 마우스로 늘어나지 않고 설정에서 수동으로 바꿔야 함) 폰트설정에도 기본적으로 제한이 있으며 다른 터미널 프로그램 처럼 투명한 효과를 못낸다든지 등등 마음에 안 드는게 한 두 가지가 아니다.<br /><br />그래서 항상 cmd.exe를 linux의 터미널 처럼 좀 유연하고 말랑말랑한 느낌으로 쓸 수 없는가를 고민해오다 msys의 rxvt등으로 대체하거나 다른 cmd대체 프로그램들을 시도 해보았으나 썩 마음에 들지 않아 다시 울며 겨자먹기로 cmd.exe로 복귀하곤 했다.<br /><br />하지만 인터넷을 서핑하다 우연히 정말 마음에 드는 cmd.exe 대체품을 찾게 되었다.<br /><br />그 이름은 ckw라고 하는 것으로 일본에서 rxvt에서 가상 unix환경 부분등은 빼버리고 꼭 필요한 부분만 빼서 cmd.exe와 호환되게 만든 것이다.<br /><br />참고: http://d.hatena.ne.jp/hideden/20071115/1195229532<br /><br />여기서 제일 아래의 <a href="http://hideden.net/pub/ckw-0.8.10-mod-bin.zip">ckw-0.8.10-mod-bin.zip</a> 를 받고 압축을 푼다.<br /><br />그 다음 ckw.exe를 실행시키면 cmd.exe를 대체할 창이 뜬다. 이 창은 마우스로 자유롭게 크기를 조절할 수 있으며 마우스 버튼을 통한 copy &amp; paste가 가능하고 Vista부터 막혀버린 기능인 탐색기에서 특정한 폴더를 끌어 창위로 가져오면 해당 폴더 경로가 자동으로 복사되는 기능등이 동작한다.<br /><br />본인은 좀 더 예쁘게 쓰기 위해 ckw.cfg 파일을 다음과 같이 수정했다.<br />일단 구글에서 <a href="http://www.google.co.kr/search?q=Bitstream+Vera+Sans+Mono+%B8%BC%C0%BA%B0%ED%B5%F1">"Bitstream Vera Sans Mono 맑은고딕"으로 검색</a>하면 나오는 내가 제일 좋아하는 고정폭 폰트인 Bitstream Vera Sans Mono + 맑은고딕 합성폰트를 받아 설치한 다음<br /><br />설정을 다음과 같이 고쳤다.<br /><br />!<br />! ckw setting<br />!<br /><br />Ckw*foreground: white<br />Ckw*background: midnightblue<br />Ckw*cursorColor:&nbsp;&nbsp;&nbsp;&nbsp; green<br />Ckw*cursorImeColor:&nbsp; red<br />!Ckw*backgroundBitmap: ckw_background.bmp<br /><br />Ckw*title: ckw[cmd]<br />Ckw*exec:&nbsp; cmd.exe<br />Ckw*chdir: c:\<br /><br />Ckw*scrollHide:&nbsp; no<br />Ckw*scrollRight: yes<br />Ckw*internalBorder: 1<br />Ckw*lineSpace: 0<br />Ckw*topmost: no<br />Ckw*transp: 220<br />Ckw*transpColor: #000000<br /><br />Ckw*font: Bitstream Vera Sans Mono<br />Ckw*fontSize: 12<br /><br />Ckw*geometry:&nbsp; 80x26<br />Ckw*saveLines: 5000<br /><br />Ckw*color0:&nbsp; #000000<br />Ckw*color1:&nbsp; #000080<br />Ckw*color2:&nbsp; #008000<br />Ckw*color3:&nbsp; #008080<br />Ckw*color4:&nbsp; #800000<br />Ckw*color5:&nbsp; #800080<br />Ckw*color6:&nbsp; #808000<br />Ckw*color7:&nbsp; #C0C0C0<br /><br />Ckw*color8:&nbsp; #808080<br />Ckw*color9:&nbsp; #0000FF<br />Ckw*color10: #00FF00<br />Ckw*color11: #00FFFF<br />Ckw*color12: #FF0000<br />Ckw*color13: #FF00FF<br />Ckw*color14: #FFFF00<br />Ckw*color15: #FFFFFF<br /><br /><br /><br />다음은 위 설정을 적용한 ckw 동작화면이다.<br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="ckw.png" src="http://aero.sarang.net/blog/2010/05/28/ckw.png" class="mt-image-none" style="" height="472" width="695" /></span><br /><div><br /><br />정말 알흠답지 아니한가?&nbsp; T_T<br /><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>로컬 POD 문서 Viewer 열전</title>
    <link rel="alternate" type="text/html" href="http://aero.sarang.net/blog/2010/05/-pod-viewer.html" />
    <id>tag:aero.sarang.net,2010:/blog//1.159</id>

    <published>2010-05-09T06:50:21Z</published>
    <updated>2010-05-09T07:18:57Z</updated>

    <summary>Perl에는 POD라고 하는 나름대로의 문서포멧이 있다. 그래서 CPAN의 모든 모듈은...</summary>
    <author>
        <name>aero</name>
        <uri>http://aero.sarang.net/blog</uri>
    </author>
    
    <category term="document" label="document" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="pod" label="pod" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="server" label="server" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://aero.sarang.net/blog/">
        <![CDATA[Perl에는 POD라고 하는 나름대로의 문서포멧이 있다. 그래서 CPAN의 모든 모듈은 내부적으로 POD문서를 포함하는데 이것을 보는 방법은 여러가지다. 제일 간단한 것이 명령행에서 그냥 다음과 같이<br /><br />$ perldoc DateTime<br /><br />처럼 perldoc 명령 뒤에 모듈이름을 적어주면 text로 포멧팅해서 보여주긴 하지만 예쁘게 포멧팅된 HTML문서에 비하면 보기에 썩 좋지 않다. 그래서 보통 모듈 문서를 볼 때 http://search.cpan.org 에 가서 해당 모듈을 검색해서 거기서 문서를 보곤 하는데 인터넷이 연결되지 않거나 할 경우 로컬에서도 HTML로 예쁘게 포멧팅된 문서를 보고 싶다면 어떻게 해야 할까?<br /><br />다행이도 이미 CPAN에는 설치되어 있는 문서들을 심플한 로컬웹서버를 띄워 로컬로 접속해서&nbsp; HTML로 예쁘게 볼 수 있게 해주는 간단한 툴들이 이미 몇가지가 있다. 그것들을 나열해보면<br /><br /><a href="http://search.cpan.org/dist/Perldoc-Server/">Perldoc::Server</a><br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://aero.sarang.net/blog/assets_c/2010/05/Perldoc-Server2.html" onclick="window.open('http://aero.sarang.net/blog/assets_c/2010/05/Perldoc-Server2.html','popup','width=1440,height=900,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://aero.sarang.net/blog/assets_c/2010/05/Perldoc-Server-thumb-800x500.png" alt="Perldoc-Server.png" class="mt-image-none" style="" height="500" width="800" /></a></span><br /><br /><br /><a href="http://search.cpan.org/dist/Pod-Browser/">Pod::Browser</a><br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://aero.sarang.net/blog/assets_c/2010/05/Pod-Browser.html" onclick="window.open('http://aero.sarang.net/blog/assets_c/2010/05/Pod-Browser.html','popup','width=1440,height=900,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://aero.sarang.net/blog/assets_c/2010/05/Pod-Browser-thumb-800x500.png" alt="Pod-Browser.png" class="mt-image-none" style="" height="500" width="800" /></a></span><br /><br /><br /><a href="http://search.cpan.org/dist/Pod-POM-Web/">Pod::POM::Web</a><br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://aero.sarang.net/blog/assets_c/2010/05/Pod-POM-Web.html" onclick="window.open('http://aero.sarang.net/blog/assets_c/2010/05/Pod-POM-Web.html','popup','width=1440,height=900,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://aero.sarang.net/blog/assets_c/2010/05/Pod-POM-Web-thumb-800x500.png" alt="Pod-POM-Web.png" class="mt-image-none" style="" height="500" width="800" /></a></span><br /><br /><a href="http://search.cpan.org/dist/Pod-Server/">Pod::Server</a><br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://aero.sarang.net/blog/assets_c/2010/05/Pod-Server.html" onclick="window.open('http://aero.sarang.net/blog/assets_c/2010/05/Pod-Server.html','popup','width=1440,height=900,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://aero.sarang.net/blog/assets_c/2010/05/Pod-Server-thumb-800x500.png" alt="Pod-Server.png" class="mt-image-none" style="" height="500" width="800" /></a></span><br /><br /><br /><a href="http://search.cpan.org/dist/Pod-Webserver/">Pod::Webserver</a><br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://aero.sarang.net/blog/assets_c/2010/05/Pod-Webserver.html" onclick="window.open('http://aero.sarang.net/blog/assets_c/2010/05/Pod-Webserver.html','popup','width=1440,height=900,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://aero.sarang.net/blog/assets_c/2010/05/Pod-Webserver-thumb-800x500.png" alt="Pod-Webserver.png" class="mt-image-none" style="" height="500" width="800" /></a></span><br /><br /><br />이다.<br /><br />개인적으로 평을 하자면 Perldoc::Server는 <a href="http://perldoc.perl.org/">perldoc</a> 싸이트와 완벽히 같은 형태에 문법하일라이팅등 가장 예쁘다 (하지만 속도가 약간 느린감이 있음), Pod::POM::Web은 속도도 빠르고 문서도 적당히 예쁘게 보여주는 것 같다. 나머지는 그냥 그럭저럭~]]>
        
    </content>
</entry>

<entry>
    <title>perl 5.12.0 버젼 릴리즈</title>
    <link rel="alternate" type="text/html" href="http://aero.sarang.net/blog/2010/04/perl-5120.html" />
    <id>tag:aero.sarang.net,2010:/blog//1.158</id>

    <published>2010-04-14T12:38:12Z</published>
    <updated>2010-04-18T10:36:14Z</updated>

    <summary>2010년 4월 13일 Perl 5.12.0 버젼이 릴리즈 되었다.Perl 5.12.0 는...</summary>
    <author>
        <name>aero</name>
        <uri>http://aero.sarang.net/blog</uri>
    </author>
    
    <category term="5120" label="5.12.0" 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="released" label="released" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://aero.sarang.net/blog/">
        <![CDATA[2010년 4월 13일 <a href="http://search.cpan.org/dist/perl-5.12.0/">Perl 5.12.0 버젼</a>이 릴리즈 되었다.<br /><br />Perl 5.12.0 는 2007년 12월 이전 안정버젼인 5.10.0 버젼이 나온후 2년여간 200여명의 개발자에의해&nbsp; 750,000라인 이상, 3000개 파일 이상이&nbsp; 변경/추가 되었다고 한다.<br /><br />Perl 5.12.0 이 가지는 또 하나의 의미는 두단계 이전 안정버젼인 5.8.0 버젼에서 5.10.0 버젼까지 5년 정도가 걸릴만큼 개발/릴리즈상에 정체가 있었고 Perl 6와 병행해서 개발되면서 그 집중도가 좀 떨어졌으나 <a href="http://twitter.com/obra">Jesse Vincent</a>씨가 2009년 여름에 Perl 5 Pumpkin(프로젝트 메니져정도로 보면 됨)으로 취임하면서 정기적이고 예측가능한 개발/릴리즈 주기를 가져가기로 한 후 발표된 첫 버젼이라는 것이다. ( 이러한 비하인드스토리는 상용 Perl 패키지를 판매하는 <a href="http://www.activestate.com/">ActiveState</a>사의 <a href="http://jandubois.com/">jan dubois</a>씨가 올린 <a href="http://blogs.activestate.com/2010/04/perl-5-is-alive/">Perl 5 is Alive</a>란 블로그 포스트에 잘 정리되어 있다. )<br /><br />Perl 5.12.0에서 변경된 점은 <a href="http://search.cpan.org/dist/perl-5.12.0/pod/perl5120delta.pod">perl5120delta</a> 문서에 잘 정리되어 있으며<br /><br />몇가지 주요 변화사항을 들자면<br /><br /><ul><li>Unicode 5.2 표준 적용</li><li>Pluggable keyword/syntax를 개발자가 확장할 수 있는 api제공</li><li>32bit 자료형에 의한 Y2038문제 해결</li><li>새로운 package 버젼 지정방법 추가</li><li>deprecated된 방법을 사용할 시 자동 경고</li><li>재미있고 획기적인(?)&nbsp; 일명 <a href="http://search.cpan.org/%7Ejesse/perl-5.12.0/pod/perlop.pod#Yada_Yada_Operator___">yada yada 연산자</a>.</li><li>DTrace 지원<br /></li></ul>등이 있다.<br /><br />이번에 Perl 5.12.0 버젼을 로컬계정에 설치하면서 요즘 많이 issue가 되고 있는 <a href="http://search.cpan.org/dist/App-cpanminus/">cpanm</a> 과 <a href="http://search.cpan.org/dist/App-perlbrew/">perlbrew</a>를 써보았다.<br /><br /><br /><br /> 
<script src="http://gist.github.com/365542.js?file=bootstrap_perlbrew.sh"></script>
<br />
<a href="http://cpansearch.perl.org/src/GUGOD/App-perlbrew-0.04/Changes">perlbrew 0.04버젼에서 File::Path make_path문제가 해결되어</a>서 수정. 예전버젼 스크립트는 <a href="https://gist.github.com/365542/f0753186d681b80c8a287741eb8b8687e10cd1f4">여기</a>에 ]]>
        
    </content>
</entry>

<entry>
    <title>또 다른 한글 맞춤법 검사기 YAKS(Yet Another Korean Speller)</title>
    <link rel="alternate" type="text/html" href="http://aero.sarang.net/blog/2010/04/-yaksyet-another-korean-spelle.html" />
    <id>tag:aero.sarang.net,2010:/blog//1.157</id>

    <published>2010-04-08T11:31:38Z</published>
    <updated>2010-04-08T12:20:49Z</updated>

    <summary>영어권 언어들은 오픈소스로 된 spell명령 등 철자를 검사할 수 있는...</summary>
    <author>
        <name>aero</name>
        <uri>http://aero.sarang.net/blog</uri>
    </author>
    
    <category term="perl한글맞춤법webservicekoreanspelleryaks" label="perl 한글 맞춤법 WebService::KoreanSpeller YAKS" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://aero.sarang.net/blog/">
        <![CDATA[영어권 언어들은 오픈소스로 된 spell명령 등 철자를 검사할 수 있는 도구들이 잘 갖추어져 있지만 한글은 아쉽게도 그렇지 못하다.( <a href="http://github.com/changwoo/hunspell-dict-ko">hunspell</a> 이라는 프로젝트가 진행중인 것 같긴하나 어느 정도 지원이 되고 사용의 편리성은 어떤지 확인해보지 않았음)<br /><br />그래서 예전 아래한글 워드프로세스시절부터 상용 한글 맞춤법엔진들이 채용되어 사용되어 왔는데 요즘에는 그러한 엔진이 <a href="http://speller.cs.pusan.ac.kr/">한국어 맞춤법/문법 검사기</a> 같은 웹서비스를 통해서 제공되고 있다.<br /><br />하지만 해당서비스는 결과를 테이블 구조로 보여주기는 하나 틀린 부분을 테이블과 원문을 비교해서 찾기 힘드는 등 사용하는데 불편한 점이 있어 편하게 쓰려고 작업을 좀 해봤다.<br /><br />일단 위 서비스의 결과를 정해진 자료구조로 뽑아내는 <a href="http://search.cpan.org/dist/WebService-KoreanSpeller/">WebService::KoreanSpeller</a> Perl모듈을 만드는 데부터 시작해서 모듈을 이용해서 <a href="http://gist.github.com/357831">명령행에서 사용할 수 있는 스크립트</a>를 만들고 마지막으로 결과를 Web+Ajax를 사용해서 원문 위에서 보며 쉽게 확인할 수 있도록 하는 또 다른 한글 맞춤법 검사기 가칭 <a href="http://aero.sarang.net/kspell/">YAKS(Yet Another Korean Speller)</a>를 만들어 봤다.<br /><br />아무쪼록 필요하신 분들에게 도움이 되기를~<br /><br /><a href="http://aero.sarang.net/kspell/">YAKS(Yet Another Korean Speller)</a>&nbsp;&nbsp; &lt;- 사용해 보려면 클릭<br /><br />]]>
        
    </content>
</entry>

<entry>
    <title>Josephus 문제 - Perl OOP 비교</title>
    <link rel="alternate" type="text/html" href="http://aero.sarang.net/blog/2010/04/josephus---perl-oop.html" />
    <id>tag:aero.sarang.net,2010:/blog//1.156</id>

    <published>2010-04-03T04:36:55Z</published>
    <updated>2010-04-06T01:23:06Z</updated>

    <summary>Josephus 문제의 OOP적 해법에 대한Perl 5 / Ruby / Python...</summary>
    <author>
        <name>aero</name>
        <uri>http://aero.sarang.net/blog</uri>
    </author>
    
    <category term="josephusproblemperloopmoosemoosexdeclareclassaccessorfast" label="josephus problem perl oop Moose MooseX::Declare Class::Accessor::Fast" 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://apnetwork.tistory.com/237">Josephus 문제</a>의 OOP적 해법에 대한<br /><a href="http://danvk.org/josephus.html">Perl 5 / Ruby / Python 의 비교</a>와 <a href="http://daniel.carrera.bz/2009/06/perl-6-and-the-josephus-problem/">Perl 6 / Ruby / Python의 비교</a>를 보고 현대 Perl 5에서 발전해온 방법을 거슬러 올라가며 구현해서 비교해 보았다.<br />( 알고리즘적으로 더 간단한 방법이 있겠지만 여기서는 비교를 위한 구현을 그대로 따른다. 그리고 기본적인 구현도 named parameter를 사용하도록 바꿨다. )<br /><br />
기본적인 구현<br /><br />
<script src="http://gist.github.com/354107.js?file=josephus.pl"></script>
<br /><br /><br /><br />
<a href="http://search.cpan.org/dist/Class-Accessor/">Class::Accessor::Fast</a>를 이용한 구현<br /><br />
<script src="http://gist.github.com/354109.js?file=josephus2.pl"></script>
<br /><br /><br /><br />
<a href="http://www.iinteractive.com/moose/">Moose</a>를 이용한 구현<br /><br />
<script src="http://gist.github.com/354113.js?file=josephus3.pl"></script>
<br /><br /><br /><br />
<a href="http://search.cpan.org/perldoc?MooseX::Declare">MooseX::Declare</a>를 이용한 구현<br /><br />
<script src="http://gist.github.com/354115.js?file=josephus4.pl"></script>
<br /><br />
어떤가? Perl 5의 OOP구현은 이제 Ruby / Python / Perl 6도 울고갈만할 정도로 발전했다. 어떤 부분은( Moose의 타입채크, lazy한 객체생성, Role을 통한 Traits 구현등 ) 더 뛰어나기도 하다.<br /><br /><br />]]>
        
    </content>
</entry>

<entry>
    <title>use base 와 use parent의 차이점</title>
    <link rel="alternate" type="text/html" href="http://aero.sarang.net/blog/2010/03/use-base-use-parent.html" />
    <id>tag:aero.sarang.net,2010:/blog//1.155</id>

    <published>2010-03-19T14:38:21Z</published>
    <updated>2010-03-22T14:59:21Z</updated>

    <summary>hanekomu씨의 Use parent.pm instead of base.pm 이란 블로그 포스팅을 보고...</summary>
    <author>
        <name>aero</name>
        <uri>http://aero.sarang.net/blog</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://aero.sarang.net/blog/">
        <![CDATA[hanekomu씨의 <a href="http://hanekomu.at/blog/cpan_gems/20100317-2326-use_parent_instead_of_use_base.html">Use parent.pm instead of base.pm</a> 이란 블로그 포스팅을 보고 다시 정리해볼 필요가 있어보여서 남김. Thanks hanekomu~<br /><br />선행지식: <a href="http://aero.sarang.net/presentation/New_Perl_OOP.pdf">새로운 Perl 
OOP로 개과천선하기</a><br /><br />Perl에서 OOP를 구현할 때 부모클래스 Game을 GoStop이라는 자식클래스가 상속할때 전통적인 방법은 다음과 같았다.<br /><br /><u>[Game.pm]</u><br />package Game;<br /><br />sub new { ... }<br />...<br />1;<br /><br /><u>[GoStop.pm]</u><br />package GoStop;<br />BEGIN {<br />&nbsp;&nbsp;&nbsp; require Game;<br />&nbsp;&nbsp;&nbsp; our @ISA = 'Game';<br />}<br />...<br />1;<br /><br />컴파일 타임에 적용되도록 하기 위해 BEGIN이라는 블럭안에 <a href="http://perldoc.perl.org/functions/require.html">require</a>로 Game모듈을 읽어들이고 부모클래스 리스트를 가지는 @ISA배열에 부모클래스를 명시하는 것이다.<br /><br />하지만 이것은 왠지 ugly하고 말이 많아 보인다는 단점이 있다. 그래서 등장한 것이 <a href="http://search.cpan.org/perldoc?base">base</a> 라는 모듈이다.<br /><br /><u>[GoStop.pm]</u><br />package GoStop;<br />use base 'Game';<br />...<br />1;<br /><br />깔끔하게 1줄로 줄었다. base는 많은 말을 간단하게 하나로 줄인 것 뿐만아니라 몇가지 추가적인 기능을 수행할 수 있게 만들어 졌다. 만약에 Game패키지(클래스)가 별도의 파일이아닌 GoStop패키지와 같은 파일에 있다면 <br /><br />package Game;<br />
<br />
sub new { ... }<br />
...<br /><br />package GoStop;<br />
our @ISA = 'Game';<br />
...<br />
1;<br /><br />이미 Game이란 패키지가 GoStop 패키지가 만들어질 때 같은 파일안에서 로딩된 상태이므로 위처럼 따로 require과정은 필요하지 않게 되는데, 이 경우에 다음과 같이 base를 써서<br /><br />package Game;<br />

<br />

sub new { ... }<br />

...<br />
<br />
package GoStop;<br />

use base 'Game';<br />

... <br />

1;<br /><br />이런식으로 하면 base는 Game.pm 파일이 있으면 우선적으로 그것을 로딩해서 사용하지만( 이 경우는 없다고 가정) 없을때도 같은 파일내에서 이미 로딩된 패키지(클래스)가 있다면 에러가 나지 않고  알아서 그것을 부모로 사용하므로 our @ISA = 'Game'과 같은 효과를 발휘 할 수 있다.<br /><br />그 이외에도 base에는 Perl OOP구현의 초창기 시절 실험적으로 시도되었던 pseudo hash/restricted hash를 이용한 <a href="http://search.cpan.org/perldoc?fields">fields</a>모듈의 클래스필드 구현/상속 및 모듈간에 VERSION정보 처리등이 들어있지만 이제는 outdated된 테크닉이라&nbsp; 이런 불필요한 부분을 제거하고 슬림하게 다시 태어난 것이 바로 <a href="http://search.cpan.org/perldoc?parent">parent</a> 이다.( parent 모듈은 Perl 5.10.0 버젼 부터 Perl배포본에 기본적으로 포함되어 나오는 Perl core모듈로 들어갔으며 대표적인 Perl 웹프레임웍인 <a href="http://www.catalystframework.org/">Catalyst</a>도 이제 base대신 parent를 사용한다. )<br /><br />GoStop.pm 을 parent로 다시 쓰면<br /><br /><u>[GoStop.pm]</u><br />package GoStop;<br />use parent 'Game';<br />...<br />1;<br /><br />로 쓸 수 있으며 base의 경우 무조건 지정하는 부모클래스 패키지가 별도의 파일로 존재하면 그것을 우선시 하고 별도의 모듈 파일없이 부모클래스가 같은 파일내에 있으면 같은 파일내의 것을 부모로 삼는 반면 parent는 이런 경우에 -norequire 옵션으로 어떤 식으로 동작할 것인지 조정이 가능하다.<br /><br />만약 한 파일 내에서 다음과 같이 쓰면<br /><br />package Game;<br />

<br />

sub new { ... }<br />

...<br />
<br />
package GoStop;<br />

use parent 'Game';<br />

... <br />

1;<br />   <br />parent는 같은 파일내 Game을 부모로 삼지 않고 별도의 Game.pm 파일을 내부적으로 require로 읽어들여서 부모로 삼는다. ( Game.pm 파일이 있다면 base도 똑같이 동작할 것이다.) 반면 -norequire 옵션을 써서<br /><br />package Game;<br />


<br />


sub new { ... }<br />


...<br />

<br />

package GoStop;<br />


use parent -norequire, 'Game';<br />


... <br />


1;<br /><br />처럼 하면 Game.pm 파일을 require하지 않고 같은 파일내의 Game을 부모로 삼게 된다.( Game.pm 파일이 존재한다면 base의 경우 이런식의 동작은 할 수 없다. )<br /><br />그리고 parent 모듈 문서에 보면<br /><br />package MyHash;<br />use Tie::Hash;<br />use parent -norequire, 'Tie::StdHash';<br /><br />과 같은 예제 코드가 있는데 Tie::Hash 라는 모듈파일을 보면 내부적으로 Tie::StdHash라는 패키지(클래스)를 같이 포함하고 있다. 이경우는 use Tie::Hash; 로 이미 Tie::StdHash 패키지도 같이 로딩된 상태이므로 -norequire 옵션으로 별도의 모듈 파일을 읽어들이지 않고 이미 읽어들인 Tie::Hash 모듈내의 Tie::StdHash를 부모로 삼겠다는 의미이다.<br /><br />최신 Perl OOP 프레임웍인 <a href="http://www.iinteractive.com/moose/">Moose</a> 에서는 부모클래스를 상속할 때 extends라는 sugar함수를 사용하지만 Moose를 사용하지 않는 Perl OOP 구현에서는 parent를 사용하는 방식이 가장 최신의 방식임을 알아두도록 하자.<br /><br />]]>
        
    </content>
</entry>

<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>

</feed>
