搜尋此網誌

工商服務

2009年4月22日 星期三

[食記]台中大業路上的Mojo Coffee





之前viki忘了什麼原因找了幾家台中的咖啡館,其中有一間叫做Mojo Coffee,位在大業路上,只與我們最近幾乎每個禮拜都會去的婚紗館相隔幾條街而已。

禮拜六這天(4月18日)有備而來,先查好了Mojo Coffee與婚紗館之間的相對路線,所以很順利就找到了地方,不過門面果然如同網友所言,實在有夠不明顯的,害我小小倒車了一下,XD。

當時大約三點半,裡頭座無虛席(店小也是原因之一),舉目望去有兩堵書牆,光這點就足夠吸引我的了,呵呵。而且仔細聽老闆(女的)跟客人的對話,就知道來的都是熟客。

當天我點的是「愛爾蘭咖啡」,超大一杯,甜味偏淡,咖啡則甘醇香濃。viki點的是「蔓越莓蘇打」,喝起來就像汽水那樣,上面還有一團香草冰淇淋。至於點心方面就比較缺乏了,似乎只有手工餅乾而已,不過老闆很大方地建議我們可以直接外帶對面星巴克的蛋糕。

嚴格說來,店內除了書櫃和咖啡香味所營造的人文氣息之外,最酷的當屬牆上張貼的字畫,字體和句子都很妙,外加超有意境的油畫,猜想應是出自老闆之手。

另外也發現原來大業路的這個區域是很多咖啡館的聚落,不少賣吃的店家也都相當別具特色,下次要再來努力尋寶看看。

連結:Mojo Coffee的地圖官網

[Qt密技]如何撰寫主控台Qt應用程式並且在命令列輸出文字?

要在主控台螢幕(Windows平台上面叫做「命令提示字元」視窗)上面輸出文字,有三種呼叫方式:其一,加入#include <QtDebug>(包含於QtGui表頭檔內,若已加入#include <QtGui>則可以省略這行)以便使用qDebug() << arg語法,至於qDebug("...", arg)語法則只需加入任何Qt表頭檔即可使用;其二,若想要透過C++的std::cout來輸出,則需要加入#include <iostream>;其三,使用C的printf()函式也無妨,並視需要加入#include <cstdlib>(所謂的視需要是指如果編譯器有發生錯誤的話才加入)。

針對C的語法,若要將QString的內容轉為printf()可以接受的字元陣列,需要多呼叫兩層,亦即先用toAscii()轉換、再用constData()取值,所以Qt裡面內建了一個方便的巨集,叫做qPrintable(),協助完成這兩個動作,以免每次都還要努力回想QString轉換成char*的步驟。

但是不管是挑選上述的何種方法來實現在命令列上面的文字輸出,都務必要在.pro專案檔內加入「CONFIG += console」這行敘述,否則無論是qDebug、cout或者printf都將不會顯示結果出來。換言之,在撰寫命令列的主控台應用程式的時候,這行敘述是絕對不可或缺的(除非「qmake -project」指令自己有偵測到該應用程式為主控台類型),否則將無法看到輸出結果,甚至可能還會誤以為是程式邏輯發生了什麼錯誤。

事實上,「CONFIG += console」是啟用主控台輸出的開關,與應用程式是否透過QCoreApplication的exec()來執行是無關的。

附帶說明,當我們將Qt應用程式執行起來的時候,基本上只有一個執行緒在跑,也就是主執行緒。像這樣:

#include <iostream>

int main(int argc, char *argv[])
{
  SomeClass w;
  w.someFunction(argv[1]);
  std::cout << "done" << endl;
  return 0;
}

並不見得每個Qt主控台應用程式都需要一個QCoreApplication物件,但是如果應用程式必須等待和處理相關事件的話(比方說接收底層物件傳遞上來的signal訊號並且做出反應),那麼就需要建立QCoreApplication物件,並呼叫其exec()來執行應用程式了。像這樣:

#include <QCoreApplication>
#include <iostream>

int main(int argc, char *argv[])
{
  QCoreApplication app(argc, argv);
  SomeClass w;
  w.someFunction(argv[1]);
  std::cout << "done" << endl;
  return app.exec();
}

我們姑且稱沒有GUI介面的為主控台應用程式,建立QCoreApplication而非QApplication物件,可以避免連結到不需要使用到的QtGui程式庫。另一方面,針對QCoreApplication,因為將會形成一直在等待事件的迴圈,所以即便邏輯運算已經完成了,程式還是不會結束,因此必須手動按下〔Ctrl+C〕組合鍵,或者是讓某個功能處理完畢的signal訊號來觸發QCoreApplication的quit(),如此程式才會順利返回,示範如下:

QCoreApplication app(argc, argv);
QObject::connect(someObject, SIGNAL(someSignal()), &app, SLOT(quit()));
return app.exec();


2009年4月21日 星期二

正式停用JARSING.IDV.TW網域相關服務



這是我註冊的第一個網域名稱(2001年1月4日向PC home購買的),一開始的目標是作為第一本翻譯電腦書的支援網站,放一些勘誤之類的資訊。但是有好長一段時間,首頁上頭都只有「Under Construction」的建構中字樣而已。

後來總算演變成有點像是履歷表般的條列出版作品的清冊網站,雜誌上的文章啦、翻譯的書籍啦,諸如此類。隨著出版的累計文章數量破百,第一份國防役的工作也果然順利找到,一轉眼也快畢業了。目前這個網站維持在個人形象之類的功能,並未提供任何比較特殊的服務。不過這些都是題外話啦。

其實一開始就打算申請.COM國際網域名稱,忘了什麼當時克服不了的原因才註冊了.IDV.TW個人網域名稱,有可能是不諳國際網域名稱的申請流程吧。因此3年後的2004年1月10日正式把網站和信箱都更改為JARSING.COM,但是依然持續擁有JARSING.IDV.TW網域名稱,從WHOIS系統的資料來看,要到2011年1月6日才會到期,之後也許還會一直續約,畢竟那是掛我名字的第一個網域。

至於分別於2009年4月中旬相繼到期的轉址和信箱服務則不再續約了,宣告正式停用。前者會把JARSING.IDV.TW的網頁連線重新導向JARSING.COM,後者則是viki慣用的信箱(但是她已經被我勸退改用Gmail了,這東西容量又大又免費),這樣一年可以省下600元新台幣的費用(使用的都是智邦生活館的服務)。網址的註冊費用則大約年費400元(TISNet),一次買個五年還可以享有折扣。

2009年4月15日 星期三

定期定額好靚,所謂淨值低點時買進更多單位數原來是這麼回事



歷經了慘澹且慘痛的投資價值縮水時期,國外有美國的金融風暴,國內則是新政府上任後的股市急跌。

無奈芸芸眾生往往都是事後諸葛而非未卜先知,所以總是在下跌的初段就搶先佈局而耗盡銀彈,未能在真正的低檔危機入市,然後又在跌得最深的時候才想到要停損賣掉,於是賺不到反彈的那波好行情。

我只有買基金,將近這一年來,單筆、定期定額輪番上陣,後來幾乎全部都跌到令人傻眼的-50%,投資價值縮水一半。但是隨著最近的全球經濟局勢回檔,我發現定期定額確實可以分散投資風險,因為從報酬率來看,定期定額的績效大約是單筆投資的兩倍,國內、國外的基金皆然。

以往聽到「基金淨值低點時可以買進更多單位數」或者「定期定額是長期投資」之類的概念都什麼特別的感覺,直到這回固守著沒有贖回而且持續扣款,才終於有點感受到定期定額的威力了。舉例而言,我的永豐永豐基金,當台股從近萬點逐步下滑的時候,在八千點附近買入的單筆投資還在-20%附近徘徊,但是從去年5月買到現在的定期定額卻已經彈升至15%了,一正一負之間績效就相差了三成以上。

之前因為人心貪婪手癢單筆加碼的部分,投資績效遠輸於定期定額,我想原因就在於「每次自己覺得是低點的時候,都還不是真正的低點」,所以未來如果還是需要單筆投資的話,應該要秉持兩項原則:一、單筆投資要用閒錢,不要佔用到定期定額的預備資金;二、加碼時機或許不是-20%,而是-50%,因為後者才是人心低迷的所謂「危機」時刻。

另外一個很重要的感想就是,市場的漲與跌往往都超乎預期,經常一不留神指數就拉了好大一波,真的可以說是瞬間就把賠的都賺回來了,所以熊市的時候一定要告訴自己不必擔心,更精確地說是不要嚇到亂停損,除非缺錢,否則最好別賣,因為熊市之後必然會是欣欣向榮的牛市。再者基金跟股票畢竟是兩碼子事,嚴格說來基金應該是要只停利而不停損,因為展望的是長期報酬。

新聞:熊市反彈 定期定額勝單筆投資

【2009.04.17 updated】

[Qt密技][新手當心]在衍生類別時,別忘了將其基礎類別初始化!



不知道是腦殘還是怎麼來著的,最近在開發衍生自QWidget類別的GUI應用程式的時候,功能不僅好像沒動作,還在關閉視窗時遭遇了詭異的執行時期錯誤,而且程式本來都還執行得好好的,直到後來類別越寫越多時問題才浮現出來,囧。

這個問題耗費了我不少時間,信心也為之動搖,甚至同樣的程式碼邏輯還更換了好幾種不同的寫法,最後才發現原來是因為:在衍生QWidget類別時,沒有傳遞適當的參數給基礎類別QWidget的建構式去進行正確的初始化。

我是無意間才發現自己在衍生類別的建構式當中遺漏了這個步驟,信手翻閱《C++ GUI Programming with Qt 4,2/e》和《C++ Primer中文版,3/e》,果然在裡頭找到了我想知道的理論部分,前者在第16頁,後者在第48頁。

一般而言,我們在開發GUI應用程式時,比方說撰寫一個繼承自QWidget的簡單畫面,其類別定義會長得像這樣:

class Window : public QWidget
{
  Q_OBJECT
public:
  Window(QWidget *parent = 0);
  ~Window();
private:
  bool isActive;
  int count;
};

然後在實作其建構式的時候,會在成員初始化序列(member initialization list),也就是以冒號(:)引導的那個段落裡面,將parent參數傳遞給基礎類別(此處即QWidget)的建構式,透過此機制來進行基礎類別的初始化。像這樣:

Window::Window(QWidget *parent)
  : QWidget(parent)
{
}

附帶說明,成員初始化序列的作用顧名思義就是可以透過小刮號((...))來對類別的資料成員進行初始化,並且以逗號(,)分隔開來,例如:

Window::Window(QWidget *parent)
  : QWidget(parent), isActive(false), count(0)

我就是因為少做了這個「在衍生類別的建構式的成員初始化序列裡面,將相關資訊傳遞給其基礎類別以便順利進行初始化」的步驟,才會導致遭遇執行時期的錯誤。理由是:基礎類別的建構式並不會被衍生類別繼承下來,因此必須透過衍生類別的成員初始化序列來獲得參數,以便進行所需的初始化動作(如果有的話)。換言之,針對本例,基礎類別QWidget未被適當呼叫建構式來進行初始化,是導致程式遭遇執行時期錯誤的原因所在。

檢視Qt 4.5裡面的QWidget和QObject類別原始碼,都可以發現這個步驟是很重要的,因為它們的建構式確實需要一些參數來協助完成其初始化。摘錄如下:

QWidget::QWidget(QWidget *parent, Qt::WindowFlags f)
  : QObject(*new QWidgetPrivate, 0), QPaintDevice()
{
  d_func()->init(parent, f);
}

QObject::QObject(QObject *parent)
  : d_ptr(new QObjectPrivate)
{
  Q_D(QObject);
  qt_addObject(d_ptr->q_ptr = this);
  d->threadData = (parent && !parent->thread()) ?
    parent->d_func()->threadData : QThreadData::current();
  d->threadData->ref();
  if (!check_parent_thread(parent, parent ? parent->d_func()->threadData : 0,
    d->threadData))
    parent = 0;
  setParent(parent);
}

所以這裡可以歸納出一個非常重要的結論,就是:在某些類別裡面,即使衍生類別似乎並不需要建構式來做些特別的初始化工作,但是最好還是別忘了撰寫其建構式,因為可能至少還是要在成員初始化序列裡面,將必要參數(如果有的話)傳遞給基礎類別的建構式,否則在某些情況下,可能將會因此而導致程式發生錯誤。相反地,解構式就沒這樣的考量了,如果沒有特別的資料成員需要被釋放的話就可以不寫,反正衍生類別的物件在解構時會自動去呼叫基礎類別的解構式來歸還系統資源。

哇,C++與Qt應用程式框架裡面的類別庫真是博大精深呀。

2009年4月14日 星期二

啟用投稿監督計畫後之第2個月成果檢討



單純從數據面來看,本期比約定的門檻6,500多出了989個字,目標達成率是115.21%。但是再次拖稿,直到4月1日晚間才透過電子郵件寄出投稿,所以約定的罰金是1千元。

回過頭來看這次寫稿不順導致再次拖稿的主因,在於太慢才動筆,直到3月24日才如夢初醒般地意識到截稿日期已經迫在眉睫。然而動筆太慢不打緊,還嚴重地違反了SOP最核心的那條「先寫程式再寫文章」的建議,導致在潛心剖析Qt Demo Browser的同時,還要構思文章段落分配,猶如蠟燭兩頭燒。

所以我覺得以後還是這樣分工好了,盡量前半月就把要寫或者要看的程式碼搞定,然後後半個月就可以很專心地來琢磨文章的描述字句了。

在寫作效率方面,本期的日產出大約1000到2500字,視當天寫作手感以及工作時間長短而定(平日晚上約3到4個小時,假日則是整個早上和下午)。

事實上,大概要6,000字左右才能夠完整展示一個以範例為導向的文章,至於2,000字約兩頁的那種只能夠算是小品文了。但是平心而論,後者這種篇幅的文章比較容易吸收,所以有時候興致一來寫到爆錶的10,000字,就不知道人家讀者想不想看了,甚至徒增排版上的困擾(陷入是否拆分成上與下的兩難)。

2009年4月10日 星期五

[食譜]我的咖啡新泡法──奶粉+熱水+咖啡



公司裡面有台公用的免費無限暢飲咖啡機,隨時有不同品種的新咖啡豆上架,砂糖、奶油球和攪拌棒同樣也是應有盡有。

但是因為奶油球這玩意兒不是啥好東西,於是索性動起了罐裝奶粉的腦筋。並未使用盒裝鮮奶的考量點在於,即便是最小盒的,也得分好次才用得完,但是冰著的牛奶加到熱咖啡裡面,咖啡就涼掉了,如果因此而先將牛奶微波加熱的話,加熱過未用完的牛奶又要再次拿回去冰,好像也不太好。至於只放100毫升的牛奶在馬克杯裡面直接拿去微波,又感覺好像會爆炸,XD。

總而言之,我發現有個比例還不錯喝,100毫升的奶(一匙奶粉加熱水沖泡而成)兌上200毫升的濃咖啡(選擇最強濃度是因為奶粉泡的牛奶比較水,會稀釋咖啡的味道),最後再加上一包砂糖。這樣的泡法奶味很夠,而且很順口,不會酸(拜牛奶所賜)也不會苦(拜砂糖所賜),口感絕非以前的奶油球所能比擬。

所以牛奶與咖啡的比例是1:2,網路上遍尋不著所謂的拿鐵咖啡的正確調和比例,各種說法都有。但是起碼我知道不會是1:1,因為如果是這樣的話,那玩意兒應該叫做梅蘭錫咖啡。這個名稱我絕對忘不了(儘管我從未在任何餐廳的菜單上面看到過),因為那是我首篇見報小說的篇名,讓編輯驚豔因而打電話給我的,也正是這篇,雖然她可能老早便忘記了,但是我永遠都會記得這項激勵我創作小小說的催化劑。

【2009.04.17 updated】

2009年4月9日 星期四

去婚紗館挑選拍照用禮服紀事

※2009年3月22日挑選拍照用禮服:距離訂婚還有21週,距離結婚還有28週。

挑選拍照要穿的禮服這件事情是之前就已經先預約好的(至於挑選訂婚和結婚要穿的,則要另外擇期再看),一個時段是三小時。所以3月22日這天下午4點鐘,我的小鴨鴨便浩浩蕩蕩地擠進了四位美女,扣除準新郎我本人開車以及準新娘之外,還有一位是準新娘的妹妹加上另外兩位是準新娘的表妹來幫忙決定服裝順便見習。

挑選的地點就在「羅蔓羅蘭」婚紗館的二樓,果然是需要事先預約的,因為一去就發現好多隔間裡面都已經有人在了。基本上,一個隔間就是一個大約兩坪大小的空間,四周是掛著一些衣服的衣櫥還有幾面大鏡子,溝通完可能適合的禮服之後,準新娘便拉上布幕開始換裝,負責挑選禮服的小姐會在裡面幫忙,不一會兒就換好衣服了(速度真的超快的)。拉開布幕的瞬間就像是在走伸展台一般,時而雍容、時而華麗的準新娘就那樣出現在我們眼前,這幅景象十分有趣。而且拍照要用的禮服非常神奇,因為上頭修改過的線頭很明顯、布料也挺粗糙的(總之與那些給賓客近距離看得到的禮服截然不同),但是拍出來的照片卻可以是美美的,真是太神奇了,呵呵。

儘管一次預約時段可以有三個小時的充裕挑選服裝時間,不過我們只花了一個半小時左右便搞定了。因為負責挑選禮服的小姐夠專業,她幫我們挑選的衣服與新娘子本人以及拍照地點情境的搭配相當不錯,所以六套禮服一下子就選好了,有完美展現新娘子身材的改良式旗袍,也有適合在海邊扮演飄逸的那種絲質長紗。

Anyway,今天最大的收穫就是看到準新娘穿上那些漂亮的禮服,真是令人心曠神怡呀,礙於婚紗館不准攝影,所以沒辦法貼圖以饗各位,只好請大家等著看婚紗照成品吧^^。期待(其實是有點兒緊張)4月13日禮拜一素人粉墨登場的婚紗拍攝日。

2009年4月8日 星期三

我與相關出版品的合照,兼談未來想做的工作第002號











「向村上春樹看齊」是我最近的MSN暱稱。

一直想找個時間把我的相關出版品(翻譯的、投稿的、報紙的、書籍的;BTW,大部分時候,朋友發現我有在寫作,反應都是非常驚訝)堆起來,看看到底有多高,終於在3月14日這個禮拜六將這個小小心願付諸實現了。

答案是:有120公分那麼高(涵蓋8家雜誌社和4家出版社),從照片上來看,大概快到胸口處而已。

雖然還不到著作等身的程度,但是來日方長,還差55公分就可以達成了。況且事後結算起來,還遺漏了三本雜誌,也忘記堆上那個裡頭放了三十餘篇報紙剪報的黑色鞋盒,另外也沒有計入非紙本的網路電子報文章。

總而言之,當天的心情相當地興奮,瞧我還捧著特輯是村上春樹的雜誌,以及拿著我看過的第一本村上春樹的小說來合影。未來如果有機會需要用到筆名的話,我會考慮叫做「村上龜」,至於為什麼是烏龜嘛,因為那是我喜歡的可愛小動物。

其實一直很嚮往村上春樹的生活,他四處旅行長住,寫小說,也做翻譯。我目前正在做的事情,如果真的硬要扯上關係的話,大概與他的有一兩分相像,所以我把村上春樹的生活當作我未來想做的工作第002號,亦即寫作、翻譯、雲遊四海、荷包還滿滿、生活愜意得很。

Jeffrey's英文急診室使用心得

那是我2007年的聖誕節禮物,非常棒的禮物。是我向viki要的,因為我向來偏好比較實用的東西,ㄎㄎㄎ。

整套教材共有上中下三冊、12片CD、84個回合,外加3片只含複習部分音軌的CD。

在架構上,每個回合會有四段情境,例如買褲子之餘,當然還會有買裙子、鞋子和領帶之類的。這些情境會話的開頭都有個摘要框(之後聽複習CD時就是只有播放這個部分),接下來是這段摘要框內容會話的稍微再變形,基本上都是把同樣的問答句子換個形式演練而已(例如Can I變May I,買a pair of pants變成買a pair of blue jeans),也就是說不離剛開始那個摘要框的內容基調,因此也不會太龐雜,算是相當容易吸收。

這種不斷反覆唸誦近乎重複性質的問答句子的方式,也就是這套教材所稱的「母語學習法」(以練習「聽」來啟發「說」),我個人覺得還滿有用處的,在潛移默化中,有些時候當聽到類似的問句時,相對應的答覆就會脫口而出。

值得一提的是,情境配音也很不錯,開門的聲音啦、腳步聲啦之類的,甚至還有過場音效哩。

我個人覺得用半小時左右的時間專心看完課文再聆聽數遍,效果會比較好。推薦給想要加強英文口語「聽、說」能力的人。

訂購網站:ICRT Store

2009年4月5日 星期日

第8趟單車上寶山行程,首度達成全程無牽車記錄!


↑轉過了一個彎,即將騎完第一個漫長的陡坡,到達夢寐以求的休息點。


↑快騎完第二個長上坡了,從拍照者站立處右轉就是寶二水庫的管理局。


↑寶二水庫前的合照,似乎除了我之外,沒人在乎快門已經快要按下了。


↑大轉彎後竹林旁短而精實的上坡路段,這是以前第三個常會牽車的點。


↑今天這趟單車行的高度圖。

扣除一次半途而廢、一次從竹東走、一次因雨繞捷徑,嚴格說來,這趟(3月26日)是我們第五次走相同的22公里繞行寶二水庫路線,同時也是我個人首度完成「全程無牽車記錄」的歷史性時刻。

以往總會牽三次車的那個傢伙,已搖身一變成為不知牽車滋味的真男人了,哈。不過那幾個長坡還真是有夠嚇人的,那種茫茫苦等到達山頂平地的恐懼感超級難熬,總要經過無數根電線桿,轉了幾次彎才會抵達休息點。

關於今天這趟的心得是:我覺得一方面是有練習有差,經過了幾個月(第一次上山是去年的12月12日),腿部肌肉與體力終於有辦法支撐攻頂能量,而且還狂瘦了5公斤左右(主要還是因為忌口啦,每餐以八分飽為限,洋芋片、可樂、薯條照吃,沒特別用啥變態的節食法,但是也不能夠說騎車完全沒幫上忙);另一方面則證實了心理因素才是自己最大的敵人(向來如此,無論什麼事情都是這樣),因為這天的天氣起初還有點寒冷,直到登上寶二水庫、太陽露臉之後才溫暖起來的,但是冷空氣並未擊退我們騎完全程的決心;在騎車技巧方面,調整呼吸,踏著緩慢而規律的步伐,不要在遇到上坡的一開始路段就逞強用盡氣力,是很重要的原則。

話說回來,無牽車的另一項好處是整體騎車時間縮短了,大約提前了15到20分鐘回到宿舍沖澡。