2010年11月24日水曜日

NetBeans 7.0 で Git サポート(予定)

次期バージョンの NetBeanns 7.0(2011年3月リリース予定)にて、標準機能として Git サポートをするかもしれないとのことです
元ネタは NetBeans Wiki 、および、 NetBeans for PHP のコチラコチラの記事です
Git が加わりますと、 NetBeans としては CVS 、 Subversion 、 Mercurialと合わせて4つのバージョン管理システムに対応することとなります(ローカル履歴は省略しています)
現在も非公式プラグインの nbgit にて Git の使用は可能ですが、標準機能としてサポートされるのは嬉しい限りです

Git サポートプラグインは現在、開発者向けのアップデートセンターで配布されています
(開発者向けのアップデートセンターは、リリース版の6.9.1や今回リリースされた 7.0 Beta でも利用可能ですが、その他の開発版のアップデートなども含まれるため、環境が壊れる、または不安定になる可能性が高いため、お勧めしません)

今回はデイリービルド版の NetBeans Dev 201011180001 を使って試してみました
※nbgit が既にインストールされている環境では正しく動かないようなのでご注意下さい
まずは、メニューより「ツール > プラグイン」と選択し、「プラグイン」ウィンドウを表示します
次に「使用可能なプラグイン」タグを選択し、「検索」テキストボックス内に、"Git"と入力します
(大文字、小文字は関係ないようなので、"git"、"GIT"などでも構わないようです)


パッケージの候補が出てきますので、チェックボックスを選択し、ウィンドウ下部の「インストール」ボタンをクリックします
インストールはウィザードの指示に従えば、すぐに完了します
完了後、再起動のダイアログが表示されますので、 NetBeans の再起動を行います

再起動後、メニューに「チーム > Git」と表示されていれば、インストール成功です


2010年11月24日現在では、機能は "Initialize" と「オプション」画面しかありません
メニューより「Initialize」を選択すると、下記のようなダイアログが表示され、ローカルリポジトリを作成することができます


「オプション」は以下のようになっています


現時点はプランの M3 の段階ですので、リポジトリのクローンやチェックアウトなどは実装されていませんが(それらは次リリースの M4 で実装予定)、なんとか NetBeans 7.0 正式リリースと Git サポートのリリースタイミングが合えばと思っています
今後も進捗がありましたら、お伝えしていきたいと思います

2010年11月20日土曜日

NetBeans IDE 7.0 Beta リリース

NetBeans IDE 7.0 Beta がリリースされました
ダウンロードはコチラからできるようになっております
具体的な新機能等は上記リリース情報、 Wiki 、または片貝さんのエントリを参照下さい

M1、M2は触る機会が少なかったので、 Beta ではいろいろと試してみたいとおもいます
(ただ、(昔よりは楽になったとはいえ) WebLogic Server や Oracle Database をサクッとお試しとは行かないですが…)

恒例のスプラッシュですが、 6.8 以降のデザインから変わりました


青が主体なのは同じですが、以前の文字の配置等は 6.5 のときに戻ったような感じです
ちなみに、以下が 6.5 のスプラッシュ画面です
(個人的には 6.5 が一番好きでした)


NetBeans IDE 7.0 の正式リリースは2011年03月の予定となっています
不具合等お気づきの点がありましたら、 ML へのご連絡頂ければと思います

2010年11月18日木曜日

Scala 2.8.1 リリース

公式に発表されて、だいぶ時間が経ってますが、Scala 2.8.1 正式版がリリースされました
今回から Macports ではなく、Homebrew でのパターンとなります
"brew outdated" を実行すると、下記のように 2.8.1 のパッケージが準備されていることが確認できます

$ brew outdated
scala (2.8.0 < 2.8.1)

あとは、これをインストールするだけとなります

$ brew install scala

インストール後のバージョン情報は下記のようになっています
(Macports と違い、2.7系、2.8系が別々にはなっていません)

$ scala -version
Scala code runner version 2.8.1.final -- Copyright 2002-2010, LAMP/EPFL

2010年11月17日水曜日

MacPorts から Homebrew へ移りました

HDD の乗せ換えで OS 丸ごとクリーンインストールしたことを契機に、長年お世話になった MacPorts から Homebrew に移ることにしました

MacPorts 自体は管理しているパッケージも豊富、動作も速く、申し分ないのですが、唯一不満なのは Mac に標準で入っている(MacPorts の管理外の)アプリケーションを考慮せずに、新たにインストールする点です
(例えば、 Mac にはデフォルトで perl 5.10 がインストールされていますが、 MacPorts でインストールするパッケージが perl に依存するものである場合、デフォルトのそれではなく、依存パッケージとして新規に perl をインストールしようとします)

ということで、その不満を解消してくれる Homebrew の導入に踏み切りました
※Homebrew も管理パッケージがまだまだ少ないなど、全く不満がないわけではないので、インストールされる際は、各々のメリット、デメリットを考慮の上、お試しください

インストール前に下記のような条件があります
(原文はココで、注釈は端折ってますので、気になる方は原文を参照下さい)

・CPU が Intel な Mac であること
・OS は 10.5 Leopard か、それ以上であること
・X11 込みの XCode
Java Developer Update

Java Developer Update は特に、Apple リリースの "1.6.0_22 JRE update" をインストール、使用している場合は必ずインストールすることをお勧めします(cmake 等のインストールでコケます)
Apple Developer から最新の Developer Package (2010年11月17日時点では "Java for Mac OS X 10.6 Update 3 Developer Package") をダウンロードし、インストールして下さい
また、上記公式の注釈には(言うまでもないからか)記述がないのですが、インターネットへの接続が必要です

以上の条件が満たせたら、実際に Homebrew をインストールしてみます
インストールは至って簡単で、下記コマンドで完了します
※インストール中、管理者( sudo )のパスワードを求められるので、入力してください

$ ruby -e "$(curl -fsSL https://gist.github.com/raw/323731/install_homebrew.rb)"

Homebrew は "/usr/local" 以下に自身とパッケージをインストールするので、 PATH を通します
".bash_profile" など適当なファイルに下記を記述してください

export PATH=/usr/local/sbin:/usr/local/bin:$PATH

PATH を反映後、 "brew -v " コマンドを実行し、インストールが正常に行われているかを確認します
下記のようにバージョン番号が表示されたら正常に完了しています
(2010年11月17日時点では最新バージョンは 0.7.1 です)

$ brew -v
0.7.1

次に、パッケージ( homebrew では fomula と呼んでいますが、今回はパッケージで表記を統一させていただきます)のインストールを行います
下記コマンドにてパッケージのインストールを行います

$ brew install [インストールしたいパッケージ名]

"cmake" をインストールしたい場合は、下記のようになります

$ brew install cmake

対応しているパッケージを検索する場合は下記のとおりです

$ brew search [検索したいパッケージ名(の一部)]

"make" という名前が含まれるパッケージを検索したい場合は、下記のようになります
(実行結果も併せて記載します)

$ brew search make
cmake colormake makensis o-make premake smake

Homebrew 自身(と管理パッケージ情報)の更新は下記のようになります

$ brew update

インストール済みのパッケージが(管理パッケージにて)最新版かどうかの確認は下記のコマンドを使用します

$ brew outdated

アップグレードする際は、インストールと同様に "brew install [パッケージ名]" コマンドで可能です
※古いパッケージを一括でアップグレードする方法をご存知の方がいましたら、コメントいただけると助かります

以上、簡単ですが、 Homebrew の使い方になります
自分でパッケージを作るのも簡単なようなので、機会があれば挑戦したいと思います

2010年11月16日火曜日

Ubuntu 10.04 に Bazaar をインストールする

1ヶ月以上間があいての、久々のポストです

【11月18日追記】
Bazaar のスペル間違ってました
申し訳ありません
(誤)Bazzar→(正)Bazaarです
(記事のURLは作成時に決まるので、bazzarのままです)
ubuntu primer さん、ご指摘ありがとうございます

今回は、Ubuntu 10.04 に Bazaar をインストールする方法です
ざっと調べた限り、 NetBeans 用プラグインはありませんでした
(それらしきプロジェクトは sourceforge.net 上で見つけたのですが、活動しているかは不明でした)

今回は apt を利用して、パッケージのインストールを行います
デフォルトでも 2.1 系の Bazaar インストールは可能ですので、このバージョンで問題ない場合は、サクッと "sudo apt-get install bzr" とするとインストール完了です
しかし、最新の安定版は(2010年11月16日現在) 2.2 系ですので、こちらをインストールしたい場合はリポジトリの登録が必要になります
※以降は、公式リポジトリ以外のリポジトリを追加しますので、実行する際は自己責任にてお願いいたします

まず、リポジトリリストにリポジトリを追加します
"/etc/apt/sources.list" ファイル、または "/etc/apt/sources.list.d" ディレクトリ以下に適当なファイル名でファイルを作成し、リポジトリ情報を記述します
なお、今回の例では "/etc/apt/sources.list.d" ディレクトリ以下に "launchpad.list" という名前を作成しました

ファイルに記述した内容は以下のとおりです
("/etc/apt/sources.list" ファイルを編集する場合は既存にあるリポジトリの最終行に追記、"/etc/apt/sources.list.d" ディレクトリ以下に新規ファイルを作成した場合はそのまま記述ください)

deb http://ppa.launchpad.net/bzr/ppa/ubuntu lucid main
deb-src http://ppa.launchpad.net/bzr/ppa/ubuntu lucid main

なお、"lucid" の部分を各 Ubuntu のバージョンに併せて適時変更頂ければ、その他のバージョンでも対応できるかと思います

次に "sudo apt-get update" を実行し、パッケージ情報をサーバから取得します
取得後、最後に下記のような警告メッセージが表示されるとおもいます

$ sudo apt-get update
無視 file: binary/ Release.gpg
(中略)
W: GPG error: http://ppa.launchpad.net lucid Release: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY D702BF6B8C6C1EFD

警告を出さないようにするため、以下のコマンドを実行し、公開鍵を登録します
登録する鍵の ID は、警告の中の最後の "NO_PUBKEY" につづく文字列 "D702BF6B8C6C1EFD" になります
※この文字列は、リポジトリ毎に異なりますので、lucid(10.04) 以外のバージョンのリポジトリを使うときは読み替えてください

$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys D702BF6B8C6C1EFD

再度、 "sudo apt-get update" を実行し、警告がでないことを確認してください
以上でリポジトリの登録が終わりになります
以降の処理は通常の Bazaar パッケージのインストールと同じです
(既に Ubuntu のリポジトリからインストール済みの場合はアップグレード( "sudo apt-get upgrade" )してください)
"bzr --version" コマンドで最新版の 2.2 系がインストールされていることが確認できるかと思います

$ sudo apt-get install bzr
(中略)
$ bzr --version
Bazaar (bzr) 2.2.1
(後略)

2010年9月23日木曜日

うれしかったので貼ってみた

前回で2回分 OrientDB について紹介するエントリを書いたところ、開発者の Luca に Tweet いただきました


まだまださわりすら書けていないので、これからも頑張って OrientDB の魅力を書いていけたらなと思います
前回分までのエントリは以下になります

オープンソース NoSQL データベース OrientDB を使ってみる #1
オープンソース NoSQL データベース OrientDB を使ってみる #2

OrientDB に興味をもたれた方、ぜひダウンロードして使ってみてください

2010年9月22日水曜日

オープンソース NoSQL データベース OrientDB を使ってみる #2

前回に引き続き、 OrientDB の紹介です
今回は Java API を使用したデータの操作について紹介します
OrientDB では使用する API によりドキュメント指向データベース、オブジェクトデータベース、グラフデータベースとしての特性を利用することができます
(実際はドキュメント指向データベースをベースに、各データベースの特性のラップを通して利用するという実装です)
以降の説明では基本となるドキュメント指向データベースとしての操作について説明しています

操作の対象は、今回もサーバーとして起動している OrientDB とします
OrientDB のインストール、設定、起動については下記のエントリを参照ください

オープンソース NoSQL データベース OrientDB を使ってみる #1

使用する環境は以下のとおりです

・Mac OS X 10.6.4
・Java(TM) SE Runtime Environment (build 1.6.0_20-b02-279-10M3065)
・OrientDB 0.9.22
・NetBeans 6.9.1
※以降の説明はお使いの環境に合わせて、適時読み替えてください

まず、 NetBeans にて Java アプリケーションの新規プロジェクトを作成します
プロジェクト名は任意で構いませんが、ここでは説明のため "OrientDBSample" とします
「主クラスを作成」チェックボックスもチェックしていて下さい

プロジェクト作成後、必要なライブラリの追加を行ないます
"OrientDBSample" プロジェクト内の「ライブラリ」フォルダを右クリックし、表示されたコンテキストメニューより「JAR/フォルダを追加...」をクリックします

ファイル選択ダイアログが表示されるので、 OrientDB を展開したフォルダ内の "lib" フォルダにある、 "orientdb-client-0.9.22.jar" 、及び "orientdb-core-0.9.22.jar" を選択し、「選択」ボタンをクリックします
ダイアログが閉じると、「ライブラリ」フォルダ内に上記2つの JAR ファイルが追加されていることが確認できるかと思います

まず、データベースへ接続を行ないます
接続は前回同様 demo データベースを使用します
プロジェクト作成時に自動生成された Main クラスの main メソッド内に以下のようにコードを追加します
(「主クラスを作成」オプションを選択していなかった場合は、 main メソッドをもつ適当なクラスを作成してください)
package orientdbsample;

import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;

public class Main {
    public static void main(String[] args) {
        // admin ユーザでサーバーの demo データベースに接続します
        ODatabaseDocumentTx database = new ODatabaseDocumentTx("remote:localhost/demo").open("admin", "admin");

        // 接続の解除
        database.close();
    }
}
以降は上記のソースを基本に処理のコードを追加していきます
(import 文、パッケージ名は省略しますのでご注意下さい)

まずは、登録処理を行うコードです
入力後、正常に動作が完了することを確認してください
public class Main {
    public static void main(String[] args) {
        // admin ユーザでサーバーの demo データベースに接続します
        ODatabaseDocumentTx database = new ODatabaseDocumentTx("remote:localhost/demo").open("admin", "admin");
        
        // Rebellion クラスのレコードを作成
        // ※指定したクラスがデータベースに存在しない場合、自動的に作成してくれます
        ODocument document = new ODocument(database, "Rebellion");
        document.field("name", "Luke");
        document.field("surname", "Skywalker");
        document.save();

        // メソッドチェーンを利用して、 Rebellion クラスのレコードを作成
        new ODocument(database, "Rebellion").field("name", "Han").field("surname", "Solo").save();

        // 接続の解除
        database.close();
    }
}
ORientDB ではドキュメントは ODocument クラスを使用して表します
上記例では、 "Rebellion" クラスのドキュメントを作成しています
"Console" アプリケーションを使用した際には事前にクラスの作成が必要でしたが、 Java API を利用する際にはクラスが存在しない場合は自動的に作成してくれます
フィールドメソッドを使用し、指定したフィールド名にフィールド値を設定します
クラスに指定したフィールドが存在しない場合、新たに追加されます
フィールド値に指定可能な型は以下のようになっています

・文字列型 (java.lang.String)
・ Byte 型 (java.lang.Byte または byte)
・ Short 型 (java.lang.Short または short)
・ Integer 型 (java.lang.Integer または int)
・ Long 型 (java.lang.Long または long)
・ Float 型 (java.lang.Float または float)
・ Double 型 (java.lang.Double または double)
・ Boolean 型 (java.lang.Boolean または boolean)
・日付型 (java.util.Date)
・バイナリ (byte[])
・リスト型 (java.util.Set)
・セット型 (java.util.Set)
・マップ型 (java.util.Map)

上記に加えて、レコード間の関連を表す Link とそれに関係する型が OrientDB にてサポートされている型となります
( Link に関しては別エントリにて説明したいと思います)
例ではシンプルに文字列のみをフィールド値に設定しています
フィールドに値を設定した後、 save() メソッドでデータベースへの登録を行ないます

また、OrientDB ではデータ操作に対して( "Console" アプリケーションと同様に) SQLライクなクエリ(以降は SQL と記述します)を使用することができます
Java API を利用した SQL の実行は OSQLQuery クラスのサブクラス(下記例では OCommandSQL クラス)を使用します
public class Main {
    public static void main(String[] args) {
        // admin ユーザでサーバーの demo データベースに接続します
        ODatabaseDocumentTx database = new ODatabaseDocumentTx("remote:localhost/demo").open("admin", "admin");
        
        // INSERT 文を作成する
        String insertQuery = "insert into Rebellion (name) values ('Chewbacca')";

        // クエリを実行します
        database.command(new OCommandSQL(insertQuery)).execute();

        // 接続の解除
        database.close();
    }
}
次に browseClass メソッドを使用して、先ほど登録した Rebellion クラスの全レコードを表示します
("Console" アプリケーションの "browseClass" コマンドと同様の結果となります)
取得できたレコードの getIdentity() メソッドを呼びだすと、データベースにてユニークなキーとなる、レコード IDが取得できます
public class Main {
    public static void main(String[] args) {
        // admin ユーザでサーバーの demo データベースに接続します
        ODatabaseDocumentTx database = new ODatabaseDocumentTx("remote:localhost/demo").open("admin", "admin");
        
        // Rebellion クラスのレコードのリストを取得
        Iterable<ODocument> documents = database.browseClass("Rebellion");

        // レコードのリストから各レコードを取得します
        for (ODocument person : documents) {
            // レコードの各フィールドを取得
            // レコード ID を取得
            System.out.println("Rec ID : " + person.getIdentity());
            System.out.println("Name   : " + person.field("name"));
            System.out.println("Surname: " + person.field("surname"));
        }

        // 接続の解除
        database.close();
    }
}

実行後、以下のように出力されるかと思います
Rec ID : 19:0
Name : Luke
Surname: Skywalker
Rec ID : 19:1
Name : Han
Surname: Solo
Name : Chewbacca
Surname: null

クラスのレコード件数を取得するには countClass() メソッドを使用します
public class Main {
    public static void main(String[] args) {
        // admin ユーザでサーバーの demo データベースに接続します
        ODatabaseDocumentTx database = new ODatabaseDocumentTx("remote:localhost/demo").open("admin", "admin");
        
        // Rebellion クラスのレコード件数を取得します
        long count = database.countClass("Rebellion");

        System.out.println("Count: " + count);

        // 接続の解除
        database.close();
    }
}
また、個別のレコードを抽出するにはクエリを使用します
OrientDB では先の SQL とは別に Native クエリを使用することができますが、現在 Native クエリは local データベースに接続した場合のみ使用可能という制限があります
今回は remote データベースを前提としていますので、 Native クエリに関しては説明を省略します
Java API を利用したレコード抽出には OSQLQuery クラスのサブクラス(下記例では OSQLSynchQuery クラス)を使用します
public class Main {
    public static void main(String[] args) {
        // admin ユーザでサーバーの demo データベースに接続します
        ODatabaseDocumentTx database = new ODatabaseDocumentTx("remote:localhost/demo").open("admin", "admin");

        // クエリ文字列を作成する
        // name フィールドのフィールド値が "L" で始まるもののみ抽出する
        String query = "select from Rebellion where name like 'L%' ";

        // クエリを実行し、結果のリストを取得します
        List<ODocument> documents = database.query(new OSQLSynchQuery<ODocument>(query));

        // レコードのリストから各レコードを取得します
        for (ODocument person : documents) {
            // レコードの各フィールドを取得
            // レコード ID を取得
            System.out.println("Rec ID : " + person.getIdentity());
            System.out.println("Name   : " + person.field("name"));
            System.out.println("Surname: " + person.field("surname"));
        }

        // 接続の解除
        database.close();
    }
}
実行後、以下のように出力されるかと思います

Rec ID : 19:0
Name : Luke
Surname: Skywalker

次にレコードの更新を行ないます
対象となるレコードを抽出し、値を更新後、 save() メソッドを実行して反映します
対象レコード抽出には "@rid" という特別なフィールド(属性値) とレコードIDを使用しています
また、INSERT 文と同様に command() メソッドと OCommandSQL クラスを使用して UPDATE 文を実行することができます
public class Main {
    public static void main(String[] args) {
        // admin ユーザでサーバーの demo データベースに接続します
        ODatabaseDocumentTx database = new ODatabaseDocumentTx("remote:localhost/demo").open("admin", "admin");

        ODocument person = null;

        // SELECT 文を作成する
        String selectQuery = "select from Rebellion where @rid = 19:0";

        // クエリを実行し、その結果のリストを取得します
        person = ((List<ODocument>) database.query(new OSQLSynchQuery<ODocument>(selectQuery))).get(0);
        // レコードの各フィールドを取得
        System.out.println("Rec ID : " + person.getIdentity());
        System.out.println("Name   : " + person.field("name"));
        System.out.println("Surname: " + person.field("surname"));
        System.out.println("----------");

        // "name" フィールドのフィールド値を "" 更新する
        person.field("name", "Ben");
        person.save();

        // クエリを実行し、その結果のリストを取得します
        person = ((List<ODocument>) database.query(new OSQLSynchQuery<ODocument>(selectQuery))).get(0);
        // レコードの各フィールドを取得
        System.out.println("Rec ID : " + person.getIdentity());
        System.out.println("Name   : " + person.field("name"));
        System.out.println("Surname: " + person.field("surname"));
        System.out.println("----------");

        // UPDATE 文を作成する
        String updateQuery = "update Rebellion set name = 'Anakin' where @rid = 19:0";

        // クエリを実行します
        database.command(new OCommandSQL(updateQuery)).execute();

        // クエリを実行し、その結果のリストを取得します
        person = ((List<ODocument>) database.query(new OSQLSynchQuery<ODocument>(selectQuery))).get(0);
        // レコードの各フィールドを取得
        System.out.println("Rec ID : " + person.getIdentity());
        System.out.println("Name   : " + person.field("name"));
        System.out.println("Surname: " + person.field("surname"));
        System.out.println("----------");

        // 接続の解除
        database.close();
    }
}
実行後、以下のように出力されるかと思います

Rec ID : 19:0
Name : Luke
Surname: Skywalker
----------
Rec ID : 19:0
Name : Ben
Surname: Skywalker
----------
Rec ID : 19:0
Name : Anakin
Surname: Skywalker
----------

最後にレコードの削除を行ないます
対象となるレコードを抽出し、 delete() メソッドを実行して削除します
また、 command() メソッドと OCommandSQL クラスを使用して、 DELETE 文を実行することも可能です
public class Main {
    public static void main(String[] args) {
        // admin ユーザでサーバーの demo データベースに接続します
        ODatabaseDocumentTx database = new ODatabaseDocumentTx("remote:localhost/demo").open("admin", "admin");
        
        // SELECT 文を作成する
        String selectQuery = "select from Rebellion where @rid = 19:0 ";

        // レコードのリストから各レコードを取得します
        for (ODocument document : database.browseClass("Rebellion")) {
            // レコードの各フィールドを取得
            System.out.println("Rec ID : " + document.getIdentity());
            System.out.println("Name   : " + document.field("name"));
            System.out.println("Surname: " + document.field("surname"));
        }

        System.out.println("----------");

        // クエリを実行し、その結果を取得します
        ODocument person = ((List<ODocument>) database.query(new OSQLSynchQuery<ODocument>(selectQuery))).get(0);
        // 取得したレコードの delete() メソッドを実行し、レコードを削除
        person.delete();

        // DELETE 文を作成する(全件削除)
        String deleteQuery = "delete from Rebellion";

        // クエリを実行します
        database.command(new OCommandSQL(deleteQuery)).execute();

        // Rebellion クラスの件数取得(レコード有無判定)
        if(database.countClass("Rebellion") > 0) {
            // レコードのリストから各レコードを取得します
            for (ODocument document : database.browseClass("Rebellion")) {
                // レコードの各フィールドを取得
                System.out.println("Rec ID : " + document.getIdentity());
                System.out.println("Name   : " + document.field("name"));
                System.out.println("Surname: " + document.field("surname"));
            }
        } else {
            System.out.println("Rebellion クラスにはレコードは存在しません");
        }

        // 接続の解除
        database.close();
    }
}
実行後、以下のように出力されるかと思います

Rec ID : 19:0
Name : Anakin
Surname: Skywalker
Rec ID : 19:1
Name : Han
Surname: Solo
Rec ID : 19:2
Name : Chewbacca
Surname: null
----------
Rebellion クラスにはレコードは存在しません

以上で、Java API を利用した OrientDB の操作方法になります
今回説明はしませんでしたが、 OrientDB にはトランザクションも利用できます
しかし、最新リリース版として使用している 0.9.22 ではバグがあり、正しく利用できないという状態です
開発版ではこの問題は修正されているので、次回リリース版である 0.9.23 (10月中旬リリース予定)では問題なく利用出来るかと思います

次回はデータ間の関連(リレーション)について紹介したいと思います

2010年9月17日金曜日

オープンソース NoSQL データベース OrientDB を使ってみる #1

今回は OrientDB という オープンソースの NoSQL データベースを紹介致します
※OrientDB は開発が活発なプロジェクトであるため、記載した機能等が将来変更される可能性があります
 (実際、このエントリ書いてる最中にバージョン上がるし、実行ファイル名変わるし…)

OrientDB は今年(2010年)5月に公開された、新しいプロダクトです
(なお、ベースとなった Orient ODBMS ( C++ にて実装) は1999年にリリースされており、これは10年近くの実績があります)
開発者は Luca Garulli というイタリアの方で、 JDO 1.0 、 2.0 のエキスパートメンバーのひとりです
現在のところ Luca 1人で開発していますが、将来的にはコミュニテイとして開発者を増やしたいとのことです
(そのため、 Wiki のドキュメント整備まで手が回らないのか、情報が最新版と一致していない箇所があります)

OrientDB は DBMS の分類では CouchDB や MongoDB と同じ、ドキュメント指向データベースですが、データ間の関連(リレーション)はグラフデータベースのように扱うといった、複数の DBMS の特徴を備えたものとなっています
この他にも OrientDB には以下のような特徴があります

・100% Java にて記述されている
・軽量である(本体のみで約1MB)
・高速である(一般的なコンピュータ(※1)にて200,000件/秒の登録が可能(※2))
・グラフデータベースのスタックとして Tinkerpop を採用
 (Gremlin などの対応プロダクトが利用可能)
・データ操作には、Java API 、HTTP Restful API、 SQL ライクな構文をサポート
・スキーマレス、スキーマフル、複合の複数のスキーマタイプを選択可能
・ACIDトランザクションのサポート
・組込モード、サーバーモードの2つの動作モードをサポート
・ライセンスは Apache License 2.0
※1 … DELL Notebook model XPS M1530 with Intel(r) Core Duo T7700 2.40Ghz, 3 GB RAM and HD 5.400rpm, O.S. MS Windows Vista, JRE 1.6.0_20
※2 … インメモリでの処理時

また、 OrientDB を基盤とした OrientKV というキー・バリューストアのプロダクトがあります
(OrientDB、OrientKV(Key/Value Server) とは別に Orient Object(Object Database) というプロダクトもあるのですが、 OrientDB のコア機能として含まれているようなのでここでの説明は割愛しています)
OrientKV は本体が軽量、データ処理が高速であるという OrientDB の良い部分を引き継ぎ、且つ複数ノードにデータを分散させて格納する、分散キー・バリューストアとしての運用が設定にて簡単に実現できるという特徴があります
OrientKV の詳細に関しては別エントリにてご紹介したいと思います

次に OrientDB のインストールと、実際の動作についてです
以下の説明は下記環境にて行っています
Windows、Linux をご利用の方は、各環境に合わせて読み替えていただければと思います
(Windows 環境では .sh ファイルを .bat ファイルと読み替えるなど)

・Mac OS X 10.6.4
・Java(TM) SE Runtime Environment (build 1.6.0_20-b02-279-10M3065)

OrientDB のインストールはパッケージのダウンロード、及び展開のみで完了します
コチラのリストより最新版(2010年09月17日現在)である "orientdb-0.9.22.zip" をダウンロードし、適当な場所に展開します

展開後、 "config" ディレクトリ内にある "orient-server-config.xml" ファイルを開き、9行目、10行目ほどにあるリスナのポート番号をご使用の環境に合わせ、変更します
(デフォルト値として設定されている、"2424-2430"(9行目)、"2480-2490"(10行目)の範囲内のポート番号が使用可であれば、特に変更は必要ありません)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<orient-server>
<network>
<protocols>
<protocol implementation="com.orientechnologies.orient.server.network.protocol.binary.ONetworkProtocolBinary" name="binary"/>
<protocol implementation="com.orientechnologies.orient.server.network.protocol.http.ONetworkProtocolHttpDb" name="http"/>
</protocols>
<listeners>
<listener protocol="binary" port-range="2424-2430" ip-address="127.0.0.1"/>
<listener protocol="http" port-range="2480-2490" ip-address="127.0.0.1">
<!-- 〜中略〜 -->
</orient-server>

また、 "bin" ディレクトリ内に移動し、下記ファイルに実行権限を付与します

$ cd ./bin
$ chmod +x ./server.sh ./console.sh

以上でインストール、及び初期設定は完了です

("bin" ディレクトリ内に移動したままの状態で)下記コマンドを実行し、サーバの起動を行ないます
(サーバを停止する場合は Ctrl + C にて停止します)

$ ./server.sh

最後に実際にデータの登録、参照、更新、削除を行ないたいと思います
OrientDB のデータに対しては、 Java API 、REST API 、同梱のクライアントアプリケーションの "Console" 、そして Web ベースのクライアントアプリケーションである "OrientDB Studio" から操作可能となっています
上記の中ではJava API の動作が一番安定していますが、使いやすさから今回は "Console" での操作を紹介します
(Java API での動作は次回紹介したいと思います)
なお、 "OrientDB Studio" はバグや未実装の機能が多く、 orientdb-0.9.22 のバージョンでは実用するには厳しい状態です

("bin" ディレクトリ内に移動したままの状態で)下記コマンドを実行し、"Console" の起動を行ないます
(起動後はプロンプトの入力待ち状態が ">" となります)

$ ./console.sh

起動後、まず "help" と入力します
下記のように各コマンドとその説明が表示されます

> help

AVAILABLE COMMANDS:

* get Return the value of a property
* classes Display all the configured classes
* set Change the value of a property
* delete Delete records from the database
* insert Insert a new record into the database
* connect Connect to a database
* update Update records in the database
* info Display information about current status
* properties Return all the configured properties
* disconnect Disconnect from the current database
* create database Create a new database
* create cluster Create a new cluster in the current database. The cluster can be physical or logical.
* remove cluster Remove a cluster in the current database. The cluster can be physical or logical.
* load record Load a record in memory and set it as the current one
* display record Display current record's attributes
* grant Grant privileges to a role
* revoke Revoke privileges to a role
* create link Create a link from a JOIN
* create class Create a class
* create property Create a property
* select Execute a query against the database and display the results
* script Execute a script against the current database. If the database is remote, then the script will be executed remotely.
* create index Create an index on a property
* create index Create an index on a property
* browse class Browse all the records of a class
* browse cluster Browse all the records of a cluster
* clusters Display all the configured clusters
* dictionary keys Display all the keys in the database dictionary
* dictionary get Loookup for a record using the dictionary. If found set it as the current record
* dictionary put Insert or modify an entry in the database dictionary. The entry is composed by key=String, value=record-id
* dictionary remove Remove the association in the dictionary
* export database Export a database
* compare databases Compare two databases
* import database Import a database into the current one
* export record Export the current record in the requested format
* help Print this help
* exit Close the console

コマンドの最後にある通り、 "exit" コマンドを使用すると、"Console" アプリケーションを終了することができます

次に "connect" コマンドを実行し、データベースに接続します
"connect" コマンドは以下のように入力します

connect <接続モード>:<データベースパス> <ユーザー名> <ユーザーパスワード>
・"接続モード" には "local" と "remote" があり、ローカルデータベースへの接続は "local" 、ローカル、またはリモートにて起動しているサーバーへの接続には "remote" を使用してください
・"データベースパス" はデータベースまでのパスとなります
 接続モードによりパスの指定が異なり、 "local" ではデータベースまでのファイルパス、 "remote" ではサーバーのアドレスとデータベース名となります
・"ユーザー名" 、 "ユーザーパスワード" はデータベースに設定されているユーザー名、パスワードとなります
 データベース作成時、デフォルトで下記ユーザーが作成されます

  ・ユーザー名:admin / パスワード : admin … データベースに対して、書き込み、読み込み権限を持ちます
  ・ユーザー名:writer / パスワード : writer … データベースに対して、書き込み限を持ちます
  ・ユーザー名:reader / パスワード : reader … データベースに対して、読み込み権限を持ちます

今回はユーザーは "admin" 、データベースは、デフォルトで作成されている "demo" データベースを利用します
使用するコマンドは下記のようになります

> connect remote:localhost/demo admin admin

"Connecting to database [remote:localhost/demo] with user 'admin'...OK" と表示され、入力待ち状態となったら接続成功です
接続に失敗する場合は、ポート番号が衝突していないか、確認してみてください

次にデータを登録しますが、その前にまずクラスの作成を行う必要があります
クラスは RDBMS の表と似た概念になり、データ集合のモデルとなるものです
なお、 OrientDB のクラスは、(上記特徴にも書いたとおり)スキーマレス、スキーマフル、両者の混在という設定が可能です
クラスの作成には "create class" コマンドを使います
"create class" コマンドは以下のように入力します

create class <クラス名>
・"クラス名" は作成するクラス名を指定します
 (クラスの識別として大文字小文字は区別されます)

使用するコマンドは下記のようになります

> create class Person

"Class created successfully with id=xx"(xx はユニークな ID、データベース上にあるクラスの ID が表示されます) と表示されれば、クラスの作成は完了です。
ここで、大きなバグがあるのですが、クラスを作成しても即時反映がされません
"exit" コマンドで接続解除をして、 "console.sh" でコンソールを再起動し、 "connect" コマンドで接続しなおしてください
再接続後、"classes" コマンドを実行すると、既存のクラスに加えて、先程作成したクラス名が表示されるのがわかります

> classes
CLASSES:
--------------------+------+------------------------------------------+-----------+
NAME    | ID | CLUSTERS         | ELEMENTS |
--------------------+------+------------------------------------------+-----------+
ORole    |  0| orole         |   3 |
OUser    |  1| ouser         |   3 |
Account    |  2| account         |  1005 |
Company    |  3| company         |   9 |
Profile    |  4| profile         |   9 |
Whiz    |  5| whiz          |  1000 |
Address    |  6| address         |  164 |
City    |  7| city          |  55 |
Country    |  8| country         |  55 |
Animal    |  9| animal         |   0 |
AnimalRace   | 10| animalrace        |   3 |
OGraphVertex  | 11| ographvertex        |  102 |
OGraphEdge   | 12| ographedge        |  101 |
Person    | 13| person         |   0 |
--------------------+------+------------------------------------------+-----------+
TOTAL                  2509 |
----------------------------------------------------------------------------------+

作成したクラスにスキーマを定義することが可能ですが、今回はスキーマレスで使用します

OrientDB ではデータ操作に、 RDBMS のように SQL に似た構文を使用することができます
データの登録には "INSERT" 文を使います

INSERT INTO <クラス名>|cluster:<クラスタ名> (<フィールド名>[,]*) VALUES (<フィールド値>[,]*)
・"クラス名"にはデータを登録するクラスの名前を記述します
・"クラスタ名" にはデータを格納するクラスタ名を記述します
 (クラスタは今回使用しませんので、説明は省略します)
・"フィールド名"をキーに"フィールド値"が登録されます

以下のデータを登録してみます

> insert into Person (name, surname) values ('Marty', 'McFly')

実行後、 "Inserted record Person@19:0{name:Marty,surname:McFly} in X sec(s)."(Xは秒数(環境により異なります)) のように表示されたら登録成功です
登録されたデータを確認する簡単な方法は "browse class" コマンドを使用することです

> browse class Person

---+--------+--------------------+--------------------
#| REC ID |NAME    |SURNAME   
---+--------+--------------------+--------------------
0| 19:0|Marty    |McFly   
---+--------+--------------------+--------------------

また、 SQL のように "SELECT" 文を使用することもできます
("browse class" コマンドと異なり、抽出する条件や並び順などを指定できます)

SELECT FROM <対象> [WHERE <条件>*] [ORDER BY <フィールド名>* [ASC|DESC]*]
・"対象"には検索する"クラス名"、"クラスタ名"、及び"レコードID"が指定可能です
 ("クラスタ名"、"レコードID"については今回使用しませんので、説明は省略します)
・"条件"には、データを抽出する条件を指定します(省略可能です)
・ORDER BY 句を使用した場合、指定した "フィールド名" 順に昇順( "ASC" )、降順( "DESC" )に並べ替えます

先程登録したデータを検索します

> select from Person where name = 'Marty' order by surname

---+--------+--------------------+--------------------
#| REC ID |NAME    |SURNAME   
---+--------+--------------------+--------------------
0| 19:0|Marty    |McFly   
---+--------+--------------------+--------------------

次はデータの変更(更新)を行ないます

update <クラス名>|cluster:<クラスタ名> set [[,] <フィールド名> = <フィールド値>]* [where <条件>]
・"クラス名"にはデータを更新するクラスの名前を記述します
・"クラスタ名" には更新するデータが格納されたクラスタ名を記述します
 (クラスタは今回使用しませんので、説明は省略します)
・"フィールド名"の値を"フィールド値"にて更新します
・"条件"には、更新対象となるデータの条件を指定します(省略可能ですが、対象が全件となります)

登録したデータを更新します

> update Person set name = 'George' where name = 'Marty'

実行後、 "Updated 1 record(s) in X sec(s)." (Xは秒数(環境により異なります))のように表示されたら更新成功です
"browse class" コマンドを使用すると、変更が確認できます

> browse class Person

---+--------+--------------------+--------------------
#| REC ID |NAME    |SURNAME   
---+--------+--------------------+--------------------
0| 19:0|George    |McFly   
---+--------+--------------------+--------------------

最後にデータの削除を行ないます

DELETE FROM <クラス>|cluster:<クラスタ> [WHERE <条件>]
・"クラス名"にはデータを削除するクラスの名前を記述します
・"クラスタ名" には削除するデータが格納されたクラスタ名を記述します
 (クラスタは今回使用しませんので、説明は省略します)
・"条件"には、削除対象となるデータの条件を指定します(省略可能ですが、対象が全件となります)

更新したデータを削除します

> delete from Person where surname = 'McFly'

実行後、 "Delete 1 record(s) in X sec(s)."(Xは秒数(環境により異なります)) のように表示されたら削除成功です
"browse class" コマンドを使用すると、データが存在しないことが確認できます

> browse class Person

以上で、"Console" アプリケーションを使用した OrientDB の操作方法になります
次回は、 Java API を利用した OrientDB の操作方法を紹介したいと思います

2010年8月17日火曜日

NetBeans IDE 6.9.1 リリース

随分遅くなりましたが、 NetBeans IDE 6.9 がリリースされました
ダウンロードはコチラです
Java FX の更新とバグフィックスが主な変更点となります

また、次期バージョン候補の 6.10 についての情報もコチラにあがっています
Oracle 製品(Weblogic や Oracle DB)と Glassfish 3.1 サポートがメインになりそうです
あとはパフォーマンスの見直しも計られるようです
また、確度は不明ですが、追加機能として GIT サポートもあがっています

6.10 についてまた何かわかりましたら、紹介したいと思います

2010年7月19日月曜日

Scala 2.8.0 リリース

Scala 2.8.0 正式版がリリースされました
Macports にも反映されています
Macports を使用してインストールした場合、2.7 系が Scala-2.7 、 2.8 系が Scala-2.8 というパッケージ名になっていますので、ご注意ください
インストール後のバージョン情報は下記のようになっています

$ scala-2.8 -version
Scala code runner version 2.8.0.final -- Copyright 2002-2010, LAMP/EPFL

ようやく正式版が出ました
NetBeans 用プラグインも早くから 2.8 対応が行われていますので、すでに移行済みの方も多いかと思います
時間を見つけて、Wiki のほうも最新に差し替えたいと思います

2010年7月2日金曜日

Scala 2.8.0.RC7 リリース

Scala 2.8.0.RC7 がリリースされました
Macports にも反映されています
Macports を使用してインストールした場合、2.7 系が Scala-2.7 、 2.8 系が Scala-2.8 というパッケージ名になっていますので、ご注意ください
インストール後のバージョン情報は下記のようになっています

$ scala-2.8 -version
Scala code runner version 2.8.0.RC7 -- Copyright 2002-2010, LAMP/EPFL

とうとう、RC7まできました
RC10までいくのか、それとも正式リリースされるのか…

2010年6月19日土曜日

Scala 2.8.0.RC6 リリース

Scala 2.8.0.RC6 がリリースされました
Macports にも反映されています
Macports を使用してインストールした場合、2.7 系が Scala-2.7 、 2.8 系が Scala-2.8 というパッケージ名になっていますので、ご注意ください
インストール後のバージョン情報は下記のようになっています

$ scala-2.8 -version
Scala code runner version 2.8.0.RC6 -- Copyright 2002-2010, LAMP/EPFL


2.8 の正式版いつでるのやら…

NetBeans IDE 6.9 リリース

NetBeans IDE 6.9 がリリースされました
ダウンロードはコチラです
ニーモニックを削除した、 Mac 用日本語化パックのダウンロードはコチラになります

いつも通りのスプラッシュは以下のようになっています


6.8 で問題だった日本語入力時の挙動も修正されています
従来のバージョンアップほど派手な機能追加はありませんが、細かな点での使い勝手の向上やサポート強化がありました
なお、内部 API にも変更がありましたので、サードパーティ製のプラグインが動かないケースがあるようです
バージョンアップの際はご利用のプラグインの対応状況も併せて確認してください
(複数バージョンがインストール可能なので、6.8 以前と並行して利用するという方法もあります)

また、何か問題等お気づきの点がありましたら、ML 等連絡をお願いします

2010年6月14日月曜日

Scala 2.8.0.RC5 リリース

Scala 2.8.0.RC5 がリリースされました
(Scala 2.8.0.RC4 には深刻なバグがあったようで、リリース後間もなく、RC5がリリースされました)
Macports にも反映されています
2.7 系が Scala-2.7 、 2.8 系が Scala-2.8 というパッケージ名になっていますので、ご注意ください
インストール後のバージョン情報は下記のようになっています

scala-2.8 -version
Scala code runner version 2.8.0.RC5 -- Copyright 2002-2010, LAMP/EPFL


2.8 の正式版が出たら、NetBeans プラグインの Wiki の日本語訳も併せてやろうとおもったのですが、なかなか出てくれないですね

2010年5月29日土曜日

Scala 2.8.0.RC3 リリース

Scala 2.8.0.RC3 がリリースされました
Macports にも反映されています
2.7 系が Scala27 、 2.8 系が Scala28 というパッケージ名になっていますので、ご注意ください
インストール後のバージョン情報は下記のようになっています

scala-2.8 -version
Scala code runner version 2.8.0.RC3 -- Copyright 2002-2010, LAMP/EPFL

2010年5月27日木曜日

NetBeans IDE 6.9 RC1 リリース

NetBeans IDE 6.9 RC1 がリリースされました
ダウンロードはコチラです
正式版のリリースは、6月中旬の予定となっています

いつも通りのスプラッシュは以下のようになっています

日本語化もだいぶ進んでいるみたいですので、未翻訳な部分等ありましたら、 ML 等連絡をお願いします

2010年5月13日木曜日

Scala 2.8.0.RC2 リリース

(ちょっと前の話ですが)Scala 2.8.0.RC2 がリリースされました
Macports にも反映されています
2.7 系が Scala27 、 2.8 系が Scala28 というパッケージ名になっていますので、ご注意ください
インストール後のバージョン情報は下記のようになっています

scala-2.8 -version
Scala code runner version 2.8.0.RC2 -- Copyright 2002-2010, LAMP/EPFL

2010年4月30日金曜日

組み込み型グラフデータベース HyperGraphDB で遊ぶ #1

ゴールデンウィークなので、業務では触ることはないであろう、グラフデータベースで遊んでみました
グラフデータベースは情報を表す、または格納するのに、ノード、エッジ、プロパティを使います
(Wikipedia より)
このノード、エッジなどの用語は、データベースの名前ともなっているグラフ理論からきています
従来の RDBMS と比較した場合、グラフデータベースはデータ構造が柔軟で、横断的に情報を抽出することに長けているとされています

最近、オープンソースのグラフデータベース neo4j の 1.0 がリリースされたこと、またそれに関する記事(
InfoQ
マイコミ)も掲載されましたので、既にご存知の方、またはいろいろと試されている方も多いかと思います

今回使用するのは上記の neo4j ではないのですが、同じくオープンソースの組み込み型グラフデータベース、 HyperGraphDB です
まず、HyperGraphDB のサイトよりご使用の環境にあわせたパッケージをダウンロードし、適当な場所に解凍してください
(以降の説明では、解凍した場所を $HGDB_ROOT と表記します)
今回は最新(10/04/30 時点)の HyperGraphDB 1.0 を使用し、説明したいと思います

HyperGraphDB は組み込み型データベースなのでインストール作業は不要なのですが、ストレージ機構として Oracle Berkeley DB を使用しているため、ご使用の環境に Berkeley DB がインストールされていない場合は、別途インストールが必要となります
(Mac OS X や Linux の主なディストリビューションでは標準でインストールされているかと思います)
Google 等で検索頂ければ、各環境でのインストールに関する情報は得られると思いますので、ここでは Berkeley DB のインストールは割愛させて頂きます

また、専用のクライアントアプリケーションは(現時点では)ないので、データ操作は直接 Java のコードを記述して行います
以降の説明ではソースコードの記述、ビルドに関する説明には NetBeans 6.9 Beta を使用しています
他の開発環境をお使いの方は適時読み替えて頂ければと思います

次に開発環境( NetBeans )の準備をします
NetBeans 起動後、"Java アプリケーション" の新規プロジェクトを作成します
作成したプロジェクトを右クリックし、表示されたコンテキストメニューより「プロパティ」を選択します


表示されたプロパティーウィンドウの「カテゴリ」から「実行」を選択します
次に「 VM オプション」のテキストボックスに、"-Djava.library.path=$HGDB_ROOT/native" と入力します
(先述の通り、 $HGDB_ROOT は HyperGraphDB の展開先ですので、環境に合わせて読み替えてください)


「了解」ボタンをクリックし、設定を反映します

プロジェクトツリー内の「ライブラリ」を右クリックし、「 Jar / フォルダを追加」を選択します


Jar / フォルダを追加ウィンドウが開くので、"$HGDB_ROOT/hypergraphdb.jar" を選択します


同様に "$HGDB_ROOT/jars/db.jar" を選択してライブラリに追加します
追加した結果のプロジェクトツリーは以下のようになります


開発環境の準備は以上となります

最後に、簡単なデータの登録と検索(問い合わせ)を行います
まず、データの登録用のクラスを新規作成します
パッケージ名、クラス名は任意で構いませんが、以降は説明のため、"hgdb.sample" パッケージ以下に "Insert" クラスを作成したものとします
作成したクラスに対し、以下のようにソースコードを記述します

package hgdb.sample;

import org.hypergraphdb.HyperGraph;

/**
* データ登録用プログラム
*
* @author Junji Takakura
*/
public class Insert {

public static void main(String[] args) {
// ストレージ(Berkeley DB)用ファイルパスを記述
String databaseLocation = "/tmp/hgdb";

HyperGraph graph = null;

try {
// データベースが存在しなければ、作成、存在していたら、オープンします
graph = new HyperGraph(databaseLocation);
// データベースに "吾輩は猫である" という文字列を登録します
graph.add("吾輩は猫である");
} catch (Exception ex){
ex.printStackTrace();
} finally {
if(graph != null) {
// データベースのクローズ
graph.close();
}
}
}

}

記述後、ファイルを実行(Shift + F6)を実行します
実行時にエラーが発生した場合、先述のプロジェクトプロパティの VM オプション、ライブラリの追加が正しく行われているか確認ください
エラーが発生せず、処理の実行が完了すれば、データの登録は完了です

次に、データの登録用のクラスを新規作成します
("hgdb.sample" パッケージ以下に "Select" クラスを作成したものとします)
作成したクラスに対し、以下のようにソースコードを記述します

package hgdb.sample;

import org.hypergraphdb.HGHandle;
import org.hypergraphdb.HGSearchResult;
import org.hypergraphdb.HyperGraph;
import org.hypergraphdb.query.AtomValueCondition;
import org.hypergraphdb.query.ComparisonOperator;
import org.hypergraphdb.query.HGQueryCondition;

/**
*
* @author Junji Takakura
*/
public class Select {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// ストレージ(Berkeley DB)用ファイルパスを記述
String databaseLocation = "/tmp/hgdb";

HyperGraph graph = null;

try {
// データベースが存在しなければ、作成、存在していたら、オープンします
graph = new HyperGraph(databaseLocation);
// 検索条件を作成
// 条件は、"吾輩は猫である" という値と等しい(ComparisonOperator.EQ)
// となるデータを取得する
HGQueryCondition condition = new AtomValueCondition(
"吾輩は猫である", ComparisonOperator.EQ);
// 検索実行と結果セットの取得
HGSearchResult<HGHandle> rs = graph.find(condition);

try {
while (rs.hasNext()) {
// 検索結果を HGHandle のインスタンスとして取得します
// HGHandle とは登録したオブジェクトを参照する、
// データベース上で一意となるキーです
// (詳細は次回説明します)
HGHandle current = rs.next();
// 取得したキーにて、データベースよりオブジェクトを取得します
String title = graph.get(current);
// 取得したオブジェクトを標準出力します
// 出力結果は「Found: xxxxxx...」と表示されます
System.out.println("Found: " + title);
}
} finally {
// 結果セットのクローズ
rs.close();
}

} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (graph != null) {
// データベースのクローズ
graph.close();
}
}
}
}

記述後、ファイルを実行(Shift + F6)を実行します
NetBeans の出力ウィンドウに、"Found: 吾輩は猫である" と表示されるかと思います

以上、簡単なデータ登録と検索となります
次回は、ノード、エッジなどのグラフデータベースの概念が HyperGraphDB でどのように実装されているか、また今回使用した登録、検索プログラムの詳細とより複雑なパターンについて紹介できたらと思います

2010年4月25日日曜日

NetBeans IDE の条件付きブレークポイントを使う

NetBeans IDE の条件付きブレークポイントの使い方です
以下の説明では、 NetBeans IDE 6.9 Beta を使用していますが、新機能ではないので、6.8 以前でも有効です

まず、エディタにてデバッグしたい箇所にブレイクポイントを設定します
次に、そのブレイクポイントを右クリックし、表示されたコンテキストメニューより「プロパティ」を選択します


また、メニューの「ウィンドウ > デバッグ > ブレイクポイント」と選択して表示されるブレイクポイントウィンドウでも同様の処理が可能です


「プロパティ」を選択すると、「ブレイクポイントプロパティ」ウィンドウが表示されます


まず、条件によって処理のブレイクを行いますので、ウィンドウ内の"条件"チェックボックスを選択し、その条件をテキストボックス内に入力します
テキストボックス内は補完機能が使用可能となっています


例では、"i == 4" となった場合に停止するよう設定します
条件入力後、「了解」ボタンをクリックし、設定を反映します


条件付きブレイクポイントが設定されると、ブレイクポイントアイコンの形が変わります
("■">"「"という感じです)


次に実際にデバッグを行います
(Mac な人は shift + F5 にて実行できます)

処理が停止し、表示された「変数」ウィンドウにて、条件の "i == 4" となっていることがわかります



指定回数処理が行われたかを確認するには、 "ヒットカウント時にブレーク" を使用します
先ほどの「ブレイクポイントプロパティ」ウィンドウにて、 "ヒットカウント時にブレーク" を選択し、停止したい回数を入力します
例では、7回ブレイクポイントを設定した箇所にヒットした(i == 6 となる) 場合に停止するよう設定します


デバッグを実行し、「変数」ウィンドウを確認します
"i == 6" にて停止したことがわかります



以上が条件付きブレークポイントを使い方になります
NetBeans IDE にはこれ以外にも様々なデバッグ支援機能があるので、それらも今後紹介できたらと思います

2010年4月24日土曜日

NetBeans IDE 6.9 で URL の下線を非表示にする

NetBeans IDE 6.9 では、エディタの構文の表示設定が増えています
その1つに URL があるのですが、デフォルトで下線が表示されるようになっています
XML などを編集していると見づらく感じるので、この機能をオフ(非表示)にする方法を紹介します


メニューより "オプション" を選択し、 "オプション" ウィンドウ内の "フォントと色" を選択します
つぎに "カテゴリ" の中から "URL" を選択します
"カテゴリ" の右にある、 "エフェクト" を "下線" から "なし" に変更します


「了解」ボタンをクリックし、設定を反映させます
6.8 と同様に下線が表示されなくなります

2010年4月23日金曜日

NetBeans IDE 6.9 Beta リリース

NetBeans IDE 6.9 M1 がリリースされました
ダウンロードはコチラです
正式版のリリースは、6月の予定となっています

いつも通りのスプラッシュは以下のようになっています


Beta より日本語を含む、多言語版にてリリースされているようです
(Mac な人はデフォルトではニーモニック付きなので、ダウンロードサイトからベータに対応する "nb69beta-ja_mac.zip" をダウンロードして適用ください)


※画像はMac用日本語パックを適用後のものです

何かお気づきの点がありましたら、 ML 等連絡をお願いします

2010年4月22日木曜日

NetBeans IDE 6.9 に追加予定の static import 対応

NetBeans IDE には多くの強力な補完機能を持っていますが、6.8 時点では static import の自動補完("インポートを修正")機能は実装されていません
6.9 でも期待されるような自動補完が実装される可能性は低いのですが、新たにヒント機能が追加される予定となっています
(検証に使用しているバージョンは NetBeans IDE Dev (Build 201004210200) です)

なお、今回試したバージョンではデフォルトで本機能はオフになっていたので、設定を変更する必要があります
メニューより "Options" を選択し、 "Options" ウィンドウ内の "Editor > Hints" の順にタブを選択します
「 Language 」リストボックスより "Java" を選択します
リストボックス下部のボックスより "JDK 1.5 and later" の項目を展開します
この中に "static imports" という項目があるので、これをチェックします


最後に「 OK 」ボタンをクリックしてウィンドウを閉じます

実際に "static import" のヒント機能を使用してみます
まず、 "static import" へ変換可能なメソッドを入力、カーソルがあたっている状態にします
エディタ枠外に以下のようなヒントが表示されます
【追記】
設定変更後、カーソルがあたっていてもヒントが表示されない場合があります
その際は一度ファイルを閉じ、再度開いた上でお試しください
(片貝さん、ご報告ありがとうございます)


このヒントをクリック(Mac では Alt + Enter でも同様)し、ヒントの内容を表示します


"static import" を追加するメッセージが表示されるので、これをクリック、または "enter" キーにて実行します


実行後、 "static import" 文が追加されます

"static import" のヒント機能については以上ですが、現時点では変換可能なメソッドにカーソルがないとヒントが表示されないなど実際の使用には不十分な点が見受けられます
(そのため、標準では機能がオフになっているのかもしれませんが…)
リリースまでにもう少しブラッシュアップされればと思います

2010年4月21日水曜日

Scala 2.8.0.RC1 リリース

(ちょっと前の話ですが)Scala 2.8.0.RC1 がリリースされました
Macports にも反映されています
2.7 系が Scala27 、 2.8 系が Scala28 というパッケージ名になっていますので、ご注意ください
インストール後のバージョン情報は下記のようになっています

scala-2.8 -version
Scala code runner version 2.8.0.RC1 -- Copyright 2002-2010, LAMP/EPFL

2010年3月31日水曜日

NetBeans IDE 6.9 に追加予定の新しいコードテンプレート

NetBeans にはすでに多くのコードテンプレート(略記+Tabキーで展開)が設定されていますが、 6.9 でもさらに新しいコードテンプレートが追加される予定です
(設定画面にてユーザが独自に設定することも可能です)
//  2al + [Tab]
List list = new ArrayList(
Arrays.asList(arr));
// 2ar + [Tab]
clazz[] arr = (clazz[]) coll.toArray(new clazz[coll.size()]);
// 2l + [Tab]
List list = Arrays.asList(arr);
// 2s + [Tab]
Set set = new HashSet(Arrays.asList(arr));
// log + [Tab]
Logger.getLogger(Main.class.getName()).log(Level.INFO, "message");
// loge + [Tab]
Logger.getLogger(Main.class.getName()).log(Level.INFO, "message", ex);
// logp + [Tab]
Logger.getLogger(Main.class.getName()).log(Level.INFO, "message {0}", panel);

今後も増えていくかと思いますので、何か面白いものがあれば紹介したいと思います

2010年3月24日水曜日

Mac OS X Snow Leopard (10.6.2) に Apache Cassandra をインストールする

先日、Apache Software Foundationのトップレベルプロジェクトになった Apache Cassandra (以下、 Cassandra ) を Mac OS X にインストールする方法を紹介します
(元ネタはコチラになります)
なお、今回のインストール例では簡単に試用することを目的として、ユーザディレクト以下にインストールしています

また、 Cassandra についての詳細は本家サイトWikipedia 等を参照ください

まず、本家サイトより Cassandra 本体をダウンロードします
今回の例では 10/03/14 時点で最新リリースとなる、 apache-cassandra-0.5.1-bin.tar.gz を使用して説明します
(異なるバージョンを使用する場合は適時読み替えてください)

ダウンロード後、ユーザディレクト以下の適当な場所に解凍してください
今回は説明上、 "/Users/Cassandra" ディレクトリ以下にインストールするものとします
また、展開されたディレクトリ、"/Users/Cassandra/apache-cassandra-0.5.1" を $CASSANDRA_HOME と表記します

"$CASSANDRA_HOME/conf/strage-conf.xml" を編集します
"Directories" の項目( "CommitLogDirectory" 、 "DataFileDirectory" 、 ”CalloutLocation” 、 ”StagingFileDirectory” )を以下のように変更します
  <!--
‾ Directories: Specify where Cassandra should store different data on
‾ disk. Keep the data disks and the CommitLog disks separate for best
‾ performance
-->
<CommitLogDirectory>/Users/Cassandra/apache-cassandra-0.5.1/commitlog</CommitLogDirectory>
<DataFileDirectories>
<DataFileDirectory>/Users/Cassandra/apache-cassandra-0.5.1/data</DataFileDirectory>
</DataFileDirectories>
<CalloutLocation>/Users/Cassandra/apache-cassandra-0.5.1/callouts</CalloutLocation>
<StagingFileDirectory>/Users/Cassandra/apache-cassandra-0.5.1/staging</StagingFileDirectory>

次に "$CASSANDRA_HOME/conf/log4j.properties" を編集します
ログ出力場所を以下のように変更します
# Edit the next line to point to your logs directory
log4j.appender.R.File=/Users/Cassandra/apache-cassandra-0.5.1/log/cassandra/system.log


最後に "$CASSANDRA_HOME/bin/cassandra.in.sh" を編集します
"JVM_OPTS" より、 "-Xrunjdwp:transport" の "address"(初期値8888) 、 "-Dcom.sun.management.jmxremote.port"(初期値8080) の項目をご使用の環境で使用していないポートに変更します
(初期値となっているポート番号を使用していない等、特に変更の必要がない場合は編集は不要です)

以上で準備が終わりましたので、 Cassandra を起動します
Terminal.app 等で "$CASSANDRA_HOME/bin" 以下にカレントディレクトリを変更し、以下のコマンドを実行します
cassandra -f


数行起動ログが表示された後、 Cassandra が起動します
"ERROR: transport error 202: bind failed: Address already in use" というエラーメッセージが表示された場合、使用するポートが、すでに別のアプリケーションに使用されている可能性があります
"$CASSANDRA_HOME/bin/cassandra.in.sh" の設定を見直してください

無事起動したら、クライアントからサーバにアクセスします
"$CASSANDRA_HOME/bin" 以下にある "cassandra-cli" コマンドを下記のように実行してください
cassandra-cli -host localhost

実行後、 サーバコンソールが起動しますので、 "show version" コマンドを実行します
下記のようにバージョン情報が表示されます
cassandra> show version
0.5.1


以上で Cassandra のインストールと起動になります
次回はクライアントからデータの追加について説明したいと思います

2010年3月19日金曜日

NetBeans 6.8 での日本語入力時のスクロールバグが修正されました

NetBeans 6.8 のリリースで大きな問題となった、スクロールバグですが、先日修正されました
詳細は以下のバグリポートを参照ください

Bug 178553 - I18N : regression - scrolling happens at committing Japanese strings by IME

最新ビルド版(NetBeans IDE Build 201003180200)、および下記組み合わせにて確認したところ、スクロールバグは解決したように思います

・Windows XP + MS IME, Google 日本語入力
・Mac OS X + ことえり, Google 日本語入力

十分に確認できたわけではありませんので、修正が不十分、また副作用などお気づきの方はメーリングリストへご報告頂ければと思います

2010年2月17日水曜日

NetBeans IDE 6.9 M1 リリース

NetBeans IDE 6.9 M1 がリリースされました
ダウンロードはコチラです
(なお、 M1 ですので不具合が多くあるかと思います。ご使用の際にはご注意ください)
正式版のリリース予定は2010年夏と予定されています

いつも通りのスプラッシュは以下のようになっています


6.9 で実装される予定となっている機能はコチラのリリース情報を参照ください
(詳細は Wiki を確認するとわかりやすいとおもいます)
いろいろと機能追加がありますが、大きな変更として、ビルドと起動(実行)に JDK 6 以上が必要になるという点があります
(6.8 までは JDK 5.0 以上でした)
その他の新機能について、機会があれば紹介したいと思います

2010年2月6日土曜日

NetBeans で Ivy を使う

NetBeans にて Ivy の利用をサポートしてくれるプラグイン、 IvyBeans の紹介です

複雑な依存関係をもつフレームワーク等を使うとき、 Maven を利用するとその煩わしさに悩まされることは少なくなります
NetBeans では 6.7 以降 Maven を標準でサポートしており、特に違和感なく Maven の強力な機能を活用できるかと思います

しかし、依存関係の解決だけで十分だったり、 ビルドツールとしては Ant を使いたい場合などは Ivy を使うことで対応できます
NetBeans では Ivy サポートプラグインである IvyBeans を使用することで、上記の Maven サポートに劣らず、Ivy の便利な機能がそのまま 利用可能になります

今回の紹介では Ivy そのものの使い方に関して詳しくは解説しておりませんので、必要な方は公式サイトをはじめ、その他のサイトを併せて参照ください
また、公式プラグインではありませんので、ご利用は自己責任にてお願い致します

まず、インストールですが、 IvyBeans のプロジェクトサイトより最新ファイル(2010/02/04 時点では ivybeans-1.1.zip )をダウンロードし、任意の場所に解凍します

次に NetBeans を起動し、上部メニューから「ツール > プラグイン」と選択、クリックします


プラグインウィンドウが表示されるので、「ダウンロード済み」タブを選択し、「プラグインの追加」ボタンをクリックします


先程解凍してできたファイルをすべて指定します


プラグインウィンドウに指定したファイルが追加されますので、「インストール」ボタンをクリックし、インストールを行います


以降はウィザードの指示に従ってインストール作業を進めてください
途中、未署名のためのウィンドウが出てきますので、「続行」ボタンをクリックしてください


インストールが完了したら、実際に使用してみます
まず、適当な Java のプロジェクトを作成します
(今回の例では、Java Web アプリケーションを作成しています)
作成したプロジェクトを右クリックし、表示されたメニューをより「プロパティー」をクリックします


プロジェクトプロパティーウィンドウが表示されます
新たに「 Ivy 」の項目が追加されていますので、それをクリックします


Ivy の設定項目画面から「Enable Ivy」チェックボックスをチェックし、「了解」ボタンをクリックします


プロジェクトの再スキャン後、 Ivy 関連のフォルダが追加されます


「 Ivy Libraries」 には Ivy にて管理されているライブラリ群、「 Ivy Files 」には Ivy の設定ファイル(デフォルトでは" ivy.xml ")が管理されています

Ivy にてライブラリ管理をするには、従来通りの設定ファイル(" ivy.xml ")を直接編集して設定する方法と GUI を使用して設定する方法があります
まずは、 GUI を使用した方法について説明します
プロジェクト中より「 Ivy Libraries 」を右クリックし、表示されたメニューより「 Add Library 」をクリックします


Add Library ウィンドウが表示されます


「org」に所属、グループIDを記述することで、以降の項目はそれに属する値が補完されます


入力後、「OK」ボタンをクリックすると、内容は設定ファイル(" ivy.xml ")に反映されます

次に直接設定ファイル(" ivy.xml ")に記述する場合は「 Ivy Files 」を展開し、表示されるファイルをダブルクリックします


エディタウィンドウにファイルが開き、内容を直接編集することができます
設定ファイルエディタでも入力内容は補完してくれます


設定ファイルへの設定完了後は、プロジェクト構築時に依存関係を自動的に解決し、不足しているライブラリをダウンロードしてくれます
また、「 Ivy Libraries 」を右クリックし、表示されたメニューより「 Force Resolve 」をクリックすることで、手動実行も可能です


ライブラリを依存関係より削除、または除外する場合は「 Ivy Libraries 」を展開し、表示されるライブラリを右クリックし、表示されたメニューより「 Remove Library 」をクリックします


依存するライブラリとして追加されたものは削除、依存関係として自動的に追加されたものは除外するよう、設定ファイル( "ivy.xml" )に反映されます

以上が IvyBeans の機能紹介となります
Ivy 使いの方、 NetBeans の標準プロジェクトで依存関係の解決に辟易されている方は一度お試し頂ければと思います

2010年2月3日水曜日

Project Kenai にホスティングされているプロジェクトについて

Project Kenai (kenai.com) にプロジェクトをホスティングされている方(プロジェクトオーナ)宛に、移行のメールが届いているかと思います
60日後(2010/4/2)にはサービスが終了するため、残っているプロジェクトは削除されるそうです
代替のサービス案については、コチラのフォーラムを参考にされてはと思います
移行方法(案)もメールにありますが、 Issue Tracker やフォーラムの内容に関しては自力で移行するしかないようです

とても良いサービスだけに、終了することはとても残念です
自分も2プロジェクト置いてありますので、どこか代替のサービスを探して、移行したいと思います
(Mercurial が使用可能で、良いサービスがあれば、ご教示頂ければと思います)

[2010/02/08 追記]
2/6 (日本時間)に、 Project Kenai のサービスが java.net との統合に向けて調整中であるとのメールがありました
今月末には詳細が明らかになるとのことですので、詳しい内容がわかりましたら、ここでも紹介できたらと思います

2010年1月30日土曜日

Scala 2.8.0.Beta1 リリース

Scala 2.8.0.Beta1 がリリースされました
Macports にも反映されていますが、今までの 2.7 系が Scala27 、今回の 2.8 系が Scala28 というパッケージ名に変更となっています
インストール後のバージョン情報は下記のようになっています
scala-2.8 -version
Scala code runner version 2.8.0.Beta1-prerelease -- Copyright 2002-2010, LAMP/EPFL


NetBeans 6.8 用 Scala プラグインは 2.8 が前提となっていますので、使用しやすくなるかと思います