Quick guide: set up chroot environment and build Debian packages (sbuild version)

TL;DR: Pbuilder-related tools are ineffective and redundant. By installing sbuild and schroot, one can set up clean and reusable chroot environments quickly and use the sole sbuild command to build Debian source packages (using src tree or .dsc files).
Fade away please pbuilder/cowbuilder; long live sbuild!


Quick example

Install tools and preparation

sudo apt update;
sudo apt install sbuild schroot;
sudo mkdir -p /var/lib/sbuild/chroots; # the last component is made by us
sudo chown sbuild:sbuild /var/lib/sbuild/chroots;

Initialize a chroot environment using sbuild-createchroot

# Assume host machine is of x86_64 architecture, create an unstable chroot
sudo sbuild-createchroot unstable /var/lib/sbuild/chroots/unstable-amd64 \
  --alias=sid --alias=UNRELEASED http://deb.debian.org/debian;

Keep (s)chroot environment updated

sudo sbuild-update -ud unstable;

Build a Debian package using sbuild with previously created chroot environment

# If you want to drop superuser privilege, add yourself into sbuild group first.
# Other settings might be needed. See sbuild-adduser(1).
# #################################
# Option 1: have proper Debian source package
sbuild -A -v -d unstable /path/to/package.dsc
#
# Option 2: chdir into extracted source tree with .orig tarball in parent directory
sbuild -A -v -d unstable
# Option 3: integrate with git-buildpackage (gbp)
gbp buildpackage --git-builder=sbuild -A -v -d unstable
#
# Notes:
# 1. If you need source-only changes (https://wiki.debian.org/SourceOnlyUpload),
#    append "--source" to sbuild's invocation
# 2. If you want to sign your build, append "-kxxxxxxxx"
#    to your sbuild's invocation, where xxxxxxxx is you gpg keyid

How to destroy schroot environment properly

If you do not wish to use schroot and sbuild anymore, you may use the following tool to properly destroy the schroot environment:

# Destroy the chroot instance named "unstable"
sudo sbuild-destroychroot unstable
# This script actually does nothing other than providing instructions.
# You will need to follow the printed instruction and safely
# destroy the schroot instance by yourself.

References

To be continued…


Updates

  • July 19, 2020: Replace httpredir.debian.org with CDN-enabled deb.debian.org.
  • July 19, 2020: Add text related to sbuild-destroychroot.
  • July 22, 2020: Remove “sudo” from sbuild invocation. No privilege is needed in this case.

被雪藏的大号瑞士军刀:eric6 IDE

作为一个有跨平台强迫症和被Python惯坏的业余伪程序员,我在挑选开发桌面应用的时候果断地选择了PyQt,因为它结合了Python的强大、快速开发的特点与Qt的跨平台性质。

然而常见的图形应用程序大都需要集成开发环境(IDE)以辅助开发,在挑选IDE时我着实费了一番功夫。让我们简单地列一下现在(2016年初)能够排得上名的IDE

  • PyCharm,常见的选择,据说十分强大,然而它是JetBrains公司的产品(意味着你要结合Java使用),也存在商业版,有一种不爽的感觉。
  • Eclipse,没用过不做评价。但是还是Java
  • Python IDLE,这东西能用?

今天我要推荐的是一款不是那么出名的软件:eric6 IDE。

继续阅读

Python3处理XML的笔记

应该说,Python(3)不愧其名,在各个方面都能够优雅地进行编程与处理数据。今天我来整理一下在Python3中处理XML的一些方法。
先注明:所提及的前两个库都是 Python3 自带的标准库,请参考官方文档文档:https://docs.python.org/3/library/ 以了解详细使用用法。


标准库中的首选:xml.etree.ElementTree

据说大家都喜欢这个库,那么我就把它列在最前面。据说它性能好,易于理解,那么我就姑且这样认为。
等我多用用再写这一部分啦。

标准库中的所谓标准:xml.domxml.dom.minidom

首先说一下什么是DOM

The Document Object Model, or “DOM,” is a cross-language API from the World Wide Web Consortium (W3C) for accessing and modifying XML documents. A DOM implementation presents an XML document as a tree structure, or allows client code to build such a structure from scratch. It then gives access to the structure through a set of objects which provided well-known interfaces.
来源:python3-doc 20.6节

如果你研究过原生的Javascript中操作DOM的内容的话,你可能对xml.dom这个库产生好感:它是遵从W3C DOM API而设计的。由于W3C只为Java, ECMAScript, IDL三者规定了标准的API接口,Python(3)的非官方实现在很大程度上是参考了IDL中的API设计,但没有刻意追求百分百相同。
W3C对于DOM的设计是分层次(Level)的,越是高层的标准包含了越多的特性与内容(同时,其被采纳的越少)。Python(3)中实现了对DOM Level 2 Spec.的兼容,暂时没有管Level 3的内容。xml.dom.minidom是一个简易的实现,只实现了第一层的规范与少量的第二层规范内容,同样其实现代码也被大大简化。
xml.dom库的功能是完备而齐全的。你可以使用它解析、生成、输出XML文件与字符串。
总体感觉用这个库和原生JS中操作DOM的感觉很类似,大部分方法的名称都相同,可以找到一种亲切感。


第三方库的选择:lxml

pypi上面有一些有意思的库,例如lxml。这个库号称xml.etree.ElementTree的加强版,据说提供了强大的功能(听说例如完整的XPath支持),但唯一的不方便之处是它依赖著名的libxml2库,而这是一个用C语言写成的库,所以安装时需要编译它。如果你的工作环境支持的话,用一用试试也无妨。

ed 文本编辑器使用笔记

昨晚抽风一般地想要学学 ed 究竟应该怎么用,于是花了十多分钟学习了一下基础用法,可以保证在紧急情况下“存活”。稍微整理一下自己学到的用法:

调用

ed [file]

一般使用

如果是创建新文件的话,进入程序后除了光标什么都不会显示;如果是打开已有文件,那么会显示一行文件大小的字节数,然后光标到下一行等待用户输入。
ed 是基于行的文本编辑器,也就是说同时只能显示或编辑文件的某一行。和 Vi 类似,存在两种模式:输入模式和命令模式。默认打开文件后进入命令模式。
既然是基于行的编辑器,那么 ed 有一个“当前行”的概念,可以使用 n 查看之,会打印出当前所在行号。默认打开文件后自动跳转至文件末尾(也就是最后一行)。
在命令模式下输入编辑器不认识的命令,会回显一个问号 ? 表示输入错误。

文字输入

切换至输入模式的命令如下:

  • a,在当前行的下一行开始插入文字;
  • i,在当前行的上一行开始插入文字;
  • c,抹除当前行的所有文字,重新输入。

注意 c 命令的危险性。
切换至输入模式后,就请随意地打字吧,回车也会忠实地写入文件。缺点是没有办法修改回车符以前的输错的文字。如果想修改,必须退出当前的输入模式再尝试修改。
补充说明,如果你想要删除文字,可以在定位到某行之后,配合使用 c 与 . 来达到删除所在行的目的。
如果想退出输入模式,在新行输入 . 即可。就是英文句点。

导航

以下导航命令当然是在命令模式下。

  • 直接输入行号并回车,跳转到对应行,并回显对应行的文字(不带行号)。
  • 输入回车,会跳转到下一行,并回显对应行的文字(不带行号)。
  • 输入 . ,会重复显示当前行的文字(不带行号)。
  • 输入 n,会回显当前行的文字(带行号)。

保存与退出

在编辑已有文件的时候,输入 w 可以进行保存,回显新文件的字节大小。
在编辑新文件时,需要在 w 后接上文件名。回显相同。
q 可以退出编辑器。在没有保存文件的时候,则必须用 Q 强制退出。当然 ctrl+c 是没有用的。