【メモ】 W3Cの「Feed Validation Service」でRSSフィードをチェックしたら結構間違ってた

W3C Feed Validation Service 自分に便利なRSSフィードをたくさん作っているとだんだんと作業に「慣れて」来てしまって、仕様とかいちいちチェックせずに手癖やコピペで済ませて確認もしなくなってきてしまうのですけど、ふと思い立って自分が作っているRSSフィードをW3Cの「Feed Validation Service」でチェックしてみたらば意外なほど間違ってたので慌てて修正。 W3C Feed Validation Service, for Atom and RSS よくある間違い(ないしは設定漏れ)の例としては、こんな感じ。

  • 「Content-Type」が「text/html」になっている → フレームワークに設定を追加し「application/rss+xml」で送信
  • pubDateの形式がRFC2822に準拠していない → Atomの形式(RFC3339)になっていたので変更
  • lastBuildDateの形式がRFC2822に準拠していない → Atomの形式(RFC3339)になっていたので変更
  • managingEditorが有効なメールアドレスではない → 架空のメールアドレスで対応
  • managingEditorに本名が入っていない → ハンドルネームなどを追加
  • 「atom:link rel=”self”」がない → そのフィード自身のURLをchannel内の要素として追加。「xmlns:atom=”http://www.w3.org/2005/Atom”」を削除してしまっている場合にはそれも追加。
  • 「item」要素「title」に実体参照でない記号を含めるな → 対応。
  • 「item」要素に「guid」が無い → 一意の標を追加。大体の場合、パーマリンクで事足りる
  • 「item」要素「description」の「CDATA」には指定されたタグ以外使うな → 「blockquote」を使ったら怒られた……でもコレはどうしようもないんだよね。Tumblr的な意味で
で、validになったRSSフィードが例えばこれ。 http://rss.nplll.com/kimagure_camera/ 「blockquote」以外はどれもテンプレートしっかりしてれば間違えないだろっていう話なんだけど。特に日付の形式間違ってたのは自分でもびっくりしました。引くわー。RSSリーダーが読み込んでるから別に良いかなと思ってたけど、すべてのRSSリーダーで確認出来てるわけじゃないし、そもそもRSSリーダーで使うことだけを想定して作ってるわけでもないしなあ。 W3C準拠が絶対かどうかはともかくとして、この辺はきちんと確認しておかないといけないよねと反省しました。 大事。

続きを読む

【PHP】 PEAR::Services_TwitterでTwitter API 1.1の検索APIに対応

前回の続き。 PEAR::Services_Twitterを使ってAPI1.1にリクエストを送る方法はこちらを読んでください。 【PHP】 PEAR::Services_TwitterでTwitter API 1.1対応 | mutter 「タイムラインから「google」という単語で検索してマッチしたツイートを取得したい」というような要求があった場合に、API1であればこんなリクエストを送れば取得出来ました。 GET search | Twitter Developers

http://search.twitter.com/search.json?q=google
API1.1では、要Authentication付きでこんなリクエストになります。 GET search/tweets | Twitter Developers
https://api.twitter.com/1.1/search/tweets.json?q=google
このリクエストをServices_Twitterで組み立てるとこんな感じになるのですが、
$obj = new Services_Twitter();
/* oAuth省略 */
$data = $obj->search->tweets(array('q' => 'google'));
実際に動かすと、
Unsupported endpoint search/tweets
と言われて動きません。問題は2つあります。
  1. Services_Twitterが「search/tweets」をサポートしていない
  2. searchの場合のリクエストURLが「http://search.twitter.com」になっている
この2つを解決してやれば、無事に動くようになります。

続きを読む

【PHP】 PEAR::Services_TwitterでTwitter API 1.1対応

息抜きにちょっとした自分向けアプリケーションを作りました。仕様はこんな感じ。

  • 「1日1ニコ」ブログのアカウント @__1nico__ に投稿しているブログの更新情報を拾って
  • メインアカウント @nobodyplace でリツイートする
ただそれだけ。 いちいち確認してリツイートするの面倒くさいってことなんだけども、Twitter API 1.1向けの課題としては軽くて面白いかなってことでさくっとこしらえました。使用言語は例によってPHPです。 大体の流れはこんな感じ。
  1. PEAR::Services_Twitterを読み込み
  2. OAuthアクセス
  3. GET statuses/user_timeline」を使ってユーザー「@__1nico__」のツイートを取得する
  4. リツイートしてなければ「POST statuses/retweet/:id」でユーザー「@nobodyplace」としてリツイート
最初の構想では、3と4の間に、
  • GET statuses/retweets/:id」を使ってリツイート一覧を取得して自分がリツイート済みかどうかチェックする
という工程も入っていたのですけど、実際に使ってみると、「GET statuses/user_timeline」「POST statuses/retweet/:id」のリクエスト制限が15分当たり180であるのに対して、「GET statuses/retweets/:id」の制限が15分当たり15でボトルネックになってしまうことが解ったので、除外しました。 Twitterへのリツイートのリクエストは、重複している場合は無視される(ただしエラーは返ってきて今回なら、Services_Twitter_Exceptionが投げられる)そうなので、まあそれでいいかなという。

追記

こんなことをしなくても自分がリツイートしているかどうかは、「retweeted」という要素を確認することでチェックできるのですね。「retweeted」は、そのツイートがリツイートされているかどうかを示していると勘違いしていたのですが、実際にはそのリクエストを送ったユーザー(この場合なら@nobodyplace)がリツイートしているかどうかをあらわしていました。trueならリツイート済み、falseなら未リツイートと。そもそもツイートがリツイートされたかどうかは、「retweet_count」で判断できますもんね。そうかー

続きを読む

【メモ】 CUIに実行ログを書き出す(1行を上書きしていく) 【PHP】

やりたいこと

フレームワークのタスクなどを実行する際に、きちんと進行しているかインジケータを表示させたい。ただし、処理数分だけ行数を重ねるのではなくて1行に上書きしていきたい。上手く説明できなくて歯がゆいんですけど、つまりこうではなくて、
doSomething ...  1/5
doSomething ...  2/5
doSomething ...  3/5
doSomething ...  4/5
doSomething ...  5/5 finished
こう。
doSomething ...  5/5 finished ← この行だけで更新されていく
わかりますかね…

続きを読む

「Responsive Grid System」使ったらFirefoxで表示が乱れた→clearfixの問題

28_01_02.jpg 上のようになって欲しいのに、こうなってしまう。 28_01_01.jpg ソースはこんな感じ。






beta with RGS


Insert page content here.
どうやら「row」クラスに設定されている「margin-bottom:20px」がなぜか上側にも反映されているらしい。問題が起きるのはFirefoxだけで、IE9、Chromeでは全く問題なく表示されました。 (Safariはしらん)

続きを読む

[ExtJS4] Storeに設定したイベントが何回も呼び出されてしまう 【メモ】

sencha.jpg Storeにイベントリスナーを設定すると、読み込まれる度に何度も何度も呼ばれてしまうことがあります。また、呼ばれる回数が読み込む毎に増えて行ってしまう場合もあります。要はコーディングが悪いと言うことなのですが、初心者である自分の反省も兼ねてメモ。

ダメな例

var store = Ext.getStore('sampleStore');
store.on({
load : {
fn : {
console.log('load event fired.');
}
}
});

続きを読む

【メモ】 VitualBoxでGuest Additionsが動かなくなったら

VirtualBox.jpg 起動したら共有フォルダへのマウントが解除されており、GUIを起動して共有フォルダを設定し直そうとしたら「Guest Additionsがインストールされてないから共有フォルダは使えませんぜ、旦那」と言い出すVitualBoxさん。かわいい。いや、面倒なだけだよ。「デバイス > Guest Additions のインストール」とクリックしても何も起きずに困ったのですが、CUIから主導でGuest Additionsをインストールし直したら直りました。

参考サイト

Ubuntu日本語フォーラム / Guest Additionsがインストールできない

続きを読む