プログラム

eval

JavaScriptを書いていて当たり前な事がぶっ飛んでいたので改めて整理。
evalでサーバーから受け取った文字列等々を評価させる場合、評価対象の文字列はJavaScriptの式で無ければならない。
なので、次の様に書くとエラーになる。

rcvstr = "{'foo':100, 'bar':200}";
ev = eval(rcvstr);

上を実行すると、"SyntaxError: invalid label"となる。
一方、

rcvstr = "({'foo':100, 'bar':200})";
ev = eval(rcvstr);

上との違いは()でくくった文字列にしたこと。
この様にして実行すると、

Object foo=100 bar=200

と正常に評価される。()でくくった事によって、「式」になったから。という風に解釈したのだが、これで良いのだろうか。。。
そもそも、firebugとかのコンソールで試してみたところ、

>>> {"a":100}
SyntaxError: invalid label

となって、

>>> ({"a":100})
Object a=100

と、正常に評価されるので。

うむ、体育の日に屋内でプログラムを朝から書いているのはいいことなのだろうか。

php -l その後

やっぱりphp.iniの設定が悪かったようだ。
というか、コマンドラインのプログラムだと、いま利用しているレンタルサーバーだとphp.iniの場所を教えてあげないと駄目なのだろうか?
以下の様にしたら解決したら、きちんとエラーも吐かれる様になった。もちろんphp.iniにエラー出力の定義は書いてある。

% php -c ~/foo/php.ini hoge.php

'-c'というオプションで設定ファイルを直に指定できるのですね。
ともあれ、一旦解決。

デュアルコアのAtomも出たようですし、自宅用サーバーを一台組み立てるかなぁ。

php -l

はて...
レンタルサーバーの上でPHPのシンタックスチェックをかけようと "-l" でチェックさせると...

%php -l foo.php
Errors parsing foo.php

と表示されて、行番号等が表示されない。
自分のMac(Leopard)上だと、

% php -l foo.php
Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in foo.php on line 328
Errors parsing foo.php

と、エラーの内容がわかるのだが。
PHPの設定ファイルが何か間違えているのだろうか。*1

*1:いや、そうに違いない

キャッシュ機構 その2 – PEAR::Cache::Lite

先日は、キャッシュ機構その1 - memcached ということで、memcachedを試したのだけど、memcachedの様にメモリベースのキャッシュではなくて、ファイルベースのキャッシュ機構だと、PEARのライブラリにPEAR::Cache::Liteというのがあるので試してみる。
前回、その1と書いたのは、こちらを見つけていたから。

[補足]2009.4.2
メソッド呼び出しの結果をキャッシュする場合は、Cache_Lite_Functionというクラスがあります。
詳しくは下記をご覧ください。
http://d.hatena.ne.jp/hideack/20090402#1238689560

PEARライブラリに登録されているライブラリなので、pearコマンドでインストールできる。
お約束通り、

% pear install pear_cache

で、OK。
まぁ、使い方はドキュメントを見れば一目瞭然なのだけど、簡単に書いてみると...。

<?php
require_once('Cache/Lite.php');
$opt = array(
'cacheDir' => '/Users/hideack/tmp2/cache/',	// Cache情報の保管先
'lifeTime' => 60,				// Cacheの有効期限(秒)
'automaticCleaningFactor' => 100,		// 有効期限切れのキャッシュの削除確率
'hashedDirectoryLevel' => 2,			// ハッシュ保管先の深さ
);
$cache = new Cache_Lite($opt);
$id = "portalpage";
if ($data = $cache->get($id)) {
//キャッシュが存在する場合は、キャッシュの内容を表示
print($data);
}else{
//キャッシュが存在しないので表示内容を作る (DBにアクセスするとかフォーマットする等重い処理をする)
$data = "PEAR::Cache::Lite demo";
print($data);
$cache->save($data);
}
?>

てな具合である。
お気楽に使えてよいです。
が、PEARのページに "This package is not maintained,..."となっているのが幾分気になるところではあります。

キャッシュ機構その1 – memcached

前々から試してみようと思っていたmemcachedMacOS X Leopardに入れたのでそのときのメモ。
memcachedは、分散メモリキャッシュサーバでRDBMSから得た結果やその他、動的にスクリプトから生成した結果をキャッシュしておく機構。と解釈。mixiや、はてな等々で活用されているそうです。
詳しくは、gihyo.jpで連載されている連載「memcachedを知り尽くす」がわかりやすくておすすめです。*1
で、Leopardにmemcachedを入れる前には、libeventというネットワークサーバのイベント処理に便利なライブラリ*2をインストール前に導入しておく必要がある。これがないとmakeでこけてしまう。
http://www.monkey.org/~provos/libevent/ から最新版を落としてconfigure & makeすればOK。

% tar xvzf libevent-1.4.6-stable.tar.gz
% cd libevent-1.4.6-stable/
% ./configure
% make
% sudo make install

こうすると特に問題なく入るはずです。(もちろん、XcodeLeopardに入っていなければ駄目ですが)

次に本体のmemcachedをインストール。
http://www.danga.com/memcached/ から同様にソースコードをダウンロードして同様にconfigure & makeする。

% tar xvzf memcached-1.3.0.tar.gz
% cd memcached-1.3.0/
% ./configure
% make
% sudo make install

で、実際に入ったか見てみる。-h でバージョンとコマンドラインオプションの表示。

% memcached -h
memcached 1.3.0

  • p TCP port number to listen on (default: 11211)
  • U UDP port number to listen on (default: 0, off)

(以下省略)

無事インストール完了。
連載「memcachedを知り尽くす」の中でも取り上げられている通り、memcachedのプロトコルはシンプルなのでtelnetで試す事ができる。
memcachedをまず常駐させる。

% memcached -p 11211 -m 64m -vv
slab class 1: chunk size 88 perslab 11915
slab class 2: chunk size 112 perslab 9362
slab class 3: chunk size 144 perslab 7281
slab class 4: chunk size 184 perslab 5698
slab class 5: chunk size 232 perslab 4519
slab class 6: chunk size 296 perslab 3542
(以下省略)

最初に出てきたのは確保した64Mbyteの領域を如何にキャッシュ保管用に分割したかを示すステータス。
コンソールをもう一枚開いてtelnetでローカルの11211番にアクセスする。
ここでは、idというキーに対してhideackという7byteの情報をキャッシュとして保持させた。
赤字がクライアントから送った情報。青字がmemcachedからの応答になる。

% telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
set id 0 0 7

hideack

STORED

get id

VALUE id 0 7

hideack

END

quit

Connection closed by foreign host.

見ての通りmemcachedに値がキャッシュされた。
実際、利用する場合はPerlPHPJavaバインディングがあるのでそれらを利用してコードを書けば良い。
コードのイメージは、リクエストが来た際にキャッシュを参照してキャッシュに該当情報がなければ、RDBMSに問い合わせるとか、多々APIを呼び出して応答列を生成し、その結果をキャッシュを作り、次回以降のリクエストに備えておく。といった具合になるのだろう。

*1:こういう記事を見るたび、ネットがあってよかった。と思う。無料で見れるとはありがたいことです

*2:…と、こう解釈しているのですが適切なのでしょうか?httpサーバとか例として書く方多いですね

Ethna_MailSender + EthnaのCLIプログラムで実行中にメール送信が止まる

[追伸]
後日問題はPHP<=>DB間の通信にあったことが判明。
問題の切り分け方がヘタクソなだけでした。

何かきっと間違っているに違いないのだけど、ちょっと詰まっているところ。
サーバー上のcronで定期的にそのサーバーのWebアプリケーションのプロジェクトで作られたEthnaCLIプログラムを実行している。
で、このプログラムは何をしているかというと、DBを引いて条件に合致したメールアドレスに対してのみメールを発送するという処理をしている。

で、現状、お悩みの箇所は...。
合致した件数分ループが回って、1件毎にCLIプログラム中ではEthna_MailSenderクラスを使ってメールを発送しているのだけど、このスクリプトを実行しているときに条件に合致したアドレスが10件を超えたくらいの数があった場合に途中で止まってしまう(!?)。最初の数件は無事に送信できているのだけど。
まだ中身を詳しく追えていないのでナニなのですが、現状の課題として記録。
私の事なので、多分、かなりしょうもない間違いをしているのだと思うのですが。そもそも、メールこうやって送るの間違っている。とか。

ちなみにEthna_MailSenderを利用したメールの送信法はEthna公式サイトのメールを送信する最短のサンプルを参照。

ワーカースレッドを含むプログラムをVC++のデバッグモードでデバッグすると落ちる

まだ、生きてるよ。ということでメモ代わりに書いておく。
VisualStudio2005...というか、VisualC++のデバッグモードでワーカースレッドを含むプログラムをブレークポイントを設定してデバッグするとVC++が固まって動かない。応答もなくなり、キー入力も受け付けない。
何かデバッグの仕方間違えてるのかな。と思いつつ、あれこれ調べてみると、MS-IMEをタスクバーに入れていたり、ウィンドウとして表示していると固まるという冗談みたいな内容を見つけたので、まさかと思いつつ試したら解決した。

・・・なんだこれ。

bookreader.js

やっぱり、話題に微妙に乗り遅れる人。私。

簡単にHTMLを修正するだけで、小説の様なインターフェースで横スクロールで表示し読みやすくするJavaScriptライブラリ。bookreader.jsを使ってみた。
ということで、簡単なサンプルとして、指定したサイトのフィード情報を取ってbookreader.jsで表示するのを書いてみた。
f:id:hideack:20080629181323p:image
が、画像が入るとどうもうまく表示させられない*1ので、現状文字のみ。寂しい。

このページ( http://www.feeddown.com/feedbook/ )でフィードがあるサイトのURL入れると情報取ってきて表示されます。
やってることは、シンプルですが、実際に触ってみないと何事もわからないので。

*1:多分、フィード取ってきたときの加工がへたくそなのだと思う

VisualStudio2005のオーバーライドのボタン

VisualStudioで何か継承したクラスを作成したとき*1VisualStudioのクラスのプロパティからオーバーライドのアイコンをクリックする事でオーバーライド可能な関数の一覧がすぐに表示されて、クリックするだけで*.hへの反映と*.cppへの雛形表示が行われますが。
前々から思っていたのだけど、どうも解せない。このアイコン。(選択されている立方体のアイコン)
f:id:hideack:20080623170708p:image
イベントリスナー追加の、このアイコンのとなりにある稲妻マークは結構直感的だと思うのだけど。
ただ、以前のVisualStudioのバージョンから続くアイコンだから、ずっと使い続けている人にはわかりやすいのだろうな。
時々しか使わない私にはいつまでも頭に入らない。

*1:もっぱら、C〜のMFCのクラスを継承する事が大半ですが