2007年1月11日 星期四

Ruby裡的Symbol

剛理解了ruby裡的symbol object。先記下來。

Ruby裡的Symbol是一種object,這種object包含了一個字串和一個數字(ruby內部使用的)。用字串前加一個":"來表示ex :foo。有三種方法產生symbol- :foo或:"foo"或 foo.to_sym,用foo.to_sym時foo必需是個string。

如 :foo 是一個Symbol的boject,裡面包含了"foo"的字串,及一個ruby內部使用的數字。
>:foo.to_s
=> "foo"
>symbol1 = :foo
=> :foo
>symbol1.to_s
=> "foo"
>:foo.class
=> Symbol
:foo是一種 Symbol的object,這個symbol的字串內容是"foo",而 symbol1也是。

symbol的兩大特色是不可改變的及唯一的。也就是說:foo一定是包含"foo"這個字串,不能也不會改變。整個ruby裡也只會有一個:foo的object。
>symbol2 = :foo
=> :foo
>:foo.object_id
=> 231138
>symbol1.object_id
=> 231138
>symbol2.object_id
=> 231138
symbol1和symbol2的也都是symbol的object,但是由object id可知symbol1和symbol2和:foo都是同一個object。不管你怎麼使用就是只會有一個:foo。如果是string就不一樣了。
>str1="foo"
=> "foo"
>str2="foo"
=> "foo"
>str1.object_id
=> 23518020
>str2.object_id
=> 23518030
str1和str2是兩個不同的object。

symbol的主要用途有兩個,一個是節省記憶體的使用,另一個增進效率。
由於symbol在系統裡只會有一個,所以只用掉一次的
記憶體空間,又因為他不會改變,所以你在那裡使用都不用擔心symbol的內容是否還一樣。這樣可以節省很多記憶體的使用,同樣的字串使用的越多次,改用symbol所節省記憶體的效益就越明顯。

另一個是symbol裡有一個ruby內部使用的數字,當你使用foo.action時,ruby需要比對字串去找到action這個method,如果用symbol就可以比對symbol的數字,這可以有效的提升效率。所以ruby會將你的foo.acion轉換成為foo.send(:action)以提升效率。

而symbol的比較也會比字串的比較有效率,symbol只需比較是不是同一個object即可(還記得嗎?symbol的字串是不會改變的)。

而將symbol用來做enumerations也是很常見的用法,如:RED, :BLUE, :GREEN。

好用的C++函式庫

SGI STL
C++裡好用的函式庫首推STL,這是個超級強大的library,後來的程式語言的設計也深受其影響。不過STL有好幾種版本可以使用。SGI版本的STL是被廣為使用的版本。gcc就是採用這個版本的STL。

STLport

以SGI STL為基礎發展出來具有高度移植性的STL library。Borland C++ Builder 6也包函了一份STLport。授權相當自由,非GPL授權,商業使用也可以放心使用。

Boost
很有機會被收進C++標準程式庫的一個library。裡面包函了各種好用的library,也是很熱門的C++函式庫。授權自由,非GPL授權,商業使用也可以放心使用。

將verilog轉為容易閱讀的html格式

有些工具可以讓我們將verilog的程式轉換成成容易閱讀的html格式。

v2html
是一個由perl所寫成的轉換程式,可以將verilog的程式碼轉成容易閱讀的html格式。但不只是單純的html格式,轉出來可以像javadoc或doxygen一樣有syntax highlighting,找到functions, tasks, defines, parameters的定義,還能做出設計的hierarchical view,以及決對不可少的Alphabetical Indexes。

vlog2html
由Comit Systems 公司的Venkateswarlu Talapaneni 所設計的另一個將 Verilog轉換到到閱讀的html程式。同樣也是由perl所寫成的。

有這些工具就可以在沒有任何tool幫助時,更輕鬆的閱讀verilog程式。

Windows下的免費比較工具 WinMerge

在Unix系統下面要比較檔案有diff這個強大的功具,在windows下也有很多方便的檔案比較工具。個人使用覺得最方便最順手的就是WinMerge這個Open Source的檔案比較工具。WinMerge除了有方便的操作界面以外, 也有syntax highlighting,支援DOS, UNIX, MAC檔案格式,也支援Unicode,還是免費軟體。我把WinMerge放在隨身碟帶著走,不需安裝直接就可以使用,到那裡都有順手的工具可以使用。不過他還是會把一些設定寫到registry裡,到新電腦時又變成預設的設定,必需再設定一下個人慣用的使用設定。

Winmerge首頁




More Winmerge ScreenShots

2007年1月10日 星期三

免費的C++ IDE

C++是種歷史悠久,發展完整的程式語言。發展到現在除了有很多不同的 compiler可以使用以外,還有很多人發展出各種IDE工具還讓人免費使用,再加上現今免費軟體的風潮之下,許多原本要付費買的商業軟體也都推出了免費版本讓人使用。這些免費的軟體很多都功能強大又穩定,比起商業軟體是毫不遜色,也有的是商業軟體的精簡版,在熟悉使用方式後,能很快速的轉用進階的版本。

Dev-C++
是一個功能完整又小巧的IDE,預設就配合Mingw的compiler及GDB為debuger,也可以配合Cygwin和其他gcc base的 compiler使用。另有Dev-Pascal 給pascal的版本。由於他的功能完整又小巧,我都會推薦給初學C++的朋友,讓他們在初步的學習時能先專注在C++語言本身上面,而不用為了學習環境傷腦筋。另有擴充版本wxDev-C++可以配合wxWidgets開發視窗介面系統,還有視覺化的拖拉可設計視窗介面。

Code::Blocks
是一個open source的IDE,同時還具有跨平台的特性,有Linux和windows上的版本。也可以配合Cygwin或Mingw使用。

Anjuta C/C++
Anjuta is a versatile IDE for C and C++, written for GTK/GNOME. 還可以直接開GTK/GNOME的application,但目前只有Linux下的版本。

KDevelop
The KDevelop-Project was founded in 1998 to build up an easy to use IDE (Integrated Development Environment) for KDE. 除了C++以外也支援其他的程式語言。目前在Linux和Windows都可使用。

Microsoft Visual C++ 2005 Express Edition
Microsoft的VC++是老牌的開發工具了,己經在使用的人也很多,2005 Express最重要的特色當然也少不了MS現在主推的.NET平台。不過基本上還是Visual Studio 2005的精簡版。重頭戲當然是希望你最後轉而使用他們的Visual Studio。

Eclipse+cdt
Eclipse在java的領域裡可說是聲望第一名的IDE工具。連Borland在JBuilder的業務也受到它的影響。不過Eclipse打從一開始就不只是要發展成一個Java的IDE,他要發展的可是一個可擴充的開發平台。所以你也可以在Eclipse上開發C/C++。不過預設的Eclipse並沒有C/C++的開發套件,必須另外下載一個叫CDT(C/C++ Development Tooling)的擴充套件。除了可以配合gcc當compiler以外,也可配合其他的compiler,還能不停的加入各種擴充套件來支援其他功能讓他不單純只是C++的IDE。最棒的是Eclipse由java開發而成,所以也可以在Windows, Linux, FreeBSD, 或Solaris等各種平台上使用。不過你可能需要一台配備稍為好一點的機器才能流暢的使用Eclipse,除此之外就沒什麼可挑剔的了。
Update:現在的Eclipse提供了幾種不同的預設套件的版本,有給java開發者,c\c++開發者,web開發者。不過基本上就是就不同的套件的需先安裝而己,還是可以再自行安裝其他的套件變身成多功能IDE。

Turbo C++
是的,Turbo系列回來了。許多資深點的程式設計師可能都聽過, 甚至用Turbo C++。我在程式設計的早期時第一個使用的IDE也是TurboC++,直到現在還是讓我相當懷念。除了當時第一次接觸到這麼好用的IDE時的震撼之外,它簡單又輕巧。一直到現在,我覺得都還不輸給多年後發展出來的各種IDE. 所有Turbo系列被分成兩個版本explorer版和Professional版。exploreer版可免費取得,並付費升級到Professional版。Turbo系列除了Turbo C++以外,還有Turbo Delphi, Turbo Delphi for .Net, Turbo C#。



2007年1月9日 星期二

Windows 上的X-Server : Xming

X-Server就是在X window下畫面顯示的部分。由於X window的架構的關係,你可以在某一台主機上執行X window的軟體(X Client),但是在另一台的主機上顯示及操作(X Server)。所以只要你有一個X window的X-Server,你就可以在遠端執行該軟體而在自己的電腦上操作使用。像我個人就在主機執行需要強大運算能力的軟體,但是在notebook上的windows操作,還可以同時做其他的事情也比較不會拖累主機的執行效能。

在windows上這樣的X-Server軟體其實很多,也有很多功能強大的商業軟體如 Hummingbird Exceed或是X-win32。先前是使用X-win32,也很滿意,後來發現有Xming後就改用Xming。

Xming其實是X window的windows porting版本,不過它相當的小巧穩定,效率也很不錯,還是GPL的開放軟體。雖然設定界面上還是不如商業軟體,但也不至於造成使用上的困擾。就我個人所需要的功能來說都己足夠,於是就漸漸從X-Win32改到Xming來。還可以推荐給朋友使用而不用擔心授權的問題。網路上也己經有很多人的說明,不會用的朋友就請他自己搜尋,真是輕鬆愉快。個人使用到現在,只有在Solaris上中文有些怪怪的,應該是我設定的問題,不過沒有很常用就算了。

其實Cygwin/X也裡面也包含了X-Server,如果己經使用Cygwin/X的朋友就不需要再另外安裝Xming。如果你只是單純的需要X-Server的話,那使用Xming遠比安裝Cygwin/X小巧方便多了。

http://freedesktop.org/wiki/Xming
http://sourceforge.net/projects/xming

相關軟體

Hummingbird Exceed
功能強大的商業軟體,但個人認為因為功能過於強大,整體而言有點太過肥大。

StarNet X-Win32
功能強大的商業軟體,在發現Xming前是個人的最愛,功能完整又小巧簡潔,設定界面好用。價格也不算太貴。

Cygwin/X
Cygwin是一套在windows環境下提供 Linux-like環境的軟體。Cygwin/X也是X window的windows版porting。但是Xming和Cygwin並無直接的關係。

2007年1月3日 星期三

Plone驚魂記-任何動作前先備份果然是鐵一般的守則

毫無備份的情況下,順手點了Plone裡各個需要upgrage Product。只因為看到他說可升級,當然還有一點點許久未升級的愧疚感,就順手點下去,結果是一場惡夢的開始。雖然一開始還是可以顯示出畫面及資料,但是卻無法做任何的新增文件,嚇出一身冷汗。幸好將ATReferenceBrowserWidget重新install就可以解決。不過卻因為有一些之前就有的bug我不知道,還一直以為是我升級的後遺症,害我try了一整個星期又是新版又是舊版交叉的測試。

不過才突然發現,使用Plone對各種Product對相互之間的相容性問題要這麼的小心,也開始覺得Plone的升級將會是個令人困擾的問題,也許是因為我實在是不夠熟Plone,能正常run就不理他。不知道他的free cms會不會也有這樣困擾。這也是目前open source的最令人困境的問題吧,如果他們沒有consultant服務的話,就只能自己得多花心思在migration上。

任何動作前先備份果然是鐵一般的守則,也許我該把他升級成"鑽石一般的守則"。

Project Management Software

在專案的開發過程中,常常需要多人的合作參與才能完成較大型的工具。但是老話"人多好辦事"常常都不準,個人經驗中最常發生的倒是"人多口雜",一堆人就一堆意見,永遠無法有共識。遇到自我意識較強烈的或是容易拖拖拉拉的人整個專案就在無止境delay中慢慢走向滅亡。正面點來說,一群人合作時,如果有能增進溝通的工具,甚至在人無法時常面對面溝通時有另外的交流管道,對專案的幫忙很大。

所有就有所謂的專案管理工具的產生,來拯救苦海裡的專案。這類的產品中當然是也有許多的商業軟體,以下介紹的是個人有使用過或參考過的,不一定是最好的,也因為個人因素,所以了解比較多的還是在Open Source的部分。

MS Project
近年來最常聽到的專案管理工具中,MS Project應該算的上其中一員。在個人所知裡,的確也有很多人使用它。MS Project本身的功能當然沒話說,以MS一貫的習慣,總是會在軟體裡放進十倍於你用得到的功能。想想在word裡我曾用過的功能應該只有百分之一吧。所以我倒沒懷疑過他的功能問題,至少我用得到會用的看過的,都在裡面了。還可以配合Project server支援多人共同使用。這可是很重要的功能喔,如果每一次的進度規劃改變還要mail來mail去,那真的就是只有遜這個字可形容了。甚至還聽過一個笑話要學好Project畫出一堆沒人遵守的圖表就是要升官的第一步。不過我個人是沒使用Project server。因為在M$中我少了$,所無緣一試。

OpenWorkBench
OpenWorkBench是一套Open Source的project scheduling工具。功能相當完整,完全不輸給MS Project,還能匯入微軟Project 格式的檔案,使用上也滿好使用的,有同事認為這是最佳的MS Project替代品,算是對MS Project極具威脅力的軟體。事實上也有許多大型公司開始使用OpenWorkBench。之前似乎有公司支援多人共用的server,我想那應該類似Project server吧。
不過後來就沒特別注意後續發展,如果真的有完備的功能的話,OpenWorkBench就成為超殺手級軟體了吧。不過有點可惜的是只有windows版本,如果他有windows以外的版本的話,那應該真能稱王了吧。

eGroupWare

eGroupWare是由php所開發的系統,事實上我個人覺得他比較像多人協同開發的溝通工具,提供了許多社群合作功能像是行事曆、通訊錄、事件紀錄簿、fudforum(討論區)、專案管理、messenger(訊息傳遞)、sitemgr(介面排版)、polls(投票)、headlines(好站連結)這些東西。
但在專案管理感覺比較弱一點。所以他們的網站說明是"eGroupWare is a free enterprise ready groupware software."。其實他提供的功能相當多,相當完整。eGroupWare除了可經由他原來提供的web界面使用以外,還可以整合使用一些像Kontact, Evolution, Outlook的client軟體。當然,他也是跨平台的,在Linux, Mac, Windows都能使用。

dotproject
由php所開發的專案管理系統。也是web界面的管理系統,和eGroupWare相較,dotproject比較專注在專案管理的部分,所以就專案管理來說,個人覺得dotproject的功能是較完備也較順手的。曾經使用過一陣子,不過由於導入的問題,最後逐漸荒廢,個人也因此較少注意dotproject的發展,相當可惜。但是覺得eGroupWare有一點可以讓dotproject學習的就是增加一點client的整合,讓使用者也可以配合一些即有的client軟體使用。雖然他本來的web界面就很好用了,如果能再加入原來大家就習慣的使用軟體的整合,相信在導入上應該會更有利。dotproject還是個人在多人專案管理系統裡的首選。

XPlanner
是基於Extreme Programming流程的專案管理系統,如果專案採用XP的開發流程的話,XPlanner是相當方便的。而且XPlanner十分簡潔,沒有過多花俏的界面及功能,簡單明瞭。也是我很喜歡的風格。XPlanner也是java base的系統。

hipergate
hipergate也是一個Open source的web based系統。不過他其實是"Open Source CRM and GroupWare",裡面包含了一點專案管理的功能。我也還沒實際使用過。

Bug Tracking System

Bug-Tracking System或稱Defect Tracking System就是在系統的開發過程中,用來記錄並追蹤系統的bug。好處是可以在開發的過程,記錄下曾經遇到的問題,有計劃的管理及追蹤後續處理。更可以在日後變成一份開發記錄,許多重複或類似的問題都可以有處理參考,而且現在的系統多半也都會加入QA的概念,有人提出bug或是patch都可由另外的人去確認。不過我一直覺得這是防範搗蛋鬼的成份比較大。

功能強大的bug tracking system還可以延伸擴充和其他的scm系統配合使用,交叉分析。所以這類的tracking system不只商業產品眾多,連open souce或freeware都是百家爭嗚。

但可別以為這種系統只能做技術性的支援,有的人還可以拿來做績效的指標,也有人拿來當進度追蹤使用,在CRM上也可以有一定程度的幫助。

在這麼多的tracking system裡,以下紹介的是個人比較喜歡或是使用過的。因為個人因素,所以多半是偏向open source或是對open source大方可免費提供的產品

--Update2010/07/12:
要加強強調的是customized fields的能力會影響到導入團隊之後的實用性。如果你的團隊所需要的資訊無法加入issue system裡,勢必需要另外記錄管理,除了增加負擔外,也很容易讓issue management流於形式。最後的必然結果就是系統的記錄和現況不同步,光想就知道這有多痛苦。還可能會讓你覺不要這種系統日子還會好過點,但事實是沒有任何的記錄和追縱的issue只有上帝知道結果會怎麼樣。(好吧,也許你的績效也可以反應出這些結果)

BugZilla
BugZilla是很具知名,使用度也很高的bug tracking system。由名字就可猜想他跟mozilla大概有一定的關係。Bugzilla的前身是跟著mozilla.org所release出來的產品,也是Mozilla現在使用的bug tracking system。現行版本的Bugzilla是由perl所寫的,所以想要使用必需在有perl的環境下。perl是很流行的環境,在Unix base或Windows都很容易取得。所以在環境安裝上並不會有什麼問題,只是他需要一些perl的Module。雖然perl本身有CPAN的方便安裝,不過很多還是需要從CPAN download下來後再自行compile。在Unix base的系統上問題比較小,因為他們通常都會有compiler,但是在windows不一定都會有。Bugzilla後來為了在windows上的安裝方便也有做了一些加強,也用PPM取代CPAN,甚至還把需要的ppm module放在他們的測試站上。都做到這種程度了,實是在沒話說了。但很可惜的是在這些努力出現之前,我就改採用別的bug tracking system,單純只是因為個人對perl不熟悉,覺得這些module的upgrade有點麻煩。不過Bugzilla所提供的功能非常完整,該有的一個都不缺,穩定度也不錯,是很出色的bug tracking system。還有許許多的的Addon可配合使用。很多知名機構如Linux KernelApache Project、連NASA也都有使用

Mantis
Mantis是另一套open source的bug tracking system,比起Bugzilla算是比較年輕一點。使用php開發,可配合MySQL, MS SQL, and PostgreSQL。PHP和perl一樣都是可跨平台的script language,所以在各種平台都可使用。安裝上也較Bugzilla簡便,就像是一般的php web system一樣,設定一下database、系統相關資訊就可以了。功能也是相當完整,有簡單的圖表統計。這是我目前正在使用的系統,之所以轉換到Maintis來最大的因素還是因為設定簡便,php也比較熟悉,在系統的維護和升級上都比較有把握。還有一個小小優點就是畫面色彩比較豐富感覺比較漂亮一點,不過也有同事覺得色彩太多有點眼花。現在也是很多人用的系統,還有人做Bugzilla及GNAT轉移到Mantis的工具。也有MantisConnect可以和其他一些如Eclipse的工具整合。


Trac
trac是由python所開發的系統,雖說是bug tracking system,但也提供了與版本控制系統整合(雖然只支援subversion,不過subversion是我的最愛)及wiki的功能,算是一個麻雀雖小五臟俱全的整合性開發環境了。個人認為最大的吸引力是直接將ticket system與subversion整合,光這個功能就讓我口水直流,還可以當subversion的web界面,實是在非常理想的整合性開發環境。trac的操作介面很棒連老牌的RT也有trac的theme。trac也設計的系統整合的功能,能夠利用連結與其他的系統整合,又是一項讓我流口水的功能。所以有很多軟體專案也都使用trac,還有提供trac的hosting service,算是相當熱門。要不是目前在使用的系統己有許多資料,還真想再跳到trac來,這樣就把好幾個系統合成一個。不過還是有些地方希望能更好,像localization(雖然我個人覺得無所謂),還有summary的功能在計畫在Milestone 1.0才有。多重專案規劃在Milestone 2.0。目前多重專案可先利用apache的virtual host解決。

RT: Request Tracker
RT可算是最老牌的ticketing system之一了。RT也是使用Perl開發的系統,所以也具有很高的平台移植性。而且RT其實是比較general的ticket system,所以不只可用來當bug tracking system,還可以用來當其他事務的ticket system。功能完整,又深具歷史,使用者也很多,還有書本。

Scarab
Scarab是使用Java開發,使用了application server。在安裝上,只要有java環境就很方便安裝。他甚至還附了application sever在release裡面。只要啟動就直接可以用了(這當然所有的東西都在預設的設定下執行)。Scarab算是個很有彈性的issue tracking system,本身的模組化也做的很好,基本的tracking功能當然也都具備。也利用xml提供了Import/Export interface,可以從別的bug tracking system轉移資料。個人使用經驗不多,不知是否因為和一般的系統界面差異較大,
試用過之後還是不太會使用。

JIRA
JIRA基本上是商業軟體,不過他有提供Non-Profit & Open Source Licenses可以免費使用。
不過他的Non-Profit的定義有他自己的定義,連政府或學術單位都不算在裡面。對Open Source也可免費使用,照他的說法是他用許多好用的Open Source工具,他們的開發者也有很多Open Source的社群,所以要回饋給Open Source。至於跟商業版使用的有何差異就不清楚了。整體的感覺滿不錯,許多比較進階的功能也都具備。畢竟是商業軟體要夠好夠強大才能在許多的軟體裡維持競爭力。不過我也沒太多的使用經驗就是了。

track+
JIRA也是商業軟體,也是java base的開發系統。和JIRA類似的,他們讓教育單位,Open Source和慈善團體,可以免費使用他們的系統,不過人數只能在5人以內。在流程規劃上有他下過功夫的地方。

--Update 2010/07/12
Redmine在某種程度上來說,可以說是Trac的ROR版本。不過這當然是因為他和Trac一樣都是整合式的issue tracking system,但是他比Trac晚開始。從功能上來說我覺得比Trac還多還完整。這當然是個不令人意外的結果。如果是我來開始我當然也會把自己覺得Trac還未提供,但是又很需要(實用?)的功能通通加進去。不巧的是他加進去的功能又很合我的意,像及早支援multiple project,提供了time tracking的能力(但是還可以再更好,這樣我就不需要dotProject了),還有在issue tracking 提供更好的customized能力。這些都是我在使用Trac時覺得很需要的部分。特別是issue tracking的customized fields,那是我最滿意Mantis的部分。這部分做的好在我心中就能大大加分。因為每個團隊或是公司都會有自己的不同需求及使用習慣,要能夠方便的修改系統來配合人使用,這樣對團隊才能真正有幫助而不流於形式。所以我給redmine高評價。另外值得一提的是ruby本身也是使用redmine當他的issue tracking system,所redmine比較不會在短期內就荒廢無人後續,也己經在一定量的使用者使用下証明他的成熟度。目前我覺得最可惜的是還不能配合ruby1.9使用,ruby1.9相對於1.8有很大的改進,而從redmine的開發網站來看也不像是其短期內的目標,雖然己有人提出了patch,但是狀況不明,想使用ruby1.9的人可能要多等等了。