[ArrangeNote] ArrangeNote バージョン2を覗く

今週は月火は出張。羽田の丸善で養老先生の「日本人の身体観」を購入して帰ってきた。英国のテロもあったし、飛行機に乗るのはあまりよい気分じゃない。水木は出張して失われた時間を回復するのに必死、なんとかやるべきことにけりをつけた。昨晩は11時に帰宅だ。日記を書く習慣が一度途切れるとしばらく書かなくても平気になる。代わりに山本幸一さんのBBSに続けて書き込み。ArrangeNoteのバージョン2を覗かせてもらった(Discussion)。ArrangeNoteをCGIで読んだり書いたりっていうのもデスクトップCGIとしておもしろいなと思った。何か作るか(^^)

[ArrangeNote] ArrangeNote特別版 1.1.17.4 - 特定のメモを表示させる起動オプション

山本幸一さんにArrangeNoteで特定のメモを表示できるように起動オプションを付けてもらった("1049 ArrangeNote 1.1.17.4")。この機能を使ってCGIで実験した経過を紹介しておこう。完成したわけでもないし、今後うまくいく保証もないが、CGIからArrangeNoteのメモを調べて、特定のメモをCGIで起動する仕組みを作ろうとしている。

an2html.cgi

use OLE;
require 'cgi-lib.pl';
&ReadParse(*in);
$app = OLE->CreateObject( 'arg.NoteService' );  # ArrangeNoteノートサービスの起動
$dir = "C:\\Program Files\\ArrangeNote\\"; # ArrangeNoteファイルのあるディレクトリ
if($in{'AN'}){
	$an = $in{'AN'};
}elsif($ARGV[0]){
	$an = $ARGV[0];
}
print "Content-type: text/html\n\n";
print "<html><body>\n";
&an2html( $an );
print "</body></html>\n";
exit;
sub an2html{
    my( $an ) = @_;
    $filename = $dir . $an . ".arg";
    print "<H3>$filename:</H3><br>\n";
    my $note = $app->Open( $filename );
    my $root = $note->GetRootItem();
    print "<ul>\n";
    &note2html( $filename, $note, $root );
    print "</ul>\n";
	
}
sub note2html{
    my( $filename, $note, $group ) = @_;
    for( my $i = 0; $i < $group->GetChildItemCount(); $i++ ) {
        my $item = $group->GetChildItem( $i );
        if ( $item->{Body} ) {
            $url = (split("\n", $item->{Body}))[0];
            print "<li><a href=\"$url\">$item->{Title}</a> <a href=\"http://localhost/cgi-bin/an_getitemid.cgi?id=",$item->{Id},"\&note=",&juri_encode($filename),"\"> ID: $item->{Id}</a>\n";
        }
        if ( $item->{Type} == $note->{MEMOGROUP} ) {
            &note2html( $filename, $note, $item );
        }
    }
}
# Jperl 用 URL エンコーディング
sub juri_encode{
	my($str) = @_;
	$str =~ s/([^a-z0-9\-_.!*'\(\)~ ])/length($1) == 2 ? sprintf "%%%1s%1s%%%1s%1s", split("",unpack("H4", $1)) : sprintf "%%%02X", ord($1)/egi;
	$str =~ tr/ /+/;
	return $str;
}

an_getitemid.cgi

require 'cgi-lib.pl';
&ReadParse(*in);
$argdir = "C:\\Program Files\\ArrangeNote";
if($in{'note'}){
	$note = $in{'note'};
}else{
	$note = "$argdir\\memo.arg";
}
if($in{'id'}){
	$id = $in{'id'};
}else{
	$id = 2;
}
print "Content-type: text/html\n\n";
print "<html><body><p>ArrangeNote: $note ID: $id のページを表示します。</p></body></html>\n";
$cmd = "ArgNote.exe /x$id \"$note\"";
system($cmd);

an2html.cgiは、ANという変数名でノート名を与えるとArrangeNoteのノートを調べて、メモのタイトルにタイトルに関連するURLをリンクし、メモのIDからArrangeNoteを起動するan_getitemid.cgiへリンクする。実はan2html.cgiはコマンドラインでは動作するが、CGIでは次のようにエラーになる。

<html><body>
<H3>C:\Program Files\ArrangeNote\memo.arg:</H3><br>
Can't call method "Open" on an undefined value at C:\anhttpd\cgi-bin\awakening\a
n2html.cgi line 21.

an2html.cgiをコマンドラインで動作させて得られるHTMLをファイルに保存してブラウザで読むと、an_getitemid.cgiへのリンクは動作する。system関数のコマンドライン解析は実行ファイルのパスが空白を含むと、ダブルクォートで括っていても正常に動作しない。結局、ArgNote.exeにパスを通した。このCGIはArrangeNoteが所定のメモを表示している間は完了せず、ArrangeNoteを終了すると、所定のHTMLをブラウザに表示する。

"1052 Re:ArrangeNote 1.1.17.4"のように、system関数で起動する際にstartで起動すると、systemのプロセスが完了して、CGIの表示も行われる。

[ArrangeNote] ArrangeNoteのページにCGIからアクセスしようプロジェクト

ArrangeNoteのページにCGIからアクセスしようプロジェクトも佳境に入ってきて、山本幸一さんがApacheを使って、use OLE;の代わりに、use ole;use Win32;use Win32::OLE::Const;とすれば、うまくArrangeNoteにアクセスできることを示された(1062 Re:ArrangeNote 1.1.17.4)。

これを元にした[ArrangeNote] ArrangeNote特別版 1.1.17.4 - 特定のメモを表示させる起動オプションネタの続き。元々、「実践実用Perl」はApacheも使っていたので、anhttpdとApacheを同じデータで共用するノウハウは確立済み。Apacheを使うと、確かに、CGIからArrangeNoteにOLEオートメーションを使ってアクセスできるようなった。が、anhttpdではうまくいくsystem関数によるArrangeNoteの所定のメモの表示には失敗。とかくこの世は・・・

[ArrangeNote] 「実践実用Perl」講座(ⅩⅤⅠ) - ArrangeNote編

山本幸一さんに相談すれば、物事は必ず発展的に解決する。次の記事の続編。httpサーバーをデスクトップサーバーとして使いこなす方法。

Apacheを「only for the Current User,on Port 8080, when started Manually」でインストールすると、OLEもsystem関数もPerlから使える(1067 Re:ArrangeNote 1.1.17.4)という指導を受けて、Apacheをアンインストールし、サービスではなくて、デスクトップアプリケーションとして再インストールする。OLEもsystem関数も見事に動いた。ポート番号を8080とするので、Anhttpdとも併用できる。Apacheにアクセスする場合は、http://localhost:8080/・・・としてアクセスする。an2html.cgiから、an_getitemid.cgiを起動する部分はそのように書き直す必要がある。

ApacheをWindows起動時に動かすためには、スタート→すべてのプログラム→Apache HTTP Server 2.0.54→Control Apache Server→Start Apache in Consoleにカレットを合わせて右クリック、コピーして、C:\Documents and Settings\ユーザー名\スタート メニュー\プログラム\スタートアップにStart Apache in Consoleのショートカットを貼り付ける。

デスクトップCGIはデスクトップ上の資源・情報を活かしてこそ意味がある。デスクトップCGIからOLEオートメーションが使えると活躍できる世界がさらに拡がる。

[ArrangeNote] 「実践実用Perl」講座 (ⅩⅤⅡ) - ArrangeNote編(Ⅱ)

ArrangeNoteを使って具体的なCGIアプリケーションにまとめてみた。題してArrangeNote検索。検索結果から、ArrangeNoteのページを表示して、編集等ができる。ArrangeNoteは、オプションで指定IDページを表示起動できる特別版の1.1.17.4を使用しなくてはならない。また、OLEオートメーションと連携するために、ApacheでCGIを動作させる必要がある。Apacheはサービスとして起動せずにデスクトップアプリケーションとして動作させ、ポート番号8080でアクセスする。このデスクトップCGIを実現できたのは、多忙な中、ArrangeNote特別版を提供していただき、OLEオートメーションの使い方、Apacheの使い方について丁寧にお教えいただいた山本幸一さんのいつもながらの親身な助力なくしては考えられない。毎度のことながら感謝する。

ArrangeNoteの置いてあるフォルダを調べて、arg拡張子のファイルを配列に読み込み、一つずつ、メモ毎にタイトルとボディを検索文字列にマッチするかどうか調べて、マッチすれば、関連URL文字列にリンクを張り(僕はArrangeNoteをブックマークのようにURLの管理に使っていたので、メモのボディの先頭行にはURLが置かれている)、メモのID番号にはArrangeNoteの該当ページを開くan_getitemid.cgiへのリンクを張る。表示した検索結果のIDのリンクをクリックするとArrangeNoteが起動される。「メモる」システムのsubmainフレームの上に重なるようにArrangeNoteを配置しておくと、あたかもシステムの一部のように動作させることができる。

これで、「メモる」システムとArrangeNoteとの連動が可能になる。棲み分けについてはおいおい考えるとして(^^;)・・・デスクトップCGIから見れば、OLEオートメーションがデスクトップの資源の一つとして考えられるようになった。

[Revised: 2005-07-31]

jpg/an_system_ss.jpgArrangeNote on Desktop CGI

ansearch.cgi

#!/Perl/bin/MSWin32-x86-object/jperl.exe
use ole;
use Win32;
use Win32::OLE::Const;
require 'cgi-lib.pl';
&ReadParse(*in);
$app = OLE->CreateObject( 'arg.NoteService' );  # ArrangeNoteノートサービスの起動
$dir = "C:\\Program Files\\ArrangeNote"; # ArrangeNoteファイルのあるディレクトリ
if($in{'search'}){
	$search = $in{'search'};
}elsif($ARGV[0]){
	$search = $ARGV[0];
}
print "Content-type: text/html\n\n";
print "<html><body>\n";
print "<ul>\n";
&ansearch2html( $search );
print "</ul>\n";
print "</body></html>\n";
exit;
sub ansearch2html{
    my( $search ) = @_;
    opendir(ARGDIR, $dir);
    @argfiles = grep(/\.arg/, readdir(ARGDIR));
    closedir(ARGDIR);
    foreach $an (@argfiles){
        my $filename = $dir . "\\" . $an;
        my $note = $app->Open( $filename );
        my $root = $note->GetRootItem();
        print "<li>$filename\n";
        print "<ul>\n";
        &note2html( $filename, $note, $root, $search );
        if($count == 0){
            print "<li>マッチしたメモがありません。\n";
        }
        $count = 0;
        print "</ul>\n";
    }
}
sub note2html{
    my( $filename, $note, $group, $search ) = @_;
    for( my $i = 0; $i < $group->GetChildItemCount(); $i++ ) {
        my $item = $group->GetChildItem( $i );
        if ( $item->{Body} ) {
            if($item->{Title} =~ /$search/ || $item->{Body} =~ /$search/){
                $count++;
                $url = (split("\n", $item->{Body}))[0];
                print "<li><a href=\"$url\">$item->{Title}</a> <a href=\"http://localhost:8080/cgi-bin/an_getitemid.cgi?id=",$item->{Id},"\&note=",&juri_encode($filename),"\" target=\"status\"> ID: $item->{Id}</a>\n";
            }
        }
        if ( $item->{Type} == $note->{MEMOGROUP} ) {
            &note2html( $filename, $note, $item, $search );
        }
    }
}
# Jperl 用 URL エンコーディング
sub juri_encode{
	my($str) = @_;
	$str =~ s/([^a-z0-9\-_.!*'\(\)~ ])/length($1) == 2 ? sprintf "%%%1s%1s%%%1s%1s", split("",unpack("H4", $1)) : sprintf "%%%02X", ord($1)/egi;
	$str =~ tr/ /+/;
	return $str;
}

ApacheでCGIを起動させるためにはスクリプトの最初に、#!の行が必要である。Windowsでは、デフォルトのCドライブにPerlをインストールしている場合には、#!/Perl/bin/MSWin32-x86-object/jperl.exeのように書いておけば問題ない。ドライブ名を書くなら、#!C:/Perl/bin/MSWin32-x86-object/jperl.exeと書けばよい。

[Apple] Macをちょっと偵察

そろそろMacを本気になって調べようと、曇天の中、傘を持って、コジマ電気に出掛けた。値下げされたeMacの旧機種が1機残っているだけで、Tiger搭載機種への切り替えのためだろう、製品の入れ替え中と表示されていた。古いMacに触って、iTunesやSafariなどのアプリケーションを立ち上げてみる。ワンボタンマウスなので少し戸惑うが、シンプルで使いやすい感じだ。

問題はやはりアプリケーションである。Webブラウザは、IEやFirefoxもあるようだし、Safariは相当高速らしい。これは問題ない。メールは残念ながら、Becky!はない。Spotlightと併用するなら純正のMailを使うしかないのだろう。エディタはどうなんだろう。TextEditという付属アプリケーションがあるようだが、どの程度のものなんだろう。UNIXのコンソールとFinder間で自在に行き来することができるような、Windowsで言えば"Open Command Window Here"のような仕組みがあるのだろうか。これも使ってみなければわからない。MySQLやApacheは使えるようだ。

アップルのStoreからMac miniを選ぶと、Mac OS XのバージョンはTigerになっている。製品入れ替えの過渡期だから、まだサイトも完全には更新されていないのだろう。


[Apple] 100万件

iTunes』経由のポットキャスト登録、2日で100万件突破ネタ。最初は、20,000件のうち、3,000件ぐらいを登録したという話だったが。この100万件は、iTunesにPodcastを登録した件数を指す。Podcastの数が100万件もあるという意味ではない。[Revised: 2005-07-23]


[Apple] Public Double Life?

【決算】Apple社は過去最高の業績,iPodは四半期で600%増の600万台 - 産業動向オブザーバ - Tech-On!ネタ。Intel移行への発表前の業績なので当然だが、次の四半期がどうなるかが大変興味深い。

もう一度、WWDC 2005のジョブスのキーノートを見直しているのだが、iTunes+iPod/Windowsを利用して、MacのIntel移行を達成しようということなのかなと思った。iTunes+iPodに関してはまったく影響を受けないどころか伸びるはずだ。無論、Universal BinaryでPowerPC MacでもIntel Macでも動く仕組みを準備したのだから、アプリケーション面でPowerPCユーザーが当面困ることはないわけだ。Macユーザーが買い控えするかどうかは、LeopardがPowerPC Macで動くかどうかだろう。すなわち、問題は、Mac OS XがPublic Double Lifeを続けるかどうかだ。LeopardはPowerPC版も出すのだとは思うが、今のところはっきりしたコメントはないような気がする。

アップルのインテル移行は成功するかを読んで、WWDC 2005のキーノートで、Jobsは長期に渡って両アーキテクチャーをサポートすると表明していることを確認。[Added: 2005-07-19]


[Apple] 裏事情

Apple,第3四半期も好業績,Intelチップ採用の裏事情を読む - 日経エレクトロニクス - Tech-On!ネタ。Tech-On!へのリンクは無料ユーザー登録が必要な場合があるかもしれない。

本記事も含めて様々な推測があるが、どれも少しずつ当たっている面があるだろう。Macが伸びているのはiPod効果も当然あるだろうけど、Mac OS Xの付属アプリケーションを含めた魅力とMacの低価格化の進行によるものだろう。

[Apple] Mac mini Tiger搭載

アップル、新しいMac miniを発表 - SuperDrive搭載モデルも用意 (MYCOM PC WEB)ネタ。とうとう新しくなった。

Appleからメールが来た。Tiger搭載とメインメモリを512MBに倍増したのが売り。実質値下げだし、実用的に動作すると思われるスペックとなったように思う。売れるだろうね。製品が行き渡るのにしばらく掛かるだろう。アマゾンや楽天のPCショップは古い機種のままだった。

[本] UNDERWORLD - 神々の世界

グラハム・ハンコック著、大地舜訳、「神々の世界 上」、小学館文庫、2005年7月1日初版第1刷、701ページ、905円。グラハム・ハンコック著、大地舜訳、「神々の世界 下」、小学館文庫、2005年7月1日初版第1刷、860ページ、1,000円。UNDERWORLDは「水面下の世界」という訳語が正解だろう。「神々の世界」は世界的ベストセラー「神々の指紋」にあやかっての命名である。失われた人類の歴史が蘇るか。クランシーの「教皇暗殺」がまた積読状態に移行([蔵書目録] 教皇暗殺)。ようやく、2巻に移ったのに。1年以上経過。[Revised and added: 2005-07-22]


[本] 私の脳はなぜスクリプトが好きか?

じゃなくて、養老孟司著、「私の脳はなぜ虫が好きか?」、日経BP社、初版1刷2005年7月4日、226ページ、1300円。日経エコロジーに1999-2002年に連載された「養老孟司の蟲のまなざし」に加筆されたものだが、あとがきに養老昆虫館の話が出てくる。養老先生も人間で文明を作る性質があるということらしい。人間という存在の小ささを語る先生の少し物悲しい思いが伝わってくる。

Google Mapsがマップとサテライト(衛星写真)の両方を表示できるようになり、地形の把握が容易になった。養老先生の本を読みながら、先生の自宅付近の里山の地形を見ることができる。マップと情報をリンクさせる仕組みは今後さらに発展するだろう。

[Computing] アップル対グーグル対マイクロソフト対セル対Firefox対Java対LAMP

最近関心のあるキーワードを並べてみた。

長い道のりを乗り越え、とうとう魅力的な独自の世界を作り出して見せたなあと、アップルは実感させる。デザインと機能でiTunesはWindows上でも最高のアプリケーションの一つだろう。Macの価格が低下し、アップルへの移行も現実的な選択肢に入ってきた。ActiveStateがMac OS Xをサポートしたのでスクリプト言語関係も安心感がある。Mac miniは、米国サイト(Apple - Mac mini - Software)ではTiger搭載になっているのだが、日本のサイト(アップル - Mac mini - ソフトウェア)はPantherのまま、なぜ? これが一致したときが日本での買い時だろう。

グーグルのデスクトップサーチは必須のツールになるだろう。Windows Desktop Searchはデザインがいまいちだ。僕にとってはBecky!のプラグインがないと役に立たない。ただ、タスクバーに出るWDSからmsnサーチ(ウェブ検索)をするとある意味当然とは言え、Firefox上で動くのには驚いた。FirefoxユーザーもWDSを使える環境が存在するということになる。これならWDSもしばらく併用してみよう。

「ユーザーの求める“答え”を直接表示」など、マイクロソフトは狼煙を上げるばかりで、今のところ現実的な成果に結び付かないようにも思えるが、「実践実用Perl」で検索すると、msnでは私のサポートサイトがトップに、Googleでは最近は3位に来る。これはランクを重要と見るかどうかの価値観が反映されているのだろう。結果の順位は明らかに異なるので、併用する価値は十分にあるのだろうが、いずれにせよ、なぜそのような順位になるのか、理由がわからなければどちらがいいともなんとも言えないだろう。[Revised: 2005-07-06]

セルは苦戦するのではないかと思われる。優れたハードを活かすアプリケーションを生み出さなければだが。今やハードの性能が律速するようなアプリケーションとはなにだろうか。結局、ゲーム、三次元表示OS、シミュレーション・・・発熱の問題も残されていそうな気がするしね。この予想がはずれることを祈っている。

Firefoxの拡張機能やテーマはブラウザを使う楽しみを広げてくれる。これは一つの重要な分野を生み出したと考えてよいのではと思う。

アプリケーションをC/C++以外で作る仕組みとして、JavaとLAMPがどのように勢力を伸ばすのかが重要な動きである。WAMPというのも有り得るかもしれないが。Windows+Apache(Anhttpd)+MySQL+Perl/PHP/Pythonである。我田引水(^^)アプリケーションさえ動けば、OSは関係ないというマルチプラットフォームの基盤が徐々に確立しつつある。[Revised: 2005-07-02]


[Computing] デスクトップの革命

GDSやWDSが出てきて、デスクトップの意味が変わってきた。デスクトップ自体がデータベース化されてきたのだ。ダウンロードしてきていた様々な大量のPDFも自動的にデータベース化されていく。記憶から消えていたものも蘇ることができるようになる。購読してきたメーリングリストの30数万件に及ぶメールも自動的にデータベース化される。これは大変ありがたい。GDS Plugin for Becky!もバージョンが0.04まで上がっている。

GDSはいつ動作しているのかさっぱりわからない。よくできている(かどうかはわからないのだが、ほーっと思わせる)。WDSはコンピュータのファンが唸り声を上げ始めるとああ動いているなと気付かせる。しばらく唸るとデスクトップのインデックス化が完了したので、検索できますとのポップアップが出る。その前に検索したかったらできないんだろうなと思ってしまう。

[Computing] Browster

記事にはIE用と書いてあるが、インストールしてみるとFirefoxでも動く。単なるプラグインではないのだろう。おもしろいツールだ。Browsterに表示されたページに何か操作しようとするとブラウザがそのページにジャンプする。ジャンプする前に内容を確認できるのが便利なのだが、どこまで必要かということになるだろう。しばらく使ってみよう。

便利だ。BrowsterのNextボタンをクリックして次々に見ていくと素早く検索結果ページを確認していくことができる。[Added: 2005-07-16]


[Computing] デスクトップCGI - Webとデスクトップの融合

その名の通り、デスクトップのローカルHTTPサーバーで動くCGIである。ローカルHTTPサーバーもデスクトップサーバーと称する。この用語を思いついたのは、「実践実用Perl」を執筆したときだが、私自身の造語であるし、当時(といっても1年数ヶ月前)はデスクトップという用語自体が一般のPCユーザーには馴染みがないということで採用には至らなかった。その名残は、「実践実用Perlサポートサイト」の概念図に残されている。Desktop Serverという用語はPython Desktop Serverで使われたのが最初だろうと思う。今やGoogle Desktop Searchなど、ほとんどすべての最先端のアプリケーションはデスクトップサーバーを動かしている。

デスクトップサーバーで動くものはJavaならServletでもよいわけで、なんでもよい。デスクトップではサーバーとクライアントとの両方をユーザーが制御できるし、デスクトップ資源へのアクセスも自由に設定できる。Webでは不可能なことが実現できるわけだ。実は、これが「実践実用Perl」で言いたかったことなのである。そしてまさにあなたがjperlなどのスクリプト言語を使って実用的に実践できることである。

[Computing] 激指

情報処理学会の「情報処理」7月号にミニ特集「コンピュータが将棋を制する日」が出ていた。「激指」は第15回世界コンピュータ将棋選手権の優勝ソフトで、プロ五段に角落ちで勝ったという記事である。チェスの場合、カスパロフがディープ・ブルーに負けたことが一冊の本(Michael Khodarkovsky、Leonid Shamkovich著、高橋啓訳、「人間対機械」- チェス世界チャンピオンとスーパーコンピューターの闘いの記録、毎日コミュニケーションズ、1998年5月1日初版第1刷、341ページ、1600円)になったぐらいだが、将棋名人、竜王が、コンピュータに負ける時は2010-2015年と予測されている。さて、コンピュータが進化した今、思考ゲームはどのように変貌を遂げるのだろうか。激指はLinuxで動いている。


[Computing] マルチカードリーダ MR-DU2A7

昨日、土曜日は「広島みなと 夢 花火大会」だった。昨年の記事は、[日記] 花火だ。昨年はイオン宇品店の前で眺めたけど、携帯のデジカメではシャッターチャンスがずれて花火を捉えるのに相当苦労した。今年は、家内とさらに南下してできるだけ港に近づいた。なにしろ38万人の人出なので近づくのには限界があったが、昨年よりは迫力を楽しめた。今年は携帯のムービーを使って撮影。90個ぐらいのムービーを撮った。メールで送ろうかと思ったが、面倒なので、miniSDメモリカードからコピーしようとUSB2.0接続のカードリーダー(ELECOM マルチカードリーダ MR-DU2A7、2,280円)をイオン宇品店で購入した。

jpg/CA240005_s.jpgELECOM マルチカードリーダ MR-DU2A7

イオンラウンジでマニュアルを見ているとminiSDの場合はアダプタを介する必要がある。アダプタは付いていたはずだが、帰って確認してみると、携帯の中から取り出せそうもない。十日市の桂蘭でオーダーバイキングの中華料理を食した後、もう一度イオン宇品店に向かい、一つだけ残っていたアダプタ(ハギワラ シスコム miniSDアダプタ、500円)を購入。

でも、AMCという拡張子のムービーファイルは、最初はQuickTimeで再生できたのだが、なぜか再生が再現できなくなる。マルチメディアファイルはよくわからん(^^;)

[Computing] Flash 8

Flash 8、来月初めに登場--新しいビデオ関連機能に注目 - CNET Japanネタ。Flashも選択肢の一つなんだが、なかなか手が出ない。

[日記] ミニ豪雨

局地的に短時間の豪雨。今年の梅雨の特徴。三次・庄原間が土砂崩れで一時的に通行止めになったらしい。土砂崩れは大変だが、山間部に降ってくれれば水不足の解消につながるだろう。帰りの定点気温観測は22℃。久しぶりに外部のほうが気温が低くなった。

[日記] 豪雨前線

梅雨前線は本格的な豪雨前線となりつつある。水不足はなくなるかもしれないが、豪雨も困りものだ。豪雨なり雷鳴響き目覚めけり、そのまんまか。

[日記] 歴史の問題

首相の靖国参拝問題、中国の排日教育等の問題がクローズアップされているが、感情論ばかりで本質的な議論にならないなあと残念に思っていた。今日のサンデープロジェクトで議論されていてよかったと思ったのが、南京大虐殺のようなテーマについて十分に報道してこなかったという反省がマスコミ側でもなされたことである。やはり、歴史の事実は何だったのかを現在の一般の日本国民が知らない、知る機会がほとんどないことが問題であろう。僕らのように日本史や世界史が選択科目でなかった時代に教育を受けた人間であっても正確に知らないのだから、新しい世代の日本人を含めてコメントのしようがないというのが本当の気持ちであろう。歴史を経験された方に是非、できるだけ客観的な事実を伝えていただきたいと思う。嫌な思い出したくない記憶であったとしても。

[日記] 今日のニュース

今日は体調が悪いので、早く帰宅。暑さにバテたかも。乗り込むときの車の外気温は35℃、はつかいち大橋の定点観測地点では28℃まで下がった。定点観測の温度計表示は26℃。いろいろとニュースはあるが、MaypoleがLinux JournalのEditor's choiceを獲得したそうだ。

Firefox向けGoogleツールバーβ版が出た。早速インストール。Googleツールバーを入れ替える。なんだか、IEみたいだ。しっくりこない。機能的には特にどうということはない。元に戻す。

電子書籍も今後おもしろくなるだろうが、大型の専用ハードをわざわざ使うことはないだろう。携帯やiPodなどのような小さなハードで読むにはテキストで十分だ。Googleデスクトップサーチなどで検索して、ヒットしたページを開けるようになるとおもしろい。zinioのような素晴らしい特殊なリーダーもあるのだが、閉じられたシステムは困る。データは他のデータと同様に検索の対象にならねばならない。


[日記] 内容の見直し

最近は、各日記記事の内容について修正や追加の必要がある場合は、修正・追加して日付を記している。そのときの思い込みや勘違いも度々あるので、おかしいと思われる記事の場合は再確認をお願いしたい(^^;)コメントメールは歓迎である。

[日記] 何が起きたのか

今日、rss2html.cgiが動かない。rss2html.cgiを起動するリンクをクリックするとanhttpdがクラッシュするのだ。Windowsを再起動したり、Browsterをアンインストールしたり、anhttpdを再インストールをしても症状は変わらない。思いついて、Firefoxの代わりに、IEで「メモる」システムを起動する。rss2html.cgiのリンクをクリックするとrss2html.cgiのスクリプトテキストが表示される。あーっ、rss2html.cgiの代わりに、rss2html.cgi.txtをanhttpdが読み込んでいるのだ。hTunesのページにスクリプトを掲載するために作ったテキストファイルである。/cgi-bin/awakeningのディレクトリから削除すると問題は解消した。やれやれ。

[日記] 蒸夏

蒸し暑い夏がやってきた。明日は出社。メールや電話のない日に仕事を片付けよう。

[日記] 人民元切り上げ、首都圏は大地震、エジプトはテロ

人民元切り上げ2%。昨日の東京の地震は震度5強。千葉県北西部地下73kmの震源のマグニチュードは暫定値で6だった。エジプトはテロに襲われる。悲惨な対立が解消する見通しがない。経済、自然、政治、毎日のようにニュースには事欠かない。人間の世界ってままならない。

[日記] 台風7号関東へ

もう夏バテか、疲れがひどく、早く帰宅。外に出ると空はよく晴れて青い。風が強くて、湿度が低く、夏のむっとした感じが消えている。帰宅時のほぼ定時定点観測では27℃、昨日が31℃だったから、4℃低い。さわやかに感じるはずだ。台風の影響なのかもしれない。

[日記] 養老先生講演会 - エリザベト音楽大学セシリヤホール(7/28)

7月28日、エリザベト音楽大学セシリヤホールで広島若葉ライオンズクラブのチャーターナイト20周年記念チャリティーとして、「養老孟司講演会&音楽の夕べ」があった。養老先生の講演会は人工知能学会での講演会についで二度目。18:00開始だったので、昼から会議だったが、半日有休にして、会議終了後16:30過ぎにそそくさと退社、アテンザの進路を広島市中心部に向けた。なんとか開始5分前に家内を見つけて着席できた。

講演会のあと、近くのムーラン・ルージュでパスタを食べながら、メモを取ればよかったと講演会の内容の話をしていると、聞いたことがある話がかなりあったと家内が言うので、一緒に聞いた人工知能学会での講演会の話が骨格になっていたらしいことがわかった。人間の記憶は曖昧なもので、僕自身は養老先生の本をだいぶ読んでいるので、本の話だったか、以前聞いた講演会の話か、なにか他にテレビで見た話なのか、判然としないのだ。

an appleとthe appleの話は間違いなく、人工知能学会の講演会でもあった話だ。その時は構文解析の話と関連するのでわざわざ取り上げたのかと思ったのだが、一般人を対象にしても話すのだ。冠詞の「an」と「the」が、助詞の「が」と「は」が対応しており、同時平行処理になっているので、名詞の前につこうが後につこうが同じことなのだという説を開陳。ギリシャ語の場合は冠詞は名詞の前についても後についてもよいという規則があるらしい。名詞が主格に使われるだけならそれでもよいかもしれないが、少し無理筋な話のような気がしないでもない。言語は同時入力にはならないし、同時平行処理というのはどのように実証するのだろうと要らぬことも考えてしまった。しかし、笑わせるのがうまいので、始めから終わりまで笑い通しの大変楽しい講演会だった。抽選のサイン本の購入を予約して、会場を後にした。

[日記] SHUREのイヤホン - ほぼ日刊イトイ新聞

チャンネルを切り替えていると、NHKで月刊やさい通信の最後の部分が目に入って、ふと、思い出した。久しぶりに見てみるとiPod/iTunesの話題。SHUREのイヤホンがいいらしい。SHUREはカートリッジのメーカーとしてTypeⅣが有名だったが、今やLPレコードはなくなってしまった。イヤホンで活躍しているのかと懐かしく思った。アマゾンで検索してみると出てきたが、試してみるには少し高い。デザインがiPodに合わないし・・・、添付のイヤホンが壊れたときには選択肢として考えよう。


[日記] メイリオ?

7月も今日で終わり。蝉が盛んに鳴き続けている。Windows Vistaが新JIS規格フォント対応、ClearType書体「メイリオ」採用 (MYCOM PC WEB)ネタ。新しいClearTypeフォントがなぜメイリオという名前なんだろうと思ったら、Meiryoとアルファベットで書いてある。なるほど「明瞭」ということなんだ。なぜ意味不明のメイリオなんて読ませるんだろう。

[日記] 思索の旅へ - 都市化の極北

養老先生の講演会で聞いた話を思い出したので、記録しておこう。最初、意識の話から展開して、感覚と認知(用語は違っていた可能性がある)の話があって、感覚的認識は絶対音感のようなもので、動物的なものである。猫は同じ言葉でも音の高低が違うと異なるサインとして受け取る。だから言葉を認識できない。人間の認識はパターン認識であるから、音感も相対的なものになってしまう。絶対音感があるということはサルに近いということになる。音楽大学でそんな話をしているのだから世話はないが、ピアノが趣味の女房も唸っていた。まあ、動物的ってことは個性的なことであるという話と同じレベルの話で、動物的ってことが悪いわけではない。都市化が進むと没個性化してくるわけで、共通の理解を得るためには、すなわち同じバカの壁の内側に入るためには個性的であってはいけないわけだ。人のできないことができるのは感覚的・動物的とも言えるのかもしれない。

プログラミングやスクリプトを書くことは、養老流に言えば、さてどのような位置づけになるのか。事象からパターンを抽出して、処理を自動化するのがプログラミングである。パターン認識の極北にあるということもできる。ということは、都市化した人間の最も都市化した営みなのかもしれない。虫を採集して分類して、地域による多様性の違いを認識することも、XMLやHTMLを採集してパターンを調べてスクリプトを書くことも人間の営みであることには変わらないのだが。

[日記] 徒然なるままに - 本屋にて

「徒然なるままに」という文字列を更新日記検索してみると一度出てくる。Life logという副題が付いている。まとまった話を書こうと構えると息が続かない。思い付きの気になる話を書き付けるのがせいぜいである。しかし、「徒然なるままに」っていうのは「暇をもてあましているままに」ということらしいが、けっして暇で書いている感覚ではない。語感から、その時々の思いつくままにというような意味合いで使っていたのだが、違うのか(^^;)

駅前のエリエールに行きたいというので、女房と車で出た。段原側から駅前の橋に入るとエリエールへの待ち行列には入れないので、橋を渡り、駅前の通りをエリエールの北側を回って、また橋を渡り、逆側から待ち行列の最後尾に付ける。

僕は10階のジュンク堂で本を探索する。養老先生の「人間科学」という本を書いたという話が「私の脳はなぜ虫が好きか?」の最後の「虫採りに行けない本当の理由」にでてくるので探した。いろいろと見て回ってもどこにあるかわからないので、検索端末で調べるとブレインサイエンスの棚にあるが在庫は店員に確認してくれと出てくる。とりあえず、棚の位置を端末で確認して向かう。結局、棚にはない。ブレインサイエンスの棚を占めているのは養老先生と茂木さん、池谷裕二さん、立花さんあたり。またの機会にアマゾンで買うかと思う。

ティム・クレインの「心は機械で作れるか」を哲学の棚で見て、欲しいなと思ったのだが、4000円を越えるので躊躇していて、オライリーの「PDF HACKS」の購入に気持ちが傾いていた。今やPDFは重要なメディアになっているので、スクリプトで取り扱えないとまずいなと思っていた。インターネットにも情報はあるのだが、併設のカフェコンタティーノでアイスコーヒーを飲みながら読んでいると知らないことが山ほど載っている。オライリーのHACKSシリーズはおもしろいものが多い。GOOGLE、SPIDERING、IPOD & ITUNESに続いて、もう4冊目だ。

コーヒーを飲み終えて、楽譜を探しにいったのであろう女房を半分探しながら、本をさらに探索。アイザック・アシモフの科学エッセイシリーズを見つける。グラハム・ハンコックの「神々の世界」に思いがけずアイザック・アシモフの引用を見つけて、アイザック・アシモフも失われた人類の長い歴史について知っていたのだと思わず頷いたのだが、おそらく科学エッセイからの引用だろうと思う(後で調べると、Frontiers Ⅱ)。銀河帝国興亡史は数万年のオーダーの歴史を取り扱うのだが、現在からたかだか紀元前数千年までしか辿れない人間の歴史から、数万年という時間の経過を設定した科学的根拠を知りたいと思っていた。解剖学的には現人類は3-4万年前と同じなのだという話は養老先生の本だけでなく、グラハム・ハンコックの本にも出てくる。さて、「神々の世界」に戻ろうか・・・

[映画] 宇宙戦争 Ⅱ

トム・クルーズの宣伝が効いたので、ワーナーマイカルに18:55からの上映をe席予約をして見に行ってきた。ストーリーがベルヌの原作に忠実なものになるだろうことは、結末を知っていれば、最初の画面で予感させてしまう。少し暗めの映画だが、最初からしばらくすると緊張の連続になる。どこまで実写でどこからがグラフィックスなのかはほとんどわからない。最早お馴染みの驚異的な表現だ。昔ならとても映画化が困難な題材も映画になってしまう。予告編で「キングコング」のリメイクが放映されたが、こちらもおもしろそうだ。次第に何が起こっても驚かなくなりそうなのが逆に怖いかもしれない。外で、不気味に雷が響いている。

jpg/CA240169_s.jpg宇宙戦争テーマのホログラムを映すコーラ容器


[映画] スター・ウォーズ エピソードⅢ シスの復讐

スター・ウォーズの最終篇ということなので、ワーナーマイカル広島に出掛けた。金曜日の夜にe席リザーブしていたのだが、がら空きと言ってもよいぐらい。良い席だけは埋まっていた。

最初の宇宙での戦闘場面はこれまでになく創意に満ちていて面白いもので、他の場面もほとんどはアクロバティックな戦闘場面といってもよい。リアルな非現実空間が繰り広げられるのを見ながらすごいとは思うが、もう感覚が麻痺しているので驚くことはない。それなりの映画ということだろう。欠けているストーリーの一部を埋めるという位置づけなので、ストーリーが予測できる範囲ではおもしろくない。アイザックアシモフの銀河帝国興亡史シリーズもそのような性格を持っているのだが、アシモフ自身の最後の作品はストーリーの展開が平板な感じがしたものだ。見る側はもっとおもしろいものを期待してしまうから、次第に難しくなる。スター・ウォーズ - Wikipediaにあるようにエピソード1-3は後から製作されているが、奇しくも、アイザック・アジモフ - Wikipediaにあるようにアシモフは「ファウンデーションへの序曲」、「ファウンデーションの誕生」を「ファウンデーション」(銀河帝国興亡史)シリーズの最後に書いている。[Revised: 2005-07-18]

[Google] Google Maps 日本版 BETA

米国・カナダ(NAVTEQ)と英国(Tele Atlas)だけで提供されていたGoogle Mapsの日本版が待たれていたが、とうとう出た。コピーライトの表示を見ていると、ゼンリンの地図を使用している。極めて高速に表示される。

日本版といっても、全世界の一部としての日本であり、米国、カナダ、英国とともに詳細が世界地図に表示され、拡大していくと自分の家の平面的な形まで見ることが可能である。世界がインターネットを通じてコンピュータの中に入ってしまう時代になったのだということを実感させる。

Firefoxのgooglebar(mozdev.org - googlebar: index)から、日本地図を検索する場合は、Googlebar Options→Google Searches Select international version of Google Searches→Google search=Japanとしておくとよいだろう。これはGoogleが賢い(?)ので、一度日本地図を検索して表示させると米国のサーバーからでも日本地図を表示させることが可能である。mozdev.orgのgooglebarでは、まだMaps searchの設定項目にJapanはない。googlebarの持つ様々なプルダウンメニューを見ているといろいろあるもんだなあと思う。[Revised: 2005-07-16]

[Added: 2005-07-17]

[Google] Google Mapsの展望

Google Earth関連の記事を月の初めにピックアップしていたが、まったくコメントできないままに来ていたので新たな記事に移した。Google Mapsの上に、Google Earthが載ってくる。言わば地理情報システムである。地勢情報だけでなく、その地点の歴史や文化、生活、風景の情報が地図情報に重ね合わせられる。私が今年の五月連休に開始した散歩世界プロジェクト (Walking World Project)も同様のアイデアである。蝉が鳴いている。暑い夏が始まる。生態系・気候情報も学術情報の一部として、また生活情報として重ね合わせられるだろう。養老先生のヒゲボソゾウムシ史観による養老的世界「征服」地図などもそういうものである。Google Maps上に世界のめくるめく多様な重層構造が見えてくるかもしれない。楽しみである。


jpg/gearth.jpgGoogle Earth - 広島

使わずして語っても、あまり意味がないので、Google Earthをインストールして使ってみた。まだ、Webブラウザで動くわけではない。専用のアプリケーションである。起動時に最初地球全体が表示されて、ズームインするところはおーっと思う。ニューヨークなどは建物の姿がわかるまで拡大される。日本は皇居だけはかなり詳細に表示されるが、広島は概要が掴めるレベルの情報しかない。建物の姿までわかると訪れる前に大体の雰囲気が掴めるだろう。デジタル地球儀といった趣で、これだけ高性能だと地球儀が売れなくなるだろう。しかし、Fly Toで、Hiroshima,Japanを検索すると北海道の北広島に飛んでいくのはご愛嬌である。日本はまだサポートされていないのだ。このFly Toという機能は飛行機で飛んでいく気分を味合わせてくれる。世界中に飛んでいけるバーチャルトラベルツールでもある。いや、おもしろい。

[iTunes] 毎日、Podcast

ニフティ、ポッドキャスティング専門サイト「Podcasting Juice」 - CNET Japanネタ。@niftyの動きが速い。


[Java] Sleep

Perlの文法を持ったJavaベースのスクリプト言語 - Sleep 2.0公開 (MYCOM PC WEB)ネタ。おもしろそう。Javaもバリバリに使えるようになるかも(^^;)v


[マイクロソフト] 検索のあるべき姿

マイクロソフトが考える「検索のあるべき姿」 - CNET Japanネタ。検査結果から、土星のSATURNと車のSATURNを区別するのは容易だろう。ユーザーがどちらの結果を期待しているのか、前もって判断できるようにすることはそれほど意味があることだろうか。例外はつきものなので、必要なものが出てこないケースが生ずるだろう。むしろ、AND OR NOTの使い方の教育をしたほうが有用だろう。

[マイクロソフト] 好調継続

米Microsoftが過去最高益を達成--サーバ/ツール製品、Xboxが牽引 (MYCOM PC WEB)ネタ。特に何も言うことはない。当面の脅威は、OpenOffice.orgぐらいのものだろう。[Revised: 2005-07-24]

[マイクロソフト] Windows Vista

「Longhorn」改め「Windows Vista」、次世代Windowsの正式名称が発表 (MYCOM PC WEB)ネタ。見るべき情報はないけど、記録として残しておこう。さてなにがどうなるんだか、よくわからないんだが、互換性はあるんだろうね。[Revised: 2005-07-24]

[マイクロソフト] Windows Vista (Ⅱ)

フォトレポート:MSの次期フラグシップOS「Windows Vista」の姿が明らかに - CNET Japanネタ。新しいデザインはどうだろう。早く使ってみたいものだが、はて、テストマシンを準備するかな。

[マイクロソフト] Windows Vista (Ⅲ)

いよいよ、Vistaの全貌が姿を表しつつある。フォントも変わるので、デザイン面も相当印象が変わりそうだ。


[マイクロソフト] マイクロソフトの動向

「2006年はかつてない新製品ラッシュでIT業界をリードする」とMSバルマー氏 (MYCOM PC WEB)ネタ。業績好調。


[Perl] The Perl Review 1.3 Ⅱ - 恐怖の本屋

26ページに恐怖漫画が掲載されている。少年?が本屋で本を探している。探している本が見当たらない。なぜないんだろう。Java、Java、Java、・・・・・、Java、Java、Java、・・・・・、Java、Java、Java、・・・・・書架の上のほう、COMMITER PROGRAMMINGの並びに輝く目的の本を、「実践実用Perl」じゃなかった(^^;)、"Learning Perl"を見つける。あったぞー。Noel McCarthy作、"SEARCHING FOR PERL IN A SEA OF JAVA"。

[Perl] 「実践実用Perl」講座 (ⅩⅠ) - hTunes開発計画

iTunesならぬhTunesの開発計画。Podcast用RSSからhtmlを生成して表示させる仕組みを「実践実用Perl」のrss.cgi/rss2html.cgiと同様にして作ってみようという試み。取り敢えず、CinecastのRSSをrss2html.cgiで表示させてみた。ブラウザ上でPodcast RSSへのリンクにカレットを合わせて右クリックして、リンクをブックマークやお気に入りのRSSフォルダ(自分で作っておいてね)に保存する。rss.cgiがrss2html.cgiにPodcastのURLを渡すリンクを含むRSS FeedsリストのHTMLを生成してくれる。RSS 2.0に過ぎないわけだから、ある程度表示できるはずだ。


jpg/CA240173_s.jpgrss2html.cgiによるCinecast表示画面

宇宙戦争のトム・クルーズと天才的な演技を見せた子役、Dakota Fanning(Rachel)が写っている。音声ファイルへリンクされたPODCASTというロゴをクリックすると音声の再生が始まる。


CinecastはdescriptionにPodcastの音声ファイルへのリンクが埋め込まれているので、このままでも実用になるが、通常は、少なくとも音声ファイルへのリンクを記述するenclosureのタグの処理が必要になる。Inside Mac RadioのRSSを見ると、itunesという独自名前空間を設定している。CinecastのRSSにもcreativeCommons、feedburner、geoという拡張名前空間がある。いずれも独自の表現をするためのデータを持たせるために使っている。Cinecastの場合は、ブラウザで読み込むとxslでHTMLに変換して表示させる仕組みを採用している。Inside Mac Radioの場合はiTunesで使用するデータを持たせているのだろう。Perlcastは未拡張のシンプルなRSS 2.0を使っている。

[Perl] 「実践実用Perl」講座 (ⅩⅡ) - hTunesの迷走

予想通り、ちょこっといじったらすぐできてしまった、、、と思ったのだが。enclosureタグのurl属性を取得するようにパターンを追加して、データがあれば、Podcastという文字列にメディアファイルへのリンクを張って、表に表示する。Podcastのリンクをクリックすると、statusというフレームに表示するようにtarget属性を付加しておく。「メモる」システムのフレーム設定にstatusフレームを追加すると完成。

jpg/CA240174_s.jpgPodcast対応rss2html.cgiの表示画面

Podcastのリンクをクリックして、statusフレームでQuickTimeが音声再生をしているところ。画像が歪んでいるのは携帯電話のデジカメのレンズが歪んでいるためだろう。

Inside Mac RadioのPodcastを試すと、Firefoxが文字列を吐いてハングしてしまう。オーディオファイルがm4aという拡張子、mpeg4 audioになっている。これはFirefoxの設定を見るとiTunesに関連付けられている。問題のないmp3も同じようにiTunesに設定されているのだが・・・

インターネットエクスプローラではmp3でさえ、再生できない。マルチメディアファイルは簡単にはいかないかな・・・かなり環境に依存しそうである。

Firefoxでは、Perlcast、CinecastのPodcastのリンクは単にアンカータグのhref属性の指定で問題なく再生されている。ブラウザでマルチメディアファイルを再生する場合には通常の方法である。メディアプレーヤを指定するためには、QuickTimeの場合は、次のサイトが参考になる。[Added: 2005-07-06]Windows Media メタファイルについての情報を追加した。[Added: 2005-07-07]

QuickTimeのqtlという形式のファイルを出力するようにして、そのファイルにリンクする方法を確かめてみたが、QuickTimeは立ち上がるが、自動的に指定のURLのファイルを読み込んで再生は始まらない。なぜかはよくわからない。起動したQuickTimeでファイルやURLを直接指定すると再生が始まる。[Revised and added: 2005-07-09]


[Perl] 「実践実用Perl」講座(ⅩⅢ) - OTD BBSのセマンティックスクレーピング

久しぶりに山本幸一さんのBBS(Discussion)を覗きにいったら、相変わらず地道に活動を継続されている。やはり掲示板をウオッチしたいなと、以前も思いながらサボっていたOTD BBSのスクレーパーを作り始めた。BBSの出力はeuc-jpなので、jperlでスクリプトを書く場合には、読み込んだ掲示板データをsjisに変換して取り扱う。最近は、HTMLに変換するスクレーパーではなくて、RSSに変換するスクレーパーを書いて、その出力をrss2html.cgiに渡すようにしている(無論、スクレーパーCGIをローカルサーバーにおいて、他のRSSリーダーに読ませることも可能である)。Semantic Scraperである。MITのPiggy Bank(SIMILE | Piggy Bank | Architecture)等と同じ考え方である。違いは、Java(Jetty Java HTTP Servlet Server)+Javascript(+XUL)を使うか、httpサーバー+CGI(Perl)を使うかにある。ただ、XULを使えば、Firefoxにブラウザが限定されてしまう。RSS 1.0は一応UTF-8で書くのが推奨なので、UTF-8に変換して出力する。

出力をチェックする場合は、CGIスクリプトをコマンドラインでも動くように、URLをコマンドライン引数からも受け取れるように書いておくと便利だ。UTF-8等様々な文字コード出力をチェックする場合は以前紹介したPoderosa(index - Poderosa)というターミナルエミュレータが大変便利である。推奨する。Cygwinのシェルに接続して表示できるので、jperlも動かすことができる。しかも表示する文字コードは随時変更可能であるので、スクリプトの各部の出力で文字コードが正しく変換されているかチェックできる。背景色を黒に文字色を白に変更したコンソールの一部を示しておこう。


jpg/poderosa.jpgPoderosa

話は変わるのだが、この大きな画像のサイズは58KBである。更新日記では、100KBを越える大きなサイズの画像を頻繁に使っていて顰蹙を買っていたと思うが、最近は少し賢くなった。gimpの使い方を学習したからである。JPEGの場合、レイヤー→色→ポスタリゼーションで減色している。30色ぐらいにするとディスプレィでは見た目はほとんど変わらない。

otdbbs2rss.cgi

随分、スクリプトを書くのに時間が掛かった。なぜか。BBS出力のHTMLのソースに、Firefox上で名前を付けてフレームを保存という方法で得たものを使ったせいである。得られたHTMLファイルが現実のHTMLとは違うことに気が付くのに時間を要したのである。絶対マッチするはずの正規表現パターンがマッチしない。Firefoxを通してHTMLを保存すると正しく書き直して保存するのである。無駄な時間を費やしてしまった。このRSSエージェントはたまたまjanjan2rss.cgiを下敷きにしたので、XML::RSSモジュールは使用していない。

use LWP::Simple;
use Unicode::Japanese;
require 'cgi-lib.pl';
$s = Unicode::Japanese->new();
&ReadParse(*in);
$cgidir = $ENV{'CGIDIR'};
if($in{'URL'}){
	$geturl = $in{'URL'};
}elsif($ARGV[0]){
	$geturl = $ARGV[0];
}
($mday,$mon,$year) = (localtime)[3..5];
$mon += 1;
$year += 1900;
$cdate = sprintf("%4d-%1.2d-%1.2d",$year,$mon,$mday);
$content = get($geturl);
$s->set($content,'euc');
$content_sjis = $s->conv('sjis');
@lines = split(/\n/,$content_sjis);
foreach $line (@lines){
	if($line =~ /<div align=""center">/){"
		$bbs_description_sw = 1;next;
	}
	if($bbs_description_sw == 1){
		if($line =~ /<font color="#ff6699">(.+)<\/font><br>/){
			$bbs_description = $1;
		}elsif($line =~ /<a href="([^"]+)">back to Home/){
			$bbs_home_url = $1;
			$bbs_description_sw = 0;
		}
	}
	if($line =~ /<td>(\d+)<a name="\d+"><\/a><\/td>/){
		$article_num = $1;
		$sw = 1;next;
	}
	if($sw == 1){
		if($line =~ /<td><font color="#ff6699">(.+)<\/font><\/td>/){
			$title = $1;
		}elsif($line =~ /<td><font color="#ff9933">(.+)<\/font><\/td>/){
			$author = $1;
		}elsif($line =~ /<td nowrap><font color="#ff6699">(.+)<\/font><\/td>/){
			$date = $1;
		}elsif($line =~ /<td colspan="6" bgcolor="#*ffffff">(.+)$/){
			$article = $1;
			$article_sw = 1;$sw = 0;next;
		}
	}
	if($sw == 0 && $article_sw == 1){
		if($line =~ /^([^<]*)<\/td>$/){
			$article .= $1;
			$article_sw = 0;
			$article =~ s/\t/    /g;
			$items{$article_num} = join("\t",$title,$author,$date,$article);
		}else{
			$article .= $line;
		}
	}
}
print "Content-type: text/xml\n\n";
$header = <<HERE1;
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<rdf:RDF 
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns="http://purl.org/rss/1.0/"
> 
  <channel rdf:about=\"$geturl\">
    <title>OTD BBS</title>
    <link>$bbs_home_url</link>
    <description>$bbs_description</description>
    <dc:date>$cdate</dc:date>
    <items>
      <rdf:Seq>
HERE1
$s->set($header,'sjis');
$uheader = $s->getu;
print $uheader;
foreach (sort keys %items){
   $str = "      <rdf:li resource=\"$geturl#$_\" />\n";
   $s->set($str,'sjis');
   $ustr = $s->getu;
   print $ustr;
}
$mheader = <<HERE2;
      </rdf:Seq>
    </items>
  </channel>
HERE2
$s->set($mheader,'sjis');
$umheader = $s->getu;
print $umheader;
foreach (sort {$b <=> $a} keys %items){
    ($title,$author,$date,$article) = split(/\t/,$items{$_});
    $article = &entities_encode($article);
     $date =~ tr/\//-/;
$item = <<ITEM;
  <item rdf:about=\"$geturl#$_\">
    <title>$_ : $title</title>
    <link>$geturl#$_</link>
    <dc:description>$article</dc:description>
    <dc:creator>$author</dc:creator>
    <dc:date>$date</dc:date>
  </item>
ITEM
    $s->set($item,'sjis');
    $uitem = $s->getu;
    print $uitem;
}
print "</rdf:RDF>\n";
# マークアップ記号の実体参照エンコード
sub entities_encode{
	my($str) = @_;
	$str =~ s/&/&amp;/g;
	$str =~ s/</&lt;/g;
	$str =~ s/>/&gt;/g;
	$str =~ s/'/&apos;/g;
	$str =~ s/"/&quot;/g;
	return $str;
}

[Perl] ActivePerl 5.8.7.813

6月の最初に出たのだと思うが、最新版の5.8.7をインストールしてみるとHTMLドキュメントがうまく表示できない。HTMLソースを調べると必要なJavascriptが揃っていない。インストールに失敗している。修復セットアップしても症状は改善しない。結局古いバージョンをアンインストールしてから、再インストールするとうまく表示できるようになった。ドキュメントのデザインやActivePerlのマスコットのコモド大蜥蜴のデザインもシンプルで垢抜けたものになった。Perl5.8自体の完成度が上がり、5.8.5以降はFuture Directionの項目もなくなっている。マルチバイト文字圏のユーザーは、インターネットのマルチコード文化に適応する必要があるだけでなく、RSSやPodcastのRDF/XMLの発展によってUTF-8を取り扱う場面が多くなってきている。文字コードの問題だけであれば、jperlで十分対応できる。むしろ、Windows環境のsjisユーザーにとってはjperlが使いやすい。しかし、多様な最新のモジュールを使うためにはUTF-8をベースに構築されたPerl5.8の使いこなしを考えざるを得なくなってきているかもしれない。その延長線上のPerl6を見据えながら、Perl5.8でUTF-8環境への適応を考えていくべきであろう。もちろんjperlがなくなるわけではないし、sjisメインのWindows環境下ではまだまだ十分に有用なものである。

このようなことを書くのも、MaypoleやCatalystがSQLiteというRDBMSを使用しているので、調べ始めるとおもしろそうだということがある。DBIそのものはPerl5.005_03でもバージョン1.38まではOkだが、DBD::SQLiteは新しいだけに難しそうである。SQLiteはパブリックドメインなので、DBD::SQLiteにバイナリが取り込まれているために、MySQLのように別途RDBMSをインストールする必要もない。さらには相当高速に動作するらしいので、RDBMSの選択肢として有望である。RDBMSを必要とするほどのアプリケーションはまだ書いていないが、RSSを基盤として各種データを統合する構想も考えられる。

これまではWindowsでUTF-8環境を構築するのはほとんど不可能だったが、最近ではエディタにはTeraPadが使えるし、コンソールにはCygwin+Poderosaが使える。出力はRDF/XMLかHTML/XHTMLになるだろう。アプリケーションはWebブラウザ上のCGIとして動作させる。


[Perl] 「実践実用Perl」講座(ⅩⅣ)- きまぐれ千夜千冊、anhttpdの使い方、OLE

やれやれ、また千夜千冊がsenya2rss.cgiで読めなくなったと思ったら、今度は改行コードが\rになっている。これはブラウザで表示したソースを調べてもわからない。また、無駄な時間を費やしてしまった。パターンマッチも簡潔に書き直した。問題ないつもりだが、全体にどのように影響を与えたかは検証していない。最近の20件を読んで、データベースを更新していくだけなら問題ない。問題を見つけた方はご連絡ください。

これらの教訓は、既に「実践実用Perl」執筆中に経験しているのに、すぐ忘れてしまう。人間は忘れる動物だ。新しいsenya2rss.cgiを載せておこう。LWP::Simpleのgetメソッドでは、ヘッダーを添付してリクエストできないので、LWP::UserAgentを使うように変更。取得したデータは[\n\r]+で分割して行データに変換している。

senya2rss.cgi

require 'cgi-lib.pl';
use LWP;
use XML::RSS;
use Unicode::Japanese;
$s = Unicode::Japanese->new();
&ReadParse(*in);
@header = (
	'UserAgent' => "libwww-perl/$LWP::VERSION",
);
$browser = LWP::UserAgent->new;
$baseurl = "http://www.isis.ne.jp/mnn/senya/";
$getfile = $baseurl . "senya.html";
$channel_title = "松岡正剛の千夜千冊";
$channel_description = "千冊の「本」で語られた世界の知の放埓な記憶";
if($in{'lastnights'}){
    $max = $in{'lastnights'};
}elsif($ARGV[0]){
    $max = $ARGV[0];
}else{
    $max = 2000;
}
unless($res = $browser->get($getfile,@header)){
	print "Content-type: text/html\n\n";
	print "<HTML><BODY><p>LWP::UserAgentのget関数がundef値を返しました。</p></BODY></HTML>\n";
	exit;
}
$doc = $res->content;# UserAgentのget関数の戻り値からcontent部分を取得
print "Content-type: text/xml\n\n";
$rss = new XML::RSS (version => '1.0');
dbmopen(SENYA, 'senya800', 0666);
@content = split(/[\n\r]+/, $doc);
foreach $line (@content){
    if($line =~ /千 夜 千 冊 BACK NUMBER/){
        $sw = 1;next;
    }
    if($sw == 1 && $line =~ /<a href="\/mnn\/senya\/senya(\d*)\.html">(\d+)<\/a>/i){
        $htmlnum = $1;
        $nightnum = $2;
        if($nightnum != $htmlnum){
            $htmlnum = $nightnum;
        }
        if($line =~ /<p class="mover"><font color="#000000">([^<>]+)<\/font>/i ||
            $line =~ /<p class="mover">([^<>]+)<\/td>/i ||
            $line =~ /<p class="mover">([^<>]+)$/i){
            $title = $1;$mhtml = "senya" . $htmlnum . ".html";
            $rss->add_item(
                title => $s->set("第${nightnum}夜", 'sjis')->utf8,
                link => $baseurl . $mhtml,
                description => $s->set($title, 'sjis')->utf8,
            );
            $SENYA{$nightnum} = "${baseurl}$mhtml\t$title";
            $getnightcount++;
        }
    }elsif($sw == 1 && ($line =~ /<p class="mover"><font color="#000000">([^<>]+)<\/font>/i ||
        $line =~ /<p class="mover">([^<>]+)<\/td>/i ||
        $line =~ /<p class="mover">([^<>]+)$/i)){
        $title = $1;$mhtml = "senya" . $htmlnum . ".html";
        $rss->add_item(
            title => $s->set("第${nightnum}夜", 'sjis')->utf8,
            link => $baseurl . $mhtml,
            description => $s->set($title, 'sjis')->utf8,
        );
        $SENYA{$nightnum} = "${baseurl}$mhtml\t$title";
        $getnightcount++;
    }
    last if $getnightcount == $max;
}
$rss->channel( title => $s->set($channel_title, 'sjis')->utf8, link => $baseurl,
               description => $s->set(&entities_encode($channel_description),'sjis')->utf8,
               language => 'ja' );
print $rss->as_string;
dbmclose(SENYA);
sub entities_encode{
  local($str) = @_;
  $str =~ s/&/&amp;/g;
  $str =~ s/</&lt;/g;
  $str =~ s/>/&gt;/g;
  $str =~ s/"/&quot;/g;
  return $str;
}

CGIの出力をローカルサーバーから、もう一つのCGIで読み込んで処理する場合には、anhttpdの「オプション一般」→「CGI/SSIプロセス制御」にある「単一スレッド」のチェックははずしておく必要がある。標準ではそうなっているのだが・・・チェックすると動かなくなったので、あっそういうものかと気が付く(^^;)

anhttpdの「オプション一般」→「CGI/SSIプロセス制御」にある「CGI出力を検査」をチェックしておくと、CGIがエラーになった場合にはPerlのエラーメッセージがブラウザに出力された。これは便利。何に使うものか、これも実際にチェックしてみないとわからないものだ。困ったことがあるとなんとかできないのか、いろいろトライする。それがノウハウになる。

OLEはCGIではanhttpdでも動かないみたいだ。Win32::Clipboardはanhttpdでは動いたが、Apacheでは動かなかった。さて・・・

[Revised & added: 2005-07-17]

[Perl] 「実践実用Perl」講座(ⅩⅤ)- Apacheを使ってみよう

「実践実用Perl」を執筆しているときは、AnhttpdとApacheの両方をhttpサーバーのリファレンスに使っていた。Win32::ClipboardのモジュールをCGIに使ったときに、Apacheではうまく動かなかったので(というか、うまく動かせなかったので)、Anhttpdを最終的に使わせていただくことにした経緯がある。

Anhttpdでは、ArrangeNoteにOLEオートメーションでアクセスできなかったが、山本幸一さんの指導であっさりとApacheで動いてしまった。無論、jperl(5.005_03, ActivePerl522 SJIS Windows版)で動いたので、ここで、Anhttpdのデータフォルダ構成のまま、Apacheで動かす設定を紹介しておこう。

Apache のインストール

新規にインストールする場合には次の手順に従ってインストールすればよい。既にインストールしている場合には、まず元のバージョンをプログラムの追加と削除を使って削除し、それから新しいバージョンをインストールする。現状の設定ファイルhttpd.conf は削除されずに残り、新しいhttpd.conf はhttpd.default.conf で保存される。

httpd.conf の設定

httpd.conf の設定の仕方をAnhttpd とディレクトリを共有する場合を例にとって、説明しておく( このようにしておけば、Anhttpd とApache を切り替えてCGI等の動作を試すことができる) 。ディレクトリの構成は「実践実用Perl」に従う。httpd.confのデフォルトから次のように変更する。

① DocumentRoot の変更

ServerRoot "C:/Program Files/Apache Group/Apache2"

ServerRootはインストールしたディレクトリそのままでOK である。

DocumentRoot "C:/Program Files/Apache Group/Apache2/htdocs"

DocumentRoot はHTML文書を格納するディレクトリで、index.html 等を入れる。

DocumentRoot "C:/anhttpd/htdocs"

のように変更する。

<Directory "C:/Program Files/Apache Group/Apache2/htdocs">

この行も合わせて次のように変更する。

<Directory "C:/anhttpd/htdocs">
Options Indexes FollowSymLinks
AllowOverride None
Deny from all
Allow from 127.0.0.1
Order deny,allow
</Directory>

② CGIの格納フォルダの変更

ScriptAlias /cgi-bin/ "C:/Program Files/Apache Group/Apache2/cgi-bin/"

/cgi-bin/の指すディレクトリも次のように書きなおす。

ScriptAlias /cgi-bin/ "C:/anhttpd/cgi-bin/"
<Directory "C:/Program Files/Apache Group/Apache2/cgi-bin">

この行も合わせて次のように変更する。

<Directory "C:/anhttpd/cgi-bin">
AllowOverride None
Options None
Deny from all
Allow from 127.0.0.1
Order deny,allow
</Directory>

③ 文字コードの変更

使用する文字コードを次のように変更する。(これは2.0.54には設定がなかったが付加した。)

AddDefaultCharset ISO-8859-1

ISO-8859-1 から、shift_jisに変更する。

AddDefaultCharset shift_jis

④ システム環境変数を読み取れるように設定する

最後に、CGIに必要なシステム環境変数を読み取れるように設定する。Anhttpd ではシステム環境変数を自動的に読み取るが、Apache では設定が必要になる。PassEnv ディレクティブを使う。システム環境変数DOCROOT、USERDIRとCGIDIR を読み取れるように次のような行をhttpd.conf に付け加える。

PassEnv DOCROOT USERDIR CGIDIR

のように、PassEnv の後に、環境変数を半角空白で区切って並べればよい。これで準備完了である。

更新: 2006-06-07T20:34:12+09:00(JST)

DocumentRootとcgi-binのDirectoryの設定が、読者の環境によってはセキュリティ上問題があるので、ローカルサーバーにそのローカルマシンからしかアクセスできないように変更した。

[詩歌] 夏への扉

初蝉の命眩しく覚えけり

梅雨明けの発表があった。昨日の夕方はまだ巻雲や高積雲が上空に広がっていて、前線の境界を知らせていたが、とうとう通り過ぎたか。この句も昨日のもの。

[PlayStation] PlayStation 3 最新情報

PlayStation 3のデモが国内初披露--リアルな映像描写を追求 - CNET Japanネタ。新たに進んだ情報はない。まだ、現状のCellは2.4GHzだ。

PS3は高いらしい。コンピュータなのだから、コンピュータ並みの価格でもおかしくはないが、キラーアプリは何なのだろう。OSが単なるLinuxでは、WindowsやMacと戦えないだろう。今後の展開が楽しみである。[Added: 2005-07-23]

[更新履歴] マンスリーインデックス正式搭載と日記先頭後尾へのリンク

最近は毎月の日記が上下にずいぶん長くなっているので、インターフェースを改良したいと日付-記事番号のリンクから各記事のタイトルを表示して、各記事にアクセスする仕組みを考えたが、一覧性にかけるので、結局使いにくい。更新日記のマンスリーインデックスは、日付とタイトルとカテゴリを一覧でき、実用的に使えそうなので、正式に搭載することにした。それに加えて記事の先頭と後尾へのリンクを作り、マンスリーインデックスと並べて、サービスすることにする。だいぶ使いやすくなった。自画自賛。

今日の「実践実用Perl」更新日記関連のインターフェース。マンスリーインデックス生成用のCGIを新たにセットしている。

jpg/myhome_2005-07-02.jpgマイホーム

[更新履歴] Semantic Readingとrss2html.cgiのPodcast対応版

セマンティック・リーディングのページを作った。RSSを持たないサイトのRSSをCGI出力するセマンティック・リーダーを紹介するページである。自作のリーダーをご連絡いただければ、このページで紹介していきたいと思う。セマンティック・リーダーは「実践実用Perl」ではRSSエージェントと名前を付けていたが、適当な名前ではないと感じていた。Semantic Scrapingという用語をPiggy Bankのページで見て、これはSemantic Readingとするほうが意義を正しく伝えており、Scraperより品が良く、正確な用語として、Semantic Readerと呼ぶことにした。

rss2html.cgiの一応のPodcast対応版を載せておく。"[Perl] 「実践実用Perl」講座 (ⅩⅡ) - hTunesの迷走"の話からは進展していないが(^^;)"hTunes - Yet Another iTunes"参照。

[更新履歴] hTunesを利用するために

Podcast対応版rss2html.cgi利用の注意事項と推奨Podcastリストを掲載。→hTunes

[Scripting] REXX

japan.linux.com | LinuxにRexxが必要な理由ネタ。

昔から名前は知っているが、実際に使える言語として目の前に登場したことはないREXX。Perlよりも簡単なスクリプト言語だということらしいが、Perl、Python、Ruby、Tcl/Tkがすべて確実に使えるようになった今、無暗に追いかける気にはならない。Perlもオブジェクト指向というようなこと言い始めてから、柔軟であるが故に様々な記法が混在して複雑に見えるようになった。手続き指向型言語として使えば極めてシンプルな言語なのに。

[Search] 出現頻度の低いキーワード - 売り上げの少ない本

「グーグルで探せない生情報が見つかる」--テクノラティを開発した理由 - CNET Japanネタ。

アマゾンの売り上げの重要な部分は町の書店にない本の売り上げなんだそうだ。ランクは低い(一般には関心度は低い)がある特定の人々には関心の高い情報を提供しようというサービスがあってもよい。ベストセラーではなくてロングセラーを探し出して販売するのもよいかもしれない。


[SF] ダニールとの賭け

デイヴィッド・ブリン著、矢口悟訳、新銀河帝国興亡史3「ファウンデーションの勝利」下、ハヤカワ文庫SF1483(ア-1-106)、319ページ、680円。銀河暦-10,495年、ついに読了。

わたしが正しければ、「銀河百科事典」は・・・われわれの子孫によって・・・受け継がれていくはずだ。それが、ファウンデーションの将来だ。


デイヴィッド・ブリンはいろいろと謎を残した。新新銀河帝国興亡史がいずれ書かれるのかもしれない。次作ではサイボーグや時間旅行が題材となるだろう。[Revised and added: 2005-07-09]

[VMware] VMware仮想マシンからホストのフォルダを覗く方法

TSNETで話題になったので、本気になって調べた。VMwareとの付き合いは随分長いけど、時々思い出したように使うだけなので、一向に習熟しない。最近は随分使いやすくなったし、機能も充実している。VMware Workstation 5には、Shared Foldersという仕組みがある。VM→Settings→Options→Shared Foldersでアクセスできる。仮想マシンにおけるフォルダ名とそれに対応させるホストのフォルダを指定するだけ。Linux仮想マシンから、ホストの共有フォルダに、/mnt/hgfs/仮想マシンのフォルダ名 でアクセスできる。ホストも仮想マシンもWindows同士なら、ドラグアンドドロップも使えるらしい。

[Web Development] インターネット時代のアプリケーションプラットフォーム - プラウザ

Google Mapsエンジニアが提言:「ブラウザを極限まで利用しよう」 - CNET Japanの記事の内容は、私がこれまで述べてきたことと同じことである。アプリケーションはブラウザをプラットフォームとするか、ブラウザとの連携を考えるべきということである。今後は孤立したアプリケーションが生き残ることは難しいだろう。

さて、次はAjaxの活用だが、山本さんに話しながら随分勉強させてもらった。やはり単なるテキスト処理屋と本物のプログラマーでは理解のスピードがぜんぜん違う。

Ajaxは現在のブラウザごとの違いはあるようだが、共通に実現できる技術のようだし、使わない手はない。