2009年9月24日木曜日

groovy の eachWithIndex

前々回のエントリについて、上司からダメ出しをもらう。

「kanemu の poi のコード、なんで for 使ってんの?each 使えばいいじゃん」
自分しばし考え
「 i と j が使いたかったんですよ」
「index が欲しかったってこと?じゃあ eachWithIndex は?」
「???」
groovy-jdk を確認すると、eachほにゃららってメソッドがあるわあるわ…。
ためしにgroovyconsoleで
def myVal=[
["あああ","いいい","ううう"],
["かかか","ききき","くくく"],
["さささ","ししし","すすす"]
]

myVal.eachWithIndex{v,i->
println "${i} => ${v}";
v.eachWithIndex{vv,ii->
println "------ ${ii} => ${vv}";
}
}
0 => [あああ, いいい, ううう]
------ 0 => あああ
------ 1 => いいい
------ 2 => ううう
1 => [かかか, ききき, くくく]
------ 0 => かかか
------ 1 => ききき
------ 2 => くくく
2 => [さささ, ししし, すすす]
------ 0 => さささ
------ 1 => ししし
------ 2 => すすす
ははあ、なるほど。
ということは先日のコードは、
import org.apache.poi.hssf.usermodel.*;

def myVal=[
["あああ","いいい","ううう"],
["かかか","ききき","くくく"],
["さささ","ししし","すすす"]
]

//新規ワークブック作成
HSSFWorkbook myWb = new HSSFWorkbook();
//新規シート作成
HSSFSheet mySheet = myWb.createSheet();

myVal.eachWithIndex{v,i ->
//新規行作成
HSSFRow myRow = mySheet.createRow(i);
v.eachWithIndex{vv,ii ->
//新規セル作成
HSSFCell myCel = myRow.createCell((short)ii);
myCel.setEncoding(HSSFCell.ENCODING_UTF_16);
myCel.setCellValue(vv);
}
}
//作成したワークブックを保存する
new File("Test.xls").withOutputStream{myWb.write(it)}
ですね。

2009年9月23日水曜日

TermHere.app を iTermに対応させる。


「TermHere」というAppleScriptアプリが配布されている。
Mac OS X Finder Toolbar Scripts for Textmate, Terminal, and Touch. - Manas Tungare

Finderのツールバーに登録しておけば、開いているフォルダのディレクトリをターミナルで開いてくれる便利なスクリプトなのだが、残念ながら自分がふだん使用しているのはiTerm

なんとなくパッケージの中身を開いてみたら、"Public Domain" と書いてあったので、自分でちょっといじってみた。
  1. まず、上記からTerminalのところをダウンロード
  2. TerminalHere.dmg を開き、中のTermHere.appをコピー
  3. 右クリック「パッケージの内容を表示」で開く
  4. /Contents/Resources/Scripts/main.scpt をスクリプトエディタで開いて編集。
    tell application "Finder"
    set thisFolder to (target of front window) as Unicode text
    set posixPath to quoted form of POSIX path of thisFolder
    end tell

    tell application "iTerm"
    activate
    if (count current terminal) is 0 then
    set myterm to (make new terminal)
    tell myterm
    launch session "Default"
    end tell
    end if
    tell the current session of the current terminal
    write text "cd " & posixPath
    end tell
    end tell
  5. そのまま保存。
  6. 見た目も気にするなら、/Contents/Resources/termhere.icns を iTermのものと入れ替える。

あとは説明書どおりにFinderのツールバーに登録しておけばよい。

2010.07.04追記:
このエントリ久しぶりに見て「これって単にAppleScript書いてるだけじゃん!」と気づいた。
要はアプリケーションバンドルにして保存すればよい。
  1. スクリプトエディタ.appを起動し、上記スクリプトをペースト
  2. アプリケーションバンドルとして保存


これでOK。アイコンの変更は上記を参考に。

2009年9月14日月曜日

groovyとpoiでExcelファイルを出力する

poi は java から Microsoft Office ファイルを扱うライブラリ。これでエクセルファイルを作ってみる。
環境はMacBook(CoreDuo)、MacOSX10.5.8、java v1.5.0_19、groovy v1.6.4。

まず、poiのbinファイルをこちらから入手する。
今回は、poi-bin-3.0-FINAL-20070503.zip をダウンロードした。
解凍して、poi-3.0-rc4-20070503.jar を ~/.groovy/lib/ の中に入れて準備完了。

以下コード。
import org.apache.poi.hssf.usermodel.*;

def myVal=[
["あああ","いいい","ううう"],
["かかか","ききき","くくく"],
["さささ","ししし","すすす"]
]

//新規ワークブック作成
HSSFWorkbook myWb = new HSSFWorkbook();
//新規シート作成
HSSFSheet mySheet = myWb.createSheet();

for(i in 0..<myVal.size){
//新規行作成
HSSFRow myRow = mySheet.createRow(i);
for(j in 0..<myVal[i].size){
//新規セル作成
HSSFCell myCel = myRow.createCell((short)j);
myCel.setEncoding(HSSFCell.ENCODING_UTF_16);
myCel.setCellValue(myVal[i][j]);
}
};

//作成したワークブックを保存する
new File("Test.xls").withOutputStream{myWb.write(it)}

poi.groovy として保存、保存したディレクトリに移動して
groovy poi.groovy
でエクセルファイルができた。簡単。

2009年9月4日金曜日

拡張子を切る

「ファイル名はそのままで拡張子だけ変えたテキストを作りたい」とか、「ファイル名の後ろに"_copy"とつけて別名保存」とかの時に使う。自分コピペ用。
function cutEx(path){
//拡張子を切る
var pathTxt=path, exText="";
var dirCutNo=( (/\//.test(path))? path.lastIndexOf("/") : 0 );
if(/\./.test(path.slice(dirCutNo))){
pathTxt=path.slice(0, path.lastIndexOf("."));
exText=path.slice(path.lastIndexOf("."));
};
return [pathTxt,exText];
};

var filePath="aaa/zasshi.indd";
alert("拡張子: "+cutEx(filePath)[1]+"\nファイルパス: "+cutEx(filePath)[0]);


2010.12.12追記:
この記事で何をしたかったのか思い出し中。
拡張子の前に.のあるファイル名でも、パスより前に.があっても拡張子を取りたくて、あるいは拡張子がなくってもそのパスだけ欲しかったってことか。
今ならこう書く。
function cutEx(path){
return path.split(/(\.[^\.\/]+)$/);
};

var cutPath;
cutPath=cutEx("a.aa/za.sshi.indd")
alert("拡張子: "+cutPath[1]+"\nファイルパス: "+cutPath[0]);

var cutPath;
cutPath=cutEx("/a.aa/zasshi")
alert("拡張子: "+cutPath[1]+"\nファイルパス: "+cutPath[0]);

var cutPath;
cutPath=cutEx("a.aa/za.sshi.txt")
alert("拡張子: "+cutPath[1]+"\nファイルパス: "+cutPath[0]);