かたつむりくんのWWW

Data API を PHP の file_get_contents で取得するときに注意した方がいいかもしれないこと

Movable Type 6 で注目されている Data API を PHP で扱うときの Tips というか、ハマったところが解決したのでシェアします。

まず、インデックステンプレートにシンプルな PHP ファイルを作り、file_get_contents を利用して Data API で JSON を取得して表示してみます。

<?php
$url = '<mt:CGIPath><mt:Var name= "config.DataAPIScript">/v1/sites/<mt:BlogID>/entries';
echo file_get_contents($url);
?>

問題なく表示されますね。

file_get_contents01

次に、リクエスト URL に「?status=Draft」を付けてみます。このパラメータを付けると、下書き状態の記事を取得することになるので認証を通さないと取得できません。

試しにブラウザで URL を直接叩くと、以下のような JSON が返ってきます。

{
"error":{
"code":403,
"message":"Do not have permission to retrieve the requested entries."
}
}

では、先程の PHP の $url にもこのパラメータを付けてみます。

<?php
$url = '<mt:CGIPath><mt:Var name= "config.DataAPIScript">/v1/sites/<mt:BlogID>/entries?status=Draft';
echo file_get_contents($url);
?>

ページにアクセスしてみると、、、真っ白です。

PHP エラーを表示するようにファイルの先頭に「ini_set('display_errors', 1);」を入れて見ると、次のようなエラーが出ます。

Warning: file_get_contents(http://your-host/mt-data-api.cgi/v1/sites/15/entries?status=Draft): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in /var/www/your-path/file_get_contents.php on line 11

さてどうしたものかとここでハマり、とりあえずは代替案で対応していましたが、以下のページを参考に解決しました。

このサイトの説明にあるように、file_get_contents の第三引数に渡すコンテキストリソースを作成して渡してみます。

<?php
ini_set('display_errors', 1);
$url = '<mt:CGIPath><mt:Var name= "config.DataAPIScript">/v1/sites/<mt:BlogID>/entries?status=Draft';
$context = stream_context_create(array(
'http' => array('ignore_errors' => true)
));
echo file_get_contents($url, false, $context);
?>

無事、この PHP ファイルを通してでもブラウザでアクセスしたときと同様の JSON が表示されました。良かった良かった。

file_get_contents02

なお、この部分の file_get_contents では PHP の Warning とかのエラーを出さないようにするのは、file_get_contents の頭に「@」を付けて「@file_get_contents」にすれば、Warning とかの PHP エラーは出なくなります。

以上です。

上記のページが分かりやすいよと教えてくださった宮澤さん、同じように原因をアドバイスしてくださった松崎さん、ありがとうございます!

Data API PHP Cache - Data API のレスポンス結果をPHPキャッシュするプラグイン

この記事は Movable Type Advent Calendar 2013 の6日目の記事です。

毎年恒例、自分の誕生日に記事を書くノルマを課して、1歳分大きくなろう企画です(謎

Data API

Movable Type 6 の目玉機能である「Data API」は、Movable Type の楽しさをより深くしてくれる存在になるかもしれません。

先日、この Data API での記事の検索を少し拡張するプラグイン(Data API Extend Search)を公開しました。

Data API に関するプラグインは、だいぶ早い段階からいくつか公開されています。KING Junnama さんが MT タグで Data API から情報を取得するプラグインを公開していたり、プロフェッサー藤本さんがエンドポイントを拡張するプラグインを公開していたりします。

今後も、Data API に関するプラグインはたくさん出てくるでしょう。

Data API の結果をキャッシュする

さて、Data API は夢が広がる反面、気を付けなければいけないこともあります。

アクセスの多いサイトで頻繁に Data API を叩く必要のある使い方をすると、スペックの低いレンタルサーバーでは 500 エラーになる可能性があるでしょう。また、CGI のオーバーヘッドによりレスポンスが遅いということも考えられます。Data API を快適に使うには、やはり VPS で PSGI での環境が必要かもしれません。

そうなってくると、重要なのがレスポンス結果のキャッシュですね。

そんな中で、このアドベントカレンダーの3日目の記事で、MT界きっての発明家、Toi企画の天野さんが「.htaccess を利用して Data API のキャッシュの仕組みをつくる - blog.taaas.jp」という記事を書いてくださいました。なかなか難しい内容ですがとても興味深いですね。

この天野さんのキャッシュは Apache レベルでキャッシュの処理をするものですが、PHPで処理するものに関しては野田さんが8月の時点で既に公開しています。先に紹介したプラグインがそれですね。PHP の軽量版もあります。

さすが KING。

自分でも作ってみたくなった

さて、そんなわけで、PHP 版のキャッシュ機能のプラグインはすでにあるのは知っていましたが、先程の天野さんの記事の中で「パラメータを MD5 でハッシュ化して readfile するような簡単な PHP を追加して、」というさらっとした文章を読んで、猛烈に自分で作ってみたくなったのでした。勉強のために。

それがこれです。

このプラグインのコンセプトは以下のようになっております。

  • Data API の書き方と同じように書きたい。
  • キャッシュの削除のタイミングとかプラグイン側で適切にやって欲しい。
  • 主要なエンドポイントだけキャッシュする(MT側で削除側を細かく制御したいと思ったりしたので...)。
  • 認証が必要なやつはキャッシュしないで無視してほしい。

使い方

まずは、「data-api-cache.php」というインデックステンプレートを作ります。ウェブサイト、ブログ、どこでもいいです。

上記のコンセプトから、キャッシュの対象は以下のエンドポイントに限定されています。

https://your-host/mt-data-api.cgi/v1/sites/{blog_id}
https://your-host/mt-data-api.cgi/v1/sites/{blog_id}/categories
https://your-host/mt-data-api.cgi/v1/sites/{blog_id}/entries/{entry_id}/comments
https://your-host/mt-data-api.cgi/v1/sites/{blog_id}/comments
https://your-host/mt-data-api.cgi/v1/sites/{blog_id}/comments/{comment_id}
https://your-host/mt-data-api.cgi/v1/sites/{blog_id}/entries
https://your-host/mt-data-api.cgi/v1/sites/{blog_id}/entries/{entry_id}

これらにアクセするときに上記 URL の「mt-data-api.cgi」の部分を「data-api-cache.php」にすればOKです。あとは勝手にキャッシュしてくれます。

キャッシュのファイル名は、パラメータを MD5 でハッシュ可し、mt-static/support/data-api-php-cache というディレクトリの中に、上記URL通りのディレクトリ構造で保存されます。

そして、「ウェブサイト、ブログ、記事、コメント、カテゴリ」の保存と削除のタイミングで、該当するファイルやディレクトリだけが勝手に削除されます。

もし、認証の必要な URL を叩いた場合は、そのままエラー結果が返ってきます。

簡単なテストをした結果、やっぱり CGI を叩くよりも5倍くらい速いです。

その他

ツッコミどころは満載かもしれませんが、やっぱり何でも自分で作ってみると勉強になりますね。

そんな感じのプラグインですが、興味があれば「テスト環境」で使ってみてください。

明日は Masa Osugi さんで、テーマは「Movable Type × Amazon Web Service」が予定されています。楽しみですね!

Data API Extend Search - Data API での記事の検索を拡張するプラグイン

「Data API Extend Search」というプラグインを公開します。Data API での記事(entries)の検索を拡張するプラグインです。

このプラグインをインストールすると「タグ」「カテゴリ」「日時」で記事を絞り込むことができます。

日時は「公開日」「作成日」「更新日」「公開終了日」での絞り込みが可能です。タグとカテゴリについては、指定した値を「含む」検索になります。

プラグインのダウンロード、使い方は以下のページからお願いします。

今後、もう少し拡張していく予定です。

MTAppjQueryを使って記事ごとに表示するカスタムフィールドを変える

Movable Type ユーザーコミュニティの MTQ に「ブログ記事編集画面のカスタムフィールの項目をカスタマイズしたい。」という投稿を見つけました。藤本さんも MTAppjQuery プラグイン の出番だとおっしゃってるので、その方法を紹介します。

MTAppjQuery プラグインのインストールはこちらのページ(ちょっと古いです)をご覧ください。最新の情報はドキュメントも販売しております。

続きを読む

MTAppjQueryを使ってMTEntriesが使えるドロップダウンリストのカスタムフィールドを疑似的に作る

Movable Type ユーザーコミュニティの MTQ に「カスタムフィールド作成(編集)画面のMTタグ使用について」という投稿を見つけました。

MTAppjQuery プラグインを利用すれば疑似的に実現することができるので、その方法を紹介します。

MTAppjQuery プラグインのインストールはこちらのページ(ちょっと古いです(>_<))をご覧ください。最新の情報はドキュメントも販売しております。

続きを読む

jQueryでtitle要素を変更しようとするとIE8でエラーになる

HTML の <head> 内の <title> の中身を jQuery で以下のように変更しようとすると、IE8 でエラーになります(IE9, IE10 は大丈夫)。

jQuery("title").text("タイトルを変更");

このようなときは、jQuery を使わずに、

document.title = "タイトルを変更";

とすれば大丈夫です。

jQueryAutoHeight.js v0.04 - jQuery 1.9 以降に対応

当ブログで3年くらい前から公開している「jQueryAutoHeight.js - 複数のカラムの高さを最大値にそろえるjQueryプラグイン」を、jQuery 1.9 以降(1.x系)に対応させました。

動作や機能に変更はありません。

jQuery では、だいぶ前から非推奨だった「jQuery.browser」が、1.9 からとうとう使えなくなりました。

jQueryAutoHeight.js においても、IE6 を判定するのに jQuery.browser.version を使っていましたので、jQuery 1.9 以降の環境で利用するとエラーが出てしまっていました。その部分を修正しました。

あと、リポジトリを Github に変更しました。

jQueryAutoHeight.js にご興味のある方は以下のページをご覧下さい。

まだ使って頂いている方がいるようで、感謝です m(_ _)m

MTAppjQuery v1.1.0 リリース

Movable Type 6 Beta に対応した MTAppjQuery v1.1.0 を公開しました。

今回のリリースでは、

  • MTAppLineBreakField を1つの画面内で複数のフィールドに適用させたときの不具合の修正
  • MT6 でのユーザーダッシュボードの表示が崩れる不具合の修正

の2つの修正と、

  • mtappVars.status(ブログ記事やウェブページの公開・非公開のステータスを取得)の追加

を行いました。

さあ、MT6 の管理画面も MTAppjQuery でカスタマイズしましょー!

Movable Type 6 の Data API を使ってその場で記事を更新できる拡張機能を作ってみた

今日の Movable Type ハッカソンに行って刺激を受けて、Movable Type 6 の Data API を使って、管理画面に入らずにその場で記事を更新できる拡張機能を作ってみました。

いろいろ楽しみですね、Data API。(動画は音声付きです)

今まで MT に対して「なんか難しそう」とか「もう古くね?」とかいうイメージを持ってるフロントエンド・エンジニアの方、ぜひ今後は横目で Movable Type のことも見ておいてくださいね。きっと触りたくなりますよ(笑

「管理画面重いんでしょ?」っていってる方、軽い管理画面を作っちゃってください!(ちなみに PSGI にすれば速いです)

まだベータ版ですが、今後が楽しみな MT6 です!

来週の土曜日は MTDDC 2013 へ!

2013年8月3日(土)に、品川のマイクロソフト本社セミナールームにて、MTDDC 2013(Movable Type Developers & Designers Conference 2013)が開催されます。

今回の MTDDC の目玉は、なんと言っても Movable Type 6 の情報でしょう。どんな情報が聞けるのか、技術的なこと、ビジネス的なこと、その他色々と非常に楽しみです。

また、僭越ではありますが、僕ら bit part も登壇させていただくことになっております。ご来場いただいた方に少しでもお役に立つ内容を話せるように準備していきたいと思います。

さあ、来週の土曜日は品川へ!!

MTAppjQuery v1.0.1 リリース

MTAppjQuery v1.0.1 をリリースしました。

今回は、PowerCMS で利用する場合のバグフィックスと新機能の追加です。通常の MT でお使いになっている場合にはアップデートする必要はありません。

  • PowerCMS のリビジョン管理の時に MTAppjQuery が使えなくなる不具合を修正
  • PowerCMS のグループ編集画面で、左のカラムにテキスト検索フィルターを追加する MTAppGroupFilter を追加

また、MTAppjQuery User's Guide もアップデートしています。

epub、mobi、pdf、オンライン版を用意してますので、是非ともご購入をご検討ください!

MTAppjQuery v1.0.0 リリース

さきほど、MTAppjQuery v1.0.0 をリリースしました!

新しいメソッドが追加されたり、user.js をインデックステンプレートで簡単に管理できるようになったりと、かなり使いやすくなったと思っています。何が新機能なのか、正直自分でもよく分からないです(汗)。

v1.0.0 の詳細は上記の bit part ブログの記事を見ていただくとして、今回の v1.0.0 で何が大変だったかというと、ドキュメントの作成です。これまでも色々な機能を随時追加していましたが、何しろドキュメントを書く余裕がなくて...。ソースコードにはコメントで簡単な使い方は書いておいたのですが...(言い訳)。

でもドキュメント、大切ですね。せっかく作った機能も使ってもらえなければ意味がないし、何よりドキュメントを書くことでバグが見つかったり使いにくい部分が分かったりしました。今回の v1.0.0 ではそういう至らない点もだいぶつぶせたと思います。

というわけで、すごく苦労したドキュメントも 5,250円(税込み)で販売させていただいております。

epub、mobi、pdf、オンライン版を用意してますので、是非ともご検討ください!

これまでは、僕一人の気まぐれでやってきましたが、これからは mersy と bit part としてがんばっていくので、今までよりも少しは皆様のお役に立つ何かを提供できれば良いと思っています。

至らない点も多いと思いますが、これからも MTAppjQuery をよろしくお願い致します!

MTAppjQuery v1.0.0 そろそろリリースか?

現在、MTAppjQuery v1.0.0 の beta 版を公開していますが、来週、正式版を公開する予定です。本当は先週辺りの公開を目指していたのですが...

今回の v1.0.0 では、mt-static に置く方のディレクトリの構造を少し変更したため、アップデートするときに少し注意が必要です。bit part ブログにアップデート方法を掲載しましたので、参考にしてください。

また、v1.0.0 には、いくつかの MTAppjQuery メソッドを追加しましたし、split モディファイア(荒木さんのとそんなに動作はかわらないと思う...)と compress モディファイア も追加しましたので、少しは便利さが増したと思います。

そして、ドキュメントを書きながら、バグというか、イケてない感じのところも結構潰しました。

ということで、公開に向けてがんばります!

MTAppjQuery v1.0.0 Beta リリース

bit part blog にも書きましたが、Movable Type 5 の管理画面を jQuery でカスタマイズするプラグイン「MTAppjQuery」の v1.0.0 Beta をリリースしました。

これまでの最新版が v0.28 なので一気にバージョン番号飛んだ感じですね。

まだ細かいバグ(主に JavaScript 関係)はあるかもしれませんが、僕はすでに本番環境で使ってるので大きな問題はないと思います。

今回のバージョンの特長をざっと挙げてみます。

  • プラグイン自体のメンテナンス性の向上
    • user.js をインデックステンプレートで管理
    • インデックステンプレート以外の user.js 等は1つのディレクトリで管理
    • user.js 等の URL を指定することも可能
  • 新機能の追加や既存機能の強化
    • MTAppLineBreakField(テキストフィールドを自由に増やしたりドラッグアンドドロップで並べ替えたり!)
    • MTAppSetLabel(ラベルをまとめて変更)
    • MTAppFancyListing(MTのポップアップウィンドウみたいなやつ)
    • MTAppSortableBatchEdit(ドラッグアンドドロップ時にタイトルに自動で連番振るとか)
  • その他色々細かい JavaScript 関連のバグフィックスとか

ご興味のある方は是非とも使ってみてください。

Beta 版はまだ master ブランチにはマージしてないので、以下のリリースブランチのものをダウンロードしてください。

今月中に正式版をリリースして、それと同時に mersy と必死で書いてるドキュメントを公開(販売)したいと思います(もちろんプラグインは無料のままです)。

ドキュメントは、

  • ほぼ全部の機能の使い方
  • オプションの設定
  • サンプルコード

を載せてます。ドキュメントのファイル形式も epub、PDF、HTML など複数用意する予定です。

さらに、購入していただいた方は bit part support っていうYammer にご招待して、サポートなども行っていきたいと思っています。

そちらも是非ともよろしくお願いします!

CategoryDepth v0.1.1 リリース - バグフィックス

カテゴリの階層の深さを出力する Movable Type プラグイン「CategoryDepth」に、カテゴリーアーカイブのテンプレートに直に書くとコンテキストエラーが出るという致命的なバグがあったので修正しました(>_<)

でもこれ、今書いてるテンプレートでカテゴリ一覧のインデントを設定するのに使ってるんですけど、便利だわ〜。

Redmine で期日が間近のチケットをメールで通知する

最近、bit part では Redmine を使って色々なことを管理しています。そこで「期日が間近のチケットをメールで通知する(リマインダ機能) -- Redmine.JP」というのが出来たら便利かな、ということで導入してみることにしました。

しかし、直接コマンドを打てばちゃんとメールが飛ぶのに、cron で実行しようとするとなかなかうまくいきません。

Twitter でアドバイスもらったり、色々調べた結果、単に cron だと rake コマンドのパスが通ってないだけでした。cron のログとかにコマンドが見つかりません的なログが残ってくれていれば直ぐに解決できたのに...

which rake

これで rake コマンドのフルパスを得られるので、それで cron に設定します。午前3時にメールを飛ばす場合は、

00 3 * * * root cd /path/to/redmine ; /usr/local/bin/rake redmine:send_reminders RAILS_ENV=production

これで OK でした。

こんな初歩的なことで躓いてスミマセン!

MTCafe Tokyo 2013 Spring 楽しかったです!(コケたけど)

4月20日に開催された「MTCafe Tokyo 2013 Spring」に行ってきました。僕も「Movable Typeの実践的な管理画面カスタマイズ、検索カスタマイズ」というタイトルでお話しさせていただきました。

が、しかし、当日はデモを中心にやろうと思っていたのに、直前に MacBook のレインボーが消えなくなるわ VMware Fusion 5 が落ちるわで、結局デモはほとんどうまくいきませんでした(ToT) 当日の不手際、申し訳ございませんでした!(>_<)

デモをやる前にはお参りする必要があるそうです...(KING談)

しかし、その他の内容は充実していたようで、僕も柳下さんのセッションを後から聞きましたが、すごく勉強になりました。

また、北は北海道、南は九州から、全国の MTLover が集まり、懇親会も楽しくお話しできてとても楽しい時間を過ごすことができました。にっくさんをはじめ、関係者のみなさまお疲れ様でした!

次は MTCafe Saitama 2013 が開催されます。「WPer&PHPerのためのMovable Type」というテーマで、Movable TypeをWordPressやPHPと連携させるという、これまた非常に楽しみなイベントになりそうです。

最後に、当日の僕のスライドを貼っておきます。デモについては、後日動画に撮って公開しようと思います!

MTAppjQuery 0.28 リリース - ストラクチャーダッシュボードウィジェットのバグフィックス

Movable Type 5 の管理画面をjQueryでカスタマイズしやすくするプラグイン「MTAppjQuery」の ver.0.28 をリリースしました。

ユーザーダッシュボードの構造タブで、ブログ記事一覧、ウェブページ一覧、コメント一覧へのリンクが正常に機能していなかったのを修正しました。

    以下のページの「Release-v0.28」の zip か tar.gz をダウンロードしてください。

    mt-static/plugins/MTAppjQuery 内のファイルに変更はありませんので、plugins/MTAppjQuery だけ差し替えればOKです。

    なお、近日中に、MTAppjQuery 1.0.0 をリリースする予定です。このバージョンからは、インデックステンプレートで user.js などを管理できたり、その他色々なメソッドを追加したりと、少しパワーアップしています。

    MTCafe Tokyo 2013 でお話しさせていただきます!

    4月20日に「MTCafe Tokyo 2013 Spring」が開催されます。

    MTCafe というのは、MTユーザーのゆるいオフ会です。これまでもリラックスした雰囲気で何度か開催されてきましたが、今回は少し違って勉強会形式で2つのお部屋に分かれて開催されます。

    内容は次の通りで、恐れ多くも僕も1セッションお話させていただくことになりました。

    続きを読む

    Custom Field GUI Utility 3.3.0 リリース

    WordPress のカスタムフィールドを使いやすくするプラグイン「Custom Field GUI Utility 3.3.0」をリリースしました。

    今回のアップデートは「カスタムフィールドを扱いやすくするWordPressプラグイン「Custom Field GUI Utility」をアップデートしました!WordPress3.5に対応&管理画面での編集が可能に! | WebCake」にあるように、全部 Tsuyoshi さんがやってくださいました。Tsuyoshiくん、ありがとうー!!

    Custom Field GUI Utility 3.3.0 で新しくなった部分は上記 Tsuyoshi さんの記事をご覧ください。丸投げですみません(>_<)

    最新版は以下のページから zip ファイルをダウンロードしてください。

    ダウンロードして解凍したら、フォルダ名を「custom-field-gui-utility」に変更した後、サーバーにアップロードしてお使いください。

    なお、当プラグインのドキュメントも少し古くなってきました。ドキュメントも GitHub の README に移そうと思います。