2010年10月26日 星期二

原始碼 diff and patch

開發專案的時候常常需要協同合作,可以不用把所有原始碼寄給對方,只把寄自己修改過的內容就可以。下面是一個操作實例,修正內容我們可以用diff 指令產生,而對方用 patch 把你修正的內容加入原始碼。


1. 自己開發的程式內容
檔案列表如下
test/Makefile
test/test.c
test.c 內容如下
#include <stdio.h>
int main(int argc, char **argv)
{
    printf("Hello World!\n");
    return 0;
}
2. 打包寄給協同開發者
將 test 整個打包
tar czvf test.tgz test/
3. 協同開發者開始更改
tar zxvf test.tgz
cp test test1 -rf
檔案列表如下
test1/Makefile
test1/test.c
test1/README
README 內容如下
Hello! It's README file.
修改 test.c 內容如下
#include <stdio.h>
int main(int argc, char **argv)
{
        printf("Hello World!\n");
        printf("Hello c program\n");

        return 0;
}
4. 產生 patch 檔
語法如下
diff -Naur [from-file] [to-file] > [YourFileName.patch]
-N    In  directory comparison, if a file is found in only one directory, treat it as present but empty in the other directory.
-a    Treat  all  files as text and compare them line-by-line, even if they do not seem to be text.
-u    Use the unified output format.
-r    When comparing directories, recursively compare any subdirectories found.
依我們的情況下指令如下,產生 test.patch 檔
diff -Naur test test1 > test.patch
test.patch 內容如下
diff -Naur test/README test1/README
--- test/README 1970-01-01 08:00:00.000000000 +0800
+++ test1/README        2010-06-09 16:01:32.000000000 +0800
@@ -0,0 +1 @@
+Hello! It's README file.
diff -Naur test/test.c test1/test.c
--- test/test.c 2010-06-09 16:01:06.000000000 +0800
+++ test1/test.c        2010-06-09 16:00:25.000000000 +0800
@@ -3,5 +3,6 @@
 int main(int argc, char **argv)
 {
        printf("Hello World!\n");
+       printf("Hello c program\n");
        return 0;
 }
將 test.patch 寄回給原開發者
5. 開始 patch
patch 語法如下
patch -p0 < [patchfile]
將之前的test.tgz解開
tar zxvf test.tgz
patch -p0 < test.patch
[~]# patch -p0 < test.patch
patching file test/README
patching file test/test.c
6. 移除 patch 內容
再作一次patch即可,程式會詢問你
或者也可以增加參數 -R 來回覆修改
patch -p0 < test.patch
或是
patch -R -p0 < test.patch
[~]# patch -p0 < test.patch
The next patch would create the file test/README,
which already exists!  Assume -R? [n] y
patching file test/README
patching file test/test.c
Reversed (or previously applied) patch detected!  Assume -R? [n] y


終端機下 mount windows 網路芳鄰資料夾

將windows分享資料夾(或是用samba分享的linux資料夾)mount成一個資料夾,如此一來登錄一個Server,就能連結全世界!!

假設你的分享路徑及使用者密碼如下:
//jimmy-desktop/share
username: public
password: public

1. 建立空目錄給 mount 用,假設我mount在/mnt/share。
mkdir /mnt/share
2. 下指令,記得linux路徑要把倒斜線改成斜線,指令如下
# mount -t cifs [Windows/Samba分享路徑] [Mount資料夾] -o user=USERNAME
# -o 後接選項,填上帳號跟密碼。
mount -t cifs //jimmy-desktop/share /mnt/share -o user=public -o password=public
3. 成功! 資料夾 share 就是我自己電腦分享的資料夾。

2010/11/04 補充說明:
如果想要開機順便就mount起來,那麼可以參考下面作法。

#依照前面範例,修改 /etc/fstab,在檔案最後加上下面設定。
//jimmy-desktop/share /mnt/share smbfs user=public,password=public, 0 0

2011/02/09 補充說明:
如果在mount的時候發現 wrong fs type 錯誤訊息,請安裝cifs-utils套件。


參考資料:
1. mount.cifs
2. http://www.automaticable.com/2008-01-18/how-to-mount-a-network-drive-in-ubuntu/

gnome 改變視窗按鈕位置

在windows下已經習慣了最大化最小化和關閉按鈕在右上角,如果想改變ubuntu下按鈕的位置,請依照以下步驟:

1. Alt-F2 開啟『執行程式』視窗,並輸入以下指令 gconf-editor 並執行

2. 出現『組態編輯器』視窗,請在左邊樹狀目錄點選 apps->metacity->general

3. 點兩下選右邊相對應清單的 『button-layout 』,編輯鍵值如下『menu:minimize,maximize,close』,修改完畢直接關掉即可。

2010年10月23日 星期六

在 ubuntu 上用 firefox 登入網路ATM

台灣的玉山銀行提供了ubuntu下firefox的一個外掛,這樣子就可以不用為了上網使用晶片金融卡而開windows了。

1. 安裝需要的套件 pcsc (我使用ubuntu 10.04)
選取 系統->管理->Synaptic套件管理程式
視窗點選 設定->軟體來源
把ubuntu軟體分頁下的這些選項都選起來。
『Canonical 支援的開放原始碼軟體』
『社群協力維護的開放原始碼軟體』
『私有版權的硬體驅動程式』
『受版權或相關法律規定限制的軟體』

確定之後就重新整理並加入以下套件
libccid
libpcsclite1
libpcsc-perl
pcscd
pcsc-tools

2. 啟動 pcsc 服務
開啟終端機(應用程式->附屬應用程式->終端機)
執行下面指令
jimmy@ubuntu:~$ sudo /etc/init.d/pcscd restart

3. 確定您的晶片卡讀卡機是否可用
一樣在終端機下執行以下指令,依照讀卡機不同,偵測到的裝置名稱可能有所不同。
jimmy@ubuntu:~$ pcsc_scan
PC/SC device scanner
V 1.4.16 (c) 2001-2009, Ludovic Rousseau
Compiled with PC/SC lite version: 1.5.3
Scanning present readers...
0: Realtek (20070818000000000) 00 00

Sat Oct 23 21:06:35 2010
Reader 0: Realtek (20070818000000000) 00 00
Card state: Card removed,

4. 開啟firefox 連到玉山銀行 WebATM plugin 這個網頁來安裝firefox外掛。

5. 使用玉山銀行WebATM服務
把金融卡插好,登入這個網路進行服務。可惜的是玉山銀行之外的晶片金融卡只能查餘額、交易紀錄和轉帳功能而已。

參考:
玉山銀行WebATM FAQ https://netbank.esunbank.com.tw/webatm/clinic/default.asp

2010年10月11日 星期一

[Android] Lession 2 編譯並在模擬器上跑Android

閱讀本文請參考先前的介紹

編譯前設定
依照官方網頁說明,編譯之前需要執行 build/envsetup.sh,這個動作會加入一些常用指令,請在終端機執行help參閱。
jimmy@ubuntu:~/mydroid$. build/envsetup.sh
including device/htc/dream/vendorsetup.sh
including device/htc/passion/vendorsetup.sh
including device/htc/sapphire/vendorsetup.sh
jimmy@ubuntu:~/mydroid$ help
Invoke ". build/envsetup.sh" from your shell to add the following functions to your nvironment:
- croot:   Changes directory to the top of the tree.
- m:       Makes from the top of the tree.
- mm:      Builds all of the modules in the current directory.
- mmm:     Builds all of the modules in the supplied directories.
- cgrep:   Greps on all local C/C++ files.
- jgrep:   Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- godir:   Go to the directory containing a file.

Look at the source to view more functions. The complete list is:
add_lunch_combo cgrep check_product check_variant choosecombo chooseproduct choosetype choosevariant cproj croot findmakefile gdbclient get_abs_build_var getbugreports get_build_var getprebuilt gettop godir help isviewserverstarted jgrep lunch m mm mmm pid printconfig print_lunch_menu resgrep runhat runtest setpaths set_sequence_number set_stuff_for_environment settitle smoketest startviewserver stopviewserver systemstack tapas tracedmdump
通常執行完 build/envsetup.sh 之後,預設的設定是 generic-eng ,也就是模擬器可以跑的版本,如果你是要給自己的手機用的,可以執行lunch或是tapas來挑選你自己想要的設定。
jimmy@ubuntu:~/mydroid$ lunch

You're building on Linux

Lunch menu... pick a combo:
1. generic-eng
2. simulator

Which would you like? [generic-eng] 1
當你執行過lunch,會自動設定一些環境變數,列出幾個重要的如下(這裡的是我的例子):
# 預定要編譯的版本
TARGET_PRODUCT=generic
TARGET_BUILD_TYPE=release
TARGET_BUILD_VARIANT=eng
# 編譯輸出檔案和映像檔的預設位置
ANDROID_PRODUCT_OUT=/home/jimmy/mydroid/out/target/product/generic
開始編譯
設定好之後,直接make編譯,如果想要自己編譯sdk就執行make sdk編譯sdk。我們會編譯出來的東西都在out資料夾裡面,但是也可以自訂位置。
# Normal build
. build/envsetup.sh
# 編譯 Android source code 加上 SDK
make -j2 sdk
# 也可以只編譯 Android source code
make -j2
編譯出來的映像檔案 system.img、ramdisk.img、userdata.img 就擺在環境變數 ANDROID_PRODUCT_OUT 指定的位置。
#ANDROID_PRODUCT_OUT 的預設位置
mydroid/out/target/product/generic
編譯出來的sdk資料夾跟壓縮檔則擺在這裡。
mydroid/out/host/linux-x86/sdk/android-{Your_Build}_linux-x86
mydroid/out/host/linux-x86/sdk/android-{Your_Build}_linux-x86.zip
如果是只針對framework需要修改,那麼sdk不用每次都編譯,因為每次make都會把out/host資料夾都刪除。所以第一次編譯出sdk的時候就可以先把sdk資料夾或是壓縮檔複製下來,擺到其他地方使用(例如家目錄)。
cd ~/
#複製SDK到其他位置
cp mydroid/out/host/linux-x86/sdk/android-{Your_Build}_linux-x86.zip .
unzip android-{Your_Build}_linux-x86.zip
#方便起見建一個link
ln -s android-{Your_Build}_linux-x86 mysdk
新增/設定Android Virtual Machine (AVD)
接下來利用sdk的工具,有幾個命令需要先熟悉,android、emulator和adb,可以參考官方網頁說明
先新增一個AVD,我們需要用到SDK的工具,將下載來的SDK或是自己編譯好的SDK複製到自己選定的位置,這邊的例子是mysdk。
cd ~/mysdk/tools
# 列出所有 AVDs
./android list avd
# 新增一個AVD,名字myavd,Target ID為1,設置128M bytes SD Card。
# Target ID 可以打 ./android list targets 來查詢,一般有成功編譯應該會有。
./android create avd -n myavd -t 1 -c 128M
執行模擬器
終於我們可以開始跑模擬器了,直接進入先前我們複製好的SDK資料夾,執行emulator。
cd ~/mysdk/tools/
#方便我們指定編譯出來的system.img等檔案,
#再建一個link到環境變數ANDROID_PRODUCT_OUT指定的位置。
ln -s mydroid/out/target/product/generic imgs
#不使用AVD建立時指定的映像檔,改用我們指定的
# system.img ramdisk.img userdata.img
./emulator -system imgs/system.img -ramdisk imgs/ramdisk.img -data imgs/userdata.img

更多有用的資料,請參考emulator的說明

2010年10月8日 星期五

[Android] Lession 1 設定ubuntu 10.04 並下載編譯 Android

在ubuntu 10.04 下配置環境供編譯 Android 2.1 (也稱作奶油麵包eclair)的過程,請參考官方網站說明。特別說明一下,Android網站主要分作兩個,一個是 Android Developer,專門提供給在Android平台上開發Java應用程式的人。另外一個是Android Open Source Project,包含了所有Android Source Code,提供給底層硬體實作的人。
# 請參考官方網站來下載 Android 所有的程式碼
http://source.android.com/source/download.html
官方網站的訊息十分詳盡,不過如果想省點時間,可以參考下面我整理過的步驟。

以下所有步驟都是在終端機下執行的,開始依照步驟跑吧。
# Step1 下載source code,請安裝 git 和 curl 套件
Install git and curl
sudo apt-get install git
sudo apt-get install curl
# Step2 安裝google 程式碼版本控制程式 repo 在 home 目錄
cd ~
mkdir bin
# 下載 repo ,加上執行權限。
curl http://android.git.kernel.org/repo >~/bin/repo
chmod a+x ~/bin/repo
# 將 repo 加入路徑
echo "export PATH=${PATH}:~/bin/" >> ~/.bashrc
. ~/.bashrc
# Step3 開始下載 Android 2.1 奶油麵包 eclair
mkdir mydroid
cd mydroid
repo init -u git://android.git.kernel.org/platform/manifest.git -b eclair
# 也可以改用這行來抓 Android 2.2 冷凍優格 froyo
# repo init -u git://android.git.kernel.org/platform/manifest.git -b froyo
repo sync
#repo sync 執行就會開始抓程式碼,Android 2.1大概3.XG,大概要好一陣子了XD。
上面的動作就可以把我們需要的 Android 2.1 抓下來了,接下來我們設定 ubuntu 10.04 來編譯 Android。

這邊要注意,因為 Android 2.1 沒辦法用 Java 6 來編譯(主要是 javadoc有差),所以要改用 Java 5 ,而 ubuntu 10.04 已經不包含 sun-java5-jdk 套件了,所以我們只好加入 9.04 的套件來源來安裝 sun-java5-jdk。這也是最省事的方法,不然就要自己手動安裝 JDK 1.5 的套件,還要自己設定環境變數 $JAVA_HOME 和 $ANDROID_JAVA_HOME。
#Step4 設定ubuntu 10.04,加入 9.04套件來源,並且更新列表。
apt-add-repository "deb http://us.archive.ubuntu.com/ubuntu/ jaunty multiverse"
apt-add-repository "deb http://us.archive.ubuntu.com/ubuntu/ jaunty-updates multiverse"
apt-get update
#Step5 安裝編譯Android所需要的套件
apt-get install git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev sun-java5-jdk
最後,終於可以開始編譯了。
#Step6 編譯 Androd
cd mydroid
export USE_CCACHE=1
. build/envsetup.sh
# use -j4 if you have dual CPUs
make -j2
make -j2 sdk
接下來會介紹 Source code的架構,下回揭曉。

Fail to install deb behind proxy

如果有遇到明明有在桌面環境設定了proxy卻沒辦法在 Terminal 下使用apt-get 來安裝套件,請依照下面方式來設定。主要的原因是因為 gnome 的代理伺服器只能用在桌面環境的軟體,而命令列下則沒辦法參考到。
#先設定gnome下的proxy setting,套用全系統。
#位置在 系統->偏好設定->代理伺服器
#再修改 /etc/apt/apt.conf ,依照個人的情形設定proxy帳號、密碼、位置跟 port 編號。
Acquire::http::proxy "http://USERNAME:PASSWORD@my.proxy.com:8080/";
Acquire::ftp::proxy "ftp://USERNAME:PASSWORD@my.proxy.com:8080/";
Acquire::https::proxy "https://USERNAME:PASSWORD@my.proxy.com:8080/";
這樣在 terminal 下應該就可以用apt-get了。