Archive for the ‘技术’ Category

奔2

Sunday, November 4th, 2007

过去的三个星期,是Lotus Connections 1.0.2和2.0并行开发的三周,一边解bug,一边考虑实现新功能,ClearCase里面两条stream来回切换,不亦乐乎。1.0.2到这个周末算正式结束,进入最终release。1.0.2 Blogs除了修复了从1.0里遗留的30多个bug外,在性能方面也做了诸多调整;另外根据客户反映,恢复了MetaWeblog API的支持(与ATOM API共存)。Connections整体功能方面则支持Tivoli Access Manager,强制的ATOM basic authentication over HTTPS (写入部分,读取依然保持HTTP);增加了AIX平台和MS SQL Server数据库的支持等一系列的改进。

目前正紧锣密鼓开发的Connections 2.0将基于Java 5构建,此前1.0.x基于JDK 1.4,虽然包含了部分1.5的代码,但使用了retroweaver保证这些1.5的代码运行在1.4的VM之上。2.0版的Blogs会在1.0.x基础上增加新的功能,UI方面也会有相当程度的改进与提高,这些工作目前都在紧张的进行中,不久就能看到阶段性成果。

当代装机一条龙 – 部署的挑战

Sunday, October 7th, 2007

桌面应用软件的安装和部署从未如此复杂过,更不要谈企业环境下的生产系统了。多年前,电脑城里卖的“装机一条龙”是尝试解决普通用户电脑软件安装配置的草根尝试,这种来自于人民大众的D版拼盘儿,尤其是某些精心配置的的盘片,极大的简化了非专业用户的电脑使用过程。毕竟大众电脑是给人炒股、聊天、看片、发帖、读新闻的工具。除此之外的额外操作,都是多余(甚至危险的)。

现在吹的是一条龙2.0的风,Google pack, XAMPP, Net Tools, Eclipse callisto, 还有水木社区新软版每年年末CD大礼包等等等等,大家都在努力解决软件的统一安装与管理,可安装的组件从可执行文件、链接库,发展到重型运行时(GTK+, JRE, .NET framework…)、依赖软件包等,安装和部署从产品级别上升到offering级别。软件已经复杂到专业人员都不能一手掌控,而需要依赖简化了的installer来解决安装,尤其是配置问题 – 即便是专家如我的人,也不愿意多花时间来解决两个软件在配置文件上的冲突问题。

极简的UI、留给专业用户把玩的隐藏参数、人气旺盛的论坛和社区,自然,还要有一个不错的产品,构成了成功的范式。现在,需要把这些实现这些范式的集合有机的组合在一起,实现个人系统的高效整合。

珊瑚虫QQ

Saturday, September 29th, 2007

腾讯赢了官司,输了人心。

短信mashup

Tuesday, September 18th, 2007

最近注册了饭否,刚才在浏览抓虾的时候顺便绑定了饭否的帐号,如此一来便可以直接在抓虾分享link到饭否了。饭否的短信发帖的功能看上去很方便,似乎还有每天50条上限的短信推送。

我最近在寻找可以定制内容聚合(包括各类feeds,包括我的私人email,新浪新闻的首页,博客的新评论,论坛的新帖子等),并把这些东西mashup后给我发一组短信的在线服务。另外我还可以定义短信发送的有效期,比如说仅在出门在外的时候才发送。在被聚合的内容提供商API开放的前提下,甚至还可以短信回邮件,回帖,回博。

如果GPRS足够便宜的话,我该做的是换掉6030,弄个大屏幕的手机:不是要运行手机上安装的RSS reader或者Web浏览器,而是一个mobile VNC client,用它连上在家里或者办公室的台式机,做平时可以在PC上做的一切事情。如果网速足够快,这个大手机不再需要高速的CPU或者大内存,它应该就是一个固化了vnc client的大屏幕手机而已。

再以后,会有人提供在线的VMWare的hosting服务,每个人可以把自己的台式机部署到远程的VMWare上,支持各类终端设备的远程访问…

Lenovo lab – SaaS (Web 2.0)

Tuesday, September 4th, 2007

SchedulerBest4CLenovo lab推出的两个基于Internet的服务,一个是在线日程管理(JavaScript实现),一个是类似Visio的在线矢量图工具(Laszlo实现)。

为了确认两个demo的实现方式,查看了一下HTML Source,在Best4C的meta tag里除了找到OpenLaszlo外,还有两个老外的名字。网上查了一下原来是Gliff的创始人,而其中的Chris在一个博客的回帖中提到了这件事情。

说实话,这两个东西做的都比较精致,感觉不错。只是联想也需要加强一下IP管理与教育,尽量避免发生类输入法事件,减少不必要的麻烦。

而Scheduler里meta tag中的信息显示该开发者使用的是sohu的email地址,并且这两个demo的讨论区都设在搜狗说吧,很容易让人揣测搜狐在其中扮演的角色。好了,点到为止,不八卦了。

话说回来,现在还看不到联想在Web 2.0和SaaS的尝试所蕴含的big picture,但话又说回来,似乎任何IT企业在Web 2.0的投资都貌似正常不需要理由(有也不告诉你,嘿嘿)。反正这个世道等什么都想清楚才开始撸袖子干话,恐怕只能轮到点剩汤喝了。

一个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环境下产生的数据生产者和消费者之间产生的老矛盾。