Home

日記
自転車通勤復路Edit

かかった時間1:18
自転車に乗っていた時間1:09
走行距離25.85km
平均時速22.6km/h
最高時速43.4km/h
総走行距離1796.4km
トレーニング効果3.5
平均心拍数149
最大心拍数181
消費カロリー998kcal

Published At2006-11-16 00:00Updated At2006-11-16 00:00

日記
自転車通勤往路Edit

かかった時間1:37
自転車に乗っていた時間1:07
走行距離25.92km
平均時速23.0km/h
最高時速51.5km/h
総走行距離1822.3km
トレーニング効果3.4
平均心拍数138
最大心拍数187
消費カロリー1063kcal

今日は久しぶりに荒川CRを通らないルート。途中でチェーンが噛んだ+寄り道買物したんで、ちょっと余計に時間がかかっている。

で、ずっと買うかどうか悩んでいたんだけど、ドイターのスーパーバイクを買った。自転車用のリュックサックね。今まで使っていた、オリンピックで買った安物だけど軽いリュックだと、固定器具周りがどうにも安物ちっくで、A4ノートPCを入れていると荷物の位置がずれる感じが気持ち悪かった。自転車専用だったら、もっときちっと固定できるだろうし、固定した状態での背中の空気の抜けが良くて蒸れないだろう、と期待して購入。今まで使っていたリュックの中身もちゃんと入ってくれたんで、ほぼ今まで通りの使い方ができるかな。ポケットが小さいんでその辺にいろいろ突っ込んでいた物は整理しないとならないけど。

あと、なるしまフレンドで安売りしていたGIZA LPF-014とかいうハロゲン+LEDライトを購入。今まではCAT EYE HL-EL200をメイン、サブに小さいフラッシングライトをつけていた。現状の街中通勤ルートだったらこれで十分なんだけど、夜の荒川CRとかはこれじゃ全然見えないだろうってんで、HL-EL200と同じ充電池を使い回せるハロゲンライトを購入。ただ、500円で投げ売りされていたものだから、ハロゲンライトといっても大して使えないかもしれないけど。

あと、まだ持ってなかったズボンの裾用ストラップを購入。寒くなると長いズボンを履いて乗る機会も出てくるだろうし、一応持っておいた方がいいだろう。

Published At2006-11-17 00:00Updated At2006-11-17 00:00

日記
自転車通勤復路Edit

かかった時間1:22
自転車に乗っていた時間1:08
走行距離25.82km
平均時速22.7km/h
最高時速41.8km/h
総走行距離1848.2km
トレーニング効果3.4
平均心拍数144
最大心拍数179
消費カロリー983kcal

早速今日買ったもののレビューを。まず安売りライトGIZA LPF-014は、ハロゲンライトをハイモードで使う分には、そこそこのスピードで走っているときのダイナモライトくらいの光量がある。これくらいならば、結構暗いところでもそれなりに走れそう。ただし、ハロゲンライトをローモードにしたらかなり光量が落ちるし、LEDライトは暗すぎてフラッシング用途でも使い物にならなそう。俺みたいにフラッシングは別につけていて、暗いところでだけある程度の光量が確保できればいい、って人間にはとてもいいライトだけど、普通はあんまりおすすめできない感じ。かなり暗いところでしか使ってないんで、バッテリーの保ちはまだ不明。ハイモードで2時間位保てば、まあ使い物になるかなー。

ドイターのスーパーバイクの方は、今のところ文句なし。重い荷物が入っていても、背中にきっちり固定されてくれるし、それでいて背中とリュックの間に空間がある感じもきちんと伝わってくる(密着されてべたーっとした感じがしない)。いつもは体をちょっと振り気味に漕ぐと、荷物が背中で暴れて腰に負担がかかる感じがするんだけど、ダンシングしても荷物は背中と一体化していてくれる。今までよりも容量はちょっと減ったけど、荷室が狭い状態(ファスナーを閉めた状態)でも、A4ノートPC(with リュックの中身)+文庫本2冊+ウインドブレーカー+折りたたみ傘+その他小物ごちゃごちゃたくさん、という今までの荷物は一通り全部はいるし、それでいて自転車用の快適性と機能性が増している。買って良かった。

Published At2006-11-17 00:00Updated At2006-11-17 00:00

技術日記
PHPで安全なセッション管理を実現する方法に対する高木さんのコメントへのフォローEdit

高木さんのはてなブックマークコメントに、

[セキュリティ][乱数][暗号][PHP][moderate] PHPはセッションID生成にsecureな擬似乱数生成系を使用していないようだ。さすがPHPらしい駄目っぷり。

とあって、そこから人がたくさん来ているらしいんで、ちょっとだけフォロー。PHPのセッションID生成は、

sprintf(buf, "%.15s%ld%ld%0.8f", remote_addr ? remote_addr : "",
tv.tv_sec, (long int)tv.tv_usec, php_combined_lcg(TSRMLS_C) * 10);

なんて感じで、マイクロ秒単位の現在時刻+ユーザーのリモートアドレス+combined-LCG(線形合同法による乱数2つを組み合わせているらしい。線形合同法自体は、疑似乱数生成方法としてはセキュアな方法ではないとされている)による乱数を使って生成されているんだけど、php.iniとかで、

session.entropy_file = /dev/urandom
session.entropy_length = 16

とか設定しておけば、そっちも組み合わせて使われます(/dev/urandomとかが使える環境ならば)。なんで、この設定を有効にしておけば、PHPのセッションID生成もセキュアな感じになるんじゃないでしょうか。

ただわたしはセッションID生成におけるセキュリティの問題として、「マイクロ秒単位の現在時刻+ユーザーのリモートアドレス+combined-LCGによる乱数」という方法にはどの程度の問題があり、それに「/dev/urandom」を組み合わせることでどのくらい安全性が高まるのか、とかよく分かってませんが。

PHP 5.2.0の該当コード(ext/session/session.c)を貼っておきますよ

entropy_lengthとentropy_fileがphp.iniなどからやってくるsession.entropy_lengthとsession.entropy_file設定。デフォルトはどちらも空。hash_funcはsession.hash_function設定(PHP 5以降で有効)から来ていてデフォルトはMD5(値としては0)になっている。

PHPAPI char *php_session_create_id(PS_CREATE_SID_ARGS)
{
PHP_MD5_CTX md5_context;
PHP_SHA1_CTX sha1_context;
unsigned char digest[21];
int digest_len;
int j;
char *buf;
struct timeval tv;
zval **array;
zval **token;
char *remote_addr = NULL;
gettimeofday(&tv, NULL);
if (zend_hash_find(&EG(symbol_table), "_SERVER",
sizeof("_SERVER"), (void **) &array) == SUCCESS &&
Z_TYPE_PP(array) == IS_ARRAY &&
zend_hash_find(Z_ARRVAL_PP(array), "REMOTE_ADDR",
sizeof("REMOTE_ADDR"), (void **) &token) == SUCCESS) {
remote_addr = Z_STRVAL_PP(token);
}
buf = emalloc(100);
/* maximum 15+19+19+10 bytes */
sprintf(buf, "%.15s%ld%ld%0.8f", remote_addr ? remote_addr : "",
tv.tv_sec, (long int)tv.tv_usec, php_combined_lcg(TSRMLS_C) * 10);
switch (PS(hash_func)) {
case PS_HASH_FUNC_MD5:
PHP_MD5Init(&md5_context);
PHP_MD5Update(&md5_context, (unsigned char *) buf, strlen(buf));
digest_len = 16;
break;
case PS_HASH_FUNC_SHA1:
PHP_SHA1Init(&sha1_context);
PHP_SHA1Update(&sha1_context, (unsigned char *) buf, strlen(buf));
digest_len = 20;
break;
default:
php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid session hash function");
efree(buf);
return NULL;
}
if (PS(entropy_length) > 0) {
int fd;
fd = VCWD_OPEN(PS(entropy_file), O_RDONLY);
if (fd >= 0) {
unsigned char rbuf[2048];
int n;
int to_read = PS(entropy_length);
while (to_read > 0) {
n = read(fd, rbuf, MIN(to_read, sizeof(rbuf)));
if (n <= 0) break;
switch (PS(hash_func)) {
case PS_HASH_FUNC_MD5:
PHP_MD5Update(&md5_context, rbuf, n);
break;
case PS_HASH_FUNC_SHA1:
PHP_SHA1Update(&sha1_context, rbuf, n);
break;
}
to_read -= n;
}
close(fd);
}
}
switch (PS(hash_func)) {
case PS_HASH_FUNC_MD5:
PHP_MD5Final(digest, &md5_context);
break;
case PS_HASH_FUNC_SHA1:
PHP_SHA1Final(digest, &sha1_context);
break;
}
if (PS(hash_bits_per_character) < 4
|| PS(hash_bits_per_character) > 6) {
PS(hash_bits_per_character) = 4;
php_error_docref(NULL TSRMLS_CC, E_WARNING, "The ini setting hash_bits_per_character is out of range (should be 4, 5, or 6) - using 4 for now");
}
j = (int) (bin_to_readable((char *)digest, digest_len, buf, PS(hash_bits_per_character)) - buf);
if (newlen)
*newlen = j;
return buf;
}

Published At2006-11-20 00:00Updated At2019-12-31 00:03

日記
自転車通勤往路Edit

かかった時間1:14
自転車に乗っていた時間1:03
走行距離25.64km
平均時速24.2km/h
最高時速45.1km/h
総走行距離1873.8km
トレーニング効果3.6
平均心拍数146
最大心拍数187
消費カロリー906kcal

三日間休んだ後は足に余裕があるなー。上り坂とかでも最後までケイデンスを落とさずに走りきることができる。結構のんびり気味に来たはずなんだけど、思ったよりも速かったらしい。

Published At2006-11-21 00:00Updated At2006-11-21 00:00

技術日記
Zend Framework 0.2.0調査メモEdit

0.2.0のアーカイブをながめながら、気になったところをメモ。

Zend_Cacheがincubatorからlibraryに格上げされている。incubatorの頃から使っているんで、特に俺的には新鮮みはないけれども、一応まとめておく。キャッシュの利用方法を規定するFrontendと、キャッシュの格納方法を規定するBackendの二つのクラスで構成される。Frontendはクラスのメソッド呼び出しをキャッシュするZend_Cache_Frontend_Class、ファイルの読み込みをキャッシュするZend_Cache_Frontend_File、関数呼び出しをキャッシュするZend_Cache_Frontend_Function、外部(HTML)出力をキャッシュするZend_Cache_Frontend_Output、ページ単位の出力をキャッシュするZend_Cache_Frontend_Page(Outputキャッシュとほとんど同じで、キャッシュIDをURL等から自動生成する)が用意されている。BackendはファイルキャッシュのZend_Cache_Backend_File、APCを使ったメモリキャッシュのZend_Cache_Backend_APC、memcachedを使ったメモリキャッシュのZend_Cache_Backend_Memcached、SQLiteを使ったZend_Cache_Backend_Sqliteが用意されている。ただしAPCとMemcachedはタグ機能がサポートされていないんで、機能限定版だと思っておいた方がいい。ちなみに自分ではMySQLバックエンドを書いて使っている。

Zend_Configもincubatorからlibraryに格上げされている。階層構造を持つ設定情報を、PHPのstdclassでプロパティアクセスするようなインターフェースにマッピングして扱えるようにするクラス。連想配列なんかよりも扱いやすくて便利そうなんだけど、データソースとして現状でINIファイル、XMLファイル、PHPの連想配列にしか対応していないんで使ってない。Spycとかのラッパーを書いてYAML対応してもいいんだけど、それならSpycをそのまま使ったって別にかまわないしなー。

ルーターは、Zend_Controller_RewriteRouterがlibraryに格上げされている。ってのは0.1.4からだっけ? RewriteRouter自体は悪くないんだけど、これの完成度が上がる前に、自前で似たようなルーターを書いちゃったから今のところ使ってない。将来的なメンテナンス性とかを考えると、そのうちRewriteRouterに乗り換えるかもしれないけど。RewriteRouterは機能的にはあまり文句はないんだけど、YAMLで設定を書けないところが面倒くさいよなー。っつーか、Zend Frameworkは早いところYAML対応して欲しいなー。ゼロから書き起こす縛りがなければ、YAML対応するのなんて簡単だろうに。

Zend_Http_Clientは、昔incubatorで開発されていたバージョンは没になって、構成がずいぶん変更されているっぽい。Zend_Http_Requestが導入されたんで、Zend_Http_Client本体を高機能に拡張するのはやめて、Zend_Http_Client、Zend_Http_Request、Zend_Http_Responseで役割を分割するようにしたのかな。っつーことは、旧incubatorバージョンを採用していた俺のコードは、すべて書き直す必要がありそうだ……。まあどちらにしろ、Zend_Http_Request対応する必要があるから、そのあたりは大規模に書き換える必要があるけど。

ちなみにincubatorではコントローラ周りにも結構大きな仕様変更が行われつつある。ルーティング結果を保持するZend_Controller_Dispatcher_Tokenがなくなり、代わりにZend_Controller_Request_Httpが採用される。これは、従来のTokenと同様にURLから解決されたコントローラ名、アクション名、パラメータを保持するだけでなく、$_GET、$_POSTなどの入力値も管理する機能を持つ。今まではURLから解決できる値はTokenが持ち、それ以外の入力値はZend_Filter_Inputあたりを使って解決するという、中途半端な仕様になっていたんだけど、Zend_Controller_Request_Httpが導入されることによって、ようやく入力値を統一的に扱うことができるようになる。また、こうやって入力値を統一的に扱うことができるようになると、アクションレイヤーのテストなんかで仮想的なRequestを渡してテストを実行できるようになったりするんで、そういう意味でも便利。ちなみにZend_Controller_Request_HttpはZend_Http_Requestを内部にもっているんで、その辺が前段落の話とつながってくる。ちなみに俺ルーターはすでに同様の機能を持っちゃってるのが、今後Zend Framework本家版に合流するのを難しくしてしまっている。

Zend_Aclはまだincubator止まりだな。これはいつになったら格上げされるんだろう? ちなみにZend_Aclの構成としては、アクセス制御される対象物を管理するACL(Zend_Acl。$acl = new Zend_Acl();)と、アクセスを行う実行者グループを管理するARO(Zend_Acl_Aro。$aro = $acl->aroRegistry();)があり、まずAROとして実行者グループを登録し($aro->add('somegroup'); // somegroupというグループを登録。$aro->add('someperson', $aro->somegroup); // somegroupに所属するsomepersonを登録)、続いてACLにどの対象物に対してどのAROがどういう権限を持つか設定していく($acl->deny(); // デフォルトは拒否。$acl->someobject->allow('somegroup'); // someobjectという対象物に対してsomegroupのアクセスは許可する。$acl->someobject->somepart->deny('someperson'); // someobjectの一部であるsomepartに対してsomepersonのアクセスを拒否する)。権限は基本的には許可(allow)と拒否(deny)だけど、対象物+アクションに対して権限を設定することもできる($acl->someobject->deny('somegroup', 'hit'); // 叩いちゃダメ)。で、実際にアクセス権があるかどうかはvalidメソッドでテストする(if ($acl->someobject->valid('someperson') { // アクセス権がある } )。

ZFormは進展なしな模様。っつーかいまだに命名規則すらZend_Formになってないし。

Zend_Json_Serverとかいうものがincubatorに入っているな。っつーかこれは、Zend_Serverってのが増えた中の実装の一つか。XMLRPCサーバーとかSOAPサーバーとかを書くためのZend_Serverってのができて、その実装の一つとしてJSONサーバーがあるのね。コードを読んだ限りでは、$_REQUEST['method']で実行したいメソッド名を渡し、$_REQUEST内からメソッド引数を抽出し、サーバーに登録されているメソッドだったらそのメソッド+引数を実行。結果はapplication/jsonとして出力するって感じらしい。こういう仕様のJSONサーバーって、どこかで規格化されていたりするのかな? RESTサーバーの返しはXMLになっている模様。SOAPとXMLRPCはまあちゃんと規格があるからコードは読まなくていいだろう。

Zend_Sessionもincubatorに入っている。ネームスペースの導入、バリデーションの共通インターフェース、時間もしくは回数による有効期限設定あたりが主な拡張かな。セッションハンドラーを拡張するインターフェースは用意されているけれども、まだハンドラーの実装はない模様。有効期限については、1回有効期限のセッションを利用すれば、RoRとかのFlashみたいな使い方ができるな。

ってあたりを押さえておけば、0.1.4から0.2.0へのアップデートに関してはだいたい大丈夫かな? その他の修正やアップデートに関しては、実際に使ってみた何かあったらチェックしよう。

Published At2006-11-21 00:00Updated At2019-12-31 00:03

日記
自転車通勤復路Edit

かかった時間1:14
自転車に乗っていた時間1:04
走行距離25.79km
平均時速24.1km/h
最高時速45.5km/h
総走行距離1899.6km
トレーニング効果3.6
平均心拍数149
最大心拍数181
消費カロリー990kcal

Published At2006-11-21 00:00Updated At2006-11-21 00:00

日記
自転車通勤往路Edit

かかった時間1:36
自転車に乗っていた時間1:22
走行距離34.29km
平均時速21.4km/h
最高時速49.7km/h
総走行距離1933.9km
トレーニング効果3.4
平均心拍数145
最大心拍数181
消費カロリー1019kcal

今日は昼から麻布で打ち合わせだったんで、心拍計だけ外してサイコンは着けたまま自転車で移動してしまった。んで、サイコンのデータ分は麻布までの往復が追加されてしまっている。心拍系の方は往路のみのデータ。ちなみに渋谷駅前から麻布十番まで自転車でだいたい20分くらいだった。行きは六本木通りから、帰りは明治通りを通ってきた。

Published At2006-11-22 00:00Updated At2006-11-22 00:00

日記
自転車通勤復路Edit

かかった時間1:26
自転車に乗っていた時間1:14
走行距離25.80km
平均時速21.0km/h
最高時速37.3km/h
総走行距離1959.7km
トレーニング効果2.6
平均心拍数135
最大心拍数170
消費カロリー975kcal

Published At2006-11-22 00:00Updated At2006-11-22 00:00

日記
今日はバイクEdit

しばらくバイクに乗ってなかったんで、今日はバイク。寒くなってきたんで、しばらく間が空くとエンジンのかかりが悪いな。

そういや今日も麻布方面に行ってきたんだけど、自転車よりもバイクの方が微妙に時間がかかることが判明。このあたりの道路の混み具合なら、5km以内だったら交通手段としては自転車の方が上か。

そういやそろそろジーパンだと腿のあたりの冷たさがかなり厳しくなりつつあるな。上着とグローブは冬でも耐えられるものを着ているけど、そろそろ下も何か考える必要があるかな。寒い日はレインウェアの下とかを着ておいた方がいいのかな?

Published At2006-11-24 00:00Updated At2006-11-24 00:00