仙石浩明の日記

2006年

2006年3月27日

分からない時は、『分からない』と言おう (1)

「分からない時は、『分からない』と言おう」キャンペーン中、という メールを社内ML に出してみました。

この社内ML というのは tech ML という名前なのですが、KLab の技術者だけでなく、KLab と一緒に開発を行なっていただいている協力会社の方も全員参加していて、少しでも技術に関係ありそうなネタなら何でも自由に書いてね、という ML です。もちろん私も、いろんなことを書いています。

たとえばこんな感じで:

日経ベンチャーの Web ページに、「ピックアップBOOKS」という書評のコーナーがあって、いつも参考にさせていただいているのですが、そこで「ソフトウェア開発で伸びる人、伸びない人」という本の紹介を見つけたので、反射神経的に tech ML にメールを流しました。

----- tech ML に投げたメールここから -----
仙石です。

「分からない時は、『分からない』と言おう」キャンペーン中。

ソフトウェア開発で伸びる人、伸びない人 荒井玲子著
技術評論社 技評SE新書 002 2006/2 208pp 882円
http://nv-club.nikkeibp.co.jp/free/RASHINBAN/20060216/106694/

| プライドには、良いプライドと悪いプライドがある。間違ったプライドを持っ
| ている人かどうかは、次の質問をすればすぐにわかる。
|
| (1) 「わかりません」と言えますか?
| (2) 「難しい」と言って放棄していませんか?
| (3) 説明する機会を避けていませんか?
|
| 「わかりません」と言えない人、「そんなことはわかっています」という反応
| には要注意である。プライドの高い人は、尋ねるということ自体を苦手とする
| 傾向がある。

「分からない」と言えない人って、プライドが原因なんですかね?
「分からない」と言う方がカッコイイってことに、どーして気づかないんだろ?

| ひとつの専門性を持ったら、自分の適正に応じて専門領域を広げていくことは
| できる。一芸に秀でることは、他の分野の専門性を理解することに役立つ。そ
| のためには、ひとつの専門領域を極めることが重要である。

これも、その通りですね。


#13265                                                          仙石 浩明
https://www.gcd.org/sengoku/             Hiroaki Sengoku <sengoku@gcd.org>
----- tech ML に投げたメールここまで -----

優秀な技術者とそうでない技術者との境界線って、「分からない」ことが分かるか否か、だけじゃないかなぁと常日頃から思っているので、手を替え品を替え「分からない」と言えることの重要性を説いているわけです。

# 4/20追記: わからないことをわからないということの重要性を
# 書いているページを見つけました。

Filed under: 技術者の成長 — hiroaki_sengoku @ 14:57
2006年3月26日

epoll(3)

epoll 対応によって高速化した stone の新バージョンのベンチマーク。

version req/sec ms/req KB/sec
stone 2.3 (select) 9.96 100.394 2.80
stone 2.3a (epoll) 781.41 1.280 219.58
apache 983.60 1.017 278.36
stone 2.3
stone 2.3 公式リリース版
stone 2.3a
現時点では CVS にのみ登録されている、次のバージョン:
$Id: stone.c,v 2.2.2.12 2006/03/26 07:30:20 hiroaki_sengoku Exp $
apache
stone なしで直接 httpd へアクセスして測定。

select 版に比べ、epoll 版は、転送速度で 100倍近い性能。 apache への直接アクセスに比べたオーバヘッドは、27% 程度。

# 追記: 性能向上の理由は epoll 化とは別のところにあったことが後日判明

測定条件:

senri% stone -rn localhost:80 2345 >& /dev/null
asao% ab -n 1000 -c 10 http://senri:2345/health
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.121.2.4 $> apache-2.0
Document Path:          /health
Document Length:        131 bytes
Concurrency Level:      10
req/sec
Requests per second [#/sec] (mean)
ms/req
Time per request [ms] (mean, across all concurrent requests)
KB/sec
Transfer rate [Kbytes/sec] received
Filed under: stone 開発日記 — hiroaki_sengoku @ 20:29
2006年3月24日

epoll(2)

stone (従来は select を使用) の epoll 対応の続き。

typedef struct _Pair {
  int common;
  struct _Pair *pair;
  ...
  SOCKET sd;  /* socket descriptor */
} Pair;
...
 struct epoll_event ev;
 ev.events = EPOLLONESHOT;
 ev.data.ptr = pair;
 epoll_ctl(ePollFd, EPOLL_CTL_ADD, pair->sd, &ev);

といった感じで、 ePollFd にソケットディスクリプタを Pair 構造体と一緒に登録する。 そして、epoll_wait でイベント発生を待つ。

 struct epoll_event evs[EVSMAX];
 ...
 ret = epoll_wait(ePollFd, evs, EVSMAX, timeout);

配列 evs には、 発生したイベントが epoll_ctl で登録した構造体とともに 格納されるはずだが、

 common = *(int*)evs[i].data.ptr;

などと構造体のデータを取り出そうとすると、 Segmentation violation が発生することがある。 しかも、デバッグ環境では正常に動くのに、 GCD のゲートウェイ上の設定環境で動かすと、 数分程度で Segmentation violation が発生してしまう。

なぜ期待したデータが得られないのかと、 stone のソースコード全体を見直すことに... しかし問題は見つからず。 epoll の仕様に見落としている点があるのかと思って マニュアルを読み直したり、 挙句の果てに、 Linux のカーネルの epoll 周辺のソースコードをながめたりした。

ptr の値が期待したものと異なる場合があるのかと思って、 epoll_ctl で登録したポインタと、 epoll_wait で取り出したポインタの値を表示させてみると、 予想に反してポインタのアドレス自体は正常のようだ。

早朝、このような stone のデバッグをやっていたのだが、 出社の時間が迫っていたので、作業を中断して出かける。

More...
Filed under: stone 開発日記 — hiroaki_sengoku @ 07:15
2006年3月23日

同時に考えよう (1)

意識した思考はとても遅い。 どのくらい遅いかというと、 言葉に出して思考の筋道を話すことができるくらいだから、 推論の 1ステップに数秒かかったりする。 しかも、脳の短期記憶は 7+α しか覚えられないと言われるから、 中間結果を覚えておく容量もとても小さい。 だから、紙に書き出したり、カードを使って考えたりする。 書いたりカードを並べ替えたりしなければならないので、 さらにスピードが遅くなる。

では、なぜ人は、 コンピュータ顔負けのスピードで思考できるかといえば、 無意識に膨大な推論を行えるからだろう。 よく「ひらめき」とか表現されるが、 要は無意識に行った推論の結果が意識にのぼるから、ひらめく。

同時に一つのことしか考えられない、というが これは意識した思考のこと。 意識は (多重人格者でもなければ ^^;) 一つしかないし、 一つの意識では、7+α の短期記憶しかないから 一つのことしか考えられない。

無意識の思考にはこのような制限はない。 いくつでも同時に思考を走らせ、 結果が得られたらそれを意識にのぼらせればよい。

私が初めて、同時に複数の思考が行われたのを意識したのは、 大学入試のときだった。 早稲田大学の数学の試験だったと記憶しているが、 設問を順に解いていったが、 ある設問を考えていく途中で、行き詰ってしまった。 あまり一つの設問に時間をかけすぎるのは得策でないので、 その設問は後回しにすることにして、次の設問に移った。

次の設問を解き終え、 さらにその次の設問を解いている時だっただろうか (なにぶん 20年以上昔の話なので詳細は覚えていない)、 突然、さきほど行き詰った設問の解き方が頭の中にひらめいた。 そのときは別の設問に集中していて、 少なくとも意識からは完全にその設問のことは忘れ去っていたにも かかわらず、である。

そのときの「ひらめき」の体験があまりに鮮明だったために、 今でも覚えているし、 どうやったら無意識の思考をより活性化させることができるか、 考えるようになった。 意識しなくても思考が続くように、 しかも有意な結果が導かれるようにしなければならないのだから、 そんなに容易ではないが、 日頃から深く考え続けているような事に関しては、 ひらめく頻度が高いように感じる。 おそらく無意識で考え続けているのだろう。

アイディアを次から次へとひらめく人は、 無意識の思考が多数同時に進行しているのだと思う。

Filed under: 自己啓発 — hiroaki_sengoku @ 13:05
2006年3月22日

マルチキャスト(2)

VRRP のマルチキャスト (VRRP Advert) を取りこぼすのは、 NIC が悪いのかも、 と思って別NIC を使用するように変更してみたのだが、 相変わらずスタンバイが勝手にアクティブに昇格したがる。

アクティブ側から見ると

Mar 22 12:58:36 asao Keepalived_vrrp: VRRP_Instance(VI)
                     Received lower prio advert, forcing new election
Mar 22 12:58:36 asao Keepalived_vrrp: VRRP_Instance(VI)
                     Sending gratuitous ARPs on eth1 for 192.168.0.254

スタンバイ側から見ると

Mar 22 12:58:30 senri Keepalived_vrrp: VRRP_Instance(VI)
                      Transition to MASTER STATE
Mar 22 12:58:31 senri Keepalived_vrrp: VRRP_Instance(VI)
                      Entering MASTER STATE
Mar 22 12:58:31 senri Keepalived_vrrp: VRRP_Instance(VI)
                      setting protocol VIPs.
Mar 22 12:58:31 senri Keepalived_vrrp: VRRP_Instance(VI)
                      Sending gratuitous ARPs on eth1 for 192.168.0.254
Mar 22 12:58:31 senri Keepalived_vrrp:
                      Netlink reflector reports IP 192.168.0.254 added

Mar 22 12:58:36 senri Keepalived_vrrp: VRRP_Instance(VI)
                      Received higher prio advert
Mar 22 12:58:36 senri Keepalived_vrrp: VRRP_Instance(VI)
                      Entering BACKUP STATE
Mar 22 12:58:36 senri Keepalived_vrrp: VRRP_Instance(VI)
                      removing protocol VIPs.
Mar 22 12:58:36 senri Keepalived_vrrp:
                      Netlink reflector reports IP 192.168.0.254 removed

tcpdump で確認すると、 VRRP Advert パケットはスタンバイ側に届いているのだが、 keepalived がそれを読めないらしい。 勝手にアクティブになるくせに、 5秒程度で Received higher prio advert して おとなしくスタンバイに戻る。

アクティブになったときに、 (自分がゲートウェイになったつもりで) 本当のゲートウェイへのルーティングを削除してしまうと、 外部への通信が途絶してしまうので、 PPPoE が成功したときのみルーティングを変更するようにした。 これで、勝手にアクティブになったとしても PPPoE が失敗する限りは 実質的に何も変わらないようになった。

keepalived を単なる死活確認にしか使っていない (しかも死んでないのに死んだと誤判断することあり) わけで、 モッタイナイお化けがでそうだ (^^;)。

Filed under: システム構築・運用 — hiroaki_sengoku @ 14:58
2006年3月20日

ルールを変えよう

コバヤシマル テストという戦術シミュレーションがある。 Startrek 映画版 2作目の冒頭で登場する、 艦隊士官候補生のための試験であるが、 (敵の火力が圧倒的であるために) 勝つ方法がない。 そして、勝つことができたのは唯一、カークだけで、 勝てるようにシミュレーションプログラムを細工した、という話。

テストには解があることが多いが、 現実問題だと解があることのほうが稀で、 問題の中だけで考えていては解決不可能なことが多い。 もちろん問題を正面からとらえて解決策を考えることも重要であるが、 一歩視点を引いてみて、問題の枠組み自体を変更できないか、 考えてみることも重要。

問題の解決に集中しすぎると、 問題そのものについて考える余裕がなくなってしまう。 いま取り組んでいる問題は、 どのようなルールにしたがっているのか思いをめぐらせてみると、 そのルールを変えるにはどうしたらいいかが見えてくるかもしれない。

Filed under: 自己啓発 — hiroaki_sengoku @ 13:26
2006年3月19日

GCDバックアップ回線の監視(2)

sshによるバックアップ回線の監視を仕掛けて一日、 タイムアウト(監視プログラムには 10秒のalarmを仕掛けている) エラーが発生。

なぜかと思って調べてみると、 同一IPアドレスからのsshアクセスが多い、 という理由でブロックされてしまっていた (^^;)。 ssh攻撃が多い昨今、GCDのサーバには、 次のようなフィルタが仕掛けてある:

iptables -N block_ssh 2>/dev/null || iptables -F block_ssh
iptables -N ssh 2>/dev/null || iptables -F ssh
iptables -A block_ssh -j LOG --log-prefix block_ssh: \
        -m recent --name block_ssh --set
iptables -A block_ssh -j DROP
iptables -A ssh -j REJECT -p tcp --syn \
        -m recent --update --seconds 600 --name block_ssh
iptables -A ssh -j block_ssh -p tcp --syn \
        -m recent --rcheck --seconds 60 --hitcount 5 --name syn_ssh
iptables -A ssh -p tcp --syn \
        -m recent --set --name syn_ssh
iptables -A ssh -j ACCEPT

# この設定は http://d.hatena.ne.jp/hirose31/20050920/1127208718
# を参考にさせて頂きました (_O_)

つまり 1分間に 5回以上、同じIPアドレスから ssh接続があると、 10分間ブロックする。 監視元IPアドレスが、いったんブロックされると、 毎分接続を試みるわけだから、ずっとブロックされたままになる。 あわてて、監視元IPアドレスをブロック対象からはずした:

iptables -I ssh -j ACCEPT -s 60.32.85.216/29
Filed under: システム構築・運用 — hiroaki_sengoku @ 23:07
2006年3月18日

GCDバックアップ回線の監視(1)

GCD は、bフレッツでインターネットに接続している。 普通に PPPoE しているほか、 フレッツ・ドット・ネットを使っているので、 ネイティブ IPv6 でも外部から (といっても、フレッツ・ドット・ネットを使っているサイト限定だが) 接続できるので、 PPPoE がこけた (設定変更をミスったときなど) ときでも リモートから復旧させることができる。

普通はこれで十分なのだが、さらに念のためということで、 フレッツADSL でもインターネットへ接続して バックアップ回線としている。 bフレッツ側が全滅しても、 ADSL経由でログインできるようにしてある (もちろん、それぞれ別系統のハブに接続してあるし、 ログイン先のサーバは複数ある)。

このバックアップ回線は滅多に使わないので、 いつのまにか不通になっていても気づかないかもしれない、 ということで、さくっと (設定込みで 30分くらい) 監視プログラムを仕掛けた。 単に bフレッツ→インターネット→フレッツADSL 経由で ssh ログインするだけのプログラムを cron で定期的に走らせるだけだが、 不通になっていることに気づかない、という事態は避けられるだろう。

Filed under: システム構築・運用 — hiroaki_sengoku @ 22:47
2006年3月17日

「分からない」と言おう

技術者にとって一番重要なのは、「分からない」と言える能力。 太古の昔から、無知の知と呼ばれているもの。

なにが分かっていないか、分からなければ勉強のしようがない。 分かったつもりで済ませていては、いつになっても真の理解は不可能。

小学生のころ、私は答案に平気で「デタラメ」を書いていた。 デタラメを書いているという意識ではなく、 分かったつもりになって正しい答えを書いているつもりだった。 あまりに自由な発想でデタラメを書くので親が心配したほど。

ところが、中学生のころ、同級生にとても優秀な奴がいた。 彼は、一を聞けば十を理解した。 あまりに早く分かったというので、信じられずに 残りの九を説明しようとすると、先回りして答えられてしまった。

そんな彼が、「分からない」を連発する。 つまり分かった、と言うのも早いが、 分からない、と言うのもとても早かった。

そんな彼を見て、私は「分からない」と言えるのは カッコイイことなんだと思った。 なんとかして自分も、「分からない」と言えるようになりたい、 と思った。

自分が本当に理解しているのか、 それとも単に分かったつもりになっているだけなのか、 常に自省する習慣が身についたのは、 彼のおかげだと思う。

Filed under: 技術者の成長 — hiroaki_sengoku @ 09:26
2006年3月16日

マルチキャスト (1)

GCDの二台のゲートウェイのうちの片方 (senri.gcd.org) の 1000baseT NIC (eth0) が時々マルチキャストをとりこぼす。 二台のゲートウェイは、 VRRP で アクティブ・スタンバイ構成になっているのだが、 senri がスタンバイのときに、 もう片方 (asao.gcd.org) からの VRRP Advert をとりこぼしてしまい、 勝手に アクティブへ昇格しようとする。 一日~数日に一度くらい、このとりこぼしは起きるようだ。 アクティブになっても、 OCN へ PPPoE しに行って失敗して (asao が PPPoE しているから) スタンバイへ戻るので、まあ実害はないのだが、 あまり気持ちのよいものではない。

eth0 で VRRP するのをやめて、 eth1 (100baseT NIC) で VRRP するようにしてみた。 eth1 は PPPoE (と、フレッツ・ドット・ネットのネイティブ IPv6) 専用で、 IPv4 アドレスは割り当てていないのだが、 マルチキャストなので VRRP Advert は受け取れるようだ。

keepalived.conf はこんな感じ:

vrrp_instance VI {
    state MASTER
    interface eth1
    garp_master_delay 10
    virtual_router_id 33
    priority 230
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass XXXX
    }
    virtual_ipaddress {
        192.168.0.254/24 dev eth1
    }
    preempt_delay 300
    notify "/etc/rc.d/vrrp_notify"
}

アクティブの時の asao:

asao.gcd.org:/ # ip addr show dev eth1
4: eth1: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
  link/ether 00:a0:cc:xx:xx:xx brd ff:ff:ff:ff:ff:ff
  inet 192.168.0.254/24 scope global eth1
  inet6 2001:c90:1448:200a:2a0:ccff:fexx:xxxx/64 scope global dynamic
    valid_lft 2591983sec preferred_lft 604783sec
  inet6 fe80::2a0:ccff:fexx:xxxx/64 scope link
    valid_lft forever preferred_lft forever
Filed under: システム構築・運用 — hiroaki_sengoku @ 08:50
2006年3月15日

メモを取ろう

人は誰しもすぐ忘れるもの。 なにかやりたいことがあっても、すぐ忘れる。 せっかく空き時間があっても、そのときはやりたいことを忘れている。 そのくせ、やりたいことはあるんだけど、時間がない、などと言う。

ほんの一行、いや一単語だけでもメモに書いておけば、 たいていの場合、そのとき何を考えていたか、思い出せる。 その一単語を、空き時間ができたときに膨らませていけば、 チリも積もればなんとやらで、一つの成果となる。

この blog も、そんなメモのつもりで書いていきます。 で、空き時間をつかって内容を膨らませていき、 近日オープン予定の blog ページで公開する予定。

4/5追記: 仙石浩明CTO の日記をオープンしました。

Filed under: 自己啓発 — hiroaki_sengoku @ 19:43
2006年3月15日

セキュリティ

セキュリティって、 分かっている人にとっては、 条件反射というか無意識のうちに意識してしまうというか、 あまりに自然な感覚だけに、 分かっていない人にどう説明するのがいいのか、とても難しい。

Filed under: システム構築・運用 — hiroaki_sengoku @ 10:37
2006年3月12日

epoll(1)

select(2) は、/usr/include/bits/typesizes.h に

#define __FD_SETSIZE 1024

などと書いてあって、 1024個以上の socket を扱えない。 poll(2) を使えばいいのだが、 Linux で使えれば十分という気もするので、 epoll(2) を使ってみることにする。 土曜の晩と、日曜の早朝をつかって一気にコーディング。

エラー処理など、細かい点はまだだが、とりあえず動いているようだ。 udp 中継は、格段に速くなる。 tcp 中継は、もともとセッションごとに thread 立てて 2socket だけで select していたので、オーバヘッドは大きくない。 epoll 化してもあまり速度は変わらない。

Filed under: stone 開発日記 — hiroaki_sengoku @ 22:30
2006年3月10日

stone のデバッグ

久しぶりの stone デバッグ。

SSL_accept に時間がかかり、 かつ SSL_accept に失敗するときのみ、 中継先への socket を閉じないというバグ。

localhost でテストをしている限り発覚しないし、 lsof などを使って閉じていない socket を見ない限り なかなか気づきにくい。

$Id: stone.c,v 2.2.1.8 2006/03/09 10:13:02 hiroaki_sengoku Exp $

Filed under: stone 開発日記 — hiroaki_sengoku @ 08:35
2006年3月9日

テスト

まずは、テストから...

This is a test article, sorry.

More...
Filed under: その他 — hiroaki_sengoku @ 17:32
« Newer Posts