Tag Archives: togodoc

PerlモジュールCrypt::SSLeayの更新とLWP::UserAgentの関係について

Crypt::SSLeay を cpan コマンドで更新すると、問題なく処理が終わるように見えるが、実はこれだけでは LWP::UserAgent で https 通信が適切に行われる状態になるとは限らない。
LWP::UserAgentのドキュメントに下記の通り書かれている。

The libwww-perl core no longer bundles protocol plugins for SSL. You will need to install LWP::Protocol::https separately to enable support for processing https-URLs

というわけでLWP::Protocol::httpsの対応もしなくてはならない。そして、それは、また、更にCrypt::SSLeayIO::Socket::SSLNet::SSLeayが必要になる。

以上の処理を適切に行わないままに例えばNet::OpenID::Consumerを利用すると、そのなかでhttps通信が必要な場合、適切に処理が進まず、ログインしようとすると以下のようなメッセージが表示されることになる。

naive_verify_failed_network: Could not contact provider to verify signature

OpenID Client on Perl

今回、TogoDoc で利用している OpenID のクライアントモジュールをNet::OpenID::Consumerから OpenID4Perl に変更。というよりは、追加という状況。Perlのコードそのものは何も変更せず。

さて、Consumer.pm は Crypt::DH を利用しており、DH.pm の冒頭には以下のコードがある。

use Math::BigInt lib => "GMP,Pari";

そして、TogoDoc では、Pari を利用しているため、Math::BigInt から Pari ライブラリを呼ぶ形になる。このため、Math::BigInt::Pari をインストールする。そうしないと、Crypt::DHを利用する際に、以下のような警告が出力される。

Math::BigInt: couldn't load specified math lib(s), fallback to Math::BigInt::FastCalc at .../local/lib/perl5/site_perl/5.10.1/Crypt/DH.pm line 6

また、Pari のスタックサイズの変更は最初にモジュールがロードされる前に宣言せねばならず、そしてmod_perl (2.0) 利用環境下でPariモジュールをロードするので、下記宣言を startup.pl に記述。

use Math::PariInit qw( stack=1e9 );

OpenID4Perl にすることで、一部のプロバイダのOpenIDでログイン出来なかった問題が解消された。

MySQL ストアドプロシージャ

mysql に保存されているデータベースに対して一気に特定の処理をする必要に迫られ、表記について学ぶ。
参考ページはhttp://dev.mysql.com/doc/refman/5.1/ja/stored-procedures.html
要はMySQLデータベースに保存可能な手続き、或いはプログラムということ。

もちろん、Perlなどから同じ処理は出来るが、頻繁に行うことでも無いし、何をしたのか良く分からなくなるプログラムが放置されるのも後で整理する時に困るので今回はこれを試してみた。

覚えておくと良い事項は、

  • デリミタを変更するコマンド DELIMITER を用いてプログラム内の1命令の終わりを示すセミコロンをMySQLコマンドの終わりとして解釈されないようにする。
  • プログラムの定義は “CREATE PROCEDURE プログラム() BEGIN” で開始、”END” で終了。
  • 変数宣言は “DECLARE”。
  • ある一定の条件を満たす行に対して、その内容を変更したい時、ストアドプロシージャではカーソル (CURSOR) という概念が使われる。
  • 条件を満たす行が複数あり、各行に同じ処理を施すならば、繰り返しを使うが、その終了条件は “SQLSTATE ‘0200’” 。
  • プログラムの保存先は、mysql.proc テーブル。

例えば、userinfo テーブルの RATE 列が 0 であるとき、それを 1 にしたい場合は以下のようなプログラムで実現可能。

DELIMITER $$
CREATE PROCEDURE myProc()
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE r INT;
  DECLARE cur CURSOR FOR SELECT id FROM userinfo WHERE RATE=0;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; 

  OPEN cur;
  REPEAT FETCH cur INTO r;
    UPDATE userinfo SET RATE=1 WHERE id=r;
  UNTIL done END REPEAT;
  CLOSE cur;
END$$

“SELECT * FROM mysql.proc\G” というコマンドを発行すると実際に宣言したプログラムが保存されていることを確認出来る。
また、実行する場合は、CALL myProc;というコマンドを発行する。

CiteULike まとめ

http://www.citeulike.org/faq/data.adpに記述されているURLを利用してデータを取得。

誰(匿名)がいつ、何を投稿したのかが分かるデータ(Who-posted-what)と、各書誌情報についての情報が格納されているデータ(Article linkout data)を取得可能。
毎日更新している模様。

2009-08-30について調査。
Who-posted-what: 6 668 545行
一つの書誌情報について利用者が複数のタグを付けた場合は別々の行になるのでそこを吸収すると、
2 106 362行
のべ210万程度の書誌情報が投稿されていることになる。
更に、書誌情報についての重複を吸収すると、
1 783 077行
ということで、180万程度の書誌情報が投稿されていることになる。

また、利用者数は52 431人。一人当たりの平均登録件数は40件。
標準偏差が323もあるので、バラつきの大きいことが分かる。(最大は32 313…。続いて、30 695, 27 836, 27 825, 9 675…などと続く)
トップ1%を過ぎた時点での登録件数は600件。中央値は2(件)。したがって、半分以上の利用者が1, 2件しか登録していない。

因みに、最もCiteULike利用者の間で人気が高い論文は「The Structure of Collaborative Tagging Systems / Scott Golder, Bernardo A. Huberman / 2005」で、238人が投稿している。
CiteULikeのシステムに関連する話題のようで。
この分布もパワーローに従っているのでしょう。
それに続いて140人が登校しているのが、PMIDの付けられている、「Defrosting the digital library: bibliographic tools for the next generation web.」。
これまた、CiteULikeに関連する話題。
3番目は、「Conference on Hypertext and Hypermedia」。
その他、PMIDが付けられているところでは、「Collective dynamics of ‘small-world’ networks.」
ここの利用者の興味を反映した形ですね。

登録されているPMID付きの書誌情報は290 660なので、全体の16パーセント、1/6弱程度と少ない。
生命科学系の利用者は少数派なのだろう。
なお、15 192人が少なくとも一つのPMID付きの書誌情報を登録しており、これは全利用者の約3割にあたる。

UTF8 / binary on mod_perl and MySQL max_allowed_packet

Perl (mod_perl) で日本語を利用するために binmode STDOUT, “:encoding(utf8)”; をしていたが、これがネックになって今度は バイナリデータを出力する際に変換が起きてしまっていた。
バイナリを出力する前に binmode STDOUT, “:raw”; を怠らずに。

また、MySQL のデータベースに、ある程度のサイズのデータを放り込もうとする際には max_allowed_packet のサイズに気をつける必要がある。初期値は1Mになっているので、my.cnf の中に書かれているその値を変更する。

変更後のMySQLサーバーの再起動を忘れずにする(mysqladminで reload ではなく、shutdownしてから再起動。)ことと、mod_perl による運用では、Perlスクリプト中で SET max_allowed_packet=8M などとしても反映されないことに注意。

アプリケーションタイプ

Content-Type:

に続いて記述される、まさに「コンテンツのタイプ」に関し、RFCでの記述を調べてみた。
何故か簡単に見つからなかったが、ようやく発見したのでメモしておくことに。
特に今回はTogoDocからリファレンスファイルをダウンロードして取得する際のタイプを調べることを目標としているので、typeはapplicationに限定し、そのsubtypeについて調査。
まずはWikiPediaのエントリをチェック。
すると、RFC2045に記述の規則が書かれていて、subtypeについては以下のような決まりになっていることが判明。

subtype := extension-token / iana-token
extension-token := ietf-token / x-token
ietf-token := <An extension token defined by a standards-track RFC and registered with IANA.>
x-token := <The two characters “X-” or “x-” followed, with no intervening white space, by any token>
iana-token := <A publicly-defined extension token. Tokens of this form must be registered with IANA as specified in RFC 2048.>

そしてIANAに登録されているsubtype一覧は以下の通り。
http://www.iana.org/assignments/media-types/application/
というわけで、リファレンス関係のファイルについては特に登録されているものはないので、x-tokenを用いることになった。

まとめサイトとしてはこちらも参考になる。

因みにRFC2048でIANAへの新規subtype登録方法が記述されている。

JS / TogoHotate

Mindate:
Maxdate:
Reldate:

IE と AJAX

IEはAJAXで動的にアクセスするURLにまでキャッシュ機能が有効になっているから実際のブラウザではもう一度表示するためにデータの取得が必要でも、既に同じURLにアクセスしていると何もアクションが起きない。
なので、Cache-Control: no-cache が必要。https://developer.mozilla.org/En/AJAX:Getting_Started を参照。
mod_perl では、$r->no_cache(1); でOK。

mod_perl

utf8 をまともに扱うためにはプラグマではうまくいかない。

binmode STDOUT ‘:utf8’

これは何でもそのまま送ることを指示するので、下記の方がより適している。(09/02/26 変更)

binmode STDOUT ‘:encoding(utf8)’

が必要。
プラグマでは、起動後何度かアクセスすると、wide characterのメッセージがerror_logに出力されてしまう。