May 18 2010

用户访问行为,齐普夫分布及其 Java 实现

Zipf定律是文献计量学的重要定律之一,它和罗特卡定律、布拉德福定律一起被并称为文献计量学的三大定律。

对于CDN的内容管理,也近似符合Zipf 定律,就是大家常说对于内容的访问遵循80/20原则,也就是20%的内容,会占有80%的访问量。

zipf law

zipf law

这里 r 表示一个单词的出现频率的排名,P(r)表示排名为r的单词的出现频率.

(单词频率分布中 C约等于0.1, a约等于1)

后人将这个分布称为zipf distribution,中文名称为齐普夫分布或Zeta 分布。这是一个离散事件分布,广泛应用于语言学,保险学,网络模拟,以及对稀疏事件的建模中。

它表明在英语单词中,只有极少数的词被经常使用,而绝大多数词很少被使用。实际上,包括汉语在内的许多国家的语言都有这种特点。这个定律后来在很多领域得到了同样的验证,包括网站的访问者数量、城镇的大小和每个国家公司的数量。。这个定理也在很多分布里面得到了验证,比如人们的收入,互联网的网站数量和访问比例,互联网内容和访问比例(其他分布两个常数有所不同,a越大,分布越密集,对于VOD来说某些时候符合双zipf分布)。

比起枯燥的公式,图表更具有说服力,下面是用三百个严格符合zipf 分布的数据点描绘成的图,其中横轴表示排名,纵轴表示访问的频率,分别使用线性坐标和对数坐标表示:

zipf distribution

zipf distribution

可以看到对数坐标下是一条完美的直线。

Continue reading


May 5 2010

Netbeans 性能调优及加速

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 重定向到 JTextArea 和 JTextPane

最近在用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 6.8 字体设置

一直不喜欢 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

JDK 和 GVIM 的字体 tips

在初安装时常要进行的字体和外观设置:

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

Java 的构造方法

这是一道有关构造方法的程序:

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 的引用传递

下面一道题,是关于 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的改变原理是相同的。