ソースコードから理解する技術-UnderSourceCode

手を動かす(プログラムを組む)ことで技術を理解するブログ

RubyMine6.0でRuby2.0、Rails4をデバッグする

Ruby2.1が出たようですが、タイトル通りRuby2.0、Rails4のデバッグ環境として
RubyMine6.0をインストールし、設定しました。

以下、躓いた点と手順を備忘録として挙げておきます。

■RubyMine6.0をインストール
他のサイトに丁寧に解説されているので、そちらを参考にして下さい。

参考サイト
はたふりの興味津々: RubyMineのインストール

スクリプトデバッグするまでの手順

1.Rubyスクリプトデバッグを開始すると、ruby-debug-ideが必要とのエラーが出る。

2.RubyMineやコンソールからruby-debug-ideをインストールしようとすると
 以下のエラーが表示される。
No source for ruby-2.0.0-p353 provided with debugger-ruby_core_source gem.

3.以下のコマンドを実行し、debugger-ruby_core_sourceをインストールする。

$ debugger-ruby_core_source

参考サイト
http://marocchino.postach.io/no-source-for-ruby-2-0-0-p353-provided-with-debugger-ruby-core-source-gem

4.RubyMineでデバッグを開始し、ダイアログに従いruby-debug-ideをインストールする。
 
5.(もしからしたら)コンソールよりruby-debug-baseをインストールする。(よく覚えていない)

6.スクリプトデバッグを実行し、ブレークポイントで止まることなどを確認する。

RailsRSpecデバッグするまでの手順

既存のRailsアプリをデバッグする場合、pry-debuggerとは同時に使用できないようです。
なので、手順は以下の通りです。

1.Gemfileよりpry-debuggerの定義を外す

参考サイト
http://friendfeed.com/rubymine/33eb9fe9/rubyminerailsdebugpry-debugger-idedebug


以上です。

gemを使わずにAngularJSを使用する - ロード時にAngularJSのソースを表示させない

Ruby on Railsにてgemを使わずに、AngularJSを使おうとしたら
AngularJSにより生成されたHTMLが表示される前に
AngularJSのソースが表示される問題に出くわしました。

意外にも苦戦したので、やり方をメモして置きます。
(gemで用意されていないバージョンを使う場合などを想定しています。)

Rails、AngularJSのバージョン
Rails 4.0.0
・AugularJS 1.2.3

■手順
1.AngularJSのサイトより、zipをダウンロードする。

2.zipを解凍し、angular.min.js、angular-resource.min.jsを
 \app\assets\javascriptsにコピーする。

3.application.html.erbのhtmlタグに"ng-app"を追加する。
<html lang="en" ng-app>

ここまでは、通常の手順だと思います。
AngularJSではheadタグ内にscriptタグを出力しないと、上記の
事象が起こるようなので、以下の対策を行います。

4.application.html.erbのjavascript_include_tagを、headタグ内に
 移行する。

<head>
以下略
<%= javascript_include_tag "application" %>
</head>

5.AngularJSのソースを記述し、実行する。

これで、ロード時にAngularJSのソースは表示されず、AngularJSにより
生成されたHTMLが初期表示されるはずです。

なお、Railsのデフォルトの設定である、bodyタグの最後でJavaScript
読み込ませたい場合は、以下のようにすることができます。
(他にもやり方はあると思いますが・・・)

6.\app\assets\javascriptsの中に、フォルダを作成する。

7.フォルダの中に、bodyタグの最後でロードしたいJavaScriptを格納する。

8.application.html.erbのbodyタグの最後(javascript_include_tagがあった行)
 に、先のフォルダのJavaScriptをロードするよう記述する。

<%= javascript_include_tag "フォルダ名/ファイル名" %>
</body>

以上です。

参考サイト
AngularJSでロード中に評価前のマークアップを表示させない方法 - Qiita [キータ]
railsでiphone対応をする基礎知識的な - kobaken75の日記

自動車の動画収集サイトを作りました

タイトルにある通り、Webサイトを作ってみました。
http://www.carvideocollector.net/

Youtubeから自動車の動画を定期的に検索し、自サイト内にリンクをアップするのと
twitterへの投稿を行っています。

作ってみた目的としては、Ruby on Rails、AWSに慣れておきたかったのと
自動車の動画のリンクを定期的にtweetしてくれるbotが欲しかったためです。

まあ、完全に俺得なサイトです。。。

使用した技術としては
・Ruby2.0
・Rails4
・Nginx
Unicorn
Amazon EC2上で稼動
という状態です。

これからも自分の勉強がてら、ちょくちょくと手を入れていくつもりです。

Nginx、Unicornにてapplication.rbの変更を反映する

タイトル通りのことをするために自分が行った操作を
メモとして書いておきます。

具体的には、Nginx、Unicornをそれぞれ再起動しました。
(プライベートのアプリだから許されるかも。24時間稼動のシステムでは・・・?)

■Nginxの再起動
以下のコマンドを実行する。
$ /etc/init.d/nginx restart


Unicornの再起動(ついでに開始、終了も)
Unicornをデーモンとして起動している場合
プロセスの再起動を行う。

1.UnicornのプロセスIDを取得する。
$ ps -ef | grep unicorn | grep -v grep
以下のような感じで、プロセスが取得できる。

user      1912 29572  0 01:17 ?        00:00:07 unicorn worker[0] -c config/unicorn.conf -D                                                                           
user 1915 29572 0 01:17 ? 00:00:09 unicorn worker[1] -c config/unicorn.conf -D
user 29572 1 0 Nov16 ? 00:00:02 unicorn master -c config/unicorn.conf -D

2.masterプロセスの再起動
masterのプロセスID(上記の例では29572)を指定し、プロセスを再起動する。
$ kill -HUP masterのプロセスID

3.プロセスの終了
$ kill -QUIT masterのプロセスID

4.Unicornの起動
アプリケーションのrootフォルダに移動し、以下のコマンドを実行する。
$ unicorn -c config/unicorn.conf -D
(config/unicorn.conf は、unicornの定義ファイルのパス)

※productionモードの場合は、-E productionを追加する。

以上です。

Amazon EC2上でRailsアプリをRails + Unicornで動かす

タイトル通りのことをしてみました。
やり方自体は、既に他のサイトで沢山取り上げられているのですが
自分が注目したポイントや、躓いたところを中心に書いていきたいと思います。

前提条件として
・EC2のアカウントが作成済みで、コンソール(TeraTerm等)でログインできる
FTPなど、何らかの方法でRailsアプリをEC2に転送できる
状態であるものとします。

■(rootでログインしていない場合)root権限を取得する
sudo su

RubyRails、Nginx、Unicornのインストール

1.以下のコマンドを順次実行する。
$ yum install gcc
$ yum install gd-devel
$ yum install openssl-devel
$ yum install libxml2-devel
$ yum install libxslt-devel
$ yum install geoip-devel

2.rvmをインストールする。
$ bash < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)

3.railsをインストールする。
$ gem install rails -v 4.0.0
$ rails -v

4.Nginxをインストールする。
$ yum -y install nginx

起動するか確認する。
$ /etc/init.d/nginx start

5.Unicornをインストールする。
$ gem install unicorn;rbenv rehash

Railsアプリの配置
1.アプリをコピーする。
自分の場合はWinScpで、home/ログインユーザ にアプリをコピーし
コンソールで配置したいフォルダに移動しました。
(WinScpのユーザでは、アプリを配置したい箇所にコピーする権限がないため)

2.bundle installを実行する。
Gemfileに必要なgem記述し、本番環境用のbundle installを実行します。
$ bundle install --without test development

が、sqllite3のインストールで以下のエラーが発生しました。
ERROR: Failed to build gem native extension.(中略)
sqlite3.h is missing. Try 'port install sqlite3 +universal'
or 'yum install sqlite-devel' (後略)

メッセージに従い、以下のコマンドにてsqlite3をインストールします。
$ yum install sqlite-devel

この後、再びbundle installを行います。
$ bundle install --without test development

■Nginx、Unicornの設定
1.Nginxの定義ファイル設定
$ vi /etc/nginx/nginx.conf

nginx.confの中身は以下のように記述する。

worker_processes  1;

events {
worker_connections 1024;
}

http {
upstream unicornapp {
server unix:/tmp/unicorn_app.sock;
}

server {
listen 80;
server_name localhost;

location / {
proxy_pass http://unicornapp;
}
}
}


2.Unicornの定義ファイル設定
$ cd アプリフォルダ
$ vi config/unicorn.conf

unicorn.confの中身は以下のように記述する。

worker_processes 2
listen '/tmp/unicorn_app.sock'
stderr_path File.expand_path('unicorn.log', File.dirname(__FILE__) + '/../log')
stdout_path File.expand_path('unicorn.log', File.dirname(__FILE__) + '/../log')
preload_app true

重要なのは、nginx.confの「server unix:/tmp/unicorn_app.sock;」と
unicorn.confの「listen '/tmp/unicorn_app.sock'」で指定するsocketのパスが
一致することです。

■Nginx、Unicornの起動
1.Nginxを起動する。
$ /etc/init.d/nginx start

2.Unicornを起動する。
$ cd アプリフォルダ
unicorn -c config/unicorn.conf -D

■アプリの稼動確認
ブラウザにてEC2のURLを叩き、アプリの画面が表示されることを確認します。
http://xxx.compute.amazonaws.com/


参考サイト
http://blog.yatm.info/?p=608
http://qiita.com/KazuyoshiUeno@github/items
http://qiita.com/KazuyoshiUeno@github/items/296aa3af986b4bffe7d8
https://gist.github.com/honjo2/5023446
http://prototype-beta.com/server/entry/12_ubuntuでnginx_+_unicorn_-_設定編

VirtualBoxでspringを動かしてみる

遅ればせながら、Railsのpreloaderとしてspringを使ってみました。
理由は、今まで使っていたsporkだと、コンソールが2つ必要になるのが
springでは一つになりそうだからです。
(sporkの起動に一つと、その他のコマンドの実行に一つ)

特にRSpecからデバッグする時、RSpecの起動と、デバッガがブレークポイントを示す
コンソールが異なるのが、不便でした。

以下、手順です。VirtualBoxでspringを実行する際には(他の仮想マシンでも同じか?)
下記に書くようなエラーが起きるので、単純にspringをインストールするだけでは
実行できないです。

1.springのインストール
以下のコマンドを実行する。(Gemfileに書いてbundle installは非推奨らしい)

$ gem install spring

2.springをロードし、rspecを起動してみる。

$ spring rspec spec/

3.以下のエラーが発生する。

`rescue in start_server': Spring is unable to create a socket・・・

良く見ると、エラーメッセージに以下のような解決策が書いてある。

You may need to set the SPRING_TMP_PATH environment variable to use a different path.

4.SPRING_TMP_PATHを設定するため、以下のコマンドを実行する。

$ mkdir ~/spring_tmp

$ export SPRING_TMP_PATH=spring_tmpのパス

5.手順2.を実行し、起動できることを確認する。

6.springが起動できることが確認できたら、~/.bashrcに以下を追記する。

export SPRING_TMP_PATH=spring_tmpのパス

以上です。spring上でのRSpecを起動と、pry debuggerの操作が
一つのコンソールで出来ることを確認しました。


※参考サイト
ruby on rails - Spring wil not start - Stack Overflow

Rails 4 に移行するため、再構築する手順

Rails 3.2系からRails 4 に移行を試みたのですが、警告などが多数出ます。
一層のことアプリを再構築してしまえば・・・、ってことでやってみました。

以下、その時の手順です。
Rails 4 の環境構築ができていることを前提とします。

■アプリの再構築
1.移行元のアプリをフォルダごと退避

2.アプリ作成
rails new アプリ名 -T

3.appフォルダをコピー

4.dbフォルダをコピー

5.Gemfileの必要な行をコピーし、以下のコマンドを実行
bundle install

6.rails s にて起動し、ブラウザにて確認

■deviseを使用している場合
1.deviseを入れている場合、Railsを起動すると、以下のエラーが発生
「Devise.secret_key was not set. Please add the following to your Devise initializer: (RuntimeError)」

2./config/initializers/devise.rbをコピーして解決

ActiveRecordのfind(:all)を使用している場合
1.アプリを動かすと、以下の警告が発生
「DEPRECATION WARNING: Calling #find(:all) is deprecated.」
find(:all)は今後推奨されなくなるらしい。

2.自分の場合は、以下のように修正して解決

モデル名.find(:all)

モデル名.all

モデル名.find(:all, :limit => 10, :order => "created_at DESC")

モデル名.limit(10).order("created_at DESC")


■pryを使用している場合
1.Gemfileに入れて、以下のコマンドを実行
bundle install

2. .pryrcをコピーする。