0

RubyとArduinoとTwitterで天気予報を見る

こういうのを数年おきに、その時の近代的な実装で作りなおしてみるとプログラミング環境の進歩がわかる。


1. 今日傘が必要かどうか表示してくれるてるてる坊主

晴れの時


雨が降る可能性がある時

ウチでは15分おきにその日の天気予報を取得して表示している。うちテレビ無いけどこれのお陰で傘を忘れたりしなくなった。


プログラムはものすごい単純になっている。Rubyのみ。
Macで開発してRaspberry Piにデプロイした。Ruby動くUNIX系ならどこでも動くはず。
require 'rubygems'
require 'arduino_firmata'
require 'weather_jp'

arduino = ArduinoFirmata.connect
weather = WeatherJp.get '東京'
if weather.today.rain > 30 # 降水確率30%以上
arduino.digital_write 13, true ## 青色LED
else
arduino.digital_write 12, true ## 赤色LED
end
taiki45さんのweather_jpと俺のarduino_firmataを合わせると超綺麗に書ける。
MSN天気からデータを取ってきている。
6年ぐらい前に作ったときはPerlのCGI+XPortだったり、4年ぐらい前はRubyからArduinoにシリアル通信したりでもっと行数多かった。


ちなみにzakuniさん作のweather-reportはlivedoor weatherからデータを取ってきていて、降水量情報がない代わりに雨/雪/雹の可能性を示すumbrella?メソッドが在る。
require 'rubygems'
require 'arduino_firmata'
require 'weather-report'

arduino = ArduinoFirmata.connect
weather = WeatherReport.get '横浜'
if weather.today.umbrella? ## 傘が必要な時
arduino.digital_write 13, true ## 青色LED
else
arduino.digital_write 12, true ## 赤色LED
end


地名や降水確率のしきい値を実行時引数に渡せる仕様にして、githubに置いておいた。
ProcfileもあるのでMacやRaspberry Pi等にサービスとしてインストールできる。
shokai/teruteru · GitHub


回路は、昔秋月で買ったRGBフルカラーLEDを使った。
アノード3本/カソード1本のスタンダードな奴。

arduinoのどのピンにRGBが接続されているかはプログラム中に書いてある

こういうシールドにして、その上にティッシュかぶせて顔を書けば完成です。



2. 今日雨が降りそうだったら教えてくれるtwitter bot


雨が振りそうな日の朝に、こういうのが来る

Twを使うとtwitter botが簡単に作れる。
天気botこれだけで書ける。
require 'rubygems'
require 'tw'
require 'weather_jp'

tw = Tw::Client.new
tw.auth 'shokai_log' ## botアカウントで認証
weather = WeatherJp.get '東京'
if weather.today.rain > 30 # 降水確率30%以上
tw.tweet "@shokai #{weather.today}" ## @shokaiにmention送る
else
puts weather.today ## 予報の文章をterminalに表示するだけ
end

降らない時にも「今日の天気は晴れ」とか送ってるとだんだん見なくなるので、雨降る日だけtweetするようにした。

これも多少使いやすくしてgithubにコード置いておいた。
shokai/twitter-weather-alert · GitHub
cronで朝実行するようにしている。

1

ino使うとCUIでArduinoをビルドできて便利

実際Arduinoは.inoを.cppにしてavrgccしてavrdudeしているだけなので、CUIだけで書き込むのは難しくないんだけど
いいツールがあったので今後はこれ使っていく事にしたい。

モニタついてないサーバーに接続したArduinoを直す時とかにも便利。
というかArduino IDE微妙だからいつもemacs使ってるし、もうinoでいいんじゃないかな

http://inotool.org

動作にはpythonが必要。


インストール

MacのMountain Lionでは最初からpythonとeasy_installが入っているので
% sudo easy_install ino
% which ino


プロジェクトを作る

プロジェクトのディレクトリは作ってくれない
% mkdir testapp
% cd testapp
% ino init
ディレクトリが2つ、libとsrcができる


src/sketch.ino に普通にArduinoのプログラムを書く
void setup(){
pinMode(13, OUTPUT);
}

void loop(){
digitalWrrrrrrrrrrrrrrite(13, HIGH);
delay(1000);
digitalWriteeeeeeeeeee(13, LOW);
delay(1000);
}


ボード一覧を確認

% ino list-models
Arduino Leonardoを使うので、以後のコマンドに “-m leonardo” というオプションを付ければいい


ビルド

% ino build --help
% ino build -m leonardo

ちゃんとコンパイルエラーも出る


src/sketch.inoを直す
void setup(){
pinMode(13, OUTPUT);
}

void loop(){
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
}

ちゃんとhexができた


書き込む

% ino upload -m leonardo
“Guessing serial port”の後、
成功するとReading/Writing/Readingと3つのプログレスバーが100%まで伸びる。
失敗すると、最後だけ見るとdoneとか言ってるけどprogrammer is not respondingなどエラーが出る。

-p /dev/tty.usbmodem1234 のようなオプション付けるとシリアルポートを指定できる


シリアル通信

をモニタできる。


picocomが必要なのでインストールする。debian/ubuntuのaptにもあるらしい。
% brew install picocom

とりあえずSerial.printlnするようにプログラム直して
void setup(){
pinMode(13, OUTPUT);
Serial.begin(9600);
}

void loop(){
digitalWrite(13, HIGH);
delay(100);
Serial.println("on");
digitalWrite(13, LOW);
delay(100);
Serial.println("off");
}

% ino serial

ctrl+a ctrl+x で終了できる

0

nginxでホームディレクトリを表示する設定

研究室のMacがwebサーバーになってて、今まではapacheを使ってたんだけどnginx使うようにしたらホームディレクトリが表示できなかったので、nginxの設定書いた。
既に各自のホームディレクトリにあるファイルにwiki等からリンクが貼られているので、切れると面倒

このへん参考にした HttpCoreModule

今までは /Users/sho/Sites/test.html が
http://masui.sfc.keio.ac.jp/~sho/test.html
で見えていたので、そのようにしたい。

locationを書いた

server {
listen 80;
server_name localhost;
server_name "masui.sfc.keio.ac.jp";
server_name "~^masuilab\.(org|net|com)$";
charset utf-8;
root /Volumes/share/Web;
autoindex on;
location / {
index index.html index.htm;
}
location ~ /~([a-zA-Z0-9_\-]+)(.*)$ { ## ホームディレクトリの設定
alias /Users/$1/Sites$2;
index index.html index.htm;
}
## 略
}

ついでに http://sho.masuilab.org/test.html でも見れるようにした
server {
listen 80;
charset utf-8;
server_name "~^(?<user>[a-zA-Z0-9_\-]+)\.masuilab\.(.+)$";
root /Users/$user/Sites;
autoindex on;
location / {
index index.html index.htm;
}
}

0

HTC J Butterfly買った

ケータイをsoftbankのiPhone3Gから、auのHTC J Butterflyに買い換えた。
iPhoneのSIMをSIMフリーAndroidに刺して使ってたんだけど、安かったから買った。
価格.com – HTC HTC J butterfly HTL21 au [ブラック] 価格比較

俺が買ったのは3週間ぐらい前で、3万円ぐらいだったんだけど今1.5万円ぐらいになってる。
LTEをテザリングもできるし、液晶が超きれいだしRAMが2GBも乗ってて爆速マシンだった。
LTEのテザリング、学校や家とpingで30msecとか出ててVNCしても快適だしすごい。


レクサスプランニングという店で通販した。
MNPの通販なので、ケータイ屋さんで書いてもらうカーボンで写しをとる申込書類を自分で書いたり、softbankに電話したりした。

手順

1. レクサスプランニングのwebサイトで申し込む
2. 入金する
3. auの申込書が届く
4. softbankに電話してMNP予約番号をもらう。なぜiPhoneをやめるかなど色々質問される。
5. auの申込書を書いてレクサスプランニングに返送する(MNP予約番号、身分証明書コピーなども)
6. 2日ぐらいするとsoftbankが止まる
7. 次の日に新しいケータイが届いた

というわけで丸1日、ケータイが使えない日があるのが注意。
全体で1週間弱かかる。


セットアップ

Android OSのアップデートをした。4.1.1が来た。
「モバイルネットワークの設定」からPRLバージョンを上げた。LTEのつながりが良くなった。
頭にauと付くアプリを片っ端から停止した。auマーケットとかlismoとかうたパスとか。アプリケーションの設定からアンインストールor無効にすれば起動しなくなる。
アドレス帳をgoogleにおいてあるのだが、googleアカウント認証後に同期する設定をしないと同期できなかった。また同期にはけっこう時間がかかる。


悲しい所

NFCの読み取りが弱い。タグによっては読めないが、グリグリ押し付けると読める。
USBホスト機能が入っていない気がする。Arduino認識しなかった。
テザリング中に電話がかかってくるとインターネットが切断される。電話しないからまあいいか



0

im-kayac gemでiOSのカスタムURLスキーム使えるようになった

なんかよくわかってなかったのでオプションを付けてなかったんだけどjune29さんからpull requestが来て実装された。

handlerオプションが追加された。

% gem install im-kayac
% im-kayac -to shokai -handler twitter://twitter.com/shokai 私のツイッターデス

これでiPhoneでtwitterアプリが起動するプッシュ通知が送れる。


Rubyで書くならこう
require 'rubygems'
require 'im-kayac'
ImKayac.to('username').handler('twitter://twitter.com/shokai').post('私のツイッターデス')

shokai/ruby-im-kayac · GitHub