書籍「メタプログラミングRuby」に記載されている、クラスインスタンス変数の説明文が、どうにも腹落ちしなくて

 ASCII「メタプログラミングRuby」を読んでいて疑問に思った部分がある。 同著のP.144からP.145にかけて、「4.1.4 クラスインスタンス変数」の説明があって 以下はそこからの引用。

class MyClass  
  @my_var = 1
  
  def self.read; @my_var; end
  def write; @my_var = 2; end  
  def read; @my_var; end  
end  
  
obj = MyClass.new  
obj.write  
obj.read             #=> 2  
MyClass.read         #=> 1 
  
 上記のコードでは、2つのインスタンス変数を定義している。どちらも同じ@my_var
という名前だ。しかし、それぞれ異なるスコープで定義されており、別々のオブジェク
トに属している。動作を確認するには、クラスは単なるオブジェクトであること、それ
から、プログラムを読むときはselfを追いかけることを思い出す必要がある。1つ目
の@my_varは、objがselfとなる場所に定義されている。つまり、これはobjオブジェ
クトのインスタンス変数だ。2つ目の@my_varは、MyClassselfとなる場所に定義
されている。つまり、これはMyClassオブジェクトのインスタンス変数だ。こちらは
クラスインスタンス変数と呼ばれる。

疑問に思ったのは、上記の説明文4行目の終わりから始まる、以下の部分

1つ目の@my_varは、objがselfとなる場所に定義されている。
つまり、これはobjオブジェクトのインスタンス変数だ。

この説明で、「1つ目の@my_var」とは、class MyClass の次の行の

@my_var = 1 

のことを指しているものと思いますが、私の考えだと、これはobjで参照 されるオブジェクトのインスタンス変数 ではなく、クラスインスタンス変数 であって、説明文中、「2つ目の@my_var」として記されている、

def self.read; @my_var; end 

によって、MyClass定義の外側から、その値を読めるようにしているのでは ないでしょうか?

それとも、説明文のとおり、class MyClass の次の行の

@my_var = 1 

は、「objオブジェクトのインスタンス変数」なのでしょうか?

もし、そうで あるならば、私が何について理解が足りないか ご教示いただけると幸いです。


追記

テラテイルという、わりと最近できたQAサイトに質問を投げたら、回答して頂けた。 ありがとうございました。

小技ネタ - Rubyの配列で、重複する要素をひとつにする。

a = ["x","y","x","z","y","x"]

があったときに、

a |= []

とする。

[taskapp@localhost]$ irb
irb(main):001:0> a = ["x","y","x","z","y","x"]
=> ["x", "y", "x", "z", "y", "x"]
irb(main):002:0> a |= []
=> ["x", "y", "z"]
irb(main):003:0> 

Apache + Passenger のときのSECRET_KEY_BASEの渡し方

SECRET_KEY_BASEの値を作る。

irbを起動

irb(main):001:0> require 'securerandom'
=> true
irb(main):002:0> SecureRandom.hex(64)
=> "<ランダムな長い文字列>"

Apache設定ファイルの修正

VirtualHost設定の中で、 以下のようにSetEnvを使って設定する。

<VirtualHost xx.xx.xx.xx>
  SetEnv SECRET_KEY_BASE <生成された文字列>
</VirtualHost>

アセットコンパイルしてからWebRickで起動すると、画像が表示されない件

アセットコンパイルしてからWEBrickで起動すると、画像が表示されない
という状況が起きたが、以下にて対応

vi config/environments/production.rb

以下の行を

# Disable Rails's static asset server (Apache or nginx will already do this).  
config.serve_static_assets = false

コメントアウト

#config.serve_static_assets = false

して、再度WEBrickを起動したら画像が表示された。

Missing `secret_key_base` for 'production' environment が出たのをどうにかする件

Ruby on Rails環境構築ガイド」を読みつつ、RoRアプリの開発からデプロイまでの
手順をお勉強中。第7章「RubyのビルドからRailsアプリケーションの設置まで」に
そって、自作したRailsアプリ(taskappという)を

bundle exec rails s -e production

して、ブラウザからport3000に対してアクセスしたら、以下のエラーが
ブラウザに表示された。

Internal Server Error  
Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml`

WEBrick/1.3.1 (Ruby/2.1.2/2014-05-08) at taskapp.com:3000"

解決方法を調べていたら、以下をみつけた。

「実践Ruby on Rails4」P.103
http://goo.gl/KnCu3p

同著も持っているので読んでみて、以下で解決

ruby -e 'require "securerandom"; print SecureRandom.hex(64)' > ~/.taskapp_secret_key_base

vi ~/.bash_profile

で、以下の行

export SECRET_KEY_BASE=`cat ~/.taskapp_secret_key_base` 

を追加してから再度、シェルにログインしてSECRET_KEY_BASEにランダムなキー文字列が 設定されていることを確認。

その後、

bundle exec rails s -e production

して、ブラウザからアクセスしたらRailsアプリのトップページが表示された。

RoR 事始め その5

rails new からテストサーバによる起動確認

「実践 Ruby on Rails 4」の第4章を参考にさせて頂きました。

(1) 作成した仮想マシン

vagrant ssh

でログインして次を実行

rails new taskapp -d mysql --skip-test-unit

無事にソースコードが生成されたのを確認してから、

cp -rT taskapp /vagrant

でソースを移動。いらなくなったディレクトリは削除

rm -rf ~/taskapp

bundleがnokogiri 1.6.2.1で止まってハマる

前項からの続き。
cd /vagrantでソースディレクトリに移動。

やはり「実践 Ruby on Rails 4」のP.46のGemfileを参考に、 3行目に

ruby 2.1.2

を追記し、あとは同著の説明に従って以下のようにGemfileを修正

source 'https://rubygems.org'

ruby '2.1.2'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.1.0'

# Use mysql as the database for Active Record
gem 'mysql2'

# Use SCSS for stylesheets
gem 'sass-rails', '~> 4.0.3'

# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'

# Use CoffeeScript for .js.coffee assets and views
gem 'coffee-rails', '~> 4.0.0'

# See https://github.com/sstephenson/execjs#readme for more supported runtimes
gem 'therubyracer',  platforms: :ruby

# Use jquery as the JavaScript library
gem 'jquery-rails'

# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
gem 'turbolinks'

# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.0'

# bundle exec rake doc:rails generates the API under doc/api.
gem 'sdoc', '~> 0.4.0',          group: :doc

# Spring speeds up development by keeping your application running in the background. Read more:          https://github.com/rails/spring
gem 'spring',        group: :development

# Use ActiveModel has_secure_password
gem 'bcrypt', '~> 3.1.7'

# Use unicorn as the app server
# gem 'unicorn'

# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development

# Use debugger
# gem 'debugger', group: [:development, :test]


gem 'nokogiri', '~> 1.6.1'
gem 'rails-i18n', '~> 4.0.1'

group :test do
    gem 'rspec-rails', '~> 3.0.0.beta2'
    gem 'spring-commands-rspec', '~> 1.0.1'
    gem 'capybara', '~> 2.2.1'
    gem 'factory_girl_rails', '~> 4.4.1'
    gem 'database_cleaner', '~> 1.2.0'
end

上記のようにGemfileを修正、保存したのち、

bundle

を実行した結果、

An error occurred while installing nokogiri (1.6.2.1), and Bundler cannot continue. Make sure that gem install nokogiri -v '1.6.2.1' succeeds before bundling.

というエラーメッセージが出力されて、bundleが止まってしまった。
ネットで調べてみると、どうやら、 nokogiri 1.6.2.1がインストールできない問題に遭遇
してしまったらしい。

以下のような情報にあたりつつ、解決策を探る。

vagrant で plugin install 時に nokogiri-1.6.2.1 のビルドエラーになるのを回避する術 http://www.hsbt.org/diary/20140522.html

nokogiriをインストールしようとしてlibxmlのエラーが発生 http://qiita.com/mist_dev/items/f93b714d8fbc974bb0dc

Unable to install plugins that depend on nokogiri in Vagrant 1.6+ https://github.com/mitchellh/vagrant/issues/3769#issuecomment-42947813

上記を読み解決の方法を読んでいて、Gemfileの

gem 'nokogiri', '~> 1.6.1'

を、~>を除去して、nokogiriのバージョンを1.6.1を決め打ちで指定すれば
いいのではないか?と思いました。なので、

gem 'nokogiri', '1.6.1'

と修正してから再度、bundleを実行したらうまくいきました。 以下は、bundle実行時のログ

$ vagrant ssh
Last login: Sun Jun 29 15:12:56 2014 from ネカフェのIPなので割愛(^_^);
Welcome to your Vagrant-built virtual machine.
[vagrant@localhost ~]$ cd /vagrant
[vagrant@localhost vagrant]$ vi Gemfile
[vagrant@localhost vagrant]$ bundle
Fetching gem metadata from https://rubygems.org/.........
Fetching additional metadata from https://rubygems.org/..
Resolving dependencies...
Using rake 10.3.2
Using i18n 0.6.9
Using json 1.8.1
Using minitest 5.3.5
Using thread_safe 0.3.4
Using tzinfo 1.2.1
Using activesupport 4.1.0
Using builder 3.2.2
Using erubis 2.7.0
Using actionview 4.1.0
Using rack 1.5.2
Using rack-test 0.6.2
Using actionpack 4.1.0
Using mime-types 1.25.1
Using polyglot 0.3.5
Using treetop 1.4.15
Using mail 2.5.4
Using actionmailer 4.1.0
Using activemodel 4.1.0
Using arel 5.0.1.20140414130214
Using activerecord 4.1.0
Using bcrypt 3.1.7
Using bundler 1.6.3
Installing mini_portile 0.5.3
Installing nokogiri 1.6.1
Installing xpath 2.0.0
Installing capybara 2.2.1
Using coffee-script-source 1.7.0
Using execjs 2.2.1
Using coffee-script 2.2.0
Using thor 0.19.1
Using railties 4.1.0
Using coffee-rails 4.0.1
Installing database_cleaner 1.2.0
Installing diff-lcs 1.2.5
Installing factory_girl 4.4.0
Installing factory_girl_rails 4.4.1
Using hike 1.2.3
Using multi_json 1.10.1
Using jbuilder 2.1.1
Using jquery-rails 3.1.1
Installing libv8 3.16.14.3
Using mysql2 0.3.16
Using tilt 1.4.1
Using sprockets 2.11.0
Using sprockets-rails 2.1.3
Using rails 4.1.0
Installing rails-i18n 4.0.2
Using rdoc 4.1.1
Installing ref 1.0.5
Installing rspec-support 3.0.2
Installing rspec-core 3.0.2
Installing rspec-expectations 3.0.2
Installing rspec-mocks 3.0.2
Installing rspec-rails 3.0.1
Using sass 3.2.19
Using sass-rails 4.0.3
Using sdoc 0.4.0
Using spring 1.1.3
Installing spring-commands-rspec 1.0.2
Installing therubyracer 0.12.1
Using turbolinks 2.2.2
Using uglifier 2.5.1
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.

RoR 事始め その4

vagrant upしてsshできるまで

Vagrantfileとプロビジョニングスクリプトは、「実践 Ruby on Rails 4」の サポートページから拝借させて頂きました。

(1) 同著のサポートページ
http://www.oiax.jp/jissen_rails
から、
Vagrantfile (CentOS 6.5 用) (1.0.1)
http://www.oiax.jp/books/files/vagrant-rails-centos6.5.3-1.0.1.zip
をダウンロードし、解凍

(2) 解凍してできるフォルダ vagrant-rails-centos6.5.3-1.0.1
taskapp
という名前に変更

なお書籍「実践 Ruby on Rails 4」では、baukisという名前に変更する
ことになっていますが、後々、構築したいアプリが別にあるので、
それにあわせています。

(3) taskapp フォルダをWindowsエクスプローラから

C:\MinGW\msys\1.0\home\user01\projects

の直下に移動

(4) MinGWシェルを開き、

cd ~/projects/taskapp

でtaskappディレクトリに移動し、

vagrant up

を実行

(5)しばらく待っていると、仮想マシンの構築に失敗

原因を調べて、PCのWindowsが32ビットなのが関係しているかも?と当たりをつけて、
Vagrantfileの

config.vm.box = "centos6.5.3"
config.vm.box_url = "https://github.com/2creatives/vagrant-centos/" +
    "releases/download/v6.5.3/centos65-x86_64-20140116.box"

となっている部分を

config.vm.box = "Centos_6-5_i386"
config.vm.box_url = "https://dl.dropbox.com/s/3fgr7lbvcpn51py/centos_6-5_i386.box"

と変更して再度、vagrant upする。

(6)めでたく仮想マシンの構築が完了して、

vagrant ssh

でログインできることを確認できた。