2ch画像まとめモバイルをリリース
Androidも発売間近でスマートフォンの時代がきますね。
今後は個人的には携帯サイトは作らないだろうなぁということで、記念に作成しておきました。
特徴は以下の通り
- 3G専用サイト
- 今まで見れなかった画像スレの画像が携帯で見れる。かもしれない
- 面白画像を壁紙等に使える。かもしれない
- 絵文字等一切使わない、男気溢れるシックなデザイン
- VGA端末を考えもしない適当な仕様
- 通報ボタンによる閲覧者ガード
- エロ/グロに対するより大きな精神的ダメージ
よろしければ、使ってみて下さい。
http://p2m.giox.org/
SinatraでFlashをつかう
Flashっていうのは、次以降のリクエストで一回だけ使えるメッセージ的なやつです。
これもSinatraっていうかRackのミドルウェアです。
ってかRackがすげー。まだまだ使えるミドルウェアが多そうですね
# github sudo gem install nakajima-rack-flash
require 'rubygems' require 'sinatra' require 'rack/flash' get '/' do flash[:msg] = 'Hello World' redirect '/a' end get '/a' do flash[:msg] end configure do use Rack::Session::Cookie, :secret => 'change me' use Rack::Flash end
これくらいの機能なら自分で実装するのもありかもしれません
SinatraでCSRFのチェック
SinatraっていうかRackのミドルウェアでありました。
sudo gem install rack_csrf
# app.rb require 'rubygems' require 'sinatra' require 'rack/csrf' get '/' do @msg = 'Hello World' erb :index end post '/' do @msg = 'Hello CSRF' erb :index end configure do set :app_file, __FILE__ use Rack::Session::Cookie, :secret => 'change me' use Rack::Csrf, :raise => true end helpers do def csrf_token Rack::Csrf.csrf_token(env) end def csrf_tag Rack::Csrf.csrf_tag(env) end end # views/index.erb <%= @msg %> <form name="a" method="post" action="/"> <%= csrf_tag %> <input type="text" name="name" /> <input type="submit" value="go" /> </form>
チェックしたくない時は:skipを指定
use Rack::Csrf, :raise => true, :skip => ['POST:/']
Sinatraのパフォーマンスアップ作戦
自サービスを続々とSinatraってます。
その際、パフォーマンスアップを狙い、Memcached(+memcache-client)を利用した、Railsのフラグメントキャッシュライクに使えるExtensionを書きました。
使い方やコードはコチラにあります
http://github.com/gioext/sinatra-memcache/tree/master
使い方
# start memcached cd myapp git clone git://github.com/gioext/sinatra-memcache.git lib/sinatra-memcache
# app.rb require 'rubygems' require 'sinatra' require File.dirname(__FILE__) + '/lib/sinatra-memcache/lib/sinatra/memcache' # ページキャッシュのように使ったり get '/cache1' do cache 'cache1' do sleep(5) 'Hello Cache1' end end # 引数で有効時間や圧縮の設定したり get '/cache2' do cache 'cache2', :expiry => 10, :compress => true do sleep(3) 'Hello Cache2' end end # オブジェクトをキャッシュしたり get '/obj' do hash = cache 'obj' do sleep(2) { :a => 'Hello Object' } end hash[:a] end # キーや正規表現でキャッシュを消したり get '/expire' do expire 'cache1' expire /^cache/ expire // 'Hello Expire' end # デフォルトのオプション # 開発時はキャッシュ無効が吉 # configure :development do # set :cache_enable, false # end configure do set :cache_server, 'localhost:11211' set :cache_namespace, 'sinatra-memcache' set :cache_enable, true set :cache_logging, true end
試してないですがMemCache互換のAPIを持つTokyoTyrant等でも動くと信じてます
おしまい
Atomフィードの出力方法
Sinatraでbuilderを使ってAtomフィードを出力する方法です。
何故かドキュメントに記述されてないので、メモ代わりに。
# ./app.rb require 'builder' get '/feed' do @entries = DB[:entries].reverse_order(:id).limit(10) content_type "application/atom+xml" builder :feed end helpers do def atom_time(date) date.getgm.strftime("%Y-%m-%dT%H:%M:%SZ") end end
# ./views/feed.builder port = request.port == 80 ? '' : ':' + request.port.to_s base_url = request.scheme + '://' + request.host + port xml.instruct! :xml, :version => "1.0" xml.feed(:xmlns => 'http://www.w3.org/2005/Atom') do xml.id base_url + '/' xml.title "title, change me" xml.updated atom_time(@entries.first[:updated_at]) xml.link(:rel => 'alternate', :href => base_url + "/") xml.link(:ref => 'self', :href => base_url + "/feed") xml.author do xml.name "author, change me" xml.uri "uri, change me" end @entries.each do |entry| xml.entry do xml.id "tag:" + base_url.gsub("http://", "") + "," + entry[:created_at] xml.title "title, change me", :type => 'html' xml.published atom_time(entry[:created_at]) xml.updated atom_time(entry[:updated_at]) xml.link(:rel => 'alternate', :href => "url, change me") xml.content "content, change me", :type => 'html' # xml.summary "summary, change me", :type => 'html' end end end