<?xml version="1.0" encoding="EUC-JP"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en">
<title>NDO::Weblog</title>
<link rel="alternate" type="text/html" href="http://naoya.dyndns.org/~naoya/mt/" />
<modified>2005-07-28T02:33:31Z</modified>
<tagline></tagline>
<id>tag:naoya.dyndns.org,2006:/~naoya/mt//2</id>
<generator url="http://www.movabletype.org/" version="3.01D-ja">Movable Type</generator>
<copyright>Copyright (c) 2005, naoya</copyright>
<entry>
<title>amazlet の文字化け</title>
<link rel="alternate" type="text/html" href="http://naoya.dyndns.org/~naoya/mt/archives/001700.html" />
<modified>2005-07-28T02:33:31Z</modified>
<issued>2005-07-27T23:50:22Z</issued>
<id>tag:naoya.dyndns.org,2005:/~naoya/mt//2.1700</id>
<created>2005-07-27T23:50:22Z</created>
<summary type="text/plain">amazlet を今使うと、画面が文字化けしてしまうようです。

調べてみたところ Amazon Webサービス (ECS3) の応答メッセージ自体が文字化けしているようで、ちょっといかんともしがたい...</summary>
<author>
<name>naoya</name>
<url>http://naoya.dyndns.org/~naoya/mt/</url>
<email>naoya@naoya.dyndns.org</email>
</author>
<dc:subject>amazlet</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://naoya.dyndns.org/~naoya/mt/">
<![CDATA[<p>amazlet を今使うと、画面が文字化けしてしまうようです。</p>

<p>調べてみたところ Amazon Webサービス (ECS3) の<a href="http://xml.amazon.co.jp/onca/xml3?t=naoyadyndnsor-22&dev-t=DM1XQEXM3YQU8&type=lite&mode=books-jp&page=1&locale=jp&f=xml&KeywordSearch=perl">応答メッセージ自体が文字化け</a>しているようで、ちょっといかんともしがたい状況です。先方のシステム復旧待ちです。</p>

<p>15:32 追記: 直りました</p>]]>

</content>
</entry>
<entry>
<title>naoyaのはてなダイアリーに移転</title>
<link rel="alternate" type="text/html" href="http://naoya.dyndns.org/~naoya/mt/archives/001695.html" />
<modified>2005-07-25T13:23:07Z</modified>
<issued>2005-07-08T12:13:55Z</issued>
<id>tag:naoya.dyndns.org,2005:/~naoya/mt//2.1695</id>
<created>2005-07-08T12:13:55Z</created>
<summary type="text/plain">僕のブログですが、naoyaのはてなダイアリーに移転しています。検索に引っかかるということもあるので、このブログはこのまま残しておきます。

いずれ、フィードのURLも301で向こうに飛ばすかもしれま...</summary>
<author>
<name>naoya</name>
<url>http://naoya.dyndns.org/~naoya/mt/</url>
<email>naoya@naoya.dyndns.org</email>
</author>
<dc:subject>ウェブログに関すること</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://naoya.dyndns.org/~naoya/mt/">
<![CDATA[<p>僕のブログですが、<a href="http://d.hatena.ne.jp/naoya/">naoyaのはてなダイアリー</a>に移転しています。検索に引っかかるということもあるので、このブログはこのまま残しておきます。</p>

<p>いずれ、フィードのURLも301で向こうに飛ばすかもしれませんが、とりあえずはフィードは現状維持させておきます。</p>]]>

</content>
</entry>
<entry>
<title>amazlet から在庫状況を削除</title>
<link rel="alternate" type="text/html" href="http://naoya.dyndns.org/~naoya/mt/archives/001694.html" />
<modified>2005-06-19T03:58:45Z</modified>
<issued>2005-06-19T03:56:56Z</issued>
<id>tag:naoya.dyndns.org,2005:/~naoya/mt//2.1694</id>
<created>2005-06-19T03:56:56Z</created>
<summary type="text/plain">ECS 3 で在庫状況の表示 (Availability) に不具合が発生しているらしく (この辺)、在庫状況の表示がおかしかったので、amazlet から在庫状況情報を取り除きました。...</summary>
<author>
<name>naoya</name>
<url>http://naoya.dyndns.org/~naoya/mt/</url>
<email>naoya@naoya.dyndns.org</email>
</author>
<dc:subject>amazlet</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://naoya.dyndns.org/~naoya/mt/">
<![CDATA[<p>ECS 3 で在庫状況の表示 (Availability) に不具合が発生しているらしく (<a href="http://forums.prospero.com/n/mb/message.asp?webtag=am-assocdevxml&msg=8937.1&ctx=4096">この辺</a>)、在庫状況の表示がおかしかったので、amazlet から在庫状況情報を取り除きました。</p>]]>

</content>
</entry>
<entry>
<title>ping の順番</title>
<link rel="alternate" type="text/html" href="http://naoya.dyndns.org/~naoya/mt/archives/001693.html" />
<modified>2005-06-03T09:00:31Z</modified>
<issued>2005-06-03T08:57:17Z</issued>
<id>tag:naoya.dyndns.org,2005:/~naoya/mt//2.1693</id>
<created>2005-06-03T08:57:17Z</created>
<summary type="text/plain">FeedBurner をはさんだ場合、FeedBurner と本チャンの RSS を同期する必要があり、普通に巡回もしてくれるけど weblogUpdates.ping を http://ping.f...</summary>
<author>
<name>naoya</name>
<url>http://naoya.dyndns.org/~naoya/mt/</url>
<email>naoya@naoya.dyndns.org</email>
</author>
<dc:subject>XML</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://naoya.dyndns.org/~naoya/mt/">
<![CDATA[<p>FeedBurner をはさんだ場合、FeedBurner と本チャンの RSS を同期する必要があり、普通に巡回もしてくれるけど weblogUpdates.ping を http://ping.feedburner.com に飛ばすことでリフレッシュタイミングを早めることができる。</p>

<p>一方、はてなRSS は http://r.hatena.ne.jp/xmlrpc に ping することでクロール間隔を早めることができる。</p>

<p>この両者に ping を飛ばす場合、順番に気をつけないと、FeedBurner との同期が完了するまえに巡回君が来てしまう可能性があり、いや〜んなことになる、というのに気付きました。FeedBurner → はてなRSS の順番が正解。</p>

<p>ということでテスト中です。<br />
</p>]]>

</content>
</entry>
<entry>
<title>フィード用 AdSense は map タグ</title>
<link rel="alternate" type="text/html" href="http://naoya.dyndns.org/~naoya/mt/archives/001692.html" />
<modified>2005-06-03T08:46:13Z</modified>
<issued>2005-06-03T08:44:59Z</issued>
<id>tag:naoya.dyndns.org,2005:/~naoya/mt//2.1692</id>
<created>2005-06-03T08:44:59Z</created>
<summary type="text/plain">フィード用 AdSense は map タグを使ってるんですね。map をサニタイズ対象にしてないフィードクライアントってどれぐらいあるんだろうか。...</summary>
<author>
<name>naoya</name>
<url>http://naoya.dyndns.org/~naoya/mt/</url>
<email>naoya@naoya.dyndns.org</email>
</author>
<dc:subject>XML</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://naoya.dyndns.org/~naoya/mt/">
<![CDATA[<p>フィード用 AdSense は map タグを使ってるんですね。map をサニタイズ対象にしてないフィードクライアントってどれぐらいあるんだろうか。</p>]]>

</content>
</entry>
<entry>
<title>FeedBurner</title>
<link rel="alternate" type="text/html" href="http://naoya.dyndns.org/~naoya/mt/archives/001691.html" />
<modified>2005-06-03T06:58:50Z</modified>
<issued>2005-06-03T06:57:14Z</issued>
<id>tag:naoya.dyndns.org,2005:/~naoya/mt//2.1691</id>
<created>2005-06-03T06:57:14Z</created>
<summary type="text/plain">なんとなく、このblogのRSSをFeedBurnerで燃やしてみました。

あ、最近はnaoyaのはてなダイアリーの方をメインに更新していますので、こちらもよろしくお願いします。NDO::Weblo...</summary>
<author>
<name>naoya</name>
<url>http://naoya.dyndns.org/~naoya/mt/</url>
<email>naoya@naoya.dyndns.org</email>
</author>
<dc:subject>XML</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://naoya.dyndns.org/~naoya/mt/">
<![CDATA[<p>なんとなく、このblogのRSSを<a href="http://www.feedburner.com/">FeedBurner</a>で燃やしてみました。</p>

<p>あ、最近は<a href="http://d.hatena.ne.jp/naoya/">naoyaのはてなダイアリー</a>の方をメインに更新していますので、こちらもよろしくお願いします。NDO::Weblogを今後どうするかは検討中。</p>]]>

</content>
</entry>
<entry>
<title>Movable Type 脆弱性の発表は脆弱性ではない、のまとめ。</title>
<link rel="alternate" type="text/html" href="http://naoya.dyndns.org/~naoya/mt/archives/001689.html" />
<modified>2005-05-13T23:03:26Z</modified>
<issued>2005-05-13T23:02:17Z</issued>
<id>tag:naoya.dyndns.org,2005:/~naoya/mt//2.1689</id>
<created>2005-05-13T23:02:17Z</created>
<summary type="text/plain"> [MT][セキュリティ][脆弱性] MTの認証Cookieに関する脆弱性とされているものについて (02:38) - tdiary.ishinao.net (2005-05-14)「【重要】 第三者...</summary>
<author>
<name>naoya</name>
<url>http://naoya.dyndns.org/~naoya/mt/</url>
<email>naoya@naoya.dyndns.org</email>
</author>
<dc:subject>Movable Type</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://naoya.dyndns.org/~naoya/mt/">
<![CDATA[<blockquote><div class="quotetitle"><a title=" [MT][セキュリティ][脆弱性] MTの認証Cookieに関する脆弱性とされているものについて (02:38) - tdiary.ishinao.net (2005-05-14)" href="http://tdiary.ishinao.net/20050514.html#p01"> [MT][セキュリティ][脆弱性] MTの認証Cookieに関する脆弱性とされているものについて (02:38) - tdiary.ishinao.net (2005-05-14)</a></div>「【重要】 第三者による不正アクセスを許す危険性の対策について」で発表された内容について、「Movable Type の脆弱性の件 : NDO::Weblog」のコメント欄あたりでごちゃごちゃ書いていたことをまとめておこう。</blockquote>

<p>ということで、コメントでやりとりしていた話を ishinao さんがまとめています。とてもよくまとまっているので、御一読を。</p>

<p>あと、今回の件でMT に脆弱性が、という記事を書かれた方は、その後のフォローとしてこういった記事も一緒に引用あるいは参照として記載しておくと、周囲の人の理解が正しい方向へ向かうので有益ではないかと思います。</p>]]>

</content>
</entry>
<entry>
<title>Movable Type の脆弱性の件</title>
<link rel="alternate" type="text/html" href="http://naoya.dyndns.org/~naoya/mt/archives/001688.html" />
<modified>2005-05-13T07:53:01Z</modified>
<issued>2005-05-13T04:43:59Z</issued>
<id>tag:naoya.dyndns.org,2005:/~naoya/mt//2.1688</id>
<created>2005-05-13T04:43:59Z</created>
<summary type="text/plain">Movable Type Publishing Platform: 【重要】 第三者による不正アクセスを許す危険性の対策についてMovable Type(ムーバブル・タイプ)の脆弱性により、第三者によ...</summary>
<author>
<name>naoya</name>
<url>http://naoya.dyndns.org/~naoya/mt/</url>
<email>naoya@naoya.dyndns.org</email>
</author>
<dc:subject>Movable Type</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://naoya.dyndns.org/~naoya/mt/">
<![CDATA[<blockquote><div class="quotetitle"><a title="Movable Type Publishing Platform: 【重要】 第三者による不正アクセスを許す危険性の対策について" href="http://www.movabletype.jp/archives/2005/05/post_11.html#more">Movable Type Publishing Platform: 【重要】 第三者による不正アクセスを許す危険性の対策について</a></div>Movable Type(ムーバブル・タイプ)の脆弱性により、第三者による不正なアクセスが可能であることが確認されました。Movable Typeのセッション管理で使われるCookieの値に、ハッシュ化されたユーザーアカウント情報が含まれており、<span style="color: red;">以下の条件を全て満たした場合に、第三者による不正なアクセスが可能になります。</span></blockquote>

<p>というアナウンスが出ていてるのですが、これに関してメディアとか巷の blog で過剰に反応しているものが散見されます。</p>

<p>が、アナウンスで赤字で強調し指摘れてるところを良く読んでからも分かるとおり、これは Movable Type そのものの脆弱性ではないですし、そもそも脆弱性なのかどうかも怪しいという話です。</p>

<blockquote>
第三者が、Cookieの値を取得する。 
</blockquote>

<p>Cookie の値を取得されたら、Movable Type に限らず大概のどんなブログ、どんなツールでも不正アクセスが可能です。(AtomAPIとログインパスワードが..とありますが、実際には Cookie を抜かれたらその Cookie を仕込んで mt.cgi そのものにログインが可能です。)</p>

<p>近頃の一般的なウェブアプリケーションでは Cookie によるログインのセッション保持というのをやるので、Cookie の値そのものがパスワードと同等の役割を持っています。それゆえ、(アプリケーションの欠陥で)Cookie が漏れるような事態は脆弱性と言えるでしょうが、今回の件は Movable Type に Cookie 漏洩の脆弱性が見つかったわけではないです。</p>

<p>Cookie を抜かれないために http から https にするとか、それはもう Movable Type の問題ではなくそのシステムを個人としてどうするかという問題ですね。</p>

<p>技術について詳しくない個人の方はともかくとして、メディアの人はもう少し考察してから記事を書くなりなんなりした方がよいんじゃないでしょうか。</p>

<p>追記</p>

<p>mt.cfg を隠さないとやばい、見たいな話にもなっています。確かに人に見せるような代物ではないので見えないように対処を行っておいたほうが良いとは思いますが、これも見えたからといってじゃあそのサイトが何か問題を突かれて云々かというとそういうものではないです。</p>

<p>mt.cgi のパスが知れてしまうと問題、という認識は間違いです。mt.cgi は普通コメントとかトラックバックとかの cgi と同じパスに置かれているのだし、HTML や rsd.xml の中身を見ればそんなものはすぐにでも分かります。そこにアクセスされたら危険というものはアクセスされないように任意の名前で隠せばセキュアという認識が間違っています。(この辺の語りは高木さんの役割かもｗ)</p>

<p>mt.cfg の中には、ログインに必要なパスワードであるとか、DB に接続するためのパスワード、それから Cookie の値を何らかの方法で知るための値が記述されているわけではないので、見られたからってサイトが不正アクセスの被害を被るわけではないのです。</p>

<p>見られたら危険、というものだったらそれを、一般のアクセスからは物理的に見れない場所におく、例えばウェブサーバがハンドリングしていないディレクトリに置くとか、それが適切な対処ですが、mt.cfg はパッケージの中ではウェブに公開される可能性のある領域にもともと置かれています。開発者側の判断は、特に mt.cfg が見られたからといって脆弱性が発生するわけではないという認識の元でしょう。見られたら気持ち悪いファイルではあるので、隠しておくに越したことはない、程度のものです。</p>

<p>この話に関しても Six Apart Japan の文書が誤解を招きやすい表現になっているという点は否めないですけれども。</p>]]>

</content>
</entry>
<entry>
<title>blogWatcher 2.0 / なんでもRSS</title>
<link rel="alternate" type="text/html" href="http://naoya.dyndns.org/~naoya/mt/archives/001686.html" />
<modified>2005-05-09T05:44:36Z</modified>
<issued>2005-05-09T05:44:22Z</issued>
<id>tag:naoya.dyndns.org,2005:/~naoya/mt//2.1686</id>
<created>2005-05-09T05:44:22Z</created>
<summary type="text/plain">blogWatcher開発日誌当初のご案内より少し遅くなってしまいましたが, 本日第2版を公開いたしました.
御利用下さり, これまで同様ご意見を頂ければ幸いです.

東工大の奥村研究室の研究成果であ...</summary>
<author>
<name>naoya</name>
<url>http://naoya.dyndns.org/~naoya/mt/</url>
<email>naoya@naoya.dyndns.org</email>
</author>
<dc:subject>インターネット</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://naoya.dyndns.org/~naoya/mt/">
<![CDATA[<blockquote><div class="quotetitle"><a title="blogWatcher開発日誌" href="http://www.lr.pi.titech.ac.jp/blogwatcher/blog/">blogWatcher開発日誌</a></div>当初のご案内より少し遅くなってしまいましたが, 本日第2版を公開いたしました.
御利用下さり, これまで同様ご意見を頂ければ幸いです.</blockquote>

<p>東工大の奥村研究室の研究成果である blogWatcher、その 2.0 が公開されています。なんというか、内部的に GETA から Lucene に変更されたなどの点もあるものの、外側のインタフェースが改良されていて、2.0 というより別物に近い印象。実用性を考えていろいろ変更したというのがよくわかります。</p>

<p><a href="http://www.lr.pi.titech.ac.jp/blogwatcher/">API</a> があったり (OKUMURANK!) いろいろ面白いのですが、僕個人として一番これはいいと思ったのは、メインの blogWatcher ではなく blogWatcher の研究成果を利用して作られた<a href="http://blogwatcher.pi.titech.ac.jp/nandemorss/index.cgi">なんでもRSS</a>の方ですね。</p>

<p>名前のとおり(日付情報のあるサイトを)なんでもRSSに変換しちゃいますという代物で、ためしに僕が手HTMLで作っていた<a href="http://homepage3.nifty.com/espomax/starcraft/">ゲームサイト（オタい)</a>のURLを突っ込んでみました。</p>

<p>その結果が<a href="http://blogwatcher.pi.titech.ac.jp/nandemorss/index.cgi?url=http%3A%2F%2Fhomepage3.nifty.com%2Fespomax%2Fstarcraft%2F">これ</a>。正直かなりびっくりしました。HTMLをコピペしながら作ったものなので、規則性が若干崩れてるところがあったりするのに、その辺はちゃんと補正してかなり正確に記事を分割してRSSを生成しています。こりゃすげーや。</p>

<p>以前に東工大でblogWatcherのプレゼンを聴かせてもらったときに、その内部で利用しているコンテンツ・フィルタ (ページの日付情報やHTMLの規則性から、そのページがブログかどうかを判定し、かつデータ記事単位に分割するフィルタ) の仕組みを見せてもらって、これでなんでもRSSとか作れそうですねみたいなことをみんなでワイワイ言ってたんですけど、その成果物ですね、素晴らしいです。</p>

<p>早速色々使わせてもらいます。</p>]]>

</content>
</entry>
<entry>
<title>ヒルズ</title>
<link rel="alternate" type="text/html" href="http://naoya.dyndns.org/~naoya/mt/archives/001685.html" />
<modified>2005-05-09T05:36:48Z</modified>
<issued>2005-05-09T05:36:34Z</issued>
<id>tag:naoya.dyndns.org,2005:/~naoya/mt//2.1685</id>
<created>2005-05-09T05:36:34Z</created>
<summary type="text/plain">なんだこりゃ

...</summary>
<author>
<name>naomob</name>
<url>http://naoya.dyndns.org/~naoya/mt/</url>
<email>naoya@hatena.ne.jp</email>
</author>
<dc:subject>moblog</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://naoya.dyndns.org/~naoya/mt/">
<![CDATA[<div class="caption">なんだこりゃ
</div>
<div class="photo"><img src="http://naoya.dyndns.org/~naoya/mt/images/blog-photo-1115617017.66-0.jpg" /></div>]]>

</content>
</entry>
<entry>
<title>Bookmarklet をサーバーサイドでメンテナンス</title>
<link rel="alternate" type="text/html" href="http://naoya.dyndns.org/~naoya/mt/archives/001683.html" />
<modified>2005-05-05T04:03:26Z</modified>
<issued>2005-05-05T04:03:10Z</issued>
<id>tag:naoya.dyndns.org,2005:/~naoya/mt//2.1683</id>
<created>2005-05-05T04:03:10Z</created>
<summary type="text/plain">Bookmarklet を配布するときの悩みの種が、一度配布したコードのメンテナンス。ウェブアプリケーションの一機能として Bookmarklet を使う場合にこの問題は結構厄介です。

例えば、はて...</summary>
<author>
<name>naoya</name>
<url>http://naoya.dyndns.org/~naoya/mt/</url>
<email>naoya@naoya.dyndns.org</email>
</author>
<dc:subject>インターネット</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://naoya.dyndns.org/~naoya/mt/">
<![CDATA[<p>Bookmarklet を配布するときの悩みの種が、一度配布したコードのメンテナンス。ウェブアプリケーションの一機能として Bookmarklet を使う場合にこの問題は結構厄介です。</p>

<p>例えば、<a href="http://b.hatena.ne.jp/">はてなブックマーク</a>は自分のブックマークにブックマークを追加するのに Bookmarklet を使うのですが、何か Bookmarklet の JavaScrpipt のコード側にバグがあったとか、機能を追加したいという場合に毎回アナウンスして Bookmarklet をセットアップし直してもらう必要があります。(今のところ、そういったことはないのですが。) ウェブアプリケーション、というかサーバーサイドアプリケーションの最大のメリットである、徐々に機能を追加していくというフローに、配布型の Bookmarklet の仕組みが合わないんですね。</p>

<p>それが悩ましいので、はてなブックマークの Bookmarklet は、それを実行した先でサーバーサイドのプログラムを呼び出して、そちら側になるべく機能を集中させるようにしています。</p>

<p>が、今日素晴らしい情報を発見。</p>

<blockquote><div class="quotetitle"><a title="川o・-・）＜2nd life - bookmarkletの文字数制限を無くす" href="http://d.hatena.ne.jp/secondlife/20050503/1115085179">川o・-・）＜2nd life - bookmarkletの文字数制限を無くす</a></div>bookmarkletを作るとき、IEでは500文字ちょい、Firefoxでは2000文字ぐらい(?)の文字数制限がある。また、作った後に一行にまとめたり、デバッグしたりも大変面倒。でもそれがとても簡単な方法でどうにでもなることをインターフェイス！インターフェイス！の人に教わった。</blockquote>

<p>表題は文字数制限をなくす、ということなのですが、実際のコードは document.createElement で script エレメントを作ってやってそこで src で外部ファイルを読むようにしてやるというもの。</p>

<p>この方法を使えば、JavaScript のコードそのものをサーバー側に置いた Bookmarklet が作れます。素晴らしい。<br />
</p>]]>

</content>
</entry>
<entry>
<title>Perl の MVC フレームワーク Catalyst に入門してみた</title>
<link rel="alternate" type="text/html" href="http://naoya.dyndns.org/~naoya/mt/archives/001682.html" />
<modified>2005-05-05T03:09:24Z</modified>
<issued>2005-05-05T02:51:23Z</issued>
<id>tag:naoya.dyndns.org,2005:/~naoya/mt//2.1682</id>
<created>2005-05-05T02:51:23Z</created>
<summary type="text/plain">近頃の Web + DB なアプリケーションは MVC でモデルは O/R マッピング、みたいなアーキテクチャが主流です。その際 MVC フレームワークを使って作るのはいわずもがなですが、最近 Rub...</summary>
<author>
<name>naoya</name>
<url>http://naoya.dyndns.org/~naoya/mt/</url>
<email>naoya@naoya.dyndns.org</email>
</author>
<dc:subject>Perl</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://naoya.dyndns.org/~naoya/mt/">
<![CDATA[<p>近頃の Web + DB なアプリケーションは MVC でモデルは O/R マッピング、みたいなアーキテクチャが主流です。その際 MVC フレームワークを使って作るのはいわずもがなですが、最近 Ruby 界隈(?)では <a href="http://www.rubyonrails.org/">Ruby on Rails</a>、Perl 界隈では <a href="http://search.cpan.org/dist/Catalyst/">Catalyst</a> というのが熱い模様です。Java 界隈では Spring が熱いのかな?</p>

<p>Perl の O/R マッピングのデファクトは多分 Class::DBI で、Class::DBI と相性が良いテンプレートエンジンと言えば Template-Toolkit。という感じで、自然とモデルとビューに何を使うかは決まってきます。そこであとはコントローラ、というわけですが、Catalyst は主にそのコントローラの部分です。CDBI + TT なアプリケーション向けのコントローラですが、モデルやテンプレートは CDBI と TT に限定されてるわけではないので、別の組み合わせでも使えます。</p>

<p>と、いうことでちょっとお勉強がてらいじってみました。以下、そのメモというか解説です。Perl でウェブアプリケーション作りたいけど良いフレームワークはないかなあ、とお嘆きの方は一読していただければこれ幸い。</p>]]>
<![CDATA[<p>何はなくともまずは準備から。CPAN から Catalyst モジュールをインストールします。</p>

<pre>
[naoya@colinux naoya]$ sudo perl -MCPAN -e 'install Bundle::Catalyst'
[naoya@colinux naoya]$ sudo perl -MCPAN -e 'install Bundle::Catalyst::Everything'
</pre>

<p>これで Catalyst に必要なモジュールは全部入る...といいたいところですがデータベースに何を使うかによって、自動では入ってくれないものもいくつかあります。MySQL を使うなら Class::DBI::Loader::mysql、Class::DBI::mysql あたりを明示的にインストールする必要があるかも。(もちろん DBD::mysql も。)</p>

<p>普通ならここでいったんフレームワークのインストール作業は終えて、ウェブサーバーのセットアップとかに入るところなんですが、Catalyst にはデバッグ用の、コマンドラインから実行できる httpd が付属してくるのでその必要はないです。これが結構便利です。</p>

<p>さて、何を作ろうか...というところですがとりあえずお勉強目的なので <a href="http://qootas.org/archives/2005/03/perl_on_rails_c.html">qootas.org</a> でも取り上げられている <a href="http://tinyurl.com/">TinyURL</a> っぽいものを作ってみました。qootas.org の記事では Catalyst のバージョン 4.34 を使っていますが、最新の 5.10 ではコントローラ周りの API が結構変わってたりするので、同じようなものを作るのでも調べごとが必要そうですし、題材としては良さそだった、ということで。(なので記事の中身は qootas.org のそれとかなり被っています。)</p>

<p>仕様としては </p>

<ul>
<li>/ にアクセスするとURLを入力するフォームがある</li>
<li>フォームにURLを入力して submit すると、その URL を縮めた URL が返ってくる</li>
<li>元のURLと短縮URLは、データベース上でマッピングされており、短縮URLへアクセスした場合はそれを見て元のURLにリダイレクトする</li>
</ul>

<p>といったところです。本物の TinyURL は短縮URL の識別子にランダムな文字列を使っていますが、ここでは簡単のため http://.../23 といった感じで auto_increment な数値を使うことにしました。</p>

<p>あらかじめ、MySQL 上にこんな感じのテーブルを作成しておきます。データベース名は tinyurl、テーブル名は urlmap です。</p>

<pre>
mysql> desc urlmap;
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(10) unsigned |      | PRI | NULL    | auto_increment |
| url   | varchar(255)     |      |     |         |                |
+-------+------------------+------+-----+---------+----------------+
</pre>

<p>ここから Catalyst を使った開発に入ります。最初にウェブアプリケーションのパッケージ名を決めます。ここでは NDO::TinyURL としました。パッケージ名を決めたら、catalyst.pl を実行します。すると、各種ディレクトリや Helper スクリプトが生成されます。</p>

<pre>
[naoya@colinux naoya]$ catalyst.pl NDO::TinyURL
created "NDO-TinyURL"
created "NDO-TinyURL/script"
created "NDO-TinyURL/lib"
created "NDO-TinyURL/root"
created "NDO-TinyURL/t"
created "NDO-TinyURL/t/m"
created "NDO-TinyURL/t/v"
created "NDO-TinyURL/t/c"
created "NDO-TinyURL/lib/NDO/TinyURL"
created "NDO-TinyURL/lib/NDO/TinyURL/M"
created "NDO-TinyURL/lib/NDO/TinyURL/V"
created "NDO-TinyURL/lib/NDO/TinyURL/C"
created "NDO-TinyURL/lib/NDO/TinyURL.pm"
created "NDO-TinyURL/Build.PL"
created "NDO-TinyURL/Makefile.PL"
created "NDO-TinyURL/README"
created "NDO-TinyURL/Changes"
created "NDO-TinyURL/t/01app.t"
created "NDO-TinyURL/t/02pod.t"
created "NDO-TinyURL/t/03podcoverage.t"
created "NDO-TinyURL/script/ndo_tinyurl_cgi.pl"
created "NDO-TinyURL/script/ndo_tinyurl_fcgi.pl"
created "NDO-TinyURL/script/ndo_tinyurl_server.pl"
created "NDO-TinyURL/script/ndo_tinyurl_test.pl"
created "NDO-TinyURL/script/ndo_tinyurl_create.pl"
</pre>

<p>次に、これは結構お約束な作業っぽいですが、Template-Toolkit (TT) をベースにしたビュークラスを作成します。といってもこれも Helper スクリプトを実行するだけ。</p>

<pre>
[naoya@colinux naoya]$ cd NDO-TinyURL/
[naoya@colinux NDO-TinyURL]$ script/ndo_tinyurl_create.pl view TT TT
created "/home/naoya/NDO-TinyURL/script/../lib/NDO/TinyURL/V/TT.pm"
created "/home/naoya/NDO-TinyURL/script/../t/v/tt.t"
</pre>

<p>引数には "view TT TT" としてます。(なんか他の人のを見てても TT TT としてるのが多かったので。) テンプレートエンジンに TT 以外の物を使う場合とかは "view MyViewer" とすると MyViewer.pm がスケルトンとして生成されるのでそこにコードを書いていくといいみたいです。</p>

<p>なお、この Helper で生成された NDO::TinyURL::V::TT クラスは Catalyst::View::TT を継承しているだけのクラスになります。Template-Toolkit で提供されている以上の機能をビューに追加したい場合とかは、このクラスにメソッドを定義していくと良いでしょう。</p>

<p>ビューの下準備はこれでおしまい。以降、ビューの開発は、コントローラを作りながらウェブアプリケーションの各アクションに合わせてテンプレートを書いていく作業になります。</p>

<p>次はモデルの作成です。通常 Class::DBI でモデルを作る場合は、データソースやテーブルのスキーマに合わせて、テーブル一つにたいして Class::DBI のサブクラスを一つ定義していく、ということをやりますが、Catalyst ではやはりここも Helper スクリプトにお任せできます。</p>

<pre>
[naoya@colinux NDO-TinyURL]$ script/ndo_tinyurl_create.pl model CDBI CDBI DBI:mysql:tinyurl nobody nobody
created "/home/naoya/NDO-TinyURL/script/../lib/NDO/TinyURL/M/CDBI.pm"
created "/home/naoya/NDO-TinyURL/script/../lib/NDO/TinyURL/M/CDBI"
created "/home/naoya/NDO-TinyURL/script/../lib/NDO/TinyURL/M/CDBI/Urlmap.pm"
created "/home/naoya/NDO-TinyURL/script/../t/m/cdbi_urlmap.t"
</pre>

<p>うーん、楽ちん。"model モデルのパッケージ名 モデルに使うクラス DSN [username] [password]" として実行します。まあ、Class::DBI を使うならお約束的に "model CDBI CDBI DBI:mysql:foobar user pass" でしょうか。</p>

<p>これで下準備は完了。作ったモデルを組み合わせてウェブアプリケーションを作成...つまりコントローラを作っていきます。コントローラのクラスは lib/NDO/TinyURL.pm です。スケルトンがあらかじめ生成されているので、それを書き換えていきます。</p>

<p>ちなみに、今回は / と /12345 と /make の3つしかアクションがないアプリケーションで、いずれも / 直下なので NDO/TinyURL.pm を編集していますが、一階層下って /foobar/action, /foobar/action2, /foobar/action3...なんてことをやる場合は </p>

<pre>
$ script/ndo_tinyurl_create.pl controller FooBar
</pre>

<p>として /foobar/ 以下のコントローラのスケルトンを生成し、lib/NDO/TinyURL/C/FooBar.pm を編集します。<a href="http://antipop.zapto.org/mt/archives/001280.php">antipop2.0 - Catalyst で作る簡単 Web アプリケーション: Feed2JS 解説</a> にはその具体例が載ってます。</p>

<p>話がそれました。コントローラのコードはこんな感じになりました。バージョン 5.10 では sub action : Attribute とかしてメソッドを定義したりします。なんか Perl の Syntax 的に風変わりですが。この辺も詳しくは <a href="http://qootas.org/archives/2005/04/catalyst_action_1.html">quootas.org : Catalyst入門: Actionの定義とその処理の流れ（前編）</a> で解説されてたりします。</p>

<pre>
package NDO::TinyURL;
 
use strict;
use Catalyst qw/-Debug/;
 
our $VERSION = '0.01';
 
NDO::TinyURL->config( 
    name => 'TinyURL',
    root => '/home/naoya/NDO-TinyURL/root',
    templates => {
        index => 'templates/index.tt',
        make  => 'templates/make.tt',
    }
);
 
NDO::TinyURL->setup;
 
sub default : Private {
    my ( $self, $c ) = @_;
    $c->stash->{template} = NDO::TinyURL->config->{templates}->{index};
    $c->forward('NDO::TinyURL::V::TT');
}
 
sub make : Global {
    my ($self, $c) = @_;
    my $url = $c->req->param('url') or     $c->res->redirect('/');
    $url = 'http://' . $url unless $url =~ /^http(?s):\/\//i;
    my $map = NDO::TinyURL::M::CDBI::Urlmap->find_or_create({ url => $url});
    $c->stash->{map} = $map;
    $c->stash->{template} = NDO::TinyURL->config->{templates}->{make};
    $c->forward('NDO::TinyURL::V::TT');
}
 
sub redirect : Regex('^(\d+)$') {
    my ($self, $c) = @_;
    my $map = NDO::TinyURL::M::CDBI::Urlmap->retrieve($c->req->snippets->[0]);
    $map ? $c->res->redirect($map->url) : $c->res->redirect('/');
}
</pre>

<p>まず、/ にリクエストが来た場合を考えます。/ は default アクションになります。特に何もせずフォームのある画面を表示したいので、</p>

<pre>
sub default : Private {
    my ( $self, $c ) = @_;
    $c->stash->{template} = NDO::TinyURL->config->{templates}->{index};
    $c->forward('NDO::TinyURL::V::TT');
}
</pre>

<p>として、$c->forward('NDO::TinyURL::V::TT') を実行します。$c は Context オブジェクトで、コントローラでは基本的にこの Context オブジェクトのメソッドを呼び出してほげほげ、ということをします。ここでは先に Helper スクリプトで用意したビュークラスに、処理の転送を行っています。</p>

<p>転送する前に $c->stash->{template} に、このアクション用のテンプレートファイルのパスをセットしています。なんか、テンプレートファイルのパスを stash に保存しておくというのがちょっと気持ちわるい気もしますが、そういうことみたいです。なお、stash や config にセットしておいた値はテンプレート側から自由にアクセス可能です。</p>

<p>/ 用のテンプレートは templates/index.tt と指定したので、それを用意します。実際の場所は root/templates/index.tt です。</p>

<pre>
&lt;html&gt;
&lt;head&gt;&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;[% name %]&lt;/h1&gt;
 
&lt;form action="make" method="post"&gt;
URL: &lt;input type="text" name="url" size="30"&gt;
&lt;input type="submit" value="tinyurl" type="submit"&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>

<p>フォームがあるだけの画面です。[% name %] は TT のテンプレートタグで、TinyURL.pm の中で config にセットしておいた値を展開してます。</p>

<p>これで / は完了。</p>

<p>次は、URL が入力されたら短縮URLを作って画面に表示する /make です。</p>

<pre>
sub make : Global {
    my ($self, $c) = @_;
    my $url = $c->req->param('url') or $c->res->redirect('/');
    $url = 'http://' . $url unless $url =~ /^http(?s):\/\//i;
    my $map = NDO::TinyURL::M::CDBI::Urlmap->find_or_create({ url => $url});
    $c->stash->{map} = $map;
    $c->stash->{template} = NDO::TinyURL->config->{templates}->{make};
    $c->forward('NDO::TinyURL::V::TT');
}
</pre>

<p>make : Global と書くと、/make に来たらこのアクションを呼びなさいという指示になります。Global 属性はこんな風に使います。ここでは Class::DBI の find_or_create メソッドで、入力された URL を urlmap テーブルに保存してます。あとは、stash にオブジェクトをセットしつつテンプレートを指定してビューに転送。</p>

<p>なんか url が入力されてなかったときは / に戻すということをやってますが、<a href="http://search.cpan.org/~mramberg/Catalyst-Plugin-FormValidator-0.02/FormValidator.pm">Catalyst::Plugin::FormValidator</a> あたりを使ったほうが美しいかも。(Catalyst はエラーハンドリングに関する機能はフレームワークに組み込まれてないのかな、誰か教えて。)</p>

<p>root/templates/make.tt はこんな感じです。</p>

<pre>
&lt;html&gt;
&lt;head&gt;&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;[% name %] created&lt;/h2&gt;
 
&lt;p&gt;&lt;a href="[% map.url %]" target="_blank"&gt;[% map.url %]&lt;/a&gt; to &lt;a href="/[% map.id %]" target="_blank"&gt;[% base %][% map.id %]&lt;/a&gt;&lt;/p&gt;
&lt;/ul&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>

<p>最後に、/12345 に来たときにリダイレクトするアクション。</p>

<pre>
sub redirect : Regex('^(\d+)$') {
    my ($self, $c) = @_;
    my $map = NDO::TinyURL::M::CDBI::Urlmap->retrieve($c->req->snippets->[0]);
    $map ? $c->res->redirect($map->url) : $c->res->redirect('/');
}
</pre>

<p>ここでは /make のように、アクションの名前は固定じゃなく変数である数値なのですが、このように Regex 属性を使うことでそれを実現できます。正規表現メモリに入れた変数($1) は Request オブジェクトの snippet メソッドで取り出せます。</p>

<p>これでアプリケーションは完成。Catalyst に付属の httpd でテストしましょう。</p>

<pre>
[naoya@colinux NDO-TinyURL]$ script/ndo_tinyurl_server.pl
[Thu May  5 11:18:10 2005] [catalyst] [debug] Debug messages enabled
[Thu May  5 11:18:10 2005] [catalyst] [debug] Loaded dispatcher "Catalyst::Dispatcher"
[Thu May  5 11:18:10 2005] [catalyst] [debug] Loaded engine "Catalyst::Engine::HTTP"
[Thu May  5 11:18:10 2005] [catalyst] [debug] Found home "/home/naoya/NDO-TinyURL/script/.."
[Thu May  5 11:18:10 2005] [catalyst] [debug] Loaded tables "urlmap"
[Thu May  5 11:18:11 2005] [catalyst] [debug] Loaded components
.=----------------------------------------------------------------------------=.
| NDO::TinyURL::M::CDBI                                                       |
| NDO::TinyURL::V::TT                                                         |
| NDO::TinyURL::M::CDBI::Urlmap                                               |
'=----------------------------------------------------------------------------='
 
[Thu May  5 11:18:11 2005] [catalyst] [debug] Loaded private actions
.=-------------------------------------+--------------------------------------=.
| Private                              | Class                                 |
|=-------------------------------------+--------------------------------------=|
| /make                                | NDO::TinyURL                          |
| /redirect                            | NDO::TinyURL                          |
| /default                             | NDO::TinyURL                          |
'=-------------------------------------+--------------------------------------='
 
[Thu May  5 11:18:11 2005] [catalyst] [debug] Loaded public actions
.=-------------------------------------+--------------------------------------=.
| Public                               | Private                               |
|=-------------------------------------+--------------------------------------=|
| /make                                | /make                                 |
'=-------------------------------------+--------------------------------------='
 
[Thu May  5 11:18:11 2005] [catalyst] [debug] Loaded regex actions
.=-------------------------------------+--------------------------------------=.
| Regex                                | Private                               |
|=-------------------------------------+--------------------------------------=|
| ^(\d+)$                              | /redirect                             |
'=-------------------------------------+--------------------------------------='
 
[Thu May  5 11:18:11 2005] [catalyst] [info] TinyURL powered by Catalyst 5.10
You can connect to your server at http://colinux:3000/
</pre>

<p>なにやらディスパッチ先はここがこうなってるとかいうステータスが色々出て、サーバーは localhsot の 3000 番にバインドしました。指示通りアクセスすると、</p>

<p><a href="http://naoya.dyndns.org/~naoya/mt/archives/tinyurl_001.gif"><img alt="tinyurl_001.gif" src="http://naoya.dyndns.org/~naoya/mt/archives/tinyurl_001-thumb.gif" width="250" height="196" /></a>　<a href="http://naoya.dyndns.org/~naoya/mt/archives/tinyurl_002.gif"><img alt="tinyurl_002.gif" src="http://naoya.dyndns.org/~naoya/mt/archives/tinyurl_002-thumb.gif" width="250" height="196" /></a></p>

<p>てな感じで画面が遷移し http://colinux:3000/2 にアクセスしたところちゃんとリダイレクトされました。めでたしめでたし。</p>

<p>まだ触りぐらいしか使ってないのですが、とりあえず Helper スクリプトと httpd が超ベンリ。最初引数がよくわかんなかったりしましたが、その辺はフレームワーク学習のためのコストのうちですね。慣れてくると Helper でセットアップ、コントローラとテンプレートをもりもり書いて、必要に応じてロジックをクラスにまとめて...というのの繰り返していくだけでお手軽にウェブアプリケーションを作ることができそうです。</p>

<p>フレームワークのアーキテクチャとしては、一人もしくは少人数向けのフレームワークかなあという印象です。今回正規表現でいじったように、URLとロジックのマッピングをコントローラでかなり柔軟にいじれて自由度が高いのは便利ですが、ちょっと自由度が高すぎるので、少人数ならよさそうだけど、と思った。大規模開発も可能でしょうけど、一番効果を発揮するのは Hacker な人が一人でどんどん作ってくケースかな。</p>

<p>今回ははてなで使っているはてなフレームワークとの比較のために勉強してみました。(アーキテクチャは Catalyst と結構違うんですが)はてなフレームワークは一人よりも少人数開発にフォーカスしたフレームワークで、もう少しプログラマに対する制約が強い。そのおかげでコードが均一になりやすいというメリットが得られてます。その辺の使用感覚と比べて、Catalyst は一人向けかなあと感じた次第。</p>

<p>プラグインでフレームワークそのものの機能を拡張していけるのが良いですね。Sledge もそうだけど、オープンソースなフレームワークは<a href="http://blog.bulknews.net/mt/archives/000143.html">プラグインアーキテクチャでいかに Hacker を刺激するか</a>がその発展の肝かもしれない。(あとドキュメンテーションｗ)</p>

<p>ちなみに、プラグインを書くには Catalyst::Plugin::Foobar というクラスを作ってその中にメソッドを定義します。ここで定義されたメソッドは Context オブジェクトのメソッドとして定義されます。使うためには use Catalyst qw /Foobar/ とします。プラグインそのものに機能を実装しても良いし、Catalyst::Plugin::Prototype のようにプラグインの中身が更に汎化できる場合は HTML::Prototype のようにそれを外出しのモジュールにしてしまっても良い、といった感じです。</p>

<p>と、いうことで結構使ってみて楽しかったので、次からプライベートで何か作るときは CGI::Application じゃなく Catalyst を使ってみてもいいかな、と思いました。おしまい。</p>

<p>参考にしたドキュメント</p>

<ul>
<li><a href="http://search.cpan.org/dist/Catalyst/lib/Catalyst/Manual/Intro.pod">search.cpan.org: Catalyst::Manual::Intro - Introduction to Catalyst</a></li>
<li><a href="http://qootas.org/archives/2005/03/perl_on_rails_c.html">qootas.org - Perl on Rails な Catalyst を試す</li>
<li><a href="http://qootas.org/archives/2005/04/catalyst_action_1.html">qootas.org - Catalyst入門: Actionの定義とその処理の流れ（前編）</li>
<li><a href="http://antipop.zapto.org/mt/archives/001280.php">Catalyst で作る簡単 Web アプリケーション: Feed2JS 解説
</a></li>
</ul>]]>
</content>
</entry>
<entry>
<title>ELECOM のノートパソコン冷却クーラー</title>
<link rel="alternate" type="text/html" href="http://naoya.dyndns.org/~naoya/mt/archives/001681.html" />
<modified>2005-05-01T04:49:22Z</modified>
<issued>2005-05-01T04:40:47Z</issued>
<id>tag:naoya.dyndns.org,2005:/~naoya/mt//2.1681</id>
<created>2005-05-01T04:40:47Z</created>
<summary type="text/plain">以前に化学式PCクーラーなるものを紹介しましたが、しばらく使い続けていたらだめになってしまいました。本棚に立てて置いていたら中の物質がなんか膨らんで、平らにPCを置けない状態になってしまいました。冷却...</summary>
<author>
<name>naoya</name>
<url>http://naoya.dyndns.org/~naoya/mt/</url>
<email>naoya@naoya.dyndns.org</email>
</author>
<dc:subject>コンピュータ</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://naoya.dyndns.org/~naoya/mt/">
<![CDATA[<p>以前に<a href="http://naoya.dyndns.org/~naoya/mt/archives/001582.html">化学式PCクーラー</a>なるものを紹介しましたが、しばらく使い続けていたらだめになってしまいました。本棚に立てて置いていたら中の物質がなんか膨らんで、平らにPCを置けない状態になってしまいました。冷却性能もそれなりで結構いいかなと思ってたんですが、残念。</p>

<p>そこで新しいのを買おうかと思いましたが、せっかくなので別の物を試してみようと思い、購入したのはこれ。</p>

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;"><a href="http://www.amazlet.com/browse/ASIN/B0002QNHUM/naoyadyndnsor-22" name="amazletlink" target="_blank"><img src="http://images-jp.amazon.com/images/P/B0002QNHUM.09.MZZZZZZZ.jpg" alt="ELECOM  SX-CL01SV 冷え冷えクーラー" style="border: none;" /></a></div><div class="amazlet-info" style="float:left;margin-left:15px;line-height:120%"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazlet.com/browse/ASIN/B0002QNHUM/naoyadyndnsor-22" name="amazletlink" target="_blank">ELECOM  SX-CL01SV 冷え冷えクーラー</a><div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/B0002QNHUM/naoyadyndnsor-22" title="ELECOM  SX-CL01SV 冷え冷えクーラー" target="_blank">amazlet</a> at 05.05.01</div></div><div class="amazlet-detail">エレコム <br />売り上げランキング: 42<br />通常24時間以内に発送<br /></div><div class="amazlet-review" style="margin-top:10px; margin-bottom:10px"><div class="amazlet-review-average" style="margin-bottom:5px">おすすめ度の平均: <img src="http://images-jp.amazon.com/images/G/09/x-locale/common/customer-reviews/stars-4-5.gif" alt="4.56" /></div><img src="http://images-jp.amazon.com/images/G/09/x-locale/common/customer-reviews/stars-4-0.gif" alt="4" /> 思っていたより静か<br /><img src="http://images-jp.amazon.com/images/G/09/x-locale/common/customer-reviews/stars-5-0.gif" alt="5" /> びっくり！<br /><img src="http://images-jp.amazon.com/images/G/09/x-locale/common/customer-reviews/stars-5-0.gif" alt="5" /> 値段からすれば大変お買い得<br /></div><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazlet.com/browse/ASIN/B0002QNHUM/naoyadyndnsor-22" name="amazletlink" target="_blank">amazlet.com で詳細を見る</a></div></div><div class="amazlet-footer" style="clear: left"></div></div>

<p>以前の下敷きタイプのものではなく、ファンのものにしました。ノートPCの後部をこのクーラーに載せて使います。ファンが熱気を吸い取って側面から冷却風を流します。これでノートPCの底面が冷却されます。電源は USB から取ります。</p>

<p><a href="http://naoya.dyndns.org/~naoya/mt/archives/CIMG1288.jpg"><img alt="CIMG1288.jpg" src="http://naoya.dyndns.org/~naoya/mt/archives/CIMG1288-thumb.jpg" width="250" height="187" /></a></p>

<p>効果の程ですが、さすがにファン付ということもあって、下敷きタイプのものよりかなり冷える。PCの底面を触ると冷たいぐらいです。ちょっとファンの音がしますが、気になるほどではないです。</p>

<p>PC が斜めになって、ちょうどデスクトップ用キーボードの足を立てた状態のようになるので、タイピングがしやすくなるというメリットもあります。(人によってはタイプしづらいかな?)</p>

<p>さくっと下に敷いて用が終わったらPCと一緒にかばんにしまえるという意味では下敷きタイプのものがよかったですが、オフィスなんか定位置で使うのであればこっちのタイプでもいいかもしれませんね。</p>]]>

</content>
</entry>
<entry>
<title>傭兵日記のREST入門</title>
<link rel="alternate" type="text/html" href="http://naoya.dyndns.org/~naoya/mt/archives/001680.html" />
<modified>2005-04-29T11:50:12Z</modified>
<issued>2005-04-29T11:49:55Z</issued>
<id>tag:naoya.dyndns.org,2005:/~naoya/mt//2.1680</id>
<created>2005-04-29T11:49:55Z</created>
<summary type="text/plain">傭兵日記: REST 入門日本語の REST のリソース集を以前作ったのだが、日本語では一般人向けの解説がない。 sheepman 氏の REST のページはすばらしいんだけど、多少わかっている人向け...</summary>
<author>
<name>naoya</name>
<url>http://naoya.dyndns.org/~naoya/mt/</url>
<email>naoya@naoya.dyndns.org</email>
</author>
<dc:subject>インターネット</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://naoya.dyndns.org/~naoya/mt/">
<![CDATA[<blockquote><div class="quotetitle"><a title="傭兵日記: REST 入門" href="http://yohei-y.blogspot.com/2005/04/rest_23.html">傭兵日記: REST 入門</a></div>日本語の REST のリソース集を以前作ったのだが、日本語では一般人向けの解説がない。 sheepman 氏の REST のページはすばらしいんだけど、多少わかっている人向けだ。 市山氏のプレゼン資料は RoyF の論文を詳しく解説していてよいのだけれど、いかんせんアカデミックすぎる。技術的な要素も抑えつつ、入門者にもわかりやすい解説はないものかと探していたのだが、みつからない。英語の文書を訳すことも考えたんだけど、あまりよいものが見つからない。</blockquote>

<p><a href="http://yohei-y.blogspot.com/">傭兵日記</a>でyoheiさんがREST入門として、RESTアーキテクチャの解説を日々アップしています。日ごろ何気なくしている HTTP GET とかの処理が、アーキテクチャ的にはどういう意味を持っているのかとかがよくわかって面白いです。要チェック。</p>

<blockquote><div class="quotetitle"><a title="傭兵日記: REST 入門(その5) 四つの動詞 -- GET, POST, PUT, DELETE" href="http://yohei-y.blogspot.com/2005/04/rest-5-get-post-put-delete.html">傭兵日記: REST 入門(その5) 四つの動詞 -- GET, POST, PUT, DELETE</a></div>ここでは実際に稼動している REST 実装の例としてはてなブックマーク AtomAPI を使います。 はてなブックマークそのものの説明はしませんので、あらかじめご了承ください。</blockquote>

<p>第5回目の今日は<a href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%D6%A5%C3%A5%AF%A5%DE%A1%BC%A5%AFAtomAPI">はてなブックマークAtomAPI</a>を題材にPUT, DELETE, POST について解説しています。確かに、REST を理解するにはその具体例として AtomAPI の仕様を学ぶとわかりやすいですよね。</p>]]>

</content>
</entry>
<entry>
<title>coLinux でウェブアプリケーション開発環境構築</title>
<link rel="alternate" type="text/html" href="http://naoya.dyndns.org/~naoya/mt/archives/001679.html" />
<modified>2005-04-29T11:36:39Z</modified>
<issued>2005-04-29T10:44:29Z</issued>
<id>tag:naoya.dyndns.org,2005:/~naoya/mt//2.1679</id>
<created>2005-04-29T10:44:29Z</created>
<summary type="text/plain">遅ればせながらCatalystで遊んでみようかなと思ったのだけど、Hack用のサーバーどうしようかなと小一時間。今までは自宅サーバーやホスティングで借りてるサーバーに SSH でアクセスして Mead...</summary>
<author>
<name>naoya</name>
<url>http://naoya.dyndns.org/~naoya/mt/</url>
<email>naoya@naoya.dyndns.org</email>
</author>
<dc:subject>Linux &amp; UNIX</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://naoya.dyndns.org/~naoya/mt/">
<![CDATA[<p>遅ればせながら<a href="http://search.cpan.org/dist/Catalyst/">Catalyst</a>で遊んでみようかなと思ったのだけど、Hack用のサーバーどうしようかなと小一時間。今までは自宅サーバーやホスティングで借りてるサーバーに SSH でアクセスして Meadow の ange-ftp とか tramp で Hack してたのですが、なんか色々サービスも動いているし、あんまりそこで開発したくないなあと思ったところ、<a href="http://blog.bulknews.net/mt/archives/001683.html">blog.bulknews.net</a>で colinux がほげほげなんてことが書いてありました。</p>

<p>これはいいと思い、早速ノートPCに導入。</p>

<p><a href="http://naoya.dyndns.org/~naoya/mt/archives/colinu.gif"><img alt="colinu.gif" src="http://naoya.dyndns.org/~naoya/mt/archives/colinu-thumb.gif" width="250" height="233" /></a></p>

<p>coLinux は Windows の中で動く Linux なんですが、coLinux そのものはディストリビューションではなく、Windows などの OS の上で、その OS と協調して動作する Linux カーネルです。なので、coLinux を使って Linux 環境を PC に作るにあたっては、ディストリビューションを選択することができます。Fedora Core、Debian、Gentoo なんかがサポートされてます。(他のものでもイメージを作れば動くんでしょう。) 僕は Debian を選択。</p>

<p>インストール方法は blog.bulknews.net でも紹介されていた<a href="http://scratchpad.fc2web.com/colinux/install/">coLinuxのメモ - coLinuxのインストール</a>が詳しいです。 </p>

<p>coLinux インストール時に TAP-WIN32 とかいう仮想ドライバがインストールされるのですが、これが素晴らしい働きをしてくれます。</p>

<p>ネットワーク接続の方法はいろいろあるのですが、その一つの方法でこの仮想ドライバによってWindows 側にインタフェースを追加しそれを NAT にすることができます。つまり、Windows に、既存のネットワークインタフェースに加えてもう一本足ができて片足をインターネットに、片足を coLinux 側に突っ込んだ環境が構築できると。</p>

<p>coLinux からは TAP-WIN32インタフェース経由でインターネットに接続できるし、Windows から coLinux へも直接アクセスできる。一方外部のホストからは coLinux にはアクセスできないので、ちょうどファイアウォールの内側にあるような状態になり、開発機にはもってこいの環境が構築できます。</p>

<p>ここに Apache、mod_perl、MySQL なんかを放り込んで Perl モジュールも入れて Catalyst が使える状態になりました。楽しいなあ。ノートPCを畳んでスリープモードにして、そこから立ち上げてもちゃんと Linux が動いててすぐ開発に入れるっていうのはかなり感動です。Windows内部にウェブアプリケーション開発環境を持つ、というのを Cygwin でがんばろうと思ったけど mod_perl やなんやが動かなくて諦めてたんですが、coLinux で実現できた感じです。サンキュー miyagawa 氏。</p>

<p>以下、メモっておきます。</p>

<ul>
<li style="margin-bottom: 1em;">最新版の0.6.2はインストーラーによるウィザードで Debian と Gentoo のイメージをダウンロードしてくれる</li>
<li style="margin-bottom: 1em;">colinux-daemon.exe を動かすときに、0.6.2はデフォルトの設定ファイルを読みにいってくれない様子。ヘルプには colinux.default.xml を読み取るとあるのだけど、明示的に -c [設定ファイル] オプション付き DOS 窓から起動してやらないと上がらなかった。</li>
<li style="margin-bottom: 1em;">coLinux とは直接関係ないですが、NAT以外にもWindows XP のブリッジ接続で TAP-Win32 なデバイスとワイヤレスデバイスをブリッジも可能なんだけど、これがなんか気持ち悪いことに。接続はできるんだけど、ワイヤレスLAN周りのアプリケーションのステータスが切断状態になったりとか。あと、ブリッジ接続にすれば外部LAN側の dhcp で coLinux に IP が割り当てられるし、外部LANからもアクセスできるようになるので便利なのですが、dhcp で Mac アドレスによる固定IP配布をしてると Windows と coLinux でバッティングしてしまいます。結局 coLinux 側の dhcp を諦めるとなると、ノートPCをあっちでこっちで使う場合には向いてない、ということで NAT。</li>
<li style="margin-bottom: 1em;">Debianイメージをmountした初期状態では vi すら入ってない(笑) editorコマンドを使ってなぞのエディタでネットワーク設定をいじったりとか。とりあえず apt で SSH を入れてターミナル(僕はPoderosa) からアクセスして、そこから vim を入れる。あとは taskesl で C、C++ の開発環境を入れて、そっからは必要に応じてライブラリを追加していきました。expat とか libxml2 とか ncursesl とか入れたかな。</li>
<li>coLinux側で Samba を立ち上げて、Windows側から mount してやり Meadow で開発、なんてことをしています。できあがったソースは cvs でインターネット上においてある僕のホストに commit す。</li>
</ul>]]>

</content>
</entry>

</feed>
