May
18
2010
Zipf定律是文献计量学的重要定律之一,它和罗特卡定律、布拉德福定律一起被并称为文献计量学的三大定律。
对于CDN的内容管理,也近似符合Zipf 定律,就是大家常说对于内容的访问遵循80/20原则,也就是20%的内容,会占有80%的访问量。

zipf law
这里 r 表示一个单词的出现频率的排名,P(r)表示排名为r的单词的出现频率.
(单词频率分布中 C约等于0.1, a约等于1)
后人将这个分布称为zipf distribution,中文名称为齐普夫分布或Zeta 分布。这是一个离散事件分布,广泛应用于语言学,保险学,网络模拟,以及对稀疏事件的建模中。
它表明在英语单词中,只有极少数的词被经常使用,而绝大多数词很少被使用。实际上,包括汉语在内的许多国家的语言都有这种特点。这个定律后来在很多领域得到了同样的验证,包括网站的访问者数量、城镇的大小和每个国家公司的数量。。这个定理也在很多分布里面得到了验证,比如人们的收入,互联网的网站数量和访问比例,互联网内容和访问比例(其他分布两个常数有所不同,a越大,分布越密集,对于VOD来说某些时候符合双zipf分布)。
比起枯燥的公式,图表更具有说服力,下面是用三百个严格符合zipf 分布的数据点描绘成的图,其中横轴表示排名,纵轴表示访问的频率,分别使用线性坐标和对数坐标表示:

zipf distribution
可以看到对数坐标下是一条完美的直线。
Continue reading
May
5
2010
NetBeans 安装目录下的 netbeans.conf 文件中的 netbeans_default_options 能够对 NetBeans 的启动,运行以及编译的速度产生很大的影响,恰当地设值可以让 NetBeans 的性能有大幅提升,当然如果设置的值过高也能导致 NetBeans 无法启动。
我的内存是 2GB 的,netbeans_default-options 设置为以下的参数,运行速度很快,在这里做个备份供以后参考。
netbeans_default_options="-J-Dfile.encoding=UTF-8 -J-XX:PermSize=128m -J-XX:MaxPermSize=256m -J-Xmx1024m -J-Duser.language=en -J-client -J-Xverify:none -J-Xss2m -J-Xms512m -J-Dapple.laf.useScreenMenuBar=true -J-Dsun.java2d.noddraw=true -J-XX:+UseConcMarkSweepGC -J-XX:+CMSClassUnloadingEnabled -J-XX:+CMSPermGenSweepingEnabled"
Apr
30
2010
最近在用Swing 来编写图形用户界面,其中一个需求就是将System.out.println 的输出重定向到JTextArea组件中,刚开始使用的是《Java 标准输出重定向到GUI 》里的代码,但是在后台需要大量计算的时候,界面出现无响应的情况。后来又经过一番搜索,在 blogspot 找到了一篇文章: 《 Redirecting System.out and System.err to JTextPane or JTextArea》 ( 被墙了),可以实现实时输出的功能,不会出现缓慢的情况。
在 Swing 中,如果想将System.out和System.err 重定向到 JTextPane或者JTextArea,只需要覆盖OutputStream中的write() 方法来将文件附加到 text pane中。
JTextArea 版本:
private void updateTextArea(final String text) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
textArea.append(text);
}
});
}
private void redirectSystemStreams() {
OutputStream out = new OutputStream() {
@Override
public void write(int b) throws IOException {
updateTextArea(String.valueOf((char) b));
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
updateTextArea(new String(b, off, len));
}
@Override
public void write(byte[] b) throws IOException {
write(b, 0, b.length);
}
};
System.setOut(new PrintStream(out, true));
System.setErr(new PrintStream(out, true));
}
Continue reading
Mar
24
2010
一直不喜欢 NetBeans 默认的字体,相比Eclipse来说很难看,但今天配置了一下之后外观还是很不错的:
1. 首先在 C:\Program Files\Java\jre6\lib 下新建一个文件:fontconfig.properties(今天发现这个字体配置会与hsqldb 的图形界面有冲突,后来把这个文件删除才正常。只要进行第二步也可以达到相同的效果。2009-3-26)
# fontconfig.properties
dialoginput.plain.alphabetic=Verdana
dialoginput.plain.chinese-ms950=MingLiU
dialoginput.plain.hebrew=David
dialoginput.plain.japanese=MS Gothic
dialoginput.plain.korean=Gulim
dialoginput.bold.alphabetic=Verdana Bold
dialoginput.bold.chinese-ms950=PMingLiU
dialoginput.bold.hebrew=David Bold
dialoginput.bold.japanese=MS Gothic
dialoginput.bold.korean=Gulim
dialoginput.italic.alphabetic=Verdana Italic
dialoginput.italic.chinese-ms950=PMingLiU
dialoginput.italic.hebrew=David
dialoginput.italic.japanese=MS Gothic
dialoginput.italic.korean=Gulim
dialoginput.bolditalic.alphabetic=Verdana Bold Italic
dialoginput.bolditalic.chinese-ms950=PMingLiU
dialoginput.bolditalic.hebrew=David Bold
dialoginput.bolditalic.japanese=MS Gothic
dialoginput.bolditalic.korean=Gulim
filename.Verdana=verdana.TTF
2. 将NetBeans 6.8 的默认语言改为EN, 修改 C:\Program Files\NetBeans 6.8\etc\netbeans.conf 文件,在netbeans_default_options 中加入 -J-Duser.language=en 选项。
再次打开的时候,就可以看见熟悉的 Eclipse 字体了:
Continue reading
Mar
12
2010
在初安装时常要进行的字体和外观设置:
1. GVIM 如果想要每次打开都固定为自己设定的字体时,应当在 _vimrc 中加入相应的内容:
- 打开vim,选一个喜欢的字体
- 运行 :set guifont?
- 记下vim返回的信息,如:guifont=新宋体:h12:cGB2312
- 在_vimrc中写入一行:set guifont=新宋体:h12:cGB2312 (刚才记下的内容)
2. 而对于Java的Swing程序,默认的Look and Feel 比较丑陋,如果想尽可能与原生的windows外观相同,则可以:
在%JDK_HOME%/jdk_1.6.x/lib 下添加一个名为 swing.properties 的文件 ,其内容为:
# Swing properties#%JDK_HOME%/jdk_1.6.11/lib
swing.defaultlaf=com.sun.java.swing.plaf.windows.WindowsLookAndFeel
#swing.defaultlaf=com.sun.java.swing.plaf.mac.MacLookAndFeel
#swing.defaultlaf=com.sun.java.swing.plaf.motif.MotifLookAndFeel
关键词: GVIM 字体设置 Swing 外观设置
Jan
17
2010
这是一道有关构造方法的程序:
package org.leeing.mem;
abstract class BaseClass{
public BaseClass(){
this.print() ;
}
public abstract void print() ;
}
class SubClass extends BaseClass{
private int x = 100 ;
public SubClass(int x){
this.x = x ;
}
public void print(){
System.out.println("x = " + x) ;
}
}
public class TestJava{
public static void main(String args[]){
BaseClass a = new SubClass(10) ;
}
}
它的输出结果是:x = 0
这是因为子类对象的实例化过程是这样的:首先调用父类的构造方法BaseClass(),而在BaseClass()调用完毕之前,子类的构造方法SubClass()是不能得到调用的,同时SubClass 的所有属性也不能初始化,在这里中 int 类型的 x 默认值为 0。
同时,在开发中应当尽可能遵循的原则是:一个类不要继承一个已经实现好的类,而是最好继承抽象类或者实现接口。
Jan
17
2010
下面一道题,是关于 Java 的引用传递的问题。
package org.leeing.mem;
class StringBean{
String str = "hello";
}
class IntBean{
int intVal = 100;
}
public class RefDemo02 {
public static void main(String[]args){
StringBean strbean = new StringBean();
strbean.str = "world";
IntBean intbean = new IntBean();
intbean.intVal = 33;
String strname = "strname not Changed";
change(strbean);
change(intbean);
change(strname);
System.out.println(strbean.str); // 输出 "strbean changed"
System.out.println(intbean.intVal);// 输出 999
System.out.println(strname); // 输出 "strname not Changed"
}
public static void change(StringBean temp){
temp.str = "strbean changed";
}
public static void change(String str){
str = "leeing";
}
public static void change(IntBean temp){
temp.intVal = 999;
}
}
输出是:
strbean changed
999
strname not Changed
可以看到 String 是不可变对象,而IntBean和StringBean则通过引用改变了内部变量的值,此处对int和String的改变原理是相同的。