上节我们介绍了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 use: make_sock: could not bind to address 0.0.0.0:80 no listening sockets available, shutting down Unable… Read more »
Monthly Archives:: 三月 2009
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, Pylons, TurboGears, web.py, Werkzeug 和Zope 运行良好,我们所熟知的主要的Python web应用包括MoinMoin, PyBlosxom 和 Trac 能够很好的运行。 系统要求 mod_wsgi软件包可以编译和使用任何的Apache 1.3 ,… Read more »
Zend Framework学习笔记(二)
很多天没再研究Zend Framework了,趁着还有些闲时间,再次研究一下,Zend Framework学习笔记(一)中大概了解了一下Zend Framework的代码接口分布,《Zend Framework in Action》一书中给出的标准文件夹结构如下图: 个人觉得这个结构只适合很小的项目或者不太复杂的项目,因为zend Library是包含在项目里面与web_root同一级,假如我需要创建一个helloword_2的项目,那么不得不再复制一个同样的文件夹结构,Zend Library将会有两份,如果有十几个或者更多的这样的工程,那么Library将会有很多,Zend Framework是个很活跃的框架,没准哪天就升级了好几个版本,如果你需要升级或者打补丁,那么就会烦死。 当然在application下新建一个modules文件夹,将各个功能放在这里也是一个方法,但是你肯定不想一堆一点关联都没有的项目堆在一起,比如豆瓣的九点和群组,这两个几乎没有任何关联,当然实际应用中还有一个非常重要的用户模块。每个应用只做自己该做的事情,才会最大限度的独立很分散,无论是为了负载均衡进行多点发布还是代码维护都非常有用。而且所有的应用都通过一个入口(web_root中的index.php)和同一个分配器来处理,显然并发能力和容错能力都会下降,稍微有点差错,所有的应用都挂了。入口,分配器等属于全局的东西会影响所有应用,事实上可能很多东西对别的应用毫无用处,但是又有很多应用又需要,这时候就产生了浪费。 不过Zend Framework是个自由度很高的框架,可以自己定义一些东西,让Library从项目中独立出来,与项目目录平级,每个项目拥有自己的独立名称、web_root、入口和分配器,这样做可以为每个项目单独添加Vhost,升级内核(zend Library)也只要升级一个即可,有更高的自由度和松散度。所以我推荐如下的结构: 图中的test是一个项目名,请注意是项目名,不是功能名称,在application中你可以为这个项目建立很多modules,我在图中没有建立这样的文件夹,你可以建立test2,test3……项目,这些项目毫不相关,或者关联度很低,比如用户就得是一个独立的项目,其他的功能可能是一个或者几个独立的项目,事实上还有更好的目录结构,我是从神仙那里学过来的.在controllers文件夹中建立front, backend, amdin,三个文件夹,在view中也建立对应的文件夹,放在front中的内容不做任何限制,backend中需要登录,admin就不用说了,渲染views中对应文件夹的模板,全局进行权限控制,似乎神仙这样的结构不能提供精细访问权限,zend Framework提供了这样的精细权限控制。 如果你的代码要改成左图的结构,需要改动一些代码,首先是需要在入口文件中注册这些目录的位置代码如下: define(’APP_PATH’, dirname( dirname ( __FILE__ ) ) ); define(’LIB_PATH’, dirname( APP_PATH ) . "/library"); date_default_timezone_set(’Asia/Shanghai’); //directory setup and class loading set_include_path(’.’ . PATH_SEPARATOR . LIB_PATH . PATH_SEPARATOR . APP_PATH . ‘/application/models’ . PATH_SEPARATOR . get_include_path());… Read more »
发布修改过的WordPress纯白主题一枚
本主题的原作者是Bob,主题的底部有这位作者的连接,这里我已经附上,我主要是重写的CSS和functions调用,主题的宽度是1200像素的,可能很多人鄙视我设置这样高的像素,但是我更喜欢这样的宽屏界面,虽然现在还是有很多分辨率使用的1024宽度,不过从访问我博客的用户群看来,这样的屏幕占的比例很小,所以我斗胆弄这么大的分辨率。 特别介绍一下,我修改过的代码通过了W3C验证,通过IE6,IE7, firefox 3.0.7 safari 3测试。 我本来没打算发布这个修改过的东西,因为本身就不是我的东西,所以主题中的主题预览都是完整的保留原来的界面预览,以示对原作者的劳动成果的尊重。今天(2008-03-19)打开豆瓣发现有位朋友豆油我,问是否可以共享主题,本来这个就是共享的东西,当然依然可以共享,所以在此就献丑发布一下。如果你在我的基础上又增加了新的修改,而且把它变成了收费的商业模板或者利用修改过的模板牟利(捐助除外),那么请通知一下原作者,至于是否需要我,就随你便了,方便的话,让我也高兴一下,当然,我保证不会从你得到的利润中分去半点,你甚至可以不必通知我。 我在底部留下了由我修改的标记,不是为了增加反向链接,仅仅是为了如果是因为我发布的主题本身出错了,你可以方便的找到我。如果你认为没这个必要,或者觉得碍眼,可以在主题包中的footer.php找到相应的代码删除之,不会删又确实要删的,请在本文后面留言,我尽可能协助。 使用说明 1、使用这款修改过的模板需要你手动修改一个文件,将 header.php中我的导航改成你需要的即可,代码如下: <div id="menu"> <span ><a href ="/about" target="_blank">我的经历</a></span> <span ><a href ="http://cuiyusong.blogbus.com" target="_blank">在BlogBus的日子</a> </span> <span ><a href ="http://delicious.com/aaaacccc" target="_blank">Delicious</a> </span> <span ><a href ="http://www.douban.com/people/cuimuxi/" target="_blank">我在豆瓣</a></span> <span ><a href ="http://www.flickr.com/photos/muxi" target="_blank">Flickr</a></span> <span ><a href ="/contact/" target="_blank">找我聊天</a></span> <span ><a href ="http://muxi.mp" target="_blank">Chi.mp</a></span> </div> 改成你需要的连接和文字即可,如果你不需要这么多的导航,删除几个即可,如果你不喜欢这个导航,直接将这段代码从文件中删除即可,不会的朋友,请在本文后面留言,或者找我 2、将文件夹传到 /wp-content/themes/中 3、打开你的后台,在模板设置中找到limauorange… Read more »
Python和其他语言数据类型比较
静态类型语言 一种在编译期间就确定数据类型的语言。大多数静态类型语言是通过要求在使用任一变量之前声明其数据类型来保证这一点的。Java 和 C 是静态类型语言。 动态类型语言 一种在运行期间才去确定数据类型的语言,与静态类型相反。VBScript 和 Python 是动态类型的,因为它们确定一个变量的类型是在您第一次给它赋值的时候。 强类型语言 一种总是强制类型定义的语言。Java 和 Python 是强制类型定义的。您有一个整数,如果不明确地进行转换 ,不能将把它当成一个字符串。 弱类型语言 一种类型可以被忽略的语言,与强类型相反。VBScript 是弱类型的。在 VBScript 中,您可以将字符串 ’12′ 和整数 3 进行连接得到字符串’123′,然后可以把它看成整数 123 ,所有这些都不需要任何的显示转换。
Google Analytics官方在线培训与资格认证
从3月3日开始,Google推出了一个官方在线课程,培训主要的课程有Analytics的使用入门,报表解读,基本设置(有用信息过滤,电子商务跟踪,目标跟踪设置,多域名与子域名设置等等),还有 更高级的应用,比如自定义报表,报表切分,图表管理,趋势搜索,事件跟踪和真实页面浏览量,甚至是直接在代码中增加自定义参数。共有26个主题。 我对其中的多域名比较感兴趣,因为我觉得会有人利用这个多域名来作弊(刷统计数据),现在的广告主更相信第三方数据,如果这个真被用来作弊或者真的可以通过这个来作弊,很多广告主在选择大流量站点投放广告时又多了很多头痛的事。 另外,在课程完毕之后,官方还提供了一个测试(IQ test – Individual Qualification test)来证明你是否是个合格的Google Analytics网站分析人员。 不过要参加这个资格测试还需要花费50美圆,课程都是全英文的,测试当然也是,通过75%的测试就被认为合格。其实,个人觉得参加测试是没有啥意思了,不过课程是肯定应该去学习一下的,毕竟访客分析对于商业网站的运营是越来越重要了,学好了Google Analytics对你分析访客数据提高网站的可用性都是非常有帮助的。另外对于使用Google Analytics来跟踪Adwords PPC广告数据的朋友也应该去听一听,这对你控制广告预算,减少无效关键词的广告支出,>跟踪PPC广告的转换关键词,提高ROI都是非常有好处的。 如果有兴趣在课程结束后参加测试的朋友的话,可以参考Google Analytics IQ的FAQ,我大概看了一下,通过后IQ资格为18个月的有效时间,时间过了也许还需要重新测试吧,FAQ中也没有提到通过了会发证书,所以想拿“文凭本本”的朋友估计没戏。哎,在中国,本本还是挺重要的啊!哈哈…,不过对于在家工作的朋友来说,学到真本事才是真的,个人觉得web分析技术要比网站的SEO重要得多,要想成为web分析领域的专家可不容易。
无知害死人
最近我接连犯了两个比较重大的失误,非常的低级,低级到我无法原谅我自己。 一个是数据删除操作,因为采用全新的框架,不是很熟悉流程,所以在删除前进行了一些断点测试,查看参数调用情况,一直跟踪到核心代码,最后一次测试的时候,字段名没有传入,事实上这完全是我的故意,因为我想知道,字段名没有传入到底框架会给出什么样的错误提示,写了一个这样的SQL语句 DELETE FROM post WHERE ’123456′ AND ‘ 456789′ 这是执行这个语句花了一份多钟,我还以为发生错误了,因为是周六晚上调试的,周日早上睡大觉,运营的同学打电话给我们系统管理员,很多用户反映日志丢失了,我猜想我完了,就昨天我发布了新的功能,因为周末太闲。在mysql 的bin log中查到一条类似如上的SQL语句,转念一想,这个WHERE根本就没用,没有字段的where查询,后面都是true,相当于: DELETE FROM post WHERE true AND true 执行了之后的结果是,整个表被清空!还好我们采用的是分库分表的策略,我删除的不过几百个表中的一个,丢掉近一万个用户数据,最后劳烦我们万能的系统管理员花开同学 从备份中给找回来了。这其中得到神仙的协助, 虽然没有任何人批评或指责我,我永远记得这个教训。 第二个是关键词匹配系统,主要用来查找包含关键字的垃圾文章(spam)。这个是写的第一个完全不需要模板的程序,说白了,就是命令行运行的东西,但还算不上真正意义上CLI程序,关键字存在一个表的一个字段中,以回车分割每个字符,这个是通过另外的一套WEB界面输入的,我提取关键词的方法是explode(‘\n’, $str),结果运行了好几十次,查到的匹配文章少的可怜,今天晚上(2009-03-10)老魏告诉我,每天的spam远远大于我查找的数量,我查到的几乎可以忽略不计,这下我汗颜了,我一直以为是我们所有的用户都非常纯洁,所以才只有那么几个spam,原来是我程序出问题了,之前我都是直接增加一个常用的词进行测试的,比如“的”,查找非常准确,所以我深信我的程序没有问题,最后在刚哥(我刚到Bus时被指定的师傅,一位做了8年开发的牛人)的排查下,原来是windows下的换行和Linux下的换行根本就不是一回事,windows下是以 \r ,Linux下是\n,在将每个关键字trim一下之后,搜20个表就搜了近千篇垃圾文章。 我应该好好检讨我自己,无知有时候真的会害死人,因为不知道,所以死了也不知道怎么死了!
Zend Framework学习笔记(一)
1、请求 ,Zend_Controller_Request_Http 类提供了整个的HTTP访问需要的环境。 2、路由 ,路由特性是由 Zend_Controller_Router_Interface实现的,由Zend_Controller_Router_Rewrite提供URL重写功能。 3、分配器 ,Zend_Controller_Dispatch_Standard类控制 4、Actiong ,所有的动作都是源自于Zend_Controller_Action这个抽象类,Zend_Controller_Action提供了两个级别的处理请求,一个是init(),另外一个是preDispatch() init()函数是在控制器被调用的时候触发的 ,如果该控制器被调用多次,那么preDispatch()将被调用多次,而init()只调用一次。 5、Response(响应) Zend_Controller_Response_Http 是为编写web程序准备的 Zend_Controller_Response_CLI适应更多的场合 Zend_Controller_Response_Http包含三种信息:header,body和exception(异常) 6、Front Controller Plug-ins(前端控制器插件) 所有的插件都实现于Zend_Controller_Plugin_Abstract这个抽象类,一共有六个事件方法可以被重写。 1)routeStartup() 2)dispatchLoopStartup() 3)preDispatch () 4)postDispatch() 5)dispatchLoopShutDown() 6)routeShutDown()
Recent Comments