分类: IT生活

令人纠结的代码重用

比尔盖子用了 GNU/Linux 之后才真正学了一些编程,才知道“代码重用”的概念,也就是大家口口声声说的“不要重复发明轮子”。例如,别人已经编写了解决问题的工具,就不要自己重新发明,除非遇到问题。例如,自己在 Ruby 里实现 base64 算法实在是愚蠢。

Unix 利用管道和 Shell 脚本,充分发挥了代码重用的优势 —— 只需要把各个 Unix 里的程序 —— 多半还是 C 语言写成的 —— 串起来,就可以完成复杂的任务,这也叫做充分利用软件开发的杠杆效应。

但是,前一种代码重用是在程序内部发生的,后者则是在程序外部。如果后者发生在脚本中,是非常方便的,但如果发生在程序中,则是一个非常棘手的问题。例如,我正在编写一个 C 程序,需要进行一个正则匹配,而 grep 正好完美的实现了我的需求(也就是不考虑其它库),这时该怎么做?

  • 模仿 grep 的行为(可查阅源代码),编写函数 grep()
  • 在程序中调用 grep
  • 将 grep 的匹配算法独立为库 libgrepgrep 和其它程序均可使用
  • 增加一个 grep 的系统调用
  • 使用 Perl

如果你是使用第一种方法,那么根本不算代码重用,即使你从 grep 的实现中复制了大量源代码也不例外;在程序中调用外部程序是不稳定的 – 如果你试图在一个 C 程序里调用外部程序,你就会明白,程序要考虑到数种意料之外的情况 —— 尽管使用带有 sh 模块的 Python 可以大大简化编程;而第三种方式看起来是最为完美的,但是,有多少程序是这么实现的呢?增加系统调用看起来很完美,但系统调用可不是 C++ STL 之类的类库。

如果我们使用 Perl,我们就会发现 Perl 里内置一个 grep,还比较好用。但是,Perl 的 grep 和 GNU Coreutlis 的 grep 毫不相关,实际上只是名字一样,行为很像而已。

也就是说,如果要充分重用代码,那么必须:

  • 使用对外部程序调用友好的语法,利用管道(我不会 Perl,我不知道 Perl 做的如何)
  • 每个程序将算法实现独立成库
  • 使用 Shell 编写所有高层建筑

再想想,C++、Python、Perl、PHP、Ruby,哪个程序没有把基本算法重新实现一次呢?在未来,还真的有必要吗?

这个问题在未来肯定还会纠结下去的,尽管在实际开发中,这个问题的影响并不大。不过,Windows 非常完美的解决了这个问题,因为 Windows 的 CLI 程序,没什么值得重用的。另外,顺便胡说几句,不知道这个问题到了真正的微内核操作系统上会不会这么得到解决 —— 每次程序可以把自己的一个函数“注册”成一个系统调用,以服务的方式运行,其它程序就可以方便的调用了 —— 然而我很快就找出了这个想法中的更多问题。

对《关于 yum 作者去世引发的地震》一文的澄清与道歉

因为我对社区缺乏了解,看到 IRC 一些发言,不了解发言者,再加上我不去论坛了解事件前因后果,导致我对收集到的不完整信息的基础之上,又对其作出的错误解读 。进行了造谣传谣的行为,对 openSUSE/Arch/Gentoo 社区造成严重影响而不自知,按照社区负责人的要求,撰写本文,消除谣言造成的影响。

2013 年 7 月 10 日,yum 作者 Seth Vidal 去世。随后我看到了 #kde-cn 上的一些讨论。在忽略了发言者的发言背景的情况下,对其意解读错误。而且,我在明知 microcai 反对 Python,说的话不应当真,却在发文时也没有增加任何说明,误导大众,是非常不合规的。同日晚,我看到了更多对此的讨论。但此时,我在对论坛上的事情完全不了解的情况下,胡乱理解了这些讨论。

7 月 12 日 21:18:06,我看到了某成员在某讨论组上发送了一些 XMPP 日志截图,这些截图是经过断章取义,严重扭曲的,而且按照他的口气,openSUSE 社区内部似乎发生了严重的冲突。但所以“大冲突”都是莫须有的,事实上,是他扰乱了社区的秩序。

而我在对一切完全不查证的情况下,又将其严重错误认为是社区现状附在文尾,严重放大了不良事件的影响。

对此,向 openSUSE (marguerite), Gentoo(microcai), ArchLinux(phoenixlzx)中文社区以及负责人道歉!并保证,来自不再发送未经查证的信息,以防止我再次造谣。

2013 年 07 月 13 日 星期六 01:42:36 CST

GPG: 717E3FB8
Message: 向 openSUSE (marguerite), Gentoo(microcai), ArchLinux(phoenixlzx)中文社区以及负责人道歉!   

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.19 (GNU/Linux)

iQIcBAABAgAGBQJR4D9WAAoJEDF0Xaxxfj+4DKIP/0b5HHGm8DOfI4e+r0g6+Mcz
VFo2JnIJGMgicS+5TFO/8a4mqBgum4emJA0juQcdRCn1t3bXdSMyAuhojmIuT9Ga
x23qSaFcxX6WG76FCDT8qtL7eJ2/UbBkfHTmWYr+Hd8SPO/SNhSHX1x05Ksrtqg3
B1yFIZvcZGhDjzKupfiBNQWw/CXCOaJb8DcvT2C4GLRkIlQFXnJHunzmmEbbRsWl
PZh7EY28xlQ2NdCaeAsR0C0VO5RlYDtKyrWPiltZLmm+bWFKJhGLLGWdD2gStFR0
00dXN9AkAg8cQCkc7zvRXQ6RfGo+y6QynEKGSRYgK9nolqR2P3AwVgAFn7hHLpIR
zj3g8MZF0er4gHi+VA4I1M/q9G0fGEGwrbBJEv1bI0QmbRalfogFGiCpBGHIe66Y
RjdCnXqZaNXTMSNxtIb8dGFri8FRfm3Ir86mqaYqTEyqTqNryUO9rquyvPeYaEsS
7QHbDVLNMP3qsuPG3fTZmPjRDba0R/vc4Cf+TG32AHW20/2hhUpOLTPKgJxO4PID
MlTSGH4tjrcqHH8j8a1Hy2EvS2xf6F+HauARKP45aNUzy/3JsW/0bxqCG2yysOTo
90gw2mcRnhM3Tf51YOcjlKk5S84s1DbRnDz+8dFcLHoh+JUvKNeM36tuPVjWHctN
dQ9wjZ4chpYqi1nxw3qh
=Q3pf
-----END PGP SIGNATURE-----

树莓派搭建 PPPOE 无线路由器

注意:由于比尔盖子实现早已配置好树莓派,并没有对文中的方法进行逐步确认,因此比尔盖子不对文章内容的正确性负责! 树莓派恐怕是 2010 年的年度电子产品了,它完整的 ARM 架构、足够底的价格和足够小的体积,使它的功能迅速变得无限可能。对于家庭用户来说,把它变成一个可以运行很多守护服务的路由器是个不错的主意。

本文将讲述在没有显示器的情况下仅仅通过网络,将运行 Arch Linux 的树莓派变为路由器。 继续阅读

反网络流量分类技术

伊朗今年初升级了其防火墙系统,使用了基于论文《网络流量分类研究进展与展望》的最新技术,有效的将加密流量和明文流量区分开,并对任何加密流量给予屏蔽。例如,OpenVPN 的协商会被刺探出来,并被连接重置。我的一台服务器 IP 还因为多次连接被彻底封死。

不过所幸的是,Tor 项目今年刚刚推出了一个叫做 obfsproxy 的试验性项目,可以将加密流量进行混淆,变为看上去像明文的流量,从而干扰网络流量分类系统的正常运转。

本文假设你是一个 OpenVPN 服务器的管理员,具有相当的 OpenVPN 架设经验。我不会将所有的步骤和命令一条一条写出来。

继续阅读

迁移到 ZFS

比尔盖子拥有三块具有 64 MB 缓存,500 GB 容量的西部数据企业级 WD RE4 盘。为了保证数据的安全性,使用主板自带的 RAID (即“FakeRAID”)建立了 RAID 5 磁盘阵列,在 Linux 下使用 mdadm 进行驱动,并在上面使用了 ext4 文件系统。这种配置可以得到不错的性能,但却有一些严重的问题。昨天,比尔盖子终于迁移到了 ZFS 以克服这些问题。 继续阅读

在 Linux 下使用 RTL8188CUS (磊科NW336)无线网卡

磊科 NW336 这款使用 RTL8188CUS 芯片的无线网卡大受欢迎,是有原因的。其一,价格便宜无比,在京东商城上仅售25元;其二,这款无线网卡可以在 Mac OS X 下工作,对于安装了黑苹果的人是一大福音,尽管驱动程序没有使用系统的原生管理接口,但还是有胜于无。

比尔盖子也正是因为这些原因而入手了这款网卡。在 Linux 下,这网卡可有得折腾了。一开始以为只要在 Linux 内核中勾选上差不多的驱动即可,没想到的是内核驱动存在 bug,能搜索到无线信号,却无法连接任何网络。好在,Realtek 发布了这款无线网卡的驱动源代码,所以这个问题应该是有解的。
继续阅读

版权所有 © 2025 比尔盖子 博客

主题设计 Anders Noren返回顶部 ↑