Perl planet

October 27, 2008

Cornelius

Vim - 設定外部編排程式

在 irc 上頭有朋友問是否有自動編排程式碼的程式,答案是有的。若要寫 C 你可以使用 GNU 的 Indent ,寫 perl 則有 perltidy 。&lt;br /&gt;&lt;br /&gt;在 Ubuntu/Debian 皆有套件可直接安裝使用 GNU Indent。&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ sudo apt-get install indent&lt;/code&gt;&lt;br /&gt;GNU Indent 預設為 GNU Style 若要調整程式碼風格,可以在 ~/.indent.pro 內設定。(請參見 man indent 或參考 &lt;a href="http://www.math.utah.edu/docs/info/indent_toc.html"&gt;GNU Indent Manual&lt;/a&gt; )&lt;br /&gt;&lt;br /&gt;GNU Indent 的使用方式為:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ indent [filename]&lt;/code&gt;&lt;br /&gt;這樣會顯示編排後的程式碼,若用&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ indent file1 &gt; file2&lt;/code&gt;&lt;br /&gt;則會在 file2 存入編排後的程式碼。&lt;br /&gt;&lt;br /&gt;如果你有使用 vim ,你也可以將 GNU Indent 與 vim 的 [==] 功能做結合 ( 請參見 :help [==] ),vim 內有有名的 gg=G 大絕招可以編排整個檔案,預設是用 vim 去編排的,若要使用外部程式編排,可以使用 set equalprg 功能,在 .vimrc 內設定:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;set equalprg=/usr/bin/indent&lt;/code&gt;&lt;br /&gt;則在 vim 內選取區域後可按下等號,則 vim 會將此區塊傳至外部程式,再將外部程式的輸出結果替換。&lt;br /&gt;&lt;br /&gt;另外透過 autocmd 可以搭配不同的檔案類型設定不同的 indent program。&lt;br /&gt;&lt;br /&gt;譬如說我常用 perltidy 那麼可設定&lt;br /&gt;&lt;br /&gt;&lt;code&gt;au Filetype perl :set equalprg=perltidy&lt;/code&gt;&lt;br /&gt;我所使用的 .perltidyrc:&lt;pre class="code"&gt;-l=78&lt;br /&gt;-i=4&lt;br /&gt;-ci=4&lt;br /&gt;-se&lt;br /&gt;-vt=2&lt;br /&gt;-cti=0&lt;br /&gt;-pt=1&lt;br /&gt;-bt=1&lt;br /&gt;-sbt=1&lt;br /&gt;-bbt=1&lt;br /&gt;-nsfs&lt;br /&gt;-nolq&lt;br /&gt;-wbb="% + - * / x != == &gt;= &lt;= =~ !~ &lt; &gt; | &amp;amp; &gt;= &lt; = **= += *= &amp;amp;= &lt;&lt;= &amp;amp;&amp;amp;= -= /= |= &gt;&gt;= ||= .= %= ^= x="&lt;/pre&gt;以及 .indent.pro:&lt;pre class="code"&gt;-br -nce&lt;br /&gt;-cdb -sc&lt;br /&gt;-bad&lt;br /&gt;-i8&lt;br /&gt;-ci4&lt;br /&gt;-di8&lt;br /&gt;-nbc&lt;br /&gt;-bfda&lt;br /&gt;-bls&lt;br /&gt;-ip0&lt;br /&gt;-hnl&lt;/pre&gt;</content>

by c9s at October 27, 2008 07:00 AM

October 07, 2007

Cornelius

今天太廢了

早上熟悉一下 FreeBSD , 在上面裝 KDE&lt;br /&gt;&lt;br /&gt;接著讀了一些 perldoc ,下午練了兩個小時的琴&lt;br /&gt;後來因為停電,所以去練了一個小時的吉他,就練練音階,古典教材之類的 ...&lt;br /&gt;接著讀了一個小時多的 Aho Compiler.&lt;br /&gt;一個小時的托福字彙。&lt;br /&gt;&lt;br /&gt;最後真的沒事情可幹了,天色又暗,沒辦法看書,所以睡覺 ....&lt;br /&gt;睡起來還是停電,所以吃飯。&lt;br /&gt;吃完飯就有電可以看新聞了。&lt;br /&gt;&lt;br /&gt;XD 晚上繼續讀 perldoc 。&lt;br /&gt;&lt;br /&gt;哎喲,我很想澄清,Perl 根本就沒有像外人所說那樣無法閱讀。事實是,多樣化的 Perl 比較容易讓人摸不著邊罷了,但是那樣的 code 其實是很少的。&lt;br /&gt;&lt;br /&gt;阿,真是讓人腦殘的一 PO。 XD</content>

by c9s at October 07, 2007 04:00 AM

September 29, 2007

Cornelius

v6-alpha

其實早就可以在 Perl5 上使用 Perl6 的一些小甜頭了。&lt;br /&gt;&lt;br /&gt;你可以安裝 v6-alpha , type:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ sudo cpan v6&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;可以 perl6 的方式來撰寫之。&lt;br /&gt;&lt;pre class="pre"&gt;# file: hello_world.pl&lt;br /&gt;use v6-alpha;&lt;br /&gt;"hello, world".say;&lt;/pre&gt;實作的部份只有一部分,並不完整。v6-alpha 是實驗性質的東西,不過基本上可以當玩具玩玩。&lt;br /&gt;&lt;br /&gt;注意, v6-alpha 並不相依於 pugs 或 parrot,其物件模型是以 Moose 為基礎。&lt;br /&gt;&lt;br /&gt;其他可參考:&lt;br /&gt;&lt;a href="http://search.cpan.org/%7Efglock/v6-0.020/lib/v6.pm"&gt;http://search.cpan.org/~fglock/v6-0.020/lib/v6.pm&lt;/a&gt;</content>

by c9s at September 29, 2007 07:00 AM

Perl 5.9.5

編了 Perl5.9.5 ,這是 Development Version ,Sourcecode 可在 &lt;a href="http://www.cpan.org/src/README.html"&gt;CPAN&lt;/a&gt; 上下載 ,See the &lt;a href="http://use.perl.org/articles/07/07/09/0655239.shtml"&gt;Announcement&lt;/a&gt; 。步驟可參考 INSTALL 以及 README 檔。&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ sh Configure&lt;br /&gt;$ make&lt;br /&gt;$ make install&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Configure 可加上參數 -d 以預設值編譯。可下&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ sh Configure -d -Dprefix=/usr -Dusedevel&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;如此即可。不過得注意的是:&lt;br /&gt;&lt;blockquote&gt;It may seem obvious, but Perl is useful only when users can easily&lt;br /&gt;find it. It's often a good idea to have both /usr/bin/perl and&lt;br /&gt;/usr/local/bin/perl be symlinks to the actual binary. Be especially&lt;br /&gt;careful, &lt;span style="font-weight: bold; font-style: italic;"&gt;however, not to overwrite a version of perl supplied by your &lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;vendor unless you are sure you know what you are doing.&lt;/span&gt;&lt;/blockquote&gt;參考看看 Perl 5.9.5 有哪些新東西 ( &lt;a href="http://search.cpan.org/%7Ergarcia/perl-5.9.5/pod/perl595delta.pod"&gt;perldelta - what is new for perl v5.9.5&lt;/a&gt; ),</content>

by c9s at September 29, 2007 07:00 AM

September 28, 2007

Cornelius

Perlcc - Perl 前端編譯器

&lt;a href="http://search.cpan.org/%7Enwclark/perl-5.8.8/utils/perlcc.PL"&gt;Perlcc&lt;/a&gt; 可協助你將 perl 的 source code 編譯成 binary , c 或者 bytecode ,於是嘗試用 perlcc 來編譯:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ perlcc -o test test.pl&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;將 test.pl 編譯,並輸出為 test。不過遇到的編譯錯誤:&lt;pre&gt;pccl0GI5.c: In function ‘perl_init_aaaa’:&lt;br /&gt;pccl0GI5.c:15664: warning: this decimal constant is unsigned only in ISO C90&lt;br /&gt;/usr/bin/ld: cannot find -lperl&lt;br /&gt;collect2: ld returned 1 exit status&lt;/pre&gt;其實只要裝一下 libperl-dev 就可以解決這個問題了。&lt;br /&gt;&lt;br /&gt;安裝 libperl-dev:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ sudo apt-get install libperl-dev&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;重新編譯即可。 :)&lt;br /&gt;&lt;br /&gt;將 source code 編譯為 Bytecode 則可輸入 :&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ perlcc -B -o foo foo.pl&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;產生出來的 Bytecode 會像是這樣:&lt;pre class="code"&gt;use ByteLoader 0.06;&lt;br /&gt;PLBCi486-linux-gnu-thread-multi^@0.06^@^D^@^@^@^D^@^@^@^L Ya^A^@^@^@d^Me@^L h^^A^@&lt;br /&gt;^@^@^@&lt;br /&gt;^@^@^@A^A&lt;br /&gt;^@^@^@^G^A ^D^C&lt;84&gt;^D^N^M^@^@^@Hello world&lt;br /&gt;^@^V^A^L^@^@^@&lt;^C^@^@^@=^M^@^@^@=^M^@^@^@=^N^@^@^@A^A^A ^@^@^@&lt;^C^@^@^@=^K^@^@^@=^L^@^@^@A^@^A ^@^@^@8 ^@^@^@;^P^@&lt;87&gt; ^@^@^@&lt;88&gt;^L^@^@^@^@&lt;/pre&gt;可參閱:&lt;br /&gt;Perl 語言全面編譯: &lt;a href="http://fanqiang.chinaunix.net/a4/b3/20010419/150346_b.html"&gt;1&lt;/a&gt;,&lt;a href="http://fanqiang.chinaunix.net/a4/b3/20010419/150532_b.html"&gt;2&lt;/a&gt;,&lt;a href="http://fanqiang.chinaunix.net/a4/b3/20010419/150906_b.html"&gt;3&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;PS. 對了,Programming Perl 3/e 上編譯 bytecode 是寫 -b ,不過正確的應該是 -B。</content>

by c9s at September 28, 2007 05:00 PM

September 25, 2007

Cornelius

話說 Moose

剛剛有提到 Moose ,其實挺不錯,可以提供 Perl5 上一個良好的物件導向。&lt;br /&gt;&lt;br /&gt;不過基本上對 Perl5 的 Developer 比較像是種折磨。因為雖然 Moose.pm 在語法上類似於 Perl6 的寫法,但是有些小細節仍是不太一樣的 (&lt;a href="http://pugs.blogs.com/talks/boston-deploying-perl6.pdf"&gt;可參考 Audreyt 的 Slide&lt;/a&gt;)。看 Slide 看到這,我就覺得這會是個很頭痛的地方,因為當 Perl6 出來之後,你還得再習慣 Perl6 的 syntax,萬一你把小細節搞錯,出 Bug 的狀況反而更多...&lt;br /&gt;&lt;br /&gt;沒辦法,要從 Perl5 切到 Perl6 還得過一個尷尬的過渡期...&lt;br /&gt;&lt;br /&gt;不過,我認為 Perl6 已經超越了 Scripting Language 了!因為基本上他不僅吸收了 Haskell , Ruby , Python 等等許多語言的特色,還提供了多種的後端輸出。&lt;br /&gt;&lt;br /&gt;所以為了 Perl6 強大的功能 .... (忍痛 XDDDD)&lt;br /&gt;&lt;br /&gt;繼續寫 Perl 吧 XD</content>

by c9s at September 25, 2007 06:00 PM

Object-Oriented in Perl

如果要在 Perl 5 上寫 OO 的話,就用 &lt;a href="http://search.cpan.org/%7Estevan/Moose-0.25/lib/Moose.pm"&gt;Moose.pm&lt;/a&gt; 吧!這是一個以 Perl 6 物件模型為基礎的模組,CPAN 上寫道:&lt;br /&gt;&lt;blockquote&gt;Moose is &lt;i&gt;based&lt;/i&gt; on the prototypes and experiments I did for the Perl 6 meta-model. However, Moose is &lt;b&gt;NOT&lt;/b&gt; an experiment/prototype; it is for &lt;b&gt;real&lt;/b&gt;.&lt;/blockquote&gt;&lt;br /&gt;如此,你可以類似 Perl 6 的寫法在 Perl 5 上寫 OO. :-)&lt;br /&gt;這種寫法比較直觀,並且功能也比較強大。&lt;pre class="code"&gt;package Point;&lt;br /&gt;use Moose; # automatically turns on strict and warnings&lt;br /&gt; &lt;br /&gt;has 'x' =&gt; (is =&gt; 'rw', isa =&gt; 'Int');&lt;br /&gt;has 'y' =&gt; (is =&gt; 'rw', isa =&gt; 'Int');&lt;br /&gt;&lt;br /&gt;sub clear {&lt;br /&gt; my $self = shift;&lt;br /&gt; $self-&gt;x(0);&lt;br /&gt; $self-&gt;y(0); &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;package Point3D;&lt;br /&gt;use Moose;&lt;br /&gt;&lt;br /&gt;extends 'Point';&lt;br /&gt;&lt;br /&gt;has 'z' =&gt; (is =&gt; 'rw', isa =&gt; 'Int');&lt;br /&gt;&lt;br /&gt;after 'clear' =&gt; sub {&lt;br /&gt; my $self = shift;&lt;br /&gt; $self-&gt;z(0);&lt;br /&gt;}; &lt;/pre&gt;其他對 Moose.pm 的疑問就上 CPAN 的 &lt;a href="http://search.cpan.org/%7Estevan/Moose-0.25/lib/Moose.pm"&gt;Moose.pm&lt;/a&gt; 看吧! :)&lt;br /&gt;&lt;br /&gt;那個..裝 CPAN 模組是這樣裝的:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ cpan Moose&lt;/code&gt;</content>

by c9s at September 25, 2007 05:00 PM

September 24, 2007

Cornelius

Win32::Printer

I was looking for the Printer Module on CPAN , and I found this ( &lt;a href="http://search.cpan.org/%7Ewasx/Win32-Printer-0.9.0/Printer.pm"&gt;Win32::Printer&lt;/a&gt; ). The author said that " PPD ( binary package ) is on the waxs.net " , but the link missed.&lt;br /&gt;&lt;br /&gt;I have to compile it by myself , it's a troublesome job , because I have to install MSVC 6.0.&lt;br /&gt;&lt;br /&gt;After you install MSVC 6.0 , just compile the module:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt; perl Makefile.PL&lt;br /&gt;&amp;gt; nmake&lt;br /&gt;&amp;gt; nmake install&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;but you shall encounter an error which is that "PageNumber" is not in the structure "PSINJECTDATA".&lt;br /&gt;&lt;br /&gt;I don't know why. Maybe it was caused by the version of Win32 API Headers. the structure which the module code expects is:&lt;br /&gt;&lt;pre class="code"&gt;struct PSINJECTDATA {&lt;br /&gt;DWORD DataBytes;&lt;br /&gt;WORD InjectionPoint;&lt;br /&gt;WORD PageNumber;&lt;br /&gt;}&lt;br /&gt;alias PSINJECTDATA* PPSINJECTDATA;&lt;/pre&gt;but what I actually have is:&lt;pre class="code"&gt;typedef struct _PSINJECTDATA {&lt;br /&gt;&lt;br /&gt;DWORD DataBytes; /* number of raw data bytes */&lt;br /&gt;DWORD InjectionPoint; /* injection point */&lt;br /&gt;DWORD Flags; /* flags */&lt;br /&gt;DWORD Reserved; /* reserved field - must be 0 */&lt;br /&gt;&lt;br /&gt;/* Followed by raw data to be injected */&lt;br /&gt;&lt;br /&gt;} PSINJECTDATA, *PPSINJECTDATA;&lt;/pre&gt;My solution is ...&lt;br /&gt;just comment the line:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;psd.PageNumber = page;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;then it unexpectedly can work out! :P&lt;br /&gt;&lt;br /&gt;I can't guarantee that "&lt;a href="http://search.cpan.org/%7Ewasx/Win32-Printer-0.9.0/Printer.pm#Inject"&gt;inject&lt;/a&gt;" function could work , but the &lt;a href="http://search.cpan.org/%7Ewasx/Win32-Printer-0.9.0/Printer.pm#SYNOPSIS"&gt;test script&lt;/a&gt; still prints out the example normally.</content>

by c9s at September 24, 2007 10:00 AM

PPM + OpenGL

在 Windows 底下寫東西都很麻煩... ( 都不能用 apt )&lt;br /&gt;&lt;br /&gt;如果 Perl 要用 OpenGL 那還得裝一下 &lt;a href="http://www.bribes.org/perl/wopengl.html"&gt;OpenGL for Win32&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;不過有 ppm 就比較簡單了:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;ppm install http://www.bribes.org/perl/ppm/OpenGL.ppd&lt;/code&gt;</content>

by c9s at September 24, 2007 05:00 AM

PPM + Gtk2-Perl

遲早要在 Windows 上頭跑 Perl 的。所以裝了 ActivePerl,沒想到眼花去裝到 5.6 ,想說奇怪圖示怎麼這麼醜,印象中之前裝的還不錯看的。 XD&lt;br /&gt;&lt;br /&gt;首先要解決 Printer 的問題,結果沒想到 CPAN 上 Win32::Printer 的 Binary 不知道跑哪了,沒辦法裝。只好裝爛到爆 MS Visual C++ 6 ( 仍是不屑裝 MS .NET。 自由軟體的好處就是什麼都好取得,自從習慣了 FS 之後,對 MS, ASP, BASIC 什麼的,都很反感。)&lt;br /&gt;&lt;br /&gt;之後直接裝 &lt;a href="http://www.lostmind.de/gtk2-perl/"&gt;gtk2-perl&lt;/a&gt;,首先得裝 ActivePerl ,接著是 Gtk2 Runtime , Glade 也可以抓下來。&lt;br /&gt;&lt;br /&gt;接下來步驟可能會有點麻煩,因為要到各模組內的資料夾執行 ppm install 已經編譯好的 binary,所以我寫了一個 script 來跑,這樣以後安裝可以省事多。&lt;br /&gt;&lt;br /&gt;你可以先將各資料夾照順序編號,如:&lt;br /&gt;&lt;br /&gt;C:\foo\&lt;br /&gt;00-ExtUtils-Depends-0.205&lt;br /&gt;01-ExtUtils-PkgConfig-1.07&lt;br /&gt;[...]&lt;br /&gt;&lt;br /&gt;接著在 foo 底下寫一個 install.pl 檔&lt;pre class="code"&gt;#!/usr/bin/perl&lt;br /&gt;qx{ppm repo add http://www.lostmind.de/gtk2-perl/ppm/};&lt;br /&gt;qx{ppm install Gtk2};&lt;br /&gt;for $dir ( &lt;*&gt; ) {&lt;br /&gt; next unless ( -d $dir );&lt;br /&gt; chdir $dir;&lt;br /&gt; for ( &lt;*.ppd&gt; ) { qx{ppm install $_}; }&lt;br /&gt; chdir "..";&lt;br /&gt;}&lt;/pre&gt;執行他即可。&lt;br /&gt;&lt;br /&gt;還是要婊一下,cmd.exe 爛死了,難用到爆,還寫那種什麼 WSH ? 才不要!&lt;br /&gt;&lt;br /&gt;對了,只要裝了 &lt;a href="http://www.mingw.org/"&gt;Mingw - MSYS&lt;/a&gt; 就可以直接在 cmd.exe 底下跑 sh , ls , vim 等等東西。帥</content>

by c9s at September 24, 2007 04:00 AM

September 22, 2007

Cornelius

GladeXML + Gtk2-Perl

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_i3PNCkrh-3k/RvSKctskNsI/AAAAAAAAAu4/WCEDA8fulWw/s1600-h/glade.png"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_i3PNCkrh-3k/RvSKctskNsI/AAAAAAAAAu4/WCEDA8fulWw/s320/glade.png" alt="" id="BLOGGER_PHOTO_ID_5112863702879844034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;試用了 Glade 3 ,還不賴,比之前的 glade 好很多。&lt;br /&gt;&lt;br /&gt;接著用 Perl 的 &lt;a href="http://search.cpan.org/dist/Gtk2-GladeXML/"&gt;GladeXML&lt;/a&gt; ,試了一下 examples 底下的 fileman.pl&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_i3PNCkrh-3k/RvSOQ9skNtI/AAAAAAAAAvA/SH898frKPAk/s1600-h/fileman.pl.png"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_i3PNCkrh-3k/RvSOQ9skNtI/AAAAAAAAAvA/SH898frKPAk/s320/fileman.pl.png" alt="" id="BLOGGER_PHOTO_ID_5112867899062892242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;希望能滿足我的需求才是...XD</content>

by c9s at September 22, 2007 04:00 AM

September 15, 2007

Cornelius

Pugs 發起

Pugs 是目前 Perl6 最完整的實作。 關於 Pugs 的 interview 在這裡看到 &lt;a href="http://www.perl.com/pub/a/2005/03/03/pugs_interview.html"&gt;A Plan for Pugs&lt;/a&gt; 。 ( 雖然是兩年前的東西了 )&lt;br /&gt;&lt;br /&gt;讓 Autrijus 大師注意到 Haskell 的原因是起源於覺得 SVK 不夠彈性,於是換了 Haskell 寫的 &lt;a href="http://en.wikipedia.org/wiki/Darcs"&gt;Darcs&lt;/a&gt; 來使用。Autrijus 花了一個月就學 Haskell 。而後 Autrijus 說服了他的委託人 Perl5 缺乏 COW ( Copy-on-write ) 的機制,出資讓他以 haskell 開發更好的 Library.&lt;br /&gt;&lt;br /&gt;在開發的過程中,Autrijus 發現到 Haskell 的優異, Autrijus 說:&lt;br /&gt;&lt;blockquote&gt;But I digress. Using Haskell to develop OpenAFP.hs led to programs that eat constant 2MB memory, scale linearly, and are generally 2OOM faster than my Perl library.&lt;br /&gt;&lt;br /&gt;Oh, and the code size is 1/10.&lt;/blockquote&gt;這是他發起 Pugs 的其中一個動機。接著他買了許多書,像是 &lt;a href="http://www.cis.upenn.edu/%7Ebcpierce/tapl/index.html"&gt;TaPL&lt;/a&gt; , &lt;a href="http://www.cis.upenn.edu/%7Ebcpierce/attapl/index.html"&gt;ATTaPL&lt;/a&gt; 等。&lt;br /&gt;&lt;blockquote&gt;Autrijus:&lt;br /&gt;&lt;br /&gt;Anyway. So, I ordered a bunch of books online including TaPL and ATTaPL so I could learn more about mysterious things like Category Theory and Type Inference and Curry-Howard Correspondence.&lt;/blockquote&gt;於是,Pugs 就這樣起來了。 :-) 當然詳細的 interview 請參閱 &lt;a href="http://www.perl.com/pub/a/2005/03/03/pugs_interview.html"&gt;perl.com: A Plan for Pugs&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;在 use Perl; 上頭,也有幾篇紀念性的 Announcement 譬如說: &lt;a href="http://use.perl.org/%7Eautrijus/journal/22965"&gt;"Day 1: Pugs"&lt;/a&gt; , &lt;a href="http://use.perl.org/%7Eautrijus/journal/23446"&gt;"Day 29: A new month begins."&lt;/a&gt; 等等。&lt;br /&gt;&lt;br /&gt;Pugs 的 Code 在每個模組的開頭幾行都有些有趣的 Quote,應該是 Autrijus 寫下的,譬如說 Class.pm 內的開頭幾行:&lt;pre class="code"&gt;{-|&lt;br /&gt;Class meta-model. (object meta-meta-model)&lt;br /&gt;&lt;br /&gt;&gt; Learn now the lore of Living Creatures!&lt;br /&gt;&gt; First name the four, the free peoples:&lt;br /&gt;&gt; Eldest of all, the elf-children;&lt;br /&gt;&gt; Dwarf the delver, dark are his houses;&lt;br /&gt;&gt; Ent the earthborn, old as mountains;&lt;br /&gt;&gt; Man the mortal, master of horses...&lt;br /&gt;-}&lt;/pre&gt;&lt;br /&gt;或許是因為 Haskell 的關係,Perl 6 新增了許多類似 Haskell 的概念、功能,可參考 &lt;a href="http://dev.perl.org/perl6/doc/synopsis.html"&gt;Synopses&lt;/a&gt; 或 &lt;a href="http://tokyo2007.yapcasia.org/sessions/2007/02/perl_6_today.html"&gt;YAPC: Perl 6 Today&lt;/a&gt;。&lt;br /&gt;&lt;h3&gt;&lt;/h3&gt;&lt;h3&gt;&lt;/h3&gt;</content>

by c9s at September 15, 2007 08:00 PM

August 26, 2007

Cornelius

初識 Python

昨天早上 Survey 了一下 Python ,發覺 Python 和 Perl 的哲學比較起來,頗有同工異曲之妙。&lt;br /&gt;&lt;br /&gt;Python 設計的很簡潔,怎麼說呢? Python 把分號拿掉了,並且嚴格限制縮排,此外 {,} 也拿掉了,所以語法很清晰,不用花精力在調整括號的排版,也不會有差異太大的 Coding Style。除此之外,物件導向方面設計的比較完善,譬如說&lt;br /&gt;&lt;br /&gt;&lt;code&gt;"String1".startswith("Str")&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;同樣的語法在 Perl 裡頭就無法做到了。&lt;br /&gt;&lt;br /&gt;Python 相較於 Perl ,Perl 強調的是自由度,甚至自由到能夠改變剖析的語法,另外 perl 走的哲學就是 『條條大路通羅馬』一種目的可以用多種方式達到,可以很寫的很髒 - 可寫不可讀,或者寫的很精緻。 Perl 也提供很多的方便性,譬如樣式比對可由自己想要的字元取代雙引號,如此一來可以避免過多的跳脫的反斜線,像是 rx{ls},qq/String/,q-String- ;呼叫函數可以加上圓括號或是不加也可等等,透徹的利用很多特殊符號來達到簡略迅速的寫法。&lt;br /&gt;&lt;br /&gt;不過目前的 Perl 最大的一個缺點就是在物件導向方面不大自然,要透過 bless 函數利用 reference 的方式達到物件導向的目的,所以語法上比較不是這麼的簡潔,如下範例 ( 取自 &lt;cite&gt;WWW-Mechanize-1.30-jFIVC5&lt;/cite&gt; 的 Image.pm :&lt;pre class="code"&gt;&lt;span style="color: rgb(102, 51, 255);"&gt;package&lt;/span&gt; WWW::Mechanize::Image;&lt;br /&gt;&lt;br /&gt;...略&lt;br /&gt;&lt;br /&gt;sub new {&lt;br /&gt;&lt;span style="color: rgb(102, 51, 255);"&gt; my&lt;/span&gt; &lt;span style="color: rgb(204, 51, 204);"&gt;$class&lt;/span&gt; = &lt;span style="color: rgb(255, 102, 0);"&gt;shift&lt;/span&gt; ;&lt;br /&gt;&lt;span style="color: rgb(102, 51, 255);"&gt; my&lt;/span&gt; &lt;span style="color: rgb(204, 51, 204);"&gt;$parms&lt;/span&gt; = &lt;span style="color: rgb(255, 102, 0);"&gt;shift&lt;/span&gt; || {} ;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 51, 255);"&gt; my&lt;/span&gt; &lt;span style="color: rgb(204, 51, 204);"&gt;$self&lt;/span&gt; = {};&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 51, 255);"&gt; for&lt;/span&gt; my &lt;span style="color: rgb(204, 51, 204);"&gt;$parm&lt;/span&gt; ( qw( url base tag height width alt name ) ) {&lt;br /&gt; $self-&gt;{$parm} = $parms-&gt;{$parm} if defined $parms-&gt;{$parm};&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 51, 255);"&gt; return&lt;/span&gt; bless &lt;span style="color: rgb(204, 51, 204);"&gt;$self&lt;/span&gt;, &lt;span style="color: rgb(204, 51, 204);"&gt;$class&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt; 你可以發現要透過 shift class , 接著要實作一個雜湊參照,接著利用 bless 使他成為物件,最後傳回。&lt;br /&gt;&lt;br /&gt;Perl 在傳遞參數方面也是有些累贅,得利用 shift 或是 @_ 來取得參數。不過以上問題在 Perl 6 都會有革命性的改進,想更進一步瞭解可以參考 &lt;cite&gt;&lt;a href="http://dev.perl.org/perl6/doc/synopsis.html"&gt;Perl 6 Synopses&lt;/a&gt;&lt;/cite&gt; 。&lt;br /&gt;&lt;br /&gt;Python 在這方面顯得精簡許多,如下範例 ( 取自 &lt;a href="http://www.amk.ca/python/simple/"&gt;&lt;cite&gt;Simple Sample of Python&lt;/cite&gt;&lt;/a&gt; )&lt;br /&gt;&lt;pre class="code"&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;"&gt;class&lt;/span&gt; PrinterFormatter:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; def&lt;/span&gt; __init__(self, filename, page_len=58):&lt;br /&gt; # Save the time of creation for inclusion in the header&lt;br /&gt; import time&lt;br /&gt; self.now=time.asctime(time.localtime(time.time()))&lt;br /&gt;&lt;br /&gt; .... 略&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; def&lt;/span&gt; write_header(self):&lt;br /&gt; # If the header for this page has just been written, don't&lt;br /&gt; # write another one.&lt;br /&gt;&lt;br /&gt; .... 略&lt;br /&gt;&lt;/pre&gt;由於省略了大括號,只利用冒號代表接續的敘述,強迫縮排,參數傳遞的寫法也比較乾淨。簡單的說, Python 在語法的限制比較高,不過也因為如此而能夠將程式碼的可讀性提高。&lt;br /&gt;&lt;br /&gt;另外發覺 Python 與 Application 的 binding 也都不錯,而 Perl 的模組量多非常豐富、範圍較廣。所以雖然哲學上大相逕庭,不過各有其優缺點。&lt;br /&gt;&lt;br /&gt;以上,初步認識 Python 之感想。如有錯誤煩請指正,小弟懂的不多,請多多指教,謝謝。 :-)</content>

by c9s at August 26, 2007 03:00 PM

August 18, 2007

Cornelius

Visual Basic 最高! / AudreyT

&lt;a href="http://yapc.g.hatena.ne.jp/jkondo/"&gt;Visual Basic 最高! (audio)&lt;/a&gt; &lt;a href="http://www.archive.org/details/YAPCAsia2006TokyoLightningTalkVisualBasic"&gt;(video)&lt;/a&gt;&lt;br /&gt;不過 video的部份,Internet Archive 收錄不是很完整&lt;br /&gt;external: &lt;a href="http://www.archive.org/search.php?query=subject:%22yapc%22"&gt;YAPC ( internet archive )&lt;/a&gt;</content>

by c9s at August 18, 2007 12:46 PM

Perl 6 Today / Audrey Tang

&lt;embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=-3876155376103839772&amp;hl=en" flashvars=""&gt; &lt;/embed&gt;</content>

by c9s at August 18, 2007 12:46 PM

Parrot Compiler Tools / Allison Randal

&lt;table align="right"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_i3PNCkrh-3k/Rqgo8u4K9BI/AAAAAAAAAi8/DIVSUMgqNzE/s1600-h/allison_autrijus.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_i3PNCkrh-3k/Rqgo8u4K9BI/AAAAAAAAAi8/DIVSUMgqNzE/s320/allison_autrijus.jpg" alt="" id="BLOGGER_PHOTO_ID_5091364402583237650" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;small&gt;Allison Randal &amp;amp; 唐鳳&lt;br /&gt;Photo James Duncan Davidson/O'Reilly Media&lt;/small&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Perl Hacker &lt;a href="http://www.lohutok.net/"&gt;Allison Randal&lt;/a&gt; 在她的網站上放了她的&lt;a href="http://www.lohutok.net/talks/compiler_tools.pdf"&gt;簡報&lt;/a&gt; - "&lt;a href="http://www.parrotcode.org/docs/compiler_tools.html"&gt;Parrot Compiler Tools&lt;/a&gt;",裡頭闡述了 Parrot 的架構、文法引擎等原理。&lt;br /&gt;&lt;br /&gt;此外 Allison Randal 最近被頒予 2007 White Camel 獎, 引述 &lt;a href="http://use.perl.org/article.pl?sid=07/07/25/1617256"&gt;use Perl&lt;/a&gt; 的消息:&lt;br /&gt;&lt;blockquote&gt;Allison Randal&lt;br /&gt;&lt;br /&gt;[0]Allison is at the center of the Perl community. She's been&lt;br /&gt;president of The Perl Foundation, a leader and manager of various&lt;br /&gt;parts of the Perl 6 and Parrot efforts, as well a Perl author and&lt;br /&gt;editor. Her latest contribution to Perl is version 2 of the&lt;br /&gt;Artistic License, under which most open source Perl code, and Perl&lt;br /&gt;itself, is licensesd "under the terms of Perl itself".&lt;/blockquote&gt;External:&lt;br /&gt;flickr &lt;a href="http://www.flickr.com/photos/pdcawley/252428859/in/set-72157594298984945/"&gt;[1]&lt;/a&gt; &lt;a href="http://www.flickr.com/photos/x180/202613770/in/set-72157594209209708/"&gt;[2]&lt;/a&gt;&lt;br /&gt;&lt;a href="http://use.perl.org/article.pl?sid=07/07/25/1617256"&gt;use Perl&lt;/a&gt;</content>

by c9s at August 18, 2007 12:46 PM

學 Perl6

&lt;a href="http://use.perl.org/articles/07/06/18/1726249.shtml"&gt;http://use.perl.org/articles/07/06/18/1726249.shtml&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;來自 Use Perl; 的新聞,&lt;a href="http://www252.pair.com/comdog/"&gt;Brian d foy&lt;/a&gt; 製作了一份關於學習 Perl6 的簡報以及錄音,可至上方連結下載。&lt;br /&gt;&lt;br /&gt;其他:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.sina.com.tw/872/article.php?pbgid=872&amp;amp;entryid=42944"&gt;開始學習 Perl 6 &lt;/a&gt;</content>

by c9s at August 18, 2007 12:46 PM

Parrot 0.4.13 Release News

&lt;a href="http://use.perl.org/articles/07/06/20/0311202.shtml"&gt;http://use.perl.org/articles/07/06/20/0311202.shtml&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;把 Parrot 0.4.13 Release News 稍微看了一下,原來 Php 也在 &lt;a href="http://parrotcode.org/"&gt;Parrot&lt;/a&gt; 要吃的範圍之內,專案代號叫做 Plumhead,全名是 &lt;a href="http://en.wikipedia.org/wiki/Plum-headed_Parakeet"&gt;"Plum-headed_Parakeet"&lt;/a&gt; ( 梅子頭鸚鵡? )&lt;br /&gt;&lt;br /&gt;其他更新的項目像是 Perl6 , Lisp, Lua, Python ("Pynie"), ABC, WMLScript, and Tcl ("ParTcl") 這些語言也都在 Parrot 的範圍當中,可以說是吃很大 ( &lt;a href="http://www.parrotcode.org/languages/"&gt;完整語言列表&lt;/a&gt; )。&lt;br /&gt;&lt;br /&gt;在 &lt;a href="http://www.perlfoundation.org/parrot/index.cgi?plumhead"&gt;Plumhead&lt;/a&gt; 的首頁上才得知,原來 Php 是以 lex , yacc 實做 parser ,其中實做 php parser 的有 &lt;a href="http://phpcompiler.org/"&gt;phc&lt;/a&gt; ( php compiler , but not yet compile php ) 可以產生 AST ( Abstract Syntax Tree ) 的 XML 輸出。</content>

by c9s at August 18, 2007 12:46 PM

Perl 5.9.5 Release

Perl 5.9.5 Release&lt;br /&gt;&lt;a href="http://use.perl.org/articles/07/07/09/0655239.shtml"&gt;http://use.perl.org/articles/07/07/09/0655239.shtml&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;所以 Perl 5.10 快出來了,正在暖身中,期待 Perl 5.10 帶來的效能革命,接下來就是要與 Perl 6 接軌。</content>

by c9s at August 18, 2007 12:46 PM

Perl - Buffering

在 Perl 如果想做類似以下的處理:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;print "Processing..."&lt;br /&gt;do_something&lt;br /&gt;print "Done"&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;對以上這段程式,Perl 會自動幫你做 Buffering , 於是會先印出 Processing...Done 然後才會開始 do_something. 解決的方式如下:&lt;br /&gt;&lt;br /&gt;Turn off buffering:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$|=1;&lt;/code&gt;</content>

by c9s at August 18, 2007 12:46 PM

Perl OO

恩,這是 Perl OO 的方式,如果要在 Class 裡面塞一個 Array ...我覺得這種方式實在很彆扭.. .用 &lt;a href="http://www.blogger.com/www.theperlreview.com/Articles/v0i0/structured_classes.pdf"&gt;Class::Structured&lt;/a&gt; 也沒有好到哪裡去... Orz&lt;br /&gt;Perl 6 趕快成熟吧,我想要&lt;a href="http://en.wikipedia.org/wiki/Perl_6#Object-oriented_programming"&gt;這樣寫&lt;/a&gt;。&lt;br /&gt;&lt;pre class="code"&gt;#!/usr/bin/perl&lt;br /&gt;use strict;&lt;br /&gt;&lt;br /&gt;package TEST;&lt;br /&gt;sub new {&lt;br /&gt;my $class = shift;&lt;br /&gt;my $self = {&lt;br /&gt; i =&gt; 0&lt;br /&gt;};&lt;br /&gt;bless $self,$class;&lt;br /&gt;return $self;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub push {&lt;br /&gt;my $self = shift;&lt;br /&gt;push @{$self-&gt;{queue}} , $self-&gt;{i} ;&lt;br /&gt;$self-&gt;{i}++;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub pop {&lt;br /&gt;my $self = shift;&lt;br /&gt;return pop @{ $self-&gt;{queue} };&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;1;&lt;br /&gt;&lt;br /&gt;package main;&lt;br /&gt;&lt;br /&gt;my $t = new TEST;&lt;br /&gt;$t-&gt;push();&lt;br /&gt;$t-&gt;push();&lt;br /&gt;$t-&gt;push();&lt;br /&gt;print $t-&gt;pop();&lt;br /&gt;&lt;br /&gt;1;&lt;/pre&gt;</content>

by c9s at August 18, 2007 12:46 PM

IRCBot

真好玩。 :P &lt;br /&gt;Perl 真好用。</content>

by c9s at August 18, 2007 12:46 PM

Links Today

&lt;a href="http://mag-sol.com/train/teachin/"&gt;Perl Teach-In&lt;/a&gt; from &lt;a href="http://london.pm.org/"&gt;London.pm&lt;/a&gt;&lt;br /&gt;&lt;a href="http://tetralet.luna.com.tw/index.php?op=ViewArticle&amp;articleId=174&amp;blogId=1"&gt;Linuxer - 不會抱怨的一群人&lt;/a&gt;&lt;br /&gt;&lt;a href="http://ubuntu.wordpress.com/2007/05/21/300-easily-installed-free-fonts-for-ubuntu/"&gt;300+ Easily Installed Free Fonts for Ubuntu May 21, 2007&lt;/a&gt;&lt;br /&gt;&lt;a href="http://ubuntuforums.org/showthread.php?t=20976"&gt;HOWTO: Hoary ClearType-like fonts&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;# 筆電慢到爆炸,不知道"今天" Presentation 會不會出錯,祈禱 OpenOffice 不要給我脫線...</content>

by c9s at August 18, 2007 12:46 PM

Catalyst: 建立不同 Controller 對應的 TTSite Template

在 Catalyst::Manual 的 Tutorial 上只講到如何建立 TTSite Template ,但是如果要讓不同 Controller 都能有不同的 Template 該如何做? &lt;br /&gt;&lt;br /&gt;一般來說, TTSite 建立的 template 會放在 root/src , root/lib 。&lt;br /&gt;Project Name 以 MyApp 為例 , 我們先建立 Cart 的 View&lt;br /&gt;&lt;code&gt;$ script/MyApp_create.pl View Cart TTSite&lt;/code&gt;&lt;br /&gt;之後,將原本的 root 內的 src , lib 搬到 root/cart/ 內,接下來,編輯 lib/MyApp/View/Cart.pm:&lt;br /&gt;&lt;pre class=code&gt; 6 __PACKAGE__-&gt;config({ &lt;br /&gt; 7 CATALYST_VAR =&gt; 'Catalyst',&lt;br /&gt; 8 INCLUDE_PATH =&gt; [&lt;br /&gt; 9 MyApp-&gt;path_to( 'root','src' ),&lt;br /&gt; 10 MyApp-&gt;path_to( 'root','lib' )&lt;br /&gt; 11 ],&lt;br /&gt; 12 PRE_PROCESS =&gt; 'config/main',&lt;br /&gt; 13 WRAPPER =&gt; 'site/wrapper',&lt;br /&gt; 14 ERROR =&gt; 'error.tt2',&lt;br /&gt; 15 TIMER =&gt; 0&lt;br /&gt; 16 });&lt;/pre&gt;將 path_to 設成:&lt;pre class=code&gt; 6 __PACKAGE__-&gt;config({ &lt;br /&gt; 7 CATALYST_VAR =&gt; 'Catalyst',&lt;br /&gt; 8 INCLUDE_PATH =&gt; [&lt;br /&gt; 9 MyApp-&gt;path_to( 'root','cart', 'src' ),&lt;br /&gt; 10 MyApp-&gt;path_to( 'root','cart', 'lib' )&lt;br /&gt; 11 ],&lt;br /&gt; 12 PRE_PROCESS =&gt; 'config/main',&lt;br /&gt; 13 WRAPPER =&gt; 'site/wrapper',&lt;br /&gt; 14 ERROR =&gt; 'error.tt2',&lt;br /&gt; 15 TIMER =&gt; 0&lt;br /&gt; 16 });&lt;/pre&gt;最後只需要在 Cart 的 Controller 加上:&lt;pre class=code&gt; 28 sub end : ActionClass('RenderView') { &lt;br /&gt; 29 my ( $self , $c ) = @_;&lt;br /&gt; 30 $c-&gt;forward('MyApp::View::Cart')&lt;br /&gt; 31 unless ( $c-&gt;res-&gt;body || !$c-&gt;stash-&gt;{template} );&lt;br /&gt; 32 }&lt;/pre&gt;將 RenderView 導向到 Cart,完工。&lt;br /&gt;&lt;br /&gt;Ref:&lt;br /&gt;[1] &lt;a href="http://search.cpan.org/~sri/Catalyst-5.61/lib/Catalyst/Manual/Cookbook.pod"&gt;http://search.cpan.org/~sri/Catalyst-5.61/lib/Catalyst/Manual/Cookbook.pod&lt;/a&gt;&lt;br /&gt;[2] &lt;a href="http://search.cpan.org/~mramberg/Catalyst-View-TT-0.25/lib/Catalyst/View/TT.pm"&gt;http://search.cpan.org/~mramberg/Catalyst-View-TT-0.25/lib/Catalyst/View/TT.pm&lt;/a&gt;</content>

by c9s at August 18, 2007 12:46 PM

Catalyst Redirect Problem

如果在 Controller 內有用到 &lt;pre class=code&gt;$c-&gt;response-&gt;redirect();&lt;/pre&gt;&lt;br /&gt;以及&lt;pre class=code&gt;109 sub end : ActionClass('RenderView') { &lt;br /&gt;110 my ( $self , $c ) = @_;&lt;br /&gt;111 $c-&gt;forward('MyApp1::View::Account');&lt;br /&gt;113 }&lt;/pre&gt;在 RenderView 時,因為沒有指定 $c-&gt;stash-&gt;{template} ,因此最後在做 RenderView 時會出現 file not find。 因此 RenderView 要加上:&lt;pre class=code&gt;109 sub end : ActionClass('RenderView') { &lt;br /&gt;110 my ( $self , $c ) = @_;&lt;br /&gt;111 $c-&gt;forward('MyApp1::View::Account')&lt;br /&gt;112 unless ( $c-&gt;res-&gt;body || !$c-&gt;stash-&gt;{template} );&lt;br /&gt;113 }&lt;/pre&gt;這樣就會只在有指定 template 的時候,才會導向到 Account 的 View 。</content>

by c9s at August 18, 2007 12:46 PM