-
个人简介:
PHP开发者,高可用性、分布式集群实践者,伪Python、GAE开发者,伪Linux系统管理员,伪MySQL管理员
2009年8月至今服务于阿里巴巴云计算公司
2008年8月至2009年7月31日服务于博客大巴
-
归档
- 2012 年一月
- 2011 年十一月
- 2011 年九月
- 2011 年八月
- 2011 年七月
- 2011 年六月
- 2011 年五月
- 2011 年三月
- 2011 年二月
- 2011 年一月
- 2010 年十二月
- 2010 年十一月
- 2010 年十月
- 2010 年九月
- 2010 年八月
- 2010 年七月
- 2010 年六月
- 2010 年五月
- 2010 年四月
- 2010 年三月
- 2010 年二月
- 2010 年一月
- 2009 年十二月
- 2009 年十一月
- 2009 年十月
- 2009 年九月
- 2009 年八月
- 2009 年七月
- 2009 年六月
- 2009 年五月
- 2009 年四月
- 2009 年三月
- 2009 年二月
- 2009 年一月
- 2008 年十二月
- 2008 年十一月
- 2008 年十月
- 2008 年九月
- 2008 年八月
- 2008 年七月
- 2008 年六月
- 2008 年五月
- 2008 年四月
- 2008 年三月
- 2008 年二月
- 2008 年一月
- 2007 年十二月
- 2007 年十一月
- 2007 年四月
-
杂项
标签归档:Python
python非贪婪、多行匹配正则表达式例子
一些regular的tips: 1 非贪婪flag >>> re.findall(r”a(\d+?)”, “a23b”) ['2'] >>> re.findall(r”a(\d+)”, “a23b”) ['23'] 注意比较这种情况: >>> re.findall(r”a(\d+)b”, “a23b”) ['23'] >>> re.findall(r”a(\d+?)b”, “a23b”) ['23'] 2 如果你要多行匹配,那么加上re.S和re.M标志 re.S:.将会匹配换行符,默认.不会匹配换行符 >>> re.findall(r”a(\d+)b.+a(\d+)b”, “a23b\na34b”) [] >>> re.findall(r”a(\d+)b.+a(\d+)b”, “a23b\na34b”, re.S) [('23', '34')] >>> re.M:^$标志将会匹配每一行,默认^和$只会匹配第一行 >>> re.findall(r”^a(\d+)b”, “a23b\na34b”) ['23'] >>> … 继续阅读
杂记
本来要学老王,取名叫乱炖,老王一直执着的用这个词,那我就换一个吧。一个多月没写博客了,前面一段时间是因为实在太忙,后面是懒,疯狂加班之后回家就什么都不想动,过了经过差不多一个多星期的正常人生活,现在终于缓过神来了。这个项目差不多是我加入以来我做过的最大的项目,很累,也很疯狂,项目还在继续,迭代一轮一轮的进行中。留下点笔记,记个印象。 1、项目开始的时候往往思想很宽泛,这个想要,那个想要,每一个功能都是无敌的,每一个功能都是必须的。我一直不赞同一开始就把产品设计的看上去很大很全,主要基于两个理由: 第一,产品一开始设计得大而全,会导致开发周期被拉长,在没有经过市场检验或者最终用户使用的时候,过长的周期会导致开发人员效率降低,没有人愿意做一个看不到前景的产品,没有来自最前线新的需求刺激,没人知道这个东西是不是靠谱的,很长的开发周期还会导致开发人员的疲惫,当然这个可能有些公司不一样,如果人手充足,这个情况或许不那么明显,但据我所知,所有的公司都是缺人的,特别是IT公司,为项目加班是常事,如果这个项目周期再长一点的话,估计就崩溃了。 第二,产品一开始就设计得大而全会导致设计出很多无用的功能,每个人都知道一个产品存在的意义在于其20%的功能,或许有人要反驳,我不预先搞多一点功能,我怎么知道那20%的功能是什么。这个疑问是有道理的,问题就在于,如果我们不能找出最精华的20%功能是什么,那么我们或许可以把圈子放大到30%,40%,甚至更大一点的范围,我们的工期也会缩短很多,避免做无谓的工作。 2、关于开发周期,我觉得最好不要超过一个自然月,一个月20个工作日,除掉UI和页面部分设计,再除去测试和修Bug时间,留给研发的时间大约40%~60%,也就是8~12个工作日,如果只需少量页面方面工作,留个研发的时间会多3~5个工作日。研发工作大约两个星期的,大部分正常上班时间是完不成工作的,不可控的因素有很多,所以这个阶段,可能会加班加点,稍微放松的时刻留在bug修复阶段和后续迭代的UI及页面设计阶段,这个阶段如果稍作控制,可以避免研发人员加班,有至少一个星期的时间让心情得到释放。 3、以上两点基本上接近了敏捷开发的管理流程,敏捷开发在最大限度的保证质量和兼顾项目人员之间的平衡,套用一句话,如果实施了敏捷开发,员工没有离职,那一定是加工资了,如果没有加薪,那一定会离职。需求的不断刺激和短周期的迭代,会导致项目人员情绪的紧张和工作的高压。 4、关于Zend DB,这个玩意的可移植性确实不错,稍作整合,就能嵌入其他框架,但是这玩意最好还是别用在复杂的项目中,而且由于Zend DB本身的设计问题,很多东西你不得不去搞个很变态的方式去解决,比如计算符合条件记录总数。可能由于出于降低耦合度的目的,Zend DB 本身不自动设置缓存,每次需要在action,在新建的每个Model中都要去写和缓存相关的代码,当然解决办法也是有的,就是自己在为Zend DB增加一个组件,将接口和数据库操作给整合进去,然后新建的Model不再继承原先的Zend_Db_Abstract,而是继承你增加的那个组件,从而做到相对优雅的使用缓存。不过我还是推崇,直接写SQL,虽然看起来不那么优雅,但是更容易掌控,对项目日后的调优,非常有益,在复杂逻辑的时候表现优越,如果只是单表操作,ORM依然是不错的选择。至于怎么选择,取决于你的需求,和你项目组人员的整体水平。 5、关于Zend Cache,这个玩意是个好东西,让我们在本地写程序的时候可以方便的使用文件缓存,到服务器上也很方便的改成memcache缓存,少排了好多二氧化碳,Zend组件最优越的地方就是可以轻松的整合,偷懒少写了好多代码,唯一用的不爽的地方是Zend Cache的Tag功能,这个功能本来是个很cool,很有用的功能,但是因为大部分key-value缓存不支持这个玩意,这个东西变成了只有文件缓存时可用,但是在每次save一个缓存的时候,如果需要给这个缓存加个过期时间的话,就得这样写:$cache->save($data, $cache_key, $tag, $expire),因为memcache不支持这个玩意,这时候每次传入的tag就是一个空的数组,我就一直不明白为啥$tag不放到最后一个参数,毕竟所以的缓存类型都支持过期时间,而只有文件缓存才支持Tag 6、关于Tornado(被墙了),我不知道国内用的人多不多,源代码hosting在github上,从邮件列表来看,似乎国内用的人不多,在华莽用户组这样的Python社区里面都几乎没有人提及,这个玩意非阻塞性的Web Server,集成了Web Framework 和 Web Server,我有幸能在我的试验性项目中使用这个东西,提供一组数据,没啥用处,供需要的人参考,单个进程大约能支持1.2K左右的活动链接,当然,要在Linux服务器上,并且支持epoll,多进程可以到2K,占用内存在100M以内,服务器没有任何异常,有进一步挖掘的潜力,我估计能超过3K,当然不建议你这么做,因为Server的后端可能处理不过来了,如果你想动手实现一个Web IM 之类的应用,Tornado是最佳选择之一,另外,如果用来做Web游戏的Server,也是非常合适的,Tornado的Web Framework这一块还很简陋,非高级人员+非Geek人员,不建议用来做产品开发 7、如果你还在寻找一个项目管理工具,我建议你使用Redmine,这玩意能够显著帮助你的团队减少抱怨,减少无效沟通,能够让上下游的同事更自如的安排计划,当然,这一切还需要你做一个布置,平台是死的,需要大家往里面填充属于自己的东西
超级简单Python Socket Server一例
中午,公司太吵,闲着无聊,用python自己跟自己说话,算是YY吧,hoho server端代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # -*- coding: utf-8 -*- from socket import * import sys, time, encodings if __name__ … 继续阅读
Django 1.2.1 CSRF verification failed. Request aborted.
I was getting this 403 error today while attempting to make a POST request to a view: 403 Forbidden CSRF verification failed. Request aborted. Help Reason given for failure: CSRF cookie not set. Hopefully this saves you some time because … 继续阅读
Windows平台安装Python2.6 和 MySQL-Python
Python 版本:2.6 下载地址:http://www.python.org/download/releases/2.6.1/ 下载msi文件并安装 MySQLdb版本: MySQL-python-1.2.2.win32-py2.6.exe 下载地址:http://home.netimperia.com/files/misc/MySQL-python-1.2.2.win32-py2.6.exe 参见:http://sourceforge.net/forum/forum.php?thread_id=2316047&forum_id=70460 常见问题: 1.ImportError: DLL load failed: 找不到指定的模块。 —————————————————————————————————- D:\Program Files\Python2.6>python Python 2.6.1 (r261:67517, Dec 4 2008, 16:51:00) [MSC v.1500 32 bit (Intel)] on win32 Type “help”, “copyright”, “credits” or “license” for more information. … 继续阅读
django Settings cannot be imported 错误解决
在命令行中直接敲入Python命令进入交互模式,然后使用 from django.template import Template ,Context t = Template(“Test is {{test}}”) 会导致:ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.原因是django的配置信息没有初始化 有两种解决方法, 一种是切换到你项目或者APP所在的目录使用manage.py shell命令启动交互窗口 还有一种是手动将django的配置初始化: >>> from django.conf import settings >>> settings.configure()
在Linux上安装mod_wsgi文档中文翻译(二)
上节我们介绍了mod_wsgi,下面我们讨论怎么在Linux发行版上安装他们。 如果你使用的是Linux操作系统,可以直接从源代码安装。 在Linux上安装可能会遇到的问题,详情请见“安装指导”,如果你喜欢专门为你的Linux发行版准备的包,下面给出详细列表。 Debian 包 可以再这里找到Debian包的详细信息: http://packages.debian.org/unstable/python/libapache2-mod-wsgi 感谢Bernd Zeimet对这个版本的打包的与编译。 Fedora 包 可以在这里找到Fedora包的详细信息,URL是: http://download.fedora.redhat.com/pub/epel/5/i386/repoview/mod_wsgi.html Arch Linux 包 Arch Linux包的详细信息可以在下面链接找到: http://aur.archlinux.org/packages.php?ID=13394 感谢Nicolas Steinmetz在这个发行版上的与编译与打包 SUSE Linux 包 关于SUSE包的详细信息请点击如下链接: http://software.opensuse.org/search?q=mod_wsgi 感谢Peter Poeml在这个发行版上的编译与打包 重启Apache服务 当在Linux上使用与编译的Apache时,他们一般将Apache的启动和停止功能纳入服务进行管理。在这 种情况下’apachectl’脚本将不能正常,这需要使用操作系统的具体机制去启动、重启和停止Apache服务。 在这样的操作系统利用’apachectl’重启Apache服务可能会出现如下错误: httpd (pid 22361?) not running (98)Address already in … 继续阅读
mod_wsgi文档中文翻译(一)
什么是mod_wsgi ? mod_wsgi的目标是实现一个简单的Apache模块,支持任何Python WSGI的接口的Python应用程序的托管。该模块适用于高性能生产的WEB站点,同时也适用于自己维护站点的WEB 服务托管(虚拟主机环境–译者注)。 运行模式 用mod_wsgi来托管应用,有两个主要的模式可以使用,一种是“嵌入式”模式,Mod_wsgi与Mod_python运行方式相同,所有的python代码都将在apache 子进程中执行。因此当WSGI应用在此模式下运行可以与其他的Apache托管的模块PHP和Perl共享形同进程。 另一个在UNIX Apache 2.*环境下可选替代的daemon模式,这种模式运作的方式在类似的FastCGI / SCGI解决方案,即在不同的进程运行WSGI应用。与FastCGI / SCGI解决方案不同的是,当执行WSGI程序时不需要单独的基础结构(infrastructure),一切都是自动处理的mod_wsgi。 一切都是自动处理的mod_wsgi,影响正常使用的Apache模块的PHP , Perl或其他语言的Apache子进程服务的静态文件和主机应用程序使用大大减少。守护(daemon)进程可能需要时也可以作为一个独特的用户运行以确保WSGI应用程序之间不能互相干扰或获取信息。 服务性能 该mod_wsgi模块是用C代码直接对内部的Apache和Python应用程序接口编程。因此,服务WSGI应用与Apache它具有较低的内存开销和性能优于现有的WSGI适配器mod_python或替代的FastCGI / SCGI / CGI或代理的解决方案。 虽然嵌入式技术模式能够表现得更好, daemon模式通常是最安全的选择使用。这是因为要嵌入模式高性能需要调整apache MPM设置,默认设置偏向于服务静态媒体和PHP应用。如果Apache 的MPM设置未与服务的应用相对应,将会表现出糟糕的性能而不是更好的性能。 因此,除非你非常熟悉Aapache的配置,否则推荐使用daemon模式,总体而言,大型Python Web程序,通常你不能看出嵌入式(embedded mode)和守护模式(daemon mode)明显的差异,因为瓶颈在Python Web和数据库访问上。 支持的应用 mod_wsgi遵循WSGI接口规范,任何符合WSGI接口规范的Python Web框架或者应用都可以被支持。 我们所熟悉的主要的Python web框架或工具,包括CherryPy, Django, Karrigell, … 继续阅读
Python和其他语言数据类型比较
静态类型语言 一种在编译期间就确定数据类型的语言。大多数静态类型语言是通过要求在使用任一变量之前声明其数据类型来保证这一点的。Java 和 C 是静态类型语言。 动态类型语言 一种在运行期间才去确定数据类型的语言,与静态类型相反。VBScript 和 Python 是动态类型的,因为它们确定一个变量的类型是在您第一次给它赋值的时候。 强类型语言 一种总是强制类型定义的语言。Java 和 Python 是强制类型定义的。您有一个整数,如果不明确地进行转换 ,不能将把它当成一个字符串。 弱类型语言 一种类型可以被忽略的语言,与强类型相反。VBScript 是弱类型的。在 VBScript 中,您可以将字符串 ’12′ 和整数 3 进行连接得到字符串’123′,然后可以把它看成整数 123 ,所有这些都不需要任何的显示转换。