git で空ディレクトリを追加するには
そのままでは追加できないので普通は
$ mkdir tmp $ touch tmp/.gitignore
とかするのですが,Rails ではそれがいくつもあるので手動では面倒です.なので find を使って自動すると便利です.
$ find . -type d -empty -not -path './.git*' -exec touch {}\/.gitignore \;
エンジニアのための本気で物理を勉強する会(仮)
ちゃんと物理勉強したい人たちでがんばろうぜ的な会があってもいいなかーと,ふと思ったので,人が集まればやっても良いんじゃないかと.まあ集まらなくても一人でもくもくとやると思うのですが.
いまの想定では下記の順番にやっていこうかなと思ってます.ホントは全て原書がいいのですが,どうも売って無さそうなので2番目だけ訳書になってます.
- Feynman Lectures On Physics
Feynman Lectures On Physics (3 Volume Set)
- 作者: Richard Phillips Feynman
- 出版社/メーカー: Pearson P T R
- 発売日: 1970/06/01
- メディア: ペーパーバック
- クリック: 34回
- この商品を含むブログ (8件) を見る
- 作者: R.P.ファインマン,A.R.ヒッブス,Richard P. Feynman,Albert R. Hibbs,北原和夫
- 出版社/メーカー: みすず書房
- 発売日: 1995/05
- メディア: 単行本
- クリック: 8回
- この商品を含むブログ (8件) を見る
- Quantum Computation and Quantum Information
- 作者: Michael A. Nielsen,Isaac L. Chuang
- 出版社/メーカー: Cambridge University Press
- 発売日: 2000/09
- メディア: ペーパーバック
- クリック: 8回
- この商品を含むブログ (12件) を見る
と言うのをやってみたいって人はいるかな?いれば一緒に勉強しましょうという感じですが.
lsyncd + rsync on Debian(lenny) でらくらく同期
やはり Debian ですよね,いろいろと.
と言うわけで,以前は DRBD Dual Primary + GFS2 と言う構成で試していたんですが,起動や停止手順を誤るとプロセスが完全に死んじゃってシステム終了すらできなくなったりしたので,お気軽な方の検証を.
参考 : http://d.hatena.ne.jp/wadap/20090913/1252839223
下準備
いつも通り IP アドレスは手動で標準システムのみのものを用意します.そして
# aptitude install sudo vim lv openssh-server # update-alternatives --config editor # visudo # addgroup wheel # adduser user wheel # logout
こんな感じのを2つ用意します.virt-clone を使ったやり方はkumofs を KVM 上の Debian(lenny) にインストールして動かすまで - なんとなく日記を参考に.今回は普通にインストールしました.
slave 側の準備
$ sudo adduser rsyncd $ sudo mkdir /opt/folder $ sudo chmod 777 /opt/folder $ sudo chown rsyncd.rsyncd /opt/folder $ sudo vim /etc/rsyncd.conf
uid = rsyncd gid = rsyncd log file = /var/log/rsyncd.log [data] comment = rsync slave path = /opt/folder hosts allow = lsyncd-master read only = false
$ sudo rsyncd --daemon
master 側の準備
今回はパッケージ化します.
$ sudo aptitude install rsync build-essential libxml2-dev dh-make autotools-dev fakeroot $ wget http://lsyncd.googlecode.com/files/lsyncd-1.26.tar.gz $ tar zxvf lsyncd-1.26.tar.gz $ cd lsyncd-1.26/ $ dh_make --createorig $ fakeroot dpkg-buildpackage $ sudo dpkg -i ../lsyncd_1.26-1_amd64.deb $ sudo mkdir /opt/folder $ sudo chgrp wheel /opt/folder $ sudo chmod g+w /opt/folder $ sudo vim /etc/lsyncd.conf.xml
<lsyncd version="1.25"> <settings> <logfile filename="/var/log/lsyncd"/> <pidfile filename="/var/run/lsyncd/lsyncd.pid"/> <binary filename="/usr/bin/rsync"/> <callopts> <option text="-lt%r"/> <option text="-p"/> <exclude-file/> <source/> <destination/> </callopts> </settings> <directory> <source path="/opt/folder"/> <target path="lsyncd-slave::data"/> </directory> </lsyncd>
$ sudo lsyncd
適当にファイル作ったりするとファイルが転送されます.これは便利だな.
#!/usr/bin/env bash ### BEGIN INIT INFO # Provides: lsyncd # Required-Start: $local_fs $remote_fs $network $syslog # Required-Stop: $local_fs $remote_fs $network $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start/stop lsyncd daemon ### END INIT INFO LSYNCD=/usr/bin/lsyncd SRC=/opt/folder PID=/var/run/lsyncd/lsyncd.pid . /lib/lsb/init-functions case "$1" in start) log_daemon_msg "Start lsyncd." $LSYNCD ;; stop) log_daemon_msg "Stop lsyncd." killproc -p $PID ;; restart) $0 stop $0 start ;; *) echo "Usage: /etc/init.d/lsyncd {stnard|stop|restart}" ;; esac
注意点としては lsyncd の設定で,source の部分の最後のスラッシュです.つけると「ディレクトリの中身」になり,つけないと「ディレクトリ自体」となるようで,ここでちょっとはまりました.
kumofs を KVM 上の Debian(lenny) にインストールして動かすまで
KVM on Debian(lenny) を使ったサーバを構築してみます.
システムインストール
最初は virt-manager などで VM を作成.ホスト名は kumofs で標準システムのみに.
下準備
まずは基本セットをインストール
$ su - # aptitude install sudo vim lv openssh-server # update-alternatives --config editor There are 4 alternatives which provide `editor'. Selection Alternative ----------------------------------------------- 1 /bin/ed *+ 2 /bin/nano 3 /usr/bin/vim.tiny 4 /usr/bin/vim.basic Press enter to keep the default[*], or type selection number: 4 Using '/usr/bin/vim.basic' to provide 'editor'. # visudo # addgroup wheel # adduser user wheel # logout
日本語ドキュメントを見ると下記が必要らしいのでインストールします.
- linux >= 2.6.18
- g++ >= 4.1
- ruby >= 1.8.6
- Tokyo Cabinet >= 1.4.10
- MessagePack for C++ >= 0.3.1
- MessagePack for Ruby >= 0.3.1
- libcrypto (openssl)
- zlib
$ sudo aptitude install ruby1.8 ruby rubygems rubygems1.8 libcrypto++-dev zlib1g-dev build-essential
次に TokyoCabinet
$ mkdir tmp; cd tmp $ wget http://1978th.net/tokyocabinet/tokyocabinet-1.4.41.tar.gz $ tar zxvf tokyocabinet-1.4.41.tar.gz $ cd tokyocabinet-1.4.41/ $ ./configure $ sudo aptitude install libbz2-dev # TokyoCabinet に必要なので追加 $ ./configure $ make $ sudo make install $ sudo vim /etc/ld.so.conf.d/local.conf /usr/local/lib $ sudo ldconfig
そして MessagePack を.
$ cd ../ $ wget "http://sourceforge.jp/frs/redir.php?m=jaist&f=%2Fmsgpack%2F45459%2Fmsgpack-0.4.0.tar.gz" $ tar zxvf msgpack-0.4.0.tar.gz $ cd msgpack-0.4.0/ $ ./configure $ make $ sudo make install $ sudo gem install msgpack --no-ri --no-rdoc $ sudo aptitude install ruby1.8-dev ruby-dev # 拡張ライブラリなので追加で必要 $ sudo gem install msgpack --no-ri --no-rdoc
最後に kumofs をインストール
$ cd ../ $ wget http://cloud.github.com/downloads/etolabo/kumofs/kumofs-0.3.0.tar.gz $ tar zxvf kumofs-0.3.0.tar.gz $ cd kumofs-0.3.0/ $ ./configure $ sudo aptitude install libssl-dev # こちらも必要だった模様 $ ./configure $ make $ sudo make install
これでインストールは完了.結局 Debian(lenny) に必要なパッケージは下記の通り.
- build-essential
- ruby1.8
- ruby
- ruby1.8-dev
- ruby-dev
- rubygems
- rubygems1.8
- libcrypto++-dev
- zlib1g-dev
- libbz2-dev
- libssl-dev
$ sudo aptitude install build-essential ruby1.8 ruby ruby1.8-dev ruby-dev rubygems rubygems1.8 libcrypto++-dev zlib1g-dev libbz2-dev libssl-dev
複数台の用意
サンプルでは3台構成だったので,これをあと2つ作成します.(kumofs / kumofs2 / kumofs3).ます先ほど作成した kumofs を shutdown します.
$ sudo poweroff
次に KVM ホストから virt-clone します.MAC アドレスは下位アドレスを被らない適当なのに.
$ sudo virt-clone --original kumofs --name kumofs2 --file kumofs2.img --mac 52:54:00:93:23:43 $ sudo virt-clone --original kumofs --name kumofs3 --file kumofs3.img --mac 52:54:00:93:29:12
さてこのままでは MAC アドレスが変わったためにネットワークデバイスが追加されてしまいます.そこで console に入って必要な部分を直接変更します.
- /etc/udev/rules.d/70-persistent-net.rules から MAC アドレスが書かれている行を削除
- 恐らく2行ある
- /etc/network/interface の address の項目を変更
- 固定アドレスの場合
- /etc/hostname の変更
- /etc/hosts の変更
192.168.123.10 kumofs 192.168.123.11 kumofs2 192.168.123.12 kumofs3
- 再起動
- hostname / ifconfig で変更されていることを確認.
- poweroff
という感じで2台(kumofs2 / kumofs3)実行します.最後の /etc/hosts の設定を kumofs にもして完了
実験開始
いよいよ実験開始.ドキュメントにある構成との対応は以下のようにします.
- srv1 -> kumofs
- srv2 -> kumofs2
- srv3 -> kumofs3
- cli -> kumofs
kumo-manager の起動
kumofs$ kumo-manager -v -l kumofs -p kumofs2 kumofs2$ kumo-manager -v -l kumofs2 -p kumofs
kumo-server の起動
kumofs$ kumo-server -v -l kumofs -m kumofs -p kumofs2 -s /tmp/kumodb.tch kumofs2$ kumo-server -v -l kumofs2 -m kumofs -p kumofs2 -s /tmp/kumodb.tch kumofs3$ kumo-server -v -l kumofs3 -m kumofs -p kumofs2 -s /tmp/kumodb.tch
kumo-server の登録
kumofs$ kumoctl kumofs status hash space timestamp: Thu Jan 01 09:00:00 +0900 1970 clock 0 attached node: not attached node: 192.168.123.10:19800 192.168.123.11:19800 192.168.123.12:19800 kumofs$ kumoctl kumofs attach nil
ここでザッとログが流れます.ちょっと楽しい.それにしても nil と表示されるとは,さすが Ruby なのか.
また「hash space timestamp」のところが 1970 年とかになっているのは,Time クラスの基底なので,まだ値が取得できてないってことかな.再度 status を見ると,
kumofs$ kumoctl kumofs status hash space timestamp: Tue Jan 19 11:09:32 +0900 2010 clock 230 attached node: 192.168.11.180:19800 (active) 192.168.11.181:19800 (active) 192.168.11.182:19800 (active) not attached node:
追加されて,時刻も正常になってますね.
kumo-gateway の起動
kumofs$ kumo-gateway -v -m kumofs -p kumofs -t 11211
memcache-client 互換だそうなので,telnet でアクセスしてみます.
kumofs$ telnet localhost 11211 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. set hoge 0 0 3 Foo STORED set bar 0 0 22 This is a sample text. STORED END Connection closed by foreign host. kumofs$ kumohash -m kumofs assigh hoge 0: 192.168.123.10:19800 1: 192.168.123.11:19800 2: 192.168.123.12:19800
kumohash の説明には,「あるデータがどのkumo-serverに保存されているか調べる」とあったのですが,全部出てきてしまいます.3台ぐらいじゃダメ分散されない?またはキーの数が少ない?
大量のデータ投入
なんかこんなので実験
#!/usr/bin/env ruby 1000000.times do |i| str = "" (rand(100)+1).times do |j| str += (65 + rand(26)).chr end puts "set var#{i} 0 0 #{str.length}" puts str end
kumofs$ ruby test.rb | telnet localhost 11211 (snip) STORED STORED STORED STORED test.rb:8:in `write': Broken pipe (Errno::EPIPE) from test.rb:8:in `puts' from test.rb:8 from test.rb:3:in `times' from test.rb:3
止まったので何が?と思って kumo-gateway の方を見ると
セグメンテーション違反です
telnet なので何かしらのバッファがあふれたとかでしょうか.よくわかりませんでした.
thin の自動起動スクリプト on Debian
サーバを再起動したときに,いちいち mongrel/thin を立ち上げないといけないのがどうもなーと思っていたので,さっと書いてみました.
まずは下記ファイルを /etc/init.d/webapp とかに保存します.
#!/usr/bin/env bash ### BEGIN INIT INFO # Provides: webapp # Required-Start: $local_fs $remote_fs $network $syslog # Required-Stop: $local_fs $remote_fs $network $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start/stop thin application server ### END INIT INFO PATH=$PATH:/opt/ruby-enterprise/bin BASEDIR=/var/repos/webapp CURRENT_NAME=$BASEDIR/current THIN_CONFIG=$BASEDIR/shared/config/thin.yml case $1 in start) thin -c $CURRENT_NAME -C $THIN_CONFIG start ;; stop) thin -c $CURRENT_NAME -C $THIN_CONFIG stop ;; restart) thin -c $CURRENT_NAME -C $THIN_CONFIG stop thin -c $CURRENT_NAME -C $THIN_CONFIG start ;; *) echo "Usage: webapp (start|stop|restart)" ;; esac
そしておもむろに
$ sudo chmod a+x /etc/init.d/webapp $ sudo update-rc.d webapp start 95 2 3 4 5 . stop 20 0 1 6 . $ sudo invoke-rc.d webapp start Starting server on 0.0.0.0:4000 ...
と入力すると自動的に thin が起動します.mongrel や他のサーバを使う場合は適宜書き換えてみてください.
「Passenger 使えばいいじゃん」と言われそうですが,Passenger は Apache/Nginx とか入れないとダメだし,「gateway -> App server」みたいな構成だと thin だけにしたいというのもあるのです.まあ趣味の問題ですが.
浅草jpmobile会議01
- 永和で開催
- M17N についてあれこれするという話です
- そういえば名刺とか持ってくるの忘れたな
- 足元の悪い中25名のほどの参加
"なりたいアタシ"と"イマのアタシ"
- 設楽さん@えにしテック
- 現在と未来について
そもそもの企て
- RubyConf の時
- Ruby の m17n でケータイ絵文字を扱えるようにするヒントを nurse さんからいただこうよと言うのが今回の発端
- My Goal
- いま
- 未来
- この場
- 悩み事マップ
- プロジェクト
- テスト
- 絵文字
- フルスタックすぎ
- 細かい事
- イマのアタシ
- エンコーディング
- いろいろありすぎ
- フルスタック過ぎる
- なりたいアタシ
- スマートフォンの対応
- Jpmobile::Mobile のクラス階層
- 機能の上書きには便利
- 動作としてはいいのだが,クラス継承がちょっと
- 機能の上書きには便利
- テンプレート切り替え
- テスト
- テーブル
- ハードコードされている
- アップデートスクリプトがバラバラ
- テーブルを差し替えられるようにする機構を入れるとか
- この場で出来ること
- 要らない機能が実は結構ある?
- Issues を整理したい
- Collaboators 募集
- 分割するとしてそのレイアウトを議論したい
- ドキュメントの整理
- tag 切ってもいい?
- 気になるバグ
絵文字まわり
いらない機能の整理
- GeoKit とか
- docomo のディスプレイ情報とか
- GetText の日本語指定とか
Issues
- @counter はなくてもいい
- いろいろ潰した #asakusarb
テストとか
- Rails のバージョンにあわせたテストする方法
- Cucumber を使う?
2009年のふりかえりと2010年を迎えて
2009年は割と激動の年だった気がします.仕事,プライベート含めて.ちょっとまとめてみます.
まずはふりかえり
世の中の狭さを実感した去年の末
一昨年のことなんですが,やっぱもっとオープンソースに貢献できる環境がいいのかなぁと,急に思ったりなどとつぶやいて見たら,「オープンソースへの貢献」って? | 日経 xTECH(クロステック)なんて記事の発端になったようで凄い焦りました.世の中狭いんだなーとか.貢献と言ってもいろいろあるというのを考えさせられました.
仕事への関わり方を再認識
ある人との話で,「自分にはもっとできることがあるはず」と気付いたので,心新たに仕事に打ち込むことに.むしろ自分から環境を変えないと何事も打開しないんだなと感じたのでした.
オープンソースへの貢献
jpmobile のコミッターになって,jpmobile 会議開催したりもしました.もともとは Tokyu.rb に来ていた @walf443 さんといろいろ話すようになって,「jpmobile のコミッターになるべきだ」とか言われてたんですが,「そうなると良いなー」とは思っていたものの,もう一つ進展しませんでした.
そうこうするうちに仕事で使うような状況になり,Rails 2.3 対応版が出てこないので「ここは俺がやらないと」的に github を fork していろいろやってました.まあだいたい完成かなーと思ってたら本体が対応・・・・したと思いきや,ちゃんと動かない様子.どうしようか考えてたらメーリングリストとかでいろいろあってコミッターになりました.先行していろいろやっとくもんだなーとか思ったりもして,ブランチで開発していると Ruby会議で @darashi さんが来ると言うことで,急遽 jpmobile 会議やろうと思い立ちました.twitter でいろいろつぶやいてみたら懇親会でとりあえず集まろうとなりました.言ってみるもんだなーと.
そして会議.「Rails 2.3対応どうしましょうか.あれでいいですかね.」と聞いてみると,すでにそのブランチを使っていると言う話に.じゃあもうマージしますね,と言うことでとうとう jpmobile の人となりました.意味不明ですがそんな感じです.
Ruby 会議2009に参加
コミュニティアピールでは漫才の難しさを再認識しました.まあそれだけではないのですが,まだまだ見知らぬ人が多かったので,あまりいろんな人とは話できなかったのが心残り.2010 はもっと積極的に行きたい.
TokyuRuby 会議の開催
Tokyu.rb は当初は飲み会メインとか肉メインじゃありませんでした.いや,ホントに.でもいつの間にか「Rubyist 達の憩いの場」として認知されてきたのですが,そろそろ LT 大会とかやりたいねー,と言うことで TokyuRuby 会議をやろうぜーと.ただ名前的に問題になったりして紆余曲折がいろいろとありました.有名な人に補足されるといろいろ大変だなーとか.
で,当日は司会進行をさせていただきました.酒入った連中を誘導するのは楽しかったですね.こういう経験はあんまりできないので,次回も是非やってみたいです.
筆頭エア社員に
なんかそういうことになりました.まあ reply すぐ返すとか社員よりも会う機会が多いとかそういうところだと思うのですが.エアが取れる日が来るかどうかは未定です.こちらで取りたくても向こうでは取ってくれない可能性の方が大きい気もしますが.
Keep
- この調子で頑張りたい.いつも通りとも言うけど.
- jpmobile 頑張ります><
- 筆頭は守りたい.エア的な意味で.
Problem
- マイレージはホントに大事に使わないとダメだと再認識しました.
- 節約します.飲み会的に.
- あまりコードを書けてない.
- 今年は手を動かすこと重視にしたいなー.
Try (2010年の目標)
まとめ
昨年は密度の高い年でした.ただ飲み会密度が高すぎたような気がするので,もう少し別方向に割り振りたいと思ってます.