第17回

第17回Asakusa.rb(2009-09-08)

松田さん抜きで決行された、記念すべき回でした :)

日時

2009/09/08 19:30~22:00ぐらい

場所

永和システムマネジメント 東京支社http://www.esm.co.jp/company/map_tokyo.html

内容

特にテーマがなければ、個人的にはSinatraで遊んでみたいです。

ursmは本業が盛り上ってるので参加はむつかしいと教えてもらいました。 アーリーアダプターだったので、参加してもらえると面白くなったと思うのですが。

結局、お忙しい中ウラシマさんにも参加いただきました :)

参加者

Sinatraで書かれたブログツールScantyのソースを読む&動かす&Herokuにデプロイしてみる

ソースコードの入手

  • ソースはどこ?

  • とりあえず git cloneしよう!

    • git clone git://github.com/adamwiggins/scanty.git
  • 動作に必要なgemはsinatraだけ。まだ入ってなかったら入れよう

    • gem install sinatra --no-ri --no-rdoc
    • sinatra以外に必要なライブラリ(Markdown記法を実現するMaruku, データベースライブラリSequel, シンタックスハイライトライブラリSyntax)は、vendorディレクトリ以下に入っているのでインストール不要

動かしてみよう!

  • scantyディレクトリでruby main.rbと叩けばWebサーバが起動
  • http://localhost:4567/ にアクセスして動くことを確認

    • 違うポートで起動したいときはruby main.rb -p 8080とかする
    • その他のオプションはsinatra/main.rbを見てね

ソースコードを読む

  • じゃあmain.rbから読んでいこうか
  • Sinatraのコードを読むならチュートリアルも読んでおくと吉
configureブロック
  • 起動時に1回だけ実行されるらしい
  • Sequelで環境変数DATABASE_URLが指定されていたらそこへ、設定されていなければsqlite://blog.dbへ接続

    • この書き方は定石?
  • OpenStructクラスって何?

errorブロック
  • 例外を捕捉したときに実行されるらしい
  • requestという変数はどこから来たの?

    • これは変数じゃなくてアクセサ
    • Sinatraのsinatra/base.rbで、class Base内に「attr_accessor :env, :request, :response, :params」って定義があった
require 'post'って何だ
  • Scantyのlib/post.rbにPostクラス(モデルクラス)の定義が書いてあって、それを読み込んでる
  • post.rbはあとで読もう
helpersブロック
  • ヘルパメソッドを定義するブロック。ここで定義したメソッドは、ルートハンドラ(あとで出てくるgetブロックやpostブロック)とかテンプレートとかから呼び出すことができる
layout 'layout'って何だ
  • レイアウトの指定。レイアウトとは、他のテンプレートが表示されるたびに使われるテンプレートのこと
  • デフォルトでlayoutという名前のテンプレートがレイアウトに指定されるので、これ必要?
ルートハンドラ(getブロックやpostブロック)
  • HTTPの対応するメソッドで指定したURLにアクセスしたときの挙動を定義するブロック
  • 「get '/'」は、そのサイトのトップにHTTPのGETメソッドでアクセスが来たときの挙動を定義する

    • 「posts = Post.reverse_order(:created_at).limit(10)」とあるので、モデルクラスPostで指定するデータベースを日付順で逆ソートし、上位10件を取ってきている
    • そして次の行「erb :index, :locals => { :posts => posts }, :layout => false」で、テンプレートとしてindex.erbを利用して、ローカル変数としてpostsを渡して、レイアウトを使わずに描画する、と指定している
    • Sinatra分かりやすい!
  • get '/past/:year/:month/:day/:slug/'の「:year」ような「:」で始まるのは「名前つきパラメータ」。paramsハッシュでその値を参照できる

    • しかし「:year」も「:month」も「:day」も使ってないじゃん‥‥
    • 「:slug」って何だ
    • ブログの個別エントリのpermalinkを示す文字列のこと。はてなとかで「/20090908/p1」とかなる「p1」の部分ね
    • というか「post = Post.filter(:slug => params[:slug]).first」っていう実装になってる!これはひどい!
    • ブログ全体で同じslug名のエントリがあると、新しいエントリのほうが参照できなくなっちゃう。大変残念な実装。「p1」というslug名は絶対ダメ
    • 名前つきパラメータって正規表現でマッチする条件を指定できたりする?
    • できるみたい。チュートリアルの「正規表現を使ったルート」参照。
  • '/past/:year/:month/:day/:slug'を'/past/:year/:month/:day/:slug/'にリダイレクトしているのは何故?

    • URLの一番最後に「/」をつけてもつけなくても同じリソースにアクセスできるようにするため
    • そのまま表示するのでなくリダイレクトするのは、SEO対策でリソースを表示するpermalinkを固定したいから?
    • しかし統一するなら「/」をつけないほうにリダイレクトしたほうがよくね?
  • '/rss'を'/feed'にリダイレクトしているのは何故?

    • RSSリーダーによってはフィードURLを「/rss」決めうちしているものがあるのかも?
    • atomを返すのにrssというのはどうよ
  • '/past'が全エントリを表示しちゃう実装なのはどうよ

    • ページ数が増えてくると破綻しそう
    • Paginateのしくみはないの?
    • sinatra-dm-paginateというのがあるらしい
viewsテンプレート
  • テンプレートファイルはデフォルトではviewsディレクトリに置く

  • レイアウトではyieldを書いておくとそこに差し込まれるみたい

  • ここではHTMLの生成にはerbを、XMLの生成にはbuilderを使っているみたい

  • フィードの取得がトップページでしかできない(index.erbにはフィード指定があるのにlayout.erbにはない)のはどうよ

  • というかhaml使う?hamlで書き直してみる?

publicディレクトリ
  • デフォルトでは静的なファイルをここに置いておけば参照できる

モデルクラスpost.rb
  • Sequel::Modelを使ってる
  • あんまり特筆すべきところはないかな

    • to_htmlメソッドの定義あたりでSyntaxでRubyのコードをハイライトしてたりMarukuでmarkdown記法に対応してたり

Scantyをいろいろいじってみる

deleteの実装
  • さすがに削除できないのはどうよ
  • とりあえずdeleteメソッドでエントリを削除する簡単な実装をしてみる
Ruby1.9で動かす
  • Rails同様、マジックコメントの関係で日本語が厳しいみたい

Herokuにデプロイ

その他雑談

  • JRuby on Android
  • Snow Leopard
  • Gentoo Linux

終了後の雑談

  • (RubyWorld Conferenceから戻られたばかりの)かくたにさん、及川さんを加えてHUB 上野しのばず通り店にて

    • Kinesisのキーボード
    • きれいなコード
    • RubyWorld Conference
    • ラブプラス

Sep 2, 2009 From: shintaro@k...

かくたにです。

来週のAsakusa.rbの当日、私は http://www.rubyworld-conf.org/

松江にいっている(というか戻りの機内)ので、参加できません。

松田さんも参加予定のはずで、ささださんは講演者です。

場所については、takkanmかursmが何とかしてくれれば何とかなると

思うのですが、いかがでしょう?

個人的には、毎週火曜日はAsakusa.rbの日、とゆーことで

開催してもらえるといいなー、と思ってます :)

自分の課題を黙々とやったり相談したり雑談したり、

という時間の過ごしかたでもよいと思うのですが。

ご意見お待ちしております。

  • -

{ :name: "Shintaro"create,

:email: shintaro.kakutani@g..., :website: http://kakutani.com/ }

Sep 2, 2009 From: gunjisatoshi@g...

郡司です。

来週も参加希望です!

特にテーマがなければ、個人的にはSinatraで遊んでみたいです。

場所についてはご迷惑でなければ引き続きお世話になりたいところですが、

新規開拓もしたいところですねえ。

2009年9月2日1:16 KAKUTANI Shintaro <shintaro.kakutani@g...>:

かくたにです。

来週のAsakusa.rbの当日、私は http://www.rubyworld-conf.org/ で 松江にいっている(というか戻りの機内)ので、参加できません。 松田さんも参加予定のはずで、ささださんは講演者です。

場所については、takkanmかursmが何とかしてくれれば何とかなると 思うのですが、いかがでしょう?

個人的には、毎週火曜日はAsakusa.rbの日、とゆーことで 開催してもらえるといいなー、と思ってます :)

自分の課題を黙々とやったり相談したり雑談したり、 という時間の過ごしかたでもよいと思うのですが。

ご意見お待ちしております。

  • -

{ :name: "Shintaro"create,

email
shintaro.kakutani@g..., :website: http://kakutani.com/ }
  • -

archive-> http://qwik.jp/asakusarb/68.htmlML-> asakusarb@q...

Sep 4, 2009 From: shintaro.kakutani@g...

かくたにです。

郡司さんが参加希望なんだけど、来週の火曜日ってどうですかね? > takkanm

ursmは本業が盛り上ってるので参加はむつかしいと教えてもらいました。

アーリーアダプターだったので、参加してもらえると面白くなったと思うのですが。

2009/9/2 Satoshi GUNJI <gunjisatoshi@g...>:

郡司です。

来週も参加希望です! 特にテーマがなければ、個人的にはSinatraで遊んでみたいです。

場所についてはご迷惑でなければ引き続きお世話になりたいところですが、 新規開拓もしたいところですねえ。

2009年9月2日1:16 KAKUTANI Shintaro <shintaro.kakutani@g...>:

かくたにです。

来週のAsakusa.rbの当日、私は http://www.rubyworld-conf.org/ で 松江にいっている(というか戻りの機内)ので、参加できません。 松田さんも参加予定のはずで、ささださんは講演者です。

場所については、takkanmかursmが何とかしてくれれば何とかなると 思うのですが、いかがでしょう?

個人的には、毎週火曜日はAsakusa.rbの日、とゆーことで 開催してもらえるといいなー、と思ってます :)

自分の課題を黙々とやったり相談したり雑談したり、 という時間の過ごしかたでもよいと思うのですが。

ご意見お待ちしております。

  • -

{ :name: "Shintaro"create,

email
shintaro.kakutani@g..., :website: http://kakutani.com/ }
  • -

archive-> http://qwik.jp/asakusarb/68.htmlML-> asakusarb@q...

  • -

archive-> http://qwik.jp/asakusarb/68.htmlML-> asakusarb@q...

KAKUTANI Shintaro

http://kakutani.com

Sep 4, 2009 From: takkanm@g...

ミムラ aka takkanm です。

2009年9月4日11:10 KAKUTANI Shintaro <shintaro.kakutani@g...>:

郡司さんが参加希望なんだけど、来週の火曜日ってどうですかね? > takkanm

今のところ、問題ないです。sinatraは初心者です。

以上です。

END

  • Close