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

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

2007年9月14日 星期五

微軟總是很不想人家用 TSF 類的輸入法

自從歪林TSF輸入法 推出以後,用戶用起來都很不順利。我發覺微軟不想人用 TSF 輸入法機制,在安裝前步驟多多,才能順利的使用 歪林 TSF 輸入法。這究竟是為什麼呢?

舉例: 在 Windows XP, 要人先關掉常駐程式 IMJPMIG,然後又要在 Control Panel 控制台開啟進階文字處理,才能使用歪林 TSF 輸入法.

在 Windows Vista,無端又弄個 UAC (User Access Control)的東西來妨礙我的程式的啟動。

天啊,為什麼呢? 微軟是否想壟斷輸入法呢? 真是非常可惡!http://input.foruto.com/IME/Windows/verTSF/BIG5/INSTALL/index.html

2007年9月3日 星期一

歪林 輸入法問題多多.... 想哭

歪林輸入法有很多問題呢:

1) 在 outlook 電郵主旨欄 不能輸入中文!!!!

2) 在 word 中,另存新檔 不能輸入中文: