伊人精品久久久久7777,午夜精品久久久久久,精品久久亚洲中文无码http://www.shnenglu.com/len/zh-cnWed, 07 May 2025 17:24:37 GMTWed, 07 May 2025 17:24:37 GMT60live space和cppblog到micolog的遷移工具http://www.shnenglu.com/len/archive/2010/11/08/133029.htmllenlenMon, 08 Nov 2010 12:55:00 GMThttp://www.shnenglu.com/len/archive/2010/11/08/133029.htmlhttp://www.shnenglu.com/len/comments/133029.htmlhttp://www.shnenglu.com/len/archive/2010/11/08/133029.html#Feedback0http://www.shnenglu.com/len/comments/commentRss/133029.htmlhttp://www.shnenglu.com/len/services/trackbacks/133029.html

Livespace要在明年關閉了,搭建了micolog在google app engine,方便以后自己掙騰。上次用生拙的C#寫個live space到livespace的博客遷移工具,使用metaweblog接口,見?Live Spaces新舊空間遷移方法 。上次使用getRecentPosts函數依次取得最近的一篇,然后存檔后發表后,刪除。這次通過正則表達式分析網頁內容,獲取到postid后,再使有getPost接口獲取文章,再進行發表,而且這次使用python寫成的。

metaweblog的內容不再敘述,其實這個協議寫得真不怎么樣,沒有檢索文章的接口,要讓人硬生生地從網頁中分析出postid來。因此解析postid是這個遷移工具的重要內容。

#獲取www.shnenglu.com樣式的postid列表
def getCppblogId(blog):
url='http://www.shnenglu.com/'+blog['user']+'/default.html?page=1&OnlyTitle=1'
urlfile = urllib.urlopen(url)
html = urlfile.read()
#獲取存檔頁碼數
pattern = re.compile(r'http://www.shnenglu.com/'+blog['user']+'/default.html\?page=(\d+)&OnlyTitle=1')
pages = [1]
pages += pattern.findall(html)

ids=[]
for p in pages:
url= 'http://www.shnenglu.com/'+blog['user']+'/default.html?page='+str(p)+'&OnlyTitle=1'
urlfile = urllib.urlopen(url)
html = urlfile.read()
pattern = re.compile(r'http://www.shnenglu.com/'+blog['user']+'/admin/EditPosts.aspx\?postid=(\d+)')
id = pattern.findall(html)
ids += id
return ids

利用存檔頁面得到總共頁數(或許頁數多了或有問題,未驗證),然后在每頁解析出postid,cppblog較簡單

def getLivespaceId(blog):
ids=[]
url=blog['user']+'.spaces.live.com/blog/'
i=0
while True:
url='http://'+url
urlfile = urllib.urlopen(url)
html = urlfile.read()
#print html
pattern = re.compile(r'entrycns!'+'([a-zA-Z0-9!]*)')
id = pattern.findall(html)
ids += id
pattern = re.compile(blog['user']+'.{1,50}pagedir=Next[^"]*')
urls = pattern.findall(html)
i=i+1
if len(urls) ==0:
break
url = unescape(urls[0])
return ids

live space沒有總共的頁數,只能一直next下去,發現沒有next按鈕了就停止,在每頁再解析出postid來,unescape是自定義函數,目的是將html編碼轉換為像!等符號。

在遷移post時出現未micolog中定義的目錄(category)會出錯,因此遷移工具里如果碰到未定義過的類別,會自動舍棄掉。因此在使用 時需要在micolog里定義原先blog的類別,以致不會出現目錄丟失的現象。此遷移工具在python2.5下完成,只要在源碼中修改中開頭的 srcBlog和dstBlog定義里的用戶名,密碼,webapi即可使用。源碼中還實現BlogXML類,用于存檔為xml格式,但未用于主程序中。

遷移工具源碼


len 2010-11-08 20:55 發表評論
]]>
網絡書簽:Google bookmarks和FF插件http://www.shnenglu.com/len/archive/2008/09/25/62778.htmllenlenThu, 25 Sep 2008 12:06:00 GMThttp://www.shnenglu.com/len/archive/2008/09/25/62778.htmlhttp://www.shnenglu.com/len/comments/62778.htmlhttp://www.shnenglu.com/len/archive/2008/09/25/62778.html#Feedback7http://www.shnenglu.com/len/comments/commentRss/62778.htmlhttp://www.shnenglu.com/len/services/trackbacks/62778.html網絡書簽自從del.icio.us推出后,各個網絡巨頭都推出了相應的服務,對于各個書簽服務,我針對了自己的情況進行了一番小調查后,確定下用google bookmarks服務。雖然del.icio.us美味書簽最早推出,并有些特別的工功能,有著很大的用戶群,但是我感覺它更偏向社交化的web服務,如將好的書簽共享等,有著好友的功能,而我更偏向于需要一種簡潔的書簽存儲功能。再有就是美味書簽改版,對于網絡安全功能過于注重,導致一種不好的用戶體驗,比如密碼要數字字母混合,并且不能與用戶名有太多重合等,還有密碼最多線上保存兩周。這些安全措施我都知道,但比一些公司密碼管理還嚴,這至于嗎?

國內的也出現了許多對應的web 2.0的網站,但是我沒試用。還有一個選擇就是baidu的搜藏,除了網頁快照這個功能比較吸人外,其他并無亮點。最早看中google書簽是因為它的開放性,比如搜藏都沒有導出功能,而google就有導出,不怕用戶流失,這一點蠻贊的。但是就其本身來說,使用并不方便,后來我使用了一直比較反感的工具條后,又開始使用它的書簽,除了添加方便以外,整理和查找功能都比較薄弱。比如在線上,不能直接拖拽進行標簽的分類,要手工點擊編輯。google對這個服務不怎么看中,自推出以后,沒有什么新的功能增加,希望以后有類似網頁快照的存檔功能就好了。

現在使用firefox3瀏覽器后,找到了GMarks插件,它能直接存取google書簽,包含一個邊欄,工具欄,和一個書簽快速查找框,可進行批量修改,刪除書簽,刪除標簽等等功能。它也可以在沒有安裝google工具條的情況下使用,還有定制工具欄等,最妙的是有了google工具條中沒有的查找功能,不然在上千條書簽找到你需要的,那是有點兒困難的。現在我將自己的收藏全都保存到google書簽了,這樣以后重裝系統,再不用做備份了,而且在不同的機子上都可以用。

順便說下,如何將FF3的書簽導入到google書簽服務中,那就使用google工具條,里面書簽選項里有導入功能的,很簡單。



len 2008-09-25 20:06 發表評論
]]>
Live Spaces新舊空間遷移方法http://www.shnenglu.com/len/archive/2008/09/24/62712.htmllenlenWed, 24 Sep 2008 13:50:00 GMThttp://www.shnenglu.com/len/archive/2008/09/24/62712.htmlhttp://www.shnenglu.com/len/comments/62712.htmlhttp://www.shnenglu.com/len/archive/2008/09/24/62712.html#Feedback2http://www.shnenglu.com/len/comments/commentRss/62712.htmlhttp://www.shnenglu.com/len/services/trackbacks/62712.html微軟啟用了新的live域名,有許多人將hotmail之類的帳號轉到新的域名,這就出現了如何將原帳號下的個人信息轉移到新帳號的問題。對于live messager的聯系人列表可采用其聯系人選項中的導入導出功能,而最麻煩當屬將live spaces的空間博客轉移到新的帳號名下。最直接方法就是聯系微軟管理員,將你舊帳號下的空間所有權轉移到新帳號名下,但是業務上是否可行不得而知。因此轉而另一方法,開新的空間,將舊空間的博客轉移到新空間來,本文就是采用這種思路,順帶提及下live api的簡單使用。

Windows Live Spaces MetaWeblog API提供了給外部程序進行文章內容設置和讀取的功能。API使用了XML—RPC協議來在客戶端應用程序與Weblog服務器端進行通訊。

為了使用MetaWeblog API編輯空間中的博文內容,首先需要在空間啟用E-mail發布功能,并設置密碼字。

  1. 到你的空間中的Options->E-mail Publishing選項進行配置
  2. 打開E-mail發布功能,并選擇 secred word的密碼字。

在程序中會用到用戶名和密碼,如果你的空間地址為: oldname.spaces.live.com,則用戶名就是oldname,而不是你的live id,密碼則是上面設置的secred word,而不是live id的密碼。

現在的MetaWeblogApi能進行發布新博文,編輯現有的博文,獲取指定博文,獲取類別列表,獲取最近發布的博文,刪除博文,獲取用戶博客信息,獲取用戶信息等功能。由這些功能,想遷移博客內容,首先需要獲取到舊空間里的博文。我們自然想到用MetaWeblogAPI metaWeblog.getRecentPosts Method函數,指定一個較大的值,然后獲取全部的博文。很可惜,對于live spaces值只能取20,也就是說只能獲取最近20篇博文。順便提下,這里的20篇包括你己發布的,和存在空間里的草稿,這些草稿有時候并不會在空間里顯示出來,但是操作時會有表示。如果用MetaWeblogAPI metaWeblog.getPost Method,需要知道指定博文的id號,沒有獲取到全部博文id的方法作輔助,這又是一個因難。

最后我采用了將metaWeblog.getRecentPosts方法的獲取值設為1,每次取最近的一篇博文,然后記錄id號,將這博文用MetaWeblogAPI metaWeblog.newPost Method發表到新空間,然后用MetaWeblogAPI blogger.deletePost Method將這id號的博文從舊空間中刪去,重復進行,直到無法從舊空間里獲取到博文。在程序實現借用了MSDN中的示例,為了防止網絡故障之類以及做了備份,先是將獲取博文內容寫到本地文件,再進行刪除。

程序中還要說明的是,由于live spaces服務器使用非標準的時間格式,造成用DateTime.Now和獲取到的博文的dateCreated都是"1/1/0001 12:00:00 AM"的格式,這需要在Invoke方法調用前加上this.NonStandard = XmlRpcNonStandard.AllowNonStandardDateTime語句。還有需要用到CookComputing.XmlRpcV2.dll,它實現了.net 2.0版本的XML-RPC協議,己包含在文末的源碼中。如果是.net 1.1,需要其他相應的文件,可具體參見http://www.xmlrpc.com/metaWeblogApi

最后要提下的是,程序只用于我自己的空間遷移,再加上不懂C#,用戶名和密碼之類都硬編碼了,MetaWeblog之類的方法也應能用于像cppblog之類用wordpress的博客空間。這些部分加之完善,應能做個博客搬家工具的。

參考:

文中的遷移工具源碼下載

MDSN Windows Live Spaces SDKs



len 2008-09-24 21:50 發表評論
]]>
披著Chrome外衣的Firefoxhttp://www.shnenglu.com/len/archive/2008/09/07/61239.htmllenlenSun, 07 Sep 2008 10:45:00 GMThttp://www.shnenglu.com/len/archive/2008/09/07/61239.htmlhttp://www.shnenglu.com/len/comments/61239.htmlhttp://www.shnenglu.com/len/archive/2008/09/07/61239.html#Feedback5http://www.shnenglu.com/len/comments/commentRss/61239.htmlhttp://www.shnenglu.com/len/services/trackbacks/61239.htmlGoogle的chrome瀏覽器一出來,我就被它的簡潔風格給吸引住了,試用了幾天,總體上還不錯。但是還有幾個問題,一是擴展太少,用些地方用起來不方便,像它自家的google工具欄都還沒有開始支持。二是有時候在切換tab的時候,感覺有明顯的停滯感,不知是否是多進程切換的原因,三是還有些網站不支持chrome。

因為這些種種原因,我切換回了firefox 3。對于ff3,我也是剛剛用,但是越用越順手,特別是插件機制,可以把玩好長時間。正像別人說過的那樣,沒有插件的ff3,還不如IE呢。于是通過設置,將自己的Firefox打造成了chrome風格,先上全屏截圖,初始頁是快速撥號,因為隱私關系,把它們都復位了,效果跟chrome差不多的。

firefox-chrome

下面介紹簡要操作步驟:

1、Chrome主題風格 Chromifox是仿Chrome的主題,現處于實驗版本階段,因此下載安載需要以網站注冊用戶的身份登陸。下載地址為:https://addons.mozilla.org/en-US/firefox/addon/8782

2、去除菜單欄 需要安裝Compact Menu 2的插件,它可以定制原來的菜單欄為單個按鈕或圖標。下載地址為:https://addons.mozilla.org/en-US/firefox/addon/4550

3、去除標題欄 這工作稍微有點兒麻煩,需要一個插件和一個腳本。Custom Buttons 2擴展提供創建,維護,導入,導出工具欄按鈕的基礎代碼,也就是你可以用javascript代碼寫些特定用途的按鈕。下載地址為:https://addons.mozilla.org/en-US/firefox/addon/5066。安裝完成后,再使用一個為隱藏標題欄而定制的腳本,地址為:http://custombuttons2.com/forum/viewtopic.php?f=35&t=523,點擊其中的Toggle Chrome鏈接和Toggle Chrome/Maximized,即可安裝。

4、隱藏狀態欄 無需任何插件,只需菜單欄的“查看”中的“狀態欄”不要勾選上即可。

5、快速撥號 Speed DialFast Dial這兩個插件均能提供,我現使用Speed Dial,地址為https://addons.mozilla.org/en-US/firefox/addon/4810,另Fast Dial的地址為https://addons.mozilla.org/en-US/firefox/addon/5721

其他諸如隱身模式、下載狀態欄、將網站轉換為獨立的應用程序都可實現,具體可參見:http://www.cnbeta.com/articles/64031.htm

我的擴展列表

附帶我在用的一些有用的插件功能,對于一般的用戶來講,這些功能也會大大節省你的時間,提高你上網瀏覽的體驗。這些可能是最基本的,高級的要隨你自己,你的地盤,你做主。

IE Tab 有些網站不支持非IE內核的怎么辦,先不要有抱怨,有了它讓你自由切換到IE的內核,但是外部功能不會減少,必備

FireGestures 鼠標手勢,我是從Maxthon轉過來的,這個功能太好用了。這個插件更強大,可以Tab,按鍵,滾輪上都可應用

Easy Dragtogo 類似于鼠標手勢,有些超鏈接只要一拖,就可按設置在新tab或在另一tab打開,不需要再用右鍵了。我對FireGestures還不熟,不知道這功能是否可用FireGestures代替,這功能現在還需要

Flashgot 文件下載管理,我用于管理flashget工具,內置支持許多下載工具

Adblock 沒有廣告的世界真清靜,雖然Firefox自身的攔截能力己經很強了,但是它提供更強大的定制能力,一切由你自己定

Noscript 提高瀏覽安全,可禁止一些惡意的腳本,可用效對付一些XSS跨站攻擊等

FoxyProxy 如果你需要時常在代理服務器上進行切換的話,這非常用幫助。如果結合像Tor之類的工具,那么爬墻也不是件困難的事了。



len 2008-09-07 18:45 發表評論
]]>
簡簡單單用py2exe打包python腳本http://www.shnenglu.com/len/archive/2008/08/11/58547.htmllenlenMon, 11 Aug 2008 11:19:00 GMThttp://www.shnenglu.com/len/archive/2008/08/11/58547.htmlhttp://www.shnenglu.com/len/comments/58547.htmlhttp://www.shnenglu.com/len/archive/2008/08/11/58547.html#Feedback0http://www.shnenglu.com/len/comments/commentRss/58547.htmlhttp://www.shnenglu.com/len/services/trackbacks/58547.htmlpy2exe是實用的python腳本工具,可以將python腳本程序轉換為exe執行文件。這樣你的python程序就可以沒有安裝python運行時環境的電腦里運行了。py2exe方便地提取出python運行時所需要的文件檔案,你需要做的就是寫一個兩三行的安裝腳本文件。

py2exe可以從http://sourceforge.net/projects/py2exe/下載,唯一需要注意的是下載與你python版本號對應的版本,簡單的英文教程http://www.py2exe.org/index.cgi/Tutorial非常容易入門。

對早先寫的一個代理驗證腳本進行exe文件封裝作為示例,這測試腳本名為HttpProxyTester.py。

首先,最好測試運行一下待封裝的腳本以確定沒有問題,然后在HttpProxyTester.py腳本的同級目錄新建一setup.py文件。

# setup.py

from distutils.core import setup
import py2exe

setup(console=['HttpProxyTester.py'])

上面的文件首先引入了distutils模塊,這模塊隨python安裝分發的,也就是說內置的。接著導入py3exe模塊,它其實對distutils做了一些功能擴展。接下來的語句說明是控制臺運行。對于windows的GUI模式運行,而不出控制臺窗口,則需要setup(windows=['xxx'])之類指令,這對于pyWidget程序將很有用。

在完成安裝腳本后,接下來就是在控制臺下運行這腳本。

>python setup.py py2exe

這時會打印出許多log信息,并在同級目錄下出現兩個新的文件夾:build和dist。build文件夾下是py2exe生成的一些臨時文件,dist就是需要分發的文件內容,可以這文件夾打包,然后在別的機子上運行了。

總之,py2exe非常簡單實用,三分鐘就可以搞定。



len 2008-08-11 19:19 發表評論
]]>
Python類、模塊、包http://www.shnenglu.com/len/archive/2008/07/24/57078.htmllenlenThu, 24 Jul 2008 11:42:00 GMThttp://www.shnenglu.com/len/archive/2008/07/24/57078.htmlhttp://www.shnenglu.com/len/comments/57078.htmlhttp://www.shnenglu.com/len/archive/2008/07/24/57078.html#Feedback5http://www.shnenglu.com/len/comments/commentRss/57078.htmlhttp://www.shnenglu.com/len/services/trackbacks/57078.htmlPython在處理功能復用和功能顆粒度劃分時采用了類、模塊、包的結構。這種處理跟C++中的類和名字空間類似,但更接近于Java所采用的概念。

類的概念在許多語言中出現,很容易理解。它將數據和操作進行封裝,以便將來的復用。

模塊

模塊,在Python可理解為對應于一個文件。在創建了一個腳本文件后,定義了某些函數和變量。你在其他需要這些功能的文件中,導入這模塊,就可重用這些函數和變量。一般用module_name.fun_name,和module_name.var_name進行使用。這樣的語義用法使模塊看起來很像類或者名字空間,可將module_name 理解為名字限定符。模塊名就是文件名去掉.py后綴。下面演示了一個簡單的例子:

#moduel1.py
def say(word):
    print word

#caller.py
import module1

print __name__
print module1.__name__
module1.say('hello')
$ python caller.py
__main__
module1
hello

例子中演示了從文件中調用模塊的方法。這里還展示了一個有趣的模塊屬性__name__,它的值由Python解釋器設定。如果腳本文件是作為主程序調用,其值就設為__main__,如果是作為模塊被其他文件導入,它的值就是其文件名。這個屬性非常有用,常可用來進行模塊內置測試使用,你會經常在一些地方看到類似于下面的寫法,這些語句只在作為主程序調用時才被執行。

if __name__ == '__main__':
    app = wxapp(0)
    app.MainLoop()

模塊搜索路徑

上面的例子中,當module1被導入后,python解釋器就在當前目錄下尋找module1.py的文件,然后再從環境變量PYTHONPATH尋找,如果這環境變量沒有設定,也不要緊,解釋器還會在安裝預先設定的的一些目錄尋找。這就是在導入下面這些標準模塊,一切美好事情能發生的原因。

import os
import sys
import threading
...

這些搜索目錄可在運行時動態改變,比如將module1.py不放在當前目錄,而放在一個冷僻的角落里。這里你就需要通過某種途徑,如sys.path,來告知Python了。sys.path返回的是模塊搜索列表,通過前后的輸出對比和代碼,應能理悟到如何增加新路徑的方法了吧。非常簡單,就是使用list的append()或insert()增加新的目錄。

#module2.py
import sys
import os

print sys.path
workpath = os.path.dirname(os.path.abspath(sys.argv[0]))
sys.path.insert(0, os.path.join(workpath, 'modules'))
print sys.path
$ python module2.py
['e:\\Project\\Python', 'C:\\WINDOWS\\system32\\python25.zip', ...]
['e:\\Project\\Python\\modules', 'e:\\Project\\Python', 'C:\\WINDOWS\\system32\\python25.zip', ...]

其他的要點

模塊能像包含函數定義一樣,可包含一些可執行語句。這些可執行語句通常用來進行模塊的初始化工作。這些語句只在模塊第一次被導入時被執行。這非常重要,有些人以為這些語句會多次導入多次執行,其實不然。

模塊在被導入執行時,python解釋器為加快程序的啟動速度,會在與模塊文件同一目錄下生成.pyc文件。我們知道python是解釋性的腳本語言,而.pyc是經過編譯后的字節碼,這一工作會自動完成,而無需程序員手動執行。

在創建許許多多模塊后,我們可能希望將某些功能相近的文件組織在同一文件夾下,這里就需要運用包的概念了。包對應于文件夾,使用包的方式跟模塊也類似,唯一需要注意的是,當文件夾當作包使用時,文件夾需要包含__init__.py文件,主要是為了避免將文件夾名當作普通的字符串。__init__.py的內容可以為空,一般用來進行包的某些初始化工作或者設置__all__值,__all__是在from package-name import *這語句使用的,全部導出定義過的模塊。



len 2008-07-24 19:42 發表評論
]]>
wxPython和XRC文件實現i18nhttp://www.shnenglu.com/len/archive/2008/07/15/56229.htmllenlenTue, 15 Jul 2008 12:21:00 GMThttp://www.shnenglu.com/len/archive/2008/07/15/56229.htmlhttp://www.shnenglu.com/len/comments/56229.htmlhttp://www.shnenglu.com/len/archive/2008/07/15/56229.html#Feedback0http://www.shnenglu.com/len/comments/commentRss/56229.htmlhttp://www.shnenglu.com/len/services/trackbacks/56229.html應用程序國際化,在開源世界里常以i18n被提及,i18n是Internationalization的簡寫,正好18個字母。在wxPython程序進行i18n,如果字符串是編碼在源文件中時,完全可按照python程序的i18n的方法,即使用gexttext和locale模塊。而wxPython程序在使用XRC文件做為界面資源時,則應使用wx.Locale模塊,它封裝了區域化相關的操作。i18n,或者國際化實際上涉及到語言習慣,數字格式等等類別的內容。這里只介紹語言多國化,將一個簡單的英文程序轉換為中文,涉及到源文件,可從這里下載。

創建PO文件

PO文件是Portable Object文件的簡稱,它包含需要翻譯的字符串。我們需要從源文件進行提取。首先,對源文件test.py編輯,標識代碼里需要翻譯的字符串內容。我們使用_("xx")的方法,這種形式可能在許多開源源代碼中見識過。

#加載菜單欄
menubar = rc.LoadMenuBar('IDR_MENU')

這里的IDR_MENU是資源標識ID,不需要翻譯,因此不做改變,而下面的代碼:

info.SetVersion('1.0')
info.SetDescription('XRC i18n Demo')

'XRC i18n Demo'是描述性的文本,需要進行翻譯,將需要處理為

info.SetVersion('1.0')
info.SetDescription(_('XRC i18n Demo'))

接著需要生成.pot(Portable Object Template),這是po的模板文件。在將來程序可能配置成其他語種,其他語言的po文件都從它而來。為了創建這文件,需要用到GNU gettext工具集中的xgettext。向xgettext傳入些必要的信息,來創建.pot文件。

>xgetttext --output=test.pot test.py

我們將wxPython界面以XRC文件保存了,那里同樣有要翻譯的字符串需要提取。用XRCed工具將XRC生成python代碼,勾選上'Generate gettext strings'項即可。將源文件和XRC生成的test_xrc.py文件一起處理,生成一個test.pot。

>xgettext --output=test.pot test.py test_xrc.py

將得到的test.pot另存為test.po文件,然后進行翻譯編輯,在這過程中文件需要使用utf-8編碼。將對應的英文翻譯成中文,將charset更改為utf-8。

"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: test.py:19
msgid "XRC i18n Demo"
msgstr "XRC 國際化示例"
...

.pot和.po這些文件都是文本文件,主要供翻譯者使用。為了使程序在運行時能獲取相關的翻譯的內容,要進行所謂的編譯過程,將文本文件轉換為二進制文件.mo。這里用了gettext工具集中的另一程序msgfmt。

> msgfmt --output=test.mo test.po

因為windows下沒有像linux像有公共存儲.mo文件的目錄,保持平臺的遷移性,在應用程序本地目錄下新建locale目錄,用來存放編譯過的.mo文件,然后將test.mo移動至locale目錄。在完成這些步驟后,就轉入代碼方面的更改了。

wxPython代碼更改

原先的代碼只需要做小改動:

def OnInit(self):
    wx.Locale.AddCatalogLookupPathPrefix('locale')
    self.locale = wx.Locale(wx.LANGUAGE_CHINESE_SIMPLIFIED)
    self.locale.AddCatalog('test')
    import __builtin__
    __builtin__.__dict__['_'] = wx.GetTranslation

首先,增加了新的目錄文件路徑,這將使wxPython搜索這個目錄,尋找匹配的.mo文件。接著創建wx.Locale對象,將其初始化為簡體中文,這將對應于zh_CN。最后將wx.GetTranslation做了一全局映射,這樣你在其他類中,比如示例中TestFrame也能使用_('xx')調用。這樣wxPython的i18n工作就完成了,下面是翻譯前后的界面截圖。

wxpython

一些有益的討論

.mo文件的查找目錄

如果你將locale目錄下的test.mo文件刪除掉,然后將test.py中的wx.LANGUAGE_CHINESE_SIMPLIFIED改為wx.LANGUAGE_CHINESE,重新運行程序看看。發現界面變成了如下的繁體中文,但是菜單'檔案'下的Exit還是英文。

wxzh

因為缺失.mo文件,但又指定wx.LANGUAGE_CHINESE,wxPython運行時使用了wxstd.mo文件。wxstd.mo有許多預編譯好的常見字符串的對應關系,它隨wxPython發布,在wx/locale下有許多語言版本的wxstd.mo。

對于wxPython會對待查目錄"DIR"來搜索.mo文件,查找它下面的這些目錄,(DIR/LANG/LC_MESSAGES;DIR/LANG;DIR),對于哪些是待查目錄,各個系統下又有不同,在所有的平臺上,LC_PATH環境變量指定的目錄將成為待查目錄,在Linux下/share/locale, /usr/share/locale, /usr/lib/locale, /usr/locale /share/locale以及當前目錄將是待查目錄。在上面我們已經用過AddCatalogLookupPathPrefix()函數,其作用就是增加自己的待查目錄。

在示例程序中,將test.mo放在locale\zh_CN\LC_MESSAGES或者locale\zh\LC_MESSAGES同樣是可行的。但是如果使用wx.LANGUAGE_CHINESE指定,則zh_CN目錄將不可行,因為它只是特化目錄,指簡體中文,而zh目錄同樣適用。

工具鏈再討論

gettext進行國際化是開源社區的主流方案,它也提供了許多實用工具供使用。上面提到了xgettext,msgfmt,還有msginit.exe,它將根據.pot文件創建新的.po文件,然后初始化一些元信息,像作者信息,項目,以及編碼等,當然也可像上面的手工編輯。msgmerge.exe將兩個.po文件進行合并。除了使用GNU Gettext工具集,也可使用隨python發布的tool\i18n目錄下pygettext.py和msgfmt.py,它們等同于上述的兩個工具。

對于編輯.po文件,可以嘗試一下Poedit,它提供了圖形化的編輯環境,其他功能我就不清楚了。



len 2008-07-15 20:21 發表評論
]]>
IE代理依賴http://www.shnenglu.com/len/archive/2008/07/08/55621.htmllenlenTue, 08 Jul 2008 05:27:00 GMThttp://www.shnenglu.com/len/archive/2008/07/08/55621.htmlhttp://www.shnenglu.com/len/comments/55621.htmlhttp://www.shnenglu.com/len/archive/2008/07/08/55621.html#Feedback0http://www.shnenglu.com/len/comments/commentRss/55621.htmlhttp://www.shnenglu.com/len/services/trackbacks/55621.html在Windows下,許多網絡程序的連接依賴于IE瀏覽器中的代理服務器的設置,IE瀏覽器的代理設置很可能設定了注冊表中的全局網絡連接配置。

我在IE瀏覽器中設置了代理,而使用Maxthon瀏覽網頁。在寫Python時,用了urllib2庫,后來出現了下面的錯誤:

urllib2.URLError: <urlopen error (10061, 'Connection refused')>

先前這個程序是運行正確的,又直接用瀏覽器訪問需要的網址,正常。通過排查,發現IE瀏覽器中設置了代理,而代理無效,而urllib2庫使用其網絡配置,因此無法連接。通過取消代理,程序連接正常。

還有一例是,剛才用Windows Live Writer檢索日志,和發布日志時出錯,分別顯示如下的錯誤:

error ?err

這也是因為WLW使用IE的網絡設置,造成的網絡錯誤而顯示的錯誤提示。

因此在設置了IE代理,并使用其他與網絡相關的程序,要特別注意其是否對IE代理設置有依賴。像Maxthon等就可選擇不使用IE代理配置的選項。



len 2008-07-08 13:27 發表評論
]]>
開發Windows Live Writer插件小記http://www.shnenglu.com/len/archive/2008/07/05/55423.htmllenlenSat, 05 Jul 2008 13:43:00 GMThttp://www.shnenglu.com/len/archive/2008/07/05/55423.htmlhttp://www.shnenglu.com/len/comments/55423.htmlhttp://www.shnenglu.com/len/archive/2008/07/05/55423.html#Feedback0http://www.shnenglu.com/len/comments/commentRss/55423.htmlhttp://www.shnenglu.com/len/services/trackbacks/55423.htmlWindows Live Writer是寫博客的利器,非常好用。只是對一些常見的html標簽支持不足,比如沒有預排文本標簽<pre>之類的。在插入示例代碼時,我不喜歡使用網上的那些高亮插件,它們增加了一些我感覺不友好的標簽元素。我在寫文章時,代碼放在<pre>標簽,然后使用自定義的code類,如果是一些屏幕輸入輸入文本,會用一個console類來進行說明。如果直接從源代碼拷貝文本至html源文件時,xml文件的的<>"之類標簽需要進行轉義才可以。在這之前,我都需要手工將WLW切換到HTML模式進行創作,然后修改這些標簽,非常麻煩。這樣干了幾次后,昨天決定自己寫個WLW插件用。在搜索引擎的幫助下,找到Dflying Chen的 為Windows Live Writer開發插件——InsertSearchPageLink這篇文章,并在其參照完成了插件編寫。

但在找到這篇文章之前,和編寫插件的過程中,還是費了很多功夫。最早我認為寫插件是需要下載SDK之類的軟件,所以在Live Writer官方開發網站,Live Writer網,MSDN之類的找了個遍,看見是有SDK之類字樣的下載,但弄不下來只有文檔,根本不見其什么頭文件,DLL之類的。在這花費了很多時間,最后才發現WLW插件的SDK是隨WLW一起分發了,也就是WindowsLive.Writer.Api.dll之類的,這些dll 都隨WLW主程序在一個目錄中。還有一點是,現在WLW在中國是隨Live套件一起發布的,因此路徑由原來的C:\Program Files\Windows Live Writer變成了C:\Program Files\Windows Live\Writer,插件目錄為Plugin。如果在網上發現有好用的插件,只需要將其發布的插件dll扔到這個目錄就行了。

在開發中碰到圖標資源不能成功加載,在Dflying Chen的文章中特意提到了圖標資源需要是嵌入形式,我也按照其操作的,總以為是這里出現問題。后來花了一些時間,才找到總是的根源:自己在開發中更改了工程名,導致最后生成的程序集的名稱與后來的命名空間名稱不一致,圖標路徑就出錯了。C#也只是這次用一下,這些都沒有接觸到。

昨天弄完自己的“插入Pre標記”插件后,想到自己寫博客常需要截圖,遂想再開發一個截圖工具的。最早搜到了別人調用SnagIt搜件,不好用,因為SnagIt是商業軟件,需要注冊的。后來找到了picpick,小巧免費,非常實用。我想調用picpick的,但是在參照Insert SnagIt Screen Capture發現是用COM接口,而無奈picpick沒有這樣供開發使用的接口考慮,最終不可行。后來經過一些其他的嘗試,都告失敗。最后還是搜索幫了忙,找到了Screen Capture這個插件,原來有別人已完工了。

最后附上,我用這個新插件截的圖,非常好用,只需一步:

tmp196



len 2008-07-05 21:43 發表評論
]]>
Cygwin,以及遠程登陸Linux桌面http://www.shnenglu.com/len/archive/2008/07/03/55234.htmllenlenThu, 03 Jul 2008 13:55:00 GMThttp://www.shnenglu.com/len/archive/2008/07/03/55234.htmlhttp://www.shnenglu.com/len/comments/55234.htmlhttp://www.shnenglu.com/len/archive/2008/07/03/55234.html#Feedback0http://www.shnenglu.com/len/comments/commentRss/55234.htmlhttp://www.shnenglu.com/len/services/trackbacks/55234.html安裝Cygwin

cgywin官方主頁下載安裝文件setup.exe,這只是一個網絡安裝包,體積很小。cgywin包含了許多GNU下的應用程序,真正安裝時會根據你選擇的組件,會自動去網上下載安裝的。在國內最好使用鏡像服務,這樣速度會提高很多,建議去http://www.cygwin.net.cn/http://www.cygwin.cn/下載上述的安裝包,并在安裝進行到Choose A Download Site這個步驟時,選擇合理的鏡像。由于中國南北網速的差異,上述兩個地址都嘗試一下,看看哪個對你而言速度更快一些。

在進行到Select Packages這個步驟時,選擇你需要包,建議如下:

  • Shells -> rxvt-unicode-x? 強大的X終端,可用它替換windows下的cmd.exe
  • Net-> openssh? ssh客戶端,可作putty的替換
  • Net-> inetutils? 可選,包含一些基本的網絡工具,如telnet,否則在cygwin下無法使用windows的telnet

cygwin安裝時會自動進行包關聯,在安裝rxvt時,已自動將X server安裝上了。

配置調整

啟動cygwin,實際上是運行cgywin.bat批處理,它又調用了cmd.exe。我們將安裝的rxvt作為默認終端,需要修改cygwin.bat。下面是我機子上的配置修改,請對應修改相應的路徑。

@echo off
d:
chdir d:\Cygwin\bin
rxvt -e bash --login -i

調整rxvt觀感,需要修改你用戶主目錄下的.Xdefaults文件,此文件在你選擇的安裝目錄下的home\usrname下,在我的機子上是D:\Cgywin\home\len。若不存在,可在此目錄下新建一個,修改內容如下:

Rxvt*background:        black
Rxvt*foreground:        #E2E6C7 
Rxvt*font:              9x16 
Rxvt*boldFont:          9x16 
Rxvt*scrollBar_right:   True
Rxvt*saveLines:         1024
Rxvt*geometry:          80x30
Rxvt*color0:            black
Rxvt*color1:            red
Rxvt*color2:            green   
Rxvt*color3:            yellow
Rxvt*color4:            blue
Rxvt*color5:            magenta
Rxvt*color6:            cyan    
Rxvt*color7:            white   
Rxvt*color8:            burlywood1
Rxvt*color9:            sienna1 
Rxvt*color10:           PaleVioletRed1  
Rxvt*color11:           LightSkyBlue    
Rxvt*color12:           white   
Rxvt*color13:           white
Rxvt*color14:           white   
Rxvt*color15:           white 

在cygwin下也是可以訪問Windows下其他盤符的,如cd /cygdrive/c/windows,就轉到了C盤windows目錄下。這樣對于在linux下工作的人說有點兒別扭,更希望是以cd /mnt/c/windows的mount方式來訪問其他盤符。這需要修改注冊表的選項,將HKLM\software\Cygnus Solutions\Cgywin\mounts v2下的子項cygdrive prefix更改為/mnt即可。

遠程登陸Linux桌面

其實這里介紹的不僅僅適用于Linux,而是針對X Window的。X Widonw的介紹不進行贅述,但需要明確其中的服務器端和客戶端的區別,在X Window的概念中服務器端是指你進行顯示,輸入輸出的機器,也是接下來示例中的本機len-computer,IP為10.3.164.70,而客戶端指的是進行遠程登陸的機器auto-desktop,IP為10.3.164.74。

在局域網內最簡單的方法是使用XDMCP連接,這時遠程的機器啟用xdmcp。那臺機器運行著ubuntu-8.04,用gdm進行窗口管理,編輯/etc/gdm/gdm.conf-custom如下,其他版本的linux需找到對應的窗口管理的配置文件。

[security]
DisallowTCP=false

[xdmcp]
Enale=true

修改完后,在遠程機器上重啟服務,$sudo /etc/init.d/gdm restart。接下來本機啟動cgywin,轉到X目錄下,運行Xwin.exe,使用 -query指定遠程的linux機器的ip即可。

Len@len-computer /usr/X11R6/bin
$ cd /usr/X11R6/bin

Len@len-computer /usr/X11R6/bin
$ Xwin -query 10.3.164.74

這里會出現如下面圖示的窗口,提示輸入用戶名和密碼。另再附一張在登陸成功后,我在本地執行遠程操作的截圖。

login

cygwinX

如果你需要連接的遠程機器比較固定,可以修改本地機器d:\cgygin\usrX11R6\bin\startxdmcp.bat中的REMOTE_HOST值為你需要連接機器的IP,這個批處理設置了一些有用的環境變量值。或許你需要創建一個桌面的快鍵方式,這樣每次點擊,就直接連接到遠程機器了。

不引入桌面環境

可能有時候只需要將某個需要X服務的遠程應用程序引入到本地桌面顯示,而不需要啟動像上面的GNOME或者KDE等龐大的桌面環境。這樣做比較適合喜歡終端操作的人,我就常常終端敲命令,然后將gvim,openoffice這些從遠程導入到本地操作。

找到d:\cgywin\usr\X11R6\bin\startwin.bat,將%RUN% xterm -e /usr/bin/bash -l注釋掉,因為我們己經有了rxvt,不需要一個新的xterm終端了,執行該批處理文件,就會在本機運行X server。啟動cgywin,用ssh登陸到遠程機器上,執行如下命令,導出DISPLAY環境變量和運行你感興趣的程序。

auto@Auto-desktop:~$ export DISPLAY=10.3.164.70:0.0
auto@Auto-desktop:~$ gvim&
[1] 22652
auto@Auto-desktop:~$ oowriter&

其中環境變量DISPLAY中的:0.0部分表示X server的display和screen。display指運行著X server實例。如果使用TCP/IP連接,表示的是端口6000+display號做為連接。screen代表X server上的不同輸出設備。我在例子中執行gvim和openoffice.org-writer,運行的效果可看下面的截圖。在ubuntu上運行著的gvim和openoffice都在我本機10.3.164.70上顯示了,并且可操作。

screen

有用的鏈接

Cgywin/X FAQ 在碰到一些操作問題時,不妨先看看這份FAQ

使用cygwin X server實現Linux遠程桌面 easwy介紹了KDE環境下的配置,部分受此啟發

使用rxvt做為cygwin終端 碰到rxvt中文顯示問題時,或許有幫助



len 2008-07-03 21:55 發表評論
]]>
色播久久人人爽人人爽人人片AV| 欧洲精品久久久av无码电影| 久久国产精品波多野结衣AV| 精品人妻伦九区久久AAA片69 | 亚洲国产精品嫩草影院久久| 久久综合九色综合久99| 伊人久久大香线蕉亚洲| 久久线看观看精品香蕉国产| 日本欧美国产精品第一页久久| 无码日韩人妻精品久久蜜桃| 国产欧美久久久精品| 婷婷国产天堂久久综合五月| 久久综合狠狠综合久久综合88 | 久久精品国产亚洲av麻豆小说| 一本色道久久88加勒比—综合| 国产精品中文久久久久久久| 久久久久久九九99精品| 久久久精品视频免费观看| 午夜精品久久久久久毛片| 国产一区二区精品久久凹凸| 麻豆一区二区99久久久久| 久久久精品视频免费观看| 久久精品国产精品青草| 人妻精品久久无码专区精东影业| 久久综合色之久久综合| 99久久免费国产精品| 色偷偷偷久久伊人大杳蕉| 超级碰碰碰碰97久久久久| 久久久久女教师免费一区| 91精品久久久久久无码| 久久综合给久久狠狠97色| 久久WWW免费人成一看片| 色99久久久久高潮综合影院| 99久久成人18免费网站| 国内精品久久久久久野外| 久久精品国产99久久无毒不卡| 日本WV一本一道久久香蕉| 国产精品免费久久久久影院| 国产精品久久久久影院色| A狠狠久久蜜臀婷色中文网| 九九久久自然熟的香蕉图片|