Archive for the '技术' Category

一个legacy对话框

Wednesday, August 22nd, 2007

自Windows 95开始,微软对系统图标做了大规模的改进,包括真彩色支持、重新设计的3D图标等,到Windows 2000和XP后,几乎所有shell32.dll中图标都被更新过多次。

今天在安装毛泽东字体的时候发现这个爷爷级对话框,用过Windows 3.1的应该会有很深的印象- 文件夹图标、硬盘、光盘图标。细心一点可以发现对话框左上角用的是缺省图标,可以推测这个对话框的代码可能连续使用了超过10年的时间而没做任何修改。不清楚Vista里面有没有更新。

reverse proxy配置中的路径转换问题

Thursday, August 9th, 2007

reverse proxy(逆向代理)一般位于Web应用程序的前端,对用户屏蔽了后台的应用服务器。除了请求转发,动态负载平衡和缓存也是reverse proxy的主要功能。在配置逆向代理的时候,一个普遍存在的问题是URL转换。

比方说有一台应用服务器,它的访问地址是http://appserver:9080/app,该地址并不直接暴露和用户,而是由reverse proxy配置成一个对外可见的URL,如http://revproxy/home/app,它是用户最终在浏览器输入的地址。当reverse proxy收到这个请求后,把它转换成应用服务器地址后,将该请求(连同HTTP request header中的参数)转发给后台的应用服务器;应用服务器返回的内容再经reverse proxy,最后回到用户浏览器。

一个常见的问题是如果应用服务器返回的HTML页面包含了在该应用服务器上有效的绝对或者相对路径时,reverse proxy该如何处理?如果是绝对路径的话,那么用户在点击页面上这个链接的时候就会跳过reverse proxy直接连到应用服务器上;如果是相对路径,如”/app” 的话,那么如果reverse proxy自己的URL前面又填加了新的目录名,如上面提到的“/home”,那么这个URL到用户那里就会成为”http://revproxy/app”,同样也是错误的。

reverse proxy的一个重要功能是地址转换,在WebSphere Edge Components(早先的 Edge Server)里可以通过配置一些地址转换规则来解决这个问题。它的工作原理大致是这样:在reverse proxy收到从应用服务器返回的HTML内容后,对其进行内容扫描,如果发现如”href”, “src” 等之类包含URL链接的标签时,根据预先设定的规则把它们替换成对外可用的地址。这样原来页面中的绝对、相对地址经转换后成为最终用户可以访问的地址。需要注意的是,reverse proxy对HTML的扫描是有一定限制的,如果这个绝对或者相对的URL是嵌入的JavaScript里,通过在浏览器端解释动态生成,或者存在于其他一些非链接性质的标签中,reverse proxy是没有办法对这些URL进行转换的。这样漏网的URL将直接暴露给用户。

解决页面中无法被翻译的绝对地址,似乎必须要修改应用程序;而对于无法被翻译的相对地址,可以在reverse proxy通过URL映射来解决。URL映射的原理是当reverse proxy接收到来自用户的HTTP 请求后,如果该URL满足预先定义的模式,则进行替换。比如在WebSphere Edge Components 中可以设定如下的地址转换规则:

Map /app/* /home/app/*。

如此一来,URL地址的转换问题基本得到解决。现在,还剩下两个问题需要考虑:

1. 当后台的应用服务器通过HTTP 301/302进行地址重定向的时候,reverse proxy必须也对该地址进行翻译。在edge中,可以使用下面的命令实现:

ReversePass http://appserver:9080/app/* http://revproxy/home/app/*

2. Cookie的作用域

当用户在应用服务器上登录后,往往会得到一个或多个cookie。在J2EE环境下,服务器端的session变量会产生一个名为”JSESSIONID“的cookie变量送给浏览器,同时指定该变量的作用域,如”path=/”或者”path=/app”。如果是前者那样的根目录,则没有问题,但如果是后者的话,如果reverse proxy原封不动的将该cookie值转发给用户浏览器的话,那么当用户再次发出如”/home/app”,这样的URL请求时,此cookie是不会放在HTTP请求头部中的,因为这个请求的作用域是“/home”,而不是”/app”。cookie作用域失效往往表现为用户的”伪登录“,即在后台服务器上已经登录但通过reverse proxy的话还是出现无法正常登录的情况。

在edge components里,可以使用下面的配置方案解决cookie作用域修改问题:

JunctionRewriteSetCookiePath /app/* /home/app/*

不过由于WebSphere Edge Components 6.1里的一个bug,该功能存在故障,需要获取指定的补丁更新方可使用。

另外,在应用服务器这端,如果可以指定cookie的path永远为根目录,会减少很多麻烦(在Lotus Connections 1.0/1.0.1里,cookie的path为根目录”path=/”以实现多个功能模块的单点登录SSO)。我在Tomcat下测试时发现,Tomcat生成JSESSIONID时,缺省的path就是当前webapp的context root,而不是根目录。如要强行指定Tomcat生成的cookie的path,需要在其”server.xml”配置文件中的”Connector“段中加入‘ emptySessionPath=”true” ’。

有关reverse proxy,如edge components中还有很多复杂的问题这里尚未涉及,如SSL连接、证书等网络安全相关配置。希望此文可以给reverse proxy,尤其是IBM WebSphere Edge Components的用户一点帮助。

PS:有关edge 6.1的配置,目前最完整的官方文档在此

JavaFX的愿景

Wednesday, August 1st, 2007

JavaFX,最简单的理解(本人理解)就是用脚本语言开发swing应用,部署在网络上,通过JNLP加载,最后用客户计算机上的Consumer JRE运行该应用(或者是在移动设备上的JavaFX Mobile)。当然用JavaFX开发普通桌面应用也可以。

用脚本语言写UI早已不是新东西了,不过JavaFX的.fx文件到字节码的编译器似乎是给进阶人士的选配(除了可以脱离JavaFX runtime外,没有想到其他的value add)。在不使用JavaFX编译器的情况下,.fx文件在运行时被加载、解释、执行。

如果JavaFX利用网络发布的话,我希望有这样一个功能,即用户通过HTTP访问一个.fx文件,可以在服务器端生成一个可以执行的应用(applet, JNLP包裹的jar file, etc)并立即在客户端显示出来。这个功能在Openlaszlo里面有很好的实现,它可以在server端动态的编译.lzx文件并生成一个Flash文件(.swf格式),并且此flash可以离线播放。这个转变实际是以用户界面为中心的设计:窗体,而不是main class,将作为交互式应用程序的入口点。

把用户搞的很累的Java applet在浏览器兼容性、安全设置、签名、证书等问题上阻止了applet被广泛的采纳成为Web交互应用的标准。JavaFX能否打赢这个翻身仗,似乎不在JavaFX script language,而是那个consumer JRE。

Redbooks: WebSphere Application Server V6.1: Classloader Problem Determination

Tuesday, July 24th, 2007

这本昨天发布的红皮书在我最近的阅读列表中。Container环境下的classloading是无数诡异问题的根源。以Lotus Connections 1.0.1来说,我们用了icu4j来提供一个时区列表,icu4j本身自带了这些列表的翻译,比JRE自带的要全。但在测试的时候发现WAS 6.1.0.3下的时区列表繁体中文的显示有问题,混入了大量简体中文字符。其原因在于WAS自带了一份icu4j并且早于webapp下的lib被container加载,而这份icu4j自带的时区翻译存在问题。

对于长期从事WAS应用开发的IT工作者,这是本必读书。

标准的标准

Monday, July 23rd, 2007

有一段时间没“博“了,Lotus Connections 1.0.1正在冲刺阶段,所有精力都扑在上面了。不是因为看了新浪这篇文章,今天估计也不会”博”。

作为一个外企职工谈中国的标准化问题是个风险很大的事儿,这里仅谈个人观点。

稍微列举一些这两年的热门标准,数数这些高科技领域内的标准,无一不是吵得唾星四溅,火药十足:WiFi, RFID, 高清电视, XML文档, 3G, 手机充电器, 服务器, EVD…在这些新兴领域内拥有话语权无论对于企业还是国家都意义重大。然而凡是标准,就不能很多,一个领域内2-3个互相可以兼容的就差不多了(搞网页开发测试IE/Mozilla兼容性的苦孩子们请排队握手…)。企业或者国家搞自己的标准没有问题,在保证技术先进性的前提下,就是是解决保护现有投资和平衡各方利益的问题。

打个比方,比如美国乒乓球联合会提出修改国际乒联标准,增大台面、 球的直径、换胶皮等等要求,中国乒联的态度会是什么?很显然,一个对于现代乒乓球运动没有做出重大贡献的国家,试图利用另立标准改变自己的地位,对于大多数在这一领域做出过卓越贡献、投入大量人力物力的各方是不公正,也是不能接受的。其实标准的本质和专利制度一样,它们都有可能成为垄断的工具并阻碍社会进步,但大部分情况下是它们却可以刺激科研创新、激发生产力,是积极的。

要想在这些领域拥有强大的话语权,我认为最重要的还是踏踏实实的为标准的发展和进步做出自己的贡献,当一本1000页的标准草案提出来的时候,里面200页有我们的贡献,这个时候谈什么都不过分。

在一个没有人愿意埋头做事的年代,为了生存,大家都熟练掌握了抢蛋糕的本领,希望咱们在抹嘴的时候,能多想想那些腆着肚子活面、打蛋的大师傅们。

The OSSwin project: Open Source for Windows

Wednesday, July 11th, 2007

一张整理较完整的Windows平台下的开源软件列表,推荐一下:

http://osswin.sourceforge.net/

Lotus Connections 1.0 eGA

Thursday, June 28th, 2007

注:今天(7/03)才发现此帖被置为private,现在更正为public。

今天IBM第一款企业社会软件包,Lotus Connections 1.0正式发布。Lotus Connections集成了企业员工名录、社区、博客、社会书签和活动管理,是IBM迈进social computing领域的第一个正式产品。

安装Lotus Connections需要WebSphere Application Server 6.1, DB2 9.2或者Oralce数据库,LDAP服务器和Tivoli Directory Integrator。

在过去的100天,我个人在Connections开发工作中的最直接的成果是修复了博客模块里的74个bug。

Lotus Connections 1.0.1目前正在开发中,主要是加入了多语言支持,包括英文、德文、法文、意大利文、西班牙文、葡萄牙文、简体中文、繁体中文、日文、韩文。

Cross-compiling .NET to Java

Saturday, June 23rd, 2007

Mainsoft,如果我没记错,就是几年前Windows源代码泄露事件的主角。它在6月份发表了叫做Mainsoft for J2EE 2.0的产品,该产品主要功能是支持用户使用.NET语言和工具进行开发,然后通过cross compiling技术把应用最终部署到IBM WebSphere平台之上。之前虽有MS已经提供了Java语言转换到C#的辅助工具,在正式的应用开发中把.NET平台进行整体的J2EE迁移,似乎还不多见。这件事的意义显然比Google Web Toolkit把用Java开发ajax的代码compile成JavaScript的意义更为重大,毕竟中间件是个利润丰厚的市场。

除报价$5000美元企业版外,Mainsoft还提供免费的developer edition供下载试用。

详细分析文章见6月份SDTimes

部落格

Friday, June 22nd, 2007

下午在对Blogs新收到的语言包进行压缩、编码转换并用CHKPII工具检测后(PII是IBM专用词汇,即Program Integration Information的缩写,意指需要和程序一起build的语言资源,不包括帮助文件等),放到local build里跑了一圈,验证一下Group 1里面9种语言的显示界面。在切换到繁体中文的时候,看到了“部落格”。

这是台湾对“blog”的翻译,挺生动,让我联想到了“四四格”。

从上面的截图看,Blogs多语言的支持除了语言包外,还有不少细节需要处理,如上面那个“18 5月”的格式化问题。

中国十大数据库?

Thursday, June 14th, 2007

这里是世界上容量最大的十大数据库,注意到里面有两大电信运营商的名字,除了很想知道这些数据库都采用了那些产品和技术外,我还很想知道中国数据量最大的十大系统。我估摸着可能有这么几个:

中国工商银行、中国移动、百度、上海证交所、中科院某项科学研究所用之数据库、政府某系统(如人口、户籍等)。。。

搞过VLDB、数据挖掘的来自北大、人大、复旦的同学请补充啊。

Code vulnerabilities check - Watchfire goes to Rational

Thursday, June 7th, 2007

IBM宣布了对Watchfire的收购,并购之后的Watchfire将并入Rational旗下。

Source code security (vulnerabilities) analysis是这两年静态分析领域的热点,3年前Rational Application Developer 6里开始提供了Code Review,不过在security检测领域没有提供很强的支持, 倒是一些独立的软件开发商,如fortify在这个市场里玩的红红火火。微软也不干寂寞,玩起了FxCop (.NET assembly code analysis)

Watchfire的并入势必带来Rational Code Review模块的重构(从RAD 6到RAD 7已经进行过一次升级),IBM内部若干个静态分析引擎面临一次新的洗牌。

杀还是不杀

Friday, May 18th, 2007

首先,本人是这次诺顿病毒事件的受害者。早上收到公司IT发送出来的病毒警告后,在未搞清原因的情况下主动升级了病毒库,导致中招。接下来的几个小时,IT连续发出几封紧急邮件救险,直到临下班前升级到5.17 rev 73才算告一段落。今天是星期五,将会有相当多的机器在周一上班重新开机的时候出问题。可以想像Symantec眼睁睁看着这些已经关机的机器,却什么也做不了的心情,很残忍。

从技术方面,我想到的是well informed decision。如果病毒分析本身的风险性在逐渐上升,依靠在单机上运行的算法匹配病毒在这次事件背景下可能需要重新思考一下。讲的俗一点,用Web 2.0的方式,病毒分析软件在找到可疑文件后也许不应该立刻采取行动,而是应该把你找到的模式上传给服务器。服务器根据一系列参数,如时间、时序、历史记录、当前改模式总的激活数量等实时的手段进行分析,以确定这的确是个问题或者是误报。每个装在客户机上的杀毒软件都像一片RFID,把它收到的数据分享给其他人,通过event driven系统最终得出结论,杀还是不杀?

杀毒软件也需要个虚拟论坛,杀毒前要到坛子里问问,以做出正确判断。

换输入法了

Thursday, May 17th, 2007

紫光变搜狗。

拼音是我唯一会用的输入法,紫光到今天用了大概7、8年了,最早的前身考拉输入法是丁峰推荐的,之前一直用的微软全拼 - 那张抖来抖去的大面板。

从紫光到搜狗的过渡非常平滑,唯一不适应的是在Firefox里输入的时候,输入法框和浏览器输入框里同时出现正在输入的拼音,很分神,不知是何道理。

紫光、搜狗和谷歌输入法所属的企业,都聚集在清华科技园周围,的确是个出活儿的好地方。

Developer Toolbar

Friday, May 11th, 2007

向任何人兜售浏览器的toolbar都需要很大的勇气,出于对长期与dojo之类Web client端代码打交道的程序员们的关心,我准备推荐下面几个浏览器插件,which可以大大的提高生产效率:

1. LiveHTTPHeader (Firefox);

2. Web Developer (Firefox);

3. Firebug (Firefox)

4. ieHTTPheaders (IE)

5. IE Developer Toolbar (IE)

其中IE Developer Toolbar是MS刚刚释出的新货。

Lotus Connections Blog - Feed cache

Friday, May 11th, 2007

Lotus Connections 1.0中的Blog实现了两层的缓存机制试图更好的解决性能问题。第一层是Application Server对某些访问频繁数据的缓存;另外一层是在HTTP reverse proxy上,对特定URL资源的本地缓存。缓存对改善性能,尤其是对实时性要求相对较低的Atom feed来说,性能改善的效果更明显。

考虑对数据实时性,Connections Blog缺省关闭了application server的缓存,这样用户在发贴或者回帖后刷新页面立刻可以看到更新,否则从数据写入到reload会有一段时间间隔,容易造成用户困惑。

这里想谈的是HTTP cache。

Blog的典型配置是用DB2数据库,WebSphere appserver,前端是network dispatcher和edge。edge实际是一个HTTP reverse proxy,实现URL转发和内容缓存的功能。 为了实现对Atom feed访问的缓存,Blog会在每个feed的http response的头上面缺省加上max-age=600,response首先到达edge,edge收到后知道需要将该feed缓存600秒。当下次用户通过浏览器、各类feed reader或者是抓虾这样的server端访问的时候,edge首先看feed的10分钟缓存期是否到期,如果还在10分钟内,edge之间把它的cache返回给用户而不再访问appserver;如果已经超过10分钟,edge会向appserver发一个HTTP conditional get的命令,看application server端是不是有新的feed内容。Application server收到feed的请求后,如果有新的feed内容,则向edge返回新feed内容,response code置成200;如果没有更新,则不返回任何内容;response code置成304。无论是否有更新,edge在重新收到appserver的返回后,将重新缓存该feed 10分钟。依次类推。

当在没有edge的情况下, 可以用浏览器来模拟。当在10分钟间隔内,如果在地址栏之间回车的话,浏览器甚至不会与服务器建连(可通过LiveHTTPHeader或者ieHTTPHeaders之类的browser插件观察)。目前Firefox和IE对max-age都可以很好的支持。

在实际情况下,大部分feed源本身并没有类似edge这样的模块,而是直接把appserver暴露给client。从实现上看,很多feed reader对last modified时间戳的管理都很弱,会导致每次都迫使appserver重新加载数据。另外,在server端有些feed server也没有实现对if modified since的管理,无论什么请求都重新进行数据访问,这样都增加了额外的负载。

这是Connections Blog的tech lead Rob在调试feed cache的时候发给我的一篇文章,写的很详细。另外来自IE team的这份A Caching Issue in IE7 Beta 2也很有帮助。

从Feed出发,此类提高性能的缓存方法可以常态的运用在如REST等基于HTTP,以URL来映射资源的应用上,来帮助克服传统Web Server/Web browser多年前已经完美解决了的、而重新在Web 2.0环境下产生的数据生产者和消费者之间产生的老矛盾。

Gaim (Pidgin) 2.0

Sunday, May 6th, 2007

自Gaim商标纠纷后的第一个release。Pidgin可能是目前最好的open source、跨平台多IM集成工具了。它基本替代了我的MSN和GTalk原始程序。虽然Pidgin同时提供了sametime的插件,但如果与刚发布的ST 7.5.1相比,差距很大。所以,对于平时工作生活,Sametime  + Pidgin是我的完美组合。

developerWorks Spaces

Thursday, May 3rd, 2007

IBM developerWorks正式开放了空间注册,提供blog,forum和wiki的服务。在填写完spaces注册申请后需要经过dW的审核 - 我刚刚回复了一封email解释我申请的原因和打算如何使用dW服务。

PS: Introducing developerWorks spaces 

推荐:Web 2.0/machine is us/ing us.

Wednesday, April 18th, 2007

把人人皆知的东西,表达的栩栩如生、引人入胜,进而激情彭湃,这个短片真正做到了。下午TLE上在IBM QEDWiki主题报告的结尾重放了这段录像,赢得满堂彩。

social computing = collaboration - goal

Wednesday, April 18th, 2007

昨天在Anaheim举行的IBM TLE会议上,有一个非技术性报告,讨论social computing的社会性。我对里面的一个论断很感兴趣,这就是social computing = collaboration - goal。

协作的目的性无须多做解释,写email、发IM消息、打IP phone,没有一个是盲目的活动。socaial computing从个人行为来看,的确没有明确的目的性。比如写一篇博客、添加一个tag、给一个餐馆打分、上传一段录像。如果social computing真的缺乏目的性的,企业social computing,Lotus Connections的意义何在呢?

解释这个矛盾的最好理论基础自然是长尾效应,众多人的随意性产生的合力可以创造明确的价值,而价值引导目标,我更愿意这么解释social computing和它的目的性。

这个公式可以稍做修改:social computing = collaboration/goal。这会是个有争议的公式,但它很有趣,很social。

一天一行

Friday, April 13th, 2007

过去的两天,我只写了两行代码。

这两行代码分别解决了Lotus Connections Blog中的两个bug,平均一行代码耗时10小时。

其中一个Blog编辑器中的bug,是通过几十次的blog发贴,用Venkman的Firefox JavaScript Debugger抓到的,该错误源自Firefox和Dojo自身的缺陷。因为一天中发测试贴太多,现在在自己博客发贴也有点心理障碍了。

另外一个是Blog的Theme切换问题,为此还动用了Filemon这样的工具,监测javaw.exe对文件系统的修改,在追踪到数据库文件被修改后,进而跟踪DB表变化,加上Eclipse debugger,最后才确信需要把else后面那个”}”提前一行。

在involve到Lotus Connections的开发后,最大的一个变化居然是自己发贴、看social bookmark的兴趣降低了- 搞伤了,就像我现在看到早餐的炒蛋和薯角一样,刚闻到味儿,就半饱了。