2011年8月25日 星期四

[ Google Android 教學 ] 入門 : 安裝 Android 開發工具

轉載自 這裡
前言 :
Android 提供免費而且跨平台的整合開發環境,只要電腦能連接上網路,我們隨時都能下載相關工具下來,並開始開發 Android 應用程式。 有了輕鬆易用的開發工具,我們可以把心力專注於如何將想法實現到應用程式上.

系統需求 :
撰寫 Android 的應用程式,需要一套個人電腦系統。至於作業系統的部份,幾個主流作業系統都有支援. 支援的作業系統如下 : 

* Windows XP 或 Vista
* Mac OS X 10.4.8 或之後版本 (適用 x86 架構的 Intel Mac)
* Linux (官方於 Ubuntu 6.10 Dapper Drake 上測試)

我們需要安裝一些 Android 開發環境所需的程式工具,這些工具都是可以免費上網取得的 :
- JDK 5 或 JDK 6 (下載)
你需要安裝 Java 開發工具 (JDK 5 或 JDK 6)。 只安裝 Java 運行環境(JRE) 是不夠的,你需要安裝 Java 開發環境 (JDK)。 你可以在命令行上輸入 「java -version」 來查看目前系統上已安裝的 java 版本(java 版本需 >1.5)。 要注意的是 Android 與 Java Gnu 編譯器 (gcj) 還不相容.

- Eclipse IDE,一個多用途的開發工具平台 (下載)
你可以下載安裝 Eclipse 3.6 (代號 Helios) 、Eclipse 3.5 (代號 Galileo)。 請注意你選擇的版本需包含 Eclipse Java 開發工具擴充套件(Java Development Tool Plugin, JDT)。 大多數 Eclipse IDE 包中都已含有 JDT 擴充套件。若對 Eclipse 平台不熟悉的話,建議直接選擇 「for Java Developers」版本來下載

- ADT,基於 Eclipse 的 Android 開發工具擴充套件 (Android Development Tools plugin)
- Android SDK,Android 程式開發套件,包含 Android 手機模擬器(下載)
- 其他開發環境工具(非必要安裝)
Linux 和 Mac 環境上需要自動編譯的話可以自行安裝 Apache Ant 1.6.5 或之後版本,Windows 環境上則需要 Apache Ant 1.7 或之後版本。 另外 NetBeans、IDEA 等開發平台亦有推出自己的 Android 開發工具,但這裡還是以討論官方基於 Eclipse 平台的開發工具為準,其他平台不予涉及

安裝流程 :
假設讀者已先安裝了 JDK 5 或 JDK 6。 那麼 Android 的安裝流程可以分為以下五個步驟 : (JDK 安裝過程請參考 這裡)
1. 下載 Eclipse
2. 安裝 Eclipse
3. 安裝 ADT 擴充套件
4. 下載 Android SDK
5. 設定 Android SDK

詳細的安裝流程如下 :
1. 下載 Eclipse
首先我們需要下載 Android 開發時會用到的整合開發環境 Eclipse。 目前 Android 應用程式只支援使用「Java」程式語言來編寫 Android 應用程式。所以開發前必須先安裝 Java 開發套件(Java Development Kit, JDK)。 各平台的 JDK 可至 http://java.sun.com 下載。 Mac OS X 作業系統則已內建 JDK。 安裝好 JDK 後,我們可以前往 Eclipse 網站下載 Eclipse 這個方便的整合開發環境。 下載 Eclipse 時請選「Eclipse IDE for Java Developers」或「Eclipse IDE for Java EE Developers」這兩種版本,只有這兩種版本才會預裝 Eclipse JDT 擴充套件。 範例中所選擇的是「Eclipse IDE for Java Developers」版本。 下載完同樣先解壓縮到適當目錄下.

2. 安裝 Eclipse
Eclipse 不需要安裝,只要確認你的系統上有安裝 Java,即可直接開啟 Eclipse 資料夾,點擊 Eclipse 開始執行 Eclipse 整合開發環境。 第一次啟動 Eclipse 時會彈出視窗讓你決定預設的工作目錄。一般使用 Eclipse 預設的工作目錄即可。 進入到 Eclipse IDE 後,不必急著四處觀望。我們先來安裝 Android 開發工具擴充套件.

3. 安裝 ADT 擴充套件
我們將在 Eclipse 上 安裝 Android 開發工具 (ADT).
- Eclipse 3.5/3.6 版
找到螢幕上方的選單列, 選擇 「Help->Install New Softare」 選項,這選項會帶出一個新視窗。 選擇「Available Software」標籤,選擇右方的 「Add...」 (新增網站)按鈕,會彈出一個輸入框(如下所示), 接著在輸入框中的"Location"欄位中輸入擴充套件的名稱(Name) 「ADT」 跟網址(URL) 「http://dl-ssl.google.com/android/eclipse/site.xml 」,按下 "OK" 按鈕離開。Eclipse 會花一點時間尋找合適的版本 :

按下 「Next」 (下一步)鍵。照著步驟就安裝完成。安裝完會提示需重新啟動 Eclipse,按下 「Yes」 重新啟動.

4. 下載 Android SDK
接著我們要從 http://developer.android.com/ Android 官方網站下載 「Android 軟體開發套件」 (Software Development Kit, SDK)。 下載下來的 SDK 檔案需要先解壓縮。Windows 平台需要先另行安裝解壓縮程式,如免費的 7-zip 解壓縮工具。 解壓縮後會出現一個資料夾。為了之後描述方便,我們將解壓縮後的 Android SDK 檔案夾命名為「android_sdk」.
安裝 Android 後要記得同時設定 AVD (Android Virtual Device). 或者可以透過 Eclipse IDE 設定 (參考這裡).

5. 設定 Android SDK
打開偏好設定頁面(Preference),選擇 Android 標籤(請確認您已安裝好 ADT 擴充套件,Android 標籤才會出現在偏好設定頁面中),在 SDK Location 欄位按下 " Browse..."鍵,選擇剛剛解壓縮完的「android_sdk」檔案夾所在地,然後按下視窗右下角的套用(Apply) 按鈕。 這樣一來,Android SDK 就算是設定好啦 :


參考資料 :
* Eclipse 網站 http://www.eclipse.org/downloads/ 安裝擴充套件 http://developer.android.com/guide/developing/tools/adt.html
* 使用Eclipse galileo 開發android軟體 -設定模擬器
在安裝完ADT後(詳見前一篇),再來要設定android sdk的模擬器AVD,這個模擬器可以在不連接實際手機的狀況下擬器一個環境,讓我們測試在各種不同解析、sdk下是否可正確執行。模擬器的啟動跟設定有二種方式,一種是直接在android sdk目錄下直接執行執行檔,另一種是跟Eclipse緊密結合在一起,利用Eclipse來呼叫它,這裡只說明利用Eclipse 呼叫的方式,有興趣的人可以參考Emuator 這一篇或是Developer In other IDEs這一篇...

* 使用 Eclipse 管理 Android SDK

2011年8月18日 星期四

[ ExtJS2.0 開發指南 ] CH4 : 常用表單 - 表單提交與加載

前言 :
在了解表單面板, 表單組件和表單驗證後, 接著我們要開始學習表單的提交與加載. 這部分內容涉及表單與服務器之間的交互, 一方面是將用戶輸入訊息發往服務器, 另一種是將已有訊息從服務器讀出並顯示在表單中. 下面介紹的 Ext.form.Action 類就是用來處理這些常見表單操作.

Ext.form.Action 基類 :
Ext.form.Action 類主要提供表單相關的一些操作, 它只在執行 submit 或 load 時被創建. 通常透過設置該類的 method 可以執行不同的動作, 包括 submit, load 和 doAction, 動作執行後結果是成功還是失敗調用相應的回調方法.



ExtJS 不但提供 Ext.form.Action 類, 還在這個基類上擴展了 Ext.form.Action.Load 類與 Ext.form.Action.Submit 類. 分別負責表單的讀取與提交, 由於是擴展自 Ext.form.Action, 所以上面表格 4-24, 4-25 列出配置項都適用於這兩個類. 下面是關於這兩個類別的說明.
- Ext.form.Acton.Submit
該類別用於提交表單數據並處理返回結果, 並且只在表單提交時被創建, 要求返回的訊息中必須有一個 boolean 類型的屬性 success 表示提示是否成功和一個可選屬性 errors 中將包含無效字段的錯誤訊息. 下面是一個返回訊息範例 : 

{  
    success: false, // 表示表單提交數據是否成功  
    errors: {  
        clientcode: "Client not found",  
        portOfLoading: "This field must not be null"  
    }  
}
2. Ext.form.Action.Load
該類用於讀取服務器數據到表單中, 並且只在表單提交時被創建, 要求返回訊息中必須有一個 boolean 類型的屬性 success 表示加載是否成功和一個 data 屬性, data 屬性包含要被加載的字段值訊息. 下面是一個返回訊息範例 : 

{  
    success: true, //  表示加載數據是否成功  
    data: {  
        clientName: "Fred. Olsen Lines",  
        portOfLoading: "FXT",  
        portOfDischarge: "OSL"  
    }  
}

下表示 Ext.form.Action.Submit 新增的配置項 :


表單數據加載 :
表單數據的加載基本上可以分成兩類, 即同步加載和異步加載. 這兩種方式各自有其適用範圍, 就一般情況來說, 對於必然出現在表單中的數據採用同步加載方式比較好, 避免多次訪問服務器造成效率損失. 而對於很少使用或不是每次都會出現在表單上的數據以異步方式加載來減少讀取的數據量, 以增加訪問速度.
客戶端代碼 : 在代碼 4-19 中將創建一個表單, 部分字段採用同步加載方式, 另一部分字段採用異步加載的方式. 參考帶碼如下.
- e4-19.html : 
...  
<script type="text/javascript">
  
    Ext.onReady(function(){  
        Ext.BLANK_IMAGE_URL = '../ext2.0/resources/images/default/s.gif';  
        Ext.QuickTips.init();  
        Ext.form.Field.prototype.msgTarget = 'side';  
        var productForm = new Ext.form.FormPanel({  
            title:'表單加載範例',  
            labelWidth : 100,  
            width : 300,  
            height: 230,  
            frame : true,  
            labelSeparator :':',  
            applyTo :'form',  
            items:[  
                new Ext.form.TextField({  
                    fieldLabel:'產品名稱',  
                    name : 'productName',  
                    width : 150,  
                    value:'U盤'//同步載加載數據  
                }),  
                new Ext.form.NumberField({  
                    fieldLabel:'金額',  
                    name : 'price',  
                    width : 150,  
                    value : 100//同步載加載數據  
                }),  
                new Ext.form.DateField({  
                    fieldLabel:'生產日期',  
                    format:'Y年m月d日',  
                    width : 150,  
                    name : 'date',  
                    value : new Date()//同步載加載數據  
                }),  
                new Ext.form.TextArea({  
                    id : 'introduction',  
                    name : 'introduction',  
                    fieldLabel:'產品簡介',  
                    width : 150//異步加載數據  
                })  
            ],  
            buttons:[  
                new Ext.Button({  
                    text : '加載簡介',  
                    handler : loadCallBack  
                })  
            ]  
        });  
        //表單加載數據的回調函式  
        function loadCallBack(){  
            productForm.form.load({  
                waitMsg : '正在加載產品簡介訊息',//提示訊息  
                waitTitle : '提示',//表提  
                url : 'productServer.jsp',//請求的 url  
                method:'GET',//請求方式  
                success:function(form,action){//加載成功的調用函式  
                    //Ext.Msg.alert('提示','產品簡介加載成功!');  
                },  
                failure:function(form,action){//加載失敗的處理函式  
                    Ext.Msg.alert('提示','產品簡介加載失敗
失敗原因: '+action.failureType);  
                }  
            });  
        }  
    });  
</script> 
...
- productServer.jsp : 服務器端代碼, 用於生成表單加載的產品簡介數據.
<%@ page language="java" contentType="text/html; charset=BIG5"  
    pageEncoding="BIG5"%>  
<%  
    String msg = "產品簡介, 美觀實用, 售後服務佳!";  
    String respMsg = "{success:true, data:{introduction: '"+msg+"'}}";  
    response.getWriter().write(respMsg);  
%>
執行結果 :


表單數據提交 :
表單數據提交與數據加載相比使用頻率還要更頻繁, 表單數據提交也有兩種方式, 分別是同步與異步 (Ajax) 方式. 這裡介紹表單的異步提交方式, 這也是 ExtJS 表單支持的默認方式. 在下面代碼將以創建一個用戶登陸頁面為目標, 要求用戶輸入用戶名與密碼. 用戶名採用前台驗證方式, 限定輸入格式必須為 E-Mail, 密碼採服務器驗證方式. 檢驗密碼是否達到 6 位, 全部驗證通過顯示登陸成功. 

- e4-20.html : 客戶端代碼 
...  
<script type="text/javascript">  
    Ext.onReady(function(){  
        Ext.BLANK_IMAGE_URL = '../ext2.0/resources/images/default/s.gif';  
        Ext.QuickTips.init();  
        Ext.form.Field.prototype.msgTarget = 'side';  
        var loginForm = new Ext.form.FormPanel({  
            title:'表單提交範例',  
            labelWidth : 60,  
            width : 230,  
            height: 130,  
            frame : true,  
            labelSeparator :':',  
            applyTo :'form',  
            items:[  
                new Ext.form.TextField({  
                    fieldLabel:'用戶名',  
                    name : 'userName',  
                    allowBlank : false,  
                    vtype:'email'  
                }),  
                new Ext.form.NumberField({  
                    fieldLabel:'密碼',  
                    name : 'password',  
                    inputType : 'password',  
                    allowBlank : false  
                })  
            ],  
            buttons:[  
                new Ext.Button({  
                    text : '登陸',  
                    handler : login  
                }),  
                new Ext.Button({  
                    text : '重置',  
                    handler : reset  
                })  
            ]  
        })  
        function login(){//提交表單  
            loginForm.form.submit({  
                clientValidation:true,  
                waitMsg : '正在登錄系統, 請稍候...',//提示訊息  
                waitTitle : '提示',//標題  
                url : 'loginServer.jsp',//請求的 url  
                method:'GET',//請求方式  
                success:function(form,action){  
                    Ext.Msg.alert('提示','系統登錄成功!<br/>進入登入頁面...');  
                    document.location='success.html';  // 進入登入頁面  
                },  
                failure:function(form,action){  
                    Ext.Msg.alert('提示','系統登陸失敗!, 原因:'+action.failureType);  
                }  
            });  
        }  
        function reset(){  
            loginForm.form.reset();  
        }  
    });  
</script>  
...
- loginServer.jsp : 服務器端代碼, 驗證密碼長度是否大於6碼.
<%@ page language="java" contentType="text/html; charset=BIG5"  
    pageEncoding="BIG5"%>  
<%  
    String pwd = request.getParameter("password");  
    String msg="";  
    if(pwd.length()<6){  
        msg = "{success:false,errors:{password:'密碼不可少於六碼!'}}";  
    } else {  
        msg = "{success:true}";  
    }  
    response.getWriter().write(msg);  
%> 
執行結果 (輸入密碼只有三碼) : 提交表單並檢視表單錯誤訊息.




執行結果 (輸入六碼) :


補充說明 :
* ExtJS 表單 FormPanel 提交數據與加載數據
* ExtJS 亂碼可能解決方法

2011年8月9日 星期二

[ Java 代碼範本 ] 使用 JSch 透過 SSH 對遠端進行命令發送

前言 :
最近專案需求, 因為 Karaf 有支援 SSH 連線, 所以打算寫一個簡單的 GUI 遠端控制 Karaf 進行 bundle 的安裝與移除. 於是就 google 到一個好用的 SSH 套件 JSch. 底是下官方對該套件的介紹 : 

JSch is a pure Java implementation of SSH2.
JSch allows you to connect to an sshd server and use port forwarding, X11 forwarding, file transfer, etc., and you can integrate its functionality into your own Java programs. JSch is licensed under BSD style license.

範例代碼 :
接著我們將透過 JSch 套件連接 Karaf 的 SSH channel 並發送命令 "osgi:list" 來取的 Karaf 的 bundle 清單. 參考代碼如下 :
- LoginKarafTest.java :
  1. package john.jsch;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.InputStream;  
  5. import java.io.InputStreamReader;  
  6.   
  7. import com.jcraft.jsch.Channel;  
  8. import com.jcraft.jsch.ChannelExec;  
  9. import com.jcraft.jsch.JSch;  
  10. import com.jcraft.jsch.Session;  
  11.   
  12. public class LoginKarafTest {  
  13.     public static void main(String args[])  
  14.     {  
  15.         String cmd = "osgi:list";  
  16.         try  
  17.         {  
  18.          JSch jsch=new JSch();  
  19.             
  20.           String host="localhost";  
  21.           String user="karaf";  
  22.           int port = 8101;  
  23.           Session session=jsch.getSession(user, host, port);  
  24.           session.setPassword("karaf");  
  25.           session.setConfig("StrictHostKeyChecking", "no");  
  26.           session.connect(30000);   // making a connection with timeout.  
  27.             
  28.           Channel channel = session.openChannel("exec");  
  29.          ((ChannelExec) channel).setCommand(cmd);               
  30.           channel.connect();  
  31.           BufferedReader br = new BufferedReader(new InputStreamReader(channel.getInputStream()));  
  32.           String line = null;  
  33.           while((line=br.readLine())!=null)  
  34.           {  
  35.               System.out.printf("\t[Resp] %s\n", line);  
  36.           }  
  37.           channel.disconnect();         
  38.           session.disconnect();  
  39.             
  40.         }  
  41.         catch(Exception e){  
  42.           e.printStackTrace();  
  43.         }  
  44.     }  
  45. }  

執行結果可能如下 :


補充說明 :
* JSch online API
* JSch example list

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...