パーフェクトRuby on Railsという書籍が出ます
6/6発売となります
- 作者: すがわらまさのり,前島真一,近藤宇智朗,橋立友宏
- 出版社/メーカー: 技術評論社
- 発売日: 2014/06/06
- メディア: 大型本
- この商品を含むブログを見る
まだAmazonだと書影や目次がでていませんね。
これが表紙です!!
目次などの一次ソースは http://gihyo.jp/book/2014/978-4-7741-6516-5 を見ていただければと思います。
一応、書籍の目次を書いておきますね。
■■Part 1 Rails ~ overview ■1章 Ruby on Railsの概要 1-1 Railsを使う前に 1-2 Railsの思想 1-3 Railsをはじめよう!! 1-4 scaffoldを使ってRailsでの開発を体験しよう ■2章 Ruby on RailsとMVC 2-1 MVCアーキテクチャ 2-2 モデル 2-3 コントローラの役割 2-4 ビューの役割 2-5 MVCについてのまとめ ■■Part 2 実践テクニック ■3章 アセット 3-1 Sprockets 3-2 CoffeeScript 3-3 Sass 3-4 Turbolinks ■4章 Railsのロードパスとレイヤーの定義方法 4-1 MVC以外の構成要素の扱い 4-2 レイヤーを追加するgemの例 ■5章 開発を効率化するgem 5-1 サンプル用のRailsプロジェクトを用意する 5-2 PryをRailsのコンソールとして利用する 5-3 Hirbを使ってコンソール上のモデルの出力を整形する 5-4 Better Errorsでエラー画面をよりリッチに表現する 5-5 Springでコマンドを高速化する 5-6 rails-erdでモデルのER図を生成する ■■Part 3 実践Webアプリケーション開発 ■6章 Railsアプリケーション開発 6-1 イベント告知アプリケーションを作る 6-2 アプリケーションの作成と下準備 6-3 OAuthを利用して「Twitterでログイン」機能を作る 6-4 イベントの登録機能を作る 6-5 イベントの閲覧機能を作る 6-6 イベントの編集・削除機能を作る 6-7 登録されたイベントへの参加機能,参加キャンセル機能を作る 6-8 退会機能を作る 6-9 落穂ひろい 6-10 gemで機能拡張をする ■7章 Railsアプリケーションのテスト 7-1 なぜテストコードを書くのか 7-2 minitest/RSpec 7-3 テストを実行するための環境を整える 7-4 モデルのテスト 7-5 コントローラのテスト 7-6 ビューのテスト 7-7 エンドツーエンドのテスト 7-8 JavaScriptのテスト 7-9 TDDの考え方 7-10 CI(継続的インテグレーション) 7-11 カバレッジと静的解析 ■8章 Railsのインフラと運用 8-1 はじめに ── DevOpsとは何か? 8-2 VagrantでローカルにVMを作る 8-3 Chefを用いた本格的なサーバ構成管理 8-4 デプロイをする 8-5 New Relicによるアプリケーションの監視 8-6 serverspecとインフラのテスト 8-7 終わりに ■■Part 4 一歩先行くRails ■9章 より実践的なモデルの使い方 9-1 アーキテクチャパターンから見るRails 9-2 複雑なバリデーションとコールバックを整理する 9-3 DBに依存しないモデルを作るActiveModel 9-4 値オブジェクト 9-5 Concern 9-6 サービスクラス 9-7 終わりに ■10章 Railsを拡張する 10-1 Railsを支えるgemたち 10-2 Rack Middlewareを作る 10-3 プラグインを作る - Railtieについて 10-4 終わりに
誰が読むと嬉しいの
この本の対象読者として、我流でRailsを使っていて参考になる話を読みたいという人、あるいは別のWebアプリケーションフレームワーク(例えばナントカPHPとかそういうMVC系のもの)を扱っていて、さてRailsを使ってみようという人がちょうど良いのかなと思います。
「これからRailsでWebアプリケーションを作りたい」という人であれば、別の入門書を読んでから(あるいはRailsチュートリアルをやってから)2冊目として読むのに良いかなと思います。
内容とか見どころ
Rails 4.1に対応しているということで、EnumやVariantについても解説されています。Part3で扱っているアプリケーションもRails 4.1をベースとしているので、secrets.ymlを使ったりしていますので、この本をふつーに読むとRails 4.1の機能を知ることができると思います。
この本の見どころとしては、Railsアプリを作るという点もそうですが、その後のデプロイ(herokuにpushしてワーイでは終わるわけではない)や監視まで含んで言及しているという点が挙げられます。
また、fat model
問題に対して、どのようにアプローチしていくか、というのを9章で語っています。ここらへんは実際にRailsで開発しているとどうにかしたいんだけど、どうすりゃ良いのっていう部分でもあると思うので、開発の指針として参考になればと思います。
執筆についていくつかのこと
今回もパーフェクトRubyと同じくRe:VIEW + GitHubのプライベートリポジトリを使って書きました。 また、チャットやGitHubへのpushやビルド結果の通知などはidobata.ioを使いました。本当に便利すぎてやばい。
執筆フローはだいたいこんな感じ
- Re:VIEWで原稿を書いてGitHubへpush(PRベース)
- 自宅サーバのJenkinsが該当ブランチの原稿をHTMLへビルド
- HTMLみつつレビューを行う
- issue上あるいはidobata上で内容について意見を合わせる
あと、必ずやったほうが良いこととして、誤字脱字のチェックとして、形態素解析して綴り間違いみたいのは検出したりしたほうが良い。すくなくとも画面上の文字を読んでいるだけではなかなか気が付かないので……。
というわけで、今回は最終的なPDFになったあと、brew poppler
でインストールされたツール群の中にあるpdftotext
を使ってテキストを抜き出し、そのファイルに以下のスクリプトをかまして表記ゆれっぽいのを探した。本当は文字同士の距離?とかを調べてこれとこれは同じ単語じゃね?みたいのを出力できれば良かったんだけど、そこはまぁ得意の目grepでどうにか(ちなみにこのコードはパーフェクトRubyでも使ったヤツ)。
そんなわけで
どうにか発売までこぎ着けましたのでみなさまよろしくお願いいたします。
- 作者: すがわらまさのり,前島真一,近藤宇智朗,橋立友宏
- 出版社/メーカー: 技術評論社
- 発売日: 2014/06/06
- メディア: 大型本
- この商品を含むブログを見る
ついでにこちらもよろしくお願いいたします。
- 作者: Rubyサポーターズ,すがわらまさのり,寺田玄太郎,三村益隆,近藤宇智朗,橋立友宏,関口亮一
- 出版社/メーカー: 技術評論社
- 発売日: 2013/08/10
- メディア: 大型本
- この商品を含むブログ (16件) を見る
Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)
- 作者: 和田裕介,石田絢一(uzulla),すがわらまさのり,斎藤祐一郎
- 出版社/メーカー: 技術評論社
- 発売日: 2014/03/11
- メディア: 大型本
- この商品を含むブログ (4件) を見る
Rails 4.1が 64bit版のRubyをインストールしたWindowsで動かないヨォ〜〜
Windowsで 64bit版Rubyを使って Rails 4.1 を攻めてみた結果
動かないけど動かすようにするのは簡単だった
環境
- Windows 7
- Ruby は ruby 2.0.0p451 (2014-02-24) [x64-mingw32]
- http://rubyinstaller.org/ の最新の64bit版
- Rails は 4.1.0
- gem envの結果は以下の通り
> gem env RubyGems Environment: - RUBYGEMS VERSION: 2.0.14 - RUBY VERSION: 2.0.0 (2014-02-24 patchlevel 451) [x64-mingw32] - INSTALLATION DIRECTORY: C:/Ruby200/lib/ruby/gems/2.0.0 - RUBY EXECUTABLE: C:/Ruby200/bin/ruby.exe - EXECUTABLE DIRECTORY: C:/Ruby200/bin - RUBYGEMS PLATFORMS: - ruby - x64-mingw32 - GEM PATHS: - C:/Ruby200/lib/ruby/gems/2.0.0 - C:/Users/sugamasao/.gem/ruby/2.0.0 - GEM CONFIGURATION: - :update_sources => true - :verbose => true - :backtrace => false - :bulk_threshold => 1000 - REMOTE SOURCES: - https://rubygems.org/
動かないの再現
> rails new windows_sample > cd windows_sample > ruby ./bin/rails s C:/Ruby200/lib/ruby/gems/2.0.0/gems/tzinfo-1.1.0/lib/tzinfo/data_source.rb:199:in `rescue in create_default_data_source': No timezone data source could be found. To resolve this, either install TZInfo::Data (e.g. by running `gem install tzinfo-data`) or specify a zoneinfo directory using `TZInfo::DataSource.set(:zoneinfo, zoneinfo_path)`. (TZInfo::DataSourceNotFound) from C:/Ruby200/lib/ruby/gems/2.0.0/gems/tzinfo-1.1.0/lib/tzinfo/data_source.rb:196:in `create_default_data_source' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/tzinfo-1.1.0/lib/tzinfo/data_source.rb:62:in `block in get' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/tzinfo-1.1.0/lib/tzinfo/data_source.rb:61:in `synchronize' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/tzinfo-1.1.0/lib/tzinfo/data_source.rb:61:in `get' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/tzinfo-1.1.0/lib/tzinfo/timezone.rb:601:in `data_source' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/tzinfo-1.1.0/lib/tzinfo/timezone.rb:114:in `get' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/tzinfo-1.1.0/lib/tzinfo/timezone_proxy.rb:84:in `real_timezone' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/tzinfo-1.1.0/lib/tzinfo/timezone_proxy.rb:52:in `period_for_utc' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/tzinfo-1.1.0/lib/tzinfo/timezone.rb:524:in `current_period' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/activesupport-4.1.0/lib/active_support/core_ext/object/try.rb:45:in `public_send' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/activesupport-4.1.0/lib/active_support/core_ext/object/try.rb:45:in `try' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/activesupport-4.1.0/lib/active_support/values/time_zone.rb:223:in `utc_offset' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/activesupport-4.1.0/lib/active_support/values/time_zone.rb:396:in `block in []' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/activesupport-4.1.0/lib/active_support/values/time_zone.rb:396:in `tap' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/activesupport-4.1.0/lib/active_support/values/time_zone.rb:396:in `[]' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/activesupport-4.1.0/lib/active_support/core_ext/time/zones.rb:60:in `find_zone!' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/activesupport-4.1.0/lib/active_support/railtie.rb:20:in `block in <class:Railtie>' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/railties-4.1.0/lib/rails/initializable.rb:30:in `instance_exec' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/railties-4.1.0/lib/rails/initializable.rb:30:in `run' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/railties-4.1.0/lib/rails/initializable.rb:55:in `block in run_initializers' from C:/Ruby200/lib/ruby/2.0.0/tsort.rb:150:in `block in tsort_each' from C:/Ruby200/lib/ruby/2.0.0/tsort.rb:183:in `block (2 levels) in each_strongly_connected_component' from C:/Ruby200/lib/ruby/2.0.0/tsort.rb:219:in `each_strongly_connected_component_from' from C:/Ruby200/lib/ruby/2.0.0/tsort.rb:182:in `block in each_strongly_connected_component' from C:/Ruby200/lib/ruby/2.0.0/tsort.rb:180:in `each' from C:/Ruby200/lib/ruby/2.0.0/tsort.rb:180:in `each_strongly_connected_component' from C:/Ruby200/lib/ruby/2.0.0/tsort.rb:148:in `tsort_each' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/railties-4.1.0/lib/rails/initializable.rb:54:in `run_initializers' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/railties-4.1.0/lib/rails/application.rb:288:in `initialize!' from z:/tmp/rails_41/windows_sample/config/environment.rb:5:in `<top (required)>' from z:/tmp/rails_41/windows_sample/config.ru:3:in `require' from z:/tmp/rails_41/windows_sample/config.ru:3:in `block in <main>' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb:55:in `instance_eval' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb:55:in `initialize' from z:/tmp/rails_41/windows_sample/config.ru:in `new' from z:/tmp/rails_41/windows_sample/config.ru:in `<main>' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb:49:in `eval' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb:49:in `new_from_string' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb:40:in `parse_file' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/server.rb:277:in `build_app_and_options_from_config' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/server.rb:199:in `app' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/railties-4.1.0/lib/rails/commands/server.rb:50:in `app' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/server.rb:314:in `wrapped_app' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/railties-4.1.0/lib/rails/commands/server.rb:130:in `log_to_stdout' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/railties-4.1.0/lib/rails/commands/server.rb:67:in `start' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/railties-4.1.0/lib/rails/commands/commands_tasks.rb:81:in `block in server' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/railties-4.1.0/lib/rails/commands/commands_tasks.rb:76:in `tap' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/railties-4.1.0/lib/rails/commands/commands_tasks.rb:76:in `server' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/railties-4.1.0/lib/rails/commands/commands_tasks.rb:40:in `run_command!' from C:/Ruby200/lib/ruby/gems/2.0.0/gems/railties-4.1.0/lib/rails/commands.rb:17:in `<top (required)>' from ./bin/rails:4:in `require' from ./bin/rails:4:in `<main>'
要約すると以下のことでおこになってる
No timezone data source could be found. To resolve this, either install TZInfo::Data (e.g. by running `gem install tzinfo-data`)
ようするに tzinfo-data がないということ。 で、Gemfileを見ると、実は書いてある。
source 'https://rubygems.org' : : # Windows does not include zoneinfo files, so bundle the tzinfo-data gem gem 'tzinfo-data', platforms: [:mingw, :mswin]
なのにインストールされてないというのだ
解決方法
64bit版のRubyはplatformsが x64_mingw になるので、これを追加してやれば良い。つまりこうする
source 'https://rubygems.org' : : # Windows does not include zoneinfo files, so bundle the tzinfo-data gem gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw]
これを書いたあと、おもむろに bundle update
すると tzinfo-dataがインストールされる。そして、rails server
も無事に動く。
ちなみに、masterではもう修正されている(4.1.1になったら直るのかな)。
- https://github.com/rails/rails/blob/master/railties/lib/rails/generators/rails/app/templates/Gemfile
どうしても書かなくては行けない事柄
- 作者: Rubyサポーターズ,すがわらまさのり,寺田玄太郎,三村益隆,近藤宇智朗,橋立友宏,関口亮一
- 出版社/メーカー: 技術評論社
- 発売日: 2013/08/10
- メディア: 大型本
- この商品を含むブログ (16件) を見る
そしてこれ
Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)
- 作者: 和田裕介,石田絢一(uzulla),すがわらまさのり,斎藤祐一郎
- 出版社/メーカー: 技術評論社
- 発売日: 2014/03/11
- メディア: 大型本
- この商品を含むブログ (4件) を見る
書かなくても良い事柄
結婚しました。
Rails 4.1のenumの挙動(2)
前回、キーの項目と数値を定義したのだけど、実はキーの項目だけ指定しても数値として保存されるようだ(キーだけだと文字列で保存されるのかと思っていた……)。
class Product < ActiveRecord::Base enum status: %w(normal sale empty) end
こんな感じで定義してから ./bin/rails c
して確認する。
まずはどのようにデータが保存されるか。
Loading development environment (Rails 4.1.0.rc2) irb(main):001:0> Product.create(status: 1) (0.2ms) begin transaction SQL (0.9ms) INSERT INTO "products" ("created_at", "status", "updated_at") VALUES (?, ?, ?) [["created_at", "2014-04-06 02:53:47.039739"], ["status", 1], ["updated_at", "2014-04-06 02:53:47.039739"]] (1.3ms) commit transaction => #<Product id: 1, name: nil, status: 1, created_at: "2014-04-06 02:53:47", updated_at: "2014-04-06 02:53:47"> irb(main):002:0> Product.create(status: "sale") (0.2ms) begin transaction SQL (0.4ms) INSERT INTO "products" ("created_at", "status", "updated_at") VALUES (?, ?, ?) [["created_at", "2014-04-06 02:53:57.177845"], ["status", 1], ["updated_at", "2014-04-06 02:53:57.177845"]] (1.0ms) commit transaction => #<Product id: 2, name: nil, status: 1, created_at: "2014-04-06 02:53:57", updated_at: "2014-04-06 02:53:57"> irb(main):003:0> Product.create(status: :sale) (0.2ms) begin transaction SQL (0.6ms) INSERT INTO "products" ("created_at", "status", "updated_at") VALUES (?, ?, ?) [["created_at", "2014-04-06 02:54:05.389452"], ["status", 1], ["updated_at", "2014-04-06 02:54:05.389452"]] (1.3ms) commit transaction
ついでに、前回は書かなかったんだけど述語メソッドも生えているのでそっちも確認しておく。ここで保存したのはsaleの値なので、sale?で問い合わせすることができる。
irb(main):013:0> pro = Product.where(status: 1).first Product Load (0.3ms) SELECT "products".* FROM "products" WHERE "products"."status" = 1 ORDER BY "products"."id" ASC LIMIT 1 => #<Product id: 1, name: nil, status: 1, created_at: "2014-04-06 02:53:47", updated_at: "2014-04-06 02:53:47"> irb(main):014:0> pro.sale? => true
ここではどうでも良いけど、empty
ってステータスはメソッド呼び出しだとちょっと誤解を招きそうなので辞めたほうが良いですね。
検索する場合、ステータス毎のクラスメソッドがある。当然、メソッドチェインでwhere区等もつなげることができる。
irb(main):003:0* Product.sale Product Load (3.3ms) SELECT "products".* FROM "products" WHERE "products"."status" = 1 => #<ActiveRecord::Relation [#<Product id: 1, name: nil, status: 1, created_at: "2014-04-06 02:53:47", updated_at: "2014-04-06 02:53:47">, #<Product id: 2, name: nil, status: 1, created_at: "2014-04-06 02:53:57", updated_at: "2014-04-06 02:53:57">, #<Product id: 3, name: nil, status: 1, created_at: "2014-04-06 02:54:05", updated_at: "2014-04-06 02:54:05">]> irb(main):004:0> Product.sale.where('id > 2') Product Load (0.4ms) SELECT "products".* FROM "products" WHERE "products"."status" = 1 AND (id > 2) => #<ActiveRecord::Relation [#<Product id: 3, name: nil, status: 1, created_at: "2014-04-06 02:54:05", updated_at: "2014-04-06 02:54:05">]>
ただ、where区に文字列やシンボルで渡しても想定通りの動作にはならない。シンボルはともかく、文字列を渡すと0で検索しちゃうのはウッカリハマる可能性がありそう……。
irb(main):008:0> Product.where(status: 'sale') Product Load (0.3ms) SELECT "products".* FROM "products" WHERE "products"."status" = 0 => #<ActiveRecord::Relation []> irb(main):009:0> Product.where(status: :sale) Product Load (0.4ms) SELECT "products".* FROM "products" WHERE "products"."status" = 'sale' => #<ActiveRecord::Relation []>
私からは以上です。
Rails 4.1のenumの挙動
みんな大好きenum型
DBのカラムでステータスとか使うとき、ぼくは数値派なんですけど、enumで掛けたら楽で良いですよねみたいのあります。ありますよね。
で、Rails 4.1ではそういうのが導入されたっぽいので試してみました。
rails 4.1をインストールしてプロジェクト作ったりする
$ gem install rails --pre --no-ri --no-rdoc $ rails new sample $ cd sample $ ./bin/rails g scaffold product name:string status:integer $ ./bin/rake db:migrate
rails c
でフツーに登録してみる(ここは何の変哲も無い)。
irb(main):005:0> Product.create!(name: "hoge", status: 99) (0.1ms) begin transaction SQL (0.2ms) INSERT INTO "products" ("created_at", "name", "status", "updated_at") VALUES (?, ?, ?, ?) [["created_at", "2014-03-26 01:25:21.026233"], ["name", "hoge"], ["status", 99], ["updated_at", "2014-03-26 01:25:21.026233"]] (1.9ms) commit transaction => #<Product id: 2, name: "hoge", status: 99, created_at: "2014-03-26 01:25:21", updated_at: "2014-03-26 01:25:21">
statusの値が99でも保存できちゃう。そのままでも良いんだけど、validatesのおさらいとして例えば0〜2までに制限してみようか。
class Product < ActiveRecord::Base validates :status, inclusion: {in: 0..2} end
ためしてみよう
Loading development environment (Rails 4.1.0.rc2) irb(main):001:0> Product.create!(name: "hoge", status: 99) (0.1ms) begin transaction (0.1ms) rollback transaction ActiveRecord::RecordInvalid: Validation failed: Status is not included in the list irb(main):003:0* Product.create!(name: "hoge", status: 2) (0.1ms) begin transaction SQL (0.4ms) INSERT INTO "products" ("created_at", "name", "status", "updated_at") VALUES (?, ?, ?, ?) [["created_at", "2014-03-26 01:27:51.238248"], ["name", "hoge"], ["status", 2], ["updated_at", "2014-03-26 01:27:51.238248"]] (1.6ms) commit transaction => #<Product id: 3, name: "hoge", status: 2, created_at: "2014-03-26 01:27:51", updated_at: "2014-03-26 01:27:51">
数値の範囲指定ができましたね。
それではenumを使ってみよう
enumの設定をしてみよう。ややこしくなるので、validatesは消します。ついでに書いておくと、enumの項目自体はテキトウなのでスルー推奨です。
class Product < ActiveRecord::Base enum status: { normal: 0, # 通常 sale: 1, # 特売 empty: 2, # 在庫切れ } end
これで試してみよう。まずは正常系で。
irb(main):005:0* Product.create!(name: "hoge", status: 2) (0.1ms) begin transaction SQL (0.2ms) INSERT INTO "products" ("created_at", "name", "status", "updated_at") VALUES (?, ?, ?, ?) [["created_at", "2014-03-26 01:33:06.501462"], ["name", "hoge"], ["status", 2], ["updated_at", "2014-03-26 01:33:06.501462"]] (1.6ms) commit transaction => #<Product id: 6, name: "hoge", status: 2, created_at: "2014-03-26 01:33:06", updated_at: "2014-03-26 01:33:06"> irb(main):006:0> Product.create!(name: "hoge", status: :sale) (0.1ms) begin transaction SQL (0.6ms) INSERT INTO "products" ("created_at", "name", "status", "updated_at") VALUES (?, ?, ?, ?) [["created_at", "2014-03-26 01:33:13.877152"], ["name", "hoge"], ["status", 1], ["updated_at", "2014-03-26 01:33:13.877152"]] (1.5ms) commit transaction => #<Product id: 7, name: "hoge", status: 1, created_at: "2014-03-26 01:33:13", updated_at: "2014-03-26 01:33:13"> irb(main):005:0> Product.create!(name: "hoge", status: 'sale') (0.1ms) begin transaction SQL (0.6ms) INSERT INTO "products" ("created_at", "name", "status", "updated_at") VALUES (?, ?, ?, ?) [["created_at", "2014-03-26 01:57:26.957196"], ["name", "hoge"], ["status", 1], ["updated_at", "2014-03-26 01:57:26.957196"]] (1.4ms) commit transaction => #<Product id: 15, name: "hoge", status: 1, created_at: "2014-03-26 01:57:26", updated_at: "2014-03-26 01:57:26">
このように、シンボルや文字列、そして数値でも保存してくれるようになった。便利。
では範囲外の値を入力すると?
irb(main):007:0> Product.create!(name: "hoge", status: 99) ArgumentError: '99' is not a valid status irb(main):009:0* Product.create!(name: "hoge", status: :hoge) ArgumentError: 'hoge' is not a valid status irb(main):011:0* Product.create!(name: "hoge", status: 'hogehoge') ArgumentError: 'hogehoge' is not a valid status
ことごとくArgumentErrorとなる。create!
で試しているけど、create
やnew
でも試してみよう。
irb(main):007:0> Product.create(name: "hoge", status: 99) ArgumentError: '99' is not a valid status irb(main):009:0* Product.new(name: "hoge", status: 99) ArgumentError: '99' is not a valid status
create!だけに限らず、newメソッドとかでも引数に異なる範囲の値が入るとArgumentErrorになる。
普通のvalidatesに条件を書く場合は ActiveRecord::RecordInvalid: Validation failed: Status is not included in the list
みたいにActiveRecord::RecordInvalidの例外クラスが送出されるけど、そうではない(例外クラス的にも、発生タイミング的にも)ので気をつけた方が良さそう。
validatesではないから挙動が異なるのは当然といえば当然だけど、使い勝手としては同じような挙動のほうが嬉しかったんだけどそうではなかったという備忘録エントリーです。
Rails詳しくないのでよくわかりませんが、ここら辺、正式リリースまでに挙動が変わったりするかしら?
書かなくてはならない事柄(追記)
こちらも何卒よろしくお願い致します。
Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)
- 作者: 和田裕介,石田絢一(uzulla),すがわらまさのり,斎藤祐一郎
- 出版社/メーカー: 技術評論社
- 発売日: 2014/03/11
- メディア: 大型本
- この商品を含むブログ (3件) を見る
SJISでもgit diffしたい
SJISのファイルでもgit diff
したい。いじわるしないで;;
どうするか
追記:NKF使わなくても良かった(後述)
$ git diff | nkf -u
でdiffの文字列をUTF-8にすれば良い。今日日NKFもそうそう使わないしMac OSXにはデフォルトで入ってないっぽいのでHomebrewでインストールすると良いでしょう。
$ brew install nkf
これでgit diff
できて生きる希望が湧いてきますね。
NKFじゃなくてiconvで良かった
@sugamasao nkf はデフォルトで入ってないけど iconv は入ってる気がします。追加ツールなしでできるかも。
— TOYODA Tetsuya (@aql) 2014, 3月 14
アドバイス通り、Mac OSXにはiconvがデフォルトで入ってるので、NKFを使わずとも実現できるのであった。
$ git diff | iconv -f SJIS
やった便利!!
書かざるをえない事柄
3/11に共著で本を書きましたのでよろしくお願いいたします。
Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)
- 作者: 和田裕介,石田絢一(uzulla),すがわらまさのり,斎藤祐一郎
- 出版社/メーカー: 技術評論社
- 発売日: 2014/03/11
- メディア: 大型本
- この商品を含むブログ (2件) を見る
あと、以下の日程でトークセッションをやる予定ですので、こちらも興味あれば是非(残席わずからしい)
SimpleMagick v1.1.0をリリースした
オプションの使い方を(内部的に)変更した
いままで、明示的にresizeやquality等いくつかのメソッドを実装し、他は足りなければ additional_option
で直接呼んでねっていうつもりで書いてたんだけど、それはあんまりだろうってことでmethod_missing使ってImageMagickで定義されてるオプションだったらそのオプション名を使うことにした。
一番でかい変更はImageMagickのオプションを定義するの毎回コピペするのだるいのでRakeタスクにして、Rubyのファイル自体作っちゃってる所ですね。使う分には互換性は保てているハズ。たぶん。
ところで今日は3/11ですね
3/11といえば、今年からはWebアプリエンジニア養成読本の発売日という意味が含まれるようになりました。よろしくお願いいたします。
Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)
- 作者: 和田裕介,石田絢一(uzulla),すがわらまさのり,斎藤祐一郎
- 出版社/メーカー: 技術評論社
- 発売日: 2014/03/11
- メディア: 大型本
- この商品を含むブログ (2件) を見る
Ruby編、PHP編で書かれているサンプルソースはGitHub上で公開されていますので、学びがありそうでしたら本書を手にとっていただけると嬉しいです。
ImageMagickをラップするSimpleMagickっていう薄いライブラリを作った
なぜか
MiniMagickが遅すぎたのだった。
MiniMagickはナウなヤングが使うイケテルツールとのことだったのだけど、コマンドにオプションを渡す度に mogrify
コマンドを実行するため、でかい画像であればあるほど、前処理の為に時間が掛かる。まー初回にresizeを噛ませばちょっとはましになるところだけど、それにしても毎回実行してほしくない感じなのだった。
で、作ったのがこれ
使い方はREADMEにある通りだけど、こんな感じ。
require 'simple_magick' if SimpleMagick.imagemagick_installed? image = SimpleMagick::Image.new('/path/to/src_image.jpg') image.resize '150x150' image.convert! '/path/to/dest_image.jpg' end
実行するには ImageMagick 自体がインストールしてある必要がある(mogrify
を直接実行しているため)。
ベンチマークを取ると、ひとまずMiniMagickよりは早いことがわかる(これもREADMEに書いてある)。サンプルで使う画像次第で、如実に結果は変わるんだけど、自分が必要に迫られている現実ではもっと大きな差が出た(というか、ちょっと実用に耐えられなかったので自分で作ったのだけど)。
% bundle exec ruby benchmark.rb user system total real simple_magick 0.080000 0.270000 28.530000 ( 29.687068) mini_magick 0.410000 0.790000 31.300000 ( 37.115507) ImageMagick 0.030000 0.170000 28.620000 ( 29.094316)
どうしても書かなくてはいけない宣伝
ぼくも一部執筆をした書籍が発売されます!!ジュンク堂等で先行発売しているところもあるようですが、3/11が正式な発売日です。
Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)
- 作者: 和田裕介,石田絢一(uzulla),すがわらまさのり,斎藤祐一郎
- 出版社/メーカー: 技術評論社
- 発売日: 2014/03/11
- メディア: 大型本
- この商品を含むブログ (2件) を見る
内容に関しては、献本しがいのある素晴らしい感想が書かれているエントリを見て頂ければ良いかなと思います。
出版記念イベントがあります!!!
電話で予約するという高難度イベントですが、まだ席に空きはあるそうなので、もしお時間があればぜひ。 - https://www.junkudo.co.jp/mj/store/event_detail.php?fair_id=4314