- 2009-08-19 (水) 14:02
- MovableType


- GetQRcodeプラグインでMT4iリンクを作成
さーて、今回はMT4iへのリンクを表す、QRコード部分。
エントリーアーカイブに対しても、携帯での直接表示が可能なように、外部のJavascriptAPIを使って、QRコードを生成させていたのだけれど、この手の画像を生成するスクリプトは、どうしても表示までが遅くなりがち。Ajaxを使って感じさせなくするのも手だけれど、やはりベストはサーバー側に画像を用意する事です。
ブログ自身のQRコードだけなら、APIで生成した画像をダウンロードして、サーバーに置いておく事も可能ですが、かといってエントリーアーカイブそれぞれのQRコードを、エントリーを書くたび作成するのも面倒な話です。
という訳で、QRコードを生成するMovableTypeプラグイン「MT4:エントリのURLをQRコードで自動生成する」を使い、再構築時にサーバー上にQRコード画像が作成されるようにしてみました。
GetQRcodeプラグインを使う
まずこのプラグインの動作には、GD::Barcodeが必要なので、一部のサーバーでは使用できない事もあるかもしれません。
このプラグインのインストールで使用可能になる、唯一のMTタグ<MTGetQRCode>には、2つのパラメータ「url」と「qrcodeurl」があり、それぞれ「QRコード化するテキスト」「サーバー上でのQRコードを生成するパス」となっています。
これは、yoshiさんには悪いけど、パラメーター名が適切じゃない気がします。お題的には「url」であってるけれど、本来はここはURLだけでなくテキストなら何でも構わない部分なので、「text」とかの方が解りやすいはずです。「qrcodeurl」の方も、実際にはパスを記述するのに、「qrcodeurl」と「url」のような錯覚を起させるのは、親切では無いでしょう。
プラグインの動作としては、シンプルに出来ていて理解しやすいです。
ウィジェットのMTMLは以下の様になりました。
<MTSetvarBlock name="QRrelpath">images/qrcode/qrcode<MTIf name="tempName" eq="individual_entry"><$MTEntryID pad="1"$></MTIf>.png</MTSetvarBlock> <$MTBlogSitePath replace="\","/" cat="$QRrelpath" setvar="qrpath"$> <$MTBlogURL cat="$QRrelpath" setvar="qrurl"$> <MTSetVarBlock name="qrtext">[[ MT4iのCGIアドレス ]]?id=<$MTBlogID$></MTSetVarBlock> <MTIf name="tempName" eq="individual_entry"><MTSetVarBlock name="qrtext" append="1">&mode=ainori&eid=<$MTEntryID$></MTSetVarBlock></MTIf> <$MTGetQRCode url="$qrtext" qrcodeurl="$qrpath"$> <dt><$MTBlogName$> mobile.ver.</dt> <dd> <p>携帯サイト(MT4i Powered)はこちら</p> <p><a href="[[ MT4iのCGIアドレス ]]??id=<$MTBlogID$><MTIf name="tempName" eq="individual_entry">&mode=ainori&eid=<$MTEntryID$></MTIf>" title="mobile.ver." rel="nofollow noindex"><img src="<$MTGetvar name="qrurl"$>" alt="qrcode" width="90" height="90" /></a></p> <p>Generate QRcode by <a href="http://www.apstars.com/blog/215/mt4urlqr.php" title="MT4:エントリのURLをQRコードで自動生成する" class="favicon_m">GetQRcodeプラグイン</a></p> </dd>
[[ MT4iのCGIアドレス ]]の部分は、MT4iのCGIのURLに書き換えてます。
使う上で面倒なのは、サーバー上のパスとURLを結びつけなくてはならない点です。私の場合は以下の様にしました。
作成されるQRコードの、ブログルートからの相対パスを「QRrelpath」にセット。
<MTSetvarBlock name="QRrelpath">images/qrcode/qrcode<MTIf name="tempName" eq="individual_entry"><$MTEntryID pad="1"$></MTIf>.png</MTSetvarBlock>
QRコード画像のサイト上のパスを、「<$MTBlogSitePath$>」と、上で作った「QRrelpath」を連結して「qrpath」にセットします。(なお途中のreplaceモディファイアは、このサーバーがWIN鯖でパスの区切りが「\\」になっているからそれを「\/」に直しているだけです)
同様に、QRコード画像のURLを、「<$MTBlogURL$>」と「QRrelpath」を連結して「qrurl」としてセットします。
<$MTBlogSitePath replace="\","/" cat="$QRrelpath" setvar="qrpath"$> <$MTBlogURL cat="$QRrelpath" setvar="qrurl"$>
ここまで作った変数のうち、実際にプラグインに渡される変数は、「qrpath」だけです。「qrurl」は出来あがったQRコード画像を表示する時に、URLとして使います。(画像の指定を相対パスで行うのなら、「QRrelpath」を使って「qrurl」を使用しなくてもかまいません)
QRコードで表示させるテキスト(MT4iのアドレス)を「qrtext」にセットします。以下は実際のこのサイトでのMT4iを表示するURLです。
<MTSetVarBlock name="qrtext">http://www.zelazny.mydns.jp/cgi-bin/keitai/index.cgi?id=<$MTBlogID$></MTSetVarBlock>
エントリーアーカイブにの場合は、直接記事を表示できるように、クエリを「qrtext」に追加します。(エントリーアーカイブかどうかの条件判断は、mt.Vicunaのものを使用していますので、一般的な記述ではありません)
<MTIf name="tempName" eq="individual_entry"><MTSetVarBlock name="qrtext" append="1">&mode=ainori&eid=<$MTEntryID$></MTSetVarBlock></MTIf>
二つの変数「qrtext」と「qrpath」を使い、QRコード画像を生成します。
<$MTGetQRCode url="$qrtext" qrcodeurl="$qrpath"$>
後は出来あがった画像を表示させるだけです。
GetQRcodeプラグインを修正する
実は、ここまでの作業は、うまくいかない可能性があります。というのもGetQRcodeプラグインは、QRコードを「バージョン3」の「誤り訂正レベルL」として作成しています。この場合作成可能なデータビット数は440、英数字で77文字となり、MT4iのクエリ付きURLを表示するには、文字数が足りなくなる事があるからです。
QRコードドットコム:バージョン1~10
という訳で、この部分の修正が必要になります。
これを指定しているのは、プラグイン内の以下の部分です。
my $oGdBar = GD::Barcode->new('QRcode', $url,{ Ecc => 'L',ModuleSize=> 2,Version => 3,});この「Version => 3,」を「Version => 5,」にする事で、約倍の文字が使えるようになります。(別に「4」でも構わないのですよ)
ちなみに「ModuleSize=> 2,」は出力される、QRコード画像のサイズ(90px四方)を指定しているところです。「ModuleSize=> 1,」とすると(45px四方)になります。
もしこのプラグインの改修点があるとしたら、パスとURLの指定を簡素化する事と、Version指定やModuleSize指定をパラメーターとして渡せるようにする事ですかね。
なかなか、シンプルだけど面白いプラグインです。
さて、明日からしばらくパソコンが手元にない状態になります。まさか2週間かかるなんて・・・
しばらく更新はおあずけですね・・・
- Newer >: QotD:怪談
- < Older: JSONで被ブクマ数を取得
ping a Trackback
- TrackBack URL for this entry.(1)




スクリプトの読み込みが完了していません。
メールフォーム(Javascriptを使用していません)や、
Twitter経由のCommentでもReplyいたします。ただし返信はブログのコメントとして行う事もあります。