2012年9月29日

撰寫中文書評參加 O'Reilly Blogger Review Program !?

O'Reilly Blogger Review Program 

不久前曾經分享一篇「O’Reilly ... 邀請部落客寫書評」,後來發現國內其實不少部落客、開發者對這種「多贏」的活動感興趣。所謂的多贏就是:出版社增加曝光度、部落客免費看新書、讀者有更多評論及導讀可參考。由於 O'Reilly 接受「負評」,認為書有哪些缺點都可以大聲寫出來沒關係,所以讀者並不需要太擔心相關書評會有作假被收買之嫌。

相信原文電腦書的閱讀,對大家都沒什麼問題。但不少國內朋友會跟我有一樣的疑問:要用英文寫書評不就要先加強英文寫作功力?!

為解除這個疑慮,我特地「用中文寫一篇書評給它提交上去」(其實是我的菜英文根本拼湊不出幾個句子XD)。

這篇寫好的書評在數天前發表於部落格:http://blog.lyhdev.com/2012/09/oreillythink-python-by-allen-b-downey.html

書評的提交規定是:
  1. 發表一篇在個人部落格(字數三五百字不用太多)
  2. 在 Amazon 或 O'Reilly 網路書店的商品頁面增加一則評論
  3. 同時只能申請一本書(書評提交後才能申請下一本)

因為擔心老外看不懂中文,我用 Google Translate 翻譯幾句摘要,用於填寫商品頁的簡短評論。然後就給它提交審核啦!。。。。

最後,也順利通過審核了。

商品頁提交簡短評論

部落格文章網址已被加入書評列表

我從一開始就認為 O'Reilly 這個計畫會接受中文書評;畢竟華人讀者市場廣大,而且很多好書根本來不及或從來不會有中譯本,加上現在又有方便便宜快速的電子書,很多中文世界的讀者都樂意買原文書。

所以,不要再問自己英文到底行不行,寫就對了!

現在就參加 O'Reilly Blogger Review Program

I review for the O'Reilly Blogger Review Program

2012年9月28日

Mac OS X 使用 sshfs 掛載 Linux 遠端伺服器磁碟

SSHFS Project Page
SSHFS 可以將遠端伺服器的磁碟路徑掛載(mount)到本地資料夾,SSHFS 是以 FUSE(Filesystem in Userspace)為基礎,支援 SSH/SFTP 協定的檔案伺服器。只要遠端伺服器具備 SSH 伺服器即可建立連線,其需求如下:
  1. SSH伺服器(例如 OpenSSH Server)
  2. 已啟用 SFTP 檔案傳輸協定
    /etc/ssh/sshd_config 有以下設定:
    Subsystem sftp /usr/lib/openssh/sftp-server

假設一台 Linux 遠端伺服器,例如 192.168.0.100 已經安裝好 OpenSSH Server,一般使用 SSH 工具連線的指令是:

ssh user@192.168.0.100

如果有 FileZilla 或是 lftp 之類支援 SFTP 協定的傳輸工具,即使 Linux Server 不安裝傳統 FTP 伺服器,也能透過 SFTP 直接進行檔案傳輸。由於 SFTP 是採用 SSH 提供的加密為基礎,因此安全性比起一般 FTP 伺服器更好(但傳輸效能也會因加密而下降)。以 lftp 工具來說,測試遠端 SSH 伺服器是否可建立檔案傳輸連線,可用以下指令:

lftp sftp://user@192.168.0.100

如果 SFTP 連線沒問題,就可以開始使用 SSHFS 掛載遠端磁碟。在一般的 Linux 環境下,例如 Ubuntu Linux,可以直接使用「sudo apt-get install sshfs」安裝;但是在 Mac OS X 環境下,需要先加裝 MacPorts(MacPorts 安裝說明請參考此篇)。

在已安裝 MacPorts 的 Mac OS X 終端機,執行 sshfs 安裝指令:

sudo port install sshfs

安裝完成後,就可以使用 sshfs 指令建立掛載。首先先建立一個本地端的磁碟(空資料夾)。

mkdir ~/share

再使用 sshfs 掛載,指令範例如下:

sshfs user@192.168.0.100:/home/share

連線建立時會要求輸入密碼(SSH登入的使用者密碼),完成後就可以看到本地路徑 ~/share 下已經直接掛載遠端資料夾。

解除掛載則使用一般 umount 指令:

umount ~/share

對於需要經常修改遠端 Linux 伺服器的檔案,例如網站資料,或是想要直接用 Mac OS X 開啟伺服器上面的檔案,這是一種相當簡便的作法。

不過由於所有檔案存取動作都是透過網路,因此速度也會受限於頻寬。通常在 LAN 會有不錯的效果,特別是搭配 1000Mbps 有線區網或 300Mbps 802.11n WiFi 無線區網,存取速度就會有相當不錯的表現(可直接播放影片檔)。由於 SSH 加密會降低傳輸效能,實測對 1000Mbps 的網路來說,並無法達到像 FTP / iSCSI 一樣的水準;但是 SSH 屬於一般 Linux Server 都會設置的基本服務,使用上還是較為方便。

解決:XCode 更新後使用 MacPorts 安裝新軟體發生錯誤


Mac OS X 在更新 XCode 開發工具後,使用「sudo port install XXX」安裝新軟體時,可能會發生錯誤,例如「sudo port install sshfs」 出現錯誤訊息:

--->  Building fuse4x-kext
Error: org.macports.build for port fuse4x-kext returned: command execution failed
Error: Failed to install fuse4x-kext
Please see the log file for port fuse4x-kext for details:
    /opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_fuse_fuse4x-kext/fuse4x-kext/main.log
Error: The following dependencies were not installed: fuse4x fuse4x-kext
To report a bug, follow the instructions in the guide:
    http://guide.macports.org/#project.tickets
Error: Processing of port sshfs failed

可能的問題原因是 XCode 更新後並未同意其相關條款,解決方法是執行「sudo xcodebuild -license」,在閱讀條款後按「q」結束、並輸入「accept」表示同意。

當然,如果連 XCode 都沒有裝的話,MacPorts 安裝軟體就會直接丟出錯誤訊息!

[台中]可插電無線上網餐廳 - 肯德基(火車站前中正路)

這系列是資訊遊牧工作者辦公地點指南。

座位多

可插電
店名:肯德基
位置:台中火車站前中正路,步行約三分鐘
座位:非常多
噪音:平常日非用餐時間不吵
網路:中華電信WIFI、3G收訊佳
電源:部分靠牆座位提供插座
餐點:速食;提供早中晚餐下午茶
廁所:乾淨

2012 黑客頌!Node.js Knockout 廣邀台灣社群開發者參加

「Node.js KO」 - Node.js Taiwan 廣邀社群開發者參賽
NodeKnockout 是 Node.js 開發社群知名的國際競賽活動,2012年預計在11月10-12日舉辦,是一場48小時的黑客頌(Hackathon);簡單說就是喜歡寫 Node.js 程式的開發者,一起進行歡樂 Coding 馬拉松。

如果你還不知道什麼是 Node.js,請參考電子書

活動詳情請見:台灣社群參賽報名網站 http://nodeknockout.nodejs.tw/

2012年9月27日

蘋果筆電外接螢幕連接線 LPC-1670 Mini DisplayPort to DisplayPort

我的 MacBook 外接螢幕,是搭配 Dell UltraSharp U2312HM 這顆「有 DisplayPort 但是沒有 HDMI」的便宜貨版本 LED IPS 顯示器。雖然這顆螢幕附有 DP(DisplayPort)連接埠,但因為線材不好找,就一直將就用 Apple 原廠 Mini DisplayPort to DVI 轉接線,再連接到顯示器的 DVI 埠。

具備 DisplayPort 連接埠的螢幕
但是轉接 DVI 的用起來實在不太理想,稍微碰到線就會造成螢幕畫面抖動,而且轉接線大大一顆既佔位又礙眼。最近在網拍找到一條 Mini DisplayPort 轉標準 DisplayPort 的線材,迅速買了一條回來測試。

LPC-1670 Mini DisplayPort to DisplayPort(公對公連接線)

使用前:只要不小心碰到線,畫面就會抖動,在 MacBook 旁邊看起來很礙眼。


使用後:只要別把接頭扯下來,怎麼碰這條線都不會影響到畫面,MacBook 周邊看起來更簡潔。


PS. 螢幕等級太陽春,DP 和 DVI 畫質看不出差異。

2012年9月26日

網路觀察:反核,不要成為下一個福島(非關政治)

反核臉書專頁(https://www.facebook.com/nonukeslife

在福島核災事故後,國內再度興起「讓核電歸零(NO NUKES)」的全民反核運動。在雙十國慶即將來到的此刻,有許多反核團體、店家正在響應一場全台串連活動。

名為「反核,不要再有下一個福島」的臉書專頁,已有超過 2,000 位網友按讚支持。由支持者出資印製的反核旗幟, 已經在九月完成印製並寄出至各地,包括離島及東部地區。


有不少店家響應「國慶日改掛反核旗」,受到新聞媒體報導。


從 Google 地圖可以看到全台各地皆有店家串聯。


在較大的地圖上查看反核 不要再有下一個福島

除懸掛反核旗幟外,也有網友發起反核貼紙印製活動,貼紙長寬尺寸15x10公分(霧面防水),歡迎支持反核運動的商家協助宣傳、贈送貼紙,需要索取貼紙的朋友,請洽以下名單的聯絡人:

2012年9月25日

PHP筆記 - 檔案下載程式

網站提供檔案下載的功能,若是需要加上權限控管、流量限制等功能,就可以使用 PHP 程式處理。

例如: /download.php?file=results.pdf&user=...

為讓瀏覽器以正確的名稱及類型儲存下載的檔案,需要指定 HTTP Header 的 Content-Type 及 Content-Disposition 兩個參數。

header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="downloaded.pdf"');

利用 PHP 將檔案內容送給瀏覽器,最簡易的方法是利用 readfile 函式。

readfile('original.pdf');

如果是文字檔可以用 file_get_contents 函式:

echo file_get_contents('results.csv');

或是使用 File Descriptor 讀檔。

$handle = fopen("results.pdf", "rb");
echo fread($handle, filesize("results.pdf"));
fclose($handle);

「rb」這個設定是指定用「Binary Mode」讀檔,這樣對非純文字的二進位檔案才不會造成錯誤。

如果要限制下載速度,使用 while 迴圈加上 sleep。

while (!feof($handle)) {
  echo fread($handle, 8192);
  sleep(1);
}

若要一次將所有檔案內容直接傳回給瀏覽器,使用 fpassthru 即可:

fpassthru($handle);

為了避免 PHP 執行過程的錯誤訊息也被傳送到瀏覽器,造成檔案內容異常,可以加上 ob_start() .... ob_end_clean() 避免額外異常資料輸出。

PHP筆記 - 關於 UTF-8 編碼及 BOM 標示碼

關於 PHP 網站開發的編碼,有經驗的開發者都知道:用 UTF-8 就對了!

但為了確保已經使用 UTF-8 編碼的網站運作沒問題,還需要注意:
  1. PHP 使用較新的版本(建議搭配 Linux 服用效果更佳)
  2. MySQL 或其他資料庫(包括 Driver、Entity Framework)使用較新版本
  3. 建立資料表時使用 Unicode / UTF-8 編碼
  4. MySQL 建立連線時執行 SQL 「SET NAMES UTF8」確保連線使用正確編碼
  5. 所有 PHP 程式碼檔案本身都必須正確設定 UTF-8 編碼

關於 UTF-8 開發者還需要知道「BOM」,因為某些暈倒死的作業系統,很可能在存檔時自動加上「BOM」符號,雖然檔案的文字內容看似沒有差異,但只要打開文件編輯器的十六進位(HEX)檢視模式,就會發現檔案最前方出現「EF BB BF」的多餘字元。對 PHP 程式來說這些字元就被偷偷附加在網站回傳的結果,最常見的問題是造成「headers already sent」的錯誤。

使用 MadEdit、Sublime Editor 等進階文字編輯器,可以在選單找到存檔編碼格式有區分成:「UTF-8 with BOM」及「UTF-8 without BOM」,記得要選擇將 BOM 碼給移除的編碼。


為了避免其他引入(include)的程式碼附帶 BOM 碼,也可以搭配 ob_start() ... ob_end_clean() 將緩衝區清除。但最好的方式還是利用批次檔,一次將所有程式檔案的 BOM 碼移除。

PHP筆記 - 解決系統時區(TimeZone)問題

PHP 從 5.1 版以後開始支援時區(TimeZone)設定,即使作業系統已經設定時區,但 PHP 仍可能不理會系統預設值,而採用 GMT 標準時間。共有三種方法可以重新設定 PHP 程式的時區,這將會影響 date() 等函數取的的時間顯示。

方法一、修改 php.ini (會影響所有 PHP 程式):

[Date]
; Defines the default timezone used by the date functions
date.timezone = Asia/Taipei

方法二、使用 date_default_timezone_set

date_default_timezone_set('Asia/Taipei');

方法三、使用 ini_set (效果同上)

ini_set('date.timezone','Asia/Taipei');


資料庫也有時區問題,例如使用  NOW() 函數取得當前時間,如果時區跟 PHP 程式不一致,也會造成時間判斷及計算的錯誤。解決方法是:在資料庫連線建立的初始化階段,利用以下的 SQL 查詢設定時區。

PostgreSQL:
SET TIME ZONE 'Asia/Taipei';

MySQL:
SET time_zone = 'Asia/Taipei';

【O'Reilly新書介紹】Think Python... by Allen B. Downey

作者 Allen Downey 博士是麻州奧林學院(Olin College)資訊科學教授,擁有豐富的大學課程教學經驗。這本書採用 Python 程式語言,內容範圍從初學者所需的基礎程式設計概念開始,涵蓋函式(functions)、遞迴(recursion)、資料結構(data structures)及物件導向設計(object-oriented design)。

對於程式設計初學者而言,Python 比 Java 或 C 更適合作為學習者的第一個語言,例如《Head First Programming》 也採用 Python 教初學者基本的程式觀念。

由於 Python 提供交談式介面,當你在終端機輸入「python」執行程式,就會看到「>>>」這個提示符號,代表你可以輸入一行程式碼,按下 ENTER 鍵就能立即看到結果。

這本書利用交談式介面的互動,在每一章前面講解觀念時,就穿插簡短的程式碼的範例,利用實際可執行的 CODE 來幫助觀念的理解。這樣對教學來說,就免除學習者必須看完落落長程式碼、KEY 完一大堆 CODE 的麻煩。

利用 Python 學習程式設計,最好的方式就是準備一部電腦,先執行進入 Python 的交談式介面,然後再自己親自動手練習書本給的範例。這本書就是適合這種上機實際操作的學習模式,所以它的頁數並不多,僅僅不到300頁就將重要觀念傳達給學習者。

每一章後面都有提供 Glossary 及 Exercises 的單元,畢竟這是一本適用於大學課程的書籍,讓學習者複習瞭解專業術語也是必要的功課(例如什麼是 Refactoring、Precondition);而實作練習更是不可少的作業,每章最後附的練習題數量不多,但也足夠學習者透過動手做進而思考所學到的每個觀念。

更棒的是,《Think Python》是一本採用「CC授權」的書籍,你可以跟 O'Reilly 購買精美的印刷本,但也能從這本書的網站取得完整的電子書檔案(甚至包括完整的電子書原始碼)。

推薦指數:★★★★☆

《Think Python》書籍網站
http://www.greenteapress.com/thinkpython/

相關連結

*Think Python 授權條款採用 Creative Commons Attribution-NonCommercial 3.0 Unported License

2012年9月20日

2012年下半年資訊軟體相關競賽(4件)

最近有不少競賽已接近報名或徵件截止,提供給有準備參加競賽的同學參考!

2012通訊大賽 - 智慧型手持裝置使用者體驗設計競賽
報名及收件截止:9/26(三)
http://www.mobilehero.com/

舞動奇機觸控靈機 - APP創意設計大賽
截止收件:10/8
http://www.ntactapp.tw/

2012第17屆全國大專校院資訊應用服務創新競賽
報名期間:10/9~10/17
http://csim.tca.org.tw/

台北國際數位內容設計競賽
繳件截止日期:10/1
http://www.tidca.org/main.aspx

2012年9月13日

HTC DESIRE 刷機筆記 Runny ROM v7.0.2 及 INT2SD+ 配置 2012-09

Runny ROM v7.0.2 讓凋零的老機 DESIRE 回春
升級使用的硬體
  1. HTC Desire (Bravo) GSM + 已使用 RUU 升級至原廠 2.3
  2. SandDisk Ultra CLASS10 Micro SD 卡(號稱高速30MB/SEC)
    SD卡需要先用磁碟分割軟體切出 1.5GB 空間的 EXT4 磁區 [GParted教學] [MiniTool教學]

升級所需的檔案
  1. installer_r20.0.3-windows.exe [下載來源]
    Android SDK for Windows
    在 Windows 環境刷機需要先安裝內附的 USB Driver
  2. revolutionary-0.4pre4.zip [下載來源] [教學一]
    用 Revolutionary 將手機 Unlock ROOT、S-OFF
  3. su-2.3.6.3-efgh-signed.zip [下載來源]
    取得 ROOT 權限
  4. PB99IMG_cm7r2.zip [下載及教學]
    更改磁區配置
  5. Runny ROM v7.0.2.zip [下載來源]
    最新(2012-08發佈)穩定版的 Runny ROM 7.0.2
  6. 40ad2sdx-a2Recovery.zip [下載來源]
    AD2SDX用來擴充APP儲存空間

提示

*Revolutionary 執行成功後,手機就已經有 Recovery 功能。要進入 Recovery 模式,需要先關機、取出電池重新裝回,先按住降低音量的按鍵「-」不放,再按下電源鍵開機。等待選單畫面出現後,用音量鍵上下移動光棒,選擇 Recovery 進入刷機工具選單。其中清除資料的 WIPE 功能及卡刷所需的 Install zip from sd card 都在此選單目錄中,使用音量鍵上下移動光棒,用光學觸碰鍵確認選擇即可進入該功能。

*若要搭配AD2SDX或INT2SD+,將系統掛載到SD卡的EXT4磁區,需要搭配CLASS10的高速SD卡,應用程式執行速度才會理想。

*升級過的原廠ROM第一次ROOT時,使用「unrEVOked recovery reflash tool」會失敗,改用 Revolutionary 一試就成功了。

*Runny ROM 安裝第一步選擇 Typical 或 Customize,需要選 Customize 才能切換使用 INT2SD+ 或 AD2SDX。

步驟一、HTC官方RUU升級至2.3(建議)

使用提示:在 Windows 系統下安裝並執行升級程式,需要先裝 HTC SYNC 軟體。

因第一次ROOT不成功,爬文發現先將系統透過RUU升級至2.3就能解決。如果刷機遇到  firmware too new 的錯誤訊息,可以先試試看這樣做。

參考此篇教學或影片教學 http://www.youtube.com/watch?v=0f_XVSSR7Ks
到 HTC Developer Downloads 下載區找(網站瀏覽速度很慢),下載點 http://www.htcdev.com/devcenter/downloads/,篩選設定: Filter By "Desire"、Android "v2.3"、"Other"



步驟二、執行 Revolutionarys Unlock ROOT + S-OFF

使用提示:在 Windows 或 Linux 系統下執行,從官方網頁取得驗證碼。

*必須先移除或停用 HTC Sync 軟體。

這個步驟成功後,手機就已經具備 HBOOT 及 Recovery 的卡刷功能。

進入 HBOOT 選單的方法:手機關機後,移除電池再重新裝回,按住音量減按鍵不放再按下電源鍵開機。

下載或取得序號 http://revolutionary.io,參考教學:http://zakipush.blogspot.tw/2011/12/revolutionarys-offroothtc.html#.UE3-N6T9Fbo

以下測試後發現不能用!!!

執行 unEVOked 進行 ROOT 程序
下載 http://unrevoked.com (3.23)
支援 Mac OS X 請見 http://blog.lyhdev.com/2012/09/unrevoked-recovery-reflash-tool-mac-os.html
*僅適用舊版2.2韌體

步驟三、執行 Full Wipe

使用提示:從 HBOOT 進入 Recovery 選擇 WIPE 功能。

舊系統在 /data 等系統磁區殘留的程式及設定檔可能會造成新的ROM不穩定,WIPE 的動作就是將這些資料徹底清空。

參考教學: http://zakipush.blogspot.tw/2012/01/romfull-wipe.html#.UE7oBKT9EZw

步驟四、將磁區配置從原廠 STOCK 轉換成 CM7r2

*使用提示:將 PB99IMG_cm7r2.zip 重新命名為 PB99IMG.zip 並放置 SD 卡根目錄下,進入 HBOOT 選單前會自動偵測並提示安裝。

將磁區配置從原廠 Bravo Stock 更改為第三方 Bravo CM7 r2,這個動作成功後,在刷新的 ROM 時就能選擇其支援的 INT2SD+ 或 AD2SDX 配置。

如何以卡刷的方式將Desire分區配置改成CM7?
http://zakipush.blogspot.tw/2012/01/desirecm7.html#.UE7l5aT9EZx

INT2SD implemented in:
CyanogenMod 7.1.0 Stable INT2SD-M (Download)
CyanogenMod 7.1.0 Stable INT2SD-S (Download)
CyanogenMod 7.2.0.1 Stable INT2SD-S (Download)
GingerVillain 3.3 INT2SD-M (Thread | Download)
GingerVillain 3.3 INT2SD-S (Thread | Download)


INT2SD+ 討論串&原始載點 http://forum.xda-developers.com/showthread.php?t=1357257

INT2SD+(XDA) http://forum.xda-developers.com/showthread.php?p=20947281

改刷 AD2SDX
http://forum.xda-developers.com/showpost.php?p=18602050&postcount=19

步驟五、刷機  Runny ROM v7.0.2 最新穩定版

使用提示:將下載的 Runny ROM v7.0.2.zip 放在 SD 卡,再從 Recovery 選單選擇 Install .zip from sd card,選擇該檔案完成安裝。

*Runny ROM 使用 AROMA 安裝程式,在第一個步驟需要選擇 Typical 或 Customize,並顯示是否支援 INT2SD+ 或 AD2SDX;這邊建議用 INT2SD+,從 Customize 進入就可以切換成 INT2SD+ 配置。

Runny ROM 討論串 http://forum.xda-developers.com/showthread.php?t=1526831

載點在 http://idevicetricks.com/runny-rom-downloads/ ( Download Link )
下載後將檔名更改為 Runny ROM v7.0.2.zip
刷機方式與 6.1.1 相同,請參考此篇教學不久前 DESIRE 的刷機首選是 Runnymede AIO V6.1.1 Special Edition,可惜的是這個 ROM 並沒有繼續更新,所以想要繼續升級讓 DESIRE 老機不死的讀者,可以試試最新穩定版的 Runny ROM。

延伸閱讀

2012年9月12日

Runny ROM v7.0.2 最新穩定版本發佈 HTC DESIRE(Bravo) 刷機必備



Runny ROM v7.0.2 for HTC Desire (Bravo)
發佈時間:2012-08-18
原始來源:http://forum.xda-developers.com/showthread.php?t=1526831 (XDA)

* HTC Sense 3.5
* 支援 AD2SDX 及 INT2SD-S

載點在 http://idevicetricks.com/runny-rom-downloads/ ( Download Link )

下載後將檔名更改為 Runny ROM v7.0.2.zip

刷機方式與 6.1.1 相同,請參考此篇教學

不久前 DESIRE 的刷機首選是 Runnymede AIO V6.1.1 Special Edition,可惜的是這個 ROM 並沒有繼續更新,所以想要繼續升級讓 DESIRE 老機不死的讀者,可以試試最新穩定版的 Runny ROM。

2012年9月11日

自助更換桌球拍膠皮


家裡有兩支陳年的桌球拍,大約是在十多年前買的蝴蝶牌「閃光一號」,膠皮早已硬化龜裂,最近又把它們拿出來修復一下,把桌球當夜間的休閒運動;蝴蝶牌的膠皮太貴,一面膠皮大概要一張小朋友那麼多,在朋友推薦下就考慮價位便宜很多的中國製膠皮,一面只要$250元左右。

更換膠皮並不難,但需要先買一罐膠皮專用膠水;切勿亂用強力膠之類的接著劑,否則不小心就會把木板毀容。這是瓶裝膠皮膠水,有附刷子很方便使用。


把舊膠皮小心撕下,從側邊開始慢慢撕開,需要小力避免將木板「拔絲」。


用砂紙打磨木板,去除殘膠並讓木板表面更平整。


砂紙磨過看起來乾淨許多。


接下來幾個步驟比較忙,沒有多餘的手可以拍照。

  1. 先將拍面和膠皮切齊(LOGO對齊中間下方),用筆在膠皮背面畫出拍型做記號。
  2. 在新膠皮的背面泡綿塗上專用膠水,盡量只塗在記號的範圍內。
  3. 在拍面的木板上也塗上膠水,塗抹均勻並避免過厚。
  4. 等待三分鐘左右讓膠水變乾(很重要,這樣黏度才會足夠)。
  5. 用一隻手五指撐開膠皮(當然是摸正面、千萬別用手去碰膠水),從下緣照記號開始黏貼膠皮。
  6. 黏貼的動作要放慢,並要平整貼上不能拉扯膠皮(否則會造成黏好的膠皮突起)。
  7. 避免氣泡出現,可用滾筒來回將膠皮壓平。


貼好後等膠水變得更乾一點,再用剪刀或美工刀切除多餘部分。


換好新膠皮,球拍又再次變回一尾活龍了!

雖然是價格便宜的中國製膠皮,但打起來感覺並不差,而且也有多種不同功能特性的膠皮可選。

2012年9月10日

燒燙燙的兩套自學烏克麗麗入門教材分享

最近愛上烏克麗麗這個愈來愈燒的樂器,但是還抽不出時間去參加課程,所以只能先找些自修教材,利用睡前的片刻練習一下。

第一本書是樂器行推薦的《烏克麗麗完全入門24課》,作者陳建廷(David)是留學英國的音樂工程碩士:David Ukulele 夏威夷吉他(作者的部落格)。這本書的內容淺顯易懂,提供的TAB譜也由淺入深,很適合入門。畢竟書本只有文字敘述,對新接觸樂器的初學者,看完文字還是很難知道自己彈的方式是否正確,所以這本書還附上作者親自講演的影片DVD一片,相信聰明的讀者多看幾次教學影片就可以頓悟啦!

如果想參加 David 的實體教學課程,請自行追蹤部落格的消息。

另一個想推薦的是在書局找到的《烏克麗麗的一天》,裡面包含一張 CD 專輯與一張 DVD 教學影片。在 YouTube 可以找到不少作者 Daniel Ho 的彈唱影片,相信他技巧高超的演出能讓人更喜歡烏克麗麗這個樂器。

在音樂 CD 有以下曲目(KKBox 已收錄此張專輯):
  1. Pineapple Mango 早餐之歌-鳳梨芒果    
  2. School's Out 假期來臨    
  3. Sweet Reverie 甜蜜幻想曲  
  4. Between Friends 與我的朋友    
  5. Haiku 海庫  
  6. Kauanoenoe 濛濛細雨  
  7. Take It Out 不安分的音  
  8. First Date 猜疑的初次約會    
  9. The Dessert Song 甜點之歌    
  10. I Ka Lai 片刻寧靜  
  11. 早餐之歌-鳳梨芒果(演唱版)

教學影片 DVD 講英語,但有提供中文字幕,看翻譯應該就能瞭解內容。


unrEVOked recovery reflash tool 在 Mac OS X 電腦解放 Android 手機(Unlock ROOT)


http://unrevoked.com/ 選擇手機型號

下載 unrevoked3

開啟後將圖示拖曳到 Applications 應用程式集

開始簡易的 ROOT 程序


2012年9月9日

【美食】俗擱大碗的輝哥生魚片,墾丁後壁湖恆春區漁會


到墾丁度假或後壁湖搭船,喜歡吃海鮮、生魚片,別錯過這家遠近馳名的輝哥生魚片。平常點一盤生魚片就要200、300元,卻不夠一個人塞牙縫;但是來到輝哥吃生魚片,一個人只要花上100元,就可以點份量多達20片的綜合生魚片一盤,C/P值簡直破表。

輝哥生魚片的計價方式,簡單說就是一片5元。雖然賣得便宜,但是厚實的口感並不偷工減料,而且靠漁港就是有新鮮的優勢,吃不完的生魚片打包煮味噌湯都划算。
  • 100元,20片。
  • 150元,30片。
  • 200元,40片。
  • 300元,60片。 
  • 400元,80片。

輝哥生魚片
位於恆春區漁會大樓
電話:(08)889-7776
地址:屏東縣恆春鎮大光里砂尾路16-64號
營業時間:11:00~20:00
地圖連結

*優點:生魚片便宜。
*缺點:位於漁會市場的攤位且顧客超多,環境衛生和服務品質請自行斟酌。







PHP 與 MySQL 資料庫存取效能調校筆記

通常以 LAMP(Linux+Apache+MySQL+PHP)基礎建構的網站系統,都會有不錯的效能,因此開發者即使忽略掉一些影響效能的設計細節,在網站上線的初期都不會察覺問題。但是少許嚴重影響效能的未爆彈,很可能在瀏覽量、資料量變大的時候,就會有明顯的效能問題浮現。

最近著手一項舊系統調校的任務,其伺服器環境是標準的LAMP:
  • RedHat 9
  • apache-2.0.40
  • mysql-3.23.54a
  • php-4.2.2
  • 512MB RAM

因為此系統的負載對 Apache 來說只是小CASE,所以只要簡單檢查 httpd.conf 有無異常的設定。

/etc/httpd/conf/httpd.conf

StartServers       8
MinSpareServers    5
MaxSpareServers   20
MaxClients       150
MaxRequestsPerChild  1000

這些設定值保留預設就已足夠。在執行一段時間後,httpd 的 process 數量會達到 20 個,為節省一點伺服器資源消耗,我便將非必要的 LoadModule 註解。

#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
#LoadModule proxy_http_module modules/mod_proxy_http.so
#LoadModule proxy_connect_module modules/mod_proxy_connect.so

然後再重新啟動 Apache 伺服器。

apachectl restart

再來是 MySQL 的部份,因為臆測拖累網站速度的主因之一,極可能是設計不當的 SQL 查詢,因此我直接將 MySQL 的記錄功能開啟,log-slow-queries 會將查詢消耗過多時間的 SQL 記錄到 log 檔案,其中 long_query_time=1 代表時間超過 1 秒才記錄。

*調校完需要再次將此記錄功能停用,避免影響效能。

[mysqld]
log-slow-queries
set-variable = long_query_time=1
#set-variable = log_long_queries=1
#log-queries-not-using-indexes

MySQL 有許多參數可以調整,使用「show variables」與「show status」可以查詢目前的伺服器設定及狀態。

$ mysql -uroot
mysql > show variables;
mysql > show status;

對於已經運作一段時間的系統,MySQL 資料表(db table)在磁碟中的檔案可能已經出現許多碎片,這需要使用 optimize table 語法將資料表重整最佳化。

mysql > use DBNAME;
mysql > optimize table TABLENAME;

關於 MySQL 的參數調校可以參考:

http://dev.mysql.com/doc/refman/5.0/en/server-parameters.html
http://portable.easylife.tw/2074

接下來重新啟動 MySQL 伺服器。

sudo /etc/init.d/mysqld restart
sudo service mysqld restart

接下來就可以另開一個新的 Terminal,觀察 slow log 以瞭解 PHP 程式哪些 SQL 語法花費太多時間。 

tail -f /var/lib/mysql/localhost-slow.log

針對 PHP 連線存取 MySQL 資料庫的設定,有些簡易但是對效能有些許幫助的細節可以注意:

使用 mysql_pconnect 取代 mysql_connect,差別是多一個「p」表示使用持續連線(persistent connection),減少 PHP 程式每次執行都需要重新建立資料庫連線的成本。

$conn = mysql_pconnect($dbhost, $dbuser, $dbpassword);

另外,如果資料庫是在同一部伺服器,則可以指定 mysql.sock 的路徑,用系統的 Socket 通道取代一般的 TCP/IP 連線。但如果網站與資料庫伺服器分別獨立於不同機器,就無法這樣做,當然將機器分開本來就對整體效能比較好。

$dbhost = "localhost:/var/lib/mysql/mysql.sock";

在開始改善 SQL 語法設計前,開發者也需要知道查詢結果會佔記憶體,當某個查詢在迴圈中存取 N 次,若沒有適時釋放記憶體空間,也會造成不良的影響。這部份需要養成好習慣,就是在一個 Result 不再需要使用時,就用 mysql_free_result 函式解放它。

$result = mysql_query("SELECT ...");
//mysql_fetch_array...
mysql_free_result($result);

接下來是 SQL 觀念的部份,好與不好的 SQL 設計結果可能相差數倍或數十、數百倍,有經驗的開發者應該避免偷懶而用上危險的設計。

雖然書上經常這樣寫,許多程式剛開始也這麼做,但還是要千萬記住「SELECT *」很危險不適合在地球上使用;因為你在查詢一個資料表時,不可能不知道自己要什麼欄位,即使是 ORM 也會清楚定義 Data Object 的 Properties,所以在正式上線的程式要避免直接用「*」這種偷懶的查詢寫法。

SELECT * FROM ... 

比較好的作法,應該是加上明確指定的欄位名稱及查詢筆數限制:

SELECT COL1, COL2 FROM ... LIMIT 100

加上資料筆數限制,因為將「所有資料」都顯示在頁面上的設計並不合理,當某個資料表有十萬筆資料時,不可能未經篩選就全部顯示。因為畫面能顯示的資料筆數有限,所以通常一定會加上分頁、筆數的設定,這部份不太會有問題。

但是初學者經常犯的一個嚴重錯誤,就是為了計算資料總筆數(需要換算成分頁的頁數),就真的把無限筆數的「*」查詢給用上。

$result = mysql_query("SELECT * FROM ..."); //無限筆數的恐怖查詢
$total = mysql_num_rows($result); //只是為了取得分頁所需的總筆數

因為 PHP + MySQL 跑得很快,在資料量小於 1000 筆時不會有什麼感覺,但是等系統上線資料量達到上萬筆,就會有明顯的差異。

正確的作法是使用 SQL 的 COUNT(*) 語法計算總筆數,直接將計算結果取出:

$result = mysql_query("SELECT COUNT(*) AS C1 FROM ...");
$row = mysql_fetch_array($result);
$total = $row['C1'];

在比較新版的 MySQL 可以用 Sub Queries(子查詢),讓一句 SQL 可以做更多事:

SELECT C1, (SELECT COUNT(*) FROM T2 WHERE ... ) FROM T1 WHERE ...

或是:

SELECT C1 FROM T1 WHERE (SELECT COUNT(*) FROM T2 WHERE ... ) > 0 ...

但是舊版 MySQL 並不支援子查詢,這時候可能就產生一個問題,當主查詢的比數有 10,000 筆時,子查詢可能被執行 10,000 次。

mysql_query("SELECT C1 FROM T1 ..."); //call once, return 10,000 rows

若不支援子查詢,子查詢需要獨立做查詢,但其查詢次數等於主查詢的筆數:

mysql_query("SELECT COUNT(*) FROM T2 WHERE ..."); //call 10,000 times

這個問題的解決方法有兩種:
  1. 如果可以,用 JOIN 語法或 FROM T1, T2 方式改寫成相同目的的 SQL,只要查詢一次就能得到結果。
  2. 如果不能合併 SQL 語法,就可以考慮將資料預查、快取等方式。
第二種作法需要視實際的情況設計,例如可以先利用一個子查詢將某個鍵值欄位快取。

$keys = array();
$result = mysql_query("SELECT K1 FROM T2 WHERE ...");
while ($row = mysql_fetch_array($result)) {
  $keys[] = $row['K1'];
}

再利用 WHERE ... IN 語法製作主查詢(這個作法需要考慮 SQL 內容長度的限制)。

$keystr = implode(",", $keys);
$result = mysql_query("SELECT C1, C2 FROM T1 WHERE ... AND T1.K1 IN (".$keystr.") ...");

雖然無法合併為同一個 SQL 查詢,但只用了兩個查詢仍然可以在合理的時間內處理完。

@作者 lyhcode 分享於玩物尚誌

2012年9月8日

電烏克麗麗(Ukulele)開箱 LEHO LHC-MM-CE


這個週末的新玩具,是不在計畫內的烏克麗麗(Ukulele),原本只是抱著害死貓的好奇心,想到晚餐附近的樂器行隨便逛,但是只看幾眼就被這酷似玩具吉他的樂器吸引。其實我很小就跟樂器絕緣,不管是電鋼琴、長笛或木吉他,最多都只是勉強學會一首小蜜蜂,接著就變成擺飾,最後通常因為覺得很佔位就送人或拍賣掉了。但是烏克麗麗迷你可愛、當擺飾不佔空間的優點,以及它討喜的音色,讓我又重新燃起學樂器的渴望。

Ukulele(烏克麗麗、四弦琴,也有人稱夏威夷木吉他),最早出現在1878年,由葡萄牙移民帶入夏威夷, Joao de Freitas 是讓烏克麗麗在夏威夷發揚的推手。(資料來源 Wikipedia

只有四弦、樂譜較易懂,價格相對較便宜,普遍認為烏克麗麗比木吉他更容易入門。對於一般只想接觸音樂當興趣、想把樂器當休閒娛樂的玩具,這應該是C/P值很高的敗家好物。

烏克麗麗常見的四種尺寸:
  • Soprano:21"(琴長21吋,約53公分,也稱為Standard)
  • Concert:23"(琴長23吋,約58公分)
  • Tenor:26"(琴長26吋,約66公分)
  • Baritone:30"(琴長30吋,約76公分)

美國時代雜誌在去年的一篇報導,談論關於烏克麗麗的流行成長,原因包括 YouTube 加速音樂影片的傳播,以及烏克麗麗本身便宜又歡樂的特性。這股熱潮在幾年前就已經燒到台灣,很多樂器行都將烏克麗麗擺在最醒目的位置,許多顧客一上門就要問烏克麗麗,身邊的不少朋友也去上課學烏克麗麗。

A String Thing - Time Magazine(時代雜誌)

YouTube 可以找到標題「Ukulele weeps by Jake Shimabukuro」的一段影片,被稱為烏克麗麗神人的 Jake Shimabukuro,這段影片的點閱次數高達一千萬次!


比較過不同價位的烏克麗麗,最後我選擇的是 LEHO 的 23" 烏克麗麗(LHC-MM-CE),這款可外接音箱、內建調音器,缺角造型和外觀很討喜。「LEHO」在夏威夷語是「貝殼」的意思,貝殼有著能聽見大海聲音的浪漫傳說。LEHO 的烏克麗麗從入門的3000元至專業等級的2萬多元都有,如果預算足夠,5000~8000元左右的型號對業餘來說就已經綽綽有餘。

Leho Ukulele

接下來就看圖說故事啦 ; )

不佔空間的樂器對小坪數毫窄來說很重要,烏克麗麗平常可以當擺飾

LEHO 內建的調音器

LEHO LOGO

缺角造型設計

側邊的優雅弧線

凸背設計讓聲音更響亮

外接音箱的插座及電池座

印有 LEHO LOGO 的原廠背袋

烏克麗麗很怕摔,需要背袋內層加厚防護

練習曲的主角背著木吉他去流浪很帥氣,但個人覺得背烏克麗麗比較實際

外接音箱的連接線

lyhcode by lyhcode
歡迎轉載,請務必註明出處!