在Windows平台的Apache中配置Python
2010年08月19日 Web开发, 编程技术
要在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步。
- 下载mod_python模块安装程序(注意文件名后面Python和Apache的版本号要与自己已经安装的版本一致;文件名前面的版本号则是mod_python的,文件名示例:mod_python-3.3.1.win32-py2.5-Apache2.2.exe),然后安装,安装向导会自动找到Python路径,但可能需要我们手工指定Apache路径,安装到最后,向导还会提示你如何修改Apache配置文件(参见下一步)并给出了后续步骤的英文说明。
- 让Apache加载mod_python模块。在Apache安装目录下找到其配置文件apache\conf\httpd.conf,打开,搜“LoadModule”,找到加载模块的地方,然后添加一条语句:LoadModule python_module modules/mod_python.so,重新启动Apache。
- 在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
内容策略:关于数据的哲学
2010年08月16日 交互设计, 翻译
原文链接: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 复杂一些的站点就需要组织了
在设计和构建内容量极大的网站时,我们发现单靠手工组织这些内容是不现实的。在这种情况下,就需要用到自动化的、复杂的算法来解放人类了。为此,内容中必须包含机器能够识别的固有信息,例如通过搜索、浏览和相关链接来维系数据驱动的应用。内容策略专家的责任就是专注于怎么才能让内容有意义,同时也让站点的设计最恰当地利用内容。
实战演练
在经过了一番哲学思辨之后,我们终于搞清楚了谁要为内容负责了。那么,到底怎样才能让内容有意义呢?
为了让人们感觉内容与他们有关,必须选择那些对实现沟通目标效果最好的词汇和句子结构。至于表达方式,应该在深刻理解内容创作者的意图和内容消费者的需求的基础上来确定。为此,可以借助类似于编辑指南的手册来提供指导,或者提供一些让别人能够按照相同表达方式组织内容和消息的示例。
为了让机器更好地处理内容,需要将内容结构化并定义标准的元素,从而方便内容的使用和重用。需要对内容分门别类,为不同类别添加相应的元数据,以便于识别。需要在内容之间建立关联,使得它们的背景丰富,不显得单薄,同时也能支持各种复杂的功能。
为了保证创建内容的效率,需要评估和推荐一些解决方案,用于创建、增强、组织和使用内容,包括内容管理系统、元数据相关的工具、搜索引擎及方便的导航应用程序。需要创立业务规则及工作流,进一步优化这些工具和系统的使用。
为了保证内容面面俱到,需要确定站点的内容需求,清查已有的内容,发现缺口,落实新增内容的补给渠道,并控制将这些内容融合到产品中去的整个过程。在既定的背景和参考资料支持下,可能还要编写标签、概述,甚至更长的内容。
在做以上这些事并创造相应成果的过程中,不要因为过时的哲学问题而让实际上简单的问题复杂化。试试这个脑筋急转弯:“具备什么样品质的内容才能历经三个月都不会磨灭其价值,而又是什么样的品质会导致内容甫一问世就面临过时的危险?”(提示:没有唯一的答案。)
内容策略专家的策略
如果你是一名内容策略专家。
- 问自己或同事一些有关内容的难题(例如:“内容是什么?”“什么因素会提升内容的价值?”)。
- 头脑风暴,探讨怎样生成更有意义的内容,如何确定质量好与坏的标准。落实到一个投入/产出分析模型上。
- 比较不同的内容模型并确定各自适合的用途。
- 关注一些新出现的能够有效解决内容问题的工具。创造性地使用这些工具,包括发现新用途和新用法,然后把这些创意告诉工具的开发人员,以促进工具改进。
如果你与内容策略专家合作。
- 花点时间认真严肃地思考一下内容。在讨论内容问题,而内容又似乎不是问题的直接诱因时,请保持几分耐心——有时候,只有这种态度才能拿出理想的内容方案。
- 在开始规划站点之初,就在项目中考虑内容。千万不要在站点已经构建和设计完成后,才意识到需要找些内容来填充页面。
如果你没有与内容策略专家协作,但有这个意愿。
- 向组织的负责人说明内容策略专家扮演的角色,以及他们为什么可以节省时间和精力,可以帮助避免问题,可以提升最终产品的品质。在项目收尾时,可以举出一些能够说明“如果早点想到这一点就好了”的例子。根据这些与内容相关的例子,你会发现自己可能成功了一半了。
- 如果不行,再了解组织中哪个人对内容理论更感兴趣,鼓励他们多做一些相关的研究。过一段时间后,再给他们摆事实,讲道理,然后你的心愿就可以达成 了。
内容策略并没有一个放之四海而皆准的定义,不同的人对它的理解也不怎么一致,但这可不是对内容策略视而不见的理由。只有深刻认识到内容的重要性,像个哲学家一样思考问题,你才能够做到随机应变。
正则表达式速查表(.NET)
2010年08月12日 正则表达式, 翻译
出处: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] |

为之漫笔(李松峰),本博客专注于Web前后端技术、移动平台开发技术、交互设计和技术翻译。