Planet DebianTW

January 25, 2012

Tetralet

賀!HIME 已進入 Debain Offical Repository,Luna's Debain Archiver 退居幕後!

感謝 Yao Wei 的辛勞奔走,目前 HIME 已進入 Debian 官方的套件庫,您應該已經可以使用 apt 工具直接由 Debian 官方下載安裝 HIME 了。為了衝 Debian Popularity Contest個人建議您能轉用 Debian 官方的套件庫,而 Luna's Debian Archiver 則退居第二線,回歸原本的 (不負責) 私人套件站台。

當然,本站台上的 HIME deb 仍會持續更新。但因為是私人站台,很多做法上可能會較為我行我素甚至是自以為是,若您還是想使用本站的 deb 的話,還是請小心謹慎為上。

以下為 Luna's Debian Archiver 和 Debian 官方 deb 已知的不同點:

  1. 本站支援較舊的 Debian/Ubuntu 版本,包括 Debian Lenny、Squeeze 及 Ubuntu Lucid (10.04 LTS)、Natty(11.04)、Oneiric(11.11)。
    Debian Lenny 的支援會於 2012/2/6 日後終止;Ubuntu Lucid
    的支援則在 Precise (11.04 LTS) 推出後終止。

  2. 本站的 deb 針對 Ubuntu 的使用者有些小小的修正。

  3. 本站的 deb 裡包含一些 DFSG non-free 的軟體,像大易三碼的碼表。

  4. 本站會視情況提供較新、較快速的 git 嘗鮮版。

  5. 本站僅提供 i386/amd64 之套件。Debian 官方無意外的話,會提供所有 Debian 已支援平台的 deb。

  6. 分離出 hime-icon-themes 套件。

  7. hime-datahime-tables 的套件內容和 Deian 官方後來所提供的不同。(註)

  8. 提供 hime-dbg 套件以供除錯。

而以下為本站日後 hime 套件相關列表及說明:

hime:
主程式。
(內含檔案可能和 Debian 官方的 hime 套件有異:本站 deb 還包含了 /usr/share/hime 裡,和處理器平台相關的檔案。)
hime-data: 主要內容為 /usr/share/hime 裡,和處理器平台無關的檔案。必須安裝
(內含檔案和 Debian 官方的 hime 套件不同,本站 deb 還包含/usr/share/hime/table/ 裡,和處理器平台無關的檔案。)
hime-tables: 主要內容為 /usr/share/hime/table/*.gtab
若您是 詞音/新酷音/anthy 的使用者,可不必安裝此套件。
(內含檔案和 Debian 官方的 hime-tables 套件不同,Debian 官方包含了 /usr/share/hime/table/ 裡所有的檔案。)
hime-icon-themes: 內為 pinkblackdark這三組 icon theme。hime 內建的則為 blue 這組 icon theme。
(Debian 官方無此套件,被整合至 hime 套件裡)
hime-gtk3-immodule: GTK3 輸入法模組。
但 GTK3 目前只出現在 Debian Wheezy / Ubuntu Oneiric 裡,所以本站台所提供的 hime-gtk3-immodule只有在 Debian Wheezy / Ubuntu Oneiric 版才有。
如果您已升級至 GNOME3,或系統是 Ubuntu 11.10,請務必記得安裝本套件!
hime-qt3-immodule: QT3 輸入法模組。
hime-qt4-immodule: QT4 輸入法模組。
hime-anthy: anthy 日文輸入法模組。
hime-chewing: libchewing 新酷音輸入法模組。
因為 libchewing 版本過舊,Debian Lenny 裡並沒有提供 hime-chewing套件。
hime-dbg: gdb 除錯資訊。
如果您在使用 HIME 時卻發生了問題,您可以安裝此套件後,利用 dbg 來替 HIME 除錯。請參考:Linux 除錯利器 - GDB 簡介
(Debian 官方無此套件)
hime-dev: header files,若要套用 distro/dev-tools/patches/rxvt-unicode-9.14.diff 並編譯 rxvt-unicode 時會用到。

本站的 hime 套件會如此分割的主因是除了想要減輕本站硬碟空間的負擔之外,也希望讓一般 詞音/新酷音/anthy 使用者只要安裝 himehime-data 套件即可,不必一定要安裝 hime-tables 套件。(Debian 官方套件目前的做法是一定要安裝 hime/hime-data/hime-tables 這 3 個套件。)

因此,不管您是想轉而使用 Debian 官方的 hime 套件,或是想換用 Luna's Debian Archiver 的套件,建議您能先將 hime 完全移除後再轉換 deb 站台

當然了,因為是私人站台,當然是以惡搞為上。如果您想用 Luna's Debian Archiver 的套件的話,建議您在下載安裝前請務必三思。若您遇到了什麼奇怪的問題,或是套件版本未能即時更新,請您不吝向敝人反應。謝謝!

by tetralet at January 25, 2012 02:58 PM

tsung

貝貝的童言童語 - 最喜歡的人 (1Y11M)

貝貝在 1歲11個月時, 講出最喜歡的人是誰~

時間: 2012-11月

緣起: 學校老師說, 問貝貝最喜歡什麼人, 她會說 "爸爸、媽媽"

知道這個消息後, 爸媽回家當然要確認一下.

爸爸: 你最喜歡的人是誰?

貝貝: (思考中...)

貝貝: (思考中...)

貝貝: (思考中...)

貝貝: 小傑.

爸媽: Q_Q ..... (小傑 是下圖左邊那位)

IMG_2437

by Tsung at January 25, 2012 05:38 AM

January 23, 2012

tsung

貝貝的童言童語 - 麵的動作 (1Y11M)

今天(2012-01-12)早上吃早餐...

貝貝: (用湯匙撈起一大匙的麵, 正要往嘴巴送)

註: 一大匙的麵, 是指連爸媽的嘴巴都塞不進去的大小.

貝貝: (嘴巴沒接到麵, 於是麵掉回到碗中)

貝貝: 爸爸...... (無辜的看著爸爸)

貝貝: 麵麵跌倒了.

爸爸: .....

by Tsung at January 23, 2012 05:34 PM

January 22, 2012

tsung

2012農曆新年快樂 + 搶頭香

農曆春節過年, 恭祝大家新年快樂, 龍年行大運~

為了避免看到過多的新聞或技術影響假期, 所以在這9天的假期都不寫任何跟技術有關的東西, 而是來個貝貝或生活類的連續轟炸, 一起放輕鬆的過日子, 恭喜發財~

新年大多數人應該都會去拜拜, 關於搶頭香, 常常會有意外狀況, 請注意安全~ (下述兩個影片為證)

衰!搶頭香撞倒香爐 搬起來卻被阿嬤搶頭香

埋伏搶頭香

by Tsung at January 22, 2012 04:24 PM

Tetralet

如何自行編譯/打包/測試/回報/參與 HIME?

如果您想自行編譯 HIME,以下提供了簡單的步驟:

原始碼位置:

您可以在 https://github.com/caleb-/hime/downloads 取得 HIME 的最新穩定版/開發版 tarball。
穩定版 tarball 備份站:http://hime.luna.com.tw/

所需套件:

必需套件build-essential libgtk2.0-dev/libgtk-3-dev libxtst-dev

build-essential 是 Debian 的一個虛擬套件,裡面包含了一些編譯時的必要套件,像 gccmake 之類的;如果您使用的是其它的 Linux Distribution,可能要找找看有沒有類似的套件。

選用套件libanthy-dev libchewing3-dev libgtk2.0-dev/libgtk-3-dev libqt3-mt-dev libqt4-dev libappindicator-dev gettext

libanthy-dev: 如果要加入 anthy 的支援的話
libchewing3-dev: 如果要加入 新酷音 的支援的話。注意至少要使用新酷音 0.3.2 以上才能順利編譯喔!
libgtk2.0-dev 如果要編譯 GTK2+ 輸入法模組的話
libgtk-3-dev: 如果要編譯 GTK3+ 輸入法模組的話
libqt3-mt-dev: 如果要編譯 QT3 輸入法模組的話。
因為要 QT3 im-modules 能動作需在 QT3 上套用一個非官方的修正程式,請確認您的系統有套用此修正程式,再啟用 --enable-qt3-immodule 選項來編譯 QT3 輸入法模組。
libqt4-dev: 如果要編譯 QT4 輸入法模組的話
libappindicator-dev:
如果要支援 Ubuntu 的 Unity Tray 的話。注意至少要使用 Ubuntu 11.10 的 libappindicator-dev 0.4.1 以上才能順利編譯喔!
gettext:
如果要編譯翻譯檔的話。覺得沒必要的話記得指定 --disable-nls

HIME 可以在純 GTK2+(libgtk2.0-dev) 或 GTK3+(libgtk-3-dev) 環境下編譯。在編譯時會同時編譯相對應的 GTK2+/3+ 輸入法模組。

解開原始碼

目前 HIME 的官方原始碼是用 xv 壓縮的。所以請以以下指令解開下載來的原始碼:
tar xJf hime-0.9.9.tar.xz

編譯流程:

清除上次編譯所殘留下來的暫存檔:

在開始編譯之前,請順手清除上次編譯所殘留下來的暫存檔,以確保您的 HIME 是全新編譯的:
make clean distclean
HIME 支援以下的 make 指令:
make clean:
清除在 make 過程中所產生的所有中繼檔,如 *.o 之類的。
make distclean:
清除由 configure 所產生的設定檔。
make:
編譯 HIME。
make install:
將 HIME 安裝至系統中。
HIME 目前尚未支援 make uninstall 指令。

執行 ./configure 並設定 CFLAGS、CC--prefix 及其它編譯選項

可以使用 CFLAGSCC 來指定 HIME 所要使用的編譯程式和它的 CFLAGS。目前 HIME 支援了 gcc/clang 編譯程式,預設的 CFLAGS 則為 -Wall

也可以藉由 --prefix 來指定 HIME 的安裝路徑,建議要小心得修改這個值,像是 Debian User 應該指定為 /usr;否則 GTK/QT im moduels 很可能會安裝在錯誤位置。

如果您的系統中同時有 GTK2+ 及 GTK3+,但您想編譯 GTK3+ based 的 HIME,請記得加上 --with-gtk=3.0 選項。

如果您沒安裝 gettext 套件,您可能得下達 --disable-nls HIME 不會去編譯翻譯檔。

綜合範例如下:
CFLAGS="-g -Wall -Os" ./configure --prefix=/usr --with-gtk=3.0 --disable-nls
HIME 目前所提供的編譯選項如下:
--prefix=PREFIX 指定安裝路徑。預設為 /usr/local
--with-gtk=2.0|3.0 要以 GTK2+ 還是 GTK3+ 來編譯 HIME。預設為 2.0。
--disable-nls 不編譯翻譯檔,目前預設介面為繁體中文。
--disable-xim 不使用 XIM。
--disable-system-tray 不使用 System Tray。
--disable-tsin 不使用詞音。
--disable-gtk2-im-module 不編譯 GTK2+ 輸入模組。預設為自動偵測。
--disable-gtk3-im-module 不編譯 GTK3+ 輸入模組。預設為自動偵測。
--enable-qt3-immodule 編譯 QT3 輸入模組。預設為自動偵測。
--disable-qt4-immodule 不編譯 QT4 輸入模組。預設為自動偵測。
--disable-anthy 不支援 anthy。預設為自動偵測。
--disable-chewing 不支援 chewing。預設為自動偵測。
--disable-appindicator 不支援 Ubuntu Unity Tray。預設為自動偵測。
--qt3-moc-path=PATH 指定 QT3 的 moc 指令的路徑。
--qt4-moc-path=PATH 指定 QT4 的 moc 指令的路徑。
--qt4-im-module-path=PATH 指定 QT4 輸入模組的安裝路徑。

開始編譯

接下來只要下達 make 就會開始編譯了。如果在編譯過程中遇到任何問題,請您不吝向我們回報:
make
如果編譯一切順利,您就可以開始測試/除錯 HIME 了。請參考下個章節的介紹;或是把 HIME 安裝在系統裡,請參考下個步驟。

HIME 安裝至系統裡:

如果編譯的過程中沒出現任何問題,您可以利用以下指令把 HIME 安裝到系統裡:
make install
註:為了維護您系統的純淨度,請儘量利用系統的套件機制來安裝軟體。自行用  ./configure && make && make install 來編譯軟體並將軟體直接安裝到您的系統裡可能會搞亂您的系統並使得您的系統套件機制混亂。請戒而慎之。

自行打包 deb 套件:

為了確保您的系統的純淨度,在此強烈建議把 HIME 打包成 deb 套件後再用 dpkg 指令來安裝 hime 套件。這在 HIME 裡這完全不是難事,只要先安裝好 fakerootdebhelper,以及上文所寫的必需/選用套件,然後執行以下指令即可生成 hime_0.9.9+git120115-1_amd64.deb 了:
sh distro/debian/gen-deb
然後用 dpkg 把它安裝起來即可:
dpkg -i hime_0.9.9+git120115-1_amd64.deb

自行打包 rpm 套件:

這部份由於筆者對 rpm 系列實在不熟,尚待強者補完。

測試 HIME

HIME 還提供了一個小小 script 可以讓您不用將 HIME 安裝至系統裡,就能直接執行 HIME 並進行測試/除錯。

首先,請先安裝 gtk2.0-examples gtk-3-examples 這幾個套件,然後執行以下指令即可:

sh distro/dev-tools/scripts/test-hime
如果以上指令失效,您可能要稍加修改 distro/dev-tools/scripts/test-hime 才能讓這個小測試程式能夠動作。例:
GTK_2_DEMO_APP=leafpad ← 測試 GTK2+ 的程式。您可以考慮在此指定為 leafpad 之類的 GTK2+ based 應用程式。
GTK_3_DEMO_APP=
l3afpad ← 測試 GTK3+ 的程式。您可以考慮在此指定為 l3afpad 之類的 GTK3+ based 應用程式。
GTK_QUERY_IMMODULES_2=/usr/lib/x86_64-linux-gnu/libgtk2.0-0/gtk-query-immodules-2.0gtk-query-immodules-2.0 這個指令的路徑。
GTK_QUERY_IMMODULES_3=/usr/lib/x86_64-linux-gnu/libgtk-3-0/gtk-query-immodules-3.0gtk-query-immodules-3.0 這個指令的路徑。

然後再執行一次 distro/dev-tools/scripts/test-hime 試試看。

不過這個小小 script 只能測試 XIM 及 GTK2+/3+ 輸入模組。QT3/4 輸入模組還是只能安裝到系統裡後再行測試了。

回報問題:

如果您在測試 HIME 時發現了任何問題,請您不吝向我們回報問題。為了能更快速釐清問題所在,建議您能詳述問題發生的步驟,如果可以,請先參考:如何有效地報告錯誤

而在必要時,建議您在回報問題時,順便回報您的系統設定。在 HIME 裡有一個小小的 script 可以顯示一些 HIME 的相關系統設定,請直接執行:

hime-env
然後,再把輸出的資訊貼上來即可。

善用 coredump 資訊

在 Linux 裡,如果程式當掉了的話,系統可以把當時記憶體內容 dump 成檔案以便於日後除錯。但在 Debian/Ubuntu 裡,因為這些除錯檔可能會佔上硬碟很大的空間,所以預設上這個功能是被關閉的。

如果您想打開這個功能,請設定 /etc/security/limits.conf 如下:
# <domain>      <type>  <item>          <value>
*               hard    core            409600
*               soft    core            102400

其中的 <domain> 指的是使用者名稱;<type> 中的 hard 指的是『系統限制大小』;soft 指的是『使用者預設大小』;<item> 指的是類別;<value> 指的是檔案限制大小,不想限制的話可在此填上 unlimited。請 man limits.conf 以取得更多詳盡資訊。

設定完成後,登出登入後即可生效。

之後,如果您在執行 HIME 的期間發生了什麼問題而當掉了,您應該可以看到如下的錯誤訊息:

程式記憶體區段錯誤 (core dumped)
然後會在執行 HIME 的目錄下生成 core 這個檔案。您可以提交這個檔案以利於除錯。不過,這個檔案包含了您的記憶體的資料,提交這個檔案可能會引發安全及個人隱私上的隱憂。如果您會使用 gdb 的話,建議您自行用 gdb 載入這個檔案並 backtrace 後提交追蹤後的資訊方為上策。

參與 HIME

您不需要是箇中高手才能加入 HIME 開發團隊,我們需要的只是您肯試著捲起袖子幫忙。我們 HIME 開發團隊的成員其實都只是在修改各自自己感興趣的地方,所以時時期待能有新血加入。HIME 開發團隊中有個新成員是高中生,這是他第一次接觸 C 語言,也是第一次開發 GTK 程式。讓 HIME 能支援 Ubuntu 的 Unity Tray 就是他的大作喔!

而對於 HIME 團隊而言,其實只要您肯幫忙測試推廣回報問題,對我們就是莫大的助益。請立即加入 IRC 頻道 #hime@freenode.net 吧!就算上來聊天哈啦也好。

但其實只要您肯試用看看 HIME,我們 HIME 團隊就感到非常榮幸了。我們衷心期望您立即下載測試使用 HIME 吧!謝謝!

by tetralet at January 22, 2012 04:18 AM

January 21, 2012

fred

商業操弄,軟體研發人員不喜歡做的事!

在國外,許多大型軟體公司林立,老牌軟體商建立了不少現今軟體業仍在使用的遊戲規則。而比較小的軟體外包商、工作室或是個人,也糊裡糊塗依照這些大公司使用的遊戲規則走,甚至是遵守不合時宜的淺規則。然後,軟體業進入了國內,又被代工思維牽著走,軟體業因此哀嚎聲不斷。軟體研發人才不喜歡去操弄商業,卻被商業操弄著。

身為軟體外包或是軟體客製化的外包商,你是否曾遇過,客戶有很多大大小小的鎖碎要求,不定期會交代過來? 這些修修改改,看似不癢的功能和需求,做起來毫不費功夫,三兩下順手就能完成,卻往往造成雙方驗收標地的分岐,此外,不知不覺中所累積的份量,也讓結案時間遙遙無期,甚至造成軟體產生更多的問題待解決。對於只想當水電工的研發人員,總是在客戶的要求下,修完馬桶順道通水管,又補個土、也打個臘。另外,如果馬桶旁邊剛好有漏水,那你要自認倒楣了,因為客戶也會請你幫忙『順手』解決一下,或認定是你在修馬桶時弄壞的。是吧,令人難過。

難道研發人員就要這麼可憐嗎?我們做錯了什麼,為何就要這樣被對待?明明是為了提供更好服務,卻累死三軍,又讓人有把柄指著鼻子唸。更慘的是,一旦這些看似不起眼的修修改改,累積成有影響力,讓專案與合約內的需求不完全相符。客戶就有機會利用『與合約不符』的矛盾點,再殺下一城。

筆者也同是天涯淪落人,曾經不斷思考這問題也同時咒罵著台灣的業界,咒罵他們總不給軟體商有活命的空間。尤其受了委屈後,更是一股惱自命不凡,認為自己無論做什麼樣的事,都應該比一般人收取更多費用,以平心頭之恨。但過些時日後,經過冷靜思考,發現是一開始雙方的互動模式就錯了,或許更仔細檢視這個行業,才能找到改變現況的辦法。

大多數軟體開發不是演藝事業

一直不認為『軟體程式設計師』是演藝事業,所謂『台上一分鐘,台下十年功』不能完全形容軟體開發的工作。雖然,越厲害的研發人員,越能設計好品質的軟體;越是名不經傳的軟體商,也越難生存於業界。許多面向與藝人生態有些相似,但其實完全不是這個樣子。

因為我們雖練功多年,在專案過程中,卻仍然做很多沒技術性又取代性高的工作,或是『順手工作』這類連項目都寫不出來的事。所以,與演藝事業最大的不同是,我們不是只做一件事:『像巨星一樣站上台吸引全場目光,解決觀眾們長達數十分鐘的無聊時間』,而是因應專案需求,巨星仍然要下海當工讀生或工作人員,甚至是清潔工。所以,大多數軟體研發人員,其實扮演的是『跨年晚會工程的承包商』,不是巨星。許多客戶的額外零碎需求,就像有人在會場中亂扔垃圾需要被收拾,或是突然有人身體不適昏倒需要救護車送醫,這些都無法預期也無法很容易的按工計酬。

這一切,除非你有將風險成本都算在專案內,更重要的是案子也要夠大,不然相當不容易去完成工作。這也是為什麼許多比較大的軟體商,比較不受影響,因為他們接的案子也夠大,風險成本都能很輕易的被安插進總報價裡面。

因此,除了這類大型軟體商,多數中小外包商和客戶的想法,其實一開始便有了分岐。很多研發人員真的分不太清楚,自己只是當個明星,還是承包整個工程的承包商。但無論如何,客戶的心中一直很清楚認定:『承接專案的人就是整場晚會的承包商,我們不管你是不是把巨星拿來當小弟用,我們要得到的就是一個成功又圓滿的晚會』。

一切的痛苦,已經不能責怪是不是當初定需求不夠明確,也不能怪研發人員利用太多『舉手之勞』提供給客戶額外的服務。最後你會發現,想再多的方法與客戶確認需求、利用商業手段與客戶定下契約,或是出動威脅利誘的業務手法與客戶協商,都是頭痛醫頭腳痛醫腳之舉。或許先認清楚自己想要做的角色和可以做的角色,再引入適當的制度,才是突破現況的第一要務。


我們只想當水電工

說明白了,我們只想當個『軟體水電工』,有工就有酬,沒經驗的小工拿一份酬,有經驗的工頭拿雙倍酬,立即解決問題就立即收錢,然後打道回府等下一個工。至於整體工程承包,我們其實一點興趣都沒有。

只是,當水電工似乎是遙不可及的夢,因為客戶就是自己不能解決或決定,才外包找人解決,他們想要得到的是整個解決方案,而不只是工人。更重要的是,在資訊科技業中,客戶無法看到漏水就能自行判斷要找水電工,而是要先找醫生診斷病情,然後才選擇治療方案和醫療團隊。

雖然很可惜的是,大多數情況下,軟體研發人員沒辦法只當個『水電工』,但肯定有不少需求,是可以規劃成專業服務,使用水電工的收費方式,若是多加思考,應該能有些斬穫。



我們也許可以當醫生

其實仔細省閱一下醫生的工作,除了要聽取問題、診斷病情、評估可行性和提出處方,必要時要進入手術室開刀和操作儀器去治療病人,就像軟體外包在做的一般,開玩笑的說,我們也許可以稱醫生為『人體工程師』。此外,而客戶基於安心考量,多少也會自行去尋找名醫。這些種種情況,個人認為軟體研發人員其實更像個醫生。

因為像醫生,所以在簽約進行手術或治療前,我們也必需要做許多評估。但不一樣的是,無論醫生是否有治療成功,醫院總是有錢領,但軟體業則是要摸著鼻子認了。許多軟體外包商,在談案子的階段,最怕的就是不清楚技術上可行與否,或是不知自己有沒有能力達成。所以,多數軟體研發人員在面對不同案子簽約之前,就算不確定是否會得到案子,也都會先做許多評估或提前研究,甚至,必需提前偷跑才能知道可行性。

不過,面對現在科技產業客戶都追求創新的情勢,這種不確定性的程度更甚也更常見,如果案子接到了還算好,如果沒接到,這種事前研究期的資源浪費,讓更多中小軟體商非常痛苦。更還沒提到,接到案子後如果有不可預期的技術瓶頸(像是配合的硬體平台有嚴重且之前未被發現的 Bug),造成手術失敗或時間拉長的情況。真正的醫療體系或許還有保險可以支付手術費用,但在軟體業,這意味著無法結案,收不到款。

因為這樣不易收到款的制度,軟體承包商為了結案,屢見不鮮地用盡『各種手段』處理和討好客戶的需求,包括了文章開頭提到的『舉手之勞』和隨之而來的各種問題。導致其開發出來的軟體品質不佳,客戶也得不到最好的成果,常有狗尾續貂的情況發生,講的更難聽些,虎頭蛇尾會更為貼切。

可憐的是,軟體研發不是人命關天,一切在商言商,客戶們通常不願只付『掛號費』,還可能貨比三家。哪一家能『價格殺的夠低』又拍胸脯『保證全部完成』,哪一家就能搶到案子。如此惡性競爭,更加深擴大了軟體研發人員被劃開的傷口。

軟體產業沒有軟體健康保險補助,不是所有人都能夠負擔起看醫生、身體檢查和評估的費用,所以在這產業中有錢人才能夠看醫生。不然就是醫生得扛起所有風險和責任,並吸收許多成本,才能去拓展市場。

或許,要求政府有相應的保險制度不太可能,但更細的分工整合和處方制度,可能是一個可行的思路。


試圖尋求保障雙方的軟體開發模式

客戶和軟體商雙方的拉距戰,就像一個很大的槓桿,一不小心另一邊就飛上了雲端。

我們可以理解,不能完全怪罪於客戶,畢竟所有人都總是希望得到完整的解決方案、降低風險,又盡可能支付最少的錢。小客戶是預算不高要緊扣,大客戶則是怕付了錢,卻達不到目的,或是得到一堆無法使用的 01 文字。

但對於軟體研發人員來說,卻也太過不公平,只能全賠和拼命乞討二選一。

現有的各種手段都無法幫助軟體商突破現況,太多的慣例也惡習累積已久。這也是為什麼,很多以接案起家的新創公司(Startup),到五、六個人之後,開始碰到瓶頸。因為小案子已經養不起公司,中間的案子不好做,再上去就要一股作氣引進人員到數十人才能做。但人數到這麼多時,大案子的獲利也只是勉勉強強。

所以,如何想出方法,雙方保障,是不可放棄的目標。


後記

本文只是先起了個開頭,省視當前情勢。雖然對於實際執行,已經有些初步方案,有空再記錄下來,期望大家共同尋找出一個可行的制度。

by noreply@blogger.com (Fred Chien(錢逢祥)) at January 21, 2012 11:10 AM

January 19, 2012

tsung

Google Calendar 顯示農曆日期

Google Calendar 是我現在主要使用的行事曆, 但是要跟農曆對照總是有些麻煩.(要安排過年假期時, 覺得特別重要.)

之前我有把農曆加進去, 會於最上面日期另外有顏色標示農曆日期, 但是好像新版的 Calendar 就不會是這種呈現法.

然後找了一下 Google 日曆的設定, 原來內建就已經有了.

Google Calendar 顯示農曆日期 設定方式

Google Calendar 顯示農曆日期 設定步驟如下:

  1. 左邊 "我的日曆" 有個"下拉按鈕" 點選 -> 選擇 "設定"
  2. 於最上方Tab, 切到 "一般" Tab.
  3. 於最下方 的 非公曆 選擇 "陰曆 - 繁體中文"
  4. 儲存 即可.
  5. 完成後, 就會於最上方日期旁邊秀出 農曆 了.

相關網頁

by Tsung at January 19, 2012 05:21 PM

jserv

演講:L4 microkernel 的背景知識與最新的研究發展

今年二月 7 日,小弟將分享關於 L4 microkernel 的背景知識與最新的研究發展,詳情請參考 [星系統社群:第5次星系主題-L4 microkernel 的背景知識與最新的研究發展]。 第一次見到 [L4 microkernel],是在 William Stallings 的 [作業系統叢書] 讀到,那時是 1997 年,僅提供七個系統呼叫但可搭建完整作業系統基礎的 microkernel,對當時還在唸高中的我,實在是不小的衝擊。高中住校沒有辦法使用電器設備,遑論使用網際網路,唯一獲取知識的方法,就是利用每天宿舍晚自習結束到關大門前的短暫一個半小時,去附近的書店啃書,William Stallings 的大作闡述作業系統非常透徹,而關於 L4 的部份,更激起我的興趣,但這類的書籍往往售出後,就很少進貨,而我身上根本沒什麼零錢,結果一時鋌而走險,竟然沒購買而擅自攜帶出去。這本書伴隨著我在高中的課餘生涯,也讓「系統程式」與我結下不解之緣。 像這樣去附近的店家「借取」(一開始真的有歸還,但後來就無疾而終) 了好幾本關於作業系統、編譯器設計、Linux / BSD 系統書籍的行徑,是高中生涯很特別的插曲,但「偷書」是事實,估計總價約台幣五千多元。後來接了案子,逐漸有能力償還時,這些店家要不倒閉,不然就是不接受我的賠償,於是愧疚了十多年。這幾年購書,往往會要求不打折,不然就是同一本書一次多買幾份,送給需要的朋友,此外,我持續地作免費的資訊技術分享,就是希望能多作點補償。因為談及 L4 microkernel,也抖出「偷書」的陳年往事,如今探討這個議題,自然是五味雜陳,本議程最早規劃在去年,追憶 L4 發明人 Jochen Liedtke 教授過世十週年,不過當時有事耽擱,只好在今年擇期探討。 L4 在上個世紀末證明,microkernel 的效能落差並非本質的限制,而是設計與實做的議題,也因此,L4 這個高效能的...

by jserv at January 19, 2012 03:36 AM

January 18, 2012

FourDollars

要求 Ubuntu 開發中版本同步 Debian 上面的套件

Ubuntu 是個每半年釋出一個版本的 GNU/Linux 發行套件,因此每次正式版本釋出的同時代表的是下一個版本開發的開始,因此每個 Ubuntu 版本的開發總是依循著同樣的步調跟大同小異的規則。

Ubuntu 開發中版本上面的套件大多是來是 Debian testing/unstable 的自動同步,不過等到 DebianImportFreeze 之後跟 FeatureFreeze 之前,如果還有新版本的套件在 Debian testing/unstable 上面出現時,就要透過 SyncRequestProcess 來要求 Ubuntu 開發中版本同步 Debian 上面的套件,FeatureFreeze 之後就不能再要求同步套件了,只能夠修正程式的錯誤。

以下示範兩種情況。

狀況一:Ubuntu 開發中的套件並沒有包含 Ubuntu 社群的錯誤修正

使用 ubuntu-dev-tools 套件底下的 requestsync 指令
$ requestsync -C -d unstable --lp betaradio precise

然後會看到以下內容:
Summary (one line):
Sync betaradio 1.4-1 (universe) from Debian unstable (main)

Description:
Please sync betaradio 1.4-1 (universe) from Debian unstable (main)

Changelog entries since current precise version 1.3-1:

XXX FIXME: add changelog here XXX

要將最後一行改掉,加上 Debian testing/unstable 套件裡面的訊息,所以就變成了:
Summary (one line):
Sync betaradio 1.4-1 (universe) from Debian unstable (main)

Description:
Please sync betaradio 1.4-1 (universe) from Debian unstable (main)

Changelog entries since current precise version 1.3-1:

betaradio (1.4-1) unstable; urgency=low

* New upstream release.
* debian/patches/00_dont_install_header: Don't install header file into the
system.

-- Shih-Yuan Lee (FourDollars) <fourdollars[at]gmail.com> Sat, 14 Jan 2012 20:58:32 +0800

最後就會產生一個 Launchpad Bug 像是 Bug #918059 in betaradio (Ubuntu): “Sync betaradio 1.4-1 (universe) from Debian unstable (main)” 這樣就做好了,之後就是去注意這個 Bug 的變化,適時的去回應 Ubuntu Developer 提出的問題(如果有的話)。

狀況二:Ubuntu 開發中的套件已經有包含了一些 Ubuntu 社群的錯誤修正

在這種情況底下 Ubuntu 不會自動去同步 Debian testing/unstable 上面的套件,以防有些 Ubuntu 社群所做的錯誤修正遺失。

使用跟上面一樣的指令:
$ requestsync -C -d unstable --lp ibus-chewing precise

然後會看到以下內容:
Summary: Sync ibus-chewing 1.3.10+clean-1 (main) from Debian unstable (main)
Description:
Please sync ibus-chewing 1.3.10+clean-1 (main) from Debian unstable (main)

Explanation of the Ubuntu delta and why it can be dropped:
* debian/patches/IBusChewingEngine-def-fix-SIGSEGV-on-preference-save.patch:
Fix misuse of g_value_get_gtype in g_value_to_g_variant. (LP: #874028)
* debian/patches/escape-to-close-candidate-window-on-plain-
zhuyin.patch: Fix plain zhuyin with space as selection problem.
(https://github.com/definite/ibus-chewing/pull/8/) (LP: #843619)
[這邊有一行我忘了原本寫些什麼了,總之要你改掉寫上你的解釋]

Changelog entries since current precise version 1.3.9.2-3ubuntu2:

XXX FIXME: add changelog here XXX

跟前面一樣加上 Debian testing/unstable 套件裡面的訊息,還有解釋一下為什麼 Ubuntu 社群的錯誤修正都被拿掉了,然後就變成了:
Please sync ibus-chewing 1.3.10+clean-1 (main) from Debian unstable (main)

Explanation of the Ubuntu delta and why it can be dropped:
* debian/patches/IBusChewingEngine-def-fix-SIGSEGV-on-preference-save.patch:
Fix misuse of g_value_get_gtype in g_value_to_g_variant. (LP: #874028)
* debian/patches/escape-to-close-candidate-window-on-plain-
zhuyin.patch: Fix plain zhuyin with space as selection problem.
(https://github.com/definite/ibus-chewing/pull/8/) (LP: #843619)
These patches are already included in ibus-chewing 1.3.10+clean-1.

Changelog entries since current precise version 1.3.9.2-3ubuntu2:

ibus-chewing (1.3.10+clean-1) unstable; urgency=low

* New upstream release.
* All Debian patcheds dropped.
* Add Osamu as uploaders.
* Repackaged upstream tar with normal tar and removing .swo

-- Osamu Aoki <osamu[at]debian.org> Mon, 26 Dec 2011 00:17:58 +0900

最後就會產生一個 Launchpad Bug 像是 Bug #918061 in ibus-chewing (Ubuntu): “Sync ibus-chewing 1.3.10+clean-1 (main) from Debian unstable (main)” ,之後就是去注意這個 Bug 的變化,適時的去回應 Ubuntu Developer 提出的問題(如果有的話)。

by Shih-Yuan Lee (noreply@blogger.com) at January 18, 2012 05:32 PM

tsung

影片 - 爸爸 對 寶貝女兒的審問

YouTube 看到的一個非常爆笑的影片, 話說, 我對此影片的內容也是有深刻的體驗就是了. Orz.

這應該是全世界的爸爸都想要問的問題, 但是都聽不到想要聽的答案. XD

影片網址: [爆笑] 審問! 誰是妳的最愛? 老爹 VS 寶貝女 [完整翻譯]

 

by Tsung at January 18, 2012 05:14 PM

January 17, 2012

tsung

Google Lerry Page 訂立的開會原則 - 2012

Google 換 Larry Page 當新的 CEO 後, Larry Page 改變了 Google 的開會流程, 定義了開會所需要注意的幾點事項.

Google 訂立開會原則 - Larry Page

內容參考整理自下述兩篇:

Google 訂立的開會原則

  1. 每次開會都要有一個明確的決策者,如果沒有決策者,或沒法作出決定,就不應該開會議。(Every meeting must have one clear decision maker. If there's no decision maker -- or no decision to be made -- the meeting shouldn't happen.)
  2. 開會不能超過10個人。(No more than 10 people should attend.)
  3. 每個參與會議者都必須要給出自己的想法、意見,否則不應該參加此次的會議。(Every person should give input, otherwise they shouldn't be there.)
  4. 任何要訂立的決策都不應該因為會議未招開而延後。如果需要開會才能做出某個決定,那麼該會議應該立刻招開。(No decision should ever wait for a meeting. If a meeting absolutely has to happen before a decision should be made, then the meeting should be scheduled immediately.)

相關網頁

by Tsung at January 17, 2012 05:25 PM

January 16, 2012

tsung

計算 MySQL 可能用到的記憶體數量

MySQL 會依照 my.cnf 的設定來決定記憶體的使用量, 是否有公式可以計算 MySQL 在目前設定下, 最高的記憶體使用量會是多少?

註: 此篇計算針對 Innodb.

計算 MySQL 可能用到的記憶體數量

官方說明: How MySQL Uses Memory

查看記憶體使用量 的 公式: (公式取自上述官方網頁)

SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW VARIABLES LIKE 'innodb_additional_mem_pool_size';
SHOW VARIABLES LIKE 'innodb_log_buffer_size';
SHOW VARIABLES LIKE 'thread_stack';
SET @kilo_bytes = 1024;
SET @mega_bytes = @kilo_bytes * 1024;
SET @giga_bytes = @mega_bytes * 1024;
SET @innodb_buffer_pool_size = 2 * @giga_bytes;
SET @innodb_additional_mem_pool_size = 16 * @mega_bytes;
SET @innodb_log_buffer_size = 8 * @mega_bytes;
SET @thread_stack = 192 * @kilo_bytes;
SELECT
( @@key_buffer_size + @@query_cache_size + @@tmp_table_size
+ @innodb_buffer_pool_size + @innodb_additional_mem_pool_size
+ @innodb_log_buffer_size
+ @@max_connections * (
@@read_buffer_size + @@read_rnd_buffer_size + @@sort_buffer_size
+ @@join_buffer_size + @@binlog_cache_size + @thread_stack
) ) / @giga_bytes AS MAX_MEMORY_GB;

結果

+---------------+
| MAX_MEMORY_GB |
+---------------+
|        3.7002 |
+---------------+

如果什麼都不管, 最多會用到 3.7G 的記憶體.

by Tsung at January 16, 2012 05:54 PM

FourDollars

Genie 程式語言

Genie 程式語言是 GNOME 計畫下的一個新的程式語言,跟 Vala 一起開發的,語法類似 Python,跟 Vala 一樣都是借助 GObject 來實現物件導向程式設計,也跟 Vala 一樣都是產生出 C 的程式碼,而且也因為 GObject 的關係可以輕易地產生其它程式語言的 binding。
例如:輸入以下的程式碼儲存成 hello.gs
init
print "Hello World"
然後再執行以下的指令就可以看到結果了。
$ valac hello.gs
$ ./hello
如果說要看到中間轉譯出來的 C 語言程式碼可以輸入以下指令:
$ valac -C hello.gs
於是就可以看到 hello.c 產生出來了。
/* hello.c generated by valac 0.14.0, the Vala compiler
* generated from hello.gs, do not modify */

#include <glib.h>
#include <glib-object.h>
#include <stdlib.h>
#include <string.h>

void _vala_main (gchar** args, int args_length1);

void _vala_main (gchar** args, int args_length1) {
g_print ("Hello World\n");
}

int main (int argc, char ** argv) {
g_type_init ();
_vala_main (argv, argc);
return 0;
}
看看裡面的內容是不是一般所熟悉的 C 語言程式碼。:)
參考資料:Genie - GNOME Live!

by Shih-Yuan Lee (noreply@blogger.com) at January 16, 2012 03:00 PM

AMD Graphics Drivers 非官方 PPA - ppa:fourdollars/fglrx

因為我自己工作上的需要所以偶而會測試 AMD 官方最新 release 出來的 Graphics Drivers
剛剛更新了 ppa:fourdollars/fglrx 給 Ubuntu 10.04/10.10/11.04/11.10 使用
目前使用的是 AMD 在 12/13/2011 釋出的 AMD Catalyst™ 11.11 Proprietary Linux x86 Display Driver
最新的 AMD Graphics Drivers 可以參考 http://support.amd.com/us/gpudownload/linux/Pages/radeon_linux.aspx
有 AMD Graphics Drivers 使用問題的網友可以試試看,另外要特別聲明這只是使用 AMD 官方釋出的套件產生出來的,因此有問題找我也解決不了。:P

by Shih-Yuan Lee (noreply@blogger.com) at January 16, 2012 01:00 PM

January 15, 2012

tsung

好站: 訊息送出自動移除的網站工具

有些訊息丟出去後, 希望可以立刻移除, 有個網站出了這種工具.

註: 使用上還是請自行小心, 不確定他的是否會有 Log 或者其它紀錄存在 Server 上.

訊息丟完後會自動刪除的網站工具

詳見: Privnote - Send notes that will self-destruct after being read

  1. Privnote 的 "Write your note below" - Textarea 寫內容 (不用任何註冊等動作)
  2. 取得一個連結, 將此連結存好 或 送給要看的人即可.
  3. 此連結若被存取一次, 將會立刻將此筆訊息消除. (此連結就自動失效了)
  4. 所以若發送出去, 下次此連結網址資料消失了, 代表已經被看過了. :)

by Tsung at January 15, 2012 05:40 PM

January 13, 2012

FourDollars

betaradio v1.4 released

BetaRadio 是一款使用 Vala 程式語言寫出來的網路收音機程式,專門用來收聽台灣的網路電台。

專案網址:
http://code.google.com/p/betaradio/

新功能:
1. 改善 Unity 整合性
2. 使用多執行緒改善回應速度

錯誤修正:
1. 修正右鍵點擊無法使用的問題

原始碼下載:
http://code.google.com/p/betaradio/downloads/detail?name=betaradio-1.4.tar.bz2

by Shih-Yuan Lee (noreply@blogger.com) at January 13, 2012 05:59 PM

January 12, 2012

tsung

貝貝練習自己上廁所 (1歲10個月 起)

貝貝從 1歲10個月 開始練習上廁所, 只是目前在家只有成功2次, 剩下都是在學校練習的. (冬天冷就先繼續包尿布比較多)

在學校上廁所的照片, 學校有小朋友專用的馬桶.
1Y10M 學上廁所

在家學上廁所準備物品

我們幫她買得黃色小鴨馬桶座
IMG_1708

在家使用情況
IMG_1750

學上廁所之歌 - 我會上廁所

我會上廁所

上廁所 有規矩
褲子只要脫一半
男生座墊輕輕掀
女生座墊輕輕放
對準馬桶才能尿
變變老師幫忙擦
沖水洗手別忘記
養成衛生好習慣
衣褲穿整齊
整潔有禮貌

相關文章

by Tsung at January 12, 2012 05:27 PM

Tetralet

HIME 0.9.9 釋出!

經過 1 個月的歡樂開發後,HIME 開發團隊決定釋出 HIME 1.0 的先行測試版,HIME 0.9.9。

下載:

您可以到 https://github.com/caleb-/hime/downloads 下載到 HIME 0.9.9 的官方釋出版。備份站:http://hime.luna.com.tw/ 。

各 Linux Distribution 則請參考: https://github.com/caleb-/hime/wiki/prebuilds-and-auto-build-scripts-of-distros

當然,您隨時可以到 https://github.com/caleb-/hime/ 下載並測試最新的開發版

而以下為較重要的修正列表。但由於 HIME 的開發進度實在是飛快,以下列表或有不足之處,若您發現有什麼缺漏之處請不吝知會我們!

功能改進:

  • 支援 Ubuntu 的 libappindicator (Ubuntu Unity Tray) (Tommy Tsim)
  • 可讓 rxvt-unicode 不需透過 XIM 即能使用 HIME (kanru)
  • 改進 chewing 的輸入處理及 64 bit 相容性。 (Cheng-Wei Lin)
  • 改進 GTK+ 3.x 相容性。(Tommy Tsim)
  • 改進注音及詞音之資料庫 (Vdragon、Franklin Weng、petercommand、maxwux)
  • 改進 gtab2cin 的相容性 (Solomonhuang)
  • 改進 System Tray 的動作及相關設定 (Tommy Tsim)
  • 補充一些缺漏的 manpage (Yao Wei)
  • scripts/hime-env:可讓使用者方便檢查並回報執行環境報告。(caleb)
  • distro/dev-tools/scripts/test-hime:可不需將 HIME 安裝至系統就能執行測試 HIME。(caleb)
  • distro/dev-tools/qt3-test distro/dev-tools/qt4-test:QT3/4 小測試程式 (caleb)
  • distro/dev-tools/icons/hime-create-icons.sh:方便製作 icon theme 的小工具程式 (Tetralet)
  • 新的 4 組 Icon Themes: pink、blue、black、dark (Tetralet)
  • 一些取自 GCIN 2.7.0 之新功能及問題修復。感謝 Edward Der-Hua Liu!

bug 修復:

  • 能正確得顯示 [英]、[全] 狀態。 (Tetralet)
  • 修正切換輸入法時,緩衝區更新問題。 (Cheng-Wei Lin)
  • 在切換輸入法時發生的 double free 問題。 (Cheng-Wei Lin)
  • 清除一些和輸入法無關之拆碼 (Tetralet)。
  • [chewing]:修正 utf-8 文字顯示流程 (Cheng-Wei Lin)
  • [chewing]:修正遊標問題 (Cheng-Wei Lin)
  • [chewing]:修正 chewing_set_selKey 參數 (Cheng-Wei Lin)

編譯相關:

  • 更親和美觀易用的編譯系統,應該可以不加任何修正及編譯參數,就能在各大 Linux Dist 下順利編譯 HIME。並能支援 CFLAGS 環境變數!
    非常感謝 letoh 的辛勞成果! (letoh、b4283、petercommand)
  • 預設上不編譯 QT3 im-modules,因為要 QT3 im-modules 能動作需在 QT3 上套用一個非官方的修正程式,請確認您的系統有套用此修正程式再自行在 HIME 上啟用這個選項。
  • 解決平行編譯問題 (b4283)
  • 相容於 clang (letoh)
  • 修正在 Ubuntu 11.10 32 bit 下的編譯問題 (letoh)
  • 加強 module 的 callback 模式 (letoh)
  • 清除編譯警告 (letoh、Tetralet、caleb、taylorchu)

原始碼整理:

  • 將所有的程式碼都搬到 src/ 目錄下 (letoh)
  • 將所有的 C 程式還原為 *.c (原為 *.cpp)

釐清著作權/授權爭議:

眾所皆知的,HIME 是 fork 自 GCIN 的一個專案。GCIN 原始碼目錄的 AUTHOR 及 COPYING 兩個檔案應該能十分清楚明白得表明了 GCIN 之著作權主要為 Edward Liu 所有;而授權則為原汁原味一字不改的 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1 (or later)。一般軟體只要如此聲明,有關著作權/授權資訊也算足夠了。

但當我們仔細去翻查 GCIN 的所有程式及檔案,雖然大多數的程式碼之著作權為 Edward Liu 所有、並以 GPLv2.1+ 授權自無疑慮,我們還可以發現 GCIN 裡也包含了一些其它人的作品及不同授權。如:(以下非完整列表)

  • QT3/4 im modules 授權為 GPL2;
  • IMdkits 著作權為 XIM/IIIMF 作者樋浦秀樹所有(已於 2010 年去世),授權為 BSD 三條款;
  • EggtrayIcon 著作權為 Anders Carlsson 所有,授權為 LGPL2.1 (or later);
  • Chewing IM Modules 著作權為 Cheng-Wei Lin 所有,授權為 LGPL2.1 (or later);
  • 內含的 Icon Themes 的授權似乎並不是很明確。
  • 而其它像倉三、倉五的碼表則為 Public Domain,大易三碼碼表的授權則為『可再發佈但不能修改』之類的。

而 HIME 則是一個集體開發的專案,因此我們必須事先釐清著作權/授權資訊以避免日後爭議:

  • 在所有的程式上補上缺漏的著作權 Edward Liu 及授權 LGPL2.1 (or later) 聲明資訊 (已於 0.9 版完成)
  • 非常感謝行列輸入法的發明者廖明德先生慷慨釋出一個較寬鬆的授權! (感謝 Yao Wei 費心聯絡)
  • 啟用全新的美觀 Icon Theme。

Debian/Ubuntu deb (Luna's Debian Archiver) 相關:

  • 分離出一個 hime-icon-themes 套件,內為 pink、black、dark 這三組 icon theme。
    HIME 內定使用 blue 這組 icon theme;您可以使用以下指令來指定使用其它的 icon theme,以 pink 為例:
    cd ~/.config/hime
    ln -s /usr/share/pixmaps/hime/pink icons

  • 新增套件:hime-dbg,內含 debug 資訊,可便於使用 gdb 來替 hime 除錯。請參考:Linux 除錯利器 - GDB 簡介
  • Ubuntu: 新增按鈕【hime-setup】→【外觀設定】→【試著相容於 Ubuntu Unity (需重啟 Unity)】,讓 HIME 的 icon 能顯示於 Ubuntu Unity 上。

懇請協助:

HIME v0.9.9 的全/半型行為尚有討論空間,請協助 HIME 開發團隊整理出適合大多數人使用的預設全/半型行為,請您到 https://github.com/caleb-/hime/issues/47 發表您的看法!

意見回饋/問題回報:

請您不吝向我們回報您所遇到的問題或是功能需求(使用中文也行),我們將會在最短時間內設法解決:

https://github.com/caleb-/hime/issues (錯誤追蹤系統,需註冊)

http://hime.luna.com.tw/forum (專屬討論區,可匿名)

IRC: #hime@freenode.net (IRC 頻道,雖無 Logger 但請記得保持您的禮貌和風度並尊重頻道裡的所有人。)

by tetralet at January 12, 2012 03:47 PM

January 11, 2012

tsung

Freemind 於 Ubuntu 11.10 中文無法輸入問題解法

Freemind 於 Ubuntu Linux 11.10 中文無法輸入, 原因有兩個:

  • iBus 設定
  • Freemind 預設快速鍵衝突

依照下述步驟可以將此兩點解決.

Freemind 中文無法輸入 解法

iBus 設定

  1. Unity 的 Window鍵, 輸入 "ibus" 會搜尋出相關的程式, 找到 "Keyboard Input Methods", 或於右上角 鍵盤圖示 滑鼠右鍵, 選 "偏好設定".
  2. 註: Keyboard Input Mehtods = iBus 偏好設定
  3. 點選 "進階" Tab
  4. 全域輸入法設定值 => "在所有的應用程式中共享同一輸入法" 打勾.

Freemind 預設快速鍵衝突

  1. 工具 -> 個人化設定 -> 快速鍵設定
  2. 節點編輯命令 內的 "將子節點摺疊" Control Space => 點選 Clear 清除即可.
  3. 重新啟動 Freemind 即可輸入中文囉~ :)

by Tsung at January 11, 2012 05:47 PM

fred

NodeJS + Express + i18next 支援多國語系吧!

除非是區域性的網站服務,不然在這個網路通全世界的時代,開發網站服務就一定有多國語系的需求。一般來說,i18n 的支援都是由 Web Framework 所提供,但 Express 並沒有支援,所以我們要借助 i18next 這個模組。i18next 可以和 Express 以及 template 很完美的結合,最重要的是,有客戶端支援(clientside support),若搭配 jquery,我們也可以使前端的 JavaScript 支援多國語系。

先使用 NPM 安裝 i18next:
npm install i18next

在 express 的應用程式(app.js)中引入使用 i18next:
var express = require('express');
var i18n = require('i18next');

var app = module.exports = express.createServer();

/* Initializing i18n */
i18n.init();
i18n.registerAppHelper(app);


app.configure(function(){
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.bodyParser());
app.use(i18n.handle);
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(__dirname + '/public'));
});

app.get('/', function(req, res) {
res.render('index');
});

app.listen(3000);

接著要在應用程式的目錄下,建立預設的翻譯檔和存放路徑(locales/dev/translation.json):
{
"example": {
"string1": "Hello World!"
}
}

如果要支援繁體中文(zh-TW),直接建立相應的翻譯檔(locales/zh-TW/translation.json):
{
"example": {
"string1": "哈囉 世界!"
}
}

然後就可以在 template 中使用之前所定義的字串(views/index.jade):
span= t('example.string1')

完成之後,i18next 會自動依照用戶瀏覽器的語系設定,回應相對應的頁面。


後記

文章一開頭有提到,i18next 可以配合 jquery 使用,有興趣的人可以直接參考『官方說明』。

by noreply@blogger.com (Fred Chien(錢逢祥)) at January 11, 2012 05:17 AM

Cornelius

[PHP] GenPHP 釋出 - 程式碼產生器

GenPHP 是筆者參考 Perl 的 Module::Setup 以及 Ruby newgem 等專案,並予以改進所設計的 PHP Code Generator,此產生器不一定要產生 PHP 程式碼,透過 Twig 樣板引擎以及內建的 Operation ,可以產生任何專案需要的檔案,如專案程式碼、專案內的 Controller, Model, Action、一整個資料夾結構或任何設定檔、文字檔等等,且可建置複雜的檔案建置。

只要定義好 Flavor ,就可以依據各種 Flavor 產生你所需要的檔案,每個 Flavor 也可以設定相依性,互相取得資料。舉例來說, project Flavor 可以相依 phpunit flavor , ANT flavor 等 flavor 。

除此之外,你可以將各種 Flavor 分開放置,可以設定為全域的 Flavor ,或是某專案內才使用的 Flavor,你也可透過路徑將 Flavor 安裝至你的 Home Flavor 資料夾內。

GenPHP 也可以用來產生 Asset ,你可以將你常用的 Asset 放於 Flavor 內的 Resource 路徑,有需要便可即時產生出來。

這是第一個版本的釋出,接下來的版本將會支援個人化的設定檔,可設定偏好 copyright string, author email, author name 使用之 license 等。

專案網址:
https://github.com/c9s/GenPHP

by Yo-An Lin (noreply@blogger.com) at January 11, 2012 01:38 AM

January 10, 2012

tsung

Linux 使用 mkdir 快速建立一區間的目錄

Linux 使用 cp, mv, ls 等等, 都很習慣的會用 "[]", ex: ls 2011-0[1-9]*.

但是在 mkdir 也想用 "[]", 於是 mkdir 2011-0[1-9], 就會有一個 "2011-0[1-9]" 目錄出現. (我想要出現 1 ~ 9 的資料夾)

應急的狀況, 就是先隨手寫一個建立資料夾的程式解決.

<?php
for ($i = 1; $i <= 30; $i++) {
    $a = sprintf('%02s', $i);
    system('mkdir 2011-11-' . $a . '_貝貝');
}
?>

註: 當家裡有小孩後, 要幫他保存照片且遇到要建立目錄這件事情, 當累積到一個月甚至一年時, 就不會想手動做了. XD

mkdir 區間參數使用

於 mkdir 2011-0[0-9] 要如何達成類似效果 (建立 0~9 的目錄, 而不是建立 2011-0[0-9] 的目錄), 範例如下:

  • mkdir {1..4} # 會建立 1~4 的目錄
  • mkdir 2011-{01..04} # 會建立 2011-01, 2011-02, 2011-03, 2011-04 的目錄.

by Tsung at January 10, 2012 05:46 PM

January 09, 2012

tsung

貝貝農曆生日滿2歲達成

貝貝依照農曆生日計算, 於 2012年1月7日滿 2歲囉~ 於是幫她舉辦個簡單的生日會~

IMG_2444

貝貝 0~2 歲的成長紀錄影片

好同學一起吹蠟燭
IMG_2436

切蛋糕就是要豪邁
IMG_2439

背景
IMG_2358

IMG_2459

IMG_2461

看到堆積如山的草莓
IMG_2406

IMG_2400

IMG_2403

IMG_2362

IMG_2381

剛好今天又是尾牙, 所以早上買了 刈包(割包) 讓她吃, 豐富的一天~
IMG_2395

2歲生日快樂~ 謝謝大家~

by Tsung at January 09, 2012 05:01 PM

January 08, 2012

tsung

ThinkPad X220i 安裝 Ubuntu 的硬體相關設定(指紋辨識、Webcam.. 等)

IBM ThinkPad X220i 要安裝 Ubuntu Linux, 硬體支援度(規格同: Ubuntu on Lenovo Thinkpad X220i Tablet)都很完整, 所以沒有什麼麻煩.

Lenovo Thinkpad X220i 硬體規格內容

$ lspci

00:00.0 Host bridge: Intel Corporation 2nd Generation Core Processor Family DRAM Controller (rev 09)
00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09)
00:16.0 Communication controller: Intel Corporation 6 Series/C200 Series Chipset Family MEI Controller #1 (rev 04)
00:19.0 Ethernet controller: Intel Corporation 82579LM Gigabit Network Connection (rev 04)
00:1a.0 USB Controller: Intel Corporation 6 Series/C200 Series Chipset Family USB Enhanced Host Controller #2 (rev 04)
00:1b.0 Audio device: Intel Corporation 6 Series/C200 Series Chipset Family High Definition Audio Controller (rev 04)
00:1c.0 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 1 (rev b4)
00:1c.1 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 2 (rev b4)
00:1c.3 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 4 (rev b4)
00:1c.4 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 5 (rev b4)
00:1d.0 USB Controller: Intel Corporation 6 Series/C200 Series Chipset Family USB Enhanced Host Controller #1 (rev 04)
00:1f.0 ISA bridge: Intel Corporation QM67 Express Chipset Family LPC Controller (rev 04)
00:1f.2 SATA controller: Intel Corporation 6 Series/C200 Series Chipset Family 6 port SATA AHCI Controller (rev 04)
00:1f.3 SMBus: Intel Corporation 6 Series/C200 Series Chipset Family SMBus Controller (rev 04)
03:00.0 Network controller: Intel Corporation Centrino Wireless-N 1000
0d:00.0 System peripheral: Ricoh Co Ltd Device e823 (rev 07)

Lenovo Thinkpad X220i 相關軟、硬體設定 與 測試

Ubuntu Linux 安裝完成後, 再來就是測測看 Webcam、指紋辨識等功能, 然後再來安裝相關軟體來保護與啟用快速鍵等功能.

註: 網路、無線網路 安裝完就都正常使用了.

Webcam 測試

  1. apt-get install cheese
  2. 執行 cheese 就可以看到 Webcam, 可以拍照和錄影測試看看.

指紋辨識

  1. 可參考此篇: Ubuntu 指紋辨識 fingerprint 驅動
  2. 官方網站: Fingerprint GUI
  3. lsusb # 查看是否有支援 fingerprint, 不支援就先想辦法解決再進行下述步驟
  4. sudo add-apt-repository ppa:fingerprint/fingerprint-gui # 增加 fingerprint ppa
  5. sudo apt-get update
  6. sudo apt-get install libbsapi fingerprint-gui policykit-1-fingerprint-gui # 安装fingerprint-gui.
  7. 執行 fingerprint-gui
  8. 選取 Scan / Verify 一直刷就完成囉~
  9. 再來於開機、暫停後, 都可以同時用密碼或指紋登入了. :)

註: thinkfinger-tools, libpam-thinkfinger, AES2501 (可見下述連結) 等測試都沒用, 直接用 fingerprint 簡單又容易.

保護硬碟

詳細可見: HDAPS - IBM Active Protection System Linux Driver

  1. apt-get install hdapsd # HDAPS daemon
  2. vim /etc/default/hdapsd # 若有需要特別設定的話, 可於此設定.

讓 ThinkPad 的內建快速鍵生效可安裝 tpb

  1. apt-get install tpb

ThinkFan 可以設定控制風扇轉速

  1. sudo apt-get install thinkfan sysfsutils

相關網頁可見:

顯示硬碟和 CPU 的溫度 - sensors-applet

  1. sudo aptitude install sensors-applet

多點觸控

想要有類似 MacOSX 的雙手指上下拉網頁等等功能, 可見下述兩篇:

若想要有類似 MacOSX 的多點觸控手勢功能(更進階模擬), 可以使用 Touchegg.

詳見此篇: Touchegg : 讓 Linux 也支援多點觸控手勢 (x200i 沒有額外裝備請跳過下述內容)

註: 必須擁有一塊 Apple Magic Trackpad 之類的多點觸摸設備, ex: Apple Magic Trackpad , Asus eeepc 1000h (內置 Elantech Trackpad) , MacBook Pro 7.1 及其它
Macbook , MacBook Air

多點觸控相關網頁

Ubuntu Linux 快速休眠 等 Shell 指令

下述摘錄自此篇: Ubuntu密技 - 睡眠、休眠、關機、重新開機

鍵入如下命令可進入睡眠:(低耗電模式,只要按下任意鍵,電腦即甦醒。)

$ sudo /etc/acpi/sleepbtn.sh

鍵入如下命令可進入休眠:(最低耗電模式,關閉硬碟機)

$ sudo /etc/acpi/hibernate.sh

IBM ThinkPad 內建快速鍵

  • Fn + F8 關閉觸控版 (避免不小心都按到觸控版)
  • Fn + F5 關閉 Ap、藍牙
  • Fn + F4 進入省電, 鍵盤一按即開啟
    同 $ sudo /etc/acpi/sleepbtn.sh
  • Fn + F12 進入省電, 鍵盤一按即開啟
    同 $ sudo /etc/acpi/hibernate.sh

by Tsung at January 08, 2012 05:48 PM

Cornelius

[PHP] Onion For PEAR: 發佈 Onion 0.0.10 bundle 功能


我們目前釋出了 Onion 0.0.10-alpha 的版本,這個版本包含了 bundle 的功能,可以將 PEAR 的相依套件安裝至目前目錄的 vendor 目錄底下,且不需要相依 PEAR Installer 或是 Pyrus。

你可以在 package.ini 內定義好 PEAR 套件的所有相依性,然後執行 onion.phar -d bundle 的命令,Onion 會將所有套件安裝至本地目錄下,且不需要 Root 權限就可以做到。

目前,Onion 是利用 bundle 指令,將 Onion 自己的相依套件全部安裝至 vendor/pear ,然後使用 Onion 自己的 compile 命令,將本身程式碼、相依程式碼、自動類別載入器打包成 phar 的執行檔。

你也可以使用 Onion 來編譯你自己的 phar 函式庫或是執行檔。你可以參考原始碼內的 scripts/compile.sh 命令。

因為 Pyrus 沒有把 Package.xml 剖析器類別、PEAR 頻道探索器等文件寫好,也因為他不是獨立的元件,所以我為 Onion 寫了一個內建的 PEAR 頻道探索器 (PEAR Channel) 以及簡單的 package.xml 剖析器,來處理 PEAR 套件的安裝程序。 這些東西運作的相當快,不過 Channel 的資訊還未被快取起來,只要快取的部份處理好後,速度會比現在更快。

我已經測試了一些 Symfony, PHPUnit, PHPSpec, PEAR 套件,大多數都運作的挺順利,但是可能還有一些 Bug ,如果你遇到了,請發送一個 Issue 給我,Onion 專案是建置在 GitHub 上頭。

Patches, Feature requests are welcomed.


Here is the screenshot:




Related Tweets:

https://twitter.com/#!/yuya_takeyama/status/150642017003778050
https://twitter.com/#!/yuya_takeyama/status/150627664917577728
https://twitter.com/#!/yuya_takeyama/status/150619889244180481

by Yo-An Lin (noreply@blogger.com) at January 08, 2012 02:37 PM

[PHP] 如何使用 Onion 建置 PEAR 套件

以往要建置 PEAR 套件,得先研究 package.xml 的規格,然後使用一個超過 200 多行的樣板一行一行修改,若是檔案一多,更是麻煩。
因此 Onion https://github.com/c9s/Onion 是為了解決 PEAR 套件建置所提供的方案。
首先請確認你的程式碼目錄結構
  • src/ 類別目錄
  • doc/ 文件目錄
  • tests/ 單元測試目錄
你的類別名稱與名稱空間需要遵守 PSR-0 的規範,例如以下的類別:
<?php
namespace Foo;
class Bar {
}
應該被放置在 src/Foo/Bar.php 檔案中。
測試相關的檔案可放置於 tests/,一般來說都是使用 PHPUnit 作為測試框架,你也可以使用 PHPUnit_TestMore 來幫助你簡化測試程式碼。
接著即可建立 package.ini 來建置 PEAR 套件。
於套件目錄下,編輯 package.ini 檔案
[package]
name = PacakgeName
version = 0.0.1
desc = description here
summary = summary here
author = Author Name <your_email@email.com>
如果你的套件相依其他 PEAR 模組,可接著定義:
[require]
pear.twig-project.org/Twig = 1.0.1
格式為:
{PEAR Channel Host}/{Package Name} = {Version Expression}
接著,將 Onion.phar 抓取下來裝置於你的系統中:
$ wget https://github.com/c9s/Onion/raw/master/onion.phar
$ chmod +x onion.phar
$ ./onion.phar -d build
即可建置 PEAR 套件檔案。 PackageName-0.0.1.tgz 就會被產生出來。
你也可以透過 PEAR Installer 直接安裝該套件:
$ sudo pear install -f package.xml
若你希望將相依性安裝至該套件目錄,且不需要 root 權限,你可以執行:
$ ./onion.phar -d bundle 
相依套件就會被安裝至 vendor/pear 內。
Onion on GitHub: https://github.com/c9s/Onion

by Yo-An Lin (noreply@blogger.com) at January 08, 2012 02:36 PM

January 06, 2012

fred

【企業顧問咨詢】為您的產品選擇作業系統解決方案

你將為自家的產品,選用什麼樣的作業系統?我想,這年頭,不外乎是 Android。但是,可能不是最佳選擇。

我想大多數人都會同意,由於智慧型行動裝置的掘起,Google Android 在業界大放異彩,使用 Linux 作業系統核心的 Android,實現了許多華麗的UI,也讓眾多廠商取得入門門票,有機會與 Apple iOS 一爭長短。許多人都相信,未來是 Android 的天下,除了手機要用 Android,電視要 Android,救人一命的醫療器材也要用 Android,所謂的 Android anywhere 是終極目標。

不過,經過這幾年下來,許多人發現這不過是我們資訊科技業一廂情願,有太多的領域是難以使用 Android,如工控市場等,無論是以穩定、價格、移植維護成本考量的因素,都可能是無法使用 Android 的重點。因此,如今要選擇作業系統解決方案,又變成一個需要思考的難題。

筆者擔任顧問時,每當面對客戶躊著於這個問題時,我總問他們幾個大問題:
  1. 你們的產品用途是否單一且單純?是否要有讓使用者自行上網安裝其他第三方軟體的擴充性?
  2. 你們的產品是否為消費行電子產品?是否需要高可用行和高穩定性?
  3. 你們的軟體需要有華麗特效的 UI 嗎?你們現在擁有的人員有哪些開發 UI 程式的經驗?
  4. 有網路的需求嗎?如果有,需要哪些需求?Ethernet、Wifi、3G?
  5. 計劃中的產品硬體規格?
  6. 有多少規模的人可以參與開發?

很明顯的,對於手機和行動裝置業者是這樣的答案:(他們都會選用 Android)
  1. 用途不單一,需要讓使用者任意自行上網安裝軟體。
  2. 是功能複雜的消費性電子產品,所以客戶多多少少能接受偶爾當機
  3. UI 需要有華麗的特效。開發人員都熟悉並使用 Java 的經驗。
  4. 有所有網路的需求。
  5. 擁有一定等級以上或是當前最頂級的 ARM 處理器。
  6. 最少數十個,多半是上百人甚至上千人的研發人員。


如果你是『非手機』和『非行動裝置』業者,你的產品可能不完全具備這些條件。建議您,一旦有任何一點不具備,請慎重考慮是否使用 Android 還是有機會選擇其他的解決方案。

而當前的解決方案主要常見有三種:
Android
Linux + Qt Framework
Linux + Own Application

限於篇幅,太細節的評估無法一一列舉,也要視實際狀況而定,但這邊有個簡易的初步評估方法可以提供參考:
檢視產品的用途是否單純

如果你的產品用途不單純,應用不單一且不易規範使用範疇,Android 會是你首要的選擇。

此外,假設你們的產品用途非常單純,又或者是功能並不複雜,建議您可以採用非 Android 的解決方案。理由如下:
  1. Android本身有許多公認的問題,運氣好沒事,運氣不好這些問題都需要自行解決,由於可能出問題的範圍相當廣,要確保有足夠資源處理這些問題。

  2. Android有太多版本且隨時可能會有更新和問題修正,再加上上述問題,開發過程中不可能不追加資源去跟進或監視 Android 當前的狀態。

  3. 如果從產品開發開始到開發結束,都需要人力資源去維護和跟隨,這無疑是一種人力上的消耗。

  4. 到此為止還沒提到正題,產品本身應用的開發,在處理好以上問題之後,才開始準備進入正軌。


很多人常說,使用 Android 開發產品的時程是 Debug 的時間比寫軟體的時間多,有時甚至多達 10:1 都不為過。對於行動裝置廠商來說,整個系統就是產品的整體,花大量資源去維護可以說是理所當然的,但是對非行動裝置廠商來說,這就是額外的開銷甚至是條不歸路,除非您也想找筆者救火(但是筆者當救火員的日子可能不多了,笑)。

後記

如果您也正在煩腦選擇作業系統的問題,希望這本文能幫上忙。

by noreply@blogger.com (Fred Chien(錢逢祥)) at January 06, 2012 08:18 PM

tsung

貝貝1歲11個月達成

這個月開始學習上廁所囉~ :)

11/29 剛開始去尿尿 尿不出來 老尿在尿布裡,去了第三次終於尿尿在小馬桶上,之後睡前在去上廁所尿尿,都可以尿出來。老師教她要拿衛生紙擦一擦,自己會擦,丟到垃圾桶,也會自己洗手哦!

貝貝 1歲11個月達成 事項紀錄

  • 身高 82 公分, 體重 11公斤, 頭圍 46 公分
  • 尿布: L
  • 母奶: 睡前可以不用喝ㄋㄟㄋㄟ

飲食記錄

  • 早上會賴床 只要跟貝貝說 有麵包 或 蛋糕 她會很快清醒 說包包嗎?
  • 好愛吃草莓 餅乾
  • 吃飯 喜歡先挑料起來吃 像豆腐、蛋、紅蘿葡 最近外婆寄了一些菜 都超愛吃 會跟媽媽要 高麗菜 連芥藍菜的梗都會吃哦!
  • 睡覺時間愈來愈晚 常常到11點多還不想睡 還跟媽媽說 看書 玩玩具
  • 睡前不用喝ㄋㄟㄋㄟ ((耶!! 撒花瓣))

碎碎唸篇

  • 這個月最愛唱「哥哥爸爸」 「生日快樂」
  • 這個月最愛玩的遊戲是躲貓貓 而且會躲在棉被下偷笑 如果把棉被拿走會生氣 若蓋好 會一直拉棉被調整
  • 看到書上有蛋糕 就會一直唱「 祝你生日快樂」 還會唱英文版「Happy birthday to you」
  • 回答反應很好 看到大人在吃東西 她也想吃 就回她說 你要吃什麼東西 講對了才有 她就會回 「這是什麼東西阿!」
  • 會數「1~30」
  • 電話嚮了 還會猜說 「阿嬤 打來的」
  • 坐車時 經過pizzahat 貝貝會說「pizza」 經過水餃店 她會說 「水餃」
  • 睡前 都有人會賣燒肉粽 她會說「燒肉粽 來囉」 若沒來 就會說 「燒肉粽沒有來」
  • 早上睡醒 會突然問媽媽 「阿姨咧?」「雅雅咧?」「Nana咧?」 該不會夢到阿姨們~~
  • 聽到較怪的聲音 會說「怕怕」
  • 會說「聖誕樹」 「聖誕老公公」

閱讀方面

  • 問貝貝要不要看書 她會自己去拿書 問她書中的東西在哪? 大都能正確指出? 看完書 會自己拿回去放
  • 還指定媽媽念某本書 像 小雞黃黃
  • 念書給貝貝聽 她不董的東西 會重覆好幾次問媽媽 「這個是什麼?」

生活自理

  • 好愛幫忙掃地 還堅一手拿掃把 一手拿畚箕
  • 會自己拿筷子 一手拿湯匙 吃麵
  • 開始學坐馬桶上廁所 但是還不會說要上廁所 通常是尿了 才說尿尿了

學校記錄

  • 11/30 今日吃完飯有便便一點在褲型尿巾,老師趕緊帶貝貝去坐小馬桶,有便便在小馬桶哦!現在還不會表達,但老師會一直提醒小朋肴要尿尿哦
  • 12/1 貝貝個子較小,所以尿尿都會跟老師說,幫忙哦
    下午有吃蛋糕,吃的津津有味 喜歡吃哦
  • 12/2 現在貝貝也會當小管家,請小朋友坐好,也會學老師說話:大家請坐好,手擺後面哦!
  • 12/5 貝貝很喜歡幫忙做事 貝貝說「要幫忙擦桌子」,貝貝很認真把桌子擦乾淨哦
  • 12/6 貝貝現在上完廁所,可以自己下來,本來要老師協助,現在可以上完廁所自己沖水,拿衛生紙擦一擦尿尿的地方,真棒!一天一天有進步,貝貝先用完褲型尿布,再用學習褲哦!
  • 12/7 大家一直唱謝飯歌 小手放後面 乖乖坐好哦!
  • 12/8 今天有被蚊子咬傷,老師已經擦藥唷!睡覺前,都會唱數11~20,唸的很完整哦!在校是非常乖的寶寶,真可愛,很聽老師的話唷!
  • 12/9 下週請帶厚的棉被哦! 天氣冷所以請帶背心,起床時穿,才不會冷哦!
    老師教唱的兒歌「上學歌、兩隻老師、小星星等很多兒歌,貝貝都會唱,很棒」
  • 12/12 貝貝看字卡很專心,老師先刷一次,貝貝都會一起念出來,會用三擇一的方式指出4-5張的字卡哦!
  • 12/13 貝貝比較累了 吃飯時會發呆,老師說「貝貝趕快吃,就可以睡覺了」,老師鋪好被,很快入睡哦!
    在閱讀書本時,貝貝會大聲一起唸「貝貝長大了,會用杯子喝水哦!很棒
  • 12/14 天氣又要轉涼了,請每天都穿上背心哦!
    目前如廁一天一天的進步,只不過貝貝個子小,需要老師抱上小馬桶,都有尿尿在小馬桶,偶而會尿濕小褲褲 但沒有關係 有進步了

貝貝1Y11M生日蛋糕~是媽媽親手做的哦! 貝貝好愛 有她最愛的草莓
IMG_2128

吃飯篇

乖乖吃飯

IMG_2107

好愛吃餅乾

IMG_2099

自己學大人戴手套 偷吃雞腿

IMG_1834

被爸媽發現 害爸媽笑到肚子痛

IMG_1819

IMG_1829

IMG_1828

只剩骨頭 還吃的津津有味

IMG_1826

鐵獅子頭耶

IMG_1638

搶爸爸的鐵獅子頭

IMG_1646

豪邁的喝湯樣

IMG_1769

專心吃飯飯

IMG_1768

吃的臉鼓鼓的

IMG_1471

IMG_1069

IMG_1083

舌頭好長哦

IMG_1079

吃到好吃的地瓜 開心地表演特技

IMG_1763

爸比說 吃餅乾前要先笑咪咪

IMG_2098

愛喝水 一定要先乾杯才行

IMG_1494

自己用叉子吃水果

IMG_1485

自己拿筷子吃麵

IMG_1271

IMG_1270

學習筷

特地幫貝貝買一個可愛小鴨的學習筷

結果不會拿 還是用手比較快

IMG_1686

IMG_1674

幾次後 有進步 可以吃到飯囉

IMG_1682

麵包篇

看麵包跳舞

IMG_1374

IMG_1092

學媽咪拿捍麵棍

IMG_1375

拿媽咪的量匙

IMG_1135

媽咪做的好吃麵包

IMG_1722

麵包看起來好好吃

IMG_1170

有麵包吃 好開心

IMG_1176

麵包真好吃

IMG_1446

愛玩篇

喜歡坐在角落

IMG_1600

IMG_1596

還要硬塞在小盒子裡

IMG_1511

連椅子 也可以玩

IMG_1410

喜歡把魚裝到杯子裡 然後數一數

IMG_1581

IMG_1576

騎腳踏車

IMG_1475

我將來要參加選美 現在就要從小培養

IMG_1424

IMG_1418

之前彌月收到的禮物 現在剛剛好

IMG_2101

聖誕節特輯

(一) 聖誕樹

來佈置聖誕樹囉 我也愛湊一腳

IMG_1587

IMG_1594

與貝貝第一顆聖誕樹 一起親手佈置的

IMG_1657

和阿姨一起合照

IMG_1658

(二) 聖誕造型

聖誕造型配備 猜猜看我要 扮什麼?

IMG_1793

我的聖誕造型 愛吃紅蘿蔔的兔子

IMG_1795

哇 媽媽知道我最愛吃蔔蔔 親手縫了一個紅蘿蔔給我

IMG_1794

與小田老師一起合影

IMG_1807

IMG_1806

耶! 收到聖誕老公公送的禮物囉 哇! 是小兔子的書書耶!

IMG_1804

(三) 聖誕大餐

跟叔叔阿姨 一起吃聖誕大餐

IMG_1887

一起乾杯吧!

IMG_1894

(四) 聖誕蛋糕

媽咪在做蛋糕 我在旁邊偷吃草莓

IMG_1943

我會幫忙打蛋白哦!

IMG_1911

IMG_1913

耶! 蛋糕烤好囉

IMG_1932

聖誕快樂 我和媽媽做的聖誕蛋糕

IMG_1975

耶! 切蛋糕囉

IMG_1984

這是我的蛋糕 好大一片阿

IMG_2004

我專屬的餐桌耶 我要開動囉

IMG_2007

耶! 是我最愛吃的草莓耶!

IMG_2027

好好吃的蛋糕 我自己吃了一大片

IMG_2032

(五) 聖誕出遊

要出去玩囉 結果塞車 害我抱著水瓶就睡著了

IMG_1841

到華山廣場玩

IMG_1860

我是可愛的小雪人 好冷哦

IMG_1844

與馬槽裝飾合影

IMG_1606

好大顆的聖誕樹哦

IMG_1603

到吉慶祠區的聖誕巷 湊熱鬧

IMG_2089

上廁所篇

特地幫貝貝買的小鴨馬桶, 結果當做玩具來玩

IMG_1708

學坐馬桶 不知道是不習慣 一抱上去 馬上就要下來

IMG_1751

可愛篇

好可愛 好像兔子

IMG_1622

鬱悶樣

IMG_1625

IMG_1583

IMG_1421

IMG_1548

IMG_1506

可愛的小熊

IMG_1252

笑翻的樣子

IMG_1165

看廣告單

IMG_1158

學大人的樣子

IMG_1153

笑得好開心

IMG_1426

會自己穿拖鞋

IMG_1400

笑得好甜美

IMG_1376

跟媽咪玩躲貓貓

IMG_1384

看書篇

最自己拿書 翻書看 還會唸唸有詞 問這是什麼

IMG_1732

IMG_1730

看到書中的小朋友 手手放在嘴巴 會說no no

IMG_1554

愛笑 扮鬼臉

IMG_1561

雅雅及Nana老師來玩

IMG_1339

看哥哥切Pizza 好想參一腳

IMG_1329

連小箱子都想坐進去

IMG_1302

IMG_1285

造型篇

老師幫忙綁的 可愛辮子

IMG_1126

IMG_1114

綁馬尾

IMG_1357

IMG_1352

小丸子

IMG_1054

兩個小馬尾

IMG_1481

睡姿好差

IMG_1098

可愛的小臉

IMG_1101

出遊篇

去青田七六

IMG_1251

IMG_1235

IMG_1196

看展覽

IMG_1263

IMG_1260

最喜歡跟舅舅玩

IMG_1461

IMG_1451

by Tsung at January 06, 2012 06:19 PM

jouston

Jouston secret milk tea recipes

People ask me why my milk tea was soooooo good? Easy, you can make it at home too. Here is my recipe.

Preparation:
* Milk 150cc
* Black tea 40g(stronger smell preferred)
* Sugar * 1 tea spoon

1. Cook milk mildly until little bubbles shown in the edge of pot.
2. Put black tea into milk. You can use tea bag or use filter later.
3. Cook around 7 minutes. Watch closely the milk tea. The color should looks like Latte and you should smell some beautiful milk tea smell.
4. Put suger into pot. Done
5. You can put more sugar, or even a little cinnamon, vanilla, rose rock salt(from Tibet is best) to increase the taste.

by noreply@blogger.com (Jouston Huang) at January 06, 2012 11:04 AM

January 05, 2012

tsung

Yahoo! 新任 CEO - Scott Thompson (2012)

自從 Carol Bartz 被火掉後的這四個月, 由 CFO (Tim Morse) 暫時接任 CEO, 走向都還是朝媒體 + 賣資產進行.

現在總算找到新的老闆(Scott Thompson)接任(前 Paypal CEO), 先不看結果, 至少一上任就已經給願景, 都有抓到重點, 似乎蠻值得期待的. :)

相關新聞

下述摘錄自此篇: 雅虎新任CEO:未來我們將代表創新和顛覆,我們將專註內容和技術

  • Thompson的成就:在他的領導下,PayPal成為了全球領先的在線支付服務,活躍用戶從5000萬增加到1.04億,覆蓋104個國家,使全球合作商家達到800萬,2011年PayPal收入從18億美元增長到超過40億美元。
  • Thompson認為雅虎的核心業務是為用戶創造優秀的體驗。他指的是“偉大的技術和內容,而不是其他東西”。
  • Thompson表示他知道如何創造優秀的客戶體驗,“這是銷售廣告的核心,廣告是雅虎翻身的核心。
  • Thompson表示雅虎移動將非常重要,“我們將覆蓋所有設備,當人們想看信息時,雅虎將成為首選。”
  • Thompson結束時說,他很興奮可以加入雅虎,如果他沒有自信就不會來。

下述摘錄自此篇: 新任 Yahoo CEO Scott Thompson:我們沒有要賣 Yahoo!

「Yahoo 沒有要賣!我們正計劃利用 Yahoo 強大的資料庫,恢復過去在數位媒體服務業務上的優勢。」

下述摘錄自此篇: 雅虎任命 PayPal 前總裁湯普森為新任CEO

  • 湯普森2008年初出任PayPal總裁,此前曾擔任CTO(首席技術官),主管IT、產品開發和基礎架構。
  • 在加盟eBay前,他曾經在Visa旗下的科技公司Inovant工作,並曾擔任巴克萊全球投資者公司(Barclays Global Investors) CIO(首席信息官)。

下述摘錄自此篇: 湯普森:雅虎需在核心業務外加強創新

  • eBay的PayPal電子支付部門將60%的資源用於核心業務,30%用於可能需要一年才能看到成果的新項目,另有10%用於一些風險更大、見效時間更長的項目。但湯普森表示,他並不知道雅虎目前的資源分配比例。
  • 雅虎的部分新項目比較符合湯普森所說的第二類項目,包括兩款iPad應用——LiveStand新聞閱讀應用和IntoNow電視輔助應用。

下述摘錄自此篇: 分析稱新CEO湯普森將使雅虎回歸技術背景

Baird Equity的塞巴斯蒂安說:“如果你希望瞭解什麼才是網際網路公司取得成功的關鍵因素,那麼技術積累就非常重要。”塞巴斯蒂安指出,如果比較谷歌與雅虎的不同,谷歌一直專註於技術開發,而雅虎最初具有媒體公司的元素,“對於那些更註重營銷的公司而言,他們適應技術發展潮流的步伐不會很快。網際網路產業的競爭可謂瞬息萬變,如果你有著較為厚重的技術積累,則取得成功的幾率將更大。

下述摘錄自此篇: 雅虎新任CEO斯科特·湯普森履歷

  • 斯科特·湯普森於2008年接替拉吉夫·杜塔(Rajiv Dutta),擔任電子支付巨頭PayPal總裁,全面負責PayPal的在線支付業務。在擔任PayPal總裁之前,湯普森擔任PayPal高級副總裁和首席技術官,負責PayPal的信息技術、產品開發,以及PayPal架構。
  • 在加盟PayPal之前,湯普森在Visa旗下的子公司Inovant任職,該公司的業務是對Visa的全球技術進行監督。作為Inovant負責技術解決方案的執行副總裁,湯普森負責公司的全面發展、Visa全球支付系統的支持與維護。
  • 在此之前,湯普森還曾擔任過巴克萊全球投資者公司(Barclays Global Investors)首席信息官,任職期間落實了一個新的戰略技術平臺和全球架構。此外,他還曾在永道會計事務所(Coopers&Lybrand)任職,為富國銀行等全球領先的金融服務商提供信息技術解決方案。
  • 湯普森持有美國石丘學院(Stonehill College)會計與計算機科學的學士學位。

by Tsung at January 05, 2012 05:36 PM

fred

NodeJS 與 MongoDB 的邂逅

雖然 NodeJS 的模組和開發資源相當多,但相關文件卻非常不足或是不完整,多半文獻都只著重於基礎的使用和片斷的說明,如果不去看原始程式碼,使用 NodeJS 來完成實用的網站,會有很大的困難度。對於已經有過 Web 開發經驗的人,轉換使用 NodeJS 不免也需要花一番功夫,過去經驗中許多的常用的功能,都仍要一一花大量時間嘗試才得以解決。而這樣的情況,對於開發者來說相當的糟,也是很多人重新再評估是否使用 NodeJS 的重點因素之一。有道是『一人得道,雞犬升天』,因此筆者未來將嘗試將自己的實際經驗,寫成一篇篇重點功能實作的文章和隨 Copy 即用的範例,減少其他人浪費同樣的時間再摸索。

開發一個 Web 應用程式,最重要的莫過於資料庫的使用,過去 PHP 有 MySQL 當最佳夥伴,而現在 NodeJS 有 MongoDB 做最佳的組合。MongoDB 是 NoSQL 的代表之一,其採用 JSON/BSON 當做資料儲存和溝通的格式,亦使用 JavaScript 做為 Server-side 的執行程序語言(相當於傳統 RDBMS 的預儲程序),一切設計和習慣與 NodeJS 搭配使用起來,簡直絕配。若你對 MongoDB 的一些基本操作有疑問,可以先參考舊文『MongoDB 快速筆記』。


使用 MongoDB

MongoDB 擁有 NoSQL 的普遍特色,不用預先定義 Schema,所有的 database 和 collection(相當於傳統 RDBMS 的 Table),都會在新增資料後,自動被建立,我們只要專注於使用 NodeJS 操作資料庫即可。

要在 NodeJS 裡使用 MongoDB,可以安裝 mongodb native driver,若透過 npm 來安裝:
npm install mongodb

然後可以使用 NodeJS 建立 MongoDB connection pool ,做一些基礎的操作:
var mongodb = require('mongodb');

var mongodbServer = new mongodb.Server('localhost', 27017, { auto_reconnect: true, poolSize: 10 });
var db = new mongodb.Db('mydb', mongodbServer);

/* open db */
db.open(function() {
/* Select 'contact' collection */
db.collection('contact', function(err, collection) {
/* Insert a data */
collection.insert({
name: 'Fred Chien',
email: 'cfsghost@gmail.com',
tel: [
'0926xxx5xx',
'0912xx11xx'
]
}, function(err, data) {
if (data) {
console.log('Successfully Insert');
} else {
console.log('Failed to Insert');
}
});

/* Querying */
collection.find({ name: 'Fred Chien' }, function(err, data) {
/* Found this People */
if (data) {
console.log('Name: ' + data.name + ', email: ' + data.email);
} else {
console.log('Cannot found');
}
});
});
});
註:這是 MongoDB 的基本常識,每當新增一筆資料,MongoDB 會自動幫該筆資料加上 _id 欄位,並給與一個唯一值(格式是 ObjectId),所以我們不需要像過去 使用 SQL Server 一般,自己刻意去定義一個 ID 欄位。


預設的 ObjectId 範圍太小,改用 UUID 來當資料的唯一 ID

如果你過去有過 Web 開發經驗,到這邊肯定會開始有一些疑問欲求解,第一個問題肯定是『ObjectId 的數量極限?』。筆者在此不會回答這問題,因為這答案並不重要,想要準確知道答案,可以去『mongodb.org』尋找答案。

比起上述問題,相信你應該更想問:
預設的 ObjectId 適用的範圍?
如果日後資料庫要擴展(Scale),是否有其他的 ID 解決方案可使用?

一般情況, MongoDB 預設的 ObjectId 就相當夠用了,但如果你是要建構大型的 Web Service 或是保留未來的擴充性,可使用 UUID 去代替 ObjectId。不過,因為 MongoDB 本身並不生成 UUID,若是要使用 UUID,就必需先自行產生好 UUID,然後在新增資料時指定生成好的 UUID 給 _id 欄位,讓 MongoDB 改用我們給的 ID 而不使用預設生成的 ObjectId。

因為要自行產生 UUID,必需先為 NodeJS 安裝模組 node-uuid:
npm install uuid

然後生成 UUID 並在 insert 時使用:
var uuid = require('node-uuid');
var mongodb = require('mongodb');

var mongodbServer = new mongodb.Server('localhost', 27017, { auto_reconnect: true, poolSize: 10 });
var db = new mongodb.Db('mydb', mongodbServer);

/* open db */
db.open(function() {
/* Select 'contact' collection */
db.collection('contact', function(err, collection) {

/* Generate UUID(16 Bytes) and convert to BinaryData object for mongodb */
var uuidBinary = new Buffer(uuid.v1({}, []));
var id = mongodb.BSONPure.Binary(uuidBinary, mongodb.BSONPure.Binary.SUBTYPE_UUID);

/* Insert a data with uuid */
collection.insert({
_id: id,
name: 'Fred Chien',
email: 'cfsghost@gmail.com'
}, function(err, data) {
if (data) {
console.log('Successfully Insert');
} else {
console.log('Failed to Insert');
}
});
});
});

你可能會發現,在上面的範例程式中,我們將 UUID 轉成 MongoDB BSON 的 BinaryData 格式,這是為了效能考量,因為用純字串當做 Unique ID,在資料庫搜尋上會比 BinaryData Object 慢很多。


儲存時間戳(Timestamp)

關於儲存時間的問題,如果你去各大 MongoDB 討論區詢問或查詢,通常大家都會告訴你不必做這件事,因為每一筆資料被建立後,自動產生的 ObjectId 就包含了建立的時間訊息,我們只要去學習如何從中去解析時間即可。但是,不單只是建立時間,有時我們會為資料加上各種不同的時間戳,如:更新時間等,所以,儲存時間戳還是必要的。

雖然網路上相關 NodeJS 範例並不多,但 MongoDB 確實有 Timestamp 的資料結構可以用,我們可以這樣使用:
var uuid = require('node-uuid');
var mongodb = require('mongodb');

var mongodbServer = new mongodb.Server('localhost', 27017, { auto_reconnect: true, poolSize: 10 });
var db = new mongodb.Db('mydb', mongodbServer);

/* open db */
db.open(function() {
/* Select 'contact' collection */
db.collection('contact', function(err, collection) {

/* Generate Timestamp and convert for mongodb */
var ts = new Date().getTime();
var i = ts % 1000;
var t = new mongodb.BSONPure.Timestamp(i, Math.floor(ts * 0.001));

/* Insert a data with uuid */
collection.insert({
name: 'Fred Chien',
email: 'cfsghost@gmail.com',
created: t
}, function(err, data) {
if (data) {
console.log('Successfully Insert');
} else {
console.log('Failed to Insert');
}
});
});
});


建立資料庫索引(Index)

過去有接觸過資料庫的人應該都很清楚,索引(Index)是能優化資料查詢速度的重要功能,MongoDB 同樣也有索引的設計。

可以在 NodeJS 中,這樣為 name 欄位加上索引:
collection.createIndex({ name: 1 });


後記

到此為止,你應該能開始盡情使用 NodeJS + MongoDB 開發 Web Service 了,開始享受完全的 JavaScript 開發人生吧!

by noreply@blogger.com (Fred Chien(錢逢祥)) at January 05, 2012 04:32 PM

January 04, 2012

tsung

Ubuntu 11.10 Unity 鍵盤快速鍵

Ubuntu Linux 從 11.04 後預設改用 Unity, 與 Gnome 有蠻大的差異, 不過使用起來是都還好, 快速鍵大部分都差不多, 在這邊還是把預設 shortcuts 都列出來, 以後要找比較方便.

註: 下述的 super 健, 就是鍵盤上的 Window 健

查看 / 設定 所有 Unity 鍵盤快速鍵 (keyboard shortcuts)

  1. super + a -> 自訂 -> 鍵盤
  2. 自行定義 快速鍵的不列於此, 請自行去設定
  3. 點選 "快捷鍵" Tab, 即列出下述快速鍵. (也可於此來自行定義快速鍵)

執行器

  • 執行終端機 Ctrl + Alt + T

導航

  • 將視窗移至左方的工作區 Shift + Ctrl + Alt + Left
  • 將視窗移至右方的工作區 Shift + Ctrl + Alt + Right
  • 將視窗移至上方的工作區 Shift + Ctrl + Alt + Up
  • 將視窗移至下方的工作區 Shift + Ctrl + Alt + Down
  • 切換程式 Alt + Tab
  • 切換系統控制 Ctrl + Alt + Tab
  • 直接切換視窗 Alt + Escape
  • 直接切換程式的視窗 Alt + F6
  • 直接切換系統控制 Ctrl + Alt + Escape
  • 隱藏所有一般視窗 Ctrl + Alt + D (顯示桌面)
  • 移至左方的工作區 Ctrl + Alt + Left
  • 移至右方的工作區 Ctrl + Alt + Right
  • 移至上方的工作區 Ctrl + Alt + Up
  • 移至下方的工作區 Ctrl + Alt + Down

系統

  • 登出 Ctrl + Alt + Delete
  • 鎖定畫面 Ctrl + Alt + L

螢幕截圖

  • 擷取螢幕截圖 Print
  • 拍下視窗的螢幕截圖 Alt + Print

視窗

  • 使用視窗選單 Alt + Space
  • 切換全螢幕模式 自行定義 (F11)
  • 切換最大化狀態 自行定義 (Alt + F10)
  • 視窗最大化 Alt + F10
  • 還原視窗 Alt + F5
  • 切換視窗捲起/放下狀態 Ctrl + Alt + F5
  • 關閉視窗 Alt + F4
  • 視窗最小化 Alt + F9
  • 移動視窗 Alt + F7
  • 調整視窗大小 Alt + F8

相關鍵盤快捷鍵

此篇文章有寫不在上述內容的快速鍵: Ubuntu Unity: Keyboard shortcuts key to ease of use

註: 如果有其它快速鍵, 非此篇文章提到的, 也會於此處陸續補上.

  • Super (Window 鍵)
  • Super - 持續按著, 左邊程式會出現數字, Super-1 or 2 or 3... 就會執行此程式
  • Super-1 or 2 or 3 and so on until 0 - Open or focus an application.
  • Super-S - 秀出所有虛擬桌面 (Display all virtual desktop)
  • Super-T - 開啟回收桶
  • Super-A - 開啟應用程式選單
  • Super-F - 開啟檔案、資料夾選單
  • Super-W - Expo mode. 現有視窗平行列出
  • F10 - 程式的 Menu 選單

相關網頁

by Tsung at January 04, 2012 05:11 PM

January 03, 2012

tsung

好文: 如何有效地報告錯誤

這篇文章寫的內容是要教導使用者如何回報 Bug、Error Message 等資料.

  • 此文件的英文名稱: How to Report Bugs Effectively
  • 中文翻譯名稱: 如何有效地報告錯誤

此份文件可以在 Open source 時, 寫在文件上, 可以省點工. :P

如果覺得此份文件太長, 最少看最後兩段即可 ("所以我把磁片載入視窗系統中..." 和 "摘要").

最重要的就是下述幾點:

  • 紀錄問題發生步驟 (盡量寫清楚, 如果可以抓圖或拍照也不錯)
  • 讓錯誤可以重現
  • 如果上述兩個步驟無法達成, 那最後一招就是 "保留現場"

如何有效地報告錯誤 轉載

下述內容為原文的完整轉載(沒有任何修改), 主要作備份用途.

原文最新版本可見: 如何有效地報告錯誤

如何有效地報告錯誤

作者: Simon Tatham, 專業及免費軟體程式師

翻譯:梅普華

介紹

寫過供大眾使用軟體的人可能都收過一份以上的爛錯誤報告. 有啥都沒講的報告(這個程式不會動), 有不合理的報告或資訊不足的報告, 也有提供不正確資訊的報告. 還有一些報告查到後來不是使用者自己攪錯, 就是其他程式惹禍, 或是網路斷線等等.

有個理由可以解釋為什麼技術支援工作這麼難做, 原因就是這些亂七八糟的錯誤報告. 不過並非所有錯誤報告都是這麼糟糕. 我工作之餘有在維護免費軟體, 有時候會收到一些非常清楚有幫助而且很有內容的錯誤報告.

我會試著在這篇短文中清楚說明良好錯誤報告的重點. 基本上我希望全世界的人在報告任何錯誤前都能讀讀這篇短文. 當然我更希望每個送錯誤報告給的人都讀過.

簡而言之, 錯誤報告的目的是要讓程式師能親眼目睹程式出錯. 你可以親身示範給他們看, 也可以提供一份詳細而徹底的指令教他們如何重現問題, 如果他們可以重現問題, 就會試著收集更多資訊去瞭解問題的原因. 如果他們無法重現問題, 就只能要你幫他們收集資訊.

在錯誤報告中, 必須要把真實發生的事實(我在電腦前看到這個狀況)和臆測(我認為問題可能是)很明顯的區分開來. 必要時可以把臆測略過不提, 不過事實絕對不能漏.

因為你希望錯誤能被修正, 才會提出報告錯誤. 沒有必要對程式師惡言相向或故作無助: 問題有可能是他們搞的, 但也可能是你自己惹的. 或許對程式師發脾氣有點道理, 不過如果你能協助提供所有必要的資訊, 問題就能儘快修好. 另外也請記住, 既然程式是免費的, 表示作者是基於好心而提供的. 如果很多人對他們不禮貌, 他們可能就不會那麼好心了.

"程式不會動."

多少相信程式師的基本智能吧. 如果程式完全不會動, 他們應該會發現的. 既然他們沒有發現, 表示他們用的時候沒問題. 所以要不是你的作法和他們不同, 就是你的環境和他們不同. 他們需要資訊, 錯誤報告的目的就是提供這些資訊. 資訊過多往往好過資訊不足.

很多程式(特別是免費的)都會公開已知的問題清單. 如果你能找到這樣的已知問題清單, 應該好好讀一遍, 看看你剛發現的問題是否為新問題. 如果是已知的問題就不值得再報告一次, 不過如果你認為你的資訊比較齊全, 還是可以聯絡程式師. 因為如果你能提供一些原本沒有的資訊, 他們或許能更輕易地解決問題.

這篇短文充滿了指引原則. 這些原則都不是絕對不變的規定. 每個程式師自有期望的錯誤報告方式. 如果程式附有自己的錯誤報告指引原則, 應該要讀一遍. 如果程式所附的指引原則與本文衝突, 就照程式的規矩來做.

如果你不是在報告錯誤, 而是就程式使用上的問題求助, 應該說明已經在那些地方找過答案(我看了第4章的5.2節, 可是找不到任何相關的內容). 這會讓程式師知道人們會期望到什麼地方找答案, 以後就能讓文件更易使用.

"試給我看."

報告錯誤的最佳方法之一就是直接示範給程式師看. 讓他們站到你的電腦前面, 執行他們的軟體, 然後指出問題所在. 讓他們看著你打開電腦, 看著你執行並操作軟體, 並且看到軟體所產生的反應.

程式師對自己的程式瞭若指掌. 他們知道哪些部份絕對正確, 也知道哪些部份可能會有問題. 他們光憑直覺就知道要找些什麼. 在程式跑出明顯的錯誤之前, 他們可能已經提早注意到一些細微的錯誤並從中得到線索. 他們可以觀察電腦所有的執行過程, 並且挑出對他們重要的資訊.

有了這些可能還不夠. 他們可能會覺得還需要更多資訊, 並且要求你重複執行給他們看. 他們也可能會要你說明整個操作過程, 以便他們能自己重複重現問題. 他們也可能會改變操作過程多試幾次, 看看問題只在某一種狀況發生, 還是在相關的多種狀況下都有出現. 如果運氣不好, 他們可能得坐下來花上幾個小時拿出整組開發工具真正深入調查. 不過最重要的還是讓程式師看到電腦出錯. 只要他們能看到問題發生, 通常都可以由此開始嘗試修正問題.

"教我如何做給自己看."

現在是個Internet時代. 同時也是全球通訊的時代. 在這個時代只要按個鈕就能把我的軟體傳送給位在俄羅斯的某人, 對方也一樣能輕易地把意見傳給我. 不過如果他用我的程式遇到問題, 可就沒法子把我找到他電腦前看著程式出錯. 如果能的話, "試給我看"的作法是很好的, 不過通常都做不到.

如果你必須向一個不可能到你身旁的程式師報告錯誤, 首要目標是讓他們能重現問題. 希望讓程式師執行自己的那份程式, 進行相同的操作, 然後以相同的方式出錯. 當他們能親眼看到問題發生, 就可以開始處理.

所以你得絲毫不差地把自己做的事告訴他們. 如果這是個有圖形介面的程式, 告訴他們你按了哪些按鈕以及按各按鈕的次序. 如果是輸入命令執行的程式, 就要精確地告知你所輸入的命令. 可能的話應該儘量提供整個過程的精確記錄, 裡面包含所有你所輸入的命令以及電腦的反應.

把你所能想到的所有輸入都給程式師. 如果程式由某個檔案讀資料, 你可能也得送一份檔案拷貝過去. 如果程式會透過網路和另一台電腦通訊, 你可能沒法子把另一台電腦送過去, 不過至少可以說明電腦的類型 以及上面所執行的軟體(如果能的話).

"我這裡能正常執行. 究竟出了什麼問題?"

如果你提供程式師一長串輸入和動作, 他們照著執行自己的程式, 結果卻一切正常, 表示你提供給他們的資訊還不夠. 可能是這個問題並不會在每台電腦出現; 或是你和他們的系統間有某些差異. 也可能是你誤解了這個程式的作用. 你們看到一模一樣的顯示輸出, 可是你認為這樣的輸出是錯的, 而他們知道這是對的.

所以你也得敘述發生的事情. 精確地告知你看到的內容. 告知為何你認為所看到的內容是錯的; 如果能告知你預期看到的結果更好. 如果你用"然後就出問題了"這種寫法, 就會略過了一些非常重要的資訊.

如果你看到錯誤訊息, 應該要小心精確地告訴程式師訊息的內容. 這些訊息非常重要! 在目前這個階段, 程式師只是想找出問題所在, 並不會嘗試去修正問題. 他們必須知道什麼地方出錯, 而那些錯誤訊息正是電腦對問題的最佳敘述. 如果沒有其他方法能輕易記下問題就把問題抄下來. 不過如果不能同時報告錯誤訊息的內容, 光說程式出錯是沒有意義的.

如果錯誤訊息裡有數字時更要特別注意, 一定要讓程式師知道那些數字. 你看不懂並不表示沒有意義. 這些數字裡面隱藏有程式師能解讀的各種資訊, 而且很可能包含極重要的線索. 錯誤訊息裡會有數字, 是因為電腦無法精確地用 文字回報錯誤, 只能儘量用其他方式把重要的訊息呈現出來.

在這個階段程式師事實上是在做偵探一樣的工作. 他們不知道發生什麼事, 也無法接近現場親眼目睹, 所以只能努力找尋線索把問題挖出來. 錯誤訊息, 無法理解的數字代碼, 甚至無法解釋的遲滯都和犯罪現場的指紋一樣重要. 所以一定要保存起來.

如果你用的是Unix, 程式可能會產生一個核心傾印(core dump). 核心傾印是個很好的線索來源, 所以絕對不要刪掉. 不過大部份的程式師都不喜歡突然收到附有核心傾印大檔案的電子郵件, 所以寄出前一定要先詢問對方. 另外有一點要特別注意, 因為這個檔案記錄了完整的程式執行狀態, 所以裡面可能含有各種"機密" (程式可能正在處理私人訊息或機密資料).

"問題出現後我又試著..."

當錯誤發生之後, 你可以做各種因應的動作. 大部份動作都會讓問題更嚴重. 我有個唸書時期的朋友不小心刪掉她所有的Word文件, 她在找專家求救之前試著重裝了Word又執行"磁碟重整". 這兩個動作對救回檔案都沒有幫助, 反而把磁碟機內容弄得更亂. 最後就是沒有任何檔案回復程式能救回她的檔案. 如果她把電腦放著不去動, 可能還有點機會.

這樣的使用者就像縮在角落的麝香猴: 背緊貼著牆面對死亡威脅時會瘋狂地攻擊, 因為它覺得有動作總比什麼都不做要好. 不過這種作法並不適用於電腦產生的問題.

和麝香猴相反的是羚羊. 當羚羊面對無法預期的事物或害怕時就會定住不動. 它會停下來保持完全靜止, 試著不要引起任何注意, 同時思考最佳的因應措施. (如果羚羊有技術支援專線可用, 這時候就會打電話求援.) 一旦決定最安全的做法後, 它就會照著執行.

所以遇到問題時要立即停止所有動作. 不要碰任何按鍵. 看著螢幕注意是否有任何不尋常的地方, 然後把異常之處記下或抄下來. 再來或許可以小心地按"確定"或"取消", 看哪一個看起來最安全而定. 要試著養成一種直覺反應 - 如果電腦出現預期之外的反應, 什麼都不要動.

如果你有辦法排除問題(不管是把出問題的程式關掉或是重開電腦), 可以試著讓問題再次重現. 程式師喜歡那些能重複產生的問題. 這時候快樂的程式師能更快更有效率地修正問題.

"我認為一定是超光速調變的極化出了問題."

並不是程式師以外的人才會寫出爛錯誤報告. 我所看過最糟糕的錯誤報告中有些就是程式師寫的, 而且有些還是很優秀的師式師.

我曾經和另一個程式師合作, 他一直在尋找自己程式裡的錯誤並試著修正. 每次遇到解不出來的問題時, 就打電話叫我幫忙. 當我問他"哪裡出錯了?", 他就會回答他目前對問題應如何修正的看法.

如果他的看法正確無誤事情就很順利. 由於他已經把事情完成一半了, 我們就能一起把工作完成. 這時候他的意見很有幫助 而且非常有效.

問題是他經常會出錯. 這時候他會花時間找出為何程式中某個部份產生錯誤的資料, 到最後才發現那些資料是正確的, 結果我們花了半小時去查一段完全正確的程式碼, 而實際的問題卻在別的地方.

我確信他並不會對醫生這樣做. 大家都不會和醫生這樣講話:"醫生, 我得了Hydroyoyodyne病(譯註:虛構的怪病), 給我開個藥吧.". 你應該會說有哪裡不舒服, 哪裡酸痛哪裡起疹, 有沒有發燒等等, 然後讓醫生診斷並開出處方. 否則醫生會把你當憂鬱症或神經病, 理直氣壯地趕你出門.

對程式師也一樣. 提供你自己的診斷有時可能有幫助, 不過一定要先敘述症狀. 診斷是可有可無的, 絕不能取代症狀敘述. 同樣的道理, 在錯誤報告之外附加一份把問題修好的程式碼是很有幫助, 不過程式碼並不能取代錯誤報告.

如果程式師要你提供更多資訊, 絕對不要偽造資料! 曾經有人回報一個錯誤, 我要他試一個我知道不能動的命令. 要他試這個命令, 是因為我想知道它會出現哪一個錯誤訊息. 知道會傳回哪一個錯誤訊息就等於得到重要的線索. 可是他並沒有真的去試, 卻直接回信給我說:"不, 那個命令沒有用." 我費了好一番功夫才說服他實際去試命令.

用你的聰明智慧幫助程式師是很好. 即使你的推論不對, 程式師也應該心存感謝, 因為至少你已經試著讓他們更好過. 不過記得要報告症狀, 否則你可能會讓他們過得更痛苦.

"真奇怪, 剛剛才出過問題的."

程式師聽到"偶發性的錯誤"一定都會很頭大. 能依照某段單純動作過程產生的錯誤算是簡單的問題. 程式師可以在嚴密觀察的測試環境下重複這些動作, 仔細觀察問題發生時的所有細節. 不過很多問題都不是這樣的: 有些程式一星期會當一次, 也有些問題很久很久才出現一次, 還有些問題程式師在的時候絕不出現, 等最後期限逼近時卻時常發作.

大部份偶發性的錯誤並不是真正的偶發. 其中多數都有某些邏輯存在. 有些可能是在機器記憶體不足時才出現, 有些錯誤可能是因為另一隻程式在不對的時點修改一個重要檔案, 還有些錯誤可能只在每小時前30分出現! (我真的遇過這種錯誤)

如果你能重現錯誤而程式師不能, 很可能是因為你和程式師的電腦在某個地方有差異, 而這個差異就是問題的原因. 我曾經遇到一個怪問題, 視窗會在螢幕左上角縮成一個小球. 不過只有在800x600的螢幕上才會發生; 在我的1024x768螢幕上完全沒有問題.

程式師會想得到你對於問題所知的全部資料. 你可以在另一台機器試看看. 也可以試個兩三次看看出問題的頻率如何. 如果問題只在你努力工作時才出現, 要展示給別人看時又完全正常, 出錯的原因可能是長時間執行或檔案太大. 試著記下出錯時你正在做的動作, 而且儘可能記下細節. 如果觀察到任何模式都要記下來. 你所提供的任何資料多少都有幫助. 即使只是"機率性"的敘述 (比如有執行Emacs時似乎比較容易當), 雖然不能提供指向問題的直接線索, 不過還是可能協助程式師重現問題.

更重要的是, 程式師要確認他們處理的是真正的偶發性問題還是與機器相關的錯誤. 他們會要知道很多有關你的電腦的細節, 這樣才能找出你的電腦和他們的電腦的差異所在. 很多細節會視程式而定, 不過版本號碼通常是一定要的. 程式本身的版本, 作業系統的版本, 可能還要包括其他與問題有關的程式的版本號碼.

"所以我把磁片載入視窗系統中..."

寫得清楚是錯誤報告的基本. 如果程式師看不懂你的意思, 報告有寫等於沒寫.

我收到全世界來的錯誤報告. 很多報告來自非英語系地區, 而且很多人為英文寫得不好致歉. 通常有為英文不好而致歉的錯誤報告實際上都非常清楚有用. 寫得最含糊不清的報告全都是來自英語系地區, 這些作者認為他們不必寫的清楚精確, 我還是能明白其中的意思.

  • 要明確. 如果你可以用不同方法完成同一件事, 就要寫出你用的方法. "我選取Load"可能是說"我點選Load"或是 "我按了Alt-L鍵". 把你做的事說清楚. 有時候這點很重要.
  • 要詳細. 寧願多給資訊而不要少給. 如果你說得太多, 程式師可以略過一些不看. 不過如果你說得太少, 他們就得回來問更多的問題. 我收過一份裡面只有一句話的錯誤報告. 我花了好幾個星期才得到足夠份量的有用資訊, 因為他的回覆每次都只有一個短句子.
  • 要小心代名詞. 避免在意義不明確時使用"它"或"視窗"之類的字眼. 考慮以下的狀況: "我啟動FooApp. 它跑出一個警告視窗. 我試著把它關掉可是它當掉了." 這裡並沒有明確指明使用者想關掉什麼東西. 他究竟要關掉警告視窗還是整個FooApp? 你可以改寫成"我啟動FooApp, FooApp顯示一個警告視窗. 我試圖關閉警告視窗, 結果FooApp當掉了." 這些寫比較長而且囉嗦, 不過比較清楚也不容易誤解.
  • 閱讀你寫的東西. 自己把報告重新讀一遍, 看看有是否夠清楚. 如果你有寫出了重現問題的步驟列表, 試著照做一遍確定沒有漏掉任何步驟.

摘要

  • 一份錯誤報告的首要目標是要讓程式師親眼看到問題. 如果你不能到他們面前把問題顯示出來, 就得提供詳細的指示讓他們能自己做出來.
  • 萬一首要目標無法達成, 程式師沒法子自己看到問題發生, 那麼錯誤報告的第二目標就是描述問題狀況. 儘量詳細敘述每件事. 把看到的東西都寫出來, 期望看到的東西也要寫出來. 錯誤訊息也要抄下來, 如果訊息裡有數字的話更是不能漏掉.
  • 當你的電腦出現預期之外的反應, 記得什麼動作都不要做. 在你冷靜之前什麼都不要做, 另外不要進行任何有危險性的動作.
  • 如果你自認能力夠的話可以儘量嘗試自己診斷問題, 不過即使你做了診斷, 還是應該報告問題的症狀.
  • 要準備在程式師需要時提供額外的資訊. 如果他們不需要就不會要. 程式師並不會故意刁難. 還有可以把版本號碼先準備好, 因為很可能會需要.
  • 要寫得清楚明白. 照你的意思去寫並且確定意思不會被誤解.
  • 最後一點就是要精確. 程式師喜歡精確.

聲明: 事實上我從未看過麝香猴或是羚羊. 我的動物學知識不一定是對的.

$Id: bugs-tw.html 9171 2011-05-10 17:39:06Z simon $

Copyright © 1999 Simon Tatham.

這份文件屬於 OpenContent.

你可以在 OpenContent Licence條款限制下複製並使用此文件.

對本文的意見及批評請寄到 anakin@pobox.com.

如果你是為了特定的程式由別的網站連到這篇文章, 不要把那個程式的錯誤報告傳到上面的位址. 請回到原先的網頁找出該程式錯誤報告的對象.

by Tsung at January 03, 2012 05:36 PM

jserv

"Develop Community-based Android Distribution and Upstreaming Experience" 簡報上線

去年十一月有幸受 [droidcon] 的邀請,到荷蘭阿姆斯特丹分享關於 [0xlab] 兩年來的開發經驗,探討我們如何累積基於 Android 的技術,並且透過 open source 的力量,回饋到社群並為我們創造更多正向的開發機會。簡報已上線,請見: [dev-android-distribution.pdf] Develop Community-based Android Distribution and Upstreaming Experience View more presentations from Jim Huang 提綱如下: Reasons to build Android distribution Lesson learned from AOSP The methods to enhace Android software...

by jserv at January 03, 2012 06:49 AM

January 02, 2012

tsung

好站 - 搜尋 YouTube MV 並自動播放

之前就一直有打算做個產品, 就是輸入關鍵字, 然後把 YouTube 等等的 MV 拉出來自動播放.

最近看到有兩個網站做到這個需求:

  • Tubalr - 聽音樂專用 (輸入想要聽的團體名稱, 就會自動不斷的播歌)
  • SHOW ME x NON-STOP – continuously play cool videos

網站說明

  • Tubalr 是專門針對 MV, 就是輸入完後(ex: 五月天), 就會開始播放此歌手/團體的 MV (音樂).
  • SHOW ME x NON-STOP 是針對輸入的字, 自動拉出影片, 會拉出輸入關鍵字的所有新聞、MV、音樂等等, 若只想鎖定 MV, 可以輸入"關鍵字 + MV", 可以有類似的效果.
  • 註: 這兩個服務撈出來的影片, 都會自動的一直播放.

相關網頁

 

by Tsung at January 02, 2012 05:35 PM

jserv

「用 Android 學習系統程式」簡報上線

上個月筆者在台南崑山科技大學演講「用 Android 學習系統程式」,簡報已上線,請參考 [discover-android-system.pdf] Discover System Facilities inside Your Android Phone View more presentations from Jim Huang 自 2006 年起,筆者分享了名為「深入淺出 Hello World」的系列演講後,獲得一些迴響與啟發,而隨著 Android 裝置的普及與整體硬體的提昇後,實際在大量使用的裝置如智慧型手機上,做觀察、分析,進而研究系統程式的原理,已是相當便利。本議程可視為「深入淺出 Hello World」的實務篇,企圖從觀察 ARM/Linux 的運作開始,延伸去年的演講主題 [自己動手,豐衣足食 -- 淺談探索 Linux 系統設計之道],透過現有 Linux 核心與 Android 系統的若干機制,逐步揭開系統程式的面紗。 議題大綱: 握在手心的 Linux...

by jserv at January 02, 2012 04:00 PM

January 01, 2012

fred

苦其心志,勞其筋骨後,世界末日年快樂!

2012 新年快樂!今年格外不同,也是人稱世界末日將來臨的一年,而在這人生將結束的一年,不免開始思考今年的自我期許。 :-)

回顧去年的風雨,當了一年的『救火隊長』。曾經為了救援朋友的案子,連續三個月,每天平均睡不到一小時,且平均連續工作達72小時以上,如果過程中突然一命嗚乎,一點也不意外。還好,這樣可怕的惡夢,都一一挺了過去,雖然身體似乎出現了點問題,不時陣痛襲來。不過,老天讓我完好的活下來,是祂已經頒發『超級救火員勛章』的最佳證明。

我總相信,只要有信念和方向,任何困境都是老天賜予的挑戰,每當苦盡甘來,就會有許多更好的機運等著。事實上,當了一年職業救火員不是沒有好處,看到了許多人不為人知面貌,許多業界的問題和盲點,更認清了自己該做的事,也得到了更棒更成熟的點子。甚至,某個程度上,已經不害怕死亡突然降臨。

為什麼過的這樣辛苦?為什麼總是孤單的拼命?是否該檢討一下自己?

還清楚記得,這一年有些人這樣問過我,我都沒有正面回答,直到現在才有時間靜下來思考這個問題,也自我檢討了一番。

如果因為負責任而辛苦減壽,為了理想而拼了命和全世界作對,那我真的想不出有任何一點不正確的地方。我只能推論,許多人不願意辛苦,甚至可以『不負責任』去避免辛苦;許多人沒有懷抱理想,所以沒有拼命的目標,只有隨波逐流的生活。

真的要自我檢討,除了憤世忌俗外,就是我死腦筋的總是依據一件事的『順利和成就』,考量應該做什麼,甚至不是自己的義務,也會執行到底,貫徹著父親所囑付:『幫忙之前叫幫忙,幫忙之後叫責任。』然而,許多人理所當然以為處處都是我的義務和責任,一股惱全加諸於我身上。使我,做會自己勞累不堪,不做則內心不舒服,痛苦萬分。

而這樣的個性,讓我和傳統做生意一點都不搭軋,因為我永遠不愛也不喜歡打『把對手權利變成對手義務』的拉拒戰。在這樣的商場戰爭下,人人都不想執行自己的義務,只想行使自己的權利,甚至讓對方的權利變成自己的權利。不過,雖然不喜歡,但不代表我不懂,每次回歸原點和原貌來看,就會發現『人有多不要臉』和『許多醜陋的臉孔』的戲碼都正在天天上演,過程中的種種掩飾都讓人不敢相信,任誰看了都會臉紅找洞鑽。

如果這樣才能不辛苦不孤獨,我寧可苦一輩子。我也永遠不相信,那樣的結黨,能夠有什麼未來。此外,如此彆扭的生意,也不是我所期望的目標。

過去無數個日子,腦袋從未停止轉動過。啄磨過許多想法,也思考過許多問題,思考中入眠已經是常態。堅信,苦其心志,勞其筋骨,然後,痛痛快快又能無後顧之憂的完成件『應該做的事』,這就是今年的自我期許。

by noreply@blogger.com (Fred Chien(錢逢祥)) at January 01, 2012 07:43 PM

tsung

2012 跨年煙火影片

2012 新年快樂, 今年的跨年晚會和煙火, 事先沒做功課, 不然看這個陣容和煙火模擬, 會考慮要跑下去高雄跨年.

2012 義大煙火模擬

這個煙火的陣容, 就覺得應該不會有任何影片可以拍好, 現場應該很壯觀.

2012年夢時代跨年晚會煙火DEMO秀 (OPEN小將煙火)

高雄義守大學跨年晚會影片

高雄義守大學煙火 (跨兩個影片)

2011心High起義守歲狂歡100跨年晚會part24 (煙火從 5:30 開始準備)

2011心High起義守歲狂歡100跨年晚會part25

2012高雄夢時代跨年煙火秀(HD) New Year Firework at Kaohsiung's Dream Mall

台北101跨年煙火

2011跨年煙火,2010/2011,建國百年跨年煙火,高畫質1080i,101 fireworks

台北101高畫質跨年煙火秀 Taipei 101 Fireworks Countdown 2012 (Full HD)

2011 過去了, 去年走了不人物, 悼念一下, 詳見: 緬懷2011年辭世的17位科技先驅

最後, 與 2011 吻別 吧~

相關網頁

by Tsung at January 01, 2012 05:46 PM

December 30, 2011

jouston

大車人生: KRAUSER行李箱


最近隨著對車子操控感的增加,愈來愈常騎車通勤,也經常性的載老婆出去喝豆漿。聽取乘客對於車輛和駕駛的意見之後,發現乘客對於後面沒有靠背,以及缺乏空間載隨身物品是兩個最大的問題點。

對我自己來說,開始騎這台車幾個月的時間一直沒有下定決心裝上行李箱,主要的問題點是擔心重心的改變會影響操控,以及可能裝上箱子以後整台車會看起來很拙。

不過,既然零用錢也存夠了,乘客也表達明確的看法,柏霖也開始特價,天時地利人和之下,還是裝了吧。

我選擇的行李箱與大多數人的抉擇不太一樣,雖然說風鏡是裝了Givi的,可是行李箱我看上的是比較冷門的Krauser K5行李箱。選擇它的原因有:


  1. 47公升的大容量,實驗結果確實可以放兩頂全罩安全帽
  2. 價格不錯
  3. 可以當後上箱或是側箱的彈性
  4. 底盤是金屬製,比較不用擔心行李箱跟你在旅途中間分道揚鑣
  5. 個人的美感上覺得它比較低調好看
  6. (後來裝好之後發現) 底盤支架整合度很高,看起來好像原廠件,而且延伸了後座的配色,讓整台車看起來更有機械感。
裝好到目前為止,幾個經常使用的情境都經歷過了,包括:
  1. 騎車通勤
  2. 出遊
  3. 雨天騎乘
  4. 載老婆喝豆漿
  5. 去大賣場買生活用品
我的心得:
  1. 雖然47公升剛裝好時感覺很大,還是不能跟汽車比裝載量。不過已經帶來很高的方便性了。目前最大裝載:兩個成人 + 兩個80%滿的雙肩電腦背包 + 一包10kg的米 + 雨衣
  2. 沒有想到居然可以讓車子變好看。
  3. 老婆對速度變得比較不敏感,可以自由自在的加速。以前油門的操作要比路上速克達還要慢才行,現在可以起步衝第一。
  4. 重心確實會改變,尤其是載重一點的時候。感覺起來車子重心往後、往上移了一點點。不過幾天之後就可以習慣。
  5. 老婆開始喜歡跟我出去騎車 <-- 這個最重要!!!
車友們如果經常騎車的話,也考慮去裝一顆吧。我個人很推薦。




by noreply@blogger.com (Jouston Huang) at December 30, 2011 08:44 AM

December 29, 2011

tsung

微軟IE 2012年起改自動升級

微軟總算狠下心了, 真是期待明年~ 瀏覽器升級是很重要的一步阿~

  • Windows XP 會自動升級到 IE8.
  • Windows Vista 和 Windows 7 會升級到 IE9.

話說, 都這樣子要升級了, 為何不要統一都升到 IE9? Orz.

下述摘錄自此篇: IE瀏覽器明年改採自動升級

微軟日前宣布從明年起將啟動IE瀏覽器版本的寧靜升級,包含Windows XP、Windows Vista、Windows 7作業系統的用戶。

微軟日前宣布從明年起將啟動IE瀏覽器版本的寧靜升級,包含Windows XP、Windows Vista、Windows 7作業系統的用戶。微軟表示,Windows XP用戶會自動升級到IE 8版本;Windows Vista和Windows 7用戶則會自動升級至IE 9版本。

相較於過去由用戶手動更新,微軟表示,改採自動更新的方式,更能增加用戶網路資訊安全的防護。不過,微軟也考慮到自動升級對企業的影響,提供了一個關閉自動升級的機制。企業可先安裝阻擋自動更新的附加元件「Toolkit to Disable Automatic Delivery of Internet Explorer 9」,或要求內部使用者預先手動關閉自動更新功能,來避免升級IE。

下述摘錄自此篇: 微軟IE將採用自動升級機制!

微軟IE產品經理Ryan Gavin宣布,IE將透過Windows Update機制自動升級版本,這項措施將從一月起先行從澳洲及巴西地區開始試行,然後再逐步擴展到其他地區。

由於是透過Windows Update進行升級,將只有Windows Update設定為自動更新的電腦才會自動升級,以目前狀況為例,Windows XP將會從IE 6更新至IE 8,Windows Vista及Win 7則會升級到IE 9。設定不自動更新的電腦則必須手動更新或直接到微軟網站下載、安裝新版本的IE。

更新之後,使用者也可以解除新版IE,恢復成Windows附載的版本。微軟後續版本的IE都將附有自動更新的設定選項,讓使用者可以自己決定是否自動升級。

相關網頁

by Tsung at December 29, 2011 05:58 PM

jserv

在 Android 上運作 X server

在 Android 上運作 X11 server 的想法大概從 2009 年始,就有頗多單位陸續實現,不過大部分都是 close source。整個 X11 若要在 Android bionic (libc) 上完整編譯,會面臨頗多問題,比方說缺少 SysV shm 的支援。而 Tom Marshall 則貢獻了一個 open source 的實做,專案暫時命名為 "android-x-server",完全以 Java 搭配 Android framework 來開發,程式碼維護於 github [android-x-server]。目前還在開發初期,不過大致能運作了。 下圖是我在 Nexus S 手機先執行 [android-x-server] (X server),然後接受...

by jserv at December 29, 2011 01:19 PM

fred

【Startup 談心酸】 當革命情感對上體制

我總認為,當別人問起職業,回答『Startup(新創)』是一件很自傲的事。雖然公司不大,但是從兩手空空開始,完成理想的感覺真的是棒呆了!你必需經歷『養活自己』、『勒緊褲帶』、『想破腦袋』還有『革命不怕失敗』的種種過程,最重要的是,伴隨而來的『人的問題』,很有可能成為最後一根稻草,壓垮我們。但每當跨越過每一個階段,彷彿就吃了甜美多汁的果實,相當有滋味。

常聽到有人說:『先不談成功與否,Startup能做超過一年,就相當不容易了。』,其實是事實,從創業中敗陣下來的人不在少數,敗陣的原因更不勝枚舉,有人是受不了壓力,有人把持不住Cash Flow(現金流),有人經營心態不正確,或是 idea 失敗等等。但是,這些原因真的都比不上『同伴』所造成的打擊。

如果你不是一個人創業,而是三五好友有志一同,那我要恭喜你,畢竟要能找到方向相同,又有足夠能力的人一起是非常困難的。但是,我也要為你感到遺憾,因為『人的問題』會帶來更多波折和困難,造成創業失敗的比例更高。『同伴』是個雙刃劍,雖能共患難,有革命情感,但也會因決裂而一夕之間毀滅。

這裡有一個朋友的小故事,相當常見,或許大家都很熟悉其中情節:
有一群人在學校就是好朋友,而所會的技術也讓他們相當出類拔粹,於是,他們孕釀出創業的想法。為了小試身手,這些人開始共同接一些小案子,並培養革命情感。看似一切很美好,但在過程中問題出現了,有人怠惰(或是能力不足)造成其他人負擔增加,又或者是因此造成案子無法順利結案。好不容易,其他隊員們跳出來『Cover』,讓一切過了關,客戶也付了錢。

然而,問題才正要發燒,在分配利益時,有人開始提出不滿:『為什麼出包的同伴,可以拿的錢和沒出包的人一樣多?為什麼救火的人,幫出包的人完成不是自己的大部份工作,卻只拿到原本的待遇?』此外,對工作的分配也頗有微詞,有人認為自己做的工作,相對困難許多,應該分到更多的錢。更誇張的是,每一個人都生怕別人多拿或是拿的比自己多。

還好,為了讓大家不要決裂,盡可能滿足大家的要求,有人跳出來處理這件事,除了自己掏腰包,甚至動用了原本大家講好要保留下來的『公基金』。然後發現,雖然大家都同意切出一部份成為公基金,但心中仍然認定這公基金有一部份是屬於自己的,隨時都可以要回去,有人更不時想動用或拿回這個錢。一旦動用公基金,就會牽動到大夥的神經,引發更多莫明其妙的問題。

問題並沒有因為時間久而消失,之後的幾次案子,多多少少都出現類似的狀況,磨光了真正想做事的人,其心中的熱情。最終,革命情感不敵絕望,因看不到未來而拆夥。

這個劇情也許正在你的團隊中上演,更或者有更多超出這故事內容的問題發生。總而言之,問題出在於每個人都不肯讓自己的利益有任何損傷,也只能看到自己眼前的利益。就算有人出來願意奉獻,也只是減緩問題發酵,並沒有真正解決問題。一旦緩充的空間消耗殆盡,這個團隊就走向末路。

很多人會說,大家都是好朋友,也都有相同志向,過程中難免會有些問題,我們都可以不用太計較,這樣也有共患難的革命情感。但事實上,人性很難抵抗,已經有太多人實驗過,都證明了『不計較才計較』。只是有人爆發的點比較高,平時看不出來,可是一旦爆發,便天崩地裂跟你沒完。想想看,連親密的親人都可以為了遺產殺紅了眼,更何況只是『普通朋友』。

最後你會發現,革命情感是解決不了任何事,正確的建立公司體制是最好的方式,雖然很死板無情,但不容任何人有第二句話,也給參與者有人性上的約束,前人所遺留下來的方式,是有其道理的。

by noreply@blogger.com (Fred Chien(錢逢祥)) at December 29, 2011 09:14 AM

December 28, 2011

tsung

淘寶將 Web Server Open Source - Tengine

淘寶網現在應該算是亞洲最大的 EC 網站, 每天幾十億的 PV, 為了要求穩定和容忍這麼大的量, 他們挑選的 Web Server 是 Nginx~

事情總是這樣子的, 挑選完後就會使用, 使用後就會發現到功能不夠, 於是著手開始增加功能, 於是就把 Nginx 改成 Tengine 了. XD

所以 Tengine 可以看作是 Nginx 的改良版, 詳細可見此篇: "淘寶 Web 伺服器 Tengine 正式開源", 下述摘錄自此篇:

Tengine基於最新的Nginx穩定版(Nginx-1.0.10),在它的基礎上開發了一些功能和做了一些bug修復,比如:

  • 組合多個CSS、JavaScript文件的訪問請求變成一個請求;
  • 支持管道和syslog形式的日誌和抽樣;
  • 自動根據CPU數目設置親緣性;
  • 監控系統的負載和資源占用從而對系統進行保護;
  • 顯示對運維人員更友好的出錯信息,便於定位出錯機器;
  • 更強大的訪問速度限制模塊;
  • backtrace模塊,程式崩潰的時候可以顯示出錯的調用棧;
  • 根據文件類型設置過期時間;

只是目前還沒看到有多少人在使用, 只是就文件看起來, 數字還不錯, 就 Comet 實際都有 30萬台的連接數~ 也有架構圖可以參考, 只是設定檔和相關設定文件似乎還沒齊全, 就持續期待囉~ :)

by Tsung at December 28, 2011 05:16 PM

jserv

「淺談探索 Linux 系統設計之道」簡報上線

去年小弟在 Study-Area 分享一場主題為「自己動手,豐衣足食 -- 淺談探索 Linux 系統設計之道」的演講,獲得頗多迴響,該議程從 Linux 核心的經典設計,全程以軟體開發者的觀點,探訪核心與週邊硬體互動的機制,試圖找出關聯性,進而將這些「鑰匙」串連並探索系統內部,簡報已上線,請見 [linux-discovery.pdf] 淺談探索 Linux 系統設計之道 View more presentations from Jim Huang 雖然在暑期的台南舉辦,且不幸空調無法正確運作而造成遺憾,但前來指教與討論的朋友仍不少,這讓小弟對分享系統程式原理的知識,有頗大的鼓舞。預計近期除了探討 [用 Android 學習系統程式] 一類的題材外,還規劃了從分析 toolchain 原理、核心與使用者層級互動,到改善整體系統效能和穩定度的系列演講,請多多指教,謝謝!...

by jserv at December 28, 2011 02:01 PM

jouston

倚天忘形(ET26)輸入法iOS (iPhone/iPad) 移植至iAcces 改版 v0.5

慶祝 iOS 5.0.1 終於可以JB(越獄),再次改版至v0.5,適用iAcces 4.99上。這個版本我又再次改善安裝方式,只要解開來丟進iAcces.app的目錄裡面、套用鍵盤、重開機就搞定。

解開之後有些說明,有任何問題煩請先看一下我寫的說明檔。

iAcces5-Taiwan_ET26_v0.5.zip

有任何問題請多多指教,不過我不見得有時間解決你的問題就是。我會盡量啦~~~

by noreply@blogger.com (Jouston Huang) at December 28, 2011 01:49 PM

December 27, 2011

tsung

找出 Linux 是否有隱藏的 Process 與 Port - unhide

作業系統內, 最怕的就是有不知道的程式在跑(安全性問題), 特別是又找不到, 俗稱木馬. XD


平常都使用 chkrootkit, 於此篇(找出隱藏的 process 及 port)看到還有 unhide 可以用~

於 Debian / Ubuntu Linux 安裝 unhide

  • sudo apt-get install unhide

unhide 簡介

  • unhide - forensic tool to find hidden processes
  • unhide-tcp - forensic tool to find hidden TCP/UDP ports

unhide 使用方式

  • sudo unhide proc # 查看是否有隱藏的 Process
  • sudo unhide sys # 查看是否有隱藏的 Process
  • sudo unhide-tcp # 查看是否有隱藏的 Port

by Tsung at December 27, 2011 05:05 PM

December 26, 2011

Cornelius

Onion For PHP: Announcing Onion 0.0.10 bundle feature

We currently released Onion 0.0.10-alpha, this version introduced a bundle feature, which can install PEAR package dependencies into a vendor directory.

You can define your PEAR package dependencies in package.ini, and run onion.phar -d bundle, onion will install dependencies locally, and root permission is not needed.

Currently, Onion is using bundle command to install Onion's dependencies, and run onion compile command to compile src/, vendor/pear/ and a SPLClassLoader into a phar file.

You can also use Onion to compile your library into a plain library phar file or executable phar file, you can check the script "scripts/compile.sh".

Since Pyrus didn't document much of its PackageXml parser and Channel Discover, and it's not independent component, I wrote a built-in PEAR channel discover and a simple package.xml parser for this, which is pretty fast already. but the channel information is not cached yet. Once the cache stuff is done, this could be more faster than current one.

I've tested many PEAR packages from Symfony, PHPUnit, PHPSpec, most of them works fine, but may have some bugs still, If you encountered, please send an issue on GitHub/Onion repository.

Onion project is hosted on GitHub, patches and feature request are welcomed.

Here is the screenshot:




Related Tweets:

https://twitter.com/#!/yuya_takeyama/status/150642017003778050
https://twitter.com/#!/yuya_takeyama/status/150627664917577728
https://twitter.com/#!/yuya_takeyama/status/150619889244180481

by Yo-An Lin (noreply@blogger.com) at December 26, 2011 11:56 PM

tsung

王品集團 的 孕婦特別條款

看到此篇新聞, 王品集團 的 憲法規定 - 孕婦最大, 新聞列出下述:

  • 補助生育津貼
  • 懷孕員工應安排較輕鬆的工作
  • 可隨時休息
  • 可隨時去看醫生或回家, 不需事先請假
  • 開會可優先坐在門邊位子, 方便結束後優先離開, 不想聽也可隨時離開

政府現在一直想要鼓勵生育, 這才叫獎勵生育阿~ XD

新聞摘錄: 隨時可請假…王品憲法「孕婦最大」

王品集團不但有津貼補助生育的員工,同時還有「孕婦特別條款」,主軸就是「孕婦最大!」懷孕員工想休息可隨時請假、開會孕婦先選座,並享有優先離開權,避免被人潮擠壓

王品的「孕婦特別條款」構想,來自董事長戴勝益,員工戲稱特別條款是「王品憲法」,員工一旦懷孕,在王品職場立即「地位」調升,享有各種人性化的貼心「優惠」。

特別條款明文要求各單位主管需關照單位內懷孕員工,一切以健康為第一,特別條款不僅適用於企業總部,各品牌店鋪也同樣適用。

條款規定,懷孕員工應安排較輕鬆的工作,可隨時休息,有特權隨時去看醫生或回家,不需事先請假;開會可優先坐在門邊位子,方便結束後優先離開,「不想聽也可隨時離開。

品牌部的黃小姐是兩個孩子的媽,「因為孕婦條款,懷孕時真的備受禮遇」,同事會體恤她不宜舟車勞頓,主動幫她出差;員工Gigi剛生產完,回憶懷孕時「不論開會、聚餐,主管會主動幫我拉椅子、拿靠墊」。她表示,在王品孕婦條款不只是條文,同事間的體貼更無所不在,「以前工作的同事,不婚的多,來到王品後,幾乎都生二、三個。」

【聯合報╱記者莊亞築/台中報導】 2011.12.26 03:18 am

by Tsung at December 26, 2011 05:30 PM

jserv

「軟體又熱又平又擠」簡報上線

上週五 (Dec 23) 應國立成功大學資訊工程系盧文祥教授的邀約,給予一場標題為「軟體又熱又平又擠:淺談開放原始碼軟體衝擊下的新思維」的演講,恰好演講地點就在十二年前,我參加大學推薦甄選的面試指定教室,而這場演講可說是自己心靈與知識成長的紀錄,簡報檔案已上線,請見: 軟體又熱又平又擠:淺談開放原始碼軟體衝擊下的新思維 View more presentations from Jim Huang 在開放原始碼軟體衝擊下,不僅給予我們新的機會,也促使我們得快速的改變既有概念,我選定這個題目的考量,著眼以下三者: 熱:軟體在多樣的應用 平:軟體作為破壞性技術 擠:軟體在爆炸性的規模 感謝老師與同學們的指教。...

by jserv at December 26, 2011 08:52 AM

December 25, 2011

tsung

iPad2 與 Thinkpad X220i 入手

於 2011-12-24 入手 iPad2 和 Lenovo(IBM) ThinkPad X220i, 感謝公司給的聖誕禮物~

IMG_1878

在此把規格先做個記錄, 之後再來補充其他的資訊

Lenovo ThinkPad X220i - i3-2310 (A13) 規格

  • 官方網站介紹: Lenovo - ThinkPad X 系列
  • 處理器: Intel Core i3-2310M Processor (2.1G - 3MB)
  • 記憶體: 4G + 4G DDR3 1333MHz
  • 硬碟機: 320GB(7200rpm)
  • 顯示卡: Intel GMA HD 3000 (內建)
  • 螢幕: 12.5 吋 HD(1366x768) LED 背光面板 TFT /200nits / 16:9 (無IPS面板)
  • 網路: 802.11bg/N、藍芽3.0
  • 其他: 內建視訊、指紋辨識、APS智慧型硬碟防震
  • 保固: 三年全球保固(電池為一年保固)
  • 電源: 65W 20V
  • 視訊: 720P
  • 網路卡: Intel 1000BGN
  • 電池: 4cell (3.1hr) + 6cell
  • 重量: 1.35Kg (含電池)
ThinkPad 的尺寸記錄
  • E220s 尺寸: 313 x 213.5 x 21.9mm
  • X220 與 X220i 尺寸: 305 x 206.5 x 19-34.6mm

 iPad2 規格

官方介紹: Apple - iPad 技術規格與周邊配件, 下述摘錄自原廠規格:

尺寸、規格、重量
  • 高度: 241.2 公釐 (9.50 吋)
  • 寬度: 185.7 公釐 (7.31 吋)
  • 厚度: 8.8 公釐 (0.34 吋)
  • 重量: 601 公克 (1.33 磅)
  • 儲存: 16GB
無線網路與行動網路
  • Wi-Fi (802.11a/b/g/n)
  • Bluetooth 2.1 + EDR 技術
晶片
  • 1GHz 雙核心 Apple A5 自行設計高效率低耗能內嵌系統晶片
顯示器
  • 9.7 吋 (對角線) LED 背光鏡面寬螢幕 Multi-Touch IPS 顯示器
  • 1024 x 768 像素,132 ppi 解析度
  • 防指印疏油外膜
  • 支援多種語言文字同時顯示
鏡頭、照片與影片錄製
  • 後端鏡頭:錄影、HD (720p) 可達每秒 30 影格且具有音訊;靜態鏡頭可進行 5 倍數位縮放
  • 前端鏡頭:錄影、VGA 可達每秒 30 影格且具有音訊;VGA 品質的靜態相機
  • 影片或靜態影像輕點對焦
  • 透過 Wi-Fi 進行照片與影片的地理標記
電源與電池4
  • 內建 25Whr 可充電鋰聚合物電池
  • Wi-Fi 無線上網、觀賞影片或聆聽音樂最高可持續 10 小時
  • 透過電源轉換器或電腦 USB 埠充電
輸入與輸出
  • 30 針 Dock 底座連接埠
  • 3.5 公釐立體聲耳機插孔
  • 內建揚聲器
  • 麥克風
感應器
  • 三軸向陀螺儀
  • 加速感應器
  • 環境光線感應器
定位功能
  • Wi-Fi
  • 數位羅盤
音訊播放
  • 頻率響應:20Hz 到 20,000Hz
  • 支援音訊格式:HE-AAC (V1 and V2), AAC (8 至 320 Kbps), Protected AAC (來自 iTunes Store), MP3 (8 至 320 Kbps), MP3 VBR, Audible (formats 2, 3, and 4, Audible Enhanced Audio, AAX, and AAX+), Apple Lossless, AIFF, and WAV
  • 用戶可自行設定的最大音量限制
  • 透過 Apple Digital AV Adapter (另外販售) 提供 Dolby Digital 5.1 環繞音效穿透技術
電視與視訊
  • Video mirroring 鏡像輸出技術與視訊輸出支援:使用 Apple Digital AV Adapter 或 Apple VGA Adapter (接線另外販售) 可達 1080p
  • 使用 Apple Component AV Cable 的視訊輸出支援為 576p 與 480p;使用 Apple Composite AV Cable 則為 576i 與 480i
  • 支援的視訊格式:使用 H.264 編碼的視訊格式,最高可達 720p,每秒 30 格;音訊規格為採用 Main Profile level 3.1 的 AAC-LC 立體聲音訊,最高可達 160 Kbps,48kHz;使用 MPEG-4 編碼的 .m4v、.mp4 與 .mov 檔案格式,最高可達 2.5 Mbps。視訊規格為 640 x 480 像素,每秒 30 格。音訊規格為採用 Simple Profile 的 AAC-LC 立體聲音訊,每個聲道最高可達 160 Kbps,48kHz;使用 Motion JPEG (M-JPEG) 編碼的 .avi 檔案格式,最高可達 35 Mbps。視訊規格為 1280 x 720 像素,每秒 30 格,音訊規格為 PCM 立體聲 ulaw,檔案格式為 .avi 檔案
電子郵件附件支援格式
  • 可顯示的文件類型:.jpg、.tiff、.gif (圖片); .doc 及 .docx (Microsoft Word); .htm 及 .html (網頁); .key (Keynote); .numbers (Numbers); .pages (Pages); .pdf (預覽程式與 Adobe Acrobat); .ppt 及 .pptx (Microsoft PowerPoint); .txt (text); rtf (rich text format); .vcf (連絡人資訊); .xls 與 .xlsx (Microsoft Excel)
環境需求
  • 操作溫度:0℃ 至 35℃ (32℉ 至 95℉)
  • 非操作溫度:-20° 至 45°C (-4° 至 113°F)
  • 相對濕度:5% 至 95% 間,非冷凝狀態
  • 最高操作高度:3,000 公尺 (10,000 呎)

相關照片

IMG_1872

IMG_1879

by Tsung at December 25, 2011 05:43 PM

fred

從 Linux Kernel 出發看!探討 Process 組成結構!

對所有電腦使用者而言,執行一支應用程式就像吃蛋糕一樣簡單。對於程式開發者而言,寫支 Hello World Program 並跑起來,也是三十秒內可以完成的事。但是,這樣容易的動作,其實底層有著複雜的機制,否則短短十行程式碼的 Hello World 能夠動起來,真的是奇跡了。想要知曉程式是怎麼被作業系統執行,要追溯到 Process 的機制,在研究過 Linux Kernel 的 Process 相關機制後,一切就將明朗。

註:在本篇文章內,都將會假設 binary program 已經被作業系統解析並放到記憶體執行,說明只著重於 Process 的部份 。雖然 Process 與 binary program 和其載體息息相關,但本文不會討論 ELF 的細節,有興趣的讀者可以自己去尋找相關文件閱讀。

若你是程式開發者,對『Process(程序)』一詞應該不陌生。嚴格來說, Process 就是處於執行狀態的程式,如果參考一些原文書或英文文獻,它們也許會這樣定義:『Process is a program in execution』。所以我們可以認定,Process 的組成,是擁有著『程式執行檔的 binary code + 記錄資料的記憶體』。

本文將 Process 分成內外兩個角度來探討:
  1. 從 Process 內部,程式執行的觀點 
  2. 從 Process 外部,也就是作業系統的觀點 

程式執行的觀點

單純以 Process 內部的角度來看,Process 就是一般的程式碼被放到記憶體執行。曾於舊文『Linux 下程序的記憶體映射』略為提及,一支程式擁有著數個 segments(區段),並仰賴著這些 segment 來持續運作。大致上來說,每個 segment 有不同的用途:
  • Code Segment - 存放主要程式
  • Data Segment - 存放已被初始化並賦予值的全域變數
  • BSS Segment - 紀錄尚未被賦予值的全域變數
  • Stack Segment(Stack/Heap) - 紀錄 Process 在執行時動態註冊的變數包括 function 中的 local variable

對程式本身來說,會動態並隨機使用的是 Stack Segment,程式向作業系統(OS) 要記憶體空間後,就可以在 Stack Segment 讀寫該記憶體空間。而實際上 OS 底層的行為,是配置記憶體, 然後映射到 Stack Segment 供程式使用。

作業系統的觀點

與程式觀點相呼應,作業系統有記憶體管理機制,其建立虛擬記憶體空間,將程式對映進去該空間後,開始執行。作業系統管理著 Process 所擁有的 Segments,為每個 Segment 都配置了『虛擬記憶體區域(VMA, Virtual Memory Area)』。

在 Linux 之下,我們可以透過 cat /proc/<Process ID>/maps 的方式去取得一個 Process 所用到的記憶體,以下是觀察系統上的 bash(PID=18165):
$ cat /proc/18165/maps
08048000-0810a000 r-xp 00000000 08:01 1851399    /bin/bash
0810a000-0810f000 rw-p 000c1000 08:01 1851399    /bin/bash
0810f000-08114000 rw-p 00000000 00:00 0
08752000-08a46000 rw-p 00000000 00:00 0          [heap]
b737b000-b7396000 r--p 00000000 08:01 28598806   /usr/share/locale/zh_TW/LC_MESSAGES/libc.mo
b7396000-b73a0000 r-xp 00000000 08:01 12755293   /lib/i386-linux-gnu/i686/cmov/libnss_files-2.13.so
b73a0000-b73a1000 r--p 00009000 08:01 12755293   /lib/i386-linux-gnu/i686/cmov/libnss_files-2.13.so
b73a1000-b73a2000 rw-p 0000a000 08:01 12755293   /lib/i386-linux-gnu/i686/cmov/libnss_files-2.13.so
b73a2000-b73b5000 r-xp 00000000 08:01 12755189   /lib/i386-linux-gnu/i686/cmov/libnsl-2.13.so
b73b5000-b73b6000 r--p 00012000 08:01 12755189   /lib/i386-linux-gnu/i686/cmov/libnsl-2.13.so
b73b6000-b73b7000 rw-p 00013000 08:01 12755189   /lib/i386-linux-gnu/i686/cmov/libnsl-2.13.so
b73b7000-b73b9000 rw-p 00000000 00:00 0
b73ca000-b73cc000 r--p 00000000 08:01 28600275   /usr/share/locale/zh_TW/LC_MESSAGES/bash.mo
b73cc000-b73d3000 r--s 00000000 08:01 28666899   /usr/lib/i386-linux-gnu/gconv/gconv-modules.cache
b73d3000-b754a000 r--p 00000000 08:01 28615144   /usr/lib/locale/locale-archive
b754a000-b754b000 rw-p 00000000 00:00 0
b754b000-b7568000 r-xp 00000000 08:01 12755040   /lib/i386-linux-gnu/libtinfo.so.5.9
b7568000-b756a000 r--p 0001c000 08:01 12755040   /lib/i386-linux-gnu/libtinfo.so.5.9
b756a000-b756b000 rw-p 0001e000 08:01 12755040   /lib/i386-linux-gnu/libtinfo.so.5.9
b756b000-b76be000 r-xp 00000000 08:01 12755289   /lib/i386-linux-gnu/i686/cmov/libc-2.13.so
b76be000-b76bf000 ---p 00153000 08:01 12755289   /lib/i386-linux-gnu/i686/cmov/libc-2.13.so
b76bf000-b76c1000 r--p 00153000 08:01 12755289   /lib/i386-linux-gnu/i686/cmov/libc-2.13.so
b76c1000-b76c2000 rw-p 00155000 08:01 12755289   /lib/i386-linux-gnu/i686/cmov/libc-2.13.so
b76c2000-b76c6000 rw-p 00000000 00:00 0
b76c6000-b76c8000 r-xp 00000000 08:01 12755049   /lib/i386-linux-gnu/i686/cmov/libdl-2.13.so
b76c8000-b76c9000 r--p 00001000 08:01 12755049   /lib/i386-linux-gnu/i686/cmov/libdl-2.13.so
b76c9000-b76ca000 rw-p 00002000 08:01 12755049   /lib/i386-linux-gnu/i686/cmov/libdl-2.13.so
b76ca000-b76ec000 r-xp 00000000 08:01 12755034   /lib/i386-linux-gnu/libncurses.so.5.9
b76ec000-b76ed000 r--p 00021000 08:01 12755034   /lib/i386-linux-gnu/libncurses.so.5.9
b76ed000-b76ee000 rw-p 00022000 08:01 12755034   /lib/i386-linux-gnu/libncurses.so.5.9
b76f4000-b76fd000 r-xp 00000000 08:01 12754995   /lib/i386-linux-gnu/i686/cmov/libnss_nis-2.13.so
b76fd000-b76fe000 r--p 00008000 08:01 12754995   /lib/i386-linux-gnu/i686/cmov/libnss_nis-2.13.so
b76fe000-b76ff000 rw-p 00009000 08:01 12754995   /lib/i386-linux-gnu/i686/cmov/libnss_nis-2.13.so
b76ff000-b7705000 r-xp 00000000 08:01 12755103   /lib/i386-linux-gnu/i686/cmov/libnss_compat-2.13.so
b7705000-b7706000 r--p 00005000 08:01 12755103   /lib/i386-linux-gnu/i686/cmov/libnss_compat-2.13.so
b7706000-b7707000 rw-p 00006000 08:01 12755103   /lib/i386-linux-gnu/i686/cmov/libnss_compat-2.13.so
b7707000-b7708000 r--p 00176000 08:01 28615144   /usr/lib/locale/locale-archive
b7708000-b770a000 rw-p 00000000 00:00 0
b770a000-b770b000 r-xp 00000000 00:00 0          [vdso]
b770b000-b7726000 r-xp 00000000 08:01 12755299   /lib/i386-linux-gnu/ld-2.13.so
b7726000-b7727000 r--p 0001b000 08:01 12755299   /lib/i386-linux-gnu/ld-2.13.so
b7727000-b7728000 rw-p 0001c000 08:01 12755299   /lib/i386-linux-gnu/ld-2.13.so
bf916000-bf937000 rw-p 00000000 00:00 0          [stack]

大致上來說可以看到有這些 VMA 的存在(已省略會偏離主題的 VMA):
08048000-0810a000    Code
0810a000-0810f000   Data
08752000-08a46000   Heap
bf916000-bf937000   Stack

對於作業系統而言,管理這些記憶體和程式狀態,才是真正的重點。所以,就作業系統核心的角度來看 Process,可以從排程的程式來切入瞭解。翻閱 Linux Kernel 原始程式碼的檔案『include/linux/sched.h』,Process 的狀態結構被定義在 struct task_struct 之中,而其中的 mm 就是記錄著該 Process 的記憶體配置資訊,我們可以從中得到 Process 當前所擁有的全部 VMA 和 Segments 所在位址:
struct task_struct {
        ...
        struct mm_struct *mm, *active_mm;
        ...
};
struct mm_struct {
        struct vm_area_struct * mmap;           /* list of VMAs */
        ...
        unsigned long start_code, end_code, start_data, end_data;
        unsigned long start_brk, brk, start_stack;
        ...
};

另外,從『include/linux/mm.h』可以找到 VMA 的串列資料結構定義:
struct vm_area_struct {
        struct mm_struct * vm_mm;       /* The address space we belong to. */
        unsigned long vm_start;         /* Our start address within vm_mm. */
        unsigned long vm_end;           /* The first byte after our end address
                                           within vm_mm. */
        ....
        /* linked list of VM areas per task, sorted by address */
        struct vm_area_struct *vm_next;
        ....
}

後記

若要繼續追查下去,還有動態連結的部份要探討,會牽涉到更多機制,由於篇幅有限,下次有時間再來寫完。

by noreply@blogger.com (Fred Chien(錢逢祥)) at December 25, 2011 09:21 AM

December 24, 2011

Cornelius

Access 97, ODBC, unixODBC, iODBC, mdbtools 問題處理記錄

今天處理 Microsoft Access Database 的問題就花上了一整天 ...

簡單介紹一下該死的 MS Access Database (*.mdb) 是微軟發展的資料庫引擎,從 Access 97 使用 Jet 3.5 版本,從 Access 2000 時則採用 Jet 4.0 版本。

可以在 DSN 時指定 Provider 參數 Provider=Microsoft.Jet.OLEDB.4.0 指定 Jet OLEDB 的版本。


而在 Unix 系統上大致上有多款 Jet Database Engine 的實作 (應該是反向工程而來的) ,譬如:


首先 mdbtools 是由 C 寫成,可讀取 Access 97 版本以上的 mdb 檔案,不過在編碼的部份有點問題,若 Access 97 內使用 Big5 ,似乎沒辦法順利透過 mdbtools 提供的 charset 環境變數來指定,程式碼中使用到 iconv 的環境變數有:

MDBICONV=UTF-8
MDB_JET3_CHARSET=Big-5

該 JET3_CHARSET 為資料庫編碼,MDBICONV 為內部編碼,但這個解法無效,頂多只能讀出 Table 以及各 Table 資料內的比數,但由於 Access DB 的開發人員相當蠢,直接用 Big5 編碼的字元當做 Table Name ,所以無效。

後來也嘗試使用 mdbtools 將讀取出的 Table Name 利用 mbstring convert encoding 試著從 Big5 轉為 UTF-8 ,但這條路也不通,但讀出的字元是 ASCII 沒錯 (should be Big-5),這部份不知道是否有長輩有解答 ?

但我想只要該 DB 內資料若使用 ASCII 或是 ISO8859-1 的話應該是可以運作順利。

Jackcess 主要由 Java 所寫成,目前看起來可靠度最高,但是不支援 Access 97 以下版本,除此之外其他的 Jet Database 都支援,程式碼內也有 junit 所寫成的單元測試,測試各種格式的資料庫版本,不過因為不支援 Access 97 ,所以沒有繼續嘗試,否則應該是很好的跨平台解決方案。



資料庫介面的部份可以透過 ODBC 或是 iODBC 或是 Windows 上的 COM 元件來建立 ADODB 連線來讀取 Access Database 的資料庫,也可透過 ActiveXObject 建立 ADODB 連線。

不幸的地方在於,Unix 上的 mdbtools 既然無法運作正確,再接著用 ODBC 指定 Driver 為 mdbtools 也無用了。 否則應該是可以透過下列方式連結:

// With DSN
$connection = odbc_connect("access_db",'','');

// For Windows, DSN-less
$connection = odbc_connect("Driver={Microsoft Access Driver (*.mdb)};Dbq=$mdbFilename", $user, $password);

不過 ODBC 的部份光是指定 mdbtools 連連線都有問題。


接著嘗試使用 Windows 7 64bit 建立連至 Access 97 mdb 檔案的 ODBC 連線,發現 Jet Database Engine 並不支援 64bit Windows 7 ,有看到大概的解法,但我嘗試過也不行:

C:\Windows\SysWow64\odbcad.exe

所以只好轉而裝個 Virutalbox Windows XP 建立 ODBC 連線,連線沒問題,但同樣也卡在編碼。

整個 Google 都快翻過來的沒看到任何可以對 Access *.mdb 指定 CodePage 或是 Charset 的方法,或是嘗試了完全無效。

總之嘗試了以下大概幾種:

* Windows PHP 內的 COM 元件建立 ADODB.Connection
* JScript 使用 ActiveXObject 建立 ADODB.Connection
* PHP odbc_connect 連線

這三種途徑在 Windows XP 32bit 上都可順利連線,取得資料表清單,但仍是有編碼問題。

也就是說,就算是用微軟自己的 JScript (CScript) 都沒辦法正確讀出字元

推測大概還有幾種解決方法:

- 使用 Access 2010 把 Access 97 轉為較新版本的 mdb。
- 使用 MySQL Migration Toolkit 轉匯入至 MySQL (不過在新版的 MySQL 內卻找不到 Migration Toolkit 了,是否有分割出來 ? )

但我想編碼的方式應該還是有辦法解決,只是時間上的問題罷了。XD






by Yo-An Lin (noreply@blogger.com) at December 24, 2011 01:11 PM

December 23, 2011

fred

如何在 Debian 建置 NodeJS + Express 環境

截至目前為止,只有 Debian Sid(unstable) 提供 Nodejs 和 Express 套件可讓使用者直接安裝。但是,在 Server 的環境之下,一般都使用 Debian 5.0/6.0 (Lenny/Squeeze) 穩定版的系統,因此沒有套件可以直接安裝,唯一的方法就是自己下載編譯 Nodejs。還好自己手動安裝的過程並不困難,幾個步驟就可以完成。

安裝 Nodejs

更新系統並安裝編譯 Nodejs 所需的套件:
sudo apt-get update
sudo apt-get install git-core curl build-essential openssl libssl-dev

從 Git Repository 下載 Nodejs 原始碼:
git clone https://github.com/joyent/node.git

進入 Nodejs 原始碼目錄,並切選擇我們要的版本(截至本文,0.6.6 是最新版):
cd node
git checkout v0.6.6

# Note: 可以使用 git tag 看到 Nodejs 所有的版本列表

編譯並安裝 Nodejs (預設會裝到 /usr/local/lib/node):
./configure
make
sudo make install

如果安裝過程中沒有任何問題,就可以使用 node 指令查看 Nodejs 的版本了:
node -v

手動設定公用的 Nodejs Module 路徑:
echo "NODE_PATH=/usr/local/lib/node_modules" >> .bashrc

# Note: 如果想讓所有 Server 上的 user 都套用設定,可以放在 /etc/profile


安裝 Express Web Framework

使用 npm 安裝 express(使用 -g 選項會安裝到公用的目錄 /usr/local/lib/node_modules):
sudo npm install express -g

Express 通常預設使用 jade template engine,也需要手動安裝:
sudo npm install jade -g

安裝完成後,就可以立即測試 nodejs + express:
mkdir test
cd test
express
node app.js

如果從瀏覽器可以看到畫面,就代表安裝成功:
http://ServerIP:3000/

後記

截至本文,Debian Sid 的 Nodejs 套件還是 0.4.12 版本,如果想要用新的 Nodejs,就要透過本文的方法來安裝。

by noreply@blogger.com (Fred Chien(錢逢祥)) at December 23, 2011 05:18 AM

December 22, 2011

tsung

手機 Apps 最佳 和 最糟 的發佈時間是星期幾

手機軟體 / 應用程式(Apps) 最佳 和 最糟 的發佈時間 是 星期幾? 這個應該和平常大眾使用習慣有關係, 這篇的統計資訊可以參考看看.

註: Android vs iOS (iPhone) Apps

手機 Apps 最佳 和 最糟 的發佈時間是星期幾?

下述總結參考自此篇文章: 週幾是發佈應用的最佳和最糟糕的日期?

  • 週日 發佈下載的情況最好, iOS 42% 能進入 Top 240, Android 11% 能進入 Top 240
  • 週四 是發佈 Android Apps 最糟糕的時間, 只有 7% 能進入 Top 240
  • 週五 是發佈 iOS Apps 最糟糕的時間, 只有 10% 能進入 Top 240
  • iOS 的應用程式被發現的機率 是 Android Market 的 4倍.

by Tsung at December 22, 2011 05:37 PM

December 21, 2011

tsung

JavaScript 要如何將參數傳入 setTimeout()

JavaScript setTimeout() 蠻常會使用到的, 使用方法很簡單(如下述), 但是要怎麼將參數帶進去?

setTimeout 使用方式

範例

setTimeout("hello", 1000); // 每1秒執行一次 hello().

setTimeout("hello()", 1000); // 每1秒執行一次 hello().

若是要將參數傳進去, 要注意的是 "javascript statement" 此為 函式名稱(Function name), 而且是"字串".

參數帶入的方式如下範例

setTimeout("move_to(" + move_pos + ")", 1000); // 每秒執行一次 move_to(move_pos), move_pos 是變數值.

setTimeout("move_to(" + move_pos_x + "," + move_pos_y)", 1000); // 每秒執行一次 move_to(move_pos), move_pos 是變數值.

附註

  • 若是 setTimeout(hello, 1000);, (沒有指定 hello 為字串) 會無窮盡的執行 hello(). XD

by Tsung at December 21, 2011 05:49 PM

December 20, 2011

tsung

金錢豹的異業結合計畫 - 籌設大學

金錢豹目前應該算是台中或者說台灣最大的酒店, 金碧輝煌, 沒想到酒店有這麼偉大的計畫, 要籌設大學~

金錢豹集團下一步…籌設大學

前幾天看到此篇新聞: 金錢豹集團下一步…籌設大學, 下述完整轉載自此篇:

金錢豹餐飲娛樂集團確定返台進軍餐飲市場,集團籌設的台中葳格高中則訂明年開始招生,為兩岸培育餐飲專業人才,集團總裁袁昶平已擬妥下一個目標將籌設大學。

金錢豹集團投資20億元,在台中市北屯十期重劃區規劃興建的葳格高中,校舍結構體已快完工。最近,袁昶平還挖角剛從台中市教育局退休的前副局長張光銘,擔任首任校長。

葳格高中明年8月將招收高中、高職部學生。袁昶平說,兩岸都在拚觀光,餐飲服務業人才需求急迫,葳格高職部設有餐飲、觀光及應用外語三科,其中餐飲科將招生五班,引進最新中、西餐烹調設備,也會加強學生英、日語能力。

袁昶平不諱言,籌設葳格高中,主要配合股票上市與兩岸餐飲市場需求,未來餐飲類科畢業生「保證就業」。而葳格高中首屆餐飲科畢業生,可望進入規劃中的台中第一家金錢豹自助百匯餐廳實習或上班。

屬於金錢豹集團旗下的葳格教育體系,由袁昶平、魏雲菱夫婦一手創辦,89年先興辦葳格幼稚園,二年後創立葳格雙語小學,95 年成立國中部,一學期學費動輒十餘萬元,被視為中部的貴族學校。

由餐飲娛樂轉型跨入教育事業的袁昶平,下一個目標是計畫籌辦大學,最近已在尋覓適合地點,也不排除直接併購現有大學。

籌設大學應該是個不錯的計畫, 但是 金錢豹的行業特性, 再加上新聞寫的 "保證就業", 直覺就想到, 金錢豹開始整合上下游資源, 以後坐檯小姐可能會有學生證~  XD

相關網頁

by Tsung at December 20, 2011 05:50 PM

fred

Nodejs + Express 的 Route 流程規劃

如大多數人的習慣,往往我們都把 Route 的路徑都定義在 app.js 當中。Express 所提供的眾多範例程式中,雖然有將 Route 抽出來放在 routes 目錄下的實作方式,但也太簡單,只支援一層的設計。這意味著,如果 routes 之下有更多子目錄,放著更多的 route 設定,都是不會被讀取的。

這邊做了簡單的修改,利用遞迴的做法,掃描所有的子目錄,然後去載入所有的 js 檔案以擴充 Route 的設定。

以下是 route.js 的程式碼:
var vm = require('vm');
var fs = require('fs');

module.exports = function(app) {
var dir = __dirname + '/routes';
var context = {
app: app,
require: require
};
var newContext;

/* Initializing Context */
for (var key in global)
context[key] = global[key];

newContext = vm.createContext(context);

/* Loading all routes */
loadRouteDir(newContext, dir);
};

function loadRouteDir(context, path) {
/* Scanning files */
fs.readdirSync(path).forEach(function(file) {
loadRouteFile(context, path, file);
});
}

function loadRouteFile(context, path, file) {
var fullpath = path + '/' + file;

fs.stat(fullpath, function(err, stats) {
if (stats.isFile()) {
/* Loading route */
var str = fs.readFileSync(fullpath, 'utf8');
vm.runInContext(str, context, file);
} else if (stats.isDirectory()) {
/* Loading sub-directory */
loadRouteDir(context, fullpath);
}
});
}

在 app.js 中只要這樣使用即可:
/* app is Express Server  */
require('./route')(app);

by noreply@blogger.com (Fred Chien(錢逢祥)) at December 20, 2011 12:16 AM

December 19, 2011

tsung

Ubunut Linux 抓取 USB 網路卡

網路卡掛掉, 決定臨時使用 USB 網路卡頂著用, 但是接上去後, 只有找到 USB 裝置而已, 並不認識這是網路卡, 要怎麼解決?

Ubunut / Debian Linux 驅動 USB 網路卡 安裝步驟

  1. 確定 dmesg 有抓到 USB 網路卡
  2. modprobe g_ether
  3. 再次查看 dmesg 就會有 usb0, usb1 .. 可以用, 再用 dhclient 或任何抓 IP 的方式即可.

相關網頁

by Tsung at December 19, 2011 05:34 PM

mason

notes for Oracle 11gR2 grid on Oracle Linux 6.1 within virtualbox

1. 每一台都設定三張網卡,第一張 bridged mode,其餘host only,並將 promiscuous mode 設定為 allow VMs,第一張做為與virtualbox host機器溝通用,第二張為 grid 的 public,第三張為 grid 的 private.這是因為在 bridged mode 的 multicast 會失敗。


2. 找一台鄰近的機器當 ntp server,如果只是設定跟 stdtime.gov.tw 校時,校正過程 oracle 會認為太久,安裝前後的檢查會有警告。然後 /etc/sysconfig/ntpd 內的指令加入 -x


3. 每一個 node 的 dnsmasq 皆 on,並使/etc/hosts檔案內容皆相同,然後 /etc/resolv.conf 設定 nameserver 為自身的 public interface.如此一來較不易出現安裝過程的查詢之後出現不同的接果。因為安裝過程會利用 /etc/resolv.conf 裡面的設定去做查詢。


4. 安裝最後的檢查會說跟 vip 無法溝通,此時在終端以 ssh 到各個 node 的 vip 之後再檢查一次就可順利通過。

by nospam@example.com (Dante Mason) at December 19, 2011 04:49 PM

Cornelius

Predis is using Onion to build PEAR package.

Predis is using Onion

I'm glad to see this, nrk uses Onion to build their PEAR package.

predis commit: https://github.com/nrk/predis/commit/104cd1eae7f3fb2bff3ccd3193c3e31b8502af56

Use Onion to build PEAR packages of Predis.
Since Pearhub is currently broken (unfortunately the project does not seem to
be actively mantained anymore) but we still want to have PEAR packages for our
library, we need to automate the creation of a package.xml definition file to
build the actual packages that will be uploaded on a self-hosted PEAR channel.

Onion, while still in its alpha stage right now, works perfectly fine for our
needs and its own package.ini file looks simple enough to edit and maintain.

See http://c9s.github.com/Onion for more details about Onion and thank @c9s
for making it available.

by Yo-An Lin (noreply@blogger.com) at December 19, 2011 12:08 PM