■2004-07-02
* [Perl] Math::Pari::PP4Crypt
Authen::TypeKeyをFreeStyleWikiに組み込めるか、というしょうもないことを試そうとしたら、Crypt::DSA(とCrypt::Random)が必要に。これらのモジュールはさらにMath::Pariというモジュールを必要とするのですが、ここのレンタルサーバではMath::Pariが利用するライブラリをコンパイルすることができませんでした。そこでこれもPurePerlで動かすことに挑戦。本物のMath::Pari、というかpariは多機能な数学用ライブラリらしいのですが、ここでは暗号・復号に必要な部分だけをMath::BigInt等で実装しました。Crypt::Random、Crypt::DSAのテストが通ります。Cで書かれていないのでCrypt::DSAでの暗号鍵生成は、実用に耐えないぐらいに遅いですが。ソースがぐちゃぐちゃなので折を見てブラッシュアップします。
* [雑感] 朝食
先週は隣県に住んでいる叔父から家庭菜園で採れた野菜を頂きましたので、キュウリ1本(だけ)が朝食だったりしました。キュウリだけではお腹が空くということがわかりました。その後、大家さんから自家製栽培のキュウリを頂きました。たぶん来週の朝ご飯もキュウリだと思います。
* [メモ] デモとCGI
「遠い空で」、ジェネジャン~戦争~などを読み、ふと思うところがあって「何故私はデモにいくのか」という話を書こうと思ったのですが、面倒なのでやっぱりやめました(本当は以前書いたんですが、読み返しても面白くなかったの)。正確には「人はなぜデモを厭うか」ということが書きたかったのですが。
その代わりにCGI関連の日記らしいものを知ったのでご紹介。anti-war web-demo。……名前の通りです。これをさらに実際の地図と対応させられたら面白いなあ。代々木公園から始まって新宿までとか、日比谷から東京までとか。で出発地点に税金を使って勝手に顔写真をとってくださる公務員の方々なんかも登場して……夢が膨らみますね!
■2004-07-06
* [今月のAcme] Acme::ProgressBar
すっかり忘れていたので「先月のAcme」。Acme::ProgressBar。時間のかかる処理を行なうときに、うにょうにょと伸びて、あとどれくらいで完了するか一目でわかる「プログレスバー」を簡単にこさえてくれるモジュールです。引数に実行させたいサブルーチンのリファレンスを渡します。
ただ、このモジュールには大きな欠点がありまして、渡した処理が終わってからプログレスバーが伸び始めます。だめじゃん。
■2004-07-10
* [Perl] XML系二つ
XML::Parser::LiteHeavyのページと楽々設置 XML::Atomのページをつくりました。例によって使い道のない代物です。FreeStyle Wiki用にAtom for WIKIの実装をと思ったのですが、今いち仕様がよくわからない……
■2004-07-12
* [雑感] マツケン きた
というわけで、『マツケンサンバII』様がやっと届きましたよ。どの曲も良いですが、マツケンマンボが演歌調とマッチして絶妙。今日は夕方から大変気分がすぐれなかったのですが、聴いているうちに元気になりました。
来週友人の結婚式があるので友人らとぜひ歌いたいものです。 マ・ツ・ケ・ン サンバ オレ!
_ 泥酔している郷里の友人 [オレッ!オレッ! マ・ツ・ケ・ン、マ・ツ・ケ・ン、マ・ツ・ケ・ン・サ~ンバ~、オレッ! 聞いたか、サンバ マンボもい..]
■2004-07-23
* [雑感] ついにこうさぎがFSWikiに
何か書こうとしてくれました。実際にはWikiには書き込まれていないのですが、ログをみると以下のとおり。
[Perl] Acme::ProgressBar(こうさぎ) きょうTamaがblogしたよ♪
*このエントリは、こうさぎの「Tama」が書きました。
これ、FSWikiだと<a>が使えないですね。なぜ書き込まれていないのかは謎。
* [Perl] WindowsでCPANモジュールをmakeしてみる
今さらながらVisual C++ Toolkit 2003をインストールしてみました。試しにCPANモジュールをmakeということで、まずはStorable.pm。Active Perl 5.8.3までに付属のStorableは、マルチスレッドで利用の場合に不具合が発生します。そのため、Thread::Tieなどでperlがクラッシュしたわけですが、最新版では大丈夫なはずなので早速コンパイル。Active Perlの5.8.3で使ったところ、今度はクラッシュしません(5.8ではクラッシュしましたが、たぶん5.8.1からら大丈夫だと思います)。ただし、Thread::TieはそのままではThread::Tie::Threadがデッドロックしたりと問題があるので改造が必要です(気が向いたらithreadsメモに書きます)。
あともう一つはPAR。以前このサイトでもとりあげたPARですが、いやな日記(2004-07-16)によりますとthreadsと併用するとクラッシュするとあります。
で、こちらで同様の問題が指摘されていて、レスをみると最新のものを一からコンパイルすると良いとありました。早速makeしてみます。parl.exeとparldyn.exeができてテストも通るのですが、ppを使って生成した実行ファイルを起動すると、うんともすんともいわず、ひたすらメモリを喰っていきます。失敗ですか。
追記:上記は間違いでした。threadsをuseできるだけですね。5.8.3でコンパイルして試しましたがスレッドをcreateするとやっぱり落ちました。
* [Perl] PARとマルチスレッド(threads)
とりあえず、ppで実行ファイル化してもクラッシュしないthreads利用アプリの作りかたを考えてみました。
#-- thr.pl package thr; use attributes; sub new{ threads->new( @_ ); } 1; #-- test.pl $| = 1; use warnings; use strict; use threads; use threads::shared; main(); sub main{ require 'thr.pl'; my $var : shared = 1; thr::new(sub{print "$var\n";$var++;})->join; thr::new(sub{print "$var\n";$var++;})->join; print "ok $var\n"; } >pp -a "thr.pl" test.pl
これでいけました。
* [Perl] Visual C++ Toolkit 2003でCPANモジュールをmake
Active Perl使っている人でVC++持っていない方向け。Visual C++ Toolkit 2003の導入に関してはここの方の説明がすっきりまとまっていらっしゃいます。
あとはCPANモジュールをmake(nmake)するためにCore SDKの他にMDAC SDKをいれるとよいでしょう(odbc32.libなどが必要な場合があるので)。それから、(デフォルトで入れた場合の)~\Microsoft Visual Studio .NET 2003\Vc7\lib\msvcrt.libを~\Microsoft Visual C++ Toolkit 2003\libにコピーするとよいかも。
■2004-07-25
* [Perl][CGI] QRコードの生成
仕事場でQRコードの話になり、試しにCPANのGD::Barcode::QRcodeをいじってみました。
さて、このモジュールはGDライブラリを使って画像を生成するわけですが、レンタルサーバなどではGDを使うのが困難やもしれません。でもよく考えると、どうせ白黒二色だけなのですから、xbm形式で吐き出せばGDも必要ありません。そこでImage::Xbmの登場です。xbm形式なのでブラウザによっては標準で画像を表示できるでしょう。あとは何とか別のフォーマットに直すなりそのまま印刷するなりして下さい。印刷したQRコードは、おでこに貼り付けたり、背広の裏地にするなど使い道は色々。夢が膨らみます。
というわけで、実際の完成物→QR生成CGI。QRcodeモジュールのデータが大きかった(約10M)ので、データ量を減らすため、このサイトでは誤り訂正レベルはLかMだけにしてあります。
#!/usr/bin/perl use strict; use CGI; use GD::Barcode::QRcode; use Image::Xbm; # Image::Baseが必要 main(); sub main{ my $q = new CGI; my $data = $q->param('content'); my $ecc = $q->param('ecc') || 'L'; my $size = $q->param('size') || 1; print $q->header(-type=>'image/x-xbitmap'); my $qr = GD::Barcode::QRcode->new($data, {Ecc=>$ecc,Version=>0,ModuleSize=>$size} ); Image::Xbm->set(-setch=>'1',-unsetch=>'0'); Image::Xbm->new_from_string( $qr->barcode ) ->save('-'); }
GD::Barcode::QRcode(0.01)ソース40行目'$oSelf->{Version} = $rhPrm->{Version} || 1'
の'|| 1'
をとらないと、上のサンプルソースは正しく動作しません。
■2004-07-28
* [Perl] オブジェクトの共有
久しぶりにithreadsメモを更新。Perlのblessは共有リファレンスに対して効きません。かといって、blessされたリファレンス(オブジェクト)をshareしても、確かに共有化はされますが、何か操作をしようとすると大概うまく動きません(例:'Invalid value for shared scalar')。これは結構不便です。そこでObject::Sharableをつくってみました。
# Perl5.8.1以上、Storable 2.11以上 use Object::Sharable; use CGI; my $cgi = new CGI; share_obj($cgi); # 共有化! $cgi->param('foo','hoge'); threads->new(\&test,$cgi)->join; print $cgi->param('foo'); # 出力は'ok' # share_objしないと値は'hoge'のまま sub test{ shift->param('foo','ok'); }
元のオブジェクトをStorableでシリアル化してクラス内に保存(残念ながらGLOB型はシリアライズできません!)。メソッドが呼び出されるとオブジェクトを戻してAUTOLOADでオリジナルのメソッドを呼び出します。このあと再度オブジェクトをシリアル化することでオブジェクトの状態を更新します。そのため直接$obj->{val} = 1とかやっても他のスレッドに伝わりません。オーバーロードしたオブジェクトに対応するようにObject::Sharable::Overloadも用意してあります。あと、DESTROYが複数回呼び出されないように小細工を。まあ、ほとんど役に立たない実験モジュールですのであしからず。
* [雑感] さくらインターネットの新サービス
このサイトは、さくらインターネットを利用しているのですが、最近新しいサービスが始まりまして、乗換えキャンペーンをやっています。で、無料のお試しをしてみたのですが、充実していました。現状のサーバではperl5.00503とruby1.81が使えたのですが、さらにPerl5.8.4、php、pythonが使えて、MySQLも利用できるようです(この辺はサービスプランによります)。
どうもこの新しいサービスは、日記やblogをターゲットにしているみたいで、最初から設定でtDiaryがインストールできるようになっていたり、PerlモジュールではGDやCrypt::DSA、Crypt::Rnadom(当然Math::Pariも!)、さらにXML::LibXMLなど、Movable Typeなどのblogツール用に適したものが結構インストールされています。pureperl版をつくった苦労は……
あと最近知ったのですが、今使っているサーバでもsshやcronが利用できたんですね(新しいサービスでは正式に対応しているみたい)。
■2004-07-31
* [Perl] スレッド間でのオブジェクトの共有
先日の「Perlのblessは共有リファレンスに対して効きません」は、語弊があるかもしれないので捕捉を。共有リファレンスをblessすることはできます。実際セマフォを実現するThread:Semaphorはblessされた共有リファレンスですし。これは、あるスレッドの共有リファレンスをblessしても他のスレッドにいる共有リファレンスまではblessされないという意味です。そしてそれとは別に、共有化されたオブジェクト内に入れられるデータのタイプには制限があるため、複雑なデータ構造を内部に持つオブジェクト(例えばCGIモジュールのインスタンスなど)をスレッド間で共有するのは困難(というか無理)なのです。
* [雑感] 愛国心と私。あるいはどうのようにして私が国道17号線を愛す(以下略)
最近「愛国心論争」なるものが話題になっていたそうで。リンク先を辿っていったら「松永的愛国心論まとめ編」という記事へ。う~ん、割と共感持てます。私自身は出身県・出身市に対する郷土愛が非常に強い人間なのですが(それ故に、郷土の醜いところや腹立たしいところも多々あるわわけで、そういうのは良くしていきたいとも思うのです)、これが「日本」になると広すぎてなかなか実感わかないんですね。
あと、日本人のノーベル賞受賞とか金メダルを自分のことのように「誇る」というのは、私も理解できません。誇るに値した活躍をした人を支えてきた家族や友人、助力者なら、支えてきたことを誇りにできると思いますが、自分の行為でもないことを我がことのように誇るのは、そうとう恥ずかしいような……。 もし、お前は(誇り云々ではなくて)素直に喜べないのか? と問われたら、うーん。「隣町のタバコ屋のご隠居が今年米寿を迎えたんですって」「ああ、それはめでたいですね」ぐらいの気持ちは抱くのですが、こういうのとは違うんですかね?
まあ、私は身の丈にあった愛国者ということで。「誇り」は自分のお仕事(労働じゃなくて)に対してのみ持てるようにしたいものです。最後にル・グィンの『闇の左手』で主人公が、もう一人の主人公、王によって追放されながらも国のために命をかけたエストラーベン卿に対し、敵対中の国を「憎んでいるのでしょう」と尋ねた際に応えた言葉が好きなので引用。
「(略)…オルゴレインを憎んでいるかって? いいや、なんで憎む必要がありますか? 国家を憎んだり愛したりすることができますか? チベがよく言っておった、わたしはそういう芸当はできない。わたしはその国の人間を知っている、その国の町や農場や丘や岩を知っている、山あいの畑の斜面に秋の夕日がどんなふうにおちているか知っている、しかしそうしたものに境をつけ、名前をつけ、名前をつけられないところは愛してはならないというのはいったいどういうことだろうか? 国を愛するとはいったいどういうことだろうか? 国でないものを憎むということだろうか? そうだとしたら、いいことではない。では単なる自己愛だろうか? それならいい、しかしそれを徳としてはならない、公言すべきではない……わたしは人生を愛する限りエストレ領の山々を愛するが、この愛には憎悪の境界はない。その先は憎悪ではなくて無知なのだと思う」(『闇の左手』,ハヤカワ文庫,226頁)
「悪い政府を憎まないのは愚か者です。そしてもしこの地上によい政府というものがあるなら、それに奉仕するのは大いなる愉びになるでしょう」(同227頁)
_ み [愛憎は知によってもたらされるとはどこぞの誰かの言だったか。 知らないものは愛することも出来ないし憎むこともできないは..]
_ み [プログレスバーの意義はその正確さではなく伸びることに意義があるとどこぞの誰かが言ったとか言わないとか。]
_ まかまか [そうだ、私も聞いたことがある! えーと、ほら、誰だっけ、あの髭の……そう、ドーベルマン男爵!]