pysrun 的目标和设计

这篇博文是为了将来北师大在校的校友继续维护我编写的内网上网认证客户端 pysrun 而做准备。

一上来我应该介绍 pysrun 到底是什么。在北师大,使用校园网络需要通过帐号认证,因为上网涉及到费用问题。北师大的网络计费系统采用了深圳深澜公司提供的管理软件,每个用户都需要通过某种方式,用自己的帐号名和密码向学校统一的认证服务器获取许可。通常有两种认证方式:客户端认证或者 Web 页面认证,深澜提供有 MS Windows 和 Linux 操作系统的客户端下载。对于普通的学生帐号来说,在校内多数区域需要客户端,因为 Web 认证被禁用。教师帐号通常可以在任何地方使用 Web 认证。

pysrun 就是我自己编写的一个客户端。为什么要重新编写,而不是用深澜提供的“官方”客户端?我在 pysrun 的说明文档里加入了一段背景介绍来解释这个问题,这里就不逐一重复了。简而言之,原因有三:

  1. 深澜没有为诸 BSD 系统提供客户端,因此我们最好需要一个跨平台客户端为各种类Unix(Unix-like)系统提供服务。
  2. 原有客户端软件或许很 user-friendly, 但同时却十分 programmer-hostile, 难以成为自动化流程的组件。我们需要一个新客户端提供符合类Unix环境下习惯的新客户端。
  3. 原有客户端存在不少 bugs. 由于“官方”客户端不公布源码,我们无法修正它们,只能另起炉灶。

pysrun 的主要目的就是克服这三点我认为比较重要的缺陷。

目前,我认为现在的 pysrun 几乎达成了所有目标。但是,接下来仍然有继续维护和编写的必要。除了不断地清理各种难以避免的小错误外,我觉得还有这些事情可以做。

首先,目前的客户端只在 Linux 系统上经过较详细的测试和试用,在诸 BSD 系统上使用还很有限,很有进一步测试的需要。仅仅在 Linux 系统上能够保证如我们所愿地工作,这不符合我们初衷。想要做到这一点,我们可以通过各种网络配置(桥接,NAT 等)下的虚拟机进行测试,虚拟机可以比较快地在多个系统上同时测试。

第二,现在 pysrun 默认的工作模式,是在用户的主目录下存放配置文件,在 /tmp 下放置工作过程中需要的 Unix domain socket 文件对象。我们可以将其修改成全局安装, 在 /etc 下存放配置文件,在 /var/lib 或其它合适的路径下存放临时性文件,在 /var/log 下存放日志。这样 pysrun 就可以成为一个系统服务,由主机上有权限的用户开启或关闭。

为了做到这一点,除了修改 pysrun 自身以外,还需要进行一些系统配置,比如添加一个低权限用户和群组专门用来执行 pysrun 进程。以 root 用户启动进程以后,让 pysrun 自动 drop privilege 到这个低权用户。运行过程中用来监听用户指令的 socket 文件,应该置于 ownership 和 permissions 合适的子目录下,保证两点:有权限的用户可以随时操作,无权限的用户任何时候都不能操作。

除此之外,还需要为 SysV init, systemd 和 Upstart 等提供启动服务脚本,这样 pysrun 就可以真正成为一个按需启动的服务。

第三,和上面相关的,是通过 distutils 设置安装过程,而不再是要求用户把唯一的可执行文件拷入 PATH 下。之前之所以这样,是考虑到“伸手党”们懒得阅读安装说明,所以把什么都搞到一个文件下,直接把它扔到可执行文件的搜索路径里就行。但后果是,这单一的文件现在越来越大,已经有 1000 多行了。将它拆分成库(package)和可执行文件两部分,再优化库的内部依存结构,有助于我们进一步维护。当然我们不是要抛弃伸手党,因为安装过程也完全可以自动化,我们只需要做好打包工作就行了。

这样做还有一个好处。目前为了照顾各种不同系统的用户,我们不得不加入了很多因系统而异的定义等等,然后在运行时检测自己是什么系统,从而执行相关代码。其实,检测系统完全可以放在安装时进行,然后只安装相应模块。这就避免了代码的浪费。

第四,在登录时,认证服务器会返回一组关于帐号状态的信息。这组信息的数据格式我已经破译了,但还没有派上用场。我们可以增加一个功能,让用户可以查看这组数据告诉我们的帐号状态。

最后,值得说明的是,由于认证过程中需要通过当前时间来编码认证信息,而认证服务器解码的时候当然是用它自己的系统时间,这就存在客户端和服务器端时间不同步的可能性。为了解决这个问题,服务器返回错误代码的时候,在末尾加有它的时间戳,可以帮助我们近似计算可能存在的时间差。目前我们利用之恶个时间戳的方式,是先假设时间差为 0, 然后通过一个循环逐步修正可能的时间差,直到认证成功或最大循环次数超出。是否有必要缓存这个时间差供下次登录使用,目前是一个可以考虑的问题。

这就是我能想到的,接下来可以做的事情。做这些事的时候,我们最好是能够不忘 pysrun 的三大目标,并且最大程度保证兼容性。

同时,以下几点细节,我认为也是值得保持下去的:

  1. pysrun 不依赖于任何别的库,只使用 Python 标准库。我相信 pysrun 需要的功能都很简单,完全可以通过标准库很方便地实现,不需要引入外部依赖。
  2. 我们的设计是一切植根于命令行界面(CLI),满足 CLI 下使用的需要。为此我们刻意不去做 GUI. 如果对 GUI 有兴趣,可以让有兴趣的人去写一个前端。但无论什么样的前端,都应该独立于 pysrun 本身,不需要整合进来。
  3. 现在的代码有比较详细的注释说明,将来也要有。
  4. 我们现在和用户交互的方式是按照 Unix 的“安静地成功,极度喧嚣地失败”原则进行。也就是,当一切操作正常的时候应该避免任何消息输出,返回值 0 就够了;而失败的时候应该输出尽可能多的错误信息。有必要的信息可以按照用户的要求输出到日志文件。
  5. 源码是 BSD License 授权的,因此任何人都可以获取源码来做她想做的任何事情。但这个项目一直都独立于北师大“官方”,接下来没必要主动和“官方”扯上什么关系。此前有人建议我联系北师大网络部门,将 pysrun 添加到他们的客户端下载里。我拒绝了此建议。如果他们觉得这个东西好,大可自己 fork 之,反正是开源自由的。我们没必要主动和他们联系。

我希望现在写下来的这份“备忘录”,能够成为将来做出一些决定时的参考。

孤独的界限

我之前写过一篇还有点受欢迎的博文:关于永世之战。这篇文章是看了科幻小说 Forever War 后的感想,其中有一句我写到:

孤独,孤独,孤独看不到边

现在想来,当时之所以会说“孤独看不到边”,恰恰是因为自己不够孤独。真正孤独的人,他很清楚自己孤独的边际。当他孤独的时候,这种孤独可以触摸,它就像四周包围自己的石墙一般真实。它的边界非常明显:就在你的四周,你可以摸到它。你可以用自己的身心来丈量它的大小。

所以说“孤独看不到边”,的确是年少不识愁滋味。看不到边的,何尝不是自己的无知,和无谓的恐惧?我现在感受到真正的孤独,它触手可及的边界很冰冷,但让我感到安心。

春天的回归

春天为每颗树加冕了一顶禾草冠, 这是经历了一冬的搏斗后得当的褒奖. 只有这样, 它们才能带着健康的狂傲走入夏天的暴风雨, 还有秋天明月下的孤独. 进入冬天, 它们倒下了, 战至最后一刻. 春天从战场上扶起了它们散落的身躯, 编织成了一顶顶禾草冠.

乌托邦: 基于物理定律的货币

最近随着 BitCoin 比价的攀升, 关于它的讨论又多了起来, 不过我们关于它的话题似乎永远是那么几个. 要么是讨论它的经济和商品基础, 要么是继续在形而上化的政治范畴内讨论这种”另类货币”的善与恶. 固然, BitCoin 不是完美的, 但什么样的货币才是完善的呢?

政府法令下发行的纸币, 按照我比较赞同的一类观点, 显然不完美, 甚至可以被称为”恶”. 纸币实际上没有任何价值, 它的价值没有实际的商品来支撑. 也许你要说不对, 因为政府发行纸币显然是要按照实际经济总量进行, 但问题就在这里. 谁能保证政府一定能够做正确的事情呢? 特别是当它有一千个理由滥发纸币制造”法压通胀”的时候. 布雷顿森林体系崩塌后, 有些国家的政府通过法律规定, 该国的纸币是建立在”政府的信誉和尊严”等宏大叙事基础上, 但在我看来这些所谓的基础是完全不存在的, 纯属虚构. 相信这叙事, 不如相信靠得住的朋友一句承诺.

那么金本位制度是否比纸币好呢? 未必如此. 姑且不论金本位的经济学理论解释, 我们只要想这样一个问题: 为什么一定是原子序数为 79 的金, 而不是其它元素呢? 对这个问题的回答, 最终绕不开”传统”两字. 诚然金有重要的工业用途, 但这种用途并不决定它作为货币就是适合的. 为什么放射性铀不能同样作为本位货币呢? 或者未来的聚变燃料? 或者石油? 或者砂子? 归根到底, 这些商品的价值都是随着人的需要而变的. 我们不能保证未来的人和今天一样依赖某种物质. 而且, 现在世界上金的产量和储量已经大大超过需求总量了, 这一点和纸币其实没有太大区别…

因此一个理想的货币, 当然应该建立在人类无法折腾的东西之上. 比如一个物理定律. 在物理定律面前, 人人真正平等, 没有谁可以操纵它, 也没有什么威权体系可以强迫人接受或不接受它.

什么样一个定律适合作为货币的”标的物”? 或许我们可以考虑热力学第二定律. 热力学中的熵, 和我们平时说的”价值”这个模糊观念有些类似. 低熵的状态对应于更高的价值, 因为它可以自发向高熵态迁移, 而反之则不能自发成立, 这就有了自然的稀缺性. 这就像一个商品的价值总是在损耗中降低的, 想要满足不断的需要, 就得继续创造有价值的东西. 同时, 维持熵低于某个上限, 是每个人 (乃至任何生物体) 和人类社会存在的需求, 而不仅仅是一个游戏. 在可以想见的未来, 这个需求没有消失的迹象. 相比 BitCoin 由 proof-of-work 标称其价值的量, 由熵这个物理量确定的价值显然更加长久而普适.

因此, 如果存在可以将熵增量的负值, 同一种可交换可兑现的合约挂钩起来的方法, 我们也就拥有了一种由物理定律支撑的货币. 只是技术上的实现, 非指日可待.

或许未来人类, 已经克服了这些技术层面的问题. 对他们而言, 个人不再需要以货币结算的账户了. 每个活体, 就是他自己的账户. 当我需要支付一些钱以获得商品和服务的时候, 我就从我身体转移一部分负熵给我的交易对手. 这种交易的后果就是我的衰老会加快一些, 但我用这衰老换取了等量的商品, 这些商品可以提高我等量的生活质量. 如果我具有充裕的资金, 我不用担心这种衰老的后果. 按照”充裕”二字的定义, 假如我把这些资金全部兑现成我身体的负熵, 我在青春状态下的寿命将大大超过我需要的寿命, 因此我可以选择用额外的青春和寿命支付.

我们可以设想追究违约者责任的方式. 一个破产的人, 当他无力清偿债务的时候, 会在社区压力的驱使下, 走进一个”抽负熵室”. 当他出来的时候, 他看上去像是老了五十年. 他的自由能以货币的形式存入了贮藏池, 供债权人提取. 强行拒绝抽负熵的后果, 是这个社会强行回收你的所有负熵… 也就是说, 拒绝履行有限责任, 将追究你更大的责任…

我们再设想, 一对青年男女商议以男方提供若干聘礼的条件结婚. 倘若男方缺少充裕的”资金”, 他就不得不以抽负熵的方式支付, 一下子老了二十年, 这时准新娘也就不太可能还想要他了. 这就要求男方一定要有足够的经济实力维持青春, 否则别想过上婚姻生活.

不过任何一个社会都会有叛逆者. 他们会认为这种经济化的生存方式, 是对人性的粗暴违背. 一棵树, 一根草都能够靠着天赋的太阳和空气生长, 他们的负熵来源不需要任何支付, 难道人的生命比一根草还要低下吗? 社会对这些叛逆者的回答却很简单: 我们现在的时代, 已经没有”草木”这种东西了; 所有的阳光都被完全覆盖太阳的罩子收集着, 每个人都必须购买它才能支付建造它的债务; 人也不再能够脱离一开始是被植入, 但早已先天化的熵交换器官而生存. 总之, 你的比方不成立…

因此我们也许会看到一种社会图景. 少部分人通过大量收取普通人的负熵, 获得了无限长, 无限青春, 无限强大的生命. 供给他负熵的人, 一开始是为了一个共同的目标, 出于自愿和契约, 做出了这个选择. 但随着资源分配的倾斜, 更多的人开始因为生活或者债务所迫不得不这样做, 以换取维生所必须的那些资源, 如食物和房子. 而由这些人负熵所滋养的个体, 已经达到了如此高的复杂, 强大和健壮程度, 以至于被这个社会当成无可违抗的神. 不信仰这个神, 意味着否认自己的存在. 很少有人能够突破这种生存状态, 更多的人甚至忘记了这种状态的来历. 出于某种不明的原因, 基于熵交换的经济也被看作是神的属性之一, 任何试图不经过熵交换机制而进行的经济活动, 都是对邪神的膜拜.

当然叛逆是不会停止的. 有一小部分来历不明的人, 在进行惊人的尝试: 摘除体内的熵交换器官. 毋庸置疑, 这样做充满了危险和痛苦. 这痛苦不仅来自身体和生存环境, 也来自巨大的精神压力和羞耻感. 这种妄图去除天生的器官, 改造人类自身的行为, 被看作违背了人的天性. 而他们的动机, 也被看成是逃避社会责任的病态行为. 甚至有研究断言, 这种行为在物理上是不可能的, 就如同制造永动机一般违反了物理定律. 连他们自己也不能确信, 人类到底是生来就如此, 必须背负熵交换器官生存? 抑或是上古的传说是真的, 曾经有一个黄金时代, 那时候大地上行走着真正的人, 他们不受这诅咒的束缚?

这种信念的不确定, 他们也只能作为存在的先决条件接受下来. 即使黄金时代的传说只是一个传说, 他们也要造出新一代的人, 一代自由的人. 物理定律仍然成立在整个宇宙间, 但新的一代人, 将不再成为定律的奴隶. 他们只能靠着彼此信任和相互支持, 改变这个星球的面貌, 即使这个星球上已经不再有草木, 不再有自由穿行的阳光.

但这样做的代价是什么? 或许, “代价”这个来自经济学的词, 已经被这个时代玷污了无数次, 他们已经没有办法再去考虑什么代价…

或许第一个从手术台上活着下来的人会告诉我们, 他感觉如何.