<?xml version="1.0" encoding="UTF-8"?> 
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="ja">
<title>仙石浩明CTO の日記</title> 
<link rel="alternate" type="text/html" href="http://sengoku.blog.klab.org/" />
<link rel="service.post" type="application/x.atom+xml" href="http://cms.blog.livedoor.com/atom/blog_id=1631449" title="仙石浩明CTO の日記" />
<modified>2008-07-22T07:46:12Z</modified> 
<tagline><![CDATA[<a href="http://sengoku.blog.klab.org/archives/53861672.html">技術者の成長にとって一番役に立つ会社</a>を目指して模索する日々を、<br />
取締役CTO 兼 プログラマ 兼 システム管理者の視点から書いてみます]]></tagline> 
<id>tag:blog.livedoor.jp,2008:klab_sengoku</id> 
<author>
<name>klab_sengoku</name> 
</author>
<generator url="http://blog.livedoor.com/" version="1.0">livedoor Blog</generator> 
<copyright>Copyright (c) 2008, klab_sengoku </copyright>
<entry>
<title>技術力が高い人こそ、ビジネスモデルの良し悪しにもっと敏感になるべき</title> 
<link rel="alternate" type="text/html" href="http://sengoku.blog.klab.org/archives/64945422.html" />
<modified>2008-07-21T22:46:04Z</modified> 
<issued>2008-07-22T07:46:04+09:00</issued> 
<id>tag:blog.livedoor.jp,2008:klab_sengoku.64945422</id> 
<summary type="text/plain">
先週参加した社外の飲み会 (私は飲めないので専らウーロン茶でしたが) で、
Linux ディストリビューションの開発や、
カーネル技術を売りにしたコンサルティングで有名な某社の
カーネル技術者とお会いしました。
彼はいま伸び盛りの若手カーネル・ハッカーなのですが...</summary> 
<dc:subject>技術と人材育成と経営</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://sengoku.blog.klab.org/archives/64945422.html">
<![CDATA[<p>
先週参加した社外の飲み会 (私は飲めないので専らウーロン茶でしたが) で、
<a href="http://ja.wikipedia.org/wiki/Linux%E3%83%87%E3%82%A3%E3%82%B9%E3%83%88%E3%83%AA%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3">Linux ディストリビューション</a>の開発や、
カーネル技術を売りにしたコンサルティングで有名な某社の
カーネル技術者とお会いしました。
彼はいま伸び盛りの若手カーネル・ハッカーなのですが、
オープン・ソース・ソフトウェア (以下 OSS と略記) ビジネスについて熱く語ったり、
ディストリビューションをサポートし続ける使命感に燃えていたのが、
わたし的にはちょっと気になりまして、
ひとこと言いたくなってしまいました(お節介ですね ^^;)。
</p>
<p>
ディストリビューションのサポート体制
(カーネルのバグにも的確に即応できる体制) を維持し続けることによって、
多くの企業で Linux を安心して使ってもらうことができて、
それが OSS の発展につながるし、
それこそが自分の使命だと彼は考えているようでした。
それはそれで意義あることだとは思うのですが、
彼のような優秀な技術者には、
「サポート」という目的だけに捕らわれず、
もっと自由に興味の赴くまま学び、
自らのスキルを伸ばしていって欲しいと思ったのです。
</p>
<p>
OSS 関連のビジネスというと、
すぐ、
サポートでお金を稼ぐとか、
OSS 活用のコンサルティング事業とかの発想をする人が多いのですが、
誰もが思いつく事業だけに、
ビジネスモデルとしては稚拙な部類と言わざるを得ません。
高い技術力がそのまま売りにつながった前世紀ならいざ知らず、
競争が激化してビジネスモデルの巧拙が事業の成否を大きく左右する昨今、
いまだに何の「ひねり」もない「OSS サポート」に固執するのは、
いかがなものかと思うのです。
</p>
<p>
技術コンサルティング事業というと聞えはいいのですが、
要は「<a href="http://sengoku.blog.klab.org/archives/50984531.html">人月ビジネス</a>」です。
どんなに優秀な技術者 
(「<a href="http://gogen-allguide.com/hi/pinkiri.html">ピンからキリまで</a>」
の「ピン」ですね) であっても、
一人月 1000万円払ってくれるお客がいるはずはなく、
素人技術者 (以下「キリ」と略記) の 
5～6倍の人月単価を稼げば御の字というのが実状ではないでしょうか。
だからコンサルティング事業といいつつ、
高額のソフトウェアを売り付けてライセンス料を稼ぐことのほうが、
メインの目的だったりする会社もあるわけです。
</p>
<p>
ただあいにく OSS の場合は高額のライセス料を請求するのは無理があります。
せいぜい保守料と称してわずかばかりの費用を請求するのが関の山でしょう。
だから OSS のコンサルティングというのはあまりよいビジネスモデルとは言えません。
ものすごい労力とコストをかけてピンをそろえて 
(お客に高いね～と言われつつ) 5倍の人月単価を設定するくらいなら、
コストをかけずにキリを大量に集めて格安な人月単価で売りさばく
(いわゆる派遣ビジネス) 方が、
経済合理性にかなうというものです。
</p>
<p>
キリに成長の機会も与えずに
「若いだけが取り柄の労働力」
として派遣して使い捨てにする事業は当然非難されるべきですが、
労働時間では測りしれない価値を持つはずのピンを人月換算してしまう事業もまた、
非難されるべきではないでしょうか？
人月ビジネスでは売上を増やすには人員を増やさざるを得ず、
売上が拡大しても決して余裕は生まれません。
いやそれどころか、
どんどん仕事を片付けてくれる優秀な技術者にどんどん仕事が集中して、
優秀な技術者ほど疲弊する、
という理不尽なことも起り得ます。
</p>
<blockquote>
頼りにされるあまり、多くの仕事がその人に任されることになる。
できる人に、仕事が集中するのは、よくある話で、
その人は、回りの期待にこたえようとして、遅くまで残業して、
休日も出社したりする。
この状態が、一過性のものだったら良いんだけど、
慢性的なものになると、肉体も精神もぼろぼろになっていく。
<div align="right"><a href="http://d.hatena.ne.jp/higayasuo/20080330/1206851577">会社から「頼りにされる」危険性</a> から引用</div>
</blockquote>
<p>
ピンとキリでは生産性で何十倍～何百倍 
(私は 3桁の差があると日頃から主張していますが)
もの差があるのに、
わずか 5～6倍の売上の差しか出せないのは、
「儲ける仕掛け」が無いからです。
ピンの労働時間を人月換算するのではなく、
ピンの技術なしには実現できないような (つまり競合他社には構築不可能な)
儲ける仕掛けを編み出して売上を増幅し、
それによって生じた余裕でピンの仕事量を思いきって抑えることによってこそ、
その優秀さに報いることができるのだと思います。
</p>
<p>
そうすれば仕事の負荷が軽くなったピンは、
ピンならではの新しい価値を産み出すことに注力できます。
新しい事業のシーズを産み出す研究開発でもいいですし、
あるいは OSS から恩恵を受けている企業であれば、
ピンの人が (勤務時間中も) 
OSS コミュニティで活躍することを奨励することによって、
OSS の世界に「恩返し」することもできます。
</p>
<p>
前世紀は技術力が高ければ儲ける仕掛けを誰でも作ることができた時代でした。
つまり優れたソフトウェアなら結構な値段で売ることができたのです。
マーケティングがしっかりしていれば、
開発費を大幅に上回る売上も達成できました。
典型例はマイクロソフトですね。
ピンが作ったソフトウェアを何億本も売ったわけで、
ピンの労働力が人月単価の何万倍もの価値を生んだことになります。
その後 OSS の発展と普及により、
ソフトウェアを売るだけというビジネスモデルは行き詰まりました。
今ほど新しいビジネスモデルが重要となった時代はないと言えるでしょう。
</p>
<p>
さらにいうと、
技術者が優秀であればあるほど、
その「シーズ」は一般人の「ニーズ」からかけ離れていく、
という難しさもあります。
例えば、
優れたカーネル・ハッカーの技術を、
真に必要とする人が世の中にどれだけいるのか？という問題です。
技術の素人である大多数の消費者にとっては、
小難しい技術のことなんか全く分からないし興味もありません。
高い技術力が売れるどころか、
逆にその高度さが「需要」を減らしてしまう原因となりかねません。
</p>
<p>
高度な「シーズ」と一般の「ニーズ」を結び付けるには、
高度なビジネスモデルが求められるわけで、
技術者がハッキングの合間に思いつくようなビジネスモデルではお話になりません。
優れたカーネル・ハッカーが、
四六時中寝る間も惜しんでカーネル・ソースのことばかり考えているのと同様、
優れたビジネスモデルを考え出すビジネスの戦略家 (以下、戦略家と略記) は、
四六時中寝る間も惜しんで儲ける仕掛けのことばかり考えています。
素人考えのビジネスモデルが通用すると思うのは、
C言語を覚えたばかりの素人技術者が、
カーネル・デバッグに挑もうとするくらい無謀なことでしょう。
</p>
<p>
当たり前のことですが餅は餅屋であり、
技術のことは技術者に任せるべきですし、
儲ける仕掛けのことは戦略家に任せるべきです。
優秀な技術者は、優秀であればあるほど、
優秀な戦略家と組むべきなのです。
ところが世の中の大半の会社はそうなっていません。
</p>
<p>
超優秀なハッカーは互いに認め合う技術者同士ばかりで集まり、
ビジネスモデルの重要性を軽視してしまいます。
ビジネスモデルなんて自分たちだけでも考え出せると思ってしまい、
社員のほとんどが技術者、なんて会社になってしまいます。
実地に売り歩く営業の必要性にはさすがに気付いて営業担当者を数人雇ったり、
あるいは社長が自ら売り歩いたりするようになるものの、
儲ける仕掛けの構築には無頓着で、
旧態依然としたビジネスモデルのままだったりします。
そのため事業を拡大しても余裕が生まれず、
ちょっとした外部環境の変化でたちまち立ち行かなくなる恐れがあります。
</p>
<p>
逆に、優れた儲ける仕掛けを生み出すことができる有能な戦略家は、
一日24時間、儲ける仕掛けを考え出すことばかりに夢中で、
その仕掛けを下支えする高度な技術のことは軽視してしまいます。
技術なんて下請けをいじめればなんとでもなると考えてしまい、
決して技術者をパートナーとは考えません。
技術者を、売るものを作ってくれる便利な人と考えてくれればまだマシなほうで、
下手するとコストばかりかかる必要悪くらいの勢いで、
原価削減の手法をあれこれ考え始めたりします。
しかし技術を軽視したツケは、いろいろな形で払うことになるでしょう。
事業を下支えする技術が脆弱であれば事業の継続性が危ぶまれますし、
技術面で他社との差別化が行なえずに他社の参入を許してしまうかも知れません。
</p>
<p>
これでは技術者と戦略家の利害はどんどん対立してしまいます。
この悪循環をくい止める唯一の方法は、
技術者が ──特に、優秀であればあるほど──
ビジネスモデルの良し悪しを嗅ぎ分ける嗅覚を持つことです。
誰が優れた「儲ける仕掛け」を生み出すことができるのか、
技術者が判断できるようになれば、
人月ビジネスから抜け出す見込みのない会社を見限ることが
できるようになるでしょう。
</p>
<blockquote>
対称性を考慮すれば、
戦略家が技術の優劣を嗅ぎ分ける嗅覚を持つことによっても、
利害対立の悪循環をくい止めることが (理論上は) 可能ですが、
高度に専門化・細分化してしまった技術を、
技術者ではない戦略家に (優劣を判断できるほどに) 
理解してもらうことは現実的とは思えません。
戦略家と技術者が協力しあうには、
まず技術者の側が相手を理解する必要があるのです。
</blockquote>
<p>
そうすれば、
より優れた戦略家のもとに優秀な技術者が集まるようになり、
戦略家と技術者の利害が一致する方向へ淘汰圧が働きます。
すなわち、
戦略家が優秀な技術者と組むことにより、
技術者には (従来想像していた以上に) 優劣の差があって、
どのレベルの技術者と組むかが事業の成否を大きく左右する、
ということが明らかになってくるはずです。
</p>
<p>
優秀な技術者が事業にどれだけ貢献し得るか実感できれば、
優秀な技術者に対して、その能力に見合った待遇
──報酬はもちろんですが、
仕事量を減らして OSS コミュニティへの貢献を推奨するなど──
を提供すれば優秀な技術者が集めやすくなる、
ということも実感できるようになることでしょう。
</p>
<blockquote>
技術者の側からすると信じられないことだとは思いますが、
ピンもキリもそんなに大した差ではない (せいぜい 5～6倍) と、
技術者でない人の大半は感じています。
縁遠い技術になればなるほどこの傾向は強まるようで、
例えばカーネル技術者の中でもメンテナとデバイス・ドライバの開発者とでは、
(技術者の目から見れば) だいぶレベルの差がありますが、
(技術者以外の人で) その能力差を実感できる人は皆無でしょう。
</blockquote>
<p>
技術者の待遇向上の鍵は、
技術者がビジネスモデルの良し悪しにもっと敏感になること、
すなわち会社における技術職以外の職種の役割についてもっと理解し、
技術職以外の人達についても、
その能力の優劣を見分けられるようになることにこそ、
あるのだと思います。
</p>
]]> 
</content>
<author>
<name>klab_sengoku</name> 
</author>
</entry>

<entry>
<title>学生のうちに身につけて欲しい、たった一つの能力</title> 
<link rel="alternate" type="text/html" href="http://sengoku.blog.klab.org/archives/64882690.html" />
<modified>2008-04-22T21:56:27Z</modified> 
<issued>2008-04-23T06:56:27+09:00</issued> 
<id>tag:blog.livedoor.jp,2008:klab_sengoku.64882690</id> 
<summary type="text/plain">
母校の教壇に立ちました。


20年前に学んだ教室 (私が情報工学科で学んだのは 1987年～1990年) で、
20歳年下の後輩に対して行なった、
私にとって初めての授業体験でした。
勉強会やセミナーで講師をしたり、
学会で発表したりは何度もあるのですが、
授業という...</summary> 
<dc:subject>技術と人材育成と経営</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://sengoku.blog.klab.org/archives/64882690.html">
<![CDATA[<p>
<a href="http://www.kuis.kyoto-u.ac.jp/">母校</a>の教壇に立ちました。
</p>
<p>
20年前に学んだ教室 (私が情報工学科で学んだのは 1987年～1990年) で、
20歳年下の後輩に対して行なった、
私にとって初めての授業体験でした。
勉強会やセミナーで講師をしたり、
学会で発表したりは何度もあるのですが、
授業というのは、
また趣きが異なりますね。
<a href="http://syllabus.kogaku.kyoto-u.ac.jp/syllabus/2008/91080.html">2コマ (約三時間)</a> 自由に話してよい、
ということだったので、
そんなに長時間は話がもたないんじゃないかなぁ、
と少々不安を感じながら臨んだのですが、
幸い多くの質問を頂けて、
気づいたら 30分ほど時間を超過していました。
</p>
<p>
聞き手の学生さん達は現在 4回生で、
そのほとんどは大学院に進学予定ということだったので、
「学生のうちに身につけて欲しい、たった一つの能力」
というテーマでお話しました。
もちろん、「たった一つ」だけだと 3時間も話を引っ張れないので (^^;)、
私が卒業してから現在までの 16年間の社会人生活で学んだことの中で、
一番重要と思うことを三つ挙げてお話したのですが、
三つもあると覚えてられないでしょうから、
ということで「たった一つ」を強調したのでした。
それは、
</p>
<blockquote>
<div align="center">質問すること</div>
</blockquote>
<p>
です。
</p>
<p>
産業界(特に IT 業界) が大学教育に求めること、
というと「<a href="http://blog.gcd.org/archives/50919311.html">コミュニケーション能力</a>」なんかが
筆頭に挙がってしまうことも多い今日このごろですが、
「みんなと仲良くできる」だけでいいのは小学生までで、
社会で活躍していく上で本当に必要な能力といえば、
間違いなく「考える力」でしょう。
</p>
<p>
で、どうやって考える力を伸ばしていくかですが、
教科書を読んだり問題集を解くだけで身につくわけもなく、
いろんな人の考えを見聞きしながら自分なりに考えてみて、
次第に考える力が身についていくものだと思います。
だから、
出会った人それぞれから、
どれだけその人の「考え方」を吸収できるかが、
一生の間にどれだけ考える力を身につけられるかを左右することになるでしょう。
</p>
<p>
もちろん、より多くの人に出会うように努めれば、
より多くの人の考え方を参考にできるわけで、
だからこそ「コミュニケーション能力」が重要と主張する人もいるのでしょうが、
スゴイ人に出会えても、
その人から学べなければ折角の機会も生かせません。
優れた人からどれだけ多くのものを引き出せるか、
すなわち臆せずどんどん質問できるかこそが、
考える力を伸ばす最大の原動力になるのだと思います
(もちろん質問する能力も一種のコミュニケーション能力ですが、
「コミュニケーション能力が重要」と言ってしまうと範囲が広すぎて、
焦点がぼやけてしまいます)。
</p>
<blockquote>
例えば、講演会等で、質疑応答の時間になった時、誰も質問しなくって、
大きな会場が静まり返る、という状況はよくありますよね？
その静寂を打ち破って質問できるでしょうか？
ほとんどの人は、たとえ質問したいことがあっても、
なかなか声を出せないんじゃないでしょうか？
<br />
私が個人的に尊敬している人って、
ほとんど例外なくそういう場でも臆することなく質問できる人なんですよね。
「分からない」と言える勇気を持つことと、スキルアップできること、
との間には強い相関があるように思えてなりません。
<div align="right"><a href="http://sengoku.blog.klab.org/archives/50000687.html">分からない時は、『分からない』と言おう (2)</a></div>
</blockquote>
<p>
というわけで、
今日の私との「出会い」を最大限生かすべく、
講演を途中で遮っても構わないので、
(空気を読まずに) 遠慮無く質問してください、
と話してから本題へ移りました。
まあ、私との出会いが
大した足しにならなかったとしても、
恥ずかしがらずに質問する練習だけでも 
2コマの授業時間を費やす価値は充分にあると思います。
「出会い」は今後もたくさんあるでしょうから。
</p>
<p>
ちなみに、「重要と思うこと三つ」の残り二つは、
</p>
<blockquote>
技術者の地位を向上させるには、
技術者以外の視点にも立ってみて、
技術者自身が視野を広げていかなければならない
<div align="right"><a href="http://sengoku.blog.klab.org/archives/50827379.html">作ること と 売ること (未踏集会 ESPer2006 秋の陣)</a></div>
</blockquote>
<p>
と、
</p>
<blockquote>
これから社会に出ていく学生さん達が最優先で取組むべきことは、
会社と対等に渡り合える実力を身につけるために、
いま何をすべきか考えることでしょう。
そんな実力を身につけることは自分には永遠にムリと思う人がいるかもしれませんが、
ムリと思えば思うほど実現は遠退きます。
<div align="right"><a href="http://sengoku.blog.klab.org/archives/53861672.html">技術者の成長に役立つ会社とは？(1)</a></div>
</blockquote>
<p>
です。
</p>
<p>
<a href="http://www.gcd.org/sengoku/docs/kyoto-u_20080418.pdf">授業で使ったスライドを PDF 化したもの</a> と、<br />
FlashPaper で Flash 化したもの ↓ を公開します。
</p>

<a href="http://sengoku.blog.klab.org/archives/64882690.html">続きを読む</a>]]> 
</content>
<author>
<name>klab_sengoku</name> 
</author>
</entry>

<entry>
<title>自身の能力をアピールすることは技術者として必須だが、上司にだけアピールするのは最悪！</title> 
<link rel="alternate" type="text/html" href="http://sengoku.blog.klab.org/archives/64796023.html" />
<modified>2008-01-18T13:13:53Z</modified> 
<issued>2008-01-15T11:15:53+09:00</issued> 
<id>tag:blog.livedoor.jp,2008:klab_sengoku.64796023</id> 
<summary type="text/plain">
私自身は、
KLab 社内の技術者たちと、
いつまでも技術者同士の関係でいたいと思っているのですが、
技術者の人数が増えてくると、
仕事上の接点がほとんどない人もでてきます。
そして社員の側からすると、
私は (いちおー ;-) 取締役なので、
おいそれとは話せな...</summary> 
<dc:subject>技術と人材育成と経営</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://sengoku.blog.klab.org/archives/64796023.html">
<![CDATA[<p>
私自身は、
KLab 社内の技術者たちと、
いつまでも技術者同士の関係でいたいと思っているのですが、
技術者の人数が増えてくると、
仕事上の接点がほとんどない人もでてきます。
そして社員の側からすると、
私は (いちおー ;-) 取締役なので、
おいそれとは話せない恐い人などと根拠無く思い込んでるケースも、
残念ながら皆無というわけではありません。
</p>
<p>
それではいけないということで、
日頃あまり接点のない人たちを中心に、
無理矢理 (^^;) ランチに誘って話する、ということをしています。
先日も隣の部署の N さんと二人でランチへ行きました。
彼とは入社直後の社員旅行で少し話をしただけで、
その後は話す機会がほとんどなかったのです。
</p>
<p>
それまで私は知らなかったのですが、
実は彼は高専時代にず抜けた存在で、全校で表彰されたこともあったそうです。
プログラミングが大好きで、いろんなものを作っては、
学校内でアピールし注目を集めていたとか。
しかしながら KLab 社内ではどちらかといえば目立たない存在だった
(目立たなかったので私も話す機会がありませんでした) ので、
高専での活躍ぶりとのギャップを感じざるを得ませんでした。
</p>
<p>
そこで、
何がきっかけで自身の成果をアピールするのを止めてしまったのか尋ねました。
すると、
</p>
<blockquote>
新卒で就職した会社 (≠ KLab) で、
開発ではない部署に配属されてしまった。
何事も挑戦ということでしばらくは配属された部署で頑張ったが、
やっぱりプログラミングを仕事にしたいと思い、
上司に何度も自身の能力をアピールしたところ、
ことごとく却下されてしまった。
それどころかアピールすればするほど周囲の評価も下がるぐらいで、
ついにはアピールするのを止めてしまった。
</blockquote>
<p>
という答が返ってきました。
</p>
<p>
確かにそういう人は多いのだろうなぁと思います。
日頃、アピールすることの重要性を説いている私としては残念でなりません。
そもそも誰だって、
他の人より得意なことがあれば、
それを自慢したくなるのがフツーでしょう。
だからアピールする習慣がない人って、
元々アピールするのが嫌いだったというわけではなくて、
何らかのきっかけでアピールするのを止めてしまったのだろうと思います。
</p>
<p>
きっかけにはいろいろあるでしょうが、
N さんのように、
アピールしても周囲から評価されなかったり、
それどころか怒られたり、
周囲から浮いてしまって仕事が進めにくくなったり、
そういう嫌な経験をすれば、
だんだんとアピールするのが億劫になってしまうのは仕方がないところだと思います。
N さんの話に頷きながら、
ふと一つのフレーズが頭の中に浮かんできました:
</p>
<blockquote>
<div align="center">
自身の能力をアピールすることは技術者として必須だが、<br />
上司にだけアピールするのは最悪！
</div>
</blockquote>
<p>
技術者にとって重要な能力というと、
一つは間違いなく「スキルアップする能力」でしょう。
誰だって最初は初心者です。
プログラミングの勘所が最初から分かっていたなんて人は (たぶん) 皆無で、
初めて書いたプログラムを後に読んでみると、
その稚拙さ加減にあきれてしまう、というのはよくある話です。
</p>
<p>
最初は誰しも稚拙なプログラムを書いていたのに、
どんどん能力を伸ばす人がいる一方で、
多少は「形」を覚えて「それなりの」プログラムが書けるようになるものの、
本質的には初心者と代わり映えしない人 
(<a href="http://blog.gcd.org/archives/50890010.html">偽ベテラン</a>) もいて、
いつのまにか両者の間には<a href="http://blog.gcd.org/archives/50243372.html">生産性で 3桁の差</a>がついていた、
なんてことが起こり得ます。
</p>
<p>
技術者にとって重要な能力がもう一つあります。
それが「アピールする能力」。
言うまでもなく<a href="http://www.nurs.or.jp/~ogochan/essay/archives/977">技術者だけではお金にはなりません</a>。
技術者の能力をお金に換える人
──例えば技術者が作ったものを他の誰かに売り付ける人──と、
<a href="http://sengoku.blog.klab.org/archives/50534560.html">一緒になって初めてお金が稼ぐことができる</a>わけです。
でも、どうやってその「換金してくれる人」を探せばよいのでしょうか？
</p>
<p>
実は「換金してくれる人」も技術者を探しています。
そりゃ、売るものがなければお金を稼げませんから、
技術者の能力を換金しようと思っている人が技術者を探すのは当たり前ですね。
だからわざわざ技術者の側からアクションを起さなくても、
学校には「求人票」が貼られ、
巷には転職斡旋会社の広告が氾濫しているわけです。
テキトーな会社を選んで面接を受ければ雇ってもらえてお金をもらえます。
</p>
<blockquote>
とはいえ、受け身の姿勢よりは自ら動いたほうが有利になるのは世の常です。
学校に貼ってある求人票に限定した就職活動や、
あるいは転職エージェントの勧めに従うばかりの転職活動よりは、
自ら主体的に会社探しをしたほうが「高く」換金してもらえる可能性が高まります。
</blockquote>
<p>
会社に雇ってもらった場合、
配属された部署の上司が「換金してくれる人」になります。
もちろん上司が一人でお金を稼いでくるわけではありませんが、
技術者から見れば、
自身の能力に対して評価し給料を決めてくれるわけですから、
自身の能力を「換金してくれる人」と言ってもいいでしょう
(正確に言えば、換金してくれる人たちの集団の窓口的存在ですね)。
</p>
<p>
ところが、ここに一つ問題があります。
技術者に得手不得手があるのと同様、
「換金してくれる人」にも得手不得手があります。
技術者からすれば、
私はこんなに優れた能力を持っているのに、
どーして換金してくれないんだと思うのと同様、
「換金してくれる人」からすれば、
私はこーいう技術ならお金に換えられるのに、
どーしてそういう技術を持っている人がいないんだと思っていたりします。
</p>
<p>
「能力を上司が正当に評価してくれない」と不満に思っている場合、
十中八九その上司は、
「求める能力を部下が持っていない」と不満に思っているはずです。
このような状況で、
部下が上司に自身の能力をアピールして事態が改善するでしょうか。
きっと上司はこう思うはずです: 
「そんな能力はお金にならない」。
</p>
<p>
より正確に言えば、
その上司が換金できる分野と、
技術者である部下の得意分野とが一致していないだけなんですが、
部下が自分の得意分野以外のことに興味がないのと同様、
上司は自分が換金できない分野には興味がありません。
そんな上司に執拗にアピールすれば、
事態を改善するどころか悪化させかねません。
技術者がすべきことは、
自身の能力を上司が換金できないのであれば、
他の「換金してくれる人」を探すことです。
</p>
<p>
ところが、
前述の N さんをはじめ多くの技術者は、
逆のことをやってしまいます。
「換金してくれる人」を探すのではなく、
上司に「換金してくれ」と懇願したり、
あるいはそれが却下されると、
もう世界にはただ一人も換金してくれる人はいないと
探すのをあきらめてしまったりするのです。
</p>
<p>
冷静に考えれば、
これは全くナンセンスであることが分かりますよね?
一口に IT (情報技術) と言っても、
様々な分野があります。
ある技術者の得意分野を最もうまく換金できる人が、
たまたまその人の上司だった、
なんてことがもし起これば、
それはすごくラッキーなことだと思いますが、
そんな幸運がそうそう起こるはずはありません。
</p>
<p>
自身の技術を上司が換金してくれなかったとしても、
そんなことは確率からいえば 
「よくあること」 なわけで、
決してその技術が 「お金にならない」 ことを意味しません。
自身の技術が上司に評価されないときこそ、
より積極的に、上司以外の人に向かって、
自身の技術をアピールすべきでしょう。
</p>
<p>
より多くの人にアピールすれば、
それだけ「運命の人」にめぐりあう確率は高まります。
「この分野にかけては誰にも負けない」という得意分野を持っている人は、
より多くの人へ、
部署内だけでなく社内全体へ、
社内だけでなくより広い世界に対して、
どんどんアピールしていって欲しいと思います。
探す範囲を広げていけば、
その能力を換金してくれる人がきっと見つかるはずです。
</p>]]> 
</content>
<author>
<name>klab_sengoku</name> 
</author>
</entry>

<entry>
<title>ひたすらコンピュータに没頭した学生時代</title> 
<link rel="alternate" type="text/html" href="http://sengoku.blog.klab.org/archives/64770013.html" />
<modified>2007-12-19T12:00:29Z</modified> 
<issued>2007-12-19T21:00:15+09:00</issued> 
<id>tag:blog.livedoor.jp,2008:klab_sengoku.64770013</id> 
<summary type="text/plain">
あすなろ blog の 
CTO キャリアライフインタビューを受けました。
私は普段、
昔話はできるだけしないように気をつけていた
(だって「老害!」って思われちゃいますからね)
のですが、
このインタビューでは冒頭いきなり


そもそもコンピュータに興味を持ったき...</summary> 
<dc:subject>技術と人材育成と経営</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://sengoku.blog.klab.org/archives/64770013.html">
<![CDATA[<p>
あすなろ blog の 
<a href="http://blog.pasonatech.co.jp/special_contents/cto_interview/cto-87/5734.html">CTO キャリアライフインタビュー</a>を受けました。
私は普段、
昔話はできるだけしないように気をつけていた
(だって「老害!」って思われちゃいますからね)
のですが、
このインタビューでは冒頭いきなり
</p>
<blockquote>
そもそもコンピュータに興味を持ったきっかけから教えていただけますか
</blockquote>
<p>
と聞かれてしまい、
封印していた過去が一気に吹き出してしまいました。
なんせ 30年近い昔のことですから、
最近コンピュータを始めた人にとっては
何の興味も持てないんじゃないかとちょっと心配です
(インターネット元年であり Windows ブレイクの年でもある 1995年も、
私の感覚だと「つい最近」の出来事だったりします ^^;)。
</p>
<p>
そして今日は、
<a href="http://japan.cnet.com/interview/tech/story/0,2000055961,20363513,00.htm">「Commodore 64」の生みの親、J・トラミエル氏インタビュー</a>
という記事を見つけてしまいました。
</p>
<p>
Commodore !
</p>
<p>
<a href="http://ja.wikipedia.org/wiki/PET_2001">Commodore PET 2001</a> !
</p>
<p>
<a href="http://ja.wikipedia.org/wiki/VIC-1001">Commodore VIC-1001</a> !
</p>
<p>
なにもかも懐かしい !
昔の記憶がどんどんよみがえってきます。
</p>
<blockquote>
パーソナルコンピュータの歴史に最も大きな影響を与えた人物について語るとき、
人はよく、Steve Jobs氏、Steve Wozniak氏、Bill Gates氏、Paul Allen氏、
Gordon Moore氏、Andy Grove氏などの名前を挙げる。
<br />
だが、確実に彼らと同じグループに属する人がもう1人いる。
Commodoreの創業者で、後にAtariの最高経営責任者（CEO）を務めた 
Jack Tramiel氏だ。 
「Commodore PET」や「Commodore VIC-20」、
さらに、パーソナルコンピュータ史上最も販売台数が多いとされる
「Commodore 64」（C64）を世に送り出した人物として、
Tramiel氏は、他の誰よりも強い影響力を持っていたのかもしれない。
<div align="right"><a href="http://japan.cnet.com/interview/tech/story/0,2000055961,20363513,00.htm">「Commodore 64」の生みの親、J・トラミエル氏インタビュー</a> から引用</div>
</blockquote>
<p>
私に最も大きな影響を与えたのは、
Apple でもなく、MS Basic でもなく、8080 CPU でもなく、
PC-8001 でもなく、Commodore でした。
<a href="http://blog.pasonatech.co.jp/special_contents/cto_interview/cto-87/5734.html">CTO インタビュー</a>では、
「なぜかはじめからコンピュータが好きだった」と答えたのですが、
中学校での PET 2001 との出会いがなければ今の私は無かったかも知れません。
</p>
<blockquote>
中学3年生になって、だんだんBasicでゲームを作るほかに、
もっと下のレベルでプログラミングができるということがわかってきて、
機械語と呼ばれていた言語に興味を持つようになりました。
<div align="right"><a href="http://blog.pasonatech.co.jp/special_contents/cto_interview/cto-87/5734.html">CTO キャリアライフインタビュー</a>から引用</div>
</blockquote>
<p>
インタビューの時は忘れていたのですが、
私が機械語 (マシン語。メモリ上で即実行可能なバイナリのことです) 
を学ぶきっかけになったのは、
<a href="http://www.st.rim.or.jp/~k-uehara/computer/vic1001.html">当時コモドールジャパンが発行していた小冊子「VIC!」</a>でした。
この小冊子のコラムに、
機械語の簡単な紹介があって、
EA (16進コード) も機械語の命令の一つ、といったことが書かれていたのでした。
0xEA は 6502 CPU では NOP 命令なのですが、
そのコラムは、
「NOP は何もしない、という命令ですが、
読者の皆さんは何もしないのではなく、
VIC をきっかけにコンピュータを学んでいって欲しい」といった主旨の言葉で
しめくくられていました。
</p>
<p>
このコラムがきっかけとなって、
なんとかして EA 以外の命令も知りたいと思うようになりました。
今と違ってインターネットも検索エンジンもありませんから、
当時中学生だった私が 
<a href="http://6502.org/documents/datasheets/mos/mos_65ce02_mpu.pdf">6502</a>
の命令セットを見つけ出すことは難しく、
それだけに一層「切望感」がつのったのでした。
</p>
<blockquote>
私が初めてコンピュータに触れたのは、中学一年生の終わり頃である。
「マイコン部」なるものがあって、 
3台のCommodore PET 2001を 20人以上の部員で使っていた。
しかも「部活動」は週一回 50分ほどだったと記憶しているので、 
PET 2001 に触れるのは、二週間に一度、25分だけ、
しかも二人で一台を使う形だった。
最初のうちは BASIC を使って簡単なゲームなどを書いていたが、 
6502 のインストラクションセットをどこからか見つけてきて 
(どこで見つけたのだろう？
当時はその手の資料を中学生が見つけることは、かなり難しかったはず)、
ハンドアセンブルしたコードを BASIC の poke 文でメモリに書いて
実行させて遊んだりした。
<div align="right"><a href="http://blog.gcd.org/archives/50415925.html">断片的な知識と体系的な知識</a> から引用</div>
</blockquote>
<p>
いまさらですが、
現代は便利な世の中ですねぇ...
<a href="http://6502.org/documents/datasheets/mos/">the 6502 microprocessor resource</a> なんてページが簡単に見つかるのですから...
こんなページを中学生時代の私が見たら、
「宝の山」を発見した感激で卒倒したことでしょう。
当時の私が苦労の末ついに見つけたのは、
<a href="http://6502.org/documents/datasheets/mos/mos_65ce02_mpu.pdf">65CE02 Microprocessor</a> の 10, 11 ページの表だったのではないかと思います。
</p>]]> 
</content>
<author>
<name>klab_sengoku</name> 
</author>
</entry>

<entry>
<title>面接FAQ: Tech総研「転職体験談」の取材を受けました</title> 
<link rel="alternate" type="text/html" href="http://sengoku.blog.klab.org/archives/64599336.html" />
<modified>2008-01-17T06:28:08Z</modified> 
<issued>2007-08-07T07:04:57+09:00</issued> 
<id>tag:blog.livedoor.jp,2008:klab_sengoku.64599336</id> 
<summary type="text/plain">
前回、
思い出したように「面接FAQ」を再開したのにはワケがあります。
Tech総研さんの「転職体験談」の取材を受けることになりまして、
それが、
あらためて私の面接のやりかたを振り返るきっかけになったのでした。
「転職体験談」というのは、
「転職を果たしたエ...</summary> 
<dc:subject>技術と人材育成と経営</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://sengoku.blog.klab.org/archives/64599336.html">
<![CDATA[<p>
<a href="http://sengoku.blog.klab.org/archives/64556874.html">前回</a>、
思い出したように「面接FAQ」を再開したのにはワケがあります。
Tech総研さんの「転職体験談」の取材を受けることになりまして、
それが、
あらためて私の面接のやりかたを振り返るきっかけになったのでした。
「転職体験談」というのは、
「<a href="http://rikunabi-next.yahoo.co.jp/tech/docs/ct_s01300.jsp?p=017">転職を果たしたエンジニアと面接官が当時を再現</a>」する連載企画で、
「応募者と面接官それぞれの言葉の真意や、
面接でチェックされるポイントをレポート」しようというものだそうです。
</p>
<p>
取材中は好き勝手なことを言いまくったので、
どのようなページにまとまるかと内心ドキドキしていたのですが (^^;)、
無難にまとまったようでホッとしています。
さすがはプロですね。
</p>
<blockquote>
<a href="http://rikunabi-next.yahoo.co.jp/tech/docs/ct_s03600.jsp?p=001119">携帯電話関連を中心に独自技術で業界を走るKLabへ</a><br />
<br />
携帯電話関連のさまざまな独自技術で知られるKLab（クラブ）は、
エンジニアに対する考え方が他社とは一味違う。
現時点での技術力や知識、担当した仕事の売り上げよりも、
｢技術が好き｣から発する、挑戦や技術上の本質に対する継続的改善を尊ぶ。
また、技術力のみで昇格できる社内制度も設けている。<br>
<div align="right">（取材・文／須田忠博　総研スタッフ／高橋マサシ）作成日：07.07.30</div>
<br />
応募したエンジニア: 富田陽介さん（当時25歳）<br />
企業の面接担当者: 取締役CTO 仙石浩明氏<br />
募集職種: 技術力次第でCTOを目指せる研究開発職<br />
<br>
Part1 転職の動機<br />
Part2 技術志向性の強さ<br />
Part3 現時点での関心<br />
</blockquote>
<p>
このような連載企画は、
応募者にとっては、
面接を受ける前にどんなことに注意すればいいかが分かるわけで、
とても参考になるのだろうと思いますが、
実は求人側の企業にとっても
面接のやり方を第三者の目で見てもらえる機会であるわけで、
とても有意義であると感じました。
</p>
<p>
求職側は、いろいろな会社の面接を受ければ、
どんな面接があるのか実地に知ることができますが、
求人側は、他社がどんな面接をしているかあまり知る機会はないですし、
まして自分達の面接が第三者の目から見るとどう映るのか、
教えてもらう機会は皆無ですから...
</p>
<p>
もちろん取材なので、忌憚のない意見を言ってもらえるわけではないのですが、
取材していただいた Tech総研の高橋マサシ様曰く:
</p>
<blockquote>
現在の業務内容も転職の動機も重視せず、
「いかに技術が好きか」で人を見る面接。
この連載をほぼ50回続けていますが、
初めてのケースでした。
このことを仙石氏に話すと、
「えっ、他社はどんな面接なんですか？」と逆に驚いた様子。
数々の応募者ではなく、あなたが、いちばん技術が好きなんですよね。
<div align="right"><a href="http://rikunabi-next.yahoo.co.jp/tech/docs/ct_s03600.jsp?p=001119">転職体験談: 携帯電話関連を中心に独自技術で業界を走るKLabへ</a> から引用</div>
</blockquote>
<p>
やたらに「こんな面接は初めて見た」と強調されるので、
逆にこちらが驚いてしまいました。
面接して採用した技術者が入社後どのくらい伸びるかは、
その人がどのくらい技術が好きかにかかっているわけで、
なら「どれだけ技術が好きか」をとことん聞くべきだと思うのですが、
他社の面接はそうじゃないのですかねぇ...?
</p>
<p>
なお、
「<a href="http://rikunabi-next.yahoo.co.jp/tech/docs/ct_s03600.jsp?p=001119">携帯電話関連を中心に独自技術で業界を走るKLabへ</a>」ページ末尾にある:
</p>
<blockquote>
このレポートに関連する求人情報です<br />
チェックしてみよう！<br />
<div align="center">
KLab株式会社<br />
現在の募集職種はこちら<br />
詳細をみる</div>
</blockquote>
<p>
をクリックすると、
「この企業は現在リクナビＮＥＸＴ上で募集を行っていません」などと
表示されます (^^;) が、
私のブログを読んで下さってるかたなら、
リクナビNEXT (あるいはその他の求人媒体) で募集を行なっていないからといって、
応募できないわけではない、ということは
よくご理解いただけてますよね？
</p>
<p>
一応、念のために申し上げておきますと、
KLab (に限らず大多数のベンチャーも同様だと思いますが) では、
常に<a href="http://lab.klab.org/modules/mediawiki/index.php/%E6%8A%80%E8%A1%93%E8%80%85%E5%8B%9F%E9%9B%86">直接応募を受付けております</a>。
媒体やエージェント経由でないと応募を受付けないなどということは
一切ありませんし、
どこ経由で応募したかということは選考には一切影響しません。
さらに言えば「私は KLab へ入ってこれがやりたいんだ!」と
言ってくださるかたならば、
現在の募集職種にかかわらず採用を検討します。
やりたいことが明確になっていることこそが、
技術者の成長にとって一番重要なことだと思うからです。
</p>
<blockquote>
技術を学ぼうとするなら、その時点での実力はサテオキ、
「伝わる状態」にかけては自分が一番だと自信を持って言い張れる 
(つまり、その技術を学びたいという情熱にかけては誰にも負けないと言いきれる) 
状態からスタートしなければならないのです
<div align="right"><a href="http://sengoku.blog.klab.org/archives/53861672.html">技術者の成長に役立つ会社とは？(1)</a> から引用</div>
</blockquote>
]]> 
</content>
<author>
<name>klab_sengoku</name> 
</author>
</entry>

<entry>
<title>面接FAQ: 素人にも分かるように説明してください</title> 
<link rel="alternate" type="text/html" href="http://sengoku.blog.klab.org/archives/64556874.html" />
<modified>2007-08-15T06:00:37Z</modified> 
<issued>2007-07-10T06:58:08+09:00</issued> 
<id>tag:blog.livedoor.jp,2008:klab_sengoku.64556874</id> 
<summary type="text/plain">
久しぶりに「面接 FAQ」シリーズの続きを書いてみます
(前回書いたのは一年以上前なのでずいぶん間が空いてしまいました)。
私の面接というと最終面接であることが多いのですが、
履歴書の備考欄に「役員との面談希望！」と書いてある場合など、
一次面接から私が面接...</summary> 
<dc:subject>技術と人材育成と経営</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://sengoku.blog.klab.org/archives/64556874.html">
<![CDATA[<p>
久しぶりに「面接 FAQ」シリーズの続きを書いてみます
(前回書いたのは一年以上前なのでずいぶん間が空いてしまいました)。
私の面接というと最終面接であることが多いのですが、
<a href="http://dsas.blog.klab.org/archives/50946231.html">履歴書の備考欄に「役員との面談希望！」</a>と書いてある場合など、
一次面接から私が面接することもあります。
(最終の) 役員面接というと、
多くの人が通りいっぺんの面接だと思うらしく、
役員面接で技術的な突っ込みを受けて、
応募者が戸惑うケースが多々ありました。
</p>
<p>
私の面接で、
比較的頻度が高い私の質問パターンを紹介し、
応募者がどう答えることができていたら採用になっていたか、
振り返ってみようというのがこの「面接 FAQ」シリーズの主旨です。
FAQ すなわち、
面接で(私に)よく聞かれること、
面接官自身が語る面接攻略法。
</p>
<p>
「面接 FAQ」は続き物ですので、
以下のページも参照して頂けると幸いです。
</p>
<blockquote>
(1) <a href="http://sengoku.blog.klab.org/archives/50137977.html">高い技術力って例えばどんなことですか？</a><br>
(2) <a href="http://sengoku.blog.klab.org/archives/50165636.html">何か質問はありませんか？</a><br>
(3) <a href="http://sengoku.blog.klab.org/archives/50176411.html">前職でいくらもらっていましたか？</a><br>
(4) <a href="http://sengoku.blog.klab.org/archives/50186087.html">仮に、何をしてもいい、と言われたら、何をしますか？</a><br>
(5) <a href="http://sengoku.blog.klab.org/archives/50222351.html">「人の役に立つことをしたい」と言う技術者の卵たち</a><br>
</blockquote>

<p>
面接というと、
「採用してやる」といった態度をとる面接官がいます。
つまり、
会社が求める資質を応募者が持っているかどうかを判断するのが、
面接官の役目だと思っている人ですね。
様々なチェックポイントを次から次へと確認し、
一つでも条件を満たさなければそこで不採用と判断します。
チェックポイント以外でどんなに優れた点を持っていようとお構い無しです。
</p>
<p>
その面接官にとっては、
採用した人にやってもらう仕事が明確に決まっているから、
その仕事をする能力があるかどうかが一番の関心ごとなんでしょうけど、
もしかしたら面接官よりよっぽど優れた長所を持っているかも知れないのに、
それを見ようともせずに不採用を決めてしまうのは、
モッタイナイ話ですよね？
</p>
<p>
私は根が貧乏性なので、そんなモッタイナイことは決してできません。
応募者が優れた点を持っているのなら、
たとえそれが KLab の事業と関係なくても、
応募して頂いたのは何かの縁ですから、
是非一緒に働きたいと思ってしまうわけです。
特定の分野に優れた能力を発揮できる人に入社してもらえるなら、
その分野の事業を始めてしまってもいいとさえ思っています。
</p>
<p>
なので、どんな分野であれ、
応募者が一番得意なことについて、
根掘り葉掘り質問させてもらうことになります。
私が多少なりとも知っている分野なら、
(面接で聞くのは不適切と思われるような) 異常に細かい点、
例えば実装上の細かい工夫とかまで聞いてしまいます。
</p>
<p>
そんな細かいことまでいちいち聞いていたら、
面接時間が何時間あっても足らないんじゃないか、
と驚かれるかたもいらっしゃるのですが、
私の面接では応募者の職務経歴を一通り聞くなんてことはせず、
応募者が一番自慢したいことだけを徹底的に聞くのがメインなので、
時間が許す限り掘り下げてお聞きするわけです。
</p>
<p>
しかしながら、
もちろん私が知らない分野もたくさんありますし、
コンピュータの分野であっても私がニガテな分野もあります。
私が何も知らないような分野だと、どんどん掘り下げて質問する、
というのは無理がありますから、そんなときは開き直って、
</p>
<blockquote>
<div align="center">素人にも分かるように説明してください</div>
</blockquote>
<p>
って聞いちゃいます。
こう聞かれたら、なんだこんなことも知らないのか、
などと呆れずに丁寧に説明して頂けると幸いです。
</p>
<p>
応募者が、ずぶの素人である面接官に丁寧に説明したところで、
所詮は素人なんだから、
応募者がその分野についてどのくらい優れているか面接官に伝わるはず無い、
って思う人はいないでしょうか？
</p>
<p>
確かに、その分野のことについては何も知らないのですから、
その分野における応募者のレベルがどのくらいなのか 
(例えば、国内で十指に入るのか、あるいは平均くらいなのか、とか)
は分かりません。
しかし説明の仕方だけでも応募者の能力はかなりのことが分かると
私は考えています。
</p>
<p>
「素人にも分かるように説明してください」と求められたとき、
専門用語を、平易な言葉で置き換えようと四苦八苦する人がいます。
勢い余って、さほど「専門的」でない言葉すら無理矢理言い換えようとして、
却って分かりにくくなったりすることもあります。
</p>
<p>
確かに専門用語だらけの説明は素人にとって分かりにくいし、
専門家の話が分かりにくいのは専門用語の濫用にある、と
考える人が多いのも事実でしょう。
専門用語だらけのマニュアルが非難されることもありますしね。
</p>
<p>
しかし、専門用語だけの問題でしょうか？
専門用語の全てを解説した用語辞典を引きまくれば専門書が読めるかというと、
そんなことは決してありませんよね？
</p>
<p>
専門用語の意味さえ分かれれば、どんな専門分野でも理解できるでしょうか？
こう聞けば誰でも、そんなはずはないといいますよね？
つまり、
専門用語の置き換えるだけでは、
決して「素人にも分かるように」はならないのです。
</p>
<p>
どんな専門分野でもそうだと思いますが、
その分野特有の考え方、大げさに言えば思想のようなものがあります。
その分野の専門家なら皆が共有している「思想」なので、
あらためて考えてみたりはしませんが、
同じ「思想」を共有している専門家同士だから、
スムーズな意思疏通が可能になります。
</p>
<p>
逆に言えば、背景思想を共有していない門外漢には、
専門家同士の会話は「宇宙語」に聞こえてしまいます。
たとえ使っている単語自体は平易な言葉ばかりで、
専門用語が一切含まれていなかったとしても、
背景思想を共有していない素人には、
やはり「宇宙語」に聞こえてしまうのです。
</p>
<p>
「素人にも分かるように説明してください」と求められたとき、
話題にのぼった事項の説明は一時棚上げして、
まず背景思想から説明する人、
こういう人は間違いなく頭がいい人だと思います。
相手と自分が共有している「思想」は何か、
相手が共有していない「思想」は何か、
そして相手の「思想」に何を追加すれば理解してもらえるようになるのか、
そういったことを考えながら話せる人は、
きっと優秀な人なのだと思います。
</p>
<p>
いろんな人に、いろんな分野について説明してもらったことがありますが、
実に楽しそうに説明してくださるかたもいらっしゃいます。
私が分からない点を質問すると、
よくぞ聞いてくれたと嬉々として答えてくださるので、
とても話が盛り上がります。
そういう人は、
(面接中の感想としては気が早いんですが)
KLab に入社して一緒に働けるようになるのが、
とても待ち遠しく感じられます。
</p>
]]> 
</content>
<author>
<name>klab_sengoku</name> 
</author>
</entry>

<entry>
<title>シアトル モノレールの謎</title> 
<link rel="alternate" type="text/html" href="http://sengoku.blog.klab.org/archives/64518131.html" />
<modified>2008-01-17T06:28:08Z</modified> 
<issued>2007-06-18T06:30:35+09:00</issued> 
<id>tag:blog.livedoor.jp,2008:klab_sengoku.64518131</id> 
<summary type="text/plain">
先日、シアトルへ行ってきました。


シアトルと言えば、モノレール。


Westlake Center Mall 駅 (次の写真) と Seattle Center 駅を結んでいます。
シアトル万博 (1962年) の時に開業したそうです。



上の写真だと分かりにくいかも知れませんが、
モノレー...</summary> 
<dc:subject>その他</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://sengoku.blog.klab.org/archives/64518131.html">
<![CDATA[<p>
先日、シアトルへ行ってきました。
</p>
<p>
シアトルと言えば、<a href="http://www.seattlemonorail.com/">モノレール</a>。
</p>
<p>
Westlake Center Mall 駅 (次の写真) と Seattle Center 駅を結んでいます。
<a href="http://www.historylink.org/essays/output.cfm?file_id=2290">シアトル万博</a> (1962年) の時に開業したそうです。
</p>
<img alt="Westlake Center" src="http://www.gcd.org/sengoku/picts/seattle-monorail-westlake.jpg" width=320 height=320>
<p>
上の写真だと分かりにくいかも知れませんが、
モノレールの軌道が二本あります。
向かって左側の軌道に青色の車両が停車していますね。
</p>
<p>
同じ場所の軌道の部分を反対側から見ると、<br />
↓ こんな感じ。
</p>
<img alt="deadend" src="http://www.gcd.org/sengoku/picts/seattle-monorail-deadend.jpg" width=320 height=240>
<p>
初めてこの Westlake Center Mall 駅を見たとき (2007年5月)、
とても強い違和感を感じてしまいました。
そもそも軌道が二本あるのに、
プラットホームが片側にしかないのがとても不自然でしたし、
↑ の写真を見れば多くの方に同意して頂けるのではないかと思いますが、
二本の軌道が異常に接近しています。
こんなんで本当にすれ違えるのか？と、
誰もが疑問に思うのではないでしょうか。
</p>
<p>
Westlake Center Mall 駅と Seattle Center 駅とは 1.6km ほどしか離れておらず、
途中に駅がないのはもちろん、
二つの軌道を乗り換えるためのポイント (転轍機) もありません。
つまり、一方の軌道を走る車両は、決して、
もう片方の軌道を走ることはできません。
</p>
<p>
しかし、冒頭の Westlake Center Mall 駅の写真を見ると、
向かって左側の軌道は、
横のショッピング モールの建物と接していて乗降できそう
(実際、モール 3階にモノレール乗り場があります)
ですが、
向かって右側の軌道には、
乗降のためのプラットホームが見当たりません。
私はてっきり、右側の軌道は現在は使用されていないのだと思っていました。
</p>
<p>
ところが、別の日に反対側の Seattle Center 駅を訪れてみると、
Westlake Center Mall 駅で見た青色の車両の他に、
赤色の車両がありました。
下の写真だとちょっと分かりにくいかも知れませんが、
向かって右側の軌道に青色の車両が停っていて、
向かって左側の軌道に赤色の車両が走っています
(ちょうどこの駅に入ってきたところです)。
</p>
<img alt="Seattle Center" src="http://www.gcd.org/sengoku/picts/seattle-monorail-center.jpg" width=320 height=240>
<p>
トポロジー的に考えて、
赤色の車両が走っている軌道は、
Westlake Center Mall 駅へ行くと、
ショッピング モールの建物に接していない側の軌道につながっているはずです。
両方の駅で見た軌道が互いにどのようにつながっているかは、
次図のように、
モノレールの路線に赤色の軌道と、青色の軌道を書き入れてみると一目瞭然ですね。
</p>
<img alt="Monorail Route" src="http://www.gcd.org/sengoku/picts/seattle-monorail-route.jpg" width=400 height=200>
<p>
赤色の車両が走っている軌道は、
ショッピング モールの建物に接していないのに、
どうやって乗降するのでしょうか？
とても謎です。
</p>
<p>
<a href="http://www.gcd.org/sengoku/picts/seattle-monorail.ja.html#answer">答はこちら</a>。
</p>]]> 
</content>
<author>
<name>klab_sengoku</name> 
</author>
</entry>

<entry>
<title>技術者の成長に役立つ会社とは？(2)</title> 
<link rel="alternate" type="text/html" href="http://sengoku.blog.klab.org/archives/54165909.html" />
<modified>2007-05-27T09:40:01Z</modified> 
<issued>2007-05-16T07:34:19+09:00</issued> 
<id>tag:blog.livedoor.jp,2008:klab_sengoku.54165909</id> 
<summary type="text/plain">
技術者の成長に役立つ会社とは？(1)

をとても多くの方々に読んで頂けました。
頂いたコメントや、
はてなブックマークに頂いたコメントを見ると、
賛同/批判 両方の立場から様々なご意見がありますね。
拙文が多くの方々の考えるきっかけになったのだとすれば、
書...</summary> 
<dc:subject>技術と人材育成と経営</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://sengoku.blog.klab.org/archives/54165909.html">
<![CDATA[<p>
<a href="http://sengoku.blog.klab.org/archives/53861672.html">技術者の成長に役立つ会社とは？(1)</a>
<a href="http://b.hatena.ne.jp/entry/http://sengoku.blog.klab.org/archives/53861672.html"><img style="border:0;" src="http://b.hatena.ne.jp/entry/image/http://sengoku.blog.klab.org/archives/53861672.html" alt="" /></a>
をとても多くの方々に読んで頂けました。
<a href="http://sengoku.blog.klab.org/archives/53861672.html#comments">頂いたコメント</a>や、
<a href="http://b.hatena.ne.jp/entry/http://sengoku.blog.klab.org/archives/53861672.html">はてなブックマークに頂いたコメント</a>を見ると、
賛同/批判 両方の立場から様々なご意見がありますね。
拙文が多くの方々の考えるきっかけになったのだとすれば、
書いた甲斐があるというものです。
特に学生さんにとっては、これから自身の人生を切り拓いていくのですから、
いま自分の将来について考えることは、
必ず後の人生にとってプラスになることでしょう。
</p>
<p>
以下に述べるのは、私が考える「技術者の成長に役立つ会社」の条件です。
他の人は異なった考えを持つかもしれませんし、
私自身も常に考え続けているので、
「役立つ会社」の条件が変ってくることがあるかも知れません。
しかし、
「技術者の成長にとって一番役に立つ会社を目指したい」というその思い自体は、
私が技術の責任者であり続ける限り、変らず持ち続けたいと思っています。
</p>

<h2>成長を邪魔しない会社</h2>
<p>
エラソーに「技術者の成長に役立つ会社」の条件と言っておきながら、
最初の条件が「邪魔しない」かよ、
えらく後ろ向きな条件だな、
という非難の声が聞こえてきそう (^^;) ですが、
</p>
<blockquote>
<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4087202402/gcd-22/ref=nosim">上司は思いつきでものを言う</a>(新書)<br />
橋本 治 (著)
</blockquote>
<p>
にも書かれているように、
</p>
<blockquote>
会社は上司のピラミッドを骨格として、現場という大地の上に立っている。
「上から下へ」という命令系統で出来上がっていて、
「下から上へ」の声を反映しにくい。
部下からの建設的な提言は、
拒絶されるか、拒絶はされなくても、
上司の「思いつき回路」を作動させてしまう。
</blockquote>
<p>
ということは、極めてありがちなのではないかと思います。
つまり、上司は体面を保つ必要がありますから、
部下に接するとき、
部下の良いところを誉めるだけではなく、
つい「粗探し」をして一言追加したくなるものだと思います。
</p>
<p>
だって、部下のことを 100% 肯定するだけでは、
上司の存在価値が危うくなりますからね～。
なにか部下の至らない点を無理矢理にでも見つけ出して、
教訓めいたことを言って上司の威厳を保ちたくなるものでしょう。
</p>
<p>
もちろん、部下の狭量な考えを正すために、
いろんな意見を言ってやることが必要なケースもあるでしょう。
「思いつきで」言うことが全て悪いと言うつもりもありません。
しかし、
部下の短所を矯正することばかりに熱中していては、
部下が技術者として成長することを妨げることになりかねません。
例えば、
</p>
<blockquote>
キミは技術は優れているんだが、
もうちょっと仲間とうまく仕事をやっていくよう努力してもらえんかね？
キミも社会人なんだから学生気分は早く捨てて、
チームワークを重視して仕事してもらわんと困るよ。
</blockquote>
<p>
なんて言ってないでしょうか？
技術が (おそらく上司よりも) 優れている部下に対し、
その得意な技術をもっと伸ばすことよりも、
その部下がニガテとしていること、
例えばコミュニケーション能力を
「人並みに」身につけることを優先するよう要求してしまうわけです。
</p>
<blockquote>
「感情的コミュニケーション」は、
若いうち (例えば 30歳前半まで) は手を出さないようにして欲しい
コミュニケーション能力である。
特に研究者や技術者を目指そうとする若い人たちには、
周りの人がどう思うかなんかは気にせず、
(「空気嫁！」などの罵倒は無視して) 我が道を進んで欲しい。
<div align="right"><a href="http://blog.gcd.org/archives/50923628.html">「人を動かす」感情的コミュニケーション能力と<br />「モノを動かす」論理的コミュニケーション能力</a><br />から引用</div>
</blockquote>
<p>
コミュニケーション能力なんて、
歳をとって頭が固くなってからでも充分身につけることができます。
そもそも技術者にとって「人並み」のコミュニケーション能力なんて、
どれほどの価値があるというのでしょう？
技術者としての成長を考えるなら、
若いときにしか学べない「技術の本質」を身につけることこそ、
優先すべきではないでしょうか。
</p>
<p>
以上は、積極的に「成長を邪魔する」ケースですが、
以下のように、消極的に「成長を邪魔する」ケースも、
ありがちなのではないかと思います。
</p>
<p>
すなわち、
技術者の成長を第一に考えるのなら、
それぞれの技術者が自身の能力をフルに発揮して、
得意なことをとことん伸ばすことができるような
活躍の場を与えるべきだと思うのですが、
現実の会社だとそういう「適材適所」は、
なかなか難しいケースが多いかも知れません。
適切な活躍の場を与えないというのは、
成長を邪魔しようと意図しているわけではないにせよ、
結果として邪魔しています。
</p>
<p>
例えば、
新入社員がある特定の分野において素晴らしい能力を持っていたとしても、
その分野の業務に先任者がいたらどうでしょうか？
その先任者を異動させてまで、
新人にその分野の業務を任せる、
という会社は多くはないでしょう。
むしろ、
新人が何が得意か検討して配属先を決めるというよりは、
人が足らない部署への配属を優先する会社の方が
多数派であるような気がします。
</p>
<p>
さらに言えば、
配属後も新人には雑用ばかりをやらせ、
能力を発揮できる仕事を任せない、
なんてこともあるのではないでしょうか。
上司と同様、
先輩にもメンツというのがありますから、
たとえ後輩の方が能力が高かったとしても、
それを素直に認めて立場を逆転させる (つまり先輩が新人の指示に従う) よりも、
新人の至らない点を無理矢理にでも見つけ出すことに熱中し、
雑用を押し付けることに終始してしまうものなのかも知れません。
</p>
<p>
会社ってのは、
部下や後輩の技術者の成長を邪魔してしまえ、とささやく誘惑に満ちています。
私自身、そういう誘惑に負けそうになることが全く無いと言えば嘘になります。
部下や後輩の技術者の成長を邪魔していないか、
常に自省し続けることこそ、
「技術者の成長に役立つ会社」の第一の条件と言えるのではないでしょうか。
</p>

<h2>技術者を「技術そのもの」で評価する会社</h2>
<p>
技術者が邪魔されずに成長できたとしても、
その成長を「技術そのもの」できちんと評価してあげられなければ、
片<!-- -->手落ちです。
技術的に成長したら成長したぶんだけ、
きちんと評価されて給料が上がる、
こうしてはじめて、
技術的に成長しようという意欲が継続するのだと思います。
</p>
<p>
こういう話をすると、
なぜ技術的に成長したからといって給料を上げる必要があるのか、
と思う人がいるかも知れません。
会社は技術者養成機関ではありませんから、
能力ではなく成果に対して報酬を支払いたい、
と思う人が出てくるのは当然でしょう。
では、「技術者の成果」とは何でしょうか？
</p>
<blockquote>
「技術者の成果」とは何でしょう？
<br />
技術者が作ったものから得られる売上でしょうか？
もちろん、それだけではないですよね？
「青色LED」のように最終的に莫大な利益を生み出したものは、
とても分かりやすい「成果」ですが、
サーバシステムの運用などのような縁の下の力持ちの仕事だって立派な成果ですし、
さらに、自分自身では何も生み出さなくても、
社内の技術者を育てることや、
<a href="http://dsas.blog.klab.org/">社内の技術をブログなどで発表</a>して会社の知名度を上げることなども、
立派な成果と言えるでしょう。
<div align="right"><a href="http://sengoku.blog.klab.org/archives/51661392.html">技術者を目指す学生さんたちへ</a> から引用</div>
</blockquote>
<p>
技術者という人材を「人財」すなわち会社の資産と考えるのであれば、
技術者の成長とは、「人財」の価値の増加、
すなわち会社の資産の増加を意味します。
売上は単にそのとき限りのフローに過ぎませんが、
<a href="http://blog.gcd.org/archives/50401867.html">技術者の成長はストック</a>となるわけです。
会計数字には現われにくいので見落とされがちなのですが、
技術者自身の成長こそ、
本来は最も評価されるべき「成果」と言えるのではないでしょうか。
</p>
<p>
しかしながら、
技術者の成長を「技術そのもの」で正当に評価することは、
容易ではありません。
「技術そのもの」で評価しようとすれば、
その技術分野の概要を理解している程度では全くダメで、
いざとなったら部下の仕事を代行できるくらいの技術力が、
評価する側に求められます。
</p>
<p>
もちろん、
いろんな得意分野を持つ部下たち全員において、
その仕事を完全に代行できることを上司に求めるのは無理な話でしょう。
部下全員の技術力のスーパーセットの技術力を上司の条件にしていては、
上司のなり手がいなくなってしまいます。
</p>
<p>
かといって、
半期ないし一年における部下の技術面での成長が、
どのくらい優れたものといえるのか評価できなければ、
つまり毎回「よくできました」「もっとがんばりましょう」などの
概要評価ばかりでは、
部下のモチベーションが下がってしまうことでしょう。
まして、技術面で部下の能力を評価するのを放棄して、
部下の関わったプロジェクトの売上高をそのまま部下の評価としていては、
技術的に成長しようというモチベーションを持続させることは不可能でしょう。
</p>
<p>
給料の一部が売上 (ないし利益等) に連動する、
ということはあってもいいとは思いますが、
技術力に連動する部分もあるべきで、
技術的に大きく成長したときはきちんと給料に反映させ、
あまり成長できなかったときは何が足らないのか、
きちんと指摘してあげるべきだと思うのです。
</p>
<p>
それには、
部下それぞれの得意分野について、
パフォーマンスの観点では部下に劣ることがあったとしても、
少なくとも技術内容の理解の観点では勝るとも劣らないことが
重要ではないでしょうか。
</p>
<p>
もちろん、これとて容易なことではありません。
部下が極めて優秀な場合、
その技術的背景をマトモに理解するには大変な労力が必要となるかも知れません。
つい、技術で評価するのを放棄して、
技術とは関係ない点を持ち出したくなるものだと思います。
しかし、
いくら大変でも、いくら時間がかかっても、
部下の技術を一生懸命理解しようとすることが重要だし、
理解しようと努力し続けてはじめて、
「技術力ではないところで部下を評価してしまえ」という誘惑に
打ち克つことができるのではないでしょうか。
</p>

<h2>得意分野を見つける余裕がある会社</h2>
<p>
現在の仕事が自身の得意分野に一致していて、
かつその仕事が好きであれば、
技術者にとってそれは理想的な仕事と言えるでしょう。
</p>
<blockquote>
一生の時間のうちのかなりの時間を仕事に費やすのですから、
一生かけて取り組みたいと思うようなことをすべきだと思うのです。
好きなことをやっててお金がもらえれば苦労はしない、
と多くの人は言うでしょう。
でも、本当に一生かけてもやりたいほど好きなことってありますか？
<div align="right"><a href="http://sengoku.blog.klab.org/archives/50186087.html">面接 FAQ (4)</a> から引用</div>
</blockquote>
<p>
しかし、
「やりたいこと」そのものズバリを、
最初に就職したときから仕事として
やり続けてきた、
という人は少数派でしょう。
(私を含めて) 多くの人は、
いろんなことをやっているうちに、
「これだ」という仕事に出会い、
それにのめり込んでいくものなのではないかと思います。
</p>
<p>
あるいは、
今の仕事が一番自分に向いていると思っていたとしても、
なにかのきっかけで他の分野のことをやってみたら、
その分野のほうが魅力的であると感じ、
どんどん引き込まれてやっているうちに、
そっちのほうが自分に向いていることに気づく、
なんてこともあるかも知れません。
</p>
<p>
だから、
本業以外にも、
業務と関係ないことでも、いろいろ挑戦して欲しいと思っています。
ふとしたきっかけで始めたことが、
もしかすると自身の隠れた才能が開花することに
繋がるかも知れないのですから。
</p>
<blockquote>
本業以外に熱中できる新分野を見つけた部下に対し、
「新分野を頑張るのはいいけど本業も忘れずにね」という忠告はするけど、
その新分野への取組みも大いに応援する、 
KLab(株)はそんな会社でありたいと思っています。
勤務時間の 10% は本業以外のことを好き勝手にやっていい、
もし見込みが出てきて周囲から認められるレベルになったら、
それを本業にしてしまってもいい、
という「どぶろく制度」を作ったのも、
熱中できることを見つけるチャンスを逃して欲しくない、という思いからです。
<div align="right"><a href="http://sengoku.blog.klab.org/archives/52433437.html">キャリアにおける「鶏と卵」 ── 「卵」を後回しにして欲しくない</a> から引用</div>
</blockquote>
<p>
本業の完璧な遂行もいいのですが、
自身の能力を最も発揮できる分野は一体何なのか考える余裕は持って欲しいですし、
技術者それぞれが最も自分に向いている仕事に出会えるように手助けすることこそが、
技術者のための技術会社の存在意義なのではないかと思います。
</p>
]]> 
</content>
<author>
<name>klab_sengoku</name> 
</author>
</entry>

<entry>
<title>システム管理者の ひろのぶさん、ご結婚おめでとうございます</title> 
<link rel="alternate" type="text/html" href="http://sengoku.blog.klab.org/archives/53962398.html" />
<modified>2007-05-07T07:31:28Z</modified> 
<issued>2007-05-01T08:48:34+09:00</issued> 
<id>tag:blog.livedoor.jp,2008:klab_sengoku.53962398</id> 
<summary type="text/plain">
ひろのぶさん、けいこさん、ご結婚おめでとうございます。


ご両家、ご親族の皆様、本日はまことにおめでとうございます。


どうぞ、おかけになって下さい。


私はひろのぶさんの勤務先であるKLab株式会社で
技術の責任者を勤めている仙石と申します。


...</summary> 
<dc:subject>技術と人材育成と経営</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://sengoku.blog.klab.org/archives/53962398.html">
<![CDATA[<p>
ひろのぶさん、けいこさん、ご結婚おめでとうございます。
</p>
<p>
ご両家、ご親族の皆様、本日はまことにおめでとうございます。
</p>
<p>
どうぞ、おかけになって下さい。
</p>
<p>
私はひろのぶさんの勤務先であるKLab株式会社で
技術の責任者を勤めている仙石と申します。
</p>
<p>
ひろのぶさんは、
KLab株式会社で技術者として働いているわけですが、
技術者と言っても当然いろいろな職種があるわけで、
ひろのぶさんはシステム管理者と呼ばれる役割を担っています。
</p>
<p>
普通の方々にとっては、
「システム管理者」というのは馴染みのない言葉かも知れません。
「管理者」というと管理職のことを思い浮かべるかたも多いかもしれませんが、
管理する対象は人間ではなくてコンピュータのシステムということになります。
平たく言えば、たくさんのコンピュータがきちんと動くよう見張る仕事です。
</p>
<p>
縁の下の力持ち的な仕事で、ある意味とても地味な仕事といってもよいでしょう。
コンピュータが正常に動いている限り、システム管理者とは空気のような存在で、
ともすると存在を忘れられがちになります。
</p>
<p>
そしてシステム管理者に注目が集まるのは、
コンピュータにトラブルが起きたときです。
何やってんだ、早よ直せ！そういう罵倒がシステム管理者に向けられます。
仕事がうまくいってコンピュータがきちんと動いているときは空気のように忘れられ、
失敗してコンピュータにトラブルが起きたときは非難の矢面にさらされる、
なんとも損な役回りであります。
</p>
<p>
だから、システム管理者を目指そうとする人は、
世間一般で言うと、そんなに多くはない。
さらに、技術を磨いてより高いレベルのシステム管理者を目指そうという人は、
よほどの変わり者といってもいいかもしれません。
</p>
<p>
でも、逆に言うと、レベルの高いシステム管理者というのはとても貴重な存在、
ということになります。
私の感覚で言うと、一人前のシステム管理者は、おそらく全国に 1000人もいない。
何十万人もいるコンピュータ技術者の中で、たった 1000人です。
割合で言うと 1% よりもずっと少ない。
そういう稀有な人材の一人が、ひろのぶさんというわけです。
</p>
<p>
そういう貴重な人材だからこそ、
もっとシステム管理者の地位を向上させたい、
トラブルが起きたときだけでなく、システム管理者がいい仕事をしたとき
&mdash;つまりコンピュータがいつもどおり動いているということなので、
あまり華々しさはないのですが&mdash;
そういうときにも、
システム管理者がきちんと評価されるような、
そういった会社でありたいと思っています。
</p>
<p>
コンピュータが順調に動いているとき、
システム管理者は
一見、なにもしていないようにも見えてしまうのですが、
実際には、トラブルを未然に回避すべく、
いろんな創意工夫をシステムに盛り込もうとしています。
あるいはシステムに普段と違う様子がないか
コンピュータの動作を常に気にかけています。
少しでも違った気配があったりすると、
とても心配して、気が気でなかったりします。
</p>
<p>
これはもう「愛情」と言ってしまってもいいかもしれません。
</p>
<p>
コンピュータのような無機物を「愛する」なんて言うと、
変人扱いされてしまいかねない今日このごろなのですが、
モノに対する愛を変なものと考える昨今の風潮は、
いかがなものかと思います。
</p>
<p>
古来から日本人は万物に霊が宿っていると考え、
様々なものを愛でてきました。
命あるものだけでなく、
そのあたりの石ころや、あるいや刀や兜など、
そういったものにも魂が宿っていると考え、
愛してきたのです。
</p>
<p>
そういうモノに対する愛が、
工芸品などの高い技術をはぐくんできたのだと思います。
現在、コンピュータに関する技術で日本は米国など諸外国に
大きく遅れをとっているわけですが、
その原因の一つは、
そういったモノに対する愛を忘れてしまったからなのかもしれません。
コンピュータだってソフトウェアだってもっと愛すべきだと思いますし、
そういう心が高い技術を生み出すのだと私は思います。
</p>
<p>
まとめますと、システム管理者の仕事というのは、
日ごろからコンピュータの具合に気を配り、
愛情を持って接し、
平穏な日常を最大の目標としつつ、
創意工夫を盛り込むことを忘れない、
そういう仕事です。
</p>
<p>
こうしてみると、システム管理ってのは、
円満な家庭を築くのと驚くほど共通点が多いのではないかと思います。
</p>
<p>
そういえば、
弊社においてもシステム管理者ってのは愛妻家が多いような気がします。
</p>
<p>
あ、もちろん、他の職種の人の家庭が円満ではない、と
言っているわけではないです、念のため。
</p>
<p>
優秀なシステム管理者であるひろのぶさんなら、
きっと素晴らしく円満かつ幸せな家庭を築いていける、、
そんな気がします。
</p>
<p>
というわけで、
なんとか無事、
お話が結婚のお話に結びついたところで、
お祝いの言葉とさせていただきます。
</p>
<p>
本日は誠におめでとうございます。
</p>
]]> 
</content>
<author>
<name>klab_sengoku</name> 
</author>
</entry>

<entry>
<title>技術者の成長に役立つ会社とは？(1)</title> 
<link rel="alternate" type="text/html" href="http://sengoku.blog.klab.org/archives/53861672.html" />
<modified>2007-12-21T10:37:05Z</modified> 
<issued>2007-04-24T07:46:39+09:00</issued> 
<id>tag:blog.livedoor.jp,2008:klab_sengoku.53861672</id> 
<summary type="text/plain">
ここ何ヵ月か、就職活動中の多くの学生さん達と話す機会を得ました。
いろんな方々と話しているうちに、
会社選びをしているはずの当の学生さん達の多くが、
いい会社の条件について確固たる基準を持っているわけではない、
という思いをますます強くしました。


...</summary> 
<dc:subject>技術と人材育成と経営</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://sengoku.blog.klab.org/archives/53861672.html">
<![CDATA[<p>
ここ何ヵ月か、就職活動中の多くの学生さん達と話す機会を得ました。
いろんな方々と話しているうちに、
会社選びをしているはずの当の学生さん達の多くが、
いい会社の条件について確固たる基準を持っているわけではない、
という思いをますます強くしました。
</p>
<p>
「安定している会社」「福利厚生が充実している会社」「技術を教えてくれる会社」
などなど、
なんとなく「いい会社」のイメージを思い描いているだけで、
それが自身の人生にどう役に立つか、
筋道だった考えを持っているわけではないことに
改めて驚かされます。
</p>

<h2>安定している会社</h2>
<p>
「いい会社」のイメージとして、多くの学生さんがいだくものの筆頭は、
「安定している会社」「儲かってる会社」「勝ち組企業」でしょう。
</p>
<blockquote>
先月 4/14 19:30 NHK で、
特報首都圏「就職戦線異状あり・格差社会の不安」と題する番組があった。
新卒の学生さん達が「勝ち組になる」ことを目指して
就職活動を行なっているのだという。
<br />
そりゃ、勝てるものなら勝ちたいと思うのは人の常なので、
これから社会に出ていこうとする学生さん達が、
将来勝ち組になれるような就職先を選ぼうとするのは至極当然のことだと思う。
<br />
<strong>ところが</strong>
<br />
学生さん達曰く、「勝ち組になるため、儲かっている会社に就職したい」。
<div align="right"><a href="http://blog.gcd.org/archives/cat_50026704.html">勝ち組になるには</a> から引用</div>
</blockquote>
<p>
ここんところ選挙などもあったからか、
「格差是正」を訴える声を聞くことが多かったのですが、
そもそも「格差」ってのは、
誰と誰との間の格差なんでしょうか？
「儲かっている会社に勤めている人」と、
そういう「いい会社」に雇ってもらえない人との間の格差なんでしょうか？
自身の実力は関係なくて、
「いい雇い主」に雇ってもらえるか否かが重要なんでしょうか？
こういう発想には、まるで
「いい家柄」の出身かどうかを気にする階級主義者や
「血筋」を気にする人種差別主義者と似たニオイを感じてしまうのです。
</p>
<p>
「儲かってる会社」に勤めていて、高い給料をもらっていたとしても、
その能力は会社の中だけでしか通用しないものかも知れず、
逆に、儲かってない会社に勤めていたとしても、
自身の能力を磨くことを怠らなければ、
会社を飛び出して活躍できるようになるかも知れないってのは、
誰もが思っていることですよね？
昔は儲かっていたけど、
今では会社が傾いて、ついにはリストラされてしまった、
ってのもよく聞く話です。
「最後に頼れるのは己れの実力だけ」って
誰もがよく口にするわりには、
こと「格差」を考えるときに限っては、
「実力」より「どんな会社に勤めているか」のほうが先に出てくるのは
なぜなんでしょうか？
</p>
<p>
「実力を磨きたいのは山々なれど、
実力を磨かせてくれるいい会社がない」とか、
「実力うんぬん以前に、
まず先立つモノ (給料) がないと」とか、
「実力はあるつもりだが、
それを正当に評価してくれる会社がない」とか、
そういった声が聞こえてきそうです。
</p>
<p>
確かに、ほとんどの会社は
実力を磨かせるより、コキ使うほうを優先するかも知れませんし、
実力をきちんと評価してくれない会社が圧倒的多数なのかも知れません。
しかしながら、世の中の 99.9% までそういう会社だったとしても、
実際に勤める会社は (当たり前ですが) たった一社でいいんです。
圧倒的多数の会社が社員の能力を伸ばすことに非協力的だったとしても、
そんなことはどーでもいいじゃないですか。
重要なのは自分が実際に就職する会社がどんな会社であるかであって、
世の中の会社の平均がどんな状況かではないのですから。
</p>

<h2>福利厚生が充実している会社</h2>
<p>
「安定している会社」を求める以上に不可解なのが、
「福利厚生の充実度」を気にする学生さん達です。
いったい会社に行って何をするつもりなんでしょうか？
</p>
<p>
自身の実力で会社に利益をもたらし、
その見返りに報酬を得る、というのなら筋が通っていますが、
それなら「福利厚生」みたいな中途半端なものを求めるまでもなく、
ストレートに自身の貢献に見合う「お金」を要求すればよい話です。
「お金」を求める自信も度胸もないからこそ、
「制度」としての「福利厚生」を求めるのでしょうが、
実力が足らないのを自覚しているのなら、
「福利厚生」を享受するなんて余裕をかましている場合じゃないでしょう？
</p>
<p>
これから社会に出ていく学生さん達が最優先で取組むべきことは、
会社と対等に渡り合える実力を身につけるために、
いま何をすべきか考えることでしょう。
そんな実力を身につけることは自分には永遠にムリと思う人がいるかもしれませんが、
ムリと思えば思うほど実現は遠退きます。
世の中にはいろんな会社があるのですから、
自身の能力を磨くのに適した会社は、
見つけようとしさえすれば、きっと見つかるはずです。
</p>
<blockquote>
「20:80 の法則」 (パレートの法則) というものがある。
「売上の8割は、全従業員のうちの2割で生み出している」などの経験則が知られるが、
じゃ、その 2割の従業員だけでドリームチームを作れば、
すごい会社が作れるかというと残念ながらそうは問屋がおろさない。
「2割の従業員」がふたたび「20:80」に分かれてしまうのである。
精鋭チームを作ったつもりが、
そのチームの中の多数 (8割) は売上にあまり貢献しなくなってしまう。
逆に、ダメな従業員だけを集めたダメダメチームを作っても、
その中の 2割ほどは頭角を現し、チームを率いるようになる。
<br />
<strong>つまり能力を向上させる最良の方法は、自分が上位 20% に入ることを目指せるような集団に属することである。</strong>
まさに「寧ろ鶏口となるも牛後となるなかれ」。
上位20% に入ることがどうしても無理なら、
それはその集団が向いていないということである。
牛後に甘んじるよりは思い切って飛び出すべきだろう。 
<div align="right"><a href="http://blog.gcd.org/archives/50838779.html">ロングテール戦略が格差社会を生む: 機会均等</a> から引用</div>
</blockquote>
<p>
会社をイメージで選ぶのではなく、
どんな会社が自分にとって「いい会社」なのか、
考えることから始めるべきではないでしょうか。
</p>

<h2>技術を教えてくれる会社</h2>
<p>
「安定している会社」や「福利厚生」を求めるのに比べれば、
まだマシなのが「技術を教えてくれる会社」を求める学生さん達です。
少なくとも自分の能力を向上させようという意欲は持っているのですから。
しかしながら、
「受け身」の姿勢であるという点では、
大差ないのかも知れません。
</p>
<p>
「技術を教えてもらう」という態度では、
おそらく永久に上位 20% に入ることはできないでしょう。
「<a href="http://blog.gcd.org/archives/50890010.html">技術は伝えるものではなく伝わるもの</a>」なのですから、
教える側に「充実した伝える方法」(例えば完備された指導マニュアル) を
求めている限り、
決して師匠に追い付くことはできません。
技術の習得に関して誰よりも貪欲であり続けなければ、
上位 20% を目指すどころか、
平均的な先輩たちを追い越すことすら覚束ないことでしょう。
</p>
<p>
つまり、技術を学ぼうとするなら、
その時点での実力はサテオキ、
「伝わる状態」にかけては自分が一番だと自信を持って言い張れる
(つまり、その技術を学びたいという情熱にかけては誰にも負けないと言いきれる) 
状態からスタートしなければならないのです。
</p>
<p>
「技術力のある会社に就職すれば、
そこそこの技術を身につけることができる」
そう考える人が多いのかも知れませんが、
これは二重の意味で間違っています。
すなわち、
「伝わる状態」ができていなければ学べないという意味で間違っているだけでなく、
仮に技術を身につけることができたとしても、
「そこそこの技術」では役に立たないという意味でも間違っています。
</p>
<p>
インターネットなどの普及によって技術に関する情報が巷に溢れる昨今、
「そこそこの技術」であれば、
会社に勤めなくてもいくらでも身につけることができます。
いやむしろ、
会社に勤めることよりも学ぶ意欲のほうがよほど重要でしょう。
技術力のある会社に就職したから技術が身につく、
なんて甘い考えでいる限り、
できることといえば「技術に慣れる」ことどまりでしょう。
</p>
<blockquote>
長年やっていれば、誰でもそれなりの技術を習得できます。
極端なことを言うと、
どんなに能力がない人でもそのときの自分の状態にあった程度のことを
実践していけば、
その積み重ねの中でやがてはなんらかの技術を習得することができます。<br />
しかし、このようなものは本来、技術の伝達とはいえません。
これを技術の習得というのも不適切で、
ただ単に技術に慣れただけというのが正確な言い方でしょう。<br />
じつはこのように、
経験と慣れだけで技術を獲得してきた人は世の中にたくさんいます。
私はこういう人を「偽ベテラン」と呼んでいます
<div align="right"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4061498703/gcd-22/ref=nosim">組織を強くする技術の伝え方</a> (畑村 洋太郎 著) から引用</div>
</blockquote>
<p>
「偽ベテラン」レベルの能力では、
「会社と対等に渡り合える」わけもなく、
そんな「使えない」能力を身につけるくらいなら、
別の分野を目指すべきだった、ということになってしまうかも知れません。
</p>
<p>
だから、高い技術力を持つから「いい会社」なのではなく、
その技術が自分自身が本当に身につけたいと心の底から思えるような
技術か否かのほうが重要だと思いますし、
技術の高さ低さよりは、
自身が技術を身につけていこうとする際に、
「役に立つ」会社か否かを見極めることのほうが重要だと思います。
</p>
<p>
では、どんな会社が技術者の成長に役立つ会社なのでしょうか？<br />
<a href="http://sengoku.blog.klab.org/archives/54165909.html">続きは次回</a>に...
</p>]]> 
</content>
<author>
<name>klab_sengoku</name> 
</author>
</entry>

<entry>
<title>オープンソース版 VPN-Warp リレー サーバ (Perl POE を使って実装)</title> 
<link rel="alternate" type="text/html" href="http://sengoku.blog.klab.org/archives/53188585.html" />
<modified>2007-03-18T21:36:41Z</modified> 
<issued>2007-03-19T06:36:41+09:00</issued> 
<id>tag:blog.livedoor.jp,2008:klab_sengoku.53188585</id> 
<summary type="text/plain">
「Perl の非同期I/Oモジュール POE を使って VPN-Warp relayagent を書いてみました」に
続いて、
同じく POE を使って VPN-Warp リレー サーバも書いてみました。
これで、オープンソースだけを使って VPN-Warp を実現することができます。


今までも、
BIGLOBE ...</summary> 
<dc:subject>VPN-Warp</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://sengoku.blog.klab.org/archives/53188585.html">
<![CDATA[<p>
「<a href="http://sengoku.blog.klab.org/archives/51772703.html">Perl の非同期I/Oモジュール POE を使って VPN-Warp relayagent を書いてみました</a>」に
続いて、
同じく POE を使って VPN-Warp リレー サーバも書いてみました。
これで、オープンソースだけを使って VPN-Warp を実現することができます。
</p>
<p>
今までも、
<a href="http://mobile.biglobe.ne.jp/vpnwarp/">BIGLOBE の VPN ワープのページ</a>から証明書を取得すれば、
月額 525円で VPN-Warp を試してみることはできたわけですが、
ちょっと試してみたい場合など、
有料であることがネックである感は否めませんでした。
特に、
常日頃からオープンソースを使いこなしている方々だと、
ちょっと使ってみたいだけなのにお金を払うのはねぇ、
と思ってしまうのではないでしょうか。
かくいう私も、
無料「お試し版」のサービスやソフトウェアに慣れきってしまっているので、
試しに使ってみようとする場合に、
それが有料だったりすると、
いきなり億劫になってしまう今日このごろだったりします (^^;)。
</p>
<p>
というわけで、
<a href="http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/stone/warp/">オープンソース版 VPN-Warp</a> です。
使い方はあまりフレンドリーではありませんが、
なんたって全て公開してしまっているので、
興味あるかたは、
とことんいじってみてはいかがでしょうか。
</p>
<p>
<a href="http://sengoku.blog.klab.org/archives/51772703.html">relayagent.pl</a> と同様、
今回公開する relayserver.pl も SSL 暗号化/復号の機能を含んでいません。
したがってリレー サーバへの https アクセスを
<a href="http://www.gcd.org/sengoku/stone/Welcome.ja.html">stone</a> などを
通して SSL 復号する必要があります。
例えば stone を
</p>
<pre class="code">
stone -z cert=cert.pem -z key=priv.pem \
      localhost:12345 443/ssl &amp;
</pre>
<p>
などと実行しておき、
relayserver.pl を
</p>
<pre class="code">
relayserver.pl 12345
</pre>
<p>
と実行します。これだけで 443番ポートはリレー サーバとして利用できます。
つまり、relayagent とブラウザからの https 接続を受付けると、
リレー サーバが両セッションを中継し
「ブラウザ → リレー サーバ → relayagent → Webサーバ」
という経路で通信できます。
</p>
<pre class="fig">
                      リレー            イントラ         イントラ
ブラウザ ─────→ サーバ ←──── relayagent──→ Webサーバ
            https     443番ポート                        80番ポート
</pre>
<p>
見かけは極めて tiny ですが、
通信プロトコルは本物(?)の VPN-Warp と互換性があるので、
「<a href="http://sengoku.blog.klab.org/archives/50267303.html">VPN-Warp relayagent フリー ダウンロード</a>」から
ダウンロードできる VPN-Warp relayagent を使うこともできます。
</p>
<blockquote>
そもそも論で言えば、
リレー サーバの役目は単にデータを右から左へ渡すだけなので、
以下に示すようにその中核の部分は極めてシンプルです。
しかしながら、もちろんこれは 
<a href="http://www.klab.org/">KLab(株)</a> で運用しているリレー サーバが単純であることを意味しません。
機能がシンプルでも、大量の同時接続 &amp; 大量データを受付ける耐高負荷性能や、
機器の一部に故障が起きてもサービスが影響を受けない高可用性を実現するために、
<a href="http://dsas.blog.klab.org/">様々な工夫</a>を盛り込んでいます。
</blockquote>
<p>
では、<a href="http://www.gcd.org/sengoku/docs/relayserver.pl">relayserver.pl</a> の中身を順に見ていきましょう。
</p>
<pre class="codewide">
#!/usr/bin/perl
use POE qw(Component::Server::TCP Filter::Stream);
my $Port = shift;
my $PollID;
my $PollHeap;
my $PollBuf;
my $PollHeader;
my %SID;
my %Heap;
my %Buf;
my $NextSID = 0;

POE::Component::Server::TCP-&gt;new
    (
     Port =&gt; $Port,
     ClientInput =&gt; sub {
	 my ($heap, $input, $id) = @_[HEAP, ARG0, ARG1];
	 if (defined $PollID &amp;&amp; $id == $PollID) {
	     $PollHeap = $heap;
	     $PollBuf .= $input;
	     &amp;doPoll;
	 } elsif (defined $SID{$id}) {
	     my $sid = $SID{$id};
	     $Heap{$sid} = $heap;
	     $Buf{$sid} .= $input;
	     &amp;doSession($sid);
	 } elsif ($input =~ m@^GET /KLAB/poll @) {
	     if (defined $PollID) {
		 $heap-&gt;{client}-&gt;
		     put("HTTP/1.1 503 Service Unavailable\r\n\r\n");
		 $heap-&gt;{client}-&gt;shutdown_output;
		 return;
	     }
	     $PollID = $id;
	     $PollHeap = $heap;
	     $PollBuf = $input;
	     &amp;doPoll;
	 } else {
	     $SID{$id} = $NextSID;
	     $NextSID = ($NextSID + 1) &amp; 0xFFFF;
	     my $sid = $SID{$id};
	     $Heap{$sid} = $heap;
	     $Buf{$sid} = $input;
	     &amp;doSession($sid);
	 }
     },
     ClientDisconnected =&gt; sub {
	 my $heap = $_[HEAP];
	 my $id = $heap-&gt;{client}-&gt;ID;
	 if (defined $PollID &amp;&amp; $id == $PollID) {
	     undef $PollHeap;
	     undef $PollBuf;
	     undef $PollHeader;
	     undef $PollID;
	 } elsif (defined $SID{$id}) {
	     my $sid = $SID{$id};
	     undef $SID{$id};
	     undef $Heap{$sid};
	     undef $Buf{$sid};
	 }
     },
     ClientFilter =&gt; POE::Filter::Stream-&gt;new(),
    );
POE::Kernel-&gt;run;
</pre>
<p>
わずか 70行にも満たないコードですが、
リレー サーバの中核の部分は、ほとんどこれで全てです。
いかに <a href="http://poe.perl.org/">POE (Perl Object Environment)</a> の
記述性が高いか分かりますね。
</p>
<blockquote>
私は常日頃から
<a href="http://blog.gcd.org/archives/50243372.html">プログラマの生産性は、ピンとキリでは 3桁の違いがある</a> と主張しています。
この主張をもう少し詳しく言うと、
その 3桁のうち、プログラマの腕に純粋に依存する部分は 2桁ほどの違いで、
残り 1桁ぶんは解決すべき問題に応じていかに最適な道具を使うかの違い、
ということになります。
最適な道具を使いこなせるもの腕のうち、
ということもできますね。
</blockquote>
<p>
上記 70行にも満たないコードですが、
実は命令文としてみると、
わずかに 2 つの命令文であることが分かります。
すなわち、
</p>
<pre class="codewide">
POE::Component::Server::TCP-&gt;new(...中略...);
POE::Kernel-&gt;run;
</pre>
<p>
ですね。実質「<tt>POE::Component::Server::TCP-&gt;new(...中略...);</tt>」
だけと言ってもいいでしょう。
この命令文は、
</p>
<pre class="codewide">
POE::Component::Server::TCP-&gt;new
    (
     Port =&gt; $Port,
     ClientInput =&gt; sub {
	 ... クライアントから受信したデータの処理 ...
     },
     ClientDisconnected =&gt; sub {
         ... クライアントとの接続が切れたときの処理 ...
     },
     ClientFilter =&gt; POE::Filter::Stream-&gt;new(),
    );
</pre>
<p>
という構造になっています。
つまり、クライアントからデータが送られて来たときに呼び出されるルーチンと、
クライアントとの接続が切れたときに呼び出されるルーチンを指定しておけば、
あとは POE がうまくやってくれる、というわけです。簡単でしょう？
</p>
<p>
リレー サーバにとって「クライアント」というと、
ブラウザか relayagent になります。
クライアントからの TCP/IPセッション一本一本に対して 
POE が ID を割り振っていて、
この ID を見ればどの TCP/IPセッションで送られて来たデータか分かります。
</p>
<p>
「<a href="http://sengoku.blog.klab.org/archives/51772703.html">Perl の非同期I/Oモジュール POE を使って VPN-Warp relayagent を書いてみました</a>」で
解説したように、
クライアントから送られて来た最初のデータが
「<tt>GET /KLAB/poll </tt>」で始まっていれば、
そのクライアントは relayagent ですから、
以下のようにその ID ($id) を $PollID に代入しておきます。
</p>
<pre class="codewide">
	 elsif ($input =~ m@^GET /KLAB/poll @) {
	     if (defined $PollID) {
		 $heap-&gt;{client}-&gt;
		     put("HTTP/1.1 503 Service Unavailable\r\n\r\n");
		 $heap-&gt;{client}-&gt;shutdown_output;
		 return;
	     }
	     $PollID = $id;
	     $PollHeap = $heap;
	     $PollBuf = $input;
	     &amp;doPoll;
	 }
</pre>
<p>
同じ TCP/IPセッション (つまり $id == $PollID) で
続いて送られてきたデータは、
以下の部分で処理されます。
</p>
<pre class="codewide">
	 if (defined $PollID &amp;&amp; $id == $PollID) {
	     $PollHeap = $heap;
	     $PollBuf .= $input;
	     &amp;doPoll;
	 }
</pre>
<p>
いずれの場合も、受信したデータはいったん $PollBuf に蓄えた上で、
「doPoll」ルーチンを呼び出します。
</p>
<p>
一方、ブラウザから送られてきたデータの場合は、
以下のようにセッションID ($SID{$id}) を順に割当てていきます。
「セッション」という単語が何度も出てきてややこしいのですが、
$id が POE が各 TCP/IPセッションに割当てた ID で、
各 TCP/IPセッションそれぞれに、
リレー サーバが 16bit の番号を割当てたのが 
VPN-Warp で言うところのセッションID ($sid = $SID{$id}) です。
</p>
<pre class="codewide">
	 else {
	     $SID{$id} = $NextSID;
	     $NextSID = ($NextSID + 1) &amp; 0xFFFF;
	     my $sid = $SID{$id};
	     $Heap{$sid} = $heap;
	     $Buf{$sid} = $input;
	     &amp;doSession($sid);
	 }
</pre>
<p>
同じ TCP/IPセッション (つまりセッションID $sid が $SID{$id}) を通して
続いて送られてきたデータは、
以下の部分で処理されます。
</p>
<pre class="codewide">
	 elsif (defined $SID{$id}) {
	     my $sid = $SID{$id};
	     $Heap{$sid} = $heap;
	     $Buf{$sid} .= $input;
	     &amp;doSession($sid);
	 }
</pre>
<p>
いずれの場合も、受信したデータはいったん $Buf{$sid} に蓄えた上で、
「doSession」ルーチンを呼び出します。
</p>
<p>
つまり、relayagent から受信したデータは doPoll ルーチンで、
ブラウザから受信したデータは doSession ルーチンで、
それぞれ処理する、というわけです。
以下の図に示すように、
リレー サーバの役割は、
relayagent から受信した (ブロック化された) データを、
(ブロックを開梱しつつ) ブラウザへ送信し、
またブラウザから受信したデータを、
ブロック化して relayagent へ送ることですから、
doPoll および doSession が何をするためのルーチンか予想できますよね？
</p>
<pre>
<img src="http://www.gcd.org/sengoku/docs/vpnwarp.jpg" width=457 height=278 alt="VPN-Warp セッション">
</pre>
<p>
まず doPoll を見ていきましょう。
</p>
<pre class="codewide">
sub doPoll {
    do {
	if (! defined $PollHeader) {
	    if ($PollBuf =~ /\r\n\r\n/) {
		$PollHeader = `;
		$PollBuf = ';
		$PollHeap-&gt;{client}-&gt;put("HTTP/1.1 200 OK\r\n\r\n");
	    }
	}
	return unless defined $PollHeader;
</pre>
<p>
リクエストヘッダを全て読み込んでいない場合 
(つまり $PollBuff に空行 \r\n\r\n が含まれていない場合)
は、ここで終わりです。<br />
$PollBuf に受信データが追加されて、ふたたび doPoll が呼ばれるまで待ちます。
</p>
<p>
リクエストヘッダを全て読み込んだ場合は、
$PollBuf からリクエストヘッダ部分を削除した上で、
次に進みます。
</p>
<pre class="codewide">
	my ($sid, $len, $data) = unpack("nna*", $PollBuf);
	return unless defined $sid &amp;&amp; defined $len &amp;&amp; $len ne "";
</pre>
<p>
ブロック全体を読み込めていない場合は、ここで終わりです。
$PollBuf に受信データが追加されて、ふたたび doPoll が呼ばれるまで待ちます。
「ブロック」というのは VPN-Warp 用語で、
relayagent とリレーサーバとの通信は、
基本的にこの「ブロック」を単位にして行ないます。
ブロックは次のような可変長のデータです。
</p>
<pre class="fig">
    ┌───┬───┬───┬───┬───┬─≪─┬───┐
    │セッションＩＤ│　データ長　　│　　可変長データ　　　│
    └───┴───┴───┴───┴───┴─≫─┴───┘
          2バイト         2バイト      「データ長」バイト
</pre>
<p>
「セッションID」および「データ長」は、ビッグエンディアンです。
つまり上位バイトが先に来ます。
したがって、上記コードによって $sid, $len, $data にそれぞれ
「セッションID」「データ長」「可変長データ」が代入されます。
</p>
<p>
なお、データ長が 0 ないし負数の場合は、
「可変長データ」の部分は 0 バイトになります。
このような「可変長データ」がないブロックは、
コントロール用のブロックで、
EOF や Error などのイベントを伝えます。
</p>
<pre class="codewide">
	if ($len &gt; 32767) {
	    $len -= 65536;
	    $PollBuf = $data;
	    if ($len == -1) {
		&amp;doShutdown($sid);
	    }
	}
</pre>
<p>
$len == -1 のときは、Error を伝えるコントロール ブロックなので、
「doShutdown」ルーチンを呼び出しています。
</p>
<pre class="codewide">
	elsif ($len &gt; 0) {
	    return unless defined $data &amp;&amp; length($data) &gt;= $len;
	    ($data, $PollBuf) = unpack "a${len}a*", $data;
	    if (defined $Heap{$sid}) {
		$Heap{$sid}-&gt;{client}-&gt;put($data);
	    }
	}
</pre>
<p>
$len &gt; 0 のときは、
$sid で示されるブラウザに対して $data を送信します。
$len == 0 のときは、
EOF を伝えるコントロール ブロックなので、
「doShutdown」ルーチンを呼び出しています。
</p>
<pre class="codewide">
	else {	# len == 0
	    $PollBuf = $data;
	    &amp;doShutdown($sid);
	}
    } while ($PollBuf ne "");
}
</pre>
<p>
以上を、$PollBuf が空になるまで続けます。
</p>
<p>
doShutdown はブラウザとの TCP/IPセッションを 
shutdown するためのルーチンです。
</p>
<pre class="codewide">
sub doShutdown {
    my ($sid) = @_;
    if (defined $Heap{$sid}) {
	$Heap{$sid}-&gt;{client}-&gt;shutdown_input;
    }
}
</pre>
<p>
次に doSession です。
</p>
<pre class="codewide">
sub doSession {
    my ($sid) = @_;
    if (defined $PollHeap) {
	my $req = $Buf{$sid};
	$Buf{$sid} = "";
	for my $block (unpack "(a2048)*", $req) {
	    $PollHeap-&gt;{client}-&gt;
		put(pack("nna*", $sid, length($block), $block));
	}
    }
}
</pre>
<p>
ブラウザから送られてきたデータを、
2048 バイトずつ区切って「セッションID」「データ長」を
前につけることによってブロック化して、
relayagent に送信しています。
</p>
<p>
オリジナルの VPN-Warp を使ったことがある方は既にお気付きかも知れませんが、
上記 relayserver.pl は説明を簡単にするために機能をいくつか省いています。
例えば、オリジナルのリレー サーバは、
接続する際はクライアント認証が必須で、
同じクライアント証明書を提示した relayagent とブラウザを
結び付ける機能があるのですが、
上記 relayserver.pl はクライアント認証を行なわないので、
任意のブラウザから接続可能ですし、
同時接続が可能な relayagent は一つだけです。
</p>
<p>
腕に覚えのあるかたは、
オリジナルの VPN-Warp と同等の機能を実現するには
どのような修正を加えればよいか、
考えてみてはいかがでしょうか？
そして、
こういうことを考えることが好きなかた、
「<a href="http://dsas.blog.klab.org/archives/50946231.html">いっしょにDSASつくりませんか？</a>」
</p>]]> 
</content>
<author>
<name>klab_sengoku</name> 
</author>
</entry>

<entry>
<title>キャリアにおける「鶏と卵」 ── 「卵」を後回しにして欲しくない</title> 
<link rel="alternate" type="text/html" href="http://sengoku.blog.klab.org/archives/52433437.html" />
<modified>2007-11-02T07:52:46Z</modified> 
<issued>2007-02-19T09:46:18+09:00</issued> 
<id>tag:blog.livedoor.jp,2008:klab_sengoku.52433437</id> 
<summary type="text/plain">
私は「やりたいことを仕事にすべき」と常日頃から主張しているのですが、
自分自身のことを振返ると、
必ずしも「やりたいこと」そのものズバリを
最初からやっていたわけではないことに気づきます。


「鶏がさきか、卵がさきかの議論になっちゃうんだけど」なんて...</summary> 
<dc:subject>技術と人材育成と経営</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://sengoku.blog.klab.org/archives/52433437.html">
<![CDATA[<p>
私は「やりたいことを仕事にすべき」と常日頃から主張しているのですが、
自分自身のことを振返ると、
必ずしも「やりたいこと」そのものズバリを
最初からやっていたわけではないことに気づきます。
</p>
<blockquote>
「鶏がさきか、卵がさきかの議論になっちゃうんだけど」なんて枕詞があるが、
こと20代のキャリアにおいては
「まず目の前の仕事で最高の成果をだすことが"さき"で、
自分がやりたいと思う仕事をおっかけるのは"あと"」というのは
私の中では確信に近い。
<div align="right">「<a href="http://d.hatena.ne.jp/ktdisk/20070210/1171110050">20代のキャリアにおける『鶏と卵』</a>」から引用</div>
</blockquote>
<p>
確かに、何をやるにしても最初は素人であるはずで、
ずぶの素人が「この仕事をやりたい」と言ったところで、
任せてもらえることはレアケースでしょう。
仮に任せてもらえたとしても、
初めてやる仕事で成果を出せるとは限りません。
</p>
<p>
私は学校を卒業後、某大企業の研究所に就職し、
遺伝的アルゴリズムの研究に取組みました。
当時は (今も?) 大企業の研究所というのは人気職種で、
今から思えば「やりたいこと」というよりは
「人気の職種だから」やってみたいという思いの方が
強かったような気がします。
</p>
<p>
もちろん嫌々仕事 (研究) をしていたわけではないのですが、
仕事の合間を見つけては、
本業そっちのけで職場のイントラネット環境の整備に没頭してしまいました。
当時はまだ「イントラネット」という言葉すら生まれていない時代で、
何をするにもいちいち不便なネットワーク環境だったので、
いろいろ改善しようと思ったわけですが、
次第にネットワークの方が面白く感じるようになってしまいました。
</p>
<blockquote>
入社当時に配属された部署というのは正直私があまり関心がある仕事ではなかったが、
当時はまだ"ひよっこ"という意識が強かったので、
とにかく結果をだすことに専念をした。<br />
(中略)<br />
どちらかというと目の前にある仕事をこなし、
そこで結果をだすのが精一杯で、
自分の関心が本当にどこにあるのかということを真剣に考える余裕も正直なく、
とにかくアサインされたプロジェクトで結果をだすことにがむしゃらになった。
<div align="right"><a href="http://d.hatena.ne.jp/ktdisk/20070210/1171110050">同ページ</a>から引用</div>
</blockquote>
<p>
私の場合、配属された部署というのは関心がある仕事だったのですが、
もっと関心のある分野を見つけてしまったため、
本業 (目の前にある仕事) がおろそかになった、という感じでしょうか。
もしあのとき、
「アサインされた仕事で結果をだすことにがむしゃらになって」いたら、
本当に自分に向いていることを見つけ損なっていたのかも知れません。
</p>
<p>
確かに、他に熱中できることがなければ、
目の前の「本業」にがむしゃらになって取組むことも重要だとは思うのですが、
自分が本当は何に向いているのか、
いろいろ「かじってみる」余裕は持っていて欲しいと思うのです。
</p>
<blockquote>
プロ野球選手を目指す子供に対して、
「野球を頑張るのはいいけど勉強も忘れずにね」というような忠告なら有用だと思う。
だけど、「プロ野球選手が本当の自分のゴールかどうかなんてわからないんだから、
まずは（アサインされた）目の前のテストで100点を取りなさい。
野球をするのはそれからだ」とは言わないでしょう？
<div align="right">「<a href="http://blog.inasphere.net/2007/02/post.html">自分がやりたいと思う仕事をおっかけるのを"あと"にはしたくない</a>」から引用</div>
</blockquote>
<p>
本業以外に熱中できる新分野を見つけた部下に対し、
「新分野を頑張るのはいいけど本業も忘れずにね」という忠告はするけど、
その新分野への取組みも大いに応援する、
KLab(株)はそんな会社でありたいと思っています。
勤務時間の 10% は本業以外のことを好き勝手にやっていい、
もし見込みが出てきて周囲から認められるレベルになったら、
それを本業にしてしまってもいい、という「どぶろく制度」を作ったのも、
熱中できることを見つけるチャンスを逃して欲しくない、という思いからです。
</p>
<blockquote>
キャリアは偶然によって作られるものだと私も思う。
なので、その偶然をどう活かすかというのは非常に大切になってくる。
でも「偶然のレベル」と「自分のレベル」は等価なので、
偶然を活かす良いスパイラルを生み出すためには、
まず自分のレベルを上げないと始まらない。
なので、今ある仕事の中で自分のレベルを上げることを第一に考えるべきです。
<div align="right">「<a href="http://d.hatena.ne.jp/gothedistance/20070218/1171728480">キャリアと上手に付き合うために</a>」から引用</div>
</blockquote>
<p>
確かにその通りなのですが、
「偶然のレベル」を引き上げることは、
個人一人一人が自身のレベルを引き上げることによってだけでなく、
「偶然」を起りやすくする環境を会社が整えることによっても可能だと思いますし、
それこそが技術者のための技術会社の存在意義なのではないかと思います。
</p>]]> 
</content>
<author>
<name>klab_sengoku</name> 
</author>
</entry>

<entry>
<title>Perl の非同期I/Oモジュール POE を使って VPN-Warp relayagent を書いてみました</title> 
<link rel="alternate" type="text/html" href="http://sengoku.blog.klab.org/archives/51772703.html" />
<modified>2007-01-25T04:01:29Z</modified> 
<issued>2007-01-22T07:13:43+09:00</issued> 
<id>tag:blog.livedoor.jp,2008:klab_sengoku.51772703</id> 
<summary type="text/plain">
多数の TCP/IP セッションを同時に維持する必要性などから、
非同期I/O が最近流行りのようです。
何をいまさら、という気もするのですが、
いわゆる「最新技術」の多くが 
30年前の技術の焼き直しに過ぎない今日このごろなので、
非同期I/O 技術が「再発見」されるの...</summary> 
<dc:subject>VPN-Warp</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://sengoku.blog.klab.org/archives/51772703.html">
<![CDATA[<p>
多数の TCP/IP セッションを同時に維持する必要性などから、
非同期I/O が最近流行りのようです。
何をいまさら、という気もするのですが、
いわゆる「最新技術」の多くが 
30年前の技術の焼き直しに過ぎない今日このごろなので、
非同期I/O 技術が「再発見」されるのも、
「歴史は繰り返す」の一環なのでしょう。
スレッドが当たり前の時代になってからコンピュータ技術を学んだ人にとっては、
(古めかしい) 非同期I/O が新鮮に映るのかも知れず、
なんだか「ファッションのリバイバル」に似ていますね。
</p>
<p>
Perl で非同期I/O 処理を手軽に行なうための枠組みとして、
<a href="http://poe.perl.org/">POE: Perl Object Environment</a> というものが
あるようです。
POE を使うと、
あたかもスレッドを使っているような手軽さでプログラミングできます。
試しに VPN-Warp の 
<a href="http://www.gcd.org/sengoku/docs/relayagent.pl">relayagent を POE を使って書いてみました</a>。
オリジナルの relayagent は C 言語で記述した 4000 行を超える
プログラムなのですが、
Perl だと 200 行以下で一通り動くものが書けてしまいました
(もちろん C 版の機能を全て実装したわけではありません)。
</p>
<p>
POE を触るのは今回が初めてだったので、
マニュアルをいちいち参照しながら書いたのですが、
なにせわずか 200 行ですから、
開発はデバッグ込みで 1 日かかりませんでした。
改めて Perl の記述性の良さと開発効率の高さに感動したのですが、
これだけ簡潔に書けてしまうと、
relayagent の機能を解説するときの教材としても使えそうです。
</p>
<p>
というわけで、
今までブラックボックスだった relayagent の中身の解説を試みたいと思います。
これから POE を使ってみようとする人の参考にもなれば幸いです。
</p>
<p>
VPN-Warp の relayagent とは、
以下の図のようにリレーサーバと Webサーバの両方へ接続して、
リレーサーバから受取ったリクエストを Webサーバへ中継するプログラムです。
http リクエストを受取ってサービスを行なうのですから、
サーバの一種と言えますが、
外部から接続を受付けるわけではなく、
リレーサーバと Webサーバの両方に対してクライアントとして振る舞う点が
ユニークと言えるでしょう。
</p>
<pre class="fig">
                      リレー            イントラ         イントラ
ブラウザ ─────→ サーバ ←──── relayagent──→ Webサーバ
            https     443番ポート                        80番ポート
</pre>
<p>
http リクエストを受取って Webサーバへ中継するプログラムというと、
proxy サーバを思い浮かべるかも知れません。
proxy サーバはその名の通り、
ブラウザに対してはサーバとして振る舞います:
</p>
<pre class="fig">
                                        proxy            イントラ
ブラウザ ──────────────→ サーバ────→ Webサーバ
                                        8080番ポート     80番ポート
</pre>
<p>
proxy サーバが、ブラウザからの接続を受付けて、
それを Webサーバに中継するのに対し、
relayagent は自身では接続を受付けずに中継する、
という違いがお分かりでしょうか？
relayagent は接続を受ける必要がないため、
ファイアウォールの内側など、
外部からアクセスできない場所で使うことが可能になっています。
</p>
<p>
なお、C 版の relayagent はリレーサーバに対して https で接続するのですが、
<a href="http://www.gcd.org/sengoku/docs/relayagent.pl">Perl 版 relayagent (以下 relayagent.pl)</a> は、
説明の都合上 SSL 暗号化の機能を含んでいません。
実際に使うときは、
<a href="http://www.gcd.org/sengoku/stone/Welcome.ja.html">stone</a> などで SSL 暗号化して
リレーサーバに接続する必要があります。
</p>
<pre class="fig">
         リレー                         イントラ         イントラ
         サーバ ←──── stone ←── relayagent──→ Webサーバ
         443番ポート       SSL化        Perl 版          80番ポート
</pre>
<p>
例えば stone を
</p>
<pre class="code">
stone -q pfx=relay,5000005.pfx \
      -q passfile=relay,5000005-pass.txt \
      warp.klab.org:443/ssl localhost:12345 &amp;
</pre>
<p>
などと実行しておき、
relayagent.pl はリレーサーバに接続する代わりに、
localhost の 12345 番に接続します。
</p>
<p>
では、<a href="http://www.gcd.org/sengoku/docs/relayagent.pl">relayagent.pl</a> を順に見ていきましょう。
</p>
<pre class="codewide">
#!/usr/bin/perl
use POE qw(Component::Client::TCP Filter::Stream);
my $IdleTimerMax = 6;	# 60 sec
&amp;help unless @ARGV == 2;
&amp;help unless shift =~ m/^(\w+):(\d+)$/;
my ($RelayHost, $RelayPort) = ($1, $2);
&amp;help unless shift =~ m/^(\w+):(\d+)$/;
my ($WebHost, $WebPort) = ($1, $2);
my %WebHeap;
my $PollBuf;
my $PollHeap;
my $PollHeader;
my $IdleTimer;
my $DisconectTime = 0;
</pre>
<p>
$RelayHost, $RelayPort は、
リレーサーバのホスト名とポート番号ですが、<br />
前述したように stone 経由でリレーサーバにつなぐために、<br />
$RelayHost = "localhost", $RelayPort = 12345
などとなります。また、
$WebHost, $WebPort は、
中継先となる (イントラの) Webサーバのホスト名とポート番号です。
</p>
<p>
続いて、リレーサーバへ接続する
(直接の接続先は SSL 化を行なう stone ですが、
煩雑になるので以下 「リレーサーバ」 と略記します)
ためのコードです:
</p>
<pre class="codewide">
POE::Component::Client::TCP->new
    ( RemoteAddress => $RelayHost,
      RemotePort    => $RelayPort,
      Connected     => sub {
	  $PollHeap = $_[HEAP];
	  undef $PollHeader;
	  $PollBuf = "";
	  $IdleTimer = $IdleTimerMax;
	  $PollHeap->{server}->
	      put("GET /KLAB/poll HTTP/1.1\r\nX-Ver: realyagent.pl 0.01\r\n\r\n");
      },
      ServerInput   => sub {
	  $PollHeap = $_[HEAP];
	  $PollBuf .= $_[ARG0];
	  &amp;doPoll;
      },
      Filter        => POE::Filter::Stream->new(),
      Disconnected  => \&amp;reconnectPoll,
    );
</pre>
<p>
POE では、非同期に動く処理を、
処理ごとに分けて書くことができます。
各処理のことを「POEセッション」と呼びます。
</p>
<p>
上記は、リレーサーバへ接続する POEセッションの生成です。
接続先ホストおよびポートを、
それぞれ $RelayHost と $RelayPort に設定しています。
</p>
<p>
「Connected => sub {」から始まる部分が、
接続に成功したときに実行するコードです。
細かいところはさておき、
接続したら以下のリクエストをリレーサーバに送る、
という点は読み取れるのではないでしょうか。
</p>
<pre class="code">
GET /KLAB/poll HTTP/1.1
X-Ver: realyagent.pl 0.01
</pre>
<p>
同様に、
「ServerInput => sub {」から始まる部分が、
通信相手 (リレーサーバ) からデータを受信したときに実行するコードです。
受信したデータは、
いったん変数 $PollBuf に溜めておいて、
続いて呼び出す doPoll の中で処理を行ないます。
</p>
<p>
以上からお分かりのように、
リレーサーバへデータを送るときは、<br />
「$PollHeap->{server}->put(送るべきデータ);」を実行し、
リレーサーバからデータが送られてきた時は、
doPoll で受取ります。
とても見通しが良いですね。
</p>
<p>
各 POEセッションは、スレッドと同様、同一メモリ空間を共有しているので、
他の POEセッションが変更した変数の値を参照できます。
したがってどの POEセッションでもリレーサーバへデータを送ることができますし、
リレーサーバから受信したデータはどの POEセッションでも読むことができます。
</p>
<p>
続いて、もう一つ POEセッションを作ります。
</p>
<pre class="codewide">
POE::Session->create
    ( inline_states =>
      { _start => sub {
	  $_[KERNEL]->delay( tick => 10 );
        },
        tick => sub {
	    if ($IdleTimer > 0) {
		if (--$IdleTimer <= 0) {
		    &amp;sendControl(0, -2);	# keep alive
		}
	    }
            $_[KERNEL]->delay( tick => 10 );
        },
      },
    );
$poe_kernel->run;
exit;
</pre>
<p>
この POEセッションは 10秒に一回、
「tick => sub {」から始まる部分を実行します。
見ての通り、$IdleTimer の値を減らしていって、
0 になったら sendControl を実行します。
$IdleTimer は最初 6 ($IdleTimerMax) に設定されるので、
1 分ごとに sendControl を実行する、という意味ですね。
</p>
<p>
以上 2つの POEセッションは作成しただけで、まだ走り出していません。<br />
その次の「$poe_kernel->run;」が各 POEセッションを走らせるための呼び出しです。
このルーチンは全ての POEセッションが終了するまで返ってきません。
</p>
<p>
さて、relayagent はリレーサーバとの接続を常時維持していますが、
無通信時間が続くと (通信経路中にあるファイアウォールなどに) 
切られてしまう恐れがあるので、
keep alive ブロックを送信しています。
通信が行なわれていない時間を測るためのカウンタが $IdleTimer というわけです。
</p>
<p>
通信が行なわれない限り $IdleTimer は減り続け、
1 分経過すると sendControl(0, -2) を呼び出して 
keep alive ブロックを送信します。
sendControl はこんな感じ:
</p>
<pre class="codewide">
sub sendControl {
    my ($id, $control) = @_;
    $control += 65536 if $control < 0;
    $IdleTimer = $IdleTimerMax;
    if (defined $PollHeap &amp;&amp; $PollHeap->{connected}) {
	$PollHeap->{server}->put(pack("nn", $id, $control));
    }
}
</pre>
<p>
既に説明したように「$PollHeap->{server}->put(データ)」は、
リレーサーバにデータを送る呼び出しですから、
「pack("nn", 0, 65534)」が keep alive ブロックであることが分かります。
</p>
<p>
「ブロック」というのは VPN-Warp 用語でして、
relayagent とリレーサーバとの通信は、
基本的にこの「ブロック」を単位にして行ないます。
ブロックは次のような可変長のデータです。
</p>
<pre class="fig">
    ┌───┬───┬───┬───┬───┬─≪─┬───┐
    │セッションＩＤ│　データ長　　│　　可変長データ　　　│
    └───┴───┴───┴───┴───┴─≫─┴───┘
          2バイト         2バイト      「データ長」バイト
</pre>
<p>
「セッションID」および「データ長」は、ビッグエンディアンです。
つまり上位バイトが先に来ます。
データ長が 0 ないし負数の場合は、
「可変長データ」の部分は 0 バイトになります。
</p>
<p>
データ長が 0 ないし負数であるブロックは、
コントロール用のブロックで、
以下の意味を持っています:
</p>
<table class="parameter">
<tr><th>データ長</th><td>意味</td><td>内容</td></tr>
<tr><th>0</th><td>EOF</td><td>Webセッションの終了を要求</td></tr>
<tr><th>-1</th><td>Error</td><td>Webセッションの異常終了を要求</td></tr>
<tr><th>-2</th><td>Keep Alive</td><td>無通信状態が続いたときに送信</td></tr>
<tr><th>-3</th><td>X OFF</td><td>Webセッションのデータ送信の一時停止を要求</td></tr>
<tr><th>-4</th><td>X ON</td><td>Webセッションのデータ送信の再開を要求</td></tr>
</table>
<p>
ブラウザ送ったリクエストを Webサーバに届け、
Webサーバのレスポンスをブラウザに返す一連の通信のことを、
ここでは「Webセッション」と呼ぶことにします。
つまり、
VPN-Warp が提供する仮想的な通信路 (トンネル) 上のセッションです。
</p>
<pre>
<img src="http://www.gcd.org/sengoku/docs/vpnwarp.jpg" width=457 height=278 alt="VPN-Warp セッション">
</pre>
<p>
ブラウザがリレーサーバと通信するときの TCP/IPセッションと、
relayagent と Webサーバが通信するときの TCP/IPセッションを対応づけるのが、
セッションID です。
「セッション」という言葉が何度も出てきてややこしいですが、
「セッションID」の「セッション」は、
「Webセッション」の意味です。
</p>
<p>
リレーサーバと relayagent との間は、
複数の Webセッションを一本の TCP/IPセッションに相乗りさせるので、
そのとき各 Webセッションがこんがらないようにするために
ブロックにはセッションID がつけられている、というわけです。
</p>
<p>
では、次はいよいよ relayagent の中核ルーチンである doPoll です:
</p>
<pre class="codewide">
sub doPoll {
    do {
	if (! defined $PollHeader) {
	    if ($PollBuf =~ /\r\n\r\n/) {
		$PollHeader = $`;
		$PollBuf = $';
	    }
	}
	return unless defined $PollHeader;
	my ($id, $len, $data) = unpack("nna*", $PollBuf);
	return unless defined $id &amp;&amp; defined $len &amp;&amp; $len ne "";
	if ($len > 32767) {
	    $len -= 65536;
	    $PollBuf = $data;
	    if ($len == -1) {
		&amp;closeWeb($id);
	    }
	} elsif ($len > 0) {
	    return unless defined $data &amp;&amp; length($data) >= $len;
	    ($data, $PollBuf) = unpack "a${len}a*", $data;
	    &amp;reqWeb($id, $data);
	} else {	# len == 0
	    $PollBuf = $data;
	    &amp;closeWeb($id);
	}
    } while ($PollBuf);
}
</pre>
<p>
前述したように、relayagent はリレーサーバに接続したとき、
まず<br />
「GET /KLAB/poll HTTP/1.1」から始まるリクエストヘッダを送ります。
するとリレーサーバは、
次のようなレスポンスを返します:
</p>
<pre class="codewide">
HTTP/1.1 200 OK
X-Customer: nusers=5&amp;type=1&amp;expire=1169696110&amp;digest=3f6977eceb8c2c43e28e6026b08ba900
</pre>
<p>
そしてこの後 (doPoll において「defined $PollHeader」が真のとき)、
リレーサーバと relayagent は、
前述したブロックを送受信することになります。
</p>
<p>
「my ($id, $len, $data) = unpack("nna*", $PollBuf);」の部分が、<br />
リレーサーバから受信したブロックを、<br />
「セッションID ($id)」 「データ長 ($len)」 「可変長データ ($data)」
に分解している処理ですね。
続いてブロックの処理が行なわれますが、
コントロールブロックに関する処理は割愛して、
可変長データが付いているブロックの処理を見ていきましょう。
ここで受信した可変長データは、
ブラウザが送信した http リクエストを
2048バイトごとに分割したものです。
</p>
<p>
つまりリレーサーバは、
ブラウザから https リクエストを受取るたびに「セッションID」を割り振ります。
そして、リクエストをブロックに分割して relayagent へ送信し、
逆に relayagent から受取ったブロックを 
同じセッションID ごとに連結して、
http レスポンスとしてブラウザへ送信します。
</p>
<p>
したがって、
relayagent はリレーサーバから受取ったブロックを
同じセッションID ごとに連結して Webサーバへ中継し、
そのレスポンスをブロックに分割してリレーサーバへ送信すればよいことになります。
</p>
<p>
同じセッションID ごとに連結して Webサーバへ送信する処理が、
reqWeb です:
</p>
<pre class="codewide">
sub reqWeb {
    my ($id, $req) = @_;
    if (defined $WebHeap{$id} &amp;&amp; $WebHeap{$id}->{connected}) {
	$WebHeap{$id}->{server}->put($req);
    } else {
	POE::Component::Client::TCP->new
	    ( RemoteAddress => $WebHost,
	      RemotePort    => $WebPort,
	      Connected     => sub {
		  $WebHeap{$id} = $_[HEAP];
		  $WebHeap{$id}->{server}->put($req);
	      },
	      ServerInput   => sub {
		  $WebHeap{$id} = $_[HEAP];
		  &amp;sendRes($id, $_[ARG0]);
	      },
	      Filter        => POE::Filter::Stream->new(),
	      Disconnected  => sub {
		  &amp;sendControl($id, 0);
	      },
	    );
    }
}
</pre>
<p>
「POE::Component::Client::TCP->new」によって、
Webサーバと通信するための POEセッションを生成しています。
この reqWeb を実行しているのは、
リレーサーバとの通信を受け持つ POEセッションでしたが、
この POEセッションが新たに POEセッションを生成している点に注意してください。
</p>
<p>
新しく生成した POEセッションは、Webサーバと接続したとき (Connected)、<br />
「$WebHeap{$id}->{server}->put($req);」を実行して
リクエスト ($req) を Webサーバに送信します。
そして Webサーバからレスポンスを受信したとき (ServerInput)、
sendRes を実行します。
</p>
<pre class="codewide">
sub sendRes {
    my ($id, $res) = @_;
    $IdleTimer = $IdleTimerMax;
    if (defined $PollHeap &amp;&amp; $PollHeap->{connected}) {
	for my $block (unpack "(a2048)*", $res) {
	    $PollHeap->{server}->
		put(pack("nna*", $id, length($block), $block));
	}
    }
}
</pre>
<p>
sendRes は Webサーバからのレスポンス ($res) を 2048バイトごとに分割し、
セッションID ($id) とデータ長 (length($block)) を付加した
ブロックとしてリレーサーバに送信します。
</p>
<p>
以上をまとめたのが、<a href="http://www.gcd.org/sengoku/docs/relayagent.pl">relayagent スクリプト</a> です。
ここで解説した機能の他、
http リクエストヘッダの Host: フィールドを書き換える機能も追加しています。
</p>
<p>
C 版の relayagent に比べると、
http レスポンスの書き換え機能や、
http 以外のプロトコルを通す機能などがない点や、
高負荷時の性能の検証が充分行なえていない点など、
そのまま実運用に使用するには難しい点もありそうですが、
少なくとも プロトタイピングなどの目的 (あるいは教育などの目的) ならば
充分使えそうです。
</p>]]> 
</content>
<author>
<name>klab_sengoku</name> 
</author>
</entry>

<entry>
<title>技術者を目指す学生さんたちへ</title> 
<link rel="alternate" type="text/html" href="http://sengoku.blog.klab.org/archives/51661392.html" />
<modified>2007-01-17T13:24:43Z</modified> 
<issued>2007-01-17T07:49:01+09:00</issued> 
<id>tag:blog.livedoor.jp,2008:klab_sengoku.51661392</id> 
<summary type="text/plain">
いよいよ就職活動本番ですね。
どのような進路を選ぶにせよ、
あとで後悔することのないよう、
じっくり考えて決めたいものですよね。
でも、ただ単に考えると言っても、
一人であれこれ思い悩むのは感心しません。
「思いて学ばざれば則ち殆し」と言いますから、
...</summary> 
<dc:subject>技術と人材育成と経営</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://sengoku.blog.klab.org/archives/51661392.html">
<![CDATA[<p>
いよいよ就職活動本番ですね。
どのような進路を選ぶにせよ、
あとで後悔することのないよう、
じっくり考えて決めたいものですよね。
でも、ただ単に考えると言っても、
一人であれこれ思い悩むのは感心しません。
「思いて学ばざれば則ち殆し」と言いますから、
ぜひいろいろ見聞きした上で考えて頂きたいと思います。
</p>
<p>
企業への就職を考える場合、まず気になるのは評価制度のことだと思いますが、
まさにこの評価制度が揺れ動いているのが、いま現在と言えるでしょう。
高度成長期以来、長年用いられてきた年功主義に基づく評価制度の綻びが
誰の目にも明らかになってきてはいるものの、
年功に代わる評価方法を模索し続けているのが
多くの企業の現状だと思います。
</p>
<blockquote>
どこの企業も新しい人事制度を模索し、成果主義が取り入れられつつありますよね。
（同時にコスト削減という意味合いもありますが）<br />
この成果主義という人事制度ですが、
多分どこの会社でもおおよそこんな感じなのではないでしょうか。<br />

●年初に目標を設定（部署ごとの目標・個人の目標）<br />
●3ヶ月か半年ごとに上司と面談<br />
●成果をアピール<br />
●評価の通知<br />

一見、単なる年功序列よりは凄くまともそうなシステムに見えますよね。
でも、実際には明らかな欠点があると思います。
（評価する側の上司がそもそも年功序列組だという点は除いて）<br />

◆短期間にアピールできるようなものにばかり心奪われるようになる<br />
◆業績アピールに繋がらない日常の雑用や、他人の手伝いは避けるようになる<br />

どちらも当たり前の弊害だと思うのですが、
多くの企業ではこれらの問題について見て見ぬフリをしているのではないでしょうか？
<div align="right">「<a href="http://hamasta.g.hatena.ne.jp/hamasta/20070116/p1">成果主義と生産性のゆくえ</a>」から引用</div>
</blockquote>
<p>
ぜひこういった疑問を、どんどん企業にぶつけていって頂きたいと思います。
就職活動というのは、いろんな企業に対して歯に衣着せぬ質問ができる
唯一と言ってもいい機会なのですから。
</p>
<p>
「評価」には二つの側面があります。
「評価される側」と「評価する側」です。
上に引用した文章は、
「評価される側」にフォーカスした疑問と言えるでしょう。
もちろん学生さんは就職したら評価される側になるので、
「評価される側」から考えたくなるのは当然だと思いますが、
なにごとにも表と裏があります。
片方の側からだけ考えていては考えを深めることはできません。
ぜひ、自分とは異なる立場の視点も持つ習慣を身につけて頂きたいと思います。
</p>
<p>
「評価」を両方の側から考えてみれば、
「短期間にアピールできるようなものにばかり心奪われるようになる」というのは
評価される側の理屈に過ぎないことは自明ですよね？
つまり暗黙のうちに、
アピールがそのまま通るような「無能な上司」を前提としてしまっています。
もし、「評価する側」が
「業績アピールに繋がらない日常の雑用や、他人の手伝いは避ける」人の
評価を下げるのであれば、
このような弊害を避けることは可能でしょう。
</p>
<p>
引用した文中に「評価する側の上司がそもそも年功序列組だという点は除いて」と
ありますが、
まさにこれこそが問題の本質だと思います。
「除いて」しまっていては考えが深まりません。
</p>
<p>
どのような人事制度であれ、
「評価する人」と「評価される人」の双方に、
その制度の「精神」が徹底できていなければ機能するはずがありません。
そして、
「評価される人」への徹底は、
そもそも徹底できていなければ評価が下がるので、
否が応にも徹底されるわけですが、
「評価する人」への徹底ができるかどうかは、
「評価する人」を評価する人、つまりその上の上司の責任です。
</p>
<p>
より具体的に言えば、
「短期間にアピールできるようなもの」「アピールしやすいもの」
ばかりを評価の対象としてしまって、
部下の本当の価値を評価できていない上司を、本当に降格できるのか？
という問題でしょう。
年功主義では過去の功労者が上司となるケースが多いようですが、
過去に成果を上げた人が、
現在の部下の成果を評価できるのか？ という問題であるとも言えますね。
</p>
<blockquote>
製品には、どうしても長期的な投資が必要なものがあると思います。<br />

例えば日亜化学の青色LEDだって、中村氏が個人で何年もかけて、
会社の中止命令を無視してやり遂げたと著書にありましたし。<br />

もし青色LED開発中に、
3ヶ月ごとに面談していたらどんな評価がされるんでしょう？<br />

失敗続きで亀のようにのろく、先が見えない実験の繰り返しでしょうから、
それらの失敗が将来大きなリターンになって返って来ることを
強く確信している人でなければ、続けられませんよね。
<div align="right">「<a href="http://hamasta.g.hatena.ne.jp/hamasta/20070116/p1">同ページ</a>」から続けて引用</div>
</blockquote>
<p>
「技術者の成果」とは何でしょう？
</p>
<p>
技術者が作ったものから得られる売上でしょうか？
もちろん、それだけではないですよね？
「青色LED」のように最終的に莫大な利益を生み出したものは、
とても分かりやすい「成果」ですが、
サーバシステムの運用などのような縁の下の力持ちの仕事だって
立派な成果ですし、
さらに、
自分自身では何も生み出さなくても、
社内の技術者を育てることや、
社内の技術をブログなどで発表して会社の知名度を上げることなども、
立派な成果と言えるでしょう。
</p>
<p>
したがって「3ヶ月ごとの面談」という制度が問題なのではなく、
きちんと技術者を評価できない上司をそのままにしておくのが問題なのです。
そしてそういう上司をそのままにしている上司の上司も問題ですし、
そのまた上の上司の上司の上司にも責任があります。
</p>
<p>
こうやって責任の連鎖を上へ上へ登っていくと、
技術者の評価制度が機能するか否かは、
技術者の評価について最終的な責任を負う人がいるのか？
という点に行き着くことになります。
</p>
<p>
技術者を目指す学生のみなさんには、
ぜひこの点
──この会社では誰が技術者の評価の最終責任を負っているのか？──
を押えた就職活動をするようお勧めします。
そしてできれば、「誰が責任者か」だけでなく、
その責任者がどんな考えを持っているのか調べられるものは全て調べ、
さらに疑問点があれば直接会ってでも質問するくらいの勢いで
臨んで欲しいと思います。
</p>
<div align="right">
KLab株式会社 取締役<br />
兼 最高技術責任者<br />
仙石浩明
</div>]]> 
</content>
<author>
<name>klab_sengoku</name> 
</author>
</entry>

<entry>
<title>La Fonera (FON ソーシャルルータ) で VPN-Warp を使う</title> 
<link rel="alternate" type="text/html" href="http://sengoku.blog.klab.org/archives/51621333.html" />
<modified>2008-06-29T14:04:04Z</modified> 
<issued>2007-01-15T07:02:11+09:00</issued> 
<id>tag:blog.livedoor.jp,2008:klab_sengoku.51621333</id> 
<summary type="text/plain">
La Fonera (FON ソーシャルルータ) って知っていますか？


FONは世界最大のWiFiコミュニティです。
誰もが「世界中どこからでもインターネットに無料で接続したい！」という
望みを持っているはずです。
そのようなメンバーが助け合ってWiFiを広めて行こう！という...</summary> 
<dc:subject>VPN-Warp</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://sengoku.blog.klab.org/archives/51621333.html">
<![CDATA[<p>
La Fonera (FON ソーシャルルータ) って知っていますか？
</p>
<blockquote>
FONは世界最大のWiFiコミュニティです。
誰もが「世界中どこからでもインターネットに無料で接続したい！」という
望みを持っているはずです。
そのようなメンバーが助け合ってWiFiを広めて行こう！ということを
コンセプトに私たちは活動しています。
元々簡単なアイディアで始まったFONコミュニティ。
メンバーが作るWiFiインフラを用いて、
WiFiを世界中のどこからでも楽しめるようにしましょう！。
<br />
参加は簡単！<a href="http://www.tsukumo.co.jp/fon/">FON取り扱い店</a>でLa Foneraを購入して接続してスタートするだけ!
<div align="right"><a href="http://jp.fon.com/info/whats_fon.php">FON 公式ページ</a>から引用</div>
</blockquote>
<p>
La Fonera は、FON のアクセスポイントであると同時に、
普通の (プライベートな) 無線LAN アクセスポイントとしても利用できます。
自宅などで無線LAN アクセスポイントを設置している人は多いと思いますが、
おそらくそのまま La Fonera で置き換えることが可能でしょう。
</p>
<p>
実際、私はそれまで使ってた
<a href="http://blog.gcd.org/archives/50770093.html">無線LAN ルータ WN-G54/R2</a> を La Fonera で置き換えてしまいました。
La Fonera が提供する二つのアクセスポイントのうち、
プライベート側を使えば、
自宅LAN に普通にアクセスできて、
いままで使っていた無線LAN ルータに比べて全く遜色ありません。
もちろん WPA2 (Wi-Fi Protected Access 2) 暗号化方式が使えます。
</p>
<blockquote>
より正確に言うと、
La Fonera のプライベート側アクセスポイント (MyPlace) は、
自宅LAN とは異なるセグメントになります。
有線LAN と無線LAN 相互で自由に通信するためには、
多少の設定変更 (/etc/firewall.user に 2行ほど追加) が必要になります。
</blockquote>
<p>
私の場合 WPA に対応していない古い無線LAN 端末 (Windows98マシン^^;) も
持っていて、
自宅の無線LAN を WEP から WPA2 に変更した
(自宅LAN といえど、WEP を使うのはちょっと抵抗がありますよね？)
時点で、
お蔵入りにしていました。
La Fonera が提供するもう一つのアクセスポイント (パブリック側) を使えば、
直接自宅LAN へはアクセスできないもののインターネットへは接続できるし、
インターネット経由で自宅LAN に戻ってくる
(もちろんインターネットからアクセス可能な部分に限定されますが)
ことも可能なので、
La Fonera の導入によって古い無線LAN 端末も再び利用できるようになった、
というオマケがつきました。
</p>
<p>
さて、
この La Fonera で VPN-Warp が利用可能になったらどうなるでしょうか？
無線LAN ルータが VPN ゲートウェイの機能も持つわけです。
つまりインターネットに接続できる環境ならどこからでも、
自宅LAN へ手軽にアクセスできるようになります。
</p>
<p>
ここで La Fonera は固定 IP アドレスを持つ必要がないばかりか、
そもそもグローバルアドレスを持つ必要性すらない、
という点がミソです。
必要なことは、La Fonera からインターネットへ接続可能、ということだけです。
La Fonera をどこに設置しようと、
その設置した LAN に外部からアクセスすることができます。
</p>
<p>
以下は、La Fonera で VPN-Warp を使うようにするための手順です。
現状は多少の Linux の知識が必要となってしまうのですが、
要は relayagent プログラムを La Fonera にインストールするだけのことなので、
適切なインストーラさえ作ればいくらでも簡単な手順になることでしょう。
なので、難しそうだとあきらめるのではなく、
関心がある方はご連絡頂ければと思います。
</p>
<p>
まず La Fonera に ssh あるいはシリアルコンソールで
ログインすることが必要となります。
おそらくこれが最大の難関でしょう (^^;)。
</p>
<pre class="terminal">
senri:/home/sengoku % ssh fonera
root@fonera's password:


BusyBox v1.1.3 (2006.11.21-19:49+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.

 _______  _______  _______
|   ____||       ||   _   |
|   ____||   -   ||  | |  |
|   |    |_______||__| |__|
|___|

 Fonera Firmware (Version 0.7.1 rev 2) -------------
  *
  * Based on OpenWrt - http://openwrt.org
  * Powered by FON - http://www.fon.com
 ---------------------------------------------------
root@OpenWrt:~#
</pre>
<p>
ログインさえ可能なら、あとはさほど難しくはありません。
まずネットワーク経由で La Fonera に relayagent を
インストールするための準備をします。
具体的には、
以下のように /etc/ipkg.conf に「src gcd http://www.gcd.org/fonera」 を追加し、
「ipkg update」 を実行します。
</p>
<pre class="terminal">
root@OpenWrt:~# echo "src gcd http://www.gcd.org/fonera" >> /etc/ipkg.conf
root@OpenWrt:~# ipkg update
Downloading http://download.fon.com/release/fonera/0.7/packages/Packages
Updated list of available packages in /usr/lib/ipkg/lists/fon
Downloading http://www.gcd.org/fonera/Packages
Updated list of available packages in /usr/lib/ipkg/lists/gcd
Done.
root@OpenWrt:~#
</pre>
<p>
<a href="http://www.gcd.org/fonera">http://www.gcd.org/fonera</a> というのは、
私が最近始めた <a href="http://blog.gcd.org/archives/50855588.html">La Fonera 用の ipkg feed</a> です。
つまり、上記のような設定をしておくと、
La Fonera にいろいろなソフトウェアを
ネットワーク経由でインストールすることができるようになります。
もちろん ;-) VPN-Warp の relayagent も、
ここからインストールできます。
インストールに必要なコマンドは、
「ipkg install relayagent」だけです。
このコマンドを打ち込むだけで、
relayagent の実行に必要な OpenSSL ライブラリ等が
自動的にインストールされます。
</p>
<pre class="terminal">
root@OpenWrt:~# ipkg install relayagent
Installing relayagent (1.0.7) to root...
Downloading http://www.gcd.org/fonera/relayagent_1.0.7_mips.ipk
Installing libopenssl (0.9.8d-1) to root...
Downloading http://www.gcd.org/fonera/libopenssl_0.9.8d-1_mips.ipk
Installing zlib (1.2.3-3) to root...
Downloading http://www.gcd.org/fonera/zlib_1.2.3-3_mips.ipk
Configuring libopenssl
Configuring relayagent
Configuring zlib
Done.
root@OpenWrt:~#
</pre>
<p>
次に、VPN-Warp の証明書をインストールします。
<a href="http://mobile.biglobe.ne.jp/vpnwarp/">BIGLOBE の VPN ワープのページ</a> などから入手した証明書とそのパスワードを記したファイルを、
La Fonera の /etc/warp ディレクトリへコピーしてください。
以下の実行例では relay,5000005.pfx が証明書のファイル、
relay,5000005-pass.txt がパスワードを記したファイルです。
5000005 というのは私が使用している証明書の番号なので、
実際に取得した証明書の番号で読み替えてください。
</p>
<pre class="terminal">
senri:/home/sengoku % echo "パスワード" > relay,5000005-pass.txt
senri:/home/sengoku % scp -p relay,5000005.pfx relay,5000005-pass.txt fonera:/etc/warp/
root@fonera's password: 
relay,5000005.pfx                             100% 4856     4.7KB/s   00:00
relay,5000005-pass.txt                        100%    9     0.0KB/s   00:00
</pre>
<p>
次が最後の難関で、
VPN-Warp の設定ファイルを作成します。
/etc/warp/relayagent.cfg.sample に設定ファイルのサンプルがあるので、
これを /etc/warp/relayagent.cfg へコピーして、
vi エディタで編集します。
</p>
<pre class="terminal">
root@OpenWrt:~# cd /etc/warp/
root@OpenWrt:/etc/warp# ls -l
-rw-------    1 root     root            9 Jan  9 04:09 relay,5000005-pass.txt
-rw-------    1 root     root         4856 Jan  9 04:09 relay,5000005.pfx
-rw-r--r--    1 root     root         3290 Jan  9 07:47 relayagent.cfg.sample
root@OpenWrt:/etc/warp# cp relayagent.cfg.sample relayagent.cfg
root@OpenWrt:/etc/warp# vi relayagent.cfg
</pre>
<p>
設定ファイル relayagent.cfg の中に、以下のような部分があるので、<br />
「relay,0000000」の数字の部分を実際に取得した証明書 <br />
(私の場合は「relay,5000005」) の番号で置き換えます。
</p>
<pre class="terminal">
#--------------------------------------------------------------------
#
# -x  PFX 形式 クライアント証明書を指定
# -X  同パスワードファイルを指定
#
#--------------------------------------------------------------------

-x "/etc/warp/relay,0000000.pfx"
-X "/etc/warp/relay,0000000-pass.txt"
</pre>
<p>
以上で設定ファイルの作成が完了しました。
あとは La Fonera を再起動する (裏面のリセットスイッチを押す) だけです。
再起動する代わりに、起動スクリプトを実行することによって
relayagent を起動することもできます。
</p>
<pre class="terminal">
root@OpenWrt:~# /etc/init.d/N50relayagent start
root@OpenWrt:~#
</pre>
<p>
では、ブラウザで https://warp.klab.org へアクセスしてみましょう。
La Fonera にインストールした証明書と同じ証明書、あるいは
その子証明書を使ってアクセスしてください。
La Fonera の Web 設定ページが表示されたら成功です。
</p>
<p>
Web 設定ページが表示されるのは、
先ほど作成した設定ファイル /etc/warp/relayagent.cfg に、
</p>
<pre class="terminal">
#--------------------------------------------------------------------
#
# &lt;relay サーバ名:ポート番号&gt;  &lt;転送先ホスト名:ポート番号&gt;
#
# ※-p オプション指定時は下記の意味となる
#
# &lt;プロキシサーバ名:ポート番号&gt;　&lt;転送先ホスト名:ポート番号&gt;
#
#--------------------------------------------------------------------

warp.klab.org:443 localhost:80
</pre>
<p>
と書いてあるからです。
「localhost:80」だから La Fonera 内蔵の WWW サーバ (つまり設定ページ) ですね。
「localhost:80」の部分を、
自宅LAN 内の適当なサーバの「アドレス:ポート」で置き換えれば、
そのサーバにアクセスできますし、
通常の VPN-Warp と全く同様に、
任意のサーバに接続するように設定することもできます。
</p>]]> 
</content>
<author>
<name>klab_sengoku</name> 
</author>
</entry>
</feed>