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

2014年8月27日 星期三

IPython notebook UI 自訂

嘗試利用 IPython Widget 和 JavaScript 來控制 IPython 的 cell 行為。
目前可以控制 cell 的高度還有模擬 vim, sublime, emacs 的 key binding。
程式碼在 http://nbviewer.ipython.org/github/tjwei/tjw_ipynb/blob/master/vim.ipynb
我目前用的 css 在 https://github.com/tjwei/tjw_ipynb/blob/master/custom.css
是從 Base16 Ocean Dark 改的。

2014年8月22日 星期五

fuse 練習: Asus 和 卡提諾檔案系統


拿到了幾張 ASUS WebStorage 的的 100G 體驗卡,想說就用用看, 我的 macbook 只有 100G 的 SSD,拿來當延伸空間不錯。 沒想到 OSX 上好像只有像是 Dropbox 那樣直接 sync 的軟體。於是就自己寫了一下,當成練習。目前是 read only,也不太穩。我猜中文檔名應該會掛,就像 MegaFS 一樣。
不過目前至少放放影片,聽聽音樂還算可以。

source code 放在 https://github.com/tjwei/AsusWebStorage
在寫這個之前,另外有一個練習用的  fuse 檔案系統 ck101fs, 可以把卡提諾論壇的圖檔 mount 成一個虛擬檔案系統。

source code 在 https://github.com/tjwei/ck101fs


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 當模型。
我要說的不是腦中建立模型這回事。而是說你學過的東西,鍛鍊過的腦中肌肉,會影響你看事情的方式。
我看過一本育兒書中,以「小孩認為我們是因為怕他聽不懂才重複,所以要證明自己不需要這樣。」
這談不上誰對誰錯,我只是用這個例子說明你學過的東西,會影響你看這個世界的角度與方式。

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


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