Ruby 1.9で文字コードの自動判別を行う

Posted filed under Ruby.

 たまにRubyの話題でも。  Ruby 1.9で文字コードの自動判別をさせようとおもったら、意外に良いライブラリが見つからなくて苦労しました。 結局ICUをbindingした、charlock_holmesがちゃんと使えたので、メモです。  OSXで使う場合は、下記の様にしてICUライブラリをインストールします。Linuxでは適当なパッケージシステムを使ってインストールしてください。 curl -O http://download.icu-project.org/files/icu4c/4.8.1.1/icu4c-4_8_1_1-src.tgz tar xvzf icu4c-4_8_1_1-src.tgz cd icu/source ./runConfigureICU MacOSX –with-library-bits=64 –disable-samples –enable-static make sudo make install  charlock_holmes自体はgemで提供されています。 gem install charlock_holmes  文字列をUTF-8に変換する場合は、iconvと組み合わせて下記の様に書きます。 encode = CharlockHolmes::EncodingDetector.detect(str)[:encoding] str.encode(“UTF-8″, encode) 【変更 2012/1/6 19:37】 コメントを頂いたので、iconvからString#encodeに切り換えました。 【変更 2012/1/6 18:52】 ICUのバージョンを4.8.1.1に上げました。

iOSの開発用Provisioning fileを自動でダウンロードしてインストールするスクリプト

Posted filed under iPhone.

 iOSの開発をしている人なら、みんな面倒だと思っていることに、開発用Provisioning fileのダウンロードがあると思います。 端末を追加するごとに、変更してダウンロードして、インストールしなければいけないし。  すこしでも軽減しようということで、コマンド一発でAppleのDevCenterからダウンロードして、手元のOSXにインストールしてくれるスクリプトを書いてみました。 実行に先だってMechanizeが必要です。「sudo gem install mechanize」でインストールしてください。  https://gist.github.com/1198113 をダウンロードして、「ruby download_provisioning_file.rb ”プロビジョニング名” “Apple ID” “パスワード”」とすると、Provisioning fileがダウンロードされ、自動的にインストールされます。  Jenkinsなどで自動ビルドをしている場合には、かなり幸せになると思います。 いまJenkinsで、Titanium MobileのCI(継続的インテグレーション)の環境を構築していて、それっぽいのが見当たらないので作ってみました。  みんな、iPhoneのCIってどうやってるんだろう?この辺の話とか日本語ではあまり出てこないし、Keychain周りでちょっとはまりそうな感じがあるんだけど。

Geohashのアルゴリズム

Posted filed under Ruby.

Photo by Ludovico Cera  前回、最後にGeohashのエンコード・デコード方法を解説、とか書いたのですが、私が書く前にyuroyoroさんがブログで解説していました。しっかり解説されているので、ぜひ、そちらをご覧ください。  Geohashのミソは、座標を2進数にして、それを交互に並べる所にあります。そしてそれをBASE32でエンコードすることで、座標を文字列にして表現しています。  BASE32は、5ビットで1文字なので、Geohashの長さが奇数の場合は、経度の方がビットが短くなります。 (例: 5文字の場合 全25ビット 緯度が13ビット、経度が12ビット)  そのため、グリッドの大きさが、Geohashが奇数の場合は縦長、偶数の場合は横長になります。

DataMapper 0.9.*のassoc+countのバグが0.10.0-RC1で直ってる

Posted filed under Ruby.

DataMapper 0.9.*には、associationでcountを使うと余計なSQLが生成され非常に重くなる問題があるのですが、これが先日リリースされた、0.10.0-RC1で修正されていました。 参考: 「DataMapperに深刻な不具合 – Hello, world! – s21g」 直すまで結構長く掛かったけど、DataMapperを使っている人がホントにいるのか、不安になるなぁ。 ダウンロードは下記から http://github.com/datamapper/dm-core/downloads

EventMachineの速度が安定しない[解決]

Posted filed under PhotoShare.

Photo by the_amanda  PhotoShareをRailsから、EventMachineベースの自作フレームワークに全面書き換えをしているのですが、大体作り終わりベンチマークを取っていると、概ね1msで処理しているのに、時々、数百ms掛かることがありました。  初めはGCとか疑ったんですが、GC.disable実行しても状況変わらず。絞り込みをしていると、どうもEventMachineで詰まって居るっぽい。  EC2上で動かしていたので、手元のマシンで試したり、LinuxじゃなくてFreeBSDで試しても同じように詰まる。同じEventMachineを使っているThinを使って、ベンチマーク取ってみても、100回に1回ぐらい、やたらレスポンスが遅い時間があるのを確認できました。  ApacheBenchやhttperfは、平均値は取れるけど、個別のレスポンスタイムを出力する方法が見つからなかったので、JMeterに初挑戦。HTTPだけじゃなくて、いろいろなプロトコルに対応しているのがいいね。  色々試してみると、HTTPに限らずTCPソケットサーバを作ると発生するらしく、こんなコードでも、1000回に1,2回、接続した後1000ms近く待たされることがあることが分かりました。  MLとか探しても、同じような現象の話が出てきていない・・・。探し方が悪いのか、じつは誰もあまりまじめに使ってないのか・・・・。  ここら辺まで原因がつかめたところで、takiuchi先生にご相談。  結局カーネルまで追って、変にselectを呼び出して居ることが判明。takiuchi先生さすが! 自分もカーネルとか追うように色々準備しておかないと駄目だなと反省。  このコードを元に検索してみると、迷ったりしていることは分かったけど、このパッチを当てると、接続が詰まる状況が改善。  ここ以外にも、微妙なコードが見られるので、引き続きコードを追ってみよう。  年末の忙しい時期なのに、手伝ってくれてありがとうございました!>takiuchi先生