2008年1月30日

Microsoft Windows 2000 支援 遠端桌面!?



各位不用懷疑,這真的是Windows 2000,也真的是用「遠端桌面」的連線程式連接的。
win2k真的支援remote desktop!?

好吧~這其實算是一個小玩笑,這答案說是~也對,說不是~也對!
看看下張圖片吧~稍微仔細一點點看,比較有經驗的就可以看出端倪了:


耶~為什麼遠端桌面這麼厲害,可以看到開機裝置選擇的畫面?

沒有拉~其實這是VirtualBox提供的遠端控制功能,VirtualBox大部分的人都是直接執行他的管理視窗,透過管理視窗啟動虛擬機器,但是VirtualBox其實可以用指令的方式執行,而且也提供所謂的「VRDP模式」,使用了VRDP模式之後,整個虛擬機器只會執行在背景,要操作、控制則透過Windows的「遠端桌面連線」就可以了。
所以上面的圖片的確是Windows 2000沒錯,也的確是透過遠端桌面連線的,但是提供遠端桌面功能的不是Windows 2000,而是VirtualBox,Windows 2000只是跑在虛擬機器上。
這算是剛剛研究的小心得,覺得有趣就po上來給大家開開眼界,下次看看有閒工夫,來把我知道的VirtualBox指令功能列出來。
其實VirtualBox的指令功能很強大,甚至超越了GUI介面提供的功能,但因為是指令,相當的複雜,我個人來說,每次要使用,都要查才會用,就操作便利性來說~~~0分!

2008年1月29日

將aMule的ed2k關聯到Firefox~遠距版

這標題下的不好,但我想不大出來有什麼比較適合的標題。

要解決的情況是這樣:
A電腦(Debian)-執行aMule
B電腦(Ubuntu)-執行Firefox,點選ed2k連結

B電腦上透過Firefox點選ed2k連結後,要下載的檔案會直接加入到A電腦上的aMule列表當中。

這樣的情況為什麼會出現?
BT、eMule不管怎麼說,就是會不斷的操作磁碟和網路讀寫,不論網路如何爭論,我個人的使用情況是,他會讓電腦變慢,尤其是2個一起開的時候,因此衍生出了把BT、eMule放到獨立電腦的想法,也就是現在大家俗稱的「寵物機」。

「寵物機」方便歸方便,可是對於遠端操作一直有些便利性的問題,我一直以來都是用VNC(現在用NX)這類遠端桌面程式在操作Linux,管理BT和aMule。
現在桌機(B電腦)換成Ubuntu了,有沒有什麼方法可以把ed2k的連結直接關聯到桌機(B電腦)的Firefox,卻可以直接加入到(A電腦)的aMule列表中呢?

隨便搜尋都可以找到有許多人在教如何讓Firefox能關聯aMule的ed2k,方法簡單說就是加入下面2行到about:config當中:

network.protocol-handler.external.ed2k 設為正負值(Boolean)true
network.protocol-handler.app.ed2k 設為字串(String)/usr/bin/ed2k


因此可以發現,只需要執行
ed2k ed2k://ooxxooxxooxxooxx/

這樣的語法,就能夠把ed2k連結加入到aMule列表中了~

可是因為aMule不是執行在桌機(B電腦),因此會執行無效,他會說找不到aMule的設定檔,接著我們進一步看看ed2k的說明:
aMule ED2k link parser v1.4.0

Usage:
--help, -h Prints this help.
--config-dir, -c Specifies the aMule configuration directory.
--version, -v Displays version info.

magnet:? Causes the file to be queued for download.
ed2k://|file| Causes the file to be queued for download.
ed2k://|server| Causes the server to be listed or updated.
ed2k://|serverlist| Causes aMule to update the current serverlist.

--emulecollection, -e Loads all links of an emulecollection

*** NOTE: Option order is important! ***


原來ed2k需要aMule的設定檔才能動作,因此我們簡單的把A電腦的HOME目錄連線過來,連線的方式可以是NFS或Samba,只要能讓ed2k知道aMule設定檔目錄在那即可~

以我來說,我把A電腦的/home/ycfu分享出來,桌機(B電腦)則連上並mount到/media/ycfu,因此前面的ed2k指令改輸入為:
ed2k -c /media/ycfu/.aMule ed2k://ooxxooxxooxxooxx/

就能夠成功加入下載了~
(另一個方法是使用ssh遠端執行,方法簡單說一下帶過去,執行如下即可:
ssh A電腦IP /usr/local/amule/bin/ed2k ed2k://ooxxooxxooxxooxx/

這種作法需搭配公私鑰的設定,不然會詢問密碼,不提的原因是,無法整合到Firefox的關聯中)

雖然前面提到用
ed2k -c /media/ycfu/.aMule ed2k://ooxxooxxooxxooxx/

可以成功,但是卻無法整合到Firefox的關聯,Firefox的關聯設定中,似乎只接受執行檔,不接受參數的設定,因此,我們需要簡單的修改ed2k的Source Code,來依需要修改。

下載和電腦相同版本的amule source code,然後用
grep -R "Specifies the aMule configuration directory." *

直接找出ed2k的程式碼所在位置,找到程式碼是
amule-cvs/src/ED2KLinkParser.cpp

直接進入後,找到
.....
if ( arg.substr( 0, 8 ) == "ed2k://|" ) {
// Ensure the URI is valid
if ( arg.at( arg.length() - 1 ) != '/' ) {
arg += '/';
}

string type = arg.substr( 8, arg.find( '|', 9 ) - 8 );

if ( (type == "file") && checkFileLink( arg ) ) {
writeLink( arg, config_path );
} else if ( (type == "server") && checkServerLink( arg ) ) {
writeLink( arg, config_path );
} else if ( (type == "serverlist") && checkServerListLink( arg ) ) {
writeLink( arg, config_path );
} else {
std::cout << "Unknown or invalid link-type:\n\t" << arg << std::endl;
errors = true;
}
} else if (arg == "-c" || arg == "--config-dir") {
if (i < argc - 1) {
config_path = argv[++i];
} else {
std::cerr << "Missing mandatory argument for " << arg << std::endl;
errors = true;
}
} else if (arg.substr(0, 2) == "-c") {
config_path = arg.substr(2);

} else if (arg.substr(0, 13) == "--config-dir=") {
config_path = arg.substr(13);
} else if (arg == "-h" || arg == "--help") {
std::cout << getVersion()
<< "\n\n"
<< "Usage:\n"
<< " --help, -h Prints this help.\n"
<< " --config-dir, -c Specifies the aMule configuration directory.\n"
<< " --version, -v Displays version info.\n\n"
<< " magnet:?Causes the file to be queued for download.\n"
<< " ed2k://|file| Causes the file to be queued for download.\n"
<< " ed2k://|server| Causes the server to be listed or updated.\n"
<< " ed2k://|serverlist| Causes aMule to update the current serverlist.\n\n"
<< " --emulecollection, -e Loads all links of an emulecollection\n\n"
<< "*** NOTE: Option order is important! ***\n"
<< std::endl;
.....


注意看紅字,原來aMule設定檔路徑是用變數config_path來設定的,接下來就簡單啦~

在整段IF的最前面加上
config_path="/media/ycfu/.aMule";

如下:
.....
config_path="/media/ycfu/.aMule";
if ( arg.substr( 0, 8 ) == "ed2k://|" ) {
// Ensure the URI is valid
if ( arg.at( arg.length() - 1 ) != '/' ) {
arg += '/';
}

string type = arg.substr( 8, arg.find( '|', 9 ) - 8 );

if ( (type == "file") && checkFileLink( arg ) ) {
writeLink( arg, config_path );
} else if ( (type == "server") && checkServerLink( arg ) ) {
writeLink( arg, config_path );
} else if ( (type == "serverlist") && checkServerListLink( arg ) ) {
writeLink( arg, config_path );
} else {
std::cout << "Unknown or invalid link-type:\n\t" << arg << std::endl;
errors = true;
}
} else if (arg == "-c" || arg == "--config-dir") {
if (i < argc - 1) {
config_path = argv[++i];
} else {
std::cerr << "Missing mandatory argument for " << arg << std::endl;
errors = true;
}
} else if (arg.substr(0, 2) == "-c") {
config_path = arg.substr(2);
} else if (arg.substr(0, 13) == "--config-dir=") {
config_path = arg.substr(13);
} else if (arg == "-h" || arg == "--help") {
std::cout << getVersion()
<< "\n\n"
<< "Usage:\n"
<< " --help, -h Prints this help.\n"
<< " --config-dir, -c Specifies the aMule configuration directory.\n"
<< " --version, -v Displays version info.\n\n"
<< " magnet:?Causes the file to be queued for download.\n"
<< " ed2k://|file| Causes the file to be queued for download.\n"
<< " ed2k://|server| Causes the server to be listed or updated.\n"
<< " ed2k://|serverlist| Causes aMule to update the current serverlist.\n\n"
<< " --emulecollection, -e Loads all links of an emulecollection\n\n"
<< "*** NOTE: Option order is important! ***\n"
<< std::endl;
.....


之後執行
./configure && make

然後把amule-cvs/src/ed2k複製出來,放到桌機(B電腦)上,以我前面的設定來說,儲存成/usr/bin/ed2k即可~

2008年1月28日

Java與c#,誰好誰壞?

今天被同學問了這樣一個問題,「假如有個程式語言的新手想學物件導向的語言,Java和c#選哪個比較好?」又問「Java好,好在哪?」

我基本上算是學Java的人,在7~8年前時,當時玩DNS、防火牆、NAT、Apache...等網路的東西,可是漸漸發現一個問題,我沒有寫程式的能力,沒辦法根據自己需要來寫工具,因此我當時希望學習一套程式語言來作為寫工具的武器。
當時正好是php/Flash/Java熱門的時候,在用php和Flash開發時,發現php3+Flash4有不足的地方,加上前面希望學套程式語言的理由,我在C和Java間抉擇,最後很自然的選了Java。
原因有幾個:
1.Java可以寫Java Applet,補足php+Flash的不足(現在Flash本身就強到爆了...)
2.我當時已經用FreeBSD一段時間了(2,3年了),我希望能在FreeBSD/Linux/Windows下都能寫程式
3.當時Java比較熱門,且號稱完全物件導向,和VB根本不能比
4.Java的特色中說,它的門檻介於VB和C之間,比較容易入門

因為這幾個原因,我開始學習Java,到現在雖然Java沒學很熟,寫的還是破破爛爛的,但總歸是我目前比較熟悉的語言。

c#是近年M$推的很大力的程式語言,它在Java後很多年推出,它許多特色跟Java相同,而且積極的要吸收Java的程式設計師,同時又「強烈建議」VB的程式設計師轉用c#。
目前看起來成果相當不錯,憑藉著M$高人一等的行銷和規劃,c#的確有相當大的一塊市場。

回到問題,那到底Java和c#要選誰來學呢?
我的回答會是,看你有沒有用Linux/FreeBSD/Sun...等Unix的需要,如果有,學Java比較好,因為Java可以跨大部分主流的PC平台作業系統。
如果你只會用Windows,也只會在Windows上開發程式,你根本沒碰過Linux,或者裝過一次之後發現那東西根本難用的像垃圾,那麼...學c#吧~
和c#相比,Java其實有許多缺點:
1.Java的效能真的比較差,和c#相比感覺還好,但如果和C/C++...等相比,它效能真的比較差
這沒什麼好說的,經過VM執行的程式效率就是會比較差,c#也有VM,所以兩者差異比較小,但c#有平台優勢,因此整體來說,我相信c#效率會比較好,至於C/C++,根本沒VM,又都是編譯式語言,根本不用比了

2.Java沒有很強大的瀏覽器元件
Java上的瀏覽器元件,怎麼看就只有Swing Editor,找到翻天也找不到好用的瀏覽器元件,只有一個例外,那就是SWT的Mozilla元件,但Java本身附的是Swing,換到SWT,光要找SWT的安裝就找半天(dll+jar的設定),整個SWT語法和Swing完全不同,要重學,如果只因為瀏覽器元件要用SWT,在Swing和SWT混合使用的情況時,會有輕量化物件和重量級物件互相干擾的問題,而且不好解決。
而這在c#上,你可以自由自在的使用IE的元件,儘管它漏洞多、容易中毒、效能差,但不可否認的是,他在目前有全世界最好網頁相容性(被M$壟斷的結果)和最好的支援性(ActiveX)。

3.Java沒有很強大的媒體播放元件
Java上的媒體播放元件,以Sun提供的來說,就是JMF(Java Media Framework),這東西用過的都知道,它是個垃圾。本身設計複雜、難用不說,一堆功能統通都沒有,得要自己寫,更殘忍的是,它基本上只支援極少數的影音編碼(Codec),常見的xvid、DivX、MPEG4、H.264...等格式,統統都不支援。
而這在c#上,你可以使用Media Player SDK,呼叫了Media Player SDK之後,就跟常見的MPC(Media Player Classic)一樣,你可以透過安裝各種編碼包(Codec Package)來支援各種影音格式。

4.Java的IDE並不好用
Java上幾套主流的IDE,像是NetBeans、JBuilder、Eclipse,基本上沒有Visual Studio好用,Visual Studio所見即所得的設計非常好,Eclipse本身沒有辦法拖拉元件來設計GUI,需要另外裝外掛,但是這類外掛多半要錢,免費的不很好用(我記得我是用JVisual...不知道有沒有記錯)。NetBeans是我覺得GUI比較好用的,但是它跑起來很慢,吃得記憶體又大。
JBuilder我完全不會用..... = =||

5.Java的第三方物件庫比較少,尤其是跟比較硬體的呼叫,根本沒有
Java的物件庫比較少,尤其是和C/C++相比,少了很多,和硬體有關的幾乎沒有,舉個簡單的例子,我如果希望寫個程式,這程式可以退出光碟機托盤,這就不容易辦不到了。再提個例子,我希望取得系統中檔案的Owner、權限,這也不大容易辦到。
而在c#,因為沒有跨平台的壓力,c#可以呼叫比較硬體的功能,儘管它不建議,但是是可以的。
但在Java上,受限跨平台的因素,因此這對Java來說,就不容易了。

這樣看起來,Java根本一無是處阿~總有優點吧!?
Java最大的優點有2個,跨平台和物件導向。
先說物件導向吧~
我一直不了解物件導向到底好用在哪裡,直到我學弟跟我說了之後,我才了解~
物件導向的程式語言有個特色,它的程式碼會比較容易看懂,因為不管怎麼變,它都是按照物件導向的概念在寫的,所以只要抓到繼承關係,要看懂程式碼是比較容易的。
Java的物件導向其實比較傳統,傳統的同義字差不多可以說是沒什麼彈性,我同學在學c#的物件導向,聽它敘述之後才知道,c#有很多Java沒有的物件用法,方便是滿方便的,可是不可否認,整個程式碼會變得比較複雜難懂些。
所以相比起來,我認為Java的物件導向是比較好的,畢竟有彈性未必是好事,一方面不一定會去用,用了之後,看得人就很辛苦了。

另一個Java的優勢是跨平台,也許會說,這有什麼大不了的,前面這麼多缺點,一個優點也想打平所有缺點嗎?
結果似乎真的是這樣~
一個只會寫Windows程式,只會用Visual Studio的人,很難了解「跨平台」這件事情的難度,我曾經聽過個事情,在3~4年前,Linux正好開始熱起來,我朋友告訴我一個有趣的事,它公司一個新來的程式設計師被老闆要求把公司的程式移植到Linux上跑,公司的程式是用VB(還是VC...忘了)寫的,那位可憐的新人如果能做到這樣的事情,它就不會到那家公司去了,它可以去告好的公司工作了..... = =||
一般當進一步被問到跨平台的差異時,討論區的高手往往都會說一句「作業系統架構不同」來打死所有人的回答,也打死了問的人,但是什麼叫做「作業系統架構不同」,這很難嗎?
因為最近剛好在學GNU C + GTK,多少能夠有些體會~

首先,Windows和UNIX的發展是平行的,經過了n年之後,它們已經發展出各自的架構出來了,整個系統堆疊出的方塊圖就完全不同,細部更是差異很大。
我們先從小的說起,在UNIX當中,所有Device都被當成一個檔案,然後全部放在/dev目錄下,要呼叫很簡單,直接按照檔案存取的方式來操作Device File,Device就會動了,那像印表機、掃描器之類的,直接read或write之後仍然不會動,是因為中間加入了protocol(通訊協定),因此需要按照通訊協定的方式來read和write。
在Windows裡面,你什麼時候看到過Device File?M$的作法是,針對特定裝置,提供特定的API讓你呼叫使用,你幾乎不需要知道protocol和Device的操作,反正呼叫之後,Windows作業系統就呼叫相對應的元件,頂多跳出系統的視窗來詢問你。
再來,Windows從很久以前就很愛用Registry,一些用電腦多年的人都知道,這裡面藏污納垢,反正系統設定檔、程式設定檔,統統不需要檔案,往裡面丟就對了,容易丟、容易取。
但在UNIX下,基本上沒有這樣的東西,近年GNOME有仿照這樣的形式來設計,但目前用的還沒有很誇張,通常只用在GUI環境,非GUI環境仍舊不用,也多半還是用很醜的設定檔來設定。
光小地方就有這麼大的差異,大地方呢?
Linux、FreeBSD、Sun...等系統,雖然都是UNIX like的系統,但是他們之間仍舊存在差異性,它們的process(程序)設計並不完全一樣,這點到了MacOS上也是,而到了Windows上差異更大,Windows沒有process,只有thread,而全部的系統,在使用process或thread時,呼叫的function不完全一樣,操作方法也不完全一樣。
這種,就是所謂的「作業系統架構不同」,要在不同的作業系統上開發程式,如果要寫到多執行緒,需要參考各作業系統相關的寫法,然後根據不同系統來寫。
再者,Linux...等UNIX like的作業系統,它們用的視窗系統通常是X-win,X-win下面又有視窗管理員(Window Manager)的設計,常聽到的GNOME、KDE就都是Linux下的視窗管理員(Window Manager),各視窗管理員間的API不一樣,因此同樣是寫視窗程式,在UNIX上可能很多套、很多種選擇、寫法。
到了Windows,整個架構又變了,呼叫的API也完全不一樣,寫法、操作差異性更大。

就是因為有這麼大、這麼多的差異性在,因此「跨平台」這三個字才會這麼巨大,讓它的重要性可以補足前面的缺點,事實上前面許多的缺點,根本問題正是「跨平台」所造成的。
這也是為什麼高手跳出來說一句「作業系統架構完全不同」,所有人就得乖乖閉嘴,因為這句話,就是在描述上面寫的一堆東西。
所以Java的神奇在於,它今天利用VM,在所有平台上建構出了相同的執行環境,讓Java程式執行,但問題就在於,VM沒辦法包山包海,比較依賴硬體或作業系統的功能,它做不到,也因為Java程式要透過VM執行,所以執行效率再快,也快不過C/C++這類機器碼的執行效率。
如果感受不深刻的人,尤其長期在Visual Studio下工作的人,試著看看訪間Linux程式設計的書,看看在Linux上寫多執行緒、寫網路程式、寫GUI要怎麼寫?和Visual Studio上的差別有多大?
你就能夠感受到Java的偉大了~

2008年1月17日

Linux我在使用時感覺到的幾個問題

最近家裏的桌機正式改用Linux,重新開機進Win2000的次數已經很少了,基本上以Linux做日常用途已經很能接受了。

我用FreeBSD/Linux的時間其實很長了,算起來從高職2年級開始到現在,有10年了~
回想當時看著「黑皮書」灌FreeBSD 2.2-RELEASE的情景就覺得懷念,當時還很嫩,jdli、woju這些大人物沒一個接觸過,但他們的文件,我們這些初學者,是都會拜讀的,這些人現在都不見了,市面上、網路上看得到的,大概最耳熟能詳的,變成了鳥哥,它的網站幾乎是Linux使用者必去的地方,我個人來說,我覺得拿來查資料很方便,尤其是DNS、防火牆什麼的,忘了就google一樣,上去看看..... :p
一直以來Linux版上的人在推廣Linux時,幾個常見的論調是,Linux沒有Windows這麼多的宣傳,大家用Windows的時間都拿來用Linux的話,一定可以熟悉.....等等。
最近我以Linux當桌機日常使用之後,我深深地感覺到,Linux要和Windows相比,要佔領廣大的個人電腦市場,還需要時間,Linux的確在很多方面,和Windows差太多了~
聽起來Linux好像一無是處,不是的,是Windows在這樣的市場已經很久了,能做的幾乎都做了,沒做的,其他廠商也幫它做完了,Linux要切進來,目前看起來火候還不夠,如果說不太挑剔,用Linux當桌機,馬馬虎虎還可以~
我個人覺得,Linux如果要真正深入桌機,用什麼使用時間長短的屁話,是沒意義的,我覺得Linux like最成功深入桌機市場的,是MacOS.....

我覺得最近在使用Linux時所遇到的最大問題有幾點:
1.Linux的應用程式,缺乏介紹和整理
在Windows上,應用程式就是應用程式,大部分情況之下,要執行應用程式就是下載特定的安裝程式,執行完在程式集點選執行即可。
只有少數情況下,被要求要安裝特定函數庫,才需要安裝特定函式庫,也是以安裝程式的方式安裝。
在Linux上,我們知道有偉大的套件管理系統,負責管理整個系統的所有套件,問題就在這裡。
a.套件管理系統管理的是整個系統的套件,它並沒有區別這個套件是應用程式還是函數庫,只有簡單的被分類,我們大部分情況無法準確的知道到底現在系統裡面安裝了哪些應用程式,因為應用程式和函數庫的套件,完全被混在一起了。
Ubuntu、Fedora因此加入了新增移除程式的功能,但它又太鳥了,該有的一個都沒有,不該有的一堆,大部分教學幾乎都不用它。

b.在Linux上,嚴重缺乏應用程式的介紹、整理,沒有類似toget、軟體王這類的網站,統一介紹各種Linux的應用程式(有沒有人有興趣,我們一起來開這樣的網站吧),這時說回偉大的套件管理系統,套件管理系統儘管有包含一些說明,簡單的敘述套件的功能,但是又回到a提到的,它把函式庫跟應用程式混在一起,根本無法區分哪個是應用程式哪個是函數庫,另外它的說明實在是非常簡短,同一種應用程式可能還有分別(lynx會有lynx-ssl、lynx-i18n...等),我們無法簡單的用「瀏覽器」、「檔案管理程式」....等來搜尋。

2.Linux開發工具缺乏文件
這不是我說的,的確有人說,Linux的GTK開發,像是Windows以前的MFC,一切都要從include檔當中搜尋,然後猜猜看怎麼用,而我認為,這也間接導致了Linux上應用程式欠缺的問題(和Windows相比),用Visual Studio來開發,很直覺就是去MSDN查,甚至IDE介面中就有突顯介面來提示,寫程式便利很多,Linux感覺還停留在很原始的狀態,Java已經很不夠人性化了,和Java相比,文件部份還大輸。
我完全不認為Linux的函數庫缺乏,我甚至認為要什麼有什麼,要瀏覽器元件,Linux上mozilla就可以讓你直接呼叫,這可是和IE同等強大的,要播放程式,有XINE-lib、mplayer、vlc隨你用,這每套都可以和Windows Media Player SDK相比的,而且毫不遜色,可是文件都不多(以mplayer來看),Windows Media Player SDK則是MSDN寫完整給你~

其他Linux細部這邊就不說了,如果對為啥我覺得Linux應該跟MacOS看齊,往下看ㄅ,不然可以停了。

有注意MacOS的人會知道,MacOS其實是混種,它的核心就是UNIX,系統Library是BSD,嚴格來說,MacOS其實和BSD有一定的相似度甚至淵源,MacOS在整個介面上下了很大的功夫,在協力廠商的合作上下了功夫,它從買回來一開機到使用,可以完全遮蔽掉UNIX那種操作模式(動不動指令列、動不動設定檔,要能支援OpenGL,X.org要改什麼什麼....要支援什麼,kernel要改什麼什麼),然後提供一整套完整的操作說明,從開始到所有設定的完整圖文解說,並且全部放上圖形介面,甚至設計一套使用流程,讓人們按照流程去操作,弄了這些之後,用MacOS的人其實什麼都不懂,什麼也都不需要懂,說難聽些,他們的操作完全被Apple牽著鼻子走。
儘管如此,但我覺得這才是Linux能夠發展起來的方法,現在的Linux和其他OS相比,有著太多太多的優勢,Linux有非常完善的驅動程式支援(硬體支援),有非常完善的函式庫,有非常完善的程式庫,甚至有非常完善的通訊協定,以目前來說,除了Windows之外,能有最好支援度的,大概就是Linux了,甚至如果把其他平台(其他架構的處理器、系統平台)拿來比較,甚至比Windows有更強的支援性(Windows被切割到WinCE去了)。
我覺得Linux目前細部上的問題還滿多的,像是:
1.字型系統
和古早相比,儘管已經很便利了,但是/usr/share/fonts/truetype/這樣的路徑,誰會記得阿~各系統又還會有些微不同,再區分個~/.fonts/一整個天下大亂~
如果遇到中文顯示的問題,像是字型複製進去沒反應,變亂碼、字體跟鬼一樣傾斜、方塊字、部份中文方塊字...等等,扯到fonts.conf的設定、fc-cache的執行之類的,是人大概都會發瘋吧~
如果改了又沒作用,相信我,人的熱情是有限度的~Vista、XP很快又會有信奉者出現~

2.音效系統
之前就提過了,alsa、esd、arts、oss...等,第一次看到的人,誰搞得懂之間的差異性?不要說第一次看到,隨便找個玩Linux的人,我想10個有6個不知道它們的區別,已經夠亂了不說,又出現更多第三方系統希望整合它們,整合的優點還沒看到,又出現更多音效系統是真的。
好吧~不管有沒有搞清楚區別,隨便個問題,我的音效卡是5.1聲道、6.1聲道,我是最新、最先進、最高級的7.1聲道,我在Linux上怎麼設,才可以支援5.1、6.1、7.1聲道?
問題一出,大概沒幾個人會回答吧~
再不然,問題再來「各位前輩好,偶上google查了之後,建議我MPlayer音效裝置用alsa,可是它一直說裝置busy...怎麼辦?」
甚至,像我之前遇到過的問題,「我有2張音效卡,因為網路上都說內建的音效卡是AC97的,不好,我另外買了一張創X未X的卡,可是在Linux上,都沒聲音耶,要怎麼選才能讓它使用這張卡發出聲音?」
這些問題一大票,但是在Windows上,很奇怪的,都沒問題~

3.X的顯示系統
我想看特效,那個特效好炫喔~要怎麼用?
你要安裝Nvidia、ATi的驅動程式,有官方跟OpenSource的2種,如果是舊的,要裝xxx版.....
我想裝官方版的,可是裝完進不去X-win了,一片漆黑怎麼辦?
我裝OpenSource的,裝完怎麼終端機標題列都不見了,怎麼辦?
我裝完.....一堆麻煩和問題~~~
Windows不能說沒問題,以前win98時代,經常有開不了機跳回VGA模式的情況,也有無法開機的情況,但是進入2k/xp之後,情況已經非常少見了,可是同樣問題出現在Linux上,更慘的是,它的安裝過程經常是全手動(官方版本是如此),而且出問題後,不會自己用VGA模式(VESA mode)來啟動它,就是直接黑色畫面死給你看~

4.Linux的當機
說Linux不會當機,或者非常少當機的人,統統都該去跳海,最近用Linux的經驗是,Linux也滿常當機的,最主要的問題在於,它當機之後,對於一部分的響應很弱。
比較有Windows使用經驗的人,會在當機的時候按Ctrl+Alt+Del,跳到「Windows安全性」的介面,接著可以選擇登出、關機或叫出程序管理員。
在Linux上一樣會有類似的情況,但是Ctrl+Alt+Del的選單,只有關機、登出,沒辦法叫出程序管理員,因此假如下面的選單列也掛了,我們大概只能登出、登入(Ctrl+Alt+Del或Ctrl+Alt+<-),或者跳到文字介面終端機來處理(Ctrl+Alt+1)。
另外,Linux在遇到應用程式page fault(我不確定是不是這狀態,應該是)或其他異常時,它會把應用程式關閉,這是很正常的標準程序,Windows 2k/xp也是這樣,但是在2K/XP中,它關閉之後會彈出Message Box跟你說它被關閉了,但是在Linux上不會,你可能莫名其妙的應用程式就被關了,這情況最常見的,就是發生在Firefox上,眾所皆知的,Firefox吃記憶體吃很兇,經常記憶體被吃到滿載,就很容易莫名其妙的視窗不見了(GNOME)。
再者,當Linux吃記憶體吃到極限的時候,它會不斷不斷不斷的進行緩衝(SWAP和RAM),試圖要讓程式執行下去,以我家桌機來說,RAM 1G,SWAP 512M,在執行VirtualBox跑win2k、Firefox 30分頁、WINE執行IE6、再來個Adobe Reader 7時,當IE6出現問題,異常的狂吃記憶體時(瀏覽中華郵政的webatm網頁,估計是載入那個webatm元件後出問題的),整個系統會開始發瘋,最後完全不回應,這時看到硬碟狂跑,但是完全不理我,連程序管理員都叫不動~
這在Windows上,當RAM和SWAP爆掉的時候,它就會給予提示,再不行,它會強制關閉應用程式,但是在Linux上,看起來是會不斷不斷的嘗試去handle它,甚至到自身可能不能處理的境界。

最終我想總結的是,Linux作為伺服器已經有很長的時間了,就伺服器來說,它比Windows適合非常多,像前面記憶體管理的方式,作為伺服器很適合,OS不斷的handle它,頂多就是service慢很多,但是不至於停止服務,應用程式有問題,關閉即可,頂多在syslog加上註記,但是在桌上型電腦全視窗的環境來說,和Windows相比還是不足的,粗略的來看,Windows有的,Linux都有,Windows做得到的,Linux也做得到,但是細部來說,Linux還欠缺許多東西,我認為時間可以改善它們,現在的Linux,感覺像是Windows的98時代,像是Win98的圖形系統配上2K/XP的核心。
最近自從ASUS推出eee pc之後,感覺台灣的電腦廠商開始投入Linux開發了,從104人力銀行可以發現到這樣的趨勢,我認為這是非常正面的,我一直認為,硬體廠商開發Linux相當有優勢,硬體廠商不靠軟體賺錢,開發Linux和Windows其實差不多,但如果因此減少了軟體的成本,對硬體廠商是有優勢的(當然M$這種公司,會用便宜的價格、軟體開發的支援、新技術的授權...等進行威脅利誘),而這麼做之後,從硬體上對Linux進行支援、開發,對Linux的發展是無比巨大的,也可以從根本上,提昇台灣硬體廠商在電腦上的影響力。

鴨子新紀錄(79,163,569)

這次是玩到死的,因此就沒有遺照了,真是不好意思~
沒圖沒真相,下面是結束後的圖片~

2008年1月16日

wii台灣專用機 買?還是不買?

這標題看起來可能會是敗家文,但其實內容是~~~

話說wii在前年就上市了,去年年初說年中,年中說年底,都好陣子沒看到消息了~

最近傳說中的博X又出來放話,說一月底上市是傳聞,不是事實,事實是?還是不能說~

博X爛,已經搞得大家都知道了,在那個輝煌的年代裡,沒有網際網路,要打GAME、買GAME只能到電動玩具店,老闆會拿出一大本給你挑,一個遊戲150、250、350隨便喊~
博X在那個年代獨家壟斷了任天堂所有生意,然後三不五時去抓抓盜版,過得既囂張又寫意~
現在已經21世紀了,網際網路發達,資訊傳播迅速,SNG滿街跑,亂放話、不做事、沒事抓盜版的年代已經不再了,博X卻仍是那副調調,我看~等著被ko吧~

wii亞洲版也好,台灣專用版也罷~代理商去跟別人喬,喬了半天喬不出東西,整天亂放話,沒一個是真的,現在就這樣一直一直一直一直的拖著,完全不心急~~
結果搞到現在,大家都說其實博X就是台灣背後最大的水貨商,這~也很有可能阿~不然怎麼代理商自己完全不急~
不過ㄋㄟ~看到這裡想必覺得,跟標題一點關係都沒有吧~好吧~標題要出來了~

wii還沒買的夥伴們,「千萬不要買」,已經買了的當然爽,都玩了一整年了,那成本完全回收了,還沒買的就算上市了也別買,因為........

~wii的模擬器已經有了~

雖然目前仍然是alpha版,但已經是alpha 1.1(第二版)了,我個人估計,不超過2年,就非常成熟了,到時候上網抓ROM,再加上模擬器,就跟wii一模一樣了~

也許會說,wii重點在那個遊戲阿~那個搖桿阿~
那麼再仔細看下去~
wii的搖桿是藍芽介面的,現在已經有Windows、Linux、MacOSX的Driver了~
如果你對它搖桿的控制有興趣,C/C++、Java的API都有,wii已經不再遙不可及了,與其等那個鬼扯亂放話的代理商亂搞,或是等不重視亞洲市場的任天堂總公司,還是等模擬器比較實在拉~

下面稍微說說wii模擬器的可行性,沒興趣就此打住吧~
所謂模擬器,就跟VMWare、Virtual PC一樣,簡單的說,就是用軟體來寫,寫出一整個硬體的架構,如此一來,程式就不需要在硬體上跑,直接用模擬器就可以執行了~
一般來說這種作法的好處是debug容易,不用辛苦的燒成光碟、作成卡夾、複製到硬碟,或者在嵌入式系統上,可能要寫入到FlashROM,既浪費時間又浪費耗材~
模擬器理論上來說效能是會比較差的,但這是比較級的,例如說:
當我們用PC架構的電腦(假設就是Windows),電腦等級是P4-2.4G,要模擬PowerPC架構,一樣是P4-2.4G這樣等級的電腦時,速度慢很多,因為一台電腦要完全模擬等級相同的另一台電腦,完全可以看作一台電腦執行2台電腦份量的工作(一台當兩台用),會慢是可以預期的,能動就燒香拜佛了~
因此以遊戲機的模擬器來說,PC(P4-2.4G)要模擬XBOX360或是PS3.....這是天方夜譚,不是不能模擬,是就算可以,速度也會慢到你無法接受~
但是有個特例,我們現在經常可以看到超任模擬器、任天堂模擬器、GameBoy模擬器、PS模擬器...等,這些遊戲機硬體等級其實不高,以最低階的任天堂紅白機來說,是8位元,頂多50MHz的處理器架構,沒有圖形加速,這對P4-2.4來說,根本是小菜兩碟,同時跑10個都嫌太快,PS算是比較高檔一點的,但是它仍舊是16位元處理器,時脈也不高,應該有簡單的圖形處理晶片,但跟現在相比,也低階很多,因此對P4-2.4來說,也還ok.....
PS2就有點困難了,當時模擬器出來就說了,等級要求要很高,因為PS2本身硬體規格就很不錯了~
那wii呢?在去年的新聞中提到,XBOX360主打3 core PowerPC處理器+影像處理晶片,這已經很變態了,PS3裡的電腦等級更高,還搭配影片專用的解碼晶片,藍光DVD,這是目前最新進的電腦配備了,訪間的桌上型都還沒到這等級勒~
wii則不同,wii主打的是遊戲的互動性,強調在那把遙控器,遊戲主機以台幣7000元來算,任天堂自己說了,這樣的定價每台可以賺7元美金,XBOX360 12000小賠,PS3 18000還已經是賠20%在賣了,從這邊就可以知道wii的硬體其實很普通,完全是目前非常成熟的硬體技術~
當「非常成熟」又「很普通」的硬體被做成模擬器時,我們就可以預期在效能上應該不會有太大的問題,所以我前面才會說,wii別買了,等模擬器吧~現在買wii根本是浪費錢~

話說回來,博X看到了肯定又會說,這是盜版,全部都是盜版,老太婆~
這模擬器不是台灣人寫的,是美國人、歐洲人寫的,他們早就有正版wii在賣了,台灣市場小就承認吧~別人盜版沒關係,那是因為他們市場大~台灣有沒有盜版,都一樣不會被重視的~~
再說,wii的遙控器現在可是很多實驗室研究的對象哩,很多人嘗試拿來做研究,看能否用在自動控制、影像辨識、復健...等,所以Driver是用在研究性質而開發的,盜版....ㄑㄧㄝˋ

所以結論是,反正都等了一整年了,再等等吧~模擬器已經有了,就等成熟而已~~
(更正啟事:(2008-04-17)
wii os我今天搜尋了網路的討論,也下載來試用了一下,它並不是wii模擬器,他只是將wii搖桿的驅動程式和其他模擬器打包,讓大家方便安裝玩遊戲,並沒有辦法玩wii的遊戲。)

2008年1月15日

又斷一個國家了~

很久沒po政治文了~

民進黨阿~請用力反省吧~~
立委選舉一出來,民進黨大敗,雖然是馬後炮,可是大家想想,選前國民黨的有爭什麼嗎?只有在黨內初選時爭副總統提名時有出現吧~
但是看看民進黨,一直一直都被報導謝、陳意見相左,不然又是謝助選不利,這些負面消息直接上新聞,又是不斷不斷不斷的出現,我想沒有人會喜歡看到這些吧~

現在又來個斷交新聞,看看他上台後,斷了幾個,新聞也上了,9個耶~
我們的外交處境不好又不是一天兩天,對面的打壓也不是一次兩次,斷交怪對面的,可是看看,每年都出訪,沒事就出訪,每次出訪都沒什麼計畫,每次出訪都是國內有反對聲浪,每次出訪都在國外放話,回來後,就爆出國際新聞,說當地政府、總統貪污了多少錢,吃了多少金援。

以前的政府,出訪很重要,幾乎是事情談妥了,才大大方方出訪,不然就是想盡辦法爭取曝光、爭取支持,現在不是,現在出訪是去渡假、去避難,看看之前邦交國的總統拼酒博感情,看~那是什麼阿,那哪是拼外交,那根本就像是業務員和大老闆談生意的樣子,還唱雙人枕頭勒,這是拼外交嗎?這怎麼看都像是被人奉承~
那他勒?他幹了什麼?就很像是渡假阿~到處晃晃,沒事就發表下意見,抒發下機歪的感情,這樣的事情,國內看不下去,記者看不下去,邦交國會喜歡嗎?
回到前面說的,外交處境艱難不是一天兩天,每次斷交就說對面的打壓,這種事情又不是一天兩天的事,但是之前又沒事,甚至還慢慢一點一點增加,國歌中一句「守成不易,莫圖勿進功」(字可能有打錯,就見諒吧。),感覺十分貼切~
想想幾年前,外交部長嘲笑新是LP,一般人感覺不大,只覺得這樣說很不好,但是大家知道嗎~新加坡在亞洲,可是少數幾個有錢的國家之一,正常人會跑去對著王永X、對著郭XX、對著比爾兄指著鼻子罵他是LP嗎?
罵LP時很囂張,斷交就說是打壓~
今天新聞也提到,馬拉威會跟對面的建交,除了錢之外,就是礦產,馬拉威有豐富的鈾礦,這就好笑了,它之前是我們的邦交國,他有鈾礦我們不知道嗎?對面的能協助開採,我們不行嗎?金錢援助又不是萬能的,以前台灣在非洲能打下邦交國,金錢援助不是唯一的方法,最主要的方式是農耕團、建設...等,一點一滴,從基礎慢慢的打最後打下來的,靠金錢就想要吃定對方,這方法一開始就有很大的問題,我不能說金錢效用不好,我也知道錢很重要,但人人都知道,直接把錢往桌上放,然後要跟對方交往是很俗氣而且丟臉的,同樣的錢拿去高級餐廳請吃飯,拿去遊樂園、觀光...等,或是每天持續的送花、接送~這些都是常見的方式,都需要錢,但是不是純粹把錢拿來砸、拿來丟的~
今天搞成這樣,還得要怪對面、怪制度,還是想想自己做了什麼吧~
說到制度,昨天上ptt看才有人說,現在民進黨怪制度對國民黨有利,但是這制度一開始,是民進黨提出來的,而且提出是因為2004年總統選完之後,立法院民進黨是多數席又有總統,想用這樣的政策,一口氣把國民黨趕出國會,一黨獨大想出來的,這制度一開始就說了,贏者全拿,現在反過來制度,根本沒有反省的感覺,只看到一個小屁孩輸了就不爽抱怨的嘴臉。
看看綠營這兩天發言,鄭運鵬說了,不分區的立委,都是藏污納垢,別人打天下他們乘涼,結果被點名的說什麼?謝謝指教、兩者沒關係...這叫反省嗎?已經這麼慘這麼爛了,不為整個黨想想,只關心到自己不要棄權,根本就還是不想放棄權力,被權力沖昏頭了~

2008年1月11日

Open Source 與 賺錢

我一向是一個支持Open Source的人,不過對於GNU GPL我卻不甚喜歡,
我個人的認知是,開放原始碼,在原始的授權條件下,應該要有一定合理的緩衝條件,
例如常見的作法是,我們利用Open Source來開發,
但我們將最新的程式碼限定在3個月或半年後開放,
這顯然和GNU GPL的條件不合,可是這應該是合理的作法,
否則Open Source沒有公司願意使用~

事實上,GNU GPL第二版有漏洞,目前全世界已經有許多公司利用漏洞進行開發並以此獲利,
自由軟體基金會也積極的在制定GNU GPL第三版,
GNU GPL第三版規定,只要使用到GNU GPL第三版的程式、演算法,都必須散佈,
但現在的狀況是,GNU GPL的最主要使用系統~Linux,它的作者Linus並不願意使用,
他持的論點也相當不錯,他認為強迫要求硬體廠商在提供了Linux Driver時,
一定要提供Source Code,並不是很合理的作法,因為硬體廠商的硬體設備,
有許多是有專利或機密的,Driver可能會需要碰觸到它的部份或全部,
因此並不適合用在GNU GPL第三版,也因為如此,
自由軟體基金會的人和Linus有很大的論戰,因此到目前為止,
GNU GPL第三版都還只是草稿階段~

身為一個正常的人,為了吃飯、過更好的生活,要求一定報酬的程式設計是合理的,
我一直認為自由軟體基金會的人都是神父,所以我之前就說過了,
我認為中樂透、中大獎,與其捐錢給什麼人道團體、宗教團體,
不如捐給自由軟體基金會、FreeBSD、Linux...等社群,
以自由軟體基金會來說,它們要求所有程式都無私的散佈、提供程式碼,
他們唯一的要求是,希望你改了程式之後,能夠散佈給更多的人使用,
讓程式越來越好用,越來越好~
會說出這樣話、這樣行動的人,除了是神父、和尚之外,
我實在想不出有什麼人有這樣的行為~~

那現在國外的公司,到底怎麼靠自由軟體來賺錢呢?
目前我看到的作法有4種:
1.它不靠軟體賺錢,靠服務賺錢,軟體只是它提供服務的媒介
這方法是自由軟體基金會等人建議的作法,但RedHat他們證實了,
這種方式提供服務,公司會倒的..... = =||
所以目前RedHat有商業版,提供給企業,一般版本改成Fedora,成立一獨立社群來開發、管理。

2.靠專利保護
我剛剛重新讀過GNU GPL第二版條款(我看中譯版的),它的確有針對這部份說明過,它提到如果你的程式以GNU GPL第二版發佈,但是在某些地區和專利相衝突時,可以選擇性的發佈在沒有衝突的地方,而要同時不侵犯專利又遵守GNU GPL第二版,方法就是不發佈程式和程式碼。
這是GNU GPL第二版清楚寫明的,因此有公司利用這一點,它們把技術申請專利,然後用Open Source來開發,在不違背的情況之下,他們以此來販賣,甚至他們一樣提供你Source Code,但是你不能修改、散佈,因為你修改、散佈之後,就侵犯專利了。

3.靠硬體保護
這也是最近常見的作法,而且剛剛想了下,ASUS的eee pc,應該會靠這方式來開發。
GNU GPL規定程式和程式碼都需要發佈,因此像FON、TIVO,它們的作法是,它賣的是整台機器,不論機器是Wireless AP或是機上盒,然後它限制不准拆卸、破解機器,否則不給予保固,但是同時,它又在網站中公開說它使用的是Linux,並提供Linux Source Code下載,擺明就是遵守GNU GPL第二版規範,但是你就是不能動它。

4.進行自由軟體的代工
自由軟體要開發,但不是所有人都會,尤其是公司,要研發商品,可是沒有能力開發自由軟體或者沒有能力開發kernel,因此聽說國外也有小型公司,專門進行kernel porting的工作,他們的唯一工作就是修改自由軟體,但因為他們受雇廠商,本身並不會發佈自由軟體的程式、程式碼,因此嚴格來說只算是自用,並不會侵犯GNU GPL第二版的授權,因為GNU GPL第二版中寫明了例外條件,就是只自己使用時,軟體、程式碼可以不散佈。

這4種方式,是目前常看到的自由軟體賺錢術,儘管大部分大型企業使用GNU GPL的自由軟體,但通常不會跟你說它用的就是GNU GPL的自由軟體,因此多少還是存在風險,最可惡的就是所謂的禿鷹集團,可以參考連結

這類集團在大陸也很多,之前就聽聞有這類集團專門找上新產品的開發公司,只要發現產品是Linux base的,就要求你Open Source,當公司發佈Source Code之後,隔不到一個月,相同產品大量出現,接著就是紅海策略,大家比價格,誰低誰贏,第一個死的絕對不會是其他相同產品,而是開發公司,我一直不知道這類集團的稱呼,原來一般叫做禿鷹集團阿~
這些人很惡劣,不事生產只破壞,破解它沒能力,就跟乞丐、無賴一樣伸手要,非常機歪~

最後附帶一點,自由軟體的授權種類很多,其中有上述發佈要求的,僅僅只有GNU GPL。
FreeBSD所使用的BSD授權,是完全沒有任何限制的,它允許販賣,而且並不要求提供Source Code,它唯一的要求是,在原Source Code上附加修改者和說明,可是因為不強制要求發佈Source Code,再公司裡面這麼做,基本上沒啥意義,所以BSD被號稱是最自由的自由軟體。
另外像Mozilla的MPL,它們的授權是可以要求部份發佈,部份保留,也就是說一整個軟體中,可以把自由軟體的部份進行發佈,其餘部份不發佈。

而GNU的授權中,除了前面提到的自用之外,還有2種例外狀況:
1.除了GNU GPL之外,有另一種格式的授權,叫做GNU Library GPL,這種授權適用在library的發佈,它的許可條件是,當你使用GNU Library GPL的library時,有2種狀況:
a.當你使用static link時,你的程式、程式碼授權同GNU GPL。
b.但當你使用dynamic link時,附上GNU Library GPL的library和Source Code即可,軟體本身可以不用發佈。
寫程式的時候注意看,許多library的發佈方式,是使用GNU Library GPL的,但也有些library的發佈方式是GNU GPL的,兩者有區別。

2.當使用GNU GPL的軟體(software)進行使用時,使用GNU GPL軟體(Software)產生的其他作品,授權可以自訂,不受GNU GPL的規範。
這意思是說,當你使用Gimp(一套OpenSource的繪圖程式)畫出一張圖片,這張圖片的授權一樣受到著作權保護,你一樣可以自己訂定這張圖片的授權限制。
同樣的道理,當你使用GNU C/C++ Compiler時,只要Library無關GNU GPL,它所產生的程式、程式碼,授權一樣是由你自己決定的,因此,我們可以使用GNU C/C++ Compiler搭配跟公司買來的Library進行開發,之後使用自己的授權來販賣,這也是符合GNU GPL授權的。

2008年1月5日

Java主程式結構(main)的個人理解

學習程式語言最重要的起點,就是知道它的main長甚麼樣子~
尤其是C、Java這類的語言,相信第一堂課在介紹完他的特色和歷史之後,就應該是跟你說他的main長甚麼樣子~

之所以會有這篇,是在昨天晚上,有個學弟跟我說,他對Java的main有疑問,我就想,你真是問對人了,Java的main我也是想了很久,後來想出了這樣的理解~

我通常Java的main都會寫成下面這樣子,也認為這應該是要背起來的......
public class TEST {
public static void main(String args[]) {
TEST test = new TEST();
}
public TEST() {
xxxxxxx
}
}


上面這段code對於會Java的人一定不陌生,畢竟經常看,但是為何是這樣寫呢?

我的理解是:
Java是一個物件導向的語言,而且他強調的是『Java是完全物件導向』的程式語言,和當時『號稱』物件導向的程式語言不同(這其實指的是VB)~
因此Java裡面從一開始就會是物件,而物件(Object)有兩種型態,分別是:
『實體化前』稱為Class(類別)
『實體化後』稱為Object(物件)

而『實體化』,指的就是經過new之後的Class(類別)~
如果從電腦程式的角度來說,new就是電腦真正的去執行它,更專業的說法是,把它載入到記憶體中執行~
以上面這段code中的
TEST test = new TEST();

TEST是Class
test = new TEST() 因此test是Object

物件導向的概念是,所有東西都是物件,以車子來說,門是物件、引擎是物件、方向盤也是物件。
而Class(類別)可以想作是『藍圖、設計圖』,他還沒有做出來,只是一個設計,而經過了new之後的Object(物件),就是真正的實體,以上面來說,就是真實的車子~

以上這段內容,所有Java書的物件導向解說都有.... = =||

因此,Java程式的主體,就是一個『大物件』,裡面再包含了許多小物件,以上面程式來說,Java的程式主體,就是定義出了TEST這個類別(Class)(因為沒有實體化,所以稱它為Class),在程式執行時,Java執行器(好白痴的說法,就是runtime,更直覺的說法是,java.exe執行時),Java會去找main的區塊,然後跳進去操作~

在TEST的程式中,他操作了甚麼?
他把自己實體化了~~~~~ @@
就是這樣~

也就是說,以物件導向來看Java的主程式,
public class TEST { xxxxxxxx }
這是定義了一個TEST的Class

當程式執行之後,java.exe找到main區段並跳進去之後,他執行了
TEST test = new TEST();

他將自己進行了實體化,真正的開始了執行TEST的動作,
那TEST的動作在那裡呢?我們要寫的程式段寫在哪裡?

回到物件導向和Java的說明,在Java中有所謂的『建構子』,
這鬼名詞按字面想,想到翻掉我也不知道是甚麼,但是如果我解釋他的作用,就知道它是甚麼了~
前面我們說到了車子的物件,當我們車子『實體化』之後,也就是製造出來之後,我們通常需要做些處理,例如:根據車行上漆、發動引擎測試、加油、加水、踩煞車(!?).....等,這些東西我們可以給他的很容易理解的說法,就叫作『初始化』~
當我們將Class(類別)實體化成Object後,經常需要『初始化』一些東西,
這些東西其實就是我們要電腦執行的程式~
而建構子在Java的語法就是:
public TEST() {
xxxxxxxxxxxxxxxx
}


這裡TEST就是物件的名稱,我在初學時最常遇到的問題是,建構子和方法(method)不會分,兩者如下:
建構子:
public TEST() {
xxxxxx
}


方法(method):
public void TEST() {
xxxxx
}


看到差異了嗎?
主要差別在於回傳值,方法(method)需要設定回傳值,如果沒有,要設定『void』,而建構子則沒有回傳值這種東西~

前面我們說到java.exe在執行並找到main區塊之後,會把自己(TEST)實體化,
因此我們所有的程式段,通通都寫在自己(TEST)的『建構子』,
這樣一來,程式一樣是物件導向的,但是我們又可以像寫C一樣的寫它~

也許會有人說,也經常看到另一種寫法,又或者說我不是用這樣的寫法一樣可以阿~
另一個常見的寫法如下:
public class TEST {
public static void main(String args[]) {
JFrame jf = new JFrame();
jf.setTitle("標題");
}
}


這種寫法也很多人用,很多書這樣寫,它的解釋方式更單純,
java.exe跳進main區段後,就開始操作區段內的物件~

但是這種寫法經常遇到的問題是,因為他需要寫的是物件的操作,
而『建構子』寫的則是物件的方法(method),
以下面這段code來說,
public class TEST extends JFrame {
public static void main(String args[]) {
TEST test = new TEST();
}
public TEST() {
setTitle("標題");
}
}


在我常用的程式段中,因為程式是寫在建構子裡面,因此當TEST繼承了JFrame之後,我可以在建構子中直接使用JFrame的方法(method),而且不再需要new之類的動作,因為他已經是在執行了,而不是在物件描述,而且使用這種方式,我可以很明確的就知道我現在操作的就是自己(TEST)這個JFrame,而不會在extends繼承了,卻不知道要怎麼在main當中指定的問題(這裡應該用的是this)~

大致是這樣,從初學到現在,雖然Java還是很嫩,但是多少有些體悟,Java main的理解,算是我的重要體悟之一。

2008年1月4日

一杯咖啡的傷害&接水俄羅斯(Wetrix)

話說....很久沒喝左岸咖啡了,之前覺得那很好喝~
昨天心血來潮,想說買杯「奶茶」來喝,結果拿成咖啡~
喝下肚的結果..........就是現在6:33分.......還沒辦法睡...... = =||
剛剛躺床上躺了好久....精神好到爆炸...... = =||
起床後就繼續努力玩接水俄羅斯(Wetrix)了..... = =||

話說之前在ptt上看到有人在問這個遊戲,然後我也跟著去下載了,也跟著玩了~
剛開始一直玩不高分,我同學一玩玩到400萬分,我怎樣都無法突破.......
因此好勝心出現,就一直玩它~大概也玩了有一個月了......
結果勒~結果就是我一直挑戰我的極限~

目前的成果是,我已經能夠在左上和右上方各養4隻鴨子,總共7隻鴨子,然後再在下方再加一隻鴨子,共8隻~
然後玩到Level 10,分數51,944,171......看到這分數,我覺得我瘋了~~ = =||
下面這張就是截圖


之所以這麼確切的知道分數,那是因為抓圖程式抓完圖片之後,遊戲就暫停,然後我當時要放火在中間,就這麼滑鼠一點,「Quit Game」就按下去了~
所以這分數就是結束遊戲前的分數,一分都不差~~ = =||

好了,今天下午還要去看眼科,多少要休息一下...... :(

2008年1月1日

GNOME Nautilus 與 WINE

剛過新年沒多久,我就上來po文拉~
這篇將會同步po在Ubuntu論壇(和、或摩托學園)~~

前幾篇po過,最近嘗試用Ubuntu來生活,雖然還沒辦法完全離開Windows,工作時(看Paper...等)都還是要重開機回去,但已經很能適應了。

這次要說的,是Nautilus和WINE~

WINE透過google和其他blog高人的心得設定之後,中文已經支援的不錯了,軟體的支援幾乎不用改設定就可以支援了(一小部分軟體),算是不錯~

可惜的是,在Windows當中,一些軟體經常可以和檔案總管的右鍵結合,一般稱之為『shell extension』或『shellext』,在GNOME當中,類似的功能就要看Nautilus了。

GNOME當中,Nautilus身分就類似檔案總管,也的確有提供一些shell extension,但是和Windows相比,還是很弱阿~(我想要右鍵直接預覽圖片的功能,有嗎... :~~~ )

儘管如此,有個不錯的程式不錯,在套件庫就有了,套件名稱叫作『Nautilus-Actions』,它可以讓我們自訂右鍵的功能選單,能夠自訂要執行的程式指令和參數,還能自行指定圖示,相當的方便。

Nautilus-Actions介紹完了,讓我們說說WINE吧~

WINE是Linux上的Windows模擬器,可以執行一些些程式,像是ConvertZ、PDF-X Change PDF Viewer...等等。
以ConvertZ來說,我在Windows上的用法,多半是指個檔案,然後右鍵選ConvertZ,然後就能很方便的轉換到繁體(正體),儘管Linux能夠用WINE執行,但感覺少了甚麼.....就是右鍵執行的能力。

至於PDF-X Change PDF Viewer,這是套很不錯的PDF Viewer,它是免費的,而且可以直接下註解,在Windows上,我已經完全取代Adobe Reader了,雖然它能用WINE執行,但開啟檔案的視窗目前會當掉(我猜八九不離十是那個PDF預覽惹的禍),因此如果我們直接下指令,它是可以正常執行的,可是每次都下指令,還要查看轉換、檔案路徑(/home/xxx = z:\home\xxx),這不是很麻煩嗎。

有沒有辦法跟Nautilus-Actions進行結合呢?
我的解決方法是,寫個shell script幫我把檔案、目錄的路徑轉成z:\xxx\xxxx的格式,在送給WINE執行,因此就用我差勁的shell script能力寫了下面這樣的程式:
/usr/local/bin/wine_bridge
#!/bin/bash
rm /tmp/runcmd
echo -n "/usr/bin/wine '$1' '" > /tmp/runcmd
echo -n $2 | sed -e 's/\//\\/g' | sed -e 's/^/z:/g' >> /tmp/runcmd
echo -n "'" >> /tmp/runcmd
chmod 700 /tmp/runcmd
/tmp/runcmd


過程很簡單,把 wine ConvertZ.exe "/home/xxx/ooo.pdf" 轉成 wine ConvertZ.exe "z:\home\xxx\ooo.pdf" 並寫入到 /tmp/runcmd,之後就執行它~

使用方法是,加入新的Nautilus動作
系統->偏好設定->動作組態

新增->標籤自訂、圖示自訂、工具提示自訂
->動作 路徑->/usr/local/bin/wine_bridge(檔名路徑同前)
->動作 參數->"/home/xxx/.wine/drive_c/Program Files/ConvertZ/ConvertZ.exe" %M(前面填上WINE要執行程式的完整路徑檔名,後面的%M則就是目前指到的檔案(目錄)的完整路徑)

相信看到的人,可以幫我改良它,畢竟只花了點時間,而且我bash不熟,功能有到我就滿足了~

加入之後,我的ConvertZ、PDF-X Change PDF Viewer現在都能夠直接用Nautilus右鍵來呼叫執行了,非常方便~

最後,這程式看起來就很破,而且能改進的地方也很多,像是多個檔案的能力拉.....等等,歡迎修改它然後跟我說,讓我也能用..... :p