Archive for 5月, 2008

symfony(というかpropel)でのmysql関数処理バグ

Posted by ゆのじ on 5月 22nd, 2008

結構根が深くていやになったのだが、表題の問題。symfonyの(というかPropelの問題なので以降Propelの)Criteriaの記述で、集約関数を書きたくて調べていたのだが、addSelectColumnという関数で下記のように定義してやればいいっぽい。

$c->addSelectColumn('SUM('.TablePeer::TARGET_COLUMN.')');

このとき、これだけなら問題はあるもののひとまずエラーにはならない(後述)。だが、たとえば時刻の差分(秒)の合計をとりたい場合、SUM(UNIX_TIMESTAMP(col1) – UNIX_TIMESTAMP(col2))のようにしたくなる。それを書いてみたのが下記。

$c->addSelectColumn('SUM(UNIX_TIMESTAMP('.TablePeer::FINISHED_AT.')-'.
  
                        'UNIX_TIMESTAMP('.TablePeer::STARTED_AT.'))');

これが見事に刺さる。

調べてみると、見事にPropelのBUGで、#425 (Bug in BasePeer::createSelectSql) – Propel – TracによればPropel本体としては既にfixedというステータス。これがsymfony側には反映されていなくて刺さるということのようだ。回避策は今のところこのTracに記述されているworkaroundをそのまま実行するしかない。念のため書き写しておくとこうなる。

577 $selectClause[] = $columnName; // the full column name: e.g. MAX(books.price)
578
579 $parenPos = strrpos($columnName, '(');
580 $dotPos = strpos($columnName, '.', ($parenPos !== false) ? $parenPos : 0);

下線部が追加部分。strRposにするのと、その下の行を追加する。これでひとまずエラーはなくなる。

エラーは無くなるのだが、addSelectColumnを使ったクエリ、明示的にクリアしていないにもかかわらず選択カラムがリセットされてしまって、addSelectColumnで追加したカラムのみになってしまうという問題がある。これが仕様なのかはともかく、doSelectしたときにhydrateできなくて刺さったり、いろいろと問題がある。この辺の本当の意味での正しいクエリの投げ方、どうすればいいんだろう?

追記:とりあえずメソッドを眺めていたら、TablePeer::addSelectColumns(Criteria $c)というメソッドを見つけた。とりあえず、addSelectColumnの先頭でaddSelectColumns($c)とかやってやると一通り追加される模様。

logicool quickcam for notebooks proではまる

Posted by ゆのじ on 5月 17th, 2008

表題のウェブカメラがある。購入したのはずいぶん前だが、最近OSを入れ直したことと、AR関連で使いたくなったのでドライバを入れ直すことにした。早速サイトからドライバ+付属ソフト一式を落としてきてインストール、、、できない。具体的には、USBポートにデバイスを挿入してください、という画面から先に進まない(別ウインドウで新しいデバイスのインストール画面が出るが、連動して動かない感じ)。ググっても何も情報が出てこない。おいおい、どうしたことだこれは。

なんで私がこいつらのデバグをしてやらにゃいかんのだ、と愚痴りながらdrivers\x32\*のinfファイルをあさってみると、該当するVID(Vender ID)、PID(Product ID)の情報が一切書いていない。Quickcam for notebooks ProのVID/PIDは046D/08C3なのだが、ファイル中にはその行がない。これではドライバがはいるわけがない。

そしてもう一度この該当するVID/PIDでググってみると、やっとこさヒントにたどり着くことができた。それがここ「Can’t install v11.5 driver for ‘Quickcam for Notebooks Pro’ (XP)」。曰く、

I’m hoping that you will read my personal welcome thread as we progress. Thank you.

P/N: 861209
M/N: V-UAR38
USB\VID_046D&PID_08C3 ; Adams – Notebooks Pro (Silver)
QuickCam 9.x/10.x/11.0 (and unofficially QuickCam 11.1)

The latest drivers for your camera can be found in QuickCam 11.1.0.2030.

After installing this version of QuickCam, you can upgrade the application software to QuickCam 11.5.0.1169.

This issue has already been reported to Logitech.

Thanks.

おいおい。同じファイルに入っている製品群のなかでは割と新しめの製品なのにドライバを入れ忘れるってどういうことだ。

そしてここまで分かってから古い版のQuickCamをダウンロードするのがまた大変。普通に検索しても見あたらなかったし、公式サイトから落とすのはちょっと無理っぽい。ということでgoogleに聞くもののバージョン番号では何も出てこない。最新版がqc1150.exeというバージョン番号だからとqc1110.exeでググってやっとこさそれっぽいアーカイブを公式サイトではないところで発見。電子署名がLogitech Inc.であることを確認してやっと入手完了。

これ、通常のユーザにはどうやってトラブルシュートさせるつもりなんだろう。もっとちゃんとテストしてからリリースしてほしいぞ。マスプロダクトで個別対応がかなり厳しいものなんだから。

またThinkPadに締め出された

Posted by ゆのじ on 5月 14th, 2008

 またやってしまった。ThinkPadにパーソナルファイアウォール入りの製品をインストールしたあと、ローカルポートの通信を許可せずに再起動。これをやるとClient Securityに締め出されてしまう。原因は、前にも散々調べた結果、おそらく(というのは起動時のシーケンスのために裏側で何かできないため、外形から推測するしかない)127.0.0.1同士の通信で、エンベデッドセキュリティチップ関連のソフトとClient Securityのログインウインドウアプリが通信していて、それをパーソナルファイアウォールがブロックしてしまうからだと思う。

 これは、HDDをはずしてどうこうする、というようなアグレッシブな方法を除くとほとんど対処法がなくて、そのまま放置して待つしかない。寝て起きるとタイムアウトするらしく、通常のログインウインドウが出てきてくれる。このタイムアウト時間が実際のところどれだけかはこれまでぜんぜん知らなかったが、ちょっと調べてみると Client Security バージョン5.4 インストールガイドなる資料にあたった。
 この資料にも、今回のようなケースでタイムアウトが何時間なのかについては触れられていない。だが、タイムアウトしているということはこれまでの体験的にわかっていて、この中の下記の記述を見る限りは、おそらく4.7時間かそれに若干追加した程度なのだろうと推測する。

Atmel TPMシステムでは、ユーザー・パスフレーズと管理者パスワードを区別していません。IBMエンベデッド・セキュリティー・サブシステムを使用する認証は、いずれも同じポリシーに従っています。最大タイムアウトは4.7時間です。Atmel TPMシステムは、4.7時間を越えて遅延することはありません。

やらかしたのが今から2時間程度前。4.7時間=4時間42分までにはまだまだ遠い。

自戒を込めてメモ。

翌日追記:がーん、ぜんぜんタイムアウトしない。しかもここ(T60とZoneAlarm)の情報によると5分程度でファイアウォールがあって使えない旨のエラーメッセージが出るらしいが、ぜんぜんでなかったぞ…。結局再度入れなおし中。うちのこのポストは間違っている虞がある。

ひとまず、うちのThinkPad T60(262325I)は、ほかにもATIのCCC(Catalyst Control Center)もローカル間で通信するし、127.0.0.1:* <-> 127.0.0.1:*の通信は無条件に許可しておいてもいいのかもしれない。今回の問題は、Windows NT Loginとtvttcsdの2つを許可すれば良いらしいのだが。