Hatena::ブログ(Diary)

public static void main

誰かが困って検索したときに助けになる話題を書いていければと思っています。

2009-05-17

[][]集合知イン・アクション

本書は2008年10月に発売された「Collective Intelligence in Action」の邦訳されたものです。

集合知とはどういうものなのかから始まり、Javaを用いて実際に集合知を扱うアプリケーションの作り方まで広い内容が書いてあります。

データマイニングのような話題ばかりではなく、既存のブログ検索から情報を取得してきたり、検索の仕組みの作り方やタグクラウドの実現方法、クローリングについてなど集合知の収集方法についても言及がなされています。


集合知プログラミングとの違い

集合知を扱った本としては「集合知プログラミング」が有名だと思います。

集合知プログラミングは各手法について解説と実際にコーディングを行うことでその動きを知ることで理解を進めていくという形になっていました。

集合知イン・アクションは、実際に使うことを意識してスキーマやクラスの設計から考えている点と、簡単な解説はありますが自分でアルゴリズムを実装しているところもありますがどちらかといえばLuceneやWekaのようなライブラリを用いることが多い点が大きな違いではないかと思いました。また、全般的に検索に関する話が多かったというのも違いといえます。

PythonとJavaという言語の違いもあるのかもしれませんが、集合知プログラミングのほうはPythonを知らなくても結構読めたのですが、こちらはJavaを知らないとソースコード部分に関しては厳しいかもしれません。


LuceneやWekaなどの使い方を知る本として

Javaの全文検索エンジンであるLuceneやデータマイニングツールであるWekaやJDM(Java Data Mining)APIといった、名前は聞いたことがあるけど日本語の情報がなかなかないJavaのライブラリなどのコードが載っているので、これらを使ってみようと思っている人にとって参考になるかもしれません。


日本語の扱いについて

本文では元が英語で書かれていたため日本語で発生するような問題については言及されていないのですが、付録として形態素解析はてなを使った日本語対応のコードも載っています。


個人的に興味深かった点

タグづけのアーキテクチャ

3.4で触れられているのですが、タグ付けのアーキテクチャとして3つ紹介されています。

最近のWebアプリケーションだとタグはよく実装される機能の1つだと思いますが、パフォーマンスやスケーラビリティを意識するとどのように実装するのがいいのか少し悩むところでもありますので、ここで触れられているスキーマ設計を参考にしてみるのもいいのではないでしょうか。

クローリング

インテリジェントなクローラについて6章に載っています。

クローラを作るときに意識しておくことや拡張する上で考えるべきことを決定するのヒントになるのではないかと思いました。


全体的な感想

500ページ近くある非常に厚い本ですので、全部読むというよりは自分の興味のあるところだけを拾い読みする形で読んでいます。

スケーラビリティについて言及してあったりちょっとしたテクニックが載っていたりと、あまり興味がない部分でも個々の詳細を見ていると参考になるところが見つかります。

Javaをやっていない人だとコード部分を読むのはきついと思いますが、アーキテクチャの話などは参考になるのではないかと思いました。

2009-02-28

Maven2のロゴ

[][]Eclipse 3.4.2とm2eclipseでMavenを使ったJavaのライブラリ管理

先日、後輩向けにJavaの事始からWicketのあたりまでざっと話をしたのですが、その中で触れたm2eclipseのインストールと使い方についてまとめておきます。

今回の記事ではライブラリ管理についてのみ言及しています。

Eclipseのバージョンは3.4.2でWTPが最初から入っている「Eclipse IDE for Java EE Developers」を使っていますが、3.4.x系なら同じようにできると思います。Pleiadesを使って日本語化していますので、デフォルトの英語のままの方は適当に読み替えてください。

全体的にWebからダウンロードする作業が多いので結構時間がかかりますが、2回目以降はもっと早くなります。

まだ使い始めたばかりの拙い知識で書いているので、間違いやもっとよい方法がある場合はぜひぜひご指摘ください。

1. Mavenとは

MavenとはApache Software Foundationで開発されているJavaのソフトウェアプロジェクト管理ツールです。

Maven は Project Object Model (POM) という考え方に基づき、プロジェクトのビルド、テスト、ドキュメンテーション、成果物の配備など、プロジェクトのライフサイクル全体を管理します。プロジェクトのビルドツールである Ant とは異なり、Maven はプロジェクト管理ツールとして、プロジェクトに関する色々な情報を POM に集約し、POM の情報に基づきプロジェクト全体を管理します。

1. Maven とは | TECHSCORE(テックスコア)

最近のJavaの開発ではデファクトスタンダードになりつつあるようです。

私自身Mavenを使い始めたのは結構最近です。というのも、EclipseやNetBeansのようなIDEを使っているとビルドやテストやパッケージ化などもサポートしてくれるためあまりMavenのよさがわからなかったことやpom.xmlを書くのが面倒くさかったりしたからです。しかし、ライブラリ管理やIDEを起動しなくてもビルドやテストを行うことができるなど多くのメリットがあることが実際に使ってみるとわかると思います。

ちなみにm2eclipseのデフォルトのローカルレポジトリは「C:\Documents and Settings\ユーザ名\.m2」になります。



2. m2eclipseのインストール

1. Eclipseを起動して、「ヘルプ」>「ソフトウェア更新」を選ぶ

2. 「使用可能なソフトウェア」タブを開く

3. 「サイトの追加」ボタンを押して、「http://m2eclipse.sonatype.org/update」を入力してOKを押す

4. 下記のようにインストールするものにチェックを入れた後に、「インストール」ボタンを押す

f:id:Kishi:20090228154917j:image

5. 後はウィザードに従って進めていくとインストール開始

6. インストール終了すると再起動を求めるダイアログが出てくるので、「はい」を選んで再起動する

これでm2eclipseのインストール作業は終了です。

再起動をすると以下の図のようにインデックスの更新が行われますが、ダウンロードを伴うので少し時間がかかります。インデックス更新の途中で中止したりして失敗するとこれから紹介するm2eclipseの機能が一部うまく動かないことがありますが、その場合はEclipseを再起動してインデックスの更新を再度行えばうまくいくかもしれません。

f:id:Kishi:20090228160252j:image


Mavenコンソールが表示されない場合、コンソールの右上の「コンソールを開く」を押して「Maven Console」を選択してください。

以下のような警告が出た場合、

f:id:Kishi:20090228161341j:image

eclipse.iniの一行目に

-vm
C:\Program Files\Java\jdk1.6.0_11\bin\javaw.exe

を追加してください。JVMの位置は自分の環境に合わせて変更してください。今回の紹介する内容ではこの作業は行わなくてもよいです。


ちなみにEclipseを起動するたびにインデックスの更新が行われます。初回よりも速くなりますが、インデックスの更新が行われるのがわずらわしい人は以下のように設定すると起動時に更新が行われなくなります。

1. 「ウィンドウ」>「設定」を選ぶ

2. 「Maven」を選択して、「始動時にレポジトリー・インデックス更新をダウンロード」のチェックを外して「OK」ボタンを押す

手動で更新を行う場合は、「設定」の「Maven」>「インストール」を開いて「ローカル・レポジトリー索引再作成」ボタンを押してください。



3. Mavenプロジェクトを作成

「ファイル」>「その他」を選択して、以下のように「Maven Project」のウィザードを開始してください。

f:id:Kishi:20090228163107j:image

今回はアーキタイプを使わずにプロジェクトを作成するので、一枚目のウィザードで「シンプルなプロジェクトの作成」にチェックを入れてください。

次のウィザードの必須部分である「グループ Id」に「test」、「アーティファクト Id」に「first-maven」と入力して「完了」ボタンを押すとプロジェクトが作成されます。

グループ Id(groupId)はプロジェクトを一意に識別する名前で、プロジェクトのルートパッケージ名を指定するのが一般的です。

アーティファクト Id(artifactId)はプロジェクトの成果物の名前です。JARやWARにつける名前を指定してください。

作られたフォルダ構成がMavenプロジェクトの一般的なフォルダ構成です。別のフォルダ構成でもMavenを使うことができるようですが、特別な理由がない限りはこの構成に従ったほうがよいです。

first-maven
├  pom.xml
├  target
└─src
    ├─main
    │  ├─java
    │  └─resource
    └─test
        ├─java
        └─resource
名前役割
pom.xmlプロジェクトの情報を持つファイル
target成果物を置くフォルダ
src/main/javaJavaのソースコード
src/main/testJavaのテストコード

特に重要なのはpom.xmlで、テキストエディタで開いてみると以下のような情報が現在書いてあります。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>test</groupId>
  <artifactId>first-maven</artifactId>
  <version>0.0.1-SNAPSHOT</version>
</project>

ここにプロジェクトの依存ライブラリやビルドの情報などを追記していくのがMavenプロジェクトの特徴です。



4. ライブラリの追加と削除

m2eclipseを使うとセントラルレポジトリに登録されているライブラリを簡単に追加することができます。

今回はCommons Langを追加してみます。

以下の図のようにプロジェクトの上で右クリックをして「Maven」>「依存関係の追加」を選択してください。

f:id:Kishi:20090228170028j:image

ダイアログの入力フォームに「commons-lang」と入力すると、インデックスの作成がうまくいっていれば、インクリメンタルにセントラルレポジトリに追加されているライブラリを検索できます。

ライブラリはデフォルトではもっとも最新のバージョンのものが選択されていますが、Commons Langは変わった名前のバージョンのものがひとつあるのでツリーを開いて以下のように2.4を選択してOKを押して下さい。

f:id:Kishi:20090228170628j:image

OKを押すとライブラリと依存ライブラリのダウンロードを開始します。ローカル・レポジトリーにすでにある場合は高速にライブラリの追加を行うことができます。

pom.xmlを開くと以下のようにdependencies要素が追加されていることがわかります。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>test</groupId>
  <artifactId>first-maven</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
  	<dependency>
  		<groupId>commons-lang</groupId>
  		<artifactId>commons-lang</artifactId>
  		<version>2.4</version>
  	</dependency>
  </dependencies>
</project>

Mavenではこのようにdependencies要素の中にdependency要素を追加していくことで依存ライブラリの管理を行います。

今回はフォームから検索して追加しましたが、pom.xmlに手動でdependency要素を追加しても依存ライブラリが自動的に追加されます。

依存ライブラリを削除する場合はpom.xmlをテキストエディタで開いてそのdependency要素の部分を消して保存するとOKです。

実際に作業をしてもらうとわかると思うのですが、これだけ簡単にライブラリの管理ができるのは画期的です。PerlCPANなどとは異なり、新しいライブラリを追加してもその影響範囲はプロジェクトに限定されるのもいいところだと思います。



5. アーキタイプでWicketの開発を始める

アーキタイプ(archetype)とは原型という意味で、Mavenではこれを使うことでフレームワークなどを利用したアプリケーションを作る際の最低限の構成を持ったプロジェクトを作成でき、開発の開始の時間的なコストを大幅に削減することができます。

「ファイル」>「新規」で「Maven Project」を選択してください。

「ファイル」>「その他」を選択して、以下のように「Maven Project」のウィザードを開始してください。

今回は一枚目のウィザードの「シンプルなプロジェクトの作成」にチェックを入れないでください

二枚目のウィザードで「カタログ」に「Nexus Indexer」を選択してフィルターに「wicket」と入力すると1つのアーキタイプに絞り込まれると思います。

f:id:Kishi:20090228174928j:image

「Show the last version of Archetype only」のチェックを外すと最新のライブラリのバージョン以外のアーキタイプを選択することができます。今回はバージョン1.3.5をのアーキタイプを選択して「次へ」を押してください。

f:id:Kishi:20090228175210j:image

最後のウィザードは「グループ Id」には「test.wicket」、「アーティファクト Id」には「first-wicket」、「パッケージ」には「test.wicket」を入力して「完了」ボタンを押してください。

これでWicketの最小限の設定とライブラリを持つプロジェクトが作成されました。

Javaコンパイラのバージョンが1.4になっている場合があるので、そのときはプロジェクトの上で右クリックして「プロパティ」を選択して、「Javaコンパイラー」のコンパイラ準拠レベルを変更してください。

m2eclipseでアーキタイプを使うことのデメリット

今回のwicket-quick-startの場合だとプロジェクト・ファセットの動的Webプロジェクトのバージョンが2.4で作られてしまいます。

Tomcatだと6以降のバージョンでないとこれに対応していないため、デプロイを行うことができません。開発環境によってはこの設定だと困るという人もいると思いますが、後から変更することもできないようです。コメントにて変更方法のご指摘がありました。


6. jettyをサーバとして起動

先ほど作成したwicket-quick-startのアーキタイプを利用したプロジェクトは動的ウェブプロジェクトとして作られているので、WTPで扱うことができます。Tomcatなどのサーバにプロジェクトを追加することができますが、Mavenでは自分でインストールする必要なしにJettyプラグインを用いることでサーバを利用することができますので、今回はこれを利用してみます。

メニューの「実行」>「実行の構成」を選択します。

左側の一覧の中から「Maven Build」の上でダブルクリックを押すと新規構成を追加することができます。

f:id:Kishi:20090228180728j:image

「名前」を「Jettyで実行」に変更してください。

次に「基底ディレクトリ」を、「ワークスペースの参照」で先ほどの「first-wicket」プロジェクトを選択してください。

「ゴール」を、「選択」を押して上部のフォームに「jetty」と入力してフィルタを実行してから「jetty - org.morbay.jetty:maven-jetty-plugin」の「run」を選択してください。

f:id:Kishi:20090228181158j:image

「実行」ボタンを押すと必要なプラグインのダウンロードが開始します。

ダウンロードが終了してJettyサーバが起動したら、ブラウザからhttp://localhost:8080/first-wicket/ にアクセスすると以下のようなWicketで生成されたページを見ることができます。

f:id:Kishi:20090228181726j:image



7. 結びに

今回はライブラリ管理についてしか触れていませんが、この点だけでもMavenを導入するメリットが十分あることがわかっていただけたのではないかと思いますのでぜひMavenを試してみてください。

ちなみにMaven2を扱った日本語の本では、2年前なので若干内容が古いかもしれませんが以下の本が入門書としてよいと思います。

Apache Maven 2.0入門 Java・オープンソース・ビルドツール
野瀬 直樹 横田 健彦
技術評論社
売り上げランキング: 48734



おまけ:セントラルレポジトリにないライブラリを追加する方法

ActiveObjectsの場合

ActiveObjectsはdev.java.netで公開されていますが、ここの場合ですとMavenの公開方式にしたがっているレポジトリのため以下のようにrepositories要素を追加することですることでライブラリを追加することができます。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>test</groupId>
  <artifactId>first-maven</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <repositories>
      <repository>
        <id>maven2-repository.dev.java.net</id>
        <name>Java.net Repository for Maven</name>
        <url>http://download.java.net/maven/2/</url>
        <layout>default</layout>
      </repository>
  </repositories>
  <dependencies>
    <dependency>
      <groupId>net.java.dev.activeobjects</groupId>
      <artifactId>activeobjects</artifactId>
	  <version>0.8.2</version>
    </dependency>
  </dependencies>
</project>


Butterfly Persistenceの場合

Butterfly PersistenceはMaven形式のレポジトリを提供していません。こういうライブラリをMavenで扱う場合、ローカルレポジトリに手動でライブラリを追加することで対処します。

Mavenをインストールした状態で、Betterfly PersitenceのJARをダウンロードしてからコマンドプロンプトで以下のコマンドを実行してください。

mvn install:install-file -Dfile="C:/java/lib/jenkov-butterfly-persistence-5.0.0.jar(JARのパス)" -DgroupId=com.jenkov.butterfly -DartifactId=butterfly-persistence -Dversion=5.0.0 -Dpackaging=jar

ローカルレポジトリに登録した後は以下のようなdepencency要素をpom.xmlに追加すると依存ライブラリを追加できるようになります。

<dependency>
  <groupId>com.jenkov.butterfly</groupId>
  <artifactId>butterfly-persistence</artifactId>
  <version>5.0.0</version>
</dependency>

2008-12-12

[]「薄い」JavaのO/Rマッパーの紹介 - DbUtils、Persist、Butterfly Persistence

HibernateActiveObjectsS2DaoApache CayenneiBATISなどORMフレームワークが群雄割拠状態なJavaですが、使い方を勉強したり設定ファイル書いたりするのが少し面倒かなと思っている人がいるかもしれません。

特にちょっとしたアプリケーションを作るならば、素のJDBCを使うのは嫌だけど、それに近い形で使えるORマッパーが欲しいと思うことがたびたびありました。

ということで以下の条件でJDBCを薄くラッピングしているJavaのライブラリを探して発見したものを紹介します。

  • レコードをオブジェクトに自動的にマッピングしてくれる
  • できるだけSQLを書く量を減らすことができる
  • いざとなったら生SQLを書くことができる
  • 導入が簡単である
  • 依存ライブラリが少ない

以下に挿入、検索、更新、削除を実行するコードを書いています。

今回はDBがMySQLだったので、MySQL Connector/J 5.1を使っています。

http://dev.mysql.com/downloads/connector/j/5.1.html

今回使用するUserクラスとuserテーブルの定義は一番最後に書いてあります。

DbUtils

http://commons.apache.org/dbutils/

DbUtilsはApache Commonsプロジェクトの一つです。厳密に言うとDbUtilsはO/Rマッパーではない(と公式サイトで書いている)のですが、今回の要望に近いものなので取り上げました。

Connection、Statement、ResultSetを隠蔽してくれて、検索した結果をオブジェクトにマッピングしてくれます。

33KB程度のファイルサイズで、非常に軽いライブラリです。

import java.sql.Connection;
import java.sql.DriverManager;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;


public class DbUtilsTest {

	public static void main(String[] args) throws Exception {
		Class.forName("org.gjt.mm.mysql.Driver");
		String url = "jdbc:mysql:///test?useUnicode=true&characterEncoding=UTF-8";
		Connection con = DriverManager.getConnection(url, "名前", "パスワード");

		User user = new User();
		user.setName("Kishi");
		QueryRunner qr = new QueryRunner();
		//挿入
		qr.update(con, "INSERT INTO user(name) VALUES(?)", user.getName());
		//検索
		ResultSetHandler h = new BeanListHandler(User.class);
		List<User> users = (List)qr.query(con, "SELECT * FROM user WHERE id=?", 1, h); 
		for(User u : users)
			System.out.println(u.getId() + ":" + u.getName());
		user = users.get(0);
		//更新
		qr.update(con, "UPDATE user SET name = ? WHERE id = ?", 
				new String[]{"Shiki", Integer.toString(user.getId())});
		//削除
		qr.update(con, "DELETE FROM user WHERE id = ?", user.getId());
		con.close();
	}
}

QueryRunnerのコンストラクタにDataSourceを渡すこともできます。

Handlerを切り替えることで、返ってくる値をMapやBean単体に変更することができます。

JDBCに比べると大分マシになりましたが、更新系の処理が少し面倒です。


参考


Persist

http://code.google.com/p/persist/

Mr.Persisterというライブラリの情報を検索しているときに、「Not found: /20081026.html」のコメントでmesoさんに紹介されているのを発見して知りました。

非常にシンプルなAPIなので、クイックスタートを見ればすぐに使い方がわかると思います。

何気にDbUtilsよりもファイルサイズが小さいですので、ソースコードに目を通すのが簡単です。

アノテーションやジェネリクスを使っているのでJava5以降でしか使えません。

import java.sql.Connection;
import java.sql.DriverManager;
import java.util.List;

import net.sf.persist.Persist;

public class PersistTest {
	public static void main(String[] args) throws Exception {
		Class.forName("org.gjt.mm.mysql.Driver");
		String url = "jdbc:mysql:///test?useUnicode=true&characterEncoding=UTF-8";
		Connection con = DriverManager.getConnection(url, "名前", "パスワード");

		User user = new User();
		user.setName("Kishi");
		
		Persist persist = new Persist(con);
		//挿入
		persist.insert(user);
		//検索
		List<User> users = persist.readList(User.class,
				"select * from users where id= ? ",
				1);
		for(User u : users)
			System.out.println(u.getId() + ":" + u.getName());
		user = users.get(0);
		//更新
		user.setName("Shiki");
		persist.update(user);
		//削除
		persist.delete(user);

		con.close();
	}
}

更新系でテーブル名をしていませんが、Userクラスの場合だと、userあるいはusersテーブルを自動的に推測してくれます。@Tableアノテーションで直接指定することもできます。

依存ライブラリはないのですが、Log4Jを入れるとデバッグ情報を表示させることができます。

ジェネリクスをうまく使っているので戻り値をキャストする必要がないところや簡単な更新系ならばSQLを書く必要がないのがよいです。

APIもいけてるので、今回取り上げたものでDB簡単なプログラムを作るのであれば個人的にはおすすめです。


Butterfly Persistence

http://butterfly.jenkov.com/persistence/index.html

Butterfly Persistenceは先ほど名前が挙がったMr.Persisterの後継です。

上記二つよりも扱う範囲が非常に広く、コネクションプーリングやトランザクションを扱うこともできるようです。

import java.sql.Connection;
import java.sql.DriverManager;
import java.util.List;

import com.jenkov.db.PersistenceManager;
import com.jenkov.db.itf.IDaos;


public class BetterflyPersitence {
	
	public static void main(String[] args) throws Exception{
		Class.forName("org.gjt.mm.mysql.Driver");
		String url = "jdbc:mysql:///test?useUnicode=true&characterEncoding=UTF-8";
		Connection con = DriverManager.getConnection(url, "名前", "パスワード");

		User user = new User();
		user.setName("Kishi");PersistenceManager manager = new PersistenceManager();
		
		IDaos daos = manager.createDaos(con);
		//挿入
		daos.getObjectDao().insert(user);
		//検索
		List<User> users = daos.getObjectDao().readList(User.class, "select * from user where id = ?", 1);
		for(User u : users)
			System.out.println(u.getId() + ":" + u.getName());
		user = users.get(0);
		//更新
		daos.getObjectDao().update(user);
		//削除
		daos.getObjectDao().delete(user);

	}
}

IDaosから取得するDaoの種類によってMapにマッピングすることもできます。

Persistと同じくテーブル名を推測してくれます。

Webアプリケーションなどを作るのであれば、今回紹介したライブラリの中だとこれを使うのがベターだと思います。

日本語の情報が増えてくるともっと利用が増えそうです。


終わりに

どのライブラリも柔軟性が高く学習・導入コストもそんなにかからないので時間があったら是非試してみてください。



おまけ:Userクラスとテーブルの定義

public class User {
	private static final long serialVersionUID = 1L;
	private int id;
	private String name;

	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}
CREATE TABLE `user` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) default NULL,
  PRIMARY KEY  (`id`)
)

2008-11-25

[]グラフを扱うJavaライブラリ「Jung」の紹介 - Twitterのグラフ構造を視覚化

java-ja 第12回のLTで話そうと思ったのですが、出番がなかったので資料をブログで公開しておきます。

Jungは研究などでグラフ構造が出たときに、理解しやすくするために可視化するのに使っています。他にもいくつかグラフを扱うライブラリは存在していますが、日本語の資料があったのと拡張可能なことが多かったのでJungを結果的に使うようになりました。

以下はそのJungについての簡単な解説です。

Jungとは

Jungの正式名称はJava Universal Network/Graph Frameworkで、ネットワーク(グラフ) 構造の分析や視覚化を行うためのJavaのOSSライブラリです。グラフ理論、データマイニング、ソーシャルネットワーク分析のアルゴリズムを数多く実装しています。

安定バージョンは1.7.6で最新は2.0betaで、BSDライセンスで使用できます。

http://jung.sourceforge.net/


グラフって何?

ここでいうグラフは棒グラフや折れ線グラフではありません。

数学の一分野のグラフ理論におけるグラフは点(ノード)と辺(エッジ)の集合で構成され、現実のある要素の関係性を点と辺に抽象化してその性質の分析をするのに使います。

データ構造・アルゴリズムなどに広く応用されています。

有名な例:

  • 巡回セールスマン問題
  • 4色定理

グラフの例

f:id:Kishi:20081125190705j:imagef:id:Kishi:20081125190706j:image


Jungで簡単なグラフを作成する

Jungを使ってグラフを生成する手順は以下のようになります。

//グラフの作成
Graph graph = new UndirectedSparseGraph();
Vertex[] vertices = new Vertex[5];
// ノード作成
for (int i = 0; i < vertices.length; i++) {
    vertices[i] = graph.addVertex(new UndirectedSparseVertex());
}
// エッジ作成
for (int i = 0; i < vertices.length; i++) {
    for (int j = 0; j < vertices.length; j++) {
        graph.addEdge(new UndirectedSparseEdge(vertices[i], vertices[j]));
    }
}
//描画ための処理
Layout layout = new CircleLayout(graph);
Renderer renderer = new PluggableRenderer();
VisualizationViewer viewer = new VisualizationViewer(layout, renderer);

VisualizationViewerはJPanelを継承しているので、JFrameにaddすれば簡単にGUIで表示することができます。


実行結果

f:id:Kishi:20081125191233j:image


グラフの種類

Jungのグラフは大きく分けると、方向を持つ有向グラフと、方向を持たない無向グラフに分かれます。

それぞれで使うノードやエッジにクラスや適応可能なアルゴリズムが異なるので注意が必要です。


Jungで作ったグラフ例:Twitterのリプライ関係のグラフ

フォロー関係より面白そうだったのでやってみました。今回のjava-jaの参加者でTwitterを使っている人のリプライ関係をTwitter検索(http://pcod.no-ip.org/yats/)から取得してきて、以下のような行列を生成して、グラフとしてJungで描画します。

 yoshiorilalhayamashiro
yoshiori012
lalha101
yamashiro210
描画結果

f:id:Kishi:20081125193622j:image

リプライの多さでエッジの太さを変えています。


グラフレイアウト

グラフはノードの位置によって印象が大きく異なってくるのでどのようにノードを配置するかが非常に大切です。自動でノードを配置するアルゴリズムはばねモデルをはじめとして、さまざまなものがあります。JungではLayoutインターフェースを実装したクラスを切り替えることでレイアウトを変更することができます。

上記のリプライ関係のグラフ描画には自己組織化マップを使ったレイアウトを利用しています。

以下の図はjava-ja参加者のフォロー関係について円環レイアウトで表示したものです。

f:id:Kishi:20081125194333j:image

クリックしたノードにつながっているエッジを強調しています。青が片思いで赤が両思いを表しています。これだけ密なグラフだと普通に描画しても見づらいので、このような表示方法のほうがわかりやすいのではないかと思います。


関連

分析をしてみる

ただグラフを描画するだけだと他にもいくつかライブラリが存在するのですが、グラフの構造の分析を行うことができるのもJungの特徴です。

中心性を求める

ネットワークの特徴を知る上で、中心的なノード(=そのグラフにおいて重要な位置の行為者)を求めることは重要です。中心性を求める方法はいくつか存在しますが、Jungでは媒介中心性、マルコフ中心性、PageRank、HITSなど多くの中心性を求めるアルゴリズムを利用可能です。

以下は与えられたグラフのPageRankを求めるソースコードです。

PageRank rank = new PageRank((DirectedGraph)graph, 0.5);
rank.evaluate();
List<NodeRanking> rankings = rank.getRankings();
rank.printRankings(true, true);

以下はリプライ関係のグラフのページランクを求めた結果です。

ID			Score
cactusman:	0.09556843685176082
yuripop:	0.08203343054586779
yamashiro:	0.05518103427914454
yoshiori:	0.05266528819081352
bose999:	0.041731677983314314

クラスタリング

ノードの類似性によって,複数の対象をグループ化する方法をクラスタリングと呼びます。

以下はBetweennessクラスタリング*1という手法を実行するソースコードです。

EdgeBetweennessClusterer clusterer = new EdgeBetweennessClusterer(10);
VertexClusterSet clusters = (VertexClusterSet) clusterer.extract(graph);
System.out.println("community count = " + clusters.size());

その他の機能
  • ランダムグラフの生成
  • ネットワーク距離や最大流の計算
  • 統計解析

など。

Jung2 comming soon

近いうちにJava5に対応したJung2が出ます。

Genericsへの対応やアニメーション機能など多くの機能追加と改善が行われているらしいので期待です。


日本語で参考になるサイト

「Jung-TECHSCORE-」

http://www.techscore.com/tech/Others/Jung/index.html

「Jung」で日本語のページをぐぐったら一番上に出てくるはず。

「Jungで相関行列のグラフ化」

http://txqz.net/blog/2008/10/25/1155

Jungの実践的な使い方。

*1:媒介性の高いエッジを取り除いていく手法

2008-10-20

[][]JJUG Cross Community Conference 2008 Fall行ってきた

前日に別の勉強会に参加していた関係で前日の上京が無理だったので、午後からの参加になりました。

JJUGのページに載っていた地図に従って行けば開催地までたどり着けたのですが、その場所のどこの建物で実施されているのかが書いていなかったので若干迷いました。他のイベントもいくつか行われていたようで、それっぽい人についてそのまま違うイベントの会場に行くところでしたw

DOMパフォーマンスチューニング(id:amachang

  • javascriptは遅い遅いと言われるけど、ベンチマーク取るとPerlとかRubyより速くてPythonよりは遅いぐらいで十分速い
    • Javaを計測するのを忘れてた
  • よく遅いと言われるDOM
  • DOMをフェーズに4つの分けて考える
  • 1. javascriptとコンポーネント(C++)との通信
    • XPConnectやCOMとの通信
    • 単純なオブジェクトへのプロパティアクセスの数十倍かかるが、気ににならない程度
    • JSとC++の通信は単純に.(ドット)の数を数えればよい
  • 2. DOMノードの追加、値の変更
    • ノードに変更したフラグが立つとJSの処理が終わったあとに計算が行われる
    • JSの処理が終わった後なので単純なJS内でのベンチマークやプロファイリングツールが役に立たない
  • 3. スタイルの再計算
    • .の数を減らすのが一番効果的
    • スタイルの再計算が行われるタイミング
      • 1. 変更フラグが立っているノードがあってJSが終了したとき
      • 2. offsetWidthなどの変更フラグが立っている状態でスタイルの再計算が必要な操作が行われたとき
    • 属性値やclassやidを変えたら兄弟や子孫も再計算される
    • styleプロパティを直接書き換えたら書き換えたプロタティを継承している要素だけ再計算される
    • styleプロパティはclassプロパティの書き換えより速い
  • 4. レイアウトの再計算
    • 幅や高さや描画位置などの計算
    • どういうときにレイアウトの再計算が行われるかをWebkitのWebCoreRenderStyle::difを参照
  • プロファイラを使うとJSで何の計算に時間がかかったかわかる
  • WebKitが速い
  • 最近ブラウザのC++のソースを見るようになって、ドキュメントを読むよりソースを信じるようになった

id:monjudohのエントリがわかりやすいです。

The Performance of Dynamic Site (id:amachang) - 文殊堂

レイアウトの再計算されるタイミングなどについては全然知らなかったので非常に参考になりました。

amachangのjavascriptの話はamachangがどんどん細かい実装や挙動について詳しくなっていっているのがわかるので、毎回聞いていて面白いです。



ギークなお姉さんができるまで(べにぢょさんpurprin

  • purprinさん
    • no title
    • Webデザイナー
    • ○ぷるぷりん×ぱーぷりん
    • サイトやロゴの作成(パストラックなど)
    • 特急でXHTML+CSSコーディングを行うサービス
    • 現場のプロから学ぶXHTML+CSSという本が出る
  • べにぢょさん
    • DOMAIN ERROR
    • 好きな男性のタイプ:Geek!ギーク!ぎーく!
    • 好きな言葉:コンパイル
    • 好きなネットゲームが終了→自分で作ればいいじゃん→結構大変そう→来月作るって言ったけどごめん無理
    • その辺りからギークへの憧れ
    • geekDB - geek Daisuki Benny’s lovecall」をやっている
  • デザイナとの協業の話
    • 優秀なデザイナーには理由がある
      • なぜその色を選んだか?
      • 他の色では駄目な理由がある
    • purprinさん「プログラマからガンガン突っ込んでもらったほうがよいものができる。」

デザイナーさんの話を聞く機会がなかなかないので参考になりました。



『JavaからRubyへ』・アンド・ナウ(角谷さん高井さん和田さん

  • お金を持っている上司にどうやって新しい技術を説得するか
  • Rubyが流行り始めた頃はPHPやってた人がもっとよいPHPを求めてRubyにやってきていた
  • Java→Rubyはニッチでいいかも
  • Rubyそのものが使いたいと言うよりもそれを使ってどう開発するかに興味があった
  • DHHがやってる会社のフレームワークからRailsは出てきた→Javaの対抗ではない
  • Railsは突然出てきたものではなくて、オブジェクト指向や達人プログラマなどの歴史の流れの延長から出た
  • DHHはOO厨(もちろんいい意味で)
  • フレームワークを作るときにSmalltalkが選択肢に入っているのがOO厨の証明*1
  • PofEAAのActiveRecordパターンをそのままライブラリの名前にしちゃってる→OO厨極まれり
  • Railsはバージョン管理や自動化など、『達人プログラマ』に書いてあることをそのまんま実装してみましたということを突き詰めていったフレームワーク
  • JavaのEJBから軽いものを探していたらRubyを発見した
  • 『JavaからRubyへ』は実際は『EJPからRailsへ』 = 新しい技術を組織へ
  • 今のJavaは「軽快なJava」
  • 2年前はXMLとかでつらい時期だった
  • Javaの人の視点は、インディアン(Rails)発見→インディアンすげー→インディアン終わったという一方的な視点
  • EJBとRailsはある範囲では重なるところがあるけど、もっと広い範囲ではぜんぜん違う領域のもの
  • 背後の文化や歴史的な立ち位置を見ると面白いかも

パネルディスカッションのような形式だったのでメモしきれていなくて意味が違っているかもしれませんので、その際は適当に突っ込みをください。

今回のセッションの中では個人的に一番面白かった内容でした。

いくつか本が取り上げられていましたが、1冊1冊で見ると読んでいるものもありますが、歴史的な背景とかその辺の知識がないのでそういう視点を持って勉強してみたいと思いました。今回の話に出ていた書籍は高井さんのブログで紹介されています。(ページが見付かりません ? recompile.net



YET ANOTHER GREEN IT(角谷さん和田さん

  • TDDとペアプロをすると持続可能なソフトウェア開発可能
  • 和田さんと角谷さんとペアプロ
    • RESTfulな世界設計
    • Ruby+Emacs
    • ペアプロの雰囲気を
  • WEB+DB 42号の世界時計をRESTで表現する話を今回はRubyで
  • TDDの進め方は大きく二つになる
    • 大きくこうしたいというトップダウン
    • 部品部品を積み上げていくボトムアップ
  • ペアプロで言語のデフォルトでできなさそうだったら、それを補うライブラリを調べる
  • テストをグリーンにするために一時的にプログラムの挙動を書き換えることもある
  • 落ちるのがわかってるときにはペンディングにする
  • 実装方法でもめ始めたらとりあえず書く
  • 設計と単体テストと機能テストと受け入れテストがペアプロに含まれている

大半はペアプロのセッションだったので、実際に見てみないと雰囲気が伝えきれないですね。

「ペアプロでもライブラリの調査などの時は別々にやったほうがいいのでは?」という質問をしたかったのですが質問時間がなかったので、懇親会が終わった時にid:t-wadaさんに聞いてみたところ、そういう時は別々にやるべきと教えていただきました。



ここで小腹がすいたので一旦会場を抜けました。



CubbyでRESTfulなWebアプリを(縣さん id:agt

  • CubbyはStrutsなどと同じレイヤのフレームワーク
  • Ruby on Rails、Struts、Webwork2、Teeda、S2JSFなどのWebフレームワークの戦国時代
  • 自分にとってぴったりのフレームワークがない
    • ○JSP2.0 ×HTMLテンプレート
    • ○クールなURL ×拡張しつきURI
    • ○設定ファイルレス ×XML
    • ○名前がかわいい ×名前がかわいくない
  • 最初は社内案件をさくさくこなすために作っていた
  • Newsgraphyなど面白いサイトで使われ始めている
  • みんなフレームワーク作ればいいと思う
    • ○○しかできないはエンジニアとして危険
    • 抽象化やデザインパターンを知ることができる
    • フレームワークに使われるのか乗りこなすのか
  • HTMLのレンダリング結果となるべくマッチするようなカスタムタグに
  • RESTfulなWebアプリケーションの美しさ
  • URIに正規表現の指定も可能
  • 現在はseasar2がないと動かない

名前だけは知っていたCubbyですが、初めてどういう設計なのかをしることができてよかったです。

「みんなフレームワーク作ればいいと思う」という発言には同意です。以前、小規模なフレームワークを作ったことがあるのですが、他のフレームワークの良いところを真似したり、自分で考えるわかりやすいと思う設計を考えてみるのは非常に勉強になりました。また、出来上がったフレームワークを見れば、そのときの自分の知識の限界を知ることができると思います。



エンジニアのためのキャッチコピーの作り方(岡崎さん

  • コピーライター養成講座を半年受講しての発表
  • キャッチコピーの目的
    • 注意をひきつける
    • 商品やサービス、企業の良いイメージを植えつける
  • キャッチコピーの作り方:表現を作りこむのではなくて、発見することを大事にする。
    • 作りこんでいくと押し付けがましくなってしまう
    • テンプレート化されたありきたりの内容に陥りがち。
  • どういう風に発見するか
    1. ターゲットを設定する。
    2. 「何を伝えたいのか」整理する。
    3. とにかくいっぱい考える。(100個を目標に)
  • 決める方法
    • 共感できるのはどれか?
    • インパクトのある表現はどれか?
    • 伝えたい内容と会っているか?

自前のサービスのリリース時などはキャッチコピーに悩むので、非常に参考になりました。

客観的な視点から見たキャッチコピーの陥りがちな罠にも触れられていてよかったです(25年後の磯野家はインパクトがあるが、なんの商品がわからないなど)。



100行ぐらいで書く分散検索エンジンHadoop+Lucene太田さん

  • PFIの人
  • UNIX系の日本語入力環境を
  • iPhoneでAAが見えるのは僕のおかげ
  • 個人でも大規模な検索エンジンがさくっと作れる時代
  • Lucene
  • Hadoop
    • Nutchのサブプロジェクト
    • MapReduceやGFSのクローン
    • Yahoo,incでの実績だと4000ノードぐらいまでは運用可能
    • テラバイト規模のデータのソートなどが可能
  • HadoopのMapではなにもせずに、ReducerでLuceneを使ってインデックス作成
  • クエリを投げる部分はまた今度

HadoopとLuceneともに以前からちょくちょく触っていたので内容自体は目新しい話ではなかったですが、LuceneとHadoopの利用の仕方の説明としてわかりやすかったです。

ソースは「no title」で公開している模様。

太田さんがHadoopについてCodeZineで記事を書いていますので、興味のある方はそちらも一緒に見ると参考になると思います。



java-jaプレゼンツ・第十一回 第2回チキチキ JJUG だよ全員集合 ライトニングトーク大会

上記3つのプレゼンと時間が被っていたので途中から。聞けなかった発表も感想を見ると面白そうだったので残念でした。

遠恋と何か(id:Ewigkeit

札幌-東京間での遠距離恋愛について架空の人物の話。

飛行機の利用の話や手紙もいいよ泣いたよという話がありましたが超スピードだったのでメモりきれませんでした><

いつかプレゼン資料が公開されることに期待しましょう。


【作ってみた】niconico4jを作ってみた【Java】 〜はじめてのライブラリ公開〜(id:celitan
  • ニコニコ動画APIで取得可能なデータ
    • 再生画面のほとんどのデータ
    • ランキングデータ
    • 動画詳細データ(要ログイン)
    • 時報データ
    • ニコニコニュースデータ
  • 開発のきっかけ
    • 仕事中にうっかり初音ミク動画を見て上司にばれた
    • 仕事中にいじれるようにJavaで作った
  • Rubyにも同じようなライブラリがあります

こういうライブラリはLLの特権のような感じがしていたので、Javaでもどんどん出てくるようになるとよいですね。


継承だろJK(露木さん
  • Django-jaの人
  • テンプレートの重複について
  • includeで共通化して読み込んでいてもincludeが重複している
  • djangはテンプレートで継承可能
  • Javaでもそろそろ作るべきだろ

includeがあればついつい妥協してしまう点ですが、やはりテンプレートも継承ができたほうがいいですよね。Wicketで継承ができたのはうれしかったです。


ActionScript3のススメ(富永さん)
  • AIRでWassrクライアントを作ったりしてる
  • JavaとFlexは親和性が非常に高い
  • まだまだFlexに業務で使われる処理系のライブラリやフレームワークが不足している
  • どんどんライブラリやフレームワークをもっと増やそう

AS3とJavaの親和性が高い話は実際に言語を触ってみると実感ができると思います。

Spark project」がライブラリ等の公開は頑張っていますが、今後業務よりな方面のものも今後増えていくとFlexの業務利用も増えていくのかな。



懇親会

  • 全体で60人以上集まったので、急遽java-jaは別の店へ
  • java-jaでは呑み会にキャビアが出てくるのは常識
  • おもむろにモンスターハンターが開始される

以前私がwicket-jaで話したのを覚えていてくれた人が結構いたので嬉しかったですね。

Twitterでしか知らない人とも話ができました。

次の日が休みじゃなかったので早めの解散でしたが、楽しかったです。

*1:OO厨はSmalltalk大好き

2008-08-09

[][][]第一回Wicket勉強会で話してきた

今月の1日に開催された第一回Wicket勉強会で先日リリースした予測コミュニティ「こうなる。」話してきました。

Wicket勉強会はid:t_yanoさんが主催で行われたJavaのWebフレームワークの一つであるApache Wicketについての勉強会です。

会場はXarts株式会社さんにお借りしました。面白そうなことをやっている会社だったので、時間があったら社員さんとお話がしてみたかったですけど残念。

「こうなる。」ではWicketを使っているので、実際に開発する上で困ったことなどについてを話しました。

以下は発表資料です。

Wicketはこうなる! 予測コミュニティ「こうなる。」のご紹介

発表で取り上げたWicketのURLの話題については以下で以前記事で書いているので、興味があったら参照してみてください。


話してみての感想

こういうパブリックな技術系の勉強会で発表会をしたのは初めてだったので、LTだったのに結構長くなってしまったりと反省することは結構あるのですが、いい経験ができました。

課題としては一回ぐらいは会場を笑わせるということでしたが、うまく出来ていたでしょうか?

話してみて思ったことは、話す側はテンションが話しているうちにテンションが上がってくるので割と楽しく話せるのですが、逆に周りが見えなくなってきて突っ走りすぎてしまいがちになるかな、ということでした。

勉強会経由で「こうなる。」に興味を持ってもらった人も何人かいるようでうれしく思っています。


勉強会の発表のメモと感想

WicketとAjax(id:t_yano
  • 例のみんな大好きなサービスを150行で作るぞ
  • Wicketはセッションでページの状態を保持する
  • 全てメモリ上に持つわけではなく、最新のもの以外はセカンドレベルキャッシュに置かれバージョン管理される
  • クラスタリングを行うと、セッションが同期されている間はキャッシュも同期されるが、サーバが落ちてしまうと同期されない→これはWicketの領域の問題ではない
  • WicketのコンポーネントとAjax
    • DOMエレメント=コンポーネント
    • コンポーネントの更新=DOMエレメントの更新
    • あらゆるコンポーネントに後からビヘイビア(振る舞い)だけを追加できる
  • 課題
    • エレメントの追加が苦手
    • DOMのidと相性が悪い
  • Wicketのバージョン1.4m3でTwitterもどきを作成
  • wicket:removeタグで必要のないHTMLを表示しなくできる → ただのHTMLとしてファイルを見ることができる!

Wicketの説明としては非常にわかりやすかったです。

セカンドレベルキャッシュのあたりの話はほとんど理解していなかったので参考になりました。


会場から、「Swingの概念を意識して作ってるっぽいけど、EventListenerがないよね」という質問。内部的にはListenerを持っているらしくて、一部は公開されているらしいのでそれをいじることもできるようです。


Wicket as Meta-Framework(たけうち(chimera)さん)

ComponentResolverを使ったComponentの自動解決方法についての話が非常に面白かったです。

ただWicketの理念的にはどうなのよ?ということで若干宗教論争に。

コード書く量が減ってもそれが見通しが良いプログラムになるとは限らない、という発言が会場からあったのですが、Wicketを書いてるとなるほどなあ、と感じられました。

Wicketは拡張ポイントが多いということがわかったので、Wicketをいろいろいじってみたくなるプレゼンでした。


Wicketによる運用事例(gishiさん)
  • 大学の技術部の方の発表
  • 大学だと一回作って終わりじゃなくて、仕様変更が多い
  • StrutsやJSFをつかって開発していたけど教育コストや変更要求に耐えられなくなった
  • 特に大学生が開発に関わっていると結構な周期で人員が入れ替わるので大変
  • id:mdgwさんからWicketを教えてもらって使ってみた。
  • Wicketを使って幸せになりました
    • 教育コストの削減
    • 開発期間の削減
    • 残業時間が130時間から60時間に!

Wicketを使っていると、リリース後に修正するのが非常に楽なのは感じていて、HTMLファイルやコンポーネント単位での分離が行われているので、ここを変えたらどこに影響がでるのかわからない!という状況がほとんど発生していません。


Scala on Wicket(id:keisuke_n
  • キラッ☆

scala自体があまりわかってないので、?となってしまいましたが、少しscalaを書いてみた感じだと、たしかにWicketとあわせて使えればもっと効率よく開発できるかもと思いました。


不動産広告系ASPサービスのWebアプリの事例(id:u1tnk
  • Wicketを採用した理由→前任者が暴走して採用→使っているうちに気に入る
  • セッションが大きくなりがちなので、WebLogicのDB保存機能を利用
  • 動的にアンケートフォームを作成する仕組みなど

wicket本について話すときに、id:t_yanoさんがナイスタイミングで電話に出たので笑ったw

実運用の辞令の話は参考になりました。

動的にアンケートフォームを作成する辺りはもっと細かく話が聞いてみたかったです。



全体的な感想

懇親会には参加者のほとんどの方が参加されていました。

懇親会ではわりとStrutsの素晴らしさ(笑)について話をしていた気がします。

Wicketに興味を持っている方の多さが感じられたので、Wicketがもっと普及していくことを願っています。

そういえば発表者はなぜか大学関係者が多かったですねw


話は変わりますが、メーリングリストで勉強会の話題になったときに関西の方が結構いらっしゃったので、もし近くに関西でもWicket勉強会が開催されるなら、是非参加したいです。

2008-04-24

[][][]RSSをパースするときの制御文字への対処

DOMを使ってRSSをパースしているとたまに以下のエラーがおきることがあります。(Livedoorブログ、FC2、Amebaブログとかが多い)

An invalid XML character (Unicode: 0x14) was found in the element content of the document.

Unicode: 0x14の部分は0xbだったりいろいろです。

原因は、絵文字を使っていたり、文字化けしたりといったことによって制御文字が挿入されたためのようです。

ASCIIコードでは0x00〜0x1Fと0x7Fのコード範囲が制御文字になり、これが含まれているXMLはinvalidになるようです。

Javaの場合、RSSをパースする前に以下のようにこの制御文字を削除しました。

str.replaceAll("[\\00-\\x1f\\x7f]", "");

上記のコードだと、tabも消してしまうので修正。

str.replaceAll("[\\00-\\x08\\x0a-\\x1f\\x7f]", "");

RSSを提供している側で対処してほしい問題ですね。


参考

2008-03-24

[][]第七回java-ja 第一回チキチキ『Buriの旨さを味あわせてやる』〜やっぱぶりは寒ブリだよね〜 行ってきた

ustの準備に少し手間取って30分遅れで開始しました。

今回は詳しい内容については、スライドが多くてメモし切れなかったので大雑把です。二人合わせると200枚近くあったのではないでしょうか。

以下に、特に参考になったところをピックアップしておきます。


id:habuakihiroさんのスーツのお話

  • バックグランドについて長めに話す
    • 話していてかみ合わないとき→バックグラウンドの認識ができてない可能性あり
  • 本当のエンドユーザを何年か経験
    • 使い勝手がどうのといってる人いるけど、自分の作ったソフトウェアを3年使い続けた人いる?
  • 保守とかドキュメントが大事とか言うけど、ドキュメントはあっても役に立たない
  • ウォーターフォールを馬鹿にしてる人は、きちんと回ってるウォーターフォールを経験したことあるの?
  • コンサル:既存のプロセスを改善するのは得意だけど、新しいシステムを作って売るマーケティングが苦手
  • αスーツ ≠ アルパアジール・・・モビルスーツじゃなくてアーマーだった
  • 語ることは自分の経験したことのみにしている
  • 宇宙と書いてそらと読むのは常識
  • 価値連鎖(バリューチェーン)
  • お金の集め方は3種類
    • 自腹
    • 他人にお金を出してもらう
    • 売り上げ
  • 会計とは、お金という切り口手ビジネスプロセスをモニタリングするためのメーター
  • プログラミングとか、社内でやっていることは基本的に全部コスト→会社はお客様から給料もらっているようなもの
  • 利益を向上する4つの方法
    • 販売数を増やす
    • 原価を下げる
    • 単価を上げる
    • 回転率を上げる
  • 適切なターゲット設定をしないとせっかくの努力(=コスト)が無駄に
  • お客様の納得を得るのに必要なのは3つ
    • 特徴/他との差別化 
    • お客様にとってのメリット/得られる満足 
    • 実績/他のお客様の声
  • ここまでの話で2時間→java-ja最長!

個人的には今回の話の中で一番面白かったです。経営、お金、マーケティングと広い話題について話していたのですが、他のセミナーなどでこういう話を聞くと抽象論になってしまいがちなのですが、経験を元に話をしているので飽きることなく聞き続けることが出来ました。

技術だけに注力していると、仕事を経営の視点から見ることが欠けてしまう可能性があるので、今回の話は肝に銘じたいです。


ワークステートエンジンBuriの話(前半id:habuakihiroさんで、後半id:makotanさん)

  • Buri(Business Unit Routeing Integration)って?
    • OSSのワークフローエンジン→厳密な定義では違うのでワークステートエンジンと呼んでいる
    • 絵に書くだけでコーディングレスで実現できる
    • 理解する概念:状態、アクティビティ、ルーティング
    • BuriはS2Containerのコンポーネントの一つ
    • BaoとInvokeメソッドを使う
    • XPDLを利用
  • 作った理由は?
    • if文が嫌いなので
      • 存在していること自体が問題
      • カバレッジという言葉がifのせいで生まれた
      • 体脂肪みたいにある程度必要だけど多すぎるとだめ
      • 本当に嫌いなif・・・DBのフラグと連携しているif→DBってグローバル変数だよね
    • XPDLの仕様が気に入ったから
  • Ebi
    • ブリの中にあったハリセンから派生
    • Excelを使って分岐を整理して実行できるライブラリ?

Buriの内部設計の話もあったのですが、追いきれませんでした。

革新的な仕組みなのですが、今までの開発とはまったく違うスタイルになるので、よさがわかりにくいのが問題だそうです。



LT

ついったー的ななにか(id:Youchan
  • Twitter使えない
  • そもそも集中管理してるのがだめ
  • P2Pを使って、Twitterの書き込みを共有できないか?
  • ACOという名前の分散メッセージングネットワーククライアント作ってる
  • Twitterのクライアントとしての機能もあり
  • SkypeのP2Pネットワークを利用→JXTAかBitTorrentのネットワークのほうがいいかな?

Winny2のBBS機能に近い話だと思います。実現できると面白そうなので期待しています。

Twitterの面白いところは、Twitterのシステムを起点にして、いろいろな仕組みが開発されているところですね。


wicket-jaはじめました(id:t_yanoさん)
  • メインの活動はメーリングリスト
  • wicketの知名度アップ
  • バグ報告とかコンポーネントを作って送れるといいね
  • 今本を書いているけど、1.4が出るそうなのでどうしよう

現在、wicket勉強中です。

使っていて、苦に感じることが少ないので、もっと広まっていくとよいですね。


呑み会など

  • java-ja = 7000円オーバー
  • スターウォーズep3を2回見た
  • ザンボット3とガンダムの話で盛り上がる

id:habuakihiroさんとid:SiroKuroさんと同じ卓に座れたので、お話ができてうれしかったです。

2008-03-15

[][]Scala触ってみた

一部で話題になっており、関数型の言語を一度触ってみたかったので、勉強がてら使ってみました。

今回は、チュートリアルを元に、導入と簡単なScalaプログラムの作成、Javaとの連携の方法をまとめます。

Scalaとは

スカラと読むそうです。防御力が上がりそうですね。

JavaやRubyのようなオブジェクト指向言語とLispやHaskellのような関数型言語の中間にある静的型付け関数型言語です。

JVM上で動くので、Javaのライブラリを使うことができ、またコンパイルするとJavaのクラスとして実行することもできます。


導入

Java1.4 以降の環境が必要です。

Scala本体は以下のページからダウンロードできます。現在の最新バージョンは2.7です。

no title

Windowsの場合、zipを落としてきて解凍し、binにパスを通して以下のコマンドが実行できればOKです。

C:\>scala -version
Scala code runner version 2.7.0-final -- (c) 2002-2008 LAMP/EPFL

プログラムを書いてみる

まずは、お決まりのHello World!から。以下のプログラムをHelloWorld.scalaと名前を付けて保存します。ちなみに日本語を使う場合はUTF-8で保存してください。

object HelloWorld{
	def main(args: Array[String]){
		println("Hello world!")
	}
}

コマンドプロンプトで以下のコマンドでコンパイル&実行します。

C:\scala>scalac HelloWorld.scala

C:\scala>scala HelloWorld
Hello world!


ScalaにはRubyのirbのような対話型の実行環境もあり、scalaと入力すれば実行可能です。


Javaとの連携

Javaのパッケージを利用する

Javaのパッケージをインポートするには、

import java.util.List

のような感じで行えます。

同じパッケージ内のものを複数指定する場合は、

import java.util.{List, ArrayList}

のように書けます。

まとめてインポートするときは*ではなく

import java.util._

とアンダーバーを使います。

読み込んだクラスは

var list = new ArrayList[String]()
list.add("hoge");

のように違和感なく使うことが出来ます。

またクラスだけでなくメンバメソッドを読み込んで使うことが出来ます。


Javaプログラムとして実行する

scalacでコンパイルされて生成されるclassファイルはJavaのclassファイルと同じなので、ダウンロードしたScalaのフォルダのlib以下にあるscala-library.jarをクラスパスで指定すれば、Javaプログラムとして実行することが出来ます。

java -classpath .;C:\scala\lib\scala-library.jar HelloWorld

その他の特徴

  • 純粋オブジェクト指向言語なので、関数やJavaのintのようなプリミティブなものもオブジェクトとして扱う
  • 文末のコロンは必須ではない
  • staticなメンバは存在しない→シングルトンオブジェクトでメンバを定義する
  • オーバーライドするときは、明示的にoverride def hoge(){}とする

終わりに

とりあえず、今回はScalaの導入と簡単なプログラムの実行を行いましたが、これではJavaで書くのと大差ありません。チュートリアルでは、クロージャやケースクラス、パターンマッチなどが取り上げられているので、その辺りを使って、今後は関数言語らしい使い方をしてみたいと思っています。何か適当な課題があればよいのですが。

あと、Twitterにも書いたのですが、関数型言語は勉強用や研究以外で活躍している場というのがあるのでしょうか。どうせやるなら何かに使えると思うとやる気が出ますしね。


参考

2008-03-13

[][][]第9回Spring勉強会行ってきた

日程が合ったので、2回目の参加をしてきました。

前回は初心者向けの内容だったのですが、今回はSpringレベルが高い人向け(というよりも業務アプリの知識がある人向けというべきか)の内容で、レベル1の身としては新用語がどんどん出てくるので、いっぱいいっぱいでした。


Springを利用したWebアプリケーションのリファクタリング

id:hasebeanさんに、インターフェース未使用のアプリケーションがSpringを取り入れることでどう変わっていくのかを順に話していただきました。

最近Spring2.5を触ってみたのですが、自分のSpringの使い方の認識が間違っていないことがわかってよかったです。

Springは、Strutsのような他のフレームワークに比べて、使ったことがない人にわかりやすい利点がない、と述べられていましたが、AOPの具体例を紹介してもらえると利点がわかりやすくなるのではないかと思いました。


コールセンターのデモによるESBの紹介

ゆうすけさんによる発表。ServiceMixを使ったコールセンターのデモを通じてESBについて発表していただきました。

SOAな話題はほとんど追っていないので、知らない用語がたくさん出てきました。

以下に重要そうな用語をまとめておきます。


SOA

正式名称はService Oriented Aarchitecture。

ソフトウェアをサービスと呼ばれる単位で公開し、それらを統合することでシステムを作る設計思想です。

HTTPとXMLをベースにしたもので、私の認識ではWEB APIの考え方に近いものだと思っています。WEB APIでよく用いられるRESTではなく、SOAP、WSDL、UDDIが要素技術となっています。


SIP

正式名称はSession Initiation Protocol。

インターネット電話などで使われるステートフルなプロトコルです。

仕様があいまいなところがあるので、ベンダー同士で実装が異なることがあり、そんな独自仕様のSIPを相互接続するのが「SIProp」というオープンソース・プロジェクトだそうです。


ESB

正式名称はEnterprise Service Bus。

SOAを実現するときにメッセージのやりとりの真ん中にバスを入れて処理を行う、ベンダー主体で進んでいる概念らしいです。


JBI

正式名称はJava Business Integration。

JavaにおけるESBの標準仕様です。

メッセージ交換手法だけを標準化しているそうです。


ServiceMix

Apache Software Foundationが開発している、JBIをベースにして実装されたESBのオープンソースソフトウェアです。


EDA

正式名称はEvent Driven Architecture。

イベントという概念を導入することで、サービスをセンダーとレシーバーに分離する、疎結合な設計を実現する方法?

イベント単位ということで、非同期が基本らしいです。

GUIにおけるイベントドリブンとは別の概念らしいです。


SEDA

正式名称はStaged Event Driven Architecture。

イベントをステージという単位に区切って処理をスケールアウトするEDAの進化系です。



とりあえず、3文字IT用語には自重してほしいですね。



Spring Integration

川村さんによるSpring FrameworkのサブプロジェクトであるSpring Integrationの話。

複雑なエンタープライズソリューションを実装するためにシンプルなモデルを提供するのが目的のものらしいです。



呑み会にも参加をしたのですが、Springの思想についてのお話や私が疑問に思っている点を聞くことができたので非常に参考になりました。



参考