log

Redmine 1.3.0 で Wiki を PDF 出力する

ついに Wiki も PDF 出力が!ってことで喜び勇んで試してみたらそのままじゃ動かなかったのでメモ。

環境は以下の通り。

gem のインストールやらほげほげは省略(たぶん後で別途まとめる)。

PDF 出力自体は(rmagick install 済みという条件付きで)可能。

ただし、そのままだと日本語のフォントが汚い。かつ、漢字が出力されない。

解決策としては、config/locales/ja.yml の 169 行目辺りを変更する。

general_pdf_encoding: SJIS # コメントアウトされてるのでコメントを外す
# general_pdf_encoding: CP932 # 元々はこっちが使われているが、コメントアウトする

つまり、general_pdf_encoding の値を CP932 から SJIS へ変更する。

これで日本語フォントが修正されて漢字もちゃんと出力されるようになる。

死ぬほど眠いから今日はここまで。

Jenkins で Rails3 プロジェクトのカバレッジを計測する

話にはよく聞くけど実際 Jenkins 使ったことないなーってことで、ちょうど手元で試してた rails3 のプロジェクトを対象に構築してみることにした。

rails3 でカバレッジ計測

以前は rcov 使ったと思うんだけど、rcov は 1.9.* には対応してないらしい。 最近の流行りは simplecov らしいってことで simplecov を入れる。

参考: Ruby 1.9.2 + Rails3でテストカバレッジを取るにはSimpleCovが良さそう | FIRN.JP

ちなみに rspec までは導入済みという前提。

必要なのは simplecov と simplecov-rcov。前者がカバレッジ計測で後者は出力フォーマットを rcov 互換にする。

まずは Gemfile に simplecov と simplecov-rcov を追加。

group :test do
gem 'simplecov', :require => false
gem 'simplecov-rcov', :require => false
end

追加したら bundle install を実行。

$ bundle install

spec/spec_helper.rb に以下の記述を追加。 require 'rspec/rails' よりも前じゃないと正常に動作しないっぽい。

require 'simplecov'
require 'simplecov-rcov'
SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter
SimpleCov.start 'rails'

準備ができたら rake spec を実行する。結果は coverage/rcov 以下に出力される。

$ rake spec

simplecov の設定はひとまず完了。

Jenkins インストール

公式の Wiki に Ubuntu の場合のインストール手順が載ってたのでそのまま実行。

ちなみに、rails 開発環境とは別マシンを作ってそっちにインストールした。実際に運用するときを想定して。

Installing Jenkins on Ubuntu - Jenkins - Jenkins Wiki

Jenkins サーバに rvm をインストールする

手順は 以前エントリにまとめた のでそれをそのまま使う。

開発マシンから git clone するために ssh 公開鍵の設定

考えてみたら、複数人開発で git 使うときって何が主流なんだろう。公開できないようなレポジトリの場合。github のプライベートレポジトリ? gitosis? gitlab? まあいいや。

とりあえず、ssh アクセス用に開発マシンに jenkins アカウントを作っておく。

% sudo adduser jenkins

続いて、jenkins サーバで公開鍵を作る。パスフレーズは空のままにしておくこと。

$ sudo su - jenkins
$ ssh-keygen

一度開発マシンに ssh ログインする。

$ ssh jenkins@rails-dev

gitconfig の設定

これを済ませておかないと clone でこける。

参考: Ubuntu ServerにJenkinsをセットアップしてGitレポジトリと連動するまでのまとめ - jiska

sudo -u jenkins -H git config --global user.email "jenkins@jenkins-server"
sudo -u jenkins -H git config --global user.name "jenkins"

必要なプラグインをインストールする

今回の用途だと以下の三つを入れておくといいらしい。

  • Jenkins ruby metrics plugin
  • Jenkins GIT plugin
  • Jenkins Rake plugin

インストールは http://jenkins-server:8080/pluginManager から GUI で実行可能。便利。

rails プロジェクト用ジョブ作成

設定を以下にまとめる。

#!/var/lib/jenkins/.rvm/bin/rvm-shell ruby-1.9.2-p290@rails3
bundle install --without=production
rake db:migrate
rake spec
  • ビルド後の処理

これでひと通り設定完了。のはず。うまくいかない場合はコンソール出力を確認すること。

zsh/screen/vim の設定ファイルを Dropbox + github で管理する

今まで Dropbox のみで管理してたけど、どれこれ構わず Dropbox インストールするわけにもいかないので、Dropbox にいれつつ github でも管理するようにした。 ついでに github から clone した後の配置を自動化するスクリプトを書いた。

レポジトリ: https://github.com/yono/dotfiles

zsh

Mac/Linux で設定が異なる部分が多いので、共通部分は zshrc.common にまとめてそれを zshrc.mac/zshrc.linux から source で読み込むという形をとっている。

例えば Linux の場合は以下な感じでシンボリックリンクを張って使っている。

$ ln -s ~/Dropbox/dotfiles/zsh/zshrc.linux ~/.zshrc

screen

環境ごとに変える要素も特にないので、そのまま。欲を言うと、多段 screen するために環境ごとに設定を分けたいところだけどまだやってない。

vim

一番手間取った。

プラグインを vundle で管理してるので、その辺りの設定をほげほげしてた。

まず、bundle(vundle が管理するディレクトリ)は Ignore しておくこと。

$ vim .gitignore
vim/bundle

で、vundle は submodule として扱う。

$ git submodule add git://github.com/gmarik/vundle.git vim/vundle

デプロイするスクリプト

dotfiles を clone した後にやることは以下のとおり。

  1. submodule を読み込む
  2. 各設定ファイルにシンボリックリンクを貼る
  3. vundle で各プラグインを取得

手動でやるのがめんどくさかったので簡単なスクリプトを書いた。

https://github.com/yono/dotfiles/blob/master/init.sh

#!/bin/sh

DROPBOX_DIR="$HOME/Dropbox"
DOTFILES="$DROPBOX_DIR/dotfiles"

if [ ! -d "$DOTFILES" ]
then
echo "Please mv dotfiles to $DROPBOX_DIR"
exit
fi

cd $DOTFILES

git submodule update --init

ln -s $DOTFILES/zsh $HOME/.zsh
ln -s $DOTFILES/zsh/zshrc.linux $HOME/.zshrc
ln -s $DOTFILES/zlogin $HOME/.zlogin
ln -s $DOTFILES/screenrc $HOME/.screenrc
ln -s $DOTFILES/vimrc $HOME/.vimrc
ln -s $DOTFILES/vim $HOME/.vim

vim -c ':BundleInstall!'

こんな感じで、即席で作った仮想マシンにもさくっと自分の環境が持ち出せるようになった。快適。

Debian Squeeze インストールから Rails 3.1 を動かすまで

毎回忘れるので備忘録として。

条件としてはこんな感じ。

OS インストールと VMware Tools インストール

インストールは省略。パッケージのチェックをすべて外すこと。

インストール終わってログインしたら VMware Tools インストールに必要なものを入れる。

# apt-get install make gcc linux-headers-2.6.32-5-686

入れ終わったら VMware Fusion 側でメニューから [仮想マシン]→[VMware Tools のインストール]を選択する。

# mount /dev/cdrom
# cd /tmp
# tar zxpf /media/cdrom/VMwareTools-8.4.7-416484.tar.gz
# umount /dev/cdrom
# cd vmware-tools-distrib
# ./vmware-install.pl

rvm には必須じゃないけど個人的に必要なコマンドを入れる

とりあえず ssh と sudo と zsh とついでに vim を入れる

# apt-get install ssh sudo zsh-beta vim

/etc/sudoers 書き換えて一般ユーザに sudo 権限持たせる

# vim /etc/sudoers
# User privilege specification
root ALL=(ALL) ALL
yono ALL=(ALL) ALL # 追加

sudo 権限持たせたので以降は一般アカウントで作業

# su - yono

ログインシェルを変更する

$ chsh 
パスワード:
yono のログインシェルを変更中
新しい値を入力してください。標準設定値を使うならリターンを押してください
ログインシェル [/bin/bash]: /bin/zsh-beta

一旦抜けてログインし直す。以降は zsh での作業となる。

rvm インストール

rvm インストールに最低限必要なコマンドを入れる

% sudo apt-get install curl git

http://beginrescueend.com/rvm/install/ に従い、rvm をインストール

% bash < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )

インストール完了時に「Ruby 処理系入れるならこのパッケージをインストールしろ」的なメッセージが出るのでコピペして実行(apt-get のコマンドがそのまま表示される)。

$HOME/.zshrc に以下の記述を加えて読み込む

% vim ~/.zshrc
[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"
% source ~/.zshrc

ruby 1.9.2 をインストール

最新版は 1.9.3 だが今回は 1.9.2 を入れる。 ついでに gemset も作っておく

% rvm install 1.9.2
% rvm use 1.9.2
% rvm gemset create rails3
% rvm gemset use rails3

–no-ri –no-rdoc をデフォルトにする

毎回 gem install 時にオプションで付けるのを忘れるので、.gemrc に記述しておく。

% vim ~/.gemrc
gem: --no-ri --no-rdoc

rails をインストール

rails と、ついでに sqlite3 を apt で入れとく

% gem install rails
% sudo apt-get install libsqlite3-dev

プロジェクトを作成

sample プロジェクトを作って実行してみる。

% rails new sample -d sqlite3
% cd sample
% rails s

すると、以下のようなエラーが出る

/home/yono/.rvm/gems/ruby-1.9.2-p290@rails3/gems/execjs-1.2.12/lib/execjs/runtimes.rb:47:in `autodetect': Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
from /home/yono/.rvm/gems/ruby-1.9.2-p290@rails3/gems/execjs-1.2.12/lib/execjs.rb:5:in `<module:ExecJS>'
from /home/yono/.rvm/gems/ruby-1.9.2-p290@rails3/gems/execjs-1.2.12/lib/execjs.rb:4:in `<top (required)>'
from /home/yono/.rvm/gems/ruby-1.9.2-p290@rails3/gems/coffee-script-2.2.0/lib/coffee_script.rb:1:in `require'
from /home/yono/.rvm/gems/ruby-1.9.2-p290@rails3/gems/coffee-script-2.2.0/lib/coffee_script.rb:1:in `<top (required)>'
from /home/yono/.rvm/gems/ruby-1.9.2-p290@rails3/gems/coffee-script-2.2.0/lib/coffee-script.rb:1:in `require'
from /home/yono/.rvm/gems/ruby-1.9.2-p290@rails3/gems/coffee-script-2.2.0/lib/coffee-script.rb:1:in `<top (required)>'
from /home/yono/.rvm/gems/ruby-1.9.2-p290@rails3/gems/coffee-rails-3.1.1/lib/coffee-rails.rb:1:in `require'
from /home/yono/.rvm/gems/ruby-1.9.2-p290@rails3/gems/coffee-rails-3.1.1/lib/coffee-rails.rb:1:in `<top (required)>'
from /home/yono/.rvm/gems/ruby-1.9.2-p290@global/gems/bundler-1.0.21/lib/bundler/runtime.rb:68:in `require'
from /home/yono/.rvm/gems/ruby-1.9.2-p290@global/gems/bundler-1.0.21/lib/bundler/runtime.rb:68:in `block (2 levels) in require'
from /home/yono/.rvm/gems/ruby-1.9.2-p290@global/gems/bundler-1.0.21/lib/bundler/runtime.rb:66:in `each'
from /home/yono/.rvm/gems/ruby-1.9.2-p290@global/gems/bundler-1.0.21/lib/bundler/runtime.rb:66:in `block in require'
from /home/yono/.rvm/gems/ruby-1.9.2-p290@global/gems/bundler-1.0.21/lib/bundler/runtime.rb:55:in `each'
from /home/yono/.rvm/gems/ruby-1.9.2-p290@global/gems/bundler-1.0.21/lib/bundler/runtime.rb:55:in `require'
from /home/yono/.rvm/gems/ruby-1.9.2-p290@global/gems/bundler-1.0.21/lib/bundler.rb:122:in `require'
from /home/yono/sample/config/application.rb:7:in `<top (required)>'
from /home/yono/.rvm/gems/ruby-1.9.2-p290@rails3/gems/railties-3.1.3/lib/rails/commands.rb:52:in `require'
from /home/yono/.rvm/gems/ruby-1.9.2-p290@rails3/gems/railties-3.1.3/lib/rails/commands.rb:52:in `block in <top (required)>'
from /home/yono/.rvm/gems/ruby-1.9.2-p290@rails3/gems/railties-3.1.3/lib/rails/commands.rb:49:in `tap'
from /home/yono/.rvm/gems/ruby-1.9.2-p290@rails3/gems/railties-3.1.3/lib/rails/commands.rb:49:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'

調べてみると JavaScript エンジンが必要とのことらしい(JavaScriptエンジンをインストールする - 祈れ、そして働け 〜 Ora et labora)。

というわけで、therubyracer を Gemfile に追記して bundle 実行。

% vim Gemfile
gem 'therubyracer'

% bundle

改めて rails s を実行すると今度は正常に起動した。

Evernote から Org-mode への移行

今まで Evernote に保存してたテキストをすべて Org-mode へ移行することにした。 画像やPDFはそれほど保存してないし問題ないだろうという判断。

それほど多くないかと思ってたら700ページくらいあって手動は早々に諦めた。

Evernote のエクスポートについて調べてみたらXMLとHTMLがあったので、とりあえず HTML から Org-mode への変換を試してみることにした。

で、できたのを Gist に上げた。HTMLタグを抽出するスクリプトは http://oceanmarine.org/wordpress/?p=184 を使わせていただいた。

細かい置換は端折りまくったけど、とりあえずテキストで取り出せれば修正は後でもいいかなって感じで作った。どっちみち今後は増えないし、どうしても気になる箇所があれば目についたときに直せばいいし。

org2blog で Emacs から WordPress に投稿する

ちょい前に wp-emacs から投稿する設定をしたばかりだけど、他にもないかなと探してたら org2blog なんてものがあった。

こっちだと HTML に変換する手間も省けるしよさげかも、ってことで設定してみることに。

README 通りに書いてみて、とりあえずこの記事を org2blog 経由で書いてみてる。

wp-emacs との違いは

  1. カテゴリが指定できる
  2. タグが指定できる
  3. M-x org2blog/wp-post-buffer の後に y を選ぶとブラウザにプレビューが表示される

ってわけで wp-emacs 使う理由が無くなってしまった。 さようなら wp-emacs こんにちは org2blog