xrea は互換性のためなのか ruby のバージョンもあがらないままのようなので、移行先候補としてはてなダイアリーとかも試していましたが、結局メインは ZnZ Blog に移行しました。
]]>リーダブルコード読書会 #1 に参加したときのメモです。
参加者 (敬称略): cuzic, いっぺー, kmdsbng, nayutaya (yuya), znz, muryoimpl
14:00 まで p.28 まで
(libapache2-mod-rpaf 0.6-2 で確認。)
rpaf.conf の「<IfModule mod_rpaf.c>」を「<IfModule mod_rpaf-2.0.c>」か「<IfModule rpaf_module>」に直す。(Debian での修正の rpaf_module の方がおすすめ)
概要: Ubuntu 12.04 で apache2 のプロセス名が /usr/sbin/apach に変わっていて、原因は mod_perl で、起動方法で回避したという話。
Ubuntu 12.04 で Zabbix を使って「proc.num[apache2]」(apache2 のプロセス数) を監視してみたら、 redmine 関係のものを移行してきたところで、なぜか 0 になってしまった。
調べてみると pstree での表示や pgrep での検索対象になっている部分のプログラム名「/usr/sbin/apach」に変わっていた。それは /proc 以下だと /proc/$PID/stat で確認できる文字列らしいということまではわかった。
次に原因を絞り込むために a2dismod で順番に外して試してみると mod_perl が原因だった。
libapache2-mod-perl2-2.0.5 の src/modules/perl/mod_perl.c には
/* We need to reset $0 to argv[0] (httpd) since perl_parse() will * have set it to '-e'. Being magic-aware ensures that some * OS-specific magic will happen (i.e. setproctitle() on *BSDs) */
と書いてあった。
argv0 を短い名前に設定すれば良いということで、別のプログラムの起動で runit を使っていたので、 chpst -b argv0 を使うことにした。
起動部分の実体は /usr/sbin/apache2ctl ということは調べていたので、そこに反映させるために /etc/apache2/envvars に「APACHE_HTTPD="/usr/bin/chpst -b apache2 /usr/sbin/apache2"」という設定を追加してみたところ、 /etc/init.d/apache2 の方で「/etc/init.d/apache2: 55: [: /usr/bin/chpst: unexpected operator」というエラーが出ていたので、最終的には以下のように apache2ctl のときだけ設定するようにして解決した。
# set apache2 to argv0 because mod_perl resets argv0. # (default argv0 is /usr/sbin/apache2) # and /etc/init.d/apache2 checks [ -x $APACHE_HTTPD ] then # set only in apache2ctl. case "$0" in *apache2ctl) APACHE_HTTPD="/usr/bin/chpst -b apache2 /usr/sbin/apache2" ;; esac]]>
[001391]さくらのVPSで「Ubuntu」を利用していますが、回線速度が遅くアクセスに時間がかかります。 に書いてあるような問題があるので、 sudo apt-get install ethtool などで ethtool パッケージをインストールして、 /etc/network/interfaces に「offload-tso off」と書いておくと良いでしょう。
/etc/network/interfaces の設定例としては以下のようになります。 (さくらの6rd(トライアル) の設定も含んでいます。)
# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo iface lo inet loopback # The primary network interface auto eth0 iface eth0 inet static address 49.212.131.XXX netmask 255.255.254.0 network 49.212.130.0 broadcast 49.212.131.255 gateway 49.212.130.1 # dns-* options are implemented by the resolvconf package, if installed dns-nameservers 210.224.163.4 210.224.163.3 dns-search example.jp # ethtool offload-tso off auto tun6rd iface tun6rd inet6 v4tunnel address 2001:e41:31d4:83XX::1 netmask 32 local 49.212.131.XXX endpoint any gateway ::61.211.224.125 ttl 64 up ip tunnel 6rd dev tun6rd 6rd-prefix 2001:e41::/32 up ip link set mtu 1280 dev tun6rd
この設定の意味の詳細について知りたい場合は /etc/network/if-up.d/ethtool や man interfaces を見てください。
]]>Precise がリリースされたということで、ベータの頃に試した、さくらのVPSに Ubuntu 12.04 LTS をクリーンインストールする方法を公開しておきます。他の OS でも netboot のインストーラーを用意している OS なら、似たような感じでインストール出来ると思います。
Ubuntu の Server 版とか Debian とかをインストールしたことがある程度の知識を前提としています。
インストールは「VPSコントロールパネル」の「リモートコンソール画面」を使うことを想定しています。「VNCコンソール」を使うなら、シリアルコンソールの設定を忘れた場合でも再インストールからやり直す必要はないかもしれません。(試していないので確認していません。)
まず初期状態の CentOS になっていると仮定します。 失敗したときは再インストールで初期化してここからやり直しです。
最初に現在のホスト名と /etc/resolv.conf で設定されている DNS サーバーの IP アドレスと /etc/sysconfig/network-scripts/ifcfg-eth0 で設定されている IP アドレスとネットマスクとデフォルトゲートウェイをメモしておきます。
次に http://archive.ubuntu.com/ubuntu/dists/precise/main/installer-amd64/current/images/netboot/ubuntu-installer/amd64/ から /boot に linux と initrd.gz をダウンロードします。
/boot/grub/grub.conf を以下の内容で置き換えます。 grub とインストーラーの linux カーネルでシリアルコンソールを使う設定が必須です。 忘れてしまって画面が見えなくなった場合は CentOS の再インストールからやり直しです。
default=0 timeout=5 serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1 terminal --timeout=10 serial console title ubuntu-installer root (hd0,0) kernel /linux console=tty0 console=ttyS0,115200n8r initrd /initrd.gz
もしくは grub.conf はそのままで grub のメニューから c でコマンドラインに入って、
root (hd0,0) kernel /linux console=tty0 console=ttyS0,115200n8r initrd /initrd.gz boot
で起動しても同じことです。
後は Debian-Installer というインストーラーでのインストールになります。 メモしたネットワークの情報などを使って、普通にインストールするだけです。 インストーラーに必要なカーネルイメージなどはすでにメモリ上に読み込まれているので、パーティションはばっさり消してきり直しでかまいません。 Debian-Installer では「戻る」を使うと expert モードに切り替わります。 そのままインストーラーを終了してしまうとシリアルコンソールが使えない状態なので、途中で一度以上「戻る」を使って expert モードにしておきます。 そして最後に「Finish」でインストーラーを終わる前にシェルを開きます。
インストーラーの中から開いたシェルでは /target にインストール後の / がマウントされています。 そこで /target/boot/grub/grub.cfg の linux 行のオプションに console=tty0 console=ttyS0,115200n8r を追加しておきます。 (正しい手順としては /target/etc/default/grub に追加して chroot /target /usr/sbin/update-grub ですが試していません。)
grub でシリアルコンソールを使う設定が出来たら、シェルを抜けてインストーラーの Finish を選んで再起動します。
再起動してシリアルコンソールの設定に失敗して見えなくなってしまったら、 CentOS の再インストールからやり直しです。 失敗しても grub のコマンドラインに入れたなら、再起動せずにそこでシリアルコンソールを使う設定で起動するという手もあります。
再起動して無事起動出来たら sudoedit /etc/default/grub で GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8r" という設定にして、 sudo update-grub で反映させます。 そして再起動して確認しておきます。
問題なくシリアルコンソールが繋がっていれば後は普通に Linux として使えます。 お疲れ様でした。
]]>nadoka の開発用レポジトリを rubyforge の svn から github の organization に移行しました。
まず organization account 用のメールアドレスを用意してから、 https://github.com/blog/674-introducing-organizations の下の方の「Create a new organization now!」から作成しました。
https://github.com/organizations/new で Organization Name は nadoka で Organization Email に先程作成しておいたメールアドレスを入れて Choose the organization’s plan は Open Source ($0/month) にしました。
次に svn から git への変換をしました。 http://progit.org/book/ja/ch8-2.html を参考にしました。
すでに git-svn を使っていたので、コミットしたメンバーを調べてみると 3 名でした。
% git shortlog -sn 163 ko1 76 znz 3 naruse 1 (no author)
次に試行錯誤しやすいようにローカルに svnsync でミラーしました。 以下のシェルスクリプトを2回実行してミラーしました。
% cat svnsync-nadoka-repos-mirror.sh #!/bin/sh set -ex cd $(dirname $0) DIR=$(pwd) REPODIR=$DIR/nadoka-repos-mirror if [ -d "$REPODIR" ]; then svnsync synchronize "file://$REPODIR" else svnadmin create "$REPODIR" echo '#!/bin/sh' >"$REPODIR/hooks/pre-revprop-change" echo 'exit 0' >>"$REPODIR/hooks/pre-revprop-change" chmod +x "$REPODIR/hooks/pre-revprop-change" svnsync init "file://$REPODIR" svn+ssh://rubyforge.org/var/svn/nadoka fi
最初に no author は放置して変換できないか試してみました。
% cat nadoka.svn.authors ko1 = ko1 <ko1@atdot.net> znz = Kazuhiro NISHIYAMA <zn@mbf.nifty.com> naruse = NARUSE, Yui <naruse@airemix.jp> % git svn --authors-file=nadoka.svn.authors clone file://$REPODIR nadoka-git-svn
「Author: (no author) not defined in nadoka.svn.authors file」で止まってしまいました。 no author はコミットされた時期から考えて ko1 に割り当てれば良いとわかったので、そうしました。 「-s」も忘れていたので付け足しました。 Pro Git を参考にして「--no-metadata」も付け足して、変換後のタグやブランチの移動などもしました。
% cat nadoka.svn.authors ko1 = ko1 <ko1@atdot.net> znz = Kazuhiro NISHIYAMA <zn@mbf.nifty.com> naruse = NARUSE, Yui <naruse@airemix.jp> (no author) = ko1 <ko1@atdot.net> % git svn clone --authors-file=nadoka.svn.authors --no-metadata -s file://$REPODIR nadoka-git-svn % cd nadoka-git-svn % cp -vRf .git/refs/remotes/tags/* .git/refs/tags/ % rm -Rf .git/refs/remotes/tags % cp -vRf .git/refs/remotes/* .git/refs/heads/ % rm -Rf .git/refs/remotes
この状態で git log や git tag などを見て問題がなさそうなのを確認しました。
次に github のレポジトリを作成しました。 https://github.com/organizations/nadoka/repositories/new で Project Name は nadoka にして Description と Homepage URL は rubyforge を参考にして設定しました。
リモートレポジトリができたところで最初の push をしました。
master ブランチと同じ内容の trunk ブランチが出来てしまっていましたが、 git では不要と考えて master と同じなのを確認して削除しました。
push が出来るメンバーを設定するために Developers team を作成して member と repo を追加しました。
2011-10-29 追記: タグが push できていなかったので「git push --tags」もしました。
]]>日記のタイトルに<script>alert(document.cookie)</script>が含まれると? という話ですが、どっちにしても元でエスケープしていたものがエスケープ解除されているのはバグと言える気がします。
追記: Google Reader で確認したら読めました。
]]>32 ビットの Debian lenny の環境から 64 ビットの Debian squeeze の環境への移行した。
事前に調べた感じでは gdbm ファイルの互換性がないらしく、そのままコピーではダメそうだったので、一度 raw.gdbm の中身をファイルに出力して、それを bin/entry --ml=mlname で取り込み直すという方法で移行することにした。
ファイルにダンプするのは簡単に書いた以下のスクリプトを使った。 最初は exit のところを有効にして 1 ファイルでちゃんと出力されるかを確認してから全体を出力した。
% cat w3ml-dump-raw.rb require 'gdbm' GDBM.open('raw.gdbm', 0644, GDBM::READER) do |r_dbm| r_dbm.each_pair do |key, value| filename = "%05d.eml" % key open(filename, "wb") do |f| f.write Marshal.load(value) end #exit end end]]>
今回は事前に gihyo.jp の連載 の連載を見たり、LL Blog をチェックしていたので、チケットを忘れていないか何度もしっかりチェックしたり、会場ではテザリングは自重したりした。
早めに会場に到着したので、少し待っていたら10時になって入場できた。
今回の再入場の目印は節電などの影響を考慮して、うちわということだったが、ちょうど数日前の雨以降気温が下がっていて、あまり必要ではなくなっていたので、微妙な感じになってしまっていた。
メタプログラミングの話は、各言語によってメタプログラミングと言える部分が違っていて、認識の共有が難しそうな感じだった。 でも、共通して言えそうなことは、普通のプログラム中では使うべきではなくて、 Rails のようなライブラリの実装に必要なときだけ使うべきという感じに思えた。
昼休みは一般参加者に知りあいがいなさそうだったので、軽くすませて本を見たりしていた。 昼休み以外の休み時間も含めて、わりと暇だったが、スタッフには知りあいがいたので、ちょっと話をしたり本を見たりしていた。
基調講演はいろいろとおもしろかった。
Node.js とかイベント駆動型プログラミングについてはあまり扱ったことがなかったので、おもしろかった。
JavaScript八面六臂については、JavaScript ばっかりでどれがどのプログラムの話だったかよくわからなくなってしまった。
IPv6 ハッカソンは PHP の filter_var とか IPv6 の Any-IP とかいくつか気になるものがあったので、後で調べておこうと思った。
LT については、最初の発表のゲームが気になったけど、会場だとバッテリー切れが気になるので、帰ってからまたやってみようと思った。 新しい言語を作ったとか、高速化とかの話はおもしろいと思うけど、そんなには興味がないので、まあそれなりだった。
最後の抽選では、確率が高かったこともあって、ボールは拾えて、実践 DNS の本が当たった。 気にはなっていたけど、他の本を読んでいたら読む暇がないかなと思ってまだ買っていない本だったので、非常に良かった。
毎回恒例のエンディングのビデオを流し始めたタイミングで無線 LAN のアクセスポイントが撤去されてしまったらしく、ネットワークが切れてしまったので、本を貰って帰った。
]]>最初は自分の発表ということで、大ホールにいた。 発表資料は http://www.n-z.jp/presen/RubyKaigi2011/ に置いている。 テキストは発表前から置いていて、 RD ファイルの方が rabbit 用で org ファイルの方はしゃべる予定の内容のメモを書いておいていた。 ( 2011-07-22 追記: slideshare にもアップロードした。 )
準備をそれなりにしっかりしておいたので、だいたい予定通りに出来た。
終わりの部分はどうするのか悩んでいたけど、司会がいるような場の場合はいったん終了して司会が質疑応答に入るようにしてもらった方が良くて、小さい勉強会のようなところだと自分で質疑応答に入るようにした方が良さそうに思った。
発表で内容が完結しているようなものだと質疑応答で質問が出にくいようなので、質問が出やすいようなすきのようなものがある方が良いのかもしれないとも思った。
sekiさんの発表も気になったけど、途中で移動もしにくいので、次の jpmobile の話を聞いていた。 jpmobile は自分専用のメモアプリで一部機能だけ使っていたが、いろいろな機種などに対応するのは大変そうだなあと思った。
午前中はそのままずっと大ホールにいた。
スピーカーは発表がある日の弁当を貰えるということだったので、弁当を貰ってどこで食べようと思っていたら、sekiさんに会ったのでそのまま3階に一緒に移動して、そこで弁当を食べた。 そしてそのまま ゆRuby に参加していたら Lunch の時間が終わってしまって Rails3 レシピブックが買えなかったので、後で買った。
午後は小ホールの発表がある間はずっと小ホールにいた。
LT からは大ホールに移動して、懇親会にも参加した。 LT や闇 RubyKaigi はその場で感想を書いておかないと、多すぎて後から思い出すのは難しいと思った。
懇親会では nagachika さんなど初めて話をできた人もいて良かった。
]]>他の人の感想などを見て思い出してきたので追記。
sora_h さんの声変わりは以前に何かの ustream 中継を見ていたときに思ったので、今回は変わってないなあと思った。 見た目もちょっと大人っぽくなってるかなと思っていたけど、そんなことはなかった。 あの発表は資料が少なかったのならあきらめて、もう一度始めからとか言わずに、質疑応答の時間たっぷりで良かったんじゃないかと思った。
yhara さんの言っていた他人の作ったもので発表しても良いっていうのは、昔 (ささださんの作った) nadoka さんで発表したのを思い出した。
shugo さんの発表にあった問題は irb でカンニングしてしまったために不正解扱いにした。2問目の方はひっかかったことがあって覚えていたので、簡単にわかったのに。
takaokouji さんの発表の絵のことについて質疑応答のところで質問してみようかと思ったら時間がなくて無理だったので、後できいた。
shelter とかあのあたりの機能は、現状の module が名前空間と実装の include や extend の機能を兼ねていて複雑なのがさらに複雑になるので、なかなか入らないか、入ってもなかなか使われない気がする。
kosaki さんの発表は非常にわかりやすくて良かった。 NUMA と呼ばれる環境があるのは知っていたけど、どういう問題があるのかとか知らなかったので、勉強になった。 (2011-07-21 追記: Ruby でおきていた問題自体は NUMA は関係なくてマルチコアだかららしい)
]]>最終日は小ホールには行かずにずっと大ホールにいた。
るりまの質疑応答で /ja/man/html/ をリダイレクトにするということが決まったので、たまたま隣に座っていた shugo さんに apache2 の設定を変更してもらってリダイレクトされるようになった。 ついでに ruby-dev の方で話が出ていた http://www.ruby-lang.org/bugreport.html も経緯を説明して、リダイレクトに変更してもらった。
経緯としては以下の通り。
非常におもしろかった。 紅い巨塔は夜中に IRC でそんな準備をしていたとは知らなかったので、新鮮に楽しめた。 画面が出ないトラブルが多かったけど、そういうときになにか良い対策はあるんだろうか。複数人で参加とかだと一人が作業している間に自己紹介とかしておくという手があるのかもしれない。
]]>開場前にプロジェクターの接続チェックが出来るかと思って早めに行ってみたけど、そんなことはなく、普通に開場まで待っていた。
昼はコミッターには弁当が用意されているということだったので、大勢のコミッターで一緒に弁当を食べて、午後の最初のセッションの打ち合わせをちょっとした後、他の話をしていた。
そのときに 1.9.3 の変更点の話に "lazy-sweep" GC を入れた方が良いんじゃないかという話があったのに、話の中で出てこなかったのを質問タイムに思い出したので、言おうと思ったら、既に壇上で議論をするだけの時間になってしまっていて、割り込めなくてちょっと残念な思いをした。
その後はずっと小ホールにいて、発表を聞いていたり明日の準備をしていたりしていた。
]]>