yichao firstname, zeaster nickname, zhang lastname

统一Mac OS X,Windows XP/Vista以及linux的系统时间

Windows把BIOS时间作为系统时间,而Mac OS X把BIOS时间作为GMT+0时间,所以对于生活在GMT+8时区的中国用户来说,这两个系统共存时系统时间是不一致的。
即:如果windows时间为12:00,则到Mac OS X下就变成了20:00,在Mac OS X下改过来后,再回到windows下就又错了。

之前看过这篇blog,讲了通过修改windows注册表,使得windows也把bios时间作为GMT+0时间,这样就可以解决这个问题了,具体操作如下:
在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation\中加一项DWORD,RealTimeIsUniversal,把值设为1即可。

这个办法是靠调整windows时间设置来解决问题的,但是当系统中有linux时,因为linux也是使用bios时间作为系统时间,所以这时linux系统的时间就又不一致了。
最好的办法就是调整Mac OS X的时间。于是想到了强大的Bash Shell,先写脚本1用来开机时自动把时间校对准,然后关机时再运行脚本2,把时间调整回去。
脚本1:
#!/bin/bash
d=$(date "+%d")
H=$(date "+%H")
M=$(date "+%M")
S=$(date "+%S")
let "H=$H-16"

z=0
if [ "$H" -lt "$z" ]
then
  let "H=$H+24"
  let "d=$d-1"
fi

z=10

if [ "$d" -lt "$z" ]
then
  d=0$d
fi

if [ "$H" -lt "$z" ]
then
  H=0$H
fi

sudo date -u $d$H$M.$S

脚本2
#!/bin/bash
ss=$(date "+%d%H%M.%S")
sudo date -u $ss

那么如何实现自动开机运行以及关机自动运行呢?
1 开机自动运行
写shell,然后在applescript中调用shell,再把applescript保存为app,添加到login items中
注:我的.sh文件和textmate做绑定了,这样直接添加.sh文件不会执行shell,而是被textmate打开

2 关机自动运行
使用launchbar的restart和shutdown applescript,因此只需在这两个script中添加调用shell的一句即可了。

bash shell修改系统时间需要root权限,那么如何在applescript中调用时输入root密码呢?
使用如下命令:
do shell script "sudo date -u 1200" password "mypwd" with administrator privileges

推荐一本书:中国自行车之旅

前面介绍了如何选购适合自己的自行车,以及一些基本修车技术,足以应付长途骑行的需要。
后面是全国各地的骑行路线介绍,很实用!

PS 1:
本来想引用豆瓣上关于这本书的链接,结果发现没有,仔细一查才发现原来:
在豆瓣上已无法添加《中国自行车之旅》一书,因为《中国自行车之旅》和《中国徒步之旅》这两本书的isdn号都是7561327234
  这两部书见:
  http://joyo.com/detail/product.asp?prodid=bkbk404144
  http://joyo.com/detail/product.asp?prodid=bkbk410714

PS 2:
看过之后,决定今年春季去一次十三陵水库,那位想一同去,可以留言。

性能准则之一:在遍历集合前一定要判断集合是否为空

例举2个例子:
1使用Iterator对象遍历集合时,此时遍历前检查集合大小可以缩短执行时间约为:64%

  public static void main(String[] args) {
    int N = 1000 * 100000;
    List<Integer> list = new ArrayList<Integer>();

    long start = System.currentTimeMillis();
    for (int i = 0; i < N; i++) {
      Iterator<Integer> iter = list.iterator();
      while (iter.hasNext()) {
        System.out.println(iter.next());
      }
    }

    System.out.println(System.currentTimeMillis() - start);                      //==================490
    start = System.currentTimeMillis();
    for (int i = 0; i < N; i++) {
      int j = list.size();
      if (j > 0) {
        Iterator<Integer> iter = list.iterator();
        while (iter.hasNext()) {
          System.out.println(iter.next());
        }
      }
    }
    System.out.println(System.currentTimeMillis() - start);                     //==================180          时间缩短了64%
  }


2 使用for循环遍历集合时,此时遍历前检查集合大小可以缩短执行时间约为:5%
  public static void main(String[] args) {
    int N = 1000 * 10000;
    List<Integer> list = new ArrayList<Integer>();

    long start = System.currentTimeMillis();
    for (int i = 0; i < N; i++) {
      int j = list.size();
      for (int t = 0; t < j; t++) {
        System.out.println(list.get(t));
      }
    }

    System.out.println(System.currentTimeMillis() - start);          //==================190
    start = System.currentTimeMillis();
    for (int i = 0; i < N; i++) {
      int j = list.size();
      if (j > 0) {
        for (int t = 0; t < j; t++) {
          System.out.println(list.get(t));
        }
      }
    }
    System.out.println(System.currentTimeMillis() - start);         //==================180     时间缩短了5%
  }