MTMLからTwitterにアクセスするプラグイン書いた。

簡単なTwitterのbotを作ってみようと思ったのですが、普通にperlとかで書くのもつまらないので、MTMLでボットを書けるようなプラグインを作ってみました。 aklaswad's mt-plugin-mtml-twitter-api at master - GitHub 右上の「Download Source」ボタンからダウンロードできます。なかなかサックリ書けたと思います。 そして、早速、占いをするボットを作ってみました。 MT占い (mturanai) on Twitter Twitterで@mturanaiあてに投稿すると、占いらしき返事を返します。お暇な方は遊んでみてください。 以下プラグインの説明。 MTMLTwitterAPIプラグインをインストールすると、以下の二つのブロックタグが利用可能になります。 mt:TwitterMentions mt:TwitterStatusUpdate 使用上の注意 これらのタグが動作するたび(=これらのタグが書かれたテンプレートが再構築されるたび)に、ネット経由でのAPIアクセスが発生します。そのため、通常の更新を行うサイトのテンプレートで利用する目的には向きません。最悪、致命的なパフォーマンス低下を起こし更新不能となる場合も考えられますので、十分ご理解いただいた上でご利用ください。 mt:TwitterMentions 特定ユーザーに対しての@付き発言を取得し、取得した発言の分だけ繰り返しを行うブロックタグです。 ブロック内では、各発言についての情報が以下の変数に設定されます。 id text name screen_name 以下のモディファイアを指定できます。 endpoint エンドポイントのURLを指定します。通常は指定する必要はありません。 twitterのAPI仕様が変更になった場合や、twitter互換の別サービスを利用する場合に指定すると良いと思います。 username twitterAPIを利用するユーザーのログインネームを指定します。必須です。 password twitterAPIを利用するユーザーのパスワードを指定します。必須です。 timeout リクエストのタイムアウトまでの時間を設定します。デフォルトでは10秒になっています。 fatal_error 何らかの理由でリクエストが失敗した場合に再構築を終了したい場合には1を指定してください。デフォルトでは、リクエストに失敗しても致命的エラーとはならず、再構築が続行されます(エラーの記録はMTのログから確認できます。) new_mentions_only twitterAPIから取得したデータには、最近の(20?)件のデータが含まれています。デフォルトでは、一度でも取得した事のあるデータに関しては処理をスキップする仕様になっています。もし何らかの理由で常に(20?)件のデータの処理を行いたい場合、new_mentions_only=0を指定してください。 namespace 同一MT上で複数のTwitterMentionsタグを運用しており、上記所得済みデータの判定を使い分けたい場合に指定します。 mt:TwitterStatusUpdate Twitterに対して発言を行うブロックタグです。mt:TwitterStatusUpdateタグで囲まれた内容の再構築結果をTwitterにポストします。 endpoint エンドポイントのURLを指定します。通常は指定する必要はありません。 twitterのAPI仕様が変更になった場合や、twitter互換の別サービスを利用する場合に指定すると良いと思います。 username twitterAPIを利用するユーザーのログインネームを指定します。必須です。 password twitterAPIを利用するユーザーのパスワードを指定します。必須です。 timeout リクエストのタイムアウトまでの時間を設定します。デフォルトでは10秒になっています。 fatal_error 何らかの理由でリクエストが失敗した場合に再構築を終了したい場合には1を指定してください。デフォルトでは、リクエストに失敗しても致命的エラーとはならず、再構築が続行されます(エラーの記録はMTのログから確認できます。) 使い方 ブログのメインページにTwitterStatusUpdateを設置して再構築頻度を観察するという使い方もあるかと思いますが、やっぱりボットを作るのが一番の醍醐味かと思います。 以下は、実際に@mturanaiを運用しているテンプレートです。 どっさりと配列を用意した上で、ランダムに配列の中身を取り出して返信しています。 (MTのデフォルトでは乱数を所得するタグはありませんが、twitterの更新速度が充分速いので、twitterの発言idを乱数として利用しています。) 実際にボットとして運用するために、ローカルマシン上で動作しているMTにテンプレートを作成しておき、cronで定期的に再構築を行っています。 */2 * * * * cd /Users/aklaswad/Sites/cgi-bin/greyhound; ....

January 5, 2010

MT関係のイベントに参加しました。

MT5がリリースされ、MT関連のイベントも賑やかになってきました。 ここ何週間かの間に、いくつかのMT関係のイベントに参加しました。ずいぶん遅くなってしまったものもありますが、まとめてレポート書きたいと思います。 第1回MT5勉強会 Dakinyさん主催の、有志による勉強会です。 MT5.0リリースの直後に行われたところに、無理矢理参加させていただきました。急な参加をお願いしてしまい、運営の皆様には大変ご迷惑をおかけしたと思います。有り難うございました。 ワークショップでは、テーマ作成のテーブルに参加させていただきました。 自分の作業を進めつつ、時にはテーマ機能のいろんな側面に関してディスカッションになったり、現場で想定される運用について貴重な意見をいただいたり、すごく勉強になりました。 なお、いくつかの点で動作がおかしいという指摘を頂き、原因が分からず後半はかなり挙動不審になってた事をお詫びいたします。バグ怖いねん。 その後の懇親会では、すごく楽しい時間を過ごさせていただきました。 Movable Type エンジニアの夕べ 続いて、スカイアークさんの主催の、MT関係のエンジニアで集まってのライトニングトーク大会+MTカルトQというイベントに参加しました。 ここでは、僕もLTに参加させていただき、個人的に作成しているネタ系(?)プラグインのTagOverrideを紹介させていただきました。 MT Tag OverrideView more presentations from aklaswad. 他の方のLTも、興味深いものばかりでした。 そしてクイズ大会! 全十問で、シックスアパートのロゴはどれかと言うような、間違うはずが無い!問題から、実在しないコールバックポイントはどれかという技術的カルトクイズまで盛りだくさんで、非常に楽しめました。 いや、始まる前は全問正解余裕すぎると思っていたのですが。 言い訳ですが、なんか問題文を見てると「あれ、あのコールバックは実装されている筈だけど、実はバグで動いていないという引っかけ問題なのでは・・・!?」と疑心暗鬼になってしまい。バグ怖いねん。 結果、トップに一歩及ばずの八問正解でした。 優勝されたoscarさん(ネタにさせてもらってすみません)、同率首位ながらおしくもジャンケンで敗れたにっくさん、参りました。おめでとうございます! 懇親会は、これまた楽しかったです。BodyMoreってエ(謎)。 その後はあまり記憶がありません。平日なのに。 Movable Type Designers and Developers Conference in Osaka day1 MTのリリース恒例のカンファレンス第一弾がなんと、初の大阪遠征というかたちで行われました! それもカンファレンスとハッカソンの2Daysです。 カンファレンスでは、テーマ機能についてお話しさせていただきました。プレゼン資料はこちらからご覧いただけます。 テーマの冒険 また、テーマ機能のデモンストレーションを兼ねて、プレゼン資料の作成に特化したテーマ「Slidon」を作成したうえで、MT上でプレゼン資料を用意するという試みを行いました。 資料作成に利用したテーマも、ダウンロードしてお試しいただけたらと思います。 aklaswad's slidon at master - GitHub 上記リンク先ページで、「download」ボタンをクリックしてダウンロードしてください。「Slidon」テーマは、今後も継続的に開発を進めていけたらと思います。 また、後半のライトニングトークでは、mt-tmpl-testというツールについても発表しました。資料も無く、かなり分かりづらい発表になってしまった事をお詫びいたします。ある意味BuildTracerの兄弟的な位置づけのツールでもあるので、機会があれば改めてエントリーを書けたらと思います。 その後の懇親会は以下略。沢山次会しました。 day2 二日目はハッカソン。前半ではawayukiさんとマルチドメインでのMTの運用について考えつつ、後半はBuildTracerのMT5対応版を作ってました。 BuildTracerについては、色々技術的な困難を抱え込んでしまい、なかなか解決できないまま終了。。。MT5対応にはもう少し時間が必要なようです。 ハックタイム終了後は、ビール飲みつつワイワイガヤガヤと成果発表会。楽しかったです! 会場をお貸しいただいたアルファサードのJunnamaさん、okayamaさんには本当にお世話になりました。有り難うございました! 余談 ハッカソン中に、カンファレンスで使用した、MTで出力したスライド資料をまとめていました。 その際、ブログのテンプレート中でBlogURLやAssetURLを利用していると、リンクが絶対URLで作成されてしまい、配布には向かないという状況になりました。 その時「あれ、これってTagOverrideで無理矢理タグの出力を相対パスに変換すれば解決できるんちゃう」と閃きまして。ちょっとした試行錯誤の末、上手い事出来たんです! いやあ、ネタ思いつきで作ったプラグインでも、きちんと役に立つ場面があるもんですね。 ※ ハッカソン中、上記閃きに関して自分自身を絶賛するような独り言がうるさかった事をお詫びいたします。

December 15, 2009

Re: [Perl]MT形式のエクスポート用に出力をエスケープする

MT形式のエクスポート用に出力をエスケープする - 刺身☆ブーメランのはてなダイアリー そうか。MTのエクスポート形式って業界標準なのか。。。 エスケープ結果を復元するコードが無かったので自分で書こうとしたが、もとのコードだとエスケープ後のデリミタと同じパターン(-----<>など)が元の文字列に存在した時に、正確に復元できないという問題に気づいたが、あきらめて風呂に入っているうちに解決策を思いついた。 文字列中のすべての「-」のみの行を3倍とかに変更してしまえば、安全にエスケープでき、かつラウンドトリップ可能となるはずです。3倍なのは本来のデリミタ( '-' x 5 || '-' x 8 )と重複しないためで、彗星と直接の関係ありません。 実際には、後方互換性が必要になる(このエスケープ形式に対応していないインポーターでも違和感無く読み込めるのが理想)ので、実戦投入は無理でしょう。 元記事のほうでは、HTML表示した場合に見た目変化が無いように空タグっぽい<>を末尾に追加したのだと思うのですが、MTなんかでは最終的な出力先がHTMLとは限らないので、良く無い事が起こりそうな気もします。デリミタと重複する行の末尾にスペースを一個追加してしまう、というあたりが落としどころになるのでしょうか。

October 24, 2009

TagOverride

勢いで書きました。後悔はしてません。 MTML自身で、既存のMTタグの動作を上書きする事ができるプラグインです。使い道はちょっと未知数ですが、なんとなく役に立つ使い方も出来るのでは無いかと言う気がします。役に立つと良いなあ。。。 現在の所、MT5.x 専用です。最新版は、以下のページからダウンロードできます。 http://github.com/aklaswad/MT-TagOverride このプラグインをインストールすると、以下の二つのテンプレートタグが利用可能になります。 <mt:TagOverride> タグの動作を上書きするためのブロックタグです。 このブロックの実行後にname属性で指定したタグが呼び出された場合、元々のタグの実行結果の代わりに、このブロックの内側のテンプレートの実行結果が表示されるようになります。 利用可能なモディファイア name 上書きするタグの名前を指定します。 例: このブロックが実行されると、以降、どのエントリーでも<EntryTitle>タグの実行結果が「トントリー」になります。 <mt:TagOverride name="EntryTitle">トントリー</mt:TagOverride> 利用可能な変数 上書き後にタグが呼び出された場合、そのタグに設定されたモディファイアの値が、変数"args"にハッシュとして設定されています。これらの値を操作/上書きする事で、タグの動作を変更できます。 例 以下のブロックを実行すると、以降、すべての<mt:Entries>タグのlimitモディファイアが自動的に三倍になり、沢山のエントリーを表示できます。 <mt:TagOverride name="Entries"> <mt:if var="args" key="limit"> <mt:setvarblock name="args" key="limit"><mt:var name="args" key="limit" op="*" value="3"></mt:setvarblock> </mt:if> <mt:SuperTag> </mt:TagOverride> <mt:SuperTag> TagOverrideの内側で、上書き前のタグを呼び出すファンクションタグです。上書き前のタグの実行結果が返ってきます。 例 以下のブロックを実行すると、以降、すべての<mt:EntryTitle>タグの出力の末尾にidが表示されるようになります。 <mt:TagOverride name="EntryTitle"><mt:SuperTag>(<mt:EntryID>)</mt:TagOverride> 既知の問題 多重にオーバーライドできないようです。

October 11, 2009

config.yamlで良くある$Foo::Bar::buzの謎を探る。

「$pkg = '$Core::MT::CMS::'」と宣言されているから、 「${pkg}Dashboard::dashboard」というのは「$Core::MT::CMS::Dashboard::dashboard」 のことだと思う。 で、この「$Core」というのが何なのかわからない。 $Core::MT::CMS...がわからない - Using MT カレントのComponentをFooにセットしてから、Bar::buzを実行してくれ、という意味になります。 上の例で言えば、カレントのComponentとして'Core'を設定した上で、MT::CMS::Dashboardパッケージのdashboardメソッドを実行しろ、ということです。 この書式はMT独自の機能で、基本的にregistry(プラグインのconfig.yamlなど)にメソッド名を書くような場面でのみ有効となります。一見、Perlの名前空間のようにも見えますが、頭の「$Foo::」の部分は全くの別物です。(MT_HOME)/lib/MT.pmのhandler_to_coderefというルーチンでパースされていますので、詳しい内容についてはコード見てください;-) MT4では、Componentという概念が登場してます。Componentは、平たく言うと、作業の主体は誰か、という情報を扱うための基底クラスです。 すべてのプラグインはそれぞれ、独立したComponentです。各種addonもComponentです。また、MT本体も、Coreという名前のComponentです。 すべてのComponentはそれぞれに、テンプレートのサーチパスや、L10Nのhandler、registryなどを、固有の情報として保持しています。そのおかげで、必要な時に文脈にあわせて適切な翻訳を行ったり、プラグインが自分のディレクトリ以下のtmplディレクトリからテンプレートファイルを取り出したりする、といったことが実現されています。 そんな、縁の下のComponentさんがたくさんいるので、「じゃ、今回は$Fooさんに面倒見てもらおうかしら」というのが、くだんの表記法の意味する所な訳です。 せっかくなので、ちょっとしたプラグインを作って実験してみます。 MT::translateメソッドは、カレントのComponentがセットされていれば、そのComponentの辞書を優先的に利用して翻訳を行う、という実装になっています。 なので、$Foo::つきで呼ばれたコールバックと、そうでない場合とで、MT::translateを実行した際の結果に違いが現れます。 次のようなCompTest.pmファイルを用意し、 package CompTest; use MT; sub test_with_component_name { printf STDERR "trans with component: %s\n", MT->translate('Entry'); } sub test_without_component_name { printf STDERR "trans without component: %s\n", MT->translate('Entry'); } 1; config.yamlで以下のようにコールバックに登録します。 id: CompTest callbacks: init_app: - handler: $CompTest::CompTest::test_with_component_name - handler: CompTest::test_without_component_name l10n_class: CompTest::L10N で、このプラグインのL10Nファイルに Entry => 'Suntory', などと書いておくと、mt.cgiの実行の度に以下のようなエラー出力が得られる筈です。 trans with component: Suntory...

June 18, 2009

ActionStreamのlinkフィールドからサムネイルをでっちあげる。

久しぶりの更新。テンプレート系のコネタです。 ActionStreamsのいくつかのプラグインでは、別途ThumbnailのURLを取得して専用のフィールドに保存してくれますが、そうではない場合もあります。 特にソーシャルブックマーク等のサービスの場合には、そもそもコンテンツとそのサムネイルの関係が事前に分からないため、何もしてくれません。 でもまあ、自分の行動範囲で、URLからサムネイル画像のURLが推測できる範囲なら何とかなるんじゃないか。 そこで、MTMLで無理矢理やっつけてみました。 まず、以下のようなテンプレートを、モジュールテンプレートとして作成します。 前半のmt:setHashVarタグのなかに適当に正規表現をつっこむと対応サイトが増やせます。とりあえずyoutubeとniconico、amazonだけ作りました。検証してないので、取りこぼしや誤作動があるかもしれません。 <mt:setHashVar urls> <mt:setvar youtube value="http\://[^\.\/]+\.youtube\.(jp|com)/watch\?v=([0-9a-zA-Z\-]{11})","http://img.youtube.com/vi/$2/default.jpg" /> <mt:setvar niconico value="^http\://www\.nicovideo\.jp/watch/[sn]m([0-9]{1,9})","http://tn-skr2.smilevideo.jp/smile?i=$1" /> <mt:setvar amazon value="^http\://www\.amazon\.(?:co\.jp|com)/.*(?:ASIN|product-description|product|dp)/([^/]+)(?:/.*)*","http://images.amazon.com/images/P/$1.09._THUMBZZZ_.jpg" /> </mt:setHashVar> <mt:loop urls> <mt:setVarBlock check><mt:getVar var="__value__[0]"></mt:setVarBlock> <mt:setVarBlock pattern>/<mt:getVar var="__value__[0]">/</mt:setVarBlock> <mt:setVarBlock replace><mt:getVar var="__value__[1]"></mt:setVarBlock> <mt:if url like="$check"><mt:var url regex_replace="$pattern","$replace"></mt:if> </mt:loop> 上のを保存したら(仮に「URL2Image」という名前で保存したとします)、ActionStreamsの表示側で、次のようにインクルードします。 変換対象となるURLを、モディファイアのように渡してください。 <mt:if tag="StreamActionThumbnailURL"> <mt:StreamActionThumbnailURL /> <mt:else> <mt:setvarblock name="link"><mt:StreamActionURL /></mt:setvarblock> <mt:setvarblock name="thumb"><mt:include module="URL2Image" url="$link" trim="1" /></mt:setvarblock> <mt:if thumb><img src="<mt:var name="thumb" />" /></mt:if> </mt:if> このブログのメインページに表示しているライフログでも、Youtubeのビデオのブックマークなんかで画像が表示されるようにしてあるので、参考にしてみてください。 今回は、画像のみに絞ったカスタマイズにしましたが、やり方によってはembedタグにしたりアフィリエイトリンクにしたり色々出来ると思います。もちろんActionStreams以外の色々にも利用できると思います。お好みで工夫してみてください。 変換後のURLの前後に半角スペースが混じるとの指摘をいただきましたので、呼び出し側でtrimモディファイアを追加する形で対応しました。<mt:include module="URL2Image" url="$link" trim="1" />また、hvc-001さんにご指摘いただき、ニコニコ動画用の正規表現を一部修正しました。トラックバックありがとうございました!

June 10, 2009

[MT]コールバックの実行順序

今日はコールバックの発生順序に関して大はまりしたので個人的に思ったことをメモ。 MTやMTのプラグインから利用可能なコールバックには大きく分けて以下の3つがある。 1) 通常のMTのコールバック(cms_post_saveなど) 2) Data::ObjectDriver(D::OD) が Class::Trigger のトリガーを実行した際に同期して呼ばれる、オブジェクト操作関係のコールバック(MT::Entry::post_saveなど) 3) D::ODが実行する Class::Trigger のトリガー ちなみに(3)は、以下のように指定/実行できます。 MT::Comment->add_trigger( post_save => sub { my $comment = shift; # do something here... }); このうち、(1)と(2)はMTのコールバックとして実行されるため、優先順位を指定できるが、(3)はMTのコールバックではないので、どのような順番で処理されるか分からない。そのためドハマリしました。 結局、現在のMTの実装として(恣意的に) Class::Trigger の「pre_****」は常にMTの「pre_****」コールバックより先に呼ばれる Class::Trigger の「post_****」は常にMTの「post_****」コールバックより後に呼ばれる となっているが、(多分)アンドキュメンテッドな仕様なためこの順序が変更されない保証は無い。ということだと思います。 とりあえずの結論としては、基本的に(3)の方法は使わずに必ず(2)の方法で指定する、必要ならpriorityをきちんと登録する、というのがベストプラクティスなのかなと思いました。 で、ここからが疑問なのだが、単なる数字(MTのコールバックの優先順位は0~11で指定される)では正直何より先or後に実行されるのか分からないんスよね。これって意味有ります? こういった仕組み自体はよく有る汎用的な仕組みだとは思うのですが。なんか納得いかねえ。...

February 20, 2009

Dummy

...

January 31, 2009

ギターのコード譜を生成するプラグイン作った。

こんな狭い世界でbayashiさんのと被ってしまってなんですが、ギターのコード譜を画像表示するMTプラグインを作成しました。たぶんMT4.2位専用です。 GuitarTools0.1.zip 動作環境 お使いのサーバーで、画像処理ライブラリのGDと、PerlからGDを利用するためのモジュールがインストールされている必要があります。自分の利用しているXreaのサーバーでは、いずれも利用可能なようです。 インストール プラグインディレクトリに、解凍したGuitarToolsプラグインのpluginsディレクトリ以下をアップロードしてください。 外部モジュールとして、画像作成ににぽたんさん作成のGD::Tab::Guitar、コード認識にMusic::Chord::Namerを利用しています。プラグインのパッケージには同梱していませんので、これらのモジュールをCPANからインストールするか、またはextlibに適宜展開して下さい。 また、lines記法を利用するためには、以下のスタイルシートをメインのスタイルシートテンプレートのおしりなどに張り付けるなどの形で、参照できるようにしてください。 .guitarlines { line-height: 50px; background-color: #F4F8Fc; font-size: 16px; } .guitarlines .guitarchord { position: relative; width: 52px; top: -7px; margin: 0 -52px 0 0; border: 0; } .guitarlines .chordname { position: relative; display: inline-block; width: 0; top: -1.2em; font-weight: bold; } 利用方法 プラグインがインストールされると、グローバルモディファイア「guitar_tools」と、テキストフォーマット「GuitarTools」が有効になります。これらが有効な箇所で、ギター記法を利用できます。 ごくたまにエントリーで使う程度ならフォーマットから利用し、日常的にギター記法を利用するブログでは、EntryBodyタグなどのモディファイアとして、テンプレートに組み込んでしまうのがよいかと思います。 シンタックス 基本 角括弧で囲んで「chord:」と書いた後にコードネームを書いてください。 [chord:C]と書くと[chord:C]のように画像に変換されます。 フレットを指定する デフォルトで登録されているコードのフォームが気に食わない、コードが特殊、など、フレットを指定したい場合「C6@032030」のように@マークで区切ってください。 [chord:C6@032030] [chord:C6@032030] 6弦から1弦に向かって書きます。 ミュートは小文字のxです。 複数のコードをズラッと書く。 複数並べたい場合、スペースで区切って記入できます。 [chord:C6@032030 GM7 Bm7 Em] [chord:C6@032030 GM7 Bm7 Em]...

December 11, 2008

[ActionStreams]ボケて用config.yaml

ボケて用のconfig.yamlです。 フィード無いのでscraperでとってきてます。多分寿命は短いと思う。 scraperのネストの扱いが分からなくてハマった。 フィードの配信が待ち望まれるところ。 フィールド追加するより、titleなどの既存のフィールドに入れちまった方が良いのかしら? name: BoketeAS id: boketeas key: BoketeAS author_link: http://blog.aklaswad.com/ author_name: aklaswad description: Adds profile service and activity stream for Bokete.jp version: 0.1 profile_services: bokete: name: Bokete url: http://bokete.jp/user/%s icon: images/bokete.png action_streams: bokete: bokes: name: Bokes description: stream you boked fields: - boke html_form: '[_1] boked <a href="[_2]">[_3]</a>' html_params: - url - boke url: 'http://bokete.jp/user/{{ident}}' identifier: boke scraper: foreach: div.odai530 get: boke: - 'h3' - TEXT...

October 7, 2008

EmoticonButton 4 CustomEditorButton2。

MTでも絵文字使おうぜプラグイン、アリマス - Kickstart my heartで公開されている絵文字プラグインを、CustomEditorButton2にインポートしてみました。 EB4CEB2.zip 利用にあたっては、CustomEditorButotn2側もアップデートが必要となっています。お試しいただく際には、CustomEditorButton2プラグインも、以下のバージョン2.0.31にアップデートしてください。 CustomEditorButton2_0_31.zip

October 3, 2008

Six Apartに入社しました。

私事となりますが、本日よりSix Apartで働くことになりました。 こうして報告エントリを書こうとしているとなんだか感極まったりして、ブログの過去ログを見直しているのですが、今の自分があるのは、このブログを見てくれて、自分の拙いプラグインを使ってくださった皆様のおかげだと、実感しています。本当にありがとうございました。 これからも愉快なプラグインを作ったりなどするべく、頑張っていきたいと思います。...

September 16, 2008

息を吐くようにMTMLを書く。

最近、友人との遊び目的で、プライベートなサイトをMTで作っています。 テンプレートには、Mid-Centuryを適用してみました。なかなか使い勝手が良いです。 そのサイトでは、大量のオーディオファイルや、特定のエントリーなんかをまとめたページを手軽に作りたくて、こんなカスタマイズをしています。 まず、MT4.2の新機能のグローバルモディファイアmtevalを使って、ウェブページに直接MTMLを書けるようにします。ただし、全部を対象にしてしまうのも気持ち悪いので、プライベートタグ「@eval」をつけてあるものだけを対象にするようにします。 <mt:PageIfTagged tag="@eval"> <mt:PageBody mteval="1" /> <mt:else> <mt:PageBody /> </mt:PageIfTagged> これで、ウェブページに簡単にMTMLを書けるようになりました。 さて、MTMLで満足な出力結果が得られるようになったら、今度はサイトのトップページなどに導線を作りたいところ。 MT4.1以前で、インデックステンプレートを利用してページを作っていた場合、ここでどうしてもひと手間かかっていました。 今回はウェブページを利用しているので、以下のように、プライベートタグ「@nav」の付けられたウェブページをサイトのトップナビゲーションに表示するよう、事前に作成しておきました。 <div id="nav"> <div id="nav-inner"> <ul> <li class="home"><a href="<$MTBlogURL$>">Home</a></li> <li><a href="<$mt:Link template="archive_index"$>">Archives</a></li> <mt:Pages tag="@nav"> <li><a href="<mt:PagePermalink>"><mt:pageTitle></a></li></mt:Pages> </ul> </div> </div> ちなみに、mid-centuryのトップナビゲーションは初期状態では、「バナーヘッダー」モジュールテンプレートの中で、mt:ignoreで無効化されています。該当箇所のmt:ignoreを削除すれば有効になります。 これで完成。かなり快適です。...

September 11, 2008

google chrome から投稿

google chrome から投稿。 TaggingHelper は動いてるけど、CustomEditorButton2は動作せず。 いや、動いてはいるな。なんかクリックの感知が安定してない感じだ。ダブルクリックすると動いたりする。。。なんぞこれー

September 3, 2008

Movable Type Developer Conference に参加できませんでした。

とんだ出落ちですみません。会社の休みもらえたのが、締め切りの次の日だったんです。フライングで申し込んでおけば良かったと今になって思うも後悔先に立たず。 でまあ、結局一日家でUstreamに張り付いてずっと見ていたので、割と満足。ちょっとした感想くらいなら述べることも出来るというものです。 興味深かったのはやはり Beau Smith さんのパブリッシングに関する話。 アーカイブやインデックステンプレートごとに更新頻度とページビューを予想してパブリッシュの方法を決めろ、ただしサイトごとに傾向は違ってくるので頑張れ、という話だったと思います。 ただ、現実的に、そう簡単に最適解が出せるかというと難しいと思います。その一番の理由は、定量的に再構築の回数を観測出来ないからです。 これってでも、実現できそうですよね。 再構築の回数を記録してFileinfoテーブルにでも突っ込んでおくと、パフォーマンスの測定に役立つのでは無いか。 もっと突き進めれば、ページビューのデータも取得するようにして、View / Build Ratio みたいな値を定期的に算出し、ファイルごとに最適なパブリッシング方法をMTが自動的に設定してくれる、なんてことも出来るかも。という妄想をいたしました。 あとはLightingTalkが大変楽しそうでしたね。Ustreamの画面だと実動作のデモは視聴がちょっと辛くはありましたが、それでも、すごくいい雰囲気が伝わってきました。 変態テンプレート好きの自分としては、mt:EntryPreviousのネスト技の話が一番ツボにハマりました。今なら、mt:setVarTemplateを再帰させてゴニョゴニョしても面白いかも。という妄想をいたしました。...

August 21, 2008

[mtplugins] CustomEditorButton2 0.3

CustomEditorButton2_0_3.zip MT4.2 でボタンの配置が保存できなくなっていた問題に対応しました。 機能追加などはありません。MT4.1で利用を続ける場合は、アップグレードの必要はありません。 CustomEditorButton2の以前のバージョンからアップグレードする場合には、事前に(MT_HOME/)plugins/CustomEditorButton2/config.yaml ファイルを削除してください。誤動作の可能性があります。 このバージョンから、諸事情により、デフォルトのボタンは別プラグインとして同梱される形になりました。 パッケージを見ればすぐわかると思うので、デフォルトのボタンが気に食わない場合はサクッと消してしまってください。 あと、この間気づいたのですが、FastCGI環境だとうまく動かないみたいですね。近いうちにその辺を修正したバージョンを出そうと思います。...

August 21, 2008

blog it from iPhone

...

August 11, 2008

「Movable Type 4.2 パーフェクトガイド」にBuild Tracerが掲載されてます。

小粋空間のyujiroさんの著書Movable Type 4.2 パーフェクトガイドが発売になりました。おめでとうございます! しかも、一冊戴いてしまいました。ありがとうございました! Movable Type 4.2 パーフェクトガイド 荒木 勇次郎 時間を見ては目を通しているのですが、本当にすごいボリュームです。しかも、随所にコラムとして関連情報へのポインタが含まれていて、情報の密度も半端じゃないです。手に取った瞬間に、並大抵ではないエネルギーが費やされている一冊だと分かります。すばらしいです。 改めてyujiroさん、お疲れ様でした。 それでですね。なんと!パーフェクトガイド内で、当サイトで公開しているプラグインBuild Tracerが紹介されています。しかも、通常のプラグイン紹介とは別枠で、パーフェクトガイドのメインともいえるテンプレート解説の冒頭付近に一ページ強を割いて掲載されていました。見た瞬間変な汁が出ました。 あの超ニッチなプラグインを取り上げられるとは、これは、自分も頑張らなくちゃとやる気がたくさん出ました。ありがとうございました! IndexContextプラグインもピックアップされてました。うぇーい。

August 7, 2008

TaggingHelper For MT4.2

そろそろ、当サイトで配布しているプラグインをMT4.2に対応させていく必要があるのですが、今回は色々動かなくなるものが多くて、頭を抱えています。 とり急ぎTaggingHelperを対応させました。まったくの暫定版なので、バージョン外とします。 Movable Type / MTOS 4.2 でのみ動作します。また、タグの使用頻度順でのソートが出来ません。 TaggingHelperForMT4_2.zip...

August 6, 2008

iPhone用テンプレートを導入してみました。

cremaさん作成の iPhoneテンプレート for MT を、このブログに導入してみました。iPod TouchやiPhoneをお持ちの方は、アクセスしてみてください。 テンプレートは以下のページで配布されています。すばらしいです。 「iPhoneテンプレートfor MT」を公開いたします。|iPhone|東京Webデザイナー日記リターンズ|crema design なお、 iPhoneテンプレートはブログURL内の「i」ディレクトリに出力する仕組みになっていますので、iPhoneでアクセスする時に専用のURLにアクセスする必要があります。 このブログでは、インストールの際に以下のようなカスタマイズを行って、PCでの閲覧時と同じURLになるようにしてみました。 追加したiPhoneテンプレート内のトップページとブログ記事アーカイブへのリンクを、通常のものに書き直す。 画像やcssファイルなどへのリンクは変更しない アーカイブマッピングは、「i」ディレクトリ内へ出力する設定のままにする ブログトップの.htaccessに以下を追加。 RewriteCond %{HTTP_USER_AGENT} (iPhone|iPod) RewriteCond %{REQUEST_URI} !^/i/ RewriteRule ^(.*)\.html$ /i/$1.html [L] .htaccessの記述は、利用しているサーバーによっては上手く動かないかもしれません。またその場合、即座にサイト全体が500エラーになってしまうような事態も考えられます。.十分注意して作業を行ってください。

August 5, 2008

mt:ifStaticとmt:ifDynamicは似て非なる物。

自分は、今見ているテストページがスタティックパブリッシングとダイナミックパブリッシングのどちらによる出力なのか、一目で分かるように、以下のような表示をさせておくことがあります。 このテンプレートは<mt:ifDynamic>ダイナミック<mt:else>スタティック</mt:ifDynamic>で構築されました。 いくらPerl弄っても動作が直らないと思ったらPHPのほうに問題があった。何を言ってい(ry等と言うことにならないためですね。 さて、ここでちょっとした罠があります。mt:ifDynamicと対になるようなテンプレートタグmt:ifStaticでは、このような書き方は出来ません。 このテンプレートは<mt:ifStatic>スタティック<mt:else>ダイナミック</mt:ifStatic>で構築されました。 上記テンプレートは、スタティックでは期待通りに動きますが、ダイナミックでは以下のような出力になってしまいます。 このテンプレートはで構築されました。 原因は、mt:ifStaticタグのPHPでの実装が、テンプレートタグとしてではなく、コメント(のような)扱いになっているためです。 <mt:ifStatic>・・・</mt:ifStatic>の部分が、再構築より前に強制的にテンプレートから削除されてしまうんですね。なので、その中に何個mt:elseを書こうが、全部消えてしまうわけです。mt:ignoreと同じですね。...

August 1, 2008

iPhoneに感じるワクワク感の正体が判明した。

購入以来、それはもう指紋の跡が消える暇が無いほど、むしろ俺の指紋が消えちまうんじゃないかと思うくらい触りまくってるiPhoneですが、最高です。 バッテリーもとりあえず普段の会社往復の間は持つようだしアプリは楽しいしとりあえず生活圏ではwi-fiか3Gのどちらかは拾えるし余りに楽しいのでアプリ開発したくなって金無いのに真剣にMacBookの購入を検討し始めたりしてるわけです。 で、ですね。なんか、単純に外でウェブに繋がるとか、iPodと電話が一緒になったとか、そういう個々の具体的な機能についてとは、まったく別の次元のワクワク感を、iPhoneを触るたんびに感じるんですよ。 だって不思議じゃないですか? あの愛想の無い、ともすれば上下間違えてスリープボタン押せなかったりするのっぺらぼうなデザインのクセに、ひとたびロック解除すれば触る撫ぜる傾ける音が出る話す震える表示する移動する、と、あらゆる手段でのインターフェイスが提供されていて、およそコンピュータに出来そうな事ならいつ何時でも反応してくれる。 それなのに電源切れば、ほとんどただの板。 このギャップにスゲエワクワクするんです。 そのワクワク感の正体が今日分かりました。気づきました。 iPhoneって東京探偵団に出てきた「CJカード」を現実にしてしまったんだな、と。 東京探偵団ってのは「ギャラリーフェイク」や古くは「さすがの猿飛」「GU-GUガンモ」の作者の細野不二彦が書いていた、ホモの少年と守銭奴の少女とマゾの少年で構成される探偵事務所が超巨大財閥の金の力を後ろ盾にホモの中年が起こす事件を金の力で解決するという内容の傑作マンガです。 wikipediaによると連載は'85-'87年ですので、当時自分は小6くらいで読んでたんでしょうか。 そのマンガの中で、探偵団の一人が落とした探偵団専用のスペシャルクレジットカード「CJカード」を貧しい家出兄妹が拾う、という話があるのですが、そこで描かれるカードの機能がとにかく凄いんですよ。 クレジットカードとして勿論最強。何しろ日本に10枚と無い超スペシャルカード。限度額無限。取り出した瞬間即VIP待遇。 そして、ここが大事なのですが、一見ただのクレジットカードなのに、ちょっとカードの端を触って操作すると、音楽が聴ける、ファミコンが出来る、ショッピングも出来る、テレカにもなる、位置情報も確認できる、お父さんに会いたいとカードに話しかければ、居場所を音声で答えてくれる。なんだか分からないくらいハイテクな色々が詰め込まれた超高機能カード。 このエピソードの肝は、ただのカードなのに、家出兄妹の希望を次から次へと叶えていくという、そのファンタジーにあったと思います。そこで描かれていたものは、まさに「魔法のカード」でした。子供心に凄く憧れ、何度も読み返したことを今でも覚えています。 そして20年が過ぎ、iPhoneが今、手の中にあります。 ゲーム、音楽、電話。加速度センサー、GPS、そしてマルチタッチディスプレイ...。20年前のマンガに登場したファンタジー、子供だった当時の自分が憧れた魔法のほとんどが、この板状の小さいボディに実現されています。これは、ワクワクせざるを得ませんよね。 子供の頃のそんな記憶を思い出しながら、ぼーっと黒いiPhoneを眺めていると、これって本当「魔法のカード」と呼ぶにふさわしい代物だと思えてきてしまいます。そりゃカードと呼ぶには少々分厚くて大雑把ですが、少なくとも、電話の受話器から発展してきた携帯電話のデザインと比べて強いてどちらかといえば、間違いなくカードでしょう。 ぱっと見は何も出来なさそうなのに、ちょっと触るだけで万能的に要求に答えてくれるという感覚。 これは、10キーのついた受話器の末裔たちからは絶対に感じ取ることの出来ない、特別な快楽なんじゃないかな、と思います。

July 25, 2008

驚くほどあっさりとiPhoneをGetした。

そう、それは三日前の土曜日。驚くほどあっさりとiPhoneを入手できました。イエー。バッバッ。 発売フィーバー直後、遅れて何件か量販店など回ってみたものの、カスリもしなかったので「これは厳しいな」と思っていましたところ。 発売から一週間後となる先週末。 友人と遊ぶ予定もあって朝から開店待ちをするわけにも行かず、iPhoneを入手出来るのは当分先だなと諦めていた三連休初日の午後5時過ぎ。場所は23区内の某駅前。 お遊びも一段落、これから飲みに行くぞ、という時に、ちょっとお金を下ろしに銀行に寄ったんですよ。 で、その隣か隣の隣にソフトバンクショップがあったので、冷やかし半分で店員に聞いてみました。 「iPhoneの在庫はありますか」 「ありません」 当然の答えが返ってきました。ですよねー。 おおう。これで終戦。とも思ったのですが、明日以降のリサーチのために、入荷数や行列の様子などを店員さんに聞いてみました。すると、 「Softbank端末からの機種変更でしょうか?」 逆に質問が帰ってきました。 質問を質問で返すんじゃねえぞとも思ったのですが、そこはチキン大人な自分なので 「いえ、iPhone目当てで他キャリアからソフトバンクさんに乗り換えようと決心しております!」 とかそんなことを言ってみました。すると、おおなんということでしょう。店員さん、急に張り切って 「予約分のキャンセルが無いか、電話で確認してみますので、ちょっとお待ちいただけますかー」 とか言いつつどこかへ走っていきます。 あれ、なにこの展開。 大昔には、新規ゼロ円機種変万円なんて時代もあったけど、今でもそんなメソッド使えるの?とgkbrしながら待つこと数分。 「16Gのブラックでよろしかったでしょうかー」 「2階の契約カウンターでお待ちいただけますかー」 なんと。ktkr。 後はあっという間でした。MNPの手続きから何から面倒見てもらって、30分程度で俺の手元に俺のアクティベーション済みの俺のiPhoneが。 飲み会を半分すっぽかしてしまった友人には申し訳なかったが(合流後iPhoneネタで盛り上がったので良しとする)、こんな棚ボタでiPhoneをGetできた自分は超ラッキーだと思います。イエー。バッバッ。...

July 22, 2008

iPhoneから投稿。

...

July 19, 2008

googleの面接のパズルを颯爽と解いてみた。

タイトルは99%関係ないんですがね。こういうパズル大好きなんですよ。 1025 学名ナナシ :2008年07月15日 21:46 今までこれ系で一番難しかったのは、 13枚のコインがあって、1枚だけ偽者があります。 偽者は重いのか軽いのかはわかりません。 天秤を3回だけ使ってどのコインが偽者か当てなさい。 どうしても解けない... googleの面接 : アルファルファモザイク ↓10分くらいで考えた回答 とりあえず、(1)から(13)まで番号を振る (1)(2)(3)(4)と(5)(6)(7)(8)を天秤に乗せる 傾いたら 残りの(9)-(13)は本物 (1)(2)(3)(5)(6)と(9)(10)(11)(12)(13)を天秤に載せる 傾いたら ここで偽者が重いか軽いかが判明 かつ、一回目の結果を考えると、(1)(2)(3) OR (5)(6) のいずれに偽者が含まれるかも判明 (1)(2)(3)に偽者が含まれるなら (1)と(2)を比較。 (5)(6)に偽者が含まれる (5)と(6)を比較 傾かなかったら (4)(7)と(12)(13)を比較 傾いたら 偽者が重いか軽いかが分かる。 かつ、一回目の結果を考えれば、(4)と(7)のどちらが重いか分かるので、判定可能 傾かなかったら (8)が偽者(重いか軽いかは分からず) 傾かなかったら 残りの(9)-(13)に偽者が含まれる。(1)から(8)は本物 (1)(2)(3)と(9)(10)(11)を天秤に 傾いたら 偽者が重いか軽いかが分かる (9)と(10)を天秤に 傾かなかったら (12)(13)のいずれかが偽者 (1)と(12)を天秤に で、perlで書いてみた。 #!/usr/bin/perl use strict; sub which_is_heavy { my ($left, $right) = @_; #この辺は本来ならブラックボックス my ($left_mass, $right_mass); map { $left_mass += $_ } @$left; map { $right_mass += $_ } @$right; return $left_mass > $right_mass ?...

July 17, 2008

[mt.js]mt:tabを使ってみる

MT4の管理画面では、かなりしっかりした独自のJavaScriptライブラリ(mt.js)が用意されています。Transformerやalt-tmplでの管理画面のカスタマイズに応用できると良いのですが、残念ながら、今のところまとまったドキュメントも無く、応用するのが難しい状況です。 でもやっぱり、そんな使えるライブラリを放置するともったいないお化けが出るぞ、ということで、mt.jsの機能の中で一番簡単そうな、タブ機能の使い方を調べてみました。 以下、Movable Type の管理画面内でタブ(同ウィンドウ内での一部画面の切り替え)を実現する場合のサンプルコードです。 以下コードを、ファイルに保存してalt-tmplディレクトリに「dashboard.tmpl」とかの名前で置くと動くと思います。 <mt:setvarblock name="page_title">mt:tab test</mt:setvarblock> <mt:include name="include/header.tmpl"> <h2>サンプル1 : tab-container の骨格部分</h2> <style type="text/css"> #sample1 .hidden { display: inline !important; color: #aaa; } </style> <span id="sample1" mt:delegate="tab-container"> <span mt:tab="foo" mt:command="select-tab">foo</span> <span mt:tab="bar" mt:command="select-tab">bar</span> <span mt:tab="buz" mt:command="select-tab">buz</span> <span mt:tab-content="foo"> foofoofoo </span> <span mt:tab-content="bar"> barbarbar </span> <span mt:tab-content="buz"> buzbuzbuz </span> </span> <mt:include name="include/footer.tmpl"> このサンプルは敢えてタブらしくない動きにしてます。見ての通り、JavaScriptは一切書かずに動きます。 先頭の「foo bar buz」の部分をクリックすると、それに応じて後続の部分のstyle属性が変化し、見た目も変わると思います。firebugなどで各要素のclass属性の変化を追ってみてください。 大雑把な動作プロセスとしては、 mt:delegate="tab-container"が指定された要素の内側では 属性「mt:command="select-tab"」が指定された要素がクリックされたら その要素のmt:tab属性で指定されたタブのID(foo)を表示するように mt:tab-content属性を持ち、そこに同じタブID(foo)が指定されている要素のclassから「hidden」を取り除き mt:tab-content属性にタブID(foo)が指定されていない要素にはclass「hidden」を追加する という動作になります。 MTの管理画面では事前に設定されているcssにより、「hidden」クラスは非表示となるので、タブらしい動作が実現できるというわけです。 以下、ちょっとだけcssを追加してみたバージョンです。お試し下さい。 <mt:setvarblock name="page_title">mt:tab test</mt:setvarblock>...

June 19, 2008

TaggingHelperお試し版

Firefox限定ですが、プラグインをインストールせずに動作確認が出来るお試し版を用意してみました。 Movable Type のブログ記事を書く画面が開いている状態で、以下のコードを全選択コピーして、ブラウザのアドレスバーに直接貼り付けEnter、として実行してみてください。 MT4用。 javascript:(function(){var th = document.createElement('div');th.id = 'tagging_helper_container';th.innerHTML = 'ABCfreqmatchclose こちらはMT3用。 javascript:(function(){var th = document.createElement('div');th.id = 'tagging_helper_container';th.innerHTML = 'ABCfreqmatchclose 動作が気に入ったら、是非プラグインをインストールして使ってみてください。 プラグインのページ ちなみに、IEでは上手く動きませんでした。残念。 というか、Firefoxはbody中にscript経由で突っ込まれたlinkタグも読み込んでしまうんですね。試してみたら動いたのでびっくりしました。

May 29, 2008

TaggingHelper0.3を公開します。

TaggingHelperの新しいバージョンを公開します。久しぶりの更新となりますね。 TaggingHelper.0.3.zip blog.aklaswad.com: TaggingHelper 主な更新内容はこちら。 タグ一覧を、使われている頻度順で表示するモードを追加した。 本文に含まれる文言のタグを抽出して表示するモードを追加した。 シングルクオートを含むタグが扱えない問題に対応した。指摘してくれたTrackback(774)さんありがとうございます。 タグの途中で改行してしまう問題に対応した。 内部構造をちょっと変更した結果、どうやらSafari、Operaなどのブラウザでも利用可能となっているようです。Windows版のSafari3.1.1、Opera...

May 29, 2008

CustomEditorButton2用ボタン追加プラグイン

拙作のCustomEditorButton2,使ってくれている方がいるみたいで大変嬉しいです。 以下のサイトでは、ボタン追加が出来るプラグインが配布されています。すばらしいですー。 こだるま日和 - CustomEditorButton2 用のフォント色指定ボタンを作ってみた かたつむりくんのWWW | CEB2_plusUtility 特に、「かたつむりくんのWWW」さんで配布されているCEB2_plusUtilityはかなりゴージャスです。 dl/dt/ddタグの挿入や、引用元表示機能付きblockquoteボタンとかは、自分でも欲しくてそのうち作ろうと思っていたので、大変嬉しいです。 かたつむりくんのWWW | CEB2_plusUtility さらに、「引用元のURI + 改行 + 引用元のタイトル + 改行 + 引用文」という書式で書いて選択すると、引用元のURIをblockquote要素のcite属性に追加し、引用元のタイトルをblockquote要素のtitile属性に追加できます。 公開されているプラグインについては、プラグインページにも一覧を作って、適時アップデートしていきたいと思います。CEB2用プラグイン作ったよ公開するよ、という方は、トラックバックなどしていただけたら嬉しいです。 他にも、配布はしていないが、自分でボタン作って使っているよというエントリーもちらほら見かけました。...

May 2, 2008

CustomEditorButton2用の追加プラグイン「EntryUtilButtons」作りました。

HTMLのマークアップ補助ではない系統のボタンもあれば便利だよな、と作ってみました。CustomEditorButton2プラグインと併用することで、ブログ記事編集画面に以下の3 つのボタンを追加します。 タギングボタン 本文中から単語を選択した状態でこのボタンを使うと、選択部分をタグ欄に追加します。普段タグ入力補完ばかりに頼っていたら、タグクラウドの成長が止まってしまった、という症状に効きます。 時間あわせボタン エントリーの公開日欄を、現在の時刻に合わせます。エントリーを書いていたら日付が変わってしまった。しかし昨日の日付が公開日となるのは納得できない!という場合に便利です。 タグ削除ボタン 選択範囲に含まれるHTMLタグっぽいもの(<と>で挟まれた部分)をごっそり削除します。MTデフォルトのリストボタンでリストを作成中、後から追加を行いたいが自分でliとか書きたくない、でもアンドゥも出来ない、なんて場合、このボタンを使って一度マークアップ無しの状態に戻し、行を追加した後に再度リストボタンを適用する、なんて使い道が考えられます。リッチテキストフォーマットでも各種の文字装飾の削除に利用できますが、改行まで消し飛んでしまうので諸刃の剣。 このプラグインを利用するためには、同じ環境にCustomEditorButton2がインストールされている必要があります。 ダウンロードする: EntryUtilButtons0.1.zip

May 2, 2008