SlideShare uma empresa Scribd logo
1 de 50
Baixar para ler offline
. . . . . .
.
......
天元突破, 鑽開 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

Mais conteúdo relacionado

Mais procurados

[系列活動] 手把手打開Python資料分析大門
[系列活動] 手把手打開Python資料分析大門[系列活動] 手把手打開Python資料分析大門
[系列活動] 手把手打開Python資料分析大門台灣資料科學年會
 
Python 于 webgame 的应用
Python 于 webgame 的应用Python 于 webgame 的应用
Python 于 webgame 的应用勇浩 赖
 
教青少年寫程式
教青少年寫程式教青少年寫程式
教青少年寫程式Renyuan Lyu
 
Recurrent Neural Network 遞迴式神經網路
Recurrent Neural Network 遞迴式神經網路Recurrent Neural Network 遞迴式神經網路
Recurrent Neural Network 遞迴式神經網路Yen-lung Tsai
 
Android C Library: Bionic 成長計畫
Android C Library: Bionic 成長計畫Android C Library: Bionic 成長計畫
Android C Library: Bionic 成長計畫Kito Cheng
 
連淡水阿嬤都聽得懂的 機器學習入門 scikit-learn
連淡水阿嬤都聽得懂的機器學習入門 scikit-learn 連淡水阿嬤都聽得懂的機器學習入門 scikit-learn
連淡水阿嬤都聽得懂的 機器學習入門 scikit-learn Cicilia Lee
 
Python web开发吐槽
Python web开发吐槽Python web开发吐槽
Python web开发吐槽Felinx Lee
 
论 Python 与设计模式。
论 Python 与设计模式。论 Python 与设计模式。
论 Python 与设计模式。勇浩 赖
 
Introduction of Reverse Engineering
Introduction of Reverse EngineeringIntroduction of Reverse Engineering
Introduction of Reverse EngineeringYC Ling
 
Python crawling tutorial
Python crawling tutorialPython crawling tutorial
Python crawling tutorialChen-Ming Yang
 
页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式勇浩 赖
 
Shell脚本
Shell脚本Shell脚本
Shell脚本bj
 

Mais procurados (18)

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

Destaque

Pysx presentation at Pycontw
Pysx presentation at PycontwPysx presentation at Pycontw
Pysx presentation at Pycontwweijr
 
Rapid prototypingembeddedsystemsbypython
Rapid prototypingembeddedsystemsbypythonRapid prototypingembeddedsystemsbypython
Rapid prototypingembeddedsystemsbypythonAlbert Huang
 
Introduction Discrete-Event Simulation Using SimPy
Introduction Discrete-Event Simulation Using SimPyIntroduction Discrete-Event Simulation Using SimPy
Introduction Discrete-Event Simulation Using SimPyAlbert Huang
 
A Glimpse into Developing Software-Defined Radio by Python
A Glimpse into Developing Software-Defined Radio by PythonA Glimpse into Developing Software-Defined Radio by Python
A Glimpse into Developing Software-Defined Radio by PythonAlbert Huang
 
Introduction to Digital Signal Processing Using GNU Radio
Introduction to Digital Signal Processing Using GNU RadioIntroduction to Digital Signal Processing Using GNU Radio
Introduction to Digital Signal Processing Using GNU RadioAlbert Huang
 

Destaque (6)

Pysx presentation at Pycontw
Pysx presentation at PycontwPysx presentation at Pycontw
Pysx presentation at Pycontw
 
Rapid prototypingembeddedsystemsbypython
Rapid prototypingembeddedsystemsbypythonRapid prototypingembeddedsystemsbypython
Rapid prototypingembeddedsystemsbypython
 
Introduction Discrete-Event Simulation Using SimPy
Introduction Discrete-Event Simulation Using SimPyIntroduction Discrete-Event Simulation Using SimPy
Introduction Discrete-Event Simulation Using SimPy
 
Gnu radio lecture
Gnu radio lectureGnu radio lecture
Gnu radio lecture
 
A Glimpse into Developing Software-Defined Radio by Python
A Glimpse into Developing Software-Defined Radio by PythonA Glimpse into Developing Software-Defined Radio by Python
A Glimpse into Developing Software-Defined Radio by Python
 
Introduction to Digital Signal Processing Using GNU Radio
Introduction to Digital Signal Processing Using GNU RadioIntroduction to Digital Signal Processing Using GNU Radio
Introduction to Digital Signal Processing Using GNU Radio
 

Semelhante a Pycontw2013x

Py ladies 0928
Py ladies 0928Py ladies 0928
Py ladies 0928Yen_CY
 
Python速成指南
Python速成指南Python速成指南
Python速成指南March Liu
 
漫談 Source Control Management
漫談 Source Control Management漫談 Source Control Management
漫談 Source Control ManagementWen-Shih Chao
 
HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享Chong-Kuan Chen
 
手机腾讯网Js资源版本增量更新方案w3ctech
手机腾讯网Js资源版本增量更新方案w3ctech 手机腾讯网Js资源版本增量更新方案w3ctech
手机腾讯网Js资源版本增量更新方案w3ctech luyongfugx
 
Spry框架的简单使用小结
Spry框架的简单使用小结Spry框架的简单使用小结
Spry框架的简单使用小结sunnylqm
 
Programming python - part 1
Programming python - part 1Programming python - part 1
Programming python - part 1Che-Cheng Hsu
 
Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)Kris Mok
 
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代scott liao
 
Python入門:5大概念初心者必備 2021/11/18
Python入門:5大概念初心者必備 2021/11/18Python入門:5大概念初心者必備 2021/11/18
Python入門:5大概念初心者必備 2021/11/18Derek Lee
 
Python 入門
Python 入門 Python 入門
Python 入門 Andy Yao
 
20161209-Julia Taiwan first meetup-julia語言入門
20161209-Julia Taiwan first meetup-julia語言入門20161209-Julia Taiwan first meetup-julia語言入門
20161209-Julia Taiwan first meetup-julia語言入門岳華 杜
 
Swift Functional Programming
Swift Functional ProgrammingSwift Functional Programming
Swift Functional Programming林藍 東
 
R 語言教學: 探索性資料分析與文字探勘初探
R 語言教學: 探索性資料分析與文字探勘初探R 語言教學: 探索性資料分析與文字探勘初探
R 語言教學: 探索性資料分析與文字探勘初探Sean Yu
 
电子杂志(试刊)
电子杂志(试刊)电子杂志(试刊)
电子杂志(试刊)ProCharm
 
我对后端优化的一点想法.pptx
我对后端优化的一点想法.pptx我对后端优化的一点想法.pptx
我对后端优化的一点想法.pptxjames tong
 
20200905_tcn_python_opencv_part1_omnixri
20200905_tcn_python_opencv_part1_omnixri20200905_tcn_python_opencv_part1_omnixri
20200905_tcn_python_opencv_part1_omnixriOmniXRI Studio
 
从问题开始,谈前端架构
从问题开始,谈前端架构从问题开始,谈前端架构
从问题开始,谈前端架构裕波 周
 

Semelhante a Pycontw2013x (20)

Py ladies 0928
Py ladies 0928Py ladies 0928
Py ladies 0928
 
Python速成指南
Python速成指南Python速成指南
Python速成指南
 
漫談 Source Control Management
漫談 Source Control Management漫談 Source Control Management
漫談 Source Control Management
 
HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享
 
手机腾讯网Js资源版本增量更新方案w3ctech
手机腾讯网Js资源版本增量更新方案w3ctech 手机腾讯网Js资源版本增量更新方案w3ctech
手机腾讯网Js资源版本增量更新方案w3ctech
 
Spry框架的简单使用小结
Spry框架的简单使用小结Spry框架的简单使用小结
Spry框架的简单使用小结
 
Programming python - part 1
Programming python - part 1Programming python - part 1
Programming python - part 1
 
Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)
 
Maintainable Javascript
Maintainable JavascriptMaintainable Javascript
Maintainable Javascript
 
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
 
Python入門:5大概念初心者必備 2021/11/18
Python入門:5大概念初心者必備 2021/11/18Python入門:5大概念初心者必備 2021/11/18
Python入門:5大概念初心者必備 2021/11/18
 
Python 入門
Python 入門 Python 入門
Python 入門
 
20161209-Julia Taiwan first meetup-julia語言入門
20161209-Julia Taiwan first meetup-julia語言入門20161209-Julia Taiwan first meetup-julia語言入門
20161209-Julia Taiwan first meetup-julia語言入門
 
Swift Functional Programming
Swift Functional ProgrammingSwift Functional Programming
Swift Functional Programming
 
R 語言教學: 探索性資料分析與文字探勘初探
R 語言教學: 探索性資料分析與文字探勘初探R 語言教學: 探索性資料分析與文字探勘初探
R 語言教學: 探索性資料分析與文字探勘初探
 
电子杂志(试刊)
电子杂志(试刊)电子杂志(试刊)
电子杂志(试刊)
 
我对后端优化的一点想法.pptx
我对后端优化的一点想法.pptx我对后端优化的一点想法.pptx
我对后端优化的一点想法.pptx
 
20200905_tcn_python_opencv_part1_omnixri
20200905_tcn_python_opencv_part1_omnixri20200905_tcn_python_opencv_part1_omnixri
20200905_tcn_python_opencv_part1_omnixri
 
Python系列4
Python系列4Python系列4
Python系列4
 
从问题开始,谈前端架构
从问题开始,谈前端架构从问题开始,谈前端架构
从问题开始,谈前端架构
 

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