﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-xiaomage234-随笔分类-perl python ruby</title><link>http://www.blogjava.net/xiaomage234/category/33640.html</link><description>生命本就是一次凄美的漂流，记忆中放不下的，永远是孩提时代的那一份浪漫与纯真！</description><language>zh-cn</language><lastBuildDate>Fri, 29 Mar 2013 18:59:19 GMT</lastBuildDate><pubDate>Fri, 29 Mar 2013 18:59:19 GMT</pubDate><ttl>60</ttl><item><title>用firebreath开发插件[转]</title><link>http://www.blogjava.net/xiaomage234/archive/2012/08/28/386428.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Tue, 28 Aug 2012 05:11:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/08/28/386428.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/386428.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/08/28/386428.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/386428.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/386428.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="font-size: 18px; ">在寻找插件开发资料的过程中找到了一个开发浏览器插件的开源项目&#8212;&#8212;firebreath。参考：<a href="http://www.firebreath.org/display/documentation/FireBreath+Home" style="color: #ff9900; text-decoration: none; ">firebreath主页</a>。根据其介绍可以实现各种浏览器插件的开发。于是我进行了尝试，并试图搜索利用firebreath开发插件的中文资料。搜索到的相关中文资料有一个：<a href="http://blog.csdn.net/chief1985" style="color: #ff9900; text-decoration: none; ">徐凡的博客</a>。其中有使用firebreath开发浏览器插件（一、二、三）三篇关于firebreath开发插件的文章。看完了，但是还是不怎么会。</span></p><span style="font-family: Arial; line-height: 26px; background-color: #ffffff; font-size: 18px; ">经过两周的摸索，基本上掌握了用firebreath开发插件的初步流程，但是没法熟练运用。主要根据firebreath上的getting started进行，这里记录一下用firebreath开发插件的基本流程(开发环境我用的是VS2010中文旗舰版)。<br /></span><h1><span style="font-size: 18px; ">准备工作</span></h1><span style="font-family: Arial; line-height: 26px; background-color: #ffffff; font-size: 18px; ">要使用firebreath来开发插件，需要下载以下东西：firebreath的源代码、python、CMake。安装python（可以是2.5 2.6 2.7版本，我下载的是2.7版本），注意python最好安装在firebreath的工程目录中。安装CMake(我下载的最新版本)，注意安装过程中请选择添加到环境变量。Firebreath源代码可以在github上签出（需要安装git bash），也可以直接下载压缩包文件，我直接下载zip程序包，<a href="https://github.com/firebreath/FireBreath/zipball/firebreath-1.6" style="color: #ff9900; text-decoration: none; ">firebreath 1.6 zip包下载地址</a>。<br />下面是详细步骤，将源代码下载下来之后解压到：D:\Users\zcf\Documents\My Program\2012\FireBreath\中。我将python安装在D:\Users\zcf\Documents\My Program\2012\FireBreath\Python27\注意即使不安装在firebreath目录也 不要安装在目录路径有特殊字符（特别是空格）的路径下，与firebreath文件夹的相对路径没有空格也行。<br /></span><h1><span style="font-size: 18px; ">创建新的plugin</span></h1><span style="font-family: Arial; line-height: 26px; background-color: #ffffff; font-size: 18px; ">运行cmd（win7请以管理员身份运行）。<br />转到firebreath的根目录下：<br />cd /d D:\Users\zcf\Documents\My Program\2012\FireBreath<br />运行fbgen.py<br />Python27\python.exe fbgen.py<br />运行到此截图：<br /><img src="http://my.csdn.net/uploads/201204/22/1335085271_9506.jpg" alt="" style="border: none; " /><br />输入需要输入的东西</span>&nbsp;<span style="font-family: Arial; line-height: 26px; background-color: #ffffff; font-size: 18px; "><br /><img src="http://my.csdn.net/uploads/201204/22/1335085277_5314.jpg" alt="" style="border: none; " /><br />完成之后在firebreath根目录下会产生一个projects文件夹，里面就是刚刚建立的工程的源文件了。这些文件在firebreath的网站上有详细介绍，看得很模糊，我就不罗嗦了，需要看的自己去看原文说明吧。</span><span style="font-family: Arial; line-height: 26px; background-color: #ffffff; font-size: 18px; "><br /></span><h1><span style="font-size: 18px; ">创建工程</span></h1><span style="font-family: Arial; line-height: 26px; background-color: #ffffff; font-size: 18px; ">还是在刚才那个cmd窗口中运行prep2010.cmd，如下图：<br /><img src="http://my.csdn.net/uploads/201204/22/1335085632_2581.jpg" alt="" style="border: none; " /><br />我使用VS2010来开发，因此运行prep2010.cmd、如果你使用其他版本请使用相应的prep文件。另外，如果需要创建给出的两个例子，则可以运行prep2010.cmd examples。</span><span style="font-family: Arial; line-height: 26px; background-color: #ffffff; font-size: 18px; "><br />运行完毕就创建好工程了，在firebreath根目录下的build文件夹下面会生成很多文件，其中有一个FireBreath.sln就是我们熟悉的VS解决方案文件了。双击这个文件就可以用VS打开这个解决方案了。如下图：<br /><img src="http://my.csdn.net/uploads/201204/22/1335085666_3271.jpg" alt="" style="border: none; " /><br />最后一个项目就是我们建立的项目，其他的是自己生成的。当我们新建第二个plugin时就会在这个之后再添加一个项目吧！（不过我还没试过）。</span>&nbsp;<span style="font-family: Arial; line-height: 26px; background-color: #ffffff; font-size: 18px; "><br />接下来就在VS中生成解决方案。整个过程完成之后就会在~FireBreath\build\bin\demo\Debug\下面找到npdemo.dll，这就是我们生成的plugin了。在~FireBreath\build\projects\demo\gen\目录下可以找到FBControl.htm文件，这个文件就是我们这个plugin的测试页面了，当然你也可以自己编写测试页面。<br />将产生的npdemo.dll复制到用来测试的Firefox profile文件中plugins目录（没有的话自己新建吧）下，然后用这个profile运行Firefox，打开FBControl.htm文件。如下图：（也可以采用其他方式注册plugin，请参考相关资料）<br /><img src="http://my.csdn.net/uploads/201204/22/1335085730_5527.jpg" alt="" style="border: none; " /><br />点击确定之后：</span>&nbsp;<span style="font-family: Arial; line-height: 26px; background-color: #ffffff; font-size: 18px; "><br /><img src="http://my.csdn.net/uploads/201204/22/1335085742_9350.jpg" alt="" style="border: none; " /><br />这样这个plugin就创建完毕了，还没看明白呢，就结束了？太快了吧。。。</span>&nbsp;<span style="font-family: Arial; line-height: 26px; background-color: #ffffff; font-size: 18px; "><br />我刚开始建立完就是这个感觉：我可以创建plugin了，可是我感觉我又什么都不会。一般的有关创建plugin的说明都是到这个地方就结束了，给我的感觉就是还没开始就结束了。。。<br /></span><h1><span style="font-size: 18px; ">实现一个简单的功能</span></h1><span style="font-family: Arial; line-height: 26px; background-color: #ffffff; font-size: 18px; ">其实上面这个例子已经实现了很多比较实用的功能了，可是我比较菜，只能看懂一小部分。我想实现一个用鼠标在plugin窗口上画线的功能。经过摸索，终于可以实现我想实现的这个功能了。下面是我的步骤：<br />看程序的过程中我发现已经实现了鼠标按下，抬起，移动等事件的函数，但是函数体只有一个return语句，下图是所有已经实现的函数：<br /><img src="http://my.csdn.net/uploads/201204/22/1335085796_1588.jpg" alt="" style="border: none; " /><br />看到这些函数，我想画线的函数就可以利用这三个鼠标事件来来完成吧。于是我做了如下工作。</span>&nbsp;<span style="font-family: Arial; line-height: 26px; background-color: #ffffff; font-size: 18px; "><br />1，定义几个私有成员变量（demo.h文件中）：<br /><img src="http://my.csdn.net/uploads/201204/22/1335085815_9645.jpg" alt="" style="border: none; " /><br />2，在构造函数中初始化一下（demo.cpp文件中）：</span>&nbsp;<span style="font-family: Arial; line-height: 26px; background-color: #ffffff; font-size: 18px; "><br /><img src="http://my.csdn.net/uploads/201204/22/1335085827_3636.jpg" alt="" style="border: none; " /><br />3，先写onMouseDown和onMouseUp两个函数中的代码（作用：修改鼠标是否按下的状态）。如下图，框住的是添加的内容：</span>&nbsp;<span style="font-family: Arial; line-height: 26px; background-color: #ffffff; font-size: 18px; "><br /><img src="http://my.csdn.net/uploads/201204/22/1335085842_2386.jpg" alt="" style="border: none; " /><br />4，再来写鼠标移动时实现的功能，首先获取鼠标指针所在的点，与前面一样：m_mousePosXnew=evt-&gt;m_x; m_mousePosYnew=evt-&gt;m_y;就搞定了；然后就是画线的功能了（如果你对windows编程很熟悉就直接看后面的程序截图吧，因为我不熟悉，所以我将这个过程描述得详细一点，请理解），从old 的点画到new这个点。我虽然对windows程序开发不是很熟练，但是还是知道有个LineTo的函数，因此先就假设是LineTo(old,new)吧。于是就接下来写：</span><span style="font-family: Arial; line-height: 26px; background-color: #ffffff; font-size: 18px; "><br />if (b_isDown)<br />{<br />LineTo(old, new);<br />}<br />最后，将new这一点保存为old的点：&nbsp;<br />m_mousePosXold= m_mousePosXnew; m_mousePosYold= m_mousePosYnew;<br />所以这里就剩下搞清楚 LineTo这个函数了，要实现从一个点画线到另一个点在windows中其实是这样实现的：<br />HDC hDC;<br />hDC=GetDC(hWnd);<br />MoveToEx(hDC,m_mousePosXold,m_mousePosYold,NULL);<br />LineTo(hDC,m_mousePosXnew,m_mousePosYnew);<br />ReleaseDC(hWnd,hDC);<br />上面这样实现了，要使用HDC以及MoveToEx和LineTo需要包含头文件PluginWindowWin.h。还差个HWND，如何得到这个HWND，我也说不清楚，我是看到例子FBTestPlugin中的代码才知道可以这样获取的：FB::PluginWindowWin *wnd = dynamic_cast&lt;FB::PluginWindowWin*&gt;(win); HWND hWnd=wnd-&gt;getHWND();下面是FBTestPlugin 的FBTestPlugin.cpp文件中的代码片段截图：<br /><img src="http://my.csdn.net/uploads/201204/22/1335085942_7568.jpg" alt="" style="border: none; " /><br />经过尝试，终于完成了我想要实现的这个简单功能，再次感慨一下开发plugin对windows编程的基础能力还是有相当需求的。下面是完整的onMouseMove函数代码截图，框住的是添加的内容（注意在文件最前面添加头文件的引用#include "PluginWindowWin.h"）：</span><span style="font-family: Arial; line-height: 26px; background-color: #ffffff; font-size: 18px; "><br /><img src="http://my.csdn.net/uploads/201204/22/1335085950_7795.jpg" alt="" style="border: none; " /><br />做完这些修改之后，在demo这个项目上选择仅用于项目-&gt;仅重新生成demo。等生成完毕之后，去前面的位置找到npdemo.dll复制到Firefox相应profile下的plugins目录，重新启动Firefox，打开那个测试页面。</span><span style="font-family: Arial; line-height: 26px; background-color: #ffffff; font-size: 18px; "><br />下面是运行效果，请忍受我的涂鸦，\(^o^)/~<br /><img src="http://my.csdn.net/uploads/201204/22/1335086016_4696.jpg" alt="" style="border: none; " /><br />差不多了吧，这个简单的功能就这样了。或许再添加一个鼠标移出区域的事件，在其中将鼠标按下状态设为false会更好。</span>&nbsp;<span style="font-family: Arial; line-height: 26px; background-color: #ffffff; font-size: 18px; "><br />我做插件的目的是要播放浏览器不支持的媒体文件，我会继续慢慢研究，希望研究插件开发的能一起共同交流，交流群：81424441。</span>&nbsp;<br /><br /><a href="http://www.firebreath.org/display/documentation/FireBreath+Home">http://www.firebreath.org/display/documentation/FireBreath+Home</a>&nbsp;<br /><br /><img src ="http://www.blogjava.net/xiaomage234/aggbug/386428.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-08-28 13:11 <a href="http://www.blogjava.net/xiaomage234/archive/2012/08/28/386428.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用自由軟體 Plone 來架設網站 (1)— 基礎安裝【转】</title><link>http://www.blogjava.net/xiaomage234/archive/2012/04/18/375070.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Wed, 18 Apr 2012 01:54:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/04/18/375070.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/375070.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/04/18/375070.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/375070.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/375070.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 架站軟體的選項很多，為什麼要選擇 Plone 呢？最大的幾項優點包括：首先，它以 Python 語言開發而成，容易入門，具備企業級的功能彈性，能夠佈署在 VPS 或 Amazon EC2 雲端系統上。其次，它由廣大積極的社群朋友所支持，擁有絕佳的升級相容及系統安全記錄，並且支援多國語言。根據評比資料，Plone 在同類軟體裡，多個評分項目都拿到中上的成績，算是開放源碼裡的通才工具。&nbsp;安裝...&nbsp;&nbsp;<a href='http://www.blogjava.net/xiaomage234/archive/2012/04/18/375070.html'>阅读全文</a><img src ="http://www.blogjava.net/xiaomage234/aggbug/375070.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-04-18 09:54 <a href="http://www.blogjava.net/xiaomage234/archive/2012/04/18/375070.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>How to backup plone</title><link>http://www.blogjava.net/xiaomage234/archive/2012/04/13/374050.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Fri, 13 Apr 2012 03:29:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/04/13/374050.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/374050.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/04/13/374050.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/374050.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/374050.html</trackback:ping><description><![CDATA[<div><h1>How to backup plone</h1>                         <p>             </p>                     <div> <p>There are config files and the Data.fs to back up with Plone.&nbsp; One  can use the following repozo script, in the bin folder, to backup the  Data.fs to a directory of choice:</p> <p>From <a href="http://wiki.zope.org/ZODB/FileStorageBackup">http://wiki.zope.org/ZODB/FileStorageBackup</a><br /></p> <pre>repozo -BvzQ -r /foo/backup -f /foo/Data.fs<br /></pre> <p>    <code>-B</code> tells <code>repozo</code> to do a backup.  <code>-v</code> causes it to display messages about     what it's doing.  <code>-z</code> causes the backup files to be compressed, using gzip.     <code>-Q</code> is an optimization using md5 checksums to skip large amounts of I/O; there     is a vanishingly small chance that <code>-Q</code> will cause <code>repozo</code> to do a wrong thing,     and you can omit <code>-Q</code> if that bothers you, at the cost of more I/O and longer     runtime.  <code>-r</code> and <code>-f</code> specify the backup directory and FileStorage to back up,     respectively.</p> <p>    <code>Data.fs</code> can be in active use when you run <code>repozo</code>.  <code>repozo</code> makes a read-only     connection to the FileStorage, and backs up to the point of the most recent     fully committed transaction at the time this connection is made.</p> <p>    <code>repozo</code> will make either a full backup or an incremental backup.  You can force     a full backup with the <code>-F</code> flag.  Else <code>repozo</code> does a full backup only if     necessary.  For example, a full backup is necessary if this is the first time     a backup has been made, or if the FileStorage has been packed since the last     time a backup was made.</p> <p>    In the backup directory, <code>repozo</code> creates data files with names of the form     <code>YYYY-MM-DD-HH-MM-SS.$ext</code>, where <code>$ext</code> is <code>fsz</code> for a compressed full backup,     <code>deltafsz</code> for a compressed incremental backup, <code>fs</code> for an uncompressed full     backup, or <code>deltafs</code> for an uncompressed incremental backup.  It also creates,     or appends to, a <code>.dat</code> file, which is an index containing metadata about the     data files.  The <code>YYYY-MM-DD-HH-MM-SS</code> part records the UTC (not local) time     at which the backup was made.</p> <p>    <code>repozo</code> is also used to recreate an <code>.fs</code> file from the backup files:</p> repozo -Rv -r backup -D YYYY-MM-DD-HH-MM-SS -o Copy.fs <pre>repozo -Rv -r backup -D YYYY-MM-DD-HH-MM-SS -o Copy.fs<br /></pre> <p>    <code>-D</code> is optional, and specifies a UTC (not local) time; by default, current     time is used.  If specified, the hour, minute, and second parts are optional.     <code>repozo</code> recreates the originally backed-up FileStorage, to the state it had     at the most recent backup at or before this time.  The <code>-o</code> option specifies     an output file path, the name of the reconstructed FileStorage.  In the     example, the recreated FileStorage is <code>Copy.fs</code> in the current directory.</p> <p>    <code>repozo -BQ</code> is fast, usually taking time proportional to the growth in     the FileStorage since the last time it was run.  It's a good idea to     make backups daily; incremental <code>repozo</code> backups are made quickly enough that     you may wish to run them more frequently.</p> <h2>Other Information</h2> <p><strong>How to backup your content in the database file Data.fs</strong></p> <p><a href="http:///">http://plone.org/documentation/kb/backup-and-recover-data-fs-in-linux/backup-plone/</a><strong><br /></strong></p> </div></div><img src ="http://www.blogjava.net/xiaomage234/aggbug/374050.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-04-13 11:29 <a href="http://www.blogjava.net/xiaomage234/archive/2012/04/13/374050.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Plone学习笔记【转】</title><link>http://www.blogjava.net/xiaomage234/archive/2012/04/12/373980.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 12 Apr 2012 08:10:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/04/12/373980.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/373980.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/04/12/373980.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/373980.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/373980.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1 概述 Zope和CMF都是Plone需要的核心技术。 Zope是由Python编写的，他是一个强大的面向对象的、开源的编程语言，他和Perl及Tcl比较类似。使用Plone，甚至基本的管理，都不需要Python的知识；然而，定制产品和Plone上脚本编程是需要一些Python知识的。 如果你打算使用Plone做一些复杂的事情，就需要花1－2天学习Python的基础知识。这不仅将让你能更充分地定...&nbsp;&nbsp;<a href='http://www.blogjava.net/xiaomage234/archive/2012/04/12/373980.html'>阅读全文</a><img src ="http://www.blogjava.net/xiaomage234/aggbug/373980.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-04-12 16:10 <a href="http://www.blogjava.net/xiaomage234/archive/2012/04/12/373980.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>nginx搭建nagios</title><link>http://www.blogjava.net/xiaomage234/archive/2011/12/17/366629.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Sat, 17 Dec 2011 07:20:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2011/12/17/366629.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/366629.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2011/12/17/366629.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/366629.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/366629.html</trackback:ping><description><![CDATA[<div><div>一.安装nagios这里不做说明</div><div>1.nagios map显示出不来，要装GD 和GD-DEV* &nbsp;然后再重新编译nagios，要么就一开始就装好。</div><div></div><div>二.nginx部分</div><div>1.安装</div><div>2.配置部分，nginx不能执行外部程序，所以我们要用fastcgi协议来调用外部程序。</div><div>Nginx并不提供支持对外部程序的直接调用或者解析（所以缺少像apache里的mod_php这样的模块），所有的外部程序（包括PHP）必须通过fastcgi接口来调用，在Linux下接口是socket （文件socket或者Internet socket）。所以为了调用CGI程序，我们需要一个fastcgi的wrapper，这个wrapper绑定在某个固定socket上（比如端口或者文件socket），当nginx将CGI请求发送给这个socket的时候，wrapper接纳请求并fork一个新的线程，这个线程调用外部的程序或者解释器处理脚本并读取返回值，而wrapper再将返回的数据（网页或者图片等）通过fastcgi将数据通过那个固定的socket传递给nginx</div><div></div><div>目前有网上流行的两种fastcgi管理器，perl-cgi和spwan-cgi,用spwan-cgi启动php部分</div><div>例：spwan-cgi -a 127.0.0.1 -p &nbsp;9000 -f /usr/local/php-cgi &nbsp;-C 20</div><div>这里我们也可以用-s 参数来启用sock通信，例：unix:/var/run/nginx.sock</div><div>命令用法可以用--help来查看，然后再nginx.conf写入</div><div>location ~ \.php$ {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; root &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /usr/local/nagios/share/;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;fastcgi_pass &nbsp; &nbsp;127.0.0.1:9000;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # fastcgi_pass unix:/var/run/nagios.sock;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;fastcgi_index &nbsp;index.php;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;fastcgi_param &nbsp;SCRIPT_FILENAME /usr/local/nagios/share/$fastcgi_script_name;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;include &nbsp; &nbsp; &nbsp; &nbsp;fastcgi_params;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div></div><div>把所有php结尾的访问交给php来处理。</div><div></div><div></div><div>下面是perl-cgi的内容，它也是根据fastcgi协议写的</div><div></div><div>#!/usr/bin/perl</div><div></div><div>use FCGI;</div><div>#perl -MCPAN -e 'install FCGI'</div><div>use Socket;</div><div></div><div>#this keeps the program alive or something after exec'ing perl scripts</div><div>END() { } BEGIN() { }</div><div>*CORE::GLOBAL::exit = sub { die "fakeexit\nrc=".shift()."\n"; }; eval q{exit}; if ($@) { exit unless $@ =~ /^fakeexit/; } ;</div><div></div><div>&amp;main;</div><div></div><div>sub main {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #$socket = FCGI::OpenSocket( ":3461", 10 ); #use IP sockets</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $socket = FCGI::OpenSocket( "/var/run/nagios.sock", 10 ); #use UNIX sockets - user running this script must have w access to the 'nginx' folder!!</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $request = FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, \%ENV, $socket );</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ($request) {request_loop()};</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FCGI::CloseSocket( $socket );</div><div>}</div><div></div><div>sub request_loop {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while( $request-&gt;Accept() &gt;= 0 ) {</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;#processing any STDIN input from WebServer (for CGI-GET actions)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$env = $request-&gt;GetEnvironment();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$stdin_passthrough ='';</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$req_len = 0 + $ENV{CONTENT_LENGTH};</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ($ENV{REQUEST_METHOD} eq 'GET'){</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $stdin_passthrough .= $ENV{'QUERY_STRING'};</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #running the cgi app</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ( (-x $ENV{SCRIPT_FILENAME}) &amp;&amp; #can I execute this?</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(-s $ENV{SCRIPT_FILENAME}) &amp;&amp; #Is this file empty?</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(-r $ENV{SCRIPT_FILENAME}) &nbsp; &nbsp; #can I read this file?</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ){</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #http://perldoc.perl.org/perlipc.html#Safe-Pipe-Opens</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; open $cgi_app, '-|', $ENV{SCRIPT_FILENAME}, $stdin_passthrough or print("Content-type: text/plain\r\n\r\n"); print "Error: CGI app returned no output - Executing $ENV{SCRIPT_FILENAME} failed !\n";</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ($cgi_app) {print &lt;$cgi_app&gt;; close $cgi_app;}</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print("Content-type: text/plain\r\n\r\n");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print "Error: No such CGI app - $req_len - $ENV{CONTENT_LENGTH} - $ENV{REQUEST_METHOD} - $ENV{SCRIPT_FILENAME} may not exist or is not executable by this process.\n";</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div>}</div><div></div><div></div><div></div><div>用一个脚本启动</div><div></div><div>#!/bin/bash</div><div></div><div>## start_nginx_cgi.sh: start nginx cgi mode</div><div>## ljzhou, 2007.08.20</div><div></div><div></div><div>PERL="/usr/bin/perl"</div><div>NGINX_CGI_FILE="/usr/local/nagios/bin/perl-cgi.pl"</div><div></div><div></div><div>#bg_num=`jobs -l |grep "NGINX_CGI_FILE"`</div><div>#PID=`ps aux|grep "perl-cgi"|cut -c10-14|xargs kill -9`</div><div>PID=`ps aux|grep 'perl-cgi'|cut -c10-14|sed -n "1P"`</div><div>echo $PID</div><div>sockfiles="/var/run/nagios.sock"</div><div>kill -9 $PID</div><div></div><div>$PERL $NGINX_CGI_FILE &amp;</div><div></div><div>sleep 3</div><div></div><div>`chown nobody.nobody $sockfiles`</div><div></div><div></div><div></div><div></div><div>&nbsp;然后再加如下配置到nginx</div><div>location ~ \.cgi$ {</div><div>&nbsp; &nbsp; &nbsp;rewrite ^/nagios/cgi-bin/(.*)\.cgi /$1.cgi break;</div><div>&nbsp; &nbsp; &nbsp;fastcgi_pass unix:/var/run/nagios.sock;</div><div>&nbsp; &nbsp; &nbsp;fastcgi_index index.cgi;</div><div>&nbsp; &nbsp; &nbsp;fastcgi_param SCRIPT_FILENAME /usr/local/nagios/sbin$fastcgi_script_name;</div><div>&nbsp; &nbsp; &nbsp;fastcgi_param HTTP_ACCEPT_LANGUAGE en_US;</div><div>&nbsp; &nbsp; &nbsp;include fastcgi_params;</div><div>&nbsp; }</div><div></div><div></div><div>&nbsp; &nbsp; &nbsp;location ~ \.pl$ {</div><div>&nbsp; &nbsp; &nbsp;fastcgi_pass &nbsp;unix:/var/run/nagios.sock;</div><div>&nbsp; &nbsp; &nbsp;fastcgi_index index.pl;</div><div>&nbsp; &nbsp; &nbsp;fastcgi_param SCRIPT_FILENAME &nbsp;/usr/local/nagios/sbin$fastcgi_script_name;</div><div>&nbsp; &nbsp; &nbsp;include &nbsp; &nbsp; &nbsp; fastcgi_params;</div><div>&nbsp; }</div><div></div><div>到处为止OK</div></div><img src ="http://www.blogjava.net/xiaomage234/aggbug/366629.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2011-12-17 15:20 <a href="http://www.blogjava.net/xiaomage234/archive/2011/12/17/366629.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用cacti 以图表方式 展示nginx 状态统计图 【转】</title><link>http://www.blogjava.net/xiaomage234/archive/2011/12/15/366452.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 15 Dec 2011 08:37:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2011/12/15/366452.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/366452.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2011/12/15/366452.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/366452.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/366452.html</trackback:ping><description><![CDATA[from:<a href="http://forums.cacti.net/about26458.html">http://forums.cacti.net/about26458.html<br /><br /></a><div><span style="color: #323d4f; font-family: 'Lucida Grande', Verdana, Helvetica, Arial, sans-serif; font-size: 12px; -webkit-border-horizontal-spacing: 5px; -webkit-border-vertical-spacing: 5px; line-height: normal; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 1.3em; line-height: 1.4em; font-family: 'Lucida Grande', 'Trebuchet MS', Helvetica, Arial, sans-serif; ">Scripts and templates for nginx.&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Nginx -&nbsp;<a href="http://nginx.net/" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #006597; text-decoration: none; ">http://nginx.net/</a>&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Provide graphing nginx clients statistics (active, reading, writing, waiting) and nginx socket statistics (accepts, handled, requests). It's a formal devision used only for graphs usability.&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />For use do next steps:&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />1. Enable nginx http_stub_status_module at configure stage (if requared).&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />2. Enable stub status. Add to nginx.conf (in any server context):&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><div style="margin-top: 10px; margin-right: 5px; margin-bottom: 0px; margin-left: 5px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 0px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #a9b8c2; border-right-color: #a9b8c2; border-bottom-color: #a9b8c2; border-left-color: #a9b8c2; color: #333333; background-color: #a9b8c2; font-family: 'Lucida Grande', Verdana, Helvetica, Arial, sans-serif; font-size: 0.8em; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Code:</strong></div><div style="margin-top: 0px; margin-right: 5px; margin-bottom: 10px; margin-left: 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; direction: ltr; border-top-color: #a9b8c2; border-right-color: #a9b8c2; border-bottom-color: #a9b8c2; border-left-color: #a9b8c2; border-top-width: 0px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; font-weight: normal; color: #006600; font-size: 0.85em; font-family: Monaco, 'Courier New', monospace; background-color: #fafafa; ">location /nginx_status {<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp;stub_status on;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp;# disable access_log if requared<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp;access_log&nbsp; &nbsp;off;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp;#allow XX.YY.AA.ZZ;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp;#allow YY.ZZ.JJ.CC;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp;#deny all;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />}</div><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Restart nginx.<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />3.<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><div style="margin-top: 10px; margin-right: 5px; margin-bottom: 0px; margin-left: 5px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 0px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #a9b8c2; border-right-color: #a9b8c2; border-bottom-color: #a9b8c2; border-left-color: #a9b8c2; color: #333333; background-color: #a9b8c2; font-family: 'Lucida Grande', Verdana, Helvetica, Arial, sans-serif; font-size: 0.8em; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Code:</strong></div><div style="margin-top: 0px; margin-right: 5px; margin-bottom: 10px; margin-left: 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; direction: ltr; border-top-color: #a9b8c2; border-right-color: #a9b8c2; border-bottom-color: #a9b8c2; border-left-color: #a9b8c2; border-top-width: 0px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; font-weight: normal; color: #006600; font-size: 0.85em; font-family: Monaco, 'Courier New', monospace; background-color: #fafafa; ">cp get_nginx_clients_status.pl &lt;path_cacti&gt;/scripts/<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />cp get_nginx_socket_status.pl &lt;path_cacti&gt;/scripts/<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />chmod 0755 &lt;path_cacti&gt;/scripts/get_nginx_socket_status.pl<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />chmod 0755 &lt;path_cacti&gt;/scripts/get_nginx_clients_status.pl</div><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />4. Check that it's work. Run<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><div style="margin-top: 10px; margin-right: 5px; margin-bottom: 0px; margin-left: 5px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 0px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #a9b8c2; border-right-color: #a9b8c2; border-bottom-color: #a9b8c2; border-left-color: #a9b8c2; color: #333333; background-color: #a9b8c2; font-family: 'Lucida Grande', Verdana, Helvetica, Arial, sans-serif; font-size: 0.8em; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Code:</strong></div><div style="margin-top: 0px; margin-right: 5px; margin-bottom: 10px; margin-left: 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; direction: ltr; border-top-color: #a9b8c2; border-right-color: #a9b8c2; border-bottom-color: #a9b8c2; border-left-color: #a9b8c2; border-top-width: 0px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; font-weight: normal; color: #006600; font-size: 0.85em; font-family: Monaco, 'Courier New', monospace; background-color: #fafafa; ">get_nginx_clients_status.pl http://nginx.server.tld/nginx_status</div><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />and see that returned the same string:<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><div style="margin-top: 10px; margin-right: 5px; margin-bottom: 0px; margin-left: 5px; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 0px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #a9b8c2; border-right-color: #a9b8c2; border-bottom-color: #a9b8c2; border-left-color: #a9b8c2; color: #333333; background-color: #a9b8c2; font-family: 'Lucida Grande', Verdana, Helvetica, Arial, sans-serif; font-size: 0.8em; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Code:</strong></div><div style="margin-top: 0px; margin-right: 5px; margin-bottom: 10px; margin-left: 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; direction: ltr; border-top-color: #a9b8c2; border-right-color: #a9b8c2; border-bottom-color: #a9b8c2; border-left-color: #a9b8c2; border-top-width: 0px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; font-weight: normal; color: #006600; font-size: 0.85em; font-family: Monaco, 'Courier New', monospace; background-color: #fafafa; ">nginx_accepts:113869 nginx_handled:113869 nginx_requests:122594</div><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />5. Import to cacti cacti_graph_template_nginx_clients_stat.xml and cacti_graph_template_nginx_sockets_stat.xml.&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />6. Add nginx graphs to your hosts.&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />P.S. Sorry for my english&nbsp;<img src="http://forums.cacti.net/images/smilies/icon_smile.gif" alt=":)" title="" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; " /></div><br clear="all" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><table width="100%" cellspacing="1" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; background-color: #a9b8c2; "><tbody style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><tr style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; background-color: #c0c8d0; "><strong style="margin-top: 1px; margin-right: 1px; margin-bottom: 1px; margin-left: 1px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 1.1em; ">Attachments:</strong></td></tr><tr style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; background-color: #dce1e5; "><span style="margin-top: 1px; margin-right: 1px; margin-bottom: 1px; margin-left: 1px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 1.1em; "><img src="http://forums.cacti.net/styles/subsilver2/imageset/icon_topic_attach.gif" width="14" height="18" alt="" title="" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; " />&nbsp;<a href="http://forums.cacti.net/download/file.php?id=12676&amp;sid=3ebc7dc59dcd751afb1552ed67427e54" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #006597; text-decoration: none; ">cacti-nginx.tar.gz</a>&nbsp;[5.15 KiB]&nbsp;</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><span style="margin-top: 1px; margin-right: 1px; margin-bottom: 1px; margin-left: 1px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 1em; ">Downloaded 6371 times</span>&nbsp;</td></tr></tbody></table></span></div><a href="http://forums.cacti.net/about26458.html"></a><img src ="http://www.blogjava.net/xiaomage234/aggbug/366452.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2011-12-15 16:37 <a href="http://www.blogjava.net/xiaomage234/archive/2011/12/15/366452.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Nginx上运行Ruby on Rails 【转】</title><link>http://www.blogjava.net/xiaomage234/archive/2011/12/08/365917.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 08 Dec 2011 11:06:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2011/12/08/365917.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/365917.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2011/12/08/365917.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/365917.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/365917.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文将指导您在Ubuntu/Debian上从Ruby和Rails开始，一步一步的安装配置Ruby on Rails环境，并结合Nginx运行环境获得优异的性能。AD：【51CTO译文】Nginx已经成为世界第三大Web服务器，在国内十大网站使用的Web服务器调查中，Nginx也名列前茅。Ruby on Rails是近几年开始流行的新一代Web开发语言，其易用、敏捷的特性收到很多Web开发人员的瞩目...&nbsp;&nbsp;<a href='http://www.blogjava.net/xiaomage234/archive/2011/12/08/365917.html'>阅读全文</a><img src ="http://www.blogjava.net/xiaomage234/aggbug/365917.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2011-12-08 19:06 <a href="http://www.blogjava.net/xiaomage234/archive/2011/12/08/365917.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ruby on Rails 体验之旅（一）--安装 【转】</title><link>http://www.blogjava.net/xiaomage234/archive/2011/12/08/365906.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 08 Dec 2011 08:55:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2011/12/08/365906.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/365906.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2011/12/08/365906.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/365906.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/365906.html</trackback:ping><description><![CDATA[<div><span style="font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; line-height: 18px; "><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">最新心血来潮的想学一门新的东西，听说用ROR的开发效率会很高，所以就选择了ruby on rails,安装的时候真是不顺心，这里把自己的安装心得记下来:</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">1) 安装ruby</p><ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 45px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-break: break-all; list-style-type: disc; "><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载安装包：<a href="http://rubyforge.org/frs/?group_id=167" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #3b5999; text-decoration: none; ">http://rubyforge.org/frs/?group_id=167</a>，我下载的是rubyinstaller-1.8.7-p302.exe</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">装完后，可以用ruby -v 测试是否安装成功，如图，要是出现了版本 就说明安装成功了</p></ul><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; "><a href="http://images.cnblogs.com/cnblogs_com/PurpleCow/201012/201012262055255903.png" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #3b5999; text-decoration: none; "><img title="image" src="http://images.cnblogs.com/cnblogs_com/PurpleCow/201012/201012262055446430.png" border="0" alt="image" width="422" height="49" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; display: inline; " /></a></p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">2）安装rubygems</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Rubygems是ruby的包管理器工具，它使得ruby包的安装十分简单，只需要一条命令就可以从远程服务器上下载相应的包，如果相应的应用包含其他扩展，rubygems 也会提示你从远程安装所依赖的扩展。安装后 rubygems 会运行相应的程序生成 rdoc 帮助文档(类似于 javadoc )。目前已经成为 ruby 事实上的包管理器标准了。</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">下载地址：<a href="http://rubyforge.org/projects/rubygems/" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #3b5999; text-decoration: none; ">http://rubyforge.org/projects/rubygems/</a>，</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">我下载的是rubygems-1.3.7，解压后执行目录下的setup.rb，安装完成以后，用如下命令检查：</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">gem &#8211;v</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; "><a href="http://images.cnblogs.com/cnblogs_com/PurpleCow/201012/201012262055508768.png" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #3b5999; text-decoration: none; "><img title="image" src="http://images.cnblogs.com/cnblogs_com/PurpleCow/201012/201012262056048221.png" border="0" alt="image" width="428" height="43" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; display: inline; " /></a></p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">3、安装rails</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a)远程安装：gem install rails &#8211;remote</p><blockquote style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 25px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; border-top-width: 2px; border-right-width: 2px; border-bottom-width: 2px; border-left-width: 2px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #efefef; border-right-color: #efefef; border-bottom-color: #efefef; border-left-color: #efefef; color: #333333; background-position: initial initial; background-repeat: initial initial; "><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面来自于网上的说明我没有采用这种方式安装，因为我家 的网速太慢了。</p></blockquote><blockquote style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 25px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; border-top-width: 2px; border-right-width: 2px; border-bottom-width: 2px; border-left-width: 2px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #efefef; border-right-color: #efefef; border-bottom-color: #efefef; border-left-color: #efefef; color: #333333; background-position: initial initial; background-repeat: initial initial; "><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">然后会自动输出：&nbsp;&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Install required dependency activerecord?&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Install required dependency actionpack?&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Install required dependency actionmailer?&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Install required dependency activeresource?&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />依次yes依赖文件，然后显示：&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Successfully installed rails-2.1.0&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Successfully installed activerecord-2.1.0&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Successfully installed actionpack-2.1.0&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Successfully installed actionmailer-2.1.0&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Successfully installed activeresource-2.1.0&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Installing ri documentation for activerecord-2.1.0...&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Installing ri documentation for actionpack-2.1.0...&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Installing ri documentation for actionmailer-2.1.0...&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Installing ri documentation for activeresource-2.1.0...&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Installing RDoc documentation for activerecord-2.1.0...&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Installing RDoc documentation for actionpack-2.1.0...&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Installing RDoc documentation for actionmailer-2.1.0...&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Installing RDoc documentation for activeresource-2.1.0...&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />看看版本：rails -v&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />输出：Rails 2.1.0&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />搞定</p></blockquote><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">&nbsp;&nbsp;&nbsp;&nbsp; b)本地手动安装：</p><blockquote style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 25px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; border-top-width: 2px; border-right-width: 2px; border-bottom-width: 2px; border-left-width: 2px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #efefef; border-right-color: #efefef; border-bottom-color: #efefef; border-left-color: #efefef; color: #333333; background-position: initial initial; background-repeat: initial initial; "><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">&nbsp;&nbsp; 需要下载</p></blockquote><blockquote style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 25px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; border-top-width: 2px; border-right-width: 2px; border-bottom-width: 2px; border-left-width: 2px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #efefef; border-right-color: #efefef; border-bottom-color: #efefef; border-left-color: #efefef; color: #333333; background-position: initial initial; background-repeat: initial initial; "><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">&nbsp;&nbsp;&nbsp; activesupport</p></blockquote><blockquote style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 25px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; border-top-width: 2px; border-right-width: 2px; border-bottom-width: 2px; border-left-width: 2px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #efefef; border-right-color: #efefef; border-bottom-color: #efefef; border-left-color: #efefef; color: #333333; background-position: initial initial; background-repeat: initial initial; "><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; "><a title="http://files.rubyforge.vm.bytemark.co.uk/activesupport/activesupport-2.2.3.gem " href="http://files.rubyforge.vm.bytemark.co.uk/activesupport/activesupport-2.2.3.gem" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #3b5999; text-decoration: none; ">http://files.rubyforge.vm.bytemark.co.uk/activesupport/activesupport-2.2.3.gem&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /></a></p></blockquote><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; activerecord</p><blockquote style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 25px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; border-top-width: 2px; border-right-width: 2px; border-bottom-width: 2px; border-left-width: 2px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #efefef; border-right-color: #efefef; border-bottom-color: #efefef; border-left-color: #efefef; color: #333333; background-position: initial initial; background-repeat: initial initial; "><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; "><a title="http://files.rubyforge.vm.bytemark.co.uk/activerecord/activerecord-2.2.3.gem " href="http://files.rubyforge.vm.bytemark.co.uk/activerecord/activerecord-2.2.3.gem" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #3b5999; text-decoration: none; ">http://files.rubyforge.vm.bytemark.co.uk/activerecord/activerecord-2.2.3.gem</a></p></blockquote><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; actionpack</p><blockquote style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 25px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; border-top-width: 2px; border-right-width: 2px; border-bottom-width: 2px; border-left-width: 2px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #efefef; border-right-color: #efefef; border-bottom-color: #efefef; border-left-color: #efefef; color: #333333; background-position: initial initial; background-repeat: initial initial; "><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; "><a title="http://files.rubyforge.vm.bytemark.co.uk/actionpack/actionpack-2.2.3.gem " href="http://files.rubyforge.vm.bytemark.co.uk/actionpack/actionpack-2.2.3.gem" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #3b5999; text-decoration: none; ">http://files.rubyforge.vm.bytemark.co.uk/actionpack/actionpack-2.2.3.gem&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /></a></p></blockquote><blockquote style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 25px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; border-top-width: 2px; border-right-width: 2px; border-bottom-width: 2px; border-left-width: 2px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #efefef; border-right-color: #efefef; border-bottom-color: #efefef; border-left-color: #efefef; color: #333333; background-position: initial initial; background-repeat: initial initial; "><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">&nbsp;&nbsp;&nbsp;&nbsp; actionmailer</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; "><a title="http://rubyforge.org/frs/download.php/64424/actionmailer-2.2.3.gem" href="http://rubyforge.org/frs/download.php/64424/actionmailer-2.2.3.gem" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #3b5999; text-decoration: none; ">http://rubyforge.org/frs/download.php/64424/actionmailer-2.2.3.gem</a></p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">&nbsp;&nbsp;&nbsp; rake&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><a title="http://files.rubyforge.vm.bytemark.co.uk/rake/rake-0.8.7.gem " href="http://files.rubyforge.vm.bytemark.co.uk/rake/rake-0.8.7.gem" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #3b5999; text-decoration: none; ">http://files.rubyforge.vm.bytemark.co.uk/rake/rake-0.8.7.gem</a></p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">&nbsp;&nbsp; activeresource</p></blockquote><blockquote style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 25px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; border-top-width: 2px; border-right-width: 2px; border-bottom-width: 2px; border-left-width: 2px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #efefef; border-right-color: #efefef; border-bottom-color: #efefef; border-left-color: #efefef; color: #333333; background-position: initial initial; background-repeat: initial initial; "><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">&nbsp;&nbsp;<a title="http://rubyforge.org/frs/download.php/64419/activeresource-2.2.3.gem" href="http://rubyforge.org/frs/download.php/64419/activeresource-2.2.3.gem" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #3b5999; text-decoration: none; ">http://rubyforge.org/frs/download.php/64419/activeresource-2.2.3.gem</a></p></blockquote><blockquote style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 25px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; border-top-width: 2px; border-right-width: 2px; border-bottom-width: 2px; border-left-width: 2px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #efefef; border-right-color: #efefef; border-bottom-color: #efefef; border-left-color: #efefef; color: #333333; background-position: initial initial; background-repeat: initial initial; "><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">&nbsp;&nbsp;&nbsp; rails&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a title="http://rubyforge.org/frs/download.php/64426/rails-2.2.3.gem" href="http://rubyforge.org/frs/download.php/64426/rails-2.2.3.gem" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #3b5999; text-decoration: none; ">http://rubyforge.org/frs/download.php/64426/rails-2.2.3.gem</a></p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">下载完成之后将所有文件放在同一个文件夹下面依次安装：(eg:D:\ruby)</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">&nbsp;&nbsp;&nbsp; 然后执行命令</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">&nbsp;&nbsp; （D: --&gt; D:\&gt;cd D:\ruby）</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">&nbsp;&nbsp;&nbsp;&nbsp; gem install&nbsp; activesupport</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">&nbsp;&nbsp;&nbsp;&nbsp; gem install&nbsp; activerecord</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">&nbsp;&nbsp;&nbsp;&nbsp; gem install&nbsp; actionpack</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">&nbsp;&nbsp;&nbsp;&nbsp; gem install&nbsp; actionmailer</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">&nbsp;&nbsp;&nbsp;&nbsp; gem install&nbsp; rake</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">&nbsp;&nbsp;&nbsp;&nbsp; gem install&nbsp; rails&nbsp;&nbsp;&nbsp;&nbsp;</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">成功安装之后检查命令</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">&nbsp;&nbsp;&nbsp; rails &#8211;v</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; "><a href="http://images.cnblogs.com/cnblogs_com/PurpleCow/201012/201012262056247187.png" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #3b5999; text-decoration: none; "><img title="image" src="http://images.cnblogs.com/cnblogs_com/PurpleCow/201012/201012262056359554.png" border="0" alt="image" width="133" height="41" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; display: inline; " /></a></p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">证明安装成功</p></blockquote><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">4、创建Web应用</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在命令行下输入 rails HelloWorld，比如当前的路径是 E:\Ruby on Rails&gt;rails HelloWorld，便会在E:\Ruby on Rails下创建一个HelloWorld文件夹。</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; "><a href="http://images.cnblogs.com/cnblogs_com/PurpleCow/201012/201012262056547049.png" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #3b5999; text-decoration: none; "><img title="image" src="http://images.cnblogs.com/cnblogs_com/PurpleCow/201012/201012262057145492.png" border="0" alt="image" width="378" height="422" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; display: inline; " /></a></p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">如果需要指定路径可以rails C://test，具体可以看官方API:http://api.rubyonrails.org/</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">5、在当前目录（HelloWorld）下，运行 ruby script\server 启动服务，关于webrick服务器更多的信息可以访问<a href="http://www.webrick.org/" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #3b5999; text-decoration: none; ">http://www.webrick.org/</a></p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; "><a href="http://images.cnblogs.com/cnblogs_com/PurpleCow/201012/201012262058037800.png" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #3b5999; text-decoration: none; "><img title="image" src="http://images.cnblogs.com/cnblogs_com/PurpleCow/201012/201012262058246078.png" border="0" alt="image" width="442" height="262" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; display: inline; " /></a></p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">6、浏览器中输入<a href="http://localhost:3000/" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #3b5999; text-decoration: none; ">http://localhost:3000/</a>，如果看到以下页面，说明OK</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; "><a href="http://images.cnblogs.com/cnblogs_com/PurpleCow/201012/201012262058345611.png" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #3b5999; text-decoration: none; "><img title="image" src="http://images.cnblogs.com/cnblogs_com/PurpleCow/201012/201012262058547924.png" border="0" alt="image" width="422" height="297" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; display: inline; " /></a></p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">7、写一个HelloWorld的Web程序，ruby script\generate controller HelloWorld命令</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; "><a href="http://images.cnblogs.com/cnblogs_com/PurpleCow/201012/201012262059072110.png" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #3b5999; text-decoration: none; "><img title="image" src="http://images.cnblogs.com/cnblogs_com/PurpleCow/201012/201012262059168362.png" border="0" alt="image" width="448" height="191" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; display: inline; " /></a></p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">然后找到hello_world_controller.rb</p><ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 45px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-break: break-all; list-style-type: disc; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: none; list-style-position: initial; list-style-image: initial; list-style: inherit; ">&nbsp;<ol style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 2em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: decimal; list-style-position: initial; list-style-image: initial; list-style: inherit; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">class</strong>&nbsp;HelloWorldController &lt; ApplicationController&nbsp;</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: decimal; list-style-position: initial; list-style-image: initial; list-style: inherit; ">&nbsp;&nbsp;<strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">def</strong>&nbsp;index&nbsp;&nbsp;&nbsp;&nbsp;</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: decimal; list-style-position: initial; list-style-image: initial; list-style: inherit; ">&nbsp;&nbsp;&nbsp; render:text=&gt;"hello world"</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: decimal; list-style-position: initial; list-style-image: initial; list-style: inherit; ">&nbsp;&nbsp;<strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">end</strong>&nbsp;&nbsp;&nbsp;</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: decimal; list-style-position: initial; list-style-image: initial; list-style: inherit; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">end</strong></li></ol></li><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">输入以下代码，保存</p><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: none; list-style-position: initial; list-style-image: initial; list-style: inherit; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">如果未启动服务需要重启第五步操作。</strong></li></ul><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">在浏览器中打开<a href="http://localhost:3000/hello_world" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #3b5999; text-decoration: none; ">http://localhost:3000/hello_world</a>，就会看见结果，但我这里出现一个错误：</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; "><a href="http://images.cnblogs.com/cnblogs_com/PurpleCow/201012/201012262059193364.png" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #3b5999; text-decoration: none; "><img title="image" src="http://images.cnblogs.com/cnblogs_com/PurpleCow/201012/201012262059254896.png" border="0" alt="image" width="428" height="373" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; display: inline; " /></a></p><ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 45px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-break: break-all; list-style-type: disc; "><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">在网上看到一个解决方法：</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">这是由于没有装sqlite3数据库，<a href="http://files.cnblogs.com/geek007/sqlite3.rar" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #3b5999; text-decoration: none; ">http://files.cnblogs.com/geek007/sqlite3.rar</a>&nbsp;这里下载，</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">然后解压到ruby的bin目录：D:\ruby\bin，命令行执行：gem install "D:\Program Files\Ruby187\bin\sqlite3-ruby-1.2.3-mswin32.gem"</p></ul><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; "><a href="http://images.cnblogs.com/cnblogs_com/PurpleCow/201012/201012262059266683.png" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #3b5999; text-decoration: none; "><img title="image" src="http://images.cnblogs.com/cnblogs_com/PurpleCow/201012/201012262059323613.png" border="0" alt="image" width="445" height="197" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; display: inline; " /></a></p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">安装成功后，按照第五步重启服务器，在浏览器中访问</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; "><a title="http://localhost:3000/hello_World" href="http://localhost:3000/hello_World" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #3b5999; text-decoration: none; ">http://localhost:3000/hello_World</a></p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; "><a href="http://images.cnblogs.com/cnblogs_com/PurpleCow/201012/201012262059331845.png" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #3b5999; text-decoration: none; "><img title="image" src="http://images.cnblogs.com/cnblogs_com/PurpleCow/201012/201012262059341364.png" border="0" alt="image" width="244" height="110" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; display: inline; " /></a></p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">Ok,大功告成~呵呵，开心~~~</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">&nbsp;</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">PS: 手工安装非常麻烦，可以从&nbsp;<a href="http://instantrails.rubyforge.org/" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #3b5999; text-decoration: none; ">http://instantrails.rubyforge.org/</a>&nbsp; 下载InstantRails，全部搞定。</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">参考资源：</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">&nbsp;&nbsp;&nbsp;<a href="http://rubyforge.org/" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #3b5999; text-decoration: none; ">http://rubyforge.org</a></p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">&nbsp;&nbsp;&nbsp;<a href="http://api.rubyonrails.org/" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #3b5999; text-decoration: none; ">http://api.rubyonrails.org/</a></p></span></div><img src ="http://www.blogjava.net/xiaomage234/aggbug/365906.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2011-12-08 16:55 <a href="http://www.blogjava.net/xiaomage234/archive/2011/12/08/365906.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Linux平台上安装和配置Ruby on Rails详解 【转】</title><link>http://www.blogjava.net/xiaomage234/archive/2011/12/08/365861.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 08 Dec 2011 05:40:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2011/12/08/365861.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/365861.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2011/12/08/365861.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/365861.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/365861.html</trackback:ping><description><![CDATA[<div><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 12px; line-height: 18px; "><div><span style="font-size: 14pt; ">在</span>&nbsp;<span style="font-size: 14pt; ">Linux</span>&nbsp;<span style="font-size: 14pt; ">平台上安装和配置</span>&nbsp;<span style="font-size: 14pt; ">Ruby on Rails</span>&nbsp;<span style="font-size: 14pt; ">详解</span></div><div>&nbsp;</div><div>ruby on rails推荐的生产运行环境是Linux/FreeBSD/Unix，即Unix系列的操作系统，采用lighttpd＋FCGI的解决方案。以下我将以Linux操作系统，lighttpd＋FCGI，MySQL数据库为例，从源代码编译安装开始讲解。</div><div>&nbsp;</div><div>在安装之前，应该确认Linux操作系统已经安装好gcc编译器，否则请用Linux安装光盘先行安装gcc编译器：</div><div><span style="background-color: #e6e6e6; ">gcc &#8211;v</span></div><div>如能返回gcc版本号，则gcc正确安装。</div><div>&nbsp;</div><div><strong style="font-weight: bold; "><span style="font-size: 12pt; ">一、安装</span>&nbsp;</strong><strong style="font-weight: bold; "><span style="font-size: 12pt; ">Ruby</span>&nbsp;</strong><strong style="font-weight: bold; "><span style="font-size: 12pt; ">解析器</span></strong></div><div>&nbsp;</div><div>一些Linux发行版本，MacOSX操作系统都自带Ruby解析器，但是我仍然建议自行下载ruby源代码编译安装。因为一方面可以自己定制ruby安装的路径，另一方面可以在编译过程中自行添加更多的特性。</div><div>&nbsp;</div><div>ruby的源代码可以从Ruby官方网站下载：</div><div><a href="http://www.ruby-lang.org/en/downloads/" style="color: #7d0000; text-decoration: underline; ">http://www.ruby-lang.org/en/downloads/</a></div><div>&nbsp;</div><div>下载源代码包到本地Linux主机，然后解压缩，进入该目录，进行配置，编译和安装：</div><div><span style="background-color: #e6e6e6; ">tar xzvf ruby-1.8.5.tar.gz</span></div><div><span style="background-color: #e6e6e6; ">cd ruby-1.8.5</span></div><div><span style="background-color: #e6e6e6; ">./configure &#8211;prefix=/usr/local/ruby</span></div><div><span style="background-color: #e6e6e6; ">make &amp;&amp; make install</span></div><div>如果想浏览所有的configure参数，可以：</div><div><span style="background-color: #e6e6e6; ">./configure &#8211;help |more</span></div><div>如果不定制安装的目录，默认将安装到/usr/local目录下面。然而我建议自行定制一个ruby的安装目录，例如/usr/local/ruby，这样便于以后的升级，不会和操作系统其他软件混在一起。</div><div>&nbsp;</div><div>安装好以后，修改操作系统PATH路径，加入/usr/local/ruby/bin：</div><div><span style="background-color: #e6e6e6; ">export PATH=/usr/local/ruby/bin:$PATH</span></div><div>将我们自己安装的ruby放在系统PATH前面，避免操作系统自带的ruby造成的干扰。在Linux上，一般将设置放在/etc/profile中，便于对全局生效。</div><div>&nbsp;</div><div><strong style="font-weight: bold; "><span style="font-size: 12pt; ">二、安装</span>&nbsp;</strong><strong style="font-weight: bold; "><span style="font-size: 12pt; ">ruby on rails</span></strong></div><div>&nbsp;</div><div>在安装rails之前，要先安装rubygems。rubygems是ruby的在线包管理工具，可以从rubyforge下载rubygems：</div><div><a href="http://rubyforge.org/projects/rubygems/" style="color: #7d0000; text-decoration: underline; ">http://rubyforge.org/projects/rubygems/</a></div><div>下载好源代码包，解压缩，安装：</div><div><span style="background-color: #e6e6e6; ">tar xzvf rubygems-0.9.0.tgz</span></div><div><span style="background-color: #e6e6e6; ">cd rubygems-0.9.0/</span></div><div><span style="background-color: #e6e6e6; ">ruby setup.rb</span></div><div>&nbsp;</div><div>然后就可以安装rails了，在确认服务器已经连接互联网的情况下执行：</div><div><span style="background-color: #e6e6e6; ">gem install rails &#8211;y</span></div><div>即通过gem从rubyforge网站下载rails所有依赖包安装。</div><div>&nbsp;</div><div>安装好rails以后，可以执行：</div><div><span style="background-color: #e6e6e6; ">rails &#8211;v</span></div><div>确认一下rails的版本。</div><div>&nbsp;</div><div>&nbsp;</div><div><strong style="font-weight: bold; "><span style="font-size: 12pt; ">三、安装</span>&nbsp;</strong><strong style="font-weight: bold; "><span style="font-size: 12pt; ">ruby</span>&nbsp;</strong><strong style="font-weight: bold; "><span style="font-size: 12pt; ">的数据库适配器</span></strong></div><div>&nbsp;</div><div>rails发行包中已经自带纯ruby的MySQL数据库适配器，然而对于生产环境来说，我们仍然应该下载安装C版本的数据库适配器，以达到更好的性能。下载mysql-ruby-2.7.3.tar.gz：</div><div><a href="http://www.tmtm.org/en/mysql/ruby/" style="color: #7d0000; text-decoration: underline; ">http://www.tmtm.org/en/mysql/ruby/</a></div><div><span style="background-color: #e6e6e6; ">tar xzvf mysql-ruby-2.7.3.tar.gz</span></div><div><span style="background-color: #e6e6e6; ">cd mysql-ruby-2.7.3</span></div><div><span style="background-color: #e6e6e6; ">ruby extconf.rb&nbsp;--with-mysql-dir=/opt/mysql5</span></div><div><span style="background-color: #e6e6e6; ">make &amp;&amp; make install</span></div><div>注意--with-mysql-dir应该指向MySQL数据库的安装路径，如果数据库服务器和Web服务器不在同一台机器上，那么Web服务器上也必须安装MySQL软件，因为ruby的C版本MySQL适配器需要在编译的时候联接MySQL的系统库。</div><div>&nbsp;</div><div><div>&nbsp;</div></div><div><strong style="font-weight: bold; "><span style="font-size: 12pt; ">四、安装</span>&nbsp;</strong><strong style="font-weight: bold; "><span style="font-size: 12pt; ">Ruby</span>&nbsp;</strong><strong style="font-weight: bold; "><span style="font-size: 12pt; ">的</span>&nbsp;</strong><strong style="font-weight: bold; "><span style="font-size: 12pt; ">FCGI</span>&nbsp;</strong><strong style="font-weight: bold; "><span style="font-size: 12pt; ">支持</span></strong></div><div>&nbsp;</div><div>由于ruby的fcgi支持库需要在编译的时候联接FCGI的系统库，因此我们需要先安装FCGI库，下载FCGI源代码发行包：</div><div><a href="http://www.fastcgi.com/dist/" style="color: #7d0000; text-decoration: underline; ">http://www.fastcgi.com/dist/</a></div><div><span style="background-color: #e6e6e6; ">tar xzvf fcgi-2.4.0.tar.gz</span></div><div><span style="background-color: #e6e6e6; ">cd fcgi-2.4.0</span></div><div><span style="background-color: #e6e6e6; ">./configure --prefix=/usr/local/fcgi</span></div><div><span style="background-color: #e6e6e6; ">make &amp;&amp; make install</span></div><div>同样，将fcgi安装在自己指定的目录下，而不是默认的/usr/local，避免多个软件混在一起。</div><div>&nbsp;</div><div>然后就可以安装ruby的fcgi支持库了，下载ruby-fcgi-0.8.7.tar.gz：</div><div><a href="http://rubyforge.org/projects/fcgi/" style="color: #7d0000; text-decoration: underline; ">http://rubyforge.org/projects/fcgi/</a></div><div><span style="background-color: #e6e6e6; ">tar xzvf ruby-fcgi-0.8.7.tar.gz</span></div><div><span style="background-color: #e6e6e6; ">cd ruby-fcgi-0.8.7</span></div><div><span style="background-color: #e6e6e6; ">ruby install.rb config -- --with-fcgi-include=/usr/local/fcgi/include --with-fcgi-lib=/usr/local/fcgi/lib</span></div><div><span style="background-color: #e6e6e6; ">ruby install.rb setup</span></div><div><span style="background-color: #e6e6e6; ">ruby install.rb install</span></div><div>&nbsp;</div><div><strong style="font-weight: bold; "><span style="font-size: 12pt; ">五、安装</span>&nbsp;</strong><strong style="font-weight: bold; "><span style="font-size: 12pt; ">lighttpd Web Server</span></strong></div><div>&nbsp;</div><div><strong style="font-weight: bold; "><span style="font-size: 12pt; ">安装</span>&nbsp;</strong><strong style="font-weight: bold; "><span style="font-size: 12pt; ">Lighttpd</span></strong></div><div>&nbsp;</div><div>在安装lighttpd之前，应该确认操作系统已经安装pcre，即Perl兼容的规则表达式库：</div><div><span style="background-color: #e6e6e6; ">rpm &#8211;qa |grep pcre</span></div><div>如果没有，请从Linux安装光盘里面安装。</div><div>&nbsp;</div><div>然后下载lighttpd：</div><div><a href="http://www.lighttpd.net/download/" style="color: #7d0000; text-decoration: underline; ">http://www.lighttpd.net/download/</a></div><div><span style="background-color: #e6e6e6; ">tar xzvf lighttpd-1.4.13.tar.gz</span></div><div><span style="background-color: #e6e6e6; ">cd lighttpd-1.4.13</span></div><div><span style="background-color: #e6e6e6; ">./configure --prefix=/usr/local/lighttpd</span></div><div>&nbsp;</div><div>configure完毕以后，会给出一个激活的模块和没有激活模块的清单，可以检查一下，是否自己需要的模块都已经激活，在enable的模块中一定要有&#8220;mod_rewrite&#8221;这一项，否则重新检查pcre是否安装。然后编译安装：</div><div><span style="background-color: #e6e6e6; ">make &amp;&amp; make install</span></div><div>&nbsp;</div><div>编译后配置：</div><div><span style="background-color: #e6e6e6; ">cp doc/sysconfig.lighttpd /etc/sysconfig/lighttpd</span></div><div><span style="background-color: #e6e6e6; ">mkdir /etc/lighttpd</span></div><div><span style="background-color: #e6e6e6; ">cp doc/lighttpd.conf /etc/lighttpd/lighttpd.conf</span></div><div>&nbsp;</div><div>如果你的Linux是RedHat/CentOS，那么：</div><div><span style="background-color: #e6e6e6; ">cp doc/rc.lighttpd.redhat /etc/init.d/lighttpd</span></div><div>如果你的Linux是SuSE，那么：</div><div><span style="background-color: #e6e6e6; ">cp doc/rc.lighttpd /etc/init.d/lighttpd</span></div><div>如果你的Linux是ubuntu，那么需要自己创建启动脚本，lighttpd官方wiki上面已经给出来该脚本，地址在：</div><div><a href="http://redmine.lighttpd.net/wiki/1/ScriptsUbuntu" title="ubuntu start script" target="_blank" style="color: #7d0000; text-decoration: underline; ">http://redmine.lighttpd.net/wiki/1/ScriptsUbuntu</a></div><div></div><div>其他Linux发行版本可以自行参考该文件内容进行修改，或者自己写一个控制脚本，也不过举手之劳：</div><div></div><div style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; font-size: 12px; background-color: transparent; width: 694px; overflow-x: auto; overflow-y: auto; margin-left: 9px; padding-top: 1px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; "><div><div style="padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: black; font-weight: bold; ">C代码&nbsp;<embed src="http://robbin.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" width="14" height="15" flashvars="clipboard=%23!%2Fbin%2Fsh%0A%0Acase%20%22%241%22%20in%20%0A%20%20start)%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%2Fusr%2Flocal%2Flighttpd%2Fsbin%2Flighttpd%20-f%20%2Fetc%2Flighttpd%2Flighttpd.conf%20%3E%20%2Fdev%2Fnull%202%3E%261%0A%20%20%20%20%3B%3B%0A%20%20stop)%20%0A%20%20%20%20killall%20lighttpd%0A%20%20%20%20%3B%3B%0A%20%20restart)%20%0A%20%20%20%240%20stop%0A%20%20%20sleep%201%0A%20%20%20%240%20start%20%0A%20%20%20%3B%3B%0A%20%20*)%20%0A%20%20echo%20%22Usage%3A%20lighttpd.sh%20%7Bstart%7Cstop%7Crestart%7D%22%20%0A%20%20%3B%3B%20%0Aesac%0A%0Aexit%200%20%0A" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"></div></div><ol start="1" style="font-size: 1em; line-height: 1.4em; margin-top: 0px; margin-right: 0px; margin-bottom: 1px; margin-left: 0px; padding-top: 2px; padding-right: 0px; padding-bottom: 2px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #d1d7dc; border-right-color: #d1d7dc; border-bottom-color: #d1d7dc; border-left-color: #d1d7dc; list-style-type: decimal; list-style-position: initial; list-style-image: initial; background-color: #ffffff; color: #2b91af; "><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; "><span style="color: gray; ">#!/bin/sh</span><span style="color: black; ">&nbsp;&nbsp;</span></span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">&nbsp;&nbsp;</span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; "><span style="color: #7f0055; font-weight: bold; ">case</span>&nbsp;<span style="color: blue; ">"$1"</span><span style="color: black; ">&nbsp;in&nbsp;&nbsp;&nbsp;</span></span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">&nbsp;&nbsp;start)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/lighttpd/sbin/lighttpd&nbsp;-f&nbsp;/etc/lighttpd/lighttpd.conf&nbsp;&gt;&nbsp;/dev/null&nbsp;2&gt;&amp;1&nbsp;&nbsp;</span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">&nbsp;&nbsp;&nbsp;&nbsp;;;&nbsp;&nbsp;</span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">&nbsp;&nbsp;stop)&nbsp;&nbsp;&nbsp;</span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">&nbsp;&nbsp;&nbsp;&nbsp;killall&nbsp;lighttpd&nbsp;&nbsp;</span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">&nbsp;&nbsp;&nbsp;&nbsp;;;&nbsp;&nbsp;</span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">&nbsp;&nbsp;restart)&nbsp;&nbsp;&nbsp;</span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">&nbsp;&nbsp;&nbsp;$0&nbsp;stop&nbsp;&nbsp;</span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">&nbsp;&nbsp;&nbsp;sleep&nbsp;1&nbsp;&nbsp;</span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">&nbsp;&nbsp;&nbsp;$0&nbsp;start&nbsp;&nbsp;&nbsp;</span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">&nbsp;&nbsp;&nbsp;;;&nbsp;&nbsp;</span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">&nbsp;&nbsp;*)&nbsp;&nbsp;&nbsp;</span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">&nbsp;&nbsp;echo&nbsp;<span style="color: blue; ">"Usage:&nbsp;lighttpd.sh&nbsp;{start|stop|restart}"</span><span style="color: black; ">&nbsp;&nbsp;&nbsp;</span></span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">&nbsp;&nbsp;;;&nbsp;&nbsp;&nbsp;</span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">esac&nbsp;&nbsp;</span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">&nbsp;&nbsp;</span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">exit&nbsp;0&nbsp;&nbsp;&nbsp;</span></li></ol></div><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><div>然后修改/etc/init.d/lighttpd，把</div><div><span style="background-color: #e6e6e6; ">LIGHTTPD_BIN=/usr/sbin/lighttpd</span></div><div>改为</div><div><span style="background-color: #e6e6e6; ">LIGHTTPD_BIN=/usr/local/lighttpd/sbin/lighttpd</span></div><div>&nbsp;</div><div>此脚本用来控制lighttpd的启动关闭和重起：</div><div><span style="background-color: #e6e6e6; ">/etc/init.d/lighttpd start</span></div><div><span style="background-color: #e6e6e6; ">/etc/init.d/lighttpd stop</span></div><div><span style="background-color: #e6e6e6; ">/etc/init.d/lighttpd restart</span></div><div>&nbsp;</div><div>如果你希望服务器启动的时候就启动lighttpd，那么：</div><div><span style="background-color: #e6e6e6; ">chkconfig lighttpd on</span></div><div>&nbsp;</div><div>这样lighttpd就安装好了，接下来需要配置lighttpd。</div><div>&nbsp;</div><div><strong style="font-weight: bold; "><span style="font-size: 12pt; ">配置</span>&nbsp;</strong><strong style="font-weight: bold; "><span style="font-size: 12pt; ">Lighttpd</span></strong></div><div>&nbsp;</div><div>修改/etc/lighttpd/lighttpd.conf</div><div>&nbsp;</div><div>1）server.modules</div><div>取消需要用到模块的注释，mod_rewrite，mod_access，mod_fastcgi，mod_simple_vhost，mod_cgi，mod_compress，mod_accesslog是一般需要用到的。</div><div>&nbsp;</div><div>2）server.document-root, server.error-log，accesslog.filename需要指定相应的目录</div><div>&nbsp;</div><div>3）用什么权限来运行lighttpd</div><div><span style="background-color: #e6e6e6; ">server.username&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = "nobody"</span></div><div><span style="background-color: #e6e6e6; ">server.groupname&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = "nobody"</span></div><div>从安全角度来说，不建议用root权限运行web server，可以自行指定普通用户权限。</div><div>&nbsp;</div><div>4）静态文件压缩</div><div><span style="background-color: #e6e6e6; ">compress.cache-dir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = "/tmp/lighttpd/cache/compress"</span></div><div><span style="background-color: #e6e6e6; ">compress.filetype&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = ("text/plain", "text/html","text/javascript","text/css")</span></div><div>可以指定某些静态资源类型使用压缩方式传输，节省带宽，对于大量AJAX应用来说，可以极大提高页面加载速度。</div><div>&nbsp;</div><div>5）配置ruby on rails</div><div>&nbsp;</div><div>最简单的配置如下：</div><div><span style="background-color: #e6e6e6; ">$HTTP["host"] == "www.xxx.com" {</span></div><div><span style="background-color: #e6e6e6; ">&nbsp;server.document-root = "/yourrails/public"</span></div><div><span style="background-color: #e6e6e6; ">&nbsp;server.error-handler-404 = "/dispatch.fcgi"</span></div><div><span style="background-color: #e6e6e6; ">&nbsp;fastcgi.server = (".fcgi" =&gt;</span></div><div><span style="background-color: #e6e6e6; ">&nbsp;&nbsp;&nbsp; ("localhost" =&gt;</span></div><div><span style="background-color: #e6e6e6; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ("min-procs" =&gt; 10,</span></div><div><span style="background-color: #e6e6e6; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "max-procs" =&gt; 10,</span></div><div><span style="background-color: #e6e6e6; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "socket" =&gt; "/tmp/lighttpd/socket/rails.socket",</span></div><div><span style="background-color: #e6e6e6; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "bin-path" =&gt; "/yourrails/public/dispatch.fcgi",</span></div><div><span style="background-color: #e6e6e6; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "bin-environment" =&gt; ("RAILS_ENV" =&gt; "production")</span></div><div><span style="background-color: #e6e6e6; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )</span></div><div><span style="background-color: #e6e6e6; ">&nbsp;&nbsp;&nbsp; )</span></div><div><span style="background-color: #e6e6e6; ">&nbsp;)</span></div><div><span style="background-color: #e6e6e6; ">}</span></div><div>即由lighttpd启动10个FCGI进程，lighttpd和FCGI之间使用本机Unix Socket通信。</div><div>&nbsp;</div><div>Lighttpd的FAQ：无法启动Ruby on Rails</div><div>&nbsp;</div><div>FastCGI的启动脚本位于Rails应用目录下面public/dispatch.fcgi，如果无法启动Lighttpd，报告FastCGI错误，你可以尝试着手工运行该脚本cd public &amp;&amp; ./dispatch.fcgi，看看是否可以运行。一般来说，很多人都是在Windows下面创建Rails项目，导致dispatch.fcgi脚本的ruby运行路径指向windows下面的ruby，部署到Linux上面就无法运行了，另外一方面Windows上面创建的Rails项目在Linux上面dispatch.fcgi没有可执行权限，所以也需要授予可执行权限。</div>&nbsp;<div>&nbsp;</div><div><strong style="font-weight: bold; "><span style="font-size: 12pt; ">六、安装</span>&nbsp;</strong><strong style="font-weight: bold; "><span style="font-size: 12pt; ">ImageMagick</span>&nbsp;</strong><strong style="font-weight: bold; "><span style="font-size: 12pt; ">和</span>&nbsp;</strong><strong style="font-weight: bold; "><span style="font-size: 12pt; ">RMagic</span></strong></div><div>&nbsp;</div><div>RMagic是ruby处理图片需要用到的库，很多ruby应用由于都涉及图片处理的功能，往往需要依赖RMagic，但安装ImageMagick和RMagic相当烦琐，需要特别的说明。</div><div>&nbsp;</div><div><strong style="font-weight: bold; "><span style="font-size: 12pt; ">安装</span>&nbsp;</strong><strong style="font-weight: bold; "><span style="font-size: 12pt; ">ImageMagick</span></strong></div><div><a href="http://www.imagemagick.org/" style="color: #7d0000; text-decoration: underline; ">http://www.imagemagick.org</a></div><div>ImageMagick是用C语言实现的图形处理库，有Unix版本和Windows版本。对于Unix版本来说，安装比较麻烦些，另外不建议安装ImageMagick二进制版本，往往会导致缺少某些图片处理功能，导致RMagic安装失败。下载ImageMagick源代码，解压缩，配置：</div><div><span style="background-color: #e6e6e6; ">tar xzvf ImageMagick-6.2.9-0.tar.gz</span></div><div><span style="background-color: #e6e6e6; ">cd tar xzvf ImageMagick-6.2.9</span></div><div><span style="background-color: #e6e6e6; ">./configure --prefix=/usr/local/ImageMagick</span></div><div>&nbsp;</div><div>观察配置后给出来的支持图形格式，看看该图形格式支持是否是yes，如果不是，那么必须先安装该图形格式的本地库。例如，你应该检查是否已经安装如下rpm包：</div><div><span style="background-color: #e6e6e6; ">rpm &#8211;qa |grep libpng</span></div><div><span style="background-color: #e6e6e6; ">rpm &#8211;qa |grep libpng-devel</span></div><div><span style="background-color: #e6e6e6; ">rpm &#8211;qa |grep libjpeg</span></div><div><span style="background-color: #e6e6e6; ">rpm &#8211;qa |grep gd-devel</span></div><div>如果你希望支持tiff格式，还应该检查</div><div><span style="background-color: #e6e6e6; ">rpm &#8211;qa |grep libtiff</span></div><div>如果没有安装，那么在Linux安装光盘找到相应rpm包安装上，再次configure直到确认需要的图形格式全部支持为止，然后编译安装：</div><div><span style="background-color: #e6e6e6; ">make &amp;&amp; make install</span></div><div>&nbsp;</div><div>由于ImageMagic被安装在我们自行指定的/usr/local/ImageMagick，后面安装RMagic会找不到需要用到的ImageMagic的命令和库，因此需要配置一下操作系统：</div><div>&nbsp;</div><div>编辑/etc/profile里面的PATH环境变量，在最后面加入：</div><div><span style="background-color: #e6e6e6; ">export PATH=/usr/local/ruby/bin:/usr/local/ImageMagick/bin:$PATH</span></div><div>&nbsp;</div><div>编辑/etc/ld.so.conf，加入：</div><div><span style="background-color: #e6e6e6; ">/usr/local/ImageMagick/lib</span></div><div>执行命令：</div><div><span style="background-color: #e6e6e6; ">ldconfig</span></div><div>将ImageMagick的库加入系统联接库</div><div>&nbsp;</div><div>然后注销当前用户重新登录，便于环境变量修改生效，执行：</div><div><span style="background-color: #e6e6e6; ">convert logo: logo.gif</span></div><div>看是否正确生成一个logo.gif的图片文件。</div><div>&nbsp;</div><div><strong style="font-weight: bold; "><span style="font-size: 12pt; ">安装</span>&nbsp;</strong><strong style="font-weight: bold; "><span style="font-size: 12pt; ">RMagic</span></strong></div><div><a href="http://rubyforge.org/projects/rmagick/" style="color: #7d0000; text-decoration: underline; ">http://rubyforge.org/projects/rmagick/</a></div><div>在rubyfoge上面下载RMagic的源代码发行包，不要下载gem包，然后解压缩编译：</div><div><span style="background-color: #e6e6e6; ">./configure</span></div><div><span style="background-color: #e6e6e6; ">make &amp;&amp; make install</span></div><div>&nbsp;</div><div>如果配置和编译过程没有报错，即大功告成。</div><div>&nbsp;</div><div>对于MacOSX来说，安装RMagic以上步骤会出错，请参考：</div><div><a href="http://rmagick.rubyforge.org/install-osx.html" style="color: #7d0000; text-decoration: underline; ">http://rmagick.rubyforge.org/install-osx.html</a></div><div>&nbsp;</div><div>总体来说，ImageMagick和RMagic的安装很容易出错，安装起来比较困难，如果碰到无法解决的问题，可以通过Google寻求解决办法。</div><div>&nbsp;</div><div><span style="font-size: medium; "><strong style="font-weight: bold; ">如果你在安装过程当中，遇到了什么问题，请看：<a href="http://robbin.iteye.com/blog/168989" title="Lighttpd和RoR安装配置的疑难解答" target="_blank" style="color: #7d0000; text-decoration: underline; ">Lighttpd和RoR安装配置的疑难解答</a></strong></span></div></span></div><img src ="http://www.blogjava.net/xiaomage234/aggbug/365861.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2011-12-08 13:40 <a href="http://www.blogjava.net/xiaomage234/archive/2011/12/08/365861.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python的sitecustomize.py妙用 【转】</title><link>http://www.blogjava.net/xiaomage234/archive/2011/12/08/365858.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 08 Dec 2011 05:21:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2011/12/08/365858.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/365858.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2011/12/08/365858.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/365858.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/365858.html</trackback:ping><description><![CDATA[<div><span style="color: #333333; font-family: verdana, 宋体, Arial; font-size: 13px; line-height: 24px; "><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">在zope实例所采用的python的路径中，找到site-packages目录，在此目录中建立一个sitecustomize.py文件，设置相应的权限。文件的内容如下：</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">import sys</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">sys.setdefaultencoding("utf-8")&nbsp;&nbsp;</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">重启zope实例，这样将解决很多unicodedecodeerror错误。</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">=========================================</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">#for python2.7 on ubuntu<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />/etc/python2.7/sitecustomize.py</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">#for python2.6 on centOS<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />/usr/local/lib/python2.6/site-packages/sitecustomize.py</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">=========================================</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; "><a href="http://www.grabner-online.de/div_into/html/ch09s04s03.html" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #000000; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #333333; ">http://www.grabner-online.de/div_into/html/ch09s04s03.html</a><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /># sitecustomize.py&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /># this file can be anywhere in your Python path,<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /># but it usually goes in ${pythondir}/lib/site-packages/<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />import sys<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />sys.setdefaultencoding('iso-8859-1')</p><p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 0px; ">&nbsp;sitecustomize.py is a special script; Python will try to import it on startup, so any code in it will be run automatically. As the comment mentions, it can go anywhere (as long as import can find it), but it usually goes in the site-packages directory within your Python lib directory.&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;setdefaultencoding function sets, well, the default encoding. This is the encoding scheme that Python will try to use whenever it needs to auto-coerce a unicode string into a regular string.</p></span></div><img src ="http://www.blogjava.net/xiaomage234/aggbug/365858.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2011-12-08 13:21 <a href="http://www.blogjava.net/xiaomage234/archive/2011/12/08/365858.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MoinMoin 与 Nginx, fastcgi 与 uwsgi 的配置【转】</title><link>http://www.blogjava.net/xiaomage234/archive/2011/12/07/365792.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Wed, 07 Dec 2011 09:47:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2011/12/07/365792.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/365792.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2011/12/07/365792.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/365792.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/365792.html</trackback:ping><description><![CDATA[&nbsp; &nbsp;&nbsp;<span class="Apple-style-span" style="color: #505050; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; line-height: 18px; ">给自己架了个Wiki&nbsp;<a href="http://wiki.apt-blog.net/" style="color: #f26522; text-decoration: none; ">http://wiki.apt-blog.net</a>作为自己的知识管理工具。虽然这个博客本来就是工具之一，也累积了快两年了，但经常碰到有些小东西，不值得为之写篇博客，很有用，但用完就忘记。个人wiki适合做写细小的笔记，当累积一定的时候还可以整理成博客。</span><div><span style="color: #505050; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; line-height: 18px; "><div><p>Wiki我选择了用Python的MoinMoin，一定程度上受CPYUG社区<a href="http://wiki.woodpecker.org.cn/moin/ZoomQuiet" style="color: #f26522; text-decoration: none; ">&nbsp;ZoomQuiet&nbsp;</a>大妈的推荐影响，首次试用感觉非常impresive，所以就定了。再加上<a href="http://wiki.woodpecker.org.cn/moin/GraphViz" style="color: #f26522; text-decoration: none; ">&nbsp;GraphViz&nbsp;</a>工具的支持，实在的强大。</p><p>在vps上服务，肯定是无视apache的，内存有限。之前架设过用来上Twitter奶瓶腿，是Nginx + php-cgi的方案，nginx是必须的。</p><p>Python跟web前端的架构方式有太多选择了，五花八门，MoinMoin的发行包里面都提供了<code style="background-color: #eaeaea; margin-top: 0px; margin-right: 5px; margin-bottom: 0px; margin-left: 5px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; ">moin.cgi</code>&nbsp;<code style="background-color: #eaeaea; margin-top: 0px; margin-right: 5px; margin-bottom: 0px; margin-left: 5px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; ">moin.scgi</code>&nbsp;<code style="background-color: #eaeaea; margin-top: 0px; margin-right: 5px; margin-bottom: 0px; margin-left: 5px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; ">moin.ajp</code>&nbsp;<code style="background-color: #eaeaea; margin-top: 0px; margin-right: 5px; margin-bottom: 0px; margin-left: 5px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; ">moin.fcgi</code>&nbsp;<code style="background-color: #eaeaea; margin-top: 0px; margin-right: 5px; margin-bottom: 0px; margin-left: 5px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; ">moin.wsgi</code>等多种启动方式。MoinMoin里面全部通过内置的flup作为中间件提供这些接口，目前我仅尝试使用了fastcgi和wsgi。</p><p>虽然解压了moin的源码包就可以直接运行里面的<code style="background-color: #eaeaea; margin-top: 0px; margin-right: 5px; margin-bottom: 0px; margin-left: 5px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; ">wikiserver.py</code>来本地访问了，但在服务器上通常是由nginx/lighttpd等服务来综合转发。php的话是通过<code style="background-color: #eaeaea; margin-top: 0px; margin-right: 5px; margin-bottom: 0px; margin-left: 5px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; ">spawn-fcgi</code>启动一些php-cgi的进程，服务器接受到动态的请求就通过本地socket跟php-cgi通讯，返回的结果展现回给客户。php-cgi是使用FastCGI协议的。</p><p>MoinMoin 源码当中<code style="background-color: #eaeaea; margin-top: 0px; margin-right: 5px; margin-bottom: 0px; margin-left: 5px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; ">wiki/server/moin.fcgi</code>就是一个类似php-cgi功能的fastcgi服务，类似地可以使用<code style="background-color: #eaeaea; margin-top: 0px; margin-right: 5px; margin-bottom: 0px; margin-left: 5px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; ">spawn-fcgi</code>来启动moin.fcgi，作为后端的处理进程。</p><p><a href="http://dotimes.com/iscale/2010/07/running-moinmoin-wiki-with-nginx-via-fastcgi-and-flup.html" style="color: #f26522; text-decoration: none; ">Running MoinMoin Wiki with Nginx via FastCGI and Flup</a>该文章很形象解释了fastcgi的角色，以及提供了一段很方便的服务脚本来启动<code style="background-color: #eaeaea; margin-top: 0px; margin-right: 5px; margin-bottom: 0px; margin-left: 5px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; ">spawn-fcgi</code>。</p><pre style="font-family: 'Courier New', Courier, monospace, Fixed; line-height: normal; overflow-x: auto; overflow-y: auto; padding-bottom: 25px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; background-image: url(http://apt-blog.net/wp-content/themes/openark-blog/images/bg_pre_dots.png); background-position: 0% 100%; background-repeat: repeat no-repeat; ">Client ----&gt; Nginx Web Frontend -----------+                                            | fastcgi_pass                                           \|/                             +-------------------------+               moin.fcgi     | spawn-fcgi-moin.socket  | spawn-fcgi ---------------&gt; |           or            |                             |     localhost:port      |                             +-------------------------+ </pre><p>但是文章当中的nginx配置不完整，而且复杂了，这是我的配置：</p><div style="color: #110000; background-color: #f9f9f9; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; overflow-x: auto; overflow-y: hidden; width: 1468px; "><div style="vertical-align: top; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "><pre style="font-family: monospace; line-height: 1.333; overflow-x: visible; overflow-y: visible; padding-bottom: 25px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; background-image: url(http://apt-blog.net/wp-content/themes/openark-blog/images/bg_pre_dots.png); width: auto; float: none; clear: none; font-size: 12px; white-space: pre; background-position: 0% 100%; background-repeat: repeat no-repeat; ">server {         listen   80; ## listen for ipv4         server_name  wiki.apt-blog.net; &nbsp; access_log  /var/log/nginx/wiki.apt-blog.net.access.log;         error_log   /var/log/nginx/wiki.apt-blog.net.error_log; &nbsp; location / {                 include fastcgi_params;                 fastcgi_param PATH_INFO $fastcgi_script_name;                 fastcgi_param SCRIPT_NAME /;                 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;                 if (!-f $request_filename) {                         fastcgi_pass unix:/var/run/spawn-fcgi-moin.socket;                 }         } }</pre></div></div><p>当然那文章中的配置有考虑对静态文件直接由nginx服务，不通过flup这一层，有一定优化，这里省去了这些。其实增多一个<code style="background-color: #eaeaea; margin-top: 0px; margin-right: 5px; margin-bottom: 0px; margin-left: 5px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; ">/moin_static193</code>(据版本号不同而不同)的location即可，可参考后面使用uwsgi做服务时候的配置。</p><p>文章还提到<code style="background-color: #eaeaea; margin-top: 0px; margin-right: 5px; margin-bottom: 0px; margin-left: 5px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; ">wikiconfig.py</code>里面一个<code style="background-color: #eaeaea; margin-top: 0px; margin-right: 5px; margin-bottom: 0px; margin-left: 5px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; ">fix_script_name</code>变量，是1.9版本新加入的，需要xxx.com/wiki这样访问的童鞋就不用像以前版本那样要在nginx配置里面写一大堆东西了。</p><p>Fastcgi就这么多，不算太复杂。Fastcgi虽然很流行，但弊端不少，首先是速度，在一台虚拟机上测试，用ab居然跑出每秒20个请求的速度&#8230;&#8230;虽然平均下来还是有5、60次，但真的，唉。php-cgi还支持产生多个工作进程以并行和均衡请求，提高效率，fastcgi似乎就没这样的东西了。</p><p>刚好这天<a href="http://obmem.info/" style="color: #f26522; text-decoration: none; ">observer专栏杂记</a>写了一篇<a href="http://obmem.info/?p=703" style="color: #f26522; text-decoration: none; ">配置Nginx＋uwsgi更方便地部署python应用</a>，当中也提到<code style="background-color: #eaeaea; margin-top: 0px; margin-right: 5px; margin-bottom: 0px; margin-left: 5px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; ">fcgi</code>和&nbsp;<code style="background-color: #eaeaea; margin-top: 0px; margin-right: 5px; margin-bottom: 0px; margin-left: 5px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; ">mod_python</code>的各种不便，然后介绍了<code style="background-color: #eaeaea; margin-top: 0px; margin-right: 5px; margin-bottom: 0px; margin-left: 5px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; ">uwgi</code>，高性能、多应用。</p><p>uwgi充当了python解析器的角色，使用wsgi的接口和Python程序交互，这个过程中做了优化，和上层nginx之间则设计了更加轻量的协议。nginx0.8.40以后官方默认带了uwgi的协议模块，所以使用很方便。</p><p>uwgi的文档有些简略，但是重点都是在<a href="http://projects.unbit.it/uwsgi/wiki/Example" style="color: #f26522; text-decoration: none; ">wiki/Example</a>里面了。 MoinMoin在uwgi的配置在其中一句带过：</p><div style="color: #110000; background-color: #f9f9f9; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; overflow-x: auto; overflow-y: hidden; width: 1468px; "><div style="vertical-align: top; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "><pre style="font-family: monospace; line-height: 1.333; overflow-x: visible; overflow-y: visible; padding-bottom: 25px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; background-image: url(http://apt-blog.net/wp-content/themes/openark-blog/images/bg_pre_dots.png); width: auto; float: none; clear: none; font-size: 12px; white-space: pre; background-position: 0% 100%; background-repeat: repeat no-repeat; "><span style="color: #000000; font-weight: bold; ">/</span>usr<span style="color: #000000; font-weight: bold; ">/</span>bin<span style="color: #000000; font-weight: bold; ">/</span>uwsgi <span style="color: #660033; ">-s</span> <span style="color: #000000; font-weight: bold; ">/</span>tmp<span style="color: #000000; font-weight: bold; ">/</span>moin.sock <span style="color: #660033; ">--wsgi-file</span> wiki<span style="color: #000000; font-weight: bold; ">/</span>server<span style="color: #000000; font-weight: bold; ">/</span>moin.wsgi <span style="color: #660033; ">-M</span> <span style="color: #660033; ">-p</span> <span style="color: #000000; ">4</span></pre></div></div><p>uwgi的-w参数是把某个py文件作为module，import使用，但是wsgi文件不被认识，所以新版里面多了这么个<code style="background-color: #eaeaea; margin-top: 0px; margin-right: 5px; margin-bottom: 0px; margin-left: 5px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; ">--wsgi-file</code>参数。但是如果是多站点呢！</p><p>nginx配置的虚拟主机里面的<code style="background-color: #eaeaea; margin-top: 0px; margin-right: 5px; margin-bottom: 0px; margin-left: 5px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; ">uwsgi_param UWSGI_SCRIPT</code>参数会让uwgi按模块导入名称，相当于命令行里面的<code style="background-color: #eaeaea; margin-top: 0px; margin-right: 5px; margin-bottom: 0px; margin-left: 5px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; ">-w</code>，但是moinmoin的moin.wsgi文件，不是py结尾，只能用<code style="background-color: #eaeaea; margin-top: 0px; margin-right: 5px; margin-bottom: 0px; margin-left: 5px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; ">--wsgi-file</code>参数。扫了一圈uwgi的<a href="http://projects.unbit.it/uwsgi/wiki/Example" style="color: #f26522; text-decoration: none; ">wiki/Example</a>和<a href="http://projects.unbit.it/uwsgi/wiki/RunOnNginx" style="color: #f26522; text-decoration: none; ">RunOnNginx</a>，都没提到这个问题，倒是在<a href="http://projects.unbit.it/uwsgi/wiki/RunPinax" style="color: #f26522; text-decoration: none; ">这里</a>提到在旧版的uwgi当中没有<code style="background-color: #eaeaea; margin-top: 0px; margin-right: 5px; margin-bottom: 0px; margin-left: 5px; padding-top: 0px; padding-right: 3px; padding-bottom: 0px; padding-left: 3px; ">--wsgi-file</code>参数，<strong><em>需要把wsgi文件改名成py结尾来导入</em></strong>，好吧，确实那样成功了。</p><p>至于性能，一开始我发现uwgi占的内存也不少，一个worker时候就占了20M多的内存，所以没开更多的工作进程；Fastcgi也差不多，然后用Apache Benchmark测试，好像两者区别不大。于是看了下<a href="http://www.peterbe.com/plog/fcgi-vs-gunicorn-vs-uwsgi" style="color: #f26522; text-decoration: none; ">fcgi vs. gunicorn vs. uWSGI的测评</a>，才发现uwgi要开多个worker进程才有性能！于是开了8个，性能出来了，秒请求马上就上千！ 显然是uwgi打开了多个进程，充分利用了机器的CPU，还做了均衡请求。</p><p>最后，我的Wiki使用uwgi后的nginx配置：</p><div style="color: #110000; background-color: #f9f9f9; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; overflow-x: auto; overflow-y: hidden; width: 1468px; "><table style="border-collapse: collapse; "><tbody><tr><td style="vertical-align: top; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; text-align: right; background-color: #ddeeff; color: gray; overflow-x: visible; overflow-y: visible; "><pre style="font-family: 'Courier New', Courier, monospace, Fixed; line-height: 1.333; overflow-x: visible; overflow-y: visible; padding-bottom: 25px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; background-image: url(http://apt-blog.net/wp-content/themes/openark-blog/images/bg_pre_dots.png); width: auto; float: none; clear: none; font-size: 12px; white-space: pre; background-position: 0% 100%; background-repeat: repeat no-repeat; ">1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 </pre></td><td style="vertical-align: top; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "><pre style="font-family: monospace; line-height: 1.333; overflow-x: visible; overflow-y: visible; padding-bottom: 25px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; background-image: url(http://apt-blog.net/wp-content/themes/openark-blog/images/bg_pre_dots.png); width: auto; float: none; clear: none; font-size: 12px; white-space: pre; background-position: 0% 100%; background-repeat: repeat no-repeat; ">server {     server_name  wiki.apt-blog.net;     access_log  /var/log/nginx/wiki.apt-blog.net.access.log;     error_log   /var/log/nginx/wiki.apt-blog.net.error_log;     location / {         include uwsgi_params;         #uwsgi_pass 127.0.0.1:9096;         uwsgi_pass unix:///tmp/uswgi.sock;         uwsgi_param UWSGI_PYHOME /usr/local/lib/moinmoin;         uwsgi_param UWSGI_CHDIR /var/local/wiki-moinmoin/server;         uwsgi_param UWSGI_SCRIPT moin_wsgi;     }     location /moin_static193/ {         alias /usr/local/lib/moinmoin/lib/python2.6/site-packages/MoinMoin/web/static/htdocs/;     } }</pre></td></tr></tbody></table></div><p>完整配置指南：</p><div style="color: #110000; background-color: #f9f9f9; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; overflow-x: auto; overflow-y: hidden; width: 1468px; "><div style="vertical-align: top; padding-top: 2px; padding-right: 4px; padding-bottom: 2px; padding-left: 4px; "><pre style="font-family: monospace; line-height: 1.333; overflow-x: visible; overflow-y: visible; padding-bottom: 25px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; background-image: url(http://apt-blog.net/wp-content/themes/openark-blog/images/bg_pre_dots.png); width: auto; float: none; clear: none; font-size: 12px; white-space: pre; background-position: 0% 100%; background-repeat: repeat no-repeat; "><span style="color: #666666; font-style: italic; ">#安装</span> <span style="color: #c20cb9; font-weight: bold; ">sudo</span> <span style="color: #660033; ">-s</span> add-apt-repository ppa:nginx<span style="color: #000000; font-weight: bold; ">/</span>stable add-apt-repository ppa:uwsgi<span style="color: #000000; font-weight: bold; ">/</span>release <span style="color: #c20cb9; font-weight: bold; ">apt-get</span> update <span style="color: #c20cb9; font-weight: bold; ">apt-get</span> <span style="color: #c20cb9; font-weight: bold; ">install</span> nginx uwsgi-python python-virtualenv &nbsp; <span style="color: #666666; font-style: italic; ">#组件配置</span> <span style="color: #c20cb9; font-weight: bold; ">cat</span> <span style="color: #000000; font-weight: bold; ">&gt;/</span>etc<span style="color: #000000; font-weight: bold; ">/</span>uwsgi-python<span style="color: #000000; font-weight: bold; ">/</span>apps-enabled<span style="color: #000000; font-weight: bold; ">/</span>uwsgi.xml <span style="color: #cc0000; font-style: italic; ">&lt;&lt; EOF &lt;uwsgi&gt;   &lt;limit-as&gt;256&lt;/limit-as&gt;   &lt;processes&gt;6&lt;/processes&gt;   &lt;memory-report/&gt;   &lt;vhost/&gt;   &lt;no-site/&gt; &lt;/uwsgi&gt; EOF</span> &nbsp; <span style="color: #c20cb9; font-weight: bold; ">cat</span> <span style="color: #000000; font-weight: bold; ">&gt;/</span>etc<span style="color: #000000; font-weight: bold; ">/</span>nginx<span style="color: #000000; font-weight: bold; ">/</span>sites-enabled<span style="color: #000000; font-weight: bold; ">/</span>moinmoin <span style="color: #cc0000; font-style: italic; ">&lt;&lt; EOF server {     listen   80;     access_log  /var/log/nginx/wiki.access_log;     error_log   /var/log/nginx/wiki.error_log; &nbsp; client_max_body_size 64;     server_name wiki.mydomian.com;     location / {                 include uwsgi_params;                 uwsgi_pass unix:///var/run/uwsgi-python/uwsgi/socket;                 uwsgi_param UWSGI_PYHOME /var/www/moinmoin/python-home/;                 uwsgi_param UWSGI_CHDIR /var/www/moinmoin/;                 uwsgi_param UWSGI_SCRIPT moin_wsgi;                 uwsgi_param UWSGI_SCHEME $scheme;                 uwsgi_param REMOTE_USER $remote_user;         } } EOF</span> &nbsp; <span style="color: #666666; font-style: italic; ">#Python环境预备</span> <span style="color: #c20cb9; font-weight: bold; ">mkdir</span> <span style="color: #000000; font-weight: bold; ">/</span>var<span style="color: #000000; font-weight: bold; ">/</span>www<span style="color: #000000; font-weight: bold; ">/</span>moinmoin virtualenv <span style="color: #000000; font-weight: bold; ">/</span>var<span style="color: #000000; font-weight: bold; ">/</span>www<span style="color: #000000; font-weight: bold; ">/</span>moinmoin<span style="color: #000000; font-weight: bold; ">/</span>python-home <span style="color: #7a0874; font-weight: bold; ">cd</span> <span style="color: #000000; font-weight: bold; ">/</span>tmp <span style="color: #c20cb9; font-weight: bold; ">wget</span> http:<span style="color: #000000; font-weight: bold; ">//</span>static.moinmo.in<span style="color: #000000; font-weight: bold; ">/</span>files<span style="color: #000000; font-weight: bold; ">/</span>moin-1.9.3.tar.gz <span style="color: #c20cb9; font-weight: bold; ">tar</span> xvfz moin-1.9.3.tar.gz <span style="color: #7a0874; font-weight: bold; ">source</span> <span style="color: #000000; font-weight: bold; ">/</span>var<span style="color: #000000; font-weight: bold; ">/</span>www<span style="color: #000000; font-weight: bold; ">/</span>moinmoin<span style="color: #000000; font-weight: bold; ">/</span>python-env<span style="color: #000000; font-weight: bold; ">/</span>bin<span style="color: #000000; font-weight: bold; ">/</span>activate <span style="color: #7a0874; font-weight: bold; ">cd</span> <span style="color: #000000; font-weight: bold; ">/</span>tmp<span style="color: #000000; font-weight: bold; ">/</span>moin-1.9.3 python setup.py <span style="color: #c20cb9; font-weight: bold; ">install</span> deactivate &nbsp; <span style="color: #666666; font-style: italic; ">#MoinMoin环境</span> <span style="color: #c20cb9; font-weight: bold; ">cp</span> <span style="color: #660033; ">-r</span> <span style="color: #000000; font-weight: bold; ">/</span>tmp<span style="color: #000000; font-weight: bold; ">/</span>moin-1.9.3<span style="color: #000000; font-weight: bold; ">/</span>wiki <span style="color: #000000; font-weight: bold; ">/</span>var<span style="color: #000000; font-weight: bold; ">/</span>www<span style="color: #000000; font-weight: bold; ">/</span>moinmoin <span style="color: #7a0874; font-weight: bold; ">cd</span> <span style="color: #000000; font-weight: bold; ">/</span>var<span style="color: #000000; font-weight: bold; ">/</span>www<span style="color: #000000; font-weight: bold; ">/</span>moinmoin<span style="color: #000000; font-weight: bold; ">/</span>wiki <span style="color: #c20cb9; font-weight: bold; ">cp</span> config<span style="color: #000000; font-weight: bold; ">/</span>wikiconfig.py wikiconfig.py <span style="color: #c20cb9; font-weight: bold; ">cp</span> server<span style="color: #000000; font-weight: bold; ">/</span>moin.wsgi moin_wsgi.py <span style="color: #c20cb9; font-weight: bold; ">sed</span> <span style="color: #660033; ">-i</span> <span style="color: #ff0000; ">'/# a2)/isys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))'</span> &nbsp; <span style="color: #666666; font-style: italic; ">#可选</span> <span style="color: #c20cb9; font-weight: bold; ">rm</span> <span style="color: #660033; ">-rf</span> config server &nbsp; <span style="color: #666666; font-style: italic; ">#重启</span> <span style="color: #000000; font-weight: bold; ">/</span>etc<span style="color: #000000; font-weight: bold; ">/</span>init.d<span style="color: #000000; font-weight: bold; ">/</span>nginx restart <span style="color: #000000; font-weight: bold; ">/</span>etc<span style="color: #000000; font-weight: bold; ">/</span>init.d<span style="color: #000000; font-weight: bold; ">/</span>uwsgi-python restart</pre></div></div><p>&nbsp;</p></div><div><p>tags:&nbsp;<a href="http://apt-blog.net/tag/fastcgi" rel="tag" style="color: #f26522; text-decoration: none; ">fastcgi</a>,&nbsp;<a href="http://apt-blog.net/tag/moinmoin" rel="tag" style="color: #f26522; text-decoration: none; ">moinmoin</a>,&nbsp;<a href="http://apt-blog.net/tag/nginx" rel="tag" style="color: #f26522; text-decoration: none; ">nginx</a>,&nbsp;<a href="http://apt-blog.net/tag/python" rel="tag" style="color: #f26522; text-decoration: none; ">Python</a>,&nbsp;<a href="http://apt-blog.net/tag/uwgi" rel="tag" style="color: #f26522; text-decoration: none; ">uwgi</a>,&nbsp;<a href="http://apt-blog.net/tag/wiki" rel="tag" style="color: #f26522; text-decoration: none; ">wiki</a><br />posted in&nbsp;<a href="http://apt-blog.net/category/tech/programming/python-programming-tech" title="View all posts in Python" rel="category tag" style="color: #f26522; text-decoration: none; ">Python</a>,&nbsp;<a href="http://apt-blog.net/category/tech/unix_linux" title="View all posts in Unix/Linux" rel="category tag" style="color: #f26522; text-decoration: none; ">Unix/Linux</a>&nbsp;by BOYPT</p><p>Follow comments via the&nbsp;<a href="http://apt-blog.net/moinmoin-on-nginx-via-fastcgi-and-uwgi/feed" style="color: #f26522; text-decoration: none; ">RSS Feed</a>&nbsp;|&nbsp;<a href="http://apt-blog.net/moinmoin-on-nginx-via-fastcgi-and-uwgi#respond" style="color: #f26522; text-decoration: none; ">Leave a comment</a>&nbsp;|&nbsp;<a href="http://apt-blog.net/moinmoin-on-nginx-via-fastcgi-and-uwgi/trackback" style="color: #f26522; text-decoration: none; ">Trackback URL</a></p></div></span></div><img src ="http://www.blogjava.net/xiaomage234/aggbug/365792.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2011-12-07 17:47 <a href="http://www.blogjava.net/xiaomage234/archive/2011/12/07/365792.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>搭建python的web环境 Centos5.4+Nginx-0.8.50+UWSGI-0.9.6.2+Django-1.2.3搭建高性能WEB服务器环境平【转】</title><link>http://www.blogjava.net/xiaomage234/archive/2011/12/07/365784.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Wed, 07 Dec 2011 09:07:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2011/12/07/365784.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/365784.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2011/12/07/365784.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/365784.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/365784.html</trackback:ping><description><![CDATA[<div><span style="color: #333333; font-family: Arial; line-height: 26px; "><p>之前一直使用Nginx+Fastcgi来搭建python web服务器，本文介绍Nginx+UWSGI组合来实现。uWSGI 是一个快速的、纯C语言开发的、自维护的、对开发者友好的WSGI服务器，旨在提供专业的 Python web应用发布和开发。它更符合python web的标准协议，速度要比Fastcgi要快、性能更加稳定。<br />一、安装平台<br />1、安装pcre<br /><br />cd /home<br />mkdir -p /home/install/nginx &amp;&amp; cd /home/install/nginx<br />wget http://ftp.exim.llorien.org/pcre/pcre-8.00.tar.gz<br />tar -zxvf pcre-8.00.tar.gz<br />cd pcre-8.00<br />./configure<br />make &amp;&amp; make install<br />cd ..<br /><br /><br />2、安装Nginx<br /><br /><br />wget http://nginx.org/download/nginx-0.8.50.tar.gz<br />tar -zxvf nginx-0.8.50.tar.gz<br />cd nginx-0.8.50/<br />./configure --user=nobody --group=nobody --prefix=/usr/local/nginx --with-http_stub_status_module --with-cc-opt='-O3' --with-cpu-opt=opteron<br />make &amp;&amp; make install<br />cd ..<br /><br /><br />3、安装python&amp;Mysql-python<br /><br /><br />wget http://www.python.org/ftp/python/2.5.1/Python-2.5.1.tgz<br />tar -zxvf Python-2.5.1.tgz<br />cd Python-2.5.1<br />./configure &amp;&amp; make &amp;&amp; make install<br />echo "export PATH=/$PATH:/usr/local/bin" &gt;&gt; /etc/profile<br />source /etc/profile<br /><br /><br />4、安装MySql-python<br /><br /><br />cd ../<br />wget http://downloads.sourceforge.net/project/mysql-python/mysql-python/1.2.2/MySQL-python-1.2.2.tar.gz?r=&amp;ts=1285248455&amp;use_mirror=nchc<br />cd MySQL-python-1.2.2<br />python setup.py install<br /><br /><br />5、安装Django<br /><br /><br />wget http://www.djangoproject.com/download/1.2.3/tarball/<br />tar -zxvf Django-1.2.3.tar.gz<br />cd Django-1.2.3<br />python setup.py install<br />cd ..<br /><br /><br />6、安装uWSGI<br /><br /><br />wget http://projects.unbit.it/downloads/uwsgi-0.9.6.2.tar.gz<br />tar -zxvf uwsgi-0.9.6.2.tar.gz<br />cd uwsgi-0.9.6.2<br />make<br />cp uwsgi /usr/bin</p><p>二、平台配置<br />1、平台环境说明<br />&nbsp;&nbsp;1.1、项目位置：/opt/www/Purgesys<br />&nbsp;&nbsp; 创建项目方法：<br /><br /><br />cd /opt/www<br />django-admin.py startproject Purgesys<br /><br /><br />&nbsp;&nbsp;1.2、查看项目(出现以下文件结构说明项目已创建成功)<br />&nbsp;&nbsp;#tree Purgesys<br /><br /><br />Purgesys<br />|-- __init__.py<br />|-- manage.py<br />|-- settings.py<br />`-- urls.py<br /><br /><br />2、Nginx相关配置<br />#cd /usr/local/nginx/conf<br />#vi django_uwsgi.conf</p><div><br /># Django project<br />server {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listen&nbsp;&nbsp;80;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_name purgesys.domain.com;<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;location / {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uwsgi_pass&nbsp;&nbsp; 127.0.0.1:9000;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;include&nbsp;&nbsp;&nbsp;&nbsp; uwsgi_params;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;access_log&nbsp;&nbsp;off;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;location ^~ /static {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root&nbsp;&nbsp; /opt/www/Purgesys;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;location ^~ /admin/ {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uwsgi_pass&nbsp;&nbsp; 127.0.0.1:9000;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;include&nbsp;&nbsp;uwsgi_params;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;access_log&nbsp;&nbsp; off;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;location ~* ^.+/.(mpg|avi|mp3|swf|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|txt|tar|mid|midi|wav|rtf|mpeg)$ {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root&nbsp;&nbsp; /opt/www/Purgesys/static;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;access_log&nbsp;&nbsp; off;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><p><br /><br />*Nginx-0.8.50默认已添加uwsgi输出头支持<br /><strong>include uwsgi_params;</strong>&nbsp;<br />#vi nginx.conf<br />追加子配置文件django_uwsgi.conf</p><div><br />http{<br />........<br />include django_uwsgi.conf;<br />}</div><p><br />3、UWSGI配置<br />#mkdir -p /home/uwsgi;cd /home/uwsgi<br />#mkdir -p /opt/www/logs<br />#vi uwsgi.xml</p><div>&lt;uwsgi&gt;<br />&nbsp;&nbsp;&lt;socket&gt;127.0.0.1:9000&lt;/socket&gt;<br />&nbsp;&nbsp;&lt;listen&gt;200&lt;/listen&gt;<br />&nbsp;&nbsp;&lt;master&gt;true&lt;/master&gt;<br />&nbsp;&nbsp;&lt;pidfile&gt;/usr/local/nginx/uwsgi.pid&lt;/pidfile&gt;<br />&nbsp;&nbsp;&lt;processes&gt;8&lt;/processes&gt;<br />&nbsp;&nbsp;&lt;pythonpath&gt;/opt/www/Purgesys&lt;/pythonpath&gt;<br />&nbsp;&nbsp;&lt;pythonpath&gt;/opt/www/&lt;/pythonpath&gt;<br />&nbsp;&nbsp;&lt;module&gt;django_wsgi&lt;/module&gt;<br />&nbsp;&nbsp;&lt;profiler&gt;true&lt;/profiler&gt;<br />&nbsp;&nbsp;&lt;memory-report&gt;true&lt;/memory-report&gt;<br />&nbsp;&nbsp;&lt;enable-threads&gt;true&lt;/enable-threads&gt;<br />&nbsp;&nbsp;&lt;logdate&gt;true&lt;/logdate&gt;<br />&nbsp;&nbsp;&lt;limit-as&gt;6048&lt;/limit-as&gt;<br />&nbsp;&nbsp;&lt;daemonize&gt;/opt/www/logs/django.log&lt;/daemonize&gt;<br />&lt;/uwsgi&gt;</div><p><br />4、创建应用模块<br />cd /opt/www/Purgesys<br />vi django_wsgi.py</p><div><br />import os<br />os.environ['DJANGO_SETTINGS_MODULE'] = 'Purgesys.settings'<br />import django.core.handlers.wsgi<br />application = django.core.handlers.wsgi.WSGIHandler()</div><p><br />5、启动服务<br />#/usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml<br />#/usr/local/nginx/sbin/nginx<br /><br />6、查看进程<br />#[liuts@webserver nginx]# ps -ef|grep uwsgi|grep -v grep<br /><br />root&nbsp;&nbsp;&nbsp;&nbsp; 21652&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;0 17:12 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:00:00 /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml<br />root&nbsp;&nbsp;&nbsp;&nbsp; 21653 21652&nbsp;&nbsp;0 17:12 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:00:00 /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml<br />root&nbsp;&nbsp;&nbsp;&nbsp; 21654 21652&nbsp;&nbsp;0 17:12 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:00:00 /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml<br />root&nbsp;&nbsp;&nbsp;&nbsp; 21655 21652&nbsp;&nbsp;0 17:12 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:00:00 /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml<br />root&nbsp;&nbsp;&nbsp;&nbsp; 21656 21652&nbsp;&nbsp;0 17:12 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:00:00 /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml<br />root&nbsp;&nbsp;&nbsp;&nbsp; 21657 21652&nbsp;&nbsp;0 17:12 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:00:00 /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml<br />root&nbsp;&nbsp;&nbsp;&nbsp; 21658 21652&nbsp;&nbsp;0 17:12 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:00:00 /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml<br />root&nbsp;&nbsp;&nbsp;&nbsp; 21659 21652&nbsp;&nbsp;0 17:12 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:00:00 /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml<br />root&nbsp;&nbsp;&nbsp;&nbsp; 21660 21652&nbsp;&nbsp;0 17:12 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:00:00 /usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml<br /><br /><br />7、监听端口<br />#[liuts@webserver nginx]# netstat -an|grep 9000<br /><br />tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;127.0.0.1:9000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.0.0.0:*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LISTEN<br /><br /><br />8、访问测试<br />输入http://serverip/<br /><img src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/moz-screenshot-1.png" alt="" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; " />&nbsp;<img src="http://hi.csdn.net/attachment/201102/22/0_1298340100o8Ag.gif" alt="" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; " /><br />大功告成！<br /><br />*附uwsgi启动脚本<br />#cd /home/uwsgi<br />#vi uwsgiserver.sh</p><div><br />#!/bin/bash<br />if [ $1 = start ];then<br />&nbsp;&nbsp;psid=`ps aux|grep "uwsgi"|grep -v "grep"|wc -l`<br />&nbsp;&nbsp;if [ $psid -gt 2 ];then<br />&nbsp;&nbsp;&nbsp;&nbsp;echo "uwsgi is running!"<br />&nbsp;&nbsp;&nbsp;&nbsp;exit 0<br />&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;/usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml<br />&nbsp;&nbsp;fi<br />&nbsp;&nbsp;echo "Start uwsgi service [OK]"<br />elif [ $1 = stop ];then<br />&nbsp;&nbsp;killall -9 uwsgi<br />&nbsp;&nbsp;echo "Stop uwsgi service [OK]"<br />elif [ $1 = restart ];then<br />&nbsp;&nbsp;killall -9 uwsgi<br />&nbsp;&nbsp;/usr/bin/uwsgi -x /home/uwsgi/uwsgi.xml<br />&nbsp;&nbsp;echo "Restart uwsgi service [OK]"<br />else<br />&nbsp;&nbsp;echo "Usages: sh uwsgiserver.sh [start|stop|restart]"<br />fi</div><p><br />#sh uwsgiserver.sh start<br />[uWSGI] parsing config file /home/uwsgi/uwsgi.xml<br />Start uwsgi service [OK]</p></span></div><img src ="http://www.blogjava.net/xiaomage234/aggbug/365784.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2011-12-07 17:07 <a href="http://www.blogjava.net/xiaomage234/archive/2011/12/07/365784.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用 SQLAlchemy 下一代 Python 对象关系映射器 【转】</title><link>http://www.blogjava.net/xiaomage234/archive/2011/12/07/365771.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Wed, 07 Dec 2011 07:32:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2011/12/07/365771.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/365771.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2011/12/07/365771.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/365771.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/365771.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 简介对象关系映射器（Object Relational Mappers，ORM）在过去数年吸引了不少人的目光。主要原因是 ORM 经常会在 Web 应用程序框架中被提起，因为它是快速开发（Rapid Development）栈中的关键组件。Django 和 Ruby on Rails 等 Web 框架采用了设计一个独立栈的方法，将自主开发的 ORM 紧密集成到该框架中。而其他框架，如 Pylons...&nbsp;&nbsp;<a href='http://www.blogjava.net/xiaomage234/archive/2011/12/07/365771.html'>阅读全文</a><img src ="http://www.blogjava.net/xiaomage234/aggbug/365771.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2011-12-07 15:32 <a href="http://www.blogjava.net/xiaomage234/archive/2011/12/07/365771.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Nginx+perl的web框架（Npweb ）【转】</title><link>http://www.blogjava.net/xiaomage234/archive/2011/12/07/365764.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Wed, 07 Dec 2011 06:53:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2011/12/07/365764.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/365764.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2011/12/07/365764.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/365764.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/365764.html</trackback:ping><description><![CDATA[<div><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><strong style="font-weight: bold; ">简介：</strong><br />　　这是一套运行在nginx + perl环境下的的web框架，可以像java的servlet那样的写服务或简单网页。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><strong style="font-weight: bold; ">&nbsp;入门步骤：</strong></p><ol style="font-size: 1em; line-height: 1.4em; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.25em; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">安装nginx时增加perl模块参数，使nginx支持perl模块。</li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.25em; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">nginx.conf里配置一个perl的模块路径，配置npweb服务入口。</li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.25em; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">写一个helloworld，即完成了npweb的试用。</li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.25em; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">具体操作请看相关文章。</li></ol><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><strong style="font-weight: bold; ">&nbsp;适用业务：</strong></p><ol style="font-size: 1em; line-height: 1.4em; margin-top: 0px; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.25em; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">可以用来做memcache的web接口</li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.25em; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">可以用来做mysql数据库的web接口</li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.25em; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">可以用来做ajax数据接口</li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.25em; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">可以用来做xml接口</li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.25em; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">一切简单的高效的接口都可以用这个来开发&nbsp;</li></ol><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">----------------------------------------------------------------------------------------------------------------------</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><strong style="font-weight: bold; "><span style="font-size: small; "><span><span style="font-family: Cambria; ">Npweb</span>入门示例</span></span></strong></p><div><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size: small; "><span>如果按步骤来做并且不出问题，那么你将体验到<span style="font-family: Calibri; ">npweb</span>的乐趣。</span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 28px; "><span style="font-size: small; "><strong style="font-weight: bold; "><span>第一步：安装<span style="font-family: Calibri; ">nginx</span></span></strong><strong style="font-weight: bold; ">，以下是安装脚本，如果安装正常就进入第二步。</strong></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><table border="1" cellspacing="0" cellpadding="0" style="border-bottom-width: medium; border-bottom-style: none; border-bottom-color: initial; border-left-width: medium; border-left-style: none; border-left-color: initial; border-collapse: collapse; border-top-width: medium; border-top-style: none; border-top-color: initial; border-right-width: medium; border-right-style: none; border-right-color: initial; "><tbody><tr><td width="568" valign="top" style="font-size: 1em; border-bottom-color: black; border-bottom-width: 1pt; border-bottom-style: solid; border-left-color: black; border-left-width: 1pt; border-left-style: solid; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 426.1pt; padding-right: 5.4pt; border-top-color: black; border-top-width: 1pt; border-top-style: solid; border-right-color: black; border-right-width: 1pt; border-right-style: solid; padding-top: 0cm; "><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size: small; "><span><span style="font-family: Calibri; ">#&nbsp;</span>准备目录</span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; font-size: small; ">mkdir -p /opt/src/nginx</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; font-size: small; ">mkdir -p /opt/modules/nginx-0.7.65</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; font-size: small; ">cd /opt/src/nginx</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size: small; "><span><span style="font-family: Calibri; ">#&nbsp;</span>准备依赖包</span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; font-size: small; ">yum install gcc -y</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; font-size: small; ">yum install pcre-devel -y</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; font-size: small; ">yum install openssl-devel -y</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; font-size: small; ">yum install zlib-devel -y</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size: small; "><span><span style="font-family: Calibri; ">#&nbsp;</span>准备依赖程序</span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; font-size: small; ">wget http://github.com/gnosek/nginx-upstream-fair/tarball/master</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; font-size: small; ">tar -xzvf gnosek-nginx-upstream-fair-2131c73.tar.gz</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; font-size: small; ">mv gnosek-nginx-upstream-fair-2131c73 /opt/modules/</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size: small; "><span><span style="font-family: Calibri; ">#&nbsp;</span>下载<span style="font-family: Calibri; ">nginx</span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; font-size: small; ">wget http://nginx.org/download/nginx-0.7.65.tar.gz</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; font-size: small; ">tar -xzvf nginx-0.7.65.tar.gz</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; font-size: small; ">cd nginx-0.7.65</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size: small; "><span><span style="font-family: Calibri; ">#&nbsp;</span>配置</span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; font-size: small; ">./configure --prefix=/opt/modules/nginx-0.7.65 \</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--with-http_stub_status_module \</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--with-http_perl_module \</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--with-http_addition_module \</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--with-http_realip_module \</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--with-http_sub_module \</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--add-module=/opt/modules/gnosek-nginx-upstream-fair-2131c73</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size: small; "><span><span style="font-family: Calibri; ">#&nbsp;</span>安装</span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; font-size: small; ">make</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; font-size: small; ">make install</span></p></td></tr></tbody></table><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 28px; "><span style="font-size: small; "><strong style="font-weight: bold; "><span>第二步：部署<span style="font-family: Calibri; ">npweb</span></span></strong><strong style="font-weight: bold; ">框架</strong></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><span style="font-size: small; "><span><span style="font-family: Calibri; ">Npweb</span>框架非常简洁，只有一个文件（<span style="font-family: Calibri; ">Action.pm</span>），只要将这个文件置于一个能让<span style="font-family: Calibri; ">nginx</span>有权限访问内部文件的文件夹即可。</span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size: small; "><span><span><span style="font-family: Calibri; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span>这里我们将框架部署到<span style="font-family: Calibri; ">/opt/npweb</span>。</span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 28px; "><span style="font-size: small; "><strong style="font-weight: bold; "><span>第三步：编写<span style="font-family: Calibri; ">hello.pm</span></span></strong><strong style="font-weight: bold; ">，并将文件放置在<span style="font-family: Calibri; ">/opt/npweb_app</span></strong><strong style="font-weight: bold; ">目录下。</strong></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><span style="font-size: small; "><span><span style="font-family: Calibri; ">/opt/npweb_app</span>目录是你开发的<span style="font-family: Calibri; ">web</span>程序的目录，其中需要放置一个<span style="font-family: Calibri; ">lib</span>目录以保存自定义的一些<span style="font-family: Calibri; ">pm</span>模块，在示例中的<span style="font-family: Calibri; ">RequestUtil</span>就是其中的一个模块。</span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 28px; "><strong style="font-weight: bold; "><span style="font-size: small; ">文件内容如下：</span></strong></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><table border="1" cellspacing="0" cellpadding="0" style="border-bottom-width: medium; border-bottom-style: none; border-bottom-color: initial; border-left-width: medium; border-left-style: none; border-left-color: initial; border-collapse: collapse; border-top-width: medium; border-top-style: none; border-top-color: initial; border-right-width: medium; border-right-style: none; border-right-color: initial; "><tbody><tr><td width="568" valign="top" style="font-size: 1em; border-bottom-color: black; border-bottom-width: 1pt; border-bottom-style: solid; border-left-color: black; border-left-width: 1pt; border-left-style: solid; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 426.1pt; padding-right: 5.4pt; border-top-color: black; border-top-width: 1pt; border-top-style: solid; border-right-color: black; border-right-width: 1pt; border-right-style: solid; padding-top: 0cm; "><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size: small; "><span><span style="font-family: Calibri; ">package hello; #&nbsp;</span>此处很关键，一定要与文件名保持一致！！！！！！！！</span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size: small; "><span><span style="font-family: Calibri; ">use RequestUtil; #&nbsp;</span>此处引入了一个外部模块</span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; font-size: small; ">sub doExecute {</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;($r) = @_;</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$r-&gt;send_http_header("text/html");</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size: small; "><span><span style="font-family: Calibri; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;</span></span>取得参数的<span style="font-family: Calibri; ">&nbsp;Map------------------------------------------------------</span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my %param = RequestUtil::params( $r-&gt;args );</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size: small; "><span><span style="font-family: Calibri; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;</span></span>获得具体参数</span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $w = $param{'w'};</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size: small; "><span><span style="font-family: Calibri; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;</span></span>回显</span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$r-&gt;print("hellow " . $w);</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; font-size: small; ">}</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size: small; "><span><span style="font-family: Calibri; ">#&nbsp;</span>文件结尾必需加这个，<span style="font-family: Calibri; ">perl</span>语法规定的。</span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; font-size: small; ">1;</span></p></td></tr></tbody></table><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 28px; "><span style="font-size: small; "><strong style="font-weight: bold; "><span>第四步：配置<span style="font-family: Calibri; ">nginx.conf</span></span></strong><strong style="font-weight: bold; ">，这一步是很关键的，主要是将框架和<span style="font-family: Calibri; ">webapp</span></strong><strong style="font-weight: bold; ">配置到<span style="font-family: Calibri; ">nginx</span></strong><strong style="font-weight: bold; ">下，以达到访问功能的作用。</strong></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><table border="1" cellspacing="0" cellpadding="0" style="border-bottom-width: medium; border-bottom-style: none; border-bottom-color: initial; border-left-width: medium; border-left-style: none; border-left-color: initial; border-collapse: collapse; border-top-width: medium; border-top-style: none; border-top-color: initial; border-right-width: medium; border-right-style: none; border-right-color: initial; "><tbody><tr><td width="568" valign="top" style="font-size: 1em; border-bottom-color: black; border-bottom-width: 1pt; border-bottom-style: solid; border-left-color: black; border-left-width: 1pt; border-left-style: solid; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 426.1pt; padding-right: 5.4pt; border-top-color: black; border-top-width: 1pt; border-top-style: solid; border-right-color: black; border-right-width: 1pt; border-right-style: solid; padding-top: 0cm; "><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span style="font-size: small; ">#user<span>&nbsp;&nbsp;nobody;</span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span style="font-size: small; ">#worker_processes<span>&nbsp;&nbsp;1;</span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span style="font-size: small; ">worker_processes 2;</span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span style="font-size: small; ">#error_log<span>&nbsp;&nbsp;logs/error.log;</span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span style="font-size: small; ">#error_log<span>&nbsp;&nbsp;logs/error.log&nbsp;&nbsp;notice;</span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span style="font-size: small; ">#error_log<span>&nbsp;&nbsp;logs/error.log&nbsp;&nbsp;info;</span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span style="font-size: small; ">#pid<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logs/nginx.pid;</span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span style="font-size: small; ">worker_rlimit_nofile 65535;</span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span style="font-size: small; ">events {</span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;use epoll;</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;worker_connections 65535;</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span style="font-size: small; ">}</span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span style="font-size: small; ">http {</span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime.types;</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default_type&nbsp;&nbsp;application/octet-stream;</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_names_hash_bucket_size 128;</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client_header_buffer_size 32k;</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;large_client_header_buffers 4 32k;</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client_max_body_size 8m;</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#log_format&nbsp;&nbsp;main&nbsp;&nbsp;'$remote_addr - $remote_user [$time_local] "$request" '</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'$status $body_bytes_sent "$http_referer" '</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'"$http_user_agent" "$http_x_forwarded_for"';</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#access_log&nbsp;&nbsp;logs/access.log&nbsp;&nbsp;main;</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sendfile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;on;</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tcp_nopush&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;on;</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keepalive_timeout&nbsp;&nbsp;0;</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gzip on;</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gzip_min_length&nbsp;&nbsp;1k;</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gzip_buffers&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4 16k;</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gzip_http_version 1.0;</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gzip_comp_level 2;</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gzip_types&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text/plain application/x-javascript text/css application/xml;</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gzip_vary on;</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size: small; "><span><span style="font-family: Calibri; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;</span></span>此处开始配置</span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size: small; "><span><span style="font-family: Calibri; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perl_modules&nbsp;&nbsp;/opt/npweb; #</span></span>框架的目录</span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size: small; "><span><span style="font-family: Calibri; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perl_require&nbsp;&nbsp;Action.pm; #</span></span>框架的入口</span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server{</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size: small; "><span><span style="font-family: Calibri; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;</span></span>此处配置框架的设置</span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size: small; "><span><span style="font-family: Calibri; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set $CONTEXT_PATH '/perl'; # uri</span></span>的访问路径，如：<span style="font-family: Calibri; ">http:// test.perl.nginx /perl</span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size: small; "><span><span style="font-family: Calibri; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set $APPLICATION_PATH '/opt/npweb_app/'; # web</span></span>服务的路径，在该路径下需要放置一个<span style="font-family: Calibri; ">lib</span>目录，以放置一些自自定模块。</span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listen 80;</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_name test.perl.nginx;</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size: small; "><span><span style="font-family: Calibri; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;location /perl { #&nbsp;</span></span>此处需与<span style="font-family: Calibri; ">$CONTEXT_PATH</span>保持一致</span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size: small; "><span><span style="font-family: Calibri; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perl Action::execute; #&nbsp;</span></span>此处如此配置，不用更改</span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span><span style="font-size: small; "><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: Calibri; "><span style="font-size: small; ">}</span></span></p></td></tr></tbody></table><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 28px; "><span style="font-size: small; "><strong style="font-weight: bold; "><span>第五步：访问<a href="http://test.perl.nginx/perl/hello?w=world" style="color: #108ac6; text-decoration: underline; "><span style="font-family: Calibri; color: #0000ff; ">http://test.perl.nginx/perl/hello?w=world</span></a></span></strong><strong style="font-weight: bold; ">，如果网页上回显了您输入的参数，那么恭喜您，您的第一个<span style="font-family: Calibri; ">npweb</span></strong><strong style="font-weight: bold; ">程序成功了。</strong></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 28px; "><span style="font-size: small; ">针对第五步的补充：需要将test.perl.nginx指向你所部署的服务器IP。推荐使用Windows&nbsp;Hosts&nbsp;Editor。</span></p></div></span></div><img src ="http://www.blogjava.net/xiaomage234/aggbug/365764.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2011-12-07 14:53 <a href="http://www.blogjava.net/xiaomage234/archive/2011/12/07/365764.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>公司订餐系统的审核脚本-python [原创]</title><link>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285141.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 02 Jul 2009 04:44:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285141.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/285141.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285141.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/285141.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/285141.html</trackback:ping><description><![CDATA[<p>每次要手动审核别人的订餐，挺麻烦的，有时候忘记审核，有时候去审核别人还没点饭，刚好可以实践下 python.<br />
<br />
步骤:<br />
1,&nbsp; 登录获取待审核列表；<br />
2, 分析审核数据，进行审核操作。</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #008000">#</span><span style="color: #008000">!/usr/bin/env&nbsp;python</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />#</span><span style="color: #008000">&nbsp;-*-&nbsp;coding:&nbsp;gbk&nbsp;-*-</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />#</span><span style="color: #008000">Using&nbsp;GPL&nbsp;v2</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />#</span><span style="color: #008000">Author:&nbsp;xiaomage234@gmail.com</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />#</span><span style="color: #008000">Version:0.1</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;sys,re<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;urllib,urllib2<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;time&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;localtime,strftime<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;http_send(u,url,employee</span><span style="color: #000000">=</span><span style="color: #800000">''</span><span style="color: #000000">,order_id</span><span style="color: #000000">=</span><span style="color: #800000">''</span><span style="color: #000000">,query</span><span style="color: #000000">=</span><span style="color: #000000">1</span><span style="color: #000000">):<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;opener&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;urllib2.build_opener()<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;query&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">:<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;postdata&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;urllib.urlencode({</span><span style="color: #800000">"</span><span style="color: #800000">u</span><span style="color: #800000">"</span><span style="color: #000000">:u})<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">:<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;postdata&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;urllib.urlencode({</span><span style="color: #800000">"</span><span style="color: #800000">u</span><span style="color: #800000">"</span><span style="color: #000000">:u,</span><span style="color: #800000">"</span><span style="color: #800000">employee</span><span style="color: #800000">"</span><span style="color: #000000">:employee,</span><span style="color: #800000">"</span><span style="color: #800000">order_id</span><span style="color: #800000">"</span><span style="color: #000000">:order_id,</span><span style="color: #800000">"</span><span style="color: #800000">audit</span><span style="color: #800000">"</span><span style="color: #000000">:</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #800000">"</span><span style="color: #800000">reason</span><span style="color: #800000">"</span><span style="color: #000000">:</span><span style="color: #800000">""</span><span style="color: #000000">})<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;request&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;urllib2.Request(url,postdata)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;body&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;opener.open(request).read()<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;opener.close()<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;body<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;gettime():<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;date&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;strftime(</span><span style="color: #800000">"</span><span style="color: #800000">%Y-%m-%d&nbsp;%H:%M:%S</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;localtime())<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;date<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;main(argv</span><span style="color: #000000">=</span><span style="color: #000000">None):<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;auditor&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">username</span><span style="color: #800000">"</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;url&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">http://192.168.14.27/cgi-bin/cgi_audit_login</span><span style="color: #800000">"</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">#</span><span style="color: #008000">url&nbsp;=&nbsp;"http://mage.xunlei.com/ret.html"</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;patt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">'</span><span style="color: #800000">javascript:operation\((.*?)\)</span><span style="color: #800000">'</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;http_send(auditor,url)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;match&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;re.search(patt,ret,re.S</span><span style="color: #000000">|</span><span style="color: #000000">re.M)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;match:<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;match.group(</span><span style="color: #000000">1</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">:<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">print</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">'</span><span style="color: #800000">%s:no&nbsp;data&nbsp;to&nbsp;audit!</span><span style="color: #800000">'</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">&nbsp;gettime()<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sys.exit()<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">print</span><span style="color: #000000">&nbsp;data<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;arrays&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;data.split(</span><span style="color: #800000">'</span><span style="color: #800000">,</span><span style="color: #800000">'</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;employee&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;arrays[</span><span style="color: #000000">1</span><span style="color: #000000">]<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;employee&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;employee.replace(</span><span style="color: #800000">"</span><span style="color: #800000">'</span><span style="color: #800000">"</span><span style="color: #000000">,</span><span style="color: #800000">""</span><span style="color: #000000">).strip()<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">#</span><span style="color: #008000">print&nbsp;employee</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;order_id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;arrays[</span><span style="color: #000000">2</span><span style="color: #000000">]<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;order_id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;order_id.replace(</span><span style="color: #800000">"</span><span style="color: #800000">'</span><span style="color: #800000">"</span><span style="color: #000000">,</span><span style="color: #800000">""</span><span style="color: #000000">).strip()<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">#</span><span style="color: #008000">print&nbsp;order_id</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;url2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">http://192.168.14.27/cgi-bin/cgi_audit</span><span style="color: #800000">"</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;http_send(auditor,url2,employee,order_id,0)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">print</span><span style="color: #000000">&nbsp;gettime()<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">print</span><span style="color: #000000">&nbsp;result<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">__name__</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">__main__</span><span style="color: #800000">"</span><span style="color: #000000">:<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;sys.exit(main())<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<img src ="http://www.blogjava.net/xiaomage234/aggbug/285141.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2009-07-02 12:44 <a href="http://www.blogjava.net/xiaomage234/archive/2009/07/02/285141.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python 遍历目录 walk 方法</title><link>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285140.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 02 Jul 2009 04:38:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285140.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/285140.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285140.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/285140.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/285140.html</trackback:ping><description><![CDATA[<span style="font-size: 9.5pt"><span style="font-size: x-small">&nbsp;
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: baseline; text-indent: 21pt; line-height: 16pt; text-align: justify"><span style="font-size: 10pt">os模块提供的walk方法很强大，能够把给定的目录下的所有目录和文件遍历出来。</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10pt">方法：os.walk(path),遍历path，返回一个对象，他的每个部分都是一个三元组,('目录x'，[目录x下的目录list]，目录x下面的文件) 具体代码如下：<br />
</span></p>
</span></span><br />
import os<br />
import sys<br />
def walk_dir(dir,fileinfo,topdown=True):<br />
&nbsp;&nbsp;&nbsp; for root, dirs, files in os.walk(dir, topdown):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for name in files:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print(os.path.join(name))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileinfo.write(os.path.join(root,name) + '\n')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file = open(os.path.join(root,name),"r") #读出第一行<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print file.readline();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for name in dirs:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print(os.path.join(name))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileinfo.write(' ' + os.path.join(root,name) + '\n')<br />
<span style="font-size: 9.5pt"><span><span style="font-size: x-small"><span style="font-size: 10pt"><br />
topdown决定遍历的顺序，如果topdown为True，则先列举top下的目录，然后是目录的目录，依次类推，反之，则先递归列举出最深层的子目录，然后是其兄弟目录，然后子目录。</span></span></span></span><br />
dir = raw_input('please input the path:')<br />
fileinfo = open('list.txt','w')<br />
walk_dir(dir,fileinfo)
<img src ="http://www.blogjava.net/xiaomage234/aggbug/285140.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2009-07-02 12:38 <a href="http://www.blogjava.net/xiaomage234/archive/2009/07/02/285140.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>微线程---Stackless Python</title><link>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285139.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 02 Jul 2009 04:36:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285139.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/285139.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285139.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/285139.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/285139.html</trackback:ping><description><![CDATA[概述
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1）使用Stackless Python, 一定要先安装。软件下载网址： <a href="http://www.stackless.com/">www.stackless.com</a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2）stackless模块的tasklet对象</p>
<p>&gt;&gt;&gt; import stackless<br />
&gt;&gt;&gt; def show():<br />
print 'Stackless Python'</p>
<p><br />
&gt;&gt;&gt; st = stackless.tasklet(show)()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #调用tasklet添加函数，第二个括号为函数参数<br />
&gt;&gt;&gt; st.run()<br />
Stackless Python<br />
&gt;&gt;&gt; st = stackless.tasklet(show)()<br />
&gt;&gt;&gt; st.alive&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #显示线程状态<br />
True<br />
&gt;&gt;&gt; st.kill<br />
&lt;built-in method kill of tasklet object at 0x00D2B830&gt;<br />
&gt;&gt;&gt; st.kill()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #杀掉线程<br />
&gt;&gt;&gt; st.alive<br />
False<br />
&gt;&gt;&gt; st = stackless.tasklet(show)()<br />
&gt;&gt;&gt; st.alive<br />
True<br />
&gt;&gt;&gt; st.run()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #线程运行完，也同样显示false<br />
Stackless Python<br />
&gt;&gt;&gt; st.alive<br />
False<br />
&gt;&gt;&gt; st = stackless.tasklet(show)()<br />
&gt;&gt;&gt; stackless.tasklet(show)()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #直接调用tasklet<br />
&lt;stackless.tasklet object at 0x00D19770&gt;<br />
&gt;&gt;&gt; stackless.tasklet(show)()<br />
&lt;stackless.tasklet object at 0x00D2B8B0&gt;<br />
&gt;&gt;&gt; stackless.run()<br />
Stackless Python<br />
Stackless Python<br />
Stackless Python<br />
&gt;&gt;&gt; <br />
&gt;&gt;&gt;</p>
<p>3. 模块中的schedule对象<br />
&gt;&gt;&gt; def show():<br />
stackless.schedule()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #使用schedule控制任务顺序<br />
print 1<br />
stackless.schedule()<br />
print 2</p>
<p><br />
&gt;&gt;&gt; stackless.tasklet(show)()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #调用tasklet，生成任务列表<br />
&lt;stackless.tasklet object at 0x00D190B0&gt;<br />
&gt;&gt;&gt; stackless.tasklet(show)()<br />
&lt;stackless.tasklet object at 0x00D2B8B0&gt;<br />
&gt;&gt;&gt; stackless.run()<br />
1<br />
1<br />
2<br />
2<br />
&gt;&gt;&gt; def show():&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #Remove schedule<br />
print 1<br />
print 2</p>
<p><br />
&gt;&gt;&gt; stackless.tasklet(show)()<br />
&lt;stackless.tasklet object at 0x00D19770&gt;<br />
&gt;&gt;&gt; stackless.tasklet(show)()<br />
&lt;stackless.tasklet object at 0x00D2B8B0&gt;<br />
&gt;&gt;&gt; stackless.run()<br />
1<br />
2<br />
1<br />
2<br />
&gt;&gt;&gt; <br />
&gt;&gt;&gt; <br />
&gt;&gt;&gt; <br />
4. channel 对象<br />
&gt;&gt;&gt; chn = stackless.channel()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #生成chn对象<br />
&gt;&gt;&gt; def send():<br />
chn.send('Stackless Python')<br />
print "I send: Stackless Python"</p>
<p><br />
&gt;&gt;&gt; def rec():<br />
print 'I receive:', chn.receive()</p>
<p><br />
&gt;&gt;&gt; stackless.tasklet(send)()<br />
&lt;stackless.tasklet object at 0x00D19770&gt;<br />
&gt;&gt;&gt; stackless.tasklet(rec)()<br />
&lt;stackless.tasklet object at 0x01498330&gt;<br />
&gt;&gt;&gt; stackless.run()<br />
I receive: Stackless Python<br />
I send: Stackless Python<br />
&gt;&gt;&gt;</p>
<p>&nbsp;</p>
<p>9.4.2&nbsp;&nbsp; 使用微线程</p>
<p># -*- coding:utf-8 -*-<br />
# file: MP_MC.py<br />
#<br />
import stackless<br />
import time<br />
import Queue<br />
def Producer(i):<br />
&nbsp;&nbsp;&nbsp; global queue<br />
&nbsp;&nbsp;&nbsp; queue.put(i)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #想队列添加数据<br />
&nbsp;&nbsp;&nbsp; print 'Producer', i, 'add', i<br />
&nbsp;&nbsp;&nbsp; <br />
def Consumer():<br />
&nbsp;&nbsp;&nbsp; global queue<br />
&nbsp;&nbsp;&nbsp; i = queue.get()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #从队列中取出数据<br />
&nbsp;&nbsp;&nbsp; print 'Consumer', i, 'get', i<br />
&nbsp;&nbsp;&nbsp; <br />
queue = Queue.Queue()&nbsp;&nbsp;&nbsp;&nbsp; #生成队列对象<br />
for i in range(10):<br />
&nbsp;&nbsp;&nbsp; stackless.tasklet(Producer)(i)<br />
for i in range(10):<br />
&nbsp;&nbsp;&nbsp; stackless.tasklet(Consumer)()<br />
&nbsp;&nbsp;&nbsp; <br />
stackless.run()</p>
<img src ="http://www.blogjava.net/xiaomage234/aggbug/285139.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2009-07-02 12:36 <a href="http://www.blogjava.net/xiaomage234/archive/2009/07/02/285139.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文件和目录 --- python</title><link>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285138.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 02 Jul 2009 04:35:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285138.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/285138.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285138.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/285138.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/285138.html</trackback:ping><description><![CDATA[文件目录常用函数
<p>&gt;&gt;&gt; import os<br />
&gt;&gt;&gt; print 'current dir is ', os.getcwd()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #获得当前目录<br />
current dir is C:\Python25<br />
&gt;&gt;&gt; os.listdir(os.getcwd())&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #获得当前目录下的文件<br />
['python-2.5.msi', 'Sys32_BackUp', 'w9xpopen.exe', 'README.txt', 'NEWS.txt', 'LICENSE.txt', 'python.exe', 'pythonw.exe', 'Lib', 'DLLs', 'include', 'libs', 'tcl', 'Tools', 'Doc', 'msvcr71.dll', 'python.exe.manifest', 'pythonw.exe.manifest', 'Scripts', 'py2exe-wininst.log', 'Removepy2exe.exe']<br />
<br />
&gt;&gt;&gt; os.mkdir('J:\\temp')&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #创建文件夹<br />
&gt;&gt;&gt; os.rmdir('J:\\temp')&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #删除文件夹<br />
&gt;&gt;&gt; os.path.isdir('J:\\vc')&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #判断是否为文件夹<br />
True<br />
&gt;&gt;&gt; os.path.isfile('J:\\vc')&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #判断是否为文件<br />
False<br />
&gt;&gt;&gt;</p>
<p>10.2.2 批量重命名</p>
<p>#!/usr/bin/env python<br />
#coding=utf-8<br />
import os<br />
perfix = 'python'<br />
length = 2<br />
base = 1<br />
format = 'mdb'<br />
# 函数PadLeft将文件名补全到指定长度<br />
# Str为要补全的字符<br />
# num为要达到的长度<br />
# padstr为达到长度说添加的字符<br />
def PadLeft(str, num, padstr):<br />
&nbsp;&nbsp;&nbsp; stringlength = len(str)<br />
&nbsp;&nbsp;&nbsp; n = num - stringlength<br />
&nbsp;&nbsp;&nbsp; if n &gt;= 0:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str = padstr*n + str<br />
&nbsp;&nbsp;&nbsp; return str</p>
<p># 为避免误操作，先提示用户<br />
print 'The file in %s will be renamed' % os.getcmd()<br />
input = raw_input('press y to continue\n')<br />
if input != 'y':<br />
&nbsp;&nbsp;&nbsp; exit()<br />
filenames = os.listdir(os.curdir)<br />
# 从基数减-1， 为了使下边i=i+1在第一次执行时等于基数<br />
i = base - 1<br />
for filename in filenames:<br />
&nbsp;&nbsp;&nbsp; i = i+1<br />
&nbsp;&nbsp;&nbsp; # 判断当前路劲是否为文件，并且不是"rename.py"<br />
&nbsp;&nbsp;&nbsp; if filename != 'rename.py' and os.path.isfile(filename):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name = str(i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name = PadLeft(name, length, '0')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t = filename.split('.')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m = len(t)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if format == '':<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os.rename(filename, prefix+name+'.'+t[m-1])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if t[m-1] == format:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os.rename(filename, prefix+name+'.'+t[m-1])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i = i - 1&nbsp;&nbsp;&nbsp;&nbsp; #保证i连接<br />
&nbsp;&nbsp;&nbsp; else:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i = i - 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #保证i连接</p>
<p>10.2.3 代码框生成器</p>
<p>#!/usr/bin/env python<br />
#coding=utf-8<br />
#file: MakeCode.py<br />
import os<br />
import sys<br />
import string<br />
import datetime<br />
# python 脚本模版<br />
py = '''#------------------------------------------------------------<br />
# TO:<br />
#------------------------------------------------------------<br />
# BY:<br />
#------------------------------------------------------------<br />
'''<br />
# C模版<br />
c = '''*------------------------------------------------------------<br />
* TO:<br />
*------------------------------------------------------------<br />
* BY:<br />
*------------------------------------------------------------<br />
'''<br />
if os.path.isfile(sys.argv[1]):<br />
&nbsp;&nbsp;&nbsp; print '%s already exist!' % sys.argv[1]<br />
&nbsp;&nbsp;&nbsp; sys.exit()<br />
file = open(sys.argv[1], 'w')<br />
today = datetime.date.today()<br />
date = today.strftime('%Y')+'-'+today.strftime('%m')+'-'+today.strftime('%d')<br />
filetypes = string.split(sys.argv[1], '.')<br />
length = len(filetypes)<br />
filetype = filetypes[length - 1]<br />
if filetype == 'py':<br />
&nbsp;&nbsp;&nbsp; print 'use python mode'<br />
&nbsp;&nbsp;&nbsp; file.writelines('# -*- coding:utf-8 -*-')<br />
&nbsp;&nbsp;&nbsp; file.write('\n')<br />
&nbsp;&nbsp;&nbsp; file.writelines('# File: ' + sys.argv[1])<br />
&nbsp;&nbsp;&nbsp; file.write('\n')<br />
&nbsp;&nbsp;&nbsp; file.write(py)<br />
&nbsp;&nbsp;&nbsp; file.write('# Date: ' + date)<br />
&nbsp;&nbsp;&nbsp; file.write('\n')<br />
&nbsp;&nbsp;&nbsp; file.write('#------------------------------------------------------------')<br />
elif filetype == 'c' or filetype == 'cpp':<br />
&nbsp;&nbsp;&nbsp; print 'use c mode'<br />
&nbsp;&nbsp;&nbsp; file.writelines('/*')<br />
&nbsp;&nbsp;&nbsp; file.write('\n')<br />
&nbsp;&nbsp;&nbsp; file.writelines('*------------------------------------------------------------')<br />
&nbsp;&nbsp;&nbsp; file.write('\n')<br />
&nbsp;&nbsp;&nbsp; file.writelines(' * File: ' + sys.argv[1])<br />
&nbsp;&nbsp;&nbsp; file.write('\n')<br />
&nbsp;&nbsp;&nbsp; file.write(c)<br />
&nbsp;&nbsp;&nbsp; file.write(' * Date: ' + date)<br />
&nbsp;&nbsp;&nbsp; file.write('\n')<br />
&nbsp;&nbsp;&nbsp; file.write('*------------------------------------------------------------')<br />
&nbsp;&nbsp;&nbsp; file.write('\n')<br />
&nbsp;&nbsp;&nbsp; file.write(' */ \n')<br />
else:<br />
&nbsp;&nbsp;&nbsp; print 'just create %s' % sys.argv[1]<br />
file.close()</p>
<p>&nbsp;</p>
<p>10.2.4 遍历文件夹中的内容：</p>
<p>&gt;&gt;&gt; import os<br />
&gt;&gt;&gt; for file in os.walk('E:\\TEST'):<br />
... print file<br />
... <br />
('E:\\TEST', ['Folder'], ['AMK0824-PSG_GeminiScripts.xls', 'AMK0824.xls', 'CVS_110906-----PSG_GeminiScripts.xls', 'merlin--9CV--S-2009-140-CTUA--00.00.00------CVS_110906-PSG_GeminiScripts.xls', 'merlin--9CV--S-2009-140-CTUA--00.00.00------CVS_110906.xls'])<br />
('E:\\TEST\\Folder', [], ['1.txt', '2.txt'])<br />
#返回值为一个三元元组，第一个为待遍历的路径，类型为字符串；第二个为该路径中的文件夹，类型为list；第三个为该路径中的文件，类型为list。</p>
<img src ="http://www.blogjava.net/xiaomage234/aggbug/285138.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2009-07-02 12:35 <a href="http://www.blogjava.net/xiaomage234/archive/2009/07/02/285138.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网页最简单的下载（python）</title><link>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285136.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 02 Jul 2009 04:33:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285136.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/285136.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285136.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/285136.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/285136.html</trackback:ping><description><![CDATA[import urllib<br />
webfile = urllib.urlopen("http://i.chinaren.com/feed/index.jsp").read()<br />
fp = file('rhf.html', 'a+')<br />
#fp = open('rhf.html', 'a+')<br />
fp.write(webfile)<br />
fp.close()
<img src ="http://www.blogjava.net/xiaomage234/aggbug/285136.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2009-07-02 12:33 <a href="http://www.blogjava.net/xiaomage234/archive/2009/07/02/285136.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python多线程</title><link>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285134.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 02 Jul 2009 04:31:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285134.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/285134.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285134.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/285134.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/285134.html</trackback:ping><description><![CDATA[<p><font size="3"><strong>p</strong>ython的并行开发有两种方式：fork和thread（线程）。thread比fork更轻量级，具有更好运行效率和可移植性，在需要进行并行操作的场合首推thread。</font></p>
<p><font size="3">python标准库内置一个thread模块，该模块提供一个轻便简易的多线程编程接口，可以无需任何修改就能够运行在Win、Solaris、Linux等操作系统上。浏览一下thread模块：</font></p>
<p><font size="3">import thread<br />
dir(thread)</font></p>
<p><font size="3">看到</font></p>
<p><font size="3">['LockType', '__doc__', '__name__', '_local', 'allocate', 'allocate_lock', 'error', 'exit', 'exit_thread', 'get_ident', 'interrupt_main', 'stack_size', 'start_new', 'start_new_thread']</font></p>
<p><font size="3">创建线程是我们的首要任务，我们将要用到的是start_new和start_new_thread方法，我们推荐start_new_thread，因为start_new已经是陈旧的版本。下面的代码展示了如何创建线程：</font></p>
<p><font size="3">import thread<br />
def childthread(threadid):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print 'I am child thread',threadid<br />
def parentthread():<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while 1:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i+=1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; thread.start_new_thread(childthread,(i,))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if raw_input()=='q':break<br />
parentthread()</font></p>
<p><font size="3">运行该程序会看到如下效果：</font></p>
<p><font size="3">I am child thread 1<br />
<br />
I am child thread 2<br />
<br />
I am child thread 3<br />
q</font></p>
<p><font size="3">每次按下回车，屏幕上就会出现一行来自start_new_thread所创建的线程的信息，知道我们输入q按回车为止。</font></p>
<p><font size="3">可见thread模块通过start_new_thread给我们提供一个基于函数的线程创建接口。 start_new_thread方法有两个参数，第一个参数是我们预定义的函数(这里是childthread)，也就是我们想要创建的线程体；第二个 参数是一个tuple（元组），罗列线程体的函数的所有参数，为什么要用一个tuple呢？python很具灵活性，因为不管线程体有多少个参数，通过一 个tuple我们就可以传递足够的参数，这里我么传递一个(i,)的tuple，表示只有一个参数。</font></p>
<img src ="http://www.blogjava.net/xiaomage234/aggbug/285134.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2009-07-02 12:31 <a href="http://www.blogjava.net/xiaomage234/archive/2009/07/02/285134.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>断点续传原理[转]</title><link>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285133.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 02 Jul 2009 04:29:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285133.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/285133.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285133.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/285133.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/285133.html</trackback:ping><description><![CDATA[所谓"断点续传"，顾名思义，断点续传就是在上一次下载时断开的位置开始继续下载。<br />
在HTTP协议中，可以在请求报文头中加入Range段，来表示客户机希望从何处继续下载。<br />
<p>　　比如说从第1024字节开始下载，请求报文如下：</p>
<table width="100%" bgcolor="#ffffff">
    <tbody>
        <tr>
            <td>GET /image/index_r4_c1.jpg HTTP/1.1<br />
            Accept: */*<br />
            Referer: http://192.168.3.120:8080<br />
            Accept-Language: zh-cn<br />
            Accept-Encoding: gzip, deflate<br />
            User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.0.3705)<br />
            Host: 192.168.3.120:8080<br />
            <span style="color: rgb(255,0,0)">Range:bytes=1024-</span><br />
            Connection: Keep-Alive</td>
        </tr>
    </tbody>
</table>
<br />
这样就可以从1024字节后下载
<img src ="http://www.blogjava.net/xiaomage234/aggbug/285133.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2009-07-02 12:29 <a href="http://www.blogjava.net/xiaomage234/archive/2009/07/02/285133.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>simple Socket connection --- python</title><link>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285132.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 02 Jul 2009 04:26:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285132.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/285132.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285132.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/285132.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/285132.html</trackback:ping><description><![CDATA[<p>建立server：</p>
<p>#!/usr/bin/env python<br />
#coding=utf-8<br />
#File: SimServer.py<br />
#<br />
import socket<br />
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)<br />
server.bind(('', 1051)) <br />
server.listen(5)<br />
client, addr = server.accept()<br />
#print ("Got connected from Ip = %s " % addr)<br />
print "Got connected from Ip", addr<br />
data = client.recv(1024)<br />
print ("Got data = %s" % data)<br />
client.send('I GOT: %s' % data)<br />
server.close()</p>
<p>建立client：</p>
<p>#!/usr/bin/env python<br />
#coding=utf-8<br />
#File: SimClient.py<br />
#<br />
import socket<br />
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)<br />
try:<br />
&nbsp;&nbsp; client.connect(('192.168.1.3', 1051)) <br />
except:<br />
&nbsp;&nbsp; (ErrorType, ErrorValue, ErrorTB) = sys.exc_info()<br />
&nbsp;&nbsp; print "Connect server failed: ", ErrorValue<br />
&nbsp;&nbsp; <br />
client.send('hello')<br />
data = client.recv(512)<br />
print ("Got data = %s" % data)<br />
client.close()</p>
<img src ="http://www.blogjava.net/xiaomage234/aggbug/285132.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2009-07-02 12:26 <a href="http://www.blogjava.net/xiaomage234/archive/2009/07/02/285132.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python tips: 什么是*args和**kwargs？</title><link>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285131.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 02 Jul 2009 04:25:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285131.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/285131.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285131.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/285131.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/285131.html</trackback:ping><description><![CDATA[<p>先来看个例子：</p>
<pre><span style="color: #0000ff">def</span> foo(*args, **kwargs):
<span style="color: #0000ff">print</span> 'args = ', args
<span style="color: #0000ff">print</span> 'kwargs = ', kwargs
<span style="color: #0000ff">print</span> '---------------------------------------'
<span style="color: #0000ff">if</span> __name__ == '<span style="color: #0000ff">__main__</span>':
foo(1,2,3,4)
foo(a=1,b=2,c=3)
foo(1,2,3,4, a=1,b=2,c=3)
foo('a', 1, None, a=1, b='2', c=3)</pre>
<pre>输出结果如下：</pre>
<p>args = (1, 2, 3, 4) <br />
kwargs = {} <br />
--------------------------------------- <br />
args = () <br />
kwargs = {'a': 1, 'c': 3, 'b': 2} <br />
--------------------------------------- <br />
args = (1, 2, 3, 4) <br />
kwargs = {'a': 1, 'c': 3, 'b': 2} <br />
--------------------------------------- <br />
args = ('a', 1, None) <br />
kwargs = {'a': 1, 'c': 3, 'b': '2'} <br />
---------------------------------------</p>
<p>可以看到，这两个是python中的可变参数。*args表示任何多个无名参数，它是一个tuple；**kwargs表示关键字参数，它是一个dict。并且同时使用*args和**kwargs时，必须*args参数列要在**kwargs前，像foo(a=1, b='2', c=3, a', 1, None, )这样调用的话，会提示语法错误&#8220;SyntaxError: non-keyword arg after keyword arg&#8221;。</p>
<p>&nbsp;</p>
<p>呵呵，知道*args和**kwargs是什么了吧。还有一个很漂亮的用法，就是创建字典：</p>
<pre><span style="color: #0000ff">def</span> kw_dict(**kwargs):
<span style="color: #0000ff">return</span> kwargs
<span style="color: #0000ff">print</span> kw_dict(a=1,b=2,c=3) == {'a':1, 'b':2, 'c':3}</pre>
<p>其实python中就带有dict类，使用dict(a=1,b=2,c=3)即可创建一个字典了。</p>
<p>&nbsp;</p>
<p>&#8220;人生苦短，我用python。&#8221;</p>
<img src ="http://www.blogjava.net/xiaomage234/aggbug/285131.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2009-07-02 12:25 <a href="http://www.blogjava.net/xiaomage234/archive/2009/07/02/285131.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python正则表达式(转）</title><link>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285130.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 02 Jul 2009 04:24:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285130.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/285130.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2009/07/02/285130.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/285130.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/285130.html</trackback:ping><description><![CDATA[<p>首先，运行 Python 解释器，导入 re 模块并编译一个 RE：</p>
<p>&nbsp;</p>
<pre>#!python<br />
Python 2.2.2 (#1, Feb 10 2003, 12:57:01)<br />
&gt;&gt;&gt; import re<br />
&gt;&gt;&gt; p = re.compile('[a-z]+')<br />
&gt;&gt;&gt; p<br />
&lt;_sre.SRE_Pattern object at 80c3c28&gt;</pre>
<p>现在，你可以试着用 RE 的 [a-z]+ 去匹配不同的字符串。一个空字符串将根本不能匹配，因为 + 的意思是 &#8220;一个或更多的重复次数&#8221;。 在这种情况下 match() 将返回 None，因为它使解释器没有输出。你可以明确地打印出 match() 的结果来弄清这一点。</p>
<pre>#!python<br />
&gt;&gt;&gt; p.match("")<br />
&gt;&gt;&gt; print p.match("")<br />
None</pre>
<p>现在，让我们试着用它来匹配一个字符串，如 "tempo"。这时，match() 将返回一个 MatchObject。因此你可以将结果保存在变量里以便后面使用。</p>
<pre>#!python<br />
&gt;&gt;&gt; m = p.match( 'tempo')<br />
&gt;&gt;&gt; print m<br />
&lt;_sre.SRE_Match object at 80c4f68&gt;</pre>
<p>现在你可以查询 `MatchObject` 关于匹配字符串的相关信息了。MatchObject 实例也有几个方法和属性；最重要的那些如下所示：</p>
<table cellspacing="0" border="1">
    <tbody>
        <tr>
            <td>方法/属性</td>
            <td>作用</td>
        </tr>
        <tr>
            <td>group()</td>
            <td>返回被 RE 匹配的字符串</td>
        </tr>
        <tr>
            <td>start()</td>
            <td>返回匹配开始的位置</td>
        </tr>
        <tr>
            <td>end()</td>
            <td>返回匹配结束的位置</td>
        </tr>
        <tr>
            <td>span()</td>
            <td>返回一个元组包含匹配 (开始,结束) 的位置</td>
        </tr>
    </tbody>
</table>
<p><br />
试试这些方法不久就会清楚它们的作用了：</p>
<pre>#!python<br />
&gt;&gt;&gt; m.group()<br />
'tempo'<br />
&gt;&gt;&gt; m.start(), m.end()<br />
(0, 5)<br />
&gt;&gt;&gt; m.span()<br />
(0, 5)</pre>
<p>group() 返回 RE 匹配的子串。start() 和 end() 返回匹配开始和结束时的索引。span() 则用单个元组把开始和结束时的索引一起返回。因为匹配方法检查到如果 RE 在字符串开始处开始匹配，那么 start() 将总是为零。然而， `RegexObject` 实例的 search 方法扫描下面的字符串的话，在这种情况下，匹配开始的位置就也许不是零了。</p>
<pre>#!python<br />
&gt;&gt;&gt; print p.match('::: message')<br />
None<br />
&gt;&gt;&gt; m = p.search('::: message') ; print m<br />
&lt;re.MatchObject instance at 80c9650&gt;<br />
&gt;&gt;&gt; m.group()<br />
'message'<br />
&gt;&gt;&gt; m.span()<br />
(4, 11)</pre>
<p>在实际程序中，最常见的作法是将 `MatchObject` 保存在一个变量里，然后检查它是否为 None，通常如下所示：</p>
<pre>#!python<br />
p = re.compile( ... )<br />
m = p.match( 'string goes here' )<br />
if m:<br />
print 'Match found: ', m.group()<br />
else:<br />
print 'No match'</pre>
<p>两个 `RegexObject` 方法返回所有匹配模式的子串。findall()返回一个匹配字符串行表：</p>
<pre>#!python<br />
&gt;&gt;&gt; p = re.compile('\d+')<br />
&gt;&gt;&gt; p.findall('12 drummers drumming, 11 pipers piping, 10 lords a-leaping')<br />
['12', '11', '10']</pre>
<p>findall() 在它返回结果时不得不创建一个列表。在 Python 2.2中，也可以用 finditer() 方法。</p>
<pre>#!python<br />
&gt;&gt;&gt; iterator = p.finditer('12 drummers drumming, 11 ... 10 ...')<br />
&gt;&gt;&gt; iterator<br />
&lt;callable-iterator object at 0x401833ac&gt;<br />
&gt;&gt;&gt; for match in iterator:<br />
...     print match.span()<br />
...<br />
(0, 2)<br />
(22, 24)<br />
(29, 31)</pre>
<a name=".E6.A8.A1.E5.9D.97.E7.BA.A7.E5.87.BD.E6.95.B0"></a>
<h4><span class="mw-headline">模块级函数 </span></h4>
<p>你不一定要产生一个 `RegexObject` 对象然后再调用它的方法；re 模块也提供了顶级函数调用如 match()、search()、sub() 等等。这些函数使用 RE 字符串作为第一个参数，而后面的参数则与相应 `RegexObject` 的方法参数相同，返回则要么是 None 要么就是一个 `MatchObject` 的实例。</p>
<pre>#!python<br />
&gt;&gt;&gt; print re.match(r'From\s+', 'Fromage amk')<br />
None<br />
&gt;&gt;&gt; re.match(r'From\s+', 'From amk Thu May 14 19:12:10 1998')<br />
&lt;re.MatchObject instance at 80c5978&gt;</pre>
<p>Under the hood, 这些函数简单地产生一个 RegexOject 并在其上调用相应的方法。它们也在缓存里保存编译后的对象，因此在将来调用用到相同 RE 时就会更快。</p>
<p><br />
你将使用这些模块级函数，还是先得到一个 `RegexObject` 再调用它的方法呢？如何选择依赖于怎样用 RE 更有效率以及你个人编码风格。如果一个 RE 在代码中只做用一次的话，那么模块级函数也许更方便。如果程序包含很多的正则表达式，或在多处复用同一个的话，那么将全部定义放在一起，在一段代码中提前 编译所有的 REs 更有用。从标准库中看一个例子，这是从 xmllib.py 文件中提取出来的：</p>
<pre>#!python<br />
ref = re.compile( ... )<br />
entityref = re.compile( ... )<br />
charref = re.compile( ... )<br />
starttagopen = re.compile( ... )</pre>
<p>我通常更喜欢使用编译对象，甚至它只用一次，but few people will be as much of a purist about this as I am。</p>
<a name=".E7.BC.96.E8.AF.91.E6.A0.87.E5.BF.97"></a>
<h4><span class="mw-headline">编译标志 </span></h4>
<p>编译标志让你可以修改正则表达式的一些运行方式。在 re 模块中标志可以使用两个名字，一个是全名如 IGNORECASE，一个是缩写，一字母形式如 I。（如果你熟悉 Perl 的模式修改，一字母形式使用同样的字母；例如 re.VERBOSE的缩写形式是 re.X。）多个标志可以通过按位 OR-ing 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志：</p>
<p><br />
这有个可用标志表，对每个标志后面都有详细的说明。</p>
<table cellspacing="0" border="1">
    <tbody>
        <tr>
            <td>标志</td>
            <td>含义</td>
        </tr>
        <tr>
            <td>DOTALL, S</td>
            <td>使 . 匹配包括换行在内的所有字符</td>
        </tr>
        <tr>
            <td>IGNORECASE, I</td>
            <td>使匹配对大小写不敏感</td>
        </tr>
        <tr>
            <td>LOCALE, L</td>
            <td>做本地化识别（locale-aware）匹配</td>
        </tr>
        <tr>
            <td>MULTILINE, M</td>
            <td>多行匹配，影响 ^ 和 $</td>
        </tr>
        <tr>
            <td>VERBOSE, X</td>
            <td>能够使用 REs 的 verbose 状态，使之被组织得更清晰易懂</td>
        </tr>
    </tbody>
</table>
<p><strong>I</strong><br />
<strong>IGNORECASE</strong></p>
<p>使匹配对大小写不敏感；字符类和字符串匹配字母时忽略大小写。举个例子，[A-Z]也可以匹配小写字母，Spam 可以匹配 "Spam", "spam", 或 "spAM"。这个小写字母并不考虑当前位置。</p>
<p><strong>L</strong><br />
<strong>LOCALE</strong></p>
<p>影响 \w, \W, \b, 和 \B，这取决于当前的本地化设置。</p>
<p>locales 是 C 语言库中的一项功能，是用来为需要考虑不同语言的编程提供帮助的。举个例子，如果你正在处理法文文本，你想用 \w+ 来匹配文字，但 \w 只匹配字符类 [A-Za-z]；它并不能匹配 "&#233;" 或 "&#231;"。如果你的系统配置适当且本地化设置为法语，那么内部的 C 函数将告诉程序 "&#233;" 也应该被认为是一个字母。当在编译正则表达式时使用 LOCALE 标志会得到用这些 C 函数来处理 \w 后的编译对象；这会更慢，但也会象你希望的那样可以用 \w+ 来匹配法文文本。</p>
<p><strong>M</strong><br />
<strong>MULTILINE</strong></p>
<p><br />
(此时 ^ 和 $ 不会被解释; 它们将在 4.1 节被介绍.)</p>
<p><br />
使用 "^" 只匹配字符串的开始，而 $ 则只匹配字符串的结尾和直接在换行前（如果有的话）的字符串结尾。当本标志指定后， "^" 匹配字符串的开始和字符串中每行的开始。同样的， $ 元字符匹配字符串结尾和字符串中每行的结尾（直接在每个换行之前）。</p>
<p><strong>S</strong><br />
<strong>DOTALL</strong></p>
<p>使 "." 特殊字符完全匹配任何字符，包括换行；没有这个标志， "." 匹配除了换行外的任何字符。</p>
<p><strong>X</strong><br />
<strong>VERBOSE</strong></p>
<p><br />
该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。当该标志被指定时，在 RE 字符串中的空白符被忽略，除非该空白符在字符类中或在反斜杠之后；这可以让你更清晰地组织和缩进 RE。它也可以允许你将注释写入 RE，这些注释会被引擎忽略；注释用 "#"号 来标识，不过该符号不能在字符串或反斜杠之后。</p>
<p><br />
举个例子，这里有一个使用 re.VERBOSE 的 RE；看看读它轻松了多少？</p>
<pre>#!python<br />
charref = re.compile(r"""<br />
&amp;[[]]       # Start of a numeric entity reference<br />
(<br />
[0-9]+[^0-9]      # Decimal form<br />
| 0[0-7]+[^0-7]   # Octal form<br />
| x[0-9a-fA-F]+[^0-9a-fA-F] # Hexadecimal form<br />
)<br />
""", re.VERBOSE)</pre>
<p>没有 verbose 设置， RE 会看起来象这样：</p>
<pre>#!python<br />
charref = re.compile("&#([0-9]+[^0-9]"<br />
"|0[0-7]+[^0-7]"<br />
"|x[0-9a-fA-F]+[^0-9a-fA-F])")</pre>
<p>在上面的例子里，Python 的字符串自动连接可以用来将 RE 分成更小的部分，但它比用 re.VERBOSE 标志时更难懂。</p>
<a name=".E6.9B.B4.E5.A4.9A.E6.A8.A1.E5.BC.8F.E5.8A.9F.E8.83.BD"></a>
<h3><span class="mw-headline">更多模式功能 </span></h3>
<p>到目前为止，我们只展示了正则表达式的一部分功能。在本节，我们将展示一些新的元字符和如何使用组来检索被匹配的文本部分。</p>
<p>&nbsp;</p>
<a name=".E6.9B.B4.E5.A4.9A.E7.9A.84.E5.85.83.E5.AD.97.E7.AC.A6"></a>
<h4><span class="mw-headline">更多的元字符 </span></h4>
<p>还有一些我们还没展示的元字符，其中的大部分将在本节展示。</p>
<p><br />
剩下来要讨论的一部分元字符是零宽界定符（zero-width assertions）。它们并不会使引擎在处理字符串时更快;相反，它们根本就没有对应任何字符，只是简单的成功或失败。举个例子， \b 是一个在单词边界定位当前位置的界定符（assertions），这个位置根本就不会被 \b 改变。这意味着零宽界定符（zero-width assertions）将永远不会被重复，因为如果它们在给定位置匹配一次，那么它们很明显可以被匹配无数次。</p>
<p><strong>|</strong></p>
<p><br />
可选项，或者 "or" 操作符。如果 A 和 B 是正则表达式，A|B 将匹配任何匹配了 "A" 或 "B" 的字符串。| 的优先级非常低，是为了当你有多字符串要选择时能适当地运行。Crow|Servo 将匹配"Crow" 或 "Servo", 而不是 "Cro", 一个 "w" 或 一个 "S", 和 "ervo"。</p>
<p><br />
为了匹配字母 "|"，可以用 \|，或将其包含在字符类中，如[|]。</p>
<p><strong>^</strong></p>
<p><br />
匹配行首。除非设置 MULTILINE 标志，它只是匹配字符串的开始。在 MULTILINE 模式里，它也可以直接匹配字符串中的每个换行。</p>
<p><br />
例如，如果你只希望匹配在行首单词 "From"，那么 RE 将用 ^From。</p>
<pre>#!python<br />
&gt;&gt;&gt; print re.search('^From', 'From Here to Eternity')<br />
&lt;re.MatchObject instance at 80c1520&gt;<br />
&gt;&gt;&gt; print re.search('^From', 'Reciting From Memory')<br />
None</pre>
<p><strong>$</strong></p>
<p><br />
匹配行尾，行尾被定义为要么是字符串尾，要么是一个换行字符后面的任何位置。</p>
<pre>#!python<br />
&gt;&gt;&gt; print re.search('}$', '{block}')<br />
&lt;re.MatchObject instance at 80adfa8&gt;<br />
&gt;&gt;&gt; print re.search('}$', '{block} ')<br />
None<br />
&gt;&gt;&gt; print re.search('}$', '{block}\n')<br />
&lt;re.MatchObject instance at 80adfa8&gt;</pre>
<p>匹配一个 "$"，使用 \$ 或将其包含在字符类中，如[$]。</p>
<p><strong>\A</strong></p>
<p><br />
只匹配字符串首。当不在 MULTILINE 模式，\A 和 ^ 实际上是一样的。然而，在 MULTILINE 模式里它们是不同的；\A 只是匹配字符串首，而 ^ 还可以匹配在换行符之后字符串的任何位置。</p>
<p><strong>\Z</strong></p>
<p>Matches only at the end of the string. <br />
只匹配字符串尾。</p>
<p><strong>\b</strong></p>
<p>单词边界。这是个零宽界定符（zero-width assertions）只用以匹配单词的词首和词尾。单词被定义为一个字母数字序列，因此词尾就是用空白符或非字母数字符来标示的。</p>
<p><br />
下面的例子只匹配 "class" 整个单词；而当它被包含在其他单词中时不匹配。</p>
<pre>#!python<br />
&gt;&gt;&gt; p = re.compile(r'\bclass\b')<br />
&gt;&gt;&gt; print p.search('no class at all')<br />
&lt;re.MatchObject instance at 80c8f28&gt;<br />
&gt;&gt;&gt; print p.search('the declassified algorithm')<br />
None<br />
&gt;&gt;&gt; print p.search('one subclass is')<br />
None</pre>
<p>当用这个特殊序列时你应该记住这里有两个微妙之处。第一个是 Python 字符串和正则表达式之间最糟的冲突。在 Python 字符串里，"\b" 是反斜杠字符，ASCII值是8。如果你没有使用 raw 字符串时，那么 Python 将会把 "\b" 转换成一个回退符，你的 RE 将无法象你希望的那样匹配它了。下面的例子看起来和我们前面的 RE 一样，但在 RE 字符串前少了一个 "r" 。</p>
<pre>#!python<br />
&gt;&gt;&gt; p = re.compile('\bclass\b')<br />
&gt;&gt;&gt; print p.search('no class at all')<br />
None<br />
&gt;&gt;&gt; print p.search('\b' + 'class' + '\b')<br />
&lt;re.MatchObject instance at 80c3ee0&gt;</pre>
<p>第二个在字符类中，这个限定符（assertion）不起作用，\b 表示回退符，以便与 Python 字符串兼容。</p>
<p><strong>\B</strong></p>
<p><br />
另一个零宽界定符（zero-width assertions），它正好同 \b 相反，只在当前位置不在单词边界时匹配。</p>
<a name=".E5.88.86.E7.BB.84"></a>
<h4><span class="mw-headline">分组 </span></h4>
<p>你经常需要得到比 RE 是否匹配还要多的信息。正则表达式常常用来分析字符串，编写一个 RE 匹配感兴趣的部分并将其分成几个小组。举个例子，一个 RFC-822 的头部用 ":" 隔成一个头部名和一个值，这就可以通过编写一个正则表达式匹配整个头部，用一组匹配头部名，另一组匹配头部值的方式来处理。</p>
<p><br />
组是通过 "(" 和 ")" 元字符来标识的。 "(" 和 ")" 有很多在数学表达式中相同的意思；它们一起把在它们里面的表达式组成一组。举个例子，你可以用重复限制符，象 *, +, ?, 和 {m,n}，来重复组里的内容，比如说(ab)* 将匹配零或更多个重复的 "ab"。</p>
<pre>#!python<br />
&gt;&gt;&gt; p = re.compile('(ab)*')<br />
&gt;&gt;&gt; print p.match('ababababab').span()<br />
(0, 10)</pre>
<p>组用 "(" 和 ")" 来指定，并且得到它们匹配文本的开始和结尾索引；这就可以通过一个参数用 group()、start()、end() 和 span() 来进行检索。组是从 0 开始计数的。组 0 总是存在；它就是整个 RE，所以 `MatchObject` 的方法都把组 0 作为它们缺省的参数。稍后我们将看到怎样表达不能得到它们所匹配文本的 span。</p>
<pre>#!python<br />
&gt;&gt;&gt; p = re.compile('(a)b')<br />
&gt;&gt;&gt; m = p.match('ab')<br />
&gt;&gt;&gt; m.group()<br />
'ab'<br />
&gt;&gt;&gt; m.group(0)<br />
'ab'</pre>
<p>小组是从左向右计数的，从1开始。组可以被嵌套。计数的数值可以能过从左到右计算打开的括号数来确定。</p>
<pre>#!python<br />
&gt;&gt;&gt; p = re.compile('(a(b)c)d')<br />
&gt;&gt;&gt; m = p.match('abcd')<br />
&gt;&gt;&gt; m.group(0)<br />
'abcd'<br />
&gt;&gt;&gt; m.group(1)<br />
'abc'<br />
&gt;&gt;&gt; m.group(2)<br />
'b'</pre>
<p>group() 可以一次输入多个组号，在这种情况下它将返回一个包含那些组所对应值的元组。</p>
<pre>#!python<br />
&gt;&gt;&gt; m.group(2,1,2)<br />
('b', 'abc', 'b')</pre>
<p>The groups() 方法返回一个包含所有小组字符串的元组，从 1 到 所含的小组号。</p>
<pre>#!python<br />
&gt;&gt;&gt; m.groups()<br />
('abc', 'b')</pre>
<p>模式中的逆向引用允许你指定先前捕获组的内容，该组也必须在字符串当前位置被找到。举个例子，如果组 1 的内容能够在当前位置找到的话，\1 就成功否则失败。记住 Python 字符串也是用反斜杠加数据来允许字符串中包含任意字符的，所以当在 RE 中使用逆向引用时确保使用 raw 字符串。</p>
<p><br />
例如，下面的 RE 在一个字符串中找到成双的词。</p>
<pre>#!python<br />
&gt;&gt;&gt; p = re.compile(r'(\b\w+)\s+\1')<br />
&gt;&gt;&gt; p.search('Paris in the the spring').group()<br />
'the the'</pre>
<p>象这样只是搜索一个字符串的逆向引用并不常见 -- 用这种方式重复数据的文本格式并不多见 -- 但你不久就可以发现它们用在字符串替换上非常有用。</p>
<a name=".E6.97.A0.E6.8D.95.E8.8E.B7.E7.BB.84.E5.92.8C.E5.91.BD.E5.90.8D.E7.BB.84"></a>
<h4><span class="mw-headline">无捕获组和命名组 </span></h4>
<p>精心设计的 REs 也许会用很多组，既可以捕获感兴趣的子串，又可以分组和结构化 RE 本身。在复杂的 REs 里，追踪组号变得困难。有两个功能可以对这个问题有所帮助。它们也都使用正则表达式扩展的通用语法，因此我们来看看第一个。</p>
<p><br />
Perl 5 对标准正则表达式增加了几个附加功能，Python 的 re 模块也支持其中的大部分。选择一个新的单按键元字符或一个以 "\" 开始的特殊序列来表示新的功能，而又不会使 Perl 正则表达式与标准正则表达式产生混乱是有难度的。如果你选择 "&amp;" 做为新的元字符，举个例子，老的表达式认为 "&amp;" 是一个正常的字符，而不会在使用 \&amp; 或 [&amp;] 时也不会转义。</p>
<p><br />
Perl 开发人员的解决方法是使用 (?...) 来做为扩展语法。"?" 在括号后面会直接导致一个语法错误，因为 "?" 没有任何字符可以重复，因此它不会产生任何兼容问题。紧随 "?" 之后的字符指出扩展的用途，因此 (?=foo)</p>
<p><br />
Python 新增了一个扩展语法到 Perl 扩展语法中。如果在问号后的第一个字符是 "P"，你就可以知道它是针对 Python 的扩展。目前有两个这样的扩展: (?P&lt;name&gt;...) 定义一个命名组，(?P=name) 则是对命名组的逆向引用。如果 Perl 5 的未来版本使用不同的语法增加了相同的功能，那么 re 模块也将改变以支持新的语法，这是为了兼容性的目的而保持的 Python 专用语法。</p>
<p><br />
现在我们看一下普通的扩展语法，我们回过头来简化在复杂 REs 中使用组运行的特性。因为组是从左到右编号的，而且一个复杂的表达式也许会使用许多组，它可以使跟踪当前组号变得困难，而修改如此复杂的 RE 是十分麻烦的。在开始时插入一个新组，你可以改变它之后的每个组号。</p>
<p><br />
首先，有时你想用一个组去收集正则表达式的一部分，但又对组的内容不感兴趣。你可以用一个无捕获组: (?:...) 来实现这项功能，这样你可以在括号中发送任何其他正则表达式。</p>
<pre>#!python<br />
&gt;&gt;&gt; m = re.match("([abc])+", "abc")<br />
&gt;&gt;&gt; m.groups()<br />
('c',)<br />
&gt;&gt;&gt; m = re.match("(?:[abc])+", "abc")<br />
&gt;&gt;&gt; m.groups()<br />
()</pre>
<p>除了捕获匹配组的内容之外，无捕获组与捕获组表现完全一样；你可以在其中放置任何字符，可以用重复元字符如 "*" 来重复它，可以在其他组（无捕获组与捕获组）中嵌套它。(?:...) 对于修改已有组尤其有用，因为你可以不用改变所有其他组号的情况下添加一个新组。捕获组和无捕获组在搜索效率方面也没什么不同，没有哪一个比另一个更快。</p>
<p><br />
其次，更重要和强大的是命名组；与用数字指定组不同的是，它可以用名字来指定。</p>
<p><br />
命令组的语法是 Python 专用扩展之一： (?P&lt;name&gt;...)。名字很明显是组的名字。除了该组有个名字之外，命名组也同捕获组是相同的。`MatchObject` 的方法处理捕获组时接受的要么是表示组号的整数，要么是包含组名的字符串。命名组也可以是数字，所以你可以通过两种方式来得到一个组的信息：</p>
<pre>#!python<br />
&gt;&gt;&gt; p = re.compile(r'(?P&lt;word&gt;\b\w+\b)')<br />
&gt;&gt;&gt; m = p.search( '(((( Lots of punctuation )))' )<br />
&gt;&gt;&gt; m.group('word')<br />
'Lots'<br />
&gt;&gt;&gt; m.group(1)<br />
'Lots'</pre>
<p>命名组是便于使用的，因为它可以让你使用容易记住的名字来代替不得不记住的数字。这里有一个来自 imaplib 模块的 RE 示例：</p>
<pre>#!python<br />
InternalDate = re.compile(r'INTERNALDATE "'<br />
r'(?P&lt;day&gt;[ 123][0-9])-(?P&lt;mon&gt;[A-Z][a-z][a-z])-'<br />
r'(?P&lt;year&gt;[0-9][0-9][0-9][0-9])'<br />
r' (?P&lt;hour&gt;[0-9][0-9]):(?P&lt;min&gt;[0-9][0-9]):(?P&lt;sec&gt;[0-9][0-9])'<br />
r' (?P&lt;zonen&gt;[-+])(?P&lt;zoneh&gt;[0-9][0-9])(?P&lt;zonem&gt;[0-9][0-9])'<br />
r'"')</pre>
<p>很明显，得到 m.group('zonem') 要比记住得到组 9 要容易得多。</p>
<p><br />
因为逆向引用的语法，象 (...)\1 这样的表达式所表示的是组号，这时用组名代替组号自然会有差别。还有一个 Python 扩展：(?P=name) ，它可以使叫 name 的组内容再次在当前位置发现。正则表达式为了找到重复的单词，(\b\w+)\s+\1 也可以被写成 (?P&lt;word&gt;\b\w+)\s+(?P=word)：</p>
<pre>#!python<br />
&gt;&gt;&gt; p = re.compile(r'(?P&lt;word&gt;\b\w+)\s+(?P=word)')<br />
&gt;&gt;&gt; p.search('Paris in the the spring').group()<br />
'the the'</pre>
<a name=".E5.89.8D.E5.90.91.E7.95.8C.E5.AE.9A.E7.AC.A6"></a>
<h4><span class="mw-headline">前向界定符 </span></h4>
<p>另一个零宽界定符（zero-width assertion）是前向界定符。前向界定符包括前向肯定界定符和后向肯定界定符，所下所示：</p>
<p><strong>(?=...)</strong></p>
<p>前向肯定界定符。如果所含正则表达式，以 ... 表示，在当前位置成功匹配时成功，否则失败。但一旦所含表达式已经尝试，匹配引擎根本没有提高；模式的剩馀部分还要尝试界定符的右边。</p>
<p><strong>(?!...)</strong></p>
<p>前向否定界定符。与肯定界定符相反；当所含表达式不能在字符串当前位置匹配时成功</p>
<p><br />
通过示范在哪前向可以成功有助于具体实现。考虑一个简单的模式用于匹配一个文件名，并将其通过 "." 分成基本名和扩展名两部分。如在 "news.rc" 中，"news" 是基本名，"rc" 是文件的扩展名。</p>
<p><br />
匹配模式非常简单：</p>
<pre>.*[.].*$</pre>
<p>注意 "." 需要特殊对待，因为它是一个元字符；我把它放在一个字符类中。另外注意后面的 $; 添加这个是为了确保字符串所有的剩馀部分必须被包含在扩展名中。这个正则表达式匹配 "foo.bar"、"autoexec.bat"、 "sendmail.cf" 和 "printers.conf"。</p>
<p><br />
现在，考虑把问题变得复杂点；如果你想匹配的扩展名不是 "bat" 的文件名？一些不正确的尝试：</p>
<pre>.*[.][^b].*$</pre>
<p>上面的第一次去除 "bat" 的尝试是要求扩展名的第一个字符不是 "b"。这是错误的，因为该模式也不能匹配 "foo.bar"。</p>
<pre>.*[.]([^b]..|.[^a].|..[^t])$</pre>
<p>当你试着修补第一个解决方法而要求匹配下列情况之一时表达式更乱了：扩展名的第一个字符不是 "b"; 第二个字符不是 "a"；或第三个字符不是 "t"。这样可以接受 "foo.bar" 而拒绝 "autoexec.bat"，但这要求只能是三个字符的扩展名而不接受两个字符的扩展名如 "sendmail.cf"。我们将在努力修补它时再次把该模式变得复杂。</p>
<pre>.*[.]([^b].?.?|.[^a]?.?|..?[^t]?)$</pre>
<p>在第三次尝试中，第二和第三个字母都变成可选，为的是允许匹配比三个字符更短的扩展名，如 "sendmail.cf"。</p>
<p><br />
该模式现在变得非常复杂，这使它很难读懂。更糟的是，如果问题变化了，你想扩展名不是 "bat" 和 "exe"，该模式甚至会变得更复杂和混乱。</p>
<p><br />
前向否定把所有这些裁剪成：</p>
<pre>.*[.](?!bat$).*$</pre>
<p>前向的意思：如果表达式 bat 在这里没有匹配，尝试模式的其馀部分；如果 bat$ 匹配，整个模式将失败。后面的 $ 被要求是为了确保象 "sample.batch" 这样扩展名以 "bat" 开头的会被允许。</p>
<p><br />
将另一个文件扩展名排除在外现在也容易；简单地将其做为可选项放在界定符中。下面的这个模式将以 "bat" 或 "exe" 结尾的文件名排除在外。</p>
<pre>.*[.](?!bat$|exe$).*$</pre>
<a name=".E4.BF.AE.E6.94.B9.E5.AD.97.E7.AC.A6.E4.B8.B2"></a>
<h3><span class="mw-headline">修改字符串 </span></h3>
<p>到目前为止，我们简单地搜索了一个静态字符串。正则表达式通常也用不同的方式，通过下面的 `RegexObject` 方法，来修改字符串。</p>
<table cellspacing="0" border="1">
    <tbody>
        <tr>
            <td>方法/属性</td>
            <td>作用</td>
        </tr>
        <tr>
            <td>split()</td>
            <td>将字符串在 RE 匹配的地方分片并生成一个列表，</td>
        </tr>
        <tr>
            <td>sub()</td>
            <td>找到 RE 匹配的所有子串，并将其用一个不同的字符串替换</td>
        </tr>
        <tr>
            <td>subn()</td>
            <td>与 sub() 相同，但返回新的字符串和替换次数</td>
        </tr>
    </tbody>
</table>
<a name=".E5.B0.86.E5.AD.97.E7.AC.A6.E4.B8.B2.E5.88.86.E7.89.87"></a>
<h4><span class="mw-headline">将字符串分片 </span></h4>
<p>`RegexObject` 的 split() 方法在 RE 匹配的地方将字符串分片，将返回列表。它同字符串的 split() 方法相似但提供更多的定界符；split()只支持空白符和固定字符串。就象你预料的那样，也有一个模块级的 re.split() 函数。</p>
<pre>split(string [, maxsplit = 0])</pre>
<p>通过正则表达式将字符串分片。如果捕获括号在 RE 中使用，那么它们的内容也会作为结果列表的一部分返回。如果 maxsplit 非零，那么最多只能分出 maxsplit 个分片。</p>
<p><br />
你可以通过设置 maxsplit 值来限制分片数。当 maxsplit 非零时，最多只能有 maxsplit 个分片，字符串的其馀部分被做为列表的最后部分返回。在下面的例子中，定界符可以是非数字字母字符的任意序列。</p>
<pre>#!python<br />
&gt;&gt;&gt; p = re.compile(r'\W+')<br />
&gt;&gt;&gt; p.split('This is a test, short and sweet, of split().')<br />
['This', 'is', 'a', 'test', 'short', 'and', 'sweet', 'of', 'split', '']<br />
&gt;&gt;&gt; p.split('This is a test, short and sweet, of split().', 3)<br />
['This', 'is', 'a', 'test, short and sweet, of split().']</pre>
<p>有时，你不仅对定界符之间的文本感兴趣，也需要知道定界符是什么。如果捕获括号在 RE 中使用，那么它们的值也会当作列表的一部分返回。比较下面的调用：</p>
<pre>#!python<br />
&gt;&gt;&gt; p = re.compile(r'\W+')<br />
&gt;&gt;&gt; p2 = re.compile(r'(\W+)')<br />
&gt;&gt;&gt; p.split('This... is a test.')<br />
['This', 'is', 'a', 'test', '']<br />
&gt;&gt;&gt; p2.split('This... is a test.')<br />
['This', '... ', 'is', ' ', 'a', ' ', 'test', '.', '']</pre>
<p>模块级函数 re.split() 将 RE 作为第一个参数，其他一样。</p>
<pre>#!python<br />
&gt;&gt;&gt; re.split('[\W]+', 'Words, words, words.')<br />
['Words', 'words', 'words', '']<br />
&gt;&gt;&gt; re.split('([\W]+)', 'Words, words, words.')<br />
['Words', ', ', 'words', ', ', 'words', '.', '']<br />
&gt;&gt;&gt; re.split('[\W]+', 'Words, words, words.', 1)<br />
['Words', 'words, words.']</pre>
<a name=".E6.90.9C.E7.B4.A2.E5.92.8C.E6.9B.BF.E6.8D.A2"></a>
<h4><span class="mw-headline">搜索和替换 </span></h4>
<p>其他常见的用途就是找到所有模式匹配的字符串并用不同的字符串来替换它们。sub() 方法提供一个替换值，可以是字符串或一个函数，和一个要被处理的字符串。</p>
<pre>sub(replacement, string[, count = 0])</pre>
<p>返回的字符串是在字符串中用 RE 最左边不重复的匹配来替换。如果模式没有发现，字符将被没有改变地返回。</p>
<p><br />
可选参数 count 是模式匹配后替换的最大次数；count 必须是非负整数。缺省值是 0 表示替换所有的匹配。</p>
<p><br />
这里有个使用 sub() 方法的简单例子。它用单词 "colour" 替换颜色名。</p>
<pre>#!python<br />
&gt;&gt;&gt; p = re.compile( '(blue|white|red)')<br />
&gt;&gt;&gt; p.sub( 'colour', 'blue socks and red shoes')<br />
'colour socks and colour shoes'<br />
&gt;&gt;&gt; p.sub( 'colour', 'blue socks and red shoes', count=1)<br />
'colour socks and red shoes'</pre>
<p>subn() 方法作用一样，但返回的是包含新字符串和替换执行次数的两元组。</p>
<pre>#!python<br />
&gt;&gt;&gt; p = re.compile( '(blue|white|red)')<br />
&gt;&gt;&gt; p.subn( 'colour', 'blue socks and red shoes')<br />
('colour socks and colour shoes', 2)<br />
&gt;&gt;&gt; p.subn( 'colour', 'no colours at all')<br />
('no colours at all', 0)</pre>
<p>空匹配只有在它们没有紧挨着前一个匹配时才会被替换掉。</p>
<pre>#!python<br />
&gt;&gt;&gt; p = re.compile('x*')<br />
&gt;&gt;&gt; p.sub('-', 'abxd')<br />
'-a-b-d-'</pre>
<p>如果替换的是一个字符串，任何在其中的反斜杠都会被处理。"\n" 将会被转换成一个换行符，"\r"转换成回车等等。未知的转义如 "\j" 则保持原样。逆向引用，如 "\6"，被 RE 中相应的组匹配而被子串替换。这使你可以在替换后的字符串中插入原始文本的一部分。</p>
<p><br />
这个例子匹配被 "{" 和 "}" 括起来的单词 "section"，并将 "section" 替换成 "subsection"。</p>
<pre>#!python<br />
&gt;&gt;&gt; p = re.compile('section{ ( [^}]* ) }', re.VERBOSE)<br />
&gt;&gt;&gt; p.sub(r'subsection{\1}','section{First} section{second}')<br />
'subsection{First} subsection{second}'</pre>
<p>还可以指定用 (?P&lt;name&gt;...) 语法定义的命名组。"\g&lt;name&gt;" 将通过组名 "name" 用子串来匹配，并且 "\g&lt;number&gt;" 使用相应的组号。所以 "\g&lt;2&gt;" 等于 "\2"，但能在替换字符串里含义不清，如 "\g&lt;2&gt;0"。（"\20" 被解释成对组 20 的引用，而不是对后面跟着一个字母 "0" 的组 2 的引用。）</p>
<pre>#!python<br />
&gt;&gt;&gt; p = re.compile('section{ (?P&lt;name&gt; [^}]* ) }', re.VERBOSE)<br />
&gt;&gt;&gt; p.sub(r'subsection{\1}','section{First}')<br />
'subsection{First}'<br />
&gt;&gt;&gt; p.sub(r'subsection{\g&lt;1&gt;}','section{First}')<br />
'subsection{First}'<br />
&gt;&gt;&gt; p.sub(r'subsection{\g&lt;name&gt;}','section{First}')<br />
'subsection{First}'</pre>
<p>替换也可以是一个甚至给你更多控制的函数。如果替换是个函数，该函数将会被模式中每一个不重复的匹配所调用。在每个调用时，函数被作为 `MatchObject` 的匹配函属，并可以使用这个信息去计算预期的字符串并返回它。</p>
<p><br />
在下面的例子里，替换函数将十进制翻译成十六进制：</p>
<pre>#!python<br />
&gt;&gt;&gt; def hexrepl( match ):<br />
...     "Return the hex string for a decimal number"<br />
...     value = int( match.group() )<br />
...     return hex(value)<br />
...<br />
&gt;&gt;&gt; p = re.compile(r'\d+')<br />
&gt;&gt;&gt; p.sub(hexrepl, 'Call 65490 for printing, 49152 for user code.')<br />
'Call 0xffd2 for printing, 0xc000 for user code.'</pre>
<p>当使用模块级的 re.sub() 函数时，模式作为第一个参数。模式也许是一个字符串或一个 `RegexObject`；如果你需要指定正则表达式标志，你必须要么使用 `RegexObject` 做第一个参数，或用使用模式内嵌修正器，如 sub("(?i)b+", "x", "bbbb BBBB") returns 'x x'。</p>
<a name=".E5.B8.B8.E8.A7.81.E9.97.AE.E9.A2.98"></a>
<h3><span class="mw-headline">常见问题 </span></h3>
<p>正则表达式对一些应用程序来说是一个强大的工具，但在有些时候它并不直观而且有时它们不按你期望的运行。本节将指出一些最容易犯的常见错误。</p>
<a name=".E4.BD.BF.E7.94.A8.E5.AD.97.E7.AC.A6.E4.B8.B2.E6.96.B9.E5.BC.8F"></a>
<h4><span class="mw-headline">使用字符串方式 </span></h4>
<p>有时使用 re 模块是个错误。如果你匹配一个固定的字符串或单个的字符类，并且你没有使用 re 的任何象 IGNORECASE 标志的功能，那么就没有必要使用正则表达式了。字符串有一些方法是对固定字符串进行操作的，它们通常快很多，因为都是一个个经过优化的C 小循环，用以代替大的、更具通用性的正则表达式引擎。</p>
<p><br />
举个用一个固定字符串替换另一个的例子；如，你可以把 "deed" 替换成 "word"。re.sub() seems like the function to use for this, but consider the replace() method. 注意 replace() 也可以在单词里面进行替换，可以把 "swordfish" 变成 "sdeedfish",不过 RE 也是可以做到的。（为了避免替换单词的一部分，模式将写成 \bword\b，这是为了要求 "word" 两边有一个单词边界。这是个超出替换能力的工作）。</p>
<p><br />
另一个常见任务是从一个字符串中删除单个字符或用另一个字符来替代它。你也许可以用象 re.sub('\n',' ',S) 这样来实现，但 translate() 能够实现这两个任务，而且比任何正则表达式操作起来更快。</p>
<p><br />
总之，在使用 re 模块之前，先考虑一下你的问题是否可以用更快、更简单的字符串方法来解决。</p>
<a name="match.28.29_vs_search.28.29"></a>
<h4><span class="mw-headline">match() vs search() </span></h4>
<p>match() 函数只检查 RE 是否在字符串开始处匹配，而 search() 则是扫描整个字符串。记住这一区别是重要的。记住，match() 只报告一次成功的匹配，它将从 0 处开始；如果匹配不是从 0 开始的，match() 将不会报告它。</p>
<pre>#!python<br />
&gt;&gt;&gt; print re.match('super', 'superstition').span()<br />
(0, 5)<br />
&gt;&gt;&gt; print re.match('super', 'insuperable')<br />
None</pre>
<p>另一方面，search() 将扫描整个字符串，并报告它找到的第一个匹配。</p>
<pre>#!python<br />
&gt;&gt;&gt; print re.search('super', 'superstition').span()<br />
(0, 5)<br />
&gt;&gt;&gt; print re.search('super', 'insuperable').span()<br />
(2, 7)</pre>
<p>有时你可能倾向于使用 re.match()，只在RE的前面部分添加 .* 。请尽量不要这么做，最好采用 re.search() 代替之。正则表达式编译器会对 REs 做一些分析以便可以在查找匹配时提高处理速度。一个那样的分析机会指出匹配的第一个字符是什么；举个例子，模式 Crow 必须从 "C" 开始匹配。分析机可以让引擎快速扫描字符串以找到开始字符，并只在 "C" 被发现后才开始全部匹配。</p>
<p>添加 .* 会使这个优化失败，这就要扫描到字符串尾部，然后回溯以找到 RE 剩馀部分的匹配。使用 re.search() 代替。</p>
<a name=".E8.B4.AA.E5.A9.AA_vs_.E4.B8.8D.E8.B4.AA.E5.A9.AA"></a>
<h4><span class="mw-headline">贪婪 vs 不贪婪 </span></h4>
<p>当重复一个正则表达式时，如用 a*，操作结果是尽可能多地匹配模式。当你试着匹配一对对称的定界符，如 HTML 标志中的尖括号时这个事实经常困扰你。匹配单个 HTML 标志的模式不能正常工作，因为 .* 的本质是&#8220;贪婪&#8221;的</p>
<pre>#!python<br />
&gt;&gt;&gt; s = '&lt;html&gt;&lt;head&gt;&lt;title&gt;Title&lt;/title&gt;'<br />
&gt;&gt;&gt; len(s)<br />
32<br />
&gt;&gt;&gt; print re.match('&lt;.*&gt;', s).span()<br />
(0, 32)<br />
&gt;&gt;&gt; print re.match('&lt;.*&gt;', s).group()<br />
&lt;html&gt;&lt;head&gt;&lt;title&gt;Title&lt;/title&gt;</pre>
<p>RE 匹配 在 "<code>&lt;html&gt;</code>" 中的 "&lt;"，.* 消耗掉子符串的剩馀部分。在 RE 中保持更多的左，虽然 &gt; 不能匹配在字符串结尾，因此正则表达式必须一个字符一个字符地回溯，直到它找到 &gt; 的匹配。最终的匹配从 "&lt;html" 中的 "&lt;" 到 "&lt;/title&gt;" 中的 "&gt;",这并不是你所想要的结果。</p>
<p><br />
在这种情况下，解决方案是使用不贪婪的限定符 *?、+?、?? 或 {m,n}?，尽可能匹配小的文本。在上面的例子里， "&gt;" 在第一个 "&lt;" 之后被立即尝试，当它失败时，引擎一次增加一个字符，并在每步重试 "&gt;"。这个处理将得到正确的结果：</p>
<pre>#!python<br />
&gt;&gt;&gt; print re.match('&lt;.*?&gt;', s).group()<br />
&lt;html&gt;</pre>
<p>注意用正则表达式分析 HTML 或 XML 是痛苦的。变化混乱的模式将处理常见情况，但 HTML 和 XML 则是明显会打破正则表达式的特殊情况；当你编写一个正则表达式去处理所有可能的情况时，模式将变得非常复杂。象这样的任务用 HTML 或 XML 解析器。</p>
<a name=".E4.B8.8D.E7.94.A8_re.VERBOSE"></a>
<h4><span class="mw-headline">不用 re.VERBOSE</span></h4>
<p>现在你可能注意到正则表达式的表示是十分紧凑，但它们非常不好读。中度复杂的 REs 可以变成反斜杠、圆括号和元字符的长长集合，以致于使它们很难读懂。</p>
<p><br />
在这些 REs 中，当编译正则表达式时指定 re.VERBOSE 标志是有帮助的，因为它允许你可以编辑正则表达式的格式使之更清楚。</p>
<p><br />
re.VERBOSE 标志有这么几个作用。在正则表达式中不在字符类中的空白符被忽略。这就意味着象 dog | cat 这样的表达式和可读性差的 dog|cat 相同，但 [a b] 将匹配字符 "a"、"b" 或 空格。另外，你也可以把注释放到 RE 中；注释是从 "#" 到下一行。当使用三引号字符串时，可以使 REs 格式更加干净：</p>
<pre>#!python<br />
pat = re.compile(r"""<br />
\s*                 # Skip leading whitespace<br />
(?P&lt;header&gt;[^:]+)   # Header name<br />
\s* :               # Whitespace, and a colon<br />
(?P&lt;value&gt;.*?)      # The header's value -- *? used to<br />
# lose the following trailing whitespace<br />
\s*$                # Trailing whitespace to end-of-line<br />
""", re.VERBOSE)</pre>
<p>这个要难读得多：</p>
<pre>#!python<br />
pat = re.compile(r"\s*(?P&lt;header&gt;[^:]+)\s*:(?P&lt;value&gt;.*?)\s*$")</pre>
<h3><span class="mw-headline">反馈</span></h3>
<p>正则表达式是一个复杂的主题。本文能否有助于你理解呢？那些部分是否不清晰，或在这儿没有找到你所遇到的问题？如果是那样的话，请将建议发给作者以便改进。</p>
<img src ="http://www.blogjava.net/xiaomage234/aggbug/285130.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2009-07-02 12:24 <a href="http://www.blogjava.net/xiaomage234/archive/2009/07/02/285130.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python pdb 基础调试 [转]</title><link>http://www.blogjava.net/xiaomage234/archive/2009/04/09/264636.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 09 Apr 2009 06:18:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2009/04/09/264636.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/264636.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2009/04/09/264636.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/264636.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/264636.html</trackback:ping><description><![CDATA[from :http://www.blogjava.net/Skynet/archive/2009/04/07/264259.html<br />
当手边没有IDE,面对着python调试犯愁时，你就可以参考下本文；（pdb 命令调试）<br />
参考：http://docs.python.org/library/pdb.html<br />
和 (pdb)help<br />
<br />
首先你选择运行的 py<br />
python -m pdb myscript.py<br />
(Pdb) 会自动停在第一行，等待调试,这时你可以看看 帮助 <br />
(Pdb) h <br />
&nbsp;&nbsp;&nbsp; 说明下这几个关键 命令<br />
<br />
&gt;断点设置&nbsp; <br />
&nbsp;&nbsp; (Pdb)b&nbsp; 10 #断点设置在本py的第10行<br />
&nbsp;&nbsp; 或(Pdb)b&nbsp; ots.py:20 #断点设置到 ots.py第20行<br />
&nbsp;&nbsp; 删除断点（Pdb）b #查看断点编号<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (Pdb)cl 2 #删除第2个断点<br />
&nbsp; &nbsp;&nbsp; <br />
&gt;运行<br />
&nbsp;&nbsp;&nbsp; (Pdb)n #单步运行<br />
&nbsp;&nbsp;&nbsp; (Pdb)c #跳到下个断点<br />
&gt;查看<br />
&nbsp;&nbsp;&nbsp; (Pdb)p param #查看当前 变量值<br />
&nbsp;&nbsp;&nbsp; (Pdb)l #查看运行到某处代码<br />
&nbsp;&nbsp;&nbsp; (Pdb)a #查看全部栈内变量<br />
<br />
<br />
&nbsp;&nbsp; 上面一般的调试工具大体上都能解决了，还有其他什么 调试时修改变量值，回到某断点等 ，可以在 pdb 中 help 下 （其实我也不太明白）<br />
&nbsp;&nbsp;&nbsp; 望那位知道的，能一起补全这篇文章。<br />
<img src ="http://www.blogjava.net/xiaomage234/aggbug/264636.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2009-04-09 14:18 <a href="http://www.blogjava.net/xiaomage234/archive/2009/04/09/264636.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python天天进步(1)--sys.argv[]用法 [转]</title><link>http://www.blogjava.net/xiaomage234/archive/2009/03/23/261543.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Mon, 23 Mar 2009 08:43:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2009/03/23/261543.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/261543.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2009/03/23/261543.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/261543.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/261543.html</trackback:ping><description><![CDATA[<p style="text-indent: 19pt; line-height: 16pt" align="left" mce_style="text-indent: 19pt; line-height: 16pt;"><span style="font-size: 9.5pt; font-family: 宋体" mce_style="font-size: 9.5pt; font-family: 宋体;"><span style="font-size: 10pt">在学python的过程中，一直弄不明白sys.argv[]的意思，虽知道是表示命令行参数，但还是有些稀里糊涂的感觉。</span></span></p>
<p style="text-indent: 19pt; line-height: 16pt" align="left" mce_style="text-indent: 19pt; line-height: 16pt;"><span style="font-size: 9.5pt; font-family: 宋体" mce_style="font-size: 9.5pt; font-family: 宋体;"><span style="font-size: 10pt">今天又好好学习了一把，总算是大彻大悟了。</span></span></p>
<p style="text-indent: 19pt; line-height: 16pt" align="left" mce_style="text-indent: 19pt; line-height: 16pt;"><span style="font-size: 10pt"><span style="font-size: 9.5pt; font-family: 宋体" mce_style="font-size: 9.5pt; font-family: 宋体;">Sys.argv[]</span><span style="font-size: 9.5pt; font-family: 宋体" mce_style="font-size: 9.5pt; font-family: 宋体;">是用来获取命令行参数的，sys.argv[0]表示代码本身文件路径，所以参数从1开始，以下两个例子说明：</span></span></p>
<p style="text-indent: 19pt; line-height: 16pt" align="left" mce_style="text-align: left; text-indent: 19pt; line-height: 16pt;"><span style="font-size: 10pt"><span style="font-size: 9.5pt; font-family: 宋体" mce_style="font-size: 9.5pt; font-family: 宋体;">1</span><span style="font-size: 9.5pt; font-family: 宋体" mce_style="font-size: 9.5pt; font-family: 宋体;">、使用sys.argv[]的一简单实例，</span></span></p>
<p style="text-indent: 19pt; line-height: 16pt" align="left" mce_style="text-align: left; text-indent: 19pt; line-height: 16pt;"><span style="font-size: 10pt"><span style="font-size: 9.5pt; font-family: 宋体" mce_style="font-size: 9.5pt; font-family: 宋体;"></p>
<div id="codee_html" style="background-color: rgb(249,247,237)">
<div class="source" style="font-family: '[object HTMLOptionElement]','Consolas','Lucida Console','Courier New'; background-color: rgb(249,247,237)">import sys,os<br />
os.system(sys.argv[<span style="color: rgb(0,0,255)">1</span>])<br />
</div>
</div>
</span></span>
<p style="text-indent: 19pt; line-height: 16pt" align="left" mce_style="text-align: left; text-indent: 19pt; line-height: 16pt;"></p>
<p style="text-indent: 19pt; line-height: 16pt" align="left" mce_style="text-align: left; text-indent: 19pt; line-height: 16pt;"><span style="font-size: 9.5pt; font-family: 宋体" mce_style="font-size: 9.5pt; font-family: 宋体;"><span style="font-size: 10pt">这个例子os.system接收命令行参数，运行参数指令，保存为sample1.py，命令行带参数运行sample1.py notepad，将打开记事本程序。</span></span></p>
<p style="text-indent: 19pt; line-height: 16pt" align="left" mce_style="text-align: left; text-indent: 19pt; line-height: 16pt;"><span style="font-size: 10pt"><span style="font-size: 9.5pt; font-family: 宋体" mce_style="font-size: 9.5pt; font-family: 宋体;">2</span><span style="font-size: 9.5pt; font-family: 宋体" mce_style="font-size: 9.5pt; font-family: 宋体;">、</span><span style="font-size: 9.5pt; font-family: 宋体" mce_style="font-size: 9.5pt; font-family: 宋体;">这个例子是简明python教程上的，明白它之后你就明白sys.argv[]了。</span></span><span style="font-size: 9.5pt" mce_style="font-size: 9.5pt;"><span style="font-size: 10pt"></p>
<div id="codee_html" style="background-color: rgb(249,247,237)">
<div class="source" style="font-family: '[object HTMLOptionElement]','Consolas','Lucida Console','Courier New'; background-color: rgb(249,247,237)">import sys<br />
<span style="font-weight: bold; color: rgb(0,0,128)">def</span> readfile(filename):&nbsp; <span style="color: rgb(0,136,0); font-style: italic">#从文件中读出文件内容</span><br />
<span style="color: rgb(0,0,255)">'''Print a file to the standard output.'''</span><br />
f = file(filename)<br />
<span style="font-weight: bold; color: rgb(0,0,128)">while</span> True:<br />
line = f.readline()<br />
<span style="font-weight: bold; color: rgb(0,0,128)">if</span> len(line) == <span style="color: rgb(0,0,255)">0</span>:<br />
<span style="font-weight: bold; color: rgb(0,0,128)">break</span><br />
<span style="font-weight: bold; color: rgb(0,0,128)">print</span> line, <span style="color: rgb(0,136,0); font-style: italic"># notice comma&nbsp; 分别输出每行内容</span><br />
f.close()<br />
<span style="color: rgb(0,136,0); font-style: italic"># Script starts from here</span><br />
<span style="font-weight: bold; color: rgb(0,0,128)">if</span> len(sys.argv) &lt; <span style="color: rgb(0,0,255)">2</span>:<br />
<span style="font-weight: bold; color: rgb(0,0,128)">print</span> <span style="color: rgb(0,0,255)">'No action specified.'</span><br />
sys.exit()<br />
<span style="font-weight: bold; color: rgb(0,0,128)">if</span> sys.argv[<span style="color: rgb(0,0,255)">1</span>].startswith(<span style="color: rgb(0,0,255)">'--'</span>):<br />
option = sys.argv[<span style="color: rgb(0,0,255)">1</span>][<span style="color: rgb(0,0,255)">2</span>:]<br />
<span style="color: rgb(0,136,0); font-style: italic"># fetch sys.argv[1] but without the first two characters</span><br />
<span style="font-weight: bold; color: rgb(0,0,128)">if</span> option == <span style="color: rgb(0,0,255)">'version'</span>:&nbsp; <span style="color: rgb(0,136,0); font-style: italic">#当命令行参数为-- version，显示版本号</span><br />
<span style="font-weight: bold; color: rgb(0,0,128)">print</span> <span style="color: rgb(0,0,255)">'Version 1.2'</span><br />
<span style="font-weight: bold; color: rgb(0,0,128)">elif</span> option == <span style="color: rgb(0,0,255)">'help'</span>:&nbsp; <span style="color: rgb(0,136,0); font-style: italic">#当命令行参数为--help时，显示相关帮助内容</span><br />
<span style="font-weight: bold; color: rgb(0,0,128)">print</span> <span style="color: rgb(0,0,255)">'''"</span><br />
<span style="color: rgb(0,0,255)">This program prints files to the standard output.</span><br />
<span style="color: rgb(0,0,255)">Any number of files can be specified.</span><br />
<span style="color: rgb(0,0,255)">Options include:</span><br />
<span style="color: rgb(0,0,255)">--version : Prints the version number</span><br />
<span style="color: rgb(0,0,255)">--help&nbsp;&nbsp;&nbsp; : Display this help'''</span><br />
<span style="font-weight: bold; color: rgb(0,0,128)">else</span>:<br />
<span style="font-weight: bold; color: rgb(0,0,128)">print</span> <span style="color: rgb(0,0,255)">'Unknown option.'</span><br />
sys.exit()<br />
<span style="font-weight: bold; color: rgb(0,0,128)">else</span>:<br />
<span style="font-weight: bold; color: rgb(0,0,128)">for</span> filename <span style="font-weight: bold">in</span> sys.argv[<span style="color: rgb(0,0,255)">1</span>:]: <span style="color: rgb(0,136,0); font-style: italic">#当参数为文件名时，传入readfile，读出其内容</span><br />
readfile(filename)<br />
</div>
</div>
<p style="text-indent: 19pt; line-height: 16pt" align="left" mce_style="text-align: left; text-indent: 19pt; line-height: 16pt;">&nbsp;</span></span></p>
<p style="text-indent: 19pt; line-height: 16pt" align="left" mce_style="text-align: left; text-indent: 19pt; line-height: 16pt;"><span style="font-size: 9.5pt; font-family: 宋体" mce_style="font-size: 9.5pt; font-family: 宋体;"><span style="font-size: 10pt">保存程序为sample.py.我们验证一下：</span></span></p>
<p style="margin-left: 40pt; text-indent: -21pt; line-height: 16pt" align="left" mce_style="margin-left: 40pt; text-align: left; text-indent: -21pt; line-height: 16pt;"><span style="font-size: 10pt"><span style="font-size: 9.5pt; font-family: 宋体" mce_style="font-size: 9.5pt; font-family: 宋体;"><span style="font-size: 9.5pt; font-family: 宋体" mce_style="font-size: 9.5pt; font-family: 宋体;">命令行带参数运行：sample.py &#8211;version&nbsp;输出结果为：</span></span><span style="font-size: 9.5pt; color: blue" mce_style="font-size: 9.5pt; color: blue;">version 1.2</span></span></p>
<p style="margin-left: 40pt; text-indent: -21pt; line-height: 16pt" align="left" mce_style="margin-left: 40pt; text-align: left; text-indent: -21pt; line-height: 16pt;"><span style="font-size: 10pt"><span style="font-size: 9.5pt; font-family: 宋体" mce_style="font-size: 9.5pt; font-family: 宋体;"><span style="font-size: 9.5pt; font-family: 宋体" mce_style="font-size: 9.5pt; font-family: 宋体;">命令行带参数运行：sample.py &#8211;help&nbsp;输出结果为：</span></span><span style="font-size: 9.5pt; color: blue" mce_style="font-size: 9.5pt; color: blue;">This program prints files</span><span style="font-size: 9.5pt; color: blue; font-family: 宋体" mce_style="font-size: 9.5pt; font-family: 宋体; color: blue;">&#8230;&#8230;</span></span></p>
<p style="margin-left: 40pt; text-indent: -21pt; line-height: 16pt" align="left" mce_style="margin-left: 40pt; text-align: left; text-indent: -21pt; line-height: 16pt;"><span style="font-size: 10pt"><span style="font-size: 9.5pt; font-family: 宋体" mce_style="font-size: 9.5pt; font-family: 宋体;"><span style="font-size: 9.5pt; font-family: 宋体" mce_style="font-size: 9.5pt; font-family: 宋体;">在与sample.py同一目录下，新建a.txt的记事本文件，内容为：test argv；命令行带参数运行：sample.py a.txt，输出结果为a.txt文件内容：</span></span><span style="font-size: 9.5pt; color: blue" mce_style="font-size: 9.5pt; color: blue;">test argv</span><span style="font-size: 9.5pt; font-family: 宋体" mce_style="font-size: 9.5pt; font-family: 宋体;">，这里也可多带几个参数，程序会先后输出参数文件内容。</span></span></p>
<img src ="http://www.blogjava.net/xiaomage234/aggbug/261543.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2009-03-23 16:43 <a href="http://www.blogjava.net/xiaomage234/archive/2009/03/23/261543.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何识别高级的验证码[转]</title><link>http://www.blogjava.net/xiaomage234/archive/2009/03/14/259681.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Sat, 14 Mar 2009 01:54:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2009/03/14/259681.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/259681.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2009/03/14/259681.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/259681.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/259681.html</trackback:ping><description><![CDATA[<p>from:http://huaidan.org/archives/2085.html<br />
</p>
<p>一、验证码的基本知识</p>
<p>1. 验证码的主要目的是强制人机交互来抵御机器自动化攻击的。</p>
<p>2. 大部分的验证码设计者并不得要领，不了解图像处理，机器视觉，模式识别，人工智能的基本概念。<br />
<br />
3. 利用验证码，可以发财，当然要犯罪：比如招商银行密码只有6位，验证码形同虚设，计算机很快就能破解一个有钱的账户，很多帐户是可以网上交易的。</p>
<p>4. 也有设计的比较好的，比如Yahoo,Google,Microsoft等。而国内Tencent的中文验证码虽然难，但算不上好。</p>
<p>二、人工智能，模式识别，机器视觉，图像处理的基本知识</p>
<p>1)主要流程：</p>
<p>比如我们要从一副图片中，识别出验证码；比如我们要从一副图片中，检测并识别出一张人脸。 大概有哪些步骤呢？</p>
<p>1.图像采集：验证码呢，就直接通过HTTP抓HTML，然后分析出图片的url，然后下载保存就可以了。 如果是人脸检测识别，一般要通过视屏采集设备，采集回来，通过A/D转操作，存为数字图片或者视频频。</p>
<p>2.预处理：检测是正确的图像格式，转换到合适的格式，压缩，剪切出ROI，去除噪音，灰度化，转换色彩空间这些。</p>
<p>3.检测：车牌检测识别系统要先找到车牌的大概位置，人脸检测系统要找出图片中所有的人脸（包括疑似人脸）；验证码识别呢，主要是找出文字所在的主要区域。</p>
<p>4.前处理：人脸检测和识别，会对人脸在识别前作一些校正，比如面内面外的旋转，扭曲等。我这里的验证码识别，&#8220;一般&#8221;要做文字的切割</p>
<p>5.训练：通过各种模式识别，机器学习算法，来挑选和训练合适数量的训练集。不是训练的样本越多越好。过学习，泛化能力差的问题可能在这里出现。这一步不是必须的，有些识别算法是不需要训练的。</p>
<p>6.识别：输入待识别的处理后的图片，转换成分类器需要的输入格式，然后通过输出的类和置信度，来判断大概可能是哪个字母。识别本质上就是分类。</p>
<p>2)关键概念：</p>
<p>图像处理：一般指针对数字图像的某种数学处理。比如投影，钝化，锐化，细化，边缘检测，二值化，压缩，各种数据变换等等。</p>
<p>1.二值化：一般图片都是彩色的，按照逼真程度，可能很多级别。为了降低计算复杂度，方便后续的处理，如果在不损失关键信息的情况下，能将图片处理成黑白两种颜色，那就最好不过了。</p>
<p>2.细化：找出图像的骨架，图像线条可能是很宽的，通过细化将宽度将为1，某些地方可能大于1。不同的细化算法，可能有不同的差异，比如是否更靠近线条中间，比如是否保持联通行等。</p>
<p>3.边缘检测：主要是理解边缘的概念。边缘实际上是图像中图像像素属性变化剧烈的地方。可能通过一个固定的门限值来判断，也可能是自适应的。门限可能是图像全局的，也可能是局部的。不能说那个就一定好，不过大部分时候，自适应的局部的门限可能要好点。被分析的，可能是颜色，也可能是灰度图像的灰度。</p>
<p>机器视觉：利用计算机来模式实现人的视觉。 比如物体检测，定位，识别。按照对图像理解的层次的差别，分高阶和低阶的理解。</p>
<p>模式识别：对事物或者现象的某种表示方式（数值，文字，我们这里主要想说的是数值），通过一些处理和分析，来描述，归类，理解，解释这些事物，现象及其某种抽象。</p>
<p>人工智能：这种概念比较宽，上面这些都属于人工智能这个大的方向。简单点不要过分学院派的理解就是，把人类的很&#8220;智能&#8221;的东西给模拟出来协助生物的人来处理问题，特别是在计算机里面。</p>
<p>三、常见的验证码的破解分析</p>
<p>以http://libcaca.zoy.org/wiki/PWNtcha这里PWNtcha项目中的资料为例分析，各种验证码的破解。（方法很多，仅仅从我个人乍看之下觉得可行的方法来分析）</p>
<p>1)Authimage</p>
<p><img alt="" src="http://huaidan.org/wp-content/uploads/img/yupoo/922715bdd0cd/h5hgdfd6.jpg" /><br />
使用的反破解技巧： </p>
<p>1.不连续的点组成字符<br />
2.有一定程度的倾斜</p>
<p>设计不好的地方：</p>
<p>1.通过纵横的直方图投影，可以找到字幕区域<br />
2.通过Hough变换，适当的参数，可以找到近似的横线，可以做倾斜矫正<br />
3.字符串的倾斜式面内的，没有太多的破解难度<br />
4.字母宽度一定，大小一定</p>
<p>2)Clubic</p>
<p><img alt="" src="http://huaidan.org/wp-content/uploads/img/yupoo/914715bdd0d3/s36cy743.jpg" /><br />
使用的反破解技巧： </p>
<p>1.字符是手写体</p>
<p>设计不好的地方：</p>
<p>1.检测切割阶段没有任何技术含量，属于设计的比较丑的<br />
2.只有数字，而且手写体变化不大<br />
3.表面看起来对识别阶段有难度，仔细分析，发现几乎不用任何高级的训练识别算法，就固定的招某些像素点是否有色彩就够了</p>
<p>3)linuxfr.org</p>
<p><img alt="" src="http://huaidan.org/wp-content/uploads/img/yupoo/029145bdd0cd/wnwz30i2.jpg" /><br />
使用的反破解技巧： </p>
<p>1.背景颜色块<br />
2.前景的横线或矩形</p>
<p>设计不好的地方：</p>
<p>1.背景色是单一色块，有形状，通过Region-Growth区域增长来很容易把背景给去掉<br />
2.前景色是标准的线条，色彩单一<br />
3.字母无粘连<br />
4.都是印刷体</p>
<p>4)Ourcolony</p>
<p><img alt="" src="http://huaidan.org/wp-content/uploads/img/yupoo/278335bdd0cf/wpdw3nuy.jpg" /><br />
使用的反破解技巧： </p>
<p>1.设计的太低级，不屑于去评价</p>
<p>设计不好的地方：</p>
<p>1.这种验证码，设计的最丑，但还是能把菜鸟搞定，毕竟学计算机的少，搞这个破解的更少，正所谓隔行如隔山</p>
<p>5)LiveJournal</p>
<p><img alt="" src="http://huaidan.org/wp-content/uploads/img/yupoo/662425bdd0d2/71jsdrn6.jpg" /><br />
使用的反破解技巧： </p>
<p>1.这个设计略微好点，使用个随机噪音，而且作为前景<br />
2.字母位置粗细都有变化</p>
<p>设计不好的地方：</p>
<p>1.字母没有粘连<br />
2.噪音类型单一<br />
3.通过在X轴的直方图投影，能准确分割字幕<br />
4.然后在Y周作直方图投影,能准确定位高度<br />
5.识别阶段，都是印刷体，简单地很</p>
<p>四、网上的一些高级验证码</p>
<p>1)ICQ</p>
<p><img alt="" src="http://huaidan.org/wp-content/uploads/img/yupoo/700595bdd0c1/s3mme4h0.jpg" /><br />
2)IMDb</p>
<p><img alt="" src="http://huaidan.org/wp-content/uploads/img/yupoo/451605bdd0c3/8qbljgnh.jpg" /><br />
3)MS MVPS</p>
<p><img alt="" src="http://huaidan.org/wp-content/uploads/img/yupoo/348055bdd0c5/7tenrvma.jpg" /></p>
<p>4)MVN Forum</p>
<p><img alt="" src="http://huaidan.org/wp-content/uploads/img/yupoo/944405bdd0c7/78o419pr.jpg" /></p>
<p>这些类型是被很多人认为比较难得类型，分析一下可以发现，字符检测，定位和分割都不是难。 唯一影响识别率的是IMDBb和MVPS这两类，字体变形略大。</p>
<p>总体来说，这些类型的破解也不难，很容易做到50%以上的识别率。</p>
<p>五、高级验证码的破解分析</p>
<p>时间关系，我简单介绍如何利用图像处理和模式识别技术，自动识别比较高级的验证码。<br />
(以风头正劲的Google为例)</p>
<p><img alt="" src="http://huaidan.org/wp-content/uploads/img/yupoo/416885bdd0c8/d31c2mon.jpg" /><br />
1)至少从目前的AI的发展程度看，没有简单的做法能自动处理各种不同的验证码，即使能力很强，那么系统自然也十分复杂强大。所以，要想在很简单的算法实现比较高级的验证码破解，必须分析不同验证码算法的特点：</p>
<p>作为一般的图像处理和计算机视觉，会考虑色彩，纹理，形状等直接的特征，同时也考虑直方图，灰度等统计特征，还考虑FFT，Wavelet等各种变换后的特征。但最终目标都是Dimension Reduction（降维）然后利于识别，不仅仅是速度的考虑。从图像的角度看，很多系统都考虑转换为灰度级甚者黑白图片。<br />
　<br />
Google的图片可以看出，颜色变化是虚晃一枪，不存在任何处理难度。难度是字体变形和字符粘连。<br />
　<br />
如果能成功的分割字符，那么后期识别无论是用SVM等分类算法，还是分析笔顺比划走向来硬识别，都相对好做。<br />
　<br />
2)图像处理和粘连分割</p>
<p>代码中的part1目录主要完成图像预处理和粘连字符分割<br />
001：将图像从jpg等格式转换为位图便于处理<br />
002：采用Fix/Adaptive的Threshold门限算法，将图片Bin-Value二值化。<br />
（可用003算法）<br />
003：采用OSTU分水岭算法，将图片Bin-Value二值化。<br />
（更通用，大部分时候效果更好）<br />
005：获取ROI感兴趣的区域。<br />
006：Edge Trace边缘跟踪。<br />
007：Edge Detection边界检测。<br />
008：Thin细化去骨架。<br />
009：做了一些Tidy整理。<br />
　　（这个一般要根据特定的Captcha算法调整）<br />
010：做切割,注意图片中红色的交叉点。<br />
011：将边缘检测和骨干交叉点监测的图像合并。<br />
　　（合并过程可以做分析: 比如X坐标偏移门限分析，交叉点区域纹理分析，线条走势分析，等等各种方法，找出更可能的切分点和分离后部件的组合管理。）</p>
<p><img alt="" src="http://huaidan.org/wp-content/uploads/img/yupoo/749045bdd0ca/q24gs2ea.jpg" /><br />
代码：（代码质量不高，从其他项目拷贝过来，简单修改的。）</p>
<p><a href="http://www.icylife.net/pstzine/0x02/html/pstzine_09_01.txt" target="_blank">查看代码</a>(./pstzine_09_01.txt)</p>
<p>注： 在这里，我们可以看到，基本的部件（字母是分割开了，但可以造成统一字母的被切割成多个Component。 一种做法是：利用先验知识，做分割； 另外一种做法是，和第二部分的识别结合起来。 比如按照从左至右，尝试增加component来识别，如果不能识别而且component的总宽度，总面积还比较小，继续增加。 当然不排除拒识的可能性。 ）</p>
<p>3)字符部件组合和识别。</p>
<p>part2的代码展示了切割后的字母组合，和基于svm的字符识别的训练和识别过程。Detection.cpp中展示了ImageSpam检测过程中的一些字符分割和组合，layout的分析和利用的简单技术。 而Google的验证码的识别，完全可以不用到，仅做参考。</p>
<p>SVM及使用：</p>
<p>本质上，SVM是一个分类器，原始的SVM是一个两类分类的分类器。可以通过1:1或者1:n的方式来组合成一个多类分类的分类器。 天生通过核函数的使用支持高维数据的分类。从几何意义上讲，就是找到最能表示类别特征的那些向量（支持向量SV）,然后找到一条线，能最大化分类的Margin。</p>
<p>libSVM是一个不错的实现。</p>
<p>训练间断和识别阶段的数据整理和归一化是一样的。 这里的简单做法是：</p>
<p>首先：</p>
<p>#define SVM_MAX +0.999<br />
#define SVM_MIN +0.001</p>
<p>其次：</p>
<p>扫描黑白待识别字幕图片的每个像素，如果为0(黑色，是字母上的像素),那么svm中该位置就SVM_MAX,反之则反。</p>
<p>最后：</p>
<p>训练阶段，在svm的input的前面，为该类打上标记，即是那一个字母。<br />
识别阶段，当然这个类别标记是SVM分类出来。</p>
<p>注意：</p>
<p>如果是SVM菜鸟，最好找一个在SVM外边做了包装的工具，比如样本选择，交叉验证，核函数选择这些，让程序自动选择和分析。</p>
<p>代码：通过ReginGrowth来提取单个单个的字符，然后开始识别。</p>
<p><a href="http://www.icylife.net/pstzine/0x02/html/pstzine_09_02.txt" target="_blank">查看代码</a>(./pstzine_09_02.txt)</p>
<p>六、对验证码设计的一些建议</p>
<p>1.在噪音等类型的使用上，尽力让字符和用来混淆的前景和背景不容易区分。尽力让坏人（噪音）长得和好人（字母）一样。</p>
<p>2.特别好的验证码的设计，要尽力发挥人类擅长而AI算法不擅长的。 比如粘连字符的分割和手写体（通过印刷体做特别的变形也可以）。 而不要一味的去加一些看起来比较复杂的噪音或者其他的花哨的东西。即使你做的足够复杂，但如果人也难识别，显然别人认为你是没事找抽型的。</p>
<p>3. 从专业的机器视觉的角度说，验证码的设计，一定要让破解者在识别阶段，反复在低阶视觉和高阶视觉之间多反复几次才能识别出来。 这样可以大大降低破解难度和破解的准确率。</p>
<p>七、个人郑重申明</p>
<p>1.这个问题，本身是人工智能，计算机视觉，模式识别领域的一个难题。我是虾米，菜得不能再菜的那种。作为破解者来说，是出于劣势地位。要做的很好，是很难得。总体来说，我走的是比较学院派的线路，能真正的破解难度比较高的验证码，不同于网上很多不太入流的破解方法。我能做的只有利用有限的知识，抛砖引玉而已。 很多OCR的技术，特别是离线手写体中文等文字识别的技术，个人了解有限的很，都不敢在这里乱写。</p>
<p>2.希望不要把这种技术用于非法用途。</p>
<img src ="http://www.blogjava.net/xiaomage234/aggbug/259681.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2009-03-14 09:54 <a href="http://www.blogjava.net/xiaomage234/archive/2009/03/14/259681.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Python进行验证码识别[转]</title><link>http://www.blogjava.net/xiaomage234/archive/2009/02/04/253212.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Wed, 04 Feb 2009 03:32:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2009/02/04/253212.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/253212.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2009/02/04/253212.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/253212.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/253212.html</trackback:ping><description><![CDATA[<p>以前写过一个刷校内网的人气的工具，Java的(以后再也不行Java程序了)，里面用到了验证码识别，那段代码不是我自己写的:-) 校内的验证是完全单色没有任何干挠的验证码，识别起来比较容易，不过从那段代码中可以看到基本的验证码识别方式。这几天在写一个程序的时候需要识别验证码，因为程序是Python写的自然打算用Python进行验证码的识别。<br />
以前没用Python处理过图像，不太了解PIL(Python Image Library)的用法，这几天看了看PIL，发现它太强大了，简直和ImageMagic，PS可以相比了。(这里有PIL不错的文档)<br />
由于上面的验证码是24位的jpeg图像，并且包含了噪点，所以我们要做的就是去噪和去色，我拿PS找了张验证码试了试，使用PS滤镜中的去噪效果还行，但是没有在PIL找到去噪的函数，后来发现中值过滤后可以去掉大部分的噪点，而且PIL里有现成的函数，接下来我试着直接把图像转换为单色，结果发现还是会有不过的噪点留了下来，因为中值过滤时把不少噪点淡化了，但转换为音色时这些噪点又被强化显示了，于是在中值过滤后对图像亮度进行加强处理，然后再转换为单色，这样验证码图片就变得比较容易识别了:</p>
<p><br />
上面这些处理使用Python才几行：<br />
PYTHON: <br />
im = Image.open(image_name)<br />
&nbsp;&nbsp;&nbsp; im = im.filter(ImageFilter.MedianFilter())<br />
&nbsp;&nbsp;&nbsp; enhancer = ImageEnhance.Contrast(im)<br />
&nbsp;&nbsp;&nbsp; im = enhancer.enhance(2)<br />
&nbsp;&nbsp;&nbsp; im = im.convert('1')<br />
&nbsp;&nbsp;&nbsp; im.show()<br />
接下来就是提取这些数字的字模，使用shell脚本下载100幅图片，抽出三张图片获取字模：<br />
PYTHON: <br />
#!/usr/bin/env python<br />
#encoding=utf-8<br />
&nbsp;<br />
import Image,ImageEnhance,ImageFilter<br />
import sys<br />
&nbsp;<br />
image_name = "./images/81.jpeg"<br />
im = Image.open(image_name)<br />
im = im.filter(ImageFilter.MedianFilter())<br />
enhancer = ImageEnhance.Contrast(im)<br />
im = enhancer.enhance(2)<br />
im = im.convert('1')<br />
#im.show()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #all by pixel<br />
s = 12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #start postion of first number<br />
w = 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #width of each number<br />
h = 15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #end postion from top<br />
t = 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #start postion of top<br />
&nbsp;<br />
im_new = []<br />
#split four numbers in the picture<br />
for i in range(4):<br />
&nbsp;&nbsp;&nbsp; im1 = im.crop((s+w*i+i*2,t,s+w*(i+1)+i*2,h))<br />
&nbsp;&nbsp;&nbsp; im_new.append(im1)<br />
&nbsp;<br />
f = file("data.txt","a")<br />
for k in range(4):<br />
&nbsp;&nbsp;&nbsp; l = []<br />
&nbsp;&nbsp;&nbsp; #im_new[k].show()<br />
&nbsp;&nbsp;&nbsp; for i in range(13):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for j in range(10):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (im_new[k].getpixel((j,i)) == 255):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l.append(0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l.append(1)<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; f.write("l=[")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; n = 0<br />
&nbsp;&nbsp;&nbsp; for i in l:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (n%10==0):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.write("\n")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.write(str(i)+",")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n+=1<br />
&nbsp;&nbsp;&nbsp; f.write("]\n")<br />
把字模保存为list，用于接下来的匹配；<br />
提取完字模后剩下来的就是对需要处理的图片进行与数据库中的字模进行匹配了，基本的思路就是看相应点的重合率，但是由于噪点的影响在对(6,8)(8,3)(5,9)的匹配时容易出错，俺自己针对已有的100幅图片数据采集进行分析，采用了双向匹配(图片与字模分别作为基点)，做了半天的测试终于可以实现100%的识别率。<br />
PYTHON: <br />
#!/usr/bin/env python<br />
#encoding=utf-8<br />
&nbsp;<br />
import Image,ImageEnhance,ImageFilter<br />
import Data<br />
&nbsp;<br />
DEBUG = False<br />
&nbsp;<br />
def d_print(*msg):<br />
&nbsp;&nbsp;&nbsp; global DEBUG<br />
&nbsp;&nbsp;&nbsp; if DEBUG:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for i in msg:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print i,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print<br />
&nbsp;&nbsp;&nbsp; else:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pass<br />
&nbsp;<br />
&nbsp;<br />
def Get_Num(l=[]):<br />
&nbsp;&nbsp;&nbsp; min1 = []<br />
&nbsp;&nbsp;&nbsp; min2 = []<br />
&nbsp;&nbsp;&nbsp; for n in Data.N:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; count1=count2=count3=count4=0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (len(l) != len(n)):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "Wrong pic"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for i in range(len(l)):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (l[i] == 1):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; count1+=1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (n[i] == 1):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; count2+=1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for i in range(len(l)):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (n[i] == 1):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; count3+=1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (l[i] == 1):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; count4+=1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d_print(count1,count2,count3,count4)<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; min1.append(count1-count2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; min2.append(count3-count4)<br />
&nbsp;&nbsp;&nbsp; d_print(min1,"\n",min2)<br />
&nbsp;&nbsp;&nbsp; for i in range(10):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (min1[i] &lt;= 2 or min2[i] &lt;= 2):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((abs(min1[i] - min2[i])) &lt;10):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return i<br />
&nbsp;&nbsp;&nbsp; for i in range(10):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (min1[i] &lt;= 4 or min2[i] &lt;= 4):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (abs(min1[i] - min2[i]) &lt;= 2):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return i<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; for i in range(10):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag = False<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (min1[i] &lt;= 3 or min2[i] &lt;= 3):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for j in range(10):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (j != i and (min1[j] &lt;5 or min2[j] &amp;lt;5)):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag = True<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pass<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (not flag):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return i<br />
&nbsp;&nbsp;&nbsp; for i in range(10):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (min1[i] &lt;= 5 or min2[i] &lt;= 5):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (abs(min1[i] - min2[i]) &lt;= 10):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return i<br />
&nbsp;&nbsp;&nbsp; for i in range(10):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (min1[i] &lt;= 10 or min2[i] &lt;= 10):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (abs(min1[i] - min2[i]) &lt;= 3):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return i<br />
&nbsp;<br />
#end of function Get_Num<br />
&nbsp;<br />
def Pic_Reg(image_name=None):<br />
&nbsp;&nbsp;&nbsp; im = Image.open(image_name)<br />
&nbsp;&nbsp;&nbsp; im = im.filter(ImageFilter.MedianFilter())<br />
&nbsp;&nbsp;&nbsp; enhancer = ImageEnhance.Contrast(im)<br />
&nbsp;&nbsp;&nbsp; im = enhancer.enhance(2)<br />
&nbsp;&nbsp;&nbsp; im = im.convert('1')<br />
&nbsp;&nbsp;&nbsp; im.show()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #all by pixel<br />
&nbsp;&nbsp;&nbsp; s = 12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #start postion of first number<br />
&nbsp;&nbsp;&nbsp; w = 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #width of each number<br />
&nbsp;&nbsp;&nbsp; h = 15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #end postion from top<br />
&nbsp;&nbsp;&nbsp; t = 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #start postion of top<br />
&nbsp;&nbsp;&nbsp; im_new = []<br />
&nbsp;&nbsp;&nbsp; #split four numbers in the picture<br />
&nbsp;&nbsp;&nbsp; for i in range(4):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; im1 = im.crop((s+w*i+i*2,t,s+w*(i+1)+i*2,h))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; im_new.append(im1)<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; s = ""<br />
&nbsp;&nbsp;&nbsp; for k in range(4):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l = []<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #im_new[k].show()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for i in range(13):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for j in range(10):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (im_new[k].getpixel((j,i)) == 255):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l.append(0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l.append(1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s+=str(Get_Num(l))<br />
&nbsp;&nbsp;&nbsp; return s<br />
print Pic_Reg("./images/22.jpeg")<br />
这里再提一下验证码识别的基本方法：截图，二值化、中值滤波去噪、分割、紧缩重排（让高矮统一）、字库特征匹配识别。<br />
这里只是针对一般的验证码，高级验证码的识别这里有篇不错的文章，太复杂的话涉及的东西就多了，那俺就没兴趣了，人工智能(好恐怖)，俺只喜欢简单的东西。<br />
本文来源于可可熊的窝 http://cocobear.info/blog , 原文地址： http://cocobear.info/blog/2008/08/04/python-pic-recognize/ <br />
</p>
<img src ="http://www.blogjava.net/xiaomage234/aggbug/253212.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2009-02-04 11:32 <a href="http://www.blogjava.net/xiaomage234/archive/2009/02/04/253212.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从CSDN的趣味题学Python [转]</title><link>http://www.blogjava.net/xiaomage234/archive/2009/02/04/253194.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Wed, 04 Feb 2009 02:45:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2009/02/04/253194.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/253194.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2009/02/04/253194.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/253194.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/253194.html</trackback:ping><description><![CDATA[from : <a href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html">http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html</a>&nbsp;&nbsp; 附评论<br />
<br />
<div class="postbody">
<p>最近在论坛闲逛，先后参与了两题算法趣味题目。</p>
<ol>
    <li>题目1是要求算一任意长度字符串中不同的字符以及它的个数。
    <li>题目2是把一段字符串用&#8220;右起竖排&#8221;的古文格式输出。 </li>
</ol>
<p>题目难度不大，都是针对字符串的操作，逻辑比较简单，灵活在对不同语言、语法的掌握程度。（原文分别在：<a href="http://topic.csdn.net/u/20090113/11/fae56d8d-dc0b-4a22-899e-3f5f8986ffaa.html" target="_blank">1</a>，<a href="http://topic.csdn.net/u/20081107/21/43902df6-506c-4ee4-aa83-dcdab005cc56.html" target="_blank">2</a>。）</p>
<p>看了大家用C++、C#、Java等语言的实现，总感觉牛刀杀鸡太麻烦，有兴趣的朋友可以自己写写看或者直接看原文的网友回复。我最近一段时间Python写的比较多，读到这些题目时候，就有一种跃跃欲试的冲动。因为我知道用Perl，Python,Ruby等动态语言来做这类题目，会是非常理想的。后来我做了这两道题目，结果也令人满意，代码之简洁保持在所有答案的前列。</p>
<p>先看第一题Python解答：</p>
<pre>dic = {}
for s in "<span style="color: #8b0000">abcdefgabc</span>":
dic[s] = 1 <span style="color: #0000ff">if</span> s not in dic <span style="color: #0000ff">else</span> (dic[s]+1)
<span style="color: #0000ff">print</span> '\n'.<span style="color: #0000ff">join</span>('%s,%s' % (k, v) for k, v in dic.items())</pre>
<p>输出结果：</p>
<pre>a,2
c,2
b,2
e,1
d,1
g,1
f,1</pre>
<p>Python的四行代码分别做了dictionary的声明，赋值，字符串的遍历，以及高效拼接。</p>
<p>如果还没有看出它的简洁和强大的话，请看第二题的解法：</p>
<pre><span style="color: #0000ff">def</span> main(offset=6):
<span style="color: #0000ff">    string</span> = u'<code>静夜思 李白床前明月光，疑似地上霜。举头望明月，低头思故乡。090131'</code>
a = [[' ']*offset for row in xrange(offset)]
for i in xrange(offset):
for j in xrange(offset):
a[i][j] = <span style="color: #0000ff">string</span>[j + i*offset]
b = [[r[col] for r in a[::-1]] for col in xrange(len(a[0]))]
<span style="color: #0000ff">    print</span> '\n'.<span style="color: #0000ff">join</span>([u'┊'.<span style="color: #0000ff">join</span>(unicode(c) for c in row)for row in b])</pre>
<p>输出结果：</p>
<pre><code>0┊低┊举┊疑┊床┊静<br />
9┊头┊头┊似┊前┊夜<br />
0┊思┊望┊地┊明┊思<br />
1┊故┊明┊上┊月┊ <br />
3┊乡┊月┊霜┊光┊李<br />
1┊。┊，┊。┊，┊白<br />
</code></pre>
<p>这题如果用C#等实现，代码要在20行以上。下面我简单介绍一下这几行代码：</p>
<ol>
    <li>第3行，在Python里面二维&#8220;数组&#8221;通过嵌套list来实现，这里初始化一个6行6列的二维数组；
    <li>第7行，我们把&#8220;矩阵&#8221;顺时针旋转了90度（行列置换，并且对置换后的行首尾对调-这里的::-1就是用来置换一个list的trick）；
    <li>最后一行，我们把数组里的每行中元素，每行之间分别用两个不同字符拼接起来。join方法以及for..in..语句在python中是相当常见的用法。 </li>
</ol>
<p>通过这两题，我们看到Python在处理字符串时候的十分灵活方便，虽然一种语言的好坏不应完全靠是否简洁来衡量，但对于我个人而言，Python是目前我用过的最好的语言。而且对于趣味题来说，这不就是我们解题的趣味所在吗？</p>
<div id="EntryTag">Tag标签: <a href="http://www.cnblogs.com/chagel/tag/python/">python</a></div>
</div>
<div class="postfoot">Posted on 2009-02-01 07:01 <a href="http://www.cnblogs.com/chagel/">Chagel</a> 阅读(1328) <a href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#Post">评论(14)</a> &nbsp;<a href="http://www.cnblogs.com/chagel/admin/EditPosts.aspx?postid=1381820">编辑</a> <a href="http://www.cnblogs.com/chagel/AddToFavorite.aspx?id=1381820">收藏</a> <a onclick="PutInWz();return false;" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#">网摘</a> <img height="1" src="http://www.cnblogs.com/chagel/aggbug/1381820.html?type=1&amp;webview=1" width="1"  alt="" /> <!-- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:Description rdf:about="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html" dc:identifier="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html" dc:title="从CSDN的趣味题学Python" trackback:ping="http://www.cnblogs.com/chagel/services/trackbacks/1381820.aspx"  />
</rdf:RDF>
--></div>
<div id="AjaxHolder_UpdatePanel1"><a name="pagedcomment"></a>
<h3>Feedback</h3>
<div class="post">
<div class="posthead">
<h2><a title="permalink: re: 从CSDN的趣味题学Python" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#1440009">#1楼</a>&nbsp;<a name="1440009"></a> &nbsp;&nbsp;<a onclick='return SetReplyAuhor("Jeffrey Zhao")' href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#post">回复</a>&nbsp;&nbsp;<a onclick="GetQuote(1440009);return false" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#post">引用</a>&nbsp;&nbsp;<a title="查看该作者发表过的评论" href="http://www.cnblogs.com/CommentsByAuthor.aspx?author=Jeffrey+Zhao" target="_blank">查看</a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl00_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl00$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl00_EditLink"></a> </h2>
2009-02-01 09:50 by <a id="AjaxHolder_Comments_CommentList_ctl00_NameLink" href="http://www.cnblogs.com/JeffreyZhao/" target="_blank">Jeffrey Zhao</a>&nbsp;<a class="sendMsg2This" title="给此人发送站内短消息" href="http://space.cnblogs.com/msg/send/Jeffrey+Zhao">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a> </div>
<div class="postbody">从CSDN的趣味题学C# 3.0 <br />
<a title="从CSDN的趣味题学C# 3.0" href="http://www.cnblogs.com/JeffreyZhao/archive/2009/02/01/1381867.html">http://www.cnblogs.com/JeffreyZhao/archive/2009/02/01/1381867.html</a></div>
</div>
<div class="post">
<div class="posthead">
<h2><a title="permalink: re: 从CSDN的趣味题学Python" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#1440037">#3楼</a>&nbsp;<a name="1440037"></a> &nbsp;&nbsp;<a onclick='return SetReplyAuhor("JimLiu")' href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#post">回复</a>&nbsp;&nbsp;<a onclick="GetQuote(1440037);return false" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#post">引用</a>&nbsp;&nbsp;<a title="查看该作者发表过的评论" href="http://www.cnblogs.com/CommentsByAuthor.aspx?author=JimLiu" target="_blank">查看</a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl01_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl01$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl01_EditLink"></a> </h2>
2009-02-01 10:24 by <a id="AjaxHolder_Comments_CommentList_ctl01_NameLink" href="http://www.cnblogs.com/jimnox/" target="_blank">JimLiu</a>&nbsp;<a class="sendMsg2This" title="给此人发送站内短消息" href="http://space.cnblogs.com/msg/send/JimLiu">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a> </div>
<div class="postbody">老赵的代码不错，我改进下<br />
第二个<br />
static void Count(string message) {<br />
message<br />
.GroupBy(c =&gt; c)<br />
.ToList()<br />
.ForEach(p =&gt; Console.WriteLine("{0}, {1}", p.Key, p.Count()));<br />
}<br />
<br />
这样似乎更爽一些，呵呵</div>
</div>
<div class="post">
<div class="posthead">
<h2><a title="permalink: re: 从CSDN的趣味题学Python" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#1440039">#4楼</a>&nbsp;<a name="1440039"></a> &nbsp;&nbsp;<a onclick='return SetReplyAuhor("Jeffrey Zhao")' href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#post">回复</a>&nbsp;&nbsp;<a onclick="GetQuote(1440039);return false" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#post">引用</a>&nbsp;&nbsp;<a title="查看该作者发表过的评论" href="http://www.cnblogs.com/CommentsByAuthor.aspx?author=Jeffrey+Zhao" target="_blank">查看</a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl02_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl02$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl02_EditLink"></a> </h2>
2009-02-01 10:26 by <a id="AjaxHolder_Comments_CommentList_ctl02_NameLink" href="http://www.cnblogs.com/JeffreyZhao/" target="_blank">Jeffrey Zhao</a>&nbsp;<a class="sendMsg2This" title="给此人发送站内短消息" href="http://space.cnblogs.com/msg/send/Jeffrey+Zhao">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a> </div>
<div class="postbody">@JimLiu <br />
那个select的确可以省，我是习惯于先搞出数据来，然后添加行为，而不是在行为里继续计算</div>
</div>
<div class="post">
<div class="posthead">
<h2><a title="permalink: re: 从CSDN的趣味题学Python" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#1440046">#5楼</a>&nbsp;<a name="1440046"></a> &nbsp;&nbsp;<a onclick='return SetReplyAuhor("JimLiu")' href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#post">回复</a>&nbsp;&nbsp;<a onclick="GetQuote(1440046);return false" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#post">引用</a>&nbsp;&nbsp;<a title="查看该作者发表过的评论" href="http://www.cnblogs.com/CommentsByAuthor.aspx?author=JimLiu" target="_blank">查看</a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl03_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl03$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl03_EditLink"></a> </h2>
2009-02-01 10:34 by <a id="AjaxHolder_Comments_CommentList_ctl03_NameLink" href="http://www.cnblogs.com/jimnox/" target="_blank">JimLiu</a>&nbsp;<a class="sendMsg2This" title="给此人发送站内短消息" href="http://space.cnblogs.com/msg/send/JimLiu">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a> </div>
<div class="postbody">@Jeffrey Zhao<br />
呵呵，是因为先select了好重复用吧，习惯问题，我的喜欢就根据题目变化。</div>
</div>
<div class="post">
<div class="posthead">
<h2><a title="permalink: re: 从CSDN的趣味题学Python" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#1440094">#5楼</a>&nbsp;<a name="1440094"></a> &nbsp;&nbsp;<a onclick='return SetReplyAuhor("young5335")' href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#post">回复</a>&nbsp;&nbsp;<a onclick="GetQuote(1440094);return false" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#post">引用</a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl04_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl04$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl04_EditLink"></a> </h2>
2009-02-01 11:59 by <a id="AjaxHolder_Comments_CommentList_ctl04_NameLink" target="_blank">young5335 [未注册用户]</a> </div>
<div class="postbody">a="abcdefgabc"<br />
myset=set(a)<br />
for s in myset:<br />
print(str(a.count(s))+" "+s)<br />
<br />
2 a<br />
2 c<br />
2 b<br />
1 e<br />
1 d<br />
1 g<br />
1 f</div>
</div>
<div class="post">
<div class="posthead">
<h2><a title="permalink: re: 从CSDN的趣味题学Python" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#1440121">#6楼</a>&nbsp;<a name="1440121"></a> &nbsp;&nbsp;<a onclick='return SetReplyAuhor("young5335")' href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#post">回复</a>&nbsp;&nbsp;<a onclick="GetQuote(1440121);return false" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#post">引用</a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl05_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl05$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl05_EditLink"></a> </h2>
2009-02-01 13:24 by <a id="AjaxHolder_Comments_CommentList_ctl05_NameLink" target="_blank">young5335 [未注册用户]</a> </div>
<div class="postbody">import math<br />
colSize=6<br />
string="静夜思 李白床前明月光，疑似地上霜。举头望明月，低头思故乡。0901311"<br />
iLen=math.ceil(len(string)/colSize)<br />
l=list(reversed(([string[i*colSize:i*colSize+colSize].ljust(colSize,' ') for i in range(0,iLen)])))<br />
for i in range(colSize):<br />
for j in range(iLen):<br />
print(l[j][i],end=" ")<br />
print()<br />
<br />
python语法我真的快忘光光了.</div>
</div>
<div class="post">
<div class="posthead">
<h2><a title="permalink: re: 从CSDN的趣味题学Python" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#1440122">#7楼</a>&nbsp;<a name="1440122"></a> &nbsp;&nbsp;<a onclick='return SetReplyAuhor("young5335")' href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#post">回复</a>&nbsp;&nbsp;<a onclick="GetQuote(1440122);return false" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#post">引用</a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl06_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl06$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl06_EditLink"></a> </h2>
2009-02-01 13:28 by <a id="AjaxHolder_Comments_CommentList_ctl06_NameLink" target="_blank">young5335 [未注册用户]</a> </div>
<div class="postbody">要改成跟楼主一样的分隔符,把end="┊"</div>
</div>
<div class="post">
<div class="posthead">
<h2><a title="permalink: re: 从CSDN的趣味题学Python" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#1440132">#8楼</a>&nbsp;<a name="1440132"></a> &nbsp;&nbsp;<a onclick='return SetReplyAuhor("young5335")' href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#post">回复</a>&nbsp;&nbsp;<a onclick="GetQuote(1440132);return false" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#post">引用</a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl07_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl07$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl07_EditLink"></a> </h2>
2009-02-01 13:44 by <a id="AjaxHolder_Comments_CommentList_ctl07_NameLink" target="_blank">young5335 [未注册用户]</a> </div>
<div class="postbody">PHP的:<br />
$a="abcdefgabc";<br />
$result=count_chars($a,1);<br />
array_walk($result,create_function('$v,$k','echo chr($k)." ".$v."&lt;br/&gt;";')); <br />
<br />
a 2<br />
b 2<br />
c 2<br />
d 1<br />
e 1<br />
f 1<br />
g 1<br />
</div>
</div>
<div class="post">
<div class="posthead">
<h2><a title="permalink: re: 从CSDN的趣味题学Python" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#1440459">#9楼</a>&nbsp;<a name="1440459"></a> &nbsp;&nbsp;<a onclick='return SetReplyAuhor("Icebird")' href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#post">回复</a>&nbsp;&nbsp;<a onclick="GetQuote(1440459);return false" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#post">引用</a>&nbsp;&nbsp;<a title="查看该作者发表过的评论" href="http://www.cnblogs.com/CommentsByAuthor.aspx?author=Icebird" target="_blank">查看</a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl08_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl08$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl08_EditLink"></a> </h2>
2009-02-02 00:00 by <a id="AjaxHolder_Comments_CommentList_ctl08_NameLink" href="http://www.cnblogs.com/Icebird/" target="_blank">Icebird</a>&nbsp;<a class="sendMsg2This" title="给此人发送站内短消息" href="http://space.cnblogs.com/msg/send/Icebird">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a> </div>
<div class="postbody">JavaScript: <br />
<br />
var s = "hello"; <br />
var arr = s.split(''); <br />
var o = {}; <br />
var c; <br />
for (var i = 0; i &lt; arr.length; i++) <br />
{ <br />
o[arr[i]] = (o[arr[i]] ? o[arr[i]] : 0) + 1; <br />
} <br />
<br />
var result = ""; <br />
for (var p in o) <br />
{ <br />
result += p + ", " + o[p] + "\r\n"; <br />
} <br />
<br />
alert(result); <br />
</div>
</div>
<div class="post">
<div class="posthead">
<h2><a title="permalink: re: 从CSDN的趣味题学Python" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#1440622">#10楼</a>&nbsp;<a name="1440622"></a> &nbsp;&nbsp;<a onclick='return SetReplyAuhor("赖勇浩")' href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#post">回复</a>&nbsp;&nbsp;<a onclick="GetQuote(1440622);return false" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#post">引用</a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl09_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl09$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl09_EditLink"></a> </h2>
2009-02-02 10:22 by <a id="AjaxHolder_Comments_CommentList_ctl09_NameLink" target="_blank">赖勇浩 [未注册用户]</a> </div>
<div class="postbody">&gt;&gt;&gt; from collections import defaultdict<br />
&gt;&gt;&gt; adict = defaultdict(int)<br />
&gt;&gt;&gt; for s in "abcdefgabc":<br />
... adict[s] += 1<br />
... <br />
&gt;&gt;&gt; print '\n'.join('%s,%s' % (k, v) for k, v in adict.iteritems())<br />
a,2<br />
c,2<br />
b,2<br />
e,1<br />
d,1<br />
g,1<br />
f,1<br />
</div>
</div>
<div class="post">
<div class="posthead">
<h2><a title="permalink: 借鉴赖勇浩 的ruby实现" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#1440674">#11楼</a>&nbsp;<a name="1440674"></a> &nbsp;&nbsp;<a onclick='return SetReplyAuhor("young5335")' href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#post">回复</a>&nbsp;&nbsp;<a onclick="GetQuote(1440674);return false" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#post">引用</a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl10_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl10$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl10_EditLink"></a> </h2>
2009-02-02 11:21 by <a id="AjaxHolder_Comments_CommentList_ctl10_NameLink" target="_blank">young5335 [未注册用户]</a> </div>
<div class="postbody">a="abcdefgabc"<br />
b={}<br />
a.each_char { |x|b.store(x,a.count(x)) }<br />
b.each {|k,v| puts k+" "+v.to_s}</div>
</div>
<div class="post">
<div class="posthead">
<h2><a title="permalink: re: 从CSDN的趣味题学Python" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#1440841">#12楼</a>&nbsp;<a name="1440841"></a> &nbsp;&nbsp;<a onclick='return SetReplyAuhor("hehehe")' href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#post">回复</a>&nbsp;&nbsp;<a onclick="GetQuote(1440841);return false" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#post">引用</a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl11_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl11$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl11_EditLink"></a> </h2>
2009-02-02 15:18 by <a id="AjaxHolder_Comments_CommentList_ctl11_NameLink" target="_blank">hehehe [未注册用户]</a> </div>
<div class="postbody">试试Groovy:<br />
<br />
('abcdefgabc' as List).groupBy{it}.each{k, v -&gt; println "$k, ${v.size()}"}</div>
</div>
<div class="post">
<div class="posthead">
<h2><a title="permalink: re: 从CSDN的趣味题学Python" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#1440858">#13楼</a>&nbsp;<a name="1440858"></a> &nbsp;&nbsp;<a onclick='return SetReplyAuhor("hehehe")' href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#post">回复</a>&nbsp;&nbsp;<a onclick="GetQuote(1440858);return false" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#post">引用</a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl12_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl12$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl12_EditLink"></a> </h2>
2009-02-02 15:37 by <a id="AjaxHolder_Comments_CommentList_ctl12_NameLink" target="_blank">hehehe [未注册用户]</a> </div>
<div class="postbody">试试Groovy(第二题):<br />
<br />
def a = '床前明月光 疑似地上霜 举头望明月 低头思故乡'.tokenize(' ')<br />
<br />
5.times{row -&gt;<br />
println a.collect{it[row]}.reverse().join('|')<br />
}<br />
<br />
<br />
低|举|疑|床<br />
头|头|似|前<br />
思|望|地|明<br />
故|明|上|月<br />
乡|月|霜|光<br />
<br />
</div>
</div>
<div class="post">
<div class="posthead">
<h2><a title="permalink: re: 从CSDN的趣味题学Python" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#1440879">#14楼</a>&nbsp;<a name="1440879"></a><a name="Post"></a> &nbsp;&nbsp;<a onclick='return SetReplyAuhor("zealtea")' href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#post">回复</a>&nbsp;&nbsp;<a onclick="GetQuote(1440879);return false" href="http://www.cnblogs.com/chagel/archive/2009/02/01/1381820.html#post">引用</a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl13_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl13$DeleteLink','')"></a>&nbsp;&nbsp;<a id="AjaxHolder_Comments_CommentList_ctl13_EditLink"></a> </h2>
2009-02-02 16:04 by <a id="AjaxHolder_Comments_CommentList_ctl13_NameLink" target="_blank">zealtea [未注册用户]</a> </div>
<div class="postbody">txt = u"静夜思 李白床前明月光，疑似地上霜。举头望明月，低头思故乡。"<br />
offset = 6<br />
<br />
a =[i[::-1] for i in zip(*[txt[i:i+offset] for i in range(0, len(txt), offset)])]<br />
<br />
for i in a:<br />
print "|".join(i)</div>
</div>
</div>
<img src ="http://www.blogjava.net/xiaomage234/aggbug/253194.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2009-02-04 10:45 <a href="http://www.blogjava.net/xiaomage234/archive/2009/02/04/253194.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Perl入门</title><link>http://www.blogjava.net/xiaomage234/archive/2008/08/09/221014.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Sat, 09 Aug 2008 06:44:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2008/08/09/221014.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/221014.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2008/08/09/221014.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/221014.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/221014.html</trackback:ping><description><![CDATA[<p>Perl 是一种能完成任务的语言。
<p>当然，如果你的工作就是写程序，那么从理论上来讲，你可以使用任何&#8220;完整&#8221;的计算机语言来完成任务。但是从我们的经验来看，计算机语言的区别很大程度上不在它能干什么，而是在它做事情的时候是否简单。从一个极端来说，那些所谓的第四代语言做某些事情的时候相当容易，但是做其它一些事情的时候几乎不可能。从另外一个极端来看，那些所谓的工业级的语言在做任何事情的时候都几乎一样困难。
<p>Perl 是不同的语言。从一开始，Perl 就设计成可以把简单工作简单化，同时又不失去处理困难问题能力的语言。
<p>那什么是&#8220;简单工作&#8221;呢？当然就是那些你每天都要干的。你需要一种可以很容易操作数字，文本，文件和目录，计算机和网络，特别是程序的语言。这种语言应该很容易运行外部的程序并且扫描这些程序的输出获取感兴趣的东西。而且它还应该很容易能把这些你感兴趣的东西交给其它程序做特殊的处理。当然，这种语言还应该很容易在任何现代的操作系统上可以移植地编译和运行。
<p>Perl 做到了上述所有需求，甚至更多。
<p>Perl 最初是当做一种 Unix 的胶水语言设计的，但是她早就移植到大多数其它操作系统里了。因为 Perl 几乎可以在任何地方运行，所以 Perl 可以说是当今最具有移植性的编程环境。要想写可移植的 C/C++ 程序，你得在程序里加上一大堆 #ifdef 标签来区分不同的系统。要想写可移植的 Java 程序，你必须理解每种新的 Java 实现的特质。要想写可移植的
<p>shell，你可能要记住每条命令在每种操作系统上的语法，走运的时候你可能可以找到一些公共的东西。而要想写可移植的 Visual Basic 程序，那么你只需要对&#8220;移植&#8221;有个更灵活的定义就可以了。
<p>我们很高兴的是 Perl 避免了所有这些问题，同时还保留了这些语言中的许多优点，同时还有一些自己的特色。Perl 的特色来自许多方面：它的特性集的工具，Perl 社区的创造性，以及开源运动的大环境。不过，许多这些特性都是混合的东西；Perl 的身世复杂，它总是把事物看成是优点的不同方面，而不是弱点。Perl 是&#8220;背黑锅我来&#8221;的语言。如果你觉得自己陷入一团乱麻之中，非常渴望自由，那么请使用 Perl。
<p>Perl 是跨文化的。Perl 的爆炸性增长很大程度上是因为那些前 Unix 系统程序员的渴望，他们希望从他们的&#8220;老家&#8221;带着尽可能多的东西。对于他们而言，Perl 是可移植的 Unix 文化蒸馏器，是"此路不通"的沙漠中的绿洲。从另外一个角度来看，Perl 还可以从另外一个方向运转：在 Windows 上工作的 web 设计者通常会非常开心地发现他们的 Perl 程序可以不加修改地在 Unix 服务器上跑。 <br />
<br />
对于只是喜欢她的人来说，Perl 是实用抽取和报表语言（Practical Extractoin and Report Language）。对那些热爱她的人而言，她是变态电子垃圾制造者（Pathologically Electric Rubbish Lister）。在少数人眼里，Perl 是毫无意义的重复练习。不过世界需要一点点冗余。<br />
<br />
<a href="/Files/xiaomage234/perl-zh-third.rar">/Files/xiaomage234/perl-zh-third.rar</a></p>
<img src ="http://www.blogjava.net/xiaomage234/aggbug/221014.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2008-08-09 14:44 <a href="http://www.blogjava.net/xiaomage234/archive/2008/08/09/221014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>