rails で pdf を send_file したときに上手く開けなかった不具合

rails 2.3.5 で send_file/send_data を使って PDF ファイルを送信したけれど、FireFox では上手く開くことができなかった。リンクをクリックしても真っ白な画面が表示されるだけで、それ以上何もできなくなる。IE8 では開くことはできたけれど、ウィンドウを切り替えてIEに戻ってくると表示されなくなったりしていた。

対処として

headers['Cache-Control'] = "must-revalidate, post-check=0,pre-check=0"

をsend_file/send_dataの前につけることで回避できた。キャッシュが悪さしていた模様。IE, FF 両方で動作確認済み。

エラー c00ce56e のため操作を完了できませんでした。

IE で prototype の Ajax.Request や Ajax.Updater を使ったときに、いきなりタイトルのようなメッセージが出てしまい、script が停止してしまった。 responseText を取得しようとしただけでエラーがでるため、response そのものを確認することすらできず、なかなか苦労した。

調べたところ、Ajax に対するレスポンスの文字コードUTF-8 以外の場合にこのエラーがでるらしい。
対策としては、UTF-8 でレスポンスをかえすようにすればよい。
ページの文字コードSJIS などであったとしても、文字化けは起こらない。
あるいは、ISO-8859-1 でレスポンスを返しても良い。ただし、この場合日本語は全て絶対参照で出力する必要がある。

そもそもなんでこの問題が起きるかというと、prototype.js によって送信される Ajax リクエストの文字コードUTF-8 になっているからのようだ。リクエストと違う文字コードでレスポンスが帰ってきた場合にエラーが起きる。

問題解決時の脳の使い方3種盛り

僕たちが何か問題を解くときのアプローチには大きく分けて3種類の脳の使い方があると僕は信じている。そのことについてまとめてみたくなった。

まず、「問題を解く」ということを、地図上のスタート地点からゴールまでの道のりを探し出すことに例えて以下話を進めてみる。地図上で歩みを進めることは、議論を展開することに対応する。目的はゴールにいたるまでの議論展開を見つけることだ。

まず一つ目の脳の使い方は論理的な思考法だ。論理的に議論を進めていく、最も一般的で、重要だと思われている手法。これはさらに以下の2種類に分類できる。

  • 現在手持ちの情報から、論理的にどのようなことが導かれるか。地図の例で言うと、今いる地点から次に進める道を探る行為。
  • 現在向かおうとしているゴールを達成するには何が必要かを考える。地図で言うと、ゴールから逆向きに地図を辿る。

この論理的思考だけでは問題を解くことはとても難しい、というかとても時間がかかる。なぜか。その理由は多くの場合論理的な議論の展開の道筋は複数あり、そのうちのどれを採用すればよいかその時点ではわからないことが多いからだ。論理的思考のみで問題を解こうとした場合、複数ある道のどれか一つを選びとりあえず辿ってみて、行き止まりになってしまったら分岐点まで引き返す、という行為を繰り返すことになる。早い段階で行き止まりにたどり着ければよいが、終わらない議論の道に入り込んでしまうと悲惨だ。

この問題に対して人間のそなえ持つ能力が直感、あるいはパターン認識と呼ばれるものだ。これは過去の経験から問題のパターンを学習し、非論理的な議論のショートカットを行うための能力だ。地図の例でいうと、複数ある道筋からえいやっと正しい道筋を選ぶことのできる能力や、今いる地点から数ステップ先の道にいきなりショートカットする能力ということになる。ショートカットした間の議論は後付で補完できることもあるし、自分でも説明できないこともある。もちろん間違った直感による間違った道筋の選択も往々にして起こりえるが、多くの場合うまく働く。僕たちは日ごろ仕事をしているとき、問題を論理的に解いていると思いがちだが、多くの場合はこのパターン認識で問題を解いている。毎度毎度論理的思考だけで問題を解いてしまうととてもじゃないけど仕事が終わらない。そのくらい論理的思考はパターン認識と比べて遅い。

だがしかし、これだけでもまだ問題が解けないことがある。とっても難しい問題や、アイデアを出すような問題の場合が該当する。パターン認識によって沢山の分岐を素早く刈り取ったとしても、たいていの場合沢山の分岐が残ることになり、考えうる道筋はゴールまでの距離に応じて指数的に増えていく。特にスタートからゴールまでの距離がとても長い問題の場合、一つ一つ列挙することは不可能なほどに議論の可能性が存在しうることになり、この中から正しい道筋を選び出すのは至難の業だ。

この問題に対する人間の対策がひらめきと呼ばれるものだ。ここでは一体何が起きているのか。論理的思考とパターン認識を駆使することで、スタートからゴールに向かって、またゴールからスタートに向かってある程度探索が行われる。この二つの探索済みエリアが重なることでスタートからゴールへの道筋が見つかることになる。この2つのエリアがあまりにも遠くかけ離れていた場合、まだ答を見つけることは簡単ではない。問題は2つのエリアがかなり近くまで来ているが、まだ接するところまではいかない場合だ。

この場合、ある地点から後ちょっとだけ探索の範囲を伸ばせば問題は解けるのだが、あまりに候補が多すぎてその地点に注力すればよいということには到底気づけない。論理的思考も、パターン認識も役に立たない。幸い、脳は問題を与えておくと日常生活を営むうちにもバックグラウンドで解を探してくれる便利な機能があるらしい。沢山ある候補の中から、少しずつでも探索の範囲を広げてくれようとする。この機能によって、少しずつ探索済みエリアが広がっていき、ある日突然二つは重なり合う。エウレーカ!

かなり単純化している気がするけど、こんなイメージを持っている。じゃぁ実際に問題を解く時にはどう行動をとっていけばいいの?というところは気が向いたらまた書く。

mysql + readline

http://d.hatena.ne.jp/hirose31/20090531/1243777478
を少し修正。頭に \\c をつけることで、その瞬間に何か入力の断片がreadlineバッファに残っていても正しくコマンドが実行されるようにした。末尾に改行をつけてコマンドがすぐに実行されるようにもした。

$if mysql
"\C-xd": "\\cshow databases;\n"
"\C-xt": "\\cshow tables ;\n"
"\C-xp": "\\cshow processlist;\n"
"\C-xu": "\\cselect user,host,password from mysql.user order by user,host;\n"
"\C-xb": "\\cselect user,host,db       from mysql.db   order by user,host;\n"
"\C-xc": "\\cshow create table "
$endif

google analytics (ga.js) で日本語URLを表示させる

(追記)以下の方法はうまく動かないようです。設定すると文字化けを起こしてしまいます。

wordpress などで日本語URLを使っていた場合、google analytics(ga.js)ではURLがURLエンコードされたままで表示されてしまい、とても分りづらい。旧バージョン(urchin.js)ではこのようなことはおきていなかったのだけど、新バージョン(ga.js)では退化してしまっている。

旧バージョンでできていたということはサーバではなく js の問題なので、ga.js をハックして日本語URLが通るように修正する。

具体的には以下のコードをanalyticsのコードに挿入すればよい。現在のURLを作成するための function を上書きしている。

try{
 if( typeof pageTracker.Tc == "function" ){
  pageTracker.Tc=function(b){
    var e=document.location,c=_gat,h=c.b;
    b=h!=b&&""!=b?c.d(b,true):c.d(unescape(e.pathname)+unescape(e.search),true);
    return b; }; }
}catch(e){}

挿入箇所は以下の行の前に追加する。

pageTracker._trackPageview();