<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title>膘叔</title>
		<link>http://www.neatstudio.com/</link>
		<description>失败的路有千万条，但成功的路只有一个</description>
		<copyright>Copyright (C) 2004 Security Angel Team [S4T] All Rights Reserved.</copyright>
		<generator>SaBlog-X Version 1.6 Build 20080806</generator>
		<lastBuildDate>Sat, 25 May 2013 18:34:20 +0000</lastBuildDate>
		<ttl>10</ttl>
		<item>
			<guid>http://www.neatstudio.com/show-1894-1.shtml</guid>
			<title>关注：师生网络——可视化学术家族树介绍（Specification）</title>
			<author>gouki</author>
			<description><![CDATA[<p>看到这篇文章的时候还是挺感兴趣的。<br />
几年前，微软出过一个实验性的搜索叫做：人立方，但没有更多的接口和参数。虽然很早之前SNS的建立依据就是每六个人就会通过各种关系认识。人立方却不太一样，他是基于很多的内容搜索来判断他们之前是否有关系，虽然不是特别准，但多少你会发现其实原来你可以认识这么多人，表面上好象你们真没有关系，但仔细看看，好象却真的有点关系。<br />
OK，这篇文章我看到的时候，感觉有点象这种概念，事实上，我在之前就在想，怎么样将一部武侠小说中的人物关系理理清，比如那些经典的小说，很多人在看完一遍两遍三遍后都理不清那之前的关系。比如，射雕里面的人物超多，很多人的关系也很乱，如果再算上，神雕和倚天屠龙记，这三部曲，能够在看到一个人名后把相关的人物连接起来的人还真的不多。好象现在也确实有人在做这种事情，但纯人工的太累了吧？<br />
下面的这篇文章其实和那种开枝散叶的人物关系真的不太一样，但多少接触接触吧。。。<br />
－－－－－－－－－－开始上原文</p>
<p><strong>什么是可视化学术家族树？</strong></p>
<p>可视化学术家族树是继承于微软学术搜索的，以树形可视化图形，展现学者间师生关系的学术关系查询与展示平台。</p>
<p><strong>家族树的用途？</strong></p>
<p>为用户提供与展示学者间的师生关系，方便用户更好的了解一个学者极其相关学者。</p>
<p><strong>如何才能使用学术家族树？</strong></p>
<p>1、 你需要一台电脑</p>
<p>2、 你需要一个浏览器，不论IE, Firefox, Chrome, Safari,还是Opera（国产的那几款如傲游，360等也可以）</p>
<p>3、 微软的Silverlight（银光）插件，下载地址：<a href="http://www.microsoft.com/silverlight/">http://www.microsoft.com/silverlight/</a>（什么？不知道？好吧，这是百度百科：<a href="http://baike.baidu.com/view/942429.htm">http://baike.baidu.com/view/942429.htm</a>）</p>
<p>4、 然后，然后，输入网址就可以用了。</p>
<p>那么网址是什么？微软学术搜索：<a href="http://academic.research.microsoft.com/">http://academic.research.microsoft.com</a>，不过，家族树暂未上线，请大家稍等片刻，可以先用用其它的功能，看看作为一款学术搜索平台，是不是符合你的口味呢？</p>
<p>下面进入正题。</p>
<p><strong>Spec</strong><strong>：</strong></p>
<p>作为一个网站，或者说是一个搜索页面，一个用来搜索和展现师生关系的网页。整体架构按照网站的标准来分，可以分成两部分&mdash;&mdash;前端与后端。</p>
<p>前端为界面的设计及数据的展示，后端为数据的获取与存储。</p>
<p>每一款软件必然会有自己的主打招牌，也会有许许多多的特点。成功的软件不一定什么都要做到最好，但至少要有特点。我们的特点是什么？</p>
<p>前端：</p>
<p>1、 最直观的界面布局</p>
<p>做数据的可视化一直是学术界的一个研究热点。当你手上有大量的数据时，以怎样的形式将其展现出来，能够让用户看得清晰明了？这个问题一直困扰了我们 许久，因为我们的屏幕大小是有限的，人眼一次性可以接受的信息量也是有限的，既然是做可视化，也不能简简单单的列一个列表出来就了事。那么该怎么做呢？在 我们统计的数据中，拥有最多学生的学者一共拥有102个学生（直接学生），这102个学生目前分布在近40个不同的研究机构（含公司与高校），要将这 102个学生与40个机构展现出来，可不是一件容易的事，尤其是对于有密集恐惧症的朋友们，你们肯定不情愿看见屏幕上密密麻麻层层叠叠的点吧？</p>
<p>这是去年的一张测试图，你能满意吗？这人的学生还不算很多。</p>
<p>&nbsp;</p>
<p><img alt="" src="http://pic002.cnblogs.com/images/2011/319426/2011112700224453.png" /></p>
<p>下面是我们前段时间的一个版本，有没有觉得很恐惧？</p>
<p>&nbsp;</p>
<p><img alt="" src="http://pic002.cnblogs.com/images/2011/319426/2011112700225738.jpg" /></p>
<p>不过，经过数周的共同努力，我们终于是克服了这个难题，想出了一种根据人数及其影响力与相关程度的聚类分布方式，随时为用户呈现出简约清晰地界面，不会给你的心理带来任何的密集恐惧感。相信当你真正使用时，心里应该会比较舒坦。</p>
<p>&nbsp;</p>
<p>2、 华丽的展现动画</p>
<p>或许是因为基于silverlight平台的缘故，动画制作变得非常简单。而在我们的师生关系展现中，由动画带来的视觉效果毫无疑问的会提升用户的使用体验。</p>
<p>&nbsp;</p>
<p>后端：</p>
<p>1、 最全的真实数据</p>
<p>&ldquo;最全&rdquo;这两字，在任何地方可能都有夸张的嫌疑，在这里也不例外，毕竟谁也不敢保证我们的数据就一定是最全的。也许许多人来使用我们家族树时，并没 有找到自己想要的信息，于是他会放弃使用我们这款平台，这并不是我们想要的结果。我们不是万能的，我们并不能猜到谁跟谁有师生关系，我们的一切数据都是有 根据的，即在大家都可以访问到的网页上说明了谁与谁是师生，只有这样的数据才有可能被我们收录。并不是说你读了谁谁的研究生，但你不告诉我们，我们自己就 可以猜到的。例如以下的作者主页里，就写明了他们的学生信息。</p>
<p><a href="http://www.une.edu.au/staff/nrei3.php">http://www.une.edu.au/staff/nrei3.php</a></p>
<p><a href="http://www.math.ttu.edu/%7Ebarnard/vita.html">http://www.math.ttu.edu/~barnard/vita.html</a></p>
<p>虽然不太好找，但还是存在的。</p>
<p>为什么说是最全？在互联网上，也出过不少的学术家族树网站，不过都不怎么给力，而且仅仅是针对某一领域，相比于他们，我们的数据更加的丰富。在微软 学术搜索里面有超过1000万的学者信息，其中有60多万目前我们发现了其个人主页。我们的工作之一，正是在这些个人主页上去挖掘师生关系。当然，这样能 够获取到的信息并不多，因为大多人的主页上未必会写上师生的信息。当然我们还有许多其他的数据源，如Wikipedia，Mathematical  Genealogy  Project等等，虽然最终获取的总量并不大，但也比市面上其他所有网站的信息要全面地多的多了。我们的所有数据都是有根据的，绝不是自己猜测的，在这 点上我们与清华大学的arnetminer走了完全不同的方向。它们是经过论文的合作网络分析出师生关系，但这种分析往往准确度不高，并且没有足够的信服 力，用户们经常会发现错误的关系，这会极大的影响我们的心情。</p>
<p>数据不全这是必然存在的问题，因此我们为用户提供了编辑的窗口，希望用户们能够帮助我们去填充与校正更多地数据，当然前提是用户要提供证据（比如某个页面url）来支撑填充的数据。这样既可以让他人更加了解你，也能让我们的数据更加丰富，更准确。</p>
<p>我们目前一共搜集了<strong>15</strong><strong>万</strong>对师生关系对，且每一对都有其出处，如果你没有发现你，希望您能主动加入进来。或许将来某一天，当学术搜索与社交网络融合在一起时，家族树会更加显示出其用处。</p>
<p>&nbsp;</p>
<p>2、 最快的反应速度</p>
<p>所有的数据都是存放在数据库中的，当数据很小时，查询是很快的，但是当数据超过千万时，速度可就没那么快了。正常的用户是没有心情去花几十秒几分钟 等待一个页面的更新的，这太浪费人的生命了。在我看来，任何搜索引擎，用户所能忍耐的极限时间，是不会超过5秒的，通常都在2秒以内。是的，既然要搜索， 那必然是要建立索引的，而我们正好就为我们的学术家族树建立的索引服务器（Index Server），所有的查询都能在<strong>毫秒</strong>级别的时间内获得输出结果。是的，你想搜谁，你就搜谁，秒搜秒看，其乐无穷。</p>
<p>挑战无处不在，哪怕傍着微软的大腿也不例外。学术家族树的编码阶段已经结束，现在正处在测试阶段，大约在12月底，就会与大家正式见面的。心动了吗？心动不如行动，收藏我们的博客，等待我们的Release，哇哈哈哈哈~~~</p>
<p>－－－－－－－－－－－－－－－－－－－</p>
<p>关注一下人立方：http://renlifang.msra.cn/</p>
<p>上面的文章来自于：http://www.cnblogs.com/rosting/archive/2011/11/27/2264758.html</p>]]></description>
			<link>http://www.neatstudio.com/show-1894-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-16-1.shtml">python</category>
			<pubDate>2011-11-27 20:59</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1683-1.shtml</guid>
			<title>yhustc:Twisted+AC自动机构建高效的过滤服务器</title>
			<author>gouki</author>
			<description><![CDATA[<p>这是yhustc帮烂桔搞定AC自动机的过程。上次在PHPX上看到也有人用PHP实现了一个，但我估计在大并发的时候，效率也不会高到哪里去。PHP纯处理字符串效率毕竟还是不咋地。。如果用perl呢？没试过。。。。还是看一下yhustc怎么实现在的吧。<br />
yhustc的网址是：http://www.yhustc.com ，yhustc在文中还提到了twisted，我没用过这个玩意，后来google了一下，发现还是很迷糊。<br />
原文内容如下：</p>
<p><span class="Apple-style-span" style="border-collapse: collapse; color: rgb(120, 120, 120); font-family: Arial, sans-serif; ">橘子有个网站，访问量大约每天500万PV，为了怕被屏蔽，需要对一系列敏感词进行过滤（超过1200个词），然后才输出内容给用户。 </span></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.6; font-size: 14px; ">替 换给定关键词的功能，每种编程语言都有，PHP的最强大。基于正则匹配替换的大家都有，就不提了。基于精确匹配的字符串替换，PHP的 str_replace函数可以根据给定的数组，一次函数调用对多关键词进行匹配。自然橘子用的也是这个咯（如果使用的是for i &lt; 1200  顺序的循环，基本系统效率可以无视了<img alt="" src="http://www.yhustc.com/Public/Js/FCKeditor/editor/images/smiley/46.gif" />）。可是现在问题出现了：系统负载非常高，而且是持续的高，晚上10点的高峰期CPU一直100%的满负荷运行。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.6; font-size: 14px; ">要优化性能，就需要一步步的分析瓶颈在什么地方：</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.6; font-size: 14px; ">1、 由于橘子说有些关键词以后没准会解封，所以不想把原始内容就保存为带上一堆****这样子。因此原始内容都保存的好好的，那么给用户输出的，是每次过滤过 后的结果。那么这里自然有个问题，就是相同的内容，针对每个用户都被过滤了一次，这不明摆着的CPU浪费嘛。我说你可以考虑<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>， 加硬盘后上缓存，一定时间内都只过滤一次，其他用户都读缓存即可，这样计算开销几乎全部省下来了。但是橘子哭穷啊，SSD的硬盘两千多一块。IDE的插上 去就得给机器断点，现在百度正在考验自己的站点，这个电断不得（如果IDC够好的话，夜里换其实没啥问题，偏偏他的IDC技术不照<img alt="" src="http://www.yhustc.com/Public/Js/FCKeditor/editor/images/smiley/29.gif" />）。那行，看来还是只能每次都过滤了，你爱折腾我也没办法。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.6; font-size: 14px; ">2、分析一下PHP的str_replace，他既然支持多关键词的数组输入，说明内部肯定是一个<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; ">AC自动机</strong>。 什么是AC自动机，大家请自行google并学习，我就不长篇大论了。本来多关键字替换的应用，AC自动机是最好的选择，但是为啥他的服务器负责就是居高 不下呢？这与PHP的实现机制有关，PHP的生命周期是一个WEB请求，那么每个用户请求页面时，调用一次str_replace。即使输入的数组是一摸 一样的，也必须重新构建一个AC自动机的搜索树，这个搜索树初始化的计算开销以及内存开销乘以并发数，严重降低了系统性能。（也不全是PHP生命周期引发 的，主要是因为AC自动机是封装在str_replace内部实现的，即使是串行的调用，相同输入仍然会每次都初始化自己的搜索树）</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.6; font-size: 14px; ">那么我们现在的问题就很明确了：实现一个全局的AC自动机，用他来处理所有的请求即可。这个任务PHP是没法执行了，加之要找AC自动机的相关模块才能自己二次开发，选定了python来干这个事情。<a href="https://hkn.eecs.berkeley.edu/%7Edyoo/python/ahocorasick/" target="_blank" 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: underline; color: rgb(120, 120, 120); ">https://hkn.eecs.berkeley.edu/~dyoo/python/ahocorasick/</a>&nbsp; 这里是python的AC自动机的模块，非常的简单易用，看看就会。&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.6; font-size: 14px; ">读 取关键词列表，添加关键词，构建搜索树，OK！测试一下关键词的搜索效果，windows平台下10000次的循环搜索，python的程序比直接用 PHP的str_replace执行时间缩短了200倍，当时震惊的一塌糊涂！！（不过这跟PHP在windows平台执行效率低也有关系，linux上 面明显要快非常多）</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.6; font-size: 14px; ">话不多说，把python的程序封装到一个Socket TCP Server里面，这样便于WEB的PHP程序通过套接口请求服务，把原文发过来，过滤后又发回去，这样就实现了一次过滤。&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.6; font-size: 14px; ">高高兴兴的把程序发给橘子，结果一上服务器，反而比先前的PHP str_replace效率还差。<img alt="" src="http://www.yhustc.com/Public/Js/FCKeditor/editor/images/smiley/13.gif" /></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.6; font-size: 14px; ">3、这时候才想到一个问题，我做的测试是串行执行的，只能算运行总时间。如果要上web上面应用，需要考虑并发问题。也就是需要<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; ">ab测试</strong>。ab  -c 500 -n  500测试了一把，果不其然，效率忒低。继续分析，我觉得是高并发情况下，python那个简单封装的TCPServer不够用。线程开销和阻塞式的服务 模式拖低了系统效率。为什么会有这种问题，请问自己&ldquo;你写的http  server能跟apache比不？&rdquo;这里面的性能优化太高深，搞不明白，怎么办呢？我们需要站在巨人的肩膀上才行。于是想到可以用<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; ">Twisted</strong>库来构建自己的TCP Server。什么是Twisted？也请自行google，并且学习一下。</p>
<p>&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.6; font-size: 14px; ">把TCP的服务器用Twisted改写了之后，AB测试了一把，大大的有惊喜：</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.6; font-size: 14px; ">PHP的str_replace版本</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.6; ">ab&nbsp;-c&nbsp;500&nbsp;-n&nbsp;500&nbsp;str_version.php<br />
<span class="Apple-style-span" 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: 14px; line-height: 1.6; "><strong>Requests&nbsp;per&nbsp;second:&nbsp;&nbsp;&nbsp;&nbsp;165.86&nbsp;[#/sec]&nbsp;(mean)</strong></span><br />
Time&nbsp;per&nbsp;request:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3014.552&nbsp;[ms]&nbsp;(mean)<br />
Time&nbsp;per&nbsp;request:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6.029&nbsp;[ms]&nbsp;(mean,&nbsp;across&nbsp;all&nbsp;concurrent&nbsp;requests)</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.6; ">PHP + python的旧版本的tcp server + AC自动机</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.6; ">ab&nbsp;-c&nbsp;500&nbsp;-n&nbsp;500&nbsp;old_ac_filter.php<br />
<strong>Requests&nbsp;per&nbsp;second:&nbsp;&nbsp;&nbsp;&nbsp;165.06&nbsp;[#/sec]&nbsp;(mean)</strong><br />
Time&nbsp;per&nbsp;request:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3029.286&nbsp;[ms]&nbsp;(mean)<br />
Time&nbsp;per&nbsp;request:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6.059&nbsp;[ms]&nbsp;(mean,&nbsp;across&nbsp;all&nbsp;concurrent&nbsp;requests)</p>
<p>PHP + python的twisted版本的tcp server + AC自动机</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.6; ">ab&nbsp;-c&nbsp;500&nbsp;-n&nbsp;500&nbsp;twisted_ac_filter.php<br />
<strong>Requests&nbsp;per&nbsp;second:&nbsp;&nbsp;&nbsp;&nbsp;620.93&nbsp;[#/sec]&nbsp;(mean)</strong><br />
Time&nbsp;per&nbsp;request:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;805.246&nbsp;[ms]&nbsp;(mean)<br />
Time&nbsp;per&nbsp;request:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.610&nbsp;[ms]&nbsp;(mean,&nbsp;across&nbsp;all&nbsp;concurrent&nbsp;requests)&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.6; ">高并发的情况下，每秒处理的请求数提升了4倍，效果那不是盖的。<img alt="" src="http://www.yhustc.com/Public/Js/FCKeditor/editor/images/smiley/46.gif" /></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.6; ">晚上十点，又迎来了一个访问量的高峰，情况非常稳定，橘子回报：</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.6; ">&ldquo;之前这个点都是满负载跑-，-&nbsp; -v-而且还是关闭了在线统计功能的情况下&rdquo;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.6; ">&ldquo;现在我把在线统计打开了，cpu也就50%左右&rdquo;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.6; ">反正是够用了，就优化到此为止吧。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.6; ">其实这个需求，还有进一步优化的余地，空间换时间+全局的AC自动机，可以把系统性能提高若干数量级。&nbsp;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.7em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.6; ">大 致思路是：在内容刚刚产生的时候PHP通过UDP消息把需要处理的东西发送给python程序，python实现一个两个线程的生产消费者模式的工作进 程。消费线程每次取出消息槽里面一个需要处理的请求，使用一个全局的AC自动机对内容进行处理，然后存放起来，继续处理下一个请求，当没有请求的时候就阻 塞住。生产线程是一个UDP的server，收到数据后就给消息槽添加一个请求数据，并且给消费线程发送信号激活它工作。如此往复即可。</p>
<p>--EOF--<br />
小知识：<br />
Twisted是一个事件驱动的网络框架，它由Python写成，基于<a href="http://www.opensource.org/licenses/mit-license.php">MIT</a>授 权协议。Twisted支持各种各样的底层协议，比如：TCP，UDP,SSL/TLS,多地址传输，Unix  socket等，以及HTTP，NNTP,IMAP,SSH,IRC,FTP等其他高级协议。有了这些支持相当于有了一个强有力的基础，你可以用它来开发 诸如web server,Mail server，即时通讯软件 等等。</p>
<p>这里还有一个简单的教程（繁体字）</p>
<p>http://ez2learn.com/index.php/python-tutorials/twisted-tutorials</p>]]></description>
			<link>http://www.neatstudio.com/show-1683-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-16-1.shtml">python</category>
			<pubDate>2011-04-19 09:55</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1622-1.shtml</guid>
			<title>让PY在android上飞起来</title>
			<author>gouki</author>
			<description><![CDATA[<p>在这里【http://www.cnblogs.com/tieqixia/】看到SL4A的文章，是讲把python运行在andorid的文章 。好象那个php4android，也是基于这个SL4A的。</p>
<p>文章目前刚写了三篇，我根据第一篇里的建议，下载了这两个软件：python和sl4a，然后运行了那些样例代码。发现不太爽，因为每次运行，那个左上角的notify中还是显示SL4A的图标。</p>
<p>同时还有一个最大的疑问，如何把PY编译成APK，也没有什么 文章介绍。。</p>
<p>这个博客的第三节，有点意思，是讲如何简化输入，把PC上的代码，通过二维码扫描后，复制粘贴，然后保存到SL4A的编辑框 里。。</p>
<p>三篇文章如下：</p>
<p>1、<a id="homepage1_PostList1_rptEntries_TitleUrl_3" class="PostTitle" href="http://www.cnblogs.com/tieqixia/archive/2011/01/16/1936538.html">让Python在Android系统上飞一会儿:第一节 在手机上配置Python运行环境</a></p>
<p>2、<a id="homepage1_PostList1_rptEntries_TitleUrl_2" class="PostTitle" href="http://www.cnblogs.com/tieqixia/archive/2011/01/18/1938718.html">让Python在Android系统上飞一会儿:第二节 第一个有实用价值的应用</a></p>
<p>3、<a id="homepage1_PostList1_rptEntries_TitleUrl_1" class="PostTitle" href="http://www.cnblogs.com/tieqixia/archive/2011/01/22/1942260.html">让Python在Android系统上飞一会儿:第三节 在电脑上编写程序在手机上运行</a></p>
<p>SL4A的下载地址是：<a href="http://code.google.com/p/android-scripting/" style="color: rgb(51, 51, 51); text-decoration: underline; padding: 0px; margin: 0px;">http://code.google.com/p/android-scripting/</a></p>
<p>果然，正如我所说的，支持好多语言哦，其实就是做了一个类似于jre的中间件了，在SL4A的右上角有支持的语言列表，可以下载你熟悉的语言。</p>
<p>OK，不作做介绍了，自己看吧。</p>
<p>------</p>
<p>后记，在上篇的博客里，发现他介绍的豆瓣小组：http://www.douban.com/group/SL4A/，居然我还真的发现了这一篇：<a title="通过apk方式发行python脚本" href="http://www.douban.com/group/topic/17362140/">通过apk方式发行python脚本</a></p>]]></description>
			<link>http://www.neatstudio.com/show-1622-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-16-1.shtml">python</category>
			<pubDate>2011-02-11 23:19</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1610-1.shtml</guid>
			<title>wxPython</title>
			<author>gouki</author>
			<description><![CDATA[<p>用python的人，好象在做桌面程序的时候，都会有说用wxwidgets，在网上搜了很久，好象都是在推荐这个。。。</p>
<p>wxPython is a <strong>GUI toolkit</strong> for the <a href="http://www.python.org/">Python</a> programming language.  It allows Python programmers to create programs with a robust, highly functional graphical user interface, simply and easily.  It is implemented as a Python extension module (native code) that wraps the popular <a href="http://wxwidgets.org/">wxWidgets</a> cross platform GUI library, which is written in C++.</p>
<p>Like Python and wxWidgets, wxPython is <strong>Open Source</strong> which means that it is free for anyone to use and the source code is available for anyone to look at and modify.  Or anyone can contribute fixes or enhancements to the project.</p>
<p>wxPython is a <strong>cross-platform</strong> toolkit.  This means that the same program will run on multiple platforms without modification. Currently supported platforms are 32-bit Microsoft Windows, most Unix or unix-like systems, and Macintosh OS X.</p>
<p>Since the language is Python, wxPython programs are <strong>simple, easy</strong> to write and easy to understand.  <a href="http://www.wxpython.org/test7.py.html">Here</a> is an example.</p>
<p>上面的内容纯粹是介绍，但是我还处于初学阶段，关键没时间折腾啊，哎。真痛苦。还好wxPython上还有一些使用的介绍，就是那个<font size="+1" style="font-family: sans-serif;"><strong><a href="http://wiki.wxpython.org/How_to_Learn_wxPython">How to Learn wxPython</a></strong></font>，有很多介绍。</p>
<p>说来也郁闷，装了一个aptana3，却找不到怎么创建python的工程，这让我想起了komodo edit，好象就直接支持python了。。。看来越是大的东西，越比较让人难以使用。目前在WIN下，好象官方的wiki介绍的IDE也不少。。。有空下载了玩玩。列表在这里：http://wiki.python.org/moin/PythonEditors#Windows-OnlyEditors</p>]]></description>
			<link>http://www.neatstudio.com/show-1610-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-16-1.shtml">python</category>
			<pubDate>2011-01-30 22:13</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1588-1.shtml</guid>
			<title>Python学习资源</title>
			<author>gouki</author>
			<description><![CDATA[<p>学习Python的时候，还是翻了一些资料，也看到了一些资源。收集着，以后慢慢看。<br />
<br />
http://woodpecker.org.cn/abyteofpython_cn/chinese/index.html<br />
嗯，http://woodpecker.org.cn/，这个网上有很多Python的资源哦。<br />
然后在这个网站还有这些链接哦</p>
<div class="itemizedlist">
<ul>
    <li><a title="Python book for first-time programmers" href="http://www.freenetpages.co.uk/hp/alan.gauld/"><em class="citetitle">Learning to Program</em></a></li>
    <li><a title="Python book for computer science majors" href="http://www.ibiblio.org/obp/thinkCSpy/"><em class="citetitle">How to Think Like a Computer Scientist</em></a></li>
    <li><a title="advanced book on design patterns in Python" href="http://www.mindview.net/Books/TIPython"><em class="citetitle">Thinking in Python</em></a></li>
    <li><a title="Python articles for beginners and experts" href="http://www.python.org/doc/Intros.html">Introductions</a></li>
    <li><a title="books for sale, plus online articles" href="http://python.oreilly.com/">O'Reilly <span class="application">Python</span> Center</a></li>
    <li><a title="tutorials in over a dozen languages" href="http://www.python.org/doc/NonEnglish.html">非英文资源</a></li>
    <li><a href="http://directory.google.com/Top/Computers/Programming/Languages/Python/FAQs,_Help,_and_Tutorials/">更多指南</a></li>
</ul>
</div>
<p>都挺不错。也几乎点开看了。。相对于这个，我其实更喜欢这样的CHM文件，</p>
<ul>
    <li><a href="http://woodpecker.org.cn/diveintopython/">Dive Into Python Chinese Version</a></li>
    <li><a href="http://woodpecker.org.cn/diveintopython3/">Dive Into Python 3 Chinese Version</a></li>
</ul>
<p>这两个链接里，可是有CHM文件下载的哦。</p>]]></description>
			<link>http://www.neatstudio.com/show-1588-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-16-1.shtml">python</category>
			<pubDate>2011-01-11 23:08</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1583-1.shtml</guid>
			<title>php2python</title>
			<author>gouki</author>
			<description><![CDATA[<p>极有意思的网站，比较适合我们这些初学者，当然是对PHP有一些基础的初学者<br />
网站主把常用的一些PHP的函数，用Python实现了一遍（或者是显示Python的自有函数），方便我们查找例子</p>
<p>例如：PHP常用的addslashes函数，用来对特殊字符进行转义，</p>
<p>该网站则显示：
<div class="codeText">
<div class="codeHead">http://www.php2python.com/wiki/function.addslashes/</div>
<ol start="1" class="dp-py">
    <li class="alt"><span><span class="keyword">def</span><span>&nbsp;addslashes(s):&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;=&nbsp;{<span class="string">'&quot;'</span><span>:</span><span class="string">'\\&quot;'</span><span>,&nbsp;&quot;</span><span class="string">'&quot;:&quot;\\'</span><span class="string">&quot;,&nbsp;&quot;</span><span>\</span><span class="number">0</span><span class="string">&quot;:&quot;</span><span>\\\</span><span class="number">0</span><span class="string">&quot;,&nbsp;&quot;</span><span>\\</span><span class="string">&quot;:&quot;</span><span>\\\\&quot;}&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="string">''</span><span>.join(d.get(c,&nbsp;c)&nbsp;</span><span class="keyword">for</span><span>&nbsp;c&nbsp;</span><span class="keyword">in</span><span>&nbsp;s)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>s&nbsp;=&nbsp;<span class="string">&quot;John&nbsp;'Johny'&nbsp;Doe&nbsp;(a.k.a.&nbsp;\&quot;Super&nbsp;Joe\&quot;)\\\0&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">print</span><span>&nbsp;s&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">print</span><span>&nbsp;addslashes(s)&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">#John&nbsp;'Johny'&nbsp;Doe&nbsp;(a.k.a.&nbsp;&quot;Super&nbsp;Joe&quot;)\</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">#John&nbsp;\'Johny\'&nbsp;Doe&nbsp;(a.k.a.&nbsp;\&quot;Super&nbsp;Joe\&quot;)\\\</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
</p>
<p>实现方法虽然有点不一样，但对于我们这些初学者已经了解了很多用法，比如for in,join ,dict的get用法。当然还有定义函数的def方法。</p>
<p>这个网站是什么呢？http://www.php2python.com，黑黑，已经加入我的收藏夹了。感谢小缘缘的推荐</p>]]></description>
			<link>http://www.neatstudio.com/show-1583-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-16-1.shtml">python</category>
			<pubDate>2011-01-05 09:36</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1582-1.shtml</guid>
			<title>初学python</title>
			<author>gouki</author>
			<description><![CDATA[<p>初学python,小缘缘出了几道题：<br />
有一 list <br />
a = [1, 2, 3, 4, 5, 6]<br />
請將 a 依 <br />
0, 1<br />
1, 2<br />
2, 3<br />
3, 4<br />
4, 5<br />
5, 6<br />
打印輸出，<br />
2.將a list 倒序成 [6, 5, 4, 3, 2, 1]<br />
3.將a 中的偶數挑出 *2 ，結果為 [4, 8, 12]</p>
<p>基本上实现：</p>
<p>a=[1,2,3,4,5,6]</p>
<p>for i in a:<br />
&nbsp;&nbsp;&nbsp; print a.index(i),',',i</p>
<p>a.reverse();</p>
<p>print a</p>
<p>for i in a:<br />
&nbsp;&nbsp;&nbsp; if i%2==0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print i*2</p>
<p>虽然都完成了，但小缘缘说回答的不好，他这样回复</p>
<p>for k,v in enumerate(a):<br />
&nbsp;&nbsp;&nbsp; print k,v<br />
print a[::-1]<br />
print [i*2 for i in a if not i%2]</p>
<p>当时我就傻眼了，后来缘缘又出了道题目：</p>
<p>造一個 200 個隨機正整數（1~15）的list<br />
統計其中 正整數的出現次數，並排序輸出結果</p>
<p>开始的时候，不清楚random居然还要import。。。。</p>
<p>后来花了好久做出来：</p>
<p>&gt;&gt;&gt; import random<br />
&gt;&gt;&gt; mylist = [random.randint(1,15) for i in range(1,200)]<br />
&gt;&gt;&gt; s={}<br />
&gt;&gt;&gt; for i in mylist:<br />
&nbsp;&nbsp;&nbsp; if not s.has_key(i):<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; s[i]=0<br />
&nbsp;&nbsp;&nbsp; else:<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; s[i]+=1<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&gt;&gt;&gt; cmplist = sorted(s.items(),key=lambda(d):d[1])<br />
&gt;&gt;&gt; result = cmplist[::-1]<br />
&gt;&gt;&gt; print result<br />
[(8, 20), (13, 19), (12, 16), (9, 15), (6, 15), (3, 14), (2, 12), (14, 11), (4, 11), (15, 10), (7, 10), (11, 9), (5, 9), (1, 9), (10, 4)]</p>
<p>缘缘点评循环的时候，可以用Get比如</p>
<p>for i in mylist:<br />
&nbsp;&nbsp;&nbsp; s[i]=s.get(i,0)+1</p>
<p>然后说sorted可以有从大到小的倒排，后来找了一下资料，发现可以这样</p>
<p>sorted(d.items(),cmp=lambda x,y:cmp(x[1],y[1]),reverse=True)</p>
<p>第一次写python，鸭梨太大了。。。</p>]]></description>
			<link>http://www.neatstudio.com/show-1582-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-16-1.shtml">python</category>
			<pubDate>2011-01-04 14:51</pubDate>
		</item>
	</channel>
</rss>
