2017-07-18
gitlab 配置要点

gitlab 是个不错的开源套件,它提供了一套自建私有的类 github 服务的一站式解决方案。

和我之前介绍过的 gitolite 不同, gitlab 提供了清晰完善的前后台操作界面,管理上更加容易。

另外,如果有更进一步的 Code Review 需求,应该尝试 gerrit

阅读此文

2017-06-27
手机抓包工具汇总

做移动开发,抓包是基本功。现在的开发者当真是非常幸福,因为抓包工具已经非常成熟了。

在移动设备上抓包,需要下面几个方面的配合:

  1. 移动设备支持;
  2. 代理服务器;
  3. 分析工具。 阅读此文

2017-06-14
解包 APK

出于研究的目的,我们可能需要反编译 APK 并得到源码。这件事相当简单,因为先行者们已经做好了所有的工作,我们要做的就是下载,使用他们开发出的工具而已。

如果只是需要反编译之后的 JAVA 源码,最简单的方案是这样: 阅读此文

2017-04-21
Flask 在 Debug 模式下初始化2次

Flask 在 Debug 模式下启动的时候,会被初始化两次。看下面的代码:

1
2
3
4
5
6
from app import app
import time
if __name__ == '__main__':
print(time.time())
app.run(port=5000, debug=True)

输出: 阅读此文

2017-04-13
uWSGI+rsyslog 实现 rotating logging

uWSGI 可以使用 --logto / --logto2 / --daemonize 这几个参数来指定把 log 写入普通文件。但普通文件管理起来比较麻烦,我们可以利用 Ubuntu/CentOS 中自带的 Rsyslog 来实现日志管理。本文以 Ubuntu 16.04 为例。 阅读此文

2017-04-12
uWSGI + Nginx 的 HTTPS 支持

有时我们在一台机器上部署多个 uWSGI 服务,并提供 HTTPS 支持。使用 proxy_pass 代替 uwsgi_pass 是很简单的方案: 阅读此文

2017-03-23
uWSGI 的编码问题解决

在把 Flask 写的应用通过 Supervisor+uWSGI 部署到正式服务器上时,出现了这样的错误:

Unable to print the message and arguments - possible formatting error.

或者

UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 24-25: ordinal not in range(128)

有趣的是,直接在 Python 环境下运行的时候,没有这样的错误。使用 uwsgi uwsgi.ini 这种方式来运行也正常。

由于对 unicode 的支持不够完善,这种报错经常会出现在 Python2 中,但我的所有程序都在 Python3 中写成,不应该再出现这样的错误。况且,所有的 python 文件都在首行设定了编码:

1
# -*- coding: utf-8 -*-

我的环境如下: 阅读此文

2017-02-27
SQLAlchemy and MySQL TIMESTAMP

SQLAlchemy 是一个功能强大的 ORM 。本篇介绍使用 SQLAlchemy 处理 MySQL 上的 TIMESTAMP 类型的一点小技巧,很冷门的知识点哦。 阅读此文

2017-02-12
使用 audacity/lame/ffmpeg 进行 mp3 文件瘦身

注意:这是一篇非常基础的工具使用文章。

虽然已经迈入了 4G 时代,但由于各种各样的原因,国内的手机用户(主要是安卓用户)依然偏爱比较小的安装包。同样偏爱小安装包的还有国内各种安卓野鸡市场。因此,对于移动游戏开发者来说,掌握素材瘦身技能是必要的。本文主要介绍如何对 mp3 音频文件进行瘦身。 阅读此文

2017-02-06
EOF occurred in violation of protocol

我在使用 requests 的时候频繁遇到下面的错误:

EOF occurred in violation of protocol (_ssl.c:600)

这个错误在 Python2 和 Python3,macOS 和 Ubuntu 下都有出现。从报错信息中可以看出该错误与 HTTPS 握手相关。

这个错误在 这个 issue 中讨论得最为充分。

通过分析,我找到了这个问题产生的原因:在安装 requests 库的时候,没有正确安装 security 包。

下面是解决方案(针对 Ubuntu): 阅读此文