VirtualBox4.2でネットワークをブリッジアダプタにして使っていたんだけど、Mac OSXをmavericksにアップデートしたらVMが起動しなくなった。
“failed to open/create the internal network”というエラーが出ていた
VirtualBoxを4.3.2にしたらなおった。
Downloads – Oracle VM VirtualBox
VirtualBoxのメニューにある「アップデートを確認」ではアップデート無しになっていたから、どうした物かと思ってたけど4.3でてるじゃん・・
weather_jpで降水確率を取得して、30%以上だったら青に、そうでなければ赤く光らせる。
これがあると朝ぱっと天気が目に入るので、傘を忘れることがなくなる。
github.com/shokai/weather-hue
関連:プログラマブル電球hueをRubyから使う
実装
bundle exec ruby weather-hue.rb --city 鎌倉で実行できる。crontabなどに登録して定期的に動かすとよい。
weather-hue.rb
require 'rubygems'
require 'bundler'
Bundler.require
args = ArgsParser.parse ARGV do
arg :city, 'city', :alias => :c, :default => '東京'
arg :rain, '降水確率のしきい値 (%)', :default => 30
arg :help, 'show help', :alias => :h
arg :hue, 'hue light number', :default => 0
on :help do
STDERR.puts help
STDERR.puts "e.g. ruby #{$0} -city 鎌倉"
exit 1
end
end
weather = WeatherJp.get args[:city], :today
puts "#{weather} - #{Time.now}"
light = Hue::Client.new.lights[ args[:hue].to_i ]
puts "light : #{light.name}"
light.on = true
light.saturation = 180
light.brightness = 200
if weather.rain < args[:rain]
light.hue = 60000 # red
else
light.hue = 47000 # blue
end
動作を説明するのが楽。
githubはmarkdown内で普通にimgタグ使えるのでgif貼っていくといいと思います。
なおgyazoの画像をそのままblogなどに貼ると、アクセスが集中した場合に画像が埋め込めなくされ
る事があった時期もあったけど(今はないらしい)、
githubは自動的にimgタグをCDNにコピーして配信してくれるので安心です。
(見る人が少ない社内gitlabとかも問題ないと思う)
README.mdとかにgif貼るのもわかりやすくていいですね。
以上、Gyazo GIFステマでした
バイト先(大学)で、syslog-ngに流れてくるログをfluentdに流し込もう事になった。最終的にMongoDBに入れる。
windows/mac/unix系など色々なOSが入り乱れた環境なので、各ホストからはsyslogで飛ばすのがいいらしい。んで、最終的にモダーンなfluentdやmongodbに通して使おうという感じ。
(特にnt-syslogがすごいよくできてて、windowsなのにちゃんとutf-8で送ってくれるしえらい)
fluentdのプラグインを作り始めたけどまだ完成してない。なんか間違ってるとかこうした方がいいという情報あったら教えてください。
(ちなみにgem search fluent –remote | grep tail で見つかる物は全部ソース読んだり試したけど要求仕様を満たすgemは無かったです)
syslogをfluentdに流し込む
fluentdのtailプラグインにはsyslogフォーマットがあるので、こんな感じで読める<source>mongodbに貯まる。
type tail
path /var/log/path/to/syslog_file
tag syslog.test
format syslog
</source>
<match syslog.**>
type mongo
database fluent
collection syslog
host localhost
port 27017
</match>
syslog-ngの出す複数のログファイルをfluentdに流し込みたい
syslog-ngの書き出し先はこんな感じになっていたので
destination d_erns { file (/var/log/syslogs/$HOST_FROM/$HOST_FROM-$YEAR$MONTH.log);};
ログを送りつけてくるホストの数だけディレクトリが生成され、月毎のファイルに書き込まれる。
複数ファイルをtailしなければならない。
ワイルドカードでtailできるfluentd input pluginを作る
tailプラグインを見てみると、fseekなどを駆使して自前でtail -F相当の処理をするように実装されていた。で、ソースを読むとtailプラグインはカンマ区切りで複数ファイルを監視できるようになっている。
じゃあこれをちょっと拡張すればいいのでは?と思って、pathをワイルドカードで指定できるinput pluginを作った。
in_wildtail.rb
module Fluent
class WildTailInput < TailInput
Plugin.register_input('wildtail', self)
def configure(conf)
conf["path"] = Dir.glob(conf["path"]).join(',')
super
end
end
end
/etc/fluent/plugin/in_wildtail.rb として保存して、
<source>
type wildtail
path /var/log/syslogs/*/*.log
tag syslog.test
format syslog
</source>
これで全てのログファイルを追えるようになった。
毎月のログファイル切り替えに追随する
月毎に新しいログファイルに追記されるようになっている。また、新しいホストが増えたら自動的にディレクトリが掘られて、そこにログファイルが書き出される。
ファイルやディレクトリが増えたことを検知する機能をwildtailプラグインに追加したい。しかしThreadで定期的に回すのはfluentdの動作の妨げになりそう。
fluentdのgemspecを見るとcool.ioというイベント駆動ライブラリを使っていた。
cool.ioの作法に従って書けばfluentdの動作の邪魔にはなりにくそう。
というわけでcool.ioでディレクトリ監視するのを試しに書いてみた。
require 'cool.io'
class LogFileWatcher < Cool.io::StatWatcher
def initialize(path)
super path, 0.1
end
def on_change(previous, current)
p previous
p current
puts "-"*5
end
end
reactor = Cool.io::Loop.new
watcher = LogFileWatcher.new "/Users/sho/src/ruby/tmp/coolio"
reactor.attach watcher
reactor.run
扱い方がよくわからないオブジェクトで通知されるけど、とにかく指定したディレクトリで何か変更があるとイベントが起こる。
lsするだけで反応するけど。
これを組み込めばなんとかなるのではないか?
という所までがんばった。
うまくいったらgemする。
研究室にPhilipsのhueが来たので使ってみた。amazonでも売ってるけど3万円ぐらいする高級品だったのでおそるおそる扱った。
hueの仕様
bridgeと呼ばれる円盤型の母艦に、15個のhue電球が無線接続(zigbee?)される。bridgeは有線LANケーブルで接続され、HTTPのAPIを持つ。
OSはFreeRTOSで、lwIPでTCP/IPを実装している。
bridgeにはボタン1つとステータスLEDしか付いていないが、ローカルIPアドレスが http://www.meethue.com/api/nupnp で確認できて、あとはwebブラウザから見れる。
電球部分はごく普通のE26口金なので、家の天井や電気スタンドで使えるはず。
API
http://developers.meethue.com/にドキュメントがある。HTTPのAPIなので、同じLANの中からならどのマシンからでもAPIが使える。
jsonでやりとりする。
HTTPヘッダにAccess-Control-Allow-Origin=*が付いているのでブラウザ上のJavaScriptからもクロスドメイン制限なしにAPIが使える。
最初にAPIを使ってユーザー登録をしなければならないのだが、”1234567890″というユーザーがデフォルトで使えるようになっている・・気がする。
hue Rubygemではコンストラクタでユーザー名を指定しない時に自動的に”1234567890″を使うようになっているので、認証の事を全く考えずにコードが書ける。
curlで使う場合はこんな感じ
## ユーザー登録し、usernameを取得する
## usernameは自分で指定できるはずだが、なぜかエラーが返ってくるのでdevicetypeに名前を入れておいた
curl -d '{"devicetype":"shokai"}' http://192.168.1.130/api
## これだけ、bridge上部のボタンを押してから30秒以内に実行する必要あり
## bridgeのステータス取得
## 返り値がjsonなのでjqが便利
curl http://192.168.1.130/api/(username)/config | jq .
## 電球のステータス表示
curl http://192.168.1.130/api/(username)/lights
## 電球3のくわしいステータス表示
curl http://192.168.1.130/api/(username)/lights/3
## 電球3の名前を変更
curl -X PUT -d '{"name":"shooookai"}' http://192.168.1.130/api/(username)/lights/3
Rubyから使う
gemがあるので使いましょうgem install hue
しかしsaturationとbrightnessが指定できないバグが有ったので、修正してpull requestを送っておいた。
そのうち取り込まれて治ると思うけど、それまではGemfileに俺のgithubのブランチを指定してインストールすればいいと思う。
特にbrightnessは最大になってないっぽかったので、修正したらちょっと明るくなった。
source 'https://rubygems.org'
gem 'hue', :git => 'https://github.com/shokai/hue.git', :branch => 'bugfix_saturation_brightness'
実行コマンドも同梱されている。全部の電球をまとめて点灯消灯はできたけど、1つずつ個別にはできなかった。
これもバグがあるのか未実装なのかわからない。
hue all on
hue all off
色変化なしで、ただ点滅させるだけの例
require 'hue'
hue = Hue::Client.new
light = hue.lights[0]
loop do
light.on = true
sleep 0.5
light.on = false
sleep 0.5
end
HSBをそれぞれランダムに操作する例。hueだけ65536段階設定できる。
require 'hue'
hue = Hue::Client.new
hue.lights.each do |light|
light.on = true
end
loop do
hue.lights.each do |light|
puts light.name
light.hue = rand 65535
light.saturation = rand 255
light.brightness = rand 255
end
sleep 0.1
end
HSBをまとめて指定する例。1命令で全部指定するので実行速度が速い。
set_stateは第2引数に変化の速度を指定できる(100ミリ秒単位)
この例だと明度彩度は固定で、色相のみ0.1秒ごとになめらかに変化させる。
require 'hue'
hue = Hue::Client.new
light = hue.lights[0]
loop do
0.upto 65 do |i|
state = {:on => true, :hue => i*1000, :saturation => 255, :brightness => 255}
p light.set_state state, 1
end
end
Lindaでhue
RocketIO::Lindaでhueを操作できるようにした。まだ電球個別に操作はできないけどそのうちやる。shokai/linda-hue
hueを触ってみて
色をゆっくり変化させると気づかない。これには一長一短あると思う。気にならないとも言えるが、何かを通知するには気づかないのは良くないかもしれない。
表現したい物による。
何か集中して作業している状態から、hueに強制的に意識を向けさせるには、パッと色を変えるか、一瞬消灯や点滅させる必要がある。
集中力を切らせずに、いつでもいいからそのうち気づいて欲しい情報を提示するには、色をゆっくり変化させられる機能は重要かも。
hueっぽい物の自作
もう1セットhueがあると2地点に設置できるんだけど、無いので、ソリッドステートリレーとArduinoでhueっぽい物を自作した。ハロゲンランプだから単色だけど、全力で点滅させるとhueの倍ぐらいの速度でチカチカできる。