- RubyMine extensions and themes made by users -RubyMine 所使用的 color scheme 列表
- Dark Pastels color scheme
- Color Schemes for IntelliJ IDEA
Intellij IDEA color scheme 資源整理
[心得] 在無法對外連線的環境下使用 dom4j 時,記得關閉 DTD 驗証功能
花了我一兩個小時在排除這問題……,記錄一下。
上禮拜在客戶的環境下測試一隻程式時,發現程式會卡住不動,一開始我還以為,也許是程式要讀取的某個 XML 檔被其他的程式 lock 住了,才會讀不出來。後來耐心的等程式把 exception 吐出來,才發現問題出在 dom4j 上頭。
因為 dom4j 在解析 XML 檔時,也會一併去抓取該 XML 所指定的 DTD 檔下來做驗証,但因為客戶機房的環境是不能對外的,所以 dom4j 在取不到 DTD 文件後,就會吐出 exception,程式就會失效了。
解決辦法也很簡單,在使用 SAXReader 讀取 XML 檔之前,記得先將 SAXReader 的 XML DTD 驗証功能關掉就可以了,如下︰
SAXReader saxReader = new SAXReader();
// 以下兩行其實是相同的東西;
// saxReader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
saxReader.setFeature(Constants.XERCES_FEATURE_PREFIX + Constants.LOAD_EXTERNAL_DTD_FEATURE, false);
Java 中的 Endianness 問題處理
終於瞭解不同 Endianness 在不同機器上會發生的狀況了。
Endianness 在計組中所指的是在記憶體中,以數個 byte 來表示特定資料時,這些 byte 的排列方式,因此 Endianness 也稱做 byte order。
ex: 假設一個 data 需以 ABCD 四個 byte 來表示︰
long data = 0x11223344; // A:0x11 B:0x22 C:0x33 D:0x44
在 memory 中,你可以直觀的用 ABCD 排列來表示 data (此種方式稱為 Big Endian)︰也可以使用 DCBA 的排列來表示 (此種方式稱為 Little Endian)。
而 Endianness 的選擇也會影響噹我們將資料寫入檔案,與將資料自檔案中讀取出來的 byte order 解讀方式。使用 big-endian 儲存的文件改用 little-endian 方式來解讀,結果就不會正確。
由上面的解釋我們可以瞭解,Endianness 的選擇取決於電腦硬體設計者,以目前市面上常見的 CPU 來看,x86 CPU 體系採用 little-endian,而大部份的 RISC CPU 則是採用 big-endian。
而 JVM 這個 "Virtual Machine" 呢,則是採用 big-endian,這也就造成了,當使用 Java 所儲存的 big-endian 文件,在使用 little-endian 下的 PC 程式開啟時會有問題;而在 PC 中以程式儲存的 little-endian 文件,在 Java 中讀取時資料也會解讀錯誤。
講了這麼多,其實我只是要記錄一下解決的辦法 XD
以 Short 資料型別(1 Short = 2 Byte)為例,當我在 Java 中要讀取一個 little-endian 的文件時(大部份 PC 程式所產生的文件皆是),有兩種方式︰
第一種方法為個別讀取兩個 byte,然後將兩個 byte 的順序對調,再重組出一個 big-endian 的 Short 型別資料,方法如下︰
byte b[] = new byte[2];
RandomAccessFile input = new RandomAccessFile(sampleFile, "r" );
int sampleNum = (int)input.length()/2;
samples = new short[sampleNum];
for(int k = 0; k < samples.length; k++) {
b[1] = input.readByte();
b[0] = input.readByte();
samples[k] = ByteBuffer.wrap(b).getShort();
}
input.close();
第二種方法則是使用 Short 內建有的 reverseBytes() method 做 byte 倒轉的動作︰
RandomAccessFile input = new RandomAccessFile(sampleFile, "r" );
int sampleNum = (int)input.length()/2;
samples = new short[sampleNum];
for(int k = 0; k < samples.length; k++) {
samples[k] = Short.reverseBytes(input.readShort());
}
input.close();
以上兩種方式都可以解決 Java 下 Endianness 的問題。
參考資料︰