13
2017
September

2017前端入门指南

这篇文章将会使用Vue-cli + Vue2.0 + Bootstrap4.0开发一个后台的管理系统,样例代码放在github。本片文章适合入门的前端学习者。 按照vue的官方文档的说法,不建议vue的初学者使用vue-cli,可如果我们不试试vue-cli,那么即使以后熟悉了NodeJS,也仍然不会用vue-cli,多用用似乎才是学习的最佳实践。 项目初始化 执行两个命令即可以初始化我们的项目 ```bash npm install -g vue-cli # 安装vue-cli vue init webpack mydashboard # 创建一个名为mydashboa.......

07
2017
July

逆向微信的一些结论

从春节前后至今,我大约花了5个月的时间,以997的心态对微信客户端进行了一系列的分析研究。之所以是997,是因为如果9点之后还在倒腾这些东西,那么睡觉时还会想这些乱七八糟的事情,睡不着。这种经历希望以后不会再有。至少目前看来,逆向微信并不需要太多的技术积累,不需要所谓的高级知识。你需要的只是大量的时间,以及大量的时间,以及,大量的时间。 这篇文章不会介绍任何逆向工程的方法。 微信果然是基于Mars和MMTLS的 Mars是微信的一个开源网络项目,提供了两个主要的功能: XLog,一个基于mmap的高效log组件。 STN,一个基于socket的网络组件,提供长链接以及短.......

09
2017
June

自定义一个Django的Model Filed--StaticJSONField

使用JSON保存用户数据的问题 有时候我们会用json来保存一些杂乱的数据,比如一个用户的各种信息,这些信息被序列化为一个json字符串并最终存放在数据库的一个column里面。 python user.config = { "accept_notification": True, "accept_invitation": True, "level": "golden" } 使用json保存这些配置的好处在于,添加或者修改属性的时候你不需要对数据库进行修改。在关系型数据库看来,这个config不过是一个字符串而已。 但是这样做也会有一些问题,比如: .......

02
2017
May

发布一个你自己的pypi包

我之前写了一个简单的pypi包。这篇文章介绍将软件进行自动化测试并推送到pypi的一系列流程。 创建pypi帐号 首先,你应该在这里创建一个帐号。创建的帐号密码可以用于之后向pypi推送软件包。 软件包的目录结构 最官方的配置在此, 一般来讲,以python-alipay-sdk这个项目而言目录结构应该是这样的: bash LICENSE.txt # 采用的开源许可证 setup.py # 定义软件包信息的文件 requirements.txt .......

05
2017
April

制作一个简易的聊天机器人

本文介绍了如何制作一个非常简单的聊天机器人。你完全不需要具备任何机器学习的基础。 前端-微信或者Slack 所谓前端,是用户和机器人交互的界面。一个比较常见的方式是在网页上面进行聊天。不过编写一个实时的网页聊天室应用貌似有点过于麻烦了。 目前有两个比较方便的聊天应用, 一个是Slack, 另外一个是微信的网页版。除此之外,你也可以使用其他的消息接口,比如Github的Hubot等等。 比如微信的网页版,其接口已经被封装成了一个简单的Python库(itchat)。如下代码可以直接将它自己收到的文本消息返回: ```Python from wechat import itc.......

01
2017
March

TLS加密通信的一些原理

本文完全不涉及对TLS协议细节的分析。本文不会介绍太多关于对称密钥,非对称密钥算法的实现细节。为了简单起见,你可以将下面提到的对称加密理解为AES算法,非对称加密理解为RSA算法。 最近在折腾某黑色产业,因此花了不少心思在TLS协议上面。我看过不少博客对于TLS 的介绍,现在回过头来审视这些文章,感觉大部分的介绍都不太准确。以下是我个人对TLS原理的一些理解。 入门知识 哈希(HASH)函数 将输入的数据转换成为定长输出的算法就是哈希算法,常见的哈希算法有md5,sha1, sha256等等。哈希算法一般有着不可逆的特点,即给定输出,不能够轻易的反向计算出输入。比如big.......

基于Redis以及WebSocket的一个实时消息推送系统

本文介绍了一个简易的实时消息推送系统。 需求分析 后台同时对接了网页,微信公众号,iOS以及Android客户端。在某些特定场景下,比如一个用户接收到其他用户的提问,我们就需要向这个用户推送一条消息。用户或者在手机上收到了一条弹窗通知,或者在网页上看到了消息图标显示小红点。 公众号消息推送使用客服接口推送消息。 移动端的消息推送使用国内某些知名的推送平台。在用户从APP登录的时候,APP会主动向推送平台设置自己的ID。后台将消息发送到推送平台时指明这个ID即可。 网页的消息推送一般常见的实现方法有轮询,长连接,WebSocket等等。关于三者的区别这里不加以讨论,总之我.......

21
2017
January

博客的第二次更新

这个博客上次后台代码的更新大概是在2014年的时候吧。现在依然可以看到当时做的一些事情。那时我刚毕业不久,工作上的任务不多,一有时间就开始整理代码。 印象中大概做了如下一些事情: 博客功能的完善,比如友情链接,评论,RSS的订阅。 手机移动端的优化,涉及到前端的一些功能,使用自己定制的bootstrap。 将服务器从GAE迁移到DigitalOcean,此时数据库也从谷歌的datastore 变成了MySQL。 使博客同时支持markdown以及ckeditor。 而最近的一次更新,我没有添加任何新的功能,主要心思都花费在了后台上。 为了加速网站的访问速度,我在服务器.......

20
2017
January

树莓派安装Arch Linux

我之前有一篇文章介绍在树莓派上面折腾个各种应用的教程。这些应用的运行需要内存的支持,应用运行的多了,甚至1GB的内存也会有不够用的时候。 目前市面上的开发板,1GB内存是主流,2GB的开发板价格就贵了。而我需要的只是一个远程的服务器,能够一天24小时运行一些不太重要的任务。从这个角度而言,Raspbain自带的桌面系统,浏览器,开发环境等等对我来说就是多余的,显得有点重量级了。 而如果树莓派上面安装的是Arch,平时大概也就169M左右的内存使用量。 上面的截图是在运行samba,transmission,Resilio Sync,zeronet, tor等等服务时的内存.......

14
2017
January

开启BBR,加速网络访问

我们应该有听过锐速,finalspeed或者KCP等等网络加速的工具。但是它们并没有获得广泛的使用,今天我要介绍的是BBR算法,它由谷歌提出并且已经被合并到了Linux4.9的内核里面。在所有的加速方法里面应该是比较**正统的**一个了。 ## BBR 的原理 网络加速的方法一般有两种,单边加速和双边加速。 一个简单的单边加速的算法是对于一个下行的数据包,服务器总是发送两遍。如果客户端收到重复的数据包就会直接丢弃,不会出现什么问题。而假定一个不稳定的线路上假定数据包丢包率为10%。故意重复发送数据包可以将丢包率减少到1%。我们知道,单个TCP下载的网速很大程度上受限于丢包率,.......

18
2016
November

关于Python下的支付宝App支付

最近在折腾支付宝的移动支付(alipay.trade.app.pay), 直观的来说就是让iOS或者Android应用唤起支付宝,支付宝支付成功之后再返回应用。 支付宝App支付没有提供Python的SDK,后台和iOS以及Android的对接难免遇到了些问题,尤其是SHA1withRSA或者SHA256withRSA签名的部分。本文将会简单介绍一下支付宝App支付的一些流程以及原理,希望能够给后来的Pythoner一些解决思路。 如果你不希望看到过多的技术实现细节,你可以直接使用这个库。或者pip安装 pip install python-alipay-sdk 支付宝.......

05
2016
November

使用Fabric部署你的应用

本文介绍如何使用Fabric自动化部署Python的应用。 假定我们有一个Web应用,使用Gunicorn运行,同时后台有一些rqworker处理一些异步的任务。同时supervisor监控这些进程的运行。每次本地修改代码提交之后,一般流程是登录服务器使用git pull 将新的代码拉下来,然后重启这些进程。频繁执行这些机械的流程比较麻烦,我们可以自动化运行这些工作的流程。 ### Fabric简介 Fabric是一个Python的库,它对ssh进行了一些封装使得我们能在本地或者通过ssh在远程服务器执行一些命令。这个库只支持python2。Fabric3提供了对Python.......

04
2016
October

BIOS,MBR,GRUB的一些理解

***这篇文章完全不涉及UEFI,GPT相关的介绍***。 本文提到的硬盘/U盘指的都是一般的存储设备,并不需要特殊区分。 我在前一篇文章介绍过在U盘上安装一个Arch操作系统的流程。不幸的是Arch并没有一个图形安装向导。将操作系统需要的程序写入U盘比较直接,但是生成GRUB比较麻烦。Arch有一个Archboot的项目,是一个命令行式的安装引导程序,能够帮你生成GRUB,不幸的是U盘安装依然遇到了问题,还是手动安装GRUB比较好吧。 这篇文章会涉及如下一些概念: `dd`,`fdisk`,`file`, `BIOS`, `GRUB`, `MBR`。 我们假定U盘插入电.......

03
2016
October

在U盘上面安装滚动发行版的Linux

目标 本文介绍如何在U盘上安装一个linux操作系统(不是Live CD),希望能够实现如下目标: 1. U盘上面安装一个滚动发行的Linux。 2. U盘需要分两个区,一个系统够区,用作Linux;一个数据区,能够正常被macOX,Linux以及windows读取写入。 3. U盘需要能够从Virtualbox以及PC正常启动。 之所以是滚动发行的linux,是因为这样可以平滑升级系统,不需要在系统下次更新的时候大动干戈。比较有名的滚动发行的linux应该算Arch和gentoo了吧。之前一直有感于Arch官网文档的全面,因此我决定安装一个Arch的系统。Arch 的安装比.......

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.......