2002-11-20
_ 鼻水と痰 (20:02)
風邪はずいぶん良くなったんだけど、鼻水と痰が治らない。といっても鼻水は、水っぱな系統じゃなくて、鼻の奥に粘性の強いかたまりの存在を常に感じていると言ったもので、痰はその無意識に飲み込んだ結果、といったもの。症状としては全然大したことないんだけど、すごく気になってとてもいらつく。のど飴なめてもトローチなめてものどスプレーかけても全然すっきりしないし。
_ CONNECT mailb.microsoft.com:25 (20:02)
そういや今日のWebサーバーログに「CONNECT mailb.microsoft.com:25」なんてあやしげなものがあったんで、何かと思って調べてみたら、セキュリティの甘い(っつーかセキュリティがない)フォームメールCGIを検索するツールのログだった模様。そういや今日来たSPAMには「This message has been sent using a trial-run version of the TSmtpRelayServer Delphi Component.」とか丸出しで書いてあってちょっと笑った。そんなコンポーネントがあるんだね。もしかしてRelay可能なsmtpサーバーをスキャンしてSPAMを出す支援をするコンポーネントじゃあるまいな。
2003-11-20
_ ちょっと一息 (13:50)
無呼吸で25メートルプールを2往復してからちょっと一息(暗喩)。でもまだめどが付いていないポイントがいくつも残ってますよ。っつーかあれだ、今さらC/C++でプログラムを書くのはじゃまくさいよ。Cでなんてちょっとしたユーティリティ程度しか書いたことがない(しかも学生時代にDOSで)から、ある程度長いプログラムをどのように書けばいいのか(スタイルの問題)がようわからんし、特に柔軟な構造を持つ定義みたいなものをどのように表現するのがC/C++的に妥当なのかとか、自分の書きたいコードをVC++のスケルトン内のどこに埋め込むのが妥当なのかとか、最終的には組み込み用途に使うんで(言語/OS)環境依存部分は出来るだけ排除(できるように)しておかないといけなかったり、まだほとんど実用例がないデバイスを使っているんでその部分があまりにも不明瞭(ドライバはあるんでAPIは叩けるけど、その先につなげるものが現時点ではアプリケーションプロトコルレベルで存在しない(デバイスプロトコルだけ決まっている))だったりとか、なんかもう「やればできる(プログラムのコンパイルは通るし、一応は実行も出来る)けど、そうやっていいのか(あとで後悔しないか。実環境でそのコード(というか載せている信号とそれに対する応答)が通るか)がさぱーりわからん」状態。しかも基本的にC/C++の関数/クラスライブラリの知識がないから、ちょっとしたことをやるにもいちいちヘルプを調べなきゃいけないし。そういや今週末は大王戦(年に一度の麻雀大会)だけど行ける可能性は今のところ70%(この2日で50%ほど上がった)。
2004-11-20
_ 買った (19:32)
昨日帰りがけに近所のケーズデンキに寄ったら、168000円の値札に取消線が引かれていたんで、いくらになるか聞いたら、消費税込み5年保証付きで138000円と言われて、130000円にならないか聞いてみたらあっさりOKが出たんで、そのまま買って持って帰ってきた。ネット上での最安値は125000円くらいまで下がっているみたいだけど(Amazonも還元を入れればそのくらいか)、音飛び不具合の話とかも出ているし、多少割高でも近所で買った方が安心かと思って。
で、ひとまず最初にはまったのはLANケーブル。付属のケーブルはクロスケーブルなのね。使えねー。っつーか最初LAN端子自体が壊れているのか疑っちゃったよ。最寄りのハブからはそこそこ離れているんで、収納をあさって昔部屋と部屋の間を結んでいた15mもののケーブルを見つけ出して接続。でも10mくらい余ってるけどなー。
次にはまったのは、スカパー!のチャンネル設定。最初スカパー!のチャンネル番号はC0000-XXXというのにあわせるのだと勘違いしていて一通り設定したところ、スカパー!連動の対象にほとんどのチャンネルが出てこない。ただ、いくつかのチャンネルは出てきているあたり、混乱は深まった。けど結局正解は、スカパー!のチャンネル設定はC1000-XXXなのね。で、ときどき(条件不明)ごく少数C0000-XXXじゃなきゃ動かないものも混ざっている模様。C1000-XXXに修正し、それで通らなかったものだけC0000-XXXに直したらちゃんと動くようになった。ちなみにうちのスカパー!チューナーはソニーDST-SD5だけど、チャンネルも電源もちゃんと連動した。ただしチャンネル連動はやたらと遅いなー。昔ソニースタイルのお試しコクーンで連動は使ったことがあるけど、あれよりもさらに遅い感じがした。
ちなみにRD-X2からの乗り換え者としては、基本性能にはものすごく満足。タイトルの削除とか、RD-X2では1タイトル消すのに30秒以上(1分以上かな?)かかってたからなー。X5ではふつうに1秒くらいで消えるのにものすごくほっとした。あと当たり前だけどiEPGは偉いなー。毎回情報を取得しにいくみたいで最初に番組ナビを開くときがちょっと重いけど、ふつうに地上波もスカパー!もまとめて番組表から予約でき、それがそのまま録画したデータのタイトルとか番組詳細に付加されるのはとても便利だ。
ただ、PCとの連携は思ったよりも不便だなー。っつーか、iEPG周りの仕様はものすごく変な実装になっているんだね。インターネット上の一般向けiEPGサイトに対するプロキシーとしてRD-X5が働き、もしもユーザーがiEPGリクエスト系のデータを開こうとしたら、それを強引にフックしてRD-X5への予約に変換をかけているのか。そんな妙な挙動のせいで、別ドメイン名のSSLを使ってリダイレクトをかけるようなiEPGサービスだとうまく動かない(回避策もありそうだけど、まだその辺真面目にやってない)。しかも東芝標準で提供しているiEPGサイトはスカパー!非対応だし、基本的なできも良くないみたいだし。
インターネットテレビガイドとかテレビ王国とかONTVとか使ってみた結果、結局ONTVを使ってみているんだけど、ONTVもログインするとSSLページのドメインが違うんで、パーソナライズされた番組表がRD-X5のプロキシー経由で使えてないんだよなー。あとONTVってスカパー!チャンネルはどっちにしろパーソナライズできないっぽいし。
っつーか、RD-X5本体が持っている番組表機能をそのままPCで使えるようにはできないのか? 俺的には番組ナビの機能で十分なんだけど、テレビの画面の解像度じゃ物足りないから、それをPCの解像度で使いたい。それだったらスカパー!のチャンネル設定とかもちゃんと反映させてくれるし。
ああ、そういやVirtualRDとVideoLAN Clientを使って、無線LAN(g)ごしのノートPCで録画データの再生もできた。けど、再生を開始する作業はテレビ側の画面を見ながらじゃないとできないし、再生中は本体で他のこともできなくなるみたいだし、あんまり使えないかもね。
とかまあ書き始めるといろいろあるけど、まだちょっとさわり始めた程度でわかっていないところもたくさんあるんで、もうちょっと使い込んでからちゃんとした感想を書こう。
2005-11-20
_ サイト情報の集計不具合を修正しました (20:48)
blogmapの不思議で指摘されていた、blogmapのサイト情報(サイト単位での被リンク情報)に不正なデータがあがってくる不具合を修正しました。
以前その手の集計処理を高速化しようとしたときにSQL文を腐らせていた(というか、理想的な状況でしか正しい結果が返らなくなっていた)のが原因でした。MySQLででかいテーブルをjoinするような処理で、正しくindexを使うようにするのは面倒くさいなー。
2006-11-20
_ PHPで安全なセッション管理を実現する方法に対する高木さんのコメントへのフォロー
[セキュリティ][乱数][暗号][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;
}


