git-worktree を使って時間のかかる処理を別の作業ディレクトリで行う

時間のかかる処理の実行中、別の作業を進められるようにする方法。備忘録。

時間のかかる処理の例

  • テストの実行中
  • デプロイの実行中

など。

git-worktree を使う

簡単に作業ディレクトリを増やせる。

$ cd ~/works/app
$ git worktree add ~/works/app_deploy
$ cd ~/works/app_deploy
$ git status
On branch app_deploy
nothing to commit, working tree clean

新しく作成された app_deploy の作業ディレクトリでも普通のリポジトリと同じように作業ができる。

注意点

両方の作業ディレクトリで同じブランチを使えない

作業ディレクトリを2つに増やしても、同じブランチは使えません。 別名のブランチを作る必要があります。

リポジトリは共通

リポジトリの内容は共通なので、git remotegit config を使う時は注意が必要です。

.gitignore のファイルは複製されない

git 管理されていないので当然なのですが、初めて git worktree を使うとハマるかも。
direnv を使っている場合などはシンボリックリンクを使うと良い。

$ cd ~/works/app_deploy
$ ln -s ~/works/app/.envrc .

Git を少しでも高速、安全に使う方法を紹介

はてブを眺めてたら、なんか Git の記事がバズってたので、便乗して Git の話を書いてみた。

基礎知識

git-reset は危ない

git reset --hard は作業ディレクトリにコミットしていない変更があった場合、全てを吹き飛ばしてしまう可能性があります。

使う前に必ず git status を実行して、作業ディレクトリの状態を確認をした方が良いです。

git-checkout は遅い

checkout コマンドは作業ディレクトリの状態を変更します。このとき ファイルアクセスが発生するため遅い です。

git-branch -f は速くて便利

git branch -f は同じ名前のブランチがあっても無理やりブランチを作成できるコマンドです。

git-reset と異なり、任意のブランチを弄れるため非常に強力です。

少しでも高速、安全に使う事例の紹介

基礎知識を紹介したところで、いくつか事例を紹介します。

間違ってmaster ブランチで作業してしまったとき

よく紹介される方法は下記のコマンド。ちなみに @HEAD と同じです。

$ git branch new-branch
$ git reset --hard @~
$ git checkout new-branch

このコマンドだと2つ問題がある。

  1. reset --hard で未コミットの内容が吹き飛ぶ危険性
  2. checkout を使っていて遅い

少しだけ改善したコマンドは下記の通り。

$ git checkout -b new-branch
$ git branch -f master @~

これなら checkout のファイルアクセスも最小で、未コミットの内容があっても消えません。

master ブランチをリモートに追従したい

よくある方法はこちら。

$ git checkout master
$ git pull origin

checkout してブランチ移動すると作業が止まるし、ファイルアクセスもあって微妙ですよね。 そこで branch -f ですよ。

$ git fetch origin
$ git branch -f master origin/master

どんなに master と origin/master が離れていても一瞬で実行が終わります。

より安全に master ブランチをリモートに追従したい

branch -freset --hard は怖いって人にオススメのコマンドがあります。 rebase です。

$ git fetch origin
$ git rebase origin/master master

これならコミットしていない変更があれば rebase が実行できませんし、コンフリクトが起きたら git rebase --abort で元の状態に戻すことができます。

ブランチから辿れないコミットを探す方法

git reflog を使えば、だいたいなんとかなります。(使い方は適当にググって)

あと、 git reflog show <branch_name> でブランチの履歴が表示できるので、もし git branch -f でミスっても簡単に戻せます。

ブランチや reflog で辿れないオブジェクトを探す

git fsck --lost-found の使い方は昔ブログに書いてあるので、それを参考に頑張って探しましょう。

git add さえしていれば、ギリギリなんとかなる。 git add をしていない作業は諦めて。

sinsoku.hatenablog.com

まとめ

git branch -f は速いし、ミスっても git reflog show <branch_name> で簡単に復旧できるので、みんな使いましょう!

「Randomly Failing Specs」という内容でLTしました #railsdm

資料は Slide Share で公開しています。

www.slideshare.net

話したかったこと

時間切れで全く話せていませんでしたが、本当は「 sleep 使わずに直しましょう」って事が伝えたかった。 資料の作り方や発表内容で完全に失敗してる。

このブログ読んだ方は是非スライドの図を見て、 Capybara のお気持ちを感じ取って欲しい。

他のLT登壇者はだいたい最後の方まで話せていて、流石だなーと思いながら聞いていました。

同人誌

電子版を BOOTH で公開してみました。*1

booth.pm

紙版を購入頂いた方には無料で電子版をお渡ししたいと思っていたので、パスワード付zipを使って用意しました。 パスワードを生成するのが面倒なのですが、他に良い方法が思い浮かびませんでした。申し訳ない。

次回の技術書典では、最初から電子版を用意したいと思います。

*1:というか、これに手間取っていてブログ公開が遅れていた

Rails クイズ: 次のコードで rollback されるのはどれでしょう?

先日、仕事のコードで遭遇して「なんだこの動き...」と思ったので、ブログに書いておく。

Rails クイズ: 次のコードで rollback されるのはどれでしょう?(配点10点)

常にバリデーションエラーになるモデル Bomb と no 属性によってコールバックを制御できる User クラスがあります。

# app/models/bomb.rb
class Bomb < ApplicationRecord
  belongs_to :user
  validate -> { errors.add(:base, ':bomb:') }
end

# app/models/user.rb
class User < ApplicationRecord
  has_many :bombs
  has_one :bomb

  attr_accessor :no

  before_validation -> { bombs.build }, if: -> { no.to_i == 1 }
  before_create     -> { bombs.build }, if: -> { no.to_i == 2 }
  before_validation -> { build_bomb },  if: -> { no.to_i == 3 }
  before_create     -> { build_bomb },  if: -> { no.to_i == 4 }
end

このとき、下記の 1〜4 のコードの内で「 ロールバックされて、DBに保存されない 」のはどれでしょう? 全て挙げなさい。

User.new(no: 1).save!
User.new(no: 2).save!
User.new(no: 3).save!
User.new(no: 4).save!

解答について

解答を書くと面白くないので、気になる人は試してみましょう!

「プロを目指す人のためのRuby入門」を読んだ感想

一応、お仕事で Ruby やっているプロだけど、本の内容が気になったので買ってみました。

昨日、先行販売している紀伊國屋書展 新宿本店で購入(正式発売日は11月25日)。

ラス2だったので、結構ギリギリ。そして、一気に読んでみた。

技術書は油断するとすぐ積み本に進化するので、意識高まった時に読み切った方が良い。

私のRuby

  • プログラマ歴は10年くらい
  • 仕事で Rails を6年くらい
  • Rails 含め gem のソースコードは普通に読む
  • メタプロやモンキーパッチは普通に使う
  • gem にプルリク投げることもある

どう見ても、Ruby入門者ではない。

本の感想

対象者について

本書はプログラミング未経験者向けの本ではない点に注意してください。 http://blog.jnito.com/entry/2017/11/20/054316

著者の @jnchito さんも自身のブログで紹介しているように、プログラミング未経験者向けではないです。 ただ、「入門書なので Ruby 上級者には役に立たない」なんて事もなかったです。

初心者と中級者は悩む必要なく買って良いと思います。 将来、プロとして Ruby のプログラミング書くなら、これだけ実践的で分かりやすい本を買っておくのは良い投資です。

gem のソースコード読んだり、メタプロ使いこなすような上級者に関しては9割知ってる内容だと思うので、ざっと目を通して Ruby 雑学*1を理解したあと、周りの初心者にオススメするのが良いです。 上級者の方々は若いエンジニアに教える機会も多いだろうし、そういう時に役立つと思います。

Windows 環境をフォロー

Web 上には動作環境の記載されていない情報が溢れているので、初心者だと問題が起きたときに調査に時間かかることが多い。

本書には Windows 環境で起こる問題への対応方法が丁寧に書かれているので、入門者でも安心して読めそうです。

エラー内容を日本語で説明

「エラーメッセージを読み、理解してからソースコードを直す」といった慣れた人にとっては当然の所作を、入門者でも分かるように手順を1つずつ説明していて、このあたり流石だなと読みながら感じました。
英語のエラーメッセージに日本語訳もつけてあるので、英語が本当に苦手な人でも本書は理解しながら読み進められると思います。

さらに「英語が苦手でも辞書片手に調べるのが大事」「Webの記事は注意して読みましょう」など、英語から逃げずにエラーメッセージをちゃんと読む姿勢についても言及されていて非常に良い。英語を読むのは本当に大事。

サンプルコードが豊富

サンプルコードは基本的にテストを先に書くようになっており、自然とTDDの基本的な考えを学べるようになっています。

Ruby動的言語なのもあってテスト書くのがとても大事なので、「テスト書くのが普通」になるような例題の作り方は素晴らしいと思いました。

個人的に勉強になったもの

だいたい知っている内容だったのですが、個人的に「へぇー」と思ったのは下記の2つ。

  • splat展開で配列を結合する話
  • :: でメソッド呼び出しできる話

仕事で使うかは微妙だけど、Ruby 雑学として勉強になりました。 あとは「ここ数年使ってないけど、そういえば(そんな記法も)あったな」て内容がちょこちょこ紹介されていて面白い。

入門者に紹介したくなった項目

本読みながら、「ここに1行追加して入門者に紹介したい!」って事が1つあったので、ブログで紹介しておきます。

Predicate Methods / Bang Methods

英語だと?で終わるメソッドは「Predicate Methods」、!で終わるメソッドは「Bang Methods」と呼ばれています。

Web の記事を読んだり、検索する際に知っていると少し便利です。

本書の良くないところ

個人的に何かを勧めるときはデメリットも挙げておくのが好きなので、あえて書いてみる。

Twitter にも書いたように、リーダブルじゃない記法まで紹介されていて少し気になりました。 入門書なのに、メインの章内でほぼ使わないような記法まで紹介されていて、入門者にとっては覚えること多くて少し大変かも?

とはいえ、微妙な記法には必ず「極力使わない方が良いです」と説明されていますし、「プロを目指すため」なら知っておくべきなので、紹介されている方が良い気もする。

無理やり挙げた感じのデメリットです。
というか、他に挙げるところが思い浮かばないくらいに良い本だったんですよ。

まとめ

「分かりやすく、読みやすい。そして、実践的。」

と、Ruby 入門としてはかなり良い本ではないかと思います。

あと、個人的にはサンプルコードが豊富で写経しやすい本なので、電子書籍よりは紙の方が便利かなと思いました。

*1:仕事で使うには読みづらく、微妙な記法だけど Ruby としては正しい構文

#技術書典3 でサークル参加したことのふりかえり

先日、ブログに書いたように技術書典3にサークル参加していたので、そのふりかえりをブログに書いておく。

sinsoku.hatenablog.com

同人誌を作成した環境

Re:VIEW + Docker を使用して pdf を作成する環境を作りました。 CircleCI でビルドして、textlint で簡単な日本語のチェックも行いました。

ビルド方法

ローカルに下記のスクリプトを作成して、使っていた。

build

#!/bin/sh

ROOT=$(cd $(dirname $0)/;pwd)
IMAGE=vvakame/review

docker run --rm -v ${ROOT}:/work ${IMAGE} /bin/sh -c "cd /work && rake clean pdf"

使い方は ./build を実行するだけで、実行すると config.yml を使って book.pdf が出来る

CircleCI の設定

.circleci/config.yml

version: 2
jobs:
  build:
    docker:
      - image: vvakame/review
    steps:
      - checkout
      - run: npm i
      - run: npm t
      - run: rake clean pdf
      - store_artifacts:
          path: book.pdf
          destination: book.pdf

textlint の設定

package.json

{
  "name": "book",
  "version": "0.1.0",
  "dependencies": {
    "textlint": "^8.2.1"
  },
  "devDependencies": {
    "textlint": "^8.2.1",
    "textlint-plugin-review": "^0.3.3",
    "textlint-rule-preset-japanese": "^2.0.0",
    "textlint-rule-preset-jtf-style": "^2.3.0"
  },
  "scripts": {
    "test": "textlint *.re"
  }
}

.textlintrc

{
  "rules": {
    "preset-japanese": true,
    "preset-jtf-style": {
      "1.1.3.箇条書き": false,
      "4.2.6.ハイフン(-)": false
    }
  },
  "plugins": [
    "review"
  ]
}

印刷所

いくつか印刷所はあるのですが、最終的に名前の可愛い ねこのしっぽ を使いました。

そして、入稿締切は10/18(水)と一番遅い「ねこスパーク」のプランを選択。

入稿とトラブル

  • 10/18(水)
    • 04:00頃 入稿
    • 17:00頃 入稿に不備が発覚
    • 印刷所の方と相談し、翌日朝まで待って頂くように調整(特急料金で10%up)
    • 22:00頃 用紙サイズとフォント問題は解決。用意サイズの変更に伴い、全ページのデザインが崩れる。
  • 10/19(木)
    • 02:00頃 全ページの校正が完了

印刷所から指摘された不備とその対応

  • 表紙にレイヤーが残っていた
    • レイヤーを結合して、表紙を再アップロード
  • pdf の目次やリンクに色がついている
    • 印刷所でグレースケール化の対応を依頼
  • B5 の注文なのに、pdf のサイズは A4 になっている
    • 19日夜に対応。これにより 60p => 80p とページ数が増加。
  • フォントが埋め込まれていない
    • 別のフォントを使うようにして対応

ちなみに、ねこのしっぽではノンブルは無くても大丈夫ですが、他の印刷所だと必要なケースがあるので注意。

B5の対応

review-init で生成されていた config.yml にはコメントで下記のような記述がある。

# 1ページの行数文字数と1kbごとのページ数を用紙サイズで指定する(A5 or B5)。
# page_metric: A5

これを B5 にして、コメント外して安心してたけど、どうやらこれだと駄目らしい。

  # LaTeX用のdocumentclassを指定する
  # texdocumentclass: ["jsbook", "uplatex,oneside"]
+ texdocumentclass: ["jsbook", "b5j,twoside,openany,uplatex"]

documentclass を指定する必要があった。難易度が高い。

フォントの埋め込み

正直、詳細はよく分からないけど、Type3 のフォントが実際は埋め込まれているのに、印刷所で認識できていないらしい?

で、他のメジャーなフォントを使うように変更したから、問題が解決した・・・という事なのかな。 よく分かっていない。

とりあえず kmuto さんのアドバイス通りに変更したところ修正できた。

sty/reviewmacro.sty

+\usepackage{lmodern}
 %% from review-pdfmaker
 \usepackage{fancyhdr}
 \pagestyle{fancy}

進捗状況のグラフ化

GitHub で原稿を書いていたので、実際のコミットログをグラフにしてみました。

締切に追われている人の状況が見事に可視化されていますね。

コミット数

$ git log --date=format:"%Y-%m-%d" --no-merges --author=sinsoku --format="%cd" | uniq -c
   6 2017-10-19
  15 2017-10-18
  23 2017-10-17
   5 2017-10-16
   4 2017-10-15
   4 2017-10-14
   3 2017-10-11
   6 2017-10-10
   1 2017-10-09
   5 2017-10-08
   1 2017-10-07
   7 2017-10-06
   4 2017-10-04
   4 2017-10-02
   2 2017-10-01
   1 2017-09-30
   1 2017-09-25
   2 2017-09-23
   1 2017-09-22
   2 2017-09-20
   3 2017-09-17
   2 2017-09-16
   1 2017-09-11
   1 2017-09-03
   1 2017-08-26
   1 2017-08-24
   6 2017-08-10

f:id:sinsoku:20171023001014p:plain:w600

変更量

$ git log --date=format:"%Y-%m-%d" --no-merges --author=sinsoku --shortstat --format="%cd" | paste -d , - - -  
2017-10-19,, 1 file changed, 15 insertions(+)
2017-10-19,, 1 file changed, 50 insertions(+), 19 deletions(-)
2017-10-19,, 1 file changed, 1 insertion(+), 1 deletion(-)
2017-10-19,, 1 file changed, 1 insertion(+), 1 deletion(-)
2017-10-19,, 1 file changed, 6 insertions(+), 5 deletions(-)
2017-10-19,, 1 file changed, 34 insertions(+), 25 deletions(-)
2017-10-18,, 1 file changed, 14 insertions(+), 9 deletions(-)
2017-10-18,, 1 file changed, 10 insertions(+), 8 deletions(-)
2017-10-18,, 1 file changed, 9 insertions(+), 12 deletions(-)
2017-10-18,, 1 file changed, 5 insertions(+), 4 deletions(-)
2017-10-18,, 1 file changed, 6 insertions(+), 3 deletions(-)
2017-10-18,, 1 file changed, 11 deletions(-)
2017-10-18,, 2 files changed, 11 insertions(+), 11 deletions(-)
2017-10-18,, 1 file changed, 1 insertion(+)
2017-10-18,, 3 files changed, 96 insertions(+), 1 deletion(-)
2017-10-18,, 1 file changed, 8 insertions(+), 8 deletions(-)
2017-10-18,, 2 files changed, 2 insertions(+), 2 deletions(-)
2017-10-18,, 3 files changed, 9 insertions(+), 9 deletions(-)
2017-10-18,, 1 file changed, 17 insertions(+), 1 deletion(-)
2017-10-18,, 7 files changed, 9 insertions(+), 9 deletions(-)
2017-10-18,, 1 file changed, 44 insertions(+), 15 deletions(-)
2017-10-17,, 2 files changed, 6 deletions(-)
2017-10-17,, 1 file changed, 1 insertion(+), 1 deletion(-)
2017-10-17,, 1 file changed, 1 insertion(+), 1 deletion(-)
2017-10-17,, 3 files changed, 5 insertions(+), 3 deletions(-)
2017-10-17,, 1 file changed, 1 insertion(+), 1 deletion(-)
2017-10-17,, 1 file changed, 5 insertions(+), 5 deletions(-)
2017-10-17,, 1 file changed, 27 insertions(+), 26 deletions(-)
2017-10-17,, 1 file changed, 33 insertions(+), 37 deletions(-)
2017-10-17,, 1 file changed, 16 insertions(+), 27 deletions(-)
2017-10-17,, 1 file changed, 1 insertion(+), 1 deletion(-)
2017-10-17,, 2 files changed, 1 deletion(-)
2017-10-17,, 1 file changed, 145 insertions(+), 18 deletions(-)
2017-10-17,, 3 files changed, 69 insertions(+), 11 deletions(-)
2017-10-17,, 4 files changed, 3 deletions(-)
2017-10-17,, 1 file changed, 280 insertions(+), 1 deletion(-)
2017-10-17,, 1 file changed, 27 deletions(-)
2017-10-17,, 1 file changed, 20 insertions(+), 4 deletions(-)
2017-10-17,, 1 file changed, 78 insertions(+), 5 deletions(-)
2017-10-17,, 2 files changed, 49 insertions(+), 22 deletions(-)
2017-10-17,, 1 file changed, 31 insertions(+), 5 deletions(-)
2017-10-17,, 1 file changed, 92 insertions(+), 16 deletions(-)
2017-10-17,, 2 files changed, 0 insertions(+), 0 deletions(-)
2017-10-17,, 1 file changed, 1 insertion(+)
2017-10-16,, 1 file changed, 62 insertions(+), 17 deletions(-)
2017-10-16,, 2 files changed, 43 insertions(+), 17 deletions(-)
2017-10-16,, 1 file changed, 7 insertions(+), 7 deletions(-)
2017-10-16,, 1 file changed, 29 insertions(+), 24 deletions(-)
2017-10-16,, 6 files changed, 204 insertions(+), 9 deletions(-)
2017-10-15,, 1 file changed, 27 insertions(+), 14 deletions(-)
2017-10-15,, 1 file changed, 54 insertions(+), 19 deletions(-)
2017-10-15,, 1 file changed, 46 insertions(+), 13 deletions(-)
2017-10-15,, 1 file changed, 2 insertions(+), 1 deletion(-)
2017-10-14,, 1 file changed, 40 insertions(+), 11 deletions(-)
2017-10-14,, 1 file changed, 10 insertions(+)
2017-10-14,, 1 file changed, 53 insertions(+), 6 deletions(-)
2017-10-14,, 1 file changed, 71 insertions(+), 6 deletions(-)
2017-10-11,, 1 file changed, 55 insertions(+), 8 deletions(-)
2017-10-11,, 1 file changed, 6 insertions(+), 1 deletion(-)
2017-10-11,, 11 files changed, 241 insertions(+), 120 deletions(-)
2017-10-10,, 3 files changed, 37 insertions(+), 37 deletions(-)
2017-10-10,, 1 file changed, 26 insertions(+), 10 deletions(-)
2017-10-10,, 1 file changed, 14 insertions(+), 14 deletions(-)
2017-10-10,, 1 file changed, 50 insertions(+), 2 deletions(-)
2017-10-10,, 8 files changed, 7 deletions(-)
2017-10-10,, 1 file changed, 1 insertion(+), 1 deletion(-)
2017-10-09,, 1 file changed, 115 insertions(+), 30 deletions(-)
2017-10-08,, 6 files changed, 79 insertions(+), 11 deletions(-)
2017-10-08,, 1 file changed, 34 insertions(+), 17 deletions(-)
2017-10-08,, 2 files changed, 2 insertions(+), 7 deletions(-)
2017-10-08,, 1 file changed, 1 insertion(+), 1 deletion(-)
2017-10-08,, 4 files changed, 0 insertions(+), 0 deletions(-)
2017-10-07,, 5 files changed, 41 insertions(+), 10 deletions(-)
2017-10-06,, 1 file changed, 12 insertions(+), 8 deletions(-)
2017-10-06,, 1 file changed, 2 insertions(+)
2017-10-06,, 21 files changed, 258 insertions(+), 255 deletions(-)
2017-10-06,, 1 file changed, 324 deletions(-)
2017-10-06,, 3 files changed, 30 insertions(+)
2017-10-06,, 2 files changed, 6 insertions(+), 1 deletion(-)
2017-10-06,, 1 file changed, 3 insertions(+), 3 deletions(-)
2017-10-04,, 38 files changed, 11 insertions(+), 22 deletions(-)
2017-10-04,, 1 file changed, 29 insertions(+), 2 deletions(-)
2017-10-04,, 1 file changed, 42 insertions(+), 2 deletions(-)
2017-10-04,, 1 file changed, 43 insertions(+), 4 deletions(-)
2017-10-02,, 1 file changed, 20 insertions(+), 2 deletions(-)
2017-10-02,, 1 file changed, 19 insertions(+)
2017-10-02,, 1 file changed, 51 insertions(+), 18 deletions(-)
2017-10-02,, 1 file changed, 116 insertions(+), 32 deletions(-)
2017-10-01,, 2 files changed, 4 insertions(+), 1 deletion(-)
2017-10-01,, 22 files changed, 156 insertions(+), 63 deletions(-)
2017-09-30,, 4 files changed, 128 insertions(+), 22 deletions(-)
2017-09-25,, 18 files changed, 113 insertions(+), 103 deletions(-)
2017-09-23,, 7 files changed, 18 deletions(-)
2017-09-23,, 20 files changed, 130 insertions(+), 51 deletions(-)
2017-09-22,, 13 files changed, 150 insertions(+), 18 deletions(-)
2017-09-20,, 1 file changed, 7 insertions(+), 5 deletions(-)
2017-09-20,, 1 file changed, 5 insertions(+)
2017-09-17,, 1 file changed, 1 insertion(+), 1 deletion(-)
2017-09-17,, 18 files changed, 48 insertions(+), 48 deletions(-)
2017-09-17,, 1 file changed, 27 insertions(+), 21 deletions(-)
2017-09-16,, 34 files changed, 132 insertions(+), 25 deletions(-)
2017-09-16,, 2 files changed, 15 insertions(+), 6 deletions(-)
2017-09-11,, 1 file changed, 5 insertions(+), 1 deletion(-)
2017-09-03,, 2 files changed, 48 insertions(+), 9 deletions(-)
2017-08-26,, 3 files changed, 304 insertions(+), 40 deletions(-)
2017-08-24,, 7 files changed, 68 insertions(+), 9 deletions(-)
2017-08-10,, 1 file changed, 3 insertions(+)
2017-08-10,, 1 file changed, 17 insertions(+), 1 deletion(-)
2017-08-10,, 1 file changed, 11 insertions(+)
2017-08-10,, 2 files changed, 11 insertions(+)
2017-08-10,, 9 files changed, 1244 insertions(+)
2017-08-10,, 1 file changed, 1 insertion(+)

f:id:sinsoku:20171023002353p:plain:w600

まとめ

もし技術書典4があるなら、次は余裕をもった入稿をしたいと思う。

少なくとも、朝4時に入稿はもう経験したくない。

#技術書典3 で「Clean Code for Rails」という本を頒布します

10月22日(日) の秋葉原UDXで開催される技術書典3にて、Railsの同人誌を頒布します。

サークル名は「う07 Tech翠屋」で、頒布価格は1,000円です。

表紙

f:id:sinsoku:20171021174403p:plain:w300

目次

f:id:sinsoku:20171021174415p:plain:w300

f:id:sinsoku:20171021174423p:plain:w300

内容について

Rails でアプリケーション開発する上で基本的なこと、中規模以上になると起きがちな事例、などを書いた本になっています。

Rails の初〜中級者の方は「こんな事例もあるのか...」と勉強になる事が多いと思いますし、上級者の方でも Rails 5 で増えた機能や Devise + OmniAuth の話は参考になるかなと思います。

Rails エンジニアで少しでも面白そうだなと思ったら、是非10月22日(日)は「う07」まで遊びにきて下さいー。 よろしくお願いします。