跟我熟的一向知道我愛 Open Source 的東西,也一直非常喜歡 Mozilla/Firefox, 因此特別介紹一個好東西,Mozilla 在 Mobile 裝置上的移植性探討,而在 DirectFB 上的移植上有提到「先前的工作」裡的網址,竟然是我一直以為沒被更新的資料,原來搬到這兒了,看來還是得投身原始站才是王道。
不過這不是我要說的,我曾在敝公司提到在裝置內採用 Webkit 而非 Opera, 結果引來該單位負責人(官位不小)說「用 Open Source」的東西都不完整也沒保障,我知道他們對 Opera 比較熟,只是想說丟個訊息出來大家討論,聽到這樣的話,我打從心裡敗給他們,因為人微言輕,不想多作辯論,只希望他們的案子能進行順利些。
做完 SVG Editor 後,再來好好研究一下 Mozilla over DFB, 有看到這篇的人願意的話也請把心得與我分享。
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。
接下來要來寫 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 是解壓後執行,用來真正安裝檔案。
先把整個目錄結構介紹一下:
整個過程其目的是將 payload/files.tar 中被壓縮的檔案安裝到其他機器的系統中,目前該檔只有二個檔如下:
build 這個檔用來將 decompress 及 payload/ 包裝成自解壓的檔,而 decompress 是整個自解壓檔的「頭部」, payload 則是尾部,中間以 __ARCHIVE_BELOW__ 連接。所以這邊有三個 script file, 一個是安裝用的 installer, 一個是解壓用的 decompress, 一個是用來建立自解壓安裝檔用的 build,這三個檔的內容如下:
build:
decompress:
installer:
特別強調一下,這個 installer 應視需要自行修改,執行畫面如下:
包裝成自解壓檔:
執行 selfextract.bsx:
一般利用 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 ,因此就以該文為範例。
上面的例子裡面,雖然函數(物件)命名為 MyClass, 但是基本上,Javascript 裡面對 Class, Object, Instance 的區分並不是非常嚴謹,只能在使用時來判斷它。譬如就上例而言,似乎 var c = new MyClass() 是產生一個 instance, 例是這個 MyClass 確實也是個函數,可以直接呼叫!不過只要想成呼叫時,也等於偷偷 new MyClass() 也行,或是說,其實背後,全都是 Object,那可能就不會太奇怪了。舉例:
上例的結果會出現兩次 alert, 想來也就順理成章了。若將最後兩行直接改成:
MyClass(); 這樣呼叫函數,嘿嘿,也說得通不是?至於 this 的用法應該不必多說吧?
這例子把 MyClass() 的「屬性」顯示出來,原來是在外面存取屬性,改成增加「方法」 showData() 的方式。這範例主要在講方法,即 showData() 的定義方式,及其引用本身物件(類別?)內屬性的方法。
不過,這例子其實是很不好的示範,自己顯示自己常常會牽涉到 GUI 的議題,最好是交由「外面」模組來實作,也就是提供 getData() 取代 showData()
接下來講講封裝。Javascript 並沒有真正良好的封裝,譬如什麼 public, private, 什麼的一堆有的沒的,當然有好有壞,反正嘛,彈性太大是會有問題,但是只要你會用,易用,易除錯,彈性帶來的好處也不小。
這邊真正示範了將 MyClass() 當成類別的作法,不止有屬性也有方法,自行研究研究。不同的物件(c1, c2)因為透過 setData() 而改變其屬性。事實上也可以寫類似 constructor 的方式。
這個例子先是展示了繼承,Dog 繼承了 Animial 的 say() 方法及 name 屬性, 這些繼承能力是透過 Animal.call(this, name); 再加上 Dog.prototype = new Animal(); 來完成的。這也透露出一件訊息,就是前面講 Javascript 是 prototype based 這件事,但是若對 OO 敏感的人也可以看出來,Function 在此處就表現了它自身是 Object 的概念。
而後面第二次的 say() 展現了跟先前 setData() 同樣的功效,只是這次是用在繼承上。
接下來看看多型,不過減省版面下,請將下面的碼直接接在上例的後面,當然要把上例後面四行拿掉再加上去也是不錯的作法:
Dog 的 say() 方法其實是用新的覆蓋掉 Animal 的,而 Cat 的 say() 方法,則是用繼承的作法。意思是,Cat, Dog 的 say() 其實已經與原來的 Animal 有不同意見了。
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 有不同意見了。
標籤:
javascript,
OOP
觸控面板與手寫輸入 windows programming
這幾天的研究,主要就是要看看標題所寫的問題要怎麼做,主要是針對 windows XP/Vista.
- 呼叫輸入法
- 範例
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一文中有說明。 - 自行呼叫應用程式
Vista 下的手寫板是獨立應用程式,名稱叫 TabTip.exe, 可自行呼叫
ShellExecute(GetParent()->m_hWnd, NULL, "TabTip.exe", NULL, NULL, SW_SHOWNORMAL);
- 範例
- 自行開發
- 可透過 InkEdit, InkPicture 等自訂手寫輸入外觀 ,可參考
- http://msdn.microsoft.com/zh-cn/library/ms812487.aspx
- 欲進行細部自訂請參考
- http://msdn.microsoft.com/zh-tw/library/system.windows.ink.aspx
- http://msdn.microsoft.com/zh-tw/library/system.windows.ink.inkanalyzer.aspx 用來分析手寫板
- http://msdn.microsoft.com/zh-tw/library/system.windows.ink.inkrecognizer.aspx 用於識別,由 InkAnylyzer 用於識別
- http://msdn.microsoft.com/zh-tw/library/system.windows.ink.gesturerecognizer.aspx 這似乎只在 Vista 下能用
- http://msdn.microsoft.com/zh-tw/library/microsoft.ink.textinput(VS.85).aspx 用於手寫板識別後的文字取得
- 可透過 InkEdit, InkPicture 等自訂手寫輸入外觀 ,可參考
- XP 的支援
http://www.microsoft.com/downloads/details.aspx?familyid=84bbefa4-7047-41df-8583-e3bdbf9d805f&displaylang=en - 參考書
- 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
- Building Tablet PC Applications
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 滑鼠怎麼辦?
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 也有。
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,甚至還有驅動程式。而這些組成不見得都很好的整合過,以符合更佳的操作習慣。
解決方案:由「開源軟體」供應商居中協調跨組件工作。
原文寫的有點長,英文超過我的能力,因此我翻譯起來也相當辛苦,也正因為如此我才更需要試著去翻譯,若有錯誤請不吝指正。(註,錯誤是不小心的,漏掉是故意的)
開源碼軟體的開發者大部份都是志願者,這本身雖然是好事情卻也造成兩個明顯的問題:
一、沒動機去改善使用性。這其實是相對的,商用軟體本來就是要賣給使用者,若是你操作感太差怎麼可能賣得掉?可是開源碼軟體不一樣,通常撰寫者自己用居多,另一方面用於學習的功能也佔不少比例,加上用戶數也少,得到的回饋相對上少(但絕非主因),最重要的,作者通常懶得去強調。
解決方案:應該由政府鼓勵或舉辦設計大賽,不見得要新創軟體,還要鼓勵優良軟體的改善。廠商愈來愈多使用開源碼,也應該回饋到開源社群或建立適當的社群。
二、良好的設計師不多。雖然有音樂家本身也是作曲家,但是絕大多數都不是。一個好的程式設計師要兼顧著當良好的介面設計師是很難找的。
解決方案:建全開源碼社群的組織,讓使用介面設計師、優秀的測試師等都能加入,甚至更應該鼓勵使用者回饋其使用心得與建議。也就是在社群建立良好的開發者、設計師、測試、終端使用者間良好的互動。
為什麼優秀的設計師無法浮到檯面呢?
三、建議通常變成「歡迎自行補丁」。開源碼的一個現象就是,你有想法,請自行實現。建議很難被開發者擺入他們的心中。
解決方案:同樣的在社群活動中,應鼓勵這樣的行為,開發者應該把其他人的建議擺在第一位,而不是照自己的想法開發應用程式。當然,一個良好的 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這篇有提到,我就翻譯成中文與大家分享。
- 特別需要考量資源時,例如執行速度,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
?(pattern-list) 匹配零個或一個
*(pattern-list) 匹配零個或多個
+(pattern-list) 匹配一個或多個
@(pattern-list) 剛好一個匹配
!(pattern-list) 匹配除指定模式以外的任何字符
我是不太常用,這邊所提的內容您也可以搭配 grep 來達成。假設,我不想要 a開頭的所有檔,可以這麼寫:
$ shopt -s extglob
$ ls !(a*)
第一行只是要打開 extglob, 只需要做過一次即可。若想關掉,可以用 shopt -u extglob
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)
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 會自動有效的放大,適應將來更多核心的硬體環境。
多核心除了硬體能力外,作業系統以至於程式語言的支援都很重要,使用 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, 或許不是,文中提到難道不能跟真正的電腦連結,只是把血壓、呼吸資訊傳入電腦處理,讓裝置只是簡單的感應器,這樣或許可以降低成本,但是使用上應該不怎麼方便才是。
我在思考的,很多人也想過,怎樣創造多贏策略,也就是設計商、生產製造商、代理商、品牌商(客戶)、用戶等等的,或許這麼講野心太大。
設計商當然要專利保護,生產製造商當然要高利潤,代理商、通路商、或品牌商(客戶)當然要高單價銷路好,而用戶,卻又希望單價低又實用。嵌入廣告或許不失一個辦法,看似不怎麼實際,卻也充滿機會。當然我心中還有其他話要說啦,只是想透過圖來表達,有機會再貼上來。
本文參考自這裡,是個值得深思的問題。
醫療器材,常常需要隨身攜帶,尤其在人類社會愈來愈老化的現在,醫療體系的支持非常重要,文中提到的小裝置,用來指引人透過控制呼吸來讓血壓下降,要價 300 美金,成本或許不到 20 元,其中的原因可能只是「專利」。
專利或許是最根本的原因,但是另一個原因在於利潤--市場因素。或許隨身裝置似乎都是個 SoC, 或許不是,文中提到難道不能跟真正的電腦連結,只是把血壓、呼吸資訊傳入電腦處理,讓裝置只是簡單的感應器,這樣或許可以降低成本,但是使用上應該不怎麼方便才是。
我在思考的,很多人也想過,怎樣創造多贏策略,也就是設計商、生產製造商、代理商、品牌商(客戶)、用戶等等的,或許這麼講野心太大。
設計商當然要專利保護,生產製造商當然要高利潤,代理商、通路商、或品牌商(客戶)當然要高單價銷路好,而用戶,卻又希望單價低又實用。嵌入廣告或許不失一個辦法,看似不怎麼實際,卻也充滿機會。當然我心中還有其他話要說啦,只是想透過圖來表達,有機會再貼上來。
標籤:
heath care
2008/07/22
communication
skype developer算是很特別的東西,跟 skype 通訊竟然是用純文字。
最近在思考「溝通」這件事,人類與裝置的互動還停留在原始的狀態,雖然已經有語音輸入,也有觸控,也有手勢辨識,可是感覺都還停留在不怎麼實用的階段。你的裝置要怎樣與別人不一樣?或許,「溝通」就是非常急需去思考與面對的課題。
最近在思考「溝通」這件事,人類與裝置的互動還停留在原始的狀態,雖然已經有語音輸入,也有觸控,也有手勢辨識,可是感覺都還停留在不怎麼實用的階段。你的裝置要怎樣與別人不一樣?或許,「溝通」就是非常急需去思考與面對的課題。
標籤:
communication,
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 就可以看到一堆,新聞也是,對有興趣的標題再點進去讀,方便的很。
標籤:
google,
RSS reader
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 加上「今天」的日期。也可以計算屬性之類的。有新的想法再來跟大家分享。
我是懶得再寫像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 有幫助?
當然還有更多改善,感覺對硬體的支援增加非常多,請自行看文章吧
先從後面那篇寫起,因為比較短。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 運作速度,不再關心記憶體大小時,下一個關心的目標會是什麼?
她說是螢幕,我個人一直認為是輸入法,輸入裝置,貼近人類思想的輸入裝置。
在看這篇文章時,讓我想起一個很久以前想過的問題,「人類,還會再進化嗎?至少,在腦袋上,還有進化的空間嗎?」這問題問過的人不少,有人提出外星人是人類進化的樣本,我不知道。
電腦的發展,效能似乎不是最受人關心的,網際網路的發展,訊息的取得似乎不再是人們感興趣的,接下來呢?有人提出情感的媒介與交流。似乎,回歸更人性化才是發展的趨勢,我在想,人類,或許已經是發展的顛峰,剩下的問題是如何與大自然相處吧?如何與其他人更好的相處或許才是進化的未來趨勢。
我喜歡一個理論,叫蓋婭,相信人類要更好的往下走,勢必更好好思考這理論才是。
她說是螢幕,我個人一直認為是輸入法,輸入裝置,貼近人類思想的輸入裝置。
在看這篇文章時,讓我想起一個很久以前想過的問題,「人類,還會再進化嗎?至少,在腦袋上,還有進化的空間嗎?」這問題問過的人不少,有人提出外星人是人類進化的樣本,我不知道。
電腦的發展,效能似乎不是最受人關心的,網際網路的發展,訊息的取得似乎不再是人們感興趣的,接下來呢?有人提出情感的媒介與交流。似乎,回歸更人性化才是發展的趨勢,我在想,人類,或許已經是發展的顛峰,剩下的問題是如何與大自然相處吧?如何與其他人更好的相處或許才是進化的未來趨勢。
我喜歡一個理論,叫蓋婭,相信人類要更好的往下走,勢必更好好思考這理論才是。
訂閱:
文章 (Atom)