2010年02月26日

『情熱プログラマー —ソフトウェア開発者の幸せな生き方—』



/

でびあんぐるとして共同監訳した書が刊行されました。

本書は、Chad Fowlerの前著『My Job Went to India』(邦訳版も同名)の改訂版です。 前著ではオフショアによる職喪失の危機に対してプログラマはどのように生き残りを図れるかということに重点が置かれていましたが、今回の改訂ではタイトルも改め『Passionate Programmer(情熱プログラマー)』となり、よりポジティブに、プログラマ人生をどうやって充足したものに変えていくかを綴ったエッセイ集となりました。

前著と同じエッセイもいくつかありますが、一新された部分も多くあり、前版を読んだという読者でも十分に楽しめる内容になっていると信じます。今回の邦訳では、角谷さんやレオさんらの素晴しいレビューア陣の助力を得て、前版よりもさらに魅力的な文章へと磨かれています。

本書の内容は基本的にいわゆる"マッチョ"系で、「下を向いてるだけじゃだめだろ! さぁ、やろうぜ!」という、疲れきった心身だとちょっとこたえるくらいのアツさ、まさにカバーの「赤い葡萄畑」(ゴッホ)から感じるような熱気に満ちています。しかしながら、その本質は本書末尾のエッセイのタイトルでもある「楽しもう」ということであり、人生を自分で選択して楽しいものに変えていくためのプラクティスなのです。

本書の主な想定読者はプログラマですが、紹介されるプラクティスの大半は、どんな職業あるいはどんな人にも応用可能でしょう。「自分が一番の下手くそ」だと感じる最良のグループに参加する、心の師匠を持つ、本番の日のために日々練習する、自身の行動を毎日自問する、失敗し学習する、顧客やマネージャを彼らの分野での専門家と考えて学ぶ、昨日より今日はよくなろうと努める、楽しむ、……。すべてをこなそうとしなくても、Chadが勧める行動を1つ2つ始めていくことで、退屈でぼんやりしていた人生が少しずつ明確に見えてくると私は思います。私の行動原理には、『My Job Went to India』『情熱プログラマー』が少なからず影響しています。

タイカレー

24日の補完。鶏肉、椎茸、人参、じゃがいも、ピーマン、ナスで。生レモングラスを収穫したらいい香り。香菜やタケノコを買ってくればよかった。おいしかったけど久々に強めの辛系で胃腸にダメージが…。

とりあえず今日(26日)の補完作業はこれで完了。近年で1、2を争うくらいの多忙ぎみだけど、毎日ちゃんと夕食は作ってたようだ。

肉詰めピーマンのオーブン焼き

23日の補完。ピーマンが大量にあったので、ニンニク、挽肉、玉葱を炒めて詰め、トマトやチーズと一緒にオーブンで焼き上げ。若干単調な味になっちゃったかな。

チキンカツ、一口味噌カツ、自家製豆腐

22日の補完。疲れぎみだったのでカツは出来合いで。出来合いとしてはけっこういい味かな? 豆腐はうまく固まったけど、今度は若干にがりが多すぎたか、苦みがちょっとある。

牛皿、きゅうりのぬか漬け、自家製豆腐

21日の補完。牛丼の具を作ったものの、丼が空いていなかったので皿に盛り、取り分けという形に。豆腐は12%豆乳を使ったものの、にがりが少なかったのかあまり固まってくれず。まぁこれはこれでおいしいんだけど。

豚のコンフィ、春キャベツ

20日の補完。用意しておいたチー油(鳥皮から抽出した油)で作成。塩とローズマリーを揉み込み、胡椒を振って、耐熱容器に入れた油の風呂に投入。100度のオーブンで1時間半ほど。温かいときにはシュラスコみたいな「肉!」という味がする。冷めると焼豚っぽい味に変わっていく。どちらもうまい。春キャベツ半玉を茹でて一緒に。甘くておいしい。

チリコンカルネ風

19日の補完。キドニーの代わりに大豆、肉は挽肉で。タコス用のパウダーソースを使ってピリ辛仕上げにしてある。

ミートソーススパゲッティ

16日の補完。ガッツリ肉、かつセロリや人参もたっぷりで野菜分も。

さばの塩焼き、切干し大根の煮物、きゅうりのぬか漬け

15日の補完。サバフィレがおいしそうだったので購入。身がふっくらしてておいしい。切干し大根は油揚と人参とで甘めの味付けに。

ロースステーキ、アボカドと鶏肉のマヨネーズサラダ

14日の補完。最近はサーロインのほうが多かったのだけど(こっちのほうが安かったりする)、ひさびさにロースで。柔らかくていい感じ。アボカド、キュウリ、茹で鳥、マヨネーズ、辛子、胡椒、オリーブオイルで和えたサラダもおいしい。

ブルスケッタ

11日の補完。ニンニク、アンチョビ、バジル、トマトで。アンチョビをやや多めにして味を濃い目に仕上げた。

カレーライス

10日の補完。鶏モモ肉で作ったはずなのだが、圧力鍋を使ったらビーフシチューのように繊維にほぐれてしまった。でも、鶏肉の味がよく出て、良い味。

鶏肉と唐辛子の黒酢炒め

8日の補完。献立に悩んだらこれという感じで。唐辛子は半分に切って黒くなるまでよく炒め、中華山椒は黒酢と同じくらいのタイミングにする、というのがよいようだ。

サーモンのソテー、トマトとほうれん草のつけあわせ、きゅうりのぬか漬け

7日の補完。脂のよく乗ったサーモン切り身を調達したので、軽く塩胡椒と粉をはたいてフライパンで焼くだけ。うむ、おいしい。

牛肉とキムチの炒め物、韓国風レタスサラダ

6日の補完。キムチがずっと残ってしまっていたので、牛肉やネギ、コチュジャンと一緒に炒めた。ぶはー。レタスは醤油、砂糖、コチュジャン、味醂、白ゴマ、ゴマ油を混ぜてそれっぽい味に。

豚肉と大根のスープ、味噌ダレ、菜の花おひたし

5日の補完。軽く茹でてアクを取った豚バラ、大根、生姜、ネギ、昆布、醤油、味醂、酒で圧力鍋にかけるだけ。細かく切ったネギと味噌をあえたものを付けて食べる。やはり美味。菜の花もほのかな苦みがいい。

酸辣湯麺

4日の補完。最後の乾燥アワビと乾燥ナマコを使い切ることにした。1日戻してみたけどナマコあんまり膨らまないね。具材を細く切ってスープを作り、酢と胡椒をたっぷり入れた丼に麺とスープを注ぐだけ。ダシの集合みたいなもので、すっきりしながらも濃厚な味。

ひつまぶし、ほうれん草の炒め物、きゅうりのぬか漬け

やれやれ。今月はおそろしく忙しくてようやく今日に日記の補完…。 3日の補完。ほうれん草の調理の出来がよかった気がする。うなぎも大きいのを買ってきてたらふく食べた。

2010年02月06日

Debian JP LDAPとGPG署名メールによる自動処理

Debian JP Project で管轄しているサーバのユーザ管理は、LDAPというディレクトリサービスが担っています。 これまでこの保守は鵜飼さんが担当されていて、管理するマシンも鵜飼さんの自宅サーバだったために協業もしにくい状況だったのですが、もともと忙しいところにGoogleに入られてからはますます多忙を極めて手が回らなくなってきていたため、チームによる引き継ぎが必要となっていました。

LDAPの場合はFTPと違ってサービス内容はそれほどおおがかりなものが必要ないことから、仮想化環境に引越そうという話はずっとあったものの、仮想化の親環境の準備で伸び伸びになっていました。しかし、前回のBug Squash Party@Debian勉強会で必要な設定作業を完了して目途が立ったため、移行の手続きをいろいろと進め、一部の作業については自動化できるようにしました。 仮想化環境はG15アソシエーションによるスポンサードです。

LDAPのサーバにはOpenLDAPを使用しています。古いバージョンからの移行の苦労についてはBug Squash Partyの記事に書いたとおりですが、ひとまずこれは移行できました。

LDAPの運用では、LDAPサーバのアカウント情報に直接(あるいはせいぜいキャッシュ程度)アクセスして認証等を行う設計が多いと思われますが、Debian JPの場合はLDAPサーバが単一障害点にならないよう、定期的なアカウント情報伝播を行っています。

具体的にはLDAPサーバdb.debian.or.jp側でアカウント系のファイル(passwd/shadow/group/alias/sshpubkeys)を生成し、これを*.debian.or.jpの各サーバがrsync+sshで取得して使用します。passwd/shadow/groupについてはlibnss-dbを使います。/var/lib/misc内で平文ファイルからBerkeley DBに変換して、nsswitch.confで参照します(「passwd: compat db」のようにする)。aliasについてはnewaliasesを実行するだけですね。sshについてはDebian.orgでは単純に上書きしちゃっているのですが、Debian JPでは鵜飼さんのスクリプトでもうちょっと高度にいじっています。Debian JPの会員はマシンアクセス権限のある正会員と、メール転送のみの賛助会員に分かれており、これはLDAPのフィルタリングで対処します。このあたりはshスクリプト+Makefileで自動化されています。libnss-dbは便利なので、覚えておくとよいでしょう。似た仕組みは私はオフィスネットワークでも流用しています。

LDAP情報の変更については、人手を介するのをできるだけ排除し、ユーザができることはユーザに任せるポリシーを取ることにしました。とはいえ、それなりのユーザ認証は必要です。Debian.org/Debian JPで一番信用のある本人証明といえばGnuPGです。Debian.orgではこれを使って各種の設定をメールベースで行えるようになっているので、Debian JPでも真似てみることにしました。Debian.orgでの処理システムは私もアクセスできない領域にあるので、次に示していくような、私の独自設計です。まぁちゃんと動いてはいるみたいなのでよしとしましょう :-)。

メールベースの前に、とりあえずLDAPサーバにログインしてパスワードを変えるところから始めることにしました。ログインできる時点で認証は済んでいる(というか不正ログインされるようだったらもう「終わってる」のでそこで騒いだところであまり意味がない)ので、単純にldappasswdを動かすだけです。ただ生のldappasswdはDN情報や各種オプションをずらずら書かなければならず面倒すぎる、かといってPAMを使うのもあまり良い思い出がない(サーバが何らかの事情で止まるといろいろ悲しいことになる)、ということでラッパーで包むことにしました。

!/bin/sh
ME=$(whoami)
ldappasswd -x -W -D "uid=${ME},ドメイン" "uid=${ME},ドメイン" -S

単純ですね。Debian JPのアカウントDNはuid名と同じなのでこんな感じで出来上がりです。 これをdebianjp-ldappasswdというコマンドで/usr/local/binに突っ込んでおきました。 ldappasswdの問題としてはpasswdのように旧→新ではなく新→旧とパスワードを尋ねるのがちょっとややこしいのですが、これは目をつむることにします。

さて、メールベースの実装です。Rubyでフィルタスクリプトを作りました。ライブラリとしてはlibldap-rubyと標準net/smtp程度です。

一番簡単なパスワード変更(リセット)から考えます。簡単というのは、リクエストコンテンツを解析しなくてもとにかくランダムパスワードを作って割り当て、それを返せばいいからです。 ランダムパスワードはldappasswdコマンドでもできますが、慣れているmakepasswdコマンド(パッケージ)を使うことにしました。makepasswdはランダムなパスワードとそれをハッシュ化した値の両方を出力してくれるので、こういった処理を作るのに便利です。 管理者DNでバインド済みのldap.modifyを使って指定のuidのuserPasswordエントリをハッシュ値で変更し、パスワードをuid@debian.o.jに返すだけです(リクエストメールのFromではありません)。

さて、「指定のuid」を判断し、確かに変更してよいことを決めるために本人証明が必要になります。 ユーザ側は「echo "Please change password" | gpg --clearsign -a | mail dbadmin+password|email|ssh@db.debian.or.jp」の書式でメールを送ります。

もともと鵜飼さんが作っていた署名認証スクリプトもあった(クリア署名だけでなくMIME署名にも対応)のですが、スクリプトが多段になってわかりにくくなりそうだったので、類似のものを実装しました。

  1. 送られたファイルはまずgpg --verifyを行い、鍵リングにあるGPG鍵での正しいGPG署名かを検証します。ただ、RubyのネイティブGPGライブラリはいまいちわかりにくかったので、popen呼び出しというちょっとしょぼいコードになっています。
  2. verifyに成功したら、そのID部分を取り出し、鍵リングに対してそのフィンガープリントを要求します(gpg --fingerprint ID)。
  3. LDAPサーバのユーザ情報にはGPG IDではなく、フィンガープリントのほうが格納されています。ldap.searchを使って、調べたフィンガープリントを探します。
  4. マッチしたら、そのuid属性を取得します。

SSH公開鍵と転送設定はコンテンツを解析しなければならないので、パスワードよりは少し面倒です。とはいえ、単純なフォーマット(SSH公開鍵は各鍵を1行ずつ並べたもの、転送設定は転送先アドレスを記述したもの)なので、これについては特に説明するまでもないでしょう。中身を解析し、ldap.modifyで取り込みます。sshrsaauthkeyエントリは複数持てるのですが、ldap.modifyはどっちにしても(単一値でも)配列渡し限定なので特別な処理はあまりありません。ただ、解析の際にSSH2鍵のフォーマットになっているかどうかは確認するようにしています。転送設定も、validなメールアドレスかどうかの確認をしています。

なお、GPGの処理は重いので、実際にはメールが来るたびに即時処理をするということはせず、一旦スプールディレクトリに置きます。これはprocmailのMHフォルダ形式保存指定(「パス/.」)で済みます。スプール内のファイルを定期処理する際、無駄な処理にならないように、適切な宛先か、署名っぽいものが付いているかを調べてから、実際のGPG処理に移るようにしています。メール処理の振り分けも、Postfixのrecipient_delimiter機能(アカウント名+付値 でも届くようにする)と、procmailが活躍します。単純化した.procmailrcはこんな感じ。

SHELL=/bin/sh
#LOGFILE=/tmp/procmail.log ←デバッグ用

:0 :
* ^To: .*dbadmin\+(password|ssh|email)@db\.debian\.or\.jp
スプールパス/.

:0 :
/dev/null ←ひっかからなければ即ステ

スプールの定期処理はこんな感じ。

#!/bin/sh
find スプールパス -name "[0-9]*" -exec スクリプトファイル {} \;

ということで、最後に全体図を示してまとめとしましょう。procmailのようなMDAの応用方法を覚えておくと、メールベースの自動処理を構築するのに役立ちます。procmail自体は変態言語なので面倒なところもありますが、maildropやrdeliverなどもあるので、試してみるとよいでしょう。

Debian JP LDAPとGPG署名メールによる自動処理(図)

2010年02月02日

おでん

雪が降って寒いし、打ち合わせ後で遅くなってヘトヘトだったので、手抜きにおでん。 昆布、かつお節、鳥手羽元でだし汁を取り、塩、味醂、酒、醤油で調味。具は大根、人参、じゃがいも、さつまあげ、うずら揚げ、つみれ、はんぺん、魚河岸。

鳥と海老のドリア

1月31日の補完。中途半端にごはんが余っていて、早く消化しないといけない生クリームもある、という状態だったので、ドリアに。鍋で鶏肉と玉葱を炒めて、強力粉、バターを加え、色付いたら牛乳とコンソメ、塩、胡椒、ベイリーブスを加えてとろみが付くまで弱火で混ぜていく。白ワインと生クリーム、トマト、海老も加える。冷やご飯はみじんの玉葱、人参と共に炒める。グラタン皿にオイルを敷いた後に米を広げ、チーズをぱらぱら。ソースを全体にかけ、チーズ、パン粉を振る。200度のオーブンで20分ほど。

牛肉の山芋巻き、フカヒレとあわびのスープ、きゅうりのぬか漬け

1月29日の補完。弟からかなーり昔にもらった乾燥フカヒレと乾燥あわびを思い出したので、虫がつく前に食すことにした。フカヒレとあわびは水で戻してから一度その水を捨て、別の水で生姜・ネギとともに茹でる。柔らかくなったら湯を捨て、適当に切る。鳥ガラスープと千切りの生姜を沸騰させて、ヒレとあわびを加え、塩、胡椒、紹興酒、醤油で調味。溶き卵を入れて軽く混ぜてできあがり。ちょっとアワビが固かった感じもするので、もうちょっと戻してもよかったかも。でもわりといい味になった。山芋はこれで終わり。おいしかった。きゅうりもなかなか良い塩梅。

ビーフシチュー

1月27日の補完。牛すね肉、マッシュルーム、人参、じゃがいも、玉葱、セロリで。野菜をかなり多めにしてみた。おいしい。

パンチェッタとトマトのパスタ、ガリシア風タコ

1月26日の補完。パスタはパンチェッタ、玉葱、トマトでシンプルにまとめた。タコは茹でタコをさらに玉葱と一緒に茹でて、じゃがいも、オイル、胡椒、岩塩、パプリカでまとめたもの。タコはもっとじっくり弱火で茹でる必要があるようだ。

焼き餃子

1月24日の補完。豚肉、ニラ、白菜とオーソドックスに。皮もまぁ悪くない出来。