. . . . . .
.
......
天元突破, 鑽開 Python 的限制
TJW @ PyCon Taiwan 2013
2013-05-26
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 1 / 27
. . . . . .
Hacking change my life
經歷/學習某些事物會改變「你」
數學、程式設計、象棋、魔術、撲克都是
Hacking 也是其中之一
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 2 / 27
. . . . . .
What is Hacking
.
定義
..
......
Hacking=在條件限制下,達到預期外的效果。
Workaround=在條件限制下,完成預期該有卻沒有的功能。
.
例子
..
......SQL-Injection
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 3 / 27
. . . . . .
What is Hacking
.
定義
..
......
Hacking=在條件限制下,達到預期外的效果。
Workaround=在條件限制下,完成預期該有卻沒有的功能。
.
例子
..
......SQL-Injection
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 3 / 27
. . . . . .
What is Hacking
.
定義
..
......
Hacking=在條件限制下,達到預期外的效果。
Workaround=在條件限制下,完成預期該有卻沒有的功能。
.
例子
..
......SQL-Injection
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 3 / 27
. . . . . .
What is Hacking
.
定義
..
......
Hacking=在條件限制下,達到預期外的效果。
Workaround=在條件限制下,完成預期該有卻沒有的功能。
.
例子
..
......SQL-Injection
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 3 / 27
. . . . . .
Back to 90s
還在用鴿子傳封包
還沒有 Google
大學課本都是影印店印的
安裝 Linux 要十幾張磁碟片
那個時候開源軟體叫做自由軟體
X 沒辦法輸入中文
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 4 / 27
. . . . . .
CheckIO.org
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 5 / 27
. . . . . .
CheckIO example
# Withdraw without any i n c i d e n t
# 120 − 10 − 0.5 − 1% = f l o o r (109.4) = 109
# 109 − 20 − 0.5 − 1% = f l o o r (88.3) = 88
from math import f l o o r
def checkio ( data ) :
balance , withdrawal = data
f o r a in (0.5+1.01* x f o r x in withdrawal i f x%5==0):
balance = f l o o r ( balance −a ) i f balance >= a e l s e bala
r e t u r n balance
i f __name__ == ’__main__ ’ :
a s s e r t checkio ([120 , [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 checkio ([120 , [200 , 1 0 ] ] ) == 109
#with one i n c o r r e c t amount
a s s e r t checkio ([120 , [3 , 1 0 ] ] ) == 109
a s s e r t checkio ([120 , [200 , 1 1 9 ] ] ) == 120
p r i n t ( ’ A l l Ok ’ )
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 6 / 27
. . . . . .
CheckIO example2
# Withdraw without any i n c i d e n t
# 120 − 10 − 0.5 − 1% = f l o o r (109.4) = 109
# 109 − 20 − 0.5 − 1% = f l o o r (88.3) = 88
# 88 − 30 − 0.5 − 1% = f l o o r (57.2) = 57
c l a s s X( o b j e c t ) :
def __eq__( s e l f , n ) : r e t u r n True
def __ne__( s e l f , n ) : r e t u r n False
def checkio ( x ) : r e t u r n X()
i f __name__ == ’__main__ ’ :
a s s e r t checkio ([120 , [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 checkio ([120 , [200 , 1 0 ] ] ) == 109
#with one i n c o r r e c t amount
a s s e r t checkio ([120 , [3 , 1 0 ] ] ) == 109
a s s e r t checkio ([120 , [200 , 1 1 9 ] ] ) == 120
p r i n t ( ’ A l l Ok ’ )
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 7 / 27
. . . . . .
限制
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 8 / 27
. . . . . .
CheckIO get shell
get=lambda x , n : [ i f o r i in x i f i .__name__==n ] [ 0 ]
x =(). __class__ .__base__. __subclasses__ ()
CDLL=get ( x , ’CDLL ’ )
CDATA=get ( x , ’_CData ’ )
cx=CDATA. __subclasses__ ()
csx=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−linux −gnu/ l i b c . so . 6 ” )
system=l i b c . system
system . argtypes =[c_char_p ]
system . r e s t y p e=c_int
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 9 / 27
. . . . . .
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
. . . . . .
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 ’ weakref ’ >, <type ’ w e a k c a l l a b l e p r o x y ’
, <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 ’ >, <ty
oneType ’ >, <type ’ NotImplementedType ’ >, <type ’ traceback ’ >,
e ’ xrange ’ >, <type ’ d i c t ’ >, <type ’ s e t ’ >, <type ’ s l i c e ’ >, <
<type ’ complex ’ >, <type ’ f l o a t ’ >, <type ’ b u f f e r ’ >, <type ’ lo
s e t ’ >, <type ’ property ’ >, <type ’ memoryview ’ >, <type ’ t u p l e
, <type ’ r e v e r s e d ’ >, <type ’ code ’ >, <type ’ frame ’ >, <type ’
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 11 / 27
. . . . . .
防止?
.
......邏輯
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 12 / 27
. . . . . .
是圖
http://www.flickr.com/photos/theklan/1361277704/ CC-SA授權
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 13 / 27
. . . . . .
也是程式
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
. . . . . .
也是程式
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
. . . . . .
也是程式
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
. . . . . .
也是程式
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
. . . . . .
也是程式
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
. . . . . .
也是程式
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
. . . . . .
也是程式
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
. . . . . .
也是程式
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
. . . . . .
Python 語言規範
Python 語言規範以及 CPython 實作很嚴格
禁止吃任何垃圾食物
所以,怎麼辦到的。
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 15 / 27
. . . . . .
Python 語言規範
Python 語言規範以及 CPython 實作很嚴格
禁止吃任何垃圾食物
所以,怎麼辦到的。
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 15 / 27
. . . . . .
想法 1
Egg 檔其實是 zip
所以 Python 其實是可以執行 zip 檔的
不過 Jar 跟 egg 無法共存
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 16 / 27
. . . . . .
其他一些常識
zip 和 rar 會忽略檔頭
zip, rar, gif 會忽略尾巴
jar 和 egg 格式在尾巴有點衝突
ruby -x, perl -x 會忽略檔頭
html 只管 <html> </html>中間的東西
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 17 / 27
. . . . . .
所以很容易
圖檔/影片檔藏壓縮檔
外加再藏個 html
壓縮檔可以是個 jar 或 egg
圖檔/影片/壓縮檔後面可以藏 ruby 或 perl
jar 後面也可以藏 ruby, perl
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 18 / 27
. . . . . .
GIF
Header: GIF89a|width|height
外加一堆 LZW 壓縮區塊
最後有個結尾區塊
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 19 / 27
. . . . . .
The Magic
CPython 讀「一行」程式碼,會讀到 rn 或 size 才停(fgets 的行為)
但是 parser 碰到 x00 就會停(標準 C 字串行為)
既然 GIF 的開頭是 ASCII,把 Width 設為 0x100 或 ’nx00’ 如何?
會出現 GIF89a 未知變數錯誤
那 Width: ’=0’, Height: ’x00x01’ 如何?
Python 可以跑,但是圖片寬度超過業界標準,多數軟體無法秀圖。
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 20 / 27
. . . . . .
The Magic
CPython 讀「一行」程式碼,會讀到 rn 或 size 才停(fgets 的行為)
但是 parser 碰到 x00 就會停(標準 C 字串行為)
既然 GIF 的開頭是 ASCII,把 Width 設為 0x100 或 ’nx00’ 如何?
會出現 GIF89a 未知變數錯誤
那 Width: ’=0’, Height: ’x00x01’ 如何?
Python 可以跑,但是圖片寬度超過業界標準,多數軟體無法秀圖。
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 20 / 27
. . . . . .
The Magic
CPython 讀「一行」程式碼,會讀到 rn 或 size 才停(fgets 的行為)
但是 parser 碰到 x00 就會停(標準 C 字串行為)
既然 GIF 的開頭是 ASCII,把 Width 設為 0x100 或 ’nx00’ 如何?
會出現 GIF89a 未知變數錯誤
那 Width: ’=0’, Height: ’x00x01’ 如何?
Python 可以跑,但是圖片寬度超過業界標準,多數軟體無法秀圖。
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 20 / 27
. . . . . .
The Magic
CPython 讀「一行」程式碼,會讀到 rn 或 size 才停(fgets 的行為)
但是 parser 碰到 x00 就會停(標準 C 字串行為)
既然 GIF 的開頭是 ASCII,把 Width 設為 0x100 或 ’nx00’ 如何?
會出現 GIF89a 未知變數錯誤
那 Width: ’=0’, Height: ’x00x01’ 如何?
Python 可以跑,但是圖片寬度超過業界標準,多數軟體無法秀圖。
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 20 / 27
. . . . . .
The Magic
CPython 讀「一行」程式碼,會讀到 rn 或 size 才停(fgets 的行為)
但是 parser 碰到 x00 就會停(標準 C 字串行為)
既然 GIF 的開頭是 ASCII,把 Width 設為 0x100 或 ’nx00’ 如何?
會出現 GIF89a 未知變數錯誤
那 Width: ’=0’, Height: ’x00x01’ 如何?
Python 可以跑,但是圖片寬度超過業界標準,多數軟體無法秀圖。
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 20 / 27
. . . . . .
The Magic
CPython 讀「一行」程式碼,會讀到 rn 或 size 才停(fgets 的行為)
但是 parser 碰到 x00 就會停(標準 C 字串行為)
既然 GIF 的開頭是 ASCII,把 Width 設為 0x100 或 ’nx00’ 如何?
會出現 GIF89a 未知變數錯誤
那 Width: ’=0’, Height: ’x00x01’ 如何?
Python 可以跑,但是圖片寬度超過業界標準,多數軟體無法秀圖。
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 20 / 27
. . . . . .
解法
CPython 的 parser 怎麼處理 “x00”?
因為結尾不是 ’n’ 不會被當成一行(想想你會怎麼寫 Parser?)
所以會和下一行連在一起。
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 21 / 27
. . . . . .
解法
CPython 的 parser 怎麼處理 “x00”?
因為結尾不是 ’n’ 不會被當成一行(想想你會怎麼寫 Parser?)
所以會和下一行連在一起。
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 21 / 27
. . . . . .
解法
CPython 的 parser 怎麼處理 “x00”?
因為結尾不是 ’n’ 不會被當成一行(想想你會怎麼寫 Parser?)
所以會和下一行連在一起。
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 21 / 27
. . . . . .
Head
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 22 / 27
. . . . . .
Tail
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 23 / 27
. . . . . .
細節
不同系統,每行的大小不同。
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
. . . . . .
細節
不同系統,每行的大小不同。
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
. . . . . .
細節
不同系統,每行的大小不同。
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
. . . . . .
細節
不同系統,每行的大小不同。
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
. . . . . .
細節
不同系統,每行的大小不同。
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
. . . . . .
細節
不同系統,每行的大小不同。
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
. . . . . .
Tetris
R=range ;W,H=10 ,20;E={198:0 x 7 f f f , 4 6 : 0 xff00 ,39:255 ,102:0 x f f f f
,71:0 x f f f f 0 0 ,108:0 x f f 0 0 f f , 1 5 : 0 xff0000 };B=[[15 i f j==H e l s e 0]*W+[15]*3 f o r j in
R(H+3)]; S=n=0; import sys , random as C;C=C. choice ; e =[1];O=lambda : ( lambda Z : ( [ ( z/4+
1 , z&3) f o r z in R(8) i f (Z>>z )&1] ,3 , −2 ,Z ) ) (C(E . keys ( ) ) ) ; P,X,Y, Z=O( ) ;T=USEREVENT+1
L=lambda P,X,Y : [ 1 f o r ( i , j ) in 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)); time . set_timer (T, 1 0 0 ) ;w=key . get_pressed ; a=”GAME OVER, score ”
while (d . f l i p () or e . __setitem__ (0 , event . wait ( ) . type ) 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 in 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 sys . e x i t ( a+‘S ‘ ) or [B[ j+Y ] . __setitem__( i
+X, Z) f o r i , j in 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 in B [ : H] i f 0 in z]+B[H : ] ; l=le n ; s=l (B)−l (D) ; ( S ,B)=(S+2**s , [ B[
−1][:] f o r j in 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) in P e l s e c , ( (
i *40 , j *40) ,(40 ,40))) f o r i , j , c in [ ( z%W, z/W, E . get (B[ z/W] [ z%W] , 0 ) ) f o r z in R(W*H ) ] ]
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 25 / 27
. . . . . .
One More Example
.
......用 ctypes 以下犯上
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 26 / 27
. . . . . .
The End
.
Thanks and Question?
..
......My Blog: http://weijr-note.blogspot.com
TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 27 / 27

More Related Content

PDF
[COSCUP2013] Python, F#, Golang and Friends
ODP
從技術面簡介線上遊戲外掛
PDF
[系列活動] Python 爬蟲實戰
ODP
密碼學漏洞與他們的產地 Crypto fail and where to find them
PDF
[系列活動] Python 程式語言起步走
PDF
Python学习笔记
PDF
手把手打開Python資料分析大門
PDF
[系列活動] Python爬蟲實戰
[COSCUP2013] Python, F#, Golang and Friends
從技術面簡介線上遊戲外掛
[系列活動] Python 爬蟲實戰
密碼學漏洞與他們的產地 Crypto fail and where to find them
[系列活動] Python 程式語言起步走
Python学习笔记
手把手打開Python資料分析大門
[系列活動] Python爬蟲實戰

What's hot (18)

PDF
[系列活動] 手把手打開Python資料分析大門
PDF
Py ladies 0928
PDF
Vim Hacks
PDF
Python 于 webgame 的应用
PDF
教青少年寫程式
PDF
Recurrent Neural Network 遞迴式神經網路
PDF
Android C Library: Bionic 成長計畫
PPTX
連淡水阿嬤都聽得懂的 機器學習入門 scikit-learn
PPTX
Python web开发吐槽
ODP
Op 20090411
PPTX
Python 爬蟲實戰
PDF
论 Python 与设计模式。
PDF
Introduction of Reverse Engineering
PDF
Python crawling tutorial
PPT
页游开发中的 Python 组件与模式
PPT
Shell脚本
 
PPT
Python story
PDF
[系列活動] 手把手打開Python資料分析大門
Py ladies 0928
Vim Hacks
Python 于 webgame 的应用
教青少年寫程式
Recurrent Neural Network 遞迴式神經網路
Android C Library: Bionic 成長計畫
連淡水阿嬤都聽得懂的 機器學習入門 scikit-learn
Python web开发吐槽
Op 20090411
Python 爬蟲實戰
论 Python 与设计模式。
Introduction of Reverse Engineering
Python crawling tutorial
页游开发中的 Python 组件与模式
Shell脚本
 
Python story
Ad

Viewers also liked (6)

PPTX
Pysx presentation at Pycontw
PDF
Rapid prototypingembeddedsystemsbypython
PDF
Introduction Discrete-Event Simulation Using SimPy
PDF
Gnu radio lecture
PDF
A Glimpse into Developing Software-Defined Radio by Python
PDF
Introduction to Digital Signal Processing Using GNU Radio
Pysx presentation at Pycontw
Rapid prototypingembeddedsystemsbypython
Introduction Discrete-Event Simulation Using SimPy
Gnu radio lecture
A Glimpse into Developing Software-Defined Radio by Python
Introduction to Digital Signal Processing Using GNU Radio
Ad

Similar to Pycontw2013x (20)

PDF
Python 2 - 快速簡介
PDF
Python系列3
PDF
《Python 3.5 技術手冊》第二章草稿
PPTX
Python 入門初體驗
PDF
Learning python in the motion picture industry by will zhou
PPTX
Python 入門
PPTX
[3]投影片 futurewad樹莓派研習會 141204
PDF
Adorable python
PDF
HITCON CTF 2014 BambooFox 解題心得分享
PDF
Ch7 教學
PDF
投影片
PDF
8. open() 與 io 模組
PPTX
open() 與 io 模組
PDF
Programming python - part 1
PPT
Python 入门
PPTX
Y3CDS - Python class 01
PPTX
Python攻略
PPT
Python Basic
PDF
講義
PDF
简单Pthon教程
Python 2 - 快速簡介
Python系列3
《Python 3.5 技術手冊》第二章草稿
Python 入門初體驗
Learning python in the motion picture industry by will zhou
Python 入門
[3]投影片 futurewad樹莓派研習會 141204
Adorable python
HITCON CTF 2014 BambooFox 解題心得分享
Ch7 教學
投影片
8. open() 與 io 模組
open() 與 io 模組
Programming python - part 1
Python 入门
Y3CDS - Python class 01
Python攻略
Python Basic
講義
简单Pthon教程

Pycontw2013x

  • 1. . . . . . . . ...... 天元突破, 鑽開 Python 的限制 TJW @ PyCon Taiwan 2013 2013-05-26 TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 1 / 27
  • 2. . . . . . . Hacking change my life 經歷/學習某些事物會改變「你」 數學、程式設計、象棋、魔術、撲克都是 Hacking 也是其中之一 TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 2 / 27
  • 3. . . . . . . What is Hacking . 定義 .. ...... Hacking=在條件限制下,達到預期外的效果。 Workaround=在條件限制下,完成預期該有卻沒有的功能。 . 例子 .. ......SQL-Injection TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 3 / 27
  • 4. . . . . . . What is Hacking . 定義 .. ...... Hacking=在條件限制下,達到預期外的效果。 Workaround=在條件限制下,完成預期該有卻沒有的功能。 . 例子 .. ......SQL-Injection TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 3 / 27
  • 5. . . . . . . What is Hacking . 定義 .. ...... Hacking=在條件限制下,達到預期外的效果。 Workaround=在條件限制下,完成預期該有卻沒有的功能。 . 例子 .. ......SQL-Injection TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 3 / 27
  • 6. . . . . . . What is Hacking . 定義 .. ...... Hacking=在條件限制下,達到預期外的效果。 Workaround=在條件限制下,完成預期該有卻沒有的功能。 . 例子 .. ......SQL-Injection TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 3 / 27
  • 7. . . . . . . Back to 90s 還在用鴿子傳封包 還沒有 Google 大學課本都是影印店印的 安裝 Linux 要十幾張磁碟片 那個時候開源軟體叫做自由軟體 X 沒辦法輸入中文 TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 4 / 27
  • 8. . . . . . . CheckIO.org TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 5 / 27
  • 9. . . . . . . CheckIO example # Withdraw without any i n c i d e n t # 120 − 10 − 0.5 − 1% = f l o o r (109.4) = 109 # 109 − 20 − 0.5 − 1% = f l o o r (88.3) = 88 from math import f l o o r def checkio ( data ) : balance , withdrawal = data f o r a in (0.5+1.01* x f o r x in withdrawal i f x%5==0): balance = f l o o r ( balance −a ) i f balance >= a e l s e bala r e t u r n balance i f __name__ == ’__main__ ’ : a s s e r t checkio ([120 , [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 checkio ([120 , [200 , 1 0 ] ] ) == 109 #with one i n c o r r e c t amount a s s e r t checkio ([120 , [3 , 1 0 ] ] ) == 109 a s s e r t checkio ([120 , [200 , 1 1 9 ] ] ) == 120 p r i n t ( ’ A l l Ok ’ ) TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 6 / 27
  • 10. . . . . . . CheckIO example2 # Withdraw without any i n c i d e n t # 120 − 10 − 0.5 − 1% = f l o o r (109.4) = 109 # 109 − 20 − 0.5 − 1% = f l o o r (88.3) = 88 # 88 − 30 − 0.5 − 1% = f l o o r (57.2) = 57 c l a s s X( o b j e c t ) : def __eq__( s e l f , n ) : r e t u r n True def __ne__( s e l f , n ) : r e t u r n False def checkio ( x ) : r e t u r n X() i f __name__ == ’__main__ ’ : a s s e r t checkio ([120 , [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 checkio ([120 , [200 , 1 0 ] ] ) == 109 #with one i n c o r r e c t amount a s s e r t checkio ([120 , [3 , 1 0 ] ] ) == 109 a s s e r t checkio ([120 , [200 , 1 1 9 ] ] ) == 120 p r i n t ( ’ A l l Ok ’ ) TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 7 / 27
  • 11. . . . . . . 限制 TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 8 / 27
  • 12. . . . . . . CheckIO get shell get=lambda x , n : [ i f o r i in x i f i .__name__==n ] [ 0 ] x =(). __class__ .__base__. __subclasses__ () CDLL=get ( x , ’CDLL ’ ) CDATA=get ( x , ’_CData ’ ) cx=CDATA. __subclasses__ () csx=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−linux −gnu/ l i b c . so . 6 ” ) system=l i b c . system system . argtypes =[c_char_p ] system . r e s t y p e=c_int TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 9 / 27
  • 13. . . . . . . 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
  • 14. . . . . . . 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 ’ weakref ’ >, <type ’ w e a k c a l l a b l e p r o x y ’ , <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 ’ >, <ty oneType ’ >, <type ’ NotImplementedType ’ >, <type ’ traceback ’ >, e ’ xrange ’ >, <type ’ d i c t ’ >, <type ’ s e t ’ >, <type ’ s l i c e ’ >, < <type ’ complex ’ >, <type ’ f l o a t ’ >, <type ’ b u f f e r ’ >, <type ’ lo s e t ’ >, <type ’ property ’ >, <type ’ memoryview ’ >, <type ’ t u p l e , <type ’ r e v e r s e d ’ >, <type ’ code ’ >, <type ’ frame ’ >, <type ’ TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 11 / 27
  • 15. . . . . . . 防止? . ......邏輯 TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 12 / 27
  • 16. . . . . . . 是圖 http://www.flickr.com/photos/theklan/1361277704/ CC-SA授權 TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 13 / 27
  • 17. . . . . . . 也是程式 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
  • 18. . . . . . . 也是程式 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
  • 19. . . . . . . 也是程式 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
  • 20. . . . . . . 也是程式 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
  • 21. . . . . . . 也是程式 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
  • 22. . . . . . . 也是程式 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
  • 23. . . . . . . 也是程式 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
  • 24. . . . . . . 也是程式 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
  • 25. . . . . . . Python 語言規範 Python 語言規範以及 CPython 實作很嚴格 禁止吃任何垃圾食物 所以,怎麼辦到的。 TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 15 / 27
  • 26. . . . . . . Python 語言規範 Python 語言規範以及 CPython 實作很嚴格 禁止吃任何垃圾食物 所以,怎麼辦到的。 TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 15 / 27
  • 27. . . . . . . 想法 1 Egg 檔其實是 zip 所以 Python 其實是可以執行 zip 檔的 不過 Jar 跟 egg 無法共存 TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 16 / 27
  • 28. . . . . . . 其他一些常識 zip 和 rar 會忽略檔頭 zip, rar, gif 會忽略尾巴 jar 和 egg 格式在尾巴有點衝突 ruby -x, perl -x 會忽略檔頭 html 只管 <html> </html>中間的東西 TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 17 / 27
  • 29. . . . . . . 所以很容易 圖檔/影片檔藏壓縮檔 外加再藏個 html 壓縮檔可以是個 jar 或 egg 圖檔/影片/壓縮檔後面可以藏 ruby 或 perl jar 後面也可以藏 ruby, perl TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 18 / 27
  • 30. . . . . . . GIF Header: GIF89a|width|height 外加一堆 LZW 壓縮區塊 最後有個結尾區塊 TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 19 / 27
  • 31. . . . . . . The Magic CPython 讀「一行」程式碼,會讀到 rn 或 size 才停(fgets 的行為) 但是 parser 碰到 x00 就會停(標準 C 字串行為) 既然 GIF 的開頭是 ASCII,把 Width 設為 0x100 或 ’nx00’ 如何? 會出現 GIF89a 未知變數錯誤 那 Width: ’=0’, Height: ’x00x01’ 如何? Python 可以跑,但是圖片寬度超過業界標準,多數軟體無法秀圖。 TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 20 / 27
  • 32. . . . . . . The Magic CPython 讀「一行」程式碼,會讀到 rn 或 size 才停(fgets 的行為) 但是 parser 碰到 x00 就會停(標準 C 字串行為) 既然 GIF 的開頭是 ASCII,把 Width 設為 0x100 或 ’nx00’ 如何? 會出現 GIF89a 未知變數錯誤 那 Width: ’=0’, Height: ’x00x01’ 如何? Python 可以跑,但是圖片寬度超過業界標準,多數軟體無法秀圖。 TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 20 / 27
  • 33. . . . . . . The Magic CPython 讀「一行」程式碼,會讀到 rn 或 size 才停(fgets 的行為) 但是 parser 碰到 x00 就會停(標準 C 字串行為) 既然 GIF 的開頭是 ASCII,把 Width 設為 0x100 或 ’nx00’ 如何? 會出現 GIF89a 未知變數錯誤 那 Width: ’=0’, Height: ’x00x01’ 如何? Python 可以跑,但是圖片寬度超過業界標準,多數軟體無法秀圖。 TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 20 / 27
  • 34. . . . . . . The Magic CPython 讀「一行」程式碼,會讀到 rn 或 size 才停(fgets 的行為) 但是 parser 碰到 x00 就會停(標準 C 字串行為) 既然 GIF 的開頭是 ASCII,把 Width 設為 0x100 或 ’nx00’ 如何? 會出現 GIF89a 未知變數錯誤 那 Width: ’=0’, Height: ’x00x01’ 如何? Python 可以跑,但是圖片寬度超過業界標準,多數軟體無法秀圖。 TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 20 / 27
  • 35. . . . . . . The Magic CPython 讀「一行」程式碼,會讀到 rn 或 size 才停(fgets 的行為) 但是 parser 碰到 x00 就會停(標準 C 字串行為) 既然 GIF 的開頭是 ASCII,把 Width 設為 0x100 或 ’nx00’ 如何? 會出現 GIF89a 未知變數錯誤 那 Width: ’=0’, Height: ’x00x01’ 如何? Python 可以跑,但是圖片寬度超過業界標準,多數軟體無法秀圖。 TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 20 / 27
  • 36. . . . . . . The Magic CPython 讀「一行」程式碼,會讀到 rn 或 size 才停(fgets 的行為) 但是 parser 碰到 x00 就會停(標準 C 字串行為) 既然 GIF 的開頭是 ASCII,把 Width 設為 0x100 或 ’nx00’ 如何? 會出現 GIF89a 未知變數錯誤 那 Width: ’=0’, Height: ’x00x01’ 如何? Python 可以跑,但是圖片寬度超過業界標準,多數軟體無法秀圖。 TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 20 / 27
  • 37. . . . . . . 解法 CPython 的 parser 怎麼處理 “x00”? 因為結尾不是 ’n’ 不會被當成一行(想想你會怎麼寫 Parser?) 所以會和下一行連在一起。 TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 21 / 27
  • 38. . . . . . . 解法 CPython 的 parser 怎麼處理 “x00”? 因為結尾不是 ’n’ 不會被當成一行(想想你會怎麼寫 Parser?) 所以會和下一行連在一起。 TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 21 / 27
  • 39. . . . . . . 解法 CPython 的 parser 怎麼處理 “x00”? 因為結尾不是 ’n’ 不會被當成一行(想想你會怎麼寫 Parser?) 所以會和下一行連在一起。 TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 21 / 27
  • 40. . . . . . . Head TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 22 / 27
  • 41. . . . . . . Tail TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 23 / 27
  • 42. . . . . . . 細節 不同系統,每行的大小不同。 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
  • 43. . . . . . . 細節 不同系統,每行的大小不同。 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
  • 44. . . . . . . 細節 不同系統,每行的大小不同。 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
  • 45. . . . . . . 細節 不同系統,每行的大小不同。 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
  • 46. . . . . . . 細節 不同系統,每行的大小不同。 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
  • 47. . . . . . . 細節 不同系統,每行的大小不同。 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
  • 48. . . . . . . Tetris R=range ;W,H=10 ,20;E={198:0 x 7 f f f , 4 6 : 0 xff00 ,39:255 ,102:0 x f f f f ,71:0 x f f f f 0 0 ,108:0 x f f 0 0 f f , 1 5 : 0 xff0000 };B=[[15 i f j==H e l s e 0]*W+[15]*3 f o r j in R(H+3)]; S=n=0; import sys , random as C;C=C. choice ; e =[1];O=lambda : ( lambda Z : ( [ ( z/4+ 1 , z&3) f o r z in R(8) i f (Z>>z )&1] ,3 , −2 ,Z ) ) (C(E . keys ( ) ) ) ; P,X,Y, Z=O( ) ;T=USEREVENT+1 L=lambda P,X,Y : [ 1 f o r ( i , j ) in 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)); time . set_timer (T, 1 0 0 ) ;w=key . get_pressed ; a=”GAME OVER, score ” while (d . f l i p () or e . __setitem__ (0 , event . wait ( ) . type ) 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 in 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 sys . e x i t ( a+‘S ‘ ) or [B[ j+Y ] . __setitem__( i +X, Z) f o r i , j in 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 in B [ : H] i f 0 in z]+B[H : ] ; l=le n ; s=l (B)−l (D) ; ( S ,B)=(S+2**s , [ B[ −1][:] f o r j in 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) in P e l s e c , ( ( i *40 , j *40) ,(40 ,40))) f o r i , j , c in [ ( z%W, z/W, E . get (B[ z/W] [ z%W] , 0 ) ) f o r z in R(W*H ) ] ] TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 25 / 27
  • 49. . . . . . . One More Example . ......用 ctypes 以下犯上 TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 26 / 27
  • 50. . . . . . . The End . Thanks and Question? .. ......My Blog: http://weijr-note.blogspot.com TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 27 / 27