今日は一日洗濯していた。
洗濯して思ったのだけど、実家暮らしや嫁さんがいるのならともかく、独り暮らしだったら週休二日は必要だなーと。お休みがまるまる一日家事でつぶれるからね。もちろん、家事をさぼって二日ごろごろしてもいいのだけど、それはそれで後で泣きを見るわけで。社会の分断、個人主義化、核家族化、そういったものが週休二日制を後押ししたのだなとなんとなく考える。
そのついでに、ちょっとWebアプリを作って遊んだ。
最近のつぶやきを取得して、つぶやきに費やした文字数の平均を出すだけの、ほんの Hello! World な内容だけど、やってみるといろいろ細かいところで躓くものだ。
#start.rb
require 'rubygems'
require 'sinatra'
require 'oauth'
require 'twitter'
helpers do
include Rack::Utils
alias_method :h, :escape_html
end
configure do # 初期化
use Rack::Session::Cookie, :secret => Digest::SHA1.hexdigest(rand.to_s)
KEY = "***********"
SECRET = "************"
set :public, File.dirname(__FILE__) + '/public'
end
before do
if session[:access_token]
twitter_oauth = Twitter::OAuth.new(KEY, SECRET)
twitter_oauth.authorize_from_access(
session[:access_token], session[:access_token_secret])
@twitter = Twitter::Base.new(twitter_oauth)
else
@twitter = nil
end
end
def base_url
default_port = (request.scheme == "http") ? 80 : 443
port = (request.port == default_port) ? "" : ":#{request.port.to_s}"
"#{request.scheme}://#{request.host}#{port}"
end
def oauth_consumer
OAuth::Consumer.new(KEY, SECRET, :site => "http://twitter.com")
end
get '/' do
erb %{ <p><a href="/request_token">Please Login via Twitter OAuth</a></p> }
end
get '/request_token' do
callback_url = "#{base_url}/access_token"
request_token = oauth_consumer.get_request_token(:oauth_callback => callback_url)
session[:request_token] = request_token.token
session[:request_token_secret] = request_token.secret
redirect request_token.authorize_url
end
get '/access_token' do
request_token = OAuth::RequestToken.new(
oauth_consumer, session[:request_token], session[:request_token_secret])
begin
@access_token = request_token.get_access_token(
{},
:oauth_token => params[:oauth_token],
:oauth_verifier => params[:oauth_verifier])
rescue OAuth::Unauthorized => @exception
return erb %{ oauth failed: <%=h @exception.message %> }
end
session[:access_token] = @access_token.token
session[:access_token_secret] = @access_token.secret
redirect '/count'
end
get '/count' do
redirect '/' unless @twitter
@length = 0
@count = 0
@twitter.user_timeline.each do |twit|
@count = @count + 1
@length = @length + twit.text.split(//u).length
end
erb %{ <p><%=h @length * 1.0 / @count %> characters/tweet !</p> }
end
ほとんどまるまる http://www.machu.jp/diary/20090818.html#p01 を参照させていただいた。
Consumer Key と Consumer Secret の値は、
Twitter / Applications http://twitter.com/oauth_clients/
で取得できる。
追加でやったことは以下の3点。
1. レイアウトを利用
レイアウトを /views/lauout.erb へ作成。サイト共通の部品をまとめておける。独自の内容は、 <%= yield %> のなかへ挿入される仕組み。テンプレートエンジンは、今回は ERB で。そんなにたいそうな量じゃないしね(スタイルシートすら埋め込みだ!)。
#/views/lauout.erb
<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang='ja-JP' xml:lang='ja-JP' xmlns='http://www.w3.org/1999/xhtml'>
<head>
<title>Tweet Average - How much characters do you use in a tweet ?</title>
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=no">
</head>
<body style="">
<div style="width: 300px; margin-left: auto; margin-right: auto; font-family: Meiryo, Sans-Serif; font-size: 12pt; background: url(/image/frontpage-bird.png) no-repeat right top;">
<div id="header" style="border-bottom: 1px solid gray; padding-top: 1em; padding-bottom: 1em;">
<h1 style="font-size: 16pt;"><a href="/" style="text-decoration: none;">Tweet Average</a></h1>
<p style="font-size: 9pt;">How much characters do you use in a tweet ?</p>
</div>
<div id="content" style="padding: 1em;">
<%= yield %>
</div>
<div id="footer" style="border-top: 1px solid gray; padding-top: 1em; font-size: 9pt;">
<p>code by <a href="http://twitter.com/daruyanagi">daruyanagi</a>;
powered by <a href="http://www.sinatrarb.com/">sinatra</a>.</p>
</div>
</div>
</body>
</html>
2. set :public, File.dirname(__FILE__) + ‘/public’
スタティックなファイルを参照する場合、このように公開フォルダを指定しておく。たとえば、デフォルトでは /image/sample.png を参照しようとしても、 Sinatra がルーティング、メソッドを探そうとしてエラーになる。そこで、公開フォルダ(/public)を指定しておく。そうすれば、/public/image/sample.png で参照できるようになる。
これは、レイアウトのスタイルシートで背景画像を参照する時に利用した。
3. iPhone 対応
メタタグで iPhone でのレイアウトを調整。これには、 ViewPort という仕組みがあるそうだ。ほうっておくと、iPhone は横幅980pxとみなしてレンダリングしようとするので、それを抑制する(ちなみに、Webページは幅300pxで作ってある。これだと、ちとPC向けが厳しい感じだw)。
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=no">
詳細は http://www.projectdd.jp/2008/07/viewport_sample.html を参照。
—
あとは、なんという話題でもないけど、文字数のカウント。
twit.text.split(//u).length
ruby にはバイト数のカウントをする size、length があるけれど、文字数をカウントすることはできないようだ。なので、文字でスプリットして、返ってきた配列の数を数えている。 ruby では定番の処理のようだ。
ソースコードは BOMなしの UTF-8 で保存して、 ruby -Ku start.rb で実行。
- Newer: 昨日のWebアプリをブラッシュアップ!
- Older: 位置を、残そう。

