显示标签为“开发技巧”的博文。显示所有博文
显示标签为“开发技巧”的博文。显示所有博文

2007年11月22日星期四

查看Viewstate 的工具


做过ASP.NET 设计的都碰到过Viewstate。ViewState 用于维护页面的 UI 状态。
ViewState默认是保存在客户端页面的一个Hidden Field里面的这里有一个查看

Viewstate Dcoder 就是一个解析Viewstate的工具。 分开1。0,1。1 和2。0 版。方便你了解viewstate 保存的内容。

这里有一些介绍Viewstate的文章:

ViewState: All You Wanted to Know

Understanding ASP.NET View State

点击这里下载

2007年11月20日星期二

不同数据库的返回前N条记录的方法。

这几天要针对不同的数据库写一些存储过程。 里面涉及到返回前N条记录的方法。 整理一下。

Microsoft SQL Server: SELECT TOP 10 column FROM table

Oracle: SELECT column FROM table WHERE ROWNUM <= 10

PostgreSQL and MySQL: SELECT column FROM table LIMIT 10

Sybase:SET rowcount 10; SELECT column FROM table

Firebird:SELECT FIRST 10 column FROM table

× 对于 PostgreSQL and MySQL 来说,有一个很 cool 功能可以让你返回一定范围的记录,如返回第20-30条记录, 对于分页显示特别有用。

PostgreSQL and MySQL:SELECT column FROM table LIMIT 10 OFFSET 20

2007年11月5日星期一

First Alberta TechFest 2007

First Alberta TechFest 2007 will be helded in Calgary, at the Nexen Conference Centre on Saturday November 10th.

There will be 15 technical sessions with 13 different experienced speakers in three tracks:

- Developer Track
- Agile/Open Source Track
- IT Professional Track

The User Group leaders from all Alberta will open the tracks and coordinate the whole event.

This event will be completely free!If you are interested in attending to this event and support our Calgary IT community, go to the Alberta TechFest web site:

And register for this event as soon as possible, so far there are 146 registrations and soon we will have to start to put new registrations in the waiting list!

I will be there. How about you?

2007年11月3日星期六

开源的java 3D游戏引擎- jMonkeyEngine



java 3D游戏引擎- jMonkeyEngine (jME)终于在10月19日公开了其1.0版本。在此之前,使用java开发3D游戏必须直接和java3D或者OpenGL之上的薄层打交道,开发非常的困难, 现在jMonkeyEngine使得3D游戏的开发变得容易了,它提供一个完整强大的高性能的工具包。现在已经被很多商业游戏公司和开发源代码的游戏开发 团队所使用!

我们来看看由jME的使用者开发的游戏截图吧!



点击这里到主页

2007年10月28日星期日

Online Javascript compressor

大家都知道如果JavaScript文件较大的话,会造成网页打开很慢, 这个工具可以帮你把Javascript 进行压缩, 从而大大减少javascript文件的大小。挺方便的。

点击工具主页

2007年10月27日星期六

跨平台的网络通信中间件:ICE和ACE

转自IT经验网。

我现在做的工作部分是.NET 和Java的通讯。看到这篇文章介绍了ICE和ACE, 两个都是开源的高性能中间件,挺有意思的,

ICE的主页
ACE的主页


二十世纪九十年代中期以来,业界一直在使用DCOM和CORBA这样的面向对象的中间件平台。在分布式的应用中,中间件平台托管了大部分网络事务, 比如对数据进行编码与解码以进行传送,把逻辑对象地址映射到物理传输端点,根据客户和服务器的机器架构改变数据的表示,以及按照需要自动启动服务器。

DCOM和CORBA由于自身的缺点,都没有成功占领大部分分布式计算的市场。DCOM是Microsoft的独家解决方案,在异构网络中,各种机器运行多种操作系统,无法都使用DCOM。同时DCOM不支持创建大量数目的对象(数十万或数百万),这在很大程度上是它的分布式垃圾收集机带来的开销造成的。

虽然有多家供应商提供CORBA产品,但是没有一家供应商能够为异构网络环境中的所有操作系统环境提供实现。尽管进行了大量标准化工作,不同的 CORBA实现之间仍缺乏互操作性,从而不断地造成各种问题;而且,由于供应商常常会自行定义扩展,而CORBA又缺乏针对多线程环境的规范,对于像C或 C++这样的语言,源码兼容性从未完全实现过。

在异构网络环境中,让DCOM和CORBA共存不是一件容易的事情。2002年,Microsoft推出了.NET平台取代了DCOM。.NET提供了比DCOM更强大的分布式计算支持,但是仍然是Microsoft的独家解决方案。另一方面,CORBA技术停滞不前,许多供应商离开了市场,CORBA规范中的许多缺陷未能得到及时解决。在DCOM 和CORBA衰败的同时,分布式计算领域的研发人员对SOAP和Web Services产生了浓厚的兴趣。SOAP 和Web Services技术一度引发了很大的公众效应,业界发表了许多论文。但是无论是在网络带宽方面,还是在CPU开销方面,SOAP都会给应用程序留下严重的性能瓶颈。应用程序可以把各种SOAP 消息拼凑在一起,但这样做极其繁琐而容易出错。

Web Services的标准化进程非常缓慢,多年以来一直停留在技术层面的实现上。许多专家担心SOAP和Web Services的架构安全性。在这样的背景下,网络通讯的中间件ICE和ACE诞生了。ICE的全称是 ICE是一款高性能的中间件,支持分布式的部署管理,消息中间件,以及网格计算等等。

ICE的优点主要有:

面向对象的语义,所有的操作调用都使用迟后绑定。 支持同步和异步的消息传递,提供了同步和异步的操作调用和分派,提供了发布——订阅消息传递机制。 与硬件架构无关,客户端及服务器与底层的硬件架构屏蔽开来。对于应用代码而言,像字节序和填充这样的问题都隐藏了起来。 与上层的编程语言无关,客户端和服务器可以分别部署,所用语言也可以不同,支持C++、Java语言,客户端支持PHP语言。与采用的操作系统无关,ICE完全是可移植的,同样的源码能够在Windows、Linux、MacOS和UNIX上编译和运行。 完全是线程化的,其API是线程安全的。

采用TCP、IP 和UDP作为传输协议,客户端和服务器代码都不需要了解底层的传输机制。 服务器的位置是对用户透明的,ICE例程负责定位对象,并管理底层的传输机制,比如打开和关闭连接。客户与服务器之间的交互显得像是无连接的。服务器可以迁移到不同的物理地址,而不会使客户持有的代理失效,而客户完全不知道对象实现是怎样分布在多个服务器进程上的。

采用SSL强加密,可以使客户和服务器完全安全地进行通信。 采用内建的持久机制创建持久的对象。并且提供了对高性能数据库Berkeley DB的内建支持。ICE提供了一组丰富的可重用C++包装外观(Wrapper Facade)和框架组件,可跨多种平台完成通用的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、分布式服务动态(重)配置、并发执行和同步等等。ACE简化了使用进程间通信、事件多路分离、显式动态链接和并发的面向对象的网络应用和服务的开发。

ACE的好处包括:

增强可移植性:在ACE组件的帮助下,很容易在一种OS平台上编写并发网络应用,然后快速地将它们移植到各种其他的OS平台上。 更好的软件质量:ACE使用了许多可提高软件质量的关键设计模式,提供了通信软件灵活性、可扩展性、重用性和模块性。 更高的效率和可预测性:ACE支持广泛的应用服务质量(QoS)需求,包括延迟敏感应用的低响应等待时间、高带宽应用的高性能,以及实时应用的可预测性。 更容易转换到标准的高级中间件:TAO使用了ACE提供的可重用组件和模式,按照CORBA的标准实现,并且为高性能和实时系统作了优化。

ACE包含一个高级的网络编程框架,集成并增强了较低层次的C++包装外观。该框架支持将并发分布式服务动态配置进应用。ACE的框架部分包含以下组件:

事件多路分离组件:ACE Reactor(反应器)和Proactor(前摄器)是可扩展的面向对象多路分离器,它们分派应用专有的处理器,以响应多种类型的基于I/O、定时器、信号和同步的事件。

服务初始化组件:ACE Acceptor(接受器)和Connector(连接器)组件分别使主动和被动的初始化任务与初始化一旦完成后通信服务所执行的应用专有的任务去耦合。

服务配置组件:ACE Service Configurator(服务配置器)支持应用的配置,这些应用的服务可在安装时或运行时被动态装配。

分层的流组件:ACE Stream组件简化了像用户级协议栈这样的由分层服务组成的通信软件应用的开发。

ORB适配器组件:通过ORB适配器,ACE可以与单线程和多线程CORBA实现进行无缝集成。

同为网络通信中间件,ICE和ACE的区别在于,前者是对通信对象的封装,

例如如客户端的ICE核心和服务器端的ICE核心的不同,而后者是对通信本身的封装,例如对套接字的封装,对同步异步通信方式的封装。后者比前者更加底层,更加抽象。ACE可以认为是通用网络编程框架软件,而ICE则是一个跨平台的RPC软件。

参考文档:
Michi Henning和Mark Spruiell编写的《Distributed Programming with ICE》;
Douglas C. Schmidt编写的《C++ Network Programming with Patterns, Frameworks, and ACE》。
Internet Communications Engine,即因特网通信引擎。
ICE是由ZeroC, Inc.公司开发的。
ACE的全称是ADAPTIVE Communication Environment,即自适应的通信环境。
ACE自从问世以来得到了多家公司的商业支持。
ICE和ACE目前都是开放源代码的中间件。

2007年10月25日星期四

使用HtmlInputFile Control 上传大文件

大家可能都用过HtmlInputFile Control 来上传文件到服务器。你会发现如果上传大文件的话, 会报错。 原因是上传文件的大小默认是4096K。 在web.config.comments 文件中有一个 节点, 内容类似一下:

< executionTimeout="110"
maxRequestLength="4096"
requestLengthDiskThreshold="80"
useFullyQualifiedRedirectUrl="false"
minFreeThreads="8"
minLocalRequestFreeThreads="4"
appRequestQueueLimit="5000"
enableKernelOutputCache="true"
enableVersionHeader="true"
requireRootedSaveAsPath="true"
enable="true"
shutdownTimeout="90"
delayNotificationTimeout="5"
waitChangeNotification="0"
maxWaitChangeNotification="0"
enableHeaderChecking="true"
sendCacheControlHeader="true"
apartmentThreading="false" />

这是。NET的默认参数。 大家可以看到“maxRequestLength="4096"”
那么我们可以通过修改这个参数来增大上传文件的大小。 例如 在Web.config文件中加入以下的内容:

[system.web>
[httpruntime maxrequestlength="40960" executiontimeout="100">
[/SYSTEM.WEB>
[/configuration>

* 把[ 换成 < , 没办法, 不给我贴XML格式

可以加入到系统的web.config或虚拟目录下的web.config中。 差别是影响的范围不一样。 注意的是, 如果你增大了maxRequestLength, 同样需要增加executionTimeout, 否则会产生超时报错。


那么我们如何在程序中读出这个变量呢。
在。NET2。0 以下。 你可以通过如下方法:
object section = HttpContext.Current.GetConfig("system.web/httpRuntime");
Type configSection = section.GetType();
if (configSection != null)
{
PropertyInfo pInfo = configSection.GetProperty("MaxRequestLength", BindingFlags.Instance BindingFlags.NonPublic);
if (pInfo != null)
int maxLength = (int)pInfo.GetValue(section,null)
}

在.NET 3.0 中, 提供了HttpRuntimeSection 类, 可以直接访问MaxRequestLength 属性来获取。
// Get the section related object.
HttpRuntimeSection configSection =
(HttpRuntimeSection)config.GetSection("system.web/httpRuntime");

// Get the MaxRequestLength property value.
Response.Write("MaxRequestLength: " +
configSection.MaxRequestLength + "
");

// Set the MaxRequestLength property value to 2048 kilobytes.
configSection.MaxRequestLength = 2048;


参见:

httpRuntime Element (ASP.NET Settings Schema)

ASP.NET HtmlInputFile Control

HttpRuntimeSection Members

2007年9月26日星期三

如何计算字符串的长度。

我们自己写了一个Grid。 其中一个功能是根据每列的数据, 计算出每一列的最小宽度, 然后用 style="width:90px" 的方式Render出来。 其中涉及到根据每一行字符串的长度转换成Pixel。然后取最大值。

具体的转换关系是:
1 point = 1/72 inch
1 pixel = 0.75 points.

那么一个character 是多少Pixels呢? 答案是这条公式: (Column Width) Pixels = Column Width (Characters) × 5 + 5。


例如 "Hello World" 是 11×5+5=60 Pixels。

2007年9月24日星期一

使用links方式安装Eclipse插件

一般来说,eclipse插件都是安装在plugins目录下。其实这样有几个问题。
1. 安装了许多插件之后,eclipse变的很大,最主要的是不便于更新和管理众多插件。
2. 如果我们同时装有几个版本的Eclipse,我们不想重复安装同一插件到各个Eclipse。
3. 如果我们想暂时去除不想删除某些插件不能够做到。

用links方式安装eclipse插件,可以解决这个问题。 现在假设我的eclipse安装目录是C:\eclipse,待安装插件目录是C:\eclipsePlugins ,我将要安装JFormDesigner这个插件。

先在C:\eclipsePlugins目录里,建立子目录JFormDesigner, 然后在子目录JFormDesigner建立eclipse子目录。将下载到的JFormDesigner-3.1-eclipse.zip解压到C:\eclipsePlugins\JFormDesigner\eclipse目录下。

然后在 eclipse安装目录C:\eclipse目录中建立一个子目录links,在links目录中建立一个link文件,比如JFormDesigner.link,文件内容为 path = C:/eclipseplugins/JFormDesigner 即这个link文件要对应一个插件目录。

Eclipse 将会到指定的目录下去查找 eclipse\features 目录和eclipse\plugins 目录,看是否有合法的功能部件和(或)插件。如果找到,附加的功能部件和插件在运行期配置是将是可用的。

几点说明:
 1. 插件可以分别安装在多个自定义的目录中。
 2. 一个自定义目录可以安装多个插件。
 3. link文件中path=插件目录的path路径分隔要用\\或是/
 4. 在links目录也可以有多个link文件,每个link文件中的path参数都将生效。

2007年9月20日星期四

Get the file type icon with Java


我们的项目产生各种报表, 其中一个功能是能将报表生成各种文件格式, 如Excel, Word, PDF, Html 和TXT文件。 我们弹出一个Dialog来让客户选择直接打开, 还是通过一个File Chooser来选择保存的文件名和路径, 保存在客户的机子上。客户抱怨说如果硬盘已经存在同名的文件。 没有任何提示就覆盖掉源文件。今天做的一个改进是检查是否已经存在同名文件, 如果有的话就弹出一个“Confirm File Ovewrite”的Dialog, 让客户选择是否覆盖。Looks like this one.

首先根据文件名来生成 File 对象。然后根据file.Exists() 来判断是否已经存在该文件。

File file = new File(filePath);
if( file.exists())
{
// 显示Dialog, 并根据客户的选择做相应的处理, 代码省略。
}

参照微软的样板, 显示文件名, 文件大小, 和文件最后修改时间等等。 其中重点是根据文件的类型显示出一个Icon(32x32)。 当然我们可以根据文件的后缀来加载相应的Icon, 但是一来拓展性差, 二来象Html文件, 在IE是省缺浏览器时显示IE的图标, FireFox是省缺浏览器时显示FireFox图标就做不到了。

最简单的方法是从系统取相应的图标。 代码如下:
import sun.awt.shell;

Public Icon getIconByFileType( File file )
{
try
{
ShellFolder shellFolder = ShellFolder.getShellFolder(file);
return shellFolder.getIcon(true);
}
catch (Exception e)
{
// do something
return null;
}
}

此方法仅适用于运行Sun JVM 的平台。在WinXP下java 1.6 下测试通过。

那么还有另外一种方法适合各种平台,但是只能取小图标(16x16)。
Public Icon getIconByFileType( File file )
{
try
{
FileSystemView view = FileSystemView.getFileSystemView();
return view.getSystemIcon(file);
}
catch (Exception e)
{
// do something
return null;
}
}

一旦取得图标, 就可以通过JLabel的setIcon 方法来把图标显示出来。

2007年9月7日星期五

iText 快速产生PDF文件的java类库


iText 是一个能够快速产生PDF文件的java类库, 我现在也在用, 感觉非常好用, 文档做的相当好, 有各种的例子,容易上手。利用iText在服务器生成PDF报表, 客户端可以通过超链接访问PDF文件,进行打印, 预览和下载。

iText的主页。 可以下载源代码,编译代码和文档。上面还有非常丰富的例子。

PDF之家, 里面有翻译的iText PDF 概述, 让你进一步了解iText。 上面还有其他的很多学习制作,加密PDF的文章, 值得一看。


顺便推荐一本书, iText in Action ,the first and only book about iText:

另外,如果你是做。NET开发, 可以下载 iTextSharp。 它是iText的项目的一个分支。用C#写的。

2007年8月27日星期一

Hibernate/NHibernate 流行的开源ORM工具




Hibernate 作为目前最为广泛应用的持久层框架,在Java和.NET 开发者中已经耳熟能详了。 关于Hibernate的安装,入门和基本使用等,我在这里就不重复了。 鉴于我接触了Hibernate/NHibernate也有一段时间。 我想在这里开一个专题来讨论,整理Hibernate的高级应用。收集网上关于这方面的好的一些文章。

今天先开个头。 如果你还不熟悉Hibernate, 点击Hibernate的主页。

除了Hibernate以外, 下面俩个开源持久层框架也不错。

Apache OJB

iBatis

2007年8月23日星期四

巧用Start.exe 来打开各种类型的文件

上次介绍了用Runtime.getRuntime().exec(new String[] {"cmd.exe", "/C", filePath });就可以在java中打开相应的文件,其实cmd.exe 还可以打开链接等等,例如我们可以指定用那一个浏览器来打开链接。
用firefox 打开google 网站: Cmd /c Firefox www.google.ca
用IE 打开google 网站: Cmd /c iexplore www.google.ca

如果我们用 cmd.exe /C Start www.google.ca 他就会在默认的浏览器中打开google的网页。 其中的奥妙在那里呢?

实际上 Start 是一个执行程序Star t.exe. 他其实根本不知道应该调用那个程序去打开链接,他只是一个ShellExcute 的一个外包装程序。他啥也不会干, 只会把跟着的字符串传递给ShellExcute去执行。

那ShellExcute 怎么会知道那一个程序和Url相关联呢。 其实他是到注册表里面查找对应的类型和文件拓展名。那么我们如何查看这些关联呢,打开任何一个文件夹, 选择菜单的Tools-Folder Options - File Types。 就可以看到所有的文件类型以及相关联的程序了。

我们也可以编辑和添加文件关联。 有些程序,如WinZip等,在安装是会问我们要和那些文件类型关联, 然后她就会帮我们建立这里关联。

除了文件关联外,我们还可以利用DDE来打开文件。 我们平时用的文件拷贝和粘贴就是用到了DDE。

在这里只是简单介绍一下。 详细内容请点击下面链接。

点击这里,详细介绍ShellExecute 的功能和用法。

点击这里, 详细介绍 File Associations 的原理

点击这里,有关DDE的介绍。

2007年8月2日星期四

写Regex正则表达式的好工具

我现在的日常开发是.NET 和Java 各占一半。有时难免要写正则表达式。如校验电子邮件, 邮政编码, 电话号码, 文件名等, 有时也用来匹配字符等等。正则表达式有自己的语法, 而且不大好记住,.NET和Java下的正则表达式还是有点不一样的,所以每次我要写Regex时都要拿出参考书来看语法。那么怎么保证写的正则表达式正确呢, 就必须进行测试了。 因此就要借助工具了。

.NET 下最出名的工具是 The Regulator,The Regulator能够使生成和测试正则表达式变得很容易,他还有一个功能是能够在 regexlib.com 搜索在线正则表达式库。 是.NET下写正则表达式的首选。 免费的。可以从这里下载。


Java 下有一个网页, 同样能测试你的正在表达式。 非常好用。点击这里

你有更好的推荐吗?

2007年7月30日星期一

如何在Java中直接打开文件

我们经常会遇到这种情况:将Applet的显示内容按照某种格式(PDF,Excel, Word等)直接打开。那么如和实现这个功能呢。

我们分两个步骤来完成。
1.首先是将显示内容按照对应的格式生成并保存在用户的临时文件夹。

File file = File.createTempFile(getValidFileName(fileName), "." + getOutputExtension());

如何生成文件的代码略去。

2.然后调用相应的程序来打开。
String filePath =file.getPath();
Runtime.getRuntime().exec(new String[] {"cmd.exe", "/C", filePath });


在大多数情况下工作的很好, 但是如果文件名中出现一下字符“ &<>[]{}^=;!’+,`~”, 上述代码无法打开文件,同时也没有报错, 和没有执行一样。 问题出在那里的?

原来Ccmd 命令对文件名中出现这些字符要做加引号才能正确处理。 以下是cmd的说明:

The completion code deals correctly with file names that contain spaces
or other special characters by placing quotes around the matching path.
Also, if you back up, then invoke completion from within a line, the
text to the right of the cursor at the point completion was invoked is
discarded.

The special characters that require quotes are:
space
&()[]{}^=;!'+,`~


因此我们只要加一个函数来处理就可以, 代码如下:

private String getValidFilePath(String filePath)
{
Pattern p = Pattern.compile( "\\p{Punct}" );
Matcher m = p.matcher(filePath);
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, "\"$0\"");
}
m.appendTail(sb);

return sb.toString();
}

修改后的代码如下:
String filePath = getValidFilePath (file.getPath());
Runtime.getRuntime().exec(new String[] {"cmd.exe", "/C", filePath });

2007年7月25日星期三

POI-HSSF使用技巧之(一) 生成超链接。

今天接到一个需求, 要求报表生成的Excel表格支持超链接。例如点击Excel内的公司名, 自动打开浏览器并连到该公司的网站上去。在Excel里面选中所需的单元格, 右键弹出属性, 选超链接就能输入相应的地址了,既然Excel支持超链接。那就没有什么借口说不能实现了。:).

翻了翻POI的文档, 很容易就找到了解决方案。在POI中让单元格实现超链接功能, 可以用Hyperlink 函数。HYPERLINK函数包含两个参数,第一个参数是指向的URL地址,第二个参数是显示字串

cell = row.createCell(colNumber)。
cell.setCellType(HSSFCell.CELL_TYPE_FORMULA);
cell.setCellFormula("HYPERLINK(\"" + "Http://www.google.ca"+ "\",\"" + "Google Canada"+ "\")");

现在超链接单元格看起来和一般的单元格没有分别, 除非你把鼠标放上去才会变成手行光标。 为了和一般的习惯相符, 还需要把字符颜色变成蓝色和加上下划线。 这就要用到 style了、

HSSFCellStyle linkStyle = workbook.createCellStyle();
HSSFFont cellFont= workbook.createFont();
cellFont.setUnderline((byte) 1);
cellFont.setColor(HSSFColor.BLUE.index);
linkStyle.setFont(cellFont);

最后把style应用到cell上去就大功告成了。
cell.setCellStyle(linkStyle);

看上去是不是不错呢。细心的朋友可能发现一个小缺陷, 就是Excel的列宽不会自动调整,导致只看到部分字符, 稍后我会给你一个解决的方案。