(第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


やってみよう

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