0

Ubuntu12.04にrbenvインストールして、crontabやdaemontoolsも設定した

さくらVPSのUbuntu12.04のrvmをrbenvに切り替えた

関連

mac版
橋本商会 » rvmからrbenvに乗り換えた
橋本商会 » crontabでrbenvのrubyを使う

準備


先にrubyをbuildするのに必要なaptを入れる(先にrvmを使っていたのでこれは必要なかったが)
sudo apt-get install build-essential libreadline-dev libssl-dev


rvmを消す
rvm seppuku
sudo rm -rf ~/.rvm


ホームディレクトリにrbenvを入れる


rbenvはaptにもあるけどruby-buildが無いので両方githubからcloneした。
git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
mkdir ~/.rbenv/plugins
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build


rbenvへのパスを通す。 ~/.zshrc に書けばいい・・
export PATH=$PATH:$HOME/.rbenv/bin
eval "$(rbenv init -)"
と思いきや、screenを起動したりzsh上でzshを起動するとrbenvのパスより上に /usr/local/bin 等が来て、system rubyが使われてしまう現象が起きた。

rbenvのissueやドキュメントを確認したり調べてみると
Unix shell initialization · sstephenson/rbenv Wiki
インストールしたてのUbuntu12.04では /etc/zsh/zshrc や /etc/zlogin がPATHをいじってた。
一番最後にロードされるらしい ~/.zlogin にrbenvの設定を書いたらscreen上でもrbenvが正しくロードされた。


ruby 2.0.0インストール
rbenv -v
rbenv install --list | grep 2.0
rbenv install 2.0.0-p0


デフォルトでruby2.0使うようにする。
rbenv global 2.0.0-p0
rbenv rehash
ruby -v
2.0になってればok


gemをアップデートしたり、自動rehashするrbenv-rehashを入れたり
gem update --system
rbenv rehash
gem install rbenv-rehash bundler
rbenv rehash


jrubyもインストールする
rbenv install jruby-1.7.3


jrubyのソースコード置いてある場所でだけ、ruby2.0からjruby1.7に切り替えるようにする
cd ~/src/jruby
rbenv local jruby-1.7.3
rbenv rehash
ruby -v
jrubyになっていればおk


rubygemとbundlerをアップデートしたり、自動的にrehashするようにする。
gem update --system
rbenv rehash
gem install rbenv-rehash bundler
rbenv rehash
このディレクトリの下でだけjrubyが使われるようになる。


crontabでrbenvのrubyを使う


crontabの上の方で、PATHの先頭に ~/.rbenv/shims を入れる。
あとはアプリのディレクトリまでcdしてからrubyを使うようにすれば、ちゃんとGemfileも.ruby-vesionも読んで実行してくれる。
HOME=/home/shokai
PATH=/home/shokai/.rbenv/shims:/bin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/home/shokai/bin

*/15 * * * * cd $HOME/src/ruby/twitter-change-profile && ruby change-profile.rb
*/20 * * * * cd $HOME/src/jruby/glitchicon && ruby bin/create_icon.rb $HOME/shokai.png /var/tmp/glitch_icon.png && ruby bin/upload.rb /var/tmp/glitch_icon.png
jruby使うアプリもちゃんとrbenv切り替えて実行してくれてた。


事前にcrontab上でrbenvが正しく動くかを確かめたほうがいい。
* * * * * echo $PATH > $HOME/cron-path.txt
* * * * * ruby -v > $HOME/cron-ruby-version.txt
* * * * * cd $HOME/src/jruby && ruby -v > $HOME/cron-jruby-version.txt
こういうの登録したらホームディレクトリに環境変数とか書き出す。
なんだか知らんが、Macではできるのに、PATHへの代入の右項に$HOMEとか書いても変数展開されない現象が起きてた。


daemontoolsでrbenvのrubyを使う


daemontoolsはlogが確認しやすいので楽。

http://dev.shokai.org:4000 の起動スクリプト。
cronと同じようにパスの先頭にshimsを追加すればいい。

/etc/service/rocketio-chat/run
#!/bin/sh
exec 2>&1
exec setuidgid sho bash -c '
HOME=/home/shokai
PATH=$HOME/.rbenv/shims:$PATH
cd $HOME/src/sinatra/rocketio-chat-sample
WS_PORT=18080 rackup config.ru -p 4000
'

0

別ドメインのiframeの中身をフレーム外からスクロール

諸事情あって、iframeの中身をフレーム外側のページからJavaScriptでスクロールできるのを作った。
ふつうは別ドメインのページをiframeに読み込むとスクロールできないんだけど、(marginに負の値を入れたりして)iframeごと上下左右に動かしたり、iframeの外側にbox要素2つ付けてはみだした部分を表示しないようにcssでなんか色々やったりしたらそれらしい物ができた。

デモ XFrame.js

shokai/xframe.js · GitHub


使い方は簡単である

js読み込んで

<script src="xframe.js"></script>

XFrameを出したい箱を作って
<div id="tv"></div>


読み込む
var xframe = new XFrame("div#tv");
xframe.load("http://shokai.org");


あとは相対スクロールしたり絶対位置指定したりできる
xframe.scrollX(10);
xframe.scrollY(100);
xframe.top = 200;
xframe.left = 50;


マウスによるスクロールを許可するかどうかも決めれる
xframe.mouseScroll = true;
xframe.mouseScroll = false;


XFrame自体の大きさは外側のdivにピッタリになるようにできているので、
この例だと<div id="tv">にcssでwidthやheight付ければサイズ決められる。

無茶っぽい実装だけど不思議と主要なブラウザでは動いちゃった。(safari, firefox, chrome, iOS, Android)
でも発想としては昔のFlashなんかでよく使うような方法だと思う。

0

githubの自分のリポジトリのissue一覧を見るツール

自分にアサインされたissueは通知が来るけど、
自分が持ってるリポジトリのissue一覧が無いのでgithub API使って簡単なCLIツール作った

全部表示すると精神衛生上よくないので60日以内に更新があったリポジトリだけ表示するようにした

shokai/github-cmd · GitHub


octokitっていうrubygemがなかなか使いやすかった。よくあるfaradayで取得してHashie::Mashで返してくれるタイプ。
pengwynn/octokit · GitHub

0

Sinatra RocketIOのcometの負荷が軽くなった

sinatraにSocketIOっぽいwebsocket/comet機能を追加できるプラグインを作っている。
今日はcometの負荷を軽くした。

shokai/sinatra-rocketio · GitHub


comet、複数回のサーバーへのpushをキューに溜めてまとめて送信するようにした。
cometioのpost_intervalで設定できる

設定例

set :cometio, :timeout => 120, :post_interval => 2
set :websocketio, :port => 8080
set :rocketio, :websocket => true, :comet => true # enable WebSocket and Comet
post_interval => 2 でタメたキューを2秒ごとにサーバーに送る。


websocketは1プロセスで1万5千ぐらい接続できるんだけど、cometが重くて足ひっぱってたのでこれで軽くなったと思う。

例えばこういうコードの時に今まで10回pushされてたけど、10回分まとめてajaxするので軽い。
for(var i = 0; i < 10; i++){
io.push("chat", "hoge("+i+")");
}

sinatra-cometio v0.5.1から有効になってる機能で、sinatra-rocketioとは別のgemなので
bundle updateしてアップデートしてください

0

Sinatra RocketIO v0.2.0でchannel機能がついた

前:Sinatra RocketIOというプラグイン作った、これでWebSocketとCometが使える

クライアントのグループを作る機能を追加した。
例えばチャットルームを分ける時などに使ってください。

クライアント側が接続する時にチャンネル名を指定すると、サーバー側で管理されているチャンネルリストに追加される。

var io = new RocketIO({channel: "チャンネル名"}).connect();
io.on("hoge", function(data){
alert(data);
});


サーバー側からチャンネルを指定して送信する
Sinatra::RocketIO.push :hoge, "ホゲ", :channel => "チャンネル名"

サンプルも更新してあるのでどうぞ


こうすれば、 http://アプリ名/chat/チャットルーム名 でグループ分けできる。

sinatra側でURLからチャットルーム名を取り出してチャンネル名とし、
get '/chat/:channel' do
@channel = params[:channel]
haml :chat
end


viewテンプレートでjavascriptにチャンネル名を渡して
:javascript
var channel = "#{@channel}";


接続時にchannelを指定する。
var io = new RocketIO({channel: channel}).connect();