Blogs

Bazaar 的改进

Bazaar 的性能,包括空间和时间上的性能一直在改进:

  • 1.0,Pack Format(pack-0.92):之前是 Knit 格式,Pack 就是将这些放在一起,提高了存储效率,大概有 10-15% 的改进,速度上也有所提高。

静态最终域初始化时抛异常的问题

有时候需要一些预先创建好的对象以便别的类直接使用,这些对象通常都是静态最终常量(static final),通常都是这样创建的:

  1. package org.supermmx.example.misc;
  2.  
  3. public class StaticFinalException {
  4.     public static final Test TEST_1 = new Test("value1");
  5. }
  6.  
  7. class Test {
  8.     public Test(String value) {
  9.     }
  10. }

但如果在构造函数中声明有异常抛出的话,会怎么样呢?

  1. package org.supermmx.example.misc;
  2.  
  3. public class StaticFinalException {
  4.     public static final Test TEST_1 = new Test("value1");
  5. }
  6.  
  7. class Test {
  8.     public Test(String value) throws Exception {
  9.     }
  10. }

编译的结果如下:
 

Wesnoth 战役“烈日之下”通关

终于把 Wesnoth 1.5+ 的战役“Under The Burning Suns”(UtBS、烈日之下)打通关了。通关不难,难的是在最难级别。最难级别也不难,难的是本方一个人也不死(老外的说法是 play with no loss)。既然是对电脑,相对来说要容易很多,当然要给自己点难度了,否则只是看看情节对自己的提高也没有太大的帮助。

Java 定时器退出问题

项目中用到了 Timer 每隔一段时间进行一些操作,现在发现有时候莫名其妙地挂在这个计时器上的操作都不做了,用“JConsole”查看其中的线程以后,发现这个定时器线程也不在了(定时器创建的时候带了名字 Timer timer = new Timer("MyTimer"),所以直接能看到),由于日志太多,之前的日志已经找不到了,所以没有办法看是否是有异常发生以及发生在哪里。初步估计,是不是由于 TimerTask 中有异常抛出,如果定时器中没有处理的话,可能就会出问题。所以看了一下 java.util.Timer 的代码:

  1. // 在 TimerThread 中执行任务
  2. Timer.java:101:TimerThread
  3.   // TimerThread 的入口
  4.   // 这里只有一个 try/finally,如果 mainloop 中有异常抛出的话,肯定就结束运行。
  5.   Timer.java:503:TimerThread.run()
  6.     // 主循环体,其中只抓住了 InterruptedException 异常,其他的仍然往外抛。

32 位的应用程序在 64 位内核中的 ioctl 问题

工作中的一个项目涉及到了内核模块和用户程序两部分,之间通过 ioctl() 进行通讯,现在需要 64 位(x86_64)的 Linux,所使用内核版本是固定的,2.6.9。

首先,直接编译运行以后,发现一个错误:kernel: ioctl32(${APP_NAME}:${PID}): Unknown cmd fd(6) cmd(c01844f01){00} arg(0816ed60) on ${file}。Google 了一下,明白这是由于用户程序是 32 位而内核是 64 位的缘故。问题的缘由是知道了,得开始找解决方法了。刚开始还以为是内核模块中自定义的 ioctl()(通过 struct file_operations 定义) 返回了错误,后来在其中加上了调试信息,发现根本就没有进到函数中去。

分布式版本控制系统演讲

前两天给公司的同事介绍了一下分布式的版本控制系统,主要的内容如下:

  1. 版本控制系统的基本知识。
  2. 版本控制系统的发展过程。
  3. 分布式版本控制系统的原理及工作流程。
  4. Bazaar 界面演示

本次演讲的主要目的还是介绍为主,让大家知道存在着这么个好东西,所以不会涉及到很多细节。如果有什么错误,还请大家指正。

下载:ODP 格式PDF 格式

Emacs 中 Bazaar 提交问题

在 Emacs 中使用 vc 操作 Bazaar 时碰到了两个问题:

  • 在 vc-dir 中如果有多个修改的问题,然后标记其中的一些,提交后,所有的文件都被提交,而不是标记的那些。
  • 如果提交注解(commit comment)有多行,只有第一行当作真正的提交注解,其他的都丢弃了。并且所有文件都被提交。

这个问题很久以前就发现了,一直也没有仔细看过,所以在 Windows 上一直都没有在 Emacs 中使用 Bazaar,而是使用命令行,写提交注解尤其是多行注解的时候很不方便。已经给 Emacs 提交了 [bug 报告]。在 Linux 上没有问题。

今天仔细研究了一下,也顺便学习了一下 Elisp。整个版本控制包(vc)的概念比较简单,很多操作都是在一个函数中完成的——vc-next-action 中完成。

  1. vc.el:988:vc-next-action:1088
  2. ;; 调用 start-logentry 时定义了一个 lambda 函数

Java 序列化的问题之二——单例

第二个问题是如何读取应该是单例(Singleton)的序列化数据?当然要保证一是单例,二是数据正确性。Google 出来的所有文章都是一个调:private Object readResolve() { return getInstance(); }。方法没错,肯定要使用 readResolve() 返回一个唯一的实例。但真的可行吗?看下面的程序:

  1. WrongSingletonObject.java
  2.  
  3. public class WrongSingletonObject implements Serializable {
  4.     private static WrongSingletonObject instance;
  5.  
  6.     private String value = "value1";
  7.  
  8.     private WrongSingletonObject() {
  9.     }
  10.  
  11.     public static synchronized WrongSingletonObject getInstance() {
  12.         if (instance == null) {

Java 序列化的问题之一——自定义的类加载器

项目中间用到了 Java 序列化,但碰到了几个问题,可以说道说道。

由于涉及到问题以及解决方法有些繁杂,所以用一套例子来演示各种情况,项目以 [Ant] 编译运行。目录文件如下:

  1. CustomObject.java // 就是我们的主角了,它本身是在缺省的类路径,但其子类都是单独的 jar
  2. |-- SubCustomObject.java // 第一个子类
  3.     |-- plugin1.properties // 第一个子类所对应的信息,让加载器读取
  4. |-- AnotherSubCustomObject.java // 第二个子类
  5.     |-- plugin2.properties // 同上
  6.  
  7. // 主程序
  8. SerializationTest.java
  9.  
  10. // 单例类
  11. CustomObjectUtils.java
  12. // 自定义的类加载器
  13. CustomClassLoader.java
  14.  
  15. // 最简单的对象容器
  16. SimpleCustomObjectHolder.java
  17. // 将包含的对象在序列化时转换成 String,并在逆序列化时再转换回来。
  18. CustomObjectHolder.java
  19. // 列表容器,演示 Collection

更新 Drupal 的统计模块

为了能看到每篇文章或者日志有多少人人看过,需要开启 Drupal 的“统计”(Statistic)模块。以前用过一次,后来发现有几个问题:搜索引擎的搜索记录也算进去了,还有一个就是我自己的点击也算了进去,这样看起来节点的点击量都很多,实际上绝大部分都是搜索引擎带来的,看着也不爽。后来就关掉了。前两天又找了一下,找到了一个模块 [Statistics Advanced Settings],发现是完全符合我的需求,然后就装上试用。

这个模块提供的功能有三个:

  • 不会重复计数。对同一个 Session ID 的匿名用户或者同一个用户只计算一次。
  • 丢弃特定角色(Role)的用户的访问记录,比如管理员和作者自己。可以通过 “Administer => Reports => Access log settings” 来设定。
  • 丢弃爬虫和机器人的访问记录。这个功能需要和 [Browscap 模块]一起来使用。当 Browscap 安装设置好以后就直接可以看到效果了。具体请看下文。
Syndicate content