Haskell Development Environment

【Haskell in ubuntu-14.10-server-amd64 関連メモ】(2014/12/28 – )

ghcおよびhaskell-platform導入メモ

ghc-7.6.3導入

事前にシンボリックリンクlibgmp.so.3を作成する

1
2
$ cd /usr/lib/x86_64-linux-gnu/
$ sudo ln -s libgmp.so.10 libgmp.so.3

ghc-7.6.3本体の導入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ cd /usr/local/src/
$ sudo wget http://www.haskell.org/ghc/dist/7.6.3/ghc-7.6.3-x86_64-unknown-linux.tar.bz2
$ sudo tar xvf ghc-7.6.3-x86_64-unknown-linux.tar.bz2
$ cd ghc-7.6.3
$ sudo ./configure

...(略)...

$ sudo make install

...(略)...

$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.6.3

haskell-platform導入

・予め必要なパッケージを導入する

1
$ sudo aptitude install libgmp-dev

・haskell-platform本体の導入

1
2
3
4
5
6
7
8
9
$ cd /usr/local/src/
$ sudo wget https://downloads.haskell.org/~platform/2014.2.0.0/haskell-platform-2014.2.0.0-unknown-linux-x86_64.tar.gz
$ sudo tar xzvf haskell-platform-2014.2.0.0-unknown-linux-x86_64.tar.gz

展開された /usr/local/haskell 以下を /usr/local/ へ移動し、パスを通す

$ cabal --version
cabal-install version 1.18.0.5
using version 1.18.1.3 of the Cabal library

Haskell開発支援ツールとvimプラグイン導入メモ

cab、ghc-mod その他の導入

cabalにてパッケージ管理ツール cab と haskell便利ツール ghc-mod その他のツールを導入する

まずcabal本体を更新する

1
2
3
$ sudo aptitude install libghc-zlib-dev
$ cabal update
$ cabal install cabal-install

この後、/.cabal/bin にパスを通しておく

1
2
3
$ cabal --version
cabal-install version 1.20.0.5
using version 1.20.0.3 of the Cabal library

サンドボックスの初期化を行う

1
$ cabal sandbox init

プロジェクトディレクトリ以下の /.cabal-sandbox/bin にパスを通しておく

ghc-modのインストールを行う

1
2
3
4
5
6
7
8
9
10
11
$ cabal install happy
$ cabal install haskell-src-exts
$ cabal install monad-control-0.3.3.0
$ cabal install ghc-mod
$ cabal install hoogle

$ ghc-mod --version
ghc-mod version 5.2.1.1 compiled by GHC 7.6.3

$ hoogle --version
Hoogle v4.2.36, (C) Neil Mitchell 2004-2012

参考:
http://maoe.hatenadiary.jp/entry/2013/08/16/224031 http://qiita.com/junsumida/items/9e763a8b54222f235759


NeoBundle導入

vimにてプラグイン管理ツール NeoBundle を使えるようにする

配置先のディレクトリを作成

1
$ mkdir -p ~/.vim/bundle

NeoBundleをリポジトリから取得

1
$ git clone git://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim

vimrcに以下のように記述を追加し、ghc-modの機能をvimで扱うようにできるプラグインghcmod-vimや、補完機能を提供するプラグインneco-ghc等を導入する

参考:
http://qiita.com/joker1007/items/59ac3fa162df7c9cc952 http://cohama.hateblo.jp/entry/2013/09/01/013944


~/.vimrc

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

"オムニ補完有効化
setlocal omnifunc=necoghc#omnifunc

"plugins for haskell
set nocompatible
filetype plugin indent off

if has('vim_starting')
  set runtimepath+=~/.vim/bundle/neobundle.vim
endif

call neobundle#begin(expand('~/.vim/bundle/'))

NeoBundleFetch 'Shougo/neobundle.vim'
NeoBundle 'Shougo/unite.vim'
NeoBundle 'Shougo/neosnippet.vim'
NeoBundle 'Shougo/vimproc.vim'
NeoBundle 'thinca/vim-quickrun'

NeoBundle 'kana/vim-filetype-haskell'
NeoBundle 'eagletmt/ghcmod-vim'
NeoBundle 'dag/vim2hs'
NeoBundle 'ujihisa/neco-ghc'
NeoBundle "ctrlpvim/ctrlp.vim"
NeoBundle 'eagletmt/unite-haddock'

call neobundle#end()
filetype plugin indent on

vim上からコマンドNeoBundleInstallを実行し、各プラグインをインストールする

※NeoBundleのコマンド

NeoBundleInstall
インストール

NeoBundleUpdate
更新

NeoBundleClear
~/.vimrcからプラグインを削除した場合、:NeoBundleClearとしてプラグインをアンインストールすること

参考:
http://qiita.com/muran001/items/3080c4816b7c2e65e40b http://eagletmt.hateblo.jp/entry/2012/02/23/130526


vimprocをmakeする

makeしてvimprocのsoファイルを作成する

1
2
$ cd ~/.vim/bundle/vimproc.vim/
$ make

参考:
http://d.hatena.ne.jp/pospome/20140906


vim2hs

‘za’で折り畳み箇所の開閉を行う。

neocomplcache-ghc (neco-ghc)

~/.vimrc に以下を設定する

1
setlocal omnifunc=necoghc#omnifunc

参考:
https://github.com/eagletmt/neco-ghc


hoogle

予めcabalでhoogleをインストールしておくこと

1
$ cabal install hoogle

~/.vimrc に以下を設定する

1
NeoBundle 'eagletmt/unite-haddock'

以下を行ってhoogleデータベースを設定

1
$ hoogle data

:Unite hoogle
パッケージにカーソルを合わせて p でプレビューできる

:Unite -auto-preview hoogle
検索結果一覧にカーソルを移動するだけでプレビューを表示する

:UniteWithCursorWord hoogle
カーソル位置にある単語で検索する

参考:
http://eagletmt.hateblo.jp/entry/2012/03/17/194950 http://qiita.com/shiena/items/1b6c97f32e3905e15c2b


ctrlp

ctrlpについては、画面の水平分割を行おうとCTRL-Sとすると、ターミナルがデータの受信を停止してしまう(CTRL-Qで脱出) そのため、以下のコマンドでターミナルドライバのフローコントロールをオフにすること。

1
$ stty -ixon -ixoff

Scalatra Introduction

【scalatra 環境構築メモ】

■scalatra本体、関連ツール導入

1. Scala本体

Scala公式サイト(http://www.scala-lang.org/download/) よりバイナリファイル (tgzファイル)をダウンロードし、/usr/bin以下に展開。

2. SBT

SBT公式サイト(http://www.scala-sbt.org/release/docs/Getting-Started/Setup.html#unix)からsbt-launch.jarを取得し、~/binに配置。 SBT公式サイトの勧めに従い、起動用スクリプトを作成する。単に以下をコピペし、~/bin/sbtとして保存。

1
2
SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"
java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@"

3. Conscript

以下を実行する。

1
$ curl https://raw.github.com/n8han/conscript/master/setup.sh | sh

結果、スクリプト ~/bin/cs が作成されたことを確認すること。

4. giter8

以下を実行する。

1
$ cs n8han/giter8

結果、スクリプト ~/bin/g8 が作成されたことを確認すること。

■scalatraプロジェクトの作成

任意のパスで以下を実行し、ドメイン設定、パッケージ名、プロジェクト名等を設定しscalatraプロジェクトを作成する。

1
$ g8 scalatra/scalatra-sbt

■scalatraサーバの起動

プロジェクトディレクトリ以下に移動し、sbtを起動し、コマンド container:start としてscalatraサーバを起ち上げる。


参考サイト:
https://gist.github.com/kmizu/1876800
http://scalajp.github.io/sbt-getting-started-guide-ja/
http://qiita.com/k_ui/items/65def414bd7ec54aedeb
http://diario.hatenablog.com/entry/2013/08/25/041417
http://sgykfjsm.github.io/blog/2013/02/22/scalatra-tutorial-001/

Vagrant + Chef-solo (Knife-solo)

【vagrant + chef-solo および knife-solo による開発環境構築】(2014/03/15 – )

■概要

○目的

同一構成の複数の仮想マシンを開発環境として構築することで、開発環境構築の効率化と各開発者間の開発環境の統一を図る。

○構成

各ソフトウェアのバージョンは現時点(2014/03/15)での版である。

  • ホストOS: Windows7
  • ゲストOS: CentOS 6.5 64bit
  • 仮想マシン: VitualBox ver4.3.8
  • 仮想マシン管理: Vagrant ver1.5.1
  • 自動システム管理: chef-solo および Knife-solo
  • その他: rsync ver3.1.0

その他:
・chef-solo を動作させるため、windows上にver1.9以降のrubyが必要である。1.8系以前のバージョンは非推奨。
・knife-solo は、chef-solo を補助するためのツールである。

○大まかな手順

— 準備 —

  1. Vagrant上の仮想マシンテンプレートに対し、chef-solo および knife-solo を利用し開発環境構築を行う。
  2. 上記開発環境のBoxファイルを作成し、Vagrantfile、レシピと共に各開発者に公開する。

— 必要に応じて各開発者が行う —

  1. 各開発者はvirtualboxとVagrantを自分のローカル環境にインストールする。
  2. 各開発者は上記1.で作成したBoxファイルをVagrantコマンドによりダウンロードし、共有されたVagrantfileを利用して仮想マシンを起動する。

以下より構築手順詳細 以下はホストOSであるWindows上で行うこと

■Vagrantの準備

○VirtualBox導入

VirtualBoxはVagrant上のBOXを稼働させるために利用する。 公式サイトからVirtualBoxをダウンロードしインストールする。

https://www.virtualbox.org/wiki/Downloads

○ホストOS(Windows)へVagrant導入

・準備

公式サイトからVagrantをダウンロードしインストールする。

http://www.vagrantup.com/

インストール後PCを再帰動し、vagrantが正しくインストールされたか確認するため、DOS窓を開いて以下のようにvagrantのバージョンを表示させる。

1
2
3
$ vagrant -v

Vagrant 1.5.1

・Vagrant上に仮想マシンを追加する

任意のディレクトリへ移動し、下記サイトの「CentOS 6.5 x86_64」の仮想マシンテンプレートを指定してVagrant上に仮想マシンを追加する。 所要時間は10分から15分程度。

http://www.vagrantbox.es/

1
$ vagrant box add centos6 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.1/centos65-x86_64-20131205.box

なお下記のVagrant環境のための一連の準備により、ユーザホームディレクトリおよび作業用ディレクトリには以下のファイルが作成される。

  • Vagrantインストール時にWindowsのユーザホームディレクトリ(C:\Users<ユーザ名>)に作成されるファイル
    .vagrant.d

  • vagrant環境初期化(vagrant init)時に作業用ディレクトリに作成されるファイル
    Vagrantfile

  • vagrant初回起動時(vagrant up)時に作業用ディレクトリに作成されるファイル
    .vagrant

下記の一連の準備を終えたあと上記ファイルが作成されているか確認すること。

・仮想マシン追加完了後、Vagrant環境の初期化を行う

1
$ vagrant init

・仮想マシンの起動を行う

1
$ vagrant up

上記コマンドを実行し以下の様なエラーが出る場合、これはbox名の解決に失敗しているということなので、Vagrantfileファイルの一部を編集して再度仮想マシンの起動を行うこと。

Bringing machine ‘default’ up with ‘virtualbox’ provider… ==> default: Box ‘base’ could not be found. Attempting to find and install…

Vagrantfileファイル13行目

config.vm.box = “base”

上記の箇所を以下のように編集

config.vm.box = “centos65”

参考サイト:http://www.trapon.jp/log/201307/mac_vagrant_centos.html

仮想マシン起動後、PuTTYやTeraTermなどのSSHクライアントで仮想マシンへアクセス可能である。

Host: 127.0.0.1 Port: 2222 ID: vagrant PW: vagrant

・その他のVagrantコマンド

Vagrantの状況確認を行う

1
$ vagrant status

Vagrant Boxの一覧を表示する

1
$ vagrant box list

Vagrant Boxを削除する

1
$ vagrant box remove <Box名> virtualbox

Vagrantを終了させる

1
2
$ vagrant halt          ……サスペンド   
$ vagrant destroy       ……ターミネート  

Vagrantの準備は以上。


■chef solo の準備

○前提 ゲストOS側にはknife-soloは導入の必要無し

ホストOS:Windows7 chef-solo knife-solo

ゲストOS:CentOS 6.5 64bit chef-solo

また、chef-soloのレシピ群は以下の階層構造で管理される

 レポジトリ(キッチン)>クックブック>レシピ

○ホストOS(Windows)へruby2.0導入

ruby公式サイトより Ruby 2.0.0-p451 (x64) をダウンロードしインストールする。

http://rubyinstaller.org/downloads/

1
$ ruby -v

ruby 2.0.0p451 (2014-02-24) [x64-mingw32]

○ホストOS(Windows)へDevelopment Kit導入

同様にruby公式サイトより DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe (For use with Ruby 2.0 (x64 64bits only))をダウンロードしインストールする。 次にインストール先ディレクトリにて以下のコマンドを実行すること。

1
2
3
4
5
6
7
8
9
10
11
12
$ ruby dk.rb init

[INFO] found RubyInstaller v2.0.0 at C:/Ruby200-x64

Initialization complete! Please review and modify the auto-generated
'config.yml' file to ensure it contains the root directories to all
of the installed Rubies you want enhanced by the DevKit.

$ ruby dk.rb install

[INFO] Updating convenience notice gem override for 'C:/Ruby200-x64'
[INFO] Installing 'C:/Ruby200-x64/lib/ruby/site_ruby/devkit.rb'

○ホストOS(Windows)へknife-solo導入

以下のgemをインストールすることで、chef-soloも同時にインストールできる。

1
$ gem install knife-solo

Windows版には以下のgemも必要となる。

1
2
$ gem install win32-process    
$ gem install windows-pr    

knife-soloのバージョンを表示して正常にインストールできたか確認する。

1
2
3
$ knife -v

Chef: 11.10.4

○リソース同期ツールrsync導入

下記サイトよりrsyncの無料版をダウンロードし、インストールする。

https://www.itefix.no/i2/cwrsync

任意のパスに配置しパスを通しておくこと

○リポジトリ(キッチン)の作成

以下のようにして chef-solo 基本ディレクトリを作成する

1
$ knife solo init <リポジトリ名>

仮にリポジトリ名をchef-repoとすると、下記コマンドにてディレクトリ chef-repo 以下にレシピテンプレートが作成される。

1
$ knife solo init chef-repo

○ゲストOS(Vagrant上のBOXとして起動しているCentOS6.5)へchef-solo導入

次にゲストOSへ chef-solo を導入するため作成したディレクトリ chef-repo に移動し、下記コマンドを実行する。 「2222」はゲストOSが稼働しているBoxのポート番号である。所要時間は30分程度。 この際、.chef/knife.rb が設定ファイルとして出力される

1
2
$ cd chef-repo
$ knife solo prepare -i "C:\Users\<ユーザー名>\.vagrant.d\insecure_private_key" -p 2222 vagrant@127.0.0.1

○クックブックの作成

クックブック名を仮に mybook として下記コマンドを実行する。

1
$ knife cookbook create mybook -o site-cookbooks

○レシピの作成

レシピファイルを編集しApacheのインストールを行ってみる。 レシピファイル(\chef-repo\site-cookbooks\mybook\recipes\default.rb)を以下のように編集

1
2
3
4
5
6
7
package "httpd" do
  action :install
end
 
service "httpd" do
  action :start
end

○実行レシピの指定

JSONファイル \chef-repo\nodes\127.0.0.1.json を編集し、実行レシピを追加する。

1
{"run_list":["mybook"]}

○レシピ実行

1
$ knife solo cook -i "C:\Users\<ユーザー名>\.vagrant.d\insecure_private_key" -p 2222 vagrant@127.0.0.1

chef-solo/knife-soloによるレシピ実行まで、以上


■追補

○仮想マシンのメモリ設定(VirtualBoxの場合)

仮想マシン上に例えば2MByteのメモリ領域を設定する場合、Vagrantfileファイルを編集し、以下を追加すること。

1
2
3
4
  # allocate the memory for the buffer pool
  config.vm.provider "virtualbox" do |v|
    v.memory = 2048
  end

○cookしようとしたときなどに以下のワーニングが出力される場合

1
2
3
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

以下のファイルを削除する

<ユーザホームディレクトリ>.ssh\known_hosts

○boxへのメモリの追加

規定値ではメモリが足りたいため、vagrant box(virtulabox 上の仮想マシン)のメモリを追加すること。 以下Vagrantfileへ記述を追加する。

1
2
3
4
  # allocate the memory for the buffer pool
  config.vm.provider "virtualbox" do |v|
    v.memory = 2048
  end

Scala Play2 Introduction

【Scala / play2 導入メモ】2013/12/14~

Play2 version: 2.2.0 Scala version: 2.10.2 (OpenJDK 64-Bit Server VM, Java 1.6.0_27).

以下、ホームディレクトリにて行う。

■準備

事前に Java 開発環境のインストールをしておくこと。

1
$ sudo aptitude install openjdk-6-jdk

■play2 フレームワークの取得と展開

1
2
3
4
5
6
7
8
9
$ wget http://downloads.typesafe.com/play/2.2.0/play-2.2.0.zip

$ unzip play-2.2.0.zip

$ sudo mv play-2.2.0 /usr/local

$ cd /usr/bin

$ sudo ln -s /usr/local/play-2.2.0/play play

■動作確認

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
$ play

zsh: correct 'play' to 'aplay' [nyae]? n
Getting com.typesafe.play console_2.10 2.2.0 ...
:: retrieving :: org.scala-sbt#boot-app
confs: [default]
6 artifacts copied, 0 already retrieved (2012kB/93ms)
Getting Scala 2.10.2 (for console)...
:: retrieving :: org.scala-sbt#boot-scala
confs: [default]
5 artifacts copied, 0 already retrieved (24390kB/2078ms)
_
 _ __ | | __ _ _  _
 | '_ \| |/ _' | || |
 |  __/|_|\____|\__ /
 |_|            |__/

play 2.2.0 built with Scala 2.10.2 (running Java 1.6.0_18), http://www.playframework.com

This is not a play application!

Use `play new` to create a new Play application in the current directory,
or go to an existing application and launch the development console using `play`.

You can also browse the complete documentation at http://www.playframework.com.

■Scalaプロジェクト作成

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
$ play new testPlay

zsh: correct 'play' to 'aplay' [nyae]? n
_
 _ __ | | __ _ _  _
 | '_ \| |/ _' | || |
 |  __/|_|\____|\__ /
 |_|            |__/

play 2.2.0 built with Scala 2.10.2 (running Java 1.6.0_18), http://www.playframework.com

The new application will be created in /home/philippos/testPlay

What is the application name? [testPlay]
>

Which template do you want to use for this new application?

1             - Create a simple Scala application
2             - Create a simple Java application

> 1
OK, application testPlay is created.

Have fun!

$ tree testPlay

testPlay
|-- README
|-- app
|   |-- controllers
|   |   `-- Application.scala
|   `-- views
|       |-- index.scala.html
|       `-- main.scala.html
|-- build.sbt
|-- conf
|   |-- application.conf
|   `-- routes
|-- project
|   |-- build.properties
|   `-- plugins.sbt
|-- public
|   |-- images
|   |   `-- favicon.png
|   |-- javascripts
|   |   `-- jquery-1.9.0.min.js
|   `-- stylesheets
|       `-- main.css
`-- test
    |-- ApplicationSpec.scala
    `-- IntegrationSpec.scala

10 directories, 14 files

■playアプリケーションの実行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ play run

[info] Loading project definition from /home/philippos/testPlay/project
[info] Set current project to testPlay (in build file:/home/philippos/testPlay/)


Cannot load the JNotify native library (/home/philippos/testPlay/target/native_libraries/64bits/libjnotify.so: /lib/libc.so.6: version `GLIBC_2.12' not found (required by /home/philippos/testPlay/target/native_libraries/64bits/libjnotify.so))
Play will check file changes for each request, so expect degraded reloading performace.

--- (Running the application from SBT, auto-reloading is enabled) ---

[info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

(Server started, use Ctrl+D to stop and go back to the console...)

[info] Compiling 5 Scala sources and 1 Java source to /home/philippos/testPlay/target/scala-2.10/classes...
[info] play - Application started (Dev)

下記URLでアクセスし動作を確認する。

http://localhost:9000/

■対話型実況環境(REPL)の起動

1
2
3
4
5
6
7
8
$ play console                                                                                                                                                                    [21:19:14]
[info] Loading project definition from /home/philippos/testPlay/project
[info] Set current project to testPlay (in build file:/home/philippos/testPlay/)
[info] Starting scala interpreter...
[info]
Welcome to Scala version 2.10.2 (OpenJDK 64-Bit Server VM, Java 1.6.0_27).
Type in expressions to have them evaluated.
Type :help for more information.

終了するときは、:quit とする。


■参考サイト:

http://www.playframework.com/download
http://yksris.hatenablog.com/entry/2013/01/06/134353
http://tech-sketch.jp/2013/11/scala-play2-1.html

Bookmarks 2013/12

ここ二ヶ月程でタメになったブログ記事一覧

Rails Optimization Points

ruby on rails 最適化要点メモ

1. DBテーブルに適切にインデックスが張られているか?

インデックスを設定するにあたって、データ取得条件(クエリのWHERE句)に注目すること。
また実行計画解析(explain)を活用し、実際にインデックスが有効になっているか確認すること。

以下のようにして、AvtiveRecordのexplain機能を利用することもできる。

User.where(:id => 1).joins(:posts).explain

2. キャッシュが有効に働いているか?

静的ファイルをブラウザ側でキャッシュする、Webブラウザとして nginx を採用する等。
またMemoryStore、MemCacheStore等、ActiveSupportで提供されるRails標準のキャッシュ機構を利用する。

3. DBから不必要にレコードセットを取得していないか?

レコードセットの内容に不必要なものがある場合は、より適切なレコードセット内容に改め、 内容が重複しているにもかかわらず何度も同じデータを引いている場合は、データ取得自体を止める。

4. N + 1 問題等が発生していないか?

N + 1 問題が発生している場合は、レコードセット取得時にテーブル同士の内積を取るようなクエリになるように書き直すこと。
N + 1 問題が起きているかどうか調べるには、bullet (https://github.com/flyerhzm/bullet) 等のツールを利用する。


参考サイト:
http://www.infiniteloop.co.jp/blog/2011/03/mysql-index-explain/
http://www.hitachi.co.jp/Prod/comp/soft1/manual/ws/c3F5500/EEXD0043.HTM

WEB+DB PRESS Vol.70 (技術評論社)「実践Rails高速化」

Logging Settings by Logrotate

■ nginx の logrotate 設定

今回 squeeze 上に導入した nginx/1.4.1 では特に設定の必要なし。 以下は既定の設定である。

1
2
3
4
5
6
7
8
9
10
11
12
13
/var/log/nginx/*.log {
        daily
        missingok
        rotate 52
        compress
        delaycompress
        notifempty
        create 640 nginx adm
        sharedscripts
        postrotate
                [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
        endscript
}

対象となるログは以下である。
/var/log/nginx/access.log
/var/log/nginx/error.log

参考サイト:
http://www.mk-mode.com/octopress/2013/02/17/nginx-logrotation/


■ unicorn の logrotate 設定

rails アプリの logrotate 用設定ファイルを /etc/logrotate.d/[rails_app] に設定する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/home/philippos/[rails_app]/log/unicorn.*.log {
  daily
  missingok
  rotate 60
  dateext

  # 圧縮設定 (次回のログ循環まで保留)
  compress
  delaycompress

  # unicorn master プロセスへ USR1 シグナル送信
  lastaction
    pid=/home/philippos/[rails_app]/tmp/pids/unicorn.pid
    test -s $pid && kill -USR1 "$(cat $pid)"
  endscript
}

上記設定の場合、日次でログ循環し、過去のログファイルは60世代まで確保される。 日付が付けられた過去のログファイルは圧縮される。

○補追

daily

日次でログ循環する。週次の場合は weekly、月次の場合は monthly を設定する。

missingok

ログファイルが存在しない場合でもエラーとしない。

rotate n

n 世代までログファイルを保持する。

dateext

過去のログファイルに日付(YYYYMMDD)を付加する。

○logrotate のオプションについて

logrotate 設定テスト

1
$ /usr/sbin/logrotate -d /etc/logrotate.d/[rails_app]

cron に依らず手動で logrotate してみたい場合

1
$ /usr/sbin/logrotate -f /etc/logrotate.d/[rails_app]

参考サイト:
https://github.com/phusion/unicorn/blob/master/examples/logrotate.conf
http://linux.kororo.jp/cont/server/logrotate.php

Rails Logging Settings

rails ロギング設定

production 環境のロギング設定を行うには、config/environments/production.rb にて以下のようにすること。

■ログファイルサイズとログファイル個数で設定したい場合

1
config.logger = Logger.new('log/production.log', 10, 10.megabytes)

上記において ActiveSupport::Logger.new の第二引数がログファイル個数、第三引数がログファイルサイズである。
例えばログファイル個数を 10 とした場合、設定されたログファイルサイズに応じて、production.log、production.log.0~production.log.8 までの10世代のファイルが作成される。

■時系列で設定したい場合

日次設定

1
config.logger = Logger.new("log/production.log", 'daily')

週次設定

1
config.logger = Logger.new("log/production.log", 'weekly')

月次設定

1
config.logger = Logger.new("log/production.log", 'monthly')

production.log.YYYYMMDD.N といったログファイルが生成されるが、古いログファイルが自動的に消去されることはないので適宜削除すること。

Vim Plugins for Git Introduction

git 関連 vim プラグイン導入

今回 vim 上で git コマンドを実行することのできる vim プラグインをふたつ導入した。
理由は不明だが、BundleInstallでふたついっぺんにインストールしようとするとインストールに失敗してしまうので、ひとつずつインストールすること。

■fugitive 導入

https://github.com/tpope/vim-fugitive

~/.vimrc に以下を追記後、vim 上からBundleInstallする。

1
2
"for git
Bundle 'tpope/vim-fugitive'

■fugitive 使用方法

具体的な使用方法は、以下のサイトに詳しい。
http://vimcasts.org/episodes/fugitive-vim—a-complement-to-command-line-git/

主なコマンド

fugitive を導入後、vim のコマンドモードで以下のコマンドを使用することができる。

Gstatus (= git status : リポジトリ状態)
Gdiff (= git diff : 差分)
Gwrite (= git add : 追加)
Gremove (= git rm : 削除)
Gcommit (= git commit : コミット)


参考サイト:
http://yuku-tech.hatenablog.com/entry/20110427/1303868482
http://cohama.hateblo.jp/entry/20120317/1331978764
http://www.makies.com/2011/11/302/

■gitv 導入

gitv は GUIによる git 用ツールである gitk と同等の目的と使用感を目指して作成された vim プラグインである。

https://github.com/gregsexton/gitv

~/.vimrc に以下を追記後、vim 上からBundleInstallする。

1
Bundle 'gitv'

■gitv 使用方法

vim のコマンドモードで Gitv とするとブラウザモードに移行する。
また Gitv! とするとファイルモードに移行する。
ブラウザモードでは、これまでのコミット情報を参照できる。
ファイルモードでは、対象とするファイルの履歴を参照できる。


参考サイト:
http://cohama.hateblo.jp/entry/20120417/1334679297
http://matsu.teraren.com/blog/2012/03/16/gitv/

Z-shell-introduction

z-shell 導入

tmux 上の作業用 shell を bash から bash と比較して多機能かつ高速であるとされる z-shell へ移行した。

http://www.zsh.org/

■z-shell のインストール

1
$ sudo aptitude install zsh

tmuxの設定ファイル(.tmux.conf)に、下記の設定を追記する。

1
set-option -g default-shell /bin/zsh

上記設定を追加後、tmux を再起動する。 tmux を再起動してから使用されている shell の種類を確認すること。

1
$ echo $SHELL
その他

zsh によるグロッピングが原因で octopress 用のコマンドがエラーとなってしまうため、.zshrc にグロッピング禁止の設定を追加する。
~/.zshrc に以下を追記すること。

1
setopt nonomatch # for octopress

■oh-my-zsh のインストール

設定ファイル集 oh-my-zsh を利用する。

1
2
git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc

以下のサイトのプレビューからテーマを選択する。

http://zshthem.es/all/

これらのテーマの中には、ローカルの git リポジトリ状態(対象ブランチ、編集中か否か、等)を shell prompt に表示するものもあるので利用したい。
今回はテーマとして、’pmcgee’ を採用した。 .zshrc 中の以下の変数を編集する。

1
ZSH_THEME="pmcgee"

tmux を再起動してテーマが正しく設定されているか確認すること。


参考サイト:
http://news.mynavi.jp/column/zsh/022/index.html
http://shanon-tech.blogspot.jp/2012/10/zsh.html
http://d.hatena.ne.jp/eitya/20110707/1310023383
http://zshthem.es/all/