本來這個blog是記錄開發輸入法的點滴的,後來越來越雜,現在什麼都記錄了。

2008年2月11日 星期一

鼠年新年(2008) 台北之旅

鼠年(2008)台北自由行行程

行程
  • 大年初一 (2008年2月7日)
    • 坐長榮 EVA 航空 5:15起飛, 7時到台北桃園國際機場。
    • 坐一個多鐘頭旅遊巴到北投區浸溫泉。這是我第一次浸溫泉啊。根據導遊說,北投的溫泉,是碳酸溫泉,沒有什麼氣味的;聽他說還有一種硫磺溫泉,有些火柴的味道。這裡的溫泉,是分開一間一間房浸的。

      我心中一直有一個疑團,究竟這裡的溫泉水,是地底冒出來的,還是用熱水開粉做出來的呢?
      當然這些尷尬的問題,我也不會問啦。


    • 之後又坐一個鐘頭旅遊車去九份。聽說是因為一齣電影「悲情城市」(梁朝偉演的),才弄得這裏很出名。這裡有很擁擠的巷子,有很多東西吃(什麼糕點、魚丸肉丸湯等),但老實說…我也不知道來這裡做什麼,沒有什麼好看的。聽聞真的要玩,要借宿一宵,之後看基隆市的日出;另外行到巷子的尾,有些類似指向行山徑的路牌 ,大概是可以行山吧。但那天下雨下得很大,而且逗留時間不長,所以在這裡吃了一個貢丸+麵湯,買些手信就走了。

       
       
    • 之後 旅遊車到了台北火車站解散了,去城美大飯店 check in 房間。
    • 黃昏時,在 7-11 買了 「悠遊卡」(即八達通卡) ,NT$500 (按金 $100,內存 $400),方便坐公車(即巴士)和捷運(即港鐵),然後去了龍山寺捷運站。
    • 到了龍山寺附近的夜市吃東西。吃了 有抹茶條卷在上面的炸熱狗、蚵仔(即蠔仔)煎、蚵仔湯、85° (台灣 Starbuck 的對手)柚子茶 。
    • 然後去龍山寺,人很多,非常虔誠。廟裡貢神明也多,例如:觀音菩薩、地藏菩薩、月老、文昌…共10多位。
  • 大年初二 (2008 年 2 月 8 日)
    • 11 時多坐捷運到淡水。淡水是由吃東西的巷 +吃東西的街道構成的市 (可能是假期才這樣吧,平時就不得而知)。在這裡吃了炸地瓜丸、鐵蛋(超彈牙滷水蛋)、「阿給」、魚丸(魚蛋)湯。「阿給」是日本油豆腐的音譯,其實是油豆腐中間挖空,填入粉絲,然後用類似鯪魚球漿的東西封口,再蒸熟,然後塗上甜辣醬。我覺得味道一般,不是特別好吃。 另外,我覺得「阿給」的英文音譯 arcade 譯得非常好!

      另外,在這裡買了鼎鼎大名的「阿婆鐵蛋」。在「阿婆鐵蛋」附近,有很多什麼「阿伯鐵蛋」、「阿公鐵蛋」真會混淆視聽。

    • 然後去了淡水紅毛城。紅毛城我的理解是以前西班牙人佔領淡水時起的建筑物,後來又給英國人佔領了,將那裡變成領事館。裡面有一個小小展覽館,展覽了航海的東西和後來英國領事館的歷史。尤其推介裡面播放的一個介紹淡水video。我看完才知道,淡水以前是台灣的重要港口,很多東西(茶葉等)都從台北島內內河運到淡水港口,然後運出到大陸沿海城市,乃至全世界。後來船的噸位越來越大,淡水港口漸漸不敷應用,逐漸變得沒那麼重要呢。
      還有一點,「基隆」原名是「雞籠」! 將地方名從沒有那麼好聽的名改為好聽的,香港也有,例如「吊頸嶺」改為「調景嶺」。

       
       
    • 由於時間尚早,又不知道坐什麼車好,所以就決定做做運動,步行去漁人碼頭(1小時)!我去之前, 沒有做功課,心中只是想,台灣是一個島,海鮮應該很多,什麼魚生都有得吃吧,漁人碼頭應該是個大魚市場之類的地方。去了才知道漁人碼頭什麼都沒有,只有一條情人橋。而且途中風大雨大,又冷,更把我的雨傘吹散了!


       

      (淡水漁人碼頭籌建誌: 原來淡江的夕陽美景一直被譽為台灣八景之一,在落於此的淡水第二漁港,是漁人泊舟歸航之處,可惜漁港年久失修,髒亂傾頹。因此,自民國八十七年起,政府選定此處為多功能示範漁港,大力補助經費,台北縣政府積極規劃此處成為舟艇泊靠和大眾休閒的優質公園,並名為“淡水漁人碼頭”。另外,更加長了行人棧道,建徒步跨港橋,並經陳水扁總統於2003年2月14日情人節為跨港橋剪綵,命名為“情人橋”)
       
    • 之後就去「士林觀光夜市」。裡面真係好誇張好多人。吃了 :
       
      • 棺材板 (炸厚方飽,開蓋然後放雞肉,再)
      • 十全排骨 (我估計就是馬來西亞的肉骨茶,即藥膳排骨湯)+魯(滷)肉飯
      • 青蛙下蛋 (有點像珍珠奶茶,但不是奶茶而是涼茶一類的東西)
      • 蜂蜜苦瓜茶
      • 黑椒腸+糯米腸


        (士林食市的入口)




        (蚵仔煎)


    • 之後去「士林夜市」附近逛街,有些店舖的名字很有趣呢

      :
      (賣奶罩的店)

  •   大年初三(2008 年 2 月 9 日)
    • 10 時多,坐捷運到動物園站。然後坐貓空纜車。人很多,但當局安排很好,流量頗快。可能是假期人多關係,車速調高了,明明排隊的標示說要等 150 分鐘,結果只排了大約70分鐘就已經可以登車。而且價錢不貴,從動物園站坐到貓空站,只需 NT$50 ,需時約 20 分鐘。不過,沿途一直狂下雨,外邊景色都看不清楚,只能隱約看到下面是茶田。上到山頂,天氣冷得要命,於是立即再排隊坐纜車下山。

      後來在那裡派的宣傳單看到才知道,市府還規劃了四條旅遊行程:
      • 懷舊茶體驗
      • 貓空親子樂
      • 親山森林浴
      • 品茗觀星夜
      下次去台灣真的要試一次。


       
    • 之後坐捷運去中正紀念堂站。這個捷運站真的與別不同,「中正紀念堂」幾個字有射燈射著啊。可能以前台灣人真是很尊重蔣中正(蔣介石)。

       
      然後就去了「自由廣場」(即舊中正紀念堂)。下面的照片有一張 是在紀念堂外拍蔣介石銅像,但有很多無謂的裝飾擋住視線。看來台灣人真的不那麼尊重蔣介石了。



      (香港以前有「九龍皇帝」專門塗鴉,原來台
      北也有一個「台北皇帝」)
       

    • 之後就坐捷運去士林站,坐的士去故宮博物館。裡面的藏品很精采呢!我去年去過北京的故宮,心中有一個疑團,為什麼那麼少古董珍藏在那裡呢? 直到今天才知道,那些古董都去了台灣啊。不過倒沒有什麼所謂,都是中國人地方。在故宮博物館裡,我租了一個 Audio Guide 機,我發覺真是很有用呢。以前我看那些古董展覽,通常看過便算,有什麼藝術價值,我都不是很清楚。但這次透過 Audio Guide 機介紹一些特選的展品,我才知道那些展品製作的難處,和怎樣欣賞呢。Audio Guide 機的國語不是太難明白的,我也聽懂 80-90%!我在這裡花了 3.5 小時。我也影了館內最珍貴的展品「翠玉白菜 」(哈哈哈...... 不過是在賣紀念品那裡拍的)

       
    • 之後坐 巴士會士林夜市吃東西。這次吃了:
      • 生煎飽 兩個 (菜的,不是肉的)
      • 十全排骨 + 麵線
      • 炸蟹肉丸
      • 鹽酥雞
      • 蘋果汁

  • 大年初四 (2008年 2 月 10 日)
    • 11時坐捷運到市政府站。之後步行去台北 101 大廈。不過到那裡頂樓的觀景台的入場費用太高了(NT$400),決定不上去。
    • 之後坐捷運去忠孝 新生,去看電腦街,可惜很多店都沒有開。
    • 然後坐捷運回西門。在西門徒步區走。西門徒步區有很多商店(很像香港銅鑼灣、旺角),而且還有樂隊在台上表演呢(當日表演的是強辯樂隊 - 四個娘娘腔的年輕人)。吃了:
      • 臭豆腐
      • 沙威瑪 (炒烤好的雞肉碎 + 洋蔥之類 的飽) + 起司(cheese)
      • 冬菇肉丸湯 + 冬粉(即粉絲)
      • 珍珠奶茶

      在這裡,香港的電影似乎有一點吸引力,幾乎所有戲院都在做「長江七號」呢 !

      由於雙腿太累,所以去看一齣電影「蓋世奇才」(Charlie Wilson's War),故事是說蘇聯共產黨當時入侵了阿富汗,在阿富汗肆意殺戮平民(美國的觀點),一個美國議員(Tom Hans 飾演),怎樣說服美國政府撥款,提供武器給阿富汗人民抵抗蘇聯的入侵。(不過後來引來了宗教狂熱份子來 如塔利班等搞到一塌糊塗)

    • 之後突然驚覺手信(台稱: 伴手禮)不夠,於是很慌張的找那裡可以找到「鳳梨酥」,找了很久都沒有。最後在台北捷運站的「三越」百貨的地下2樓找到!
    • 之後就從飯店坐的士去台北桃園國際機場.。

2007年12月28日 星期五

好笑的翻譯:

好笑的翻譯:
1. Fuck to fry the cow river 干燒牛河 Braised beef and flat noodles
2. Top soup cloud swallows 上湯雲吞 Wonton in soup
3. Black winter in type seafood soup in day 日式海鮮湯烏冬 Japanese Udon with Seafood soup
4. Western fashion fried rice 西式炒飯 Fried rice (Western Style).
5. The pig picks the noodle soup 豬扒湯麵 (註: 扒手 =pick pocket) Pork Chop & Noodles in soup
6. The black cow silk fries the idea powder 黑椒牛柳絲炒意粉 Scrambled beef fillet and Pasta with black pepper
7. Three silk soup idea powder 三絲湯意粉 Meat, Black fungus, Carrots & Pasta (Spaghetti) in soup
8. The cold cow in west in special grade picks 特級西冷牛扒 Superfine Portioned Striploin Steaks.
9. Pearl eight claw fish 珍珠八爪魚 Maize and bamboo shoot and octopus
10.The water is as well 滷水掌亦 Brined duck foot
11.The week beats the fish soup 周打魚湯 Fish Chowder
12.Elder brother the ground is second coffee 哥倫地亞咖啡 Columbia Coffee
13.The chicken hates the soup of 雞茸忌廉湯 Chinken and Cream Cheese soup
14.Follow butter meal pack 跟牛油餐包 Butter Dinner Rolls
15.Swallow to take the fish sand 吞拿魚沙律 Tuna Salad
16.Butter many privates 牛油多士 Toast w/Butter
17.Company three texts cure 扒芝士火腿三文治 Cheese and Ham Sandwiches
18.Living to fry the beef rice 生炒牛肉飯 Fried beef and rices
19.Nepoleon fries the idea powder 拿破倫炒意粉 Spaghetti Neapolitan
20.Day type many spring fish 日式多春魚 Japanese Karafuto-shishamo, Capelin

2007年12月23日 星期日

冬至究竟什麼?

今天食了一頓很豐富的冬至飯。之後在思考,究竟有多少人了解什麼是冬至呢?
如果要我向人解釋,我應該怎樣解釋呢?

要解釋冬至,單憑寫篇文章,甚至加插圖,都是很難令人明白。一定是要用動畫。
另外,要解釋冬至,必須先解釋四季的成因。要解釋四季的成因,就必須要有地球軌跡的圖。

但怎樣顯示一個在同時自轉 又同時圍繞太陽公轉的地球呢? 於是就從網上找,找到了這個網站:
http://parentnode.org/flash/flash-3d-earth-including-fla/
但都不合用,我只用了他裡面的圖,動手自己做一個自轉的地球(加了點 Action Script)

材料夠了,就動手寫了以下這個「四季」的小movie clip, 告訴大家 四季的來由。希望大家喜歡喇。


2007年12月14日 星期五

數碼電視廣播的原因!

最近在思考為什麼香港政府(乃至全世界政府)要推行地面數字電視廣播。

大家有一個錯覺,推行數字電視廣播的主要原因,是為了高清,多聲道等更高的視覺和聽覺享受,其實這些只是數字電視帶來的副產品。我個人認為背後的原因都是為了$。

目前的模擬多頻道廣播,其實是很浪費頻譜的,就以翡翠台為例,各發射站播放翡翠台的頻率如下:
(資料來源電訊管理局:http://www.ofta.gov.hk/zh/freq-spec/tvbnet.pdf)

電視
發射站
地點

電視
頻道
視頻
(MHz)
聲頻
(MHz)
有效
輻射功率
(W)
極化偏置
慈雲山21471.25477.2510,000H0flNP
青山34575.25581.251,000H+5/3flNP
飛鵝山34575.25581.251,000H-5/3flNP
金山33567.25573.251,000H0flNP
九龍坑山49695.25701.251,000H0flNP
南丫島49695.25701.251,500V-5/3flNP
赤柱34575.25581.25100H0flNP
南朗山33567.25573.25100H+5/3flNP
砵甸乍山33567.25573.25100H+5/3flNP
柴灣48687.25693.25100H+5/3flNP
聶高信山48687.25693.25100V-5/3flNP
琵琶山49695.25701.25100H+5/3flNP
照鏡環山49695.25701.250.5H0flNP

從表中可以看到,為了播放一個翡翠台,浪費了13個電視頻道。大家不禁要問,為甚麼不全香港播放翡翠台都用同一個頻道呢?答案:
假設你住的地方在慈雲山與飛鵝山中間的地帶,而兩發射站都用同一頻率發射翡翠台,由於訊號由發射站到你的電視天線時間不同,就會發生「鬼影」現象。所以不同發射站要不同頻率,而你因應你住的地方,選擇某個發射站的訊號。


新的數字電視頻率如下:(http://www.ofta.gov.hk/zh/report-paper-guide/guidance-notes/gn_200705_tc_.pdf)
頻道名稱電視頻道頻道(MHz)
注意:未確定
筆者自己作的
電視發射站
地點
亞視本港台11119.25

慈雲山 2007年
港島北部 九龍半島 沙田 大嶼山東部

青山 2008年
屯門 元朗 大嶼山北部

九龍坑山 2008年
新界北部(包括大埔、粉嶺及上水)

飛鵝山 2008年
將軍澳 西貢 港島東部

南丫島 2008年 港島南部

金山 2008年
葵涌 荃灣

亞視新聞財經頻道12126.25
亞視動感資訊頻道13133.25
亞視魅力資訊頻道14140.25
亞視文化資訊頻道15147.25
亞視國際台16154.25
aTV高清頻道19175.25
無線資訊頻道80647.25
無線翡翠台81655.25
無線翡翠2台82663.25
無線明珠台83671.25
無線高清翡翠台88711.25

舉例:從表中看到,無線翡翠台的數碼廣播頻道,全港九都是一樣的,只有一個頻率。那為什麼又不會有「鬼影」的問題呢?
因為數字電視接收器,其中一個最重要的部分,就是消除主要訊號外的「鬼影」。這些「鬼影」可能是由於是其他山頭的訊號反射或來自其他發射站發出的訊號。

這些數字電視技術,都是近10-20年發展出來的。美國最先使用數字電視廣播
ATSC ,歐洲地方用的 DVB-T,日本用 ISDB-T。本來香港是採用
DVB-T 的,但原來每買一架這些歐洲制式的電視接收機,就要附很多專利費用給歐洲公司。每年這樣被敲詐數以百億元專利費,真是令人心有不甘。
後來中國政府自己開發了一套 DMB-TH 制式,而且規定2007年強制執行。香港於是也決定也採用DMB-TH,避免了歐洲的大量專利費(雖然仍有一部分用於
視頻音頻編碼 MPEG2, H.264上),而且幫助中國推行自主研發的技術,這個決定可謂維護了民族尊嚴和利益。

話說回頭,為什麼推行數碼廣播是為了 $ 呢?
原來數碼廣播一旦推行,而模擬廣播逐漸結束,很多頻譜便閒置了。這些頻譜可以用作很多很多其他用途,例如手提電話,無線寬頻上網、移動電視、3G等東西。一個頻譜可以賣得過千億元的,最令人津津樂道的莫過於李嘉誠千億賣橙。
所有政府和福利機構,對這些收入都虎視眈眈的。 這就是政府推行數字電視廣播最深層的原因!

2007年12月11日 星期二

擷取 音樂的方法

最近我被要求擷取某網站的背景音樂,該網站十分狡猾,如果你用 Windows Media Player 去開啟以下的link: http://m2.colorme.com.cn/ftp/l/l/h/8/llh8/music/1168884738897.wma 《滇聆》雪境,可以收聽的,但用其他方法下載該音樂,它卻回應一些無關痛癢的網頁。結果我要寫下面的程式,去扮「我是音樂播放器」才能下載 :

編譯: gcc -l curl -o test test.c
用法: ./test http://m2.colorme.com.cn/ftp/l/l/h/8/llh8/music/1168884738897.wma > /tmp/1.wma


程式碼如下
#include
#include
#include
#include
#include
#include

#define ICY_METAINT "icy-metaint:"

static int metaint, metacnt, metalen_left;
static int load_from_net_so_far;

// If it is 8192, you always get 8192 bytes of real data, followed by the metadata.
// The meta data format is mlength (1 byte), followed by string (variable length).
// The length of the string is the mlength multiplied by 16.
// So when there is no metadata, you'll get a single byte (mlength=0).
static int
head_write_callback(void *buffer, size_t size, size_t nmemb, void *stream) {
int size_to_write=size*nmemb;
char *p;

fwrite(buffer, size, nmemb, stderr);

if ((p=strstr(buffer, ICY_METAINT))!=NULL) {
metaint=atoi(p+strlen(ICY_METAINT));
}

return size_to_write;
}

static int
play_audio(char *buffer, size_t size, size_t nmemb, void *stream) {
fwrite(buffer, size, nmemb, stdout);
load_from_net_so_far+=size*nmemb;
fprintf(stderr, "\b\b\b\b\b\b\b\b\b\b%010d", load_from_net_so_far);
return size*nmemb;
}

int
main(int argc, char **argv) {
CURL *curl=NULL;
CURLcode ret;
struct curl_slist *headerlist = NULL;
struct curl_slist *aliases = NULL; // Yick_2003_12_29
char *url;

if (argc!=2) {
fprintf(stderr, "%s url\n", argv[0]);
fprintf(stderr, "where url can be a playlist or mp3 url\n");
fprintf(stderr, "the song will appear at stdout\n");

fprintf(stderr, "%s \"http://www.shoutcast.com/sbin/shoutcast-playlist.pls?rn=911919&file=filename.pls\" &\n", argv[0]);
fprintf(stderr, "%s \"http://www.shoutcast.com/sbin/shoutcast-playlist.pls?rn=1704&file=filename.pls\" &\n", argv[0]);
fprintf(stderr, "%s \"http://m2.colorme.com.cn/ftp/l/l/h/8/llh8/music/1168884738897.wma\" 1> /tmp/1.wma \n", argv[0]);
return -1;
}

url=argv[1];

metaint=8192;
metacnt=0;
metalen_left=0;
load_from_net_so_far=0;

curl = curl_easy_init();

headerlist = curl_slist_append(headerlist, "Pragma: stream-switch-entry=ffff:1:0");
headerlist = curl_slist_append(headerlist, "Pragma: stream-switch-count=1");
headerlist = curl_slist_append(headerlist, "Pragma: xClientGUID={71F1B2A2-87F5-11D5-A064-0050DA8DAD15}");
headerlist = curl_slist_append(headerlist, "Pragma: xPlayStrm=1");
headerlist = curl_slist_append(headerlist, "Pragma: no-cache,rate=1.000000,request-context=2");
headerlist = curl_slist_append(headerlist, "Icy-MetaData: 1");
headerlist = curl_slist_append(headerlist, "Accept: */*");
headerlist = curl_slist_append(headerlist, "Accept-Encoding: deflate");
headerlist = curl_slist_append(headerlist, "Connection: keep-alive");
headerlist = curl_slist_append(headerlist, "TE: trailers,deflate");
aliases = curl_slist_append(aliases, "ICY 200 OK" );

curl = curl_easy_init();

if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_USERAGENT, "NSPlayer/4.1.0");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(curl, CURLOPT_HTTP200ALIASES, aliases);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, play_audio);
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, head_write_callback);
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 5);
ret=curl_easy_perform(curl);

if (load_from_net_so_far) {
fprintf(stderr, "audio ended\n");
goto SRC_SHOUTCAST_THREAD_FN_LBL;
} else {
fprintf(stderr, "Error in opening url %s\n", url);
}
curl_easy_cleanup(curl);
curl=NULL;
}

SRC_SHOUTCAST_THREAD_FN_LBL:

if (curl)
curl_easy_cleanup(curl);

return NULL;
}