WebAMP 改版囉

WebAMP 改版囉,這一次改版多了很多新功能,網站首頁也變得比較專業一點了… 之前的實在有點醜 XD

最重要的功能就是新增加 webamp.cc 的免費網域名稱,每個註冊的網站都可以獲得一組免費的網域名稱,名字可以自己取,只要不要跟別人重複就可以了… 所以沒有買網址的個體戶也可以架站了

然後還有一個大改進就是,就算你的網站架設在免費網頁空間裡面,也一樣可以提供服務喔

例如你的網頁空間網址是: http://home.kimo.com.tw/XXXXX/
那你可以針對此網址申請一個 WebAMP 服務,並同時設定一個 webamp.cc 免費網址(例如 XXXXX)

如此一來,您就可以用 http://XXXXX.webamp.cc/ 來連結您原來的網址,同時享受到 WebAMP 流量超頻的好處,而不需要擔心流量超過限制而被停用

改版後管理網頁裡面也增加一些新功能,例如防盜連等,這邊就不再贅述,有興趣的人可以來玩看看

URL 含中文路徑名稱的終極解法

URL 含中文路徑名稱的終極解法 – 利用 mod_fileiri 解決中文檔名問題

當然,對付中文檔名問題的最好的解決方法就是「絕對不要用中文檔名」,然而在許多不得已的狀況下,我們還是被迫要使用中文檔名,這時候問題就來了….

在 Web Server 上使用中文檔名最常遇到的問題就是會發生無法存取的錯誤

發生這種狀況最主要的原因就是在 URL 的定義當中,並沒有任何關於字元集(Charset)的資訊。只有要求對於 URL 中的非 ASCII 符號,要用百分比符號的方式去編碼 (例如: %A4 )

舉個例子來說,對於下面這個含中文檔名的 URL

http://bbs.giga.net.tw/fileiri/中文.html

由於「中文」兩個字並非合法的 ASCII 字元,因此當你在瀏覽器的網址列輸入上面這串 URL 時,瀏覽器會把非 ASCII 字元部分轉換成 %HH 的形式輸出
(關於 URL 的編碼方式,可參閱 Non-ASCII characters in URI attribute values 一文的說明)

但是,URL 中的中文字到底要用 BIG5 還是用 UTF-8 字元集來表示並編碼呢?

在微軟的 IE 裡面,工具→網際網路選項→進階 有個選項「永遠將 URL 傳送成 UTF-8
如果是英文版則是「Always send URLs as UTF-8

這個選項打勾的時候(這也是大部分電腦內定的狀況),URL 中的中文字會被當成 Unicode,並用 UTF-8 編碼方式送出,因此 URL 會被瀏覽器偷偷轉成:

http://bbs.giga.net.tw/fileiri/%E4%B8%AD%E6%96%87.html

也就是說,「中文」這兩個字會被瀏覽器用 UTF-8 編碼成「%E4%B8%AD%E6%96%87」的型式後,再把這個編碼過的 URL 送去給伺服器

大部分的中文字用 UTF-8 編碼會變成 3 個 bytes,所以「中文」兩字就變成上面這 6 個 bytes 的編碼「%E4%B8%AD%E6%96%87

但如果前述的「永遠將 URL 傳送成 UTF-8」選項是沒有打勾的,那情況就不一樣了,
這時候 URL 中的中文字會以 BIG5 的形式編碼送出,URL 就會變成這樣:

http://bbs.giga.net.tw/fileiri/%A4%A4%A4%A5.html

每個中文字用 BIG5 編碼會變成 2 個 bytes,所以「中文」這兩個字就變成上面這 4 個 bytes 的編碼「%A4%A4%A4%A5

這是在用戶端瀏覽器的亂象,不同的瀏覽器或甚至只是不同的設定,對同樣中文檔名所送出的 URL 編碼格式都可能會不一樣

那伺服器收到這串 URL 要怎麼處理呢?

如同前面所述,URL 網址本身並不含字元集(Charset)的資訊,因此伺服器當然也無法知道用戶端瀏覽器採用那個字元集來對 URL 中的中文檔名解釋、編碼

所以伺服器的標準動作就變成「收到什麼檔名就去讀什麼檔案」

收到 UTF-8 編碼的 URL,就用這個 UTF-8 的檔案名稱去 File System 找檔案,收到 BIG5 編碼的 URL,就用這個 BIG5 的檔案名稱去 File System 找檔案

所以如果檔案系統中的檔名是採用 UTF-8 編碼,那用 BIG5 編碼的 URL 去找檔案就會找不到… 相反的,如果檔案系統中的檔名是採用 BIG5 編碼,那麼用 UTF-8 編碼的 URL 也會找不到檔案!

尤其在 Apache/UNIX 的環境下,從 Windows 用 FTP 把檔案上傳時,中文檔案名稱大多會使用 BIG5 的檔名格式上傳儲存

所以大多數這類的系統都會要求用戶不要在上述「永遠將 URL 傳送成 UTF-8」這個選項打勾,這樣存取 BIG5 的中文檔名就不會有問題了

不過,這種方式不是很友善,對於大多數的網友而言,要去改瀏覽器設定是很不方便的!

那有沒有辦法讓瀏覽器不用更改設定就可以完美解決呢?

其實是有的,那就是這篇文章要介紹的 mod_fileiri 這個 Apache module

mod_fileiri 的最主要功用就是讓伺服器可以想辦法去判斷 URL 的編碼,然後幫忙做轉碼、轉址的動作,讓伺服器可以同時處理 UTF-8 及其他字元集的 URL 編碼

以下是在 FreeBSD 下安裝及設定 mod_fileiri 的方法:

首先是從 CVS 中取得這個 module:

# fetch http://dev.w3.org/cvsweb/~checkout~/apache-modules/mod_fileiri/mod_fileiri.c

然後用 apxs 來編譯及安裝這個 module… (請用 root 身份執行)

# /usr/local/sbin/apxs -i -a -c mod_fileiri.c
/usr/local/share/apache2/build/libtool .....
/usr/local/share/apache2/build/libtool .....
/usr/local/share/apache2/build/libtool .....
cp .libs/mod_fileiri.so /usr/local/libexec/apache2/mod_fileiri.so
----------------------------------------------------------------------
Libraries have been installed in:
   /usr/local/libexec/apache2

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,--rpath -Wl,LIBDIR' linker flag

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
grep: /usr/local/libexec/apache2/mod_fileiri.la: No such file or directory
grep: /usr/local/libexec/apache2/mod_fileiri.la: No such file or directory
Warning!  dlname not found in /usr/local/libexec/apache2/mod_fileiri.la.
Assuming installing a .so rather than a libtool archive.
chmod 755 /usr/local/libexec/apache2/mod_fileiri.so
[activating module `fileiri' in /usr/local/etc/apache2/httpd.conf]

apxs 不但會產生 mod_fileiri.so 並把它複製到 /usr/local/libexec/apache2/ 下面,
甚至還會幫你把 httpd.conf 的設定改好喔!

然後你只要重新啟動 Apache 就完成了,簡單吧!

# /usr/local/etc/rc.d/apache2.sh restart

接下來就要開始設定 mod_fileiri 的工作了…

mod_fileiri 有三個 directives 可用,分別是 FileIRIFilenameCharsetOldFilenameCharset,位置可以放在 Server Config / Directory / Virtual Host 裡面,甚至 .htaccess 裡面也可..

FileIRI 有四個選項: Off、On、Backwards、Only

Off 就不用說了,設定成 Off 等於是沒有設定的狀況

On 則是指檔案系統上面的目錄或檔案名稱使用的是比較舊的編碼方式(Legacy Encoding),例如 BIG5,然後提供檔案給所有採用 UTF-8 編碼過的 URL,同時,如果 mod_fileiri 發現 URL 並不是採用 UTF-8 編碼,就會對該 URL 做一個 HTTP/1.0 301 Moved Permanently,把它 redirect 到 UTF-8 型式的 URL

如果以前述的例子來看,設定應該是這樣的 (我習慣直接設在目錄的 .htaccess 下面)

<IfModule mod_fileiri.c>
  FileIRI          On
  FilenameCharset  Big5
</IfModule>

這樣設定之後,我們用 wget 來測試一下:

# wget -S -O /dev/null http://bbs.giga.net.tw/fileiri/中文.html
--10:29:34--  http://bbs.giga.net.tw/fileiri/%A4%A4%A4%E5.html
           => `/dev/null'
Resolving bbs.giga.net.tw... 203.187.29.180
Connecting to bbs.giga.net.tw|203.187.29.180|:80... connected.
HTTP request sent, awaiting response...
  HTTP/1.0 301 Moved Permanently
  Date: Thu, 08 Sep 2005 02:29:37 GMT
  Server: Apache/2.0.54 (FreeBSD) PHP/5.0.4
  Location: http://bbs.giga.net.tw/fileiri/%e4%b8%ad%e6%96%87.html
  Content-Length: 354
  Content-Type: text/html; charset=iso-8859-1
  X-Cache: MISS from WebAmpRP@GIGAMEDIA
  Connection: keep-alive

Location: http://bbs.giga.net.tw/fileiri/%e4%b8%ad%e6%96%87.html [following]
--10:29:34--  http://bbs.giga.net.tw/fileiri/%e4%b8%ad%e6%96%87.html
           => `/dev/null'
Reusing existing connection to bbs.giga.net.tw:80.
HTTP request sent, awaiting response...
  HTTP/1.0 200 OK
  Date: Wed, 07 Sep 2005 12:36:30 GMT
  Server: Apache/2.0.54 (FreeBSD) PHP/5.0.4
  Last-Modified: Wed, 07 Sep 2005 12:31:33 GMT
  ETag: "30bd3-14-b986f340;bc359880"
  Accept-Ranges: bytes
  Content-Length: 20
  Content-Type: text/html
  Age: 451
  X-Cache: HIT from WebAmpRP@GIGAMEDIA
  Connection: keep-alive
Length: 20 [text/html]

100%[====================================>] 20

10:29:34 (1.59 MB/s) - `/dev/null' saved [20/20]

從上面可以看到,原本用 BIG5 編碼的 URL,被 redirect 成 UTF-8 型式的 URL,然後就可以正確取得檔案,而這個檔案「中文.html」在檔案系統上是用 BIG5 型式命名的

因此,利用 FileIRI On 就可以順利解決大部分的中文檔名問題了!

那如果你的檔案名稱是採用 UTF-8 命名的呢?這時候你就需要使用 Backwards 這個選項,例如:

<IfModule mod_fileiri.c>
  FileIRI             Backwards
  OldFilenameCharset  Big5
</IfModule>

上述設定的意思是說,所有檔案系統上的檔案都是用 UTF-8 命名,但是對於不是使用 UTF-8 編碼方式的 URL,就會把它 redirect 到 UTF-8 的版本,一樣可以提供服務

FileIRI 還有另外一個選項 Only,這個選項則是設定只提供服務給 UTF-8 編碼過的 URL,而檔案系統上的檔案則是使用 Legacy Encoding。這個方式較不常用,就不多作介紹了

各種設定組合產生的效果可以參考 mod_fileiri 原始網站上面的說明:

http://www.w3.org/2003/06/mod_fileiri/

關於 URL 的字元集編碼問題,可以參考下面這篇更詳細的說明:

An Introduction to Multilingual Web Addresses – Handling the path

動態網頁也可以被快取喔! (Part II)

接續前面那一篇「動態網頁也可以被快取喔!

前面這樣的修改事實上仍不太夠,在某些狀況下仍無法節省頻寬,甚至有些時候會發生檔案更新後,抓到的檔案還是舊的 🙁

這一篇作法嘗試進一步解決這些問題,我們把前面的程式再作一些修改:

<?
#   http://bbs.giga.net.tw/demo/dl-test3.php

    $filename = 'Peacock.jpg';
    $ims = preg_replace('/;.*$/', '', $_SERVER['HTTP_IF_MODIFIED_SINCE'] );
    $mod_time = gmdate('D, d M Y H:i:s', filemtime($filename)) . ' GMT';
    if( $mod_time == $ims ) {
            header( 'HTTP/1.0 304 Not Modified' );
            exit;
    }
    header( 'Cache-Control: max-age=60' );
    header( 'Last-Modified: ' . $mod_time );
    header( 'Content-Type: application/octet-stream' );
    header( 'Content-Length: ' . filesize($filename) );
    header( 'Content-Transfer-Encoding: binary' );
    header( 'Content-Disposition: attachment; filename="'.$filename.'"' );
 
    $fp = fopen( $filename, 'rb' );
    while( !feof($fp) ) {
            echo fread( $fp, 1024 );
    }
    fclose($fp);
?>

這邊作一些說明:

WebAMP 對於已經存取過的檔案,會對 Web Server 發出 If-Modified-Since 的請求,要求 Web Server 確認該檔案是否已經修改過了

所以程式首先抓取 $_SERVER[‘HTTP_IF_MODIFIED_SINCE’] 變數,與 Last-Modified 比較,如果發現兩者相同,就回傳 HTTP/1.0 304 Not Modified 告知 WebAMP 這個檔案沒更新過然後直接結束程式 ( exit ),避免耗費頻寬

另外就是加上 Cache-Control: max-age=60 這個指令:

max-age 的效用等同以前的 Expires: header,但是使用起來更方便一點 (只須指定秒數)

max-age=60 是告知 WebAMP 該檔案 60 秒內都不會更新

這個設定會讓 WebAMP 在 60 秒內都不會來問 Web Server 是否有更新,可以降低 Server 的一些負載,超過 60 秒以後,WebAMP 會用 If-Modified-Since 的方式去問 Web Server 該檔案是否有更新

你可以依據需求以及檔案更新的頻率來適當調整這個數值

修改之後,除了第一次之外,結果當然是讓人滿意的囉:

# wget -v -S 'http://bbs.giga.net.tw/demo/dl-test3.php'
--15:12:36--  http://bbs.giga.net.tw/demo/dl-test3.php
           => `dl-test3.php'
Resolving bbs.giga.net.tw... done.
Connecting to bbs.giga.net.tw[203.187.29.180]:80... connected.
HTTP request sent, awaiting response...
 1 HTTP/1.0 200 OK
 2 Date: Mon, 01 Aug 2005 07:04:49 GMT
 3 Server: Apache/2.0.54 (FreeBSD) PHP/5.0.4
 4 X-Powered-By: PHP/5.0.4
 5 Cache-Control: max-age=60
 6 Last-Modified: Tue, 18 May 2004 08:53:23 GMT
 7 Content-Length: 1474750
 8 Content-Transfer-Encoding: binary
 9 Content-Disposition: attachment; filename="Peacock.jpg"
10 Content-Type: application/octet-stream
11 X-Cache: HIT from WebAmpRP@GIGAMEDIA
12 Connection: close

100%[====================================>] 1,474,750      1.32M/s

最後,我們回過頭來看看 Web Server 端的 LOG (access.log)

第一次下載 dl-test3.php 時,當然是 MISS 的,這時候的狀態碼是 200 :

203.187.29.181 - - [01/Aug/2005:14:51:01 +0800] "GET /demo/dl-test3.php HTTP/1.0"
               200 1474750 "http://bbs.giga.net.tw/" "Wget/1.8.2"

由於我們前面設定了 max-age=60,因此在 60 秒之內重複下載 dl-test3.php,都會由 WebAMP 直接處理掉,而不會在 Web Server 上面看到任何 LOG

但超過 60 秒後,你就會在 Web Server 上面看到 304 的狀態碼 (要求確認是否更新過):

203.187.29.181 - - [01/Aug/2005:14:52:06 +0800] "GET /demo/dl-test3.php HTTP/1.0"
               304 - "http://bbs.giga.net.tw/" "Wget/1.8.2"

確認過後,一樣要再隔 60 秒才會再向 Web Server 問一次 If-Modified-Since

最後,想瞭解更進一步資訊的,下面幾個連結可以參考看看:

歡迎大家都來試用看看 WebAMP 的服務!

以上這些作法不只適用於 WebAMP,只要您想要讓動態網頁可以被 Proxy 快取,都可以使用上述方法來修改程式

動態網頁也可以被快取喔!

話說 GIGAWebAMP 服務推出有一陣子了

很多人都以為 WebAMP 只能給靜態網頁使用,動態網頁無法得到任何加速效果

但其實只要程式設計得宜,動態網頁也有可能可以享受到 WebAMP 的網站超頻加速的效果喔

以下我們用一個簡單的例子來說明:

首先,我們先看這個原始圖片,大小約為 1.4 MBytes:

http://bbs.giga.net.tw/demo/Peacock.jpg

由於這個檔案是靜態檔案,因此理所當然會被 WebAMP 加速 (HIT),我們用 wget 來驗證看看:

# wget -v -S 'http://bbs.giga.net.tw/demo/Peacock.jpg'
--10:07:00--  http://bbs.giga.net.tw/demo/Peacock.jpg
           => `Peacock.jpg'
Resolving bbs.giga.net.tw... done.
Connecting to bbs.giga.net.tw[203.187.29.180]:80... connected.
HTTP request sent, awaiting response...
 1 HTTP/1.0 200 OK
 2 Date: Sat, 12 Mar 2005 15:25:22 GMT
 3 Server: Apache/2.0.52 (FreeBSD) PHP/5.0.3
 4 Last-Modified: Tue, 18 May 2004 08:53:23 GMT
 5 ETag: "51b65-1680be-12ff86c0"
 6 Accept-Ranges: bytes
 7 Content-Length: 1474750
 8 Content-Type: image/jpeg
 9 Age: 259658
10 X-Cache: HIT from WebAmpRP@GIGAMEDIA
11 Connection: close

100%[====================================>] 1,474,750    974.42K/s

接下來,我們測試一下用程式來動態輸出這個圖片,首先我們寫了一支 PHP 程式:

<?
#   http://bbs.giga.net.tw/demo/dl-test1.php

    $filename = 'Peacock.jpg';
 
    header( 'Content-Type: application/octet-stream' );
    header( 'Content-Length: ' . filesize($filename) );
    header( 'Content-Transfer-Encoding: binary' );
    header( 'Content-Disposition: attachment; filename="'.$filename.'"' );
 
    $fp = fopen( $filename, 'rb' );
    while( !feof($fp) ) {
            echo fread( $fp, 1024 );
    }
    fclose($fp);
?>

然後,我們用 wget 測試幾次看看:

# wget -v -S 'http://bbs.giga.net.tw/demo/dl-test1.php'
--10:14:29--  http://bbs.giga.net.tw/demo/dl-test1.php
           => `dl-test1.php'
Resolving bbs.giga.net.tw... done.
Connecting to bbs.giga.net.tw[203.187.29.180]:80... connected.
HTTP request sent, awaiting response...
 1 HTTP/1.0 200 OK
 2 Date: Mon, 01 Aug 2005 02:14:33 GMT
 3 Server: Apache/2.0.54 (FreeBSD) PHP/5.0.4
 4 X-Powered-By: PHP/5.0.4
 5 Content-Length: 1474750
 6 Content-Transfer-Encoding: binary
 7 Content-Disposition: attachment; filename="Peacock.jpg"
 8 Content-Type: application/octet-stream
 9 X-Cache: MISS from WebAmpRP@GIGAMEDIA
10 Connection: close

100%[====================================>] 1,474,750      325.21K/s

我們會發覺不管測試幾次,都會是 MISS 的情形!

接下來,我們稍微修改一下程式,加上 Last-Modified: 的 HTTP header …

<?
#   http://bbs.giga.net.tw/demo/dl-test2.php

    $filename = 'Peacock.jpg';
 
    header( 'Last-Modified: ' .
            gmdate('D, d M Y H:i:s', filemtime($filename) ) . ' GMT');
    header( 'Content-Type: application/octet-stream' );
    header( 'Content-Length: ' . filesize($filename) );
    header( 'Content-Transfer-Encoding: binary' );
    header( 'Content-Disposition: attachment; filename="'.$filename.'"' );
 
    $fp = fopen( $filename, 'rb' );
    while( !feof($fp) ) {
            echo fread( $fp, 1024 );
    }
    fclose($fp);
?>

上面 filemtime($filename) 主要是拿檔案的修改時間來當作 Last-Modified: 時間,不過要用 gmdate() 把 UNIX Timestamp 轉換成 GMT 格林威治時區的時間

加了上面 Last-Modified 這一行之後,我們再來測試一下:

% wget -v -S 'http://bbs.giga.net.tw/demo/dl-test2.php'
--09:56:23--  http://bbs.giga.net.tw/demo/dl-test2.php
           => `dl-test2.php'
Resolving bbs.giga.net.tw... done.
Connecting to bbs.giga.net.tw[203.187.29.180]:80... connected.
HTTP request sent, awaiting response...
 1 HTTP/1.0 200 OK
 2 Date: Mon, 01 Aug 2005 01:56:25 GMT
 3 Server: Apache/2.0.54 (FreeBSD) PHP/5.0.4
 4 X-Powered-By: PHP/5.0.4
 5 Last-Modified: Tue, 18 May 2004 08:53:23 GMT
 6 Content-Length: 1474750
 7 Content-Transfer-Encoding: binary
 8 Content-Disposition: attachment; filename="Peacock.jpg"
 9 Content-Type: application/octet-stream
10 X-Cache: MISS from WebAmpRP@GIGAMEDIA
11 Connection: close

100%[====================================>] 1,474,750    350.20K/s

第一次當然還是 MISS,不過第二次以後就都是 HIT

# wget -v -S 'http://bbs.giga.net.tw/demo/dl-test2.php'
--09:56:26--  http://bbs.giga.net.tw/demo/dl-test2.php
           => `dl-test2.php'
Resolving bbs.giga.net.tw... done.
Connecting to bbs.giga.net.tw[203.187.29.180]:80... connected.
HTTP request sent, awaiting response...
 1 HTTP/1.0 200 OK
 2 Date: Mon, 01 Aug 2005 01:56:25 GMT
 3 Server: Apache/2.0.54 (FreeBSD) PHP/5.0.4
 4 X-Powered-By: PHP/5.0.4
 5 Last-Modified: Tue, 18 May 2004 08:53:23 GMT
 6 Content-Length: 1474750
 7 Content-Transfer-Encoding: binary
 8 Content-Disposition: attachment; filename="Peacock.jpg"
 9 Content-Type: application/octet-stream
10 Age: 4
11 X-Cache: HIT from WebAmpRP@GIGAMEDIA
12 Connection: close

100%[====================================>] 1,474,750    950.12K/s

以上是以圖片作例子,你也可以代換成要被下載的檔案 (有些人會用這種方式來計算檔案被下載的次數)

甚至,討論區的文章如果能被正確貼上 Last-Modified: 的 header,也有可能可以享受到 WebAMP 加速的好處喔

更進一步的資訊,請參考下一篇「動態網頁也可以被快取喔! (Part II)

完善的台北縣自行車道系統

完善的台北縣自行車道系統

前一陣子在新聞有看到台北縣自行車道的相關報導,感覺似乎蠻不錯的

因此這個禮拜六心血來潮,進行了一趟北縣自行車道體驗之旅

基本上,我的行程是參考這個網頁的:

http://www.cyclingland.org.tw/road_1.asp

整個路線圖可參考:

http://tour.tpc.gov.tw/Suggestion/map.htm

我想從二重疏洪道出發到八里,因此參考了上面第一個網頁提供的資訊

公車 621 搭乘至三重中山南路站下車步行越堤道12分鐘即可抵達疏洪親水公園,疏洪12路路口

查了網頁,發現 621 在 捷運西門站 有停靠,所以我就先搭捷運到西門站,想轉搭 621 公車,但到了公車站牌才發現假日 621 號公車並沒有開,因此我就改搭另一班車到三重,
想說過中興橋後下車,走點路應該就會進入二重疏洪道了,然後就可以租腳踏車了…

我是很快就找到二重疏洪道了,在重新大橋旁、疏洪道最南端的疏洪運動公園,那邊有一個很大的跳蚤市場…

不過沒想到的是,一問之下才發現租車處(疏洪親水公園)是在疏洪道接近中段的位置,因此只好開始頂著大太陽往北走,走了將近一個半小時才到達疏洪親水公園租車處..

這邊要小小抱怨一下,二重的環狀自行車道既然是從最南端開始,租車處怎麼會設計在中段的位置…

另外,前面第二個網頁的路線圖還算清楚,不過 圖例說明 中最左下角 “租車處” 的字太模糊了,害我沒事先找到,所以走錯方向

頂著大太陽,好不容易走到了疏洪親水公園..

這是一個讓小朋友玩水的地方,裡面都是一些水上的遊憩設施,沒有很大就是了,好奇看了一下門票,發覺大人票竟然還比小孩子的票便宜…

我們直接到租車的地方租了輛協力車,協力車的租用價格是一個小時五十元,不過我們不想再騎回原點還車,所以使用甲地租、乙地還的方案,價格是四個小時300元

另外順道跟他們要了一份「台北縣市自行車道地圖」,其實這份地圖基本上就是前面第二個網頁內的地圖,只是這份實體地圖大多了,所有標示看起來都很詳細,如果早點拿到這份地圖就好了

租了車,稍微檢查一下車況,就騎著好不容易租到的腳踏車正式出發了… 這個時候是下午一點

二重疏洪道整體開發得很完善,來到這邊可以真正感受到蘇前縣長「衝衝衝」的政績

從二重疏洪道最南端開始,往北走依序是

疏洪運動公園
疏洪荷花公園
疏洪親水公園 (租車處)
疏洪中央公園
陽光運河
疏洪追風公園
疏洪沼澤公園
微風運河
疏洪蘆堤公園
疏洪圳邊公園
疏洪生態公園

不過由於之前走了一個多小時的路,加上太陽很大,因此我們並沒有停下來好好的參觀,我覺得下次應該安排下午三四點過後的時間再來仔細逛一下二重疏洪道的每一個公園以及看起來不錯的微風運河 (聽說還有免費的划船體驗)

沿途都是專用的自行車道,算是十分安全,除了有幾個地方必須要停下來過馬路以外

過了蘆洲、五股往八里方向,自行車道是沿著淡水河岸闢建的,騎起來感覺很好!

中途會經過關渡大橋,這邊照起相來感覺很漂亮,且沿途都可以看到水筆仔及各種生物,我們還看到了彈塗魚及小螃蟹,偶而還有水鳥在岸邊覓食

好不容易騎到了八里,已經接近下午三點了,找到有名的「佘家孔雀蛤」把午餐解決,然後逛了一下老街 (人真多),再吃了碗挫冰,就準備往回程了

從八里老街往回走,一直到關渡大橋處左轉上橋,過橋後右轉南下往關渡宮方向,這邊有個「觀山公園」,找到租車處把腳踏車還了,距離租車時間剛好四個小時 🙂

在這邊剛好看到慈濟的師兄師姐們舉辦免費量血壓的活動,他們熱情地送上熱茶,並招呼我們量血壓… 量的結果很標準 🙂

然後我們參觀了不遠處的關渡宮,看得出來關渡宮歷史蠻悠久的,而且裡面蠻大的,上面還有個公園,視野真的不錯,南面可以看到淡水河,東邊可以看到關渡自然公園的水鳥保護區

在這邊休息了一陣子,沿著路往北走大概十分鐘,就看到了關渡捷運站,終於踏上歸途,真是充實的一天…

unicode 中的 KK 音標符號

颱風天在家上網,偶然之下看到了 CMU 製作的一個音標資料庫:

The CMU Pronouncing Dictionary

雖然資料已經有點舊了,不過既然資料庫的版權說明寫著可以免費散佈使用,就想說把他拿來放進 cdict.net 裡面好了

網頁是使用 BIG5 編碼的,而顯示這些音標符號時,我又不想跟 YAHOO 字典 一樣,直接用小圖組成音標,所以就找了些資料,想辦法在 BIG5 的網頁下面利用 unicode 顯示這些音標符號

CMU 的資料庫中共用到 40 個音標符號,不過似乎並不是標準的 KK 音標,每個音標符號各以一或兩個英文字母的代碼表示,整份列表是長這個樣子的:

HARBESON  HH AA1 R B IH0 S AH0 N
HARBIN  HH AA1 R B IH0 N
HARBINGER  HH AA1 R B IH0 N JH ER0
HARBINGERS  HH AA1 R B IH0 NG ER0 Z
HARBINSON  HH AA1 R B IH0 N S AH0 N
HARBISON  HH AA1 R B IH0 S AH0 N
HARBOLD  HH AA1 R B OW2 L D
HARBOR  HH AA1 R B ER0

經過與 unicode 比對之後,整理出來的對應表如下:

代碼 音標 Unicode 顯示方式 代碼 音標 Unicode 顯示方式
AA ɑ U+0251 &#x251; K k k
AE æ U+00E6 &#xE6; L l l
AH ʌ U+028C &#x28C; M m m
AH0 ə U+0259 &#x259; N n n
AO ɔ U+0254 &#x254; NG ŋ U+014B &#x14B;
AW ɑʊ U+0251
U+028A
&#x251;
&#x28A;
OW o o
AY ɑɪ U+0251
U+026A
&#x251;
&#x26A;
OY ɔɪ U+0254
U+026A
&#x254;
&#x26A;
B b b P p p
CH t U+0283 t&#x283; R r r
D d d S s s
DH ð U+00F0 &#xF0; SH ʃ U+0283 &#x283;
EH ɛ U+025B &#x25B; T t t
ER ɚ U+025A &#x25A; TH θ U+03B8 &#x3B8;
  ɝ U+025D &#x25D;        
EY e e UH ʊ U+028A &#x28A;
F f f UW u u
G g g V v v
HH h h W w w
IH ɪ U+026A &#x26A; Y j j
IY i i Z z z
JH d U+0292 d&#x292; ZH ʒ U+0292 &#x292;

其中 ɝ 這個音標並沒有被 CMU 這個資料庫用到,我也不知為什麼,可能是它用的並不是標準的 KK 音標吧

另外,比較奇怪的一點是,使用 Firefox 瀏覽這些 unicode 音標符號都沒有問題,但是使用 Internet Explorer 的話,有部分符號會顯示出不出來(變成一個空白的框框)

經過試驗之後,把字型設定成 Lucida Sans Unicode 就可以了

CMU 這個音標資料庫中還有重音符號在內,只是由於它是標在母音的地方,所以如果沒有經過特殊判斷,直接顯示出來會跟一般字典上的音標表示法不太一樣

  音標 Unicode 顯示方式
重音 ˈ U+02C8 &#x2C8;
次重音 ˌ U+02CC &#x2CC;

這兩個重音符號,在 Firefox 下面一樣沒有問題,但是在 IE 下面,就算用 Lucida Sans Unicode 也是顯示不出來…XD 要用 Arial Unicode MS 才能顯示出來,但是 Arial Unicode MS 反而顯示不出上面的音標符號…

有興趣的人可以到 http://cdict.net/ 上面試用看看