初探 TR1 function object

最近的專案常常需要更新 INI 設定檔,而最麻煩的事情莫過於太多零散的設定,你必須要記住 INI 檔設定的 key,再把在某個 object 的 member function 把值抓出來,最後再丟給 WritePrivateProfileString 之類的 function 把值更新進檔案。

所以常常就會寫出一堆噁心的 code 像是。

    obj.iniKey = "INI_SERVER";
    obj.iniValue = info.GetServer();
    UpdateByObj(obj);

這樣的話,有幾個設定就要寫幾次,所有的 Key 跟 Value 的相關性都顯得零散,未來要加上新的設定,也非得要再加上類似的 code 才行……。

忽然我就靈機一動,也許可以用 tr1::function 跟 tr1::bind 來做這樣的事情。

    struct proxyConfig
    {
        std::string iniKey;
        std::tr1::function<std::string()> func;
    };

    const proxyConfig configArray [] =
    {
        { "INI_SERVER", std::tr1::bind(&proxyInfo::GetServer, &info) },
        { "INI_PORT",   std::tr1::bind(&proxyInfo::GetPort, &info) },
        { "INI_USER",   std::tr1::bind(&proxyInfo::GetUser, &info) },
        { "INI_PASS",   std::tr1::bind(&proxyInfo::GetPass, &info) },
    };

    for (size_t i = 0; i < sizeof(configArray)/sizeof(configArray[0]); ++i)
    {
        obj.iniKey = configArray[i].iniKey;
        obj.iniValue = configArray[i].func();
        UpdateByObj(obj);
    }

靠著把 INI 的 key 跟 member function 建表就顯得簡單一點,並把更新的程式碼簡化成一份,未來如果要新增不同的設定,也只要更動表中的 INI key 跟所綁定的 function 就好。

不過後來仔細想想,其實只要在建表的時候寫成 info.GetServer() 就可以滿足我的需求了。

而 tr1::function 與 tr1::bind 絕對不是只有這點小技倆而已,真正使用的巧妙應該是 C++ Function Objects in TR1 所提及那種彈性而優雅地將 function 包裹成物件,能有改變的彈性,也能應時應地做出適合的調整。

如果你的編譯器還不支援 tr1,除了換一個之外,你還可以考慮一下 boost,也許更瞭解一點,會讓你的生活變得更好歐。

C++ Format String using boost::format

如果你只想寫純粹的 C,那你可以忽略這篇的資訊了,因為 sprintf 之類的 function 大概就可以滿足你了。那為什麼還要提到 C++?我想 C++ 的 string 對於程式設計者是美好的,因為我們不用擔心 buffer 到底需要多長,我們可能是無腦的利用 operator += 去操作這個字串,並利用提供的 substring 等 function 快速的開發軟體。

但在我甚少的 C++ 開發經驗中,我總覺得透過 operator += 以及 stringstream 等東西,並沒有辦法像 sprintf 那樣直覺而優雅的將變數置換至字串當中。

就以 Windows 常見的 INI 格式來說,我們如果要輸出一個 AppName,像是 [MyApp],可能的作法是

    output += '[';
    output += strSection;
    output += ']';

這似乎比傳統的 sprintf 要顯得複雜的多,也顯得不好閱讀……

    sprintf(output, "[%s]", strSection);

現在你可以考慮 boost::format

    std::string output = boost::str(boost::format("[%s]") % strSection);

讓你寫的 C++ 能有 sprintf 的優雅性,又不必太過於擔心 buffer 的操作。

至於一些 manipulators,與詳細的 formatting 的用法,就請你自己去看一下官方的說明吧。此外,我覺得 python 的 formatting string 能吃 dictionary 也實在是很棒,而且很優雅的寫法。

    print "%(key)s %(key)s" % {'key': 'yoyo'}

在 boost::format 雖然只能這樣寫,但也聊勝於無了。

    std::cout < < boost::format("%1% %1%") % "yoyo";

某些情況下,你會考慮用 boost::lexical_cast,而捨棄 stringstream 等,不過也容許我提醒你一下,boost 會讓 object 變得肥上不少,至於怎麼取捨,就端看你的選擇了。

期待與失落

難得我這個時候還在公司,就放下耳機,寫寫今天的事情吧。

我常常在想人所謂的不滿足到底是什麼呢?是不是一種期待的落空呢?例如我們可能對工作或是情感上有所期待,或是渴望獲得某些層面的關心與尊重。如果沒有獲得預期心理某些程度的滿足,也許就會一點一點的侵蝕了自己,也侵蝕了彼此的關係。

生活中好多小事都是這樣,我好像是帶著一個既定事項的條列式,逐一等待打上勾勾的瞬間。我想,我總期待著別人帶著和緩的語氣,也期待著別人給予我夠多的回應,也期待別人在我想認真的時刻,能聽見我內心的需要,又或者是,工作可以朝著我喜歡的方向走,但這一切卻總是事與願違。我想我所有的不快樂好像都源自於此。我想我願意接納某些不同,但似乎一點一點的失落感,慢慢的累積與擴大,我只得每天試著重新振作起來,試著有耐心、愛心、尊重,用盡力氣去接納這些我所不願意的失落們。

我想我是逃不掉的,而那時常激勵我的,是「愛人如己」這句話,那種願意去聆聽、願意承擔責任、願意改變自己老我的心智。我只能這樣祈求,每天的每天,我面對自我的期待之時,是不是可以放下那種失落的苦痛,願意站在別人的角度來看,在言語行為上都做個良善的人。

我是這樣想的。

今天在公司看 APPLESEED 這部電影,老實說我覺得相當不錯啊。我總覺得我心目中一部好的電影,必須具備某些層面的隱喻性,然後藉由文字與情節的張力投射在觀眾心中。像是 EVA 揣摩著人類最終的結局,這部電影,也或許如同太多電影一般,探討人類對於世界的價值與意義(像是「Matrix」、「廢棄王女」)人是不是應該被抹除於這個世界,人是不是因為具備了原罪而失去了價值,人最終的結末是不是走向一個巨大的靈?而人類卻還在這世上,即使擁有罪性,卻還努力不懈的。而那最終將人類推往時間潮流的,是選擇人類的命運,又或者說是上帝之手吧。

還有一件工作上的事情很棒,不過就容許我保密吧 :D

近況

monitor

一隻迷路的熊,躲在螢幕後面窺視著。

太久沒寫些什麼了,其實有很多東西想寫,卻被擱在腦後,像是前些日子的林憶蓮演唱會、黑鬚馬偕、時間殺人、渺渺,還有最近的一些事情。

我並不討厭這種時間被緊緊壓縮的生活,甚至有些習慣,習慣讓生活有步調地進行下去。像是回家之後不開電腦,做點簡單的運動之後洗澡,再讀一點小說、聖經,或是一點點電腦書,也聽聽 iradioRose 說著「愛自己、愛別人、自由自在的過生活」。如果隔天身體不感覺疲憊,就 7:30 起床跑步,然後 9:00 左右進公司。

這段日子裡,我想起杜明翰會長所說的「遇見自己」這件事情。其實自己是怎麼樣的人,自己過得怎麼樣的生活,自己都瞭然於心。而「遇見」或許是一種「承認」和「瞭解」,我總有兩個面相,是多話、歡愉、熱情的,同時也是冷靜、沉默的。現在來說,我終於能理解,因為有這樣的兩種面相,才是現在的我。

而最近的生活很簡單。我喜歡最近在職場中學到的許多東西,像是 RAIIDesign Pattern,還有很多我先前都沒想過的事情。也因為 cibs 的加入,我的晚上不只是加班了,偶爾會有一些新奇好玩的活動,這像是一種既定模式的改變,改變我的思維,還有許許多多看不見的事物。

只是有時候新生活運動只能維持幾天,我只能希望這次不只是三分鐘熱度。而時節流轉,十二月就這樣到了,希望在最後的一個月,我的心還能慢慢安定下來……。

靈魂的容器

我的心有兩個面向,一面是以心物二元論駁斥,又有者以「唯物主義」陳樹立論著。神經科學、認知、人格創造、精神疾病、Inner Self Helper、聖靈,太多的觀點在我面前開展。《當天使穿著黑衣出現》細述著一個人走向精神分裂的種種,童年記憶、人格,還有人生道路上的種種際遇。

有時候我也會自我解析,解析自己為什麼是這個樣子的人。是像大家說的這樣,我的個性像媽媽,那如果是的話,那又是源自於我童年的哪一段原生記憶?我的每一個悲傷與回憶,是不是慢慢的雕塑而形成現在的我。巧的是,我在兩個禮拜前聽蔣勳講「高更」的種種。我總覺得他所謂「蠻荒肉體的奢華」與婚姻關係的反動,似乎都來自於生命中某種不可承受的輕,又或者是某種不可抹滅的記憶。

我想起「卡夫卡」的蛻變。一個從未離開奧地利的男子,飽受資本主義與世界眼光的侵蝕。他寫的《蛻變》是誰?是誰眼中的巨蟲?是哪個世界所厭棄的?而那到底是心靈的扭曲,還是生命的變形?

而有人說憂鬱會讓腦部的負面情緒增大,進而產生某些化學物質,驅使人走向憂鬱症的牢籠。而某些化學物質的分泌,也造成人具有憂鬱症的傾向。而這到底是雞生蛋還是蛋生雞?我們的思想與靈魂本身,是不是被收納於這脆弱而不穩定的容器當中?我們以靈魂驅使肉體,而肉體卻也同等影響靈魂。

我陷入了唯物主義中。

而問題總沒有解答。就如我過去與自己爭論的一般,究竟「外在環境」或是「內在心靈」,何者握有決定性的權柄,足以改變人,改變性格。舉個例子說,到底是「美麗的風景」使人心情愉悅,還是「能夠欣賞風景的心靈」能夠讚賞美麗的風景呢?

靈魂的容器啊,這條路的終點是什麼呢?人的解釋太少,太薄弱,我只得觀看,以那僅剩的理性與與感性思索評估著,這看似豐潤而美好的一生。

ubuntu 8.10 初體驗

ubuntu 8.10 screenshot

上個禮拜把 ubuntu 升級到 8.10,今天稍微玩了一下,以目前來說狀況還不錯。之前 gcin 選字框動不動會『灰掉』的問題,目前也沒有再發生了,還是發生了….。

之前在公司 study group 展示投影片的時候遇到的 Asus Fn + F8 的問題似乎也有解了。

也不知道是錯覺還是怎麼樣,換上 Linux kernel 2.6.27 之後似乎速度也有一點提升,在我這台古老的 Asus M2N 上面特別有感覺。

只可惜沒有 OpenOffice 3.0,然後國外似乎也有人做了有趣的 Benchmark,你可以參考 Ubuntu 7.04 to 8.10 Benchmarks: Is Ubuntu Getting Slower?,至於可信度以及爭議程度,Slashdot 上超過 500 個 comment,這就容我不妄加評斷了。

11 月的幾場藝文活動

最近實在花很多錢,剛好有好多想看的藝文活動在 11 月。

目前的計畫是這樣

這樣算起來,這個月就花快 5000 在藝文活動上(陳綺貞就佔了 2500……),我實在窮苦阿~~~~

其實這篇文章的目的不是在喊窮苦,如果你對這些藝文活動有興趣,我想你可以趕快開始買票了。其中選電光滾石的一個理由是,我之前出差的時候在座位前的雜誌有看到這部電影的介紹,沒想到這次金馬影展就上了這部,所以我想都沒想,就請 jnlin 幫我劃了這場的位子。

黑鬚馬偕則是我電控學妹告訴我的,不管你知不知道馬偕這個人,他對台灣的貢獻,真的是以一種很特別的存在存留在台灣這片土地上(我想絕對不只是你耳熟能詳的馬偕醫院)。目前 600 和 900 的票大概都賣得差不多了,所以要買票的真的要快!

看著薄薄的荷包,我想我的 11 月一定會非常充實的(專案一起充實!)。

p.s. 這個月還買了 OasisStop the ClocksJason UptonBeautiful People,還有某片 Debussy 的 CD。然後我還預定了陳珊妮的「如果有一件事是重要的」。算一算,我的薪水都跑去這些東西上了啊。