. . . . . ........天元突破, 鑽開 Python 的限制TJW @ PyCon Taiwan 20132013-05-26TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-...
. . . . . .Hacking change my life經歷/學習某些事物會改變「你」數學、程式設計、象棋、魔術、撲克都是Hacking 也是其中之一TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python...
. . . . . .What is Hacking.定義........Hacking=在條件限制下,達到預期外的效果。Workaround=在條件限制下,完成預期該有卻沒有的功能。.例子........SQL-InjectionTJW @ ...
. . . . . .What is Hacking.定義........Hacking=在條件限制下,達到預期外的效果。Workaround=在條件限制下,完成預期該有卻沒有的功能。.例子........SQL-InjectionTJW @ ...
. . . . . .What is Hacking.定義........Hacking=在條件限制下,達到預期外的效果。Workaround=在條件限制下,完成預期該有卻沒有的功能。.例子........SQL-InjectionTJW @ ...
. . . . . .What is Hacking.定義........Hacking=在條件限制下,達到預期外的效果。Workaround=在條件限制下,完成預期該有卻沒有的功能。.例子........SQL-InjectionTJW @ ...
. . . . . .Back to 90s還在用鴿子傳封包還沒有 Google大學課本都是影印店印的安裝 Linux 要十幾張磁碟片那個時候開源軟體叫做自由軟體X 沒辦法輸入中文TJW @ PyCon Taiwan 2013 () 天元突破,...
. . . . . .CheckIO.orgTJW @ 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 ...
. . . . . .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...
. . . . . .限制TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 8 / 27
. . . . . .CheckIO get shellget=lambda x , n : [ i f o r i in x i f i .__name__==n ] [ 0 ]x =(). __class__ .__base__. __su...
. . . . . .CheckIO get shell>>> ( ) . __class__<type ’ t u p l e ’>>>> ( ) . __class__ .__base__<type ’ o b j e c t ’>>>> ...
. . . . . .CheckIO get shell>>> ( ) . __class__<type ’ t u p l e ’>>>> ( ) . __class__ .__base__<type ’ o b j e c t ’>>>> ...
. . . . . .防止?.......邏輯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-0...
. . . . . .也是程式python face6.gifruby -x face6.gifperl -x face6.gifjava -jar face6.gif當成 .html 打開,可執行 javascriptrar x face6....
. . . . . .也是程式python face6.gifruby -x face6.gifperl -x face6.gifjava -jar face6.gif當成 .html 打開,可執行 javascriptrar x face6....
. . . . . .也是程式python face6.gifruby -x face6.gifperl -x face6.gifjava -jar face6.gif當成 .html 打開,可執行 javascriptrar x face6....
. . . . . .也是程式python face6.gifruby -x face6.gifperl -x face6.gifjava -jar face6.gif當成 .html 打開,可執行 javascriptrar x face6....
. . . . . .也是程式python face6.gifruby -x face6.gifperl -x face6.gifjava -jar face6.gif當成 .html 打開,可執行 javascriptrar x face6....
. . . . . .也是程式python face6.gifruby -x face6.gifperl -x face6.gifjava -jar face6.gif當成 .html 打開,可執行 javascriptrar x face6....
. . . . . .也是程式python face6.gifruby -x face6.gifperl -x face6.gifjava -jar face6.gif當成 .html 打開,可執行 javascriptrar x face6....
. . . . . .也是程式python face6.gifruby -x face6.gifperl -x face6.gifjava -jar face6.gif當成 .html 打開,可執行 javascriptrar x face6....
. . . . . .Python 語言規範Python 語言規範以及 CPython 實作很嚴格禁止吃任何垃圾食物所以,怎麼辦到的。TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-...
. . . . . .Python 語言規範Python 語言規範以及 CPython 實作很嚴格禁止吃任何垃圾食物所以,怎麼辦到的。TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-...
. . . . . .想法 1Egg 檔其實是 zip所以 Python 其實是可以執行 zip 檔的不過 Jar 跟 egg 無法共存TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05...
. . . . . .其他一些常識zip 和 rar 會忽略檔頭zip, rar, gif 會忽略尾巴jar 和 egg 格式在尾巴有點衝突ruby -x, perl -x 會忽略檔頭html 只管 <html> </html>中間的東西TJW...
. . . . . .所以很容易圖檔/影片檔藏壓縮檔外加再藏個 html壓縮檔可以是個 jar 或 egg圖檔/影片/壓縮檔後面可以藏 ruby 或 perljar 後面也可以藏 ruby, perlTJW @ PyCon Taiwan 201...
. . . . . .GIFHeader: GIF89a|width|height外加一堆 LZW 壓縮區塊最後有個結尾區塊TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 19...
. . . . . .The MagicCPython 讀「一行」程式碼,會讀到 rn 或 size 才停(fgets 的行為)但是 parser 碰到 x00 就會停(標準 C 字串行為)既然 GIF 的開頭是 ASCII,把 Width 設...
. . . . . .The MagicCPython 讀「一行」程式碼,會讀到 rn 或 size 才停(fgets 的行為)但是 parser 碰到 x00 就會停(標準 C 字串行為)既然 GIF 的開頭是 ASCII,把 Width 設...
. . . . . .The MagicCPython 讀「一行」程式碼,會讀到 rn 或 size 才停(fgets 的行為)但是 parser 碰到 x00 就會停(標準 C 字串行為)既然 GIF 的開頭是 ASCII,把 Width 設...
. . . . . .The MagicCPython 讀「一行」程式碼,會讀到 rn 或 size 才停(fgets 的行為)但是 parser 碰到 x00 就會停(標準 C 字串行為)既然 GIF 的開頭是 ASCII,把 Width 設...
. . . . . .The MagicCPython 讀「一行」程式碼,會讀到 rn 或 size 才停(fgets 的行為)但是 parser 碰到 x00 就會停(標準 C 字串行為)既然 GIF 的開頭是 ASCII,把 Width 設...
. . . . . .The MagicCPython 讀「一行」程式碼,會讀到 rn 或 size 才停(fgets 的行為)但是 parser 碰到 x00 就會停(標準 C 字串行為)既然 GIF 的開頭是 ASCII,把 Width 設...
. . . . . .解法CPython 的 parser 怎麼處理 “x00”?因為結尾不是 ’n’ 不會被當成一行(想想你會怎麼寫 Parser?)所以會和下一行連在一起。TJW @ PyCon Taiwan 2013 () 天元突破, 鑽...
. . . . . .解法CPython 的 parser 怎麼處理 “x00”?因為結尾不是 ’n’ 不會被當成一行(想想你會怎麼寫 Parser?)所以會和下一行連在一起。TJW @ PyCon Taiwan 2013 () 天元突破, 鑽...
. . . . . .解法CPython 的 parser 怎麼處理 “x00”?因為結尾不是 ’n’ 不會被當成一行(想想你會怎麼寫 Parser?)所以會和下一行連在一起。TJW @ PyCon Taiwan 2013 () 天元突破, 鑽...
. . . . . .HeadTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 22 / 27
. . . . . .TailTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 23 / 27
. . . . . .細節不同系統,每行的大小不同。Windows 碰到 ^Z 會當成 EOFPython 碰到 ZIP 格式,會優先當成 egg,但對 ZIP 要求很嚴。perl/ruby 是當成最後的 zip comment, 所以不行同一...
. . . . . .細節不同系統,每行的大小不同。Windows 碰到 ^Z 會當成 EOFPython 碰到 ZIP 格式,會優先當成 egg,但對 ZIP 要求很嚴。perl/ruby 是當成最後的 zip comment, 所以不行同一...
. . . . . .細節不同系統,每行的大小不同。Windows 碰到 ^Z 會當成 EOFPython 碰到 ZIP 格式,會優先當成 egg,但對 ZIP 要求很嚴。perl/ruby 是當成最後的 zip comment, 所以不行同一...
. . . . . .細節不同系統,每行的大小不同。Windows 碰到 ^Z 會當成 EOFPython 碰到 ZIP 格式,會優先當成 egg,但對 ZIP 要求很嚴。perl/ruby 是當成最後的 zip comment, 所以不行同一...
. . . . . .細節不同系統,每行的大小不同。Windows 碰到 ^Z 會當成 EOFPython 碰到 ZIP 格式,會優先當成 egg,但對 ZIP 要求很嚴。perl/ruby 是當成最後的 zip comment, 所以不行同一...
. . . . . .細節不同系統,每行的大小不同。Windows 碰到 ^Z 會當成 EOFPython 碰到 ZIP 格式,會優先當成 egg,但對 ZIP 要求很嚴。perl/ruby 是當成最後的 zip comment, 所以不行同一...
. . . . . .TetrisR=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...
. . . . . .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.comTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 ...
Upcoming SlideShare
Loading in …5
×

Pycontw2013x

2,097
-1

Published on

Published in: Technology

Pycontw2013x

  1. 1. . . . . . ........天元突破, 鑽開 Python 的限制TJW @ PyCon Taiwan 20132013-05-26TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 1 / 27
  2. 2. . . . . . .Hacking change my life經歷/學習某些事物會改變「你」數學、程式設計、象棋、魔術、撲克都是Hacking 也是其中之一TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 2 / 27
  3. 3. . . . . . .What is Hacking.定義........Hacking=在條件限制下,達到預期外的效果。Workaround=在條件限制下,完成預期該有卻沒有的功能。.例子........SQL-InjectionTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 3 / 27
  4. 4. . . . . . .What is Hacking.定義........Hacking=在條件限制下,達到預期外的效果。Workaround=在條件限制下,完成預期該有卻沒有的功能。.例子........SQL-InjectionTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 3 / 27
  5. 5. . . . . . .What is Hacking.定義........Hacking=在條件限制下,達到預期外的效果。Workaround=在條件限制下,完成預期該有卻沒有的功能。.例子........SQL-InjectionTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 3 / 27
  6. 6. . . . . . .What is Hacking.定義........Hacking=在條件限制下,達到預期外的效果。Workaround=在條件限制下,完成預期該有卻沒有的功能。.例子........SQL-InjectionTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 3 / 27
  7. 7. . . . . . .Back to 90s還在用鴿子傳封包還沒有 Google大學課本都是影印店印的安裝 Linux 要十幾張磁碟片那個時候開源軟體叫做自由軟體X 沒辦法輸入中文TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 4 / 27
  8. 8. . . . . . .CheckIO.orgTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 5 / 27
  9. 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) = 88from math import f l o o rdef checkio ( data ) :balance , withdrawal = dataf 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 balar e t u r n balancei 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 amounta s s e r t checkio ([120 , [3 , 1 0 ] ] ) == 109a s s e r t checkio ([120 , [200 , 1 1 9 ] ] ) == 120p r i n t ( ’ A l l Ok ’ )TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 6 / 27
  10. 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) = 57c l a s s X( o b j e c t ) :def __eq__( s e l f , n ) : r e t u r n Truedef __ne__( s e l f , n ) : r e t u r n Falsedef 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 amounta s s e r t checkio ([120 , [3 , 1 0 ] ] ) == 109a s s e r t checkio ([120 , [200 , 1 1 9 ] ] ) == 120p r i n t ( ’ A l l Ok ’ )TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 7 / 27
  11. 11. . . . . . .限制TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 8 / 27
  12. 12. . . . . . .CheckIO get shellget=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 . systemsystem . argtypes =[c_char_p ]system . r e s t y p e=c_intTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 9 / 27
  13. 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. 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 ’ >, <tyoneType ’ >, <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 ’ los 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. 15. . . . . . .防止?.......邏輯TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 12 / 27
  16. 16. . . . . . .是圖http://www.flickr.com/photos/theklan/1361277704/ CC-SA授權TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 13 / 27
  17. 17. . . . . . .也是程式python face6.gifruby -x face6.gifperl -x face6.gifjava -jar face6.gif當成 .html 打開,可執行 javascriptrar x face6.gifunzip -v face6.gif當然,這還是一個完整的 gifTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 14 / 27
  18. 18. . . . . . .也是程式python face6.gifruby -x face6.gifperl -x face6.gifjava -jar face6.gif當成 .html 打開,可執行 javascriptrar x face6.gifunzip -v face6.gif當然,這還是一個完整的 gifTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 14 / 27
  19. 19. . . . . . .也是程式python face6.gifruby -x face6.gifperl -x face6.gifjava -jar face6.gif當成 .html 打開,可執行 javascriptrar x face6.gifunzip -v face6.gif當然,這還是一個完整的 gifTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 14 / 27
  20. 20. . . . . . .也是程式python face6.gifruby -x face6.gifperl -x face6.gifjava -jar face6.gif當成 .html 打開,可執行 javascriptrar x face6.gifunzip -v face6.gif當然,這還是一個完整的 gifTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 14 / 27
  21. 21. . . . . . .也是程式python face6.gifruby -x face6.gifperl -x face6.gifjava -jar face6.gif當成 .html 打開,可執行 javascriptrar x face6.gifunzip -v face6.gif當然,這還是一個完整的 gifTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 14 / 27
  22. 22. . . . . . .也是程式python face6.gifruby -x face6.gifperl -x face6.gifjava -jar face6.gif當成 .html 打開,可執行 javascriptrar x face6.gifunzip -v face6.gif當然,這還是一個完整的 gifTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 14 / 27
  23. 23. . . . . . .也是程式python face6.gifruby -x face6.gifperl -x face6.gifjava -jar face6.gif當成 .html 打開,可執行 javascriptrar x face6.gifunzip -v face6.gif當然,這還是一個完整的 gifTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 14 / 27
  24. 24. . . . . . .也是程式python face6.gifruby -x face6.gifperl -x face6.gifjava -jar face6.gif當成 .html 打開,可執行 javascriptrar x face6.gifunzip -v face6.gif當然,這還是一個完整的 gifTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 14 / 27
  25. 25. . . . . . .Python 語言規範Python 語言規範以及 CPython 實作很嚴格禁止吃任何垃圾食物所以,怎麼辦到的。TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 15 / 27
  26. 26. . . . . . .Python 語言規範Python 語言規範以及 CPython 實作很嚴格禁止吃任何垃圾食物所以,怎麼辦到的。TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 15 / 27
  27. 27. . . . . . .想法 1Egg 檔其實是 zip所以 Python 其實是可以執行 zip 檔的不過 Jar 跟 egg 無法共存TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 16 / 27
  28. 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. 29. . . . . . .所以很容易圖檔/影片檔藏壓縮檔外加再藏個 html壓縮檔可以是個 jar 或 egg圖檔/影片/壓縮檔後面可以藏 ruby 或 perljar 後面也可以藏 ruby, perlTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 18 / 27
  30. 30. . . . . . .GIFHeader: GIF89a|width|height外加一堆 LZW 壓縮區塊最後有個結尾區塊TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 19 / 27
  31. 31. . . . . . .The MagicCPython 讀「一行」程式碼,會讀到 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. 32. . . . . . .The MagicCPython 讀「一行」程式碼,會讀到 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. 33. . . . . . .The MagicCPython 讀「一行」程式碼,會讀到 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. 34. . . . . . .The MagicCPython 讀「一行」程式碼,會讀到 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. 35. . . . . . .The MagicCPython 讀「一行」程式碼,會讀到 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. 36. . . . . . .The MagicCPython 讀「一行」程式碼,會讀到 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. 37. . . . . . .解法CPython 的 parser 怎麼處理 “x00”?因為結尾不是 ’n’ 不會被當成一行(想想你會怎麼寫 Parser?)所以會和下一行連在一起。TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 21 / 27
  38. 38. . . . . . .解法CPython 的 parser 怎麼處理 “x00”?因為結尾不是 ’n’ 不會被當成一行(想想你會怎麼寫 Parser?)所以會和下一行連在一起。TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 21 / 27
  39. 39. . . . . . .解法CPython 的 parser 怎麼處理 “x00”?因為結尾不是 ’n’ 不會被當成一行(想想你會怎麼寫 Parser?)所以會和下一行連在一起。TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 21 / 27
  40. 40. . . . . . .HeadTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 22 / 27
  41. 41. . . . . . .TailTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 23 / 27
  42. 42. . . . . . .細節不同系統,每行的大小不同。Windows 碰到 ^Z 會當成 EOFPython 碰到 ZIP 格式,會優先當成 egg,但對 ZIP 要求很嚴。perl/ruby 是當成最後的 zip comment, 所以不行同一種資料,有不同的 LZW 壓縮法,利用這種方式,想辦法用 ’n’ 斷句。所以用 Python 手工製作 GIF decoder 和 encoderTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 24 / 27
  43. 43. . . . . . .細節不同系統,每行的大小不同。Windows 碰到 ^Z 會當成 EOFPython 碰到 ZIP 格式,會優先當成 egg,但對 ZIP 要求很嚴。perl/ruby 是當成最後的 zip comment, 所以不行同一種資料,有不同的 LZW 壓縮法,利用這種方式,想辦法用 ’n’ 斷句。所以用 Python 手工製作 GIF decoder 和 encoderTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 24 / 27
  44. 44. . . . . . .細節不同系統,每行的大小不同。Windows 碰到 ^Z 會當成 EOFPython 碰到 ZIP 格式,會優先當成 egg,但對 ZIP 要求很嚴。perl/ruby 是當成最後的 zip comment, 所以不行同一種資料,有不同的 LZW 壓縮法,利用這種方式,想辦法用 ’n’ 斷句。所以用 Python 手工製作 GIF decoder 和 encoderTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 24 / 27
  45. 45. . . . . . .細節不同系統,每行的大小不同。Windows 碰到 ^Z 會當成 EOFPython 碰到 ZIP 格式,會優先當成 egg,但對 ZIP 要求很嚴。perl/ruby 是當成最後的 zip comment, 所以不行同一種資料,有不同的 LZW 壓縮法,利用這種方式,想辦法用 ’n’ 斷句。所以用 Python 手工製作 GIF decoder 和 encoderTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 24 / 27
  46. 46. . . . . . .細節不同系統,每行的大小不同。Windows 碰到 ^Z 會當成 EOFPython 碰到 ZIP 格式,會優先當成 egg,但對 ZIP 要求很嚴。perl/ruby 是當成最後的 zip comment, 所以不行同一種資料,有不同的 LZW 壓縮法,利用這種方式,想辦法用 ’n’ 斷句。所以用 Python 手工製作 GIF decoder 和 encoderTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 24 / 27
  47. 47. . . . . . .細節不同系統,每行的大小不同。Windows 碰到 ^Z 會當成 EOFPython 碰到 ZIP 格式,會優先當成 egg,但對 ZIP 要求很嚴。perl/ruby 是當成最後的 zip comment, 所以不行同一種資料,有不同的 LZW 壓縮法,利用這種方式,想辦法用 ’n’ 斷句。所以用 Python 手工製作 GIF decoder 和 encoderTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 24 / 27
  48. 48. . . . . . .TetrisR=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 inR(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+1L=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. 49. . . . . . .One More Example.......用 ctypes 以下犯上TJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 26 / 27
  50. 50. . . . . . .The End.Thanks and Question?........My Blog: http://weijr-note.blogspot.comTJW @ PyCon Taiwan 2013 () 天元突破, 鑽開 Python 的限制 2013-05-26 27 / 27
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×