2008-11-26

CLSQL + MySQL でUTF-8を使うには

いくつか方法はあるみたい。ググったところ

1. libmysqlclient.so を作成するときに --with-charset=binary とかして変換が起きないようにする。
2. my.cnf の [mysqld] に skip-character-set-client-handshake と書いてクライアント側は常にサーバの文字コードに従うようにする。
3. mysql_set_character_set 関数を呼んで明示的にセットする。

1. はライブラリを再構築しなきゃいけないのでどう考えても面倒。
2. はサーバの設定変更になるので既存の動作システムへの影響を考えるとやだ。
3. でいってみる。

コードは次のようになる。
SBCL on OS Xで確認。ClozureCLではうまく動作しなかった。uffiの文字変換まわりの問題か?
my.cnf [mysqld] default-character-set = utf8 などUTF-8をデフォルトにする設定、SLIME側のUTF-8利用設定は済ましてある事前提だよ。
;; clsql-mysql-cs.lisp
;;
;; MySQL 5.0 以降でlibmysqlclient側のcharsetを
;; 変更するための関数 clsql:database-set-character-set
;; を追加定義する。
;;
;; (asdf:operate 'asdf:load-op :clsql-mysql)
;; した後にこのファイルをロードすればよい。
;;
;; (clsql:connect '("localhost" "test" "test" "") :database-type :mysql)
;; などでデータベースと接続した後で、
;; (clsql:database-set-character-set * "utf8") ;; * はデータベースオブジェクト
;; とすることで mysql_set_character_set を呼び出せます。

(in-package :mysql)

(declaim (inline mysql-set-character-set))
(uffi:def-function "mysql_set_character_set"
((mysql (* mysql-mysql))
(csname :cstring))
:module "mysql"
:returning :int)


(in-package :clsql)
(export 'database-set-character-set)

(defmethod database-set-character-set ((database clsql-mysql:mysql-database) csname)
(uffi:with-cstring (host-csname csname)
(mysql::mysql-set-character-set (clsql-mysql::database-mysql-ptr database)
host-csname)))



参考:
遠い海: mysqlとclsqlで文字化け その2

2008-11-16

PS3を売ってXbox360を手に入れた

ソフトも買って少しおつりがきた。満足している。

ダッシュボードというのがとてもよくできていて感心した。
PS3でいうところのXMBメニュー的なものなんだけど、ゲーム画面にオーバラップして表示されるので、ゲーム中のメニューと一体化している。PS3でもXMBがゲーム中に表示されることがよくあったけど、明らかにとってつけたようで変だったし。メタルギアオンラインで「サーバの接続に失敗しました。」とかでるあれ。このあとさらにMGOのエラーダイアログが出たりとなんかちぐはぐだった。

あと、更新で再起動しないのもいい。内部ではしてるのかな。でも一瞬で制御が自分に戻ってくる。システムの更新もゲームの更新もどっちもダッシュボードがぴょこっと出てきて更新が終わるとまたゲームに戻れる。

これ、PS3だと更新って単なる悪夢なんだよな。絶対に電源を切らないでくださいとか出て、かなりの時間またされたあげくに再起動してしかも再起動前にやってた作業をPS3はすっかり忘れてるもんだから人間様がもう一度ゲームを起動してやらねばならなかったり。
プログラマ的視点で言うと、OSのアーキテクチャがダサイというのかな。そのうち直るとは思うけど、もう手放してしまったからいいや。
Xboxのほうは、さすがOS作ってる会社のゲーム機OSというところかな。

UIデザインはPS3のほうがおしゃれかなあ。ぱっとみ。
でもこれもNXEというやつが19日に来てすっかり様変わりするもよう。
楽しみだ。期待せずに待とう。

Xboxと一緒にテストドライブアンリミテッドってやつを買ったんだけど、すごくいいゲームだった。
ハワイのオアフ島を再現してその中を車で走り回る、ただそれだけのゲーム。なのでそれだけだと微妙なんだけどもね。ハワイの再現度もそこそこ。いっこいっこのお店まで再現されてるわけではないんで、記憶をよびさますほどの感動はなくちとがっかり。「雰囲気」をほぼ再現してる、というのが妥当か。

これがオンラインになると、近くを走ってる他のゲーマーが画面に出てきて一緒に走れる。常時マッチングし続ける仕組みだそうで、画面にゲーマーの名前が表示されたりすぐ近くを走ったりぶつかったりそうこうするうち交差点を別の方向に曲がっていつのまにかいなくなってたり。この微妙な距離感。
つっかかってくるというのかぶつかってきて粘着するキチガイもいるよ。ネットの時代、キチをスルーできる能力も大事になるんだろうな。方向キーを押してGPS画面に切り替えればマッチングがキャンセルされるのでうざいやつはさくっとあぼーんできるよ。

でもってバイクを手に入れて流して走ってたら、ウィリーしたままぶち抜かれたんでそいつに必死にくっついていったよ。ウィリーできるんだとそれみて気づいた。
その見知らぬ相手も付き合いでだろうけど、抜きつ抜かれつウィリーしたりジャックナイフしたり、NPCの車をぎりぎりかわしながら一緒に高速走って、楽しかったなあ。
リアル人生のほうで友達とツーリングいってたときを思い出したよ。
しかも事故っても痛くないから無茶ドライブしまくり。一般車を大破させた後は警察につかまらないよう逃げるってのも、ちょびっと背徳感があり小市民の心をくすぐる。
Kawasakiのバイクショップはあるみたいだけど、SUZUKIが無さそうなのが残念。

とかそういうモータースポーツって楽しいなあ、というのをゲームで再現したのがテストドライブアンリミテッドでした。
リアル友達が車orバイク好きでゲームもやるってんだったら、これ一緒に遊ばないと人生損だよ。ほんと。常夏の島のどこまでもまっすぐのびる高速を高級マシンでぶっとばすべきだ。