2011-11-13

為什麼 autorun 是一張可怕的空白支票?

TODO: 還沒時間寫,如果網友有興趣,歡迎在回應欄先給個清晰的答案,造福人群,功德無量。

後記 2012-02-22(這其實是本文,但實在是拖太久了,所以還是稱為「後記」。)

這裡所謂的「空白支票」概念裡,最關鍵的就是授權的問題,也就是既授權又無法控管所授權之內容,其內容任人隨意填寫,其結果則由授權人負責,任何身敗名裂的不良後果當然不難想像。

「Autorun」,可說是微軟公司的「獨家」。先不管其初衷、其初始的作法以及後續作業系統版本的各種應變作法,Microsoft 公司所創造出來這個「便利」,導致其使用者在無知的情況下,將自己私密的電子計算機及其裡面的所有數據,毫無保留地,不當授權給任何外來程式碼。

曾幾何時 "this company" 有負責任地大聲警告過他的所有使用者說,
autorun 在本質上可以是一種毫無保留的授權?
而且授權的範圍跟我們所比擬的「空白支票」完全一樣,是任人隨意填寫的。所以,如本文標題所述,它當然可怕。而且,實務上也已經證實,像這樣的「創舉」不知道已經浪費掉地球上所有這家公司的主動或被動追隨者多少人年(請參見文後的連結及再連結,看都看不完)。事實上,也不需要那麼實證地去觀察這些使用者將會碰到多少遠超過於其所帶來「便利」的麻煩,光是由 autorun 的定義來看,其功能就已經註定將為這個「作業系統」帶來多少災難,因為它已經違反了資訊安全規則第 0 條。

儘管如此,"autorun" 這個概念,自始就蘊含於這個「作業系統」的創造精神裡。由這個精神出發,"autorun" 的誕生終究是無法避免的。所以,終極的問題並不在 autorun 本身,而在於這個「作業系統」的設計哲學。是什麼樣的設計哲學呢?一言以蔽之,就是「您只要點一下滑鼠,世界上所有美好的事情就會自動地呈現在您眼前」。那麼錯誤在哪裡呢?很簡單!這種東西並不存在。不只是因為現代(2012)的電子計算機科技還處於一個尷尬的階段,而且更是因為它永遠也不會存在。這一點,只要好好地坐下來,就可以想得通,不需要我們再去論證。那麼它是騙人的?對!它就像我們所看過最卑鄙的不實廣告一樣,雖然他們並沒有真的這樣講,可是他們所傳達給使用者的,在在都是這樣的訊息。

那怎麼辦呢?有太多的使用者正在使用這個「作業系統」,也並非總是出於自由意志,在這一點上我們無力改變,而所可以做的事情,就是闡明它的本質,並指出一些對於每一個微軟使用者最關鍵的須知。我們無意加諸無辜的使用者更多的負擔,像是去修改 register、安裝額外的軟體、分辨 autoplay 與 autorun 不同的行為等,關於這些,都可以循著文後的連結找到你所需要的細節。在這裡,我們只提出一點,那就是
切記!你每一次親手點下滑鼠上的任何一個鍵,就等於是一次授權,就相當於一次親筆簽名,也很可能相當於一張空白支票,只不過並不是每次都剛好有人拿去填寫、兌現。當然就更不用說,親手輸入一堆字,然後按下 [Enter] 鍵。無論是點下滑鼠還是按下 [Enter] 鍵,你都必須了解,這是一個授權的行為。對方,無論是什麼程式、問的是哪些問題,你都必須心裡有數。因為你的這個舉動會授與它們跟你相同的權限(permissions),去做所有你自己可以做的事情。換句話說,你必須知道,支票上填寫了什麼,也必須知道支票是給了誰。
那麼是給了誰呢?這當然包括所有可能出現的病毒以及任何惡意的程式碼。在計算機安全及資訊安全上,所需要注意的事情實在太多,也很複雜。而我們在這裡所點出的,是一件被認為無傷大雅的滑鼠點擊行為,因為這個行為被 "this company" 過度濫用。為了讓各位更容易記得住,
擊滑鼠」=「頭同意」
所以,我還要不厭其煩地再問一次,你到底點頭同意了什麼事情?你向誰點了頭?

後記 2015-07-29

事隔將近四年,在 2015-07-27 美國時間早上,Zimperium zLabs 發現了幾乎所有安卓作業系統的智慧型手機都存在的嚴重安全漏洞。[13] [14] [15] [16] [17]

簡而言之就是,如果有人向你發送一封簡訊(SMS),你的手機會自動由它的連結下載多媒體檔案到你的手機上,如果這些多媒體檔案懷有惡意,當你「開啟」(open)檔案的時候,隱藏在裡面的惡意程式碼就有機會得到控制權,大顯身手。惡意的程式碼如果是個「大內高手」,它還可能取得手機的 root 權限,意思就是說,它甚至於可以做你自己都不能做的所有事情。

問題出在哪裡?我已經用紅色字標出來了,就是將近四年前寫這篇短文的原意。聽說 Google 會採取行動,但是等到這些 fixes 到你的手機上,可能還要一段時間。雖然至今尚未聽說因為這個安全漏洞造成什麼損害,但是每一個人都可以自行做一些預防措施。

首先,就要把我們標紅色的字「自動」排除掉,因為「自動」通常是系統的預設。做法是:
  1. 到「訊息 / Messaging」。
  2. 按 menu 圖示,進入「設定 / Settings」。
  3. 找到「多媒體訊息 (MMS) 設定 / Multimedia message (MMS) settings」區塊。
  4. 找到「自動擷取 / Auto-retrieve (Automatically retrieve messages)」這個選項,取消打勾。
  5. 最好再把「多媒體訊息提醒(當模式變更為多媒體訊息時提醒)/ MMS alert (Alert when mode changes to MMS)」這個選項打勾。
以上是根據我的 Sumsung S3 做的。視手機的廠牌而定,以上的文字不見得一模一樣,但應該大同小異。有疑問可以參考 [14] 到 [17],也可以自行搜索其他中文網頁。

這麼做了之後,所有的「多媒體訊息」(MMS)就不會背著你無聲無息地、自動地,把影音檔下載到你的手機。但是你還是有機會點頭同意、或是主動去點閱簡訊(SMS)裡所連結的 多媒體影音 (MMS),這個時候,就必須由你自己判斷,發送這個訊息的人(Sender)是否熟識、可靠,或是他的手機是否可能被駭,遭人利用,傳送惡意程式碼。

後記 2016-04-01

提醒大家注意,Android 手機上的軟體亂象愈來愈嚴重,各種非法廣告愈來愈猖狂。你會看到螢幕上突然出現一個窗子,告訴你你的手機已經感染病毒。這時要切記,一般說來,這個才是病毒!可別在這個窗子上按下任何一個鍵,無論是 [ok],還是 [取消],都不可以!因為這就是本文一直嘗試解說的空白授權。為什麼說這是非法?因為它們用不實的敘述,引誘使用者點擊,進而造成使用者授權它們進行並未表列於合約書上的軟體行為,這是詐術。合約書?那個窗子所表列的事項就是合約,你的點擊就是親筆簽名

那怎麼辦?先試試看能不能回上一頁。如果它們阻斷你回上一頁的機會,試試看 [Home] 那個鍵,回到你手機的常用首頁。不行的話,如果出現廣告的網站是個大站,他們通常不敢太囂張,就只好再試試看點擊打 [x] 的符號,這種廣告常見於各大報的網路新聞,通常是個一般性質的廣告。但是如果廣告出現在色情網站或來源不明的網站,最安全的處置還是關機重開。

最惡毒的就是不經詢問,逕自在你的手機裡安裝軟體,這是明顯違法。有閒有錢的話,應該逕行提告,說不定有機會得到一筆可觀的和解金,還有助於台灣法界改善殘缺且佇足不前的相關法令。如果在手機上的下載資料來裡(常常是 Downloads/),看到來源不明的 .apk 檔案,就應該直接刪除,不要去點它、不要去啟動它!比較沒有經驗的使用者會問,要刪除它的話不是要去點它嗎?是啊,這就是為什麼一開始我要寫這篇文章痛罵微軟啊!「指涉」一個檔案本來就應該有別於「開啟一個檔案並授權執行」,所以你的行動應該要是指涉這個檔案,而採取刪除的行動。至於細節,超乎本文範圍,無須贅述,請剛入門的使用者各自努力,多多熟悉自己手機的作業系統與環境。

哎∼,我還是要擔心剛才寫的 ".apk" 大家能不能看得到,因為,哎∼,Microsoft 造成了一種文化,也感染了 Android,不得不遷就這種文化,使得絕大部分檔案瀏覽程式都預設為,哎∼,隱藏副檔名!哎∼,就請大家各自努力,多多了解跟自己最親密的手機吧。對不起,我不熟悉 iPhone 的狀況。


External Links

[1] AUTORUN.INF 語法, 2008-02-29
     http://dan-de-li-on.blogspot.com/2008/02/autoruninf.html

[2] Autorun.inf 簡介, 2009-08-29
     http://edisonshih.pixnet.net/blog/post/27755651-autorun.inf-%E7%B0%A1%E4%BB%8B

[3] 請問如何自動執行usb手指裹面的程式, 2008-01-24
     http://forum.icst.org.tw/phpbb/viewtopic.php?t=14336

[4] 有關隨身碟 autorun.inf 觀念釐清問題, 2008-01-24
     http://forum.icst.org.tw/phpbb/viewtopic.php?t=14339

[5] Microsoft, USB Storage - FAQ for Driver and Hardware Developers, Updated: October 28, 2010
     http://msdn.microsoft.com/en-us/windows/hardware/gg487419.aspx
Q. What must I do to trigger AutoRun on my USB storage device?
The AutoRun capabilities are restricted to CD-ROM drives and fixed disk drives. If you need to make a USB storage device perform AutoRun, the device must not be marked as a removable media device and the device must contain an Autorun.inf file and a startup application.
The removable media device setting is a flag contained within the SCSI Inquiry Data response to the SCSI Inquiry command. Bit 7 of byte 1 (indexed from 0) is the Removable Media Bit (RMB). An RMB set to zero indicates that the device is not a removable media device. An RMB of one indicates that the device is a removable media device. Drivers obtain this information by using the StorageDeviceProperty request.
For more information about the SCSI Inquiry command, see http://www.t10.org .
For more information about StorageDeviceProperty, see the STORAGE_DEVICE_DESCRIPTOR storage structure in the WDK documentation at http://msdn.microsoft.com/en-gb/library/ff566971(VS.85).aspx.
For more information on Autorun.inf files see "Creating an AutoRun-Enabled Application" at http://msdn2.microsoft.com/en-us/library/aa969330.aspx.
[6] Microsoft, Creating an AutoRun-Enabled Application
     http://msdn.microsoft.com/en-us/library/aa969330.aspx

[7] NOWnews 今日新聞網, 網路追追追/隨身碟防毒密技:按住Shift不放?, 2008-11-07
     http://www.nownews.com/2008/11/07/91-2361263.htm

[8] Microsoft, Conficker Worm: Help Protect Windows from Conficker, 2009-04-10
     http://technet.microsoft.com/en-us/security/dd452420.aspx

[9] Microsoft, What's the difference between AutoPlay and autorun?
     http://windows.microsoft.com/en-US/windows-vista/Whats-the-difference-between-AutoPlay-and-autorun

[10] Microsoft, Set up Windows to automatically play CDs and DVDs
      http://windows.microsoft.com/en-US/windows-vista/Set-up-Windows-to-automatically-play-CDs-and-DVDs

[11] Microsoft, AutoPlay: frequently asked questions
      http://windows.microsoft.com/en-US/windows-vista/AutoPlay-frequently-asked-questions

[12] Jon Larimer, Beyond Autorun: Exploiting vulnerabilities with removable storage,
     IBM X-Force Advancde R&D, 2010
     https://media.blackhat.com/bh-dc-11/Larimer/BlackHat_DC_2011_Larimer_Vulnerabiliters%20w-removeable%20storage-Slides.pdf

[13] 史上最糟系統漏洞被發現 影響95%安卓手機, ETtoday, 2015-07-29
     http://www.ettoday.net/news/20150729/541928.htm#ixzz3hFJlFONP
東森新聞記者陳慧蓁、詹珝榕/綜合報導

使用安卓系統(Android)手機的用戶要注意了,行動資訊安全公司辛培力安(Zimperium)發現,安卓智慧手機作業系統有安全漏洞,只要駭客寄一條影音簡訊,就能駭進手機。這個安全漏洞無法防範,只能等手機廠商發送更新。用Android 2.2以上版本(Android 2.2到Android 5.1版)的手機,也就是過去5年來新推出的安卓手機,都有這個漏洞,估計9.5億手機用戶受影響。

講電話、收簡訊,現代人人手一支智慧型手機,但要當心,手機可能讓你全都露。美國資安公司辛培力安發現的問題,在於Android裡面稱為「怯場」(Stagefright)的多媒體自動播放設計,原本是讓手機收到影音時會立刻預先處理,讓用戶一點就開,沒想到駭客加以利用,不論是透過Google Hangouts,或是基本的簡訊App,只要手機一收到惡意簡訊就被駭了。

CNN記者指出,「駭客只要知道你的手機號碼,傳一封文字簡訊附一張照片,你不需要打開或點擊連結,駭客就可以接管你的手機。」最可怕的是,他們可以接管你的手機照相機。CNN記者就在不知情下,被迫示範手機被駭的情況,資安達人示範,「我現在進入SD卡了,就是你所有的記憶體位置,還有你的圖片庫。」

更可怕的是,駭客可以在發完簡訊駭入後,再刪掉訊息,受害者根本渾然不覺。基本上,Android 2.2以上版本的手機都有這個漏洞,估計多達9.5億支手機受影響,怎麼辦?CNN記者說,「如果你接獲更新通知,就照辦吧!」安卓手機用戶須留意是否收到手機廠商的更新通知,才能避免被駭。

目前還沒有任何一樁因此受駭案例,而辛培力安已與谷歌(Google)合作,開發針對此安全漏洞的修補程式,但可能要耗時數月之後,用戶才能使用到這個修補程式,因此提醒安卓用戶積極更新手機軟體,做好保護。
Android Stagefright vulnerability leaves handsets at risk
CNET, 2015-07-27
http://www.youtube.com/watch?v=Rvjgk9kUCsc

[14] Kellex, Pretty Serious Stagefright Security Flaw Found on Android,
     Probably Affects Your Phone, DroidLife, 2015-07-27
     http://www.droid-life.com/2015/07/27/stagefright-android-mms-flaw-scary-as-f/

[15] Jacob Long, Vast Majority Of Android Devices Are Vulnerable To 'Stagefright' Exploit That Can Be Executed Via Text Message, According To Researchers,
     Android Police, 2015-07-27
     http://www.androidpolice.com/2015/07/27/vast-majority-of-android-devices-are-vulnerable-to-stagefright-exploit-that-can-be-executed-via-text-message-according-to-researchers/

[16] Paul Ducklin, The "Stagefright" hole in Android - what you need to know,
     naked security, 2015-07-28
     https://nakedsecurity.sophos.com/2015/07/28/the-stagefright-hole-in-android-what-you-need-to-know/

[17] Greg Baugues, How to Protect Your Android Phone From the Stagefright Bug,
     twillio blog, 2015-07-27
     https://www.twilio.com/blog/2015/07/how-to-protect-your-android-device-from-stagefright-exploit.html

2011-11-11

紅外線是什麼顏色?

(科普類,12 歲以上)

讓我們實驗一下這種隨記被 google indexed 之後,會不會有人點來看。聽說「有啊,我那個亂無聊的東西都有人點來看啊∼」

有個朋友看到特價的網路攝影機,就想找一個來用用看。做功課的時候,其中有一個是紅外線的,上面除了一般的攝影鏡頭,在四個角落還有四顆所謂的紅外線 LED,再看看網路上面的 demo,看到了幾張紅外線照片,就心生疑問:
紅外線攝影機拍起來到底是什麼顏色?
好吧,我們先來解決這個問題:「紅外線是什麼顏色?」我們必須先了解的一個事實是,「顏色」是一種人類視覺系統對不同頻率/波長的可見光所產生的不同「印象」,對於中間波長的光,我們會有綠色的印象,對於短波長的光,我們會產生藍色的印象,對於長波長的光,我們則心生紅色的印象,光的波長再長一點的話,也就是頻率再低一點的話,我們就看不見了,既然位於可見的範圍之外,我們就把它叫做「紅外線」。就連人的身體都不時地發出紅外線,其頻率距離可見光頻帶比攝影機用的「近紅外線」(near infrared)更遠,也稱為「遠紅外線」(far infrared)。因此,紅外線是什麼顏色?一個三秒鐘的答案是,
紅外線根本談不上顏色。
肉眼可以看得到的,才談得上「顏色」,肉眼看不到的,就算是機器看到了,根據定義,毫無「顏色」可言。

其實在我們的視網膜上,有三種偵測顏色的細胞,它們分別對於紅色、綠色跟藍色比較敏感。當外界某個特定顏色的光線投射在視網膜上的時候,這三種不同的細胞就會對這個特定顏色的光線產生強度不同的反應。這些不同的反應經過視神經傳到後腦杓的視覺區,會開始被那邊的視覺腦細胞層層處理下去,最後會造成我們意識上的一種顏色印象。因為這三種信號彼此之間相當地「獨立」(也可以說「正交」),所以理論上它們可以被展開(spanned)為無限多種顏色印象。還記得「向量空間」跟「基底」嗎?我們通常把顏色視為一個三度空間,在螢幕上常用的基底是紅(Red)、綠(Green)跟藍(Blue),也可稱為 RGB 空間,在紙上(印表機裡)常用的基底則是青(Cyan)、洋紅(Magenta)跟黃(Yellow),也稱為 CMY 空間。在影像處理軟體上,會因為方便計算以及精密校正的需求,而出現其他各種因時制宜的不同基底,但是都是三個,因為顏色被我們以三度空間來處理。

市面上常見的數位相機跟攝影機裡邊類似視網膜的感光元件(CCD 或 CMOS),也是學習、配合人類視覺系統的構造而設計的。這些感光元件基本上對於紅外線都是有反應的,然而為了照片或影片的品質,通常在它前面都會加上一片紅外線濾光片,用來把紅外線濾掉。有一些攝影愛好者,為了拍攝紅外線照片,會拆解他們的器材,移除這個濾光片,讓他們的照相機或攝影機可以「看到」紅外線。然而,在黑暗的環境中,通常也不會有紅外線,所以製造廠商就必須在所謂紅外線攝影機的鏡頭四周加裝可以發出紅外線的照明燈,雖然這些照明燈發亮的時候,肉眼是看不見的。然而仔細觀察這些紅外線 LED 照明燈的時候,也會看到微微的暗紅色光,因為這些光波的波長在可見跟不可見的臨界點左右。

既然我們讓機器可以對肉眼看不到的紅外線有感覺(電器信號),下一步當然就是必須把這些電器信號顯像在螢幕上,讓我們可以看見。這個時候,它要以黑白或是彩色的方式來顯像,就端賴工程師的選擇,把不同波長範圍的不可見光染色在螢幕上,當然也可以染色為黑白的明暗程度。

練習 1:既然顏色被我們以三度空間看待,既可以以有限種類的偵測器(三種)記錄下來,也可以在各式各樣的媒體上再現,例如,在彩色印表機上面只需要裝三個墨水匣,印刷廠也只需要疊印三次,那舌頭味覺的味道呢?能不能也用以上的思考方式,理出一個頭緒,甚至於製造出可以記錄味道以及再生一個味道的機器呢?您是否知道,據我們所知,舌頭的味覺是幾度空間嗎?又,以資訊技術發展的情況,您估計在多少年後,瀏覽網頁的時候,螢幕上需要裝幾個「氣味墨水匣」,才可能「播放」出所有鼻子可以聞得到的氣味?

結論(2013-04-25)

總而言之,正如 X 光與收音機廣播的無線電波,紅外線談不上「顏色」,因為我們看不見。除了波長與紅色光相鄰,紅外線與可見的紅光毫無關連,人類的視覺神經細胞沒有反應。有些照相機的電子元件或傳統的底片對紅外線會有感應,所得到的數據,可以轉換為黑白、明暗,或彩色的影像,叫做「假顏色」(pseudo-color)。虛擬的顏色,目的在於便利觀察,染色方法不一。機場監控入境旅客是否發燒的裝置,所拍攝的是人體所發出的遠紅外線,顯示出來的虛擬色彩也是為利於觀察體溫而設想的。X 光片上的色調也是虛擬的,雖然傳統的 X 光片是明暗的灰階影像,在計算機上,還是很容易染成彩色,以利觀察細節。灰階影像上,每一個像素 (pixel, picture element) 是個只有大小、強弱之分的純量 (scalar) 數值,彩色的像素則需要以向量 (vector) 來決定其顏色。


圖說:我們身邊所有的機器,都是可以關掉的。無論是電風扇、電腦、電鍋,只要把電源拔掉,它就停了。但是有一種機器是關不掉的,那就是核能發電廠的核子反應爐。就算停機、不想發電了,燃料總是欲罷不能,還會持續放射巨大能量,稍一不慎,要是冷卻系統失效,它甚至會引發爆炸。2013 年日本福島 (Fukushima) 的核電廠爆炸就是個實例。這就是核廢料的特性。就算「燒完了」,不能發電了,還要持續放出「衰變熱」(decay heat) 幾百年,甚至更久。這些核廢料成為人類文明的燙手山芋,連科技最先進的國家都找不到放心的處置方法。所以,各國的政府往往都偷偷摸摸,背著人民運輸這些核廢料。以上這些圖片是德國運輸核廢料的交通工具,途中總是要引起人民非常劇烈的抗議及阻撓。中間那張 [1] 是一般的可見光照片,左邊 [2] 和右邊 [3] 兩張是遠紅外線(又稱熱線)照片。照片上以顏色來代表溫度,至於顏色跟溫度對應的方式,每個攝影裝置都略有不同。


練習 2:雖然人類的視覺對紅外線毫無反應,但是卻擁有探測紅外線的其它感官!請問這是哪一種感覺?(提示:當你發燒的時候,媽媽常會做什麼動作?)

運用這種知覺,就算沒有遠紅外線攝影機,我們還是畫得出類似以上虛擬色彩的紅外線圖片。每一個人都可以光憑這種感覺器官,就製作出一張人體紅外線「照片」。以下這張圖,就是我自己畫出來的。(我還沒有時間畫 ^^|||,誰幫個忙呀?)



後記 2016-03-07

讓我們再回到標題「紅外線是什麼顏色?」,做個複習。

對於人類而言,因為視覺系統偵測不到紅外線,所以談不到「紅外線的顏色」。但是有些動物,例如蛇,具有紅外線的感覺器官,所以對牠們而言,紅外線具有特殊的「顏色」,至於是什麼顏色,我們不得而知,因為顏色是一種「印象」,我們又不是蛇,我們也不知道那是怎樣的「印象」。有另外一些動物,例如鳥類跟昆蟲,可以看得見紫外光,這是另外一種人類所看不見的光線。

可是我們卻常常看到許多紅外線的照片,以及它們五彩繽紛的顏色,這些顏色都是我們用機器偵測到紅外線之後,人工染色的結果。

練習 3:我們手機上的低階攝影機,其實就可以拍到紅外線,不信就趕快拿起手機跟紅外線遙控器來試試看。先試試看,如果只是用眼睛看的話,能不能看到遙控器所發出的紅外線呢?再試試看,把手機的鏡頭對準遙控器的前端,同時按一按遙控器的各個按鈕,看看手機的螢幕上看到了什麼顏色呢?其實,我們手機上的程式是不會刻意去染色的,因為這些攝影機並不是專門為了拍攝紅外線照片而做的。你是不是已經找到一個很方便的方法,可以用來檢查遙控器還有沒有電、是不是正常運作呢?

紅外線照片染色實例

當我們使用紅外線攝影機拍攝的時候,都會依據實際上的需求,把所接受到的紅外線染成容易分辨、觀察標的物的顏色。例如以下的影片,顯示了各式各樣的紅外線照片,在影片的右邊都有一根「調色尺」,往上溫度比較高,往下溫度底。每張紅外線照片的調色尺都不大一樣。

Thermal Imaging Infrared photography PEOPLE
Clevelandmarko, 2007-03-15
http://www.youtube.com/watch?v=0DzpRkr96tQ

紅外線攝影看見死後的靈魂出竅?

接下來,讓我們來體會一下,在紅外線攝影機下,當我們死掉的時候,身體是如何慢慢地消失,就像以下影片所呈現那樣:

Thermal Imaging Video Of When The Soul Leaves The Body
InfoWarriorTheEnlightenedOne, 2013-04-23
http://www.youtube.com/watch?v=Qx4VaG3rvO8

以上的影片告訴我們,人的身體在死後慢慢地趨近於所在環境的溫度。我們身體的溫度通常高於周遭環境的溫度,死後又是如何塵歸塵、土歸土,回到大自然的溫度。但是,我們的身體真的是永遠都高於周遭環境的溫度嗎?

練習 4:想像一下,在熱帶的沙漠裡,人們在那麼熱的環境下,居然穿那麼多衣服,把自己包得緊緊的,難道那麼不怕熱嗎?要是我們,夏天穿那麼多衣服哪受得了。其實真正的原因是,在那麼熱的環境下,氣溫真的比身體的溫度還要高,所以他們穿那麼多的衣服,不是為了保暖,而是為了「保冷」,不讓外面的熱量進到身體裡面來。那麼,真正的問題來了。以上的影片,如果是在這種環境下所拍攝的,會有什麼不同的結果呢?

紅外線攝影意想不到的居家應用

看見我們平常所看不到的光線,不只是一種很奇妙的體驗,在生活上也有很大的用處。在「黑暗」中的蛇,總不能夠用「可見光」的視覺來捕捉獵物,以維持生計吧。我們剛才把「黑暗」用引號括了起來,因為那對我們而言是黑暗,對牠們來講,卻有充滿光明的一頓大餐的等著牠們。因為獵物的身上會發出紅外線,我們又稱為熱線。再複習一次,我們的身體都會出紅外線,這就是為什麼耳溫槍、紅外線溫度計可以測量得到我們的體溫。

由於工業技術的進步,紅外線攝影機愈來愈厲害,也愈來愈方便攜帶。紅外線攝影機,其實就是很多很多根的耳溫槍排成一個長方形的陣列,每一根都測量到一點的溫度,然後把這許多點集合起來,就成為一張紅外線的照片,照片裡的每一點都對應到一個溫度的數值,然後再把這些溫度分成例如 16 個等級,分別對應一個顏色,就成為一張我們常常看到的紅外線照片,甚至於紅外線的即時影片。

如果我們擁有一台這種紅外線攝影機的話,那麼我們就可以看得到熱水壺、電器開關、使用中的電線等日常用品,都會「發光」喔,甚至於當天花板漏水、牆壁滲水的時候,也都看得出來那個地方會比較冷。如果家裡像歐洲許多家庭那樣,也裝地板暖氣的話,那麼紅外線攝影機也可以拍到管線在地板裡蜿蜒的清晰情景。洗澡的時候,埋在牆壁裡的熱水管,也都能夠看得一清二楚。這可以幫助我們事先就診斷出可能發生問題的電器裝置,即時採取行動,減少意外以及損失。以下的影片可以幫助我們想像紅外線攝影,在日常生活中可能會有哪些用途。

"Anyone else is just looking around!" by 360 Degrees Home and Building Inspections
Mario Kyriacou, 2010-08-29
http://www.youtube.com/watch?v=dW4Em6lsEr0

練習 5:台語有句俗語說:「做醫生驚治嗽,土水師驚抓漏。」意思就是說,當醫生的最怕的是治咳嗽,因為難治,而水泥建築師傅最怕的差事,就是有人請他們來檢查是哪邊漏水,因為這很討厭,討厭的主主要原因,其實就只是因為看不到。幻想一下,你會如何帶著一台紅外線攝影機,成為最受歡迎的抓漏達人!

紅外線攝影可以看見X光所看不見的癌細胞

「看不見」,自古以來也是醫生最主要的障礙,因為既然看不見身體的內部,又如何找到疾病的原因?隨著科技的進步,人類發展出許多看穿人類身體的方式,例如很久以前就發明的 X 光,直到近代各式各樣的斷層攝影(tomography),但是這些方法都或多或少必須要接觸或是入侵身體。這個時候,紅外線攝影(thermography)就突顯出它的優點,它不需要與身體有任何接觸,也不會造成身體任何傷害,而且可以更早偵測到人體發生病變的部位。

許多 X 光所看不見的癌細胞形成過程,在紅外線攝影機下卻一目了然。有一些原因不明的疼痛(unexplained pain),或是各部位的不適,也逃不過紅外線攝影機的法眼。這是因為身體不正常的部位,會具有與其他正常部位不同的溫度。以下的影片雖然是英語發音,但是含有豐富的紅外線診斷圖片,很值得體驗一下。

Medical Thermography Training
Dr. Anthony Piana, 2014-10-06
http://www.youtube.com/watch?v=tVNHZKxK0Us



後記 2016-05-05

遠紅外線或熱感攝影器材以前是非常昂貴的,但是今天已經不再那麼高不可攀,慢慢成為許多人在各個領域應當多加使用的工作利器。例如台灣有水電行業的從業人員「水電俠」(見其臉書 [4])極具洞見,而且眼明手快,成為國內該行業使用熱顯像器材的先驅。我前述的預言與想像,想不到這麼快就在「水電俠」的身上看到實現!


External Links

[1] Nächster Castor-Transport startet Richtung Deutschland, Augsburger Allgemeine, 2011-11-22
     http://www.augsburger-allgemeine.de/wirtschaft/Naechster-Castor-Transport-startet-Richtung-Deutschland-id17630131.html

[2] Temperatur der Castor-Behälter gestiegen, 2010-11-05
     http://www.nordbayern.de/temperatur-der-castor-behalter-gestiegen-1.293913

[3] Strahlender Atommüll in Bild und Ton Mit Thermografie und Geigerzähler
     dokumentiert Greenpeace die Castor-Abfahrt, 2010-11-05
http://www.greenpeace.de/themen/atomkraft/presseerklaerungen/artikel/strahlender_atommuell_in_bild_und_ton/ansicht/bild/

[4] 水電俠, 臉書
     https://www.facebook.com/we0905055657/

Linux 的 udev 是個有趣又有用的玩具(3)

在這個單元,我們要開始運用 udev 呼叫 my_script 的時候,所傳過來的環境變數(environment variables)。其中最重要,而且每次都一定會設定的變數就是:SUBSYSTEM 及 ACTION。其他的許多變數常因 SUBSYSTEM 而異。

第一個單元裡,我們曾寫了一個範例程式,叫做 my_script,讓 Linux 系統每次發生 udev 事件時,都會發出一次聲響(sound effect)。以一個 USB thumb drive 做實驗,插入(insert)或拔除(unplug)時分別都會聽見約 6、7 次,以及 3 次聲響。也就是說,插入一個 USB 隨身碟時,系統上會產生許多次的 uevents。拔除時亦然。我們再複習一下這個簡單的掛勾機制(hook):

$ cat /etc/udev/rules.d/z99_test.rules
RUN+="/home/nobody/my_script"
$ ls -l ~/my_script
-rwxr-xr-x 1 nobody nobody 1056 Nov 22 03:04 /home/nobody/my_script

為了篩選出(match)方便與之掛勾的特定事件(uevent),我們必須更進一步追蹤這些事件的內幕。首先,把 my_script 改寫為以下 3 行:

#!/bin/sh
echo $SEQNUM $SUBSYSTEM $ACTION $DEVNAME >> /tmp/my_script.log
exit $?

先以 root 的權限把 logfile /tmp/my_script.log 的內容清空,再插入,或拔除手邊任何一個 USB 隨身碟。然後再看看在 /tmp/my_script.log 這個檔案裡面,我們到底收集到了那些情資。結果大概會很接近如下所示的內容:
2124 usb add /dev/1-6
2125 usb add
2126 scsi_host add
2127 usb_device add /dev/bus/usb/001/007
2134 bdi add
2128 scsi add
2129 scsi_disk add
2131 scsi change
2130 scsi_device add
2132 block add /dev/sda
2133 block add /dev/sda1
2136 scsi_disk remove
2135 scsi_device remove
2137 block remove /dev/sda1
2140 scsi remove
2143 usb_device remove /dev/bus/usb/001/007
2138 bdi remove
2141 scsi_host remove
2142 usb remove
2139 block remove /dev/sda
2144 usb remove /dev/1-6
其中第一個 field 是環境變數 SEQNUM 的值,可用來判別事件發生的先後順序,第二個是 SUBSYSTEM,第三個是 ACTION,第四個則為 DEVNAME 的值,其中,DEVNAME 有時候並未設定。細數後可知,插入 USB 的動作導致系統上一共產生了 11 次的 uevents,拔除時,則產生了 10 次的 uevents。在這眾多的 uevents 當中,特別適合用來唯一識別 USB 裝置插入(insert)及拔除(remove)動作的事件,也就是只發生過一次的事件可說是:
SUBSYSTEM==usb_device
ACTION==add
以及
SUBSYSTEM==usb_device
ACTION==remove

以下這個 my_script 示範如何限縮這個 script 的反應,只在插入或移除一個 USB device 時發出聲響,而且分別只響一次:

#!/bin/sh
# my_script example 3-1
LOGFILE=/tmp/my_script.log # 定義變數 LOGFILE
exec 3>> $LOGFILE && exec >& 3 && exec 2>&1 # 把 stdout/stderr 導入 $LOGFILE
SND_USB_INSERT="/xp/WINDOWS/Media/Windows XP Pop-up Blocked.wav" # 定義聲音檔
SND_USB_REMOVE="/xp/WINDOWS/Media/chimes.wav" # 定義聲音檔

if [ "$SUBSYSTEM" = "usb_device" -a "$ACTION" = "add" ]
then
    echo ""
    echo "=============================="
    date "+%G-%m-%dT%H:%M:%S %z"
    echo "$SUBSYSTEM $ACTION"
    echo "aplay -q \"$SND_USB_INSERT\""
    aplay -q "$SND_USB_INSERT"
elif [ "$SUBSYSTEM" = "usb_device" -a "$ACTION" = "remove" ]
then
    echo ""
    echo "=============================="
    date "+%G-%m-%dT%H:%M:%S %z"
    echo "$SUBSYSTEM $ACTION"
    echo "aplay -q \"$SND_USB_REMOVE\""
    aplay -q "$SND_USB_REMOVE"
fi
exit $?

編輯 my_script 的時候,要確認聲音檔是不是存在。編輯完畢之後,要記得做
$ chmod 755 ~/my_script
以上的 script 是說,當(if) SUBSYSTEM 這個變數的值等於(=)usb_device,而且(-a)當 變數 ACTION 的值為 add 的時候,就(then)執行一些 echo(1), date(1), aplay(1) 的指令;要不然的話當(elif)變數 SUBSYSTEM 的值為(=) usb_device,而且(-a)變數 ACTION 的值為(=)remove 時,就(then)執行另一批指令。請注意,方括號 [ 及 ] 跟 = 的前後,要有空白(space),變數(variable)的前後,也必須加上雙引號(double quotation marks),因為變數值可能會包含空白字元(embedded spaces)。

最後一個指令 "exit $?",是要結束這個 script 並把當時的執行結果傳回(return)給呼叫這個 script 的任何程式。想要省略掉的話,也沒什麼問題,然而我們必須平時就養成撰寫程式的正確習慣,在 UNIX 系統上,任何程式、函式都必須要有傳回值,就算是不知道有誰會去用它。我們不希望看到那一天,當有人突然去用它的時候,就必須面對噩運。這看似小事一件,然而缺乏持續性對小節的正確習慣或態度,我們對核四的運轉,為了自己的生存,必須反對到底。

做完以上的 script,只要隨手找個 USB 設備插入,或拔出,就都會聽到變數 $SND_USB_INSERT 或是 $SND_USB_REMOVE 所設定的聲效檔(sound file)。這是採用正面表列只當變數 SUBSYSTEM 內傳過來的值為 usb_device 時,才依變數 ACTION 的值是 add 或是 remove 來採取行動。

如果我們也希望這個程式對記憶卡以及 PCMCIA、CF 以及 SD 插槽也有所反應的話,則可修改程式,也檢查變數 SUBSYSTEM 是否為 "mmc" 或是 "pcmcia"。以同樣的方法可以得知,SD 卡插槽,以及 PCMCIA 插槽的插入與拔除動作可以:
SUBSYSTEM==mmc
ACTION==add

SUBSYSTEM==mmc
ACTION==remove

SUBSYSTEM==pcmcia
ACTION==add

SUBSYSTEM==pcmcia
ACTION==remove
可靠地識別。以下的另一個 my_script 範例則示範採用負面表列的邏輯結構,檢查變數 SUBSYSTEM 如果不是 "usb_device"、"mmc"、"pcmcia" 其中之一的話,即立刻結束程式(terminate),不然,則印出訊息,再判斷變數 ACTION 為 "add" 或 "remove" 分別作出對應的音效:

#!/bin/sh
# my_script example 3-2
LOGFILE=/tmp/my_script.log # 定義變數 LOGFILE
exec 3>> $LOGFILE && exec >& 3 && exec 2>&1 # redirect stdout/stderr 到 LOGFILE
SND_INSERT="/xp/WINDOWS/Media/Windows XP Pop-up Blocked.wav" # 定義聲音檔
SND_REMOVE="/xp/WINDOWS/Media/chimes.wav" # 定義聲音檔

if [ "$SUBSYSTEM" != "usb_device" -a "$SUBSYSTEM" != "pcmcia" -a "$SUBSYSTEM" != "mmc" ]
then
    exit 0
fi

echo ""
echo "=============================="
date "+%G-%m-%dT%H:%M:%S %z"
echo "$SUBSYSTEM $ACTION"

if [ "$ACTION" = "add" ]
then
    echo "aplay -q \"$SND_INSERT\""
    aplay -q "$SND_INSERT"

elif [ "$ACTION" = "remove" ]
then
    echo "aplay -q \"$SND_REMOVE\""
    aplay -q "$SND_REMOVE"
fi
exit $?

編輯完畢、儲存檔案後,程式會立即生效。這時,無論是在 PCMCIA 插槽、CF 插槽、SD 插槽,還是 USB 插座插入或拔除週邊設備,電腦都會發出預設的音效,而且每個動作只會發出一次聲音,不像在第一單元那樣發出 6、7 次的聲響。

變數 ACTION 除了 "add" 跟 "remove" 兩個可能的值以外,還可能會是 "change"。這例如可能會發生於以下的情況:如果你使用的是一台含有內建電池的筆記型電腦(notebooks),那麼,在插上或拔掉外接電源線(AC power cord)時,udev 系統分別會產生兩種 uevents:
SUBSYSTEM=power_supply
ACTION=change
POWER_SUPPLY_ONLINE=1
以及
SUBSYSTEM=power_supply
ACTION=change
POWER_SUPPLY_ONLINE=0
我們現在就繼續改良以上的 my_script,讓它在插入跟拔掉電源線時,也會發出聲音信號:

#!/bin/sh
# my_script example 3-3
LOGFILE=/tmp/my_script.log # 定義變數 LOGFILE
exec 3>> $LOGFILE && exec >& 3 && exec 2>&1 # redirect stdout/stderr 到 LOGFILE
SND_INSERT="/xp/WINDOWS/Media/Windows XP Pop-up Blocked.wav" # 定義聲音檔
SND_REMOVE="/xp/WINDOWS/Media/chimes.wav" # 定義聲音檔

PRINT_DATE()
{
    echo ""
    echo "=============================="
    date "+%G-%m-%dT%H:%M:%S %z"
}

if [ "$SUBSYSTEM" != "usb_device" -a "$SUBSYSTEM" != "pcmcia" -a "$SUBSYSTEM" != "mmc" -a "$SUBSYSTEM" != "power_supply" ]
then
    exit 0
fi
if [ "$SUBSYSTEM" = "power_supply" -a "$ACTION" = "change" ]
then
    if [ "$POWER_SUPPLY_ONLINE" = "0" ]
    then
        PRINT_DATE
        echo "$SUBSYSTEM $ACTION OFFLINE"
        echo "aplay -q \"$SND_REMOVE\""
        aplay -q "$SND_REMOVE"
    elif  [ "$POWER_SUPPLY_ONLINE" = "1" ]
    then
        PRINT_DATE
        echo "$SUBSYSTEM $ACTION ONLINE"
        echo "aplay -q \"$SND_INSERT\""
        aplay -q "$SND_INSERT"
    fi
else
    if [ "$ACTION" = "add" ]
    then
        PRINT_DATE
        echo "$SUBSYSTEM $ACTION"
        echo "aplay -q \"$SND_INSERT\""
        aplay -q "$SND_INSERT"
    elif [ "$ACTION" = "remove" ]
    then
        PRINT_DATE
        echo "$SUBSYSTEM $ACTION"
        echo "aplay -q \"$SND_REMOVE\""
        aplay -q "$SND_REMOVE"
    fi
fi
exit $?

這個第三個版本,我們在程式的前面,定義了一個函數叫做 "PRINT_DATE ()",它是用來避免重複的程式碼(repeated codes),使得程式比較簡短易讀(readability)。

還記得我們把這個程式的所有 stdout 以及 stderr 都導向 $LOGFILE 了嗎?在指令行打:
$ less /tmp/my_script.log 
則會看到類似以下的文字紀錄(logs):

==============================
2011-11-11T05:02:52 +0800
pcmcia add
aplay -q "/xp/WINDOWS/Media/Windows XP Pop-up Blocked.wav"

==============================
2011-11-11T05:03:01 +0800
pcmcia remove
aplay -q "/xp/WINDOWS/Media/chimes.wav"

==============================
2011-11-11T05:03:16 +0800
mmc add
aplay -q "/xp/WINDOWS/Media/Windows XP Pop-up Blocked.wav"

==============================
2011-11-11T05:03:23 +0800
mmc remove
aplay -q "/xp/WINDOWS/Media/chimes.wav"

==============================
2011-11-11T07:24:26 +0800
power_supply change OFFLINE
aplay -q "/xp/WINDOWS/Media/chimes.wav"

==============================
2011-11-11T07:24:29 +0800
power_supply change ONLINE
aplay -q "/xp/WINDOWS/Media/Windows XP Pop-up Blocked.wav"

==============================
2011-11-11T05:05:18 +0800
usb_device add
aplay -q "/xp/WINDOWS/Media/Windows XP Pop-up Blocked.wav"

==============================
2011-11-11T05:05:46 +0800
usb_device remove
aplay -q "/xp/WINDOWS/Media/chimes.wav"

本單元未完待續(this unit is yet to be continued)...

上一個單元:Linux 的 udev 是個有趣又有用的玩具(2)
下一個單元:Linux 的 udev 是個有趣又有用的玩具(4)

Linux 的 udev 是個有趣又有用的玩具(2)

上一個單元,我們已經建立起一個機制(mechanism),這包含一個所有 uevent 的萬能勾(universal hook),也就是 /etc/udev/rules.d/z99_test.rules,以及讓這個勾勾直接跳過來執行(execute)、放在家裡面(HOME)的一個叫做 my_script 的程式。也就是:
$ cat /etc/udev/rules.d/z99_test.rules
RUN+="/home/nobody/my_script"
$ ls -l ~/my_script
-rwxr-xr-x 1 nobody nobody 1056 Nov 22 03:04 /home/nobody/my_script
因為這個程式執行的時候並沒有 tty,也就是說,它不能夠打印出任何我們看得到的訊息(messages),所以我們就用 aplay(1) 來播放一個簡短的聲音檔,來通知(notify)我們這個程式的執行狀況,例如,到底有沒有被執行到、被執行了幾次,或是在什麼情況下會被執行。但是為了寫一個有用的程式,我們終究必須要讓這個程式印出可以看得到的訊息,以便監控程式發展過程的任何問題。

所以在這個單元,我們就必須要先建立好程式發展環境,讓我們可以鉅細靡遺地監控這個程式的執行細節,也讓我們可以 debug 寫程式時無法迴避的許多錯誤。沒有 tty 怎麼辦呢?一個簡單的辦法就是讓 my_script 這個程式把所有的訊息輸出到一個 logfile,例如:
#!/bin/sh
LOGFILE=/tmp/my_script.log
aplay /usr/share/sounds/KDE_Beep_Bottles.wav
date >> $LOGFILE
這裡 ">>" 的意思,就是把 date 這個指令所產生的 stdout 都附加(append) 到 $LOGFILE 裡。但是 ">>" 並不包括 stderr。所以萬一系統找不到 date(1) 這個程式的話,例如,你把 "date" 錯打成 "data",在 $LOGFILE 裡還是看不到像是
bash: data: command not found
的錯誤訊息,因為,像上列這種錯誤訊息,通常是輸出到 stderr,而 ">>" 只 redirect 了 stdout。

我們現在就先檢查一下,到底 $LOGFILE 有沒有真的被產生出來、檔案屬性如何、檔案裡面到底有沒有東西:
$ ls -l /tmp/my_script.log
-rw-r--r-- 1 root root 348 Nov 4 22:10 /tmp/my_script.log
$ less /tmp/my_script.log
請注意,它所有權屬於 root,這一點很重要,因為,雖然我們的程式 my_script 屬於一個一般的使用者(user permission),例如 "nobody",然而它是由 udev 系統叫出來執行的,所以這個 process 也跟著具有 root 的權限(permission),而其所產生的檔案,自然也具有 root 的預設權限 644。我們可以再看一次 my_script 這個檔案的屬性:
$ ls -l ~/my_script
-rwxr-xr-x 1 nobody nobody 188 Nov 4 22:23 my_script
接下來,為了可以在 $LOGFILE 裡記錄下來這個程式所產生的所有錯誤訊息(error messages),我們在下一個範例,故意漏打 "sounds" 的 "s",讓 aplay 找不到這個聲音檔,而發出送到 stderr 的錯誤訊息。同時,在這一行最後面加上 "2>> $LOGFILE"。這個意思是說,把所有的 stderr 重新導向(redirect),並附加(append)到 $LOGFILE 這個檔案裡。
#!/bin/sh
LOGFILE=/tmp/my_script.log
aplay /usr/share/sound/KDE_Beep_Bottles.wav 2>> $LOGFILE
date >> $LOGFILE
修改好以上的 my_script 並儲存好新版之後,再插上或拔除任何一個 usb 隨身碟,就應該可以在 $LOGFILE 裡邊找到 aplay(1) 那一行所產生的錯誤訊息。因為這一行執行有誤(syntax error),所以這一次我們聽不到任何聲響。

為了避免必須在每一個指令後面都必須加上 ">> $LOGFILE" 或是 "2>> $LOGFILE",我們要介紹一個一勞永逸的方法,來把這個程式所產生的所有 stdout 以及 stderr 都 redirect 到 $LOGFILE 裡。修改 my_script 成為:
#!/bin/sh
LOGFILE=/tmp/my_script.log
exec 3>> $LOGFILE && exec >& 3 && exec 2>&1
aplay /usr/share/sounds/KDE_Beep_Bottles.wav
date 
以上新版 my_script 的第 3 行,會把從第四行開始,所產生的所有 stdout 以及 stderr 都重新導向(redirect),並附加(append)到 $LOGFILE 裡去。自然,這一行必須放在所有可能會輸出文字的指令之前。

我們很快地就會發現,logfile 裡面所記錄的資料,在先後順序有一點混亂(scrumbled order)。這是因為 uevent 是很頻繁(frequent)發生的事件,而每一次的 uevent 都會觸發 my_script 的執行,所以常常同一個時間(concurrently)會有 my_script 的許多分身(processes)同時、但不同步地(asynchronously)在執行,而它們都正在寫入這個 logfile,彼此之間會形成一種競爭(competitive)的態勢,導致所寫入資訊的前後順序交錯(disorder),以至於看起來好像並沒有按照 my_script 裡的執行順序輸出。其實,順序交錯的輸出是導因於 my_script 的許多不同分身,以非同步的競爭狀況交錯寫入的結果。因此,udev 系統每次呼叫我們的 my_script 時,都會設定一個環境變數 SEQNUM 來顯示該事件(uevent)的產生順序。事實上,udev 系統執行 my_script 時,會設定更多對有用的變數(defined variables)。這可以用 udevmonitor(8) 加上 --env 的選項來監看。

有了以上的理解之後,讀者就可以更順利地運用 logfile 來監視這個程式的執行狀況,以便於 debug 許多程式設計過程中無法避免的錯誤,而免於盲目揣測。

在下個單元,我們就可以開始來限縮(restrict)這個程式,讓它只對少數篩選(filter)出的事件(uevent)作出反應(response)。然而,讀者現在已經具有起碼的基礎,可以先行嘗試做一些實驗,例如嘗試在 my_script 裡呼叫 xeyes,讓電腦每碰到一個 udev 事件,就跳出兩隻眼睛,來取代聲音檔的播放。但是也很快就會察覺,事情沒那麼單純。這是因為撰寫這種程式確有其詭異(tricky)之處。詭異之處不只在於這個環境下沒有 tty,使得所有的 stdout 跟 stderr 都無路可走,還有「無家可歸」(HOME,USER, 等環境變數都沒有設定),也沒有 locale 變數(LANG, LC_CTYPE, 等變數都沒有設定)...。不過也不用擔心,因為我們已經介紹了讓讀者可以完整抓到錯誤訊息的方法。

上一個單元:Linux 的 udev 是個有趣又有用的玩具(1)
下一個單元:Linux 的 udev 是個有趣又有用的玩具(3)

2011-11-05

太巴塱(Tabalan)之歌簡譜聽寫

因為《夢想家》的事件,再看到了一次《很久沒敬我了你》,覺得很好聽,有所感動,就隨手拿一張紙,把這個音樂會的安可曲〈太巴塱之歌〉
很久沒有敬我了你---安可曲
http://www.youtube.com/watch?v=eeXAACaiUOQ
的旋律用簡譜量其約聽寫了下來。歌詞可能會有聽錯的地方。因為是手機拍的,品質很差,但還是隨手就放上來。簡文彬跟樂團把這個旋律多次往上移調,比起簡單的吉他版本,效果好得多。




後記 2012-02-19

這張照片很難看,也找不到原版,只好「處理」了一下。大抵上,就是 sigmoid function 跟 normalization,最後,把「陰影」部份(tabalan_homo_shadow.jpg)約略計算出來,加上去。

TODO: 「陰影」還有改進空間。

tabalan_sig_norm_homo.jpg

tabalan_homo_shadow.jpg

後記 2012-03-05

因為最近有個朋友老是用他的 iPhone 拍樂譜給我,要我練習。每次想把樂譜印出來,就要修改一次程式,每次都要搞上大半天。所以就再又做了兩張,不知道有沒有比較好。

無論如何,原始影像雖然拍得很糟糕,卻是一張值得收藏的爛照片。它所代表的挑戰有,
  1. 紙張很薄,是某大賣場的絕版收據,背後的字跟顏色都透到前面來。
  2. 既然是絕版收據,差不多是往陰間的半路上拿回來的,有許多摺痕。
  3. 倉促間筆跡很爛,有些字是寫在立可白上的。
  4. 沒有閃光燈,而且是不均勻的照明(inhomogeneously illuminated)。
  5. 光線來源是右側面,有一點類似 "dark field",所以摺痕處會有山陽水陰的影子。
最後,這次不能忘記的是提醒,簡譜上第一小節的最後一個音,下面應該有一橫,應該是半拍,或是「八分音符」。

tabalan.homo.sig.jpg

tabalan_homo_shadow.jpg

音高與頻率

這篇文章還沒有開始,但是準備用來收集實用、常見的音高與頻率數據,以及許多音樂生活當中有趣但容易背忽略的 facts。以下音名採 Helmholtz 記法。如非特別聲明,皆以 440 Hz 及平均律(well tempered/wohltemperiert)為調率參考(然而當代樂團多以 442 或 443 Hz 調率)。

Common musical frequencies/樂器常見頻率

Tuning fork/音叉
a'
440
Highest piano note/鋼琴最高音
c'''''
4186.01
Highest violin note/小提琴最高音
g''''
3135.96
Soprano "High C"/女高音的「High C」
c'''
1046.5
Middle C on piano/鋼琴的中央C
c'
261.626
Lowest violin note/小提琴最低音
g
195.998
Lowest cello note/大提琴最低音
C
65.4064
Lowest tuba note/低音號最低音
F'
43.6535
Lowest double bass note/倍低音提琴最低音
E'
41.2034
Lowest contra bassoon note/低音巴頌管最低音
#A''
29.1352
Lowest piano note/鋼琴最低音
A''
27.5
Lowest organ note/管風琴最低音
C''
16.3516

Frequencies of telephone keys (dialtones)/電話撥號聲頻率


1209
1336
1477
1633
697
1
2
3
A
770
4
5
6
B
852
7
8
9
C
941
*
0
#
D

人聲各聲部音域及頻率(vocal tessitura

Bass/男低音
E
(
D
)
--
e'
(
g'
)
81
(
73
)
--
326
(
387
)
Tenor/男高音
B
(
A
)
--
b'
(
d''
)
122
(
109
)
--
488
(
581
)
Alto/女低音
d
(
c
)
--
f''
(
a''
)
145
(
131
)
--
690
(
870
)
Soprano/女高音
 c'
(
b
)
--
c'''
(
e'''
)
259
(
244
)
--
1035
(
1303
)

為了方便記憶,聲樂的基音頻率範圍約落在 2 6 = 64 Hz 到 2 10 = 1024 Hz 之間,涵蓋了鋼琴中央 C 上下約四個八度,也相當對稱地記譜於由低音譜表下兩線 C 到高音譜表上兩線 c''' 之間。

各種樂器(頻率四捨五入為整數/rounded to integer frequencies)

小提琴(violin)空弦:g-d'-a'-e''(196 - 294 - 440 - 659 Hz)
中提琴(viola)空弦:c-g-d'-a'(131 - 196 -294 - 440 Hz)
大提琴(cello)空弦:C-G-d-a(65 - 98 - 147 - 220 Hz)
五弦低音提琴(contrabass)空弦:B,,-E,-A,-D-G(31 - 41 - 55 - 73 - 98 Hz)
吉他(guitar)空弦:E-A-d-g-h-e'(82 - 110 - 147 - 196 - 247 - 330 Hz)

References:

[1] Tontechnik-Rechner sengpielaudio, Klaviatur und Frequenzen
     http://www.sengpielaudio.com/Rechner-notennamen.htm

2011-11-04

我媽的血壓

2009 年 4 月到 2011 年 10 月的收縮壓跟舒張壓,早晚各測量一次。由圖中可見趨勢是,夏天氣溫高的時候,血壓低,冬天氣溫低的時候,血壓會上升。其他的統計數據以及分析,待續。

測量儀器:OMRON HEM-714C
加壓值:200


External Links

[1] Talma Rosenthal, Seasonal Variations in Blood Pressure, Medscape Today, 2004-10-29
   http://www.medscape.com/viewarticle/489515