中秋神秘海灘月光海

南澳神秘海灘、朝陽國家步道、東澳東岳湧泉、大同鄉梵梵溫泉

雖然從小在宜蘭土生土長,但是宜蘭的很多景點也都沒有去過,利用這次中秋假期,夥同幾個朋友簡單規劃了一些行程,拜訪了一些以前沒去過的景點

因為行程決定得很匆促,所以火車票鐵定是訂不到了,因此我們決定中秋節當天一早從台北搭 8:38的2719次電車下去,然後在蘇澳新站(注意:不是蘇澳站喔)換搭北迴線火車到達南澳…

但由於班次加上列車延誤的緣故,我們足足在蘇澳新站多等了一個多小時的時間,
偏偏蘇澳新站附近十分荒涼,找不到地方吃中餐,也沒處可逛…
早知道就到羅東或蘇澳站附近逛一逛再回來搭車

另外值得一提的是,建議若要轉北迴線的車到南澳,還是應該在羅東轉車比較好,班次會比較多,有些往南澳的車是不會停蘇澳新站的!這可以避免因為突發狀況耽擱了行程

不過鐵道旅行還是蠻愜意的,下次應該安排一次行程把北迴線的一些小站好好玩一玩

好不容易下午一點半左右終於到達南澳站了….

下車後,先找到前一天訂的民宿,放好行李,然後就走路到 朝陽社區 活動中心,活動中心內可以免費借用腳踏車,還有一些旅遊資料可索取

很有趣的是,我們雖然在南澳,但朝陽社區卻是屬於蘇澳鎮朝陽里,而不是南澳鄉…
朝陽社區的社區總體營造成效很不錯,感覺很親切

借了腳踏車後,就趕回南澳街上趕快把肚子填飽,然後去逛了一下原生植物林,就準備往神秘海灘去了,途中順便去嚐了一下南澳街上「建華冰店」有名的清冰…

到達神秘海灘時,天已經黑了,中秋夜我們就坐在神秘海灘上面賞月..
沒有光害下,一輪明月初升,月光倒映在海中,形成隱隱約約的月光海,真是令人感動的美麗然沒有腳架,手邊也只有一台小光圈的 Pentax Optio 555 數位相機,還是克難地拍了幾張美景

當天賞月之後,在回程途中剛好看到震安宮有舉辦中秋節晚會,有晚會表演不稀奇,各地都有…但這邊竟然有免費的餐點可用,看著滿滿一桌的食物和飲料,嘿嘿… 我們又省了一餐了…

隔天一早,我們也是先騎腳踏車造訪南澳農場,這邊有一堆休旅車在這邊露營


然後再去爬朝陽國家步道,上面可以看到南澳漁港以及美麗的東部海岸線


接著就去歸還了腳踏車,中午在南澳街上填飽了肚子,就再搭上往東澳的火車了…
本來還想先往南到武塔的,但火車班次接不上,因此這次只好先放棄囉…

東澳火車站一出去沒多遠就是東澳國小

然後走個大約十分鐘,就可以到達東岳湧泉

東岳湧泉在鐵路橋下,一樣有好多人在這邊露營

看到清澈的湧泉,我們顧不了天氣陰陰的,還是借了個帳篷換好泳衣,跳下去游了幾圈



然後我們又晃到了美麗的東澳海灘,這邊怕危險我們當然不敢下去游囉

接下來就回羅東囉,晚餐當然是在羅東夜市解決囉….

隔天就有車可開了,一早出發往三星,先到味珍香卜肉店抽好號碼牌(人實在爆多的),
然後到長埤湖逛了一個小時,再回來就差不多輪到我們了,我是真的還蠻喜歡這家的卜肉和酸辣湯的

吃完卜肉,先回三星街上嚐了好吃豆花,然後就出發往英士村前進,
把車停在英士村的社區內,換好泳裝,就開始徒步往梵梵溫泉前進…

我們沒穿涼鞋來真是失策,因為最後一段要溯溪而行,鞋子怕弄濕一定要脫掉,
然而這邊都是大大小小的石頭,走起來腳會有點痛~~

我們這次去有一處要渡河,水深大概到大腿腰部,因此最好在社區內就換好泳裝,就不怕弄濕了..

走大約十五分鐘,就來到有溫泉的地方,這邊要DIY,自己挖溫泉池,把溫泉與河水混合,
我們挖了一陣就放棄了,還是去找人家挖好的好了,溫泉還真的蠻燙的,沒有引進河水會被燙傷喔


當然,大部分的人都是開高底盤四輪傳動車過英士橋後,左方下至河床溯溪上去…

不過上週聯合報剛好有一篇報導「 芃芃溪浩劫 垃圾紛飛車橫闖
希望大家還是將車停在社區內再步行過去,讓梵梵溫泉能永續發展..

這天晚餐在附近的英仕山莊旋轉餐廳解決,晚上還蠻漂亮的

然後就回羅東囉,很幸運地,剛好又讓我找到了已經十幾年沒吃過的小點心「嘟好燒」..

就這樣,三天的中秋假期就以這小點心嘟好燒作了一個完美的結尾 ^^

踩到 FreeBSD 6.1 的地雷…

昨天裝了台機器,由於有兩台相同容量的 18G 硬碟,此裝好之後順手替 root partition 加上了 Software RAID….

沒想到一時疏忽,修改 fstab 時忘了加上 /mirror/ …

/dev/mirror/gm0s1b none swap sw 0 0
/dev/mirror/gm0s1a / ufs rw 1 1

所以重開機時開不起來了…
原本根據 這篇 的說明,只要在 mountroot> prompt 下,重新指定 root partition 位置就可以進去修正了…

但是,沒想到好像踩到 FreeBSD 6.1 的地雷了:
kern/98910: [kbd] keyboard not working at mountroot prompt on IBM T42P

也就是 mountroot> 下鍵盤不能動了…. 我用的是研華的伺服器,問題跟上面這個 PR 一模一樣…

偏偏我這台機器的光碟和軟碟又都壞了…. 只好很苦命的再把機器搬出機櫃來拆開,外接光碟重新修正了事….

svndumpfilter with wildcards support ?

Subversionsvnadmin obliterate 功能一直沒有實作出來,這實在是有點麻煩,尤其是當負責管理一個 repository 時,常常就會有人把 *.exe, *.obj, *.lib, *.a 統統給 commit 進去了….

然後你就會發現整個 repository 長大的速度越來越快,就算事後用 svn delete 把它砍掉還是無濟於事,因為那已經成為無法抹滅的歷史了

雖然可以事先設定 svn:ignore 來解決,不過偶而還是會有漏網之魚,官方提供的解決方法是使用 svndumpfiler 來把不要的檔案徹底從歷史記憶中濾除

# svnadmin create REPOS2
# svnadmin dump REPOS1 | svndumpfilter exclude XX.exe | svnadmin load REPOS2

這方法當然沒有 svnadmin obliterate 好,不過也是目前狀況下不得不的作法

但是這個方法最大的問題在於 svndumpfilter 無法接受 wildcards (萬用字元),也就是你無法指定 svndumpfilter exclude ‘*.exe’

所以,萬一不小心遇上了機車的狀況,你可能要一個一個把檔名找出來濾掉 XD

所以不久前就想辦法修改了 svndumpfilter 的程式,把它加上直接濾除特定副檔名檔案的功能…

[patch to subversion/svndumpfilter/main.c]
(the filename with leading dot will be matched against filename extension)

--- subversion/svndumpfilter/main.c.orig
+++ subversion/svndumpfilter/main.c
@@ -111,7 +111,12 @@
       pfx_len = strlen(pfx);
       if (path_len < pfx_len)
         continue;
-      if (strncmp(path, pfx, pfx_len) == 0)
+      if( pfx[0] == '.' )
+      {
+        if( strncmp( path+path_len-pfx_len, pfx, pfx_len ) == 0 )
+          return TRUE;
+      }
+      else if (strncmp (path, pfx, pfx_len) == 0)
         return TRUE;
     }
 
@@ -1257,7 +1262,8 @@
             style, and absolute. */
        SVN_INT_ERR(svn_utf_cstring_to_utf8(&prefix, os->argv[i], pool));
        prefix = svn_path_internal_style(prefix, pool);
-       prefix = svn_path_join("/", prefix, pool);
+       if( prefix[0] != '.' )
+          prefix = svn_path_join("/", prefix, pool);
        APR_ARRAY_PUSH(opt_state.prefixes, const char *) = prefix;
      }
  }

--- subversion/svndumpfilter/main.c.orig +++ subversion/svndumpfilter/main.c @@ -111,7 +111,12 @@ pfx_len = strlen(pfx); if (path_len < pfx_len) continue; - if (strncmp(path, pfx, pfx_len) == 0) + if( pfx[0] == '.' ) + { + if( strncmp( path+path_len-pfx_len, pfx, pfx_len ) == 0 ) + return TRUE; + } + else if (strncmp (path, pfx, pfx_len) == 0) return TRUE; } @@ -1257,7 +1262,8 @@ style, and absolute. */ SVN_INT_ERR(svn_utf_cstring_to_utf8(&prefix, os->argv[i], pool)); prefix = svn_path_internal_style(prefix, pool); - prefix = svn_path_join("/", prefix, pool); + if( prefix[0] != '.' ) + prefix = svn_path_join("/", prefix, pool); APR_ARRAY_PUSH(opt_state.prefixes, const char *) = prefix; } }

這個 patch 有點投機取巧,因為我懶得真的去實作 wildcards,我需要的功能只要能濾除指定的副檔名就可以了…

所以這個 patch 把原來 svndumpfilter include/exclude 後面接的檔名參數作特殊判斷,只要第一字元是小數點,就當作要去 match 的副檔名,因此,要濾除 *.exe 只要這樣作就可以了:

# svnadmin create REPOS2
# svnadmin dump REPOS1 | svndumpfilter exclude .exe | svnadmin load REPOS2

剛好看到前幾天也有人寫了個 PATCH 讓 svndumpfilter 完全支援 wildcards… 不過我沒試過,相信不久的將來應該會被整合進正式版本中

當然最希望還是 svmadmin obliterate 能早日被支援,就不用這麼辛苦了

Zooomr 終於有照片上傳工具了!

話說 Zooomr 已經推出有一段時間了,功能是很多沒錯,而且又有免費的 2.5GB/month 的 PRO 級帳號可申請

只是可惜一直以來都沒有 upload tool 可用,導致只能一張一張從網頁上傳,所以沒能好好利用它的空間…

不過好消息來了,就是新版的 jUploadr 除了支援 Flickr 之外,現在也開始支援 Zooomr 了!

雖然上傳的速度有點慢,不過現在我可以很容易把照片一拖拉庫都丟上去了,而理所當然,第一本丟上去的相簿當然就是昨天登玉山的照片囉…

使用 bcompiler 來編譯(加密)您的 PHP 原始碼

Using bcomipler to compile (encode) your PHP script (in FreeBSD)

eAccelerator 的 encoder 在 PHP 5.1 以後就無法運作了,使是最新的版本 0.9.5 也不行,因此如果您還想用 eAccelerator 的 encoder,乖乖待在 PHP 4.x or PHP 5.0 吧,相關資訊可參考之前的兩篇文章:

根據 mailing list 上面作者最新的說法,短期內應該都還不會修復,甚至有可能還會放棄支援 encoder 部份,作者還推薦大家改用 bcompiler … orz
所以如果你跟我一樣必須要用 PHP 5.1 的話,就跟我一起來玩看看 bcompiler

附帶一提,原本是要買 ionCube 公司開發的 PHP Encoder 的,這看來是目前編譯(加密)PHP 原始碼最好的選擇,價格也不算貴,而且花的是公司的錢,不過還是先試用看看 bcompiler 好了,真的不好用的話,再來買囉

以下的安裝與使用說明均以 FreeBSD 為範例,其他作業系統應該也差不多,請自己試看看吧

在正式安裝之前提醒你,bcompiler 會用到 bzip2 這個 extension,所以先安裝一下 php5-bz2:

# cd /usr/ports/archivers/php5-bz2
# make install clean

bcompiler 是一個收容於 PECL 的 PHP extension,您可以直接使用 pecl 這個命令來安裝,而 pecl 的使用方法與 pear 相同,因此你必須先安裝 pear :

# cd /usr/ports/devel/pear
# make install clean

pear 安裝好後,同時會有一個 pecl 命令可用 (/usr/locel/bin/pecl),可用它來安裝 bcompiler

pecl install channel://pecl.php.net/bcompiler-0.8

不過呢,我發現直接執行 pecl 會發生錯誤(至少在 FreeBSD 下是如此):

# pecl
Fatal error: Call to undefined function preg_match() in ...

問題出在 /usr/local/bin/pecl 這個 script 的最後一行:

exec $PHP -C -n -q $INCARG -d output_buffering=1 -d safe_mode=0 ...

這一行的 -n 這個選項代表不載入 php.ini 設定檔,因此 pcre.so 就沒有被載入,
然後你就看到上面的錯誤了,所以自己去改一下程式把 -n 拿掉吧….

拿掉之後,安裝程式應該就可以正常運作了了:

pecl install channel://pecl.php.net/bcompiler-0.8

安裝好後,記得要改設定把 bcompiler 這個 extension 載入

# echo "extension=bcompiler.so" >> /usr/local/etc/php/extensions.ini

bcompiler 全名是 PHP bytecode Compiler,詳細的使用方法可以參考 PHP 網站上的詳細說明: PHP bytecode Compiler: http://www.php.net/manual/en/ref.bcompiler.php

看不懂的話,bcompiler_write_file() 這個 function 的說明裡面有範例:

$fh = fopen("example.phb", "w");
bcompiler_write_header($fh);
bcompiler_write_file($fh, "example.php");
bcompiler_write_footer($fh);
fclose($fh);

為了易於使用,我寫了一個簡單的 script,使用方法如下:

BENCODER v1.3 - Encode your PHP script using bcompiler

Usage: bencoder [-f] [-q] -o FILE    file1.php
       bencoder [-f] [-q] -o OUTDIR  file1.php file2.php ...
       bencoder [-f] [-q] -o OUTDIR  -s SRCDIR  [-e SUFFIX] [-r] [-c] [-l]

  -o FILE   : the file name to write the encoded script
              (default to '-encoded.XXX' suffix)
  -o OUTDIR : the directory to write all encoded files

  -a SRCDIR
  -s SRCDIR : encode all files in this source directory

  -r        : encode directories recursively (no by default)
  -f        : force overwriting even if the target exists
  -e SUFFIX : encode the files with the SUFFIX extension only (default: php)
              (regular expression allowed, ex: "php|inc")
  -c        : copy files those shouldn't be encoded (no by default)
  -l        : follow symbolic link (no by default)
  -q        : do not print the file name while encoding or copying
  -b
  -bz2      : compress the encoded files with bz2 (needs bzip2-extension)

想用的人到 這邊 自己抓回去玩玩看吧

# wget http://bencoder.urdada.net/bencoder
# chmod 755 bencoder
# mv bencoder /usr/local/bin/

在把程式使用 bcompiler 編碼之後,執行的時候發覺 $_SERVER 以及 $_ENV 的變數都不見了,後來查了資料,才發現要把 auto_globals_jit 關掉 (Off) 才行,請直接修改您的 php.ini :

; When enabled, the SERVER and ENV variables are created when they're first
; used (Just In Time) instead of when the script starts. If these variables
; are not used within a script, having this directive on will result in a
; performance gain. The PHP directives register_globals, register_long_arrays,
; and register_argc_argv must be disabled for this directive to have any affect.
auto_globals_jit = Off

Boston 近郊旅遊

四月底到美國東岸出差,不巧正好碰上 Boston 的雨季,所以幾乎都只能待在旅館內,只有幾天碰上難得好天氣可以出去玩

這一天放假,剛好天氣不錯,就和 Hsian 兩個人開著租來的車車,利用車上的 GPS 導航設備選了幾個景點準備讓科技帶我們到處走走囉

首先我們想去海邊,所以就把 GPS 定位到位於 Boston 東南方的「Plymouth」港口,這裡是1620年從英國運送清教徒的船隻「五月花號」登陸的地方,後來在這邊簽了一份《五月花協定》(Mayflower Compact)。這份自治宣言後來成了《獨立宣言》和《美國憲法》的先驅。

在這邊,我們看到了一艘仿製五月花號的船隻「Mayflower II」以及古老的登陸踏腳石「Plymouth Rock

然後,我們把 GPS 定位到 Boston 西北邊的「Concord」,在這邊我們遊覽了「Walden Pond」以及走訪了美國古老的戰場 MINUTE MAN NATIONAL HISTORICAL PARK),這邊是1775年美國爆發獨立戰爭的第一聲槍響的地方

最後,我們把 GPS 定位到 Boston 東北邊的 Gloucester、Rockport,這是一個漁港小鎮,我們一個禮拜後還再來了一次享受超便宜的龍蝦大餐,一人一隻大龍蝦只要12塊美金

重點來了,我們在 Rockport 附近找到一個州立保留區 Halibut Point State Park,其實這是一個以前的採石場,後來廢棄後蓄水成一個小湖,感覺就是很漂亮的美景,配合夕陽光輝,這一天過得真是十分充實且愉快