Jun 30, 2005

Tagwire Plugin

Tagwire Plugin (aka AllKeywords Plugin)は、Movable Typeのエントリーのキーワード部分を使ったタグハンドリングを実現するプラグインです。目的を同じくするTags Plugin、Tagslite Pluginと比較すると、以下の特徴を持っています:

  • 多言語タグのサポート
  • 柔軟なタグ形式のサポート
  • カテゴリーを使わない実現: Tagwireはエントリーのキーワード部分だけを使用します。カテゴリーは本来の目的で利用できます。
  • full-fledgedなタグハンドリング機能: 利用されているタグやその個数をリストアップする機能、指定したタグにマッチするエントリーをリストアップする機能、類似度が高い(現在のエントリーとマッチするタグの数が多い)エントリーをリストアップする機能などが利用できます。
  • 実用に堪える再構築時間: カテゴリーを使用しないトレードオフとして、Tagwire Pluginはタグ情報のインデクシングをDB支援なしで実現しますが、PluginDataやRequest Cacheの活用によって十分な再構築速度を達成しています。
  • MT-XSearchとの連携による動的タグアーカイブ: 静的にタグアーカイブを生成しない代わりに、MT-XSearchと連携して動的なタグアーカイブの生成を支援します。タグアーカイブの再構築コストがかからず、また複数のタグを含むエントリーを抽出することもできます。

詳細は以下を参照ください。

Tagwire_Plugin - ogawa - Google Code

Jun 29, 2005

Dynamic Tag Archiving with Tagwire and MT-XSearch

Instead of static tag/category archives supported by Tags Plugin, Tagwire provides Dynamic Tag Archiving by using Tim Appnel's MT-XSearch. Dynamic Tag Archiving is slower than static one but preferable to support more flexible archiving. For example, Tagwire supports listing entries having two or more tags.

In this article, I will explain how Tagwire plugin cooperates with Tim Appnel's MT-XSearch and realize Dynamic Tag Archiving.

How to setup

Now assume that you've already installed Tagwire plugin.

  1. Install MT-XSearch:
    First, download mt-plus-1.01.zip from Download mt-plus | Appnel Internet Solutions. And unpack it and copy/upload the following files into your Movable Type directory.
    • mt-xsearch.cgi (this file should be executable)
    • plugins/mt-xsearch.pl
    • extlib/MT/XSearch.pm
  2. Modify mt-xsearch.cgi and plugins/mt-xsearch.pl a little. These are for multilingual support and bug fix, and they may be included in the future releases of MT-Plus/MT-XSearch.
    --- mt-xsearch.cgi.bak Fri Aug 27 12:06:24 2004
    +++ mt-xsearch.cgi Sat Jun 11 02:58:33 2005
    @@ -41,7 +41,8 @@
         $ctx->stash('CGI',$q);
         my $out = $tmpl->build($ctx)
             or die "Building search template failed: ".$tmpl->errstr;
    -    print $q->header.$out;
    +    my $charset = $mt->{cfg}->PublishCharset;
    +    print $q->header(-charset=>$charset).$out;
     };
     if ($@) {
         print "Content-Type: text/html\n\n";
    
    --- plugins/mt-xsearch.pl.bak Sat May 14 06:01:19 2005
    +++ plugins/mt-xsearch.pl Sat Jun 11 00:31:39 2005
    @@ -63,7 +63,7 @@
         my $pages = $limit ? ($count-($count % $limit)) / $limit : 1;
         $pages += ($limit && $count % $limit) ? 1 : 0;
         my $offset = $xsearch->args->{offset} || 0;
    -    my $current = $offset / $limit + 1;
    +    my $current = $limit ? ($offset / $limit + 1) : 1;
         $ctx->stash('MT::XSearch::current_page',$current);
         $ctx->stash('MT::XSearch::pages',$pages);
         my $builder = $ctx->stash('builder');
    
  3. Create a template module named "XSearch Tagwire" (other name is not permitted):
    <html>
    <body>
    <form method="get" action="<$MTCGIPath$>mt-xsearch.cgi">
    <input type="hidden" name="blog_id" value="<$MTBlogID$>" />
    <input type="hidden" name="search_key" value="Tagwire" />
    <label for="search" accesskey="4">Search this site:</label>
    <input id="search" name="search" size="20" value="<$MTSearchString decode_url="1" encode_html="1"$>" />
    <input type="submit" value="Search" />
    </form>
     
    <MTSearchResults>
    <MTSearchHeader>
    Results found: <$MTSearchResultCount$> 
    <ol>
    </MTSearchHeader>
    <li><a href="<$MTEntryLink$>"><$MTEntryTitle$></a></li>
    <MTSearchFooter>
    </ol>
    <p>Searched on: <em><$MTSearchString decode_url="1"$></em></p>
    </MTSearchFooter>
    </MTSearchResults>
    <MTNoSearch><p>No search performed.</p></MTNoSearch>
    <MTNoSearchResults><p>Nothing found.</p></MTNoSearchResults>
     
    </body>
    </html>
    
    This template can be customized as you like.

Usage

Tag Search Form:

To create tag search form, simply add the following code to your index/archive templates:

<form method="get" action="<$MTCGIPath$>mt-xsearch.cgi">
<input type="hidden" name="blog_id" value="<$MTBlogID$>" />
<input type="hidden" name="search_key" value="Tagwire" />
<label for="search" accesskey="4">Search this site:</label>
<input id="search" name="search" size="20" value="<$MTSearchString decode_url="1" encode_html="1"$>" />
<input type="submit" value="Search" />
</form>

Tag Archive Links:

To generate directly tag archive links instead of forms, you can write as like follows:

<MTEntryTags glue=", ">
<a href="<$MTCGIPath$>mt-xsearch.cgi?blog_id=<$MTBlogID$>&search_key=Tagwire&search=<$MTTag encode_url="1"$>"><$MTTag$></a>
</MTEntryTags>

Smarter Tag Archive Links:

To realize smarter representation of the tag archive URL such as "http://my.host.tld/tag/Tag", add the following to your .htaccess:

RewriteEngine on
RewriteRule ^tag/(.*) /mt/mt-xsearch.cgi?blog_id=1&search_key=Tagwire&search=$1 [QSA,L]

Once the above setting complete, you need only to write as follows:

<MTEntryTags glue=", ">
<a href="<$MTBlogURL$>tag/<$MTTag encode_url="1"$>"><$MTTag$></a>
</MTEntryTags>

Options

The following options can be added as hidden input fields of the Tag Search Form or as query strings of the Tag Archive Links:

blog_id (REQUIRED)
A blog ID.
search_key (REQUIRED)
Must be set to "Tagwire" for tag search.
search (REQUIRED)
An URL-encoded search string. You can specify one or more tags separated by the delimiter character. When you specify two or more tags, MT-XSearch generates the list of entries with all these tags. And the default delimiter is a whitespace, which should be represented as "%20" or "+" in a URL-encoded string. So if you specify "movable+type" as the search string and omit the delimiter option, MT-XSearch generates the list of entries having both of "movable" and "type" tags.
delimiter
Sets the delimiter character for the search string. For example, if you set "movable,type" as the search string and "," as the delimiter, MT-XSearch generates the list of entries having both of "movable" and "type" tags.
case_sensitive [0 | 1]
Chooses whether the plugin treats tags as the case-sensitive manner or not. The default is case_sensitive="1".
sort_order [ascend | descend]
Chooses the sorting order. The default sort_order is "descend".

Advanced Issue: CGI::Cache enabled MT-XSearch

The above mentioned method is not so a fast solution. Because, everytime you access tag archives, it invokes CGI process and retrieves the tag information from the DB engine and then generates the result page.

But, generally saying, the tag information is not so often added or modified. In short, by caching pages and suppressing page transfers, we make it possible to reduce the overhead of dynamic tag archives effectively.

Based on this observation, I introduce a speedup method for Tagwire/MT-XSearch, with enabling CGI::Cache module. CGI::Cache enabled MT-XSearch can cache the result pages for a fixed period (e.g, 1 hour) and return the pages to the clients with the Last-Modified HTTP Header (the cached time may be preferable).

To realize CGI::Cache enabled MT-XSearch, install CGI::Cache module from CPAN, and modify mt-xsearch.cgi as follows:

--- mt-xsearch.cgi.bak Fri Aug 27 12:06:24 2004
+++ mt-xsearch.cgi Sat Jun 11 03:44:32 2005
@@ -17,6 +17,7 @@
 }
 
 use CGI;
+use CGI::Cache;
 use MT;
 use MT::ConfigMgr;
 use MT::Template;
@@ -27,10 +28,13 @@
     my $mt = MT->new( Config => $MT_DIR . 'mt.cfg', Directory => $MT_DIR )
         or die MT->errstr;
     my $q = new CGI;
+    CGI::Cache::setup({ cache_options => { cache_root => './cache', default_expires_in => 3600 } });
     my $blog_id = $q->param('blog_id') or
         die "Missing parameter blog_id";
     my $key = $q->param('search_key') or
         die "Missing parameter key";
+    CGI::Cache::set_key($q->Vars);
+    CGI::Cache::start() or exit;
     my $search = MT::XSearch->execute($q);
     my $tmpl = MT::Template->load( { 
                         name=>'XSearch '.$key, 
@@ -41,7 +45,14 @@
     $ctx->stash('CGI',$q);
     my $out = $tmpl->build($ctx)
         or die "Building search template failed: ".$tmpl->errstr;
-    print $q->header.$out;
+    my $charset = $mt->{cfg}->PublishCharset;
+    my @m = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
+    my @w = qw(Sun Mon Tue Wed Thu Fri Sat);
+    my ($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime(time);
+    my $now = sprintf("%3s, %02d %3s %04d %02d:%02d:%02d GMT",
+        $w[$wday], $mday, $m[$mon], $year+1900, $hour, $min, $sec);
+    print $q->header(-charset=>$charset,-Last_Modified=>$now).$out;
+    CGI::Cache::stop();
 };
 if ($@) {
     print "Content-Type: text/html\n\n";

Underlines mean the cache directory and the cache lifetime by seconds. In the above example, the directory is "./cache" and the lifetime is 3600 secs(1 hour).

Technoratiで嵌っている件について。

Technoratiは英語版日本語版でデータを共有しているらしく、英語版で作ったアカウントが日本語版でも有効です。しかし一部のデータはそうでもなかったらしく、英語版でclaimしてある私の2つのブログが日本語版では不完全にしか表示されませんでした。具体的にはclaimしてあるブログが2つあるという情報は表示されるが、その内容は表示されないという現象が観測されました。

しかたがないので一旦unclaimしてからclaimし直そうとしたのですが、今度は逆にclaimできなくなってしまいました。

どうしてこうなったのか少し考えてみると、Technorati英語版の旧インタフェースではclaimする方法として、(1)ブログに認証コードを含むリンクもしくはJavascriptを貼り付ける方法と、(2)XMLRPCインタフェースを使って簡易認証する方法、の2つが用意されており、2つのブログをclaimする際には後者の方法を使いました。一方で、今月になってリリースされた新インタフェースでは前者しか用意されていません。

つまり、(a)日本語版には(2)の方法で登録した情報が正しく引き継がれておらず、かつ(b)そのブログをunclaimしてもTechnoratiには(2)の方法で登録したsubscription情報を正しく削除できないという不具合がある、という現象があるように推測されるわけです。

とりあえずクレームのメールは送ったのでじっと返答待ち状態です。

2005-07-06追記:サポートからというか、Niall Kennedyからメールがやってきてリセットしてくれた模様。再度claimし直して今度は問題なし。

Jun 27, 2005

新生銀行の取引レポートがPDFでダウンロードできる

プレスリリースでは見かけた覚えがないのですが、いつの間にやら新生銀行の取引レポートがオンラインでPDF形式(中身は郵送されてくるものと内容は同じ)でダウンロードできるようになっていました、しかも2004年1月分から。単に私が気が付いていなかっただけなのでしょうか。

しかし、これは本当に助かります。基本的に取引レポートは毎月ぶ厚い再生紙で送られてくるのですが、これをいつ処分したものかというのが悩みの種でした。私はだいたい一年分くらい保管してExpireしたものからシュレッダにかけるという戦略を採っていましたが、これからはもっと単純で、コストの低廉な戦略を採ることが可能になります。つまりそれは、

開封した瞬間にシュレッダにかける

です。

ともあれ、これはおそらく「取引レポートの郵送を望まない顧客には郵送しない」サービスへの布石でしょうね。

Jun 23, 2005

Tagwire Pluginの予告

下記エントリーでも微妙に予告してきました通り、Movable Typeにタグ管理機能を追加するプラグインの高速化を行っています。

Ogawa::Buzz: AllKeywords Plugin vs. Tags Plugin

あらかた動作するものができたのでそろそろ公開する予定ですが、CI的にTagという単語が入っていない「AllKeywords」という名前での普及は限界があるような気がするので、新たに「Tagwire Plugin」という名前を与えることにしました。この変更によって使用感はほとんど変化しませんが、MT-XSearchと連携させている方はテンプレート名などに修正が必要になります。

Tagwire Plugin(AllKeywords Plugin)の特徴は以下の通りです。

  • 日本語タグをサポートしています。残念ながらTags Pluginでは使えません。
  • 柔軟なタグ形式を扱えます。
  • カテゴリーを汚しません。エントリーのキーワード部分だけを使用するため、カテゴリーは本来の利用方法ができます。
  • full-fledgedなタグハンドリング機能を提供します。利用されているタグやその個数をリストアップする機能、指定したタグにマッチするエントリーをリストアップする機能、類似度が高い(現在のエントリーとマッチするタグの数が多い)エントリーをリストアップする機能などが利用できます。
  • 静的にタグアーカイブを生成しない代わりに、MT-XSearchと連携して動的なタグアーカイブの生成をサポートします。タグアーカイブの再構築コストがかからず、また複数のタグを含むエントリーを抽出することもできます。

Tagwire Pluginでの改善点は以下の通りです。

  • タグの入力形式を自然かつ柔軟にしました。
    はてなのように"["、"]"で囲んだ文字列、シングルクォート・ダブルクォートで囲んだ文字列、「,|;」で区切られた文字列、空白で区切られた文字列をタグとして認識するようになります。これに伴い、MTAllKeywords, MTEntryAllKeywordsのdelimiterオプションは廃止されます。
  • 高速化その1。
    エントリーの保存時にPluginDataとしてタグのインデックス情報を生成・保存します。再構築時にはこの情報を参照することで効率を改善します。
  • 高速化その2。
    PluginDataから取得したインデックス情報(PluginDataが使えない場合はDBデータから生成したインデックス情報)をプラグイン内でキャッシュし、複数のTagwireのタグ、複数のテンプレートで再利用することで効率を大幅に改善します。

さてどのくらい高速化されたのかが一番の関心事だと思います。結論から言うと、このブログを「すべて再構築」するのにかかる時間が190秒から96秒に短縮(゚□゚)されました。2倍に高速化されたというよりむしろ今までタグの処理だけで再構築時間の半分以上を使っていたという驚愕の事実!! 比較してはいませんがTags Pluginと比較しても悪くない速度になっていると思いますので、リリースにご期待ください。

とりあえず開発版: http://ogawa.googlecode.com/svn/trunk/tagwire/

2005-06-28追記: 英語ブログではリリースしてあります。日本語のドキュメント書きが遅れているので少々お待ちください。英語ブログではなぜかドイツ人から集中的にコメントとトラックバックがやってきています。

2005-07-01追記: というわけで日本語のブログでも公開しました。下記のエントリーをご参照ください。

Jun 20, 2005

Buffalo WER-AMG54

正月に自宅の無線LANアクセスポイントを買い換えたばかりなのですが(Ogawa::Buzz: I-O DATA WN-G54/R2)、メルコのアクセスポイントに買い換え直しました。

私の使っているPCはいまだにIEEE802.11b、奥の人のPCはa/b/gなのですが、私の使っているI-O DATAのWN-G54/R2は、IEEE802.11 b/g混在環境でb側の接続をぷっつんぷっつん切ってくれるのです。正直一時間に一度切れるだけでも作業効率は半分以下に低下します。ファームウェアをアップデートしても状況は変わりません。私の使っている機材は多分初期ロットですからその後のロットで改善されている可能性は大ですが、少なくとも私にとっては安物買いの銭失い以外の何物でもありません。

とっとと修理に出したいところですが、小川家は完全に無線LANに依存しているので代替手段を確保しなければならないのと、正直I-O DATAという会社への不信感もあり、新調することにしました(よくもここまで辛抱したものです)。

WER-AMG54 IEEE802.11a/g切替 無線ルータ
WER-AMG54 IEEE802.11a/g切替 無線ルータ
無線LAN|WER-AMG54

当たり前のこととは言え、超安定しているんですけど。

ところでこの機種は世界標準の方のIEEE 802.11aに対応しています(BUFFALO|世界標準11a)。2005年5月16日の電波法改正で従来の11aから10MHz帯域がシフトしまったため、従来の11aインタフェースを持つPCとは相互に通信できません。PC側がファームウェアのアップデートなどで対応できればよいのですが、まあそういうわけにも行かないでしょう。11gを使って普通に通信できているのなら旧11aから新11aへの移行の動機がありませんから、11aの真っ当な普及がさらに遅れることは確実です。普及するより802.11nの標準化・製品化の方が早いような気がしますね。

I-O DATAのやつは修理に出してから実家にでも導入する予定。

Jun 14, 2005

Musical Baton

グリプラのyosshiさんからMusical Batonが来たのでお答えします。

Total volume of music files on my computer / 今パソコンに入ってる音楽ファイルの容量

1G (サーバーに格納+ほとんどインターネットラジオしか聴いていない)

The last CD I bought / 最後に買ったCD

近所の中古屋で買った3枚:

Song playing right now / 今聴いている曲

Five songs(tunes) I listen to a lot, or that mean a lot to me / よく聴く曲、または自分にとって特に思い入れのある5曲

割に無茶苦茶な聴き方をし、かつ思い入れもないです。プログラミングなど意図的に集中力を下げたいときには以下のインターネットラジオ局を聴いています。

と言っていても埒があかないので各ジャンルから適当に抜粋。

*1 ちなみに生まれて初めて買ったCDはPrinceの1999でした。1983年の盤ですからほとんどコンパクトディスクの黎明期ですね。

続いて惜しくも次点になった方々。

5人の方々へバトンをお渡しします。

5人は多いです。あっという間に地球を覆ってしまいます。しかし、ルールらしいのでみなさまよろしくお願いいたします。

2005-06-30追記:
Musical Baton騒ぎは収束した模様ですが、「きっかけはー、マーケットアナリスト!」「Musical Batonは違法コピーの証拠」「Musical Batonはトラフィックに負担をかける」みたいな電波が出てきて、香ばしさを愉しんでいる昨今です。

hxxk.jp - Musical Baton がいかに危険でいかに迷惑かという話

そういう記事へのリンクこそトラフィックの無駄になりますから私はリンクはしません(真琴さんの上記記事から辿ってください)が、反証不可能な命題とか「完璧な○○はない」とかそういう論に耳を傾ける意味はまったくないと思いますね。特にマーケティング云々に関しては噴飯ものでした。ブログで得られるのは所詮ニッチな嗜好でしかなく、むしろそういう嗜好はそのコミュニティ内で十分効率良くマーケティングされている状態にあるのだし、マクロな嗜好ならそれこそ腐るほどデータがあります。

一方で私はBatonの2つ目の質問「最後に買ったCD」を明確に答えられない人が結構いるという点が興味深いと思いました。いえ「コピーしてるだろ」と言いたいわけではないのです。

CDを私は何だかんだで500枚くらい保有していると思いますが、何回かに分けて同数くらい処分しています。レコードもいくらか保有していますが、やはり過去に200枚くらいまとめて処分しています。何が言いたいかというとCD・レコードのような媒体に全面的に頼った場合(仮に中古市場が効率良く回転したにしても)個人が保有しうる音源の量に比較的低い上限が設けられるということです。だから何年か前からオムニバス盤が流行したのだし、物理的に飽和状態に近い私がかつてのように年間100枚以上買うことはもうないわけです。

つまり、多くの人が私と同じようにそうそうCDを買う状況にない、「最後に買ったCD」が明確でない(もう思い出せないくらいな)のはそうした状況の反映なのではと思えなくもないでしょう、「コピーしている」と言うよりはむしろ。

これでは確かに媒体の販売がはかばかしくないのも頷けるわな、と。CDのときのように異なる物理媒体を導入して買い替え需要を喚起するか物理的制約のない電子媒体に移行せざるを得んわな、と。わざと「コピーで販売が低迷している」の真逆の分析をすることもできるわな、と。

Jun 11, 2005

AllKeywords Plugin vs. Tags Plugin

Tags Pluginの登場で立場が微妙になったと電気街でも噂(うそ)のAllKeywords Pluginの作者です。

AllKeywords PluginもTags Pluginもエントリーのキーワード領域にタグを設定するのは共通ですから相互に互換性があります。後者はエントリーの保存時にキーワード領域をパーズして必要なら新規カテゴリーを作成する、前者は後者にない便利機能を一部持っているというだけの違いです。好みに応じて一方または両方を使えばよいのではないでしょうか。

私もTags Pluginと同様、タグアーカイブをカテゴリーアーカイブとして作るという方針も当然考えました。タグのリスティングが効率良くできますし、一旦タグアーカイブを生成してしまえばブラウズ時のオーバーヘッドは最小化できるというメリットがあります。一方で、カテゴリーと併用できない、タグ(カテゴリー)アーカイブの再構築に無闇に時間がかかるようになる(これはカテゴリーアーカイブをダイナミック・パブリッシングにすることによって無視できる)、合成タグ(タグとタグの論理積)が使えない、などといったデメリットがあります。

また、特に日本語でタグ付けする場合にはカテゴリーの名前が無意味なものになります(dirifyすると空になってしまいますから)。私自身は英語でしかタグ付けしませんが、少なからぬ需要があるのは確かでしょう。タグをURL encodeしたアーカイブを作って...とかいろいろ考えましたが結局のところ却下しました。ちなみにTags Pluginの現状の実装ではそもそも日本語タグはタグとして認識されないようになっているのでこうした点で悩む必要はありません。それもなんだかなあという話ですが。またタグを一旦追加した後で削除するとカテゴリーの残骸が残ると思われます。

AllKeywords Pluginではカテゴリーアーカイブを使わず、MT-XSearch(mt-plusに含まれる)を使って動的にタグアーカイブを生成することを前提にしています。

Ogawa::Buzz: AllKeywords Plugin とMT-XSearchの連携

したがってカテゴリーと共存でき、アーカイブを静的に生成するコストはなく、日本語タグも扱えます。一方でタグ自体をインデックスするDBを持ちませんから、タグをリスティングしたり、動的にタグアーカイブを生成したりする速度はいまいちです。後者に関しては、上記エントリーの「高速化の方法」でも紹介しているように、CGI::Cacheなどを使って妥当な速度で動作させることができます。また前者に関しても将来のバージョンでは改善を図る予定です。

AllKeywords PluginはTagwire Pluginに開発が引き継がれました。下記のエントリーをご参照ください。

Jun 9, 2005

CCLicense Plugin

Creative Commons License(CCL)のURLや画像をバージョンに応じて変更するプラグインをやっつけで作ったので公開します。

CCLicense_Plugin - ogawa - Google Code

CCLicense Pluginはプログラム本体への修正なしに著作者が望むCommons Deedを表示するためのプラグインです。このプラグインをインストールして再構築するだけでMTBlogCCLicenseURL, MTBlogCCLicenseImage, MTCCLicenseRDFタグの出力内容がバージョンに応じたものになります。

Jun 5, 2005

玄そば 東風@三軒茶屋

三軒茶屋病院の裏手(246の裏道)に3月頃できていた蕎麦屋「東風(こち)」に行ってみた(雀荘ではない)。この近辺にはじゃじゃおいけんのらやもあり、密かにNoodle Districtを形成しつつある。ただ駅からのアクセスは良くないので人通りはまばら。

東風は、西麻布っぽいあしらいの店構え・内装(コンクリート打ちっ放しと大谷石のコンビネーション+α)に、西麻布っぽい演出の蕎麦という、三軒茶屋にあってはなかなか特徴的なお店。もともとは増田屋という鄙びた蕎麦屋があった場所だが記憶にも残っていないという有様。値段はというと、せいろ・かけが750円、天せいろが1,600円と少々高目だが高いというほどではない。蕎麦は細切りでかつ弾力に富み、つゆは薄くはないが辛過ぎるわけでもない。蕎麦の持つ甘味・風味が分かりやすいのが特徴だと言える。鉄瓶で出てくる蕎麦湯は、葛湯ですか? というくらいどろーりしていて(率直に言ってこれが結構腹の足しになる)、生姜や黒蜜を足してみたくなる。天ぷらはタネ自体は良いものの多少べとり感があり、この点に関してはすぐ近所にある「のらや」(うどん屋)の方に軍配が上がる。

しばらくはこの蕎麦屋を「行きつけ」の蕎麦屋にしようと思う。

Google マップ - 東京都世田谷区三軒茶屋1-21-9

Jun 4, 2005

Google Sitemaps

Google Sitemapsとかっていうサービスが始まったのでこのブログでも対応してみました。以下にテンプレートがあります。

Niall Kennedy's Weblog: Google Sitemaps using Movable Type

このテンプレートをこのまま使う分には問題はないのですが、ただカスタマイズすることを考えるとちょっと注意しなくてはならない点があります。

ひとつはSitemap Protocolを読むと、lastmod要素のタイムスタンプはISO 8601形式(Date and Time Formats)で指定することになっていますが、実際にはISO 8601形式のすべての時刻表現を受け付けてくれるわけではないようです。私の気が付いた限りでは、以下のようにLocal Time + Time Zone offset (2005-06-04T09:24:00+09:00)で指定しようとすると、Google Sitemapsは「Invalid Date」と判定するようです。

<lastmod>
<$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$>
</lastmod>

KennedyのテンプレートにあるようにUTC時間を指定していれば問題ありませんし、Googleが早々にこの問題を解決する可能性があります。

もうひとつは、MTBlogURLに対する更新時間(lastmod)も表示させようと思って以下のように書くと、現在時刻の9時間前の時刻を返してしまう点です。

<url>
<loc><$MTBlogURL encode_xml="1"$></loc>
<lastmod><$MTDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$></lastmod>
<priority>1.0</priority>
</url>

これはMTDateにutc="1"オプションを与えた場合に2回オフセット補正されてしまう(正確にはgmtimeに対してlocaltimeからUTCへの補正を行ってしまう)ために起きます。Local Time Zoneが+09:00の場合には9時間前の時刻になります。例えば時刻が「2005-06-04T21:09:00+09:00」であったとするとそのUTC時刻は「2005-06-04T12:09:00Z」ですが、これを誤って9時間補正して「2005-06-04T03:09:00Z」を返してしまうということです。

この問題はMovable Type日本語版3.17以降では修正されています。

このバグを修正するには以下のパッチを当てる必要があるでしょう。

--- lib/MT/Template/Context.pm.bak	2005-01-13 15:47:37.000000000 +0900
+++ lib/MT/Template/Context.pm	2005-06-04 22:56:13.000000000 +0900
@@ -1444,6 +1444,7 @@
     my @ts;
     if ($args->{utc}) {
 	@ts = gmtime $t;
+	delete $args->{utc};
     } else {
 	@ts = offset_time_list($t, $_[0]->stash('blog_id'));
     }

Jun 3, 2005

Gridable Type構想 (2)

このエントリーではMovable Typeを用いて「グリッドする」ことを目的としたGridable Type構想を紹介する。(2)はGridable Typeの基盤となる「トラックバックパッシングモデル」について議論する。

トラックバックパッシングモデル

Gridable Typeで用いられる代表的なプログラミングモデルであるトラックバックパッシングモデルについてここでは述べる。このモデルは、ブログで用いると不愉快でしかないトラックバックを有効に活用した並列プログラミングモデルである。

メッセージパッシングは分散メモリ型の並列計算機やクラスタ上で広く利用されているが、トラックバックパッシングはほとんど使われていない。よく見かけるのはトラックバックバッシングである。

トラックバックパッシングモデルでは、アプリケーションは自律したプロセスの集合として動作し、各プロセスが独立した記憶域を持つ。このモデルでは、プロセスはトラックバックを受信することで起動し、トラックバックを送信することで他のプロセスと通信する。メッセージパッシングモデルではメッセージを通信する送信側プロセスと受信側プロセスが明示的にメッセージのやり取りを行う必要があるが、トラックバックパッシングモデルではトラックバックの通信は常に新規のプロセスの生成を伴うためこのような必要はない。

トラックバックパッシングモデルのセマンティックスは、並列計算技術におけるActive Messagesのものに類似していると言える。Active Messages同様、トラックバックの受信側メッセージハンドラ(この場合プロセスとほぼ同義)は非同期に実行されなければならない。また、トラックバックのメッセージングもPUT型・GET型の二種類に分類できる。

PUTメッセージ送信時には非同期に起動された受信側ハンドラがメッセージの受信を行い、計算を行う。送信側はブロックする必要はない。GETメッセージ送信時には非同期に起動された受信側ハンドラがメッセージの受信を行い、少量の計算を行い、送信側に戻り値を返す。ただし、送信側が戻り値が返されるまでブロックすると処理が直列化されてしまうので意味がない。

PUT/GETのいずれにしても送信側が別プロセスを起動してバックグラウンドでトラックバックパッシングすることが性能上の要求から望ましい。そのためのコンストラクトとしてMTにはMT::Util::start_background_taskが用意されている。

さらに続きます。そろそろ「ブログを使ってバカ論文を書く」試みであることは伝わっているのだろうか。嘘は書いていないし、普通に実装すればプログラミングシンポジウムくらいなら出せる。「MTのアプリケーション」としては面白い試みかもしれないが、問題は「グリッド技術」としては意味がないことだ。面白いだけでは意味がない。

Jun 1, 2005

Gridable Type構想 (1)

このエントリーではMovable Typeを用いて「グリッドする」ことを目的としたGridable Type構想を紹介する。(1)は導入として概念の説明を行う。

アプリケーションプラットフォームとしてのMovable Type

Movable Typeはユニークなソフトウェアである。利用ユーザー数という意味ではASP型のブログサービスに及ばないが、インストール数という点では他のとは比較にならないほど多いブログシステムである。対象をブログシステムに限らず一般のWebアプリケーションまで広げたとしてもおそらく最大のインストールベースになるであろうと推測される。

このことは、ブログの効用としての「プラットフォーム化」(Permalinkの実現、RSS/Atomによるメタデータサービス、XMLRPCなどによる外部インタフェース)とは異なる意味で、単一のソフトウェアレイヤーによるアプリケーションプラットフォームが広範に実現されていることに他ならない。言い換えると、Apache Web ServerにおいてCGIやPHPが利用可能であるのと同程度に、Movable Typeの提供するアプリケーションスタックが利用可能である、ということである。

このプラットフォームは、ブログを構成する各種オブジェクトを表現するクラスライブラリ(それらを操作するメソッド群を含む)と、それらライブラリを使って実現されている標準アプリケーション群(CMS、Comments、Trackbackなど)からなる*1。また、標準アプリケーションには(自己反映ではないが)自身の振る舞いを拡張あるいは変更するためのPluginインタフェースが用意されている。

例えば、標準アプリケーションの一つであるTrackbackは、基本的には単にショートメッセージを受信して保存する機能しか持たない*2。しかし、Pluginインタフェースを用いて振る舞いをカスタマイズすれば、メッセージに応じて必要な処理を行うアプリケーションとしても利用できる。

*1 無論ライブラリを使って固有のアプリケーションを記述することもできる。

*2 外部からのトラックバックメッセージが「トラックバック」として機能するのは、CMSアプリケーションが保存されたメッセージを読み込んでトラックバックデータとして利用するからである。

グリッド環境としての利用

まず最初にグリッドについて解説しておく。

まず現状認識として「資源はどこにでもあるはずなのになぜか(マーフィー則のように)常に不足する」という現象がある。つまり、広域的に見れば資源の効率的な利用がなされていない状態にある。また費用対効果ということを考えると、ユーザーは実行効率を向上させたい、サービスの利用継続性を維持したいなどといった資源に対するある種の「最適化」効果を期待している。資源保有者は資源の保有コストや追加コストを効果的に避けたいと考えており、コストと資源量が相対的なものであるという事実を勘案すれば、要するに「資源の稼働率を上げたい」と考えている。

これらを全部合わせて「広域的に資源の稼働率を上げて実行効率を上げる」というのがグリッドであり、それを実現したのがグリッド環境であり、実現する技術がグリッド技術である。

ここではMovable Typeを用いて、BerkeleyのSETI@HomeやNTTデータのセル・コンピューティングのように遊休リソースをad hocに統合して利用するグリッド環境「Gridable Type」を実現することを考える。Movable Typeをプラットフォームとして用いることにはメリットがある。Movable Typeのアプリケーションプラットフォームを利用できるという以外、Web Serverであるという性質から次のようなメリットが期待できる:

  • 個人用計算機に比べてネットワークトポロジー上の制約を受けない。つまり、すべての資源が均一なグローバルネットワーク空間上にあるものと見做せる。
  • 個人用計算機に比べてダウンタイムが極めて少ない。したがって長時間に及ぶアプリケーションを実行でき、ダウン時の対処も容易である。
  • 資源の低負荷時間帯をマクロに予測でき、それは概ね正しい。つまり、適切に利用時間帯を定めるだけでスケジューリングできる。

当然ながらPerlによる実行効率とセキュリティという問題は残る。後者は、例えばどこかからコードをダウンロードして中身をevalするだけのプラグインを考えてみれば自明である。

About Me

My Photo

つくばで働く研究者

Total Pageviews

Amazon

Copyright 2012 Ogawa::Buzz | Powered by Blogger
Design by Web2feel | Blogger Template by NewBloggerThemes.com