網頁

2013年3月26日 星期二

Gossip for SQLite


真糟糕, 怎麼一下又跳到 SQLite 了呢 ?! , 只不過攻城的時候, 才發現沒有帶梯子, 再回來拿而已.
 

What is SQLite


SQLite 是一個符合 ACID 要求的關連式資料庫管理系統. 它的特色如下:

1. Support SQL 92 標準.
2. 不是 Client/Server 架構, 直接在本機操作, 所以有時又被冠以 embedded.
3. 它的執行檔不到 500K ( windows 版本為例)
4. 它的原始碼是 public domain. 意即公共財, 任何人都可以用任何方式使用. 除了以下例外:
  • You are using SQLite in a jurisdiction that does not recognize the public domain.
  • ( 你在一個不承認公共財的地區使用 SQLite)
  •  
  • You are using SQLite in a jurisdiction that does not recognize the right of an author to dedicate their work to the public domain.
  • ( 你在一個不承認作者致力於公共財的努力的地區使用 SQLite)
  •  
  • You want to hold a tangible legal document as evidence that you have the legal right to use and distribute SQLite.
  • ( 你想要持有一份正式文件, 證明你有權力使用及發佈 SQLite)
  •  
  •  
  • Your legal department tells you that you have to purchase a license.
  • ( 你的法律部門告訴你必須購買授權)
  •  
  • ( 有以上需求的人, 可以用 $1000 的價格, 購買授權)
 
特別推薦, 版權頁的聲明, 也是非常值得一讀..

**    The author disclaims copyright to this source code.  In place of
**    a legal notice, here is a blessing:
**
**    May you do good and not evil.
**    May you find forgiveness for yourself and forgive others.
**    May you share freely, never taking more than you give.
**

Where can I find SQLite ?


下作業系統均內建 SQLite
  • Windows's Windows Phone 8.
  • Apple's iOS
  • Nokia's Maemo
  • Google's Android
  • RIM's BlackBerry
  • Linux Fundation's MeeGo
  • LG's webOS
  • NetBSD
  • OpenBSD
事實上, 它可以支援任何有 C 編譯器的作業系統. 因為它的原始碼只有一個 C 程式. 甚至不需要 makefile 就可以移轉到任何平台.

目前有發行的可執行版本, 可以在以下作業系統運行

Linux
Mac OS X (x86)
Windows
Windows Phone 8
Windows Runtime
.NET

以下瀏覽器也內建並使用 SQLite

Mozilla Firefox
Mozilla Thunderbird
Chrome browser
Opera Internet suite
 
詳細整合應用列表請見以下連結:
http://en.wikipedia.org/wiki/SQLite

 

How can I use SQLite:


直接操作的部份, 可以參考前面有執行檔的部份.

程式介面部份:
SQLit 支援 C/C++, Tcl, 透過第三方軟體, 也可以支援Java,JDBC,PHP,Objective-C,Perl, 大部份常見的程式設計介面都可以支援.

下載及安裝 :
可以到以下連結下載.
http://www.sqlite.org/download.html

安裝 ? , 你不需要安裝. 下載的 zip 檔解開就是執行檔了. 雙擊就可以執行.

Why I use SQLite ?


如果想要從事 Android, iOS,Windows Phone app開發, 免不了一定會接觸到 SQLite. 雖然同樣是 SQL, 但是 MS-SQL, MySQL, SQLIte 的語法仍然有一些差異. 這時可以先在 Windows 或是 Linux 上先測試完成這些敘述, 會比整合到 mobile 系統上再去 debug 來得有效率.

大部份的情況下, 簡單的 SQL 敘述就可以達成. 但是如果超過 2000 筆資料, 不使用索引, 就會覺得很 low. 一些含有限制式的敘述, 譬如說, WHERE 子句,就比較複雜, 最好先測試.
 
如果用到兩個以上的資料表, 最好先建立測試站, 測試完成無誤再轉移.

雖然, 大部份的平臺都提供了不同程式介面, 及封裝的物件, 譬如說 JDBC for Java, FMDB for Objective-C, 但是它的本質仍然是 SQL 的敘述. 了解 SQL 的敘述, 再去使用這些封裝, 就容易得多了.

 

 

2013年3月25日 星期一

Java Programming Introduction 03: class instantiation


class 是一個虛擬的東西, 要使用它的時候, 要先對它配置記憶體, 並且把它建構起來. 用說的還是比較沒有感覺, 先看一下 code.

1. Instantiation:


example 1:


public class HelloWorld {
        public static void main(String[] args) {

                System.out.println("I'm main");
                HelloWorld hello_world = new HelloWorld();
                hello_world.printMesage();  
        }

        public HelloWorld(){
                System.out.println("I'm constructor");  
        }

        public void printMesage(){
                System.out.println("I'm member");  
        }
}

 
執行的結果如下:

java HelloWorld

I'm main
I'm constructor
I'm member

這邊再說明一下這個執行的順序

step 1, java 載入 HelloWorld.class 這個檔案, 並且在其中找到 HelloWorld 這個同名的 class, 並且在其中找到 main 這個 function, 並且執行它.

step 2, main 這個 function , new 這個 operator 實體化 HelloWorld 這個 class, 配置計憶體, 如果有的話, 呼叫它的建構元 (constructor). 所以這一行程式, 會看起來是這個樣子:

HelloWorld hello_world = new HelloWorld();
class 的名稱後的小刮號, 應該視為 constructor, 而不是 function.

step 3, constructor 被呼叫. constructor 的特別限制是不能有傳回值. 如果 constructor 的執行中遇到問題, 則可以丟出 exception, 由呼叫端去處理.

step 4, 呼叫 printMessage .

到這邊不知道有沒有人覺得很奇怪, HelloWorld constructor 被執行前, HelloWord main 已經被呼叫. 而且是在 HelloWord function 裡面, 去建構自己. 或者, 看看下個例子:

example 2:


public class HelloWorld {

        public static void main(String[] args) {

                System.out.println("I'm main");
                HelloWorld.preConstructor();
                HelloWorld hello_world = new HelloWorld();
                hello_world.printMesage();  
        }

        public HelloWorld(){
                System.out.println("I'm constructor");  
        }

        public void printMesage(){
                System.out.println("I'm member");  
        }

        public static void preConstructor(){
                System.out.println("I'm called before constructor");
        }
}

 

執行的結果如下:

java HelloWorld

I'm main
I'm called before constructor
I'm constructor
I'm member
 

關鍵就是 static 這個 key word.
 

2. static


有一個簡單的方法來瞭解 static. class 可以分解成虛部和實部. static 定義的是實部, 因為是實部, 所以它在被定義之就存在, 不能存取虛部的 member, 同時它也是唯一的.

虛部的部份, 它必需要被實體化, 所以它可以有很多分身.

以下的例子, 說明 static 的唯一性:

public class HelloWorld{

        static String message = "HelloWorld";

        public static void main(String[] args) {

                System.out.println(HelloWorld.message);
 
                HelloWorld hello_1 = new HelloWorld("Hello one");
                System.out.println(HelloWorld.message);                     
                System.out.println(hello_1.message);                   

                HelloWorld hello_2 = new HelloWorld("Hello 2two");
                System.out.println(HelloWorld.message);     
                System.out.println(hello_1.message);
                System.out.println(hello_2.message);           
        }
       

        public HelloWorld(String text){
                message = text;
        }
}

執行的結果如下:

HelloWorld

Hello one

Hello one

Hello two

Hello two

Hello two

從結果可以看到, HelloWorld 的這個 static message, 不需要實體化就可以引用, 它的值是 " HelloWorld". 接下來我們實體化成 hello_1, 並變更 message 的值為 "Hello one", 結果不管是從 class 的名稱 (HelloWorld) 引用, 或是從變數 hello_1 引用, 它的值都是 "Hello one". 接著我們再實體化 hello_2, 連變數 hello_1 message 都變成 "Hello 2two", 唯一合理的解釋, 就是這個 static String message 只有一個, 不管 HelloWord 類別有沒有被實體化, 或是實體化了多少個分身, 就只有這一個.

 

 

2013年3月21日 星期四

Java Programming Introduction 02: misc


在正題之前, 先哈拉一下題外話.

 最近看了一些 Java Programming 的教學網站. 其實資料還算滿多的, 但是, 從一個初學的角度來看, 好像就是把一大堆的東西丟在你面前, 讓你無從下手, 或是一開始先講一些型別, 流程控制, 物件,.... 當然, 從什麼地方入門, 當然是見仁見智. 不過, 從我學習一個新的程式語言的經驗, 一開始要面對不同的程式語言, 不同的開發平台, 甚至不同的 IDE, 不同的函式庫, 往往還沒入門就迷路了, 或是搞不清楚一個 topic 是程式語言本身的範疇, 或是 IDE 增加的屬性, 甚至是函式庫所帶進來的. 這樣在學習會造成困擾, 或是發生問題時, 連要 google 的關鍵字都弄不清楚, 老是找到一些不相干的資訊.

 
我這邊, 最主要的, 是希望提供一個不一樣的觀點. 至於資料型別, 需要再去查, 查過幾遍就會記住. 這些, 我就不囉嗦了.

 以下是比較正統的教學資料. 可以交互參考一下.
http://docs.oracle.com/javase/tutorial/
http://www.tutorialspoint.com/java/index.htm
http://www.java2s.com/Tutorial/Java/CatalogJava.htm
http://www.javabeginner.com/learn-java/introduction-to-java-programming

 1. Java 是什麼 ?


Java 是一種程式語言. Java 寫的程式, 可以由 Java 的編譯器, 轉換成 byte code 的格式. byte code 是一種虛擬的指令碼(機器碼), Java Virtual Machine 可以辨識並執行這個指令碼. 從定義上來說, Java 是一種編譯語言 ( compiled language) 它在編譯階段有經過語法分析及指令碼編成. 也是一種直譯式語言 (interpreted language), 它是被 Java Machine 執行, 而不能自己執行.

* 關於這種分類, 其實沒有太大意義. 譬如說, HTML 是一種 interpreted language , Linux shell script 則根本不算是一種 language.
 
* 語言, 尤其是程式語言, 它是因為需要而產生, 隨時代,環境而變化. 我覺得, 重點應該放在它為什麼被設計成這個樣子? 它追求/想達到的目標是什麼? 為了達到這個目標, 它放棄了什麼 ?
 
 

2. 物件 (Object) 是什麼 ?


初次進入物件導向世界的人, 很難搞清楚物件的概念, 問題就是把它困難化了. 這邊舉一個例子, 幼稚園的小朋友玩家家酒, 一個扮爸爸, 一個扮媽媽, 扮爸爸的就要拿公事包去上班, 媽媽就要去做菜. 在這個例子中, 小朋友一號就是實體化了爸爸這個物件. 所以它就要去實作拿公事包去上班這個方法(method). 小朋友二號實體化了媽媽這個物件, 實作了做菜這個方法. 爸爸和媽媽這兩個物件, 合起來成為家庭這個物件. 也可以說, 家庭這個物件包含(contain)了爸爸和媽媽這兩個物件. 而小朋友在玩的家家酒, 則是具體化了家庭這個物件. 隔壁小朋友在玩的, 則是家庭這個物件的另一個實例 (instance).

 演什麼像什麼, 就是物件的概念. 至於, 物件的定義, 繼承, 封裝, ..., 就逐步去熟悉就可以了.

 3. Java 的組成, javac/java/jar


Java 的核心, 就是編譯, 執行, 打包.
 
javac Java 的編譯器, java 的原始碼, 編譯成 JVM 可執行的檔案 .class.
java Java 的執行器, 內含 JVM, 可以執行 .class
jar Java 的打包器. 可以好幾個 .class 打包成 .jar, .jar可以是函式庫, 也可以是執行檔, 這部份下次會說明.

4. Java Android 的關係


猛獁是一種史前時代的巨大動物, 高度可以到達 4 公尺. 但是在克里特島, 卻因為島嶼化的關係, 高度小型化到 90 公分左右. 但是 DNA 檢驗證明, 這是同一種動物.

同樣的, 為了適應 mobile 的應用, Java 新增/修改成了一個特別的版本, 但是, 它仍然是 Java.
 
通常, 可以在 Desktop 上面撰寫 Java 的程式碼, 再移植到 Android 的平臺上. 我看到有很多人建議這樣做. 譬如說, Eclipse 就整合了 Java/Android 的專案開發/debug, 甚至 git 的版本管理. 在 Eclipse  的開發環境中, 可以對 Java 進行逐步偵錯, 確實比較方便.

5. Java 可以做什麼, Java 提供了什麼 ?


Java 所特重的, 並不是它有提供了什麼, 而是它可以很容易的被重複使用. 因此, 我們可以很容易透過加入其他的 library (jar) , 而完成我們要完成的工作. 甚至, 我們也可以再透過它完成其他的工作. 因此, jar 也被設計成同一個 jar 可以被執行, 也可以被呼叫.

也因為 Java 的這個特性, 我們可以找到非常多的 library 來用. 有些 library 因為太常用, 常常在尋找資料(source code) , 頻繁的出現, 反而造成混淆, 下面列出來一些常見的 library, 了解這些名稱是什麼, 會對自己查資料有幫助:

AWT (java.awt): GUI (Graphic User Interface) library
Swing (javax.swing): GUI (Graphic User Interface) library.
SWT (The Standard Widget Toolkit): GUI (Graphic User Interface) library
Eclipse: an IDE (一種整合開發環境 )

JDBC (Java Database Component): 資料庫介面

java.io (Java input/output library)
 

另外, 以下列出來了很多 java 可以用的 library, 有點印象會對了解找到的 source code 有幫助.
http://en.wikipedia.org/wiki/Category:Java_libraries