<?xml version="1.0" encoding="UTF-8"?><rss version="0.92">
<channel>
	<title>StephenChan&#039;s Tech Space</title>
	<link>http://blog.endlesscode.com</link>
	<description>Stay Hungry. Stay Foolish.</description>
	<lastBuildDate>Tue, 25 Oct 2011 01:15:07 +0000</lastBuildDate>
	<docs>http://backend.userland.com/rss092</docs>
	<language>en</language>
	<!-- generator="WordPress/3.0.1" -->

	<item>
		<title>基于coroutine的gevent</title>
		<description><![CDATA[coroutine也是一种并发模型，但不同于thread和callback，它的所有task都是可以在一个线程里面执行，然后可以通过在一个task里面主动放弃执行来切换到另一个task执行，它的调度是程序级的，不像thread是系统级的调度。gevent就是一个基于coroutine的python网络开发框架，不像twisted那样集成了很多库和协议，gevent非常精简，当然文档也很少，在性能上的话，看了PyCon上的视频，对比了twisted和其他的几个库，在内存的性能上非常地优秀，代码简洁而且也支持多核。 做了个相当简单的ChatService，有登录、群发消息、退出这3个消息，协议就是用简单的json了，有时间再试试xmpp看看。&#8221;monkey.patch_all()&#8221; 这个调用就把python原生的一些socket对象和方法替换成非阻塞的异步调用，写起来感觉还是很方便。 #!/usr/bin/env python #-*- coding:utf-8 -*- import sys import simplejson from gevent import monkey; monkey.patch_all(); from gevent.server import StreamServer from common import Protocol, gen_pro_data, parse_pro_data class ChatService: def __init__(self): self._clients = {} self._handlers = { Protocol.Connect : self.connect, &#8230; <a href="http://blog.endlesscode.com/2011/10/22/gevent-lib/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
		<link>http://blog.endlesscode.com/2011/10/22/gevent-lib/</link>
			</item>
	<item>
		<title>Shell的知识点整理</title>
		<description><![CDATA[这几天抽了点时间看了一下《Advanced Bash-Scripting Guide》， 之前一直觉得shell这门脚本很有意思，虽然用得不多，但感觉shell这门脚本似乎有点粗糙，但看了abs-guide之后就觉得shell还是很强大的，很多高级特性之前都没曾接触过，平时也用得不算很多。浏览了一下abs-guide之后做了一些简单的笔记，方便以后查看，每个&#8221;echo ===&#8221;之间就是代码片段，在bash version 3.2.48下测试过，点解高亮区的&#8221;view source&#8221;可以直接复制所有代码。 #--------------- Begin #!/usr/bin/bash for arg in "Hello World What The Fuck" do echo $arg done echo "==================================" FILES="/usr/bin/accept /usr/sbin/pwck /usr/sbin/chroot /usr/badblocks /sbin/ypbind" for file in $FILES do if [ ! -e "$file" &#8230; <a href="http://blog.endlesscode.com/2011/10/15/code-snippet-of-shell/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
		<link>http://blog.endlesscode.com/2011/10/15/code-snippet-of-shell/</link>
			</item>
	<item>
		<title>在Debian搭建SVN</title>
		<description><![CDATA[今天在Linode买的vps上搭了个svn，简单记录一下过程和遇到的问题。 先说遇到的问题吧，基本上就是 1. &#8220;Could not open the requested SVN filesystem&#8221;; 2. &#8220;Server sent unexpected return value (403 Forbidden) in response to OPTIONS &#8220;. 第一个问题是因为开始没有搞清楚创建一个和多个svn repository的区别，而第二个是因为权限设置的问题。 svn服务器比较重要的涉及安全的问题就是用户认证、访问授权以及传输加密。根据官方的介绍，搭建svn有几种方式，各有优劣，我用的是Apache + mod_dav_svn＋Basic Auth。 具体流程如下，以多个为例，单个的只是参数的差别： 1. 安装所需软件 apt-get install subversion subversion-tools apache2 libapache2-svn 2. 创建存放的路径 &#8230; <a href="http://blog.endlesscode.com/2011/10/07/set-up-svn-in-debian/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
		<link>http://blog.endlesscode.com/2011/10/07/set-up-svn-in-debian/</link>
			</item>
	<item>
		<title>VirtualBox拷贝vdi丢失eth0</title>
		<description><![CDATA[今天用VirtualBox的工具去拷贝虚拟机vdi文件的时候，在拷贝出来的vdi文件中找不到eth0。 # debian lenny VBoxManage clonevdi old.vdi new.vdi 拷贝成功，但当打开new.vdi的时候就出现eth0找不到了。原来是使用VBoxManage的时候不但会为新的vdi文件产出新的UUID，还会为其分配一个新的mac地址，以避免冲突，这样在debian中就会把新的mac地址设置为eth1，结果就杯具了。 解决方法有2个，其实差不多： 在new.vdi中，修改/etc/udev/rules.d/70-persistent-net.rules，一般会有eth0和eth1两行，把eth0那行去掉，然后将eth1改成eth0。 把/etc/udev/rules.d/70-persistent-net.rules中的内容直接删除，然后重启，让系统自动去检测网卡，然后重新生成该文件。其实在copy之前就可以删掉了，这样所有copy出来的都不用修改了，让系统自己去检测。 /etc/udev/rules.d/70-persistent-net.rules这个文件是在网卡有变动的时候才会变化的，里面记录着网卡的信息，虽然VBoxManage会为new.vdi创建新的网卡，但是debian的行为是把这个网卡作为新增的网卡记录在/etc/udev/rules.d/70-persistent-net.rules中，而没有进行调整，所以使用的还是有冲突的eth0。]]></description>
		<link>http://blog.endlesscode.com/2010/11/19/lost-eth0-in-copied-vdi/</link>
			</item>
	<item>
		<title>最近也Objective-C了</title>
		<description><![CDATA[还是换回原来的主题了，Apple风格的那个主题在显示上还是有不少问题。Objective-C接触了2个多星期，写一下上手体验。 内存管理初体验 最近看了看objective-c，主要是要理解好objective-c的内存管理机制，其他的和c/c++差别就不大了。虽然objective-c 2.0提供了gc，但是要写出高效的程序当然要靠自己去管理好内存，特别是在移动设备上。在接触内存管理的时候google了几篇文章，都说得不清楚，后来看了看官方的文档，才在使用上有了比较清晰的理解。其实归根结底是理解下面这2种初始化的区别：（以NSString为例） NSString *string1 = [[NSString alloc] initWithString:@"Hello World!"]; NSString *string2 = [NSString stringWithString:@"Hello World!"]; string1是需要自己调用release（和创建在同一作用域释放）或者autorelease（string1作为函数返回值的时候），因为用alloc创建的对象是说明一种拥有关系（own，即retain count相应为加1，copy/retain也是），而string2则不是拥有关系，则自己不用调用release。因此，@property中的三个属性，assign/retain/copy也就更好理解了。 assign是弱引用，retain count不变化； retain就是强引用，声明拥有关系，retain count加1； copy就是拷贝新的对象并引用到拷贝上。 而内存池（autoreleasepool），我总觉得是为了string2这种创建对象的方法和string1作为返回值的场合而存在的。 因为对于string2这样的创建对象方法，其实也就是在initWithString之后再调用一次autorelease而已； 而在string1作为返回值的场合，不能release了再返回也不能返回了再release，所以需要托管给内存池来管理。 而在Cocoa在每一个事件循环的生命周期都保证会有一个内存池创建和销毁，这样对象的管理机制就完美了。 Objective-C不难用 因为使用python习惯了，一下写回c，就像回到了原始社会一样。用了几天才发现，其实Objective-C在Foundation框架上提供了很多相当方便的类以及类的方法，足以让我找回写python的那种方便性。比如简单地从网上抓取一个文本文件存为字符串： NSURL *url = [[NSURL alloc] initWithString:addr]; NSString *content = [NSString &#8230; <a href="http://blog.endlesscode.com/2010/11/08/objective-c-recently/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
		<link>http://blog.endlesscode.com/2010/11/08/objective-c-recently/</link>
			</item>
	<item>
		<title>第三季度</title>
		<description><![CDATA[好几个月都没有写技术总结了，这几个月状态都不那么好，各种烦心事和身体不适，无法专注地去做好一件事情。代码也写得甚少，比不上在大学的时候写得那么频繁。这几个月懒惯了思维也有点僵硬了。有些计划也不得不推迟了，相当惭愧。 小病了几次也让我不能再像以前随意地透支那么多时间了。从大学开始，都习惯了晚睡，哪怕是工作了，也是一直捣鼓到深夜3点多才去休息，是习惯了深夜的那种清静的环境，可以让人专注地看书做总结写代码，经过了这么长时间的一段狂躁的生活，人可能也累了。 这几个月把时间耗得最多的是在游戏上，去美服玩了一个多月，也去台服玩了一个多月，对别人而言是一种娱乐，但对自己而言当然是浪费时间。毕竟烦躁的时候总需要找些东西来消磨时间。体验了一下国外的游戏气氛，用“仓廪实则知礼节”来形容3地的差异是最贴切不过了。 这段时间也在想如何去规划自己的时间，毕竟也不能一直这样狂躁的生活习惯。 去香港买了个Mac Pro，可以用简约来形容我用Mac的体验，当然也不缺乏一些炫的用户体验，只是个人不太喜欢，一般都关掉。从Ubuntu过渡到Mac还是没有什么困难。 之前麻烦主管帮我配置了几个ssh accounts，想捣鼓一下hadoop，但现在还没有什么进展，深感惭愧。 博客换了一个Mac风格的主题，把顺带的顶部banner图片和侧栏的部分widgets去掉了，简洁很多，文字有shadow的效果，不过还可以接受。 第四季度也来了，千里之行，始于足下。 今天刘晓波也获得了诺贝尔和平奖，为中国人争口气了啊。]]></description>
		<link>http://blog.endlesscode.com/2010/10/08/3rd-quarter/</link>
			</item>
	<item>
		<title>读过《观止》</title>
		<description><![CDATA[今晚总算把《观止》看完了，看得比较快，基本上是当叙事小说一样看。这个书名看起来像文艺书，但实际上是讲述Windows NT这个操作系统的创造史。为什么Windows NT这么出色，因为在当时它的诞生改变了人们对操作系统的看法，它引入了现在我们看起来很理所当然但当时还没有的技术：抢占式的多任务处理、可安装在通用的硬件平台、支持32位内存寻址、支持大容量文件并具有容错功能的NTFS（NT File System）等等。当然这些系统功能并没有在书上描述，这本书从头到尾都是在讲述整个NT团队是如此在艰苦的进度压力和技术压力之下花了将近5年时间创造出NT。 这个NT团队的领导人就是Dave Cutler，性格独断脾气火爆，技术牛B，现在来说就是一个传奇的程序员，当他领导NT团队的时候已经是个快50岁的人了。有个小插曲或者会更令人记住他是谁，就是当他招聘小秘的时候会问一个问题“How do u think about the word &#8216;fuck&#8217;?&#8221;，只有那个回答了&#8221;Its my favorite word”的MM才拿到了offer。 从1988年10月开始到正式发布的1993年7月23日，历时接近5年时间，团队从开始的20多人到最后的200多人，在这5年时间里面NT团队面对的是各种功能需求的增加、遥遥无期的进度、不断冒出的bug，还有其他非技术问题，如家庭和爱人，可以说是可歌可泣，NT团队的每个成员为Windows NT奉献太多了。 虽然看得比较快，但是一些体会还是想记录一下，以后有时间再翻出来看或者也会有不同的体会。 从本来只有一个内核开发的团队，到后面慢慢增加了图形开发小组和网络开发小组，整个团队大部分人都是物理和数学出身，毕竟从理科出身的容易投入到计算机行业，加上当时计算机行业还远没现在这么热门。由于当时NT的目标定得比较高，因此很多迎合市场的需求都被添加到功能列表中，并要求兼容以前的DOS和Windows程序，不停地添加功能需求以及保证兼容性基本上就直接导致了进度问题，由于领导的Dave Cutler是个基本上为了NT放弃了家庭的人，因此给NT的团队带来的直接影响就是在进度压力之下的疯狂加班，纵然如此，但是在微软的给予的高股票期权和Cutler的压迫之下，团队的成员也是能积极高效地工作，其实这里，我还觉得有个原因是在这种环境之下驱动大家去工作的，就是大家都希望能够创造出一个出色的产品，虽然工作辛苦，但是这种渴望创造的欲望也是驱动团队成员努力工作的一个原因。 程序员、测试员和构建员是组成NT团队的主要3个角色，在那个年代，测试员和构建员的地位并不高，但是慢慢程序不断地被挑出bug并不断地被完善，越显得测试员和构建员的重要性。相比于目前自己所做的项目，哪怕是相差20年，目前我们项目的流程还是比不上那时的NT团队。每个程序员的commit都是基于不会导致构建失败的前提下，当然构建的时机可能是即时也可能是固定某个时候，但是每个程序员的commit都是使构建能正常进行的，整个流程都是井然有序地进行。而且，更让我欣赏NT团队的是，在项目的后期，Dave Cutler甚至是长期定居在构建实验室，来专门看每个程序员提交的各种代码，来保证程序代码的质量，那么多不知道他怎么看得过来。对于程序员犯的错误，Dave Cutler可是不留情面地批评，或者正是这种领导的压迫之下反而提高了团队成员的代码严谨，或者可以说是领导威严的作用。 团队规模变大，可能就增加了成员之间对技术问题的冲突，但是正如书上说，这种冲突有时候会激发对程序代码的改进，其实倒觉得这种冲突是来源于对自己代码逻辑的自信，或者说是个性鲜明，和提倡中庸之道的国内还是有点区别。 到了项目后期，真的可以算得上夺命狂奔，因为有了deadline，所以对bug的分类控制、暂停新功能需求的加入、不停的压力测试、客户的bug反馈和beta版的多次发布等等，各个成员都日以继夜地修正各种showstopper和一等级的bug。 最后Windows NT发布了，微软就站在了操作系统的顶峰了。而从始自终，Gates都没有对NT团队有什么干预，只是定期了解开发进度和进行产品的测试，给了NT团队很大的自由度。 《观止》这本书虽然只是描述了整个NT的创造史，其实更像一本项目管理的书。]]></description>
		<link>http://blog.endlesscode.com/2010/08/11/reading-showstopper/</link>
			</item>
	<item>
		<title>香港游记</title>
		<description><![CDATA[上周5去香港玩了3天，本来是想昨晚就写一下的，但是10点多回到来和同学吃了个宵夜就晚了。 周5早上7点半就醒了，然后去匆匆地坐地铁去火车站，坐传说中的河蟹号到罗湖，其实这还是挺快的，河蟹号一个小时就从广州到罗湖了，不过第一次过境，还是花了点时间，到香港之后，再从地铁和公交到西环，这里也花了1.5个小时了，不过香港的公交比广州的舒服多了，没有广州挤得那么厉害，而且，小公巴如果满人了司机是不会让人再上来的。 Day 1： 第一天到阿清那已经1点多了，两个人就去附近吃了个性价比还算可以的餐厅吃了个扒，然后接下来就去港大了。港大的正门没有像一些大学那些有气势，相对来说还是比较小的，而且港大也是建在半山腰的，从西环那里上去都是坐电梯上去的。参观了一下港大，中山像、莲花池、月明池，不过有个雕塑还是纪念敏感词事件的，叫国殇之柱。就是下面这个，照得不太好，要侧着脖子看。 接着下午就去了黄大仙，我和阿清都求了个事业签，那个解签的说我的是中下签，最近2个月事业不顺，要跳槽就趁早，我听得都蒙了。然后她说阿清下下签，阿清一听，皱了皱眉头，“哼？”的一声，那个解签的又说阿清会有贵人相助，不用太担心，这个有点搞笑，后来还叫我们去求个护符，看来这个中下/下下-&#62; 护符是个固定的模式。 之后我们就去了一趟铜锣湾，商业街那是非常地热闹，不过我们也只是去买了几件衣服基本没有买什么了，毕竟逛商业街的确不应该是2个男的应该做的事情。 晚上就去了金紫荆广场，那里游客也不少，其实金紫荆广场也没有什么大的看点，就只有一个金色的紫荆花雕像。接下来就坐游轮去星光大道那边，星光大道那里都是一些明星的手印，一些较为出名的就比较多人围观，比如刘德华、成龙等等，我也照了几个，下面这张是刘德华的，嘻嘻。基本上去了星光大道就回去了，本来还想去兰桂坊的，但逛了大半天太累了。 Day 2： 因为第一天玩得太累了，因此第二天睡到很晚才起来，所以上午也就没有去什么地方玩，由于同学下午要去上课，我也背着个书包又做了一回学生。上的这门课是Network Security，professor是全程用英语讲课，不过港式英语口音太怪了。讲到Security Model的时候提到一个牛B的模型“Chinese Wall”，“Prevent information flow that will result in conflict of interest”，这个GFW都已经算是一个安全模型了。 晚上本来还想去一趟兰桂坊的，但是由于下大雨，两个人只能回去看电影玩星际了。这一天基本上没有怎么出去外面玩。 Day 3： 今天也是睡到很晚才起来，所以行程都是从下午开始。因为晚上要回广州，所以下午能计划的比较少，就去坐了一下山顶缆车，不过由于是周日，人那是相当地多。去到了山顶，俯视全香港，那景色是相当地让人看起来舒服： 晚上去大快活把晚餐消灭了，不过刚好赶上下午茶时间，所以价格还是相当地便宜，两个人70HK$已经吃得非常赞了，米线、蜜汁鸡比、西多士还有红豆冰，消费没有原来想象中那么高。 结束 总的来说，玩得还算不错，因为是借宿在同学家，因此也省了一笔，而且这3天阿清都是带我去一些性价比相当高的地方吃饭，光是吃扒都吃了2天，囧，港大饭堂的、华人餐厅、中环的餐厅，吃扒吃到牙都累了，不过凡是能点西多士的地方我都会点这个。衣服以我们这边的消费水平来讲是比较贵，但以香港那边的消费水平来看其实也是一般般。没有去海洋公园和迪士尼，两个男的去这两个景点还真是没有意思。]]></description>
		<link>http://blog.endlesscode.com/2010/08/10/journey-to-hk/</link>
			</item>
	<item>
		<title>写在毕业一年后</title>
		<description><![CDATA[不经不觉毕业也一年了，走得太匆忙，并没有和大家留下什么伤感的回忆。 从入职到现在，除了觉得时间过得很快之外，就是觉得自己没有把握好时间，或者毕业后各方面的原因学习动力和激情也比不上在学校的时候。 回头看看这一年…… 09年的下半年，大部分时间是投入在研究fopen这个Facebook开源SNS，由于这是搭建在Linux平台并用php和c++写的，Linux和php这两方面对我来说都不太熟悉，折腾了好长的一段时间。fopen并没有原本所期待那样能够真正地投入到正式的产品使用，更多的，它只是Facebook的一个超级简化版，而且文档也相当地不完整，整个fopen依赖的库文件也很多，我当时也没能弄明白这些库文件是做什么的。在改写JavaScript的部分，虽然代码逻辑是比较清晰，但是像它那样的逻辑重写1000的JavaScript代码都要10多秒，不知道它在正式投入使用的时候是怎么提升解析速度的，又或者是正式产品中是使用了C++重写或者利用其他的一些缓存技术。在OpenAPI部分，那时候还弄不明白那个timestamp和callback的参数作用，后来才明白timestamp是用于防止replay attack，而callback是为了使用jsonp的，只怪当时知识面太窄了。虽然最后也用python实现了类似的JavaScript Parser和OpenAPI以及JavaScript client lib，但实际上需要完善的空间实在太多，只是时间无法安排过来。、 09年11月份开始的时候封闭开发了好长一段时间，封闭开发最大的体会就是环境很安静，但人能够很集中精神地开发，效率的确高很多。其实这段时间最大的收获是在美林的时候认识了老邓，他是云风带领的那个工作室的成员，他把我带进了函数式编程的世界，跟我讲了很多除了c++、java、.net之外的其他语言情况，比如lisp、squeak、haskell、erlang等等，还跟我讲了计算机世界里面一些有意思的事情和人物，并介绍了好几本书给我。作为刚毕业的新人，老员工知识和经验的分享正是新人所需要的。 从新年放假回来后，前2个月是主要是完成一些比较琐碎的东西，开发一些平台上的小功能和修复一些bug。后2个月主要是开发一些营销活动，进度非常赶，这些活动项目时效比较短，我只是加班把这些活动项目做出来，但是我没有时间把这些项目做得好，我自己是个追求完美的人，作品写得这么挫却又无可奈何心里面是何等的不爽。我觉得公司的营销同事制定营销推广计划的时候应该和开发人员先协商进度安排以及项目上线的各方面可行性，而不是把计划定好了，然后有什么进度压力就直接推给开发人员。 Python写了一年多，但是我觉得在同一届入职的同事里面，掌握得最差的应该是我了。在Python花的时间的确是太少了，我仍然需要阅读更多关于Python方面的资料和写更多的代码，pythonic是我的目标。JavaScript方面在实际上项目倒是提高了不少，对闭包和作用域链的理解，一些IE的hack，页面脚本的加载顺序等等，Firebug的脚本调试作用也相当的强大和方便。总的来说，各方面都有一定的提高，不过前端的css的样式设置我依然觉得很痛苦。虽然平时都是在Linux环境下开发，但是我对Linux的理解还是相当地肤浅，Shell编程和Linux C的提高是我的下一个目标，Linux下的很多命令，如iptables、tr、sort、awk等等只是略懂一二，我觉得太多的Linux常识我需要去补充。 从自己每个月写的blog数量基本上可以反映出自己在当月的工作繁忙程度以及自身的状态。6月份的状态算是上半年中最好的了，放下了一些纠结让自己更能专注。我很怀念在学校那种为了完成一个作业或者项目连续好多个晚上搞得通宵，不分昼夜专注地去做，工作之后很难有这种机会了。前几天和大学的同事吃饭，也是舍友，他说他想花5年的时间给自己充电再去微软，他当初在百度和微软实习过，只是有点可惜。前段时间回到学校，也得知有位同学正准备出国。感慨大家都很有目标，也同时为了自己的目标而在努力地奋斗。一生何求，我也得要为自己定个目标。 胡扯了一下就写了2个小时，时间是只能靠自己把握的，这是个和青春竞争的人生阶段。]]></description>
		<link>http://blog.endlesscode.com/2010/07/01/one-year-after-graduation/</link>
			</item>
	<item>
		<title>zz Dojo Javascript 编程规范</title>
		<description><![CDATA[虽然这说是Dojo的编程规范，但实际上大部分都是普遍应用的规范，所以就当是JavaScript的编程规范转载过来了 前言 相当不错的 Javascript 编程风格规范，建议大家采用此规范编写 Javascript。原文链接： http://dojotoolkit.org/developer/StyleGuide 。 翻译（Translated by）：i.feelinglucky{at}gmail.com from http://www.gracecode.com ，转载请注明出处、作者和翻译者，谢谢配合。 本文地址： http://code.google.com/p/grace/wiki/DojoStyle 。 序 Any violation to this guide is allowed if it enhances readability. 所有的代码都要变成可供他人容易阅读的。 快读参考 核心 API 请使用下面的风格： 结构 规则 注释 模块 小写 不要使用多重语义（Never multiple words） 类 骆驼 &#8230; <a href="http://blog.endlesscode.com/2010/06/25/zz-coding-convention-of-javascript/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
		<link>http://blog.endlesscode.com/2010/06/25/zz-coding-convention-of-javascript/</link>
			</item>
</channel>
</rss>

