2012-05-09

Pocket (Read It Later) の Read リストが見つからない

先日、オンラインブックマークサービス "Read It Later" が
"Pocket" という名前に変わりました。
公式ブログの記事 (2012/Apr/17) Introducing the all-new Read It Later - now called Pocket
膨大な数の連携アプリがある(だからこそ利用される)サービスなので、 API のアクセスポイントは変えないらしい。まぁ、賢明な判断かと。 突然の発表だったので、フォロー記事も出ています。
公式ブログの記事 (2012/Apr/18) Pocket Works with Your Old Read It Later Account (and All the Apps that Support It)
上記記事の内容を簡単にまとめると、
1. ユーザ名とパスワードは変わらず使える。 2. 連携アプリの設定を変える必要はない。 3. ブックマークレットとかブラウザ拡張 (extension) もそのまま使える。 4. API もそのまま使える。
という話です。 まぁ、投稿用の自作サービスを使っている身としては、ひと安心。 ところで、PC の Web ブラウザや iPhone アプリで Pocket にログインすると、 ・HomeFavoritesArchive という3種類のリストが見られます。以前の(Read It Later の)旧デザインでは、 ・UnreadRead の2種類だったので、ちょっと違う。 まぁ、"Favorites" はおいておくとして、一見すると、 Home ⇔ Unread Archive ⇔ Read と対応するように思えます。 ところが・・・・ 自作の投稿プログラムで "Read" リストに投げたはずのエントリが見つからない! "Home" リストにも "Archive" リストにも載ってない! ここ数週間のデータがロストしたかと思って、正直かなり焦りました。 結論して、"Read" リストは別物として存在していました。 Read It Later のときの "Read" リストの URL を直接指定すると Pocket の "Read" リスト にリダイレクトしてくれます。 現時点では Pocket に普通にログインしても "Read" リストへのリンクは見当たりません。 移行作業で混乱しているだけかと思われますが、ちょっと不親切な気がしないでもないです。 いや、本気で焦りましたから!! 最後に、Pocket の URL を整理しておきます: ・トップページログイン"Home" リスト"Favorites" リスト"Archive" リスト"Unread" リスト(旧デザイン) ※たぶん "Home" リストと同じ ・"Read" リスト(旧デザイン) ・データの export ※ HTML ファイルとしてダウンロードできる ご参考まで。 蛇足ですが、"Read" リストがいつまでサポートされるのかがちょっと心配ではあります。

| | コメント (0) | トラックバック (0)

2012-03-18

「いつふぉろ」停止中

しばらく放置していた「いつふぉろ」用のユーザスクリプト(グリモン)を
最新の Twitter に対応させようとしたのですが、SSL の壁に阻まれて断念。

使ってくださっていた皆様には申し訳ありませんが、現時点では
対応できる見込みがありません。すみません。


    ⇒ 「いつふぉろ」ホームページuserscripts.org のページ



以下、詳細。

とりあえず、ユーザスクリプト(GreaseMonkey スクリプト)自体は
今の Twitter の Web ページ上で動作するように修正できました。
Google Chrome のベータ版で確認済み(セキュリティの警告が出るけど)。

で、何が問題かというと、

  ・Twitter にログインすると自動的に HTTPS 通信になる(SSL 保護されている)
  ・「いつふぉろ」のサーバから JSONP でユーザの情報を取得したい
  ・「いつふぉろ」のサーバは SSL 証明書を持っていないので HTTPS 通信できない
  ・保護されたページ内での保護されていない通信は、ブラウザにより遮断される

というわけで、「いつふぉろ」のサーバを HTTPS 通信に対応させないと、
ユーザスクリプト側ではいかんともしがたい状況なのです。

サーバ側を HTTPS 通信に対応させるには、そのサーバの SSL 証明書を
取得して、サーバに設定してあげる必要があります。ちょっとネットで
調べてみると、無料で SSL 証明書を取得する方法があるみたいですが、
その認証局を信用していいものかいまいち自信がないので保留中。
そもそも今のレンタルサーバに SSL 証明書を設定できるかも不明。
というわけで、今のところ「いつふぉろ」のサーバを HTTPS 通信に
対応できる見込みがたっていません。

スクリプト自体は、せっかく作ったので userscripts.org にアップしてあります。


なお、長期的な構想としては、サーバを独自ドメイン (seaoak.jp) に移行して
SSL 証明書も取得しようと思っています。いつになるかわかりませんが・・・

| | コメント (0) | トラックバック (0)

2011-08-08

PrintWhatYouLike に動的パッチ


PrintWhatYouLike というサービスをご存じでしょうか?

ブックマークレットとして実行すると、ページ上のコンテンツ(HTML 要素)を
自由に削除したりできるサービスです。

Evernote の Web Clipper と組み合わせると最強。

ブログ記事の本文部分だけを抜き出してクリップできるので、
あとで Evernote 上で検索したときのノイズが劇的に減らせます。

参考)
Evernote と PrintWhatYouLike の組み合わせが便利すぎる! -- マインドマップ1年生 plus ライフハック!
さて、とっても便利な PrintWhatYouLike ですが、 先日(7月のどこか)からうまく動かなくなってしまいました。 ブックマークレットを実行するとツールバー(サイドバー)は 表示されるのですが、コンテンツ編集用の赤色ボーダーも 要素クリック時のポップアップも表示されません。 あと、ツールバー上の "close" ボタン「X」も。 いろいろ調べた結果、とりあえず動くようにする代替ブックマークレットが 作れたので、ここで公開します。 ⇒ PrintWhatYouLike(Seaoak版)   ※ ブックマークバーに Drag&Drop すれば使えます 公式ブックマークレットの代わりに使えます。当然ながら非公式です。 この非公式ブックマークレットの中では、公式のと同じ JavaScript プログラムを PrintWhatYouLike.com から読み込んで、問題のある箇所だけ修正して、再実行しています。 そのうち公式に修正版がリリースされる(またはこっそり JavaScript プログラムが 差し替えられる)ハズなので、それまでの「つなぎ」としてお使いください。 問題になりそうな処理は仕込んでいないので大丈夫だと思いますが、 例によって無保証ということでお願いします。 以下、技術的な詳細です。 ===== ■ 1. 公式ブックマークレットが動かなくなった原因 ブラウザのコンソールを見ると、null に設定されてる変数のプロパティを 読もうとしてエラーになっていることがわかります。エラーになった時点で プログラムの実行が中断されて、その結果として従来の動作ができなく なっているものと推測されます。 公式ブックマークレットの中で読み込んでいる JavaScript ファイルを 見てみると、次のようなコードが含まれています。
if(nextPage.nextLink.finalScore>17000){
この nextPage.nextLink には、直前である関数の返値を代入しているのですが、 その値が null になっているようです。 とりあえず、次のように修正してみたところ、動くようになりました。
if(nextPage.nextLink&&nextPage.nextLink.finalScore>17000){
変数名から推測するに、新しく組み込まれた機能の "PrintWhatYouZip" で 「次のページ」をたどろうとしたとき、その「次のページ」が見つからないと この変数に null が設定されてしまうようです。 ===== ■ 2. ブックマークレットで動的にパッチを当てる ブックマークレットで読み込んでいる JavaScript プログラムを 「その場で」書き換えて実行する方法を考えます。 そんなことをしなくても、公式の JavaScript プログラムをローカル保存して、 修正して、修正版を適当な Web サーバにアップロードしておいて、 そのファイルを参照するブックマークレットを作る方が簡単です。 しかし、   ・公式の JavaScript プログラムのライセンスが不明   ・他の人にも安心して使ってもらうのが難しい   ・公式版の更新に追従できない   ・自分で用意できる Web サーバだと遅い(読み込みに時間がかかる) などなどの問題があります。 さて、問題の JavaScript プログラムは、動的に生成した script 要素で 読み込まれています。したがって、読み込まれた時点でソースコードの字面を 書き換えられれば一番簡単です。しかしながら、src 属性を指定した script 要素の ソースコードを参照する方法がありません(text 属性を読んでみても「空」)。 一方で、問題の JavaScript プログラムを眺めてみたところ、 問題があるのは _pgzpInitPwyl() という関数です。 この関数はグローバルな名前空間で定義されています。 つまり、ブックマークレットからも可視。 すなわち、ブックマークレットからも書き換え可能! というわけで、次のような方法を考えました。   1. 関数 _pgzpInitPwyl() のソースコードを得る   2. 得られたソースコードを書き換える   3. ソースコードを eval() して関数オブジェクトに変換   4. 得られた関数オブジェクトをシンボル _pgzpInitPwyl に設定 関数のソースコードは .toString() で得られます。 関数オブジェクトへの変換およびシンボルへの設定は、 ひとつの eval() でまとめてできます。 具体的には、以下のようなコードになります:
var code = _pgzpInitPwyl.toString(); code = code.replace('hogehoge', 'foobar'); code = '_pgzpInitPwyl = (' + code + ')'; eval(code);
===== ■ 3. 修正したコードを実行させる 上記のように関数の定義を動的に書き換えることが可能なのですが、 問題は「書き換えられるのは最初に実行された後」ということです。 src 属性を指定した script 要素の場合、 読み込み直後(実行される前)に処理を割り込ませることができません。 script 要素の onload イベントハンドラが呼ばれるのは、 残念ながら読み込んだコードが実行された後です。 また、onbeforescriptexecute イベントという便利そうなモノがあるのですが、 Firefox でしか実装されていないみたいです(未確認)。 さらに、IE8 では script 要素の onload イベントハンドラは 実装されていないようです(IE9 では実装されているようです)。 幸いにして、問題の JavaScript プログラムは、エラーで死んだ後でも、 上記パッチを当てて再実行すれば動作してくれます。ただし、最初の (エラーになった)実行でツールバー(サイドバー)が開いた状態に なっているので、再実行は2回繰り返す必要があります。 「一度閉じて、開き直す」というわけですね。 最終的に、次のような方法を採用しました:   1. 「コード書き換え+再実行2回」を1回だけ実行する、という独自関数を定義。   2. script 要素の onload イベントハンドラとして独自関数を設定する。   3. IE8 対策として setInterval() で定期的に DOM を監視して、    問題の JavaScript が実行されたのを検知したら clearInterval() して    独自関数を実行する。 ちょっと hacky ですが、まぁ、動きます。 ===== ■ 4. 完成したブックマークレット
javascript : (function () { var timer; var handler = function () { if (window['ppw'] && ppw['bookmarklet'] && timer) { window.clearInterval(timer); timer = null; if (! _pgzpInitPwyl) { throw 'can not modified (by Seaoak)'; } var regexp = /\bif\s*\(\s*nextPage.nextLink.finalScore\s*>\s*17000\s*\)\s*\{/; var code = _pgzpInitPwyl.toString(); if (! regexp.test(code)) { return; } code = code.replace('_pgzpInitPwyl', ''); code = code.replace(regexp, 'if(nextPage.nextLink&&nextPage.nextLink.finalScore>17000){'); code = '_pgzpInitPwyl = (' + code + ')'; eval(code); var toggle = function () { ppw.bookmarklet.toggle(); }; window.setTimeout(toggle, 100); window.setTimeout(toggle, 100); } }; if (window['ppw'] && ppw['bookmarklet']) { ppw.bookmarklet.toggle(); } else { window._pwyl_home = 'http://www.printwhatyoulike.com/'; window._pwyl_pro_id = null; window._pwyl_bmkl = document.createElement('script'); window._pwyl_bmkl.setAttribute('type', 'text/javascript'); window._pwyl_bmkl.setAttribute('src', window._pwyl_home + 'static/compressed/pwyl_bookmarklet_10.js'); window._pwyl_bmkl.setAttribute('pwyl', 'true'); window._pwyl_bmkl.onload = handler; timer = window.setInterval(handler, 100); document.getElementsByTagName('head')[0].appendChild(window._pwyl_bmkl); } })();
ソースコードの整形&色づけは、こちらを使わせていただきました。 ===== ■ 5. まとめ 先日から PrintWhatYouLike が使えなくて非常に困っていたのですが、 ソースコードを眺めてみたらすぐに原因がわかって、 そこで「動的パッチ」というアイディアを思いついたので、 ひと晩で実装してみました。 JSON 以外で eval() を使ったのは初めてだったので、 その挙動に悩みました。特に、IE8 だけ挙動が違ったのが罠でした。 いちおう動作確認したのは以下のブラウザです:   ・Google Chrome 13.0.782.109 beta-m   ・Firefox 5.0   ・Opera 11.50   ・Internet Explorer 8 OS は Windows 7 Professional 32bit です。 ちょっと長い記事になってしまいましたが、今回のコードは PrintWhatYouLike の開発元が対応してくれたら無用の長物と 化してしまうので、ブログネタにしてみました。 ツッコミ歓迎です~

| | コメント (0) | トラックバック (0)

2011-07-13

bk1_to_amazon をアップデート


自作グリモン(ユーザスクリプト)の bk1_to_amazon をアップデートしました!

    ⇒ userscripts.org の bk1_to_amazon のページ


このスクリプトはオンライン書店ビーケーワン (bk1) の書籍のページに
その本の Amazon のページへのリンクを自動的に埋め込むモノです。

あらすじや書評(レビュー)などを参考にしたいときに便利かもです。

このスクリプト自体は2009年9月にリリースしていて、
しばらく更新していなかったのですが(とくに追加したい機能もなかったし)、
先月くらいに bk1 が全面的にリニューアルされて動作しなくなっていたのでした。

で、本日、やっと改造に着手して、無事に完成しました♪

ひさしぶりに自分のコードを見てみたら、いろいろ気に入らない部分があって、
結局、全面的に書き直しています。

Sleipnir と Firefox に加え、Google Chrome と Opera でも動くことを確認済み
(いずれも Windows 版)。

簡単なスクリプトですが、快適な読書生活のお役に立てれば幸いです!

| | コメント (0) | トラックバック (0)

2011-07-08

RESTful のお勉強


最近、REST (RESTful) というアーキテクチャについて勉強してます。

  ⇒ Wikipedia のページ

REST (Representational State Transfer) というのは、
HTTP でアクセスできる Web サービスの設計方針のひとつで、
よく SOAP と対比されてるみたいですが、SOAP よりだいぶシンプル。

REST の思想をベースに設計されたシステムは RESTful とか呼ばれることも。

個人的には Twitter の API とかは RESTful なんじゃないかなぁ、と思ってます。




オライリーから本も出てます:


なかなか読み応えのある本で、かなり勉強になりました。

 「RESTful にするとなにがうれしいのか?」

 「SOAP だとなぜダメなのか?」

 「RPC スタイルとの違いは?」

 「URI のデザインで考慮すべきことは?」

 「エラー処理の基本方針は?」

などなどが理解できました。

RESTful なアーキテクチャの例として ROA (Resource Oriented Architecture) を
とりあげて、実際に ROA な Web サービスの設計の進め方を具体的に説明してます。

また、より実用的な話として、ユーザ認証の話や、エラー処理の話も
なかなか詳しいです。




あと、Web でも参考になる記事を見つけました:

The Good, the Bad, and the Ugly of REST APIs - O'Reilly Broadcast http://broadcast.oreilly.com/2011/06/the-good-the-bad-the-ugly-of-rest-apis.html
この記事によると、   「JSON と XML を両方サポートすべし」   「レスポンスのエラーコードは正確にし、可能な限りヒントも添える」   「OAuth は使うべきでなく、クエリへの署名による認証がよい」   「API リクエスト回数を制限するときは十分に気をつけるべし」 などといった経験則が得られます。 ところで、突然 RESTful のお勉強を始めたのは、 ちょっとしたツテで Web サービスを作ってほしいと 頼まれているからでした。 RESTful にしてみたい理由は、   ・サーバ側をステートレスにできる ←個人的に「セッション」がキライ!   ・"View" (Web ページの表示)と内部処理を分離できる   ・もしかしたらデスクトップガジェットも作れちゃうかも?? などなど。 まぁ、まだ考えが固まっていないんですけどね(熟成中)。

| | コメント (0) | トラックバック (0)

«微妙な配列リテラル