手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜Qcloud , 注册 | 登陆
浏览模式: 标准 | 列表分类:python

fabric 修改远程文件

其实对python真是一点都不熟,在用Fabric的时候,想修改远程服务器的文件,直接用open -> write 。却发现,修改的只能是本地文件,即使用with cd() : 进入目录,再调用 open ->write,也没用。

后来用了一个比较恶心的办法,适合修改小文件:

Python代码
  1. def modify(filename, searched, replaced):  
  2.     tmpfile = '/tmp/remote_temp.%s.txt' % os.getpid()  
  3.     get(filename,tmpfile)  
  4.     try:  
  5.         lines = open(tmpfile, 'r').readlines()  
  6.         flen = len(lines) - 1  
  7.         for i in range(flen):  
  8.             if searched in lines[i]:  
  9.                 lines[i] = lines[i].replace(searched, replaced)  
  10.         open(tmpfile, 'w').writelines(lines)  
  11.     except Exception, e:  
  12.         print e  
  13.     put(tmpfile,filename);  
  14.     os.remove(tmpfile)  

代码写的烂,但能用了!这里的get/put是fabric的一些方法。即:先下载下来,修改好后再put上去!

乱七八槽 的一些函数还有这些:

Python代码
  1. def modify2(filename, searched, replaced):  
  2.     tmpfile = '/tmp/remote_temp.%s.txt' % os.getpid()  
  3.     get(filename,tmpfile)  
  4.     try:  
  5.         lines = open(tmpfile, 'r').readlines()  
  6.         flen = len(lines) - 1  
  7.         for i in range(flen):  
  8.             for j in range(len(searched)):  
  9.                 if searched[j] in lines[i]:  
  10.                     lines[i] = lines[i].replace(searched[j], replaced[j])  
  11.         open(tmpfile, 'w').writelines(lines)  
  12.     except Exception, e:  
  13.         print e  
  14.     put(tmpfile,filename);  
  15.     os.remove(tmpfile)  
  16.   
  17. def modifyReg(filename, searched, replaced):  
  18.     tmpfile = '/tmp/remote_temp.%s.txt' % os.getpid()  
  19.     get(filename,tmpfile)  
  20.     try:  
  21.         lines = open(tmpfile, 'r').readlines()  
  22.         flen = len(lines) - 1  
  23.         for i in range(flen):  
  24.             lines[i], v = re.subn(searched, replaced, lines[i])  
  25.         open(tmpfile, 'w').writelines(lines)  
  26.     except Exception, e:  
  27.         print e  
  28.     put(tmpfile,filename);  
  29.     os.remove(tmpfile)  

纯记录。实在不知道怎么写好(其实也是不会写)

配置 fabric 穿越跳板机

在转这篇文章的时候,我觉得 很懒,所以我几乎没有排版就直接ctrl+c,ctrl+v就过来了

下面是正文,链接来源是:https://mozillazg.com/2013/12/python-fabric-gateway.html

说实话,跳板机给研发的日常工作添加了些许麻烦。 幸好 fabric 提供了穿越跳板机的功能,使跳板机不再影响我们的工作。

Python代码
  1. $ fab --version   
  2. Fabric 1.8.1   
  3. Paramiko 1.12.0  

Python代码
  1. # 跳板机  
  2. env.gateway = 'lisi@192.168.100.123'  
  3.   
  4. # 目标服务器  
  5. env.hosts = ['foo@111.111.111.111',  
  6.              'bar@111.111.111.112',  
  7.              'bar2@122.123.124.139',  
  8.             ]  
  9.   
  10. env.passwords = {  
  11.     'lisi@192.168.100.123:22''pssword3',  # 跳板机密码  
  12.     'foo@111.111.111.111:22''pssword4',   # 目标服务器密码  
  13.     'bar@111.111.111.112:22''pssword5',   # 目标服务器密码  
  14.     'bar2@122.123.124.139:22''pssword6',   # 目标服务器密码  
  15. }  
  16.  
  17. @task  
  18. @hosts(env.hosts)  
  19. def foobar():  
  20.     pass  

穿越跳板机的原理是: SSH 隧道技术 。

 

到这里转载结束。

之所以转这个,就是因为有些机器实在没有公网IP。所以只能从外面的LVS机器进行跳板处理。

关注:师生网络——可视化学术家族树介绍(Specification)

看到这篇文章的时候还是挺感兴趣的。
几年前,微软出过一个实验性的搜索叫做:人立方,但没有更多的接口和参数。虽然很早之前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

yhustc:Twisted+AC自动机构建高效的过滤服务器

这是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

让PY在android上飞起来

在这里【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

Records:912