Submitted by gouki on 2016, November 28, 11:11 AM
其实对python真是一点都不熟,在用Fabric的时候,想修改远程服务器的文件,直接用open -> write 。却发现,修改的只能是本地文件,即使用with cd() : 进入目录,再调用 open ->write,也没用。
后来用了一个比较恶心的办法,适合修改小文件:
Python代码
- def modify(filename, searched, replaced):
- tmpfile = '/tmp/remote_temp.%s.txt' % os.getpid()
- get(filename,tmpfile)
- try:
- lines = open(tmpfile, 'r').readlines()
- flen = len(lines) - 1
- for i in range(flen):
- if searched in lines[i]:
- lines[i] = lines[i].replace(searched, replaced)
- open(tmpfile, 'w').writelines(lines)
- except Exception, e:
- print e
- put(tmpfile,filename);
- os.remove(tmpfile)
代码写的烂,但能用了!这里的get/put是fabric的一些方法。即:先下载下来,修改好后再put上去!
乱七八槽 的一些函数还有这些:
Python代码
- def modify2(filename, searched, replaced):
- tmpfile = '/tmp/remote_temp.%s.txt' % os.getpid()
- get(filename,tmpfile)
- try:
- lines = open(tmpfile, 'r').readlines()
- flen = len(lines) - 1
- for i in range(flen):
- for j in range(len(searched)):
- if searched[j] in lines[i]:
- lines[i] = lines[i].replace(searched[j], replaced[j])
- open(tmpfile, 'w').writelines(lines)
- except Exception, e:
- print e
- put(tmpfile,filename);
- os.remove(tmpfile)
-
- def modifyReg(filename, searched, replaced):
- tmpfile = '/tmp/remote_temp.%s.txt' % os.getpid()
- get(filename,tmpfile)
- try:
- lines = open(tmpfile, 'r').readlines()
- flen = len(lines) - 1
- for i in range(flen):
- lines[i], v = re.subn(searched, replaced, lines[i])
- open(tmpfile, 'w').writelines(lines)
- except Exception, e:
- print e
- put(tmpfile,filename);
- os.remove(tmpfile)
纯记录。实在不知道怎么写好(其实也是不会写)
python | 评论:0
| 阅读:15272
Submitted by gouki on 2016, November 18, 7:21 PM
在转这篇文章的时候,我觉得 很懒,所以我几乎没有排版就直接ctrl+c,ctrl+v就过来了
下面是正文,链接来源是:https://mozillazg.com/2013/12/python-fabric-gateway.html
说实话,跳板机给研发的日常工作添加了些许麻烦。 幸好 fabric 提供了穿越跳板机的功能,使跳板机不再影响我们的工作。
Python代码
- $ fab --version
- Fabric 1.8.1
- Paramiko 1.12.0
Python代码
-
- env.gateway = 'lisi@192.168.100.123'
-
-
- env.hosts = ['foo@111.111.111.111',
- 'bar@111.111.111.112',
- 'bar2@122.123.124.139',
- ]
-
- env.passwords = {
- 'lisi@192.168.100.123:22': 'pssword3',
- 'foo@111.111.111.111:22': 'pssword4',
- 'bar@111.111.111.112:22': 'pssword5',
- 'bar2@122.123.124.139:22': 'pssword6',
- }
-
- @task
- @hosts(env.hosts)
- def foobar():
- pass
穿越跳板机的原理是: SSH 隧道技术 。
到这里转载结束。
之所以转这个,就是因为有些机器实在没有公网IP。所以只能从外面的LVS机器进行跳板处理。
python | 评论:0
| 阅读:17542
Submitted by gouki on 2011, November 27, 8:59 PM
看到这篇文章的时候还是挺感兴趣的。
几年前,微软出过一个实验性的搜索叫做:人立方,但没有更多的接口和参数。虽然很早之前SNS的建立依据就是每六个人就会通过各种关系认识。人立方却不太一样,他是基于很多的内容搜索来判断他们之前是否有关系,虽然不是特别准,但多少你会发现其实原来你可以认识这么多人,表面上好象你们真没有关系,但仔细看看,好象却真的有点关系。
OK,这篇文章我看到的时候,感觉有点象这种概念,事实上,我在之前就在想,怎么样将一部武侠小说中的人物关系理理清,比如那些经典的小说,很多人在看完一遍两遍三遍后都理不清那之前的关系。比如,射雕里面的人物超多,很多人的关系也很乱,如果再算上,神雕和倚天屠龙记,这三部曲,能够在看到一个人名后把相关的人物连接起来的人还真的不多。好象现在也确实有人在做这种事情,但纯人工的太累了吧?
下面的这篇文章其实和那种开枝散叶的人物关系真的不太一样,但多少接触接触吧。。。
----------开始上原文
什么是可视化学术家族树?
可视化学术家族树是继承于微软学术搜索的,以树形可视化图形,展现学者间师生关系的学术关系查询与展示平台。
家族树的用途?
为用户提供与展示学者间的师生关系,方便用户更好的了解一个学者极其相关学者。
如何才能使用学术家族树?
1、 你需要一台电脑
2、 你需要一个浏览器,不论IE, Firefox, Chrome, Safari,还是Opera(国产的那几款如傲游,360等也可以)
3、 微软的Silverlight(银光)插件,下载地址:http://www.microsoft.com/silverlight/(什么?不知道?好吧,这是百度百科:http://baike.baidu.com/view/942429.htm)
4、 然后,然后,输入网址就可以用了。
那么网址是什么?微软学术搜索:http://academic.research.microsoft.com,不过,家族树暂未上线,请大家稍等片刻,可以先用用其它的功能,看看作为一款学术搜索平台,是不是符合你的口味呢?
下面进入正题。
Spec:
作为一个网站,或者说是一个搜索页面,一个用来搜索和展现师生关系的网页。整体架构按照网站的标准来分,可以分成两部分——前端与后端。
前端为界面的设计及数据的展示,后端为数据的获取与存储。
每一款软件必然会有自己的主打招牌,也会有许许多多的特点。成功的软件不一定什么都要做到最好,但至少要有特点。我们的特点是什么?
前端:
1、 最直观的界面布局
做数据的可视化一直是学术界的一个研究热点。当你手上有大量的数据时,以怎样的形式将其展现出来,能够让用户看得清晰明了?这个问题一直困扰了我们 许久,因为我们的屏幕大小是有限的,人眼一次性可以接受的信息量也是有限的,既然是做可视化,也不能简简单单的列一个列表出来就了事。那么该怎么做呢?在 我们统计的数据中,拥有最多学生的学者一共拥有102个学生(直接学生),这102个学生目前分布在近40个不同的研究机构(含公司与高校),要将这 102个学生与40个机构展现出来,可不是一件容易的事,尤其是对于有密集恐惧症的朋友们,你们肯定不情愿看见屏幕上密密麻麻层层叠叠的点吧?
这是去年的一张测试图,你能满意吗?这人的学生还不算很多。
下面是我们前段时间的一个版本,有没有觉得很恐惧?
不过,经过数周的共同努力,我们终于是克服了这个难题,想出了一种根据人数及其影响力与相关程度的聚类分布方式,随时为用户呈现出简约清晰地界面,不会给你的心理带来任何的密集恐惧感。相信当你真正使用时,心里应该会比较舒坦。
2、 华丽的展现动画
或许是因为基于silverlight平台的缘故,动画制作变得非常简单。而在我们的师生关系展现中,由动画带来的视觉效果毫无疑问的会提升用户的使用体验。
后端:
1、 最全的真实数据
“最全”这两字,在任何地方可能都有夸张的嫌疑,在这里也不例外,毕竟谁也不敢保证我们的数据就一定是最全的。也许许多人来使用我们家族树时,并没 有找到自己想要的信息,于是他会放弃使用我们这款平台,这并不是我们想要的结果。我们不是万能的,我们并不能猜到谁跟谁有师生关系,我们的一切数据都是有 根据的,即在大家都可以访问到的网页上说明了谁与谁是师生,只有这样的数据才有可能被我们收录。并不是说你读了谁谁的研究生,但你不告诉我们,我们自己就 可以猜到的。例如以下的作者主页里,就写明了他们的学生信息。
http://www.une.edu.au/staff/nrei3.php
http://www.math.ttu.edu/~barnard/vita.html
虽然不太好找,但还是存在的。
为什么说是最全?在互联网上,也出过不少的学术家族树网站,不过都不怎么给力,而且仅仅是针对某一领域,相比于他们,我们的数据更加的丰富。在微软 学术搜索里面有超过1000万的学者信息,其中有60多万目前我们发现了其个人主页。我们的工作之一,正是在这些个人主页上去挖掘师生关系。当然,这样能 够获取到的信息并不多,因为大多人的主页上未必会写上师生的信息。当然我们还有许多其他的数据源,如Wikipedia,Mathematical Genealogy Project等等,虽然最终获取的总量并不大,但也比市面上其他所有网站的信息要全面地多的多了。我们的所有数据都是有根据的,绝不是自己猜测的,在这 点上我们与清华大学的arnetminer走了完全不同的方向。它们是经过论文的合作网络分析出师生关系,但这种分析往往准确度不高,并且没有足够的信服 力,用户们经常会发现错误的关系,这会极大的影响我们的心情。
数据不全这是必然存在的问题,因此我们为用户提供了编辑的窗口,希望用户们能够帮助我们去填充与校正更多地数据,当然前提是用户要提供证据(比如某个页面url)来支撑填充的数据。这样既可以让他人更加了解你,也能让我们的数据更加丰富,更准确。
我们目前一共搜集了15万对师生关系对,且每一对都有其出处,如果你没有发现你,希望您能主动加入进来。或许将来某一天,当学术搜索与社交网络融合在一起时,家族树会更加显示出其用处。
2、 最快的反应速度
所有的数据都是存放在数据库中的,当数据很小时,查询是很快的,但是当数据超过千万时,速度可就没那么快了。正常的用户是没有心情去花几十秒几分钟 等待一个页面的更新的,这太浪费人的生命了。在我看来,任何搜索引擎,用户所能忍耐的极限时间,是不会超过5秒的,通常都在2秒以内。是的,既然要搜索, 那必然是要建立索引的,而我们正好就为我们的学术家族树建立的索引服务器(Index Server),所有的查询都能在毫秒级别的时间内获得输出结果。是的,你想搜谁,你就搜谁,秒搜秒看,其乐无穷。
挑战无处不在,哪怕傍着微软的大腿也不例外。学术家族树的编码阶段已经结束,现在正处在测试阶段,大约在12月底,就会与大家正式见面的。心动了吗?心动不如行动,收藏我们的博客,等待我们的Release,哇哈哈哈哈~~~
-------------------
关注一下人立方:http://renlifang.msra.cn/
上面的文章来自于:http://www.cnblogs.com/rosting/archive/2011/11/27/2264758.html
python | 评论:0
| 阅读:18402
Submitted by gouki on 2011, April 19, 9:55 AM
这是yhustc帮烂桔搞定AC自动机的过程。上次在PHPX上看到也有人用PHP实现了一个,但我估计在大并发的时候,效率也不会高到哪里去。PHP纯处理字符串效率毕竟还是不咋地。。如果用perl呢?没试过。。。。还是看一下yhustc怎么实现在的吧。
yhustc的网址是:http://www.yhustc.com ,yhustc在文中还提到了twisted,我没用过这个玩意,后来google了一下,发现还是很迷糊。
原文内容如下:
橘子有个网站,访问量大约每天500万PV,为了怕被屏蔽,需要对一系列敏感词进行过滤(超过1200个词),然后才输出内容给用户。
替 换给定关键词的功能,每种编程语言都有,PHP的最强大。基于正则匹配替换的大家都有,就不提了。基于精确匹配的字符串替换,PHP的 str_replace函数可以根据给定的数组,一次函数调用对多关键词进行匹配。自然橘子用的也是这个咯(如果使用的是for i < 1200 顺序的循环,基本系统效率可以无视了)。可是现在问题出现了:系统负载非常高,而且是持续的高,晚上10点的高峰期CPU一直100%的满负荷运行。
要优化性能,就需要一步步的分析瓶颈在什么地方:
1、 由于橘子说有些关键词以后没准会解封,所以不想把原始内容就保存为带上一堆****这样子。因此原始内容都保存的好好的,那么给用户输出的,是每次过滤过 后的结果。那么这里自然有个问题,就是相同的内容,针对每个用户都被过滤了一次,这不明摆着的CPU浪费嘛。我说你可以考虑空间换时间, 加硬盘后上缓存,一定时间内都只过滤一次,其他用户都读缓存即可,这样计算开销几乎全部省下来了。但是橘子哭穷啊,SSD的硬盘两千多一块。IDE的插上 去就得给机器断点,现在百度正在考验自己的站点,这个电断不得(如果IDC够好的话,夜里换其实没啥问题,偏偏他的IDC技术不照)。那行,看来还是只能每次都过滤了,你爱折腾我也没办法。
2、分析一下PHP的str_replace,他既然支持多关键词的数组输入,说明内部肯定是一个AC自动机。 什么是AC自动机,大家请自行google并学习,我就不长篇大论了。本来多关键字替换的应用,AC自动机是最好的选择,但是为啥他的服务器负责就是居高 不下呢?这与PHP的实现机制有关,PHP的生命周期是一个WEB请求,那么每个用户请求页面时,调用一次str_replace。即使输入的数组是一摸 一样的,也必须重新构建一个AC自动机的搜索树,这个搜索树初始化的计算开销以及内存开销乘以并发数,严重降低了系统性能。(也不全是PHP生命周期引发 的,主要是因为AC自动机是封装在str_replace内部实现的,即使是串行的调用,相同输入仍然会每次都初始化自己的搜索树)
那么我们现在的问题就很明确了:实现一个全局的AC自动机,用他来处理所有的请求即可。这个任务PHP是没法执行了,加之要找AC自动机的相关模块才能自己二次开发,选定了python来干这个事情。https://hkn.eecs.berkeley.edu/~dyoo/python/ahocorasick/ 这里是python的AC自动机的模块,非常的简单易用,看看就会。
读 取关键词列表,添加关键词,构建搜索树,OK!测试一下关键词的搜索效果,windows平台下10000次的循环搜索,python的程序比直接用 PHP的str_replace执行时间缩短了200倍,当时震惊的一塌糊涂!!(不过这跟PHP在windows平台执行效率低也有关系,linux上 面明显要快非常多)
话不多说,把python的程序封装到一个Socket TCP Server里面,这样便于WEB的PHP程序通过套接口请求服务,把原文发过来,过滤后又发回去,这样就实现了一次过滤。
高高兴兴的把程序发给橘子,结果一上服务器,反而比先前的PHP str_replace效率还差。
3、这时候才想到一个问题,我做的测试是串行执行的,只能算运行总时间。如果要上web上面应用,需要考虑并发问题。也就是需要ab测试。ab -c 500 -n 500测试了一把,果不其然,效率忒低。继续分析,我觉得是高并发情况下,python那个简单封装的TCPServer不够用。线程开销和阻塞式的服务 模式拖低了系统效率。为什么会有这种问题,请问自己“你写的http server能跟apache比不?”这里面的性能优化太高深,搞不明白,怎么办呢?我们需要站在巨人的肩膀上才行。于是想到可以用Twisted库来构建自己的TCP Server。什么是Twisted?也请自行google,并且学习一下。
把TCP的服务器用Twisted改写了之后,AB测试了一把,大大的有惊喜:
PHP的str_replace版本
ab -c 500 -n 500 str_version.php
Requests per second: 165.86 [#/sec] (mean)
Time per request: 3014.552 [ms] (mean)
Time per request: 6.029 [ms] (mean, across all concurrent requests)
PHP + python的旧版本的tcp server + AC自动机
ab -c 500 -n 500 old_ac_filter.php
Requests per second: 165.06 [#/sec] (mean)
Time per request: 3029.286 [ms] (mean)
Time per request: 6.059 [ms] (mean, across all concurrent requests)
PHP + python的twisted版本的tcp server + AC自动机
ab -c 500 -n 500 twisted_ac_filter.php
Requests per second: 620.93 [#/sec] (mean)
Time per request: 805.246 [ms] (mean)
Time per request: 1.610 [ms] (mean, across all concurrent requests)
高并发的情况下,每秒处理的请求数提升了4倍,效果那不是盖的。
晚上十点,又迎来了一个访问量的高峰,情况非常稳定,橘子回报:
“之前这个点都是满负载跑-,- -v-而且还是关闭了在线统计功能的情况下”
“现在我把在线统计打开了,cpu也就50%左右”
反正是够用了,就优化到此为止吧。
其实这个需求,还有进一步优化的余地,空间换时间+全局的AC自动机,可以把系统性能提高若干数量级。
大 致思路是:在内容刚刚产生的时候PHP通过UDP消息把需要处理的东西发送给python程序,python实现一个两个线程的生产消费者模式的工作进 程。消费线程每次取出消息槽里面一个需要处理的请求,使用一个全局的AC自动机对内容进行处理,然后存放起来,继续处理下一个请求,当没有请求的时候就阻 塞住。生产线程是一个UDP的server,收到数据后就给消息槽添加一个请求数据,并且给消费线程发送信号激活它工作。如此往复即可。
--EOF--
小知识:
Twisted是一个事件驱动的网络框架,它由Python写成,基于MIT授 权协议。Twisted支持各种各样的底层协议,比如:TCP,UDP,SSL/TLS,多地址传输,Unix socket等,以及HTTP,NNTP,IMAP,SSH,IRC,FTP等其他高级协议。有了这些支持相当于有了一个强有力的基础,你可以用它来开发 诸如web server,Mail server,即时通讯软件 等等。
这里还有一个简单的教程(繁体字)
http://ez2learn.com/index.php/python-tutorials/twisted-tutorials
Tags: twisted, ac自动机, python, yhustc
python | 评论:2
| 阅读:23439
Submitted by gouki on 2011, February 11, 11:19 PM
在这里【http://www.cnblogs.com/tieqixia/】看到SL4A的文章,是讲把python运行在andorid的文章 。好象那个php4android,也是基于这个SL4A的。
文章目前刚写了三篇,我根据第一篇里的建议,下载了这两个软件:python和sl4a,然后运行了那些样例代码。发现不太爽,因为每次运行,那个左上角的notify中还是显示SL4A的图标。
同时还有一个最大的疑问,如何把PY编译成APK,也没有什么 文章介绍。。
这个博客的第三节,有点意思,是讲如何简化输入,把PC上的代码,通过二维码扫描后,复制粘贴,然后保存到SL4A的编辑框 里。。
三篇文章如下:
1、让Python在Android系统上飞一会儿:第一节 在手机上配置Python运行环境
2、让Python在Android系统上飞一会儿:第二节 第一个有实用价值的应用
3、让Python在Android系统上飞一会儿:第三节 在电脑上编写程序在手机上运行
SL4A的下载地址是:http://code.google.com/p/android-scripting/
果然,正如我所说的,支持好多语言哦,其实就是做了一个类似于jre的中间件了,在SL4A的右上角有支持的语言列表,可以下载你熟悉的语言。
OK,不作做介绍了,自己看吧。
------
后记,在上篇的博客里,发现他介绍的豆瓣小组:http://www.douban.com/group/SL4A/,居然我还真的发现了这一篇:通过apk方式发行python脚本
Tags: python, android, sl4a
python | 评论:0
| 阅读:24909