Feb 202006
 
    public class SentenceAnalyzer {
	private char[] interpunction = new char[] { '!', '…', '!', '?', ',', '@',
			'“', '”', '"', '\'', '《', '》', '{', '}', '(', ')', ';', ':', '>',
			'<', '~', '_', '.', '[', ']', '/', '-', ':' };
 
	public SentenceAnalyzer() {
		interpunctionSet = new HashSet<character>();
		for (char interpunctionChar : interpunction) {
			interpunctionSet.add(interpunctionChar);
		}
		interpunction = null;
	}
 
	private Set<character> interpunctionSet;
 
	public String analyze(String str) {
		int length = str.length();
		StringBuffer buffer = new StringBuffer(length);
		boolean last = false;
		for (int i = 0; i < length; i++) {
			char ch = str.charAt(i);
			if (interpunctionSet.contains(ch)) {
				continue;
			}
			boolean al = isAlphanumeric(ch);
			// 合并连续的英文和数字
			if ((!al) || (!last)) {
				buffer.append(' ');
			}
			if (ch != ' ') {
				buffer.append(ch);
			}
 
			last = al;
		}
		return buffer.toString();
	}
 
	public boolean isAlphanumeric(char ch) {
		return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')
				|| (ch >= '0' && ch <= '9');
	}
 
	public static void main(String[] args) {
		SentenceAnalyzer analyzer = new SentenceAnalyzer();
		System.out.println(analyzer.analyze("姻缘天注定;-)你对你的另一半有何看法;-)"));
	}
    }
Dec 122005
 

public class AntiRefreshFilter implements Filter {
private static String KEY = “anti_refresh_lock”;
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpSession session = request.getSession(false);
if (session != null) {
Boolean locking = (Boolean) session.getAttribute(KEY);
if (locking != null && locking) {
return;
}
}

try {
request.getSession(true).setAttribute(KEY, Boolean.TRUE);

chain.doFilter(req, res);
} finally {
HttpSession session2 = request.getSession(false);
if (session2 != null) {
session2.removeAttribute(KEY);
}
}
}

public void init(FilterConfig arg0) throws ServletException {}
public void destroy() {}
}

Dec 092005
 

先copy一段别人说的话

>阿北打算带着他的豆瓣回北京发展,这很容易,因为就连豆瓣的创业都是典型的Web 2.0模式的:低成本、轻量级、开放式、协作型。豆瓣需要风险投资吗?大概需要吧,但在可承受的经济负担之下,我倒认为阿北不应急于融资。VC急于扩张、做大、套现的想法,很可能毁了豆瓣最可贵的东西。抄袭豆瓣的模式很难吗?不难,但有几个抄袭者愿意保持住豆瓣的人文精神,不紧不慢地慢慢增长呢?在这个浮躁的市场上,我想没几个人愿意。浮躁的人可能会copy一个农贸市场的豆瓣,但绝对copy不出一个沙龙的豆瓣。这也是我为什么一直坚持使用Flickr,而不用任何国内的复制品的原因。Flickr胜在每一处微不足道的细节,而不完全是这种图片分享模式。

其实也是web 2.0的痛处

突然觉得有点像论坛
论坛也是很难盈利的
或者不打算?

我们公司的老板想套钱
我们公司太过于重量级
我们公司太多编辑
最终我们也是在做门户而已
我也没有打算在这里做web 2.0

6年后轰然上市的google的气魄
其实没有多少公司可以承受

你可以接受公司多久不赚钱吗?
或者应该问,你还能白养公司多久

ps,我不会说引文是谁的话,这会被人以为我是他的fans
再ps,豆瓣这个字眼我是提到了,人文的豆瓣我是欣赏的
商业化是迟早的事情,也希望一路走好

Dec 032005
 

我们这种实用者在苦苦生存
企业级就光明正大在研究重量级技术
懂soa比懂ror吃香多了。。。

小电子商务 就要自己考虑赚钱的门路

企业级的东西就可以到处骗钱

soa真的很像几年前的ejb
我没有贬低的意思

感觉就像几年前ejb走过的路再走一遍
我说情形

但是现在的m$也不是几年前的m$
我是说以前的m$更强
不是以前的m$比现在的m$强的意思

这两年,操作系统开始被弱化了
包括linux的广泛实用
还有google模式的出现
操作系统,对于企业应用不再是关键

windows server让你觉得任何事情都不受到控制,没有安全感
做项目的没有在公网接受过考验就不知道实际的差别
项目的卖给客户当然要考虑对方的管理能力
最后还是回到项目跟产品的区别上
或许我应该说互联网跟企业应用的区别

另外,最近两年兴起的一个重要的东西是微内核
包括eclipse、ioc、soa、linux、Geronimo等等
甚至包括web 2.0的概念,我觉得也算是一种微内核

内核负责调度,外围负责功能

鉴于我对soa了解不深,还是在我那句话删去soa
soa负责调度service的就是微内核,我就这么认为的

模块化 指外围的东西
我想说负责调度那个东西

以前经常的做法是一个做所有东西
现在渐渐出现的做法是一个调度,外围实现

Nov 112005
 

This release includes 70 improvements and fixes, with several new features including JCaptcha (human user detection) support, a web.xml to Acegi Security migration tool, Java 5 annotations, “switch user” style capabilities for web applications, and SiteMinder integration. Please visit http://opensource2.atlassian.com/projects/spring/secure/ReleaseNote.jspa?projectId=10040&styleName=Html&version=10251 for a detailed changelog. Upgrade instructions (from 0.8.x to 0.9.0) are included in the release ZIP file.

呵呵,曾经写过一小段annotation for acegi的代码
也给acegi官方网站收入External Web Articles

本来也打算写一个acegi系列向导
写了一篇就没了

过了四个月,acegi终于发布新版
不知道具体实现annotation的代码如何

其实已经很久没有接触acegi了
原来以为acegi是完美的解决方案
但后来发现也是有没有解决的部分
考虑到acegi引入大量的概念
就觉得使用acegi不太值,带来大量的复杂性

后来也没有做权限部分的东西
有网友发email来问我acegi的问题,我也没法回答,忘得七七八八了
甚至连Spring也没用了。。。

Nov 062005
 

最近在烦恼用什么IDE来编写Python
使用了n多IDE都不合心
包括spe、eric3、WingIDE、Komodo、Boa Constructor、PyDev、SciTE

看来是有点被eclipse的编辑环境宠坏了

最后竟然发疯了想用这个星球最好的编辑器Emacs
怎么也上不了手

而且对中文支持也不好,我已经用cvs 22版的了
el文件也不好找,没有集中的地方

后来还是换用这个星球第二好的编辑器VIM
也因为以前已经一直有使用vim的习惯
vim对中文和windows平台很重视,效果非常好

也有国人做了vim的文档翻译,继续学习也相当方便

vim的主页上也准备了一个地方收集各种扩展

加了几个python的扩展,感觉不错

暂时这样用先。。。慢慢来

Nov 042005
 

Symfony: an open-source PHP5 web framework like Rails/Django
django add i18n at cvs, release the first version soon?
django is something like ruby on rails at python
turbogears is also a user-friendly web framework seems more like appfuse at java(better than it!)
there’s a 20 Minute Wiki screencast at its homepage just like the movie at ruby on rails’ homepage
turbogears will release 1.0 soon
Castle, .net on rails?

plog change its name to lifetype
JavaSVN 1.0.0 : Pure Java Subversion Client Library
WebMacro 2.0, templating system, released
Changes in Ruby 1.9

PostgreSQL 8.1 Release
FreeBSD 6.0-Release

Oct 152005
 

我始终觉得,线上是线下的补充,而不是相反

所以我不会做论坛之类的东西,因为我不喜欢网交朋友

所以我也不会做Web 2.0的东西

我是想做一些系统,里面的人都是我所认识的人

网络应该是辅助,不是本体

Oct 012005
 

从http://svnbook.red-bean.com/nightly/en/svn.forcvs.convert.html和Http://subversion.tigris.org/project_links.html得知转换的若干程序,最后选择了**cvs2svn**
于是到http://cvs2svn.tigris.org/下载了cvs2svn,解开

准备cvs2svn需要的东西,到http://www.python.org下载了最新python
到http://www.cs.purdue.edu/homes/trinkle/RCS/下载rcs for win,解开放在cvs2svn目录下(后发现rcs不能用,改用cvs模式代替)
cvs模式,因为我们的cvs服务器用cvsnt,直接去cvsnt安装目录copy所有文件到cvs2svn目录
到http://unxutils.sourceforge.net/下载取得sort.exe,一同放在cvs2svn目录

运行python cvs2svn –dump-only –use-cvs –encoding=gb18030 d:\cvsroot

就会生成cvs2svn-dump
可以用svn load进subversion的repo
* –dump-only 使用dump file的模式,当然也可以用-s d:\svnroot直接生成svn repo(这需要svn for win的运行文件,放同一目录即可)
* –use-cvs 使用cvs模式代替rcs
* –encoding=gb18030 我想大部分国人都是这种编码

d:\cvsroot 我特别准备过的目录,由于我们的cvs server上不只一个项目,而且也不敢直接到服务器上弄,只需要将需要的项目的目录copy过来,并且在d:\cvsroot下建一个CVSROOT的目录骗cvs2svn即可

用cvs模式的确很慢,我们的项目一共有6k个commit,大概要花一个小时
rcs模式就直接报错了,官方也要提到会有若干兼容问题

由于使用的是cvsnt,中途会弹出cvs lock server,可以打开debug窗口看信息

附上我用的几个工具的版本:
* cvs2svn-1.3.0
* python-2.4.1
* CVSNT 2.5.01