<?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>草客天下——{{caokee}}</title>
	<atom:link href="http://blog.caokee.com/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.caokee.com</link>
	<description>上帝说要有光，于是就有了光</description>
	<lastBuildDate>Mon, 20 Feb 2012 16:08:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>木头，木头，请告诉我时间是什么？？</title>
		<link>http://blog.caokee.com/2012/02/wood-clock.html</link>
		<comments>http://blog.caokee.com/2012/02/wood-clock.html#comments</comments>
		<pubDate>Mon, 20 Feb 2012 15:39:24 +0000</pubDate>
		<dc:creator>soone</dc:creator>
				<category><![CDATA[极客屋]]></category>
		<category><![CDATA[LED]]></category>
		<category><![CDATA[时钟]]></category>

		<guid isPermaLink="false">http://blog.caokee.com/?p=125</guid>
		<description><![CDATA[关于木头总是有很多的故事，而且故事本身总是和时间离不开关系。苍天巨树，它的年轮告诉我们时间的流逝，告诉我们生命的轮回，那一轮一轮的圆圈，虽然静止无语，却似乎在跟我们诉说着无尽的关于时间的故事。。。 今天我们家木头很兴奋，似乎它也对我手上的这个新玩意很感兴趣，一个木质的LED时钟，从外观上看似乎就是一块普通的木头，其实里面大有玄机：1、它能告诉你日期和时间，这是必须的。2、它能告诉你当前温度，这个有点高级。3、它能感应声音自动休眠和唤醒。我把它放在卧室的书桌上，装上三节AA电池，调整当前时间，顺带的调整一下闹钟，soone总是无休止的赖床，必须用这个治一治。下面上上这个LED时钟的真面目 想和soone一样拥有一个？soone是在这里淘的，赶紧去淘一个吧。 &#160; 分享到： 更多]]></description>
		<wfw:commentRss>http://blog.caokee.com/2012/02/wood-clock.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[转载]Python 的虛擬環境及多版本開發利器─Virtualenv 與 Pythonbrew</title>
		<link>http://blog.caokee.com/2012/02/pythons-virtual-environment-and-multi-version-programming-tools-virtualenv-and-pythonbrew.html</link>
		<comments>http://blog.caokee.com/2012/02/pythons-virtual-environment-and-multi-version-programming-tools-virtualenv-and-pythonbrew.html#comments</comments>
		<pubDate>Fri, 17 Feb 2012 08:05:34 +0000</pubDate>
		<dc:creator>soone</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[pythonbrew]]></category>
		<category><![CDATA[virtualenv]]></category>

		<guid isPermaLink="false">http://blog.caokee.com/?p=115</guid>
		<description><![CDATA[Virtualenv 和 Pythonbrew 都是可以創造虛擬（獨立）Python 環境的工具，只是虛擬（獨立）標的不同。 Virtualenv 可以隔離函數庫需求不同的專案，讓它們不會互相影響。在建立並啟動虛擬環境後，透過 pip 安裝的套件會被放在虛擬環境中，專案就可以擁有一個獨立的環境。 簡而言之，Virtualenv 可以幫你做到： 在沒有權限的情況下安裝新套件 不同專案可以使用不同版本的相同套件 套件版本升級時不會影響其他專案 Pythonbrew 則可以在家目錄中安裝多個 Python，並迅速地切換版本；也可以在指定的 Python 版本下批次測試你的 Python 程式；另外更整合了 Virtualenv。 這篇文章會詳細介紹這兩個工具，讓你在多人開發及多版本開發的環境中更得心應手。 &#160; 事前準備 Python 的 package 通常會上傳至 PyPI，有很多工具都可以從 PyPI 安裝 package。下面會使用easy_install 這個工具（由 setuptools 提供）來安裝 Virtualenv 和]]></description>
		<wfw:commentRss>http://blog.caokee.com/2012/02/pythons-virtual-environment-and-multi-version-programming-tools-virtualenv-and-pythonbrew.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>functools模块</title>
		<link>http://blog.caokee.com/2012/02/functools-module.html</link>
		<comments>http://blog.caokee.com/2012/02/functools-module.html#comments</comments>
		<pubDate>Wed, 15 Feb 2012 03:50:01 +0000</pubDate>
		<dc:creator>soone</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[functools]]></category>
		<category><![CDATA[tornado]]></category>

		<guid isPermaLink="false">http://blog.caokee.com/?p=111</guid>
		<description><![CDATA[在看tornado的源代码的时候发现了functools模块，google一下，发现这里有相关的介绍，很简单，稍微摘录了一下 functools模块提供了两个装饰器。这个模块是Python 2.5后新增的 wraps(wrapped[, assigned][, updated]) total_ordering(cls) wraps(wrapped[, assigned][, updated]) 这是一个很有用的装饰器。python函数是有几个特殊属性比如函数名，在被装饰后，原来的函数名如：foo会变成包装函数的名字如：wrapper，如果你希望使用反射，可能会导致意外的结果。这个装饰器可以解决这个问题，它能将装饰过的函数的特殊属性保留。 import time import functools def timeit(func): @functools.wraps(func) def wrapper(): start = time.clock() func() end = time.clock() print 'used:', end]]></description>
		<wfw:commentRss>http://blog.caokee.com/2012/02/functools-module.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[转]Python:os模块的进程管理</title>
		<link>http://blog.caokee.com/2012/02/python-os-process.html</link>
		<comments>http://blog.caokee.com/2012/02/python-os-process.html#comments</comments>
		<pubDate>Wed, 15 Feb 2012 02:11:24 +0000</pubDate>
		<dc:creator>soone</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[os]]></category>
		<category><![CDATA[process]]></category>

		<guid isPermaLink="false">http://blog.caokee.com/?p=93</guid>
		<description><![CDATA[有两种方式来实现并发性，一种方式是让每个“任务&#8221;或“进程”在单独的内在空间中工作，每个都有自已的工作内存区域。不过，虽然进程可在单独的内存空间中执行，但除非这些进程在单独的处理器上执行，否则，实际并不是“同时”运行的。是由操作系统把处理器的时间片分配给一个进程，用完时间片后就需退出处理器等待另一个时间片的到来。另一种方式是在在程序中指定多个“执行线程”，让它们在相同的内存空间中工作。这称为“多线程处理”。线程比进程更有效，因为操作系统不必为每个线程创建单独的内存空间。 新建进程用os.fork函数。但它只在POSIX系统上可用，在windows版的python中，os模块没有定义os.fork函数。相反，windows程序员用多线程编程技术来完成并发任务。 os.fork函数创建进程的过程是这样的。程序每次执行时，操作系统都会创建一个新进程来运行程序指令。进程还可调用os.fork，要求操作系统新建一个进程。父进程是调用os.fork函数的进程。父进程所创建的进程叫子进程。每个进程都有一个不重复的进程ID号。或称pid，它对进程进行标识。子进程与父进程完全相同，子进程从父进程继承了多个值的拷贝，如全局变量和环境变量。两个进程的唯一区别是fork的返回值。子进程接收返回值0，而父进程接收子进程的pid作为返回值。 用os.fork创建的子进程和父进程作为异步的并发进程而单独执行。异步是指它们各行其是，相互间不进行同步；并发是指它们可同时执行。所以我们无法知道子进程和父进程的相对速度。 os.wait函数用于等待子进程结束(只适用于UNIX兼容系统)。该函数返回包含两个元素的元组，包括已完成的子进程号pid，以及子进程的退出状态，返回状态为0，表明子进程成功完成。返回状态为正整数表明子进程终止时出错。如没有子进程，会引发OSError错误。os.wait要求父进程等待它的任何一个子进程结束执行，然后唤醒父进程。 要指示父进程等候一个指定的子进程终止，可在父进程中使用os.waitpid函数(只适用于unix兼容系统)。它可等候一个指定进程结束，然后返回一个双元素元组，其中包括子进程的pid和子进程的退出状态。函数调用将pid作为第一个参数传递，并将一个选项作为第二个选项，如果第一个参数大于0，则waitpid会等待该pid结束，如果第一个参数是-1，则会等候所有子进程，也就和os.wait一样。 用os.system 和 os.exec函数族来执行系统命令和其它程序。os.system使用shell来执行系统命令，然后在命令结束之后把控制权返回给原始进程；os.exec函数族在执行完命令后不将控制权返回给调用进程。它会接管python进程，pid不变。这两个函数支持unix和windows平台。 os.popen()函数可执行命令，并获得命令的stdout流。函数要取得两个参数，一个是要执行的命令，另一个是调用函数所用的模式，如“r&#8221;只读模式。os.popen2()函数执行命令，并获得命令的stdout流和stdin流。函数返回一个元组，其中包含有两个文件对象，一个对象对应stdin流，一个对象对应stdout流。 进程使用IPC机制在进程间传递信息，一种IPC机制是“管道”，它是一种类似于文件的对象，提供单向通信渠道。父进程可打开一个管道，再分支一个子进程。父进程使用管道将信息写入(发送到)子进程，而子进程使用管道从父进程读取信息。在python中使用os.pipe函数创建管道。 os._exit()类似于sys.exit()，但它不执行任何的清除工作(例如刷新缓冲区)。所以os._exit()尤其适用于退出子进程。如果程序使用sys.exit()，操作系统会回收父进程或其它子进程可能仍然需要的资源。传给os._exit()函数的参数必须是进程的退出状态。退出状态为0，表示正常终止。 进程也可用信号进行通信。所谓“信号”，是操作系统采取异步方式传给程序的消息。如CTRL+C会传递一个“中断信号”，通常该信号导致程序中止。然而程序完全可以指定用不同的行动来响应任何一个信号。在信号处理中，程序要接收信号，并根据那个信号采取一项行动。错误(例如向已关闭管道写入)、事件(例如计时器变成0)以及用户输入(例如按ctrl+c)都会产生信号。 针对每个信号，每个python程序都有一个默认的信号处理程序。例如，假定python解释器收到一个信号，该信号指出程序试图向已关闭的管道写入，或者用户敲入一个键盘中断，python就会引发一个异常。发生异常后，程序既可使用默认处理程序，也可使用自定义处理程序。 signal.signal函数为中断信号注册一个信号处理程序。函数要获得两个参数：一个信号和一个对应于信号处理程序的函数。 在unix/linux系统中，子进程终止后，会保留在进程表中，让父进程知道子进程是否正常终止。如果创建大量子进程，但在终止后没有从进程表中移除它们，进程表便会积累越来越多的死进程，这些进程称为“zombies”(僵尸进程)，消除僵尸进程的操作称为“reaping”，这是通过os.wait和os.waitpid函数实现的。 转发地址：http://hi.baidu.com/giftangellong/blog/item/fe5dc630a749f410ebc4afa2.html 分享到： 更多]]></description>
		<wfw:commentRss>http://blog.caokee.com/2012/02/python-os-process.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>gf3在天安门附近试拍</title>
		<link>http://blog.caokee.com/2012/02/try-gf3.html</link>
		<comments>http://blog.caokee.com/2012/02/try-gf3.html#comments</comments>
		<pubDate>Tue, 14 Feb 2012 15:27:59 +0000</pubDate>
		<dc:creator>soone</dc:creator>
				<category><![CDATA[心语]]></category>
		<category><![CDATA[gf3]]></category>
		<category><![CDATA[photo]]></category>
		<category><![CDATA[摄影]]></category>

		<guid isPermaLink="false">http://blog.caokee.com/?p=75</guid>
		<description><![CDATA[幸福路人 王府井小吃街 钟楼 看起来很忧郁的狮子 仰望的角度 老北京布鞋 同仁堂 热闹的电话亭 这里缺少一个人 无题 老宅第 铺首 小溪 白椅 狮头 华表 分享到： 更多]]></description>
		<wfw:commentRss>http://blog.caokee.com/2012/02/try-gf3.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[翻译]关于python的“with”声明</title>
		<link>http://blog.caokee.com/2012/02/python-with-statement.html</link>
		<comments>http://blog.caokee.com/2012/02/python-with-statement.html#comments</comments>
		<pubDate>Tue, 14 Feb 2012 10:20:59 +0000</pubDate>
		<dc:creator>soone</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[with]]></category>

		<guid isPermaLink="false">http://blog.caokee.com/?p=68</guid>
		<description><![CDATA[从com.lang.python以及其他的一些论坛上看来，一些有经验的python开发者对于在2.5版本新增加的with似乎有一点迷惑。 如同Python的其他方面一样，一旦你了解了with是用来试图解决哪些问题的时候，你会发现其实它很简单。 看看下面的代码片段： set things up try:     do something finally:     tear things down 在这里，&#8221;set things up&#8221; 可以是打开一个文件或者获得一些外部资源，而&#8221;tear things down&#8221;可能是相对应的关闭打开的文件或者释放或移除一些资源。try-finally结构保证了就算&#8221;do something&#8221;代码没有真正执行完成，&#8221;tear thigs down&#8221;部分也总是会被执行。 如果你经常如上面那样编写一些代码，那么将“set things up”和&#8221;tear things]]></description>
		<wfw:commentRss>http://blog.caokee.com/2012/02/python-with-statement.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>小勤故事</title>
		<link>http://blog.caokee.com/2012/01/xiao-qin-story.html</link>
		<comments>http://blog.caokee.com/2012/01/xiao-qin-story.html#comments</comments>
		<pubDate>Sat, 14 Jan 2012 10:34:17 +0000</pubDate>
		<dc:creator>soone</dc:creator>
				<category><![CDATA[心语]]></category>
		<category><![CDATA[story]]></category>

		<guid isPermaLink="false">http://blog.caokee.com/?p=50</guid>
		<description><![CDATA[村里有一个小伙子，一看就是来自农村，瘦瘦的，脸还挺白净，说起话来有稍许的腼腆，手掌上的皮肤看起来好像是被烫伤的样子，不过也许是个胎记呢，谁知道。他比我晚来这个村子，记得大概是2011年的夏天来的。从他出现之后我基本每天都能看到他，早上、晚上都能看到，每次看到，他总是很忙碌，我还不知道他叫什么名字，暂且就先叫他小勤吧。 第一次对小勤有印象是在2011年夏天的某一个晚上，那会儿我们每天晚上基本都在街边的大排档喝酒，并激烈的讨论着公司的空降兵。一边喝着扎啤，吃着烧烤，一边言辞激烈的口伐着一切看似很明显又很诡异的不合理。那天晚上我们吃到一半想起买点臭豆腐来换换口味，话说臭豆腐我还是很喜欢吃的，刚好另一个同事也挺喜欢的。以前村子里没有人卖臭豆腐的，小勤就是第一个在这里卖臭豆腐的人，刚好就在大排档门口卖，于是就去点了两份让他送过来，这是第一次看到小勤，也许对他有印象是因为他很及时的出现满足了我们对臭豆腐的口欲吧，虽然小勤的臭豆腐味道并没有什么特别，但至少村子里有卖臭豆腐了，以后可以经常吃到了。 之后的连续几天我们都会去小勤那买臭豆腐作为下酒菜，但我们的交流总是只局限于买卖，“老板，来2份臭豆腐”， “好嘞，要不要辣”， “微辣！送到这边大排档”，“好嘞，稍等马上就好！”。话说按常理我也不应该对一个同性产生什么兴趣，而且我还是个不是很喜欢和陌生人交谈的人。所以之后很多的晚上我也就一般的正常在村子里出入上下班。 过了一段时间，本应该总是在晚上遇到的小勤第一次在白天让我遇到了，早上他在路边卖现磨豆浆，有黑芝麻的，有红豆的，也有花生的，全是现场用干货直接磨的，给人感觉很新鲜很绿色，很安全，至少我们都看得见。晚上卖臭豆腐，早上卖现磨豆浆，看来小勤是个多才多艺的小伙子，是个勤奋的小伙子，这不禁让我刮目相看，好一个上进的小伙子。小勤给我的印象越来越不错，我想他应该是个实在人，一个也许是从某个偏远山里出来的实在人。于是接下去除了城管来的日子我也基本每天都光顾他的豆浆铺，但和买臭豆腐一样，“老板，黑芝麻”，“好的，给，小心烫”。 很长一段时间过后，夏天结束了，空降兵被撂一边了，秋天很快过去，北京的冬天伴随着北风就来了，大排档去不了了，村里那条街道晚上摆摊的人明显变少了很多，只有几家卖说过的和2家卖烧烤的，麻辣烫都关进屋里卖了。小勤的臭豆腐摊也没出来了，也许冬天臭豆腐摊生意并不好，也许小勤受不了晚上的冷，歇了。冬天的晚上就没再看到小勤了，知道有一天，我去一家餐厅吃炒面，那晚好多人都在那里吃，很忙，店里人手不足，我叫的一碗鸡蛋肉丝炒面好久没上，我对着老板喊“老板，我的炒面，快点”，“好的，马上，马上好啊”，这时小勤从外面进来，经过我身边，我看到了他，他也看到了我，他冲我笑笑，我以为他也来吃饭，也笑一笑，不过小勤没有找位置坐下，他直接进了厨房，不一会儿端着我的鸡蛋肉丝炒面过来给我，我楞了一下，“你在这里打工？”， “是啊，呵呵”，转身小勤又进厨房了，我看他很忙。好吧，这小伙子也挺能钻的，不卖臭豆腐了，就改饭店打工，总是想着法子让自己不闲下来，不停的打工赚钱。 上次饭店再遇到小勤后，我就总在想也许小勤是个有故事的人，就像电影或者小说里那样，在他的家乡有一个很爱很爱他的女朋友，不用很漂亮，但一定很温柔，善解人意，很朴实。他曾经答应她，“等我赚夠了钱就回来娶你，你好好等着”。她在山里日复一日的等着，望向北面，等着她的小勤有一天回来，抱着她对她说，“嫁给我吧”，她会毫不犹豫的点头。小勤每天想着山里的她，每天早上醒来就会对着她的照片说，“等我，我很快回来”，然后整装待发的开始一天的工作，也许小勤卖完了豆浆后，还去哪里打工了呢，晚上回来再去饭店帮忙，谁知道呢，我只知道这是一个勤奋的小伙子，一个有着自己理想和目标的人，不管他的目标是多么伟大或者多么渺小，至少他在不停的朝着那个目标去努力奋斗。我相信他会成功，现在将近年关也许年前不会再遇到小勤，他可能回去对着山里心爱的她展示着自己这段时间在北京努力的成果，或者对着他的年迈的母亲和父亲诉说着他在外面奋斗的故事，而老母亲微笑的倾听着，老父亲面无表情的抽着旱烟，时不时的吐一口浓烟出来，看一眼儿子。我想不管日子过的怎样，不管故事会是怎样，小勤都是幸福的。。。 分享到： 更多]]></description>
		<wfw:commentRss>http://blog.caokee.com/2012/01/xiao-qin-story.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Protected: 2011未完成的遗憾</title>
		<link>http://blog.caokee.com/2012/01/2011-uncomplete.html</link>
		<comments>http://blog.caokee.com/2012/01/2011-uncomplete.html#comments</comments>
		<pubDate>Sat, 14 Jan 2012 09:46:08 +0000</pubDate>
		<dc:creator>soone</dc:creator>
				<category><![CDATA[心语]]></category>

		<guid isPermaLink="false">http://blog.caokee.com/?p=47</guid>
		<description><![CDATA[There is no excerpt because this is a protected post.]]></description>
		<wfw:commentRss>http://blog.caokee.com/2012/01/2011-uncomplete.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>坑爹的用例</title>
		<link>http://blog.caokee.com/2011/12/fuck-example.html</link>
		<comments>http://blog.caokee.com/2011/12/fuck-example.html#comments</comments>
		<pubDate>Tue, 27 Dec 2011 16:19:38 +0000</pubDate>
		<dc:creator>soone</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[webpy]]></category>

		<guid isPermaLink="false">http://blog.caokee.com/?p=42</guid>
		<description><![CDATA[今天想在web页面上实现即时输出的效果，于是想到了使用chunked的传输方式来实现，在webpy的官网上找到了这个示例，它利用生成器和yield来实现chunked的输出，官网的示例有一段是这样的: 坑爹的地方就在这里了，，如果完全按照这个示例去做，根本就出不来效果，用httpfox去看请求的那些协议和参数，你会发现，Transfer-Encoding那项会有两个chunked，刚开始我还没怎么注意，直到后来不停尝试才想起这事可能有蹊跷，于是我去掉了web.header(&#8216;Transfer-Encoding&#8217;:'chunked&#8217;)这段代码，再尝试的时候，发现正常了，效果出来了，看来webpy的http模块已经自动的做了chunked这样格式的解释了，根本不需要再制定。 分享到： 更多]]></description>
		<wfw:commentRss>http://blog.caokee.com/2011/12/fuck-example.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>python一句话开启web server</title>
		<link>http://blog.caokee.com/2011/12/python-quickly-install-web-server.html</link>
		<comments>http://blog.caokee.com/2011/12/python-quickly-install-web-server.html#comments</comments>
		<pubDate>Thu, 22 Dec 2011 14:32:15 +0000</pubDate>
		<dc:creator>soone</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[SimpleHTTPServer]]></category>
		<category><![CDATA[webserver]]></category>

		<guid isPermaLink="false">http://blog.caokee.com/?p=33</guid>
		<description><![CDATA[晚上在虚拟机上想在主机上拷贝一些东西，由于虚拟机上用的是NAT的共享方式，所以通过主机无法找到虚拟机，原本打算通过虚拟机ssh到主机上，发现mac上没装ssh-server无法连接，于是想到直接使用python搭建一个web server，然后通过浏览器访问或者curl直接下载。 python本身自带的SimpleHTTPServer模块，可以快速的在本机上建立一个临时的web server。执行命令如下：python -m SimpleHTTPServer，这样一个web server就开放了，默认端口是8000，如果你想更换端口则可以这样使用python -m SimpleHTTPServer 8888。很方便吧，在浏览器打上http://xx.xx.xx.xx:8000/就能访问到python所运行的当前目录了，想传什么就下吧，方便又快捷。 分享到： 更多]]></description>
		<wfw:commentRss>http://blog.caokee.com/2011/12/python-quickly-install-web-server.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

