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

2014年9月27日 星期六

新部落格:松鼠爸爸講故事


部落格:松鼠爸爸講故事
這是這星期弄出的部落格,裡面有許多小故事,目前有六十多則故事,計畫持續更新。
雖然要在網路上找到故事,並不困難,但故事弄容有好有壞。
我為了自己方便,將我自己喜歡的故事,整理蒐集在這個部落格裡。故事內容大多有改寫過,符合自己的需求。
比方說伊索寓言的「牛和青蛙」,讓無辜的青蛙家庭先是死掉小孩再死掉媽媽,實在太慘無人道了。安徒生童話有些很長,所以我就刪減節錄。
還有一些故事(像是中國的一些經典),後面會感嘆和寓意,這些我也刪除。
總之,盡量不讓故事太。也不蒐集太無聊的故事。阿凡提系列的故事,小時候讀覺得挺幽默有智慧的,但現在看看,卻覺得挺蠢,所以只收錄一小部分。
所謂的不無聊,一般來說是內容有點寓意或者意思、情結有點轉折,或者是某種可以用到的典故(像伊卡洛斯)。
有一些故事其實是大故事的藍本/原始版本(像是雙夢記是牧羊少年的奇幻之旅,還有冰雪奇緣源自安徒生的雪后)
一些不適合小孩的故事,雖然很有趣,也暫時不放(像是天堂踩鴨子的故事,還在考慮怎麼改寫比較好)
此外,將來也會多放一些原創的故事。
非原創的故事,我儘量將我知道的來源寫下,像是瞎子摸象其實是佛經中的故事。
相信很多人也會有講故事的需求,可能是給小孩聽,也可能是演講中可以運用。因為每個人的需求及口味不同,所以我喜歡的,不見得適合你。不過參考看看無妨,說不定會喜歡。


2014年9月11日 星期四

真‧程式師用 One-Way Hash 來寫程式


每隔一段時間,一定會看到關於真‧程式師要使用哪種編輯器的爭論,到最後一定會變成直接用 echo,直接用磁鐵改硬碟之類的。
GNU nano is a text editor - a program often used to edit the source code of other programs. Emacs, Vim and ed are all progressively more "hard core" editors. cat is a Unix program that concatenates and outputs the contents of files. Things get steadily more ridiculous from here. Using a magnetised needle to flip bits on a hard drive requires nanometer precision and binary mastery, but in the early days of programming people did use needles sometimes to fix bugs on Punched cards. The use of a magnetized needle may also be a reference to the Apollo AGC guidance computer, whose instructions were physically written as patterns of wires looped around or through cylindrical magnets in order to record binary code.  -- http://www.explainxkcd.com/wiki/index.php/378:_Real_Programmers
但對一個真‧程式師而言,直接寫 binary code 實在太容易了,即使是用磁鐵也一樣。真正的硬核程式師應該要用像是 sha2、 md5 這樣的東西來寫程式才有挑戰性。

就像之前的 Great Python Challenge 一樣,之前也提出了一個挑戰,挑戰真‧程式師用 one-way hash 來寫程式,比方:
cat 0.c| shasum -a 384 | xxd -p -r > a.out && chmod a+x a.out && ./a.out
會選擇 sha384 是因為他剛好夠長,可以塞進一個 ELF 執行檔(請參考 http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html).

當然也不能只挑戰別人,所以我自己也嘗試求解。最後的解如下面
照下面的步驟就能測試 (Copy& Paste) :
mkdir test
cd test
wget https://raw.githubusercontent.com/tjwei/tjw_ipynb/master/0.c
sh 0.c
gcc 0.c && ./a.out
cat 0.c | shasum -a 384 | xxd -p -r > a.out && chmod a+x a.out
./a.out


過程

第一版的解答很快就出來了 https://github.com/tjwei/tjw_ipynb/blob/master/a.c
基本上能執行,符合要求,但我還是希望至少能印出 "Hello World!"。
第二個解答不久後也出來, https://raw.githubusercontent.com/tjwei/tjw_ipynb/aa733143a5a76f460122e93028f49693d53931e8/0.c
在有些環境下,的確符合要求,能印出 "Hello World!",程式碼看來也挺漂亮的,但不夠完整。
最後我只好用更暴力的方式來搜尋解答,首先將程式碼縮短, comment 都去掉,只留下一個簡短的網址來取代原來的說明。 因為長度小於 112 byte,才能用一次 sha512 block 運算完成編碼。 這樣大概至少讓速度快個五倍。 在沒有超頻的 HD7970 ghz edition,可以用160 mhash/s, 的速度來搜尋。如果單純的 preimage 搜尋,甚至可以接近 180 mhash/s。而且還有一些加速的空間。
總之,結果在 https://github.com/tjwei/tjw_ipynb/blob/master/0.c
中間工作的過程在
http://nbviewer.ipython.org/github/tjwei/tjw_ipynb/blob/master/RealMan2.ipynb

而既然這是一個挑戰,我的確接到一些回應,其中一個由 Kuo-Tung 提供的解答,也挺有趣的,可以在這裡看到  http://paste.plurk.com/show/1982392/

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 看起來效果還不錯。

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