0

JavaScriptとRubyによるWeb版Linda入門(2)

(第12回プログラミング方法論の演習資料です)

前:JavaScriptとRubyによるWeb版Linda入門(1)
次:JavaScriptとRubyによるWeb版Linda入門(3)


前回作成したチャットに、自分のMac上のRubyからも参加できるようにしましょう。
参加するといっても、せっかくなのでただのチャットでは面白くありません。

RubyでLindaチャットのテキストを音声読上げするソフトを作ります。


まずLindaを使うのに必要なライブラリをgemコマンドでインストールします。
Terminal.appに打ち込んでください。

gem install sinatra-rocketio-linda
MacのデフォルトRubyを使っている場合、コマンドの頭にsudoをつける必要があります。
sudo gem install sinatra-rocketio-linda
ネットワークとPCの性能しだいで数分かかります。


前回のWebチャットプログラムが無い場合

大丈夫です。LindaはWebページ上でデータをすべて見れます。
チャットの発言を見る
http://linda.shokai.org/room1/chat

チャットに発言する
http://linda.shokai.org/room1/chat/てすと
http://linda.shokai.org/room1/chat/こんにちは

プログラムを書く、Lindaに接続

今回はプログラムファイルを1つしか作らないので、ディレクトリを作る必要はありません。好きな場所で作業して大丈夫です。

main.rbというファイルを作り、まずLindaに接続する所まで書いてみましょう。
第一回のJavaScriptのプログラムとかなり似ています。
接続先のタプルスペースはchatと同じです。

main.rb
require 'rubygems'
require 'sinatra/rocketio/linda/client'

linda = Sinatra::RocketIO::Linda::Client.new "http://linda.shokai.org"
ts = linda.tuplespace["room1"]

linda.io.on :connect do
puts "connect!!"
puts linda.io.type
end

linda.wait

実行します
ruby main.rb

connect!!
websocket
接続できた事が確認できたら、ctrl+c で終了します。


Lindaからchatデータを受け取る

タプルスペースに書き込まれたchatの値を読み出して、表示するコードを追加しました。
require 'rubygems'
require 'sinatra/rocketio/linda/client'

linda = Sinatra::RocketIO::Linda::Client.new "http://linda.shokai.org"
ts = linda.tuplespace["room1"]

linda.io.on :connect do
puts "connect!!"
puts linda.io.type

ts.watch ["chat"] do |tuple|
puts tuple[1]
end
end

linda.wait

実行すると、Webブラウザ側で入力したチャットがターミナルに表示されます。
ruby main.rb



音声読上げする

Macには音声読上げソフトが入っています。
say はい
で「はい」と読み上げられるはずです。
読みあげられない場合は、[システム環境設定]→[音声入力と読み上げ]→[テキスト読み上げ]→[システムの声]を日本語(kyoko)に変更してみましょう。

main.rb に音声読上げするコードを追加しました。外部プログラムsayを実行するので、入力値を洗浄しています。
require 'rubygems'
require 'sinatra/rocketio/linda/client'

linda = Sinatra::RocketIO::Linda::Client.new "http://linda.shokai.org"
ts = linda.tuplespace["room1"]

linda.io.on :connect do
puts "connect!!"
puts linda.io.type

ts.watch ["chat"] do |tuple|
msg = tuple[1].gsub(/'/, '') # 入力値を洗浄
puts msg
system "say '#{msg}'" # 音声読上げ
end
end

linda.wait

ruby main.rb
しゃべればokです。

チャットに発言できるようにする

最後に、LindaのタプルスペースにRubyからも書き込めるようにします。

require 'rubygems'
require 'sinatra/rocketio/linda/client'

linda = Sinatra::RocketIO::Linda::Client.new "http://linda.shokai.org"
ts = linda.tuplespace["room1"]

linda.io.on :connect do
puts "connect!!"
puts linda.io.type

ts.watch ["chat"] do |tuple|
msg = tuple[1].gsub(/'/, '')
puts msg
system "say '#{msg}'"
end
end

linda.wait do
line = STDIN.gets.strip
ts.write ["chat", line] if !line.empty?
end

ruby main.rb


やってみよう

音声読み上げ以外にも、何かやってみましょう。
例えば「お腹すいた」とチャットに流れてきたらピザを注文する等

0

Skypeのrubygemをアップデートした

前:Skype API Rubyラッパーのgem作った

gem install skype
https://github.com/shokai/skype-ruby

今v0.2.1になった。

主にrb-appscript廃止と、Chat APIとCall APIのラッパーを作った。

SkypeのAPIは建てまし続けた旅館のようになっていて、素直にラッパーを作ると逆に意味不明になると思ったので俺が欲しい機能を俺が欲しい形式で使えるようにしていく方針。

もちろんSkype.execにSkype APIの文字列を渡せば全機能が使えるようになっているので問題ない。


rb-appscript廃止

新しいmacbook airにrb-appscriptインストールしようとしたらCarbon関係のネイティブがビルドできなくてインストールできなかったのでやめた。
開発停止しているらしいし。
/usr/bin/osascriptに-eでapplescript渡して実行することにした。


Chat APIのラッパー

Skypeはchatを選択するときにIDで指定するんだけど、IDは同じチャットでも人によっては違うIDに見えていたり時間経過で変化してしまっていて、botを作る時に使い勝手が悪かった。

こうなった。
require 'skype'

chat = Skype.chats.find{|c| c.members.include? "shokaishokai" and c.topic =~ /testchat/ }

chat.post "hello chat!!" # 投稿

chat.messages.each do |m|
puts m
end
chatはmessageを受信イベントで受け取れるようにしようか考えている。


Call APIのラッパー

たとえば相手が通話に出た瞬間に切るのはこうやる
require 'skype'

call = Skype.call "shokaishokai"

while !call.talking?
puts call.status
sleep 1
end

call.hangup if call.talking?

0

共有サーバーでも自分の名前でgit commitする

歴史的経緯や運用上の都合で1ユーザーを複数人で使ってるサーバーにアプリを置いてる時に
自分の名前でgit commitしたい。バグ入れた人も追いやすいし。
~/.gitconfigをいじるわけにはいかない。


commit前に

source ~/git_author_change_shokai
すればいいようにした。

中身はこれだけ
export GIT_AUTHOR_NAME="Sho Hashimoto"
export GIT_AUTHOR_EMAIL="hashimoto@shokai.org"

参考:version control – How do I change the author of a commit in git? – Stack Overflow

0

新しいMacbook Airを買ったのでRuby2.0.0-p195をrbenvでインストールした

最近Ruby入れるの苦しい。
Macには1.8.7入ってて最近のgemビルドできないし、rbenvからのインストールが苦しすぎて学部向けの授業教材でRuby使えなくてJavaScriptでやってます。


インストール

brew install 2.0.0-p195

ビルドできたと思ったらエラーでた
The Ruby openssl extension was not compiled. Missing the OpenSSL lib?

エラーでぐぐったら解決法発見
homebrew – OpenSSL error installing ruby 2.0.0-p195 on Mac with rbenv – Stack Overflow

opensslのディレクトリを指定してインストール
CONFIGURE_OPTS="--with-openssl-dir=`brew --prefix openssl`" rbenv install 2.0.0-p195
成功!

いつもどおりrbenvでruby2.0.0が使えるようになった。


digestを使うといつものエラーがでた
/Users/sho/.rbenv/versions/2.0.0-p195/lib/ruby/2.0.0/digest.rb:12:in `const_missing': library not found for class Digest::SHA1 -- digest/sha1 (LoadError)

いつもどおりruby1.9.2を入れて、digest以下をコピーしてくる
cp ~/.rbenv/versions/1.9.2-p320/lib/ruby/1.9.1/x86_64-darwin12.3.0/digest/* ~/.rbenv/versions/2.0.0-p195/lib/ruby/2.0.0/x86_64-darwin12.3.0/digest/


そしたら今度は違うエラーになった
SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

エラーでぐぐったら解決法発見
ruby on rails – SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed – Stack Overflow


brew install curl-ca-bundle

SSL証明書への参照をshellの設定に書いた
export SSL_CERT_FILE=/usr/local/Cellar/curl-ca-bundle/1.87/share/ca-bundle.crt


これで全部動くようになった。

と思ったがrb-appscriptが動かない。

0

shinjuku.rb #18でメタプログラミングについて話した

けどいた人のレベル的にあまり新鮮味は無かったかもしれませんね

内容は

  • skype → method_missing
  • babascript → instance_eval
  • event_emitter → mix-in
です


どうでもいいけどjoker1007さんの眉毛には親近感を覚えた

Shinjuku.rb #18 on Zusaar