2012年10月10日 星期三

學習使用 Mac OS X on Mac Book Air


一、在單一程式內的操作:
1. Function keys:
Fn + F1(F1) ...Fn + F12(F12) for function keys in MBA

另外可以勾選 終端機 -> 服務 -> 服務偏好設定 -> 鍵盤 -> 
勾選 使用所有 F1, F2 等... 選項, 缺點是原本的功能快速鍵就要使用 Fn + F? 
來執行功能, 看每個人常用的是哪一項再選擇要不要勾選

2. Page up/down Home/End keys:
Fn + up/left (page up/home); Fn + down/right (page down/end) in Mac OS X
瀏覽器可以用, 但是遇到 terminal 會吃掉 Page Up/Down  XD

3. word/string selection:
選字要三指 touch, 還在練, 有時候不知道是誤觸還是有其他功能, 不用三隻也可
以控制選字

double touch 可以選 word, 但要選超過一個 word 還是要用三指 touch 或是 
按下觸控板來選



二、虛擬桌面的操作:
1. 快速開啟螢幕保護程式:
螢幕熱點是要把滑鼠移到最角落, 昨天沒試出來, 剛才試只要確定移到最角落就
可以觸發事件

當然要直接蓋上上蓋也可以 :P

另外記得要設定立即開啓密碼保護, 使用者與群組關閉自動登入, 這兩個設定

2. 在虛擬桌面切換應用程式:
還沒看懂虛擬桌面, 怎麼指定? 跟以前的九宮格概唸好像不太一樣?

Control + 左右可以在不同程式/桌面? 之間移動, 但是遇到同一個應用程式
的多個執行環境, 就要用實體鍵(F3 那個鍵)跳到最上層, 再用滑鼠點選, 或是在最
上層(桌面層)使用 Control + 左右鍵


Command + tab 是 goto application,使用過後會更新你原本的 
Control + 左右鍵的切換順序


Control + 上下鍵是切換三層:最上層是整個虛擬桌面,中間層是各個不同應用
程式,最下(第三層)是同一個應用程式的不同執行實體。

全螢幕的瀏覽器也佔一個桌面? 可以在最上層(桌面層)的最右邊新增桌面

同樣是 Terminal App 開的多個視窗實體, 可以用 Command + 1(2, 3...etc)
快速切換不同的 Terminal

Control + 數字鍵(1,2,3...etc) 可以跳選指定的桌面。



三、可以試試看的應用程式:
1. App Store 可以安裝 Xcode, 要再安裝 Xcode command line tools 才可以有
堪用的 local terminal 開發環境, 要先註冊 Apple Developer ID(信用卡會刷一元)
, 之後選擇 Xcode command line tools 下載.


2. 要安裝其他 open source 第三方套件
有 
  2.1 Fink(debian based, slow update)
  2.2 HomeBrew(better utilization of Mac OS packages, but slow update, too)
  2.3 macports
可選, 我選了 macports. 

畢竟是用 +mac, mac 又是跟 BSD 淵源較深 +ports, 所以用 macports (大誤)

其實各有優缺點, 大家也都講過了, 要選擇前請自行 google.

3. 中文輸入法
目前 Mac OS X 預設注音輸入法的問題:
  3.1 注音輸入法的標點符號:逗號是 (alt)option + , 
      句點是: (alt)option + . 再選字,選字選項的第二個就是句號。
  3.2 無法關閉自動選字,常常一開始前面的字選對了,繼續打到後面時,
      可能會改到前面原本已經正確又改錯的情況,折衷辦法是每打完常用的字詞, 
      都先多按一下 Enter/Return 完成輸出
  3.3 Option + Command + T 可以叫出標準(不是標點)符號,如果有需要輸
       入特別符號也可以試試。

下面有幾個別人推薦的中文輸入法, 以後有空/需要再試

中州韻輸入法引擎
http://code.google.com/p/rimeime/

OpenVanilla
http://openvanilla.org/

2013/01/21 更新:
FreeGroup 介紹小麥注音
http://mcbopomofo.openvanilla.org/

論壇:
http://apple.stackexchange.com/ 有專門答問 apple 軟硬體的 Stack Exchange  論壇

一開始是在 Google plus 的筆記, 整理在此做個總結

https://plus.google.com/u/0/111753281090331493268/posts/a26sNEU3oTY


2012年9月19日 星期三

Linux request_threaded_irq() 與 request_irq() 差異

一開始看到有 driver 用 request_threaded_irq() 以為是 request_irq() 誤植,Google 查詢後才知道是 Linux kernel 2.6.30 之後新加的 irq handler API

如何確定可以用到 request_threaded_irq() ?

Linux kernel config 需要定義 CONFIG_GENERIC_HARDIQS kernel config 才有支援  threaded irq

原因是在 include/linux/interrupt.h

#ifdef CONFIG_GENERIC_HARDIRQS

函式定義位置在:
    ~linux/kernel/irq/manage.c

1306 int request_threaded_irq(unsigned int irq, irq_handler_t handler,
1307              irq_handler_t thread_fn, unsigned long irqflags,
1308              const char *devname, void *dev_id)

    request_threaded_irq:   kernel thread context ist
    request_irq:    direct function call from hardware IRQ isr

Moving interrupts to threads 介紹 request_threaded_irq() 的由來,從 realtime tree 移植而來,為了減少 kernel 因為要等每一個硬體中斷處理的時間,就另外交給 kernel thread 處理中斷後續處理。

優點:

  1. 減少 kernel 延遲時間
  2. 避免處理中斷時要分辨是在硬體中斷或軟體中斷?
  3. 更容易為 kernel 中斷處理除錯,可能可完全取代 tasklet

   
原本的中斷處理分上半部(硬體中斷處理,必須關閉中斷無法處理新的中斷)跟下半部(軟體中斷處理),因此上半部的硬體中斷處理必須盡可能簡短,讓系統反應速度更快。

request_threaded_irq 是在將上半部的硬體中斷處理更加縮短為,只確定硬體中斷來自我們要處理的裝置,喚醒 kernel thread 執行後續中斷處理。只有將 tasklet 跟 softirq 處理都放到 threaded_irq 的 kernel thread 中,才能發揮最大的系統效能增益。

原本在 reuqest_irq 的 handler 變成快速檢查用的 handler function,

缺點:

對於非處理 irq 中斷的 kernel threads ,需要在原本 task_struct 新增 struct irqaction 多佔 4/8 bytes 記憶體空間,linux kernel 2.6.29 之後(2.6.30)加入 request_threaded_irq

    nested top halves?

jlokier 在回覆 Moving interrupts to threads 補充:跟傳統 top/bottom havles 的差異是 threaded_irq 受限於 Linux kernel system 的 process scheduling 控制。較不會發生寫錯的 bottom half 程式碼造成整個系統延遲的問題。

也可以透過 RT/non RT 跟 nice 等工具調整各個 thread 優先權,丟給使用率較低的 cpu 以及受惠於 kernel 原本可以對 threads 做的各種控制,包括但不限於 sleep, lock, allocate 新的記憶體區塊。

受惠最大的是 shared irq line 的多個中斷處理。除了可以加速共享中斷造成的延遲,threaded_irq 也可以降低在同一段程式碼處理多個裝置中斷的複雜度。

 threaded irq 在使用性上也比 tasklet(接著 top half 直接執行,無法 sleep) /workqueue(kernel context?) 等需要在 top half 增加跟 bottom half 連結與溝通的麻煩。

2012年8月25日 星期六

小兒玫瑰疹

小兒子SCH從8/17開始發燒,連燒3天,都是39-40度,退燒藥已經吃了12次之多,好不容易第四天終於退燒,第五天全身長滿紅疹,第六天紅疹漸消。原來他得到的是『玫瑰疹』。

第一天發燒時,帶去醫院看病,因為沒有感冒症狀,沒咳嗽,沒流鼻涕,醫生只開了退燒藥,說回家再觀察。第二天依舊高燒,吃了退燒藥會退燒,但隔不到6小時又燒起來,兩種退燒藥+塞劑交替使用。他活動力很好,能吃能睡,能調皮搗蛋,我看『輕鬆當爸媽,孩子更健康』這本書上關於玫瑰疹的說明,我就有懷疑SCH很可能是得到『玫瑰疹』。

1. 玫瑰疹的病童年齡要小,一般發病的年紀是兩歲以內。

2. 玫瑰疹常常是發『高』燒,最高溫度動輒三十九、四十度,反覆高燒4-5天。

3. 玫瑰疹的病童沒有呼吸道症狀,也就是沒有咳嗽,沒有流鼻涕,食慾正常,不會嘔吐,唯 
    一的線索是,會有輕微腹瀉,但不嚴重。

4. 玫瑰疹的孩子精神很好,除了發高燒時有點懶洋洋,吃了退燒藥後,又是一條活龍。

5. 最後一個徵象,要醫師檢查喉嚨才看得到,就是有一點點喉嚨泛紅發炎。

 以上藍色文字引用自『輕鬆當爸媽,孩子更健康』 黃瑽寧 著

SCH從8/17-8/19高燒三天後,8/20(第四天)再去看門診,醫師這次有看喉嚨,確實有一點泛紅發炎,但當時疹子還沒長出來,雖然我跟醫師都有懷疑可能是玫瑰疹,可是醫師說,也有可能是泌尿道感染,所以安排作驗尿。如果是泌尿道感染,就幾乎是細菌感染,需用抗生素治療,而且怕下面的細菌往上跑,不能輕忽。等到下午驗尿報告出來,還好是正常! 醫師排除細菌感染,說如果是玫瑰疹應該燒三天,第四天就會出疹子。

 8/20(第四天)從醫院回家後,SCH就退燒了 。傍晚肚子開始冒出小紅疹。8/21(第五天)臉上長滿紅疹,前胸後背全是疹子,手腳也有,但不多,主要集中在軀幹跟臉部。8/22(第六天),臉上疹子漸漸消退,到第七天幾乎恢復正常。

SCH這次玫瑰疹的症狀跟書上提到的五種徵象都符合,因為玫瑰疹屬病毒疹的一種,既然是病毒感染,就只能靠自體免疫力來對抗。退燒藥只是症狀治療,幫助孩子舒服一點而已,並不會因為吃退燒藥就少燒一天,或是縮短病程。雖說如此,我在SCH高燒那三天,總共退燒了12次,因為他高燒時全身是燙的,我既害怕又心疼,想說用退燒藥讓他舒服,也讓我心安。

2012年8月23日 星期四

幼兒近視

四歲的SSH作視力檢查,左眼有100度近視,醫生開長效型散瞳劑,每天睡前點一滴,並再三交代說,電腦、電視、手機、ipad,都不能玩。醫生強調,是不能玩,不是少玩。ssh本來每天都玩電腦跟ipad玩很久,發現近視後,完全不看電視,不碰電腦。一週後回診,竟然變成25度。醫生很滿意他的進步,就說散瞳劑改成一週點兩次,電視可以看,但看30分鐘要休息,至於電腦跟手機還是禁止,並安排兩週後再回診,如果有再繼續進步,就考慮停藥。

因為近視度數有改善,加上醫生說可以看電視了,ssh開始每天看卡通,但沒有每次都30分鐘就休息,結果2週後再回診,度數又加深變成50度。醫生這次謹慎起見,決定繼續點藥水,且一週改成點3次。一個月後再回診決定是否停藥。

2012年8月7日 星期二

101台北市公幼

今年開始實行幼托整合,學區內的國小附幼把3個中大班改制成1個3歲專班,2個中大班。公幼一個班招收30人,中大班共60個名額,扣除直升,優先入園,5歲先登記,剩下不到20個留給4歲。雖然現在少子化,但求過於供,SSH第一次登記公幼還是面臨了抽籤的命運。抽籤時SSH一直嚷嚷著:怎麼還沒到我啊?他一說完,馬上聽到他的名字被唸出來,感謝老天,SSH抽中了。

抽中公幼,開始煩惱的東西不少,尤其是SSH自主能力。 吃飯,穿脫衣服,刷牙,大小便,這些生活能力要開始作到百分百完全自理。像SSH在家大便是用水洗屁股,現在要教他用衛生紙擦屁屁,他很抗拒,他說怕手沾到大便。穿脫衣服繼續天天練習中,我發現要讓小孩穿寬大一點的衣服比較好脫。刷牙他最行了,因為他喜歡刷牙後可以用泡泡糖口味漱口水,所以刷牙是他的最愛。

101年9月起,公幼課後留園可延至六點(or六點半),由於課後留園費用併入註冊單繳費,所以登記時就須決定是否參加。原本以為課後留園是學才藝,像音樂,美勞,工藝,畫畫,黏土,肢體律動等,所以我選擇讓ssh參加,但後來園長來電作最後確認時說,課後留園內容主要是白天課程的延伸,偶爾看看教學影片,但大部分時間都讓孩子在角落玩,如果想學才藝,建議我到外面找,像雲門舞集YAMAHA音樂教室那種。園長說這一學期約有十位小朋友參加,四點放學後將三個班級參加課後班的小朋友,也就是3歲到5歲都集中在教室內,由一位老師照顧至六點半。公幼是就算只有一位小朋友也會開課後留園班,這是台北市政府給雙薪家庭的福利。課後留園(四點~六點半)必須自費,去年是到五點半,約六千元,今年延至六點半,估約八千元。我考慮過後決定先不參加課後留園。大部分可以四點就接放學的家長都選擇不參加,所以三個班90位小朋友中,只有10位留下來。

公幼的學費,101年全天班一學期(約4.5個月)是21873元,不含課後留園。註冊時須另外繳1000元,用來購買書包/圍兜/餐袋。

最近開始準備ssh的開學用品。以下是學校要求自備的東西:2個鋼杯(1個喝水,1個刷牙)
,牙膏牙刷,一包衛生紙,棉被(午睡用),拖鞋。

2012年7月7日 星期六

omap3isp, camera sensor V4L2 subdev driver, media controller

跟上時代的感覺還不錯,摸索了 v4l2 subdev 的設計方式,也讓 camera driver 進化到 current 介面了 :) 雖然為了改版事情變多,戰力也少了一位同仁(算畢業嗎?XD)

希望趕快有生力軍加入,可以補缺額恢復戰力。

1. omap3isp driver
v4l2 因為已經有包進 i2c 介面,因此我們在新增 camera driver 時,就要宣告
~linux/arch/arm/mach-omap2/devices.c 中 omap3_init_camera() 所需要的
struct isp_platform_data *pdata, 會用來註冊 omap3isp device 搭配 omap3isp driver 
使用

其中 isp_platform_data 定義在 include/media/omap3isp.h 中,裡面又需要定義 isp_v4l2_subdevs_group 也就是單一 camera sub device 的 I2C 與 Camera InterFace 定義,如果有第二個 v4l2 subdev 就是新增一個

isp_v4l2_subdevs_group,依此類推。

Camera I2C 是定義在 struct isp_subdev_i2c_board_info *subdevs; 以及 interface,如果是用 parallel(疑?還沒進化到 MIPI),就定義 bus.parallel 當然也要設定裡面的 bridge 介面參數與 VS, HS CLK 高低準位等。

i2c_board_info 中另一個要定義的是 .platform_data 指到 camera sensor 的 pdata 參考 include/media/mt9p031.h 定義 set_xclk 由 SoC 給 camera sensor mclk 的開關,reset 定義 reset 的 GPIO, ext_freq 定義 mclk 頻率, target_freq 定義 pixel clock 頻率

2. camera sensor driver
~linux/drivers/media/video/mt9p031.c
mt9p031_probe()

註冊 mt9p031->subdev.ctrl_handler = &mt9p031->ctrls;

v4l2_i2c_subdev_init(&mt9p031->subdev, client, &mt9p031_subdev_ops);

掛載 v4l2 的 i2c 介面 device, 另外也有定義 spi 介面的註冊方式

crop 與 format 的 window size, pixel format

而 Linux 的 Media controller 目前除了可以控制 camera, display 等 video device 外,也可以包括 audio 等

3. media-ctl
media controller, build kernel 需要加 media controller driver, mknod /dev/media0 c 252 0
設定各個 v4l2 sub device(entity) 的各個 input/output pad 的 pixel format, picture width, height

流程大致上是

media-ctl -r // reset previous links
media-ctl -l '"mt9p031 2-00cc":0->"OMAP3 ISP CCDC":0[1]'
media-ctl -l '"OMAP3 ISP CCDC":1->"OMAP3 ISP CCDC output":0[1]'
media-ctl -d /dev/media0 -V '"mt9p031 2-00cc":0 [fmt:YUYV/1024x768]'
media-ctl -d /dev/media0 -V '"OMAP3 ISP CCDC":0 [fmt:YUYV/1024x768]'
media-ctl -d /dev/media0 -V '"OMAP3 ISP CCDC":1 [fmt:YUYV/1024x768]'
yavta -f YUYV -s 1024x768 -n 2 --capture=4 -F `media-ctl -e "OMAP3 ISP CCDC output"`
當然也可以串 previewer, resizer,但這就要看各個 entity(sub device) 的 input/output pads

4. references:
~linux/Documentation/video4linux/omap3isp.txt
~linux/include/linux/omap3isp.h

http://git.ideasonboard.org/?p=media-ctl.git;a=summary 其中有 media-ctl git tree
https://gitorious.org/omap4-v4l2-camera 其中有 yavta git tree
git://gitorious.org/omap4-v4l2-camera/yavta.git

http://processors.wiki.ti.com/index.php/UserGuideOmap35xCaptureDriver_PSP_04.02.00.07

http://www.linuxtv.org/downloads/presentations/summit_jun_2010/20100206-fosdem.pdf

http://processors.wiki.ti.com/index.php/Writing_V4L2_Media_Controller_Applications_on_Dm36x_Video_Capture

2012年6月8日 星期五

git repository with large files settings

In some circumstances, we have to allow developers to put large files into git repository, but that would
usually encounter mmap/malloc memory space shortage errors in git.

To fix this issue,  we have to upgrade git version to 1.7.10+ and add the following settings to ~/.gitconfig

[core]
    packedGitWindowSize = 128m
    packedGitLimit = 128m
    bigFileThreshold = 128m
[pack]
    compression = 1
    windowMemory = 128m
    threads = 1
    window = 1
    depth = 1
    deltaCacheSize = 1
    packSizeLimit = 128m

vendor BSP Linux kernel 版本選擇

用了 Vendor  的 Android BSP,就必須跟著提供的 Linux kernel 版本走,但是如果用的
第三方晶片、模組廠只給 binary driver,driver 又鎖定特定版本介面,這時候只好跟
著找其中的交集,或是差異最小的版本。

比較可能有出問題的就是 audio alsa, video v4l2, wifi 的 wext, cfg80211 等介面差異。

晶片線路內部供電與外部供電

在追 sdcard 的 vmmc1 regulator 設定時,發現 TI 的設計是透過 PMIC 再給 vmmc1
電源,但回過來想既然 SoC 都有電了,為什麼就 mmc1 controller 要外部給電?

問了 Ken Chen 才知道有幾種可能,一種是數位跟類比電源差異,第二種可能是特定
的 bus 介面需要將電源切出來另外在 BUS 傳輸協定中獨立控制電源開關,第三種可
能是晶片本身有的電壓跟外部供電的 controller 電壓不同。

外部供電或內部供電的差異,也是有可以研究的地方。

2012年5月11日 星期五

使用 android property 連結 linux user space 與 android service

某些情況下我們希望在 linux user space 做某些動作或檢查,開關 android service
透過 android property 的 set property (setprop in init.rc 或 command line 或 C API),
再經由 android init.rc 的
on property:my.property=value
語法再執行 start/stop service 就可以完成這個連結



修改過檔案後直接 git pull 為何一定失敗?

原本已經習慣的 git pull 如果失敗,就 git stash 保留 working tree 再 git pull,最後 git stash pop 看 git auto merge 或有 conflict 再手動解之後 git add, git commit ...

但今天被問到為何直接修改檔案後 git pull 都會必須 stash 或 commit 時,卻答不出來

答案在 git help pull 的說明中,git pull 其實是 git fetch 再 git merge,而 merge 一定要是一個 branch,但在 working tree 內修改過的內容如果沒 commit 就不屬於這個 working tree 對應的 branch,因此 git 會警告你要先 commit (之後會 auto merge 或 conflict),或者是依我目前習慣的 git stash 暫存修改,等 git pull (主要是 merge) 之後再 git stash pop。不然可能會有遺失 work tree 修改的風險。

stash 想成是 stack 就比較容易理解,0 在最上面是 top,數字越大放在越底下表示越舊的資料,也符合一般圖解的 stack 示意圖。

習慣的動作習慣以後,本來就沒搞懂的、或遺忘細節,一被問就倒了 XD


2012年3月31日 星期六

python, django and mongodb 初心者參考資料

在 ubuntu 嘗試 python, django 與 mongodb 的組合建 web application

python 程式語言參考資料:
http://docs.python.org/reference/index.html#reference-index
http://docs.python.org/contents.html
http://code.google.com/intl/zh-TW/edu/languages/google-python-class/
http://pypi.python.org/pypi
http://www.youtube.com/playlist?list=PLEA1FEF17E1E5C0DA

python web framework, django 參考資料:
https://docs.djangoproject.com/en/1.3/intro/tutorial01/
http://www.openfoundry.org/index.php?option=com_content&task=view&id=1330&Itemid=144
http://www.openfoundry.org/tech-column/1350
http://blog.wu-boy.com/2009/04/django-web-framework-django-%E5%88%9D%E9%9A%8E%E5%AD%B8%E7%BF%92%E5%BF%83%E5%BE%97/

https://code.djangoproject.com/wiki/UsingVimWithDjango

django-admin startproject firstproject
cd firstproject

./manage.py
列出 django 可控制參數

./manage.py startapp firstapp
產生新的 django application

修改 firstproject/settings.py 設定 database, install application,
修改 firstproject/urls.py 設定 web application url

修改 firstproject/firstapp/models.py 加入定義的 database schemas, 或
 mongoengine 的 Document,相當於 Ruby on Rails 的 model

修改 firstproject/firstapp/views.py 加入要支援的 url actions
(配合 firstproject/url.py),相當於 Ruby on Rails 的 controller

修改 firstproject/templates/*.html 顯示的 html temlate 相當於
Ruby on Rails 的 view

修改 firstproject/urls.py 加入要支援的 url regex 相當於 Ruby on Rails
的 routing 設定

firstproject/firstapp/manage.py runserver
如果沒錯誤就應該可以在預設的 http://127.0.0.1:8000/ 看到你的
django web applications

mongodb 的 python driver, mongoengine 應用在 django 的參考資料:
http://mongoengine.org/docs/v0.5/django.html

django 搭配 mongodb 的基本參考範例:
IBM developerWorks: Using MongoDB with Django

automation and deployment of django web application:
Fabric:
http://docs.fabfile.org/en/latest/index.html

http://www.jeffknupp.com/blog/2012/02/09/starting-a-django-project-the-right-way/
提到 python-django-south (ubuntu package name of south) 可以管理
 database migrations,但仍不確定對 NoSQL schema less 的 mongodb 是否有用?


2012年3月29日 星期四

日舒 黴漿菌

如果久咳不癒”(一個月)、頓音型咳嗽,睡眠中咳到醒,發燒不退,可能是黴漿菌感染,醫生會開日舒,需要持續三到五天的服藥,另一個之前常見的抗生素是安滅菌。

耳鼻喉的上呼吸道感染如鼻竇炎、中耳炎,下呼吸道感染,如支氣管炎、肺炎則是使用安滅菌抗生素治療,可以殺的細菌有很多樣可以參考

gsk 的安滅菌 pdf 說明檔案。常見副作用是腹瀉、噁心。

2012年3月24日 星期六

Linux 支援 ARM big.LITTLE 架構的方式

摘譯 http://lwn.net/Articles/481055/

這篇文章中提出了兩種支援 ARM 新雙核架構 Coretex-A15 & Cortex-A7 的可能實作方式。原本 ARM big.LITTLE 期望達到可以使用 Coretex-A15 的高效能與 Coretex-A7 的低功耗,達到兩種市場通吃的多核 cpu cluster 系統。

Linux scheduler 原本預期的多核系統,都是假設每顆核心的工作效能相等,因此要在 Linux 支援 ARM big.LITTLE 的異質多核,勢必需要改變原有的 Linux kernel,才可能決定何時將哪一個 kernel task 交由 Coretex-A15 或 Coretex-A7 執行?以享受到 ARM big.LITTLE 的高效能與省電的雙效果。

針對 Linux 整合 ARM big.LITTLE 架構的可能性,文中提出兩種可實作方式。

第一種是 ARM 的參考實作使用了 Coretex-A15 與 Coretex-A7 的虛擬化功能,讓作業系統 ARM big.LITTLE 的多核心硬體只有一組 Coretex-A15 cluster (4 核)的虛擬核心。

對於 Linux scheduler 來說因為仍可以安全的套用多核心的硬體都是同等效能與耗電量,如此 hypervisor 可以在作業系統不知情的狀態下,將整個執行狀態從某一個 cluster suspend,再搬移到另一個 cluster resume 繼續執行。對作業系統來說差異是會發現速度的改變(看是在 big Coretex-A15 或是 LITTLE Coretex-A7 執行)。

優點是對已經支援 Coretex-A15 多核的作業系統可無痛轉換,但缺點是 hypervisor 需要多考慮 Coretex-A15 與 Coretex-A7 的 cache 等系統實作細節的差異。另一個衍生問題是每次 hypervisor 轉換 cluster 的 performance penalty 是否造成另一種資源浪費?

第二種是利用 Linux Kernel 原有的 cpu driver cpufreq 的架構,將不同的 Coretex-A15 與Coretex-A7 工作頻率排列組合後,當作一個虛擬的 cpu freq 設定。這方法的好處是上層 user space 控制 kernel cpu 工作頻率的操作介面不用改變。

2012年3月19日 星期一

閱讀 Blind_signature 維基百科條目


Blind Signature

一開始是看到 godfat 的 G+ 的連結,連到 gslin 的 blogspot blind signature

維基百科的類比方式是,把一封秘密的信件放到信封中,簽名的人對著內夾覆寫紙
在內的信封直接簽 (因此簽名者不知道信件內容,但確實達到驗名証身的效果),因此
不止信封,連信件內容也有簽名,主要適用在需要隱私又要能確保無偽造可驗証的
系統。

兩大應用分別是:
1. 匿名投票,又需要能驗全體投票內容,
2. 數位錢包。

其中用到的數學原理是 blind RSA Signatures,原訊息 m 加上 blinded factor r 後變 m',
m' 給簽名者簽完得到 s', 原信件作者可以再透過 blinded factor r**(-1) 跟 s' 取得
原訊息 m 的簽名 s. (see wikipedia section)

但維基百科也提到 RSA 的 blind Signature 同時也可能被攻擊者用來騙簽名者解一段
簽名者 public key 加密過的私密訊息,主因是 1. blind (簽名者不知道是簽啥) 2. RSA
的 private key 簽名其實相當於解開用 public key 加密的內容,因此使用 RSA 簽名的
話,要記得 RSA 簽名跟加解密絕對不能使用同一組公開/私密金鑰。

https://plus.google.com/113906251313439000579/posts/iHQ6j2ktYH8
http://blog.gslin.org/archives/2012/03/18/2852/blind-signature/

https://en.wikipedia.org/wiki/Blind_signature
http://crypto.stanford.edu/pbc/notes/crypto/voting.xhtml

digital cash 電子錢包
https://en.wikipedia.org/wiki/Ecash

voting protocol 可驗証的投票協定
https://en.wikipedia.org/wiki/End-to-end_auditable_voting_systems

zero knowledge proof 不知道內容下驗証訊息為真的方式
https://en.wikipedia.org/wiki/Zero-knowledge_proof


2012年3月16日 星期五

add new ssh key/host settings for github access

主要是照 github 的 Set Up Git help, Linux part
(不知道為什麼這個網頁載很久...有時還會 timeout XD)

1. ssh-keygen ...輸入 id_rsa_github 或自己取名以免蓋掉你原本的 ssh key pairs
2.  ssh -i .ssh/id_rsa_github -T git@github.com 確定可以 ssh (no shell, else..0wned XD)
3.  setup github username and api token for github services
    git config --global github.user your-github-username
    git config --global github.token your-github-api-token

4. ~/.ssh/config 加入針對 github 的 ssh key

    Host github.com
        IdentityFile ~/.ssh/id_rsa_github
        SendEnv LANG LC_*
        HashKnownHosts yes
        GSSAPIAuthentication yes
        GSSAPIDelegateCredentials no

接下來再照 github 的 create a repo....網頁就可以開始你自己的 github open sharing
之旅了,只是要記得免錢的服務都是要公開的...

change vimdiff colors in railscasts.vim colorscheme

在使用 railscasts.vim 一段時間後,當用到 vimdiff 時,常常因為 railscasts.vim 中的
DiffAdd, DiffDelete 設定(DiffText, DiffChange則未定義) 顏色不易分辨而作罷,甚至
有時候就回到 diff -u 的黑白 -+ 世界比較單純。

但在看過 Change vimdiff color 一文後才知道原來只要改 DiffAdd, DiffDelete, DiffText,
DiffChange 四個選項,就可以讓原本 railscasts.vim 的 colorscheme 跟 vimdiff 使用
更容易分辨的 256 色的 xterm 環境設定,我調整後的四個選項設定如下:

DiffAdd 指相對於另一邊檔案新增的部份

DiffDelete 指相對於另一邊檔案刪除的部份
DiffChange 指兩邊檔案文字有差異的文字區塊
DiffText 指兩邊檔案文字差異的文字內容



highlight DiffAdd cterm=bold ctermbg=245 ctermfg=white
highlight DiffChange cterm=bold ctermbg=100 ctermfg=black
highlight DiffText cterm=bold ctermbg=140 ctermfg=white
highlight DiffDelete cterm=bold ctermbg=180 ctermfg=black


https://github.com/sjh/config_files/blob/master/vim/.vim/colors/railscasts.vim

用起來效果如下圖:











當然你可以再改成自己喜歡的配色,而 xterm 256 色(0黑~255白)的對照表可以參
考以下網站:
 http://vim.wikia.com/wiki/Xterm256_color_names_for_console_Vim

guifg 跟 guibg 的部份因為我沒用到所以還沒調整。

2012年2月20日 星期一

TI OMAP3 DM3730 USB host controller high full low speed?

因為 TI OMAP3 DM3730 在 USB host controller 上偵測不到 full/low speed USB device,經查之後發現目前的硬體接線 ULPI 因為 DM3730 跟選用的 USB transceiver 的ULPI phy 的 serial 排線順序不一樣,在設定為外接 USB transceiver phy,而非 TLL 的接線方式時,無法使用 full/low speed mode,選用 device 時必須注意只能接 high speed device,如果要保持原有 

USB host controller ---phy--- USB transceiver --D+D-

接法, ulpi phy 線路不改而想要使用 full/low speed USB device,可以再外接一顆 high speed USB hub 解決。

2012/02/24

今天又花了些時間跟 Ken,還有 EE 確定 USB 問題,有些地方一開始誤解,因為是從軟體驅動程式行為,發現硬體有問題,一開始以為是目前元件接法

USB host controller ---phy--- USB transceiver --D+D-

無法實作, EE 在我提出有問題後就進行調查,發現是 ulpi serial 無法對應,其實並非這樣子的元件接法問題,而是 DM3730 的輸出分 ulpi parallel, ulpi serial, TLL 三種,因為我們有接 transceiver,就只能選擇 transceiver 有支援的 ulpi parallel 或 ulpi serial二擇一,high speed 的接法是 ulpi parallel,而 full/low speed 的 ulpi serial 接法,因需要接腳比 parallel 少,原本可以使用同一組硬體排線,但是因為 DM3730 跟所用 transceiver 的 ulpi serial 接腳順序與 transceiver 不同,造成無法使用現有的線路,待跳線驗證後可確定。

結論:

跳線加上 ohci driver 實測驗證後發現以 3 wire 的 ulpi serial 對 usb transceiver 就已經會發生誤判為有 USB low device (MiniPCI-E 上沒插卡),但我們 usb host port 的 transceiver 又沒有介面控制調整為 3-wire serial, 6-wire serial 或 12(8+4) parallel(預設),再加上 DM3730 SoC 原有的 ehci 轉換到 ohci 就會鎖死的 bug,最後確定無法使用原來的 

DM3730 USB host controller -- phy -- USB transceiver -- D+D- 

的接法,必須要再外接一個 USB hub 在 MiniPCI-E 上才能使用 USB full/low speed device.

相關文章:

2012年2月18日 星期六

Cadence Allegro 可讀電路圖 brd layout 檔案

The Cadence®  Allergo®  FREE Physical Viewer 填入個人資料後,會郵寄下載連結到電子郵件信箱供下載。

如果要測漏電,通常都是讀 EE 人員給的 pdf 電路圖,但要量測電壓電流時,pdf 檔怎麼對應到 PCB 板子上的元件就比較麻煩了。

Ken 因為有畫過電路圖 layout,提出向 EE 要 brd 檔案的需求,並且教我們如何使用 Allegro 讀 brd 檔,當然我還在學習中(*汗*)。

首先看 pdf 轉出來的電路圖,找到要量測的點,如 T82,但要找到PCB 板子上的元件實際量測點 ,需要使用 Allegro 開 brd 檔,選擇 Top 或 Bottom(因為只有這兩面我們量得到)配合搜尋跟 highlight 去找到 T82 的亮點,再配合右下角縮圖,跟滑鼠中鍵的移動視角(而非圖本身)就可以知道在整個 PCB 板的哪個實際位置了。

說到 Cadence...今天在 Google plus 有個叫 Cadence 的 porn bot 要找我視訊XD 看到 Cadence 我就先點了,但問了幾個問題後,發現都是固定回應,就刪了他,要刪掉加入 Google talk 的聯絡人還有點麻煩,Google plus 上看不到,必須要到 Gmail 選左上角的通訊錄 tab,搜詢新加的聯絡人 porn bot email address, 再刪除他即可。

2012年2月10日 星期五

BUILD_BUG_ON_XXXX macros in kernel.h

剛在 stackoverflow 看到有人在問 ":-!!" 在 C 語言的作用,點進去才知道是 linux kernel
header file ./include/linux/kernel.h 的兩個 Macro 定義:

683 /* Force a compilation error if condition is true, but also produce a
684    result (of value 0 and type size_t), so the expression can be used
685    e.g. in a structure initializer (or where-ever else comma expressions
686    aren't permitted). */
687 #define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
688 #define BUILD_BUG_ON_NULL(e) ((void *)sizeof(struct { int:-!!(e); }))
689
然後也有人解釋了:-!!,就是 : 取位元數, - 負的,!! 測試 e 是否為 0 ,回傳 0 或 1

就語意上是在測試另一個在 ./include/asm-generic/bug.h BUG_ON() macro 是否回傳
 0 或 null,如果是 0 或 null 就正確 (size 0),否就會 build fail (size (-1))

2012年2月8日 星期三

解 bug 的心理陷阱:我的可以動

昨天又遇到鬼打牆的解 bug 問題,一開始是自己寫的 AP + JNI shared library 可以用,但是給同事的 AP call 就有錯誤,於是卡在我的可以動的迷思中 XD。所以先請同事幫忙 debug,但是除了一個 static access warning 外,在應用程式端也沒別的線索了。自己才真正開始回去追 JNI shared library,結果確定是該用 jintArray 的型態用錯為 jint *。於是修改過後今天給同事確定可以解掉這個問題。但現在問題變成是,為何原本的寫法我的應用程式可以存取 JNI integer array ? XD

另外昨天看到一篇 Joshua Bloch 的 binary search, merge sort 的實作 bugJoshua Bloch 發現 Jon Bentley 的 Programming Pearls 書(1986, second edition 2000 )中的演算法,跟他在 JDK 實作 java.util.Array 的 binarySearch (存在九年的 bug) 同樣犯了 divide and conquer 取中間數的錯誤:

 6:             int mid =(low + high) / 2;

mid 可能遇到太大的 low 跟 high 造成 mid 發生 integer overflow,大於最大正整數 (2^31 - 1),這個 bug 可以藏這麼久的原因是之前沒有人測過這麼大量的 binary search 或 merge sort 解法是

 6:             int mid = low + ((high - low) / 2);

或用 Java 的 unsigned right shift, ">>>", (最高位補 0 確保為正整數)取代除以 2 較快些

 6:             int mid = (low + high) >>> 1;

C/C++ 參考解法如下:(參考 Nokia 的 Antonie Trux 指出 C89/90 跟 C++、C99 說明 signed integer 相加 overflow 的話是未定義行為,因此先轉型為 unsigned int)

 6:             mid = ((unsigned int)low + (unsigned int)high)) >> 1;

該文後面 Joshua Bloch 說明的是這個 bug 讓他學會謙虛,即使是我們認為理所當然的取平均都可能出錯,細心的設計、測試的重要性、正規方法、檢 視程式碼、靜態分析都是很棒的,任何單一方法絕對無法保證沒有 bug。即使我們竭盡全力解一個 bug,也可能要花上幾十年才解掉。因此寫程式必須小心、防衛並時時警覺。



2012年2月5日 星期日

被誇大的架構議題

摘譯:Architect - Overrated 一文自我警惕開發者該做的事

1. 總是在談願景、大方向
2. 認為自知該怎麼建造系統
3. 對於團隊不依照自己想法執行讓你不高興
4. 從沒擁有一個可用的 build
5. 花太多時間寫文件而非程式碼
6. 可以寫出產品原型,但從未寫出可賣的量產品
7. 花太多時間開會
8. 寫過最好的程式碼都是幾年前的事了
9. 被問到意見時,都只能回答一些不切實際的大概、方向
10. 懷疑團隊成員私底下取笑你
11. 花太多時間看科技、資訊產品部落格
12. 成為過去式

不要只寫維基文件跟 powerpoint。寫程式。

2012年1月15日 星期日

mount loop offset partitions of root disk image

因為 VirtualBox 找不到讀卡機的關係,必須要有辦法在 ubuntu 讀寫整個 disk image 中的個別
partitions...更新後再到 windows disk image 更新...

原本只知道 mount -o loop 掛載單一 partition 到目錄。
Ken 找到 loop mount disk image 的選項中,有 offset 的選項可以將 root disk image 中的 partition
個別掛載到 linux 目錄。

可以先對 disk image 下 fdisk -ul 或 parted,差別是 parted 可以直接下 unit 給 B 選項知道
partition 在 disk image 中的 byte offset,fdisk 需要從 sector size 轉成 byte

fdisk 指令是給 -u 取得該 disk 的 sector byte size
sudo fdisk -u -l /dev/sdx

parted 指令是給
sudo parted /dev/sdx
unit B (設定 byte offset)
print

parted 可以用 -s 的 script 選項變成對 script 友善的工具。

最後再下 mount -o loop,offset=calcalated_byte_offset whole_disk_image /path/to/dir
掛載其中的單一 partition

參考:

http://www.andremiller.net/content/mounting-hard-disk-image-including-partitions-using-linux

http://nixcraft.com/ubuntu-debian/15295-ubuntu-mount-root-disk-image-loop-device-using-offset.html



2012年1月12日 星期四

Linux sound ALSA soc kernel 文件略讀

主要參考 Documentation/sound/alsa/soc/ 目錄中的文件

    Documentation/sound/alsa/soc/overview.txt
    Codec driver: 包括 audio control, interface, DAPM define, I/O function
    sound/soc/codecs/twl6040.c

    Platform driver: audio DMA and DAI(I2S, PCM, AC97)
    sound/soc/omap/omap-mcbsp.c DMA 控制, DAI system clock

    Machine driver: SoC machine board control and audio event
    sound/soc/omap/sdp4430.c DAI 控制
        1.  Amplifier 控制
        2.  snd_soc_card 註冊為 platform device
        3.  DAI system clock 控制跟 DAI 初始化設定

    Documentation/sound/alsa/soc/DAI.txt
    講 soc codec 常用的 AC97, I2S, PCM 三種 Digital Audio Interface

    Documentation/sound/alsa/soc/clocking.txt
    audio 相關的 clock 描述:
    Master clock, MCLK, SYSCLK
        derived from crystal(fixed), PLL(configurable), CPU clock(configurable)
        to produce correct playback and capture sample rates

    DAI clock
        1.  DAI clock is driven by Bit Clock(BCLK)
        to drive digital audio data between CPU and codec


        2.  frame clock(LRC Left Right Clock, FRAME), is sample rate
        to signal start of audio frame

        3.  BCLK(Bit Clock) 的產生依 CPU 與 audio codec 設定不同而改變
            BCLK = MCLK / x
                or
            BCLK = LRC * x
                or
            BCLK = LRC * Channels * Word size

        4.  BCLK 越慢越能達到節電源的效果
        5.  audio codec 也可以產生 BCLK,通常比 cpu 更精準

    Documentation/sound/alsa/soc/codec.txt
    ASoC codec driver 是通用、不相依於硬體的抽象層,用來設定播放或錄音。
    其中不應有相依於軟硬體平台的程式碼。硬體平台相關程式碼應該放在 platform driver 與 machine driver 中。

    codec driver 必須提供的功能:
    1.  Codec DAI 與 PCM 設定 snd_soc_codec_dai structure
    包括 stream name, channel, rate, format

    2.  Codec control IO
    control_data 指向 i2c/spi/ac97
    reg_cache 指向 codec register map
    read/write 指向 i2c/spi/ac97 的 read/write 介面

    3.  Mixer 與聲音控制
    定義 include/sound/control.h 中的  struct snd_kcontrol_new 內容,可以使用以下 macro:
    include/sound/soc.h 定義的 kcontrol builders macro,如 SOC_SINGLE() 等
    可以建立一個 xname ,以便控制如 Playback Volume 等的暫存器。

    4.  Codec Audio operation
    需要實作 snd_soc_ops 提供的介面,參考

    5.  DAPM 描述
    Dynamic Audio Power Management 描述 codec 元件的電源與控制的暫存器,可以參考 Documentation/sound/alsa/soc/dapm.txt

    6.  DAPM 事件處理
    用來處理 codec domain 與 cpu domain 的事件呼叫,註冊所需的 callback function 即可,是實際執行 power saving 的函式。
164 Power states:-
165
166     SNDRV_CTL_POWER_D0: /* full On */
167     /* vref/mid, clk and osc on, active */
168
169     SNDRV_CTL_POWER_D1: /* partial On */
170     SNDRV_CTL_POWER_D2: /* partial On */
171
172     SNDRV_CTL_POWER_D3hot: /* Off, with power */
173     /* everything off except vref/vmid, inactive */
174
175     SNDRV_CTL_POWER_D3cold: /* Everything Off, without power */
176
    sound/soc/soc-core.c 有實作。呼叫 snd_power_wait() snd_power_change_state()

    7.  Codec DAC 數位靜音控制
    可用在啟動 DACs 之前的數位靜音,避免系統雜音。可確保不會有數位聲音資料傳到 DACs,可以註冊 include/sound/soc-dai.h 其中 struct snd_soc_dai_ops {} 所定義的 digital_mute callback 讓系統呼叫。

    另外系統也有預設定義靜音介面 snd_soc_dai_digital_mute()

    Documentation/sound/alsa/soc/machine.txt
    machine 或稱 board driver 就是將 platform driver 與 codec driver 連結的程式碼,會使用 struct snd_soc_card 在 linux kernel 註冊一個 platform device,提供 probe, remove...介面
  
    DAI 的控制使用 struct snd_soc_dai_link 連接 codec driver 與 cpu DAIs,可用來初始化 DAI system clock 等 DAI 所需的初始化動作,如 machine audio map 跟 codec audio map,或是有未連接的 codec 腳位設定等...snd_soc_dai_link 設定 codec<->CPU 之間的 DAI
    比如:
 58 /* corgi digital audio interface glue - connects codec <--> CPU */
 59 static struct snd_soc_dai_link corgi_dai = {
 60     .name = "WM8731",
 61     .stream_name = "WM8731",
 62     .cpu_dai_name = "pxa-is2-dai",
 63     .codec_dai_name = "wm8731-hifi",
 64     .platform_name = "pxa-pcm-audio",
 65     .codec_name = "wm8713-codec.0-001a",
 66     .init = corgi_wm8731_init,
 67     .ops = &corgi_ops,
 68 };
 69
 70 struct snd_soc_card 再跟 snd_soc_dai_link 連結.
 71
 72 /* corgi audio machine driver */
 73 static struct snd_soc_card snd_soc_corgi = {
 74     .name = "Corgi",
 75     .dai_link = &corgi_dai,
 76     .num_links = 1,
 77 };
 78

    Machine power map 可以擴充 codec power map 成為 audio power map 的一部份,可達到自動開關  speaker/HP amplifiers 等 audio path。machine init function 可以連接 codec 腳位到 jack socket,請參考 soc/pxa/spitz.c 與 dapm.txt

    Machine 的混音器 mixer 控制

Linux kernel alsa 版本查看方式
        1.  linux kernel source code
        include/sound/version.h
        #define CONFIG_SND_VERSION "1.0.21"

        2.  linux run time /proc file
        cat /proc/asound/version

Linux kernel alsa driver 所產生的 /sys 介面 device 檔案,最後會再透過 user space 的 mdev 或 udev (ueventd in android?) 生成 /dev/controlC0 或 /dev/snd/controlC0 等介面,供 alsa lib 與 alsa utility 使用。

2012年1月6日 星期五

TI OMAP DM3730 PWM 控制

DM3730 TRM 的第 16.2.4.6 章節,參考 Figure 16-12 跟 16-13

1. GPTi.TCLR[7] 的 SCPWM 是 Set or Clear PWM,指 PWM 預設 high(Set) or low(Clear)

2. 先設定 GPTi.TLDR 暫存器給定
(0xFFFF FFFF - GPTi.TLDR[31:0] LOAD_VALUE + 1) overflow 觸發的頻率
3. 設定 GPTi.TMAR match 暫存器給定 match 觸發的頻率

overflow 跟 match 的 pulse 頻率設完之後

4. GPTi.TCLR[11:10] 的 TRG 控制 PWM 哪時候要變換 high/low
  TRG == 0x01 是只看 overflow
  TRG == 0x02 是看 overflow 跟 match 的 pulse

5. GPTi.TCLR[12] PT 位元設定 PWM 依 TRG 變換之後是一個 pulse 或維持新準位(high/low)
直到下一次依 TRG 設定的變換

實際的驅動程式範例可以參考:https://github.com/scottellis/omap3-pwm
裡面用到 TI Linux BSP 的 arch/arm/plat-omap/include/plat/dmtimer.h 介面,可以省去
看 datasheet 查暫存器定義的時間

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.