2007年4月25日星期三

哥本哈根

今晚去看了一场话剧《哥本哈根》,有几处印象极深
1、一段台词:有的人错以为弱小的国家的臣民的民族自尊心自然会弱些,还有人错以为邪恶的国家的臣民就不那么热爱自己的祖国。
2、我看着他看到的我看不到的
3、投影;中场休息
4、导演说,最煽情的未必是真实的,所以没有必要放到最后
5、海森堡说,我既是粒子,又是波
6、玛格丽愤怒地对海森堡说,"那是因为你不敢!"听到这句话我忽然感到一种极大的惶恐和不安,女人的尖锐。
7、滑雪的暗示――势不可挡,快感与畏惧,计算变得毫无意义
8、工科学生的快乐,理科学生的痛苦,文科学生的反思

2007年4月16日星期一

Miranda is nice!

赞美Miranda这个软件!
现在,我抛弃了Gaim,因为Miranda的插件对QQ的支持足够好,又不需要gtk,而且非常节省资源!
QQ,MSN都Merge到一个非常精简的界面中了。

2007年4月12日星期四

以概率执行的代码段

首先定义随机数静态类,防止每次new Random();
public class Rnd{
    private static Random _rnd=new Random();
    public static boolean p(double d){
        return _rnd.nextDouble()<d;
       
    }
}

使用起来很方便,例如
if(Rnd.p(0.2)){
             //do sth.
}
以0.2的概率执行一段代码。

这种方法也许在随机算法的实现中较为有用

2007年4月10日星期二

notify失效?

用wait/notify同步的时候,有时notify会失效?notify上下文语句都已经执行了,但是wait却没有过去,不知道为什么。
这个问题出现了多次,而且只有在跑好几个程序的的时候才发生。很奇怪……

2007年4月8日星期日

阳台山备忘

今天和宋老师一家去爬阳台山,早上八点启程,下午六点回城。
忘记带的物品:水果、湿纸巾、垃圾袋。
多余的东西:棉袄。
现在防火道查的很严,有摄像头,不硬闯过不来。我们没闯,买门票进来的。有强人云:管,是他们的义务,走路,是我们的权利。不禁汗颜。
上山时,能走土路就不走柏油路。下山时,石板路最令人精神崩溃,所以要走一些提神的有挑战性的路,比如必须手脚并用的路。
对讲机是很好玩的东西,可以听不认识的人群聊,谁也见不着谁,但是知道都在这个山里。
宋老师的女儿伊文从四岁开始爬山,体力比我好,宋老师更是多年的绿野元老,所以我常常不得不在后面追他们。
伊文听到对讲机里有人呼叫"山羊哥哥",自言自语:我还"绵羊妹妹"呢。让人忍俊不禁。



2007年4月6日星期五

LordKelvin的问题与水立方

今晚在建管报告厅有一个水立方的讲座,我去听了。原来里面还有数学物理的问题,LordKelvin提出的:如果我们将三维空间细分为若干个小部分,每个部分体积相等,但要保证接触表面积最小,这些细小的部分应该是什么形状?后来发现气泡泡很像,很符合物理直觉。不知道有没有人给出过严格的证明?
我感觉这个问题不是很简单,优化的目标和约束都比较好刻画,比如不失一般性取空间为单位正方体,做N等分体积的分割,目标是一个二重积分,约束是一个三重积分方程组,但决策变量怎么描述?所有可能的边界分布吗?这肯定是一个无穷维空间,即使考虑二维的问题,决策空间也是无穷维的……看来不得不用到泛函了。

2007年4月5日星期四

利用反射编写简单的Java Shell

反射和annotation是以前我很少用的功能。最近发现,利用他们可以做很漂亮的shell,在原型开发的命令行控制中,还是很有用的:)

例如最经典的一个命令:用help输出所有支持的命令
    @Description("查看命令清单")
    public void help(){
        //echo("命令与参数用一个空格分开,参数字符串中不得含有空格");
        Method[] ms=Shell.class.getDeclaredMethods();
        for(Method m : ms){
            Class[] cs=m.getParameterTypes();
            if(cs.length==0)
                echo(m.getName());
            else
                echo(m.getName()+" [par]");
            System.out.println("\t"+m.getAnnotation(Description.class).value());
        }
    }
其中Description是定义的一个annotation,从此我们发现,注释作为文档的一部分不仅仅是文本,而且是"有结构的"、"可编程的",还是javadoc文档的一部分。shell只用到其中很小的一点作用,这样声明

@Target(ElementType.METHOD) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@interface Description { 
    String value(); 
}


然后利用命令行输入的字符串,就可以执行相同方法名的方法了

String cmd = ReadLine();
Method m = Shell.class.getMethod(cmd, new Class[0]);
m.invoke(sh, new Object[0]);

大的框架是这样了,api细节参考jdk doc或google

2007年4月4日星期三

试用Google拼音输入法

上网收到twitter来得消息
http://tools.google.com/pinyin/index.html
Google竟然出拼音输入法了!互联网发展到今天,连操作系统的许多基本的构件,都被陆续拿到了网上。我们的互联网的依赖越来越深。想象有一天,当我们不能上网时,也许就像断水断电一样痛苦不堪了。

泛型・模版・类型安全集合类

模版技术是C++得很强的功能,模版类、模版函数等配合起来让程序非常简洁。
在C#中有了泛型的概念,和模版很像。
Jdk1.5以后也有了类型安全集合类的概念,为此我们甚至可以声明这样的接口
/**对象池接口
 */
public interface ObjectPool<E> {
    /**签入*/
    void checkIn(E e);
   
    /**签出*/
    E checkOut();
}

在模版符号E可用以前,我们可能用一个抽象类或接口。
/**可重用对象接口
 */
public interface Reusable {
    /**放回对象池中*/
    void turnBack();
   
    /**是否正在使用*/
    boolean isUsing();
}
但是通常后文免不了需要装箱,这样对性能和类型安全都是隐患。
有了模版,Java更强了。

2007年4月1日星期日

小心ByteBuffer的array()

今天调试程序,发现jdk中ByteBuffer与字节数组之间关系暧昧。
首先,同一个字节数组上可以构建许多个甚至重叠的ByteBuffer,他们在同一段内存上读写。
其次,这许多ByteBuffer的array()方法返回的都是同一个底层的字节数组,而不是他标记的这一段。
事实上,ByteBuffer通过如下三个字段来标记自己与底层数组的关系:
array
arrayoffset//起始偏移
capacity//大小

ByteBuffer完整控制对应的底层数组,当且仅当
arrayoffset=0且capacity=array.length

通常使用的时候,我们只用上面一小段,精细控制。但是别忘了他底层实现的机理。