■2004-12-03
* [Perl] アドベントカレンダ
Perl Advent Calendarなるものがあるんですねえ。日毎に色々なCPANモジュールのTipsがあって面白い。
* [雑感] アンフェアネス
平和落書きで逮捕の裁判に興味深い話が。 壁はビラを貼るためにで書いた話の関連。ある落書きは不起訴になり、ある落書きは「建造物損壊」として起訴される……。量刑の不公正である以前に、起訴・不起訴の境目の不公正。
* [雑感] ういてる
深夜にGUM ComicsのCM観て、件の雑誌で『豪放ライラック』が浮いていることを改めて感じました。
* [Perl] encoding
Perl は use encoding すれば変数やサブルーチンに日本語が使えるらしい。でもまだそんなソースを見たことが無いな。互換性かな。(http://www.horaguchi.net/)
実用性が無いからじゃないかしら。
■2004-12-05
* [Perl] multi-line grep
行越しにgrepってできないかなあをみて、きっと誰かつくってるんだろうなと探すと、jcode.plの作者によるmgというのが。
■2004-12-07
* [メモ] 貧者の武器
先日の「詭弁のガイドライン」は議論できない人ほどを持ち出したがるように見える 理由。
問題は、メディア・リテラシーの言説はむしろ、メディア・テキストをご都合主義的に信じたり信じなかったりする、というか「解釈」する言い訳にむしろ使われている、ということがある。(中略)思うに、こうした、メタ批判によって外部から与えられる情報と距離をとるという傾向はもっと一般的にいえるのであって、詭弁のガイドラインのようなものもそうだろう。こうしたメタ批判は、その適用において恣意的で選択的になることがないための抑制の原理がない限り、いつでも、外部情報の内容を、具体的に検証することなく拒絶する方法論に堕してしまう。(note of vermilion)
他者に対し適用することは、自分に対しても適用するように。内省的に心がけたいものです。自分内ストロングプログラム〜(違)
* [雑感] 議論は何のためにするか
「タワーけもの」のアイコンでお世話になっているサロン・ド・よしださんからトラックバックが! ……どうもご無沙汰しております。
相手の意見に穴を見つけたり、言い負かせば勝ちなのか? 勝った側の意見は正しいという事になるのか? (中略)
嘘や誤認識を含めて、色々な意見や見方がある状態を普通であるとみなしているので、意見が会わない人を言い負かそう、とかいう態度を取るにも、相手にそういう態度を取られるにも腰が引けてしまうのだが、こういうのはあまり論理的でない、と言われる態度なんでしょうかね。(議論とは真実への途に非ず)
月並みではありますが、私は、議論は自分の認識を深めるために行うものであって、「勝ち負け」を競うものではないと理解しています。自分の認識が誤った事実に基づくのなら、その誤りを指摘して貰った方が有り難いです。自分の認識に論理的な矛盾があれば、それを指摘してくれた方が、よりよいものになるかもしれません。もしかしたらならないかもしれませんし、矛盾の指摘をどうしても受け入れられないかもしれません。そういったものも含めて結局、議論は自分のために行うものです。だからそこに「勝ち負け」はないんです。
議論するということは、他者との交わりを通じて自分の狭い認識が広がっていくということです(広がるような相手と議論した方が良いですし、そのための努力を自分自身でしなければなりませんが)。その結果自分の観えている世界が変わるかもしれませんし、自分の意見が変わるかもしれません。そういう恐怖が絶えずついてまわります。だから、自分の意見に固執する人、自分の見たくないこと知りたくないことから目を背ける人は、たぶん議論のできない人です。ことさら「詭弁のガイドライン」を持ち出す(jounoさん言うところの「外部情報の内容を具体的に検証することなく拒絶する」)人というのは、まさにそのような人なのではないかと思うのです。
■2004-12-12
* [Perl] 酒は飲め飲め 飲むならば
二日酔いしない飲酒量は計算式でわかる!(ここ経由)。「好きなn時間だけほろ酔いを持続するための酒の量」というのもあるそうで、どうも「21世紀における国民健康づくり運動(健康日本21)」の資料が元ネタらしいのですが、どこにあるのかわかりませんでした。以前、「今月のAcme」でAcme::Drunkを翻訳しましたが、今度は上記の計算を自動でやってくれるAcme::Drunkardを自作してみました。
use Acme::Drunkard; # 定数Beer,Wine,Sake,Whiskyをexport my $checker = new Acme::Drunkard; $checker->weight(52); $checker->timespan(6); $checker->alcoholicity(12); # あるいは$checker->alcoholicity( Wine )等; if(my $result = $checker->result){ print "$result (ml)\n"; # $result->as_value } else{ print $checker->error; } # エタノール度数を与えなくとも各酒種換算可 $checker->weight(50); $checker->timespan(8); print $checker->result->as_BottleWine,"\n"; print $checker->result->as_MasuSake,"\n";
とりあえず、瓶・缶ビール、ウィスキー(シングル、ダブル)、ボトル・グラスワイン、升酒で換算機能つき(グラスワインは体積がデタラメ)。計算間違ってるかも。
* [メモ] 桑田乃梨子の漫画アニメ化、他
・桑田乃梨子の「だめっこどうぶつ」アニメ化。今更ですが、知りました。キッズステーションかぁ……
・NHKの会長はどうして責任を取って辞めないのですか? 日本放送労働組合はなかなかやるなと思いました。
■2004-12-17
* [雑感] Shibuya Perl Mongers テクニカルトーク #5
ふと思い立ってShibuya Perl Mongers テクニカルトーク #5に行って来ました。どなたのお話も非常に興味深いものでしたが、その中でいくつか感想を。
小山浩之氏の「再考ですかーっ JavaScript」では、CからJavascriptを利用したり、JavascripからCを使うことができるということを知りました。私は普段Javascriptを使わないのですが、以前必要になってオブジェクト指向プログラム言語としてのJavaScriptをみてJavascriptはすごいものだと思い、そして今回改めて魅力的なものに感じました。
「PerlとJavaで異言語Webサービス連携」(竹追良範氏)は、Javaのタイプマッピング関連の問題が興味深かったです。SOAP::LiteのUTF-8フラグによる文字化けは、Perl5.8以降でXML::Parserを使うと勝手にUTF-8フラグを立ててしまうという話。こういう5.8以降で勝手にUTF-8フラグを立てるモジュールの一つにSpreadsheet::WriteExcelがあります。ちょうどこの日、DBの集計結果をエクセルファイルにしてメールで飛ばすスクリプトを書いていたもので。(追記:UTF-8フラグを立てるのではなくて、UTF-8フラグを立てていないと文字化けするの間違いだったかも、後日確認します)
独り暮らしのおばあちゃんでも安心してPerlをメンテナンスするために、匠が力を貸すというコンセプトの「Perl大改造!!劇的ビフォーアフター」(早川真也氏)は、テレビ番組のパロディらしかったのですが、普段テレビを見ないので元ネタがわからずちょっと残念。レキシカルなサブルーチンの話が出たのですがSub::Lexicalなどで代替可?(ソースフィルタリングであって、Perlにパッチをあてるわけではないですが)。
「iPod&iTunes Hacks」(宮川達彦氏)の話は会社で報告したら、グローバルでの利用に同僚が大層興味を持ったようです。が、私はiPod持ってないし興味もないのでなんとも。むしろ気になったのはMath::Pariのどの辺りでひかかっているのかという部分。
「はてなの開発裏側見せますパート2」(伊藤直也氏)は、サーバやMySQLの話が興味深いものでした。
「アイスホッケーの成績集計とテスト駆動開発」(吉田裕美氏)。……とにかくアイスホッケーのルールは難しいらしい。
「JAPHを読む」(水野貴明氏)では、JAPH - "Just Another Perl Hacker"という文字列を表示するスクリプトの話でJAPHのすばらしさなどが参考に。http://www.perl.com/CPAN/misc/japhはどれもこれも一見の価値有りで、DNAの螺旋のコードが特に好きです。JAPHの話が出たので今月のAcmeに無理矢理もっていきましょう。
* [今月のAcme] Acme::JAPH
実際には11月分のAcmeなのですが。Acme::JAPH。使用例を見ると(一部改行)
use Acme::JAPH a;ltiucqpoc3iqp04tu1 -394t8[ieufea[=09E U 0ET 9u [4tu]]]
とあります。これでちゃんとJust another Perl hacker,って表示されるのです! なぜならモジュールにprint "Just another Perl hacker,\n"; exit;
って書いてあるから。問答無用で実行されて終了。Acmeらしいですね。微笑ましいですね。
■2004-12-21
* [Perl] ActivePerl 5.8.6
ActivePerl 5.8.6がリリースされていました。
* [今月のAcme] 今月の……
Acme(本年最後)の変わりにPHP::Perlinfoを紹介しようと思ったら、既に紹介されている方が。改めて12月分のAcmeを探したいと思います。"Content-Type: text/html を最初に吐き出す
" のは、もとのphpinfo()がContent-Type: text/htmlを吐き出すのをまねているからのようにも思えます。
ついでに次の記事で知ったClass::DBI::Plugin::Iteratorをメモ。素晴らしい。さっそく勤め先で試してみたいな。
* [Perl] Plugin::Iteratorの利用
Class::DBI::Plugin::Iteratorを使ってみました。Class::DBI::Pagerと一緒に使うと速いはやい。ただnextを使うとそのたびにSQLが発行されるので手元にある既存のコードで使おうとするとやばいかも。試しにPostgres 7.2で約23000件のデータをretrieve_allしてひたらすら$it->nextしてみました。通常のDBI::Class::Iteratorだと全部まわるのに6秒(retrieveするところから計測)。次にPlugin版ですが、最初の1000件目がまわるのに5秒、次の1000件に11秒、以下17, 24, 29……と、累積的に時間がかかって、いつ果てるともわからないので5000件経過した時点で強制終了。
そこで、LIMITに任意の値を与えられるようにして、データがあるうちはSQLを発行しないように改良してみました。LIMITの値を増やしていくとLIMITが100で全部まわるのに23秒。以下500→11秒、1000→9、2000→8、5000→8、10000→8。同様に約190000件のデータでやってみたところ、通常版48秒に対しLIMIT 10000で64秒。これで一安心?
差分はこんな感じ(下に修正版)。
use Class::DBI::Plugin::Iterator; __PACKAGE__->next_cache_num(200);
next_cache_numを呼び出さない場合は100に設定されます。
[追記] 最初のものは、毎回律儀にfetchしていたので処理に時間がかかるのと、fetchし終わった後にnextするとエラーになりました。そこで一気にオブジェクトを抱えるように修正しました。約190000件のデータはnext_cache_num(10000)で45秒に。 差分2(v.0.03に対して)
■2004-12-26
* [今月のAcme] Acme::Don'tとAcme::ComeFrom(本年最後のAcme)
本当はInline::Perl→Acme::Inline::Perlの流れでいきたかったのですが、例によって他所で紹介されてしまっているので、やめまして。本年最後は二つ取り上げましょう。最初はAcme::Don't。
use Acme::Don't; don't { print "This won't be printed\n" };
Perl組み込みのdoの反対に、なにもしません。これは'
が::
の読替になることを利用しています(昔のコードでよく見られる
jcode'convert みたいな)。
Acme::Don'tの応用でAcme::X'mas::IsWrong。ってのもできますね。 →参考:NOVAのクリスマスCM、表記を変更。中学のときにX'masという表記は間違いだと知って、周囲にその旨説明したのですが、当時はいっこうに信用してもらえなかったですよ。良い時代になったものです(?)
で、もう一つは行く年来る年に相応しくAcme::ComeFrom。Inline::Perlの作者と同じ方です。Perlに限らずよく知られたgoto
の反対でcomefrom。comefrom LABEL
とすると、LABEL行の文を実行する前にcomefromにジャンプします。comefrom 式
はスコープ内で動的にラベルが決定されて、対応するラベルからジャンプしてきます。最後にcomefrom &サブルーチン名
は、対応するサブルーチン名を実行した後、ジャンプしてきます。
面白いことに、同一のcomefrom LABEL
やcomefrom &サブルーチン名
などが複数存在していると、forkすることで全て枝分かれに実行されていきます。INTERCALというのからインスピレーションを受けているらしいです→INTERCAL 情報。
やあ、これで今年のAcme紹介(100%自己満足)はおしまい。
■2004-12-29
* [Perl] Class::DBI::Plugin::Iteratorの改造2
Class::DBI::Plugin::Iteratorのcountは、SELECT 〜 FROMの部分を一律にSELECT count(*) FROM に書き換えるので、Music::CD->search(year => 2004, {order_by => 'artist'});
のようにORDER BYを利用すると動作しません。また例えばset_sqlを通じてGROUP BYを利用する場合、期待通りには動かないはずです。そこでnextに続き、countも改造してみました。
ORDER BY節は削除し、GROUP BY節は副問い合わせにします(ので、FROM節で副問い合わせのできないシステムではGROUP BYを入れるとcountできません)。
あとイテレータの切り替え用にplugin_iterator_off
というクラスメソッドも追加。また、next_cache_num
をイテレータ側にもオブジェクトメソッドとして導入。これで大分使い勝手がよくなりました。 (v.0.3との差分)
_ H [「詭弁のガイドライン」「悪魔の証明」。 武器として用いられることもある。 でも、問題なのは、本当に詭弁、本当に悪魔の..]
_ まかまか [適切に使う分には、これらのことを指摘することに意味があるという点は私も同意です。]