Introduction

ブログ内検索

  • このサイトの記事を検索 by Google

おすすめの一冊!

無料ブログはココログ

« 2010年9月 | トップページ | 2010年11月 »

2010年10月

2010-10-21

セッション鍵の生成

「りすたらいざー」という Twitter リスト管理サービスを考えてます。

その中で、安全な HTTP セッション鍵をどうやって生成するのか
ちょっと気になったので、調べてみました。




まず、安全な乱数が必要なはず。

UNIX 系ならたしか /dev/random とかあった気がするなぁ、と思ったら、
/dev/random は安全だけどブロックされる可能性があって、
それとは別にブロックされない /dev/urandom というのもあって、
普通は /dev/urandom を使えばいいらしい。

    ⇒ Wikipedia の解説Linux の man page

で、Perl の中で明示的に /dev/urandom を読めばいいのかな、と思ったら、
標準の srand() はデフォルトで /dev/urandom を読んでくれるらしい。
しかも最初に rand() を呼んだときに自動で srand() を呼んでくれるらしい。

    ⇒ 乱数と Perl5 にかんする蘊蓄の話
       --  TokuLog 改メ tokuhirom’s blog

ちなみに fork() すると乱数系列が一致してしまうので、子プロセスで
明示的に srand() を呼んであげる必要がある。

    ⇒ fork した後に srand を自動的によぶには
       --  TokuLog 改メ tokuhirom’s blog

さすが Perl は便利ですね。

線形合同法がイヤなら Math::Random::MT (メルセンヌ・ツイスター)を使えば OK。




と、ここまで調べたのですが、Perl なら CGI::Session を使えば
すべて良きに計らってくれるみたいです。車輪の再発明。

    ⇒ CGI::Session のマニュアルCGI::Session のチュートリアルCGI::Session の CookBook

2010-10-13

XHTML を取り込みたい


とある wiki の表のデータを取り込む Perl スクリプトを書いたので、メモ。


解析対象の wiki は XHTML で書かれているのですが、

    1. 文字コードが EUC-JP
    2. XHTML(というか XML)の文法に違反している記述がある

というハードルがありました。




前者についてはちゃんとソース中で文字コードが指定されているので
本来なら問題ないハズですが、XML 解析ライブラリが意味不明のエラーを
吐くので対応してみました。

コードは以下の通り↓

my $html = sub { use Encoding 'euc-jp'; use LWP::Simple; my $src = get($url); my $str = Encode::encode('utf-8', $src); $str =~ s/euc-jp/utf-8/ig; return $str; }->();
文字コード指定の書き換えがちょっと hacky ですが、とりあえず動きます。 この文字列 ($html) の一部を print するとちゃんと UTF-8 になってます。 2個目のハードルについては、XML::Liberal を使わせていただきました。 このライブラリは XML::LibXML のパーサの代わりに使えるもので、 well-formed XML じゃない不正な XML でも食べてくれるパーサです。 基本的にはよろしくやってくれるのですが、一部のリンクに含まれていた 「&」文字を実体参照としてパースしようとしてエラーになってしまったので、 正規表現で対応しました(ちょっと無理矢理)。
$html =~ s/&adptg_mid=/&adptg_mid=/g; $html =~ s/&adptg_lid=/&adptg_lid=/g; my $dom = sub { use XML::Liberal; my $parser = XML::Liberal->new('LibXML'); return $parser->load_xml({string => $html}); }->();
あと、XHTML の解析には XPath を使ってみました。
my @tdList = sub { my $xpc = XML::LibXML::XPathContext->new($dom); $xpc->registerNs('x', 'http://www.w3.org/1999/xhtml'); return $xpc->findnodes("//x:div[\@id='hoge']/x:table[position()=1]/x:tbody/x:tr/x:td"); }->();
とっても便利♪ ちなみに、XPath で取得したリストの要素は DOM Element なので、いろいろできます。
my %table; foreach my $tdElem (@tdList) { my $url = $tdElem->firstChild()->getAttribute('href'); my $name = $tdElem->firstChild()->textContent(); $table{$name} = $url; }
まぁ、JavaScript で DOM 操作に慣れていれば直感で書けます。カンタン! この Perl スクリプトを使ったサービスは現在構想中。 いま流行の「クラウド」をユーザスクリプト (GreaseMonkey) と組み合わせた なかなか面白いサービスになる予定です(妄想

« 2010年9月 | トップページ | 2010年11月 »