小松鼠嚇了一跳,有了魔法眼鏡後,這世界看起來完全不一樣了

2014年8月20日 星期三

用 IPython notebook 解 HITCON 2014 CTF


因為看到新聞上面說有六百多隊報名(後來看到是 1000 隊左右, 500 隊有分數),而且免費,所以就上去玩玩看。
由於最近在熟悉 IPython notebook,所以毫不意外的都是在用 IPython notebook 解題。
最後只解了七題,排在 50 。
一開始完全沒進入狀況,光在 vash 就卡了很久。看到 /home/vash/flag 的內容後,完全不知道這個內容要拿來做什麼。
等到再有時間的時候,已經是半夜,然後還是卡了一陣子,才發現原來 dashboard 最下面有個 textinput,用來輸入 flag 的內容。

題目還挺有趣的,除了一開始摸索到底要作什麼的挫折外(怪我自己不夠專心),還挺像是猜謎的。
相關的 ipynb 檔案可以參考 http://nbviewer.ipython.org/github/tjwei/tjw_ipynb/tree/master/ 中的檔案。

一些小心得如下:

  • 解 diagcgi 的時候,看了一下別人留下的痕跡,就發現了我的解法可能和很多人不太一樣。
  • 解 maze 時,利用 ipython notebook widget 圖形界面來畫地圖的感覺不錯。主要卡關的地方在於 pyte 的相容性不足,導致跑到某個點的時候,地圖會解讀錯誤。
  • Puzzle 看來挺有趣的。但因為不想再重新讀一遍 jpeg 的規格,就抓一個 win32 jpeg 修復器 shareware 來修復(用 wine 來跑)。修復之後的圖片,中間有一塊黑色區塊。一直參不透玄機。所以就沒有完成。 後來才發現原來中間的黑塊是 shareware 造成的。後來改用 nanojpg 來完成。
  • 24 一開始想偷懶,上網找別人寫好的解答。很不幸,找到的解答犯了一個常見的錯誤,沒辦法解 12,12,12,10。 只好自己再寫一次。而且很有經驗的使用有理數來保證數學上的正確性。很不幸的是,題目的思考架構不同,所以只好又再改回浮點數,程式就變得很醜。



2014年8月19日 星期二

頗有意思的小熊故事

常唸一些圖畫書給小孩聽,有些故事還頗有意思。
下面這個故事出自一套年代久遠的小熊故事集(Wikipedia 介紹)。這是這個故事集之中的第一個故事



(有人把故事一頁一頁拍下來,有興趣可以看看
外面下雪了,很冷。

小熊說:「媽媽,我好冷,我想要些衣物可以禦寒。」
於是熊媽媽開始做動手做東西,然後,跟小熊說:「戴上吧」。
小熊說:「真好,是頂帽子。這樣我就不會冷了。」
然後小熊就出門玩了。

過了一陣子,小熊跑回來。
小熊說:「媽媽,我好冷,我想要些衣物可以禦寒。」
於是熊媽媽開始做東西,然後,跟小熊說:「穿上吧」。
 小熊說:「真好,是件大衣。這樣我就不會冷了。」
然後小熊就出門玩了。
 
過了一陣子,小熊又跑回來。
小熊說:「媽媽,我好冷,我想要些衣物可以禦寒。」
於是熊媽媽開始做東西,然後,跟小熊說:「穿上吧」。
 小熊說:「真好,是條褲子。這樣我就不會冷了。」
然後小熊就出門玩了。

過了一陣子,小熊又跑回來。
小熊說:「媽媽,我好冷,我想要些衣物可以禦寒。」


熊媽媽說:「親愛的小熊,我們來看看。
 「你已經有了帽子,有了大衣,有了褲子。你要件毛皮大衣嗎?」。
 小熊說:「好啊。我也想要一件毛皮大衣」

熊媽媽把小熊的帽子、大衣、褲子都脫掉。

熊媽媽對小熊說:「你看,這就是你的毛皮大衣了。」

小熊說:「真好,我有件毛皮大衣了。這樣我就不會冷了。」
然後小熊就出門玩。
而且他不冷了。





 書裡面還有其他的故事也不錯,像是第二個關於小熊飛上月球的故事,也頗有禪意的。

2014年8月8日 星期五

用投影片修正影片


PyCon APAC 2014 錄的一些影片,效果並不好,於是想是否能利用講者給的投影片來修補看看。
關於圖形對比,有很多方法可以選, OpenCV 裡面就內建了一些。
不過由於原始影像的品質實在太差,用找關鍵點的方式似乎需要調整,因此最後由於時間以及精力上的限制,就拿 ipython 用了非常低科技的線性代數來處理。
最後的程式碼為

基本上的步驟如下:
  • 解開投影片 pdf 成為一系列 .png 檔案。 雖然 python 有  wand module,不過這裡直很無恥的接呼叫 ImageMagick 的 convert 來解。
  • 找出投影片的座標,這裡用 ipython 寫出一個手動工具,找出部份影片內容和投影片來手動對齊。
  • 將對齊後的影片和投影片轉成 256x256 灰階向量,平移及正規化之後取內積。用內積來決定相似度。256x256 這個大小是一開始隨便選一個夠大的數字,其實可能 128x128 即可。
  • 相似度的閥值由之前的手動工具可以大致估計出。不用很準,依照不同情形可以是 0.5 - 0.95 中間的某個值。
  • 最後直接逐格比對,適當時,用投影片取代原來內容,然後利用 OpenCV 把影片壓回去。
  • 因為 OpenCV 不能處理聲音,所以用 libav 把原來的音軌和處理過得視訊直接合在一起。雖然 python 也有 libav 的 module,不過我不確定怎麼用這個 module 做 copy stream 的功能,所以還是很無恥的直接呼叫 avconv 來處理。
 以下對比原始影片及處理過的影片
Toomore 的 GRS 演講錄影算是我的「動機」,你可以看看這個動機能不能說服你
原來文字完全糊成一團
這是一開使用來試驗的對象,原本直接方差,效果還不錯。

海總理的演講,錄影品質也不行,這是第二個處理的影片。

海總理的影片,處理效果也不錯,不過第一章投影片似乎字體大小有改過,所以抓不到

Cheng-Lung Sung 的影片又是令一個問題,跟其他影片不一樣,不事由投影機訊號直接錄的。
原本想利用 OpenCV 的 Perspective Transformation 來修改互動工具,但沒想到原本的工具看起來堪用。






Andy 的影片原始畫質就還可以,不過利用投影片,還是可以讓畫質由還可以變成完美。
但一來原本畫質就還可以,二來投影片有一些動畫,所以閥值設定的比較高。


駱勁成關於立院投票指南的演講

跟其他有些不同的地方在於,替代的投影片大小放大為全螢幕。



最開始其實是打算用 Feature Matching 的方式,但因為一開始實驗的對象是最模糊的兩個演講,發現不靈。所以放棄這招。不過對於比較清楚的影片,其實 feature matching 看起來效果還不錯。

處理之後的影片效果可以參考

2014年8月3日 星期日

First you learn to code, then you code to learn

http://news.google.com/newspapers?nid=1913&dat=19790210&id=TokgAAAAIBAJ&sjid=4mUFAAAAIBAJ&pg=2068,1552271
改過來的話。

學習程式設計或其他很多東西,其實就像是讓你多長出一雙眼睛、手、腳一樣,帶你到不同的地方、看到原先看不到的東西,並起讓你能有觸碰、賞玩東西的能力。

我想很多人應該都有這種經驗,想起過去尚未學習過某種東西的自己,有種彷彿隔世的感覺,似乎已經無法想像過去那樣的自己跟現在的自己是同一個人的感覺。


大家應該也都有聽過滿出來的茶杯的故事:
飽讀詩書的學者,拜訪南隱禪師,尋求禪的道理。
南隱禪師為學者倒茶。雖然茶已從茶杯裡滿了出來,流到桌子上,禪師仍然繼續倒著……
學者嚇了一跳,急忙阻止:「禪師,已經滿出來了,不要再倒了!」
禪師並不理會,仍繼續倒,學者又說:「禪師,不要再倒了,杯子已經滿了。」禪師不理會學者,也不管茶流了滿桌、滿地,直到整壺茶都倒完為止,才停下來對學者說:「你就像這個裝滿茶的茶杯一樣,你的心裡和腦子裡,裝滿了自己的想法與理論,已經接收不了其他東西了。你來我這裡,尋求有關禪的學問,你若不肯在心裡清出空間,虛心接受我的道理,你要我如何教你呢?」
的確,要清空茶杯,才能倒茶進去。
但是,讓茶杯空出空間,除了把茶倒掉外,還可以想辦法讓茶杯變大。

長出學習之眼、手,就能讓空間變大。

2014年8月1日 星期五

就是因為沒有用,學校才要教啊!


這篇是大約一兩年前寫的草稿。因為很難說用很短的篇幅說清楚,所以一直沒有完成。
由於在 COSCUP 上面的演講提到一些內容,所以就把草稿直接放出來。

之所以沒有完成,是因為可以講的東西實在太多。比方在 COSCUP 有提到學習自己上廁所的部份,本來草稿中沒有,剛剛想到才補上。

有太多的內容沒有加進去,表達的不夠完整。所以不管你是要把他當成反諷、同意這個見解、或者當成過度功利價值觀的平衡都可。
總之,標題並不能照著字面上邏輯來讀。




我在課堂或演講時,時常會說我講的東西,一點實用價值都沒有。
其中一個原因是想強調,就是因為這些東西沒有用,才值得教、應該講。
那些挖苦、抱怨學校教的東西沒有用、產學落差太大的人,常常不是別有用心, 就是過份天真。

這篇文章的目的就是要說明一般教育的學校,特別是高等教育,本來就應該教不實用的東西(職校、職業訓練不算)。

這當然不是兄弟我獨創的見解,幾千年前,莊子就把「無用之用」講翻了。真講起來千頭萬緒,面向很多,不知如何說起,所以我下面分成幾個部份,用不同的例子、比喻來解釋。


******
很多人喜歡做瑜伽或者上健身房。你在做瑜伽(或者伸展操、重訓等等)時,做的動作和姿勢往往都相當詭異。
如果你在路上做這些動作,一定會被路人嘲笑。 所以以平常不會做這些動作。正因如此,刻意做這些動作,才能鍛鍊到這些平常用不到的肌肉。
所以俗話才會說,做出來會被嘲笑的動作,才有運動的價值。

你的大腦跟肌肉很類似。
那些日常生活練不起來的肌肉,很有可能在什麼時候會幫上你一把,就是你的價值。
這也就是為什麼學校教的東西,好像長大後都再也用不到的道理。學校應該教的是如果你沒在學校學過,那將來你就再也不會有動機和時間來學的東西。
更糟的是,如果你沒練過,會跟本不知道人類腦中有這塊肌肉。有時你會連怎麼輸的都不知道。


*********
很多人會發現有一個現象,那就是年輕人擅長電腦。
年輕一點的人,根本不用上課去學,就能毫無困難的使用 Office,操作瀏覽器或其他電腦上的軟體。
但為什麼老一輩的人會需要特別去學,而且還不容易學好?
原因之一是年輕一輩從小就有動機使用這些東西,常常用的東西,自然就會了,不用特別去學。
另外一個原因是,年輕人並不是直接去學軟體操作,而是在腦中建立了一個框架,一個系統。所以即使軟體推陳出新,改變很大,甚至還各式各樣新功能的網站、軟體、APP。只要理解了電腦軟體介面的「邏輯」和習慣,直接套用在新軟體上就能自己摸索熟練。
但建立這套腦中的框架、系統、邏輯要花很多的時間,短期的投資報酬率很低,所以只能從小開始學。
在電腦史前時代成長的老一輩,成年後就不容易再有這個耐性來慢慢建立這個腦中框架了(即使有耐性,學習力可能也不如小朋友)。

所以這告訴了我們兩件事情:
1 而那些實用的東西,往往不需太花力氣要學。至少,不需要直接去學。
2 學校教的東西是幫你建立框架、邏輯系統,應付各種可能的狀況。短期投資報酬率會很低,所以看起來很沒用。
至於要怎麼應用這個框架, 各行各業都有不同,而且會隨著時代改變,但不是什麼太大的問題,只要沒跳出框架,只是熟悉度的問題。做久了之後,誰都能熟練。

*********
講到要教實用的東西,小學的加減乘除應該夠基本、夠實用了吧?
其實不然。日常生活中真的用到加減乘除的機會比像像中少。你現在碰到一個二位數乘三位數的乘法,或者一堆數字的加法,難道不是拿出手機或用電腦來算嗎?
當然現在為了數零錢,有些人還用得到點加減法。先不說這還不需要完整的加減法。再過幾年,所有交易都卡片化了之後,只要刷卡就行了。真的有需要時,難道不能計算機按按嗎?到時真的需要花個好幾年的小學時間學這些偶而會用到的技術嗎?
你大概不會同意上面的看法,而且,隱約會覺得這些沒有用的東西還是有某種用處。(拿前面的運動做比喻,跑步相對來說沒用,因為要快的話,車子比較快,但跑步沒用嗎?)

**********
但你其實還學過比加減乘除還實用的技能。
最最最實用、常用的技能是什麼? 其實是自己吃飯、自己上廁所,但你真的覺得,不要說大學了,上小學之後,還要教這種程度的東西嗎? 還是相同程度的技能,因為你已經有了學習在家自己上廁所的經驗,根本就能無師自通了?
你甚至不會把他當成學習。
到了陌生的地方,你會自己找看起來像廁所的地方。真找不到,會問人。這種程度的學習,你根本不會放在心上,真的視為一種學習。
看到陌生的異國食物和餐具,你也會毫無困難的模仿他人的動作來吃(或者自主研發)。
很遺憾的是,很多人在中學或小學階段,過份把重點放在知識,而沒有把學習經驗等級提昇。到了高等教育就會出問題。
因為就像是上小學中學之後,老師最多只會告訴你廁所在哪裡,而不會再幫你把屎把尿了。你要是過去並不是真的學會上廁,而是填鴨式的應付。那你一進小學之後,必然是遍地屎尿了。
上大學也一樣,只不過你的遍地屎尿是比較屬於靈性層次,不容易被發現。



**********
Binary search,現在每種常用的語言都內建有這個功能的函式,自己手刻根本沒有必要吧?因為這個東西其實很難寫正確,1946年發表的演算法,到 1962 年才出現第一個正確的實作。對要求即戰力的產業來說,絕對沒有這個耐心讓你花那麼多的時間去想、去重複發明輪子。
這個就跟上面加減乘除的例子一樣。
沒有用的東西為什麼要學?
原因是「學習」和「研究」本身也是要學習以及研究的。這些看似沒用、只有歷史價值的東西,其實是讓你獲得學習以及研究經驗的好東西。這些東西特別困難、投資報酬率低,所以非常適合鍛鍊你的學習能力。觀摩前人解決困難問題以及犯錯的經驗,讓你學習怎麼摸索及解決問題。
就是因為這些東西沒用少用,當往後你碰到類似問題時,只有學過,才能很快模仿前人的解法。



所以無用之用,是為大用。不過上面這樣的說法,還太小看了這句話。

前一陣子我小孩學說話、唱歌。兩歲的小孩,常常唱歌的時候有個特性,重複的句子會省略。比方兩隻老虎就會變得很短。
而我聽當他在唱小星星的時候,則會變成鬼打墻,連唱 N 次才會唱完(請回憶一下歌詞)。
聽他在唱的時候,突然腦中跳出 Markov Chain 這個詞,他現在學習唱歌的方式,不正是 Markov Chain 嗎?
電腦在處理語言或者學習時,常常也會利用 Markov Chain 當模型。
我要說的不是腦中建立模型這回事。而是說你學過的東西,鍛鍊過的腦中肌肉,會影響你看事情的方式。
我看過一本育兒書中,以「小孩認為我們是因為怕他聽不懂才重複,所以要證明自己不需要這樣。」
這談不上誰對誰錯,我只是用這個例子說明你學過的東西,會影響你看這個世界的角度與方式。

我知道很多老闆希望學生一出社會就是即戰力,抱怨學校教的東西跟產業沒有接軌。他們說的,也不無道理,這是見仁見智的問題。
但這種價值觀已經影響我們太多了。 我們習以為常的已經把工作上用得到的才叫做有用。
但想想,如果學校也跟上潮流,只教有用的東西,那其實是很可怕的事情。
你工作已經很可憐的要賣身、賣肝、賣時間,當然也有賣腦。
但是你一定不願意把這些東西全部賣掉。你一定不希望你腦中的肌肉,全部都是為了工作而鍛鍊。
難道你連看世界的方法以及角度也要賣掉嗎?


所以學校一定要教沒有用的東西啊!


2014年4月22日 星期二

蟒極客的彩蛋: 把 Chrome 的 JavaScript console 變成 Python console.


之前在蟒極客 放了一個彩蛋, 在蟒極客首頁,把 Chrome 的 JavaScript console 變成 Python console.

因為我用的是 ubuntu 上的 chromium, 版本有點舊, 所以之前有點 bug, 一般的 chrome 不靈。

整修後,現在應該在 webkit based 的瀏覽器可用。沒有出錯的話,到蟒極客 用 Chrome 打開JavaScript console ,會變成 Python console。

比方可以試試看 import math 然後會發現 math. 後面的 auto completion 也可以用。或試試看 [x**3 for x in range(10)],語法是 Python3 語法。

(不過沒有用什麼太神奇的東西, python 是 brython)
有興趣,可以直接看 geekpy.org 的 html source 。

更新: 又修改了一個 bug,讓 ubuntu 的 chromium 也可以用了。

2014年4月11日 星期五

網路、開源與民主

這篇基本上是對「資安問題變國安事件?張善政:我們政府沒有那麼無能」有感而發的。一個官方表格都是用 MS Word 文件,很多網頁都還是 IE only 的政府這樣講,很沒有說服力啊。

有一種說法是,工業革命才讓民主制度可能。有一定程度的識字率,資訊才能廣泛傳遞。有了交通器材、電報,很多事情都能更有笑的完成。經濟繁榮了,大家也更有時間想到更進一步的需求。有了需求,就會想到參與決策的可能。
所以,現代的民主制度只是這種潮流之下的必然產物。

那網路革命呢?
代議制度只是用來解決 Scalability 的一種方式,這種制度的反應速度已經跟不上網路革命後,被稱為十倍速時代、甚至百倍速時代的節奏了。
電玩之所以吸引人,就是因為即時回饋。
民意選出來的民意代表,最後投票時聽的還是黨意。人民明明就不滿,但是一到選舉時還是含淚投票。為什麼?就是因為這個回饋機制很慢很間接,不會造成學習的效果。
反倒是婚喪喜慶什麼的,有來沒來,有送花沒送花什麼的,某某委員蒞臨,真情流露、有情有義的,反應就很直接也很快。

過去這樣是沒有辦法,投個票還要全國放假一天,勞師動眾的監票開票。但網路時代,你在網路上投票的次數還少嗎?
聚個會你都會上 doodle 問大家的時間。 排時間填意願你還會開個 google 文件或是表單來弄。
所以,很多東西,其實可以直接開放給全民公投,跳過代議制度這一層。
當然,這中間還有許多運作機制上的問題,一開始,也一定會有些很錯誤的決策,就像你選到很爛的民意代表一樣。但由於回饋迅速,而且要負責的對象比較明確,選民會開始學會事情。快則二十年,慢則五十、一百年,這種民主方式一定會變成常態。
太陽花學潮有很大一部分可以放在這個脈絡之下。割闌尾也可以算是加快回饋速度的一種嘗試。十年內就會有個人或組織,利用網路工具,打著服從民意的旗幟出來參選。

但資訊水準的普及度是一個很重要的問題。為了讓這種制度能夠公平,一定要讓資訊教育普及到弱勢的族群。雖然,弱勢族群再怎麼樣還是相對弱勢,即使是現在的代議制度也是如此。但至少要達到一個大家良心上可以接受的程度。所以,資訊教育的推廣和普及是目前一個很重要的工作。
開源軟體就很重要了。再回到工業革命以及民主的類比。當然經濟繁榮有利於民主的發展。但像是一些產油大國,經濟再好,也不容易促成民主。因為資源掌握在少數人手上。開源,就是讓所有人都能直接接觸資源的來源,避免資訊資源變成像是石油這樣的東西。
要讓每一個人,特別是弱勢族群都能掌舵資訊處理的能力,開源是不可或缺的。

弱勢學童的資訊普及教育,其實不需要二十年、五十年那麼久。真正資訊能力弱勢的,是中老年人(不是全部,而是很多)。聽到某些中老年人的言論,你可能會覺得他們好像是活在平行世界一樣。因為,不是好像,而是真的活在平行世界裡面。一個是有網路的世界,一個是沒有網路的世界。當然那些人的世界裡也是有網路,他們也會發發 email,上上 facebook,寫寫 blog。但這個網路跟網路世代眼中的網路不是一樣的東西。