<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>blog.aklaswad.com</title>
    <link rel="alternate" type="text/html" href="http://blog.aklaswad.com/" />
    <link rel="self" type="application/atom+xml" href="http://blog.aklaswad.com/atom.xml" />
    <id>tag:blog.aklaswad.com,2009-02-03://2</id>
    <updated>2010-01-05T12:49:28Z</updated>
    
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Pro 4.25</generator>

<entry>
    <title>MTMLからTwitterにアクセスするプラグイン書いた。</title>
    <link rel="alternate" type="text/html" href="http://blog.aklaswad.com/2010/000462.html" />
    <id>tag:blog.aklaswad.com,2010://2.462</id>

    <published>2010-01-05T12:49:19Z</published>
    <updated>2010-01-05T12:49:28Z</updated>

    <summary>簡単なTwitterのbotを作ってみようと思ったのですが、普通にperlとかで...</summary>
    <author>
        <name>aklaswad</name>
        <uri>http://blog.aklaswad.com/</uri>
    </author>
    
        <category term="Hack" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mtml" label="mtml" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="twitter" label="twitter" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-us" xml:base="http://blog.aklaswad.com/">
        <![CDATA[<p>簡単なTwitterのbotを作ってみようと思ったのですが、普通にperlとかで書くのもつまらないので、MTMLでボットを書けるようなプラグインを作ってみました。</p>

<ul>
	<li><a href="http://github.com/aklaswad/mt-plugin-mtml-twitter-api">aklaswad's mt-plugin-mtml-twitter-api at master - GitHub</a></li>
</ul>

<p>右上の「Download Source」ボタンからダウンロードできます。なかなかサックリ書けたと思います。</p>

<p>そして、早速、占いをするボットを作ってみました。</p>

<ul>
	<li><a href="http://twitter.com/mturanai">MT占い (mturanai) on Twitter</a></li>
</ul>

<p>Twitterで@mturanaiあてに投稿すると、占いらしき返事を返します。お暇な方は遊んでみてください。</p>

<p>以下プラグインの説明。<br />
</p>]]>
        <![CDATA[<p>MTMLTwitterAPIプラグインをインストールすると、以下の二つのブロックタグが利用可能になります。</p>

<ul>
	<li>mt:TwitterMentions</li>
	<li>mt:TwitterStatusUpdate</li>
</ul>

<h4>使用上の注意</h4>

<p>これらのタグが動作するたび(=これらのタグが書かれたテンプレートが再構築されるたび)に、ネット経由でのAPIアクセスが発生します。そのため、通常の更新を行うサイトのテンプレートで利用する目的には向きません。最悪、致命的なパフォーマンス低下を起こし更新不能となる場合も考えられますので、十分ご理解いただいた上でご利用ください。</p>

<h4>mt:TwitterMentions</h4>

<p>特定ユーザーに対しての@付き発言を取得し、取得した発言の分だけ繰り返しを行うブロックタグです。<br />
ブロック内では、各発言についての情報が以下の変数に設定されます。</p>

<ul>
	<li>id</li>
	<li>text</li>
	<li>name</li>
	<li>screen_name</li>
</ul>

<p>以下のモディファイアを指定できます。</p>

<dl>
<dt>endpoint</dt>
<dd>エンドポイントのURLを指定します。通常は指定する必要はありません。
twitterのAPI仕様が変更になった場合や、twitter互換の別サービスを利用する場合に指定すると良いと思います。</dd>
<dt>username</dt>
<dd>twitterAPIを利用するユーザーのログインネームを指定します。必須です。</dd>
<dt>password</dt>
<dd>twitterAPIを利用するユーザーのパスワードを指定します。必須です。</dd>
<dt>timeout</dt>
<dd>リクエストのタイムアウトまでの時間を設定します。デフォルトでは10秒になっています。</dd>
<dt>fatal_error</dt>
<dd>何らかの理由でリクエストが失敗した場合に再構築を終了したい場合には1を指定してください。デフォルトでは、リクエストに失敗しても致命的エラーとはならず、再構築が続行されます(エラーの記録はMTのログから確認できます。)</dd>
<dt>new_mentions_only</dt>
<dd>twitterAPIから取得したデータには、最近の(２０?)件のデータが含まれています。デフォルトでは、一度でも取得した事のあるデータに関しては処理をスキップする仕様になっています。もし何らかの理由で常に(20?)件のデータの処理を行いたい場合、<em>new_mentions_only=0</em>を指定してください。</dd>
<dt>namespace</dt>
<dd>同一MT上で複数のTwitterMentionsタグを運用しており、上記所得済みデータの判定を使い分けたい場合に指定します。</dd>
</dl>

<p><br />
<h4>mt:TwitterStatusUpdate</h4></p>

<p>Twitterに対して発言を行うブロックタグです。mt:TwitterStatusUpdateタグで囲まれた内容の再構築結果をTwitterにポストします。</p>

<dl>
<dt>endpoint</dt>
<dd>エンドポイントのURLを指定します。通常は指定する必要はありません。
twitterのAPI仕様が変更になった場合や、twitter互換の別サービスを利用する場合に指定すると良いと思います。</dd>
<dt>username</dt>
<dd>twitterAPIを利用するユーザーのログインネームを指定します。必須です。</dd>
<dt>password</dt>
<dd>twitterAPIを利用するユーザーのパスワードを指定します。必須です。</dd>
<dt>timeout</dt>
<dd>リクエストのタイムアウトまでの時間を設定します。デフォルトでは10秒になっています。</dd>
<dt>fatal_error</dt>
<dd>何らかの理由でリクエストが失敗した場合に再構築を終了したい場合には1を指定してください。デフォルトでは、リクエストに失敗しても致命的エラーとはならず、再構築が続行されます(エラーの記録はMTのログから確認できます。)</dd>
</dl>

<h4>使い方</h4>

<p>ブログのメインページにTwitterStatusUpdateを設置して再構築頻度を観察するという使い方もあるかと思いますが、やっぱりボットを作るのが一番の醍醐味かと思います。</p>

<p>以下は、実際に@mturanaiを運用しているテンプレートです。</p>

<p><script src="http://gist.github.com/269265.js"></script></p>

<p>どっさりと配列を用意した上で、ランダムに配列の中身を取り出して返信しています。<br />
(MTのデフォルトでは乱数を所得するタグはありませんが、twitterの更新速度が充分速いので、twitterの発言idを乱数として利用しています。)</p>

<p>実際にボットとして運用するために、ローカルマシン上で動作しているMTにテンプレートを作成しておき、cronで定期的に再構築を行っています。</p>

<pre class="code">*/2 * * * * cd /Users/aklaswad/Sites/cgi-bin/greyhound; ./tools/mt-tmpl-test -b=2 -t=186
</pre>

<p>enjoy!</p>]]>
    </content>
</entry>

<entry>
    <title>MT関係のイベントに参加しました。</title>
    <link rel="alternate" type="text/html" href="http://blog.aklaswad.com/2009/000461.html" />
    <id>tag:blog.aklaswad.com,2009://2.461</id>

    <published>2009-12-15T02:49:06Z</published>
    <updated>2009-12-15T02:53:53Z</updated>

    <summary>MT5がリリースされ、MT関連のイベントも賑やかになってきました。 ここ何週間か...</summary>
    <author>
        <name>aklaswad</name>
        <uri>http://blog.aklaswad.com/</uri>
    </author>
    
        <category term="Movable Type" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="daily memo" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="http://blog.aklaswad.com/">
        <![CDATA[<p>MT5がリリースされ、MT関連のイベントも賑やかになってきました。<br />
ここ何週間かの間に、いくつかのMT関係のイベントに参加しました。ずいぶん遅くなってしまったものもありますが、まとめてレポート書きたいと思います。</p>

<h3>第1回MT5勉強会</h3>
<a href="http://www.dakiny.com/">Dakinyさん</a>主催の、有志による勉強会です。
MT5.0リリースの直後に行われたところに、無理矢理参加させていただきました。急な参加をお願いしてしまい、運営の皆様には大変ご迷惑をおかけしたと思います。有り難うございました。

<p>ワークショップでは、テーマ作成のテーブルに参加させていただきました。<br />
自分の作業を進めつつ、時にはテーマ機能のいろんな側面に関してディスカッションになったり、現場で想定される運用について貴重な意見をいただいたり、すごく勉強になりました。<br />
なお、いくつかの点で動作がおかしいという指摘を頂き、原因が分からず後半はかなり挙動不審になってた事をお詫びいたします。バグ怖いねん。</p>

<p>その後の懇親会では、すごく楽しい時間を過ごさせていただきました。</p>

<h3>Movable Type エンジニアの夕べ</h3>

<p>続いて、<a href="http://www.skyarc.co.jp/">スカイアーク</a>さんの主催の、MT関係のエンジニアで集まってのライトニングトーク大会+MTカルトQというイベントに参加しました。</p>

<p>ここでは、僕もLTに参加させていただき、個人的に作成しているネタ系(?)プラグインのTagOverrideを紹介させていただきました。</p>

<div style="width:425px;text-align:left" id="__ss_2687115"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/aklaswad/mt-tag-override" title="MT Tag Override">MT Tag Override</a><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mttagoverride-091209202806-phpapp01&stripped_title=mt-tag-override" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mttagoverride-091209202806-phpapp01&stripped_title=mt-tag-override" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">presentations</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/aklaswad">aklaswad</a>.</div></div>

<p>他の方のLTも、興味深いものばかりでした。</p>

<p>そしてクイズ大会!<br />
全十問で、シックスアパートのロゴはどれかと言うような、間違うはずが無い<a href="http://www.goodpic.com/">!</a>問題から、実在しないコールバックポイントはどれかという技術的カルトクイズまで盛りだくさんで、非常に楽しめました。</p>

<p>いや、始まる前は全問正解余裕すぎると思っていたのですが。<br />
言い訳ですが、なんか問題文を見てると「あれ、あのコールバックは実装されている筈だけど、実はバグで動いていないという引っかけ問題なのでは・・・！？」と疑心暗鬼になってしまい。バグ怖いねん。<br />
結果、トップに一歩及ばずの八問正解でした。<br />
優勝された<a href="http://www.zelazny.mydns.jp/">oscar</a>さん(ネタにさせてもらってすみません)、同率首位ながらおしくもジャンケンで敗れた<a href="http://smallworld.west-tokyo.com/">にっく</a>さん、参りました。おめでとうございます！</p>

<p>懇親会は、これまた楽しかったです。BodyMoreってエ(謎)。<br />
その後はあまり記憶がありません。平日なのに。</p>

<h3>Movable Type Designers and Developers Conference in Osaka</h3>

<h4>day1</h4>

<p>MTのリリース恒例のカンファレンス第一弾がなんと、初の大阪遠征というかたちで行われました! <br />
それもカンファレンスとハッカソンの2Daysです。</p>

<p>カンファレンスでは、テーマ機能についてお話しさせていただきました。プレゼン資料はこちらからご覧いただけます。</p>

<p><a href="http://blog.aklaswad.com/theme_quest/">テーマの冒険</a></p>

<p>また、テーマ機能のデモンストレーションを兼ねて、プレゼン資料の作成に特化したテーマ「Slidon」を作成したうえで、MT上でプレゼン資料を用意するという試みを行いました。<br />
資料作成に利用したテーマも、ダウンロードしてお試しいただけたらと思います。</p>

<p><a href="http://github.com/aklaswad/slidon" title="aklaswad's slidon at master - GitHub">aklaswad's slidon at master - GitHub</a></p>

<p>上記リンク先ページで、「download」ボタンをクリックしてダウンロードしてください。「Slidon」テーマは、今後も継続的に開発を進めていけたらと思います。</p>

<p>また、後半のライトニングトークでは、mt-tmpl-testというツールについても発表しました。資料も無く、かなり分かりづらい発表になってしまった事をお詫びいたします。ある意味BuildTracerの兄弟的な位置づけのツールでもあるので、機会があれば改めてエントリーを書けたらと思います。</p>

<p>その後の懇親会は以下略。沢山次会しました。</p>

<h4>day2</h4>

<p>二日目はハッカソン。前半では<a href="http://twitter.com/awayuki">awayuki</a>さんとマルチドメインでのMTの運用について考えつつ、後半はBuildTracerのMT5対応版を作ってました。<br />
BuildTracerについては、色々技術的な困難を抱え込んでしまい、なかなか解決できないまま終了。。。MT5対応にはもう少し時間が必要なようです。<br />
ハックタイム終了後は、ビール飲みつつワイワイガヤガヤと成果発表会。楽しかったです!<br />
会場をお貸しいただいた<a href="http://alfasado.net/">アルファサード</a>の<a href="http://junnama.alfasado.net/online/">Junnama</a>さん、<a href="http://weeeblog.net/">okayama</a>さんには本当にお世話になりました。有り難うございました!</p>

<h4>余談</h4>

<p>ハッカソン中に、カンファレンスで使用した、MTで出力したスライド資料をまとめていました。<br />
その際、ブログのテンプレート中でBlogURLやAssetURLを利用していると、リンクが絶対URLで作成されてしまい、配布には向かないという状況になりました。<br />
その時「あれ、これってTagOverrideで無理矢理タグの出力を相対パスに変換すれば解決できるんちゃう」と閃きまして。ちょっとした試行錯誤の末、上手い事出来たんです!<br />
いやあ、<del datetime="2009-12-15T01:28:57+09:00">ネタ</del>思いつきで作ったプラグインでも、きちんと役に立つ場面があるもんですね。</p>

<p><ins datetime="2009-12-15T01:30:51+09:00">※ ハッカソン中、上記閃きに関して自分自身を絶賛するような独り言がうるさかった事をお詫びいたします。</ins></p>]]>
        
    </content>
</entry>

<entry>
    <title>Re: [Perl]MT形式のエクスポート用に出力をエスケープする</title>
    <link rel="alternate" type="text/html" href="http://blog.aklaswad.com/2009/000460.html" />
    <id>tag:blog.aklaswad.com,2009://2.460</id>

    <published>2009-10-24T07:13:32Z</published>
    <updated>2009-10-24T07:46:33Z</updated>

    <summary>MT形式のエクスポート用に出力をエスケープする - 刺身☆ブーメランのはてなダイ...</summary>
    <author>
        <name>aklaswad</name>
        <uri>http://blog.aklaswad.com/</uri>
    </author>
    
        <category term="Movable Type" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="movabletype" label="movable type" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="エクスポート" label="エクスポート" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-us" xml:base="http://blog.aklaswad.com/">
        <![CDATA[<p><a href="http://d.hatena.ne.jp/a666666/20091022/1256213712">MT形式のエクスポート用に出力をエスケープする - 刺身☆ブーメランのはてなダイアリー</a></p>

<p>そうか。MTのエクスポート形式って業界標準なのか。。。</p>

<p>エスケープ結果を復元するコードが無かったので自分で書こうとしたが、もとのコードだとエスケープ後のデリミタと同じパターン(-----&lt;&gt;など)が元の文字列に存在した時に、正確に復元できないという問題に気づいたが、あきらめて風呂に入っているうちに解決策を思いついた。<br />
文字列中のすべての「-」のみの行を３倍とかに変更してしまえば、安全にエスケープでき、かつラウンドトリップ可能となるはずです。<q>3倍なのは本来のデリミタ( '-' x 5 || '-' x 8 )と重複しないためで、彗星と直接の関係ありません。</q></p>

<p><script src="http://gist.github.com/217424.js"></script></p>

<p>実際には、後方互換性が必要になる(このエスケープ形式に対応していないインポーターでも違和感無く読み込めるのが理想)ので、実戦投入は無理でしょう。<br />
元記事のほうでは、HTML表示した場合に見た目変化が無いように空タグっぽい&lt;&gt;を末尾に追加したのだと思うのですが、MTなんかでは最終的な出力先がHTMLとは限らないので、良く無い事が起こりそうな気もします。デリミタと重複する行の末尾にスペースを一個追加してしまう、というあたりが落としどころになるのでしょうか。</p>]]>
        
    </content>
</entry>

<entry>
    <title>TagOverride</title>
    <link rel="alternate" type="text/html" href="http://blog.aklaswad.com/2009/000459.html" />
    <id>tag:blog.aklaswad.com,2009://2.459</id>

    <published>2009-10-11T14:24:23Z</published>
    <updated>2009-10-13T00:28:31Z</updated>

    <summary>勢いで書きました。後悔はしてません。 MTML自身で、既存のMTタグの動作を上書...</summary>
    <author>
        <name>aklaswad</name>
        <uri>http://blog.aklaswad.com/</uri>
    </author>
    
        <category term="Hack" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="tagoverride" label="TagOverride" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="movabletype" label="movable type" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="plugin" label="plug-in" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-us" xml:base="http://blog.aklaswad.com/">
        <![CDATA[<p>勢いで書きました。後悔はしてません。<br />
MTML自身で、既存のMTタグの動作を上書きする事ができるプラグインです。使い道はちょっと未知数ですが、なんとなく役に立つ使い方も出来るのでは無いかと言う気がします。役に立つと良いなあ。。。</p>

<p>現在の所、MT5.x 専用です。最新版は、以下のページからダウンロードできます。</p>

<ul>
	<li><a href="http://github.com/aklaswad/MT-TagOverride">http://github.com/aklaswad/MT-TagOverride</a></li>
</ul>]]>
        <![CDATA[<p><br />
このプラグインをインストールすると、以下の二つのテンプレートタグが利用可能になります。</p>

<h3>&lt;mt:TagOverride&gt;</h3>
タグの動作を上書きするためのブロックタグです。
このブロックの実行後にname属性で指定したタグが呼び出された場合、元々のタグの実行結果の代わりに、このブロックの内側のテンプレートの実行結果が表示されるようになります。

<h4>利用可能なモディファイア</h4>

<dl><dt>name</dt>
<dd>上書きするタグの名前を指定します。</dd>
</dl>

<p>例: このブロックが実行されると、以降、どのエントリーでも&lt;EntryTitle&gt;タグの実行結果が「トントリー」になります。<br />
<pre class="code">&lt;mt:TagOverride name=&quot;EntryTitle&quot;&gt;トントリー&lt;/mt:TagOverride&gt;</pre></p>

<h4>利用可能な変数</h4>
上書き後にタグが呼び出された場合、そのタグに設定されたモディファイアの値が、変数"args"にハッシュとして設定されています。これらの値を操作/上書きする事で、タグの動作を変更できます。

<p>例<br />
以下のブロックを実行すると、以降、すべての&lt;mt:Entries&gt;タグのlimitモディファイアが自動的に三倍になり、沢山のエントリーを表示できます。</p>

<pre class="code">&lt;mt:TagOverride name=&quot;Entries&quot;&gt;
　　　　&lt;mt:if var=&quot;args&quot; key=&quot;limit&quot;&gt;
　　　　　　　　&lt;mt:setvarblock name=&quot;args&quot; key=&quot;limit&quot;&gt;&lt;mt:var name=&quot;args&quot; key=&quot;limit&quot; op=&quot;*&quot; value=&quot;3&quot;&gt;&lt;/mt:setvarblock&gt;
　　　　&lt;/mt:if&gt;
　　　　&lt;mt:SuperTag&gt;
&lt;/mt:TagOverride&gt;</pre>

<h3>&lt;mt:SuperTag&gt;</h3>
TagOverrideの内側で、上書き前のタグを呼び出すファンクションタグです。上書き前のタグの実行結果が返ってきます。

<p>例<br />
以下のブロックを実行すると、以降、すべての&lt;mt:EntryTitle&gt;タグの出力の末尾にidが表示されるようになります。</p>

<pre class="code">&lt;mt:TagOverride name=&quot;EntryTitle&quot;&gt;&lt;mt:SuperTag&gt;(&lt;mt:EntryID&gt;)&lt;/mt:TagOverride&gt;</pre>

<h3>既知の問題</h3>
<ul>
	<li>多重にオーバーライドできないようです。</li>
</ul>
]]>
    </content>
</entry>

<entry>
    <title>config.yamlで良くある$Foo::Bar::buzの謎を探る。</title>
    <link rel="alternate" type="text/html" href="http://blog.aklaswad.com/2009/000457.html" />
    <id>tag:blog.aklaswad.com,2009://2.457</id>

    <published>2009-06-17T19:03:50Z</published>
    <updated>2009-06-21T17:34:41Z</updated>

    <summary>「$pkg = &apos;$Core::MT::CMS::&apos;」と宣言されているから、 「...</summary>
    <author>
        <name>aklaswad</name>
        <uri>http://blog.aklaswad.com/</uri>
    </author>
    
        <category term="Hack" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Movable Type" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="component" label="Component" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="l10n" label="L10N" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="mt4" label="MT4" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="callback" label="callback" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="hack" label="hack" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="movabletype" label="movable type" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="registry" label="registry" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-us" xml:base="http://blog.aklaswad.com/">
        <![CDATA[<blockquote>「$pkg = '$Core::MT::CMS::'」と宣言されているから、
「${pkg}Dashboard::dashboard」というのは「$Core::MT::CMS::Dashboard::dashboard」
のことだと思う。

<p>で、この「$Core」というのが何なのかわからない。<br />
<ul><br />
	<li><a href="http://nozawashinichi.sakura.ne.jp/usingmt/2009/06/coremtcms.html">$Core::MT::CMS...がわからない - Using MT</a></li><br />
</ul></blockquote></p>

<p>カレントのComponentをFooにセットしてから、Bar::buzを実行してくれ、という意味になります。<br />
上の例で言えば、カレントのComponentとして'Core'を設定した上で、MT::CMS::Dashboardパッケージのdashboardメソッドを実行しろ、ということです。</p>]]>
        <![CDATA[<p>この書式はMT独自の機能で、基本的にregistry(プラグインのconfig.yamlなど)にメソッド名を書くような場面でのみ有効となります。一見、Perlの名前空間のようにも見えますが、頭の「$Foo::」の部分は全くの別物です。<a href="http://code.sixapart.com/svn/movabletype/trunk/lib/MT.pm">(MT_HOME)/lib/MT.pm</a>のhandler_to_coderefというルーチンでパースされていますので、詳しい内容についてはコード見てください;-)</p>

<p>MT4では、Componentという概念が登場してます。Componentは、平たく言うと、作業の主体は誰か、という情報を扱うための基底クラスです。<br />
すべてのプラグインはそれぞれ、独立したComponentです。各種addonもComponentです。また、MT本体も、Coreという名前のComponentです。<br />
すべてのComponentはそれぞれに、テンプレートのサーチパスや、L10Nのhandler、registryなどを、固有の情報として保持しています。そのおかげで、必要な時に文脈にあわせて適切な翻訳を行ったり、プラグインが自分のディレクトリ以下のtmplディレクトリからテンプレートファイルを取り出したりする、といったことが実現されています。<br />
そんな、縁の下のComponentさんがたくさんいるので、「じゃ、今回は$Fooさんに面倒見てもらおうかしら」というのが、くだんの表記法の意味する所な訳です。</p>

<p>せっかくなので、ちょっとしたプラグインを作って実験してみます。</p>

<p>MT::translateメソッドは、カレントのComponentがセットされていれば、そのComponentの辞書を優先的に利用して翻訳を行う、という実装になっています。<br />
なので、$Foo::つきで呼ばれたコールバックと、そうでない場合とで、MT::translateを実行した際の結果に違いが現れます。</p>

<p>次のようなCompTest.pmファイルを用意し、</p>

<pre class="code">package CompTest;
use MT;
 
sub test_with_component_name {
    printf STDERR &quot;trans with component: %s\n&quot;, MT-&gt;translate('Entry');
}
 
sub test_without_component_name {
    printf STDERR &quot;trans without component: %s\n&quot;, MT-&gt;translate('Entry');
}
 
1;
</pre>

<p>config.yamlで以下のようにコールバックに登録します。</p>

<pre class="code">id: CompTest
callbacks:
    init_app:
        -
            handler: $CompTest::CompTest::test_with_component_name
        -
            handler: CompTest::test_without_component_name
l10n_class: CompTest::L10N</pre>

<p>で、このプラグインのL10Nファイルに</p>

<pre class="code">Entry =&gt; 'Suntory',</pre>

<p>などと書いておくと、mt.cgiの実行の度に以下のようなエラー出力が得られる筈です。</p>

<pre class="code">trans with component: Suntory
trans without component: Entry</pre>

<p><span class="mt-enclosure mt-enclosure-file" style="display: inline;"><a href="http://blog.aklaswad.com/mtplugins/CompTest.zip">CompTest.zip</a></span></p>

<p><ins datetime="2009-06-22T02:06:06+09:00"><br />
<h4>追記: レジストリでのダラー付きメソッド名のみ特権的に実行されるケース</h4><br />
大事な機能を見落としてました。<br />
レジストリ内にダラー付きで記述されているメソッド名は、registryメソッド経由で値を参照する場合に、（たとえそれが途中のpathにあったとしても）自動的に実行されます。<br />
これにより、使用頻度が低くかつロードするコストの大きいハッシュテーブルを、必要な時にのみ実行されるサブルーチンの戻り値としてレジストリに組み込むことが出来ます。<br />
これは、現在のMTの実装ではダラーありのメソッド名指定のみに適用されます。</p>

<p>たとえば、以下のようなレジストリエントリとメソッドの実装があった場合</p>

<pre class="code">#plugins/Hoge/config.yaml...
id: Hoge
foo:
    bar: $Hoge::Hoge::Fuga::heavy_calcuration</pre>

<pre class="code"># Hoge/Fuga.pm in plugins/Hoge/lib/...
package Hoge::Fuga;
 
sub heavy_calcuration {
　　　　wait_for_godot()
        or die;
　　　　return { answer =&gt; 42 };
}
 
1;</pre>

<p>このルーチンは、値が要求されるまでは実行されず、かつ、</p>

<pre class="code">my $ans = $plugin-&gt;registry('foo', 'bar', 'answer');</pre>

<p>このようにコールされた時には、最初からそこにハッシュがあったかのように扱う事が出来ます。</ins></p>

<p><del datetime="2009-06-22T02:23:42+09:00">で、まあ、このComponent指定接頭辞は、実際書かなくてもそれなりに動作はします。ので、本題である$Coreって必ず書く必要があるかと言うと、どうなのか良く分かりません。微妙。<br />
それでも、書いたら損をするという物でもないですし、とりあえずおまじないとして書いておくと良いのではないでしょうか。<br />
そしてもし、プラグイン作ってて、なんか期待したテンプレートをロードしてくれない、なんて事があったら、こんな話もあったよねと思い出してみてください。</del><br />
<ins datetime="2009-06-22T02:32:50+09:00">callbackのメソッド名のような、実行する事が主目的となるレジストリ値の場合には、最初に書いたようにダラーありと無しで違いは少ないのですが、上記追記分のように、ハッシュを遅延ローディングする目的の場合、必ずメソッド名をダラー付きで指定する必要があります。$Core::Foo::methodのように宣言されている部分は、ほとんどはその遅延ローディング目的ですね。すごく意味のある事です。奥が深いですね。まいりました。</ins></p>]]>
    </content>
</entry>

<entry>
    <title>ActionStreamのlinkフィールドからサムネイルをでっちあげる。</title>
    <link rel="alternate" type="text/html" href="http://blog.aklaswad.com/2009/000456.html" />
    <id>tag:blog.aklaswad.com,2009://2.456</id>

    <published>2009-06-09T16:15:58Z</published>
    <updated>2009-06-17T15:34:54Z</updated>

    <summary>久しぶりの更新。テンプレート系のコネタです。 ActionStreamsのいくつ...</summary>
    <author>
        <name>aklaswad</name>
        <uri>http://blog.aklaswad.com/</uri>
    </author>
    
    <category term="mtml" label="mtml" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="niconico" label="niconico" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="youtube" label="youtube" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="サムネイル" label="サムネイル" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-us" xml:base="http://blog.aklaswad.com/">
        <![CDATA[<p>久しぶりの更新。テンプレート系のコネタです。<br />
ActionStreamsのいくつかのプラグインでは、別途ThumbnailのURLを取得して専用のフィールドに保存してくれますが、そうではない場合もあります。<br />
特にソーシャルブックマーク等のサービスの場合には、そもそもコンテンツとそのサムネイルの関係が事前に分からないため、何もしてくれません。<br />
でもまあ、自分の行動範囲で、URLからサムネイル画像のURLが推測できる範囲なら何とかなるんじゃないか。<br />
そこで、MTMLで無理矢理やっつけてみました。</p>

<p>まず、以下のようなテンプレートを、モジュールテンプレートとして作成します。<br />
前半のmt:setHashVarタグのなかに適当に正規表現をつっこむと対応サイトが増やせます。とりあえずyoutubeとniconico、amazonだけ作りました。検証してないので、取りこぼしや誤作動があるかもしれません。</p>

<pre class="code">&lt;mt:setHashVar urls&gt;
&lt;mt:setvar youtube  value=&quot;http\://[^\.\/]+\.youtube\.(jp|com)/watch\?v=([0-9a-zA-Z\-]{11})&quot;,&quot;http://img.youtube.com/vi/$2/default.jpg&quot; /&gt;
&lt;mt:setvar niconico value=&quot;^http\://www\.nicovideo\.jp/watch/[sn]m([0-9]{1,9})&quot;,&quot;http://tn-skr2.smilevideo.jp/smile?i=$1&quot; /&gt;
&lt;mt:setvar amazon   value=&quot;^http\://www\.amazon\.(?:co\.jp|com)/.*(?:ASIN|product-description|product|dp)/([^/]+)(?:/.*)*&quot;,&quot;http://images.amazon.com/images/P/$1.09._THUMBZZZ_.jpg&quot; /&gt;
&lt;/mt:setHashVar&gt;
&lt;mt:loop urls&gt;
&lt;mt:setVarBlock check&gt;&lt;mt:getVar var=&quot;__value__[0]&quot;&gt;&lt;/mt:setVarBlock&gt;
&lt;mt:setVarBlock pattern&gt;/&lt;mt:getVar var=&quot;__value__[0]&quot;&gt;/&lt;/mt:setVarBlock&gt;
&lt;mt:setVarBlock replace&gt;&lt;mt:getVar var=&quot;__value__[1]&quot;&gt;&lt;/mt:setVarBlock&gt;
&lt;mt:if url like=&quot;$check&quot;&gt;&lt;mt:var url regex_replace=&quot;$pattern&quot;,&quot;$replace&quot;&gt;&lt;/mt:if&gt;
&lt;/mt:loop&gt;</pre>

<p>上のを保存したら(仮に「URL2Image」という名前で保存したとします)、ActionStreamsの表示側で、次のようにインクルードします。<br />
変換対象となるURLを、モディファイアのように渡してください。</p>

<pre class="code">&lt;mt:if tag=&quot;StreamActionThumbnailURL&quot;&gt;
    &lt;mt:StreamActionThumbnailURL /&gt;
&lt;mt:else&gt;
    &lt;mt:setvarblock name=&quot;link&quot;&gt;&lt;mt:StreamActionURL /&gt;&lt;/mt:setvarblock&gt;
    &lt;mt:setvarblock name=&quot;thumb&quot;&gt;&lt;mt:include module=&quot;URL2Image&quot; url=&quot;$link&quot; trim=&quot;1&quot; /&gt;&lt;/mt:setvarblock&gt;
    &lt;mt:if thumb&gt;&lt;img src=&quot;&lt;mt:var name=&quot;thumb&quot; /&gt;&quot; /&gt;&lt;/mt:if&gt;
&lt;/mt:if&gt;</pre>

<p><br />
このブログのメインページに表示しているライフログでも、Youtubeのビデオのブックマークなんかで画像が表示されるようにしてあるので、参考にしてみてください。</p>

<p>今回は、画像のみに絞ったカスタマイズにしましたが、やり方によってはembedタグにしたりアフィリエイトリンクにしたり色々出来ると思います。もちろんActionStreams以外の色々にも利用できると思います。お好みで工夫してみてください。</p>

<p><ins datetime="2009-06-18T00:26:30+09:00"><div>変換後のURLの前後に半角スペースが混じるとの指摘をいただきましたので、呼び出し側で<a href="http://www.movabletype.jp/documentation/appendices/modifiers/trim.html">trim</a>モディファイアを追加する形で対応しました。<pre class="code">&lt;mt:include module=&quot;URL2Image&quot; url=&quot;$link&quot; trim=&quot;1&quot; /&gt;</pre>また、<a href="http://www.hvc-001.com/mt/2009/06/15061330.html">hvc-001さんにご指摘いただき</a>、ニコニコ動画用の正規表現を一部修正しました。トラックバックありがとうございました!</div></ins></p>]]>
        
    </content>
</entry>

<entry>
    <title>[MT]コールバックの実行順序</title>
    <link rel="alternate" type="text/html" href="http://blog.aklaswad.com/2009/000453.html" />
    <id>tag:blog.aklaswad.com,2009://2.453</id>

    <published>2009-02-19T15:25:00Z</published>
    <updated>2009-02-19T15:51:44Z</updated>

    <summary>今日はコールバックの発生順序に関して大はまりしたので個人的に思ったことをメモ。 ...</summary>
    <author>
        <name>aklaswad</name>
        <uri>http://blog.aklaswad.com/</uri>
    </author>
    
    <category term="callback" label="callback" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="movabletype" label="movable type" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-us" xml:base="http://blog.aklaswad.com/">
        <![CDATA[<p>今日はコールバックの発生順序に関して大はまりしたので個人的に思ったことをメモ。</p>

<p>MTやMTのプラグインから利用可能なコールバックには大きく分けて以下の3つがある。<br />
<ul><br />
	<li> 1) 通常のMTのコールバック(cms_post_saveなど)</li><br />
	<li> 2) Data::ObjectDriver(D::OD) が Class::Trigger のトリガーを実行した際に同期して呼ばれる、オブジェクト操作関係のコールバック(MT::Entry::post_saveなど)</li><br />
	<li> 3) D::ODが実行する Class::Trigger のトリガー</li><br />
</ul></p>

<p>ちなみに(3)は、以下のように指定/実行できます。</p>

<pre class="code">MT::Comment-&gt;add_trigger(
    post_save =&gt; sub {
        my $comment = shift;
        # do something here... 
});</pre>

<p>このうち、(1)と(2)はMTのコールバックとして実行されるため、優先順位を指定できるが、(3)はMTのコールバックではないので、どのような順番で処理されるか分からない。そのためドハマリしました。</p>

<p>結局、現在のMTの実装として（恣意的に）</p>

<ul>
	<li>Class::Trigger　の「pre_****」は常にMTの「pre_****」コールバックより先に呼ばれる</li>
	<li>Class::Trigger　の「post_****」は常にMTの「post_****」コールバックより後に呼ばれる</li>
</ul>

<p>となっているが、（多分）アンドキュメンテッドな仕様なためこの順序が変更されない保証は無い。ということだと思います。</p>

<p>とりあえずの結論としては、基本的に(3)の方法は使わずに必ず(2)の方法で指定する、必要ならpriorityをきちんと登録する、というのがベストプラクティスなのかなと思いました。</p>

<p><br />
で、ここからが疑問なのだが、単なる数字(MTのコールバックの優先順位は0~11で指定される)では正直何より先or後に実行されるのか分からないんスよね。これって意味有ります？<br />
こういった仕組み自体はよく有る汎用的な仕組みだとは思うのですが。なんか納得いかねえ。</p>

<p>曖昧模糊と「早いうちに」とか「遅い時間に」とか指定するよりも、名指しで「'hoge'プラグインの'mage'コールバックよりは先に実行してください」みたいに具体的に指定できるような仕組みのがベターなのかな、と妄想した一日でした。</p>]]>
        
    </content>
</entry>

<entry>
    <title>Dummy</title>
    <link rel="alternate" type="text/html" href="http://blog.aklaswad.com/2009/000452.html" />
    <id>tag:blog.aklaswad.com,2009://2.452</id>

    <published>2009-01-31T14:59:59Z</published>
    <updated>2009-02-03T15:10:16Z</updated>

    <summary>Dummy...</summary>
    <author>
        <name>aklaswad</name>
        <uri>http://blog.aklaswad.com/</uri>
    </author>
    
    
    <content type="html" xml:lang="en-us" xml:base="http://blog.aklaswad.com/">
        <![CDATA[<p>Dummy</p>]]>
        
    </content>
</entry>

<entry>
    <title>ギターのコード譜を生成するプラグイン作った。</title>
    <link rel="alternate" type="text/html" href="http://blog.aklaswad.com/2008/000448.html" />
    <id>tag:blog.aklaswad.com,2008://2.448</id>

    <published>2008-12-11T01:45:19Z</published>
    <updated>2009-02-02T15:41:27Z</updated>

    <summary>こんな狭い世界でbayashiさんのと被ってしまってなんですが、ギターのコード譜...</summary>
    <author>
        <name>aklaswad</name>
        <uri>http://blog.aklaswad.com/</uri>
    </author>
    
        <category term="Plug-ins" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="gdtabguitar" label="GD::Tab::Guitar" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="guitartools" label="GuitarTools" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="musicchordnamer" label="Music::Chord::Namer" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="blog" label="blog" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="cpan" label="cpan" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-us" xml:base="http://blog.aklaswad.com/">
        <![CDATA[こんな狭い世界で<a href="http://tech.bayashi.jp/archives/entry/mt4-plugin/2008/002403.html">bayashiさんの</a>と被ってしまってなんですが、ギターのコード譜を画像表示するMTプラグインを作成しました。たぶんMT4.2位専用です。<br />

<ul>
	<li><span class="mt-enclosure mt-enclosure-file" style="display: inline;"><a href="http://blog.aklaswad.com/mtplugins/GuitarTools0.1.zip">GuitarTools0.1.zip</a></span></li>
</ul>


]]>
        <![CDATA[<h2>動作環境</h2>

お使いのサーバーで、画像処理ライブラリのGDと、PerlからGDを利用するためのモジュールがインストールされている必要があります。自分の利用しているXreaのサーバーでは、いずれも利用可能なようです。<br />

<h2>インストール</h2>

プラグインディレクトリに、解凍したGuitarToolsプラグインのpluginsディレクトリ以下をアップロードしてください。<br />
外部モジュールとして、画像作成に<a href="http://blog.livedoor.jp/nipotan/archives/51168727.html">にぽたんさん作成</a>の<a href="http://search.cpan.org/dist/GD-Tab-Guitar/">GD::Tab::Guitar</a>、コード認識に<a href="http://search.cpan.org/dist/Music-Chord-Namer/">Music::Chord::Namer</a>を利用しています。プラグインのパッケージには同梱していませんので、これらのモジュールをCPANからインストールするか、またはextlibに適宜展開して下さい。<br />
<br />
また、lines記法を利用するためには、以下のスタイルシートをメインのスタイルシートテンプレートのおしりなどに張り付けるなどの形で、参照できるようにしてください。<br />

<pre class="code">.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;
}</pre>


<h2>利用方法</h2>

プラグインがインストールされると、グローバルモディファイア「guitar_tools」と、テキストフォーマット「GuitarTools」が有効になります。これらが有効な箇所で、ギター記法を利用できます。<br />
ごくたまにエントリーで使う程度ならフォーマットから利用し、日常的にギター記法を利用するブログでは、EntryBodyタグなどのモディファイアとして、テンプレートに組み込んでしまうのがよいかと思います。<br />

<h2>シンタックス</h2>

<h3>基本</h3>
角括弧で囲んで「chord:」と書いた後にコードネームを書いてください。<br />
&#x5b;chord:C&#x5d;と書くと<img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/C.png" title="C" />のように画像に変換されます。<br />

<h3>フレットを指定する</h3>
デフォルトで登録されているコードのフォームが気に食わない、コードが特殊、など、フレットを指定したい場合「C6@032030」のように@マークで区切ってください。<br />

&#x5b;chord:C6@032030&#x5d;<br />
<img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/C6_032030.png" title="C6@032030" /> <br />

<ul>
	<li>6弦から1弦に向かって書きます。</li>
	<li>ミュートは小文字のxです。</li>
</ul>

<h3>複数のコードをズラッと書く。</h3>
複数並べたい場合、スペースで区切って記入できます。<br />

&#x5b;chord:C6@032030 GM7 Bm7 Em&#x5d;<br />
<img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/C6_032030.png" title="C6@032030" /><img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/GMaj7.png" title="GM7" /><img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/Bm7.png" title="Bm7" /><img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/Em.png" title="Em" /><br />

<h3>コードネームの自動推定</h3>
コードネームの代わりに「auto」と指定することで、自動的にコードを推測することができます。<br />

&#x5b;chord:auto@320003 auto@xx0232 auto@x7678x auto@576755 auto@123456&#x5d;<br />
<img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/G_320003.png" title="auto@320003" /><img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/D_xx0232.png" title="auto@xx0232" /><img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/E7no5addm10_x7678x.png" title="auto@x7678x" /><img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/Dsusmaj7onA_576755.png" title="auto@576755" /><img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/Dm6on9s5no_rootonF_123456.png" title="auto@123456" /><br />

<h3>その他の例</h3>
フレット指定するならコードネームは適当でもおkです<br />

&#x5b;chord:Jimi@x7678x&#x5d;<br />
<img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/Jimi_x7678x.png" title="Jimi@x7678x" /><br />

二桁のフレット数が混じるときはカンマ区切りで<br />

&#x5b;chord:Ab_oct@x,11,x,13,x,x&#x5d;<br />
<img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/Ab_oct_x_11_x_13_x_x.png" title="Ab_oct@x,11,x,13,x,x" /><br />

<h3>コードの表記例</h3>

メジャー、マイナー<br />
&#x5b;chord:C Cm&#x5d;<br />
<img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/C.png" title="C" /><img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/Cm.png" title="Cm" /> <br />

メジャーセブンスは大文字M7。セブンス、メジャーセブン、マイナーセブン、マイナーメジャーセブン。<br />
&#x5b;chord:C7 CM7 Cm7 CmM7&#x5d;<br />
<img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/C7.png" title="C7" /><img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/CMaj7.png" title="CM7" /><img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/Cm7.png" title="Cm7" /><img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/CmMaj7.png" title="CmM7" /> <br />

ディミニッシュ、オーギュメント、サスペンテッドフォー、アドナイン<br />
&#x5b;chord:Edim Eaug Esus4 Eadd9&#x5d;<br />
<img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/Edim.png" title="Edim" /><img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/Eaug.png" title="Eaug" /><img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/Esus4.png" title="Esus4" /><img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/Eadd9.png" title="Eadd9" /> <br />

テンションは括弧でくくる<br />
&#x5b;chord:C7(9) C7(9,13)&#x5d;<br />
<img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/C7_9_.png" title="C7(9)" /><img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/C7_9_13_.png" title="C7(9,13)" /> <br />

シャープはシャープ記号。フラットは小文字のb<br />
&#x5b;chord:C# C7(#9) C7(b5)&#x5d;<br />
<img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/Cs.png" title="C#" /><img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/C7_s9_.png" title="C7(#9)" /><img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/C7_b5_.png" title="C7(b5)" /> <br />


<h3>lines記法</h3>
歌詞っぽいものをかけます。<br />

歌詞全体を&#x5b;lines:　... &#x5d; で囲みます。<br />
そして、コードネームを弓かっこ「{」「}」で囲んではさむと、歌詞中にコードネームやポジション画像を埋め込むことができます。<br />
コードネームのみとしたい場合、コードネームの先頭にマイナスを付けてください。<br />

<pre>&#x5b;lines:
{F#m(11)@x44200}two jumps in a week a bet you {Asus2@x02200}think that's pretty clever {E}don't you boy?
{F#m(11)@x44200}Flying on your motorcycle, {Asus2@x02200}watching all the ground {Eb@688666}beneath you drop
{-F#m(11)}You'd kill yourself for recognition, {-Asus2}kill yourself to never {-E}ever stop
{-F#m(11)}You broke another mirror, you're {-Asus2}turning into something {-E}you are not

So don't leave me {F#m(11)@x44200}high____{Asus2@x02200}don't leave me {E}dry____
Don't leave me {-F#m(11)}high____{-Asus2}don't leave me {-E}dry____
&#x5d;
</pre>

<div class="guitarlines"><br /><img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/Fsm_11__x44200.png" title="F#m(11)@x44200" />two jumps in a week a bet you <img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/Asus2_x02200.png" title="Asus2@x02200" />think that's pretty clever <img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/E.png" title="E" />don't you boy?<br /><img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/Fsm_11__x44200.png" title="F#m(11)@x44200" />Flying on your motorcycle, <img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/Asus2_x02200.png" title="Asus2@x02200" />watching all the ground <img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/Eb_688666.png" title="Eb@688666" />beneath you drop<br /><span class="chordname">F#m(11)</span>You'd kill yourself for recognition, <span class="chordname">Asus2</span>kill yourself to never <span class="chordname">E</span>ever stop<br /><span class="chordname">F#m(11)</span>You broke another mirror, you're <span class="chordname">Asus2</span>turning into something <span class="chordname">E</span>you are not<br /><br />So don't leave me <img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/Fsm_11__x44200.png" title="F#m(11)@x44200" />high____<img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/Asus2_x02200.png" title="Asus2@x02200" />don't leave me <img class="guitarchord" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/support/guitar/chords/E.png" title="E" />dry____<br />Don't leave me <span class="chordname">F#m(11)</span>high____<span class="chordname">Asus2</span>don't leave me <span class="chordname">E</span>dry____<br /></div>]]>
    </content>
</entry>

<entry>
    <title>[ActionStreams]ボケて用config.yaml</title>
    <link rel="alternate" type="text/html" href="http://blog.aklaswad.com/2008/000446.html" />
    <id>tag:blog.aklaswad.com,2008://2.446</id>

    <published>2008-10-07T13:51:00Z</published>
    <updated>2008-10-22T11:57:36Z</updated>

    <summary>ボケて用のconfig.yamlです。 	フィード無いのでscraperでとって...</summary>
    <author>
        <name>aklaswad</name>
        <uri>http://blog.aklaswad.com/</uri>
    </author>
    
        <category term="Hack" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="actionstream" label="Action Stream" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="webscraper" label="Web::Scraper" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="boketejp" label="bokete.jp" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="plugin" label="plug-in" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-us" xml:base="http://blog.aklaswad.com/">
        <![CDATA[<p><a href="http://bokete.jp/">ボケて</a>用のconfig.yamlです。</p>

<ul>
	<li>フィード無いのでscraperでとってきてます。多分寿命は短いと思う。</li>
	<li>scraperのネストの扱いが分からなくてハマった。</li>
	<li>フィードの配信が待ち望まれるところ。</li>
	<li>フィールド追加するより、titleなどの既存のフィールドに入れちまった方が良いのかしら？</li>
</ul>
<pre class="code">
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 &lt;a href=&quot;[_2]&quot;&gt;[_3]&lt;/a&gt;'
            html_params:
                - url
                - boke
            url: 'http://bokete.jp/user/{{ident}}'
            identifier: boke
            scraper:
                foreach: div.odai530
                get:
                    boke:
                        - 'h3'
                        - TEXT
                    url:
                        - '//p[2]/a[position()=last()]'
                        - @href
</pre>

<p><ins datetime="2008-10-22T20:57:31+09:00">とっくにフィード吐くようになってるみたいですね。。。そのうち。。。</ins></p>]]>
        
    </content>
</entry>

<entry>
    <title>EmoticonButton 4 CustomEditorButton2。</title>
    <link rel="alternate" type="text/html" href="http://blog.aklaswad.com/2008/000445.html" />
    <id>tag:blog.aklaswad.com,2008://2.445</id>

    <published>2008-10-03T14:45:20Z</published>
    <updated>2008-10-21T05:48:56Z</updated>

    <summary>MTでも絵文字使おうぜプラグイン、アリマス - Kickstart my hea...</summary>
    <author>
        <name>aklaswad</name>
        <uri>http://blog.aklaswad.com/</uri>
    </author>
    
    <category term="customeditorbutton" label="CustomEditorButton" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="eb4ceb2" label="EB4CEB2" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="kickstartmyheart" label="Kickstart my heart" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-us" xml:base="http://blog.aklaswad.com/">
        <![CDATA[<p><a href="http://www.luckypines.com/mt/2008/05/mt.html">MTでも絵文字使おうぜプラグイン、アリマス - Kickstart my heart</a>で公開されている絵文字プラグインを、CustomEditorButton2にインポートしてみました<img class="emoticon happy02" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/plugins/EmoticonButton/images/emoticons/happy02.gif" alt="happy02" style="border:0;" />。</p>

<ul>
	<li><span class="mt-enclosure mt-enclosure-file" style="display: inline;"><a href="http://blog.aklaswad.com/mtplugins/EB4CEB2.zip">EB4CEB2.zip</a></span></li>
</ul>

<p>利用にあたっては、CustomEditorButotn2側もアップデート<img class="emoticon up" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/plugins/EmoticonButton/images/emoticons/up.gif" alt="up" style="border:0;" />が必要となっています<img class="emoticon wobbly" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/plugins/EmoticonButton/images/emoticons/wobbly.gif" alt="wobbly" style="border:0;" />。お試しいただく際には、CustomEditorButton2プラグインも、以下のバージョン2.0.31にアップデートしてください<img class="emoticon coldsweats01" src="http://blog.aklaswad.com/cgi-bin/blog/mt-static/plugins/EmoticonButton/images/emoticons/coldsweats01.gif" alt="coldsweats01" style="border:0;" />。</p>

<ul>
	<li><span class="mt-enclosure mt-enclosure-file" style="display: inline;"><a href="http://blog.aklaswad.com/mtplugins/CustomEditorButton2_0_31.zip">CustomEditorButton2_0_31.zip</a></span></li>
</ul>]]>
        
    </content>
</entry>

<entry>
    <title>Six Apartに入社しました。</title>
    <link rel="alternate" type="text/html" href="http://blog.aklaswad.com/2008/000444.html" />
    <id>tag:blog.aklaswad.com,2008://2.444</id>

    <published>2008-09-16T11:44:51Z</published>
    <updated>2008-10-09T04:39:01Z</updated>

    <summary>私事となりますが、本日よりSix Apartで働くことになりました。 こうして報...</summary>
    <author>
        <name>aklaswad</name>
        <uri>http://blog.aklaswad.com/</uri>
    </author>
    
        <category term="daily memo" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="sixapart" label="SixApart" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="blog" label="blog" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="diary" label="diary" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-us" xml:base="http://blog.aklaswad.com/">
        <![CDATA[<p>私事となりますが、本日よりSix Apartで働くことになりました。</p>

<p>こうして報告エントリを書こうとしているとなんだか感極まったりして、ブログの過去ログを見直しているのですが、今の自分があるのは、このブログを見てくれて、自分の拙いプラグインを使ってくださった皆様のおかげだと、実感しています。本当にありがとうございました。</p>

<p>これからも愉快なプラグインを作ったりなどするべく、頑張っていきたいと思います。<br />
今後ともよろしくお願いします。</p>]]>
        
    </content>
</entry>

<entry>
    <title>息を吐くようにMTMLを書く。</title>
    <link rel="alternate" type="text/html" href="http://blog.aklaswad.com/2008/000442.html" />
    <id>tag:blog.aklaswad.com,2008://2.442</id>

    <published>2008-09-11T12:25:00Z</published>
    <updated>2008-09-11T15:55:11Z</updated>

    <summary>最近、友人との遊び目的で、プライベートなサイトをMTで作っています。 テンプレー...</summary>
    <author>
        <name>aklaswad</name>
        <uri>http://blog.aklaswad.com/</uri>
    </author>
    
        <category term="Hack" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mt42" label="MT4.2" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="hack" label="hack" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="midcentury" label="mid-century" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="mtml" label="mtml" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-us" xml:base="http://blog.aklaswad.com/">
        <![CDATA[<p>最近、友人との遊び目的で、プライベートなサイトをMTで作っています。<br />
テンプレートには、<a href="http://www.movabletype.org/documentation/themes/mid-century.html">Mid-Century</a>を適用してみました。なかなか使い勝手が良いです。</p>

<p>そのサイトでは、大量のオーディオファイルや、特定のエントリーなんかをまとめたページを手軽に作りたくて、こんなカスタマイズをしています。</p>

<p><br />
</p>]]>
        <![CDATA[<p>まず、MT4.2の新機能のグローバルモディファイア<a href="http://www.movabletype.jp/documentation/appendices/modifiers/mteval.html">mteval</a>を使って、ウェブページに直接MTMLを書けるようにします。ただし、全部を対象にしてしまうのも気持ち悪いので、プライベートタグ「@eval」をつけてあるものだけを対象にするようにします。</p>

<pre class="code">&lt;mt:PageIfTagged tag=&quot;@eval&quot;&gt;
    &lt;mt:PageBody mteval=&quot;1&quot; /&gt;
&lt;mt:else&gt;
    &lt;mt:PageBody /&gt;
&lt;/mt:PageIfTagged&gt;</pre>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="" src="http://blog.aklaswad.com/images/webpage.png" width="336" height="284" class="mt-image-none" style="" /></span></p>

<p>これで、ウェブページに簡単にMTMLを書けるようになりました。</p>

<p>さて、MTMLで満足な出力結果が得られるようになったら、今度はサイトのトップページなどに導線を作りたいところ。</p>

<p>MT4.1以前で、インデックステンプレートを利用してページを作っていた場合、ここでどうしてもひと手間かかっていました。<br />
今回はウェブページを利用しているので、以下のように、プライベートタグ「@nav」の付けられたウェブページをサイトのトップナビゲーションに表示するよう、事前に作成しておきました。</p>

<pre class="code">&lt;div id=&quot;nav&quot;&gt;
    &lt;div id=&quot;nav-inner&quot;&gt;
        &lt;ul&gt;
            &lt;li class=&quot;home&quot;&gt;&lt;a href=&quot;&lt;$MTBlogURL$&gt;&quot;&gt;Home&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href=&quot;&lt;$mt:Link template=&quot;archive_index&quot;$&gt;&quot;&gt;Archives&lt;/a&gt;&lt;/li&gt;
        &lt;mt:Pages tag=&quot;@nav&quot;&gt;
            &lt;li&gt;&lt;a href=&quot;&lt;mt:PagePermalink&gt;&quot;&gt;&lt;mt:pageTitle&gt;&lt;/a&gt;&lt;/li&gt;&lt;/mt:Pages&gt;
        &lt;/ul&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="topnav.png" src="http://blog.aklaswad.com/images/topnav.png" width="244" height="99" class="mt-image-none" style="" /></span></p>

<p>ちなみに、mid-centuryのトップナビゲーションは初期状態では、「バナーヘッダー」モジュールテンプレートの中で、mt:ignoreで無効化されています。該当箇所のmt:ignoreを削除すれば有効になります。</p>

<p>これで完成。かなり快適です。<br />
ちょっとAssetやエントリをまとめたページを作りたいなと思い立ったら、おもむろに@evalというタグをつけてウェブページにテンプレートを書き始めます。で、出来たら@navとタグを付ければ即サイトに反映されるという塩梅。MTML中毒の皆さん、良かったらお試しくださいー。</p>]]>
    </content>
</entry>

<entry>
    <title>google chrome から投稿</title>
    <link rel="alternate" type="text/html" href="http://blog.aklaswad.com/2008/000440.html" />
    <id>tag:blog.aklaswad.com,2008://2.440</id>

    <published>2008-09-03T02:56:14Z</published>
    <updated>2008-09-03T04:29:18Z</updated>

    <summary>google chrome から投稿。 TaggingHelper は動いてるけ...</summary>
    <author>
        <name>aklaswad</name>
        <uri>http://blog.aklaswad.com/</uri>
    </author>
    
        <category term="tech memo" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="customeditorbutton" label="CustomEditorButton" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tagginghelper" label="TaggingHelper" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="google" label="google" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="googlechrome" label="google chrome" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-us" xml:base="http://blog.aklaswad.com/">
        <![CDATA[<p>google chrome から投稿。<br />
TaggingHelper は動いてるけど、CustomEditorButton2は動作せず。</p>

<p><ins datetime="2008-09-03T13:29:04+09:00">いや、動いてはいるな。なんかクリックの感知が安定してない感じだ。ダブルクリックすると動いたりする。。。なんぞこれー</ins></p>]]>
        
    </content>
</entry>

<entry>
    <title>Movable Type Developer Conference に参加できませんでした。</title>
    <link rel="alternate" type="text/html" href="http://blog.aklaswad.com/2008/000439.html" />
    <id>tag:blog.aklaswad.com,2008://2.439</id>

    <published>2008-08-21T13:30:00Z</published>
    <updated>2008-08-21T13:34:28Z</updated>

    <summary>とんだ出落ちですみません。会社の休みもらえたのが、締め切りの次の日だったんです。...</summary>
    <author>
        <name>aklaswad</name>
        <uri>http://blog.aklaswad.com/</uri>
    </author>
    
        <category term="daily memo" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mtdc" label="MTDC" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="memo" label="Memo" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="movabletype" label="Movable Type" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="mtdevcon" label="mtdevcon" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-us" xml:base="http://blog.aklaswad.com/">
        <![CDATA[<p>とんだ出落ちですみません。会社の休みもらえたのが、締め切りの次の日だったんです。フライングで申し込んでおけば良かったと今になって思うも後悔先に立たず。</p>

<p>でまあ、結局一日家でUstreamに張り付いてずっと見ていたので、割と満足。ちょっとした感想くらいなら述べることも出来るというものです。</p>

<p><br />
興味深かったのはやはり Beau Smith さんのパブリッシングに関する話。<br />
アーカイブやインデックステンプレートごとに更新頻度とページビューを予想してパブリッシュの方法を決めろ、ただしサイトごとに傾向は違ってくるので頑張れ、という話だったと思います。</p>

<p>ただ、現実的に、そう簡単に最適解が出せるかというと難しいと思います。その一番の理由は、定量的に再構築の回数を観測出来ないからです。</p>

<p>これってでも、実現できそうですよね。<br />
再構築の回数を記録してFileinfoテーブルにでも突っ込んでおくと、パフォーマンスの測定に役立つのでは無いか。<br />
もっと突き進めれば、ページビューのデータも取得するようにして、View / Build Ratio みたいな値を定期的に算出し、ファイルごとに最適なパブリッシング方法をMTが自動的に設定してくれる、なんてことも出来るかも。という妄想をいたしました。</p>

<p><br />
あとはLightingTalkが大変楽しそうでしたね。Ustreamの画面だと実動作のデモは視聴がちょっと辛くはありましたが、それでも、すごくいい雰囲気が伝わってきました。<br />
変態テンプレート好きの自分としては、<a href="http://www.3oclock.com/hello-world/2008/08/movable-type-developer-confere-1.html">mt:EntryPreviousのネスト技</a>の話が一番ツボにハマりました。今なら、mt:setVarTemplateを再帰させてゴニョゴニョしても面白いかも。という妄想をいたしました。</p>

<p><br />
なにはともあれ、みなさんお疲れさまでした。参加できなくて残念でしたが、すごく楽しい時間をありがとうございました。おしまい。</p>]]>
        
    </content>
</entry>

</feed>
