0

顔アイコンアプリにgyazo機能つけた

個人用や社内gyazoみたいなのたまに見かけるけど、みんなMac用のアプリの他にサーバー側のコードも必要になってて無駄がある。
scpを使えばいい。sshを鍵で認証するようになってればユーザー管理もしやすい。


これ→ 顔アイコンでファイルアップロード
ファイルを投げ込むとアップロードしてくれるアプリなんだけど、gyazoっぽいスクリーンキャプチャ機能を追加した。
便利すぎてメールに添付ファイルとか最近つけたことない。


セットアップ

git clone git://github.com/shokai/face-upload.git
cd face-upload
cp sample.config.yml config.yml

icon.pngは俺のアイコンになってるので、適当な画像ファイルに入れ替える。
自動でリサイズされるので適当な自分の写真でも入れるといい。別にpngじゃなくても多分アイコンに変換される。


config.ymlを編集する。
SFCの学生用のサーバーならこんな感じ。自分の使えるsshで接続できるサーバーを設定すればいい。
ssh : "shokai@ccz01.sfc.keio.ac.jp"
dir : "public_html/file/"
url : "http://web.sfc.keio.ac.jp/~shokai/file/"


アプリを生成
./setup
face-upload.app が生成される。


使う

アイコンにファイルを投げ込むとブラウザでひらいて、ついでにクリップボードにURLが入る。
アイコンをクリックで起動するとキャプチャモードになる。


ソースコード

こちらにございます
https://github.com/shokai/face-upload

0

arduino_firmata gemでサーボモーター動かせるようになった

Arduino Firmata on Ruby

前:RubyからArduinoを操作できるようにFirmataプロトコルを移植した



動くようになった。
PWMが出せるDigital 11ピンに接続したサーボをランダムに1秒おきに動かす例

#usr/bin/env ruby
require 'rubygems'
require 'arduino_firmata'

arduino = ArduinoFirmata.connect

loop do
angle = rand 180
puts "servo angle #{angle}"
arduino.servo_write 11, angle
sleep 1
end

Arduino#servo_write(pin, angle)が使えるようになった。
Arduino#analog_write(pin, value)を使えば動かせたんだけど、FirmataがServo.hを読み込んでてArduino本体と同じく角度指定で動かせるAPIをだしていたので、そっちを使うようにした。


analog_writeととservo_writeの違い

FirmataとServo.hのコードを読んでみると、Firmataプロトコルでanalog_write 0~180を送って、そのピンがPWMモードではなくSERVOモードだった場合は0~180をPWM出力値ではなく角度指定値として扱うようになってた。
通信だけ見ると0~180までのanalog_write指令を送っているのに、Arduino側でモードに合わせて0~255にマッピングして動くという面白い仕様だった。

servo_writeは最終的にArduinoのServo.hのServo.write()を呼ぶようになってる。

0

RubyからArduinoを操作できるようにFirmataプロトコルを移植した

Javaから移植した
Arduino Firmata on Ruby

インストール

gem install arduino_firmata
Ruby 1.8.7と1.9.2で動作確認してる。serialport gemを使ってるのでJRubyでは動かない。


できること・使い方

RubyからArduinoのデジタル・アナログの入出力が使える。

例えばTwの内部APIと温度センサLM35DZと組み合わせると、9行で温度をtweetできたりして便利。
#usr/bin/env ruby
require 'rubygems'
require 'arduino_firmata'
require 'tw'

arduino = ArduinoFirmata.connect "/dev/tty.usbmodem621"
puts temp = arduino.analog_read(1)*100*5/1024 # 摂氏1度毎に10mV出力なので計算する
client = Tw::Client.new
client.auth "shokai"
client.tweet "現在の温度 #{temp}度"


あとはSinatraと組み合わせて20行ぐらいでブラウザからArduino動かしたりとかもできる



Firmataとは


http://firmata.org
Firmata(ふぁるまーた)はProcessingからArduinoを制御するために5年ぐらい前に作られたプロトコルだ。

Arduinoに Firmataファームウェア を書き込むと、USBシリアル通信経由でパソコンとやりとりしてIOを操作したり色々やってくれる。
プログラムを書く側はArduinoのコードを書いたりパソコンとの通信を意識したりする必要が無くなり、
手元のRubyやProcessingだけを書けば済むのでとても楽になる。
ただし、通信する分だけ遅くなるので超細かくモーターを制御する等には向いていない。


Processing以外にもMax/MSPやopenFrameworksなど色々なプログラミング言語からArduinoを制御する時に使われるようになったり、
また逆に、Arduino以外のボード(Funnel IOなど)をProcessingから制御するのにも使われてたりしている。

いろんな言語とボードを接続するのに便利なプロトコルなのだが、
PhidgetsがあるんだからArduinoはスタンドアロンで使うべきじゃないの?という印象だった。2週間前までは。

八王子の山奥のopenFrameworksセミナーで使ったGrove Systemが拡張パーツの多さ・入手の容易さ・自分で拡張しやすいという点でPhidgetsを食ってしまっていたので、Rubyでも使いたくなった。
つまり Ruby+Firmata+Arduino+GroveSystem 最強なのでは。全部オープンソースだし。

実装はそんなに難しくなくて昨日お風呂にはいる時間を削って作ってみたらすぐ動いたのでgemにした。
Arduino playground – Processing にあったJavaのFirmataライブラリをまるごとRubyで書きなおした。


Rubyっぽい書き方


せっかくRubyで書いてるので使いやすいAPIにしたい。

デバイス名を省略してconnectしても適当に探して接続したりとか、
ADコンバータにcallback登録できるようにしてみた。
arduino = ArduinoFirmata.connect

arduino.on_analog_changed 0 do |value|
puts "analog pin 0 changed #{value}"
arduino.analog_write 11, value
end

ブロックを使うと、arduino.analog_readをanalog_readだけに省略できたりとか
ArduinoFirmata.connect do
puts "firmata version #{version}"

30.times do
an = analog_read 0
analog_write 11, an
sleep 0.01
end
end


簡単なチュートリアルも Arduino Firmata on Ruby に書いたし、
今後も機能追加するので(未実装のon_digital_changed等)見ると良いと思います。

0

気温とか明るさをtweetするようにした

なんとなくJSONで。



ソースコード
https://github.com/shokai/tweet_env


温度はLM35DZを使った。
高精度IC温度センサ LM35DZ 0~100℃: センサ一般 秋月電子通商 電子部品 ネット通販

正面から見て左のピンにVCC、右にGNDつないで、中央から摂氏1度毎に10mVでる。


10mVで1℃をArduinoのADコンバータで読む。LM35とADコンバータ比較電圧は5V。

#define LM35_PIN 0
#define LM35_VOL 5

double get_temp(){
return (double)analogRead(LM35_PIN)*100*LM35_VOL/1024;
}
最初にdoubleかunsigned intとかにしておかないと、33度以上の時に桁あふれして負の温度が返ってくる。


twitterへの投稿はTw内部APIを使ったので3行で書けた。
twで値をすぐ取り出せるので、twitterに入れておくの便利だと思う。
% tw -search=気温,明るさ,shokai_log
% tw -search=気温,明るさ,shokai_log --format="#{text}"


RubyにもFirmataライブラリがあれば楽なのになーと思った

0

gem launch-agentで定期的にスクリプト実行

これ便利だ
https://github.com/youpy/ruby-launch-agent
https://rubygems.org/gems/launch-agent

Macで常時起動、あるいは定期的に実行させたいスクリプトを配布するのによい。


youpyさんが作ったlaunch-agentというgemを使うと、LaunchAgentsに起動設定を登録できる。
LaunchAgentはMacを起動した時にアプリを自動起動してくれる人で、$HOME/Library/LaunchAgentsや/Library/LaunchAgentsに起動設定ファイルがある。


githubのREADMEにはLaunchAgent::Daemonを使って常時起動させるアプリを登録する方法が書いてある。
今回は定期的に起動したかったので、ソース読んでみたらLaunchAgent::Periodicというのがあった。

使い方

require 'rubygems'
require 'launch_agent'

agent = LaunchAgent::Periodic.new(60, 'ruby', '/Users/sho/test.rb', '引数1', '引数2')
agent.load
agent.unload
60秒ごとに指定したスクリプトが起動する。


こういう設定ファイルが $HOME/Library/LaunchAgents に生成されていた。
(これは今作ってる別のアプリの設定ファイル、300秒ごとに実行される)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>org.shokai.ruby___usr_bin_wifi_location_logger___write_log___logpath__var_log_wifi_location</string>
<key>ProgramArguments</key>
<array>
<string>ruby</string>
<string>/usr/bin/wifi_location_logger</string>
<string>-write_log</string>
<string>-logpath=/var/log/wifi_location</string>
</array>
<key>StartInterval</key>
<integer>300</integer>
</dict>
</plist>



何も指定しないとcom.buycheapviagraonlinenowって名前でサービスが登録されるので、
$VERBOSE=nil
module LaunchAgent
class Base
DOMAIN = 'org.shokai'
end
end
$VERBOSE=true
warningを一時的に止めつつLaunchAgent::Base.DOMAINを上書きしたらよい感じになった。