Friday, October 13, 2006

erc

Emacs IRC Clientの略です。
インストールしてみました。

http://www.emacswiki.org/cgi-bin/wiki/ERC

いまだにjoinとquitぐらいしか知りません。
使いこなしたいな。

Saturday, August 12, 2006

消える例外?

Java、Web、Struts(1.0.2)の話です。

Struts(1.0.2)をフレームワークとして使用したWebアプリケーションで
例外が発生するがその原因がわからない、という事がありました。

ソースコードを見ると、Strutsが呼び出したクラスで例外が発生した場合、
Struts側は、それをStrutsの例外として投げ直すのですが、
そのStrutsの例外クラスは、元の例外をラップしていないようです。
元の例外はページコンテキストにセットされるようです。

jakarta-struts-1.0.2-src/src/share/org/apache/struts/util/RequestUtils.java
の517行目付近


// Locate and return the specified property
try {
return (PropertyUtils.getProperty(bean, property));
} catch (IllegalAccessException e) {
saveException(pageContext, e);
throw new JspException
(messages.getMessage("lookup.access", property, name));
} catch (InvocationTargetException e) {
Throwable t = e.getTargetException();
if (t == null)
t = e;
saveException(pageContext, t);
throw new JspException
(messages.getMessage("lookup.target", property, name));
} catch (NoSuchMethodException e) {
saveException(pageContext, e);
throw new JspException
(messages.getMessage("lookup.method", property, name));
}

}


jakarta-struts-1.0.2-src/src/share/org/apache/struts/util/RequestUtils.java
の916行目付近


/**
* Save the specified exception as a request attribute for later use.
*
* @param pageContext The PageContext for the current page
* @param exception The exception to be saved
*/
public static void saveException(PageContext pageContext,
Throwable exception) {

pageContext.setAttribute(Action.EXCEPTION_KEY, exception,
PageContext.REQUEST_SCOPE);

}



こういうのもあって、なかなか大元の例外が見つからなくて、ちょっとはまりました。

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のフォントが化けてる。

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