﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-简单为美-随笔分类-IT技术</title><link>http://www.cppblog.com/len/category/7468.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 08 Nov 2010 13:30:21 GMT</lastBuildDate><pubDate>Mon, 08 Nov 2010 13:30:21 GMT</pubDate><ttl>60</ttl><item><title>live space和cppblog到micolog的迁移工具</title><link>http://www.cppblog.com/len/archive/2010/11/08/133029.html</link><dc:creator>len</dc:creator><author>len</author><pubDate>Mon, 08 Nov 2010 12:55:00 GMT</pubDate><guid>http://www.cppblog.com/len/archive/2010/11/08/133029.html</guid><wfw:comment>http://www.cppblog.com/len/comments/133029.html</wfw:comment><comments>http://www.cppblog.com/len/archive/2010/11/08/133029.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/len/comments/commentRss/133029.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/len/services/trackbacks/133029.html</trackback:ping><description><![CDATA[
		<div class="en_body">
				<div class="en_body">
						<p>Livespace要在明年关闭了，搭建了micolog在google app engine，方便以后自己挣腾。上次用生拙的C#写个live space到livespace的博客迁移工具，使用metaweblog接口，见 <a href="http://http//blog.lengoo.com/?p=147201&amp;code=aghsZW4taG9tZXINCxIFRW50cnkYgf4IDA">Live Spaces新旧空间迁移方法</a> 。上次使用getRecentPosts函数依次取得最近的一篇，然后存档后发表后，删除。这次通过正则表达式分析网页内容，获取到postid后，再使有getPost接口获取文章，再进行发表，而且这次使用python写成的。</p>
						<p>metaweblog的内容不再叙述，其实这个协议写得真不怎么样，没有检索文章的接口，要让人硬生生地从网页中分析出postid来。因此解析postid是这个迁移工具的重要内容。</p>
						<pre>#获取www.cppblog.com样式的postid列表<br />def getCppblogId(blog):<br />  url='http://www.cppblog.com/'+blog['user']+'/default.html?page=1&amp;OnlyTitle=1'<br />  urlfile = urllib.urlopen(url)<br />  html = urlfile.read()<br />  #获取存档页码数<br />  pattern = re.compile(r'http://www.cppblog.com/'+blog['user']+'/default.html\?page=(\d+)&amp;OnlyTitle=1')<br />  pages = [1]<br />  pages += pattern.findall(html)<br /><br />  ids=[]<br />  for p in pages:<br />    url= 'http://www.cppblog.com/'+blog['user']+'/default.html?page='+str(p)+'&amp;OnlyTitle=1'<br />    urlfile = urllib.urlopen(url)<br />    html = urlfile.read()<br />    pattern = re.compile(r'http://www.cppblog.com/'+blog['user']+'/admin/EditPosts.aspx\?postid=(\d+)')<br />    id = pattern.findall(html)<br />    ids += id<br />  return ids<br /></pre>
						<p>利用存档页面得到总共页数（或许页数多了或有问题，未验证），然后在每页解析出postid，cppblog较简单</p>
						<pre>def getLivespaceId(blog):<br />  ids=[]<br />  url=blog['user']+'.spaces.live.com/blog/'<br />  i=0<br />  while True:<br />    url='http://'+url<br />    urlfile = urllib.urlopen(url)<br />    html = urlfile.read()<br />    #print html<br />    pattern = re.compile(r'entrycns!'+'([a-zA-Z0-9!]*)')<br />    id = pattern.findall(html)<br />    ids += id<br />    pattern = re.compile(blog['user']+'.{1,50}pagedir=Next[^"]*')<br />    urls = pattern.findall(html)<br />    i=i+1<br />    if len(urls) ==0:<br />      break<br />    url = unescape(urls[0])<br />  return ids<br /></pre>
						<p>live space没有总共的页数，只能一直next下去，发现没有next按钮了就停止，在每页再解析出postid来,unescape是自定义函数，目的是将html编码转换为像！等符号。</p>
						<p>在迁移post时出现未micolog中定义的目录（category)会出错，因此迁移工具里如果碰到未定义过的类别，会自动舍弃掉。因此在使用
时需要在micolog里定义原先blog的类别，以致不会出现目录丢失的现象。此迁移工具在python2.5下完成，只要在源码中修改中开头的
srcBlog和dstBlog定义里的用户名，密码，webapi即可使用。源码中还实现BlogXML类，用于存档为xml格式，但未用于主程序中。</p>
						<a href="http://www.lengoo.com/media/aghsZW4taG9tZXINCxIFTWVkaWEY8ZcQDA/goblog.py?a=download">迁移工具源码</a>
				</div>
				<a href="http://www.lengoo.com/media/aghsZW4taG9tZXINCxIFTWVkaWEY8ZcQDA/goblog.py?a=download">
				</a>
		</div>
<img src ="http://www.cppblog.com/len/aggbug/133029.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/len/" target="_blank">len</a> 2010-11-08 20:55 <a href="http://www.cppblog.com/len/archive/2010/11/08/133029.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网络书签：Google bookmarks和FF插件</title><link>http://www.cppblog.com/len/archive/2008/09/25/62778.html</link><dc:creator>len</dc:creator><author>len</author><pubDate>Thu, 25 Sep 2008 12:06:00 GMT</pubDate><guid>http://www.cppblog.com/len/archive/2008/09/25/62778.html</guid><wfw:comment>http://www.cppblog.com/len/comments/62778.html</wfw:comment><comments>http://www.cppblog.com/len/archive/2008/09/25/62778.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/len/comments/commentRss/62778.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/len/services/trackbacks/62778.html</trackback:ping><description><![CDATA[<p>网络书签自从<a href="http://del.icio.us/">del.icio.us</a>推出后，各个网络巨头都推出了相应的服务，对于各个书签服务，我针对了自己的情况进行了一番小调查后，确定下用<a href="http://www.google.com/bookmarks/?hl=en">google bookmarks</a>服务。虽然del.icio.us美味书签最早推出，并有些特别的工功能，有着很大的用户群，但是我感觉它更偏向社交化的web服务，如将好的书签共享等，有着好友的功能，而我更偏向于需要一种简洁的书签存储功能。再有就是美味书签改版，对于网络安全功能过于注重，导致一种不好的用户体验，比如密码要数字字母混合，并且不能与用户名有太多重合等，还有密码最多线上保存两周。这些安全措施我都知道，但比一些公司密码管理还严，这至于吗？</p>  <p>国内的也出现了许多对应的web 2.0的网站，但是我没试用。还有一个选择就是baidu的<a href="http://cang.baidu.com">搜藏</a>，除了网页快照这个功能比较吸人外，其他并无亮点。最早看中google书签是因为它的开放性，比如搜藏都没有导出功能，而google就有导出，不怕用户流失，这一点蛮赞的。但是就其本身来说，使用并不方便，后来我使用了一直比较反感的工具条后，又开始使用它的书签，除了添加方便以外，整理和查找功能都比较薄弱。比如在线上，不能直接拖拽进行标签的分类，要手工点击编辑。google对这个服务不怎么看中，自推出以后，没有什么新的功能增加，希望以后有类似网页快照的存档功能就好了。</p>  <p>现在使用firefox3浏览器后，找到了<a href="https://addons.mozilla.org/en-US/firefox/addon/2888">GMarks</a>插件，它能直接存取google书签，包含一个边栏，工具栏，和一个书签快速查找框，可进行批量修改，删除书签，删除标签等等功能。它也可以在没有安装google工具条的情况下使用，还有定制工具栏等，最妙的是有了google工具条中没有的查找功能，不然在上千条书签找到你需要的，那是有点儿困难的。现在我将自己的收藏全都保存到google书签了，这样以后重装系统，再不用做备份了，而且在不同的机子上都可以用。</p>  <p>顺便说下，如何将FF3的书签导入到google书签服务中，那就使用google工具条，里面书签选项里有导入功能的，很简单。</p><img src ="http://www.cppblog.com/len/aggbug/62778.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/len/" target="_blank">len</a> 2008-09-25 20:06 <a href="http://www.cppblog.com/len/archive/2008/09/25/62778.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Live Spaces新旧空间迁移方法</title><link>http://www.cppblog.com/len/archive/2008/09/24/62712.html</link><dc:creator>len</dc:creator><author>len</author><pubDate>Wed, 24 Sep 2008 13:50:00 GMT</pubDate><guid>http://www.cppblog.com/len/archive/2008/09/24/62712.html</guid><wfw:comment>http://www.cppblog.com/len/comments/62712.html</wfw:comment><comments>http://www.cppblog.com/len/archive/2008/09/24/62712.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/len/comments/commentRss/62712.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/len/services/trackbacks/62712.html</trackback:ping><description><![CDATA[
		<p>微软启用了新的live域名，有许多人将hotmail之类的帐号转到新的域名，这就出现了如何将原帐号下的个人信息转移到新帐号的问题。对于live messager的联系人列表可采用其联系人选项中的导入导出功能，而最麻烦当属将live spaces的空间博客转移到新的帐号名下。最直接方法就是联系微软管理员，将你旧帐号下的空间所有权转移到新帐号名下，但是业务上是否可行不得而知。因此转而另一方法，开新的空间，将旧空间的博客转移到新空间来，本文就是采用这种思路，顺带提及下live api的简单使用。</p>
		<p>Windows Live Spaces MetaWeblog API提供了给外部程序进行文章内容设置和读取的功能。API使用了XML—RPC协议来在客户端应用程序与Weblog服务器端进行通讯。</p>
		<p>为了使用MetaWeblog API编辑空间中的博文内容，首先需要在空间启用E-mail发布功能，并设置密码字。</p>
		<ol>
				<li>到你的空间中的Options-&gt;E-mail Publishing选项进行配置</li>
				<li>打开E-mail发布功能，并选择 secred word的密码字。</li>
		</ol>
		<p>在程序中会用到用户名和密码，如果你的空间地址为： oldname.spaces.live.com，则用户名就是<strong>oldname</strong>,而不是你的live id，密码则是上面设置的<strong>secred word</strong>,而不是live id的密码。</p>
		<p>现在的MetaWeblogApi能进行发布新博文，编辑现有的博文，获取指定博文，获取类别列表，获取最近发布的博文，删除博文，获取用户博客信息，获取用户信息等功能。由这些功能，想迁移博客内容，首先需要获取到旧空间里的博文。我们自然想到用<a href="http://msdn.microsoft.com/en-us/library/aa905674.aspx">MetaWeblogAPI metaWeblog.getRecentPosts Method</a>函数，指定一个较大的值，然后获取全部的博文。很可惜，对于live spaces值只能取20,也就是说只能获取最近20篇博文。顺便提下，这里的20篇包括你己发布的，和存在空间里的草稿，这些草稿有时候并不会在空间里显示出来，但是操作时会有表示。如果用<a href="http://msdn.microsoft.com/en-us/library/aa905669.aspx">MetaWeblogAPI metaWeblog.getPost Method</a>，需要知道指定博文的id号，没有获取到全部博文id的方法作辅助，这又是一个因难。</p>
		<p>最后我采用了将metaWeblog.getRecentPosts方法的获取值设为1，每次取最近的一篇博文，然后记录id号，将这博文用<a href="http://msdn.microsoft.com/en-us/library/aa905673.aspx">MetaWeblogAPI metaWeblog.newPost Method</a>发表到新空间，然后用<a href="http://msdn.microsoft.com/en-us/library/aa905663.aspx">MetaWeblogAPI blogger.deletePost Method</a>将这id号的博文从旧空间中删去，重复进行，直到无法从旧空间里获取到博文。在程序实现借用了MSDN中的示例，为了防止网络故障之类以及做了备份，先是将获取博文内容写到本地文件，再进行删除。</p>
		<p>程序中还要说明的是，由于live spaces服务器使用非标准的时间格式，造成用<em>DateTime.Now</em>和获取到的博文的<em>dateCreated</em>都是"1/1/0001 12:00:00 AM"的格式，这需要在Invoke方法调用前加上this.NonStandard = XmlRpcNonStandard.AllowNonStandardDateTime语句。还有需要用到CookComputing.XmlRpcV2.dll，它实现了.net 2.0版本的XML-RPC协议，己包含在文末的源码中。如果是.net 1.1，需要其他相应的文件，可具体参见<a title="http://www.xmlrpc.com/metaWeblogApi" href="http://www.xmlrpc.com/metaWeblogApi">http://www.xmlrpc.com/metaWeblogApi</a>。</p>
		<p>最后要提下的是，程序只用于我自己的空间迁移，再加上不懂C#，用户名和密码之类都硬编码了，MetaWeblog之类的方法也应能用于像cppblog之类用wordpress的博客空间。这些部分加之完善，应能做个博客搬家工具的。</p>
		<p>参考：</p>
		<p>
				<a href="/Files/len/LiveSpaceMigration.zip">文中的迁移工具源码下载</a>
		</p>
		<p>
				<a href="http://msdn.microsoft.com/en-us/library/bb259702.aspx">MDSN Windows Live Spaces SDKs</a>
		</p>
<img src ="http://www.cppblog.com/len/aggbug/62712.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/len/" target="_blank">len</a> 2008-09-24 21:50 <a href="http://www.cppblog.com/len/archive/2008/09/24/62712.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>披着Chrome外衣的Firefox</title><link>http://www.cppblog.com/len/archive/2008/09/07/61239.html</link><dc:creator>len</dc:creator><author>len</author><pubDate>Sun, 07 Sep 2008 10:45:00 GMT</pubDate><guid>http://www.cppblog.com/len/archive/2008/09/07/61239.html</guid><wfw:comment>http://www.cppblog.com/len/comments/61239.html</wfw:comment><comments>http://www.cppblog.com/len/archive/2008/09/07/61239.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/len/comments/commentRss/61239.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/len/services/trackbacks/61239.html</trackback:ping><description><![CDATA[
		<p>Google的chrome浏览器一出来，我就被它的简洁风格给吸引住了，试用了几天，总体上还不错。但是还有几个问题，一是扩展太少，用些地方用起来不方便，像它自家的google工具栏都还没有开始支持。二是有时候在切换tab的时候，感觉有明显的停滞感，不知是否是多进程切换的原因，三是还有些网站不支持chrome。</p>
		<p>因为这些种种原因，我切换回了firefox 3。对于ff3，我也是刚刚用，但是越用越顺手，特别是插件机制，可以把玩好长时间。正像别人说过的那样，没有插件的ff3，还不如IE呢。于是通过设置，将自己的Firefox打造成了chrome风格，先上全屏截图，初始页是快速拨号，因为隐私关系，把它们都复位了，效果跟chrome差不多的。</p>
		<p>
				<a href="/images/cppblog_com/len/WindowsLiveWriter/ChromeFirefox_EF0C/firefox-chrome_4.png">
						<img style="border: 0px none ;" alt="firefox-chrome" src="http://www.cppblog.com/images/cppblog_com/len/WindowsLiveWriter/ChromeFirefox_EF0C/firefox-chrome_thumb_1.png" border="0" height="484" width="644" />
				</a>
		</p>
		<p>下面介绍简要操作步骤：</p>
		<p>
				<strong>1、Chrome主题风格 Chromifox</strong>是仿Chrome的主题，现处于实验版本阶段，因此下载安载需要以网站注册用户的身份登陆。下载地址为：<a title="https://addons.mozilla.org/en-US/firefox/addon/8782" href="https://addons.mozilla.org/en-US/firefox/addon/8782">https://addons.mozilla.org/en-US/firefox/addon/8782</a></p>
		<p>
				<strong>2、去除菜单栏 </strong>需要安装<strong>Compact Menu 2</strong>的插件，它可以定制原来的菜单栏为单个按钮或图标。下载地址为：<a title="https://addons.mozilla.org/en-US/firefox/addon/4550" href="https://addons.mozilla.org/en-US/firefox/addon/4550">https://addons.mozilla.org/en-US/firefox/addon/4550</a></p>
		<p>
				<strong>3、去除标题栏</strong> 这工作稍微有点儿麻烦，需要一个插件和一个脚本。Custom Buttons 2扩展提供创建，维护，导入，导出工具栏按钮的基础代码，也就是你可以用javascript代码写些特定用途的按钮。下载地址为：<a title="https://addons.mozilla.org/en-US/firefox/addon/5066" href="https://addons.mozilla.org/en-US/firefox/addon/5066">https://addons.mozilla.org/en-US/firefox/addon/5066</a>。安装完成后，再使用一个为隐藏标题栏而定制的脚本，地址为：<a title="http://custombuttons2.com/forum/viewtopic.php?f=35&amp;t=523" href="http://custombuttons2.com/forum/viewtopic.php?f=35&amp;t=523">http://custombuttons2.com/forum/viewtopic.php?f=35&amp;t=523</a>，点击其中的<a href="custombutton://%3C%3Fxml%20version%3D%221.0%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//custombuttons2.com/%22%3E%0A%20%20%3CCb2Ver%3E2.0.7.4%3C/Cb2Ver%3E%0A%20%20%3Cname%3EToggle%20Chrome%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAWElEQVR4Xs3RQQqAMAxE0T+SK7bH0LPoMdpD1kVpJRJ0JfiWITBDIhqdcMbcGAoh0aARE7DwwhCFBAfeClDJxrSJae+pTxF/WjDX/JNLXt+seOneIcfvPgGTthCzF0BPtwAAAABJRU5ErkJggg%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*Code*/%5D%5D%3E%3C/code%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bfunction%20hideChrome%28%29%20%7B%0A%20%20if%20%28navigator.platform%20%3D%3D%20%22Win32%22%29%20%7B%0A%20%20%20%20window.moveTo%280%2C0%29%3B%0A%20%20%20%20window.maximize%28%29%3B%0A%20%20%20%20document.getElementById%28%22main-window%22%29.setAttribute%28%27hidechrome%27%2C%27true%27%29%3B%0A%20%20%20%20//%20preserve%20small%20area%20for%20taskbar%20to%20appear%0A%20%20%20%20window.resizeTo%28screen.availWidth%2C%20screen.availHeight-2%29%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20document.getElementById%28%22main-window%22%29.setAttribute%28%27hidechrome%27%2C%27true%27%29%3B%0A%20%20%20%20window.moveTo%280%2C0%29%3B%0A%20%20%20%20window.resizeTo%28screen.availWidth%2C%20screen.availHeight%29%3B%0A%20%20%20%20window.maximize%28%29%3B%0A%20%20%7D%0A%7D%0A%0A//%20COMMENT%20OUT%20THE%20NEXT%20LINE%20TO%20START%20BROWSER%20NORMALLY%0AhideChrome%28%29%3B%0A%0Athis.leftclick%20%20%20%3D%20function%28evt%29%7B%0A%0A%20%20function%20showChrome%28%29%20%7B%0A%20%20%20%20if%20%28navigator.platform%20%3D%3D%20%22Win32%22%29%20%7B%0A%20%20%20%20%20%20document.getElementById%28%22main-window%22%29.setAttribute%28%27hidechrome%27%2C%27false%27%29%3B%0A%20%20%20%20%20%20window.resizeTo%28screen.availWidth%2C%20screen.availHeight%29%3B%0A%20%20%20%20%20%20window.maximize%28%29%3B%0A%20%20%20%20%20%20window.resizeTo%28screen.availWidth%2C%20screen.availHeight%29%3B%0A%20%20%20%20%7D%20else%20%7B%20%20%20%20%20%0A%20%20%20%20%20%20document.getElementById%28%22main-window%22%29.setAttribute%28%27hidechrome%27%2C%27false%27%29%3B%0A%20%20%20%20%20%20window.maximize%28%29%3B%0A%20%20%20%20%20%20window.maximize%28%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20toggleChrome%28%29%20%7B%0A%20%20%20%20var%20mainWindow%20%3D%20document.getElementById%28%22main-window%22%29%3B%0A%20%20%20%20var%20isFullScreen%20%3D%20mainWindow.getAttribute%28%27hidechrome%27%29%3B%0A%09%09%09%0A%20%20%20%20if%20%28isFullScreen%20%3D%3D%20%22%22%20%7C%7C%20isFullScreen%20%3D%3D%20%27false%27%29%20%7B%0A%20%20%20%20%20%20hideChrome%28%29%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20showChrome%28%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0AtoggleChrome%28%29%3B%0A%7D%0A%0Athis.setAttribute%28%27onclick%27%2C%20%27gQuot%28event%2C%20this%29%27%29%3B%20//%20Calls%20the%20Global%20MouseClick%20handler%20gQuot%0A%0Athis.style.opacity%20%3D%20%27.65%27%3B%0Athis.setAttribute%28%27onmouseover%27%2C%20%27custombuttons.ButtonBrt%28event%29%3B%27%20%29%3B%0Athis.setAttribute%28%27onmouseout%27%2C%20%27custombuttons.ButtonDim%28event%29%3B%27%20%29%3B%0A%0Athis.setAttribute%28%22author%22%2C%27nicholas%27%29%3B%09%09%09%09%09%09%09%09//%20Stores%20Author.%0Athis.setAttribute%28%22version%22%2C%2720080306.00%27%29%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09//%20Stores%20Version.%0Athis.setAttribute%28%22homepage%22%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09//%20Stores%20Homepage.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22http%3A//custombuttons2.com/forum/viewtopic.php%3Ff%3D35%26t%3D%22%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22523%22%29%3B%0Athis.setAttribute%28%22dependency%22%2C%27FF%202.0.*%2CCB%202.0.*%27%29%3B%09%09%09%09%09%09//%20Stores%20Dependency.%0Athis.setAttribute%28%">Toggle Chrome</a>链接和<a href="custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//custombuttons2.com/%22%3E%0A%20%20%3CCb2Ver%3E2.0.7.6%3C/Cb2Ver%3E%0A%20%20%3Cname%3EToggle%20Chrome/Maximized%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAWElEQVR4Xs3RQQqAMAxE0T+SK7bH0LPoMdpD1kVpJRJ0JfiWITBDIhqdcMbcGAoh0aARE7DwwhCFBAfeClDJxrSJae+pTxF/WjDX/JNLXt+seOneIcfvPgGTthCzF0BPtwAAAABJRU5ErkJggg%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*Code*/%5D%5D%3E%3C/code%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bfunction%20hideChrome%28%29%20%7B%0A%20%20if%20%28navigator.platform%20%3D%3D%20%22Win32%22%29%20%7B%0A%20%20%20%20window.moveTo%280%2C0%29%3B%0A%20%20%20%20window.maximize%28%29%3B%0A%20%20%20%20document.getElementById%28%22main-window%22%29.setAttribute%28%27hidechrome%27%2C%27true%27%29%3B%0A%20%20%20%20//%20preserve%20small%20area%20for%20taskbar%20to%20appear%0A%20%20%20%20window.resizeTo%28screen.availWidth%2C%20screen.availHeight-2%29%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20document.getElementById%28%22main-window%22%29.setAttribute%28%27hidechrome%27%2C%27true%27%29%3B%0A%20%20%20%20window.moveTo%280%2C0%29%3B%0A%20%20%20%20window.resizeTo%28screen.availWidth%2C%20screen.availHeight%29%3B%0A%20%20%20%20window.maximize%28%29%3B%0A%20%20%7D%0A%7D%0A%0A//%20COMMENT%20OUT%20THE%20NEXT%20LINE%20TO%20START%20BROWSER%20NORMALLY%0AhideChrome%28%29%3B%0A%0Athis.leftclick%20%20%20%3D%20function%28evt%29%7B%0A%0A%20%20function%20showChrome%28%29%20%7B%0A%20%20%20%20if%20%28navigator.platform%20%3D%3D%20%22Win32%22%29%20%7B%0A%20%20%20%20%20%20document.getElementById%28%22main-window%22%29.setAttribute%28%27hidechrome%27%2C%27false%27%29%3B%0A%20%20%20%20%20%20window.resizeTo%28screen.availWidth%2C%20screen.availHeight%29%3B%0A%20%20%20%20%20%20window.maximize%28%29%3B%0A%20%20%20%20%7D%20else%20%7B%20%20%20%20%20%0A%20%20%20%20%20%20document.getElementById%28%22main-window%22%29.setAttribute%28%27hidechrome%27%2C%27false%27%29%3B%0A%20%20%20%20%20%20window.maximize%28%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20toggleChrome%28%29%20%7B%0A%20%20%20%20var%20mainWindow%20%3D%20document.getElementById%28%22main-window%22%29%3B%0A%20%20%20%20var%20isFullScreen%20%3D%20mainWindow.getAttribute%28%27hidechrome%27%29%3B%0A%09%09%09%0A%20%20%20%20if%20%28isFullScreen%20%3D%3D%20%22%22%20%7C%7C%20isFullScreen%20%3D%3D%20%27false%27%29%20%7B%0A%20%20%20%20%20%20hideChrome%28%29%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20showChrome%28%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0AtoggleChrome%28%29%3B%0A%7D%0A%0Athis.setAttribute%28%27onclick%27%2C%20%27gQuot%28event%2C%20this%29%27%29%3B%20//%20Calls%20the%20Global%20MouseClick%20handler%20gQuot%0A%0Athis.style.opacity%20%3D%20%27.65%27%3B%0Athis.setAttribute%28%27onmouseover%27%2C%20%27custombuttons.ButtonBrt%28event%29%3B%27%20%29%3B%0Athis.setAttribute%28%27onmouseout%27%2C%20%27custombuttons.ButtonDim%28event%29%3B%27%20%29%3B%0A%0Athis.setAttribute%28%22author%22%2C%27nicholas%27%29%3B%09%09%09%09%09%09%09%09//%20Stores%20Author.%0Athis.setAttribute%28%22version%22%2C%2720080622.00%27%29%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09//%20Stores%20Version.%0Athis.setAttribute%28%22homepage%22%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%09%09%09//%20Stores%20Homepage.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22http%3A//custombuttons2.com/forum/viewtopic.php%3Ff%3D35%26t%3D%22%20+%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22523%22%29%3B%0Athis.setAttribute%28%22dependency%22%2C%27FF%202.0.*%2CCB%202.0.*%27%29%3B%09%09%09%09%09%09//%20Stores%20Dependency.%0Athis.setAttribute%28%22status%22%2C%27Complete%27%29%3B%09%09%09%09%09%09%09%09//%20Stores%20Devstatus.%0Athis.setAtt">Toggle Chrome/Maximized</a>，即可安装。</p>
		<p>
				<strong>4、隐藏状态栏 </strong>无需任何插件，只需菜单栏的“查看”中的“状态栏”不要勾选上即可。</p>
		<p>
				<strong>5、快速拨号 Speed Dial</strong>和<strong>Fast Dial</strong>这两个插件均能提供，我现使用Speed Dial，地址为<a title="https://addons.mozilla.org/en-US/firefox/addon/4810" href="https://addons.mozilla.org/en-US/firefox/addon/4810">https://addons.mozilla.org/en-US/firefox/addon/4810</a>，另Fast Dial的地址为<a title="https://addons.mozilla.org/en-US/firefox/addon/5721" href="https://addons.mozilla.org/en-US/firefox/addon/5721">https://addons.mozilla.org/en-US/firefox/addon/5721</a>。</p>
		<p>其他诸如隐身模式、下载状态栏、将网站转换为独立的应用程序都可实现，具体可参见：<a title="http://www.cnbeta.com/articles/64031.htm" href="http://www.cnbeta.com/articles/64031.htm">http://www.cnbeta.com/articles/64031.htm</a></p>
		<h3>
		</h3>
		<h3>我的扩展列表</h3>
		<p>附带我在用的一些有用的插件功能，对于一般的用户来讲，这些功能也会大大节省你的时间，提高你上网浏览的体验。这些可能是最基本的，高级的要随你自己，你的地盘，你做主。</p>
		<p>
				<a href="https://addons.mozilla.org/en-US/firefox/addon/1419">IE Tab</a> 有些网站不支持非IE内核的怎么办，先不要有抱怨，有了它让你自由切换到IE的内核，但是外部功能不会减少，必备</p>
		<p>
				<a href="https://addons.mozilla.org/en-US/firefox/addon/6366">FireGestures</a> 鼠标手势，我是从Maxthon转过来的，这个功能太好用了。这个插件更强大，可以Tab，按键，滚轮上都可应用</p>
		<p>
				<a href="https://addons.mozilla.org/en-US/firefox/addon/6639">Easy Dragtogo</a> 类似于鼠标手势，有些超链接只要一拖，就可按设置在新tab或在另一tab打开，不需要再用右键了。我对FireGestures还不熟，不知道这功能是否可用FireGestures代替,这功能现在还需要</p>
		<p>
				<a href="https://addons.mozilla.org/en-US/firefox/addon/220">Flashgot</a> 文件下载管理，我用于管理flashget工具，内置支持许多下载工具</p>
		<p>
				<a href="https://addons.mozilla.org/en-US/firefox/addon/1865">Adblock</a> 没有广告的世界真清静，虽然Firefox自身的拦截能力己经很强了，但是它提供更强大的定制能力，一切由你自己定</p>
		<p>
				<a href="https://addons.mozilla.org/en-US/firefox/addon/722">Noscript</a> 提高浏览安全，可禁止一些恶意的脚本，可用效对付一些XSS跨站攻击等</p>
		<p>
				<a href="https://addons.mozilla.org/en-US/firefox/addon/2464">FoxyProxy</a> 如果你需要时常在代理服务器上进行切换的话，这非常用帮助。如果结合像Tor之类的工具，那么爬墙也不是件困难的事了。</p>
<img src ="http://www.cppblog.com/len/aggbug/61239.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/len/" target="_blank">len</a> 2008-09-07 18:45 <a href="http://www.cppblog.com/len/archive/2008/09/07/61239.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简简单单用py2exe打包python脚本</title><link>http://www.cppblog.com/len/archive/2008/08/11/58547.html</link><dc:creator>len</dc:creator><author>len</author><pubDate>Mon, 11 Aug 2008 11:19:00 GMT</pubDate><guid>http://www.cppblog.com/len/archive/2008/08/11/58547.html</guid><wfw:comment>http://www.cppblog.com/len/comments/58547.html</wfw:comment><comments>http://www.cppblog.com/len/archive/2008/08/11/58547.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/len/comments/commentRss/58547.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/len/services/trackbacks/58547.html</trackback:ping><description><![CDATA[<p>py2exe是实用的python脚本工具，可以将python脚本程序转换为exe执行文件。这样你的python程序就可以没有安装python运行时环境的电脑里运行了。py2exe方便地提取出python运行时所需要的文件档案，你需要做的就是写一个两三行的安装脚本文件。</p>  <p>py2exe可以从<a title="http://sourceforge.net/projects/py2exe/" href="http://sourceforge.net/projects/py2exe/">http://sourceforge.net/projects/py2exe/</a>下载，唯一需要注意的是下载与你python版本号对应的版本，简单的英文教程<a title="http://www.py2exe.org/index.cgi/Tutorial" href="http://www.py2exe.org/index.cgi/Tutorial">http://www.py2exe.org/index.cgi/Tutorial</a>非常容易入门。</p>  <p>对早先写的一个<a href="http://www.cppblog.com/len/archive/2008/07/02/55174.html">代理验证脚本</a>进行exe文件封装作为示例，这测试脚本名为HttpProxyTester.py。</p>  <p>首先，最好测试运行一下待封装的脚本以确定没有问题，然后在HttpProxyTester.py脚本的同级目录新建一setup.py文件。</p>  <pre class="code"># setup.py

from distutils.core import setup
import py2exe

setup(console=['HttpProxyTester.py'])</pre>

<p>上面的文件首先引入了distutils模块，这模块随python安装分发的，也就是说内置的。接着导入py3exe模块，它其实对distutils做了一些功能扩展。接下来的语句说明是控制台运行。对于windows的GUI模式运行，而不出控制台窗口，则需要setup(windows=['xxx'])之类指令，这对于pyWidget程序将很有用。</p>

<p>在完成安装脚本后，接下来就是在控制台下运行这脚本。</p>

<pre class="console">&gt;python setup.py py2exe</pre>

<p>这时会打印出许多log信息，并在同级目录下出现两个新的文件夹：build和dist。build文件夹下是py2exe生成的一些临时文件，dist就是需要分发的文件内容，可以这文件夹打包，然后在别的机子上运行了。</p>

<p>总之，py2exe非常简单实用，三分钟就可以搞定。</p><img src ="http://www.cppblog.com/len/aggbug/58547.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/len/" target="_blank">len</a> 2008-08-11 19:19 <a href="http://www.cppblog.com/len/archive/2008/08/11/58547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IE代理依赖</title><link>http://www.cppblog.com/len/archive/2008/07/08/55621.html</link><dc:creator>len</dc:creator><author>len</author><pubDate>Tue, 08 Jul 2008 05:27:00 GMT</pubDate><guid>http://www.cppblog.com/len/archive/2008/07/08/55621.html</guid><wfw:comment>http://www.cppblog.com/len/comments/55621.html</wfw:comment><comments>http://www.cppblog.com/len/archive/2008/07/08/55621.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/len/comments/commentRss/55621.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/len/services/trackbacks/55621.html</trackback:ping><description><![CDATA[
		<p>在Windows下，许多网络程序的连接依赖于IE浏览器中的代理服务器的设置，IE浏览器的代理设置很可能设定了注册表中的全局网络连接配置。</p>
		<p>我在IE浏览器中设置了代理，而使用Maxthon浏览网页。在写Python时，用了urllib2库，后来出现了下面的错误：</p>
		<pre class="console">urllib2.URLError: &lt;urlopen error (10061, 'Connection refused')&gt;</pre>
		<p>先前这个程序是运行正确的，又直接用浏览器访问需要的网址，正常。通过排查，发现IE浏览器中设置了代理，而代理无效，而urllib2库使用其网络配置，因此无法连接。通过取消代理，程序连接正常。</p>
		<p>还有一例是，刚才用Windows Live Writer检索日志,和发布日志时出错，分别显示如下的错误：</p>
		<p>
				<a href="/images/cppblog_com/len/WindowsLiveWriter/IE_BAE5/error_2.png">
						<img style="border: 0px none ;" alt="error" src="http://www.cppblog.com/images/cppblog_com/len/WindowsLiveWriter/IE_BAE5/error_thumb.png" border="0" height="144" width="244" />
				</a> <a href="/images/cppblog_com/len/WindowsLiveWriter/IE_BAE5/err_2.png"><img style="border: 0px none ;" alt="err" src="http://www.cppblog.com/images/cppblog_com/len/WindowsLiveWriter/IE_BAE5/err_thumb.png" border="0" height="170" width="244" /></a></p>
		<p>这也是因为WLW使用IE的网络设置，造成的网络错误而显示的错误提示。</p>
		<p>因此在设置了IE代理，并使用其他与网络相关的程序，要特别注意其是否对IE代理设置有依赖。像Maxthon等就可选择不使用IE代理配置的选项。</p>
<img src ="http://www.cppblog.com/len/aggbug/55621.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/len/" target="_blank">len</a> 2008-07-08 13:27 <a href="http://www.cppblog.com/len/archive/2008/07/08/55621.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Cygwin，以及远程登陆Linux桌面</title><link>http://www.cppblog.com/len/archive/2008/07/03/55234.html</link><dc:creator>len</dc:creator><author>len</author><pubDate>Thu, 03 Jul 2008 13:55:00 GMT</pubDate><guid>http://www.cppblog.com/len/archive/2008/07/03/55234.html</guid><wfw:comment>http://www.cppblog.com/len/comments/55234.html</wfw:comment><comments>http://www.cppblog.com/len/archive/2008/07/03/55234.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/len/comments/commentRss/55234.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/len/services/trackbacks/55234.html</trackback:ping><description><![CDATA[
		<h3>安装Cygwin</h3>
		<p>在<a href="http://www.cygwin.com/">cgywin官方主页</a>下载安装文件<a href="http://www.cygwin.com/setup.exe">setup.exe</a>,这只是一个网络安装包，体积很小。cgywin包含了许多GNU下的应用程序，真正安装时会根据你选择的组件，会自动去网上下载安装的。在国内最好使用镜像服务，这样速度会提高很多，建议去<a title="http://www.cygwin.net.cn/" href="http://www.cygwin.net.cn/">http://www.cygwin.net.cn/</a>或<a title="http://www.cygwin.cn/" href="http://www.cygwin.cn/">http://www.cygwin.cn/</a>下载上述的安装包，并在安装进行到Choose A Download Site这个步骤时，选择合理的镜像。由于中国南北网速的差异，上述两个地址都尝试一下，看看哪个对你而言速度更快一些。</p>
		<p>在进行到Select Packages这个步骤时，选择你需要包，建议如下：</p>
		<ul>
				<li>Shells -&gt; rxvt-unicode-x  强大的X终端，可用它替换windows下的cmd.exe </li>
				<li>Net-&gt; openssh  ssh客户端，可作putty的替换 </li>
				<li>Net-&gt; inetutils  可选，包含一些基本的网络工具，如telnet，否则在cygwin下无法使用windows的telnet </li>
		</ul>
		<p>cygwin安装时会自动进行包关联，在安装rxvt时，已自动将X server安装上了。</p>
		<h3>配置调整</h3>
		<p>启动cygwin,实际上是运行cgywin.bat批处理，它又调用了cmd.exe。我们将安装的rxvt作为默认终端，需要修改cygwin.bat。下面是我机子上的配置修改，请对应修改相应的路径。</p>
		<pre class="code">@echo off
d:
chdir d:\Cygwin\bin
rxvt -e bash --login -i</pre>
		<p>调整rxvt观感，需要修改你用户主目录下的.Xdefaults文件，此文件在你选择的安装目录下的home\usrname下，在我的机子上是<tt>D:\Cgywin\home\len。若不存在，可在此目录下新建一个，修改内容如下：</tt></p>
		<pre class="code">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 </pre>
		<p>在cygwin下也是可以访问Windows下其他盘符的,如<tt>cd /cygdrive/c/windows</tt>，就转到了C盘windows目录下。这样对于在linux下工作的人说有点儿别扭，更希望是以<tt>cd /mnt/c/windows</tt>的mount方式来访问其他盘符。这需要修改注册表的选项，将<tt>HKLM\software\Cygnus Solutions\Cgywin\mounts v2</tt>下的子项<tt>cygdrive prefix</tt>更改为<tt>/mnt</tt>即可。</p>
		<h3>远程登陆Linux桌面</h3>
		<p>其实这里介绍的不仅仅适用于Linux，而是针对X Window的。X Widonw的介绍不进行赘述，但需要明确其中的服务器端和客户端的区别，在X Window的概念中服务器端是指你进行显示，输入输出的机器，也是接下来示例中的本机len-computer,IP为10.3.164.70，而客户端指的是进行远程登陆的机器auto-desktop,IP为10.3.164.74。</p>
		<p>在局域网内最简单的方法是使用XDMCP连接，这时远程的机器启用xdmcp。那台机器运行着ubuntu-8.04，用gdm进行窗口管理，编辑/etc/gdm/gdm.conf-custom如下，其他版本的linux需找到对应的窗口管理的配置文件。</p>
		<pre class="code">[security]
DisallowTCP=false

[xdmcp]
Enale=true</pre>
		<p>修改完后，在远程机器上重启服务，<tt>$sudo /etc/init.d/gdm restart。</tt>接下来本机启动cgywin，转到X目录下，运行Xwin.exe，使用 -query指定远程的linux机器的ip即可。</p>
		<pre class="console">Len@len-computer /usr/X11R6/bin
$ cd /usr/X11R6/bin

Len@len-computer /usr/X11R6/bin
$ Xwin -query 10.3.164.74</pre>
		<p>这里会出现如下面图示的窗口，提示输入用户名和密码。另再附一张在登陆成功后，我在本地执行远程操作的截图。</p>
		<p>
				<a href="/images/cppblog_com/len/WindowsLiveWriter/CygwinLinux_127B5/login_4.png">
						<img style="border: 0px none ;" alt="login" src="http://www.cppblog.com/images/cppblog_com/len/WindowsLiveWriter/CygwinLinux_127B5/login_thumb_1.png" border="0" height="465" width="644" />
				</a>
		</p>
		<p>
				<a href="/images/cppblog_com/len/WindowsLiveWriter/CygwinLinux_127B5/cygwinX_2.png">
						<img style="border: 0px none ;" alt="cygwinX" src="http://www.cppblog.com/images/cppblog_com/len/WindowsLiveWriter/CygwinLinux_127B5/cygwinX_thumb.png" border="0" height="484" width="644" />
				</a>
		</p>
		<p>如果你需要连接的远程机器比较固定，可以修改本地机器<tt>d:\cgygin\usrX11R6\bin\startxdmcp.bat</tt>中的<tt>REMOTE_HOST</tt>值为你需要连接机器的IP，这个批处理设置了一些有用的环境变量值。或许你需要创建一个桌面的快键方式，这样每次点击，就直接连接到远程机器了。</p>
		<h3>不引入桌面环境</h3>
		<p>可能有时候只需要将某个需要X服务的远程应用程序引入到本地桌面显示，而不需要启动像上面的GNOME或者KDE等庞大的桌面环境。这样做比较适合喜欢终端操作的人，我就常常终端敲命令，然后将gvim,openoffice这些从远程导入到本地操作。</p>
		<p>找到d:\cgywin\usr\X11R6\bin\startwin.bat，将<tt>%RUN% xterm -e /usr/bin/bash -l</tt>注释掉，因为我们己经有了rxvt,不需要一个新的xterm终端了，执行该批处理文件，就会在本机运行X server。启动cgywin，用ssh登陆到远程机器上，执行如下命令，导出DISPLAY环境变量和运行你感兴趣的程序。</p>
		<pre class="console">auto@Auto-desktop:~$ export DISPLAY=10.3.164.70:0.0
auto@Auto-desktop:~$ gvim&amp;
[1] 22652
auto@Auto-desktop:~$ oowriter&amp;</pre>
		<p>其中环境变量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上显示了，并且可操作。</p>
		<p>
				<a href="/images/cppblog_com/len/WindowsLiveWriter/CygwinLinux_127B5/screen_2.png">
						<img style="border: 0px none ;" alt="screen" src="http://www.cppblog.com/images/cppblog_com/len/WindowsLiveWriter/CygwinLinux_127B5/screen_thumb.png" border="0" height="484" width="644" />
				</a>
		</p>
		<h3>有用的链接</h3>
		<p>
				<a href="http://x.cygwin.com/docs/faq/cygwin-x-faq.html">Cgywin/X FAQ</a> 在碰到一些操作问题时，不妨先看看这份FAQ</p>
		<p>
				<a href="http://blog.csdn.net/easwy/archive/2007/09/30/1807725.aspx">使用cygwin X server实现Linux远程桌面</a> easwy介绍了KDE环境下的配置，部分受此启发</p>
		<p>
				<a href="http://blog.csdn.net/easwy/archive/2007/10/05/1812242.aspx">使用rxvt做为cygwin终端</a> 碰到rxvt中文显示问题时，或许有帮助</p>
<img src ="http://www.cppblog.com/len/aggbug/55234.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/len/" target="_blank">len</a> 2008-07-03 21:55 <a href="http://www.cppblog.com/len/archive/2008/07/03/55234.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单的QQ代理验证</title><link>http://www.cppblog.com/len/archive/2008/07/02/55174.html</link><dc:creator>len</dc:creator><author>len</author><pubDate>Wed, 02 Jul 2008 14:13:00 GMT</pubDate><guid>http://www.cppblog.com/len/archive/2008/07/02/55174.html</guid><wfw:comment>http://www.cppblog.com/len/comments/55174.html</wfw:comment><comments>http://www.cppblog.com/len/archive/2008/07/02/55174.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/len/comments/commentRss/55174.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/len/services/trackbacks/55174.html</trackback:ping><description><![CDATA[
		<p>QQ在许多公司内部被禁止使用,为了能使用QQ,稍微懂点儿计算机的人都知道用代理。QQ提供了socket和http代理这两种功能，socket代理功能强大，但一般公司对外允许连接的端口号比较有限，难以利用。大多数公司是允许连接外部的80端口的，这样使用QQ的http代理是可行的。但是找到能用的QQ代理有点儿麻烦，因此下面的Python代码提供了自动进行QQ代理验证的功能。</p>
		<pre class="code">import urllib2
import socket
import re

f = urllib2.urlopen('http://www.proxycn.com/html_proxy/http-1.html')
content = f.read()
f.close()
ipPattern = re.compile(r'(\d+\.\d+\.\d+\.\d+):80')
ipList = ipPattern.findall(content)
print ipList
requestData = "CONNECT http.tencent.com:443 HTTP/1.1\x0d\x0a"
requestData += "Accept: */*\x0d\x0aContent-Type: text/html\x0d\x0a"
requestData += "Proxy-Connection: Keep-Alive\x0d\x0a"
requestData += "Content-length: 0\x0d\x0a\x0d\x0a"
for ip in ipList:

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        s.connect((ip,80))
        s.send(requestData)
        data = s.recv(64)
        if data.find("200 Connection established")!= -1:
            print ip, 'good'
            # A vailable proxy is found once, then exit the program
            s.close
            exit(0)
        else:
            print ip, 'bad'
    except socket.error:
        print ip, 'dead'
    finally:
        s.close</pre>
		<p>程序在找到一个可用的QQ代理后退出，用good标识。另两种代理服务器的状态是dead,说明本地无法连接到代理服务器，或是bad，能与代理服务器建立连接，但是代理不能与QQ服务器通讯。</p>
		<h3>代码思路</h3>
		<p>通过<a href="http://www.proxycn.com/index.php">代理中国</a>获取到80端口的代理服务器列表，使用了urllib2模块获取页面数据，然后正则表达式解析出80端口的IP地址存入list中。接下来的几行代码简单，但是很重要，使用较为底层的socket对象，构造合适的数据包通过代理，请求与QQ服务器连接，通过读取的返回数据包来验证连接是否能建立。</p>
		<p>这里主要涉及到了HTTP协议的CONNECT的概念，很多人可能认为http代理只是为web浏览提供服务，其实CONNECT方法允许允许用户建立TCP连接到任何端口，这意味着代理不仅可用于HTTP，还可用于FTP，QQ等其他协议。只是网上提供CONNECT方法的代理服务器比较少，我有时候扫了一大堆，也没有找到一个可用的代理。反过来说，有时候你找到的能浏览网页的http服务器，未必能用在QQ上，QQ需要的是能CONNECT的代理。网页浏览一般只使用HTTP协议的GET或POST方法，提供这两种方法的服务器就多了。</p>
		<p>了解了代码的原理，稍做改动，就可以用于其他类型的代理的验证了，需要的是一些基本网络知识和数据报的发送和接收。</p>
<img src ="http://www.cppblog.com/len/aggbug/55174.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/len/" target="_blank">len</a> 2008-07-02 22:13 <a href="http://www.cppblog.com/len/archive/2008/07/02/55174.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>好用的Subversion属性功能</title><link>http://www.cppblog.com/len/archive/2008/06/30/54948.html</link><dc:creator>len</dc:creator><author>len</author><pubDate>Mon, 30 Jun 2008 04:06:00 GMT</pubDate><guid>http://www.cppblog.com/len/archive/2008/06/30/54948.html</guid><wfw:comment>http://www.cppblog.com/len/comments/54948.html</wfw:comment><comments>http://www.cppblog.com/len/archive/2008/06/30/54948.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/len/comments/commentRss/54948.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/len/services/trackbacks/54948.html</trackback:ping><description><![CDATA[
		<p>Subversion的属性是非常好用的功能,它将一些工作自动化，实现为受版本控制的源文件添加元信息的作用。属性是外部不可见的，可以简单认为是附加上在文件上的信息，和文件大小之类的信息是一样的，只不过他是通过subversion来管理的。属性的名称和值可以是你希望的任何值，限制就是名称必须是可读的文本，并且最好的一点是这些属性也是版本化的，就像你的文本文件内容，你可以像提交文本修改一样修改、提交和恢复属性修改，当你更新时也会接收到别人的属性修改—你不必为适应属性改变你的工作流程。</p>
		<p>Subversion保留了一组名称以<code>svn:</code>开头的属性，来预定义一些有用的功能。比如你常会看到一些人的源代码底部有像下面之类标识的文字：</p>
		<pre class="code">$Id: main_window.py 68 2008-06-30 02:05:05Z Len $</pre>
		<p>这就使用了Subversion 中的 svn:keywords的自动属性，它让将发生在源代码中的一些属性的变化自动地更新到源代码中。这行字的意思是表示，main_windows.py 这个源代码文件最后被用户 len 更新于 2008-6-30 02:05:05Z，修订版本号为 68。要实现这样的自动更新，你只要对需要这样属性的文件上使用下面这行指令。 </p>
		<pre class="console">&gt; svn propset svn:keywords "Id" main_window.py</pre>
		<p>或者使用TortoiseSVN中的Properties的操作按钮，方便地增加新的属性。接着需要在源代码文件中需要 Subversion 进行自动更新的地方插入 $Id$ 这样的 Keyword，那么在你下次进行提交更新时，该<code>$Id$</code> 就会被 Subversion 自动替换为<code>$Id: main_window.py 68 2008-06-30 02:05:05Z Len $</code> 这样的格式。 

  <br />Subversion 中可以使用的Keyword 包括下面这些：</p>
		<ul>
				<li>Id 
    <br />上面介绍过的综合的格式 </li>
				<li>LastChangedDate 
    <br />最后被修改的时间，缩写为 Date。 </li>
				<li>LastChangedBy 
    <br />最后修改该源代码文件的用户名，缩写为 Author。 </li>
				<li>LastChangedRevision 
    <br />最后修订的版本号，缩写为 Revision。 </li>
		</ul>
		<p>如果想每次向Subversion服务器提交文件修改时，都要设置文件的属性，则需要进行Subversion配置的修改。配置文件在你用户的主目录下，在Windows下应类似于<code>C:\Documents and Settings\Len\Application Data\Subversion\config</code>文件，Len是Windows用户名，注意Application Data是隐藏文件夹，需要显示全部文件才能看到。接着如下相应的修改，对你想要处理的文件做配置。</p>
		<pre class="code">enable-auto-props = yes   
[auto-props]   
*.c = svn:keywords=Id   
*.py = svn:keywords=Id </pre>
		<p>对于开源项目，常见其源文件头部有着版权声明的文本，这些操作大多也是通Subversion的属性功能来完成的，有关更详细的介绍和操作指南，可参见<a href="http://www.subversion.org.cn/svnbook/1.4/index.html">Subversion中文手册</a>中的<a href="http://www.subversion.org.cn/svnbook/1.4/svn.advanced.props.html">属性</a>章节。</p>
<img src ="http://www.cppblog.com/len/aggbug/54948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/len/" target="_blank">len</a> 2008-06-30 12:06 <a href="http://www.cppblog.com/len/archive/2008/06/30/54948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>强大的网络传输工具cURL和libcurl</title><link>http://www.cppblog.com/len/archive/2008/06/21/54229.html</link><dc:creator>len</dc:creator><author>len</author><pubDate>Sat, 21 Jun 2008 08:33:00 GMT</pubDate><guid>http://www.cppblog.com/len/archive/2008/06/21/54229.html</guid><wfw:comment>http://www.cppblog.com/len/comments/54229.html</wfw:comment><comments>http://www.cppblog.com/len/archive/2008/06/21/54229.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/len/comments/commentRss/54229.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/len/services/trackbacks/54229.html</trackback:ping><description><![CDATA[
		<h3>介绍</h3>
		<p>cURL是一个利用URL语法的文件传输工具,是基于libcurl的前端命令行工具。它支持很多协议：FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP。 它同样支持HTTPS认证，HTTP POST方法, HTTP PUT方法, FTP上传, kerberos认证, HTTP上传, 代理服务器, cookies, 用户名/密码认证, 下载文件断点续传, 上载文件断点续传, http代理服务器管道（ proxy tunneling）, 甚至它还支持IPv6, socks5代理服务器,通过http代理服务器上传文件到FTP服务器等等，功能十分强大。</p>
		<p>除了使用curl命令行直接进行相关的网络操作，你也可以自由地使用libcurl,它是用C语言编写的，可以绑定到众多的编程语言中，如C,C++,PHP,Python,Perl,Java等等。你可以很方便地利用libcurl，在程序中进行一些网络传输工作，来代替一些语言的内置，使你的知识可重用。在Unix工作环境下，你可以用curl代替wget和ftp等工具，并能将这种学习经验迁移到将来使用libcurl来完成一些自动化任务。</p>
		<p>curl是瑞典curl组织开发的，可以通过<a href="http://curl.haxx.se/">http://curl.haxx.se/</a>来获取更详细的信息和下载文件。</p>
		<h3>curl命令行工具使用</h3>
		<p>curl太强大了，只能对其HTTP的部分作一简单的介绍，其他选项可以参见其附带的手册。它的后端库的使用也非常方便，主要也是在选项设置上，跟命令行基本无异。</p>
		<h4>用法</h4>
		<p>
				<strong>curl [选项]</strong> [URL...]</p>
		<h4>URL 语法</h4>
		<p>URL语法是跟协议相关的，具体细节可参见RFC 3986 <br />可以指定多个URLs或者部分URL地址，通过花括号{}进行分割： <br />http://site.{one,two,three}.com <br />或者用[]使用字母序： <br />ftp://ftp.numericals.com/file[1-100].txt <br />ftp://ftp.numericals.com/file[001-100].txt (有前导零) <br />ftp://ftp.letters.com/file[a-z]].txt</p>
		<p>当前序列嵌套不被支持，但是还是可以使用下列的样式： <br />http://any.org/archive[1996-1999]/vol[1-4]/part{a,b,c}.html <br />可以在命令行指定任意数量的URLs,它们将以指定的顺序被取回。 </p>
		<p>从curl7.15.1开始指定可以范围步长，所以可以得到第n个数或字母： <br />http://www.numericals.com/file[1-100:10].txt <br />http://www.letters.com/file[a-z:2].txt</p>
		<p>如果使用了protocal://前缀，curl会将尝试你想使用的协议。它默认使用HTTP，但是其他一些协议也常被用作主机名。比如说，以"ftp"打头的主机名，curl会假定你想使用ftp协议。 </p>
		<p>Curl会尝试对多文件传输使用重连接，可以使从同一服务器获取很多文件时，不会进行多次的连接。这种做法改进了速度，当然这只会在同一命令行中指定的文件启用，而不会在独立的Curl调用时使用。 </p>
		<h4>进度指示器</h4>
		<p>curl通常在操作时会显示一个进度指示器，来指明当前的传输量，传输速度和预计的剩余时间等等。 </p>
		<p>但是，即然curl默认将数据显示在终端，如果你调用curl进行操作，它会将数据打印到终端上，这时它会禁用掉进度指示器，否则这些会将输出信息搞乱掉。 </p>
		<p>如果在进行HTTP的POST或PUT请求时，你想将输出重定向到文件中，可以使用shell的重定向符(&gt;)，或者类似的-o[file]选项。 </p>
		<p>但是在FTP上传并不会这样，这些操作不会将数据插入到终端中。 </p>
		<p>如果想使用进度栏，而不是常规的指示器，那么-#会非常有帮助。 </p>
		<h4>常用的HTTP选项 </h4>
		<p>
				<strong>-A/--user-agent&lt;agent string&gt;</strong>
				<br />(HTTP)指定用户代理字符串发送给HTTP服务器。如果这个字段没有被设为"Mozilla/4.0"，某些CGIs将不会正常工作。如果在字符串中存在空白字符，需要用单引号标识。这个字段值也可用-H/--header选项进行设置。 <br />如果这选项被多次设置，最后的设置将起作用。 </p>
		<p>
				<strong>-b/--cookie&lt;name=data&gt;</strong>
				<br />(HTTP)将data作为cookie传给HTTP服务器，这数据当然是在使用了"Set-Cookie:"后，先前从服务端接收到的。这数据应是"NAME1=VALUE1;NAME2=VALUE2"的格式。 <br />如果没有"="字符，它将会当作先前存储cookie行的文件名，如果它能被匹配的话。使用这选项，也能激活"cookie parser"，它使curl记录传入的cookies数据。将它与-L/--locaion选项组合将会更加便利。被读取cookie的文件格式应当是文本HTTP头或者Netscape/Mozilla cookie文件格式。 <br />注意：被-b/--cookie指定的文件只能作为输入使用。没有cookie会存储在这文件中。为了存储cookie，应使用-c/--cookie-jar选项或者直接将HTTP头输出到文件中，用-D/--dump-header选项。这选项可以设置多次，但是只有最后一个起作用。 </p>
		<p>
				<strong>-connect-timeout&lt;seconds&gt;</strong>
				<br />以秒计的最大超时，用于进行服务器连接时。这只在连接阶段起作用，一旦curl连接建立，这选项将不再起作用。 </p>
		<p>
				<strong>-c/--cookie-jar&lt;file name&gt;</strong>
				<br />指定在完成一系列操作后，需要将全部的cookie信息保存到哪个文件中。Curl会将先前读取的cookie的信息和从服务器返回的信息一起保存。如果没有cookie信息，则不会进行写文件。cookie信息的文件将与Netscape cookie文件格式保存。如果文件名被设置为'-'，则将cookie打印至终端。 <br /><strong>注意：</strong>如果cookie-jar不能被创建写入，整个curl操作也不会失改，甚至不会向你报告错误.使用-v将会得到警告显示，但也只能在可能导致发生致命错误的情况才会显示。 </p>
		<p>
				<strong>--create-dirs</strong>
				<br />这与-o选项配合使用，curl会在需要时建立本地文件夹结构。这选项会创建在-o选项中涉及到的文件夹。如果-o选项中的文件名没有使用到文件夹，或者所需的文件夹已经存在，则不会有文件夹创建。 </p>
		<p>
				<strong>-D/--dump-header&lt;file&gt;</strong>
				<br />将协议头写到指定的文件中。当你想存储HTTP站点发给你的数据时，这选项非常有用。在协议头中的cookie将来可以用curl的另外调用来进行读取，那就是-b/--cookie选项。但是-c/--cookie-jar选项将会是更好的存储cookie信息的方法。 <br />当使用FTP协议时，ftp服务器的应答信息将相应地当作成协议头，然后被存储。 </p>
		<p>
				<strong>-p/-proxytunnel</strong>
				<br />当HTTP代理被设置后(-x/--proxy)，选项会使不是HTTP协议的传输试图通过代理隧道，而不是表现得HTTP类似的操作形为。代理隧道的方法是通过HTTP服务器直接使用CONNECT请求，让代理直接连接到curl隧道所请求的远程端口号的方式来实现的。</p>
		<p>
				<strong>-o/--output&lt;file&gt;</strong>
				<br />将输出信息打印到文件中，而不是终端。可使用{}或者[]取回多个文档，可在file指定格式中的'#'跟一数字，这样这变量将会由取回的URL字符串所取代。如下： <br />curl http://{one,two}.site.com -o "file_#1.txt" <br />如果有多个变量，可以写成下面的样子： <br />curl http://{site.host}.host[1-5].com -o "#1_#2" <br />你可对任意数量的URL使用同样多的这个选项 </p>
		<p>
				<strong>-x/--proxy&lt;proxyhost[:port]&gt;</strong>
				<br />使用指定的HTTP代理，如果端口号没有被指定，默认为1080. <br />这选项会覆盖环境变量中代理服务器的设置。如果环境变量中设置了代理，可将proxy设置为空字符串，来覆盖环境变量中的设置。 <br /><strong>注意：</strong>所有通过HTTP代理的操作都会自动转化为HTTP协议。这意味着一些特定协议的操作将会变得无效。这不会有问题，如果在设置了<em>-p/--proxytunnel</em>选项来通过代理隧道进行操作。 </p>
		<h4>简单示例 </h4>
		<p>获取cppblog首页，打印至终端 </p>
		<pre class="console">&gt;curl http://www.cppblog.com</pre>重定向，保存到文件cppblog.html <pre class="console">&gt;curl http://www.cppblog.com</pre>作用同上，使用选项 <pre class="console">&gt;curl -o baidu.html http://www.baidu.com</pre>使用http代理，可指定IP和端口 <pre class="console">&gt;curl -x 202.127.98.43:80 -o baidu.html http:www.baidu.com</pre>在访问一些论坛时，常常要求启用cookie，因为这些网站需要启用cookie来记录sessioin信息,这时需要选项-D，将cookie信息保存起来 <pre class="console">&gt;curl -o cpp.html -c len@cppblog.com[1].txt http://www.cppblog.com</pre><br />先前保存的cookie信息返回给网站,这通常会传回你的一些用户信息。 <pre class="console">&gt;curl -o cpp.html -c len@cppblog.com[2].txt -b len@cppblog.com[1].txt http://www.cppblog.com</pre><img src ="http://www.cppblog.com/len/aggbug/54229.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/len/" target="_blank">len</a> 2008-06-21 16:33 <a href="http://www.cppblog.com/len/archive/2008/06/21/54229.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Xmanager远程连接ubuntu</title><link>http://www.cppblog.com/len/archive/2008/06/01/51839.html</link><dc:creator>len</dc:creator><author>len</author><pubDate>Sun, 01 Jun 2008 13:10:00 GMT</pubDate><guid>http://www.cppblog.com/len/archive/2008/06/01/51839.html</guid><wfw:comment>http://www.cppblog.com/len/comments/51839.html</wfw:comment><comments>http://www.cppblog.com/len/archive/2008/06/01/51839.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/len/comments/commentRss/51839.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/len/services/trackbacks/51839.html</trackback:ping><description><![CDATA[
		<p>涉及到软件：Xmanager 1.3.9 / Windows xp, ubuntu hardy </p>
		<p>第一步，在ubuntu机器上配置好gdm,修改/etc/gdm/gdm.conf-custom,对照添加如下内容：</p>
		<pre class="code">[security]
DisallowTCP=false
[xdmcp]
Enable=true
</pre>
		<p>第二步，性能调优。这步非常关键，不然使用Xmanager登陆速度非常慢，且会报错，主要原因是gnome使用Esound进行声音数据的传送，需要使用TCP 16001端口。所以我建设在ubuntu关掉混音选项。<br />系统-首选项-音效-音效,将“允许软件混音”不要勾选上，<br />系统-首选项-字体-字体渲染,选择"单色",在“细节”的“字体渲染细节”中的平滑和微调选项，都选择"无"。 
</p>
		<p>有用的参考：<a href="http://www.netsarang.com/products/xmg_faq.html" target="_blank">http://www.netsarang.com/products/xmg_faq.html</a></p>
<img src ="http://www.cppblog.com/len/aggbug/51839.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/len/" target="_blank">len</a> 2008-06-01 21:10 <a href="http://www.cppblog.com/len/archive/2008/06/01/51839.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>可爱的Vim</title><link>http://www.cppblog.com/len/archive/2008/05/25/51065.html</link><dc:creator>len</dc:creator><author>len</author><pubDate>Sun, 25 May 2008 12:19:00 GMT</pubDate><guid>http://www.cppblog.com/len/archive/2008/05/25/51065.html</guid><wfw:comment>http://www.cppblog.com/len/comments/51065.html</wfw:comment><comments>http://www.cppblog.com/len/archive/2008/05/25/51065.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.cppblog.com/len/comments/commentRss/51065.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/len/services/trackbacks/51065.html</trackback:ping><description><![CDATA[
		<p>Vim是功能强大的文本编辑器,但是每个工具都有其针对的适用群体。如果你只是偶尔做些文本编辑工作的话，那灵活而又显得繁琐的设置，以及特别的操作方式可能不适合你。但是你是跟我一样，是个平平凡凡的程序员，每天要花费大量时间在写代码,把弄着各式各样的程序语言:C\C++,Python,Tcl,Html,Xml,...，那么你可能需要像Vim这样的工具，即使你要在它上面花费些时间去熟悉和适应它。 </p>
		<p>先讲述一下，我跟Vim相处的过程，这是个从认识，到抛弃，到再认识，到再学习，到喜欢的过程。最早接触到Vim是在Solaris上，需要修改编辑一些配置文件，看着其他工程师们手指随意地在键盘上敲击，就完成内容的修改，根本没有动用到什么鼠标，那是好生羡慕。严格意义来说，那时候碰到还不是Vim，只是VI而已。在终端上工作，没有什么Notepad之类的程序，只好把指令抄在纸上，查查网上的资料，学会了h,j,k,l,w,q,e,这几个简单指类来进行简单的文本查看工作，仅此而己。后来在Windows上安装了VIM，但是挣腾了几下，没有适应过来，也就只好使用UltraEdit了。UltraEdit对一般的纯文本，按Windows习惯来说是蛮好使的。再后来，玩了会儿ruby，又装起了Vim，但是那时候的对Vim的使用也只是限于上面的简单的指令，再加上Vim的插件，来完成语法高亮，ruby中的MVC文件的方便跳转而已，还是没有习惯Vim，有时候还是不经意用UltraEdit来打开查看编辑文件。直到最近，需要编写Docbook，以及用Python，才真正花费了大量时间来学习使用Vim，才真正认识到到它的可爱。 </p>
		<p>接着说说，我为什么使用Vim，觉得值得学习它，喜欢它的理由吧，纯粹以自己的观点来叙述。 </p>
		<p> <strong>跨平台性</strong>，无论在Windows，Linux,Solaris,FreeBSD等等操作系统上，以及一些名都没有听过的系统上，你都可以找到它。这样就保证了你的学习投资的保值性，就拿UltraEdit做对比吧，即使你在UltraEdit上学会灵活运用许多功能，到了Linux上，你在这部分学习投资就没有价值了，你可能需要找其他称手的编辑器，然后再进行学习一些功能。特别在一些古老的大型机上的系统上，即使没有Vim，一般来说，还有Vi的，这样一般简单的操作命令还是可复用的。如果你确定你一直只呆在Windows上可忽略这一点。 </p>
		<p>
				<strong>开源免费</strong>,Vim是开源软件，意味着你可以自由使用，修改，查看它的代码。我对FreeSoftware,Open Source,Copyright，这些都是持中间立场的。对于自由查看，修改程序代的保证，有总比没有好。对于盗版软件，你有能力还是不要使用的好。正是这一特性，也是促使我放弃UE,投向Vim的重要原因。如果你对于使用盗版软件蛮不在乎，或你有财力购买正版软件，也可忽视这一条。 </p>
		<p>
				<strong>支持多种编程语言</strong>，Vim是程序员的编辑器，当然对程序员是非常友好的。它对C,C++,Python,Perl,Tcl,Ruby,PHP等等，以及一大堆我没有听过见过的语言，以语法着色，代码缩进等基本支持，还有一些其他特性。比如，我在编辑XML时，它能提供自动封闭标记的支持。因此如果你有对多种格式的文本编辑需要，那么你就有了一个编辑的大平台，不需用再装一大堆针对某个格式特定的编辑器了。正如跨平台性一样，你只要一次投资，多次回报。如果你专注于某一格式文件的工作，那这一点同样对于你来说是没有用的。 </p>
		<p>
				<strong>高效地编辑</strong>，Vim的操作方式相对于Windows上呆久了的人来说，是蛮奇特的，这一点我深有体会。但是正如很多人讲的那样，你掌握了其操作后，发现它会大大增进你的编辑速度。你的双手根本不用离开键盘，就完成了许多事情，可以让鼠标歇会儿了。如果你特别钟爱鼠标，或只偶尔打打字，那么我说的这点，同样对你没有用。 </p>
		<p>
				<strong>灵活的设置</strong>，Vvim可自定义的地方太多了，你可以自定义键盘映射，语法着色，缩进，格式等等。所以你在网上可以看到许多人贴着自己的vimrc配置文件，配置着自己喜欢的作业环境。如果你需要开盒即用的工具，那么这点对你的吸引力就不大了。 </p>
		<h4>安装</h4>
		<p>可到<a href="http://www.vim.org/download.php#pc" target="_blank">VIM官网</a>，选择Self-install executable形式的安装包下载安装。 </p>
		<h4>帮助</h4>
		<p>帮助非常重要，VIM带有我认为非常好的帮助系统，可以获取你需要的任何有关VIM的详细信息。使用帮助非常简单,只需要:help安装即可。安装后程序带的是英文帮助，如果你对英文不是特别适应的话，可以去<a href="http://vimcdoc.sourceforge.net/">http://vimcdoc.sourceforge.net/</a>下载安装中文帮助，或像我一样直接使用在线的中文帮助<br /><a href="http://vimcdoc.sourceforge.net/doc/help.html">http://vimcdoc.sourceforge.net/doc/help.html</a>。强烈推荐你好好阅读下这一手册，然后完成其中的30分钟教程，这些内容在"初步知识"中。这比你在网上狂搜相关的教程要好得多。再次啰嗦一次，Vim的帮助非常强大，教程也非常好,是你碰到问题时的第一选择。 </p>
		<h4>操作方法</h4>
		<p>对于基本操作方法，通过Vim的教程，你应该能很好的掌握了。一些常见的设置，关于特定类型的配置，因人而异，不想多述。我会列出一些认为比较好的参考文章，置于文尾供参考。但在下面，我还是在Windows下的Vim的使用做点说明，或许你现在用不上。 </p>
		<h4>Vim文件夹结构</h4>
		<p>安装完Vim后，你在其安装目录下应有vim$ver($ver是版本号)和vimfiles两个文件夹。其中vim$ver是vim的程序运行时目录,在里面会看到gvim.exe(vim的GUI),vim.exe,xxd.exe等程序，一大堆的dll动态链接库,还有就是color(语法着色),doc(帮助说明),indent(缩进)等文件夹。在vimfiles内，也会看到color,doc,indent等类似的文件夹，但它们里面没有文件。vim$ver和vimfiles两者有什么区别呢，vim$ver是运行时文件目录，vimfiles相当于个人配置目录，常常有文章说在linux下将什么插件放进.vim下的plugin等等之类的，其.vim在windows下就相当于vimfiles。 </p>
		<h4>标签页</h4>
		<p>Tabpage是Vim后增的功能，类似于UltraEdit的标签页。也想在Windows下使用Untraledit一样，在同一个VIM实例中打开多个文件的话，需要做些小修改。在注册表中删除"HKCR\*\shellex\ContextMenuHandlers\gvim\"主键，然后在Shell下新项"Vim 编辑",再在其下新建command项,然后修改其值为$vimruntime\gvim.exe -p --remote-tab-silent "%1"，其中$vimruntime修改为你系统中VIM实际运行目录。如果你不知道$vimruntime的值，可以打开gvim，输入:echo $vimruntime。你想双击关联文件，也在同一实例打开的话，查找注册表中gvim相关项，将$vimruntime\gvim.exe改为上述的值即可,主要是HKLM\software\classes\application\gvim.exe\shell\edit\command下的值。 </p>
		<h4>文件编码</h4>
		<p>具体可参见"<a href="http://www.ibm.com/developerworks/cn/linux/l-tip-vim1/" target="_blank">Vim实用技术:实用技巧</a>"。我推荐内部编码使用utf-8，以支持国际化，即encoding=utf-8。这需要在_vimrc中进行设置，网上常有人启用这一选项后Vim菜单和消息出现乱码。据我的经验，需要将这encoding=utf-8写在_vimrc最开头，然后设置language message,可参见我的_vimrc文件。 </p>
		<h4>vimrc文件</h4>
		<p>Vim使用中，配置文件vimrc是非常重要的，用:echo $myvimrc，来查看你的vimrc在哪里。<br />如果这为空的话，你可以在$vim目录，建一新的_vimrc文件。<br /><strong>我的vimrc文件<br /></strong></p>
		<pre>set encoding=utf-8
set termencoding=gbk
set nocompatible          " We're running Vim
set nobackup		"We don't need the backup file
set showmatch		"Show where the bracket match
set showcmd
set ruler		"Show the line and column number 
set hlsearch		"Highlight the search key
set backspace=indent,eol,start
set fileencodings=ucs-bom,utf-8,chinese
set guifont=courier_new:h10
set autoindent
syntax on           " Enable syntax highlighting
filetype plugin indent on " Enable filetype-specific indenting and plugins
language message zh_CN.utf-8 " Use chinese message
color zellner		" Color theme</pre>
		<p>其中termencoding=gbk是因为windows中的“命令提示符”窗口只能使用gbk编码，不能像Gnome中的Console那样用utf-8。不设置的情况下，使用“命令提示符”下的vim，而不是gvim时，会出乱码。在设置文件中的色彩和字体，可以先在gvim菜单中设置，然后将你所喜好的，添加到_vimrc文件中。看到我的vimrc文件，你是不是感觉特别短。因为我把许多跟文件类型的相关设置放在其对应的脚本里，扔在vimfiles文件夹了。在vimrc里，例如常见的空格，制表符，缩进都没有在这配置。 </p>
		<h4>杂项</h4>
		<p>Vim中一些内置的变量，你都可以通过:echo varname来查看值，比如：:echo $myvimrc<br />这些变量，注意大小写，常用的有<br />$VIM Vim的安装目录<br />$vimruntime Vim运行时目录<br />$myvimrc 用户的_vimrc文件<br />$home 用户的主目录<br />我常常使用:e $myvimrc来编辑我的vimrc文件，非常方便。 </p>
		<p>对一些带值的配置选项，你可以用:set optionname来查看其当前值，或用:set optionname=val来更改其值.比如:set fileformat查看文件格式，因为dos,unix,mac对于换行是不一样的。:set filemat=unix的话，换行将用LF，而不是dox\windows下的CR,LF。</p>
		<p>
		</p>
		<h4>参考链接</h4>
		<p>IBM开发中心非常实在的Vim实用技术系列：<br /><a href="http://www.ibm.com/developerworks/cn/linux/l-tip-vim1/" target="_blank">Vim实用技术(1)-实用技巧</a><br /><a href="http://www.ibm.com/developerworks/cn/linux/l-tip-vim2/" target="_blank">Vim实用技术(2)-常用插件</a><br /><a href="http://www.ibm.com/developerworks/cn/linux/l-tip-vim3/" target="_blank">Vim实用技术(3)-定制Vim</a></p>
		<p>Easwy的博客，里面有用的信息，更多的Vim资源链接<br /><a href="http://blog.csdn.net/easwy/category/234641.aspx" target="_blank">Vim专栏</a></p>
<img src ="http://www.cppblog.com/len/aggbug/51065.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/len/" target="_blank">len</a> 2008-05-25 20:19 <a href="http://www.cppblog.com/len/archive/2008/05/25/51065.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>小Q和小A的故事之EFS加密</title><link>http://www.cppblog.com/len/archive/2008/03/16/44609.html</link><dc:creator>len</dc:creator><author>len</author><pubDate>Sun, 16 Mar 2008 07:37:00 GMT</pubDate><guid>http://www.cppblog.com/len/archive/2008/03/16/44609.html</guid><wfw:comment>http://www.cppblog.com/len/comments/44609.html</wfw:comment><comments>http://www.cppblog.com/len/archive/2008/03/16/44609.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/len/comments/commentRss/44609.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/len/services/trackbacks/44609.html</trackback:ping><description><![CDATA[
		<p>自从去年底娱乐圈曝出了"艳照门"事件后, 小Q就开始注意自己的私密文件了,在网上google加密软件,想把那些珍藏的AV小电影和情感小日记加密起来,防止一个不小心被人公布.网上的私人出品的小加密软件不敢用,怕被别人留了后门,至于安全性也没有保证.后在网上经高手指点,使用WinRAR软件的加密功能,把一个个文件压缩成包,并设置了密码.这东西倒是简单,但是小Q常常需要回顾一下这些小电影,以解单身之苦,偶尔又写下日记.这样一来,常常就需要输入密码,解压,解渴,压缩,麻烦又耗时，且WinRAR密码又不能太简单，不然有被暴力破解的可能．</p>
		<p>小Q又在忙活了，凑巧被密友小A看到，将情况如实向小A说了．小A是个计算机迷，知道小Q需求后，立即问到：你怎么不用Windows自带的EFS加密呀?</p>
		<p>小Q:什么是EFS加密呀?</p>
		<p>小A:EFS阿，就是Encryption File System,反正跟你说英语也不清楚，就是加密文件系统，是Windows 2000开始所特有的一个实用功能，对于NTFS卷上的文件和数据，都可以直接被操作系统加密保存．EFS加密是基于公钥策略的,安全的很.</p>
		<p>小A就是这样喜欢卖弄一下英语和专业词汇,这样才显得水平高.</p>
		<p>小Q:那你说的公钥策略是什么呀?</p>
		<p>小A:公钥要这可要从加密领域说起.就拿你用WinRAR加密文件来说吧,WinRAR是使用DES对称加密算法,也就是加解密都是用同一个密码.还再教你个新词,搞计算机的人,密码不叫密码,要说成<strong>密钥</strong>,相当于开锁的钥匙,这样才显得X.而公钥策略呢,加解密不是用同一密码,一般加密的叫<strong>公钥</strong>,解密的叫<strong>私钥</strong>.</p>
		<p>小Q:阿,弄得这么麻烦呀,那我给文件加个密后,输入密码后,怎么知道私钥是什么呀?</p>
		<p>小A:这个EFS加密呀,不用你输入密码.它在加密时,会自动为你生成公钥和私钥,公钥和私钥的长度很长.打个比方,如果你平时用到密码很长很复杂,你会怎么办呢?是不是把密码抄在本子什么的,然后用到的时候拿出来看呀.这公钥和密钥的信息就跟所谓的<strong>证书</strong>绑定在一起了,也就相当于小本子.</p>
		<p>小Q:阿,私钥自动生成放在电脑里,那不是相当于还是没有加过密,不安全呀?</p>
		<p>小A:私钥是放在你的硬盘上,但是windows用你的帐户信息为依据又加了层密．如果你能用你的用户帐号登陆系统，也就完成了验证工作．如果你用另外个帐号登陆的话，那些EFS加密过的文件，就无权获取了．即使你不通过windwos系统，获得了存储密钥的物理空间，也是无法进行解密的．这样才显得安全．</p>
		<p>小Q:你说得这些，我也不是怎么懂，就说说怎么用这个EFS吧．</p>
		<p>小A:好的．这个EFS呀，正如我上面所说的，要在Windows2000以上的系统才可以，还有一点，这样高级的功能，家庭版(windows xp home, windows vista home)可用不了．右击你需要加密的文件和文件夹，选择＂属性＂，然后点击＂属性＂对话框的＂高级...＂,在＂高级属性＂中勾选上＂加密内容以便保护数据＂即可．如果不想加密了的话，去掉勾选即可．</p>
		<p>
				<a href="/images/cppblog_com/len/WindowsLiveWriter/QAEFS_1266D/p1_2.jpg">
						<img style="border: 0px none ;" alt="p1" src="http://www.cppblog.com/images/cppblog_com/len/WindowsLiveWriter/QAEFS_1266D/p1_thumb.jpg" border="0" height="234" width="304" />
				</a>  <a href="/images/cppblog_com/len/WindowsLiveWriter/QAEFS_1266D/p2_2.jpg"><img style="border: 0px none ;" alt="p2" src="http://www.cppblog.com/images/cppblog_com/len/WindowsLiveWriter/QAEFS_1266D/p2_thumb.jpg" border="0" height="234" width="331" /></a></p>
		<p>
				<a href="/images/cppblog_com/len/WindowsLiveWriter/QAEFS_1266D/p2_2.jpg">
				</a> </p>
		<p>小Q:好了，这么简单，学会了．</p>
		<p>小A:还没有好呢，再跟你说点．不然到时候，你重装系统，打不开加密的文件又要哭了．我说过这EFS是用公钥策略的，如果没有私钥是你是打不开加密过的文件．然而你重装系统后，原来私钥是由用户信息加密过的，即使你重新取了相同的用户名还是不行的．所以呀，你要装原先的密钥提前备份好，这样加密过的文件，无论在你的电脑里，还是转移到其他NTFS的格式的硬盘里，都可以打开．密钥是与证书关联的，这样我们就要做好证书的备份工作．我简要说下证书备份吧．在开始菜单的＂运行＂中输入certmgr.msc，打开证书管理终端,在个人-证书中，会看到一个预期目的为＂加密文件系统＂的证书，这是在第一次使用加密后自动生成的．右击该证书，在所有任务中，选择＂导出...",通过证书导出向导，按照提示选择对应的选项即可．</p>
		<p>
				<a href="/images/cppblog_com/len/WindowsLiveWriter/QAEFS_1266D/p3_2.jpg">
						<img style="border: 0px none ;" alt="p3" src="http://www.cppblog.com/images/cppblog_com/len/WindowsLiveWriter/QAEFS_1266D/p3_thumb.jpg" border="0" height="234" width="321" />
				</a>
				<a href="/images/cppblog_com/len/WindowsLiveWriter/QAEFS_1266D/p4_2.jpg">
						<img style="border: 0px none ;" alt="p4" src="http://www.cppblog.com/images/cppblog_com/len/WindowsLiveWriter/QAEFS_1266D/p4_thumb.jpg" border="0" height="234" width="321" />
				</a>
		</p>
		<p>在输入密码，选择存储位置后，你会看到你所取名的xxx.pfx文件．下次你重装系统或在别的机子要打开加密的文件，只要要双击.pfx文件，按向导导入即可．这个.pfx文件可要保存好，不要让人拿去了．这个文件相当于钥匙，谁有这把钥匙，谁就能打开加密文件了．</p>
		<p> </p>
		<p>
				<a href="/images/cppblog_com/len/WindowsLiveWriter/QAEFS_1266D/p2_2.jpg">
				</a>
		</p>
<img src ="http://www.cppblog.com/len/aggbug/44609.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/len/" target="_blank">len</a> 2008-03-16 15:37 <a href="http://www.cppblog.com/len/archive/2008/03/16/44609.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>