2016年6月28日 星期二

36 個問題

最近有空玩了這個「墜入愛河的36 個問題」
http://womany.net/read/article/6618

玩了之後覺得有幾個tip:

首先是時間要夠,36 個問題不算太多也不算太少,但很多問題的回答都需要解釋,直接了當的答案也不見得完整,例如:

Q:你希望自己出名嗎?希望自己以什麼方式出名?
如果我回答「想,跟Steve Jobs 一樣的方式出名」名人的話對方也許還能了解,但如果是「想,跟Dennis Ritchie一樣的方式出名」,這到底是什麼奇怪的出名方式呢?要解釋就要花時間,這種背景、人物無一不可的介紹,不說個五分鐘絕對說不清楚

Q:如果你能夠活到九十歲,而你能選擇保有三十歲的身體或三十歲的心靈活力,你會選擇保有哪個?
A:心靈活力。
只給這樣的答案只要3分鐘就可以回答完36個問題了啦,但這樣是要對方怎麼了解你啦,為.什.麼.啊?

試玩的時候時間準備得不夠,快23才開始,後來弄到快01才睡,有些問題也因此在中途用簡答的方式跳過,或者偷工簡料五個答案只回答三個,有些可惜。

另外要準備可以倒數的鬧鐘,Q11 和最後的凝視都會用到;就如內文所說:「雙方之間毫無掩飾的脆弱展現能讓親密度升溫」,所以回答的現場最好準備一包衛生紙,免得說一說就崩潰哭出來;也可以準備幾罐小酒壯膽,當然如果你們喝了酒會想睡就免了

剩下好像也沒什麼好注意的,找個好時間放膽去玩吧。

至於這36 個問題是不是真的有這樣神奇效果呢?
這點我無法提供什麼評論,畢竟我和對方在試用這36 個問題前就已經不算陌生人了。
我試玩的結果比較像是洩密大會…,或稱Share 密大會,平常不對旁人說的祕密都被抖出來,像是貼Facebook 一樣貼給對方;真要說這36 個問題為我們的關係帶來什麼變化?大概就是彼此間變得「可以」無話不說,既然最恥ずかしい的東西都分享過了,那還有什麼好不能說的呢?
但說回來,我是在私密空間只有兩人狀況下玩的,文中所說「真的在酒吧找了位陌生的夥伴」面對純粹的陌生人要能老老實實回答其中一些問題,我覺得相當困難,有些問題即便都到了第三部分還是很難出口,只能說那位作家真的太強大了。

TL;DR,這36 個問題能讓你/妳和對方分享許多故事,至於能否墜入愛河,我因為在河裡所以無法提供明確的實驗結果。

2016年6月10日 星期五

亂玩雜湊函數

當你學密碼學的雜湊函數時,你爸爸媽媽爺爺奶奶叔叔嬸嬸舅舅阿姨,就連你男朋友女朋友啊不對我沒有女朋友全部都會跟你說:好的Hash 帶你上天堂,不好的Hash 帶你住套房不要用安全性不足的Hash,可是說到不好的Hash 到底會怎麼樣,卻也沒人說個準。

我決定來做個試驗,來玩一下安全性不足的Hash 究竟會發生什麼事情?

首先是實作iSHA1,名稱來自 In-Secure Hash Algorithm,i之所以要小寫是為了潮偽裝成蘋果公司最新的產品,輸出長度為32 bits ,因此利用生日攻擊法尋找這個Hash 的碰撞只需要2^16 的計算複雜度。
實作就懶得實作了,自己設計hash function 有夠麻煩,拿個SHA1 然後只取前32 bits 就好了啦XD

大概就像這樣:
iSHA1.hexdigest():
    sha1.hexdigest()[:8]

現在有了這個就可以玩很多亂七八糟的東西啦,例如破密碼,我們選用一個最簡化的保存密碼方式:把輸入的密碼經過iSHA1 之後保存,因為iSHA1 的size 不夠,因此比較容易找到碰撞,即便如此應該還是比明文保存好一點,至少不會一眼看出密碼是啥XD

我們選一個強式密碼:
Y@kum0Yuk@r!G@D@!Suk!
經過iSHA1,它會變成:
0e14c36a

超短的對不對,為了這個我寫了個網頁
http://isha1-1338.appspot.com/attack1
大家可以在上面找碰撞,我還懶得找,但相信不會有SHA1 這麼困難…個屁

我用了以下的 python code,為了可以輸入還是用string.printable,而非跑全部的可能性:
for length in range(10):
  print("test string with length %d" % (length))
  for s in itertools.combinations(string.printable, length):
    h = iSHA1.iSHA1().update("".join(s).encode('utf-8')).hexdigest()
    if h == answer:
      print("Collision found: %s" % "".join(s))
跑了至少1 hr 才跑出一個7 characters length 的collision

well 我這是用Python ,如果用C 來試驗也許就先快100 倍,再加上類似Hashcat 這樣的專用軟體,還能擴增128 張GPGPU lolololol,可以衝到37336 Mh/s:
https://hashcat.net/oclhashcat/
至少這是個例子,無論用了多強的密碼,Hash 爆了還是沒用,噗滋一下密碼照樣給人試出來,現在SHA1 已經出現可行的攻擊,意即它的強度已經達不到理論上2^80 的安全強度,雖然這不表示SHA1 變得多不安全,不過實務上一般都建議改用SHA2 家族的雜湊函數以保證更高的安全強度。

2016年6月6日 星期一

字幕產生器 Subtitle Generator

六月初參加PyCon ,因為第一天開幕睡過頭了,用One Punch Man 超商大特賣的畫面做了兩張搞笑圖,用gimp 做不熟練,花了不少時間,決定來寫個:「字幕產生器」

成品在此:
http://yodalee.github.io/subtitle-gen.html

這個網頁基於之前qcl 大神所寫的「大師語錄產生器」,大體架構沒什麼改:
http://qcl.github.io/master-quote-gen.html

同時我還參考了以下的stack overflow,老實說要是沒有網路跟stack overflow,我應該寫得出一點C跟python,可是html 和javascript 我大概會完全卡住,一行都寫不出來:

上傳圖片到canvas裡面:
http://stackoverflow.com/questions/22255580/javascript-upload-image-file-and-draw-it-into-a-canvas
canvas 裡面大圖縮小:
http://stackoverflow.com/questions/2303690/resizing-an-image-in-an-html5-canvas
canvas裡寫字有邊框:
http://stackoverflow.com/questions/13627111/drawing-text-with-an-outer-stroke-with-html5s-canvas
指定input/color 預設顏色:
http://stackoverflow.com/questions/14943074/html5-input-colors-default-color

其實寫出來覺得有點對不起qcl 大神,其實就是「大師語錄產生器」的變種,應該要貢獻回qcl 大神的github 的,只是我不知道怎麼調和自行上傳圖片和預設圖片的衝突,也不知道要怎麼處理使用者決定文字在圖內或圖下時,canvas要怎麼處理,乾脆算了。

不過既然做出來了,表示好處多多,可以好好利用:
除了本來PyCon 兩張可以快速做出來

還可以玩一些其他的:


Future Work:等我想到再來寫

2016年5月30日 星期一

The man who knew infinity (有電)

星期日下午去看了電影<The man who knew infinity>,中譯<天才無限家>,是二十世紀初數學家Ramanujan 的傳記電影。

都是傳記電影,不免要跟2015/2的Imitation game 相比較,這類科學人物知名度不高,也還沒收入所謂<偉人傳記>中,對普羅大眾來說都相當陌生,Turing 因為是電機與資訊界的祖師,至少新聞報個Turing Award還聽過(等等,有新聞會報這個嗎…),Ramanujan則更狹隘,大概只剩下純數領域的人會知道他哪位了。

電影算是平鋪直敘,從Ramanujan 在印度懷才不遇,來到劍橋和Prof. Hardy 工作,證明出一系列公式,最終取得劍橋大學院士資格回到印度,卻英年早逝。
電影集中在他待在劍橋的5年間,要克服種族歧視、生活、戰爭種種困難,取得成就,又要掛心千里外的妻子,整體俐落大方,適時加上Hardy 無神論與Ramanujan 身為虔誠教徒的思想辯證;Hardy為Ramanujan 爭取fellow,以純數領域純粹的美讓眾人跨越種族與人身的岐視,導演在這處理得洽到好處,強而有理卻又不顯突兀。
當Ramanujan接受fellow 資格時,也是回過頭來為數學在科學界至高無上的地位,表達最高的敬意。

在處理上,我認為The man who knew infinity 勝過 Imitation Game,後者畢竟商業氣息過重,為求戲劇化改編了太多東西,多到該片wiki 條目必須加上Accuracy一段,回想起來,就會覺得該片有點假,而傳記電影卻要求那個<真>;The man who knew infinity 就不會有這種感覺。
https://en.wikipedia.org/wiki/The_Imitation_Game#Accuracy

Ramanujan 一生留下大量數學研究,電影並未多加著墨,大部分都是紙上的數學式子帶過,也造成看完後看不出片名knew infinity 是指什麼
畢竟純數學的概念實在不好解釋,導演選擇Hardy 和Ramanujan 合作研究,比較好懂的Partition 問題;利用Hardy展示P(4) = 5和P(100) = 190,569,292,讓大家感受一下問題有多難;不然Ramanujan其他研究…真正讓他贏得knew infinity之名的那堆無限級數,觀眾大概只會覺得「呃…三小?很厲害嗎?」

是說partition 的數列有收錄在oeis 裡呢XD
https://oeis.org/A000041
numberphile 也有相關的介紹:
https://www.youtube.com/watch?v=NjCIq58rZ8I

雖然本片個人評價正向,還是覺得有些敗筆:
  • 翻譯問題,不知道為啥Fellow 都翻譯成<研究員>,雖然說是沒翻錯啦,但這樣就超弱的Orz,明明應該翻皇家學院<院士>,劍橋學院<院士>比較好呀
  • 無法理解的轟炸場景:這段很顯然是改寫史實,一次世界大戰時英國雖然在戰場上損失慘重,但本土轟炸少之又少,遑論劍橋地區,這段來得快去得也快,感覺是為了有點聲光效果加上去,讓學VFX 的血汗工程師糊口飯吃,讓人覺得一頭霧水。
  • 另一個敗筆是結尾,傳記電影到結尾總是要來點真實事蹟作個點綴,展示一下Ramanujan 和妻子的真實照片、展示在圖書館的手稿,旁白字幕大概是這麼寫的:「1976年,Ramanujan 一份手稿被發現,他的數學公式現今被應用到理解黑洞運作上」
結尾來看,這段話還是說了:Ramanujan的天才發現,仍然是「有用的」「可應用的」,可是整部片不斷闡述的觀念是啥?不就是Hardy、Ramanujan等人對數學的追求,不為什麼,為了就是那個純粹超脫世俗的「美」,那個低調卻又凌駕萬物的真理?
正如片頭引用Russel 的話:Mathematics, rightly viewed, possesses not only truth, but supreme beauty
純數學不問有何用,只是欣賞、讚嘆它的規則,明明全片表現得可圈可點,卻在最後錯了一個音符。

總歸來說,這部片大概註定一個小眾片,我看的電影院只用5排的小廳在播,也不像Imitation Game 有Benedict撐腰(?,票房大概也就不上不下,不過如果受夠了充滿了VFX特效電影,想看一點純粹敘事電影放鬆心靈,The man who knew infinity 應該是近期不錯的選擇,就算太無聊,睡個2小時也可以當作休養身心(X。
這倒是讓我想到,之前看美國隊長3,Cast 的部分做VFX 的公司至少有10家以上,The man who knew infinity:兩家XD

從Imitation Game 到The man who knew infinity(其實之前還有The Theory of Everything,不過那部我沒看),都是以特定領域知名科學家為藍本,讓我開始懷疑Hollywood 是不是把目光轉向這類故事了?
自己的感覺,值得搬上大螢幕的,像是那位身處男性強勢的資訊學界,卻一手開啟高階語言,「大家都不相信我,我寫了個編譯器卻沒人要碰它」的Grace Hopper;科技界兩位工程師競爭發明積體電路,二十世紀初太多科學家的故事未被世人所知。
https://en.wikipedia.org/wiki/Grace_Hopper
//美國海軍竟然有一艘驅逐艦(DDG-70 Hopper)以她為名lolololol
儘管科學家的故事通常…有點沉悶,但就如Imitation Game 選用同性戀當切入,The man who knew infinity 選用數學跨越種族與世俗的鴻溝,經過適當改編和潤飾,仍然能讓劇情富有張力,進而讓世人認識他/她們,就讓我們期待編劇們的功力吧。

2016年5月23日 星期一

一樁因為版本升級引發的慘案

Minecraft升上1.9板已經有一段時間了,因為1.9版加入了戰鬥功能,玩家能在左手跟右手上放置不同的物品,也因此造成了一些悲劇。

故事是這樣子的,之前寫的Minecraft plugin fastbuild,放置方塊時可以大量放置的功能
http://yodalee.blogspot.tw/2014/02/minecraft-plugin-fastbuild.html
設計上我是先取得玩家手上的物品,一個ItemStack 的物件。
計算所能放置的數量,從ItemStack 減去放置的數量,再call API將玩家手上的物品設為ItemStack。

問題出在現在Minecraft 1.9允許有兩隻手,如果將物品放在左手,則放置會將右手設為ItemStack,若右手空手就變成憑空複製物品。

解決方式是判斷玩家在放置物品是從左手放還是右手放,在設定手上物品時設定為玩家使用的那隻手,新的API 針對兩種手有不用的設定function,用新的API 解掉即可。
不過在修掉之前,server 上已經有人用這樣的複製功能弄了一大堆鑽石磚,還在我家旁蓋了一座鑽石塔,根本嘲諷點滿了XD (不過這座塔因為衝到旁邊的建案,應該會被我都更掉)


總之,當主程式和API 的不斷更新的時候,自己寫的程式是也要時時跟上最新,否則不知不覺中就會噴出bugs 來。

當然這樣的升級也不是不好,之前每個block 的型態是用 int 來表示,要比對型態就要自己去查每個物品的編號,新版的API 已經將所有物品用Enum 再包一層,使用真實名字來代表物品,撰寫時不再需要自己查編號值,相對來說好寫得多。