Archive for the ‘Programming’ Category

org.apache.commons.lang.StringUtils 字符串处理
Saturday, June 28th, 2008

许多开发人员在做项目时都习惯把一些实用方法做成通用的静态方法,放在一起使用,例如对字符串的处理。有些实际编码中十分常用的方法却没有在Java的String类中提供。实际上Apache的commons子项目的lang包就是帮我们解决这个问题的,比如org.apache.commons.lang.StringUtils这个字符串处理的类。

在发现它之前我自己已经有了一个StringUtil类,而粗略看了几眼它的文档,我的所有方法都在org.apache.commons.lang.StringUtils类中都有,并且考虑得更加周全。

例如split方法,在Java中,用逗号分隔一个字符串”a,,b,c,”,结果是一个长度为5的数组:

["a", "", "b", "c", ""]

而大部分情况下,那些空字符串是不想要的,于是在循环中我们就需要一一判断字符串是不是空的。StringUtils.split方法就帮我们按照这种思路来分割字符串。

许多开发人员抱怨Java没有提供一个join方法,StringUtils.join解决了这个问题。

你怎么判断用户的输入是不是空?如果做完整的验证,应该是:

if (input != null && input.trim().length > 0) {…}

StringUtils.isBlank方法为我们做这样的判断,它会正确处理null和全部空格的情况。

StringUtils类还有许多其它的实用方法,可以适应我们日常编程中的大部分字符串处理。另外commons-lang还提供了一个StringEscapeUtils类,可以帮助你防止SQL injection,在HTML中正常输出用户输入的尖括号等。

虽然我没有仔细看过源代码,不过作为通用的方法,commons-lang对性能的考虑应该比较周到,这一点可以放心。

J2EE vs. ASP.NET
Saturday, May 17th, 2008

Perhaps the worst thing Sun has done in the history of the J2EE is produce the Java Pet Store and advance it as an example of best practices for J2EE. The Pet Store is bloated, inefficient and has given Microsoft a perfect target to attack J2EE.

Rod Johnson是这样说的。

文中接下来就是讲他对.NET(主要是ASP.NET)的看法,相信大多数程序员都会认可。其中包括MS“跨语言”的天才构想。他也认为束缚在MS的平台上是个大问题。

C#也好,ASP.NET也好,很大程度上都是把JAVA的那一套弄过来,改几个名字,更换或强加几个概念。然后通过Windows的广大盗版市场推广出去,得到××电脑学校及其学员的追捧,成为炙手可热的主流技术。当然了,C#/ASP.NET还是有些创新或优点的,使用它们的程序员也有一部分很优秀(圣人也有错嘛)。

JavaScript
Wednesday, December 26th, 2007

“用”了这么久的JavaScript,却始终对这个语言有一种很陌生的感觉。Prototypescript.aculo.us一直在用,可是它们的源代码,说实在的,我看不大懂。JavaScript非常灵活,也使得它比较难以掌握。另外由于各种浏览器实现之间的差异,使得它显得更加混乱,所以在最开始接触JavaScript的时候,我就困惑,在哪里找到一个比较权威的reference呢?

如今JavaScript的代码写了应该有上万行了,不过大部分都是借助于Prototype和script.aculo.us以及其它的一些library,而且我自己感觉,事情是做成了,代码还有很大的提升空间。以后准备抽出一定时间来,把JavaScript的基础补一下,争取在面对任何JavaScript代码的时候,都像C++、Java一样,知其然,且知其所以然。比如:this到底指的是什么?

从哪里开始?当然是MDC.

如何判断Firebug的存在?
Sunday, November 11th, 2007

前几天Gmail更新,会判断你是否启用了Firebug,如果启用则警告“Firebug会使Gmail变慢”。有人在网上问是怎么判断安装了Firebug的?

我看了一下Gmail的JS代码,似乎是这么一个判断语句:

Boolean(window.console && window.console.firebug)

如果你安装了Firebug并启用,那么这条语句的结果是布尔值”true”. window.console是Firebug给window对象扩展的一个Object属性。打开Firebug,在Console中输入”window.console”并回车,则会显示:Object firebug=1.05

而window.console.firebug是Firebug的版本号。大家可以自己在Firebug里试一下,或者自己写一个测试页面。

Prototype 1.6, script.aculo.us 1.8
Thursday, November 8th, 2007

今天打开Google Reader,发现prototypescript.aculo.us的blog各有一条更新,同时告诉大家:Prototype 1.6.0 & script.aculo.us 1.8.0都是final了!

对于Prototype,我比较期待它的DOM Builder。而对于script.aculo.us,以前曾经试过用它的InplaceEditor,然而它的设计是在是不怎么样,尤其是你想处理服务器端返回的数据后再显示(或者报错,取消)的话。在1.8.0里,说是完全重写了这个InplaceEditor,希望会有较大改进。

另外似乎script.aculo.us的1.x系列到此就feature freeze了,让我们期待2.0吧!

不多说了,赶紧去升级一下,看有没有什么问题需要解决的。

我们都很菜
Tuesday, September 25th, 2007

昨天在修改以前同事写的JavaScript代码时,看到里面有这样的写法:
location.load(’/foo…’)
以此跳转到新的页面。

当时心想,哟,看别人代码就是有收获,又学到新东西了。于是修改的过程中,我也尝试用这种办法,一方面我可以copy原来的代码,另一方面,这种办法比起window.location.href = ‘/foo…’的写法要好看一些嘛……然而代码跑起来的时候却发现,location对象根本没有这个方法。原来,这位同事是看到location有reload(查一下标准)这个方法来重新载入当前页,就认为载入一个新页面应该有个方法为load,以一个字符串为参数。

记下这件事,并没有丝毫冷嘲热讽的意思。从程序语言设计的角度来说,这种思想是很合理的:为location对象的href属性赋值,应该只引起该对象属性的变化,而不是引发一个动作;而要想使浏览器加载新的页面,应该由一个方法来完成。然而,不论怎么合理,都不能想当然地这样写代码,这已经超出了写代码的范畴了,这是在设计语言。我也不应该看到这样的代码就想当然地认为有这样的方法,至少,google一下就知道它不存在了,万幸的是这个错误被及时地发现了。

还有一件事,在看到有人用system.out.println方法debug代码时,我经常会指出,除非万不得已,尽可能用IDE的Watch之类的功能,打印的函数很有可能被遗忘在代码中而不被删除。我是个比较自以为是的人,也很理解对方不以为然地说,没关系,完了都会删除的。我很不放心地走开,然而事后经常证明我的担心是对的,检查代码时,还可以看见许多的println debugger完好地留在代码中。

总之,虚心是很重要的一个品德,如果实在以下问为耻,可以Google啊,baidu啊。看到这些事情,在为别人惋惜的同时,我也把它们当作镜子,反观自己身上是不是有同样的缺点。对别人宽容,对自己严格,又是更难做到的一件事情。

推荐CSSVista
Thursday, August 23rd, 2007

CSSVista是一个免费软件,用它编辑CSS或inline style时,可以即时地看到在IE和Firefox中的实际效果:

CSSVista

安装它首先需要安装 .NET Framework,但是这是值得的。经常一些时候你在一种浏览器里面调试界面,终于好了,然而拿到另一种浏览器中,啊,一团糟!如果用CSSVista来编辑CSS,哪个改动引起了浏览器不同的render行为,你都可以及时地知道。

它还有一些handy的小功能如语法高亮、自动补全等,绝对值得一试。

CSSVista的主页不如一个开发者的blog文章详细。

在Flash中如何弹出链接
Saturday, July 28th, 2007

在AS2中,一般用getURL函数来打开链接:

getURL(”http://www.qingbo.org/”, “_blank”);

在AS3中,用navigateToURL函数:

navigateToURL(new URLRequest(”http://www.qingbo.org/”), “_blank”);

但它们都回被Firefox的ad blocker阻止并出现一个警告条(甚至是一个随机事件!)。我Google了好久,大部分都没有给出好的办法。

其实Google的第二条结果是blogspot的,因它被封我就懒得打开了。最后不得已用代理上去,发现解决办法就在那里,用ExternalInterface调用Javascript打开新窗口就可以了。简单的就是:

ExternalInterface.call(“window.open”, “http://www.qingbo.org/”, “_blank”, “”);

原文链接(链接加了代理,直接点击可访问):

http://skovalyov.blogspot.com/2007/01/how-to-prevent-pop-up-blocking-in.html