發表文章

目前顯示的是有「Python」標籤的文章

PhantomJS 擷圖 亂碼修正

使用PhantomJS拮取網站擷時,有時會因為網站Server的Content-Type沒有指定 charset 造成亂碼。Github 上有一個 issue  也是同樣的問題還沒解決。後來想到可以用 chardet 配上HTTP Proxy 來改寫Content-Type header。以上是一個簡單的script來解決這樣的問題:

ActiveRecord like API for Python

之前看到 ActiveRecord 有一個很方便的功能: find_by_COLUMN,而 COLUMN 是那個 Table 裡的 columns。這用 Ruby 的 define_method 很好實做,當然 Python 也可以做到。下面是一段 POC (Prove of Concept) code:

Monkey Patching: Python V.S. Ruby

之前在寫Rails的時候還不是很熟悉Ruby,所以很多Ruby的特性沒有去深究。最近剛考完期末考比較有時間了,所以好好來看了一下Ruby。目前覺得學Ruby的好處就是會讓我想去比較Python,因為我個人還是Python的愛好著,所以看Ruby可以做到的功能就想要看Python可不可以做到。拿Ruby最有名的名能之一來說好了: Monkey Patching,從Wikipedia: A  monkey patch  is a way to extend or modify the  run-time   code  of dynamic languages without altering the original  source code . Ruby 可以很容易的動在舊有的Class/Module中加入新的Class/Method,舉例來說我們可以新增一個  method 到 Array 中: def Array.test puts "This is a singleton method `test' of the Array class" end

SQL Job Queue的寫法

最近網站要Deploy到MySQL上才發現之前寫得很多都有問題或是效率不好。 之前對於Job Queue的寫法是這樣寫: def pop(): stamp = time() db.query(Table).update({'stamp': stamp}) return db.query(Table).filter_by(stamp=stamp).all() 後來發現原來MySQL有SELECT .. FOR UPDATE的用法(是不是該修一修Database了XD) 加上了FOR UPDATE後,目前被選到的row就會被Lock起來。而其他的Process如果選到了 同樣的row,就必需等到commit後才能繼續。 所以就可以寫成: def pop(): records = db.query(Table).with_lockmode('update').filter(Table.status == 'NEW').all() db.query(Table).filter(Table.id.in_([x.id for x in records])).update('status': 'QUEUED') db.commit() return records 由於我們把status設成了'QUEUED',而在select時選擇Status為'NEW'的row,所以並不會造成conflict或是lock wait。 這樣的寫法好多了,而且在MySQL裡也比較不會出問題。

PttXP 更新至0.1.5

Version 0.1.5 * 終於修好了刪除標頭的功能 * 登入重試次數增加為5次 * 修正GUI Lag的問題 * 這次大大的修正了登入問題,幾乎不會再登入失敗了 詳細資訊請至: http://berelent.blogspot.com/p/pttxp-ptt.html

PttXP 更新至0.1.2

* 修正了容易登入失敗的問題 * 修正了Windows下換行的錯誤 * 新增功能: 'delete post header' 刪除PTT文章的標頭(網宣常用) 詳細資訊請至: http://berelent.blogspot.com/p/pttxp-ptt.html

Web Crawler

今天無聊就想說來改一下manpages-cpp的crawler 因為原本那個實在是太慢了... 爬過全部的頁面太概要2個多小時@@ 原來的設計,cppman -r (rebuild index)這個選項本來就不是為user end設計的 而manpages-cpp裡本身就包含了已經cache好的index database。 所以我在rebuild index的功能上設計得很陽春,基本上只是個簡單的DFS。 不過今天我重新檢視了時間會如此慢的原因,發現原來問題是出在urllib.urlopen() 開一個頁面太概要0.7秒,不過這不是網路速度的問題。原因是在urllib預設的text buffer大小是0 所以每讀入資料就要重新分配記憶體,所以才會花到0.7秒。 我的解法是用multi-thread。不過有個很的問題是linux的thread limit 在我的電腦上最高只能開到323個thread,可是利用DFS隨便跑下去都幾百個thread 所以只好設了thread_max,如果要超過了就先join 這樣大概可以將時間縮短到13分鐘。2小時多到13分鐘這算是非常大的進步了。

py2exe Icon in Vista/7

因為Vista/7支援高解析度256x256的icon,所以要讓生成的exe可以同時在XP/Vista/7上顯示正確,就要同時包進256x256, 64x64的Icon。如下面紅色的那行。順序很重要256x256一定要在1, 64x64一定要在0,我試過只有這樣才會顯示正確。 # setup.py from distutils.core import setup import py2exe setup(     name = "NAME",     description = "DESCRIPTION",     version = "VERSION",     windows = [         {             "script": "NAME.py",    # In order to show icon in Vista/7 the first icon resources must    # be (1, "256x256_ico")              "icon_resources": [(1, "256x256_ico"), (0, "64x64_ico")]         }     ],     data_files=[] )

manpages-cpp

C++ Manual pages for GNU/Linux 詳細請看 這裡

GetTube

!!!!! This page is outdated !!!! !!!!! Please visit here to get the latest update !!!!! !!!!! 此頁面己停止更新 !!!! !!!!! 請到 這裡 取得最新資訊 !!!!! GetTube是一個用來下載YouTube影片的Python Script, 有文字模式和GUI 可以下載FLV, 3GP, MP4, MP4-720p(視影片而定), MP4-1080p(視影片而定), MP3 (0.6.0新增)。