斑马问题是一个著名的逻辑推理题。流传甚广的“爱因斯坦谜题”的形式与之类似。据维基百科考证,出处为1962年的《生活》杂志。题目内容如下:
- 有五栋房子。
- 英国人住在红房子里。
- 西班牙人养狗。
- 绿房子里的人喝咖啡。
- 乌克兰人喝茶。
- 绿房子紧挨在象牙色房子的右边。
- 抽Old Gold牌香烟的人养蜗牛。
- 黄房子里的人抽Kools牌香烟。
- 中间的房子里的人喝牛奶。
- 挪威人住在第一间房子。
- 抽Chesterfields牌香烟的人住在养狐狸的人的隔壁。
- 抽Kools牌香烟的人住在养马的人的隔壁。
- 抽Lucky Strike牌香烟的人喝橙汁。
- 日本人抽Parliaments牌香烟。
- 挪威人住在蓝色房子的隔壁。
问题是:谁喝水?谁养斑马?
继续阅读 →“海内存知己,天涯若比邻。”信息技术使得后半句真正地成为了现实。人与人之间的联系不仅摆脱了空间的隔阂,在时间上也几乎没有障碍,此所谓“即时通讯”。
具体而言,即时通讯指的是一类特定的软件服务,这类服务允许用户注册账号,并在互联网上向其他账号发送信息。信息的接收方可以即时发表回应。你一言我一语,俗称“聊天”,因此即时通讯软件也被称为聊天软件。
即时通讯没有广为接受的标准化方案。现实情况是,由商业公司开发一套专有(proprietary)的解决方案,并免费地提供给用户使用。不同的服务提供商之间的用户不可以互相通讯。
这样的现状有很多缺点。首先,社交性质类软件,流行的主要条件并非技术上的优越性,而是用户基础。用户对服务提供商不具备选择权,只能被动地接受服务提供商的所谓“服务条款”以及隐私权政策,他们的权利便受到此类条款的限制。
使用这类即时通讯服务,不可避免地会有用户的隐私被传输至服务器端。服务提供商是否能够妥善处理,存在重大的疑问。极坏的情况,用户隐私可能会被出售。一般的情况,服务提供商有可能分析用户行为,并对其推送具备针对性的广告。再退一步,即使服务提供商完全合规运营,服务器也存在被入侵而导致数据泄露的隐患。这些问题,是专有解决方案集中化的本质决定的。
继续阅读 →最近因为更换了新的电脑,所以尝试在Windows 10上使用 WSL 代替双系统的配置。WSL 2采用了虚拟化的技术,并且具备一个真正的Linux内核。WSL 2的VM相比传统的全系统VM而言更加精简,并且Linux和Windows系统之间的可交互性更好:
- 每个操作系统都可以通过9P协议访问对方的文件系统;
- 每个操作系统都可以较方便地调用另一个操作系统的程序。例如,在PowerShell中使用
grep
一类的工具。 - Linux的文件系统储存在
.vhdx
文件中,可以动态扩展和收缩,不需要单独分区; - VM的占用的内存是根据实际使用情况动态调整的。
听起来是个不错的选择。在新的预览版中,WSL 2更提供了GPU和GUI的支持。不过,我还没有用到预览版。
继续阅读 →使用对称密钥通信时,双方需要事先约定密钥。如何安全地操作是一个关键问题。Diffie-Hellman-Merkle算法使得在不安全的信道中交换密钥成为可能。
在Diffie-Hellman-Merkle算法中,事先约定整数G和M。通信双方Alice和Bob分别拥有自己的私钥a和b。Alice把自己的公钥A=Ga发送给Bob。同理,Bob把B=Gb发送给Alice。Alice计算Ba,Bob计算Ab。这样,他们就得到了共享密钥K=Gab。
注意,这里的乘法是模 M 的乘法,即A=Ga mod M,等等。对于取模的指数运算,其逆运算是一个目前难以解决的问题。对于外界的观察者而言,只知道G、M、A、B,并不能容易地求出a、b或K。这样就确保了密钥交换过程的安全性。
在实践中,常用密钥派生函数KDF对密钥K进行处理,用派生密钥KDF(K)作为对称加密的实际密钥。
继续阅读 →自古以来,有大量信息需要隐秘地传输,例如军事机密。密码学也随之发展起来。一种常用的加密算法是对称加密算法,它由加密函数E和解密函数D构成:
C=E(T,K)
T=D(C,K)
其中T为明文,C为密文。信息的传输双方事先约定一个共用的密钥K。密文可以在不安全的信道中传递,即使被敌人截获,在未知密码的情况下也很难恢复出原文。
继续阅读 →n 元集合 {0,1,…,n-1} 的 k 元子集共有 \(n\choose k\) 个。
设某个子集的元素为 \(c_1<c_2<\cdots<c_k\), 则该子集可以编码为
\[{c_k\choose k} + \cdots + {c_2\choose 2} + {c_1\choose 1}.\]
此编码最小值为 0, 最大值为
\[{n-1\choose k} + \cdots + {n-k+1\choose 2} + {n-k\choose 1} = {n\choose k}-1.\]
上式的证明: 在两边加上 \(n-k\choose 0\) 并使用恒等式 \({n\choose k}={n-1\choose k-1}+{n-1\choose k}\)。
继续阅读 →当一束光从焦点发射,并在与圆锥曲线相交的点处发生反射时,反射的光线必定:
- 穿过另一焦点(椭圆);

- 反向延长后穿过另一焦点(双曲线);

- 与对称轴平行(抛物线)。这个性质使得它的旋转曲面很适合用来发出/收集平行光。

证明的办法:先在曲线上任取一点P,作焦点和P的连线(如果是抛物线则另作一条过P且与对称轴平行的线),然后证明所作的线与法线(或切线)构成的锐(直)角相等即可。
继续阅读 →ABC是一种文本记谱法,
既方便人工录入,也方便计算机读取。
继续阅读 →Gentoo系统中的Portage树存储了软件仓库中所有软件的元信息。其中最主要的是Ebuild脚本,它记载了软件的编译方法、依赖关系等。它通常位于/usr/portage
。
可想而知,这个树中包含了大量的文件,因此占用了很大的磁盘空间。根据我最近的测量,
- 所有文件的大小总和超过300MiB;
- 实际占用磁盘空间超过600MiB (ext4)。
但实际上,其中大部分文件都比较小,且属于较易被压缩的文本文件。因此,值得考虑使用一种压缩的文件系统存放Portage树。
SquashFS是一种可压缩的只读文件系统。将Portage树的全部内容放在其中,只需约50MiB的存储空间。
在配置SquashFS的过程中,走了一些弯路。因此,我把操作过程记录在这里,以便日后参考。
继续阅读 →我最近尝试了在 Gentoo 上用 QEMU
运行 Windows 10。 我想把过程中的一些细节记录在这里。

Gentoo Wiki 和 ArchWiki 上的 QEMU 条目也是很好的参考。
继续阅读 →