SinatraのSessionには注意

SinatraでSessionはこんな風に使えます

enable :sessions
get '/foo' do
  session[:message] = 'Hello World!'
  redirect '/bar'
end
get '/bar' do
  session[:message]
end

SinatraではRackのCookieSessionをつかってるのですが、secretキーを指定していないため、MarshalしてBase64するだけのデータをクッキーに乗せてきます。
このままじゃ書き換えられて大変な事になるので、デフォルトのsessionは有効にせずに、RackのSessionをsecretキーを指定して使うべきではないだろうか。secretキーを指定した場合は、データとdigestをクッキーに乗せてくるので書き換えが検出できます。

use Rack::Session::Cookie,
  #:key => 'rack.session',
  #:domain => 'foo.com',
  #:path => '/',
  :expire_after => 3600,
  :secret => 'change'
get '/foo' do
  session[:message] = 'Hello World!'
  redirect '/bar'
end
get '/bar' do
  session[:message]   # => 'Hello World!'
end


Sinatraの使い方はココに書きました
http://labs.unoh.net/2009/05/sinatra.html

Canvas使ってLanczos試した

「画像をモノクロに変換するブックマークレット」をgetImageDataで再発明 - JavaScriptで遊ぶよ - g:javascript

ここみたらcanvasが面白そうだったので、
以前やったLanczos縮小を試してみた。

とりあえずCanvas#getImageDataはFirefoxOperaでしか動きません。
あと同じドメイン内の画像しか扱えません。


こちらで実際に試せます。
http://file.giox.org/lanczosJS/


ベンチマークにでも使うといいんじゃ。
しかし、意外に速くてビックリした。
JSすごい

JPEGのロスレス回転

JPEGロスレスで回転することができるという話を聞いた。
ロスレスということはデコードしないということ。なんてすごいアルゴリズムなんだと思い、ドキワクしながらぐぐった。


Exif情報のOrientation値を変えればビューアが回転させて見せるだけらしい。
コチラを見ながらやればできるはず。
http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif.html
一気にやる気がなくなったので。メモだけでおしまい。

Lanczos拡縮アルゴリズムの実装

原理

画像の拡大縮小アルゴリズムはいくつか存在します
・ニアレストネイバー
・バイリニア
バイキュービック
・Lanczos-2
・Lanczos-3

この中で理論上最も美しいとされているのはLanczos-3であり、漢はだまってこの方法を選ぶべきなのですが、いくつかの実装では正確な計算がされておらず、もったいない事になっています。
なので今回はできるだけ正確な高品質な画像を目指して実装してみました。
rubyで。

原理的なものはコチラが詳しいです。こんなブログを見るよりお勧め
http://gwaihir.hp.infoseek.co.jp/wiki.shtml?Lanczos%E9%96%A2%E6%95%B0%E3%81%AB%E3%82%88%E3%82%8B%E7%94%BB%E5%83%8F%E3%81%AE%E6%8B%A1%E5%A4%A7%E7%B8%AE%E5%B0%8F

前提

画像のピクセルデータを取得しないといけないのだが、画像のデコードは別の話なので、また今度にします。
今回は無圧縮のPPM形式を使用。
そしてPPM画像を得るためにImageMagickを使った。

convert test.jpg test.ppm

実装

まずはPPMを読み書きする簡単なクラスがコチラ
image.rb

そして拡大縮小するコードがコチラ
lanczos.rb
※このコードは手続きをダラダラ書いただけな上に、とてつもなく遅いので実用性は皆無です。

出力画像

対象はコチラ
対象画像

40%の縮小結果がコレ
結果画像

綺麗ですよねー?

最後に

遅すぎ。rubyでやるもんじゃない。

書き方が面倒

いつも忘れるのがform_tagの書き方。

<% form_tag :controller => "top", :action => "list" do %>
<%= end %>

みたいな。

いちいち調べるのもダルいし、
理解してないからルーティング関係のエラーもかなりでる。
なので

<% form_tag(url) do %>
<%= end %>

と直接URLを指定する。
form以外でもrailsっぽい書き方はしない。

そんな間違ったRailsライフ