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

64bit Ubuntu+Arduino UNOでarduino_firmataが動かないらしい

arduino_firmata


Ubuntu日本語フォーラム / arduino_firmataが動作せず 12.04/12.10


Ubuntu+Arduino UNOで

Resource temporarily unavailable

というエラーがでて動かないらしい
Ubuntu12.04の64bit版をVirtualBoxに入れてみたけど、CDC-ACMなArduinoはどれもデバイスとして認識しなかったのでエラーでるとか以前の問題だった。
VMじゃないUbuntuで試さないとならないっぽい・・


ニッチなgemのわりに毎日100インストールぐらいされてるので、すっかりRubyでArduino使うと定番になってるっぽくて嬉しい。

0

[BUG] cross-thread violation on rb_gc()

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


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

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

0

Rubygemsとbundlerのダウングレード

gem uninstall rubygems-update  # 全部消す
gem install rubygems-update --version=1.8.24
update_rubygems
これでgem 1.8.24に戻せる


Macのgemコマンドを2.0.4にアップグレードしてみたら、bundler1.3以上を強制されてしまったのだが
どうやってもSSLのエラーがでる

Could not verify the SSL certificate for https://rubygems.org/


のでbundler 1.2.4を使っている

gem uninstall bundler  # 全部アンインストール
gem install bundler --version=1.2.4

あとgem2.0.4はgem searchで検索しても前方一致しかしてないっぽい気がする


きっとそのうち面倒な設定をしなくてもbundlerが使えるようになるのでそれまで待つ