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