python
文章平均质量分 82
yueguanghaidao
这个作者很懒,什么都没留下…
展开
-
2016年终总结--一个Python程序员的跨界之旅
时间过得真快,感觉15年年终总结刚写完,16年就结束了,看了blog,16年就写了可怜的8篇,对我来说16年还算顺风顺水。真正可能出乎意料的是年底我离开了呆了2年半的龙图游戏,暂时放弃了用了3年半的Python,转向了Java领域和数据仓库,这也算是跨界了吧。。。家庭16年老婆和闺女来北京住了小半年,那段时间是很幸福的一段时光,最终还是不适应北京的天气和雾霭,老婆和闺女逃离了北京,我又恢复了“单身”原创 2017-01-07 22:50:39 · 9260 阅读 · 10 评论 -
[gevent源码分析] c-ares异步DNS请求
c-ares是异步DNS请求库,libcurl,libevent,wireshark都使用了c-ares,gevent1.0版本前使用的是libevent,所以它的DNS请求也是使用c-ares,1.0版本后使用cython封装了c-ares。c-ares官方文档,http://c-ares.haxx.se/docs.html。原创 2014-09-17 00:43:53 · 10654 阅读 · 0 评论 -
Flask request,g,session的实现原理
最近一直在研究Flask,由于gfirefly中提供的Http接口使用了Flask,以前都是写一些游戏中简单的操作,最近涉及到Flask的方面比较多,所以就认真研究了下。对Flask的request context和app context略有心得,所以和小伙伴们分享一下Flask的request原理。 在我们视图中要使用request时只需要from flask import request就可以原创 2014-09-25 00:57:17 · 40790 阅读 · 7 评论 -
[gevent源码分析] libev cython绑定core.pyx
gevent core就是封装了libev,使用了cython的语法,感兴趣童鞋可以好好研究研究。其实libev是有python的封装pyev(https://pythonhosted.org/pyev/),不过pyev是使用C来写扩展的,代码巨复杂。在看core.pyx代码之前先学习一下core.pyx用到的cython知识。一: cython基础知识1.cdef, def, cpdef的区别原创 2014-09-13 19:56:27 · 3380 阅读 · 0 评论 -
Python之美[从菜鸟到高手]--NotImplemented小析
今天写代码时无意碰到NotImplemented,我一愣,难道是NotImplementedError的胞弟,所以稍微研究了一下。NotImplemented故名思议,就是“未实现”,一般是用在一些比较算法中的,如class的__eq__,__lt__等,注意NotImplemented并不是异常,所以不能使用raise,当没有实现时应该是return NotImplemented。我们可以看看d原创 2014-08-17 19:51:18 · 15999 阅读 · 2 评论 -
[gevent源码分析] gevent两架马车-libev和greenlet
本篇将讨论gevent的两架马车-libev和greenlet如何协同工作的。gevent事件驱动底层使用了libev,我们先看看如何单独使用gevent中的事件循环。#coding=utf8import socketimport geventfrom gevent.core import loopdef f(): s, address = sock.accept() p原创 2014-09-08 00:02:41 · 11435 阅读 · 2 评论 -
[Python网络编程]gevent httpclient以及网页编码
之前看到geventhttpclient这个项目,https://github.com/gwik/geventhttpclient,官方文档说非常快,由于响应使用了C的解析,所以我一直想把这玩意用到项目中,这两天一直在纠结这玩意,说实在一句话,比较难用,封装的不给力,最大缺陷如下:1.不支持重定向,重定向需要自己来写,很费事2.新建的httpclient对象只能发送同域名的请求这相当的蛋疼,我花了原创 2014-05-30 16:41:47 · 4892 阅读 · 0 评论 -
sql注入在线检测(sqlmapapi)
之前一搞渗透的同事问我,sqlmapapi.py是干啥的,我猜很多人都玩过sqlmap,但玩过sqlmapapi的应该比较少,今天就和大家一起看看如何使用以及一些美的地方。说白了,sqlmapapi.py就是提供了一个检查sql注入的接口,我们可以直接通过发送http请求扫描sql注入,获取扫描结果等一系列操作。 下面通过实例演示如何使用:一.启动服务器端服务器后端使用的是bottle,一个原创 2014-07-22 02:24:37 · 41436 阅读 · 2 评论 -
Python之美[从菜鸟到高手]--2+2=5
今天在伯乐在线上看到原创 2014-06-29 20:44:31 · 4848 阅读 · 0 评论 -
[Python网络编程]浅析守护进程后台任务的设计与实现
在做基于B/S应用中,经常有需要后台运行任务的需求,最简单比如发送邮件。在一些如防火墙,WAF等项目中,前台只是为了展示内容与各种参数配置,后台守护进程才是重头戏。所以在防火墙配置页面中可能会经常看到调用cgi,但真正做事的一般并不是cgi,比如说执行关机命令,他们的逻辑如下: (ps:上图所说的前台界面包含通常web开发中的后端,不然也没有socket一说) 为什么要这么设计你可能疑惑原创 2014-06-28 20:33:10 · 6011 阅读 · 0 评论 -
[Python网络编程] DNS缓存解决方案
记得以前写爬虫的时候为了防止原创 2014-05-21 11:36:14 · 6664 阅读 · 0 评论 -
[python网络编程]使用scapy修改源IP发送请求
今天同事想测试WAF的页面统计功能,所以需要模拟多个IP向多个域名发送请求,也就是需要修改源IP地址。这个如果使用socket库就比较麻烦了,需要使用raw socket,相当麻烦。还好咱有scapy,轻松搞定。DOMAIN是我随机构造的域名库,SOURCE也是随机构造的源IP地址。#!/usr/bin/env python#-*-encoding:UTF-8-*-from scapy.al原创 2014-05-07 23:46:49 · 23268 阅读 · 3 评论 -
Python之美[从菜鸟到高手]--浅拷贝、深拷贝完全解读(copy源码分析)
可悲的我一直以为copy模块是用C写的,有时候需要原创 2014-05-19 20:43:16 · 10516 阅读 · 1 评论 -
Python之美[从菜鸟到高手]--读"一道面试题看 HashMap 的存储方式"的联想
今天在伯乐在线 一道面试题看 HashMap 的存储方式,也即使问:在 HashMap 中存放的一系列键值对,其中键为某个我们自定义的类型。放入 HashMap 后,我们在外部把某一个 key 的属性进行更改,然后我们再用这个 key 从 HashMap 里取出元素,这时候 HashMap 会返回什么?如何面试者直接答“这要看自定义类型的hash值了”,我想面试官会非常满意,抓住问题关键很重要。联原创 2014-05-18 20:47:54 · 9514 阅读 · 1 评论 -
[Python网络编程]使用select,poll
import socketimport selects=socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.connect(('192.168.9.178',80))#s.settimeout(5)packet = """\GET /cs.php?a=php HTTP/1.0Host: 192.168.9.178"""#asyncdebug=1s.s原创 2014-04-11 20:19:51 · 5938 阅读 · 3 评论 -
[gfirefly深入解析]--总体架构及demo讲解
gfirefly是开源的分布式游戏服务器端框架,是firefly的gevent版本,想了解更多关于firefly可参考http://www.oschina.net/question/947559_147468,这是firefly的官网http://firefly.9miao.com/。不过我关注的是gfirefly,主要有两个原因。 1.gfirefly性能更好(官方说法) 2.我对twisted不是很熟,但对gevent比较熟悉,想阅读源码可能gfirefly更合适。原创 2014-08-12 22:36:07 · 6985 阅读 · 5 评论 -
gevent: AssertionError: Impossible to call blocking function in the event loop callback
今天在用爬虫时gevent报了AssertionError: Impossible to call blocking function in the event loop callback异常,很奇怪,难道是patch_socket惹的货,因为之前没有使用patch_socket是正常的,代码简化如下import urllibimport geventfrom gevent.monkey im原创 2014-11-12 15:11:33 · 5007 阅读 · 0 评论 -
100行代码实现gevent调度模型
昨天心血来潮看了https://github.com/locustio/locust/的源码,经常用ab或者httpload的童鞋可以看下locust的代码,支持分布式运行,通过gevent可以单机开N个协程模仿并发用户,分布式rpc用了zmq的PUSH,PULL模式,不得不说zeromq的确简洁。2年前研究过gevent,那时就想用纯Python模拟一下调度模型,后来也就不了了之了。原理其实和ge原创 2016-09-29 14:45:25 · 5841 阅读 · 0 评论 -
玩转Python让人讨厌的编码问题
Python的编码问题基本是每个新手都会遇到的坎,但只要完全掌握了就跳过了这个坑,万变不离其中,这不最近我也遇到了这个问题,来一起看看吧。事情的起因是review同事做的一个上传功能,看下面一段代码,self.fp是上传的文件句柄fpdata = [line.strip().decode('gbk').encode('utf-8').decode('utf-8') for line in self.原创 2016-01-31 00:03:08 · 41106 阅读 · 2 评论 -
git远程外网地址变内网怎么破(ssh本地端口转发)
git远程外网地址变内网怎么破(ssh本地端口转发)?最近给longtubas上了负载均衡,相对来说我们并发并不高,但希望可用性尽可能高,本来打算用不饱和的机器做个lvs集群的,但IDC说给个额外的公网ip需要申请机器,推荐我们用云自带的负载均衡,倒也省的自己配置,IDC把之前公网ip绑定到负载均衡器上了,这导致我们搭建在服务器上的gitlab不可用了,折腾了一下,使用ssh本地端口转发解决了。当然原创 2016-05-26 13:04:54 · 13817 阅读 · 0 评论 -
记一次django queryset的缓存优化
缘起看着我们单表记录快7000万行,突破亿行已经指日可待了,于是打算数据库分表,对应用层相对透明的做法就是引入数据库中间件,业界虽然有一些方案,比如阿里,360的,但大部分都是java或c的,最后看向了https://github.com/flike/kingshard,这是golang写的,代码质量还是挺高的,对我的胃口,于是先把kingshard当做代理用起来,发现了以前一直没有发现的问题。dj原创 2016-07-23 18:52:33 · 10246 阅读 · 0 评论 -
如何面试Python后端工程师?
前一段时间有人在知乎提了http://www.zhihu.com/question/33398583,如何面试Python工程师?我斗胆回答了一下, http://www.zhihu.com/question/33398583/answer/59017861吃午饭的时候我就一直在想这个问题,我觉得重点不是Python而是后端工程师,因为Python只是系统的一部分,linux基础操作要熟吧,sql原创 2015-11-04 15:07:50 · 32705 阅读 · 20 评论 -
Linux/Unix系统编程手册--SOCKET章节读书笔记
SOCKET章节读书笔记强烈推荐Linux/Unix系统编程手册,号称超越APUE的神书。backlog含义#include <sys/socket.h>int listen(int socketfd, int backlog)backlog参数限制未决连接(未accept)的数量,在这个数量之内,connect会立刻成功。 Linux上上限为128,定义在udp已连接socketudp soc原创 2015-07-21 19:19:45 · 5805 阅读 · 0 评论 -
Effective TCP/IP Programming读书笔记
TCP/IP深入思考TCP/IP这是我读Effective TCP/IP Programming的 读书笔记和思考,以及做的一些实验。强烈建议后端工程师有空读一读这本书,有些细节的确是我们平时没有注意的,读了最好自己动手做一些实验加深理解。fin的含义对端发送fin会导致read()返回,但send()照样可以发送,也就是单纯的fin其实相当于shutdown(SHUT_WR)。当对端应用程序崩溃后原创 2015-07-26 16:20:31 · 6386 阅读 · 0 评论 -
微信公众平台开发利器-weixin-knife(Python版)
这两天将之前基于微信公众平台的代码重构了下,基础功能以库的方式提供,提供了demo使用的是django,看着之前为赶进度写的代码真的惨不忍睹,所以weixin-knife产生了,正如其名,提供的是必要的功能,而不是完整的应用。weixin-knife可以很方便的处理关注,取关注事件,处理文本消息,回复用户信息,jssdk处理,oauth认证,以及微信支付。github地址:https://gith原创 2015-05-15 20:17:29 · 33068 阅读 · 8 评论 -
ZeroMq LRU算法中间件
前一段时间2014北京PyCon大会吐槽颇多,所以我就到InfoQ上找了找2013的大会视频,对网络射击手游High Noon 2基于Python的服务器架构的视频挺感兴趣,尤其是游戏服务器中的0 downtime,原理他们底层不是原生的socket,而是基于ZeroMq的socket,由于ZeroMq的短线自动重连可以满足游戏服务器的热启动,不需要代码层面的热启动,热更新,当更新代码完成后直接重原创 2014-12-09 01:30:32 · 3482 阅读 · 1 评论 -
tornado模板源码小析
最近对flask的热情有点下降,对tornado有点高涨。 之前在知乎上回答过一个问题,如何理解 Tornado ?,我的回答如下:1.高性能的网络库,这可以和gevent,twisted,libevent等做对。提供了异步io支持,超时事件处理,在此基础上提供了tcpserver,httpclient,尤其是curlhttpclient,在现有http客户端中肯定排第一。可以用来做爬虫,游戏服务原创 2014-12-21 18:42:41 · 4695 阅读 · 0 评论 -
微信支付SDK(python版)
最近一段时间一直在搞微信平台开发,最近的v3.37版本微信支付接口变化贼大,所以就看着php的demo移植为python版,为了保持一致,所以接口方法基本都没有变,这样的好处就是不用写demo了,看着微信官方的demo照葫芦画瓢就可以了。我已经把代码放到github了,https://github.com/Skycrab/wzhifuSDK,我主要测试了JsApi调用方式,其它的调用方式并没有测试原创 2014-11-24 20:52:40 · 31079 阅读 · 10 评论 -
Python之美[从菜鸟到高手]--生成器之全景分析
yield指令,可以暂停一个函数并返回中间结果。使用该指令的函数将保存执行环境,并且在必要时恢复。生成器比迭代器更加强大也更加复杂,需要花点功夫好好理解贯彻。看下面一段代码:def gen(): for x in xrange(4): tmp = yield x if tmp == 'hello': print 'worl原创 2013-08-23 01:13:36 · 18086 阅读 · 11 评论 -
Python之美[从菜鸟到高手]--threading daemon线程原理解读
事情的起因是我在看下面一段代码遇到的疑惑,明明是while True,为什么代码没有死循环??class D(threading.Thread): def __init__(self, queue): threading.Thread.__init__(self) self.queue = queue def run(self): w原创 2014-10-15 00:03:17 · 21869 阅读 · 1 评论 -
Flask 源码阅读笔记
我觉得我已经养成了一个坏习惯,在使用一个框架过程中对它的内部原理非常感兴趣,有时候需要花不少精力才明白,这也导致了学习的缓慢,但换来的是对框架的内部机理的熟悉,正如侯捷所说,源码面前,了无秘密。这也是本文产生的直接原因。一.flask session原理 flask的session是通过客户端的cookie实现的,不同于diango的服务器端实现,flask通过itsdangerous这个苦将se原创 2014-10-12 12:32:35 · 27913 阅读 · 3 评论 -
[gevent源码分析] 深度分析gevent运行流程
一直不太懂gevent运行流程,最近看源码略有所得,不敢独享,分享之。原创 2014-04-25 00:13:06 · 109461 阅读 · 7 评论 -
[python网络编程]DNS服务器
在上一篇中,使用scrapy修改源IP发送请求的最后我们提到由于hosts文件不支持正则,会导致我们的随机域名DNS查询失败。是用DNS服务器可以解决这个问题,下面是我用gevent写的小工具,很简单。我们只拦截匹配的A记录,然后发送DNS Response,如果不匹配,那么我们服务器就是一个DNS代理,转发请求。# -*- coding=utf-8 -*-import structfrom原创 2014-05-09 12:30:56 · 6999 阅读 · 0 评论 -
[学习Cython编程]C中使用Python标准库(urllib,logging)
Python的库非常丰富,如果能在C中使用Python的一些库,无疑是很让人兴奋的,下面我们就将在C中使用Pyhton的urllib模块和logging模块。在C中调用Python需要包含整个Python的运行时库,链接模型如下:在C/C++中嵌入Python代码是非常简单的,下面是代码模板:#include int main(int argc,char** argv){ Py_Set原创 2014-04-07 19:23:23 · 4234 阅读 · 0 评论 -
python实战--Python WebShell 开发 (上)
最近在研究WebShell,打算写一个Python版的WebShell,使用的是cgi, Apache配置文件http.conf需做如下:我将我的cgi脚本放到F:\py_cgi目录下,其中cgi-script指定脚本后缀名AddHandler cgi-script .pyScriptAlias /cgi-bin/ "F:/py_cgi/" AllowOverride None原创 2013-07-16 00:21:09 · 13569 阅读 · 2 评论 -
python实战--web.py实战(开发新浪微博应用)
刚刚接触web.py,喜欢它的简洁与简单......于是打算实践一下,就有了下面的东西.感觉写的不是很好,有很多需要改进的地方....主要代码如下:#coding=utf-8"""本应用主要功能1.用户选择喜欢的标签加关注2.获取用户粉丝中自己还没有关注的,->加关注,提高粉丝稳定性3.获取用户关注列表中没有回粉的,并可以一键取消关注2,3两个功能基本实现,有一缺点,数据量原创 2012-05-17 23:07:00 · 29482 阅读 · 16 评论 -
python实战--Http代理服务器
打算好好深入研究下pytho的socket编程,那天看了这篇博文,http://www.apprk.com/archives/146,于是打算学习下,仿写了一下,发现写好还真不容易,中途出现很多问题,果真是看的容易,做起来难啊。 源代码如下:import socketimport threadimport urlparseimport selectBUFLEN=8192原创 2013-07-09 00:34:51 · 13329 阅读 · 2 评论 -
Step-by-Step SqlAlchemy Tutorial(part 1 of 2)
一直觉得orm很高深,今天时间比较充分打算学习下安装说一点,我的系统是win7 64位家庭普通版用easy_install安装sqlalchemy出现问题,于是下载最新版0.7.6的zip压缩包,用python setup.py install出现错误:WARNING: The C extension could not be compiled, speedups are not翻译 2012-04-22 01:35:03 · 4741 阅读 · 0 评论 -
Step-by-Step SqlAlchemy Tutorial (part 2 of 2)
在Step-by-Step SqlAlchemy Tutorial的第一部分(点击打开链接),我们调用SqlAlchemy的SQL表达式与数据库交互。在我们开始更高级和更加抽象的方法之前,我们需要学习更加抽象的方式做事情。这就像许多数学课程一样,比如微积分,在你知道捷径之前,你需要很长时间去学习发现一些微积分的标准偏差。在第二部分,我们将用简单的方法去应用SqlAlchemy。它被翻译 2012-04-22 15:54:43 · 2501 阅读 · 0 评论 -
pyqt开发新浪微博粉丝聊天软件v1(图形界面)
pyqt开发新浪微博粉丝聊天软件v1(图形界面):实现效果如下:当你点击聊友时:弹出聊天对话框当点击我自己时,弹出我所在的IP地址:代码如下:# -*- coding: utf-8 -*-from PyQt4.QtGui import *from PyQt4.QtCore import *import sysimport logging原创 2012-04-18 13:17:02 · 4342 阅读 · 5 评论