2014年7月24日 星期四

使用 log4j 時,讓 Apache HttpClient 的 log 消失

如果有同時使用 log4j 和 HttpClient,應該很多人都有這個慘痛的經驗~
HttpClient 在執行時會把所有發送和接收的資料全部以 debug 等級的 log 輸出到 log4j
一般在做 JSON 處理時還好,這個 log 大概對於 debug 蠻有幫助的
但如果是在實作檔案上傳或者下載時,印出來的 log 等於是把要上傳或下載的檔案全部輸出到 log4j,是相當驚人的文字量
而且有時候會把 eclipse 弄到當機...。

2014年7月18日 星期五

java.lang.ArrayIndexOutOfBoundsException: 48188

莫名其妙遇到的問題....錯誤訊息如下:

嚴重: StandardWrapper.Throwable
java.lang.ArrayIndexOutOfBoundsException: 48188
        at org.objectweb.asm.ClassReader.readClass(Unknown Source)
        at org.objectweb.asm.ClassReader.accept(Unknown Source)
        at org.objectweb.asm.ClassReader.accept(Unknown Source)
        at com.sun.jersey.spi.scanning.AnnotationScannerListener.onProcess(AnnotationScannerListener.java:136)
        at com.sun.jersey.core.spi.scanning.JarFileScanner.scan(JarFileScanner.java:97)
        at com.sun.jersey.spi.scanning.servlet.WebAppResourcesScanner$1.f(WebAppResourcesScanner.java:94)
        at com.sun.jersey.core.util.Closing.f(Closing.java:71)
        at com.sun.jersey.spi.scanning.servlet.WebAppResourcesScanner.scan(WebAppResourcesScanner.java:92)
        at com.sun.jersey.spi.scanning.servlet.WebAppResourcesScanner.scan(WebAppResourcesScanner.java:79)
        at com.sun.jersey.api.core.ScanningResourceConfig.init(ScanningResourceConfig.java:80)
        at com.sun.jersey.api.core.servlet.WebAppResourceConfig.init(WebAppResourceConfig.java:102)
        at com.sun.jersey.api.core.servlet.WebAppResourceConfig.<init>(WebAppResourceConfig.java:89)
        at com.sun.jersey.api.core.servlet.WebAppResourceConfig.<init>(WebAppResourceConfig.java:74)
        at com.sun.jersey.spi.container.servlet.WebComponent.getWebAppResourceConfig(WebComponent.java:668)
        at com.sun.jersey.spi.container.servlet.ServletContainer.getDefaultResourceConfig(ServletContainer.java:415)
        at com.sun.jersey.spi.container.servlet.ServletContainer.getDefaultResourceConfig(ServletContainer.java:582)
        at com.sun.jersey.spi.container.servlet.WebServletConfig.getDefaultResourceConfig(WebServletConfig.java:87)
        at com.sun.jersey.spi.container.servlet.WebComponent.createResourceConfig(WebComponent.java:699)
        at com.sun.jersey.spi.container.servlet.WebComponent.createResourceConfig(WebComponent.java:674)
        at com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:203)
        at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:374)
        at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:557)
        at javax.servlet.GenericServlet.init(GenericServlet.java:158)
        at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284)
        at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197)
        at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087)
        at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5210)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5493)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:632)
        at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1083)
        at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1880)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask.run(FutureTask.java:262)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:744)

找來找去找不太到相關的資料,好不容易找到 [1],顯示錯誤原因似乎是使用 Maven 時加上了 Jaxen 這個 dependency。
不過這個 dependency 是 dom4j 在操作 XPath 時要用的 ~"~
先記錄一下,也許可能的解法是不要用 XPath 來存取 XML 內容....。

參考資料:
1、较少遇到的错误—严重: StandardWrapper.Throwable—java.lang.ArrayIndexOutOfBoundsException: 48188

2014年7月10日 星期四

透過 Apache jClouds 操作本地檔案系統的 Blob Store

Apache jClouds 是一個可以支援很多不同雲端基礎建設的開源函式庫
其中可以利用它的 Blob Store 的介面,來操作各家雲端基礎建設的儲存服務。
不過其實它也有提供非雲端基礎建設的實作,讓使用者可以適度地把一些沒有要放上雲端的東西,透過它的介面存放在本地的檔案系統。

2014年7月7日 星期一

使用 AES 加密後的資料長度

參考 [1-2],AES 演算法在加密時基本上不會變更檔案長度,所以原始檔案有多長,加密後就有多長。
不過因為 AES 是 block cipher,要加密的對象必須是 16 bytes 的倍數才能正常加密
因此演算法必須搭配 padding 的方法,而 padding 的方法就會影響加密後的長度。

從 [1] 的回應來看,如果 padding 的方法是使用 PKCS5 或 PKCS7 的話,加密後的長度如下:
cipherLen = (clearLen/16 + 1) * 16;

參考資料:
1、Size of data after AES encryption
2、How does PKCS#7 padding work with AES-256, CBC mode?

2014年7月1日 星期二

在 ubuntu 建立 virtual bridge

想要在 ubuntu 上建立 bridge 時,可以透過 bridge-utils 這個套件來達成。

2014年6月24日 星期二

OpenStack Cinder 使用磁碟的概念

在 OpenStack 中,關於儲存的服務有 Cinder(Block Storage)以及 Swift(Object Storage)
其中 Cinder 在定位上強調的是永久並且快速的儲存空間
同時 Cinder 也在運算單元產生虛擬機器時,負責提供虛擬機器所需要的實體空間。

2014年6月16日 星期一

OpenStack Swift 的儲存結構最佳化

當需要使用大型雲端基礎建設時,在國外有蠻多企業選擇 OpenStack 這個開源雲端專案。
OpenStack 裡面又有 Swift(不是 Apple Swift 程式語言 XD)這個 Object Storage 服務,可以提供關於物件儲存的解決方案。
Swift 主要提供的是高可用性且易於擴展的儲存服務~
它的儲存結構中區分為 account、container 以及 object 三個階層
因此想要建構在 OpenStack 之上的應用服務時,也需要稍微思考一下要如何去建構 Swift 的結構。

2014年6月13日 星期五

在 ubuntu 安裝 All-In-One 開發版的 OpenStack

想要安裝 OpenStack 時,一般是可以直接看官方文件一步一步安裝
但因為中間設定很多又很繁雜,開發階段可以用 DevStack 來簡化安裝過程。
要使用 DevStack 來安裝,動作很簡單~
以 ubuntu 來說,只需要在一台剛裝好的 ubuntu 上安裝 git,然後用 git 的指令從 github 上把 DevStack 的安裝包下載下來
最後執行 DevStack 上的安裝指令 [1] 就可以一鍵安裝完成。

2014年6月5日 星期四

system() 執行的路徑帶有空格的解決方法

正常在 C/C++ 呼叫 system() 時,system() 函式在 Windows 上會呼叫 cmd.exe,然後代入 system() 的括號裡給的參數 [1]
不過參數如果帶有空格,例如想執行某個外部的程式,而該程式位在 Program Files 資料夾內時,有可能出現類似這樣的錯誤訊息:
windows找不到'C:\Program' 請確定您輸入的正確名稱,並且重試
而解決方法就是把有空格的部分用 \" 包起來 [2-3],讓 C 語言執行時看到的字串是這樣:
C:\"Program Files"\....
例如:
system("C:\\\"Program Files\"\\Java\\jdk1.7.0_45");

參考資料:
1、c++ system()和WinExec()的区别
2、C語言可以呼叫名字有空格的資料夾嗎???
3、C语言 system()函数打开一个程序,路径有空格的问题

2014年6月4日 星期三

在 eclipse 上開發 JNI:設定 CDT + MinGW 的操作環境

這篇是在記錄使用 eclipse 開發 JNI 時,在 eclipse 上如何開發 C/C++ 的程式(CDT)
以及在 eclipse 上如何建立 JNI 的關連,讓 C/C++ 的 JNI 程式可以透過 eclipse 完成開發。
主要參考對象是 [1-2],其中 [2] 是比較詳細的教學。