ruby-on-rails
Development

Railsで複数のasset_hostを動的に切り替える方法

弊社ではRailsアプリのproduction環境ではasset_syncを使ってs3にcssやjsを置くのが定番になっています(世間的に見てもそうかもしれないけど)

asset_syncを使った場合。静的ファイルのホストがRailsアプリと別になるので以下のようにasset_hostを設定します

# config/environments/production.rb
Rails.application.configure do
  config.action_controller.asset_host = '//s3-bucket-name.ap-northeast-1.amazonaws.com'
end

通常はこれで問題ないのですが、s3 bucketの別名を複数用意して静的ファイル読み込みの高速化を図るとか、物理的にデータが別のs3 bucketにあるから変えなきゃいけないなんてときに困ってしまいますよね。

最初はasset_pathをゴニョゴニョするのか…?なんて思ったんですがasset_hostにProcオブジェクトを設定するともとスマートに対応出来ました。

例として、/assets以下のリソースにアクセスする場合と、その他でs3 bucketを分ける場合は

# config/environments/production.rb
Rails.application.configure do
  config.action_controller.asset_host = proc { |source|
    bucket = source.include?('/assets') ? 'assets-bucket' : 'other-bucket'
    "//#{ bucket }.ap-northeast-1.amazonaws.com"
  }
end

引数のsourceはリクエストのパスが渡ってきます。この場合だと ‘/assets/application-87rfhsou4fo4.css’ みたいな感じですね。

標準
ruby-on-rails
Development

複数のRailsアプリで同じDBを使う場合にschema_migrationsを分ける方法

複数のRailsアプリで同じDBに接続する場合DBのマイグレーション履歴が同じschema_migrationsテーブルに格納されるのはちょっとこわい。

でもschema_migrationsって名前はRailsが決めているものだからどうやって変更するの?というのを調べたら接頭辞を使えばいいみたいで

# config/application.rb
module SampleApp
  class Application < Rails::Application
    ...
    config.active_record.table_name_prefix = 'sample_'
  end
end

上記のようにやっておくとアプリ全体のテーブル名にsample_が付くようになって、問題の箇所はsample_schema_migrationsというテーブル名になります。

ちなみにAdminユーザーテーブルを共有して同じアカウントでログイン出来るようにする場合は、sample_接頭辞をつけている側で

# app/models/admin.rb
class Admin < ActiveRecord::Base
  self.table_name_prefix = ''
end

というように個別モデル毎に接頭辞をなくしてあげることも出来るので複数アプリで同じテーブルを参照できますね。

ちなみにDeviseを使っているのでconfig/initializers/devise.rbでconfig.secret_keyを合わせてあげないとログインできませんでした。

多分複数アプリでschema_migrationsを共有しても問題なくて、rake db:migrate:statusすると存在しないmigrationの部分は ********** NO FILE ********** と表示されるだけなんだけどね。

標準
ruby-on-rails
Development

[Rails] has_many through な関連をチェックボックスで操作するときに苦労した話

WordPressのカテゴリー選択UIみたいのをつくりたい

Railsで多対多の関係を定義する方法として has_and_belongs_to_many ではなく has_many through を使うようになって久しいですが、accepts_nested_attributes_forfields_forを使って関連データを親モデルのフォームから操作するのは未だに慣れません。

ググって調べたところによると、RailsCastsで紹介されている方法が紹介されている方法が一般的なんですかね。

#196 Nested Model Form (revised)

Github ryanb/nested_form

この方法だとテキストフィールドをつけたり外したりするのが便利なんだけど、既に用意されているリストから選ぶUIの場合、つまりWordPressのカテゴリー選択みたいなのを作るのはキツイのかなと。

スクリーンショット 2014-04-08 9.40.56
↑こんなやつ

[問題]fields_forは関連データを持っていないとブロックを実行しない

そもそも fields_for はオブジェクトが関連データを持っていないとフォームを作成してくれませんよね?

このようなモデルの関係があった場合に

class Article < ActiveRecord::Base
  has_many :categorizations
  has_many :categories, through: :categorizations

  accepts_nested_attributes_for :categorizations, allow_destroy: true
end

class Categorization < ActiveRecord::Base
  belongs_to :article
  belongs_to :category
end

class Category < ActiveRecord::Base
  has_many :categorizations
  has_many :articles, through: :categorizations
end

これだけじゃ fields_for の中は実行されず…

- @article = Article.new

= form_for @article do |f|
  = f.fields_for :categorizations do |cf|
    = cf.collection_select :category_id, Category.all, :id, :name

@article.categorizations.length == 0 だからブロックが実行されないんですよね。
そこで nested_form というgemの出番で、f.link_to_addとかcf.link_to_removeというヘルパーが追加されるので超便利。というのはわかるんだけどこのUIじゃないんですよ作りたいのは。

name属性手書きとか、JavaScriptで対応するの嫌なんです

上記の方法でだめなら fields_for 捨ててinput要素手書きしますか?

- Category.all.each do |cat|
  %label
    %input{ type: 'checkbox', name: 'article[categorizations_attributes][][category_id]', value: cat.id }
    = cat.name

自分で書いててそんなに悪くないかな…とちょっと思ってしまったんですが、やっぱりこんなのダメだと思う。てゆうかこれだと一度つくった関連消せないしね。

となるとチェックボックス外した時にJSで _destroy キーに true をセットする hidden 要素を生成するのか・・・!
いやいやこれも無いでしょ。処理があちこちに散らばるからね。viewをパッと見ただけじゃなんで動いてるのかわからないよ。

そうだ、Helper作ってやろう

となるとどうすりゃいいんだ!あーーー!とか思ってた時にこんな記事を見つけました。

Complex Rails Forms with Nested Attributes

全部読んだわけじゃないんですが、参考にしたのはControllerにもViewにも置きたくない複雑な処理をHelperに書いているところ。なんだ普通のコトじゃないかと思うかもしれませんが、いや僕もこれ書いてて普通だなって思いましたが見つけた時は結構目からウロコだったんですよね。

なので僕のViewコードはこうなりました

= form_for setup_categorizations(@article) do |f|
  %ul
    = f.fields_for :categorizations do |cf|
      %li
        %label
          = cf.hidden_field :id
          = cf.hidden_field :category_id
          = cf.check_box :apply, { checked: cf.object.persisted? }
          = cf.object.category.name

setup_categorizations でArticleモデルを渡して既に関連付けられていないcategoryだけをbuildしてセットしています

module ArticleFormHelper
  def setup_categorizations(article)
    Category.all.each do |cat|
      unless article.categorizations.select{ |c| c.category_id == cat.id }.any?
        article.categorizations.build({ category_id: cat.id })
      end
    end
    article
  end
end

categorizations_attributes として渡すパラメータに apply というキーの真偽値を仕込んであるのでこれを元に以下の処理をController側で行います

  1. applyキーが0でpersistedなデータなら_destroyフラグを立てる
  2. applyキーが1ならcategory_id付きで残しておく

この処理をRails4ならstrong parameter使いつつこんな感じにしておいて

class ArticlesController < ApplicationController
  include ArticleFormHelper

  def create
    @article = Article.new(article_params)
    ....
  end

  private
    def article_params
      _params = params.require(:article).permit(:title, :body, categorizations_attributes: [:id, :category_id, :apply])
      setup_categorizations_attributes(_params)
    end
end

先ほどのArticleFormHelperにsetup_categorizations_attributesメソッドを追加します

module ArticleFormHelper
  ....

  def setup_categorizations_attributes(params)
    # キーが数字の文字列のhashになっていたため配列にする "0" => {id: 1}
    attrs = params[:categorizations_attributes].dup.map{ |k, v| v }
    params[:categorizations_attributes] = attrs.inject([]) { |res, attr|
      if attr[:apply].to_i == 0
        res.push({ id: attr[:id], _destroy: 1 }) if attr[:id].persent?
      else
        res.push({ id: attr[:id], category_id: attr[:category_id] })
      end
      res
    }
    params
  end

自分的にはこれでスッキリしたんですが、もっといい方法あったら是非教えて欲しいです。
あとモデルの命名どうなの?とかもあったらコメントしてもらえると嬉しいです!

標準
title-coding
Design

サイトコピーしてコーディング修行 その1

こんにちは!新人森田です。
入社してからあっという間に3ヶ月が経ちました。
まだまだ知ることが山積みすぎますが、ここからは更に気合い入れていきます!

そして久しぶりのブログ更新ですすみません。
ネタ探しに行き詰まって違うことしてました。
何をしていたかというと、サイトコピー的なことです。
サイト模写はデザインのスクリーンショットを撮ってPhotoshopでトレースし、間の使い方だったり平面的な勉強が出来ます。
サイトコピーはコーディングで同じようなサイトを作るので、模写の効果+コーディングの腕も上がるんじゃないかという目論見です。

仕事で少しずつコードを触るようになりちょっとしたアイコンなどを画像として切り出して処理していたら、師匠から画像を使わないやり方を教わって目からウロコだったり。
ギャラリーサイトでかっこいいなーと思ったサイトをレスポンシブにしたくなったり。
そんな経緯があって始めてみました。
参考元の作り方を批判したいわけじゃなく、どうやったらより良く作れるかの練習です。
作業する上でのルールもなんとなく決めてみました。

サイトコピーのマイルール

(コード読み解くのめんどくさいから)出来るだけ元のコードは見ない
色とかフォント情報などは参考にしますが、自分でやり方を模索するためです。

(Photoshop立ち上げるのめんどくさいから)出来るだけ画像を使わない
画像を使わないほうが軽いし、修正も楽かもしれない。という言い訳です。使うときは使います。

こんな感じで、ここからはどんな感じで進めたのかをご紹介。

制作準備

制作環境を整える

Bootstrapの回と同様、やっぱり最初は制作環境です。
自分でフォルダ作ってローカルで確認しつつっていう感じでも出来ますが、Compassなどの導入・scss使うにはscout起動必須、などなど結構手間だったりします。というか最初はそうやってました。
が、そんなやり方をしなくてもあるんです。便利ツール。

Middleman

どん!師匠に教えていただいたMiddlemanという静的サイトジェネレータです。
これはRubyをベースに作られているため、まずRuby環境を整える必要があります。
やり方はRubyを始めようで詳しく紹介しています。

最初が少しむずかしくても、Middlemanを導入すればちょっとコマンドを書くだけで至れり尽くせりな環境を作ってくれます。

0327-4

サーバーも立ち上がるみたいだし、練習するにはこの上ありません。

コピーしたいサイトを探す

ギャラリーサイトにも色々あるし、それをまとめたものもググればすぐ出てくるんですが。
あえて挙げるとしたら、このへんがいいかもです。

io3000
どこのまとめサイトでもオススメされてる使い勝手の良いサイトです

muuuuu.org
最近はやりの1ページ完結型の縦長サイトがたくさんあります

これらは国産サイトのギャラリーですが、そのうち海外のデザインも参考にする予定。
おそらく1つはコピーしたいものが見つかったと思うので、早速作業にうつりましょう。

私の作ったものを例に挙げながら作業の様子をお伝えしていきます。

Chowder’sのコンテンツをコピーする

まず1つめに選んだのは、Chowder’sというスープ屋さんのサイトの一部です。
メニューラインナップの下に、本日の名言とおすすめメニューの紹介があります。
このデザインがシンプルなのに可愛くて、すごく気に入ってしまいました。

構成を考える

まずどんな構造かを調べてみます。
コンソールで背景画像を消してみると、要素のひとつひとつがよく見えます。

0327-1

見てみると、見出しがそれぞれ画像だったので、cssだけで作ってみようと思います。

0327-2

まずはこんな風にボックス要素の構成を決めます。

コーディングする

画像の代わりにcssのborderを使うことで周囲の線を処理。
ポストイットに見せかけた黄色いボックスも頑張ればいけそうですが、さすがにそこまでやるとコードがごちゃごちゃしそうなので画像を使います。
Google Fontsを使って見出しのフォントを似せれば完成です。

↑スクロール出来ます
日替わりコンテンツのため、引用したスクリーンショットと内容は違ってます。
スープの画像のところは角丸にしたdivにbox-shadowを使ってそれっぽく。
完全再現とまではいきませんがだいぶ近いはず。

まとめ

今回の例はコンテンツの1部なのであまり複雑なことはしていません。
でもcssだけでもフラットなデザインなら画像なしで結構いけちゃうことが分かりました。
英字ならGoogleFontsで表現の幅もぐっ広がりますね。

というわけでウォーミングアップ編は終了です。
ここから徐々にコピーする範囲をサイト全体に広げていきたいと思います。
次回もお楽しみにー!

標準
ruby-on-rails
Development

Ruby on Rails 4 でアプリを新規作成してherokuで公開するまで

Railsシリーズ始めて見たいと思います。初回は初心者向けにRailsアプリの新規作成とheorkuへのデプロイを紹介したいと思います。Rubyのインストールについてはこちらの記事で紹介しています。

heroku

heroku(ヘロク)とはPaaSというジャンルのサービスで、Rails等で作ったWebアプリケーションをサーバの設定などを行わずにすぐに公開できるサービスです。
基本的には無料で使えて、本番環境として使う場合は有料プランが推奨されています。

phpならレンタルサーバーを借りて作ったファイルをFTPすれば動かせますが、rubyとなるとVPS等でサーバーの設定をして…とかちょっと面倒ですよね。herokuを使うと、gitリポジトリにpushするだけでWebアプリを公開できるのでとっても楽ちんだし、タダで使えるしいい感じです。

herokuを使うためにはまずアカウントを取得して、heroku toolbeltををインストールします。
サインアップ
https://id.heroku.com/signup
ツールベルト
https://toolbelt.heroku.com/

Rails 4 アプリを作る

今回は特に何もしないアプリケーションを作ります。
まずターミナルを開いてアプリを作るディレクトリに移動して、アプリを格納するディレクトリを作成します。
ここで注意してください。作成するディレクトリ名はRailsアプリのネームスペースになりますので後で後悔しないような名前に!

$ cd path/to/workspace
$ mkdir kozo-sample-rails4

ディレクトリを作成したらそこに移動して、Gemfileを作成します。
Gemfileはbundlerというgemを使うために必要なファイルですが、bundlerがインストールされていない場合は先に入れておきます。

$ gem list | grep bundler
bundler (1.3.5)

↑このような表示になればインストールされていますが、インストールされていない場合は以下を実行してください。

$ gem install bundler --no-ri --no-rdoc

bundlerを使ってGemfileを作成するには以下を実行します。

$ bundle init

Gemfileが作成できたらエディタで開き、gem “rails” の部分のコメントを外します。

# A sample Gemfile
source "https://rubygems.org"

- # gem "rails" 
+ gem "rails"

Gemfileを保存して閉じたらrailsを現在のディレクトリ以下にインストールします。
具体的には path/to/workspace/kozo-sample-rails4/vendor/bundle 以下にインストールされます。

$ bundle install --path vendor/bundle --without production

–without オプションをつけておくと、heorku環境のみに必要なgemはローカル環境でインストールされるのを防ぐことが出来ます

bundle installが終わったら以下のコマンドを実行してRailsアプリのひな形を作成します。

$ bundle exec rails new . --skip-bundle

1つずつ説明していくと、bundle execまでが先ほどbundle installでインストールしたgemを使うことを示しています。
rails new . は現在のディレクトリに新しいrailsアプリのひな形を作成します。–skip-bundleはひな形作成後に自動でbundle installが行われるのを防いでいます。
途中でGemfileを上書きする確認(Overwrite /Users/kozo/tmp/kozo-sample-rails4/Gemfile? (enter “h” for help) [Ynaqdh])がありますが上書きして良いのでそのままエンターキーを押してください。

ひな形が出来たらまたGemfileを開いて、以下の記述を追加します。追加する場所はどこでもOKです。

group :production do
  gem 'rails_12factor'
  gem 'pg'
  gem 'unicorn'
end

sqlite3がheroku環境にインストールできないようなのでsqlite3の行を以下のように変更します。

gem 'sqlite3', group: [:development, :test]

追加したらbundle installを実行します。(Gemfileを編集したら必ずbundle installを実行しないと意味がないのでセットで行うと覚えておきましょう)

次にProcfileというファイルをGemfile等と同じ場所に作成していかの内容を入れておきます。

web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb

さらに configフォルダの中にunicorn.rbというファイルを作成して以下の内容を入れておきます。

worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3)
timeout 15
preload_app true

before_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
    Process.kill 'QUIT', Process.pid
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection
end

これでherokuに公開するgem等は用意出来たのですが、肝心のトップページがありませんので各箇所に以下の記述を追加します。

config/routes.rb (長いコメントは削除してしまいましょう)

KozoSampleRails4::Application.routes.draw do
  root to: 'pages#home'
end

app/controllers/pages_controller.rb (デフォルトでは用意されていないので作成してください)

class PagesController < ApplicationController
end

app/views/pages/home.html.erb (こちらもデフォルトは用意さていないので作成してください)

<%= Time.now %>

トップページを表示する準備ができたのでサーバーを起動して確認してみます。

$ bundle exec rails s

http://localhost:3000にアクセスして現在時刻が表示されたら成功です。

ここまできたら後はデプロイするだけ!あと一息です。
herokuのデプロイにはgitが必要なのでアプリのディレクトリでgitリポジトリを作成し、最初のコミットを実行します。

$ git init
$ git add .
$ git commit -m "Initial commit"

次にherokuのアプリを登録します。(heorkuコマンドを最初に実行するときはログインが必要です)

$ heroku create kozo-sample-rails4

kozo-sample-rails4の部分はアプリ名ですので作ったアプリの名前に合わせる等してください。kozo-sample-rails4はもう使えませんよ!

herokuにアプリの登録ができたらgit pushを実行します。

$ git push heroku master

ズラズラっとherokuのデプロイログが出力されますので無事終わったら以下のコマンドでブラウザを開きます。

$ heroku open

2014-03-02 08:13:26 +0000 と表示されました!ブラウザをリロードすると時間が進むはずです。

標準
IMG_1929
Development

Rubyで生まれた日から何日目なのかを計算してみよう

さて予告通り今回はRubyを使って今日は生まれてから何日目なのかを計算するプログラムを書いてみたいと思います。

ファイルを準備する

まず適当なフォルダを作りテキストエディタでcalc_days.rbという名称の空のテキストファイルを作成します。

スクリーンショット 2014-01-08 15.07.31

今回はデスクトップにdevというフォルダを作りファイルを作成しました。
Rubyでコードを書くファイルの拡張子は .rb にしましょう。

コードを書く

それではコードを書いていきましょう。
要件は

  1. 誕生日(西暦、月、日)を設定
  2. rubyコマンドで動作させると答えのテキストを表示する

これだけです。

誕生日を設定

まずRubyで時間を扱う際にはTimeというオブジェクトを使います。馴染みのない人にはオブジェクトってなんだ?という感じだと思いますがここでは深く考えずに流してしまいましょう。

たとえば僕の生年月日 1985年10月18日 をRubyのTimeオブジェクトを使って表すと以下のようになります。

Time.gm 1985, 10, 18

ただしくRubyとして動作するかを確認するために行頭に p を加えて以下のようにしてみましょう。

p Time.gm 1985, 10, 18

保存したらターミナルから ruby Desktop/dev/calc_days.rb と打ち込んでみます。すると以下のように文字が表示されました。

ruby Desktop/dev/calc_days.rb
1985-10-18 00:00:00 UTC

これで僕の誕生日を認識していることがわかったので、以下のようにして誕生日を何度でも使えるように “変数” という入れ物に収めておきます。

birth_day = Time.gm 1985, 10, 18

こうすることで誕生日を扱う度に Time.gm… と書かずに、birth_dayと書くだけでRubyが認識できる誕生日を作ったことになります。

試しに以下のようにしてみると何度も同じ誕生日を表示できると思います。

birth_day = Time.gm 1985, 10, 18
p birth_day
p birth_day
p birth_day
ruby Desktop/dev/calc_days.rb
1985-10-18 00:00:00 UTC
1985-10-18 00:00:00 UTC
1985-10-18 00:00:00 UTC

現在時刻との差を求める

現在時刻は Time.now と表します。
差を求める場合は算数の引き算をするだけです。

Time.now - birth_day

簡単ですね。ただし答えは引き算の様に右側に書くのではなく式の左側に返ってきます。

diff = Time.now - birth_day

diffはdifferentの略です。こうすることで今度は現在時刻との差をdiffという変数に収めることが出来ました。

diffの中身をおなじみの p を使って確認してみます。

diff = Time.now - birth_day
p diff
ruby Desktop/dev/calc_days.rb
890721908.4752661

なにやら桁数の多い数値が表示されましたね。
これは誕生日から現在までの秒数を表しています。なのでこれを1日分の秒数で割れば何日経っているのかがわかるというわけです。

一日の秒数は 60秒×60分×24時間 で求められるので以下のように表します。

one_day_seconds = 60 * 60 * 24

掛け算は * で行います。
ついでにone_day_secondsという変数に収めておいたのでdiffをこれで割ってみましょう。

days = diff / one_day_seconds

割り算は / で行います。
かなりゴールに近づいてきた感じです。p でdaysの中身を確認してみます。

days = diff / one_day_seconds
p days
ruby Desktop/dev/calc_days.rb
10309.286028564247

小数点以下が長い数値ですね。細かい部分は四捨五入して表示させてみましょう。
days.round と書くと小数点以下を四捨五入してくれます。

days = diff / one_day_seconds
p days.round
ruby Desktop/dev/calc_days.rb
10309

これだけだとちょっと寂しいので最後にメッセージを交えて表示させてみましょう。

days = diff / one_day_seconds
p "あなたが生まれてから#{ days.round }日が経ちました"

Rubyで文字を扱うには ” コーテーションで囲う必要があるのですが、文字列の中で #{ と } を使うと変数を埋め込めるという機能が有ります。
これを実行すると以下のようになります。

ruby Desktop/dev/calc_days.rb
"あなたが生まれてから10309日が経ちました"

いい感じですね。
以上でRubyで生まれた日から何日目なのかを計算するプログラムは完成です。
コード全体は以下のようになります。

birth_day = Time.gm 1985, 10, 18
diff = Time.now - birth_day
one_day_seconds = 60 * 60 * 24
days = diff / one_day_seconds
p "あなたが生まれてから#{ days.round }日が経ちました"

まとめ

プログラミングの未経験者にはこれだけでも少し重い作業かもしれませんが、わりと簡単に数行書くだけで面倒な計算を素早くやってくれることがお分かりいただけたかと思います。
次回以降もRubyを使って徐々に高度なものを作って見たいと思います。

標準
IMG_1929
Development

Rubyを始めよう

新年あけましておめでとうございます。
本年もよろしくお願い致します。

さて開発日記の一発目はrubyプログラミングを始めるための第一歩をご紹介したいと思います。

プログラミングってなに?

まずプログラミングとは何でしょうか…?ズバリ一言で説明できるものでもないのですが、簡単に言うとコンピューターに作業をしてもらうための指示書を書く行為なのかなと思います。

コンピューターは計算機ですから例えば自分が生まれた日から今日で何日目なの?といっためんどくさいことも日数を足し算するプログラムを書いておけば何度でも同じ計算をしてくれてラクですよね。
ほかにもブログの文字数を数えて読み終わるのにかかるおよその時間を計算するとかもわかりやすいプログラミングの例かと思います。

ただしこの “プログラムを書く” というのがちょっと難しいんです。
前述の例で言えば「日数の足し算ってどうやるの?」「1月は31日だけど2月はうるう年で日数変わるよね?」と疑問がいくつか湧いてきますし、プログラムには書き方のルール(文法)があるので間違った書き方ではコンピューターはちゃんと動いてくれません。

Rubyってなに?

ruby-logo

そこでRubyの出番です。でもRubyだとめちゃくちゃ簡単かと聞かれればそんなことは無いです。ただRubyには “書きやすさ” や “楽しさ” 、”わかりやすさ” があります。

これはプログラミングをする上でとても大事なことだと思います。なぜならプログラミングをする目的はコンピューターに意図したとおりに動いて計算してもらうことなので、初心者が目的までの道のりで挫折してしまわないように気を配ってくれるイメージでしょうか。
また、わかりやすいコードであれば一ヶ月後の自分も、他人にも何をしているのかすぐに把握できるメリットがあります。

そんなRubyは20年ほど前に日本人の開発者である、まつもとゆきひろさんが作ったそうです。今では世界的にメジャーなプログラミング言語なので沢山の海外WebサービスでもRubyが使われています。

インストール

さてRubyを使うためにはコンピューターにRubyがインストールされていなければいけませんので、インストールの手順をご紹介します。

Mac OS X Mavericks の人

あなたのMacには既にかなり新しいRubyがインストールされていますので何もする必要はありません。

Mac OS X Mountain Lion以前の人

これに該当する人はMacにインストールされているRubyのバージョンが1.8とちょっと古いです。なのでできれば以下の手順で2.0以降をインストールすることをおすすめします。(Rubyの世界では枯れた古いバージョンを使い続けるよりも、なるべく新しいバージョンを使う傾向があります。この方が動作が速くセキュリティ性能が向上しているからです)

  1. XCodeをインストール
    AppStoreからXCodeを検索してインストールしてください
  2. XCode Command Line Toolsをインストール
    環境設定 > Downloads からCommand Line Tools という項目がある場合はこちらもインストールしてください
  3. ターミナルを起動する
    アプリ−ケーション > ユーティリティ > ターミナル.app をダブルクリックして起動してください
  4. git コマンドが使えるか確認
    ターミナルに git –version と打ち込んでバージョン情報が表示されるか確認をしてください。
    僕の環境では git version 1.8.3.4 (Apple Git-47) と表示されました
  5. rbenv をインストール
    以下のコマンドを打ち込んでください

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

    続けて以下のコマンドを打ち込んでください

     echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
     echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
  6. ターミナルを再起動
    といってもウィンドウを一旦閉じてからもう一度ウィンドウを開くだけでOKです
  7. ruby-buildをインストール
    以下のコマンドを打ち込むだけです

    git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
  8. ruby 2.0.0-p353 をインストール
    以下のコマンドを打ちこんでください

     rbenv install 2.0.0-p353

    しばらく待ってインストールが完了したら以下のコマンドを打ち込んでください

     rbenv global 2.0.0-p353
  9. インストール手順は以上です

Windowsの人

僕はWindowsで開発しないのであまり詳しくありませんが、RubyInstallerというソフトを使うと簡単にインストールできるようです。

使い方

まずは適当なフォルダを作っておくといいと思います。
特にこだわりがなければデスクトップにdevというフォルダを作ってください

スクリーンショット 2014-01-07 17.46.57

 

次にテキストエディタでプログラムを書きたいのですが、MacならTextmateがおすすめです。windowsならTerapadとかでしょうか。
人気のエディタにSublimetext(Mac、Windows両対応)というのがありますが有料なので1ヶ月くらい経つと使えなくなるようです。

エディタが用意できたら以下のようにコードを書いてhello.rbという名前で保存しましょう。

p 'Hello World'

保存できたらターミナルを起動して以下のコマンドを打ち込んでください。

ruby Desktop/dev/hello.rb

“Hello World” という文字が表示されたと思います。

これはプログラムの最初の一歩として定番の儀式のようなもので、Hello Worldに特に意味はありませんが簡単に動作を確認できたと思います。

使い方は以上です。拡張子 .rb というテキストファイルにコードを書き、ruby コマンドに続けてコードファイルの場所をターミナルに打ち込めばrubyプログラムが動作します。

まとめ

お使いのコンピューターでrubyは動いたでしょうか?
プログラミングはコンピューター1つでできる作業であまり場所や時間にとらわれないので意外なほど身近に感じられたのではないでしょうか。
まだHello Worldしかしていないので全然おもしろくないと思いますが。次回以降で先に触れた「生まれてから今日は何日目?」等のプログラミングを解説していきたいと思います。

標準