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格式,但未用于主程序中。
遷移工具源碼國內的也出現了許多對應的web 2.0的網站,但是我沒試用。還有一個選擇就是baidu的搜藏,除了網頁快照這個功能比較吸人外,其他并無亮點。最早看中google書簽是因為它的開放性,比如搜藏都沒有導出功能,而google就有導出,不怕用戶流失,這一點蠻贊的。但是就其本身來說,使用并不方便,后來我使用了一直比較反感的工具條后,又開始使用它的書簽,除了添加方便以外,整理和查找功能都比較薄弱。比如在線上,不能直接拖拽進行標簽的分類,要手工點擊編輯。google對這個服務不怎么看中,自推出以后,沒有什么新的功能增加,希望以后有類似網頁快照的存檔功能就好了。
現在使用firefox3瀏覽器后,找到了GMarks插件,它能直接存取google書簽,包含一個邊欄,工具欄,和一個書簽快速查找框,可進行批量修改,刪除書簽,刪除標簽等等功能。它也可以在沒有安裝google工具條的情況下使用,還有定制工具欄等,最妙的是有了google工具條中沒有的查找功能,不然在上千條書簽找到你需要的,那是有點兒困難的。現在我將自己的收藏全都保存到google書簽了,這樣以后重裝系統,再不用做備份了,而且在不同的機子上都可以用。
順便說下,如何將FF3的書簽導入到google書簽服務中,那就使用google工具條,里面書簽選項里有導入功能的,很簡單。
Windows Live Spaces MetaWeblog API提供了給外部程序進行文章內容設置和讀取的功能。API使用了XML—RPC協議來在客戶端應用程序與Weblog服務器端進行通訊。
為了使用MetaWeblog API編輯空間中的博文內容,首先需要在空間啟用E-mail發布功能,并設置密碼字。
在程序中會用到用戶名和密碼,如果你的空間地址為: 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的博客空間。這些部分加之完善,應能做個博客搬家工具的。
參考:
因為這些種種原因,我切換回了firefox 3。對于ff3,我也是剛剛用,但是越用越順手,特別是插件機制,可以把玩好長時間。正像別人說過的那樣,沒有插件的ff3,還不如IE呢。于是通過設置,將自己的Firefox打造成了chrome風格,先上全屏截圖,初始頁是快速撥號,因為隱私關系,把它們都復位了,效果跟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 Dial和Fast 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之類的工具,那么爬墻也不是件困難的事了。
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非常簡單實用,三分鐘就可以搞定。
類的概念在許多語言中出現,很容易理解。它將數據和操作進行封裝,以便將來的復用。
模塊,在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 *這語句使用的,全部導出定義過的模塊。
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目錄。在完成這些步驟后,就轉入代碼方面的更改了。
原先的代碼只需要做小改動:
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工作就完成了,下面是翻譯前后的界面截圖。
如果你將locale目錄下的test.mo文件刪除掉,然后將test.py中的wx.LANGUAGE_CHINESE_SIMPLIFIED改為wx.LANGUAGE_CHINESE,重新運行程序看看。發現界面變成了如下的繁體中文,但是菜單'檔案'下的Exit還是英文。
因為缺失.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,它提供了圖形化的編輯環境,其他功能我就不清楚了。
我在IE瀏覽器中設置了代理,而使用Maxthon瀏覽網頁。在寫Python時,用了urllib2庫,后來出現了下面的錯誤:
urllib2.URLError: <urlopen error (10061, 'Connection refused')>
先前這個程序是運行正確的,又直接用瀏覽器訪問需要的網址,正常。通過排查,發現IE瀏覽器中設置了代理,而代理無效,而urllib2庫使用其網絡配置,因此無法連接。通過取消代理,程序連接正常。
還有一例是,剛才用Windows Live Writer檢索日志,和發布日志時出錯,分別顯示如下的錯誤:
這也是因為WLW使用IE的網絡設置,造成的網絡錯誤而顯示的錯誤提示。
因此在設置了IE代理,并使用其他與網絡相關的程序,要特別注意其是否對IE代理設置有依賴。像Maxthon等就可選擇不使用IE代理配置的選項。
但在找到這篇文章之前,和編寫插件的過程中,還是費了很多功夫。最早我認為寫插件是需要下載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這個插件,原來有別人已完工了。
最后附上,我用這個新插件截的圖,非常好用,只需一步:
在cgywin官方主頁下載安裝文件setup.exe,這只是一個網絡安裝包,體積很小。cgywin包含了許多GNU下的應用程序,真正安裝時會根據你選擇的組件,會自動去網上下載安裝的。在國內最好使用鏡像服務,這樣速度會提高很多,建議去http://www.cygwin.net.cn/或http://www.cygwin.cn/下載上述的安裝包,并在安裝進行到Choose A Download Site這個步驟時,選擇合理的鏡像。由于中國南北網速的差異,上述兩個地址都嘗試一下,看看哪個對你而言速度更快一些。
在進行到Select Packages這個步驟時,選擇你需要包,建議如下:
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,而是針對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
這里會出現如下面圖示的窗口,提示輸入用戶名和密碼。另再附一張在登陸成功后,我在本地執行遠程操作的截圖。
如果你需要連接的遠程機器比較固定,可以修改本地機器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上顯示了,并且可操作。
Cgywin/X FAQ 在碰到一些操作問題時,不妨先看看這份FAQ
使用cygwin X server實現Linux遠程桌面 easwy介紹了KDE環境下的配置,部分受此啟發
使用rxvt做為cygwin終端 碰到rxvt中文顯示問題時,或許有幫助