50
. . . . . . . . 天元突破, 鑽開 Python 的限制 TJW @ PyCon Taiwan 2013 2013-05-26 TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 1 / 27

Pycontw2013x

  • Upload
    weijr

  • View
    1.814

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Pycontw2013x

. . . . . .

.

......天元突破, 鑽開 Python 的限制

TJW @ PyCon Taiwan 2013

2013-05-26

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 1 / 27

Page 2: Pycontw2013x

. . . . . .

Hacking change my life

經歷/學習某些事物會改變「你」

數學、程式設計、象棋、魔術、撲克都是

Hacking 也是其中之一

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 2 / 27

Page 3: Pycontw2013x

. . . . . .

What is Hacking

.定義..

......

Hacking=在條件限制下,達到預期外的效果。

Workaround=在條件限制下,完成預期該有卻沒有的功能。

.例子........SQL-Injection

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 3 / 27

Page 4: Pycontw2013x

. . . . . .

What is Hacking

.定義..

......

Hacking=在條件限制下,達到預期外的效果。

Workaround=在條件限制下,完成預期該有卻沒有的功能。

.例子........SQL-Injection

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 3 / 27

Page 5: Pycontw2013x

. . . . . .

What is Hacking

.定義..

......

Hacking=在條件限制下,達到預期外的效果。

Workaround=在條件限制下,完成預期該有卻沒有的功能。

.例子........SQL-Injection

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 3 / 27

Page 6: Pycontw2013x

. . . . . .

What is Hacking

.定義..

......

Hacking=在條件限制下,達到預期外的效果。

Workaround=在條件限制下,完成預期該有卻沒有的功能。

.例子........SQL-Injection

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 3 / 27

Page 7: Pycontw2013x

. . . . . .

Back to 90s

還在用鴿子傳封包

還沒有 Google

大學課本都是影印店印的

安裝 Linux 要十幾張磁碟片

那個時候開源軟體叫做自由軟體

X沒辦法輸入中文

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 4 / 27

Page 8: Pycontw2013x

. . . . . .

CheckIO.org

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 5 / 27

Page 9: Pycontw2013x

. . . . . .

CheckIO example

# Withdraw wi thout any i n c i d e n t# 120 − 10 − 0 .5 − 1% = f l o o r ( 1 09 . 4 ) = 109# 109 − 20 − 0 .5 − 1% = f l o o r ( 8 8 . 3 ) = 88from math impor t f l o o rde f c h e c k i o ( data ) :

ba lance , w i t hd rawa l = dataf o r a i n (0 .5+1.01* x f o r x i n w i thd rawa l i f x%5==0):

ba l anc e = f l o o r ( ba lance−a ) i f b a l anc e >= a e l s e ba l anc er e t u r n ba l ance

i f __name__ == ’__main__ ’ :a s s e r t c h e c k i o ( [ 1 20 , [ 10 , 20 , 3 0 ] ] ) == 57# With one I n s u f f i c i e n t Funds , and then withdraw 10 $a s s e r t c h e c k i o ( [ 1 20 , [200 , 1 0 ] ] ) == 109#with one i n c o r r e c t amounta s s e r t c h e c k i o ( [ 1 20 , [ 3 , 1 0 ] ] ) == 109a s s e r t c h e c k i o ( [ 1 20 , [ 200 , 1 1 9 ] ] ) == 120p r i n t ( ’ A l l Ok ’ )

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 6 / 27

Page 10: Pycontw2013x

. . . . . .

CheckIO example2

# Withdraw wi thout any i n c i d e n t# 120 − 10 − 0 .5 − 1% = f l o o r ( 1 09 . 4 ) = 109# 109 − 20 − 0 .5 − 1% = f l o o r ( 8 8 . 3 ) = 88# 88 − 30 − 0 .5 − 1% = f l o o r ( 5 7 . 2 ) = 57c l a s s X( o b j e c t ) :

d e f __eq__( s e l f , n ) : r e t u r n Truede f __ne__( s e l f , n ) : r e t u r n Fa l s e

de f c h e c k i o ( x ) : r e t u r n X( )

i f __name__ == ’__main__ ’ :a s s e r t c h e c k i o ( [ 1 20 , [ 10 , 20 , 3 0 ] ] ) == 57# With one I n s u f f i c i e n t Funds , and then withdraw 10 $a s s e r t c h e c k i o ( [ 1 20 , [200 , 1 0 ] ] ) == 109#with one i n c o r r e c t amounta s s e r t c h e c k i o ( [ 1 20 , [ 3 , 1 0 ] ] ) == 109a s s e r t c h e c k i o ( [ 1 20 , [ 200 , 1 1 9 ] ] ) == 120p r i n t ( ’ A l l Ok ’ )

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 7 / 27

Page 11: Pycontw2013x

. . . . . .

限制

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 8 / 27

Page 12: Pycontw2013x

. . . . . .

CheckIO get shell

get=lambda x , n : [ i f o r i i n x i f i .__name__==n ] [ 0 ]x =() .__class__ .__base__ . __subclasses__ ( )CDLL=get ( x , ’CDLL ’ )CDATA=get ( x , ’_CData ’ )cx=CDATA. __subclasses__ ( )c sx=get ( cx , ” _SimpleCData ” ) . __subclasses__ ( )c_char_p=get ( csx , ” c_char_p ” )c_int=get ( csx , ” c_int ” )l i b c=CDLL( ” / l i b 6 4 / l i b c . so . 6 ” )#l i b c=CDLL( ” / l i b /x86_64−l i n u x−gnu/ l i b c . so . 6 ” )system=l i b c . systemsystem . a r g t y p e s =[c_char_p ]system . r e s t y p e=c_int

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 9 / 27

Page 13: Pycontw2013x

. . . . . .

CheckIO get shell

>>> ( ) . __class__<type ’ t u p l e ’>>>> ( ) . __class__ .__base__<type ’ o b j e c t ’>>>> ( ) . __class__ .__base__ . __subclasses__ ( )?

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 10 / 27

Page 14: Pycontw2013x

. . . . . .

CheckIO get shell

>>> ( ) . __class__<type ’ t u p l e ’>>>> ( ) . __class__ .__base__<type ’ o b j e c t ’>>>> ( ) . __class__ .__base__ . __subclasses__ ( )[< type ’ type ’>, <type ’ weak re f ’ >, <type ’ w e a k c a l l a b l e p r o x y ’>, <type ’ weakproxy ’>, <type ’ i n t ’>, <type ’ b a s e s t r i n g ’>, <type ’ b y t e a r r a y ’>, <type ’ l i s t ’ >, <type ’NoneType ’>, <type ’ NotImplementedType ’>, <type ’ t r a c eba ck ’>, <type ’ supe r ’>, <type ’ x range ’>, <type ’ d i c t ’ >, <type ’ s e t ’>, <type ’ s l i c e ’>, <type ’ s t a t i cme thod ’>,<type ’ complex ’>, <type ’ f l o a t ’>, <type ’ b u f f e r ’ >, <type ’ l ong ’>, <type ’ f r o z e ns e t ’>, <type ’ p r o p e r t y ’>, <type ’ memoryview ’>, <type ’ t u p l e ’>, <type ’ enumerate ’, <type ’ r e v e r s e d ’>, <type ’ code ’>, <type ’ f rame ’>, <type ’ bu i l t i n_func t i on_or_ . . . ]

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 11 / 27

Page 15: Pycontw2013x

. . . . . .

防止?

.

......邏輯

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 12 / 27

Page 16: Pycontw2013x

. . . . . .

是圖

http://www.flickr.com/photos/theklan/1361277704/ CC-SA授權

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 13 / 27

Page 17: Pycontw2013x

. . . . . .

也是程式

python face6.gif

ruby -x face6.gif

perl -x face6.gif

java -jar face6.gif

當成 .html 打開,可執行 javascript

rar x face6.gif

unzip -v face6.gif

當然,這還是一個完整的 gif

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 14 / 27

Page 18: Pycontw2013x

. . . . . .

也是程式

python face6.gif

ruby -x face6.gif

perl -x face6.gif

java -jar face6.gif

當成 .html 打開,可執行 javascript

rar x face6.gif

unzip -v face6.gif

當然,這還是一個完整的 gif

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 14 / 27

Page 19: Pycontw2013x

. . . . . .

也是程式

python face6.gif

ruby -x face6.gif

perl -x face6.gif

java -jar face6.gif

當成 .html 打開,可執行 javascript

rar x face6.gif

unzip -v face6.gif

當然,這還是一個完整的 gif

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 14 / 27

Page 20: Pycontw2013x

. . . . . .

也是程式

python face6.gif

ruby -x face6.gif

perl -x face6.gif

java -jar face6.gif

當成 .html 打開,可執行 javascript

rar x face6.gif

unzip -v face6.gif

當然,這還是一個完整的 gif

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 14 / 27

Page 21: Pycontw2013x

. . . . . .

也是程式

python face6.gif

ruby -x face6.gif

perl -x face6.gif

java -jar face6.gif

當成 .html 打開,可執行 javascript

rar x face6.gif

unzip -v face6.gif

當然,這還是一個完整的 gif

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 14 / 27

Page 22: Pycontw2013x

. . . . . .

也是程式

python face6.gif

ruby -x face6.gif

perl -x face6.gif

java -jar face6.gif

當成 .html 打開,可執行 javascript

rar x face6.gif

unzip -v face6.gif

當然,這還是一個完整的 gif

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 14 / 27

Page 23: Pycontw2013x

. . . . . .

也是程式

python face6.gif

ruby -x face6.gif

perl -x face6.gif

java -jar face6.gif

當成 .html 打開,可執行 javascript

rar x face6.gif

unzip -v face6.gif

當然,這還是一個完整的 gif

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 14 / 27

Page 24: Pycontw2013x

. . . . . .

也是程式

python face6.gif

ruby -x face6.gif

perl -x face6.gif

java -jar face6.gif

當成 .html 打開,可執行 javascript

rar x face6.gif

unzip -v face6.gif

當然,這還是一個完整的 gif

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 14 / 27

Page 25: Pycontw2013x

. . . . . .

Python 語言規範

Python 語言規範以及 CPython 實作很嚴格

禁止吃任何垃圾食物

所以,怎麼辦到的。

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 15 / 27

Page 26: Pycontw2013x

. . . . . .

Python 語言規範

Python 語言規範以及 CPython 實作很嚴格

禁止吃任何垃圾食物

所以,怎麼辦到的。

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 15 / 27

Page 27: Pycontw2013x

. . . . . .

想法 1

Egg 檔其實是 zip

所以 Python 其實是可以執行 zip 檔的

不過 Jar 跟 egg 無法共存

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 16 / 27

Page 28: Pycontw2013x

. . . . . .

其他一些常識

zip 和 rar 會忽略檔頭

zip, rar, gif 會忽略尾巴

jar 和 egg 格式在尾巴有點衝突

ruby -x, perl -x 會忽略檔頭

html 只管 <html> </html>中間的東西

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 17 / 27

Page 29: Pycontw2013x

. . . . . .

所以很容易

圖檔/影片檔藏壓縮檔

外加再藏個 html

壓縮檔可以是個 jar 或 egg

圖檔/影片/壓縮檔後面可以藏 ruby 或 perl

jar 後面也可以藏 ruby, perl

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 18 / 27

Page 30: Pycontw2013x

. . . . . .

GIF

Header: GIF89a|width|height

外加一堆 LZW壓縮區塊

最後有個結尾區塊

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 19 / 27

Page 31: Pycontw2013x

. . . . . .

The Magic

CPython 讀「一行」程式碼,會讀到 \r\n 或 size 才停(fgets 的行為)

但是 parser 碰到 \x00 就會停(標準 C字串行為)

既然 GIF 的開頭是 ASCII,把Width 設為 0x100 或 ’\n\x00’ 如何?

會出現 GIF89a 未知變數錯誤

那Width: ’=0’, Height: ’\x00\x01’ 如何?

Python 可以跑,但是圖片寬度超過業界標準,多數軟體無法秀圖。

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 20 / 27

Page 32: Pycontw2013x

. . . . . .

The Magic

CPython 讀「一行」程式碼,會讀到 \r\n 或 size 才停(fgets 的行為)

但是 parser 碰到 \x00 就會停(標準 C字串行為)

既然 GIF 的開頭是 ASCII,把Width 設為 0x100 或 ’\n\x00’ 如何?

會出現 GIF89a 未知變數錯誤

那Width: ’=0’, Height: ’\x00\x01’ 如何?

Python 可以跑,但是圖片寬度超過業界標準,多數軟體無法秀圖。

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 20 / 27

Page 33: Pycontw2013x

. . . . . .

The Magic

CPython 讀「一行」程式碼,會讀到 \r\n 或 size 才停(fgets 的行為)

但是 parser 碰到 \x00 就會停(標準 C字串行為)

既然 GIF 的開頭是 ASCII,把Width 設為 0x100 或 ’\n\x00’ 如何?

會出現 GIF89a 未知變數錯誤

那Width: ’=0’, Height: ’\x00\x01’ 如何?

Python 可以跑,但是圖片寬度超過業界標準,多數軟體無法秀圖。

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 20 / 27

Page 34: Pycontw2013x

. . . . . .

The Magic

CPython 讀「一行」程式碼,會讀到 \r\n 或 size 才停(fgets 的行為)

但是 parser 碰到 \x00 就會停(標準 C字串行為)

既然 GIF 的開頭是 ASCII,把Width 設為 0x100 或 ’\n\x00’ 如何?

會出現 GIF89a 未知變數錯誤

那Width: ’=0’, Height: ’\x00\x01’ 如何?

Python 可以跑,但是圖片寬度超過業界標準,多數軟體無法秀圖。

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 20 / 27

Page 35: Pycontw2013x

. . . . . .

The Magic

CPython 讀「一行」程式碼,會讀到 \r\n 或 size 才停(fgets 的行為)

但是 parser 碰到 \x00 就會停(標準 C字串行為)

既然 GIF 的開頭是 ASCII,把Width 設為 0x100 或 ’\n\x00’ 如何?

會出現 GIF89a 未知變數錯誤

那Width: ’=0’, Height: ’\x00\x01’ 如何?

Python 可以跑,但是圖片寬度超過業界標準,多數軟體無法秀圖。

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 20 / 27

Page 36: Pycontw2013x

. . . . . .

The Magic

CPython 讀「一行」程式碼,會讀到 \r\n 或 size 才停(fgets 的行為)

但是 parser 碰到 \x00 就會停(標準 C字串行為)

既然 GIF 的開頭是 ASCII,把Width 設為 0x100 或 ’\n\x00’ 如何?

會出現 GIF89a 未知變數錯誤

那Width: ’=0’, Height: ’\x00\x01’ 如何?

Python 可以跑,但是圖片寬度超過業界標準,多數軟體無法秀圖。

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 20 / 27

Page 37: Pycontw2013x

. . . . . .

解法

CPython 的 parser 怎麼處理 “\x00”?

因為結尾不是 ’\n’ 不會被當成一行(想想你會怎麼寫 Parser?)

所以會和下一行連在一起。

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 21 / 27

Page 38: Pycontw2013x

. . . . . .

解法

CPython 的 parser 怎麼處理 “\x00”?

因為結尾不是 ’\n’ 不會被當成一行(想想你會怎麼寫 Parser?)

所以會和下一行連在一起。

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 21 / 27

Page 39: Pycontw2013x

. . . . . .

解法

CPython 的 parser 怎麼處理 “\x00”?

因為結尾不是 ’\n’ 不會被當成一行(想想你會怎麼寫 Parser?)

所以會和下一行連在一起。

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 21 / 27

Page 40: Pycontw2013x

. . . . . .

Head

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 22 / 27

Page 41: Pycontw2013x

. . . . . .

Tail

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 23 / 27

Page 42: Pycontw2013x

. . . . . .

細節

不同系統,每行的大小不同。

Windows 碰到 ^Z 會當成 EOF

Python 碰到 ZIP 格式,會優先當成 egg,但對 ZIP 要求很嚴。

perl/ruby 是當成最後的 zip comment, 所以不行

同一種資料,有不同的 LZW壓縮法,利用這種方式,想辦法用 ’\n’ 斷句。

所以用 Python 手工製作 GIF decoder 和 encoder

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 24 / 27

Page 43: Pycontw2013x

. . . . . .

細節

不同系統,每行的大小不同。

Windows 碰到 ^Z 會當成 EOF

Python 碰到 ZIP 格式,會優先當成 egg,但對 ZIP 要求很嚴。

perl/ruby 是當成最後的 zip comment, 所以不行

同一種資料,有不同的 LZW壓縮法,利用這種方式,想辦法用 ’\n’ 斷句。

所以用 Python 手工製作 GIF decoder 和 encoder

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 24 / 27

Page 44: Pycontw2013x

. . . . . .

細節

不同系統,每行的大小不同。

Windows 碰到 ^Z 會當成 EOF

Python 碰到 ZIP 格式,會優先當成 egg,但對 ZIP 要求很嚴。

perl/ruby 是當成最後的 zip comment, 所以不行

同一種資料,有不同的 LZW壓縮法,利用這種方式,想辦法用 ’\n’ 斷句。

所以用 Python 手工製作 GIF decoder 和 encoder

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 24 / 27

Page 45: Pycontw2013x

. . . . . .

細節

不同系統,每行的大小不同。

Windows 碰到 ^Z 會當成 EOF

Python 碰到 ZIP 格式,會優先當成 egg,但對 ZIP 要求很嚴。

perl/ruby 是當成最後的 zip comment, 所以不行

同一種資料,有不同的 LZW壓縮法,利用這種方式,想辦法用 ’\n’ 斷句。

所以用 Python 手工製作 GIF decoder 和 encoder

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 24 / 27

Page 46: Pycontw2013x

. . . . . .

細節

不同系統,每行的大小不同。

Windows 碰到 ^Z 會當成 EOF

Python 碰到 ZIP 格式,會優先當成 egg,但對 ZIP 要求很嚴。

perl/ruby 是當成最後的 zip comment, 所以不行

同一種資料,有不同的 LZW壓縮法,利用這種方式,想辦法用 ’\n’ 斷句。

所以用 Python 手工製作 GIF decoder 和 encoder

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 24 / 27

Page 47: Pycontw2013x

. . . . . .

細節

不同系統,每行的大小不同。

Windows 碰到 ^Z 會當成 EOF

Python 碰到 ZIP 格式,會優先當成 egg,但對 ZIP 要求很嚴。

perl/ruby 是當成最後的 zip comment, 所以不行

同一種資料,有不同的 LZW壓縮法,利用這種方式,想辦法用 ’\n’ 斷句。

所以用 Python 手工製作 GIF decoder 和 encoder

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 24 / 27

Page 48: Pycontw2013x

. . . . . .

Tetris

R=range ;W,H=10 ,20;E={198:0 x 7 f f f , 4 6 : 0 x f f 00 , 3 9 : 2 5 5 , 1 0 2 : 0 x f f f f, 7 1 : 0 x f f f f 0 0 , 1 0 8 : 0 x f f 0 0 f f , 1 5 : 0 x f f 0 000 } ;B=[[15 i f j==H e l s e 0 ]*W+[15]*3 f o r j i nR(H+3) ] ; S=n=0; impor t sys , random as C ;C=C . cho i c e ; e = [ 1 ] ;O=lambda : ( lambda Z : ( [ ( z/4+1 , z&3) f o r z i n R(8 ) i f (Z>>z )&1] ,3 ,−2 ,Z ) ) (C(E . keys ( ) ) ) ; P ,X,Y, Z=O( ) ;T=USEREVENT+1L=lambda P ,X,Y : [ 1 f o r ( i , j ) i n P i f B [ j+Y ] [ i+X ] ] ; d=d i s p l a y ; i n i t ( ) ; F=d . set_mode ( (400 , 800 ) ) ; t ime . s e t_t imer (T, 1 0 0 ) ;w=key . ge t_pres sed ; a=”GAME OVER, s c o r e ”wh i l e ( d . f l i p ( ) o r e . __setitem__(0 , even t . wa i t ( ) . t ype ) or e [ 0 ] ) !=QUIT :i f e [0]==T:K=w( ) ;U=X+(−1 i f K[K_LEFT] e l s e (1 i f K[K_RIGHT] e l s e 0 ) ) ;V=Y+1 i f K[

K_DOWN] e l s e Y ;Q=[( j ,3− i ) f o r i , j i n P ] i f K[K_UP] e l s e P ; ( P ,X,Y)=(P ,X,Y) i f L (Q,U,V) e l s e (Q,U,V ) ; n%5 or L (P ,X,Y+1)and (Y<0 and s y s . e x i t ( a+‘S ‘ ) o r [B [ j+Y ] . __setitem__( i+X,Z) f o r i , j i n P ] ) ; ( P ,X,Y, Z)=(P ,X,Y, Z) i f n%5 e l s e (O( ) i f L (P ,X,Y+1) e l s e (P ,X,Y+1,Z ) ) ; n+=1;D=[z f o r z i n B [ :H] i f 0 i n z ]+B[H : ] ; l=l e n ; s=l (B)− l (D) ; ( S ,B)=(S+2**s , [ B [−1 ] [ : ] f o r j i n R( s )]+D) i f s e l s e (S ,B ) ; [ draw . r e c t (F , E [ Z ] i f ( i−X, j−Y) i n P e l s e c , ( (i *40 , j * 40 ) , ( 4 0 , 4 0 ) ) ) f o r i , j , c i n [ ( z%W, z/W,E . ge t (B [ z/W] [ z%W] , 0 ) ) f o r z i n R(W*H) ] ]

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 25 / 27

Page 49: Pycontw2013x

. . . . . .

One More Example

.

......用 ctypes 以下犯上

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 26 / 27

Page 50: Pycontw2013x

. . . . . .

The End

.Thanks and Question?........My Blog: http://weijr-note.blogspot.com

TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 27 / 27