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

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;
}