0

新しいTwitterのエゴサーチツールを作った

2010年に作ったやつが動かなくなったので
エゴサーチツール feedim

コードみたらひどかったから、1から作りなおしたほうが速いかーと思って作りなおした。
shokai/twitter-egosearch-skype

すげークリーンなコードになってて良い。

機能

Twでtwitter searchして
本文中の短縮URLはhugeurlで展開して
mongodb/mongoidに保存する

というクローラーがevent_emitterでイベント投げてくるので
Skype gemでpostする。


YAMLの設定ファイルをHashie::Mashで包んだら使いやすくてよかった。sizeとかlengthとかHashやArrayにある値を設定ファイルで使えなくなるけど気をつければメリットの方が大きい。


コードがひどいから作り直そうと思っても大抵挫折するし、がんばっても大して良くならないんだけど、そういう設計をかっこ良く書けるようにするライブラリやフレームワークを作ってから再チャレンジすると革命が起こせる。今回はevent_emitterがそれ。便利すぎ。神。

0

Ruby内に人間への命令を書けるBabaScriptが完成に近づいている

ちゃんと馬場くんからのreturn valueが取れるようになった。

BabaScriptはコンピュータが得意な事はコンピュータが実行し、人間が得意な処理は馬場くんが実行するプログラム言語です。
メタプログラミングでRubyを拡張して人間への命令を送るための構文を追加し、人間を関数と同等に扱えるようにするスマホアプリと連動させます。
世界一柔軟で好意的に解釈してくれるプログラム言語BabaScriptを作りました

% gem install babascript
% baba --help


こういうのが実行できるようになった。

sample.bb
res = かず助に行きたい人の出欠取ってください
puts res # => "6人です"
loop do
num = res.to_i
if num > 0
puts では予約してください("#{num}人")
exit
else
res = 残念・・その次の週はどうですか?
puts res
end
end

% baba sample.bb

日本語で書いた部分が馬場くんが実行する関数として呼び出され、馬場くんから結果が返ってくるまでブロックされるようになりました。



rubyでもbabascriptからの命令を受けれるツールも追加した(開発に便利なので)
baba-vmコマンドでterminalでbabaになれる。


実装

インフラに使っているWeb版LindaRubyクライアントを拡張した。

今までread/take命令はコールバック登録するしかなかったが、コールバック関数を登録しなかった場合はタプルが得られるまでブロックするようにした。
EM::defer do
loop do
tuple = ts.take [1,2]
puts "blocking take #{tuple}"
end
end
コールバック関数を登録すれば今までどおり非同期に動く。なかなか良い仕様だと思う。

0

GUIから起動してないTerminalからDBUSを使う

LinuxのcrontabやserviceからSkype APIが使えるようになった
https://github.com/shokai/skype-ruby


問題

Skype gemで使っているruby-dbusは環境変数DBUS_SESSION_BUS_ADDRESSを使ってSkypeアプリと通信させてくれるのだが、GUIから起動したTerminalでないとDBUS_SESSION_BUS_ADDRESSが設定されていない。
つまりcronやserviceから起動したプロセスはDBUSが使えなかった


解決方法

~/.dbus/session-bus/ にテキストファイルでDBUS_SESSION_BUS_ADDRESSが書いてあった

kde – Run a dbus program in crontab , how to know about the SESSION id? – Unix & Linux Stack Exchange

DBUSに接続する前に環境変数DBUS_SESSION_BUS_ADDRESSが無かったらファイルから読んで設定するようにした。


Virtual Box

Skype APIは起動済みのSkypeアプリと通信するものなので、Skype botを作るにはSkypeを常に起動しておかなければならない。
家のMacMiniにVirtual BoxにUbuntu12.04入れてその中でSkype起動して運用している。

2

Raspberry PiにRaspberry PiのUSB HUBから給電する

Raspberry Piは5V1Aの電源を必要とするが、ほぼ全てをRaspberry Pi内で使ってしまうので、外付けHDDやArduinoなどのそれなりに電源食うデバイスを付けると電源が足りない。
例えしばらく動いていても数時間以内に電源が落ちてしまう。もちろんモーターなんかも付けられない。

そこでUSBデバイスには外部電源を給電するためにUSB HUBを使うのだが、それだとRaspberry PiとUSB HUB両方に給電するとコンセントを2つ使ってしまう問題がある。


色々試した結果こうしたらコンセント1つで済んだ。ループしているように見えてループしていない。
2013-06-17 16.22.04

まずBUFFALOの一番安いACアダプタ付きUSBハブにUSB HUB付属のACアダプタで給電する。このACアダプタは5V2.3Aでているので、Raspberry PiとArduino3つとサーボモーターを同時に動かしても足りる。

USB HUBからRaspberry Piに給電し(上側のねじれたケーブル)、Raspberry PiのUSBポートを同じUSB HUBに接続する。ループしているように見えるけど、Raspberry Piの電源用USBコネクタにはUSBデバイスとして認識される機能は無いので問題ない。またこのねじれたケーブルは100円ショップで売っているケータイ充電専用のデータ線が無いケーブルなので、もしも今後USBデバイスとしてPCから認識されるRaspberry Piがでてきても同じ構成でいける。

USB HUBにはArduinoが3つつながっている。モーターが付いているのもあるけどどれも元気に動いている。

0

CUIでSkype Chatできるコマンド作った

v0.2.1以降のskype gemに付いている。現在v0.2.2になった。
あまり便利ではないのでおすすめできない。

% gem install skype
% skype-chat

起動するとチャットを選ばされるので、選ぶ。

どの辺が便利でないかというと、そもそもSkype APIはそのマシンでGUIで起動済みのSkypeと通信しているわけなので、あえてCUIでチャットする必要が無い。

ただskype gemのサンプルコードとして有用だと思ったのでつけておいた次第。

これがそのskype-chatコマンド。あの恐ろしいSkype APIがとても綺麗に使えているでしょう。
https://github.com/shokai/skype-ruby/blob/master/bin/skype-chat
本当はreadlineとか使った方がいいんだけどgemに依存が増えてしまうのでこの程度で止めておく。まともなチャットツールにするならこれを元に改造すればいいと思う。

Skype gemはコストの高いAPIは内部で自動的にキャッシュしてくれて便利です。
MacとLinuxに対応しているから、botとか作るのに活用してください。

windows対応はpull request募集中です。