2008年6月1日星期日

列出 JVM/JRE 当前的所有系统属性

使用一行代码即可得知:


public static void main(String[] args) {
System.getProperties().list(System.out);
}


以下是我的输出:


-- listing properties --
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=/usr/lib/jvm/java-6-sun-1.6.0.06/jre/...
java.vm.version=10.0-b22
java.vm.vendor=Sun Microsystems Inc.
java.vendor.url=http://java.sun.com/
path.separator=:
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg=sun.io
user.country=CN
sun.java.launcher=SUN_STANDARD
sun.os.patch.level=unknown
java.vm.specification.name=Java Virtual Machine Specification
user.dir=/home/****/code/NetBeansProjects/Main
java.runtime.version=1.6.0_06-b02
java.awt.graphicsenv=sun.awt.X11GraphicsEnvironment
java.endorsed.dirs=/usr/lib/jvm/java-6-sun-1.6.0.06/jre/...
os.arch=amd64
java.io.tmpdir=/tmp
line.separator=

java.vm.specification.vendor=Sun Microsystems Inc.
os.name=Linux
sun.jnu.encoding=UTF-8
java.library.path=/usr/lib/jvm/java-6-sun-1.6.0.06/jre/...
java.specification.name=Java Platform API Specification
java.class.version=50.0
sun.management.compiler=HotSpot 64-Bit Server Compiler
os.version=2.6.24-17-generic
user.home=/home/****
user.timezone=
java.awt.printerjob=sun.print.PSPrinterJob
file.encoding=UTF-8
java.specification.version=1.6
user.name=****
java.class.path=/home/****/code/NetBeansProjects/Mai...
java.vm.specification.version=1.0
sun.arch.data.model=64
java.home=/usr/lib/jvm/java-6-sun-1.6.0.06/jre
java.specification.vendor=Sun Microsystems Inc.
user.language=zh
java.vm.info=mixed mode
java.version=1.6.0_06
java.ext.dirs=/usr/lib/jvm/java-6-sun-1.6.0.06/jre/...
sun.boot.class.path=/usr/lib/jvm/java-6-sun-1.6.0.06/jre/...
java.vendor=Sun Microsystems Inc.
file.separator=/
java.vendor.url.bug=http://java.sun.com/cgi-bin/bugreport...
sun.cpu.endian=little
sun.io.unicode.encoding=UnicodeLittle
sun.desktop=gnome
sun.cpu.isalist=



请注意,在此配置下,如果想读写日期格式:dd-MMM-YYYY (01-Jun-2008),
是会出错的,如果在不修改源码的情况下,需要修改系统属性:


java -Duser.language=en ...

2008年5月22日星期四

没有灾难和痛苦

如果可以平步星云......
那么可以,没有国界边疆,没有战争,没有不动产,没有灾难和痛苦,不再你的我的!

是啊,没有灾难和痛苦,对生命才是最重要的!

2008年5月17日星期六

因为爱, 奇迹正在赶过来!



因为爱
------
歌手:群星


因为船才到达彼岸
因为冷候鸟才飞向南
因为有瞬间阴霾阳光才更灿烂
因为寒冬春天才回暖
因为你眉头才放宽
因为我跌倒了有人搀
因为所有的付出总会得到偿还
因为我们笑着过难关
就因为爱希望绽放华彩
就因为爱能拨云见日未来永值得期待
就因为爱就因为爱
所有的生命才收获了圆满
就因为爱彼此无声依赖
就因为爱至少还有一个信念不会更改
就因为爱就因为爱
奇迹正在赶过来
因为天海才特别蓝
因为灯黑夜从不暗淡
因为同携手作伴不会感觉孤单
因为心疼才要更勇敢
因为你努力有何难
因为我将会为你承担
因为面对着风雨从不袖手旁观
因为我们共撑一把伞
就因为爱希望绽放华彩
就因为爱能拨云见日未来永值得期待
就因为爱就因为爱
所有的生命才收获了圆满
就因为爱彼此无声依赖
就因为爱至少还有一个信念不会更改
就因为爱就因为爱
奇迹正在赶过来

2008年5月13日星期二

伸出援助之手给困难的灾区人民



一方有难八方支援 四川省地震救灾捐款方式

中国红十字会总会救灾专用账号和热线
网址:http://www.redcross.org.cn

  开户单位:中国红十字会总会

  人民币开户行:中国工商银行北京分行东四南支行

  人民币账号:0200001009014413252

  外币开户行:中信银行酒仙桥支行

  外币账号:7112111482600000209

  热线电话:(8610)65139999

  捐款有如下几种途径:

  银行汇款:账号见上文

  邮局汇款:

  地址:北京市东城区北新桥三条8号

  邮编:100007

  (通过银行、邮局和网上捐款在捐款时请注明捐款人姓名、通信地址、捐款意向如:四川地震捐款等信息,以便邮寄捐赠收据和感谢信)

  通过短信捐款:中国移动、中国联通手机用户以及中国电信、中国网通小灵通用户均可编辑短信1或2,发送至1069999301,即向“红十字救援行动”捐款1元钱或2元钱。

  

  通过短信咨询:中国移动、中国联通手机用户以及中国电信、中国网通小灵通用户均可编辑短信“中国红十字会”,发送至12114,即可了解中国红十字会有关情况。

  中国红十字基金会同时也接受社会各界捐赠:

  地址: 北京市东城区东单北大街干面胡同53号

  邮编:100010

  银行汇款:

  户名: 中国红十字基金会

  开户银行: 中国银行北京分行

  账号: 800100921908091001

  开户银行:中国工商银行北京东四南支行

  账号:0200001019014483874

  开户银行:中国建设银行北京朝内大街支行

  账号:11001070300059000427

  外币开户银行:中国银行

  账号: 800100086608091014

  捐款热线电话: 010-65124154 010-65129947 010-65599176

2008年4月30日星期三

最远的你是我最近的爱

演唱:车继铃

夜已沉默心事向谁说
不肯回头所有的爱都错过
别笑我懦弱我始终不能猜透
为何人生淡漠
风雨之后无所谓拥有
萍水相逢你却给我那么多
你挡住寒冬温暖只保留给我
风霜寂寞凋落在你怀中
人生风景在游走
每当孤独我回首
你的爱总在不远地方等着我
岁月如流在穿梭
喜怒哀乐我深锁
只因有你在天涯尽头等着我

2008年3月6日星期四

Hibernate 3.2 移植: SQL函数返回类型改变

In alignment with the JPA specification the count, sum and avg function now defaults to return types as specified by the specification. This can result in ClassCastException at runtime if you used aggregation in HQL queries.

Actually the spec says

The Java type that is contained in the result of a query using an aggregate function is as follows[33]:
COUNT returns Long.
MAX, MIN return the type of the state-field to which they are applied.
AVG returns Double.
SUM returns Long when applied to state-fields of integral types (other than BigInteger); Double
when applied to state-fields of floating point types; BigInteger when applied to state-fields
of type BigInteger; and BigDecimal when applied to state-fields of type BigDecimal.

http://www.hibernate.org/250.html#A44
http://opensource.atlassian.com/projects/hibernate/browse/HHH-1538

2008年2月3日星期日

伸出援助之手给困难的灾区人民



一方有难,八方支援。 抗击冰雪捐款方式。

中华慈善总会

筹募部电话:

电 话:(010)66055848、
传 真:(010)66083264
联系人:苏辉 王玲


接受捐款账号及地址如下:

银行汇款:
人民币捐款帐户
开户单位:中华慈善总会
帐号:0200002809014450409
开 户 行:中国工商银行北京西四支行
外币捐款帐户
开户单位:中华慈善总会
帐号:00100914908091014
开户行:中国银行总行营业部[北京市复兴门内大街1号]

邮局汇款:
中华慈善总会地址:
北京市西城区二龙路甲33号新龙大厦
邮编:100032

网上募捐:
中华慈善网网上募捐地址

短信捐助:
编辑MJ 到10660085(仅限联通用户 2 元/次)

2008年2月2日星期六

Closures in Java 7: YES vs. NO

Java 前辈(James Gosling, Joshua Bloch, Neal Gafter, ...)们现在正在热论“闭包”这一主题:

http://blogs.sun.com/jag/entry/closures
http://java.dzone.com/news/james-brings-closure-debate

我个人的观点是 "NO", 因为这将使 JSL (Java 语言规范)逼近1000页, 并且,
到现在我仍然在这一恐惧中:我用来学习 Java 5 Generic 的时间比曾经用来学习 Java 语言时间还长,可是让我现在设计出一个使用 “泛型”的框架,我心中没底。

2007年12月5日星期三

约定

王菲

还记得当天旅馆的门牌
还留住笑著离开的神态
当天整个城市那样轻快
沿路一起走半哩长街
还记得街灯照出一脸黄
还燃亮那份微温的便档
剪影的你轮廓太好看
凝住眼泪才敢细看
忘掉天地彷佛也想不起自己
仍未忘相约看漫天黄叶远飞
就算会与你分离凄绝的戏
要决心忘记我便记不起
明日天地只恐怕认不出自己
仍未忘跟你约定假如没有死
就算你壮阔胸膛不敌天气
两鬓斑白都可认得你
还记得当天吉他的和弦
还明白每段旋律的伏线
当天街角流过你声线
沿路旅程如歌褪变
就算你壮阔胸膛不敌天气
两鬓斑白都可认得你

2007年9月18日星期二

NetBeans 6.0 beta1 终于出来了!

经过“漫长”的等待,beta1 终于出来了!其实我一直在用它的最近的 daily build, 因为 M10 实在是太不稳定了。
beta1 给人的第一印象是,更换了主题(桌面 icon, welcome 页,向导图案),使用的是接近于 Vista 类似的蓝绿色调,给人以清新的感觉!
加紧试用吧!



2007年8月25日星期六

SUN 将股票代码 SUNW 换为 JAVA

作为SUN公司战略计划的一部分,其将老的股票代码SUNW退修,而取而代之 JAVA,
作为JAVA开发者,我们在高兴之余,你还想详细了解其 "java everywhere" 战略计划吗?
请看SUN总裁的BLOG(对,为数不多的CEO会写博客,Jonathan Schwartz 就是其中的一位,
而且他还留着马尾辫子。个性与成功并不矛盾!)

http://blogs.sun.com/jonathan/entry/java_is_everywhere

2007年8月15日星期三

Hibernate Jpetstore 之五 部署

文档内容
  • 概览
  • 获得工程代码
  • 配置
    • 数据库初始化
      • MySQL 5.x
      • Oracle 9i, 10g, HsqlDB, Postgres 及其它
    • 应用服务器初始化
      • 本地数据源(非JNDI 数据源)
        • Tomcat 5.x,
        • Sun Application Server8.x, 9.x / GlassFish 1.x, 2.x
        • Jetty 6.1.3
      • JNDI 数据源
        • Sun Application Server8.x, 9.x / GlassFish 1.x, 2.x
        • JBoss 4.0.4 +
        • Jetty 6.1.3
  • 部署并运行
  • 总结
PS: 为什么这个系列的最后一篇这么长时间才出来?原因是,我跟大家说过,工程的所有源代码最终将发布。所以我要找一个合适的地方上载。
这个过程还是比较烦的,况且老外们的工作效率普通不如我们,每次交流至少等上一周左右才有回应。试想申请、审批,确认,上载等过程,其实令我这个急性子试 图想把自己家里的电脑搬到主机托管中心,申请一个域名了事!

还好,它终于出来了 (hjpetstore)!但愿没让你失望。

在阅读本篇文章之前,请先仔细阅读前面系列的相关内容。

概览

对于传统的J2EE 项目,当项目开发完后,其工作并未结束,紧接着的部署过程其实是很令开发者头痛的,特别是象重量级的应用服务 WebLogic, WebSphere 等。还好 NetBeans 现在抬简化了这一过程。
我们这个例子是基于无存在数据库的方案,所以在我们演示结果前,我们将要导入一些数据。但首先我们得创建相应的数据库用户和数据库方案(Schema).

获得工程代码

1.从 hjpetstore 得到工程源代码,具体的步骤网站上有说明,在 NetBeans 中就很简单了:

CVS | checkout:
cvs root: :pserver:username@cvs.dev.java.net:/cvs (这个 username 是你必须到 java.net 上注册的用户名称,目前 anonymous 好象不能工作了)
password:

下一页中, module: hjpetstore 下载完后,NetBeans 会问你是否打开该工程,选择是。

2. 你可能需要调整一下lib 的位置,这是 NetBeans 的一个缺陷,保存的路径不是相对路径。
右击工程 | properties
点 Libraries,在Compile 页中将所有 .jar 文件 选中后 'remove',
再加入下载下来的WEB-INF/lib 目录下的所有 jar 文件

3. 确保 Clean And Build project 成功


配置

数据库初始化

我这里只介绍 MySql 的 配置,其它的数据库配置列作 TBD. (待做,其实大部分脚本已经在工程中了,等待你的加入吧!因为我不是一个数据库专家,也没有太多时间去研究这个。)我成功配置过oracle 和 hsqldb.

注 意:因为下面的脚本会删除 'hjpetstore'数据库用户及其所有资源,请确保用户 'hjpetstore' (oracle) 或数据库 hjpetstore (mysql) 目前没被使用,如果使用了,请修改数据库脚本。所以最好的办法是使用你的个人数据库来作演示。

MySQL 5.x


1. 创建用户hjpetstore 和 数据库 hjpetstore

# 在命令行下以 root 身份运行创建脚本
# $hjpetstore 是用真实的工程路径代替
# 其它值根据你的设置作相应的改变,比如你如果连非本机的数据库,那 'localhost' 就是那个机器在 ip 了
> mysql -h localhost -u root -p < $hjpetstore\conf\jpetstore_mysql.sql Enter password: ******** 如果程序的输出显示了 hjpetstore, 则表明成功了: Database information_schema
hjpetstore

mysql
...

或者,如果有mysql query browser 的话,用它直接运行如下命令也可:
-- frist drop database hjpetstore and user hjpetstore
drop database if exists hjpetstore;

create database hjpetstore;

-- create user hjpetstore and give the password hjpetstore
grant all privileges on hjpetstore.* to hjpetstore identified by 'hjpetstore';

show databases;

2. 得用 hibernate.hbm2ddl.auto 自动生成数据库方案
确保 web/WEB-INF/dataAccessContext-hibernate.xml 中 设置了 update

这个属性的具体含义,我在前面的系列中已经讲过了,在产品初始化,你就可以安全地把它注释掉。

3. 在 NetBeans 右击工程 Run project
这一步将所有的数据库表创建出来, 只是没有数据。

4. 加裁数据
使用 NetBeans Sql Editor
4.1 注册mysql 驱动
Runtime | DataBases 右击 -> new Driver
Add ... -> 导航到工程WEB-INF/lib/下的 mysql-connector-java-3.1.12-bin 点 OK

4.2 创建连接
右击刚注册的驱动 MySql (Connector/J driver) -> Connect using ....
Database URL: jdbc:mysql://localhost:3306/hjpetstore?useUnicode=true&characterEncoding=UTF-8
user name: hjpetstore
password: hjpetstore

点 Ok 后,在Databases 下应该会出现一个新的连接。

4.3 执行 SQL 脚本
1. 在 Files 窗口中导航到 db/mhsql/jpetstore-mysql-dataload.sql 并双击打开它
2. 在编辑器的工具条中 Connection: 选择 刚创建的数据库连接:jdbc:mysql://localhost:3306/hjpetstore?useUnicode=true&amp;amp;amp;amp;amp;amp;amp;amp;ampamp;characterEncoding=UTF-8
3. 点击编辑器工具条上,紧挨着下拉框的 run sql

确保没有显示错误信息。


Oracle 9i, 10g, HsqlDB, Postgres 及其它


数据库脚本都已经在工程中了,你所要做的就是利用这些数据库提供的工具创建一个用户 'hjpetstore',
之后的步骤与上述相同。


应用服务器初始化

本地数据源(非JNDI 数据源)


Tomcat 5.x,
事实上,工程默认是使用 Tomcat 服务器的,所以现在你根本不需要改动什么就可以运行工程了。
有关数据源的配置是在 web/META-INF/ context.xml 文件中

Sun Application Server8.x, 9.x / GlassFish 1.x, 2.x
同样的配置,只不过要生成一个 sun-web.xml 文件,
很好,NetBeans 会帮你自动产生,如下:
右击工程 -> Run | Server: 选择注册的Sun App Server (如果你还没注册 Sun App Server 的话,你需要先注册一下,具体步骤见相关文档)

此时,文件已经产生,右击工程 -> Run Project

Jetty 6.1.3
所有的配置文件已经在 WEB-INF 下了: jetty-web.xml, jetty-env.xml, 所以要做的只剩下将dist 上下生成的 hibernateJpetstore.war
放到 Jetty 的部署目录,还好这个目录跟 Tomcat 的目录同名叫 webapps

在 Jetty 目录下运行:
java -jar start.jar
然后在浏览器中请求: http://localhost:8080/hjpetstore/

JNDI 数据源


使用JNDI数据源当然是为了使用其 JTA(包容器管理的事务及其数据库连接池的实现),
只需要按正确的名称 jdbc/hjpetstore 在管理界面配好数据库连接池和相应的数据源,运行起来还是挺方便的,

Sun Application Server8.x, 9.x / GlassFish 1.x, 2.x
1. 首先按照这篇文章介绍的步骤正确配置 mysql 数据源连接池
(中文) http://pprun.blogspot.com/2007/05/glassfishsun-app-server.html
(English) http://enpprun.blogspot.com/2007/05/problem-in-setting-mysql-xa-datasource.html
注意,我文章中介绍的是使用root/root 作为用户名/密码,此时可以设置成hjpetstore/hjpetstore

2. 配置数据源
在应用服务器的 管理 界面 导航Resources | JDBC | JDBC Resources
点击右边主页面中的 new 后进入配置页面,填入:
JNDI Name: jdbc/hjpetstore
Pool Name: 选择前面配置的数据源:连接池:mysql
完成后点击 Ok


JBoss 4.0.4 +

1. 使用 JBoss 也许是冲着所谓的 #1 应用服务器而来的吧,但其配置有一些变化:
第一它实现了自己的一套日志方式,所以需要把 web.xml 中的

org.springframework.web.util.Log4jConfigListener

注释掉。

2. 它的数据源的配法也不相同,只需要将相应的数据库的配置文件(如:mysql-ds.xml ,内容见随后)放到
jboss-4.0.4.GA\server\default\deploy 目录下,
再在 jboss-4.0.4.GA\server\default\conf\login-config.xml 中加入:
    <application-policy name = "MySqlDbRealm">
<authentication>
<login-module code
= "org.jboss.resource.security.ConfiguredIdentityLoginModule" flag =
"required">
<module-option name ="principal">hjpetstore</module-option>
<module-option name ="userName">hjpetstore</module-option>
<module-option name ="password">hjpetstore</module-option>

<module-option name
="managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=hjpetstore-mysql</module-option>
</login-module>
</authentication>
</application-policy>
mysql-ds.xml 相应的内容如下:
    <?xml version="1.0" encoding="UTF-8"?>
<datasources>
<local-tx-datasource>

<jndi-name>hjpetstore-mysql</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/hjpetstore</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>hjpetstore</user-name>
<password>hjpetstore</password>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>

<!-- should only be used on drivers after 3.22.1 with "ping" support

<valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker</valid-connection-checker-class-name>
-->
<!-- sql to call when
connection is created

<new-connection-sql>some arbitrary sql</new-connection-sql>
-->
<!-- sql to call on an
existing pooled connection when it is obtained from pool -
MySQLValidConnectionChecker is preferred for newer drivers

<check-valid-connection-sql>some arbitrary
sql</check-valid-connection-sql>

-->

<!-- corresponding
type-mapping in the standardjbosscmp-jdbc.xml (optional for ejb) -->
<metadata>

<type-mapping>mySQL</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>


3. 还有,就是JBoss 的 JNDI 的名称有些怪:
    <bean id="dataSource"
class="org.springframework.jndi.JndiObjectFactoryBean">

<!-- JBoss
-->

<property name="jndiName" value="java:/hjpetstore-mysql">

<!-- other standard Java EE server

<property name="jndiName"
value="java:comp/env/jdbc/hjpetstore">
-->
</bean>


看到区别了吗?它只需要java:/hjpetstore-mysql


Jetty 6.1.3
目前,还未测试成功!


部署并运行


在 NetBeans 中,只需要在 工程属性中选定所要运行的 服务器后,点 Run Project 即可运行在本地数据源配置上。
此外,还可以按照服务指定的自动部署目录,将生成的 dist/hibernateJpetstore.war 文件放到该目录,
如果服务器已经运行,一切就 ok 了,如果没有,启动服务器即可。

如果要运行在 JNDI 配置上,则需要改一下 web.xml :

<!--
- Location of the XML file that defines the root
application context.
- Applied by ContextLoaderServlet.
-->
<context-param>

<param-name>contextConfigLocation</param-name>

<!-- local datasource -->
<param-value>
/WEB-INF/dataAccessContext-hibernate.xml
/WEB-INF/applicationContext.xml
</param-value>
<!-- jndi datasource and JTA (for a transactional
JNDI DataSource)

<param-value>

/WEB-INF/dataAccessContext-hibernate-jndi.xml
/WEB-INF/applicationContext.xml
</param-value>
-->
</context-param>

这几行配置说的应该很明白了,上面的是默认情况下的本地数据源,如果使用JNDI数据源,是这样了:

<context-param>


<param-name>contextConfigLocation</param-name>



<!-- jndi datasource and JTA (for a
transactional JNDI DataSource) -->

<param-value>


/WEB-INF/dataAccessContext-hibernate-jndi.xml
/WEB-INF/applicationContext.xml

</param-value>



</context-param>


只要按照上述的步骤配置好了应用服务器的数据源,现在运行的效果应该跟本地数据源是一样的。


总结


NetBeans 对于 Java EE 的开发是全面的,除了几个服务器还未集成进来之外,其它的功能已经走在了所有IDE的最前列,
但这也不防碍开发者使用这些未集成的服务器,因为大部分服务器都支持热部署,当NetBeans 给你的工程生成了 WAR 文件后,
剩下的就是“将它放入热部署目录”了。


看运行在 Jetty6.1.3 上的效果 (注意脚注部分显示,当前运行在什么服务器上):

2007年8月14日星期二

爱因斯坦精神

[转载]
听过一个故事:以前有个小孩,很喜欢拉小提琴,却又拉得不怎么样。连他的父母也觉得这孩子没什么天分,因为琴声真的好难听。于是他求教于一位教授,教授 说:“你为什么要拉小提琴呢?你觉得你快乐吗?”小孩子说:“我想成为一个伟大的小提琴家!我觉得我拉小提琴很快乐。”“那你就不用太刻意去学了”教授 说,你只要觉得快乐就好。小孩于是明白了,他以后都只是把拉小提琴当作是一种生活享受。后来,他在物理领域获得了很大成功,成了改变世界的一个伟人。此人 就是爱因斯坦!!
我觉得我们应该学习他:学会放弃,只要你从中获得快乐,那么你就不要计较是否要获得成功。学会坦然处之。

今年是狭义相对论发表100周年,也是联合国确定的世界物理年,主要纪念伟大的物理学家和社会活动家爱因斯坦对人类所作出的多方面的巨大贡献。爱因斯坦是全身心献身科学和主张科学无国界的理想主义者,是强调科学技术应当以人为本的人道主义者,是具有强烈社会责任感、反对法西斯和主持正义的社会活动家。在人类发展史上,爱因斯坦占有光辉的位置。我们纪念爱因斯坦这位伟人,不仅要了解他在科学上所作出的重要贡献,更要学习他在任何困难条件下都一心为科学而献身的精神,学习他为社会公正和反对法西斯战争而无私无畏的奋斗精神。我们还应当通过爱因斯坦成长的道路,分析产生这样杰出人物的条件,努力为中国青年创造良好的学习和成长的环境,使优秀人才能够脱颖而出,使中国科学能够早日跻身世界先进行列。

一、爱因斯坦对物理学的重要贡献


在20世纪初古典物理学出现危机的关键时刻,爱因斯坦是推动物理学革命思想的一面光辉旗帜。他独自发现了狭义相对论和广义相对论,从根本上改变了传统的绝对时空观念,将时空、物质和作用力通过对称性统一起来。从狭义相对论出发,他提出了质量和能量等价的公式,开辟了原子能的时代。从广义相对论和核能出发,他和一批科学家发展了宇宙构造和起源的模式,他提出的宇宙常数预示了产生排斥力的暗能量的存在。他和普兰克及玻尔一起是量子论的主要奠基人,他提出了集波动性和粒子性于一身的光量子学说,解释了光电效应,促进了量子波动力学的发现。他发展了原子论和统计力学,解释了从布朗运动、固体比热到受激辐射等一系列现象,和玻色合作,建立了玻色—爱因斯坦量子统计理论,预见了玻色凝聚态的存在。他质疑量子力学提出的量子纠缠态,开辟了量子信息学的新领域。他在晚年致力于统一场论,虽然没有取得他预期的结果,但他提出的从高维几何局域对称性出发进行统一相互作用力的思想至今仍指导着基本相互作用大统一理论的发展方向,在他逝世后的半个世纪中,已经在弱电和强相互作用的统一中得到体现。

他的科学思想远远超越当时的时代,具有非凡的前瞻性和深刻性,以至他许多重要的理论发表以后,短期内得不到物理界的普遍认同。他的科学发现不是天才的灵机一动,而是通过自学掌握了当时最前沿的科学成就,经过多年艰苦的思索才完成的。他在高中最后一年,就已经学习了当时大学还未讲授的电动力学理论,并对和光一起运动会产生什么现象进行了思考,10年以后才发现了狭义相对论。他在1909年开始认识到加速度和重力的等价关系,经过6年的努力和多次的失败,才建立了正确的广义相对论引力方程。

相对论和量子力学是20世纪最重要的科学发现,不仅为我们提供了从微观夸克到宏观宇宙的物质和运动的图像和规律,丰富了我们的物质观和宇宙观,而且为20 世纪技术的发展提供了科学的基础。虽然爱因斯坦从事的是基础研究,他并不知道这些研究有什么实用价值,但是,越是基本的规律,覆盖的现象越广泛,潜在应用的面越广,产生的价值也越大。在微电子、激光、原子能、GPS、传感器、加速器、信息保密等等广泛应用的技术中都可以看到爱因斯坦研究成果的影响。

二、爱因斯坦的人生观和社会活动


爱因斯坦对他自己的人生观曾经说道:“要追究一个人自己或是一切生物生存的意义或目的,从客观的观点看来,我总觉得是愚蠢可笑的。可是每个人都有一定的理想,这种理想决定着他的努力和判断的方向。就在这个意义上,我从来不把安逸和享乐看作是生活目的本身——这种伦理基础,我叫它猪栏的理想。照亮我的道路,并且不断地给我新的勇气去愉快地正视生活的理想,是善、美和真。要是没有志同道合者之间的亲切感情,要不是全神贯注于客观世界——那个在艺术和科学工作领域里永远达不到的对象,那么在我看来,生活就会是空虚的。人们所努力追求的庸俗的目标——财产、虚荣、奢侈的生活——我总觉得都是可鄙的。”“当我还是一个相当早熟的少年的时候,我就已经深切地意识到,大多数人终生无休止地追逐的那些希望和努力是毫无价值的。而且,我不久就发现了这种追逐的残酷,这在当年较之今天是更加精心地用伪善和漂亮的字句掩饰着的。每个人只是因为有个胃,就注定要参与这种追逐。而且,由于参与这种追逐,他的胃是有可能得到满足的;但是,一个有思想、有感情的人却不能由此而得到满足。”“我每天上百次地提醒自己,我的精神生活和物质生活都依靠别人(包括活着的人和死去的人)的劳动。我必须尽力以同样的分量来报答我领受了的和至今还在领受的东西,我强烈地向往着简朴的生活,并常常为发现自己占有了同胞过多的劳动而难以忍受。”

他不仅是这样说,也是这样做的。在他创造力最丰富的青年时代,他的生活非常艰苦,经历过歧视和失业,但他从不屈服去追求庸俗的目标,而是全神贯注于科学研究。即使到美国定居以后,他主动要求不要给他很高的薪水,继续过着俭朴的生活。

在他就职柏林科学院不久,第一次世界大战爆发,他从头开始就公开反对这场战争。他说过:“我反对一切形式的战争,除非那个敌人以毁灭人类作为它的唯一目的”。为此,他遭到了当局的迫害和部分报纸的谴责。德国的失败使德国科学家处于孤立的困难境地。爱因斯坦虽有瑞士国籍,被邀请参加国际物理会议和到其它国家就职,但他认为,科学是全人类共同的事业,不应该因政治原因而孤立德国科学家。在德国科学家不被邀请的情况下,他也拒绝出席会议和离开柏林去他地就职。他说:“我曾对普朗克许下诺言,在这里的环境没恶化到普朗克本人承认我的离开是自然而然的和正确的之前,我不离开柏林。如果我不是迫不得已,而是哪怕是部分地出自物质利益便离开我的政治期望正在那里实现的国家,离开用爱和友谊来温暖我的人们,而在开始堕落的时期我的离开对他们来说可能会加倍地难受……那我就是忘恩负义了。”很可惜,他的民主和社会主义的政治期望并未在战后德国实现,法西斯上台后把他视为犹太人的领袖,加大了迫害的手段,迫使他移居美国。此后,他一直以他个人的威望反对法西斯和关心弱小民族的命运。他对中国人民的苦难深表同情,多次支持中国抗日和中国人民争取民主权利的斗争。

爱因斯坦多次告诫科学家要履行自己的社会职责。他说:“任何技术的应用都必须以人为本,关怀人的命运。”“要关心如何安排人的劳动和分配财富,以保证科学的成果用于造福人类,而不是用于破坏的那些尚未解决的大问题。”他还说:“国家是为人而存在,而不是相反,科学也是一样。”

三、爱因斯坦的教育思想和成长历程


爱因斯坦不是一个通常意义下循规蹈矩的好学生,他厌恶那些不尊重学生主动性和独立人格的灌输式教育,他在中学和大学都不为老师所看重。他在自述中写到: “有时,人们把学校简单地看作是一种工具,靠它来把大量的知识传授给成长中的一代。但这种看法是不正确的。知识是死的;而学校却要为活人服务。它应当发展青年人中那些有益于公共福利的品质和才能。但这并不是意味着个性应当消灭,而个人只变成像一只蜜蜂或蚂蚁那样仅仅是社会的一种工具。因为一个由没有个人独创性和个人志愿的规格、统一的个人所组成的社会,将是一个没有发展可能的不幸的社会。相反地,学校的目标应当是培养有独立行动和独立思考的个人,不过他们要把为社会服务看作是自己人生的最高目的。”他还说:“自由行动和自我负责的教育,比起那种依赖训练、外界权威和追求名利的教育来,是多么的优越呀。真正的民主决不是虚幻的空想。”他从小就需要自由的时空和选择来安排自己的学习,他很少听课,利用同学的笔记对付强制的考试,他说:“尽管摆在我们面前的课程本身都是有意义的,可是我仍要花费很大的力气才能基本上学会这些东西。对于像我这样爱好沉思的人来说,大学教育并不总是有益的。无论多好的食物强迫吃下去,总有一天会把胃口和肚子搞坏的。纯真的好奇心的火花会渐渐地熄灭。幸运的是,对我来说,这种智力的低落在我学习年代的幸福结束之后只持续了一年。” “事实上,现代的教学方法还没有把神圣的求知欲完全扼杀掉,这差不多是一个奇迹;因为这株脆弱的幼苗,除了需要鼓励之外,首先需要自由——没有自由它将不可避免地会夭折”。

给一位教授的求情信这样写到:“亲爱的教授:请原谅一个父亲为了他儿子的事情来打搅您。……我的儿子目前失业,这使他深感难过。他越来越觉得,他的事业已经失败,再也无可挽回。而最使他沮丧的是,他感到自己是我们的负担,因为我们的景况不好……”这位教授是否给过帮助,现在已无从了解,但可以肯定大学的教授们从未认为爱因斯坦是个做学问的人才。

1902年,在同学格罗斯曼的父亲的帮助下,爱因斯坦获得了瑞士专利局职员的工作,才得以靠微薄的收入维持一家的生活,而在1905年发表的改变20世纪物理学面貌的5篇重要论文则是他业余时间的创作。爱因斯坦在专利局工作到1909年,才有大学聘请他为副教授。对这7年的生活,他回顾到:“在我最富于创造性活动的1902~1909年这几年中,我就不用为生活而操心了。即使完全不提这一点,明确规定技术专利权的工作,对我来说也是一种真正的幸福。它迫使你从事多方面的思考,它对物理的思索也有重大的激励作用。总之,对于我这样的人,一种实际工作的职业就是一种绝大的幸福。因为学院生活会把一个年轻人置于这样一种被动的地位:不得不去写大量科学论文——结果是趋于浅薄,这只有那些具有坚强意志的人才能顶得住。然而大多数实际工作却完全不是这样……作为一个平民,他的日常生活并不靠特殊的智慧。如果他对科学深感兴趣,他就可以在本职工作之外埋头研究他所爱好的问题。不必担心他的努力会毫无成果。”

四、留给我们的思考


爱因斯坦的一生多姿多彩,光辉伟大。他在艰苦条件下坚持献身科学的理想,他维护正义、反对法西斯和强调以人为本的社会责任感,他不唯上、不唯书、不迷信权威、不惧怕困难、不为世俗名利动心、不受传统制度和观点的束缚,独立自主,自由思考,刨根到底地追求科学真理。敢想敢干,敢于超越!

2007年8月10日星期五

Java 7 语言级的改动

到目前为止,Java7 已经有如下议案:

  • Language-level XML support (语言级的XML支持)

  • Closures (闭包,目前 Java 匿名类担任部分这一角色)

  • Block constructs (块结构)

  • Strings in switch statements (允许 String 作为 switch 语句的开关值)

  • Language support for BigDecimal (语言级支持 BigDecimal, 目的是减小 double 不够用的压力)

  • Java property support (语言级属性支持,目前我们熟悉了 getter/setter)

  • Lightweight method references (轻量级方法引用,目前如果不通过反射是无法完成对方法引用对象的传递)

  • Extensions to the annotation mechanisms (进一步扩充 annotation - 元数据机制)

  • Java Module System (模块系统,解决头疼的 CLASSPATH 问题)


其实我个人关心的是: reified generics (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5098163)
如果这个未实现的话,设计generics (泛型)类(注意,我没说使用泛型)仍然会是一种痛苦。

相信随着时间的推移,各种介绍会陆续出现,这些概念也慢慢会一目了然。

详细信息见 javac 作者的 blog:
Neal Gafter: http://gafter.blogspot.com/
Peter Ahé: http://blogs.sun.com/ahe/
因为 JDK 已经成为了 OpenJDK 了,所以以上两位作者事实上都已经离开了SUN,
开发 javac 的责任留给了 java 社团,也许你就是其中一位了!

2007年7月8日星期日

Open NetBeans 6 module project with NetBeans 5.x

要打开 NetBeans 6 的源代码工程,最方便的当然是使用配套的最新的开发版,但由于开发版或多或少会不稳定(特别是最近的M10)。所以还是要使用稳定的 release 版本来打开或者开发。
但是由于平台的兼容性问题,在尝试 NetBeans 5.5 来打开从 NetBeans CVS checkout 或下载下来的源代码模块工程时,同样也遇到了问题:在打开对话框中 Project Name 中会以红色显示:
java.io.IOException:
Misconfigured project in ... has no defined "code-name-base"


经过一番周折,我打到一个解决办法:

1. 在 NetBeans 5.x 中注册安装的 NetBeans 6.0 平台 Tools | NetBeans Platform Manager -> Add Platform... , 选择NB6 的安装目录
1.1 在 Harness TAB 中要确保选择第二项 "Harness supplied with Platform", 默认好象是第一项"Harness supplied with IDE" (如果工程使用新的平台中的一些API的话,第一项显然是不对的。) 
1.2 记住 "Platform Name" 的值,因为下面要用到,所以最好拷贝一下。


2. 修改要打开的NetBeans 模块工程的 $工程目录\nbproject\project.xml 文件
<data xmlns="http://www.netbeans.org/ns/nb-module-project/
这个值在 NetBeans 6 中为 <data xmlns="http://www.netbeans.org/ns/nb-module-project/

也就是将新版中使用的命名空间定义"3" 回退到 NetBeans 5.x 使用的 "2"

3. 在要打开的NetBeans 模块工程的 $工程目录\nbproject\ 的目录下,增加 platform.properties 文件, 其内容为:
nbplatform.active=NetBeans_IDE_6.0_M10_(build_200706281431)

即让它指向前面记下的 “Platform Name” 的值:


4. 现在打开试试! (你们也许还会遇到其它问题,因为我也记不清是否改了其它配置)

5. 最后,我还遇到一问题,右击工程 | properties
弹出一个对话框说"没找到定义的平台,回退到默认的平台", 我没办法,只有选择是,然后进入到工程属性中后:
Libraries -> NetBeans Platform 把它给改回来

6. build 试试!


好运!

2007年7月6日星期五

小心 Java SE 6 U2

Java SE 6 U2 修复了不少关键的BUG,正因为此,我也迫不急待地更新了。
但是,我发现文件选择对话框(JFilechooser)简直慢如蜗牛了。
请参见这里的讨论:javalobby !

由于个人习惯,在新版本到来后,就会把老版本删除掉。可这次,我简直太无奈了,
java.sun.com 竟然也找不到 U1 的下载链接了,而笔记本又没带回来!
我不得 Google 一番才在国内的下载网站找到了。

我使用的操作系统 WindowsXp.

小心,各位!

2007年7月2日星期一

Hibernate 处理大数据量的方案

问题:OutOfMemoryException


大家知道,Hibernate 有 一级 cache (Session 级) 和二级 cache (需另外配置,如 ehcache),
以下代码,Hibernate 在处理到大约50000条记录时,就会抛出 OutOfMemoryException, 这是因为,Hibernate 把所有新建的 MiniMessage 对象都放在了 Session 级的缓存中了。

Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSessionFactory().openSession();
tx = session.beginTransaction();
for(int i=0; i<300000; i++ ) {
System.out.println(i + ".................");
MiniMessage message = new MiniMessage("Hello World" + i);
session.save(message);

}

tx.commit();

} catch (HibernateException he) {
tx.rollback();
throw he;
} finally {
session.close();
}

解决办法:


使用"批处理”(Batch process)
Session session = null;

try {
session = HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();

for(int i=0; i<200000; i++ ) {
log.debug(i + ".................");

MiniMessage message = new MiniMessage("Hello World" + (i+1));
session.save(message);
if ( i % 100 == 0 ) {
//100, same as the JDBC batch size set in xml file:
// <property name="hibernate.jdbc.batch_size">100</property>
//flush a batch of inserts and release memory:
log.debug("fulsh at : " + i + ".................");

session.flush();
session.clear();
}
}


session.getTransaction().commit();
} catch (HibernateException he) {

session.getTransaction().rollback();

throw he;
}


在这种情况下,需要在hibernate.cfg.xml 配置几个参数来达到更好的效果:

1. 配置批处理的大小


 <property name="hibernate.jdbc.batch_size">100</property> 

2. 放弃二级缓存:



<!-- Disable the second-level cache because the
batch process is one-off process. -->

<property
name="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</property>


<property
name="hibernate.cache.use_second_level_cache">false</property>

<property
name="hibernate.cache.use_query_cache">false</property>

<property
name="hibernate.cache.use_minimal_puts">false</property>

这样,Hibernate 会在每 100 个插入后,与数据库同步一次,并将一级缓存中的实体对象清除。

2007年6月15日星期五

Blogsport 又被封了!

最近收到一些邮件说没法访问我的博客,
众所周知的原因,但我们大家还是可以绕个弯吧:

以下是摘自 GG 派的文章

可以同时采用两种方法双管齐下来规避封锁。

第一个方法是修改host文件:
首先把自己的或想访问的博客网址按规则添加进下面这个大家共同编辑的wiki页里:
http://groups.google.com/group/ggpi/web/hostwiki
然后用记事本打开C:\WINDOWS\system32\drivers\etc\hosts文件,然后把上面那个页面的内容全部复制进去即可


第二个方法:
首先打开Notepad(或者其他的编辑器),写入如下内容(是程序员都应该明白这个方法的意思):

function FindProxyForURL(url,host){
if(dnsDomainIs(host, ".blogspot.com")){
return "PROXY 72.14.219.190:80";
}
}

另存为proxy.pac到C盘的根目录下或者其它地方,然后对FireFox或IE7进行设置:
Firefox: 打开Firefox,依次点击工具->选项-> 高级->网络->设置...->选中自动代理配置url,在下面填写:
file:///C:/proxy.pac
再点:重新载入 ,然后一路确定下去就可以了。

IE7:打开IE7,依次点击工具->Internet选项->连接->局域网设置->选中使用自动配置脚本,在下面填写:
file:///C:/proxy.pac
再点确定,就可以了。这个方法的巧妙之处在于保证了所有blogspot的子域名可以没有限制的访问(内含 GFW关键字的除外)。问题在于这种方法似乎对某些IE浏览器支持不是很好,经常有问题。

Cheers!

2007年6月7日星期四

Java 安全拷贝协议 (JSCP: Java Secure Copy Protocol) NetBeans 插件

JSCP NetBeans 插件的作用


大家知道,SCP 广泛使用于SSH出现之前的 Unix 之类的平台上,它允许在 Client <-> Server 间进行双向的文件传输(ScpTo, ScpFrom)

JSCP NetBeans plugin 作为一个 TopComponet 插入到 NetBeans 的 Navigator 方位,通过 Tools | Java SCP 调用。

SCP 可进行文件双向传输的
  • 向支持 SCP 的 Unix/Linux 服务器上传文件(ScpTo)
  • 从支持SCP的 Unix/Linux 服务器获得文件(ScpFrom)

这两种工作模式是分别作为 JTabbedPane 的 两个 Tab 出现在 JScp 这个 TopComponent

JSCP NetBeans 插件的使用方法

从NetBeans PluginPortal 网站上获得一个压缩包,然后解压到一个目录供下面的步骤使用。

安装 .NBM 文件

  1. Tools | Update Center
  2. 选择 Install Manually Downloaded Modules (.nbm Files) 后,点击 Next
  3. 点击 Add... , 在 Select Directory or .nbm Files 对话框中,导航到此插件的两个 .nbm 文件(com-jcraft-jsch.nbm 和 org.pprun-jscp.nbm),同时选中它们后点击 Ok
  4. 点击 Next
  5. 点击 Next
  6. 点击 Next, 在View Certificates and Install Modules 界面点击 Include 列下面的多选框中打上勾。界面将出现版权及插件签名信息。(如果你希望使用计算机的所有用户都使用这个插件,可以将在 Global 列下打勾)
  7. Finish, 不出意外,将显示插件更新界面。
  8. 等到NetBeans 的状态条中显示 Turing on modules... done. 后,点击 Tools 菜单,此时将在菜单最底端看到 Java SCP 菜单项,如下:


使用说明

前提条件:

  • 保证网络可以访问到一台支持 SCP/ SSH1 的 Unix/Linux 服务器
  • 保证具有以上服务器上的一个帐户并且对其中的一个目录具有“写”权限(如果你只使用 ScpFrom 的话,此项可选)

ScpTo (文件上传)


(如果还没打开 JScp Window 的话)通过 Tools | Java SCP 打开,它会出现在左下角并停靠在 Navigator 所在的窗口中,如下图所示:

  1. LocalFile 上传的文件,通过右边的按钮来选择
  2. User@Host 用户名和主机名(或IP地址) 的组合
  3. Password 上述用户的密码
  4. RemoteDir 上传的文件在服务器上放置的目录


请注意在输入的过程中,会动态对输入域的值进行校验,如下,桔色的字显示没有指定服务器主机名(或IP地址):



如果所有的输入都合法的话,按钮 Scp 将可用,点击它将进行网络传输,进度条指示这一过程:



如果一切正常,最终进度条将停止指示。反之,如果后台操作出现错误的话,错误将显示:




ScpFrom (文件下载)


(如果还没打开 JScp Window 的话)通过 Tools | Java SCP 打开,它会出现在左下角并停靠在 Navigator 所在的窗口中,如下图所示:

  1. User@Host 用户名和主机名(或IP地址) 的组合
  2. Password 上述用户的密码
  3. RemoteFile 要下载的服务器上的文件
  4. LocalDir 下载的文件放置的目录,通过右边的按钮来选择




如果所有的输入都合法的话,按钮 Scp 将可用,点击它将进行网络传输。


总结


自从 NetBeans 5.0 开始,编写基于 NetBeans 的插件或平台应用已经变得非常简单。对于新来者,最大的障碍无非是一些NetBeans专用的术语及早期遗留下来的几个不大好理解的概念。不过还好, NetBeans 自己在快速前进的同时并没有忘记为开发者提供便利。
NetBeans wiki 是各种信息的大轮盘
planetnetbeans 则是全世界NetBeans开发者的乐园。大家为了 NetBeans 开怀畅谈。
Geertjan's Weblog 不得不看

2007年6月1日星期五

试用GlassFish V2,赢取 52 吋液晶电视机



只要下载并试用 GlassFishSun Java System Application Server 9.1 Beta 2 ( Java EE 5 SDK Update 3 Preview 2 或 Java Application Platform SDK Update 3 Preview 2) 并将使用效果反馈给SUN(通过BLOG或直接提交表单),就有机会羸取上面的52英吋液晶电视机。 

详细情况见,规则见.