KevinHuang

KevinHuang的博客


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 一些书

  • 常用命令

  • python tips

  • 站点地图

  • rss

  • 公益404

  • 搜索

多台服务器进程查看脚本(pexpect+yaml)

发表于 2016-02-11 | 分类于 python | 阅读次数:
####前言最近做自己开发用相关服务的一个checklist,就写了这个脚本,用来在跳板机去检查各个服务器上面的相关服务是否正常####思路使用expect登录每个机器(因为安全问题,不能直接使用ssh信任),然后根据yaml文件的配置读取服务名字以及启动的进程数量去检查每个服务是否正常PS:难点是没有用端口转发也只有普通用户权限####checklist.py #coding=utf-8 import sys #因为我这个脚本要让很多人能运行,但是不能给他们看见我的密码算法,所以是pyc #我这个脚本要给很多其他普通用户去用,是用我的ssh登录操作,不能放在我的home目录,所以放在tmp sys.path.append(‘/tmp/local/lib/python2.6/site-packages/PyYAML-3.10-py2.6-linux-x86_64.egg’) #依赖yaml sys.path.append(‘/tmp/local/lib/python2.6/site-packages/pexpect-2.4-py2.6.egg’) #依赖pexpect import yaml import pexpect dataDict = yaml.load(open(‘/tmp/config.yaml’)) #将我的yaml配置load进来 def myprint(color,mes): #以前写的一个终端彩色打印的函数 ‘’’使用ANSI控制码终端显示彩色’’’ d = dict(r=31, g=32, gb=36, y=33, b=34, p=35, o=37) color = “\x1B[%d;%dm” % (1, d[color]) print “%s%s\x1B[0m” % ...
阅读全文 »

Python元组的赋值谜题

发表于 2016-02-10 | 分类于 python | 阅读次数:
相信很多人对tuple和list的区别的理解是tuple是一个不可变的序列, 不能对它的元素赋值。我之前也是这么理解的,举个例子: 123456789101112In : a = (1, 2, 3) In : a[3] = 4 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-5-d840230b1ac3> in <module>() ----> 1 a[3] = 4 TypeError: 'tuple' object does not support item assignment In : a Out: (1, 2, 3) 也就是一个元组生成,它的元素就不再能改变了。但是相信很多人见过下面这样的玩法(有人把它当做Python的一个笑话): 123456789101112In : a = (1, 2, [3, 4]) In : a[2] += [5, 6] --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-2-84fb4a701b92> in <module>() ----> 1 a[2] += [5, 6] T ...
阅读全文 »

爬虫练习

发表于 2016-02-09 | 分类于 python | 阅读次数:
前言20号参加pycon,发现有个招聘公司[知道创宇](http://blog.knownsec.com/2012/02/knownsec-recruitment/), 正好换工作,就去公司网站转了下,发现挺有意思:投简历需要一个网站爬虫程序,基本要求如下(可以直接点开上面网页去看): 使用python编写一个网站爬虫程序,支持参数如下: spider.py -u url -d deep -f logfile -l loglevel(1-5) –testself -thread number –dbfile filepath –key=”HTML5” 参数说明: -u 指定爬虫开始地址 -d 指定爬虫深度 –thread 指定线程池大小,多线程爬取页面,可选参数,默认10 –dbfile 存放结果数据到指定的数据库(sqlite)文件中 –key 页面内的关键词,获取满足该关键词的网页,可选参数,默认为所有页面 -l 日志记录文件记录详细程度,数字越大记录越详细,可选参数,默认spider.log –testself 程序自测,可选参数 功能描述: 1、指定网站爬取指定深度的页面,将包含指定关键词的页面内容存放到sqlite3数据库文件中 2、程序每隔10秒在屏幕上打印进度信息 3、支持线程池机制,并发爬取网页 4、代码需要详尽的注释,自己需要深刻理解该程序所涉及到的各类知识点 5、需要自己实现线程池 搞了2天,根据研究,弄了一个版本(友情提示,仅供学习参考,要是面试这个职位,建议大家用其它方法实现,因为我投递过了,不要拿来主义额^.^)#####代码如下(隐藏了个人信息用’XXX’代替) #!/usr/bin/env python #coding=utf-8 im ...
阅读全文 »

Python北京开发者活动第一期PPT出炉啦

发表于 2016-02-08 | 分类于 python | 阅读次数:
Python北京开发者活动第一期结束了,虽然我没有参加,不过仍然第一时间拿到了主题的幻灯片分享给大家。和高大上的Pycon相比,这种技术技术活动更是Python工程师需要也是想要了解到的内容,本文我站着说话不腰疼地也对这些主题闲扯几句吧。三个主题的Slide地址是: https://github.com/Python-Meetup-Peking/PMP_slide,你也可以通过文末的「阅读原文」到达。我下面的内容会提到主讲人幻灯片中的一点内容,建议大家先完整看过PPT再来看本文效果会更好。 asyncio 和它的朋友们asyncio是Python 3官方的解决方案,也是Guido van Rossum(Python创建者,简称GvR)主推的,我在之前的博文我为什么不喜欢Gevent提到过我是比较认同asyncio,不认可gevent的,我也说过asyncio的生态还远远没有建立,现在基本都只能算是玩一玩。asyncio是非常有革命性意义的,直到它大家当做基本常识一样的被认可需要一个过程,这个过程看起来还比较长,我认为的原因有下面这么几点: 迁移成本太高。首先是Python 2到Python 3的迁移,并不是安装一个库就完事了,而且现在大部分公司在Python 2下的产品和服务运行良好,迁移得有值得的收益,所以现阶段不能说服boss干这件事,也让大家没了动力。 使用后的效果不突出。前年使用asyncio发现确实比之前的方案都要快,可以翻之前的内容,不过这个快并不是一个质的飞跃,而只是一个效率的提升,当效率没有成倍的提高的时候,你很难综合的决定为了那百分之XX的提升来做这么大的改变,毕竟现有的效率也没有出现瓶颈。 asyncio改变了编程习惯。asyncio的作者们已经很努力的让开发者感受不到这种变化,但是asyncio用起来需要一整套的开发习惯的支持,简单地说:并不是你用了 ...
阅读全文 »

知乎Live全文搜索之使用Elasticsearch全文搜索

发表于 2016-02-07 | 分类于 python | 阅读次数:
为什么需要全文搜索一般的网站都会包含搜索功能,它能帮助用户发现没有找到想要的东西,甚至能帮助用户挖掘到兴趣,这对提升用户对网站的黏性和用户体验有非常大的帮助。举个豆瓣的例子,用户可以在主站的搜索里面找到电影、书籍、音乐、用户、小站、小组、游戏等相关内容。传统的数据库系统设计成可进行「增删改查」等操作,我们都知道,需要存储到数据库的内容都是经过深思熟虑的,如果用户规模和数据很大,多增加一个字段就意味着要增加很多额外的空间、多个索引,并影响到执行效率,这意味着我们无法把全部数据都存进数据库。举个例子,写一篇日记,可以把作者、发表时间、标题等字段存入数据库,但是日记正文无法也放进去,太占空间了。现在的一个最佳实践是把访问比较集中的、频繁的数据直接放到内存和键值数据库中。但是再进行搜索,就要对不同的存储内容整理,并根据一定的算法把符合的内容排序后返回。而且这些数据非常有可能是由不同的开发团队来维护和开发的,首先这些产品间的网络通信就是一笔不小的开销,还要从不同的产品获取到结果之后再排序。这显然不合理。全文搜索软件如Elasticsearch则有如下特点: 查询速度。全文搜索的数据存取方式只考虑快速读取,相比数据库的查询,要快的多得多。 支持复杂的查询表达式。数据库系统的查询通常只支持AND/OR等有限的模式,全文检索支持多得多的查询方式。 灵活排序。数据库系统一般按照内置的排序规则来排序,有什么字段并且有对应的索引才可能按什么字段排序。而全文搜索除了能够支持数据库的排序规则外,还支持按照结果的相关度排序,比如Elasticsearch内置了文本相关性、衰减、分词等高级特性,对搜索的效果有非常大的帮助。虽然Elasticsearch自带的中文分词不好,但是提供良好的插件机制,我们可以安装第三方中文分词插件,可以达到非常好的中文搜索效果。ElasticSearch(简称ES)是一个提 ...
阅读全文 »

基于Flask+Vue+Celery+ItChat+Wxpy实现强大的微信管理系统

发表于 2016-02-06 | 分类于 python | 阅读次数:
版权声明:本文由 董伟明 原创,未经作者授权禁止任何微信公众号和向掘金(juejin.im)转载,技术博客转载采用 保留署名-非商业性使用-禁止演绎 4.0-国际许可协议python
阅读全文 »

wechat-admin:Celery使用篇

发表于 2016-02-05 | 分类于 python | 阅读次数:
Celery是一个专注于实时处理和任务调度分布式任务队列。通过RabbitMQ、Redis、MongoDB等消息代理,把任务发给执行任务的Worker以达到异步执行。我写的那本《PythonWeb开发实战》的样章就是《使用Celery》,建议看下面内容之前先读一下这篇文章。接下来的内容假设你已经对Celery有了一定的了解。对wechat-admin项目来说,使用Celery要做如下事情: 更新项目数据库中的联系人、群聊和公众号等相关内容 监听wxpy进程,处理自动加群、接受消息、踢人以及各种插件功能等 自动重启上述的监听进程 发送新消息数量提醒首先我们创建一个目录(wechat),专门用来存放celery任务相关的内容,目录下文件列表如下: 123456789❯ tree wechat wechat ├── __init__.py ├── celery.py # 名为celery.py是主程序,启动的时候可以直接`celery -A wechat worker -l info -B` ├── celeryconfig.py # 配置文件 └── tasks.py # 存放任务逻辑 0 directories, 4 files 我们挨个看看 celeryconfig.py看文件名字就知道了,这个是放配置的文件: 123456789❯ cat celeryconfig.py from config import REDIS_URL BROKER_URL = REDIS_URL CELERY_RESULT_BACKEND = REDIS_URL CELERY_TASK_SERIALIZER = 'msgpack' CELERY_RESULT_SERIALIZER = 'json' CELERY_TASK_RESULT_EXPIRES = ...
阅读全文 »

知乎Live全文搜索之微信小程序实战(二)

发表于 2016-02-04 | 分类于 python | 阅读次数:
今天进入正题,看看下面效果的小程序是怎么实现的:![](https://github.com/dongweiming/weapp-zhihulive/raw/master/screenshot/zhihulive.png)项目地址 https://github.com/dongweiming/weapp-zhihulivePS: 本文是假设你已经看过微信小程序的官方文档、demo甚至已经动手写过小程序,否则建议先去翻翻再来看。 设计目录结构我在上一节知乎Live全文搜索之微信小程序实战(一)/)介绍了组件化,今天就是要实施了。首先我们考虑一个只有index页面的小程序的目录结构是怎么样的: 1234567891011├── app.js // 全局的脚本文件 ├── app.json // 全局的配置文件 ├── app.wxss // 全局的样式文件 ├── pages │   ├── index │   │   ├── index.js // 脚本文件 │   │   ├── index.json // 组件的配置文件 │   │   ├── index.wxml // 页面结构文件 │ │ ├── rating.png // 还有其他的图片.. │   │   └── index.wxss // 样式表文件 pages目录下有个index目录,存放了名字叫做index,后缀为js/json/wxml/wxss的四个文件。这样做的好处是: index目录下存放了页面组件所需要的各种资源, 就近维护 。如果是React,还得通过使用各种loader,用import的方式来用,所以我喜欢小程序的处理方式。 当某天不再需要index这个页面,或者要替换成其他的组件,直接把index目录删掉/替换就完事了。接着我们基于Live搜索,思 ...
阅读全文 »

sed-and-awk

发表于 2016-02-03 | 分类于 python | 阅读次数:
####前言最近做一个关于sed和awk的分享,这里把源码开源:sed_and_awk,或者直接访问http://dongweiming.github.io/sed_and_awk.我这个ppt基本覆盖90%以上的知识点.####一些说明我测试例子都是在osx下,freebsd的sed和awk和gnu的都略有不同.甚至osx下得版本都不能使用,我会在注释中说明. sed sed 通用 /usr/local/bin/sed osx下编译的gnu sed awk awk 通用 gawk osx编译的gnu awk 版权声明:本文由 董伟明 原创,未经作者授权禁止任何微信公众号和向掘金(juejin.im)转载,技术博客转载采用 保留署名-非商业性使用-禁止演绎 4.0-国际许可协议python
阅读全文 »

关于expect研究(四)

发表于 2016-02-02 | 分类于 python | 阅读次数:
前言最近又开始开始了expect的一些更深层次的东西,分享出来 字典expect没有严格意义的字典,但是确实可以使用创建字典: set mydict [dict create tbj tbjpass server serverpass] 它表示创建一个字典叫做mydict,包含2个kv对:tbj & tbjpass 和server & serverpass 你也可以这样添加数据: set mydict .dongwm dongwmpass 表示添加一个键为.dongwm 值为dongwmpass的新数据到mydict 根据key获取值可以这样: [dict get $mydict server] 表示从mydict获取server的值 NB的事,可以直接这样写,看我的片段: expect “password:” send “[dict get $mydict s70]\n” 也就是直接把这个看起来像列表的东东直接写到字符串里面 判断变量是否存在if {[info exists serverpass]!=1} { puts ‘sd’ } 表示如果serverpass这个变量要是不存在,就puts,但是注意的是, 假如上面你已经set 这个变量,不管有没有值,这个变量都已经被 _定义_ 了 判断列表包含一种使用switch结构,还有一种是if方式,将属于一类的放在一个列表,看它是不是’in’: set listserver “1 2 3 4 “ if {1 in $listserver} {puts 11} 当1在列表$listserver里面puts switch多条件假如有一些switch的结果,但是他们有一些需要做一样的操作,那么就可以吧他们放在一起 switch $port { ...
阅读全文 »
1…161718…20
Kevin Huang

Kevin Huang

197 日志
24 分类
84 标签
RSS
E-Mail
友情链接
  • 董伟明
  • FOOFISH
  • 酷壳
  • 知道创宇
  • 阮一峰
  • 求索
  • Sdandroid
  • 全栈实验室
© 2023 Kevin Huang 豫ICP备16018730号-1
本站访客数 人次 本站总访问量 次