要在Windows平台的Apache中使用Python,当然必须得先安装Apache和Python。Apache我使用的是XAMPP,而Python则随便一搜,就可以找到下载链接。由于这个解决方案要通过安装Apache模块mod_python来实现,而mod_python的当前版本3.3.1只支持Apache 2.2和Python 2.5,所以不得不先缷载已经装好的Python 3.0,重新下载安装了Python 2.5。mod_python是一个Apache模块,它可以将Python解释器嵌入到Apache服务器中(详情可以看这里)。

让Apache支持Python的过程很简单,只要3步。

  1. 下载mod_python模块安装程序(注意文件名后面Python和Apache的版本号要与自己已经安装的版本一致;文件名前面的版本号则是mod_python的,文件名示例:mod_python-3.3.1.win32-py2.5-Apache2.2.exe),然后安装,安装向导会自动找到Python路径,但可能需要我们手工指定Apache路径,安装到最后,向导还会提示你如何修改Apache配置文件(参见下一步)并给出了后续步骤的英文说明
  2. 让Apache加载mod_python模块。在Apache安装目录下找到其配置文件apache\conf\httpd.conf,打开,搜“LoadModule”,找到加载模块的地方,然后添加一条语句:LoadModule python_module modules/mod_python.so,重新启动Apache。
  3. 在htdocs目录下新建一个目录,如:“py”。进入py目录,新建一个文本文件,并命名为“.htaccess”,加入下列3条指令:
    
    AddHandler mod_python .py
    PythonHandler mptest
    PythonDebug On
    

    这里第一条指令是将所有URL末尾为.py的请求转发给mod_python处理程序,mod_python接收到请求之后再寻找适当的PythonHandler处理程序。第二条指令只定义了一个mptest处理程序。最后一条是启用Python代码调试功能,以便在代码运行出错时输出Python解释器返回的错误。

完成以上3步之后,就可以编写Python文件并进行测试了。在py目录下新建 mptest.py 文件,打开后添加如下代码:


from mod_python import apache

def handler(req):
	req.content_type = 'text/plain'
	req.write("Hello World!")
	return apache.OK

保存。打开浏览器,输入http://localhost/py/mptest.py,回车。看到“Hello World!”了吗?

实际上,由于前面只明确将mptest设置为处理程序,所以无论浏览器URL中的.py文件名是什么(如:login.py、default.py),都将被转发给mptest.py文件来处理,都会返回“Hello World!”。怎么办呢?长话短说,可以将上面第3步中的代码替换成如下所示:


AddHandler mod_python .py
PythonHandler mod_python.publisher
PythonDebug On

更多内容,参见Mod_python ManualIntroducing mod_python

原文链接:http://www.boxesandarrows.com/view/content-strategy-the

作者:Rachel Lovinger,美国最大的互动广告公司Razorfish(睿域营销咨询公司)的内容策略领导人。

不知道什么是“内容策略”?这很正常。我在公司的头衔里就有这个词组。每当有人问起我靠什么过活时,我心里都十分纠结。许多人对这个词组没有什么概念,但在谈话间,我发现多数人对它的理解都是错误的。这些人觉得“内容策略”就是写文案的意思。虽然不能说完全不着边,但总归还是没说到点子上。

近来,我经常使用一个类比,我认为内容策略之于写稿,就像信息架构之于设计。我为自已能想到这个类比感到很满意,毕竟在6年前,当Web发展的第一波开始退潮时,“信息架构”到底是什么意思也没有几个人知道。

当前的问题在于,必须想办法向不理解内容策略的人解释清楚:内容策略的主要目标是使用文字和数据,创造出没有歧义的内容,从而为有意义的交互体验提供支持。为此,我们必须成为善于跟形形色色的人有效沟通的专家。

然而,到底是什么原因导致了我们的工作那么难于跟别人解释呢?

问题或许在于,内容是无处不在的,所以任何人都认为自己很明白。只要你能读会写,就可以制造内容,对吧?(近6000个博客可以证明这一点。)但事实上,随着交互体验变得日益复杂,内容的本质也变得越来越复杂了。这时候,只从表面上来理解内容已经远远不够了。数字时代的内容策略专家必须成为数据方面的哲学家,努力探寻有关内容的抽象理论,而这一切就要从回答“什么是内容”这个问题开始。

一切皆内容

在我们为一家国际娱乐杂志的网站开发复杂的元数据系统时,我的同事也是好朋友Chris Sizemore说:“一切皆内容。”我还比较认同这个观点。

一切皆内容吗?设计是吗?是。结构呢?也是。元数据呢?当然也是了。你可能觉得对这句话还应该有更深刻的解释。好吧,那就只能说:“准确地讲,一切皆内容。”

你可能会问,在崇尚视觉效果的Web设计领域,着意关注内容的需求源自何处呢?随着网站功能的日益丰富,Web用户的品味也越来越高。要想吸引人,你的站点就必须提供到位的交互体验,以及更多配套的内容。但简单地增加内容是不行的,你必须让内容有的放矢、言之有物,而且还要有意义。

提到决定事物是否有意义的因素,我可以罗列出一大串,但就Web应用而言,我认为最主要的一个因素是联系。Z文章与点击的主题有关系吗?给我看看。B图片与我已经见过的一样吗?拜托,我可不想再看到同一张图片了!诸如此类微妙、动态而又复杂的关系,都需要找到一种计算机能够遵照执行的方式精确地表达出来。那我们就举个看起来似乎很直观的例子,比如说“相同”:你怎么确定两段内容是相同的?

你可能会说任何数据记录都是唯一的,因此是否相同一看便知。但这对于找出两段无论从哪方面说都完全一样的文字之间的关系却毫无帮助。噢,大概在内存中的字节相同可以说明两段内容相同罢。那么一篇文章与它的翻译版呢?一张图片与它的缩放版呢?从读者角度说,它们是相同的,只不过有一张小一些。还是那张图片,它与它的裁切版相同吗?

问到这,“相同意味着什么?”这个命题合乎有点像推理了。然而,在构建CMS(内容管理系统)的时候,这个问题却有着非常实际的含义。你怎样取得一篇文章及其翻译版,会对文章的编排、发表以及最终在站点上使用的方式造成巨大差异。而一张图片与它的缩放版、裁切版在CMS中保存的方式,则很可能会对呈现及访问它们产生意想不到的影响。

临界量

如果你只想展示非常短的一条信息,那(也许)可以随便把它一放,然后让用户自己去理解就行了。

图1 极其简单的网站用不着IA或内容策略

随着要展示的信息不断增多,用不了多久,就需要运用某些结构来组织这些信息,以方便用户找到它们。而这正是信息架构要解决的问题,即通过应用组织原则和视觉提示,让用户一打开站点就能迅速定位目标,而不必多费脑筋。如果碰巧赶上信息架构师(IA,Information Architect)对文字有兴趣,那么他可能会仔细地考虑按钮上的文本到底用什么语言最有利于传达信息。如果信息架构师没有这份心思或者经验,那么这时候就可以轮到内容策略专家(CS,Content Strategist)上场了。CS此时也要与IA密切协作,以确保站点的组织井然有序,同时还要确保相应的内容各就各位。

图2 复杂一些的站点就需要组织了

在设计和构建内容量极大的网站时,我们发现单靠手工组织这些内容是不现实的。在这种情况下,就需要用到自动化的、复杂的算法来解放人类了。为此,内容中必须包含机器能够识别的固有信息,例如通过搜索、浏览和相关链接来维系数据驱动的应用。内容策略专家的责任就是专注于怎么才能让内容有意义,同时也让站点的设计最恰当地利用内容。

实战演练

在经过了一番哲学思辨之后,我们终于搞清楚了谁要为内容负责了。那么,到底怎样才能让内容有意义呢?

为了让人们感觉内容与他们有关,必须选择那些对实现沟通目标效果最好的词汇和句子结构。至于表达方式,应该在深刻理解内容创作者的意图和内容消费者的需求的基础上来确定。为此,可以借助类似于编辑指南的手册来提供指导,或者提供一些让别人能够按照相同表达方式组织内容和消息的示例。

为了让机器更好地处理内容,需要将内容结构化并定义标准的元素,从而方便内容的使用和重用。需要对内容分门别类,为不同类别添加相应的元数据,以便于识别。需要在内容之间建立关联,使得它们的背景丰富,不显得单薄,同时也能支持各种复杂的功能。

为了保证创建内容的效率,需要评估和推荐一些解决方案,用于创建、增强、组织和使用内容,包括内容管理系统、元数据相关的工具、搜索引擎及方便的导航应用程序。需要创立业务规则及工作流,进一步优化这些工具和系统的使用。

为了保证内容面面俱到,需要确定站点的内容需求,清查已有的内容,发现缺口,落实新增内容的补给渠道,并控制将这些内容融合到产品中去的整个过程。在既定的背景和参考资料支持下,可能还要编写标签、概述,甚至更长的内容。

在做以上这些事并创造相应成果的过程中,不要因为过时的哲学问题而让实际上简单的问题复杂化。试试这个脑筋急转弯:“具备什么样品质的内容才能历经三个月都不会磨灭其价值,而又是什么样的品质会导致内容甫一问世就面临过时的危险?”(提示:没有唯一的答案。)

内容策略专家的策略

如果你是一名内容策略专家。

  • 问自己或同事一些有关内容的难题(例如:“内容是什么?”“什么因素会提升内容的价值?”)。
  • 头脑风暴,探讨怎样生成更有意义的内容,如何确定质量好与坏的标准。落实到一个投入/产出分析模型上。
  • 比较不同的内容模型并确定各自适合的用途。
  • 关注一些新出现的能够有效解决内容问题的工具。创造性地使用这些工具,包括发现新用途和新用法,然后把这些创意告诉工具的开发人员,以促进工具改进。

如果你与内容策略专家合作。

  • 花点时间认真严肃地思考一下内容。在讨论内容问题,而内容又似乎不是问题的直接诱因时,请保持几分耐心——有时候,只有这种态度才能拿出理想的内容方案。
  • 在开始规划站点之初,就在项目中考虑内容。千万不要在站点已经构建和设计完成后,才意识到需要找些内容来填充页面。

如果你没有与内容策略专家协作,但有这个意愿。

  • 向组织的负责人说明内容策略专家扮演的角色,以及他们为什么可以节省时间和精力,可以帮助避免问题,可以提升最终产品的品质。在项目收尾时,可以举出一些能够说明“如果早点想到这一点就好了”的例子。根据这些与内容相关的例子,你会发现自己可能成功了一半了。
  • 如果不行,再了解组织中哪个人对内容理论更感兴趣,鼓励他们多做一些相关的研究。过一段时间后,再给他们摆事实,讲道理,然后你的心愿就可以达成 了。

内容策略并没有一个放之四海而皆准的定义,不同的人对它的理解也不怎么一致,但这可不是对内容策略视而不见的理由。只有深刻认识到内容的重要性,像个哲学家一样思考问题,你才能够做到随机应变。

出处:RegExLib.com Regular Expression Cheat Sheet (.NET)

元字符 说明
^ 匹配字符串的开始位置
$ 匹配字符串的结束位置
. 匹配任意单个字符(换行符 \n 除外)
| 交替
{…} 指定要限定的数量
[...] 指定要匹配的字符集
(…) 对表达式进行逻辑分组
* 匹配零或多个前面的表达式
+ 匹配一或多个前面的表达式
? 匹配零或一个前面的表达式
\ 放在上面任何一个字符之前,表示匹配该字符本身。放在其他特殊字符后面,表示字符转义(见下面)
字符转义 说明
原始字符 除 . $ ^ { [ ( | ) ] } * + ? \ 之外的字符均匹配自身
\a 匹配铃声(闹铃)\u0007
\b 在[]中匹配一个空格 \u0008,在其他情况下匹配字边界(位于 \w 和 \W 字符之间)
\t 匹配制表符 \u0009
\r 匹制回车符 \u000D
\v 匹配垂直制表符 \u000B
\f 匹配换页符 \u000C
\n 匹配换行符 \u000A
\e 匹配退出键(符) \u001B
\040 匹配以八进制表示的 ASCII 字符(最多三位数);在没有前导零的情况下,如果只有一位数字或者相应数字与某个捕获组的编号对应,那就是反向引用(backreference)。字符 \040 表示一个空格。
\x20 匹配以十六进制表示的 ASCII 字符(两位数)
\cC 匹配 ASCII 控制符,例如 \cC 匹配 Ctrl+C
\u0020 匹配以十六进制表示的 Unicode 字符
\* 反斜杠后面如果不是一个可转义的字符,则匹配该字符本身。例如,\* 就相当于\x2A
字符类 说明
. 匹配除 \n 之外的任意字符。
[aeiou] 匹配特定字符集中包含的任意一个字符
[^aeiou] 匹配特定字符集中不包含的任意一个字符
[0-9a-fA-F] 连字符(-)用来指定连续的字符范围
\p{name} 匹配由{name}指定的命名字符类中的任意字符
\P{name} 匹配不包含在{name}指定的组或块范围中的文本
\w 匹配英文数字字母字符,在指定兼容ECMAScript的情况下,等价于[a-zA-Z0-9]
\W 匹配非英文数字字母字符,在指定兼容ECMAScript的情况下,等价于[^a-zA-Z0-9]
\s 匹配任意空白字符,在指定兼容ECMAScript的情况下,等价于[\f\n\r\t\v]
\S 匹配任意非空白字符,在指定兼容ECMAScript的情况下,等价于[^\f\n\r\t\v]
\d 匹配数字字符,在指定兼容ECMAScript的情况下,等价于[0-9]
\D 匹配非数字字符,在指定兼容ECMAScript的情况下,等价于[^0-9]

《JavaScript高级程序设计(第2版)》上市将近一个月了。这期间,为了制作勘误,我在重读这本书。与此同时,几位热心读者也将发现的一些错误迅速通过邮件发给了我,或者在出版社(图灵公司,http://www.turingbook.com)网站本书页面中提交了勘误。经过确认,目前有11处需要修改的地方(详见后面列出的查看勘误的页面)。

这些勘误信息主要来自@凌空一叶同学,特此致谢!

需要特别说明的是,图灵公司自今年以来,面向广大读者推出了“图灵5周年系列活动之‘有奖DEBUG’活动”。只要读者针对图灵公司新近出版的图书提交勘误,经过确认,每个错误向读者赠送价值5元的“购书码洋”,待累积到一定数额,就可以换取等值图书。此举旨在鼓励读者反馈勘误,提升图书质量。活动详情请参见:http://www.turingbook.com/Newswires/ShowNewswire-174.aspx

欢迎广大读者朋友踊跃迅速地反馈勘误信息,以便在后续印次及时更正,惠及更多读者。反馈勘误之前,请务必注意:

  1. 为了确保您的反馈得到积分奖励,请统一到图灵公司网站本书页面(附后)提交勘误;
  2. 请不要重复提交已经确认的勘误,在提交勘误前,请先查阅已经确认的勘误;
  3. 已经确认的勘误不再积分,未确认的勘误,只给先提交的读者计算积分。

提交勘误,请到如下页面:

查看勘误,请到如下页面:

本想先找本算法和数据结构的书参考一下,但转念一想:不如考考自己的总结和逻辑表达能力。

loop、iterate、traversal和recursion这几个词是计算机技术书中经常会出现的几个词汇。众所周知,这几个词分别翻译为:循环、迭代、遍历和递归。乍一看,这几个词好像都与重复(repeat)有关,但有的又好像不完全是重复的意思。那么这几个词到底各是什么含义,有什么区别和联系呢?下面就试着解释一下。

  • 循环(loop),指的是在满足条件的情况下,重复执行同一段代码。比如,while语句。
  • 迭代(iterate),指的是按照某种顺序逐个访问列表中的每一项。比如,for语句。
  • 遍历(traversal),指的是按照一定的规则访问树形结构中的每个节点,而且每个节点都只访问一次。
  • 递归(recursion),指的是一个函数不断调用自身的行为。比如,以编程方式输出著名的斐波纳契数列。

有了以上定义,这几个概念之间的区别其实就比较清楚了。至于它们之间的联系,严格来讲,它们似乎都属于算法的范畴。换句话说,它们只不过是解决问题的不同手段和方式,而本质上则都是计算机编程中达成特定目标的途径。