2012年8月29日 星期三

在 MySQL 中做全文檢索

因為想要能夠提供一個 API,能夠回應資料庫當中哪些資料包含了指定的 key
因此查了一些資料,目前是打算用 MySQL 的 FULL TEXT SEARCH 的功能。

要使用 MySQL 的全文檢索,資料表型態必須是 MyISAM,同時要做全文檢索的欄位型態要是 FULLTEXT
然後對該欄位建立 FULLTEXT 類型的索引。(可參考官方文件 [1] 的說明)
使用時可以使用 MATCH (...) AGAINST (...) 敘述來進行全文檢索。
MATCH (...) 裡面指定的是要做全文檢索的欄位名稱,AGAINST (...) 裡面則是指定要搜尋的關鍵句。
它回應的會是一個數字,表示的是欄位內容跟關鍵句的相似度,如果完全不相似就會回傳 0。

2012年8月27日 星期一

Must qualify the allocation with an enclosing instance of type

今天在寫某個程式時遇到的問題~
eclipse 回報「Must qualify the allocation with an enclosing instance of type」這個錯誤訊息
稍微查了一下,是因為我使用了 inner class,然後又在 static 的函式中嘗試使用 inner class 造成的

2012年8月24日 星期五

清除 StringBuilder 的內容

在 Java 的 StringBuilder 中,並沒有提供 clear() 之類的方法可以清除內容
網路上可以查到兩種方法去清除內容,一個是用 delete(),另一個則是 setLength()
官方文件中似乎沒有提到哪種比較好
根據 [1] 的討論,應該是 setLength() 效率會比 delete() 稍高。

2012年8月23日 星期四

JavaScript 驗證數字

要驗證某個變數的值是不是數字,在 JavaScript 當中好像用 Regular Expression 結果會怪怪的
我試了好幾種不同的 Regular Expression,但用 match() 時都有些奇怪的問題
經由同事的協助,發現 [1] 當中 Joel Coehoorn 的回應~

2012年8月22日 星期三

ArrayList 與 LinkedList 的效率比較 (未完待續)

網路上能夠獲得的資料大概都是說 ArrayList 擅長隨機讀取
而 LinkedList 擅長隨機插入和刪除資料~
不過目前根據我自己跑出來的測試結果,刪除我還沒測試
但插入尾端跟隨機插入,在我的測試當中都是 ArrayList 大勝......囧"
原因不明,不知道是不是我的測試方法有問題~

2012年8月20日 星期一

在 Java 中使用 SQLite Database

SQLite Database 是輕量級的關聯式資料庫
在過去要使用關聯式資料庫,都必須架設像是 MySQL、SQL Server 等等的大型資料庫系統
對於某些會被拿來拿去的移動式程式來說相當不合用
雖然有微軟的 Access 可以達到移動式資料庫的目的,但是 Access 本身並沒有索引的設計
效率不佳,能夠承受的同時使用人數也很少~
現在有了 SQLite Database,相對於 Access 提昇了不少效能
但在 Java 中並沒有內建 SQLite 的 JDBC driver,而 SQLite 官方也沒有提供
因此網路上可以找到很多各自發展的 SQLite JDBC driver。
這裡使用的 driver 是 Xerial 的 JDBC driver [1]
使用原因...看起來他更新比較頻繁,而且用的人好像比較多 XD

2012年8月16日 星期四

(暫存) 在一個 App 當中呼叫另一個 App 的函式

最近可能要接下同事負責的 Android 的程式碼,看到裡面拆成兩個專案
一個是前端的 UI,另一個是後端處理的 API
所以先記錄一下呼叫別的 App 的 API 的方法~

1、How to call one android application from another android application

在 Java 驗證 Public IP 的方法

首先要知道的是,依據 RPC 1918 的規範,Private IP 的範圍如下
  • 10.0.0.0 - 10.255.255.255 (10/8 prefix)
  • 172.16.0.0 - 172.31.255.255 (172.16/12 prefix)
  • 192.168.0.0 - 192.168.255.255 (192.168/16 prefix)
因此要找出某台電腦上一系列的 IP 裡面哪些是 Public IP,就要把 Private IP 給濾掉。

2012年8月15日 星期三

java.io.IOException: Server returned HTTP response code: 401 for URL

在測試 HTTP 行為時,出現這個錯誤訊息
「java.io.IOException: Server returned HTTP response code: 401 for URL: ....」
參考 [1] 之後發現是因為網站需要使用基本的驗證(即在網址上面串 http://id:password@domain/ 這種形式)
因此需要加入標頭 Authentication 來讓伺服器做驗證。

2012年8月14日 星期二

使用 Tomcat + Jersey 建立 RESTful 服務

用了好一段時間的 RESTful,但還沒有自己從全白的 Linux 架起來過 XD
記錄一下,要用 Jersey 需要以下四個套件:
  • asm-3.1.jar
  • jersey-core-1.1.2-ea.jar
  • jersey-server-1.1.2-ea.jar
  • jsr311-api-1.1.jar
缺少的話 Jersey 會跑不起來,啟動 Tomcat 時就會噴一堆 Exception ~XD

在 ubuntu 設定 SSH 遠端連線

ubuntu 剛安裝完的時候,預設沒有安裝 SSH 的套件,所以無法透過 putty/pietty 遠端連線
可以透過安裝 openssh-server 套件的方式啟用 SSH 連線。
安裝的指令如下
sudo apt-get install openssh-server

參考資料:
1、ubuntu SSH遠端安全連線安裝及設定

2012年8月13日 星期一

2012年8月9日 星期四

從 Java 動態更新 DNS

延續上一篇「在 Java 上使用 dnsjava 查詢 DNS
這篇一樣是用 dnsjava,目標是實作更新 DNS 的程式。

在更新之前,必須先把 DNS Server 的動態更新功能打開,否則一般狀況 DNS Server 是不允許被更改內容的
我這邊測試是架了一台 Windows 2008 R2,在上面加上 DNS 角色。
設定動態更新的地方如圖所示,紅圈圈的位置就是設定動態更新的地方:


由上圖可以看出,這裡假設 DNS Server 管理的網域是 example.com.tw,IP 範圍是 10.0.1.*。

2012年8月3日 星期五

(暫存) Java 與 DNS

參考資料:
1、第十九章、主機名稱控制者: DNS 伺服器
2、Using Java to get detailed DNS information
3、dnsjava examples
4、DNS queries in Java.
5、Developing JNDI-based Applications
6、DNS Service Provider for the Java Naming Directory Interface (JNDI)
7、DynDNS document:DNS update API
8、no-ip document:DNS integrate
9、(ddwrt) DDNS - How to setup Custom DDNS settings using embedded inadyn - HOWTO
10、How to access domain DNS protocol in pure java
11、Accessing the Dusty Corners of DNS with Java

在討論如何透過 Java 連接 DNS 之前,必須先知道 DNS 的運作原理
詳細的說明可以參考鳥哥寫的教學 [1] 。
其中比較需要注意的是一般的 DNS 查詢有分成 NS(Name Server)和 A(Address)
NS 回應的是下一層的 DNS 伺服器位址,A 才是真正的目的地位址。
而如果自己架一個新的 DNS 伺服器,必須向上一層的 DNS 伺服器申請領域查詢授權
也就是在上一層的 DNS 裡面設定 NS,把某個子網域名稱指定給新架的 DNS 伺服器。
假設上一層 DNS 的網域是 abc.com,而我新架了一個 DNS 伺服器,想要管理 xyz.abc.com
這時要先去 abc.com 上申請查詢授權,等 abc.com 的管理員設定了 xyz.abc.com 的 NS。
設定完成以後,如果有 request 在詢問 *.xyz.abc.com 這個網域名稱
abc.com 的 DNS 都會回應 NS,即叫它去問 xyz.abc.com 的 DNS 伺服器。
而如果 abc.com 回應的是 A,則是回應對方說你要的目標就在這個位址,DNS 查詢就結束了。
(更詳細的說明請參閱鳥哥的 19.1.3 小節!XD)

補充:
雖然上面列了一堆參考資料,不過最後還是放棄 JNDI 改用 dnsjava 了 XD
有關 dnsjava 的範例請參閱 dnsjava 標籤

2012年8月1日 星期三

在 Linux 中監控系統資源:使用 dstat

參考資料:
1、dstat
2、How to use dstat to monitor your Linux/UNIX server
3、Linux System monitoring using Dstat
4、http://pkgs.repoforge.org/dstat/

因為需要系統資源吃比較少的程式來收集資訊,所以找到了 dstat 這個工具(官網請參考 [1])!
我目前的執行環境是 Fedora,參考的安裝方法是 [3]

Can't specify target table for update in FROM clause

參考資料:
1、Mysql error 1093 - Can't specify target table for update in FROM clause
2、PHP/MYSQL using an array in WHERE clause

原本我想要在資料表裡面把符合某個條件的值撈出來,然後把他們從資料庫裡刪掉
於是下了類似這樣的 SQL Statement:
DELETE FROM table WHERE id IN (SELECT * FROM table WHERE time < 11111111);
其實這段 SQL Statement 很明顯根本不用用到 SELECT...XD
只是...反正這只是個範例就是了,不要太在意!XD

列舉 HashMap

參考資料:
1、遍历HashMap及获取所有的Key值
2、Java: iterate through HashMap

某些時候會想要對 HashMap 裡面的所有資料做某些處理,這時首先必須先把 HashMap 的內容列舉出來
列舉方法如下:
HashMap<Object, Object> mp = new HashMap<Object, Object>();
Iterator it = mp.entrySet().iterator();
while (it.hasNext()) {
    Map.Entry pairs = (Map.Entry)it.next();
    System.out.println(pairs.getKey() + " = " + pairs.getValue());
    it.remove();
}

另外 [1] 有提到另一種列舉方法是透過呼叫 HashMap 的 keySet().toArray()
不過似乎有效率上的差異,詳情可以自行參考 [1] 的內容。