xhrの抽象化を眺めていてプログラミングの勉強って何よとか不毛な悩みが浮かんできた
Ruby on Railsで英辞郎CD-ROMをインポートしてオレオレ単語帳が作れるアプリを作ってる。復習間隔を徐々に伸ばすことで記憶定着率を高めるというアプローチのもの。これがいい感じになってきた。でも単語帳アプリって、やっぱりローカルで動かすだけだとイマイチ。気付くと復習すべき単語が30個も40個も溜まってしまうので、やっぱりモバイルで動かしたい。サーバに置けば、空き時間にスマフォでチェックできてよさげ。結局、語彙力増強は一定頻度で語彙と接触するのがキモで、これを効率良く計画してくれるアプリは助けになる、ような気がする。
サーバにデプロイして動かしてみたら、ビューがモバイルに最適化されていないこと以外は、いい感じ。だと思ったら、iPadでは動くのにAndroidではAjaxで挙動がヘン。ボタンを押しても起こるべきことが起こらない。ログを見るとXHRが飛んでいない。
スカっと解決したいぜ、頼むぜjQueryとか思ったけど、実際にはUnobtrusiveなRailsのJavaScriptライブラリの抽象化レイヤもあるし、なんか面倒だなーという印象。
ブラウザがリクエストをキャッシュしてる? イベントが発火してない? そんなことあるんか? とか思って、よく考えると、そもそもXHRのことが全く分かってないのがいけない気がして、W3CとMozillaあたりで、これまでのブラウザの実装の歴史や解説を少し読んだ。で、想像以上に話が簡単じゃないので、jQueryも見てみた。
jquery/src/ajax/xhr.jsには、以下のようなコードがあって、基本的にjQueryはxhr周りだけでも、この数倍は汚れ仕事をやってくれていることを知った。
// Create the request object // (This is still attached to ajaxSettings for backward compatibility) jQuery.ajaxSettings.xhr = window.ActiveXObject ? /* Microsoft failed to properly * implement the XMLHttpRequest in IE7 (can't request local files), * so we use the ActiveXObject when it is available * Additionally XMLHttpRequest can be disabled in IE7/IE8 so * we need a fallback. */ function() { return !this.isLocal && createStandardXHR() || createActiveXHR(); } : // For all other browsers, use the standard XMLHttpRequest object createStandardXHR; // Determine support properties (function( xhr ) { jQuery.extend( jQuery.support, { ajax: !!xhr, cors: !!xhr && ( "withCredentials" in xhr ) }); })( jQuery.ajaxSettings.xhr() );
AndroidでAjaxが動きません! とかいってググるだけしかできないのは、抽象化の漏れというヤツかもなぁと思ったりしたけど、なんか、こういうのってつらい。
現実は常に汚いということかもしれないけど、本質的じゃない。プログラミングの勉強がしたいというとき、「現実は汚いものなので、そういうものをどう抽象化したりするのかを学ぶのも勉強のうち」と考えるべきなんだろうか。2012年は、もっと普遍的で本質的なことをやりたいと思ったりしていたんだけどなぁ。完全なジョークとも言い切れない処理系を作ってみるとか、アルゴリズムの本を「つまみ食いする」のではなく、これだという1冊を選んで頭から最後までキチンと読むとか、そういうようなこと(とか言いつつ、2週間でできる!スクリプト言語の作り方とかいう本を読んでいたりする)。