顯示具有 debug 標籤的文章。 顯示所有文章
顯示具有 debug 標籤的文章。 顯示所有文章

2020年8月10日 星期一

SpriteOverEvent 之靈異現象

重現方式

直接上 SSCCE:

public class SpriteTestEP extends DrawComponent implements EntryPoint {
	private RectangleSprite red = new RectangleSprite(200, 201, 100, 50);
	private RectangleSprite none = new RectangleSprite(200, 201, 300, 50);

	public SpriteTestEP() {
		red.setFill(RGB.RED);
		none.setFill(Color.NONE);

		addSprite(red);
		addSprite(none);

		addSpriteOverHandler(new SpriteOverHandler() {
			@Override
			public void onSpriteOver(SpriteOverEvent event) {
				log("Over : " + who(event.getSprite()));
			}
		});
		addSpriteOutHandler(new SpriteOutHandler() {
			@Override
			public void onSpriteLeave(SpriteOutEvent event) {
				log("Out : " + who(event.getSprite()));
			}
		});
	}

	private String who(Sprite sprite) {
		return (sprite == red ? "red" : "none");
	}

	public static native void log(Object object) /*-{
		console.log(
			@java.lang.String::valueOf(Ljava/lang/Object;)(object)
		);
	}-*/;

	@Override
	public void onModuleLoad() {
		//無關緊要,純粹 follow GXT 習慣  XD
		Viewport vp = new Viewport();
		vp.add(this);
		RootPanel.get().add(vp);
	}
}

操作步驟:

  1. 游標進入紅色區塊
  2. 慢慢水平移動滑鼠,直到離開紅色區塊

2012年5月4日 星期五

Hibernate + HSQLDB 炸裂

測試環境:Hibernate 4.1.2、HSQLDB 2.2.8、Java 1.6

抓了兩個 H 的最新版,結果前後炸了四五個小時才能開始塞資料。茲紀錄如下。

大抵上是參考 《Hibernate 學習筆記》 (中文嘛...... [毆飛]),只不過 database 改成用 HSQLDB Server 版。

第一個遇到的問題是:只要一作 session.beginTransaction(),Hibernate 就會炸「No suitable driver found for jdbc:hsqldb:hsql://localhost/DBNAME」,最後找到的解法是在建立 Configuration 之前就先執行「Class.forName("org.hsqldb.jdbc.JDBCDriver")」。(參考資料:Hibernate forum

順便補一下,似乎在 Hibernate 4 以後 Configuration.buildSessionFactory() 就被 deprecated 掉,不過(到目前為止)使用起來還是正常。至於標準寫法我沒研究,可參見 stackoverflow

第二個遇到的問題是 session.save() 時 HSQLDB 會炸「user lacks privilege or object not found」,據說如果用 Hibernate 3.6 跟 HSQLDB 1.8 就不會有這種困擾...... Orz。這篇提到要將 Hibernate 的 hibernate.hbm2ddl.auto 設定為 create,實際上要設定成 update。參數之間差別如下:(參考資料:Hibernate reference
  • create:系統 init 時會作檢查 table 是否存在,有的話就會 drop 掉重建。
  • validate:只有在 table 存在時,系統才能正常 init。
  • update:理想狀況,init 時沒 table 會建,有 table 就續用。(不過如果系統運作中有外力 drop table,則會出錯)

做了這些手腳之後,目前 save() 之後東西都會乖乖進資料庫了。於是又寫一篇可能沒多久之後就沒意義的 debug / 教學文...... 軟體業阿...... [遠目]

2012年1月6日 星期五

更改 gwt.xml 需 refresh 兩次才見效

測試環境:GWT 2.4.0、Eclipse 3.7、GPE 2.5、GWT Developer Plugin 1.0.9738(Chrome)

今天輾轉發現 gwt.xml 導致的奇妙問題:
在 Development Mode 下,修改 gwt.xml 的內容,browser 第一次 refresh 依然保持原設定,第二次 refresh 才會呈現修改後的結果。
已知會造成這個現象的是 <stylesheet> 以及 theme 的 <inherits>。<entry-point> 不會有這個問題,其餘未測。

由此延伸出這些測試:
  • 如果單純修改 <stylesheet> 的 CSS 檔案、在第一次 refresh 就會呈現修改結果。
  • 以 Chrome Developer Tools 觀察:<stylesheet> 的 CSS 檔案以及 theme 對應的 CSS 檔案,都是由 foo.nocache.js 所呼叫
  • 修改 client 下的 .java 檔,在第一次 refresh 就會呈現修改結果......
最大的爆點還是在於為甚麼是「第二次」呢?需要重開 Development Mode 之類的行為才會正確,還比較合邏輯些?GWT 的 code server 到底做了什麼啊啊啊啊....... <囧>

ps. 雖然有點多餘,不過 Mac 跟 Windows XP 的測試結果一樣......