2008/10/30

慶祝我的 3G 無線網卡開通

以前一直為了無法在 ubuntu 8.04 之前的版本使用華為的 3G 無線網卡而很少使用 Ubuntu, 說到這個,因為之前跑去鴻海這個鳥地方,網路常常被擋,所以申請 3G 門號後,把家裡的 ADSL 停掉了,也因此變成只能用 Windows 上網,幸好,今天在灌了 Ubuntu 8.10 rc1 之後,終於通了。

8.10 絕對是值得使用的,除了 3G 之外,還有藍芽也變得好設定,無線網路也是,總之一個爽。另外還看到多了一個 "Create USB startup disk", 雖然這功能我都是手動處理。

2008/10/28

遠端備份? tar netcat

大家都知道可以用 tar 來備份 copy filesystem between computers教你怎麼在多台電腦上互相備份。

電腦 A, IP 192.168.10.101
cd /mnt/sda1
tar -czpsf - . | pv -b | nc -l 3333

電腦 B,
cd /mnt/sdb1
nc 192.168.10.101 3333 | pv -b | tar -xzpsf -


其中 pv 是 pipe viewer, 功用是用來看傳檔過程的「進度」,不見得系統中有此命令,可以安裝後再用或是直接省略掉,那就變成:
電腦 A, IP 192.168.10.101
cd /mnt/sda1
tar -czpsf - . | nc -l 3333

電腦 B,
cd /mnt/sdb1
nc 192.168.10.101 3333 | tar -xzpsf -

淺談觸控螢幕 what difference between touch screen, mouse, keyboard

觸控螢幕的價值,在於讓使用者對裝置(含 NB, Mobile)的操作習慣更人性化。當然離人性化或許也還很長。

現有的作業系統,全都在滑鼠、鍵盤的裝置上操作。其中鍵盤是為了輸入,要人性化必須加入語音與手勢,硬體相對麻煩,而滑鼠則用來定位。這兩者都容易扭曲人體力學,容易罹患什麼網球肘之類的疼痛。觸控螢幕可以減低這種痛苦,另外也減輕滑鼠定位的不便性,甚至可以利用來做手寫輸入,對小裝置而言,在設計上也可以減少滑鼠、鍵盤帶來的不便性(醜、貴)。

觸控螢幕不應該只視為滑鼠,在我想像中,它就是輸入裝置,應該是滑鼠與鍵盤兩種兼具,因此勢必打破現有的作業系統架構。在 Windows 上,有兩種作法,簡單說明如下:

一、利用 DLL 共享資訊。Application 應該有能力自行取得觸控螢幕的資訊,像有幾個觸控點,位置,大小,移動速度等。
二、利用 SendMessage 搭配 WM_COPYDATA 訊息來溝通。這一點主要是要用來做手勢,想像中,應該有一個「服務」就叫 gesture service, 要有辦法像滑鼠事件或鍵盤事件,傳遞手勢事件出來。當然,這在現行作業系統中並無此項設計,所以才說搭配 WM_COPYDATA。這機制可以自訂訊息格式。

觸控螢幕與鍵盤滑鼠不同的地方在於,它並不像鍵盤有那麼多按鍵,也沒有滑鼠的「左右鍵」。因此硬要將之轉換成滑鼠鍵盤事件,總是有很大的差異,而限制也很大。譬如,怎麼發出滑鼠右鍵?事實上,滑鼠的設計有單鍵、雙鍵、三鍵、三鍵+滾輪等不同的設計,沒必要硬要讓觸控螢幕當成滑鼠。


參考資料:
http://msdn.microsoft.com/en-us/library/ms644950(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms649009(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms648710(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms649010(VS.85).aspx

2008/10/17

Dillo, embedded browser 嵌入式裝置的良伴

若要選擇嵌入式的瀏覽器,相信很多人會選擇 Opera, 或是 Webkit, 但是我曾經選過 Dillo, 又小速度又快,就算只拿來當 UI 也很棒,因此推薦給大家,目前正推出 2.0 版。其實不少人愛用 Dillo, 雖然它沒有良好支援 Javascript,但是拿來看日常的網站也都正常。

2008/10/16

SVN 版本控管

這樣的文件雖然很多,但是這篇是我的同事寫的,在我的辦公室經驗同仁驗證,我只是代為貼上來,他叫 Johnnie.

什麼是SVN?

SVN全名Subversion,是一個版本控制系統版本控制系統,相對於的RCS、CVS,採用了分支管理系統,它的設計目標就是取代CVS。網際網路上免費的版本控制服務多採用Subversion。
本文主要簡述:1. SVN Repository的架設 2. User如何在client端的電腦透過SVN對檔案作版本控制。
需要更詳細的說明,可參考下面的資料:
Subversion官方網站
TortoiseSVN官方網站
SVN Book(英文)
SVN Book(中譯)
Wiki
TortoseSVN 使用簡介
相當實用的電子書

Subversion (Sever端) 資料庫的建立流程



1. 首先到 SVN官方網站 http://subversion.tigris.org/下載Subversion, 並且在server端的電腦安裝 svn-1.4.3-setup.exe
2. 安裝完後, 點選 開始à執行,輸入 cmd svn
3. 接下來, 建立一個你要的資料庫(目錄/資料夾),例如 C:\Repository\test, 在文字模式底下輸入命令

svnadmin create C:\Repository\test

4. 在剛建立的目錄下(test), 裡面會有 3 個檔案
authz
passwd
svnserve.conf

5. 將這3個設定檔換成下面的範例
passwd 檔案設定範例
[users]
User = 123456


svnserver.conf 檔案設定範例
[general]
anon-access = none
auth-access = write
password-db = ../../passwd #小技巧可以讓很多Project 共用一份密碼檔案
authz-db = ../../authz ##小技巧可以讓很多Project 共用一份權限設定


authz 檔案
[groups]
# 註解
RD = User

[:/]
#root 的存取權限
@RD = rw
User = rw

[AlarmTest:/]
#每個目錄都需要來一段,要不然不會動
@RD = rw

[temp:/]
#temp 任意人都可以讀取
* = r


6. 點選 開始->執行, 然後在文字模式底下輸入命令輸入:
sc create Subversion binPath= "c:\Program Files\Subversion\bin\svnserve.exe --service -r C:\Repository" DisplayName= "Subversion" start= auto depend= TCPIP
7. 點選我的電腦右鍵, 管理->服務及應用程式->Subversion
並且在服務狀態那點選啟動







8. 進行測試,在文字模式底下輸入命令:
svn co svn://localhost/test C:\MyProject
localhost 為本機的網域名稱(因為SVN架在自己的機器上面所以使用 localhost或是 127.0.0.1),理論上應該伺服器的IP或是網域名稱
P.S 如果還不行連到svn 的database,去檢查防火牆是否開啟,在控制台底下點選Windows防火牆,點選 例外->新增連接戶->確定,然後新開一個port:
名稱 :Subversion
連接戶編號:3690






TortoiseSVN (Client端) 使用流程

1. 首先到SVN官方網站下載TortoiseSVN,並且在你的電腦安裝 TortoiseSVN-1.5.4.14259-win32-svn-1.5.3.msi
2. 安裝成功後,按下滑鼠右鍵,應該可以看到下圖:




3. 取得(Checkout) Repository?

例如:在你的桌面上新增一個Working資料夾,點選滑鼠右鍵,選擇 SVN Checkout…,在URL of repository欄位中,輸入server端資料庫的路徑:
svn://10.243.12.167/test





輸入使用者的帳號和密碼,點選OK





4. 如何新增檔案或目錄到Repository?

需在檔案或目錄的icon上面,按滑鼠右鍵並且選擇TortoiseSVN->Add,TortoiseSVN會把要加入的檔案或目錄顯示出來,打勾的表示要被加入到Repository。 注意!Add的動作並未將檔案放到Repository中,它只告知SVN準備要在Repository中放入這些檔案,因此,如果你檢視這些檔案時,會看到一個驚嘆號標誌在檔案icon的下方。
注意:新增的檔案要經過提交(Commit)的動作才回真正的放入Repository





5. 如何提交(Commit)修改過的檔案或目錄?

需在檔案或目錄的icon上面,按滑鼠右鍵並且選擇SVN Commit…





在Message欄位中輸入本次提交的紀錄訊息,以利日後版本追蹤




6. 更新(Update)檔案或目錄

為何需要更新?由於版本控制系統多半都是由許多人共同使用。所以,相同的檔案可能還有人會去進行編輯或修改。為了確保你工作目錄中的檔案與Repository中的檔案是同步的,建議你在編輯前都先進行更新的動作。

在想要更新的檔案或目錄icon上面按下滑鼠右鍵,並且選擇SVN Update


2008/10/15

winXP 回復 mbr?

最近拿了顆外接硬碟灌了 ubuntu, 結果卻害我的硬碟無法從原來的 C: 開機,後來找到這篇restore your MBR,裡頭提到工具可以在此找到 ,執行時要加參數,所以你要知道放哪兒,文中提到放 C:\ 最簡單,命令如下:

MbrFix /drive 0 fixmbr /yes

讓 bash script 具多重檔案的輸入

bash redirecting input multiple files一文提到怎樣讓你的 shell script 能夠同時由標準輸入轉向讀多個檔,簡單講就是像:

#!/bin/bash

while read f1 <&7
do
read f2 <&8
echo $f1 $f2
done \
7<$1 \
8<$2


這寫法有幾點可以提出來談:
一、 while 那行尾部的 <&7 及 <&8 這種寫法,是把 file handler 轉向輸入,若你會寫 C/C++ 的話,可以用 fileno(FILE*) 來取得 file handler, 是個整數,沒錯,就是這邊的 7, 8 的意思。(註: 或由低階函數 open() 所傳回的也是此 file handler)
二、檔案後面二行的 7<$1 及 8<$2 是把命令參數第一個當 file handler 7, 第二個參數當 file handler 8。因此搭配第一點就變成: 把第一個參數的檔由 f1 讀,而第二個參數的檔由 f2 讀
三、這種寫法適用範圍不多,因此少有人提,若不是像文中所提要拿來比較(或逐行並列)的話,比較常見的用法是把多個檔一行一行讀進來,那很簡單只需要用 cat File1 File2 | YOUR_SCRIPT 的方式即可。

2008/10/08

你的PRIVACY 2.0

【科學人2008年第80期10月號】裡有一篇文章講「你的PRIVACY 2.0」,也非常值得深思,我一樣再摘出一小小段與大家分享:

■隱私遭到侵犯通常被當成是其他類型的傷害。

■「失去隱私」事實上可能是「失去安全」。

■如果每個人都能夠負擔得起醫療照護,那麼對遺傳隱私的焦慮應該會消失大半。

■民眾應該有權監控並公佈與政府活動及政府官員相關的資訊。

■人們正獲得有效的工具,可以自行掌控想要公佈哪些個人資料,以及所公佈的對象。

資料融合:整合你的一舉一動

科學人2008年第80期10月號裡面有一篇文章說到「資料融合:整合你的一舉一動」這件事,我個人到底是什麼想法呢?先不管,但是大家可以前往看看。

該網址已經是書摘了,我把摘一小小段出來:

資料融合的用途廣泛,而應用在尋找潛藏的恐怖份子時,引起了最激烈的公共辯論。美國海軍少將彭岱特(John Poindexter)與國防高等研究計畫署(DARPA)的波普(Robert L. Popp)在2006年表示:「偵測恐怖份子的關鍵在於觀察現在與過去恐怖攻擊的計畫,據此尋找恐怖攻擊計畫的行動模式。」他們認為如果美國政府能從市場交易的資料庫中,找出不是農民卻大量購買肥料的記錄,那麼1993年的世貿中心爆炸案、1995年的俄克拉荷馬爆炸案都是可以避免的。但是想要取得這些購買記錄,並與農田所有者與聘僱記錄的資料庫媒合,政府必須史無前例地取得私人電腦系統的使用權,全國每個人的每筆轉帳記錄都會在沒有正當理由的情形下受到監控。基於上述理由,國會決定在2003年取消彭岱特與波普的「全面資訊監控」(TIA)研究計畫。

2008/10/06

Prism 讓 web application 成為真正的應用程式


這題目是最近在思考「瀏覽器能做什麼」下的產物,但是我一直在關注這議題。若我前一封說 Mozilla/Firefox 瀏覽器現在正適合拿來開發應用程式,其中有一個算是重要的技術是「離線瀏覽」,像google gears據說要內建於 Mozilla 之中,它就是可以讓你把 google docs變成本地端的應用程式,在你沒上網的時候仍然可以用。

那麼有另一項議題,要使用上面所述的網路應用程式,為什麼一定要開啟瀏覽器?也會因為瀏覽器的 theme 讓網路應用程式看起來就有那麼一點不倫不類的感覺。是的,Mozilla 很早以前就提供 XUL runner, 可是這也得是「XUL」才行,最近有個擴充套件叫Prism, 早期叫Webrunner, 在該頁說明就有提到現有示範的網路應用程式有:

* Gmail: gmail.webapp
* Google Calendar: gcalendar.webapp
* Google Docs: gdocs.webapp
* Google Groups: groups.webapp
* Google Analytics: ganalytics.webapp
* Google Reader: greader.webapp
* Facebook: facebook.webapp
* Twitter: twitter.webapp

像這樣的應用,我覺得頗適合像 MID 或是 Smart Phone 這類的手持裝置,讓你可以把網站所提供的服務當成真正的應用程式般放到桌面。

2008/10/03

瀏覽器能為你做什麼? What can mozilla do?

要開發應用程式,難免不會想到用 C/C++/Java 來開發,可是愈來愈多的案例證明,應用程式,若沒連上網路則有如垃圾一般,就算是遊戲也是如此。

寫應用程式難免要顧慮到 GUI, 也要顧慮到上網這件事,GUI 不管在 VC++, BCB, Java 等等都有不錯的套件足以因應,就算是上網也都有有辦法用這些語言開發完成。可是在愈來愈多的網路應用出現後,Google, Yahoo, Microsoft 致力推展所謂的雲端運算的目的不外乎把開發者的眼光集中,透過瀏覽器來開發網路應用程式變得愈來愈成熟。

開發 Native Internet Application 必須花大量的心思在 cookie, proxy, user authentication, 或 encryption/decryption 等等議題上,還不止如此,包括應用程式功能如何擴充?外觀如何提供讓使用者自訂的能力?多國語言如何完成?如何提供 3rd party 或 end-user 自行開發新功能?如何共享成果?

不多說廢話,讓我把心力專注在 Mozilla 上面。有興趣的人可以到 發展 Mozilla去讀。

Topic 項下提到:

* Extensions : 利用像 XUL 這種標準來擴充與發展自有應用
* Plugins : 有些瀏覽器尚未提供,或是想要把原始碼隱藏的更好的人,可以利用這項來開發應用
* Themes : 外觀
* Embedding Mozilla: 將瀏覽器嵌入到自己的應用程式中,也就是讓自己的應用程式輕鬆的具有瀏覽器功能,或是開發精簡型的瀏覽器

* Accessibility: 對身體部份功能不良的人可以自訂存取方式,例如聲控什麼的
* Localization: 多國語系
* Web Standards: W3C 標準的支援
* Web Development: 網頁/網站的開發

* Developing Mozilla: 若想投身瀏覽器開發的人,Mozilla 是個很好的切入點
* Quality Assurance: 品質保證
* Security: 安全認證

以上您或許還看不出可以怎樣利用 Mozilla,那讓我們再看看 Technologies 項目:
* AJAX - Asynchronous JavaScript and XML : 最有名的就是 google ajax api 或 GWT 或 Yahoo UI
* CSS - Cascading Style Sheets
* DOM - Document Object Model
* HTML - Hypertext Markup Language
* JavaScript : 這四項應該不必多說,標準瀏覽器應該具備的功能
* NSS - Network Security Services: 用來讓網路存取更加安全
* RDF - Resource Description Framework : 開發 extension 必備
* RSS - Really Simple Syndication : 這項已經變成我每天閱讀新聞的工具
* SVG - Scalable Vector Graphics : 純量畫圖的,個人認為把 papervision3D 移植並非難事,不過目前的發展似乎反過來,在 pv3d 中處理 SVG 比較成熟
* XBL - Extensible Binding Language : 用來 binding 網頁應用程式上的元件到你的程式,也就是你可以自訂元件工作的方式
* XForms - XML Forms : 這個是把 Form 以 XML 的方式傳送,除了資訊的表達更清晰外,還可以有更多的「動作」,兼減輕 CGI/Javascript 並且讓資料庫伺服器自行分析減輕開發者的壓力。
* XML - Extensible Markup Language : 不必我多說
* XML Web Services - SOAP, XML-RPC, etc.: SOAP 叫精簡物件存取協定,顧名思義不難瞭解,就是用來直接傳遞「以 XML 表達的物件」,AJAX 比較傾向於單向的要資料,而這個掛了個 RPC 就不難理解為雙向的交換資料
* XPath - XML Path Language: 用來指定 XML 元件在 XML 文件中的位置,會比 document.getElementById() 還方便有效率。不過個人沒在用這項功能,在允許的情況下會直接以 JSON 或 document.getElementById() 的方式存取 XML
* XSLT - Extensible Stylesheet Language Transformations : 上面 XPath 比較有用的應用是在搭配 XSLT。XSLT 簡單講是用來轉換 XML 成 HTML 或純文字之類的成果以便閱讀。另外因為 XML 允許自訂 tag, 因此彼此間的轉換也成為擾人的議題,這是 XSLT 存在的主要原因。而搭配 XPath 就可以很方便的互相引用。
* XUL - XML User Interface Language : 這是發展瀏覽器 extension 最佳利器,自行發展 web application!

其實 Mozilla 能做的事遠遠無法從上面看出來,我比較喜歡的兩項功能分別是:Server Socket 與 SQLite 的支援,這可以讓我們做不少事,後面抽空再來介紹。

要利用 Mozilla 瀏覽器開發網路應用程式就應該對 XULRunner 及 XUL 參考手冊有所涉略。

後面會再來探討 Mozilla 用來開發 3D web application 的議題。若有人要自行編譯 Mozilla, 請參考 在 Windows 下編譯 Mozilla一文

2008/10/02

Bash 參數的展開

bash parameter expansion一文對 bash 在變數(參數)的解釋有不錯的說明。

寫 shell script 不難,變數(參數)的取用也相對容易,最簡單的是像 $a 這種型式,指定值的時候是 a=變數值, 早期等號(=)前後不能有空白,但是這邊提醒一下,養成良好的習慣遠比什麼效率或美感重要,通常我在引用變數時都寫成 ${a} 的方式。其中的原因在於不讓 shell 解釋錯誤,例如 ${a}bc。而像字串的比對,我也會加上引號,例如 [ "${a}" = "" ],因為你雖然可以很確定卻永遠不會知道 ${a} 是否真的正確定義。

因為上面的說明裡面講到「正確定義」這件事,所以 bash 有「預設值」的用法,b=${b:-預設值},例如 LENGTH=${LEN:-0} 就會在 LEN 沒被定義時指定 0 給 LENGTH

這邊有個 test.sh 裡面是這樣寫的:

TEST_MODE=${TEST_MODE:-0}
...
if [[ $TEST_MODE -eq 0 ]]; then
echo "Running in live mode"
else
echo "Running in test mode"
fi

除了使用了預設值的觀念外,平常 shell script 在執行時 TEST_MODE 的值是 0, 若你想機動的將之變成 test mode 相對上非常簡單,語法如下:

$ env TEST_MODE=1 sh test.sh

變數在使用時,有些「編輯」動作可以用,先講一個不常見的搜尋與取代用法 ${VAR/search/replace}

VAR=aabbcc
echo ${VAR/b/-dd-}

結果會是 aa-dd-bcc <-- 只取代了一個,要想全部取代請用 ${VAR//search/replace}:

VAR=aabbcc
echo ${VAR//b/-dd-}

結果就會是 aa-dd--dd-cc。值得注意的是,別把 perl 常用的語法應用在這兒,取代的後面沒有斜線,我就不多寫省得學錯。

另外最出名的,就是 %, %%, #, ## 這種的編輯方式,直接舉例來看:

file=/home/wade/data.txt
echo "${file%/*}" # /home/wade
echo "${file##*/}" # data.txt

結果寫在註解中, # 與 % 的差別在於前置與後置,可以藉由在鍵盤上的排列來聯想,兩個都有著「餘」數的概念,其中 % 是將字串扣掉後面符合比對字串「最短」內容,因為比對字串是 /* 因此有三個 / 符合,扣掉最短的內容 /data.txt 後就剩下 /home/wade。而 ## 則是將字串扣掉前面符合比對字串「最長」內容。多用就會有感覺。

也可以取得變數特定位置的子字串,有點像 substr(),語法為 ${VAR:offset:length}, 其中 offset 若被省略表示從頭開始,而 length 省略表示一直到字串的最後,例如:

$ VAR=/home/wade/data.txt

$ echo ${VAR:10}
/data.txt

$ echo ${VAR::10}
/home/wade

有一點值得注意的是,若 offset 是負數則表示從後面數過來,可是負數前面加上冒號 ':' 又會被解釋成預設值,因此得用 shell 的數學運算符號 $(( ... )),例如 $ echo ${VAR:$((-4)):1} 會輸出 '.' 這個字元,當然若能夠將數字的引用以變數取代就不會有此困擾,例如:
echo $OFFSET=-4
echo ${VAR:$OFFSET:1}


其它還可以傳回變數字串的長度,例如 echo ${#VAR} 的值是 19

有些內建變數也應該知道,例如 $$, $0, $1, $?, 其意義分別是: PID, 命令本身,第一個參數,以及前一命令的傳回值

2008/10/01

lively another mud?

直接貼網址好了,現在愈來愈懶得寫字。

http://blogoscoped.com/archive/2008-07-09-n11.html
http://www.lively.com
http://sketchup.google.com/3dwarehouse/

Google 愈來做愈多 3D 的東西,頗有趣的是,似乎與我的想法若合符節。