書籍「メタプログラミング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は、MyClassがselfとなる場所に定義 されている。つまり、これは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>
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
でログインできることを確認できた。