作者: 比尔盖子

Buffalo WZR-HP-G450H 刷 OpenWRT

三年前,比尔盖子买了一台 Buffalo WHR-HP-G54,这台路由器是曾经的神器,具有和 Linksys WRT54G 对抗的能力,是 802.11g 路由器的经典。

然而,仅 16 MB 的内存和 4 MB 的闪存,连运行 Linux 3.x 都存在困难,直接导致内核 OOM 杀掉重要进程,从而无限重启。虽然网络上充斥更换内存颗粒的教程,但比尔盖子这样的硬件杀手,即使有热风枪,也不敢下手,否则主板大概就要被我烤糊了。

后来,又使用树莓派充当路由器。ath9k_htc 的 USB 设备虽然开放,然而却有很多 Bugs,导致连接不稳定。就连 OpenWRT 团队,自己打了一堆没有并入内核的补丁,也只能说是基本而不是彻底解决 ath 的问题;发射功率低,信号不好;再加上受限于 USB 2.0 的传输速度(算上树莓派的硬限制,USB 2.0 的理论速度绝对是达不到的);同时,缺少有线接口,导致无线出现问题时无法上网,因此不适合长期使用。

因此,最近便打算购买一款新的路由器。

继续阅读

关于龙芯开发的一点见解

月初的时候,Bowen Han 在《关于》页面问了这么一个问题:

我发现现在龙芯的开发者们都很分散,做的工作最后都因为版本的更新失效了,不知道你有什么高见么,龙芯官方不怎么给力啊。

感谢你的评论。这条评论我搁置了很长时间,十分抱歉。

我不想做完备的论述,此时此刻我还在调试 YeeLoong 8089D 用的 SM712 显卡驱动。我只想简单说一说我的第一看法,但是我依然不小心把它写成了一篇长论述。因此,特别将这个回答独立成博文一篇。

继续阅读

Fedora 20 的 r8168 与 rtl8723be 驱动

今天在 Freenode 的 #fedora-zh 上,有个网友的笔记本有线网卡使用的是 r8168,无线网卡是 rtl8723be,r8168 的驱动 r8169 存在问题,rtl8723be 的驱动才刚刚进入 Linux 3.16。因此两者均无法使用,需要下载 Realtek 发布的驱动。

如果在有网络的情况下,倒是非常好解决的。啥,你说没网?请先阅读《无网络》部分,使其有网络后,从这里继续。

继续阅读

流缓冲影响父子进程通讯的问题

a.k.a 《在 C 程序中禁用管道中 stdout 的流缓冲》

注意,本文中代码使用了 C99 特性,如声明 for 循环控制变量和 VLA 数组;同时使用了 GNU 的扩展。请使用 -std=c99 -D_GNU_SOURCE 编译。

最近,盖子正在重写服务器上的 php-loop 工具。这个工具的作用的不断重复运行一个程序。叫 php 的原因,是因为最初(也是现在)的需求是用来不停地运行 php-cgi,防止它死掉导致服务中断。

由于时常有人通知盖子虚拟主机上的 php-cgi 出错,因此日志是十分重要的。然而,php-cgi 打印的日志没有时间戳,因此,盖子的 php-loop 必须能够对 php-cgi 的输出做一点处理。

这种需求一点也不新鲜,思路自然从这里开始 —— fork() 出一个子进程去处理一些事情,并把随时把进展通过管道告知父进程。

然而,将这种方法扩展到 execvp 后,却发现由于 stdout 的流缓冲,无法及时获得输出信息。

继续阅读

Arduino 开发环境在 Gentoo/Systemd 下的搭建

虽说 Gentoo 下的嵌入式开发,有着 Crossdev 神器,避免自己粗制滥造工具链,使最纠结的交叉编译问题消失。但是,今天入手 Arduino Uno,搭建开发环境的时候,还是遇到了太多问题。尤其是我使用 Systemd,导致了更多 Bugs 发生。

本文对我配置开发环境的过程,和可能的错误、陷阱的解决方法,一一记录。

继续阅读

令人纠结的代码重用

比尔盖子用了 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-----

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

主题设计 Anders Noren返回顶部 ↑