ページ

2013年6月4日火曜日

chef-solo使い始める

さくらのVPSで使ってるUbuntuをまた壊してしまって直らない。
それならいっそ何度再インストールしようが痛くないようにchef使っておくことにした。

knife-soloを入れる。

% gem install knife-solo
何故かやたら時間かかった。

Chefレポジトリを作成する。
% knife solo init chef-repo

作成はされたけどwarningが出てた。
WARNING: No knife configuration file found

設定しておく。
% knife configure
色々聞かれたけどとりあえずreturnを連打してデフォルト設定にした。

とりあえず練習を兼ねてnginx用のクックブックを作る。
% cd chef-repo
% knife cookbook create nginx -o site-cookbooks
そうすると site-cookbooks以下にnginxフォルダとか出来る。

site-cookbooks/nginx/recipes/default.rbを編集して、
package "nginx" do
    action :install
end
とか書くと、サーバーにこのレシピを適用したときにOSの違いとか吸収してnginxをインストールしてくれるはず。

クライアント側からサーバーにchefをインストールさせることができる。
knife solo prepare user@host
sshと同じように -i とか -pとか -Pを付けて実行できる。

この時のユーザーはsudoできるユーザーじゃないといけない(たぶん)。

上の例だとクライアント側のnodesフォルダ内にhost.jsonっていうJSONファイルが生成されているはず。
こいつを編集してやって、どのレシピを使うかを指定する。
{"run_list":[]}
とかなってると思うので、こうする。
{"run_list":["nginx"]}

そしてサーバーにレシピを適用する。
% knife solo cook user@hoge
prepareの時と同じで、ここでもsshで接続するときと同じようにオプションを指定する。

ここまで正しくできてればnginxがインストールされる。
同じように他のレシピも作っていく。

2013年3月23日土曜日

Play2.1でHTTPのGETする

Playにはplay.api.libs.ws.WS(Web Service、WebSocketではない)というライブラリがあってHTTP通信をすることができる。
非同期にやってくれるので、レスポンスを同期的に使うには返り値をちょっとゴニョゴニョしないといけない。

で、Play2.0系のときはPromise[ws.Response]で返ってたんだけど、2.1からはFuture[ws.Response]で返ってくる。
ググって上の方に出てくるやつは大体2.0系の話なのでそのままでは動かない。

なので2.0系で以下のように書いていたものは

2.1系では以下のように書く必要がある。

本来これでいいと思うのだけど、
http://grokbase.com/t/gg/play-framework/131rzk6wcm/possible-ws-response-encoding-bug
とかで言及されているように<meta charset="utf-8">とか書かれてるHTMLでもISOで返ってきちゃう。

なので、文字コードを変換してやる

ちゃんと探してないけど、もしかしたらWSのオプションとかでエンコードを指定してやったりできるのかもしれない。

2013年2月27日水曜日

認証付きProxy環境下でHomebrewのインストール

export http_proxy=http://USER:PASS@PROXY:PORT
export ALL_PROXY=$http_proxy
してから
ruby -e “$(curl -fsSkL raw.github.com/mxcl/homebrew/go)”
する。

brew install等するときにも同様なので、上の2行をシェルの設定ファイルに書いておくのがよかろう。

2013年2月16日土曜日

MacRubyにおけるnilの扱い

参考: https://github.com/MacRuby/MacRuby/wiki/Common-Issues

Rubyでは、nilに対して定義されてないメソッド呼び出しをするとNoMethodErrorになる。一方、Objective-Cではnilに対してメッセージを投げても実行時エラーになることはなく、nilが返ってくる。

さて、MacRubyではどうなっているかというと、(少なくとも現状は)Rubyに合わせた仕様になっているらしく、NoMethodErrorになる。

ただ、既存のObjective-Cのコードを置き換えるとか、Cocoa的に書くとnilにメッセージを投げたい場合も出てくると思うので、そういうときは

framework 'Foundation'

しておけばいい。

RubyMotionとかMobiRubyではこの辺どうなってるんだろう。

2013年1月6日日曜日

MacRubyでCocoaPodsのインストールができなかった

CocoaPodsをインストールする。

普通のrubyでもいいらしいが、macrubyのほうが相性が良さそうな気がするのと、元々macrubyで使おうと思っているのでrbenvでmacrubyに切り替えてgem installする。
尚、rbenvとかrvmじゃないときはmacgem installする。
% gem install cocoapods
 あとこれも必要
% pod setup
 そしたらエラーが出た。

fork() function is unimplemented on this machine
とか出てる。ええー?

よくわからんので一回普通のruby1.9.3でgem installとpod setupしたらすんなりいけた。ええー?

2012年12月31日月曜日

rvmからrbenvに乗り換え

年越し環境構築を。
rvmからrbenvに乗り換えてみる。

まずはrvmをアンインストール。
rvmをアンインストールするにはrvm implodeもしくはrvm seppukuコマンドを使う(切腹ってなんだよ)。
% rvm seppuku
zshrcとかに書いてあるrvm関連の行も消す。

続いてrbenvとruby-buildのインストール、Homebrewで。

% brew install rbenv ruby-build

eval "$(rbenv init -)" をzshrcとかzshenvとかに書く(僕はzshenvに書いた)。

rbenv installでrubyをインストールする
% rbenv install 2.0.0-preview2
自分でコンパイルして ~/.rbenv/versions/ に置いてやるんでもいいらしい。

追記:
ruby2はMacデフォルトのopensslとは互換性がないとかなんとか。
https://github.com/sstephenson/ruby-build/issues/197

なのでopensslもhomebrewでインストールして、rubyもオプション付けてインストールし直した。
% brew install openssl
% brew link openssl
% RUBY_CONFIGURE_OPTS=--with-openssl-dir=`brew --prefix openssl` rbenv install 2.0.0-preview2

2013/04/21 追記
readlineも指定してやらないとirbとかpryで日本語使えなかった
% brew install readline
% CONFIGURE_OPTS="--with-openssl-dir=`brew --prefix openssl` --with-readline-dir=`brew --prefix readline`" rbenv install 2.0.0-p0

インストールしたら、rbenvでは以下のコマンドが必要になるそうな。
% rbenv rehash
rbenvではこれをよく使うらしく、新しくrubyをインストールしたときとか、実行可能なgemをインストールしたときにもrehashしてやらないといけないらしい。
(rbenv-rehashっていうgemを各rubyに入れておいてやることで勝手にやってくれるようになるらしいが、まあなんとなく鬱陶しいな)

デフォルトで使うrubyのバージョンはrbenv globalで指定する。
% rbenv global 2.0.0-preview2
β版的なものをデフォルトにするのは止めたほうがいいと思う。

尚、MacRubyに関しては、rbenv-macrubyというプラグインがあり、こいつを使えばMacRubyもrbenvで管理できる。

2012年12月23日日曜日

[Mac]Guardによる自動テスト

久々に環境構築おじさん的なことを。

これまでRSpecとautotest(zentest)を使ってたのだけど、最近はみんなminitestだな、とかなんとか聞いたのでminitestも使ってみる。
で、自動実行するためにGuardを使う。Rails4とかで使われてるのかな?

gemspecに書いてbundle install
gem.add_development_dependency "guard-minitest"
もちろん普通にgem installしてもいいし、Gemfileに書いてもいい。

Guardfileという設定ファイルを生成するために
% bundle exec guard init minitest
Guardfileの基本的なところについては割愛。

ファイル保存のタイミングでテストするためにrb-fsevent使う(WindowsとかLinuxの場合はほかのものを使う)
gem.add_development_dependency "rb-fsevent"
テスト書いて、
% guard
すると、ファイル保存のたびにテストされる。


以下、Growlで通知させる話。

gem growlを使う。
gem.add_development_dependency "growl"
を追加して、bundle installしてguardし直す。

が、通知されない。

Growl2.0になって、GrowlNotifyを入れてないせいだった。
http://growl.info/downloads#generaldownloads からダウンロードしてインストール。

改めて
% guard
適当にファイルいじって保存してテストを走らせる。

通知出た。
が、何故か1回ファイル保存するごとに2回ずつ通知される。
よくみたらテスト自体が2回ずつ実行されてる。

Guardfileにguard 'minitest' do endが2個あった。
guard init minitestをしたときに、Gemfileがあるならbundle execしたほうがいいんじゃない?って出力されたのでもう一回bundle exec guard init minitestしたらGuardfileに追記されていたせいだった。

もう一回guard initしてみたら3個になって、
There are 3 definitions in your Guardfile for 'minitest', you may want to clean up your Guardfile as this could cause issues.
っていうのが出てた。2回目のときにも出ていたんだろう。
必要ない分を消したらちゃんと1回だけ実行されて通知も1個になった。