2011-12-05
_ Rails3 と MySQL な環境で Unicode の絵文字を使う
絵文字が Unicode 6 から収録されて iPhone などから入力された絵文字なんかをデータベースに登録することも可能になった.Rails のアプリケーションを作成して,ローカルでちょっと開発するときは SQLite を利用していて,この絵文字についても特に問題なくデータベースに読み書きできていたのだけど,別のサーバーで MySQL で利用しようとしたら,絵文字以降の文字列が消えてしまう,という状態になった.
利用していた MySQL のバージョンは 5.1.絵文字は UTF-8 で 4 バイトで表されているけど,MySQL 5.1 での UTF-8 は 1 文字を 3 バイトまでをサポートしているため,絵文字を利用した場合はうまく扱ってもらえない.MySQL 5.5 からは 4 バイトまでサポートが可能な utf8mb4 というのが character set に追加されていて,こちらを利用するといいみたい.
というわけで MySQL を 5.5 にあげて試してみようとしたけど,mysql2 では utf8mb4 は対応していない encoding のようで利用することができないみたい.テーブルやカラムを utf8mb4 にしただけでは,クライアント側が utf8 ととして送信するためか,データベースに登録される文字は ???? と化けてしまう.ひとまず,登録できる形にはしてみたいなぁ,ということで,mysql2 のソースコードを見てみると,文字コードまわりの設定値を定義している部分があったので,とりあえずここに値をつっこんでみたらなんとかなりそうかな,という感じでコードを追加してみた.
diff --git a/lib/mysql2/client.rb b/lib/mysql2/client.rb index 20ed442..8497ca0 100644 --- a/lib/mysql2/client.rb +++ b/lib/mysql2/client.rb @@ -87,6 +87,7 @@ module Mysql2 "ucs2" => Encoding::UTF_16BE, "ujis" => Encoding::EucJP_ms, "utf8" => Encoding::UTF_8, + "utf8mb4" => Encoding::UTF_8, } MYSQL_CHARSET_MAP = { @@ -134,6 +135,7 @@ module Mysql2 42 => {:name => "latin7", :collation => "latin7_general_cs"}, 43 => {:name => "macce", :collation => "macce_bin"}, 44 => {:name => "cp1250", :collation => "cp1250_croatian_ci"}, + 45 => {:name => "utf8mb4", :collation => "utf8mb4_general_ci"}, 47 => {:name => "latin1", :collation => "latin1_bin"}, 48 => {:name => "latin1", :collation => "latin1_general_ci"}, 49 => {:name => "latin1", :collation => "latin1_general_cs"},
これで config/database.yml の encoding を utf8mb4 を指定できるようになった.console からのデータベースへの入出力でも絵文字は化けずに表示できるようになったし,iPhone から POST で入力した絵文字もちゃんとデータベースに入出力できるようになった.
MySQL を利用する場合にのみ必要になるケースだし,SQLite でも問題なかったように,他のデータベースエンジンではたぶんそのまま UTF-8 で特に問題はないんだろうなぁ.ローカルでちょっと動かすには SQLite ですませてしまうし,Heroku は PostgreSQL だし,そもそも最近は MongoDB とか使ってることのほうが多かったりで,あまり MySQL にふれる機会がないんだけど,ちょっと勉強になった.
ちなみに,データベースの default character set を utf8mb4 にすると Rails の場合,migration 用のテーブルの index の桁数が 1 文字 4 バイトで計算されてエラーとなるのでご注意を.(あれ,Rails 関係するのここくらいか…
2011-12-11
_ Mashup Awards 7 の授賞式に参加してきた
@touchRL と一緒に,Team touchRL 名義で Mashup Awards 7 に応募した Check!ATND x touch!ATND が,リクルート ATND 賞を受賞しました.
ということで,授賞式に参加するため上京.会場にはただのステージではなくてリングが用意されていたりと,なかなかおもしろい感じに.最優秀ノミネート作品の5つの作品のプレゼン後,各賞の発表へ.さすが最後に残った 5 作品,どれもすばらしいですね.受賞のためのリングへは @touchRL にのぼってもらいました.
国内でもやっと NFC が利用できる Android 端末が出てきたので,いよいよこれから国内でも NFC が盛り上がってくるんじゃないかと思っています.懇親会では,Evernote Developer Competition で最優秀賞をとって,Mashup Awards 7 でも Mashup Innovation on Android 賞を受賞した touchanote の方と話す機会もあって,これから NFC はきっと盛り上がってくるから,がんばろうみたいな話もしたりしました.とはいうものの,英語でのコミュニケーションがダメダメだったので,これはなんとかしないとだなぁ.もっと話すことができたら,より楽しかっただろうしね.
2011-12-12
_ 東京滞在
せっかく上京してきたので,1 泊して少し観光していくことにした.午前中は浅草,それからスカイツリーへ.ベタに雷門を見て浅草寺まで行ってから,以前,お土産でもらっておいしかったやげん堀の七味唐辛子を購入.その場で調合してくれるんですね.ここの七味唐辛子の香りが結構好み.スカイツリーは近くまで歩いていって,デカさを確認したくらい.その後,上野の方に行ってみたり,ついでだからと国会議事堂の前とか通ってみたり.
月曜だったのでいろいろ休みなところが多かったりしたけど,とりあえず観光っぽい感じなところはそれなりに見て回れたかな.平日でも人が多かったので,休日はきっとこれ以上にたくさんの人がいてきっと疲れ果ててしまうだろうなぁ.
2011-12-31
_ 2011年振り返り
2011年も最後の日を迎えたということで,日記を読み返しながら,今年 1 年を振り返ってみる.
- 1 月
- まだ年初は自宅サーバーにてこのサイトも運用していたのか.CPU ファンが異音を出し始めたので交換というところから.このときすでに VPS に移行しようかどうかは迷ってたんだな.20 年飼っていた犬も老衰で逝ってしまったのは悲しかったなぁ.今でも犬小屋はそのまま残っていて,実家に帰って犬が迎えにきてくれないことにようやく慣れてきた感じ.
- 2 月
- 今年作ったもののひとつめ,「Google Reader Shared Items Channel」か.今は Google Reader から共有アイテムがなくなってしまったので,サービス自体を止めてしまったけど,GAE/J を使って何か作ってみたかったので,それなりによい経験になったな.
- 3 月
- なんと,散髪に行ってドメイン更新したことしか書いてない…
- 4 月
- 下呂温泉に行ってのんびりしたり,月末には iPad2 を朝から並んで入手したりしてたのか.思ったよりあっさり買えてしまった印象が.次のモデルを買うことになる場合は,今度は 3G モデルをプリペイドで利用というのもありかもしれない.
- 5 月
- 比較的日記を書いた日数が多い月.Pogoplug を使い始めたのはこの時期からか.そして,はじめて J リーグをスタジアムで観戦したのもこの月.でもどちらかというと家でテレビ観戦してるほうが自分には向いてるような気がした.
- 6 月
- tDiary のプラグインを作ることに力をいれてた月間かな.毎年,どこかでこういう時期があるなぁ.この月はは検索プラグインや Picasa プラグインのアップデートを精力的にやってた.
- 7 月
- 年初に CPU ファンを交換したばかりだった自宅サーバーが電源断後,起動しなくなってしまった.替えのマシンもないので,このタイミングでさくらの VPS にお引っ越し.tDiary まわりでは image プラグインに手を入れてみたりしてたな.
- 8 月
- 引き続き image プラグインに手を入れつつ,VPS まわりの有効活用など模索してた感じかな.
- 9 月 - 10 月
- 日記はほとんど書いてない.この時期は,touchRL と一緒に Graph Hack Award に出すためのアプリを作ったりしてたかな.あとは Google Cloud Print 関連について Software Design に寄稿するために,初めての執筆作業とか.書いてないわりには,そこそこに精力的に活動はしていたみたい.
- 11 月
- 炊飯器の調子が悪くなっていたので買い替えてみたり.これの影響かどうかはわからないけど,ご飯がおいしくなって食べる量が増えたような気がするのは,果たして気のせいなのかどうなのか.
- 12 月
- Mashup Award 7 でリクルート ATND 賞を受賞.今年は年初から NFC 関連にからむことが多くて,その集大成ではないけど,今年 1 年の活動のまとめというか,成果みたいな感じになったのでよかったかな.
こうして振り返ってみると,今年も何かといろいろあった 1 年だったようで,中でも今年後半の雑誌に寄稿したり,賞をもらったりというのは,個人での活動の中ではこれまでになかった新しいことで,終わってみれば充実した 1 年だったように思う.けど,健康面をみると年末に 2 度ほど病院の世話になってしまったのは残念だったかな.
新しいことにふれて,そこからまた新しいことにつながることを感じられた 1 年.来年もまた何か新しいことを見つけて次なる何かに出会えることを楽しみにしようかな.
_ おがみや [どういうものか私にはよくわからないですが、なんかスゴイですね。 おめでとうございました!]