2016年2月28日 星期日

無聊至極,分析不同鍵盤的效率

可能是最近無聊過頭,想到一個有趣的分析題目

稍微有點了解的人就知道,現在大家最常用的qwerty鍵盤當初的設計,是因為早期打字機打太快會卡住,這個排法就是為了讓大家打字不要這麼快,其「主要」的對手:Dvorak 鍵盤的wiki 條目條列了下面的幾個設計原理:https://en.wikipedia.org/wiki/Dvorak_Simplified_Keyboard
Many common letter combinations require awkward finger motions.
Many common letter combinations require a finger to jump over the home row.
Many common letter combinations are typed with one hand. (e.g. was, were)
Most typing is done with the left hand, which for most people is not the dominant hand.
About 16% of typing is done on the lower row, 52% on the top row and only 32% on the home row.

那麼我們是不是能數據化這些設計概念呢?

試找了一下English frequency ,找到這個網站
http://norvig.com/mayzner.html
它裡面有詳述它的方式,從google book raw data 中,把裡面的1-gram 全爬過,建出一張book 的單字表,大小約1.5 MB:
http://norvig.com/google-books-common-words.txt
從這裡我們可以得到相當完整的 1-gram count 跟bigram count

要有個數據化的比較,我們要提出我們的比較基礎,什麼樣的狀況會有速度的差異?例如我們可以假設,手指放在中行,不用上下移動可以打得比較快,所以常用字母放在中行的鍵盤會打得比較快:

首先我們要先算一下1-gram的頻率跟 bigram 的頻率,既然檔案都建好了(老實說它去parse 23 GB 的檔案才是大工程,我這都是小case 而已),用python 可以輕鬆 parse(告訴你有多簡單,我打這篇文章的時間還比我打code 的時間長):
上排:qwerty 0.516, dvorak 0.218
中排:qwerty 0.325, dvorak 0.704
下排:qwerty 0.160, dvorak 0.079
這個統計和上面說的About 16% of typing is done on the lower row, 52% on the top row and only 32% on the home row. 相符,Dvorak 鍵盤手不用動就能打完 70 % 的字,相對qwerty 只能打出 32%

再來是左右手,這個分別就比較沒那麼明顯了,大約都是6:4,而且左手雖然是非慣用手,打起字來似乎也不會慢上多少,不過假設確實有此事好了,一樣dvorak 勝:
qwerty 左手0.587, 右手0.433
dvorak 左手0.413, 右手0.567

影響更大可能是字跟字之間的移動,例如上面舉例的was, were,都是左手末指,打起來就會卡卡的,這個就需要bi-gram了,我們可以算出,在26*26=676 個bigram 中,對應到出現在qwerty鍵盤跟dvorak 鍵盤,是在左右手間打的頻率是多少:
qwerty: 0.529
dvorak: 0.712

另外像require a finger to jump over the home row,就算算bigram在兩個鍵盤,需要跳過home row 打字的狀況(好奇這樣真的會比較慢嗎=w=):
qwerty: 0.211
dvorak: 0.017
dvorak 頻率好低,qwerty 打字有1/5 的頻率需要跳過home row,一方面dvorak 70%的字母都在中排,要換到上下排兩個的頻率自然小得多。

當然這裡提的都是一些簡單的模型,例如上面第一點說的:awkward finger motion,基本上就是許焉不詳…,要先決定哪些手指移動是awkward (是說awkward 這個字在qwerty 鍵盤裡有夠難打的...),再用數據下去跑,我們可以簡化一點,像是:連續不同字母用同隻手指打就算awkward finger motion,當然這點跟每個人的打字習慣有關,大概就好:
qwerty: 0.069
dvorak: 0.025
好了反正就是dvorak 勝就對了

上面提的淨是些簡單的模型,其實提個適合的模型,大家都可以用python去建n-gram,比較兩者的差異
不過話又說回來,儘管dvorak 鍵盤可能真的比較優秀,連世界打字最快的記錄據傳都是dvorak 創的,我活到現在,看過用dvorak 鍵盤的也就只有傳說中的謝安大神而已,ptt 的programming 版上有句話說得好:「技術標準就是這麼一回事,不需要最好,只要最早且堪用」

2016年1月28日 星期四

Word 不分行空白與不分行連字號

今年9月時把之前做的一顆電路整理一下,寫成一篇journal投出去,今天接到學長的回信,結果是Major Revision,一看有不少東西需要改的呀Orz。

要求修改的內容,有一條是:
Through the whole paper the numbers and units should be put into one line for better readability.

例如,文中有一些相關的元件單位像是 25 pF,排版時25 跟pF被分到不同行了,這是當時譔寫時沒有注意到的部分;另外負數像 -5 dBm,如果用一般的hyphen 它會被分到不同行去。

當然這是不可能用手動修正的(要也可以,只是這樣很蠢),這時候我們就需要不分行空白和不分行連字號(non-breaking space, non-breaking hyphen)了,兩者在顯示上和一般的空白和連字號是一樣的,但在排版上word 不會在此字元換行,插入的方法分別是:ctrl + shift + space 跟 ctrl + shift + -

或者可以在「插入->符號->特殊符號」裡面找到它們。
之後如果遇到不能換行的地方,就插入這兩個符號吧。

參考資料:
http://savethesemicolon.com/2011/05/16/two_hidden_features_in_microsoft_word/

2016年1月3日 星期日

葉問3 (有電)

2016 的第一天,閒來無事就去電影院看個葉問3,又稱log(葉闆),人還不少,下面寫一下葉問系列的感想,大概三集葉問電影都有電。

要說評語,我只能說:三集裡面最像傳記電影的葉問電影。

先說傳記電影,首先先釐清的是,傳記電影並不是要拍一部<楚門的世界>,把該位人士從出生到死亡都拍得清清楚楚,而是取導演想要表達的主題,集中描述:比如<林肯>,只取林肯在南北戰爭最後幾年,用盡各種骯髒手段強行推動解放奴隸法案的努力;<社群網戰>只取Mark Zuckerberg 從大學輟學成立Facebook,但Facebook 站穩腳步、與對手和解的故事。

先不論導演取材角度是否偏頗,例如上面社群網戰把Zuckerberg 描述成隨意偷人點子、自我中心的技術怪人,最後只能一個人孤獨的加正妹臉書一直按F5的魯蛇,現實上Zuckerberg 真的是個技術天才,而且有理想、衝勁、太太和小孩,根本是個人生勝利組;總之傳記電影少有長篇大論,而是在約兩小時內把某人一生幾個最鮮明的印象給表現出來;倒也不是沒有鉅細靡遺的電影,我記得我看過一部拿破崙的傳記電影或是電視劇,長度高達數張DVD,連一場演說、一場戰役都要對話個幾分鐘(更有趣的是戰場上子彈飛來飛去,主角還可以這樣神色自若的對話聊天,不愧是主角威能),沉悶至極,這個就算個特例好了。

而傳記電影是否屬實?我想這是必須的,甚至已經接近<傳記>一詞的基本要求了,如上所述,電影受限於長度必須對對象的人生內容進行刪減,一如小時候看過那些被<淨化>過的偉人傳記,僅保留了真實內容,靠著刪減就能讓人有如完人,看那些傳記大概不會知道愛迪生為了攻擊對手Tesla ,使出多少黑暗手段,若連剩下的內容都不是真的,豈不是近乎詐騙?

葉問電影最糟的就是這點:它的片名打著傳記電影的名義,卻不陳述真實故事,而是虛實並陳(也許虛的多很多),現實上葉問很可能根本沒保護過哪間小學、妻子病逝時也不在她身邊,從這點來看,葉問電影無論1, 2, 3,其實都稱不上合格的傳記電影,如果電影改叫<一拳超人-葉問>、<詠春英雄傳-葉問>可能比較像話。

說了這麼多,葉問3的電影主打葉問保護學校和財團(?)對上,大殺黑道眾多雜魚、泰拳、拳擊高手,然後為了照顧妻子放棄詠春拳正統地位,最後在片尾再次出手證明自己寶刀未老;再怎麼說,比起葉問1, 2刻意設計的<打日本人>、<打英國人>,創造不存在的對決三浦將軍、對決英國拳王,偏重娛樂效果與民族激情,這集至少去除了大部分強加上去的<民族救星>、<中國人民該團結>的概念,回歸到葉問這個人,試著描述一個重社會道義和重視愛人的武者形象,總算是部講人的電影。

但要說葉問3是部傳記電影,我想根本是笑死人,但若把它的片名和內容一比下來,葉問3搞不好還是三部裡面最<正常>,最無雜質的一部;不信的話回想一下葉問2打爆拳王後葉問說的那些話,葉問1結尾那些過場文字<葉問努力不懈,終於喚醒中國人的抵抗意識>,只會讓人感到極深的斧鑿。

至於片中那些詠春大殺各派武功,聽眾不妨一笑置之,請別太嚴肅的看待這部電影,它乘載什麼「詠春最強」、「中國武術最強」的概念只是為了娛樂效果,它連葉問真實的故事都不想顧,需要為這種片吵成一團嗎?真要說的話,真的有人看了<美國隊長>開始吵美國人戰力最強嗎? 本質上,<葉問>電影之於詠春,可比鋼鐵擂台之於拳擊。

再怎麼說,<葉問>三部曲都只是爽片,聽聽音效創造出來的拳拳到肉,它並沒這麼認真的要好好講述真實的葉問。

至於會不會有葉問4 或稱log(葉閘),就靜待電影公司要不要玩了。
拍了這麼多部難道不會無聊嗎?當然不會,你看蜘蛛人都出幾部,還可以重開機再來一遍,Uncle Ben 死了幾次了XD

* 相關電影:
林肯:https://en.wikipedia.org/wiki/Lincoln_(2012_film)
社群網戰:https://en.wikipedia.org/wiki/The_Social_Network

2015年12月20日 星期日

雜湊、訊息鑑別碼與簽章

最近剛翻完Understanding Cryptography這本書,內容真的是淺顯易懂,每章的最後也都會附上相關的參考跟深入研究可讀的參考資料,是本適合當入門的好書,看完之後,想通了雜湊、訊息鑑別碼與簽章三者的差別,在這裡筆記一下,這三個對應的英文分別是 Hash, Message Authentication Code (MAC) 和 Signature,都是訊息傳遞時,用來檢查訊息內容有無「問題」的演算法,三者相似但有些許不同,主要是要對付的問題不一樣。

當我們要傳送一大筆資料時,我們必須要驗證傳送的正確性,沒有錯誤或遭人修改,最基本的就是使用Hash 雜湊,概念就是把傳送端的資料攪一攪,吐出一段代表這份資料的值,接收端再把收到的資料攪一攪,看看出來的值是否一樣。

我們要求Hash 至少要有這些特性:
* 任意長度的輸入,固定長度的輸出
* 要快:如果傳資料要花一秒,算Hash 要十秒,有人要用嗎
* 輸入少量——即便是一個bit 的變動——也應該要讓output 完全不一樣
拿果汁機當比喻,好的果汁機要能攪拌任何輸入的食物並給你一杯新鮮可口的果汁,還要很快攪好,最後,當你攪蘋果汁時加了一些些咖哩,它也要把咖哩分子均勻散佈到每一口蘋果汁裡,打成一杯美味的咖哩蘋果汁(X

另外有Hash三個安全性的要求:
* 從輸出推不出輸入(preimage resistance)
* 給定一個輸入和它的輸出,攻擊者無法產生另一個輸入有同樣的輸出(second preimage resistance)
* 攻擊者無法產生兩個輸入有同樣的輸出(conllision resistance)

知名的Hash如md5, SHA-2,在傳檔案不希望有毀損時,用這些雜湊驗一下是不錯的檢查。

要注意的是,hash 的演算法都是公開的,所以如果有心人Oscar偽造一筆資料跟它的Hash值送給接收端,這筆資料會被誤信為真的資料,Hash 無法對付有心的第三方偽造的攻擊,要對付這種狀況就需要MAC。
MAC和hash 一樣,對一組輸入產生代表的輸出,但MAC除了Hash 的特性外,還會要求一把key,在共同擁有這把的key 的雙方,能驗證訊息完整(integrity),也能確定訊息無法被沒有key的第三方偽造,因此MAC 有時又稱為Keyed Hash Function。
再拿果汁機當例子,共有的key 就像某種獨門配方…像金克拉吧,攪咖哩蘋果汁的時候放點金克拉進去,只有用了金克拉才能吸收土壤兩米下的氮磷鉀攪出金克拉風味咖哩蘋果汁,其他人就無法偽造出這獨特的金克拉風味。

但再進一步,MAC並不提供”不可否認性”,MAC雙方共有這把key,他們都可以產生可被驗證的MAC訊息,這就像有人可以故意打出「有杏仁味的金克拉風味咖哩蘋果汁」然後說是我打的,那我不是冤大頭?這時我們就需要簽章Signature:
簽章跟MAC差異不大,只是我們把hash value 用非對稱演算法的私錀加密過,並公布它的結果,這樣所有有公錀的人都能驗證這份資料是我簽的,卻無法偽造這份簽章;另一方面,我也無法否認這份資料是我簽的,這就是”不可否認性”,這在晶片卡、網路交易上有極大的應用。
就像攪果汁的時候,吐點口水進去,所有人都能驗我的DNA,證實是我攪的果汁;但DNA就只有我有,任何人都無法偽造。

簡而言之,如果你拿訊息過來攪一攪,那是雜湊;攪一攪的同時加上一把通常是對稱性的金錀,這變成MAC;如果產生的過程用上你的私錀,用非對稱加密演算法處理過,就成了簽章。

2015年12月19日 星期六

Star Wars ep 7 Force Awaken原力覺醒(有電)

期待已久的Star Wars ep 7 force awaken 總算上映,又正好趕上放假立馬去看,不用叫子孫燒給我了XDD

整體表現不俗,就跟Star Trek ep 11一樣,是個重開機作品,JJ Abrams 善於利用高速鏡頭,對準一個主體帶出巨大的場景,這在Star Wars上非常適得其所,把戰機間的狗戰拍得相當帥氣。
劇情是全新設計,就算ep 1-6都沒看過應該還是看得懂,也許會對角色口中Luke, Leia, Han這些人物不太熟悉,不過當他們是前輩就好,隨著劇情他們的身分會逐漸揭露,唯一從劇情了「比較」看不出來的,大概就是Darth Vadar,只有一句台詞帶過。

為了連結過去,先看過ep 4-6 還是比較容易上手,也能看出片中一些場景道具是在指什麼,或是向某個東西致敬,像我看到沙漠裡巨大的AT-AT 跟滅星者,想到ep 4-6 它們曾是讓反抗軍聞之變色、如同Borg Cube 一樣恐怖的存在,現今卻淪落在沙漠中腐朽,不禁讓人感慨輝煌一時的帝國,大概也像武器一樣祇剩過往的榮光;而新共和與絕地勢力尚未壯大,電影開頭就跟那片沙漠的拾荒者一樣,給人無限蒼涼的感受。

世界觀的部分,整片的世界觀其實很破碎,沒有太多著墨,究竟新共和跟反抗勢力的關係是啥?反抗勢力經過了這麼多年,竟然還是只有一個前線基地,拿X-wing 機群突入為主力,而沒有可跟滅星者相抗衡的主力艦隊?First Order 又是代表整個舊帝國,還是前線跟反抗勢力作戰的主力?不過這些都算是細節,忽略掉沒關係,一開始就是從邊境星域開始(就如同Tatooine 一樣XD),可能雙方主力都鞭長莫及,所以不是劇情重點,或許隨主角一步步深入核心,這些內容會在 ep 8-9 補齊。

我覺得這部表現最讓我失望的是它的音樂,可能是被東方系列養慣的關係,現在非常注重電影主題配樂,而不只是聲光效果;以往的星戰影片產製了很多扣人心弦的音樂,開頭畫面的 Star Wars main theme,ep 5的帝國進行曲(Imperial March), ep 1的duel of fate, ep 2 across the star,六集內我評價最低的ep 3 也還有the great duel 這首,雖然混了其他配樂但還有個連音緊湊的基調。
這部我看完卻沒什麼有印象的配樂,好像都是舊配樂拿上來充場面?沒有某人某物「主題曲」的感覺,隔壁棚的star trek 也有類似的問題,ep 11 音樂我非常滿意,像Enterprising Young Men,到了ep 12 Into darkness 卻沒了,頂多是一開始的London calling,大部分場面只剩爆炸音效,少了音樂把整個場面襯出來,希望未來兩集能多加強這部分。

總評來說,這集可算是星戰的全新入門款,不但承先也啟後,幾乎所有的概念都Reset ,舊作的角色出來串場但絲豪不影響主角戲份,很簡單就能從新角色的視角,重新體會這個風靡全球的遙遠銀河。

準備好了嗎?進電影院感受Star Wars Theme 的震憾,享受最新的星戰鉅作吧。