Rust编译Linux通用可执行文件

在glibc环境编译的Rust可执行文件,不能在scratch中运行。 本文介绍另一种编译方式,得到一个Linux下广泛可运行的可执行文件。

在Rust中判断两个文件内容是否相同

这里记录了一个函数,未来用到时复制。 并且还展示了一些文件操作,以便参考。

Rust中enum和String的互转

任何语言中,enum和String两个类型的互转,都是基本操作, 因为String广泛地使用于各个有可能的人机接口和(跨语言或跨环境)机机接口。 Rust中默认不支持,但可以用strum_macros来实现。

在VSCode中配置Rust的nightly模式

因为某些原因而不得不使用nightly模式时,一般直接切换系统版本。 但是,如果一个代码库中包含多个项目,只有个别项目是nightly时,就需要给VSCode一些特殊的配置。

K8s中非root用户修改MAC地址

因业务需要,程序要修改MAC地址,并且开关K8s中Pod的网络。 使用Linux的cap_net_admin,可以做到非root用户执行网络操作。

Python中str的+=性能分析

在一般的语言中(Java:正式在下!),字符串是不能用+或连加来进行大量构造的。 因为字符串是不可变对象(或基本类型),N个字符的连加,会额外产生N-1个对象。 但Python是个例外。

让DRF的URL支持前缀的一种方式

DRF(Django REST Framework)不支持带前缀的资源。 所有资源,默认都应该在URL的根路径下。 这里提供了一种支持前缀的解决方案,并且支持带参数的前缀。

为cmake添加make install自定义命令

CMake生成的Makefile里,竟然是没有uninstall的。 本文介绍了一种自定义命令的方案。

正确使用Celery中的revoke来取消任务

取消一个在排队的Celery的Task,操作是简单的,用revoke就行。 但是,如果要很好地取消一个正在运行的Task,则没那么容易。

在Deepin 20.2下安装Chrome

没错,Deepin的应用商店能安装Chrome,但版本略老。 如何在Linux下安装Chrome,又能保证持续更新? 尤其是在中国大陆的网络环境下? 配置Google的软件源,利用apt保持更新即可。

在Deepin 20.2下安装NodeJS

尽管Deepin的20.2可以通过apt直接安装NodeJS,但版本太老,刚好已经不再维护了。 而且,NodeJS官方的安装方法也有问题,因为不支持Deepin系统。 因此,需要看一下安装脚本,找到真正的安装手法。

在Linux安装或管理多个Python版本

从源码安装、手动管理,到update-alternatives,再到pyenv,又回归pyenv-install+update-alternatives。 本文算是把Linux下,Python多版本管理的主要骚操作都讲完了。 此外,也稍微提点了一下原理。

在Python中判断两个浮点数的相等

如何判断两个浮点数是否相等? 这是一个所有编程语言都有的小坑。 Python中虽然统一了float和double,但不可避免地仍然有这个问题。

配置GitLab Runner跑CI

简单介绍GitLab Runner的功能和类型,并描述配置流程。

Celery重复执行一个Task的解决方案

在系统负载较高,消息队列里堵了太多东西的情况下,Celery容易出现重复执行一个Task,甚至不止一次的情况。 本文给出三个解决方案。

利用github.com.cnpmjs.org快速下载GitHub仓库

介绍一个git clone的提速方案,加快GitHub仓库的下载。

修复sudo中http_proxy等环境变量的缺失

本文介绍了如何在sudo中添加当前用户下的指定环境变量。 并且,顺便介绍了/etc/sudoers文件发生语法错误时,如何修复。

利用pyinstaller打包Python程序为一个可执行文件

有时,Python发布的程序需要被打包为一个文件夹、甚至一个文件发布。 目前(2020)最佳的策略是使用pyinstaller。 本文介绍了这种方案的配置方法,以及它的2个问题。

利用阿里云OSS托管HTTPS静态网站并配置CDN

2020年9月之前,本站都是通过云服务器自建Nginx对外提供静态网页的。 但是在9月,服务器又到期了,续费太贵。 在买新迁移的过程中,忽然想试试OSS对象存储对静态网站的托管能力,最终还是迁移上来了。

在Kubernetes中实现Sidecar类型的Container

在一个Pod中,某个Container运行主要业务的同时,需要另一个Container协同 ——这是一个常见的业务场景,这个协同Container通常称为Sidecar。 目前(v1.20版本),官方仍然没有正式支持Sidecar类型的Container。 本文先介绍一个网上流传的乌龙,再介绍一种自己实现的土办法。

定制Powerline的显示内容

本文内容承接《安装Powerline并配置Vim、Bash、tmux、IPython、pdb》,介绍Powerline显示内容的定制方法。 并且介绍自定义组件的开发方法。

配置Linux的时钟同步

在某些环境下,比如公司内网、云上子网等,是与互联网隔绝的。 这时要想做时钟同步,就只能自己配置了。 本文介绍如何自己配置时钟同步,不介绍如何自建NTP服务器。

安装Powerline并配置Vim、Bash、tmux、IPython、pdb

本文主要介绍基于Powerline的CLI美化配置。

基于Redis配置Celery

作为一个分布式异步计算框架,Celery虽然常用于Web框架中,但也可以单独使用。 虽然常规搭配的消息队列是RabbitMQ,但是由于某些情况下系统已经包含了Redis,那就可以复用。 本文撇开Web框架,介绍基于Redis配置Celery任务的方法。

在Kubernetes的一个Pod内连续依次执行Container

顺序执行任务,不是Kubernetes原生支持的,但也有办法实现。 经过调查发现,虽然containers不能依次运行,但是initContainers可以。 直接支持这个场景的是argo,但它不在一个Pod中。

Play Framework的数据库迁移方案——Evolutions

只要有个数据库,都需要迁移(Migration)方案,除非一版定稿、再不修改。 Play Framework在1.x时代,使用的是Module migrate; 而在2.x时代,使用的是Evolutions。 本文介绍Evolutions的原理与配置。

Python利用S3的Presigned URLs实现无鉴权上传与下载

S3协议操作对象存储服务,通常是实现上传下载功能。 但是在某些场景下,程序不具备操作权限,或为了安全原因而缩小权限配置,需要实现无鉴权的上传与下载。 这时可以用S3协议的Presigned URLs来实现无鉴权读写操作。

用Python操作Kubernetes的Job

官方缺乏文档,只有示例。 本文给出Python SDK操作Kubernetes Job的更多示例代码,以及相关解释。

Scala生成SSH形式的RSA公私钥文件

本文从RSA的原理与相关定义出发,介绍SSH的公私钥格式,并给出Scala的生成样例代码。

使用Mermaid在hugo的Markdown中绘制UML

Mermaid是一个提供绘图功能的JavaScript项目,本文介绍如何在hugo中配置它。

在中国快速下载Visual Studio Code

在中国,想要下载Visual Studio Code,有时真是一件不容易的事。 本文提供一个Python脚本,自动从中国的azure下载。能略快一些。

Docker的三种网络代理配置

有时因为网络原因,比如公司NAT,或其它啥的,需要使用代理。 Docker的代理配置,略显复杂,因为有三种场景。 但基本原理都是一致的,都是利用Linux的http_proxy等环境变量。

用resolvconf配置DNS服务器

利用resolvconf配置DNS服务器,解决ping域名会卡很久的问题。

免密使用sudo(慎用)

在配置Linux机器时,经常需要以普通用户的身份进行安装软件等操作,需要root权限,经常使用sudo。 而sudo在使用时,需要输入密码,并且只保留15分钟的有效时间。 但是在个人笔记本电脑等线下场景,就显得有些浪费时间。

Python多重继承super()的MRO坑

Python的面向对象类继承方面,采用了类似C++多重继承的方式。 本文介绍了MRO,以及在多重继承中使用super()遇到object的一个坑。

重新编译Git使用openssl替换GnuTLS

本文介绍如何从源码编译Git。

Ubuntu上通过源码包编译安装软件包

Debian/Ubuntu系列(也许得加上所有Linux发行版),官方源自带的软件包, 包括可执行文件、静态链接库、动态链接库,在源中都有对应的源码包。 通过下载对应的源码包,可以离线构建其对应的软件包。

设置Python的wheel包自动根据系统安装不同的依赖

有时候,一个Python包,在不同操作系统,需要使用不同的依赖包。 比如,pykerberos只支持Linux平台,而Windows平台则需要使用winkerberos。 除了在setup.py里写if else这种丑陋的做法以外,可以使用两种setuptools支持的方式。

Matebook的Deepin系统初始化

折腾Matebook与Deepin的一些记录。

利用cmake打deb包

本文以一个demo项目,展示了如何利用cmake自带的cpack,打包一个deb。

Django删除Model时自动删除文件

默认情况下,Django的Model在删除时,不会删除FileField或ImageField所代表的文件。 本文简单介绍了两种自动删除的办法,并推荐后一种。

适配Hugo新版本(0.58)的三个改动(.Hugo、.RSSLink与.RegularPages)

开发迭代,版本更新,接口替换,这是常见的事。 Hugo在v0.58.0及之前的v0.55.0,做出了较大调整。 本站的模板多年未动,也仍然受到影响,甚至一度发生首页空白的事件。

用pylint-django插件来检查Django项目

直接用Pylint来检查Django,容易产生误报。 对此,有个Pylint插件pylint-django,可以解决这个问题。 同理,还有一个pylint-flask插件可以解决Flask的问题。

Python中使用re.MULTLINE匹配一个字符串的多行

通过一个匹配多行并计数的案例,展示了re.MULTILINE的用法,和一些Python代码的优化细节。

配置Visual Studio Code的Remote - SSH插件进行远程开发

有时不得不面临在Windows开发Linux项目的场景。 由于种种问题,这会非常不方便。 本文主要介绍Remote - SSH的配置和使用,并且详细描述了网络受限条件下的代理配置。

Django REST Framework中把DatetimeField转换为时间戳

本文介绍如何利用Django REST Framework中的自定义Feild,把存储层的datetime转换为float形式的时间戳。

用django-storage来存储Django的Media文件到S3服务

默认情况下,Django的FileField会把文件存到Media目录下,也就是本地文件系统。 然而在后端多实例情况下,这会出现明显的一致性缺陷。 因此需要把它放到独立的存储服务中,比如S3。

解决core-js引起的Jest 23.x版本运行时SyntaxError

记录一次core-js引起的Jest运行错误。

Git的三种Workflow及相关概念

这里讲的Workflow,其实就是开发模式。 本文会严格地限定内容在分支策略中,通过Git的commit、branch、tag操作,来讲解三种基于代码托管平台的Workflow。 要注意的是,这些都是孤个人的理解,不是业界的共识。 孤希望这些能成为共识,以减轻上层无知给项目开发流程带来的痛苦。

Python中的虚拟环境(Virtualenv)及其工作原理

也许Python由于2和3的分裂,Python发展出了虚拟环境(virtualenv)的技术。 本文介绍了Virtualenv的安装、使用与工作原理。

利用环境变量注入修改Docker中的Nginx配置

Docker官方的Nginx镜像,是不支持环境变量修改配置的。 但Docker官方的文档,也给出了解决方案,虽然是个歪招——envsubst。 本文介绍了一个更复杂的真实案例。

利用Nginx架设Webdav服务并用Python的requests使用

本文介绍如何利用Nginx(Docker)架设Webdav服务,并用curl以及Python的requests进行简单的使用。

用pytest-httpserver来测试requests

在Python程序中,用[requests]发起网络请求,是常见的操作。 但如何测试,是一个麻烦的问题。

Jenkins JNLP Agent的配置

Jenkins的Agent大概分两种,SSH和JNLP。 本文介绍JNLP的Agent如何用systemd守护启动。 文末提供了Ansible Playbook的示例。

在Hugo中突出显示某些代码片段(diff、mark)

有时,展示的代码虽多,却只需要着重强调几行。 本文展示diff和mark两种做法。

在Kubernetes中pull私有镜像

Kubernetes在自动pull私有镜像时,经常出现问题,导致ImagePullBackOff。 这是因为没有正确配置pull权限所致。

本地建立CA签发数字证书

CA(Certificate Authority或Certification Authority,数字证书认证机构),是负责发放和管理数字证书的权威机构,承担公钥体系中公钥的合法性检验的责任。 其实,每个人都可以当CA。 以下基于Ubuntu来讲如何利用`openssl`来建立一个本地的CA,在命令行签发数字证书,并对证书进行认证。

配置yapf和isort的Vim与Pytest插件

用Vim写Python,曾是一件流行的事,而今已经变得小众。 实际上,Vim仍然是Python开发的最佳利器之一,在很多方面,甚至优于PyCharm这样的IDE。 本文会基于Vim,介绍Python的风格统一与格式化方法。 并且,还会集成它们到pytest中去。

Hadoop 2.8的安装、配置与启动

本文基于Ubuntu 16.04,介绍如何搭建Hadoop 2.8.5的环境。

Python中的多进程(multiprocessing)

Python中的多线程、包括协程,由于CPython的GIL(Global interpreter Lock ,全局解释锁)问题,只能实现并发(Concurrency),不能实现并行(Parallelism)。 因此,在并行计算场景,多进程是Python最简单的选择。

Docker中Image、Container与Volume的迁移

已经部署的容器化服务,也不是不需要维护的。 而且,由于生产环境往往有这样那样的严格要求,往往需要些非常规操作。 Image(镜像)、Container(容器)和Volume(数据卷)的迁移,就是一类有用的非常规操作。

组合多个docker-compose文件

一个服务,一般有开发、集成、测试、生产等多个环境。 在不同环境下,往往又需要不同的配置。 这时,一个docker-compose.yml文件就难以应付了。 不过,它通过扩展(Extending),对此提供了支持。

Django中的logging

对网站、微服务来说,log是比较重要的运维工具。 Django的log,主要是复用Python标准库中的logging模块,在settings.py中进行配置。 此外,也提供了一些独特的扩展。

容器化运行TensorFlow Serving

现如今,ModelServer已经开始大行其道。 以前训练了一个模型,还必须得用Flask、Falcon手写一个Server的时代,快要一去不复返了。 TensorFlow作为一个流行的AI框架,早已自己解决ModelServer的问题。 并且发展迅速,目前已经成为了可用于生产环境的高性能解决方案。

Docker Swarm概念与基本用法

Docker Swarm是Docker公司开发的容器集群服务。 从1.12.0版本开始,已经是Docker安装后自带的一部分(捆绑软件)了,又称为Swarm Mode,无需额外安装。 与Kubernetes相比,Docker Swarm是一个简单的软件,似乎不堪大用。 但是它与docker-compose兼容的优点,可以弥补一切。 对于没有集群使用经验的小白,用Docker Swarm起步,是一个很好的选择。

安装nvidia-docker2

本文介绍了如何安装、配置nvidia-docker2。

Linux下安装配置Cntlm代理

Cntlm是一个HTTP二级代理软件。 它主要的作用,是在能代理上网的前提下,给这个代理再做一个代理,提供给更多的下级用户。 下级用户不需要、也不可能知道代理的账户密码,这样既保障了安全、又实现了方便。

用cookiecutter来创建新项目

因为Python系缺失一个Wizard,也缺少项目结构的标准,于是出现了cookiecutter。 这是一个项目生成器,也可称为引擎,因为它只完成了最核心的功能。 真正决定一个项目长什么样的模板,却可以自由定制。 也因此,它能生成任何一种语言的项目。

Ansible初体验

Ansible是一个自动化运维工具。 它能批量配置系统、部署软件,也能编排更复杂的运维任务,如连续部署、零停机时间滚动更新等。

PostgreSQL建立Hot Standby的Replication机制

本文介绍了利用PostgreSQL建立一个master,一个或多个slave的Hot Standby的Replication机制。

目标检测中的mAP等入门级定义

本文记录了目标监测相关的Precision、Recall、IoU、AP、mAP等入门级概念的定义。

Windows下的黑魔法——Zeal

Mac下有Dash,而Windows和Linux下,只能用Zeal。 这是离线文档阅读器,可以在网络状态不佳,甚至断网的情况下,查阅一些编程文档,提高开发效率。 其高效的本地搜索方式,让文档的查阅变得轻松写意。

Windows下的黑魔法——Chocolatey

作为一个程序员,在落伍的Windows环境下工作,是一件令人无奈的事。 运行效率低、编码奇特、换行符有异、命令行难用、没有包管理器……等等,有Chocolatey!

Python中的atexit

atexit是标准库中一个简单的小模块,作用是提供退出的回调。 如果有什么事是在退出时需要做的,就可以使用它。 但仅限于比较简单的程序。 实际上,最好不要使用它。

设置Samba服务共享Linux的文件

本文介绍如何在Linux服务器上假设Samba服务,给Windows与Mac共享文件。 Samba有方便的一面,也有不安全的一面,还是局域网内使用最合适。

用下载deb的方式来安装docker

本文基于Ubuntu的xenial版本,介绍如何通过下载deb来进行安装。

用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),以及如何简单地使用它们。