PostgreSQL8.3系への移行は悩み多き道

PostgreSQLの7.4系から一気に8.3系に移行すると大変なことになると知った。

例えばこんなテーブルとデータを用意する。

$ cat ./test_db.sql
CREATE TABLE test_table (
datetime timestamp without time zone NOT NULL DEFAULT '2008-01-01 00:00:00'
);
INSERT INTO test_table (datetime) VALUES ('2008-06-30 01:23:45');

これを7.4系(5432ポートで起動)と8.3系(5433ポートで起動)のPostgreSQLに流し込む。

$ psql -Upostgres -p 5433 -f ./test_db.sql db_test
$ psql -Upostgres -p 5432 -f ./test_db.sql db_test

何が問題かというと、例えば次のようなSQLを発行した場合

$ psql -Upostgres -p 5432 -c "SELECT SUBSTR(datetime, 1, 4) FROM test_table"  db_test
 substr
--------
 2008
(1 row)

7.4系ではSUBSTRのような文字列型データを扱う関数を利用した場合、値が自動的にキャストされていたのだが、

psql -Upostgres -p 5433 -c "SELECT SUBSTR(datetime, 1, 4) FROM test_table"  db_test
ERROR:  function substr(timestamp without time zone, integer, integer) does not exist at character 8
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
STATEMENT:  SELECT substr(datetime, 1, 4) FROM test_table
ERROR:  function substr(timestamp without time zone, integer, integer) does not exist at character 8
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

8.3系ではパフォーマンスを稼ぐためか、この自動キャストがなくなっている。もちろん

$ psql -Upostgres -p 5433 -c "SELECT SUBSTR(datetime::text, 1, 4) FROM test_table"  db_test
 substr
--------
 2008
(1 row)

明示的にキャストすれば問題ないのだが、移行する全てのアプリケーションのSQLをチェックしなおす必要がある。他にも、日付のカラムをLIKE検索している場合などにも同じようなことになる。

$ psql -Upostgres -p 5433 -c "SELECT *  FROM test_table WHERE datetime LIKE '%0%'"  db_test
ERROR:  operator does not exist: timestamp without time zone ~~ unknown at character 42
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
STATEMENT:  SELECT *  FROM test_table WHERE datetime LIKE '%0%'
ERROR:  operator does not exist: timestamp without time zone ~~ unknown at character 42
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
$ psql -Upostgres -p 5433 -c "SELECT *  FROM test_table WHERE datetime::text LIKE '%0%'"  db_test
      datetime
---------------------
 2008-06-30 01:23:45
(1 row)

たしかに、型を正しく理解してSQLを書くのが大事なわけだが、今さらこの挙動は困る。

Popularity: 5% [?]

ゾンビーノ

“ゾンビーノ デラックス版” (アンドリュー・カリー)

なんて素晴らしい映画なんだろう。

序盤のストーリーはこんな感じ。宇宙からの隕石かなにかの影響で、人が死んだらゾンビになってしまう社会がやってくる。ゾンビと人間の熾烈な戦争は、最終的には人工的にゾンビを無害化する装置を開発した人間側が勝利し、世界に再び平和が訪れる。やがて、郊外に住む中流の白人社会には家庭労働を無害化したゾンビに担わせるのが流行する。

死体がゾンビになるという、古典的かつゾンビ映画には絶対に必要な、それでいて絶対にあり得ないこの設定については、あえて50年代SFの陳腐な映像を使い回すことで曖昧にさらっと流されている。だが、ストーリーのメインはここにはないのだから、それで全然問題はない。やがて、学校のシーンになり、本編が始まると、これが50年代のアメリカ郊外を舞台にした映画だということがわかる。人々は学校でゾンビとの戦いの歴史や、ゾンビの恐怖に備えておくことの重要性をプロパガンダ映画により教育されている。あげくの果てには小学校の学外授業でゾンビに見立てた標的をライフルで撃つ訓練まで行われている。

最初に気づかされるのは、ここでの人間とゾンビの関係は、自由のない社会でひたすら恐怖政治の下で暮らしている共産主義社会の人々をゾンビのようなものと見なしていた時代(それが終わったとは言い切れないと思うが、まあそれは別として)のパロディになっていることだ。

主人公の少年ティミーが家に帰ると、とうとううちでもゾンビを買ったとお母さんに告げられる。近所にゾンビのいない家はないし、みっともないというのが主な理由なのだが、大量消費社会の病の象徴としてショッピングモールを舞台としたオリジナルのゾンビへのオマージュとして、この大量消費社会的無駄遣いは至極正当なゾンビ映画の視点といえる。

ティミーはいじめられっこで友達もいない。そんな彼が、ふとしたことからゾンビと心を通わせていくようになる。そして、物語は動き始める。ネタバレにならないように詳細は省くが、ここでグッときたのは、郊外生活者の家事労働に従事するゾンビに、どこか見覚えがあることだ。ゾンビは人間と同じような仕事をしている。でも、家族の一員でもなければ、給料をもらっている労働者でもない。ティミーはゾンビの無害化を一手に請け負う巨大企業から学校に派遣されたセキュリティ担当に質問する。「ゾンビは生きてるの?」この質問は、別の意味に置き換えることができる。つまり、「ゾンビは人間なの?」。そう、われわれが郊外の無害化されたゾンビに見覚えがあるのは、ゾンビたちがやっていることは奴隷労働であり、その扱われ方も奴隷そのものだからだ。人間とゾンビの断絶は、人間と奴隷の断絶のパロディとなっている。

そこで、事件が起きる。その事件も、奴隷の身に降り掛かる無理解や冷酷さが引き起こした悲劇と捉えればなお一層ストーリーに引き込まれていくだろう。もちろん、人が死ねばゾンビになるという社会の大きな矛盾が、悲劇的であれ喜劇的であれ随所にちりばめられ、それでいて主人公の少年の心の成長と、いつしかそれに歩調を合わせて勇気ある人々の心の中にも大きな前進が成し遂げられるのも感動的だ。ビルドゥングロマン、50年代的価値観の崩壊といったテーマもきっちり描き込まれている。

一家に一人のゾンビの時代という、思いつきの冗談みたいな話が、ここまで感動できる物語になっているのには驚かされる。必見。

Popularity: 1% [?]

テリー・イーグルトン

“The Meaning of Life” (Terry Eagleton)

去年出たようだがまだ読んでいなかったのでメモ。

Popularity: 1% [?]

社内BTSへの回答

前の書き込みから4ヶ月経ってるな。

なんかさあ、社長までいちいちC.C.に入れて、俺が社内の開発規則に反する禁止事項をやっているとかさあ、犯罪者みたいな扱いでギャーギャー騒いでんのにさあ、こっちがまじめくさって答えてやりゃあ何ヶ月も放置してるってのはどういうわけよ。人のことをそこまで言い立てるのはさ、小学生ならまだいいよ。「せんせい、○○くんが〜」とか騒いでも、まあ餓鬼のやることだし。だけどさ、社会人ならさ、それは俺に対する評価にも繋がることだし、その評価っていうのは俺や俺の家族にも直結する問題になるわけ。だから、それなりの覚悟と取り組みでやらないんなら、はっきりいって迷惑とかいう次元じゃない、最低のハラスメントなんだよ。わかる?

わからねえだろうな。俺より長く生きててこの現状だもん。

まあ、いずれにせよもう新しいリリース用ファイルセットにはこのモジュールは組込み済みだから。いちいちコードを別にしても誰も管理できないでしょ。言い出しっぺのあんたもやらないし。あんたの適当な提案のおかげでレポジトリがどんだけぐちゃぐちゃになったと思ってんだよ。こないだざっと計算したら、回復するには最低9人月必要だよ。まったく呆れるね。あれから俺たちもちっとは賢くなったから、もうあんたの口先だけの提案じゃ動かないくらいの知恵は身につけたけどな。

あと、あんたのいうとおり例のJavaScriptライブラリのバージョン上げたら動かなくなったからそれも直したよ。知ってた?っつーかこれほんとに脆弱性あったの?あんた一度もエビデンス提出できなかったよな。俺が見つけてきたやつだと、全部攻撃は未然に防ぐことが出来るか、そもそもライブラリの問題じゃなかったんだが。

この案件だけに限らないけど、あれこれひっかきまわすだけで放置ばっかだと正直迷惑なんだよね。かんべんしてくれよ。俺、他人の足を引っ張って喜ぶバカなんてまさかこのちっちゃい会社の中には存在しないと思ってたけど、あんたを見てるとそうでもないみたいだな。

まあいいや。俺は技術者だし、動かないなら動くようにする、問題があるなら直すだけで、あんたみたいなつまらない政治的な動きだけやって自己満足してコードの1行も書けない偽物エンジニアの相手してる趣味もないから、この件はクローズにしといてやるよ。どうせ見ちゃいないだろうし、いいよな?

P.S. 明日も遅刻すんなよ。

Popularity: 1% [?]

シェルスクリプトに無知なもので

bashで文字列を変数に展開するのにsedを何回も呼ぶのはいかがなものかと思ったので、なんとからなんかといじっていたら、文字列を分解して変数に展開するのは配列を使ってこういう感じでやるのかと気づいた。

$ cat test.sh
#!/bin/bash
TESTDATA="1 2"
DATA=(`sed <<< $TESTDATA -e s/[^0-9]/\ /g`)
echo ${DATA[0]}
echo ${DATA[1]}

$ ./test.sh
1
2

そこで他にもないか調べていたら、sedの呼び方は

$ echo $AAA | sed -e s/3/aho/g

より

$ sed <<< $AAA -e s/3/aho/g

の方が早いらしい

ちょっと計ってみた。

#!/bin/sh
MAX=1000
COUNT=1
while [ $COUNT -le $MAX ];
do
        echo $COUNT | sed -e s/[0-9]/hoge/g
        COUNT=`expr $COUNT + 1`
done

これと

#!/bin/sh
MAX=1000
COUNT=1
while [ $COUNT -le $MAX ];
do
        sed <<< $COUNT -e s/[0-9]/hoge/g
        COUNT=`expr $COUNT + 1`
done

これで計測した結果。

MAXを1000にしたら
echo      :real 0m4.470s
ヒアドキュメント:real 0m3.679s

MAXを10000にしたら
echo      :real 0m43.403s
ヒアドキュメント:real 0m36.990s

とっても素直な結果だ。

Popularity: 1% [?]

CiscoのVPNクライアント(Linux版)でがっくり

CiscoのVPNクライアントを使わなければいけない環境でWindows用クライアントしかもらえず、それでもLinuxマシンをクライアントにしたい人用のメモ。

事前にこれだけは知っておかないといけない。

・SMP対応カーネルだとビルドできない
・パッチは出てるけど2.6.19以降のみ対応

上の条件に当てはまってしまった場合はカーネルの再構築やらなにやらいろいろ作業が発生するので大変に面倒くさい。VPNクライアントが動いたのに他に問題が起きたら嫌だから回避、という選択も間違っていない。というか、自分ではやらない。みなさんにもお勧めできない。

Popularity: 1% [?]

なんだこのスーパーキャッチは

このサイトより。

という、ゲータレードのCM。

Popularity: 1% [?]

少林寺の奥義書「少林武功医宗秘笈」が買える

少林寺の奥義書が販売されたというニュースを読んでさっそく探してみたら、中国のオークションサイトらしきところで見つかった

世界中のボンクラたちよ、今こそ立ち上がれ!

ケースもかっちょいい!

でも中国語がわかんないからどうやって買えばいいのかわからない。誰か教えて!

Popularity: 2% [?]

迷子の警察音楽隊、ファウンテン

迷子の警察音楽隊」鑑賞。記録までに。

甘やかされて育った中産階級としては、もっと悪趣味で露骨な文化間の衝突や葛藤、ブラックユーモアを期待するところだが、本作は上品で心温まるロードムービーになっている。いい映画、なんだろうけど。

ファウンテン」鑑賞。記録まで。

あー、あー、あー、俺は途中で寝なかった。マヤ文明の扱いは差別的といっていいくらいいい加減で、あとみんなでスペイン人のコスプレしてファンタジー乙女小説になりきって空想するお話。レイチェル・ワイズが面白い顔になっていたのが救いか。

かみさんの趣味に合わせて選んだのだが、どっちも当たりとはいえなかったな。やっぱり俺の選んだ「ゾンビーノ」(まだ観てない)に期待だ。

Popularity: 1% [?]

GreasemonkeyとWindowsでちょっと困った

Windows環境だと、Greasemonkeyのスクリプト編集がちゃんと動かないのでちょっと困っている。

Greasemonkeyで管理するスクリプトのパスは

C:\Documents and Settings\ユーザ名\Application Data\Mozilla\Firefox\Profiles\randomblahblahblah.default\gm_scripts

以下に保存されるのだが、「ユーザ名」が全角文字だとちゃんとパスを処理できなくて、スクリプトの編集などが出来ない。直接ここを開いてファイルを編集すると問題なく動作する。

ちょっと困っている。

Popularity: 1% [?]