2005年12月アーカイブ

MovableTypeを3.2へバージョンアップしてみた。
さくさくバージョンアップできました。

バージョンアップの方法というか手順を簡単に書く。ほんと簡単に…。

  1. ダウンロードしてくる
  2. とりあえず「限定個人ライセンス」で。
  3. mt-config.cgiを作成
  4. mt-config.cgi-originalをmt-config.cgiという名前でコピーして、旧バージョンのmt.cfgを見つつ適宜編集。
  5. pluginsのコピー
  6. インストールしていたpluginsを旧バージョンのディレクトリからコピー
  7. mt.cgiにアクセス
  8. あとは手順通りにやるだけで、勝手にインストールが完了しました。

んー、簡単。。。

今日はずっとメンテナンス中になってます。Y!に買収されて、なにかシステム変更とかサーバの調整とかしているのかなー。
ブックマークサービスが落ちてるとイライラするのは、それへの依存度が高いからだろう…。

そして、しかたなしにブックマークしようと思ってたページを「Firefoxのタブでひらきっぱなし」 or 「デスクトップにドラッグ&ドロップ」している自分がいます。あとで見る見ないに関わらず、このちょっとメモしておく感覚って大事なのかもなー。でも最近物忘れが激しいのもそのせいなのでは…なんて思ってしまう今日この頃。

System error
error:          Can't call method "prepare" on an undefined value at /www/del.icio.us/comp/user/get line 13.
context:
...
9:      my $usedb = 'master';
10:     my $ret;
11:
12:     if (!$auth_user) { $usedb = 'user' }
13:     if (!exists ($db->{$usedb})) { $usedb = 'master' }
14:     $user_name_q->{$usedb} = $db->{$usedb}->prepare('select * from users where user_name = ?');
15:     my $query = $user_name_q->{$usedb};
16:     $query->execute(lc($user_name));
17:
...
code stack:     /www/del.icio.us/comp/user/get:13
/www/del.icio.us/comp/posts/all:35
/www/del.icio.us/site/index:82
/www/del.icio.us/site/autohandler:110
raw error
 
Can't call method "prepare" on an undefined value at /www/del.icio.us/comp/user/get line 13.
 
 
Trace begun at /usr/share/perl5/HTML/Mason/Exceptions.pm line 131
HTML::Mason::Exceptions::rethrow_exception('Can\'t call method "prepare" on an undefined value at /www/del.icio.us/comp/user/get line 13.^J') called at /www/del.icio.us/comp/user/get line 13
HTML::Mason::Commands::__ANON__('dbh', 'DBI::db=HASH(0x1b3f990)', 'user_name', 'clouder') called at /usr/share/perl5/HTML/Mason/Component.pm line 134
HTML::Mason::Component::run('HTML::Mason::Component::FileBased=HASH(0x1d12840)', 'dbh', 'DBI::db=HASH(0x1b3f990)', 'user_name', 'clouder') called at /usr/share/perl5/HTML/Mason/Request.pm line 1069
eval {...} at /usr/share/perl5/HTML/Mason/Request.pm line 1068
HTML::Mason::Request::comp(undef, undef, 'dbh', 'DBI::db=HASH(0x1b3f990)', 'user_name', 'clouder') called at /www/del.icio.us/comp/posts/all line 35
HTML::Mason::Commands::__ANON__('dbh', 'DBI::db=HASH(0x1b3f990)', 'auth_user', 'clouder', 'count', 20, 'mp3', 0, 'time_format', 'by-second') called at /usr/share/perl5/HTML/Mason/Component.pm line 134
HTML::Mason::Component::run('HTML::Mason::Component::FileBased=HASH(0x1ed3080)', 'dbh', 'DBI::db=HASH(0x1b3f990)', 'auth_user', 'clouder', 'count', 20, 'mp3', 0, 'time_format', 'by-second') called at /usr/share/perl5/HTML/Mason/Request.pm line 1074
eval {...} at /usr/share/perl5/HTML/Mason/Request.pm line 1068
HTML::Mason::Request::comp(undef, undef, 'dbh', 'DBI::db=HASH(0x1b3f990)', 'auth_user', 'clouder', 'count', 20, 'mp3', 0, 'time_format', 'by-second') called at /www/del.icio.us/site/index line 82
HTML::Mason::Commands::__ANON__('dbh', 'DBI::db=HASH(0x1b3f990)', 'auth_user', 'clouder', 'items', 100, 'tagview', 'cloud', 'tagsort', 'alpha', 'bundleview', 'show', 'cookies', 'HASH(0x1ec6920)', 'browser', 'ff') called at /usr/share/perl5/HTML/Mason/Component.pm line 134
HTML::Mason::Component::run('HTML::Mason::Component::FileBased=HASH(0x1dadfe0)', 'dbh', 'DBI::db=HASH(0x1b3f990)', 'auth_user', 'clouder', 'items', 100, 'tagview', 'cloud', 'tagsort', 'alpha', 'bundleview', 'show', 'cookies', 'HASH(0x1ec6920)', 'browser', 'ff') called at /usr/share/perl5/HTML/Mason/Request.pm line 1074
eval {...} at /usr/share/perl5/HTML/Mason/Request.pm line 1068
HTML::Mason::Request::comp(undef, undef, 'dbh', 'DBI::db=HASH(0x1b3f990)', 'auth_user', 'clouder', 'items', 100, 'tagview', 'cloud', 'tagsort', 'alpha', 'bundleview', 'show', 'cookies', 'HASH(0x1ec6920)', 'browser', 'ff') called at /usr/share/perl5/HTML/Mason/Request.pm line 760
HTML::Mason::Request::call_next('HTML::Mason::Request::ApacheHandler=HASH(0x1ec7520)', 'dbh', 'DBI::db=HASH(0x1b3f990)', 'auth_user', 'clouder', 'items', 100, 'tagview', 'cloud', 'tagsort', 'alpha', 'bundleview', 'show', 'cookies', 'HASH(0x1ec6920)', 'browser', 'ff') called at /www/del.icio.us/site/autohandler line 110
HTML::Mason::Commands::__ANON__ at /usr/share/perl5/HTML/Mason/Component.pm line 134
HTML::Mason::Component::run('HTML::Mason::Component::FileBased=HASH(0x1b22e70)') called at /usr/share/perl5/HTML/Mason/Request.pm line 1069
eval {...} at /usr/share/perl5/HTML/Mason/Request.pm line 1068
HTML::Mason::Request::comp(undef, undef, undef) called at /usr/share/perl5/HTML/Mason/Request.pm line 338
eval {...} at /usr/share/perl5/HTML/Mason/Request.pm line 338
eval {...} at /usr/share/perl5/HTML/Mason/Request.pm line 297
HTML::Mason::Request::exec('HTML::Mason::Request::ApacheHandler=HASH(0x1ec7520)') called at /usr/share/perl5/HTML/Mason/ApacheHandler.pm line 134
eval {...} at /usr/share/perl5/HTML/Mason/ApacheHandler.pm line 134
HTML::Mason::Request::ApacheHandler::exec('HTML::Mason::Request::ApacheHandler=HASH(0x1ec7520)') called at /usr/share/perl5/HTML/Mason/ApacheHandler.pm line 793
HTML::Mason::ApacheHandler::handle_request('HTML::Mason::ApacheHandler=HASH(0x1ad1600)', 'Apache=SCALAR(0x1e71490)') called at (eval 43) line 8
HTML::Mason::ApacheHandler::handler('HTML::Mason::ApacheHandler', 'Apache=SCALAR(0x1e71490)') called at /dev/null line 0
eval {...} at /dev/null line 0

今del.icio.usを見たら、上記のようなエラーが表示されていてプログラムの中身が見えてるじゃん!Mason使ってるんだ…知らなかった。。。

Update:と思ったのだが、自分だけの現象のようだ…。なに?私のなにが悪いの!?(汗)

Burning Questions - The Official FeedBurner Weblog

FeedFlare is initially launching today with seven simple options, including:

* most popular tags for this item via del.icio.us
* tag this item at del.icio.us
* Technorati cosmos: number of links to this post
* Creative Commons license for this specific item. This works even if you are splicing, say, a Flickr photo feed into a blog feed and the two parent feeds have different licenses associated with them.
* number of comments on this post (currently only for feeds created by Wordpress)
* email this item
* email the author of this item (particularly helpful if the item ends up spliced into another feed or repurposed on a site).

FeedBurnerがFeedFlareというオプションを追加しました。これは無料で使えるオプションのようで、7つのオプションをフィードに追加することができます。

以下の7つの機能がフィードの各エントリにリンクが追加されます。まぁ名前を見れば機能はわかると思いますが、説明しておきます。

  • Email this
  • エントリのリンクを誰かにメールするためのリンク
  • Email author
  • エントリの作者にメールをするためのリンク
  • Technorati Cosmos
  • このエントリのTechnoratiが計算した被リンク数を表示
  • Del.icio.us tags
  • エントリのdel.icio.usでの付けられているタグを表示
  • Save to del.icio.us
  • エントリをdel.icio.usに追加するためのリンクを表示
  • Count comments
  • エントリにポストされたコメントの数を表示(WordPressを使ったブログのみの機能)
  • Creative Commons
  • Creative Commonsのライセンスを表示

自分も「Email This」「Technorati Cosmos」「Del.icio.us tags」「Save to del.icio.us」のオプションを追加してみました。

はてなダイアリー - はてなブックマーク件数取得APIとは

任意のURLのリストを送信すると、はてなブックマークでの被ブックマーク件数を取得することができるAPIです。APIはXML-RPC APIを用いて実装を行っており、結果は URL と被ブックマーク件数のペアの構造体として返却されます。

はてなブックマーク件数取得APIがリリースされてました。作ってる方がいるのですが…XMLRPC版ということでMT用のプラグインを作成しました。

mt-hatena-bookmark-count.pl

<MTEntries>などの中で<$MTHatenaBookmarkCount$>と指定すると、再構築時にその記事がはてなブックマークでブックマークされている件数を取得してきて表示してくれます。Cache::FastMmapを使って結果取得後1時間はキャッシュさせるようになっているのではてブサーバにちょっと優しくしてます。でもリアルタイムではなく再構築時のみなので、気になる人は定期的に再構築をする必要あり…。もしめんどうならcronとかで再構築しませう。

ていうか作ってる途中からうすうすわかってはいたのだが、やっぱJavaScriptにしてそこからcgiを叩いて半リアルタイム(キャッシュも使う)でやった方がいいよな…あとで作ろう。。。

Template Toolkitでvirtual methodを追加したいと思ったんですが、ドキュメントを読んでもどうも簡単なやり方が見付からない。仕方がないので最初に下記のようにやりました。

$Template::Stash::LIST_OPS->{ foo } = \&foo;

こうしなけりゃならないのかな?他になにか方法あるのでしょうか…。
追記:はてブでハテナオヤさんが質問してましたが、このエントリで伝えたいことは、vmethodを追加する方法としては、上記の方法やdefine_methodを使うのが正当な方法なのかどうかということと、他の人はどう追加しているのかなという部分になります。

下記のようにインスタンス生成時に追加とかできればいいのに…。

Template->new(STASH => {
    LIST_OPS => { 
        foo => \&foo
    }
);

と思ったら、Template::Stash::define_vmethodという関数がありました(podに書いてない?)。これをTemplate::Context::define_vmethod経由で呼ぶことができるようです。例えばスカラの値に対して1文字ずつスペースを空けるvirtual method(仮にadd_spaceとする)を定義したかったら、テンプレート(vmethod_test.tt)を

[% str.add_space %]

としておいて、

my $tt = Template->new();
my $vars = { str => 'chowww,omawww' };
$tt->context->define_vmethod('scalar', 'add_space', sub { join(' ', split('', $_[0])) });
$tt->process('vmethod_test.tt', $vars);

という感じにdefine_vmethodを使ってdefine_vmethod('virtual methodの種類', '名前', このvmethodのコードリファレンス)と定義してやればよい。出力結果は、

c h o w w w , o m a w w w

となります。ちなみにvirtual methodの種類は「scalar」と「item」がSCALARとして、「hash」がHASHとして、「list」と「array」がARRAYとして定義するために用意されているようです。と、ここまで書いたのですがdefine_methodはpodに書いてないから使うべきじゃないのかな…いやでも先頭に「_」は付いてないしプライベートメソッド的でもないんじゃないの?…とかちょと悶々としてみた。。。どうなんだろ?

Sledgeでこれを使いたいなぁと思ったんですが、Sledge::Template::TT::outputまではTTのオブジェクトは作らない仕様となっているため、やるとしたらこれをオーバーライドしたクラスを作るか、一番最初に挙げた例($Template::Stash::LIST_OPS->{ foo }にコードリファレンスを代入)を使う必要があります。

ん?たまには流行りにのってもいいじゃない!ってことで、Catalyst::Plugin::XFrameworkを作ってみた。

% HEAD http://localhost:3000/
200 OK
Connection: close
Date: Fri, 09 Dec 2005 15:42:14 GMT
Content-Length: 1695
Content-Type: text/html; charset=utf-8
Client-Date: Fri, 09 Dec 2005 15:42:14 GMT
Client-Peer: 127.0.0.1:3000
Client-Response-Num: 1
Status: 200
X-Catalyst: 5.61
X-Framework: Catalyst/5.61

そもそもX-Catalyst:って付いてるんだけどね。いいじゃない…!
(X-Catalyst:はデバッグモードでないと出ないです via はてブ)

ちなみにHEADってあんまりメジャーじゃないのかな??むしろw3m -dump_headってのを知らなかった…。
あとMac OS Xだと、その昔ファイルシステムの関係でHEADとheadを区別しない時期があってLWPをインストールするとheadをHEADで上書きしてくれるという素晴しいことになっていたのは内緒だ。

gmail.jpg

なんかGmailのメールのリストの上にちょこんとティッカーみたいなのが付いた。Gmail上ではWeb Clipsと呼ぶらしく、今の時点(Fri Dec 09 11:50:26 2005)で日本語版にこの機能はないようだ(自分はEnglish(US)を使っている)。

どうやらこれはちょっとした情報を表示する用のものらしい。設定画面ではニュース、ビジネス、技術や料理などすでに沢山の情報ソースが選べるようになっていて、それをどんどん追加していける。またRSS(たとえば'clouder.jp/yoshiki/mt/index.rdf'など)を指定すると、それを対象にWebの検索が走って、それに関するRSSがリスティングされるので、その中から追加していくことも可能なようだ。でもそのRSSをアグリゲートしたりはしないようだ…。

それにしても、メールを読んでいるときにそこに別の情報があるのって自分は邪魔に感じてしまうのだが。。。

ひさびさにCatalystをバージョンアップ(5.61)したら、なんか動かない。下記のようなエラーがでる

[Tue Dec  6 19:13:50 2005] [catalyst] [error] Caught exception in engine "Can't locate object method "request" via package "Catalyst::Engine::Apache::MP13" at /usr/local/share/perl/5.8.7/Catalyst/Engine/Apache/Base.pm line 77."

なんじゃこりゃと調べていたら、5.49_01のChangesに下記のような記述が。

5.49_01 2005-10-10 10:15:00
- *IMPORTANT* The Apache engines have been moved to a separate package for this release. Please install Catalyst::Engine::Apache if you need Apache support.

Catalyst::Engine::Apache系のモジュールを分離したことが「*IMPORTANT*」付きで書いてありました…。どうやらCatalyst::Engine::ApacheはCatalystの幹とは別々にバージョンアップをさせていくようだ。

それにしてもTask::CatalystにもCatalystのMakefile.PLにもなんもCatalyst::Engine::Apacheが必須と書いてない(必須じゃないからまぁいいんだけど)ので、前からapache上で使ってるユーザには結構罠だ。。。

PSPのファームウェアが2.60になって、RSSチャンネルという機能が付いた。簡単に言うとpodcastが購読(読むじゃねーな…)できるようになったんだけど、それをちょっとハックしてみた。

とりあえずRSSを取りに来るユーザエージェントは、「PSPRssChannel-agent/1.0.0 libhttp/1.0.0」となっています。libhttpを使ってるんですね。ふんふん。

次にプロトコル的にどんな感じで取りに来るのかを見てみた。最初は普通にフィードをGETで取りにきくる。次にそのフィードの各itemのenclosureにあるものをリスティングしてくれます(ちなみにenclosureに拡張子がMP4とかを指定したのですが、大文字の拡張子は認識しませんでした(リスティングされず))。

そしてリスティングされた中から聞きたい曲を選ぶと、その曲のURLにHEADのリクエストがきます。そのリクエストは下記になります。

127.0.0.1 - - [05/Dec/2005:02:37:46 +0900] "HEAD /path/to/music.mp3 HTTP/1.1" 200 0 "http://clouder.jp/foo/bar/index.xml" "PSPRssChannel-agent/1.0.0 libhttp/1.0.0"

そして、その後GETで下記のようなリクエストが1秒に2、3リクエストな感じで曲が終わるまでき続けます。

127.0.0.1 - - [05/Dec/2005:02:37:47 +0900] "GET /path/to/music.mp3 HTTP/1.1" 206 62547 "http://clouder.jp/foo/bar/index.xml" "PSPRssChannel-agent/1.0.0 libhttp/1.0.0"

レスポンスが206なので、206 Partial ContentつまりレジュームでRangeを指定して取りにきているみたいですが、大量のリクエストが来るので、DOS攻撃と間違われそうな…。


プロトコル的にはこのような感じになっているようです。このRSSチャンネルの機能は、ファイルに落さずに曲が聞ける→つまりストリーミングみたいな感じになっていますので、ネットにさえつながっていればメモリスティックを必要としないでpodcastで配信されている曲を聞くことができます。大容量のメモリスティックを持ってない自分にはこの点はいいかもです。

なので、このenclosureでストリーミングのURLを指定しておけば、ジュークボックス的にサーバの曲を流し放題できるのではなんて思いました。でもなんか拡張子とか厳密(?)に見ているようなので、プログラムをmp3とかいう拡張子にする必要があるかも(未確認です)。


ところでvideoはどうなんだろう?と思ってenclosureにmp4のファイルを指定(typeはvideo/mp4)してみたのですが、携帯動画変換君を使ってPSPで再生できる形式にしたものでも再生はできませんでした(同じ動画をメモリスティックに入れたら再生できました)。ちなみにiPod用に変換したものでもだめでした。そもそもできないっぽいです…。

とりあえずTrickstart2.0の開発も始まったみたいですし、それも含めて今後に期待といったところでしょうか。

検索

広告

OpenID対応しています OpenIDについて
Powered by Movable Type 4.22-ja