ためしにクラシックなWebチャットを作ってみることにする。
sinatra, redis をインストール。
gem と brew で入れる。
gem install sinatra sinatra-contrib redis hiredis --no-ri --no-rdoc -V
brew install redis
redis サーバを起動
特に難しく考えずデフォルト設定で起動する。
redis-server
port 6379 で起動しています。
irb で redis につなげることを確認
簡単!
irb> require 'redis'
irb> rd = Redis.new host:"127.0.0.1", port: "6379"
irb> puts rd.keys
[]
irb> rd.set :hello, "world"
irb> rd.keys
=> ["hello"]
irb> rd.get :hello
=> "world"
でもリスト系の操作はけっこう癖がある。これは redis 側の癖のようだ。
リストの「右に追加する」「左に追加する」「右から取り出す」みたいな。スタックの概念を上下にしなかったのがとても新鮮。
キューでもスタックでもナチュラルに理解できる。うまいなぁ。
アプリを作成
実は sinatra も全然知らないのである。
URL構成
-
/main
- ログを表示する
- 発言フォームを表示する
-
/talk
- ログに追記する
- /main へリダイレクトする
テンプレートは erb とする。
作成する
- 名前をセッションに入れる。
- 表示は10件まで
- 発言は一行のテキストで無限に redis のリストに突っ込む。
mychat.rb
require 'sinatra'
require "sinatra/reloader" if development?
require "rdiscount"
require "redis"
redis = Redis.new host:"127.0.0.1", port:"6379"
configure do
enable :sessions
end
get '/main' do
@name = params[:name]
@logs = redis.lrange :logs, 0,9
erb :main
end
post '/talk' do
msg = params[:msg]
session[:name] = name = params[:name]
redis.lpush :logs, sprintf("[%s] : %s" , name, msg)
redirect '/main'
end
views ディレクトリを作成し、main.erb を作成する。
views/main.erb
<form action="/talk" method="post">
<input type="text" name="name" value="<%= session[:name] %>" size="10">
<input type="text" name="msg" value="" size="80">
<input type="submit" value="送信"/>
</form>
<hr/>
<% @logs.each do |log| %>
<p><%= log %></p>
<% end %>
実行する
ruby mychat.rb
html ヘッダすらないし、ログを無限に格納していくのですぐ破綻するけど、とにかく動いた。