用csv文件进行Junit5的参数化测试

一些函数式的接口,给定输入、期待特定输出,没有太多副作用,特别适合参数化测试(Parameterized Test)。 JUnit5提供了多种参数化测试的形式,本文着重介绍CsvSource和CsvFileSource。

用setuptools_scm来自动控制Python包的版本

手动管理Python包的版本号一段时间后,寻求自动化的手段,是自然而然的。

pytest的插件介绍:pytest-cov、pytest-pep8与pytest-flakes

pytest不仅是一个功能强大的测试框架,同时也是一个插件化的测试平台。

JUnit5简介及其Gradle初始化

JUnit5已经从一个孤立的jar库,变成了一个平台(一群jar)。 本文基于Gradle的4.x版本,介绍其初始化配置与使用。

在Hugo中使用MathJax

有时候,会有需要在网页中展示数学公式。 与代码高亮不同,Hugo本身是不支持渲染数学公式的。 官方文档的MathJax使用方案有一些问题,本文提供的方案胜于官方。

用Python做数据分析的环境初始化

从一个标准的Python环境,到一个可以做数据分析的环境,还需要有一些准备工作。 本文就是记录这些准备工作,便于查阅。

在setup.py中配置SWIG模块

SWIG的一个优点是,受到了distutils/setuptools的原生支持。 在setup.py文件中,可以很方便地直接把*.i文件作为源文件进行配置,而不用手写编译脚本。 本文通过一个Demo项目,来讲解如何在setup.py中对SWIG进行配置。

用CLI安装Android SDK

在进行个人的Android开发环境准备时,通过Android Studio可以在一个漂亮的图形界面,安装、配置Android SDK。 但它也可以通过纯CLI的方式完成,有时反而更方便。

用SWIG向Python提供C++里STL的容器

在Python项目中使用C/C++的代码,除了少数场景,其它都有数据交换的需求。 而C++的vector、map等,则是常见的数据容器。 本文介绍如何利用SWIG,在Python中调用STL的string、vector和map。

解决setup.py编译C++代码的-Wstrict-prototypes警告

本文介绍了一个在利用setuptools的Extension来编译C++代码时,会出现的-Wstrict-prototypes警告,及其解决方案。

pytest中使用mock

单元测试的条件有限,在测试过程中,有时会遇到难以准备的环境。 比如,与服务器的网络交互、对数据库的读写等。 而mock的技术,就是在测试时,不修改源码的前提下,替换某些对象,模拟测试环境。

使用ninja命令提高单模块编译效率

从Android 7.0开始,默认使用ninja进行编译。 从Android 8.0后,默认启用Soong、Android.bp。 在开发过程中,以前最经常使用的mm、mma等单模块编译功能,现在变得及其耗时。 本文介绍如何用ninja命令,来提高单模块编译效率,缩短开发流程(到当年没有ninja的状态)。

SDKMAN!的安装与使用

在使用Linux系统作为开发环境时,偶尔会遇到需要使用最新版软件的问题。 然而,如果使用Debian的stable或Ubuntu的LTS时,却不能用apt简单如愿。 这时就需要有一种用户级的包管理器,可以安装最新版软件,类似MacOS X的Homebrew。 SDKMAN!是一个不错的尝试,至少对一些JVM的常用软件来说。

pytest中的fixture

会写测试,和写好测试,是差距很大的两种境界。 本文介绍pytest中setup与teardown的写法,算是单元测试的进阶内容吧。

蛇宗三字经(The Zen of Python)

记录一下《蛇宗三字经》,以便自省。

定制ENTRYPOINT自动修改Docker中volume的权限

本文简单介绍Docker中volume的权限问题,以及通过定制ENTRYPOINT的一种简单解决方案。

在Python代码中调用C/C++代码

在Python代码中调用C/C++代码,这需求是比较常见的。 毕竟,当代软件世界的基础设施领域是C语言的天下,很多开发工作不可避免地要与它打交道。 而C++则是家族的嫡长子,也占据了一些不可替代的位置。 本文着重介绍ctypes与SWIG,也会提一下其它方案。

Python项目的pytest初始化

pytest,曾用名py.test。 它能兼容unittest与nose的测试代码,写法简洁,并且还有自己的独到之处。 本文仅介绍pytest测试最基本的写法,以及如何在一个Python项目进行初始化。

在AppVeyor上配置Python项目

在GitHub上做CI,大哥是Travis。 不过,Travis只支持Ubuntu和Mac OS X环境。 这就给二哥AppVeyor留下了生存空间,它专门负责做Windows环境的CI,并且对Windows生态下的.NET、Azure等,提供了很好的支持。 本文介绍如何用AppVeyor来做纯Python项目的集成测试。

编译运行SWIG的example代码样例

跑通SWIG的example代码,比Boost.Python的HelloWorld要简单一些。 不过,对不熟悉gcc的人来说,还是很费劲。 本文基于官方教程,补充了一个可行的Makefile。

编译运行Boost.Python的HelloWorld

对于C/C++开发经验不多、或者只有Python经验的人来说,要跑通一个Boost.Python的HelloWord程序,是一件不容易的事。 本文介绍如何避开bjam,用Makefile打通最不容易的那个环节——编译。

setup.py里的几个require

在setup.py中,一般需要要调用setup()函数。 这个函数有诸多参数,其中一类是require,指定了一些需要的Python包。

把footer固定在页面底部

对HTML的footer,有一种常见需求是,要固定在页面底部。 这里说的『固定』,并非普通的放在页面内容的最下方,而是在页面内容高度不足时,仍然显示在页面底部。

用GitPython操作Git库

有时,需要做复杂的Git操作,并且有很多中间逻辑。 用Shell做复杂的逻辑运算与流程控制就是一个灾难。 所以,用Python来实现是一个愉快的选择。 这时,就需要在Python中操作Git库。

利用Git来增量备份中小型数据库

数据库的备份与还原,是网络服务的重要一环。 本文以SQLite为例,介绍一种用Git进行数据库增量备份的野路子。

http/https协议下免输入使用Git

在一些条件下,不方便使用ssh协议来获取、更新Git库,而使用http/https协议又需要输入账户、密码。 本文介绍了免输入更新远程Git库的几种方式,并包括如何统一托管鉴权文件。

在非GAE环境尝试使用VTS Dashboard

虽然VTS Dashboard是专为GAE而开发的,但是仍然有办法在非GAE环境下进行开发与运行。 本文介绍如何在普通的Linux环境下运行一个VTS Dashboard,并且进行数据上传。 这只是一次评估性质的尝试,结果以失败而告终。

同步Git库的一个remote到另一个

有时候有这样的需求: 一个Git库是在某个位置开发、维护的,比如国外的GitHub,但是又希望同步更新到另外一个位置,比如国内的Gitee。 这时,就需要对Git库进行全量同步。 本文以android.googlesource.com上的platform/test/vts/为例,介绍如何进行全量同步。

Debian Stretch上安装、使用Nvidia显卡驱动

近期,孤的Debian办公电脑——ThinkPad T430,经常死机。 直接原因,系统日志显示,CPU温度过高;操作原因,看视频、视频通话。 连续跑满CPU数小时(编译Android)都不会出现CPU温度过高,看视频却出问题。 因此,除了硬件老化以外,孤认为这是显卡驱动问题,所以折腾了一下Nvidia显卡驱动的安装。

Debian上使用Pidgin来替代Lync

Ubuntu上介绍Pidgin的教程比较多,其实Debian也类似,都非常简单。 本文除了介绍Pidgin,也介绍了Lync与Skpye for Business的相关信息。 此外,还提到了一个Linux可用的同类付费软件——Sky。

在PyCharm中添加Django的测试执行入口

本文简单记录如何在PyCharm中,添加Django的测试执行入口。 这么简单的事,之所以要记一篇,是因为其中有个小陷阱。

用Python的minidom写XML

读、或者说解析XML的需求很常见,而写、或者说生成XML的需求就比较少见。 本文简单介绍如何使用minidom,生成一个XML文件。

Docker中的ENTRYPOINT与CMD

本文对Dockerfile中的ENTRYPOINT与CMD进行了简单的介绍和辨析。

给Django应用的所有URL添加前缀(SCRIPT_NAME)的六种方案

有个常见需求是这样的:一个Django应用,在开发时,URL是以`/`为根目录的;而部署时,需要给它一个前缀,比如叫`/prefix/`。 它的使用场景是,在一个域名里托管多个应用,它们仅以前缀区分。

把一个Django应用从1.4升级到1.11

本文记录孤近期的一件脏活。 之前已经把一个1.3的老旧Django应用,升级到了1.4。 现在又要继续,把它从1.4升级到1.11。 这是一次升级历险记!

个人网站选择流量变现产品:AdSense、百度联盟、淘宝联盟

本文简单评估了AdSense、百度联盟、淘宝联盟这几款流量变现产品,即挂广告得收益的东西,并整合了一些相关链接。

Android Oreo VTS的环境、编译与运行

本文对VTS做一个简单介绍,内容包括环境准备、编译、运行、新增测试模块、结果展示等,广泛而不深入。 文中,提供了丰富的链接,以便于查阅官方内容(自备墙梯)。

Hugo中定制Taxonomy页面

Taxonomy,即分类,是Hugo中一个很有用的页面管理功能。 本文基于Hyde这个Theme,介绍如何在Hugo中定制、使用Taxonomy。

更简单地用Travis自动发布GitHub Releases

孤一年前曾撰文《从Travis回GitHub》,描述如何配置Travis,让其自动根据Tag,发布文件到GitHub Release。 本文介绍一种更简单的办法。

在Android平台开发环境安装ninja

在Android 7.0以后,Ninja成为了Android底层真正控制编译流程的工具。 直接使用ninja命令,而非make,可以在某些情况下,提高编译验证、debug的效率。 本文介绍安装ninja的五种方法。

Nginx配置HTTPS与HSTS

本文介绍了如何在Nginx中配置HTTPS与HSTS,以及进行一些简单的优化。

从HTTP到HTTPS必须知道的一些概念

本文记录一些与常用证书相关的概念。 把一个网站从HTTP,配置成HTTPS,了解这些概念就够了。

阿里云申请免费SSL证书

本文简单记录了在阿里云申请免费的DV SSL证书、配置HTTPS的过程。

Nexus Repository OSS 3.x的LDAP配置

本文介绍如何在界面上配置Nexus Repository OSS 3.x的LDAP,以及记录一些坑。

Nexus Repository OSS 3.x简介

本文简单介绍Nexus Repository OSS 3.x的功能、安装、实现、以及与Pro版本的比较。

评估本地PyPI服务

既然已经有了pypi.python.org这个官方源,为什么还需要一个本地源、私有源、企业源? 本文评估了多个PyPI服务的特性与优缺点,并且给出了一些建立本地PyPI服务的建议。

Android编译系统中的Android.bp、Blueprint与Soong

本文简单介绍Android Nougat(7.0)中引入的Android.bp,及其相关工具链。

Ninja文件的基本语法

Ninja是一种类似GNU make的编译系统。 就像make有Makefile,它也有自己的编译配置文件。 相对来说,Ninja文件没有分支、循环的流程控制,本质上就是纯粹的配置文件,所以要比Makefile简单得多。 本文介绍Ninja文件的独特语法。

Android中的Ninja简介

如果说Makefile是一个DSL,那么Ninja就是一种配置文件。 本文简单介绍Android中的Ninja。

Android中的Kati

kati是Google专门为了Android而开发的一个小项目,基于Golang和C++。 目的是为了把Android中的Makefile,转换成Ninja文件。

Android.mk的深入介绍

Android.mk作为Android单模块编译的Makefile,有其独特的写法。 本文从原理、源码的角度触发,介绍Android.mk怎么写,以及如何查找更多信息。

Android 6.0中的Makefile

本文基于AOSP的android-6.0.1_r9分支,介绍Android平台编译系统中的Makefile。

Android中make命令的目标

make命令的Target,由Makefile决定。 本文记录一些Android(8.0.0)平台项目中常用的make目标。

Makefile简明介绍

本文仅介绍Makefile最核心的东西,以及一些个人领悟。

在Hugo中为Markdown内容设置首行缩进

每个段落首行缩进两个字,是中文文章排版的默认规则。 本文基于Hyde主题,介绍如何在Hugo中实现这一点。

Bash打印中的stdout与stderr

本文介绍Bash中的stdout与stderr,并且在打印与重定向时如何使用它们。

Django项目从1.3.7升级到1.4.22

本文介绍了Django项目从1.3.7升级到1.4.22常见的四个错误。

Python中的and与or

从C语言家族,进入Python世界的程序员,当心都被Python中的and与or骗了!

编译Android时禁用Jack Server

在使用Jack/Jill工具链编译时,禁用Jack Server。

Python中的bool

本文介绍了Python中的bool类型,以及相关的一些概念。

解决uWSGI里的Django静态文件丢失

用uWSGI来单独运行一个Django应用,有一个static文件丢失的大坑。 本文介绍如何出坑。

Remmina的一次暴走

原因未知,过程惊险,后果严重——记一次Remmina的暴走。 也记一行重复180GB的log: Jul 12 14:10:48 debian remmina.desktop[22800]: WaitForSingleObject: unknown handle type 7160553448757878638

Python中的作用域、global与nonlocal

本文以Python 3来介绍作用域、LEGB规则、global与nonlocal关键字等内容。

编译Android时禁用Jack

Android的Jack工具链的问题,比优点要多。 而且,既然在未来已经被废弃,现在也可以禁用它。

直接使用uWSGI来运行Django

本文是介绍如何直接使用uWSGI来运行Django应用。 潜台词是,不使用Nginx或Apache。

Hugo中使用Google Analytics

本文简要介绍了在Hugo中使用Google Analytics的必要步骤。

Python中神奇的else

Python中的else设计,令人赞叹!

在Vim中用Markdown写Hugo

本文介绍Vim写Markdown的基本姿势,以及为[Hugo]做出的调整。

百度链接提交与统计

在中国互联网混,多少还是要仰仗百度的支持。 本文根据百度相关教程,以本站为例,介绍了如何使用百度站长的链接提交与百度统计。

在Docker中安装uWSGI

本文不仅介绍如何在Docker镜像python:alpine中安装python-ldap模块, 还展示了一种更好地制作Docker镜像的方法。

在Docker中使用python-ldap

本文介绍如何在Docker镜像python:alpine中安装python-ldap模块,并且尽量保持镜像的身材。

在Debian 9(Stretch)安装网易云音乐

在更新Debian到Stretch后,孤的网易云音乐离奇消失了。 重装时发生了一些麻烦事,这里记录一下。

升级Debian到Scretch

2017年6月17日,Debian 9.0,代号Stretch,正式发布。 本文记录了从Jessie到Stretch的升级过程。

Debian更新源时发生两个错误

记录了两个在`apt-get update`时发生的的问题,及其解决方案。

Linux上Docker的初始化

不要根据官方文档瞎折腾,直接用官方或非官方的脚本来安装就好。

清理Docker的container,image与volume

Docker的容器(container)、镜像(image)、数据卷(volume), 都是由daemon托管的。 因此,在需要清理时,也需要使用其自带的手段。 本文介绍一些Docker的清理技巧,以及它们的来源。

Docker中的Hugo

孤原本为了Hugo,专门制作了一个Docker。 然后却发现,这东西不适合部署在生产环境。

Hugo中添加字数显示

孤想要在页面里显示日期的地方,同时显示字数。 于是,孤找到了Hugo的所有模板变量。

Hugo中添加代码高亮支持

本文介绍如何在Hugo中使用highlight.js,来支持代码高亮。

解决Hugo的错误链接localhost

在使用`hugo server`这种方式建立网站,可能会出现错误的绝对URL。 生成静态网站不当,也可能有相同问题。 这时,只有首页能访问,并且样式消失,所有链接失效。

在Hugo中定制Hyde

作为Hugo的一个Theme,Hyde的优点是简约,而缺点则是首页太重。 本文介绍如何以尽量少的修改,对Hyde进行了必要的定制。 并且,还展示了修改的思路来源。

Hugo的theme使用与定制

本文以Hyde为例,介绍Hugo主题的使用方法,以及如何进行简单的定制。

Hugo中的Front Matter与Archetypes

本文介绍Hugo中的扉页(Front Matter)与原型(Archetypes),以及如何简单地使用它们。