パトランプでサーバ監視 with Gainer,Ruby

7月 14th, 2008 admin

CSNagoyaのLTで「RubyとGainerで行うサーバ監視」というタイトルで発表しました。

概要

サーバがピンチだっていうのにアラートメールが届くだけなんて地味すぎだろ
というコンセプトのもとに、サーバのロードアベレージをチェックし、高いようであればパトランプを点灯させるというものを作ってみました。本来のサーバ監視という意味ではロードアベレージだけチェックするのはいまいちですが、そのあたりは改良していきたいと思います。むしろRubyとGainerだけで、こんなに簡単にできるんだということが伝われば幸いです。

動作している様子

といっても、パトランプが点灯するだけですが。仕事中に突然これが光りだすのはエキサイティングです。

システム概要

all.png
非常に単純ですね。調査もとのマシンから、監視対象サーバにSSHでログインしてロードアベレージをチェックします。その後ロードアベレージが一定の値を超えていたらGainer経由でパトランプを点灯させます。

回路

dsc00243.jpg
パトランプは12Vで動くものです。ネタのためだけに欲しかっただけなのに6000円もして悲しかった。
gainer_map.gif
回路図はこんな感じです。Gainerから出る信号は弱い(多分3Vぐらい?)なので当然パトランプを直接点灯させられません。そこでパトランプにはリレーと12Vの電源をつけてやり、そのリレーのON/OFFをトランジスタによるスイッチで行いました。

コード

たったこれだけのコードでできるというのが驚きです。Gainerとのやり取りはFunnelというソフトを使いました。GainerやArduinoに対応した便利なツールキットのことでIOのフィルタなどをいい感じにやってくれるものです。

RUBY:
  1. require 'rubygems'
  2. require 'net/ssh'
  3. require 'funnel'
  4.  
  5. def get_load_average(str)
  6.   return str.slice(/load average: ([^,]+)/,1).to_f
  7. end
  8.      
  9. module Funnel
  10.     la = 0.0
  11.     Net::SSH.start(ARGV[0], ARGV[1], :password => ARGV[2]) do |ssh|
  12.       la = get_load_average(ssh.exec!('uptime'))
  13.     end
  14.    
  15.     if la> 2
  16.       gio = Gainer.new(Gainer::MODE1)
  17.       gio.aout(0).value = 1
  18.       sleep(300)
  19.     end
  20. end

発表資料

まとめ

今回はGainerとRubyでパトランプを点灯させてみました。Gainerについて興味をもったかたは以前エントリーを書きましたのでそちらをご覧下さい。

また8月に開催されるOSC NAGOYAには開発者の小林茂さんが講演に来てくださいます。
お近くのかたは是非ご参加ください。

GainerでマルチカラーLED点灯の実習

7月 11th, 2008 admin

まだまだGainerで遊んでいます。コードを書いていてRubyの資産がすべて使えるというのは本当に凄いことなんだなと思いました。今週の日曜日にCSNagoyaのHaskell勉強会にてLTの時間があるので、いまからそれなりに実用的なものをつくって発表しようと思います。

作ったもの

LEDが「青」=>「黄色点滅」=>「赤」と信号のように光ります。いかにも電子工作やプログラミングの入門っぽくていいですね。

コード

RUBY:
  1. require 'funnel'
  2.      
  3. module Funnel
  4.     gio = Gainer.new(Gainer::MODE1)
  5.     gio.aout(1).value = 1
  6.     sleep(3)
  7.     gio.aout(1).value = 0
  8.     7.times{
  9.       gio.aout(0).value = 1
  10.       gio.aout(3).value = 1
  11.       sleep(0.5)
  12.       gio.aout(0).value = 0
  13.       gio.aout(3).value = 0
  14.       sleep(0.5)
  15.     }
  16.     gio.aout(0).value = 0
  17.     gio.aout(3).value = 1
  18.     sleep(5)
  19.  
  20. end

まとめ

ちょっと大須いってくる

Gainer+Ruby+Twitterで「お知らせTwitter」

7月 10th, 2008 admin

6.jpg
Gainerを買ったはいいのですが、残念なことにFlashを持ってなければASも書けないので、Rubyから使えるようにしてみようと思います。

作るもの

Twitterで@メッセージをもらったはいいが返信が遅れて気まずいというような状態を避けるために、@メッセージをもらったらブザーが鳴りLEDがチカチカするようなものを作ってみたいと思います。
なんだかパッとしませんがGainerで初めて作るものなのでこんなもんです。

今回も参考サイト様様でしたので。先に参考サイトを紹介させていただきます。

参考サイト

RubyからFunnelで加速度センサー(Gainer)の値を取得してみた (Unknown Quality)
Gainer を Ruby から使う
Greenbear Laboratory - Ruby Twitter Gem簡易リファレンス
hwhack: Gainerとrubyとtwitter (あるいはタンジブルなtwitter)

まずはセットアップ

WindowsXP用ドライバをダウンロード
http://gainer.cc/Download

Funnelをダウンロード
http://code.google.com/p/funnel/downloads/list
C:\gainer\funnel以下に配置

RubyからFunnelを扱うためにOpen Sound Controlをインストール
RAA - osc
http://raa.ruby-lang.org/project/osc/

OSCのインストールは以下のようにコマンドを打つだけ
> ruby install.rb config
> ruby install.rb setup
> ruby install.rb install

GainerモジュールをUSBに差し込むとドライバの場所を聞かれるので、先ほどダンロードしたものを指定。
2回聞かれますので2回同じ事をします。

funnelを起動します。
C:\gainer\funnel\server>java -jar funnel_server.jar
するとjavaのウインドウが開いて

Funnel 007 (2008-04-21)
シリアルポートが指定されていないため自動的に取得されたポートを使用します
I/Oモジュールと接続中です…
tried: COM1
I/Oモジュールと接続が完了しました:COM3
I/Oモジュールを再起動中です…
I/Oモジュールは正常に再起動しました
ファームウェアのバージョン:1.0.0.15
コマンドポート:サーバの起動中…
通知ポート:サーバの起動中…
通知ポート:サーバが起動しました:9001
コマンドポート:サーバが起動しました:9000

こんな感じのメッセージが表示されればOK

コードを書く

RUBY:
  1. $: <<'..'
  2.  
  3. require 'rubygems'
  4. require 'twitter'
  5.  
  6. require 'funnel'
  7.  
  8. module Funnel
  9.  
  10.   agent = Twitter::Base.new(USER_NAME,PASSWORD)
  11.   agent.timeline(:friends).each do |s|
  12.     if /^@USER_NAME/ =~ s.text
  13.       p s.text
  14.       gio = Gainer.new(Gainer::MODE1)
  15.  
  16.       #アナログ出力0についているブザーを鳴らす
  17.       gio.aout(0).value = 0.5
  18.      
  19.       #Gainerの基板についているLEDの点滅
  20.       Osc.service_interval = 33
  21.       blinker = Osc.new(Osc::SQUARE, 2.0, 0)
  22.       gio.led.filters = [blinker]
  23.       blinker.reset
  24.       blinker.start
  25.      
  26.       sleep(2)
  27.     end
  28.   end
  29.  
  30. end

取得したタイムラインに@toyoshiがあると「ピー」「チカチカチカ」となるようになった。かなりシュールです。

gio.aout(0).value = 0.5
この書き方とかが正しいのか不安なのと、Rubyのモジュールがよくわかっていないので、そのあたりを調べながら次回からは書籍に沿って勉強してみようかなと思います。

Gainerではじめるフィジカルコンピューティング

7月 10th, 2008 admin

Gainerというのはフィジカルコンピューティングを実現するためのソフトウェアとハードウェアによる環境で、Flash,Processing,Rubyなどから簡単に外部のIOとやりとりができるのが特徴です。

私は今年の3月にWCAN mini ActionScript vol.5というのに参加させていただいたのがGainerとの最初の出会いでした。

GainerのIOモジュールを買う

オリジナル版と、海外でリモデル(メカロボショップ)されたものが販売されています。私はTriggerDeviceShopがリニューアル中だったので、メカロボショップのスターターキットというのを+GAINERという本と一緒に買いました。書籍にあるかわいいダンボールがついてこなかったのが若干残念でしたが組み立てが不要なのはうれしかったです。+GAINERは出版社が倒産してしまったので今後入手困難になる可能性がありますので購入はお早めに

TriggerDevice Shop(公式サイトで紹介されているサイト)
http://triggerdevice.ocnk.net/

メカロボショップ(+GAINERの本のモジュールと若干違います)
http://www.mecharoboshop.com/

届いた

1.jpg
メカロボショップのスターターキットと+GAINERの書籍で約20,000円でした。

2.jpg
センサーやアクチュエーターがたくさんで夢がひろがりんぐです

4.jpg
これがGainerのIOモジュール。ブレッドボードに挿すためのピンは最初ついていないので半田付けします。まずは四隅から。

5.jpg
半田付けが終わりました。ようこそフィジカルコンピューティングの世界へ!

まとめ

+GAINERに掲載されている制作事例などがクリエイティブすぎて凹みました。
めげずに頑張ります。