Tmux-introduction

仮想端末管理ツール tmux 導入

端末多重化による作業効率化を期待して tmux を導入した。

http://tmux.sourceforge.net/

■tmux のインストール

1
$ sudo aptitude install tmux

■tmux の自動起動設定

以下を .bashrc に追記する。 以下の設定では既に tmux が起動している場合、既存の tmux プロセスへのアタッチのみ行う。

1
2
3
4
5
6
7
if [ -z $TMUX ]; then
  if $(tmux has-session 2> /dev/null); then
    tmux -2 attach
  else
    tmux -2
  fi
fi

■tmux で代表的な操作方法

以下で C-b は、Ctrl + bind の意。

・ウィンドウ作成

C-b c

・ウィンドウ一覧表示/移動

C-b w

・前/次のウィンドウ移動

C-b p (pre)
C-b n (next)

・ウィンドウを強制終了

C-b &

・ペイン分割

C-b “ (横に分割)
C-b % (縦に分割)

・ペイン分割解除

C-b !

・ペイン強制終了

C-b x

・ペイン間移動

C-b o

・ペインを入れ替え

C-b {

・セッションのデタッチ

C-b d


参考サイト:
http://komasaru.github.io/blog/2013/06/06/linux-mint-tmux-auto-attach/
http://shanon-tech.blogspot.jp/2012/05/tmux.html
http://room6933.com/mymemo/tmux/tmux-basic.html
http://www.omakase.org/misc/tmux_screen.html

‘Module#prepend’-ruby-spec-memo

ruby2.0仕様メモ「Module#prepend」

ruby2.0より、mix-inした場合、module にて class 側の関数をオーバライドすることができる Module#prepend キーワードが実装された。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
module Fuga
  def abc=(value)
    raise ArgumentError unless value
    @abc = value
  end
end

class Hoge
  prepend Fuga
  attr_accessor :abc
end

> hoge = Hoge.new
=> #<Hoge:0x0000000354b9d0>
> hoge.abc
=> nil
> hoge.abc = 123
=> 123
> hoge.abc = nil
ArgumentError: ArgumentError

About-spring-the-preloader

spring 導入

spork が rails 4.0 に未対応なため、spring という比較的新しいプリローダを利用することとした。

導入は gem を利用して行う。以下を Gemfile に記載し、bundle install する。

1
gem 'spring'

以下のように利用する。

1
$ spring rspec spec/controllers/

rspec コマンドの他、rake コマンドその他にも対応している。

time コマンドを利用してコマンド実行にかかる時間を計測してみたが、それなりのボリュームのある rspec を用意できなかったため、速度向上を確認できなかった。 プリロードの対象となるコマンドがそれなり以上の規模になった場合、効力を発揮することを期待したい。


参考サイト:https://github.com/jonleighton/spring

About-byebug-for-debug-with-pry

byebug 導入

ruby2.0環境下では、pry-nav ならびに pry-debugger のデバッグ機能に不具合があり、また例外補足のためのツール pry-exception_explorer にも不具合があるため、デバッグ用のツールとして同様の機能を持つ byebug および pry-rescue への切り替えを行った。

また今回のタイミングで、コールスタック(バックトレース)を参照するためのツールである pry-stack_explorer の導入も行った。

byebug は pry と同じインタフェイスを持っているとのことで使用法は pry と同じである。

まず、以下の gem は Gemfile から削除した。

1
2
gem 'pry-debugger' # あるいは pry-nav
gem 'pry-exception_explorer'

そして次の gem を導入する。

1
2
3
4
5
6
7
8
# pry for debug
group :development, :test do
  gem 'pry-rails'               # pry base
  gem 'pry-byebug'              # debugger for pry
  gem 'pry-stack_explorer'      # call stack viewer
  gem 'pry-rescue'              # exception event handler
  gem 'hirb-unicode'            # hirb
end

■pry-rescue使用法

デバッグ対象をブロックとして括り、その内部で何らかの例外が飛ばされた場合、その位置で binding.pry が起動される。

1
2
3
4
5
Pry.rescue do
  (略)
  raise XxxException
  (略)
end

■pry-stack_explorer使用法

pry-stack_explorer を導入することで、binding.pry を利用したデバッグ中に、show-stack コマンドを用いてコールスタックを参照することが可能である。 以下のコマンドを使ってコールスタックの内容を参照可能である。callerより断然便利。

スタックを上がる

up

下がる

down

フレームを指定して移動

frame N


参考サイト:

https://github.com/deivid-rodriguez/byebug
https://github.com/pry/pry-stack_explorer
http://qiita.com/joker1007/items/f132db1b4a5e3f9278e9

pry 関連のサブツールについて
http://blog.uu59.org/2012-10-13-pry.html

ruby2.0環境下における pry-debugger の不具合について
https://bugs.ruby-lang.org/issues/7214

About-bootstrap-kaminari-views

bootstrap-kaminari-views 導入

ruby2.0.0 / rails4.0.0 環境では、従来の方法で kaminari の bootstap view 対応ができなくなったようなので、本gemを利用して kaminari の bootstrap view 対応を行うことにした。

Gemfileに以下を追記し、bundle install する。

1
2
gem 'kaminari'
gem 'bootstrap-kaminari-views'

view ページにて以下のようにペギネイトする。

1
= paginate @posts, :theme => 'twitter-bootstrap'

次のようなオプションを指定することもできる。

1
2
= paginate @posts, :theme => 'twitter-bootstrap', 
                   :pagination_class => "pagination-small pagination-centered"

githubページ : https://github.com/matenia/bootstrap-kaminari-views

Pry-settings-for-debug

pry 補追

pry によるデバッグのための .pryrc 設定補追

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# https://github.com/pry/pry/wiki/FAQ#wiki-hirb
require 'hirb'

Hirb.enable

old_print = Pry.config.print
Pry.config.print = proc do |output, value|
  Hirb::View.view_or_page_output(value) || old_print.call(output, value)
end

Pry.commands.alias_command 'c', 'continue'
Pry.commands.alias_command 's', 'step'
Pry.commands.alias_command 'n', 'next'
Pry.commands.alias_command 'f', 'finish'

この他、binding.pry を利用したデバッグから一気に抜けたい場合、exit-process または exit-program コマンドを利用する。

ruby2.0.0 / rails4.0.0 Introduction

【ruby2.0およびROR4.0導入メモ】2013/05/13~


■対象環境

OS:Debian 6.0 / 64bit版


■ruby2.0導入

RVMのバージョンが若干古いので更新する

1
$ rvm get head

RVMで導入可能なrubyバージョン一覧(安定版のみ指定)を更新する また以下を行うことでRVM自体のバージョンも自動的に更新される (1.10.3→1.20.5 実行日2013/05/14 / 1.21.12 (stable) 2013/07/18)

1
$ rvm get stable

RVMにて導入可能なruby処理系を検索し、ruby2.0が導入可能であることを確認する

1
$ rvm list known

RVMにruby1.9.3の以下のビルドバージョンを導入するように要請されるので導入

1
$ rvm install ruby-1.9.3-p392

上記 ‘rvm get stable’ を実行した時点でrubyの規定バージョンが初期化されるので改めて規定バージョンを設定する なお同様にgemsetの設定も初期化される模様

1
$ rvm use 1.9.3 --default

ruby2.0を導入する

1
$ rvm install 2.0.0

ruby2.0へ切り替え

1
$ rvm use 2.0.0

rubyのバージョンを確認

1
2
3
$ ruby -v

ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux]

■.rvmrcから.ruby-versionへの移行

1
$ rvm rvmrc to ruby-version

■rails4用gemset作成

1
$ rvm gemset create rails400

現在のgemsetを確認

1
2
3
4
5
6
$ rvm gemset list

gemsets for ruby-2.0.0-p247 (found in /home/philippos/.rvm/gems/ruby-2.0.0-p247)
   (default)
   global
=> rails400

■ROR4.0導入

1
2
3
$ gem install rails --version 4.0.0

$ rvm use 2.0.0@rails400

■不要なバージョンのRubyを削除(2013/12/25)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
$ rvm list

rvm rubies

   ruby-1.9.3-p125 [ x86_64 ]
   ruby-1.9.3-p429 [ x86_64 ]
   ruby-2.0.0-p195 [ x86_64 ]
=> ruby-2.0.0-p247 [ x86_64 ]

# Default ruby not set. Try 'rvm alias create default <ruby>'.

# => - current
# =* - current && default
#  * - default


$ rvm remove 1.9.3-p125

Removing /home/philippos/.rvm/src/ruby-1.9.3-p125... - using Zsh, can not show progress, be patient...
Removing /home/philippos/.rvm/rubies/ruby-1.9.3-p125... - using Zsh, can not show progress, be patient...
Removing ruby-1.9.3-p125 aliases...
Removing ruby-1.9.3-p125 wrappers...
Removing ruby-1.9.3-p125 environments...
Removing ruby-1.9.3-p125 binaries...

$ rvm remove 2.0.0-p195

Removing /home/philippos/.rvm/src/ruby-2.0.0-p195... - using Zsh, can not show progress, be patient...
Removing /home/philippos/.rvm/rubies/ruby-2.0.0-p195... - using Zsh, can not show progress, be patient...
Removing ruby-2.0.0-p195 aliases...
Removing ruby-2.0.0-p195 wrappers...
Removing ruby-2.0.0-p195 environments...
Removing ruby-2.0.0-p195 binaries...

$ rvm list

rvm rubies

   ruby-1.9.3-p429 [ x86_64 ]
   ruby-2.0.0-p247 [ x86_64 ]

# Default ruby not set. Try 'rvm alias create default <ruby>'.

# => - current
# =* - current && default
#  * - default

$ rvm use 2.0.0@rails402

$ ruby -v

ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux]

$ rails -v

Rails 4.0.2

参考サイト:
http://hrst.hatenablog.jp/entry/20110616/1308229846

About-sar-command

【その他周辺ツール類】

■sarコマンド導入

1
2
3
4
$ sudo aptitude install sysstat

sudo dpkg-reconfigure sysstat
sysstatのcron jobを有効にしますか?→はい

以上

■sarコマンド使用方法

○sarコマンドの主要オプション(パラメータ)

  • -A
    全情報表示
  • -n DEV
    送信/受信パケットに関する情報
  • -n EDEV
    エラーパケットに関する情報
  • -u
    CPUの利用状況
  • -b
    ディスクI/Oの使用状況
  • -r
    メモリとスワップの使用状況
  • -W
    秒当たりのスワップ情報

参考サイト:
http://d.hatena.ne.jp/nabnab/20101028/1288259546
http://www.syboos.jp/linux/doc/sar-command.html

Nginx+unicorn-introduction

【nginx+unicorn導入メモ】2013/06/02~

Railsアプリにおいて静的資源をnginxに、rackサーバ上で動作する動的資源についてはunicornに担当させる構成について とりあえず導入まで。最適化に関しては別稿に譲る


■nginx導入

○nginx導入前準備

2013/06/02時点において、aptitudeでのnginxパッケージの既定バージョンは0.7.67と古いため、nginx公式サイトをリポジトリに登録し、aptitudeでstable最新版をインストールできるようにする

1. まずパッケージの公開鍵をダウンロードしてapt-keyで追加する

1
2
$ wget "http://nginx.org/keys/nginx_signing.key"
$ sudo apt-key add nginx_signing.key

2. 次にnginx公式サイトをリポジトリに追加する

次のファイルに追加する

1
$ sudo vim /etc/apt/sources.list
1
2
deb http://nginx.org/packages/debian/ squeeze nginx
deb-src http://nginx.org/packages/debian/ squeeze nginx

3. リポジトリの追加を反映する

1
$ sudo aptitude update

インストール可能なバージョンが更新されているか確認する

1
$ aptitude show nginx

2013/06/02時点でイントール可能なバージョンは、「1.4.1-1~squeeze」である

○nginx導入

aptitudeコマンドにてnginxをインストールする

1
$ sudo aptitude install nginx

以下のコマンドで正常にインストールできたか確認する

1
$ aptitude show nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
パッケージ: nginx
状態: インストール済み
自動的にインストールされた: no
バージョン: 1.4.1-1~squeeze
優先度: 任意
セクション: httpd
メンテナ: Sergey Budnevitch <sb@nginx.com>
展開サイズ: 1,102 k
依存: libc6 (>= 2.10), libpcre3 (>= 7.7), libssl0.9.8 (>= 0.9.8m-1), zlib1g (>= 1:1.1.4), lsb-base, adduser
提供: httpd
説明: HTTP and reverse proxy server, as well as a mail proxy server
 written by Igor Sysoev
ホームページ: http://nginx.org

バージョン確認

1
2
3
$ /usr/sbin/nginx -v

nginx version: nginx/1.4.1

■nginx起動/停止

○起動
1
$ sudo /etc/init.d/nginx start

http://192.168.56.1/ 等、起動したサーバへアクセスし、「Welcome to nginx!」と表示されるか確認する

○停止
1
$ sudo /etc/init.d/nginx stop

※ 以下のエラーが出る場合には、何らかのプログラムが80番ポートを塞いでいる可能性があるので、そのプログラムを停止しておく

1
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

例) 80番ポートを塞いでいるプログラムを探し、停止する

1
2
3
4
5
6
$ sudo lsof -i:80

COMMAND  PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
apache2 1768     root    5u  IPv6   4665      0t0  TCP *:www (LISTEN)

$ sudo /etc/init.d/apache2 stop

■nginx設定

1
/etc/nginx/conf.d/default.conf

default.confを元に編集した 元となったdefault.confは、default.conf.backupとして保存した

○設定のポイント
  1. ソケットファイルのパスをunicornで設定するそれ(後述)と一致させること
  2. ポート番号に留意すること
  3. プロキシパスを設定すること

注)コメントアウトされている箇所については割愛した

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
upstream unicorn.railsapp {
    server unix:/home/philippos/coxcomb/tmp/sockets/unicorn.sock;
}

server {
    listen       80;
    server_name  localhost;

    location / {
        root   /home/philippos/coxcomb/public;
        index  index.html index.htm;

        proxy_pass http://unicorn.railsapp;
    }

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

■unicorn導入

  • Railsアプリディレクトリ以下のGemfileにunicornを追加する
  • bundle install した後、configフォルダに設定ファイルとして、unicorn_config.rbを作成する
  • 内容は後述
○起動確認
  • -Dオプションを追加することでデーモンとして起動する
  • デーモンを停止させるにはpsコマンドで該当プロセルを探し、kill -9 コマンドでpidを指定して停止させる
■起動
1
$ unicorn_rails -c config/unicorn_config.rb -E production -D
■停止

起動中のプロセスを検索し、unicornのマスタープロセスのみ停止させる。

1
2
3
4
5
6
7
8
9
10
11
$ ps aux | grep unicorn

133:1000      9174  0.1 16.9 736356 64496 ?        Sl   06:52   0:01 unicorn_rails master -c config/unicorn_config.rb -E production -D                                                                                                                    
134:1000      9180  0.0 18.3 746884 69880 ?        Sl   06:52   0:00 unicorn_rails worker[0] -c config/unicorn_config.rb -E production -D                                                                                                                 
135:1000      9183  0.0 18.5 747356 70280 ?        Sl   06:52   0:00 unicorn_rails worker[1] -c config/unicorn_config.rb -E production -D                                                                                                                 
136:1000      9186  0.0 16.4 738984 62556 ?        Sl   06:52   0:00 unicorn_rails worker[2] -c config/unicorn_config.rb -E production -D                                                                                                                 
137:1000      9189  0.0 18.0 745620 68404 ?        Sl   06:52   0:00 unicorn_rails worker[3] -c config/unicorn_config.rb -E production -D                                                                                                                 
141:1000      9428  0.1  1.1  36220  4204 pts/1    S+   07:01   0:00 vim source/_posts/2013-07-07-nginx-plus-unicorn-introduction.markdown
143:1000      9452  0.0  0.2  11328   936 pts/0    S+   07:04   0:00 grep -n unicorn

$ kill -9 9174

■unicorn設定

  • Railsアプリディレクトリ以下connfig/unicorn_config.rb
  • ソケットファイルのパス、ポート番号、ログ出力先等に留意する
  • それらをnginxの設定と同一にする必要がある

例)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# coding:utf-8
# unicron.rb
worker_processes  4
working_directory '/home/philippos/coxcomb'

listen '/home/philippos/coxcomb/tmp/pids/unicorn.sock', :backlog => 1
listen 4422, :tcp_nopush => true

pid '/home/philippos/coxcomb/tmp/sockets/unicorn.pid'

timeout 10

stdout_path '/home/philippos/coxcomb/log/unicorn.stdout.log'
stderr_path '/home/philippos/coxcomb/log/unicorn.stderr.log'

preload_app true
GC.respond_to?(:copy_on_write_friendly=) and GC.copy_on_write_friendly = true

before_fork do |server, worker|
defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!

old_pid = "#{server.config[:pid]}.oldbin"

if old_pid != server.pid
  begin
    sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
    Process.kill(sig, File.read(old_pid).to_i)
  rescue Errno::ENOENT, Errno::ESRCH
  end
end

sleep 1
end

after_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end

■その他

abコマンド:サイトが1秒間に何アクセス捌けるか確認するコマンド

1
$ ab -c 10 -n 100 http://example.com/

○thinサーバの場合……

1
Requests per second:    11.22 [#/sec] (mean)

○nginx + unicornの場合……

1
Requests per second:    105.77 [#/sec] (mean)
■rails設定

config/environments/production.rb内の設定は、以下のようにすること。

  • 静的ファイルの扱いを rails 本体ではなく、nginx に移譲する。

config.serve_static_assets = false

  • アセットパイプラインのライブコンパイルを有効にする。

config.assets.compile = true

以上

Startover-twitter-bootstrap

【Twitter bootstrap 導入手順】2013/05/29~

bootstrapの導入が不完全だったため、bootswatchの導入とともに改めてまとめる


■ruby及びrailsのバージョン

ruby 1.9.3p429
Rails 3.2.13


■必要なGem

以下のふたつのgemをGemfileに記述し、bundle installすること

1
2
gem 'less-rails'                # less
gem 'twitter-bootstrap-rails'   # twitter boostrap

※ 以下のGemは何れにしても必要なので追記すること

1
gem "therubyracer"

■bootstrapのインストール

1. bootstrapそのもののインストール

1
$ rails generate bootstrap:install less

2. 可変レイアウト設定生成

1
$ rails g bootstrap:layout application fluid

3. 以下のビューファイルを削除する(同様のslimファイルが既に生成されているため)

app/views/layouts/application.html.erb

※ 以下のビューファイルも不要のため削除してよし public/index.html

ルーティング設定(config/routes.rb)で他のコントローラへ誘導すること

1
root :to => 'pages#index'

4. 以下のスタイルシートファイルを削除する(bootswatchと変数が干渉するため)

app/assets/stylesheets/scaffolds.css.scss


■bootswatchの導入

ここまででデザインが適用されるか否かわかりやすいように某かのscaffoldを作成しておくこと

1. 下記サイトより任意のデザインのvariables.less及びbootswatch.lessを取得する

http://bootswatch.com/

2. 以下のディレクトリを作成し、上記サイトで取得したlessファイルふたつを設置する

vendor/assets/stylesheets/bootswatch/

3. 以下のファイルへ上記lessファイルふたつを読み込むように宣言を追記する

app/assets/stylesheets/bootstrap_and_overrides.css.less

1
2
@import "bootswatch/variables.less";
@import "bootswatch/bootswatch.less";

■ Viewテンプレートを生成

例) 以下のようにしてビューbooksのbootstrapテンプレートを生成する

1
$ rails g bootstrap:themed books -f

参考サイト:

http://qiita.com/items/260a930c5ff95aafebd1 http://blog.scimpr.com/2012/08/25/rails%E3%81%ABtwitter-bootstrap%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%EF%BD%9Etwitter-bootstrap-rails/ http://inoccu.net/blog/2013/04/28/112225.html http://gagapi.hatenablog.jp/entry/2013/05/17/222340 http://shoheik.hatenablog.com/entry/2013/03/09/115015