Archive for category Ruby

shinjuku.rb #1 で発表しました

西新宿某所で行われた shinjuku.rb #1 に行ってきました。幸運にも滑り込めたのでLTさせていただくなどしました。

Introduction to the Sinatra Book

スライドは Samurai と言いたいだけなんですけれど、 Sinatra: up and running 、良い本です。

Sinatra: Up and Running

著者/訳者:Alan Harris Konstantin Haase

出版社:Oreilly & Associates Inc( 2011-12-06 )

ペーパーバック ( 103 ページ )


スライドの通り電子版(オライリーコムから買えます)もいい感じです。ぼくはおじさんなので紙の方が読みやすいけど。。。

結構発表自体にも反応がいただけて、おもしろそう! と思っていただけたんですが(not ステマ)、でもやっぱり英語の壁がちょっと高いなあと思っている方も多いようです。なので、オライリ~さんの担当の方とつながりがある方で、ぜひ @udzura ってやつがいるよ、と紹介していただければ、やる気だけはあります(能力と時間は置いといて……)。

他の発表、みなさん素晴らしい発表で、特に @jugyo さんのツールがクールだと思いました。ぼくはそのすぐ後に発表しすいません感が、ウッ

Railsレシピブックは RVM に詳しくなりました。今後、レシピごとに担当者を決めつつ読んでいくと良さそうな気がします。

偶然、来週から西新宿に縁深い身となりますので、今後も色々やっていきたいですね。

 

Classic Sinatra で、インラインテンプレートを別のファイルにまとめる

Time to Read

1分

ご存知のとおり、 Classic シナトラ~ はルーティングを定義したファイルの __END__ の後ろにテンプレートを書いていくことができる 。クイックハック感があるが便利。

だが、 Classic Sinatra のアプリケーションが若干大きくなってくると、ルーティング自体+ __END__ の後ろのテンプレート、ということでファイルが2倍のスピードで肥大したりすると思う。かといって、意外と view フォルダを掘るのって億劫だったりする。

実は、「enable :inline_templates」を宣言したファイルにテンプレートを書いておけば、読みこんでくれるので、以下のようにファイルを分けられる。

app.rb:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
require 'sinatra'
require 'haml'
 
require './templates'
 
get '/' do
  haml :index
end
 
get '/foo' do
  haml :foo
end
 
get '/:name' do
  @name = params[:name]
  haml :greet
end

templates.rb:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
enable :inline_templates
$stderr.puts "templates are loaded."
 
__END__
 
@@ layout
!!! 5
%html
  %head
    %title= "Sample: #{request.path}"
  %body
    = yield
 
@@ index
%p Hello, separate templates.
 
@@ foo
%p this is template foo
 
@@ greet
%p
  hello,
  = @name

これで

ruby app.rb

問題なく分割できる。

併せて読んでいる

Sinatra: Up and Running

著者/訳者:Alan Harris Konstantin Haase

出版社:Oreilly & Associates Inc( 2011-12-06 )

ペーパーバック ( 103 ページ )


ぼくはこれを読んでいて、「こういうことできるんじゃね」って気づいた。結構気づきが多い。この本自体の感想も近日書けるといいですね。

 

cancan でモテカワ♥愛され権限管理

Time to Read

10分

cancan gem (!= CanCam) は、ウェブアプリケーションの「認可」をつかさどるライブラリ。

重要なのは、「認証」ではなく「認可」のみを受け持っているということで、要するに権限管理だけを「関心事」として持つライブラリであるということ。したがって、認証側は、 devise でも、 warden + omniauth でも、 Railscast のように authlogic でも、自力実装でも大丈夫だということ。キレイ目でもカジュアルダウンしたときにもコーデに使える万能アイテムのようなものですかね。

当ブログにしては珍しく Rails スリ~ で試してみよう。

Read the rest of this entry »

 

Gemnasium が地味に便利そう

Time to Read

1分

Gemnasium keeps you up to date on the gems that matter to you.

あなたが github 上に Rubygems やその他プロジェクトのリポジトリを持っていたとして、その Gemfilegemspec を読み込んで、依存関係を把握し、記述がまずい等で最新の Rubygems にキャッチアップできないようなら教えてくれるサービス。


こんな感じ。

要するに、 bundler はすでに 1.1.rc7 が出ていて、遠からず 1.1 がリリースされるだろうから、よってこの ~> 1.0.0 という記述のままではじきに最新のものが使えなくなるよ、ということ(黄信号)、さらに、 rspec はとっくに 2.8.0 が出ているので、いまの ~> 2.3.0 という記述では最新のものが入らないよ(赤信号!)、などの情報が分かるということ。

ということで、こういった黄信号/赤信号な事態になったら通知してくれて、たとえば、他の gem は全部 ~> 2.8.0 なのに、この rack-session-dbm だけ ~> 2.3.0 って書いてあるから依存関係が破滅する、みたいな事態を早急に防げる、というわけだと理解した。合ってるのかしら……。

複雑さを増していく依存性の問題に日々立ち向かう、 Rubygems 戦士たちには便利なツールだと思われる。 travis-ci のようにバッジを張り付けることもできるようだ(プロジェクトの URL の後ろに .png をつけるだけなので便利)。

sample

あと、インフォグラフィックとしても中々面白いような気がする。

Open source moves pretty fast. If you don’t stop and look around once in a while, you could miss it.

Using old gems is bad. And unnecessary. Gems are updated all the time.

  • Bugs are fixed.
  • Security holes are filled.
  • New features are introduced.

It can be hard to keep up with, but it’s important for the health of your code.

from Why use Gemnasium? – Have a nice developing life!

 

kaminari gem を Padrino で使うには

Time to Read

2分

明けましておめでとうございます。ブログもぼちぼち通常営業です。

先日ぼくの(github:mlightner氏や @aereal 氏の実装を大きく参考にしたものです)Sinatra系対応パッチがマ~ジされました、次世代ページネーションエンジン kaminari ですが、昨年末にそのパッチを含む 0.13.0 がリリースされています。

早速使ってみたいところですが、時期的に、ちょうど Rails 3.2RC やら Rack 1.4 やらが出ていて、設定にややコツが要るのでそこだけメモしておきます。Padrino の例ですが、 Sinatra でも適宜読み替えてください。

プロジェクト作成

1
2
padrino g project kaminarino -d activerecord -a sqlite -b
cd kaminarino

Gemfile を編集

15
16
17
# rack のバージョンを 1.3 系に指定しないと、最新の rack 1.4.0 が入って面倒な事態になる
gem 'rack', '~> 1.3.0'
gem 'kaminari', '~> 0.13.0', :require => 'kaminari/sinatra'
1
bundle update

試してみよう

1
2
3
4
padrino g model user name:string
padrino rake ar:migrate
padrino g controller users get:index
padrino console
1
2
>> 100.times { User.create!(name: SecureRandom.base64(12)) }
>> exit

app/app.rb:

1
2
3
4
5
class Kaminarino < Padrino::Application
  #...
  register Kaminari::Helpers::SinatraHelpers
  #...
end

app/controllers/users.rb:

1
2
3
4
5
6
Kaminarino.controllers :users do
  get :index do
    @users = User.page(params[:page] || 1).per(5)
    render :"users/index"
  end
end

app/views/users/index.html.haml:

1
2
3
4
5
6
7
8
9
10
11
!!! 5
%html
  %head
    %title= "users page: #{@users.current_page}"
  %body
    %ul
      - @users.each do |user|
        %li
          = "User ID: #{user.id} |"
          =h user.name
    = paginate @users
1
padrino start

で、とりいそぎ paginate ヘルパーなどを移植したのですが、実は生成される URL は機械的に後ろに「?page=n」をくっつけているだけだったりして色々と申し訳ない感じなので、何というか、こう、ユーザ側で自作した方がうわなにをする

もうすぐ Rails 3.2 の正式版が出て、 rack 1.4 を考慮した依存関係になるとのことで(参考ポスト)、一緒に Padrino なんかも対応してくれるはずですので、それまではちょっと最新の rack が使えませんが待ちましょう……。

# 少しだけそもそも論的な話をすると、 kaminari 自身が actionpack に依存していること、そして、実は Sinatra 側のヘルパーも ActionView を利用している(移植の工数を最小限にするために……)ことが問題を難しくしている感じもありますが、ここはこう、きっといい方法があると思って考えて続けています(helpersだけでも別の gem に切り離すと綺麗なのかもなあ~とか)。

何かご意見があればお気軽に @a_matsuda さんや ぼく まで~。一応、 Sinatra 関係の改修のメンテナを立候補させていただきましたので……。