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)

Feynman Lectures On Physics (3 Volume Set)

量子力学と経路積分

量子力学と経路積分

  • Quantum Computation and Quantum Information

Quantum Computation and Quantum Information (Cambridge Series on Information and the Natural Sciences)

Quantum Computation and Quantum Information (Cambridge Series on Information and the Natural Sciences)

と言うのをやってみたいって人はいるかな?いれば一緒に勉強しましょうという感じですが.

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

まずは RubyC++ など.

$ 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 なので何かしらのバッファがあふれたとかでしょうか.よくわかりませんでした.

まとめ

コマンドが Ruby で書かれていたりするのでわかりやすいのと,初めから分散前提なのが良い感じですね.ただセットアップはともかく,起動に手続きが必要だと言うのが,実稼働するときの大きな障壁かなと思いました.全て個別に起動できて,それぞれが kumo-server / kumo-manager / kumo-gateway の起動を関知して自動的に接続するようになれば,より使い勝手が増す感じがしました*1

*1:まあ仮想環境だとしたらスクリプトでその順序も制御できそうなのですが.

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
    • いま
    • 未来
    • この場
  • 悩み事マップ
    • プロジェクト
    • テスト
    • 絵文字
    • フルスタックすぎ
    • 細かい事
  • イマのアタシ
    • Ruby 1.9 で動かない
    • 文字コード変換自体は汎用のハズ
    • メール処理でも使いたい
    • フィルタのコードが汚い
      • nkf を使うために必死
      • バグも [gh-17]
    • せっかくなので 1.9 で
      • キレイになりたい
  • エンコーディング
    • いろいろありすぎ
  • フルスタック過ぎる
    • Rails が上がると動かなくなる
    • Rails に依存しすぎている
    • 壊れる部分
      • テンプレート切り替え
      • セッション
      • など
  • なりたいアタシ
  • スマートフォンの対応
    • 時々要望が上がって議論されるのだが
      • キャリアと直行する
      • 使用や命名が悩ましい
    • emobile は作った
      • User-Agent に規則性がないので,テーブルが汚い
    • もしかして,テンプレート切り替えたいだけ?
  • Jpmobile::Mobile のクラス階層
    • 機能の上書きには便利
      • 動作としてはいいのだが,クラス継承がちょっと
  • テンプレート切り替え
    • ファイル目の命名規則がよくない
      • かなり無理してパッチを当てている
    • Rails と仲が悪い
    • 分離した方が良い?
  • テスト
  • テーブル
    • ハードコードされている
    • アップデートスクリプトがバラバラ
      • テーブルを差し替えられるようにする機構を入れるとか
  • この場で出来ること
    • 要らない機能が実は結構ある?
    • Issues を整理したい
    • Collaboators 募集
    • 分割するとしてそのレイアウトを議論したい
    • ドキュメントの整理
    • tag 切ってもいい?
    • 気になるバグ
絵文字まわり
  • Ruby 1.9unicode の絵文字を入れる?
    • Unicode も絵文字を Ruby 側で対応して,それに変換する
    • NKFsoftbank 絵文字(webcode)は unicode に変換されるらしい
    • テーブルで実装した方が楽
    • CP932 -> euc-jp -> JIS もどき -> jis にすればいいらしいが
      • enc/trans/ 以下に変換テーブルを作ってやればいいんじゃないか
    • 変換はあんまり早くない.むしろ gsub 使った方がいいんじゃという話も
いらない機能の整理
  • GeoKit とか
  • docomo のディスプレイ情報とか
  • GetText の日本語指定とか
Issues
  • @counter はなくてもいい
  • いろいろ潰した #asakusarb
テストとか
  • Rails のバージョンにあわせたテストする方法
  • Cucumber を使う?
まとめ
  • ust と資料を見ましょう
  • オープンソースで collaboators を集うときは Asakusa.rb で会議開けばいいんじゃないかと思った.
  • 次は Tokyu.rb で開催ですね!

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 すぐ返すとか社員よりも会う機会が多いとかそういうところだと思うのですが.エアが取れる日が来るかどうかは未定です.こちらで取りたくても向こうでは取ってくれない可能性の方が大きい気もしますが.

札幌 Ruby 会議02に参加

なんか流れ的に参加しなくては!という気分になったというのもあり,いろいろ頑張って行ってきました.jpmobile 会議02 が開催できたりとか,札幌の方々と交流が持てたり,あと各地の地域 Ruby 会議の方々ともお話しできたのが大きな成果でしょうか.

Keep

  • この調子で頑張りたい.いつも通りとも言うけど.
  • jpmobile 頑張ります><
  • 筆頭は守りたい.エア的な意味で.

Problem

  • マイレージはホントに大事に使わないとダメだと再認識しました.
    • 節約します.飲み会的に.
  • あまりコードを書けてない.
    • 今年は手を動かすこと重視にしたいなー.

Try (2010年の目標)

  • もっと執筆活動したいなー
    • 雑誌に書くとか本書くとか
  • オレオレサービスを早く本格化
    • いまは地味にやってます
  • 関西凱旋とかしてみたいなー
    • 誰も知らないだろうけど・・・・
  • 自宅鯖で tdiary に移行する
    • ML115 の静穏化に着手中

まとめ

昨年は密度の高い年でした.ただ飲み会密度が高すぎたような気がするので,もう少し別方向に割り振りたいと思ってます.