PageRank



轉移公告

計劃把 http://blog.hoamon.info/ 文章全部轉移至 http://www.hoamon.info/blog/ 這裡,而本 Blogger 站台的文章近 500 篇,我預計在 2014-12-31 前移轉完畢,完成後 http://blog.hoamon.info/ 將只作代轉服務,一律把舊連結如 http://blog.hoamon.info/index.html 轉成 http://www.hoamon.info/blog/index.html ,敬請舊雨新知互相走告。

新文章只發佈在 http://www.hoamon.info/blog/

何岳峰 敬上

2012年1月10日 星期二

一樣是拼拼圖,我們有的是臺灣牛的精神,太神勇啦

兩則新聞:「女探員拼鈔救 670 萬」、「DARPA的碎紙機挑戰被解開了」。

平平是拼拼圖,我怎麼覺得歪果人用的方法就比較複雜。你看,我們只用了一個調查員,國家才付了她 6 個月的薪水(總和一定不到 60 萬,因為她同時也會作其他事),讓她作作國中生程度的拼拼圖來搞定這 670 萬的鈔票。投資報酬率真高呀! 半年賺了超過 11 倍,厲害厲害。

這歪果團隊拿了近 150 萬的台幣,拼出來的不過一堆無聊的文件,圖個時間浪費。歪果人真喜歡無事找事作。

真的有「過補償現象」!!!

跑完生平中的「初次全馬」,休息了 10 天,今天第一次去跑步。結果 10 公里花了 57 分 38 秒,也刷新了個人速度紀錄。過去 10 公里的完成時間多在 60m+ 左右。今天少了 2 分 22 秒。可謂非常大的進步。

不過,這該歸功於正確的自我練習嗎? No ,還好,我有讀過。 喬福瑞 :「這是一種過補償現象」。在高強度訓練後,給予適度的恢復時間,身體機能就會調整過頭。

這是個好現象,把它規劃進賽事訓練計畫中,可以收「合法作弊」之獲。

2012年1月9日 星期一

不應該在資料庫中紀錄使用者的明碼密碼

看到這個有趣的 Blog :「我的密碼沒加密」。我才知道這世上不懂『不應該在資料庫中紀錄使用者的明碼密碼』的程式設計師是如此之多。

這本應是菜鳥程式設計師才應該犯下的錯,沒想到連存在好幾年的「綠界」都有。我真的不願相信這是事實。話說回來,對一個合格的 Linux/Unix 管理員,不能有明碼密碼根本就是常識。

過去,我還想用 PGP 驗證來取代『在伺服器資料庫紀錄使用者密碼』,這法子絕對能確保「使用者密碼」不會外洩。只是,我沒遇到那個使用者能接受自己產生一對公私錀,利用它們來作登入的。

雖然我沒作出個 PGP 驗證的實際上線系統,但 StartSSL.com 作到了,它不是用 PGP 加解密,是另一種公私錀原理。所以外國月亮比較圓是真的。

在我所撰寫過的系統中,只要有帳號認證的,一定會在伺服器端用 md5/sha1 作 hash ,另外也會在瀏覽器端用 javascript 作 md5 hash 。

伺服器端 hash 是防自己人及入侵者,防入侵者不用講了,這是一定要的,但「自己人」為什麼要防呢? 想想看,一個系統內幾千甚至上萬個會員的帳號/密碼都可以給自己人看,那這些自己人難道不會換工作,難道不會對老闆不爽,難道不會被「社交」,將密碼變暗碼,除了保護使用者外,也是為自己人免責,至少使用者自己被社交了,他也不能栽髒我們。

而瀏覽器端的 md5 hash 又是為了什麼? 因為我寫的網頁系統少能跑在 https 上,無法為使用者輸入的密碼作加密以防止中間人攻擊。所以我只好用 md5 函式 hash 過使用者明碼密碼,這雖無法完全避免使用者帳戶被盜用(在明碼傳輸中,它就是有可能遭受中間人攻擊),但至少讓它們難以反推用戶的原始密碼。

另外也曾在一個「歷史系統」中,在瀏覽器端部份是使用 rsa 加密的。因為它之前只有使用「伺服器端 hash」作保護,而當我要再加上「瀏覽器端 hash 」功能時,會面臨「無法使用它的明碼密碼來作自我 hash 」。

是的, hash 也是有技巧的,不要用同一個 salt key 作,要不然入侵者破了一個使用者密碼後,其他的也都猜出來了。所以瀏覽器端,我都是用使用者原始密碼內的某個字去當 salt 來作 hash 的。

於是在「歷史系統」中,要把它一次轉成「有瀏覽器端 hash 」功能的話,勢必要每個使用者回來登入一次,我才有機會將系統轉移。這不是件容易的事。退而求其次,使用 rsa 加密就是不錯的方法。這方法是某個學弟找到的,原本我還不知道有原生的 js 函式庫能作 rsa 加密呢!

提了這些方法說明保護使用者明碼密碼不是作不到,只是有點麻煩而已。

然而那些程式設計師真的只是怕麻煩才不想使用 hash 密碼嗎? 根本不懂的程式設計師,就不要講了,剩下沒用 hash 的,除了怕麻煩外,我猜還怕另一樣東西: debug 。

紀錄「使用者明碼」密碼的惟一好處就是能操作「使用者」所能看到的頁面。

試想一個場景,某天使用者打客服電話,詢問歷史訂單事宜,他一直抱怨看不到之前的一筆 Ubuntu NB 訂單,可是客服用後台管理系統查詢,卻明確地說明使用者真的有這筆訂單。那這問題要如何解決?

如果客服有使用者的帳密,他是不是自己登入系統,來到相同頁面觀看,就能了解到底是系統有 bug ,還是使用者不會操作。有可能問題只是出在「訂單分頁」不夠明確,使用者不知道要點到第二頁去觀看訂單。

讓客服知道明碼密碼以便可以看到與使用者相同介面的網頁是不得以的方法嗎? 不。我們有更安全的作法。

我們的作法是在客服後台,有一個轉移帳戶的頁面,讓他填入帳號(且不用輸入密碼)後可轉換成任一個使用者,我們再紀錄那一個客服曾轉換成誰,又作了什麼,這樣客服不用知道使用者的明碼密碼,也可以變成那一個使用者,而且我們也知道客服幹了什麼好事,所以客服可以在面臨無法排除的困難時才會丟 ticket 給我們,這不是三方皆喜:使用者安全、客服好作事、程式設計師省事。

那這架構怎麼作? 因為程式語言、框架百百種。我只說明觀念,請程式設計師們自行發揮,當然有問題歡迎發問,或覺得我的方法可以改進的,也歡迎指教。

認證系統多半是使用 Session 架構來確認連線的使用者身份為何? 其他用 cookie 或是 GET 連結的也差不多,都是把使用者識別 ID (可能是使用者帳號,也可能是臨時編號)藏在某個變數之中,讓程式在執行時,能找到一個 key 值去對應資料庫中的使用者。

所以我們只要在那個對應資料庫使用者的程式中,多加上一個判斷式,如果有另一個轉換識別 ID 時,就把原使用者識別 ID 換成這個轉換識別 ID 。

例如: 何阿蒙客服登入系統後,連線 request 的使用者識別 ID 為 hoamon ,當他設定好轉換帳號為 grace 後,連線的 request 物件多了一個 grace 的轉換識別 ID 。這樣「對應資料庫使用者的程式」在運行時,就會知道使用者得用 grace 去代換,而不是 hoamon 。而我們的 log 函式在發現 request 物件多了轉換識別 ID 後,也會把『 hoamon => grace 』及所作的事一起紀錄到資料庫中。

這樣就能完全排除「明碼密碼」的使用了。

2012年1月8日 星期日

表象易見,本質難懂

我高中時,非常喜歡看電影,這也是受到父親偏好的影響。他加入了某個影帶店的會員,繳 1000 元可以看 40 片。

在某個暑假我就看了快 200 片的影帶,但其中約有 80 片是「亂馬1/2」。

當時,我最喜歡的導演是伍迪艾倫及楊德昌。他們各有一部電影一直影響我的人生:伍迪艾倫的「影與霧」及楊德昌的「獨立時代」。

他們都很喜歡把思想放在實際對話裡面,這對「心智未開」的高中生而言,有比較容易理解。不像蔡明亮的電影實在是非常抽象,不是我那年代能接受的東西。

在影與霧中,有一段男主角伍迪艾倫與女主角的對話:

boy: You see that very bright star up in that direction?

girl: Mm-hm.

boy: For all we know, that star could have disappeared a million years ago,...

boy: ..and it's taken the light from it a million years to reach us.

girl: So what are you saying? That star is not there?

boy: That it might not be there.

girl: Even though l can see it with my own eyes?

boy: That's right.

眼見不一定為憑,表象與本質不一定相符。這個道理我一直謹記在心。

2012年1月2日 星期一

科學是什麼?!

很早就想寫寫我心目中的「科學是什麼?」這樣的主題文章。

但在談談我心目中的「科學」前,先來看看大家對「科學家」的態度是什麼。聽不懂裡面的英語,沒關係我也不是全聽得懂,重點就兩句:「You don't need to be a computer scientist to use a Windows phone and you do to use an Android phone」(你不用是個科學家就能用 Windows 手機,但用 Android 手機時就必須是了)。

曾幾何時,我們開始習慣要求操作介面要有親和力,東西不好上手,不夠防呆,那麼它就沒有市場,而那些難用、長相奇醜無比的東西就一定是科學家用的,因為要夠聰明才能破解它的使用之道,說明手冊厚厚一本就註定沒正常人會看,而且這現象還隱含了「沒有人想要當『科學家』」這件事。

閱讀更多…

2012年1月1日 星期日

2011 中潭公路馬拉松完賽

今年沒報三鐵,改報 42.195 公里的馬拉松賽並挑戰 6 小時內完賽,其實也就是要求及格而已,結果還好有達陣。

雖然是第一次跑全馬,但完賽心情沒第一次比完三鐵來得喜悅。大概是「已知道自己的能耐」,所以全馬完賽似乎也覺得是應該的。不像第一次比三鐵前,還在擔心游泳項目能不能游完? 會不會被救生員撈起來? 而這次的全馬,我大約知道自己跑得完,差別是能不能在 6 小時以內完成而已。

完賽證書

完賽證書在過終點線後馬上就發給我了,效率會這麼快,是因為本次比賽採用 AMOS RFID 方案。下圖是綁在鞋帶上的 RFID 標籤:

AMOS 的 RFID TAG

因為知道自己不會在 3 小時內完賽,所以我的比賽裝備算是重裝備等級,下圖是我比賽時的用具,除了綠色的備用水壺是放在衣物袋中,沒跟著出場,其他的全用上了,而且能量果凍還帶了兩包。

比賽時裝備(除綠色備用水壺)

比賽時間花得比別人久,就表示我得考慮肝醣燃燒問題。人在高強度運動時,燃燒的是葡萄糖,在低強度且持久的運動上,燃燒的是肝醣,而肝醣的主要來源就是蛋白質及脂肪。優秀選手的平均速率遠高於我,所以對他們而言,葡萄糖的補充量及頻率很重要,就算他們開始燃燒肝醣了,也因為比賽時間少,所以在賽後再補充碳水化合物、蛋白質及脂肪都還來得及。

而我的比賽時間將近 6 小時,從早上 8 點到下午 2 點,如果在賽後才補充,那麼身體運轉機制可能會出問題,又或者比賽時沒有能量可以燃燒,反而讓速度更低,甚至無法完賽。因為人體運作是種非線性現象,也不遵守交換律,不能說將每天喝 3 公升的水,改成一個月後一次喝下 90 公升,所以我得進行比賽中補給。

事實上,在給水站中,也有香蕉、草莓等水果,或是巧克力可以食用,何必自己準備呢! 問題就在於我跑得比別人慢,所以到了給水站,我還有吃到香蕉,但是巧克力都是只看見盒子,沒看過內容物的。還是靠自己最好。尤其是我的比賽時間有跨過中午,所以會面臨肚子餓的問題,叫我一直吃香蕉,也是非常痛苦的。

我準備的中餐是「法國麵包內夾奶油及胡椒鹽」,說口感有口感,說「碳」有「碳」,說脂肪有脂肪,說鈉有鈉,真是完美,唯一的問題是腰包太小,裝的份量不夠。而且,我太晚吃了,一直跑到 37 公里左右感覺肚子餓了,才休息吃麵包。或許提早到 30 公里就吃,表現會更好。

出發前的"英姿"

離開家裡時,埔里還下著雨,一直在考慮要穿著 GORE-TEX 外套,還是自行車風衣比賽。最後決定穿這件 GORE-TEX 去跑,因為我怕冷,而且如果下雨不止的話,自行車風衣是無法擋住寒氣的。這個決定是對的,比賽的天氣大概是到中午 12 點才開始有太陽,溫度也才開始回升。依我過去長距離慢跑經驗,跑到後來,身體常常無法產生熱來維持我的體溫,這件外套就能幫我維持體溫。

比賽前
比賽起點在草屯工藝中心。這時天空還是飄著細雨。簡單作些拉筋、暖身的動作, 8 點是比賽開始時間。

或許是面對第一次的馬拉松比賽,心情不曉得是緊張還是興奮,心跳還滿快的。不像第一次三鐵比賽,我明確地知道當時的心情是『害怕』。

開跑後,剛開始的速率,在 5 公里前是維持在 6 分鐘/每公里,然後慢慢變慢,從 7 分、 7 分半、 8 分、 8 分半,一直到折返點時,我總共花了 2 小時 32 分,平均速率約是 7 分/每公里。

整個比賽,我補水 4 次(加滿水壺且有加鹽的),大約是在 14 公里、 23 公里、 28 公里、 37 公里,其他的給水站,則只是喝杯大會提供的杯水或是運動飲料。另外則在 17 公里給水站及 21 公里折返點時,各吃了一個能量果凍,最後是在 37 公里給水站時,坐在路邊護欄上休息,並吃完我的法國麵包,也下定決心,後面的 7 公里不再休息,要一股作氣跑完,喔~不是,是痛完。

喝水這檔事,在 14 、 23 公里時,有明顯的變化,在這兩個路段喝水後,我的體能明顯提升,心情更加興奮。但在之後的補水,就感受不出這種變化了,我想是因為身體瓶頸不再是水份及鈉,而是肝醣及乳酸了。

在前半部的比賽中,我的心情從緊張(或是興奮)到樂於比賽,看我到折返點時,有多麼開心:

請工作人員幫忙拍攝的,他可能知道比賽者的心情,當有人掏出手機時,他立刻主動詢問要不要幫忙拍照

在過了折返點後,立刻脫下襪子,跑了 21 公里,此時腳底板有些痛了,而後來半程比賽下坡路段也比較多,我怕腳趾頭又被擠到黑青了。不過這些痛楚,都算還好,畢竟我之前就能跑到 19 公里了,而且那還是 3 % 坡度的路段,今天這個馬拉松場地,平均坡度不過是 0.7 % 。這也是之前我跑 19 公里要花 149 分,而這次卻花了 152 分就能跑了 21 公里的原因:比賽強度比訓練強度低。

在 24 公里前,我的心情非常快樂,因為我知道現在的每一步都是我人生的第一次,第一次跑到 23.00076 公里,第一次跑到 23.00152 公里…,直到 24 公里後,我開始意識到腳底板的痛楚大於興奮的心情。跑步人生開始進入黑暗了。

快到 30 公里時,我的左腳踝也來湊熱鬧了,自從用了姿勢跑法後,除了腳底板外,其他部位就沒痛過了,而腳底板痛是因為起水泡了。應該也是從來沒跑過這麼遠,所以我「姿勢跑法」還不夠標準,經不起檢驗。

好了,不管「我的姿勢跑法」有沒有標準,當下之務,就是要完賽。腳踝雖然痛,但好像也不是什麼大問題,所以我讓步幅再小一點,步頻高一點,讓速率變慢一些。等到受不了時,就讓自己休息一下。

在比賽前,我有下一個決心:「不能輸過村上春樹這個愛嘮叨的老頭」,就算速率比不上他,但心態不能輸。這老頭子,可是「至少到最後都沒有用走的」,那我比他年輕怎麼多,怎麼能用走的。於是我除了在給水站拿水外,只要是跑不下去的,我就是停在原地休息、拉筋。

30 公里之後,我開始幻想終點景像為何來安慰自己,直到 37 公里時,我想給自己一個鼓舞:「吃完法國麵包再跑」,一方面緩解腳底板及腳踝疼痛,另一方面則是提升自己的心靈強度。下定決心在這次約 10 分鐘的休息後,就一路跑到底了。

就這樣屏著這口氣,跑得就算慢,也不停了(嗯…其實印象中,好像還是有停了一次、還是二次的樣子,時間都不到 10 秒)。最後在花了 5 小時 42 分 32 秒後,我回到終點。

通過終點後與岳父合影
岳父會跟我去草屯,主要是我老婆要求的,她認為我跑完馬拉松後會很累,不應該自己開車回來。老婆的這個建議實在是太明智了,跑完馬拉松後,我的雙腳真的很沒力,而且我忘了作緩和運動,以致於上車後,小腿快要抽筋。如果自己開車,難免有危險。

開車回程中,看到最後一名選手在不到 1 公里的距離下,還有 4 分鐘才到 6 小時。所以我猜這次有完賽的選手都是及格的(不過,也有可能是更後面的選手被強迫坐大會接送車回來),在此恭喜大家。

而另外,則有部份的選手在半途就面臨抽筋或是肌肉疼痛而中止比賽,我想可能是這次場地與其他場地環境不同,一個原因是坡度比較大,另一個原因則是溫度比較低。這兩者都會影響比賽成績。

在這次全馬比賽中,女選手比例非常低,應該是比我之前參加的三鐵比賽還低。不過,我總共也只贏過一位女選手。被一堆老婆婆、阿姨追過,還有女選手是穿拖鞋跑的,我也是輸她。但難道我要感覺羞恥嗎? 不! 人外有人,天外有天,就算男生整體平均是高於女生整體平均的,但以常態分配曲線來看,就是有些女生是贏過某些男生的。而且,馬拉松比賽,真的不是隨便愛跑的人就會報名參加。來比賽的,通常有三兩三,輸給女生中的菁英,又何妨呢!

比完全馬後與三鐵比較,我在膝蓋運用上,是大大地有進步,不但不會痛,而且賽後(過了一天),只有肌肉酸痛,沒有其他的後遺症發生。今天幾乎可正常走路了。唯一的難處是在上下樓梯。所以我要大力向各位推薦『跑步,該怎麼跑?』這本書。
Related Posts Plugin for WordPress, Blogger...