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

2014年10月15日 星期三

Python 超級新手教學




暑假錄的 Python 入門教學影片,對象是程式語言的超級新手。所以進度非常的慢。

一些細節會省略,等著有人問的時候再回答。

但拍出來後,一直覺得效果還可以再改進,所以一直沒放上來。

但現在想想,還是先放上再說。內容還會陸續增加,短期目標是寫出一個可玩的遊戲。
有任何可以利用的地方,歡迎自行取用。



2014年10月13日 星期一

桃蛙源記


因為兒子看到報紙上電影廣告,指名要看的關係,就帶他去看了他生平第一部看的電影。
我兒子對電影的品味實在不怎麼樣,在電視上看到「無敵鯊魚」、「賭城風雲」的片段,居然還連翻叫好。所以我對桃蛙源記的期待並不很高。 況且,光片名就像是有點年紀的人才會取的。



先說 3D 動畫品質。一些水、天空等等的風景弄得還挺美的,青蛙的紋理大概是有考據的,可能也挺真實的。不過呢,要怎麼說,簡單來講,這部電影的成本只有三千萬。
不要對 3D 動畫要求太高。大體上來說,我覺得動畫品質足以讓我順利融入劇情。

我比較不喜歡的是說故事的技巧。
比方青蛙離開故鄉的原因是:美國牛蛙入侵、農藥、農地被破壞(大「普」開發案)。在短短的時間,要塞入這麼多「有意義」的東西,其實需要良好的敘事技巧。雖然跟後面老鼠、蛇、鷹那段有點相互呼應,但還是過於隱晦、快速。表現大草澤美好的時間太少,很難突顯後面被破壞的反差。
說故事的時間被拿去哪裡了呢? 大部分的時間被教育以及懷舊用掉了。
比方一開始的片頭,就故事性來說,可以很快就帶過。但為了教育性,篇幅大概變成了三倍左右。又為了快速進入主題,所以根本沒時間突顯大草澤的美好。
不過片頭的情節其實一小段一小段來看,其實還不錯,只是沒有跟後面連起來。但至少主題是相關的。

後面有很多懷舊的橋段,就完全是天外飛來一筆,跟前後劇情、主題都沒有關係。


但上面寫的這些完全不重要。 因為這部電影的目標對象不是我,而是小朋友。
從現場的反應來看,小朋友的反應挺熱烈的。
就像我一開頭說的,小鬼的品味實在不怎麼樣。但又有誰真的能決定品味是什麼?
我還是推薦這部國片。
如果你的小孩還小,讓他自己建立自己的品味。
如果你的小孩年紀大一點,可以辯論溝通、互相了解。順便也試著理解一下電影想傳達、或無意間傳達的價值觀。

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。 只好自己再寫一次。而且很有經驗的使用有理數來保證數學上的正確性。很不幸的是,題目的思考架構不同,所以只好又再改回浮點數,程式就變得很醜。