2011年12月25日 星期日

意識自己無知的陷阱 You don't know what you don't know


這篇的起源是英文的一句:You don't know what you don't know
可以參考:The Danger: When you don't know what you don't know

直接翻譯可以寫成:我不知道我原本不知道、缺乏的知識。
這大概是單純抽象、簡約、習慣懶人包知識的情境下,最容易踩到的知識陷阱,
可能只是看到某句某人對一個龐大複雜知識的簡約說明,然後就被奉為規臬,甚
至依此演譯、推論出一連串錯誤的理解與認知,以這個角度看,規納法比起演繹
是較接近真實的知識,資料主體(Data driven)的思考方式,就可以對演繹思考進行
修正。


常見的無知陷阱包括:直覺、比喻法。因為要解釋的對象無法全面瞭解,所以只
好先以某些同構的已知部份進行比喻說明,但比喻法通常只是幫你入門、先期連
結知識的方式,而非代表該新知識的全部,但卻常常因為疏於精進,而停留在比
喻法階段,沒有真的去瞭解新知識。

一個避免無知陷阱的方式是,時時刻刻自問,我知道自己在寫、說什麼嗎?如果
連自我思緒都無法理解串連,又如何能確定表達、陳述了正確的思考與觀念?

一種思考方式是,質疑過於簡短的斷言式陳述,比如對於通常需要一本幾百頁書
籍才能陳述說明的主題知識,我們可以直接對於部落格上的單一篇短文進行質疑
與檢驗。

瞭解了無可避免的無知的陷阱後,也不是全面否定對於陷阱相關思考方式的價值
,而是教我們知道終身學習、持續精進、實作所學理論的必要性,唯有持續學習
、精進、動手實作才能避免掉入無知的陷阱。

當然聰明如你一定也想到了,這篇對 You don't know what you don't know
的解讀是不是也犯了沒有意識到對這句英文正確理解的無知陷阱裡呢?

2011年11月12日 星期六

摘譯:如何為公司貢獻心力

來源:GitHub http://speakerdeck.com/u/mojombo/p/optimizing-for-happiness

1. 沒有產品跟獲利的公司:創業公司
沒有人的公司:查無此公司

2. 如何決定你的職涯生活:
如果要我貢獻一生去成就公司的成功,那這家公司至少要讓我生活過得幸福快樂

3. 延續 1. 如果人才是公司最重要的資產,那獲利跟產品就是附屬品,當然錢財還是很重要的...

4. 投資在人身上,就可以打造最好的公司

5. 打造幸福快樂的公司是永不間斷的執行過程

6. 找到公司產品的超級粉絲,熱愛公司產品與服務的粉絲
對於公司內部,要找到最熱愛公司的員工(當然前提是你願意打造幸福快樂的公司)
注意上面這點完全沒提到錢,產品售價與公司獲利

7. 雇傭,面試:專業技能與符合公司文化
可以從自己人際網路開始,文化是否相符,就是合作時是否可以自在相處,同事聚會是否願意參加?

8. 薪資:要有足夠的薪資,讓進來的員工不會再去想自己薪資是否被低估的問題

9. 工作時間與地點:照員工喜好,真正提高生產力的最大秘訣是人性化管理

10. 工具:不要吝嗇給員工開發所需的工具,電腦硬體與軟體工具需求

11. 健康:人是公司最大資產,那員工的健康就是幸福快樂最重要的指標

12. 貢獻:不管是員工對公司或對他個人,學習與成長是必備技能,如果這方面缺太大,就可能要...

13. 公司提供員工因上班所需的搬家費用

14. 如果員工完成了不起的工作,會有現金紅利

15. 組織:公司不只有個人,團隊合作能力也是相當重要的評量

16. 重新思考可能性,一味的抄襲只是讓你保持平庸

17. 保持小團隊自我管理的優勢,從能力與優勢找出領導者

18. 找出共同願景(第五項修練?)

19. 個人彈性的角色調整,保持團隊重組的能力,與流動性的成長應對外在改變

20. 出貨:鼓勵產品的更新與出貨嘗試,降低不必要的出貨限制

21. 團隊成員工作時,鼓勵溝通與討論,增加成員的歸屬感與團隊內聚力

22. 工作與生活娛樂一樣認真,百分之百付出

23. 你也可以做到,找出不如你意的地方,利用科技解決,你也可以打造幸福快樂的公司

2011年9月29日 星期四

副食品-工具篇-Cuisinart CSB-76TW

Cuisinart CSB-76TW專業型手持攪拌棒 

Avent多功能儲存杯240ml
有180ml跟240ml兩種,建議買240ml

第二胎從寳寳四個月起開始吃副食品。作法及使用工具跟第一胎完全不同。我新添購Cuisinart CSB-76TW攪拌器,把一週份的副食品打成食物泥,裝入Avent多功能儲存杯,送進冷凍庫,每天晚上拿隔天要吃的份量到冷藏退冰,當餐要吃之前放進瓷的大碗公,用大同電鍋加熱。

Cuisinart 攪拌棒是在新光三越南西店的百靈牌專櫃買的,1990元,公司貨馬達保固三年。Avent多功能儲存杯則是透過網路,我選擇240ml,共買20個,含運905元,平均一個45元。儲存杯可以冷凍、冷藏、微波、消毒,還可重複使用五次以上。我只用來冷凍跟冷藏,清洗時也不會用菜瓜布刷,以避免有刮痕,到目前已經重複使用八次了。

使用Cuisinart攪拌棒製作副食品約2個月,它確實能將食物攪的很綿密。副食品菜單包括:糙米、綠花椰、紅蘿蔔、蘋果、洋蔥、高麗菜、地瓜,一大鍋煮起來要分多次攪拌,之前第一胎用貴夫人食物調理機就可以一次打多一點,但是清洗時不好洗,容易被杯子內的刀片割傷,而且運轉時聲音比較大。Cuisinart馬達聲音小一點,容易清洗,使用經驗是,連續攪拌會感覺馬達很燙,要休息一下,讓它冷卻散熱再繼續用,才能延長馬達壽命。

Avent多功能儲存杯是我看網路上很多媽媽推薦好用才去買的。第一胎我是用有蓋子的製冰盒,各種食物分開煮,依序打成泥,分別放入製冰盒,以冰磚方式儲存。

這一胎我改用所有食物通通一起煮,我看馬偕醫院小兒科醫師-黃瑽寧,他寫的一本書-「輕鬆當爸媽,孩子更健康」,裡頭介紹用「懶人電鍋法」製作「嬰兒分子美食」。

他將製作嬰兒食物之「懶人電鍋法」拍成影片放在youtube上,我照著做,發現做起來很輕鬆,寳寳也吃得非常好,SCH現在六個半月大,一餐食量約220ml,一天兩餐。吃副食品的兩餐就不喝奶。看寳寳吃得好不好,從大便即可得知。他自從吃食物泥後,一天大五次,顏色形狀都很漂亮,沒拉肚子也沒便秘。常常邊吃副食品邊大便。

葉菜類蔬菜我也是跟所有食物一起煮。很多人覺得用電鍋煮花椰菜、小白菜會煮得黃黃的,感覺很醜,所以會另外用川燙方式處理。但我看法不同。蔬菜如果另外用燙的,營養全流失在那鍋水裡頭,但若一起放入電鍋蒸,雖然醜,至少養分還在,反正最後也是打成食物泥,我覺得沒差。

SCH從滿四個月當天開始吃米精,吃完一盒貝康純米精300g跟一罐桂格敏兒HA米精600g後,就直接吃我煮的食物泥。從糙米泥開始,每三天加一種新食物,到現在準備進入蛋白質(雞肉、魚肉)階段,食量也持續增加中,等他一天有三餐都吃食物泥,我就準備讓他斷奶,讓副食品成為主食,奶反而退為補充安撫用。

2011年8月29日 星期一

Android Power Management, partial wake lock parts

Android 當在 running mode 按第一次 Power 鍵,關螢幕後,Linux kernel 應該是在early_suspend mode,因此如果跟第一次間隔很短(幾秒?)馬上按第二次 Power 鍵 resume 是直接回到關螢幕前的應用程式 intent。

但是如果第二次間隔跟第一次間隔時間,差距到讓 Linux kernel 進入 suspend mode,則resume 時會看到 Launcher 的螢幕鎖頭。

而卡在 early_suspend 會不會進入 suspend mode,則跟 Android 層是否有要 partial wake lock 有關。

目前已知有取得 partial wake lock 的服務(原來有這麼多 XD):

Android eclair-release branch

同步也會卡...

frameworks/base/core/java/android/content/SyncManager.java

正在關機

frameworks/base/core/java/com/android/internal/app/ShutdownThread.java

SD 卡格式化

frameworks/base/core/java/com/android/internal/os/storage/ExternalStorageFormatter.java

使用者互動

frameworks/base/libs/ui/EventHub.cpp

frameworks/base/services/java/com/android/server/WindowManagerService.java

frameworks/base/services/java/com/android/server/NotificationPlayer.java

鬧鐘
frameworks/base/services/java/com/android/server/AlarmManagerService.java

frameworks/base/media/java/android/media/AsyncPlayer.java

使用電話功能

frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java

frameworks/base/telephony/java/com/android/internal/telephony/RIL.java

frameworks/base/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java

frameworks/base/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java

frameworks/base/telephony/java/com/android/internal/telephony/cdma/CdmaConnection.java

frameworks/base/telephony/java/com/android/internal/telephony/gsm/GsmConnection.java

frameworks/base/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java

RIL HAL driver
hardware/ril/libril/ril.cpp

frameworks/base/voip/java/com/android/server/sip/SipWakeLock.java

簡訊

frameworks/base/telephony/java/com/android/internal/telephony/SMSDispatcher.java
螢幕鎖

frameworks/base/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java

開啟 GPS 定位服務
frameworks/base/services/jni/com_android_server_location_GpsLocationProvider.cpp
frameworks/base/services/java/com/android/server/LocationManagerService.java
frameworks/base/services/java/com/android/server/location/GpsLocationProvider.java

聽音樂
frameworks/base/services/audioflinger/AudioPolicyService.cpp

藍芽耳機

frameworks/base/core/java/android/bluetooth/HeadsetBase.java

frameworks/base/core/java/android/bluetooth/ScoSocket.java

(有線?)耳機
frameworks/base/services/java/com/android/server/HeadsetObserver.java
frameworks/base/services/java/com/android/server/DevicePolicyManagerService.java

震動也會鎖

frameworks/base/services/java/com/android/server/VibratorService.java

開 Wifi 會鎖

frameworks/base/services/java/com/android/server/WifiService.java
frameworks/base/wifi/java/android/net/wifi/WifiStateTracker.java

備份??

frameworks/base/services/java/com/android/server/BackupManagerService.java

??
frameworks/base/services/java/com/android/server/am/ActivityStack.java

??
frameworks/base/tests/BatteryWaster/src/com/android/batterywaster/BatteryWaster.java

實作的檔案如下:

frameworks/base/core/java/android/os/Power.java

frameworks/base/core/java/android/os/PowerManager.java

frameworks/base/services/java/com/android/server/PowerManagerService.java

JNI 介接層:

frameworks/base/core/jni/android_os_Power.cpp

hardware/libhardware_legacy/include/hardware_legacy/power.h

hardware/libhardware_legacy/power/power.c

2011年8月27日 星期六

摘譯 steve jobs 語錄

你是否已經找到終身熱愛的志業?
你是否浪費自己的生命在過別人的生活?
你是否有勇氣追隨自己真實的想法與直覺?
你是否有良好的人際關係,隨著歲月增長而成長的人際關係?
你是否能在幾天,或幾個月內告訴孩子們所有你想到關於十年後的事物?
當生命遭逢巨變,你是否讓你的家人平和的接受生活上的不適與改變?
你是否能夠在離別之前道別,避免將來後悔?

原文來自:Reflecting on Steve Job's Words of Wisdom

2011年8月16日 星期二

Linux gpio & irq mapping

arch/arm/plat-pxa/gpio.c 定義了 pxa_gpio_chip 指的是某一個管理 gpio interrupt 的 register 而一個 register 是 4 bytes,所以最多管 32 根 gpio (irq),例如 pxa270 的 Section 24. Interrupt Controller 定義了 0~39 (扣除 reserved 也用到 33,第 34 根 GPIO),因此保留兩個 gpio_chip 的空間 32*2= 64 個位置給 gpio 對應的 irq number。

Interrupt 借由 Interrupt controller 向 pxa270 發出 request,取得該 pin 腳的 GPIO number,再透過 arch/arm/mach-pxa/include/mach/gpio.h 的 gpio_to_irq 取得 irq number,再指向在

arch/arm/mach-pxa/pxa27x.c 中的 pxa27x_init_irq 與
arch/arm/plat-pxa/gpio.c 中的 pxa_init_gpio 初始化時指定的 gpio 與 irq chip,最後註冊 irq chip 內的 chained_handler ...

Linux 使用 irq_desc 表示某一個 irq,chip level ISR 實作可能是舊式的 __do_IRQ 或採用新的 irq_desc->handle_irq() ,到上一層透過 irq_desc->chip 呼叫不同的 handler

kernel/irq/handle.c 定義了 irq_desc[NR_IRQS], NR_IRQS, nr_irqs 代表目前 Linux kernel 擁有的 irq 總數

另外相關的部份:

arch/arm/plat-pxa/gpio.c

arch/arm/kernel/calls.S 處理的 system call interface

arch/arm/kernel/entry-armv.S 定義 irq_handler, interrupt vector table, dispatcher table

arch/arm/mach-pxa/irq.c 處理的 irq interface

https://www.kernel.org/doc/htmldocs/genericirq/index.html

linux kernel source base: 3.1.0-rc1

參考:

ARM中斷流程

2011年8月7日 星期日

linux nfc kernel driver pn544

讀 linux kernel "Documentation/nfc/nfc-pn544.txt"

感謝作者: Jari Vanhala
聯絡方式: Matti Aaltonen (matti.j.aaltonen at nokia.com)

兩個可參考的驅動程式: "drivers/nfc/pn533.c", "drivers/nfc/pn544.c" 感謝 Nokia 的愛心。

使用 linux kernel 的 misc device, device name /dev/pn544
其中 pn544 有 I2C, SPI, HSU 三種介面但驅動程式只提供 I2C 介面實作

對 user space 介面有 sysfs 的硬體測試與 IOCTL 切換 HCI, firmware update 兩種工作模式,傳輸訊息的方式有三種:read, write, poll

由 user space 傳訊息到 PN544  晶片進行控制,驅動程式目前只傳遞訊息不瞭解訊息內容

溝通協定

正常的 HCI 模式與 firmware update 模式的 read/write 行為不太一樣,因為兩種模式的訊息格式與溝通協定都不同。

HCI模式的溝通協定採用 ETSI 的 HCI spec,firmware update 則另有特殊協定。

HCI 訊息有 8 bit header 跟訊息內容。header 包括訊息長度,最大 33 bytes。傳送出去的訊息需要經過 checksum 驗證。

Firmware update 訊息長度存在第二(MSB)跟第三(LSB)位元組,最大值 1024 bytes.

sysfs 的硬體測試指的是讀取 sysfs 檔案後能將 pn544 轉為 firmware update mode,如果未提供測試則不需要建立此 sysfs 檔案。

使用範例:

 60 Example:
 61 > cat /sys/module/pn544/drivers/i2c\:pn544/3-002b/nfc_test
 62 1

正常運作流程:
device 檔案 open 後 pn544 就給電,未開啟前斷電,一次只能有單一使用者。user space 應用程式使用 HCI 訊息控制。 當有資料可讀時就發出一次中斷,當 user space 下 read 時才從 pn544 實際讀取資料,poll() 檢查 read interrupt state。設定與單元測試都由 user space 的 read/write 完成。

範例 platform data:


78 static int rx71_pn544_nfc_request_resources(struct i2c_client *client)
79 {
80 /* Get and setup the HW resources for the device */
81 }
82
83 static void rx71_pn544_nfc_free_resources(void)
84 {
85 /* Release the HW resources */
86 }
87
88 static void rx71_pn544_nfc_enable(int fw)
89 {
90 /* Turn the device on */
91 }
92
93 static int rx71_pn544_nfc_test(void)
94 {
95 /*
96 * Put the device into the FW update mode
97 * and then back to the normal mode.
98 * Check the behavior and return one on success,
99 * zero on failure.
100 */
101 }
102
103 static void rx71_pn544_nfc_disable(void)
104 {
105 /* turn the power off */
106 }
107
108 static struct pn544_nfc_platform_data rx71_nfc_data = {
109 .request_resources = rx71_pn544_nfc_request_resources,
110 .free_resources = rx71_pn544_nfc_free_resources,
111 .enable = rx71_pn544_nfc_enable,
112 .test = rx71_pn544_nfc_test,
113 .disable = rx71_pn544_nfc_disable,
114 };


NXP pn544 introduction pdf
including: contact less procotols, host interfaces, power cosumption

NXP NFC 的 peer to peer, card emulation, Reader三種模式與使用的溝同協定說明

值得注意的是,就專利版圖來看,目前 NFC 市場並沒有真正的大廠,前六強分別是 Sony, Broadcom, IBM, Nokia, Panasonic, NXP

2011年8月4日 星期四

幫 pxa270 超頻

要幫 pxa270 超頻,先看 linux kernel arch/arm/mach-pxa/pxa27x.c 的
pxa27x_get_clk_frequency_khz() 如何讀出目前系統設定的 520MHz

CPLL 是用Crystal clock: 13MHz * L (16) * N (2.5) = 520MHz
我們 CPLL 目標是 624 MHz 因此外頻不改,只要改倍頻就可以達到:
Crystal clock: 13MHz * L (16) * N (3) = 624MHz

原本讀取是看 CCSR register,設定是設 CCCR,但是 CCCR 設完還要靠 CLKCFG
register 才能使 CCCR 的設定生效。

pxa270 datasheet CLKCFG 是 co-processor 不像 CCCR/CCSR 使用 memory map 後就可
以讀到,因此要使用 gnu arm assembly code,原本 pxa27x_get_clk_frequency_khz() 就有
讀 CLKCFG 的程式碼:



84 /* Read clkcfg register: it has turbo, b, half-turbo (and f) */
85 asm( "mrc\tp14, 0, %0, c6, c0, 0" : "=r" (clkcfg) );
86 t = clkcfg & (1 << 0);


然後找到
 Performance Profiling Techniques on Intel ® XScale™ Microarchitecture Processors pdf
有寫入 co-processor 14 register 6 (CLKCFG) 的語法


asm( "mcr\tp14, 0, %0, c6, c0, 0" : : "r" (VAL) );



好久沒看組語 XD,該學一下 GNU ARM assembly

2011年7月27日 星期三

Linux kernel spinlock 使用方式與時機

由 Linus 親自整理的 Linux kernel spinlock 文件

~linux/Documentation/spinlocks.txt
            多核心處理 critical section 的方式,safe but slow(disable interrupts)
 67 See . The basic version is:
 68
 69    spinlock_t xxx_lock = SPIN_LOCK_UNLOCKED;
 70
 71
 72     unsigned long flags;
 73
 74     spin_lock_irqsave(&xxx_lock, flags);
 75     ... critical section here ..
 76     spin_unlock_irqrestore(&xxx_lock, flags);

            單核心處理 critical section 的方式:
115
116     spin_lock_irqsave(flags);
117     .. critical section ..
118     spin_unlock_irqrestore(flags);
119

        reader/writer 處理 shared data 的鎖定方式:
149    rwlock_t xxx_lock = RW_LOCK_UNLOCKED;
150
151
152     unsigned long flags;
153
154     read_lock_irqsave(&xxx_lock, flags);
155     .. critical section that only reads the info ...
156     read_unlock_irqrestore(&xxx_lock, flags);
157
158     write_lock_irqsave(&xxx_lock, flags);
159     .. read and write exclusive access to the info ...
160     write_unlock_irqrestore(&xxx_lock, flags);

        如果確定不會跑在 interrupt handler 中(否則會重複鎖定造成 dead lock),
        可以用簡化的 spin_lock API 較快
192     spin_lock(&lock);
193     ...
194     spin_unlock(&lock);

        因此 read lock 等可以用簡化的非 irq safe spinlock,但 write lock 則必須
        使用 irq safe 的 spin lock

Linux kernel and user space interfaces

1. /dev/  character device ioctl control code read/write interface
2. /sys sysfs  show/store read/write interface
3. /proc procfs  read/write interface
4. event: input events (for example key events)

2011年7月21日 星期四

修改 linux device driver 載入 順序

1.  platform driver 可以調整 platform device 的 register 順序
 
2.  強者同事 Gary 使用 include/linux/init.h 定義不同順序的 init macro,module_init default 是 order 6,可以設定 late_initcall 是最後的 order 7

3.  build  kernel module, 在 user space 調整 module loading 順序

2011年7月10日 星期日

蘭德的培養心理調適能力建議

如果喜歡閱讀蘭德公司的文章,可以到蘭德網站購買紙本資料
(Consider buying this document if you think this information is
valuable to you.)。

Psychological resilience 原本查到是抗壓力,但我覺得這個翻譯偏負面,
不符合這篇的主旨,因此翻為心理調適能力。

心理調適能力指的是處理或克服逆境與壓力的過程。精神健康方面,心理
調適力不只是個人人格,而是個人跟生命經歷與當下時空環境的互動。比
如調適力可以應用到預防(避免遭遇壓力)或是治療(從壓力產生的傷害中復
原)的情境。

可以提升調適力的因素:

個人因素

– 正向處理
經營管理令人煩惱的情況,花費努力解決個人與人際問題,尋求降低或忍受
壓力與衝突,包括主動務實,專注在問題,精神與靈魂層次的處理方式

–正向影響
保持熱情、主動與警覺,包括正向情緒,幽默感(承受壓力、受到挑戰時仍
保持幽默感),懷抱希望,保持彈性擁抱改變

– 正向思考
處理資訊,應用知識,藉由改造、重構框架、理解情況、保持靈活、再評估
、重新聚焦,改變偏好與價值觀優先順序。對事物結果有正向期待,正面
的願景與心理準備

–務實主義
務實掌握可能性,對於結果有務實的預期,自尊心與自我價值,自信心,
相信自己能勝任,認識自己可掌握的部份, 並接受無法控制與無法改變的
事物。

– 控制行為
監控、評估、修改情緒反應並完成目標的程序(自我規範、自我管理、自我
提升)。

家庭因素
– 情感連結
家人之間的情感連結,包括共享的娛樂與休閒時間。

– 溝通
思考、資訊的交換、 包括解決問題,人際關係的管理。

 – 支持
認知可以從他人得到、並提供安慰。包括情感上的,可觸覺的,起重要作用
的與精神、靈魂上的支持。

– 親密感
愛、親密、忠誠。

 – 教養
養育子女的技巧

– 適應力與通融
可調適自己接受關於生活中的改變,包括彈性、靈活地扮演家庭中的角色。

組織因素

– 正向的領導環境
使用或培養組織單位之間的互動,建立自尊心並支援完成任務、領導統禦、
正向角色典範、執行組織政策

– 團隊合作
協調團隊成員之間靈活彈性的分工合作

– 內聚力
小組能聯合行動,聯結所有團隊成員承諾互相援助,一起投入工作任務。

社群因素
– 歸屬感
整合,友誼,包括參與精神信仰的組織,協定與儀式,社會服務,學校等,
以及執行組織政策。

– 內聚力
社群內可以群聚人們的聯結,包括共享價值與親密安全的關係

– 連結性
在社群中與他人的連繫品質與數量,包括與單位,或與在某單位的人們聯繫,
連繫的層面包括承諾,組織結構,角色,責任與溝通

– 集體效能
團隊成員瞭解整個團隊有能力共同合作

2011年6月26日 星期日

DISCONTIGMEM on PXA270

Russell King在回覆給 dera 的 DISCONTIGMEM on PXA270 一文中,提到 PXA270 平台設定
多個 DRAM memory bank 在 Linux kernel 的設計方式:

1. PHYS_OFFSET 從最小的 SDRAM 開始,在該文中是以 0x8000,0000
2. 因為 memory bank 之間有太大的漏洞,必須修改  __virt_to_phys/__phys_to_virt 將你的實體
記憶體壓縮排列到虛擬記憶體中。
3. 因為實體與虛擬記憶體非 1:1 對應,因此不能定義 NODE_MEM_SIZE_BITS, 而是要以單一
bank (該文是 128MB) 設定 NODE_MEM_SIZE_MASK (128MB -1)
4. 定義 KVADDR_TO_NID(vaddr) 將虛擬記憶體轉為 node number
5. 定義 PFN_TO_NID(pfn)轉 page frame number (phys >> PAGE_SHIFT) 到同一
node number (memory bank)
6. 公式就是以下列式必須符合 SDRAM 每一個位址:
KVADDR(vaddr) == PFN_TO_NID(phys_to_pfn(virt_to_phys(vaddr)))
7. Vernon Sauder 在回文中提到 必須考慮到 arch/arm/mach-pxa/Makefile.boot
中定義的 linux kernel start address zreladdr, 有修改為 0x8000,8000.

但實務上現在 arm linux 不應該再使用 DISCONTIGMEM ,而該使用 SPARSEMEM
1. mach/memory.h 定義 MAX_PHYSMEM_BITS 跟 SECTION_SIZE_BITS
可以在 arch/arm/include/asm/sparsemem.h 找到這兩個參數的定義

2.  config 中加入 ARCH_SPARSEMEM_ENABLE 移除 ARCH_DISCONTIGMEM_ENABLE
3. 仍需要修改  __virt_to_phys/__phys_to_virt 將你的實體記憶體壓縮排列到虛擬記憶體中。
4. 確定 sparse memory 的 patch 有上, finish of sparse memory patch

2011年6月19日 星期日

條碼機 維基百科條目

摘譯維基百科英文條目 Barcode_reader

條碼機指的是讀取印刷條碼的讀取機器。跟影像掃瞄器一樣擁有光源、鏡頭、將光學脈衝解讀為電子訊號的感光器(ADC),差異點在條碼機幾乎都包括解碼器解讀影像資料,並將解碼結果傳送到條碼機的輸出介面。

條碼機的種類:CCD, Laser, 2D
CCD 指 Linearized CCD 只能掃一維條碼,只有一維(列)感測器,感應條碼因環境光線而反射後得到的條碼資訊。

Laser 指只能掃一維條碼,讀取打出去的特別頻率光線,再分析反射回來的光線讀取條碼。
2D 指能掃一維跟二維條碼,照相得到影像後再用影像解析解碼

ARM Linux kernel 記憶體配置

摘譯這篇由 Russell King 在 2005 年 11 月 17 日針對 2.6.15 Linux kernel 撰寫的 ARM Linux kernel 記憶體配置

裡面指的是 linux kernel 使用 arm cpu 的虛擬記憶體的位址配置與排列方式

arm cpu 的虛擬記憶體定址空間: 4GB (32 位元的定址空間, 0000,0000 ~ FFFF,FFFF)

沒有遵循這個記憶體配置的 kernel 可能無法開機或發生隨機當機


===========開始=========針對 user space 的加入內容==========================

針對每個 user space 程式而言,其實都跟硬體裝置的記憶體映射空間, kernel 使用的記憶體空間,三者共用整個 4GB 的虛擬記憶體。

user space 程式這個區塊內部的記憶體配置如下:
   +----------------------+---------------------+-----------+------------+------------+
    | Code segment(r+x) | Data segment(r+w) | BSS(r+w)  | Heap(r+w) | Stack(r+w) |
   +-------------------------------------------------------------------------------------+

Code segment 是 instruction memory,儲存程式碼
Data segment 是 data memory,使用 brk(), sbrk() system call 改變或查詢 Program break 大小
BSS segment 是未初始化的 global 變數存放位置
Heap segment 儲存程式執行期產生的動態變數、記憶體區塊由 malloc() 取用,free()  釋放
Stack segment 使用 SP stack pointer 暫存器輔助 IP instrcution pointer 指定,由 function call, 與其 local 變數使用 

註:參考 Memory Management for System Programmers (pdf)

在 Linux 系統底下我們可以藉由 /proc/some_pid/maps 看到執行檔與 library memory map,另外 smaps 則詳列各區段 memory map 的使用狀態。其中可以看到從  0x0000,1000~0xBF00,0000 的載入函式庫與 heap, stack, 其中 stack 與 TASK_SIZE 相鄰

舉某個 android process 為例:
其中

    0xBEBE,9000- 0xBEBF,E00 是 stack 使用
    0xB000,0000 ~ 0xB001,0000 是 linker 載入位置, Thread 0 Stack
    0x8000,0000 ~ 0xAFE46000  是 Non-prelinked libraries
    0x4154,C000 ~ 0x8000,0000 是 mmap'd 記譯體,Java jar library, apk 檔案
    0x4000,0000 ~ 0x4154,C000 是 mmaped open file
    0x0000,A000 ~ 0x003C,4000 用在 heap
    0x0000,1000~0x0000, A000 佔用 .text (code segment) / .data 

Android 2.3 以前的 prelink library build/core/prelink-linux-arm.map 裡面除了重述 Russel King 的 ARM Linux kernel memory 的記憶體配置,Android 的記憶體配置中,包含兩塊系統預設的 library memory mapping:

    其中 Android prelink 定義了以下兩大塊記憶體對應:

    # 0xA0000000 - 0xBFFFFFFF Prelinked System Libraries
    # 0x90000000 - 0x9FFFFFFF Prelinked App Libraries
    可以在 prelink-linux-arm.map 中找到或新增你要加入的 library 記憶體對應。

    # 0xA0000000 - 0xBFFFFFFF Prelinked System Libraries
    0xAEF00000  - 0xAFF00000 # core system libraries
    0xAE700000 - 0xAEE00000 # bluetooth libraries
    0xAE300000 - 0xAE600000 # extended system libraries
    0xACA00000 - 0xAE200000 # core dalvik runtime support
    0xA9C00000 - 0xAC900000 # graphics
    0xA8D00000 - 0xA9B00000 # audio
    0xA7000000 - 0xA8B00000 # assorted system libraries
    0xA4800000 - 0xA6F00000 # pv libraries
    0xA4000000 - 0xA4700000 # opencore hardware support
    0xA3800000 - 0xA3900000 # pv libraries
    0xA2F00000 - 0xA3700000 # stagefright libraries
    0xA2A00000 - 0xA2E00000 # libraries for specific hardware

    # 0x90000000 - 0x9FFFFFFF Prelinked App Libraries
    0x9CA00000 - 0x9F000000 # libraries for specific apps or temporary libraries

# 0xC0000000 - 0xFFFFFFFF Kernel
# 0xB0100000 - 0xBFFFFFFF Thread 0 Stack
# 0xB0000000 - 0xB00FFFFF Linker
# 0xA0000000 - 0xBFFFFFFF Prelinked System Libraries
# 0x90000000 - 0x9FFFFFFF Prelinked App Libraries
# 0x80000000 - 0x8FFFFFFF Non-prelinked Libraries
# 0x40000000 - 0x7FFFFFFF mmap'd stuff
# 0x10000000 - 0x3FFFFFFF Thread Stacks
# 0x00000000 - 0x0FFFFFFF .text / .data / heap

====================針對 user space 的加入內容==========結束================

因為 cpu 架構的發展變化可能影響 kernel 記憶體位置的配置,user space 程式應該只使用到 0000,1000 ~ TASK_SIZE -1 這段記憶體。請使用 open(), mmap() 系統呼叫使用這段記憶體。

    FFFF,8000 ~ FFFF,FFFF           copy_user_page/clear_user_page 使用
    SA11xx 跟 Xscale cpu 建立 minicache 的記憶體位址

    FFFF,1000 ~ FFFF,7FFF           保留
    各平台禁止使用這塊記憶體配置

    FFFF,0000 ~ FFFF,0FFF           cpu vector page
    如果 cpu 支援改變中斷向量位址 (control register V bit), 會把中斷向量映射到這
    4K bytes 區塊

    FFC0,0000 ~ fffe,ffff           DMA 記憶體映射區塊,由 dma_alloc_xxx 的
    函式呼叫都使用這塊記憶體動態配置,總共 0x003F,0000 佔 4MB

    FF00,0000 ~ FFBFF,FFFF          保留給 DMA 記憶體映射擴充使用 佔 12MB

    VMALLOC_END ~ feff,ffff         平台自由運用的記憶體區塊都建議用這段
    VMALLOC_END 必須對齊 2MB 的記憶體區塊
    在 arch/arm/mach-pxa/include/mach/memory.h 中定義

    #define ARM_DMA_ZONE_SIZE SZ_64M 除了以上 16MB 保留給 DMA 另外用了 48 MB
    使用 FBC0,0000~fffe,ffff
    在 arch/arm/mach-pxa/include/mach/vmalloc.h 定義
    #define VMALLOC_END       (0xE8000000UL)

    VMALLOC_START ~ VMALLOC_END - 1 vmalloc() / ioremap() space
    由 vmalloc() 及 ioremap() 取得的記憶體會動態配置在這區塊,VMALLOC_START 相依
    於 high_memory(不能有重疊)
    在 arch/arm/include/asm/pgtable.h 中註解有說明留 8MB 給誤動作的記憶體錯誤緩衝空間,
    定義如下:
    #ifndef VMALLOC_START
    #define VMALLOC_OFFSET      (8*1024*1024)
    #define VMALLOC_START       (((unsigned long)high_memory + VMALLOC_OFFSET) &
                                                      ~(VMALLOC_OFFSET-1))
    #endif

其中 high_memory 在 arch/arm/mm/init.c 的 void __init bootmem_init(void) 計算:
    high_memory = __va(((phys_addr_t)max_low << PAGE_SHIFT) - 1) + 1;

    PAGE_OFFSET ~ high_memory - 1   Kernel direct-mapped RAM region
    這段記憶體對應到平台上的實體記憶體,通常跟系統記憶體是 1:1 的對應
    (direct addressing) 在 arch/arm/include/asm/memory.h 看到 PAGE_OFFSET 定義為
    UL(CONFIG_PAGE_OFFSET)
    也因此我們可以在 arch/arm/include/asm/memory.h 看到以下 virtual, physical 記憶體互轉的
    巨集定義:
    #define __virt_to_phys(x)   ((x) - PAGE_OFFSET + PHYS_OFFSET)
    #define __phys_to_virt(x)   ((x) - PHYS_OFFSET + PAGE_OFFSET)

    其中的 PHYS_OFFSET 實體記憶體在 cpu 定址的記憶體初始(start of bank 0 dram)位址
    ,是定義在同檔案的以下巨集:
    #define PHYS_OFFSET UL(CONFIG_DRAM_BASE) 與
    #define PHYS_OFFSET PLAT_PHYS_OFFSET
    CONFIG_DRAM_BASE 是實體記憶體起始的 offset 值,在 pxa 平台可以
    在 arch/arm/mach-pxa/include/mach/memory.h 中看到定義為:
    #define PLAT_PHYS_OFFSET    UL(0xa0000000)
    我們可以對照 pxa270 spec memory map 章節的 dram map 起始位址
    0xa000,0000 作為實體記憶體的起始位址得到驗證。
    再配合 arch/arm/Makefile 定義的 Linux kernel image text area 值
    TEXT_OFFSET := $(textofs-y)
    而 textofs-y   := 0x00008000 是預設值。
    arch/arm/boot/Makefile 告訴我們 zImage 等 target 就是
     21 #   ZRELADDR == virt_to_phys(PAGE_OFFSET + TEXT_OFFSET)
    因此可以算出:ZRELADDR = PHYS_OFFSET + TEXT_OFFSET = 0xA000,8000 (physical)
    而虛擬位置是 0xC000,8000(virtual),這個計算結果可以跟 Makefile include 的
    include $(srctree)/$(MACHINE)/Makefile.boot 檔案,在 pxa 平台就是
    arch/arm/mach-pxa/Makefile.boot 檔案裡面定義的 zreladdr-y
    zreladdr-y   := 0xa0008000
    在實務上我們也可以修改 zreladdr-y 定義的實體記憶體位址,來改成我們想要把 linux kernel
    起始點放在 physical memory 的哪一個位置上。這也就是為何我們從 boot loader 載入 linux
    kernel 都要指定到某個固定實體記憶體位址的原因,因為在 make kernel 時就決定了這個位址。

    PAGE_OFFSET 也就是 linux kernel image 的虛擬位址起始點, 0xC000,0000 3GB 的 user address
    space

    TASK_SIZE ~ PAGE_OFFSET - 1     Kernel module space
    使用 insmod 動態載入的 kernel modules 會在這段記憶體使用動態配置
    arch/arm/include/asm/memory.h 定義
    #define PAGE_OFFSET     UL(CONFIG_PAGE_OFFSET)

    0000,1000 ~ TASK_SIZE - 1       User space mapping
    每個 thread 使用 mmap 對應到這段位置
    arch/arm/include/asm/memory.h 定義
    #define TASK_SIZE         (UL(CONFIG_PAGE_OFFSET) - UL(0x01000000))
    如果 PAGE_OFFSET = 0xC000,0000,則 TASK_SIZE = 0xBF00,0000 (3GB - 16MB)

    0000,0000 ~ 0000,0FFF           cpu vector page, null pointer trap
    不支援中斷向量重新映射的 cpu 會把中斷向量 page 放在這 4K bytes

關於以上作業系統的 Virtual address map 我們可以使用 arch/arm/mach-pxa/generic.c 與 arch/arm/mach-pxa/include/mach/hardware.h 的建立 memory mapped device 跟 chip select memory mapped device 的 Virtual -> Physical mapping

arm 因為使用到 co processor 15,controller register(1th), v bit (13th), 因此用到 vector page relocate 功能,原本會到 0x0000, 0000 找 vector table 的動作改為到 0xffff, 0000 找 vector table,而我們在 mmu 啟動後使用的 0xffff,0000 Virtual address 就是在 arch/arm/mm/mmu.c 的 devicemaps_init() 中將 Linux kernel 開機時在 arch/arm/kernel/entry-armv.S 建立的 vector table 存在 SDRAM 後,建立一組 0xffff, 0000 high vector page 對映到實體記憶體的 vector table,因此 Linux kernel 開機啟動 mmu 進入 virtual address mode 後才能在硬體發出 exception 中斷時,找到 vector table 處理中斷。

2011年6月14日 星期二

安滅菌

幾個月前,SSH不小心被狗咬傷,傷口不大,但為了安全起見,我帶他前往大醫院就診。醫生診斷問題不大,因為是家中飼養的小狗咬傷,且狗兒也有按時打預防針,所以不需過於擔心,只要口服抗生素一週,再加上一天兩次傷口塗抹藥膏即可。當時醫生開的抗生素,就是最近被衛生署檢驗出含有塑化劑並強制禁用的-「安滅菌」。

「安滅菌」是小兒科常見的抗生素用藥。像鼻竇炎、肺炎、中耳炎都常以「安滅菌」作為治療藥物。
它是白色粉狀,玻璃瓶裝,要自行加水調成糊狀服用。開封後要冷藏保存,三天內吃完。ssh當時只是被狗咬,吃抗生素是保險起見,避免細菌感染,沒想到卻吃進更毒的東西。

如何培養創業家

Cheryl Morris 在 BostInnovation 發表 How to Raise an Entrepreneur 的心得文,摘譯如下:
與其嘗試創業不如培養子女成為創業家,華爾街日報一篇 How to Raise An Entrepreneur
指出你可以培養孩子的五項特質讓他們成為創業家。

一、冒險精神。鼓勵孩子探索周遭的一切。給小孩對的玩具,讓小孩自己想辦法去學習
如何玩這個玩具,放假時帶小孩到不同的餐廳、場所,離開舒適區適應新環境。攀岩運
動很像是創業活動,攀岩者願意把自己置身高危險場所,並學習細心專注的降低、消除
風險。

二、沉穩而讓人可靠的個性。提供小孩在固定時間有高質量工作產出的環境。以身作則
教導情緒智商。

三、善於觀察的能力。鼓勵小孩從認知問題、尋找機會的眼光與角度看待世界。

四、團隊合作。鼓勵團隊運動訓練團隊合作的技巧,培養個人特質並融入團隊的機會,
以及承擔風險的機會。

五、以身作則。如果家長就有創業經驗,請直接傳授給你的孩子吧。

2011年6月12日 星期日

就算沒有需要隱瞞的事也要在乎隱私

喬治華盛頓大學的法律教授 Daniel J. SoloveChronicle 寫了篇 Why privacy matters even if you have nothing to hide

摘譯部份如下:

許多人面對隱私爭議時,所持的態度是:我沒有什麼需要隱瞞的。或我沒有做虧心事,不怕別人知道任何事。當然也有變形的說法:我的資訊不值得別人蒐集。

全世界監視器密度最高的英國政府對人民說:如果你沒有要隱藏什麼,就不需要害怕。Daniel J. Solove 在他的部落格提了這個疑問,並詢問重視隱私的讀者都如何回應?

他收到了以下幾種回答:

一、你有裝窗簾嗎?你的信用卡帳單願意借我看嗎?

二、我不需要跟你解釋為何我要保護自己的資訊,你先說憑什麼收集我的資料吧,有搜索票嗎?

三、我的確沒有要隱藏什麼,但我也不想要讓你知道任何事情。

四、要知道我的什麼資料,那你先公開你的吧。

五、這跟我要隱藏什麼無關,而是這些都是我的私事,跟別人無關。

六、如果你真的沒什麼好隱藏,那你可能沒有私生活吧。

其實若我們仔細回想,表面上說得再冠冕堂皇的人,都會想起自己對某些人事物的愧疚,想對某些人物隱藏某些事物以維持關係。重點是你肯不肯面對真實的自己而已。每個人都有自己主觀的意識與真正願意公開的事物底限,誇張點說,有誰願意公開自己的裸照而不害羞的呢?

以上的說法可能都還算偏激的回應。但我們可以回到隱私的意義,每個人可能對隱私有不同程度的定義,但是當我們感覺隱私被侵犯時,感覺是類似的,即使目前被取得的資訊不會影響到生活,會不會又洩露更多資料後,真正開始影響到生活呢?感覺受到監視、怕被知道秘密而被勒索、盜用個人資料導致個人財產名譽受損,各種不要緊的細項資訊結合起來,可能就會拼湊出你不想讓人知道、或被誤解的不實資料。

比如你買了頂假髮,最近常上醫院,於是照資料上來看,可能會出現你得了癌症,正在做化療這種離譜的結論。實際上你可能只是要練習剪頭髮,或想要變裝。

類似這種不想被誤解而想要保有隱私的例子,在個人對個人的人際關係中也可以找到例子。

有些堅持沒有需要隱藏的事就不用在乎隱私的人,他們的論點是,除非造成人員傷亡了才是真正造成隱私損害,這是根本不尊重別人,自私、完全沒有人權觀念的論述。

隱私的侵害也常常是溫水煮青蛙般,逐漸失去的,因為被強迫公開某些資訊而勉強接受,接著進一步的被迫公開更多資訊,直到完全沒有隱私。

如果某天被蒐集的資訊被認為你有犯罪意圖,而像關鍵報告電影般,發生有人因私利栽贓你要如何自救?答案就是保有隱私權。

此文是節錄自耶魯大學出版社出版,喬治華盛頓大學的法律教授 Daniel J. Solove 所著作的新書 Nothing to hide: The false tradeoff between privacy and security。

2011年6月10日 星期五

Jonathan Danylko 二十年來的程式設計心得

Jonathan Danylko 寫了一篇 Top 20 Programming Lessons I've learned in 20 years

摘譯如下:

Jonathan Danylko 自十一歲起就已經愛上科技與程式設計。他發現從事程式設計二十年來有許多困難與容易的課題,也許同樣身為程式設計師的你沒有經歷過,接下來將要分享他的經歷與心得(以下的我,如無特別註記,代表 Jonathan Danylko 先生):

我會隨著時間修改內容,也許以後會想到更多的事,但目前這二十條心得已經足以包含所有的程式設計大小事。以下就是記憶最深的部份:

一、設定你認為解決這個問題要花的時間。不管設定半小時或一小時都好,當你在自己設定的時間內無法解決某個問題,就找人問吧,不然趕快上網查資料也好。

二、一個程式語言就只是個語言。當你對單一個程式語言夠熟,就很容易對其他程式語言觸類旁通,學習效果越來越好。你用來解決問題的程式語言要讓自己有相當的"舒適"感,不影響邏輯思緒,可以產生有效率而且簡潔的程式碼,最重要的是挑一個最適合解決這個問題的程式語言。

三、不要過度強迫自己使用設計模式。有時候一個簡單的演算法就足夠,不需要再去勉強套上 singleton, facade 設計模式。對大部份的情況來說,簡潔的寫法最容易懂。

四、永遠要記得備份程式碼。我記得當發生硬碟全毀,資料完全救不回來的情景,並對曾經發生的慘劇永保警惕之心。當你忘記備份時,可能就在要交程式的前夕發生悲劇,不管某一版本程式碼(snapshot)或版本控管紀錄都需要備份。

五、面對現實吧!你不是最強的程式設計師。我以前常認為自己很瞭解程式設計,但事實上你總是會遇到比你強的程式設計師。請向他們學習。

六、增進你的學習能力。因為第五項的緣故,我總是手邊帶著一份電腦書籍或雜誌(我的朋友可以幫我作證),的確目前電子科技日新月異,要真的完全趕流行可是一份全職工作才做得來的。當你有足夠聰明的學習媒介與方法,就可能一直乘著浪頭走。

七、變化是常態。你的科技知識跟程式設計能力應該像投資股票一樣:分散風險。不要一直專注在單一項目自我感覺良好。

如果某個程式語言與科技的支援不足,你也可能需要更新履歷,開始重新練功。讓我保持一直向前的原則:至少要會兩到三種不同類別的程式語言,當其中一項開始被取代,失去應用場合,至少你還有可以撐場面的第二專長,並開始繼續學習新專長,隨時保持熟悉兩、三種程式語言的程度。

八、支援新進人員。幫助並訓練新進開發人員,教導程式設計原則與技巧。你永遠無法預測下一步...你可能陞官,此時你會慶幸自己有對新進人員傾囊相授,因為你陞官空缺的位子將有人幫你抬轎。

九、簡化演算法。撰寫程式時可以窮盡你的能力寫出複雜的程式,當完成後記得回去檢視你的程式碼進行改善。一點一滴的程式改進讓你日後可以愉快的維護這份程式碼。

十、為程式碼撰寫文件。不管是網站服務的 API 或是單一類別的文件,凡寫過的程式必留下文件。我常被批評寫太多註解,但這卻是我引以為傲之處,為兩三行程式碼註解可能只要幾秒鐘,如果是用了非常規的解決辦法,則更需要註解清楚你在寫什麼。

如果文件寫得好,將可以嘉惠設計架構、接手的程式設計師、技術支援部門的人。

十一、測試、測試、測試。我是黑箱測試的擁護者。當你完成程式後,就開始要對這段程式負責了,如果你們有品保部門,你將需要跟品保部門解釋更多程式錯誤。如果你不完整的測試程式,除了需要改善程式碼以外,還會得到壞名聲。

十二、慶祝每次成功。我看到很多程式設計師解決令人頭痛的問題,他們會跟同事慶祝,不論是簡單的搖擺、擊掌或是一段舞動。每個人在生命中遇到美好的事物,寫程式時也可能因為寫出得意的程式碼想分享喜樂,也許你已經看過類似的解決方法上百次,還是要記得跟你的同事同慶第一百零一次的歡樂。

十三、不論是專案或個人的程式,頻繁檢視程式碼。在公司中你總是有機會檢視程式碼,讓人評鑑你的程式碼品質。不要認為別人故意惹惱你,把建議當作建設性批評。就個人而言,永遠都要重新檢視程式碼,並總是自問:

我要如何寫得更好?這將加速你的學習,讓你成為更好的程式設計師。

十四、回憶自己的程式碼。有兩種看以前程式碼的方式:
我不敢相信以前寫這麼差。


我不敢相信以前寫這麼好。

第一種是覺得以前寫得很差,想知道如何改進。你將知道舊的程式碼可以如何重構成更好的函式,或甚至改善整個專案的程式碼。

第二種是驚訝於自己以前的成就,開發者會有一兩個完成的專案,讓同事對你肅然起敬。當然這是來自你的絕佳的程式設計能力,你可以拿出以前的函式庫或專案計劃,並改進成為更好的產品或創意。

十五、培養幽默感。在二十年的開發經驗中,所有同事都抱著一定的幽默感,事實上幽默感是你在這行業生存的必備技能。

十六、小心自稱全知、最懂的同事,佔有慾強,與沒經驗的程式設計師。遇到這些人你反而要表現謙虛。自稱全知、最懂的人只是想吸引你的注意力,無法成為團隊成員。佔有慾強的同事完成工作後,不會跟任何人分享。沒經驗的同事每十分鐘就會問你一個問題,到最後他的程式都是你幫他完成的,而非他自己寫的。

十七、沒有簡單的專案。我常遇到朋友、家人、夥伴說:幫我寫個簡單的程式。要寫個簡單的程式或網站,實際上需要雙方共同規劃,才可能完成一個雙方都滿意的產品。如果有人說需要使用微軟 Access 寫三頁網頁,實際上他要的可能需要十五個網頁才能完成的功能,並且需要使用 SQL server、還有討論區、客製化的內容管理系統。

十八、沒有理所當然的事。當你接下簡易的專案,可能會發現有些部份很容易解決。別這樣想。在你沒有一份已經完成的類別、元件、或一段函式,並且經過完整測試,在成功加入現有專案的產品之後,你再這樣想吧。

十九、軟體沒有完成的一天。曾經有同事告訴我軟體沒有完成的一天,只有暫時結案。非常棒的建議。只要客戶還在使用你寫的程式,在經過一段時日的驗證後,大部份情況是你還在繼續維護同一份程式碼。當然這並非壞事,這樣我們才有工作。

;-)

二十、耐心是一項美德。當客戶、朋友、家人使用電腦遇到挫折,最後對電腦元件莫可奈何時。我總是告訴他們:是人在控制電腦,不要讓電腦反客為主。寫電腦程式時也同樣需要足夠的耐心,當程式設計師知道自己犯錯,並從電腦的角度理解之後,就會知道錯誤在哪裡。

希望以上的心得能夠啟發你,或讓你會心一笑。

;-)

2011年6月4日 星期六

Javascript 語法蜜糖 CoffeeScript

摘譯 CoffeeScript 維基百科:

CoffeeScript 是用 ruby 寫的一種 Javascript 程式碼產生器。其中採用了 Ruby 與 Python
(比如 indent 取代大括號) 兩種程式語言的特性來簡化撰寫 Javascript 的語法,另外也
增加陣列轉換 (Array Comprehension)與正規表示(Pattern Matching) 的擴充語法。

使用 CoffeeScript 的好處是可以用更簡潔的程式碼,達到原本用 Javascript 寫出的
同樣功能,而不影響到執行期效能。Javascript 之父 Brendan Eich 表示 CoffeeScript
也影響到他對 Javascript 語言將來的發展規劃。

Ruby on Rails 預計在 3.1 版將會支援 CoffeeScript 。

CoffeeScript 可以在瀏灠器直接執行或透過 Node.js (Server side 執行的 Javascript 程式
,event driven I/O framework for V8 Javascript engie on Unix)執行。

 讀完維基百科後,可以繼續看 PragProg Magazine 的 CoffeeScript 五項改進
一、變數宣告依所在的 namespace 為全域或區域變數,不再因為宣告變數忘記加
var 而覆蓋已經宣告過的全域變數。CoffeeScript 也會將變數限定在單一檔案的匿名
函式中。

二、ajax call 中的 this 在 CoffeeScript 中同樣指到目前 context 的物件,this 關鍵字
也可以用符號 @ 代替

三、CoffeeScript 繼承 ruby 慣例將函式最後的 expression 自動當函式返回值,也可
以在變數賦值的語法 a = 後加上 '->' 自動將 a 由變數改為函式

四、CoffeeScript 在迴圈中使用 do 關鍵字,可以更容易為迴圈加入需取值的函式。

五、提供語法蜜糖,讓程式碼更簡潔

另外據說現在 GitHub 的開放源碼存量已經超過 SourceForge,再來是 Google Code 
第四是微軟的 CodePlex,另外還有支援 Mercurial distributed version control system (DVCS)
BitBucket 可以參考。

CoffeeScript 官網
CoffeeScript@Gihub 
A CoffeeScript Intervension

2011年5月22日 星期日

防水、防塵、防撞擊的 IP 碼

摘譯自英文維基百科,IP_Code

IP 碼就是 Ingress Protection 評比的縮寫,有時候也當作 International Protection Rating
的縮寫。通常會看 IP 兩字母后接一碼或兩碼數字,再加一字母或選擇性加另一字母。

在 International standard IEC 60529 的 IP 碼分類,評比防外部固體物質(包括人體,如手指)入侵機體的保護程度,也包括防塵、防意外接觸、機體防水、防電擊。

這個標準是為了提供更詳細的資訊給使用者,而非只有模糊不清的防水行銷用語。但遺憾的是沒有公開的標準提供我們未經授權的使用者參考,因此每個人解讀可能有所差異。

數字標示符合表格中某一種狀況,X 字母表示沒有針對該種狀況的保護程度評分。

比如電氣插座評分 IP22 可以保護手指無法插入,也不會因垂直或接近垂直滴落的水滴造成損害,或造成危險。IP22 或 2X 是一般室內電器的最低安全標準。

先看 IP 後第一碼數字(防塵):
第一碼數字代表對外物固體或有害物(導電體、移動物)的侵入與接觸保護。

數字等級 防護固體尺寸 可有效防護
0 無法防護接觸、或外物入侵
1 >50 mm 較大的身體接觸面積,比如手背,但無法防止有意的身體接觸
2 >12.5 mm 類似手指的外物
3 >2.5 mm 工具或粗電線等
4 >1 mm 大部份電線,螺絲等
5 防塵 不完全防塵,但入塵不應影響操作滿意度,完全隔絕接觸
6 完全防塵 完全防塵,完全隔絕接觸

接著看 IP 後第二碼數字(防水):
第二碼數字代表對外來液體的侵入與接觸保護。
防護等級 可防範項目Protected against 測試目的Testing for 細節Details
0 無防護
1 水滴 垂直滴下的水不應造成傷害 相當於每分鐘1mm雨水連續滴落10分鐘
2 傾斜15°度可防護水滴 在正常操作方式傾斜15°時,垂直滴下的水不應造成傷害 相當於每分鐘3mm雨水連續滴落10分鐘
3 噴水 垂直方向達60°的任意角度噴水落下不應傷害機體 壓力80–100 kN/m²相當於每分鐘0.7公升水量連續噴水5分鐘
4 濺水 從任意角度的濺水不應造成損害 壓力80–100 kN/m²相當於每分鐘10公升水量連續噴水5分鐘
5 噴水管 6.3mm水管由任意角度噴水不應造成損害 距離三公尺,壓力30 kN/m²相當於每分鐘12.5公升水量連續噴水3分鐘
6 強力噴水管 12.5mm水管由任意角度強力噴水不應造成損害 距離三公尺,壓力100 kN/m²相當於每分鐘100公升水量連續噴水3分鐘
7 泡水一公尺內 當在指定的壓力與時間內泡水一公尺,不應造成損害 可在水深一公尺持續泡水30分鐘
8 泡水超過一公尺 依製造商標示的可持續泡水水深,通常表示機體密封,但在某些機體代表可入水,但入水量不應造成損害 依製造商標示的可持續泡水水深

附加的額外字母

標準定義額外的附加字母分類可以保護免於由人造成的損害

等級 可防範以下身體部位的傷害Protected against access to hazardous parts with
A 手背
B 手指
C 工具
D 電線

可以再繼續附加以下字母提供額外的保護資訊:

等級 意義
H 高電壓裝置
M 防水測試中裝置可移動
S 防水測試中裝置直立
W 天氣情況

防機械碰撞

有一個額外數字表示防止機械碰撞,表示方法是用能量數值焦耳(J)。現在已經由 EN 50102
的 IK 數值取代。

雖然在 IEC 60529 第三版後就沒用到,也不在 EN 版本,舊版的規格通常會列在 IP 後的第三碼數字,表示防撞能力。新產品應該都會改成 IK 評比,然而目前沒有明確的新舊版數值對照表。

掉落IP等級 撞擊能量 等量的掉落質量與高度
0
1 0.225 J 150 g dropped from 15 cm
2 0.375 J 250 g dropped from 15 cm
3 0.5 J 250 g dropped from 20 cm
5 2 J 500 g dropped from 40 cm
7 6 J 1.5 kg dropped from 40 cm
9 20 J 5.0 kg dropped from 40 cm


IK
number
Impact energy
(joules)
Equivalent impact
00 Unprotected No test
01 0.15 Drop of 200 g object from 7.5 cm height
02 0.2 Drop of 200 g object from 10 cm height
03 0.35 Drop of 200 g object from 17.5 cm height
04 0.5 Drop of 200 g object from 25 cm height
05 0.7 Drop of 200 g object from 35 cm height
06 1 Drop of 500 g object from 20 cm height
07 2 Drop of 500 g object from 40 cm height
08 5 Drop of 1.7 kg object from 29.5 cm height
09 10 Drop of 5 kg object from 20 cm height
10 20 Drop of 5 kg object from 40 cm height

IP69K

German standard DIN 40050-9 extends the IEC 60529 rating system described above with an IP69K rating for high-pressure, high-temperature wash-down applications.[5] Such enclosures must not only be dust tight (IP6X), but also able to withstand high-pressure and steam cleaning.
The test specifies a spray nozzle that is fed with 80°C water at 8–10MPa (80–100bar) and a flow rate of 14–16L/min. The nozzle is held 10–5 cm from the tested device at angles of 0°, 40°, 60° and 90° for 30s each. The test device sits on a turntable that rotates once every 12s (5rpm).
The IP69K test specification was initially developed for road vehicles, especially those that need regular intensive cleaning (dump trucks, cement mixers, etc.), but also finds use in other areas (e.g., food industry, car wash centres).

NEMA Rating

IP Code Min. NEMA Enclosure rating to satisfy IP Code
IP20 1
IP54 3
IP65 4, 4X
IP67 6
IP68 6P

The United States National Electrical Manufacturers Association (NEMA) also publishes protection ratings for enclosures similar to the IP rating system published by the International Electrotechnical Commission (IEC). However, it also dictates other product features not addressed by IP codes, such as corrosion resistance, gasket aging, and construction practices. Thus, while it is possible to map IP Codes to NEMA ratings that satisfy or exceed the IP Code criteria, it is not possible to map NEMA ratings to IP codes, as the IP Code does not mandate the additional requirements. The table above indicates the minimum NEMA rating that satisfies a given IP code, but can only be used in that way, not to map IP to NEMA.[6]
North American enclosure rating systems are defined in NEMA 250, UL 50, UL 508, and CSA C22.2 N°. 94.

2011年4月8日 星期五

好物分享-輕便傘車


Syncon欣康HS00107鋁管加寬型傘車



Inglesina Trip系列

SSH第一台推車是在他五個多月時買的,用沒幾次就被我收在儲藏室,因為太重了。當時買的是Inglesina Trip系列,重量6.3 公斤,扛著上下樓梯很吃力,出門就算收納起來要拿上公車也超不方便,所以乾脆不用。最近因為需要又重新拿出來使用,還是覺得太重了,因此上網買了第二台手推車。這次我選擇收納後可揹式的欣康輕便傘車,才4.5公斤,在Y拍買1290元,承重18公斤,帶ssh出門時最怕他突然想睡覺,以他現在14公斤的體重,抱著他走5分鐘就氣喘吁吁,現在有這台輕便傘車就方便多了。當初第一台會買Inglesina是因為它是義大利製,跟Combi或Aprica大陸製相比,感覺錢花得比較有價值。但重達6公斤的推車,若是在有電梯的公寓使用就很好用,因為Inglesina的輪子偏大,在凹凸不平的路面上很好推,至於欣康傘車則是一切從簡,麻雀雖小,五臟俱全,該有的功能都有,唯一缺點就是收起來時不能獨立站立,要靠著牆壁,不然就是用揹的,推車本身就有揹帶,我覺得用揹的還算方便。

2011年3月27日 星期日

中興月子中心

第二胎還是選擇到中興月子中心。雖然早在去年9月就已預約訂房,但是中興不收訂金,只單純登記預產期,等生產當日再電話告知入住日期。結果我想入住的時間沒有空房,只好在生產醫院自費延住一天。所以有沒有房間,完全看運氣。

相較於三年前,制度上有些微改變。現在是餵奶時間一到,護士電話通知,攜帶母嬰卡到嬰兒室推嬰兒車將寶寶推回房內餵奶,餵完奶再自行推回去,餵奶多久要自行記錄。除了先生以外,訪客一律在會客室,不能進房間,不過我看到很多媽媽還是帶家人、朋友進入房內,所以管制得不是很嚴。

房間設備上,有雙人床,雙門小冰箱,20吋電視,熱水瓶,梳妝台,2張沙發椅,衣櫥,小板凳(哺乳時墊腳用),枕頭,V型餵乳枕(偏軟),厚薄棉被各一條,吹風機等用品。我建議自行準備硬一點的授乳枕,第一胎我買六甲村的樂活枕,這一胎我買妳心親密餵奶墊,這款偏硬,餵奶時寶寶不會一直往下滑。房間大小約9坪,空間相當大。沐浴清潔用品要自備,雖然每周提供1包平板衛生紙,但我覺得不夠用,建議準備一串抽取式備用,中興的床很軟,軟到床邊緣根本坐不住,我不喜歡,尤其我剖腹產,太軟的床讓我起身很費力,常因為起身而拉扯到傷口,所以餵奶我都坐在沙發椅上,沙發是硬的,背部墊個枕頭,用硬一點的「妳心餵奶墊」,腳再踩小板凳,這種姿勢餵奶很舒服。

兩間擠乳室,備有四台美樂-醫院專用型吸乳器自行準備吸乳罩就可以自由使用。吸乳器不是借回房內用,而是到擠乳室用。中興提供三個小玻璃奶瓶供媽媽裝母奶。擠出的母奶可存放在嬰兒室,半夜不想親餵時,可由護士代為瓶餵。

餐點方面,跟以前差不多,早中晚三餐外加兩份點心。點心是早上10點、下午3點各一次。早點是鹹的,像豬腳花生湯、香菇雞湯,還加一壺養生茶飲,像紅棗桂花飲、薑棗甜茶,這是三年前沒有的;午點是甜的,有紅豆湯圓、紫米桂圓粥等,每天都不一樣。用餐時間把餐車推到外頭,服務員會將餐車推進房內,以免很多媽媽不知道餐點已經送來了而耽誤了用餐。有些媽媽不訂月子中心餐點,而是另訂外面的月子餐,像廣和, 郭老師之類的,中興備有加熱區,有微波爐,電鍋可使用。另外有泌乳茶可供訂購,一杯75元,想衝奶量的媽媽可以先訂1杯喝喝看,看敢不敢喝再決定是否續訂。我三年前有喝過,口味可以接受,所以一連訂了7天,每天2杯,泌乳茶會在下午3點時連同午點一起送來。由於晚餐5點半就送來,之後要到隔天早上8點才有早餐,這10多個小時很容易餓,尤其如果你半夜要起床親餵的話,真的會感覺餓,所以我另外準備水果、鮮奶、豆漿、沖泡式黑芝麻糊及土司備食。萬一真肚子餓,可以吃點充飢。但若半夜不親餵,那建議晚餐後就不要再進食,因為月子餐一天總熱量已有2800卡,足夠哺乳媽媽的營養需求與熱量供應。

月子中心每天提供一套哺乳衣,入住期間都要穿著中興提供的衣服。每天有清潔人員來房內倒垃圾,加滿熱水瓶開水。每周更換床單一次,提供一包衛生紙,每周三次至房內拖地及清洗廁所。

入住期間,護理員會教導如何餵母奶,檢查子宮恢復情形,每天量血壓、耳溫。寶寶只有媽媽跟爸爸可以抱,爸爸要穿隔離衣才能抱寶寶。每週一至週五,下午三點都有媽媽教室。

費用方面一天總價4220元,內含房間費2866元,嬰兒照顧費754元,餐費600元。如果不訂餐可扣除餐費,若是寶寶照黃疸,到樓下嬰兒病房治療時,也可扣除嬰兒照顧費。媽媽生病可直接掛號到樓下就醫,像我剛入住時就感冒咳不停,護士幫我掛耳鼻喉科,診號到了再下樓去看診,不必久等。

每個媽媽有一次「嬰兒沐浴課程」可體驗,爸爸跟媽媽可一起參與,可以進到嬰兒室,親自幫寶寶洗澡,記得三年前第一胎上嬰兒沐浴課程時超緊張,第一次幫ssh洗澡手忙腳亂,即使護士從旁指導,我依然洗得戰戰兢兢,結果洗太久,ssh全身失溫變成紫色,還好護士趕緊包上浴巾,寶寶很快就回溫恢復正常膚色。沐浴課週一至週日每天都可以上。我的經驗是,入住當天就趕快跟護理站登記,因為週六日的時間很快就被預約。

坐月子期間,洗頭髮也是令許多人困擾。像這次生第二胎適逢寒流,洗頭怕著涼,加上剖腹產要10-14天才能淋浴,洗頭根本不可能。還好中興B1有美髮部,洗頭130元,也可以到病房服務,價錢再高一點,我產後第5天時在醫院洗過一次,180元,住進月子中心後,產後第9天到中興B1去洗頭,感覺比生產醫院洗得更仔細。B1還有超商跟維康藥局,附近有杏一藥局,拿月子中心發的母嬰卡到維康跟杏一購買皆可打9折,杏一還可幫忙送貨至月子中心,記得第一胎時,我需要購買一支吸鼻器,大約一百多元,我只需打電話給杏一,跟他說我要一支跟月子中心一樣的吸鼻器,沒多久就有專人送至我房間,方便又快速。

出院要提前三天告知,費用可刷卡,可報稅,中午前出院。有些媽媽提早出院後還繼續訂中興的月子餐,我覺得挺不錯的,早餐150,午餐225,晚餐225,我覺得早餐不需要,可只選擇訂午晚餐,但要自付快遞運送費。

剖腹生產,麻醉出槌

這次剖腹產,在麻醉過程中,出了狀況。由於第一胎已有經驗,我知道施打麻醉時,產婦要弓著身體,呈現蝦子狀,額頭要盡量貼到膝蓋,打完麻醉後要立即躺平,沒多久雙腿就會失去痛覺,
無法抬高。可是,第一次麻醉時,當麻醉師要我試著抬起右腳時,我居然可以抬得很高,我跟麻醉師說,我還可以踢球呢!我說我的雙腿沒有麻掉的感覺,麻醉師趕緊捏我肚皮測試,發現我肚皮部位仍有痛覺,麻醉師臉色黑青,無奈地說,要重新麻醉。

第二次麻醉,改變姿勢。我坐起來,抱著枕頭,額頭靠近膝蓋,盡量彎身讓背部弓出來。還好第二次麻醉不會痛,也順利成功。只是手術過程中遇到出槌狀況,心裡真的超緊張,我當時很怕醫生會改成全身麻醉。

2011年3月16日 星期三

設定 screenrc hardstatus 的 STRING ESCAPES

忘記之前有沒有貼過,更新一下加料版的 ~/.screenrc ,用 screen -DR 啟動

# http://jonny.ubuntu-tw.net/2011/03/screenrc-of-vimperator-like.html
# http://blog.eater.org/2008/12/new-screenrc-hardstatus-string.html
# http://www.debian-administration.org/articles/560
vbell off
defutf8 on # default new window encoding
defscrollback 8192
termcapinfo xterm 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm' # 開啟 256 色模式
hardstatus string "${USER}@%H %-Lw %{= BW}%54> [current: %n ] *%t%{-} %+Lw%< %= Date: %Y/%m/%d Time: %0c Loading: %l"

新加了 defutf8 on 之後 screen -UDR 改成 screen -DR 可以不用加 U 選項,新加 defscrollback 8192 將 Ctrl + a + ESC 的 Page Up/Down buffer 由 100 行改 8192 行,Ctrl + q 或 Ctrl + a + q 離開。另外就是 hardstatus 加比較多料,主要分成三段:

一、登入帳號跟主機名稱
"${USER}@%H "

二、 參考別人從 screen manpage 改的各個 screen window,目前 window 會加 [] 包住,對 screen manpage 的 STRING ESCAPES 還是不太瞭解,要再花時間看
"%-Lw %{= BW}%54> [current: %n ] *%t%{-} %+Lw%<

三、新增日期時間跟 Load average 會隨 window 增加被擠到後面
"%= Date: %Y/%m/%d Time: %0c Loading: %l"

參考以下作者的修改:
  1. 凍仁的 Ubuntu 筆記: screenrc of Vimperator-like
  2. blog.eater.org: New screenrc & hardstatus string
  3. An introduction to the visual features of GNU Screen
  4. man screen

2011年3月10日 星期四

喉舒樂口含錠

杏輝出的喉舒樂口含錠不可咬碎或吞食,待口水溶解殺菌喉片。

根據官網的產品說明:
主要成份是 Cetylpyridinium chloride對各種病原性細菌,殺菌作用迅速有效,不但對口腔咽喉之疼痛,腫脹炎症有治療效果,且對口腔發酵有抑制之效能,故對口臭之消除有效。

用法用量:
成人1回1錠,小兒1日1/2錠,1日3~4回含於口中,使徐徐溶解睡前服用,有效成份能高度保持於唾液中,效果更好。

注意事項:
1.使用本劑若有發疹等過敏現象發生,請即停止使用。
2.本劑對口腔,咽頭會有刺激感覺。        
3.將喉舒樂含於口中,請勿咬碎或吞服


摘譯
Cetylpyridinium chloride 英文維基百科:
根據維基百科解釋,Cetylpyridinium chloride 常見於漱口水、牙膏、口含錠、喉嚨噴劑、呼吸噴劑、鼻噴劑產品中,是能殺死細菌與微生物的醫藥用殺菌劑。

已經被證實有效防制牙菌斑、減緩牙齦發炎。某些農藥殺蟲劑中也會採用為成份之一。

然而根據 WebMDeMedicine 的說法
Cetylpyridinium chloride 跟氯已定一樣,也有造成牙齒咖啡色斑的副作用,另外據說也會造成味覺障礙

假如吞食或是成為氣體吸入體內會造成中毒

2011年2月27日 星期日

台灣製造的不鏽鋼保溫提鍋

因為要準備第二胎期間,阿母要幫艾媽提愛心魚湯的工具,我們找了一些適合單手提帶、可保溫、安全衛生的不鏽鋼保溫鍋給大家參考。當然也特別找了都是台灣製造的精品。

1. 繕寶 2 公升裝 799 元

2. 三光 2 公升裝 680 元

3. 鍋寶 1.8 公升 699 元

4. 鍋霸 1.4 公升 650 元

原本是想在百貨公司買,有考慮買瑞士製造的不鏽鋼提鍋,但動輒近萬元的大提鍋,一來價位高貴我們無力負擔,二來寬鍋口的要提帶也不方便,不然就是用保溫壺再內裝不銹鋼提鍋,價格都在兩千元附近。除了瑞士製造以外,大多品牌都是中國製造,讓人不敢用,反而在巷子裡的水電行找到台灣製造的精品,建議需要買的人先逛逛水電、五金行、大賣場,百貨公司反而找不到物美價廉的台灣精品。

2011年2月18日 星期五

懷孕後期

孕期進入倒數50天,除了例行產檢外,待產包也已打包妥當,希望能照預期日子進行剖腹生產。

懷孕後期,身體不適處很多,別的孕婦是腰痠背痛,我是腰一點都不酸,屁股倒是痛得很,可能因為我已經沒有腰了,但為什麼屁股會痛呢? 我就不懂了。行動上變得很慢很慢,我是急性子,平常走路快,說話快,做甚麼都快,現在則是想快也快不了。由於第一胎早產經驗,這一胎我是更謹慎小心,力求足月生產。

最近頻尿嚴重,一個晚上要起床解尿8-10次,每次翻身都屁股酸痛,天冷還要起床上廁所真的好痛苦。有時睡到一半還會覺得呼吸困難,也因為睡眠品質不好,很容易變成惡性失眠。至於很多孕婦會遇到的半夜腳抽筋情況,我在加強補充鈣之後,已不再發生。

開始天天跟ssh作心理建設,讓他明白我即將入院生產加坐月子,有一小段日子不能24小時陪伴他,從他的表情來看,我想他懂得我意思。

2011年2月3日 星期四

Grace Hopper 名言摘譯

Why don't you just go ahead and do it? Remember,
It is always easier to ask for forgiveness than it is to get permission.
為何你不動手去做呢?要記得:取得諒解總是比取得允許容易。

A ship in port is safe, but that is not what ships are built for.
人們造船並非為了停泊在港口中,而是要駕馭驚濤駭浪。

From then on, when anything went wrong with a computer, we said it
had bugs in it.
從此以後當電腦出錯,我們就說有 bug。

The most dangerous phrase in the language is, "We have always done it
this way."
最危險的一句話是:我們一直都是這麼做的。

Humans are allergic to change. They love to say, We have always done it
this way. I try to fight that. That's why I have a clock on my wall that
runs counter-clockwise.
人類對於改變很敏感。他們總是說:我們一直都是這麼做的。我嘗試挑
戰這種想法。這也是為何我的時鐘是逆時鐘轉的。

Leadership is a two way street, loyalty up and loyalty down. Respect
for one's superiors; care for one's crew.
領導統馭是雙向車道。對上忠誠也要對下忠誠。尊重上級,關懷部屬。

One accurate measurement is worth a thousand expert opinions.
一次精準的測量價值等同一千筆專家意見。

Someday, on the corporate balance sheet, there will be an entry which
reads, Information; For in most cases, the information is more valuable
than the hardware which processes it.
總有一天企業的資產負債表上會有"資訊"這個欄位。因為使用這硬體處理的
資訊價值,將會超過硬體本身的價值。

We are flooding people with information. We need to feed it through a
processor. A human must turn information into intelligence or knowledge.
We've tended to forget that no computer will ever ask a new question.
人們總是得到過多資訊,這些資訊將需要輸入處理器。由人類將這些資訊
轉變為智慧與知識。我們容易忽略電腦不會問新問題的缺陷。

To me programming is more than an important practical art. It is also a
gigantic undertaking in the foundations of knowledge.
對我來說程式設計不只是實用的藝術,也是建構知識基礎的巨大任務。

They told me computers can only do arithmetic.
他們跟我說電腦只能做計算。

In pioneer days they used oxen for heavy pulling, and when one ox
couldn't budge a log, they didn't try to grow a larger ox. We shouldn't
be trying for bigger computers, but for more systems of computers.
在探險拓荒時代,人們使用牛群拖重物,當一頭牛搬不動木頭,他們並
不會找更大的牛來搬。因此我們不應該朝向更大型電腦的方向走,而
是建立更龐大的(電腦組成的)系統。

Life was simple before World War II. After that, we had systems.
二次大戰前的電腦是簡單的。在那之後我們有了電腦系統。

We went overboard on management and forgot about leadership.
It might help if we ran the MBAs out of Washington.
我們太注重管理反而忽略領導統御。也許華盛頓沒有企管碩士會好一點。

At any given moment, there is always a line representing what your
boss will believe. If you step over it, you will not get your budget. Go
as close to that line as you can.
任何情況下,你的老闆對你的信任總會有限度。如果你超過他對你信
任的程度,將得不到一毛預算可用。在這範圍內盡你所能的逼近信任
的極限。

I seem to do a lot of retiring.
我好像一直在退休。

I handed my passport to the immigration officer, and he looked at it
and looked at me and said, "What are you?"
我把護照拿給入境海關人員後,他看著護照再看看我,問說:你是哪個行業的?
(指她作為時代先驅,常人無法理解她的工作內容。)

參考連結:

編譯器與 Debug 的傳奇:女牛人Grace Murray Hopper 小傳 (簡中)

BCC-16(in Chinese) 計算機概論十六講 POOL 3.06 Grace Hopper

Grace Hopper - wikipedia


葛麗絲。霍普 - 中文維基百科

2011年1月23日 星期日

自動販賣機整理資料

1. 飲料販賣機
(1). 統一速邁,
網址: http://www.vender.com.tw/auto-sale.htm

(2). 黑松販賣機:
網址:http://www.heysong.com.tw/business.htm
聯絡方式:
線上申請:http://www.heysong.com.tw/business1_2.asp
電話:黑松股份有限公司 自販業務部 (02)2706-2191 分機 340~343
本公司亦很樂意隨時為您聯絡並提供自動販賣機完善的服務與解答。

(3). 可口可樂販賣機:
網址:http://www.coca-cola.com.tw/contact/vending.aspx
聯絡方式:
週一至週五08:30~17:30 請聯絡: 自販客服人員-林小姐
TEL:(03)270-0584
E-mail: RitaLin@swirebev.com
非以上時間請於09:00~21:00聯絡: 自販業務發展經理-魏先生
Cell phone: 0915-028536
歡迎介紹,經效益評估後完成裝機,我們將贈送您一份小禮物 (市值約NT500)

(4). 快買特市集(讀者提供)
網址: http://www.qmart.com.tw/VMManager/index.jsp

2. 其他民生用品販賣機:
(1). 面紙、口罩、衛生綿 ...etc 非插電式自助販賣機。
(2). 魚、鳥飼料販賣機
(3). 加水機
(4). 自動抽籤機:http://www.dafo.com.tw/pro03.htm
(5). 雨傘(國內有廠商做嗎?)
(6). 手機充電器(桃園國際機場有)
(7). Payeasy 美妝機

3. 娛樂用遊戲機
(1). 甲蟲王者
(2). 夾娃娃機
(3). 點唱機
(4). 兒童可乘坐的遊戲機

2011年1月7日 星期五

閱讀:現代龍馬何處尋 - 寫在日本第三次開國前夕

趁著龍馬熱潮,在找"學會思考,你贏定了"時,翻到這本書,試讀幾篇覺得不錯就一起買回家看,結果是比"學會思考"一書還有趣的書,在一周通勤時間內看完。

跟台灣同樣夾在美國與中國兩大國之間,作者張瑞昌先生藉由認識日本的在地採訪,讓我們在各篇閱讀中,每每想到台灣的相似之處;外交上與兩大國斡旋的借鏡,從阿扁開國開始政治親美、經濟親中的務實政策,到馬英九的政治、經濟皆親中的重大政策轉變讓人無法一時適應,而閱讀張瑞昌先生的短篇集,則讓人看到更理性務實的島國外交運作。

內政上政黨之間的權力鬥爭,或同黨人士的內鬥,日劇 Gold 描述的曾經放棄奧運金牌夢想的泳(勇)者回歸戰場重返榮耀、職棒熱潮的明星偶像、釣魚台列島的領土爭議、上一輩對日據時期與國民黨來台後的愛恨情仇,最終回歸庶民生活的描寫,訴說著平民百姓的點點滴滴,處處引起共鳴。

這是本不管是哈日族,仇/恨日族,都值得花時間去瞭解的日本觀察記錄。

記得楊淑君的跆拳道爭議中,網路上也有聲音說出,要我們平心理性看待與台灣政經情勢類似的南韓,而非受人煽動的一味反韓。期待也有記者能對韓國進行同樣深入的親身訪問與觀察。

參考:

博客來書籍館 現代龍馬何處尋 - 寫在日本第三次開國前夕

張瑞昌@中時部落格

2011年1月5日 星期三

RFID 產業與 Google Android 2.3 NFC 關係

Barcode 條碼、RFID(電子標籤)的技術組成分為

1. RF tag(標籤)

源由:Barcode 條碼,發展以地域分類:
  1. 美系:統一商品條碼"(Universal Product Code簡稱UPC)
  2. 歐系:歐洲商品條碼"(European Article Number簡稱EAN)
RFID 高頻標籤頻段:800MHz, 900MHz
UHF (超高頻) Class1 RFID
安全加密驗證:TI 與 Certicom 的研究
EPC(Electronic Product Code) code, next generation barcode(EGC Gen 2)
條碼標準概觀: http://www.gs1tw.org/twct/web/EPC/epc01.html
使用廠商:沃爾瑪、美國國防部、麥德龍、思科
tag 與 code的關係:RFID tag 這種封裝技術,載有 EPC code

2. RFID 專利持有公司
表一 RFID專利許可證合夥機構與RFID智慧產財權授權計畫之比較

RFID智慧產財權授權計畫 (Rapid Start RFID Licensing Program)
參與廠商: SAMSys, Zebra科技, 飛利浦半導體、夏普、Sensormatic以及TransCore公司
目的: 能夠更為明確那些廠商具有合法使用Intermec公司145項專利RFID技術的權利

RFID專利許可合夥機構 (RFID Patent Licensing Consortium)
參與廠商: Alien科技公司, Applied 無線辨識組織, Avery Dennison, Moore Wallace,
Symbol科技, ThingMagic, Tyco Fire & Security, Zebra科技
目的: 讓廠商簡化使用全部廠商之RFID專利,一共3,000多項專利.

Source : 財團法人國家實驗研究院科技政策研究與資訊中心 整理,2005年8月

3. 條碼與讀取器間問題:
  1. 多標籤碰撞解法與讀取速度的取捨
  2. tag 受應用材料影響頻率訊號
  3. 天線方向影響讀取率,假如 tag 與 reader 兩天線正交則無訊號

4. RFID 相對於傳統條碼的優點
  1. 可長距離(超過 7 公尺), 在 0.2秒(200milli seconds)有 95% 讀取率
  2. 可多標籤讀取

5. RF Reader(讀取器),
  1. Data logger, 以 cloud computing 術語來看是 (embedded) thin client

6. Middleware(中介系統軟層),
  1. 分為 Server 端與 Client 端兩大類

7. Application(終端應用程式與使用者介面)
  1. 系統廠或承包服務廠商撰寫

8. Network, Cloud computing, 物聯網
  1. 應用:物聯網(網路伺服器),
  2. 飲料應用條碼, 追溯條碼,
  3. 物流應用:大賣場(Wall-Mart)、貨運公司(DHL)
  4. 國際標準:EPCglobal Network Framework, 組織(GS1)
傳統的手機加 Camera 再下載條碼掃瞄軟體,就視為 reader 端。
最近 Google 在 Android 2.3 力推 NFC:
  1. 用在取代信用卡、現金的電子錢包上就偏 tag 端,而店家、廠商就需要使用 NFC reader 端機器來讀取手機上的 NFC tag。
  2.  用在廣告客製化上 Android 2.3 + NFC 也是 tag 端,廣告播放機則需要有 NFC reader.
2011/05/14 update

Google I/O 2011: How to NFC 的一小時現場 demo,可以看到目前 Google 是把 Android 的 NFC 功能當作複製 Android 使用者環境與行
為的工具,比如複製看到的文字、圖型檔案,應用程式,在對戰遊戲中
甚至可以直接 NFC 連線對戰,如果對方還沒安裝 NFC 也會自動導向該
遊戲的 Android Market(Google Play) 網頁,讓你直接下載新遊戲。

Google 的 NFC demo 除了前述功能外,還強調了克隆、複製 Android 使用情境。

Google I/O 2011: How to NFC
http://www.youtube.com/watch?v=49L7z3rxz4Q

2011/06/06 update:
Google 為了推廣 NFC 的電子錢包應用,五月推出了 Google Wallet 
應用推廣專頁,Google 錢包一推出就被 Paypal 告侵權,但 Google 目
前否認有竊取 Paypal 的商業機密。

2011/06/13 update:
Why is NFC so important? 一文中提出了 NFC 與 RFID 等相近協定的
差異之處,讓我們瞭解為何 NFC 的推出值得我們注意。
  1. NFC 在一個 reader 前可以當作被動的裝置,可以提供簡易的條碼序號,也可能當作一個無線信用卡,因此我們可以將 NFC 裝置當作電子錢包使用。有 NFC 被動裝置就可以在任何可以讀取 NFC 的機器購買東西。
  2. NFC 可以讀取被動裝置,因此 NFC 也可以讀取別人的信用卡資訊,也可以讀取折購優惠資訊,因此你的手機也可以讓你賣東西給任何擁有類似 Visa Wave 無線感應卡片的買家。
  3. NFC 支援 Reader 之間的溝通,因此任兩支手機可以透過 NFC 進行溝通,如果手機中儲存了電子金錢的資訊,就可以達到個人對個人的金流交易。
看完以上三點,很明顯的讓我們知道 NFC 的使用將有極大潛力改變未
來的金流方式。

參考:
  1. 中研院-RFID產業標準-EPCglobal Network介紹
  2. RFID產業組織提議成立專利權許可合夥機構
  3. 傳技資訊 RFID 產業發展現況與挑戰
  4. Google Wallet