在Ubuntu 10.10 maverick上安装TortoiseHg graphical tool

Step 1: Adding two Personal Package Archives(PPA) to your Ubuntu system

sudo add-apt-repository ppa:mercurial-ppa/releases
sudo add-apt-repository ppa:tortoisehg-ppa/releases

Your system will fetch the PPA’s key. This enables your Ubuntu system to verify that the packages in the PPA have not been interfered with since they were built.

Step 2: Now, you should tell your system to pull down the latest list of software from each archive it knows about, including the PPAs you just added

sudo apt-get update

Step 3: you’re ready to start installing software from the PPAs

sudo apt-get install mercurial
sudo apt-get install tortoisehg-nautilus

My mercurial and tortoisehg version info:

hg --version

分布式软件配置管理工具 – 水银 (版本 1.7.3)
(see http://mercurial.selenic.com for more information)

Copyright (C) 2005-2010 Matt Mackall and others
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

One of the JavaIdioms, “Double Brace Initialization”

Objects created by DoubleBraceInitialization will never be equal to objects created without it. So you would never use this for any class that needs a nontrivial equals(Object)method.

public class DoubleBraceInitialization {
    
    private String str;

    public DoubleBraceInitialization() {
        str = "double brace initialization";
    }
    
    /**
     * @return the str
     */
    public String getStr() {
        return str;
    }

    /**
     * @param str the str to set
     */
    public void setStr(String str) {
        this.str = str;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((str == null) ? 0 : str.hashCode());
        return result;
    }
    /* (non-Javadoc)
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            System.out.print("Because " + this.getClass().getName() + "is different from " + obj.getClass().getName() + " , so answer is ");
            return false;
        }
        DoubleBraceInitialization other = (DoubleBraceInitialization) obj;
        if (str == null) {
            if (other.str != null) {
                return false;
            }
        } else if (!str.equals(other.str)) {
            System.out.print("Because str in " + this.getClass().getName() + "is different from " + obj.getClass().getName() + "'s, so answer is ");
            return false;
        }
        return true;
    }

    public static void main(String[] args) {
        DoubleBraceInitialization dbi1 = new DoubleBraceInitialization() {{
                this.setStr("double brace initialization");
        }};
        DoubleBraceInitialization dbi2 = new DoubleBraceInitialization();
        
        System.out.println("dbi1 vs dbi2 : " + dbi1.equals(dbi2));
    }
}

Standard out print:
Because DoubleBraceInitialization$1is different from DoubleBraceInitialization , so answer is dbi1 vs dbi2 : false

References:http://www.c2.com/cgi/wiki?DoubleBraceInitialization

Taste of String

String is always a popular topic in java. Beyond all question String is an object type. But sometimes it seems like a basic data type. Many website emphasize we should identify between one situation when we use String a = “abc” and the other when String a = new String(“abc”).

Why I say String sometimes looks like a basic data type. Let’s see a simple example first:

Continue reading Taste of String

How to insert a new word into imdict-chinese-analyzer(智能中文分词模块)

这不是一篇讲述Vekou的文章,但和Vekou的关系相当紧密。

在上一篇文章中提到还有一个很重要的问题没有说清楚,其实就是关于Vekou底层所涉及到的中文分词器imdict-chinese-analyzer,如果理解了Vekou 高级使用中谈到Vekou内部是如何工作的以后,就知道如果Vekou遇到一个从来未见过的新词,就算向zhy.dict添加一个这个新词,如果在分词阶段没有把这个词正确划分,Vekou就不能像一个词一样把它读出啦,听上去依然像一个字一个字地读。所以,要让Vekou正确识别一个词,有两个条件必须具备:

  1. 必须让中文分词器划分出这个词,即分词器字典中存在这个词
  2. Vekou中的粤语发音字典中(zhy.dict)也要存在这个词

Continue reading How to insert a new word into imdict-chinese-analyzer(智能中文分词模块)

Vekou 高级使用

没有实现time scaling与pitch scaling是一个遗憾,特别是pitch scaling比较难实现,如果学了数字信号处理那应该是很easy的事,听说是要用到DFT的,准确来说是频域上移频,我借了几本书回来,等我刨完那些书以后在写应该就没问题了。time scaling主要是现在没时间写,原理是在音频流中插帧,在原本的两个帧之间插入一个左右帧的平均帧,递归插,需要延长多少时间就插多少,这个功能我一有时间就一定去实现。

怎么说,没有了这两个功能语音合成就好像成了鸡肋,当然最主要的还是如何处理初始音频流,使它的发音尽量接近人类的声音。

本篇文章会从Vekou的结构说起,到基本的配置,到你应该如何自定义一个音频流处理器,统统都会说到的。

Continue reading Vekou 高级使用

Vekou,粤语的语音合成

至于为什么叫Vekou,我也不知道,唯一想了一分钟多的是用什么字母开头,i是苹果,z和m、w都是微软,k是相机和胶卷,d像狗,所以还是v比较有型一点,然后随手就把后面几个可以连在一起发音的字母敲出来了。Vekou读作[‘vekau],项目进行了一段时间以后才突然想起需要一个比较像样的名,一开始建eclipse项目名用的还是speech synthesis。

Vekou目前虽然发音质量不是相当好,但基本上还可以工作了。你可以给一个String让它发音,也可以给一个txt文档让它发音,当然你也可以让程序给你生成一个语音文件。0.0.4版的功能详细的功能说明如下:

  1. String发音
  2. txt文档文件发音,txt文档编码自动检测
  3. 语音文件生成
  4. 粤语口语转换发音
  5. time scaling(未实现)
  6. pitch scaling(未实现)
  7. 繁简支持
  8. 语音库自定义
  9. 词典自定义
  10. 口语字典自定义

Continue reading Vekou,粤语的语音合成

Obtain favicon.ico from any website

使用wordpress构建的博客在首页的展示链接是可以在链接前加上一个图标,这个图标不能太大,否则看上去很不雅观,其实最好的选择就是通常访问一个网站时在地址栏会出现代表该网站的一个图标,通常我们称之为”favicon”.

今天也发现Google Reader可以在订阅前面直接显示网站的favicon

其实要获取某个网站的favicon并不困难,这个文件或者是在网站根目录下,或者是在<head>中的<link>标签所指的href的路径下,总之是一个.ico的文件。例如http://www.ibm.com/developerworks/cn/java/的favicon url地址为http://www.ibm.com/favicon.ico,而http://www.liferay.com/web/shuyang.zhou/profile的favicon url地址通过查看源文件可以看到是http://cdn.www.liferay.com/osb-theme/images/liferay.ico

为了过把瘾,写了一个类来把任意一个网站的favicon下载到本地,下面简单简单介绍:

为了将来下载的通用性,DownloadTookit类并不局限于下载favicon.ico,你可以使用它来从网络下载任意一个使用http协议的文件,该类的构造方法如下:

public DownloadTookit(Proxy proxy, String fileName) {
this.proxy = proxy;
this.fileName = fileName;
}

考虑到URL类里面有一个方法
URLConnection java.net.URL.openConnection(Proxy proxy) throws IOException
所以不如将DownloadTookit设置成可以使用代理的,那当有一些文件需要代理才能下载时,仍然可以使用这个类来下载,这就方便多了,不过大多数情况下你不需要使用代理,可以在上述方法中传入Proxy.NO_PROXY来指明不使用代理方式,就如我在测试类中的情况一样。

另外DownloadTookit中还包含了两个额外的方法:
public URL getRootDirectory(URL webURL) throws MalformedURLException
和一个针对获取favicon的特殊方法
public URL getFaviconURL(URL webURL) throws MalformedURLException,这个方法首先测试在站点根目录下是否存在一个名为favicon.ico的文件,如果不存在,则通过调用ReadHttpDocument类的
public List<String> getUnestedTags(String match) throws IOException
方法获得源文件中所有的<link>标签元素,逐个查看里面是否有一个href指向一个.ico的文件,如果存在,则这个地址即是favicon的存在路径!

public void obtainResource(URL resourceURL) throws IOException
是主要进行资源获取的方法,传入url就可以将资源下载到构造方法所传入的本地地址。

其实Apache的已经有一个HttpClient可以做到ReadHttpDocument的功能,不过想到只不过要取得一个link标签,还是尽量不要惊动太上老君,自己动手写了一个很简陋,但仍然满足要求的类来做到这件事。
根据html  document中的各种元素是否可以嵌套,这个类总共可以被调用的方法有两个,一个是上面已经讲到的,用来获取不可嵌套的元素,参数为一个属于不可嵌套的标签名作为匹配字符串。另一个用于获取可以嵌套的元素,我的这个方法并没有实现,想必需要用到堆栈,与本文所讨论的问题并没有很大关联,有时间再来完成。
其中最主要的方法如下:

/**
	 * 获得文档中所有类似的不可嵌套的标签对
	 *
	 * @param match
	 *            匹配模式
	 * @return 与匹配模式一致的标签对组
	 * @throws IOException
	 */
	public List getUnestedTags(String match) throws IOException {
		List list = new ArrayList();
		int beginIndex = -1, endIndex = -1;
		String obtainStr = null;

		while ((obtainStr = br.readLine()) != null || sb.length() &gt; 0) {
			if (obtainStr != null) {
				sb = sb.append(obtainStr);
			}
			if ((beginIndex = sb.indexOf(getStartTag(match))) != -1) {
				while ((endIndex = getUnestedEndTagIndex(sb, match)) == -1) {
					if ((obtainStr = br.readLine()) != null) {
						sb = sb.append(obtainStr);
					} else {// 到达文件尾
						return list;
					}
				}
				list.add(sb.substring(beginIndex, endIndex + 1));
				sb = sb.delete(0, endIndex + 1);
			} else {
				sb.setLength(0);
				continue;
			}
		}
		return list;
	}

测试:
我在测试类中的使用方法如下:

	try {
			DownloadTookit downloadTookit = new DownloadTookit(Proxy.NO_PROXY,
					"D:/favicon.ico");
			downloadTookit
					.obtainResource(downloadTookit
							.getFaviconURL(new URL(
									"http://www.sina.com.cn")));
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

有兴趣的同学可以下载src来看下。

现在博客的链接上就有了一点儿的装饰了

You know还在建设期,我在通过不断的改进,希望在这里能给大家带来一些更有用的文章。