2008/08/11

firefox extension 入門?

期待看入門?先自己看英文的吧,最重要的訊息來自Mozilla 開發者,不過啊,為了節省大家時間,有個Building firefox extensions也建議去看看,尤其最後面附的resources.

接下來要來寫 SVG editor,所以就先省略,到時再一併介紹整個過程,不過話說回來,我目前都在 Windows 上工作,至少要能找到 profile 吧,請在 開始-->搜尋-->檔案或資料夾 的右上角輸入 %APPDATA%\Mozilla\Firefox\Profiles\ 此時不必按 Enter 應該就會跳出你的 Profile 目錄。

我用的瀏覽器是 firefox 3.0.1, 在測試 extension 時,發現因為未提供 https 的安全更新網址造成無法正常安裝,後來提供一個假的 url, 也就是隨便給一個 https://xxx.yyy.zzz 來騙瀏覽器。話說這個安裝採用上面教學文章提到的方式,將安裝目錄寫進檔案中連結到我慣用的目錄,而不是由瀏覽器安裝到預設目錄,作法請自行參閱文章,不過在 Windows 下要注意的是斜線異於常理,所以貼上內容供大家參考一下:
C:\\Temp\\ext-dev\\svgeditor

等會兒我會貼一篇新文章專門翻譯Building firefox extensions。

self extract 以 bash script 建立自解壓的安裝檔

本文主要譯自這兒,用 bash script 建立可以自己解壓的安裝檔(self extract installing file)。

一般利用 tar 來壓縮檔案,在安裝時並不存在像 Zip類似的「解壓後執行」功能,因此無法建立自解壓的安裝檔。Unix 其實有很好的工具可以做到這一點,原理不難,就是利用一個標籤(本文用的是 __ARCHIVE_BELOW__ 來把 shell script 與壓縮檔分開,再利用 awk 與 tail 把此壓縮檔取出來後再安裝。

本文只是簡單示範,想要更聰明的安裝,例如事先指定安裝目錄等等,請自行修改,另外本文雖然示範安裝二個純文字檔,真正在用的時候並沒有此限制,您可以安裝任何檔。為了開放彈性的安裝程序,有個 installer 是解壓後執行,用來真正安裝檔案。

先把整個目錄結構介紹一下:

$ ls -FR .
.:
build* decompress* payload/ selfextract.bsx*

./payload:
files.tar installer*

整個過程其目的是將 payload/files.tar 中被壓縮的檔案安裝到其他機器的系統中,目前該檔只有二個檔如下:

$ tar tvf files.tar
-rw-r--r-- Wade/Wade 11 2008-08-11 09:13 File1.txt
-rw-r--r-- Wade/Wade 22 2008-08-11 09:13 File2.txt

build 這個檔用來將 decompress 及 payload/ 包裝成自解壓的檔,而 decompress 是整個自解壓檔的「頭部」, payload 則是尾部,中間以 __ARCHIVE_BELOW__ 連接。所以這邊有三個 script file, 一個是安裝用的 installer, 一個是解壓用的 decompress, 一個是用來建立自解壓安裝檔用的 build,這三個檔的內容如下:

build:

#!/bin/bash
# 底下三行把 payload 包裝成 payload.tar
cd payload
tar cf ../payload.tar ./*
cd ..

if [ -e "payload.tar" ]; then
gzip payload.tar # 用 gzip 壓縮以減小檔案大小

# 檢查確實有壓成功的話,再將之附到 decompress 後面變成新檔 selfextract.bsx
if [ -e "payload.tar.gz" ]; then
cat decompress payload.tar.gz > selfextract.bsx
else
echo "payload.tar.gz does not exist"
exit 1
fi
else
echo "payload.tar does not exist"
exit 1
fi

echo "selfextract.bsx created"
rm -f payload.tar.gz # 捨棄不要的檔
exit 0


decompress:

#!/bin/bash
echo ""
echo "Self Extracting Installer"
echo ""
# 用 mktemp -d 建立暫時目錄
export TMPDIR=`mktemp -d /tmp/selfextract.XXXXXX`
# 取得前面的 payload.tar.gz 這個壓縮檔內容
ARCHIVE=`awk '/^__ARCHIVE_BELOW__/ {print NR + 1; exit 0; }' $0`
# 配合 tail 及 tar 將之解壓
tail -n+$ARCHIVE $0 | tar xzv -C $TMPDIR

CDIR=$PWD
cd $TMPDIR

# 執行 installer 安裝檔案
./installer

cd $CDIR
rm -rf $TMPDIR # 刪除不必要的暫時檔

exit 0

__ARCHIVE_BELOW__


installer:

#!/bin/bash
# 取得要安裝的目錄,此時的 $PWD 是上面提到的暫時目錄
echo -n "The install directory is ($PWD)? "
read INSTALLDIR
[ "x$INSTALLDIR" = "x" ] && INSTALLDIR=$PWD
# 處理安裝目錄已存在的情況
if [ -e $INSTALLDIR ]; then
if [ -f $INSTALLDIR ]; then
echo -n "The $INSTALLDIR is in file type, remove it at first (Yes)? "
read REMOVE
[ "x$INSTALLDIR" = "x" -o "x$INSTALLDIR" = "Yes" ] && rm -rf $INSTALLDIR || exit 0
elif [ -d $INSTALLDIR ]; then
echo -n "The $INSTALLDIR already exist, remove it at first (No)? "
read REMOVE
[ "x$INSTALLDIR" = "xYes" ] && rm -rf $INSTALLDIR
fi
fi
mkdir -p $INSTALLDIR # 產生安裝目錄
tar xvf ./files.tar -C $INSTALLDIR

特別強調一下,這個 installer 應視需要自行修改,執行畫面如下:

包裝成自解壓檔:

$ ./build
/home/Wade/installer/payload
selfextract.bsx created

$ \ls -FR .
.:
build* decompress* payload/ selfextract.bsx

./payload:
files.tar installer*


執行 selfextract.bsx:

$ bash selfextract.bsx

Self Extracting Installer

./files.tar
./installer
The install directory is (/tmp/selfextract.Wo2424)? /tmp/files
File1.txt
File2.txt

$ ls -l /tmp/files
total 2
-rw-r--r-- 1 Wade Wade 11 Aug 11 09:13 File1.txt
-rw-r--r-- 1 Wade Wade 22 Aug 11 09:13 File2.txt

2008/08/08

Javascript 中的物件導向

有不少人看輕 javascript, 也有更多人像我一樣,只學到古早的 javascript,我早知道 Javascript 可以實現物件導向觀念的程式架構,也早知道 JSON,這邊就來跟大家分享一下怎麼在 Javascript 實現物件導向的程式架構。

Javascript 是 prototype 導向的寫法,與一般 C++, Java, C# 都不一樣的方式,不過它卻讓 Javascript 這種解譯式的語言有辦法使用封裝、繼承、與多形。也正因為 javascript 的解譯式天性,讓你在設計程式時可以即時動態改變物件,包含屬性與方法,甚至是整個物件。

Javascript 的物件表示法有不同的形式,從 new Object, new Function, 或是直接由 JSON 建構都行。本文主要來自 Introduction to Object-Oriented JavaScript ,因此就以該文為範例。


function MyClass()
{
.....
}

var c = new MyClass();


上面的例子裡面,雖然函數(物件)命名為 MyClass, 但是基本上,Javascript 裡面對 Class, Object, Instance 的區分並不是非常嚴謹,只能在使用時來判斷它。譬如就上例而言,似乎 var c = new MyClass() 是產生一個 instance, 例是這個 MyClass 確實也是個函數,可以直接呼叫!不過只要想成呼叫時,也等於偷偷 new MyClass() 也行,或是說,其實背後,全都是 Object,那可能就不會太奇怪了。舉例:


function MyClass()
{
this.MyData = "Some Text";
this.MoreData = "Some More Text";
alert ("in MyClass()");
} // end of MyClass()
var c = new MyClass();
alert (c.MyData + ", " + c.MoreData);

上例的結果會出現兩次 alert, 想來也就順理成章了。若將最後兩行直接改成:
MyClass(); 這樣呼叫函數,嘿嘿,也說得通不是?至於 this 的用法應該不必多說吧?


function MyClass()
{
this.MyData = "Some Text";
this.MoreData = "Some More Text";
} // end of MyClass()
MyClass.prototype.showData = function()
{
alert ("MyData: " + this.MyData + ", MoreData: " + this.MoreData);
} // end of showData()
var c = new MyClass();
// alert (c.MyData + ", " + c.MoreData);
c.showData();

這例子把 MyClass() 的「屬性」顯示出來,原來是在外面存取屬性,改成增加「方法」 showData() 的方式。這範例主要在講方法,即 showData() 的定義方式,及其引用本身物件(類別?)內屬性的方法。

不過,這例子其實是很不好的示範,自己顯示自己常常會牽涉到 GUI 的議題,最好是交由「外面」模組來實作,也就是提供 getData() 取代 showData()

接下來講講封裝。Javascript 並沒有真正良好的封裝,譬如什麼 public, private, 什麼的一堆有的沒的,當然有好有壞,反正嘛,彈性太大是會有問題,但是只要你會用,易用,易除錯,彈性帶來的好處也不小。


function MyClass()
{
this.MyData = "Some Text";
this.MoreData = "Some More Text";
} // end of MyClass()
MyClass.prototype.setData= function(theData)
{
this.MyData = theData;
} // end of setData()
MyClass.prototype.getData = function()
{
return this.MyData;
} // end of getData()

var c1 = new MyClass();
var c2 = new MyClass();
c1.setData("I am wade");
alert ("c1: " + c1.getData() + ", c2: " + c2.getData());

這邊真正示範了將 MyClass() 當成類別的作法,不止有屬性也有方法,自行研究研究。不同的物件(c1, c2)因為透過 setData() 而改變其屬性。事實上也可以寫類似 constructor 的方式。


function Animal(name)
{
this.name = name;
}
Animal.prototype.say = function(what)
{
if (what)
alert (this.name + " said: " + what);
else
alert (this.name + " said something.");
} // end of say()

//Inherited class constructor
function Dog(name)
{
Animal.call(this, name);
}
Dog.prototype = new Animal();

Dog.prototype.ChangeName = function(newname)
{
this.name = newname;
}

var dog = new Dog("My Poppy");
dog.say();
dog.ChangeName("Wader");
dog.say();

這個例子先是展示了繼承,Dog 繼承了 Animial 的 say() 方法及 name 屬性, 這些繼承能力是透過 Animal.call(this, name); 再加上 Dog.prototype = new Animal(); 來完成的。這也透露出一件訊息,就是前面講 Javascript 是 prototype based 這件事,但是若對 OO 敏感的人也可以看出來,Function 在此處就表現了它自身是 Object 的概念。
而後面第二次的 say() 展現了跟先前 setData() 同樣的功效,只是這次是用在繼承上。

接下來看看多型,不過減省版面下,請將下面的碼直接接在上例的後面,當然要把上例後面四行拿掉再加上去也是不錯的作法:

Dog.prototype.say = function(what)
{
alert (this.name + " woof: " + what);
} // end of say() of Dog

function Cat(name)
{
Animal.call(this, name);
} // end of Cat()

Cat.prototype.say = function(what)
{
Animal.prototype.say.call(this, what);
} // end of say() of Cat

dog.say("who are you?");
var cat = new Cat("Cat Girl");
cat.say("I love you");


Dog 的 say() 方法其實是用新的覆蓋掉 Animal 的,而 Cat 的 say() 方法,則是用繼承的作法。意思是,Cat, Dog 的 say() 其實已經與原來的 Animal 有不同意見了。

觸控面板與手寫輸入 windows programming

這幾天的研究,主要就是要看看標題所寫的問題要怎麼做,主要是針對 windows XP/Vista.


  1. 呼叫輸入法
    1. 範例

      void   CNewUrlDlg::OnSetfocusEditNewurl()    
      {  
        //   TODO:   Add   your   control   notification   handler   code   here  
        CEdit   *pEdit=(CEdit*)   GetDlgItem(IDC_EDIT_NEWURL);  
        HWND   hwnd=pEdit->GetSafeHwnd();  
        HKL   hkl   =   GetKeyboardLayout(0);  
        if(!ImmIsIME(hkl))  
        ImmSimulateHotKey(hwnd,IME_CHOTKEY_IME_NONIME_TOGGLE);  
      }

      其中 IME_CHOTKEY_IME_NONIME_TOGGLE 在Input Method一文中有說明。

    2. 自行呼叫應用程式
      Vista 下的手寫板是獨立應用程式,名稱叫 TabTip.exe, 可自行呼叫
      ShellExecute(GetParent()->m_hWnd, NULL, "TabTip.exe", NULL, NULL, SW_SHOWNORMAL);

  2. 自行開發
    1. 可透過 InkEdit, InkPicture 等自訂手寫輸入外觀 ,可參考
    2. http://msdn.microsoft.com/zh-cn/library/ms812487.aspx
    3. 欲進行細部自訂請參考
    4. http://msdn.microsoft.com/zh-tw/library/system.windows.ink.aspx
    5. http://msdn.microsoft.com/zh-tw/library/system.windows.ink.inkanalyzer.aspx 用來分析手寫板
    6. http://msdn.microsoft.com/zh-tw/library/system.windows.ink.inkrecognizer.aspx 用於識別,由 InkAnylyzer 用於識別
    7. http://msdn.microsoft.com/zh-tw/library/system.windows.ink.gesturerecognizer.aspx  這似乎只在 Vista 下能用
    8. http://msdn.microsoft.com/zh-tw/library/microsoft.ink.textinput(VS.85).aspx 用於手寫板識別後的文字取得

  3. XP 的支援
    http://www.microsoft.com/downloads/details.aspx?familyid=84bbefa4-7047-41df-8583-e3bdbf9d805f&displaylang=en
  4. 參考書
    • Building Tablet PC Applications
    • by  Rob Jarrett and Philip Su
    • Pages 576
    • User Level All
    • ISBN 0-7356-1723-6
    • Release date 25 September 2002

2008/08/07

Windows Programming -- Mouse Messages

前面說過,Windows Programming 是 Message looping 的機制,所以舉例來說要控制(Input/Output)滑鼠,那就要了解相關的 Messages:

WM_LBUTTONDBLCLK
The user double-clicked the left mouse button.
WM_LBUTTONDOWN
The user pressed the left mouse button.
WM_LBUTTONUP
The user released the left mouse button.
WM_MBUTTONDOWN
The user pressed the middle mouse button.
WM_MBUTTONUP
The user released the middle mouse button.
WM_MOUSEMOVE
The user moved the mouse cursor within the client area of the window.
WM_MOUSEWHEEL
The user rotated or pressed the mouse wheel.
WM_RBUTTONDOWN
The user pressed the right mouse button.
WM_RBUTTONUP
The user released the right mouse button.

不過我搞不懂,若有其他 button 怎麼辦?3D 滑鼠怎麼辦?

Windows programming 心得

一向對 Windows Programming陌生,來寫這心得可能會有朋友覺得奇怪吧。

Windows "Kernel" 其實是一堆 .dll 構成的,底下就先來介紹各個 dll

NTOSKRNL.EXE, 是整個 Windows 作業系統的核心,光這個檔名就可以看得出來,在 NT 之後才採這個版本,之前的是 9X 系列。除了這個檔之外,其他的就是 .dll 啦,可見這個檔的重要性。

HAL.DLL, 這個檔等於是 NTOSKRNL 與底層溝通最重要的檔,像 ports, monitors, keyboards, etc. 用來把硬體與核心抽離用的。

以上兩個檔可以算是最底層的

NTDLL.DLL 用來處理 File I/O, Threading, 同步, 計時, 訊息等等,這個檔算是 M$ 的機密,屬於未公開的部份,因此也被稱為 "Native Windows API"

WIN32K.SYS 的工作其實跟 NTDLL.DLL 很像,不過偏像圖形與操作介面上,而 NTDLL.DLL 則偏系統工作,而且 Win32K.sys 有很多 primitive kernel-mode code,這也就是讓 Windows 完全是圖形介面的重要檔案。

再往上一層提供了絕大部份 kernel mode 功能,也被稱為 Win32 API

kernel32.DLL, 這部份可以想成是 user mode 的 NTDLL.DLL, 正因為如此,是有不少人想跳過它直接呼叫 NTDLL.DLL, 不過因為微軟未公開,用了可能會被告,再且,依微軟的習慣,你亂用反而會出問題。

gdi32.DLL,顧名思義,就是用來畫圖的啦,微軟就是有這項好處,你不必再找其他解答去整合。

user32.DLL,就是做 user interfaces 要用的,不過啊, User32 其實是呼叫 GDI32.DLL 與 WIN32K.SYS

MSVCRT.DLL, 這就有點像 glibc

WS2_32.DLL, 這實作了 windows socket

windows programming 其實離標準 C 非常遠,我的意思是,你光懂 C 是無法寫 M$ 的程式的,這也是我的困擾。不過有個基本知識我倒是知道,畢竟也寫過一陣子 Windows Application, 那就是 Message looping....message based 的觀念其實在 X window 也有。

2008/08/05

為什麼 open source 總是感覺粗鄙?

這題目譯自Why Free Software has poor usability, and how to improve it。一直都在使用開源碼,也因此會反省自己是不是犯了底下這些錯誤?

開源碼軟體的開發者大部份都是志願者,這本身雖然是好事情卻也造成兩個明顯的問題:

一、沒動機去改善使用性。這其實是相對的,商用軟體本來就是要賣給使用者,若是你操作感太差怎麼可能賣得掉?可是開源碼軟體不一樣,通常撰寫者自己用居多,另一方面用於學習的功能也佔不少比例,加上用戶數也少,得到的回饋相對上少(但絕非主因),最重要的,作者通常懶得去強調。

解決方案:應該由政府鼓勵或舉辦設計大賽,不見得要新創軟體,還要鼓勵優良軟體的改善。廠商愈來愈多使用開源碼,也應該回饋到開源社群或建立適當的社群。

二、良好的設計師不多。雖然有音樂家本身也是作曲家,但是絕大多數都不是。一個好的程式設計師要兼顧著當良好的介面設計師是很難找的。

解決方案:建全開源碼社群的組織,讓使用介面設計師、優秀的測試師等都能加入,甚至更應該鼓勵使用者回饋其使用心得與建議。也就是在社群建立良好的開發者、設計師、測試、終端使用者間良好的互動。

為什麼優秀的設計師無法浮到檯面呢?

三、建議通常變成「歡迎自行補丁」。開源碼的一個現象就是,你有想法,請自行實現。建議很難被開發者擺入他們的心中。

解決方案:同樣的在社群活動中,應鼓勵這樣的行為,開發者應該把其他人的建議擺在第一位,而不是照自己的想法開發應用程式。當然,一個良好的 issue tracking 也不止是追踨臭蟲而應該加入任何建議。建議並不見得都是好的,良好的討論模式也應該被建立。

那為何開發者可以在面對臭蟲報告時的正向態度無法以同樣態度去面對可用性的建議呢?

四、難以衡量可用性,因而不被重視。其實有些共同項目是顯而易見的,例如啟動時間,佔用系統資源,執行速度,反應速度,運行時當機比例,但是這些對使用者來說都偏向隱含層面。真正的好用的軟體的操作介面設計是一門學問,而通常,這非開發者所關注與擅長。

解決方案:還是社群功能之一,建立測試與回饋機制。另外,開發者在開發軟體時,應該把使用的方便性擺在第一位,而不是功能的開發上。一般軟體在開發時,總是以追求功能性,甚少以負責任的態度把自己開發的軟體易用性擺第一位。

因此,缺乏良好的介面設計師引發了三個開源碼開發的文化問題:

五、軟體開發前缺乏設計流程。一般軟體開發流程講的都是先收集需求、進行規格設計、再進行開發,可是開源碼軟體卻相反,先開發,有人用了再來增加規格,最後才把需求收集完整。事實上能不能做到完整還得存疑。

解決方案:開源碼應該建立正規的軟體設計流程的文化。

六、人多嘴雜。這是一個難題,使用介面的設計是個見仁見智的問題,而且,誰也不服誰,加上前面說的,好的設計師通常無法自行實現想法。

解決方案:其實說多了都差不多,就是要有領導者,有一個值得信賴的人或組織願意領導大家,鼓勵建立這樣的機構是值得肯定的。

七、壟斷。舉例來說,開發者在編寫程式時會想到的操作介面通常是他們手邊的軟體,這雖然比較大眾化,但是不見得是優良的介面設計。

解決方案:鼓勵創新的設計,通過獎勵和其他宣傳來引領開發者。

開發者並未將專業的使用介面建議納入考量,這原因造成更多難解的問題:

八、孤芳自賞的心只追求自我滿足:開源碼的開發者通常開發出來的軟體是以同樣愛好者社群為使用群,滿足了這些人其實就像隔靴搔癢,無法滿足大部份群眾的操作習慣。

解決方案:最簡單的方式就是,鼓勵那些社群的人親自說服其身邊的親朋好友一起使用他們所開發的軟體,並且,誠心傾聽其建議。

九、被小細節打敗。很多小細節,改善應用程式的界面不是一件令人興奮的或能自我滿足的工作,也因此在開發者就功能面或技術面改善之前,他們大都不會花心力著墨在上面,惡性循環下引不起使用者興趣,因此開發者也得不到正向的回饋。

解決方案:在安排除錯的時候把除錯的時間因素放進去,這會使得開發者比較有機會注意到有些使用介面設計只需要花很少的時間。事實上這方案也常常無效,因為開發者會認為「那只是每個人對操作便利性不同的看法而已」。

十、更多的選擇可以安撫人們。若你受僱開發軟體,大抵上都沒有選擇權,就算不是你想要的你也得盡心盡力去完成,而開源碼軟體卻不然,常常都會讓開發者興起「此處不留爺,必有留爺處」,當然有能力的人就自己開發去了。

解決方案:產生一個強有力的社群維護者,以及一個單一的文化,建立一種更分散式的版本控制,讓人充分在標準與自訂之間游移,允許正式版本與變異版本共存。舉例來說像 kernel 就是。

十一、人多嘴雜:每個人意見不一,常常有人做了變動,可是外觀卻看不出來變化,當然也常常有人任意對開源碼做變動而不顧外觀上變化所產生的影響。

解決方案:提供像 google 關鍵字廣告這種商業宣傳,來對真正有貢獻的開發者作補償,並對影響使用介面的 source code 建立審查制度,並定期檢視「我們是否需要這一點」?

十二、開源碼的開發是「寬頻」的。因為開源社群都是分散在世界各地,因此各項聯繫幾乎都在網路上,但是,相反的,一般商業軟體卻大都是在同一建築物內。

解決方案:讓溝通更加無界限,發展和促進IP電話,視頻聊天,在虛擬白板上,人像素描,及動畫軟件,允許更容易溝通的設計理念,隨著國際互聯網。(此段純 google 翻譯)

十三、太早釋出軟體,太常釋出新版本,這會面臨不小的問題:先面臨到的當然就是因此使得差勁的使用介面變成很「自然」就出現了。

解決方案:前面有說過,開源碼的開發流程應該從軟體工程的角度出發,而不是依照自己的喜歡隨意開發。

十四、太任意就「模組化」。有些優良的開源碼都把使用介面與其核心功能分離,這當然是個好傳統,而且打從 Unix 時代就流行 pipeline 的方式讓眾多程式彼此合作。但是這樣的現象卻導致功能很強,卻沒有優秀的操作介面配合的窘境。

解決方案:在寫核心技術之前,先把操作介面設計出來。

十五、Gated development communities(不知道怎麼翻):當你在用一個軟體系統時,常常是整合了不同的團隊所開發出來的模組,例如,你把你所見的這個網頁列印出來的時候,其實至少包括了瀏覽器核心,印表系統,視窗管理,各式各樣的 library,甚至還有驅動程式。而這些組成不見得都很好的整合過,以符合更佳的操作習慣。

解決方案:由「開源軟體」供應商居中協調跨組件工作。

原文寫的有點長,英文超過我的能力,因此我翻譯起來也相當辛苦,也正因為如此我才更需要試著去翻譯,若有錯誤請不吝指正。(註,錯誤是不小心的,漏掉是故意的)

2008/08/04

何時不要用 bash scripting?

怪了,最近怎麼常寫 bash scripting? 在問何時用 shell script 才是比較好的問題時,我覺得應該先了解一下,什麼時候最好不要用 shell script?

為何要用 shell script這篇有提到,我就翻譯成中文與大家分享。


  • 特別需要考量資源時,例如執行速度,shell script 在處理大量排序、hashing 或 recursion 等演算法上,相對會比較浪費時間。
  • 包含大量數學運算時,尤其 shell script 可以說無法處理浮點運算,雖然如同 sort 或 filtering 等可以借助其他常用的命令來解決,但是會讓運算效能打折扣。
  • 基於考量可攜性,shell script 雖然在 unix 系列移植性很大,但是光不同的 shell 本身就很難共用相同的 script, 要對硬體產生高移植性也是奢求。
  • 複雜的應用程式,我想這一點沒人會否定,畢竟 shell script 相對上比較沒有像結構化的演算法特性,例如資料結構的局限性,或是遞迴,或是變數本身在在都限制住往大的應用程式開發之路。
  • 對組織或公司影響深遠的關鍵應用程式最好別選擇用純 Shell scripting, 原因當然在前面有寫,最重要的是 shell script 也沒有很好的擴承特性,例如 OOP
  • 高安全性要求的情況下,包括整個系統的高度整合,系統的保護、系統的穩定、系統的堅固性上,shell script 都具高度爭議性。這裡面也包括 scripting 的先天特性,應用程式無法封裝起來,任何人都可以看到你的程式碼。
  • 包含聯鎖相依性的組成元素的專案也不適合,核心原因也跟前一議題一樣,尤其 shell script 的 lock 機制並不完善,因此在這議題的處理上容易出錯。
  • shell scripting 對大量檔案的處理只能一次處理一個檔案的逐次處理,很難有最佳化表現,若再考量 cache 或 index 等等因素的話,對檔案處理上毫無競爭力。
  • 具直覺性的多維陣列處理上,也非 shell script 擅長的,雖然 bash 具備陣列表示,總是不那麼自然。
  • 需要像 linkly-list 這類的稍微複雜點的資料處理上,shell script 就是無法勝任,更不用講什麼 Tree 或 graphics
  • 需要產生或處理圖形或圖形的介面時,雖然可以借助其他軟體套件像 tcl/tk, dialog 等等讓你在 shell scripting 下也能有 GUI, 畢竟,效率會比較差,彈性、擴充性也都是值得考量的。
  • 需要直接存取系統硬體時,shell script 也比較少彈性,不過藉助 /proc 其實也可以得到不少資訊。
  • 對 socket I/O, 甚至只是 IPC(程式間互動)的應用場合也較不適合
  • 對採用 library 的應用程式,當然無法直接用 shell script 來處理
  • 最後,若您不想公開源碼時,就別選 shell script! 不過若要把 shell script 變成 binary code 是不是可能呢?或許有人會提供像 php, python, perl 等 scripting 語言的 compiler, 但是我覺得,那會失去不少 scripting 的意義。

2008/07/24

extglob (extended pattern matching bash) 讓你的 script 更有用

我很喜歡 Perl 簡潔有力,也很喜歡 Sed, Awk 等等,Bash 也打開了以往的限制,增加了 extglob 選項

?(pattern-list) 匹配零個或一個
*(pattern-list) 匹配零個或多個
+(pattern-list) 匹配一個或多個
@(pattern-list) 剛好一個匹配
!(pattern-list) 匹配除指定模式以外的任何字符

我是不太常用,這邊所提的內容您也可以搭配 grep 來達成。假設,我不想要 a開頭的所有檔,可以這麼寫:

$ shopt -s extglob
$ ls !(a*)

第一行只是要打開 extglob, 只需要做過一次即可。若想關掉,可以用 shopt -u extglob

ffmpeg 自製電影

不管是要轉檔,還是要編輯影片,甚至是想用照片製成電影,或是電影與照片混用,ffmpeg 都是很好的工具。

請自行參考Linux HOWTO 的說明, 有空再來貼一下我的使用心得。教學影片在這兒

2008/07/23

由 VOB 重新產生 IFO 檔

DVD 格式中,有三種附檔,其中 IFO 記錄了不同的章節、語系、上一頁、下一頁等資訊,所以光有 VOB 檔是不夠的。若您也像我一樣,突然有此需求,所有 IFO 檔都不存在,只剩下 VOB 檔的時候,怎麼辦?以前我做過一次,忘了怎麼搞定的,底下的文章來自這裡。

Step 1. 下載 IfoEdit. 可以從這兒或那兒找到並下載 IfoEdit. 這是免安裝的,解壓後可以直接執行第二步。

Step 2. 執行 IfoEdit.exe, 找到畫面中下方的 'Create IFOs' 點下去.

Step 3. 選項基本上都可以不用變動. 只需要找到畫面中間 "1st VOB of Title-set" 右方的瀏覽按鈕載入你的 VOB 檔,通常是指定第一個 VOB 即可,例如 VTS_02_1.VOB,這一步只需要做一次即可,不必每個 VOB 檔都做(事實上會產生一樣的東西).

Step 4. 找到 'Same as source' 並勾選它.

Step 5. 按 OK 鈕開始分析並產生 IFO, 我只做到這一步,有興趣編輯 DVD 章節或語系的人自行往下看。

Step 6. 從上述 VOB 檔案(只需做一個)蒐集完所有需要的資訊後,會產生 VIDEO_TS.IFO 以及
VTS_01_0.IFO 兩個 IFO 檔案。

Step 7. 接下來再稍作修改,點選 VTS_01_0.IFO 檔案,你會看到音軌與字幕屬性並沒有指定語言。

Step 8. 要改變語言設定,需要雙擊音軌字幕資訊流(streams),指定串流語言後並點選 OK 完成設定。

Step 9. 接著繼續處理視訊 IFO 檔案。由於 VIDEO_TS.IFO 保存有 Title-set 屬性,你也需要對 VIDEO_TS.IFO 做同樣處理。在 IfoEdit 選擇 VIDEO_TS.IFO 檔案,並為視訊軌字幕資訊流(streams)選擇語言。
(第6-9步譯自 S.J.H)

Intel Threading Building Blocks - multi-core C++???

Intel 最近釋出一個新版本的 TBB(Threading Building Blocks), 請見這裡的說明。

多核心除了硬體能力外,作業系統以至於程式語言的支援都很重要,使用 Multi-threading Programming 就算了嗎?平行運算能力還得加上 Scalable, 以及安全,此外系統並不具有任意多的資源,因此 task scheduler 也很重要,當然這也是 OS 的工作,瞧瞧 TBB 的能力或許有更好的解答?

For developers, the clear benefits of Threading Building Blocks are:

1. TBB 大量縮減程式碼大小
2. TBB 利用抽象化,隱藏了大量 Multi-threading 的程式複雜度
3. TBB's task manager 自動分析系統與軟體所執行的環境,自動選擇最佳的 thread 數目,會完成 load balance 在所有處理器核心上,達到系統最佳化。
4. 所以, TBB threaded applications 會自動有效的放大,適應將來更多核心的硬體環境。

利潤 profit

想像力到哪裡,你的世界就到那裡。

本文參考自這裡,是個值得深思的問題。

醫療器材,常常需要隨身攜帶,尤其在人類社會愈來愈老化的現在,醫療體系的支持非常重要,文中提到的小裝置,用來指引人透過控制呼吸來讓血壓下降,要價 300 美金,成本或許不到 20 元,其中的原因可能只是「專利」。

專利或許是最根本的原因,但是另一個原因在於利潤--市場因素。或許隨身裝置似乎都是個 SoC, 或許不是,文中提到難道不能跟真正的電腦連結,只是把血壓、呼吸資訊傳入電腦處理,讓裝置只是簡單的感應器,這樣或許可以降低成本,但是使用上應該不怎麼方便才是。

我在思考的,很多人也想過,怎樣創造多贏策略,也就是設計商、生產製造商、代理商、品牌商(客戶)、用戶等等的,或許這麼講野心太大。

設計商當然要專利保護,生產製造商當然要高利潤,代理商、通路商、或品牌商(客戶)當然要高單價銷路好,而用戶,卻又希望單價低又實用。嵌入廣告或許不失一個辦法,看似不怎麼實際,卻也充滿機會。當然我心中還有其他話要說啦,只是想透過圖來表達,有機會再貼上來。

Follow

我一直在跟別人提 Follow 的概念,這邊有一個與 Skype 連結的應用軟體,良好地示範了這個概念。

2008/07/22

communication

skype developer算是很特別的東西,跟 skype 通訊竟然是用純文字。

最近在思考「溝通」這件事,人類與裝置的互動還停留在原始的狀態,雖然已經有語音輸入,也有觸控,也有手勢辨識,可是感覺都還停留在不怎麼實用的階段。你的裝置要怎樣與別人不一樣?或許,「溝通」就是非常急需去思考與面對的課題。

2008/07/16

google reader


我不知道大家怎麼讀新聞的,這邊有個好東西跟大家介紹一下,或許知道的人不少。

附圖是我自己使用的畫面,當我用 Firefox 訂閱 RSS/ATOM 時,會問我是否用 google reader, 若您還沒有 google account, 建議去申請一個,而要用 google reader 也不見得用 firefox, 用 IE 也行,請至 google reader用了就知道。

以我來說,我可以同時訂閱 Yahoo news, UDN news, 還有一堆 google groups, 甚至是 blogs, 總之是一個帥啦!舉例來說,我不必登入好友的 blog 就可以看到一堆,新聞也是,對有興趣的標題再點進去讀,方便的很。

freemind 0.9.0

Freemind 0.9.0 新增了四個很重要的觀念,一個是對節點增加附記,一個是對節點增加屬性,一個是過濾,一個是 scripting(採用 Groovy)。因為 0.9.0 還不夠穩定,有個建議是與 0.8.x 並存,正式的產出用舊版的,實驗新性質才用新版的。不過,0.9.0 新增的這幾個功能並不被 0.8.0 所識別,因此我個人是直接用新版本。

我是懶得再寫像Freemind 教學,不過這幾個新功能我還算喜歡,只是有時我會拿 Freemind 來畫類似流程圖那種 cycle-link, 也就是說目前只能畫非環形的節點樹,有時不同節點會有相關性,用 freemind 無法表達。當然這也可以說是工具不正確造成的,最好是用 UML, 不過 UML 頗複雜就是了。

再次呼籲尚未使用過心智圖軟體(不一定是 Freemind)的人應該試用一下 Freemind,我想讓你有個清楚的思路非常重要,不管是不是用來開發軟體。

會有 script 功能說真的我也沒用過,不過既然有屬性,給它方法似乎看來也不必太怪異,有個範例是說幫 Node 加上「今天」的日期。也可以計算屬性之類的。有新的想法再來跟大家分享。

Linux 2.6.26 新發現

這篇文章算是純筆記,來自Linux 2.6.26 新鮮事及Linux 2.6.26 對嵌入式裝置的改善。

先從後面那篇寫起,因為比較短。linux 2.6.26 多的項目,對嵌入式裝置來說重要的發展有幾個:

.良好支援 KGDB, GDB 這東西本來就可以為 kernel 除錯,現在更提供選項,不知道有何改善,之前必須要patch, 現在是整合良好,算是一大功德。

.對 KVM 支援的硬體變多了,同時軟體特性也變多了:Itanium (IA64), S390, and PowerPC 440, plus lots of new KVM features such as x86 hardware task switching

.USB Video Class driver for better webcam support: 這是個好消息,不知道我那台中華電信送的可不可以用?

.802.11n improvements, and 802.11s mesh networking support via Open80211s:這項目在 OLPC 裡是我特欣賞的一項,現在整合進來,不知道是不是代表隨便的網卡都能動作?

.Read-only bind mounts (story): 在使用 chroot 時,我介紹過 mount --bind 這個命令,請見chroot with mount bind 一文及DirectFB 介紹。對 /proc 什麼的沒什麼影響,但是對 /etc 或 /var 就會有影響,增加這功能會讓系統安全點。

.Better documentation for real-time scheduling options

.Improvements in EXT4 (still an "experimental" feature): 既然還在實驗階段,用的人肯定不多,有機會好好來研究一下它的改進之處

.另外對很多嵌入式硬體做了最佳化,我就不特別列出來。

.x86 PAT support: 這一點存在很久了,早期的 MTRR 就可以做因而被延遲了下來,有了它,對記憶體的管理會做的更好。

.Device whitelist on cgroups: 不知道是啥,看起來是加強 mknod 的能力的,跟虛擬化似乎有相關性。例如,原來的裝置型態有 c(char), b(block), 現在多了 a(all),而存取權有 r(read), w(write), m(mknod), 對 a(all) 而言,似乎更「開放」了。有興趣的人請讀cgroups一文。

.內建 Memtest: 看來系統除錯更容易建置了

.Export BDI attributes in sysfs: 不懂,有機會看看

./proc/pid/mountinfo: 似乎對查出 process 用了哪些 mount point 有幫助?

當然還有更多改善,感覺對硬體的支援增加非常多,請自行看文章吧

2008/07/10

進化 evolution

有一篇是這麼說的,當買電腦不再關心 CPU 運作速度,不再關心記憶體大小時,下一個關心的目標會是什麼?

她說是螢幕,我個人一直認為是輸入法,輸入裝置,貼近人類思想的輸入裝置。

在看這篇文章時,讓我想起一個很久以前想過的問題,「人類,還會再進化嗎?至少,在腦袋上,還有進化的空間嗎?」這問題問過的人不少,有人提出外星人是人類進化的樣本,我不知道。

電腦的發展,效能似乎不是最受人關心的,網際網路的發展,訊息的取得似乎不再是人們感興趣的,接下來呢?有人提出情感的媒介與交流。似乎,回歸更人性化才是發展的趨勢,我在想,人類,或許已經是發展的顛峰,剩下的問題是如何與大自然相處吧?如何與其他人更好的相處或許才是進化的未來趨勢。

我喜歡一個理論,叫蓋婭,相信人類要更好的往下走,勢必更好好思考這理論才是。

2008/07/09

讓 Make 使用遞增的編號

本文算是從這兒翻譯來的。

本文主要目的,不是要你新增什麼源碼來產生或是記錄編譯次數,基本上若您有興趣配合著用也行。先說一下編譯時,通常是用 make, 也就是說,它會讀一個檔叫 Makefile,有在用 make 的人應該都知道 Makefile 可以定義變數,甚至請 make 把變數丟進源碼中。

那麼本文的目的是啥?就是希望讓你可以每次編譯,都產生一個獨立而遞增的編號,以便源碼能引用,以便區別,Kernel 就是這麼做的。先來看一個簡單的 Makefile 範例:


# Makefile

OBJECTS=bnum.o

a.out: $(OBJECTS)
$(CC) $(LDFLAGS) -o $@ $(OBJECTS)


根據規則,會把 bnum.c 產生 a.out,每次都是這個結果。讓我們再來看一個修改過的 Makefile:

# Makefile

# Name of text file containing build number.
BUILD_NUMBER_FILE=build-number.txt

OBJECTS=bnum.o

a.out: $(OBJECTS) $(BUILD_NUMBER_FILE)
$(CC) $(LDFLAGS) $(BUILD_NUMBER_LDFLAGS) -o $@ $(OBJECTS)

# Create an auto-incrementing build number.

BUILD_NUMBER_LDFLAGS = -Xlinker --defsym -Xlinker __BUILD_DATE=$$(date +'%Y%m%d')
BUILD_NUMBER_LDFLAGS += -Xlinker --defsym -Xlinker __BUILD_NUMBER=$$(cat $(BUILD_NUMBER_FILE))

# Build number file. Increment if any object file changes.
$(BUILD_NUMBER_FILE): $(OBJECTS)
@if ! test -f $(BUILD_NUMBER_FILE); then echo 0 > $(BUILD_NUMBER_FILE); fi
@echo $$(($$(cat $(BUILD_NUMBER_FILE)) + 1)) > $(BUILD_NUMBER_FILE)



這邊引進了一個變數 BUILD_NUMBER_FILE 用來當儲存媒介,儲存編譯次數,每次編譯時我們想辦法讓它遞增 1。這樣,就可以拿來產生不同的 target 出來。這個 BUILD_NUMBER_FILE,也就是 build-number.txt 一開始可以不必存在,機制設計上會自動把 '0' 寫進去,然後每次編譯自動遞增 1 寫進去,供讀進後設定成 __BUILD_NUMBER

不知道有沒有看到 BUILD_NUMBER_LDFLAGS 裡頭,把 __BUILD_NUMBER 傳給 Linker, 因此編譯器可以把它讓源碼看到,若有興趣的話也可以引用,底下是個範例:


#include

extern char __BUILD_DATE;
extern char __BUILD_NUMBER;

main()
{
printf("Build date : %u\n", (unsigned long) &__BUILD_DATE);
printf("Build number: %u\n", (unsigned long) &__BUILD_NUMBER);
}


要看執行結果嗎?原文裡面也有:

$ rm bnum.o; make
cc -c -o bnum.o bnum.c
cc -Xlinker --defsym -Xlinker __BUILD_DATE=$(date +'%Y%m%d') \
-Xlinker --defsym -Xlinker __BUILD_NUMBER=$(cat build-number.txt) -o a.out bnum.o
$ ./a.out
Build date : 20080708
Build number: 24
$ rm bnum.o; make
cc -c -o bnum.o bnum.c
cc -Xlinker --defsym -Xlinker __BUILD_DATE=$(date +'%Y%m%d') \
-Xlinker --defsym -Xlinker __BUILD_NUMBER=$(cat build-number.txt) -o a.out bnum.o
$ ./a.out
Build date : 20080708
Build number: 25

2008/07/04

使用案例 use case

目的:
.決定並說明系統的功能需求,結論是在關係人與建構系統的軟體開發人員之間達成共識。
.有關係統該做什麼,要給予清楚和一致的描述,如此才能在開發過程把模型拿來與所有開發人員進行溝通,瞭解系統有哪些需求,同時也作為設計模型的基
礎。
.作為執行系統測試的基礎,為了證實系統是否能適當的運作,並確認系統運作是否恰如其分。
.提供把追蹤所得的功能需求,轉換成實際類別和操作的能力。經由改變使用案例模型,接著追踨受到使用案例所影響的系統設計與實作,可以簡單地改變並
擴充系統。

不同的人關注的事有差異:
.關係人所感興趣的,是使用案例模型詳細說明系統的功能性,描述系統怎樣可以有這些功能,並說明如何使用這些功能。若讓關係人在塑模時扮演動主角色
顯得非常重要,因為可以依其願望調整模型,也可以採用其語言、術語等來描述使用案例。
.開發人員所感興趣的,是系統應該做什麼,並作為更詳細的塑模作業及編碼的基礎。
.專案管理者應用反覆與增量生命週期的方式,來建造反覆計畫,確保能成功地把使用案例實作出來。既然客戶瞭解使用案例模型的本質,也一定想要看到有
哪些功能,在每一段反覆計畫結束時,就應該要呈現出來。
.整合與系統測試團隊需要使用案例來測試系統,以確保系統所執行的功能就是使用案例所指定的功能
.任何人只要與系統有關聯的活動相關的話,就有可能是對使用案例模型感興趣的人,譬如銷售、支援、文件等團隊。

請參考Use Case來說明:

1. 人:當然就是參與者, actor
2. 楕圓:就是一個使用案例
3. 矩形:一個主題,可以包含多個使用案例
4. 套件:那圖形是指一個套件,譬如一個大學的入口網站可能有學院管理、員工資訊、學生資訊、一般資訊等套件,這邊通常引用已存在的套件。
5. 區塊:一個使用案例可以區分成數個小塊
6. 實直線:關聯, association, 連接元素或實例
7. 角箭號:也是關聯, association
8. 虛角箭號:依賴關係, dependency
9. 三角箭號:一般化,generalization, 通常表達繼承,或是指明某類別的實例
10. 折角紙:說明,note
11. 虛線:連結
12. 文字:加上文字

目前我也正在學習當中,以後再補實例上來

UML 名詞 - Views, Diagrams, 模型元素, 一般機制, 延申 UML

Views: 翻成觀點,用來展示各種不同的應用場合,或是面貌。我們這麼說吧,不同的觀點,可以組成的類別不太一樣,譬如,使用案例裡面「人」就扮演
重要角色,可是實作觀點,卻哪來的人?舉例來說,有使用案例觀點,邏輯觀點,實作觀點,程序觀點,部署觀點,實作觀點等。這是最重要的部份,UML 也
讓你能定義屬於自己的觀點。而不同的觀點間應該要容易切換著看,一件事有各種不同的觀點才是完整的。例如從使用案例來看使用者如何操作系統,也應該切換
到部署觀點看看實體架構裡如何部署系統。

Diagrams: 我一般是翻成(流程)圖,書上是翻成圖型。UML 圖型有很多,舉例來說有使用案例圖,類別圖,物件圖,狀態機,活動圖,互動圖,循序圖,通訊圖,元件圖,部署圖,合成結構圖。

模型元素: 不同的圖型,是由各種元素組成的。比較貼切的說法,模型元素應該是用來表達「觀念」的元素,它可以是語意,一個正規的定義,或是夠清楚的敘述,當然也可以是一個圖像符號。一些已經定義好的模型元素範例有,用來表達人員、類別、物件、訊息、關係、關聯、依賴性等等的圖素。

一般機制: 為模型元素提供額外的飾詞、註釋、資訊、規格或者是語意,這也讓不同的組織或領域,替自己擴展特有的 UML。

延申 UML: 三種機製為,造型(stereotypes),標籤值(Tagged values), 限制(Constrains)

統一塑模語言 UML

請自行參考 UML 組織,這邊有工具列表,個人推薦BoUML。推薦一本書:Hans-Erik Eriksson, Magnus Penker, Brian Lyons, David Fado 著,朱子傑譯,碁峰出版的,UML2 百寶箱。

先簡單介紹一下 UML, 你要蓋房子,或讓人參觀預售屋,弄個模型屋出來是最正常的。蓋房子之前,會先把藍圖設計出來才開始蓋,車子也類似,還會先模擬風切、撞擊等,這一切,都叫「塑模」,也就是先建個模型,看看合不合用,再來真正動手。

台灣大部份的軟體工程師(硬體的我不熟,想來也差不多吧?)常常忽略這樣的步驟,做完需求,分析完,就開始動手寫程式,常常搞到最後該加的班加不完,臭蟲還是一直出現。因此跟大家介紹 UML,就是希望能讓大家少點加班時間,多點回家陪家人的時間,顧好自己的身體。

一般軟體工程的步驟:

需求:UML 以「use case」的方式來捕捉客戶或使用者的需求。從案例探討著手,會發現不同需求、需求間的關聯,怎樣進入不同的狀態,操作過程會有哪些活動等等。

分析:分析要從建立類別及物件著手,整個問題(系統)由什麼類別組成?其運作機制如何?類別間的關係如何?在使用案例裡又如何實現其間的活動?有些人以為這邊在講的是物件導向程式語言裡的類別,其實不算是,後面我們再來介紹。

設計:分析的成果,必須擴展成技術上的解決方案。這時才要考慮使用者介面,資料庫等等。設計必須定義詳細的規格。

實作:就是所謂的 coding。因為 UML 是以物件為基礎,因此一般也使用物件導向程式語言,例如 Java, C++, 甚至是 Perl, Python,卻沒有 C, shell script. 實作已經不算是 UML 真正有定義的事,但是卻有工具可以幫你把 UML 產生相對應的程式語言表示法,也算是相得益彰。

測試:一般測試常常由工程人員測完就算了,其實還可以分幾類,單元測試、整合測試、系統測試、生產測試、驗收測試。不同的測試團隊會有不同的測試模型,這也是 UML 重要的功用。

更技術的討論,我想移至wadefs 討論區去完成,希望將來也採這樣的方式進行。

程式設計師還是工程師 Programmer or Engineer

中譯來自電子工程專輯, 英文來自Embedded.com。後面再來以回覆的方式寫我自己的看法。

‘程式設計師’這個詞應該從字典中刪除。

我痛恨‘程式設計師’(programmer)這個詞,雖然我承認經常使用它,因為它在我們的文化中太根深蒂固了。就像那些無意說出的粗魯詞句,儘管不斷出現,但是又缺乏有效的防治方法。

Dictionary.com將‘程式設計師’定義為‘編寫電腦程式的人員;對設備(尤其電腦)進行編程的人員’

編寫程式的人稱為程式設計師。這個描述更像是‘編碼員’,日復一日地編寫著程式碼。編碼人員,如同技師及看門員一樣,都是不可缺少的員工。但是他們可能成為一個軟體專案的破壞性因素。

我認為,軟體專案失敗的十大理由之一,是團隊無法抗拒開始編碼的衝動。編碼不過只是軟體工程的一部份,類似於為橋鋪路面。沒有路面我們無法通過,但橋樑施工需要仔細的工程規劃、分區、籌款以及其他眾多比鋪路更複雜的活動,同時對於最終的結果來說也更重要。

糟糕的鋪路可以重來或進行修補,但是糟糕的橋樑設計可能會倒塌。劣質的軟體工程必將帶來專案的失敗,即使編碼人員(程式設計師)做得再好也無力回天。

我們之中大部份人是工程師:軟體工程師,韌體工程師,或是硬體/軟體工程師,儘管我們水準各異。實際上,近期的嵌入式網調查顯示只有13%的受訪者擁有電腦科學學位;80%具有工程學(EE或CE)的學位。

工程是一門解決問題的藝術,也可以說就是建構韌體。由架構設計開始,在這個過程中,我們思考如何設計、規格、團隊、工具以及得到解決方案的方法。

接著我們開始設計-這裡特別強調‘設計’-一個強壯的基礎。使用OS還是不用OS?劃分為多個處理器?我們如何劃分問題使其方便解決?何種資料結構更有效?

這時,編碼才真正開始,某種程度上講編碼可以交給另一個組織,或許採用外包方式。

編碼相對簡單;軟體工程卻很困難。軟體工程師是負責以某種合理的可重複方式建構可靠系統重任的專家

2008/07/03

心智圖 Freemind

要建立心智圖有不同的工具,這邊介紹一個非常簡單易用的一套,叫Freemind, 可以到這兒下載,有各種作業系統版本。

什麼是心智圖?先貼一下原網站的說明:

FreeMind is a premier free mind-mapping (http://en.wikipedia.org/wiki/Mind_map) software written in Java. The recent development has hopefully turned it into high productivity tool. We are proud that the operation and navigation of FreeMind is faster than that of MindManager because of one-click "fold / unfold" and "follow link" operations.

So you want to write a completely new metaphysics? Why don't you use FreeMind? You have a tool at hand that remarkably resembles the tray slips of Robert Pirsig, described in his sequel to Zen and the Art of Motorcycle Maintenance called Lila. Do you want to refactor your essays in a similar way you would refactor software? Or do you want to keep personal knowledge base, which is easy to manage? Why don't you try FreeMind? Do you want to prioritize, know where you are, where you've been and where you are heading, as Stephen Covey would advise you? Have you tried FreeMind to keep track of all the things that are needed for that?

在進行教學前,先摘要說明一般操作會用到的步驟:
新增新智圖、更改節點文字、新增下一層(子節點)、新增同一層節點(兄弟節點)、移動節點、刪節點、存檔、匯出。
所需要的操作,可以完全用鍵盤的上下左右+Enter+Insert+Del 七個鍵來完成。

下圖第一張,是安裝好後執行的畫面,我是關閉舊檔另開新檔,所以是「心智圖2」



先來把心智圖的項目名稱改掉吧,直接用滑鼠點在名稱上即可進入編輯模式,不過這是在端末節點才有效,對非端末節點來說,應該按 Alt+enter, 按滑鼠右鍵也看得到相對應功能:



要在某節點上,增加下一層的新節點,也就是俗稱的子節點,這步很簡單,按 "Insert" 鍵即可。當然要給名稱,名稱若要修改的話,請見上一步。若是想建立的是同一層的兄弟節點,請見下一步:



接下來,要增加同一層的節點時,也就是俗稱的兄弟節點,只需要按「Enter」鍵即可。這邊要說明一下焦點的移動,可以透過鍵盤的上下左右鍵移動,也可以用滑鼠,因為對滑鼠很敏感,因此請小心移動滑鼠。

若您是要增加下一層的子節點,請見上一步,或用移動法搬移,請見下一步。



若層次錯了,想移動,只需要用滑鼠「抓住」即可移動,這一點自行試試,就是在要移動的項目上按左鍵不放再移動滑鼠,這邊先示範移到不同父節點。下一步示範移動到同一層的不同位置。



同一層的兄弟節點順序也類似上一步的移動方式,只是要注意的是想移到最後一項時,其實只要將目標位置改成父節點即可放在最後面。



關於移動還有一種,就是想放在視窗上不同位置。通常 Freemind 會自動排位置,照預設是一直往下放,若你想四面八方的放,那只好自己拖移,也很簡單,不過要自行練習。



我把最後結果顯示如下:



每個人的內心通常雜亂無章,運用上面的移動可以協助你好好整理思路,算是非常有用的功能。這邊再介紹一項利器,就是可以把項目縮起來,讓你暫時隱藏其他事物而專注思考特定項:




Freemind 有它自己的格式,若你想匯出成不同格式,底下畫面說明可以匯出的種類,算是非常多樣,但是匯出後無法匯入。

2008/06/27

我的心願

有一篇文章與大家分享,原文引自這裡,怕不見了就剪貼下來。在看文章之前,先說說我的心願,我是一直想跟朋友好好搞一下我的想法,建立一個虛擬世界。之前也不是沒有人想找我去負責當時流行的網路連線遊戲,只是我覺得那不是我真正想要的沒去。後來幾經週折,這幾年換工作快過什麼似的,目前,我只是想好好在現在的工作做個幾年,再累積一下人脈,若能工作與心願同時兼顧自然很好,若不能兼顧,就再晚個幾年吧。其實我的這心願存在不下十年了,我相信總有一天會實現的。這篇文章說的很好,希望將來我也能照亮別人。



玻璃業群聚 不斷寫奇蹟
‧Taiwan News 2008/06/26
「蠟燭不要一直拿在自己手上。一群人聚集在一起,把蠟燭逐一傳下,整群人都會被照亮,就算你手中沒有蠟燭,群聚就可以共享光明」。
【文/林明志】

中部濱海的中小企業 團結力量大

「蠟燭不要一直拿在自己手上。一群人聚集在一起,把蠟燭逐一傳下,整群人都會被照亮,就算你手中沒有蠟燭,群聚就可以共享光明」。林肇睢說,他大學時就喜歡登山,夜裡群聚在光亮處,夥伴共享共分攤,他說,群聚會產生巨大的力量,會在舞台發光發熱。

林肇睢是台灣首位實踐企業群聚的奇人,十年來,拿下世界最大家具品牌IEKA八○%的玻璃類產品,他說IEKA的十片玻璃,有八片是從他們手裡銷出去的。

十年前開始分享訂單

台明將十年前削價爭取到IEKA第一筆訂單一○○萬美金,同業分享訂單的原則進行玻璃群聚,十年後,IEKA的訂單多達四六○○萬美金,二○一三年,IEKA計畫將訂單量倍增到二億美金。

八十歲的IEKA創辦人坎普拉(Ingvar Kamprad)今年三月,特地從瑞典總部飛到台灣彰化,就是想一窺台灣玻璃產業的傳奇。

林肇睢是玻璃業界的奇人,中部業界喜歡稱呼他「大哥」。大哥不是混江湖;而是領導玻璃業界打拚,林肇睢為人四海,強調團結,他說,玻璃業是傳統企業,規模不大,想要生存就是團結打拚,就像打群架一樣,力量才能完全發揮,單打獨鬥容易遭到欺負。

從台明將公司說起,台明將前身為「信利行」,成立於民國三十二年,當時只不過是住家型的玻璃店,民國四十二年登記為「泉興鏡行」,七十三年正式成立「台明將企業」,現在的台明將資本額為一.五億,員工約一五○人,也是台灣玻璃龍頭台玻公司中部最大的經銷商。

台明將的成功之路

林肇睢說,從父親林將泉草創,他是二代接班,兒子林一翔退伍投入,家族三代在玻璃業界,從草創時期的四十坪廠房、二名員工,到今日漢寶本廠、一廠、彰濱工業區的玻璃館廠區,看盡玻璃產業的風華與慘淡及人間冷暖。

林肇睢輔仁大學體育系畢業,服完憲兵役退伍返鄉做玻璃,當時公司員工只有六人,專責從事玻璃販賣及簡易加工交易,由於人少事繁,父親每天都要清晨忙到晚,家族成員不眠不休的為公司打拚,林肇睢說,如果沒有突破,大家都會被累死、累病。

一定要突破規模與改變模式,是林肇睢始終存在的思維,他說︰「公司如果只能維持現狀,會累死老闆,損壞身體」「站在物競天擇,終有一天會被無情的淘汰」。林肇睢接管台明將之後,思考公司的長遠發展,與組織制度建立,他把「家族企業」轉化為「企業家族」,講究「傳賢不傳子」的經營理念。

「我不知道其他企業是怎麼經營?但我接管公司就是將經營權、所有權分離」簡單的說,就是員工與資方平均分享企業利潤,林肇睢的想法是,公司就是勞方與資方,不是誰較重要的問題,而是一樣份量,一樣共享共榮。台明將的員工分紅與資方一樣,不是資方取得絕對利潤後,再切割出員工享有的分紅,台明將的員工很喜歡此套模式,也很少人願意離開公司。

家族企業轉化為企業家族

家族企業轉化成企業家族,林肇睢說,玻璃業者要團結打拚,他把公司經營模式擴大到同業的結盟,協力廠商與台明將的份量是一樣的,他不是金字塔形的運作模式,台明將高高在上,而是環狀的配合模式,林肇睢解釋說,環狀的運作模式就沒有階級之分,產業策略是團結向國際競爭,這也是玻璃產業群聚的原始模型。

在台明將只有跟不上腳步的員工自動離職,林肇睢很少開除員工,在玻璃產業聚落裡,群聚的廠商對林肇睢信任,幾乎每位公司的管理階層,對林肇睢都豎起大拇指稱讚「大哥就是大哥」。林肇睢在大葉大學碩士進修,論文的專題就是他倡導的「產業群聚的效應」,目前他是彰師大機械所土博士班,專攻研究光學玻璃。

有人說,台明將不是玻璃業的大廠,資本額一億多,員工一百多人,卻有能力接下IEKA的千萬美金大單,IEKA的訂單每年都逐步增加,台明將到底怎麼辦到的?林肇睢說,表面上台明將不是大型企業,但是台明將背後的玻璃群聚業者,是最大的支柱,團結數十家,甚至上百家的中小型企業,不是可用資本額來計算的。

 林肇睢回憶,一九九八年,台明將以砍價二五%接下IEKA第一筆訂單,第二年與瑞典廠商比價,台明將再殺價三○%,二度爭取IEKA的訂單,瑞典的廠商原本擴充機器設備要與台明將比價,「瑞典廠商投資設備,就是為了接IEKA訂單,失去IEKA它什麼都沒有,只好宣佈倒閉!」林肇睢說,他就是帶領台灣玻璃業界打群架,IEKA的訂單就是我們的國際舞台。

隨時保持群聚優勢

IEKA訂單迷人卻有致命性,它的付款很乾脆,出貨二周內可以拿到貨款,但是採取全球開放競價,每年都會將產品的規格公開在網路上,歡迎全球供應商報價,能夠提供最好品質、準確交期與最低價格者,就有機會拿走訂單。IEKA的訂單策略,讓林肇睢戰戰兢兢,隨時保持群聚的優勢。

林肇睢說,每年競價取得的訂單,逐年增加,他所領軍的台灣玻璃群聚隨著增長,目前,台明將交付約三十家業者生產IEKA訂單,且代工IEKA的產值約佔每家代工廠的四成以上,林肇睢說,群聚最大的效應就是利潤共享,風險分攤,有錢大家做夥賺。

台明將是台玻公司的經銷商,同業需要的平板玻璃大都向台明將購買,因此台明將在業界的名聲很響,甚至南部業者都向台明將購買原料。林肇睢說,為了隨時支援玻璃同業生產所需,特別建構一個比台玻還要大的倉庫,庫存至少一萬二千噸,足以建造三棟台北一○一大樓,一○一大樓的玻璃外牆,約使用三千四百噸。

林肇睢說,他庫存大量的玻璃原料,是要做為群聚廠商的彈藥庫,也是設備的調度之一。他說,群聚廠商除了訂單的分享之外,包括設備、資金都是靈活支援調度,例如,群聚廠商需要生產設備,他會協助調度設備,折舊供給需要的廠商,另外,同業需要玻璃材料時,台明將會支援不預收現金,等到同業出貨收款之後再付錢給他。

協助業者站穩世界舞台

台明將的做法是不獨大,生產力彈性;同時降低風險,林肇睢說,訂單分享給同業,代表每個人都會賺錢,同樣代表風險分攤,不需要寡佔增加設備風險。有一次IEKA單品訂單原只有一百萬片,突然通知下個月要增到一千萬片,林肇睢說,一般業者根本無法接下單子,但是他們卻做到了,林肇睢通知群聚廠商增加產能,他們輕易通過考驗過關。

激增十倍的訂單,分攤給十多家業者,不需要太多壓力,但光靠單一廠商提供,根本無法交貨,況且新增生產線恐怕趕不上,如果訂單突然減少,閒置的設備成本,都會造成經營的困難。林肇睢的經營哲學,讓台灣玻璃中小企業站穩世界舞台,許多玻璃代工業者都想爭食IEKA大餅,但都無法順利取走訂單。

玻璃群聚走向彰濱工業區,為了加強運輸與材料支援,林肇睢首先響應進軍彰濱工業區設廠,他投資十二億買地蓋工廠,還到處遊說群聚廠商進駐,配合的廠商受到鼓舞,計有金潔明、福華、倩影等玻璃業者九家,廣義的玻璃相關業者包括鑄鋁、鐵管、玻璃與鏡子配套廠商等計有二十八家。

彰濱工業區原本未有玻璃加工專區,也因台明將領軍鼓舞業者進駐,工業區重新規劃設立「玻璃專區」。台灣玻璃業界的龍頭台玻公司,原本看淡台灣的玻璃產業到中國投資,十五年之後,台玻又在台灣投資二十億,重啟平板玻璃窯爐增產,且設置台玻鹿港彰濱廠,都是看中台明將倡導的玻璃群聚成果。

鼓勵業者留守台灣

林肇睢說,群聚越集中,發揮的力量與調度更靈活。台灣九○年代發生產業外移潮,台明將堅持不去中國,同時鼓勵業者留守台灣,以現今商場少見的義氣支持同業,讓群聚分享成長法則發揮到極致,十年來的努力,台明將的玻璃群聚打響國際知名度,誰也沒有想到,千萬美金龐大的產值,來自台灣中部濱海的中小企業,群聚的力量真可觀,它正在逐漸的壯大。

【更多精采內容請看《Taiwan News財經.文化週刊》第348期】

Bash 正規表示法的應用 -- 檢查 IP

本來譯自這裡, 原文的例子我個人覺得也沒什麼好的,就直接摘函式出來。

function valid_ip()
{
local ip=$1
local stat=1

if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
OIFS=$IFS
IFS='.'
ip=($ip)
IFS=$OIFS
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
&& ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
stat=$?
fi
return $stat
}


實際在用的時候,可以像:
if valid_ip $ip; then 成功之後做點事; fi
不過若是簡單的 if, 我通常用這種寫法:
[ valid_ip $ip ] && 成功之後做點事;

上面提供的 valid_ip() 說真的很單純,也不完整,例如要判斷 192.168.1.* 就不行,不過就是提供大家參考怎麼用正規表示法也還不錯。這個範例裡提到 $? 是上一個命令的結果(True/False), local ip=$1 是引用呼叫函數傳進來的第一個參數。

2008/06/20

在 Bash 中使用 Array

本文大約翻譯自這裡,一般人若習慣傳統 xSH 的話,那可能不會想要使用陣列。

Bash 提供一個方便的陣列表示法,雖然在使用上不像 Perl, Python, PHP, 甚至 C/C++, Java, JavaScript 等那麼自然,但是當您會使用陣列時,一些困擾也自然解決。

先來看看表示法:
arr=(Hello World)

主要特點是用小括號,元素間用空白(不限個數)隔開即可。若要個別指定值的話,也很直覺如下:

arr[0]=Hello
arr[1]=World


與別的語言相對上較不直覺得地方在於引用時的語法,底下的範例中大括號是必要的,雖然這在 shell Script 中很常見,但是整個寫起來還是有那麼一點不順眼,習慣就好了:

echo ${arr[0]} ${arr[1]}


底下看一些比較特別的用法,摘要說明在後面註解裡:

$ arr=(hello world) # 初始化陣列,示範與空白數無關
$ arr[5]=. # 讓陣列不連續
$ echo ${arr[*]} # 引用陣列中所有元素
hello world .
$ echo ${!arr[*]} # 引用陣列的所有索引值,因為個別指定時有可能讓陣列跳過某些元素
0 1 5
$ echo ${#arr[*]} # 取得元素個數
3
$ echo ${#arr[0]} # 取得某元素的長度
5


底下用一個完整的範例來說明陣列用法:

#!/bin/bash

array=(one two three four [5]=five) # [5] 的用法較特別,請思考思考

echo "Array size: ${#array[*]}"

echo "Array items:"
for item in ${array[*]}
do
printf " %s\n" $item
done

echo "Array indexes:"
for index in ${!array[*]}
do
printf " %d\n" $index
done

echo "Array items and indexes:"
for index in ${!array[*]}
do
printf "%4d: %s\n" $index ${array[$index]}
done

$ ./test.sh
Array size: 5
Array items:
one
two
three
four
five
Array indexes:
0
1
2
3
5
Array items and indexes:
0: one
1: two
2: three
3: four
5: five


底下再用一個範例來示範未使用雙引號及使用雙引號搭配 *, @ 的影響:

#!/bin/bash

array=("first item" "second item" "third" "item")

echo "Number of items in original array: ${#array[*]}"
for ix in ${!array[*]}
do
printf " %s\n" "${array[$ix]}"
done
echo

arr=(${array[*]}) # 引用所有元素展開後,因為元素值有空白,因而造成新陣列變異
echo "After unquoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
printf " %s\n" "${arr[$ix]}"
done
echo

arr=("${array[*]}") # 引用所有元素展開後,因為用雙引號括住,因而元素變成"一個"
echo "After * quoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
printf " %s\n" "${arr[$ix]}"
done
echo

arr=("${array[@]}") # 其影響請自行思考,非常重要
echo "After @ quoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
printf " %s\n" "${arr[$ix]}"
done

結果如下:
$ ./test2.sh
Number of items in original array: 4
first item
second item
third
item

After unquoted expansion: 6
first
item
second
item
third
item

After * quoted expansion: 1
first item second item third item

After @ quoted expansion: 4
first item
second item
third
item

2008/06/17

ooVoo? 視訊會議軟體

請參見 ooVoo

可以想成它跟 Skype, MSN 等軟體類似,用來做即時訊息傳遞,也包含 VIM 功能。底下翻譯一下其 features

.影像電話: 支援 HD 品質的影像電話
* 免費版一次可以跟三個人聊天(昇級後可以到六個人)
* 影像與聲音品質非常高且平順
* 沒人回話時(not on-line),可以留影像短片、聲音、或文字訊息
* 在視訊會議進行時,可同時傳送檔案或文字訊息(一如 Skype, MSN 等其它即時通)
* 可調整聲音或影像的輸出/輸入.
* 自訂電話鈴聲
* 可查詢對話歷程 (如未接來電,未通去電等).
* 視訊會議時可以調整影像特效

.錄影:昇級版方有此功能
* 可將影像電話(視訊會議)錄下來
* 錄影格式支援 AVI, FLV, 或 HTML embedded video.
* 最多可錄 1,000 分鍾的影像在 ooVoo 伺服器上,並且可以分享給別人,或在其他地方查詢

.影像訊息:
# 數量無限制的影像訊息,每則免費版上限一分鍾,昇級版五分鍾
# 可錄製並傳送給其他 ooVoo 好友,甚至包括未安裝 ooVoo 也行
# 一次傳送對象不受限制.
# 可在任何電腦播放影像訊息
# 可以儲存影像訊息在自己的電腦上
# 可將未錄製完成的影像訊息可以存在草稿區
# 創新你的生活。例如用影像訊息來製作邀請函,或廣告,或將你的旅行心得分享給其他人。

.影像特效:
* 例如更改大頭貼,加上帽子等等

.打電話:
* 可在北美地區,用來打電話,包括一般電話及手機

.文字模式即時通:
* 一次可與六個好友對話
* 容易邀請好友加入聊天室
* 可送訊息給離線好友

.傳送檔案:
* 傳送超大檔,最高到 25 MB
* 一次可傳送最多 20 個檔給多個好友
* 可傳送檔案給離線好友

.尋找好友:

.邊欄顯示:
* 將影像電話以邊欄顯示,儘量將桌面空出來

.公開您的 ooVoo 聯絡方式:
* 可放入任何 blog, 網頁,或是 email,甚至是簽名檔中
* 甚至可以指定「誰可以用 ooVoo 找我」

.隱私

如何把純文字檔放到 C 執行檔中?

請見 Embedding a File in an Executable 及 Convert a File to a C Data Structure

一般方法至少三大類,最常見的就是利用 fopen 之類的 API 來自行處理 file I/O, 一種是第一篇文章說的,把 text file 轉成 object file 後再來引用指標的方式操作,一種是第二篇文章講的,將 text file 轉成 c char array struct。

先來看看文字檔,我改成多行:

$ cat data.txt
Hello, Wade.
This is a test line here
And this is the last line.
Add 4th line here.


底下是執行畫面,是在 cygwin 下執行的,因為 objcopy 的參數不太一樣,請修改成適當的,值得注意的是用 objdump 來看轉換後的 object file 內部的 symbol name 為 _binary_data_txt_start

$ objcopy.exe -I binary -O elf32-i386 -B i386 data.txt data.o

$ objdump.exe -x data.o

data.o: file format elf32-i386
data.o
architecture: i386, flags 0x00000010:
HAS_SYMS
start address 0x00000000

Sections:
Idx Name Size VMA LMA File off Algn
0 .data 00000054 00000000 00000000 00000034 2**0
CONTENTS, ALLOC, LOAD, DATA
SYMBOL TABLE:
00000000 l d .data 00000000 .data
00000000 g .data 00000000 _binary_data_txt_start
00000054 g .data 00000000 _binary_data_txt_end
00000054 g *ABS* 00000000 _binary_data_txt_size


底下列出測試用的 hello.c 及編譯、執行畫面,值得注意的是,因為 gcc 會在 extern symbol 前加上底線,因此命名方式跟原文不太一樣。


$ cat hello.c
#include

extern char binary_data_txt_start;
extern char binary_data_txt_end;

main()
{
char* p = &binary_data_txt_start;

while ( p != &binary_data_txt_end ) putchar(*p++);
}


$ gcc hello.c data.o

$ ./a
Hello, Wade.
This is a test line here
And this is the last line.
Add 4th line here.


第二種方式的 script 內容及執行畫面如下:

$ cat 2c.sh
#!/bin/bash

if [[ $# -ne 1 ]]; then
echo "Usage: $0 FILENAME"
exit 1
fi
file=$1

if [[ ! -f "$file" ]]; then
echo "File not found: $file"
exit 1
fi

cname=$file
cname=${cname//-/_}
cname=${cname//./_}

echo "static unsigned char $cname[] = {"
hexdump -v -e '" " 16/1 " 0x%02x, " "\n"' $file | \
sed -e '$s/0x ,//g'
echo "};"

$ ./2c.sh data.txt
static unsigned char data_txt[] = {
0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x57, 0x61, 0x64,
0x65, 0x2e, 0x0a, 0x54, 0x68, 0x69,
0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x65, 0x73,
0x74, 0x20, 0x6c, 0x69, 0x6e, 0x65,
0x20, 0x68, 0x65, 0x72, 0x65, 0x0a, 0x41, 0x6e, 0x64, 0x20,
0x74, 0x68, 0x69, 0x73, 0x20, 0x69,
0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x73, 0x74,
0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2e,
0x0a, 0x41, 0x64, 0x64, 0x20, 0x34, 0x74, 0x68, 0x20, 0x6c,
0x69, 0x6e, 0x65, 0x20, 0x68, 0x65,
0x72, 0x65, 0x2e, 0x0a,
};

2008/06/02

大括號的擴展 Bash Brace Expansion

本文大致是翻譯自bash 大括號的擴展

Bash 的大括號擴展非常有用,常見場合是命令列或 shell script 中用於產生序列字串。語法不難明白,底下用實例解釋。


{aa,bb,cc,dd} => aa bb cc dd
{0..12} => 0 1 2 3 4 5 6 7 8 9 10 11 12
{3..-2} => 3 2 1 0 -1 -2
{a..g} => a b c d e f g
{g..a} => g f e d c b a


大括號的擴展也可以在字串中:

a{0..3}b => a0b a1b a2b a3b

也可以是巢狀的:

{a,b{1..3},c} => a b1 b2 b3 c

為瞭解釋方便,底下舉一個用大括號擴展的片段:
for i in {0..19}
do
echo $i
done


其相當的 for 迴圈寫法為:
for (( i = 0; i <>


也可以用 while 來表達:
while [[ $i -lt 20 ]]
do
echo $i
let i++
done


再用一個 seq 改寫 for 迴圈的例子說明:
for i in $(seq 0 19)
do
echo $i
done


事實上,上面的例子都只能用在數字的情況,若是非數字的部份則無法採用同樣的方式,例如:
for i in {a..z}
do
echo $i
done

個人比較常用於長路徑時使用,例如:
cp /a/long/path/A /a/long/path/B TARGET
寫成
cp /a/long/path/{A,B} TARGET

通常可以少打很多字

在寫 shell script 中,有時反而希望 BASH 不要解釋這樣的大括號擴展,可以用 set +B來抑制,也就是預設是 set -B來啟用

搭配中括號的擴展也會對有效字串的產生非常有幫助,請自行搭配使用。

2008/05/27

Bash Process Substitution 命令代換

本文大致是翻譯自shell process redirection


為瞭解釋方便,先假設有 a, b, 兩個純文字檔,內容為:

$ cat a
e
d
c
b
a
$ cat b
g
f
e
d
c
b


一般命令的轉向可以結合多個命令成一個,是非常方便的,可是這觀念在早期是從 stdin, stdout 來看才正確,若有個命令要用到 file 的話,就很麻煩,例如 comm 是比對兩個檔案,針對上面的 a, b 要比對的話,可能要先 sort a | uniq > tmp_a 及 sort b | uniq > tmp_b,之後再用 comm -3 tmp_a tmp_b

底下直接列出比較方便的方式:

comm -3 <(sort a | uniq) <(sort b | uniq)

說明:
<(command list) 會把命令結果當輸入,所以上面 <(sort a | uniq) 結果會被當成一個 file 供 comm 當輸入用 >(command list) 會把命令結果寫入

儲存空間共享 wuala

http://wua.la/

一般線上的儲存空間我就不多說,我是也有在用,只是很少真正拿來儲存檔案。早期我用過 gmail 來當儲存空間,叫 gdrive 或 gspace, 這跟 gfs 這個字無關。

wuala 是一個比較特別的儲存空間共享系統,可以在 Windows, Mac OS, Linux 上執行,它的理念是,你安裝後,可以免費取得 1G 的空間。對,你會想說這樣的空間並不大。所以真正有價值的理念是,它需要你貢獻你的儲存空間出來,若你貢獻了 10G, 而你平常「發呆」的時間夠長,譬如有一成的時間你可以給別人用的話,那你就可以增加 10G x 10% == 1G 的空間。

什麼?這有什麼好處?意思是,若你的電腦平時也都有開著,那你的發呆比例就會上升不是?那麼你可以使用的空間會多更多。往壞的方向想,你會說,那豈不是更浪費自己的儲存空間?要這麼想似乎也對,但是天下沒有白吃的午餐,當你把自己的空間貢獻出來的話,你就會獲得相對應大小的線上空間,這似乎才是比較長久的策略。

因為我還沒正式使用,只是先跟大家分享而已,有心得再跟大家報告。

正規表示法 regular expressions for bash

bash regular expressions

這篇主要算是翻譯自上面的文章。一般在寫 shell script 時,比對字串通常用的是 grep, sed, cut,col 等等工具,但是 Bash 較新的版本其實內建正規表示法運算子 =~ 可供使用,這有點像 perl, 但是又可以不必把龐大的 Perl 包裝進去。

因為正規表示法的比對是多匹配的,匹配結果放在 BASH_REMATCH 這個環境陣列變數中,整體結果放 BASH_REMATCH[0], 第一個匹配樣式放 BASH_REMATCH[1].....

直接給範例比較簡單:


#!/bin.bash
# saved as bashre.sh
if [[ $# -lt 2 ]]; then
echo "Usage: $0 PATTERN STRINGS..."
exit 1
fi
regex=$1
shift
echo "regex: $regex"
echo

while [[ $1 ]]
do
if [[ $1 =~ $regex ]]; then
echo "$1 matches"
i=1
n=${#BASH_REMATCH[*]}
while [[ $i -lt $n ]]
do
echo " capture[$i]: ${BASH_REMATCH[$i]}"
let i++
done
else
echo "$1 does not match"
fi
shift
done


執行結果如下:

$ ./bashre.sh 'aa(b{2,3}[xyz])cc' aabbxcc aabbcc
regex: aa(b{2,3}[xyz])cc

aabbxcc matches
capture[1]: bbx
aabbcc does not match

2008/04/02

shell script 的小技巧

假設有個 script file 如下:

#!/bin/sh
cmds.....

可以修成
#!/bin/sh -v
cmds.....

這樣就會自動把執行過程的命令列出來。第一行很重要,例如
#!/usr/bin/less
......

這樣就會把第二行以後(含)的所有內容,以 stdin 的方式傳給 less 讀。這種方法在寫 CGI 時其實很有用,好好思考一下運用起來就很方便。

2008/03/29

make -C

底下是用在 build mozilla 時用的,但是像 kernel 也是同樣的道理,參考一下

1) pull or update a tree from CVS
2) make -f client.mk build
3) go have lunch
4) make changes in foo/bar/
5) make -C foo/bar
6) repeat #4, #5

2008/03/28

message queue example

多年來,在做嵌入式產品時,經驗上在網虎時代大家都用 message queue 機制來通訊,其實當時也還有其他的機制,但是底下的工具可以讓大家省點事,似乎後來就都採用這套方法,有興趣的人可以拿去用用看。

語法在程式中有提到




#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

#define MAX_TEXT 255

typedef struct my_msg_st {
long int mtype;
char mtext[MAX_TEXT];
} msgbuf;

int main(int argc, char *argv[])
{
int msgid;
int sz;
int key;
long int type;
msgbuf mdata;
char buffer[MAX_TEXT];

if (argc == 1) {
printf ("Usage: %s key [type [data]]\n", argv[0]);
return 1;
}

key = atoi (argv[1]);
msgid = msgget((key_t)key,0666|IPC_CREAT);

if (msgid == -1) {
return 2;
}

if (argc == 2) { // get all types
if (msgrcv(msgid,(void *)&mdata, MAX_TEXT, (long)0, IPC_NOWAIT) == -1) {
return 3;
}
printf ("%d %s\n", mdata.mtype, mdata.mtext);
}
else if (argc == 3) { // get assign type
type = atol (argv[2]);
if (msgrcv(msgid,(void *)&mdata, MAX_TEXT, type, IPC_NOWAIT) == -1) {
return 4;
}
printf ("%ld %s\n", mdata.mtype, mdata.mtext);
}
else if (argc == 4) { // send assign type, data
mdata.mtype = atol(argv[2]);
strcpy (mdata.mtext, argv[3]);
mdata.mtext[strlen(mdata.mtext)] = '\0';
if (msgsnd (msgid, (void *)&mdata, MAX_TEXT, IPC_NOWAIT) == -1 ) {
return 5;
}
printf ("send to msg_id %d with type %ld : '%s'\n", msgid, (long)mdata.mtype, mdata.mtext);
}
return 0;
} // end of main()

2008/01/10

如何突破防火牆

如何突破防火牆一向不是我關心的重點,不過公司也愈來愈誇張,東擋西擋的,現在我都不知道該怎麼上網了,連底下這篇也被擋,下面這篇絕不是我寫的。

如何突破防火牆設定
此篇文章並非小弟原創,原作者已不可考,它是我網管筆記的一部份分享給有需要的人

現在隨著人們的安全意識加強,防火牆一般都被公司企業採用來保障網路的安全,一般的攻擊者在有防火牆的情況下,一般是很難入侵的。下面談談有防火牆環境下的攻擊和檢測。

一 防火牆基本原理

首先,我們需要瞭解一些基本的防火牆實現原理。防火牆目前主要分包過濾,和狀態檢測的封包過濾,應用層代理防火牆。但是他們的基本實現都是類似的。

│ │---路由器-----網卡│防火牆│網卡│----------內部網路│ │

防火牆一般有兩個以上的網路卡,一個連到外部(router),另一個是連到內部網路。當打開主機網路轉發功能時,兩個網卡間的網路通訊能直接通過。當有防火牆時,他好比插在網卡之間,對所有的網路通訊進行控制。

說到訪問控制,這是防火牆的核心了:),防火牆主要通過一個訪問控制表來判斷的,他的形式一般是一連串的如下規則:

1 accept from+ 源位址,埠 to+ 目的地址,埠+ 採取的動作
2 deny ...........(deny就是拒絕。。)
3 nat ............(nat是位址轉換。後面說)

防火牆在網路層(包括以下的煉路層)接受到網路資料包後,就從上面的規則連表一條一條地匹配,如果符合就執行預先安排的動作了!如丟棄包。。。。
但是,不同的防火牆,在判斷攻擊行為時,有實現上的差別。下面結合實現原理說說可能的攻擊。

二 攻擊包過濾防火牆

包過濾防火牆是最簡單的一種了,它在網路層截獲網路資料包,根據防火牆的規則表,來檢測攻擊行為。他根據資料包的源IP位址;目的IP位址;TCP/UDP源埠;TCP/UDP目的埠來過濾!!很容易受到如下攻擊:


1 ip 欺騙攻擊:


這種攻擊,主要是修改資料包的源,目的地址和埠,模仿一些合法的資料包來騙過防火牆的檢測。如:外部攻擊者,將他的資料報源位址改為內部網路位址,防火牆看到是合法位址就放行了:)。可是,如果防火牆能結合介面,位址來匹配,這種攻擊就不能成功了:(


2 d.o.s拒絕服務攻擊


簡單的包過濾防火牆不能跟蹤 tcp的狀態,很容易受到拒絕服務攻擊,一旦防火牆受到 d.o.s 攻擊,他可能會忙於處理,而忘記了他自己的過濾功能。:)你就可以饒過了,不過這樣攻擊還很少的。!

3 分片攻擊

這種攻擊的原理是:在IP的分片包中,所有的分片包用一個分片偏移欄位標誌分片包的順序,但是,只有第一個分片包含有TCP埠號的資訊。當IP分片包通過分組過濾防火牆時,防火牆只根據第一個分片包的Tcp資訊判斷是否允許通過,而其他後續的分片不作防火牆檢測,直接讓它們通過。

這樣,攻擊者就可以通過先發送第一個合法的IP分片,騙過防火牆的檢測,接著封裝了惡意資料的後續分片包就可以直接穿透防火牆,直接到達內部網路主機,從而威脅網路和主機的安全。

4 木馬攻擊

對於包過濾防火牆最有效的攻擊就是木馬了,一但你在內部網路安裝了木馬,防火牆基本上是無能為力的。

原因是:包過濾防火牆一般只過濾低埠(1-1024),而高埠他不可能過濾的(因為,一些服務要用到高埠,因此防火牆不能關閉高埠的),所以很多的木馬都在高埠打開等待,如冰河,subseven等。。。

但是木馬攻擊的前提是必須先上傳,運行木馬,對於簡單的包過濾防火牆來說,是容易做的。這裏不寫這個了。大概就是利用內部網路主機開放的服務漏洞。

早期的防火牆都是這種簡單的包過濾型的,到現在已很少了,不過也有。現在的包過濾採用的是狀態檢測技術,下面談談狀態檢測的包過濾防火牆。

三 攻擊狀態檢測的包過濾

狀態檢測技術最早是checkpoint提出的,在國內的許多防火牆都聲稱實現了狀態檢測技術。

可是:)很多是沒有實現的。到底什麼是狀態檢測?一句話,狀態檢測就是從tcp連接的建立到終止都跟蹤檢測的技術。

原先的包過濾,是拿一個一個單獨的資料包來匹配規則的。可是我們知道,同一個tcp連接,他的資料包是前後關聯的,先是syn包,-》資料包=》fin包。資料包的前後序列號是相關的。

如果割裂這些關係,單獨的過濾資料包,很容易被精心夠造的攻擊資料包欺騙!!!如nmap的攻擊掃描,就有利用syn包,fin包,reset包來探測防火牆後面的網路。!

相反,一個完全的狀態檢測防火牆,他在發起連接就判斷,如果符合規則,就在記憶體登記了這個連接的狀態資訊(位址,port,選項。。),後續的屬於同一個連接的資料包,就不需要在檢測了。直接通過。而一些精心夠造的攻擊資料包由於沒有在記憶體登記相應的狀態資訊,都被丟棄了。這樣這些攻擊資料包,就不能饒過防火牆了。

說狀態檢測必須提到動態規則技術。在狀態檢測裏,採用動態規則技術,原先高埠的問題就可以解決了。實現原理是:平時,防火牆可以過濾內部網路的所有埠(1-65535),外部攻擊者難於發現入侵的切入點,可是為了不影響正常的服務,防火牆一但檢測到服務必須開放高埠時,如(ftp協議,irc等),防火牆在記憶體就可以動態地天加一條規則打開相關的高埠。等服務完成後,這條規則就又被防火牆刪除。這樣,既保障了安全,又不影響正常服務,速度也快。!

一般來說,完全實現了狀態檢測技術防火牆,智慧性都比較高,一些掃描攻擊還能自動的反應,因此,攻擊者要很小心才不會被發現。

但是,也有不少的攻擊手段對付這種防火牆的。

1 協議隧道攻擊

協議隧道的攻擊思想類似與VPN的實現原理,攻擊者將一些惡意的攻擊資料包隱藏在一些協定分組的頭部,從而穿透防火牆系統對內部網路進行攻擊。
例如,許多簡單地允許ICMP回射請求、ICMP回射應答和UDP分組通過的防火牆就容易受到 ICMP 和 UDP 協議隧道的攻擊。Loki和lokid(攻擊的用戶端和服務端)是實施這種攻擊的有效的工具。在實際攻擊中,攻擊者首先必須設法在內部網路的一個系統上安裝上lokid服務端,而後攻擊者就可以通過loki用戶端將希望遠端執行的攻擊命令(對應IP分組)嵌入在ICMP或UDP包頭部,再發送給內部網路服務端lokid,由它執行其中的命令,並以同樣的方式返回結果。由
於許多防火牆允許ICMP和UDP分組自由出入,因此攻擊者的惡意資料就能附帶在正常的分組,繞過防火牆的認證,順利地到達攻擊目標主機

下面的命令是用於啟動lokid伺服器程式:

lokid-p-I-vl

loki客戶程式則如下啟動:

loki-d172.29.11.191(攻擊目標主機)-p-I-v1-t3

這樣,lokid和loki就聯合提供了一個穿透防火牆系統訪問目標系統的一個後門。
2 利用FTP-pasv繞過防火牆認證的攻擊FTP-pasv攻擊是針對防火牆實施入侵的重要手段之一。目前很多防火牆不能過濾這種攻擊手段。如CheckPoint的Firewall-1,在監視FTP伺服器發送給用戶端的包的過程中,它在每個包中尋找"227"這個字串。如果發現這種包,將從中提取目標位址和埠,並對目標位址加以驗證,通過後,將允許建立到該位址的TCP連接。

攻擊者通過這個特性,可以設法連接受防火牆保護的伺服器和服務。詳細的描述可見

http://www.checkpoint.com/techsupport/alerts/pasvftp.html

3 反彈木馬攻擊

反彈木馬是對付這種防火牆的最有效的方法。攻擊者在內部網路的反彈木馬定時地連接外部攻擊者控制的主機,由於連接是從內部發起的,防火牆(任何的防火牆)都認為是一個合法的連接,因此基本上防火牆的盲區就是這裏了。防火牆不能區分木馬的連接和合法的連接。

但是這種攻擊的局限是:必須首先安裝這個木馬!!!所有的木馬的第一步都是關鍵!!!!

四 攻擊代理

代理是運行在應用層的防火牆,他實質是啟動兩個連接,一個是客戶到代理,另一個是代理到目的伺服器。

實現上比較簡單,和前面的一樣也是根據規則過濾。由於運行在應用層速度比較慢/1攻擊代理的方法很多。

這裏就以wingate為例,簡單說說了。(太累了)

WinGate是目前應用非常廣泛的一種Windows95/NT代理防火牆軟體,內部用戶可以通過一台安裝有WinGate的主機訪問外部網路,但是它也存在著幾個安全脆弱點。

黑客經常利用這些安全漏洞獲得WinGate的非授權Web、Socks和Telnet的訪問,從而偽裝成WinGate主機的身份對下一個攻擊目標發動攻擊。因此,這種攻擊非常難於被跟蹤和記錄。

導致WinGate安全漏洞的原因大多數是管理員沒有根據網路的實際情況對WinGate代理防火牆軟體進行合理的設置,只是簡單地從缺省設置安裝完畢後就讓軟體運行,這就給攻擊者可乘之機。

1 非授權Web訪問

某些WinGate版本(如運行在NT系統下的2.1d版本)在誤配置情況下,允許外部主機完全匿名地訪問網際網路。因此,外部攻擊者就可以利用WinGate主機來對Web伺服器發動各種Web攻擊(如CGI的漏洞攻擊等),同時由於Web攻擊的所有報文都是從80號Tcp埠穿過的,因此,很難追蹤到攻擊者的來源。

檢測

檢測WinGate主機是否有這種安全漏洞的方法如下:

1) 以一個不會被過濾掉的連接(譬如說撥號連接)連接到網際網路上。
2) 把流覽器的代理伺服器位址指向待測試的WinGate主機。
如果流覽器能訪問到網際網路,則WinGate主機存在著非授權Web訪問漏洞。

2 非授權Socks訪問

在WinGate的缺省配置中,Socks代理(1080號Tcp埠)同樣是存在安全漏洞。與打開的Web代理(80號Tcp埠)一樣,外部攻擊者可以利用Socks代理訪問網際網路。

防範

要防止攻擊WinGate的這個安全脆弱點,管理員可以限制特定服務的捆綁。在多宿主(multihomed)系統上,執行以下步驟以限定如何提供代理服務。

1選擇Socks或WWWProxyServer屬性。
2選擇Bindings標籤。
3按下ConnectionsWillBeAcceptedOnTheFollowingInterfaceOnly按鈕,並指定本WinGate服務器的內部介面。

非授權Telnet訪問

它是WinGate最具威脅的安全漏洞。通過連接到一個誤配置的WinGate伺服器的Telnet服務,攻擊者可以使用別人的主機隱藏自己的蹤跡,隨意地發動攻擊。

檢測

檢測WinGate主機是否有這種安全漏洞的方法如下:

1使用telnet嘗試連接到一台WinGate伺服器。


[root@happy/tmp]#telnet172.29.11.191
Trying172.29.11.191….
Connectedto172.29.11.191.
Escapecharacteris'^]'.
Wingate>10.50.21.5


2如果接受到如上的回應文本,那就輸入待連接到的網站。

3如果看到了該新系統的登錄提示符,那麼該伺服器是脆弱的。

Connectedtohost10.50.21.5…Connected
SunOS5.6
Login:


對策

防止這種安全脆弱點的方法和防止非授權Socks訪問的方法類似。在WinGate中簡單地限制特定服務的捆綁

就可以解決這個問題。一般來說,在多宿主(multihomed)系統管理員可以通過執行以下步驟來完成:

1選擇TelnetSever屬性。
2選擇Bindings標籤。
3按下ConnectionsWillBeAcceptedOnTheFollowingInterfaceOnly按鈕,並指定本WinGate服務器的內部介面。

2008/01/09

gnutella

這東西很好玩,主要在於有 source code, 而且不難,用來做 P2P, 就算只拿來研究檔案分享原理也不錯。

純文字版的有 mutella, 或有 GUI 的有 gtk-gnutella,有興趣研究的可以參考 http://gnutella-specs.rakjar.de/index.php/Main_Page

2008/01/02

AVI 轉換 DVD on Ubuntu

很好笑的一件事,同事用數位相機拍下 2007/2008 跨年煙火,卻不能在 windows 下用 media player 播放,我是懶得幫人家解決事情,教人家釣魚,不如直接給魚來的實際些,因此就將之轉成 DVD 格式,在此將心得寫下來。

第一步,先做好存放位置:
mkdir -p dvd

二、轉檔成 mpeg2
mencoder -oac lavc -ovc lavc -of mpeg -mpegopts format=dvd -vf scale=720:480,harddup -srate 48000 -af lavcresample=48000 -lavcopts vcodec=mpeg2video:vrc_buf_size=1835:vrc_maxrate=9800:vbitrate=5000:keyint=18:aspect=4/3:acodec=ac3:abitrate=192 -ofps 30000/1001 -o dvd.mpg xxx.avi
或
mencoder -oac copy -ovc lavc -of mpeg -mpegopts format=dvd -vf scale=720:480,harddup -lavcopts vcodec=mpeg2video:vrc_buf_size=1835:vrc_maxrate=9800:vbitrate=5000:keyint=18:aspect=4/3 -ofps 30000/1001 -o dvd.mpg xxx.avi

三、準備 xml 檔以便轉成 DVD

<dvdauthor>
<vmgm />
<titleset>
<titles>
<pgc>
<vob file="dvd.mpg" chapters="0,0:10,0:20,0:30,0:40,0:50" />
</pgc>
</titles>
</titleset>
</dvdauthor>


四、轉成 DVD 格式
dvdauthor -o dvd -x dvd.xml

五、試播(可略過)
mplayer dvd:// -dvd-device ./dvd

六、燒錄
growisofs -dvd-compat -Z /dev/scd0 -dvd-video ./dvd/
PS: /dev/scd0 應視您的系統而定,指的是燒錄機的實體裝置名稱

2007/12/13

active RAID-5 ubuntu with mdadm

想在 ubuntu 下裝 RAID-5 的企圖心讓我有機會第一次設定 Raid-5, 在此建議各位使用 mdadm, 若尚未安裝的話,請 sudo apt-get install mdadm

步驟很簡單,只需要先將硬碟裝起來,當然驅動程式不在此討論。以我的例子來說,我是裝了四顆硬碟,用 fdisk -l 看會有四顆硬碟。

二、先分割區做好,例如 fdisk /dev/sdf。請把四顆都做好,而不是一顆。至於分割區的 type, 請選擇 fd. 不過我用 ext3(83) 也可以。

三、mdadm -C /dev/md0 -l5 -n4 /dev/sd[bcde]1

四、使用前當然要先格式化 mkfs.ext3 /dev/md0

四、接下來就可以掛載 mkdir -p /media/raid5; mount /dev/md0 /media/raid5

五、要停用的話,請用 mdadm --stop, 若要重新啟用則用 mdadm --run,有一個建議的用法是 mdadm --stop --scan 這樣可以把所有 RAID 停掉

六、若要自動在開機時掛載(非從此 RAID 碟開機)的話,可以修改 /etc/fstab, 參考如下
/dev/md0 /media/raid5 auto defaults 0 0

七、要若查狀態,可以用 mdadm -D /dev/md0

八、若是將 RAID 硬碟移到別的系統,則需要重組 mdadm --assemble --scan

九、若要把 RAID 電源關閉,必須先移除該 RAID controller 的 module, 否則核心會收到一堆錯誤訊息,以我的系統為例,是 rmmod sata_sil24。當然若你系統未關,在重新使用 RAID 之前記得先 modprobe sata_sil24。因為 RAID 都是 SATA 裝置,所以若不知道自己的模組名稱,可以試試 lsmod | grep sata 來找出來

蛇吞象 400S, ubuntu-7.10-server Sil 3132 + Sil 3726

我想架個 server, 做法是買台 普通 DIY PC, 然後外掛一台蛇吞象 400S, 裡面接四顆 500GB 硬碟,這樣的好處是 PC 沒附作業系統,我喜歡,而儲存用的硬碟在外面也比較好管理。

問題來了,這款 Raid 外接盒並沒有受支援,找了 patch file 一看,哇,一萬七千多行,我用差不多一天的時間才 porting 完,下載最新 2.6.23 更新檔,但是我想既然要更新,就將它更新到 2.6.39.9 的最新版去。幸好開機成功。

若有興趣的人,請自行下載 patch, 不過原網站目前最新的是給 2.6.23, 若您想用 2.6.23.9 試試的話,可以從此處下載。請注意兩件事:
一、這個 patch 並未給予任何保證與服務
二、裡面我拿掉一個裝置,p5wdh, 懶得把它加回去。

2007/12/06

gmail group chat

愛用 google 產品的注意一下。我五、六年前開始用 google 的 search engine 時就已發現英文介面(一開始其實沒中文介面)與中文介面設定畫面不太一樣,尤其在從試用版開始用 gmail 時也發現所提供的功能也不太一樣。但是因為當時查兩種語系的功能時發現不同的部份我也用不到,所以後來只用中文介面,誰知,今天為了要找 gmail group chat 功能才發現,事實上還不止這個功能在中文沒有,還有更多的地方是不一樣的。

也就是說,請大家有機會有意願的話,用英文介面吧!

2007/12/05

VirtualBox 使用 usb device

http://www.linuxdiyf.com/viewarticle.php?id=67813
1.增加 usbfs 群組

$ sudo groupadd usbfs 或
# groupadd usbfs

2. 查看 usbfs 的 gid

$ cat /etc/group | grep usbfs
usbfs:x:1002: <-- 這邊應該會不一樣,請仔細比對,下面要用到

把當前用戶增加到 usbfs 群組,請修改 /etc/group 裡的
usbfs:x:1002:
修改為
usbfs:x:1002:wade 這裡的 wade 即為你平常登入使用的帳號

4. 為 USB 裝置檔案系統設置掛載及權限,修改 /etc/fstab文件,添加下面兩行,注意你的gid可能不是1002(上面有查到)

# 1002 is the USB group IDI
none /proc/bus/usb usbfs devgid=1002,devmode=664 0 0

2007/11/30

模擬器 simulator

一聽到模擬器,大家會想到的或許是game 的吧,但是我一向不玩 game, 所以當然不會去談它,但是事實上我也曾經玩過 game 模擬器,其實這也是一個課題。

比較常用的模擬器有很多,一般人可能較常用 vmware 吧,不過我以前只用 wine, 後來用 qemu, 最近又多了一個不錯的選擇,叫 virtual box, 有windows 也有 Linux, 例如 debian/ubuntu

其實模擬器還有很多,例如 xen, 但是其他的我都沒在用,只曾經試用。若以 x86 的模擬來說,Virtual box 比 qemu 還快,不過 qemu 適用的硬體較多,算是各有好壞。

2007/11/15

unzip unsupported compression method 99

我最近遇到 unzip 要解開收到的附件,卻出現 unsupported compression method 99,因為明明是 .zip 檔,所以一直以為是 winzip 太新用了什麼鳥方法造成的,因為困擾不大就沒深究。後來才發現用 7z 可以解開,查了一下,底下一篇有說明 http://juljas.net/linux/tips/,其說明如下:


ZIP unsupported compression method 99
There is new kind of compresion that can be used to compress files inside .zip file.
It is related to security encryption and regular Linux unzip utility does not know how to handle that.

Files compressed with method 99 can be uncompressed with another utility called 7z. There is Linux & win32 version.
Syntax is: 7z x file.zip

7z is available at 7z home site and in standard repositories (i.e. yum install p7zip p7zip-plugins)

事實上在 debian/ubuntu 中也有 p7zip 可以安裝,請自行用 apt-cache search p7zip 找。若含密碼的話,解開的語法是類似
7z x -p密碼緊接在此 File.zip

2007/10/25

隨手筆記 tomboy

推薦大家使用一套軟體 http://live.gnome.org/Tomboy/Win32

wiki 是我很喜歡的東西,隨手把要的資料寫下來很重要,有一套 google notebook,不過要上網。當然啦,上網有上網的好處,就是你到別人那兒也可以透過網路把筆記讀取下來,問題是,若我真的只是想隨手記呢?那就請用 Desktop Wiki 軟體。 tomboy 是免費軟體,歡迎大家使用。

如果你使用習慣了,它讓你很容易整理隨手資料(當然是純文字),寫心得剛好,寫小抄適用。若能配合 google desktop 那就更妙,透過 google desktop 來找根本就可以隨便亂放,連整理的工夫都免了。

2007/10/24

低價 NB?

陳彥廷/台北2007/10/24 繼華碩Eee PC進軍消費性市場後,神達亦宣布2008年正式跨向
低價PC市場,將與MIND Ltd.合作,瞄準3~12歲學童市場,亞洲區已選定香港率先推出,定
價為3,000港幣。
筆記型電腦(NB)業者認為,神達進軍低價PC意義格外重大,因為低價PC切入消費性市場前
景開始受到注意,而神達切入特殊市場經驗豐富,針對特殊年齡層及使用功能再與Eee
PC區隔,至於目前OLPC(One Laptop per Child)仍堅持走新興、標案市場,若Eee PC、神
達與MIND的兒童電腦將市場規模加大,標案市場訂單未如預期順利的OLPC陣營,恐得調整
策略進駐消費性市場。
隨著華碩Eee PC引爆低價PC熱潮,炒熱市場,使目前全力衝刺手持式系列產品的神達,亦
正式喊進兒童電腦市場,至於最先提倡低階PC產品的OLPC陣營,因為競爭者眾而氣勢再度
式微,而陪著OLPC一路走來的處理器廠超微(AMD),近期則展開一連串節能平台宣傳戰,為
沒有品牌加持的OLPC護盤,增強11月出貨氣勢!
事實上,華碩跨出NB品牌大廠不敢輕易嘗試的一步棋,讓Eee PC前進消費性市場接受挑戰
,進而引領風潮,如微軟(Microsoft)原本不願支持,到最後降價以求,Eee PC的
Windows簡易版和XP完整版將在2007年底提供市場選購,華碩也斬釘截鐵地表示,
Windows與Linux版的價差不大!現在無論低價PC能帶給華碩多少獲利,當低價PC氣勢擴大
,外圍相關軟、硬體供應廠商也只有跟進的份。
PC業者指出,由於低價PC焦點移轉,擔心OLPC氣勢下滑的超微近期亦不得不為OLPC發聲,
希望為氣勢稍弱的OLPC陣營注入一劑強心針。超微強調,OLPC是協助開發中國家孩童學會
如何學習(Learn Learning)的重要教學工具,其耗電量僅為一般NB的10分之1。
值得注意的是,處理器大廠英特爾(Intel)除Classmate PC與Eee PC之外,7月亦已加入
OLPC所發起100美元電腦計畫,因此,未來無論任何一陣營成功熱賣,英特爾終將是最大贏
家。此外,近期市場也傳出氣勢不如預期的OLPC,若連標案市場大餅也輸給華碩Eee PC,
超微恐將琵琶別抱,未來低價PC市場如何發展,備受業界關注!

評估行動終端8大要素 mobile device

唐鴻/DIGITIMES2007/10/24 前言:目前已決定導入Tablet PC的企業,定位較為明確,至於導入Tablet PC的評估要素,也可見諸本刊先前探討導入筆記型電腦的文章中。但是導入UMPC,則遠較導入Tablet PC複雜,因為在UMPC的應用定位中,可能與輕薄型筆記型電腦、PDA、PDA手機、智慧型手機等裝置重疊,如何完善的評估是否該導入UMPC,反而更為困難,因此,本篇將針對導入UMPC的關鍵評估因素,進一步加以討論。

M化是許多企業考慮導入行動終端的重要因素,但是行動終端的選擇相當多樣,事實上,UMPC只是眾多競爭者之一,還有一般筆記型電腦、輕薄型筆記型電腦、PDA、PDA手機、智慧型手機…等多種裝置,在華碩(ASUS)推出Eee PC低價電腦後,又多了1個新的競爭對手。

這些行動終端裝置雖然可以從外觀上看出有很大的不同,但是功能性及許多設計概念,卻有大量重複之處,企業一方面因為能有多種選擇所喜,畢竟這並非獨佔市場,價格與品質都比較健康,但是另一方面又為選擇太多所苦。

本專題前面的章節中,已先針對UMPC作為第2台筆記型電腦的身分,做了一番評估比較,雖然這是一般人認定的UMPC定位,但是對很多企業來說,行動終端設備根本不是所謂的Sub-NB,因此,在此一假設不存在的情況下,又該如何評估?

所幸導入行動終端,還是有幾項關鍵因素可以作為評估標準,讓企業採購人員至少有個基準可以依循。

導入行動終端8大要素 按部就班評估真實需求面向

企業評估該導入何種行動終端裝置,可以由網路連線品質與傳輸速度、作業系統使用彈性、內容輸入難易度與重新學習成本、螢幕大小、攜帶便利性、電池使用續航力、穩定性與安全性、總持有成本等8個面向,進行全方位的評估。

1.網路連線品質與傳輸速度

作為M化終端,良好的無線網路連線品質與傳輸速度,當然是優先考量的因素,但是,目前無線網路的連線模式日益複雜,不同終端設備由於體積或基本設計的限制,支援的連線模式也不盡相同,當然是導入時應該評估的重點,特別是各種連線模式的費率不同,除了效率,連線成本亦不可忽略。

目前較為普及的連線方式,有Wi-Fi無線網路、3G或3.5G行動通訊網路;此外,眾所矚目的WiMAX執照,終於在2007年7月底透過競標程序,成功的發放了8張,根據規定,取得執照者必須在3年內開台營業,因此,業者間的布局與角力,也會牽動無線連線市場的變化。

單就連線支援度來說,各種連線模式都支援,自然比較能夠達成無縫連線的最佳狀況,不過,大部分的行動終端限於各種設計因素,通常難以一網打盡。一般來說,較大的裝置,即筆記型電腦、輕薄筆記型電腦、UMPC類的產品,都有支援擴充的USB插槽,因此,就算原本不支援某種連線模式,例如大部分的筆記型電腦都沒有支援3.5G上網,卻可透過安裝USB介面3.5G數據機的方式,解決此一問題。

扣除上網的部分,手機類的手持行動終端搭配近場通訊 (Near Field Communication; NFC),即支援短距離的資料無線傳輸技術,能發揮相當大的應用彈性,因為NFC具有雙向識別和連接的功能,適用於認證與付費機制等特殊應用。手機加上NFC功能,成為電子錢包、悠遊卡的中心,雖然與一般無線上網的應用模式不同,卻同樣能替行動商務人士帶來不少便利性。

2.作業系統使用彈性

行動終端裝置的角色,除了筆記型電腦(含Tablet PC)與輕薄筆記型電腦與部分硬碟容量較大的UMPC外,幾乎都會受限於系統效能與儲存容量,無法運算與儲存大規模或是較耗效能的企業資料,此時,通常需要1台桌上型電腦或大型筆記型電腦,作為後端支援電腦,M化使用者的各種資料在兩者間交換,已是司空見慣的運作模式。

如果行動終端是筆記型電腦、輕薄筆記型電腦、UMPC,就作業系統這1項,基本上與企業後端電腦具有完整的相容性,因此無論是連接傳送資料,或是企業開發應用程式方面,都相當完整與便利。

如果企業導入的行動終端為PDA、PDA手機、智慧型手機,甚至Eee PC等裝置,其採用的作業系統多半為Palm、Windows Mobile、Linux、Symbian等,這類平台與Windows作業系統無法直接連接,必須透過中介軟體,或是企業另行開發的軟體,再不然就是透過網際網路連接,運用上的彈性較為不便,購置軟體或開發軟體的成本也較高。

3.內容輸入難易度與重新學習成本

由UMPC從基本概念捨棄鍵盤,到幾乎所有廠商都把鍵盤列為標準配備,可以看出內容輸入的重要性,特別是中文的環境,每個單字並非由符號所組成,所以輸入的難易度更重要,如果只是輸入一段簡單的資料,都需要耗費大量的時間,相信這樣的行動終端,很容易被使用者束之高閣。

此外,輸入法也與使用者的習慣息息相關,雖然任何技巧都是多加練習即可熟練,但是要花時間重新學習,對許多已經熟悉某種打字或輸入法的使用者來說,可能相當困難,付出的時間與精力也難以估計。

如果不考慮使用環境,輸入的便利性當然以絕大多數使用者已經習慣的大型鍵盤最佳,因此,筆記型電腦與輕薄筆記型電腦通常仍是優先選擇,Eee PC在此項也不惶多讓,而改良過鍵盤的UMPC,基本上也頗貼近使用者的習慣,轉換的學習曲線應該不會太陡峭。

而以手機、PDA等裝置來說,除非外接鍵盤,或是內建鍵盤,且使用者已經非常熟悉小鍵盤的輸入模式,否則一般來說,輸入的便利性,還是以大型的裝置佔上風。此外,風靡全球的BlackBerry手機,雖然也具有鍵盤的設計,但是卻沒有多數台灣民眾習慣的注音輸入法,這個因素竟成為許多使用者或企業不導入的原因,可見內容輸入的影響相當大。

圖說:請注意UMPC與人物的手掌比例,說明了UMPC鍵盤通常必須遷就手持使用模式與攜帶便利性而縮小,因此使用者還是需要花時間才能熟練操作。

4.螢幕大小與顯示效果

螢幕是絕大部分IT設備輸出資訊的最重要裝置,行動終端亦不例外,在多數使用情況下,螢幕通常愈大愈好,並支援較高的解析度,讓顯示畫面的面積最大化,以瀏覽網頁這項行動終端經常執行的功能為例,大螢幕加上較高解析度,瀏覽起來絕對比較輕鬆;用於多媒體播放方面,通常大螢幕會搭配較好的顯示晶片,顯示效果亦較佳。

因此,在螢幕大小這個評估點上,類筆記型電腦產品還是一面倒的強,當然,目前許多智慧型手機或PDA的螢幕大小也急起直追,愈做愈大,但是多媒體顯示效果、螢幕反應速度等,通常還是略微遜色。

不過,螢幕大小通常與裝置本身的體積成正比,顯示效果通常也與耗電量息息相關,到底該如何取捨,還是端看使用者的需求,如果只需要看簡單資訊或是畫面較不複雜的網頁,小螢幕通常還是可以接受,不過,如果資料量較大,可能就得仔細評估螢幕大小。此外,有些使用者本身可能只需要讀取簡單資訊,但卻經常得向客戶展示或分享行動終端顯示的資訊,此時,螢幕當然也是愈大愈好。

5.攜帶便利性

行動終端裝置的攜帶便利性,評估起來通常也是一面倒,只是結果正好與前述3項相反,手持式、沒有內建鍵盤、螢幕較小的手機與PDA等裝置,反而遙遙領先,螢幕愈大、輸入愈便利的筆記型電腦等,在可攜性上則處於落後的局面。

除了尺寸之外,重量也是1å置所使用的連線模式費用,不同模式間運作數個月後,費用可能相差不少,也是總持有成本的一部分。
目前諸多產品相似性愈來愈高,底下的比較可供釐清思路。

=======================================================================


唐鴻/DIGITIMES2007/10/24 前言:不少筆記型電腦廠商推出輕薄攜帶型機種,螢幕尺寸小於12吋,擠壓UMPC的定位。此類筆記型電腦與UMPC之間的差異,最難以比較,在此以技嘉科技的U60 UMPC與Sony的VAIO TZ17輕薄筆記型電腦做一番簡單的對比,讓讀者有較為實際的對照,而不只是抽象概念的說明。

每一種可攜式裝置各有其優缺點,在不同需求之下,根據前1篇所述的8項檢視重點,應該很容易釐清才是,只不過,隨著超輕薄筆記型電腦的體積愈來愈迷你,逐漸踩到UMPC固守的可攜式紅線,加上擁有與UMPC相同的作業系統、使用習慣,似乎也讓採購者開始感到混淆。如果只是抽象的說明兩者的不同,恐怕很難讓人釐清,因此本文將以實機進行細部比較與分析。

技嘉科技U60與Sony推出的TZ17,分別為目前市面上特色鮮明,且相當具有代表性的UMPC與超輕薄型筆記型電腦,以下將對這2台裝置的細部加以分析說明。當然,這樣的比較並沒有勝負之分,只是為了更進一步釐清兩者之間的不同定位與較適合的運作模式。

這2台裝置的基本性能諸元,請參考附表,接著就針對各項特色,直接比較說明。

1.重量與尺寸等攜帶性相關事項
體積上採用6.5吋螢幕的U60明顯略勝一籌,畢竟螢幕決定了體積;至於重量方面,U60的720g正好是TZ17的60%,雖然兩者都不算太重,但是對於可能已經攜帶一大堆文件資料、甚至行李的行動商務人士來說,U60少了40%的重量,應該還是比較討喜。

圖說:U60與TZ17的大小當然有所差別,但都屬於不能放入一般口袋的行動終端,這正是造成兩者定位逐漸模糊的主因,如果攜帶時都需要另外裝在提包裡,多那麼一點大小與重量,往往被許多使用者所忽略。

2.使用便利性

U60為第2代UMPC設計,除了具有可觸控式螢幕,將螢幕往上方滑動,即可看到其內建的QWERTY標準鍵盤,該設計讓使用者不但能在有桌面的情況下,採用較快速的鍵盤輸入模式,在沒有桌子的行動應用環境,亦可手持輸入,操作方式類似遊戲機,對於行動商務可能遇到的各種環境,使用起來都相當便利。只不過鍵盤較小,在適應之前,常會發生誤按或按錯鍵的狀況。

TZ17則為標準的筆記型電腦鍵盤,沒有螢幕觸控輸入模式,在將機器懸空拿取的情況下,幾乎沒有辦法輸入。但是在有桌面的環境,採用標準鍵盤的TZ17因為按鍵較大,排列方式也無須重新適應,打字速度較快。

因此就便利性來比較,可以發現UMPC的優勢在於極具彈性的環境適應能力,輕薄筆記型電腦則強在打字快速,且鍵盤排列無須重新適應,但這2點並沒有絕對的優劣之分,在旅途中,UMPC較佔優勢,但是到了固定場所,輕薄筆記型電腦的優點也頗為明顯。

如果以螢幕來說,TZ17的螢幕當然遠較U60大,對多數瀏覽任務來說,使用筆記型電腦會比較便利。

圖說:螢幕大小與機身成正比,不過,筆記型電腦的鍵盤無法以站立手持的方式使用,所以便利性與否,必須先確立應用環境,才能進一步下評斷。

3.發熱量

行動商務人士無論拿取或將這類行動終端放在大腿上使用,發熱量都會影響使用感覺與舒適性,因此有必要特別拿出來討論。

U60採用VIA C7M處理器,因此發熱量較小,整機最熱的部位,在長期使用後也不會超過攝氏30度,如果以人體感覺,大概是微溫的狀態。

TZ17的溫度則高得多,在長期運作後,處理器滿載時溫度可飆高至攝氏80度左右,當然,因為機身左側有排風扇,因此對於穩定性並沒有影響,且排風方向對於大部分使用者來說,廢熱也不會造成使用上的不便,手腕接觸區的溫度控制也相當良好,使用感覺不錯。

但此類輕薄型筆記型電腦溫度上最大的問題,在於底座長期使用後溫度超過攝氏50度,甚至在滿載的情況下還會飆高,因此,許多行動商務人士採用的權宜之計,是將筆記型電腦放置在大腿上使用,能忍受的時間會大打折扣。

圖說:常常看到許多行動使用者將筆記型電腦置於膝蓋上使用,作為沒有桌子的權宜之計,但以發熱量來說,恐怕並不適合稍長時間工作。

4.電池續航力

電池續航力與行動裝置的內部零件與設計、電池容量、電池狀態、甚至使用者運作模式都有相當的關連性,因此沒有辦法做出很明確的比較。不過一般來說,輕薄型筆記型電腦由於體積較大,因此能夠攜帶更大的電池,所以電池續航力會比UMPC強。

以U60來說,原廠公布電池使用時間約4小時,經過測試,實際以低背光模式運作,開啟無線網路上網,並且處理Office文件的狀況下,大約可運作3小時,已經比過去的UMPC續航力增加不少。
不過TZ17的電池續航力更為強大,原廠表示,電池續航力可達11小時,但以類似U60的運作模式來使用,並開啟內建的最佳化電力配置模式,運作時間約7.2小時,雖與原廠宣告時間有不小的差異,不過,已經具有相當的續航力,顯然也遠勝UMPC。

5.效能

雖然這類行動商務終端,通常不會將效能視為重要的參數,但是在定點處理高耗能的運算時,較高的效能,還是能夠提高不少效率、節省處理時間。

其實以硬體的規格就可以看出,TZ17的處理器效能勝過U60,記憶體配置容量也較大,顯示晶片功能稍高一點點,硬碟機的容量與效能也是TZ17勝出。其實,以前述的運作溫度來看,很明顯跟效能是成正比。

因此,對於需要大量高耗能運算的使用者來說,UMPC會較吃力,採用輕薄型筆記型電腦可能是比較好的選擇,當然,UMPC也有效能較強的產品,但是通常也會影響電池續航力與發熱量。再者,以一般行動用途而言,收發郵件、上網、處理文件,甚至多媒體播放的使用模式,U60的表現也相當流暢,效能已經符合行動商務的定位。

6.價格

UMPC搶攻Sub-NB市場,價格是相當重要的武器,畢竟如果是第2台行動終端,表示使用者已經投資建置了第1台筆記型電腦,對於第2台設備的預算可能更為吃緊,而第1代UMPC價位過高,也是公認的致命傷之一。

價位當然隨著市場脈動與廠商策略而有所不同,但是以U60來說,其新台幣28,900元(約800多美元)的價位,已經比初代UMPC遠超過1,000美元的售價好上許多,不過平心而論,許多專家都認為,UMPC要在市場殺出一條血路,500美元以下的售價,可能才是普及與否的關鍵。

不過,相對於輕薄型筆記型電腦,U60的售價還是遠較便宜。以TZ17來說,建議售價達新台幣69,800元,以實際市價來說,也超過U60的2倍以上,就行動商務終端的角度來看,價位明顯在高點。

7.互補性

由上述幾點比較可以大致看出第2代UMPC與輕薄型筆記型電腦的差異點,讓企業行動使用者作為評估參考。不過,有1點是比較這些性能諸元亦無法看出的,就是裝置的互補性。

輕薄型筆記型電腦與第1台筆記型電腦之間,在性能上很可能有許多重複之處,其使用困難點一樣無解,例如在沒有桌椅的地點使用,始終是個大問題;相對的,UMPC卻能與筆記型電腦形成良好的互補性,即任何1台筆記型電腦,目前都無法做到U60的輕便和多樣化使用模式,因此,U60與行動商務人士第1台筆記型電腦的互補角色演繹得比較完善。

圖說:如果已經擁有第1台筆記型電腦,UMPC則具有較好的互補性。

2007/10/22

web 2.0 的精神.....

底下這篇文章寫的很好,請與標題合著仔細品味

===============================================

《國際產業》網路讓印度窮人翻身
2007/10/22 08:32 時報資訊

【時報-記者陳穎柔摘譯】馬諾哈‧拉克希米帕提沒有電腦。其實,在班加羅爾,像馬諾哈這樣的工人(房屋油漆工)通常不被允許碰客戶的公務電腦。

所以你能想像得到,當馬諾哈向一位秘書報出自己的生日、電話號碼和工作經歷,讓她輸入電腦,馬諾哈是有多麼驚奇。然後,有人幫馬諾哈拍照,再來,用滑鼠一點,馬諾哈的個人專屬社交網頁登上網際網路,成為Babajob.com的最新人物檔案。

Babajob是印度一家新創公司,旨在將Facebook與MySpace革命帶給世界上的窮人。Babajob不過是這波委外榮景造成的一個意外副產品:創業家和大型跨國企業正要將印度塑造成以窮人為目標的電腦運算創新中樞。

委外把數百家跨國企業和數十萬名科技人才帶到班加羅爾。現在,委外風潮興起已超過十年,前述企業有許多員工開始將其技術用於對抗貧窮上,技術不再只是用來開發軟體而已。

Babajob的創辦人席安‧巴拉格司維特表示,在Redmond,不會看到七歲的人在街上乞討。他指的是位於華盛頓州的微軟總部,他在那裡工作過。他說,在印度,你很難沒有自己真是幸運的感覺,所以你會問:對於周遭事物能做些什麼?要如何運用所有這些技術?

企業的理由或許沒那麼利他,但通常對窮人產生正面效應,企業已使印度變成一座將現代科技便利擴及長期匱乏者的實驗室。以諾基亞為例,它的超便宜手機有許多是在印度開發的;花旗是第一家在印度試驗能辨認指紋的特殊自動櫃員機(ATM)以幫助記不住個人身分辨識號碼的貧民窟居民;微軟已讓印度成為其全球研發團隊的主要中心之一,此一團隊為窮人研究科技,比如研究能把資訊念給不識字的電腦使用者聽的軟體。

最有名的是社交網站連結善用電腦的菁英份子們。反觀Babajob卻使印度菁英連結上其門外的窮人,後者需要工作但欠缺能找到工作的管道,透過Babajob,求職者刊登技能、雇主刊登徵才廣告,藉由「朋友的朋友」網絡撮合。

比如說,如果拉吉夫和三傑是朋友,而三傑需要一位司機,他可以上拉吉夫的網頁,再去拉吉夫的司機的網頁,然後看看這個司機是否有朋友剛好在找類似的工作。

三十一歲的巴拉格司維特在一九九九年進微軟總部服務,三年後,他被派去印度協助「微軟研發(微軟體制內機構)」設立印度辦公室。

但在班加羅爾工作的微軟員工過的生活與當地的印度人有極大差異,前者有佣人和勞工,他們看的報紙則刊載著關於營養不良和不識字的新聞。微軟的印度員工是第一次眼見這種情況,但其中多數覺得有了對抗這些的新使命。

許多人覺得有著要做些事來幫助其社會的衝勁,他們擁有世界級的電腦技能。與此同時,微軟在印度遭遇軟體盜版使其營收受限,已開始將低收入消費者視為極大的商機,因此,微軟工程師的利他衝勁受到了鼓勵。

在巴拉格司維特的研發辦公室,貧窮成為主要關注點之一,人類學家和社會學家被聘來解釋階級制度對鄉間電腦使用之影響。某日,在此一過程中,杜克大學一位經濟學家讓巴拉格司維特突然有了些洞察,這位經濟學家先讓他們喪氣,然後激勵了他們。

經濟學家阿尼盧德‧克利許納發現,許多做沒有前景之工作的窮印度人走不出貧窮不是因為沒有更好的工作選擇,而是因為欠缺發覺這類工作的管道。任一位班加羅爾人能證實如下觀察:這個城市充斥著渴望有工作的勞工,但富裕的軟體大亨不停抱怨說找不到女傭和廚師。

巴拉格司維特的靈光乍現為何?他當時想到要建置一個專業的社交網站。他就此辭去微軟的工作,然後和他繼父以及以前在微軟的一位同事架了一個社交網站,用以連結班加羅爾的雅痞和當地的工資勞動者。

建置一個旨在連結一天賺二至三美分的勞工之網站意味著要面臨特殊挑戰。這些工人普遍而言不熟悉電腦操作,對於Babajob尤其不熟悉。而且,富裕的雇主不會想讓隨機選取的應徵者照料他們的花園或新生兒。

為了解決此一連結性問題,Babajob付錢給任何上網登記求才的雇主(無論慈善機構或網咖老闆)。此外,Babajob不營造一個匿名的工作市集,反而將印度人在真實生活中聘僱的過程複製到網路上,即運用一連串的私人關係。

在印度,要找司機的生意人可能去問他的朋友,這個朋友可能去問他的司機。這樣的私人關係提供某種品質控制,比如這位朋友的司機不會推薦一個無賴,因為恐怕自己丟了飯碗。(原文刊於國際先驅論壇報)

2007/10/18

image-creator secret for MID

提供一個密辛:當你使用 image-creator 時,卻老是為著它一律從 http://archive.ubuntu.com 下載套件所苦嗎?

其實若從預設地方下載套件,可以保證是最新的,可是速度通常不夠快,若要夠快,可以從當地下載,請修改 /usr/share/pdk/default_config/defaults.cfg, 應該不難理解,我改了兩個地方,一個是 target_mirror = http://debian.linux.org.tw/ubuntu/, 另一個是 buildroot_mirror = http://debian.linux.org.tw/ubuntu/,這樣下載速度變得超快,僅供參考

不過,你會發現這樣做只有前面建立 platform 時比較快,到後面建立 target 時就又回到原來的 http://archive.ubuntu.com 下載,此時可以修改 /usr/share/pdk/platforms/*/sources/gutsy-*.list, 請類推修改。這樣建立整個系統的速度絕對比原先快很多。

======= 20071031 ========
後來才發現,上面那樣修改並沒有多大幫助,真正要改的還是得修改 /etc/apt/sources.list 及 /etc/apt/sources.list.d/*
這邊所指的,都是在 image-creator 裡面的 terminal 所進行的,事實上有興趣的人也可以試試自己 chroot 來做。

2007/10/15

linux 的契機

下面這篇文章說的好,但是我還沒找到來源網站,就先貼著看。不管是 EeePC, OLPC 或其他的超低價新潮流 NB, MID 等等,Linux 都占有一席之地,而這才是 Linux 的最大契機。這一論點我在多年前曾經跟當時的總經理提過,只是限於當時的環境未被重視。

=====

郭長祐/DIGITIMES2007/10/15 前言:如果純以降價來增取新興國家的PC市場,那麼將與1997年興起的低價PC風潮沒有不同,真正的新興國家型PC需要的是更適合當地的功效設計,而根據各項觀察與歸納整理,針對新興國家的因應設計至少有9點需要評估、考慮……

誠如眾人所言,各資訊業者對新興國家型PC市場都還處於「瞎子摸象」的探索階段,因此對此市場的需求設計各有各的主觀設想,這些設想有些確實具有巧思與創意、有些則期望在現有歐美日先進市場與新興市場間求取折衷或接軌之道。

事實上這也是最大的不同點,若單純只是追求PC的低價化發展,那麼早在10年前的1997年就已經啟動,如今的發展決非僅以更低價的方式打入市場,否則將只會成為原有低價PC的戰局延伸,資訊業者也極力避免此種發展,因此在設計上也就格外用心。

到底新興國家型電腦在功效設計上與過往的PC有何差別?以下我們將對此進行統整、歸納性的討論。

1.因應消費預算不足

雖然極力避免,但不可諱言的:新興國家型電腦的第1課必然是價格,如何降低成本也成了設計上的重要課題。舉例而言,MIT Media Lab的OLPC(更具體而言為XO-1型學童用電腦)為了力求整體筆記型電腦的低廉,然其中液晶顯示器部分佔極高的成本比重,因此必須格外花心力去找尋合乎目標成本的顯示器,最終才找尋到僅35美元價位的特有顯示器,且MIT Media Lab期望新款的機種,其顯示器的成本還能再減50%,並在功耗用電上能再減少66.66%。

而Intel方面,Intel不希望陷入PC低價戰,因此提出公用電腦的Community PC理念,依然是以一般PC的價格銷往新興國家市場,但改以社區的公用來均攤開銷,不過如何公用卻沒有更多的技術細節透露。

至於Microsoft,也傾向不打壞PC行情,但作法上又比Community PC具體,Microsoft提出的方案稱為FlexGo,FlexGo電腦需要插入儲值卡才能運作,儲值卡的點數代表使用者能使用電腦的時間(以分鐘計算),如此FlexGo電腦如同公共電話亭,電腦使用者必須購買電話卡才能撥打電話。FlexGo作法不僅可做為公用電腦,就商業模式(Business Model)的運用而言也可做為個人的分期付款電腦,消費者先支付頭款帶回FlexGo電腦,之後依據約定買多少額度的儲值卡,或買包月制的儲值卡達多少月份後,該電腦就不再需要儲值卡才能運作,而與一般傳統電腦無異。

這樣的1套新機制需要額外的軟硬體設計,硬體方面需要用上可信任平台模組(Trusted Platform Module;TPM)的晶片,以及安全辨識用的韌體程式,以及中央處理器等的配合,在TPM晶片方面Microsoft與德國英飛凌(Infineon)合作,在韌體方面與美國鳳凰科技(Phoenix)合作,處理器方面則與Intel、AMD、全美達(Transmeta)等合作。而FlexGo電腦的組裝則與台灣華碩、緯創合作,當然純軟體方面的技術則由Microsoft自行研發。FlexGo的額外設計必然會墊高電腦整體成本,但透過公用均攤與分期付款可以降低此一影響,FlexGo不僅有Windows XP版,也有Windows Vista的版本。

此外,大陸四川國芯科技(Sinomanic)提出的國芯天恩GX-2桌上型(新興國家型)電腦,該電腦提供TV Output功效,能運用一般電視機來充當電腦顯示器,且軟體方面已經配合此一運用,如此就可以省去顯示器的成本開銷。

值得一提的是,2006年大陸貴州省凱裏市大風洞鄉都蓬村都蓬小學就有以黑白電視機做為電腦顯示器,並搭配學習用電腦,如此建構成擁有20多台電腦的學童電腦教室。

2.因應維修據點不足

新興國家型PC的成本、價格已經很低,如果售出後經常壞損,而必須後送維修或到府維修,那麼必然會侵蝕原售業者的利潤,特別是新興國家的交通基礎建設尚待發展,也使維修據點網很難建立。

關於此其實在1997年的低價PC潮就有所因應,低價PC已經低廉,若還經常要動用到維修服務將無利潤可言,所以低價電腦(當時僅以桌上型為低價目標)在設計時不是儘量減少機內擴充槽數目,就是完全棄捨擴充槽設計。過往一般的桌上型電腦多會有3、4個擴充槽,然低價電腦減至1、2個,或甚至降至零。

省擴充槽設計不僅可以省成本,另一方面可以避免使用者插置來歷不明的介面卡,電腦的硬體故障很大的來源是來自拆殼加裝介面卡,因此低價PC盡可能讓使用者以USB外接方式來擴充功效,至少在硬體不相容時可輕易解除狀況,減少後送到原售業者據點或到府的機會。

如今新興國家型PC也承襲此一理念,但除此之外新興國家型PC也開始注重筆記型的設計,如MIT Media Lab的XO-1,以及Intel的Classmate PC等,由於都設計給學童攜帶使用,頻繁外攜與孩童活潑個性,使PC受外力撞擊的機會大增,為了減少撞擊造成故障的機率,所以在機構(外殼)設計上都比過去更強調外力抗受性,以此減少後送維修、到府維修的機率。

3.因應運作環境不佳

「新興國家型PC」有時也稱「鄉用PC」,因為訴求的是縮短城鄉落差、數位落差,然而偏鄉的環境可能無法給PC夠理想的運作環境,對此必須在設計時多加考慮。關於此,目前以Intel的Community PC最具備此方面的設計,Community PC的設定是運用在印度的偏鄉地區,該地區可能沒有冷氣機之類的空調系統,所以PC必須在高溫下還能工作,Community PC是以攝氏40度仍可正常工作為設計目標。

此外,設想中印度偏鄉可能只在一般的搭棚內使用PC,所以風沙會很大,且蚊蟲較多,為了防止風沙、蚊蟲進入PC機內,所以Community PC在散熱風扇的出口加裝濾網。除Intel提出「抗高溫、抗沙塵」的設計外,其餘尚無其他業者對PC運作環境有更多的設計考量,至多是OLPC的鍵盤具有防水、防風沙的效果。不過,即便是Community PC也僅是以印度偏鄉一地為考慮,如果把俄羅斯的低溫、巴西的高濕度等環境也一併考慮,則可能還需要推出其他的因應設計機種,但目前似乎還未有業者提出更具體的方案。

慶幸的是,這些因應環境性的設計要求與工業電腦(Industry PC,簡稱:IPC,或稱:產業用電腦)相近,而台灣電子業者在IPC方面已有深厚著墨,未來在新興國家市場與偏鄉市場上也有較大的機會。

4.因應電力供應不穩

新興國家不僅交通基礎建設尚未完善,在電力供應的公用事業上也是類似,有時容易發生不預期的停電或電力品質不佳等問題。對此新興國家型PC在設計時也必須考慮這點,最先對此提出因應之道的是OLPC(XO-1),為了避免電力不足XO-1考慮過多種作法,甚至考慮過在PC鍵盤按下後也把部分的機械動能轉成發電,不過之後認為比較可行的作法是手搖式發電。

但是,在MIT Media Lab持續研發後找尋到手搖式發電更理想的作法,即手拉式發電,也有人稱為「溜溜球發電」,OLPC用的手拉式發電機是由美國SQUID Labs所研發,發電機的名稱為Potenco,據稱手拉1分鐘即可讓XO-1運作達10分鐘,即1:10的發電效益。相對的,XO-1過往的手搖設計要搖上10分鐘才能產生5瓦的電力,如此在XO-1以彩色模式下運作只能使用20分鐘,約為1:2的發現效益,由此可知「手拉」比「手搖」更理想,因而被MIT Media Lab換替。

另外Intel也在Community PC上提出因應,針對電力品質不佳、不穩的問題提出用不斷電系統(UPS)來改善,這是Community PC最初的主張,然而之後再仔細審視則會發現UPS將墊高PC的整體購置成本,因此退而求其次,有關電力品質不佳的問題暫且跳略,只單純就電力不穩的情形來因應,提出直接使用汽車電瓶來運作的方案,一旦遭遇到停電,可改用汽車電瓶來接手運作。

當然,汽車電瓶是直流電,與家用插座的交流電不同,如此PC的供電器、電源相關的連接器等都必須進行修改,才能使用電瓶式供電。類似的,VIA提出的pc-1計畫中,其桌上型機種也有改接電瓶運作的設計示範。

要補充的是,除了因應電力不佳、不穩外,PC本體的省電性也愈來愈重要,PC本體夠省電就可以減少手拉發電的時間、增長UPS或電瓶的使用時間,以省電性而言目前OLPC最為理想,全機僅在數瓦用電,相對的傳統PC單就處理器就超過10瓦電力,即便電力能穩定、源源不絕地供應,在溫室效應愈來愈烈的情況下,新興國家使用愈多台傳統耗電型PC,只會對全球生態更不利。

5.因應通訊服務不穩

每個國家的交通建設必然比電力建設健全,同時電力建設也必然比通訊建設健全,試想:

沒有道路該如何讓工程車到附近架設電線?沒有電能又怎能建立電信機房、申裝電話?既然新興國家的交通、電力建設都有其不足處,那麼通訊建設自然也不在話下。然而,新興國家型PC的訴求既然在縮短城鄉落差、數位落差,若PC不能連上Internet則功效大打折扣,所以是否在通訊服務不佳、不穩的因應設計也是個重點。關於此Intel在其Community PC中提及使用WiMAX通訊,但是這依然需要當地業者願意佈建WiMAX基地臺、開通WiMAX上網服務才有用,因此不禁令人懷疑有趁機推銷WiMAX技術的嫌疑。

不過,公眾上網的建設、服務不完備,確實難以從PC端進行彌補。但是通訊建設不佳的並非只在公眾端,用戶端也有類似情形,OLPC設想其使用地區並沒有Wi-Fi基地台(或稱無線接取點、無線存取點,Wireless Access Point,簡稱Wireless AP或AP),也可能缺乏工作群組(Workgroup)規模以上的有線網路及伺服器等建設,但每個學童間卻有透過電腦相互交換學習心得與討論的需求。

因此,OLPC在無線通訊上有特別的設計,OLPC與一般PC一樣具有Wi-Fi無線區域網路的通訊功效,但除了透過AP進行資訊收發外,也可不倚賴AP而達到OLPC間的相互通訊,此被稱為Mesh Network功效,可以讓OLPC間進行一對一、一對多的資訊傳遞。

若以更技術層面來論,此即是率先運用尚在草版階段的IEEE 802.11s標準,該標準是以IEEE 802.11的MAC層標準為基礎,以此建立出ad-hoc性質的網路,並定義1個架構及協定來支援廣播(Broadcast)、多播(Multicast)、單播(Unicast)的無線通訊。

附帶一提的,為了縮短知識落差,OLPC在機內預放了離線版的維基百科(Wikipedia)內容,此也有助於提升通訊離線時的PC運用價值。

6.因應資訊基礎不足

如前所述,只是把PC賣到新興國家,PC將遭遇到維修據點不足、電力供應不穩、通訊服務不穩、運作環境不佳等可能,但除此之外相關的資訊基礎建設也是不足的,除了PC之外可能沒有印表機,或印表機不能分享,或缺乏網路、缺乏伺服器等。

關於此也是以OLPC提供最佳的配套方案,MIT Media Lab正積極研發與OLPC搭配的學童用伺服器(或稱:校用伺服器,School Server),稱為XS Server,XS Server用來服務前端多個OLPC,且XS Server可能採行比OLPC更開放的作法,OLPC主要是要求台灣廣達電腦組裝、出貨,但XS Server除了由MIT Media Lab研發外,可能會直接在網路上公開其發展,並交由各國度的當地業者自行依據公佈的規格來建構出自己的XS Server。

除OLPC有配套建設的想法與行動外,目前沒有第2家業者有類似的作法,沒有針對新興國家設計的網路、網路設備、伺服器等,這些必須等到新興國家型PC達一定的銷量後才會有後續行動。若要勉強來說,前面提及的:四川國芯科技的GX-2桌上型PC,該款PC可直接運用電視充當PC顯示器,勉強可算是對資訊基礎建設更快速完整化有所助益。

7.因應操作親和不足

由於OLPC鎖定學童用,所以操作親和性有更多的額外設計,例如具備觸控螢幕、具備顯示器旁的方向鍵等,這些屬硬體性設計,軟體性設計方面也採行更親和的Sugar圖形使用者介面。有關這些目前其他業者的方案多少有顧及,Intel的學童用電腦:Classmate PC並沒有觸控螢幕,也沒有在軟體層面多下功夫,而是直接沿用各軟體業者的既有技術方案,事實上其他業者也多將設計心力專注於硬體上,軟體方面的因應改變並不多。

8.因應知識內容不足

如前項所述,OLPC預裝了離線版的維基百科內容,這也是目前多數新興國家型PC所缺乏的,AMD的PIC雖強調與當地ISP業者合作,但此為「PC硬體與Internet服務」的合作,如果能再加上「Wikipedia內容」可能會更加理想。附帶一提的是,華碩電腦的Eee PC 701預設有連至維基百科的捷徑圖示,但並未預裝其內容。

9.因應拆竊轉賣疑慮

最後,其實還有1項設計可以討論,即是安全防竊性設計,由於新興國家型PC多半低廉,因此銷售到新興國家後,有可能被有心人士轉賣而從中獲利,或直接拆拔機內的組件來銷往黑市,關於此OLPC與Microsoft的FlexGo都宣稱機內組件完全採行焊死作法,防止他人拆竊機內組件。

另外是防止機內資料遭竊,或被取得權限而被駭客利用,關於這些都需要有安全防護機制來因應,關於此Intel的Classmate PC內建TPM晶片,可進行各種安全辨識及驗證,Microsoft的FlexGo因為採儲值卡辨識的作法,因此預設就有安全防護。

此外OLPC也有自屬的Bitfrost技術,可以管控每1個應用程式能存取的硬體權限,例如A應用程式不能使用攝影機,B應用程式可以使用麥克風或觸控等,且在遭竊後只要申報該機序號停用,如此竊走OLPC的人在使用OLPC時,會定期偵測網路、連接網路進行確認,一旦確認為失竊機就會停止使用。

圖說:Intel提出的Community PC是針對印度偏鄉而設計的公用電腦,為了能防止沙塵、蚊蟲等從風扇口進入電腦機內,所以特別加裝了濾網於風扇口。(www.Intel.com)

圖說:大陸四川國芯科技(Sinomanic)推出的「天恩GX-2A電腦」,其本機售價僅人民幣998元,且可用一般電視機充當電腦顯示器,很適合偏鄉與消費力有限的地區。(www.Sinomanic.com)

圖說:OLPC(XO-1)最初提議以手搖方式提供充電,然之後改成以手拉方式提供充電,圖為最初揭露時的產品想像圖。(www.wiki.laptop.org)

圖說:OLPC(XO-1)顯示器中正以彩色模式在顯示維基百科(Wikpedia)的內容頁面。(www.wiki.laptop.org)

2007/10/12

你有發現 ubuntu 無法更改檔名嗎 nautilus scim

這問題網路上很多人在談,有人直接建議改用 gcin, 但是綜觀 gcin 與 scim 的設定會發現,其實現在的環境設定輸入法跟我以前了解的不一樣,請參考 /etc/X11/xinit/xinput.d/ 下的檔。我是更改 zh_TW 後重新登入即可。檔案可以參考下面的修改:


XIM=SCIM
XIM_PROGRAM=/usr/bin/scim
XIM_ARGS="-d"
GTK_IM_MODULE=scim
QT_IM_MODULE=scim
DEPENDS="scim,scim-gtk2-immodule|scim-chewing|scim-tables-zh|scim-qtimm"


另外,有人說 scim 的效率不好,建議以 scim-bridge 取代,您可以自行判斷是否需要如此做,若有安裝 scim-bridge, 可以將上面 XIM_PROGRAM 改以 /usr/bin/scim-bridge 取代即可。上面設定檔有用到 scim-qtimm,若您的程式有用到 qt 的輸入法有問題的話,可以安裝這個套件。

2007/10/09

桌面 Desktop

/usr/share/applications 定義編碼、顯示名稱、Comment(提示)、命令 path、Mime、icon 等屬性, 所以包括 /usr/share/applications/hildon-* 都需要注意。最後你會發現都與 /usr/lib/hildon-* 相關
這個目錄底下如 /usr/share/applications/hildon-marquee /usr/share/applications/inputmethods /usr/share/applications/kde /usr/share/applications/hildon-home /usr/share/applications/hildon-navigator /usr/share/applications/hildon-status-bar /usr/share/applications/hildon-control-panel /usr/share/applications/screensavers 等等都會影響「開始」功能表

/usr/share/desktop-directories/ 定義在「開始功能表」看到的目錄,例如 附屬應用程式 美工繪圖 辦公 遊戲 等等

$HOME/.osso 定義上面兩個,其中 hildon-desktop/home-layout.conf 定義 /usr/share/applications/hildon-home/mobile-basic-home.desktop

而 menus/applications.menu 定義 Hildon 的開始功能表項目(目錄),發現它不會捲動,因此項目太多就看不到。

$HOME/.osso/hildon-desktop/home-background.conf 如下:

[Hildon Home]
BackgroundImage=/usr/share/themes/plankton/images/qgn_plat_home_background.png
Red=0
Green=0
Blue=0
Mode=stretched

2007/10/03

Hildon for MID/ubuntu 2

Ubuntu 對 MID 的支援正加快腳步中,今天又有不同的做法啦!

首先,當我的系統升級後,其實已有內建 start-hildon, 不過這個檔要稍微修正,參考底下是我在用的內容,如此一來您就不必管我前一篇文章的作法,直接叫用下面的命令,Ubuntu 是放在 /usr/bin/start-hildon:


#!/bin/bash

Xephyr :1 -host-cursor -screen 800x480x16 -dpi 96 -ac &
sleep 1

PREFIX=/usr

THEME=${PREFIX}/share/themes/plankton
if [ -d ${PREFIX}/share/themes/mobilebasic ]; then
THEME=${PREFIX}/share/themes/mobilebasic
fi

export DISPLAY=:1

export GTK2_RC_FILES=${THEME}/gtk-2.0/gtkrc:${THEME}/gtk-2.0/gtkrc.maemo_af_desktop
export LANG=zh_TW.UTF-8

export $(dbus-launch --exit-with-session)

/usr/lib/libgconf2-4/gconfd-2 &

${PREFIX}/bin/matchbox-window-manager -display ${DISPLAY} \
-theme ${THEME}/matchbox/theme.xml \
-use_titlebar no \
-use_desktop_mode plain \
-use_lowlight no \
-use_cursor yes \
-use_super_modal yes &

${PREFIX}/lib/sapwood/sapwood-server &
${PREFIX}/bin/mas &

exec ${PREFIX}/bin/hildon-desktop



若跟 ubuntu 的比,主要修正的是語系 export LANG=zh_TW.UTF-8 及 mas 是放在 /usr/bin 而非 /usr/sbin

因為每個人的系統可能不一樣,我必須加裝某些套件才比較正常,底下供您參考:
galculator mousepad mobile-player empathy libmas0c2 mas-server mas-utils hildon-theme-layout-4 hildon-theme-plankton hildon-theme-tools

2007/09/28

Hildon for MID/ubuntu




這幾天在看 MID 的東西,相信有興趣的人找一找就會有不少相關的文章,我原本想照著 Hildon 教學做,後來不怎麼順,甘脆就把系統從 ubuntu 7.04 升級成 7.10, 做法很簡單:

  • 假設你的系統是 ubuntu
  • 修改 /etc/apt/sources.list, 將 feisty 改成 gutsy,底下是我在用的內容,僅供參考:
    deb http://debian.linux.org.tw/ubuntu/ gutsy main universe multiverse restricted
    deb-src http://debian.linux.org.tw/ubuntu/ gutsy restricted main multiverse universe

    deb http://debian.linux.org.tw/ubuntu/ gutsy-updates main restricted
    deb-src http://debian.linux.org.tw/ubuntu/ gutsy-updates main restricted

    deb http://debian.linux.org.tw/ubuntu/ gutsy-security main restricted
    deb-src http://debian.linux.org.tw/ubuntu/ gutsy-security restricted main multiverse universe #Added by software-properties
    deb http://debian.linux.org.tw/ubuntu/ gutsy-security universe
    deb http://debian.linux.org.tw/ubuntu/ gutsy-security multiverse

    確保檔案裡至少有那份教學文件裡的 deb http://archive.ubuntu.com/ubuntu/ gutsy main restricted universe
  • 以 root 或 sudo 執行 apt-get update; apt-get dist-upgrade
    這一步要做很久很久,尤其你的網路若不夠快的話
  • 安裝 ubuntu-mobile, xserver-xephyr
  • 以 root 或 sudo 執行 printf '#!/bin/sh\nexit 101' > /usr/sbin/policy-rc.d ; chmod 755 /usr/sbin/policy-rc.d
  • 切換使用者成 ume 或以 ume 登入 sudo adduser ume
  • 接下來要兩個視窗,一個執行 X(就是你的工作帳號即可), 一個以 ume 的身份執行 hildon,先說說前者:
    Xephyr :1 -host-cursor -screen 800x480x16 -dpi 96 -ac

  • 開另一視窗執行 su - ume
  • 以該身份建立一個檔 start-hildon 並執行它,如此一來會看到前一視窗開啟的 X 出現 Hildon 畫面, 可以 chmod +x start-hildon:

    #!/bin/bash

    PREFIX=/usr
    THEME=${PREFIX}/share/themes/plankton

    export DISPLAY=:1

    export GTK2_RC_FILES=${THEME}/gtk-2.0/gtkrc:${THEME}/gtk-2.0/gtkrc.maemo_af_desktop
    export LANG=en_GB.UTF-8
    export LC_ALL=en_GB.UTF-8
    export LANGUAGE=en_GB.UTF-8

    exec /usr/lib/libgconf2-4/gconfd-2 &

    exec ${PREFIX}/bin/matchbox-window-manager -display ${DISPLAY} \
    -theme ${THEME}/matchbox/theme.xml \
    -use_titlebar yes \
    -use_desktop_mode plain \
    -use_lowlight no \
    -use_cursor yes \
    -use_super_modal yes &

    exec ${PREFIX}/lib/sapwood/sapwood-server &

    exec ${PREFIX}/bin/hildon-desktop
  • 2007/09/07

    Install STLinux in Ubuntu 7.0.4

    這篇純粹寫給我自己看的,還在驗證當中:

    首先當然是下載 STLinux, 下載 http://ftp.stlinux.com/pub/stlinux/2.2/iso/STLinux-2.2-sh4.iso, 或下載 source packages http://ftp.stlinux.com/pub/stlinux/2.2/iso/STLinux-2.2-source.iso,

    接下來要安裝 rpm, 然後要匯入 gpg_key(註:也可以先下載):
    rpm --import http://ftp.stlinux.com/pub/stlinux/2.2/STLinux/gpg_key

    rpm -Uhv --ignorearch --nodeps --force `/bin/ls *.rpm | sed -e /busybox-links/d`

    2007/08/30

    try new ubuntu 試試新的ubuntu

    Ubuntu 確實頗受歡迎,因此這邊介紹一下怎麼把玩 ubuntu

    首先,你必須先去下載 image file, 直接從這兒下載的話會有每日最新的,若從 ubuntu 首頁或ubuntu taiwan 下載的話,會是正式釋出版,通常較穩定。

    接下來想當然爾,可以將之燒錄在光碟片中,這一點我不多說,燒完直接開機試用。
    還有一種方法,就是用qemu(還有 kvm 等虛擬技術,不在此討論)來模擬光碟開機,但是這並非本文要談的。

    另外一種方法是,將 iso 檔掛起來: mkdir -p iso; mount xxxx.iso iso -o loop,將 kernel, initrd, filesystem 複製到硬碟: cp -a iso/casper /,最後就是修改 /boot/grub/menu.lst, 底下僅供參考:


    title Ubuntu, cdrom gutsy
    root (hd0,3)
    kernel /casper/vmlinuz boot=casper root=UUID=0627a896-4ecc-43b6-8b15-f36221aa11c6 resume=/dev/sda3 ro quiet splash
    initrd /casper/initrd.gz
    quiet
    savedefault


    上面 root (hd0,3) 是因為我的硬碟分割是第四塊,最好請參考你現有 /boot/menu.lst 來修改,可以複製目前開機(通常是第一個title)的來用。而 kernel 選項中有幾點要說:
    1. root=UUID 那個每個人都會不一樣,不能照抄,以我的例子來說,也可以改成 root=/dev/sda4。這一點前面有說,我的硬碟使用的是第四個分割區,若您是第一個分割區的話,那就是 root=/dev/sda1
    2. boot=casper 這一個是不可或缺的,它會設定 /casper/initrd.gz 裡的init 讀進/casper/filesystem.squashfs 當 root filesystem,否則你將會又用回原來的分割區當 root filesystem
    3. resume=/dev/sda3 那項純粹是用來讓系統可以「休眠」用的,你可以省略,若你想休眠的話可以參考著用,/dev/sda3 必須是 swap 分割區,其實也可以指定檔案,不過不在此討論。

    這邊討論的方式其實可以讓你有機會自己修改這個 squashfs 檔,直到滿意再來燒成光碟或其他後續處理,請參考 KNOPPIX remaster

    2007/08/08

    雙方合作多版本 如何更新軟體 how to update your software version in multi partners

    我們在與 chip 廠商合作開發產品時,有個軟體更新流程提供參考:

    現狀:
    1. Chip 開發其 demo board 的軟體,使其接近 turn key。軟體版本以 Vo 代表
    2. 敝公司將修改 GUI 後的軟體 porting 上去,軟體版本以 Vo' 代表,也就是我們新增部份是 (Vo'-Vo)
    3. 當我們測試產品有非 GUI 相關 bug 時,會請 chip 商修改,其軟體版本以 Vn 代表,回到 步驟 1. 2. 以便產生 Vn'

    這邊提兩個 porting 的方式,其中 Vn 是 Chip 商提供的新版,Vo 是 Chip 商提供的舊版,而 Vn' 是我們 porting 欲Porting 至 Vn 後的新版,Vo' 是我們 Porting 至 Vo 後的舊版

    1. Vn' = Vn + (Vo' - Vo) : 將兩個舊版比對差異後 porting 到 Vn

    2. Vn' = (Vn - Vo) + Vo' : 將 Chip 商新舊版比對差異後 Porting 到 Vo'
    以上兩個作法乍看之下效果是相同的,但是我這邊得花點時間來檢視其間的差異:

    1. 當初期自行修改的 code 較少時,Vo'-Vo 的值會較小,看起來前者較優。相反的,初期 Vn - Vo 的值應該較大,不利於 Porting 到 Vo'。因此可以判定說:當 Chip 提供的 code 變異性很大時或我們新創的 GUI 方面的 code 較少時,採用前者較有利

    2. 但是通常上面的情形比較不會發生,原因是 Chip 商提供的 code 通常一開始就已經相對龐大,或者說在後期通常只是針對 bug 在修正。在此情形下,若我們發現 (Vo' - Vo) > (Vn - Vo) 時,應該採後面的作法。

    3. 另外一種考量其實無關兩個差值,我只想說,只有採行第二種作法才是正確的方式。
      1. 讓我們看看前者,當採用 (Vo'-Vo) 時,會給我們一種錯覺,認為這樣的差值我們最熟,最容易控制,加上當初就是這樣開發自己的 code for GUI,採用前者的作法似乎較受歡迎。

      2. 但是正如我說這是錯覺,其原因是你把假設建立在 Vn 一定是對的上面。若 Vo --> Vn 的發行是因為要修正 bug, 那很顯然 Vo 已經不對,而且也不保證 Vn - Vo 真的只修改到 bug 的部份。會不會有邊際效應?或者說會不會因為團隊開發使得 Vn 跟 Vo 做的變動你根本無法預期?

      3. 這邊要說的其實是,Vo' 是我們最熟的部份,也是我們知道 bug 在哪的狀態,那麼為何不是透過 (Vn-Vo) 來挑出 Chip 商到底做了哪些修正?再將這些修正挑選適合的移植到 Vo' 上?也就是說,其實我們得修正上面後者的公式為:

        Vn' = (Vn - Vo)' + Vo'

        值得注意的是,第一種作法是無法這樣修正的。