Planet DebianTW

February 08, 2010

tsung

在 phpBB 加入 Google Analytics code

要在 phpBB 加入 Google Analytics code 的步驟:

  1. vim styles/prosilver/template/overall_footer.html
  2. 於 </body> 前加入
    <script..... Google Analytics code ..</script>

放最下面除了頁面比較快外, 主要是 Analytics code 有時後會把頁面卡住, 雖然可以設 async 避免(Google Analytics goes async), 不過, 盡量不想去改 Google 本身提供的語法.

by jon at February 08, 2010 09:41 PM

大同電鍋不銹鋼蒸籠 - 說明書食譜

大同電鍋 相信是家家必備的良品, 之前買沒有用心看說明書, 前幾天去買 大同不銹鋼蒸籠 才發現有時間表可以參考.

註: 蒸籠蠻好用的, 原本的要努力疊起來的食物, 蒸籠直接可以平擺, 擺滿滿的一起蒸, 輕鬆多了~

說明書很容易弄丟, 所以把說明書的食譜目錄打起來放. (註: 幾杯 => 量杯的水量)

電鍋使用時間表 (空鍋)

  • 水量: 時間
  • 半杯: 14分
  • 1杯: 20分
  • 1杯半: 26分
  • 2杯: 32分
  • 2杯半: 38分
  • 3杯: 44分
  • 3杯半: 50分
  • 4杯: 56分
  • 4杯半: 62分

食譜目錄

健康的飲食是少油炸多蒸煮

  • 菜名 - 量杯 - 備註
  • 苦瓜排骨 - 1杯半 - 用中茶杯裝盛, 再放入蒸籠內.
  • 茄片白鯧 - 1杯 - 蕃茄, 蔥, 薑, 酒, 鹽, 胡椒粉放在魚上面.
  • 陰瓜仔肉 - 1杯半 - 加入鹹蛋黃與蒜頭, 風味更佳.
  • 鼓汁小排 - 1杯半 - 豆鼓, 蒜頭, 辣椒切碎, 炒香淋在排骨上.
  • 冬菇蒸機 - 1杯半 - 蔥, 薑, 雞肉, 冬菇調味後拌勻, 放入平底盤.
  • 蒜泥白肉 - 1杯半 - 後腿肉蒸完後, 切片淋上調味料即可.
  • 醉雞 - 1杯半 - 雞肉蒸完後, 放入蔥, 薑, 麻油, 紹興酒浸泡.
  • 鮮菇醬肉 - 半杯 - 鮮菇切大塊, 加入豬肉醬肉, 放入平底盤.
  • 蒸花椰菜 - 半杯 - 花椰菜蒸完後, 淋上蠔油, 香油蒜末即可.
  • 蒸蛤蜊 - 半杯 - 用大碗公裝盛, 湯汁不流失.
  • 蒸紅蟳 - 1杯 - 鎖住原味, 營養不流失.
  • 蒸蕃薯 - 1杯 - 蕃薯去皮後, 切塊.
  • 茶碗蒸 - 1杯 - 用中茶杯裝盛, 再放入蒸籠內.
  • 筒仔米糕 - 2杯半 - 用中茶杯裝盛, 再讓入蒸籠內.
  • 芋頭扣肉 - 2杯半 - 用中碗公裝盛, 蒸完後倒扣即可.
  • 苦瓜蒸肉 - 2杯 - 苦瓜切半, 加入絞肉, 香菇, 再放入蒸籠內.
  • 人參雞 - 3杯半 - 用燉盅裝盛, 再讓入蒸籠內.
  • 蘿蔔糕 - 4杯 - 用棉布放入蒸籠內, 再倒入蘿蔔泥.
  • 蒸玉米 - 1杯 - 將玉米去掉外殼抹鹽, 再讓入蒸籠內.
  • 金針排骨 - 1杯半 - 用中茶杯裝盛, 再放入蒸籠內.

by jon at February 08, 2010 04:10 AM

February 04, 2010

tsung

於系統 移除 CNNIC 憑證

CNNIC 似乎很嚴重, 最近正忙到不可開消, 還好有不少長輩清楚的將原由、嚴重性做清楚的說明~

CNNIC 事件說明

下述摘錄自: Untrustable CNNIC SSL CA

CNNIC 就跟 TWNIC 一樣,是國家級的網路管理中心,主要負責如 domain registration 業務。雖然 CNNIC 號稱是非營利組織,但實際上對於豎立 GFW 之中國政府的各項要求,沒有能力拒絕。事實上,CNNIC 也幹過,發佈內含流氓軟件功能,且使用者無法刪除的中文上網官方版軟體這種事。

由於 CNNIC SSL CA 被納入 Root CA,依據 SSL CA 的階層式信任的架構,CNNIC 隨時可以發佈假的 CA,進行 SSL MITM (Man-In-The-Middle) 攻擊。這個意思是說,當你從境外連結中國境內的網站,透過 SSL 登入該網站系統時,即使瀏覽器顯示此 SSL 安全連線安全無虞,但實際上因為假的 CA 之故,很有可能連到的實際上是個釣魚網站 (DNS hijacking 是中國 GFW 常用的技倆)。因此,你的帳號密碼,就會被竊取;而如果這密碼是平常常用的密碼,那你所有平常用的資訊服務,盡皆淪陷。

另一種更可能的情境是,在中國境內連 Gmail 時,由於 CNNIC 的假 CA 與 DNS hijacking 之故,連到的是假的 Gmail 登入頁,你很可能毫無所覺,使自己的 Gmail 帳號密碼拱手予人。

CNNIC 憑證的結論

  • 結論: 盡快把 CNNIC 的憑證從系統移除.

於 Debian、Ubuntu Linux 移除 CNNIC 憑證

方法1
  1. sudo dpkg-reconfigure ca-certificates
  2. 選 Ask
  3. 將 mozilla/Entrust.net_Secure_Server_CA.crt 前面的 * 拿掉.
方法2
  1. sudo vim /etc/ca-certificates.conf
    mozilla/Entrust.net_Secure_Server_CA.crt
    改成 (前面加 "!" 號)
    !mozilla/Entrust.net_Secure_Server_CA.crt
  2. sudo update-ca-certificates

於 Firefox 刪除 CNNIC 憑證

  1. 編輯 -> 偏好設定 -> 進階 -> 加密
  2. 檢視憑證清單 -> 憑證機構
  3. 將 Entrust.net 下面的全部選起來, 按 "刪除" 即可.

相關網頁

by jon at February 04, 2010 09:22 PM

February 03, 2010

tsung

Google Open Source Porject 列表

Google Open Source 的專案到底有哪些? 總列表在哪?

Google Open Source Porject 列表

相關網頁

by jon at February 03, 2010 09:35 PM

Rex's blah blah blah

Java JVM 的 Dual Stack/IPv6 連線問題

大約從 J2SE 1.4/1.6 開始,Sun 所釋出的 Java runtime 開始支援 IPv6 連線功能。一般的 Linux 的套件系統 也開始支援 IPv6,許多系統預設是同時開啟 IPv4/IPv6 或稱為 Dual Stack 網路功能。

基本上,鼓勵各種軟體開始移植到 IPv6 網路上是一件好事。Java runtime 若在 dual-stack 的機器上,預設走 IPv6 位址,因為 IPv6 位址可同時走 IPv4/IPv6 網路。不過問題在於,若一般的 GNU/Linux Debian, Ubuntu 系統,預設會啟動 IPv6 介面,無論你所在網路是否有 IPv6 路由。

於是,你若在 Linux 上使用一些 Java 寫成的網路軟體,如 JDownloader 等,很有可能發生軟體運作後,卻什麽地方都連不上的症狀。解決辦法一是關閉 IPv6 網路功能,一則是利用 JRE 的參數,改為預設使用 IPv4 網路。

檢查 IPv6 是否驅動

首先,你若想確認是否開啟了 IPv6 網路,可於終端機下使用此指令判斷

$ ip addr|grep inet6

若出現了 inet6 之位址,即為開啟了 IPv6 網路。

你若想快速的關閉 IPv6 功能,可以利用 root 執行 ip 指令,直接刪除 inet6 位址

/sbin/ip addr del <ipv6address>/<prefixlength> dev ethX

舊版核心

在舊版核心,IPv6 功能是以模組方式存在,妳可以透過更改 modprobe (module-init-tools) 的設定,讓系統不載入對應驅動程式。關閉的方式很簡單,請修改 /etc/modprobe.d/ 之設定,如以 root 執行以下指令

# cat > /etc/modprobe.d/00local.conf <<EOF
alias net-pf-10 off
alias ipv6 off
EOF

更改之後,重新開機即可關閉 IPv6 功能。

新版核心

在新版的 Debian/Ubuntu 中使用 2.6 核心,因為內建 IPv6 驅動程式, 你得利用開機參數 (cmdline) 關閉之。作法是修改 /etc/default/grub 檔案,更改 GRUB_CMDLINE_LINUX_DEFAULT 一行,加入 ipv6.disable=1,如

GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1 quiet"

修改完畢後,請用 root 執行 update-grub 後,重新開機。

JRE 參數

另外一項作法是更改 JRE 參數,你若知道啟動該軟體的 shell script 位於何處,可新增一參數如下

$ java -Djava.net.preferIPv4Stack=true Main

這樣就可以要求 JVM 預設使用 IPv4 stack.

這是一篇 Tips.

修訂紀錄 (20100207): 補充利用 iproute 關閉 ipv6 方法,說明新舊版核心處理方式。

by Rex Tsai at February 03, 2010 12:00 PM

February 02, 2010

tsung

PHP 免費線上電子書 - Practical PHP Programming

PHP 免費的線上電子書, 這本應該不算是入門, 比較偏中上程度適合閱讀, 裡面也有提到如何寫 PHP extensions 的 Hello world 版.

Practical PHP Programming 電子書

線上文件: Practical PHP Programming

目錄

  1. Preface
  2. Introducing PHP
  3. Simple variables and operators
  4. Functions
  5. Arrays
  6. Objects
  7. HTML Forms
  8. Files
  9. Databases
  10. Cookies and Sessions
  11. Multimedia
  12. XML & XSLT
  13. Output Buffering
  14. Java and COM
  15. Networks
  16. Miscellaneous topics
  17. Security concerns
  18. Performance
  19. Writing PHP
  20. Writing extensions
  21. Alternative PHP uses
  22. Practical PHP
  23. Bringing it to a close
  24. Answers to Exercises
  25. The future of PHP
  26. Glossary

by jon at February 02, 2010 09:36 PM

Cornelius

Vim - glob 應用

臨時需要將一目錄下所有的檔案插入為 img tag ,所以臨時直接在 vim command line 下寫了 這樣的東西來應付:


整理了一下:

by c9s (cornelius.howl@gmail.com) at February 02, 2010 03:53 AM

February 01, 2010

tsung

教育部免費的楷書字型

教育部提供免費的楷書字型可以讓一般人使用, 商用填寫資料來申請授權.

詳細可見: 教育部免費的楷書字型

by jon at February 01, 2010 08:32 PM

jouston

CarryMe快跑之三成到麻布

今天心情不好。各種狀況一大堆。 下班了以後,可以自己亂亂跑,是讓我很開心的事情。 騎CarryME回到InterContinental Grand Seoul,Doorman大概都已經因為我的CarryME而熟識了。開心的聊了一下,就回到房間裡把筆記型電腦丟在房間,然後打開GPS logger準備出發。 由於是晚上,肚子餓了,本來打算到現代百貨公司吃飯,結果地下美食街實在沒有甚麼看上眼的食物,就又拖著CarryME走向COEX Mall的懷抱。莫名其妙的被某家有部隊湯(Butae Jikae)的店吸引進去,結果很神奇的點了牛肉湯(YuKaeChan),而且還是不辣的版本。某前同事要是看到一定又會說我舌頭已經壞掉了,是啦,是有一點點的辣味,只不過跟我平常熟悉的辣牛肉湯比起來,這一點點大概只是輕微的調味而已。 吃飽喝足了以後,拉著CarryME上1F,也不知道去哪裡,

by noreply@blogger.com (Jouston Huang) at February 01, 2010 02:52 PM

Rex's blah blah blah

git archive 與 log 小技巧

時常,你得將手上的軟體原始碼壓起來釋出給第三方使用、測試。特別是你希望提供 daily basics/ revision basics 讓使用者取得最新版軟體的時候。

由於最近都已經只用 git,依據我自己的習慣,希望能夠在檔名中使用簡碼版次,以便未來能夠追蹤出該版次的問題。稍微問了一下友人與查了一下文件,取得 abbreviated commit hash 的作法如下

git log --pretty=format:"%h" -1

若你想將整份程式碼壓縮起來,可以使用

git archive --format zip -o filename.zip HEAD

倘若想加上日期作為檔名,請使用

git archive --format zip -o $(git log --pretty=format:"%h" -1).zip HEAD

若常常使用這個指令,有兩種作法,一是設定為 git alias. 另一則是利用 git 的 commands (verbs) 命名機制,在你的執行路徑 下,寫入一檔案名稱如 git-zip。並將上述指令加入檔案中,未來就可以使用 git zip 來產生最新版壓縮檔。

作法如
$ cat > ~/bin/git-zip
#!/bin/sh
git archive --format zip -o $(git log --pretty=format:"%h" -1).zip HEAD
$ chmod u+x ~/bin/git-zip
$ cd git-repository
$ git zip

另外,為了容易辨識版次,你也可以利用 gitattributes 在程式碼中加入 ident ($Id$) 作為標示。操作可參考 Lloyd Huang 所寫之 Howto.

這是一篇 Tip.

by Rex Tsai at February 01, 2010 12:00 PM

Cornelius

hypergit.vim (A Git plugin for vim)

最近的作品 - hypergit.vim。先前的 fastgit.vim 經過一些思考後,打掉重寫了,新增的 GitMenu 讓原本越來越的 Command 得以有組織性的以樹狀選單呈現,更 Powerful。

正為了要有一個樹狀選單,所以晚上以 VimL 實做了 Helper Message Class 以及 TreeMenu Class ,以方便其他各種 Plugin 需要用時重用。

該 Git Menu 可自動 Parse Remote 名稱 、Branch 名稱以產生 TreeMenu ,以及各 Menu Node 都可像 Nerd Tree Plugin 一般延展、收和,或執行。

以下是 Screenshot:


Well, It's still under development.

by c9s (cornelius.howl@gmail.com) at February 01, 2010 10:13 AM

Vim - Making your script auto-installable

Once you write a plugin , you will need it to be auto-installable. Vimana is a script manager , which parses script files, and looks for a "script type:" tag to install the script.

For example , if you have script , which is a ftplugin , then you should write:


in your script file. cases is ignored.

then the plugin could be installed via Vimana script manager.


Or if you have multiple file to install , you can put your script files in this kind of directory structure:

plugin/script.vim
ftplugin/script.vim
doc/script.txt

then tar it and upload to vim.org site , the plugin could be installed via Vimana too.

by c9s (cornelius.howl@gmail.com) at February 01, 2010 09:52 AM

Vim - TreeMenu.vim

This is a TreeMenu class for VimL. so that you can render a tree menu in a buffer.

Synopsis:


and you can also hook a method to after_render when each time the menu buffer is updated , just like what i do in hypergit.vim - I need to redraw git help message when the buffer is updated by tree menu.


Menu Source:

by c9s (cornelius.howl@gmail.com) at February 01, 2010 09:43 AM

January 31, 2010

tsung

Windows 免費燒錄軟體 - 燒錄 MDF、NRG、ISO、CDI 檔

前幾天要燒片子, 要用 Windows 免費燒錄軟體 - CDBurnerXP 正好網站掛了, 只好重新再替代品, 順便做做紀錄.

  • 註1: 我要燒錄的類型主要是MDF、NRG、ISO、CDI
  • 註2: CDI 是 毒蛇(DiscJuggler) 的映像檔, 可用 DiscJuggler、酒精燒錄, 或用 IsoBuster 解壓縮 到硬碟.

NRG、MDF、ISO 的燒錄軟體

  • 買光碟機通常都會附 Nero, 就可以輕鬆解決燒錄 NRG 的問題.
  • 另外要燒 MDF, 目前找到的免費軟體是 ImgBurn (可燒錄: BIN, DI, DVD, GI, IMG, ISO, MDS, NRG 和 PDI 檔).
  • 所以灌 Nero + ImgBurn, 就可以解決大多數問題囉~

相關網頁

by jon at January 31, 2010 09:35 PM

Asho(阿信)

2010/01/31練車後記

    寄來了適合小一的杯架,所以我也迫不及待地學著拓海把水裝到2/3的位置這樣開車。試試看如何不讓水溢出來。

     我選擇的路線是半天岩附近的路,不是很長,但有一些高低差的U型彎,而且這裡也是我十年前練手排車的地方,頗讓人回味。




    我以速限再加10~20的速度進行上下坡,上坡時,由於小一只有75馬力(March引擎),所以上山其實滿慢的,加上杯子的水只有2/3(裝太少了),所以根本沒有溢出來。

    接下來就是換下坡了,下坡其實有點小危險,但內心卻是很刺激!!!速度大約控制在40~60的速度+OD off的狀態,入彎依照Out-In-Out的規則切入,看好剎車點後再點剎入彎,之後車頭出彎後再加速,放在後車廂的東西跑來跑去的,聽起來怪有趣的...

    只不過在U型彎上,能感受到小一的不順,必須降到很慢才好轉,不然車子就有點推頭的現象,大概是我的技術還不到家...

    開這一段路時,會很明顯地感覺到以前開手排1800cc時和自排1300cc的差異,以引擎反應上,手排似乎能馬上依照我的想法去動,降檔、過彎、出彎和油門控制,手排反應比較明顯。但開小一時,就是有一種不順的感覺說不上來,尤其是過彎的穩定度。

    我想可能是我方向盤的轉向控制還不夠好,我開車時習慣單手開,這樣我能更細緻地去感受方向盤和油門踩踏的配合,高低差不大時,我還可以反應過來。高低差一大,另一隻手就要幫忙轉向,但這樣子就會忽略油門細膩的控制,還必須多練習。神之手果然不是蓋的...

     開了一陣子後,遇到前面有一台Lancer,我似乎靠太近了,所以就停下來讓對方走一陣子再開,也想一下過彎的感覺...

    經過這一次的練習,我覺得除了轉向+剎車的穩定度外,行車線也很重要,行車線對了,G力也會小一點,坐在車上也比較舒服。下一次我就要再挑戰一次,水要加到4/5以上這樣開看看...


題外話一:
    這一次開車出去,也發現了自已開自排會出現的問題,在倒車時,我的腳習慣在油門,有時候就會把油門當成剎車踩...Orz...這可能跟我以前開手排的關係...

    知道這個問題後,以後開自排時,一切到R檔,我就改成腳在剎車上待機,就不會出現這個問題了。

題外話二:
    這樣開山路,雖然只有短短的三十公里,油卻耗了不少...Orz......

by 阿信 (noreply@blogger.com) at January 31, 2010 07:23 PM

jouston

在韓國首爾(Seoul)暢行無阻的CarryMe

昨天凌晨,被老闆要求星期一要到韓國支援某個客戶。 大家看過"Who wants to be Millionaire?"嗎?這就是我的真實生活。 我立刻開始想辦法訂飛機票,喔,從今天開始到2月6日全部客滿(訂機票當日為Jan 30th),很好。EzTravel,這次不能靠你了。接下來,衝到EVA Air網站,憑藉著我是銀卡會員,先登入來碰碰運氣。啊哈,只有今晚才有班機... XD 花了一點時間訂票之後,才發現,靠腰,原來是MD90小飛機... 好吧,就算了,就算搭船也好,能把我星期一前送到都是好的。 接下來,接著訂飯店,印象中上次去韓國出差,距離公司最近的就是InterContinental,Hotel.com看看(我是想賺那個十晚送一晚的Package啦),啥?完全沒有List... 然後逛逛其他網站之後,馬上決定,就試試看InterContinental網站吧。 沒有想到,

by noreply@blogger.com (Jouston Huang) at January 31, 2010 02:08 PM

FourDollars

在 Debian GNU/Linux 5.0.3 (Lenny) 上面安裝 Drupal 6.15

首先要準備一個 Debian GNU/Linux 5.0.3 (Lenny) 的系統環境,這邊是選擇使用 debian-503-i386-netinst.iso 並透過網路安裝,
在安裝過程當中語系選擇英文並且在 Software selection 時只選擇安裝 Web server 以及 SQL database 來安裝,盡量維持系統精簡,

接下來應該只要再抓 59 個套件安裝,在 2M/256K ADSL 正常情況的網路環境下五分鐘以內就可以裝好了,

到這邊為止應該已經裝好所需要的 Apache 跟 PostgreSQL 了,重新啟動系統後再安裝 drupal6 跟 php5-pgsql 套件,
# apt-get install drupal6 php5-pgsql
在設定 drupal6 的畫面中記得要輸入密碼,不然系統會改使用 ident 機制,安裝完後需要重新啟動 Apache
# /etc/init.d/apache2 restart
就可以在 http://XXX.XXX.XXX.XXX/drupal6/install.php 看到 Drupal6 接下來的安裝程序

不過此時只有英文介面,如果需要安裝繁體中文介面就要執行接下來的動作,
# wget http://ftp.drupal.org/files/projects/zh-hant-6.x-1.5.tar.gz -O - | tar xz -C /usr/share/drupal6
然後重新載入網頁就可以看到繁體中文介面,

Drupal6 初始設定完成之後馬上就會發現到目前的 Drupal6 版本並不安全,

因為 Debian GNU/Linux 5.0.3 (Lenny) 上面的 Drupal 版本只有到 6.6 版,
所以現在要去升級到目前最新穩定版本 6.15
# wget http://ftp.drupal.org/files/projects/drupal-6.15.tar.gz -O - | tar xz -C /usr/share
# wget http://ftp.drupal.org/files/projects/zh-hant-6.x-1.5.tar.gz -O - | tar xz -C /usr/share/drupal-6.15
# cd /usr/share
# chown -R root.root drupal-6.15
# mv -v drupal6 drupal-6.6
# ln -s drupal-6.15 drupal6
# cd drupal-6.15
# rm -fr profiles sites
# ln -s /etc/drupal/6/profiles
# ln -s /etc/drupal/6/sites
然後在網頁瀏灠器裡面訪問 http://XXX.XXX.XXX.XXX/drupal6/update.php 來更新資料庫

更新完後回到 [狀態報告] 就可以看到

此時算是才把 Drupal 6.15 在 Debian GNU/Linux 5.0.3 (Lenny) 上面安裝好,
不過目前都只有框架沒有內容也沒有安裝任何模組也沒有客製化的 Theme

by FourDollars (fourdollars@gmail.com) at January 31, 2010 06:30 AM

January 28, 2010

FourDollars

在 Ubuntu 9.04 上面使用 hg view

之前寫過一篇 在 Ubuntu 9.04 上面手動安裝 hgview
剛剛發現原來在 ~/.hgrc 裡面加上
[extensions]
hgk=
這樣就可以使用 hg view 了~
http://mercurial.selenic.com/wiki/HgkExtension 找到的資訊

by FourDollars (fourdollars@gmail.com) at January 28, 2010 10:05 PM

fred

Apple iPad 所帶來的省思

就在睡夢中,地球另一端的 Apple 推出了新產品『iPad』,傳說中的平板電腦終於亮相,乍看之下 iPhone/iPod 的放大版誕生了,似乎沒什麼特別之處。不過一旦到了這種尺寸,許多人不免會拿 iPad 和國內近來炒翻天的電子書(ebook)相比較。確實,用電腦的思維去看這產品是不太恰當的,會缺少許多電腦狂熱族群要的功能,但若單以電子書的角度來看,這次 Apple 賞了我們一個大巴掌。


國內廠商依然趕不上的 UI 設計

以前電子產品的設計,因為技術限制,只求達到目的,不注重人們的使用經驗。但是,這樣的概念已經慢慢不適用於現在,許多電腦廠商卻仍抱著做出功能即可的心態,才導致功能不斷增加,價格不斷跌落的惡性循環。科幻電影和小說的一切是人們共同忡景,缺少改善使用經驗的努力,就等於跟千千萬萬人們作對一樣。

不可否認,就算 iPhone 第一代發表至今少說也有三年之久,但仍然沒有第二家廠商能做出能與之相敵的界面。就算單單是將 iPhone 的界面直接放大製成 iPad 而不做任何變動,不論流暢度和使用觀感,依然領先群雄。

在 iPad 宣傳影片中,展示了幾幕電子書的應用,Apple 嘗試將書本的感覺和閱讀習慣做到冰冷的玻璃裡面去,翻頁操作也好、翻頁過場效果也好,讓人感到不突兀、不陌生、不多餘,令人感受到有其細膩的設計。雖然並不是全部都很完美,但某些部份確實讓人能感受到友善。

我們可以試想,同樣的硬體,若是交給國內的廠商來設計 UI ,最後產品會變得多麼可笑?我們是不是該花點心思在使用者經驗上?難到就連照抄都抄不出來?


廠商的藉口:特效不重要!

講到 UI 、使用者經驗,許多廠商往往會說特效不重要,試圖運用詭辯,一刀將 Apple 的優點通通斬殺。撇開今天的產品,回想第一代 iPod,當時也沒什麼動畫和特效,一個簡單的圓形觸控,就已滿足了許多人的使用經驗,至今回頭來看,我們依然能感受到其 UI 的友善。

那麼,特效不重要是廠商們做不到的藉口?還是因未深思熟慮 UI 設計的無知之言?


專注內容格式的綁定好無聊

有鑒於 Microsoft DOC/PPT 和 Adobe PDF/Flash 的成功,全天下的人都妄想製作自家的專利格式,甚至在電子書市場,想要透過格式通殺產業。雖然格式是最後成功和賺錢的關鍵,但尚未被使用者接受前,可是一無是處,與其整天想抽格式費用,還不如先把產品做好。

我們看到 Apple Store 的成功,格式的綁定成功,不是在於他格式訂的好,而是他產品品質做的好,以致有眾多路人甲接受。


後記

或許很多人覺得 Apple iPad 是騙錢的東西,但事實上,的確沒有其他產品可與之相競爭,就算只是換個包裝就上市,同業眾廠也只能眼紅看著它搶錢。

話說回來,因為最近案子太忙,根本沒空將 MTK 接著完成,心中想要做的 Multi-touch UI Toolkits,到現在都沒辦法好好坐下來寫呀!雖有很多自我反省,卻缺少時間和金錢完成,遺憾!

此外,若有廠商想要做和 iPad 一樣的產品,可以來找 ULLab 呀!身為研發人員,也妄想可以設計些特別又前衛的產品!只可惜總苦無機會!!

by cfsghost@gmail.com (Fred Chien(錢逢祥)) at January 28, 2010 08:44 AM

January 27, 2010

tsung

Linux 透過 SSH SOCKS 連線 來 使用 Firefox / Pidgin(MSN, GTalk..)

現在不少醫院都有無線網路, 但是使用後, 體驗被限制只有開 80, 443 Port 的感覺.

但是我在這邊最少要待三天, 陪產(n天) + 生產完(3~7天), 至少要讓 SSH、MSN 能通才行.

  • 註1: 於 Ubuntu Linux, Windows 可以利用 Putty 來達成.
  • 註2: 此篇重點 sudo ssh -D 80 user@example.com -p 443
  • 註3: 在醫院連國外網站(ex: YouTube 被擋掉的話),透過自己的 Server 當 Proxy 會快很多. XD

基礎環境

首先, 要先找好朋友, 幫忙弄台 Server, 讓 ssh port 加開 80 或 443 Port. (沒有這個, 後續就不用玩了. XD)

  1. vim /etc/ssh/sshd_config
    Port 22 # 於這下面加上下述即可.
    Port 443
  2. /etc/init.d/ssh restart # 22, 443 就都可以連進此 Server. (可同時開兩個 Port)

使用 ssh -D 來建立 SOCKS

於 Localhost 開啟 80 Port, 與遠端(example.com)的 443 Port 串起來.

  1. netstat -tln | grep 80 # 先看看 localhost 有沒有佔用 80 Port, 若有佔用, 需要停掉.
  2. sudo ssh -D 80 user@example.com -p 443 # 80 Port 需要 root 權限.
  3. 連線進去後, 只要將此連線留著, 不要關掉即可.

Firefox 透過 SOCKS 連線

  1. 編輯 -> 偏好設定
  2. 進階 -> 網路 -> 設定(連線, 設定 Firefox 要如何連到網路)
  3. 手動設定 Proxy -> SOCKS 主機
    • 127.0.0.1
    • 80 # 看 localhost 設得 Port
    • 確定 # 測試是否可以連線, 若可以正常瀏覽網頁, 代表透過 SSH 是通得.

Pidgin 透過 SOCKS5 連線

  1. 帳號 -> 編輯帳號 # MSN / Gtalk 都一樣設定法.
  2. 代理伺服器
    • SOCKS 5
    • 127.0.0.1
    • 80 # 看 localhost 設得 Port
    • 儲存 # 即可連線

相關網頁

by jon at January 27, 2010 09:30 PM

Tetralet

Luna's Debian/Ubuntu Archiver 開張!(10/01/27 更新)

雖然說 Debain 的套件包山包海,但總有一些遺珠之憾,唯一的辨法也只有自己動手包。還有最近又卡在 Debian Lenny 的釋出,一堆套件凍在 experimental 裡連 unstable 都進不去,有時有什麼新版軟體想嘗鮮時也只好自己動手了。還有一些 upstream 不收的 patch,想要套用的唯一方式也只有自己動手了。因此,長久以來敝人的硬碟裡總會躺著一些自己包的 deb 檔,於是就興起了架一個 Debian Archiver,讓自己能方便取用。就這樣,Luna's Debian Archiver 開張了!

以下為 Luna's Debian Archiver 所提供的套件列表:(粉紅色底色為有所更新 者)

套件名稱
說明 (未特別註明者僅提供 Debian Lenny 版)
fceu 任天堂模擬器。請參考:任 天堂模擬器 FCE Ultra
版本為 0.98.15。
fceux 任天堂模擬器 fceu 的後續版本。但對遊戲的支援度似乎變差了。
有包含一個 GUI 版的前端 gfceux。
版本為 2.1.2。
gens Sega 模擬器。請參考:SEGA Mega Drive 模擬器 Gens
版本為 2.16.7,包含了 GUI。
僅提供 Debian Squeeze 版。
以及 Ubuntu Intrepid、Ubuntu Jaunty、Ubuntu Karmic 版。
zsnes
超級任天模擬器。請參考:超 任模擬器 Zsnes
就算在 Eee PC 上跑也是遊刃有餘呦~
建議安裝 libsdl1.2debian-oss 套件以取得較佳的音效效果。
版本為 1.51b。
提供 Debian Lenny、Debian Squeeze 版。
以及 Ubuntu Intrepid、Ubuntu Jaunty 版。
vbam GBA 模擬器。
版本為 1.8.0~svn928,包含了 GUI 版的 gvbam。
僅提供 Debian Squeeze 版。
以及
Ubuntu Intrepid、Ubuntu Jaunty、Ubuntu Karmic 版。
icewm
很不錯的 Window Manager。請參考:功 能強悍的 Window Manager - IceWM!
因為近期 testing 版本的 winoptions 有問題,因此在此提供的是 stable 版。
版本為 1.2.38~pre2,並提供 amd64  (Lenny) 的 deb 套件。
libtrash 一個用來避免誤刪檔案的超實用工具。
舊的 2.4 版不知為何無法攔截 rm 操作,因此在此提供了最新版本。
版本為 3.2。並提供 amd64  (Lenny) 的 deb 套件。
shaperd
本機頻寬控管。請參考:使 用 Shaperd 來限制本機頻寬!
去掉了無義意且會佔滿 /var/log/messages 的 "invalid packet... " 錯誤訊息。
版本為 0.2.1。
fontconfig 已套用 Firefly 允許字型漏字 1% 的 patch
如果您還在用王漢宗教授的字型,建議安裝。
版本為 2.8.0。
gcin
極度推薦的中文輸入法。請參考:GCIN 中文輸入法簡介

感謝 caleb 的 patch 檔!
關閉了 new_gtk_im,如此 GCIN 在 Firefox 裡應該不再會亂搶 focus 了。
因為 gcin-qt3-immodule 及 gcin-qt4-immodule 套件已不再相依於 libqt,將其併入 GCIN 套件之中。

版本為 1.4.6 及 1.4.7~pre3(在新的 Debian Package Maintainer 正式接手前,本站將會持續提供最新版的 deb)
提供 Debian Lenny、Debian Squeeze 版。
以及 Ubuntu Intrepid、Ubuntu Jaunty、Ubuntu Karmic 版。
並提供 amd64  (Sqeeze 及 Karmic) 的 deb 套件。
libvte9 加上了防止它吃掉一些輸入法快速鍵的 patch,建議 GCIN 使用者安裝。
提供 Debian Lenny (版本為 0.16.14)Debian Squeeze(版本為 0.22.5)
以及 Ubuntu Intrepid (版本為 0.17.4)、Ubuntu Jaunty 版 (版 本為 0.20.1)Ubuntu Karmic  (版本為 0.22.2)
並提供 amd64  (Sqeeze及 Karmic) 的 deb 套件。
lilyterm 請參考:LilyTerm - 輕巧人性化的 libvte based X Terminal Emulator
版本為 0.9.8。
提供 Debian Lenny、Debian Squeeze 版。
以及 Ubuntu Intrepid、Ubuntu Jaunty 版、Ubuntu Karmic 版
並提供 amd64  (Sqeeze及 Karmic) 的 deb 套件。
madedit
基於 wxWidget 函式庫,支援 Hex、非常不錯的文字編輯器。
版本為 0.2.9-1
提供 Debian Squeeze 版的 i386 及 amd64 的 deb 套件。
libtorrent CLI 下最好用的 torrent 函式庫。新增了非官方的 magnet link 支援。
版本為 0.12.6。
rtorrent CLI 下最好用的 torrent 用戶端。新增了非官方的 magnet link 支援及支援彩色文字。
版本為 0.8.6。
tree
修正在 zh_TW.UTF-8 下無法顯示中文檔名的問題。
由於 upstream 從 1.5.3 開始,會以雙字元顯示目錄樹,這在很多 X Terminal Emulator 下會出現問題,因此停留在 1.5.2 版。
並提供 amd64  (Sqeeze) 的 deb 套件。
gtkperf 可用來測試 GTK 元件描繪速度,加上了會重覆跑 10 次後會自動結算的功能。
版本為 0.40。
同時提供了 Ubuntu Intrepid 版!
wm-torture 可用來測試 Window Manager 的描繪速度。
版本為 0.1。
xengine 可用來測試 X Window System 的描繪速度,加上了會自動結算的功能。
版本為 1.11。
xrenderbenchmark 一個 QT based,可用來測試 X Window System 的描繪速度。
版本為 0.10。
xmms 著名的音樂播放程式。但 Debian Lenny 已經不收了。
重新編譯讓它能在 Debian Lenny 下運作。
若要解決 XMMS 在 UTF-8 環境下亂碼的問題,請下載正確的 XLC_LOCALE 檔案,並蓋過 /usr/share/X11/locale/zh_TW.UTF-8/XLC_LOCALE 即可。請參考:在 GNU/Linux 上設定字型 (中) - 安裝與設定 X11 字型
版本為 1.2.11。
並提供 amd64  (Lenny) 的 deb 套件。
xmms-status-plugin XMMS 的 System Tray 外掛。
重新編譯讓它能在 Debian Lenny 下運作。
版本為 1.0.0。
並提供 amd64  (Lenny) 的 deb 套件。
xmms-wma 讓 XMMS 支援 WMA 的外掛。
重新編譯讓它能在 Debian Lenny 下運作。
請記得在編譯時,要使用 Debian Etch 版的 libavformat-dev libavcodec-dev,否則即使編譯成功也無法正確運作。
版本為 1.0.5。
並提供 amd64  (Lenny) 的 deb 套件。
btrfs-progs
傳說中的 Linux 終極 File System 的工具程式。想試試 btrfs 威力的人可以試玩一下。
版本為 0.17。
zfs-fuse
傳說中的終極 File System - zfs 的 fuse 版。想試試 zfs 威力的人可以試玩一下。
版本為 0.5.1。

如果您也想使用這些套件,請在 /etc/apt/sources.list 中加入:

Debian Lenny:
deb http://debian.luna.com.tw/lenny ./
deb-src http://debian.luna.com.tw/lenny ./

Debian Squeeze/Sid 的使用者可再加上:
deb http://debian.luna.com.tw/squeeze ./
deb-src http://debian.luna.com.tw/squeeze ./
而 Ubuntu Intrepid 則為:(將在 Ubuntu 9.10 推出後中止)
deb http://debian.luna.com.tw/intrepid ./
deb-src http://debian.luna.com.tw/intrepid ./
若是 Ubuntu Jaunty 的則為:
deb http://debian.luna.com.tw/jaunty ./
deb-src http://debian.luna.com.tw/jaunty ./
若是 Ubuntu Karmic 的則為:
deb http://debian.luna.com.tw/karmic ./
deb-src http://debian.luna.com.tw/
karmic ./
然後執行 apt-get update 後就能用 apt-get 安裝了。請注意,套件內的 Package Maintainer 資訊敝人並沒未更新為本人的名字。若造成任何困擾敝人深感抱歉。

如果使用 apt-get 來安裝時卻發現仍然安裝的是 Debian/Ubuntu 所提供的舊版本的話,請先利用 apt-cache 來確認您可安裝的版本。例:
# apt-cache policy gcin
gcin:
  已安裝:1.4.5-1.1
  候選:1.4.5-1.1
  版本列表:
     1.4.7~pre3-0~1.oldgtk 0
        500 http://debian.luna.com.tw ./ Packages
     1.4.6-0~1.oldgtk 0
        500 http://debian.luna.com.tw ./ Packages
 *** 1.4.5-1.1 0
        990 http://ftp.tw.debian.org testing/main Packages
        500 http://ftp.tw.debian.org unstable/main Packages
        100 /var/lib/dpkg/status
     1.4.0-1 0
        500 http://ftp.tw.debian.org stable/main Packages

然後,用 apt-get 來強制安裝新的版本:
apt-get install gcin=1.4.7~pre3-0~1.oldgtk
如果在使用上發現什麼問題想把它降回其它版本的話,可以用 apt-get 來降級回特定的版本:
apt-get install gcin=1.4.6-0~1.oldgtk
或是安裝 Debian 官方所提供的版本:
apt-get install gcin/testing
如果您在使用上有遇到任何問題,或是套件未能即時更新,請向敝人反應。謝謝!

by tetralet at January 27, 2010 01:27 PM

January 26, 2010

tsung

Crontab 不會自動執行 修復、處理步驟

發現 Crontab 已經好幾天都不會執行, 有點詭異.

直接 crontab -e 再去 新增 / 修改 也都不會動, 手動執行都是正常.

註: crontab 寫法都是正確的.

檢查、更新 Crontab

做下述的檢查、重新設定的動作看看.

  1. ls /var/spool/cron/crontab # 看權限是某正確, 資料是否正確.
  2. 若有使用 flock, 然後有存 tmp file 的, 把那些 tmp file 都砍了.
  3. crontab -l > cron_backup; crontab -r; crontab cron_backup # 把 crontab 砍掉重新匯入
  4. 以上都做過, Crontab 還是都不會動.

解法

上述做法都沒有用, 最後試試 重新啟動 cron, 結果就可以動了, 重新啟動步驟如下:

  1. ps aux | grep cron
    root     15082  0.0  0.0  18708  1068 ?        Ss   13:23   0:00 cron
  2. kill 15082
  3. ps aux | grep cron # 若已經自動跑起來, 就不需要下面的步驟
  4. /usr/sbin/cron &

by jon at January 26, 2010 08:56 PM

January 25, 2010

tsung

Git .gitignore 設定 與 注意事項 - 以 Zim 操作為範例

Git 設定 .gitignore, 設定完成就都直接生效, 在測試時都很正常, 但是實際使用 卻沒有生效, 有點軌異.

環境

  • Git 所管理的專案名稱、位置: /home/user/doc

下述範例是以 Zim 為主, Zim 是一套桌面的 Wiki 編輯器, 裡面寫的內容都會存成 txt 檔, .zim 的目錄下會存 "*.cache" 和 "zim 本身自己的設定值".

Zim 在剛開始建立完成後, 就使用下述步驟:

  1. cd /home/user/doc
  2. git init
  3. git commit -a
  4. git push #一開始沒有設定 .gitignore, 所以會將 .zim/* 都 commit 進去

於每次開啟 Zim 後, 都會出現

modified:   .zim/history.cache
modified:   .zim/index.cache

造成 git commit -a 的麻煩 (因為多台電腦要同步時, index.cache / history.cache 都會出現需要 merge 的狀況), 所以想設定 .gitignore 來把它拿掉. (方便 git commit -a)

設定 .gitignore 位置、方法

設定 Git ignore 的方式都一樣, 有下面幾個地方可以設定, 依自己喜好 / 需求來設定即可.(設定位置)

  • vim ~/.gitignore # 對所有 Git 的專案生效 (自己的 home 目錄下)
  • vim doc/.gitignore # doc 是專案名稱, 用這個的好處是, 將 .gitignore commit 進去, 此 .gitignore 可以隨著專案到處走. (Git 管理的 Project 目錄下)
  • vim doc/.git/info/exclude # 只有單獨於此處 .git 生效 (Project 的 .git/info/exclude 檔案)
  • 這幾個地方都可以設定, 可以使用 * 等符號. 詳可見: gitignore(5) Manual Page

於 .zim 的狀況, 可以設定下述: (設定方法)

  • 所有 . 開頭的目錄 / 檔案都不 commit
    .*
  • .zim 目錄內 的 所有 *.cache 都不 commit
    .zim/*.cache
  • 只有 .zim/history.cache, .zim/index.cache 不 commit
    .zim/history.cache
    .zim/index.cache

.gitignore 無法生效 的 問題修復

在測試狀況都是正常, 但是在 Zim 實際使用就有問題, 每次都出現 modified 的解法.

解法
  1. 因為第一次 commit 已經將 .zim/*.cache commit 進去了, 所以每次它都會去檢查, 造成都出現 modified 的狀況.
  2. git rm -f .zim/history.cache
  3. git rm -f .zim/index.cache
  4. git commit # 即可
  5. 再將 .gitignore 設定好, 就可以避免掉這些狀況囉~ :)

範例 -我的 Zim 設定方式

  1. cd /home/user/doc
  2. vim .gitignore
    .zim/*.cache
  3. git add .gitignore
  4. git commit
  5. git push

by jon at January 25, 2010 09:39 PM

January 24, 2010

tsung

為 Debian Linux Kernel 2.6.32 補上 e100 Firmware library

Debian Linux 做 apt-get dist-upgrade 時, kernel 居然直接升到 Debian GNU/Linux, with Linux 2.6.32-trunk-amd64, 再來似乎有不少的慘劇要處理.

出現 Possible missing firmware /lib/firmware/ 等訊息, 詳細如下:

update-initramfs: Generating /boot/initrd.img-2.6.32-trunk-amd64
W: Possible missing firmware /lib/firmware/e100/d102e_ucode.bin for module e100
W: Possible missing firmware /lib/firmware/e100/d101s_ucode.bin for module e100
W: Possible missing firmware /lib/firmware/e100/d101m_ucode.bin for module e100
W: Possible missing firmware /lib/firmware/rtl8168d-2.fw for module r8169
W: Possible missing firmware /lib/firmware/rtl8168d-1.fw for module r8169

於 linux-image-2.6.32-trunk-amd64 缺少下述: (為何移出 Kernel? 可見最下面的相關網頁)

e100: e100/d102e_ucode.bin, e100/d101s_ucode.bin, e100/d101m_ucode.bin
r8169: rtl8168d-2.fw, rtl8168d-1.fw

補上 e100 Firmware

  • vim /etc/apt/sources.list # 增加 non-free
    deb http://ftp.us.debian.org/debian/ testing main non-free contrib
    deb-src http://ftp.us.debian.org/debian/ testing main non-free contrib
尋找所需 Package
  1. apt-get install apt-file
  2. apt-file update
  3. apt-file search /lib/firmware/e100/
    firmware-linux: /lib/firmware/e100/d101m_ucode.bin
    firmware-linux: /lib/firmware/e100/d101s_ucode.bin
    firmware-linux: /lib/firmware/e100/d102e_ucode.bin
安裝 firmware-linux
  1. apt-get update
  2. apt-get install firmware-linux # 會安裝 firmware-linux firmware-linux-nonfree
  3. ls /lib/firmware/ # e100 出現囉~

註: r8169 還沒找到該怎麼補.

相關網頁

by jon at January 24, 2010 09:28 PM

Cornelius

Vimana - new feature.

Vimana 的移除功能總算是找時間弄好了,兩個新的 Feature:

1. Customizable Runtime Path:

$ vimana install [plugin] --runtime-path [path]

可以指定要安裝的 Runtime Path , 可在 .vimrc 內加上 set runtimepath+=[your/path] 。

2. To uninstall Plugin:

$ vimana remove [plugin]

即可移除安裝

或者強迫移除安裝:

$ vimana remove [plugin] --force

基本上 Installation 的 Record 都是以 JSON 格式置放在 ~/.vim/record 內,所以若有其他的 implementation 也可以很輕易的讀取,VimL 則可以直接 eval 該 record 來取得資料。

by c9s (cornelius.howl@gmail.com) at January 24, 2010 09:08 PM

January 23, 2010

jouston

Skoda Superb TDi 2.0 主觀試車報告

各位還記得2009年底的台北車展嗎? 這裡還有一些照片可看 展中最吸引我目光的就是三台車,Porsche Panemera, Skoda Superb 2.0 TDi和Hyundai i30CW 1.6柴油款三台車。第一台問了大致報價就直接放棄試車的念頭,第二台大致在勉強可以接受的範圍,第三台車只有4速自排。 上圖引用自快車報,他們的圖集還有更多好看的照片。 在本文開始之前,先講一下我作為試車手的個人背景,平日我用來通勤的娃娃車是Toyota Tercel 1.5CL手排,避震器換成TRD加上APEX短彈簧,腳上踩的是Michellin Pilot Exalto PE2 155/50/15規格的胎。最近加裝了AOE 21mm的防傾桿。平日開車並不會把轉速用盡,不過偶而開得比較快的時候,也是有檔檔一拜的機會。 簡言之,我是個比較熱血的駕駛者。

by noreply@blogger.com (Jouston Huang) at January 23, 2010 05:42 AM

January 22, 2010

FourDollars

在 Linux 系統上面手動安裝 Firefox 3.6

首先到 http://www.mozilla.com/ 下載 firefox-3.6.tar.bz2 回來
然後解壓縮到 /usr/local/lib/firefox-3.6 底下
$ mkdir -p /usr/local/lib
$ tar xf firefox-3.6.tar.bz2 -C /usr/local/lib
$ mv /usr/local/lib/firefox /usr/local/lib/firefox-3.6
然後建立一個啟動圖示
$ mkdir -p .local/share/applications/
$ cat > .local/share/applications/firefox-3.6.desktop <<ENDLINE
[Desktop Entry]
Version=3.6
Name=Firefox 3.6 網頁瀏灠器
Comment=瀏灠網頁
GenericName=網頁瀏灠器
Exec=/usr/local/lib/firefox-3.6/firefox %u
Terminal=false
X-MultipleArgs=false
Type=Application
Icon=/usr/local/lib/firefox-3.6/chrome/icons/default/default48.png
Categories=Application;Network;
MimeType=text/html;text/xml;application/xhtml+xml;application/xml;application/vnd.mozilla.xul+xml;application/rss+xml;application/rdf+xml;image/gif;image/jpeg;image/png;
StartupWMClass=Firefox
StartupNotify=true                                                                                                                                                                                              
ENDLINE
這樣就可以了~ :D

by FourDollars (fourdollars@gmail.com) at January 22, 2010 12:56 PM

January 21, 2010

tsung

mlterm 使用 ssh 連外部機器, 無法使用 screen 的問題修復

使用 mlterm ssh 連到其它機器, 使用 screen 出現下述訊息:

Cannot find terminfo entry for 'mlterm'.

於是就 無法使用 screen.

解法1

  1. 於本機
  2. export TERM=vt100 # 或可將此寫入 .bashrc
  3. ssh xx.xx.xx.xx
  4. screen # 即可正常使用.

解法2

  1. mlterm -y vt100
  2. ssh xx.xx.xx.xx
  3. screen # 即可正常使用.

相關參數

  • alias mlterm='mlterm -fg=white -bg=black -r 60 -A -w 20 -O right  -y vt100'
  • alias mlterm='mlterm -fg=white -bg=black -r 60 -A -w 20 -O none -t true -y vt100'

by jon at January 21, 2010 10:00 PM

January 20, 2010

tsung

PHP 將 UTF-8 的 字串 依 指定長度 切割成陣列(str_split 的 UTF-8版)

PHP 的 str_split() 的功能、使用方式 如下:

<?php
$str = 'Hello';
print_r(str_split($str)); // array('H', 'e', 'l', 'l', 'o')
print_r(str_split($str, 3)); // array('Hel', 'lo')
?>

str_split() 可以將 字串 依 需要的長度 做分割, 但是對 UTF-8 的中文, 就無法切依需要的長度來做切割, 要自己另外處理.

註: 下述程式 使用方法 都跟 str_split() 一樣.

str2_split(): mb_strlen() + mb_substr()

直覺的使用 mb_strlen() + mb_substr() 來寫 UTF-8 版, 對於文字短的狀況, 速度都還夠快.

<?php
function str2_split($string, $split_len = 1)
{
    $len = mb_strlen($string, 'UTF-8');
    if ($len > $split_len || !$split_len) {
        for ($i = 0; $i < $len; $i++) {
            $parts[] = mb_substr($string, 0, $split_len, 'UTF-8');
            $string  = mb_substr($string, $split_len, $len, 'UTF-8');
        }
    } else {
        $parts = array($string);
    }
 
    return $parts;
}
?>

utf8_str_split() - 取自 Joomla - pasamio

後來想想, 這個應該早就有人寫過, 而且一定比上面的好又快, 於是找找 str_split utf-8, 第一筆就找到 Joomla 的 utf8_str_split(). XD

下述轉載自: File source for str_split.php

<?php
/**
* @version $Id: str_split.php 10381 2008-06-01 03:35:53Z pasamio $
* @package utf8
* @subpackage strings
*/
function utf8_str_split($str, $split_len = 1)
{
    if (!preg_match('/^[0-9]+$/', $split_len) || $split_len < 1)
        return FALSE;
 
    $len = mb_strlen($str, 'UTF-8');
    if ($len <= $split_len)
        return array($str);
 
    preg_match_all('/.{'.$split_len.'}|[^\x00]{1,'.$split_len.'}$/us', $str, $ar);
 
    return $ar[0];
}
?>

速度測試

  • 將這兩個 function 各跑 10000次, 看看所使用的時間, 很明顯 utf8_str_split() 比 str2_split() 快了 3倍多~ :)
    • utf8_str_split .. (0.225438117981 secs).
    • str2_split ...... (0.738878965378 secs). 

by jon at January 20, 2010 09:38 PM

January 19, 2010

tsung

ADSL PPPoE 出現 unrecognize option '/dev/modem' 修復(Linux)

於 Ubuntu Linux 9.10 剛重灌完, 要設定斷線自動重新撥接的 Script.(Debian Linux: ADSL PPPoE 自動重撥 Script)

但是 repppoe 的 pon 出現下述訊息: (使用 ponpon -q 都出現下述訊息, 而無法撥接.)

/etc/ppp/peers/provider: unrecognize option '/dev/modem'

修復方式

  • pon dsl-provider 就不會出現那個錯誤訊息, 而能正常撥接.
  • 註1: repppoe 的 Script 有把這段語法寫在裡面, 不過已經忘的一乾二淨, 還是寫起來紀錄比較實在.
  • 註2: 相關參考可見 /etc/ppp/pppoe_on_boot 的 Script

by jon at January 19, 2010 09:22 PM

Asho(阿信)

PHP5的::、->、self、$this的區別

  • 如果被引用的變數或者方法被宣告為 const 或者 static,那麼就必須使用運算子::。
  • 如果被引用的變數或者方法沒有被宣告為 const 或者 static,那麼就必須使用運算子->。
  • 如果從類別內部存取 const 或者 static 變數或者方法,那麼就必須使用自引用的 self。
  • 如果從類別內部存取不為 const 或者 static 變數或者方法,那麼就必須使用自引用的 $this。
純筆記...

    by 阿信 (noreply@blogger.com) at January 19, 2010 07:32 PM

    January 18, 2010

    tsung

    Linux 網路介面 一直啟動、關閉 的 問題排除

    在重灌 Ubuntu Linux 後, 網路異常的慢, dmesg 看到一連串的 eth1 up / down 的訊息, 訊息如下:

    [442.008556] eth1: link down
    [446.051536] eth1: link up, 10Mbps, half-duplex, lpa 0x0000
    [462.499119] eth1: link down
    [463.352299] eth1: link up, 10Mbps, half-duplex, lpa 0x0000
    ..... 一直跑不停.

    mii-tool 訊息

    1. sudo mii-tool # 出現下述訊息
      eth1: autonegotiation failed, link ok
    2. sudo mii-tool eth1 -F 100baseTx-FD #強迫指定 eth1 為 100bastTx-FD
    3. sudo mii-tool # 再查看
      eth1: 100 Mbit, full duplex, link ok

    這樣子網路稍微可以動, 但是速度很慢, 小檔案可以傳輸, 大檔案會從 每秒 2M 一直降速到 0kb. (ping 的封包 lost 率很高.)

    重開機後, 網路狀況時好時壞, 換 Hub 的 Port, 狀況也是一樣.

    問題列舉 + 錯誤排除

    解決問題, 要先列問題清單, 把會發生問題的項目都一一列出來, 於是先整理一份列表.

    一開始以為是網卡壞了, 一直 up / down. 但是手邊沒有網卡, 而且要拆機器, 就列在最後的排除項目上, 所以 "排除項目列表 + 順序" 如下:

    1. 網路線
    2. Hub Port
    3. Hub
    4. 網路卡、Driver
    測試 網路線、Hub Port

    網路線、Hub Port 都換過, 狀況都一樣. (網路線: 換網路線、Hub Port: 交換測試.)

    測試 Hub (使用 Seednet AP 的測試方式)

    手上正好有台 Seednet 附的 AP, 有四個網路孔可以用, 所以就拿來測試是否是 Hub 問題, 測試方式:

    1. 直接試 Seednet 附的 AP(有四個孔), 網路連線就可以正常使用 (不過 Seednet AP 應該是 10M 的, 速度還是有點慢).
    2. 將 NAT (Gateway) 的網路線 與 電腦的網路線接在同一台 Hub.
    3. 電腦那台的 IP 寫死連到 NAT, 看是否可正常連線, ping 不會有封包 lost 即可.
    4. 於是確認是 Hub, 問題, 買新的 Hub 來換, 看到每秒 11M+ 的感覺真好~ :)

    相關網頁

    by jon at January 18, 2010 09:23 PM

    January 17, 2010

    FourDollars

    tsung

    PHP 可連接多個 "-&gt;" 來連續處理、執行 的 物件寫法

    物件(Object) 在撰寫時, 會希望 於使用、操作上, 可以更直覺化(擴充性... 等等, 不是此篇重點.), 下述的寫法就很常見.

    • $db->select('*')->limit(10)->begin(0) ... 等等. (在操作上(Method), 可以一直 "->" 的操作下去.)
    • 執行順序:
      1. select('*')
      2. limit(10)
      3. begin(0)

    但是一般物件(Class)教學的寫法, 都只能 $db->select('*') 就結束了, 要再串接多個 ->, 就會直接出現錯誤訊息.

    PHP Class - 標準物件的寫法

    範例1
    <?php
    class Test
    {
        protected $str;

        public function __construct()
        {
        }

        public function a()
        {
            $this->str .= 'a';
        }

        public function b()
        {
            $this->str .= 'b';
        }

        public function display()
        {
            return $this->str . "\n";
        }
    }

    /* 測試 */
    $a = new Test();
    $a->a(); // a
    $a->b(); // b
    // $a->a()->b(); // error
    echo $a->display(); // ab
    ?>

    PHP Class - 串接多個 "->" 的寫法

    要串接多個 "->", 只要在 Function (Method) 的 回傳值(return value), 回傳 $this (物件本身) 即可. (將物件本身回傳, 即可繼續操作下去.)

    範例2
    <?php
    class Test
    {
        protected $str;

        public function __construct()
        {
        }

        public function a()
        {
            $this->str .= 'a';

            return $this;
        }

        public function b()
        {
            $this->str .= 'b';

            return $this;
        }

        public function display()
        {
            return $this->str . "\n";
        }
    }

    /* 測試 */
    $a = new Test();
    $a->a(); // a
    $a->b(); // ab => a + b
    $a->a()->b(); // abab => ab + a + b
    echo $a->display(); // abab
    ?>

    範例說明

    • 範例1 的值就是每個執行完, 都是單獨的程序
    • 範例2 的值, 會一直不斷的被累加起來(註: 字串一直接起來).
    • 註: 其它程式語言也是相同作法.

    by jon at January 17, 2010 09:06 PM

    January 15, 2010

    fred

    入門級 Mouse Linux Kernel Driver

    每當說起 Linux Kernel Driver 入門,就不免提到如何寫個 Hello World 級的 Module,這樣的第一支程式,除了可供 Linux Kernel 動態載入和卸載,似乎是一點用處也沒有。與一般應用程式不同,開發 Linux Driver 最大的門檻不在於如何撰寫出 Module,而是如何設計系統架構與硬體兩者間的橋樑。其中懂得如何控制和結合 Kernel 內各種機制更是重點,最複雜的莫過於此。

    這邊有個 Mouse Kernel Driver,會在 Kernel 上新增一個虛擬滑鼠裝置,然後使用者可從 sysfs 控制該虛擬滑鼠(virmouse.c):
    /*
     * A Virtual Mouse Driver to send fake events from userspace.
     *
     * Written by Fred Chien <fred@ullab.org>
     *
     */
    #include <linux/fs.h>
    #include <asm/uaccess.h>
    #include <linux/pci.h>
    #include <linux/input.h>
    #include <linux/platform_device.h>

    struct input_dev *virmouse_input_dev;
    static struct platform_device *virmouse_dev; /* Device structure */

    /* Sysfs method to input simulated coordinates */
    static ssize_t write_virmouse(struct device *dev,
                                  struct device_attribute *attr,
                                  const char *buffer, size_t count)
    {
            int x, y, key;

            /* parsing input data */
            sscanf(buffer, "%d%d%d", &x, &y, &key);

            /* Report relative coordinates */
            input_report_rel(virmouse_input_dev, REL_X, x);
            input_report_rel(virmouse_input_dev, REL_Y, y);

            printk ("virmouse_event: X:%d Y:%d %d\n", x, y, key);

            /* Report key event */
            if (key>0) {
                    if (key==1)
                            input_report_key(virmouse_input_dev, BTN_LEFT, 1);
                    else if (key==2)
                            input_report_key(virmouse_input_dev, BTN_MIDDLE, 1);
                    else
                            input_report_key(virmouse_input_dev, BTN_RIGHT, 1);
            }

            input_sync(virmouse_input_dev);

            return count;

    }

    /* Attach the sysfs write method */
    DEVICE_ATTR(vmevent, 0644, NULL, write_virmouse);

    /* Attribute Descriptor */
    static struct attribute *virmouse_attrs[] = {
            &dev_attr_vmevent.attr,
            NULL
    };

    /* Attribute group */
    static struct attribute_group virmouse_attr_group = {
            .attrs = virmouse_attrs,
    };

    /* Driver Initializing */
    int __init virmouse_init(void)
    {
            /* Register a platform device */
            virmouse_dev = platform_device_register_simple("virmouse", -1, NULL, 0);
            if (IS_ERR(virmouse_dev)){
                    printk ("virmouse_init: error\n");
                    return PTR_ERR(virmouse_dev);
            }

            /* Create a sysfs node to read simulated coordinates */
            sysfs_create_group(&virmouse_dev->dev.kobj, &virmouse_attr_group);

            /* Allocate an input device data structure */
            virmouse_input_dev = input_allocate_device();
            if (!virmouse_input_dev) {
                    printk("Bad input_allocate_device()\n");
                    return -ENOMEM;
            }

            /* Announce that the virtual mouse will generate relative coordinates */
            set_bit(EV_REL, virmouse_input_dev->evbit);
            set_bit(REL_X, virmouse_input_dev->relbit);
            set_bit(REL_Y, virmouse_input_dev->relbit);
            set_bit(REL_WHEEL, virmouse_input_dev->relbit);


            /* Announce key event */
            set_bit(EV_KEY, virmouse_input_dev->evbit);
            set_bit(BTN_LEFT, virmouse_input_dev->keybit);
            set_bit(BTN_MIDDLE, virmouse_input_dev->keybit);
            set_bit(BTN_RIGHT, virmouse_input_dev->keybit);

            /* Register with the input subsystem */
            input_register_device(virmouse_input_dev);

            /* print messages in the dmesg */
            printk("Virtual Mouse Driver Initialized.\n");

            return 0;
    }

    /* Driver Uninitializing */
    void virmouse_uninit(void)
    {
            /* Unregister from the input subsystem */
            input_unregister_device(virmouse_input_dev);

            /* Remove sysfs node */
            sysfs_remove_group(&virmouse_dev->dev.kobj, &virmouse_attr_group);

            /* Unregister driver */
            platform_device_unregister(virmouse_dev);

            return;
    }

    module_init(virmouse_init);
    module_exit(virmouse_uninit);

    MODULE_AUTHOR("Fred Chien <fred@ullab.org>");
    MODULE_DESCRIPTION("Virtual Mouse Driver");
    MODULE_LICENSE("GPL");

    然後建立 Makefile:
    obj-m += virmouse.o

    KERNELDIR ?= /lib/modules/$(shell uname -r)/build
    PWD := $(shell pwd)

    default:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
    clean:
    @rm -fr *.ko *.o


    編譯(需要安裝 Kernel header):
    $ make

    載入:
    $ sudo insmod virmouse.ko

    測試:
    # 先切換成 root
    $ sudo su -
    # 滑鼠 X軸移動 168,Y軸移動 68,0 代表純移動不點擊
    $ echo "168 68 0" > /sys/devices/platform/virmouse/vmevent

    此 Driver 會先註冊成 evdev input 的滑鼠裝置,然後在 sysfs 並建立 group 和 vmevent 檔,Userspace 下的應用程式可以發送命令到 vmevent 使滑鼠移動或點擊左右中鍵。

    後記:

    此程式極為簡單,因此省略程式碼的說明,讀者直接看 source code 應該就能明瞭。

    by cfsghost@gmail.com (Fred Chien(錢逢祥)) at January 15, 2010 08:50 AM

    January 14, 2010

    tsung

    Firefox 服務應用 - 歷史紀錄瀏覽、RSS閱讀 外掛

    有很多網站的服務, ex: Gmail、Google Reader .. 等, 使用者都拿 Greasemonkey 來調整這些服務, 以符合自己使用.

    最近看到幾個創新的方式, 直接做成 Firefox 外掛(附加元件、Extension、Add-on), 然後用全新的樣貌出現, 不需要登入原始網站, 但是資料一樣是與原始網站同步(sync).

    註: 將 瀏覽器、網站 原有的資料, 以不同的方式來呈現, 有全新的使用者經驗~ :)

    Feedly - 與 Google Reader 同步

    Voyage - 圖像化 Firefox 歷史瀏覽紀錄

    by jon at January 14, 2010 09:49 PM

    Cornelius

    Vim - [[ and ]]

    一般來說 [[ , ]] 預設可在 c , java 裡頭跳躍函式,不過沒有 support Perl code , 所以為了方便在 Perl 裡頭的函式跳躍,我寫了這樣的 search mapping:


    如此就可以在 sub 函式間跳躍,如果使用 Moose 的 method ,可自己將 'method' 加上。

    by c9s (cornelius.howl@gmail.com) at January 14, 2010 03:19 PM

    January 13, 2010

    tsung

    JavaScript 的 encodeURIComponent() 會將字串轉換成 UTF-8 編碼

    之前遇到的狀況, 頁面編碼是 Big5, 於 JavaScript 端傳送的資料, 於後端收到的居然是 UTF-8.(註: 程式沒有做任何的轉碼動作.)

    查了許久才知道是使用 JavaScript 的 encodeURIComponent() 的 Function 造成的. (註: encodeURIComponent() 就類同於 PHP 的 urlencode())

    於 呂瑞麟老師 的 這篇 細談 URL 編碼 (Part IV) 有寫到: Javascript 的 encodeURIComponent() 方法會將傳入的字串轉換成 UTF-8 編碼的字元

    原來 encodeURIComponent() 會自動把字串都轉成 UTF-8, 順便學習關於 encodeURIComponent() 的使用方式與差異~ :)

    encodeURIComponent() 使用方法

    url = url + "?name=" + encodeURIComponent("中文");

    escape、encodeURI、encodeURIComponent 的差異

    同樣都是對 URL 做編碼的動作, JavaScript 有三個方法可以用(escape、encodeURI、encodeURIComponent), 差異在哪呢?

    下述摘錄自: escape、encodeURI 與 encodeURIComponent 的比較

    一般情況下, 最好選擇 encodeURIComponent()。

    以下就簡單說一下差異點:
    1. escape()
      • 不編碼的符號包括: @*/+
      • escape 不編碼 + (加號), 將使表單欄位資料中有空白的處理(用 + 連結字串)造成問題。且 escape 在處理非 ASCII 語系的字元會有問題。所以, 除非特例, 應盡量避免使用 escape()。
    2. encodeURI()
      • 不編碼符號包括: ~!@#$&*()=:/,;?+'
      • 用 encodeURI() 會比使用 escape() 轉換 URI 正確。比較要注意的是這個方法不處理 ' (單引號)。
    3. encodeURIComponent()
      • 不編碼符號包括: ~!*()'
      • encodeURIComponent() 是適合大部分單一 URI 的編碼方法。這個方法通常可以正確的編出正確的編碼, 例如要編碼一段有 flash 的 html(參數有 & 符號), 如果用其他的方法, 大概解碼後 flash 也不能看了。比較要注意的是這個方法也不處理 ' (單引號)。

    資訊更新

    感謝 Thinker 的指正:

    1. Javascript 本就是用 unicode 做處理,你可以試著把字串存檔試試
    2. encodeURIComponent 在 firefox 早期的版本並不是永遠會轉成 utf8

    by jon at January 13, 2010 10:00 PM

    January 12, 2010

    fred

    親手打造 HD 多媒體播放器(上)

    本月 1/23(六)、1/24(日)兩天,小弟將於台中的『靜宜大學應數系』開設嵌入式系統課程。一如課程名稱『親手打造 HD 多媒體播放器(上)』,將試圖發揮 TI OMAP 353x 的威力,打造多媒體播放器。近年來『Beagleboard』面世,其低廉的價格及強大的硬體效能,在嵌入式系統領域造成不小的影響,使許多人可輕易入手開發板,並在上面做各式各樣的應用。在網路社群中,beagleboard 也因此廣為受歡迎,相關文件齊全,各種技術支援都能輕易取得。

    我們將選用 Beagleboard 的複製品『Devkit8000』做為硬體平台,硬體規格和設計幾乎完全與 Beagleboard 相同。之所以選用 Devkit8000,除了因為硬體設計和 Beagleboard 一樣之外,其各種接頭支援相當完整,不用再自行焊接,對於軟體開發人員來說,比 Beagleboard 來的方便許多。

    此課程總共分上、下兩部份,上半部從嵌入式系統基礎和認識講起,將談及嵌入式系統現況與未來展望、開發環境架設、嵌入式 Linux 基礎架構,適合入門者參加。由於嵌入式系統以實作經驗為重,課程將以實作為主進行,如題『親手打造』一詞,藉自己動手做以增加實務經驗。

    註:靜宜大學將提供學生開發板使用,只需帶著玩樂的心前來即可。

    活動詳細訊息

    活動名稱:嵌入式系統short courses
    活動網址:http://www.excellent.pu.edu.tw/news_detail.php?sid=0&id=1366
    活動目標:
    1. 嵌入式系統開發系統介紹,了解嵌入式系統的現況與未來展望
    2. 做中學--學習嵌入式系統的開發環境佈署與建置
    活動日期:1/23 09:00-16:00
    演講者:于昌永老師、錢逢祥工程師
    地點:靜安425
    對象:全校師生、育成培育廠商
    人數:30人
    承辦單位:應用數學系
    參考資料:

    Devkit8000:
    http://elinux.org/DevKit8000
    http://fred-zone.blogspot.com/2009/12/android-eclair-porting-for-devkit8000.html
    http://fred-zone.blogspot.com/2009/12/enable-ads7846-touchscreen-in-android.html
    http://fred-zone.blogspot.com/2009/12/add-gpio-keys-support-for-devkit8000.html

    Beagleboard:
    http://beagleboard.org/

    by cfsghost@gmail.com (Fred Chien(錢逢祥)) at January 12, 2010 11:35 PM

    tsung

    Android 2.1 SDK 釋出 與 Google Nexus One 資料蒐集

    一直想要可以使用 3.5G 上網的手機, iPhone、Hero 這些都列入考量, 本來已經準備要買 Hero, 卻突然跑出 Motorola Droid, 再來又是 Google Nexus One, Nexus One 都還沒看到手機在哪, Nexus Two 的新聞已經出來了...

    ..... 手機的戰爭真是超激烈~

    不過, 現在暫時先鎖定 Google Nexus One, 不然這輩子應該沒機會換手機了. XD

    Google Nexus One 資料蒐集

    再來就是看看台灣進貨後的價位來決定了~

    相關網頁

    by jon at January 12, 2010 09:51 PM

    January 11, 2010

    tsung

    rtorrent 遇到 found bad chunks, consider using "safe_sync" 修復

    於 rtorrent 下載 100%, 但是一直沒有出現完成訊息, 於檔案列表出現下述錯誤:

    Hash check on download completion found bad chunks, consider using "safe_sync"

    修復方式

    1. vim ~/.rtorrent.rc
      safe_sync = yes
    2. 離開 rtorrent (Ctrl + q)
    3. 再開啟 rtorrent 即可, 檔案將自動會修復完成.

    by jon at January 11, 2010 09:03 PM

    January 10, 2010

    tsung

    杜拜塔 開幕煙火(2010年)

    原來 杜拜塔 前幾天正式啟用了, 創了不少紀錄, 來做做筆記.

    杜拜塔新聞、紀錄

    台灣時間 2010年1月5日凌晨 杜拜塔開幕, 高度 828公尺的超級摩天樓正式啟用 (台北 101 高度 508公尺)

    • 註1: 杜拜塔改名為「哈利發塔」
    • 註2: 杜拜在11月陷入財務危機, 靠阿布達比伸出援手才渡過難關, 因此杜拜親王將杜拜塔改名為「哈里發塔」, 也就是向阿拉伯聯合大公國總統 - 阿布達比邦長「哈利發」致意.

    杜拜塔創的世界紀錄 與 相關資訊

    • 2004年開始興建: 花費 6年打造
    • 層數: 超過 169層
    • 造價: 15億美元
    • 總面積: 567萬平方英尺
    • 房間: 1044間
    • 商業辦公室: 有 49個樓層
    • 世界最高的夜總會: 143樓
    • 世界最高的清真寺: 158樓
    • 全世界最高的游泳池: 76樓
    • 電梯: 57部
    • 觀景台: 124樓
    • 最上面的樓層 跟 地面 的 溫度: 相差10度

    杜拜塔 煙火影片

    杜拜塔的煙火, 規模和等級不是 台北101 可以比擬的, 非常壯觀~ :)

    煙火

    煙火 + 新聞說明

    相關網頁

    by jon at January 10, 2010 10:45 PM

    Cornelius

    vimomni.vim


    雖然 vim 本身有 C-x C-v 來做 command 的 completion ,不過在寫的時候還是會覺得相當不夠用。於是 vimomni.vim 這個 completion plugin 就是為了寫 VimL (Vim script) 而昨天在車上突然寫好的。

    基本上 vimomni.vim 本身支援了 runtime 所有 variable name , command name , function name 的 completion,當然也會自動 parse 目前檔案所定義的 Function , Variable 以及 Command 等等,同時也針對不同的 context 來補齊。

    另外一個好用的是 option name 的 completion,輸入 "set " 後, C-x C-o 叫用 OmniCompletion 即可自動補齊 option 。

    將 ftplugin/vim/omni.vim 放置到自己的 ~/.vim/ftplugin/vim/ 底下,開啟 .vim 檔時便會生效。若要手動載入,可輸入 :setf vim 。

    by c9s (cornelius.howl@gmail.com) at January 10, 2010 09:35 PM

    git-sync

    當你的 Git Repository 越來越多的時候,git-sync 是一個幫你同步的好工具,就不需要一個一個慢慢 pull 或是自己寫 script 去 pull 了。太苦。

    git-sync 支援三類型的 sync 機制,local , github 以及 remote ,local 是指到你指定的目錄底下幫你同步所有的 git repository ,如果是 svn clone 的 repository ,也會幫你做好 git svn fetch , git svn rebase 的動作。

    github 則可幫你同步 github 上所有的 repository , remote 則是你可指定自己的 git repository host 來做同步。

    譬如說我的 .gitconfig 這樣設定:

    那麼只要下

    $ git sync local


    $ git sync github

    其中 local 以及 github 只是 category 的名稱,可以隨意自訂。

    即可同步所有的 repository。

    或是如下設定:

    See Also:

    by c9s (cornelius.howl@gmail.com) at January 10, 2010 05:41 PM

    January 09, 2010

    FourDollars

    在 Ubuntu 8.04.3 可以使用 Google Chrome 瀏灠器來聽網路廣播~ ;)

    延續上一篇文章 在 Ubuntu 8.04.3 用 Firefox 瀏灠器就可以聽網路廣播了~ :D
    如果是想要在 Ubuntu 8.04.3 上面使用 Google Chrome 來收聽網路廣播的話
    就要另外安裝 mozilla-mplayer 這個套件才行
    然後連到 http://fd.idv.tw/radio/player.html
    或者是直接安裝使用 Google Chrome Extension
    http://fd.idv.tw/radio/hichannel.crx
    又或者是增加一個檔案 ~/.local/share/applications/hichannel.desktop
    內容填上
    [Desktop Entry]
    Name=hiChannel 網路廣播
    Exec=google-chrome --app=http://fd.idv.tw/radio/player.html
    Icon=google-chrome
    Type=Application
    Categories=GTK;Application;AudioVideo;Audio;Player;
    這樣就是一個(偽)不用開網頁瀏灠器也可以聽網路廣播的應用程式了~ :P

    by FourDollars (fourdollars@gmail.com) at January 09, 2010 08:33 PM

    kanru

    Back to Debian from the Arch Linux World

    在退伍後買了新電腦,裝的不是 Debian 而是 Arch Linux,主要是因為在當兵期間參與 Debian 的活動少了,並看看這個新興的 distro 有什麼有趣的地方,讓我在網路上總是遇上 Arch 的使用者。結果一用之下竟能快速上手,還加了幾個套件到 AUR 中,用著用著有些不想換了。以下寫寫我在用 Arch 時最想念 Debian 的地方,還有希望 Debian 也有的特色。

    最想念 Debian 的:

    1. 廣大的使用者與開發者社群:

      Arch 的使用者也許不少,但開發者就不多了。看看 devel 的 mailing list,上面活躍的只有幾位,所謂的 TU 也是不多。再加上我所知道的 hacker,或是同 project 的 developer,很多都是 Debian 的使用者或是開發者…

    2. 行之有年的社群管理制度:

      Arch 除了 TU 和幾位 core developer… 其他都是渾沌不明的狀態

    3. 好用的 Bug Report 系統:

      debbugs 太好用了,flyspray 的介面我還是很不習慣

    4. 社群契約:

      這很重要,定出了 Debian Project 的目標,是一種信念

    5. 支援的 architecture 衆多:

      名為 Arch 的只支援 2 種 arh..

    希望 Debian 有的:

    1. 快速的套件管理系統:

      這其實包含很多層面;Arch 只用 pacmanmakepkg 就可以打理一切,反觀 Debian,套件管理分成 dpkg-*, dselect, apt-*, aptitude,建構套件又有 dpkg-buildpackage, debuild, *build, *-buildpackage

      Arch 的使用者雖說 pacman 的 db 沒效率,可在我來看己是飛快了, Debian 的 dpkg, apt 在套件多起來時真是慢的可以…

    2. 極新的 userspace:

      Debian 的也是更新很快,但會有週期性的 slowdown,到現在 python 2.6 還在 experimental…

    3. Artworks:

      Arch 的使用者很會打造網站,桌面,Logo,Icon 等,非常用心,Debian 似乎就弱了點…

    在使用 Arch 的這段時間,我體驗到的 DIY 的樂趣,發現原來 Debian 的套件做了這多事。比起 Arch 要自己去 /boot, /etc, /usr/bin 下東改西改,Debian 會用各種 script 如 update-* 來幫你。用久了 Debian 真的變成只會用的 script… 戒之戒之。

    得知申請己久的 DD 資格終於有進展,我決定回到 Debian,並把在 Arch 學到的優點在 Debian 實現,打造我的 Debian :-)

    by kanru at January 09, 2010 01:18 PM

    January 08, 2010

    fred

    長大吧!台客實驗室(ULLab)

    回顧數個月前『專做有趣玩夜兒的台客實驗室 - ULLAB』,幾個朋友因臭味相投而成立了 『ULLab』。這是個非營利性質的自發性組織,參與者都希望藉由致力於自由軟體開發,多多少少改變這世界,並以『宅宅發卡給正妹』為目標而努力前進。慶幸,經過數個月的努力,有一些小成果,陸陸續續也有愈來愈多人注意到我們的有趣玩夜兒。

    由於 ULLab 成員似乎人人都有著不為外人而知的經濟壓力,悲慘的背景彷彿已成為必要的履歷項目。過去這些時間,大家總是私下各自尋找賺錢活命的機會,有人接案,有人上班又兼職,更有人大學研究所念不完,欲哭無淚。絕大數時候,每個人都過著自己的忙錄人生,只在空閒時才投入自由軟體的開發。

    當初完全沒有料想到,在近幾個月的社群經營以及國內外活動曝光後(COSCUPGNOME.Asia SummitOpen Source Contest 2009),開始有人想委託 ULLab,其中有一些零星的外包,也有進一步的合作研發,甚至是長期的顧問交流。對於我們這些負有沉重壓力的人來說,未嘗不是一件好事。許多好心的廠商藉由合作和外包,資助我們繼續走下去,替我們免去了不少負擔。也感謝一些學校單位,對我們的 Open Source Project 的贊助,無論是設備還是人力。

    說來慚愧,也許是因為成員們普遍缺錢,人人趕工搶糧,所以讓合作廠商都覺得效率不算差,願意給予更多機會,讓我們貢獻微薄意見,有時甚至讓我們領導其產品發展。而有些廠商常口頭上過於抬舉,其實,我們只是因為過去挫敗的比別人多,現在比其他人更注意什麼應該避免,什麼應該著重而已。

    不過這樣的經歷,使 ULLab 幾乎無所不碰,從 Linux Distribution、Performance Tunning、Application Design、Driver Porting、Customization、Embedded System 甚至是 Google Android,除了可以玩到很多『怪產品』之外,更吸收了不少來自世界各地的第一線資訊,大開了眼界,也對許多產品有了重新省思的眼光。真的很開心,因為能接觸到很多特別的新東西,是身為不起眼的宅宅敲鍵盤工人所夢寐以求。

    這兩個月,因為許多的合作計劃和關係成長,其收入已經慢慢的能支持 ULLab 成員們大部份開銷。再者,十二月份天外飛來一筆比賽獎金,促使伙伴們想進一步成為真正攜手努力的團隊,以全心投入初衷。此決定讓 ULLab 開始籌備公司成立,一方面藉由公司提供自由軟體各種服務,讓成員們養家活口,另一方面,也持續經營原先非營利的自由軟體開發,朝『改變世界』之遠大目標前進。

    有幸,隨著 2010 年的煙火綻放,開始了 ULLab 的創始元年,又如年份『2,010』所示,從 ULLab 最早的雙人搭擋演變到今天這番局面,相當值得紀念。

    後記

    ULLab 目前的事情相當多,大家都忙到不可開交,我們首先歡迎家境有困難和經濟壓力沉重的伙伴加入,此外,無論你是在學學生或是有志者,甚至是有心創業者亦歡迎加入創意軟體開發的行列。

    當然,ULLab 仍會持續開發自由軟體,歡迎各界加入一同努力。

    再補充一點,基於宅宅們的希望,更期待美女們的加入。:-P

    by cfsghost@gmail.com (Fred Chien(錢逢祥)) at January 08, 2010 03:21 PM

    FourDollars

    在 Ubuntu 8.04.3 用 Firefox 瀏灠器就可以聽網路廣播了~ :D

    要在 Ubuntu 8.04.3 底下的 Firefox 3.0.17 聽網路廣播
    只安裝好 gstreamer0.10-plugins-bad, gstreamer0.10-plugins-ugly, gstreamer0.10-ffmpeg 這幾個套件
    然後連到 http://fd.idv.tw/radio/player.html 就可以聽了~

    Mac OS X 10.4+ 上面要裝 Flip4Mac WMV Components for QuickTime
    然後用 Safari 就可以聽了~

    在 Windows 上面開 IE7/IE8/Safari/Opera/Firefox/Google Chrome 都可以聽~

    另外寫了一個給 Google Chrome 用的 Extension
    http://fd.idv.tw/radio/hichannel.crx

    Have Fun~ ^o^

    P.S. 誠徵 Icon 設計師幫小弟做出 Google Chrome Extension 要使用的 Icon 尺寸分別是 19x19/32x32/48x48/128x128 的 PNG

    by FourDollars (fourdollars@gmail.com) at January 08, 2010 01:04 PM

    January 07, 2010

    tsung

    Linux ssh 選端登入訊息 查看、修改

    Ubuntu Linux (Server版)在 ssh 登入後, 會秀出下述訊息: (cat /etc/motd # 亦可看到)

    Linux desktop 2.6.28-14-server #47-Ubuntu SMP Sat Jul 25 02:03:55 UTC 2009 x86_64

    To access official Ubuntu documentation, please visit:
    http://help.ubuntu.com/

      System information as of 二  1月  5 23:00:48 CST 2010

      System load: 0.02               Memory usage: 30%   Processes:       152
      Usage of /:  9.4% of 732.45GB   Swap usage:   26%   Users logged in: 0

      => There is 1 zombie process.

      Graph this data and manage this system at https://landscape.canonical.com/

    *** System restart required ***
    No mail.
    Last login: Tue Jan  5 11:49:45 2010 from user-desktop.local

    但是在 Debian Linux 或 一般Ubuntu Desktop 都沒看到這些訊息, 於是來找找是怎麼產生的.

    註: /etc/motd 是已經產生好的文字內容, 由此看不出任何東西.

    ssh 遠端登入訊息

    • ssh 遠端登入的訊息內容, 是由 /etc/motd 呈現的.
    • 於每次登入時, /etc/motd 這個檔案就會被修改一次.(由此可見不是由 crontab 修改, 而是於每次登入時, 自動修改此檔案)

    ssh 遠端登入 執行步驟

    由於是每次登入時, 自動修改 /etc/motd, 於是找到下述:

    • vim /etc/pam.d/sshd
      # Print the message of the day upon successful login.
      session    optional     pam_motd.so # [1]
    • 看起來是 PAM 做的, 詳見: pam_motd - display the motd file

    pam_motd.so 執行程式

    pam_motd.so 會執行哪些程式就沒去追了, 由 motd 倒是直接找到產生 /etc/motd 的程式、執行順序. 

    於 /etc/update-motd.d/ 的目錄, 找到 00 ~ 99 開頭的檔案, 於是試著執行看看(從 00-header 執行到 99-reboot-required), 就會看到 /etc/motd 的資訊了.

    註: 從 00 執行到 99, /etc/motd 就產生出來了. :)

    • ls /etc/update-motd.d/
      00-header
      50-landscape-sysinfo
      90-updates-available
      91-release_upgrade
      99-reboot-required

    關於 update-motd 的筆記

    1. 00-header - 此程式會執行 "uname -snrvm" 取得 CPU、與系統資訊 等.
    2. /usr/share/landscape/landscape-sysinfo.wrapper # 取得系統資源狀態、zombile 等訊息.
    3. /etc/motd.tail # 結尾補上 ubuntu 的廣告資訊. XD
    4. 註1: /usr/share/landscape/landscape-sysinfo.wrapper 的內容主要是 由此 /usr/bin/landscape-sysinfo 的 python script 產生的.
    5. 註2: /usr/bin/landscape-sysinfo 需安裝 landscape-common 的套件 (apt-get install landscape-common)

    by jon at January 07, 2010 10:55 PM

    January 06, 2010

    tsung

    Linux 列出系統 Zombie 狀態的程式資源 與 計算 CPU 總使用量

    Zombie 就是已經呈現 殭屍狀態(Z) 的 Process, 平常的系統裡面不應該看到這種狀態才對.

    註: 我的 Desktop 似乎蠻常看到. XD

    使用 top 查看程式資源統計資訊

    由 top 可以知道目前系統有多少個 zombie 程式 的 統計資訊.

    • /usr/bin/top -b -i -n 1 # 由下述可見有 1個zombie (殭屍)
      top - 22:42:44 up  1:37,  4 users,  load average: 0.57, 0.61, 0.93
      Tasks: 157 total,   1 running, 155 sleeping,   0 stopped,   1 zombie
      Cpu(s): 49.5%us,  4.3%sy,  1.6%ni, 42.0%id,  2.5%wa,  0.1%hi,  0.1%si,  0.0%st
      Mem:   1026116k total,   927496k used,    98620k free,    81600k buffers
      Swap:  1012084k total,    16456k used,   995628k free,   343236k cached

        PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
       6869 user      20   0  2464 1060  776 R  0.0  0.1   0:00.00 top
    • TOP 參數說明
      • -b - Batch mode
      • -n - how many itterations (-n number)
      • -i : Idle Processes toggle

    使用 ps 取得 程式狀態 與 PID

    • ps aux | grep -w Z # 列出整個 pid 的 process 資訊
      user       2192  0.0  0.0      0     0 ?        Z    21:05   0:00 [scim] <defunct>
    • ps aux | awk '{print $8 " " $2}' | grep -w Z # 列出 Z + pid
      Z 2192
    • ps aux | awk '$8=="Z" {print $2}' # 只抓出 pid
      2192
    • 抓到此 PID, 再看情況要不要 kill 掉囉~

    計算某程式吃的總 CPU 資源

    下述為計算 Apache 全部使用掉多少 CPU 資源加總.

    使用 TOP 計算
    • $ /usr/bin/top -d 2 -n 1 | awk '/apache/{count += $9;}; END  {print count};' # 可以知道 CPU 總使用量
      45%
    使用 ps aux 計算
    • $ ps aux | awk '/apache/{count += $3;}; END  {print count};' # 這個會比較準.
      45.6%

    相關網頁

    by jon at January 06, 2010 09:05 PM

    Cornelius

    Vim - eval command.

    為了快速的驗證一段 VimL 或是測試、更新 VimL 的 function , option ,我有一個 function 是這樣寫的:


    如此當我寫了一個 VimL 的 Function define 的時候,只需要使用 visual line-wise mode 選取起來之後,利用 e vmap 來 eval 這個 region。

    就不需重新 re-source .vimrc 或是重新開啟 Vim 。

    by c9s (cornelius.howl@gmail.com) at January 06, 2010 06:49 PM

    fred

    Debian Sid nfs-kernel-server 1.2.1-1 重大問題

    對於長期開發 Embedded System 的人,Debian 真的是太方便了,可以毫不費力的開發多種平台,又可隨自己高興而輕鬆升級該平台上的各種套件,不再只能死板板停留在該平台的官方 BSP 和 Toolchian(有些 Toolchain 充滿了 Bugs,常讓人求生不得求死不能),完全跳出過去 Embedded System 軟體版本總是太老舊的框框。無論缺什麼東西,輕鬆的幾行 apt-cross 指令,就可以確保 corss-compile 的順利,甚至,新版的 GCC compiler 都任君選用。

    開發 Embedded System,最常用到的就是 NFS,在最近的 Debian Sid 中,套件『 nfs-kernel-server 1.2.1-1 』有重大問題(Grave Bug),會讓 NFS 無法順利啟動:
    $ /etc/init.d/nfs-kernel-server start
    Exporting directories for NFS kernel daemon....
    Starting NFS kernel daemon: nfsd mountd failed!

    目前已有人回報此 Bug 至官方(可參閱:http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=562910),在尚無解的情況下,可先 Downgrade 先恢復 NFS 的功能,畢竟工作可不能停:
    $ wget http://ftp.tw.debian.org/debian/pool/main/n/nfs-utils/nfs-kernel-server_1.2.0-4.1_i386.deb
    $ dpkg -i nfs-kernel-server_1.2.0-4.1_i386.deb

    該版本是從 Debian Testing 抓回來的舊版套件,在替換後 NFS 就可恢復正常運作。

    by cfsghost@gmail.com (Fred Chien(錢逢祥)) at January 06, 2010 02:33 AM

    January 05, 2010

    tsung

    NTPDATE - no server suitable for synchronization found 修復

    執行 /usr/sbin/ntpdate time.stdtime.gov.tw 出現下述錯誤:

    • 28 Dec 10:44:25 ntpdate[20348]: no server suitable for synchronization found

    註: 於 Ubuntu / Debian Linux / FreeBSD 都有看到類似狀況.

    NTPDate Debug

    • sudo /usr/sbin/ntpdate -d time.stdtime.gov.tw
      28 Dec 10:44:20 ntpdate[20348]: ntpdate 4.2.4p8@1.1612-o Tue Dec  8 22:21:54 UTC 2009 (1)
      transmit(11.11.11.11)
      transmit(11.11.11.11)
      transmit(11.11.11.11)
      transmit(11.11.11.11)
      transmit(11.11.11.11)
      11.11.11.11: Server dropped: no data
      server 11.11.11.11, port 123
      stratum 0, precision 0, leap 00, trust 000
      refid [11.11.11.11], delay 0.00000, dispersion 64.00000
      transmitted 4, in filter 4
      reference time:    00000000.00000000  Thu, Feb  7 2036 14:28:16.000
      originate timestamp: 00000000.00000000  Thu, Feb  7 2036 14:28:16.000
      transmit timestamp:  cee29a08.b7863bee  Mon, Dec 28 2009 10:44:24.716
      filter delay:  0.00000  0.00000  0.00000  0.00000
               0.00000  0.00000  0.00000  0.00000
      filter offset: 0.000000 0.000000 0.000000 0.000000
               0.000000 0.000000 0.000000 0.000000
      delay 0.00000, dispersion 64.00000
      offset 0.000000

    NTPDate 正常狀況

    • sudo /usr/sbin/ntpdate -d time.stdtime.gov.tw
      28 Dec 10:44:10 ntpdate[3790]: ntpdate 4.2.4p6@1.1549-o Fri Dec  4 19:03:30 UTC 2009 (1)
      transmit(11.11.11.11)
      receive(11.11.11.11)
      transmit(11.11.11.11)
      receive(11.11.11.11)
      transmit(11.11.11.11)
      receive(11.11.11.11)
      transmit(11.11.11.11)
      receive(11.11.11.11)
      transmit(11.11.11.11)
      server 11.11.11.11, port 123
      stratum 2, precision -20, leap 00, trust 000
      refid [11.11.11.11], delay 0.05048, dispersion 0.00038
      transmitted 4, in filter 4
      reference time:    cee2968e.b3b3e71f  Mon, Dec 28 2009 10:29:34.701
      originate timestamp: cee29a07.4a9ed10b  Mon, Dec 28 2009 10:44:23.291
      transmit timestamp:  cee29a07.57baecd0  Mon, Dec 28 2009 10:44:23.342
      filter delay:  0.05048  0.05132  0.05075  0.05052
               0.00000  0.00000  0.00000  0.00000
      filter offset: -0.06352 -0.06368 -0.06410 -0.06398
               0.000000 0.000000 0.000000 0.000000
      delay 0.05048, dispersion 0.00038
      offset -0.063529

    查到都是 udp 的 123 port 被 Firewall 擋掉(被 iptables / ipfw 擋掉), 不過我並沒有擋這個 port, 很奇怪~

    解法

    上述原因不明, 不過可以用此方法解決(換個 Time Server 就解決了. XD)

    • sudo /usr/sbin/ntpdate-debian
      28 Dec 10:46:46 ntpdate[20408]: step time server 204.9.54.119 offset -2.274225 sec
    • 上述命令為執行此語法: sudo /usr/sbin/ntpdate -d 0.debian.pool.ntp.org
    • 註1: 從[0-3].debian.pool.ntp.org 的 Server sync 時間.
    • 註2: 直接執行 sudo /usr/sbin/ntpdate 0.debian.pool.ntp.org 也是可以.

    相關網頁

    by jon at January 05, 2010 11:27 PM

    January 04, 2010

    tsung

    使用 SED 移除空白行(列)

    使用 sed 來移除整列都是空白(沒有資料)的行, 語法如下:

    sed '/^$/d'

    註: sed '/\n/d' 沒有用. XD

    SED 移除整列 範例

    常使用在移除註解時, ex: (移除開頭是 # 的列)

    cat xxx.conf | grep -v '^#' | sed '/^\s*$/d'

    相關網頁

    by jon at January 04, 2010 09:46 PM

    jserv

    2010 年免費課程:X Window System 全面進攻

    X Window System 自 1984 年現身後,這 25 年的時間見證資訊科技產業的典範轉移,諸如工作站與個人電腦的消長、網路科技的通行、高品質的繪圖需求、普及運算等等,而 2004 年初,X.org/FreeDesktop 社群正式與封閉的 XFree86 core team 決裂後,一度死寂的 X Window System 有如浴火鳳凰般,獲得重生,並以開放原始碼模式,廣泛接受各方提案與匯集成果,頗振奮人心。筆者於 2005 年的演講 [綜觀 X Window System 新發展] (PDF) 中,探討若干背景概念與當時 FreeDesktop 的開發方向,而近五年後回顧,又是新氣象,是此,筆者決定在 2010 年分享名為「X Window System 全面進攻」的新課程,預期能全面性探討 X Window System (以下簡稱 "X")...

    by jserv at January 04, 2010 03:35 PM

    Cornelius

    Nara Leão

    說到 Bossa nova ,大家大概都會想到 Lisa Ono。但其實要說 Bossa nova 的 Muse 女神,非 Nara Leão 莫數,在 bossa nova 被錄下來之前通常都是 intimate 的。

    Nara Leão 巴西人,她的聲線相當性感,比 Lisa Ono 更纖細敏感。也許是因為人生經驗的因素吧,Leão 的歌聲帶著 nostalgia 的味道,可惜已經在 1989 年過世,享年 47 歲,可是年少早逝的歌手。



    [1] Nara Leão - http://en.wikipedia.org/wiki/Nara_Leão

    by c9s (cornelius.howl@gmail.com) at January 04, 2010 01:24 PM

    Vim - URL Line Opener

    為了要開啟一連串的 URL List 所以寫了這個。


    你可以自己定義自己的 browser command 。"V" 選擇區塊然後輸入 :OpenURLLine ,或是直接 :OpenURLLine 。

    # 基本上這種東西只有在 Google Chrome 沒辦法用 Extension 沒辦法存 Session 只能一頁一頁把網址丟到文字檔的時候用而已。Orz

    by c9s (cornelius.howl@gmail.com) at January 04, 2010 10:29 AM

    January 03, 2010

    tsung

    預定 2010年 到位的新成員 - 貝貝

    2010年的新成員(妹妹) - 貝貝(Becca).

    目前預計 2/24 到位(離目前大約 50天), 目前還在偷吃雞腿的階段. :P

    貝貝吃雞腿

    演進歷程

    在從去年 6月多開始, 每天都在期待著妳的到位, 雖然有些媽媽會說, 出來後, 很想把她塞回肚子去. XD

    在此將演進的重點時刻做做紀錄:

    1. 傳說中的第二條線 - 期待已久
      傳說中的二條線
    2. 在 汐止國泰 檢查, 已經看到心跳囉~
      六週檢查~看到小寶貝的心跳囉
    3. 這是我們最興奮的時刻, 剛好拍到她在裡面拳打腳踢, 動來動去. (醫生叫老婆 咳 一聲, 她就醒過來動來動去. :P)
      9w6d~小寶貝手手腳腳會動動囉
    4. 從側面看到她的小鼻子~
      貝貝的小鼻子

    為何會叫 貝貝(Becca)?

    • 當初想乳名也想很久, 最後是看這部影集(美劇: 體操公主 - Mark it or break it)想到的, 貝卡(Becca) 這個名字好聽又好記, 也蠻喜歡此角色 與世無爭 的個性, 所以她的乳名就叫 貝貝, 乳名的正名: 貝卡、Becca.
    • 註: 高層次、羊膜穿刺 的結果確定是 小公主、小美女, 於是開始努力想名字~

    為何都沒有看到 貝貝 的正面呢?

    • 因為她很害羞, 所以現在另外叫她 害羞貝, 每次檢查都用手把臉遮住, 不然就轉過身去不讓我們看. (連高層次檢查都有一隻手擋來擋去. XD)
    • 註: 高層次檢查做完, 一切都很正常就好了. (高層次檢查 是醫生高層次, 不是機器高層次)
    • 不過再害羞也沒關係, 反正再 2個月, 就不用隔著肚皮請示了~ :P

    貝貝的物品準備

    媽媽因為肚子有貝貝後, 有了擋箭牌, 就跑去大肆採購, 買了不少孕婦裝. Orz.. - 2009-08-21_好孕買很大

    下述都是親朋好友的愛心 + 貝貝出生後用的衣物 (註: 我知道為何嬰兒用品那麼賺錢了.)

    媽媽幫貝貝做的作品

    另外 媽媽幫貝貝做的鞋鞋: [手作]完成十雙手作鞋囉 - 都做到可以接訂單了. XD

    10雙手作鞋

    媽媽幫貝貝做的圍兜兜

    貝貝的圍兜兜

    漁夫帽正面

    貝貝的第一頂漁夫帽

    漁夫帽正面另一面

    貝貝的第一頂雙面漁夫帽 (粉紅)

    再來還有很多功課要做... ex: 嬰兒出生臍帶要留多長? ... 再來慢慢整理.

    by jon at January 03, 2010 10:59 PM

    January 02, 2010

    Cornelius

    豚跳技巧心得

    雖有將近 6 年多沒再繼續玩滑板,後來一上板之後卻可以做出豚跳感覺來不賴。

    以前練習總是胡亂練習,不懂得思考與調整,所以現在試著對每一次的動作找出缺點以及出錯的原因。

    * 預備豚跳時,重心應該是平均放在兩腳,利用兩腳的力量跳躍。以前誤以為是只利用前腳的力量豚跳,後腳只負責把滑板敲起來。事實證明是利用兩腳跳躍可以跳的更高,而且可以確保力量足夠將滑板敲起來,也才有辦法在空中把滑板拉平。

    * 身體必須與滑板保持平行。常常會因為豚跳的時候身體會不自覺轉到正面,因此滑板在空中會因為上半身拉動,導致著地的時候和行進方向不為平行,角度太大時,容易造成跌倒。

    * 跳起之後的重心不該往前或往後移動。這完全是以前練 180 Backside Ollie 的時候造成的錯誤習慣。

    * 後腳在跳起之後必須立刻收高,如此才有辦法把板身拉平。

    * 在拖板時,前腳應該要讓腳背往外翻,讓摩擦面積增加。這個動作如果沒有做好或是忘記做的話,會造成板身沒辦法拉平。


    by c9s (cornelius.howl@gmail.com) at January 02, 2010 09:15 PM

    Mac - ghc on snow leopard

    由於 Macport 上的 ghc 現階段完全無法在 snow leopard 上編譯安裝,這裡有一篇running haskell ghc on snow leopard 寫了解決方案。

    先到 http://hackage.haskell.org/platform/ 安裝 Haskell Platform (已編譯好的 binary)
    修改 /usr/bin/ghc , /usr/bin/ghci ,加上參數 -optc-m32 -opta-m32 -optl-m32 。

    by c9s (cornelius.howl@gmail.com) at January 02, 2010 08:56 AM