Posts

Showing posts with the label python

Week's note

(1) python 這週五面試了間公司,被詢問了個關於一個 python 不錯的問題,筆記一下。 [Q] a = [[0]*3]*4 a[0][1] = 3 a[1][1] = ? [A]     主要是python對於常數(constant/immutable variable)所指向的記憶體空間皆同. 像是 0, "a", 3.189 等常數有各自的記憶體空間。但是list, dic等型別的宣告則會分配不同的空間。 >>> a=[[1,2],[1,2]] >>> id(a[0]) 4336602216 >>> id(a[1]) 4336652728 >>> a=[[1,2]]*2 >>> id(a[0]) 4336652440 >>> id(a[1]) 4336652440     另外就是 list 的乘法。過去針對數值的運算免不了都用 numpy, scipy 或 conda 內建地資料結構, 像是 array, frame, matrix 等,直接作 list multiplication 我通常只會寫 '='*10 做排版或者採用 list comprehension 的寫法,什麼時候會直些相乘?還沒見過。 不過L大建議可以利用 (1) dis 去 dump python bytecode 了解語法差異。(2) 針對 immutable 的特性,用 ctypes.memmove() 就讓此特性消失了, 很機車的解法 lol  (1) SQL     昨天L大問了個關於資料庫的字串搜尋的問題,紀錄一下。假設要找字串 ABC     Mysql 語法   SELECT * FROM   [table]   WHERE [column] LIKE '%ABC%' [Q] 如何讓它更快? [A]      a. 若 table 提供 full text indexing, 用關鍵詞 CONTAINS [ stacko...

python 學習五四三

'0x' 與 ’\x’的關係? 在這之前得先了解 4 個相互轉換的函式: chr() / ord() = char to unicode number / unicode number to char int() / hex() = convert to a base of 10 / convert to a base of 16 1 : In [ 1 ]: ord ( 'A' ) 2 : Out[ 1 ]: 65 3 : In [ 2 ]: chr ( 65 ) 4 : Out[ 2 ]: 'A' 5 : In [ 3 ]: hex ( 65 ) 6 : Out[ 3 ]: '0x41' 7 : In [ 4 ]: int ( '0x41' , 16 ) 8 : Out[ 4 ]: 65 9 : In [ 9 ]: ' \x41 ' 10 : Out[ 9 ]: 'A' 11 : In [ 10 ]: '0x41' 12 : Out[ 10 ]: '0x41' 13 : In [ 11 ]: chr ( int ( '0x41' , 16 )) 14 : Out[ 11 ]: 'A' 如何執行一段 string-based statements 1 : py_loop_stmt = """ 2: def py_hello(): 3: for i in xrange(10): 4: print i, 5: print 6: print "have a nice day!" 7: """ 8 : co = compile (py_loop_stmt, '' , 'exec' ) 9 : exec (co) 10 : py_hello() 11 : 0 ...

如何用 python 撰寫其他語言的 parser, analyzer, indexer, annotator ?

Image
今天早上在 PTT 看到這篇文章, 挺有意思的, 這裡記錄一下. 雖然原 po 僅是要 parsing #IF #ELSEIF 這類的 marcos, 但這應該是指 lex-yacc 的parsing tools 吧! 查了一下, 若是針對 c code, 其實用 GNU GCC/ or Clang/LLVM 就可以列出了. ( 參考 ) 另外針對 clang  的 python api 也是 (參考 clang-python-binding ) 若是要用原生的 python 來做成, 大多是使用 PLY 的 parser, 像是 pycparser 或 minicparser . BTW, 另外也看到個問題是: 透過USB線相接的電腦 - 電視,  如何將電腦的滑鼠行為呈現在電視上? (用想的) 這問題似乎有幾個難度: 1) 電視將 USB 輸入端(電腦輸出) 視為滑鼠? 還是 2) 電視跟電腦端各有個程式透過 USB 在做通訊模擬滑鼠? 嗯嗯, 先這樣. 繼續跟 NS2 奮戰去... Orz

關於 heroku 在 windows 上的部署

其實之前就做過了, 只是沒能留下筆記, 只好再把流程紀錄一遍. (怎感覺自己一直再重複作業 n 把事情搞複雜... Orz) *另外用 heroku 的主要考量還是想先試試水溫 (也是沒有錢 Orz), 待有固定收入再搬到 linode 好了 [目標] 在 heroku 上部屬 python web application [參考]  https://devcenter.heroku.com/articles/python [需要工具] 1. python (v2.7) 2. pip, Virtualenv, flask 3. heroku account, heroku client application [這裡略過] [ Local workstation setup -- Windows ] 0.1. python 2.7 ( 官網 ) 0.2. pip 的安裝需要 setuptools 跟 pip 的同時安裝, 這裡有佛心 執行檔 連結. 0.3. Virtualenv 的安裝直接下 :> pip install virtualenv 即可. 0.4. VIRTUAL_ENV = 'virtual_env27' 建立 folder :> mkdir VIRTUAL_ENV 建立 virtual environment :> virtualenv VIRTUAL_ENV 0.5. 安裝framework flask, 直接下 :> pip install flask 即可. 0.6. 建立 放至專案的 folder :> cd VIRTUAL_ENV ; :> mkdir Projects ; :> cd Projects 1.0. 建立 第一個專案 helloheroku folder :> mkdir helloheroku ; :> cd helloheroku 1.1. 建立 第一支 flask 程式 app.py, 參考 flask 官網 1.2. 利用 heroku 提供的兩個工具 Procfile 與 foreman 作 local testing Procfile 內文: web: python...

[django] views

Views:     主要是針對webpage的部份,指的是各種不同類的view, ex. homepage, archive page 等等,     大多是用來提供特定的functions或templates. django裡透過 ROOT_URLCONF (settings.py) 設定URLConf. For example, MyApp/     .__init__     models.py     urls.py     views.py (1) 設定 ROOT_URLCONF = 'MyApp.urls' (2) 撰寫 urls.py, 增加欲提供服務的 urlpatterns           urlpatterns = ( regular expression, python callback function [, optional dictionary] ) urlpatterns = patterns('MyApp.views',  url(r'^gg/$', 'index'), url(r'^gg/(?P \d+/$', 'search'), ) 當user 詢問 MyApp/gg/123/ 時, ( I)  django會針對ROOT_URLCONF內對應的APP(MyApp), (II)  搜尋它urls.py內符合RE的pattern (III) load 指定的 callback function(views.py). 從這個例子可以知道 callback function會像這樣:   search(request= , search_id='123') (Supplement) *一個domain下可以有多個web apps, ROOT_URLCONF我搞錯了, 他只能指定一個路徑, 正確的做法應該是指定一個 urls.py, ...

[Linux]Django + lighty 安裝

紀錄一下安裝流程 (0) Python 2.6       flup (python library for fastCGI) (1) Lighttpd   # apt-get install lighttpd (2) Django   # wget xxx   # python setup.py install (3) 修改lighttpd.config   # vi /etc/lighttpd/lighttpd.conf        (a)增加 mod_fastcgi (順序要在mod_access, mod_rewrite之後, mod_accesslog之前)        (b)修改預設路徑  server.document-root  "/home/xxx"        (c)指定fastcgi.server的處理方式 fastcgi.server = ( "/mysite.fcgi" => ( "main" => ( "socket" => "/home/xxx/mysite.sock", "check-local" => "disable", ) ),         (d)撰寫 mysite.fcgi #!/usr/bin/python import sys , os # Add a custom Python path. sys . path . insert ( 0 , "/home/user/python" ) # Switch to the directory of your project. (Optional.) # os.chdir("/home/user/myproject") # Set the DJANGO_SETTINGS_MODULE environment variable. os . environ [ 'DJANGO_SETTINGS_MODULE' ] = "myproject.setting...

[python] 關於thread的timer

寫MT實在很惱人,特別是讓threads定期做些事情時,一不小心就busy loop... 先前的做法都是使用os內建的sleep(),  但缺點是無法掌握程式結束的時間。 前幾天偉任建議使用threading模組內建的Timer class 看了做法後,它是使用Event()做為timer,  然後每次invoke一個新的thread去執行該function (其實BT源碼就是這樣做Timer了,只能說當時太弱,不懂期間的差異) Results: import  threading import  thread   mutex = thread. allocate_lock ( ) def printm ( msg ) :      with  mutex:          print   "[%s]"  % threading. current_thread ( ) . name , "say:" , msg     class  MyThread ( threading. Thread ) :     def __init__ ( self,  name ) :         threading. Thread .__init__ ( self )         self. name  =  name         self. timer  = threading. Event ( )         def do_dialog ( self ) :         printm ( "How do you do?!" )         self. setDialogTimer ( )         def setDialogTi...

[python] 隱藏 console

python 要如何做到隱藏console 這個應該是屬於windows的問題吧 因為作業系統是xp 所以去找了 win32api and python相關 果然找到 前人的解法 Python代码  import  win32api, win32gui   ct = win32api.GetConsoleTitle()   hd = win32gui.FindWindow( 0 ,ct)   win32gui.ShowWindow(hd, 0 )   很简单吧,就是获得console的handle,然后隐藏(0分别代表NULL和SW_HIDE)。启动还是用python.exe。 不過在啟動前還是得先去下載 pywin32api  (我是用py26), 不然python無法找到這兩個module 唉呀越寫越上層的話,若上面的AP沒有提供解法,底層實做原理又不懂的話,是很惱人的...

[python] xmlbuilder

最近在測試官方版的 xmlbuilder 寫法有兩種 1. with x = XMLBuilder with x.tag_name('value', attr1_name=attr1_value, ....):    with x.tag_name('value', attr1_name=attr1_value, ....):      ... 這樣分層下去 2. << x << (tag_name, value, {attr1_name:attr1_value, ...})      記錄一下

[python] Crypto

下午試了一下Crypto的東西,來寫一下筆記 參考 1 From Crypto.Cipher import DES shared_key = '12345678'    # 這個一定要是8的倍數 obj = DES.new(shared_key, MODE_ECB ) plain_text = 'hello, welcome to the world'   # plain_text 應為8的倍數 #encrypt padding = '$' extra = len(plain_text) % 8 if extra:    plain_text += padding * (8-extra) ciph_text = obj.encrypt(plain_text) #decript origin_text = obj.decrypt(ciph_text) print origin_text.strip('$') 註1:可以在sharedkey上動手腳,改為 binary string 註2:strip() 是去掉所有的 padding, 所以先確保該padding不在plain_text中

[python] File I/O, internet framework(MT, Select, epoll, IOCP)

這兩天又再翻新架構了 = =  大概學長真覺得我是操人(耐操的人).... 不過這次教訓又再次提醒自己,對於不熟或一知半解的東西,千萬別拿來用。。。 (但一開始什麼都不知道的人,誰知道那能不能用.... 桿) .................................................<<小抱怨一下,開始說正題好>> 第一個要提的是python 的FILE I/O 我每次都沒仔細搞清楚'ab', 'rb+', 'w+'... 之間的差異,想說排列組合部都那幾個... 結果誤用 = = 詳細說明可以參考  這裡   ,   至少在網路上這篇最詳細... 幾個最常用到的mode rb 這是default值。file pointer會在 offset=0 的位置。開啟一個 已存在 的檔案並做binary read-only。 rb+ 開啟一個 已存在 的檔案並對其做 binary read/write。 offset=0 wb+ 開啟一個的檔案並對其做 binary read/write。 若存在則會被 overwrite 。 若不存在則會 建立一個新的檔案 。 ab+ 開啟一個檔案並對其做 binary append/read。 若檔案存在,File pointer offset= end of the file 。 若檔案不存在,則會建立一個新的檔案,並提供Read/Write。 另外一個issue也是最近才真正懂得,就是一般network I/O分類 可依  blocking/nonblocking 與  synchronized/asynchronized 分類 幾個常見的是 1. blocking       最常使用,像 Multithreading 最常見 2. nonblocking synchronized       即select、epoll 即一般人說的reactor。 select: 是指每次os會去檢查一個 fd_set(file des...

[python] 最近工作感想

最近寫py遇到一個很大的瓶頸,就是py25無法釋放memory而導致MemoryError,這整個讓我信心大失... 好在瑋任大大的幫忙與建議,又重拾信心。 主要是因為 py 雖有 gc,但是 網路上 說 py 再做 gc 時並不會釋放記憶體給 OS,即使是使用 del() 或手動 gc.collect() 都無解,導致最後 memory 被我程式吃光光。 (那篇文章說py25已解決這個問題,但是我測過後是沒有!!? 可惡...) 最後是改用py26才暫時解決問題(日後應該將memHandler列入工作項目之一),然後也使用兩個幫助很多的工具, processexplorer 跟  guppy  ,分別觀察process的行為與python內部memory使用情形。 一開始我是在網路上找尋如何觀察python記憶體使用的工具,學長推薦蠻不錯的有 PythonMemoryValidator (功能十足,但是要$) 跟 dowser  (cherrpy開發的程式,需要安裝cherrypy)。 另外也有人提到使用 ctype 去call win32的Object,我試了可是跑出來的東西跟processexplorer顯示的資訊不相符.... 而且似乎僅做一次MemoryStatus,幫助不大... 回顧一下整個事件的發生,真的是因為 1. python 的gc 我不熟它的實作方式,自以為他會自動調整memory 2. twisted我也沒真正看過他的底層,不知道就竟他耗掉多少memory 因為秉持的python絕對不會有錯 + twisted那麼多人用怎沒人討論過這個問題 =>結論,我程式碼有錯,害我花了三天在努力看codes跟找解法....(若沒有大家的幫忙大概我要看上一個月了 /囧\rz) anyway,經過這次慘痛教訓後,下次真的要記得使用其他語言或framework時,最好還是事先了解它的精神及trace它一些重要的實做方式再來決定是否使用...(重寫真不是開玩笑的...) 既然 python 是用 circular reference counting 去決定reuse 或delete objects,應該有讓 user 使用的tmp方式吧,不然若只是單純要寫一個很大但只讀一次的檔案,等到下次gc執行之前都不准使用不...

[python] tuple to list, unicode的處理

1)在使用 *args時需要加入其他參數, 發現他是tuple type, 可是tuple無任何method, 所以需要將其轉為list, 再轉回 tuple a = ('abc', 334, 21.21) b = list(a) b.append('glob') a2=tuple(b) 2) python 的 default encoding 是 unicode (記得是2.4以後統一的規格) 這裡 有詳細的介紹. unicode 可以算是其他編碼互換的中間碼, 其格式是 上面說得很清楚, 有分成4 digits 或 8digits的unicode, 缺項補 0 The \u escape sequence is used to denote Unicode codes. This is somewhat like the traditional C-style \xNN to insert binary values. However, a glance at the Unicode table shows values with up to 6 digits. These cannot be represented conveniently by \xNN, so \u was invented. For Unicode values up to (and including) 4 digits, use the 4-digit version: \uNNNN Note that you must include all 4 digits, using leading 0's as needed. For Unicode values longer than 4 digits, use the 8-digit version: \UNNNNNNNN Note that you must include all 8 digits, using leading 0's as needed. 一般其他 encoding-format 轉 unicode的方式 afterencoded_str = unicode(preencoded_str, format) 若要知道欲轉換的字串是哪種編碼可以使用 univer...

[python] murmur

這篇應該算是抱怨文吧。 開始使用 twisted 寫 network programming 應該有兩個月了,網路論壇裡大家都認為他很強大一定要學一下,但沒想到為了它我這幾個月熬了好幾次夜,常常被裡頭的東西搞得莫名其妙。 首先從參考文件講起... 他的API 說明文件有夠鳥,寫的不知所云(應該是說,twisted作者有他自己的命名,beginner又無法從名稱了解他到底要沖煞小....  這也跟它是even-driven有關係吧)  常翻箱到櫃才能找到你要的東西... 既然網路文件無效,那就買本書來看吧!?  O'Reilly 是有出一本twisted的書,但那本不提也罷,沒什麼內容,不過還是最好手邊要有一本(因為它可是唯一一本twisted的書 /囧\) 還有就是那個mailing lists 討論群的東西倒是值得去看看。 結論是什麼? 結論就是,想要學好twisted嗎?  很抱歉沒有捷徑(還是有啦,找個懂的人來教你...或是幫你寫XD) 快把API & O'Reilly 的書啃就對了。 有人說看BT source codes對學twisted有用啦,可是... 前提是你本來就懂twisted(這不是廢話嗎= =+) 最後的一句話:對於twisted,懂得人不看書也懂,不懂的人看完書也還是不懂....  mud

[python] 不錯的玩意, pickle與 shelve

最近在python裡頭做 xml 與 dictionary 的格式轉換,又需要讀/寫入 database,真的搞的我暈頭轉向又不好維護。 今天看到一本好書 core python programming   提到關於 file i/o, 原來python 有些 persistent storage modules就是專門處理這些問題,像是pickle與marshal。 主要是介紹pickle, 因為marshal的差別在於marshal僅支援簡單的types(number, sequence, mapping...) 這邊說錯了,marshal主要是處理序列化的對象(serialized object), 特別是python的 pseudo-compiled code, 即 .pyc. 而一般支援 persistence module in python 主要是指pickle跟shelve 至於什麼叫做 object serialization, 就是將複雜的物件轉為binary type或 text 物件的過程,為的是希望能夠透明性的儲存 python object 而不失去其身分或類型等訊息。 Pickle 可將python data type轉為bytes streams(使用dumps()),亦可從重新組回原data types(使用loads()),例如 >>> import pickle >>> x = {'name':'glob', 'info':(27, 'single', 'student')} >>> xp = pickle.dumps(x) >>> y = pickle.loads(xp) >>> y {'info': (27, 'single', 'student'), 'name': 'glob'} *亦可以用 dump(x, f)   f為file descriptor 寫入file中。 shelve 則是使用anydbm(一種DBM)來進行pickles...