Googleカレンダーのイベントが読み込めなくなった……

概要

2014年11月25日、Googleカレンダーのイベントが読み込めなくなったので調べてほしいという依頼がありました。昨日までは見ることができていたという話。

調査

ソースを見ると、FullCalendarにGoogleカレンダーのイベントを読み込んで表示させているようです。
FullCalendarのサイトを見たら、2014年11月17日でGoogleのCalendar API V1とv2が利用できなくなるという記述あり。

Google Calendar – Documentation | FullCalendar
http://fullcalendar.io/docs/google_calendar/

Googleでもアナウンスが出ていました。

Upgrade now to Calendar APIv3 – Google Apps Developer Blog
http://googleappsdeveloper.blogspot.jp/2014/07/upgrade-now-to-calendar-apiv3.html

くだんのサイトでは、GoogleのCalendar API v2を使っていました。
スクリプトを最新のものに差し替えて、GoogleのCalendar API v3を使う形に修正して解決。

まとめ

情報はこまめにチェックして、早めの対応を心がけることが大切ということを再認識。

CGIでInternal Server Error-原因は改行コードでした

概要

何度も設置したことのあるCGIを、何度も使っているVPSサーバに設置しようとしたところ、Internal Server Errorが出てしまいました。このエラーは原因究明に時間がかかることが多く、見るとドキッとします。

何度も設置したことのあるCGIですが、現在は手元にないので、今回は新しいファイルを入手して設置。コードの中身は変わっていません。

FileZillaを使い、SFTPでサーバにアップしました。CGIの権限はいつもと同じく755。

他の人に設置してもらったらあっさりと動いたので、後々のために原因究明だけ進めました。

調査

気がついたのは、サーバにアップしてもらったファイルサイズと、手元のファイルサイズが違うこと。見た目のコードは同じ。ただ、改行コードを見ると、手元のファイルはCR + LF。これをLFにしてアップしたら動きました。

まとめ

今まで、わざわざ改行コードを変換してサーバにアップした覚えがありません。

最近はSFTPやFTPSで転送することが多いのですが、SFTPは改行コードの変換をサポートしていないということを知りませんでした。知らなくても問題なかったということは、以前使いまわしていたCGIファイルがLFで保存されていたものと思われます。手元にないので確認できませんが。

 

WordPressマルチサイト機能でサブドメイン型サイトを作った後のGoogleウェブマスターツールHTMLファイル認証

WordPressのマルチサイト化機能で、サブドメイン型サイトを作成しました。

親サイト  http://example.com
子サイト1 http://site1.example.com/
子サイト2 http://site2.example.com/

Googleウェブマスターツールに親サイトを登録してHTMLファイル認証、次に子サイト1を登録してHTMLファイル認証…となったとき、HTMLファイルをFTPアプリでどこにアップしたらよいのか分かりませんでした。
site1やsite2といったフォルダーはありません。

結果としては、親サイトの階層にアップロードして、アクセスすることで認証できました。

例)
認証ファイル:google01234567890.html
親サイトの階層にアップロード:http://example.com/google01234567890.html
子サイト1の認証URL: http://site1.example.com/google01234567890.html

マルチサイト機能を使うためのDNSレコードの設定で、ワイルドカードを指定したのをすっかり忘れていました。

MagpieRSSのしつこいキャッシュに悩みました

概要

WordPress(現在バージョン3.2.1)には、RSSフィードをパースするための、MagpieRSSベースの機能がついてます。

include_once(ABSPATH . WPINC . ‘/rss.php’);
$rss = fetch_rss(‘$feedurl’);

これを利用して、WordPressで作成した別のサイトのRSSフィードを読み込んで、表示させる仕組みを作っています。
1回目の表示は簡単にできました。
2回目、本文の抜粋表示の長さと「続きを読む」の表示まわりを調整して再表示を試みましたが、さっきと全く変わりません。
ブラウザのキャッシュを消しても変わりません。

調査

出力側がおかしいのか、読み込んで表示させる方がおかしいのか・・・。

フィードはブラウザに表示させて、変更点が反映されているこをと確認したので、問題は読み込み側、どうやらキャッシュが怪しいというところまで分かりました。

その後ソースを追ったり、DBのキャッシュ(wp_optionテーブルにRSSとキャッシュの有効期限が格納されます)をチェックしたりして、定数に不適切な値をセットしたのが原因と分かりました。

まとめ

MagpieRSS(/p-includes/rss.php)のデフォルト設定では、「キャッシュを使用」、「有効期限はセットしてから3600秒」になっています。

define(‘MAGPIE_CACHE_ON’, 1);
define(‘MAGPIE_CACHE_AGE’, 3600);

この値は、呼び出し側で上書きできます。
キャッシュの有効期限がすぐくるように、

define('MAGPIE_CACHE_AGE', 0);

と書きました。表示内容に変化は起こりません。その後 MAGPIE_CACHE_AGE に別の値を入れても、何も変わりません。
理由は以下のコードにあります。

class RSSCache {
var $BASE_CACHE; // where the cache files are stored
var $MAX_AGE = 43200; // when are files stale, default twelve hours
var $ERROR = ”; // accumulate error messages
function RSSCache ($base=”, $age=”) {
$this->BASE_CACHE = WP_CONTENT_DIR . ‘/cache’;
if ( $base ) {
$this->BASE_CACHE = $base;
}
if ( $age ) {
$this->MAX_AGE = $age;
}
}

RSSCache のコンストラクタの引数$ageに MAGPIE_CACHE_AGE が渡されます。
$ageに0が渡されると$MAX_AGEはデフォルトの43200(12時間)になります。
一度12時間後にセットされてしまったので、その後キャッシュの有効期限をいくら小さい値に変えても影響しないわけです。

DBのキャッシュを消して、新たに作成したキャッシュの保存期限を念のため調べてみたら12時間後。
これを見て、何が起こっているのか理解することができました。

ここまできたところで、「MAGPIE_CACHE_AGE」で検索したら、同じ目にあっている方を発見しました。
もう少し早く発見できればよかった・・・。

MagpieRSSのキャッシュとConditional GETについて – F.Ko-Jiの「一秒後は未来」
F.Ko-Jiの「一秒後は未来」

該当するエントリーはあるのにPageButeを使ったら表示されない場合

概要

該当するエントリーはあるはずのカテゴリページ。エントリー数が増えたらページ分割をするため、PageButeを入れてあります。

カテゴリーに属すエントリーはあるのに、PageButeの<MTPageEmpty>の方に進んでしまい、エントリーが表示されないことがありました。再構築しても変わらず。

調査

試しにPageBute関係のタグをすべてはずして再構築したら、エラー発生。
エラーはPageButeとは関係がなく、あるタグをコンテキスト外で呼び出してしまったというもの。

そのエラーを修正して、再びPageBute関係のタグをセット。再構築。

そしたら、きちんとエントリーは表示されて、ページ分割もされました。

まとめ

エラーが発生した状況について、もう少し詳しく書きます。

MTPageContentsタグで囲まれた領域に、条件分岐を書きました。
それぞれ分岐A、分岐Bとして、エラーの記述は分岐Bにあったとします。

分岐Aに進むエントリーばかりの場合、カテゴリーページにエントリーは表示されました。
ところが、分岐Bに進むエントリーが1つでもあると、再構築エラーは発生しないけれど、エントリーは何も表示されないという状況になりました。

再構築エラーとして検出されないけれど、エラー部分を通る場合はMTPageContentsがとんでしまった感じと思われます。

「MTPageContentsで囲まれた部分にあるエラーは、どんなエラーも検出されない。」とまで言えるかどうかは分かりません。
PageButeを使っていて不可解な現象が起こったら、エラーが無いかどうかちょっと疑ってみてください。