あまり、ネットで検索しても出てこないのでメモ。Railsのセッション(Cookie)はブラウザーが終了すると消えてしまう。で、ブラウザーが終了した後も残す方法だが、以前のRails(おそらく2.2以前)だと、environment.rbあたりに次のように書く。
ActionController::Base.session_options[:session_expires] = Time.local(2009, 1)
詳しくは以下のサイトにある。
sessionに有効期限を設定する時の試練 – ザリガニが見ていた…。
が、やってみても思ったようにいかず、ブラウザーを終了するとセッションも失われてしまう。いろいろとネットを検索してみたところ、次のページにたどりついた。
Active Record Session expiration in Rails 2.3 – Ruby on Rails: Talk | Google グループ
いわく、
Oh, I found the reason
:session_expires has been replaced by :expire_after.
とのこと。確認していないが、expire_afterてことは、最後にアクセスしてからの有効期間が指定出来るのだろうか?
(追記)↑出来るようです。リロードするたびにCookieのexpire日次が更新されてます。
Handbrakeを使うとISO→mp4変換ができるのだが、字幕や音声を手動で選ぶのは面倒なのでスクリプト作ってみました。常時起動しているLinuxなどでcron起動すると寝ている間に勝手に変換してくれ、iPhone/iPod touchに入れて持ち歩けます。
rubyの実行環境とコマンドライン版Handbrake(Linux版を想定だがWindowsでも動くかも)が必要です。使い方はとても簡単で、拡張子が”ISO”のファイルを引数(複数可)にして起動するだけ。
音声と字幕の選択ロジックは、次の通り。私の場合、これでだいたいいけます。英語の勉強をするので英語の字幕がいる、字幕なんていらないと言う人はちょっと修正が必要ですな。
二日目もほとんど最後まで出席しました。終わってから思ったのは発表者の選定がRubyの全分野を網羅するようにものすごく考えられていたこと。おかげで二日間聞いているとRuby全般についてかなり網羅できたと思う。ま、消化が大変なわけだが。
これだけのコミュニティに成長したRubyを育てた松本さんももちろんすごいのだが、これだけのコミュニティを育てたRubyコミュニティの人にも本当に頭が下がる思いです。またRubyKaigiを運営したスタッフの皆様おつかれさまでした。
RubyKaigiでの田中さんのセッションの「Matzを説得する方法」の中で出てきた言葉。可能な限りシステムで自動調整させてユーザーの負担を減らすべし!ということだろう。
また名前にはものすごいこだわりがあって、機能ははっきりしていても名前が決まらないと実装されないらしい。
週末はRubyのカンファレンスRubyKaigi2008に参加するために「つくば」まで来てる。つくばエクスプレスって早いですなー。朝は少し寝坊したものの、1日目はほぼすべてのセッションを聞いて懇親会まで参加。そして家に帰るのが面倒なのでビジネスホテルに宿泊。←今ここ
当日の詳しい様子は次をどうぞ。
RubyKaigi2008 スペシャル★レポート:RubyKaigi2008 1day Photoレポート[随時更新]|gihyo.jp … 技術評論社
松本さんの基調講演の質問タイムでささださんの「Matzにっきはどうしたのか?」の質問に会場から拍手。Rubykaigiのエントリーから再開するとかしないとか。
面白いという意味ではライトニングトークスが一番面白かったし感動したし共感した。他にはMacを使ってのデモをまじえてのプレゼンが異常にスムーズな人が何人かいてとても感動。
またメインセッションの会場で参加者(会場では無線LANが提供)によるまるでニコニコ動画のようなつっこみチャット(IRC)がメインのスクリーンの横の小さなスクリーンでリアルタイムで表示されていたのがかなり良かった。
懇親会では、いろいろな人に「仕事でRuby使ってますか?」と聞いてみたところ、「まずは社内システムから」とかやはりパフォーマンスで手こずるとかいろいろ。
というわけで今から朝ご飯食べて2日目に参加。
仕事で久しぶりにPerlのスクリプトを書きました。最近は仕事でも自分しか使わないスクリプトは全部Rubyで書いているのでちょっとリハビリが必要。以下、当たり前ですが、
ここを参考にしました。
まったく容赦なくセミコロンが抜けまくりです。が、すぐに勘が戻ってきました。ふー。
RubyでWILLCOMから取り出した電話帳データのCSVの処理を書いたのだが、ちょっと面白い処理があった。読み込んだCSVは読みとかグループとかいらない情報が多いので、電話番号とかメアドとかいる情報だけ抜き出したい。次のような何列目に必要なデータがあるかを格納したハッシュとCSVから抜き取った2次元配列から、
target = { :name => 1, :phone => 3} csvarray = [["hoge", "", "070-1111-2222"], ["huga", "", "080-2222-3333"]]
次のようなハッシュの配列に変換したい。
[{ :name=>"hoge", :phone=>"070-1111-2222"}, { :name=>"huga", :phone=>"080-2222-3333"}]
最初に書いたのがこれ。
# pattern 1 Array#each + Hash.each a = [] csvarray.each do |r| h = {} target.each{|k,v| h[k] = r[v-1]} a < < h end pp a
Array#mapを使ってこれを1行にするとこうなる。
# pattern 2 Array.map + Hash.each pp csvarray.map{|r| h = {}; target.each{|k,v| h[k] = r[v-1]}; h}
で、それをinjectでやる方法を見て感動して改良したのがこれ。
# pattern 3 Array#map + Array#inject pp csvarray.map{|r| target.keys.inject({}){|h,k| h.merge k => r[target[k]-1]}}
せっかくのハッシュなのにキーで抜いてきてまたブロック内でまたtarget[k]にアクセスしているのがちょっと残念なのでHash#mapを使ってみる。2次元配列をflattenで1次元配列に変換して*で多重代入にしてHash[]でハッシュを作成している。
# pattern 4 Array#map + Hash#map pp csvarray.map{|r| Hash[*target.map{|k,v| [k, r[v-1]]}.flatten]}
苦しい、苦しいです。Hash#injectなんてあるのかよと思ったが、HashもEnumerableだからあるんです。ブロックパラメーターpにはkeyとvalueが配列で格納される。
# pattern 5 Array#map + Hash#inject #1 pp csvarray.map{|r| target.inject({}){|h,p| h.merge p[0] => r[p[1]-1]}}
これはpを(k, v)で受ければよさそうということでたどり着いたのがこれ。美しい!
# pattern 6 Array#map + Hash#inject #2 pp csvarray.map{|r| target.inject({}){|h,(k,v)| h.merge k => r[v-1]}}
でも、結局pattern 2が一番長さが短いのね。ちょっとがっくり。これだけでも結構遊べました。Rubyって面白いですねー。
前にSIM氏も絶賛していたし、昨日もAR氏もなかなかいいといっていたのでNetBeansを入れて試してみた。以下、メモ
SQLite3を使ってからというものすっかりサーバー起動が不要なファイル形式が好きになってしまった。もはやcreate dbもcreate tableも打たなくてもいいのはものぐさな私としては実に魅力的。100件ぐらいしか入っていない開発用DBにクラサバのリレーショナルDBなんて100年早いわっなどと思う。しかも勝手にSQLite3やDerbyって簡易的なDBだから相関副照会やOuter Joinって使えないと思っていたら問題なく使えるようだ。
さて肝心のIDEの機能だがちょっと触ってみた感じではEclipseっぽくコード補完もしてくれるしなかなかである。そのうちRails 2にも対応するでしょう。それにしても家の24インチのモニターでIDEが動いているのを初めて見たのだがとってもステキでした。
Ruby談義をということでNAIST時代のAR氏と新宿でタイ料理。確かザガットサーベイにも載っているピッチーファーというタイ料理店なのだがいつのまにか広い2号店が出来ておりその2号店で食事。その名もピッチーファー2th。英語がさほど得意でもない私でもそれって2ndの間違いでは?とつっこみたくなる。”2th”なる単語があるのかと思い検索してみたらこの店のページが1番上だった。うーん。
で、Rubyだけでなくいろいろとディープな話をしてたらあっという間に終電の時間。とても楽しかったです。それにしても2軒目に行ったドイツのビールの店は高かった。おいしかったけど。で、その店でドイツワインの赤というものをはじめて飲んだらなかなかだった。実は有名なのだろうか?
何かと話題な本なのでプチッとクリックして英語版を買って積読していたのだが、昨年末に本屋で日本語版を見つけて泣きながらレジに…。
主張は、「インターネットでWebサービスを公開するんだったら、メソッドを公開するよりも、 URIにマッピングしてリソースをいろいろ公開したほうがいいよ。そうすると、リソースにブックマークできるし、URLを他人に知らせることが出来るし、リソース同士で相互にリンクも張ることでプログラムがリンクをたどれるし。あとHTTPにはちょうどいい感じでCRUD(Create, Read, Update, Delte)に相当するメソッド(Post, Get, Put, Delete)があるから、公開するリソースへのアクセスはこれらのHTTPのメソッドを使ってさ。で、このコンセプトをROA(Resource Oriented Architecture)と呼ぼうぜ!」といったところか。
これを読むと沸々と「リソースに全部URIをつけて公開するのはいいと思う。意味のあるURLは分かりやすいし。そう思うとWebサービスでない普通のWebアプリもこの規約に従えば、いいことはあっても悪いことはないのではないだろうか?さしてポリシーも無くURLを決めるぐらいだったら、WebアプリでもURLに関してはRESTfulにしちゃってもいいのでは?後でそのままWebサービスとして公開するのも簡単だし。」
などと思ったりしていたのだが、Railsはすでにそうなっていた。以下、Rails2 PDFより
Rails 2 makes no apologies for its all-in attitude about RESTful development and replaces the standard script/generate scaffold with the scaffold_resource functionality from 1.2. The general attitude seems to be “Why wouldn’t you want to create RESTful scaffolding?”.
There’s not much not to like with the RESTful generation – giving you RESTful forms in the view templates and the appropriate RESTful structure in your controllers.
教訓:英語版の技術書を買うんだったら和訳が出るまでに読みきらないと悲しい結果になる
最近、Rubyという言語とRuby on Railsというフレームワークにはまって趣味で勉強してたりするのだが、いかんせん周りにほとんど詳しい人がいないのでつまらん!というわけで週末にRails勉強会なるものに参加してきました。
勉強会の流れは前半と後半2つのセッションにわかれており、事前あるいは当日にみんなで議論してセッション内容を決め、希望者に合わせて前半、後半の時間割と部屋割りをその場で決めてそれぞれ自分の好きなセッションに参加できる形式。運営は非常に完成度が高く初参加の私でも気持ちよく参加できました。
前半のセッションは、Yuumi3さんの初心者セッションに参加。パソコンの無い私は教科書を忘れた小学生のようにテスト駆動開発で有名なt-wadaさんのパソコンで見せてもらう。どうもです。>t-wadaさん。先生を入れて4人という少人数なのでいろいろ聞けました。以下、独学ではなかなか学べない収穫。
後半のセッションは、ほぼ全員が目当てにしている笹田さんの1.9の基調講演セッション。やはり1.9.1はクリスマスに出るとのこと。その他、細かい言語使用をどうするかについての熱い議論。一番、おおっと思ったのはブロックパラメーターがブロックローカルになるとかそのあたりの話。
それにしても一人で知り合いもいない趣味の集まりに行ったのははじめてかも。