Search Google

Thursday, May 15, 2008

Boss on news

版權歸iThome所有

不是聽說要長住美國了嗎?
難道只是配合廣告做做效果?

NX server test drive


在8M/1M的連線環境中速度還不錯,比X-Forwarding快多了!
用NX方案開firefox之後開啟router設定port forwarding時畫面更新的速度大約一至二秒
用X-forwarding方案常常需要至少半分鐘更新畫面,有時候signal根本沒有傳到server等了幾分鐘還是同一個畫面。
因此我認為若是在區網環境使用的話效果應該在本機上使用差不多 ^^

感覺上NX是Windows遠端桌面與VNC的合體,因為可以在任何時候繼續之前關閉的連線,也可以像XDMCP一樣每次連線都建立新session,還可以將桌面分享給多個連線,同時分享client端的硬碟與印表機給server,這是一篇來自www.linux.com的介紹。

最後要提醒一下該更新ssh囉,詳情請洽本文開頭的那張圖。

Thursday, May 08, 2008

syntaxhighlighter [設置/使用] 說明

有鑑於最近常在blog中貼code,決定好好研究如何讓source code在blog中看起來更漂亮(當然是跟用iframe的效果相比較)。經過一番google之後覺得使用syntaxhighlighter算是本益比最高的作法。尋找的過程中也發現一篇名為新手達人的blog其中有寫得很好的設定與使用說明,可供我直接在此引用,替我節省不少打字的時間。比較詳細的使用方式,如使用option等,可以在官方的wiki上找到。至於效果則可以從我前幾篇文章中的code snippet中看到(滑鼠滾輪往下捲或直接按PageDown鍵),還蠻不錯的 :-)

測試syntaxhighlighter

語法:pre class="python" name="code"


if msg == HookConstants.WM_SYSKEYDOWN:
func = self.keyboard_funcs.get(HookConstants.WM_SYSKEYDOWN)
else:
func = self.keyboard_funcs.get(msg)

還可以縮起來
語法:pre class="python:collapse" name="code"

if msg == HookConstants.WM_SYSKEYDOWN:
func = self.keyboard_funcs.get(HookConstants.WM_SYSKEYDOWN)
else:
func = self.keyboard_funcs.get(msg)

也可以設定起始行數
語法:pre class="python:collapse:firstline[3]" name="code"

if msg == HookConstants.WM_SYSKEYDOWN:
func = self.keyboard_funcs.get(HookConstants.WM_SYSKEYDOWN)
else:
func = self.keyboard_funcs.get(msg)

為open source community盡棉薄之力 -- pyHook篇

最近嚐試著使用python寫一個keylogger,編寫的過程中使用到UNC放出來的pyHook模組,pyHook提供Windows用戶把一些低階的keyboard & mouse hook功能。當我在try的時候發現除了ALT以外的每個按鍵都可以被正常擷取,唯有ALT鍵每按兩次就會跳出一個runtime warning,訊息如下:

C:\work\code\code_python\svn\nws\keylogger>python keylogger.py
Lmenu
C:\Python25\lib\site-packages\pyHook\HookManager.py:353: RuntimeWarning: tp_comp
are didn't return -1 or -2 for exception
func = self.keyboard_funcs.get(msg)
Traceback (most recent call last):
File "C:\Python25\lib\site-packages\pyHook\HookManager.py", line 353, in Keybo
ardSwitch
func = self.keyboard_funcs.get(msg)
TypeError: an integer is required
Lmenu
Traceback (most recent call last):
File "C:\Python25\lib\site-packages\pyHook\HookManager.py", line 353, in Keybo
ardSwitch
func = self.keyboard_funcs.get(msg)
TypeError: an integer is required

當我trace進HookManager.py之後發現一件相當有趣的問題,那就是msg本身就已經是integer類別,不知道為何還會產生上面的警告訊息,於是我乾脆一不做二不休,將code由

func = self.keyboard_funcs.get(msg)

改為(ALT鍵屬於WM_SYSKEYDOWN)

if msg == HookConstants.WM_SYSKEYDOWN:
func = self.keyboard_funcs.get(HookConstants.WM_SYSKEYDOWN)
else:
func = self.keyboard_funcs.get(msg)

沒想到問題就這麼迎刃而解!
C:\work\code\code_python\svn\nws\keylogger>python keylogger.py
Lmenu
Lmenu
Rmenu
Lmenu
Lmenu
Lmenu
Lmenu
Lmenu
Lmenu
Lmenu
Lmenu
Lmenu

隨後已寫信給作者反應此問題,如此也算是替open source community盡了點心力。

pyHook & py2exe

使用py2exe build 利用pyHook攔截key stroke或mouse click的app時,setup.py中的bundle_files要設成"3"之後所產生出來的exe執行檔才會具有正常的攔截功能。
至於為什麼將bundle_files設定成2或1就不會work,我也不知道@@

Tuesday, May 06, 2008

xubuntu桌面美化備忘錄 -- nvidia driver & xserver-xgl

今天嘗試著將compiz fusion裝起來的時候發現在啟動compiz --replace時總是會跳出一行錯誤訊息:

Xgl: not present

原本也不以為意,因為compiz還是正常執行下去,唯一不正常的地方是每個windows的title bar都不見了,而原本的terminal現在也變成白色方塊。想想可能是那行錯誤訊息造成的,於是便裝了xserver-xgl套件,沒想到xserver-xgl一旦裝好之後每當我選擇"NVIDIA X Servier Settings"時就會得到我目前並沒有執行Nvidia driver的警告訊息,想當然我也沒辦法調整螢幕設定,而記憶體使用率也比之前高了一些,進top檢查之後發現光是Xgl就使用大約8%(約40MB)的記憶體來處理原本屬於顯示卡該處理的東西,雖然比網友聲稱的70MB少,但是多少也造成系統負擔,尤其是我現在只有不到512MB的記憶體。
將xserver-xgl移除之後nvidia driver的運作果然恢復正常,接下來便是好好處理title bar消失以及空白terminal的問題。

Thursday, May 01, 2008

Creating Windows service with Python and py2exe

最近在玩的py2exe不但能夠將.py檔轉成.exe執行檔還可以製作出Windows service。以下是參考Essien Ita Essien's Blog修改而來的.py檔,名為HelloService.py(檔名很重要!):


import win32serviceutil
import win32service
import time

class HelloService(win32serviceutil.ServiceFramework):
_svc_name_ = 'HelloService'
_svc_display_name_ = 'HelloService does nothing'

def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.isAlive = True
self.log = open('c:\\\\log.txt', 'w')

def SvcDoRun(self):
import servicemanager
log = self.log

while self.isAlive == 1:
servicemanager.LogInfoMsg("HelloService is alive and well")
log.write("HelloService is alive and well\n")
time.sleep(10)
servicemanager.LogInfoMsg("HelloService stopped")
log.write("HelloService stopped\n")
log.close()

def SvcStop(self):
import servicemanager
log = self.log

servicemanager.LogInfoMsg("HelloService received stop signal")
log.write("HelloService received stop signal\n")
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
self.isAlive = False

if __name__ == '__main__':
win32serviceutil.HandleCommandLine(HelloService)

HelloService.py中的每個member function name,以及_svc_name_ & _svc_display_name_都不能改(為win32serviceutil.ServiceFramework中的需要被override的function),這支service做的事情就是在Windows事件紀錄簿與C磁碟的log.txt中輸入文字訊息而已。
接下來要寫的是setup.py:

from distutils.core import setup
##import sys
import win32service
import win32serviceutil
import time
import py2exe

##sys.argv.append('py2exe')

setup(
version="1.00.00",
description="hello service",
name="hello service",
options={'py2exe': {'bundle_files': 2,
'optimize': 2,
'compressed': 1}},
service=["HelloService"],
zipfile=None
)

與之前介紹的setup.py不同之處為原本寫windows/console的地方改成service。此外原本寫entry point的檔案名之處改成寫module name(也就是檔名去掉附檔名-->HelloService),但是又有tutorial說service後面要寫的是_svc_name_的內容,為了保險起見我們幫檔名(去掉附檔名)與_svc_name_取相同的名字。接下來執行python setup.py py2exe便可在dist目錄中取得.exe格式的windows service執行檔了。

將service安裝為自動啟動:
HelloService.exe -auto -install
(也可以使用windows內建sc指令)

啟動service:
sc start HelloService

停止service:
sc stop HelloService

移除service:
HelloService.exe -remove
(也可以使用windows內建sc指令)

Tuesday, April 29, 2008

py2exe script example


以下是更完整的sample:


另外,我們可以使用UPX幫所有的binary減肥:

upx.exe --best *.*

最後再包成安裝檔。

使用py2exe與其他工具(如UPX, NSIS等)的幫忙我們可以使用Python輕鬆的製作GUI程式,而使用者也不需要安裝Python引擎便可以執行,有如用C/C++編寫native executable一般,只是體積仍舊稍嫌大了點(wxPython的lib體積實在太大了,UPX也無能為力),如果是一般的console app或許還可以瘦身到1MB以下(pytho25.dll經過UPX的壓縮後由2.XMB減少為859KB)。

Updated @ 2008/04/30
script中的windows表示產生出來的執行檔為gui程式,如果要產生文字模式的程式執行檔可以將windows改為console。

Monday, April 28, 2008

More about putting icon into caption

前幾天說明如何在wxWidgets寫gui並且把icon放入caption的位置。
今天再來介紹一下如何在wxPython將icon置入caption,但是實在太懶得打字,因此決定採用此篇blog的教學,他介紹了三個方式,我一直試到第三個方法才成功。
特此節錄一下第三個方法的內容:
import wx
app = wx.PySimpleApp()
frame = wx.Frame(None,-1,"Set Icon",size=(300,100))
ib = wx.IconBundle()
ib.AddIconFromFile("app.ico",wx.BITMAP_TYPE_ANY)
frame.SetIcons(ib)
frame.Show()
app.MainLoop()