旧gaaamiiのブログ

間違ったことを書いている時があります。コメントやTwitter、ブコメなどでご指摘ください

(お試し)Rails5.1でAngular環境を生成する

Rails5.1からwebpackビルド環境を生成してくれる,Angularもできるという話を聞いたので rails new してみただけのメモです。

$ gem install rails -v 5.1.0.beta1
$ rails new myapp --webpack=angular
$ cd myapp/app/javascript
$ ~/myapp/app/javascript (master #)$ tree -L 3
.
├── hello_angular
│   ├── app
│   │   ├── app.component.ts
│   │   └── app.module.ts
│   ├── index.ts
│   └── polyfills.ts
└── packs
    ├── application.js
    └── hello_angular.js

関連

qiita.com

www.chirashiura.com

RailsでDecoratorを作る意味を調べた

Railsで、モデルの内容をビューに出すときにちょっと加工するみたいな時、そのコードはどこに書けばいいんだ問題。

デザインパターンの一つにDecoratorパターンというのがあって、これを適用させるのが良いらしい。この用途ではactive_decoratorと並んで人気のgem、draperの説明がとてもわかりやすかった。

draperのREADMEで挙げられているのは、Articleという記事のモデルがあり、これの公開状態を表示させる機能を実装するという例だ。これを読み、なぜヘルパーメソッドやモデルに直に実装するんじゃだめなの?という疑問に対する答えを意訳していく。

ヘルパーメソッドを作る場合

ヘルパーメソッドで書くと、こうなる。

# app/helpers/articles_helper.rb
def publication_status(article)
  if article.published?
    "Published at #{article.published_at.strftime('%A, %B %e')}"
  else
    "Unpublished"
  end
end

しかし、これには以下の問題がある。

But it makes you a little uncomfortable. publication_status lives in a nebulous namespace spread across all controllers and view. Down the road, you might want to display the publication status of a Book. And, of course, your design calls for a slighly different formatting to the date for a Book.

(意訳:けど、これはちょっと気持ち悪い。publication_statusは、全てのコントローラとビューに広がったはっきりしないネームスペースに存在している。将来、(Articleではなく)Bookのpublication statusを表示したくなるかもしれない。そしてこれにはもちろん、違った日付フォーマットが必要になるだろう。)

そりゃあまずいですね。

モデルに書く場合

Without a decorator, you'd have to implement the publication_status method in the Article model. That method is presentation-centric, and thus does not belong in a model.

(意訳:デコレーターを使わないとすると、Articleモデルにpublication_statusメソッドを実装することになるだろう。それはプレゼンテーションセントリックで、そのため一つのモデルには属さない。)

プレゼンテーションセントリックってのはビュー優先の考え方ってことかな。「ビューのためにモデルの責務を逸脱してない?それだめじゃない?」みたいな解釈をした。

Decoratorの役割

そこでお待ちかねのDecoratorの登場。Decoratorっていうのはデザインパターンの1つで、オブジェクトに対して新しい責務を追加してくれるもの。draperを使うと、

@article = Article.find(params[:id]).decorate

という感じでモデルを装飾することができる。

デコレーターというと難しい印象を受けるけど、装飾という意味の英単語なので、オブジェクトが最初から着膨れしないように、外に出るときだけおめかしして出れるようにしてくれるのがデコレーターだと捉えると腑に落ちる感がある。

雑感

こういうのが良いんだとすると、rails g controllerした時にモデル名に対応するヘルパーが生成される意味がよくわからない。PostsHelperというモジュールがあったら、「Postに対して何かするときのメソッド書いていきゃいいんだなー」と思って好き勝手書いてしまう。「あ、いや全体に影響するからDecorator作った方がいいよ」と後から知らされるのはどうなんだろう。

あと、オブジェクト指向理解するのに相変わらず苦労してるんだけど、やたら「責務」という単語が頻出することに気付いた。とにかく「おいそれ誰(どのオブジェクト)がやるべきなんだ」というのを強く意識し続けなければいけないというのがオブジェクト指向のつらみなのかなと、今のところはそんな感じで捉えてる。

追記

そもそもhelperのロードを対応するコントローラだけにする設定もあるとのこと。

qiita.com

参考

http://qiita.com/r7kamura/items/75026dc087fdc359a4cf

railsコマンドを追う

Ruby on Railsというフレームワークを使うとrails new Hogeとかでアプリケーションのひな形ができちゃって、rails serverでサーバーが立ち上げられたりするわけですが、これは一体どうなってるんだというのを追っていけたらなと思います。誰にでもわかるように書きたいです。今回こそはくじけずに書ききりたい。

railsとbin/railsの違い

railsはシステムにインストールされたrailsコマンドを呼ぶ(/Users/ユーザー名/.rbenv/shims/railsみたいな)。

bin/railsはそのプロジェクト下のbin/railsのコマンドを呼ぶ。

bin/rails

Railsプロジェクトを作ると、binというディレクトリの中にrailsというファイルがある。これをエディタで開いてみる。

$ vim bin/rails

中身はこんな感じ。

#!/usr/bin/env ruby
APP_PATH = File.expand_path('../../config/application',  __FILE__)
require_relative '../config/boot'
require 'rails/commands'

たった4行だ。

1行目

#!/usr/bin/env ruby

いきなり意味がわからない。

シバン

この記述、「シバン」(shebang)と呼ばれるもので、インタプリタを指定するために書かれるらしい。普通にRubyスクリプト実行するときはruby rails.rbみたいに実行するんだけど、今回はrailsというファイルをrubyで解釈してもらいたいわけなので、ファイル内で「Ruby使うよ」っていうのを言ってあげる必要がある。そのため、このshebangが必要になっている。

要は、#!という2文字でOSに対して「これshebang行だからね」と伝え、/usr/bin/env rubyrubyインタプリタを使うと伝えてる。

2行目

APP_PATH = File.expand_path('../../config/application',  __FILE__)

APP_PATHに入るのがなにか分からない場合はこの行の後にp APP_PATHというコードを挿入してbin/railsを実行すれば見れる。

"/Users/ユーザー名/プロジェクト名/config/application"

このAPP_PATH、どこで使うことになるんだろう...?

3行目

require_relative '../config/boot'

これは普通に、config/boot.rbをrequireしてる。require_relativeを使うと、相対パスを指定してファイルを読み込むことができる。

boot.rb

では、このboot.rbの中身を見てみる。

1行目
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)

ENVというのはRuby環境変数を表すオブジェクト。ハッシュと違う点はキーにも値にも文字列しか指定できないというところ。

何やらプロジェクトのGemfileのパスをENV['BUNDLE_GEMFILE']という環境変数に入れているようだ。||=という演算子は「無かったら(厳密には「偽か未定義なら」)入れてね」という意味。

2行目
require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])

ENV['BUNDLE_GEMFILE']にはGemfileのパスが入っている。「そこにGemfileあったらbundler/setupをrequireしてね」というような意味。

requireはどこを探しに行くのか

この記事がわかりやすい。

requireは引数のファイル名のRubyファイルを読み込んで実行するメソッドです。引数が絶対パスだったときはそのファイルを、そうでない場合はロードパスを優先順位上位から辿って最初に見つかったファイルをロードする。

じゃあ上記のrequire 'bundler/setup'はどうなってるのか。

rails consoleirbを立ち上げて、以下を実行する。

$LOAD_PATH.each {|path| p path };nil

ぐあーっとパスが表示されるので、bundlerがありそうなところを探す。ちなみに表示する際、返り値として$LOAD_PATHが返ってくるととても見づらいのでここではセミコロンで区切ってnilを返り値にしてる。ぐあーっと表示されるのはほとんどgemのファイルなので、そういうの(kaminariとかjquery-railsとか)は無視してざっと見ると、bundlerのディレクトリが見つかる。

"/Users/ユーザー名/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/bundler-1.6.3/lib"

ここに移動する。

cd /Users/ユーザー名/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/bundler-1.6.3/lib

で、lsで見ると、bundlerというディレクトリとbundler.rbというファイルが見つかる。 ls bundlerでbundlerディレクトリの中身を表示。すると、setup.rbというファイルが見つかる。

setup.rb

setup.rbを開くと、430行くらいのコードが書かれている。全部見るのきついので「ああセットアップするんだろーな」という雰囲気だけ感じて、ファイルを閉じる。参照元のboot.rbが、GemfileがあればBundlerをセットアップするというのはわかった。setup.rbももう少し読んだ方がいいんじゃないかと思いつつ逃げるようにbin/railsに戻る。

4行目

4行目はなんだかとても楽しそう。commandsっていう名前からして明らかにこのエントリの本筋に迫る感じだ。

require 'rails/commands'

Railsrailtiesっていうライブラリにぎっしりと機能が詰まっているというのが記憶のどこかにあったので、それを見てみる。

cd /Users/ユーザー名/プロジェクト名/vendor/bundle/ruby/2.1.0/gems/railties-4.1.4/lib

案の定、railsというディレクトリとrails.rbというファイルがある。今はcommands.rbを探しているので、それを見てみる。

vim rails/commands.rb

こんな感じ。

ARGV << '--help' if ARGV.empty?

aliases = { 
  "g"  => "generate",
  "d"  => "destroy",
  "c"  => "console",
  "s"  => "server",
  "db" => "dbconsole",
  "r"  => "runner"
}

command = ARGV.shift
command = aliases[command] || command

require 'rails/commands/commands_tasks'

Rails::CommandsTasks.new(ARGV).run_command!(command)

おお!実行してる!コマンド実行してる! rails serverとタイプした時の流れとしては、このcommandという変数に"server"が入り、CommandsTasksインスタンスのメソッドがこれを受け取って処理してくれるみたい。インスタンス初期化の時に渡してるARGVの中身は、コマンド後のオプション。


というわけで、railsコマンドをタイプした時に内部で何が起きてるのかをざっくりと見てみました。ちょっとざっくりしすぎている部分はまた書き足すかもしれません。

Deviseで作ったUserモデルにnameカラムを追加しようとしたらstrong_parametersに阻まれた時の対処

ググって見つかった記事(Rails Deviseでサインアップ用のユーザー登録フォームに、独自の入力フィールドを追加する | EasyRamble)とかを参考にして「ああこれなら簡単そう」だと思ってたんだけど気づいたらけっこうな時間ハマってた。

原因はRails4からのstrong_parameters。

deviseで作ったユーザーモデルにnameカラムを追加しようと思って、rails g migration AddNameToUsersとかやって、ビューにフォーム用意して、いざサインアップしようとしたら以下の様なエラー。

Processing by Devise::RegistrationsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"xxxxxxxx", "user"=>{"name"=>"gaaamii", "email"=>"gaaamii@example.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Sign up"}
Unpermitted parameters: name

Unpermitted parametersですって。そうかそうか。勝手に追加した値を受け入れてくれるわけないっすよねー。えへへ。とはいってもdeviseが生成したコントローラ、どうやって書き換えるの...?

...と、調べてみるとdeviseのREADMEにちゃんと書いてあった。

In case you want to permit additional parameters (the lazy way™) you can do with a simple before filter in your ApplicationController.

class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) << :username
  end
end

【Rails】ログインした後に元のページにリダイレクトする

こちらを参考にしました。

def store_location
  session[:return_to] = request.request_uri
end

リクエスト情報からurlを取ってセッションに保存しています。ただ2009年の記事だったため情報が古かったのか、request_uriメソッドを呼べませんでした。requestオブジェクトに入っているurlを取るにはfullpathでアクセスできるようです。

request.fullpath

ASIN複数指定で商品情報を一括取得する方法(Amazon Product Advertising API)

Product Advertising APIの基本的な使い方は省きます。

APIを叩く際はamazon-ecsというgemを使っていて、商品情報は以下のような形で取得していました。

Amazon::Ecs.item_lookup(asin_id,  :response_group => 'ItemAttributes, Images', :country => 'jp')

ID1件ずつAPIを叩いていたんですが、そのせいでAmazonからのレスポンスがとれないことがありました。このAPIには「リクエストは1秒間に1回にしてね」という制限があるので、eachで回して5件分くらいのリクエストを送ると、当然拒否られるわけです。

複数取るにはどうすれば、ということで調べると公式ドキュメントのItemLookupの説明にこう書かれていました。

複数の商品を一度に検索するには、商品IDをカンマで区切ります。

なので、(amazon-ecsを使っている場合には)最初の引数の中身をASIN IDをカンマ区切りにした文字列にしてあげればいいです。

options = {response_group: 'ItemAttributes, Images',country: 'jp'}
asins = []
@items.each do |item|
  asins << item.asin
end 
asins = asins.join(",")
res = Amazon::Ecs.item_lookup(asins, options)

本をおすすめするだけのWebサービス「Yomomo」を作りました

f:id:shgam:20140315004620j:plain

使い方

使い方はこちら。

なんで作ったのか

以前、お世話になっている方からおすすめの本を紹介していただき、Amazonのページを見たら中古で10円くらいだったのでその場で買うという経験がありました。

普段だったら絶対買わないような本でしたが、これが読んでみたらなかなか面白い。直接自分の役に立ちそうなことが書かれているわけではないのだけれども、「こういう考えもあるのか」という発見がいくつかありました。

読む本をいつも自分で決めていると、どうしても同じようなものに偏り、自分の価値観もそれに従うようになります。スティーブ・ジョブズの伝記ばかり読んでいるとクリエイティブで野心的でないといけないような気分になるし、アフロ田中ばかり読んでいると、身の回りで楽しくやれればいいやーという価値観になります(アフロ田中とは埼玉 - 東京あたりを舞台にした世界一おもしろい日常系マンガです)。

偏りがあってもいいじゃんといえばそれまでです。しかし、おすすめされて読んだ本には、自分が読もうとして手にとった本よりも新鮮味や発見があります。新鮮味のある本はそれを読むこと自体、とても楽しいものです。

価値観の偏りを減らし、新鮮な感覚を提供してくれる本。Yomomoを作ったのは、そのような本との出会いを誘発する場所をつくりたかったからです。

特徴

Yomomoにはこだわりが3つあります。

「誰」から「誰」へ

本の紹介は1人から1人に対して行うことになります。なぜかというと、このサービスで最も大事なのは本そのものやレコメンドコメントではなく、「誰」から「誰」へという関係の部分だからです。「あの人がすすめるなら読んでみよう」という気持ちが、普段読まない本を読むきっかけになるはずです。

本を管理しない

どんな本を読んだかということをしっかり記録する必要は無いと考えています。大事なのは本と出会うことです。

本を探さない

本は出会うものです。自分のページに行けば、推薦者の簡潔なコメントとともに新鮮な本がある。繰り返しになりますが、そういう体験を引き起こすのがこのサービスの目指すところです。

始め方

f:id:shgam:20140318032127j:plain

このサイトは基本的に、一人では楽しめないものです。友だちに「こういうサイトあるよ」と言って本を紹介しあってみると徐々に楽しくなってくるかもしれません。

派手な面白さは何もありませんが、ぜひぜひこの機会に本を通じたコミュニケーションを試してみてください。

やらしい話

後で叩かれるのも怖いのでここでお金の話もしておきます。サイト内のリンクを見ればわかりますが、Amazonアソシエイトを利用しています。Yomomo経由でAmazonに飛び商品を購入すると、紹介料が僕に入ってくるわけです。

個人で開発しているからといって、やはりサーバー代くらいは稼ぎたい。いや、本当は自分の人件費分くらいにならないと、趣味で終わってしまいます。趣味で終わってしまうと、だんだん「もういいか」という気持ちになっていくので、「勉強として」とか「趣味で」とかいう逃げはそろそろ使わない方向でいきたいのです。

もちろん、Googleアドセンスのような本と関係のないクリック広告などは一切入れないつもりです。

今後

ひたすら自分で使っては気持ち悪いところを直すという単純な方法で改善していきます。今のところまだまだ気持ち悪いところだらけなので、ごりごりと修正していきます。

外部APIを叩いてレスポンスをDOMに吐き出す際にAjaxを使ったり、モバイルでのデザインの最適化などは早急にやらないといけないですね。使い勝手を良くするためにページ遷移を減らすのはけっこう大事です。モバイルの理想はネイティブアプリを作ることですが、とりあえずはブラウザを通してもある程度快適に使ってもらえるレベルを目指します。

Yomomoというウェブサービスをこっそり公開しています

ブログに公開する時点でこっそりではないですね。おすすめ本を紹介しあうサイトです。アカウント登録は必要ありません。

f:id:shgam:20140315004620j:plain

ロゴ作ってない、モバイル用のデザインが悲惨、などなどありますのでちょっとずつ良くしていきます。詳しくはまた別記事で書くかも知れません。

おすすめの本がありましたらgaaamii宛に教えてくれると嬉しいです。最近小説読んでないので小説希望です。あと、これを作っていて改めてデザインセンスねーなっていうのに気づいたのでデザインに関する本とかも教えてくれると助かります。

(ちなみに、お世話になっている方には僕厳選のおすすめ本を送りつけときました。'yomomo.net/u/ツイッターID'にアクセスしてみてもらうと素晴らしい書籍に出会うかもしれません。)

Ruby on Railsでブログを作成するときに役立った情報まとめ

検索から来た人へ: ここに書かれている情報は古いので、最新の書籍やドキュメントを読むことを強くおすすめします。

(最終更新日:2013/12/19)

Ruby on RailsでちょっとしたCMSを作ろうとしていて、単純なブログ程度の機能はとりあえず作れました。ここらで使ったものやら何やらをまとめておきます。少しずつ書いていきます。

下書きにしておくとだるくなって書かなくなるので最初から公開しておきますが、一段落ついたらTwitter(@gaaamii)で通知します。はてブ付けてくれるとモチベが上がって更新が早くなるかもしれません

書き終えました。

Ruby on Railsの導入

こちらでまとめました。2013/10/13時点での情報です。何かあれば修正しますのでお知らせください。

周辺ツール

Git,GitHub,Heroku(コード管理、デプロイ)

「ローカルで試しに作ってみる」という段階では絶対に必要なものではありませんが、いずれ必要になります。とりあえずは存在を知って、必要になった時にRailsTutorialの該当箇所を読むと良いと思います。

vimテキストエディタ

vimプラグインを管理するツール。まだあまり使いこなせてない。NeoBundleというツールの方が最近のものらしいというのを後から知りました。

vimでツリー表示するためのものです。これがないといちいちディレクトリをcdで移動しまくることになります。

f:id:shgam:20131219011131j:plain

Bundler(gem管理)

gemをBundlerで管理しているとbundle install の遅さにいらいらすることがあると思います。「みんなあの時間なにしてるんだろ」ということをTwitterでつぶやいたところ、id:yss44さんが上記の記事を紹介してくれました。

Bundlerを最新にして設定をちょこっといじると爆速になるよ、という内容です。

便利なgem

テキストエリアのためのgem

テキストエリアに入力されたものをそのまま出しちゃうのはもちろん(scriptタグとか埋め込まれたりして)セキュリティ的にやばいので、出力するときにはエスケープすることになります。

そのときに何かしら置換してあげないと見栄えが悪いです。かといってリッチエディタを用意するのは頭使いそうだし...

そんなお悩みを解決するのがマークダウンです。(qiitaのように)ユーザーとして想定する人が開発者なら、マークダウンさえ使えればオッケーなのではなのではないでしょうか。

タグ付けのためのgem

ブログなんかではたいてい必要になるのがこのタグ機能です。記事を書いて、それに[Ruby]とか[Rails]とか、タグを付ければ情報が整理できますよね。

ところが、これを自分で実装しようとしたら思いのほか難しい。そこで見つけたのがまさにタグ機能のためのgem、act-as-taggable-onです。以下のようなコマンドで簡単にマイグレーションファイルを作ってくれるって言うんだから便利なものです。

rails generate acts_as_taggable_on:migration

デザインのためのgem

おなじみTwitterBootstrapです。最近はCSSフレームワークにYahooの「Pure」を使うという話もちらほら聞きますが、とりあえずはBootstrapを味わい尽くしたいです。

セキュリティ

CSRFとは

Wikipediaでどんなものか把握。Railsではmetaタグにこんな形でtokenを発行することによってCSRF対策を施してる。

<meta content="xxxxxxxxxxxxxx" name="csrf-token">

Strong Parameters

Rails 4からの新機能。コントローラ側で受け取るハッシュを制限するためのものです。具体的にどう危険なの?というのはRailsTutorialのこの部分を見るとわかります。

この脆弱生を突くことはMass Assignmentと呼ばれていて、Rails3でも対策はあったものの管理者次第では穴を作ってしまうケースがあり、何度か問題になっていたようです。

教材・参考資料

インターネット

まずはドットインストールですよね。

じっくりしっかり勉強するのに最適。企業の研修でも使われているほどのクオリティ。「ローカルで何か作る」という意味での手っ取り早さではドットインストールの方が良いかも。

便利なgemの使い方とかが動画チュートリアルで学べる。無料エピソードだけでもそこそこ役立つものが見つかる。

書籍

良書だと言われている通り、良書だった。ただ、書かれている内容はRails3向けなので、MassAssignment対策にはattr_accessibleを使いましょうみたいになっててRails4との違いはところどころに見られる。

検索してよくお世話になったサイトやブログ

情報収集ツール

はてブはやっぱ便利です。Railsの情報を見つけたら[Rails]というタグをつけてひたすらぶっこむという使い方がおすすめです。

感想

情報がたっくさん見つかるので、やっぱRailsを使うことにして良かったなと感じてます。

参考書籍

検索からの訪問が多いので、参考書籍を追記しておきます(2014/12/26)

パーフェクト Ruby on Rails
すがわら まさのり 前島 真一 近藤 宇智朗 橋立 友宏
技術評論社
売り上げランキング: 99,852

Railsで「変なdbスキーマにしちゃったよあわわわわ...」って時にはrake db:migrate:reset

タイトルの通りです。
えっと、タイトルの通りです。

でもこれ初期化なのでデータ入ってる状態でやると中身飛びます。

» rake db:migrate - リファレンス - Railsドキュメント

はじめてのRuby on Rails インストール(VagrantとCentOSとrbenvとRuby 2.0.0でRails 4.0の環境構築の手順)

まとめていきます。いっぺんに書く気力がないので少しずつ書いています。
書き終わりました。

ぶっちゃけドットインストールを見漁ればできるんですが、レッスンが分かれてたり自分が何してるかわからなくなりそうなところが少しあったので、そこをちょっと丁寧に書きたいです。時間が経つと手順を忘れてしまう自分のためでもあります。
環境はMac OS Xです。

流れ

Vagrantを用意する

f:id:shgam:20131013193640j:plain

Vagrantは仮想環境にOSをぶっこんだりぶっこわしたりっていうのを簡単にできるツールです。Vagrantを使うためにVirtualBoxという仮想環境のためのアプリケーションを用意します。

https://www.virtualbox.org/wiki/Downloadsからお使いのOSを選んでインストールします。

f:id:shgam:20131013190519j:plain

VirtualBoxが用意できたら、Vagranthttp://downloads.vagrantup.com/から最新のバージョン・お使いのOSを選んで入れましょう。

f:id:shgam:20131013190632j:plain

Vagrantを使って仮想マシンCentOSを入れる

vagrant box add [boxの名前] [url]

という形でboxの名前とurlを指定して仮想マシンのひな形を取得します。

ここではCentOSを使いますので、下記の通り、http://www.vagrantbox.es/からbox名、urlをコピーして、下記の通りになります。CentOSはサーバによく使われるLinux系のOSです。

vagrant box add centos64box http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130427.box

時間がけっこうかかります。
待っている間に読むおすすめマンガとして、「アフロ田中」という日常系のギャグマンガがあります。松田翔太さんと佐々木希さん主演で映画にもなりました。» 上京アフロ田中全10巻 完結セット (ビッグコミックス)

...

boxの追加が終わったら、作業するスペースを作って移動しましょう。てきとーな名前で大丈夫です。

mkdir myVM
cd myVM

そこで、さっき入れたbox(テンプレート)でマシンを初期化します。

vagrant init centos64box

以下のようなメッセージが出ていれば成功です。

A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

すると、現在の場所(myVM)にVagrantfileという設定ファイルが出来ているはずです。エディタでファイルを開くとこんな感じです。なんかいろいろ書かれてますが、「設定ファイルなんだな」というのが分かればオッケーです。

f:id:shgam:20131013193139j:plain

ここまで確認できたら、ついに仮想マシンを起動させます。

vagrant up

また時間がかかります。先ほどのアフロ田中を読み進めましょう。

...

終わると、マシンが実行された状態になっているのでターミナルから仮想環境に入ります。

vagrant ssh

「Welcome to your Vagrant-built virtual machine.」というメッセージが出て、ちゃんと入れるはずです。これでCentOSを利用できるようになりました。

参考 » Vagrant入門 (全13回) - プログラミングならドットインストール

CentOSにrbenvを入れる

rbenvというのは、Rubyのパッケージ管理ツールです。環境に複数のバージョンのRubyを入れとけるので便利らしいです。

gitを入れる

sudo yum -y install git

yumというのはツールをインストールするためのツールです。-yというオプションはyes/noで聞かれる全てにyesで答えてねという意味です。

rbenvを入れる

git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

rbenvはGitHubに置かれているので、そこから取ってきます。

パス、環境変数の設定

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
exec $SHELL -l

ここらの意味はよくわかりません。誰かおしえてください。

ruby-buildを入れる

次に、「rbenv install」のようにコマンドでささっとRubyをインストールするためのプラグインを入れます。

git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

Ruby 2.0.0を入れる

ようやくRubyを入れるステップまで来ました。ruby-buildを入れたので、これでいけます。

Ruby2.0.0のインストール

rbenv install -v 2.0.0-p247

(追記)インストールできるRubyのバージョンを確認するには、以下のコマンドを打ちます。たぶんlはlistのlですね。

rbenv install -l

時間がかかります。待ち時間に読むマンガですが、「王様達のヴァイキング」というハッカー少年マンガもおすすめです。» 王様達のヴァイキング (1) (ビッグコミックス)

インストールの反映

これやらないと反映されないらしいです。

rbenv rehash

インストールしたものを使うと宣言

複数入れておけるのがrbenvの良いところなので、「このバージョンを使うよ」というのは言わないといけません。

rbenv global 2.0.0-p247

Rails 4.0を入れる

gemをアップデートしとく

gem update --system

Rubyのライブラリはrubygemsのgemコマンドでインストールできます。最新のRailsをインストールしたいのであればこのシステムを最新にしておきましょう。

ドキュメント無しでrailsをインストール

gem install railsでいけるんですけど、riだのrdocだの、ドキュメントもインストールすると時間がかかっちゃうので「それはいらないっす」っていうオプションをつけてインストールします。

あと、-Vというオプションをつけると途中経過が見えるみたいです(試しに-V無しでやったら何してんのかぜんぜんみえなかった)。

gem install rails --no-ri --no-rdoc -V

時間かかるなー...。

反映

rbenv rehash

インストールが完了したら、rails -vで確認しましょう。「Rails 4.0.0」と表示されれば、これで万事オッケーです!
これであなたもDHHです!!!ひゃっほーーーーーー。



この記事を書いてわかったこと

ドットインストール最強です。