9月26
以下为字符串匹配操作符:
~ 为区分大小写匹配
~* 为不区分大小写匹配
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配
1: 限制某些类型的客户端的访问
如果把MSIE改成 Mozilla 就基本上把IE和firefox这样pc浏览器限制了
2和3主要是针对盗链做处理
~ 为区分大小写匹配
~* 为不区分大小写匹配
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配
1: 限制某些类型的客户端的访问
如果把MSIE改成 Mozilla 就基本上把IE和firefox这样pc浏览器限制了
2和3主要是针对盗链做处理
9月26
今天有个同事提到了UrlRewrite技术,晚上研究了下,把它写出来和大家分享下。UrlRewrite即地址变换。它可以实现静态功能方便搜索引擎收录,比如http://***/news.asp?id=11它可以变为htt://***/news-11.html。这样还实现了开发标记隐藏,避免了每个页面都挂了.asp、.php等后缀,提高了网站的安全性。
IIS默认是不支持这个功能的,需要单独安装插件,今天网上看了很多教程,综合起来加上自己研究才终于把它试成功了。测试环境:Windows XP IIS 5.0。
我们第一步做的是下载IIS UrlRewrite插件,到http://www.helicontech.com/download-isapi_rewrite3.htm下一个ISAPI_Rewrite 3 Lite installation package(精简版)的测试就满足了(根据你自己)。下载好后安装ISAPI_Rewrite3_0048_Lite.msi。
安装完毕后打开IIS,在WEB属性的“ISAPI筛选器”里添加位于安装目录的Helicon\ISAPI_Rewrite3文件夹里的ISAPI_Rewrite.dll,名称就随便定了,如图:
IIS默认是不支持这个功能的,需要单独安装插件,今天网上看了很多教程,综合起来加上自己研究才终于把它试成功了。测试环境:Windows XP IIS 5.0。
我们第一步做的是下载IIS UrlRewrite插件,到http://www.helicontech.com/download-isapi_rewrite3.htm下一个ISAPI_Rewrite 3 Lite installation package(精简版)的测试就满足了(根据你自己)。下载好后安装ISAPI_Rewrite3_0048_Lite.msi。
安装完毕后打开IIS,在WEB属性的“ISAPI筛选器”里添加位于安装目录的Helicon\ISAPI_Rewrite3文件夹里的ISAPI_Rewrite.dll,名称就随便定了,如图:
9月25
从Java诞生至今,已经在太多的领域取得成功,然而它却很少在图形界面程序上崭露头角。究其原因,Java语言缺省的图形界面开发包AWT和SWING实在是难脱其究, 无论速度和外观,它们都难以让人接受。 如今,Eclipse组织编写的SWT开发包,为Java程序员提供了AWT和SWING之外的一个更佳的选择。在本文中,对SWT做了简单但尽可能全面的介绍。
Java语言的声望和它在桌面应用程序(GUI程序)所取得的成就显然极不相符,至今仍然很少能看到非常成功Java桌面程序。虽然有JBuilder,Netbean,JProbe等大型软件作为代表,但这仍不能证明Java的GUI程序是成功的:它们的外观总是和同一操作系统平台下的其它软件显得格格不入。对机器配置的需求也似乎永无止境,这使得它们只能被一些总是拥有当前最高性能PC的程序员们所容忍,或是那些不在乎金钱和时间的专业用户所接受。对绝大多数计算机使用者来说,AWT或SWING代表着怪异的界面和无法接受的速度。Standard Widget Toolkit(SWT)或许是Java这一噩梦的终结者,广大Java程序员终于可以开发出高效率的GUI程序,它们拥有标准的外观,几乎没有人能看出你的程序是用Java写出来的,更为重要的是,这些程序是跨平台的。
SWT本身仅仅是Eclipse组织为了开发Eclipse IDE环境所编写的一组底层图形界面 API。或许是无心插柳,或是有意为之,至今为止,SWT无论是在性能和外观上,都超越了SUN公司提供的AWT和SWING。目前Eclipse IDE已经开发到了2.1版本,SWT已经十分稳定。这里指的稳定应该包含两层意思:
一是指性能上的稳定,其中的关键是源于SWT的设计理念。SWT最大化了操作系统的图形构件API,就是说只要操作系统提供了相应图形的构件,那么SWT只是简单应用JNI技术调用它们,只有那些操作系统中不提供的构件,SWT才自己去做一个模拟的实现。可以看出SWT的性能上的稳定大多时候取决于相应操作系统图形构件的稳定性。
另一个稳定是指SWT API包中的类、方法的名称和结构已经少有改变,程序员不用担心由于Eclipse组织开发进度很快(Eclipse IDE每天都会有一个Nightly版本的发布),而导致自己的程序代码变化过大。从一个版本的SWT更新至另一版本,通常只需要简单将SWT包换掉就可以了。
Java语言的声望和它在桌面应用程序(GUI程序)所取得的成就显然极不相符,至今仍然很少能看到非常成功Java桌面程序。虽然有JBuilder,Netbean,JProbe等大型软件作为代表,但这仍不能证明Java的GUI程序是成功的:它们的外观总是和同一操作系统平台下的其它软件显得格格不入。对机器配置的需求也似乎永无止境,这使得它们只能被一些总是拥有当前最高性能PC的程序员们所容忍,或是那些不在乎金钱和时间的专业用户所接受。对绝大多数计算机使用者来说,AWT或SWING代表着怪异的界面和无法接受的速度。Standard Widget Toolkit(SWT)或许是Java这一噩梦的终结者,广大Java程序员终于可以开发出高效率的GUI程序,它们拥有标准的外观,几乎没有人能看出你的程序是用Java写出来的,更为重要的是,这些程序是跨平台的。
SWT本身仅仅是Eclipse组织为了开发Eclipse IDE环境所编写的一组底层图形界面 API。或许是无心插柳,或是有意为之,至今为止,SWT无论是在性能和外观上,都超越了SUN公司提供的AWT和SWING。目前Eclipse IDE已经开发到了2.1版本,SWT已经十分稳定。这里指的稳定应该包含两层意思:
一是指性能上的稳定,其中的关键是源于SWT的设计理念。SWT最大化了操作系统的图形构件API,就是说只要操作系统提供了相应图形的构件,那么SWT只是简单应用JNI技术调用它们,只有那些操作系统中不提供的构件,SWT才自己去做一个模拟的实现。可以看出SWT的性能上的稳定大多时候取决于相应操作系统图形构件的稳定性。
另一个稳定是指SWT API包中的类、方法的名称和结构已经少有改变,程序员不用担心由于Eclipse组织开发进度很快(Eclipse IDE每天都会有一个Nightly版本的发布),而导致自己的程序代码变化过大。从一个版本的SWT更新至另一版本,通常只需要简单将SWT包换掉就可以了。
9月25
1、引言
Eclipse是一个开放源代码的、基于Java的可扩展的开发平台。就其本身而言,它只是一个框架、一组服务,用于通过插件来构建开发环境。当我 们提到Eclipse的时候,许多Java开发者的第一反应就是那个性能良好,界面漂亮,Debug功能奇佳的Java集成开发平台。
无可否认,Eclipse常常作为一款优秀的IDE (Integrated Development Environment,集成开发环境)出现在开发者面前的。它不仅仅是Java的IDE,还可以是C语言的IDE、Python的IDE——只要开发出 相应语言的插件,Eclipse就可以成为任何语言的IDE。但是,这些严格来说都是Eclipse RCP的应用。真正的Eclipse,是一个提供了一个完善的插件机制RCP(Rich Client Platform,胖客户端平台)平台;它以SWT/JFace作为界面元素组件,提供给用户一个名为Workbench的UI平台;加上它本身优秀的插件机制,它能够构造出扩展能力强、性能优秀、并能提供给用户良好UI体验的服客户端平台。
2、Eclipse RCP简介
Eclipse RCP是一项位于Eclipse平台核心的功能。大多数人想到Eclipse时,会想到Java集成开发环境(IDE)。如果将Eclipse中关于 IDE的内容剥去,剩下的就是一个提供基本工作台功能的核心,包括对可移动以及可叠加的窗口组件(编辑器和视图)、菜单、工具栏、按钮、表格、树形结构等 等的支持,而这个核心就是Eclipse RCP。
Eclipse是一个开放源代码的、基于Java的可扩展的开发平台。就其本身而言,它只是一个框架、一组服务,用于通过插件来构建开发环境。当我 们提到Eclipse的时候,许多Java开发者的第一反应就是那个性能良好,界面漂亮,Debug功能奇佳的Java集成开发平台。
无可否认,Eclipse常常作为一款优秀的IDE (Integrated Development Environment,集成开发环境)出现在开发者面前的。它不仅仅是Java的IDE,还可以是C语言的IDE、Python的IDE——只要开发出 相应语言的插件,Eclipse就可以成为任何语言的IDE。但是,这些严格来说都是Eclipse RCP的应用。真正的Eclipse,是一个提供了一个完善的插件机制RCP(Rich Client Platform,胖客户端平台)平台;它以SWT/JFace作为界面元素组件,提供给用户一个名为Workbench的UI平台;加上它本身优秀的插件机制,它能够构造出扩展能力强、性能优秀、并能提供给用户良好UI体验的服客户端平台。
2、Eclipse RCP简介
Eclipse RCP是一项位于Eclipse平台核心的功能。大多数人想到Eclipse时,会想到Java集成开发环境(IDE)。如果将Eclipse中关于 IDE的内容剥去,剩下的就是一个提供基本工作台功能的核心,包括对可移动以及可叠加的窗口组件(编辑器和视图)、菜单、工具栏、按钮、表格、树形结构等 等的支持,而这个核心就是Eclipse RCP。
9月21
摘要: Symbian OS是目前市场占有率最高的移动设备OS。本文是Symbian开发的入门性文章,从零开始介绍了进行Symbian开发首先需要了解的一些东西,同时介绍了一些好的开发资源。阅读本文几乎不需要相关的基础知识。
1. Symbian简介
1.1 Symbian起源
Symbian 成立于1998 年6 月,是由爱立信、Matsushita(松下)、摩托罗拉、诺基亚、Psion、西门子和索尼爱立信共同持股的独立私营公司。Symbian 在移动计算设备和手机软件技术开发领域拥有近二十年的丰富经验,是一家由各主要无线通信技术公司持股的软件许可证授权公司,为支持数据分组传输的手机提供高级、开放式、标准化的操作系统— Symbian OS™。
1.2 Symbian发展和现状
您可以前往这里查看Symbian发展史大事记。
目前,全球主流手机操作系统主要有四种:
Symbian OS
Windows Mobile
Palm OS
Linux OS
Symbian OS一支独秀,市场占有率达到了70%,而微软的windows mobile和其他操作系统一共只有30%的份额。
截至目前,以发布的采用Symbian OS的手机有:
Nokia 7610 ,Siemens SX1 等等,您可以在这里找到完整的列表。那里还包括了正在开发中的基于Symbian OS的手机列表。
此外,您还可以在这里找到Symbian的合作伙伴列表。
1. Symbian简介
1.1 Symbian起源
Symbian 成立于1998 年6 月,是由爱立信、Matsushita(松下)、摩托罗拉、诺基亚、Psion、西门子和索尼爱立信共同持股的独立私营公司。Symbian 在移动计算设备和手机软件技术开发领域拥有近二十年的丰富经验,是一家由各主要无线通信技术公司持股的软件许可证授权公司,为支持数据分组传输的手机提供高级、开放式、标准化的操作系统— Symbian OS™。
1.2 Symbian发展和现状
您可以前往这里查看Symbian发展史大事记。
目前,全球主流手机操作系统主要有四种:
Symbian OS
Windows Mobile
Palm OS
Linux OS
Symbian OS一支独秀,市场占有率达到了70%,而微软的windows mobile和其他操作系统一共只有30%的份额。
截至目前,以发布的采用Symbian OS的手机有:
Nokia 7610 ,Siemens SX1 等等,您可以在这里找到完整的列表。那里还包括了正在开发中的基于Symbian OS的手机列表。
此外,您还可以在这里找到Symbian的合作伙伴列表。
9月21
使用客户端数字证书和基本身份验证(Basic),域服务器的摘要式身份验证、集成 Windows 身份认证或自定义的 Form 认证等方式相比,虽然部署和管理方面稍微复杂一些,但安全性也更好一些,应用上也较为灵活。
在 ASP 和 ASP.NET 中处理和识别客户端数字证书是非常容易的,代码如下:
ASP (VBScript)语法:
ASP.NET(C#) 语法:
在 ASP 和 ASP.NET 中处理和识别客户端数字证书是非常容易的,代码如下:
ASP (VBScript)语法:
ASP.NET(C#) 语法:
9月21
有时候,我们不希望用户直接编辑TextBox,而是希望通过客户端脚本的方式来设置内容,一般的做法是设置TextBox的属性ReadOnly 为true。但在ASP.NET 2.0里有了变化,设置了ReadOnly为true的TextBox,在服务器端不能通过Text属性获取在客户端设置的新内容,在Reflector 里比较一下LoadPostData的实现
.NET 1.1中:
.NET 1.1中:
9月21
下面来谈下如何应用设计模式编写易于单元测试的代码
引言
设计模式是对被用来在特定场景下解决一般设计问题的类和相互通信的对象的描述,通过在系统设计中引入合适的设计模式可以为系统实现提供更大的灵活性,从而有效地控制变化,更好地应对需求变更或者按需变更系统运行路径等问题。
单元测试是软件开发的一个重要组成部分,是与编码实现同步进行的开发活动,这一点已成为软件开发者的共识。适度的单元测试不但不会影响开发进度,反而可以为开发过程提供很好的控制,为软件质量、系统重构等提供有力的保障,并且,当后续系统需求发生变更、Bug Fix 或功能扩展时,能很好地保证已有实现不会遭到破坏,从而使得程序更易于维护和修改。 Martin Fowler、Kent Beck、Robert Martin 等软件设计领域泰斗更是极力倡导测试先行的测试驱动开发(Test Driven Development,TDD)的开发方式。
单元测试主要用于测试细粒度的程序单元,如类的某个复杂方法的正确性,也可以根据需要综合测试某个操作所涉及的多个相互联系的类的正确性。在很多情况下,相互联系的多个类中有些类比较简单,为这些简单类单独编写单元测试用例往往不如将它们与使用它们的类一起进行测试有意义。
模拟对象(Mock Objects)是为模拟被测试单元所使用的外围对象、设备(后文统一简称为外部对象)而设计的一种特殊对象,它们具有与外部对象相同的接口,但实现往往比较简单,可以根据测试的场景进行定制。由于单元测试不是系统测试,方便、快速地被执行是单元测试的一个基本要求,直接使用外部对象往往需要经过复杂的系统配置,并且容易出现与欲测试功能无关的问题;对于一些异常的场景,直接使用外部对象可能难以构造,而通过设计合适的 Mock Objects,则可以方便地模拟需要的场景,从而为单元测试的顺利执行提供有效的支持。
本文根据笔者经验,介绍了几种典型的设计模式在系统设计中的应用,及由此为编写单元测试带来的方便。
引言
设计模式是对被用来在特定场景下解决一般设计问题的类和相互通信的对象的描述,通过在系统设计中引入合适的设计模式可以为系统实现提供更大的灵活性,从而有效地控制变化,更好地应对需求变更或者按需变更系统运行路径等问题。
单元测试是软件开发的一个重要组成部分,是与编码实现同步进行的开发活动,这一点已成为软件开发者的共识。适度的单元测试不但不会影响开发进度,反而可以为开发过程提供很好的控制,为软件质量、系统重构等提供有力的保障,并且,当后续系统需求发生变更、Bug Fix 或功能扩展时,能很好地保证已有实现不会遭到破坏,从而使得程序更易于维护和修改。 Martin Fowler、Kent Beck、Robert Martin 等软件设计领域泰斗更是极力倡导测试先行的测试驱动开发(Test Driven Development,TDD)的开发方式。
单元测试主要用于测试细粒度的程序单元,如类的某个复杂方法的正确性,也可以根据需要综合测试某个操作所涉及的多个相互联系的类的正确性。在很多情况下,相互联系的多个类中有些类比较简单,为这些简单类单独编写单元测试用例往往不如将它们与使用它们的类一起进行测试有意义。
模拟对象(Mock Objects)是为模拟被测试单元所使用的外围对象、设备(后文统一简称为外部对象)而设计的一种特殊对象,它们具有与外部对象相同的接口,但实现往往比较简单,可以根据测试的场景进行定制。由于单元测试不是系统测试,方便、快速地被执行是单元测试的一个基本要求,直接使用外部对象往往需要经过复杂的系统配置,并且容易出现与欲测试功能无关的问题;对于一些异常的场景,直接使用外部对象可能难以构造,而通过设计合适的 Mock Objects,则可以方便地模拟需要的场景,从而为单元测试的顺利执行提供有效的支持。
本文根据笔者经验,介绍了几种典型的设计模式在系统设计中的应用,及由此为编写单元测试带来的方便。
9月21
引言
委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在。本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。
将方法作为方法的参数
我们先不管这个标题如何的绕口,也不管委托究竟是个什么东西,来看下面这两个最简单的方法,它们不过是在屏幕上输出一句问候的话语:
暂且不管这两个方法有没有什么实际意义。GreetPeople用于向某人问好,当我们传递代表某人姓名的name参数,比如说“heck”,进去的时候,在这个方法中,将调用EnglishGreeting方法,再次传递name参数,EnglishGreeting则用于向屏幕输出 “Morning, heck”。
现在假设这个程序需要进行全球化,哎呀,不好了,我是中国人,我不明白“Morning”是什么意思,怎么办呢?好吧,我们再加个中文版的问候方法:
委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在。本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。
将方法作为方法的参数
我们先不管这个标题如何的绕口,也不管委托究竟是个什么东西,来看下面这两个最简单的方法,它们不过是在屏幕上输出一句问候的话语:
暂且不管这两个方法有没有什么实际意义。GreetPeople用于向某人问好,当我们传递代表某人姓名的name参数,比如说“heck”,进去的时候,在这个方法中,将调用EnglishGreeting方法,再次传递name参数,EnglishGreeting则用于向屏幕输出 “Morning, heck”。
现在假设这个程序需要进行全球化,哎呀,不好了,我是中国人,我不明白“Morning”是什么意思,怎么办呢?好吧,我们再加个中文版的问候方法:
9月21
分组 XML 技术
很多年前,当 XML 成为最热门的技术之一时,很难想象得到 XML 会在十年内变得如此重要,而且您可以找到大量与 XML 相关的有趣技术。实际上,可以通过多种途径了解 XML 技术。
传统的 XML 分组
可以将与 XML 相关的技术划分为一些基本的分组或主要区域:
1. 文档创作:此分组面向将主要的时间用于创作 XML 的人。无论他们是创建原始 XML 数据,还是用 XML 格式表示现有数据,这里主要关注的都是纯 XML,很少关注可能使用这些文档的编程任务。这就是 XML 的核心思想所在,这个分组还包括特定的 XML 词汇表(比如 MathML)或一些科学 XML 词汇表。
2. 处理 XML:这些技术(比如 XSL)允许对 XML 进行转换、修改或由一种格式迁移到另一种格式。这些技术主要关注的仍然是 XML 文档及其内部数据,但有时候也使用编程语言来完成这些转换。
3. 读取/编写 XML(以及持久化数据):这些技术与编程联系更加紧密,包括从低级的 API(比如 SAX 和 DOM)到数据处理技术(比如 JAXB 和 Castor)。这些技术将 XML 看作一种数据存储机制,而且在许多情形下看作一种达到目的的手段。
到目前为止,这些分组是主要的技术类别,每个分组中都在不断出现最新的技术和规范。
将 XML 转变为一类数据居民
XML 的一个主要问题就是缺乏良好的搜索支持,尽管这个问题仅限于上面的三个分组。如果想要对 XML 格式的数据进行搜索,则这会是一个问题。实际上,通常的解决方案是将上面的一些分组结合起来。文档创作者可能使用命令行工具(比如 grep,这是一种笨拙的搜索方式。编程人员可能读入 XML(另一个分组),然后使用他们的编程语言(比如 Java 或 C#)对非 XML 格式的数据进行搜索。这种方法是可行的,但暴露了 XML 的一些局限性。
幸运的是,XPath(和 XQuery,本文稍后将会谈到)的引入和流行带来了一个新分组:
4. 搜索 XML:XPath 和 XQuery 就属于这个分组。这些规范/技术允许以 XML 的方式对 XML 文档进行搜索。换句话说,可以使用 XML 语义进行搜索,并且不但能够搜索 XML 文档中的数据,还能够搜索这些文档的结构。
借助 XPath 和 XQuery,不再需要将数据由 XML 转换为一种编程语言,然后使用这种语言的工具来搜索数据。使用这种方法不仅会受到编程语言的约束,通常还会丢失大多数 XML 语义和结构(比如元素之间的父子关系等等)。使用 XPath 和 XQuery,无需编程语言 就可以对 XML 进行搜索。
很多年前,当 XML 成为最热门的技术之一时,很难想象得到 XML 会在十年内变得如此重要,而且您可以找到大量与 XML 相关的有趣技术。实际上,可以通过多种途径了解 XML 技术。
传统的 XML 分组
可以将与 XML 相关的技术划分为一些基本的分组或主要区域:
1. 文档创作:此分组面向将主要的时间用于创作 XML 的人。无论他们是创建原始 XML 数据,还是用 XML 格式表示现有数据,这里主要关注的都是纯 XML,很少关注可能使用这些文档的编程任务。这就是 XML 的核心思想所在,这个分组还包括特定的 XML 词汇表(比如 MathML)或一些科学 XML 词汇表。
2. 处理 XML:这些技术(比如 XSL)允许对 XML 进行转换、修改或由一种格式迁移到另一种格式。这些技术主要关注的仍然是 XML 文档及其内部数据,但有时候也使用编程语言来完成这些转换。
3. 读取/编写 XML(以及持久化数据):这些技术与编程联系更加紧密,包括从低级的 API(比如 SAX 和 DOM)到数据处理技术(比如 JAXB 和 Castor)。这些技术将 XML 看作一种数据存储机制,而且在许多情形下看作一种达到目的的手段。
到目前为止,这些分组是主要的技术类别,每个分组中都在不断出现最新的技术和规范。
将 XML 转变为一类数据居民
XML 的一个主要问题就是缺乏良好的搜索支持,尽管这个问题仅限于上面的三个分组。如果想要对 XML 格式的数据进行搜索,则这会是一个问题。实际上,通常的解决方案是将上面的一些分组结合起来。文档创作者可能使用命令行工具(比如 grep,这是一种笨拙的搜索方式。编程人员可能读入 XML(另一个分组),然后使用他们的编程语言(比如 Java 或 C#)对非 XML 格式的数据进行搜索。这种方法是可行的,但暴露了 XML 的一些局限性。
幸运的是,XPath(和 XQuery,本文稍后将会谈到)的引入和流行带来了一个新分组:
4. 搜索 XML:XPath 和 XQuery 就属于这个分组。这些规范/技术允许以 XML 的方式对 XML 文档进行搜索。换句话说,可以使用 XML 语义进行搜索,并且不但能够搜索 XML 文档中的数据,还能够搜索这些文档的结构。
借助 XPath 和 XQuery,不再需要将数据由 XML 转换为一种编程语言,然后使用这种语言的工具来搜索数据。使用这种方法不仅会受到编程语言的约束,通常还会丢失大多数 XML 语义和结构(比如元素之间的父子关系等等)。使用 XPath 和 XQuery,无需编程语言 就可以对 XML 进行搜索。







