2011/10/03

[groovy] eclipseからGAE/J + gaelykの環境構築する方法

GAE/J + Grails勉強しようと思ったのですが、自分にはまだ敷居が高かったようなので、
いろんなサイトでお手軽と謳われている「Gaelyk」を使ってみました。

まずは、使い慣れているeclipseの環境を整えます。
  • OS:Windows7 64bit
  • eclipse:3.7
  • groovy:1.8.2
  • gaelyk:1.0
  • GAE:1.5.2

1.eclipseにGAEプラグインをインストールする
 ヘルプ->新規ソフトウエアのインストールをクリックします。
 作業対象に、以下URLを入力します。
  http://dl.google.com/eclipse/plugin/3.7

 しばらくすると、対象となるプラグインの一覧が表示されるので、
 「すべて選択」しインストールを開始してください。
 インストール途中でeclipseに「Androidに関するライブラリがあらへんで」って言われたら、
 該当するプラグインの選択を解除してください。
 ※私の環境だと上記のようなメッセージがでました。

2.Groovyプラグインのインストール
 ヘルプ->新規ソフトウエアのインストールをクリックします。
 作業対象に、以下URLを入力します。
  http://dist.springsource.org/release/GRECLIPSE/e3.7/

 しばらくすると、対象となるプラグインの一覧が表示されるので、
 「すべて選択」しインストールを開始してください。

3.Gaelykの入手
 以下より、Gaelykを入手してください。
 http://gaelyk.appspot.com/download

 上記サイトを見るとこんなことかいてますが、気にせず進めます。
 >The latest version was tested with Groovy 1.8.1, and with the 1.5.2 version of the App Engine SDK.
GAE、groovyの最新バージョンではテストされてないようです。

 入手したら適当な場所に解凍します。

4.適当なプロジェクトの作成
 eclipse上で適当なWebアプリを作成します。

 作成が終わったら、3で展開したファイルの[war]直下のファイルすべてを作成したWebアプリのwarフォルダ直下にすべて上書きします。

 Webアプリを起動して、動作確認できたら、とりあえず環境構築はOK(?)

 この後はJDOつかえるか試してみるか。
→こんな感じでお手軽に使える模様。
def entity = new Entity("てーぶる名")
entity.title = "タイトル"
・・・
entity.save()

2011/09/29

[groovy] Grailsを試してみた

ちょっと(かなり?)古い記事を参考にGrailsを試してみました。
http://d.hatena.ne.jp/mottsnite/20090822/1250950657

Grailsを使うと簡単にアプリができるんですね。。。
過去に苦労して携わった開発は何だったんだろうと思うぐらい驚きました。

2011/09/27

[groovy] GExcelAPIを使ってExcelのデータを取得してみた

概要

kimukouさんに教えて頂いた、nobeansさんが開発されたGExcelAPIを使用してExcelのデータを取得してみました。

内容

nobeansさんが作成したサンプルほぼそのままですが、以下コード例です。
import org.jggug.kobo.gexcelapi.GExcel
@GrabResolver(name="kobo-maven-repo", root="https://github.com/kobo/maven-repo/raw/master/release")
@Grab("org.jggug.kobo:gexcelapi:0.2")

class GExcelApiTest {

    void load(String fileName) {

        // Excelファイルを読込む
        def book = GExcel.open(fileName)

        // シートを取得する
        def sheet = book[0]
//        def sheet = book["Sheet1"] // シート名でも取得可能

        // セルの値を取得する
        println sheet.A1.value
        println sheet.A2.value

        println "-"*20
        def dump = { cell -> println "${cell.label}: ${cell.value} - ${cell.cellType}" }
        sheet.A_.each{ cell -> dump cell }
        println "-"*20
        sheet.B_.each{ cell -> dump cell }
        println "-"*20
        sheet._1.each{ cell -> dump cell }
        println "-"*20
        sheet._2.each{ cell -> dump cell }
        println "-"*20
        sheet.A1_B6.each{ row -> row.each { cell -> dump cell } }
    }
}
実行結果
123.0
水曜日
--------------------
A1: 123.0 - 0
A2: 水曜日 - 1
A3: true - 4
A4: 40808.0 - 0
A5:   - 1
A6: 1+1 - 2
--------------------
B1: null - 3
B2: null - 3
B3: null - 3
B4: null - 3
B5: null - 3
B6: null - 3
--------------------
A1: 123.0 - 0
B1: null - 3
C1: null - 3
D1: null - 3
--------------------
A2: 水曜日 - 1
B2: null - 3
--------------------
A1: 123.0 - 0
B1: null - 3
A2: 水曜日 - 1
B2: null - 3
A3: true - 4
B3: null - 3
A4: 40808.0 - 0
B4: null - 3
A5:   - 1
B5: null - 3
A6: 1+1 - 2
B6: null - 3
様々なイテレーターが用意されており、簡単にセルの値を取得することができました。

cell.valueで簡単にセルの値を取れます。
POIでやると、セルタイプに沿ったメソッドを実行して値を取らなきゃいけなかったり、
煩雑な部分が多かったですが、こちらは非常にシンプルで使いやすいです。

Excelデータの中身をさらしてはいませんが、実行結果のA4セルには日付を設定しています。
日付を出力して欲しかったのですが、数値が表示されました。
日付が取得できなかったのは少し残念ですが、非常に強力かつ便利なAPIなので今後も使っていきたいです。

これを使って、Excelから情報をDTOに格納し、テンプレートエンジンを使ってソースコードを自動生成するようなスクリプトでも書いてみようと思います。

2011/09/21

[groovy] POIでExcelのセルの値を取得してみた

概要

GroovyからApache POIを使用してExcelのデータを読んでみました。
Excel持ってないので、OpenOfficeで作成したExcelデータですが。。。

内容

groovyでPOIを使用してセルのデータを読むコードをこんな感じで書いてみました。
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

class POIUtils {
    static def getCellValue(Sheet sheet, rowNum, colNum) {

        // nullセーフナビゲーションを使用してセルにアクセスする
        Cell cellObj = sheet?.getRow(rowNum)?.getCell(colNum)
        switch (cellObj) {
        case null:
            ""
            break;
        default:
            switch (cellObj.cellType) {
            case Cell.CELL_TYPE_NUMERIC:
                if (DateUtil.isCellDateFormatted(cellObj)) {
                    cellObj.getDateCellValue()
                } else {
                    cellObj.getNumericCellValue()
                }
                break;
            case Cell.CELL_TYPE_BLANK:
                ""
                break;
            case Cell.CELL_TYPE_BOOLEAN:
                cellObj.getBooleanCellValue()
                break;
            case Cell.CELL_TYPE_ERROR:
                ""
                break;
            case Cell.CELL_TYPE_FORMULA:
                cellObj.getCellFormula()
                break;
            case Cell.CELL_TYPE_STRING:
                cellObj.getStringCellValue()
                break;
            }
        }
    }
}

上記を呼び出すソースは以下。
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

class Startup {
    static void main(args) {

        // ローンパターンを使用し、ストリーム使用後に安全にクローズする
        new FileInputStream("./resources/test.xls").withStream {fis ->
            Sheet sheet = WorkbookFactory.create(fis).getSheetAt(0)

            println(POIUtils.getCellValue(sheet, 0, 0));

            // groovy版のループを使用し、1行目から10行目までのセルの値を書き出す
            // TODO クロージャ内でfor文が使えない!!!
            // なぜかorg.codehaus.groovy.control.MultipleCompilationErrorsExceptionが発生。。。
            for (def i in 0..<10) {
                println(i.toString())
            }
        }
    }
}
上記ソース上のコメントにも書きましたが、クロージャ内でfor文を書くと org.codehaus.groovy.control.MultipleCompilationErrorsExceptionが発生しました。 なんで???意味不明です。書き方が悪いのかな。 もう少し調査します。 あと、POIUtilsの部分ももっと(?)groovyチックに書きたいです。 徐々に勉強しながらカスタマイズしていこう。 2011/09/22追記 クロージャ内のfor文はうまくいかなかったですが、以下のようにループを書いてやるとうまくいきました。 原因は不明です。
//            for (def i in 0..<10) {
//                println(i.toString())
//            }
            10.times {
                println(POIUtils.getCellValue(sheet, it, 0));
            }
           for (int i = 0; i < 10; i++) {
                println(POIUtils.getCellValue(sheet, i, 0))
            }

クロージャ内の制御文は失敗する仕様なのかも知れない。。。
原因分かればまた追記します。

ただ単に構文ミスってようです。
これで動作しました。

2011/09/16

[groovy] groovyの勉強開始

最近ある問題を解決するために、色々調査していたらこの言語に出会った。
勉強を始めると面白い。

もっと深く勉強したいので、以下を購入してみた。
早く届かないかなぁ。



しばらくは、groovyを中心にブログを書こうと思う。

2011/09/15

[Java] Swing:JTableのセルにComboBoxを設定する方法

概要

JTableのセルにComboBoxを設定する方法を調査したので、説明します。

内容

以下のようにテーブル列のセルエディターに対して、生成済のコンボボックスを引数としたDefaultCellEditorを設定してあげれば、テーブルのセルにコンボボックスを設定することができます。
jTable1.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(cmb_cell1));

これがお手軽で簡単です。
その他の方法としては、CellEdirotを実装したクラスを独自実装し、やる方法があります。

2011/09/13

[Java] swing:jtableのセルをチェックボックスに変更する方法

概要

NetBeansを使えばJTableのセルを簡単にチェックボックスに変更できます。

内容

セルの型をBooleanに変えれば、表示がチェックボックスに変わります。
Booleanにしたら、内部的にエディター、レンダラーがJCheckBoxに変わるのかな。