<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>諾雅的隨手札記-noah&apos;s blog</title>
    <link rel="alternate" type="text/html" href="http://blog.db.idv.tw/" />
    <link rel="self" type="application/atom+xml" href="http://blog.db.idv.tw/atom.xml" />
    <id>tag:blog.db.idv.tw,2008-07-06://1</id>
    <updated>2010-12-24T09:44:42Z</updated>
    <subtitle>菩堤本無樹　明鏡亦非台　本來無一物　何處惹塵埃</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Personal 4.12</generator>

<entry>
    <title>淺談 PO BO VO Entity DTO POJO DAO</title>
    <link rel="alternate" type="text/html" href="http://blog.db.idv.tw/2010/12/java-po-bo-vo-entity-dto-pojo-dao.html" />
    <id>tag:blog.db.idv.tw,2010://1.57</id>

    <published>2010-12-24T10:28:48Z</published>
    <updated>2010-12-24T09:44:42Z</updated>

    <summary>在撰寫 Java商務應用程式時，常會聽到 PO、VO、POJO... 一推有「O」的名稱，對於初學者來講是非常頭痛的，下面試著簡單說明常聽到的各種「O名稱」。 PO(Persistant Object) 一個 PO 即資料庫裡的一筆記錄。 好處是可以把一筆記錄當作一個物件處理，可以方便的轉換成其他物件。 BO(Business Object) 主要作用是把業務邏輯封裝為一個物件。這個物件可以包括一個或多個其他的物件。 比如一個簡歷，有教育經歷、工作經歷等等 我們可以把教育經歷對應一個PO，工作經歷對應一個PO。 建立一個對應簡歷的BO物件處理簡歷，每個BO包含這些PO。 這樣處理業務邏輯時，我們就可以針對BO去處理。 VO(Value Object) ViewObject表現層物件 主要對應介面顯示的資料物件。對於一個WEB頁面，或者SWT、SWING的一個介面，用一個VO物件對應整個介面的值。 Entity 與 VO： Entity 帶有 Identity，VO 沒有帶 Identity，也就是說 Entity 只有異動了 Identity 才算是不同物件，但 VO 只要有屬性被變更了，就視為是不同物件 DTO(Data Transfer Object) 主要用於遠端調用等需要大量傳輸物件的地方。 比如我們一張表有100個欄位，那麼對應的PO就有100個屬性。...</summary>
    <author>
        <name>noah</name>
        
    </author>
    
        <category term="Java" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://blog.db.idv.tw/">
        <![CDATA[<p>在撰寫 Java商務應用程式時，常會聽到 PO、VO、POJO... 一推有「O」的名稱，對於初學者來講是非常頭痛的，下面試著簡單說明常聽到的各種「O名稱」。</p>
<p><br/>
PO(<a href="javascript:google('Persistant Object po')">Persistant Object</a>)
<br/>一個 PO 即資料庫裡的一筆記錄。
<br/>好處是可以把一筆記錄當作一個物件處理，可以方便的轉換成其他物件。</p>
<p><br>
BO(<a href="javascript:google('Business Object bo')">Business Object</a>) <br/>主要作用是把業務邏輯封裝為一個物件。這個物件可以包括一個或多個其他的物件。
<br/>比如一個簡歷，有教育經歷、工作經歷等等
<br/>我們可以把教育經歷對應一個PO，工作經歷對應一個PO。
<br/>建立一個對應簡歷的BO物件處理簡歷，每個BO包含這些PO。
<br/>這樣處理業務邏輯時，我們就可以針對BO去處理。
<br>
</p>
<p>  <br>
VO(<a href="javascript:google('Value Object vo')">Value Object</a>) <br/>ViewObject表現層物件
<br/>
主要對應介面顯示的資料物件。對於一個WEB頁面，或者SWT、SWING的一個介面，用一個VO物件對應整個介面的值。</p>
<p><a href="javascript:google('entity object vo')">Entity</a> 與 VO： <br/>Entity 帶有 Identity，VO 沒有帶 Identity，也就是說 Entity 只有異動了 Identity 才算是不同物件，但 VO 只要有屬性被變更了，就視為是不同物件</p>
<p><br>
DTO(<a href="javascript:google('Data Transfer Object dto')">Data Transfer Object</a>) <br/>主要用於遠端調用等需要大量傳輸物件的地方。
<br/>比如我們一張表有100個欄位，那麼對應的PO就有100個屬性。
<br/>但是我們介面上只要顯示10個欄位，用戶端用WEB service來獲取資料，不需要將整個PO物件傳遞到用戶端，
<br/>此時即可以用只有10個屬性的DTO來傳遞結果到用戶端，如此亦不會暴露服務端表結構。到達用戶端以後，如果用這個物件來對應介面顯示，那此時它的身份就轉為VO</p>
<p><br>
POJO(<a href="javascript:google('Plain Old Java Object pojo')">Plain Old Java Object</a> or Plain Ordinary Java Object) <br/>只有屬性及getter、setter 的 Java Object
<br/>一個POJO持久化以後就是PO
<br/>直接用它傳遞、傳遞過程中就是DTO
<br/>
直接用來對應表示層就是VO</p>
<p><br>
DAO(<a href="javascript:google('Data Access Object dao')">Data Access Object</a>) <br/>
主要用來封裝對資料庫的訪問。通過它可以把POJO持久化為PO，用PO組裝出來VO、DTO</p>]]>
        <![CDATA[<p><br>
以下用一張簡單的圖來說明各種物件的關係 <br/><img src="/upload/2010/DataObjectDiagram.gif" border="0"></p>
<p>&nbsp;</p>
<p>部份資料參考來源：  <a href="http://jeoff.blog.51cto.com/186264/88517" target="_blank">http://jeoff.blog.51cto.com/186264/88517</a><br/>
<br/>
</p>]]>
    </content>
</entry>

<entry>
    <title>Eclipse安裝Plugin</title>
    <link rel="alternate" type="text/html" href="http://blog.db.idv.tw/2010/12/eclipseplugin.html" />
    <id>tag:blog.db.idv.tw,2010://1.56</id>

    <published>2010-12-22T04:11:46Z</published>
    <updated>2010-12-24T09:45:34Z</updated>

    <summary>一般而言安裝 Eclipse Plugin 最快的方式是透過 Update Site ，也就是先找到要安裝的Plugin所提供的Update Site Url來安裝。 安裝步驟一般為：執行 Eclipse 後，按上方選單的「Help」然後選擇「Install New Software」 之後看到下方的視窗，再按「Add」： 按了「Add」後會出現下方的 Add Repository 視窗，然後在 Name 輸入 Plugin 名稱（可隨便 Key，但建議是輸入有意義的Name)，然後在 Location 輸入 Update Site 的 Url。輸入完畢後按「OK」 待出現下方的選項後，代表 Update Site 的 Url 是正確的，然後選擇要安裝的 Plugin ，下面範例安裝的是「FreeMarker IDE」及「Hibernate Tools」。...</summary>
    <author>
        <name>noah</name>
        
    </author>
    
        <category term="軟體" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://blog.db.idv.tw/">
        <![CDATA[<p>一般而言安裝 Eclipse Plugin 最快的方式是透過 Update Site ，也就是先找到要安裝的Plugin所提供的Update Site Url來安裝。<br />
</p>
<p> 安裝步驟一般為：執行 Eclipse 後，按上方選單的「Help」然後選擇「Install New Software」<br />
  <img src="/upload/2010/eclipse121.jpg" border="0" /></p>
<p>之後看到下方的視窗，再按「Add」：<br />
<img src="/upload/2010/eclipse122.jpg" border="0" /></p>
<p>按了「Add」後會出現下方的 Add Repository 視窗，然後在 Name 輸入 Plugin 名稱（可隨便 Key，但建議是輸入有意義的Name)，然後在 Location 輸入 Update Site 的 Url。輸入完畢後按「OK」<br />
  <img src="/upload/2010/eclipse123.jpg" border="0" /><br />
</p>
<p>待出現下方的選項後，代表 Update Site 的 Url 是正確的，然後選擇要安裝的 Plugin ，下面範例安裝的是「FreeMarker IDE」及「Hibernate Tools」。<br />
<img src="/upload/2010/eclipse125.jpg" border="0" /></p>
<p>上方按下「Next」原則上即會開始安裝 Plugin ，有時候可能會出現 License 的確認視窗，大多狀況只需要按接受 (I Accept)即可。<br />
</p>  ]]>
        <![CDATA[<br />
<p>接下來看一下第二種安裝方式「直接放檔案到 Eclipse 下的 plugin 或 features 資料夾」，這種方式比較簡單，只需要拿到要安裝的 Plugin ，只需要解開後，依序擺放到 plugin 或 features 資料夾，然後重啟 Eclipse 即可。<br />
  <br />
</p>
<p>不管是透過 Update Site 或則放檔案到 plugin or features 都屬於「侵入式」安裝，如果 Plugin 互相衝突需要移掉某一個時，有可能造成移除不全或移除錯誤的風險。Eclipse 有提供另一種更好的安裝方式，即過 Eclipse 下的 dropins 資料夾來安裝。</p>
<p>以安裝 FreeMarker IDE 為例，首先在 dropins 資料夾下產生一個叫「FreeMarkerIDE.link」的文字檔案，內容輸入「path=xxxxx」xxxx 為 plugin 本機擺放的位置，例如是放在「D:\EclipsePlugin\FreeMarkerIDE-1.1.0.v201006011046R-H111-GA」下，那麼內容即為「D:/EclipsePlugin/FreeMarkerIDE-1.1.0.v201006011046R-H111-GA」，並且在FreeMarket....GA 這個資料夾下需再建一層叫「eclipse」資料夾，然後將下載回來的 Plugin 放在這裡面。資料夾結構如下圖<br />
<img src="/upload/2010/FreemarkerIDEFolder.jpg" /></p>
設定好 dropins 下的 link 檔案後，在啟動 Eclipse 時即會自動載入此 plugin ，如果臨時想要將此 plugin 拿掉也只需要拿掉此 link file 。<br/>
另外因為是非侵入式安裝，也就是說 Eclipse 及 Plugin 可獨立升級(Upgrade)，完全不需要擔心是否會造成檔案版本的問題。]]>
    </content>
</entry>

<entry>
    <title>Java的Checked  Exception與Runtime Exception</title>
    <link rel="alternate" type="text/html" href="http://blog.db.idv.tw/2010/12/javachecked-exception-runtime.html" />
    <id>tag:blog.db.idv.tw,2010://1.55</id>

    <published>2010-12-21T04:30:12Z</published>
    <updated>2010-12-21T06:10:08Z</updated>

    <summary>Java將Exception分成二大部份，一種為「Checked Excepiton」，也就是編譯時會提醒您需要加以處理的Exception，例如以下二行程式， Class.forName(driver); Connection conn = DriverManager.getConnection(connString,account,password ); 其中第一行編譯時或開發工具時(如Escape)會提醒「Unhandled exception type ClassNotFoundException」，第二行則會提醒「 Unhandled exception type SQLException」。只要是這類型的，一般都稱為 Checked Exception 。所以Checked Exception 的特點即有問題要額外處理或則往上層拋例外(throws Exception)。 另一種 Exception 則稱為「Runtime Exception」，顧名思義即在執行週期時才會發生的 Exception，常見的 Runtime Exception 為 NullPointerException。Runtime Excepiton 的特點與 Checked Exception 剛好相反，不需在開發週期強制放 try-catch 區段或則往上層拋例外(throws Exception)。...</summary>
    <author>
        <name>noah</name>
        
    </author>
    
        <category term="Java" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://blog.db.idv.tw/">
        <![CDATA[<p>Java將Exception分成二大部份，一種為「Checked Excepiton」，也就是編譯時會提醒您需要加以處理的Exception，例如以下二行程式，<br />
  <pre><div class="syntax">Class.forName(driver);
Connection conn = DriverManager.getConnection(connString,account,password );
</div></pre>
  <p>其中第一行編譯時或開發工具時(如Escape)會提醒「Unhandled exception type ClassNotFoundException」，第二行則會提醒「
  Unhandled exception type SQLException」。只要是這類型的，一般都稱為 Checked Exception 。所以Checked Exception 的特點即有問題要額外處理或則往上層拋例外(throws Exception)。</p>
  <p><br />
  另一種 Exception 則稱為「Runtime Exception」，顧名思義即在執行週期時才會發生的 Exception，常見的 Runtime Exception 為 NullPointerException。Runtime Excepiton 的特點與 Checked Exception 剛好相反，不需在開發週期強制放 try-catch 區段或則往上層拋例外(throws Exception)。</p>]]>
        <![CDATA[<p><br />
  接下來看看以下的範例，method1 &amp; method3 皆為典型的 Checked Excepiton、method2 則為 Runtime Exception。</p>
<pre><div class="syntax"><font color="#7F0055">class</font> CheckedException extends Exception{
	<font color="#7F0055">public</font> CheckedException() {}
	<font color="#7F0055">public</font> CheckedException(String msg){
		super(msg);
	}
}

<font color="#7F0055">class</font> ExceptionalClass{
	<font color="#3F7F5F">// checked exception</font>
	<font color="#7F0055">public</font> <font color="#7F0055">void</font> method1(String msg) <font color="#7F0055">throws</font> CheckedException {
		<font color="#7F0055">throw</font> <font color="#7F0055">new</font> CheckedException(<font color="#2A00FF">"checkException拋出來的Exception!!"</font>);
	}

	<font color="#3F7F5F">// runtime exception</font>
	<font color="#7F0055">public</font> <font color="#7F0055">void</font> method2(String msg){
		if (msg == <font color="#7F0055">null</font>) {
			<font color="#7F0055">throw</font> <font color="#7F0055">new</font> RuntimeException(<font color="#2A00FF">"Message is null !!"</font>);
		}
	}

	<font color="#3F7F5F">// checked exception</font>
	<font color="#7F0055">public</font> <font color="#7F0055">void</font> method3(String msg) <font color="#7F0055">throws</font> CheckedException{
		method1(msg);
	}
}

<font color="#7F0055">public</font> <font color="#7F0055">class</font> ExceptionTest {

	<font color="#7F0055">public</font> <font color="#7F0055">static</font> <font color="#7F0055">void</font> main(String[] args) {
		ExceptionalClass example = new ExceptionalClass();
		try {
			example.method1(<font color="#7F0055">null</font>);
			example.method3(<font color="#7F0055">null</font>);
		}
		catch(CheckedException ex){
			ex.printStackTrace(System.out);
		}
		example.method2(<font color="#7F0055">null</font>);

		System.out.println(<font color="#2A00FF">"Program run done!!"</font>);
	}

}
</div>
</pre>
<p>至於自行開發底層元件時，到底要用 Checked Exception 還是 Runtime Exception 實際上看需求或喜好而定。但就個人角度來看，雖然 Checked Exception 看似比較能掌握例外，但是過多的 Checked Exception 的處理，會降低程式的可讀性。所以應該還是看狀況來決定例外處理方式。</p>]]>
    </content>
</entry>

<entry>
    <title>Java Catch OutOfMemoryError</title>
    <link rel="alternate" type="text/html" href="http://blog.db.idv.tw/2010/12/java-catch-outofmemoryerror.html" />
    <id>tag:blog.db.idv.tw,2010://1.54</id>

    <published>2010-12-02T05:20:52Z</published>
    <updated>2010-12-02T07:00:45Z</updated>

    <summary><![CDATA[在撰寫 Java 程式時，遇到 java.lang.OutOfMemoryError Heap Memroy爆掉時，如果要額外作一些處理，可以透過以下二種方法 方法一： try{ //new test().run(); // 會產生outofmemory的 code throw new java.lang.OutOfMemoryError(); }catch ( final OutOfMemoryError e ){ System.out.println("Exceptin 攔截成功了!!"); } 方法二 try{ //new test().run(); // 會產生outofmemory的 code throw new java.lang.OutOfMemoryError(); }catch(Exception ex){ System.out.println(&quot;這段 code 會被執行嗎?&quot;);...]]></summary>
    <author>
        <name>noah</name>
        
    </author>
    
        <category term="Java" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://blog.db.idv.tw/">
        <![CDATA[<p>在撰寫 <a href="javascript:google('java');">Java</a> 程式時，遇到 <a href="javascript:google('java.lang.OutOfMemoryError');">java.lang.OutOfMemoryError</a> Heap Memroy爆掉時，如果要額外作一些處理，可以透過以下二種方法</p>

<pre>方法一：
<div class="syntax">try{
    //new test().run();  // 會產生outofmemory的 code
    throw  new java.lang.OutOfMemoryError();
}catch ( final OutOfMemoryError e ){ 
    System.out.println("Exceptin 攔截成功了!!");
}
</div>
</pre>
<pre>方法二
<div class="syntax">try{
    //new test().run();  // 會產生outofmemory的 code
    throw  new java.lang.OutOfMemoryError();
}catch(Exception ex){
    System.out.println(&quot;這段 code 會被執行嗎?&quot;);
}finally {
    System.out.println("執行 finally");
}
</div>
</pre>
<p>方法一可以將 Exception 整個攔截下來，並且程式會繼續執行。但是要留意事，如果記憶體沒有正常被釋放，則很快的程式還是會因為 Heap 不足再度爆掉。</p>
<p>方法二裡的 catch 區段程式並不會被執行，而會直接執行 finally 裡的 code ，並且會再往上層拋 <a href="javascript:google('java.lang.OutOfMemoryError');">java.lang.OutOfMemoryError</a> 的 Exception </p>
<p>一般而言，如果是 <a href="javascript:google('java');">Java</a> AP 如果在預知 Memory 會爆掉的地方給予適當的處理，處理方法如發信、寫 Log 或則丟訊息給 User ，這對於使用者而言應該是比較人性化的^^。至於要使用那一種的方式來處理端看需求而定。</p>]]>
        
    </content>
</entry>

<entry>
    <title>UltraEdit 列印時顯示行號</title>
    <link rel="alternate" type="text/html" href="http://blog.db.idv.tw/2010/11/ultraedit.html" />
    <id>tag:blog.db.idv.tw,2010://1.53</id>

    <published>2010-11-26T10:40:07Z</published>
    <updated>2010-11-26T10:42:13Z</updated>

    <summary>UltraEdit 列印時，如果要列印行號只需照下面方法設定即可。 一、設定顯示「行數」 選上方主選單： 「檢視」=&gt;「顯示行號」 「View」=&gt;「Display Line Number」 二、列印設定 選上方主選單： 「檔案」=&gt;「列印設定(組態)」=&gt;「頁面設定」=&gt;「列印行號」 打勾 「File」=&gt;「Print Setup/Configuration」=&gt;「Page Setup」=&gt;「Print Line Numbers」打勾...</summary>
    <author>
        <name>noah</name>
        
    </author>
    
        <category term="軟體" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://blog.db.idv.tw/">
        <![CDATA[UltraEdit 列印時，如果要列印行號只需照下面方法設定即可。
<br/>
<br/>一、設定顯示「行數」
<br/>選上方主選單：
<br/>  「檢視」=>「顯示行號」
<br/>  「View」=>「Display Line Number」
<br/>
<br/>二、列印設定
<br/>選上方主選單：
<br/> 「檔案」=>「列印設定(組態)」=>「頁面設定」=>「列印行號」 打勾
<br/> 「File」=>「Print Setup/Configuration」=>「Page Setup」=>「Print Line Numbers」打勾
<br/>]]>
        
    </content>
</entry>

<entry>
    <title>FireFox好用的Plugin</title>
    <link rel="alternate" type="text/html" href="http://blog.db.idv.tw/2010/11/firefoxplugin.html" />
    <id>tag:blog.db.idv.tw,2010://1.52</id>

    <published>2010-11-03T12:14:13Z</published>
    <updated>2010-11-03T12:20:01Z</updated>

    <summary>FireFox 擁有非常多的Plugin，這些 Plugin 可以讓 FireFox 變成網頁程式開發人員的好幫手。 以下就來看看我常用的 FireFox Plugin。 要安裝 Plugin ，可以從 FireFox 的上方選單選擇「工具」=&gt;「附加元件」=&gt;「取得元件」=&gt;「瀏覽所有附加元件」，然後會進到Plugin的下載頁面，當然也可以直接在瀏覽器列輸入「https://addons.mozilla.org/」。 (1)Firebug Firebug 是 FireFox 裡好用的開發工具，可以透過此Plugin快速的針對 JavaScript、Html、CSS 作偵錯或調校。 (2)Firecookie Firecookie 是 Firebug 的延伸工具。Firebug 本身沒有 cookie 工具，無法直接看到目前頁面的 Cookie 狀態，透過 Firecooki 即可以看到。並且可以透過 Firecookie 作 Cookie 內容的編輯 (3)HttpFox Firefox 裡的一個簡單...</summary>
    <author>
        <name>noah</name>
        
    </author>
    
        <category term="軟體" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://blog.db.idv.tw/">
        <![CDATA[FireFox 擁有非常多的Plugin，這些 Plugin 可以讓 FireFox 變成網頁程式開發人員的好幫手。
<br/>以下就來看看我常用的 FireFox Plugin。
<br/>
<br/>要安裝 Plugin ，可以從 FireFox 的上方選單選擇「工具」=>「附加元件」=>「取得元件」=>「瀏覽所有附加元件」，然後會進到Plugin的下載頁面，當然也可以直接在瀏覽器列輸入「<a href="https://addons.mozilla.org/" target="_blank">https://addons.mozilla.org/</a>」。
<br/>
<br/>
<br/>(1)<a href="javascript:google('Firefox Firebug');">Firebug</a>
<br/>Firebug 是 FireFox 裡好用的開發工具，可以透過此Plugin快速的針對 JavaScript、Html、CSS 作偵錯或調校。
<br/>
<br/>(2)<a href="javascript:google('Firefox Firecookie');">Firecookie</a>
<br/>Firecookie 是 Firebug 的延伸工具。Firebug 本身沒有 cookie 工具，無法直接看到目前頁面的 Cookie 狀態，透過 Firecooki 即可以看到。並且可以透過 Firecookie 作 Cookie 內容的編輯
<br/>
<br/>(3)<a href="javascript:google('Firefox HttpFox');">HttpFox</a>
<br/>Firefox 裡的一個簡單 Http Analyzer 工具，有點類似簡易版的 <a href="javascript:google('http watch');">Http Watch</a>
<br/>
<br/>(4)<a href="javascript:google('Firefox View Dependencies');">View Dependencies</a>
<br/>查看目前頁面裡的物件與網頁原始碼的直接關聯
<br/>
<br/>(5)<a href="javascript:google('Firefox StatusbarEx');">StatusbarEx</a>
<br/>一些有用的信息顯示狀態欄的Firefox，如內存使用的系統與 Firefox自身，網絡速度，系統電源狀態等
<br/>可以用來看目前瀏覽器占用多少的系統資源或內存，一般而言，都只打開「顯示firefox的內存占用、顯示 firefox的CPU占用，固定字符串長度」這三項設定，其他的不用打開。
<br/>
<br/>(6)<a href="javascript:google('Firefox IE Tab Plus');">IE Tab Plus</a>
<br/>基於IETab 開發的增強版本，除具備 IETab 的全部功能外，還可以在IE 引擎中用Adblock Plus 過濾廣告，以及同步Cookie 使得切換到IE 引擎時不需要重新登錄。
<br/>
<br/>(7)<a href="javascript:google('Firefox Greasemonkey');">Greasemonkey</a>
<br/>允許網頁執行自訂定的JavaScript，此JavaScript為放在 Local 的一段 Script code 。
<br/>
<br/><br/>
<br/>除了以上好用的Plugin外，Firefox 還有一個好用設定即「最小化後占用的釋放內存」，只需在 FireFox 的網址列輸入「<font color=blue>about:config</font>」，然後在下面的地方新增「<font color=blue>config.trim_on_minimize</font>」，類型使用「真假值(Boolean)」，並將值設為「<font color=blue>true</font>」，設定好後只需要將Firefox重開以後只要最小化Firefox即會釋放掉多餘使用的內存。
<br/><br/><img src="/upload/2010/firefox_about_config.jpg" border="0">
<br/>]]>
        
    </content>
</entry>

<entry>
    <title>SQL Server 執行計畫的應用</title>
    <link rel="alternate" type="text/html" href="http://blog.db.idv.tw/2010/11/sql-server.html" />
    <id>tag:blog.db.idv.tw,2010://1.51</id>

    <published>2010-11-03T04:00:02Z</published>
    <updated>2010-11-04T02:33:06Z</updated>

    <summary><![CDATA[在 SQL Server 要使用執行計畫是很簡單的，不像 Oracle 那麼的麻煩，只需要在 SQL Query Analyzer 工具裡即可使用執行計畫。 首頁先啟動「SQL Query Analyzer」，進到主畫面後，選擇上面的選單「Query」=&gt; 然後選擇「Show Execution Plan」，如下圖所示： &nbsp; 之後只需在主視窗隨便輸入一個語法，如 select getdate() 或您要的語法，即可在主視窗下面看到執行計畫。如下圖 &nbsp; 因SQL Server 支援一次執行多個 SQL Statement 所以可以一次執行多個指令，來作直接的效能比較。...]]></summary>
    <author>
        <name>noah</name>
        
    </author>
    
        <category term="DB" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://blog.db.idv.tw/">
        <![CDATA[<p>在 SQL Server 要使用執行計畫是很簡單的，不像 Oracle 那麼的麻煩，只需要在 SQL Query Analyzer 工具裡即可使用執行計畫。</p>
<p>首頁先啟動「SQL Query Analyzer」，進到主畫面後，選擇上面的選單「Query」=&gt; 然後選擇「Show Execution Plan」，如下圖所示：</p>
<p><img src="/upload/2010/sql_execute_paln_1.jpg" border="0" /></p>
<p>&nbsp;</p>
<p>之後只需在主視窗隨便輸入一個語法，如 select getdate() 或您要的語法，即可在主視窗下面看到執行計畫。如下圖</p>
<p><img src="/upload/2010/sql_execute_paln_2.jpg" border="0" /></p>
<p>&nbsp;</p>
<p>因SQL Server 支援一次執行多個 SQL Statement 所以可以一次執行多個指令，來作直接的效能比較。</p>
<p><img src="/upload/2010/sql_execute_paln_3.jpg" border="0" /></p>]]>
        
    </content>
</entry>

<entry>
    <title>Oracle SQL*Plus 執行計畫的應用</title>
    <link rel="alternate" type="text/html" href="http://blog.db.idv.tw/2010/11/oracle-sqlplus.html" />
    <id>tag:blog.db.idv.tw,2010://1.50</id>

    <published>2010-11-01T14:35:56Z</published>
    <updated>2010-11-04T02:32:57Z</updated>

    <summary>使用Oracle資料庫時，常常會需要比較不同SQL語法的效能，除了只看執行時間外，尚可透過執行計畫的觀察來研判那一個語法效能會比較好，在Oracle資料庫裡就有 SQL*Plus 工具可以作簡易的執行計畫的查詢。以下就來看看在Oracle DB 該如何使用查詢計畫 一、set autotrace語法及參的說明 1、語法： SET AUTOTRACE {OFF | ON | TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]] 參數說明： SET AUTOTRACE OFF： 此為預設值，即關閉Autotrace功能 SET AUTOTRACE ON ： 同時輸出執行計畫、統計資訊及執行結果。 SET AUTOTRACE ON EXPLAIN： 打開執行計畫報表，顯示語法執行結果，但不顯示統計資訊。 SET AUTOTRACE ON STATISTICS： 打開統計資訊報表，顯示語法執行結果，但不顯示執行計畫。 SET AUTOTRACE TRACEONLY...</summary>
    <author>
        <name>noah</name>
        
    </author>
    
        <category term="DB" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://blog.db.idv.tw/">
        <![CDATA[<p>使用Oracle資料庫時，常常會需要比較不同SQL語法的效能，除了只看執行時間外，尚可透過執行計畫的觀察來研判那一個語法效能會比較好，在Oracle資料庫裡就有 SQL*Plus 工具可以作簡易的執行計畫的查詢。<br/>以下就來看看在Oracle DB 該如何使用查詢計畫</p>
<p>  一、set autotrace語法及參的說明<br />
  1、語法： SET AUTOTRACE {OFF | ON | TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]<br />
  參數說明：<br />
<font color="blue">SET AUTOTRACE OFF</font>： 此為預設值，即關閉Autotrace功能<br />
<font color="blue">SET AUTOTRACE ON</font> ： 同時輸出執行計畫、統計資訊及執行結果。<br />
<font color="blue">SET AUTOTRACE ON EXPLAIN</font>： 打開執行計畫報表，顯示語法執行結果，但不顯示統計資訊。<br />
<font color="blue">SET AUTOTRACE ON STATISTICS</font>： 打開統計資訊報表，顯示語法執行結果，但不顯示執行計畫。<br />
<font color="blue">SET AUTOTRACE TRACEONLY</font> ： 顯示執行計畫和統計資訊，但不顯示命令的執行結果，但在traceonly的後面仍然可以追加explain或者statistics參數，等同於set autotrace on [explain|statistics]但是不顯示執行結果。</p>
<p><br />
  2、AUTOTRACE Statistics常用列解釋<br />
  <font color="blue">db block gets</font> ： 從buffer cache中讀取的 block 的數量<br />
  <font color="blue">consistent gets</font> ： 從buffer cache中讀取的 undo 資料的 block 的數量<br />
  <font color="blue">physical reads</font> ： 從磁碟讀取的 block 的數量<br />
  <font color="blue">redo sizeDML</font> ： 生成的 redo 的大小<br />
  <font color="blue">sorts (memory)</font> ： 在記憶體執行的排序量<br />
<font color="blue">sorts (disk)</font> ： 在磁片上執行的排序量</p>
<p></p>
<p>二、Explain plan for 的使用<br />
如果希望不要執行指令，然後依然可以看執行計畫，那可以使用 Explain plan 語法，語法如下 Sample：<br />
<font color="blue">explain plan for</font> select sysdate from dual;<br />
執行完後，需再下下面語法，查看執行計劃的內容：<br />
<font color="blue">select * from table(dbms_xplan.display());</font></p>]]>
        
    </content>
</entry>

<entry>
    <title>Windows XP搜尋方式變更為搜尋所有檔案</title>
    <link rel="alternate" type="text/html" href="http://blog.db.idv.tw/2010/04/windows-xp-1.html" />
    <id>tag:blog.db.idv.tw,2010://1.49</id>

    <published>2010-04-15T13:39:13Z</published>
    <updated>2010-04-15T14:01:46Z</updated>

    <summary><![CDATA[Windows XP 不知從何時開始，用檔案總管搜尋檔案內容時，只會搜尋一些已知檔案的內容。如果是非系統已知的檔案類型，預設狀況下是不搜尋的，要解決這個怪現象，有二個方式可以設定。 方法一：變更機碼。將某類型檔案變成要搜尋的對象 在要允許搜尋的檔案機碼設定裡，設定「PersistentHandler」的機碼的預設值，如下的設定值：(以下為存文字檔的範例) [HKEY_CLASSES_ROOT\.txt\PersistentHandler] @=&quot;{5e941d80-bf96-11cd-b579-08002b30bfeb}&quot; 如果不敢修改機碼，可參照第二方法比較簡單也安全^^ 方法二：所有檔案都納入搜尋（推薦用此方法，一勞永逸） 先到我的電腦，然右鍵，然後選「管理」，如下圖 二、在電腦管理裡，選擇「索引服務」，並按右鍵後選擇「內容」 三、進到索引服務內容後將「含有未知副檔名的索引檔案」給勾起來，然後按「確定」再將剛打開的視窗全關閉。 &nbsp; 相關資訊可以參閱MS 的官方文件: http://support.microsoft.com/kb/309173/zh-tw...]]></summary>
    <author>
        <name>noah</name>
        
    </author>
    
        <category term="軟體" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://blog.db.idv.tw/">
        <![CDATA[<p>Windows XP 不知從何時開始，用檔案總管搜尋檔案內容時，只會搜尋一些已知檔案的內容。如果是非系統已知的檔案類型，預設狀況下是不搜尋的，要解決這個怪現象，有二個方式可以設定。</p>
<p>方法一：變更機碼。將某類型檔案變成要搜尋的對象</p>
<p>在要允許搜尋的檔案機碼設定裡，設定「PersistentHandler」的機碼的預設值，如下的設定值：(以下為存文字檔的範例)</p>
<p><font color=blue><strong>  [HKEY_CLASSES_ROOT\.txt\PersistentHandler]<br />
@=&quot;{5e941d80-bf96-11cd-b579-08002b30bfeb}&quot;</strong></font></p>
<p>如果不敢修改機碼，可參照第二方法比較簡單也安全^^</p>
<p></p>
<p></p><p></p>
<p>方法二：所有檔案都納入搜尋（推薦用此方法，一勞永逸）</p>
<p>先到我的電腦，然右鍵，然後選「管理」，如下圖</p>
<p><img src="/upload/2010/index-2.jpg" border="0" /></p>
<p>二、在電腦管理裡，選擇「索引服務」，並按右鍵後選擇「內容」</p>
<p><img src="/upload/2010/index-3.jpg" border="0" /></p>
<p>三、進到索引服務內容後將「含有未知副檔名的索引檔案」給勾起來，然後按「確定」再將剛打開的視窗全關閉。</p>
<p><img src="/upload/2010/index-4.jpg" border="0" /></p>
<p>&nbsp;</p>
<p>相關資訊可以參閱MS 的官方文件: <a href="http://support.microsoft.com/kb/309173/zh-tw" target="_blank">http://support.microsoft.com/kb/309173/zh-tw</a></p>]]>
        
    </content>
</entry>

<entry>
    <title>Eclipse 編碼設定</title>
    <link rel="alternate" type="text/html" href="http://blog.db.idv.tw/2010/03/eclipse-1.html" />
    <id>tag:blog.db.idv.tw,2010://1.48</id>

    <published>2010-03-26T16:43:56Z</published>
    <updated>2010-04-15T14:00:47Z</updated>

    <summary><![CDATA[Eclipse 如果要修改預設編碼設定，可以參考以下方式進行 &nbsp; 一、 Workspace的文字編碼： &nbsp; 二、CSS檔編碼： &nbsp; 三、HTML檔案編碼 &nbsp; 四、JSP檔案編碼 &nbsp; 另外，也建議將 Show line numbers 勾起來，可以看到行號...]]></summary>
    <author>
        <name>noah</name>
        
    </author>
    
        <category term="軟體" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://blog.db.idv.tw/">
        <![CDATA[Eclipse 如果要修改預設編碼設定，可以參考以下方式進行
</p>
<p>&nbsp;</p>
<p>一、 Workspace的文字編碼：</p>
<p><img src="/upload/2010/eclipse1.jpg" width="626" height="556" border="0" /></p>
<p>&nbsp;</p>
<p>二、CSS檔編碼：</p>
<p><img src="/upload/2010/eclipse2.jpg" width="626" height="556" border="0" /></p>
<p>&nbsp;</p>
<p>三、HTML檔案編碼</p>
<p><img src="/upload/2010/eclipse3.jpg" width="626" height="556" border="0" /></p>
<p>&nbsp;</p>
<p>四、JSP檔案編碼</p>
<p><img src="/upload/2010/eclipse4.jpg" width="626" height="556" border="0" /></p>
<p>&nbsp;</p>
<p>另外，也建議將 Show line numbers 勾起來，可以看到行號</p>
<p><img src="/upload/2010/eclipse5.jpg" width="626" height="556" border="0" /></p>]]>
        
    </content>
</entry>

<entry>
    <title>Eclipse 記憶體不足</title>
    <link rel="alternate" type="text/html" href="http://blog.db.idv.tw/2010/03/eclipse.html" />
    <id>tag:blog.db.idv.tw,2010://1.47</id>

    <published>2010-03-26T16:37:53Z</published>
    <updated>2010-04-15T13:59:55Z</updated>

    <summary>在 Eclipse 裡如果執行太吃記憶體的應用程式(如 Java Web 程式)，可以修改 Eclipse.ini 裡的記憶體設定，讓應用程式可以順利執行，設定方式可以： -Xms40m -Xmx512m 換成 -Xms256m -Xmx1024m -XX:MaxPermSize=128m 原則上這個設定即可滿足大多數的需求，如果需要更多的設定，建議可上Eclipse 官網找找...</summary>
    <author>
        <name>noah</name>
        
    </author>
    
        <category term="軟體" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://blog.db.idv.tw/">
        <![CDATA[在 Eclipse 裡如果執行太吃記憶體的應用程式(如 Java Web 程式)，可以修改 Eclipse.ini 裡的記憶體設定，<br/>讓應用程式可以順利執行，設定方式可以：
<br/>
<font color=red>
<br/>-Xms40m
<br/>-Xmx512m
</font>
<br/><br/>換成<br/>
<font color=red>
<br/>-Xms256m
<br/>-Xmx1024m
<br/>-XX:MaxPermSize=128m
</font>
<br/><br/>
原則上這個設定即可滿足大多數的需求，如果需要更多的設定，建議可上Eclipse 官網找找]]>
        
    </content>
</entry>

<entry>
    <title>MemcacheDB安裝及實測</title>
    <link rel="alternate" type="text/html" href="http://blog.db.idv.tw/2009/10/memcachedb.html" />
    <id>tag:blog.db.idv.tw,2009://1.46</id>

    <published>2009-10-20T12:19:56Z</published>
    <updated>2009-10-21T07:13:24Z</updated>

    <summary>MemcacheDB為結合 Memcached 及 Berkeley-DB 的實作產品，儲存方式是一種 key-value 的結構方式，因為主要運作都是放在 memory 裡，所以執行效能非常的快。 要使用MemcacheDB需安裝Berkeley-DB、libevent及Memcached。下面就來看看如何安裝及測試MemcachedDB 安裝 Berkeley db 到 google 搜尋「berkeley db download」，到 oracle 官網下載，目前最新版本為 4.8.24，安裝步驟為: tar xvzf db-4.8.24.tar.gz cd db-4.8.24/ cd build_unix/ ../dist/configure make sudo make install 安裝 libevent 到google 搜尋「libevent download」，到 monkey.org 下載，目前stable為1.4.12，安裝步驟為:...</summary>
    <author>
        <name>noah</name>
        
    </author>
    
        <category term="軟體" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://blog.db.idv.tw/">
        <![CDATA[MemcacheDB為結合 Memcached 及 Berkeley-DB 的實作產品，儲存方式是一種 key-value 的結構方式，因為主要運作都是放在 memory 裡，所以執行效能非常的快。
<br/>要使用MemcacheDB需安裝Berkeley-DB、libevent及Memcached。下面就來看看如何安裝及測試MemcachedDB
<br/>
<br/>安裝 Berkeley db
<br/>到 google 搜尋「berkeley db download」，到 <a href="http://www.oracle.com/technology/software/products/berkeley-db/index.html" target=_blank>oracle</a> 官網下載，目前最新版本為 4.8.24，安裝步驟為:
<div class="syntax">
tar xvzf db-4.8.24.tar.gz
<br/>cd db-4.8.24/
<br/>cd build_unix/
<br/>../dist/configure
<br/>make
<br/>sudo make install
</div>
安裝 libevent
<br/>到google 搜尋「libevent  download」，到 <a href="http://www.monkey.org/~provos/libevent/" target=_blank>monkey.org</a> 下載，目前stable為1.4.12，安裝步驟為:
<div class="syntax">
tar xvzf libevent-1.4.12-stable.tar.gz
<br/>cd libevent-1.4.12-stable.tar.gz
<br/>./configure
<br/>make
<br/>sudo make install
</div>
安裝 MemcacheDB
<br/>到官網:<a href="http://memcachedb.org/" target=_blank>http://memcachedb.org/</a>下載，安裝步驟為:
<div class="syntax">
tar xvzf memcachedb-1.2.0.tar.gz
<br/>cd memcachedb-1.2.0
<br/>./configure --enable-threads
<br/>make
<br/>sudo make install
</div>
ps: memcachedb 1.2預設捉的berkeley db為4.7版，如果安裝的是4.8或更新版本則需修改二個檔案:
<br/>memcachedb-1.2.0/configure.ac
<br/>memcachedb-1.2.0/configure
<br/>將 bdbdir="/usr/local/BerkeleyDB.4.7" 改成您的Berkeley DB的位置
<br/>(如為 4.8.x 版，則改成 bdbdir="/usr/local/BerkeleyDB.4.8" )]]>
        <![CDATA[<br/>三個軟件安裝完成後，在 /etc/ld.so.conf 裡新增「/usr/local/BerkeleyDB.4.8/lib」的內容，
<br/>或用指令的方式新增內容 $echo "/usr/local/BerkeleyDB.4.8/lib/" >> /etc/ld.so.conf
<br/>亦可直接用 vi /etc/ld.so.conf 來編輯
<br/>
<br/>
<br/>一般執行 memcachedb 的方式 sample:
<br/>&lt;SAMPLE-1&gt;，讀寫合併模式 (-H 參數設定 BerkeleyDB 實檔存放位置 )
<br/><b>memcachedb -p21211 -d -r -u root -H  /server/mdb_11211  -N</b>
<br/>
<br/>&lt;SAMPLE-2&gt;，讀寫分離/備份模式
<br/>#主伺服器 192.168.0.1 讀寫模式，監聽port 11211 ，同步透過31211 port完成
<br/><b>memcachedb -p21211 -d -r -u root -H  /data/mdb_11211_m -N -R 127.0.0.1:31211 -M</b>
<br/>
<br/>#輔伺服器 192.168.0.2，唯讀模式，監聽port 21212，從192.168.0.1 的 31211 port同步資料，同時再開一個31212埠對外提供資料同步服務
<br/><b>memcachedb -p21212 -d -r -u root -H  /data/mdb_11211_from_16801_s -O 192.168.0.1:31211 -R 192.168.0.2:31212 -S</b>
<br/>
<br/>
<br/>需要更多的 memcachedb 執行參數說明，可以直接下「memcachedb -h」來查看
<br/>安裝過程的原文說明，可以查看 memcachedb 解開後裡的 INSTALL 檔案
<br/>
<br/>
<br/>以下為使用php接 memcachedb的sample:
<br/>到 google 搜尋並下載「memcached-client.php」。打開下載回來的memcached-client.php，打開來看，裡面即有一段現成的sample 可以參考。
<div class="syntax"><pre>
 require_once 'memcached-client.php';

 $mc = new memcached(array(
              'servers' => array('127.0.0.1:10000',
                                 array('192.0.0.1:10010', 2),
                                 '127.0.0.1:10020'),
              'debug'   => false,
              'compress_threshold' => 10240,
              'persistant' => true));

 $mc->add('key', array('some', 'array'));
 $mc->replace('key', 'some random string');
 $val = $mc->get('key');
</pre></div>

<br/>PS：參考資料來源：
<br/><a href="http://www.devnotes.net/post/182.html" target="_blank">http://www.devnotes.net/post/182.html</a>
<br/><a href="http://blog.gslin.org/archives/2008/02/17/1431/" target="_blank">http://blog.gslin.org/archives/2008/02/17/1431/</a>
<br/><a href="http://willko.javaeye.com/blog/394759" target="_blank">http://willko.javaeye.com/blog/394759</a>]]>
    </content>
</entry>

<entry>
    <title>Ubuntu 9.04透過BandLuxe C170上網 </title>
    <link rel="alternate" type="text/html" href="http://blog.db.idv.tw/2009/10/ubuntu-910bandluxe-c170.html" />
    <id>tag:blog.db.idv.tw,2009://1.45</id>

    <published>2009-10-12T05:50:25Z</published>
    <updated>2009-10-12T06:00:31Z</updated>

    <summary>BandRich 的 c170 3G網卡，因已內建32MB的小磁碟機並內附Windows下的驅動程式，所以在 windwos 作業系統下，插入3G網卡後，只要照步驟將驅動程式裝起來即可馬上上網。 如果是在Ubuntu下，尤其是沒有GUI的模式下，就得自己手動設定。 根據官網資料，c170在 Linux 下至少需要核心為 2.6.27 才可以，所以記得先確認一下自己的Linux的版本，可以用「uname -a」來查看版本 (如果是Ubuntu，那只要是8.10後，就一定可以)。 接下來就來看看如何讓ubuntu 9.10 存文字模式(none-GUI)透過 c170 連上網。 首先安裝 wvdial，(如果現在是不能上網的，那要先想辦法讓電腦能連上網，因為需要安裝wvdial程式，或則從別的地方copy wvdial自己安裝也可以) apt-get install wvdial 打開 /etc/wvdial.conf，修改以下內容 (這裡假設用的是威寶電信的3G SIM卡) Phone = *99# Username = vibo Password = vibo Buad =...</summary>
    <author>
        <name>noah</name>
        
    </author>
    
        <category term="軟體" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://blog.db.idv.tw/">
        <![CDATA[BandRich 的 c170 3G網卡，因已內建32MB的小磁碟機並內附Windows下的驅動程式，所以在 windwos 作業系統下，插入3G網卡後，只要照步驟將驅動程式裝起來即可馬上上網。
<br/>
<br/>如果是在Ubuntu下，尤其是沒有GUI的模式下，就得自己手動設定。
<br/>根據官網資料，c170在 Linux 下至少需要核心為 2.6.27 才可以，所以記得先確認一下自己的Linux的版本，可以用「uname -a」來查看版本 (如果是Ubuntu，那只要是8.10後，就一定可以)。
<br/>
<br/>接下來就來看看如何讓ubuntu 9.10 存文字模式(none-GUI)透過 c170 連上網。
<br/>首先安裝 wvdial，(如果現在是不能上網的，那要先想辦法讓電腦能連上網，因為需要安裝wvdial程式，或則從別的地方copy wvdial自己安裝也可以)
<br/><font color=blue>apt-get install wvdial</font>
<br/>
<br/>打開 /etc/wvdial.conf，修改以下內容 (這裡假設用的是威寶電信的3G SIM卡)
<br/><font color=blue>Phone = *99#</font>
<br/><font color=blue>Username = vibo</font>
<br/><font color=blue>Password = vibo</font>
<br/><font color=blue>Buad = 460800</font>
<br/><font color=blue>Modem = /dev/ttyUSB0</font>
<br/>
<br/>插入BandLuxe c170網卡
<br/>
<br/>退出BandLuxe的虛擬光碟(假設捉到的是cdrom1)
<br/><font color=blue>eject /dev/cdrom1</font>
<br/>
<br/>執行撥接程式
<br/><font color=blue>wvdial</font>]]>
        <![CDATA[<br/>然後等一下等訊息跑完就連上了。如果要確定每一步驟是否正常，可以下 dmesg 來查看，或則下「tail -f /var/log/messages」監看。
<br/><br/>
<br/><img src="/upload/2009/ubuntu-c170.jpg" border="0">]]>
    </content>
</entry>

<entry>
    <title>自動更新Ubuntu</title>
    <link rel="alternate" type="text/html" href="http://blog.db.idv.tw/2009/09/ubuntu-update.html" />
    <id>tag:blog.db.idv.tw,2009://1.44</id>

    <published>2009-09-29T04:30:03Z</published>
    <updated>2009-09-29T05:29:24Z</updated>

    <summary><![CDATA[自從裝了Ubuntu後，幾乎每個禮拜，我就會從遠端登入到server然後，下apt-get update/apt-get upgrade作系統更新的動作。 最近呢，愈來愈懶了，幾乎很久沒作更新動作，所以決定一次解決更新的問題。 Linux裡內建有schedule的設定工具稱為cron-table，我喜歡寫好shell script後，並使用 crontab 指令設定到我的 cron-table裡。 如果是以前我的設定方法步驟為: sudo vi /shell/update-ubuntu.sh&nbsp;&nbsp;&nbsp;&nbsp;// (shell是我習慣放shell script的資料夾) 在裡面新增以下內容(如果不想清掉下載的archive files，則可以拿掉第四行) #!/bin/sh apt-get update apt-get -y dist-upgrade apt-get clean 然後按「!wq」存檔後離開，並設定權限 sudo chmod 755 /shell/update-ubuntu.sh 接下來設定 cron-table sudo crontab -e 新增以下內容，(代表:每個星期日的早上4點15分進行更新) 15 4 * *...]]></summary>
    <author>
        <name>noah</name>
        
    </author>
    
        <category term="軟體" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://blog.db.idv.tw/">
        <![CDATA[自從裝了Ubuntu後，幾乎每個禮拜，我就會從遠端登入到server然後，下apt-get update/apt-get upgrade作系統更新的動作。
<br/>最近呢，愈來愈懶了，幾乎很久沒作更新動作，所以決定一次解決更新的問題。
<br/>
<br/>Linux裡內建有schedule的設定工具稱為cron-table，我喜歡寫好shell script後，並使用 crontab 指令設定到我的 cron-table裡。
<br/>如果是以前我的設定方法步驟為:
<br/>
<br/>sudo vi /shell/update-ubuntu.sh&nbsp;&nbsp;&nbsp;&nbsp;<i>// (shell是我習慣放shell script的資料夾)</i>
<br/>
<br/>在裡面新增以下內容(如果不想清掉下載的archive files，則可以拿掉第四行)
<br/>#!/bin/sh
<br/>apt-get update
<br/>apt-get -y dist-upgrade
<br/>apt-get clean
<br/>
<br/>然後按「!wq」存檔後離開，並設定權限
<br/>sudo chmod 755 /shell/update-ubuntu.sh
<br/>
<br/>接下來設定 cron-table
<br/>sudo crontab -e
<br/>
<br/>新增以下內容，(代表:每個星期日的早上4點15分進行更新)
<br/>15 4 * * 0 /shell/update-ubuntu.sh]]>
        <![CDATA[<br/>
<br/>這一次我決定換個方法來試試，一樣需要先準備一個update的 shell script
<br/>
<br/>sudo vi /shell/update-ubuntu.sh
<br/>內容
<br/>#!/bin/sh
<br/>apt-get update
<br/>apt-get -y dist-upgrade
<br/>apt-get clean
<br/>
<br/>按「!wq」存檔後離開，並設定權限
<br/>sudo chmod 755 /shell/update-ubuntu.sh
<br/>
<br/>因為是想要每週更新，所以
<br/>cd /etc/cron.weekly/
<br/>sudo ln -s /shell/update-ubuntu.sh update-ubuntu.sh
<br/>
<br/>設定好後，需要重啟一下 cron-table
<br/>sudo /etc/init.d/cron restart
<br/>
<br/>
<br/>最後附帶一提的是，可能會有人問為何linux需要作自動新更呢? 又不是像另一套作業系統漏動一推，我的想法是即然官方有推出update，那~為何不作呢(作心安也不錯啦) ^_^]]>
    </content>
</entry>

<entry>
    <title>超強檔案複製指令robocopy</title>
    <link rel="alternate" type="text/html" href="http://blog.db.idv.tw/2009/09/robocopy.html" />
    <id>tag:blog.db.idv.tw,2009://1.43</id>

    <published>2009-09-16T10:17:00Z</published>
    <updated>2009-09-16T10:22:56Z</updated>

    <summary>在Windows下，大家也許會習慣用檔案總管拖拉方式或複製、貼上方式進行檔案的拷貝，如果進階一點的，也許會下copy或Xcopy指令的方式來作檔案的拷貝。如果在您的資料夾下，有比較特殊的檔名或太多層的資料夾深度，那這些常見的拷貝也許就會失敗，尤其一次要拷貝很多檔案時，更容易會因單一檔案失敗而造成需重頭來過。 Microsoft在Windows Server 2003 時，出了一個ResourceKit的Tools，裡面大約有126個命令。 在開始使用前，記得先到Microsoft官網下載ResourceKit(link here)，下載完成後，直按安裝下載回來的檔案， 安裝程式會自動將ResourceKit的資料夾加入Path環境變數，所以可以馬上使用。 (這個工具包，同時適用於Windows 2000 及 Windows XP 及後面Win32作業系統) 下面我們看看Robocopy這個超強的檔案複製指令。 Robocopy除了是個資料夾/檔案的複製指令外，基本上已經作到了「同步」的功能及滿足「差異化備份」的需求。 舉個例，在 A 資料夾下，有 A1.txt、A2.txt、A3.txt 等三個檔案，透過 robocopy 複製一份到 B 資料夾。 當A1.txt有修改時，只要再次透過 robocopy 即可同步到 B ，並且不用重新複製 A2.txt 及 A3.txt 。 如果 A2.txt 刪除了，也可以透過 robocopy 去作同步的動作，不需自己再手動去刪除 B...</summary>
    <author>
        <name>noah</name>
        
    </author>
    
        <category term="軟體" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://blog.db.idv.tw/">
        <![CDATA[在Windows下，大家也許會習慣用檔案總管拖拉方式或複製、貼上方式進行檔案的拷貝，如果進階一點的，也許會下copy或Xcopy指令的方式來作檔案的拷貝。如果在您的資料夾下，有比較特殊的檔名或太多層的資料夾深度，那這些常見的拷貝也許就會失敗，尤其一次要拷貝很多檔案時，更容易會因單一檔案失敗而造成需重頭來過。
<br/>
<br/>Microsoft在Windows Server 2003 時，出了一個ResourceKit的Tools，裡面大約有126個命令。
<br/>在開始使用前，記得先到Microsoft官網下載ResourceKit(<a href="http://www.microsoft.com/Downloads/details.aspx?FamilyID=9d467a69-57ff-4ae7-96ee-b18c4790cffd&displaylang=en" target=_blank>link here</a>)，下載完成後，直按安裝下載回來的檔案，
<br/>安裝程式會自動將ResourceKit的資料夾加入Path環境變數，所以可以馬上使用。
<br/>(這個工具包，同時適用於Windows 2000 及 Windows XP 及後面Win32作業系統)
<br/><br/>
<br/>下面我們看看Robocopy這個超強的檔案複製指令。
<br/>
<br/>Robocopy除了是個資料夾/檔案的複製指令外，基本上已經作到了「同步」的功能及滿足「差異化備份」的需求。
<br/>舉個例，在 A 資料夾下，有 A1.txt、A2.txt、A3.txt 等三個檔案，透過 robocopy 複製一份到 B 資料夾。
<br/>當A1.txt有修改時，只要再次透過 robocopy 即可同步到 B ，並且不用重新複製 A2.txt 及 A3.txt 。
<br/>如果 A2.txt 刪除了，也可以透過 robocopy 去作同步的動作，不需自己再手動去刪除 B 資料夾下的 A2.txt。
<br/>
<br/>這樣的同步有什麼好處？在少量檔案時，可能很難發現他的強大，但是如果檔案數是幾千、幾萬個時，且需要固定時間的備份到另一個地方(如備份硬碟)，這時候robocopy的「差異化備份」就可以派上用場，對整體備份而言，提昇不少效能。
<br/>
<br/>如果需求就是差異化備份，那常用的參數為：
<br/><font color=blue>robocopy&nbsp;&nbsp;來源&nbsp;&nbsp;目的&nbsp;&nbsp;/e&nbsp;&nbsp;/xo&nbsp;&nbsp;/purge</font>
<br/>/e ：代表複製子資料夾，含空的資料夾
<br/>/xo ：排除較舊的檔案，意思是來源端沒有比目的端新時，就不複製(差異化備份，很重要的參數)
<br/>/purge ：刪除來源中，不再存在的資料夾或檔案(這個也是差異化備份，很重要的參數)]]>
        <![CDATA[<br/>下圖為執行完畢後的完整Report。
<br/><img src="/upload/2009/robocopy.jpg" border="0">
<br/>
<br/>
<br/>後面列出完整的參數說明： (也可以用「robocopy /?」 取得說明)
<pre>
------------------------------------------------------------------------------
              Usage :: ROBOCOPY source destination [file [file]...] [options]
                    source 來源:: 原始目錄(驅動器:\路徑或\\伺服器\共用\路徑)。
                destination目錄:: 目標目錄(驅動器:\路徑或\\伺服器\共用\路徑)。
                 file 文件:: 要複製的檔(名稱/萬用字元: 默認為 "*.*")。
------------------------------------------------------------------------------
複製選項:
------------------------------------------------------------------------------
                 /S :: 複製子目錄，但不複製空的子目錄。
                 /E :: 複製子目錄，包括空的子目錄。
             /LEV:n :: 僅複製原始目錄樹的前 n 層。
                 /Z :: 在可重新開機模式下複製檔。
                 /B :: 在備份模式下複製檔。
                /ZB :: 使用可重新開機模式；如果拒絕訪問，請使用備份模式。
            /EFSRAW :: 在 EFS RAW 模式下複製所有加密的檔。
      /COPY:複製標記:: 要複製的檔內容(預設為 /COPY:DAT)。
                       (複製標記: D=資料，A=屬性，T=時間戳記)。
                       (S=安全=NTFS ACL，O=所有者資訊，U=審核資訊)。
           /DCOPY:T :: 複製目錄時間戳記。
               /SEC :: 複製具有安全性的檔(等同於 /COPY:DATS)。
           /COPYALL :: 複製所有檔資訊(等同於 /COPY:DATSOU)。
            /NOCOPY :: 不複製任何檔資訊(與 /PURGE 一起使用生效)。
            /SECFIX :: 修復所有檔的檔安全性，即使是跳過的文件。
            /TIMFIX :: 修復所有檔的檔時間，即使是跳過的檔。
             /PURGE :: 刪除來源中不再存在的目的檔案/目錄。
               /MIR :: 鏡像目錄樹(等同於 /E 和 /PURGE)。
               /MOV :: 移動檔(複製後從源中刪除)。
              /MOVE :: 移動檔和目錄(複製後從源中刪除)。
     /A+:[RASHCNET] :: 將給定的屬性添加到複製檔。
     /A-:[RASHCNET] :: 從複製檔中刪除給定的屬性。
            /CREATE :: 僅創建目錄樹和長度為零的檔。
               /FAT :: 僅使用 8.3 FAT 檔案名創建目的檔案。
               /256 :: 關閉超長路徑(> 256 字元)支援。
             /MON:n :: 監視源；發現多於 n 個更改時再次運行。
             /MOT:m :: 監視源；如果更改，在 m 分鐘時間內再次運行。
      /RH:hhmm-hhmm :: 運行小時數 - 可以啟動新副本的時間。
                /PF :: 以每個檔(而不是每個步驟)為基礎檢查運行小時數。
             /IPG:n :: 套裝程式間的間距(ms)，以釋放低速線路上的頻寬。
------------------------------------------------------------------------------
檔選擇選項:
------------------------------------------------------------------------------
                 /A :: 僅複製具有存檔屬性集的檔。
                 /M :: 僅複製具有存檔屬性的檔並重置存檔屬性。
    /IA:[RASHCNETO] :: 僅包含具有任意給定屬性集的檔。
    /XA:[RASHCNETO] :: 排除具有任意給定屬性集的檔。
  /XF 文件[文件]... :: 排除與給定名稱/路徑/萬用字元匹配的檔。
  /XD 目錄[目錄]... :: 排除與給定名稱/路徑匹配的目錄。
                /XC :: 排除已更改的文件。
                /XN :: 排除較新的檔。
                /XO :: 排除較舊的文件。
                /XX :: 排除多餘的檔和目錄。
                /XL :: 排除孤立的檔和目錄。
                /IS :: 包含相同檔。
                /IT :: 包含已調整的檔。
             /MAX:n :: 最大的檔大小 - 排除大於 n 位元組的檔。
             /MIN:n :: 最小的檔大小 - 排除小於 n 位元組的檔。
          /MAXAGE:n :: 最長的檔存在時間 - 排除早於 n 天/日期的檔。
          /MINAGE:n :: 最短的檔存在時間 - 排除晚於 n 天/日期的檔。
          /MAXLAD:n :: 最大的最後訪問日期 - 排除自 n 以來未使用的檔。
          /MINLAD:n :: 最小的最後訪問日期 - 排除自 n 以來使用的檔。
                       (If n < 1900 then n = n days, else n = YYYYMMDD date)。
                /XJ :: 排除接合點。(預設情況下通常包括)。
               /FFT :: 假設 FAT 檔時間(2 秒細微性)。
               /DST :: 彌補 1 小時的 DST 時間差。
               /XJD :: 排除目錄的接合點。
               /XJF :: 排除文件的接合點。
------------------------------------------------------------------------------
重試選項:
------------------------------------------------------------------------------
               /R:n :: 失敗副本的重試次數: 默認為 1 百萬。
               /W:n :: 兩次重試間的等待時間: 默認為 30 秒。
               /REG :: 將註冊表中的 /R:n 和 /W:n 保存為默認設置。
               /TBD :: 等待定義共用名稱稱(重試錯誤 67)。
------------------------------------------------------------------------------
日誌記錄選項:
------------------------------------------------------------------------------
                 /L :: 僅列出 - 不複製、添加時間戳記或刪除任何檔。
                 /X :: 報告所有多餘的文件，而不只是選中的檔。
                 /V :: 生成詳細輸出，同時顯示跳過的檔。
                /TS :: 在輸出中包含原始檔案的時間戳記。
                /FP :: 在輸出中包含檔的完整路徑名稱。
             /BYTES :: 以位元組列印大小。
                /NS :: 無大小 - 不記錄檔大小。
                /NC :: 無類別 - 不記錄檔類別。
               /NFL :: 無檔清單 - 不記錄檔案名。
               /NDL :: 無目錄清單 - 不記錄目錄名稱。
                /NP :: 無進度 - 不顯示已複製的百分比。
               /ETA :: 顯示複製檔的預期到達時間。
           /LOG:文件:: 將狀態輸出到日誌檔(覆蓋現有日誌)。
          /LOG+:文件:: 將狀態輸出到日誌檔(附加到現有日誌中)。
        /UNILOG:文件:: 以 UNICODE 方式將狀態輸出到日誌檔(覆蓋現有日誌)。
       /UNILOG+:文件:: 以 UNICODE 方式將狀態輸出到日誌檔(附加到現有日誌中)。
               /TEE :: 輸出到控制台視窗和日誌檔。
               /NJH :: 沒有作業標頭。
               /NJS :: 沒有作業摘要。
           /UNICODE :: 以 UNICODE 方式輸出狀態。
------------------------------------------------------------------------------
作業選項 :
------------------------------------------------------------------------------
       /JOB:作業名稱:: 從命名的作業檔中提取參數。
      /SAVE:作業名稱:: 將參數保存到命名的作業檔
              /QUIT :: 處理命令列後退出(以查看參數)。
              /NOSD :: 未指定原始目錄。
              /NODD :: 未指定目標目錄。
                /IF :: 包含以下檔。
</pre>]]>
    </content>
</entry>

</feed>

