2008年7月30日水曜日

NetBeans 6.x で Lift を試す

【08/08/03 追記】
NetBeans にてプロジェクト生成した場合、ビルド時にエラーとなる原因はパッケージ名に「-(ハイフン)」が含まれていたためでした
(こんな凡ミスの調査にかなり時間使ってしまった…)
それに伴い、画像も何枚か差し替えました
また、何かありましたら、コメント頂ければとおもいます

LiftScala で書かれた Web アプリケーションフレームワークです。
NetBeans にて Scala サポートのプラグインがあるので、この Lift の開発環境も NetBeans 上で構築できるか試したいと思います
(Netbeans の Scala サポートについてはコチラを参照下さい)
なお、今回は説明に NetBeans 6.5 M1 を使用しています
(Maven Plugin を使うだけであれば、6.1でも可能です)
まず、 Lift は Maven を利用すると構築、実行が楽とのことなので、まずは Maven の準備をします
OS X では標準で Maven 2.0.6 がインストールされていますが、 Lift Tutorial では、2.0.7 以降を動作環境としていますので、 ports などを利用してインストールします
(ports でインストールする際はパッケージ名は maven2 になりますので、ご注意下さい)
08 年 07 月 30 日現在では maven 2.0.9 がインストールされました
$ mvn -version
Maven version: 2.0.9
Java version: 1.5.0_13
OS name: "mac os x" version: "10.5.4" arch: "i386" Family: "unix"

次に、 NetBeans 用の Maven 用 Plugin をインストールします
「Tools > Plugins」を選択し、 Plugins ウィンドウを開き、 「Available Plugins」タブを開き、Maven 関連のプラグイン( "Meven" 、 "NetBeans Maven Hints" )を選択、インストールします

インストールが正常に終了したら、 Lift 用のプロジェクトを作成します
「File > New Project」を選択すると新規プロジェクト作成ウィンドウが開き、プロジェクト形式を選択する画面が表示されるので、その中から以下のように 「Maven Project」を選択して下さい

次に Maven Archetype を選択する画面に遷移するため、 「Add」 ボタンをクリックし、 Custom archetype を登録します

今回は、ココに記載してある、 "basic" にて設定を行います
各項目を入力すると以下のようになります

「OK」ボタンをクリックすると、 Archetype のリスト中に先ほどの入力した Custom archetype が追加されるので、それを選択し、 「Next」 ボタンをクリックします

次のプロジェクトに関する各設定は任意の値を入力して下さい
今回は以下のように入力しています
(一部画像修正してあります)
【08/08/03 追記】
パッケージ名にハイフンが含まれるとエラーになるので、アンダーバーなどに変更して下さい

入力後、 「Finish」 ボタンをクリックすると以下のようにプロジェクトが作成されます

このまま、 Maven を使ってビルドやアプリケーションの起動を行うと、 "java.lang.NoClassDefFoundError" が発生し、処理が中断します
この箇所でしばらくハマっていたのですが、ココにて対処法がありました
原因は Maven Plugin に同梱されている Maven にあるとのことで、別途外部の Maven を指定すると回避できるようです
まず、プロジェクトを右クリックして表示されるメニューより、 「Properties」 を選択します
表示された 「Properties」 ウィンドウ中の 「Categories」 リストから 「Actions」 を選択します
画面中の 「Use external Maven for build execution」のチェックボックスをチェックし、更に 「Setup external Maven home」 のリンクをクリックします

Maven2 Plugin の設定画面が表示されるので、 「External Maven Home」 に、最初にインストールした Maven のパスを入力します
(以下は Ports を使用した場合のパスになります)

設定反映後、再度 「Properties」 画面にて 「Add Custom」 ボタンをクリックし、Custom Action を追加します
「Action Name」 は任意で構いません

「OK」 をクリックして登録後、リスト中から追加したアクションを選択し、 「Execute Goals」 に 「jetty:run」と入力します

設定反映後、プロジェクトを右クリックし、「Custom > (登録した Action Name)」をクリックし、アプリケーションを起動します
実行後、任意のブラウザで "http://localhost:8080" へアクセスし、以下のように Lift のベース画面が表示されれば成功です

2008年7月19日土曜日

コードテンプレートについて

元ネタはココです

コードテンプレートとは、いくつかの文字を入力すると自動的にブロックやテキストへ展開してくれる機能です
例えば、以下のようなコードを生成してくれます
(デフォルトの設定では入力後に Tab キーを押すと展開してくれます)
// sout
// ↓
System.out.println("");

// serr
// ↓
System.err.println("");

また、元ネタにあるような変換も行ってくれます
// psf
// ↓
private static final

// psfb
// ↓
private static final boolean

// psfi
// ↓
private static final int

// psfs
// ↓
private static final String

// Psf
// ↓
public static final

// Psfb
// ↓
public static final boolean

// Psfi
// ↓
public static final int

// Psfs
// ↓
public static final String

ブロックも同様に変換してくれます
// ifelse
// ↓
if (true) {

} else {
}

// trycatch
// ↓
try {

} catch (Exception e) {
}

また、ループなどは事前に配列やリストがあれば、それを使用して生成してくれます
String[] arr = {"A","B", "C", "D"};
// fori
// ↓
for (int i = 0; i < arr.length; i++) {
String string = arr[i];
}

List list = new ArrayList();
// forc
// ↓
for (Iterator it = list.iterator(); it.hasNext();) {
String string = it.next();
}

その他のテンプレートの設定や展開するためのキーを変更したい場合は、「オプション」の「エディタ」項目より「コードテンプレート」タブを選択すると設定画面が表示されるので、そこで設定を行って下さい


よく使うものだけでも覚えているとかなりの効率向上が図れるかと思います

2008年7月13日日曜日

NetBeans 6.5 M1 リリース

諸事情でインターネットを利用できない状況にありましたので、もう新しくもない話題ですが、NetBeans 6.5 M1 がリリースされました
諸機能については片貝さんの blog にて紹介されていますので、ご参照頂ければと思います
言語サポートだけでも6.1では EA 版とされていた PHP サポートのほか、Python / Jython や Groovy のサポート、 Javascript サポート強化などかなりの機能追加、強化が予定されています
また、モジュール作者泣かせだとおもいますが、 API に関しても手が入っています
まだまだ M1 と思っていますが、秋にはリリース予定とのことで、楽しみに触って行きたいと思います

2008年7月3日木曜日

Quick Search API を試す

6.5M1 リリース間近という事で、新機能の Quick Search API を試します
元ネタは Geertjan's Blogココココのエントリー、 NetBeans Zoneココになります
(ほとんど上記のコピーです)

今回の例では Wikipedia の記事を検索します
まずは開発版ビルドをダウンロード、インストールします
次にモジュールプロジェクトを作成します
新規ファイル作成ウィザードの Module Development 中に "Quick Search Provider"という項目がありますので、これを選択します


Wikipedia の検索なので、以下のように入力し、関連ファイルを作成しています


次に実装を行います
ソースコードは以下のようにしました
(取り敢えず作った感じなので、結構適当です)

public class WikipediaSearchProvider implements SearchProvider {
private static final String GOOGLE_API_KEY = ""; // キーは各自で設定を行って下さい
private static final String GOOGLE_APIS_DOMAIN = "ajax.googleapis.com";
private static final String JA_WIKIPEDIA_DOMAIN = "ja.wikipedia.org";
private static final String GOOGLE_SEARCH_SERVICE_PARAMS = "?v=1.0&rsz=small&key=" + GOOGLE_API_KEY + "&q=site%3a" + JA_WIKIPEDIA_DOMAIN + "%20";
private static final String GOOGLE_SEARCH_SERVICE_URL = "http://" + GOOGLE_APIS_DOMAIN + "/ajax/services/search/web" + GOOGLE_SEARCH_SERVICE_PARAMS;
private static final String HTTP_REFERER_URL = "http://snakemanshow.blogspot.com";

/**
* Method is called by infrastructure when search operation was requested.
* Implementors should evaluate given request and fill response object with
* apropriate results
*
* @param request Search request object that contains information what to search for
* @param response Search response object that stores search results. Note that it's important to react to return value of SearchResponse.addResult(...) method and stop computation if false value is returned.
*/
public void evaluate(SearchRequest request, SearchResponse response) {
try {
URL url = new URL(GOOGLE_SEARCH_SERVICE_URL + URLEncoder.encode(request.getText(), "UTF-8"));
URLConnection conn = url.openConnection();
conn.setRequestProperty("Referer", HTTP_REFERER_URL);

JSON json = new JSON();
HttpResponse httpResponse = json.parse(conn.getInputStream(), HttpResponse.class);
List results = httpResponse.getResponseData().getResults();

if(results != null) {
for(GwebSearch search : results) {
if(!response.addResult(new OpenFoundArticle(search.getUnescapedUrl()), search.getTitleNoFormatting()));
}
}
} catch (IOException e) {
Exceptions.printStackTrace(e);
}
}

private static class OpenFoundArticle implements Runnable {

private String article;

public OpenFoundArticle(String article) {
this.article = article;
}

public void run() {
try {
URLDisplayer.getDefault().showURL(new URL(article));
} catch (MalformedURLException e) {
Exceptions.printStackTrace(e);
}
}
}
}

NetBeans API は 作成時に追加される Quick Search API 以外に UI Utilities API、 Utilities API を追加しており、 JSON のパースには JSONIC を使用しています
(JSONIC は依存パッケージもなく、使用方法も直感的とすばらしいライブラリです)

実行すると、以下のように Wikipedia から関連記事のタイトルを表示します


もちろん、日本語でも検索できます


NetBeans ソースコード検索用のモジュールを作成すると、ソースコードリーディングが楽になっていいかも…