■2005-02-07
* [CGI] TypeKeyでFreeStyleWiki
去年の夏にAuthen::TypeKeyをFreeStyleWikiに組み込むという話を書きましたが、実際に試してみました。TypeKeyに登録している方はぜひここの右上のメニューにあるTypeKeyをクリックしてログインしてみてください。あと、PuerPerlのMath::Pariを使っても、本当のMath::Pariよりもだいぶ遅いとはいえ、実用に耐えそうです(上のテストはXS版Math::Pariです)。
先日のbacklinksプラグインは既に同じ機能のものが登録されていて大失敗でした。
* [メモ] Perlその他
・threadsとencodingの件→mainパッケージでbinmode(STD [OUT|IN], ":raw :encoding(xxx)")するとthreadas->newで落ちる。子スレッド内でThread::Use経由でencodingするだけなら大丈夫。でも今度はencodeがうまくいかない……
・今月のAcmeはネタ切れか? My Favorite Perl Modulesみたいなサイトがあるなら、もうここで紹介してるのがバカバカしいかも。
・自分のした事実を認めること コメント欄の「一市民」は"リベラル"と"左翼"をどのように理解しているのだろうか(この場合イコールと想定されているようだから、結局「左翼」とは何かにいくのかなあ)
* [Perl][メモ] CDBIサブクラスで複数データベースを扱う
同じテーブル構造が複数のデータベースにあって、一つのClass::DBIサブクラスで両方を扱いたい用があったので、Using Multiple Databasesを参考にしたのですが、うまくいきません(単純なretrieveははうまくいくのですが、might_haveを通じての取り出し等がうまくきません)。で、以下の方法でなんとかなったのでメモ。
package MultiDB; use base qw(Class::DBI); __PACKAGE__->mk_classdata('current_dbh'); sub change_db { my ($class,$dbname,$user,$pass,$attr) = @_; if($dbname{$dbname}){ $class->current_dbh($dbname); } else{ # $dbnameをキーにするのは良くないね…… $dbname{$dbname} = 1; $class->current_dbh($dbname); Ima::DBI->set_db( $dbname,"dbi:xx=$dbname;xx",$user,$pass,$attr ); } return $dbname; } sub db_Main { my $class = shift; my $method = "db_" . $class->current_dbh(); $class->$method; } ...なんかいろいろ # mainスクリプト MultiDB->change_db('table_a'); { my @data = MultiDB->retreive_all; # .. code .. } MultiDB->change_db('table_b'); { my @data = MultiDB->retreive_all; # .. code .. }
メインコードでテーブルを変える毎にブロックで囲っているのは、同一スコープ内ではメモリ内にあるオブジェクトの一意性が保持される(弱いリファレンスを使う)というClass::DBIの仕様があるため。スコープが変われば破棄されます。table_bから取り出したidと同じものがtable_aにあるとそちらが取り出されてしまい、最初戸惑いました。 んー、ちょっと上の例は問題があるので修正しないと……