﻿<?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++博客-huyutian-文章分类-网络编程</title><link>http://www.cppblog.com/huyutian/category/12294.html</link><description>他强由他强，清风拂山岗；他横由他横，明月照大江。他自狠来他自恶，我自一口真气足
</description><language>zh-cn</language><lastBuildDate>Mon, 17 Feb 2014 05:01:51 GMT</lastBuildDate><pubDate>Mon, 17 Feb 2014 05:01:51 GMT</pubDate><ttl>60</ttl><item><title>python自学笔记（五） </title><link>http://www.cppblog.com/huyutian/articles/205735.html</link><dc:creator>胡雨田</dc:creator><author>胡雨田</author><pubDate>Sat, 15 Feb 2014 13:12:00 GMT</pubDate><guid>http://www.cppblog.com/huyutian/articles/205735.html</guid><wfw:comment>http://www.cppblog.com/huyutian/comments/205735.html</wfw:comment><comments>http://www.cppblog.com/huyutian/articles/205735.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/huyutian/comments/commentRss/205735.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/huyutian/services/trackbacks/205735.html</trackback:ping><description><![CDATA[部署python程序到google app engine <br />一、gae的部署需要python2.X。于是我的电脑中就不得不又安装了一个python2.7版。为了保证gae访问的是正确的python版本，需要打开Google App Engine Launcher后，选择菜单Edit-&gt;Preference修改python解释器的路径。<br />二、部署demo应用<br />选择菜单File-&gt;Add demo Application-&gt;python-&gt;guestbook可以创建一个demo应用，通过运行demo应用可以了解GAE的开发方法。<br />可惜的是，初次部署完guestbook后，运行会出错。打开Logs会提示错误信息: 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 5px; text-transform: none; background-color: #f5f5f5; font-variant: normal; font-style: normal; text-indent: 0px; margin: 5px 0px; padding-left: 5px; letter-spacing: normal; padding-right: 5px; font-family: 'Courier New' !important; white-space: normal; color: #000000; font-size: 12px !important; overflow: auto; border-top: #cccccc 1px solid; font-weight: normal; border-right: #cccccc 1px solid; word-spacing: 0px; padding-top: 5px; -webkit-text-stroke-width: 0px" class="cnblogs_code"><pre style="margin: 0px 0px 0px 22px; font-family: 'Courier New' !important; word-wrap: break-word; white-space: pre-wrap; font-size: 12px !important">UnicodeDecodeError: 'ascii' codec can't decode byte 0xb0 in position 1: ordinal not in range(128)</pre></div><br class="Apple-interchange-newline" />Google搜索后发现原来是python 2.7的库文件Lib/mimetypes.py存在bug.解决办法参照<a href="http://bugs.python.org/file19332/9291a.patch">这里</a>修改。行前标记+的是需要新增的内容，行前标记-的是要删除的内容。保存退出后，再运行guestbook就没问题了。注意+from itertools import count这一行不要漏掉了。<img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/huyutian/QQ截图20140212222221.jpg" width="793" height="446" /><br />三、本地调试Google App Engine应用<br />错误"from google.appengine.api import urlfetch<br />ImportError: No module named google.appengine.api"。这是因为环境变量没有设置正确。<br />在环境变量增加一条PythonPath=&#8220;your google app engine path&#8221;<br /><img src="http://www.cppblog.com/images/cppblog_com/huyutian/QQ截图20140214222520.jpg" width="357" height="145" alt="" /><br /><div>错误No api proxy found for service "urlfetch"<br />本地调试urlfetch调用时，会遇到这种错误。解决办法<br /><div><div>from google.appengine.api import apiproxy_stub_map</div><div>from google.appengine.api import urlfetch_stub<br /><br /><div>apiproxy_stub_map.apiproxy = apiproxy_stub_map.APIProxyStubMap()&nbsp;</div><div>apiproxy_stub_map.apiproxy.RegisterStub('urlfetch', urlfetch_stub.URLFetchServiceStub())<br />如果需要调试其他gae API（比如mail,datastore),可以添加以下代码<br /><div>from google.appengine.api import datastore_file_stub&nbsp;</div><div>from google.appengine.api import mail_stub&nbsp;</div><div>from google3.apphosting.api import user_service_stub&nbsp;</div><div></div><div>apiproxy_stub_map.apiproxy.RegisterStub('user',&nbsp;</div><div>user_service_stub.UserServiceStub())&nbsp;</div><div>apiproxy_stub_map.apiproxy.RegisterStub('datastore_v3',&nbsp;</div><div>&nbsp; datastore_file_stub.DatastoreFileStub('your_app_id', '/dev/null', '/&nbsp;</div><div>dev/null'))&nbsp;</div><div>apiproxy_stub_map.apiproxy.RegisterStub('mail',&nbsp;</div><div>mail_stub.MailServiceStub())<br /><br />调试gae应用程序，也可以考虑使用在线python调试环境http://py-ide-online.appspot.com/</div><div>或者使用Google提供的unittest功能。可以参考官网文档<a href="https://developers.google.com/appengine/docs/python/tools/localunittesting#Python_Introducing_the_Python_testing_utilities">这里</a>。<br /><br /><div>python ImportError: No module named yaml错误</div><div>我的运行环境是win7 64位，本想使用easy_install pyyaml来安装，结果没找到。</div><div>只好从<a href="https://pypi.python.org/pypi/PyYAML">官网下载</a> pyyaml源码，然后执行：python setup.py --without-libyaml install重新编译并安装。</div></div><div></div></div></div></div></div><pre style="text-transform: none; text-indent: 0px; margin: 0px 0px 0px 22px; letter-spacing: normal; font: 12px/21px 'Courier New'; word-wrap: break-word; white-space: pre-wrap; color: #000000; word-spacing: 0px; -webkit-text-stroke-width: 0px"><span style="line-height: 1.5 !important; font-family: 'Courier New' !important; color: #000000; font-size: 12px !important"></span></pre><img src ="http://www.cppblog.com/huyutian/aggbug/205735.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/huyutian/" target="_blank">胡雨田</a> 2014-02-15 21:12 <a href="http://www.cppblog.com/huyutian/articles/205735.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python自学笔记（六） </title><link>http://www.cppblog.com/huyutian/articles/205763.html</link><dc:creator>胡雨田</dc:creator><author>胡雨田</author><pubDate>Sat, 15 Feb 2014 13:12:00 GMT</pubDate><guid>http://www.cppblog.com/huyutian/articles/205763.html</guid><wfw:comment>http://www.cppblog.com/huyutian/comments/205763.html</wfw:comment><comments>http://www.cppblog.com/huyutian/articles/205763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/huyutian/comments/commentRss/205763.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/huyutian/services/trackbacks/205763.html</trackback:ping><description><![CDATA[Google App Engine编程<br />GAE计划任务：Cron服务<br />GAE的cron服务允许你配置在指定时间或固定间隔周期运行的计划任务。例如，你可以每天发一份电子邮件报告，每隔10分钟更新缓存数据等等。cron使用HTTP GET请求调用一个URL。被cron调用的HTTP请求可以运行长达10分钟，如果期间没有发生另一个HTTP请求。免费GAE应用可以有最多20个计划任务，付费GAE应用可以有100个计划任务。<br />使用计划任务，你需要在GAE应用的根目录下建立一个cron.yaml配置文件，典型的配置文件如下<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->cron:<br />-&nbsp;description:&nbsp;daily&nbsp;summary&nbsp;job<br />&nbsp;&nbsp;url:&nbsp;/tasks/summary<br />&nbsp;&nbsp;schedule:&nbsp;every&nbsp;24&nbsp;hours<br />-&nbsp;description:&nbsp;monday&nbsp;morning&nbsp;mailout<br />&nbsp;&nbsp;url:&nbsp;/mail/weekly<br />&nbsp;&nbsp;schedule:&nbsp;every&nbsp;monday&nbsp;09:00<br />&nbsp;&nbsp;timezone:&nbsp;Australia/NSW<br />-&nbsp;description:&nbsp;new&nbsp;daily&nbsp;summary&nbsp;job<br />&nbsp;&nbsp;url:&nbsp;/tasks/summary<br />&nbsp;&nbsp;schedule:&nbsp;every&nbsp;24&nbsp;hours<br />&nbsp;&nbsp;target:&nbsp;version-2</div>一个cron.yaml文件可以包含多个任务。每个任务必须有一个URL网址和一个schedule。description,timezone和target是可选项。description将显示在管理控制台和开发服务器的管理界面。<br />url域指定你的应用中一个由cron服务调用的地址。<br />schedule格式可以有以下几种<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->every&nbsp;12&nbsp;hours<br />every&nbsp;5&nbsp;minutes&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;10:00&nbsp;to&nbsp;14:00<br />2nd,third&nbsp;mon,wed,thu&nbsp;of&nbsp;march&nbsp;17:00<br />every&nbsp;monday&nbsp;09:00<br />1st&nbsp;monday&nbsp;of&nbsp;sep,oct,nov&nbsp;17:00<br />every&nbsp;day&nbsp;00:00</div><br />上传cron任务<br /><div>你可以使用appcfg.py上传cron任务并查看有关cron任务的信息。使用"appcfg.py update"命令上传更新您的应用，cron服务与cron.yaml的内容更新。你可以用appcfg.py update_cron命令只更新cron配置，而无需上传程序。<br />删除所有cron任务，只需要如下修改cron.yaml。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->cron:</div>GAE关于cron官方文档参见<a href="https://developers.google.com/appengine/docs/python/config/cron">这里</a>。</div><img src ="http://www.cppblog.com/huyutian/aggbug/205763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/huyutian/" target="_blank">胡雨田</a> 2014-02-15 21:12 <a href="http://www.cppblog.com/huyutian/articles/205763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python技巧摘录（一）</title><link>http://www.cppblog.com/huyutian/articles/205669.html</link><dc:creator>胡雨田</dc:creator><author>胡雨田</author><pubDate>Sat, 15 Feb 2014 13:11:00 GMT</pubDate><guid>http://www.cppblog.com/huyutian/articles/205669.html</guid><wfw:comment>http://www.cppblog.com/huyutian/comments/205669.html</wfw:comment><comments>http://www.cppblog.com/huyutian/articles/205669.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/huyutian/comments/commentRss/205669.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/huyutian/services/trackbacks/205669.html</trackback:ping><description><![CDATA[一、将dictionary转换为字符串<br />python 3.0+<br /><div>&gt;&gt;&gt; k = {'MASTER_HOST': '10.178.226.196', 'MASTER_PORT': 9999}</div><div>&gt;&gt;&gt; <span style="color: #0000ff;">', '.join("{!s}={!r}".format(k,v) for (k,v) in k.items())</span></div><div>"MASTER_PORT=9999, MASTER_HOST='10.178.226.196'"<br />python 2.X<br /><div><span style="color: #0000ff;">', '.join("%s=%r" % (key,val) for (key,val) in k.iteritems())</span><br />区别于str()<br /><div>&gt;&gt;&gt; k = {'MASTER_HOST': '10.178.226.196', 'MASTER_PORT': 9999}</div><div>&gt;&gt;&gt; <span style="color: #0000ff;">str(k)</span></div><div>"{'MASTER_PORT': 9999, 'MASTER_HOST': '10.178.226.196'}"<br />二、<span style="background-color: #ffffff; color: #333333; font-family: Verdana, 宋体, Helvetica, sans-serif;">数字转换为以十六进制字符串<br />hex()：注意转换的字符串以0x开头<br /></span><div><span style="color: #0000ff;">'{:x}'.format(int)</span>：转换后去掉了前面的0x<br /><span style="color: #333333; font-family: Verdana, 宋体, Helvetica, sans-serif; background-color: #ffffff;">十六进制的字符串转为十进制数字<br /></span><div>&gt;&gt;&gt; int('0xff',16)</div><div>255</div><div>&gt;&gt;&gt; int('ff',16)</div><div>255</div></div></div></div></div><img src ="http://www.cppblog.com/huyutian/aggbug/205669.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/huyutian/" target="_blank">胡雨田</a> 2014-02-15 21:11 <a href="http://www.cppblog.com/huyutian/articles/205669.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python自学笔记（四）</title><link>http://www.cppblog.com/huyutian/articles/205650.html</link><dc:creator>胡雨田</dc:creator><author>胡雨田</author><pubDate>Sat, 15 Feb 2014 13:10:00 GMT</pubDate><guid>http://www.cppblog.com/huyutian/articles/205650.html</guid><wfw:comment>http://www.cppblog.com/huyutian/comments/205650.html</wfw:comment><comments>http://www.cppblog.com/huyutian/articles/205650.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/huyutian/comments/commentRss/205650.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/huyutian/services/trackbacks/205650.html</trackback:ping><description><![CDATA[知识准备<br />一、安装调用包<br /><div>httplib2是一个功能全面的HTTP client库</div><span style="font-family: Tahoma; font-size: 12px;">1. 官网下载地址</span><br /><div>https://code.google.com/p/httplib2/</div><div><span style="font-size: 12px; font-family: Tahoma;">2.解压安装</span></div><div><span style="font-size: 12px; font-family: Tahoma;">假设解压到：D:/httplib2，命令行执行</span><font face="Tahoma"><span style="font-size: 12px;">D:/httplib2&gt;python setup.py install就ok</span></font><br /><font face="Tahoma"><span style="font-size: 12px;">二、</span></font><span style="font-size: 12px;">使用 pdb 进行调试</span><div><span style="font-size: 12px;">pdb 是 python 自带的一个包，为 python 程序提供了一种交互的源代码调试功能，主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。pdb 提供了一些常用的调试命令。</span></div><div><span style="font-size: 12px;">命令</span><span style="font-size: 12px; white-space: pre;">	           </span><span style="font-size: 12px;">解释</span></div><div><span style="font-size: 12px;">break 或 b &nbsp; 设置断点<span style="white-space:pre">	</span>设置断点</span></div><div><span style="font-size: 12px;">cl &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 清除指定的断点。如果没有带参数,则清除所有断点。</span></div><div><span style="font-size: 12px;">disable &nbsp; &nbsp; &nbsp; &nbsp;取消所有断点的功能,但仍然保留这些断点。</span></div><div><span style="font-size: 12px;">enable &nbsp; &nbsp; &nbsp; &nbsp; 恢复断点的功能。</span></div><div><span style="font-size: 12px;">continue 或 c<span style="white-space:pre">	</span>继续执行程序</span></div><div><span style="font-size: 12px;">list 或 l &nbsp; &nbsp; &nbsp;&nbsp;<span style="white-space:pre">  </span>查看当前行的代码段</span></div><div><span style="font-size: 12px;">step 或 s &nbsp; <span style="white-space: pre;">&nbsp;  </span>进入函数<br /></span><span style="font-size: 12px;">next 或 n</span><span style="font-size: 12px; white-space: pre;">	    </span><span style="font-size: 12px;">执行下一行</span><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">return 或 r &nbsp; &nbsp;执行代码直到从当前函数返回</span></div><div><span style="font-size: 12px;">exit 或 q<span style="white-space:pre">	    </span>中止并退出</span></div><div><span style="font-size: 12px;">p <span style="white-space: pre;">&nbsp;                </span>打印变量的值</span><br /><div><br />有好几种方法来使用pdb：</div><div>1.用python3 -m pdb myscript.py来运行脚本。</div><div>2.在需要调试的代码前面插入pdb.set_trace()。 当然，先要import pdb包。如果觉得麻烦，可以在py文件的开头就调用pdb.set_trace(). 然后就能像gdb一样的调试了。帮助可以用help来查看。</div><div><span style="font-size: 12px;">Python IDLE中进行调试程序</span></div><div><span style="font-size: 12px;">IDLE分python shell窗口和py文件编辑窗口两种窗口。前者是用来debug的，后者是用来编写py文件的。</span></div><div><span style="font-size: 12px;">如果要启用debug功能，需要先在python shell窗口中打开debuger: 点点击Debug-&gt;Debuger。然后在py文件编辑窗口点击Run-&gt;Run Module（或者F5）就可以开始调试了。在开始调试后，可以在py文件编辑窗口用右键来设置断点。</span></div><div></div></div><div></div></div><img src ="http://www.cppblog.com/huyutian/aggbug/205650.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/huyutian/" target="_blank">胡雨田</a> 2014-02-15 21:10 <a href="http://www.cppblog.com/huyutian/articles/205650.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python自学笔记（三）</title><link>http://www.cppblog.com/huyutian/articles/205632.html</link><dc:creator>胡雨田</dc:creator><author>胡雨田</author><pubDate>Sat, 15 Feb 2014 13:09:00 GMT</pubDate><guid>http://www.cppblog.com/huyutian/articles/205632.html</guid><wfw:comment>http://www.cppblog.com/huyutian/comments/205632.html</wfw:comment><comments>http://www.cppblog.com/huyutian/articles/205632.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/huyutian/comments/commentRss/205632.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/huyutian/services/trackbacks/205632.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp; &nbsp; &nbsp;这次学习的目标是实现115.com的自动登录、签到、摇一摇。115是国内流行的网盘。容量大，可分享的资源丰富。115网站为吸引用户，设置了签到功能和摇一摇功能。本篇希望写出一个能自动登录签到的python程序。搜索了一下，网上已经有高手9deadblue@gmail.com写好：妖妖舞娘为一个Google App Engine（GAE）应用，利用GAE的调度...&nbsp;&nbsp;<a href='http://www.cppblog.com/huyutian/articles/205632.html'>阅读全文</a><img src ="http://www.cppblog.com/huyutian/aggbug/205632.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/huyutian/" target="_blank">胡雨田</a> 2014-02-15 21:09 <a href="http://www.cppblog.com/huyutian/articles/205632.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python自学笔记（二）</title><link>http://www.cppblog.com/huyutian/articles/205631.html</link><dc:creator>胡雨田</dc:creator><author>胡雨田</author><pubDate>Tue, 04 Feb 2014 01:43:00 GMT</pubDate><guid>http://www.cppblog.com/huyutian/articles/205631.html</guid><wfw:comment>http://www.cppblog.com/huyutian/comments/205631.html</wfw:comment><comments>http://www.cppblog.com/huyutian/articles/205631.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/huyutian/comments/commentRss/205631.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/huyutian/services/trackbacks/205631.html</trackback:ping><description><![CDATA[python自带的IDLE用来写写简单的小程序是足够了，但如果打算认真学python，还是有必要配置一个良好的开发环境。参考了网上的大量文章，最终我选择了sublime text 2。<br />sublime text 2 是非常好用的免费跨平台编辑器，目前从<a href="http://www.sublimetext.com/2">官网</a>可以下载最新的2.02版本。安装好后本身默认支持build python(快捷键Ctrl+B)。但是<span style="font-size: 12px;">代码中如果使用了input等函数进行交互的时候，运行信息栏内无法输入交互信息，程序还会提示报错。</span><br /><span style="font-size: 12px;">sublime text 2支持灵活的自定义和package插件。</span><br /><div><span style="font-size: 12px;">安装Sublime Text 2插件有两种方法：</span></div><div><span style="font-size: 12px;">1.直接安装</span></div><div><span style="font-size: 12px;">直接下载插件安装包解压缩到Packages目录（菜单-&gt;preferences-&gt;packages）。</span></div><div><span style="font-size: 12px;">2.</span><span style="font-size: 12px;">使用Package Control组件安装</span></div><div><span style="font-size: 12px;">先安装package control组件，然后直接在线安装。</span><span style="font-size: 12px;">按Ctrl+`调出console</span></div><div><span style="font-size: 12px;">粘贴以下代码到底部命令行并回车（参考<a href="https://sublime.wbond.net/installation">这里</a>）：<br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span>&nbsp;urllib2,os;pf=<span style="color: #800000; ">'</span><span style="color: #800000; ">Package&nbsp;Control.sublime-package</span><span style="color: #800000; ">'</span>;ipp=sublime.installed_packages_path();os.makedirs(ipp)&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;<span style="color: #0000FF; ">not</span>&nbsp;os.path.exists(ipp)&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;None;open(os.path.join(ipp,pf),<span style="color: #800000; ">'</span><span style="color: #800000; ">wb</span><span style="color: #800000; ">'</span>).write(urllib2.urlopen(<span style="color: #800000; ">'</span><span style="color: #800000; ">http://sublime.wbond.net/</span><span style="color: #800000; ">'</span>+pf.replace(<span style="color: #800000; ">'</span><span style="color: #800000; ">&nbsp;</span><span style="color: #800000; ">'</span>,<span style="color: #800000; ">'</span><span style="color: #800000; ">%20</span><span style="color: #800000; ">'</span>)).read())</div></div><div><span style="font-size: 12px;">重启Sublime Text 2。</span></div><div><span style="font-size: 12px;">如果在Perferences-&gt;package settings中看到package control这一项，就表示安装成功啦。有时候package安装失败是因为</span><span style="color: #222222; font-family: 微软雅黑, 宋体, 'Trebuchet MS', Tahoma, Arial, sans-serif; line-height: 22px; background-color: #ffffff;">github网络访问出错。可以考虑</span>使用GoAgent代理科学上网下载Package后直接安装。</div><div><span style="font-size: 12px;">用Package Control安装插件的方法：</span></div><div><span style="font-size: 12px;">按下Ctrl+Shift+P调出命令面板，</span><span style="font-size: 12px;">输入install 调出 Install Package 选项并回车，然后在列表中选中要安装的插件。<br /><br /></span><span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">SublimeREPL 插件可以完美支持python的build和debug。</span></div>为<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">SublimeREPL</span>配置快捷键<br />打开sublime text 2, 选菜单Preferences -&gt;key Bindings User增加以下代码，就为Python增加了两个快捷键：F5 - &#8220;Python RUN current file&#8221;<br />Ctrl+F5 - &#8220;Python - PDB current file&#8221;。更多关于如何设置快捷键可以参照官网<a href="http://sublimetext.info/docs/en/reference/key_bindings.html">这里</a>。快捷键的设置，最重要的是要找到应用的id和文件位置，<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">SublimeREPL与python有关的各项id可以参照</span><a href="https://github.com/wuub/SublimeREPL/blob/master/config/Python/Default.sublime-commands">网页</a>，也可以在你安装的sublime text 2目录下找到Default.sublime-commands文件，我选择的默认安装，对应目录是C:\Users\*****\AppData\Roaming\Sublime Text 2\Packages\SublimeREPL\config\Python<br />更多有关sublime text 2自定义快捷键，可以参照<a href="http://docs.sublimetext.info/en/latest/customization/key_bindings.html">这里</a><span style="font-size: 12px;">。</span><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->[<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">keys</span><span style="color: #800000; ">"</span>:&nbsp;[<span style="color: #800000; ">"</span><span style="color: #800000; ">f5</span><span style="color: #800000; ">"</span>],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">caption</span><span style="color: #800000; ">"</span>:&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">SublimeREPL:&nbsp;Python&nbsp;-&nbsp;RUN&nbsp;current&nbsp;file</span><span style="color: #800000; ">"</span>,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">command</span><span style="color: #800000; ">"</span>:&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">run_existing_window_command</span><span style="color: #800000; ">"</span>,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">args</span><span style="color: #800000; ">"</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">id</span><span style="color: #800000; ">"</span>:&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">repl_python_run</span><span style="color: #800000; ">"</span>,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">file</span><span style="color: #800000; ">"</span>:&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">config/Python/Main.sublime-menu</span><span style="color: #800000; ">"</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">keys</span><span style="color: #800000; ">"</span>:&nbsp;[<span style="color: #800000; ">"</span><span style="color: #800000; ">ctrl+f5</span><span style="color: #800000; ">"</span>],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">caption</span><span style="color: #800000; ">"</span>:&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">SublimeREPL:&nbsp;Python&nbsp;-&nbsp;PDB&nbsp;current&nbsp;file</span><span style="color: #800000; ">"</span>,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">command</span><span style="color: #800000; ">"</span>:&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">run_existing_window_command</span><span style="color: #800000; ">"</span>,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">args</span><span style="color: #800000; ">"</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">id</span><span style="color: #800000; ">"</span>:&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">repl_python_pdb</span><span style="color: #800000; ">"</span>,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">file</span><span style="color: #800000; ">"</span>:&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">config/Python/Main.sublime-menu</span><span style="color: #800000; ">"</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />]</div><img src ="http://www.cppblog.com/huyutian/aggbug/205631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/huyutian/" target="_blank">胡雨田</a> 2014-02-04 09:43 <a href="http://www.cppblog.com/huyutian/articles/205631.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>异步方式调用WinInet </title><link>http://www.cppblog.com/huyutian/articles/122994.html</link><dc:creator>胡雨田</dc:creator><author>胡雨田</author><pubDate>Tue, 10 Aug 2010 14:52:00 GMT</pubDate><guid>http://www.cppblog.com/huyutian/articles/122994.html</guid><wfw:comment>http://www.cppblog.com/huyutian/comments/122994.html</wfw:comment><comments>http://www.cppblog.com/huyutian/articles/122994.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/huyutian/comments/commentRss/122994.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/huyutian/services/trackbacks/122994.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 关于WinInet的异步模式，微软给过很多例子，但我觉得下面这个是比较好理解的。原文地址，代码贴出来，有些细节部分还要自己慢慢体会。我在调试过程中，还参照了以下一些链接关于GetLastError返回1201（ERROR_INTERNET_INCORRECT_HANDLE_STATE）9错误的解决办法请参见下面两个链接http://support.genopro.com/Topic14017-59...&nbsp;&nbsp;<a href='http://www.cppblog.com/huyutian/articles/122994.html'>阅读全文</a><img src ="http://www.cppblog.com/huyutian/aggbug/122994.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/huyutian/" target="_blank">胡雨田</a> 2010-08-10 22:52 <a href="http://www.cppblog.com/huyutian/articles/122994.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OpenSSL在Windows下的编译</title><link>http://www.cppblog.com/huyutian/articles/100862.html</link><dc:creator>胡雨田</dc:creator><author>胡雨田</author><pubDate>Fri, 13 Nov 2009 04:38:00 GMT</pubDate><guid>http://www.cppblog.com/huyutian/articles/100862.html</guid><wfw:comment>http://www.cppblog.com/huyutian/comments/100862.html</wfw:comment><comments>http://www.cppblog.com/huyutian/articles/100862.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/huyutian/comments/commentRss/100862.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/huyutian/services/trackbacks/100862.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最近在分析一个软件时需要用到加密算法，然后在网上搜索了一下，对比了网上的几个开源的加密库，最后选定OpenSSL。OpenSSL是用C写的，但包含有很多面向对象的特征，而且代码效率很高。个人觉得比起CryptPP库来容易理解，也易于使用。CryptPP是用C++写的，类的继承关系太复杂，类库代码调试、分析较难。而且OpenSSL还可以根据要求定制编译，比如某些不需要的加密算法可以屏蔽掉，这样裁减出来的库尺寸会小一些。下面说说我的OpenSSL的编译。<br>OpenSSL在Windows下的编译，如果使用默认配置其实不难。大致分三步，下载openssl源代码和安装Perl就不说了。<br>1)perl Configure VC-WIN32<br>2)ms\do_masm<br>3)执行nmake -f ms\nt.mak生成静态库，或者执行nmake -f ms\ntdll.mak生成动态库，在nmake之前最好先到VC安装目录下运行一下vcvar32.bat重新设置一下编译的路径和环境变量。<br>但是如果是定制编译就比较难了，摸索了很长时间，经常出现编译错误。直到无意中看了一下openssl目录下的INSTALL.W32,很多答案才找到。<br>这是一个教训啊，看来，什么东西拿到手上都应该仔细看看，而不应该拿到就想马上上手，这样反而可能还要多走一些弯路。很多时候盲目的在网上搜索问题的解决办法，还不如老老实实研究自带的帮助和说明，苦苦寻找的答案可能就在其中。其实开始我也不是没有看INSTALL.W32这个文档，只是不太仔细，只看了前面的编译方法，没看后面的Troubleshooting。个人认为要定制编译OpenSSL，Troubleshooting一节很重要，就用google翻译了一下，放在这里以免遗忘。</p>
<p><br><strong>疑难排解<br></strong>由于Win32下的编译只是偶尔进行测试，可能并不总是编译干净。当您运行MS \ do_ms，如果得到一个有关函数没有指定序号错误， <br>那么这意味着在Win32原始文件过期。你可以： <br>&gt; perl util\mkdef.pl crypto ssl update<br>然后，ms\do_xxx不应再警告了。然而这种方法得到的序号可能不能匹配CVS树指定的序号，所以任何对这个版本的库的链接可能需要重新编译。 <br>如果你的错误是有关不能解析符号变量的(unresolved symbols)，有几种可能的原因。 <br>如果你已禁用某些加密算法，该DLL被链接时发生这种情况，则有可能是DEF文件生成时没有清除所有关闭的符号。最简单的办法是编辑DEF文件手动将其删除。DEF文件是 ms\libeay32.def和ms\ ssleay32.def。<br>另一个原因是，你略过了上面提到的missing numbers错误。<br>如果出现警告，编译将会停止。 <br>出现任何警告，Win32默认的Makefile将会停止。由于VC + + 对待警告有自己的做法，并不一定与其他环境发生这种情况时相符。最好的解决方法是编辑有警告的文件并修复它。或者，也可以通过编辑Makefile中CFLAG行，删除/WX选项，来关闭警告。</p>
<p>&nbsp;您可能会得到编译错误。同样你要修复这些或报告他们。 </p>
<p>&nbsp;编译连接OpenSSL库的应用程序，如果你不使用多线程DLL运行时库（/md选项）您的程序几乎肯定会崩溃，因为malloc陷入混乱-在 <br>&nbsp; OpenSSL DLL静态链接到一个版本，应用程序必须使用同一个版本。加CRYPTO_malloc_init()到程序调用OpenSSL库之前，可能能够解决这些问题 ：这会告诉OpenSSL库使用与应用程序相同的malloc(),free()和realloc()。但是OpenSSL调用的很多标准库函数内部用到malloc() <br>&nbsp; （例如fopen()函数）,OpenSSL不能改变这些，所以一般不能依靠CRYPTO_malloc_init()解决您的问题，您应该 坚持用多线程库。<br></p>
<p><br><strong>连接应用程序</strong><br>如果您链接静态OpenSSL库[built with ms/nt.mak]，那么你需要额外链接WSOCK32.LIB，ADVAPI32.LIB，GDI32.LIB和USER32.LIB。这些开发非交互式服务应用程序可能会关注后两个库的连接，因为他们仅与交互桌面相关，对服务进程不可用。该工具包的设计检测它的目前执行的，GUI，控制台应用程序或服务，并采取相应的行动，即是否实际上使 图形用户界面调用。 </p>
<p>&nbsp;如果您链接使用OpenSSL.DLLs，那么希望你将连接OpenSSL BIO layer和编译器运行时库的小&#8220;垫片&#8221;片段包含到您的应用程序代码。更多详情查一查OPENSSL_Applink引用页。</p>
<p>&nbsp;<br>
<hr>
<br>对OpenSSL的Win32编译环境可以进行多种调整。默认情况下是不编译调试符号的。编译调试符号需要在do_*批处理文件中添加'debug'&nbsp;到&nbsp;mk1mf.pl行。注意mk1mf.pl需要platform是命令行的最后一个参数，所以'debug'必须出现在此之前。 <br><br>0.9.8 OpenSSL默认编译ENGINES到libeay32.dll库。如果在命令行对Configure 指定了&#8220;no-static-engine&#8221;选项，共享库构建时（ms\ntdll.mak）将编译<br>engines作为单独的DLL。<br><br>&nbsp;默认Win32环境是略去任何Windows NT特征。如果你想OpenSSL允许NT特征（目前只logging BIO）按照上述操作，但调用批处理文件时用do_nt.bat&nbsp;代替do_ms.bat。<br>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/huyutian/aggbug/100862.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/huyutian/" target="_blank">胡雨田</a> 2009-11-13 12:38 <a href="http://www.cppblog.com/huyutian/articles/100862.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>