<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Syndim&#039;s Blog</title>
	<atom:link href="http://blog.syndim.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.syndim.org</link>
	<description>立言，勤思，慎行。</description>
	<lastBuildDate>Sun, 01 Jan 2012 13:06:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>配置Visual Studio 2010来编译wxWidgets项目</title>
		<link>http://blog.syndim.org/2012/01/01/vs2010-wxwidgets-config/</link>
		<comments>http://blog.syndim.org/2012/01/01/vs2010-wxwidgets-config/#comments</comments>
		<pubDate>Sun, 01 Jan 2012 13:06:21 +0000</pubDate>
		<dc:creator>Syndim</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[wxWidgets]]></category>

		<guid isPermaLink="false">http://blog.syndim.org/?p=332</guid>
		<description><![CDATA[1. 包含目录： 在 项目属性-&#62;配置属性-&#62;C/C++-&#62;常规-&#62;附加包含目录 中添加： Release: C:\wxWidgets-2.9.3\include C:\wxWidgets-2.9.3\lib\vc_lib\mswu Debug: C:\wxWidgets-2.9.3\include C:\wxWidgets-2.9.3\lib\vc_lib\mswud 2.静态编译： 在 项目属性-&#62;配置属性-&#62;C/C++-&#62;代码生成-&#62;运行库 中 改为： Release: 多线程(/MT) Debug: 多线程调试(/MTd) &#160; 3.添加链接包含目录： 在 项目属性-&#62;配置属性-&#62;链接器-&#62;常规-&#62;附加库目录 中添加： C:\wxWidgets-2.9.3\lib\vc_lib &#160; 4.添加连接文件 在 项目属性-&#62;配置属性-&#62;链接器-&#62;输入-&#62;附加依赖项 中添加： Release: wxbase29u.lib wxbase29u_net.lib wxbase29u_xml.lib wxexpat.lib wxjpeg.lib wxmsw29u_adv.lib wxmsw29u_aui.lib wxmsw29u_core.lib wxmsw29u_gl.lib wxmsw29u_html.lib wxmsw29u_media.lib wxmsw29u_propgrid.lib wxmsw29u_qa.lib wxmsw29u_ribbon.lib wxmsw29u_richtext.lib wxmsw29u_stc.lib wxmsw29u_xrc.lib wxpng.lib &#8230; <a href="http://blog.syndim.org/2012/01/01/vs2010-wxwidgets-config/"> Continue reading <span class="meta-nav">&#8594; </span></a>]]></description>
			<content:encoded><![CDATA[<p>1. 包含目录：</p>
<p>在 项目属性-&gt;配置属性-&gt;C/C++-&gt;常规-&gt;附加包含目录 中添加：</p>
<p>Release:</p>
<p>C:\wxWidgets-2.9.3\include</p>
<p>C:\wxWidgets-2.9.3\lib\vc_lib\mswu</p>
<p>Debug:</p>
<p>C:\wxWidgets-2.9.3\include</p>
<p>C:\wxWidgets-2.9.3\lib\vc_lib\mswud</p>
<p><span id="more-332"></span></p>
<p>2.静态编译：</p>
<p>在 项目属性-&gt;配置属性-&gt;C/C++-&gt;代码生成-&gt;运行库 中</p>
<p>改为：</p>
<p>Release:</p>
<p>多线程(/MT)</p>
<p>Debug:</p>
<p>多线程调试(/MTd)</p>
<p>&nbsp;</p>
<p>3.添加链接包含目录：</p>
<p>在 项目属性-&gt;配置属性-&gt;链接器-&gt;常规-&gt;附加库目录 中添加：</p>
<p>C:\wxWidgets-2.9.3\lib\vc_lib</p>
<p>&nbsp;</p>
<p>4.添加连接文件</p>
<p>在 项目属性-&gt;配置属性-&gt;链接器-&gt;输入-&gt;附加依赖项 中添加：</p>
<p>Release:</p>
<p>wxbase29u.lib<br />
wxbase29u_net.lib<br />
wxbase29u_xml.lib<br />
wxexpat.lib<br />
wxjpeg.lib<br />
wxmsw29u_adv.lib<br />
wxmsw29u_aui.lib<br />
wxmsw29u_core.lib<br />
wxmsw29u_gl.lib<br />
wxmsw29u_html.lib<br />
wxmsw29u_media.lib<br />
wxmsw29u_propgrid.lib<br />
wxmsw29u_qa.lib<br />
wxmsw29u_ribbon.lib<br />
wxmsw29u_richtext.lib<br />
wxmsw29u_stc.lib<br />
wxmsw29u_xrc.lib<br />
wxpng.lib<br />
wxregexu.lib<br />
wxscintilla.lib<br />
wxtiff.lib<br />
wxzlib.lib<br />
comctl32.lib<br />
rpcrt4.lib</p>
<p>&nbsp;</p>
<p>Debug:</p>
<p>wxbase29ud_net.lib<br />
wxmsw29ud_html.lib<br />
wxbase29ud_xml.lib<br />
wxmsw29ud_adv.lib<br />
wxmsw29ud_aui.lib<br />
wxmsw29ud_gl.lib<br />
wxmsw29ud_media.lib<br />
wxmsw29ud_propgrid.lib<br />
wxmsw29ud_qa.lib<br />
wxmsw29ud_ribbon.lib<br />
wxmsw29ud_richtext.lib<br />
wxmsw29ud_stc.lib<br />
wxmsw29ud_xrc.lib<br />
wxscintillad.lib<br />
wxmsw29ud_core.lib<br />
wxbase29ud.lib<br />
wxtiffd.lib<br />
wxjpegd.lib<br />
wxpngd.lib<br />
wxzlibd.lib<br />
wxexpatd.lib<br />
winmm.lib<br />
comctl32.lib<br />
rpcrt4.lib<br />
wsock32.lib<br />
odbc32.lib</p>
<p>&nbsp;</p>
<p>5.仅Debug，在 项目属性-&gt;配置属性-&gt;C/C++-&gt;预处理器-&gt;预处理器定义 中添加：</p>
<p>;__WXMSW__;__WXDEBUG__</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.syndim.org/2012/01/01/vs2010-wxwidgets-config/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用TeamCity进行ASP.NET MVC3项目的自动化部署</title>
		<link>http://blog.syndim.org/2011/11/17/teamcity-mvc3/</link>
		<comments>http://blog.syndim.org/2011/11/17/teamcity-mvc3/#comments</comments>
		<pubDate>Thu, 17 Nov 2011 14:53:36 +0000</pubDate>
		<dc:creator>Syndim</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[TeamCity]]></category>

		<guid isPermaLink="false">http://blog.syndim.org/?p=317</guid>
		<description><![CDATA[关于如何使用TeamCity进行项目代码检出，编译的文章网络上有很多，但是关于如何进行项目部署，尤其是关于ASP.NET MVC3项目部署的资料却少得可怜。折腾两天后，终于将部署完成，于是记录一下部署的方法： 准备 1 工程的准备 首先要稍微配置一下需要部署的工程，设置部署包的位置和目标IIS上的网站/应用程序名称，如下图：  2 构建(build)服务器的准备 构建服务器上.NET Framework 4和ASP.NET MVC3自然少不了，但是因为这是Web工程，因此仅安装这两个会造成便以失败，如下图： 看出错信息可知是缺少了Visual Studio 2010中的几个文件，需要将VS2010对应目录下的Web和WebApplications两个文件夹复制到构建服务器的相应位置： 除此以外，还需要安装Web deploy，因为我们需要用它来进行上传部署工作。 3 部署服务器的准备 部署服务器上也需要安装Web deploy，注意，不要通过Web Platform Installer安装，使用WebPI安装的话IIS中会缺少一个选项，具体过程可以参照 http://www.troyhunt.com/2010/11/you-deploying-it-wrong-teamcity_24.html 接下来就是TeamCity中的设置 1 创建项目 创建项目在此也不再赘述，详情可以自行谷歌。 2 创建构建配置 自动化部署主要分为三个部分： 1) 构建解决方案，进行单元测试 2) 单元测试通过后对Web项目进行打包 3) 打包完成后执行部署 首先创建构建配置来构建解决方案： 这部分的详细设置可以参考官方文档，在设置完配置文件后保存，返回Add Build Step页面，继续Add build step来添加部署的第二部分： 注意图中空色框部分，这个参数的作用是告诉MSBuild进行项目打包（当然也可以通过将上面的Targets属性设置为Package来实现相同的作用）。在这一步执行完成之后，在配置的目录下会生成用于部署的批处理文件和压缩文件： 生成文件的位置是由项目文件指定的（即由准备的第一步指定）。 保存后继续Add build step。 最后一步用于调用生成的批处理文件执行部署工作： 关于命令行参数的含义： =========================== &#8230; <a href="http://blog.syndim.org/2011/11/17/teamcity-mvc3/"> Continue reading <span class="meta-nav">&#8594; </span></a>]]></description>
			<content:encoded><![CDATA[<p>关于如何使用TeamCity进行项目代码检出，编译的文章网络上有很多，但是关于如何进行项目部署，尤其是关于ASP.NET MVC3项目部署的资料却少得可怜。折腾两天后，终于将部署完成，于是记录一下部署的方法：</p>
<p>准备</p>
<p>1 工程的准备</p>
<p>首先要稍微配置一下需要部署的工程，设置部署包的位置和目标IIS上的网站/应用程序名称，如下图： <a href="http://newpic.syndim.org/pictures/2011-11-17_205138.jpg"><img class="alignnone" title="修改工程" src="http://newpic.syndim.org/pictures/2011-11-17_205138_medium.jpg" alt="" /></a></p>
<p><span id="more-317"></span></p>
<p>2 构建(build)服务器的准备</p>
<p>构建服务器上.NET Framework 4和ASP.NET MVC3自然少不了，但是因为这是Web工程，因此仅安装这两个会造成便以失败，如下图：</p>
<p><a href="http://newpic.syndim.org/pictures/2011-11-17_205813.jpg"><img class="alignnone" title="编译失败" src="http://newpic.syndim.org/pictures/2011-11-17_205813.jpg" alt="" /></a></p>
<p>看出错信息可知是缺少了Visual Studio 2010中的几个文件，需要将VS2010对应目录下的Web和WebApplications两个文件夹复制到构建服务器的相应位置：</p>
<p><a href="http://newpic.syndim.org/pictures/2011-11-17_205858.jpg"><img class="alignnone" title="复制文件" src="http://newpic.syndim.org/pictures/2011-11-17_205858.jpg" alt="" /></a></p>
<p>除此以外，还需要安装Web deploy，因为我们需要用它来进行上传部署工作。</p>
<p>3 部署服务器的准备</p>
<p>部署服务器上也需要安装Web deploy，注意，不要通过Web Platform Installer安装，使用WebPI安装的话IIS中会缺少一个选项，具体过程可以参照 <a href="http://www.troyhunt.com/2010/11/you-deploying-it-wrong-teamcity_24.html">http://www.troyhunt.com/2010/11/you-deploying-it-wrong-teamcity_24.html</a><a href="http://newpic.syndim.org/pictures/2011-11-17_204821.jpg"><img class="alignnone" title="Web Deploy" src="http://newpic.syndim.org/pictures/2011-11-17_204821_medium.jpg" alt="" /></a></p>
<p>接下来就是TeamCity中的设置</p>
<p>1 创建项目</p>
<p>创建项目在此也不再赘述，详情可以自行谷歌。</p>
<p>2 创建构建配置</p>
<p>自动化部署主要分为三个部分：</p>
<p>1) 构建解决方案，进行单元测试</p>
<p>2) 单元测试通过后对Web项目进行打包</p>
<p>3) 打包完成后执行部署</p>
<p>首先创建构建配置来构建解决方案：</p>
<p><a href="http://newpic.syndim.org/pictures/2011-11-17_210025.jpg"><img class="alignnone" title="添加构建配置" src="http://newpic.syndim.org/pictures/2011-11-17_210025_medium.jpg" alt="" /></a></p>
<p><a href="http://newpic.syndim.org/pictures/2011-11-17_210559.jpg"><img class="alignnone" title="构建解决方案" src="http://newpic.syndim.org/pictures/2011-11-17_210559.jpg" alt="" /></a></p>
<p>这部分的详细设置可以参考官方文档，在设置完配置文件后保存，返回Add Build Step页面，继续Add build step来添加部署的第二部分：</p>
<p><a href="http://newpic.syndim.org/pictures/2011-11-17_210715.jpg"><img class="alignnone" title="第二步" src="http://newpic.syndim.org/pictures/2011-11-17_210715.jpg" alt="" /></a></p>
<p>注意图中空色框部分，这个参数的作用是告诉MSBuild进行项目打包（当然也可以通过将上面的Targets属性设置为Package来实现相同的作用）。在这一步执行完成之后，在配置的目录下会生成用于部署的批处理文件和压缩文件：</p>
<p><a href="http://newpic.syndim.org/pictures/2011-11-17_205344.jpg"><img class="alignnone" title="部署文件" src="http://newpic.syndim.org/pictures/2011-11-17_205344_medium.jpg" alt="" /></a></p>
<p>生成文件的位置是由项目文件指定的（即由准备的第一步指定）。</p>
<p>保存后继续Add build step。</p>
<p>最后一步用于调用生成的批处理文件执行部署工作：</p>
<p><a href="http://newpic.syndim.org/pictures/2011-11-17_210844.jpg"><img class="alignnone" title="部署" src="http://newpic.syndim.org/pictures/2011-11-17_210844.jpg" alt="" /></a></p>
<p>关于命令行参数的含义：</p>
<blockquote>
<pre>===========================
必需的标志:
--------------------------
/T:
	使用“-whatif”标志调用 msdeploy.exe，这将模拟部署。此操作不会部署包，而是创建一个报告，报告当您实际部署包时将发生的情况。
/Y:
	不使用“-whatif”标志调用 msdeploy.exe，这会将包部署到当前计算机或目标服务器。在验证通过使用 /T 标志生成的输出之后，请使用 /Y。

注意: 不要在同一条命令中同时使用 /T 和 /Y。

===========================
可选标志:
--------------------------
 默认情况下，在使用当前用户凭据而非代理服务调用此脚本的当前计算机上部署此脚本。仅针对高级方案传递以下值。

/M:&lt;目标服务器名称或服务 URL&gt;
	如果未指定此标志，则在运行命令的计算机上安装此包。服务 URL 的格式可以是:

https://&lt;目标服务器&gt;:8172/MSDeploy.axd

	此格式要求在目标服务器上安装 IIS 7 并且设置 IIS 7 Web 管理服务(WMSvc)和 Web 部署处理程序。
	服务 URL 的格式也可以是:

http://&lt;目标服务器&gt;/MSDeployAgentService

	此格式需要目标服务器上的管理权限并且要求在目标服务器上安装 Web Deploy 远程服务(MsDepSvc)。IIS 7 不必安装在目标服务器上。

/U:&lt;用户名&gt;
/P:&lt;密码&gt;
/G:&lt;True | False&gt;
	指定通过在目标服务器上创建临时侦听器来部署包。这不需要在目标服务器上进行任何特别安装，但要求您是该服务器上的管理员。此标志的默认值是 False。

/A:&lt;Basic | NTLM&gt;
	指定要使用的身份验证的类型。可能值是 NTLM 和 Basic。如果指定 wmsvc 提供程序设置，则默认身份验证类型是 Basic；否则，默认身份验证类型是 NTLM。

/L
	指定将包部署到本地 IISExpress 用户实例。

[其他 msdeploy.exe 标志]
	msdeploy.exe 命令支持其他标志。可以在“$(ProjectName).Deploy.cmd”文件中包括任何其他标志，并在执行过程中将标志传递给 msdeploy.exe。
	或者，也可以通过设置“_MsDeployAdditionalFlags”环境变量来指定其他标志。这些设置由此批处理文件使用。
	注意: 包括等号(=)在内的任何标志值必须包含在双引号内(如以下示例所示)，这样将跳过部署包括在包中的数据库:
		"-skip:objectName=dbFullSql"</pre>
</blockquote>
<p>&nbsp;</p>
<p>例如：/Y /M:https://host:8172/msdeploy.axd /U:user /P:pass /a:basic -allowUntrusted</p>
<p>表示部署到host服务器，使用user作为用户名，pass作为密码，允许不安全链接。</p>
<p>保存后执行build任务，就会发现代码被自动构建并部署到了目标服务器上。配合Github和trigger设置，就能够实现有新代码被推送时能够自动检出并构建部署。</p>
<p><a href="http://newpic.syndim.org/pictures/2011-11-17_211818.jpg"><img class="alignnone" title="部署完成" src="http://newpic.syndim.org/pictures/2011-11-17_211818.jpg" alt="" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.syndim.org/2011/11/17/teamcity-mvc3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用Python抓取QQ空间文章（终）</title>
		<link>http://blog.syndim.org/2011/10/05/python-qzone-end/</link>
		<comments>http://blog.syndim.org/2011/10/05/python-qzone-end/#comments</comments>
		<pubDate>Wed, 05 Oct 2011 01:55:06 +0000</pubDate>
		<dc:creator>Syndim</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[QQ空间]]></category>
		<category><![CDATA[抓取]]></category>

		<guid isPermaLink="false">http://blog.syndim.org/?p=306</guid>
		<description><![CDATA[其实上一篇博文就已经将所有抓取工作解决了，这篇主要是抓取后的一点点处理工作（其实也没有处理完，充其量是个半成品）。 上篇说道使用正则表达式来匹配图片地址，不过上次方案有些缺陷，那就是疼迅给每张图片都加了链接，因此直接匹配会得到很多重复的地址，不过没关系，Python里有个很好用的模块：HTMLParser（Python 3是html.parser）。 文档上有个使用的例子： from HTMLParser import HTMLParser class MyHTMLParser(HTMLParser): def handle_starttag(self, tag, attrs): print "Encountered the beginning of a %s tag" % tag def handle_endtag(self, tag): print "Encountered the end of a %s tag" % tag 很明显的，handle_starttag方法在遇到开始标签时会被调用，而handle_endtag会在遇到结束标签时被调用，所以用HTMLParser结合正则表达式来获取图片地址就很方便了： def handle_starttag(self, tag, attrs): if tag == 'img': pattern = u"http://bd*.photo.store.qq.com/[^"]*" #图片地址 &#8230; <a href="http://blog.syndim.org/2011/10/05/python-qzone-end/"> Continue reading <span class="meta-nav">&#8594; </span></a>]]></description>
			<content:encoded><![CDATA[<p>其实上一篇博文就已经将所有抓取工作解决了，这篇主要是抓取后的一点点处理工作（其实也没有处理完，充其量是个半成品）。</p>
<p>上篇说道使用正则表达式来匹配图片地址，不过上次方案有些缺陷，那就是疼迅给每张图片都加了链接，因此直接匹配会得到很多重复的地址，不过没关系，Python里有个很好用的模块：HTMLParser（Python 3是html.parser）。</p>
<p>文档上有个使用的例子：</p>
<pre class="brush: python; gutter: true">from HTMLParser import HTMLParser

class MyHTMLParser(HTMLParser):

    def handle_starttag(self, tag, attrs):
        print "Encountered the beginning of a %s tag" % tag

    def handle_endtag(self, tag):
        print "Encountered the end of a %s tag" % tag</pre>
<p>很明显的，handle_starttag方法在遇到开始标签时会被调用，而handle_endtag会在遇到结束标签时被调用，所以用HTMLParser结合正则表达式来获取图片地址就很方便了：</p>
<pre class="brush:py">def handle_starttag(self, tag, attrs):
    if tag == 'img':
        pattern = u"http://bd*.photo.store.qq.com/[^"]*"               #图片地址
        prog = re.compile(pattern);
        imgUrl = re.findall(prog, self.get_starttag_text())
        if imgUrl:
              self.imgList.extend(imgUrl)</pre>
<p><span id="more-306"></span></p>
<pre class="brush:py"></pre>
<p>当然不是只定义这样一个方法就行了，使用HTMLParser需要创建自己的类，并继承HTMLParser： </p>
<pre class="brush:py">class PicParser(HTMLParser):</pre>
<p>使用时只需要生成一个PicParser对象，并将网页内容作为参数调用其feed方法即可：</p>
<pre class="brush:py">picParser = PicParser()
picParser.feed(self.content)</pre>
<p>要找出日志的标题和内容，也可以用HTMLParser进行相似的操作，不赘述，详见源码（当然我写的比较ugly，只是没事用用也懒得改了）。</p>
<p>对于评论，疼迅是以JSON格式直接放在页面底端的：</p>
<pre class="brush:js">{"data":{
"ver":"200810",
"blogid":3,
"voteids":0,
"pubtime":1156153664,
"replynum":1,
"category":"不告诉你",
"title":"不告诉你",
"effect":512,
"effect2":0,
"exblogtype":0,
"friendrelation":[],
"lp_type":0,
"lp_id":0,
"lp_style":0,
"orguin":不告诉你,
"orgblogid":3,
"ip":0,
"mention_uins":[ ],
"attach":[],
"replylist":[{"replyid":1,
"replytime":1156209968,
"replyeffect":0,
"replyuin":不告诉你,
"replynick":"不告诉你 ",
"replyautograph":"不告诉你",
"replycontent":"不告诉你 ",
"capacity":不告诉你,
"responsecontent":[ ]}]
}}</pre>
<p>当然上面这段不知包括评论，也包括日志本身的一些信息，这个用正则表达式匹配一些很容易就出来了。</p>
<p>至此，所有的处理工作都完成了，因为评论是JSON，因此标题和正文也处理成了JSON，源码地址在此：</p>
<p><a title="http://goo.gl/HU4Qd" href="http://goo.gl/HU4Qd" target="_blank">http://goo.gl/HU4Qd</a></p>
<p>为什么重建了仓库？嘛……有各种各样的原因……</p>
<p>给个下载：</p>
<p><a title="http://goo.gl/OSaFK" href="http://goo.gl/OSaFK" target="_blank">http://goo.gl/OSaFK</a></p>
<p>使用方法内附。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.syndim.org/2011/10/05/python-qzone-end/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用Python抓取QQ空间文章（2）</title>
		<link>http://blog.syndim.org/2011/09/18/python-qzone-2/</link>
		<comments>http://blog.syndim.org/2011/09/18/python-qzone-2/#comments</comments>
		<pubDate>Sun, 18 Sep 2011 11:16:08 +0000</pubDate>
		<dc:creator>Syndim</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[QQ空间]]></category>

		<guid isPermaLink="false">http://www.syndim.org/?p=291</guid>
		<description><![CDATA[之前写过一篇文章简单说明如何用Python抓取QQ空间的文章，当时的脚本有两个缺陷：1.没有保存日志图片 2.未能获取日志发布时间。 当然原有的脚本还是可以使用的，今天对其进行了修改，改进了上面两个缺陷。 前篇文章说，未能获取日志发布时间的原因是文章是从简版抓取下来的，因此要想获取精确时间，就必须找到完整的日志地址。 在HttpFox的帮助下，地址并不难找： http://b1.cnc.qzone.qq.com/cgi-bin/blognew/blog_output_data?uin=QQ号码&#38;blogid=文章ID 当然前面的二级地址与网络条件有关。这个地址就是真正的日志地址。 只要将上次的脚本进行小幅修改，就可以抓取日志的内容了。 接着要保存图片。 这里只考虑保存在QQ空间相册里的图片，其他图床的情况较复杂，有兴趣的同学可以自行分析。 既然是保存在QQ空间相册中的图片，域名自然是QQ的，但是QQ的图片域名并没有后缀，而是像下面这样： http://b214.photo.store.qq.com/psu?/28499588-e936-4ad1-9d29-8048ecba8c54/TynjoQTxqQWMDDZ43wMDg7x2EemJeXmuQRkFtZ4S7qY!/b/YUAUnX.eAQAAYlIImn99AQAA 上面这个是近期日志的图片地址，下面这个是之前日志的图片地址： http://b210.photo.store.qq.com/http_imgload.cgi?/rurl4_b=d43765322eef1b64785ae3ab1f68a8a7e8f3cd5f08244b76a9981b6e6a62e0f81f601ece0421fac90b29f6c18bb5ea2839f18d666a3069bf880fd98a97d8e857ade443f4479c3719504d07c2033c4ff3e0fcfde6&#38;a=210&#38;b=210 好在腾讯似乎没有做太多的防盗链，也就是说，直接复制上面的地址到浏览器，是可以直接打开的，并且图片的URL只是后面有变化。因此图片地址的正则表达式也就很好写了： http://bd*.photo.store.qq.com/[^"]* 但是因为这个URL是看不出后缀的，因此需要获取MIME类型并判断图片后缀： imgInfo = urllib2.urlopen(image).info() #获取图片信息 这样可以获取图片的所有相关信息，得到的是一个字典类型变量，其中的”Content-Type”项就保存了图片的MIME类型，通过对MIME字符串进行处理，就可以得到图片的后缀。 剩下的就是保存图片的工作了，与保存网页相同，不再赘述。 更新后的代码仍然托管在bitbucket：http://goo.gl/vTNL1。 至此，所有抓取的工作就完成了，剩下的就是对已抓取的内容进行处理，提取日志内容和评论。]]></description>
			<content:encoded><![CDATA[<p>之前写过一篇文章简单说明如何用Python抓取QQ空间的文章，当时的脚本有两个缺陷：1.没有保存日志图片 2.未能获取日志发布时间。</p>
<p>当然原有的脚本还是可以使用的，今天对其进行了修改，改进了上面两个缺陷。</p>
<p>前篇文章说，未能获取日志发布时间的原因是文章是从简版抓取下来的，因此要想获取精确时间，就必须找到完整的日志地址。</p>
<p>在HttpFox的帮助下，地址并不难找：</p>
<pre class="brush:xml">http://b1.cnc.qzone.qq.com/cgi-bin/blognew/blog_output_data?uin=QQ号码&amp;blogid=文章ID</pre>
<p>当然前面的二级地址与网络条件有关。这个地址就是真正的日志地址。<span id="more-291"></span></p>
<p>只要将上次的脚本进行小幅修改，就可以抓取日志的内容了。</p>
<p>接着要保存图片。</p>
<p>这里只考虑保存在QQ空间相册里的图片，其他图床的情况较复杂，有兴趣的同学可以自行分析。</p>
<p>既然是保存在QQ空间相册中的图片，域名自然是QQ的，但是QQ的图片域名并没有后缀，而是像下面这样：</p>
<pre class="brush:xml">http://b214.photo.store.qq.com/psu?/28499588-e936-4ad1-9d29-8048ecba8c54/TynjoQTxqQWMDDZ43wMDg7x2EemJeXmuQRkFtZ4S7qY!/b/YUAUnX.eAQAAYlIImn99AQAA</pre>
<p>上面这个是近期日志的图片地址，下面这个是之前日志的图片地址：</p>
<pre class="brush:xml">http://b210.photo.store.qq.com/http_imgload.cgi?/rurl4_b=d43765322eef1b64785ae3ab1f68a8a7e8f3cd5f08244b76a9981b6e6a62e0f81f601ece0421fac90b29f6c18bb5ea2839f18d666a3069bf880fd98a97d8e857ade443f4479c3719504d07c2033c4ff3e0fcfde6&amp;a=210&amp;b=210</pre>
<p>好在腾讯似乎没有做太多的防盗链，也就是说，直接复制上面的地址到浏览器，是可以直接打开的，并且图片的URL只是后面有变化。因此图片地址的正则表达式也就很好写了：</p>
<pre class="brush:py">http://bd*.photo.store.qq.com/[^"]*</pre>
<p>但是因为这个URL是看不出后缀的，因此需要获取MIME类型并判断图片后缀：</p>
<pre class="brush:py">imgInfo = urllib2.urlopen(image).info()                     #获取图片信息</pre>
<p>这样可以获取图片的所有相关信息，得到的是一个字典类型变量，其中的”Content-Type”项就保存了图片的MIME类型，通过对MIME字符串进行处理，就可以得到图片的后缀。</p>
<p>剩下的就是保存图片的工作了，与保存网页相同，不再赘述。</p>
<p>更新后的代码仍然托管在bitbucket：<a title="http://goo.gl/vTNL1" href="http://goo.gl/vTNL1">http://goo.gl/vTNL1</a>。</p>
<p>至此，所有抓取的工作就完成了，剩下的就是对已抓取的内容进行处理，提取日志内容和评论。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.syndim.org/2011/09/18/python-qzone-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>配置Django的Vim补全（使用Pydiction）</title>
		<link>http://blog.syndim.org/2011/09/06/djang-vim-pydiction/</link>
		<comments>http://blog.syndim.org/2011/09/06/djang-vim-pydiction/#comments</comments>
		<pubDate>Tue, 06 Sep 2011 11:38:19 +0000</pubDate>
		<dc:creator>Syndim</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Pydiction]]></category>
		<category><![CDATA[Vim]]></category>

		<guid isPermaLink="false">http://www.syndim.org/?p=283</guid>
		<description><![CDATA[如今Django已经有不少好用的IDE，不过IDE写起代码来总不够流畅，因此还是希望使用Vim来写Django程序。 但是一想到Django一大堆Field，没有代码提示还是非常难过的。 网上解决的方法大多是使用PySmell，不过那东西需要安装，不够绿色环保，而且速度也实在不快，几经搜索，在万能的StackOverflow找到一种使用Pydiction进行补全的方法。 首先自然要安装Pydiction，不赘述，详情可以请教谷歌。 Pydiction使用的是字典补全，默认的字典包括了Python自带的包，因此想要补全Django就需要生成Django的字典。 不过在生成Django字典需要进行一些设置，不然会生成失败。原因是Django的一些模块依赖于项目的setting。 先用django-admin.py生成一个Django项目 接着配置环境变量 Linux： export DJANGO_SETTINGS_MODULE=settings export PYTHONPATH=/path/to/parent/of/settings Windows（未测试）: DJANGO_SETTINGS_MODULE=settings ::这个就是需要import的包 set PYTHONPATH=%CD%/project/;%PYTHONPATH% ::将刚才生成的project目录路径加入到PYTHONPATH中 然后在项目目录下使用 python pydiction.py django django.conf django.contrib django.core django.db django.dispatch django.forms django.http django.middleware django.shortuts django.template django.templatetags django.utils django.views 创建Django字典（如果把原字典放在该目录下则可以添加到原字典的头面） 以上是网上搜索到的，不过只是这样还是不能补全XXXField，因为上面的目录不包含XXXField的定义。 执行 python pydiction.py django.db.models 即可创建models的字典。 以此类推，如果还有哪个模块不能补全，就这样生成模块字典即可。 配置好Pydiction，就可以补全Django啦～]]></description>
			<content:encoded><![CDATA[<p>如今Django已经有不少好用的IDE，不过IDE写起代码来总不够流畅，因此还是希望使用Vim来写Django程序。</p>
<p>但是一想到Django一大堆Field，没有代码提示还是非常难过的。</p>
<p>网上解决的方法大多是使用PySmell，不过那东西需要安装，不够绿色环保，而且速度也实在不快，几经搜索，在万能的StackOverflow找到一种使用Pydiction进行补全的方法。</p>
<p>首先自然要安装Pydiction，不赘述，详情可以请教谷歌。</p>
<p>Pydiction使用的是字典补全，默认的字典包括了Python自带的包，因此想要补全Django就需要生成Django的字典。</p>
<p>不过在生成Django字典需要进行一些设置，不然会生成失败。原因是Django的一些模块依赖于项目的setting。</p>
<p>先用django-admin.py生成一个Django项目</p>
<p><span id="more-283"></span>接着配置环境变量</p>
<p>Linux：</p>
<pre class="brush:shell">export DJANGO_SETTINGS_MODULE=settings
export PYTHONPATH=/path/to/parent/of/settings</pre>
<p>Windows（未测试）:</p>
<pre class="brush:shell">DJANGO_SETTINGS_MODULE=settings          ::这个就是需要import的包
set PYTHONPATH=%CD%/project/;%PYTHONPATH% ::将刚才生成的project目录路径加入到PYTHONPATH中</pre>
<p>然后在项目目录下使用</p>
<pre class="brush:shell">python pydiction.py django django.conf django.contrib django.core django.db django.dispatch django.forms django.http django.middleware django.shortuts django.template django.templatetags django.utils django.views</pre>
<p>创建Django字典（如果把原字典放在该目录下则可以添加到原字典的头面）</p>
<p>以上是网上搜索到的，不过只是这样还是不能补全XXXField，因为上面的目录不包含XXXField的定义。</p>
<p>执行</p>
<pre class="brush:shell">python pydiction.py django.db.models</pre>
<p>即可创建models的字典。</p>
<p>以此类推，如果还有哪个模块不能补全，就这样生成模块字典即可。</p>
<p>配置好Pydiction，就可以补全Django啦～</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.syndim.org/2011/09/06/djang-vim-pydiction/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Xfce4 下设置开机屏幕亮度</title>
		<link>http://blog.syndim.org/2011/08/30/xfce4-brightness/</link>
		<comments>http://blog.syndim.org/2011/08/30/xfce4-brightness/#comments</comments>
		<pubDate>Tue, 30 Aug 2011 12:23:57 +0000</pubDate>
		<dc:creator>Syndim</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Xfce]]></category>

		<guid isPermaLink="false">http://www.syndim.org/?p=275</guid>
		<description><![CDATA[Gnome3出来很久了，使用到今天，实在觉得这不适合在笔记本上使用，听说Linus同学转投Xfce，于是便将Xfce4请进来。 经过一番配置，Xfce4在老Y（Y450）上运行的还不错，但是有一个问题，屏幕亮度不能保存，每次开机都回恢复到最亮的状态。 请教了Google后，在一个外文博客上发现了解决的方法。 首先要写一个调节屏幕亮度的脚本，只有一句： echo 3 &#62; /sys/class/backlight/acpi_video0/brightness 里面的“3”可以替换为1-10中任意数字，越大越亮。 把这个脚本保存起来，比如保存为~/brightness 把这个脚本移动到/usr/local/sbin/brightness，并增加运行的权限 chmod +x /usr/local/sbin/brightrness 接着，配置允许不输入密码就sudo运行这个脚本，运行visudo，增加下面这行： # User privilege specification syndim ALL=NOPASSWD: /usr/local/sbin/brightness 将上面的syndim替换为用户名。 最后，打开Applications  &#62; Xfce Settings  &#62; Session and startup，将 sudo /usr/local/sbin/brightness 添加进去，重新启动，enjoy~]]></description>
			<content:encoded><![CDATA[<p>Gnome3出来很久了，使用到今天，实在觉得这不适合在笔记本上使用，听说Linus同学转投Xfce，于是便将Xfce4请进来。</p>
<p>经过一番配置，Xfce4在老Y（Y450）上运行的还不错，但是有一个问题，屏幕亮度不能保存，每次开机都回恢复到最亮的状态。</p>
<p>请教了Google后，在一个外文博客上发现了解决的方法。</p>
<p>首先要写一个调节屏幕亮度的脚本，只有一句：</p>
<pre class="brush:shell">echo 3 &gt; /sys/class/backlight/acpi_video0/brightness</pre>
<p>里面的“3”可以替换为1-10中任意数字，越大越亮。</p>
<p><span id="more-275"></span></p>
<p>把这个脚本保存起来，比如保存为~/brightness</p>
<p>把这个脚本移动到/usr/local/sbin/brightness，并增加运行的权限</p>
<pre class="brush:shell">chmod +x /usr/local/sbin/brightrness</pre>
<p>接着，配置允许不输入密码就sudo运行这个脚本，运行visudo，增加下面这行：</p>
<pre class="brush:shell"># User privilege specification
syndim        ALL=NOPASSWD: /usr/local/sbin/brightness</pre>
<p>将上面的syndim替换为用户名。</p>
<p>最后，打开<em>Applications  &gt; Xfce Settings  &gt; </em><em>Session and startup</em>，将</p>
<pre class="brush:shell">sudo /usr/local/sbin/brightness</pre>
<p>添加进去，重新启动，enjoy~</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.syndim.org/2011/08/30/xfce4-brightness/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>更好的管理VIM插件（续） pathogen</title>
		<link>http://blog.syndim.org/2011/08/13/vim-pathogen/</link>
		<comments>http://blog.syndim.org/2011/08/13/vim-pathogen/#comments</comments>
		<pubDate>Sat, 13 Aug 2011 14:35:22 +0000</pubDate>
		<dc:creator>Syndim</dc:creator>
				<category><![CDATA[Vim]]></category>
		<category><![CDATA[插件]]></category>

		<guid isPermaLink="false">http://www.syndim.org/?p=269</guid>
		<description><![CDATA[上次写博文推荐了一个管理Vim插件的插件，Vim Addon Manager，经过一个月的使用，发现了不少问题。有人推荐使用pathogen来管理插件，试用了一下，感觉不错。 首先说说Vim Addon Manager的问题： 1、在windows下使用时，其数据库文件无法正常使用（其实就是个txt，因为一些作者的名字无法正常使用），不过可以通过将文件以UTF-8格式保存来解决。 2、个别插件需要手动修改后才能正常运行（c.vim），当然这个问题使用pathogen时也存在。 3、个别插件需要手动创建plugin目录后才能正常使用。 4、需要安装git，svn，甚至是curl才能正常使用 5，必须插件名称完全与数据库中相同才能正常安装，甚至连大小写都不能错，数据库中有些插件的名字甚至与官方不同，让人费解。 当然pathogen的功能不如Vim Addon Manager那样丰富（他不能自动安装插件），不过符合KISS原则的这个插件还是十分好用。 &#160; 使用方法： 1、下载pathogen.vim，并放到autoload中（当然还有其他的安装方法，详见下文）。 2、在.vimrc（windows是_vimrc）中添加： call pathogen#infect() 3、将所有的插件放到~/.vim/bundle 中（windows是/vimfiles/bundle），比如安装ZenCoding这个插件，在官网上下载插件后，进入bundle文件夹，新建文件夹，命名为ZenCoding（当然名字不是强制为插件名称的，可以设置为任何容易识别的名称），然后将压缩包内容全部解压到该文件夹中即可。 4、打开Vim，Enjoy~ 如果需要生成文档，只需要在Vim中输入 :call pathogen#helptags() 即可。 &#160; 定制： 如果不想以/bundle作为插件的路径，比如想以~/.vim/addons作为插件目录，那么只需将 call pathogen#infect() 替换为 call pathogen#infect("addons") 即可，当然，如果不想将插件放在~/.vim目录中，也可以在括号内填入完整路径： call pathogen#infect('~/src/vim/bundle') 这样，如果将插件放入~/src/vim/bundle中，pathogen就可以找到了。 &#160; 其他： 既然其他插件能够被安装到别的目录下，那么pathogen本身作为一个插件是否也可以安装到别的目录下呢？ 当然可以。 如果希望pathogen和其他插件一样安装在~/.vim/bundle中，只需在.vimrc中加入： source ~/.vim/bundle/vim-pathogen/autoload/pathogen.vim 即可。 &#160; 其他更详细的内容可以在这里找到。]]></description>
			<content:encoded><![CDATA[<p>上次写博文推荐了一个管理Vim插件的插件，Vim Addon Manager，经过一个月的使用，发现了不少问题。有人推荐使用pathogen来管理插件，试用了一下，感觉不错。</p>
<p>首先说说Vim Addon Manager的问题：</p>
<p>1、在windows下使用时，其数据库文件无法正常使用（其实就是个txt，因为一些作者的名字无法正常使用），不过可以通过将文件以UTF-8格式保存来解决。</p>
<p>2、个别插件需要手动修改后才能正常运行（c.vim），当然这个问题使用pathogen时也存在。</p>
<p>3、个别插件需要手动创建plugin目录后才能正常使用。</p>
<p>4、需要安装git，svn，甚至是curl才能正常使用</p>
<p>5，必须插件名称完全与数据库中相同才能正常安装，甚至连大小写都不能错，数据库中有些插件的名字甚至与官方不同，让人费解。</p>
<p>当然pathogen的功能不如Vim Addon Manager那样丰富（他不能自动安装插件），不过符合KISS原则的这个插件还是十分好用。</p>
<p>&nbsp;</p>
<p>使用方法：</p>
<p><span id="more-269"></span></p>
<p>1、<a title="下载" href="http://www.vim.org/scripts/script.php?script_id=2332" target="_blank">下载</a>pathogen.vim，并放到autoload中（当然还有其他的安装方法，详见下文）。</p>
<p>2、在.vimrc（windows是_vimrc）中添加：</p>
<pre class="brush:shell">call pathogen#infect()</pre>
<p>3、将所有的插件放到~/.vim/bundle 中（windows是/vimfiles/bundle），比如安装ZenCoding这个插件，在官网上下载插件后，进入bundle文件夹，新建文件夹，命名为ZenCoding（当然名字不是强制为插件名称的，可以设置为任何容易识别的名称），然后将压缩包内容全部解压到该文件夹中即可。</p>
<p>4、打开Vim，Enjoy~</p>
<p>如果需要生成文档，只需要在Vim中输入</p>
<pre class="brush:shell">:call pathogen#helptags()</pre>
<p>即可。</p>
<p>&nbsp;</p>
<p>定制：</p>
<p>如果不想以/bundle作为插件的路径，比如想以~/.vim/addons作为插件目录，那么只需将</p>
<pre class="brush:shell">call pathogen#infect()</pre>
<p>替换为</p>
<pre class="brush:shell">call pathogen#infect("addons")</pre>
<p>即可，当然，如果不想将插件放在~/.vim目录中，也可以在括号内填入完整路径：</p>
<pre class="brush:shell">call pathogen#infect('~/src/vim/bundle')</pre>
<p>这样，如果将插件放入~/src/vim/bundle中，pathogen就可以找到了。</p>
<p>&nbsp;</p>
<p>其他：</p>
<p>既然其他插件能够被安装到别的目录下，那么pathogen本身作为一个插件是否也可以安装到别的目录下呢？</p>
<p>当然可以。</p>
<p>如果希望pathogen和其他插件一样安装在~/.vim/bundle中，只需在.vimrc中加入：</p>
<pre class="brush:shell">source ~/.vim/bundle/vim-pathogen/autoload/pathogen.vim</pre>
<p>即可。</p>
<p>&nbsp;</p>
<p>其他更详细的内容可以在<a title="这里" href="https://github.com/tpope/vim-pathogen" target="_blank">这里</a>找到。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.syndim.org/2011/08/13/vim-pathogen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>更好的管理Vim插件 vim-addon-manager</title>
		<link>http://blog.syndim.org/2011/07/06/vim-addon-manager/</link>
		<comments>http://blog.syndim.org/2011/07/06/vim-addon-manager/#comments</comments>
		<pubDate>Wed, 06 Jul 2011 01:07:52 +0000</pubDate>
		<dc:creator>Syndim</dc:creator>
				<category><![CDATA[Vim]]></category>
		<category><![CDATA[插件]]></category>

		<guid isPermaLink="false">http://www.syndim.org/?p=252</guid>
		<description><![CDATA[Vim是一个非常优秀的编辑器，但是没装插件的Vim就始终只是个编辑器而已，是插件让Vim变得更加强大。 但是插件装得多了，管理就成了问题，Vim本身并没有提供插件管理功能，往往时间一长，.vim/vimfile 文件夹下就变得杂乱不堪。 vim-addon-manager这个插件就是为了管理Vim插件的插件。 &#160; 介绍： This plugin allows users to install and uninstall plugins with a minimum of work. Features:     - Separate directories for each plugins     - Dependency resolution     - Popular VCS support: plugin supports fetching from Git, Mercurial,       Subversion and Bazaar repositories 简单来说就是可以非常方便的安装和卸载插件。 依赖关系： - Curl, wget or other &#8230; <a href="http://blog.syndim.org/2011/07/06/vim-addon-manager/"> Continue reading <span class="meta-nav">&#8594; </span></a>]]></description>
			<content:encoded><![CDATA[<p>Vim是一个非常优秀的编辑器，但是没装插件的Vim就始终只是个编辑器而已，是插件让Vim变得更加强大。</p>
<p>但是插件装得多了，管理就成了问题，Vim本身并没有提供插件管理功能，往往时间一长，.vim/vimfile 文件夹下就变得杂乱不堪。</p>
<p>vim-addon-manager这个插件就是为了管理Vim插件的插件。</p>
<p>&nbsp;</p>
<p>介绍：</p>
<blockquote>
<div id="LC38">This plugin allows users to install and uninstall plugins with a minimum of work. Features:</div>
<div id="LC41">    - Separate directories for each plugins</div>
<div id="LC42">    - Dependency resolution</div>
<div id="LC43">    - Popular VCS support: plugin supports fetching from Git, Mercurial,</div>
<div id="LC44">      Subversion and Bazaar repositories</div>
</blockquote>
<p>简单来说就是可以非常方便的安装和卸载插件。<span id="more-252"></span></p>
<p>依赖关系：</p>
<blockquote>
<div id="LC47">- Curl, wget or other program that can output URL contents to stdout (in</div>
<div id="LC48">      order to get http protocol support)</div>
<div id="LC49">    - Git, Mercurial, Subversion and Bazaar (if you want to install plugins</div>
<div id="LC50">      from appropriate repositories)</div>
<div id="LC51">    - vcs_checkouts plugin (comes with this addon)</div>
<div id="LC52">    - Either tar, gzip and zip or 7-zip (required for unpacking some addons)</div>
<div id="LC53">    - Vimball plugin (required for installing some addons) (in latest vim it</div>
<div id="LC54">      is included by default)</div>
</blockquote>
<p>linux下基本上安装下git和Mercural就可以开始安装了，windows下就比较麻烦，需要自行下载Curl，7z并将路径加入系统path，并安装msysgit。</p>
<p>在一切准备工作做好之后，就可以开始安装了。</p>
<p>新建一个目录用于存放插件文件，如：</p>
<pre class="brush:shell">~/vim-addons</pre>
<p>然后进入这个文件夹，并下载插件文件：</p>
<pre class="brush:shell">cd ~/vim-addons
git clone git://github.com/MarcWeber/vim-addon-manager.git</pre>
<p>安装完毕，会发现vim-addons文件夹下多了一个vim-addon-manager文件夹，这个文件夹中存放了vim-addon-manager的主要文件。</p>
<p>接着在.vimrc/_vimrc文件夹下添加以下代码：</p>
<pre class="brush:shell">       fun SetupVAM()
          set runtimepath+=~/vim-addons/vim-addon-manager
          " commenting try .. endtry because trace is lost if you use it.
          " There should be no exception anyway
          " try
            call vam#ActivateAddons(['pluginA', 'pluginB'], {'auto_install' : 0})
            " pluginA could be github:YourName see vam#install#RewriteName()
          " catch /.*/
          "  echoe v:exception
          " endtry
        endf
        call SetupVAM()
        " experimental: run after gui has been started (gvim) [3]
        " option1:  au VimEnter * call SetupVAM()
        " option2:  au GUIEnter * call SetupVAM()
        " See BUGS sections below [*]</pre>
<p>将代码中的runtimepath后面改正本机上vim-addon-manager的路径。</p>
<p>然后打开vim（linux下似乎不能直接打开图形版vim？笔者试着直接打开会无法运行，需要在终端中执行gvim打开），首次执行时会下载插件仓库文件（需要git）。</p>
<p>一切完成之后，就可以开始使用了。</p>
<p>安装插件：</p>
<pre class="brush:shell">:InstallAddons {name}</pre>
<p>比如需要安装taglist，就执行：</p>
<pre class="brush:shell">:InstallAddons taglist        #注意大小写</pre>
<p>这里不能不说一下，vim-addons-manager有个不太方便的地方，就是安装插件时插件的名字一定要与仓库中的完全匹配，这就给安装带来了一些麻烦。笔者的做法是自行打开</p>
<pre class="brush:shell">~/vim-addons/vim-addon-manager-known-repositories/plugin/vim-addon-manager-known-repositories.vim</pre>
<p>并在其中查找插件的完整名称，然后进行安装。</p>
<p>激活插件：</p>
<pre class="brush:shell">:ActivateAddons {name}</pre>
<p>如：</p>
<pre class="brush:shell">:ActivateAddons taglist</pre>
<p>不过要注意这样激活的插件在下次打开Vim的时候是不会自动激活的，如果希望每次打开Vim都自动激活该插件，则需要在.vimrc/_vimrc文件中修改如下语句：</p>
<pre class="brush:shell">call vam#ActivateAddons(['pluginA', 'pluginB'], {'auto_install' : 0})</pre>
<p>将其中的“pluginA”，“pluginB”修改为需要激活插件的名字（方括号内可以继续添加），下次启动Vim时就可以自动激活。</p>
<p>事实上，之后同步Vim插件就非常方便了，只需要同步.vimrc/_vimrc文件和vim-addon-manager插件就行了，所有在vam#ActivateAddons中包含的插件在首次运行时会自动安装，是不是很方便呢？</p>
<p>不过有些插件安装后有些问题，比如C/C++ IDE 安装后会找不到template，不过可以通过修改插件来修正。</p>
<p>以上只是一些基础的用法，更详细的使用帮助可以查阅插件的帮助。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.syndim.org/2011/07/06/vim-addon-manager/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>用Python抓取QQ空间文章（1）</title>
		<link>http://blog.syndim.org/2011/04/16/python-qzone-1/</link>
		<comments>http://blog.syndim.org/2011/04/16/python-qzone-1/#comments</comments>
		<pubDate>Sat, 16 Apr 2011 11:28:10 +0000</pubDate>
		<dc:creator>Syndim</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[QQ空间]]></category>
		<category><![CDATA[抓站]]></category>

		<guid isPermaLink="false">http://www.syndim.org/?p=243</guid>
		<description><![CDATA[今天找了点时间看了点Python抓站的教程，便想把自己QQ空间的文章抓下来。 &#160; 一开始想要直接抓站，可是QQ空间满是javascript一时让我无从下手，于是暂时作罢。 &#160; 其实QQ空间还有一个掌上设备的版本， http://qz.qq.com ，这个版本的主页没有使用javascript（但是有些不便的地方，这个之后再说）。 简单分析了一下它的url，因为是面向掌上设备的版本，因此url并不复杂，文章列表的url的基本格式为： &#160; http://qz.qq.com/你的QQ号/bloglist?page=页码 &#160; 而文章url的基本格式为： &#160; http://qz.qq.com/你的QQ号/blog?uin=你的QQ号&#38;vin=0或者你的QQ号&#38;blogid=文章ID &#160; 上面url中“0或者你的QQ号”取决与你是否登录，未登录就是0，登陆后就是你的QQ号（猜测）。 &#160; 需要注意的是，最后的文章ID有两种，一般最近几年发表的日志都是10位数字，而几年前发表的日志则是从1开始的数字，例如，如果你昨天发表了一篇日志，你的url看上去是这样的（假设你的QQ号是10000，且未登录）： &#160; http://qz.qq.com/10000/blog?uin=10000&#38;vin=0&#38;blogid=1234567890 &#160; 而你几年前发表的日志的url看上去则是这样的： &#160; http://qz.qq.com/10000/blog?uin=10000&#38;vin=0&#38;blogid=12 &#160; 因为这个问题让我郁闷了一会。。。 &#160; 知道了这些剩下的工作就可以交给我们的Python了，根据 http://goo.gl/IMPOH 和 http://goo.gl/IfRJn 这两篇文章的说明，使用urllib2包进行抓站操作，花了两个小时的时间，就有了这样一个非常笨拙的代码： http://goo.gl/vTNL1。 &#160; 目前还处在非常原始的状态，只能机械的将抓到的站保存为html文件，而且因为css神马的都在服务器上没有下载下来，所以打开的时候必须要联网。。。不过这些都不是主要问题，我抓站的主要目的是提取其中的文章与评论。 &#160; 前面说过qz.qq.com有个不便的地方，那就是日志的时间显示不是精确时间，而是“两年前”，“三年前”这样的时间，因此抓下来的文章没法转换为我需要的格式，等我用firebug找到完整版日志的地址之后，再继续更新抓站程序吧（偷个懒都不行，腾讯你。。。）。]]></description>
			<content:encoded><![CDATA[<p>今天找了点时间看了点Python抓站的教程，便想把自己QQ空间的文章抓下来。</p>
<p>&nbsp;</p>
<p>一开始想要直接抓站，可是QQ空间满是javascript一时让我无从下手，于是<span style="color: #ff0000;">暂时作罢</span>。</p>
<p>&nbsp;</p>
<p>其实QQ空间还有一个掌上设备的版本， <a title="http://qz.qq.com" href="http://qz.qq.com" target="_blank">http://qz.qq.com</a> ，这个版本的主页没有使用javascript（但是有些不便的地方，这个之后再说）。</p>
<p><span id="more-243"></span></p>
<p>简单分析了一下它的url，因为是面向掌上设备的版本，因此url并不复杂，文章列表的url的基本格式为：</p>
<p>&nbsp;</p>
<pre class="brush:xml">http://qz.qq.com/你的QQ号/bloglist?page=页码</pre>
<p>&nbsp;</p>
<p>而文章url的基本格式为：</p>
<p>&nbsp;</p>
<pre class="brush:xml">http://qz.qq.com/你的QQ号/blog?uin=你的QQ号&amp;vin=0或者你的QQ号&amp;blogid=文章ID</pre>
<p>&nbsp;</p>
<p>上面url中“0或者你的QQ号”取决与你是否登录，未登录就是0，登陆后就是你的QQ号（猜测）。</p>
<p>&nbsp;</p>
<p>需要注意的是，最后的文章ID有两种，一般最近几年发表的日志都是10位数字，而几年前发表的日志则是从1开始的数字，例如，如果你昨天发表了一篇日志，你的url看上去是这样的（假设你的QQ号是10000，且未登录）：</p>
<p>&nbsp;</p>
<pre class="brush:xml">http://qz.qq.com/10000/blog?uin=10000&amp;vin=0&amp;blogid=1234567890</pre>
<p>&nbsp;</p>
<p>而你几年前发表的日志的url看上去则是这样的：</p>
<p>&nbsp;</p>
<pre class="brush:xml">http://qz.qq.com/10000/blog?uin=10000&amp;vin=0&amp;blogid=12</pre>
<p>&nbsp;</p>
<p>因为这个问题让我郁闷了一会。。。</p>
<p>&nbsp;</p>
<p>知道了这些剩下的工作就可以交给我们的Python了，根据 <a title="http://goo.gl/IMPOH" href="http://goo.gl/IMPOH" target="_blank">http://goo.gl/IMPOH</a> 和 <a title="http://goo.gl/IfRJn" href="http://goo.gl/IfRJn" target="_blank">http://goo.gl/IfRJn</a> 这两篇文章的说明，使用urllib2包进行抓站操作，花了两个小时的时间，就有了这样一个非常笨拙的代码： <a title="http://goo.gl/vTNL1" href="http://goo.gl/vTNL1" target="_blank">http://goo.gl/vTNL1</a>。</p>
<p>&nbsp;</p>
<p>目前还处在非常原始的状态，只能机械的将抓到的站保存为html文件，而且因为css神马的都在服务器上没有下载下来，所以打开的时候必须要联网。。。不过这些都不是主要问题，我抓站的主要目的是提取其中的文章与评论。</p>
<p>&nbsp;</p>
<p>前面说过qz.qq.com有个不便的地方，那就是日志的时间显示不是精确时间，而是“两年前”，“三年前”这样的时间，因此抓下来的文章没法转换为我需要的格式，等我用firebug找到完整版日志的地址之后，再继续更新抓站程序吧（偷个懒都不行，腾讯你。。。）。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.syndim.org/2011/04/16/python-qzone-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用PHP空间为GAE做反向代理</title>
		<link>http://blog.syndim.org/2011/03/30/php-proxy-for-gae/</link>
		<comments>http://blog.syndim.org/2011/03/30/php-proxy-for-gae/#comments</comments>
		<pubDate>Wed, 30 Mar 2011 11:10:03 +0000</pubDate>
		<dc:creator>Syndim</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[GAE]]></category>
		<category><![CDATA[反向代理]]></category>
		<category><![CDATA[域名]]></category>

		<guid isPermaLink="false">http://www.syndim.org/?p=226</guid>
		<description><![CDATA[不知道有多少喜欢GAE和Python的人。 众所周知的，GAE已经打不开了，而用于绑定域名的ghs(.)google(.)com也早就被那啥了，因此现在想要给GAE绑定域名必须通过反向代理。 网上关于用VPS来做GAE反向代理的教程有很多，我就不重提了，有VPS的朋友可以参照网上的教程。然而对与我这种穷人，VPS的价格实在让我无法承受，而用VPS专门为GAE做反向代理也有些大材小用的感觉。 在一番搜索之下，终于让我找到一个用PHP空间来为GAE做反向代理的程序。 点此下载：goo.gl/wuagz 下载后打开config.php，照下面的格式修改，上传到空间里去。 $adomain = array('GAE域名','你的域名'); //不要http:// 然后将你的域名绑定到免费空间上，就完成了。]]></description>
			<content:encoded><![CDATA[<p>不知道有多少喜欢GAE和Python的人。</p>
<p>众所周知的，GAE已经打不开了，而用于绑定域名的ghs(.)google(.)com也早就被那啥了，因此现在想要给GAE绑定域名必须通过反向代理。</p>
<p>网上关于用VPS来做GAE反向代理的教程有很多，我就不重提了，有VPS的朋友可以参照网上的教程。然而对与我这种穷人，VPS的价格实在让我无法承受，而用VPS专门为GAE做反向代理也有些大材小用的感觉。</p>
<p>在一番搜索之下，终于让我找到一个用PHP空间来为GAE做反向代理的程序。</p>
<p><span id="more-226"></span></p>
<p>点此下载：<a title="goo.gl/wuagz" href="http://goo.gl/wuagz">goo.gl/wuagz</a></p>
<p>下载后打开config.php，照下面的格式修改，上传到空间里去。</p>
<pre class="brush:php">$adomain = array('GAE域名','你的域名');     //不要http://</pre>
<p>然后将你的域名绑定到免费空间上，就完成了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.syndim.org/2011/03/30/php-proxy-for-gae/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>

