Saturday, July 29, 2006

タイムキーパー

教育講座の補助で、講師の同僚に時間を伝えようと、
テキストに"あと何分です。"とか書いて、それを
ノートパソコンで見えるようにしていました。

これを自動化できないかと思い、groovyスクリプトを
書いてみました。


//ここから

//ウィンドウのサイズは自動では最大化しません。
//フォントの大きさはお好みで変更してください。
//動作環境
//Groovy Version: 1.0-jsr-05 JVM: 1.4.2_12-b03

import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.text.*;

if (args.size() < 1) {
System.err.println("Usage timekeeper \"HH:mm\" [fontsize(default is 200)]");
System.exit(1);
}


// time to keep

SimpleDateFormat fmt = new SimpleDateFormat("HH:mm");
GregorianCalendar spcCldr = new GregorianCalendar();
spcCldr.setTime(fmt.parse(args[0]));
GregorianCalendar now = new GregorianCalendar();
now.set(Calendar.HOUR_OF_DAY, spcCldr.get(Calendar.HOUR_OF_DAY));
now.set(Calendar.MINUTE, spcCldr.get(Calendar.MINUTE));
now.set(Calendar.SECOND, 0);
now.set(Calendar.MILLISECOND, 0);
Date time = now.getTime();

// fontsize

int fontsize = 200
if (args.size() == 2) {
fontsize = Integer.parseInt(args[1]);
}

// label
List lList = new ArrayList();
lList.add(new JLabel(""));
lList.add(new JLabel(""));


JFrame f = new JFrame();

class MyWindowAdapter extends WindowAdapter {
public void windowClosing(WindowEvent e) {
e.getSource().getGraphics().dispose();
System.exit(0);
}
}

f.addWindowListener(new MyWindowAdapter() )

f.setSize(800,600);
gb = new GridBagLayout();
f.getContentPane().setLayout(gb);
gc = new GridBagConstraints();
gc.gridwidth = gc.REMAINDER;
gc.gridheight = 1;

for (i in 0..<lList.size()) {
JLabel lbl = (JLabel)lList.get(i);

lbl.setFont(new Font(null,Font.BOLD, fontsize));
gb.setConstraints(lbl, gc);
f.getContentPane().add(lbl);
}
f.setVisible(true);


class MyThread extends Thread {
List lList;
JFrame f;
Date time;
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");

MyThread(List lList, JFrame f, Date time) {
this.lList = lList;
this.f = f;
this.time = time;
}

static final int SIXTY_SECONDS = 60;
static final int ONE_SECOND = 1000;

public void run() {
try {
synchronized(this) {
while(true) {
wait(ONE_SECOND);
int rest = (int)((time.getTime() - System.currentTimeMillis()) / ONE_SECOND);

if (rest < 0 ) {
lList.get(0).setText(sdf.format(time) + "です");
lList.get(1).setText(" ");
} else
if (rest < SIXTY_SECONDS ) {
lList.get(0).setText(sdf.format(time) + "まで");
lList.get(1).setText("あと" + rest + "秒");
} else
if (rest < SIXTY_SECONDS * 20) {
lList.get(0).setText(sdf.format(time) + "まで");
lList.get(1).setText("あと" + ((int)(rest / SIXTY_SECONDS) + 1)+ "分");
} else {
lList.get(0).setText("今は");
lList.get(1).setText(sdf.format(new Date()));
}
f.repaint();
}
}
} catch(Exception e) {
throw new RuntimeException(e);
}

}
};

println "time to keep is " + time;
println "current time is " + new Date();

MyThread t = new MyThread(lList, f, time);

t.start();
//ここまで


このスクリプトを適当にtimekeeper.groovyとかつけて、
"groovy.bat timekeeper.groovy "12:00""
と実行します。フォントを大きくしたい場合は、
"groovy.bat timekeeper.groovy "12:00" 250"
などとします。デフォルトの大きさは200です。




20分以内になると「あと~分」という表示になります。



インナークラスの書き方を調べるのに手間取って(
上のスクリプトではインナークラス使っていません。現状では書けないんでしょうか?
)2時間ぐらいかかりました。

Wednesday, July 12, 2006

Inkscape

Inkscapeが0.44になっていたので、再インストールしてみた。
0.43で作ったSVGのフォントが化けてる。

フォントを指定したら直った。
あぁ、びっくり。