RBC勉強会で組み込みRuby

25日土曜日に福岡Rubyコンテンツセンターで久しぶりのRBCの勉強会が開かれました。

福岡CSKさんのご協力で開発中の製品を使わせて頂きました。
http://enzi.cc/

この製品の説明は上のサイトにお任せするとして、僕個人的にはハードウェアを触るのは20年ぶりで、抵抗の読み方とかコードの色の話は「あーそんなんあったよね、中身覚えてないけど」という感じのダメっぷりです。かろうじてLEDとか抵抗の役割くらいは分かる感じ。

そんな感じなので、いきなりボードを渡されても何をしたらいいのか分からんとなってしまいましたが、福岡CSK三牧さんが最初にLEDを光らせる「LEDチカチカ」略して「エルチカ」のデモを見せてくれたので、まずはそれを真似することを目標にしました。

まずはプログラムなしで、LEDを点灯させる配線をつないだだけで、光った「おー」と喜ぶ初心者っぷり。

次は、配線を変えてデジタルのIOにつないで、いよいしょエルチカを体験。
https://github.com/akm/rbc_mruby/blob/master/cds.rb#L19

enziの開発のサイクルはかなリ分かりやすかったです。

1. プログラムを記述
2. サイトのシミュレータでコンパイル=>実行ファイルダウンロード
3. SDカードに実行ファイルをコピー
4. ボードにSDカードを挿入
5. ボードを再起動
6. ターミナルで出力を確認(問題があったらターミナルで分かる)
7. 1に戻る

コンパイルの時間とか考えるとAndroidの実機テストより軽い感じです。

で、三牧さんのコードで動くことを確認したら、ちょっと要領が掴めてきたので、光センサを使ったものを作ろうということになりました。光センサが明るさを感じなかったらLEDを点灯し、明るさを感じたら消灯するというものです。

ちなみにCdSと硫化カドミウムの意味で、正しくは「硫化カドミウムセル」という名前の「フォトレジスタ」というものなのだそうです。
http://ja.wikipedia.org/wiki/フォトレジスタ

使った製品はこちら。
http://doc.chipfind.ru/hamamatsu/p3807r.htm

やってみてわかったんですが、通常は0を出力していて、暗くなると正の値を返すんですね。なるほどー。やってみると非常にわかりやすい。書いたコードがこちらです。 https://github.com/akm/rbc_mruby/blob/master/cds.rb#L6


で、ここらへんでだいぶわかってきたので、今回誰もやらないであろうと予想されていた通称「7セグ」を選択してみることに。

製品のマニュアルはこちら
http://rohmfs.rohm.com/en/products/databook/datasheet/opto/led_display/numeric/lb-603fp.pdf

うひー、意味わかんねー。
三牧さんや前席の古川さんのアドバイスとペアを組んだウチダさんの見事な回路構成によって、なんとかなっちゃうものなんですね、かなりサクッと書けました*1
https://github.com/akm/rbc_mruby/blob/master/led_display.rb

で、実際に動いたものがこれです。
http://www.youtube.com/watch?v=7zLfmLnpnSM

もうこれができたらだいぶ満足してしまって、色々デバイス使いたいよねーとかネットワーク繋ぎたいとかそんな話をしていました。

他のペアの皆さんも温度センサを使ってLED RGBを制御したりしてました。とても楽しい勉強会でした。


僕らが作ったものは冷静に考えると特に大したモノではないんですが、13:00 に始まった勉強会で、16:00にはこれが出来上がっていたのは素晴らしい敷居の低さだと思います。これでちょっとハードウェアに近づくことができたかなと思えました。

実際のものづくりはもっと色々考えなきゃいけないことがたくさんあるんだと思いますが、初心者にとっては入り口を広げるためにとても強力なツールだと思います。

製品のリリースが待ち遠しいです。
http://enzi.cc/


ボードを貸していただいた福岡CSKの岡部さん、石井さん、三牧さん、勉強会を開いて頂いた島村さん、他さんかしてくださった皆さん、ありがとうございました。

*1:currをcuurと間違えたので時間的に結構ロスしましたがw

schema_comments-0.2.0 リリース

schema_comments-0.2.0ーalpha5 から9ヶ月も過ぎてしまいましたが、リリースしました。
https://rubygems.org/gems/schema_comments

基本的な機能は変わってませんが、MySQL用のスキーマの出力が変わっています。もし前の方が良い、という方がいたらご連絡ください。

その他、ドキュメント、ソース、放置しっぱなしの態度その他諸々にご意見のある方はぜひ、ここのコメントか、pull requestかtwitterか何かでお知らせください。
https://github.com/akm/schema_comments

[ruby] 福岡Ruby会議01

行ってきました、福岡Ruby会議01。本当すばらしいイベントでした。

まとめはこちらですね。
- 主催者 @Spring_MT のブログ http://spring-mt.tumblr.com/post/37018290719/ruby-01
- @ayato_p のまとめ http://togetter.com/li/416276

僕はあんまり皆が取り上げてないところを書いてみます。

1. 「フィードバックループを伸ばしていく」

@kakutani の基調講演での表現。正確じゃないかもだけど、僕の中でじわじわきてます。
まずは近所で小さくフィードバックをもらえるようにして、だんだん遠くの人からもフィードバックをもらえるようにしていく、ってことをイメージしました。

2. Rails cells

@Spring_MT のプレゼンで知りました。そう言えば、そういうのから遠ざかってるなー。
http://cells.rubyforge.org/

3. Rubeus

@ayato_p のLTで require 'rubeus' というコードが!僕のRubeusを使っている!
絶賛放置中ですが、人の役に立てて良かったなーと思いました。
よかったら見てやってください。
http://code.google.com/p/rubeus/
https://github.com/akm/rubeus

4. Fukuoka.rbがやってくれて良かった

RBCのスタッフをやってる僕が言うのも変ですが、ちゃんとやってるからいい感じになったんだろうなーと思いました。
素晴らしいRubyKaigiを開いて頂いてありがとうございました。


みなさん、お疲れさまでした。
またよろしくお願いします。

linecache19 を headに入れるのは大変

rails_adminのテストを動かそうと思ってbundle installしたらエラーになった。

Installing linecache19 (0.5.12) with native extensions 
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

(中略)
Requesting http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p209.tar.gz

Gem files will remain installed in /Users/akima/.rvm/gems/ruby-1.9.3-head@rails_admin/gems/linecache19-0.5.12 for inspection.
Results logged to /Users/akima/.rvm/gems/ruby-1.9.3-head@rails_admin/gems/linecache19-0.5.12/ext/trace_nums/gem_make.out
An error occured while installing linecache19 (0.5.12), and Bundler cannot continue.
Make sure that `gem install linecache19 -v '0.5.12'` succeeds before bundling.

そりゃheadですもん、p209なんてアーカイブはないよね。

ruby-1.9.3-headの環境でインストールしようとしてたんで、.rvmrc はこんな感じだったんだけど、

rvm 1.9.3-head@rails_admin --create

ちゃんとstableなバージョンのrubyを使うようにしたら、bundle installは一発で通りました。

rvm 1.9.3-p194@rails_admin --create

一番分かり易かったCAP定理の説明

CAPを理解する最も簡単な方法は分割の両側にひとつずつノードがある場合を考えることです。片方のノードだけ状態を更新できるようにすると、2つのノードに一貫性がなくなります。つまり、Cが失われます。一貫性を維持しようとすれば、一方のノードは利用できない状態であるかのように動作しなければなりません。この場合、Aが失われます。一貫性と可用性が維持できるのは、ふたつのノードが通信できる場合だけです。この場合、Pが失われます。

「12年後のCAP定理: "法則"はどのように変わったか」より
http://www.infoq.com/jp/articles/cap-twelve-years-later-how-the-rules-have-changed

@taigou に教えてもらいました。

rubyでEXCEL

もちろんWin32 OLEとかを使う方法もあるけど、それ以外にもいろいろライブラリはある。
https://rubygems.org/search?utf8=%E2%9C%93&query=excel

先頭のparseexcelは今はspreadsheetになっている。

gem xlsx? 書き込み? 備考
spreadsheet NG OK 読み書きできて実装も良さげ
roo OK NG 日本語読むのはOK。実装がイマイチな噂あり


あと、 rubyじゃないけど、 libxlsっていうのもある。
http://libxls.sourceforge.net/

コレ使ったgemとかあった気がしたんだけど見つからんかった。

spreadsheet試してみたけど・・・

Spreadsheet.open "/path/to/file.xls"

で、結合とか何もない50KくらいのEXCELファイルをMacで開いてみたけど、ループしてるのか帰ってこない。泣ける。

spreadsheet動いた

Spreadsheet.open "/path/to/file.xls"

っていうのは実はirbで確かめていたんだけど、正確にはopenメソッドが帰ってこないんじゃなくて、irbに結果を出力されるために自動的に呼び出されるinspectメソッドが帰ってこないことが判明。

だからirbで試す場合こんな感じでやるべし。

$ irb -rspreadsheet
1.9.3-head :001 > book = Spreadsheet.open "tmp/atsumeyo-ze.xls"; nil
 => nil 
1.9.3-head :002 > book.class
 => Spreadsheet::Excel::Workbook 

bookのinspectが実行されないように、 ;nil をつけないとダメ。

spreadsheetで読み込みできることは確認できました。


spreadsheetで変更すると壊れる

既存の.xlsファイルを開いて既存のシートの既存のセルを上書きしたり、シートを追加してみたりしましたが、データが壊れてしまうようです・・・。残念。