2011年11月20日日曜日

2011年3月20日日曜日

[java][swing][netbeans] GUIフレームワークを探していてハッと

こんにちは

Swing API を使ってNetBeans IDE みたいなアプリケーションを作りたいけど、
  • いちからSwingレベルでゴリゴリするのも飽きたし、手間だし
  • 将来のエクステンションの差込口のデザインも面倒だし、
  • GUIのクラス設計って悩ましいわりに良さが出にくいし、
  • 先人の教えと成果物に全面的に頼りたいもんだわ。
そんな僕はNetBeans プラットフォームで作ればいいんじゃ。
以前、Eclipse RCP で一本作ったことがあるけど、あれと
ノリ一緒なんじゃ。
そこでNetBeans プラットフォームで作られたプロダクトを眺めてみます。

NetBeans Platform Showcase(英語)
http://netbeans.org/features/platform/showcase.html

そうそう、こういうのを作りたいわけです。

NetBeans プラットフォーム(日本語)
http://netbeans.org/features/platform/index_ja.html

Eclipse RCP にしない理由
  • Swing(つうかPure Java )にこだわってみた
  • GUIビルダのことがスキダカラー(ナレテルカラー)
  • Java Web Start としてまとめあげるのが面倒くさそうな予感(あるいは無理か)
TODO
  • Java Web Start で起動できるかな。
  • 開発環境の準備に色々ダウンロードできない職場なんだけど、大丈夫だろうか。
  • アプリケーションのサイズが大きくなりすぎないだろうか。
  • 他のプログラマにとって天国だろうか地獄だろうか。学習コストの評価。
  • NetBeans のバージョンにものすごく左右されるんだろうか。
    6.8で始めちゃうけど。

ではまた。

2011年3月6日日曜日

先人の教え - UNIX哲学

UNIX哲学 - Wikipedia
http://ja.wikipedia.org/wiki/UNIX%E5%93%B2%E5%AD%A6

UNIX哲学とは、ソフトウェア開発に関する文化的な規範と哲学的アプローチのまとまりであり、
UNIX OSの先駆的な開発者たちの経験に基づいている。

週末に目を通して、デトックスするようにしています。たまに忘れます。
UNIXに限らず、あらゆる場面で有効な(というか必須な)デザインパターンだと思います。
自分の経験に照らしても、一個一個が「だよね」連発です。
どうして時代も地域も対象領域も違うのに、こんなに共感できるの、ってぐらい。

日曜日にこれを読むと、自分がそう間違っていない気持ちになれます。
そして木曜日にはほぼ見失い、この逆の発想の信者になっています。
それが現実だからこそ、こういったものが尊ばれるわけですが。

2011年2月27日日曜日

[ant][dtd][macrodef] antstructureタスクを例としたantをforkするマクロ

Antのantstructureタスクは、ビルドファイルで使える要素と属性を定義する
DTDを生成してくれます。
ですが、ヒトクセあるこのタスクは、実行時に外部のjarが必要で、Ant実行時に
クラスパスに追加してやる必要があるのです。そこで、こんな試み。
  1. 必要なjarをダウンロードする。
  2. 配布元にはMavenのリポジトリを使う。
  3. ダウンロードしたjarをクラスパスに追加して、別のvmでAntを走らせる。
  4. そこでantstructureタスクを使う。
javaタスクのforkをantタスクでやる感じです。antでforkする感じ。antfork?みたいな?


---
<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." default="default" 
  xmlns:tomorrowscode="http://tomorrowscode.blogspot.com/">


  <target name="default" depends="init">
    <!--
    AntのDTDを生成します。
    antstructureタスクに必要なライブラリをMavenリポジトリからダウンロードします。
    ダウンロードしたライブラリを別のVMのクラスパスを加えて処理します。
    -->
    <tomorrowscode:antfork target="invoke-antstructure"
      classpath="${lib.dir}/commons-net-2.2-ftp.jar"/>
  </target>


  <macrodef name="antfork" uri="http://tomorrowscode.blogspot.com/">
    <!--
    このマクロは、ビルドファイルを別のVM上で実行するタスクを定義します。


    JavaからAntを起動する方法は、ここが参考になります。
    http://ant.apache.org/manual/running.html#viajava
    Antの組み込みプロパティの説明は、ここが参考になります。
    http://ant.apache.org/manual/properties.html
    -->
    <attribute name="basedir" default="${basedir}" description="Optional"/>
    <attribute name="target" default="NOT SET" description="Required"/>
    <attribute name="antfile" default="${ant.file}" description="Optional"/>
    <attribute name="classpath" description="Optional"/>
    <sequential>
      <java  classname="org.apache.tools.ant.launch.Launcher"
        fork="true" failonerror="true"
        classpath="${ant.core.lib}/../ant-launcher.jar;@{classpath}">
        <arg value="-f"/>
        <arg file="@{antfile}"/>
        <arg value="-Dbasedir=@{basedir}"/>
        <arg value="@{target}"/>
      </java>
    </sequential>
  </macrodef>


  <target name="init">
    <!--
    Mavenリポジトリから必要なjarファイルをダウンロードします。
    jarの場所は、http://mvnrepository.com/ から検索できます。
    -->
    <property name="lib.dir" location="lib"/>
    <mkdir dir="${lib.dir}"/>
    <get
      src="http://repo1.maven.org/maven2/commons-net/commons-net/2.2/commons-net-2.2-ftp.jar"
      dest="${lib.dir}" usetimestamp="true"/>
  </target>


  <target name="invoke-antstructure">
    <!--
    AntのDTDを生成します。クラスパスにcommons-netが必要です。
    -->
    <antstructure output="ant.dtd"/>
  </target>
</project>
---


リポジトリにもコミります。リポジトリからブラウズした方が読みやすいです。
ではでは。

---
追加 2011-3-25
依存するライブラリcommons-net を取得するのに、上ではgetタスクを使いましたけど、
Maven Ant Tasks を使えばもっとステキにできそうです。
http://maven.apache.org/ant-tasks/index.html

2011年2月6日日曜日

[postgresql] PostgreSQL 8.4.7 Windows Installer のダウンロード

PostgreSQL 8.4.7 Windows Installer のパッケージを
レジストレーションをすっとばして最速で落とすリンクはこちら。

http://get.enterprisedb.com/postgresql/postgresql-8.4.7-1-windows.exe

いきなりダウンロードが始まりますから、そのつもりで。
以下に説明するまっとうな手順できちんとレジストレーションすれば
期待通りのものが手に入ります。

正しい(そして長い長い)操作手順
----------------------------------------
本家ポスグレでここまではたどりつくと思います。

PostgreSQL 》Downloads 》Windows packages
http://www.postgresql.org/download/windows

ここで Download the one click installer をクリック。
すると後述する面倒なサイトに飛びます。

EnterpriseDB 》Download PostgreSQL
http://www.enterprisedb.com/products-services-training/pgdownload#windows

Installer version Version 8.4.7 の WINDOWS をクリック。
ちなみにこのページはサイトのトップからはたどれないらしい。
ちょっとした隠しページ。細かく調べていませんが、見つからなかった。

User Login/Registration に飛びます。
ここであなたの貴重な個人情報を入力して送信してください。
パスワードが発行されてメールが届きます。
すぐにログインしてパスワードを変更した方がいいですね。
マイページっぽいページに↓を見ることができたらラッキー。

You have successfully logged in, click here to access your requested page.

"click here"をクリックしてください。ページが遷移して
ダウンロードが始まります。"click here"が出てこない場合は、
ログインした状態でここからやり直してください。

EnterpriseDB 》Download PostgreSQL
http://www.enterprisedb.com/products-services-training/pgdownload#windows

想像ですけど、以前は本家ポスグレから自由にダウンロードさせていたが、
なんかレジストレーションさせたくなっちゃったと。
でも、本家にそんな仕組みがないので、EnterpriseDBにそこを頼んだ。
一方そこはそこで自分らの有償製品(及び評価版)をダウンロードする
画面遷移しかなかった。なので少々強引に流れを作った。のかな。

私の経験した謎の現象
----------------------------------------
以前ダウンロードした(あるいはしかけた)ファイルのダウンロードが、
全然関係のないタイミングで始まってしまう。
8.4.7が欲しいのに、しかもレジストレーションしていないのに8.3.14が
落ちてきたり、知らないもの(チュートリアル用のパッケージとか)が
落ちてきたりする。
こんなときは上のショートカットURLを使うか、堂々レジストレーション
してください。もちろん後者ですよね。はい。

ではでは。

2011年1月15日土曜日

[netbeans][maven] 恐る恐るのmaven体験

mavenを使えない現場で、Javaプロジェクトのディレクトリ構造を
mavenライクにしてやって来ましたが、リアルmavenを使って
ハッとしたことのメモ。

発端
--------------------------------------------------
Antの<script>タスクを調べていました。<script>タスクは、
AntでAnt以外のスクリプトを書けるようにするやつ。
JavaScript以外の言語を特に何も調達せずに使えるかなと。
beanshellってのが使えるとAntの中にJavaを書けていいなと。

BeanShell
http://www.beanshell.org/

<script>タスクはant-apache-bsf.jarが実体なので、それをAntのlibで探していたら、
ant-apache-bsf.jar の隣に ant-apache-bsf.pom があるじゃないですか。

Antがmavenで作られていた!?

類似
・タワーレコードの店員がAmazonで実は買っている。
・エコカーの開発者がガソリン車で通勤している。

mavenってWEB-INFとか出て来るWebアプリケーションの開発の
イメージ(勝手な)がありました。そうではないらしい。使ってみますかさっそく。

調達と設定
--------------------------------------------------
NetBeans 6.9.1
Apache Maven 3.0.2

NetBeans ≫ ツール ≫ オプション ≫ Maven
外部 Maven ホーム:J:\Program Files\apache-maven-3.0.2
ローカルリポジトリ:J:\java\repository

※Cドライブに空きがないので。

プロジェクトを作る
--------------------------------------------------
NetBeans ≫ ファイル ≫ 新規プロジェクト ≫ Maven ≫ Mavenプロジェクト

Maven原型:Mavenクイックスタート原型(1.0)

あとは適当に。。

デフォルトでいきなり困ったこと
--------------------------------------------------
・コンパイルのレベルが1.3だった。
プロジェクトプロパティ ≫ ソース
ソース/バイナリ形式:1.6

・JUnitが3系でできあがっちゃった。
pomを書き換え。
---
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.8.2</version>
    <scope>test</scope>
  </dependency>
---

いまさら知ったこと(ぽかーん)
--------------------------------------------------
・必要なライブラリが勝手にダウンロードされるのは知っていたけど、
mavenのプラグインも同じく。そこは意識できていないから
ネットからクローズした自社リポジトリを作るのは難易度高そう。

・今までプロパティファイルをデフォルトパッケージに置いていたけど違った。
×:src/main/java/log4j.properties
○:src/main/resources/log4j.properties
確かにプロパティファイルはJavaではないです。

・targetディレクトリがsvn無視だった。コミット対象外。

・targetディレクトリにclassesとtest-classesが出来ていた。
binじゃないのね。

・targetディレクトリにビルドしたjarが置かれていた。
distじゃないのね。

・ローカルリポジトリにjarやらpomやら一式がコピーされていた。
そっか。他のプロジェクトが参照するjarになり得るものね。
targetがsvn無視なのは、こういうことか。

・ビルドしたらテストケースが動いた。テストスィート書いてないのに。
これうれしい。

・ビルドするjarの名前はpomに記述した情報から自動的に付けられる。
プロジェクト名.jar ではない。これうれしい。今はリネームしている。

・pomにバージョンを書ける。これうれしい。
今はインストーラを作るAntに書いている。

・pomもリリース対象。これうれしい。
このjar何モノ?ってね。情報が欲しい。依存ライブラリとかバージョンとか。



※ファイル名・ディレクトリ名がグレーなヤツがsvn無視です。
※nb-configuration.xmlを無視にしたのは私。IDE依存な情報なので除外に。

1時間ぐらいだったけどすんごい勉強になりました。
ではまた。

[java][log] 使うか使わないかcommons-logging

自分には log4j-1.2.x がデファクトで、コード中でしっかりimportしています。
が、それはいかがなものかというコンセプトの commons-logging を使ってみました。
commons-loggingを使うと、どうもこういうことらしい。
  • Loggerの実装(例えばlog4j)の選択を後回しにして、でもアプリケーションの実装には着手できます。
  • プロパティファイルの変更(など)だけで、Loggerの実装を変更できます。
こんなシチュエーションに一度も遭遇したことがないけれど。
自分のPCを探してみると結構 commons-logging は使われていました。
(正確に言うと同梱していました。)
  • Oxygen XML Editor
  • DITA Open Toolkit
  • Ant
やっぱり一枚挟んでおくのが礼儀ですか。

◆Javaコード:App.java
-----------------------------
package com.hisagisoft.tomorrowscode.logger;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class App {
  private static final Log log = LogFactory.getLog(App.class);

  public static void main( String[] args ){
    log.info("this is log.");
    System.out.println( "Hello World!" );
  }
}
-----------------------------

◆プロパティファイル:commons-logging.properties
-----------------------------
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
-----------------------------

◆プロパティファイル:log4j.properties
-----------------------------
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c(%L) - %m%n

log4j.appender.null=org.apache.log4j.varia.NullAppender

log4j.rootLogger=debug, null
log4j.logger.com.hisagisoft=debug, stdout
-----------------------------

◆これらの配置



























◆実行(NetBeans上で、です)
------------------------------
run:
2011-01-15 20:41:30,062 [main] INFO  com.hisagisoft.tomorrowscode.logger.App(15) - this is log.
Hello World!
構築成功 (合計時間: 0 秒)
------------------------------


◆結論
手に入るときは使うようにします。

ではまた。