2013年12月26日 星期四

過濾 Apache HttpClient 的 debug log

在 Linux 底下使用 tail 指令時,可以利用 grep -v 反向過濾,把 Apache HttpClient 的 log 過濾掉
例如:tail -f catalina.out | grep -v 'org.apache.http'

2013年12月3日 星期二

使用 Apache HttpClient 4.3 發送 HTTPS 要求時略過所有認證檢查

一般正常在發送 HTTPS 要求時,必須先匯入伺服器的認證,才能正常建立 HTTPS 的加密連線
但某些狀況下,伺服器使用自我認證等等的方式時,會想要略過這些認證檢查(把 HTTPS 當成 HTTP 在使用...XD)
在 Apache HttpClient 4.3 當中可以用以下的方式取得 HTTPS 的連線。

2013年11月22日 星期五

使用 Jersey + Multi-part 接受檔案上傳(二):實作即時上傳

依照上篇文章(使用 Jersey + Multi-part 接受檔案上傳)的方法做 Multi-part 的上傳時
依據 Jersey 的實作方法,實際上會先在伺服器上把使用者上傳的檔案全部接收、暫存到暫存的資料夾內,然後才會進入使用者定義的 Multi-part 的介面,並獲得代表檔案內容的 FormDataMultiPart。
也就是說實際上如果檔案是要存到伺服器上,伺服器對這樣一個檔案上傳的動作,會花費兩次的磁碟 I/O 時間來接收和儲存這個檔案。

2013年11月21日 星期四

WADL:描述網站的 REST 介面的文件

WADL 是 Jersey 會自動產生出來的文件,可以從文件中看到每個 REST 介面使用的 method、接受的資料類型、介面的操作網址等等。

網址是 http://<host_name>/<project_name>/<prefix>/application.wadl
其中 HOST_NAME 是網站的網域名稱、PROJECT_NAME 是專案名稱、PREFIX 是在 web.xml 裡面定義的 REST 介面的入口。

參考資料:
1、Chapter 15. WADL Support

2013年11月14日 星期四

攔截 JVM 關閉的事件

某些程式碼想要在 JVM 關閉時處理,比如說釋放某些外部資源等等的
可以利用 Runtime 類別的 addShutdownHook() 方法,把要在 JVM 關閉時執行的程式碼加進去。

根據 Java 7 的官方文件顯示,會觸發 shutdown hook 的事件有以下兩種:
1. The program exits normally, when the last non-daemon thread exits or when the exit (equivalently, System.exit) method is invoked, or
2. The virtual machine is terminated in response to a user interrupt, such as typing ^C, or a system-wide event, such as user logoff or system shutdown.

只要是任意一種事件被觸發,shutdown hook 上被註冊過的執行緒就會全部一起被觸發 start()
需要注意的是,全部一起被觸發指的當然還是一個一個觸發,但 JVM 不保證觸發的順序
另外也不會等一個執行緒執行完畢才繼續觸發下一個,而是一口氣觸發所有的執行緒,讓它們一起開始執行。

使用方法就單純產生一個 Thread 物件,然後呼叫 Runtime.addShutdownHook(java.lang.Thread) 就好了。

參考資料:
1、Runtime.html#addShutdownHook(java.lang.Thread)

2013年11月5日 星期二

觀察 GC 的狀況

-verbose:gc -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintHeapAtGC

參考資料:
1、Re: Problem with mongo 2.2.0 and java connection

2013年10月17日 星期四

筆記

Runtime-polymorphism
http://blog.sanaulla.info/2013/05/14/runtime-polymorphism-in-java/

sub class 繼承 super class 後,sub class 的 constructor 一定要呼叫某一個 super class 的 constructor
若沒有宣告任何 super(...) 時,預設將呼叫 super class 中沒有參數的 constructor
若 super class 所有定義的 constructor 皆有參數,會拋出 compilation error: Implicit super constructor XXXX() is undefined. Must explicitly invoke another constructor

2013年10月14日 星期一

攔截 Jersey 的 Exception 時略過 Jersey 自身吐出的 Exception

如果在使用 ExceptionMapper 時,攔截了所有的 RuntimeException 的話,預設會連 Jersey 吐的 WebApplicationException 一起攔截
因此會導致像是透過 GET 去存取應該用 POST 存取的 URL 時,應該要吐的 405 Method Not Allowed 一起被攔截並轉成指定的 Response 了。
而單獨略過 WebApplicationException 的方法可以參考 [1]。

2013年10月11日 星期五

使用 Jersey + Multi-part 接受檔案上傳

基本參考對象是 [6] 的範例,因為 Jersey 基本上已經做完大部分的事情,所以程式碼其實很簡單
不過在佈署 Jersey 時可能會有一些奇怪的問題~

2013年10月9日 星期三

在 HTTP header 放入特殊字元或文字

在正常的 HTTP header 中,依據 [1] 的回應,RFC 2616 文件中有以下的描述。
Words of *TEXT MAY contain characters from character sets other than ISO-8859-1 [22] only when encoded according to the rules of RFC 2047 [14].
因此 HTTP header 在不使用編碼的情況下,預設是以 ISO-8859-1 編碼。
而要放入 ISO-8859-1 不支援的字元時,必須使用 MIME 編碼才行。

解決在 eclipse 輸入中文會變亂碼

在 Windows 7(或 Windows XP)底下,直接從 eclipse 執行內含使用 Scanner 的程式
要接受使用者輸入時,會發現輸入的字串直接輸出都會是亂碼~
其實問題本身是系統編碼跟環境編碼不一致的問題。
因為 Windows 7(或 Windows XP)在繁體中文的環境中預設使用的編碼是 Big5
但是 eclipse 預設的編碼是 UTF-8,因此會發生 eclipse 使用 UTF-8 去編碼實際上是 Big5 的字元,就會變成亂碼了。

2013年9月26日 星期四

動態載入 Class 並呼叫 Class 的 Method

有關 Java 的 ClassLoader 的描述,可以參考 [1]。
大略來說,JVM 內建有一個 BootStrapClassLoader,用來作為所有 Java 類別的 ClassLoader
BootStrapClassLoader 會載入 JVM 必要的類別(像是 rt.jar)。
根據 [1] 的描述,可以利用以下的程式碼查看 BootStrapClassLoader 載入了哪些 jar。

URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();  
for (int i = 0; i < urls.length; i++) {  
  System.out.println(urls[i].toExternalForm());  
}

BootStrapClassLoader 在載入時,同時會載入第二個 ClassLoader:Extension ClassLoader
Extension ClassLoader 主要職責是載入 JAVA_HOME 裡面額外放的函式庫,即預設是載入 /lib/ext 資料夾內的東西。
Extension ClassLoader 最後會載入 App ClassLoader,就是載入使用者執行的應用程式的 class 了。

2013年9月25日 星期三

Java 6 和 Java 7 的 substring() 的差別

其實這應該算是 BUG 修正吧~
在 Java 6 時,稍微有注意效率的人可能會知道
因為 Java 的字串是不可變動的,因此呼叫 substring() 時,它做的是把指標指向原字串的其中一小段
因此假設原字串有 1000 個字元,而 substring() 後只需要 3 個字元
實際上在使用這 3 個字元時,還是隨時把那 1000 個字元帶著跑,即使裡面有 997 個字元是不需要的。

2013年9月24日 星期二

使用 JavaMail 發送帶有附件的郵件

真正需要額外加上資訊的只有在產生 Multipart 的資訊時,要額外放入附件的資訊。

2013年9月21日 星期六

偵測瀏覽器的 scrollbar 位置

有些網頁太長或太寬時,會想把某些東西固定在某個位置
在 jQuery 中已經有包裝好的函式 scrollTop() 和 scrollLeft(),可以簡單地做到偵測的動作。

檢查元件是否顯示

想要檢查某個元件是否能夠被看見,可以透過檢查它有沒有帶有 ":visible" 屬性來做到。
$(element).is(":visible")
不過因為隱藏的方法好像有好幾種,印象中不是每種方法都有 ":visible"
所以可能有些狀況要用別的方法檢查。

參考資料:
1、Testing if something is hidden with jQuery

2013年9月13日 星期五

使用 MongoDB 的 Java Driver 搜尋帶有斜線 (/) (slash) 的 Regex

由於 MongoDB 的 Java driver 在某個版本以後開始支援 Pattern 物件
因此要在 Java 上使用 Java driver 做 regular expression 時就簡單多了
只要自己先編譯好 Pattern 的物件,直接把 Pattern 丟到 DBObject 的 value 欄位就好了。

2013年9月12日 星期四

實作流量限制:Token bucket algorithm

流量限制是蠻平常的網路傳輸的功能~不過實作上其實也不是那麼單純
像是雖然可以靠暫停執行緒的方式去控制平均流量,但一般來說除非是一個 byte 一個 byte 接收或傳送
否則通常很難剛好跑到指定的流量時就讓它暫時停止。
然後這時就會有一些相關的衍生問題,例如這一秒多傳的 byte 數目,下一秒是不是要扣回來?是不是需要控制瞬間最大流量?

2013年9月6日 星期五

eclipse 在專案上標明有錯誤,但找不到錯誤

有時會出現 eclipse 顯示專案有錯誤,但是打開專案內容時,卻怎麼也找不到哪裡有錯
這時通常錯誤的問題可能是發生在環境上~

2013年8月25日 星期日

在 Jersey 1.17 利用 LogginFilter 攔截 Request 的開始與結束

在使用 Jersey 1.17 作為 JAX-RS 的 RESTful 網頁服務時,如果想要攔截伺服器收到的 Request 和回應的 Response
可以偷偷利用 LoggingFilter 作為攔截的手段。

2013年8月23日 星期五

2013年8月22日 星期四

使用 SWT 開發視窗程式(一):實作檔案總管的樹狀目錄

SWT 本身有提供 Tree 元件,可以用來產生樹狀結構的容器
因此想實作簡單的檔案總管的樹狀目錄時,可以透過 Tree 元件來實作。

2013年8月16日 星期五

HttpUrlConnection 中解決 out of memory error

當程式要實作模擬 HTTP 的 GET 或 POST 行為時,通常會使用 Apache 的 httpcomponent 套件
或者是自己利用 Java 的 HttpUrlConnection 去實作~
而當使用 HttpUrlConnection 時,遇到 POST 很大的資料時,可能就會出現 OutOfMemoryError 了。

2013年8月14日 星期三

switch

在 Java SE 7 以前,switch 只能用在 primitive 上,SE 7 開始才支援讓 String 這種型別也可以用作 switch 的條件式
詳細的原因似乎可以參考 [1],有講到比較細節的原理。

參考資料:
1、Switch Statement with Strings in Java

2013年7月31日 星期三

儲存密碼的方法:Java 的 Scrypt KDF 演算法

使用 Scrypt 的原因可以參考 [1-2],其中 [2] 是比較主要的原因~
大概是說一般常見的密碼儲存方法是使用 One-Way Hash Function 來把密碼變成一串亂碼,儲存在系統上
但不管使用哪種雜湊演算法,其實都不夠安全~主要原因來自於雜湊演算法的兩點特徵:

2013年7月28日 星期日

取得放在專案資料夾內的圖片

在 eclipse 的專案中,要讓程式取得放置於專案內的圖片檔案,可以利用 Source Folder 來達成。

2013年7月27日 星期六

JFace 的必備 library

在嘗試使用 SWT + JFace [1] 時,想要用手動的方式匯入 JFace 需要的 library
因此記錄一下使用 jFace 要自己放入的 library 有哪些。

2013年7月25日 星期四

WindowBuilder:Java GUI 的 WYSIWYG 編輯器

前幾天被問到要用 Java 做簡單的視窗程式,希望很快就寫出來,不要花太多時間
不過因為需要做 GUI,當時心裡想~用 .NET 寫的話可以靠 Visual Studio 拉介面
產生 GUI 的速度會遠比用 Java 自己打程式碼快得多。
回家之後查了一段時間,無意間發現了 WindowBuilder 這個工具,而且是 Google 提供的開發工具!
後來看了一下網路上的資料,有人說原本是 Instantiations, Inc. 開發的付費工具,後來 Google 買下來以後就改成免費提供了。
真實性不清楚,也沒有仔細去查,不過總之現在它是 Google 提供的免費開發工具就是了。

2013年7月11日 星期四

在 Java 使用加密演算法(六):KeyGenerator、Cipher、工作模式與填充方式之間的關係

記錄一下有關 KeyGenerator(在這個主題中,可以替換為 KeyPairGenerator 或 KeyFactory) 與 Cipher 之間的關係。

keyGenerator 是用來產生 Key 的產生器,取得 KeyGenerator 的實體必須透過 getInstance() 方法,同時需要輸入使用的演算法的名稱。
Cipher 則是用來進行加密、解密的工具,取得 Cipher 的實體也必須透過 getInstance() 方法,同時輸入要使用的演算法名稱。

2013年7月10日 星期三

(書籤) MongoDB transaction

暫存一下,還沒有很仔細在看內容,不過大略看了一下,有注意到這個實作 MVCC 的 transaction 的方法
每 commit N 個操作,必須送出 2N+2 個資料庫指令....
不知道這划不划算~目前覺得好像有點不划算。

參考資料:
1、MongoDB transactions?
2、GitHub:MongoDB transaction example

2013年7月9日 星期二

Word 標題自動按階層編號

記錄一個跟寫程式無關的小事~
在 Word 裡面想對某個樣式做階層式的自動編號時,可以利用「多層式清單」的功能
搭配增加縮排/減少縮排,就可以達到讓某個樣式自動生成想要的階層的清單。

2013年7月8日 星期一

在 Java 使用加密演算法(五):使用 RSA 加解密長資料的另一種實作方法

原本使用前篇「在 Java 使用加密演算法(三):使用 RSA 加解密長資料」中寫的方法在做 RSA 加解密
但不知道為什麼突然跑出 javax.crypto.BadPaddingException: Data must start with zero 的 Exception
找來找去都不知道問題出在哪.....後來查到 [1] 時發現好像有比較簡潔的寫法...。

2013年7月5日 星期五

在 Java 使用加密演算法(四):使用 Jasypt 與 Bouncy Castle 產生雜湊

要在 Java 做加密方法好像有不少,之前也曾 PO 過以內建的方法產生加密的文章。
不過基於希望程式碼簡潔、容易呼叫,並且能夠支援更多的加密演算法,所以還是嘗試找了一下
根據在 StackOverflow 社群上的問答 [1],在這裡嘗試了使用 Jasypt 與 Bouncy Castle 作為產生雜湊碼的方法。

(書籤) Open Source License

記錄跟 Open Source License 有關的書籤~。

GNU GPL

GNU LGPL

Apache License Version 2.0
自由軟體鑄造場:利用 Apache-2.0 程式所應遵守的義務規定
有時候使用者利用 Apache-2.0 程式的方式,也可以不要去改變該程式原來 Apache-2.0 的授權宣告,在這樣所產生的新專案中,除了 Apache-2.0 程式碼外,還併存有自行開發的封閉專案程式碼。此時,Apache-2.0 授權的部份如果在散布時願意提供源碼的話,散布者仍可以自發性的提供源碼,但依 ASF 的解釋(同註二),如果散布者轉以不提供源碼的方式來運用此一原以 Apache-2.0 授權的程式,亦可。此時最低的義務性要求,就是散布時須一併提供 Apache-2.0 授權條款的全文,以及該程式前手已註解的相關聲明。所以,如果是採後者將專案整體程式碼封閉起來的利用方式,那筆者建議此時專案整體著作權與授權聲明的說明文字,求其簡便之故,可在適當的位置加入如下的簡要資訊來滿足 Apache-2.0 授權條款要求的標示義務,這些適當的位置可以是圖形化介面中的「關於 (About)」下拉選單、嵌入式裝置所附隨的說明書,或應用程式安裝過程中所出現的著作權與授權資訊頁面

2013年6月21日 星期五

在 Java 中取得 MongoDB 剛插入的資料的 ObjectID

這問題就跟一般 RDBMS 想在資料插入後取得自動產生的 ID 是一樣的意思~
不過在 MongoDB 上,這個問題相對似乎簡單了許多~。

2013年6月10日 星期一

利用 Guava 的 MapMaker 產生 weak value 版的 WeakHashMap

續前篇「WeakHashMap 的使用
目標是想要有個 Map,能夠快速儲存、取得我存在 Map 上的某個 Object;但當 Object 不再使用的時候,它又能自動消失。
由於根據自己的測試(以及 [1] 中網友 Cowan 的回應),WeakHashMap 似乎不太適合這個用途,因此就想來嘗試 [1] 中提到的 MapMaker 了。

WeakHashMap 的使用

通常使用 HashMap 的目的,就是希望在記憶體中存放一張列表,而需要列表中的某個東西時,能夠很快地把想要的物件取出來。
但有時又希望當 HashMap 上的物件沒有使用時,能夠從記憶體中消失~
一般狀況下這必須要由程式設計師手動處理,也就是當確定某個 Key 不再需要時,手動將它從 HashMap 中移除。
不過也許也可以利用 Java 的 Weak Reference 特性來處理,即 WeakHashMap 這個物件。

HashMap 的 Concurrency 問題

因為目前可能需要用沒有 Concurrent Package 版本的某個 HashMap 相關的 Class
所以要先整理一下 HashMap 系列的東西,在多執行緒環境下可能的問題。

2013年6月6日 星期四

(書籤) SOA Design Patterns

在系統設計的階段,常常遇到一些問題,需要從系統設計面就嘗試去解決
目前已經有不少眾所皆知的 Design Pattern 可以解決某些常見的問題
所以記錄一下可以查詢的地方!

參考資料:
1、SOA Patterns
2、10 Soa Design Patterns Every Architect Should Know

2013年6月5日 星期三

一致性選擇

基本的一致性分類好像是「強一致性」和「弱一致性」,其中在 NoSQL 蠻常看到的「最終一致性」是弱一致性的其中一種
強一致性就是一般的關聯式資料庫保障的特性,即資料修改後,所有人馬上都會看到最新的資料;
弱一致性大致上就是資料更新後,有些人仍然會看到舊的資料。必須經過某段時間之後,慢慢才會讓所有人都獲得最新的資料。

2013年6月4日 星期二

衡量 ReentrantReadWriteLock 的記憶體使用量

考慮使用 ReentrantReadWriteLock 來處理 Concurrent 的問題
但要這樣做的話,ReentrantReadWriteLock 有可能要全部暫存在記憶體裡面~
因此要簡單地先衡量使用 ReentrantReadWriteLock 有可能要處理多少程度的記憶體問題。

用 Java 處理 Microsoft Excel (2):使用 Apache Poi

續前文「用 Java 處理 Microsoft Excel (1):使用 JXL
目標一樣是要把包含某些 key 的列全部刪掉~這次改用 Apache Poi [1] 來嘗試。

用 Java 處理 Microsoft Excel (1):使用 JXL

因為要幫同事處理 Excel 檔,因此嘗試了使用 JXL 這個 Open Source Library [1] 來試試看。
目標是在別的地方找到了一串 key,要在 Excel 裡面把對應的 Row 刪除。

2013年5月31日 星期五

去除影片中的半透明浮水印

無意間看到 [1] 的資訊,有個叫做 aviutl 的工具,有提供 plugin 可以去除浮水印。
其實想想覺得也蠻有道理的,浮水印如果是半透明的話,透過收集不同畫面上的浮水印資訊
應該可以解析每個畫面的浮水印跟周遭的顏色差異,得到某一個特徵值
然後綜合每個有浮水印的畫面的特徵值,理論上可以得到 "近似" 浮水印原始顏色和形狀的特徵值
用這個特徵值去反向演算每個畫面上的浮水印,應該是有蠻高的機率可以讓浮水印消掉 8~9 成的顏色吧。

(書籤) LCD 演進史及各種面板的差異

以前看過這些資料,但是事後常常找不到,所以記錄一下剛找到的連結。

參考資料:
1、淺談TN、VA、IPS顯色技術藍、綠、紅 三原色的繽紛世界
2、Wikipedia:薄膜電晶體液晶顯示器

(書籤) 各種 DDoS 方法

參考資料:
1、Dangerous DDoS (Distributed Denial of Service) on the rise

2013年5月30日 星期四

MongoDB 的特性

記錄一下同事在做 MongoDB 的效率測試時發現的一些特性(測試的版本是 MongoDB v2.4.3):

(書籤) 物件相等性

討論 Java 中的物件比較,使用 equals() 時會發生的狀況~。

參考資料:
1、物件相等性(上)物件相等性(下)

2013年5月24日 星期五

(書籤) 有關 MongoDB 的 AGPL-3.0 授權條款

今天被問到有關 AGPL-3.0 條款,是否需要讓專案 Open Source 的問題
稍微查了一下之後,發現 OpenFoundary 有蠻詳細的案例解說!
簡而言之,一般狀況下只要沒有對 MongoDB 的資料庫核心做任何修改,原則上並不需要跟著使用 AGPL-3.0 授權並開源。

2013年5月23日 星期四

Forking the JVM

由同事轉述的一篇文章,主要是因為發現我們開發的專案,在某些狀況下會拋出記憶體不足的錯誤,但記憶體使用量似乎還沒有用滿。
後來同事查到了這個可能性,因為我們專案中使用了不少 Runtime.exec() 去存取 Linux 的 Shell Script
這時就會出現 [1] 中描述的狀況,在 exec() 時會先完全複製目前的 JVM 的實體出來
導致在 Runtime.exec() 執行期間,JVM 會跟系統要求兩倍的記憶體,但是實際上可能用不到這麼多
如果這時 JVM 無法 allocate 足夠的記憶體,就會拋出記憶體不足的 Exception 了。

2013年5月20日 星期一

關於 Android 的 BroadcaseReceiver (1)

最近想寫個偵測 Wifi 狀態的服務,不過首先必須先讓服務能夠偵測到系統打開、關閉 Wifi
而要偵測到系統的通知,就必須先對系統註冊 BroadcastReceiver 事件。

2013年4月24日 星期三

(書籤) Xperia Z Root

ROOT:
參考 [1],不過 307 以上版本建議不要用這個 ROOT 方法,雖然還是可以 ROOT,但是像 NFC 韌體會有問題,而且手機會變比較不穩定。

UNROOT:
用 Update Service 強制更新手機一次,更新時選擇恢復原廠設定,就可以把 ROOT 弄掉了。

參考資料:
1、[ROOT] 簡單Root Xperia Z

2013年4月23日 星期二

Galaxy S2 刷機&降版

同事的 Samsung Galaxy S2 官方升級成 Android 4.1.2 之後,發生了一直顯示空間不足,無法開啟媒體播放器之類的 App
網路上查一查之後,發現好像有這個問題的網友清一色都是官方 4.1.2 版的
合理懷疑官方 4.1.2 的韌體有問題~因此要嘗試幫同事降版成官方的 Android 4.0.4 版。

2013年4月19日 星期五

Java 檔案切割與合併

想要實現將一個檔案依照指定長度,分割成很多份,然後再即時把它們合併起來
主要可以參考 [4],基本原理就是切割時計算長度,然後指定長度到達時就改寫到另一個檔案
而合併時可以善用 [4] 描述的 SequenceInputStream!
因為 SequenceInputStream 預設是餵一連串的 InputStream 的物件
因此如果需要做某些特殊的指定,也可以自己重寫一個繼承 InputStream 的客製化 InputStream 餵給它。

2013年4月16日 星期二

在 JAX-RS 取得 Get 參數

在 JAX-RS(Jersey)環境中,要取得 HTTP Request 中,帶在網址上的 Get 參數
可以參考 [1] 的範例,以下轉錄 [1] 的範例的部份內容。

在 JAX-RS 中取得 Header 資訊

在 JAX-RS(Jersey)的環境中,取得 HTTP Request 的 Header 還蠻容易的,可以參考 [1],有兩種方法。
因為沒有特別需要修改的地方,所以以下的範例程式碼基本上是直接從 [1] 複製過來。

2013年4月11日 星期四

利用 JAX-RS 以 Stream 產出檔案下載

在 JAX-RS 的環境中,雖然之前已經有 PO 一篇實現檔案下載的方法 [1]
但該方法實現的方式是把檔案讀取成一個 byte 陣列,再丟給 Response 去回傳。
這會產生一個明顯的問題:這種作法要把整個檔案全部放進記憶體後才能產出,但如果檔案是 10GB 的超大檔案怎麼辦?
因此這次嘗試尋找在 JAX-RS 環境要怎麼辦到以 Stream 來吐檔案下載。

2013年3月29日 星期五

為什麼 long 轉成 float 不會有錯誤?

在資料上顯示,Java 的 primitive type 中,long 的長度是 64-bit、float 長度是 32-bit
但是就資料廣度而言,float 卻比 long 來得大,也就是把 long 直接指給 float 變數時,不使用強制轉型也不會產生任何錯誤。
看起來似乎有點不合理,但其實背後的原因是因為資料的表示方法不同。

2013年3月22日 星期五

實作 MongoDB 的 tail 指令

當資料放在 MongoDB 上時,有時會想要用類似 Linux 的 tail 指令來觀察新增的資料的狀態~
這時可以利用以下的 script 來達成!

2013年3月15日 星期五

用 Daemon 的方式開啟及關閉 MongoDB

開啟 MongoDB:
mongod --smallfiles --fork --logpath /mongo.log
其中 /mongo.log 是讓 MongoDB 寫入 Log 的位置,必須是一個檔案路徑。如果該檔案已經存在時,MongoDB 會自動產生 "檔名*" 的檔案。
例如這裡用的檔名是 mongo.log,因此當檔案已存在時,MongoDB 產生的 Log 檔會是 mongo.log* 的形式。

2013年2月28日 星期四

在 eclipse swt 的介面上放 tool tip

實作 tool tip 時,其實就是在介面上面放一個滑鼠停留的事件
當事件發生時,要求程式畫出一個文字欄位,把 tool tip 要顯示的東西放在欄位上。
範例的滑鼠停留事件可以參考 [1]。

2013年2月25日 星期一

在 OpenJDK 上使用 JavaMail 的問題

目前還在尋找問題中。
已經發現的問題是 JavaMail 在建立 Socket 連線時會噴以下的 Exception:
javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 465;
  nested exception is:
        java.io.IOException: Can't create MailSSLSocketFactory
        at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1966)
        at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:654)
        at javax.mail.Service.connect(Service.java:295)
        at javax.mail.Service.connect(Service.java:176)
        at org.twgogo.jimwayne.mail.MailService.sendMail(MailService.java:266)
        at org.twgogo.jimwayne.mail.MailService.sendMail(MailService.java:157)
        at org.twgogo.jimwayne.main.Main.sendMail(Main.java:52)
        at org.twgogo.jimwayne.main.Main.main(Main.java:23)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:616)
        at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.io.IOException: Can't create MailSSLSocketFactory
        at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:344)
        at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:239)
        at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1929)
        ... 12 more
Caused by: java.security.KeyStoreException: problem accessing trust storejava.io.EOFException
        at sun.security.ssl.TrustManagerFactoryImpl.engineInit(TrustManagerFactoryImpl.java:75)
        at javax.net.ssl.TrustManagerFactory.init(TrustManagerFactory.java:247)
        at com.sun.mail.util.MailSSLSocketFactory$MailTrustManager.<init>(MailSSLSocketFactory.java:333)
        at com.sun.mail.util.MailSSLSocketFactory$MailTrustManager.<init>(MailSSLSocketFactory.java:331)
        at com.sun.mail.util.MailSSLSocketFactory.<init>(MailSSLSocketFactory.java:115)
        at com.sun.mail.util.MailSSLSocketFactory.<init>(MailSSLSocketFactory.java:94)
        at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:337)
        ... 14 more

no object DCH for MIME type multipart/mixed

在嘗試把寄信的程式寫成獨立的 Java 應用程式時,遇到以下的 Exception:
javax.mail.MessagingException: IOException while sending message;
  nested exception is:
 javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed; 

Google 了一下,雖然還蠻快找到解法,不過還不是非常了解這個問題的原因
可能是系統沒有預設告訴 JavaMail 要如何處理特定的 MIME 格式吧。

2013年2月23日 星期六

在 Linux 上檢查某個 port 是否可連接

當遇到某些網路不通的狀況時,可能會想確認是程式的問題還是網路的問題
在 Linux 上可以直接利用 nmap 這個工具來確認。

2013年2月22日 星期五

2013年2月21日 星期四

使用 ddclient 更新 No-IP

ddclient 本身好像沒有特別為 No-IP 設定一個 Protocol,所以設定時可能會不知道要選什麼。

TP-LINK TL-WR1043ND 刷機

第一次嘗試要將分享器刷成第三方韌體,其實還蠻簡單的!XD
教學可以參考 [1],其實沒什麼特別的步驟
就去 dd-wrt 官方的 FTP 上找到要裝的韌體,然後下載「factory-to-ddwrt.bin」
檔名很明顯可以看出,這個檔案就是專門用來把分享器從原廠刷成 dd-wrt 用的。
其中在官方的 FTP 上,每個版本的韌體點進去都可以看到一大堆支援的分享器的資料夾
找到自己的分享器後,就可以下載到對應自己分享器的韌體了。

2013年2月6日 星期三

在 JAX-RS 實現上傳檔案及下載檔案

在 JAX-RS 的環境中,如果遇到需要自行客製化回應的訊息時,可以利用 javax.ws.rs.core.Response 物件來實現。

2013年2月4日 星期一

Same origin policy

依據 Wikipedia [1] 上對於 Same origin policy 的描述如下:
In computing, the same origin policy is an important security concept for a number of browser-side programming languages, such as JavaScript. The policy permits scripts running on pages originating from the same site – a combination of scheme, hostname, and port number[1] – to access each other's methods and properties with no specific restrictions, but prevents access to most methods and properties across pages on different sites.

2013年1月28日 星期一

Java 與 Tomcat 搭配的加密連線:HTTPS 雙向認證

這篇嘗試的是雙向認證的 HTTPS,不過在認證方面仍然是採用自我認證,沒有使用公開的 CA。
其中根據書上所說,雙向認證跟單向認證的差別在於,雙向認證會讓客戶端和伺服器端互相認證對方,單向認證只有認證伺服器(確認伺服器是預期的那個)而已。

PS. 參考資料中,比較建議參考的對象是 [3,5],實際上最後我成功的方法就是綜合 [3,5] 得到的。

2013年1月25日 星期五

在 Java 中把 primitive data type 轉成 byte array

參考 [1] 的方法,[1] 的回應裡有好幾種方法,有使用 NIO 的 ByteBuffer 或使用 BigInteger
但也有人說他的方法比其他使用 "magic" ByteBuffer 好~。
我也不知道哪種好,所以都先記錄起來 XD

2013年1月7日 星期一

在 ubuntu 架設 BIND9 與啟用 DDNS

網路上其實已經有很多 BIND9 的相關安裝資訊了,這裡只是記錄我自己的安裝步驟和遇到的問題與解法。

因為我的目的是要架 DDNS Server,忘了在哪裡查到說 BIND8 要某個版本以上才有支援動態更新
因此這裡就直接安裝 BIND9 了~。

2013年1月5日 星期六

在 JavaScript 中複製物件

在 JavaScript 當中,直接用 = 做物件複製的話,好像是會直接複製整個物件的 referrence
如果想要把一個物件複製出另外一個內容相同的物件,就只能用迴圈的方式自行複製
在 StackOverflow [1] 上找到一段還不錯的參考程式碼(原作者是 A. Levy),內容如下:

2013年1月3日 星期四

手動在 ubuntu 上安裝 Sun JDK

之前在 ubuntu 上安裝 Sun JDK 時,是用手動加入第三方 repository 的方式安裝
不過有時會遇到怎樣都搜尋不到的狀況,因此還是會需要手動自己裝。
要自己裝的方法也不是很難 XD,只有以下幾個步驟而已。也可以直接參考 [2]。