キャッシュこわい

キャッシュといっても、お金ではなくコンピュータのキャッシュのほう。

htaccessのキャッシュはなかなかクリアされない : WEB作成メモblog[アフラット]

htaccess変更したのに、何をどうやってもうまくいかないと思ったらキャッシュのせいだった。Firefoxのキャッシュ半端ない。IEで試したらちゃんと出来てたよママン…

ついでにCakePHPのキャッシュにもやられた。「app」ディレクトリを違う環境にごっそりコピーしたら、lib/Cake/Core/App.phpで「ライブラリが見つからないよー」ってエラーが出て延々ハマった。app/tmp/cache/persistent/myapp_cake_core_file_mapあたりでキャッシュしてるらしい。キャッシュ全部消したらすんなり動いた。テーブル定義の変更とか、CakePHPはキャッシュでエラーが起こることが多いから留意しておきたい。

キャッシュ=お金も人を狂わせやすくて怖いけどね~

Amazon EC2で課金が停止されなかった理由

極小額だけど、課金の通知が届いてびっくりしました…

ある日、Amazon EC2からメールが届きました。「使ったから課金してちょ」と。確かにドットインストールでEC2の勉強した時にインスタンスを作ったりはしたけど、止めてたような気がするのに。

気になるので、AWSのコンソールにログインしてEC2を見てみるものの、Running InstancesもVolumesもSnapshotsも「0」になっていて、課金されているはずがない。おかしいなぁ、もしかして勉強した時の請求が今頃来たのかなぁなんて唸りつつ、そのまま放置。

したら翌月も来ました。さすがに何かおかしいと思ってコンソールを見てみても、やはりゼロ。ネットで請求の止め方を見ても、インスタンスを止めろとしか書いてません。でも請求書には、確かにEC2のInstance Tokyoって書いてある…ん?

EC2_Management_Console

コンソール画面の右上に違和感が…

見ていたリージョンが違った

Oregonになってます。デフォルトだとOregonのリージョンが表示されるの?ってかリージョン別に表示されるの?そうなの?バカでごめんなさい…

OregonをクリックしてTokyoにしたら、ゼロじゃない数字が!勉強で使っただけなので、止められるものは全て止めて、そこからは課金額も伸びていないようなので、多分大丈夫です。1ドルもいかない額だったから良かったものの、こんな知識で金額いってたら大爆死するところでしたよ…おおこわい。

自分みたいにギリギリの知識で色々試す人もたくさんいると思いますが、こういうこともあるので要注意!気をつけましょう。いい勉強になりました。

simple_html_dom.phpの使い方

スクレイピング

サイトの更新チェックをする機会が(趣味で)ときどきあって、何度かこのライブラリを使ったことはあり。ただ、毎回デバッグを繰り返して結果オーライになるように強引に使っていたので、今回はちゃんと理解して(?)使ってみました。

findは第2引数の有無によりオブジェクトor配列で返る

結局のところ、この一点につきます。ここで悩んでました。findの第2引数を指定しなければ配列で、指定すれば該当するインデックスの要素をDOMオブジェクトで取得できます。なので

$html->find('div')->find(expr)

は配列に対してfindしようとしているのでエラーになって

$html->find('div', 3)->find(expr)

は4番目のdiv要素オブジェクトからfindした結果が正しく返ります。
ちなみにHTML上でidは1つだけというお約束になってはいますが、ここでは関係なく第2引数の指定が必要です。

$html->find('#idname')->find(expr)

はエラーになって、

$html->find('#idname', 0)->find(expr)

はOKということです。第2引数は該当する要素について0ベースのインデックスになるので、適宜変更してください。

<div id="fuga">hoge</div>
<div id="bar">foo</div>
<div>aaa</div>
<div>bbb</div>

例えば上で2つめのdivを取得したい場合は

$html->find('#bar', 0)
$html->find('div', 2)

のどちらかで取得できます。

更新情報などのように、同じ構造の要素を複数取得したい場合には次のようにすればOKです。

foreach ($html->find(expr) as $elem) {
    $elem->find(expr, 0)->innertext;
}

findの第二引数を指定しなければ配列なので、foreachで回せば各要素が$elemに入るってことですね。

テキストの取得

<div id="aaa">bbb<b>ccc</b></div>

例えば上のようなDOMツリーがあるとしたら、それぞれ下記が取得できます。
$html->find('#aaa', 0)->outertext<div id="aaa">bbb<b>ccc</b></div>
$html->find('#aaa', 0)->innertextbbb<b>ccc</b>
$html->find('#aaa', 0)->plaintextbbbccc

属性の取得

属性値をプロパティのように取得可能です。(下記参照)
->href
->id
->checked

PHP Simple HTML DOM Parser: Manual

全部オンラインドキュメントに書いてあるんですけどね…ともかく今後はちゃんと使えそうです。自分のようなどどどシロウトの参考になりますれば!

jquery.uploadで引用符(”、ダブルクォーテーション)を含む場合の対処法

jquery.uploadを使っていてハマったのでメモ。

jquery.uploadで画像と一緒にパラメタを送信する場合、引用符(”、ダブルクォーテーション、ダブルクォート)が含まれる値を送信しようとすると、引用符以降の文字が送信されない。引用符を含む場合は、下記のようにエスケープしてあげれば大丈夫(かどうか分からないけど、ちゃんと送信された)

var escapedHoge = hoge.replace(/”/g, ‘&quot;’);

jquery.uploadの仕組みが、送信用のiframeを生成してそこにformを作成して送信…的なことをやっている感じなので、恐らくそこでパラメタを設定する際に引用符が消えたんでしょう。場当たり的な対処だけど、とりあえず期待通りに動いてるんでこれでいく。