前にインストールした時は適当に強制インストールしたので、今回はテストに失敗する様子をログにしてみた。
で、まずはModule::Collectに失敗した様子をとったのだが、すでにレポートされていた。
FAIL Module-Collect-0.05 MSWin32-x86-multi-thread 5.1 - nntp.perl.org
意気消沈。
結局強制的に入れたので、Module::Setupの方も強制的に入れた。
前にインストールした時は適当に強制インストールしたので、今回はテストに失敗する様子をログにしてみた。
で、まずはModule::Collectに失敗した様子をとったのだが、すでにレポートされていた。
FAIL Module-Collect-0.05 MSWin32-x86-multi-thread 5.1 - nntp.perl.org
意気消沈。
結局強制的に入れたので、Module::Setupの方も強制的に入れた。
面白そうなスクリプトを見つけたので試してみた。
はてなブックマークのお気に入り候補を見つけるPerlスクリプト/楽
が、途中でエラーになった。
Not Found
Can not parse [http://b.hatena.ne.jp/entry/rss/http://d.hatena.ne.jp/amatubu/20090322#p1].
ソースを見たら、XML::Feedでエラーになったら死ぬ事になっていたが、まあ、飛ばすだけでいいだろうと言うことで、適当に改造して使った。
結果はこんな感じ。
001 : 017 : otsune : http://b.hatena.ne.jp/otsune/
002 : 017 : lapis25 : http://b.hatena.ne.jp/lapis25/
003 : 015 : typewhite : http://b.hatena.ne.jp/typewhite/
004 : 013 : charsbar : http://b.hatena.ne.jp/charsbar/
005 : 012 : miyagawa : http://b.hatena.ne.jp/miyagawa/
006 : 011 : naoya : http://b.hatena.ne.jp/naoya/
007 : 011 : hide-K : http://b.hatena.ne.jp/hide-K/
008 : 010 : jazzanova : http://b.hatena.ne.jp/jazzanova/
009 : 009 : bayashi_net : http://b.hatena.ne.jp/bayashi_net/
010 : 009 : tomisima : http://b.hatena.ne.jp/tomisima/
少し新しい世界が見えた気がします。
パッチは以下のとおり。
昔に作ったファイルを見ていて、よくわからないコードが出てきたので調べた。
それは、ハッシュのスライスだった。
未だに覚えられないのは、やはりあまり使わないからだろうなぁ
。
で、なんとなく思いついたので、ハッシュを作成するベンチマークを取ってみた。
何も考えずに書くとループして作るだろうなぁ、という感じのループと、そのループを展開したもの、そしてスライス代入と直接代入の4種類。
Benchmark: running Unroll, direct, for, slice for at least 3 CPU seconds...
Unroll: 2 wallclock secs ( 3.16 usr + 0.00 sys = 3.16 CPU) @ 264160.01/s (n=833689)
direct: 2 wallclock secs ( 3.15 usr + 0.00 sys = 3.15 CPU) @ 287373.38/s (n=906663)
for: 3 wallclock secs ( 3.13 usr + 0.00 sys = 3.13 CPU) @ 174892.19/s (n=546713)
slice: 3 wallclock secs ( 3.00 usr + 0.00 sys = 3.00 CPU) @ 282924.03/s (n=849055)
Rate for Unroll slice direct
for 174892/s -- -34% -38% -39%
Unroll 264160/s 51% -- -7% -8%
slice 282924/s 62% 7% -- -2%
direct 287373/s 64% 9% 2% --
ハッシュを直接書くよりはさすがに遅かったが、それにしても2%しか差がないのは驚き。
これは使わない手はないね。
で、ソースは以下のとおり。
Windowsのコマンドプロンプトは使いにくいので、最近は使っているエディタからスクリプトを起動することが多いのだが、utf8で書いたコードは文字化けして読めない。
まあ、設定があるのかもしれないけど。
あと、同じく設定があるとは思うのだけど見つからないのが、新規ファイルの文字コードの指定。
新規ファイルを作るとANSIになってしまって、うっかり保存すると日本語が化けた状態で保存されてしまう。
で、今のところ、そのどちらもカバーするようなひな形を作って、そこからスクリプトを書いていくようにしている。
そのひな形は以下のとおり。
先日のKansai.pmで発表されていた、ループアンローリングを試してみた。
発表のスライド:Cell Challenge 2009 参加記
Wikipedia:ループ展開 - Wikipedia
ループアンローリング自体はWikipediaによればループ展開ということだが、目的としてはデータハザード(データ依存のために計算の並列処理が不可能になること)をなるべく回避するのが目的であった。
スライドの30枚目に展開の方法が書いてるので、それを実際に試してみた。
以下、ベンチマークの結果
Benchmark: running Unrolling1, Unrolling2, normal for at least 3 CPU seconds...
Unrolling1: 3 wallclock secs ( 3.00 usr + 0.00 sys = 3.00 CPU) @ 429810.06/s (n=1289860)
Unrolling2: 4 wallclock secs ( 3.05 usr + 0.00 sys = 3.05 CPU) @ 444432.88/s (n=1354187)
normal: 3 wallclock secs ( 3.01 usr + 0.00 sys = 3.01 CPU) @ 210117.41/s (n=633504)
Rate normal Unrolling1 Unrolling2
normal 210117/s -- -51% -53%
Unrolling1 429810/s 105% -- -3%
Unrolling2 444433/s 112% 3% --
Unrolling1は普通に展開したもの。
Unrolling2が展開後に計算順序を入れ替えたもの。
normalは普通のforループ。
計算の順序を入れ替えると、ほんの少しだが速くなった。
多少なりともデータハザードがある、ということなのだろう。
ソースは以下のとおり。
Text::MicroTemplateのソースを見ててわかりましたが、CPANオリジナル版とCodeRepos版では仕様が違うようです。バージョン表記は同じですが。
前の記事でraw_stringの書き方が変わった、と書いていますが、それはCodeRepos版のText::MicroTemplateです。
CPAN版は、以前の書き方でも問題なく書けます。
勝手に作ったアーカイブはCodeRepos版なのでご注意ください。
個人的にはCodeRepos版の方がいいかな、とは思います。
コードを実行するだけの時は「?」、出力が必要な時は「?=」、という具合に、シンプルに覚えられます。
細かい内容については、Kansai.pmのページから誰かがアップしてくれているページが見れるので、個人的な感想とか気になったこととかをメモ。
・イベント/第11回ミーティング報告 - Kansai.pm
開始前
・集合場所についたら、すでにそれらしき人たちがいた。
・オフ会は久しぶりだったので、なんかそういう空気に懐かしさを覚えた。まあ、知らない人が見たら怪しい集団だっただろうなぁ。
・あまりミーハーではないと思っていたが、はてなオフィスとか、生naoyaさんを見ると、なんだか妙に嬉しくなってにやけてきた。
発表
・Cell Challenge 2009の規定問題(文字列の編集距離計算)について。
PS3にはとんでもないCPUが使われている、ということを初めて知った。
高速化にはアルゴリズムによって単純計算にする事がとても重要。
ビット並列化とループアンロールが鍵。何かで使えるかな?
・HTML::ExtractContentについて。
「本文らしさ」をヒューリスティックにスコアリング。
本文の解析が苦手なページもあるが、その辺は補いながら使うのが吉。
・コルーチン
コルーチンというのは、中断や再開ができるサブルーチンのこと。
Perlでコルーチンを使うならCoroだが、色々と足りないのでFiber.pmを作った。
使いどころが思いつかなかったけど、ジェネレータのコードを見て、そういう使い方か、と思った。
・スペルミス修正プログラム
キーワードは編集距離とNグラムインデックスとJaro-Winkler。
辞書にははてなキーワードを使える。
・PerlMol
馴染みのない分野なので?だらけ。
化学式の原子モデル(?)から3Dモデルで表現することもできそうな感じのソフトウェア?
・名札メーカー
名刺メーカーではない。
名札から文字がはみ出ないように縮小しているのが特徴的。サンプルは文字が小さすぎて線のように見えたのが面白かった。
・POPFile
単純ベイズ法によるメールの自動振り分けソフトウェア。結構使っている人がいた。私は知らなかった。
4人チームのうち唯一の日本人メンバーだそうで日本語担当だとか。
・Kansai.pm活動報告とStrawberryPerl
活動報告は写真が少なかった。今年はもっと活動したいね。
Windowsなら、やっぱりStrawberryPerlはオススメ。
・Social SKK
SKKは知らないのですが、カスタム辞書にPerlのスクリプトが指定できるのか?
発表が終わったあとにshipitでCPANに登録。登録後、会場の拍手が暖かかった。
MENTAを追いかける絡みでNanoAにも手を出しましたが、もし、今からこれらのフレームワークに入門(あるいは再入門)するのであれば、とりあえず最新版(MENTAは0.14、NanoAは0.17)にしたほうが良いでしょう。
というのは、これらの最新版で使われているテンプレートエンジンはText::MicroTemplateですが、それ以前のものはMENTA::Templateが使われています。
それに伴って、若干ですが文法にも違いがあります。
なので、古いMENTAやNanoAで作ったプログラムは、最新版ではエラーによって動かない場合があります。
文法の大きな違いは、HTMLエスケープについてです。
テンプレートファイルに埋め込んだPerlの出力は、デフォルトでHTMLエスケープされることになっています。これは、セキュリティと利便性が大きく関与しています。
参考:Kazuho@Cybozu Labs: Text::MicroTemplate - テンプレートエンジンのセキュリティと利便性
エスケープしないようにするには、以前は次のようにしていました。(タグ形式の場合)
<?=r $hoge ?>
しかし、Text::MicroTemplateを使用している最新版のMENTAやNanoAでは以下のようにします。
<?= raw_string($hoge) ?>
ただ、これは正式にアナウンスされていない(?)ようですし、また、最新版のアーカイブもオフィシャルからは案内されていません。
もちろん、最新のソースを手に入れることはできます。
MENTAはGitHubから「Download」できますし、NanoAは以前の記事のとおりCodeReposからチェックアウトして手に入れます。
とはいえ、なかなか面倒だと思いますので、勝手にアーカイブを用意しました。
前回は失敗したが、CodeReposにあるNanoAで再挑戦してみる。
NanoAの配布元は0.16が最新だったが、CodeReposの最新版は、バージョンが0.17であった。
CodeRepos版は開発版ということで、そのまま使えるはずだったのだが、Windows上で使うには少し工夫が必要だった(詳しい説明は「lib/NanoA/Config.pm」に書いてあるので、そちらを読もう)ので、将来のため(?)に手順をメモしておく。
まず、CodeReposからsvnで外部参照ごとチェックアウトする。
svn co http://svn.coderepos.org/share/lang/perl/NanoA/trunk NanoA
次に「nanoa.cgi」と同じフォルダに「nanoa-conf.cgi」という名前のファイルを作成する。その中身はとりあえず以下のとおりにしておく。
data_dir = var
ついでに、同じフォルダに新しく「var」というフォルダを作っておく。
ここまでやってから、nanoa.cgiにブラウザでアクセスすると、管理用パスワードの設定画面になる(はず)。
開発版のまま使うのならこれでOK。
cpanから普通に入れようとしたが、失敗した。
で、色々と調べていたのだが、どうやらStrawberryPerlでは「ppm」も使えるらしいということで、ppmからGDをインストールしてみた。
参考:[覚書] strawberryperl - てきとーにやる
コマンドプロンプトから「ppm」として、「install GD」でEnterすると、本当にインストールするか訊かれるので、「y」を入力してEnter。
結果、あっという間にインストール完了。
今まで苦労したのは何だったんだ、と思わずむかついてしまうほどに簡単にインストールできた。
あまりにむかついたので、Net-SSLeayも入れてやった。
せっかく手順を記録していたのに
ppmでこんな簡単にインストールできるなんて
。なんか泣けてきた。
ただ、バージョンが古い場合もあるので、注意は必要。
NanoAを使ってみようと思って、最新版の0.16を入れてみたのだが、Windows上ではうんともすんとも反応しない。
install.cgiを試してみたが動かなかったので、tarballを取ってきて解凍。
nanoa.cgiにアクセスするも反応がない。
ANHTTPDを使ってるからかもしれないので、cgi版を取ってきて共用サーバー(ちなみにxrea)で実行してみたが、system/setupにアクセスした時点でエラーになった。
デバッグモードにしてどうにかエラーメッセージを見たら、pluginのsession.pmが犯人らしい(?)のだが
。
エラーメッセージ。
Modification of a read-only value attempted at app/plugin/session.pm line 38.
検索していたら、同じように困っていた人を発見した。
bulkitem Diary - NanoAをインストールしてみた。
うーむ。
日テレアプリで石原さとみを検索しようとしたら文字化けして困ってしまった。
どうにかURIモジュールを使ってやろうと思って調べたら、実はブックマークしていた記事にたどり着いた。
参考:URIモジュールにutf8フラグつきの文字列を食わせたらquery_formのエンコードが化けたでござるの巻 - とあるモバイル系エンジニアの日々
この記事を踏まえた結論としては、query_formを使うときは、「no utf8」のスコープでやるのが良い、ということ。
先日、結果的にクリーンインストールしてしまったPerlに、モジュール群を入れているのだが、Plaggerをインストールする際に必要な「Net-SSLeay」のインストール記事が我ながらわかりにくかったので、もう一度今後のために書いてみる。
StrawberryPerlのサイトに行ったらバージョンアップしていたことに気がついて(遅いけど)、上書きインストールをするつもりでそのままインストールした。
その時、やたらと時間がかかるなぁ
と思っていたら、インストールしていたモジュール群がきれいさっぱりなくなっていた。
つまり、自動的にアンインストールしたあと、インストールされていたのだ。
苦労して入れたモジュールもあったのに、失敗したなぁ。
次からはzipでインストールするようにしよう。
メーリングリストで活発に準備の様子が伝わってきていて、いきたい気持ちがクライマックスに達した時に、告知がありました。
こういうミーティングに行くのは初めてで、今から楽しみです。
周囲にPerl(というか、プログラム自体)に詳しい人がいないので、良い刺激になるんじゃないかと、とても期待しています。
自分のブログをブックマークしてくれた人のはてなダイアリーのリストを返すスクリプトがあった。
しかし、リニューアル後のはてなには対応していなかったので、勝手に改造して使うことにした。
まあ、ダイアリーやってない人も多いんだけどね。
最近からかもしれないけど、Last.fmでmp3の無料ダウンロードをやっているようだ。
参考:Last.fm からのおすすめ無料mp3 - Last.fm
ちょうどWWW::Mechanizeを試していたので、それとWeb::Scraperを組み合わせてダウンロードするスクリプトを作った。
わかってしまえば単純なことでした。
process 'a[href=~/\.jpe?g$/]', 'urls[]' => '@href';
XPathでも同じようにできます。
process '//a[@href =~ /\.jpe?g$/]', 'urls[]' => '@href';
Web::Scraperにはフィルタの概念があって、取得してからごにょごにょできるので、そっちのほうばかり調べていました。
例えば以下のようなHTMLの場合、そのまま取得すると、前後に改行が入ってしまいます。
<title>
タイトルなのだ
</title>
で、それを取得する時に、前後の改行を削除してやることができます。
process 'title', 'title' => ['TEXT', sub { s/^\s+//o; s/\s+$//o; } ];
こういう機能をフィルタと呼んでいます。
その機能を先に知ったので、取得したあとに拡張子を調べてマッチした場合だけ追加する、という方法を探していたのですが、考えてみれば、取得してからきれいにするよりも、最初からきれいに取るほうがいいですね。