コラボレーションカンファレンス2010 in 福岡

株式会社ヌーラボさん主催の「コラボレーションカンファレンス2010 in 福岡 — 2010年10月30日13:00から開催!」に参加してきました。定員300人という事だったのですが、実際には150名ぐらいでしたでしょうか(ちょっと会場費とかが心配になりつつ・・・)。

前半は情報提供型のセッション、後半はワールドカフェという構成で、「コラボレーションで何なんだろう?」という事を、時には言葉で、時には感覚で、時には無言で、向き合い続けた一日でした。感覚って何?と思うかもしれませんが、例えば模造紙の上でペンを走らせることだったり、LEGO(R)シリアスプレイで味わった指先の感覚だったり、ワールドカフェのざわめきだったり、振る舞われたハーブティーの香りだったり。




分かりやすい例は、LEGO(R)シリアスプレイでの、チームの各人が今日のカンファレンスにぶつけてみたい気持ちを1つのパーツに例えて語り、それを融合して新たなストーリーを考えるという時間。僕は、結構人見知りなので、ごちゃごちゃ考えず「透明な心」で話してみたいということで、透明なパーツを選択。そういう感じでチームメンバー4人で話し合って出来たのが「透明な気持ちで色々な人に絡んで話をしその結果何かが芽生える」というストーリーと右の作品。コラボレーションで新たな何かが生まれるという手触りを改めて感じた時間になりました。

もちろん、各セッションや、ワールドカフェのことも挙げたいのですが、語り尽くす文才がないのでごめんなさい。でも、ワールドカフェが終わり、ワールドバー(まあビール片手の懇親会タイム)が始まった後でも、あちこちのテーブルに残された模造紙に書かれた言葉をつまみに、コラボレーションについて熱く会話を続ける人たちをちらほらみかけるほどHOTだったということは、お伝えしておきたいと思います。

それから、当日は意識しなかったのですが、このエントリを書きながら改めて思いました。僕たちは、コラボレーションって聴くとつい、二人以上いないと出来ないものだと思ってしまうのですが、実は僕ら自身、コラボレーションが歩いているようなものなのですよね。なぜなら、これが自分だと言い切れる絶対的なものはないにも関わらず、親や、友達や、会社の同僚・上司、色々な人の言葉に影響を受けながら、新たな何かを生み出していく存在だから。

LEGO(R)の2×4の最も基本的なパーツでさえ、2つ組み合わせると24通り、3個では1,060通り。6個のブロックでは一億以上らしいです。今回使った47個のパーツだとまさに無限大といっていい数値になっちゃいます。双子でさえ性格が同じにならないように、遺伝子も周りから影響も違う僕らはどんなに頑張っても同じになれない個性の塊、まさにコラボレーションそのものだなあ、とちょっと壮大な事を考えてみたりしました。コラボレーションがコラボレーションしている、そんな贅沢な?時間を提供していただいてた、ヌーラボさんに感謝。

IT系の企業が主催する、五感で感じるカンファレンスは、きっと世の中の色んな人を巻き込んで、まさにコラボレーションそのものになって行くんだろうと思います。
こういうセミナーとかを生業にしている人たちも、うかうかしてられないですよ・・・。

mod_proxyを経由するとURIが勝手にデコードされる

フロントに Apache を置き、バックエンドの Tomcat に mod_proxy_ajp 経由でリクエストを転送するという一般的な構成において、日本語では探しても余り見つからなかったネタがありましたので書いておきます。

リクエスURIに「URLエンコードされた文字」を含む場合、mod_proxy はこれらの文字をデコードした上で、バックエンドに転送します。

この動作は、通常のWebアプリでは特に問題にはならないと思います。

しかし、次のようなリクエスURIを考えてみましょう。

/path/to/foo%3Bbar

これをデコードすると次のようになります。

/path/to/foo;bar

ご承知の通り、URIセミコロンが含まれていた場合、Tomcat はそれ以降の文字を別セグメントと認識してしまいます。このため、mod_proxy_ajp 経由の Tomcat では、

request.getPathInfo()   -> /path/to/foo
request.getRequestURI() -> /path/to/foo;bar

と、getPathInfo() ではセミコロン以前の部分しか取得できません。無論、mod_proxy_ajp を経由せず、Tomcat で直にリクエストを受け取ると、

request.getPathInfo()   -> /path/to/foo;bar
request.getRequestURI() -> /path/to/foo%3Bbar

となります。

これについては、すでに mod_proxy のバグとしてレポートがなされていて、ProxyPassディレクティブへの "nocanon" というパラメータの追加という形で回避できるよう修正されています。この修正は、Apache 2.2.7(非公開)以降で有効なのですが、mod_proxyのリファレンスの日本語には無く、英語版にしか記述がありません。

この英語版の該当部分を見ると以下のようになっていて、

Normally, mod_proxy will canonicalise ProxyPassed URLs. But this may be incompatible with some backends, particularly those that make use of PATH_INFO. The optional nocanon keyword suppresses this, and passes the URL path "raw" to the backend. Note that may affect the security of your backend, as it removes the normal limited protection against URL-based attacks provided by the proxy.
http://httpd.apache.org/docs/2.2/en/mod/mod_proxy.html#proxypass

「オプションの"nocanon"というキーワードによって『これ(URLをデコードしちゃう処理 = canonicalise)』を抑制することができ、バックエンドには"生の"URLが渡されるようになる」ことが分かります。

つまり、今まで httpd.conf に、次のように設定していた所を、

ProxyPass /context/ ajp://192.168.0.x:8009/

次のように変更すればOKです。

ProxyPass /context/ ajp://192.168.0.x:8009/ nocanon

これにより、mod_proxy_ajp を経由しても Tomcat で直にリクエストを受け取った時と同じように動作します。

ちなみに、ProxyPass への nocanon キーワードの追加は 2.2.7 で取り込まれているのですが、mod_proxy_ajp などのモジュールでは無効だったようで、これまた、バグレポートされています。なお、これもすでに修正されていて、2.2.9 に取り込まれています。

2010/1/21追記
mod_proxy_ajp経由の getRequestURI() の戻り値はセミコロンを含むのが正解でしたので修正しました。また、Tomcat直アクセス時の getRequestURI() の戻り値に関して、URLエンコードの記述が間違っていましたのでこちらも修正しました。

Viliv S5 のタッチパネルのキャリブレーションで position error が起きたら

周りはスマートフォンだったり、Mac Bookだったりを購入している中、Viliv S5 というガジェットに手を出してしまいました。Windows搭載のゲーム機サイズPCっす。
SHARPNetWalkerとか、工人舎のPMとかも迷ったのですが、どっちも実際にさわってみるとキーボードが親指押しじゃないとつらい感じがして、それならキーボードが無くてもよくね?となりました。

昨日届いたので、早速セットアップしていたのですが、タッチパネルのキャリブレーションに失敗してややこしいことになったので書いておきます。

最初、vilivManagerという管理ツールからキャリブレーション(TouchCarrib.exeが実行される)を行ったのですが、再起動しないとキャリブレーション結果が反映されないというのを知らず、「あれ?やっぱりズレる」と何度もキャリブレーションを繰り返しました。その際に、どうもかなりオフセット値を変更しまったみたいで、再起動後、キャリブレーション前よりさらに大きくずれてしまいました。左上はそれなりにあっているのですが、右下が少なくとも50ピクセル以上ずれた状態に…。

で、もう一度、キャリブレーションを試みました。左上→左下まではタッチ出来たのですが、右下をタッチすると「position error」と出て先に進めない! 恐らく、オフセットがずれすぎていてタッチの許容範囲を超えてしまっているのでしょう。これはちょっと非道いっすよ。

オフセットを初期状態にリセットする方法をアレコレ探したのですが、どうも無いようです。TouchCarrib.exeはレジストリを直接書き換えているみたいなので、値を直接変更すればいいのでしょうけど…。でもそれはさすがにメンドいので、ドライバをアンインストールする事にしました。

  1. vilivのサイトから、タッチパッドのドライバを落として展開しておきます。XP,Vista共通ドライバはこちら
  2. バイスマネージャから、マウスドライバにカテゴリされている「ATOM TouchPad/Mouse Driver」を右クリックして、完全に削除します。
  3. 再起動します。再起動後、タッチパネルが新しいハードウェアとして認識され、MS標準のPS2マウスドライバが自動インストールされます。
  4. 再び再起動します。再起動後は、こちらのサイトを参考にタッチパッドドライバの再インストールを行います。
  5. さらに再起動すると、オフセットが初期状態に戻るはずです。

この後、TouchCarrib.exeを実行すると、右下のタッチも有効となり、ようやく使えるようになりました。よかった。よかった。

S2Fisshplate経由ではカスタムパーサを指定できない?

S2Fisshplate(0.1.5-SNAPSHOT@276)経由でFisshplateを使う際に、カスタムパーサが渡せないような気が…。
S2FisshplateInterceptor#addRowParser(Class clazz) みたいなメソッドがあれば、カスタマイザに渡すインターセプタを自前で定義する(つまり、s2fisshplate.diconを使わない)ってことで実現はできそう。こんな感じ。

<component name="interceptor" class="org.seasar.fisshplate.interceptor.S2FisshplateInterceptor">
    <initMethod name="addRowParser">
       <arg>@foo.MyRowParser@class</arg>
    </initMethod>
</component>
<component class="org.seasar.fisshplate.meta.impl.TemplateMetaDataFactoryImpl" />

でも、s2fisshplate.diconを使いながらも、カスタムパーサを指定できる、なんかもうちょっとスマートなやり方もありそうな気もするなあ。どうなんだろ。

追記

MLに投げたら早速、id:rokugen さんに対応していただきました。
S2Fisshplate 0.1.5-SNAPSHOT@279以降は、以下のようにしてカスタムパーサを追加できます。

addOnParserContainerというコンポーネントが定義されているので、
これにコンポーネント登録した独自パーサを登録します。
例えばTestRowParserというパーサを追加する場合

<component name="addOnParserContainer"
class="org.seasar.fisshplate.core.parser.container.AddOnParserContainer"
> >
<!-- ここから追記 -->
  <initMethod name="addRowParser" >
    <arg>
      <component
class="org.seasar.fisshplate.interceptor.TestRowParser" ></component>
    </arg>
  </initMethod>
<!-- ここまで -->
</component>

http://ml.seasar.org/archives/seasar-user/2009-October/018796.html

ああ、ありがたや。

振り返りの光明

ウチの会社のとあるプロジェクトのふりかえりに参加しました。詳しくは、id:kimpoさんのエントリを参照。

プロジェクトのふりかえりってドーしても暗いイメージが漂いがちなのですが、なんか光明を見た気がしました。何に光明を感じたのか、簡単にまとめてみたいと思います。

振り返りの道具とその意図

これまでも、ふりかえりの道具をいろいろ使ってきました。例えば、id:kimpoさんも指摘しているKPTとかですね。僕もKPTに関しては、「整理は出来た気はするけど、なんか次に繋がらない感」を感じていました。

そこで…という訳ではないですが、今回KPTをやる前に、以下の資料を読みました。

http://www.objectclub.jp/download/files/pf/RetrospectiveMeetingGuide.pdf

目から鱗でした。僕はコレまで、KPTに関して本当に表面的なことしか理解していなかったんだということを思い知らされました。僕が持っていたKPTに関する認識は以下の程度です。

  • Kで、今後も続けたい取り組みを上げる。
  • Pで、現状の問題点をリストアップする。
  • Tで、解決策と取り組みを考える。

しかし、上記の文章を読み、その上で実際に振り返りをやってみて、以下のような確信を得ました。

  • Kは達成感を共有し、問題解決に取り組むための自信と勇気を得ることが目的である。
  • Pは起こっている現象に着目することで各人が持っている先入観や認識のずれに気付き、取り組むべき真の問題を全員で掘り起こすことが目的である。
  • Tは各メンバーの問題解決力を信じ、主体的かつ積極的な行動を起こしやすい課題の設定を行う事が目的である。

なんと、今までの理解が薄かったことか。こういう真のねらいまで意識することで、ようやくKPTを勧める人たちの意図をくみ取る準備が整った気がします。

新しい道具を取り入れてみようという姿勢自体は素晴らしいのですが、うまくいかないからといってすぐに諦めるのではなく、その問題意識を足がかりに道具を考えた人の意図にまで遡ることが重要だと感じました。

ふりかえり後の共有感

少し深い理解を持ってふりかえりに取り組んだ結果、面白い感覚の変化がありました。

これまでのふりかえりは、模造紙に貼り付けられた付箋の数に比例して達成感を感じているフシがありました。もちろんそれぞれの深さも重要ですが、メンバーの2割ぐらいはリーダー的な視点をもっているので、その人達が普通に書けばレベルは底上げされてそれなりになっていた気がします。

今回のふりかえりは、時間をかけた割に出てきた付箋の数はそんなに多くなく、達成感はそれほど高くはありませんでした。しかし、存在する課題がメンバーの間で共有されたという感覚は、これまでにないくらい高いものになったと思います。

この「達成感」という感覚から、「共有感」というべき感覚へのシフトは非常に重要だと思いました。

「達成感」はとても大事なのですが、どうしても抽象論が多かったり、ともすると「ふりかえり」をしたこと自体に満足してしまって次に繋がらない、なんてことになってしまいがちです。

ところが「共有感」はじんわりとですが、例えば明日のおはようの挨拶から何かが変わる予感と、次回のふりかえりまでの連続性を生み出してくれる気がします。

まだ、気がするという程度ですが、今後取り組む中できっと確信に変わると思わせる何かを感じました。

=*=*=*=

今まで、頭で理解しただけで分かったつもりになっていましたが、実際に取り組みを手伝わせてもらって、ようやく身になってきた気がします。

それを体験させてくれた、id:kimpoさんの地道な取り組みにはただただ感謝です。
また、この場を提供してくれたメンバー全員も感謝。
今後のふりかえりでも全力投球させてもらいます!

XDev2009:2つのセッションで思ったこと

9/15に、目黒雅叙園で行われたXDev2009。歩いていける程度の距離で打合せがあったので、空き時間を利用して参加してきました。何コマか見たのですが、響いたのは「幸せなエンジニアになるための仕事術」と題されたまつもとさんと平鍋さんの対談と、「ITpro Challenge! 2009 Light」の中の、角谷さんの「Do You See the Light?」の2つ。

ものすごい私的なまとめで恐縮なのですが、「限られた行動範囲のなかで見つけたロールモデルで自分を苦しめても意味がない。ロールモデルはあくまで道具。もっと世の中に出てみて適切なロールモデルを見つけて利用しよう。」ってことに気づけたのが一番の収穫でした。

まつもとさんについてはなんて言うんでしょう「我が道を行ってる」感じで、共感するというより「すげー人だなあ」という思いが強いんですが、平鍋さんの方はそんなまつもとさんに対する距離感の置き方が僕の思いに近なあと思い、失礼ながら勝手にシンクロさせて話を聞いていました。

平鍋さんはお子さんが生まれたのをきっかけに福井に戻ったそうです。そこで生まれた時間のなかで「JUDE」を作り、自ら営業するという選択をしてチェンジビジョンを立ち上げたと。お話を聞いていると、まつもとさんのような開発そのものに喜びを見出すスーパーハッカーではなく、開発というプロセスで発生するコラボレーションに喜びを見出す方なのかなと思いました。

その中で何度も「世界をめざす」という言葉が出ていたので、その辺に何となく思うフシがあった僕は、なんで地方に軸足を置いていながらそう思うに至ったんだろう?と思い、質問してしまいました。「このままじゃヤバイと思った」というのが、確か答えだったと思うのですが、すんません、質問で舞い上がってしまってうろ覚えです。

さっき知ったのですが、世界を目指すって、
「世界一を目指す」,チェンジビジョンがJUDEをastah*に改名,有償版を年額5000円からに | 日経 xTECH(クロステック)
のことだったんですね…。

それはさておき・・・つまり、世の中には

言語開発→国内外で徐々に浸透→キラーフレームワーク登場→爆発的人気

という導線をたどる人もいれば、

製品開発→営業に奔走→国内で一定の販売実績→世界展開をねらう

という導線をだとる人もいるんですよね。当たり前ですけど。

そして、やってる事や売っているモノも多種多様で、世の中的にはSaaSとかクラウドとかに移行していっているとは言え、その背景で色々な人がうごめいているという事実。なんてこったい。

あと、角谷さんの「自分はすごい人ではないけど,できることはたくさんある」という話も、とどめをさしてくれました。自分に置き換えて考えると…自分からそのうごめく人たちの中に飛び込まなくて、スマートなやり方であっさり解決してやろう…なんてナナメ上から考えているから苦しむ結果になる。そんなことで悶々とするぐらいなら、ボトムでもいいから今出来ることをやろう。その方が世界が開ける。そういうメッセージとして受け取りました。

まさしく、僕にとっての「一度見た光」でした。

角谷さん本人は「まとめもなにもないLTだ」と謙遜されていましたが、真摯な思いが伝わるトークで、僕は非常に共感できました。

僕は表に出てきているものだけを見て戦線恐々としていました。でも、この日、そういったうごめいている生身の人間を見ずにいたという事実のバカバカしさに、ようやく気付いた気がします。

まだ、うまく言語化できていないですけど、「感じ」だけ記録しておきます。

僕も気になるゲーム機サイズノート

確かに気になる、シャープ PC-Z1と工人社 PMシリーズ。
最近、めっぽう物欲が落ちてるのですが、久々にひかれました。
と思ったら、比較表を作ってくれている方が・・・。

Android★SQUARE:シャープ PC-Z1、工人社 PM 比較表

うーん、立って使うシーンを考えると、ポインティングデバイスのあるPC-Z1の方がいいかなあ。でも、PMシリーズのSSDBluetooth内蔵って所やIA32アーキにもひかれる。

その前に、ウチの大蔵大臣の説得の方が気になるけど。