2009年3月28日土曜日

XPJUG24thに参加してきた

日本XPユーザーグループ主催の「第24回XPJUGユーザ会『アジャイルな見積りと計画づくり』」に参加した。

実はこの日は嫁の誕生日だったりしたんだけど、ウチの嫁なら誕生日を優先してこういったイベントに参加しない方がDISってくるに違いない、そういう嫁だし!と勝手に解釈して誕生日の方は華麗にスルーした。

勤務先(3月末で退社するけど)が芝浦だから歩いて30分はかからないし、19時なら5分前には余裕だなーとか考えていたら、18:45集合となっていて焦った。タクる事にしたが、海岸通りは通りの大きさと比べると意外にタクシーの流通量が少なく、結局ギリで間に合うカンジだった。到着した後はビルの入り方がわからず「どうやって入ろう?どこが集合場所なんだ?」とか思っているとウマイ具合にこんぴろさんと出くわして、結局ギリギリだった。集合して受付した後はスタッフの方に誘導していただいて、会場に入ったんだが、目に飛び込んで来たスクリーンのタイトルは「第24回XPユーザ会 -期末が何だ全速前進- アジャイルな見積りと計画づくり」となっていた。

安井力さん、陽の巻

  • 「宝の地図」を使った話がわかりやすかった。うまい例だなー、と思ったが、有名な例なのかな?「妥当なプロセス」「結果を残すプロセス」というふたつの例をでは「妥当なプロセス」の方が極端過ぎるやろ!ととらえられそうな程だったけど、よくよく考えるとあながち間違っていない。よくあるよくある、といったカンジ。普段からこんな仕事の仕方をしていたのか、としみじみ思う。
    1. 最初はあいまいで不正確
    2. その現実を受け入れる
    3. 前進し、出て来た問題に合わせて修正する
    これを繰り返していく事で曖昧さが減って来て、だんだん正確になってくる。
  • 計画作りとは、価値の探求。価値とは、ステークホルダからのフィードバックを得てたどり着く先にあるもので、最初から固定するものではない。
  • 変化に対応する事を計画に織り込む。
    • 積極的に変化するために計画を
    • 遠い将来は正確にはわからない。でも、精度を落として予測する事はできる

途中で何度か「みなさんは計画する事は好きですか?」という質問があったが、自分は計画する事は結構好き。計画が無かったりあまりにも根拠が無い計画に遭遇した時の、あの不安な落ち着かない気分が大っ嫌いだ。計画が無い状態での全速前進は難しい。

角谷信太郎さん、陰の巻

  • 本のタイトルになっている"Estimating"も"Planning"も名詞じゃない。アクティビティだ。どちらも主体が必要だ。それは「人」だ。
  • アジャイルは形容詞だ。「いきいきとした」「活発な」という訳がある。だからどれだけアジャイルか?という「度合い」である。アジャイルプロセス、なんていうモノは存在しない。
    • WordReference.comにもそういう訳があった
    • アジャイルプロセス、という単語を使う人は確かに多いからなー。アジャイルという習慣をわかっていない人ほどそうなんだろうな。特に日本には多いように思う。本質を理解せず、単に見かけの形だけ取り入れてみて、結果が出ないとか言っちゃう人たち。
  • フィードバックとは、学び、である。学びは人に対して行うもんじゃない、人が行うもの。だから、アジャイルなプロセスでは人が中心に据えられるべきである。
    • 人が中心!とかはよくいうけど、ちゃんとこういった事を理解しないと難しいなー。人が中心!てのは「言ってるだけ」「言いたいだけ」という事が非常に多い。
    • 自分が気になったのは、「教える」じゃなくて「伝える」という事。これは、意識していてもついつい「教える」気分になってしまうから注意が必要だ。
  • 人は学ぶ、という事を信じられるか?
    • これは大変に難しい事だと思う。たくさんの経験を積まないと、これは難しいなー。誰かに信じてもらえる事を期待するなら、これをできる事にしないといけないんだろな。だがしかし、意識しても難しいなー。だって、人間だもの。

かくたにさんの熱は存分に受け取った、伝わった、という気分。本を読んだからXPJUG24thは…と思った人は損しているから、動画を見た方が良いと思いますよ!

プランニングポーカー体験ワークショップ

書籍にも出て来ていた見積もりの方法の体験。

  • 皆で見積もる事で、見積もりの精度が上がる。個人の見積もりで漏れる考慮点や意外な角度切り口の視点が飛び出してくる。スゴイ。
  • 皆で見積もると、見積もる対象のアクティビティに対する知識が増える。見積もりの段階から既に「学び」があるのだ。
  • 見積もる対象に対する不明点を明らかにできる人がいないと見積もりはできない
    • これは重要。当たり前の事だろうけど、重要なポイント
    • 逆に普段の仕事ではこれどーなってんだろな、というのが心配。ちゃんとできていない計画が回って来ているのはわかってるんだけどね!(そういったプロジェクトも多い、というかそんなのばっかりです)
  • 色々な要素が出てきそうなストーリーに対しては、そこから別のストーリーへ分割してしまったり。
    • 自分が参加したテーブルはかくたにテーブルだったんだけど、かくたにさんは「んじゃ分割しちゃいましょう」と。
    • 今回の体験ではやらなかったけど、かくたにさん曰く「あまりにも小さいものは一番小さい粒度の中に複数をまとめてしまえば良い」と。「実際のプロジェクトでは数百あるんです、その中で1だとか0.5だとかは意味がない」と。これは書籍にも書いてある内容だと思うけど、実際に体験した後で聞くことでより体で理解ができたように思う。

実に良い体験をした。こんな風にしてチームで見積もって、その計画の中で仕事ができるってのはいい事だなぁ。メンバーも気分良く作業できるんだろぅ。

懇親会

いつものように喫煙組で固まった席にいたんだが、全然モノを喰わなかった。QuickJUnitでのこんぴろさんの作業に関して集まったメンバが、色んな濃い話をしだして、盛り上がりすぎて、メシどころじゃなかった。楽しかった、しか感想が無い。みんないきいきと話をしていましたね!

  • かくたにさんに「ReleaseIt読んでますか?」と尋問されたが、読んでます(まだ途中だけど)、と回答できてヨカッタ。
  • gitじゃなくてgithub、よくわからないけどgithub。assemblaを提案しても、github。チケットの管理システムがなくてもそんなの関係なくgithub。
  • 曳光弾の話をした際に、ShipIt!について、かくたにさんが「ツールに頼り過ぎ、というカンジがするなー」という話をされていた。ここに関しては、すっげー興味があったけど、あまり深く突っ込む機会が無かったのが残念。
    なんでかというと、自分は普段「もっとツール使おう」と思う事が多いから。例えば、TimeTrackingなんかがソレ。これはアナログでは難しい事だ。TimeTrackingを行動のフロントエンドとすると、それにつられて色んな事がデジタルツールとなる。ちなみに管理という目的ではない。

喫煙テーブルに引きこもっていたため、あまりたくさんの人とは挨拶しなかったのが残念!もっと動けば良かったのぅ。

スタッフの方々、素晴らしいお話をしてくださった安井さん角谷さん、会場を提供してくださったTIS株式会社様、ありがとうございました。色んな刺激や体験ができ、良い時間を過ごす事ができました!

2009年3月18日水曜日

mavenで複数のWebコンテナを使ってintegration-testする

profile機能をうまく使う。project/profiles配下の要素で、必要なだけprofileを用意するカンジ。mvn clean installするとintegration-testが実行される。

projects直下のbuild/pluginsで定義しているsurefire-test
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <includes>
      <include>**/server/**/*Test.java</include>
    </includes>
  </configuration>
  <executions>
    <execution>
      <id>surefire-integration-test</id>
      <phase>integration-test</phase>
      <goals>
        <goal>test</goal>
      </goals>
      <configuration>
        <skip>false</skip>
        <includes>
          <include>**/client/**/*Test.java</include>
        </includes>
      </configuration>
    </execution>
  </executions>
</plugin>
testフェーズでは**/server/**をtest対象とし、integration-testフェーズでは**/client/**をtest対象としている。
開発時用のprofile
<profile>
  <id>development</id>
  <activation>
    <activeByDefault>true</activeByDefault>
  </activation>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <includes>
            <include>**/server/**/*Test.java</include>
          </includes>
        </configuration>
        <executions>
          <execution>
            <id>surefire-integration-test</id>
            <phase>integration-test</phase>
            <configuration>
              <skip>true</skip>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</profile>
  • integration-testフェーズでは何もしない。
  • リソースファイルはデフォルトのsrc/main/resources,src/test/resourcesが適用される。
jetty上でintegration-testをするprofile
<profile>
  <id>it-on-jetty</id>
  <build>
    <resources>
      <resource>
        <directory>src/it/resources</directory>
      </resource>
    </resources>
    <plugins>
      <plugin>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>maven-jetty-plugin</artifactId>
        <version>6.1.10</version>
        <configuration>
          <contextPath>webappSample</contextPath>
          <scanIntervalSeconds>10</scanIntervalSeconds>
          <stopKey>foo</stopKey>
          <stopPort>9999</stopPort>
          <connectors>
            <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
              <port>8080</port>
              <maxIdleTime>60000</maxIdleTime>
            </connector>
          </connectors>
        </configuration>
        <executions>
          <execution>
            <id>start-container</id>
            <phase>pre-integration-test</phase>
            <goals>
              <goal>run</goal>
            </goals>
            <configuration>
              <scanIntervalSeconds>0</scanIntervalSeconds>
              <daemon>true</daemon>
            </configuration>
          </execution>
          <execution>
            <id>stop-container</id>
            <phase>post-integration-test</phase>
            <goals>
              <goal>stop</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <skip>true</skip>
        </configuration>
      </plugin>
    </plugins>
  </build>
</profile>
  • integeration-test前後でjettyの起動と終了を行う
  • 通常のtestフェーズではsurefire-testは実行しない。
  • リソースファイルはsrc/it/resource配下が適用される
tomvat上でintegration-testをするprofile
<profile>
  <id>it-on-tomcat</id>
  <build>
    <resources>
      <resource>
        <directory>src/it/resources</directory>
      </resource>
    </resources>
    <plugins>
      <plugin>
        <groupId>org.codehaus.cargo</groupId>
        <artifactId>cargo-maven2-plugin</artifactId>
        <version>1.0-SNAPSHOT</version>
        <configuration>
          <container>
            <containerId>tomcat5x</containerId>
            <zipUrlInstaller>
              <url>http://archive.apache.org/dist/tomcat/tomcat-5/v5.5.27/bin/apache-tomcat-5.5.27.zip</url>
            </zipUrlInstaller>
            <output>${project.build.directory}/tomcat5x.log</output>
            <log>${project.build.directory}/cargo.log</log>
            <timeout>60000</timeout>
          </container>
          <configuration>
            <home>${project.build.directory}/tomcat55</home>
            <properties>
              <cargo.servlet.port>8080</cargo.servlet.port>
              <cargo.logging>high</cargo.logging>
            </properties>
          </configuration>
          <deployer>
            <deployables>
              <deployable>
                <groupId>com.shin1ogawa</groupId>
                <artifactId>webappSample</artifactId>
                <type>war</type>
                <properties>
                  <context>webappSample</context>
                </properties>
                <pingURL>http://localhost:8080/webappSample/</pingURL>
              </deployable>
            </deployables>
          </deployer>
        </configuration>
        <executions>
          <execution>
            <id>start-container</id>
            <phase>pre-integration-test</phase>
            <goals>
              <goal>start</goal>
              <goal>deployer-deploy</goal>
            </goals>
            <configuration>
              <wait>false</wait>
            </configuration>
          </execution>
          <execution>
            <id>stop-container</id>
            <phase>post-integrastion-test</phase>
            <goals>
              <goal>stop</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <skip>true</skip>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <pluginRepositories>
    <pluginRepository>
      <id>cargo m2 release repository</id>
      <url>http://cargo.codehaus.org/dist2</url>
      <releases>
        <enabled>true</enabled>
      </releases>
    </pluginRepository>
  </pluginRepositories>
</profile>
  • integeration-test前後で、tomcatのダウンロード&インストール&起動&デプロイと、終了を行う
  • testフェーズではsurefire-testは実行しない。
  • リソースファイルはsrc/it/resource配下が適用される
製品用のパッケージングをするためのprofile
<profile>
  <id>production</id>
  <properties>
    <maven.test.skip>true</maven.test.skip>
  </properties>
  <build>
    <resources>
      <resource>
        <directory>src/production/resources</directory>
      </resource>
    </resources>
  </build>
</profile>
  • testもintegration-testも行わない。
  • リソースファイルはsrc/production/resources配下が適用される。

実はprofile機能は、プロパティの設定等を切り替える程度にしか使えていなかったんだけど、pluginの設定とかも書けるって最近知ったw profile機能のおかげでかなーーり幅が広がった。Hudson等のCIツールとの相性も非常に良いと思う。

で、ここまでは定義方法のテンプレートなんだけど、integration-testでの問題点として、自分は以下のような問題に直面している。例えばクライアント側Seleniumとかならいいんだけど、そうじゃなくてSwingなどのリッチクライアントだった時。当然、クライアント側のモジュールのカバレッジを取りたいワケだ。だがしかし、coberturaプラグインはtestフェーズで実行する時にしかカバレッジ計測が働かないようなのだ。testフェーズよりも前のフェーズで無理矢理Webサーバを起動するようにすればできない事はないのだけれど、キレイじゃないんだよなぁ。それとも、自前のlifecycleを定義してしまぅか…。

2009年3月17日火曜日

Eclipseの比較エディタ

比較エディタがアクティブな状態だと、ツールバーに「空白文字を無視する」というボタンが表示される。今日初めて知りました…。

2009年3月16日月曜日

2009年3月15日日曜日

Eclipse上でのレビューPlug-in: ReviewClipse

先日、eclipse plugin centralでReviewClipseというプラグインが紹介されていた。少し試してみたところ、以下のような特徴がある模様。

  • SVN専用ぽい。SVN用のPluginが必要で、SubVersiveとSubClipseに対応している
  • Commitしたchangesetに対するレビューセッションを作成する。これはGoogleのMondrianやその他でよく見られる「Commit前にレビュー」とはちょっと違う。個人的には何はまずリポジトリにCommitしておきたいので、この方法の方が好き。
  • レビューセッションやフィードバック等の情報を管理するリソースは先頭がドットのXMLファイルで保存され、これらのファイルもリポジトリにコミットされる
  • このPlugin的には、管理用のXMLファイルのビューアとして機能を提供するかんじ。

ここまでは、まぁ結構仕えそうなカンジだったんだけど、肝心のレビュー機能自体に問題が。

  • レビューで使うツールはdiffのみ。JDTのdiffでもなく、普通のdiff。
  • changesetに対して行えるフィードバックは「ステータス(Warning/Pass/Failure)」と「メッセージ」のみ。どのファイルのどこが…といぅよぅなコメントを残せない!

ちょっと惜しいなぁ、というツールでした。

Judeの不具合?

JudeのJavaソースコードの読み込み機能にて。

以下のようなふたつのアノテーションとそれを利用したクラスがあった場合。

MyAnnotation1.java
package com.shin1ogawa;

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MyAnnotation1 {
    String value();
}
MyAnnotation2.java
package com.shin1ogawa;

public @interface MyAnnotation2 {
    MyAnnotation1 value() default @MyAnnotation1("string");
}
MyClass.java
package com.shin1ogawa;

public class MyClass {
    @MyAnnotation2
    String field;
    
    @MyAnnotation2(@MyAnnotation1("aaa"))
    String field2;
}
これらをJudeの「Javaソースコードの読み込み」機能で読み込もうとするとJavaの解析中に以下のようなエラーが出てしまう。

Parsing: /Users/shin1/Documents/workspace.shin1/judeTest/src/com/shin1ogawa/MyAnnotation2.java
Failed to parse.m: Encountered "@" at line 4, column 39.
Was expecting one of:
    "abstract" ...
    "break" ...
    "catch" ...
    "do" ...
    "enum" ...
    "final" ...
    "import" ...
    "int" ...
    "long" ...
    "native" ...
    "public" ...
    "short" ...
    "switch" ...
    "throws" ...
    "true" ...
    "while" ...
     ...
     ...
     ...
     ...
     ...
    "..." ...
    "@" ...
    "<=" ...
    ">=" ...
    "!=" ...
    "||" ...
    
Failed.

どうやら「MyAnnotation1 value() default @MyAnnotation1("string");」でひっかかっている模様。このパラメータのdefaultを設定しないようにすると問題なく解析してくれる。アノテーションのパラメータにアノテーションの型を使用し、なおかつdefault値を使用するとダメなよぅだ。

2009年3月14日土曜日

Seasar Conference 2009 whiteに参加した

聞いた話のまとめはみんなもやるだろうし、主に自分が受けた印象、感想等を書いておく。

CubbyとMavenを使った開発のまとめスレ

Cubbyの存在は知っていたが資料でしか見た事が無かったので、世界の矢野によるWicketの話よりも優先した。あと、Mavenを活用している立場としてMavenの話もたくさん聞けるだろうと期待したり。

Cubbyはシンプル
カスタムタグやアノテーション等はそれぞれ7個、4個しかないとの事(そのうちそれぞれ4つ、3つくらいがメインとの事)。これはいいと思った。入りやすそうだ。「シンプル」には「敷居が低い(事前の教育的な)」という意味と、「アプリ作成者の創意工夫にゆだねる」という意味があるようだ。これは自分に取ってはかなーり好感度が高い。プロジェクトごとにプロジェクトの特徴に合わせた小さなフレームワークでラップしつつ使える、という事だ。ふたつの意味と書いたけど、これらふたつには強い相関があるのかもしれんなぁ。
JSP2.0について
昔嫌われていたJSPとは違い、2.0は随分便利になっているらしい。JSPは最初の印象から興味の対象ではなかったので、全然最新事情を知らなかった。スクリプトチックなものをJavaのクラス以外にも書くのが最も拒否反応を示した理由なんだけど、それは書かずに済むのかな?わからんけど、ちょっと見てみた方が良さそうだ、知っている世界とはもう変わっているという事だろう。
Path/URI
Pathとのマッピングをアノテーションで行ったり、URIの一部からパラメータを取得したりできる。Jerseyみたいなカンジ。URIの一部が、複数箇所あっても平気なのは嬉しい事が多い。NiceURLだ。
DIコンテナはS2だけじゃない
Guiceにも対応済みとの事。S2でいうAutoRegister的な事がやりたければ、それは全部Javaで書く事になるが、用はJavaで実行すりゃいいのでいくらでも工夫がきく。また、そこはプロジェクトに合わせた形でちょこちょこいじれる方が便利。S2コンテナを積極的に使う気がなく、Guice好きの自分に取っては非常にありがたい。DIなんてDIの必要があるとこ(すげ替えが必要なトコ)だけ適用すりゃいい事であって、DIの必要無いとこはnewしようがどーしようがいいんですよ的な割り切り(インターフェース指向であれば特に問題は考えられない)もあれば、Guiceでもそんなに大量に書く事もなく相当バランスが良い仕組みとなるはず。逆にS2でやっていた仕組みをゴッソリGuiceとして持ってきたいとかはたぶん無いだろうし、そういう人はS2で使うんだと思うし。
EclipseとMavenProject
WTPを使っている時は mvn eclipse:clean eclipse:eclipse をした方が安全だそうだ。でも、それならそれで pomにそう仕掛けてしまえばいいような…?
Eclipse Pluginの話としてm2eclipeの紹介があったが、Q4Eの紹介が無かったのがちょっと意外。WTPではうまく動作しないとかそういぅ事なのかなー?
気になった
プロジェクトごとに工夫してAbstractHogeなクラス作ったりしますよねーとかそんな時に出てきたソース。 AbstractResult を返すメソッド内で、リクエストの種類を判断して「return new Json(Map);」とか書いてあったのが気になった。簡単に AMF で返したりできるんだろうか?

Mavenの話が少なかったのが残念だったけど、Cubby2.0について話を聞けて良かった。Mavenの話として、testフェーズではテストしにくいモジュールについて、integeration-testフェーズのカバレッジはどーしてますか?という質問をしたかったが時間がなかった。

あと、ひとつ気分の悪い出来事があった。次のセッションがひがさんのセッションという部屋だったからかもしれんけど、スピーカの話が終わっても居ないのにどんどん人が入ってきていた。失礼にも程があるやろ。この件に心当たりがある、頭がおかしい連中は反省しろ!スタッフが止めていなかったとかもあるのかもしれんが、そんなん関係なく、社会人としておかしぃやろ。これは何事?と思って唖然とした。

テスト駆動開発のこころ (TDD はじめの一歩)

三本柱
バージョン管理、testing、自動化(CI的な)、が3本柱との事。自分的にはiTSも柱の一つなんだけど、「ひとつ欠けたら確実に倒れる」という意味では確かに3本の方が説明しやすい。うまい表現だと思った。
TDDとは
品質を保証するもではなく、品質を向上するものという説明は、どこか権威あるページに書いてあった方が色んな人が助かりそうな気がしたw
TDDのこころ
ほとんど全てが自分でも理解できていて嬉しかった。がしかし!自分はひとつ重大に違反している点があった。「ひとつずつ、少しずつ」について間違った手法をとっていた事がある。仕様がある程度固まっている時点で、最初に一気にテストケースを用意させて、一気に失敗させ、それをひとつずつグリーンにしていく、という手法をとった事がある。作業者が国外だった時に「進捗を確認しやすくするため」にそうした。テストレポートがそのままバーンダウンとして使えて便利だった訳だ。だが、間違いだったワケ。
自分でもそれは間違いだとわかる。自分でやる時はひとつずつやるもんね、その方がもうひとつの「すばやくまわす」も同時に実現できるから。速いテンポでリズム良く気持ちよくやるには、ひとつずつの方が良い事はわかっている。和田さんのこの話を聞かなければ、次に国外で作業してもらうようなタイミングがあった時に、意識せず同じ間違いを起こしただろうなと思う。
テストコードでテストできないものもある
ある。そこは人間が行えば良い、そしてそこに価値がある。人間がそこに集中できるようにするためにも自動でできる範囲は極力自動化しておくんだ、との事。わかりやすく、他の人の説得にも使いやすい話。

45分で分かるBuri/escafeFlow入門(脱デスマの足がかり)

ここはあんまり理解が進まなかった。説明の例だけでは「何を解決するのか?」があんまり理解できなかった。ワークフローエンジンは魅力的だけど、例の話だけだと「デシジョンテーブルだけを切り出せば自動テストがめちゃくちゃ簡単だよ?」とか、そっち方向に頭がいってしまって><
もっとワークフロー寄りの話だった方が良かったのかもしれない。

あと意外だったのは「プレゼンテーションの層はあんまり苦労していない」というような話が前置きにあった。自分はこっちの方が苦労している。顧客が最も目にし、触る部分だから要求が激しいんじゃないかと思うんだけども。むしろ、後ろ側の方が簡単にロジックを書く事ができるし何よりテストがむちゃくちゃ簡単なはずだけどな、とか。

差のつく勉強法200 - 35歳定年説を乗り越えるために何をすればいいか

自分はまだまだきしださんが感じた「飽きてきた」には届きそうにない。だけど「自分が使っている道具くらいはちゃんと理解した上で、基礎に戻る」というのは、価値を上げるためには重要だと感じた。

誰か、きしださんの手書き文字をフォントにしませんかね。後、きしださんの声紋からボーカロイドを作りませんかね。めちゃくちゃ和みそうな気がする。

ライトニングトークス

斜め上行くリッチクライアントの考え方(仮)

前から自分の理想として考えている、「非Webな専用クライアントからタスクの状態を社内Twitter的などこかにPostし、TimeTrackもできるしタスク管理もできるし、コミュニケーションもできるし後からナレッジベースにもなる」という仕組みを実現するのにかなり近いツール。専用ツールにしては規模がでかすぎるとは思うけど(事務とか総務の人とかには意味がわからず使えないんじゃないかな)、かなりのポテンシャルを秘めたツールだと思う。もっと知って欲しい(もっと宣伝してほしい)。

ソースコードリーディングのすすめ

例とした実際のソースが普通におもしろかった。でもモデレータの方も最後に補足していた通り、スピーカのようなイケメンが話したところで説得力がないのだ。

下っ端からのOSS採用工作について

前回の定時退社の人。今回も似た立場からのトークだった。経験談による話にしか聞こえなかったが、違うという事だ。

S2Config

時間が余って、NetBeansのアピール。これはhappy_ryoの計算通りなんだろう、うまい事やるなぁ!で、本題のS2Configだけど、紹介があった機能ならmavenのprofile機能を活用すべき。mavenでできる事をS2Configのような別の依存を増やして解決してしまう人が増えないようして欲しいと思う。mavenでできない、こういう事をやるモンですよ!という説明が欲しかったなぁ。

エクセルを使ってポン! - escafeRule -

S2Ebiというツールの紹介だったけど、確かにエクセルをそのまま入力に使えるプロダクトって破壊力がデカイと思う。もっともっとこういう視点でエクセルを利用してもいいな、という感想を受けた。

SDLoaderの片山さん

おもしろすぎ、話がうますぎ。でも、あんまり用途を思いつかない自分の想像力の薄さにガッカリ。

Outputz で自分管理

自分の行動(実績)を記録する、という意味でTimeTrackingとかと同じ系統のライフハック。良いハックだと思う…けど、仕事では使えない環境も多くて、結局そこだけ記録できないと中々腰を上げられないんだよな…orz。TimeTrackは最悪手動でもできるから、後からバッチでデジタルに登録すればそれでいいんだけどね。

オープンソース書籍への取り組み・展望

普段のつきあいでは滅多に聞けない貴重なお話が聞けた。出版業界の不況は知っているけど、そんな中IT系OSS系はそーいう事になっているのかぁー、と素直に感心した次第です。

スピーカの方々、良いお話を提供していただき本当にありがとうございました。また、スタッフの方も本当にご苦労様でした、有意義な時間を過ごす事ができました!

Wicket本が届いた!

一冊はAmazonで予約注文していたもの。ビニ本の方はレビューに参加した事によって秀和システム様よりいただいたもの。

2009年3月12日木曜日

3/14(土)はSeasar Conference 2009 White

Seasar Conference 2009 White - 3/14(SAT), Tokyo

今回は「あれもこれも見たいのに同じ時間に…体が足りない!」というほどのカンジではない…かな?自分が注目してるのはうまいこと分散されていてラッキーだ。

  • 13:00-13:45 S307 CubbyとMavenを使った開発のまとめスレ
  • 13:00-13:45 S306 Wicketとシステム開発の現場
  • 14:00-14:45 S305 テスト駆動開発のこころ (TDD はじめの一歩)
  • 15:00-15:45 S405 45分で分かるBuri/escafeFlow入門(脱デスマの足がかり)
  • 15:00-15:45 S406 T2でつなごう! -つなぐつながるWebフレームワーク「T2」の紹介
  • 16:00-16:45 S307 差のつく勉強法200 - 35歳定年説を乗り越えるために何をすればいいか
  • 17:00-17:45 S305 ライトニングトークス

…って、13時台と15時台は迷うな…。Cubbyはまだ話を聞いた事はないし、13時台はCubbyかな?T2は前回話を聞いたし、今回も初心者向けなのであれば、15時台はきしださんだな…。

2009年3月11日水曜日

2009年3月5日木曜日

書評:SUBJECT TO CHANGE

ユーザエクスペリエンスの重要さについて書かれた書籍。ユーザエクスペリエンスという単語は昔からあったけど、昨年から急に使われる頻度が上がった気がする。そんなこんなでこの手の話題について結構気にしていたトコにどこかでこの本の紹介を見かけて、嫁さんに「買ってみたら?(俺も読むし)」と勧めてみたところ嫁さんの会社の方が貸し出してくださる事に。で、便乗して俺も読ませていただいた。貸し出してくださった方、ありがとうございました!

この本の特徴として、「具体例が非常にわかりやすい」という点が良かった。おかげで「この章では何を言いたいのか」がわかりやすい事が多い。全体的に、著者の主張については特に新しいものは無いと思うが、どれもこれも具体例が適切なおかげで読んだ端から「Aha!」となるw ちょっと経ってから、いやいや今までもずっと聞いてきた事やん、となる。
全体的な感想としては、読み物として楽しんで読むかんじの本、というカンジ。読み物としては十分おもしろかったです。後、この本はAdaptive Pathという会社のメンバが書いている本なのだが、Adaptive Pathの共同創設者のJeffrey VeenはStartup2Startupという、スタートアップのコミュニティを育てるための活動を継続しているらしい…という記事をTechcrunchで昨日偶然見かけた

余談になるけど、この本を読み始めてすぐに思い出したのが、37signalsの「より少ないシンプルな機能で競争する」。また、こういった本を読む人はEric Sinkの「Eric Sink on the Business of Software 革新的ソフトウェア企業の作り方」もあわせて読むのが良いかもしれない。

最近「へぇ!」となった体験を一つ。ホームセンターへガスコンロのカバーを買いにいった時の事。便利に使えるお気に入りのタイプを求めていたんだけど、いざ店頭で発見してみると微妙なサイズの違いで同じ種類のモノがいくつかあった。で、どれだかワカラン、となったワケです。その時、嫁さんは「ウチはコレだと思う」とひとつ選択した。理由は、サイズとか関係なく「猫のアイコンがついている」という事。サイズごとに包装に違う種類の「アイコン」がついていて、それがまた「猫」とか「車」とか全然違う種類のアイコンになってた。猫と犬とかの差よりもまたわかりやすいし、ガスコンロや料理とかと全然関係ないアイコンってのが覚えやすく迷いにくい。消費者が迷うだろうと考えての事なんだろなー、と感心しましたとさ。

2009年3月4日水曜日

2009年3月3日火曜日

書評:アジャイルな見積りと計画づくり

めっちゃ時間がかかったけど、やっと読み終わった。

まず率直な感想を書くと「後半部分は読む内容が少なかったかな?」と感じた。非常に良い本である事は間違いないけど、過去に読んだ本との重複がかなり多かったと感じた。これは個人の履歴との兼ね合いだから内容の出来具合とは何の関係もないけれど。まぁ、この本に一番期待していた「見積もり(前半部分)」はこの本でしかえられない貴重な知識だったワケで、結局は大満足してますけどねw

こんなデカイ本だと時間がかかりすぎるよ!さくっと読めるヤツがいいよ!って人は「第2部:規模を見積もる」だけを読んでみるといいかも。そこを読んだらたぶんその次も読む事になると思うけどw、自分はこの章が一番ためになった。

それ以外では、ちょっと範囲が狭いけど「第4部:スケジュールを立てる/第17章:不確実性に備えるバッファの計画」もためになった。バッファなんて誰だってやるでしょう、とかじゃなくて「説得力のあるバッファ」だと感じた。エンドユーザにも全てさらす事ができるような透明度の高いプロジェクトを理想にしている自分に取っては、気まずくて言いにくい話になりそうな話を、力強く説明できるのは助かる。本からの受け売りでも、ないよりは良い。

ピンポイントで「へぇ!」となったのは「リリースバーンダウン棒グラフ」。これは良いメソッド。こんなの思いつかんかった。作業範囲に何かが追加されてきた時、バーンダウンは「自分が後戻りした」ようなカンジがするし、バーンアップは「ゴールが遠のいた」カンジを受けるし。自分だけかもしれないけど、そんなイメージをもってしまってあまり気分がよろしくないw でも、バーンダウン棒グラフはイイ!

過去に読んだ云々と重複してるなーと感じたのは以下の4冊。どれも良い本で、今回読んだ本もまた良い本だけど、後半部分が以下の4冊とびっくりするくらい内容が重なってると思うw

とりあえずポチっちゃぇばいいと思いますよ!

そうそう、過去に読んだ本と内容がかぶってしまって…といぅ意味で最近迷っているのが「Release It! 本番用ソフトウェア製品の設計とデプロイのために」。フェーズ的にはShipIt!的な気がするし、どぅなんだろぅと迷っているw

2009年3月2日月曜日

EclipseでIndex out of bounds

最近Eclipseがしょっちゅう図のような状態になる。

一度これが出たら、再起動するまではしょっちゅうこれが出てかなりストレスフル。ピンポイントで原因が分かるとか、こういった操作を一度行うとこのじょうたいになりやすい、みたいな傾向をご存知の方はおられませんか?おられたら何か情報を下さい><

追記

たぶんコレっぽい。

!ENTRY org.eclipse.ui 4 0 2009-03-02 23:31:30.356 !MESSAGE Unhandled event loop exception !STACK 0 java.lang.IllegalArgumentException: Index out of bounds at org.eclipse.swt.SWT.error(SWT.java:3761) at org.eclipse.swt.SWT.error(SWT.java:3695) at org.eclipse.swt.SWT.error(SWT.java:3666) at org.eclipse.swt.graphics.TextLayout.getStyle(TextLayout.java:1609) at org.eclipse.swt.custom.StyledTextRenderer.getTextLayout(StyledTextRenderer.java:864) at org.eclipse.swt.custom.StyledTextRenderer.getTextLayout(StyledTextRenderer.java:656) at org.eclipse.swt.custom.StyledTextRenderer.drawLine(StyledTextRenderer.java:354) at org.eclipse.swt.custom.StyledText.handlePaint(StyledText.java:5310) at org.eclipse.swt.custom.StyledText$7.handleEvent(StyledText.java:4878) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1561) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1585) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1570) at org.eclipse.swt.widgets.Control.drawWidget(Control.java:850) at org.eclipse.swt.widgets.Canvas.drawWidget(Canvas.java:114) at org.eclipse.swt.widgets.Widget.kEventControlDraw(Widget.java:1069) at org.eclipse.swt.widgets.Canvas.kEventControlDraw(Canvas.java:191) at org.eclipse.swt.widgets.Widget.controlProc(Widget.java:370) at org.eclipse.swt.widgets.Display.controlProc(Display.java:862) at org.eclipse.swt.internal.carbon.OS.StillDown(Native Method) at org.eclipse.swt.widgets.Display.runEnterExit(Display.java:3444) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3067) at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2382) at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2346) at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2198) at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:493) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:288) at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:488) at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:113) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:193) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:386) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:549) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:504) at org.eclipse.equinox.launcher.Main.run(Main.java:1236)