完整的 chroot 过程

直接简单地运行 chroot <new-root-dir> 不足以正常运行一些程序,因为很多程序需要访问 procfssysfsdevfs 等特殊的子目录,直接 chroot 更改根目录后这些子目录没有被挂载,内容都是空,导致这些程序出现问题。

Read More

科技文献中常见的数词来源

之前经常在科技文献中看到这些词的使用:

  • 表示数进制的:bin、oct、dec、hex ...
  • 表示参数个数的:nullary、unary、binary、ternay ...
  • 表示倍数的:single、double、triple、quadruple ...
  • 表示优先级的:primary、secondary、tertiary ...
  • 表示几何形状的:triangle、tetragon、pentagon、hexagon ...

Read More

org2blog 如何发布左对齐的 LaTeX 公式

通常情况下 Wordpress 上的基于 MathJax 显示的 LaTeX 插件总是将独立公式显示为居中对齐的,但当文章中的公式都比较短时居中对齐就显得不太美观。若想让独立公式在文章中总是左对齐,可以在编辑 org2blog 内容时在正文开始前加入如下片段:

1
2
3
4
5
6
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
displayAlign: "left",
displayIndent: "2em"
});
</script>

Read More

编译 Java 程序时出现 code too large 错误的分析

我参与的一个实际项目里用到了 ANTLR 3.x 进行 parser 代码自动生成,其中含有大量的 static field 用作状态转移查找表。由于一个 class 中所有 static field 都是放在一个匿名 method 中统一进行初始化,而 Java VM 规范规定一个 class 中单个 method 中 bytecode 长度最多不能超过 65535 bytes,这个自动生成的 parser class 始终无法在 javac 上编译,总是会提示 error: code too large 。但问题是在 Eclipse 中编译使用该文件完全没有问题,由于 65535 bytes 的限制是 Java VM 规范所规定,同生成 class 的编译器没有关系,因此原因只可能是 ecj 生成的 bytecode 比 javac 少,这就有点儿诡异了。

Read More

使用 Terratec Cinergy T Stick+ DVB 电视卡进行 RTL-SDR 实验时的几点注意事项

  • Terratec Cinergy T Stick+ 相关驱动仅在 kernel 3.7 及以上版本中并入了主干
  • 安装 rtl-sdr 工具后,请确保 /etc/udev/rules.d/ 中增加了其给出的 udev 规则以对设备结点权限进行修正,否则只有 root 才能访问 DVB 设备
  • 使用 rtl-sdr 等 SDR 工具前,需要将自动加载的 dvb_usb_rtl28xxu 模块卸载,否则 SDR 相关工具会无法打开 DVB 设备并报错,建议检出最新版 rtl-sdr 代码并使用 --enable-driver-detach 选项配置后编译安装,这样 rtl-sdr 工具一旦发现设备被该模块占用便会将其自动卸载。

对 GNUCash 进行的一点儿改进

当前版本的 GNUCash 在连接 MySQL 数据库时有个比较严重的字符编码问题:为了兼容 Unicode 字符,GNUCash 在 gnc_dbi_mysql_session_begin() 函数中主动执行 SET NAMES 'utf8' 语句设定 MySQL 连接字符编码为 UTF-8,但遗憾的是用来在连接故障时修复连接的 gnc_dbi_verify_conn() 函数并没有进行类似的操作。一旦数据库连接因网络问题意外断开,用户输入新交易时就会使用 gnc_dbi_verify_conn() 重新创建的新连接,而该连接的字符编码是默认的 latin1,直接后果就是输入中文等字符都变成了一堆乱码。

Read More

修复 GNUCash 数据库中的乱码

GNUCash 是一款很好的记账软件,但在使用 MySQL 作为存储后端时,由于其对连接字符集的设置有漏洞,容易出现记账备注中的中文变乱码的情况。此时,可以在 MySQL 中执行如下 SQL 语句完成修复工作:

1
UPDATE splits SET memo = CONVERT(BINARY(CONVERT(memo USING latin1)) USING utf8) WHERE CHAR_LENGTH(CONVERT(BINARY(CONVERT(memo USING latin1)) USING utf8)) != CHAR_LENGTH(memo);