显示标签为“NetBeans”的博文。显示所有博文
显示标签为“NetBeans”的博文。显示所有博文

2008年11月19日星期三

NetBeans 6.5 出来了!

Download NetBeans!
尽管这一版 6.5 一直在“鼓吹”给 PHP 的朋友听,
但是NetBeans team 还是没有忘本,有关JAVA IDE 的特征也不少:
NetBeans IDE 6.5 Release Client - New and Noteworthy
6.5 Release Information


下面这些是我个人比较喜欢的:
  • Automatic Compile on Save
  • Improved Eclipse project import and synchronization
  • Java Call Hierarchy
  • Analyze Javadoc
  • CamelCase code completion
  • Customize formatting settings per project
  • Enhanced support for Spring, Hibernate
  • New multi-threaded debugging with improved UI and work-flow

Have fun!

2008年11月16日星期日

JAVA 1.6.0_10 -Xmx

依次执行如下命令

C:\Documents and Settings\pprun>ver

Microsoft Windows XP [版本 5.1.2600]

C:\Documents and Settings\pprun>java -version
java version "1.6.0_10"
Java(TM) SE Runtime Environment (build 1.6.0_10-b33)
Java HotSpot(TM) Client VM (build 11.0-b15, mixed mode, sharing)


C:\Documents and Settings\pprun>java -Xmx2048m -version
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

2 G 内存,很新鲜吗?
我刚加了一条,才百多块。
然而,直到我试到 1446 这个可爱的幸运数字时,才成功:
C:\Documents and Settings\pprun>java -Xmx1447m -version
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

C:\Documents and Settings\pprun>java -Xmx1446m -version
java version "1.6.0_10"
Java(TM) SE Runtime Environment (build 1.6.0_10-b33)
Java HotSpot(TM) Client VM (build 11.0-b15, mixed mode)


我立即切换到 Ubunut8.04,进行了一下测试:

pprun@pprun-t61:~$ uname -r
2.6.24-21-generic
pprun@pprun-t61:~$ sudo lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 8.04.1
Release: 8.04
Codename: hardy

pprun@pprun-t61:~$ java -Xmx3072m -version
java version "1.6.0_10"
Java(TM) SE Runtime Environment (build 1.6.0_10-b33)
Java HotSpot(TM) Server VM (build 11.0-b15, mixed mode)

pprun@pprun-t61:~$ java -Xmx3722m -version
java version "1.6.0_10"
Java(TM) SE Runtime Environment (build 1.6.0_10-b33)
Java HotSpot(TM) Server VM (build 11.0-b15, mixed mode)

pprun@pprun-t61:~$ java -Xmx3723m -version
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

是不是 JAVA 也赞成 Windows XP 黑屏?
竟然不能够分配超过 1446m (1.446g) 内存堆!

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年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月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英吋液晶电视机。 

详细情况见,规则见.

2007年5月25日星期五

软件的脆弱:从二分法查找的BUG说开去

大概是在去年的七月份左右,我首先在 javalobby 上看到这篇。当时也无比震惊,因为JDK (1.5及之前的版本) 中 Arrays.binarySearch(int[] a, int key) 及 Collections.binarySearch(int[] a, int key) (其调用indexedBinarySearch) 存在一个在业界隐藏了几十年的BUG,而这两个方法的作者恰恰是两位高人实现:

* @author Josh Bloch
* @author Neal Gafter

我想在Java 领域呆的比较长的开发者应该会有所耳闻吧,Josh Bloch 被称之为 "Java 之母"(虽然他是一位男性),因为 java collection 框架,java.math, 泛型 及《Effective Java Programming Language Guide》都出自他之手;而 Neal Gafter 则是 我们每天都用的JAVA编译器 Javac 的实现者。


我们先看有问题的代码:

public static int binarySearch(int[] a, int key) {
int low = 0;
int high = a.length-1;

while (low <= high) {
int mid = (low + high) >> 1;
int midVal = a[mid];

if (midVal < low =" mid"> key)
high = mid - 1;
else
return mid; // key found
}
return -(low + 1); // key not found.
}

有问题的代码是这一行:
int mid = (low + high) >> 1; 

大家知道,其等价于:
int mid =(low + high) / 2;

问题是在 low 和 high 都很大时,比如数组的元素达到 2^30 时,low + high 将超过整数的最大值 2^31 -1,此时将造成溢流,溢流后得到的 mid 为负值。

正确的实现应该为:
             int mid = low + ((high - low) / 2);

或者更加清楚地使用Java的无符号右移操作符:
            int mid = (low + high) >>> 1;

虽然这个问题目前得到解决,我们就能断定这十几行程序就准确无误吗?
但连以上两位作者目前也还表示怀疑。
从行内得知,第一个二分法算法是1946年出现的,而当时被认为“无误”的实现到1962年才出现(也就是说以上十几行代码是经过十几年才得到的)。因为当时的数据量不可能逼近 2 ^ 30的数量级,所以直到去年这个BUG被提交到 Java 的 Bug 库中。可想人类的思维是有缺陷的。

目前,对于搜索引擎,基因工程领域,这一数量级应该是少见多怪了,所以如果你工作的领域需要处理大量的数据时,请使用 JDK 6.0

顺便提一句,对于C的实现,可以采用如下实现:
mid = ((unsigned) (low + high)) >> 1;
看到这样的情况,作为程序员,我们应该时刻警惕、保持低调!

2007年5月24日星期四

NetBeans 5.5.1 发布了

在我们大谈特谈 NetBeans 6.0 时,一个中间版本 5.5.1 出来了。
也许是因为6.0 引入了太多的新功能,致使开发周期比以往稍显长些。所以这个中间版本主要是为了跟进最新的产品线:
  • 支持Java EE 5 Application Server 9.1 (GlassFish v2)
  • 支持Windows Vista
  • C/C++ Pack 有很大的提升(这可是我亲自感受到的耶)
  • 还有我们可能不大关心的,但却是目前最完善的,支持J2ME Wireless Toolkit, version 2.5.1 平台

感兴趣的话,到这里下载

不过,过不了多久,它将被 NetBeans 6.0 所取代的,也许就在秋天!

2007年5月23日星期三

NetBeans6 功能介绍: 布置 declaration View 和 Javadoc View

此篇文章介绍一个在 NetBeans 6 中同时查看鼠标指针处的源代码和
Javadoc (不再Go to Source .../ Show JavaDoc)

1. 首先打开它们:Window | Other | Declaration View 和 Window | Other | Javadoc View, 它们都被搁浅在 Output 窗口的位置,但此时只能看到一个窗口的内容,因为无论切换到其中的任何一个,它们都占据整个下端窗口。如下:



2. 我们要将它们分开,点击其中任一窗口的上方(类似标题栏区域),按住不放,将其拖向左侧(或右侧也可),当出现一个红色的方框后释放,如下:



释放后的效果如下:




这些位置会被记录下来,只要你在设置之后正常退出了。在下次启动 NetBeans 后,你可以看到同样的布局。

这个截图中显示的是 Integer.toHexString 方法的 Javadoc 和 实现源码。


(期待下一篇)

2007年5月22日星期二

体验更多 NetBeans 的新功能

不喜欢 NetBeans 的开发者往往指出 NetBeans 没有这个功能,没有那个功能。无可厚非,当时他们是对的,但随着时间的推移,现在也许错了:

1. Last Edit (是近更改按钮,带星号的那个),将你带到最近更改的地方




2. Diff SideBar (差异侧条), 根据所在行代码是增加、更改还是删除,在侧条中显示不同的小条,右击可以使用进一步的功能



3. JUnit4 支持(也就是现在可以使用基于 JDK 5 Annotation 的单元测试了)




4. Find/Replace in Project (全工程范围内搜索),是的,这个功能我真的也非常需要:
看到左下方的"Replace" 按钮了吗?
值得注意的是,这个功能在 M9 中被屏蔽了,但在每日构建的版本中可以使用。

[nb-find-replace.png]



另外,大部分初次使用NetBeans 的开发者,不知道更改“自动完成弹出窗口”的键绑定,因为最常用的"Ctrl + 空格" 是不可工作的,因为在中文操作系统中被绑定到输入法的切换了。所以我一般把它改成 'Ctrl + Enter' , 如下进行:
  1. Tools | Options -> Keymap -> Other
  2. 找到 Show Code Completion Popup, 选中它,点击Add...
  3. 按下任何所你希望的键序列,但是如果直接按 Ctrl + Enter 的话,系统提示这个组合键已经被绑定到 Split Line,所以如果我们要使用这个组合键的话,要先把它与 Split Line 解除绑定
  4. 在 Show Code completion Popup 下方第六个即是 Split Line, 选中它,点击移除。你可以为这个功能提供另外的组合键,如果经常使用这一功能的话。
  5. 然后,按照上述把"Ctrl + Enter " 加到 Show Code Completion Popup 中去。

(期待下一篇)

2007年5月18日星期五

GlassFish/Sun App Server 配置 MySqlXADataSource 的问题

如果你打算使用 GlassFish/Sun App Server,并且打算使用 MySql 的 XA 数据源的话。在目前的配置过程中,会遇到如下问题:

重现步骤:
1. (如果之前没做这一步的话)将 Mysql 的 Connector/J 包 (如我的:mysql-connector-java-3.1.12-bin.jar)放入 GlassFish/Sun App Server 安装目录下子目录 \AppServer\lib\ 中

2. 启动 GlassFish/Sun App Server. 可通过 右击 Runtime | Servers | Sun App Server 选择 start

3. 启动后,右击 Sun App Server 选择 View Admin console

4. 登录WEB 管理后台

5. 在左侧导航器中 点击 Resources | JDBC | Connection Pool s,在表格的头部点击 New... 按钮

6. 在右侧中填入:
Name: MySql
Resource Type: javax.sql.XADataSource
Database Vendor: mysql

然后点击 next

7. 注意在 Datasource class name 中自动填入了: com.mysql.jdbc.jdbc2.optional.MysqlXaConnectionPoolDataSource,这个值是不对的。

你如果想试试的话,在最下面的 Properties 窗格中填入 :


点击 Finish

8. 在结果窗口中点击 Mysql

9. 在打开的页面中可以看到一个ping 按钮,点击是用来测试配置成功与否,点击一下,将出现如下错误:


解决的办法:
如果解开mysql-connector-java-3.1.12-bin.jar 文件,在包com.mysql.jdbc.jdbc2.optional 中可 看到:

com/mysql/jdbc/jdbc2/optional/
com/mysql/jdbc/jdbc2/optional/CallableStatementWrapper.class
com/mysql/jdbc/jdbc2/optional/ConnectionWrapper.class
com/mysql/jdbc/jdbc2/optional/MysqlConnectionPoolDataSource.class
com/mysql/jdbc/jdbc2/optional/MysqlDataSource.class
com/mysql/jdbc/jdbc2/optional/MysqlDataSourceFactory.class
com/mysql/jdbc/jdbc2/optional/MysqlPooledConnection.class
com/mysql/jdbc/jdbc2/optional/MysqlXAConnection.class
com/mysql/jdbc/jdbc2/optional/MysqlXADataSource.class
com/mysql/jdbc/jdbc2/optional/MysqlXAException.class
com/mysql/jdbc/jdbc2/optional/MysqlXid.class
com/mysql/jdbc/jdbc2/optional/PreparedStatementWrapper.class
com/mysql/jdbc/jdbc2/optional/StatementWrapper.class
com/mysql/jdbc/jdbc2/optional/SuspendableXAConnection.class

...
其中并没有默认填入的 com.mysql.jdbc.jdbc2.optional.MysqlXaConnectionPoolDataSource, 但是有 com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource

在页面Application Server > Resources > JDBC > Connection Pools > MySql 中:
1.将 Datasource class name 的值改为: com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource

2.点击 Save 按钮

3. 点击 Ping 按钮,成功显示:

2007年5月16日星期三

NetBeans多语言版本,更换默认 Locale 设置时的问题

update: (这个BUG只会在中文操作系统下出现,在英文版的操作系统上一切正常。看来是一些模块在编写时没有正确地加载对应locale 的 properties 文件)

在我看来,在日常的工作平台,JDK/NetBeans 的i18n 字体问题已经成为历史了。但是我前些天又登记了一个 BUG 到 NetBeans 的 IssueZilla 中:

1. 下载多语言版本的安装包,安装
2. 因为我不喜欢那些翻译的不准确的词,所以我打算回退到英文的 locale:
增加一个启动参数到 $NetBeans/etc/netbeans.conf 文件:
netbeans_default_options="$默认的配置 --locale en"
语法为: --locale language[:country[:variant]]

3. 重启后,你将看到“著名的字体问题”重新又出现了,显示为小方框:

当前,只有两种办法可以解决这一问题:

1. 去掉加上的 locale 参数,但必须忍受翻译得不佳的词了。

2. 下载英文版,继续用吧。但这样的话,在 Welcome 中你将看不到中文的 Blog.

2007年5月2日星期三

NetBeans 6.0 抢先试用

NetBeans 6.0 M9 (Preview) 已经出来好些天了,还剩下最后一个里程碑就要进入测试阶段。

对我来说,自从从 Oracle JDeveloper 转向 NetBeans 以来,在工作中我一直坚持用它。也许是的我工作表现迫使远在美国那边的同事放弃了说服我使用 Eclipse 吧。你也许想知道,作为一名NetBeans 的老用户,我期待 6.0 的什么,虽然它已经很好了。

1.不要因为整个 Editor 的体系重组,而使强“稳定性”的口碑打折扣 (基本上大部分模块都重新Retouche了),因为我拒绝使用 Eclipse 的原因之一就是: JVM OutOfMemoryError.

2.Occurrences Highlight 我在之前的文章中写过关于这一功能


3.Javadoc and Declaration View 我已经等了好几年,我甚至曾经自己利用 NetBeans 的API 实现过一个类似的模块,但是因为NetBeans本身的问题(java meta data record),功能不完整。有了这两个窗口,就永远不用 Go to Source, Show JavaDoc 了,所有的信息都在手边,只需将鼠标放在想看的类元素上。



4.Code Generation dialog 我的确很厌倦写类的构造器的实现,特别是类的成员很多的情况下。还有标准的、功能完善的、性能良好的 Common Methods: equals, hashcode 的实现等。
有了它,在右图中的例子中我只需要输入
private long id;
private String name;
private int age;

其它的代码都是由它产生的。

5. Local History

或许有些功能被我忽视了,如是这样的话,请见此处的详细列表。还有整个重写的 Editor 的功能都陆续地出现在


是的,我也保留些目前还未完善的功能,我本人也没有加紧试用。如果我认为有用的话,我会进一步写出来的。