<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Blog</title>
    <link rel="alternate" type="text/html" href="https://weeeblog.net/blog/" />
    <link rel="self" type="application/atom+xml" href="https://weeeblog.net/blog/atom.xml" />
    <id>tag:weeeblog.net,2009-12-29:/blog//2</id>
    <updated>2013-12-18T12:43:29Z</updated>
    <subtitle>主に Movable Type や Perl など、Web 制作に関する技術情報について書いています。また、個人的に制作した Movable Type プラグインを公開しています。</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Pro 6.0.2</generator>

<entry>
    <title>Nukamiso が提供するその他の機能</title>
    <link rel="alternate" type="text/html" href="https://weeeblog.net/blog/2013/12/19_0902.php" />
    <id>tag:weeeblog.net,2013:/blog//2.635</id>

    <published>2013-12-19T00:02:00Z</published>
    <updated>2013-12-18T12:43:29Z</updated>

    <summary> この記事は、「Movable Type の SQL を見てみませんか」の続きで...</summary>
    <author>
        <name>okayama</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="https://weeeblog.net/blog/">
        <![CDATA[<div class="msg msg-success">
<p style="margin-bottom:0">この記事は、「<a href="/blog/2013/12/19_0901.php">Movable Type の SQL を見てみませんか</a>」の続きです。プラグインは <a href="https://weeeblog.net/mt/mt-download.cgi?asset_id=137">こちらからダウンロードできます</a>。</p>
</div>

<p>ぬかみそプラグインです。僕自身が開発業務の人間なのでややそっち寄りな機能が多いですが、制作を行う人に有用な機能もたくさんあります。入れといて損はないプラグインですが、いらない機能とかあったら<a href="https://github.com/okayama/mt-plugin-nukamiso" target="_blank">GitHub から Fork して</a>自分好みにいじってください。</p>

<p>ネーミングは某氏が以前公開しておられた nukamiso.css へのリスペクトです。日々足したり引いたりして整えているものに与える名前としてとてもいいなと思って倣いました。いくつかの機能はリリースされたばかりの <a href="http://www.powercms.jp/news/release-powercms-4.html" target="_blank">PowerCMS 4</a> にも盛り込まれています。Movable Type 5 でも 6 でも動作します。</p>

<h4>各ウィジェトの非表示化</h4>
<ul>
    <li>ユーザー情報(Movable Type 6) / This is You(Movable Type 5)</li>
    <li>Blog Stats(Movable Type 5)</li>
    <li>ニュース</li>
    <li>ウェブサイトとブログ</li>
    <li>最近評価された記事</li>
    <li>最近の投稿</li>
    <li>評価の高い記事</li>
    <li>サイト情報</li>
</ul>

<p>本当に必要なウィジェットってあまりないですよね。ダッシュボードが重くなる原因になるので非表示にします。「ウェブサイトとブログ」はあってもいいかなあとも思うのですが、過去にこれがボトルネックになっていたことがあったので、僕は使わないようにしています。</p>

<h4>「表示オプション」のスタイル</h4>
<p>複数の画面で右上に表示される「表示オプション」ですが、このボタンのために管理画面上部が冗長な印象になります。これを右上に固定し、ボタンを押した時に表示されるメニューのスタイルも整えます。</p>

<p class="text-center"><img alt="表示オプションのスタイル" src="/blog/images/img_nukamiso_displayoptions.jpg" width="430" height="250" /><span class="image-caption">表示オプションのスタイル</span></p>

<h4>インデックステンプレートに「ファイルの内容」を表示</h4>
<p>.htaccess をインデックステンプレートで出力する場合とか、「公開されたテンプレートを確認」しても見えないですよね。せっかくうまくまとまった管理画面があるのに FTP しないといけないんじゃ不便なので、編集画面から見えるようにします。</p>

<p class="text-center"><img alt="ファイルの内容を表示" src="/blog/images/img_nukamiso_file_text.jpg" width="500" height="300" /><span class="image-caption">ファイルの内容を表示</span></p>

<h4>テンプレート編集画面の「タグリファレンス」ウィジェットを無効化</h4>
<p>テンプレートの内容を Javascript でパースして、画面右側にタグのリストとリファレンスへのリンクを表示する機能ですが、特段役には立たないですよね。ブラウザのリソース使ってまでやる必要ないと思うので、これが行われないようにします。</p>

<h4>システムログを見やすく</h4>
<p>Listing Framework が導入されてから、システムログが正確な時系列に並ばないケースがたまに出てくるようになってしまったので、ID 順で並ぶようにします。</p>
<p>また、システムログについては以下のような補助機能があります。</p>

<ul>
    <li>文字数の多いログを保存しようとした場合、metadata に保存するようになります。metadata っていうのは、ログメッセージにリンクがついてて、クリックすると出てくるアレです。</li>
    <li>さらに、metadata の内容をスタイル調整して見やすくします。MT->log( Dumper $app ); とかすると効果の程がわかります。</li>
    <li>画面右上「ヘルプ」の横にシステムログへのリンクを追加します。いつでもシステムログを表示できます。</li>
</ul>

<p class="text-center"><img alt="システムログのスタイル" src="/blog/images/img_nukamiso_systemlog_style.jpg" width="500" height="254" /><span class="image-caption">システムログのスタイル</span></p>

<p class="text-center"><img alt="システムログのリンク" src="/blog/images/img_nukamiso_systemlog_link.jpg" width="411" height="72" /><span class="image-caption">システムログのリンク</span></p>

<h4>ポップアップ・ログ</h4>
<p>ある画面を表示した場合にログが発生していた場合、画面右上にそのログを表示します。エラーログの見落としを防ぐこともできますし、デバッグログを仕込んでいる場合はいちいちシステムログを表示する必要がなくなります。</p>
<p>ポップアップ・ログは draggable なので、画面中の任意の場所に移動させることができます。</p>

<p class="text-center"><img alt="ポップアップ・ログ" src="/blog/images/img_nukamiso_popup_log.jpg" width="500" height="292" /><span class="image-caption">ポップアップ・ログ</span><p>

<h4>テンプレートタグ</h4>

<p>ファンクションタグ &lt;$MTDump$&gt; が使えます。その時点でのテンプレート変数を &lt;pre&gt; タグで囲んで出力します。デバッグモードにして管理画面に入れてみるといろんな情報があって面白いですね。</p>
<p>モディファイア stash="1", all="1" を付ければ、より広い範囲で、コンテキストを含めた情報を出力します。</p>

<h4>デバッグ用関数</h4>

<p>Nukamiso::Util の dumper, debug, debug_query を使うことができます。dumper はいわゆる Data::Dumper::Dumper ですが、引数の数や形式を見てほどよく(※ 個人差あります)振る舞います。スカラーでも配列でもハッシュでもいいし、リファレンスでなくてもかまいません。UTF-8 フラグ付きのマルチバイト文字が含まれていて、エスケープされるケースでも、視認できる形に戻してくれます。debug はそれをシステムログに出力します。</p>
<p>debug_query はパラメータを全部つないでシステムログに出力します。POST パラメータをちゃんとチェックしたい場合に使えます。</p>

<pre>
<code>
use Nukamiso::Util qw( dumper debug debug_query );

sub _mt_app_cms_pre_run {
  debug( $app );
}
</code>
</pre>

<p>僕は、PowerCMS という Movable Type プラグイン製品の開発とメンテンスおよび、案件やサポートから発生するカスタマイズ業務に携わっています。ver.1.0 からなので、もう 7 年近くになるでしょうか。いわば、プラグインを仕事にすることの酸いも甘いも、現役で身を持って味わっているエンジニアです。そんな僕のぬかみそ、<a href="https://github.com/okayama/mt-plugin-nukamiso" target="_blank">GitHub に置いてあります</a>。Fork とかして皆さんのぬかみそ作ってください。</p>]]>
        
    </content>
</entry>

<entry>
    <title>Movable Type の SQL を見てみませんか</title>
    <link rel="alternate" type="text/html" href="https://weeeblog.net/blog/2013/12/19_0901.php" />
    <id>tag:weeeblog.net,2013:/blog//2.634</id>

    <published>2013-12-19T00:01:00Z</published>
    <updated>2013-12-18T12:41:29Z</updated>

    <summary>この記事は Movable Type Advent Calendar 2013 ...</summary>
    <author>
        <name>okayama</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="https://weeeblog.net/blog/">
        <![CDATA[<p>この記事は <a href="http://www.adventar.org/calendars/92" target="_blank">Movable Type Advent Calendar 2013</a> の19日目の記事です。</p>

<p><br>Movable Type が発行している SQL を見てみると、Movable Type がデータベースに対して何をしているのか、どういう情報がどこに格納されているのかについて知ることができます。これは、Movable Type を扱う仕事をしている、もしくは趣味をお持ちなら、Movable Type への理解を一歩前に進め、Movable Type を Enjoy! するにはとっても有用です。だって、理解しているツールを使うのとそうじゃないツールを使うのって全然気分違うでしょ。</p>

<p>また、SQL は文なので、Perl とか PHP とかプログラミングがわからなくても、なんとなく意味合いを推し量ることができます。phpMyAdmin などのツールでデータベースと照らし合わせて見てみると(多少)面白くなるでしょう。</p>

<p>これから紹介する方法は、Movable Type が発行する SQL について、特別に理解する時間をとる必要はありません。設定しておいて、管理画面を使っている時にたまに見てみれば、そのうち理解が深まってきます(※ 個人差あります)。</p>

<h4>管理画面上で SQL を表示する</h4>

<p>現在の Movable Type は mt-config.cgi に DebugMode 1 と書くか、システムの全般設定で「デバッグモード」を設定すると、Django Debug Toolbar によるデバッグ表示が出てきます。これは、数年前に(今のところたった一度だけ)大阪で MTDDC が開催された翌日にアルファサードにて行われたハンズオンで、某氏が「デバッグツールが充実してるっていいよね」と発表していたものがベースになっているものです。</p>

<p>DebugMode 4 にすれば、ツールバーの「SQL」の項目に SQL が表示されます。これは、Data::ObjectDriver レベルで計測された SQL なので、管理画面下の「警告とメッセージ」に表示される SQL とは少し異なります。どう異なるかについては本題ではありませんが、Movable Type を理解するためには、「警告とメッセージ」の内容の方が有用です。</p>

<p class="text-center"><img alt="img_nukamiso_alertmessage1.jpg" src="/blog/images/img_nukamiso_alertmessage1.jpg" width="500" height="200" /><span class="image-caption">デフォルト状態の警告とメッセージ</span></p>

<p>しかし、標準状態では SQL の具体的な数値や値は「?」になっています。いわゆるプレースホルダの状態です。このままではいまいちピンとこないので、以下のプラグインを入れましょう。</p>

<p><a href="https://weeeblog.net/mt/mt-download.cgi?asset_id=137" class="download-link">Nukamiso プラグイン(約 8 kb)</a>

<p>これを設置すると、プレースホルダを置換して具体的な内容にしてくれます。一部カバーしていない形式もありますが、まあだいたいカバーしています。以下は記事編集画面を開いた時に表示された内容のキャプチャです。</p>

<p class="text-center"><img alt="img_nukamiso_alertmessage2.jpg" src="/blog/images/img_nukamiso_alertmessage2.jpg" width="500" height="200" /><span class="image-caption">プレースホルダが置換された状態</span></p>

<p>具体的な値になると、何やってるかずいぶんイメージしやすくなりますね(視認性は大差ありませんけどね)。たとえば、ログイン画面を表示すると以下のような内容が表示されます。</p>

<code>
<pre>
QUERY: SELECT field_id FROM mt_field
QUERY: SELECT failedlogin_id FROM mt_failedlogin WHERE (failedlogin_remote_ip = '61.205.62.101') AND (failedlogin_ip_locked = 1) AND (failedlogin_start >= 1387167232) LIMIT 1
</pre>
</code>

<p>カスタムフィールドを初期化してるのかなーとか、拒否対象でないかとか調べてそうですね。同じログイン画面を表示するケースでも、ログアウトした状態の場合にはもう少し違った表示がなされます。</p>

<code>
<pre>
QUERY: SELECT field_id FROM mt_field
QUERY: SELECT author_id FROM mt_author WHERE (author_name = 'okayama') AND (author_type = 1) LIMIT 1
QUERY: SELECT author_id, author_api_password, author_auth_type, author_basename, author_can_create_blog, author_can_view_log, author_created_by, author_created_on, author_date_format, author_email, author_entry_prefs, author_external_id, author_hint, author_is_superuser, author_locked_out_time, author_modified_by, author_modified_on, author_name, author_nickname, author_password, author_preferred_language, author_public_key, author_remote_auth_token, author_remote_auth_username, author_status, author_text_format, author_type, author_url, author_userpic_asset_id FROM mt_author WHERE (author_id IN (1))
QUERY(see also BIND): INSERT INTO mt_log (log_author_id, log_blog_id, log_category, log_class, log_created_by, log_created_on, log_ip, log_level, log_message, log_metadata, log_modified_by, log_modified_on) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
BIND: { 'author_id' => '1', 'blog_id' => '0', 'category' => 'logout_user', 'class' => 'author', 'created_on' => '2013-12-16 04:47:57', 'ip' => '61.205.62.101', 'level' => '1', 'message' => "ユーザー'okayama'(ID1)がサインアウトしました。", 'modified_on' => '2013-12-16 04:47:57' }
QUERY: DELETE from mt_session WHERE (session_kind = 'US') AND (session_name = 1)
QUERY(see also BIND): SELECT session_id FROM mt_session WHERE (session_id = ?) LIMIT 1
BIND: [ undef ]
QUERY: SELECT failedlogin_id FROM mt_failedlogin WHERE (failedlogin_remote_ip = '61.205.62.101') AND (failedlogin_ip_locked = 1) AND (failedlogin_start >= 1387167477) LIMIT 1
</pre>
</code>

<p>※「BIND」とあるのは、プレースホルダの置換ができてないものについて、こういうものが入る予定ですよという意味程度に考えてください。「QUERY(see also BIND)」の行と照らし合わせて読んでみましょう。</p>
<p>先ほどのものに加えて、ユーザを読み込んだり、サインアウトしたログを保存したり、セッションを削除したりしていますね。</p>

<p><br>なお、もっと！見たいあなた向けに、mottto=1 をつけると、呼び出し元の処理を遡ることができます。DebugMode 6 にしても同じようなことができるのですが、あまり見やすくありません。SQL とその呼び出し元を確認する用途であれば、DebugMode 4 + パラメータ motto=1 が見やすいでしょう。以下、記事編集画面を開いた時に表示された内容のキャプチャです。</p>

<p class="text-center"><img alt="img_nukamiso_alertmessage2.jpg" src="/blog/images/img_nukamiso_motto.jpg" width="500" height="185" /><span class="image-caption">パラメータ motto=1</span></p>

<p>motto=1 で遡れるのは 5 つ前までです。もっともっと！遡りたいあなたは、URL パラメータに mottomotto=1 をつけてください。もっともっともっと！遡りたいあなたは、mottomottomotto=1 をつけてください。</p>

<p class="text-center"><img alt="img_nukamiso_alertmessage2.jpg" src="/blog/images/img_nukamiso_mottomotto.jpg" width="500" height="213" /><span class="image-caption">パラメータ mottomotto=1</span></p>

<p>上記ではログイン画面のみ触れましたが、ブログ記事編集画面など、もっとたくさんの SQL が発行される場面でも使ってみてください。あと、エラーで赤い帯のメッセージが出た時にも、何しててエラーになったか把握するのに有効だったりします。イヤですねあの画面。</p>


<h4>ダイナミック・パブリッシングの場合</h4>
<p>ダイナミック・パブリッシングでも SQL を表示することができます。/path/to/mt/php/extlib/adodb5/adodb.inc.php 内の「var $debug = false;」を「true」にしてやることで、SQL が表示されます(表示ページ内に出てくるので、運用中のウェブサイトでは行わないようにしましょう)。</p>

<p class="text-center"><img alt="img_nukamiso_sql_dynamic.jpg" src="/blog/images/img_nukamiso_sql_dynamic.jpg" width="500" height="173" /><span class="image-caption">ダイナミック・パブリッシングでの SQL 表示</span></p>

<p>画像では少し見づらいかもしれませんが、こちらはプレースホルダではないので、初めから具体的な内容が見えていますね。この部分では、blog_id が 2 のインデックステンプレートのうち、テンプレート名、出力ファイル名、identifier のいずれかが「JavaScript」であるテンプレートを探しているようです。そのあと、template_meta_template_id が 456 の mt_template_meta を探しているので、「JavaScript」なテンプレートの ID は 456 だったのかな、と想像できます。</p>

<p>また、今回利用した Nukamiso プラグインにはこの他、管理画面を使いやすくしたり、デバッグや開発を行うための複数の機能が盛り込まれています。<a href="/blog/2013/12/19_0902.php">詳しくはこちらの記事をご覧ください</a>。</p>]]>
        
    </content>
</entry>

<entry>
    <title>OpenPluginSetting プラグインを公開します</title>
    <link rel="alternate" type="text/html" href="https://weeeblog.net/blog/2013/08/25_1738.php" />
    <id>tag:weeeblog.net,2013:/blog//2.633</id>

    <published>2013-08-25T08:38:46Z</published>
    <updated>2013-08-25T09:17:18Z</updated>

    <summary>プラグイン設定を保存すると遷移先 URL にページ該当のプラグインへのページ内アンカーがつき、さらに設定タブがアクティブになる Movable Type プラグインであるOpenPluginSetting プラグインを公開しています。</summary>
    <author>
        <name>okayama</name>
        
    </author>
    
    <category term="movabletype" label="Movable Type" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="openpluginsetting" label="OpenPluginSetting" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="plugin" label="Plugin" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="publish" label="Publish" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="https://weeeblog.net/blog/">
        <![CDATA[<h4>概要</h4>

<p>Movable Type ではプラグイン設定を保存すると同じページに遷移し、一番上に「プラグインの設定を保存しました。」と表示されます。途中まで設定を書いていったん保存した場合など再度同じプラグインの設定を編集したいときや、保存された内容を確認したいときなど、もう一度該当のプラグインまで画面をスクロールして、設定タブをアクティブにして...という操作を行うことになります。また、特定のプラグインの設定タブをアクティブにした状態の URL を誰かに渡す、ということもできません。</p>

<p>この作業ストレスを軽減すべく OpenPluginSetting プラグインを作成しました。導入後にプラグイン設定を保存すると遷移先 URL に該当のプラグインへのページ内アンカーがつき、さらに設定タブがアクティブになります。もちろんその状態の URL をコピーして渡せば、他の人にプラグイン設定をチェックしてもらうこともできます。</p>

<p class="text-center"><img alt="img_plugins_openpluginsetting.jpg" src="/blog/images/img_plugins_openpluginsetting.jpg" width="500" height="215"  alt="プラグイン設定保存後" /><span class="image-caption">プラグイン設定保存後</span>

<p>また、HTML ソースから id を調べれば、特定のプラグインの設定タブをアクティブにした状態の URL を自分で作ることもできます。設定欄を囲っている div の id 属性をページ内アンカーとして指定します。</p>

<p class="text-center"><img alt="img_plugins_openpluginsetting02.jpg" src="/blog/images/img_plugins_openpluginsetting02.jpg" width="500" height="174" alt="HTML ソースから id を調べる"  /><span class="image-caption">HTML ソースから id を調べる</span>

<p>HTML ソースが上記の場合、そのプラグインの設定タブをアクティブにした状態の URL は以下になります。</p>

<code>
<pre>http://example.com/mt/mt.cgi?__mode=cfg_plugins&blog_id=0#plugin-22
</pre>
</code>

<h4>ダウンロード</h4>

<p><a href="https://weeeblog.net/mt/mt-download.cgi?asset_id=123" class="download-link">OpenPluginSetting プラグイン(約 2.7 kb)</a></p>

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

<p>解凍してできた OpenPluginSetting フォルダを</p>

<code>
<pre>/path/to/mt/plugins
</pre>
</code>

<p>内にそのままアップロードしてください。正しくアップロードできていれば、システム・メニューのプラグイン設定画面に OpenPluginSetting プラグインの項目が表示されます。</p>

<h4>動作環境</h4>

<ul>
    <li>Movable Type version 6 以上</li>
    <li>Movable Type version 5.1 以上</li>
</ul>]]>
        
    </content>
</entry>

<entry>
    <title>Movable Type 6 のメッセージセンター機能の使い方</title>
    <link rel="alternate" type="text/html" href="https://weeeblog.net/blog/2013/08/24_1750.php" />
    <id>tag:weeeblog.net,2013:/blog//2.630</id>

    <published>2013-08-24T08:50:30Z</published>
    <updated>2013-08-24T16:05:55Z</updated>

    <summary>Movable Type 6 のメッセージセンター機能の使い方などを掲載しています。</summary>
    <author>
        <name>okayama</name>
        
    </author>
    
    <category term="code" label="Code" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="customize" label="customize" 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="ja" xml:base="https://weeeblog.net/blog/">
        <![CDATA[<h4>概要</h4>

<p>Movable Type 6 にメッセージセンターという、各種アラート、メッセージ表示を行うための機能がついています。<a href="http://www.movabletype.jp/beta/60/message-center.html">メッセージセンター機能についてのページ</a>に外観からコールバックを使った表示方法まですべてが集約されています。あらこれだけ？と思いますが、まあ確かにこれだけ。でも、メッセージセンターは CMS からのプッシュ通知であり、様々な面で CMS の利便性を高める可能性でもあります。最近記事書いてないけど大丈夫？とか、もうすぐエイプリルフールだけどネタの仕込みは進んでる？今日の 11:00 にこの記事が日時指定公開だからね、といったブロガー向けな内容から、システム管理者からのメンテナンス告知とか、特定ユーザに向けたメッセージ、TODO 機能なんかにも使えそうですね。</p>

<h4>仕組み</h4>

<p>メッセージセンターは「サイト情報」や「ようこそ、Loupeへ」と同じくメインカラムに表示されるダッシュボードウィジェットですが、テンプレートの書き方によりメッセージがある場合だけ表示されるようになっていることと、can_close="0" であるために非表示化ができないため、ユーザのコントロール外で強制的に表示される形になっています。</p>
<p>使われているテンプレートは /path/to/mt/tmpl/cms/widget/notification_dashboard.tmpl で、特別なハンドラはありません。テンプレートに記述された内容のとおり、テンプレート変数 loop_notification_dashboard にメッセージの情報をセットしておけば表示されます。<a href="http://www.movabletype.jp/beta/60/message-center.html#callback">メッセージセンターの機能紹介ページではコールバックを使った実装方法が紹介されています</a>が、notification_dashboard.tmpl を alt-tmpl し、テンプレートタグを使って変数に突っ込む、といったこともできますね。</p>

<h4>コールバックでメッセージをセットする</h4>

<p>公式の紹介ページに過不足ないソースコードのサンプルが記載されていて、書かれている通りです。config.yaml にコールバック set_notification_dashboard を定義します。</p>

<pre>
<code>
callbacks:
    set_notification_dashboard: $messagecenter::MessageCenter::Callbacks::_cb_set_notification_dashboard
</code>
</pre>

<p>そして、ハンドラを定義します。コールバックですから最初の引数は MT::Callback、二番目にメッセージの情報を格納した配列リファレンスが渡されます。メッセージのデータを作って、$loop_notification_dashboard に push することでメッセージが追加され、配列の順に表示されます。ダッシュボード以外の画面にも表示される通知「メッセージがN件あります。」の件数も配列数から自動的にカウントしてくれます。</p>

<pre>
<code>
sub _cb_set_notification_dashboard {
    my ( $cb, $loop_notification_dashboard ) = @_;
</code>
</pre>

<p>$loop_notification_dashboard に push するデータの形は公式の機能紹介ページを見ればわかりますが、level, text, detail をキーとしたハッシュリファレンスです。level はアイコンを表示する class になるので指定できるものが決まっており、指定しない場合は warning になります。アイコンを表示したくない場合は foo とか未定義の class をすればよいでしょう。text に指定するテキストはウィジェット内にデフォルトで表示され、クリックすると detail に指定するテキストが表示されます。detail には html タグを使うこともできるようです。このページおかしいんじゃないの、と言って編集画面へのリンクを張っておくこともできますね。</p>

<pre>
<code>
    my @notifications = (
        {
            level  => 'foo',
            text   => $plugin->translate( 'No icon' ),
            detail => '&lt;a href="http://example.com/"&gt;' . $plugin->translate( 'Fooooooo!' ) . '&lt;/a&gt;',
        },
    );
    push( @$loop_notification_dashboard, @notifications );
</code>
</pre>

<p>$app->user を使えば、ログインユーザ情報を使ってメッセージを表示することもできます。ログインしているユーザに対して「もっと仕事しろ」と通知する場合は以下のようになりますね。気軽に声をかけるフリをしつつ、詳細を見ると恐怖のメッセージが表示されるようにするには以下のように指定します。</p>

<pre>
<code>
    my $app = MT->instance();
    my @notifications = (
        {
            level  => 'error',
            text   => $plugin->translate( 'Hi, [_1]', MT::Util::encode_html( $app->user->nickname ) ),
            detail => $plugin->translate( 'Work harder.' ),
        },
    );
    push( @$loop_notification_dashboard, @notifications );
</code>
</pre>

<p>なお、コールバック set_notification_dashboard は戻り値に応じた Movable Type 側の処理はなく、die してもシステムログに残るだけで画面上の処理は進行します。</p>

<h4>その他</h4>

<p>メッセージセンターにメッセージを表示するときに使うコールバック set_notification_dashboard は、Listing Framework の __mode=filtered_list を含め、全てのユーザの全ての画面でコールされます(__mode=filtered_list では不要な気もしますが)。なるべく軽い処理にしておくほうがよいでしょうから、あくまでもメッセージセンターで表示する内容は概略に留めるのがよいでしょう。</p>

<p>個人的には、現在は単純に配列の順番に表示されるので、level => 'error' が上とか、もしくは priority を指定することで意図して上に表示させるなどの機能があってもいいんじゃないかなと思っていますが、おそらく今のところはそうたくさんの項目が表示される前提の機能ではない印象です。</p>

<h4>メッセージセンターに関する所感</h4>

<p>Data API が注目されがちな Movable Type 6 は全体的にデベロッパー向けの機能が強化されている印象を受けますが(もちろんそういう面も多分にあるのだと思いますが)、ユーザー体験の向上につなげやすそうなメッセージセンターや Chart API もいいですよね。</p>

<p>なお、今回、メッセージセンター機能について調べるのに使ったプラグインを <a href="https://github.com/okayama/mt-plugin-messagecenter">GitHub</a> に公開しています。</p>]]>
        
    </content>
</entry>

<entry>
    <title>Movable Type 6 の Data API で再構築する</title>
    <link rel="alternate" type="text/html" href="https://weeeblog.net/blog/2013/08/10_0223.php" />
    <id>tag:weeeblog.net,2013:/blog//2.630</id>

    <published>2013-08-09T17:23:48Z</published>
    <updated>2013-08-24T10:55:14Z</updated>

    <summary>Movable Type 6 の Data API を使って再構築を行う方法を掲載しています。</summary>
    <author>
        <name>okayama</name>
        
    </author>
    
    <category term="code" label="Code" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="customize" label="customize" 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="ja" xml:base="https://weeeblog.net/blog/">
        <![CDATA[<h4>概要</h4>

<p>定期的に再構築を回す、という手段は、例えばランキングを反映したいとか RSS から取り込んで表示したいといったような積極的な目的から、何かしらの問題を回避するための消極的な目的まで含め、比較的便利なソリューションのひとつです。</p>
<p>Movable Type 6 では、Data API によって再構築を行う手段が提供されています。覚えておけば余計なプラグインを入れる必要もありませんね。</p>

<h4>リクエストの形式</h4>

<p>端的には以下のような形式でリクエストを送ります。MT::App::DataAPI::core_endpoints でハンドラを確認すると、「/path/to/mt/lib/MT/DataAPI/Endpoint/Publish.pm」の MT::DataAPI::Endpoint::Publish::entries が受け手の処理になるようですね。</p>
<p>ここでは特に触れませんが、ヘッダ情報に認証のための accessToken を含める必要があります。</p>

<pre>
<code>
http://example.com/mt/mt-data-api.cgi/v1/publish/entries?ids=1,2,3,4,5,6,7,8,9,10
</code>
</pre>

<p>パラメータ ids には再構築したいエントリー ID をカンマ区切りで指定します。再構築させるエントリーが決まっていればそれを指定しましょう。そうでない場合は事前にエントリーのリストを取得するリクエストを送り、ID を取り出して連結したものを指定しましょう。なお、指定する ID はブログ記事でもウェブページのものでもかまいません。</p>
<p>この ids パラメータは必須なので、指定しないと何もしてくれません。ただ、Movable Type は前後のエントリーも合わせて再構築するので、厳密にはすべてのエントリーの ID を付与する必要があるわけではないといえばないのですが、とはいえ間引く方が手間がかかるので、全部指定してしまう方が楽でしょう。また、エントリーの再構築に合わせてインデックステンプレートも再構築されます。このあたりの動きは Data API でなくとも同じですね。特定のインデックステンプレートだけを再構築するためのエンドポイントはないようですが、同じブログのどれかひとつのエントリーを再構築させておくことでカバーできそうです。</p>

<h4>戻り値</h4>

<p>指定した ID のエントリー全ての再構築が終わったか、そうでないかで戻り値が異なります。再構築が終わった場合は以下です。</p>

<pre>
<code>
$VAR1 = {
          'status' => 'Complete',
          'restIds' => '',
          'startTime' => '2013-08-10T01:13:55+09:00'
        };
</code>
</pre>

<p>再構築が終わっていない場合は以下のようになります。</p>

<pre>
<code>
$VAR1 = {
          'status' => 'Rebuilding',
          'restIds' => '6,7,8,9,10',
          'startTime' => '2013-08-10T01:13:55+09:00'
        };
</code>
</pre>

<p>このとき、レスポンスヘッダには「X-MT-Next-Phase-URL」という情報が含まれています。Complete になるまで「X-MT-Next-Phase-URL」にアクセスし、再構築を繰り返します。Perl でやるなら以下のような感じです。</p>

<pre>
<code>
&rebuilding( '/publish/entries?ids=1,2,3,4,5,6,7,8,9,10' );

sub rebuilding {
    my ( $path ) = @_;
    my $endpoint = $api_url . $path;
    my $request = HTTP::Request->new( 'GET', $endpoint );
    $request->header( 'X-MT-Authorization' => "MTAuth accessToken=$accessToken" );
    my $ua = MT->new_ua;
    my $res = $ua->request( $request );
    my $content = MT::Util::from_json( $res->content );
    print Dumper( $content );
    if ( my $next_url = $res->header( 'X-MT-Next-Phase-URL' ) ) {
        &rebuilding( $next_url );
    }
}
</code>
</pre>

<p>なお、MT::DataAPI::Endpoint::Publish::entries を見ると、再構築処理は MT::App::CMS::rebuild_these に渡されていることがわかります。再構築処理実行前のコールバック pre_build が実行されますし、環境変数 EntriesPerRebuild の値によって一回あたりの再構築件数を制御することもできます。</p>

<p>たとえば、ID が 1 のブログについて、デフォルトである 10 件ごとにエントリーを取得しつつ再構築を回すのであれば、以下のように行うことができます。もちろんエントリー取得の際の limit を増やして一回で取得してしまってもよいでしょう。</p>

<pre>
<code>
my @rebuit_ids = ();
rebuild_all_entries();

sub rebuild_all_entries {
    my ( $offset ) = @_;
    $offset ||= 0;
    my $endpoint = $api_url . "/sites/$blog_id/entries?fields=id,title&offset=$offset"; # specific fields
    my $request = HTTP::Request->new( 'GET', $endpoint );
    $request->header( 'X-MT-Authorization' => "MTAuth accessToken=$accessToken" );
    my $ua = MT->new_ua;
    my $res = $ua->request( $request );
    unless ( $res->is_success ) {
        if ( $res->code == 500 ) {
            my $content = MT::Util::from_json( $res->content );
            my $message = $content->{ error }->{ message };
            $message =~ s/\\x{([0-9a-z]+)}/chr(hex($1))/ge;
            die $message; # invalid request, and so on...
        } else {
            die $res->as_string;
        }
    }
    my $content = MT::Util::from_json( $res->content );
    my $total_results = $content->{ totalResults };
    my $items = $content->{ items } || [];
    my @entry_ids = map { $_->{ id } } @$items;
    push( @rebuit_ids, @entry_ids );

    print "rebuit num: " . scalar @rebuit_ids . "\n";
    print "total_results: " . $total_results . "\n";
    &rebuilding( '/publish/entries?ids=' . join( ',', @entry_ids ) );
    
    unless ( $total_results == scalar @rebuit_ids ) {
        &rebuild_all_entries( $offset + 10 );
    }
}

sub rebuilding {
    my ( $path ) = @_;
    my $endpoint = $api_url . $path;
    my $request = HTTP::Request->new( 'GET', $endpoint );
    $request->header( 'X-MT-Authorization' => "MTAuth accessToken=$accessToken" );
    my $ua = MT->new_ua;
    my $res = $ua->request( $request );
    my $content = MT::Util::from_json( $res->content );
    print Dumper( $content );
    if ( my $next_url = $res->header( 'X-MT-Next-Phase-URL' ) ) {
        &rebuilding( $next_url );
    }
}
</code>
</pre>

]]>
        
    </content>
</entry>

<entry>
    <title>Movable Type 6 の Data API と関連するコールバックや拡張カラムの扱いなど</title>
    <link rel="alternate" type="text/html" href="https://weeeblog.net/blog/2013/08/04_2301.php" />
    <id>tag:weeeblog.net,2013:/blog//2.629</id>

    <published>2013-08-04T14:01:44Z</published>
    <updated>2013-08-07T04:47:52Z</updated>

    <summary>Movable Type 6 の Data API と関連するコールバックや拡張カラムの指定・操作方法などを掲載しています。</summary>
    <author>
        <name>okayama</name>
        
    </author>
    
    <category term="code" label="Code" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="customize" label="customize" 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="ja" xml:base="https://weeeblog.net/blog/">
        <![CDATA[<p>あんまりにも久しぶりすぎて、ブログの書き方から復習が必要でした。</p>
<p>Movable Type 6 に実装される Data API を試してみた人もいると思います。発表前に触れる機会をいただいていたにも関わらずインストールする時間すら取れない有様だったので、少しでも触れておくことと、まだドキュメントは親切と言える内容でもなさそうなので、多少なりとも自分と同じようなポジションの方々の役に立てればと...あと、僕のこと忘れ去られないようにと...</p>

<h4>概要</h4>

<p>まず、Data API においてリクエストを受け付けてくれる CGI は(デフォルトでは)mt-data-api.cgi です。処理の実体は MT::App::DataAPI で、/path/to/mt/lib/MT/App/DataAPI.pm がこれにあたります。</p>
<p>MT::App::DataAPI は MT::App を継承したアプリケーションで、その点は mt-comments.cgi や mt-search.cgi はもちろん mt.cgi とも変わることはありません。なので、以下のようなコールバックは mt-data-api.cgi にも実行されます。</p>

<ul>
	<li>MT::App::DataAPI::init_request</li>
	<li>MT::App::DataAPI::init_app</li>
	<li>MT::App::DataAPI::pre_run</li>
	<li>MT::App::DataAPI::post_run</li>
	<li>MT::App::DataAPI::take_down</li>
</ul>

<p>プラグインの registry に登録するときは「MT::App::DataAPI::」を省略することもできますが、その場合は mt-data-api.cgi だけでなく、mt.cgi や mt-comments.cgi でも動作します。</p>
<p>この他に、mt-data-api.cgi に特有のものとして、以下のコールバックも実行されます。</p>

<ul>
	<li>pre_run_data_api(MT::App::DataAPI::pre_run の後)</li>
	<li>post_run_data_api(MT::App::DataAPI::pre_run の前)</li>
</ul>

<p>mt-data-api.cgi については<a href="https://github.com/movabletype/Documentation/wiki/Quick-reference">公式に各エンドポイントとその説明</a>が上がっています。比較的ベーシックな、API に慣れた人には扱いやすい形式だと思います。エンドポイントについては MT::App::DataAPI::core_endpoints にデフォルトのエンドポイントの指定があります。対応するハンドラもここを見ればわかります。</p>

<p>リクエストの仕方についてはすでに様々な方が言及されていると思うので簡略化しますが、たとえば、ID が 1 のブログに記事を新規に作成する場合、<a href="https://github.com/movabletype/Documentation/wiki/data-api-entries-insert">このページ</a>のように、「https://example.com/mt/mt-data-api.cgi/v1/sites/1/entries」に POST します。Perl でやるなら以下のような感じです。<br />※ $accessToken は、<a href="https://github.com/movabletype/Documentation/wiki/data-api-authentication-authentication">認証</a>によって得られるレスポンスの「accessToken」です</p>

<pre>
<code>
my $endpoint = $api_url . "/sites/1/entries";
my $params = {
    'entry' => MT::Util::to_json( { title => 'Hello by DataAPI: ' . MT::Util::log_time(),
                                    body => 'This is test',
                                    status => 'Draft',
                                  },
                                ),
};
my $request = HTTP::Request->new( 'POST', $endpoint );
$request->header( 'X-MT-Authorization' => "MTAuth accessToken=$accessToken" );
$request->content( join( '&', map { $_ . '=' . $params->{ $_ } } keys %$params ) );
my $ua = MT->new_ua;
my $res = $ua->request( $request );
unless ( $res->is_success ) {
    if ( $res->code == 500 ) {
        my $content = MT::Util::from_json( $res->content );
        my $message = $content->{ error }->{ message };
        $message =~ s/\\x{([0-9a-z]+)}/chr(hex($1))/ge;
        die $message;
    } else {
        die $res->as_string;
    }
}
my $content = MT::Util::from_json( $res->content );
</code>
</pre>

<p>公式ドキュメントにはステータスコード 500 は載っていませんが、たとえば送信したパラメータが正しくない場合等に「不正な要求です」という応答が返るようです。そういうケースへの対応の方が時間を要することが多いので、上記には参考までにエラーメッセージの取り出し方の記述を含めました。</p>
<p>上記では最低限のカラムしかデータを入れていません。カスタムフィールドや、プラグインによって拡張したカラムについては以下のようにします。</p>

<p>なお、返されるオブジェクトの情報について、以下のように fields パラメータで指定することにより、必要なフィールドのみに絞ることができます。この点は各エンドポイントに共通のようです。</p>

<pre>
<code>
/sites/$blog_id/entries?fields=id,title
/sites/$blog_id/entries/$entry_id?fields=id,title
</code>
</pre>

<h4>カスタムフィールドを更新する場合</h4>

<p>以下のように、customFields の指定を追加します。これは、/path/to/mt/addons/Commercial.pack/lib/CustomFields/DataAPI.pm の CustomFields::DataAPI::fields に記述があるのですが、より端的にはカスタムフィールドを作成した後で上記を実行すると得られる返却値の形を見る方が早いでしょう。</p>

<pre>
<code>
my $params = {
    'entry' => MT::Util::to_json( { title => 'Hello by DataAPI: ' . MT::Util::log_time(),
                                    body => 'This is test',
                                    status => 'Draft',
                                    customFields => [
                                        {
                                          basename => 'text',
                                          value => 'teeeeeeeeeeeeext',
                                        }
                                    ],
                                  },
                                ),
};
</code>
</pre>

<h4>プラグインによって拡張したカラムを更新したい場合</h4>

<p>こちらはカスタムフィールドと同じというわけにはいきません。以下では、「foo」カラムを追加し、それを mt-data-api.cgi 経由で更新できるようにする例です。</p>
<p>まず、config.yaml に以下のように記述します。</p>

<pre>
<code>
object_types:
    entry:
        foo: string(255)
applications:
    data_api:
        resources:
            entry:
                fields:
                    - name: foo
                      from_object_default: bar
                updatable_fields:
                    - foo
</code>
</pre>

<p>object_types はこれまでの Movable Type でも必要だったカラム拡張に関する指定です。合わせて schema_version を指定することでアップグレードが行われ、mt_entry にカラム foo が追加されます。</p>
<p>applications 以下の指定が今回必要になる指定です。entry に対して「fields」と「updatable_fields」を指定しています。「fields」はレスポンスに含めるために、「updatable_fields」は mt-data-api.cgi 経由で更新できるようにするための指定です。「field」の「from_object_default」に指定した値はデフォルト値になります。「updatable_fields」が指定されていない場合、foo カラムの値は常に「from_object_default」になります。<br />このあたりは、/path/to/mt/lib/MT/DataAPI/Resource/Entry.pm の MT::DataAPI::Resource::Entry::fields や MT::DataAPI::Resource::Entry::updatable_fields にデフォルトのものがあるので、これを参考に、プラグインから registry に指定していくことになります。</p>

<p>これを指定した上で、以下のようにリクエストを送ることで foo カラムにデータを投入することができます。</p>

<pre>
<code>
my $params = {
    'entry' => MT::Util::to_json( { title => 'Hello by DataAPI: ' . MT::Util::log_time(),
                                    body => 'This is test',
                                    status => 'Draft',
                                    foo => 'foooooooooooo!',
                                  },
                                ),
};
</code>
</pre>

<h4>オブジェクトの保存、削除等に関連するコールバック</h4>

<p>これまでもコミュニティ機能などで使われていた API 経由での保存に準じて以下のようなコールバックが実行されるようです。他にもあると思いますが、ベーシックなところだけ。</p>

<ul>
	<li>data_api_save_filter.entry</li>
	<li>data_api_pre_save.entry</li>
	<li>data_api_post_save.entry</li>
	<li>data_api_post_delete.entry</li>
</ul>

<h4>Data API に関する所感</h4>

<p>自分に関係がありそうなところを少し調べてみた、触ってみたという程度でまだ試せていないプロパティなどたくさんありますが、総じてスッキリとした形で扱いやすそうな印象を持っています。<br />なお、今回、Data API について調べるのに使ったプラグインを <a href="https://github.com/okayama/mt-plugins-dataapi">GitHub</a> に公開しています。認証から、エントリーの作成、更新、削除、ログアウトまでを一連の動作として行うツールも入れてあります。参考になれば。</p>]]>
        
    </content>
</entry>

<entry>
    <title>MT から Gumroad でリンクを販売するプラグインを Gumroad で販売してみます</title>
    <link rel="alternate" type="text/html" href="https://weeeblog.net/blog/2012/02/19_1812.php" />
    <id>tag:weeeblog.net,2012:/blog//2.628</id>

    <published>2012-02-19T09:12:43Z</published>
    <updated>2012-02-19T09:18:54Z</updated>

    <summary>MT から Gumroad でリンクを販売するプラグインを Gumroad で販売します。</summary>
    <author>
        <name>okayama</name>
        
    </author>
    
    <category term="gumroad" label="Gumroad" 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="Plugin" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="https://weeeblog.net/blog/">
        <![CDATA[<h4>概要</h4>

<p>主に日本で話題になっている、先日サービスインした<a href="https://gumroad.com">Gumroad</a>、いろいろと物議を醸しているようですが、僕のように何かしら作ったものをパブリッシュしている人にとってはその機会のひとつとして捉えやすいように思います。例えば Movable Type プラグイン開発者であればプラグインそのものでもいいし、プラグインのサポートでもいいし、テーマでも、テンプレートでも、運用ノウハウでもいいかもしれません。</p>

<p><a href="https://gumroad.com/links/VEF">僕もひとつ、リンクを販売してみています。よろしければどうぞ</a></p>

<p>いい機会なので、Movable Type 管理画面から UI 操作だけで Gumroad にリンクを作って販売するためのプラグインを作ってみました(で、これも Gumroad で販売してみようと思います)。</p>

<p>ウェブサイト/ブログ、ブログ記事/ウェブページ、アイテム一覧画面から、プラグインアクションを選んでボタンを押すだけで Gumroad にリンクをポストします。</p>

<p class="text-center"><img src="https://weeeblog.net/blog/images/img_plugins_gumroad01.jpg" width="400" height="119" alt="プラグインアクション" /><span class="image-caption">プラグインアクション</span></p>

<h4>Gumroad URL</h4>

<p><a href="https://gumroad.com/l/RQr" class="download-link">MT プラグイン「Gumroad」</a></p>

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

<p>Gumroad からダウンロードしたアーカイブを解凍してできる Gumroad フォルダをそのまま /path/to/mt/plugins ディレクトリにアップロードします。</p>

<p>正しく設置できていれば、システム・メニューのプラグイン設定画面に Gumroad プラグインの項目が表示されます。</p>

<h4>動作環境</h4>

<ul>
    <li>Movable Type version 5.1 以上</li>
</ul>

<h4>使い方</h4>

<p>まず、各ブログのプラグイン設定から Gumroad のアカウント情報と各オブジェクトの販売価格を設定します。現状では、それぞれのオブジェクト単位でのみ価格を設定できます(個別の記事やアイテム単位で価格が決められればいいなと思っていますが、それは売れたらやろうと思っています)。また、価格の単位は Gumroad API の仕様上、セントになるようです。</p>

<p class="text-center"><img src="https://weeeblog.net/blog/images/img_plugins_gumroad02.jpg" width="400" height="278" alt="プラグイン設定画面" /><span class="image-caption">プラグイン設定画面</span></p>

<p>プラグイン設定が完了したら、各一覧画面に進み、プラグインアクションからリンクをポストして販売してみましょう。Gumroad へのポスト後は、一覧画面に Gumroad へのリンクが表示されます(表示されていない場合は「表示オプション」から「Gumroad リンク」をチェックしてください)。また、リンクを削除することもできます。</p>

<p class="text-center"><img src="https://weeeblog.net/blog/images/img_plugins_gumroad01.jpg" width="400" height="119" alt="プラグインアクション" /><span class="image-caption">プラグインアクション</span></p>

<h4>仕様</h4>

<p>ウェブサイト/ブログの場合は「名前」を、ブログ記事/ウェブページの場合は「タイトル」を、アイテムの場合は「名前」を、リンクの名前として Gumroad にポストします。また、リンクの「説明」として、ウェブサイト/ブログの場合は「説明」を、ブログ記事/ウェブページの場合は「概要」を、アイテムの場合は「説明」を Gumroad にポストします。これらも個別に設定できればいいなと思っていますが、それは売れたらやろうと思っています</p>]]>
        
    </content>
</entry>

<entry>
    <title>GoogleAnalytics プラグインがダッシュボードにグラフを表示してくれないときは</title>
    <link rel="alternate" type="text/html" href="https://weeeblog.net/blog/2011/07/22_1517.php" />
    <id>tag:weeeblog.net,2010:/blog//2.330</id>

    <published>2011-07-22T06:17:43Z</published>
    <updated>2011-07-22T06:31:17Z</updated>

    <summary>GoogleAnalytics プラグインがダッシュボードにグラフを表示してくれないときの対処法です。</summary>
    <author>
        <name>okayama</name>
        
    </author>
    
    <category term="googleanalytics" label="GoogleAnalytics" 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="Plugin" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="publish" label="Publish" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="update" label="Update" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="https://weeeblog.net/blog/">
        <![CDATA[<p>GoogleAnalytics プラグインは現行の最新版である Movable Type 5.12 でも動作しますが、 Movable Type をアップデートした後などに、ダッシュボードにアクセス情報のグラフが表示されないことがあります(その場合は「ブログ記事」など他のグラフも表示されないと思います)。そんなときは、以下のディレクトリを削除してから再度ダッシュボードにアクセスしてみてください。</p>

<code>
<pre>
/path/to/mt/mt-static/support/dashboard
</pre>
</code>

<p>このディレクトリには、ダッシュボードにグラフを表示する FLASH が読み込む XML なんかが格納されていて、削除しても次のアクセスの際にまた作成されます。グラフが表示されなくなってしまった場合は、一度 Movable Type に作りなおしてもらいましょう。</p>

<p>Enjoy your blog!</p>]]>
        
    </content>
</entry>

<entry>
    <title>続・SystemMenu プラグインをアップデートしました</title>
    <link rel="alternate" type="text/html" href="https://weeeblog.net/blog/2011/06/04_2114.php" />
    <id>tag:weeeblog.net,2010:/blog//2.330</id>

    <published>2011-06-04T12:14:08Z</published>
    <updated>2011-06-04T12:24:27Z</updated>

    <summary>システムメニューの各メニューへのリンクを表示するプラグイン SystemMenu の Movable Type 5.1 対応版を公開しています。</summary>
    <author>
        <name>okayama</name>
        
    </author>
    
    <category term="movabletype" label="Movable Type" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="plugin" label="Plugin" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="publish" label="Publish" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="systemmenu" label="SystemMenu" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="update" label="Update" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="https://weeeblog.net/blog/">
        <![CDATA[<p>ドロップダウンナビゲーションに、システムメニューの各メニューへのリンクを表示させる SystemMenu プラグインをアップデートしました(というか Movable Type 5.1 に対応したバージョンを作りました)。アップデート内容は以下です。</p>

<ul>
	<li>MT5.1 に対応しました。</li>
</ul>

<p>Movable Type 5.1 では以下のような表示になります。</p>

<p class="text-center"><img src="https://weeeblog.net/blog/images/img_plugins_systemmenu_mt5_1_01.jpg" width="300" height="373" alt="追加されたシステムメニューへのリンク" /><span class="image-caption">追加されたシステムメニューへのリンク</span></p>

<h4>ダウンロード</h4>

<p><a href="https://weeeblog.net/mt/mt-download.cgi?asset_id=116" class="download-link">SystemMenu-mt5.1 プラグイン(約 4.8 kb)</a></p>

<h4>インストール方法や注意点など</h4>

<p><a href="https://weeeblog.net/blog/2010/02/07_1902.php">公開時の記事(タイトル: SystemMenu プラグインを公開します)</a>を参照してください。</p>
]]>
        
    </content>
</entry>

<entry>
    <title>MT の管理画面を見飽きたら WEBFont でフォントを変えてみましょう</title>
    <link rel="alternate" type="text/html" href="https://weeeblog.net/blog/2011/04/15_1559.php" />
    <id>tag:weeeblog.net,2011:/blog//2.349</id>

    <published>2011-04-15T06:59:08Z</published>
    <updated>2011-10-02T08:04:02Z</updated>

    <summary>Movalbe Type 管理画面のフォントを Web Font に変更する方法を公開しています。</summary>
    <author>
        <name>okayama</name>
        
    </author>
    
    <category term="code" label="Code" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="customize" label="customize" 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="ja" xml:base="https://weeeblog.net/blog/">
        <![CDATA[<p>いつも代わり映えしない管理画面とにらめっこしているブロガーな人も制作者な人も、気分転換に管理画面のフォントを変えてみましょう。やり方は簡単です。プラグインもいりません。</p>

<p class="text-center"><img src="https://weeeblog.net/blog/images/img_cms_webfont.jpg" width="500" height="326" alt="Ubuntu を適用した状態" /><span class="image-caption">Ubuntu を適用した状態</span></p>

<h4>やり方</h4>

<p>以下のパスにあるファイルを、</p>

<code>
<pre>
/path/to/mt/tmpl/cms/include/header.tmpl
</pre>
</code>

<p>以下のパスにコピーします。</p>

<code>
<pre>
/path/to/mt/alt-tmpl/cms/include/header.tmpl
</pre>
</code>

<p>このファイルをエディタで開き、以下のように修正します。ここでは、<a href="http://www.google.com/webfonts">Google Web Fonts</a> の <a href="http://www.google.com/webfonts/family?family=Ubuntu&subset=latin">Ubuntu</a> にしてみます。</p>

<code>
<pre>
&lt;mt:setvarblock name="related_content"&gt;&lt;$mt:var name="related_content" trim="1"$&gt;&lt;/mt:setvarblock&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html lang="&lt;$mt:var name="language_tag"$&gt;" xmlns="http://www.w3.org/1999/xhtml" xmlns:mt="http://www.sixapart.com/ns/mt"&gt;
    &lt;head&gt;
        &lt;meta http-equiv="Content-Type" content="text/html; charset=&lt;$mt:var name="language_encoding"$&gt;" /&gt;
        &lt;title&gt;&lt;mt:if name="html_title"&gt;&lt;$mt:var name="html_title"$&gt;&lt;mt:else&gt;&lt;$mt:var name="page_title"$&gt;&lt;/mt:if&gt;&lt;mt:if name="blog_name"&gt; - &lt;$mt:var name="blog_name" escape="html"$&gt;&lt;/mt:if&gt; | &lt;$mt:var name="mt_product_name"$&gt;&lt;/title&gt;

&lt;mt:setvarblock name="html_head" prepend="1"&gt;
</pre>
</code>

を

<code>
<pre class="prettyprint">
&lt;mt:setvarblock name="related_content"&gt;&lt;$mt:var name="related_content" trim="1"$&gt;&lt;/mt:setvarblock&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html lang="&lt;$mt:var name="language_tag"$&gt;" xmlns="http://www.w3.org/1999/xhtml" xmlns:mt="http://www.sixapart.com/ns/mt"&gt;
    &lt;head&gt;
        &lt;meta http-equiv="Content-Type" content="text/html; charset=&lt;$mt:var name="language_encoding"$&gt;" /&gt;
        &lt;title&gt;&lt;mt:if name="html_title"&gt;&lt;$mt:var name="html_title"$&gt;&lt;mt:else&gt;&lt;$mt:var name="page_title"$&gt;&lt;/mt:if&gt;&lt;mt:if name="blog_name"&gt; - &lt;$mt:var name="blog_name" escape="html"$&gt;&lt;/mt:if&gt; | &lt;$mt:var name="mt_product_name"$&gt;&lt;/title&gt;

&lt;mt:ignore&gt;追加ここから&lt;/mt:ignore&gt;
&lt;link href='http://fonts.googleapis.com/css?family=Ubuntu' rel='stylesheet' type='text/css'&gt;
&lt;style type="text/css"&gt;
* { font-family: 'Ubuntu', arial, serif; }
&lt;/style&gt;
&lt;mt:ignore&gt;/追加ここまで&lt;/mt:ignore&gt;

&lt;mt:setvarblock name="html_head" prepend="1"&gt;
</pre>
</code>

<p>のように追記して保存するだけです。次にブラウザにアクセスしたとき、あなたの管理画面は Ubuntu になっています(感じ方には個人差があります)。</p>

<p>筆記体フォントとかにすると、一部何書いてあるかわかりにくくなったりします。このような場合はスタイルシートで使いどころを絞ってあげたほうがよさそうですね。</p>

<p class="text-center"><img src="https://weeeblog.net/blog/images/img_cms_webfont_02.jpg" width="500" height="326" alt="League Script を適用した状態" /><span class="image-caption">League Script を適用した状態</span></p>

<p>もちろんブラウザの設定を変えてインストールフォントに変えてもいいわけですが、その場合は恩恵に預かることができるのはそのブラウザを使っているあなただけです。みんなで共有しましょう。</p>]]>
        
    </content>
</entry>

<entry>
    <title>TweetFlickrPhotostreamFix プラグインを公開します</title>
    <link rel="alternate" type="text/html" href="https://weeeblog.net/blog/2010/12/27_1554.php" />
    <id>tag:weeeblog.net,2010:/blog//2.325</id>

    <published>2010-12-27T06:54:34Z</published>
    <updated>2010-12-26T05:32:34Z</updated>

    <summary>写真をアップロードすると自動的に http://flic.kr/p/***** の形式で Twitter につぶやいてくれる Movable Type プラグインである TweetFlickrPhotostream プラグインのアップデート版である TweetFlickrPhotostreamFix プラグインを公開しています。</summary>
    <author>
        <name>okayama</name>
        
    </author>
    
    <category term="movabletype" label="Movable Type" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="plugin" label="Plugin" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="publish" label="Publish" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tweetflickrphotostream" label="TweetFlickrPhotostream" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tweetflickrphotostreamfix" label="TweetFlickrPhotostreamFix" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="https://weeeblog.net/blog/">
        <![CDATA[<h4>概要</h4>

<p>先日公開した、Flickr にアップロードした写真を Flickr の短縮 URL である http://flic.kr/p/***** の形式でつぶやく <a href="https://weeeblog.net/blog/2010/05/05_1733.php">TweetFlickrPhotostream プラグイン</a>ですが、この</a>プラグインはエムロジック様の <a href="http://labs.m-logic.jp/cat2/posttweet/">PostTweet</a> とバッティングしてしまうことがわかりました。原因は Twitter の OAuth 認証で使用している Perl モジュールです。</p>

 <p>このプラグインは僕も使わせていただいているので回避のための手段を講じてみたのですが、うまくいかないので作り直し、いくつか旧版での課題をクリアしたものを TweetFlickrPhotostreamFix プラグインとして公開することにしました。なお、旧版である TweetFlickrPhotostream プラグインの方は今後アップデートしない予定のため、ご利用の方はご面倒ですが入れ替えていただくことをおすすめします。</p>

<p>ちなみに、リニューアル後の Twitter では、Flickr の短縮 URL が入ったつぶやきは以下のように表示されます。</p>

<p class="text-center"><img src="https://weeeblog.net/blog/images/img_plugins_tweetflickrphotostreamfix_01.jpg" width="400" height="329" alt="つぶやいた状態" /><span class="image-caption">つぶやいた状態</span></p>

<h4>ダウンロード</h4>

<p><a href="https://weeeblog.net/mt/mt-download.cgi?asset_id=100" class="download-link">TweetFlickrPhotostreamFix プラグイン(約 102.7 kb)</a></p>

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

<p>解凍すると、TweetFlickrPhotostreamFix フォルダが生成されます。その中身は以下のようになっています。</p>

<code>
<pre>
TweetFlickrPhotostreamFix
    - tools/
        - tweet-flickr-photostreamfix
    - plugins/
        - TweetFlickrPhotostreamFix/
</pre>
</code>

<p>それぞれ以下のように設置してください。</p>

<ul>
    <li>TweetFlickrPhotostream/tools/tweet-flickr-photostreamfix を /path/to/mt/tools 内に</li>
    <li>TweetFlickrPhotostream/plugins/TweetFlickrPhotostreamFix をそのまま /path/to/mt/plugins 内に</li>
</ul>

<p>正しく設置できていれば、システム・メニューのプラグイン設定画面に TweetFlickrPhotostreamFix プラグインの項目が表示されます。</p>

<h4>動作環境</h4>

<ul>
    <li>Movable Type version 5.0 以上</li>
</ul>

<p>Perl モジュール HTML::TreeBuilder がサーバーにインストールされていることが必要です(ActionStreams プラグインが MT にインストールされている場合はバンドルされていますので、自動的にそちらが利用されます)。</p>

<h4>使い方</h4>

<p>まず、各ブログのプラグイン設定から、Twitter への OAuth 認証を行います。</p>

<p class="text-center"><img src="https://weeeblog.net/blog/images/img_plugins_tweetflickrphotostreamfix_02.jpg" width="400" height="179" alt="プラグイン設定画面" /><span class="image-caption">プラグイン設定画面</span></p>

<p>「OAuth による認証」をクリックすると OAuth 認証のためのダイアログが開きます。ここから、「PIN 番号を取得する」をクリックすると別ウィンドウで Twitter の OAuth 認証画面が表示されます(Twitter にログインしていない場合はログイン画面が表示されます)。</p>

<p class="text-center"><img src="https://weeeblog.net/blog/images/img_plugins_tweetflickrphotostreamfix_03.jpg" width="400" height="389" alt="OAuth 認証のためのダイアログ" /><span class="image-caption">OAuth 認証のためのダイアログ</span></p>

<p class="text-center"><img src="https://weeeblog.net/blog/images/img_plugins_tweetflickrphotostreamfix_04.jpg" width="400" height="230" alt="Twitter の OAuth 認証画面" /><span class="image-caption">Twitter の OAuth 認証画面</span></p>

<p>TweetFlickrPhotostream によるアカウントへのアクセスを許可すると、PIN 番号が表示されます。それをダイアログ内の入力欄に入力し、「実行」ボタンを押してください。これで Twitter に関する認証は完了です。</p>

<p>引き続き、プラグイン設定の「Flickr に関する設定」の「Flickr の ID」を設定し、必要に応じて「つぶやきのフォーマット」を指定してください。これでプラグイン設定は完了です。あとは<a href="https://weeeblog.net/blog/2010/05/05_1733.php">旧版公開時の記事</a>を参照して cron の設定等を行い、Flickr を enjoy してください。</p>]]>
        
    </content>
</entry>

<entry>
    <title>続・GoogleAnalytics プラグインをアップデートしました</title>
    <link rel="alternate" type="text/html" href="https://weeeblog.net/blog/2010/12/27_1430.php" />
    <id>tag:weeeblog.net,2010:/blog//2.330</id>

    <published>2010-12-27T05:30:00Z</published>
    <updated>2017-05-09T07:45:39Z</updated>

    <summary>GoogleAnalytics プラグインをアップデートしました。アップデート内...</summary>
    <author>
        <name>okayama</name>
        
    </author>
    
    <category term="googleanalytics" label="GoogleAnalytics" 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="Plugin" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="publish" label="Publish" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="update" label="Update" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="https://weeeblog.net/blog/">
        <![CDATA[<p>GoogleAnalytics プラグインをアップデートしました。アップデート内容は以下です。</p>

<ul>
	<li>BLOG STATS 内 GoogleAnalytics 関連タブをアクティブにしている場合に、グラフを操作するとブログ記事作成件数が表示されてしまう問題の修正</li>
</ul>

<h4>ダウンロード</h4>

<p><a href="https://weeeblog.net/mt/mt-download.cgi?asset_id=30" class="download-link">GoogleAnalytics プラグイン(約 14.2 kb)</a></p>

<h4>インストール方法や注意点など</h4>

<p><a href="https://weeeblog.net/blog/2009/06/16_0140.php">公開時の記事(タイトル: GoogleAnalytics プラグインを公開します)</a>を参照してください。</p>
]]>
        
    </content>
</entry>

<entry>
    <title>TweetYouTubeUploadStream プラグインを公開します</title>
    <link rel="alternate" type="text/html" href="https://weeeblog.net/blog/2010/12/27_1353.php" />
    <id>tag:weeeblog.net,2010:/blog//2.325</id>

    <published>2010-12-27T04:53:22Z</published>
    <updated>2011-01-04T06:04:31Z</updated>

    <summary>動画をアップロードすると自動的に http://youtu.be/***** の形式で Twitter につぶやいてくれる Movable Type プラグインである TweetYouTubeUploadStream プラグインを公開しています。</summary>
    <author>
        <name>okayama</name>
        
    </author>
    
    <category term="movabletype" label="Movable Type" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="plugin" label="Plugin" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="publish" label="Publish" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tweetyoutubeuploadstream" label="TweetYouTubeUploadStream" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="https://weeeblog.net/blog/">
        <![CDATA[<h4>概要</h4>

<p>YouYube には短縮 URL http://youtu.be/***** があり、これを Twitter につぶやくとそのつぶやきに動画が埋めこまれます。YouTube のアカウント設定から動画をアップロードしたアクティビティを自動的につぶやく設定ができますが、iPhone の写真アプリから「YouTube に送信」をした場合など、(たぶん)API を通じてアップロードした場合はつぶやかれないようです。</p>

<p>これを解消するために、動画をアップロードすると自動的に http://youtu.be/***** の形式で Twitter につぶやいてくれる Movable Type プラグインである TweetYouTubeUploadStream を作成しました。Movable Type のタスク実行時に動作します。Twitter 認証には OAuth を使用していますので、パスワードを入力する必要はありません。</p>

<p class="text-center"><img src="https://weeeblog.net/blog/images/img_plugins_tweetyoutubeuoloadstream_01.jpg" width="300" height="335" alt="つぶやいた状態" /><span class="image-caption">つぶやいた状態</span></p>

<h4>ダウンロード</h4>

<p><a href="https://weeeblog.net/mt/mt-download.cgi?asset_id=95" class="download-link">TweetYouTubeUploadStream プラグイン(約 100.4 kb)</a></p>

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

<p>解凍すると、TweetYouTubeUploadStream フォルダが生成されます。その中身は以下のようになっています。</p>

<code>
<pre>
TweetYouTubeUploadStream
    - tools/
        - tweet-youtube-uploadstream
    - plugins/
        - TweetYouTubeUploadStream/
</pre>
</code>

<p>それぞれ以下のように設置してください。</p>

<ul>
    <li>TweetYouTubeUploadStream/tools/tweet-youtube-uploadstream を /path/to/mt/tools 内に</li>
    <li>TweetYouTubeUploadStream/plugins/TweetYouTubeUploadStream をそのまま /path/to/mt/plugins 内に</li>
</ul>

<p>正しく設置できていれば、システム・メニューのプラグイン設定画面に TweetYouTubeUploadStream プラグインの項目が表示されます。</p>

<h4>動作環境</h4>

<ul>
    <li>Movable Type version 5.0 以上</li>
</ul>

<p>Perl モジュール HTML::TreeBuilder がサーバーにインストールされていることが必要です(ActionStreams プラグインが MT にインストールされている場合はバンドルされていますので、自動的にそちらが利用されます)。</p>

<h4>使い方</h4>

<p>まず、各ブログのプラグイン設定から、Twitter への OAuth 認証を行います。</p>

<p class="text-center"><img src="https://weeeblog.net/blog/images/img_plugins_tweetyoutubeuploadstream_02.jpg" width="400" height="180" alt="プラグイン設定画面" /><span class="image-caption">プラグイン設定画面</span></p>

<p>「OAuth による認証」をクリックすると OAuth 認証のためのダイアログが開きます。ここから、「PIN 番号を取得する」をクリックすると別ウィンドウで Twitter の OAuth 認証画面が表示されます(Twitter にログインしていない場合はログイン画面が表示されます)。</p>

<p class="text-center"><img src="https://weeeblog.net/blog/images/img_plugins_tweetyoutubeuploadstream_03.jpg" width="400" height="386" alt="OAuth 認証のためのダイアログ" /><span class="image-caption">OAuth 認証のためのダイアログ</span></p>

<p class="text-center"><img src="https://weeeblog.net/blog/images/img_plugins_tweetyoutubeuploadstream_04.jpg" width="400" height="237" alt="Twitter の OAuth 認証画面" /><span class="image-caption">Twitter の OAuth 認証画面</span></p>

<p>TweetYouTubeUploadStream によるアカウントへのアクセスを許可すると、PIN 番号が表示されます。それをダイアログ内の入力欄に入力し、「実行」ボタンを押してください。これで Twitter に関する認証は完了です。</p>

<p>引き続き、プラグイン設定の「YouTube に関する設定」の「YouTube アカウント」を設定し、必要に応じて「つぶやきのフォーマット」を指定してください。これでプラグイン設定は完了です。</p>

<p>ここまでの設定が完了したら、cron またはタスクスケジューラ等により Movable Type のタスクが定期実行されるのを待ちましょう(登録を行っていない場合は登録しましょう)。なお、最初の一回は取得された動画アップロード情報のうち、一件分のみがつぶやかれます。</p>

<h4>tweet-youtube-uploadstream の使い方</h4>

<p>YouTube にアップロードした動画のアクティビティのつぶやきはすぐにさせたいが、Movable Type のタスクが頻繁に実行されるとサーバ負荷が心配な場合など、Movable Type のタスクとは別にこのプラグインによるつぶやきを行いたい場合には、Movable Type のタスク実行ツールである run-periodic-tasks と同じように tweet-youtube-uploadstream を cron またはタスクスケジューラに登録します。以下は 10 分おきに本プラグインを実行させたい場合の設定です。</p>

<code>
<pre>
*/10 * * * * cd /path/to/mt; ./tools/tweet-youtube-uploadstream
</pre>
</code>

<p>また、tweet-youtube-uploadstream の実行時に video_id と blog_id オプションを追加すると、Twitter にその動画の短縮 URL をつぶやきます。</p>

<code>
<pre>
cd /path/to/mt; ./tools/tweet-youtube-uploadstream -video_id=qUpwNUKWYdE -blog_id=1
</pre>
</code>
]]>
        
    </content>
</entry>

<entry>
    <title>SystemMenu プラグインをアップデートしました</title>
    <link rel="alternate" type="text/html" href="https://weeeblog.net/blog/2010/12/27_1045.php" />
    <id>tag:weeeblog.net,2010:/blog//2.330</id>

    <published>2010-12-27T01:45:52Z</published>
    <updated>2011-06-04T11:32:17Z</updated>

    <summary>ドロップダウンナビゲーションに、システムメニューの各メニューへのリンクを表示させ...</summary>
    <author>
        <name>okayama</name>
        
    </author>
    
    <category term="movabletype" label="Movable Type" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="plugin" label="Plugin" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="publish" label="Publish" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="systemmenu" label="SystemMenu" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="update" label="Update" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="https://weeeblog.net/blog/">
        <![CDATA[<p>ドロップダウンナビゲーションに、システムメニューの各メニューへのリンクを表示させる SystemMenu プラグインをアップデートしました。アップデート内容は以下です。</p>

<ul>
	<li>表示する項目をプラグイン設定できるようにしました。</li>
</ul>

<h4>ダウンロード</h4>

<p><a href="https://weeeblog.net/mt/mt-download.cgi?asset_id=82" class="download-link">SystemMenu プラグイン(約 4.8 kb)</a></p>

<h4>インストール方法や注意点など</h4>

<p><a href="https://weeeblog.net/blog/2010/02/07_1902.php">公開時の記事(タイトル: SystemMenu プラグインを公開します)</a>を参照してください。</p>
]]>
        
    </content>
</entry>

<entry>
    <title>SmartBReak プラグインを公開します</title>
    <link rel="alternate" type="text/html" href="https://weeeblog.net/blog/2010/11/30_1700.php" />
    <id>tag:weeeblog.net,2010:/blog//2.329</id>

    <published>2010-11-30T08:00:00Z</published>
    <updated>2010-11-30T12:44:28Z</updated>

    <summary>余分な改行タグを除去する機能を提供する SmartBReak プラグインを公開しています。</summary>
    <author>
        <name>okayama</name>
        
    </author>
    
    <category term="movabletype" label="Movable Type" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="plugin" label="Plugin" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="publish" label="Publish" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="smartbreak" label="SmartBReak" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="https://weeeblog.net/blog/">
        <![CDATA[<h4>概要</h4>

<p>ブログ記事/ウェブページ保存時やテンプレートタグでの出力の場合に余分な &lt;br /&gt; タグを取り除くことができます。ブログ記事/ウェブページ一覧画面から一括して除去処理を行うこともできます。テンプレートタグはダイナミックパブリッシングにも対応しています。</p>

<p>運用上、入力内容にはどうしても余分な改行タグが入ってしまう場合や、入力される内容を自動的にクリンナップして綺麗にしておきたい場合に役立つでしょう。</p>

<h4>ダウンロード</h4>

<p><a href="https://weeeblog.net/mt/mt-download.cgi?asset_id=93" class="download-link">SmartBReak プラグイン(約 8 kb)</a></p>

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

<p>解凍してできた SmartBReak フォルダを</p>

<code>
<pre>
/path/to/mt/plugins
</pre>
</code>

<p>内にそのままアップロードしてください。正しくアップロードできていれば、システム・メニューのプラグイン設定画面に SmartBReak プラグインの項目が表示されます。</p>

<h4>動作環境</h4>

<ul>
    <li>Movable Type version 5.0 以上</li>
</ul>

<p>Movable Type version 4.0 系でも動作すると思いますが、未確認のため対象外としています。</p>

<h4>コールバック処理</h4>

<p>ブログ記事記事/ウェブページの保存時に、「タイトル」「本文」「続き」「キーワード」「概要」欄に入力された改行タグから余分なものを取り除きます。</p>

<h4>プラグインアクション</h4>

<p>ブログ記事/ウェブページ一覧画面から、チェックボックスでチェックしたものを対象に処理を行うことができます。処理内容はコールバック処理と同等です。<br />すでに保存されてしまっているブログ記事/ウェブページをクリンナップしたい場合に使います。</p>

<h4>テンプレートタグ</h4>

<p>以下のようなタグが使用できます。</p>

<h5>ブロックタグ</h5>

<dl>
    <dt>&lt;MTSmartBReak&gt;</dt>
    <dd>
        囲んだ内容から余分な &lt;br /&gt; タグを取り除きます。
    </dd>
</dl>

<h5>モディファイア</h5>

<dl>
    <dt>smart_break</dt>
    <dd>
        出力内容から余分な &lt;br /&gt; タグを取り除きます。
    </dd>
</dl>

<h4>余分と判断される場合</h4>

<p>以下の場合を余分とみなします。</p>

<ul>
    <li>&lt;br /&gt; のあとにタブインデント/改行/スペースののちに &lt;br /&gt; がある場合</li>
    <li>&lt;br /&gt; のあとにタブインデント/改行/スペースののちに &lt;/p&gt; がある場合</li>
    <li>&lt;br /&gt; のあとにタブインデント/改行/スペースののちに &lt;/div&gt; がある場合</li>
    <li>&lt;br /&gt; のあとにタブインデント/改行/スペースののちに &lt;/li&gt; がある場合</li>
    <li>&lt;br /&gt; のあとにタブインデント/改行/スペースののちに &lt;/dd&gt; がある場合</li>
</ul>]]>
        
    </content>
</entry>

</feed>
