2012年 03月 01日

関連エントリー (画像)

試用期間終わった。

2012年 03月 02日

関連エントリー (画像)

2012年 03月 06日

Apache の mod_rewrite の挙動をテストするやつ

Test::Apache::RewriteRules がうまく動かなくて (プロキシされるほうの apache が何かで起動しない) 泣いたので、ほぼスクラッチから書いたやつをはっとく…… だいぶ前のだけど

  • プロキシされるほうのサーバは Apache ではなく HTTP::Server::Simple::PSGI にした。
  • インターフェイスが微妙に違う (シンプルにした)
  • エラーがでたときに apache の error_log を表示するようにした
  • 普通に HTTP::Response が返ってくるのでそれをテストする
    • $res->{env} にプロキシされたサーバに送られた Plack の env がほぼそのまま (glob とか Storable できないものを除いて) 入っている
    • $res->{backend} に処理したサーバが入っている (デフォルトは default)
    • $res->header('Server') =~ /Apache/ とかでプロキシがそのまま処理したことをテストできそう
    • $res->{uri} は 30x 系の場合は Location ヘッダが、そうでない場合は 'http://' . $data->{name} . $data->{env}->{REQUEST_URI}; が入る、ので $apache->request('...')->{uri} eq 'http://Backend/foobar/'; とか並べて書ける

あたりが元のやつと違う。しかしテストを走らせまくっているとセマフォのエラーになるのはなんとかならないのかな

2012年 03月 08日

gerry++

2012年 03月 13日

関連エントリー (画像)

2012年 03月 15日

gerry++

関連エントリー (画像)

べっこう飴を久しぶりに作った。一度目微妙に失敗してしまったが、二度目でうまくいった。昔作ったときはレモン汁を混ぜたりしていたなあと思ったけど、自宅になかったので無配合、砂糖100%のものになった。ただの砂糖なのにいい香りになるのは不思議だ。

2012年 03月 22日

関連エントリー (画像)

gerry++

if (!condition) {} else {} を使うケース ( if (condition) {} else {} が好ましくないケース)

if (!condition) {
  // foobar
} else {
  // barbaz
}

は ! をはずし、中身を入れかえた以下と全く同じ (あたりまえ)

if (condition) {
  // barbaz
} else {
  // foobar
}

一時期、「if の条件に ! がついてはいけない!!」という妄執にとりつかれて一律後者にしていたけど、最近はそんな変な呪いが解けていて、素直に書くようになった。

例えば何度も呼ばれる関数が処理のすすみ具合によって条件分岐をする場合、つまり条件よりも処理の中身の流れのほうが重要だと思われるケースでは、条件の否定肯定にはこだわらず、中身の順番を上から読み下せるように書くようにしている。

例えば以下のように1回目だけ完全に違う処理を走らせたい場合は、条件を否定にして先に走る処理を先に書く

>|javascript||
function foo () {
if (!arguments.callee.called) {
arguments.callee.called = true;
// first
} else {
// second or more
}
}
|

2012年 03月 24日

関連エントリー (画像)

2012年 03月 26日

関連エントリー (画像)

gerry++

2012年 03月 27日

関連エントリー (画像)

2012年 03月 28日

関連エントリー (画像)

2012年 03月 29日

FlashAir

asin:B007EMIEJQ:detail

FlashAir というのが最近出たらしく、おもしろそうなので買ってみた。機能的には、Wi-Fi の AP と HTTPD として動いて、SD カード内の画像をダウンロードできる、というもので、Eye-Fi の競合 (機能的には違うんだけど) 的製品になっている。

Eye-Fi は持っていないのに、いきなりこんな謎なものを買ったのは、HTTPD が動いてくれるというところにひっかかったからだ。カメラみたいなデバイスで HTTPD が動くのはなんとなくわくわくするのである。

FlashAir は、割と素直な感じで、SD カードの中身をそのまま HTTPD で配信する感じなので、組み込みのページ以外に、自分で HTML と JS と CSS を書けば独自ページを作成できる。また、組み込みで配信されるページ自体も、SD カード内のファイルをいじると変更できるようになっている。ハードコードされていたりしないのは非常に嬉しいと思う。

ということで、SDカード内の写真のうち、最新順に表示するページを作ってみた。ファイルシステムの関係上ファイル名に制限がある (拡張子が3文字までとか) とか、thumbnail.cgi の挙動がおかしいとかあるけど、こういうのは簡単につくれた。今後ファームウェアアップデートで HTTPD がもうちょい安定するといいなあと思う。

なんとなく、スマフォのカメラの変わりに使えたらいいな、と思っていたけれど、ネットワークの関係でそうもいかない。FlashAir には AP として接続するため、その間、3G 回線など、Wi-Fi と排他的になっているネットワークが使用できない。FlashAir はもちろんインターネットには接続されないので、FlashAir に接続している間、スマフォはインターネットから切断されてしまう。picplz とかそういうアプリは、送信できない場合にキューに貯めるから、AP からの接続をきったあとにアップロードが開始されるだろうけれど、インターネットと同時に接続できないのは結構ストレスがあるので、用途によっては全く使えない感じになりそう。

あと Yahoo! トピックスに載ってた情報によると、SDK も配布されるみたいな話があるので、それはそれで楽しみです。

追記

最近書いたなんとなくかっこいいかなと思うコード

JSDeferred のサンプルコードの殆どは、pre に書いてあるやつをそのままJSで実行する形になっている (二重に書いていない)

その中で console.log() とかを使っているけれど、デモなので console.log() をブラウザ側ではなく、ページ側に表示させたいと思い、それらの console.log をフックしている。この場合、評価したいコードは文字列として存在するので、Function オブジェクトを使って console のダミーを作って実行するようにした。

new Function('console', code)({ log : function () { ... } });

Function オブジェクトの引数の名前を console にして、実行するときに代替オブジェクトを渡すようにした。すなわちこの場合 console はローカル変数になっている。

こうすることで、元々の console.log には一切手を加えず、このコードを実行している間だけ、console オブジェクトをさしかえた。一時的に大本の console.log を差し替えるやりかたは、非同期なコードがまざると大変なので、いい思い付きをした、と自画自賛しました。

gerry++

2012年 03月 30日

関連エントリー (画像)

FlashAir の HTTPD をエミュレーションするスクリプト

FlashAir に搭載されている HTTPD をエミュレーションする Plack::App::Emulate::FlashAir というのを書いた。SD カードマウントして書きかえて実機に直接アクセスするでもいいんだけど、それだと、書きこみで待たされたり、接続している間ネットができなかったりする。

機能は以下の通り

  • ./sdcard/ を sdcard のルートディレクトリとする
  • List.htm (コピーするのはアレっぽいので、付属のは自分で書いたやつ) によるディレクトリインデックス
  • thumnail.cgi によるサムネイル画像取得 (実機と同じく exif の ThumbnailImage を展開しているだけ)
  • command.cgi のダミーレスポンス
  • config.cgi のダミーレスポンス

List.htm をリライト (デザインかえたいとか) するとか、別途機能をちょっとつけたいときのデバッグに便利だと思う。


あと、SDカード内のファイルを最新順に表示するページをつくった。

を FlashAir のカード内のどっかにおいて、アクセスしたら動くとおもう。iPhone と Android でまぁまぁいい感じになるように調整した。