2010-02-06
■ [ruby] Tab Sweep
http://github.com/rubiii/rspec_attr_extensions
it_should_have_an_attr_reader_for :date_of_birth みたいな
http://github.com/snitko/mmmenu
Railsで複数階層のメニューを生成するらしい
http://github.com/schacon/showoff
Rubyで書かれた、HTMLなプレゼンツール
http://github.com/jnicklas/capybara
webratの後継?cucumberで、@javascriptタグが付いてるところだけculerityで動かす とかできるのはいいね
http://www.rubyinside.com/cramp-asychronous-event-driven-ruby-web-app-framework-2928.html
Rubyのための非同期Webサーバ
http://www.engineyard.com/blog/2010/rails-3-beta-is-out-a-retrospective/
Rails 3 beta出ました!
2010-02-08
2010-02-09
2010-02-11
■ [ruby] わかりにくいバグ わかりました
以下のコード、どこがバグか分かるだろうか?
class Foo
def initialize(path)
@path = path
end
def src
@src ||= File.read(@path)
end
def save!
File.open(@path, "w"){|f| f.write modify(src)}
end
private
def modify(s)
s.gsub(/hello/, "Hello") # 例
end
end
Foo.new("tmp.txt").save!
正解は「modifyに空文字列が渡る」でした。なんでこうなるんだろう?
(追記:コメント欄で指摘いただきましたが、File.openを呼んだ時点でファイルの内容がクリアされるからでした。 寝不足はデバッグの敵!)
■ [ruby][event] 「Rubyの作者だけど何か質問ある?」
1 名無しさん(西日本) 2010/02/10(水) 12:36:24.29 ID:ZA5dvn9p 特定されない範囲で
そりゃあ無理だ!
というわけで(は、勿論ないですが)今週末に行われる 松江Ruby会議02で、 「まつもとさんに聞いてみよう(仮)」というイベントが行われます。
Ruby開発者のまつもとさんに、Rubyを使っていて気になったことや、Rubyの実装に関する分からないことを質問してみましょう。当日、気軽に質問していただけるように配慮します。また、事前に質問内容を matsue02 _at_ rubykaigi.org に送っていただければ、当日、司会からまつもとさんに質問いたします。
[http://regional.rubykaigi.org/matsue02より引用]
質問の投稿はメールで受け付けています。 (あるいは、Twitterで「#matrk02」を付けて発言するとかでも良いと思います。メールの方が確実ですが)2010-02-18
■ [javascript][link] .sort.call(null)の深淵 - 素人がプログラミングを勉強するブログ
JavaScriptで、
[].sort.call(null)
がwindowに評価されるのはなぜ?という話。
- callにnullを渡すと、thisがwindowになる
- Arrayのsortは、ソートするものがないとき(つまり、lengthがundefinedか0か1のとき)はthisを返す
ということからwindowになると。へぇ。
ただしフレームを使ったサイトの場合、window.lengthが2以上になって上のような挙動にならなかったりするらしい。
■ [ruby] Hash、Mash、Dash
Hashieは、Hashと似たような(?)MashとDashというクラスを提供する。
Mashはostructみたいなオブジェクト。「?」で存在チェック、「!」で強制定義ができる。
conf = Hashie::Mash.new conf.foo? #=> false conf.foo = 1 conf.foo #=> 1 conf.bar!.baz = 2
例えばJSON返すAPIとかで、
res_hash["responseData"]["translatedText"]
が
Hashie::Mash.new(res_hash).responseData.translatedText
と書ける。書き捨てスクリプトとかでは楽。
(訂正:Hash#to_mashはありませんでした)
Dashはデフォルト値の書けるStructみたいな感じ。
class Person < Hashie:: Dash property :name property :email, :default => "no mail" end me = Person.new(:name => "yhara") me.email #=> "no mail"
■ [ruby] Tilt
前に
Webサーバ・Webフレームワーク間をつなぐものとしてRackがあるわけだけど、 それならWebフレームワーク・テンプレートエンジン間をつなぐライブラリもあってしかるべきではないかと思った。
[20090208#p01より引用]
と書いたことがあるんだが、rtomaykoがやってくれました。使い方は、viewのファイルを食わせて、renderを呼ぶだけ。
template = Tilt.new('templates/foo.erb')
output = template.render(Object.new, :x => 1, :y => 2) #=> String
これでさらに新しいweb frameworkが書きやすくなりましたね。
■ [javascript] CoffeeScript
RubyとPython的な記法でJavaScriptを単純化したようなスクリプト言語。 Rubyで書かれたJavaScriptへのトランスレータがある模様。
「CoffeeScript is just for fun and seriously alpha.」とのこと。
クロージャを使った関数定義の例(代入は「:」らしい)。
square: x => x * x cube: x => square(x) * x
2010-02-19
■ [scala] foursquareが半年かけてScala+Liftに移行した話
foursquareがLiftに切り替えたという話を聞いてびっくりしましたが、どうやら本当だった模様。
以下、内容抜粋
- もとはPHP+Apache+MySQLだったが、エンジニアが書いたものじゃなく、これからの拡張のためには書き直すべきだった
- 静的型・コンパイル言語が好き。Wicketを試したけど、Object型使いすぎなのと関数がfirst-classでないのがちょっと
- Javaの頃からなるべく関数的に書くようにしてたんで、Scalaは自然
- コールバック書くだけでAjaxになるのはいいね!
- まあせっかくスタートアップなんだし、変わった・面白いものを使ってみたかったってのはある
リライトについて
- (書き換え中は?)PHPとセッションの共有とか試してみたけど、あんまりうまく行かず
- リライト3日目からLiftのコードがproductionで動くようになったけど、リライト90%に3ヶ月かかった。
- 残りの10%はiPhoneアプリも修正が必要だったので、2ヶ月かかった。今日終わりました!
- LiftとMySQLは相性が悪い。PostgreSQL使うべき
(実際のコードを交えた解説がいくつか)
よかったこと
- ほぼ全ページが前よりいい感じになったぜ!
- いまのAjaxが難しいとは言わないけど、LiftのAjaxはほんとに楽。ていうかこうなるべき
- コードは短く、わかりやすくなったし、バグも減り、機能は増えた。
- @rasmus曰く:ちゃんと見ても脆弱性が一つも見つからなかったのはfoursquareが初めてだわ。4つ星
よくないこと
- Liftはステートフルだから、productionでそのうち問題になるかも、今のところ悪くはないけど。(編注:性能の問題?)
- Mapper(LiftのORMレイヤ)はまだ未成熟なとこが…
- Lift SiteMapは我々の用途にはオーバースペック。もっとシンプルでいい
- マイナーなものを使ってるんで、これからスケールアップする途中でいろいろ問題があると思う。けど、Liftコミュニティはとっても親切だよ。
状態
- Scalaで14000行くらい。モバイルサイト・API+OAuthサーバを含む
- マークアップが6000行くらい
- フル機能のスタートアップとしては、小さくね?
これから
- データベースはPostgreSQLが1インスタンスだけだけど、いつかは増やさないといけないかも
- MapperがJSON対応するので、JSONの置き場所を考えないと(Memcached, Casandra, Goat Rodeo?)
- Scalaという新しいものを使い始めたけど、たぶんうまくやれるんじゃないかと思う。(アルゴリズムとか)計算機科学的な概念は、どの言語を使おうと同じわけだし
2010-02-21
■ [rails] Rails3に関するさまざまないろいろ
Rails勉強会@東京です(講師:松田さん)
準備
$ gem install rails3b $ gem install rails --pre $ gem update
プロジェクト作る
$ rails books --edge
- Gemfileに、依存ライブラリ(gem)の情報を書くように。Bundler
- --edgeなので、「gem "rails", :git => "git://github.com/rails/rails.git"」になっている
- script/*がscript/railsに
- 単にrailsでもいい(カレントのscript/railsが呼ばれる)
- rails_head/railties/bin/railsを参照
- rails generate
- あるいはrails g
- config/environment.rb
- アプリ名がクラスに! (Books)
- モデル名と被らないように注意
(このへんでbundlerがハマる)
- rails g scaffold book title:string price:integer
- 色が付くように
- rails aboutがrake aboutに(どうでもいい?)
- 長いrespond_toブロックの代わりにresponds_with :xmlみたいになるかも(!)
respond_to :html, :xml def index @books = Book.all respond_with @books end
- validates :title, :presence => true (カラム名を軸にした書き方が)
RSpec
- RSpecの2.0系(未リリース)はRails3対応
- Gemfileに gem "rspec-rails', '2.0.0.a5', :group => :test
- rails g rspec:install で生成
- hamlジェネレータ!
- http://github.com/indirect/rails3-generators
- ↑中身はまだまだだけどプラグイン書く人は参考になりそう
scope
- scope :titled, lambda{|t| where :title => t}
- @books = Book.scoped.titled(str)
- scope :title_like, lambda{|t| where "title like ?", "%#{t}%"}
- 今後のARの推奨は、find(:condition => ...)じゃなくて
- Book.where(:title => 'aaa').count のような。
- whereはさらに連結できる
ビュー
- scaffoldが_formを作るように
- app/views/books/_form.html.erb (newとeditから参照されている)
ActiveModel
- 普通のクラスをモデル扱いさせたりできるぜ
- form_for(@books_search_form) とするために、
- #to_model, #to_key, #new_record?が必要
I18N
- まだデフォルトの日本語訳がない! (松田さんを応援しよう)
- cp ../rails_head/activerecord/lib/active_record/locale/en.yml config/locale/ar_ja.yml
- cp ../rails_head/actionpack/lib/action_view/locale/en.yml config/locale/av_ja.yml
JS
- jquery: scaffoldは対応、RJSはまだ未対応
リリースは?
- まだバグレポート・修正が活発に
- 4月予想
■ [rails] Rails3対応プラグインを探す方法
http://railsplugins.org/plugins を見ればいいそうです
■ [rails] OpenIDについていろいろ
- Mixiアプリは当たれば100万人単位のユーザに使ってもらえる
- PC用はJS、モバイル用は逆にHTTP+RESTな感じ
- OAuthの仕様に詳しくなるらしい
- users has_many :identity_url であるべき!
- 例えばドメイン失効
- 例えばサービス終了(OpenID Providerの)
- じゃあ1つのIDでどこでも…ってわけにいかんじゃないすか
- それはOpenIDのゴールではない
- 「サービスごとにアカウント作らなくていい」のがいい
- 独自ドメインをidentity_urlに使うのはアリ?
- どのProviderのidentity_urlを受け入れるかは、サービス作成者に任されている
- だから、サイトによってログインできないのは覚悟すべし
- つまり、OpenIDだからって、任意のidentity_urlを受け入れないといけないわけじゃない
- 極端な話、特定のサービス群のアカウント持ってる人だけ入れるサービスも作れる
- というわけでホワイトリスト方式でセキュリティを高める、というのは許される
- ブラックリスト方式は良くない
- 要するにOpenIDは認証情報の交換のみを担当するから
- その先のことはあんまり決まってない(自由度がある)
- 例:AWSはAmazonのアカウントでログインするようになってるが、Amazonのアカウントで任意のサービスにログインできるわけではない
- (社内のサービス間のユーザ情報共有としてOpenIDを使った例)
- clickpassにOpenIDを登録
- サイトのClickpassボタンをクリック
- Clickpass上でsignup
- 2回目は、Clickpasボタンを押すだけでログインできる!
■ [rails] プラグインの探し方とか
- 昔は: http://agilewebdevelopment.com/plugins/search?q=openid
- Rails3対応を調べるには: http://railsplugins.org/
- あとは http://ruby-toolbox.com/ ?
Rails HEADの情報は?
- ML
- コミット(git log)、チケット
- チャット
- lighthouse
@wycats vs @nk
- http://magicscalingsprinkles.wordpress.com/2010/02/08/why-i-love-everything-you-hate-about-java/
- http://gist.github.com/304407
- http://yehudakatz.com/2010/02/15/abstractqueryfactoryfactories-and-alias_method_chain-the-ruby-way/
- openid_authenticaitonのgenerate後、restful_authenticationいらないやってなったときに切り離すのがめんどいというモチベーション
2010-02-22
■ [ruby] Ruby関係のTipsを集めたTumblrアカウント : Ruby Quicktips
Ruby/Rails関係のTipsが集まっています。中級のが多いかな。
irbで、直前の評価値が「_」に入ってるってのは知らんかった。 便利だ…。
via RubyInside
□ まつもと [もうお気づきかもしれませんが、評価順序の関係でopen(path, "w")が先に行われるため、ファイル内容がクリア..]
□ なかむら(う) [どっちかというとわかりやすいバグというか。 むしろsaveがないのにsave!というメソッドがあるのが仕様バグっぽ..]
□ knu [sort file > file ってやっちゃって「あっ!」みたいな。]