深坑豆腐第十一彈迎新夜騎
深坑豆腐第十一彈迎新夜騎,為了歡迎新人 Benjamin,由 team leader Scoppen 領軍,除了出差英國的幾位同事外,Duncan, Kaiwen, Paul, Benjamin, Ike 和我,一起到久違的深坑吃豆腐。上次吃豆腐已經不知道是多久以前的事了...

深坑豆腐第十一彈迎新夜騎,為了歡迎新人 Benjamin,由 team leader Scoppen 領軍,除了出差英國的幾位同事外,Duncan, Kaiwen, Paul, Benjamin, Ike 和我,一起到久違的深坑吃豆腐。上次吃豆腐已經不知道是多久以前的事了...

第一次出國,第一次搭飛機,第一次摸到不同國家的貨幣,第一次生活在伊斯蘭文化中,... 好多好多的第一次,都發生在這短短十天旅程中。
時間回到 11/23,馬來西亞出差任務一定案,馬上通知 HR 協助辦理相關事宜。在沒有護照也沒有退伍令的情況下,三天內走訪國防部及外交部,以最速件的方式在出發前兩天拿到護照。同時,由於先前對於任務的相關器材和軟體操作並不熟悉,也利用這一個禮拜的時間迅速惡補。當然,也得和這次的夥伴,馬來西亞藉的 Kai,做最初步的認識和溝通。這一切準備,都在五天之內完成。11/28 一早,搭乘 Benz 專車,穿越陰雨綿綿的台北,直奔桃園國際機場,順利搭上 8:20 的華航 CI-721 班機。當懸掛在機翼上的噴射渦輪引擎開始高速運轉,飛機就開始以非常驚人的加速度向前推進,在白努力原理的帶動下,慢慢離開地面,愈飛愈高,愈飛愈遠。當飛機穿越雲層,看到中央山脈樹立雲海之上的景象,眼淚竟不爭氣地在眼眶裡打轉。是的,我終於離開台灣了!
雲海波濤洶湧,拍打著美麗的中央山脈。
下午三點多抵達吉隆坡國際機場 (KLIA),寬敞的空間和藝術的造型,以及航廈間方便的捷運電車,KLIA 讓人印象深刻。由於時間緊迫來不及事先辦理簽證,所以抵達後的第一件事就是辦理落地簽 (Visa on Arrival),手續費 RM 330,由 Kai 當保證人,保證我 14 天之內要離開馬來西亞國境。辦妥簽證,經過大排長龍的入境隊伍以及層層安全檢查,終於順利進入馬來西亞。和講著廣東話的司機文良碰面後,搭上車架好設備,任務開始。
KLIA 一隅。
第一天的行程,規劃至 Kai 家,Muar 附近的一個小村落。中途經過據說當地有名的「芙蓉燒包城」,吃了兩個有點像炸鹹月餅的燒包後繼續上路。就在這時候,走錯一個路口,造成來回約 50 km 的懲罰路程,這也讓人體認到這次任務的重要性。沿路零星的傾盆大雨,造成幾個點位必須重跑。傍晚抵達 Kai 家,大約 100 坪的透天厝,又每層挑高,在台北大概是上億豪宅了吧。Kai 爸一見到我就以緩慢的口吻,摻雜馬來西亞華文和閩南話的腔調說:「台灣來的啊?台灣人都刻苦耐勞的啊!」Kai 媽也是對台灣人相當好奇,一直問台灣的情況怎樣怎樣。雖然身為外國人,不過在異鄉聽到華語還真是感到親切。晚上,在一家光等上菜就要等一個小時的華人餐廳吃合菜,又是一個感到親切的場景。
在華人餐廳吃到很好吃,可是一直忘記叫什麼名字的馬來特有食物。
第二天的行程,由 Muar 到新山 (JB),再折返 Muar。經過昨天的大雨,這天的天氣就配合多了。JB,是個當地人都感到治安不好的地方,甚至 Kai 和司機都提醒我要把相機收在背包裡,才不會太招搖。戰戰兢兢在 JB 吃過午餐後,在馬來西亞的最南端,隔著佛柔海峽,我看見新加坡。可惜礙於落地簽的限制,只能遠觀而不得其門而入。下午,提前完成今天規劃的進度,Kai 爸高興地摘了幾個椰子披給我們喝。晚上,在附近的華人餐廳用完餐,就和 Kai 及文良一起到 Muar 市區的飲料店上網回報進度及報平安,同時 Kai 也找來久沒碰面的同學們一起敘舊。
跨過佛柔海峽,就是新加坡。
Kai 爸劈椰子給大家喝,喝完還有椰肉可以吃喔。
第三天的行程,除了預定要回吉隆坡 (KL) 的路線外,還要重跑第一天大雨的點位。在 Kai 家大合照後,Kai 又得背起行囊告別父母,下次見面不知道又是多久之後的事了。很順利地,大約在下午兩點就順利抵達當天要住的 Eastin 飯店。Check-in 之後,正在馬來亞大學 (University of Malaya) 就讀的文良帶我們去參觀位於不遠的母校,佔據 KL 市區大片土地,馬大和台大頗有相異曲同工之妙。逛完馬大,我們來到 Mid Valley Megamall,據說是東南亞不知道什麼東西最大的一個購物中心 (台南新光三越新天地也號稱東南亞不知道什麼最大,高雄夢時代也號稱東南亞不知道什麼東西最大,太多東西可以比真讓人搞不清楚到底誰大,又大在哪裡...)。終於有機會可以把厚重的美金換成更厚重的馬幣,也順道買了很多其他 team 需要代買的書籍和地圖,真想趕快把這些錢花完,不然帶這麼多錢在身上還真不安心。晚上,終於吃到傳說中的肉骨茶,滿足!
告別 Kai 爸媽,前往下一站-KL。
馬來西亞第一學府-馬來亞大學。
號稱東南亞不知道什麼最大的 Mid Valley Megamall。
傳說中的肉骨茶!
第四天,北上怡保 (Ipoh)。好死不死中途又遇到傾盆大雨,因為大雨的緣故,有機會到文良家-Ipoh 附近的小村落坐坐,和完全聽不懂華文只會講廣東話的婆婆相處一陣。由於雨勢毫無停止趨勢,只好放棄接下來的點位繼續北上,待將來南下天氣好再來重跑。晚上,吃到好吃到會留眼淚的「老黃芽菜雞」,又是一陣滿足!
好死不死的傾盆大雨,讓我們有機會到文良家坐坐。
文良的婆婆和愛撒嬌的狗。
當地多到爆炸的一種很像荔枝的水果-紅毛丹。
老黃芽菜雞,據說那一大桶清脆可口的芽菜全是他們自己精心栽培而來。
第五天,繼續北上到 Alor Setar,北方接近泰國的一個中型城市。由於愈北愈少華人,中午在 Auto City 落到只好吃 Subway 的下場,晚上在 Alor Setar 也是以 Pizza Hut 充飢。來到北方,清一色都是馬來人,也才比較有出國的感覺。
Alor Setar-靠近泰國的一個中型城市,據說馬來西亞人常經此到泰國邊境去做很便宜的按摩。
第六天的行程,按原訂計畫北上折返。原訂 12/05 返台,因為一些原因導致得延後至 12/06,這時卻傳出 12/06 和 12/07 都沒有機位的情況,勢必得再延至 12/08 返台。所以這時有兩種選擇:1. 趕進度於 12/05 返台; 2. 延至 12/08 返台。基於趕進度風險 (尤其是天氣因素) 過高的考量,最後決定 12/08 返台。由於多了幾天的時間,我們也決定把所有安排的點位好好的跑完,如果很順利而有充裕的時間,就再多跑東西大道,將時間利用到淋漓盡致。為了跑完所有點位,行程臨時改至原本打算跳過的檳城 (PP),也很臨時地住進 11 月才剛開幕的檳城 Eastin。晚上,在很像台灣夜市的新關仔角晚餐,吃了拉砂、沙爹、烤魚、蠔煎 (類似台灣的蚵仔煎) 等等美食。可惜的是,這天大家氣氛有點低落,我自己的心情更糟。
檳城,我來了!
11 月剛開幕的檳城 Eastin。
好吃的沙爹。
第七天早上,文良不太舒服,甚至嘔吐,不知道跟前一天晚上的夜市有沒有關?這天行程由檳城經跨海大橋回到馬來半島,來到金寶 (Kamper)-Ipoh 南方的一個小城市,順便重拍之前下大雨的 Ipoh 附近幾個點位。晚餐是當地有名的麵包雞,就是麵包裡面放咖哩雞的一道菜。由於機位候補上了,所以行程再度改至 12/07 返台。
金寶有名的麵包雞。
第八天,返回 KL,再度品嚐不同口味的肉骨茶,不過還是上次的好吃。
不同口味的肉骨茶。
第九天,早上順利將 KL 預定的點位完成,中午過後按照原計畫東行至東海岸的關丹 (Kuantan)。文良的後煞車這時出了問題,經過檢查發現是煞車皮磨光了,還好發現的早,不然就這麼衝到東海岸大概會很歡樂。所幸,一切都蠻順利的,我們也在日落之前拍完最東一個點位,抵達 Cherating 海灘的別墅度假中心。由於東海岸日前剛發生水災,這時候的住宿費用較平常低廉許多。
修車中。
Cherating 的度假中心。
馬來西亞的獵戶座,和台灣的一模一樣。
最後一天,由馬來西亞東海岸的日出揭開序幕。早餐過後,沿路殺回 KL,將 KLIA 前的最後一個點位終結的同時,也代表這次任務已接近尾聲。緊急趕在 deadline 前 20 分鐘辦理登機手續後,到一旁的 McD (文良的最愛) 結算所有費用,就和文良告別出境了。返抵台灣,搭著不太習慣的左駕 Benz 回到汐止,一切好像剛做了一場夢。
東海岸的日出。
凡走過必留下足跡。
KLIA 登機手續大廳。
十天的行程,就像一場夢。
SAT, 28NOV, CI0721, DEP TAIPEI TAOYUAN TERMINAL 1, 0820, ECONOMY/V, YEE1M
SAT, 28NOV, CI0721, ARR KUALA LUMPUR MAIN TERMINAL, 1300, CONFIRMED, YEE1M
CHINA AIRLINES REF: K68FWU, SEAT: 29A, NVA: 12DEC09, BAGGAGE: 20K
週末的合歡山行,雖然很精采,不過這週實在沒什麼時間好好整理成文字,就姑且以幾張照片記錄這兩天的旅程。參與人員:starryalley, waterlemon, 阿貞, 豪哥, 尚達和我。
第一站,清境農場。躺在一整片綠油油的山坡上,享受迎面而來的冬季日光,十分舒暢。
晚上,翠峰的 2009 Star Party,集結了數十架大口徑天文望遠鏡,數百頂帳篷,以及滿天揮舞的綠光雷色。再次目睹好久沒看到的滿天星斗,無憾矣!
第二次登上合歡主峰,這實在是很適合初學者的一座百岳阿!
這次行程利用到相當多智慧型手機的功能。首先,Google Latitude 讓 starryalley 和我隨時可以知道對方的位置。Google Sky Map 讓夜晚的認星活動更為方便 (雖然我的 Magic 出了點小問題造成方位錯亂)。從 GPS 狀態可以知道所在地的經緯度座標以及海拔等資訊。全程 plurk 實況轉噗,就能在深山的大草原上,或是在滿天星斗的夜空下,即時將喜悅分享給國內外的好噗友們。智慧型手機的應用真是太方便有趣了,可以想見,未來大概身邊有電或沒電的工具都能整合在這個小盒子中吧。
經過一年多的煎熬,我的職場處女作 Garmin nüMaps,以及最棒的團隊所打造出最棒的台灣圖資,終於在週二的記者會宣告之下正式對外上線了!

去年八月進公司開始,從 study 地圖座標投影及蒐集線上地圖相關技術開始,試著將公司資料庫內的數位化圖資繪成一張張圖檔,再慢慢刻出自己的 JavaScript API,一套簡單的網頁地圖瀏覽系統就此誕生,至此一共花了三個月。這一階段遇到的主要問題,就是 tile 檔案數目過多,以至於在部分 file system 會發生超過 i-node 上限的問題,而在部分 file system 則會有同一目錄內檔案數目過多造成存取速度銳減的情形,也因此花了一些功夫了解各 file system 的特性,之後在 file system 的選擇以及檔案的結構配置上也就比較有概念。
地圖呈現之歷史畫面
2008 年度報告時的模樣
秉持著「先求有再求好」的精神,有了基礎建設後,接下來就開始進行美化的工作。除了 JavaScript API 演算法及功能上的提升 (包含處理非常煩人的 cross-browser issue),也研讀了幾篇 labeling algorithm 相關的學術論文,使畫面的呈現盡可能地絢麗又不失舒適,並匯入更多種類的資料讓畫面內容盡可能豐富詳盡。至此,回報系統的雛形大致完成,又三個月過去了。
2009 年 4 月報告時的模樣
為了讓使用者能快速找到想尋找的點位,「搜尋」的功能刻不容緩。在稍微深入了解搜尋引擎的運作後才發現,中文搜尋首先面對的三大難題就是「斷詞」、「新詞」及「簡稱」等問題。「斷詞」部分舉個眾所皆知的例子來說,「下雨天留客天天留我不留」就有好幾種斷法,這將造成建立 index 上的模稜兩可。由於中文是活的語言,「新詞」的出現在所難免。常見的新詞大致可歸類為特殊領域新詞 (「非同步傳輸模式」)、時勢性新詞 (「一國兩制」)、衍生性新詞 (「數位化」)、合併性新詞 (「砍掉重練」)、火星新詞 (「殺很大殺不用錢」)、名字新詞 (「瑤瑤」) 等,除非有個字典不斷自動擴充各種新詞,不然一旦遇到了系統也無法解讀。「簡稱」的問題就更有趣了,中文的簡稱向來沒有一個制式化的標準,同樣是兩個詞的合併,有兩個頭合併的簡稱 (「節約能源」簡稱「節能」),有兩個尾合併的簡稱 (「香港總督」簡稱「港督」),有頭和尾的簡稱 (「外交部長」簡稱「外長」),也有頭頭尾的簡稱 (「安全理事會」簡稱「安理會」);你以為這樣就結束了嗎?同樣一個詞在台灣和中國大陸有著不同的簡稱 (「清華大學」在台灣叫「清大」而在中國大陸叫「清華」),還有那種順序顛倒的簡稱 (「第一核能發電廠」簡稱「核一廠」),還有簡稱再簡稱的 case (「冬季奧林匹克運動會」簡稱「冬季奧運會」再簡稱「冬季奧運」再簡稱「冬奧會」,更不用說用數字來簡稱的詞 (「通郵、通商、通航」簡稱「三通」)。也就是說,一旦使用者輸入這類「斷詞」政治不正確、系統沒見過的「新詞」或是毫無規則可言的「簡稱」字眼,搜尋結果的正確性就可想而知了。而現有的解法大致可分為兩大類:character-based 和 word-based。Character-based 的精神在於不管三七二十一,來幾個字切幾刀,亂槍打鳥只要子彈 (儲存空間) 夠多總是能打中的。而 word-based 則大致可以使用自動統計學習、手動建立字典、以及語意分析等方式來較為精確的切出當中的關鍵字,然而學習來源以及固有字彙的多寡仍然深深影響切割後的結果。因為相關論文表示前者的正確率並不亞於後者,再加上實作起來較為直覺簡單 (其實主因是本人智商不高),所以最後採用 character-based 的作法,加入一些客製化的變形,一個能夠同時搜尋地址、經緯度、POI 點位的地理資訊搜尋引擎就此誕生。突然發現好像打太多了...。總之,和 JavaScript API, labeling algorithm 有花俏的畫面和功能相較起來,同樣花了這麼多時間,結果呈現在使用者面前卻只有兩個平淡無奇的長方形:一個 text box 和一個 submit button,想想其實還蠻辛酸的。
一個搜尋欄位和一個按鈕的背後,隱藏著無數不為人之的奮鬥過程
為了滿足搜尋所需要的龐大 computation resource,同時解決未來上線時將會遭遇到的 bandwidth (以及 response time), storage, stability and scalability, security 以及 cost 等相互牽制的問題,為這套系統找個合適的居所也得花一番心思才行。根據前人的經驗,通通自己來要不就是砸大錢建置硬體設備及維護管理,要不就是等著被蜂湧而至的使用者打爆,也因此 outsourcing 似乎是較為可行的方式。經過 survey 發現多種方案,包含 shared hosting, cloud hosting, virtual private server (VPS), dedicated hosting, content delivery networks (CDN), Amazon EC2/S3, Google App Engine 等,就 C/P 值來說,Google 似乎是俗 (甚至免費) 又大碗的不二選擇,就它了!而為了 Python 支援度較高的 Google App Engine,也在惡補之下將 Python 這個 fucking damn fantastic 的語言學了起來,並應用在許多邪惡的事上 (糟糕!不小心說溜了嘴...),真是一舉數得啊!至此,系統悄悄在公司的防火牆外露臉。
歷經了小組測試、部門測試,以至於公司發動測試小組進行多方面測試,到後來動員全公司的測試,收到許多熱心的回饋和指教,在效能及功能上也做了大幅度的調整和提昇。終於,在 mobile01 第一篇新地圖討論串的帶動下,系統正式在所有使用者面前曝光。
目前 Garmin nuMaps 線上勘誤系統的模樣
系統上線一個禮拜來,除了 Google 例行性維護好死不死剛好就在發佈後的隔天,造成系統無法使用一個多小時外,其餘時間在 Google App Engine 及 Akamai 兩朵大雲的支撐下,運作上都還正常。
一個禮拜來,也得到許多來自四面八方的正反面迴響,箇中的酸甜苦辣,實在難以用言語表達,大概只有自己最清楚。無論如何,這算是自己職場上一個好的開始。期許自己在未來的路上,能夠繼續保持這一年來邊作、邊學、邊玩的心態,在成長的同時,除了盡可能保有正常的生活步調外,也能對社會有所貢獻。
P.S. 倘若各位看倌發現任何地圖內容上的問題,方便的話也煩請協助撥冗到 Garmin nuMaps 線上勘誤系統上進行回報喔 (需先經過簡單的程序建立 myGarmin 帳號並登入)!Garmin GIS Taiwan Map Team 感謝您!