<?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>vifix.cn &#187; Python</title>
	<atom:link href="http://vifix.cn/blog/tag/python/feed" rel="self" type="application/rss+xml" />
	<link>http://vifix.cn/blog</link>
	<description>compile the dream, compile tomorrow</description>
	<lastBuildDate>Sun, 20 May 2012 15:26:15 +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>DoubanFM-CLI</title>
		<link>http://vifix.cn/blog/doubanfm-cli.html</link>
		<comments>http://vifix.cn/blog/doubanfm-cli.html#comments</comments>
		<pubDate>Wed, 12 Oct 2011 09:14:36 +0000</pubDate>
		<dc:creator>Mac</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://vifix.cn/blog/?p=2158</guid>
		<description><![CDATA[嗯……一直想在Linux下面搞个好使的豆瓣FM客户端好在工作时听听（不然要专门开个浏览器），于是google了下找到了这个，于是什么桌面客户端之类的弱爆了啊，这个才是Geeker听音乐的方式 = 。 = 东西是Python写的，代码短小精干，也可以自己研究下 github: https://github.com/zhendi/DoubanFM-CLI 作者豆瓣: http://www.douban.com/people/KaKa9527/]]></description>
			<content:encoded><![CDATA[<p><a href="http://vifix.cn/blog/wp-content/uploads/2011/10/douban_cli.png" rel="shadowbox[sbpost-2158];player=img;" title="douban_cli"><img class="alignnone size-medium wp-image-2160" title="douban_cli" src="http://vifix.cn/blog/wp-content/uploads/2011/10/douban_cli-300x187.png" alt="" width="300" height="187" /></a></p>
<p>嗯……一直想在Linux下面搞个好使的豆瓣FM客户端好在工作时听听（不然要专门开个浏览器），于是google了下找到了这个，于是什么桌面客户端之类的弱爆了啊，这个才是Geeker听音乐的方式 = 。 =</p>
<p>东西是Python写的，代码短小精干，也可以自己研究下</p>
<p>github: <a href="https://github.com/zhendi/DoubanFM-CLI" target="_blank" onclick="pageTracker._trackPageview('/outgoing/github.com/zhendi/DoubanFM-CLI?referer=');">https://github.com/zhendi/DoubanFM-CLI</a></p>
<p>作者豆瓣: <a href="http://www.douban.com/people/KaKa9527/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.douban.com/people/KaKa9527/?referer=');">http://www.douban.com/people/KaKa9527/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://vifix.cn/blog/doubanfm-cli.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Python S60蓝牙终端与PC交互</title>
		<link>http://vifix.cn/blog/python-s60-bluetooth-console-with-xp-hyper-terminal.html</link>
		<comments>http://vifix.cn/blog/python-s60-bluetooth-console-with-xp-hyper-terminal.html#comments</comments>
		<pubDate>Tue, 15 Jun 2010 16:00:28 +0000</pubDate>
		<dc:creator>Mac</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[S60]]></category>

		<guid isPermaLink="false">http://vifix.cn/blog/?p=1468</guid>
		<description><![CDATA[嘛……Python S60的一个比较Geeker的玩法。通过蓝牙串口通信连接到PC的串口通信的终端软件（已经差不多都快被遗忘了吧，这类软件），从而在PC上使用实际上运行在手机中的Python Shell并达到控制手机的目的。 在Windows XP中，可以使用XP内建的“超级终端”（HyperTerminal）来进行串口的点对点通信。 首先要在PC上开启一个蓝牙串口，我用的是蓝牙驱动程序是BlueSoleil，安装后就已经默认打开了COM6和COM8两个端口，我这里使用的是COM6。 然后启动超级终端，然后建立一个串口的连接，修改其属性和使用的端口为需要使用的COM6分端口。接下去开启手机的Python Shell，启用它的Bluetooth Console，然后选择PC和对应的端口即可完成连接。 接下去PC上的超级终端内就已经是那个熟悉的Python Shell了，可以输入print(&#8220;hello, world&#8221;)试试和世界打个招呼，当然也可以使用其它所有的Python S60提供的API，正如上面第一张截图的： import audio audio.say&#40;&#34;hello, master&#34;&#41; 手机当场会以它特有的电子音说出上面这句话来和它的主人问候 囧 另外也可以实现在终端里面发送短信，代码： import scriptext messaging_handle = scriptext.load&#40;'Service.Messaging', 'IMessaging'&#41; messaging_handle.call&#40;'Send', &#123;'MessageType': u'SMS', 'To': u'12345678', 'BodyText': u'Here is a message from python s60 shell.'&#125;&#41; 除此之外还有许多好玩的东西，可以去docs里面慢慢挖掘。 总体来说Python S60可用性真的非常高，基本上手机能支持的功能它都有API提供了，接下去可以好好在这方面研究一下。]]></description>
			<content:encoded><![CDATA[<p><a href="http://vifix.cn/blog/wp-content/uploads/2010/06/hyper-terminal.jpg" rel="shadowbox[sbpost-1468];player=img;" title="hyper-terminal"><img class="alignnone size-medium wp-image-1470" title="hyper-terminal" src="http://vifix.cn/blog/wp-content/uploads/2010/06/hyper-terminal-300x197.jpg" alt="" width="300" height="197" /></a></p>
<p>嘛……Python S60的一个比较Geeker的玩法。通过蓝牙串口通信连接到PC的串口通信的终端软件（已经差不多都快被遗忘了吧，这类软件），从而在PC上使用实际上运行在手机中的Python Shell并达到控制手机的目的。</p>
<p><span id="more-1468"></span>在Windows XP中，可以使用XP内建的“超级终端”（HyperTerminal）来进行串口的点对点通信。</p>
<p>首先要在PC上开启一个蓝牙串口，我用的是蓝牙驱动程序是BlueSoleil，安装后就已经默认打开了COM6和COM8两个端口，我这里使用的是COM6。</p>
<p><a href="http://vifix.cn/blog/wp-content/uploads/2010/06/bluesoleil.jpg" rel="shadowbox[sbpost-1468];player=img;" title="bluesoleil"><img class="alignnone size-medium wp-image-1472" title="bluesoleil" src="http://vifix.cn/blog/wp-content/uploads/2010/06/bluesoleil-300x255.jpg" alt="" width="300" height="255" /></a></p>
<p>然后启动超级终端，然后建立一个串口的连接，修改其属性和使用的端口为需要使用的COM6分端口。接下去开启手机的Python Shell，启用它的Bluetooth Console，然后选择PC和对应的端口即可完成连接。</p>
<p><a href="http://vifix.cn/blog/wp-content/uploads/2010/06/Screenshot0007.jpg" rel="shadowbox[sbpost-1468];player=img;" title="Screenshot0007"><img class="alignnone size-medium wp-image-1471" title="Screenshot0007" src="http://vifix.cn/blog/wp-content/uploads/2010/06/Screenshot0007-300x225.jpg" alt="" width="300" height="225" /></a></p>
<p>接下去PC上的超级终端内就已经是那个熟悉的Python Shell了，可以输入print(&#8220;hello, world&#8221;)试试和世界打个招呼，当然也可以使用其它所有的Python S60提供的API，正如上面第一张截图的：</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> audio
audio.<span style="color: black;">say</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;hello, master&quot;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>手机当场会以它特有的电子音说出上面这句话来和它的主人问候 囧<br />
另外也可以实现在终端里面发送短信，代码：</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> scriptext
messaging_handle = scriptext.<span style="color: black;">load</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Service.Messaging'</span>, <span style="color: #483d8b;">'IMessaging'</span><span style="color: black;">&#41;</span>
messaging_handle.<span style="color: black;">call</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Send'</span>, <span style="color: black;">&#123;</span><span style="color: #483d8b;">'MessageType'</span>: u<span style="color: #483d8b;">'SMS'</span>, <span style="color: #483d8b;">'To'</span>: u<span style="color: #483d8b;">'12345678'</span>, <span style="color: #483d8b;">'BodyText'</span>: u<span style="color: #483d8b;">'Here is a message from python s60 shell.'</span><span style="color: black;">&#125;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>除此之外还有许多好玩的东西，可以去docs里面慢慢挖掘。<br />
总体来说Python S60可用性真的非常高，基本上手机能支持的功能它都有API提供了，接下去可以好好在这方面研究一下。</p>
]]></content:encoded>
			<wfw:commentRss>http://vifix.cn/blog/python-s60-bluetooth-console-with-xp-hyper-terminal.html/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>E72入手</title>
		<link>http://vifix.cn/blog/nokia-e72-got.html</link>
		<comments>http://vifix.cn/blog/nokia-e72-got.html#comments</comments>
		<pubDate>Mon, 19 Apr 2010 05:27:23 +0000</pubDate>
		<dc:creator>Mac</dc:creator>
				<category><![CDATA[Undefined]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[S60]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://vifix.cn/blog/?p=1388</guid>
		<description><![CDATA[上周四入手了诺基亚E72，因为是超市消费卡购买的缘故，所以只能买砍掉wifi功能的行货，包了个5元30M的GPRS套餐把玩了数日，几天下来发现已经改变了我的生活了（或者说至少这段时间的） 囧 首先是twitter。虽然早在07年7月就已经注册了twitter，但是由于种种原因一直没有正式开始使用。并且自去年被墙之后更是觉得不便了。现在有了方便的平台也就想试试看了。虽然twitter早已不是什么新鲜的东西，但对我来说则是一种新的纪录方式吧，把心里突然冒出来的牢骚和吐槽都找到个地方发布也蛮有意思的貌似（换句话说也就是找了个说闷骚话的地方？&#124;&#124;&#124;&#124;&#124;&#124; orzorzorz） 然后是倒腾Python for S60。一开始这个python shell运行有莫名其妙的错误，而那个WordPress的客户端wordmobi，同样基于pys60倒没有任何压力的。后来也不知道啥情况这python shell能用了，可能在升级了什么PIPS后正常了吧（还不确定 囧） 最后是GPS。嘛嘛，老早就想有个GPS设备了，这次手机更新很大原因也是因为希望能搞个有GPS功能的。诺基亚的地图永久免费十分厚道。下载安装到E72后搜索了一下离线内容也蛮丰富的，学校附近的ATM一个不落下。而我老家那么小的城镇上的标注点也有不少，可以说非常实用了。 那么总体来说对E72非常满意，只是这两天看到E72i出来了，行货带wifi，泪流满面TVT …………]]></description>
			<content:encoded><![CDATA[<p><a href="http://vifix.cn/blog/wp-content/uploads/2010/04/IMG_7217.jpg" rel="shadowbox[sbpost-1388];player=img;" title="IMG_7217"><img class="alignnone size-medium wp-image-1390" title="IMG_7217" src="http://vifix.cn/blog/wp-content/uploads/2010/04/IMG_7217-300x200.jpg" alt="" width="300" height="200" /></a></p>
<p>上周四入手了诺基亚E72，因为是超市消费卡购买的缘故，所以只能买砍掉wifi功能的行货，包了个5元30M的GPRS套餐把玩了数日，几天下来发现已经改变了我的生活了（或者说至少这段时间的） 囧</p>
<p>首先是twitter。虽然早在07年7月就已经注册了twitter，但是由于种种原因一直没有正式开始使用。并且自去年被墙之后更是觉得不便了。现在有了方便的平台也就想试试看了。虽然twitter早已不是什么新鲜的东西，但对我来说则是一种新的纪录方式吧，把心里突然冒出来的牢骚和吐槽都找到个地方发布也蛮有意思的貌似（换句话说也就是找了个说闷骚话的地方？|||||| orzorzorz）</p>
<p><span id="more-1388"></span>然后是倒腾Python for S60。一开始这个python shell运行有莫名其妙的错误，而那个WordPress的客户端wordmobi，同样基于pys60倒没有任何压力的。后来也不知道啥情况这python shell能用了，可能在升级了什么PIPS后正常了吧（还不确定 囧）</p>
<p><a href="http://vifix.cn/blog/wp-content/uploads/2010/04/IMG_7423.jpg" rel="shadowbox[sbpost-1388];player=img;" title="IMG_7423"><img class="alignnone size-medium wp-image-1391" title="IMG_7423" src="http://vifix.cn/blog/wp-content/uploads/2010/04/IMG_7423-300x200.jpg" alt="" width="300" height="200" /></a></p>
<p>最后是GPS。嘛嘛，老早就想有个GPS设备了，这次手机更新很大原因也是因为希望能搞个有GPS功能的。诺基亚的地图永久免费十分厚道。下载安装到E72后搜索了一下离线内容也蛮丰富的，学校附近的ATM一个不落下。而我老家那么小的城镇上的标注点也有不少，可以说非常实用了。</p>
<p>那么总体来说对E72非常满意，只是这两天看到E72i出来了，行货带wifi，泪流满面TVT …………</p>
]]></content:encoded>
			<wfw:commentRss>http://vifix.cn/blog/nokia-e72-got.html/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Google App Engine中datastore的Key</title>
		<link>http://vifix.cn/blog/google-app-engine-datastore-key.html</link>
		<comments>http://vifix.cn/blog/google-app-engine-datastore-key.html#comments</comments>
		<pubDate>Thu, 14 May 2009 14:56:03 +0000</pubDate>
		<dc:creator>Mac</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[GAE]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://vifix.cn/blog/?p=898</guid>
		<description><![CDATA[Google App Engine使用了一种与关系数据库完全不同的数据库，称为分布式键-值数据库（Key-Value-Database），所有的&#8221;条目&#8221;，都是一个对象。这种数据库拥有代码简单，开发效率高，高并发访问效率等特性，但同时也有不支持模糊查询等缺点。 在使用上，键-值数据库和之前熟悉的MySQL等所有的关系数据库都有点不太一样，因此在开发vxtodo时走了一些弯路，比如这个等同于关系数据库的&#8221;主键&#8221;的问题就让我奇怪了很久（当然，对于这种的键-值数据库中，是否能以主键来称呼应该值得商榷），刚才终于摸索清楚了，记录下来。 Google App Engine的datastore的每个条目的唯一的键是自动生成的，无需人工干预。因为一开始并不清楚这一点，所以定义&#8221;表&#8221;的结构时找不到类似于自动索引的功能，结果开始写vxtodo时我用的是时间戳 + 用户名邮箱地址然后Hash再取绝对值出来的一个唯一值的诡异方法，虽然也能用，但是毕竟不够优雅（这样的Hash值实在是太长了）。仔细翻阅文档后，终于把ID/Name部分给看明白了。 首先，定义一个数据类型： class Task&#40;db.Model&#41;: user = db.UserProperty&#40;&#41; title = db.StringProperty&#40;&#41; content = db.TextProperty&#40;&#41; 这个就不用多说了，一目了然，GAE的入门教程里面也说的很清楚。一个&#8221;字段&#8221;一个属性，Google提供了一批数据类型可以使用。 获取某个条目的ID： query = Task.all&#40;&#41; tasks = query.fetch&#40;50&#41; for task in tasks: print task.key&#40;&#41;.id&#40;&#41; 与别的&#8221;字段&#8221;不同的是，无法直接以task.id来获取它，而是通过调用它的key()方法返回一个Key对象然后再执行这个Key对象的id()方法来获取到这个id。 用一个给定的ID来进行查找： key = Key.from_path&#40;&#34;Task&#34;, 3&#41; #Task类别里面的ID3的对象的键 —— 翻译成关系数据库的话，就是Task表里面的主键为3的项目的主键 query = Task.all&#40;&#41; query.ancestor&#40;key&#41; task = query.get&#40;&#41; #获取对象 id这个&#8221;字段&#8221;和别的属性不一样，是用Query类专门的ancestor()的方法来处理的，虽然一开始看文档的时候就注意到了这个方法，但是由于并不知道如何给定key的值（因为不知道上面的这个获取方法）所以不明如何使用。在看了Key的文档的from_path()方法恍然大悟。 去年在Java上接触到过一种对象数据库db4o其实差不多就是这样的类型，当时也花了一些时间来研究，然而当时这个db4o并不是很成熟（印象中存储中文似乎有乱码问题），最终不了了之，最近在Google App [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://vifix.cn/blog/wp-content/uploads/2009/05/google_appengine.png" rel="shadowbox[sbpost-898];player=img;" title="google_appengine"><img class="alignnone size-thumbnail wp-image-899" title="google_appengine" src="http://vifix.cn/blog/wp-content/uploads/2009/05/google_appengine-150x150.png" alt="google_appengine" width="150" height="150" /></a></p>
<p>Google App Engine使用了一种与关系数据库完全不同的数据库，称为分布式键-值数据库（Key-Value-Database），所有的&#8221;条目&#8221;，都是一个对象。这种数据库拥有代码简单，开发效率高，高并发访问效率等特性，但同时也有不支持模糊查询等缺点。</p>
<p>在使用上，键-值数据库和之前熟悉的MySQL等所有的关系数据库都有点不太一样，因此在开发<a href="http://vifix.cn/blog/vxtodo.html">vxtodo</a>时走了一些弯路，比如这个等同于关系数据库的&#8221;主键&#8221;的问题就让我奇怪了很久（当然，对于这种的键-值数据库中，是否能以主键来称呼应该值得商榷），刚才终于摸索清楚了，记录下来。</p>
<p>Google App Engine的datastore的每个条目的唯一的键是自动生成的，无需人工干预。因为一开始并不清楚这一点，所以定义&#8221;表&#8221;的结构时找不到类似于自动索引的功能，结果开始写vxtodo时我用的是时间戳 + 用户名邮箱地址然后Hash再取绝对值出来的一个唯一值的诡异方法，虽然也能用，但是毕竟不够优雅（这样的Hash值实在是太长了）。仔细翻阅文档后，终于把ID/Name部分给看明白了。</p>
<p><span id="more-898"></span></p>
<p>首先，定义一个数据类型：</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Task<span style="color: black;">&#40;</span>db.<span style="color: black;">Model</span><span style="color: black;">&#41;</span>:
    <span style="color: #dc143c;">user</span> = db.<span style="color: black;">UserProperty</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    title = db.<span style="color: black;">StringProperty</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    content = db.<span style="color: black;">TextProperty</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>这个就不用多说了，一目了然，GAE的入门教程里面也说的很清楚。一个&#8221;字段&#8221;一个属性，Google提供了一批数据类型可以使用。</p>
<p>获取某个条目的ID：</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">query = Task.<span style="color: #008000;">all</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
tasks = query.<span style="color: black;">fetch</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">50</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">for</span> task <span style="color: #ff7700;font-weight:bold;">in</span> tasks:
    <span style="color: #ff7700;font-weight:bold;">print</span> task.<span style="color: black;">key</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: #008000;">id</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>与别的&#8221;字段&#8221;不同的是，无法直接以task.id来获取它，而是通过调用它的key()方法返回一个Key对象然后再执行这个Key对象的id()方法来获取到这个id。</p>
<p>用一个给定的ID来进行查找：</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">key = Key.<span style="color: black;">from_path</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Task&quot;</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>  <span style="color: #808080; font-style: italic;">#Task类别里面的ID3的对象的键 —— 翻译成关系数据库的话，就是Task表里面的主键为3的项目的主键</span>
query = Task.<span style="color: #008000;">all</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
query.<span style="color: black;">ancestor</span><span style="color: black;">&#40;</span>key<span style="color: black;">&#41;</span>
task = query.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;">#获取对象</span></pre></div></div>

<p>id这个&#8221;字段&#8221;和别的属性不一样，是用Query类专门的ancestor()的方法来处理的，虽然一开始看文档的时候就注意到了这个方法，但是由于并不知道如何给定key的值（因为不知道上面的这个获取方法）所以不明如何使用。在看了Key的文档的from_path()方法恍然大悟。</p>
<p>去年在Java上接触到过一种对象数据库<a href="http://www.db4o.com/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.db4o.com/?referer=');">db4o</a>其实差不多就是这样的类型，当时也花了一些时间来研究，然而当时这个db4o并不是很成熟（印象中存储中文似乎有乱码问题），最终不了了之，最近在Google App Engine重新碰到这样的数据库类型，算是对这种键-值数据库的重新认识了吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://vifix.cn/blog/google-app-engine-datastore-key.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>vxtodo</title>
		<link>http://vifix.cn/blog/vxtodo.html</link>
		<comments>http://vifix.cn/blog/vxtodo.html#comments</comments>
		<pubDate>Tue, 12 May 2009 14:39:28 +0000</pubDate>
		<dc:creator>Mac</dc:creator>
				<category><![CDATA[Atelier]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[GAE]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://vifix.cn/blog/?p=895</guid>
		<description><![CDATA[这段时间研究Google App Engine的成果，今天发布。 一个个人TODO-List管理程序，支持邮件提醒。 服务器端是Python，客户端自然还是 HTML + CSS + JS，话说Javascript的代码比Python还多一倍，没jQuery的话代码量应该会更加冗长……不过用Google App Engine来写程序还是挺幸福的。 欢迎各位使用（会有人用么？），以及帮忙测试和报告Bug 在GPL第二版协议下开源。 地址： http://vxtodo.ihfs.net/ http://vxtodo.appspot.com/ 获取源代码前往： http://code.google.com/p/vxtodo/ PS.I: google app engine还无法支持.cn域名，因此只好用这个ihfs.net来进行绑定了…… PS.II: 话说appspot偶尔会被GFW掉，无奈…… PS.III: 于是咱也玩了把云计算了啊～ 更新@2009-05-14: 修正了无法输入\和回车的bug 加入Prism的说明 制作了LOGO 更新@2009-05-15: 修改了数据模型，删除了一些无用的测试数据（没办法的选择，这种键-值数据库无法修改“表结构”，只能清空数据库然后重新添加 更新@2009-05-17: 对状态图标加上了事件，点击可以直接转换状态 将代码导入Google Code，以GPLv2开源 更新@2010-01-17: 解决一个换行的问题]]></description>
			<content:encoded><![CDATA[<p><a rel="attachment wp-att-896" href="http://vifix.cn/blog/vxtodo.html/vxtodo" title="vxtodo"><img class="alignnone size-medium wp-image-896" title="vxtodo" src="http://vifix.cn/blog/wp-content/uploads/2009/05/vxtodo-290x300.png" alt="vxtodo" width="290" height="300" /></a></p>
<p>这段时间研究Google App Engine的成果，今天发布。</p>
<p>一个个人TODO-List管理程序，支持邮件提醒。</p>
<p>服务器端是Python，客户端自然还是 HTML + CSS + JS，话说Javascript的代码比Python还多一倍，没jQuery的话代码量应该会更加冗长……不过用Google App Engine来写程序还是挺幸福的。</p>
<p>欢迎各位使用（会有人用么？），以及帮忙测试和报告Bug</p>
<p>在GPL第二版协议下开源。</p>
<p>地址：<br />
<a href="http://vxtodo.ihfs.net/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/vxtodo.ihfs.net/?referer=');">http://vxtodo.ihfs.net/</a><br />
<a href="http://vxtodo.appspot.com/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/vxtodo.appspot.com/?referer=');">http://vxtodo.appspot.com/</a></p>
<p>获取源代码前往：<br />
<a href="http://code.google.com/p/vxtodo/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/code.google.com/p/vxtodo/?referer=');">http://code.google.com/p/vxtodo/</a></p>
<p>PS.I: google app engine还无法支持.cn域名，因此只好用这个ihfs.net来进行绑定了……<br />
PS.II: 话说appspot偶尔会被GFW掉，无奈……<br />
PS.III: 于是咱也玩了把云计算了啊～</p>
<h3>更新@2009-05-14:</h3>
<ol>
<li>修正了无法输入\和回车的bug</li>
<li>加入Prism的说明</li>
<li>制作了LOGO</li>
</ol>
<h3>更新@2009-05-15:</h3>
<ol>
<li>修改了数据模型，删除了一些无用的测试数据（没办法的选择，这种键-值数据库无法修改“表结构”，只能清空数据库然后重新添加</li>
</ol>
<h3>更新@2009-05-17:</h3>
<ol>
<li>对状态图标加上了事件，点击可以直接转换状态</li>
<li>将代码导入Google Code，以GPLv2开源</li>
</ol>
<h3>更新@2010-01-17:</h3>
<ol>
<li>解决一个换行的问题</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://vifix.cn/blog/vxtodo.html/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>曾经将自己出卖给撒旦，现在皈依基督，又对人文主义有浓厚兴趣的某只？</title>
		<link>http://vifix.cn/blog/satan-jesus-humanism.html</link>
		<comments>http://vifix.cn/blog/satan-jesus-humanism.html#comments</comments>
		<pubDate>Fri, 09 Jan 2009 05:06:19 +0000</pubDate>
		<dc:creator>Mac</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[GJ!]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://vifix.cn/blog/?p=556</guid>
		<description><![CDATA[好吧，标题其实说的是我自己 &#8211; v - 为什么这么说？见内文转载吧…… 那么其实我觉得自己的想法应该更加接近不可知论 &#8211; v - 如果说编程语言是一种宗教，你的信仰是? 原文来自If programming languages were religions，很有意思，可以从宗教的角度来看看各种常见语言的特点。(这里丝毫没有要找出不同语言优劣的意思，每个人都有信仰自由) C是犹太教——很古老而且戒律很多，但大多数人都熟悉并尊重其戒律。问题是很难皈依它，你要么开始就信仰它，要么会认为它简直太疯狂了。而且，一旦事情出了差错，人们就会怪罪于它。 Java是正统基督教——理论上来说它基于C，但它去掉了很多老的戒律，以至于跟原教旨已经大相径庭。另外，它新加了一套严格的教义，追随者们相信这些比原来的教义更为重要。他们认为这是世界上最好的语言，而且会将所有的异端烧死在刑柱上。 PHP是Cafeteria基督教——与Java在Web开发领域进行竞争。它引入了C和Java的一些概念，但只限于它所喜欢的。也许它不像其它语言那样条理清楚，但至少给你了更多自由，看起来还算一个整体。而且不会有下地狱(goto hell)这样的说法。 C++ 是伊斯兰教——来源于C，不仅保持了后者的戒律，还变本加厉加入了一套新的复杂戒律。它是如此地多才多艺，可用于构建任何事物，从弥天大罪到美丽的艺术品，追随者们相信它才是终极语言，并会被持不同意见的人激怒。更可怕的是，如果你冒犯了它或者是它的创始人，你的生命都会受到威胁。 C#是摩门教——乍看之下，它跟Java一样，不过仔细一看就会发现它被单一组织所控制(很多Java的追随者将其视为恶魔)，而且很多概念都不相同。你在暗忖，它也许不错吧，呃。。。希望你不会被Java的追随者们歧视。 Lisp是佛教——没有语法，没有核心教义，也没有让人膜拜的神。就看你的造化了——需要你有足够的悟性。有人说它压根儿就不是一门语言，有的人却认为它是唯一有意义的语言。 Haskell是道教——与其它语言差别太大，以至于很多人怀疑它到底能做什么。其追随者相信它才是通往智慧的正道，只是这些智慧为大多数世俗之人力所不及。 Erlang是印度教——又一种奇怪的语言，看起来没什么用处，但不像大多数其它的现代语言，它建立在“同步之神”的基础上。 Perl是巫毒教——一套神秘的、难以理解的咒语，会让你的灵魂永久地堕落。老板在周五晚上九点吩咐你一项紧急任务，这时就得靠它了。(想起兽族部落的巫毒商店，而且它与萨满教有些类似) Lua是巫术——一种泛神论的语言，容易与不同文化和地区相融合。它的代码非常自由，其中的一些技术在传统语言的用户看来是不可思议的。它与月亮有紧密的联系。 Ruby是新异教主义——不同语言和理念的混合体，可以被看作是一种语言。其支持者群体成长迅速，尽管很多人面带疑色地看着他们，但基本上他们还是善良的，无意于伤害他人。 Python是人文主义——简单、自由，它只需要你具备常识。很多追随者声称，Python帮助他们卸下了其它语言带来的担子，从而再次找到编程的乐趣。有些人还说它就是一种伪代码。 COBOL是古异教主义——很久以前，它曾经统治着大片地区，现在却差不多死掉了。尽管很多人都在其神的仪式中留下了伤疤，直到今天仍然有人追随着它。 APL是山达基教——尽管有很多人声称要追随它，但你总会怀疑它是一个大大的恶作剧。 LOLCODE是阿里乌斯教——它很神秘，产生于互联网，尽管有人在努力地开发和散布，但没人会对它当真。 Visual Basic是撒旦教——可惜你并不是真的需要将灵魂出卖。。。 正如上文，以前学过VB这个撒旦教，未有大成之前，又接触到了PHP和Java这两个基督教的分支，然后现在是对Python人文主义很有爱～ 虽然我觉得其实C++是正统基督教的设定才对啊……继承于C又有了发展…… 话说看了这文顺便发现了LOLCODE这门有趣的语言，Hello, World如下： HAI CAN HAS STDIO? VISIBLE "HAI WORLD!" KTHXBYE 翻译过来，这简直就是：嗨，我可以用STDIO么？显示一下“HAI WORLD”吧，谢谢，再见！ HAI和KTHXBYE是程序段的开始和结束。 CAN HAS就是调用，类似include require之类的。 VISIBLE就是print啦。 Wikipedia: LOLCODE是一种建立在高度缩写的网络英语之上的编程语言，一般来说如果一个人能理解这种网络英语就能在未经训练的情况下读懂LOLCODE程序源代码。 [...]]]></description>
			<content:encoded><![CDATA[<p>好吧，标题其实说的是我自己 &#8211; v -</p>
<p>为什么这么说？见内文转载吧……</p>
<p><span style="text-decoration: line-through;">那么其实我觉得自己的想法应该更加接近不可知论 &#8211; v -</span></p>
<p><span id="more-556"></span></p>
<blockquote>
<h2>如果说编程语言是一种宗教，你的信仰是?</h2>
<p>原文来自<a href="http://www.aegisub.net/2008/12/if-programming-languages-were-religions.html" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.aegisub.net/2008/12/if-programming-languages-were-religions.html?referer=');">If programming languages were religions</a>，很有意思，可以从宗教的角度来看看各种常见语言的特点。(这里丝毫没有要找出不同语言优劣的意思，每个人都有信仰自由)</p>
<p>C是犹太教——很古老而且戒律很多，但大多数人都熟悉并尊重其戒律。问题是很难皈依它，你要么开始就信仰它，要么会认为它简直太疯狂了。而且，一旦事情出了差错，人们就会怪罪于它。</p>
<p>Java是正统基督教——理论上来说它基于C，但它去掉了很多老的戒律，以至于跟原教旨已经大相径庭。另外，它新加了一套严格的教义，追随者们相信这些比原来的教义更为重要。他们认为这是世界上最好的语言，而且会将所有的异端烧死在刑柱上。</p>
<p>PHP是Cafeteria基督教——与Java在Web开发领域进行竞争。它引入了C和Java的一些概念，但只限于它所喜欢的。也许它不像其它语言那样条理清楚，但至少给你了更多自由，看起来还算一个整体。而且不会有下地狱(goto hell)这样的说法。</p>
<p>C++ 是伊斯兰教——来源于C，不仅保持了后者的戒律，还变本加厉加入了一套新的复杂戒律。它是如此地多才多艺，可用于构建任何事物，从弥天大罪到美丽的艺术品，追随者们相信它才是终极语言，并会被持不同意见的人激怒。更可怕的是，如果你冒犯了它或者是它的创始人，你的生命都会受到威胁。</p>
<p>C#是摩门教——乍看之下，它跟Java一样，不过仔细一看就会发现它被单一组织所控制(很多Java的追随者将其视为恶魔)，而且很多概念都不相同。你在暗忖，它也许不错吧，呃。。。希望你不会被Java的追随者们歧视。</p>
<p>Lisp是佛教——没有语法，没有核心教义，也没有让人膜拜的神。就看你的造化了——需要你有足够的悟性。有人说它压根儿就不是一门语言，有的人却认为它是唯一有意义的语言。</p>
<p>Haskell是道教——与其它语言差别太大，以至于很多人怀疑它到底能做什么。其追随者相信它才是通往智慧的正道，只是这些智慧为大多数世俗之人力所不及。</p>
<p>Erlang是印度教——又一种奇怪的语言，看起来没什么用处，但不像大多数其它的现代语言，它建立在“同步之神”的基础上。</p>
<p>Perl是巫毒教——一套神秘的、难以理解的咒语，会让你的灵魂永久地堕落。老板在周五晚上九点吩咐你一项紧急任务，这时就得靠它了。(想起兽族部落的巫毒商店，而且它与萨满教有些类似)</p>
<p>Lua是巫术——一种泛神论的语言，容易与不同文化和地区相融合。它的代码非常自由，其中的一些技术在传统语言的用户看来是不可思议的。它与月亮有紧密的联系。</p>
<p>Ruby是新异教主义——不同语言和理念的混合体，可以被看作是一种语言。其支持者群体成长迅速，尽管很多人面带疑色地看着他们，但基本上他们还是善良的，无意于伤害他人。</p>
<p>Python是人文主义——简单、自由，它只需要你具备常识。很多追随者声称，Python帮助他们卸下了其它语言带来的担子，从而再次找到编程的乐趣。有些人还说它就是一种伪代码。</p>
<p>COBOL是古异教主义——很久以前，它曾经统治着大片地区，现在却差不多死掉了。尽管很多人都在其神的仪式中留下了伤疤，直到今天仍然有人追随着它。</p>
<p>APL是山达基教——尽管有很多人声称要追随它，但你总会怀疑它是一个大大的恶作剧。</p>
<p>LOLCODE是阿里乌斯教——它很神秘，产生于互联网，尽管有人在努力地开发和散布，但没人会对它当真。</p>
<p>Visual Basic是撒旦教——可惜你并不是真的需要将灵魂出卖。。。</p></blockquote>
<p>正如上文，以前学过VB这个撒旦教，未有大成之前，又接触到了PHP和Java这两个基督教的分支，然后现在是对Python人文主义很有爱～</p>
<p>虽然我觉得其实C++是正统基督教的设定才对啊……继承于C又有了发展……</p>
<p>话说看了这文顺便发现了<a href="http://lolcode.com/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/lolcode.com/?referer=');">LOLCODE</a>这门有趣的语言，Hello, World如下：</p>
<pre>HAI
CAN HAS STDIO?
VISIBLE "HAI WORLD!"
KTHXBYE</pre>
<p>翻译过来，这简直就是：嗨，我可以用STDIO么？显示一下“HAI WORLD”吧，谢谢，再见！<br />
HAI和KTHXBYE是程序段的开始和结束。<br />
CAN HAS就是调用，类似include require之类的。 VISIBLE就是print啦。</p>
<blockquote><p>Wikipedia: LOLCODE是一种建立在高度缩写的网络英语之上的编程语言，一般来说如果一个人能理解这种网络英语就能在未经训练的情况下读懂LOLCODE程序源代码。</p></blockquote>
<p><span style="text-decoration: line-through;">我承认先看成LOLICODE了……</span></p>
]]></content:encoded>
			<wfw:commentRss>http://vifix.cn/blog/satan-jesus-humanism.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Python的switch&#8230;case语法</title>
		<link>http://vifix.cn/blog/python%e7%9a%84switchcase%e8%af%ad%e6%b3%95.html</link>
		<comments>http://vifix.cn/blog/python%e7%9a%84switchcase%e8%af%ad%e6%b3%95.html#comments</comments>
		<pubDate>Mon, 17 Nov 2008 08:22:20 +0000</pubDate>
		<dc:creator>Mac</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Example]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://vifix.cn/blog/?p=201</guid>
		<description><![CDATA[Python没有switch&#8230;case的语法，不过可以用Dictionary和lambda匿名函数的特性来写出同样优雅的代码，比如这段javascript代码： switch&#40;value&#41;&#123; case 1: func1&#40;&#41;; break; case 2: func2&#40;&#41;; break; case 3: func3&#40;&#41;; break; &#125; 等价的Python代码： &#123; 1: lambda: func1, 2: lambda: func2, 3: lambda: func3 &#125;&#91;value&#93;&#40;&#41; 带赋值的情况： result = &#123; 'a': lambda x: x * 5, 'b': lambda x: x + 7, 'c': lambda x: x - 2 &#125;&#91;value&#93;&#40;x&#41; 用try&#8230;catch来实现带Default的情况，不过这个形式就感觉差些了： try: &#123;'option1': func1, 'option2': [...]]]></description>
			<content:encoded><![CDATA[<p>Python没有switch&#8230;case的语法，不过可以用Dictionary和lambda匿名函数的特性来写出同样优雅的代码，比如这段javascript代码：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">switch</span><span style="color: #009900;">&#40;</span>value<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">case</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">:</span>
        func1<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">break</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">case</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">:</span>
        func2<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">break</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">case</span> <span style="color: #CC0000;">3</span><span style="color: #339933;">:</span>
        func3<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>等价的Python代码：</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: black;">&#123;</span>
  <span style="color: #ff4500;">1</span>: <span style="color: #ff7700;font-weight:bold;">lambda</span>: func1,
  <span style="color: #ff4500;">2</span>: <span style="color: #ff7700;font-weight:bold;">lambda</span>: func2,
  <span style="color: #ff4500;">3</span>: <span style="color: #ff7700;font-weight:bold;">lambda</span>: func3
<span style="color: black;">&#125;</span><span style="color: black;">&#91;</span>value<span style="color: black;">&#93;</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p><span id="more-201"></span></p>
<p>带赋值的情况：</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">result = <span style="color: black;">&#123;</span>
  <span style="color: #483d8b;">'a'</span>: <span style="color: #ff7700;font-weight:bold;">lambda</span> x: x <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">5</span>,
  <span style="color: #483d8b;">'b'</span>: <span style="color: #ff7700;font-weight:bold;">lambda</span> x: x + <span style="color: #ff4500;">7</span>,
  <span style="color: #483d8b;">'c'</span>: <span style="color: #ff7700;font-weight:bold;">lambda</span> x: x - <span style="color: #ff4500;">2</span>
<span style="color: black;">&#125;</span><span style="color: black;">&#91;</span>value<span style="color: black;">&#93;</span><span style="color: black;">&#40;</span>x<span style="color: black;">&#41;</span></pre></div></div>

<p>用try&#8230;catch来实现带Default的情况，不过这个形式就感觉差些了：</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">try</span>:
    <span style="color: black;">&#123;</span><span style="color: #483d8b;">'option1'</span>: func1,
     <span style="color: #483d8b;">'option2'</span>: func2,
     <span style="color: #483d8b;">'option3'</span>: func3<span style="color: black;">&#125;</span><span style="color: black;">&#91;</span>value<span style="color: black;">&#93;</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">KeyError</span>:
    <span style="color: #808080; font-style: italic;"># default action</span></pre></div></div>

<p>附上google到的相关内容（评论中的讨论也值得一看）：</p>
<ul>
<li><a href="http://www.mustap.com/pythonzone_post_224_python-switch-statement" onclick="pageTracker._trackPageview('/outgoing/www.mustap.com/pythonzone_post_224_python-switch-statement?referer=');">http://www.mustap.com/pythonzone_post_224_python-switch-statement</a></li>
<li><a href="http://simonwillison.net/2004/May/7/switch/" onclick="pageTracker._trackPageview('/outgoing/simonwillison.net/2004/May/7/switch/?referer=');">http://simonwillison.net/2004/May/7/switch/</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://vifix.cn/blog/python%e7%9a%84switchcase%e8%af%ad%e6%b3%95.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

