2011年11月20日

Java 源代碼分析系列 - ArrayList add()


  public boolean add(E paramE)
  {
    ensureCapacity(this.size + 1);
    this.elementData[(this.size++)] = paramE;
    return true;
  }


首先可以看到add這個方法的參數是以E開頭,表示該參數可以是任何的類別。
ensureCapacity方法用來確認容量是否足以加入新的節點。
  public void ensureCapacity(int paramInt)
  {
    this.modCount += 1;
    int i = this.elementData.length;
    if (paramInt <= i)
      return;
    Object[] arrayOfObject = this.elementData;
    int j = i * 3 / 2 + 1;
    if (j < paramInt)
      j = paramInt;
    this.elementData = Arrays.copyOf(this.elementData, j);
  }
這段比較有趣的地方是,j = i * 3 / 2 + 1這段,可以看出配置空間的動作並不是每次配置一次(+1)的方式,而是以這個公式去新增,一次可能配出許多個空間預留給下次的加入。
比如說現在List中有10個元素,當我們要加入第十一個元素時,11會被傳入ensureCapacity方法,可以看到if (paramInt <= i),明顯是大於的因此繼續執行,執行到j這行時,j = 11 * 3 / 2 + 1 = 16;因此系統在此時會把原本size為10的陣列變成size為16陣列,在ensureCapacity結束後,新的元素順利加入。

圖解 :
假設目前陣列長度 = 10










add(‘test’); // 第11個元素
加入第11元素因為空間不夠,所組需要從新配置空間,陣列長度 = 16
















add(‘test’); // 第12個元素
空間足夠,無須從新配置,直接加入。
















2011年11月19日

Yum 簡短介紹


Yum (Yellow dog Updater, Modified) 是一個在 Fedora 中的字元前端軟體包管理器。基於 RPM 包管理,能夠從指定的伺服器自動下載 RPM 包並且安裝,可以處理依賴性關聯,並且一次安裝所有依賴的軟體包,無須繁瑣地一次次下載、安裝。

可供 Yum 下載的軟體包包括 Fedora 本身的軟體包以及源自rpmfusion 等非官方軟體倉庫的軟體包,全部是由 Linux社群維護的,並且基本是自由軟體。所有的包都有一個獨立的 GPG 簽名,主要是為了您的系統安全。對於 Fedora core 4 及更高版本的使用者,來自新軟體倉庫的簽名是自動匯入並安裝的。


常用的yum指令


檢查升級
yum check-update
升級
yum update [name]
軟體列表
yum list
軟體訊息
yum info [name]
安裝
yum install [name]
移除
yum remove [name]

2011年11月14日

jQuery - 使用parseJSON注意事項


如果使用jsp語法標記欲將字串丟入parseJSON時必須使用’  ‘將標籤框起來,其餘者(不框、”  ”)皆會引起錯誤。

例如 :
$.parseJSON(‘<%=jsonString%>’)
$.parseJSON(“<%=jsonString%>”)
$.parseJSON(<%=jsonString%>)

2011年11月13日

StringBuffer與StringBuilder差別



在Java字串中,常常在改變的字串會建議使用StringBuffer來減少系統產生新字串並回收舊字串的機制,而StringBuilder有甚麼差別呢?其實他們使用起來的效果是一模一樣的,不管是提供的方法或是宣告的方式,他們的差別在於StringBuilder的效能比StringBuffer更佳,因為StringBuilder使用在單線程的環境下,因此如果你確定你的系統試運行在單一線程的環境時,你可以使用StringBuiler來建構你的字串。



2011年11月11日

Java Arrays的用法


package com.java.test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Test1 {
    public static void main(String[] args) {
      
       int[] array1 = {1,2,3,4,5};
       int[] array2 = {1,2,3,4,5};
       int[] array3 = {2,5,1,4,3};
      
       // 陣列值判斷
       boolean result1 = Arrays.equals(array1, array2);
       boolean result2 = Arrays.equals(array1, array3);
      
       System.out.println(result1);
       System.out.println(result2);
      
       // 排序
       int[] resultArray = array3;
       Arrays.sort(resultArray);
       System.out.println("排序前");
       // 排序前
       for (int i : array3) {
           System.out.print(i+",");
       }
       System.out.println();
       System.out.println("排序後");
       // 排序後
       for (int i : resultArray) {
           System.out.print(i+",");
       }
      
       // 複製陣列
       System.out.println();
       System.out.println("複製陣列");
       int[] copyArray = new int[5];
       System.arraycopy(array1, 0, copyArray, 0, array1.length);
       for (int i : copyArray) {
           System.out.print(i+",");
       }
      
       //
       System.out.println();
       int binarytResult = Arrays.binarySearch(array3, 2);
       System.out.println("二元搜尋結果 " + binarytResult);
      
       // 將陣列值轉為List再透過ArryList變為可變動的陣列
       List<Integer> list = Arrays.asList(1,2,3);
       ArrayList<Integer> list2 = new ArrayList<Integer>(list);
       list2.add(4);
       System.out.println(list2);
      
       // Arrays.fill填滿陣列
       System.out.println();
       int[] fillArray = new int[5];
       Arrays.fill(fillArray, 5);
       for (int i : fillArray) {
           System.out.print(i);
       }
    }
}

openCV2.3.1 VS2010 Win7 32Bit 安裝筆記



安裝步驟:

參考了一些資料後,稍微整理一下。
以下步驟不一定對於每台環境適用,不過可以參考看看。


(一)下載openCV2.3.1.exe 或zip後並解壓縮,並放置到需要的路徑下
如本人放置在C:\Program Files下:opencv2.3資料夾

(二)設定環境參數:
------------------------------------------
為了避免若未來專案有挪到別的環境,且其他環境的openCV資料夾放置於其它路徑導致設定的路徑都要做修改照成許多不便。因此在環境變數的使用者變數多加一個名為openCV的變數並把openCV資料夾的路徑指定下去,如此以後只需設環境變數一個步驟及可,省去許多麻煩。

1.系統 ->進階系統設定 -> 進階 -> 環境變數
2.新增->名稱OpenCV 路徑C:\Program Files\opencv2.3\




若不想採用此方法,則之後造原本方式把全部路徑打出及可。



(三)在VS2010專案下加入:
----------------------------------------
1.openCV執行檔:
專案->XXX專案屬性->進去後專案屬性->偵錯->環境
打入PATH:$(OpenCV)build\x86\vc10\bin  $(OpenCV)為環境變數
若未使用前述方法則是打入:C:\Program Files\opencv2.3\build\x86\vc10\bin













基本上不採用加在系統變數path中,因系統變數會去最後才尋找,會費時,不建議。



----------------------------------------
2.include檔加入:
方法A:
$(OpenCV)build\include
$(OpenCV)build\include\opencv
$(OpenCV)build\include\opencv2



方法B:
只加入 $(OpenCV)build\include
然後另兩個路徑改成:
coding時在include中手動多加opencv\xx.h 及opencv2\xx.h




兩種方式皆可,選其中一項。

----------------------------------------
3.程式庫檔加入
$(OpenCV)build\x86\vc10\lib

下圖:














-----------------------------
(四).連結器->輸入->其他相依性,加入(不一定全部會用到)

opencv_core231d.lib
opencv_imgproc231d.lib
opencv_highgui231d.lib
opencv_ml231d.lib
opencv_video231d.lib
opencv_features2d231d.lib
opencv_calib3d231d.lib
opencv_objdetect231d.lib
opencv_contrib231d.lib
opencv_legacy231d.lib
opencv_flann231d.lib

下圖:


-----------------------------------------
(六).tbb_debug.dll 遺失問題
會有遺失的原因是因為我們通常編譯時採用debug組態,所以專案需用到tbb_debug.dll。
雖然common資料夾下有tbb資料夾,但不會有tbb_debug.dll
tbb_debug.dll不會預先放置在openCV2.3.1

須另外下載檔案->此來源網址:回報遺失tbb_debug.dll

解壓縮後 tbb30_20100406oss資料夾

把此資料夾放置 C:\Program Files\opencv2.3\build\common底下


再次設定在環境變數->使用者變數加入
名稱tbb 路徑:C:\Program Files\opencv2.3\build\common\tbb30_20100406oss\
之後重新開啟Vs2010,並再次到專案屬性->偵錯->環境
加入$(tbb)bin\ia32\vc10

(完)
--------------------------------------------------------------
參考資料:
回報遺失tbb_debug.dll
http://blog.lehu.shu.edu.cn/byman/A345078.html (下載tbb_debug.dll 檔案的來源)

Opencv 2.3.1 Installation(64bit)
http://areshopencv.blogspot.com/2011/10/opencv-231-installation.html



ShareThis