すがブロ

sugamasaoのhatenablogだよ

Yosemiteでgit pullすると git-sh-setup: No such file or directory って言われてしまった

どうもiTerm2のバージョンによって(古いと)遭遇するっぽい。 git側にパッチ当てたりする方法もあるらしいけど、iTerm2のバージョンを上げるのが正しい方法っぽいかな?

アップデート前のバージョンをメモするの忘れたけど、 Buiild 2.0.0.20141022 で解消していることを確認できた。

f:id:seiunsky:20141029234245p:plain

rack-lineprofをSinatraアプリに使う

ISUCONでたぶん使うであろう自分の作業メモです。

サンプルアプリとして sugamasao/Shiori · GitHub を使ってみるよ。

気になった人はこの本を買ってね!!!!1

Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)

Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)

それでは実際の作業をしていくよ。

% git clone git@github.com:sugamasao/Shiori.git

ディレクトリを移動する

% cd Shiori

Gemfileに rack-lineprof を入れる。

 group :development do
+  gem 'rack-lineprof'
   gem 'pry'
 end

bundle installする。

% bundle install --without production

SQLite3にスキーマを作る

% cd db
% sqlite3 sqlite.db < schema.sqlite3.sql

上位ディレクトリに移動してbundle exec rackupする。 これで通常の動きを確認できる。

次に、rack-lineprofを導入する。

+require 'rack-lineprof'
 require 'rack/protection'
 require './app/shiori'
 
+use Rack::Lineprof

これで http://localhost:9292/?lineprof=shiori.rb にアクセスすると、ターミナルに以下のように出力される。

app/shiori.rb
               |  29  
               |  30    get '/' do
   0.4ms     3 |  31      @bookmarks = Bookmark.order('id DESC').page(params[:page])
   5.4ms     1 |  32      erb :index
               |  33    end
               |  34  

127.0.0.1 - - [28/Sep/2014 00:21:17] "GET /?lineprof=shiori.rb HTTP/1.1" 200 1079 0.0089

なお、パラメータで shiori.rb と指定しているが、app/shiori.rb としても大丈夫。なので、複数で同じ名前のファイル名があったりする場合はディレクトリ名を含めたパスを指定すれば良さそう。 同じように、パラメータ部分をindex.erbにすると以下のように、viewファイルのプロファイルも取れる

[Rack::Lineprof] ===============================================================

app/views/index.erb
               |   1  <h1>登録したURL一覧</h1>
   1.0ms     3 |   2  <%= will_paginate @bookmarks %>
               |   3  <div>
               |   4    <a href='/new'>新規登録</a>
              .......
               |  13    </thead>
               |  14    <tbody>
   1.1ms     4 |  15      <% @bookmarks.each do |bookmark| %>
               |  16        <tr>
               |  17          <td><%= h bookmark.id %></td>

127.0.0.1 - - [28/Sep/2014 00:21:26] "GET /?lineprof=index.erb HTTP/1.1" 200 1079 0.0084

ちなみに、これはrack-lineprofの問題ではないけれど、unicornをインストールする際に利用される wsylvest/kgio · GitHub が2.2.0-preview1でビルドでエラーになってしまう……。

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /Users/sugamasao/.rbenv/versions/2.2.0-preview1/bin/ruby -r ./siteconf20140928-35901-blyemq.rb extconf.rb 
checking for CLOCK_MONOTONIC in time.h... no
checking for CLOCK_MONOTONIC() in time.h... no
checking for clockid_t in time.h... no
checking for clock_gettime() in -lrt... no
checking for t_open() in -lnsl... no
checking for socket() in -lsocket... no
checking for poll() in poll.h... yes
checking for getaddrinfo() in sys/types.h,sys/socket.h,netdb.h... yes
checking for getnameinfo() in sys/types.h,sys/socket.h,netdb.h... yes
checking for struct sockaddr_storage in sys/types.h,sys/socket.h... yes
checking for accept4() in sys/socket.h... no
checking for sys/select.h... yes
checking for writev() in sys/uio.h... yes
checking for ruby/io.h... yes
checking for rb_io_t.fd in ruby.h,ruby/io.h... yes
checking for rb_io_t.mode in ruby.h,ruby/io.h... yes
checking for rb_io_t.pathv in ruby.h,ruby/io.h... yes
checking for struct RFile in ruby.h,ruby/io.h... yes
checking size of struct RFile in ruby.h,ruby/io.h... 24
checking for struct RObject... yes
checking size of struct RObject... 40
checking size of int... 4
checking for rb_io_ascii8bit_binmode()... yes
checking for rb_update_max_fd()... yes
checking for rb_fd_fix_cloexec()... yes
checking for rb_cloexec_open()... yes
checking for rb_thread_blocking_region()... no
checking for rb_thread_io_blocking_region()... yes
checking for rb_str_set_len()... yes
checking for rb_time_interval()... yes
checking for rb_wait_for_single_fd()... yes
checking for rb_str_subseq()... yes
checking for rb_ary_subseq()... yes
creating Makefile

make "DESTDIR=" clean

make "DESTDIR="
compiling accept.c
In file included from accept.c:90:
/Users/sugamasao/.rbenv/versions/2.2.0-preview1/include/ruby-2.2.0/ruby/backward/rubysig.h:14:2: warning: rubysig.h is obsolete [-W#warnings]
#warning rubysig.h is obsolete
 ^
accept.c:101:2: error: use of undeclared identifier 'TRAP_BEG'
        TRAP_BEG;
        ^
accept.c:103:2: error: use of undeclared identifier 'TRAP_END'
        TRAP_END;
        ^
1 warning and 2 errors generated.
make: *** [accept.o] Error 1

make failed, exit code 2

Gem files will remain installed in /Users/sugamasao/.rbenv/versions/2.2.0-preview1/lib/ruby/gems/2.2.0/gems/kgio-2.8.1 for inspection.
Results logged to /Users/sugamasao/.rbenv/versions/2.2.0-preview1/lib/ruby/gems/2.2.0/extensions/x86_64-darwin-13/2.2.0-static/kgio-2.8.1/gem_make.out
An error occurred while installing kgio (2.8.1), and Bundler cannot continue.
Make sure that `gem install kgio -v '2.8.1'` succeeds before bundling.

基本的には以下のブログをなぞるだけで大丈夫でした。ありがとうございます〜。

RubyKaigi 2014 で出会った神ツールのメモ

RubyKaigi 2014、楽しかったし、学びがあって行って良かったなぁと思いました(小並感すぎる)。

淡々とメモしておくよ

YAPC::Asia Tokyo 2014 に参加しました

初めてのYAPC

他言語のカンファレンスはいくつか行ったことあったのだけど、Perlの……つまり、YAPCは今年が初めてでしたが、結論から言えばめちゃめちゃ楽しかったし、がんばってこ!っていう気持ちになった。

参加するモチベーションとしては、タイムテーブルを見るとわかりますがPerlに限らず、運用や設計(色んな意味でね)に関することが多かったので、非Perlプログラマーでもきっと楽しめるかなという点と、何より知り合いが運営や登壇するイベントというのはやっぱり参加してみたいなって思ったのでした。

1日目

ことごとく乗り換えを失敗して開会の言葉を聞けなくて残念過ぎた。。。

インフラエンジニア(狭義)は死んだ - YAPC::Asia Tokyo 2014

めっちゃ人多くてスライドをあまり見れなかったのが残念でしたが、とにかく「インフラ(あるいはプログラマー)」だから「XXXは自分のやることじゃない」みたいのは良くないよねっていう話が印象にのこった。

完成されたシステムなどない。完成された人間もいない。あるのは成長し続ける未完成なシステムと、それを支える未完成な人間だけだ - YAPC::Asia Tokyo 2014

けんじおじさんの話だったので聞きに行ったのですが、なんというか、非常に言いたいことは伝わるんだけど、スピリチュアルだった(良くも悪くも……)w あとは質疑応答が結構面白かった。

その後

イベントホールでは無限コーヒーがあったので無限コーヒーやランチセッションで薄毛の話を聞きながらコード書いたりしていた。

あとは コマンドラインツールについて語るときに僕の語ること - YAPC::Asia Tokyo 2014 を聞きたかったんだけど完全に出遅れてまたスライド見れなそうだったのでソンムーさんのライブコーディングを見たりしていた(ライブコーディング、ショーとしての楽しさがあるので見ていて面白かった)。

WHERE狙いのキー、ORDER BY狙いのキー - YAPC::Asia Tokyo 2014

order by時のINDEX、いまいち使いこなせなかったので非常にためになった……と言いたいところだけど、後半、ちょっとコードが読めなくて理解しきれなかったので後で資料を見直そうと思う。でも考えるヒントは得た気がする。あと、自分はメガネの度数調整したほうが良いですね。

その後

ホールでコードでも書くかと思ってフラフラしてら @do_aki と遭遇して話していたら何人か集まってきて、真のREPL( XcodeのREPLや The IPython Notebook — IPython )についてとか、書籍の執筆でPDFになると辛いよね話とかをしていたらいつの間にか一日目が終わってしまった。

2日目

突然ITインフラを任された人のための…監視設計入門 - YAPC::Asia Tokyo 2014

Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)

Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)

の共著者の一人、@koemuさんの話。すごく地に足の着いた話で、具体的にどうするんだろっていうところを話してもらえて良かった。イマイチ土台がしっかりしないままやってる部分ではあるので、こういう話を聞けたのは良かった。

半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情(5.6対応) - YAPC::Asia Tokyo 2014

Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)

Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)

の共著者の一人、@uzullaさんの話。そして今回のベストトーク賞。PHPはぶっちゃけ全然書いたことないけど、面白かった。というか、なんだかんだ、PHPへの愛がすごい。

その他

イベントホールでコード書いたりあやかNowしたりして過ごした。最後にライトニングトークを聞いた。最近、あまり大きなイベントでLTを見るのなかった気がしたので、ああいう勢いとか楽しむ、みたいな空気はなんか良かった。

キーノート - YAPC::Asia Tokyo 2014

直接面識はないのだけど、同じ会社のイングレスおじさんの知り合いなのでお名前はよく見ていた。なんというか、簡単に言えば生き様の話をしていたのだけど、ぼくもがんばって生きていこうと思った。

クロージング

ベストトーク賞、PHPコールが起きてカオスでしたがおめでとうございます!!!!!1 あと @yusukebe の話し方がすごくいい感じで、なんというか形式張ったカッチリした雰囲気にならないで進められていたの良いなと思った(1日目のオープニング聞けなくて残念だ)。これは人柄とかもあるんでしょうけど、この規模でも、良い意味で手作りな感じが出てる会っていうのは良かったなぁ。

その他、きになったコト

多目的教室はちょいと人が集まると立ち見になってしまってかなりキャパシティが厳しそうな気がした。立ちっぱなしてスライド見続けるのも難しいけど、それよりも、投影が白っぽくなってしまう(照明の問題かな)ので、ちょっとみにくいなーと思った。

Fast-fowordでgit mergeしちゃったけどやっぱ--no-ffでmergeしたかった

ついうっかりマージするときに--no-ff付けずにマージしちゃったときにどうするか

reflog見て何個前のcommitか確認する

git reflog | head
   : 
xxx HEAD@{1}: merge hoge-branch: Fast-forward
   :

{1}らしい。そしたらresetしてもう一回マージしなおす

git reset --hard HEAD@{1}
git merge --no-ff hoge-branch
git push origin master

やったね

resetの綴り間違えている所があったから直しておいたよ

パーフェクトRuby on Railsという書籍が出ます

6/6発売となります

パーフェクト Ruby on Rails

パーフェクト Ruby on Rails

まだAmazonだと書影や目次がでていませんね。

これが表紙です!!

f:id:seiunsky:20140516111941j:plain

目次などの一次ソースは 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でも使ったヤツ)。

表記ゆれチェッカーもどき

そんなわけで

どうにか発売までこぎ着けましたのでみなさまよろしくお願いいたします。

パーフェクト Ruby on Rails

パーフェクト Ruby on Rails

ついでにこちらもよろしくお願いいたします。

パーフェクトRuby (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)

Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)

Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)

Rails 4.1が 64bit版のRubyをインストールしたWindowsで動かないヨォ〜〜

Windowsで 64bit版Rubyを使って Rails 4.1 を攻めてみた結果

動かないけど動かすようにするのは簡単だった

環境

> 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になったら直るのかな)。

どうしても書かなくては行けない事柄

パーフェクトRuby (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)

そしてこれ

Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)

Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)

書かなくても良い事柄

結婚しました。