0

RubyでLevelDB

材料

本体 leveldb – A fast and lightweight key/value database library by Google. – Google Project Hosting
rubygem wmorgan/leveldb-ruby · GitHub


インストール


brew install leveldb
brew uninstall snappy
gem install leveldb-ruby
Macだと、homebrewの依存で入るsnappyがあるとエラーがでるのでアンインストールした。

dyld: lazy symbol binding failed: Symbol not found: __ZN6snappy19MaxCompressedLengthEm
Referenced from: /Users/sho/.rvm/gems/ruby-1.9.2-p320/gems/leveldb-ruby-0.15/lib/leveldb/leveldb.bundle
Expected in: flat namespace

dyld: Symbol not found: __ZN6snappy19MaxCompressedLengthEm
Referenced from: /Users/sho/.rvm/gems/ruby-1.9.2-p320/gems/leveldb-ruby-0.15/lib/leveldb/leveldb.bundle
Expected in: flat namespace


試す


memo.rb
#!/usr/bin/env ruby
require 'rubygems'
require 'leveldb'

db = LevelDB::DB.new File.expand_path 'memo.ldb', File.dirname(__FILE__)

case ARGV.size
when 0
db.each do |k,v|
puts "#{k} : #{v}"
end
puts "(#{db.keys.size} items)"
when 1
puts db[ARGV[0]]
when 2
k,v = ARGV[0..1]
db[k] = v
puts "#{k} = #{v}"
end



keyもvalueも文字列しか入らなかった。

0

Gyazz.comの更新をSkypeに通知

作った https://github.com/shokai/gyazzchecker-skype

MongoDB + MacOSX + Skype + Ruby1.8.7で動く。
Skype APIを使うためMac固定なのと、rb-skypemacというgemがRuby1.9系で動かないので1.8.7で。
cronではSkype APIが動かないのでMacのLaunchAgentにインストールするスクリプトを付けておいた。


http://gyazz.comという増井先生がwikiがあり、アウトラインエディタ機能とシンプルな賢い記法で大変便利。

RSSもあるのだが(http://gyazz.com/wiki名/rss.xml にある)
みんなにもっとwikiを見て欲しいのでSkypeチャットに更新通知を投げるツールを作った。
5分ごとに更新があったページのdiffを投げてる。



https://github.com/shokai/gyazzchecker-skype

MongoDB + MacOSX + Skype + Ruby1.8.7で動く。
Skype APIを使うためMac固定なのと、rb-skypemacというgemがRuby1.9系で動かないので1.8.7で。
cronではSkype APIが動かないのでMacのLaunchAgentにインストールするスクリプトを付けておいた。

0

RubyのHashの初期化

Hash、初期化しておくと何を入れるのか明確にできるし、
Hashを引数にとる関数で使う時も、nilでもいいから初期値を入れておけばHash#has_key?でいらん値をはじくのに使えて便利。


さっき作ってた物の中の処理で、
追加した順番に番号(indexというフィールド)を振りたいと思ってlambdaを入れてみたら動いた

#!/usr/bin/env ruby
fields = Hash.new{|h,k|
h[k] = {
:index => lambda{ fields.keys.size }.call,
:type => String,
:default => nil,
:value => nil
}
}

p fields

fields[:foo][:value] = 'shokai'
p fields

fields[:bar][:value] = 100
fields[:bar][:type] = Fixnum
p fields


追加した順番にindexが増える、ちょっと便利
{}
{:foo=>{:index=>0, :type=>String, :default=>nil, :value=>"shokai"}}
{:foo=>{:index=>0, :type=>String, :default=>nil, :value=>"shokai"}, :bar=>{:index=>1, :type=>Fixnum, :default=>nil, :value=>100}}


最近Ruby書いてて思うんだけど、APIの使い勝手を優先するために少しがんばれば大抵なんでも実現できてすごい。

0

Sinatra用のcometプラグインを作った

追記:RocketIOに統合されました → 橋本商会 » Sinatra RocketIOというプラグイン作った、これでWebSocketとCometが使える

******

作った

Sinatra Comet I/O

インストール

gem install sinatra-cometio



通信を意識せずに、サーバー側からクライアントの関数、クライアント側からサーバーの関数を呼び出せる。


サーバーからクライアントへプッシュする例

サーバー側


Ruby
require 'sinatra'
require 'sinatra/cometio'

CometIO.push :chat, :name => "shokai", :message=> "hello work!!"


クライアント側


HTML
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script src="<%= cometio_js %>"></script>

JS
var io = new CometIO().connect();
io.on("chat", function(data){
console.log(data.name + " : " + data.message); // -> "shokai : hello work!!"
});


クライアント→サーバーの例や、新規クライアント接続イベントやエラーイベント等についてもSinatra Comet I/Oに書きました


サンプルとしてHerokuでチャットを作った。 http://cometio-chat.herokuapp.com

チャットの場合同時に300クライアントぐらいしか接続できないっぽい。スケールさせる方法はよくわからない。
少人数で使うちょっとしたツールにリッチなUIを持たせる時などに便利だと思います。


*チャットサンプルですが1台のマシンから2つchrome開いても、交互に通信するみたいです。片方をsafariにするか、chromeをプライベートブラウズモードにすると動きます
色々やってたら大丈夫になりました

0

Raspberry Pi + Firmata + Arduino Duemillanoveのバグを直した

昨日のこれ直した

Duemillanoveは一度使うと抜き差ししないと認識しなくなるバグが発覚した。あとで直す。
UNOは問題ない。

橋本商会 » Raspberry PiでRuby/Arduino/Twitter/webcam


Arduino Firmataのv0.1.6が既にrubygemsにリリースされています

gem install arduino_firmata
でアップデートしてお楽しみください


バグ内容

色々試してたら、2回目以降はArduinoのリセットボタンを押せば認識する事に気づいた。

firmataデバイスがちゃんと認識しているかを確認する手段としてデバイスから送られてくるバージョン番号を使っている。
バージョン番号はArduino起動時に送られるだけで、Macや俺の持ってるUbuntuネットブックではシリアルポート接続時にリセットがかかるので2回目も使えていたらしい。Arduino UNOの場合はMacでもRaspberry Piでも接続時にリセットかかるので動いていた。

Raspberry Piでは接続時にリセットがかからないので、シリアルポート開いた直後にバージョン番号をリクエストするだけでバージョン返してくれるようになった。


これならもしかしたら、以前挫折したMSP430 LaunchPadのFirmata化もできるかも