MIRACLE
メールサービス申込 ユーザー登録 パートナー情報
お問い合わせ FAQ サイトマップ
MIRACLE LINUXの特長 製品紹介 サービス案内 購入 サポート 技術フォーラム

プロフィール

コアテクノロジー部

ミラクル・リナックスのOS開発やサポートを担う、技術部の精鋭陣が交代で担当します。

ミラクル関連リンク

採用情報

サイト検索

2008年5月

        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

ポストモーテム

こんにちは、shigeonsdです。

8月末で弊社の Q1 が終了し 9 月から Q2 が始まりました。かなり遅かったのですが 9/27 に、プロジェクトの総括をしました。総括というと大仰な印象を与えてしまいますが、要はそのプロジェクトの中で、

  • 良かったこと
  • 悪かったこと
  • 改善すべきこと

の3点を洗い出し、今後のプロジェクト運営のために「振返り」をやろう、ただそれだけのことです。

ポストモーテムの準備

このポストモーテムには、プロジェクトマネージャ(PM)である私、プロジェクトに参加したメンバ3名、プロジェクトの運営に興味がある有志があつまりました。プロジェクトマネージャとメンバには事前に自分が参加したプロジェクトについて前述の 3 点をまとめました。

ポストモーテム開催

この会の目的は、「良かったこと」、「悪かったこと」を整理することで、それらが起った必然性を明らかにし、今後のプロジェクト運営の「改善すべきこと」を導き出すことです。決して失敗の原因から犯人探しをすることではありません。これを会の冒頭で参加者に伝えた上で、参加者がそれぞれ事前にまとめた内容を発表しました。

  • 良かったこと
    • 単体テスト/インターフェーステスト/総合テスト の各フェーズが実行され、全バージョンで見られたNECによるバグの指摘がほぼなくなった。特に各テストのスクリプト化は他の開発案件にも応用できる部分と考える
    • テストファーストを採用することでゴールが明らかだった
    • マネージャと実装者を分離し役割分担が明確だった
    • ペアプログラミングを実践した
  • 悪かったこと
    • 仕事の進め方が、場当たり的であった
    • リスクマネジメントが不十分だった
    • 開発者が育っていない
  • 改善すべき事
    • お客様の要求があるようなソフトウェアに関してはきっちりとしたフローでやらなければいけない
    • PM方法論の導入
    • TQMの実践
    • 領域依存の知識教育方法論
  • 第三者からの意見
    • バグデータベースは宝の山。同じ過ちを繰り返さないための答えがこにある!
    • 仕様がちゃんと fix 出来ていない状態では顧客のニーズに 100%マッチした成果物を作ることはできない
    • 個々のプロジェクトが終わったときにポストモーテムを実施する

ほかにもいろいろな事が挙げられたのですが、全体をみると開発プロセスが共有出来ていないことによって問題が発生しているように感じられました。そこで次のプロジェクトでは、以下の 2 点の改善に取り組むことにしました。

  1. 標準開発プロセスの確立
  2. バグデータベース整備

また、メンバそれぞれにも自分が取り組む課題を設定してもらいました。

ポストモーテムのポストモーテム

この「ポストモーテム」という習慣は簡単なようでなかなか実践されていることは少ないのではないでしょうか? 本来であれば、プロジェクトの終結フェーズで「振返り」をするべきですが、私自身、あるプロジェクトの終結時期は次のプロジェクトの立ち上げの時期と重複したりして、なかなかポストモーテムを実践できていませんでした。

個人が頭のなかだけで考えるのではなく、整理し、プロジェクト関係者全員で振返ることで多くのことを学ぶことができました。また、良かった点、悪かった点の認識を共有することができたように思います。改善点も挙げられましたので、今後のプロジェクトでの課題も明確になりました。

プロジェクト終結フェーズで必ず振返るという習慣を当たり前のこととして組織に根付かせていきたいと考えています。

標準出力のバッファリング

こんにちは、shigeonsdです。

先日作成したシステムで、X サーバ上で発生するマウスボタン押下イベントを検出するプログラムを作
成することになりました。システムを動かしているPC に接続されているマウスのボタンが使えるか
どうかを確認することが目的です。プログラムの仕様を決めたときには、「xev の出力を
grep したら終わりでしょ?」と甘く考えていました。具体的には、以下のような簡単な
シェルスクリプトです。

xev | grep " state 0x100, button 1"

仕様には、xev のウインドウ上でマウスの左ボタンが押下されたときに「即座に」検出するこ
とを含んでいます。しかし、上記のスクリプトでは期待通りには動作しませんでした。

● 不具合内容
xev のウインドウ上にマウスカーソルを合わせマウスの左ボタンを押下したのですが、grep は全
くマウスイベントの発生を検出してれません。ボタンを押したあと、少しマウスカーソルと動かしたり
するとようやくイベントの発生を検出してくれました。

$ xev | grep " state 0x100, button 1"
    state 0x100, button 1, same_screen YES
    state 0x100, button 1, same_screen YES
    state 0x100, button 1, same_screen YES

● 調査
これではイベント発生後に「即座に」イベントを検出する、という仕様を満たせません。xev
を grep に与えている状態では、なにがおこっているのかよく分かりません。grep を
cat -u に変更して実行してみました。

KeymapNotify event, serial 24, synthetic NO, window 0x0,
    keys:  58  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
           0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   

ButtonRelease event, serial 24, synthetic NO, window 0x2c00001,
    root 0x3a, subw 0x2c00002, time 507151157, (38,34), root:(468,483),
    state 0

最後の行に注目してください。state 0 まで出力され、なぜか行が途中まで出力
されて止まっています。マウスカーソルを動かすとつづきが表示されました。

   x100, button 1, same_screen YES

LeaveNotify event, serial 24, synthetic NO, window 0x2c00001,
    root 0x3a, subw 0x0, time 507151157, (38,34), root:(468,483),
    mode NotifyUngrab, detail NotifyInferior, same_screen YES,
    focus YES, state 0

しかし、xev の出力をそのまま端末に表示させているときはこのようなことは
起りません。どうやらどこかで誰かがバッファリングしているようです。最初は xev
の出力を受けるプログラムの入力でバッファリングしているのではないかと思って調査
していたのですがハズレでした。犯人はxev の出力でした。調査には strace
を使いました。strace は引数で与えたプログラムを実行し、システムコールの呼び
出しを記録するプログラムです(man strace)。

$ strace -o xev-strace.out /usr/X11R6/bin/xev | cat -u

このログを grep して標準出力への書き込みを確認しました。

$ grep 'write\(1'  xev-strace.out
write(1, "Outer window is 0x1e00001, inner"..., 4096) = 4096
write(1, "fy event, serial 24, synthetic N"..., 4096) = 4096
write(1, "0, same_screen YES\n\nMotionNotify"..., 4096) = 4096
write(1, "ame_screen YES,\n    focus YES, s"..., 4096) = 4096

この出力をみると、write システムコールの返却値は 4096 で 4096 byte
の書き込みに成功したことを表しています。また、第2引数の内容をみると、書
き出すメッセージが設定されていることが分かります。先頭が実際に出力されるメッ
セージの先頭でなことも分かります。これらのことから、xev の標準出力がバッファ
リングしていると判断しました。

● ソースコード調査と変更

xev のソースは、xorg-x11-6.8.2.tar.gz に含まれているものを使いま
した。ざっとみたところ fflush しているところが見当たらなかったので、以下
のような変更を加えました。

    1044           default:
    1045             printf ("Unknown event type %d\n", event.type);
    1046             break;
    1047         }
    1048         fflush(stdout);
    1049     }
    1050
    1051     XCloseDisplay (dpy);
    1052     return 0;
    1053 }

ちなみに変更したのは、1048 行目の fflush の追加だけです。
コンパイル手順は以下の通りです。

$ cd xc/programs/xev
$ xmkmf
$ make

修正を加えた xev では標準出力への書き込みがバッファリングされなくなり、期
待通りの動作をするようになりました。

ここまでやって、ようやく標準出力が端末に出力する場合は行単位でバッファリン
グされ、ファイルに出力する場合は、普通にバッファリングされることを思い出しました
(man stdout 参照)。

● その後

すべての作業が終わったあと、同僚からこんなメールをもらいました :-p

>> xev のイベントが即座に取得できないのは xev の出力の問題でした。
>> パッチを当てた xev のソースツリー(といっても一行追加しただけ)を送ります。

> ちなみに、X.org 7.x の最新版ではそのような仕様に変更されたようです。Debian unstable の
> /usr/share/doc/xbase-clients/changelog.Debian.gz より抜粋:
>
> xbase-clients (1:1.0.1-2) experimental; urgency=low
>
>   * Add an empty /var/lib/xkb directory so that the server loads the correct
>     keymaps. Thanks Silvestre Zabala, Eugene Konev, and Daniel Stone.
>     (closes: #354130)
>   * Port patches from trunk
>     + general/014_startx_hostname_fix.diff
>     + general/015_startx_dummy_fix.diff
>     + general/073_xev_flush_standard_output.diff
>       ------------------------------------------
>
> ご参考まで。

既に対応された問題だったようです。やれやれ。

素敵なペアプログラミング?

3ヶ月くらい前から、10歳以上年が離れた若手と一緒にとあるプログラムのデバッグ作業をしています。ここでは彼をAくんと呼ぶことにします。この作業は、私は他の作業と掛け持ち、Aくんはほぼ専任、という体制で進めています。

このAくんは5月に入社したばかり、入社したときにはまだ19歳で新人歓迎会ではお酒が飲めなかったという、ピカピカの新入社員です。一方、私は、すでにこの業界13年目のそれなりの経験を積んできた、ややくたびれたエンジニア兼マネージャです。作業を始めた当初は、経験年数13年差がお互いにとってかなり負担でした。私が5秒で解決できる問題も、Aくんにとっては始めてのことですからなかなか解決できません。基本的なコマンドの使い方、コードの読み方、仕事の進め方を手取り足取り教えなければならない状況でした。作業が煮詰まってくるとなかなか優しく教える余裕が持てず、きつく言ってしまうこともたびたびありました。かなり辛かっただろうと思います。

しかし、最近、二人で作業をしている相乗効果が現れてきましたように感じています。これが世間でいうペアプログラミングというヤツかも知れません。私が彼と作業をしていて、明らかに一人でやっているときよりも効果があると感じたことを紹介します。

●作業進捗アップ

私は複数の作業を掛け持ちしているので、お客様との打ち合わせや社内の打ち合わせにたびたび出席しています。一人で作業していると、この時間は作業が完全にストップします。しかし、いまはAくんが作業を続けてくれています。最初は、私がいないとほぼ足踏み状態だったのですが、最近は、打ち合わせから返ってくると、バグがいくつか修正してくれていたりします。つかれているとき、「小人さんが作業を進めてくれるといいのにな」と思ったことはありませんか?いままさにそれが実現しています :-)

●相互チェック作用

一人で作業していると、ちょっとした思い込みで間違った判断をしてしまうことがあります。しかし、二人で作業していると自分の考えを相手に伝え、それを互いが理解することで、ミスの検出率がアップします。最初のうちは、私がAくんに自分の考えを説明することで、自分の頭を整理していたのですが、今はしっかりとレビューアとして聞いていてくれて、間違いを指摘してくれるようにまでなりました。

●モチベーションアップ

一人で作業していてモチベーションが下がってしまうと、リセットするために早めに帰宅することがありました。二人で作業をしていて、私のモチベーションが下がっていても、Aくんの頭が冴えているときは、Aくんのモチベーションに引っ張られてやる気が少し回復したりします。お互いのやる気を支えあっている、というところでしょうか。

Aくんは、とても技術の習得や仕事に対して前向きに取り組んでいます。そんな彼と一緒にしていて、彼がいまの仕事からいろんな事を学んでくれ、成長しているのを見るのが、とても私は嬉しく感じます。いまでは、私の至らない部分をしっかりフォローしてくれて本当に助かっています。

コーチングの本を読んだりしましたが、私にはそんな器用なことはできません。かつて自分がそうであったように、昔の職人さんの世界のように徒弟関係でしか技を伝えられません。やっぱりコード書きの仕事は職人仕事なのかな?と改めて感じていますが、みなさんは如何でしょうか?

作業ログの取り方

このブログをご覧のみなさんは、おそらく何らかの形で開発作業、あるいは設定作業の経験をお持ちだと思います。みなさんは、日々の作業の記録をどのように取られているでしょうか?もし、作業ログを取る習慣がない、あるいは忙しすぎて作業ログをとることに気が回っていないのであれば、作業ログを確実に取る習慣をつけることをお奨めします。この習慣は、きっとあなたの作業の信頼性を上げ、作業効率向上に貢献するはずです。

●作業ログがなぜ必要か

まず最初に、なぜ正確な作業ログをとる必要があるのでしょうか? その答えは簡単です。再現性を確保するためです。自分が不具合報告を受ける立場で考えてみてください。もし、部下やユーザから「動きません」や「バグです」という報告を受けた場合、すぐに問題があると判断するでしょうか? ほとんどの人は、まず報告されている状況を正確に理解したうえで判断したいと考えるのではないでしょうか?

●作業ログに求められるもの

では、報告を受ける人が求めている情報とはどのようなものでしょうか?私は、以下の 4 点を記録・報告することを心掛けています。

  1. どのような環境で起ったのか
  2. どのような操作が行ったのか
  3. どのような結果になったのか
  4. いつ発現したのか

ここで一つ注意があります。それは不具合報告だけでなく、問題が起らなかったという報告をする際にもこれらの情報が必要だということです。成功しているように見えて実は失敗なんて経験、いままでありませんか :-)

●なにを使って作業ログをとるか

最近は wiki や blog などのツールが充実してきました。これらのツールを使って作業記録をとっている人も多いと思います。これらのツールで記録しておけば、情報共有も簡単にできます。いいことづくめのようですが、私は再現性の確保という点については疑問を持っています。よく、コンパイル手順などを wiki に掲載しているページを見掛けますがどのように利用されているでしょうか? ほとんどの場合は、操作の部分をコピーして、自分が作業している端末にペーストしていると思います。うまく動いているときはいいのですが、何かが原因でうまく動かなかったとき、なぜ失敗したのかがはっきりしないことがあります。「ほんとにこの操作でうまくいったの?」という疑問を持った経験はないでしょうか? 私はこのようなことを引き起こさないために、シェルスクリプトと script コマンド使っています。

●正確な作業ログの取り方

  • 作業手順はシェルスクリプト

私は、作業手順を予めシェルスクリプトにまとめることで、作業手順の再現性を確保します。私の経験では、作業が一度で済むことはまずありません。何らかの原因でもやり直しが必要になることがほとんどです。この方法は、シェルスクリプトを実行することで同じ手順を再現するので、人間がコマンドライン操作をするよりも正確に作業を再現できます。また、環境変数の設定など作業の前提条件もまとめて記述しておけばさらに再現性は高くなります。

○Tips

作業をシェルスクリプトにまとめる際、忘れてはいけないおまじないがあります。

  1. 各コマンドの終了ステータス($?)の確認および表示する
  2. シェルスクリプトの最初と最後に date コマンドを実行する
  3. 影響を与えそうな情報は処理を始める前に表示する
  4. set -u

1.は、プログラムを書く上での基本です。終了ステータスを確認し、異常があればエラーメッセージを出してプログラムを停止させます。問題が発生したとき、どの処理の実行中にどのようなエラーが起ったのかを把握することができます。シェルは、シェルスクリプトの内容を読んで実行するだけなので、エラー処理を明示的に書かないと処理が先に進んでしまいます。エラー処理を怠ると思わぬ結果を引き起こします。

foo; ret=$?
if [ $ret -ne 0 ]; then
    echo "foo failed: exit status = $ret" >&2
    exit 1;
fi

2.は作業の開始時刻と終了時刻を記録することで、作業にどのくらい時間ががかかったのかが分かります。あまりにも早く処理が終わっていたり、時間がかかりすぎたりしていれば、なにか異常がないかを確認できます。また、一回当りの作業時間がわかれば、今後の作業時間の見積もりに使えます。

#! /bin/sh
date;
:
:
:
date;

3.は作業に関連する情報を表示しておくことで、実行時の環境を確実に記録します。たとえば、設定ファイルの内容が重要な場合であれば、cat コマンドで表示しておきます。

#! /bin/sh
date;
:
echo "### /etc/hosts ###"
cat /etc/hosts
:
:

4.は未定義の環境変数を参照したときに処理を停止するための指定です。これを指定しておかないと思わぬ副作業を引き起こしますので要注意です。以下の処理で、もし WORKDIR を WORKIDR のように typo したとき、どのようなことが起るでしょうか? 考えてみてください :-p

rm -rf ~/${WORKIDR}/*

○作業ログは script コマンド

作業ログは script コマンドを使ってとります。script コマンドはオプションでログファイル名を指定することができます(man script 参照)。なにもオプションを指定しないと typescript というファイル名にログが記録されます。複数回、script を実行するとログはtypescript ファイルに追記されてしまいます。これではせっかくログをとってもログの世代管理ができていませんので、イマイチ役に立ちません。script を実行する際には、日付、時間を含んだものログファイル名を指定することでいつのログなのかを分かるようにしておくと良いでしょう。

$ script `date +%Y%m%d-%T`.log

date コマンドはよく使うので、以下のようなシェルスクリプトを ~/bin に持っておくと便利です。

$ cat ~/bin/timestamp
#! /bin/sh
date +%Y%m%d-%T

さきほどの script との組み合わせは以下の通り。

$ script `~/bin/timestamp`.log

○ コラボレーション

わざわざ作業手順をシェルスクリプトにしたのは理由があります。それは、script コマンドと連携させるためです。scriptコマンドには、環境変数SHELL に指定されたコマンドを実行してログをとるという機能あります。作成した作業手順シェルスクリプトを環境変数 SHELL に設定して script を実行することで、実行する度に日付入りのログファイル名に作業内容を記録することができます。

$ env SHELL=./prog-build.sh script prog-buiild-`~/bin/timestamp`.log

●まとめ

以上の方法で、「作業ログに求められるもの」で書いた 4 点をすべて間違いなく記録することができます。一度失われた情報は二度と取り戻すことはできません。記憶に頼った作業では作業成果の信頼性を上げることはできません。

私はプロフェッショナルと素人との違いは、常に確実な作業ができるかどうかだと考えています。今回の作業ログについてもその一つです。些細な TIPS ですが、お役に立てれば幸いです。

Asianux開発での公用語

皆さんもご存知の通り、Asianux開発は現在の所、北京にて日中韓の三カ国の会社の共同作業により行われています。
母国語の違うそれぞれの国の開発者が集まり、作業を進めていく上での公用語はやはり英語になります。
Asianuxスタート当初は日中の二カ国だけでしたが、自分も含め、皆、英語はかなりヘタだったので会議等、異様に時間がかかっていました。一瞬ですが、日本語のできる中国人通訳を雇おうか。なんて考えたこともありました。
また、日本人の英語の発音と同様、中国にもそれに近いものが存在します。
例えば、「FILE」は中国語英語だと「フィル」という発音をしたり…(ただし、まじめに英語を勉強した中国人の英語の発音はすばらしいです)。
さすがに二年こちらで一緒に作業をしていると、そういった発音にもだいぶ慣れましたし、中国人技術者の発音もよくなってきたように思います。
会議においても昔はすぐに中国語が飛び交う状況(中国人技術者の数が圧倒的に多いため)になっていましたが、現在ではそのような状況になることも少なくなっています。

私自身は中国語をまともに勉強していませんが、それでも二年こちらにいると片言の中国語は話す・理解できるようになってきました。
こないだ、中国人技術者連中と飲みに行った時(以下の中国語が正しいかどうかは謎です ^^;)、
「我在开会的时候,你们都不会说秘密的事情。因为我现在有点听得懂你们说什么。(私が会議に出てる時、君らは秘密の話できないよ。だって私は今君らが何話しているのか少しわかるから)」
なんて言ってみました。すると中国人技術者の一人(中国南方出身)が、
「那我说我老家的方言。你应该听不懂吧。(じゃ、私は私の郷の方言を話す。あなたはきっと分からないでしょ)」
と言われたので、私は、
「肯定不懂啊。(きっとわからないよ)」
と。すると別の中国人技術者(北京出身)は、笑いながら、
「我也不懂。(私もわからないよ)」
と。
※ 中国では方言が他の地方では通じなくなったりするのでこのような会話になります。

と、話がそれてしまいましたが、そんなこんなで英語・中国語にて和気藹々と開発が進んでいます。 :)

レガシーエンコーディングプロジェクト BOF 開催

5/17 にミラクル・リナックス株式会社のセミナールームにてレガシーエンコー
ディングプロジェクトの BOF が開催されました。

近年の OSS では、文字コード変換処理に Unicode を用いることで国際化に対
応しているものが多くなりました。これにより、OSS を日本語環境で使用する
際に特別なローカライズ作業を行う必要がなくなりました。しかし、Unicode
を用いることでいくつかの新たな問題が発生しています。

このプロジェクトでは、これらの問題を解決するべくレガシーエンコーディン
グ(以下、LE)の間でCP932 セントリックな文字コード変換をするためのパッチ
を OSS 毎に個別に作成することを目的に活動しています(*1)。なお、このプ
ロジェクトはsourceforge.jp 上にプロジェクトを開設し、wiki、メーリング
リストLE-talk-ja 運用し、バザールモデルによる開発を行っています。メー
リングリストには約 200 名の方々に参加して頂いております。

4月から5月の初旬にかけてメーリングリストで活発に意見が交わされました(*2)。
とりあえず、一通りの議論がされたであろうということで、メーリングリスト
の参加者に BOF の開催を呼び掛けました。そして 5/17 に日本有数の文字コー
ドオタク(?)が一堂に会しました(笑)

まずは、本プロジェクトの目的を説明した後、フリーディスカッションの時間
を設け、参加者のみなさんから意見を出して頂きました。大筋では以下の内容
を中心に議論が展開されました。

    * UTF-8 があるんだからもうLEの問題は自然淘汰にまかせよう。

    * UTF-8 があっても以前としてLE間の文字コード変換で困っている人
          がいるから救済措置が必要だ。

    * 新しいLEを作ることで更にに混乱を招くのは絶対にさけたい。

    * このプロジェクトの成果物は LE からUTF-8 へ移行するまでの繋ぎ
          として必要なものを作るんだ

一時間ほど議論をしたあと、ピザをつまみビールを傾け、あちらこちらで更に
議論が発展しました。燃料が投入されたことで場の雰囲気がざっくばらんにな
り、文字コード問題の歴史、いままでぶつかった問題、ケータイの絵文字問題
など、文字コードに関わる興味深い話題が出されました。こうして熱い夜が更
けていくのでありました...

BOF の開催後、メーリングリストでは更に活発になりました。本プロジェクト
の活動を様々なブログでも取り上げて頂き、さらにザールモデルのプロジェク
トらしくなってきました。

文字コードに興味がある方は是非レガシーエンコーディングプロジェクトにご参
加ください。

(*1) このプロジェクトは IPA の 2005 年度下期オープンソースソフトウェア
     活用基盤整備事業のプロジェクトで採択されました。

(*2) 本プロジェクトの詳細は下記のURLを参照してください。
    http://sourceforge.jp/projects/legacy-encoding/

会社情報 採用情報 個人情報保護方針 商標等取り扱い事項 English
Copyright(c)2000-2006 MIRACLE LINUX CORPORATION. All Rights Reserved.