0

im-kayacのrubygemをアップデートした

2年前に作ったim.kayac.comのgemを久しぶりに見たら直したくてしょうがなくなったので直した。
APIを変えたので、対応するの面倒な人はGemfileに

gem "im-kayac", "< 0.1.0"
として古いの使ってください。


インストール

gem install im-kayac


gemの使い方

ユーザ名指定してgoogle talkやiphoneにメッセージを送れる。
require 'im-kayac'
ImKayac.to('username').post('hello world')


パスワード認証や秘密鍵認証も使える
ImKayac.to('username').password('your-password').post('hello')
ImKayac.to('username').secret('your-key').post('hello')


im-kayac コマンド

コマンドもつけてみた。gemインストールすれば使える。
% im-kayac --help
% im-kayac -to USERNAME "hello!!"

パスワード認証とかも対応している
% im-kayac -to USERNAME -password PASSWORD "はらへった"
% im-kayac -to USERNAME -secret SECRET_KEY "これは秘密鍵使ってる"

1

crontabでRVMのRubyを使う

ruby の代わりに、 $HOME/.rvm/bin/ruby-1.9.2-p320 などを使えばいいらしい。
rvmそれぞれの環境でインストールしたrubygemsにもパスが通って使えるようになる。

このファイルは中身を見るとシェルスクリプトで、rvm use 1.9.2-p320しながら引数をrubyに渡す感じになってる。


俺普段Ruby1.9か2.0使ってるんだけど、今までなんか面倒くさくてRuby1.8でも動くようにプログラム書いてsystem rubyにも同じgemインストールして動かしてた。

前に書いた自動日記をtwitterに流すようにしたってやつも、こうしたらRuby1.9で毎日1時にtweetするようになった。

0 1 * * * cd $HOME/src/ruby/autodiary && $HOME/.rvm/bin/ruby-1.9.2-p320 autodiary.rb -tweet shokai > /dev/null 2>&1
autodiaryのディレクトリに置いてあるGemfileも読まれてちゃんと動く。good.
crontabの上の方で環境変数をゴニョゴニョするとかshellも全く必要なし。


参考:RVM: Ruby Version Manager – Using Cron with RVM

0

Ruby2.0の正規表現でのinvalid multibyte escape

Ruby2.0はエンコーディングがUTF-8がデフォルトになっているので、バイト列に対して正規表現かけてデータを取り出すようなコードが動かなくなることがありますね


例えば 0xFF〜データ〜0x00 なバイナリに対して、データ部分を取り出す時こんな風にするけど

bytes =~ /\xff([^\x00]+)\x00/m


Ruby2.0では正規表現のエンコーディングをASCII-8BITにしておく必要ある。nをつける。
bytes =~ /\xff([^\x00]+)\x00/nm

0x80つまり128以上の時、ASCII-8BITの正規表現だよと宣言しておかないとinvalid multibyte escapeになる。
というようなpull requestをlibwebsocketに送ってmergeされた。

こんな風になってる。

0

em-websocketで1万クライアント以上さばく方法

em-websocketの接続数の上限が1015ぐらいなんだけど増やせた。forkとかは使わない。

環境はUbuntu12.04。
Macはepoll使えないので無理。

まずこちらを参考にファイルディスクリプタの上限を増やしておく。
ファイルディスクリプタの上限値を増やす – そ、そんなことないんだから!


で、EM::runの前にepollを使うようにしてset_descriptor_table_sizeを設定すればおk

require 'eventmachine'
require 'em-websocket'

EM.epoll
EM.set_descriptor_table_size 60000
EM::run
EM::WebSocket.run :host => "0.0.0.0", :port => 8080 do |ws|
## 略
end
end

クライアント側はem-websocket-clientを使って試した。こちらもEventMachine起動前にEM.epollしてEM.set_descriptor_table_sizeしておく必要ある。

1万クライアント接続している状態で、全クライアントに数byteのデータ送るのに0.5秒ぐらいかかった。
14000ぐらいでなんか動きが怪しくなった。

参考:File: EPOLL [EventMachine]


なかなか上のページに辿りつかなかったんだけど、thinの中でem-websocketを使ってる時にthinの–max-connsオプションを増やしたらなぜかwebsocketの方も接続数が増えちゃったので、thinとrackのソース読んで追って行ったらたどり着いた。

0

[BUG] cross-thread violation on rb_gc()

というエラーでRubyが強制終了した。
twを新しいバージョンにしたら起こった。


ネイティブ拡張使っているgemを一旦アンインストールしてtw入れなおしたら治った。

% gem uninstall tw
% gem uninstall parallel multi_json json
% gem install tw