Classic Sinatra が定義するトップレベルメソッドの話

現在リリースされていて、普通に gem install で入る Sinatra (version <= 1.3.2) は、じつは require 'sinatra' するとあらゆるオブジェクトに get/post/put/delete をはじめとした Sinatra DSL が定義されてしまう。なので、

1
2
3
4
5
6
7
require 'sinatra'
 
class << ""
  get '/' do
    "hello"
  end
end

こんなコードを書いても、

1
2
3
4
5
$ ruby get-string.rb
[2012-05-06 16:46:35] INFO  WEBrick 1.3.1
[2012-05-06 16:46:35] INFO  ruby 1.9.3 (2012-02-16) [x86_64-darwin11.3.0]
== Sinatra/1.3.2 has taken the stage on 4567 for development with backup from WEBrick
[2012-05-06 16:46:35] INFO  WEBrick::HTTPServer#start: pid=24113 port=4567

サーバが立ち上がってしまう。 http://localhost:4567 を見に行くと「hello」って出る。ヤバい。

この挙動ではあまりにもアレすぎるので、最新の Sinatra では、(添付されているテストが奇怪でびっくりする)このコミットから

28
29
30
# include would include the module in Object
# extend only extends the `main` object
extend Sinatra::Delegator

extend することで、トップレベルに存在するオブジェクトである main (irbでトップレベルで「self」と打ち込むと取得できるアレだ)の特異メソッドとしてのみ、 Sinatra DSL を定義するようになっている。

この挙動は、Ruby WAF 勉強会に参加して気づいた。 Thanks @ainame !

* * *

なので、上記記事で紹介されている Object.private_instance_methodsget とかが出てくる挙動は、Edgeとか、次のバージョンであろう 1.3.3 では再現しませんね〜

 

RSpec のメタ情報が知りたい

RSpec の DSL には、 example と言うメソッドがあり、そこを経由して現在実行中の example の情報を得ることができる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def add(*args)
  args.inject(:+)
end
 
describe "add" do
  before do
    p example.class
    #=> RSpec::Core::Example
  end
 
  subject { add(*args) }
  context "when 1 + 1" do
    let(:args) { [1, 1] }
    it { should == 2 }
  end
end

具体的には、 exampleRSpec::Core::Example のインスタンスらしい。

以下のような属性、メソッドがある:

Read the rest of this entry »

 

Web+DB Press Vol.68 に寄稿しました

WEB+DB PRESS Vol.68

著者/訳者:名村 卓 三宅 陽一郎 小野 修司 中島 聡 森田 創 小飼 弾 田籠 聡 天野 祐介 cho45 大和田 純 白土 慧 勝間 亮 石田 忠司 牧本 慎平 A-Listers 近藤 宇智朗 はまちや2 mala じゅんいち☆かとう

出版社:技術評論社( 2012-04-24 )

大型本 ( 208 ページ )


ということで、新入社員エンジニア向け特集記事「Web技術丸ごと整理」に、データベース(RDBMS/NoSQL)の記事を寄稿しています。4月24日発売です。

Read the rest of this entry »

 

Shinjuku.ex #02 でした

地味に第二回を開催しました。第一回については、 @mizchi(敬称略)のブログ記事 に詳しいです。

今回は、最新の Elixir についての素晴らしい記事を書いていらっしゃる id:k-1 さんなどに参加していただき、おもに Common Lisp やその他マニア言語の話題をみんなでしました。会場提供は 株式会社 Aiming さんでした。というか結局某 A 社から 4 人も参加(8人中)だったので、 Elixir 光の軍団が結成される日も近そうです。エリクサーをアンデッド系や闇属性のモンスターに投げると一発で倒せそうですが、効果や如何。

Read the rest of this entry »

 

Ruby で、 %w() 記法で複数行で配列を書いてるときの注意点

%w 記法、便利ですね。

今回、下みたいに書いてはまってました。

言われてみれば、まあ、そうかな〜という感じですね……。 %w() の中にいるのでコメントアウトが効きません。

素直に消した方が良いですね。。。

ちなみに、 ruby-mode だと以下のように表示されて、完全に罠です。