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

2013年1月19日 星期六

這是一張圖,這也是一個 python script

2013-01-21 更新:
這是最新的圖:
目前 face6.gif 能在 window/linux/mac/cygwin 中當成 python script 執行。
而且還有一個特異功能,讓在 windows 中的執行結果和 linux/mac/cygwin 略有差異。
除了
python face6.gif
外 ,執行
ruby -x face6.gif
perl -x face6.gif 
java -jar face6.gif
也會被當成相對應的語言執行,只是印出 Python rocks 的字串。

當成 .html 打開(比方更改副檔名),會用  javascript  印出 Python rocks,並且連到本頁。
rar x face6.gif 則會解出一些 symlinks,代表著上列可能的用法。
當然,這還是一個完整的 gif 檔案。
如果你用 unzip -v 來查看 face6.gif,除了 java 的檔案外,還會看到 __main__.py,如果你檢查 __main__.py,就會發現這個  __main__.py 沒有被執行到,因為 python 不喜歡 .zip 有 comment。

以無法為有法,以無限為有限,以無用為有用。
原理:
CPython 讀取原始檔的時候,基本上是一行一行讀的,碰到 \x00,後面的東西都會忽略(C 語言的劣根性)。
所以適當的安插 \x00,並且妥善處理 \n \r 即可。
但為什麼 mac 和 linux 會有差異?
因為 buffer 的大小不同, Linux 是每 8k 讀取, mac 則是 每 1k, windows 每行則約 0.5k。所以要適當的插入 \x00。
另外 windows 讀到 \x1a 時,檔案會直接結束,這裡也要另外處理。

如果光是要讓圖片可以被 python 執行,上面說的方法太麻煩。
其實只要把 .egg檔(有 __main__.py 的 .zip) 放到圖片後面即可。
如果這個 .zip 剛好也是個 .jar,那麼就能變成 image/python/java 三合一。
適當的位置放入 <html>...</html>,就可以當成  .html 來看。這時就能四合一。
不過這時就無法再插入 ruby, perl 的程式碼了。
mac 的 ruby 還好辦,因為碰到 \x00,後面的東西就會忽略。但 perl 及 linux 上的 ruby 似乎只能放在後面。
java 也只吃放在最後的 .jar。
還好, .zip 允許加入 comment,而且是以純文字的方式放在檔案最後,因此,我們把 #!perl 和 #!ruby 放到 .jar 的註解中即可。
問題是,如此一來, python 就不會把這樣的檔案當成 .egg了。所以還是用回我的方式,利用 .gif 的檔案結構,把整個檔案變成一個很大的 .py 檔。


原文:
相信不少人知道可以把 .rar 或是 .7z 藏在一張圖片裡面。但有沒有可能讓一個圖片檔,同時也是一個可執行的 python script 呢?
如果允許 python -x 參數的話,似乎可能性就大了點(至少 netpbm 可以)。
但在不用 -x 的參數的情形下,是否也能辦到呢?
特別是 gif, jpg, png 這類檔案中,幾乎無可避免一定有一些非 ascii 的字元,從 python source code 中會發現這些東西在第一步就會被擋下。這些檔又有固定的檔頭,也沒辦法偷偷在前面塞 #。
真的沒辦法嗎?
答案在這張圖中。


http://www.flickr.com/photos/theklan/1361277704/ CC-SA授權
(更新:上面這張圖已經可以在 *NIX 系統如 linux, osx, cygwin 的 python 2.7.3 跑,下載後直接 python face4.gif 即可。 windows 仍不行。底下的連結和說明是歷史遺跡)

如果你跟我一樣,是用 64bit ubuntu 12.10,然後有裝  python 2.7.3 的話, 可以到這裡下載上面的圖。然後 python face2.gif 執行這個 gif 檔試試看,它會一些字,而假如你有 pygame 的話,會跑出俄羅斯方塊。用一般的看圖軟體,也能夠正常的看這個圖。

更新:( 附帶說明一下,這是完全的 .py 檔案,不是 .egg/.zip。 後來才發現其實 python 會把 .zip 當成是 .egg 來跑,所以如最前面所說的,要把壓縮檔藏在圖片後面是很簡單的。所以只要把 .egg 藏在圖片後面就好了,而且 windows 也能用,所以我發現的方法完全沒有實用價值。 )
windows 版的 python 機制不太一樣,目前還不確定這個方法能不能用。

mac/cygwin 版本只是一些參數上的差異,花點時間是可以調整到同時能在 mac 及 ubunutu 上用的。
(更新,最上面的圖已經弄成在 mac  和 linux 都可用。)

更新: 示範影片

2013年1月15日 星期二

發明多點觸控的故事(三)

圖片來源: Joe_13 CC-BY-ND 授權

史提夫雖然還是很確定自己(以及其他人)曾有手指,但人就是這樣,一個星期過去後,就習以為常了。就像拿著三四吋的小螢幕看電影一樣,剛開始可能覺得用這麼小的螢幕怎麼看?但看了十分鐘後,你就會完全忘了螢幕真的這麼小。

這也是公司裡面另一個小組的論點,建議先第一個產品先從手機開始做起,而非平板。

史提夫覺得這個方向不錯,但他自己有更偉大的構想。這個技術將改變人類對於螢幕的觀點。
人們將發現,螢幕重要的不只是大小,甚至,螢幕不只是能被動顯示資訊的工具。 史提夫這樣認為。

在會議上、老闆面前提出構想時,他並不特別緊張­;只是跟上次一樣緊張而已。他拿出展示用的原型機,解釋了這是雙眼視覺原理的裸視 3D 螢幕。
雖然不是全像,但利用攝影機追蹤人臉位置,就能塑造虛擬的 3D 的使用者介面。利用雙手在空中揮動,就能以多點觸控的手勢操控電腦,和看似在空中的物件互動。即使沒有手指也行。利用網路通訊,可以讓在遠方的人通話,並且看到彼此的立體畫面,就像面對面一樣。作為展示的一環,史提夫還把手放在螢幕前,透過立體螢幕,讓手上好像長出手指一樣,逗得全場哈哈大笑。據說史提夫還沒被解雇的原因,是老闆覺得他上次的報告很逗趣。

史提夫覺得自己的表現不錯,但報告結束時,還是很安靜。他知道大多數人猜不透老闆的喜好,不會貿然表態。所以他本能地望向老闆。

老闆看了史提夫一眼,說「這真是一個絕妙的構想!.........如果我們有兩隻眼睛的話。」

 (完)

2013年1月14日 星期一

Aaron Swartz 做了些什麼壞事?

圖片作者: Sage Ross  CC-BY-SA 授權
最近的一則新聞是 web.py 的作者 Aaron Swartz ,疑似因為官司壓力而自殺。
這個事件有許多可以討論的點,比方從學術 open access 的角度來看。與藏人自焚產生的引響力做比較也是一個著手點。但這裡只是想要列出一些事實的部分,因為大多數的新聞都太生動活潑了。主要的參考是起訴書起訴書The Truth about Aaron Swartz’s “Crime”.
至於事件的是非,相信讀者自有判斷。

Swartz 被起訴的事情主要就是在 2010 九月至 2011 年一月,藉由 MIT 網路從 JSTOR 下載了約四百八十萬份文件(約半數為論文、其他還有評論、新聞等等)。大約是 MIT 其他使用者流量總和的100倍這個等級。
JSTOR 是一個網路論文網站,一般大學如果購買的話,平常的個人使用都沒有限制。多數來說,一篇文章就是一個 PDF 文件,也沒有額外的 CAPTCHA 保護。
 Swartz 將他的 Acer 筆電放入地下室(未上鎖)的網路箱中,直接接線連上網路。當然流量太大,電腦會被 MIT 網路封鎖。 Swartz 使用改變網路卡 MAC 的方式規避封鎖。
根據起訴書,因為 Swartz 的舉動,MIT 網路的某個區段被 JSTOR 封鎖了一段時間,讓一些合法的使用者也無法連上 JSTOR。
另外起訴書中也說 Swartz 利用暫時 email  並將電腦的名字設成虛構的名字 Grace Host(簡稱 Ghost)連上網路,涉嫌隱藏身分,有詐欺嫌疑(感覺有點牽強)。而且指控 Swartz 意圖(但尚未)散播這些文件出去(但 Swartz 可能只是做資料分析)。

類似的東西,會寫點程式的人應該都多少做過。從技術上來說,我想很多人都做過比他更像是竊盜的事情,比方破解 CAPTCHA、圖形解碼文字、或將很多部分整合成完整的 pdf。
更改 MAC address 這件事情,也不是很高難度的東西。
以電腦天才、奇才形容他,不如說是資訊公開自由化的鬥士更貼切。

除了是否合理使用了 JSTOR 以及 MIT 的設備及資料外,JSTOR 封鎖網路區段造成合法使用者的損失,責任在誰身上也有爭議。
Swartz 的作法,在道德上是否有缺失?還是為了一個更崇高的目的?在法律上是否應該有責任,我想,在比較清楚的了解事實後,每個人應該都有自己的判斷。

發明多點觸控的故事 (二)

 圖片來源: Kerri Lee Smith CC-BY-NC-SA 授權
史提夫接受建議,在長假中找公司的心理醫生聊聊。
醫生認為史提夫是因為工作壓力過大,因逃避產生的幻想症併發記憶障礙。由於史提夫的人格特質偏向理性,加上只有小部分的記憶與現實不符,醫生認為只要史提夫放鬆心情,就能利用理智和大致上正確的記憶修復錯誤的那一部分。
「史提夫,你現在日常生活還好吧?」
「 沒有什麼問題,只是我還是很確信人類本來應該有十隻指頭的。也許我穿越了平行世界,也許世界突然發生了某種異變。」
「好吧,但是你怎麼解釋你現在可以熟練的用你的爪子應付日常生活呢?像是使用餐具這些。」
「這我有想過。不過假設我穿越了平行世界或者全世界整個異變了,那這種區區小事情應該也不足為期奇吧!」
典型的理智型人格的病人沒錯,總是能找到一套說法。醫生心裡想。
「好吧,但你在你原來的世界裡,不管是平行宇宙還是變異前的正常世界,總還是有餐具吧?」
「當然。」
「如果人類有指頭的話,為什麼還要餐具?用叉子總沒有手指方便吧?或者像是東方人用的筷子,如果有手指,根本不需要發明用來模仿手指的筷子吧?」
這才是醫生的目的。理智型人格的病人,往往思考深度很深,很快能把事情合理化,自有一套似是而非的邏輯。但常見缺點是過於專注,缺乏思考廣度(事實上,醫生猜測史提夫工作壓力的來源,就是因為缺乏橫向思考力,所以較難跟上老闆回來後公司重視創意的要求)。
所以醫生在表面上的問題後面,藏著真正想問的問題。理智型人格的病人,往往會來不及轉換思考方向,掉入陷阱,這樣就有介入的空間了。
就在這個空間,醫生心裡想。
史提夫想了想,說:「如果食物太燙,光用手就不行,這時就需要餐具。」
醫生笑說:「如果食物燙到你不能用手指拿,放到嘴裡也會燙到吧!你為什麼會想把它放到嘴巴裡呢?你根本不需要拿太燙的食物。你總有用餐具拿食物放入嘴中,發現太燙的經驗吧?如果可以用手指試,這種事情就不會發生了。」
史提夫楞了一下,想說應該是嘴巴和食道比較不怕燙吧?不過還是沒說出口,因為這種講法怎麼想也都覺得有點怪怪的。
醫生繼續施力。
「所以,如果人類有手指,我根本想不到有什麼理由會需要餐具。事實上,如果人類有手指,我們根本不會有任何工具
「你應該還記得學校學過人類之所以會進化成智慧生物,發明複雜工具,但是猩猩卻沒有辦法的原因吧?
「那就是因為猩猩有手指,根本不需要太複雜的工具。
「跟其他動物比起來,人類跑不快、跳不高、力氣小,又不像猴子、猩猩有靈巧的手指,但人類還是萬物之靈,因為我們能發明靈巧的工具。」
史提夫想了想,小學時,好像真有聽過那樣的說法。不然,怎麼解釋其他猩猩沒有繼續進化成人?
但他也同時想起另外一種說法。
史提夫問:「那你怎麼解釋十進制的由來,不是因為我們有十隻手指才有十進制嗎?」
醫生看了他一眼說:「當然也有這種說法,說我們的十進制是源於猿猴演化脈絡,因為智猿的數字概念比智貓強,所以我們的數字系統是依據智猿的手指數而制定的。不過,我們這樣說好了,先請你自己用手數數一下好了。」
史提夫答應,伸出手來。他伸出第一個爪子數「一」。
第二個爪子數「二」。
然後第三個爪子數「三」、第四個爪子數「四」。
然後,好像熟練做過千百次的自然反應一樣,四個爪子不由自主的縮了回去,剩下帶有細毛的肉掌,嘴巴喊出五。
接著伸出另外一隻手,伸出爪子數出六、七、八、九。接著爪子全部收回,只留下兩隻肉掌,數十。
醫生說:「所以我們平常用筆計數也一樣啊,先畫四條直線,然後一條斜線刪去。你原來的平行世界難道是畫五畫嘛?」(註:這是洋人計數的方式,我們是畫正字。)
史提夫回答:「也是一樣的,四直線,一斜線。
醫生說:「難道你不會覺得奇怪嘛?」
史提夫:「沒想過這個問題。」
醫生繼續說:「所以除了少部分純猿演化派的偏執狂外,多數人不會執著於智猿有十隻手指這個數字上的巧合。
「而且你回憶一下,羅馬數字的來源是什麼?最原始的記號不就是利用 I, II, III, IIII 用來代表爪子數數,然後 V 代表手掌。VI, VII 代表一個手掌配上爪子,X 當然就是兩個手掌。
(註:Vendito 是拉丁文手掌抓物的意思)
「除此之外,現代的算盤、古代中國的算籌符號,也都可以看到爪子計數法的痕跡。
(註:比方算籌的九是
「更早的時候,也有人用兩手一腳的十二隻爪子來計數(總要留一隻腳站),所以我們也有許多十二進制的遺跡。如時間,還有 eleven, twelve 這種不規律的數字命名法都是。當然,從人類開始穿鞋子後,就慢慢比較少用了
「中國也有人只用兩隻手八隻爪子來數,創造了所謂的八卦。
「純猿假設法完全無法說明這些事情,這也是純猿假設被否定的理由之一,當然,也許你們原來的平行世界沒有這些其他的數字系統遺跡?」
「呃…也是一樣有的。」史提夫試著回想是否有其他對於十二進位起源的「合理」解釋,但是一下子想不出來。
「喔對了,既然談到演化論這個話題,你原來的世界有人會因為宗教的理由排斥演化論嘛?」醫生問。
「這點應該也是一樣,有些州甚至規定教學時,要把智慧創造論和演化論放在同等的地位。」史提夫回答,雖然現在他對自己的記憶也有點不確定了。
「但是和演化論比起來,智慧創造論明顯漏洞百出,為什麼還有人會堅持否定演化論?」
「我也不是很能理解他們的想法,大概有些人就是比較不理性吧!」史提夫說。
「我倒是可以理解。畢竟人類是目前已知唯一的多源演化物種,想來的確是有點突兀和湊巧。所以我可以理解某些宗教狂熱者的想法。
「我不能理解的是,在你原來的平行世界,完全沒有多源演化的問題,為什麼還是有人不相信演化論。
「一點也不合理。」醫生用略帶強調的語氣說。
史提夫其實也有一樣的想法,他無法否認,他記憶中的「正常」世界,隱藏著讓人不安的不合理。
事實上,在他還有十隻指頭的時候,就一直有這種違合感了。
難道說,過去他一直活在幻想中嗎?
說到底,一切都是從那個該死的多點觸控計畫開始的。當初老闆跟對手餐聚時,老毛病發作,脫口說別人的平板根本是垃圾,自己可以弄更好的東西。所以回來後要下面研發革命性、人性的平板介面。
自己想到多點觸控這個點子時,當然很興奮,但為什麼自己要獨自研發這個構想?怕被搶功?這本來該是如同滑鼠般的使用者介面革命啊!
說到滑鼠。為什麼當時公司要推出單鍵滑鼠?而且還被視為 UI 的典範。假如我們有手指的話,明明多幾鍵更方便不是嗎?
史提夫對自己的想法感到害怕。
想起之前同事嘲笑他時也提到的,如果我們有手指,用鍵盤就好了,哪裡還需要滑鼠。
不過追根究柢,最早的滑鼠造型方方正正的,像個盒子,一點都不像老鼠。
難道不就是因為代表著對「貓掌」友善,適合用貓爪來抓,才被稱為是滑鼠嘛?
史提夫想,醫生應該會這樣說吧。

醫生看著發呆的史提夫,知道他的療法起了效果。只要提點一下,大腦的理性邏輯會自動修復幻想所造成的不合理記憶。
「時間到了」醫生說。
「你應該沒有什麼大問題,回去好好放鬆,多休息就行了。不用想太多。」
史提夫收拾東西,準備離開。
「喔,對了,突然想到。」
醫生問。
「你原來的平行世界中,埃及沒有獅身人面像吧?還是說根本沒有埃及?」

2013年1月9日 星期三

發明多點觸控的故事(一)

圖片來源:  http://www.flickr.com/photos/timoller/7115672095/ CC-BY 授權
這天是史提夫的大日子。他還沒有跟太多人提起,但是他認為他將要在公司內發表的成果,將會改變全人類的生活。
當然現在我們都知道史提夫是對的,而且改變比他想像中的還大。

2013年1月5日 星期六

不用後製的姨夫 Style 魔術


2013-01-07 更新: 強調一下,
  • 如之前所述,我個人認為 YIF 的魔術影片很可能利用後製,並且大量使用串通觀眾到一個不適當的程度。這是我個人的看法,是我基於各種(公開的)資訊管道的訊息的綜合判斷, 包含我對粘立人老師等人專業判斷的信任。
  • 影片拍攝的目的之一是要凸顯台灣有很多真材實料的東西,不必靠虛假的東西。台灣有一大堆很強的年輕魔術師,有驚人的實力,這才是我們國家的經費應該扶植的方向。
  • 另外一個想表達的,就是我希望魔術愛好者不會被後製澆熄熱情。就我所知,這個短片的確引起了部分年輕魔術師的一些熱血,這是我榮幸。
  • 這個影片是鏡頭魔術,但很多限制只是因為時間、人力和器材上的限制,我只有用到身邊現有的日常物品。
  • 感謝朋友對我的信任,即使不見得知道原理,也相信不是後製。二來,很多人應該已經知道怎麼弄的了,特別是非魔術師可能比魔術師還容易看出來。所以,原來打算公布製作過程的理由已經不存在。
  • 這個魔術的原理也不是魔術師常用的主要原理,所以即使公開也不會傷害到線上的魔術師。


現在網路上可以看到不少模仿、嘲諷 YIF 和後製魔術影片, PTT 上也有不少祭文出現(就是打賭 YIF 的法國麵包是後製,不然就請客),往好處想是大家都認清劣幣了,所以劣幣就不會驅逐良幣了。但也如同之前視頻魔術爭議一文所言,產生讓很多人覺得「某些效果魔術辦不到,只有特效才行。」的副作用。
就我而言,希望、夢想以及無窮的可能性是魔術最寶貴的價值。加上我有個不輸給 YIF 團隊的專業 Team(老婆和小孩),所以趁著我的專業團隊最有魔術生產力的時候(也就是他們睡午覺的時候),拍了個短片,希望能證明不需要後製,也能達到類似的效果。
要說明一下,原本想拍得比較完整一鏡到底的程序,但最後由於下面的原因只能弄成 proof of concept 的短片,本來比較完整的效果最後只有幾個片段。
因為時間很短(我的魔幻專業團隊的生產力巔峰期只有兩小時),所以沒有完全達到希望的效果,只好剪掉一些穿幫太多的地方(其實還有重拍一段),因為角度有點難抓,又沒時間練得很熟練。
雖然我有幾個比較好的攝影機,但由於我的專屬攝影師(一張椅子)不太容易控制鏡頭角度,只好拿站的比較穩的 mac book air 的鏡頭來拍。所以角度其實很差。這也是沒辦法的事,雖然我的攝影師手很穩,但我發現跟他溝通很沒效率。而且他拍攝的時候不太喜歡動。
要特別強調一下,除了轉場外,我還有將亮度調亮 1.2 倍(用 openshot),雖然應該要特別避免後製,但燈光實在太暗了。這也是因為我沒有太多場地可以選。
拍攝地點是我家的曬衣場(兼專業團隊中比較資淺的那個團員的遊樂場,有之一),所以有點亂。原本要要出一瓶更大罐的可樂,但是被喝完了,透明的空瓶子效果不好,只好跑去7/11買了一瓶能買到最大罐的紅茶,預算因此暴增無窮多倍。
目前的這個方法,如果花點金錢、人力和時間,是可以達到好得多的效果。無奈我所有的東西都是曬衣場拿的,所以角度很有限制。
我的專業團隊中比較資深的那個團員,醒來後看到我的表演,覺得我像白痴。
背後的原理其實是可以「破解」的,原本也打算拍個解說,但沒時間,只能等等了。

這不是唯一能達到類似效果的方式。這次耶誕節晚會表演原本也打算用另外的方式達成類似的效果。但是買不到那麼長麵包,也沒有時間把方法完善練熟,所以還是換成別的節目。