2ch画像まとめモバイルをリリース

gioext2009-07-07


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

2ch画像まとめ on Sinatra

自サービスをSinatraに置き換え始めた。

とりあえず2ch画像まとめを置き換え。
ついでに見た目もちょっと変更

http://pic2ch.giox.org/

Sinatra素敵です。


フロントWebサーバーをNginxにしたいなー