且行善举,莫问前程。

0%

Let’s Encrypt

众所周知国内域名不备案是不能随意解析的,放到国外又会影响服务响应速度,使用云服务又增加了开发成本,备案呢又很麻烦,在上海还需要居住证。但是国内备案只检测 http 的80端口,而 https 的443端口幸免于难。更是响应 Google I/O 2016 的号召,我们都应该使用 https来加密我们的网站,这样也能避免 ISP 劫持,最重要的是被运营商劫持。

有很多家免费的 https 证书提供商,如StartSSL,有效期一年。国内有沃通,有效期也是一年。但是申请和维护都比较麻烦,毕竟是免费的。

但是我们也有其他的选择,Let’s Encrypt,有效期三个月,但是可以使用脚本或者安装 certbot 自动续期。

HTTPS

HTTPS 建立一条安全的网络通道,有效的防止被网络窃听以及中间人攻击

证书类型

HTTPS 证书分三类,浏览器会在地址栏给予不同证书不一样的展现。

  1. DV 域名验证证书
  2. OV 组织机构验证证书
  3. EV 增强的组织机构验证证书

每类证书在审核和验证方面要求严格程度不同,一般自签证书可以利用 Openssl生成公钥私钥,但是浏览器会有安全警告,12306就是自签证书。所以我们要使用 Let‘s Encrypt来创建证书。

配置我们的 SSL 证书

lua-resty-auto-ssl

在 Ubuntu 上配置很容易,最好的方案是用 lua,nginx 对 lua的支持极好性能优越,很多负载均衡脚本都是由 lua 编写的。推荐使用 OpenResty 部署服务器,也可以使用我的lua-jit 版本的 nginx-lua 来部署,lua-jit 安装 lua-resty-auto-ssl 不是很方便,lua-jit 通过 LuaRocks 安装需要进行一些配置。

Let’s Encrypt Without Sudo

这是提供的 Python 方案。具体可以看letsencrypt-nosudo,文档中已经详细的指出使用方法和 Openssl 的自签方案。

cretbot

自动化创建证书,自动续期。

其他

如果不懂 server 配置文件怎么写的可以使用 ssl-config-generator,是 Mozilla 搞出来的配置文件生成工具,着实方便。

Virtualenv

Virtualenv 之前也说过,Python 的虚拟环境管理软件,习惯使用这个原因是因为可以管理不同开发项目的 python 依赖。还有一个功能就是可以管理不同的 Python 版本。

1
virtualenv -p /usr/bin/python2.6 <path/to/new/virtualenv/>

这样可以创建 Python2 和 Python3 的两个环境,日常也在虚拟环境中,不会弄脏系统版本。

如果做开发建议还是远程开发,vagrant 或者 docker选择适合自己的一个。

VirtualenvWrapper

virtualenv 的管理工具,将你创建的 venv存放在同一目录,可以随意切换,使用简单方便。如果环境不是太多,创建脚本后,可以直接将版本配置在 bash 中。

现如今安全问题不能小觑,你敢公开你的QQ密码吗?但是我就可以,他们依然不能把我的QQ怎么样,因为我使用了二次验证。也许比较陌生,但是很早之前就已广泛使用,比如网银等等。互联网的兴起,也让人们更加关注安全问题,各家公司都出了自己的令牌。比如QQ安全中心等。

其实都是同样的东西,Two-factor Authentication(2FA) 也就是两步验证。当你输入完你的密码时,需要再输入一次动态密码,这个密码一般都是变化的,每三十秒刷新一次。具体原理我已经写在了 GitHub 的 ReadMe 中,稍后我会贴出链接。

我给我的账号基本上都绑上了二次验证,来增强账号的安全性。之前用的 Google 的Authenticator,后来换成了 Authy,这些可以在应用商店里下载到,后者的优势是可以备份你的账号。当你换手机还能恢复回来。但是同理都是基于 Google 的协议来做的。

所以我做了一个能在 Web 中使用的 2FA 的框架,可以直接生成二维码,扫码即可绑定。

Demo、介绍请看 GitHub

生活

早晨起床或早或晚,吃早餐或者不吃早晨,地铁也许公交或者打Uber上班。工作一天,完成任务或者加班。晚上回家。

空无一人

或许你是独处,或许你有朋友或者伴侣,我想大多数人仍是一个人在外打拼,在外找人回家结婚毕竟是不太靠谱的事情。

早晨起床你就开始机械性的收拾准备,或快或慢。晚上回到自己一人居住的小窝,空无一人没有生气。也许这样是可悲的。我不知道这样的事情都已经成为了常态,除了周末和晚上,其他的时间都是不属于自己的,在这快节奏的城市中怎么都无法慢下来。

无尽循环

这样的生活是不能停下来的,当初你来到这里带着你的决心,所以这是你做出的选择,然后你就要活下来,或者是站稳脚跟,你要不停的工作来赚取你的生活费。然后就是每天就这样的无尽循环,然后再想想这是不是你要的生活,哪怕你停下来一刻,你的心都不是安定的,哪怕只是暂时的丢掉了工作。你都能紧张的要死哭天喊地的,然后再想这是不是你要的生活。

追求

当然你是为了你的追求才来到的这个城市,因为这里才有机会,但是后来你也许迷失了,忘记了初心也忘记了当初的追求,陷入生活的俗套中。

结果

我们或许最终都还是回到家乡,拿着攒下的钱,在家乡开家店,过着平淡慢节奏的生活。我是来推荐别人写的一篇文章的,今天在豆瓣读到的,也许你回到家乡,你一身的才能不能发挥,你回到了一种慢节奏的生活状态,也许会不适应。但是无一例外只要你踏上这一步,你就再也没有家,没有归属感。下次推送给你们分享一个视频。心在哪里,家在哪里。

豆瓣链接:租房或找工作即找死指南

后记

我文笔很差,只想着匆匆结尾,今天是周末的第一天,外出逛来逛去,不想宅在家里。我是很想逃离这种状态的,毕竟我想活的洒脱一些。但最后看来自己时间依然大部分都会卖出去,不过忙里偷闲,多做些自己喜欢的事情,世界上有趣的东西太多了,不能都抓住但是总能抓住一两个。

活的开心就好,对于我来讲我并不想回去,我只想走的更远,现在的自己是这样的。

我跟别人说我没有爸爸,我还跟别人撒过很多谎,讲着讲那最后发现实时已经不那么重要,因为只要不做伤害一个人的事情就好。不作恶,哪有那么多的真理来寻找。最后只有自己知道就好。每月发工资,会帮家人还一些贷款,然后钱又所剩不多。我想会好的,曾经天真的自己以为什么都能扛得住,是我错了,或许那叫自大那叫傲慢,最后也许可能会伤到别人,还好,也许没有伤害到别人。还好还年轻,可以再拼搏一下,一切都还不是定局,有时总能感受到自己在对自己说你应该尝试换个职业。有时想入一个行当,会很难。也许最后都是为了钱,我没有满足,我只想赚更多的钱,可能是执念,执念永远都是执念,人只能一直先前走,因为时间还不能倒流。

博客迁移

最近看一些技术博客,很多博客都是用的next的主题,再一看使用的hexo的博客引擎,再去github上看一看next主题,有点难我是迁移不来的。

我的博客

之前使用的liiac模板渲染引擎,主要原因是python开发的,对我来讲是很容易维护的,可以自己添加一些功能。模板也是用jinja2来写的。就功能来讲的话基本是足够了。但是人都有一颗追求美的心。让我写前端还可以,但是让我凭空设计一个那是难上加难。所以要直接换成hexo了。

迁移准备

因为都是markdown渲染,所有没有什么数据库的问题,直接把post文件拿过来就好。仔细对照格式只要把头部修改一下就可以。之前用的tom来写的配置,hexo像是用yaml。

tom

title = title

yaml

title: title

我要考虑的是,遍历所有的文件,将tom格式替换成yaml。首先考虑的肯定不是python,而是有更好的选择,那就是sed。

Stream Editor

用vim比较多的肯定喜欢(我这句话很多余,vim党根本不用看我这种水文)使用sed,可以很轻松的批量编辑文件中的内容。 而且一些GUI编辑器也会支持这样的高级操作。sed大概有36岁了。

替换内容

sed -i ‘s/oldstring/newstring/g’ file

  • i 是为了直接替换文件内容,否则只会输出到控制台
  • 不加g也可以,具体需求查手册

Mac下

sed -i ‘’ ‘s/oldstring/newstring/g’ file

不备份

替换指定行

sed -i ‘’ ‘1,6s/oldstring/newstring/g’ file

删除指定行

sed -i ‘’ ‘3d’ file # 删除第三行

脚本如下

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash

for file in ./*.md
do
sed -i '' '1,6s/datetime/date/g' $file
sed -i '' '1,6s/ \=/\:/g' $file
sed -i '' '1,6s/-----/---/g' $file
sed -i '' '4d' $file
sed -i '' '4d' $file
sed -i '' '2d' $file
echo $1 $file
done

做开发时,总会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 git@github.com: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