基于coroutine的gevent

coroutine也是一种并发模型,但不同于thread和callback,它的所有task都是可以在一个线程里面执行,然后可以通过在一个task里面主动放弃执行来切换到另一个task执行,它的调度是程序级的,不像thread是系统级的调度。gevent就是一个基于coroutine的python网络开发框架,不像twisted那样集成了很多库和协议,gevent非常精简,当然文档也很少,在性能上的话,看了PyCon上的视频,对比了twisted和其他的几个库,在内存的性能上非常地优秀,代码简洁而且也支持多核。

做了个相当简单的ChatService,有登录、群发消息、退出这3个消息,协议就是用简单的json了,有时间再试试xmpp看看。”monkey.patch_all()” 这个调用就把python原生的一些socket对象和方法替换成非阻塞的异步调用,写起来感觉还是很方便。

Continue reading

Posted in Python | Leave a comment

Shell的知识点整理

这几天抽了点时间看了一下《Advanced Bash-Scripting Guide》, 之前一直觉得shell这门脚本很有意思,虽然用得不多,但感觉shell这门脚本似乎有点粗糙,但看了abs-guide之后就觉得shell还是很强大的,很多高级特性之前都没曾接触过,平时也用得不算很多。浏览了一下abs-guide之后做了一些简单的笔记,方便以后查看,每个”echo ===”之间就是代码片段,在bash version 3.2.48下测试过,点解高亮区的”view source”可以直接复制所有代码。

Continue reading

Posted in Unix/Linux | Leave a comment

在Debian搭建SVN

今天在Linode买的vps上搭了个svn,简单记录一下过程和遇到的问题。

先说遇到的问题吧,基本上就是
1. “Could not open the requested SVN filesystem”;
2. “Server sent unexpected return value (403 Forbidden) in response to OPTIONS “.

第一个问题是因为开始没有搞清楚创建一个和多个svn repository的区别,而第二个是因为权限设置的问题。

svn服务器比较重要的涉及安全的问题就是用户认证、访问授权以及传输加密。根据官方的介绍,搭建svn有几种方式,各有优劣,我用的是Apache + mod_dav_svn+Basic Auth。 具体流程如下,以多个为例,单个的只是参数的差别:

1. 安装所需软件

apt-get install subversion subversion-tools apache2 libapache2-svn

2. 创建存放的路径

#路径任意
#注意的是这是多个svn repositories的根目录
mkdir -p /home/svn/repos
#设置apache访问的权限, www-data是apache默认的user和group
chown -R www-data.www-data /home/svn/repos

Continue reading

Posted in Unix/Linux | Leave a comment

VirtualBox拷贝vdi丢失eth0

今天用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。

Posted in Unix/Linux | 2 Comments

最近也Objective-C了

还是换回原来的主题了,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就是拷贝新的对象并引用到拷贝上。

Continue reading

Posted in Mac/iOS | Leave a comment