Archive for 5月, 2008

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

結構根が深くていやになったのだが、表題の問題。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ではまる

表題のウェブカメラがある。購入したのはずいぶん前だが、最近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に締め出された

 またやってしまった。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つを許可すれば良いらしいのだが。

Linuxでproxy

親玉側(Apacheでproxy)

<ifmodule mod_proxy.c>
ProxyRequests On
<proxy  *>
    Order deny,allow
    Deny from all
    Allow from 192.168.0.
</proxy>
ProxyVia Block
</ifmodule>

子分側(yumで使ったり)

環境変数に設定すればいいのだが、面倒なので下記のような感じで一括してprofile.dに書いておくと楽ちん。

vi /etc/profile.d/proxy.sh
export http_proxy = http://oyadama:80/
export HTTP_PROXY = http://oyadama:80/

で再度loginし直すと環境変数が有効になって使えるようになる。

手元環境でPROXYが必要なときには一瞬で設定できるしかなり便利だ。もっと活用していこう。

Fedora8 Network installトラブル

 Fedora8をDVDが使えない機体に、Fedora-8-i386-rescuecd.isoを焼いたCDからインストールしようとしたところ、インストール元のftp先を入力した後で下記のエラー。焼き損じ、ダウンロード失敗、ミラー失敗を考慮して、本家のSHA1チェックサムとダウンロードした物のSHA1の比較や、焼いたときのverifyをかけても駄目。

/usr/sbin/load_policy: error while loading shared libraries: /lib/libc.so.6: invalid ELF header

 調べたところ、こんなスレッドを発見した。曰く、”Even though you checked out the SHA1sum’s, it sounds like there may be a corrupt or missing file on the install media ?”とな。おいおい。

 しょうがないので上記ページに書いてある通り、boot.isoをダウンロードしてきて書き込み、そちらからインストールを行ったところ、無事インストールに成功した。

 お願いだからこういうバグは放置せんでほしいなぁ。ひとまずトラブルシュートメモ。

VMWareとPersonal firewallとの相性

 毎度毎度、VMWareとPersonal firewall製品との相性には泣かされる。bridgeとして設定したNICが、promiscuos modeで動作することと、(恐らく)Personal firewallが、自身の動作する宛先IP以外を宛先とするパケットを拒否してしまうからなのだが、理由がわかっても回避方法がないことが多い。

 今使っているのは、ESET Smart Security。その昔、NOD32があまり知られていなかった頃に価格.comでの問題を見つけて中の人に連絡したのが懐かしいが、そのNOD32を出しているところのFirewall込み製品だ。これまでは全体的に悪くないなと思って使っていたが、今回VMを外から叩く必要が出てきて問題が発覚した。これも駄目っぽい。 昔、NOD32+outpost(だったかSygate Personal firewallだったかどちらか)との組み合わせだとこの問題は回避できたように記憶している。やはり餅は餅屋、Firewall製品はFirewall製品屋で、ということなのだろうか。

 ひとまず今回はfirewall設定を切ることで対処した。やれやれ・・・。

参考サイト:Firewallと森で遊ぼう このサイト、更新されていないのが本当に惜しい。

死刑制度と街の声

 10:00~の文化放送の特別報道スペシャル「死刑執行」を聞く。死刑執行する刑務官側の思いは興味深い。

 気になったのは途中で挟まった街の声。「死刑に賛成ですか反対ですか」という問いかけに対して、ああも気軽に賛成だ反対だ、何で言えるのだろうか。

 思うところは色々あるが、書いてもきりがないのと不特定多数と議論してもはじまらないので、こんな動画で締めておこう。

PuTTYでhome/endキーが効かない・・

 前まで使えていた気がするのだが、いつからかPuTTY経由でLinux(Fedora8)に繋ぐとhome/endキーが使えず、~ という文字に置換されて表示されるようになっていた。

 前置きはさておき、これを直すには、~/.bash_profileの適当な行に、TERM環境変数を書いてやればいいようだ。

export TERM=linux

 ちょっと困ったが大変困るわけでもないので放置していたが、これで快適になる。

symfonyレイアウトの崩れ

またもやsymfonyネタ。

symfonyのadmin generatorは便利だが、どうもレイアウトの崩れが気になって仕方がない。例えば下記のような崩れが見受けられる。

previous previous2

左はadminのチェックボックスだけ右に3pxほどずれているし、右は項目をまとめるborderがずれている。どうしても気になって仕方がなかったのでCSSを直すことにした。直すためのcssは下記のような感じ。これをmain.cssあたりで読んでやればいい。

* html #sf_admin_container div.form-row
{
  zoom: 100%;
}

#sf_admin_container div.form-row:after
{
  content: " "; clear: both; height: 0; display: block; visibility: hidden;  
}

#sf_admin_container div.form-row .content
{
  padding-left: 0px;
  float: left;
}

結果、下記のようになり、きれいに表示されるようになる。

after after2

 やっていることは簡単。どうもきちんとチェックボックスが並ばないのは、label要素の右にdivがあってその中の要素、がどうもずれるらしい。力業だが、label要素の右にくるdivもfloat:leftで積んでしまえばこのズレは正常に処理されるようになる。これがcssの3つめのブロックでの指定。

 だがこれだと、上で項目ごとのborderがずれると指摘した問題、これがさらにひどくなって全部の項目で中身がborderから外れる。これはdivの中身がfloatしかないと、divの範囲の外に中身がはみ出るよ、という問題で割とよく知られている。 どう対処するかというと、clearfixとか言われている方法をとる。今回やってるのはどうせ内部用でしか使わない部分なので(admin generatorで外部向けアプリはつくらんよね?)、validでないことはあまり気にしない。(cssの1つめのブロックにあるzoomはIE用、後ろのafterはその他ちゃんとcssを解釈するブラウザ用。情報源はこの辺)。これできちんと表示された。

 これだけでも開発のモチベーションがあがるかもしれない。誰も困っていないのか、ウェブ上では同じような情報はすぐには見あたらなかった。もし既知の問題だったり似たようなレポートがあればコメントで教えていただければ幸い。

postfixを送信専用に@Fedora8

そろそろFedora9が出るらしいということで、Fedora8からFedora9へのupgrade方法を調べつつ、今日はFedora8でのpostfixインストール。色々組み合わせてバーチャルホストを構成するというネタは後日やるとして今回は送信専用。スクリプト側からバルク送信することも考えて、遅延送信処理も含める。

■インストール

# yum install postfix

■標準MTAの変更

# alternatives --config mta
There are 2 programs which provide 'mta'.   Selection    Command
-----------------------------------------------
*+1           /usr/sbin/sendmail.sendmail
  2           /usr/sbin/sendmail.postfix 
Enter to keep the current selection[+], or type selection number: 2

■sendmailの自動起動を止める

# chkconfig sendmail off

■postfixの自動起動を設定

# chkconfig postfix on
■smtp/relayで動かないように設定
# vi /etc/postfix/master.cf
#smtp      unix  -       -       n       -       -       smtp
# When relaying mail as backup MX, disable fallback_relay to avoid MX loops
#relay     unix  -       -       n       -       -       smtp

■自ホストのFQDN設定と遅延送信設定

# vi /etc/postfix/main.cf
myhostname = mail.example.com
defer_transports = smtp (追記)

■設定確認

# service postfix check

■sendmailサービス停止

# service sendmail stop

■postfixサービス開始

# service postfix start

追記(5/2):どうもまだこれだけだと遅延送信の確認が出来ていない。後で調べて追記する。

追記(5/5):smtp/relayを殺したらうまくいくはずないよなJK、というわけでその設定はしてはイケナイ。これで遅延送信ができるようになるので、下記の設定を追加。

■sendmail -qで適宜キューの中身を送信

# vi /etc/cron.d/mailqueueflush
* * * * * /usr/sbin/sendmail.postfix -q

間隔は環境ごとに必要十分な値を検討したほうが良いし、出来れば必要な送信処理が終わるごとに呼んだ方が良いように思う。それと、この設定でどれくらいのパフォーマンス変化があるかは検討を要するところなので、仕事なら事前に評価する必要がある。