解惑

解己之惑,解人之惑

2005年11月 (第1页共2页)

Google在中国中国化?

今天偶然之间发现google的广告打破了不在搜索结果的上方出现广告的惯例,和百度的结果有些类似了。
抓图如下:

Red Hat9下解决无法画图的问题

已经有几个人问我这个问题了。
整理下写下来了。
对于以控制台方式启动的Red
Hat9服务器而言,需要启动一个虚拟的图形环境,安装的软件包就是XFree86-Xvfb-4.3.0-2.i386.rpm,在配置前先用rpm
-q XFree86-Xvfb查一下有没有安装,没有的话就要安装了,有可能这个包依赖的很多包都没有装,一下是个大致的列表,可能都要安装:
desktop-file-utils-0.3-5.i386.rpm    
XFree86-base-fonts-4.3.0-2.i386.rpm
Glide3-20010520-25.i386.rpm          
XFree86-xauth-4.3.0-2.i386.rpm
switchdesk-3.9.8-15.i386.rpm         
XFree86-Xvfb-4.3.0-2.i386.rpm
XFree86-4.3.0-2.i386.rpm             
xinitrc-3.32-1.noarch.rpm
XFree86-75dpi-fonts-4.3.0-2.i386.rpm

可以以rpm -ivh *.rpm把这几个一起装

完成后修改下/etc/rc文件,在最后加下面一行:
Xvfb :1 -screen 0 1280x1024x8 &

然后修改tomcat的启动脚本,要给JAVA加-Djava.awt.headless=true

从一个搜索看Google中文分词的问题

今天看到到我的BLOG的一个google查询是“易经在生活中的作用”,查看了一下,查询的第一条结果就是我的blog中的一篇文章,很奇怪,感觉查找易经相关的内容应该不会查找到我的这篇blog,特别是不能是这样的查询的第一条。后来自己试了下查询“易经 在生活中的作用”,这样查询的结果还比较正常了,起码和易经这个主题是搭边了。由此可见google的中文分词做得还不是很完善,像易经这样的中文词应该是在词库中的,试了下百度,百度的结果比google的要好一些。

Mysql5的编码问题

现在在用新的Mysql5,发现和原来的不太一样,这次我们使用的是UTF-8编码,配置好了编码转换的过滤器,页面的编码设置也正确,驱动也应该没有问
题,完全相同的配置,使用mysql4.0就没有问题,后来大致查了一下资料,发现mysql4.1以后的变化很大,数据库,表,字段都可以设置编码,修
改了一下缺省的编码,但是没有其效果。后来因为要增加一个表,就用mysqlfront直接加了一个,在创建表的时候要选择字符集,就选择了utf-8,
结果这个表中存放的中文没有问题,可以正常读写,然后把其它的表使用属性进行了修改,结果问题依旧,仔细一看原来是字段的编码还是latin1,后来修改
了建库脚本,全部的表都使用utf-8编码,字段不设置编码方式,问题解决。

使用commons-email发送邮件

项目要发送邮件,本来是想找原来的发送邮件的代码拿过来用的,突然记起来commons项目增加了一个commons-email发送邮件,决定用现成的,看了一下,果然很方便,直接贴出网站上的发送HTML邮件的例子:

// Create the email message
HtmlEmail email = new HtmlEmail();
email.setHostName("mail.myserver.com");
email.addTo("jdoe-AT-somewhere-DOT-org", "John Doe");
email.setFrom("me-AT-apache-DOT-org", "Me");
email.setSubject("Test email with inline image");

// embed the image and get the content id
URL url = new URL("http://www.apache.org/images/asf_logo_wide.gif");
String cid = email.embed(url, "Apache logo");

// set the html message
email.setHtmlMsg("<html>The apache logo - <img src=\"cid:"+cid+"\"></html>");

// set the alternative message
email.setTextMsg("Your email client does not support HTML messages");

// send the email
email.send();

不需要解释了。发送邮件的时候还可以嵌图片,呵呵,喜欢。
这个例子里面没有涉及的有两个常用的方面:
登录验证和邮件的编码格式,其实也很简单,验证调用一下

email.setAuthentication("me", "password");
对于中文邮件,设置下编码就行了:
email.Charset("utf-8");或者
email.Charset("utf8");

感受到JDK5的自动装箱和拆箱的便利

虽然JDK5推出很长时间了,但是实际上一直没有开始用,最多也就是了解了下新的特性,感觉也没有什么太吸引我的,这段时间做个项目,用的就是JDK5,
昨天在用的时候把一个字段的类型从long型修改为了Long型,奇怪的是eclipse没有像通常那样报错,后来想想原来是用的JDK5,现在有自动装
箱和拆箱的功能了,确实省了一些事。但是最后为了兼容性还是将类型修改一致了。

Hibernate和Spring配合使用的一个问题

最近的一个项目使用Hibernate3和Spring,DAO都是继承自
org.springframework.orm.hibernate3.support.HibernateDaoSupport,提供了一个
BaseDAO,提供了常用的get,getAll,insert,delete以及update方法,其它的DAO都不用关心这些操作了,但是在使用的
时候有一个问题,就是有时候会出现Illegal attempt to associate a collection with two open sessions的异常,但是在取得对象后使用session.close()也不行,会出现另外的一个异常session is not open or is closed,后来上网查了以下,原来是我的update方法有问题,原来就是getHibernateTemplate().update(object),修改为getHibernateTemplate().merge(object)问题解决。

2005.11.23更新:
按照API文档:
merge(Object entity)

          Copy the state of the given object onto the persistent object
with the same identifier.

update(Object entity)

          Update the given persistent instance,
associating it with the current Hibernate Session.
问题的根源可能在于要更新的那个对象是有一个关联集合的。

Random类的一个使用误区

昨天和一个朋友聊天谈到他的面试经历,其中提到一个题目是用最熟悉的语言写一个程序产生15个10到100的整数,他特别提到他用Java写了一些循环并每次重新用
当前时间的long值做种子,当时我就很奇怪,但是他说Random有问题,每次产生的随机数都是一样的。回想了一下,他可能是遇到了我曾经遇到的那个问
题,在使用Random的时候要把产生的Ramdom实例保存起来,不能每次用的时候都重新new一个。具体代码如下:
范例代码如下:
public class RandomTest {
  private static Random random = new Random();

  public static void main(String[] args) {
    for (int i = 0; i < 15; i++) {
      System.out.println((random.nextInt(90) + 10));
    }
  }

}

典型的误用代码如下:
public class RandomTest {
  public static void main(String[] args) {
    for (int i = 0; i < 15; i++) {
      Random random = new Random();
      System.out.println((random.nextInt(90) + 10));
    }
  }

}

2005.11.18更新:
对于这个里面的误用代码JDK1.5确实修正了,但是修正的方法是修改了new Random(),1.5以前实际上是

public Random()
Creates a new random number generator. Its seed is initialized to a value
based on the current time:

 public Random() { this(System.currentTimeMillis()); }

Two
Random objects created within the same millisecond will have the same sequence
of random numbers.

而在1.5中是:

public Random()
Creates a new random number generator. This constructor sets the seed
of the random number generator to a value very likely to be distinct
from any other invocation of this constructor.

所以实际上1.5中并没有彻底解决这个问题,根据同样是他的文档:
If two
instances of Random are created with the same seed, and the same
sequence of method calls is made for each, they will generate and
return identical sequences of numbers.
那么典型的误用代码就变成了:
public class RandomTest {
  public static void main(String[] args) {
    for (int i = 0; i < 15; i++) {
      Random random = new Random(100000);
      System.out.println((random.nextInt(90) + 10));
    }
  }

}

扩展已有框架或者组件完成快速开发框架

个人感觉现在的各种java框架和组件已经非常的丰富,但是将他们融合起来进行快速开发还有一个问题:
配置过于麻烦。
无论是spring还是hibernate,都需要很多的配置,当然hibernate有工具可以生成,但是似乎没有太大的必要。前几天在和朋友谈这些框
架的时候他们对我的思路提出了置疑,并且认为我想做的其实和spring和hibernate的功能并没有大的差别,既然你感觉配置麻烦,那么你干脆研究
下,做一个扩展或者插件来使用你想像中的规则不是更好。一句话给了我很大的启示,这个应该是一个不错的方向。

另外一个不能让我满意的就是表现层,虽然有了JSF,但是没有强大的工具支持开发JSF并不容易,而tapestry由于学习曲线比较陡而无法普及,而且
在我看来也是有些麻烦的,而struts或者是webwork肯定是不能满足我的期望的。类似velocity或者freemarker这样的模板语言到
是可以好好的研究下,也进行一下扩展,应该和javabean可以直接绑定。

Textarea的一些问题

今天发现Textarea的一些细节的问题,如果在里面输入html标签是可以的,但是如果输入的是&nbsp;或者是;&quot;,
那么如果不进行处理,回来显示的时候就显示为空格和”了,不再是&nbsp;和;&quot;,但是如果输入<b>
test</b>这样的HTML标签则没有问题。
另外就是如果输入的时候前面或者后面输入几个换行,那么提交以后这些换行就被丢掉了。

更早的文章

© 2025 解惑

本主题由Anders Noren提供向上 ↑