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を使うか、堂々レジストレーション
してください。もちろん後者ですよね。はい。

ではでは。