CI_Knight

且行善举,莫问前程。

0%

做开发时,总会debug自己的程序,python debub程序绝对离不开pythonshell,这根能发挥出动态语言的特性。

创建一个Python Shell

1
2
3
4
5
6
#!/usr/bin/env python

import sys
import os

os.environ['PYTHONINSPECT'] = 'True'

这是一个原生的python shell。

我们来加一些样式和功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/env python

import sys
import os

#red color
r = "\033[31m"

#whie color
w = "\033[0m"]]"

#clear the terminal
os.system('clear')

#custom prompt
sys.ps1 = r + "[custom] " + w
os.environ['PYTHONINSPECT'] = 'True'

现在,我们的终端不再是>>>,而是红色的[custom],可以尝试一下。

然后我们尝试使用imp来加载modules

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/usr/bin/env python

import sys
import os
import __builtin__
import imp

#red color
r = "\033[31m"

#white color
w = "\033[0m"

#clear the terminal
os.system('clear')

#custom prompt
sys.ps1 = r + "[custom] " + w

#load module
def _importmodule(module):
try:
modulename = "modules/" + module + ".py"
ModuleFile = open(modulename, 'rb')
mod = imp.load_source(module, modulename, ModuleFile)

#updating loaded module list
__builtin__.__dict__.update(mod.__dict__)
print w + "Module " + module + " loaded..."

#adding [modulename] to prompt to see which module is currently loaded
sys.ps1 = r + "[custom] " + "<" + module + "> " + w

#closing opened file
finally:
try: ModuleFile.close()
except: pass

#loading method
def loadmodule(mname):
_importmodule(mname)

def unloadmodule(moname):
del sys.modules[moname]
sys.ps1 = r + "[custom] " + w

os.environ['PYTHONINSPECT'] = 'True'

现在可以在shell中使用loadmodule(modulename),来加载模块,尝试下看看输出什么。

我们给python shell加上tab补全功能,这时就要用到readline了。

1
2
3
4
5
6
7
try:
import readline
except ImportError:
print("Module readline not available.")
else:
import rlcompleter
readline.parse_and_bind("tab: complete")

支持python2,3,在终端中试试吧。

Ipython支持

以上做了那么多,其实还可以更简单。

1
2
3
4
5
6
7
8
9
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import os
import IPython

os.environ['PYTHONSTARTUP'] = '' # Prevent running this again
IPython.start_ipython()
raise SystemExit

当然也可以使用bpython等等。

Iptyhon autoreload

.ipython/profile_default下创建文件ipython_config.py,输入以下内容

1
2
3
4
c = get_config()
c.InteractiveShellApp.exec_lines = []
c.InteractiveShellApp.exec_lines.append('%load_ext autoreload')
c.InteractiveShellApp.exec_lines.append('%autoreload 2')

在github上存储了一份自己的配置文件,当然依然还在优化当中。配置了python开发的基本功能,以及zsh,vim,tmux等,没有过多的杂项。配置详情可以参考项目的README

项目地址: github

配置方式详情看Master分支的README,分别有OSX和Linux两种平台的配置。为了方便安装接下来会完成MakeFile的编写。

也是出于喜欢,最近开始了研究机器学习方面的东西,还未入行,只是根据教程自己做了下怎么识别验证码.用的是google的OCR开源库tesseract-ocr.使用python来实现的.我来写下我实验的过程.

环境准备

环境安装

first step

1
2
git clone [email protected]:madmaze/pytesseract.git
python setup.py install

此时如果使用pytesseract.image_to_string,会抛出OSError: [Errno 2] No such file or directory error,详情看https://github.com/madmaze/pytesseract/issues/13

这是因为没有安装tesseract-ocr

1
2
3
4
# ubuntu
apt-get install tesseract-ocr
# OSX
brew install tesseract

OK

fuck checkCode

1
2
3
4
5
6
7
8
9
10
11
# 图片预先处理,去噪
from PIL import Image, ImageFilter, ImageEnhance
import pytesseract
im = Image.open(image_name)
# 滤镜
im = im.filter(ImageFilter.MedianFilter())
# 去噪
enhancer = ImageEnhance.Contrast(im)
im = enhancer.enhance(2)
im = im.convert('L')
print pytesseract.image_to_string(im)

OK

后续

之后我会去研究更高级的一些识别方式.这种方法识别率还是很低的.

我是从实习的时候开始使用Mitmproxy的,当时是为了Debug APP的bug才使用的。编写一个python小脚本将流量都转发到自己的Server上,对接口进行Debug。

mitmproxy叫做man in the middle proxy,就是中间人代理的意思,一般的中间人攻击就可以利用这个软件,相似的软件还有Burp Suite,是一个收费的软件,进官网下载免费版的就可以使用,有图形用户界面,功能也是相当强大,因为使用Java编写开发,有很好的跨平台能力。Windows平台上有Fiddler,功能也是很强大,不多说直接进入今天的正题。

环境介绍

一般开发有三种服务器,dev,beta,online。Android,iOS发Build包一般都会指向测试服务器,但是你要做开发,或者Debug就要指向自己服务器,或者是线上服务器,不能总是麻烦他们,所以这时就需要一个代理来转发请求。

online一般都是Https,所以对于https还要做一些其他处理。

安装一个Mitmproxy

不管是是什么平台只要安装好python-pip,就可以直接安装Mitmproxy

1
pip install mitmproxy

mitmproxy会在~/.mitmproxy目录下生成一个mitmproxy-ca-cert.pem证书。如果是对端开发,支持https就要安装自签证书。

1
python -m SimpleHTTPServer 8888

手机访问http://ip:8888 安装证书

1
mitmproxy -p 3128

手机设置代理到ip:3128,此时就能抓到https的数据包了。

自签证书

1
2
3
openssl genrsa -out cert.key 2048
openssl req -new -x509 -key cert.key -out cert.crt
cat cert.key cert.crt > cert.pem

运行

1
mitmproxy -p 3128 --cert=cert.pem

Script支持

转发一定少不了脚本支持

Example

1
2
3
4
5
6
def request(context, flow):
if 'www.baidu.com' == flow.request.hots:
if flow.request.scheme == 'https':
flow.request.scheme = 'https'
flow.request.host = 'blog.ibeats.top'
flow.request.prot = 443

运行

1
mitmproxy -s forward.py -p 3128

帮助文档

官方文档官方script

vim最近配上了python mode插件,后来发现项目下经常会多出来一个.repoproject文件夹,谷歌无果,接下来写python项目时就会碰上卡死的问题。pyhotn mode带来很棒的支持,但是这个卡死就实在不能忍受。

今天发现卡死的时候状态显示regenerate repo cache…,那么肯定和python mode的repo有关,先不去考虑repo是什么,谷歌regenerate repo cache后来找到了答案。

Solution

编辑你的~/.vimrc,添加以下配置,禁用repo

1
2
3
" close python mode Regenerate repo cache
let g:pymode_rope = 0
let g:pymode_rope_lookup_project = 0

Reason

rope 这个插件在文件保存的时候创建 rope 信息的时候,需要非常长的时间,让 vim 长时间无法响应。

Clone my config in github

github: dotfile

我喜欢在手机上的备忘录里面写一些东西,然后截屏分享出去,有时写多了就不能截一张Screenshot,然后就想弄一个长微博生成器。一般长微博生成器最后都是生成一张图片,我的编程习惯一般都是首选python,然后使用了Pillow库来编写的,不建议使用PIL,而是去选择friendly PIL,就是Pillow库。

思路

如果效果好看则使用头图和页脚,中间则是标题跟正文,这样基本就可以生成长微博。头图使用一个图片,长微博宽度以头图为准,默认则是750(IP6的分辨率1334*750)。文章区则是根据长微博宽度和文字大小算出每行的字符数来生成区块。最终进行拼接。页脚就不用再次多说。

项目