■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にあるとそちらが取り出されてしまい、最初戸惑いました。 んー、ちょっと上の例は問題があるので修正しないと……

