2012-03-20 02:02:29
便利そうだったので PHP でも実装しました.
Packagist に公開したので Composer でインストールできます.
何をするものかというと, 例えば HTTP リクエストなど, 失敗する可能性のある処理をリトライしよう, というときの処理を抽象化するためのものです.
インストール
Composer を使用するので, 適当なディレクトリに composer.json を用意します.
そして以下のコマンドを実行すると Composer 自体をインストールした後, Composer で RetryHandler が ./vendor ディレクトリにインストールされます.
使い方
無名関数をラップして, リトライしたい処理を Proc オブジェクトとして生成します.
retry() メソッドを呼び出すと引数に呼び出した数だけリトライ処理を行い, 全て失敗した場合は RetryOverException がスローされます.
リトライ対象の例外を指定する
デフォルトでは RuntimeException かそのサブクラスがスローされた場合のみリトライを行い, それ以外 (例えば LogicException など) の例外がスローされたら強制的に終了となります.
あるライブラリがスローする例外のみを想定してリトライし, それ以外はエラーとする, といった場合は accepted_exception オプションを使用することで実現できます.
待ち時間を入れる
リトライの前に待ち時間を入れたい, というときは wait オプションを使い, 待ち時間を秒単位で指定できます.
デフォルトでは 1 秒になっています.
まとめ
元の Ruby の実装だと Parallel や Thread を使ったとてもクールな実装になっていて, 素の PHP だとそこまではできなさそうな感じではありますが, リトライ処理自体は PHP でも割とやると思うので, 奇麗に書けるといいんじゃないかと思います.
RetryHandler はとりあえず動いた, 程度のレベルで, まだまだ使えない (例えば, Proc の中の値どうやって取るんだ, とか) と思うんですが, その辺りは今後気まぐれで改善していければという感じです.
ところで 2 年程まえにちょうど同じような需要があって作った Retrial というものがあるんですけど, 今見るととても酷いコードで, テストも何がやりたいのかわからない感じ.
まぁこの頃よりはまだマシなコードが書けるようになったんだなと自分を納得させています.
2012-03-11 14:12:52
キャッチアップが一足遅れてしまいましたが, 何となく状況を把握できたのでアクションを起こした次第です.
はてなブックマークボタンのトラッキング問題で高木浩光先生が決別ツイートをするに至った経緯まとめ
ところでこの NAVER まとめページを見ていると, *.microad.jp へのトラッキングリクエストが複数行われるのは何なんでしょうか?
[caption id="attachment_1782" align="aligncenter" width="300" caption="microad へのトラッキングのキャプチャ"]
[/caption]
このブログに行った対応
同様の対応を GitHub Pages で書いている殴り書きブログ Scribble にも行っています.
はてなブックマークボタンにはトラッキングするものとしないもの があって, WP Social Bookmarking Light ではトラッキングするもの, Zenback により埋め込まれるものはトラッキングしないものになっていました.
ところが, Zenback のログアウト状態でのトップページに行くとはてなブックマークボタンがあり, これはトラッキングするもので, track.send.microad.jp へのリクエストが確認できました.
このブログでははてなスターも使っていますが, これはそのままにしてあります.
特にトラッキングっぽいことをしていわけでは無さそうだということもありますが, テンプレートに直書きで入れてて外すのが面倒だというのもあります.
また, Wordpress では例えば WP Super Cache といったキャッシュプラグインを使用している場合はキャッシュに残っていることがあるので, 削除しておく必要があります.
これは WP Super Cache の管理画面からすぐできました.
個人的に行った対応
- ローカルマシンの /etc/hosts を書き換えて *.microad.jp のいくつかを 127.0.0.1 に向けた
- Chrome のはてなブックマーク拡張をアンインストール
/etc/hosts には以下のような行を追加しました.
CDN っぽいのは別にいいような気もしますが, js ファイルを拒否しておくのは効果がありそうなのでやってみました.
数もそんなに多くないし.
これを追加してからは Wireshark に microad っぽいパケットが引っかからなくなりました.
[caption id="attachment_1797" align="aligncenter" width="628" caption="Wireshark による microad のキャプチャ"]
[/caption]
...といってもリクエスト先の IP がデタラメなだけでリクエスト自体は行われているはずなので, Destination が 127.0.0.1 のものが引っかかりそうな気はするんですが, やり方が悪いんでしょうか.
どなたか教えていただきたいです.
トラッキングされるものとされないものの違い
トラッキングされないものの埋め込みコードを確認したところ, script タグで指定しているファイルが違うだけでした.
- トラッキングされるもの
http://b.st-hatena.com/js/bookmark_button.js
- トラッキングされないもの
http://b.st-hatena.com/js/bookmark_button_wo_al.js
要するにファイル名に _wo_al があるかないかだけの違いなので, はてなブックマークボタンを使い続けたい場合は _wo_al をつける (もしくはそうなっているか確認する) という手段もあるでしょう.
WP Social Bookmarking Light について
前述の通り, WP Social Bookmarking Light では行動履歴がトラッキングされるタイプのはてなブックマークボタンが使用されるようになっていたので, Pull Request を送らせていただきました.
これが取り込まれれば, WP Social Bookmarking Light を使ってはてなブックマークボタンを表示させても, それにより行動履歴のトラッキングは行われなくなります.
とはいえそれがいつになるかはわからないので, 取り急ぎは前述の通りプラグインの中身で _wo_al を付加した js ファイルを指定する方法を取るのがいいでしょう.
まとめ
私自身ははてなブックマークをそんなに利用している方では無いと思いますが, 今回の問題は残念としか言いようがありません.
最近のアップグレードが素晴らしかっただけに, 特にそう思います.
この件について聞いてからもしばらくははてなブックマークを使っていましたが, 何らかの対応が行われるまではしばらく使用をやめるつもりです.
とはいえ, はてなブックマークが提供する機能自体は素晴らしいものだと思いますし, 代替も特に思いつかないので, 良い形でまた利用できるようになればと願っています.
2012-03-11 19:20 追記
/etc/hosts で microad のホストを 127.0.0.1 に向けたあとに Wireshark でキャプチャできなくなった件ですが, キャプチャしているのが LAN パケット (en0) だったせいでした.
ループバックパケット (lo0) をキャプチャすることで, 127.0.0.1 から 127.0.0.1 への *.microad.jp のコンテンツを要求する HTTP リクエストを確認できました.
itsango さんありがとうございました.
2012-03-11 22:50 追記
WP Social Bookmarking Light に送った Pull Request が取り込まれ, WordPress のプラグインポータル側にも反映されました.
最新の 1.7.1 以降であればトラッキングしないタイプのはてなブックマークボタンに置き換わっています.
素早い対応をしていただいた作者の @utahta さんに感謝します.