顯示具有 Programming 標籤的文章。 顯示所有文章
顯示具有 Programming 標籤的文章。 顯示所有文章

2010年3月23日 星期二

個人對Mercurial和Git的不同感想

在熟悉了Git後,又找了點時間學了Mercurial。之前準備要學習Git時,就找了很多資料。Mercurial和Git的各種比較當然更是不能少,所以對Mercurial也很有興趣。

Mercurial和Git實際儲存的方式很類似,所以熟悉了Git再看來Mercurial覺得很多觀念都很容易理解。不過有趣的是,因為Mercurial和Git使用了類似的資料儲存,我們可以說Mercurial和Git是用不同的觀點來操作同一份資料,因些產了大異其趣的兩種VCS(這裡說大異其趣也是有點誇大,因為對使用觀念還是很相近)。網路上Google這個Git和Mercurial分析(中文版)雖然有點舊,但還是很不錯。

就我的觀點來說,其實Mercurial其實比較算是VCS。Git連History可以改的功能讓我不太能接受,但是rebase又實在很實用。在我熟悉了Git之後,覺得Git其實比較像是Revision Exchange System,很多的功能都是為了讓contributer能夠很方便的把update送給maintainer,而maintainer也能最方便的把contributer的update merge進maintainer的source。也為了如此Git幾乎把把有的能力都開放給user,但也就是開放的太多太強大,也很容易讓user把repository搞壞。Pro Git裡也強調己經publish的commit最好不好再change或刪除,包含有些功能的本質就是rewrite commit。

其實單就功能性和理念上來說,我是比較喜歡Mercurial的一些特點,包括commit history不能改變,比較平緩的學習曲線,使用跨平台的Python,user容易寫自己的extension,還有對http的高度整合。

但是以我現在的使用環境,最需要的是local branch、history rewrite、rebase。所以我現在使用Git。還有另一個理由是我沒有root的權限,只要把Git build在家目錄裡就可以,相對來說較方便。

Git讓我覺得最不方便的就是在架設server的部分,Mercurial在server部分功能也相對比較方便。也剛我現在只是個人使用,沒使用到server的部分,但是在可預的未來還是需要的。

其實以Mercurial和Git底層的高度相似度,應該不太有因為架構上的差異而有一種能提供而另一種無法做到的功能。我想多半是因為理念的不同而不提供(或是認為不應該提供)。能互相參考,把好用的功能互相補強,當然是最好不過。最好是還可而互通,像對svn一樣的支援就最好不過了。不過我想這應該是我想太多了。:)

之前看到Git支援svn,本來以為可以靠git svn完整支援,把git當svn client,現在發現實際使用上除了有點地方要小心以外,好像dcommit也還有一點不穩定。這樣讓使用起Git,也無法發揮Git的強大。
Mercurial目前對svn的支援度我還不清楚,不過我想我可以以Python當標杆,Python在等hgsubversion的完成度也要轉換到Mercurial。當Python轉到Mercurial後就意味著hbsubversion就到達一定的可用度了。

PS:Mercurial的default package也包括了一些很重要但預設是不開啟的extension,像rebase及能達到local branch的bookmark。這讓我更喜歡這種extension的設計,讓你在嚴謹管理中,也能有一些做例外的能力。而Git也正在討論對http的支援。大家都朝正面的道路前進。

--update 2011/0905
Git在1.7之後就支援smart http讓使用http push或pull時更有效率

Git的local branch果然好用

前一陣子將Pro Git讀完了,開始使用Git來輔助在公司的工作。Git的local branch真是好用。在公司使用公司的VCS,要達到一定的完整性和正確性後才能check in,在還沒check in前自己做不同測試也很不方便,老是要把檔案搬來搬去備份來備去,還要自己做merge。當要同時處理不同功能時就更辛苦了。改用Git後,這些事都方便很多。只是Git實在是也不算好學。網路上有許多的文章,很多人簡介,但是我覺那些對初學者來說其實還是不太夠。雖然最重要的部分都不會少,但是對初學者來說反而更霧裡看花。我一開始看也是先看別人的介紹,但是總覺無法擋掌握Git。最後還是看完了Pro Git之後才覺得真正知道如何使用。

所以現在就變成從公司的VCS check out到自己的local後再使用Git,在不同的local branch做不同的測試,甚至是同時做不同的功能。最後再最後的結果check in進公司。有點像git svn的做法,但是是手動版本。而且公司也不是用svn,git svn幫不上忙就是了。

而且有了Git的rebase和輕鬆merge能力,同時開的local branch最後很也容易就能和公司的VCS的最新版本接軌。除了有時會忘記現在build出來的binary到底是那個branch以外都很方便,我想就大概是太方便的後果吧。

2009年11月11日 星期三

c++ self testing

在網路上看到的幾個c++問題,個人覺得有一些還有點難,不過多懂點總是好的。

1. 什麼是virtual inheritance? 請舉例說明。
2. 什麼是virtual function? 什麼是pure virtual function?
3. pointer與reference的差別?
4. 什麼是static_cast, dynamic_cast, reinterpret_cast, const_cast? 他們之間的差異是?
5. run-time polymorphism與compile-time polymorphism的差異? 分別要如何達成?
6. 什麼是explicit constructor?
7. 什麼是template disambiguator? 請舉出例子。
8. 有沒有聽過boost or loki? 有沒有用過boost or loki? 請舉出例子。
9. 有沒有聽過CRTP (Curiously Recurring Template Pattern)與PBCP (Parametric Base Class Pattern)? 請寫出兩者的sample code並比較它們的差異。
10. 請問在C++中, struct與class最大的差異是?
11. 請問什麼是template partial specialization?
12. 什麼是type traits? 什麼是tag dispatch? 請以簡單的程式碼說明之。
13. 有聽過template metaprogramming嗎? 請舉例解釋之。
14. 什麼是SFINAE? 請解釋之。
15. 為什麼常常看到template的程式碼寫在hpp裡,而不是放在cpp檔中?
16. 什麼是functor? 用過(或寫過)任何的functor library嗎? 例如boost function/bind或是fast delegate?
17. std::list與std::vector的差異是什麼? std::map裡的資料結構是如何實作的?
18. 何謂copy constructor? 如何阻止一個class被copy?
19. virtual function是如何實作的? 什麼是vtbl?
20. 在template的宣告裡,typename與class的差異是? 為什麼有typename這個keyword?
21. 什麼是forward declaration?
22. 如何解決header file mutual inclusion的問題?
23. 什麼是templated class? 什麼是class template?
24. 什麼是wchar_t? 有沒有用過std::locale跟std::codecvt?
25. 用過那些c++ compiler? 有沒有聽過c++0x? 試舉出c++0x的新功能。

2008年6月18日 星期三

compile speed up tip

寫程式時遇到比較大的程式時,常常要花許多時間在compile上,有幾個可以加速compile的小tip,可以參考。

1.ccache
這是object file的cache的工具。基本的運作原理就是他會在compile做完preprocess之後,把compiler的版本,使用的參數及做完preprocess後的內容做出一個checksum,用以判斷程式碼是否有改變,沒改變時就可以把cache裡的檔案拿出來用。除非你一次改了大部分的程式,通常都會有一定效率改善。不過一般人寫程式時,也不太會改了一大堆再來compile。你如果是這樣,那要考慮一下,這不是個好習慣。

2.parallel compile
很多的building tool都會支援parallel compile。像許多人用的gnu make就有不錯的支援,可以同時compile獨立的部分。以gnu make為例,使用make -j[] 就能使用parallel compile,還可以用"-l"限制不要使用過多的system resource。據說以讓task數量為cpu的二到三倍時的效率會最好。但是使用parallel compile時,一定要注意好depency的部分。gcc也可以幫助你產生depency check list.

3.如果你compile時使用到network的 resource,例如很多人會使用nas當storage。那linking時object或library的大小也會影響到linking的速度,可以考慮把library copy到load disk,這樣在network resource比較吃緊時也會有幫助。不過如果bandwidth很充足時,改善的空間可能就不大了。

4.disk種類
另外在使用load disk時不管是直接在loadl disk compile或是當compile temp,disk的種類也會有影響。一般而言scsi在多工時的效率會比ide/sata好,但是要強調的是多人多工時,而不是瞬間存取速度。如果你只有自己一個人在用,可能感覺不太出差異。

5.RAID type
如果你使用RAID當你的storage,那你至少要了解RAID 0到RAID 5 的不同。對資料的保護方式不同,存取速度當然也就不同。現在RAID不算貴,連很多家用nas都支援RAID,我想這是很多人都可以考慮的調整選項。

PS.來一個跟以上比較不一樣的,如果你使用C/C++,不必要的header就不要include,可以減少compile時對header的checking和parsing,也能減少disk io。不過最重要的其實是減少你程式裡無謂的depency。

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程式。

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#。