G++ 尚未支援 extern template?
在用別人實作的 Graph Cuts 的時候,發現原來 g++(以 4.3.1 實測)似乎尚未支援 extern template:如果 function template 的定義跟宣告拆開來的話,會出現 undefined reference error。儘管按照這份 spec 應該是 OK 的。或許中間出了什麼差錯,晚點再試試。
暫時的解決方式很簡單,把所有定義丟到 header file 裡面去就行了。
Conditional Break in GDB
在 gdb 之中,要作 conditional break,首先,我們可能會先查一下現在有哪幾個 breakpoint 在作用中:
假設我們要設的是第二個 break point,在某變數 x 大於 3 時停下,就這樣下指令:
如果要改設別的 condition,可以這樣下取消
或者直接改設別的條件也可以
附帶一提,continue (cont) 也滿好用的。在 for-loop 之中常常會想要一次跳個 100, 1000 個 iteration 之類的。那可以這樣下:
下次再按 enter 會重複上一個指令,於是就會以 1000 個 iteration 為單位作 break。
我很久沒用 VC,不過可以想見這在 VC 之中應該是選單拉來拉去才能完成。gdb 的學習曲線較陡一些,但上手之後會不少人都會喜歡上這簡潔明快的節奏感。其實 gvim 啦、gcc 等等也是如此,算是 opensource 工具很常見的一個共通點。
SVN 30 秒就上手
Subversion,通稱 SVN,是個很好用的版本控制系統,在這邊寫一下 create 一個 project 時最常用的幾個指令。
如果沒有 svn 的話可以下一行指令就裝好(Ubuntu, Debian):
首先要作的是開一個存放 svn 所需檔案的地方:
切到打算要匯入的 project 路徑下,用這行指令 import 進去:
路徑前面要加 file:// 因為偶爾我們會用不同的協定如 http:// 等等
接下來可以大膽的把原來的 directory 刪掉,再 checkout 一份有 svn 加持過的:
rm -rf project-name
svn co file:///home/user-name/svn/project-name
這樣就搞定了。在 svn 加持過的這個 workspace 裡面就有完整的 svn 功能。之後如果有改就用 svn ci, svn up 等等去 update。到此為止應該很簡單,最後附上一份 manual 給大家參考。
Tags: SVN, VersionControl
半瓶醋的 C++ 教學(第六章):開源流萬世一系不敗經典 Hello World 實作
基本上到目前為止好像都在閒聊(汗),還是讓我們進入實際操作吧,在這邊我們寫一支編程界的經典 Hello World 出來。
Hello World 本質上是一支連玩具都稱不上的程式,但透過寫作,她可以讓我們了解編程的最基本流程,並確認環境設定無誤。我記得自己剛開始編程的時候對環境的設定反而比較苦手,不知道什麼部分該用什麼,不然就是知道該用什麼卻必須一直辜狗;相較之下,語法的部分一開始超簡單,看看書沒兩下就懂了,所以在這邊,如同第零章所述,我想補的是一般書籍的不足,語法部分就請大家在第一章的推薦書籍之中自修一下。
首先在第四章我們提過了編程環境的選擇,當中我推薦用開源環境來編程,所以在這邊我介紹的是開源流的編程方式,M$ 流的也不難,基本上就是想辦法搞到一片 VC(到底有多少人用正版的?科科),打上 Hello World 再按某個鈕就好了,非常簡單,兩者的差異大致上就像自排車手排車一樣。自排車好開,但要充份享受駕馭極速機器的快感唯有手排,沒有人開藍寶基尼在開自排的吧?
OK,咱們開始吧。
Tags: APT, C++, G++, Linux, Makefile, ProgrammingArt, Ubuntu, Vim
Ubuntu 下 rmvb 沒聲音
有時候播 rmvb 會沒聲音,不需要灌 plugin,只要調一下參數就可以。編輯 ~/.xine/catalog.cache,找到 [/usr/lib/xine/plugins/1.1.4/xineplug_decode_real_audio.so] 這段,將 decoder_priority 調高為 10 即可:
size=11300
mtime=1171041406
type=131
api=15
id=realadec
version=10104
supported_types=52494336 52559872 52756480
decoder_priority=10
參考資料:
argh no sound in rmvb @ Ubuntu Forums
Tags: Linux, rmvb, Ubuntu, Video
Linux Find
- recursively 殺掉同樣副檔名的檔案(以 jpg 為例)
find -name “*.jpg” -exec rm {} \;
-exec 找到以後對這些檔案執行的指令
{} 會被代換作檔名
\; 表 -exec 指令結束,為特殊字元,故需 back slash - recursively 殺掉除某副檔名以外的檔案(以 c, cpp, h 為例)
find ! -regex ‘.*\.\(c\|h\|cpp\)‘ -exec rm {} \;
! 表反向選擇
有點小複雜但是相當強大。身為一位巫師應該經常將自動化放在心裡。而這點正是 Linux 優越的地方。附上連結一枚:
Using the find command
Ubuntu 無線網路設定
把 Ubuntu 灌好,正常來講網卡都可以抓得到,訊號應該也沒問題。只要在 ESSID 的部分指定好你要的 AP 就可以。
若不經 WEP 加密的 AP 可以說是灌好馬上就可以用;經過加密的卻稍微麻煩一點,之前用內建套件輸入 encrypted key 不知為何並不能使用,應該是隻 bug。經過爬文之後大約歸納出三個 solution:
-
sudo gvim /etc/network/interfaces
編輯形如下式:
iface eth1 inet dhcp
wireless-essid tokyomod
wireless-key s:meoap# 加 "s:" 表 ASCII,不加則為 HEX
經過測試,此法可以使用,不過要 reboot 或 hibernate 重開
-
$iwconfig ath0 key XXXXX
尚未測試。
-
sudo gvim /etc/pcmcia/wireless.opt
大致上同 1,不過還沒測過。
Tags: Network, Ubuntu, Wireless
cout 與 printf 效率比較
平常寫 research code 比較沒什麼感覺。最近無聊寫起 UVa Online Judge 就對效能比較在意一點。
今天才知道原來 printf 比 cout 快、scanf 比 cin 快、\n 比 endl 快。
有興趣可以自己 print 一堆 hello world 出來試看看。我測的結果大致上是十比九左右。
Tags: C++, Efficiency, OlineJudge
C++ 底下 string 與 int 的互轉
string 要轉 int 相對簡單,用 atoi 即可:
using namespace std;
atoi(input_string.c_str());
但 int 要轉 string 就麻煩一點,雖然 itoa 這個 non-standard function 也不算太不常見,但不在標準裡面,最起碼 gcc 就沒支援。標準的作法應該是用 stringstream:
#include <stringstream>
using namespace std;
stringstream ss;
ss << input_number;
cout << ss.str() << endl;
三個問題:首先、atoi 本身名稱有點醜。第二、有 atoi 卻沒有 itoa 是很莫名的不對稱性。第三、用到 stringstream 增加不必要的複雜度。有時候不得不承認 C++ 語法是太過駁雜不純了一點。string int 互轉又很常用…
p.s “>”, “<” 在 code snippet 當中會爛掉,爬了一下 google 暫時沒找到 solution,有空再回來修。若有其他 code display plugin on wordpress 也網友們推薦,找很久了。= =
半瓶醋的 C++ 教學(第五章):編程語言的軍團論
編程界裡面有許多爭論不休的話題。語言之爭是最主要之一。就像宗教有各種流派一樣,信或不信有時只是個人價值觀,這種爭論說起來就跟宗教戰爭沒什麼兩樣。
我自己的看法是這樣,就像一個專業的投手需要配球一樣,一個專業的 programmer 也至少需要兩種以上用起來順手的語言。用軍隊來比喻或許更為恰當。一支現代化的軍隊不可能只有步兵,也不可能只有重裝甲部隊。根據戰略戰術需求的不同,在兵種之間取得適當的平衡,才能讓戰力達到最大化。但兵種之間,比方說,戰機到底要裝備蘇系的 SU-27 還是美系的 F-22 就看各人喜好了。只要記得在這個講究制空權的時代,買戰艦的時候別去買到過時的巨大戰列艦大和號就好。
Tags: C++, ProgrammingArt, ProgrammingLanguage


