2022年4月1日 星期五

StarPocks 0.0.1 Released

StarPocks 是一個將 Java class(們)自動轉換成 Mermaid.js class diagram 語法的工具。

0.0.1 版提供了下列功能:

  • 將 class 轉換成 Mermaid.js 語法
    • 顯示 public field / method(含 static)
    • 以 stereotype 顯示是否為 interface / abstract class
  • 顯示 class 的 hierarchy,並呈現 class 之間的 implement / extend 關係
  • 可指定轉換多個 class
  • 自動排除 class 名稱相同造成的 Mermaid.js 語法衝突問題

2022年2月19日 星期六

Mermaid.js Class Diagram 語法重點

備註:若後續有改動,此文件不會再更新,請改參考此文件

分為兩個部份:「class 定義」、「class 間的關係」。

由於 generic type 的定義哏(後敘),
先寫「class 定義」再寫「class 間的關係」比較保險。

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. 慢慢水平移動滑鼠,直到離開紅色區塊

2020年7月2日 星期四

JDK 15 的新功能

原文網址:https://www.infoworld.com/article/3534133/jdk-15-the-new-features-in-java-15.html

Java Development Kit 15 是 Java SE 的下個版本,Oracle 的實做在 6/11 進入到初期的 ramp-down phase,該版本的功能集已經定型了。JDK 15 的亮點包含 text block、hidden class、foreign memory 存取 API 以及 sealed class、record 的 preview 版本。

Java upgrade 也進入到 ramp-down phase,兩個候選版本會在 8/20 之前釋出。general availability 會在 9/15。JDK 15 的前身是 3/17 發布的 JDK 14。Oracle 在 Java SE 保持著 6 個月發布一次新版的步調,每年會有兩個新的版本問世。

OpenJDK 15 的新功能與改變:

  • 第二個 foreign memory 存取 API 的孵化版本,這可以讓 Java 程式安全且有效率地存取 Java heap 以外的 foreign memory。API 可以操作數種不同的 foreign memory,像是 native、persistent、managed heap。許多 Java 程式會存取 foreign memory,像是 Ignite、MapDB。這個 API 會協助避免產生與 garbage collection、跨 process 的 share memory、將檔案對應至記憶體的序列化… 相關的成本與不確定性。目前的 Java API 沒有提供令人滿意的 foreign memory 存取方法。但在新的提案當中,API 應該也不會損害到 JVM 的安全性。這個功能在 JDK 14 當中完成了早期孵化板,在 JDK 15 當中提供的是精鍊過的版本。
  • sealed class 的 preview 版本。除了 interface,sealed class 限制其他 class 或 interface 如何繼承或實做 sealed class 的方式。這個功能的目標包含 class 或 interface 的設計者可以控制哪些程式碼是有實做的責任、提供一個比 access modifier 更具表達力的方法來限制 super class 的使用、以及 support future directions in pattern matching by underpinning the exhaustive analysis of patterns。
  • 移除 Solaris/SPARC、Solaris/x64、Linux/SPARC 的支援。(細節略)
  • record 是一種 class、它是 immutable 資料的透明載體。在 JDK 14 當中以前期 preview 版面世,JDK 15 應該會包含 preview 二版。這個計畫的目標包含設計一個 OO 建造法來表達一個簡單的數據集合、幫助程式設計師專住在建構 immutable data 而不是可繼承的行為、自動實做資料相關的 method(像是 equals 跟 assessor)、保持 Java 長期以來的原則(像是 nominal typing 以及移植能力)。record 可以視為是 nominal tuple。
  • 基於 Edwards-Curve Digital Signature Algorithm (EdDSA) 的加密簽章演算法。EdDSA 是現代的 elliptic curve scheme 勝過目前 JDK 當中的簽章 scheme。EdDSA 只有在 SunEC provider 當中會實做。EdDSA 會被需要是因為相較於其他簽章 scheme 它加強了安全度及效能。一些加密的 library(例如 OpenSSL 跟 BoringSSL)已支援這個演算法。
  • 重新實做古老的 DatagramSocket API,將底層 java.net.datagram.Socket 以及 java.net.MulticastSocket API 換成簡單且較現代的實做方式。這帶來幾點好處:1. 容易除錯與維護。2. 使用 Project Loom 正在開發的 virtual thread。新的計畫會依循 JEP 353(重新實做古老的 Socket API)。目前 java.net.datagram.Socket 以及 java.net.MulticastSocket 的實做可以回溯至 JDK 1.0,那時 IPv6 還在開發中。這造成目前 MulticastSocket 的實做試著調解 IPv4 跟 IPv6 導致很難維護。
  • 預設關掉 biased locking,所有相關的 command-line 選項也都 deprecate。(細節略)
  • 延續 JDK 14 的 preview 版本,推出 instanceof 的 pattern matching 的 preview 二版。pattern matching 主要可以讓「在程式當中用特定條件取出 object 的 component」的表示法變得更簡潔。像 Haskell 跟 C# 都因為其簡約與安全的特性而包含 pattern matching。
  • hidden class 是無法讓其他 class 在 bytecode 當中直接使用的 class,這讓 framework 在 runtime 製造出 class 然後透過 reflection 的方式間接地使用這些 class。hidden class 可以被定義為 access control nest 的 member,並且可以獨立 unload。這個提案透過啟用標準 API 來定義無法被找到且有 limited lifecycle 的 hidden class,會增加所有 JVM 上語言的效能。無論 JDK 內外的 framework 將可以動態地製造 class 而不是定義 hidden class。許多在 JVM 上的語言依賴動態製造 class 來達到彈性與效率。這個提案的目標包含:讓 framework 定義找不到實做細節的 class,這樣其他 class 就無法連結到、也無法用 reflection 的方式發現到;support for extending an access control nest with non-discoverable classes;以及支援無法找到的 class 的侵入式 unload,這樣 framework 就有彈性可以想定義多少就定義多少。另外一個目標是 deprecate 一個非標準 API misc.Unsafe::defineAnonymousClass,這代表未來的版本會移除掉。同樣地,Java 語言並不會因為這個提案而有所改變。
  • Z Garbage CollectorZGC)將從實現性質的功能轉變成產品。2018 年 9 月整合進 JDK 11 的 ZGC 是一個可拓展、低延遲的 GC。ZGC 以實驗性功能的身份導入,是因為 Java 開發人員認為 ZGC 的大小與複雜度應該小心地逐步帶入。從那之後補強了許多部份,ranging from concurrent class unloading, uncommitting of unused memory, and support for data-class sharing to improved NUMA awareness and multi-threaded heap pre-touching。heap 的最大值也從 4TB 增加到 16 TB。支援的平台包括 Linux、Windows 與 MacOS。
  • text block 在 JDK 14 與 JDK 13 都出過 preview 版,要讓 Java 程式碼當中撰寫多行字串的工作便得簡單、同時避免大多數情況下的 escape sequence。一個 text block 是多行的字串,其中不包含 escape sequence、自動用可預測的方式格式化、並且提供開發人員控制格式的能力。A goal of the text blocks proposal is enhancing the readability of strings in Java programs that denote code written in non-Java languages. Another goal is to support migration from string literals by stipulating that any new construct can express the same set of strings as a string literal, interpret the same escape sequences, and be manipulated in the same fashion as a string literal. OpenJDK 開發人員希望增加 escape sequence 以管理明確的 white space 以及換行符號。
  • Shenandoah low-pause-time garbage collector 從實驗性的功能轉變成產品。這在 JDK 12 時候導入,已經經過一年了。
  • 移除 Nashorn。(細節略)
  • Deprecation of the RMI Activation mechanism(細節略)

2020年6月3日 星期三

GWT 2.9.0 發布

亮點

  • 可以用 jsinterop-base 1.0.0、elemental2 1.0.0、jsinterop-annotations 2.0.0(除了 @JsAsync@JsEnum)做 compile,這會讓 GWT2 將可以用 J2CL 以及這些工具來 compile。
  • 增加 Java language level 9, 10, 11 的支援度。
  • 正式停止在 Java 7 上執行 GWT compiler 與 server side tooling 的支援。在這個版本當中,GWT 還是可以在 Java 7 上 compile,但是不會保證能否運作。未來的版本會以 Java 8+ compile bytecode。這個版本用來測試與提供不同平台上搭配 Java 8, 11, 14 一起運作的方式。

棄用

  • Elemental 已經正式棄用了,這個版本裡頭還有,但是未來的版本當中可能就不會出現。我們建議用 Elemental2 來取代,它可以同時用 GWT2 以及 J2CL compile。
  • 移除 NoSuchMethodException 的模擬。

修正

  • 修正 float[]double[]Arrays.binarySearch()
  • error / exception 增加支援多行訊息。
  • DiskCache 增加關閉的 hook 來清除暫存檔們。
  • 將 Gecko 版號快取起來,以減少在 FireFox 的 CPU 使用率
  • 不再假設「this 一定不是 null」
  • Updates globals for Firefox version 60.0.2, Chrome 66.0.3359.45。
  • 修正 String.regionMatches()
  • 原生的 JsMethods 允許跟實做程式碼以相同名稱共存。
  • 必要時,確保 lambda 的 box、unbox、insert 有消除 cast。
  • Double.compare()Float.compare() 正確地處理負 0。

雜項

  • CLDR 更新到 v.34。
  • Arrays 現在有 implement Cloneable
  • Link backing errors together with a cause attribute, start tracking suppressed errors in addition to the cause in underlying error object.
  • AtomicReference 加到 gwt/emul
  • Propagate script nonces via ScriptInjector
  • 增加 ExecutorServiceScheduledExecutorService 的部份功能模擬。
  • 模擬 java.util.concurrent.Flow
  • 模擬 javax.annotation{,.processing}.Generated
  • goog.global 沒有定義時,讓他變成 $wnd。
  • 增加 when-linker-added element definition。
  • 增加 Reader 以及 StringReader 模擬。
  • 移除 GWT 版本檢查。
  • synthetic method 不會顯示「unusable-by-js」警示。
  • Update unmodifiableList to throw on Java8 methods.
  • 預設關掉 DataflowOptimizer,用到時會發出警告。

更多細節參見 commit log

2016年5月9日 星期一

GXT Component 的 onLoad 與 onShow 時機點

最近想要在 UI component 出現 / 消失的時候自動做一些事情,於是打算從 GXT Component 下手。不過怎麼寫怎麼有問題,只好寫 n 個 SSCCE 來確認一下,實驗結果紀錄於此。

基本認識

我關心這四個 method:

  • onLoad()
  • onUnload()
  • onShow()
  • onHide()

onLoad()onUnload() 是從 GWT 的 Widget 就定義的 method。理論上跟 onAttach()onDetach() 等意,就是這個 component 加入到 DOM(或是從 DOM 中移除)時會觸發的 method。不過 API 都強烈建議用 onLoad()onUnload() 了,就乖乖照辦。

onShow()onHide() 是 GXT Component 開始定義的 method,最常遇到的 caller 大概是 GXT Component 的 setVisible()(override UIObject)。

2016年4月14日 星期四

service 版的 Tomcat 無法列印

web server 的環境:

  • Windows Server 2008 Enterprise SP2
    • 64bit
    • 32bit
  • JDK 1.7.0_55 (32bit)
  • Tomcat 6.0.26
  • 印表機:TSC TTP 345,以網路印表機的方式連接。

有一個功能是使用者按下按鈕後,web server 會用 JNA 載入印表機的 DLL,然後以程式控制列印內容。印表機不是實際連接到 web server,而是用網路印表機的方式連到 LAN 上頭某台使用者的 PC。

2016年2月27日 星期六

不同量級的數值在同一個圖表上呈現

標題好難下,完整的標題應該是:

在 GXT Chart 中,如何把兩個不同量級的數值在同一個圖表中都用長條圖當中呈現。

拿這張圖表來舉例說明:

2015年11月15日 星期日

HTTP/2

原文網址:http://www.integralist.co.uk/posts/http2.html


引言

這是一篇很簡短的文章,展示如何利用新的 HTTP/2 通訊協定。如果你不熟悉它,那麼讓我花一點點時間來討論其中的一些亮點:

  • 單一、持續的連線
  • Multiplexing
  • 壓縮 header
  • 優先等級
  • 加密
  • Server Push

如果這些功能對你而言都不知所云,讓我作進一步的解釋……

2015年10月30日 星期五

Maven Assembly 的各種版本哏

故事是這樣的,專案的 project 海當中有一個是處理 Applet(不要問為什麼這個年代還在用 Applet,我後來改了一個 JWS 的版本,但是客戶還是想要保留 Applet [攤手])。雖然這個 project 是 maven 結構,但是 sign jar 還有最後整合進去真正的 web project 都還是用人工手動作的(不要再問了,我都要落淚了)。

雖然千百個不願意碰這個 Applet project,但事情終究還是發生了,因為最底層的 library 升級了,所以不改不行,那就順便把他變得自動化一點吧… Orz

sign jar 當然是找 maven-jarsigner-plugin(以下簡稱 jarsigner),掛上去之後發現… 奇怪,怎麼始終 build 失敗?用他錯誤訊息噴出來的那個 Windows command 字串去執行看看(當然要把 keypass 跟 storepass 換回實際的字串)卻又沒問題。喔對了,似乎這個問題只會在 Windows 上頭重現… Orz

最後發現,問題不是出在 jarsigner 上,而是 project 當中本來就有掛的 maven-assembly-plugin(以下簡稱 assembly)造成的。因為如果拿掉 assembly 的設定、或是把 jarsigner 挪到 assembly 之前(這居然是某些人認為的解法… 完全沒意義阿… WTF),是可以正常運作的。

兩個 plugin 的官方 issue tracker 都有這件事情(jarsignerassembly)。似乎是 assembly 2.2 版之後才會發生的事情,因為退回到 2.1 版就沒問題了,那就退回去吧… 祈禱不要踩到「為什麼要升級」的哏。

BUT…

希望 assembly 產生的檔名是乾淨的 foo.jar,所以加了 <finalName>、也加了 <appendAssemblyId>false</appendAssemblyId>,然後又開始 build 失敗了。問題點是卡在 <appendAssemblyId> 上頭。最妙的事情是… 這個問題在 2.2 之後解決了…

…………(嗶──)

好了,解法有兩個,一個是忘記 assembly 改成用 maven-shade-plugin,我用 2.0 版測試沒有問題,能滿足上述兩個需求。

另一個是… 把 assembly 提升到 2.6,也可以滿足上述兩個需求… (我沒有測 assembly 2.5 搭配 jarsigner 會不會出問題,但是 2.4 版是確定有問題的)

…………(嗶──)

我說那個 issue 可以麻煩順便關一關嗎?還是說根本是不知不覺間修好了,所以也沒發現......

這種排列組合的問題實在是很浪費生命阿… [淚目]

2015年7月4日 星期六

畫一個箭頭

注意

這是一個沒學過圖學、線性代數也亂學的人寫出來的東西 (艸

名詞定義

input:

  • 起始點 S 座標為 (sx, sy)
  • 終止點 E 座標為 (ex, ey)
  • 比例參數:rx1rx2ry1ry2
  • 角度:d
    • 在上圖中 d = 0。箭頭向下是 d=90

變數:

  • w:abs(ex - sx)
  • h:abs(ey - sy)
  • x2:w * rx2 / (rx1 + rx2)
  • y2:h * ry2 / (ry1 + ry2) / 2

所以各點座標為:

  • A:(ex, (sy + ey) / 2)
  • B1:(sx + x2, sy)
  • B2:(sx + x2, sy + y2)
  • C1:(sx, sy + y2)
  • C2:(sx, ey - y2)
  • B3:(sx + x2, ey - y2)
  • B1:(sx + x2, ey)

2015年4月5日 星期日

理解 Finalizer

原文網址:https://plumbr.eu/blog/debugging-to-understand-finalizer


這篇文章涵蓋了一個 Java 的內建功能:Finalizer。這個功能實際上廣為人知卻也鮮為人知,取決於你是否仔細看過 java.lang.Object。在 java.lang.Object 中有一個叫做 finalize() 的 method。它沒有實際的內容,但是它的威能與危險程度都取決於 JVM 內部如何處置這個 method。

當 JVM 偵測到 class 有 finalize() 這個 method,黑魔法就開始了。所以,我們來弄一個有不同 finalize() 的 class,這樣我們就能知道在這種狀況下 JVM 會如何處理這個 object。

2015年2月27日 星期五

啥時找 library?啥時自幹?

原文網址:http://games.greggman.com/game/when-to-find-a-library-vs-when-to-write-code/

譯註:我幾乎完全不認同這篇的說法,更不用說 HappyFunTimes 也是一個 library [大笑]。只是拿來恢復一下翻譯的感覺…


身為一個 C / C++ 碼農,除非是很大的 project,不然我很少找 library。舉例來說,如果我需要讀 BMP / TGA 檔,帳面上要寫的程式碼不到 100 行。看一下資料格式、寫一些程式、打完收工。要是我需要載入 JPG / PNG 這些格式異常複雜的檔案,我終究會去找一個 library。

我現在寫 JavaScript 就不太一樣,在 JavaScript 的世界中有數以萬計針對各種狀況的小型 library,讓我不知道該自幹程式還是找找看有沒有 library。這常常讓我覺得很浪費時間。

例如我要有一個非常簡單的功能:把字串裡頭的關鍵字換掉:

replaceParams("Hello %(name)s", {name: "World"});

// produces:
// Hello World

後來為了可以這樣搞,所以拓展到 20 行:

replaceParams(
    "Hello %(name)s from %(user.country)s",
    {
      name: "Joe",
      user: {
        country:"USA",
      },
    });

// produces:
// Hello Joe from USA

最近我希望可以用路徑插入其他檔案,像這樣:

replaceParams("->%(insertfile: foo/bar/moo.txt)s<-");

如果 moo.txt 裡頭是 this-and-that,結果會是:

-->this-and-that<--

只需要幾分鐘的時間就可以加這個功能,但是… JavaScript 中的 template 系統超級多,我建一個 template 很快。也許我應該去用那些 template 系統而不是重新再造輪。

那麼,第一個問題是:要用哪一個?我聽過 mustache、handlebars、jade、ejs…… 為什麼要選 A 而不選 B?我花了大概 20 分鐘搜尋、試圖比較… 來讓我知道哪一個比較優秀。我看到「ejs = 嵌入 JS」看起來很像 PHP;我看到 handlebars 是以 mustache 為基礎但是快了很多。我決定用 handlebars、花了大概 20 分鐘來改程式碼,它輸出相同的結果,一切看起來很棒。

然後我試著加上我那個 insertfile 指令,靠夭,炸了 AFAICT,除了關鍵字以外都沒辦法傳進 template 中。現在已經過了一小時了,誰能告訴我為什麼我要再作一次這件事情?

這就是為什麼寫這篇文章《啥時找 library?啥時自幹?》。當然,在這個例子中,如果我不去找 library 就可能只會花掉我 5~10 分鐘。我選用的 library 有一些功能,像是可以擴展功能… 自幹版當然也可以加功能。另外它可以選擇要不要轉換跳脫字元,自幹版當然也可以有這個功能。我其實沒有答案……

我知道的是… 找 library 讓我覺得分心、浪費時間。前頭我很誇張地描述許多我下載的熱門 library 證實是爛掉的,時間都花在找尋、設定跟測試。相對地,也有人告訴我應該使用更多 library。像最近在 HappyFunTimes 就有人說我應該用 body-parser 來自動分析 JSON 而不是自己處理。我的程式有 5… 也許 10 行,但是 body-parser 有 2000 行。好啦好啦,它能處理一堆 case,但是這些 case 在 HappyFunTimes 幾乎都不會遇到。我試了 body-parser 結果發現它也沒有處理我沒法處理的錯誤。如果我能解決這些錯誤,在網路上找答案是不會解決的,只會找到誰也遇到這個問題而且一樣沒辦法解決。

我想用 library,因為我會假設他們處理一些我不知道的特殊狀況。不過它們搞出來的麻煩往往多過它們的價值。

2015年1月24日 星期六

2014 年 GWT 調查報告中文摘要

原始報告請到 https://vaadin.com/documents/10187/4238532/GWT_report_2015.pdf 下載。 這個連結是在某個 G+ 上頭看到的, 目前 https:/vaadin.com/gwt 的連結還是指向 2013 的版本, 但是 https://vaadin.com/gwt/report-2015 的東西似乎 ready 了?

這是在 2014 年作的調查,所以雖然 vaadin 是標注 2015 年, 我還是以 2014 為篇名。

基本上都只翻譯數據跟(個人認定的)重點,非逐句翻譯。


1. 評價

4.47 分(滿分 5 分)。

這是 1101 份投票的平均分數。有 82% 的人投了 4 分以上。

2014年5月18日 星期日

Sencha GXT 3.1 發布

作為 Sencha GXT 的團隊代表,我很高興宣佈 Sencha GXT 3.1 發布。在公開測試後只有一兩個月的時間,我們收到一卡車的回饋意見。我們已經解決幾個來自公開測試討論區的問題。感謝所有前期測試人員,你們的回饋意見始終是非常寶貴的。

GXT 3.1 導入了新的 Theme Builder(妝點 GXT 程式的新工具)、Neptune 這個佈景主題就是用 Theme Builder 做出來的;另外 GXT 3.1 也增加了對 GWT 2.6 的支援度。

(譯註:省略兩段純粹提供 3.1 各式連結的部份)

2014年5月16日 星期五

HandlerManager 與兩個 event package

我大概是當完兵之後才開始用 HandlerManager 作 event bus,目的當然是降低耦合度。起手 reference 是 tkcn 的這篇《利用 HandlerManager 實作共用的 Event Bus》,然後一直以來就爽爽用,沒出啥問題、也沒想過會出問題。今天在 review 別人的 code 才知道有 SimpleEventBus,然後想知道這兩個到底有什麼差別、該用哪一個比較好?沒想到才剛打開 HandlerManager 的 source code,一開頭的 javadoc 就開始噴血:

application developers are strongly discouraged from using a HandlerManager instance as a global event dispatch mechanism.

WTF?不但不建議,而且是強烈不建議?GWT MVP 的文件都還是教用 HandlerManager 阿?

2014年5月11日 星期日

GWT MVP part1

原文網址:http://www.gwtproject.org/articles/mvp-architecture.html

建立大型 application 都有其障礙,GWT application 也不例外。多個開發人員同時在一份程式碼上作業、維護既有功能,可能短時間內就會讓程式碼一團混亂。為了解決這個問題,我們導入 design pattern 來將 project 劃分出不同的責任區。

有很多 design pattern 可以選擇,例如 Presentation-Abstraction-Control、Model-View-Controller、Model-View-Presenter…… 等等。雖然每個 pattern 有其優點,不過我們發現 Model-View-Presenter(以下簡稱 MVP)架構在開發 GWT application 的效果最好。有兩個主要的原因:首先,就像其他 design pattern,MVP 會降低開發行為的耦合度,這讓多個開發人員可以同時工作。再者,MVP 會盡可能降低 GWTTestCase 的使用度。GWTTestCase 會需要 browser,但是大多數程式碼只要輕量、快速、不需要 browser 的 JRE 測試。

這個 pattern 的核心是把功能分散到各個元件,這在邏輯上是有意義的。但在 GWT 中還有一個明確的重點,是讓 View 的部份盡可能簡單,以減輕對 GWTTestCase 的依賴、降低整體的測試時間。

一旦你瞭解這個 design pattern 的原理,那麼建立以 MVP 為基礎的 application 就會直覺又簡單。我們將用一個簡單的通訊錄系統為例子,協助你聊解這些概念。這個系統可以讓使用者增加、編輯、檢視存放在 server 上的聯絡人清單。

2014年4月25日 星期五

死法無法預測

原文網址:https://plumbr.eu/blog/you-cannot-predict-the-way-you-die


在花了一天對付另一個 Heisenbug:每當我快抓到原因,它就會變了樣;我想我在這個 case 中學到的東西應該有分享的價值。

我寫了一個簡單的範例來展示這個狀況。在這個例子中,我建立一個 Map 然後用無窮迴圈往裡頭狂塞 key-value:

class Wrapper {
  public static void main(String args[]) throws Exception {
    Map map = System.getProperties();
    Random r = new Random();
    while (true) {
      map.put(r.nextInt(), "value");
    }
  }
}

2014年4月24日 星期四

外部 JS 呼叫 Java static method

內容有點無腦,先把結論寫在前面:

外部 JS(官方文件稱為「handwritten JS」,其實不同 GWT Module 就滿足這個條件)要呼叫 Java 的 static method,必須先透過 JSNI 設定 $wnd.methodName = @fooPackage.FooClass::javaMethodName(*),後續使用 $wnd.methodName() 來達到目的。

關鍵在於 JSNI 中:

  • javaMethodName() 後頭不需再加 ()
  • javaMethodName() 的參數某些情況下可以省略 field descriptor,直接用 * 代替。

update:感謝 darkk6(ptt.cc)提醒,讓我發現我不但死腦筋,而且還少測了一種寫法… 所以文章就要重新翻修了 (艸

2014年4月5日 星期六

NIO.2 的檔案操作

前言

以往 Java 要操作檔案時,總得自己去面對 XXStream、XXReader、XXWriter,一不小心就迷失在 class hierarchy 迷宮中而搞不清楚到底該怎麼寫才好 [淚目]。NIO.2 的出現,提供了簡單好用的 method 來解決這些困擾。

這篇都還在 Java 7 的範圍。已經出的 Java 8 也對 NIO.2 做了一些改善,中文資料可先參考 Ingram Chen blog 的 File operation 章節。