2006年04月28日

元素一覧

元素一覧をCSV形式で作ってみたので、メモ。
1,H,水素
2,He,ヘリウム
3,Li,リチウム
4,Be,ベリリウム
5,B,ホウ素
6,C,炭素
7,N,窒素
8,O,酸素
9,F,フッ素
10,Ne,ネオン
11,Na,ナトリウム
12,Mg,マグネシウム
13,Al,アルミニウム
14,Si,ケイ素
15,P,リン
16,S,硫黄
17,Cl,塩素
18,Ar,アルゴン
19,K,カリウム
20,Ca,カルシウム
21,Sc,スカンジウム
22,Ti,チタン
23,V,バナジウム
24,Cr,クロム
25,Mn,マンガン
26,Fe,鉄
27,Co,コバルト
28,Ni,ニッケル
29,Cu,銅
30,Zn,亜鉛
31,Ga,ガリウム
32,Ge,ゲルマニウム
33,As,ヒ素
34,Se,セレン
35,Br,臭素
36,Kr,クリプトン
37,Rb,ルビジウム
38,Sr,ストロンチウム
39,Y,イットリウム
40,Zr,ジルコニウム
41,Nb,ニオブ
42,Mo,モリブデン
43,Tc,テクネチウム
44,Ru,ルテニウム
45,Rh,ロジウム
46,Pd,パラジウム
47,Ag,銀
48,Cd,カドミウム
49,In,インジウム
50,Sn,スズ
51,Sb,アンチモン
52,Te,テルル
53,I,ヨウ素
54,Xe,キセノン
55,Cs,セシウム
56,Ba,バリウム
57,La,ランタン
58,Ce,セリウム
59,Pr,プラセオジム
60,Nd,ネオジム
61,Pm,プロメチウム
62,Sm,サマリウム
63,Eu,ユウロピウム
64,Gd,ガドリニウム
65,Tb,テルビウム
66,Dy,ジスプロシウム
67,Ho,ホルミウム
68,Er,エルビウム
69,Tm,ツリウム
70,Yb,イッテルビウム
71,Lu,ルテチウム
72,Hf,ハフニウム
73,Ta,タンタル
74,W,タングステン
75,Re,レニウム
76,Os,オスミウム
77,Ir,イリジウム
78,Pt,白金
79,Au,金
80,Hg,水銀
81,Tl,タリウム
82,Pb,鉛
83,Bi,ビスマス
84,Po,ポロニウム
85,At,アスタチン
86,Rn,ラドン
87,Fr,フランシウム
88,Ra,ラジウム
89,Ac,アクチニウム
90,Th,トリウム
91,Pa,プロトアクチニウム
92,U,ウラン
93,Np,ネプツニウム
94,Pu,プルトニウム
95,Am,アメリシウム
96,Cm,キュリウム
97,Bk,バークリウム
98,Cf,カリホルニウム
99,Es,アインスタイニウム
100,Fm,フェルミウム
101,Md,メンデレビウム
102,No,ノーベリウム
103,Lr,ローレンシウム
104,Rf,ラザホージウム
105,Db,ドブニウム
106,Sg,シーボーギウム
107,Bh,ボーリウム
108,Hs,ハッシウム
109,Mt,マイトネリウム
110,Ds,ダームスタチウム
111,Rg,ウンウンウニウム
112,Uub,ウンウンビウム
113,Uut,ウンウントリウム
114,Uuq,ウンウンクアジウム
115,Uup,ウンウンペンチウム
116,Uuh,ウンウンヘキシウム
117,Uus,ウンウンセプチウム
118,Uuo,ウンウンオクチウム
WikiPediaの周期表を元に作ったけど、Googleで「元素一覧」で検索したらもっと楽に作れたなぁ(^^;。
posted by はしもと at 18:22| Comment(0) | TrackBack(0) | メモ

2006年04月27日

「PHP5徹底攻略エキスパート編」購入

仕事で打ち合わせに出かけたので、帰りにヨドバシカメラに寄り道しました。

前に悩んだ挙句買わなかったPHP5の本をもう一度検討して、結果「PHP5徹底攻略 エキスパート編」を買いました。青マンモスの方ですね。

ちょっと分厚くて重すぎるから、通勤電車で読むには向いてないなぁ…。

今のところPHP5を使う場面がないから、急がずちょっとずつ勉強していきます。
posted by はしもと at 22:17| Comment(0) | TrackBack(0) | PHP

2006年04月24日

CGI.pm 3.20がリリースされました

4月23日付けで、CGI.pm 3.20がリリースされていました。

Changesを見ると、変更点は3つ。

1つめ。CGI::Cookie->bake()メソッドへのpatch。これはdiffを見てみます。
@@ -182,7 +182,7 @@
           : Apache->request
   } if $MOD_PERL;
   if ($r) {
-      $r->headers_out->set('Set-Cookie' => $self->as_string);
+      $r->headers_out->add('Set-Cookie' => $self->as_string);
   } else {
       print CGI::header(-cookie => $self);
   }
set()メソッドからadd()メソッドに変更されています。set()メソッドを使うと、先に設定されていた他のパラメーターを消してSet-Cookieだけに置き換えてしまうから問題になることがあったのでしょう。Changesの記述から、特にmod_perl環境のための対処のようです。

…ゴメンなさい、自分ではCGI::Cookie->bake()は直接使ったことがないので想像でしかありません。

2つめ。Changesではstart_form()の問題のような記述ですが、実際に修正されているのはstart_multipart_form()でした。これもdiffを見てみます。
@@ -1825,9 +1826,7 @@
 sub start_multipart_form {
     my($self,@p) = self_or_default(@_);
     if (defined($p[0]) && substr($p[0],0,1) eq '-') {
-       my(%p) = @p;
-       $p{'-enctype'}=&MULTIPART;
-       return $self->startform(%p);
+      return $self->startform(-enctype=>&MULTIPART,@p);
     } else {
        my($method,$action,@other) = 
            rearrange([METHOD,ACTION],@p);
修正前は-enctypeを指定していても&MULTIPART、つまりmultipart/form-dataで強制的に書き換えられていました。これが、-enctypeを指定していた場合は、その指定した値が使われるようになっています。

3つめ。3.19で変更されたPATH_INFO周りのコードの修正のようだけど…。とりあえずこれもdiffを見てみます。
@@ -2778,7 +2777,8 @@
    my $raw_path_info   = $ENV{PATH_INFO}   || '';
    my $uri             = unescape($self->request_uri) || '';
 
-   $raw_script_name =~ s/\Q$raw_path_info$\E//;
+   my $protected    = quotemeta($raw_path_info);
+   $raw_script_name =~ s/$protected$//;
 
    my @uri_double_slashes  = $uri =~ m^(/{2,}?)^g;
    my @path_double_slashes = "$raw_script_name $raw_path_info" =~ m^(/{2,}?)^g;
正規表現の中で\Q\Eを使ってメタ文字を処理していたのを、quotemetaで先に処理しています。

でも…これって関係無いような?

元のコードで問題なのは、\Eの前に末尾を表すはずの$が入ってしまっていたことだと思うのだけど…。
  $raw_script_name =~ s/\Q$raw_path_info\E$//;
これなら問題ないと思うのだけど、他に問題あるのでしょうか?
posted by はしもと at 13:20| Comment(0) | TrackBack(0) | Perl

2006年04月21日

DBIでデータベースの内容をハッシュ配列で取得する

今時のPerl使いの方は、データベースアクセスにはClass::DBIを使っているのでしょうか?

ボクは仕事柄Class::DBIを使えないサーバーで動かすCGIを作ることが多いので、今でもDBIを使っています。Class::DBIも勉強しなきゃなぁ…。

それはともかく、SELECT文の結果をハッシュ配列で取得する方法を書いてみます。

バージョン1.20より古いDBIでは、$dbhをデータベースハンドルオブジェクトとした場合
my $sql = 'SELECT id, name FROM test WHERE age < ?';
my $rows = $dbh->selectall_hashref( $sql, undef, 20 );
のようなプログラムで
$rows = [
{ id => 1, name => 'aaaa' },
{ id => 2, name => 'bbbb' },
];
のような値が取得できました。

バージョン1.20でこの仕様が変更になっています。

同じような値を取得するには、selectall_hashref()メソッドではなく、selectall_arrayref()メソッドを使います。
my $sql = 'SELECT id, name FROM test WHERE age < ?';
my $rows = $dbh->selectall_arrayref( $sql, { Columns => {} }, 20 );
第二引数として、{ Columns => {} } を渡すのがポイントです。

これは、ステートメントハンドルメソッドのfetchall_arrayref()を使う場合に空のハッシュを渡すことに相当します。
my $rows = $sth->fetchall_arrayref( {} );
DBIには、引数として\%attrを渡すメソッドが多いけど、具体的にどのような値を渡せばいいかイマイチわかりにくいんですよね。←ボクだけ?

Googleで日本語サイトを対象に検索してみてもこのselectall_arrayref()に{ Columns => {} }を渡すやり方を書いているのは、ボクがKansai.pmのイベントで発表した資料だけでした。当たり前すぎるのか、案外知られていないのか、需要が無いのか、さて、どれでしょう(^^;?

なお、バージョン1.20は2001年8月24日リリースです。さすがに今時のサーバーではそれ以前の古いバージョンをインストールしていることは無いと思うので、古い方法を覚えておく必要はないでしょう。

そのうち、Wikiの方にもうちょっとまとめて書きます。いつになるかは…ゴニョゴニョ。
posted by はしもと at 12:20| Comment(0) | TrackBack(0) | Perl

2006年04月18日

CGI.pm 3.19がリリースされました

4月17日付けで、CGI.pm 3.19がリリースされました。

Changesを見てみたところ、変更点は4つ。

1つめ。use_tempfileという内部フラグが追加されて(デフォルトは真)、これが真の場合にアップロードされたファイルデータを一時ファイルに出力するようになった、ということかな。

このフラグは、upload_hookと一緒に使うもののようです。upload_hookとは、アップロードされたファイルデータを一時ファイルに出力する前に呼び出されるcallback関数です。このcallbackを使って他の所にアップロードデータを保存する代わりに一時ファイルへ出力したくない、という時にこのuse_tempfileを偽に設定するのでしょう。

有効なcallbackをupload_hookとして登録せずにuse_tempfileを偽に指定してしまうと、アップロードされたファイルデータが消えてしまいます。ご注意を。

…なんて偉そうに書いていますが、これを書くために調べて初めてupload_hookの存在を知ったのでした(^^;。間違えているかも知れないので、よく調べてから使いましょう。

2つめ。urlメソッド内部でURLを組み立てる際に、PATH_INFOをURLから削除する処理で正規表現を使って削除しているのですが、PATH_INFOに正規表現のメタ文字が含まれていた場合に正しく動作しなかった点の修正でした。

3つめ。その他にも、urlメソッドに修正が加えられています。

4つめ。同じくurlメソッドで、サーバーにIISを使用している場合に行っていたPATH_INFOの処理を削除した、のかな?多分、3つめの変更点で加えられた修正の結果、この処理が不要になって削除されたのでしょう。

他にも、リリースされなかった3.18でcharsetについての修正や、paramメドッソについての修正がされていました。

charsetといえば、escapeHTMLを使う場合、
my $query = CGI->new;
$query->charset( 'UTF-8' );
のように、charsetを指定しておかないと変な置換がされてしまうことがあります。

明示的にcharsetメソッドで指定しなくても、
print $query->header( -charset => 'UTF-8' );
のようにcharsetを指定していればheaderメソッド内部で
$self->charset( $charset );
として設定されますが、headerをcallする前にescapeHTMLメソッドを使うと意味がありません。

なるべく早い段階で、charsetメソッドを使って明示的に指定する方がいいようです。
posted by はしもと at 03:22| Comment(0) | TrackBack(0) | Perl

2006年04月16日

Jcode 2.04がリリースされました

Perl5.6でUTF-8のメールを送信するためにいろいろ調べていたら、Jcodeのマニュアルに書いてあった
$j->MIME_Header;
というメソッドが動作していないことを見つけました。

念のためにいろいろ確認したけどどこにも問題を書いているサイトはありませんでした。Patchを作ってみようとしたけど、仕事の時間がヤバかったので仕方なく問題点だけをJcodeのMLに報告しました。

早速Danさん自ら修正し、Jcode 2.04としてリリースしてくださいました。ありがとうございました。

MIME_HeaderメソッドはPerl5.8.1以降しか使えないから、Perl5.6では使えないんですけどね(^^;。仕事では別の方法でとりあえず逃げておきました。
posted by はしもと at 13:51| Comment(0) | TrackBack(0) | Perl

2006年04月14日

止まっていたCPANのデータ更新が復活

今日の夕方ぐらいに、10日以来更新されていなかったCPANのデータがまとめて更新されました。

CGI::Session 4.13はBug fixの結果、BSD系OSへのインストールができるようになっていました。

CGI::Applicationは4.06がリリースされていましたが、テストが変更になっただけでモジュール自体は4.04から変わっていません。

CPANは、この前もデータ更新が止まっていたし、やっぱり調子悪いのかな?
posted by はしもと at 21:15| Comment(0) | TrackBack(0) | Perl

2006年04月13日

CGI::Session 4.13がリリースされました

MLからの情報です。

これを書いている時点では、まだCPANの情報は更新されていませんでした。というか、またCPANの更新が遅れてるような?

今回はBug fixが3つ。

一つはcookieのバグ。Patch提供者は日本の方でした。

他二つはどちらもDB_Fileかな。BSD系OSでmake testで出ていたエラーが修正されていればいいのだけど。
posted by はしもと at 02:31| Comment(0) | TrackBack(0) | Perl

2006年04月12日

「実用Perlプログラミング」購入

昨日は、PHP5の本を見に行くために、いつもより少し早めに会社を出て梅田のヨドバシカメラに行きました。

でも、PHPの本ってどれを選べばいいのかわかりにくい…。できれば最新バージョンの5.1.2に対応したものがいいけど、まだあまり無いみたいだし。定番のマンモス本は発売から1年以上経ってるから、今から買うのもちょっと抵抗が。

PHPの本って、一昔前のCGI本みたいなのが多い気がして、それも買いたくない理由の一つだったり。

オライリーからもPHP本が出てたっけ、と思ってオライリーコーナーに行って「初めてのPHP5」を眺めていたら、「実用Perlプログラミング」が目に付いて、こちらを買ってしまいました(^^;。

まだ全然目を通してもいません。一体いつ読むことやら。
posted by はしもと at 10:24| Comment(0) | TrackBack(0) | Perl

2006年04月09日

CGI::Session 4.12リリース

4月7日付で、CGI::Sessionの4.12がリリースされていました。

SECURITY: Fix possible SQL injection attack.

ということで、PostgreSQL、MySQL、SQLiteのような内部でSQLを使っている場合にはアップデートが必須なようです。

どうなっていたかを調べてみると、こんな風になっていました。

4.12以前はremove()メソッドで
my $sql = sprintf("DELETE FROM %s WHERE id='%s'", $self->table_name, $sid);
となっていて、$sid、つまりセッションIDにいたずらされていると危険でした。

4.12では、place holderを使うように修正されています。

ところで、4.10以降のバージョンではBSD系のOSにインストールしようとしたときに、make testでエラーになるようです。MacOS Xもダメでした。

なんでかな?本家MLでもすでに報告されているので、近いうちに修正されるとは思うけど…。
posted by はしもと at 13:54| Comment(0) | TrackBack(0) | Perl

2006年04月06日

成分解析 on WEB

成分解析 on WEBで、いろいろやってみました。
perlの83%は宇宙の意思で出来ています
perlの9%は睡眠薬で出来ています
perlの7%は気の迷いで出来ています
perlの1%はマイナスイオンで出来ています
Rubyの99%はむなしさで出来ています
Rubyの1%はお菓子で出来ています
phpの72%は勢いで出来ています
phpの17%は波動で出来ています
phpの6%は言葉で出来ています
phpの3%は理論で出来ています
phpの2%は成功の鍵で出来ています
Pythonの75%はツンデレで出来ています
Pythonの13%はお菓子で出来ています
Pythonの5%は心の壁で出来ています
Pythonの4%は成功の鍵で出来ています
Pythonの3%は言葉で出来ています
Javaの52%は犠牲で出来ています
Javaの30%は知恵で出来ています
Javaの8%はマイナスイオンで出来ています
Javaの7%は濃硫酸で出来ています
Javaの3%は心の壁で出来ています
JavaScriptの68%は覚悟で出来ています
JavaScriptの20%は回路で出来ています
JavaScriptの6%は気の迷いで出来ています
JavaScriptの5%はお菓子で出来ています
JavaScriptの1%は理論で出来ています
Kansai Perl Mongersの57%は愛で出来ています
Kansai Perl Mongersの29%はカテキンで出来ています
Kansai Perl Mongersの9%はミスリルで出来ています
Kansai Perl Mongersの4%は成功の鍵で出来ています
Kansai Perl Mongersの1%は理論で出来ています
posted by はしもと at 19:32| Comment(0) | TrackBack(1) | 日記

2006年04月05日

CGI::Session 4.11リリース

昨日はCPANが調子悪かったのか、search.cpan.orgのrecentを見ていてもずっと更新されていませんでした。

夜になってようやく更新されて、4月3日付けでCGI::Session 4.11がリリースされました。4.10でのnameメソッドバグが修正されています。

でも、結局今回のnameメソッドの仕様変更の意味が見えてこない…。

今回のnameメソッドの仕様変更は前にも書いたように、パッケージ変数 $CGI::Session::NAME だけでなくインスタンスとして内部で $self->{_NAME} にセッション名を設定できる、というものです。

しかし、CGI::Sessionオブジェクトを生成する前にセッション名を決めておかないと、new()を実行したときに内部でload()でセッションデータの読み込みをしてしまうので、後で名前を変更しても意味がないと思うのです。せめて、new()の引数としてセッション名を渡せるようにならないと…。

他のシステムと連携していて、常に新規セッションを作るだけでいい場合にはセッションデータの読み込みは不要になるから、この場合の為の仕様変更ということかな?

ドキュメントとソースコードを読んで、もっと調べてみなければ。perldoc.jpにある3.11のドキュメントを中心に見てたから、後で追加されているload()やfind()の使い方もわかってないし。

ついでに、古いセッションをお掃除するCGI::Session::ExpireSessionsのバージョンも上がっていました。このモジュール、もうちょっと使い勝手がよければなぁ…。serializerはData::Dumperにしか対応していないし、driverはdb系とfileだけだし…。
posted by はしもと at 12:55| Comment(0) | TrackBack(0) | Perl

2006年04月04日

ぱるま(Perlish Magazine)

今更ながらのエイプリルフールネタだけど、これを書かないわけにはいかないでしょう(^_^;。

ぱるま(Perlish Magazine)

なんとも気合の入ったネタコンテンツです。

企画自体はネタなのに、内容はとても濃いです。

この企画のためだけに、わざわざPerl製WikiクローンのFreeStyleWikiまでインストールしています。

…ごめんなさい、これを書いている時点で、まだ一割ぐらいしか読んでません。

そろそろEncodeモジュールの使い方を覚えないといけないので、Ktatさんの「 標準添付ライブラリ紹介 〜Encode〜」の記事からじっくり読んで行きます(^_^;。
posted by はしもと at 03:10| Comment(0) | TrackBack(0) | Perl