zt日記

書いているのは Kazuhiro NISHIYAMA a.k.a. ZnZです。
2001|09|10|11|12|
2002|01|02|03|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|
2012|04|05|06|09|
2013|09|

この日記にはツッコミを入れられます。 ツッコミを入れたい日付をクリックすると、フォームが現れます。

xreaでtDiaryを使う方法はxrea.com で tDiary を使う方法インストールメモXREA + tDiary + Namazuをどうぞ。


2013年09月11日(Wed)

メインは octopress に移行しました

xrea は互換性のためなのか ruby のバージョンもあがらないままのようなので、移行先候補としてはてなダイアリーとかも試していましたが、結局メインは ZnZ Blog に移行しました。


2012年09月29日(Sat)

リーダブルコード読書会 #1

リーダブルコード読書会 #1 に参加したときのメモです。

参加者 (敬称略): cuzic, いっぺー, kmdsbng, nayutaya (yuya), znz, muryoimpl

2章まで

14:00 まで p.28 まで

  • (p.24 話にはださなかったけど Vi ではなく Vim のみの機能に見える)
  • p.25 定数の頭に付けている k とは?
  • ハンガリアン記法, WORD の話から 64ビットデータモデル の話に
  • p.25 member_
    • 見分けたいか?
    • this. を付ける話
      • IDE での補完候補が絞れる
    • 全部 return を付ける話 (yuya)
      • 返値を使ってほしくないときは return を書かない
    • self.writer = の self. の話
  • namespace の話
    • C++ の namespace はあまり使ったことがない話
    • rails での名前の衝突の話
      • request, response というモデル名ではまった。
    • 継承関係を考慮したインスタンス変数名の話
      • C++ の private に相当するものが ruby にはないとか
  • return の話
    • return の次の行に間違えて処理を入れてしまわないため
    • JavaScript など return 必須の言語が多いからそっちにあわせている?
  • JavaScript では $ は普通の文字 (変数名などに使える文字の意味)
    • jQuery(function($){...}) の $ の話
    • undefined が代入出来てしまう話
    • (function(){})() の返値は何?

3章,4章

  • Python はメソッド名が大文字始まりも普通なの? (詳しい人がいないので不明)
  • Ruby だと大文字で始まるメソッドは呼び出し方法に制限がある
  • C++ だと標準は全部小文字なのにユーザー定義は大文字始まりを使うことが多い
  • C++ で実体がマクロだとはまることがある話
  • C++ の template が難しい話
    • auto で型推論してくれる話
  • Java だと get は軽量なアクセサを期待する
    • Beans がそうだった。
  • C# の property が Java にも欲しい
    • 破壊的な property の get があってデバッガで見ようとしたら驚いた話 (yuya)
  • インデクサの話
    • Ruby だと Array#[]
    • C++ だと複数引数だと operator()() を使うことが多い (cuzic)
      • ファンクタ、関数オブジェクト
    • 関数が左辺値になれる
      • matrix(m,2)=... とか書ける
    • デリファレンスを繰り返す (a[m][n]...) のが遅いのが嫌なのでネストはしたくない (cuzic)
  • (14:41 p.47 Check は単語としていいの?)
  • 「{」の位置の話
    • 行頭 (yuya)
    • CRuby だと関数定義は行頭で if などは行末
  • 仮引数もすべて final (yuya)
    • すべて final の言語?
    • scala は val と var
    • 1文字しか違わない
    • 関数型言語?
    • immutable を手軽に書きたい
    • mutable だけ明示的に書きたい
  • 4.6 はオススメ
  • 4.7 のコメントは不要なのでは。 (kmdsbng)
    • 処理の粒度がそろっていないからコメントが必要になるのでは。
    • 不適切な粒度でメソッドの抽出をすると逆に読みにくくなるのでは。
    • contact_emails はメソッドの最後まで必要ないので suggested_friends を返すメソッドがあれば良いのでは (cuzic)
  • 変数の寿命は何かうまく可視化したりリファクタリングに使えないか
  • 単語の組み合わせで候補表示できないか
    • take a photo の take は使用頻度が高いので別の単語を提案するとか
      • Google の n-gram?
      • twitter で流れていたプログラマー用辞書の話
  • 手軽なメモの話
    • Google notebook?
    • evernote?
    • 自分にメールするとか
    • todo list
      • 日記の末尾に書いてある
    • iCloud のメモ、リマインダー
    • 一時的な共有はメールの草稿とか
    • push し忘れるとまずいものは svn にしている
    • 一時的なメモはホームディレクトリ直下において積極的に整理

5章,6章

  • p.68 括弧書きで「塊を関数に分割できるならそうしよう。」と書いてある。
    • 塊の粒度が難しい
  • カツカレーの話
    • ピーマンの肉詰めの話
    • 懇親会はココイチ?
  • sprk2012 で永和のコードレビューでリーダブルコードのページ番号で示されるときいた話
  • ネタ
    • 女子高生が Code Complete を読んだら
    • 日経 Linux ? 女子大生が Linux を勉強?
    • 美人 Unix コマンドとか美人単語とか
  • 良い名前が難しい
    • サンプル集があればいいのに
    • 例にあった filter とか
    • 連番になってるクラス名とかひどい
      • 昔の名残? 識別子が6文字までだった頃とか
  • 6.7 (「名前付き引数」コメント) は変数に代入して渡すのでこういうコメントはしたことがないという話
  • (p.78 話には出さなかったが、ナイーブソリューションの意味が分からなくて調べたが、やっぱり意味が分からなかった)

7章

  • (< 小なり, > 大なり)
  • p.84 数直線のように右の方が大きい方が読みやすいと思う話
    • (x > 5) && (x < 10) 派 (yuya)
    • (5 < x) && (x < 10) 派 (その他5人)
  • x を2回書かないといけないのが嫌
    • Python だと 5 < x < 10 とかける
    • Ruby だと Range (5..10) を使う
  • 数学の < > を知る前にプログラミング言語の方を知ったので (yuya)
    • != より先に <> (VB) を知った
  • p.85 ヨーダ記法
    • 良いと思うのに (cuzic)
    • __FILE__ == $0 (znz)
      • $0 == __FILE__ (yuya)
      • 気にしない派 (kmdsbng)
  • 「}」 と else の間の改行を最近は入れるようになった (cuzic)
    • コピペしやすい
    • さっき CRuby はそうだという話があった。
  • Java だと「{」を単独行にする話 (yuya)
  • IDE にあわせるので C# だとスタイルの揺れがない (IDE が Visual Studio しかないので。 Java だと複数のメジャーな IDE がある)
  • p.94 の早めに return はよくするという話
  • (Ruby で) if や case の返値を代入するのは使うか
    • 使う (cuzic, yuya)
    • 思考が止まるので、メソッドに必ず切り出す (kmdsbng)
    • インデントに悩む (のであまり使わない) (znz)
  • do-while を使うか
    • ほぼ使わない
    • p.90 の例は p.91 の1行目にあるように do-while にはバグがある (ので do-while の使用例としては適切ではない)
  • Ruby だと each 系を使うので while 自体あまり使わない
  • begin...end while(false) で goto 代わりの話
  • C言語だとマクロで do{...}while(0) を使う
  • 7.5 「アホくさ。」 = "This is nonsense." の訳
  • return 1個だけという話があるのはなぜか
    • 70s-80s に入り口と出口を1つにするというのがあった。
    • 今の関数のようなものがなくて入り口も出口もバラバラな時代があった(らしい)。 (cuzic)
    • 今は気にしなくて良いのでは。
  • (p.97 話には出さなかったけど、三項演算子 (: ?) って (? :) ?)

2012年06月12日(Tue)

[ubuntu] Ubuntu 12.04 で mod_rpaf を使う方法

(libapache2-mod-rpaf 0.6-2 で確認。)

rpaf.conf の「<IfModule mod_rpaf.c>」を「<IfModule mod_rpaf-2.0.c>」か「<IfModule rpaf_module>」に直す。(Debian での修正の rpaf_module の方がおすすめ)


2012年05月28日(Mon)

apache2 のプロセス名が変わっていた

概要: 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

2012年04月26日(Thu)

さくらのVPSに Ubuntu 12.04 LTS をクリーンインストールする方法

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 として使えます。 お疲れ様でした。

インストール後の設定

[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 を見てください。


copyright © 2001-2014 ZnZ
Key fingerprint = 6E14 2C9C DBD7 874D 8B3C CAA8 9B58 5538 ED7E 1B73