23
2016
September

Python的测试利器-mock

## 问题 如果一个函数没有外部的依赖,那么测试的流程比较简单,无非是将不同输入附加到被测试函数里面,比较期望与实际输出的差异。 比如测试一个add函数: ```Python import unittest from unittest import TestLoader def add(number1, number2): return number1 + number2 class SimpleTestCase(unittest.TestCase): def test_add(self): number1 = 1 number2 = 2.......

17
2016
July

V2ray--科学上网的神器

2017-01-14更新 KCP是双边加速的协议,需要客户端与服务器配合使用。而Linux 4.9开始,内核内置了单边加速的BBR模块,也可以尝试一下。 V2ray是继ShadowSocks之后的又一个科学上网神器,它兼容shadowsocks并且还有自己的一些特性。V2ray目前只有golang版本,因为golang跨平台的特性,所以V2ray可以运行在三大主流操作系统下面。遗憾的是目前并没有手机或者路由器的客户端,所以移动客户端上面使用还是有些不便的。 ## 安装方式 对于服务器,你可以使用作者提供的[bash脚本](https://www.v2ray.com/zh_cn.......

16
2016
July

AppArmor,Linux下的程序权限限制模块

最近在迁移MySQL的数据目录,意外发现修改mysql的配置后mysql进程无法启动。报错大概是无权限修改新的数据目录。仔细查看数据目录的权限后我发现 其实数据目录的owner已经属于mysql了, 所以问题应该出在其他地方。 ## Linux 基于文件夹的权限管理 其实Linux下面主要的权限管理,访问限制大部份是通过对文件设置不同的权限实现的。 举一个最常见的例子, 在家目录下`ls -al` 可以看到如下的结果: ```bash user1@hostname:~$ ls -al total 948 drwxr-xr-x 4 user1 user1 4096 Ju.......

21
2016
May

Python的又一个坑

### 不要使用可修改的对象做为函数的默认参数。 查看如下代码: ```Python def test(name="lily", person={"age":2}): person["age"] +=2 print(person) ``` 调用`test()`两次,person使用默认的参数,那么第一次的输出,age为2,第二次为4. 函数的默认参数在函数定义的时候就初始化了,以后每次调用这个函数,函数默认参数指向的都是最开始的引用。调用test函数两次,person这个对象先后被访问两次,每次age+2,这是我们调用函数两次得到不同输出的原因。 而对于默认为stri.......

10
2016
May

strace--linux下的调试工具

### 什么是strace 调试代码的时候,print是很好的工具,借助print可以输出许多有用的信息。但如果一个程序已经编写完成,并且正在运行,又或者你甚至不能看到它的源代码,如果此时有人说这个程序运行不正常,你如何去调试呢? 目前我能想到的有如下工具: * ps * top * nethogs * wireshark * strace ps和top可以查看程序是否运行,是否占据了大量的cpu。nethogs可以查看程序的带宽使用量,而wireshark则可以抓取主机的数据包,根据程序需要的网络操作查看程序的网络输入输出是否正常。 而strace相对于之前的工具则更加的.......

17
2016
April

Linux的logrotate

本文介绍了linux下面的logrotate机制 ### 什么是logrotate logrotate是一个\*nix下的程序,用来管理其他应用的日志文件。 比如apache或者nginx,它们的日志一般位于 `/var/log/`,我们在相应的目录下经常可以看见类似下面的文件结构。 ```bash error.log error.log.1 error.log.2.gz error.log.3.gz ``` 理论上apache或者nginx的错误日志按照默认的配置永远只会写入一个文件。 而logrotate会定时(比如每日)执行一个任务,将目前的log文件序号分别加一,压缩旧.......

Gunicorn的同步与异步模式

Gunicorn Gunicorn 是Python下面的一个WSGI server,它的实现参考了ruby下的Unicorn。最近使用gunicorn的时候遇到了一点问题。 目前的架构,所有的web请求都被nginx处理,对于静态的文件,nginx直接映射请求到本地的静态文件夹里面;对于其他请求,nginx将会proxy_pass到后端的Gunicorn进程里面。Gunicorn再通过WSGI调用后台的Python代码。 遇到的问题 在部分情况下我们发现CPU占用率并不是很高,但Gunicorn的响应速度很慢,一个请求有时候需要一直等到nginx超时,504 Time O.......

29
2016
March

一个Vim的宽屏bug

我一直使用自己配置的[Vim](https://github.com/fzlee/Vimrc "Vim配置"),Vim右侧是The Nerd Tree,用来流览项目文件夹的文件。在笔记本屏幕上面使用Vim并没有什么问题。但是自从外接了一个分辨率1920X1080,23寸的显示器后。我意外发现使用外接显示器时,鼠标无法选中The Nerd Tree里面的文件了。 不论编辑本地还是远程文件,都会出现同样的问题。更加准确地说,Vim界面的右侧,超过一定宽度之后Vim就不响应鼠标点击的事件了。 换用neovim可以解决这个问题,但是neovim个人感觉还不稳定,也不敢使用它做为主力的.......

29
2016
January

小技巧--优化mysql的count

2016-11-04更新 目前看来,解决分页时count性能低下最简单的方法就是不要计算分页的信息。前端每次请求某一页的数据, 比如传入page=10, 后台根据page计算offset,然后返回数据: sql select * from books offset 100 limit 10; 如果前端得到的记录个数为0,说明后面没有更多的数据了。更加高效的办法是前端返回前一次请求最后一条记录的id, 比如100, 后端可以更高效的获得数据: sql select * from books where id > 100 limit 10 需求描述 有这么一个项目.......

02
2016
January

更新StartSSL客户端证书

## STARSSL 这货被360收购,不要用它们的证书了,换letsencrypt的吧 这个网站使用的是[StartSSL](https://startssl.com "StartSSL")的免费证书,它签发的免费证书有效期一年,比起目前[Let‘s encrypt](https://letsencrypt.org/ "Let‘s encrypt") 的三个月有效期证书,前者应该更加方便一些。 一般的MPKI都会使用双向验证方式来保证安全性,也就是你登录的证书管理界面的时候,不仅你需要验证服务器的证书,服务器也需要验证你的证书。StartSSL的客户端证书的有效期也.......

13
2015
December
10
2015
December

iptables原理介绍

说一句题外话,原来杭州电信的光猫桥接只需要和客服说一声就好了,不用大费周章。 ============================= 最近在折腾openwrt上面的端口映射,最开始死活搞不定,只好重新过了一遍iptables,这次貌似理解了不少。 现在看来学习iptables就和学习vim一样,入门难度高,但是一旦理解之后似乎就变得非常好用了。 什么是iptables 它是一个linux下的命令行工具。 它用来管理流入,流经以及流出操作系统的数据包,工作于网络层以及传输层。 它也被称作系统防火墙。 iptables处理数据包的流程 总而言之,iptab.......

10
2015
November

破解电信的光猫DP607-G3

电信的光猫DP607-G3(硬件版本G3.V1.04)在web界面不能设置端口映射,使用起来未免有点不便。简单的解决方案是上淘宝,5元搞定。 网上的方法比较复杂,可能是操作系统版本比较新了。 我的软件本是G3.V1.2_ZJ_001,硬件版本是G3.V1.04。在这个前提下有简单的破解方法。 1.使用useradmin帐号登录并打开http://192.168.1.1/backupsettings.conf 2.查看下载的文件,搜索password,你会看到如下配置: Password是给telecomadmin用的,UserPassword是给useradmi.......

15
2015
October

ThreadLocal

之前有介绍过Flask的一些内容, 但是感觉不是很深入。比如对于g,session之类的属性到底是什么,为什么在不同的代码段里面可以直接使用?不同线程向里面存入数据,为什么不会冲突? ThreadLocal 所谓的ThreadLocal是针对线程安全而言的一个概念。假设一个进程里面有一个变量,子线程能够同时读取修改它,那么多线程运行的时候为了保证不出现问题,就须要使用锁等额外的机制保证变量不会被意外的修改。这会增加编程的复杂度。 使用空间换效率的一个解决方案是为每一个线程创建一个单独的同名变量。在程序员看来,变量名一直没有改变;在程序看来,不同线程里面的变量实际指向了不同的.......

19
2015
August

编程语言学习曲线

转载自https://github.com/Dobiasd/articles/blob/master/programming_language_learning_curves.md 这理有几张比较有意思的漫画,介绍了编程语言的学习曲线。横轴代表经验,纵轴代表效率以及对自我的评价。 JavaScript Java C++ Python Lisp   Haskell   Lisp