恢复夏令时
2008年03月7日, 22:21:36后天 - 3月9日,美国进入2008年夏令时。如此一来,和美国东部时间时差恢复到12小时。安排和美国team的项目会议,双方都会更容易一点。
最近手机升级,用上了N70,里面的多国时间切换功能很好。不过我还没有试过,这个版本的固件是否支持去年改制过的美国夏令时,后天试一下就知道了。
后天 - 3月9日,美国进入2008年夏令时。如此一来,和美国东部时间时差恢复到12小时。安排和美国team的项目会议,双方都会更容易一点。
最近手机升级,用上了N70,里面的多国时间切换功能很好。不过我还没有试过,这个版本的固件是否支持去年改制过的美国夏令时,后天试一下就知道了。
毫无疑问,“云计算”将成为继“网格计算”后,工业界和学术界的又一个热点。联想到过去几年国内高校的P2P、网格计算的热度,2008年国内估计至少得有50份以上的计算机专业博士论文开题报告和“云计算”有关。和“网格计算”相关的课题,也多多少少要变个身影,搭上个“云”边,与时俱进。
IBM也在近期关闭了developerWorks的网格专区,一心奔着“虚拟化”,“云计算”而去了,并且在国内有了第一个“云计算”的合作案例。
我对云计算在国内、外的研究有一个小小的期望,就是要“头顶天,脚睬地”,搞学问的时候忘掉概念,从解决实际问题的角度出发突破创新。让“云计算”创造更多价值,而不是论文。
permalink是Blogs 2.0里新添加的功能,和WordPress的”slug“很类似,允许博客作者为自己的帖子指定一个有意义的、永久的URL。
对于客户端来说,permalink的存在,只有在支持HTTP 302的前提下才更有价值。因为很多的permalink或者一些feed的订阅地址,会像public API一样,一旦发布出去就应该长时间保持有效,即使需要修改也必须同时用302重定向的方法支持老的URL。最近我在整理ThunderBird里订阅的feed列表,发现有不少feed(都是一些大牌儿网站的feed)已经失效了,而用浏览器访问这些feed则可以正常阅读,究其原因就在于ThunderBird不支持HTTP 302重定向,人家feed地址一改就歇菜了。
对于企业内部用户,feed reader面对的是配置了各种策略(包括安全策略)的部署环境,重定向几乎不能避免,对它的支持格外重要。
Lotus Connections 2.0后台的O/R mapping将从iBatis 2.1.5升级到2.3,今天在测试的时候发现部署iBatis 2.3后导致Blogs出现大量exception,大部分功能失效。然而根据文档,2.3的API是向下兼容的,理应不该出现此类问题。
做了一番调查,发现原因如下:当iBatis拿到结果集后调用Java pojo的setter方法来保存对象集合,而如果一个pojo存在两个同名但参数类型不同的setter时,2.3版本iBatis会调用到错误的方法。以Blogs为例,其中一个pojo有两个同名的setter方法,一个参数类型是java.util.Set,另外一个是java.util.List。iBatis会错误的调用”setXXX(Set mydata)“而不是”setXXX(List mydata)“方法,因为iBatis的O/R映射集合类型是不支持java.util.Set的,所以出现argument type mismatch的错误。
通过修改pojo,消除同名setter方法可以解决升级到2.3后的这个问题。
J.Drovak在近期谈到了十大”bright ideas“,有一条叫做“Make Dead Products Public Domain”。(另外有一条叫“停止外包”,说Intel与其在中国成立工厂不如在美国(指的应该是大连新的封装工厂),不过PC Mag中文版的翻译却成了“与其在印度成立工厂…”,编辑们的用心良苦…)
退市产品的公共化问题,的确是个非常好的主张,不过面临的困难极其巨大,我大致分析一下大概有以下两个主要原因阻止了这件事情的发生:
1. 产品所有者的潜在经济利益。一个退市的产品,虽然不能为其拥有者带来经济利益,但一旦成为免费的公共资源,有可能间接与自己目前的产品发生冲突或者有可能被利用来创造和自己竞争的产品(或免费提供)。比如微软不卖DOS已经很久了,如果把DOS免费贡献给公众,可能会被利用到一些可能成为微软利益区域的领域(或者某些当前还无法预测的领域)。放在产品所有者自己手里,虽然一分不赚,但也没了这些风险的困扰;
2. 专利的限制。即使产品所有者主观上愿意把陈年老货免费赠送给大众,一个潜在的问题是产品所包含的专利权。如果产品内包含的所有专利都也都来自同一所有者,那么这个问题很简单,如果产品包含的专利还同时来自与第三方,那么产品公共化所涉及到的就不仅仅是产品所有者单方的问题。要达成多方的共识本身就要耗费资源,这个问题如果没有相关法律制度的帮助,很难促成。去年,IBM的OS/2正式下市,有不少人提议将OS/2开源,最终IBM还是没有开源OS/2的原因之一就是OS/2不仅包含IBM的代码,还有其他公司的代码。
除了需要配套的著作权和专利法的促成外,政府还必须提供必要的利益补偿(比如免税等等),才能把这件企业(尤其是软件企业)最低优先级的事情进入所有人的视线,让知识财富更好的为社会服务。
前天收到一个客户询问想知道有哪些免费的feed reader可以用来订阅Connections的atom feed。因为Connections部署在公司内网,在线的feed reader都无法访问(如果有基于JS的atom reader倒是可用),所以只能需找客户端软件。
在网上搜了一吧,免费的里面对Connections的支持好的feed reader算一个,RSSOwl也可以不过在处理Connections的feed上出现了一个问题。ThunderBird不支持Atom很遗憾,虽然Firefox上有atom reader插件不过客户大多数使用IE 6/7,所以也不是个通用的方法。
如有更好选择,请跟帖拉
Lotus Connections的安全性包括以下几个方面:
1. 传输层安全。Connections在用户登录时强制采用SSL,用户也可以修改配置实现整个应用的SSL保护。上周我们根据一个国外客户的需求,通过定制web.xml和HTTP Server的rewriterule实现了Web访问的强制SSL保护和feed内容的强制basic authentication。
2. 认证安全。Connections的认证包括form based authentication(j_security_check)和basic authentication。前者是在使用浏览器访问5个模块的时候用户认证方式,后者是feed reader使用的。在Connections 1.0.2中,强制要求feed reader在做post等写操作的时候使用basic authentication over SSL,其他读feed的操作无需认证。
3. 第三方安全产品的支持。1.0.2增加了对Tivoli Access Manager (TAM)的支持。看似和应用无关的安全支持实际上影响了不少的代码。而为了支持AJAX, JSON等调用,TAM的配置也是很不同。举例来讲,我们尝试过的一个TAM配置会在返回的页面的末尾添加一段JS代码,这会break我们的JSON调用,必须用其他配置形式绕过。
4. 对Web内容的过滤。Connections使用了ACF对用户提交内容进行检查,去除掉一些会危害Web访问安全的代码,如Cross-site scripting (XSS)。Blogs还会根据用户配置对上传的文件进行检测,最大程度上减少XSS的可能性。Activities甚至还提供了对CSRF的防范功能。
天下没有免费的午餐,增加了诸多的安全性机制,会在某种程度上对系统性能产生影响,比如HTTPS相对HTTP会降低约40%的性能(仅在登录是使用可以忽略);ACF的HTML解析的代价。好消息是大部分安全机制都是可以由用户修改配置来enable或者disable,有相当的灵活性。
这几天在帮助Connections的客户配置edge reverse proxy,下面是目前使用到的全部配置列表(安装了Blogs,dogear和Activities):
ServerInit C:\Progra~1\IBM\edge\cp\lib\plugins\mod_rewrite\mod_rw.dll:modrw_init Transmogrifier
Transmogrifier C:\Progra~1\IBM\edge\cp\lib\plugins\mod_rewrite\mod_rw.dll:modrw_open:modrw_write:modrw_close:modrw_error
SSLEnable On
SendRevProxyName yes
Enable PUT
Enable DELETE
Map /blogs/* /connections/blogs/*
Map /dogear/* /connections/dogear/*
Map /activities/* /connections/activities/*
JunctionRewrite on
Proxy /connections/* http://wasserver/* :80
Proxy /connections/* https://wasserver/*:443
ReversePass http://wasserver/* http://myserver.com/connections/*
ReversePass https://wasserver/* https://myserver.com/connections/*
JunctionReplaceUrlPrefix http://wasserver/* http://myserver.com/connections/*
JunctionReplaceUrlPrefix https://wasserver/* https://myserver.com/connections/*
MaxContentLengthBuffer 5M
KeyRing C:\Progra~1\IBM\key.kdb
KeyRingStash C:\Progra~1\IBM\key.sth
最后两项的key database文件需要利用ikeyman导入WebSphere for IBM HTTP Server (IHS) plugins的证书以建立edge server和IHS之间的SSL连接。
此文专为搜索引擎供稿。
过去的三个星期,是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方面也会有相当程度的改进与提高,这些工作目前都在紧张的进行中,不久就能看到阶段性成果。
桌面应用软件的安装和部署从未如此复杂过,更不要谈企业环境下的生产系统了。多年前,电脑城里卖的“装机一条龙”是尝试解决普通用户电脑软件安装配置的草根尝试,这种来自于人民大众的D版拼盘儿,尤其是某些精心配置的的盘片,极大的简化了非专业用户的电脑使用过程。毕竟大众电脑是给人炒股、聊天、看片、发帖、读新闻的工具。除此之外的额外操作,都是多余(甚至危险的)。
现在吹的是一条龙2.0的风,Google pack, XAMPP, Net Tools, Eclipse callisto, 还有水木社区新软版每年年末CD大礼包等等等等,大家都在努力解决软件的统一安装与管理,可安装的组件从可执行文件、链接库,发展到重型运行时(GTK+, JRE, .NET framework…)、依赖软件包等,安装和部署从产品级别上升到offering级别。软件已经复杂到专业人员都不能一手掌控,而需要依赖简化了的installer来解决安装,尤其是配置问题 - 即便是专家如我的人,也不愿意多花时间来解决两个软件在配置文件上的冲突问题。
极简的UI、留给专业用户把玩的隐藏参数、人气旺盛的论坛和社区,自然,还要有一个不错的产品,构成了成功的范式。现在,需要把这些实现这些范式的集合有机的组合在一起,实现个人系统的高效整合。
腾讯赢了官司,输了人心。
最近注册了饭否,刚才在浏览抓虾的时候顺便绑定了饭否的帐号,如此一来便可以直接在抓虾分享link到饭否了。饭否的短信发帖的功能看上去很方便,似乎还有每天50条上限的短信推送。
我最近在寻找可以定制内容聚合(包括各类feeds,包括我的私人email,新浪新闻的首页,博客的新评论,论坛的新帖子等),并把这些东西mashup后给我发一组短信的在线服务。另外我还可以定义短信发送的有效期,比如说仅在出门在外的时候才发送。在被聚合的内容提供商API开放的前提下,甚至还可以短信回邮件,回帖,回博。
如果GPRS足够便宜的话,我该做的是换掉6030,弄个大屏幕的手机:不是要运行手机上安装的RSS reader或者Web浏览器,而是一个mobile VNC client,用它连上在家里或者办公室的台式机,做平时可以在PC上做的一切事情。如果网速足够快,这个大手机不再需要高速的CPU或者大内存,它应该就是一个固化了vnc client的大屏幕手机而已。
再以后,会有人提供在线的VMWare的hosting服务,每个人可以把自己的台式机部署到远程的VMWare上,支持各类终端设备的远程访问…
Scheduler和Best4C是Lenovo 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的投资都貌似正常不需要理由(有也不告诉你,嘿嘿)。反正这个世道等什么都想清楚才开始撸袖子干话,恐怕只能轮到点剩汤喝了。
Lotus Connections 1.0.1昨日发布,最主要功能是增加了多语言支持,另外的feature见Ted的博客。
需要提到一个特别的小插曲,是有关产品名称的翻译问题。在Connections 1.0.1的翻译测试进入尾声的时候,有关Connections中五大模块的翻译问题还在讨论之中。当看到到简体和繁体中文的参考翻译后,我们觉得有必要和翻译中心的同事进行沟通,原因是”Profiles”的中文翻译在简、繁体下分别被翻译成了“概要文件”和“設定檔”。这是因为在其他IBM产品中,“profile”基本上是配置、参数管理的意思,但作为一个产品名的翻译,“概要文件”和“設定檔”没有反映出产品的真实功能。IBM翻译中心使用了translation memory进行语汇管理,以保证产品文档翻译的前后统一,但从产品推广和帮助用户理解的角度出发,这次是有必要做出修改的。
最终我们选择了”人员”和“人員資訊”作为Lotus Connections Profiles的中文翻译。另外,对”feed“的翻译也做了修改,从“馈源”改成了”订阅源“(这个翻译是本人的贡献,呵呵)。而“Dogear”最终保留了原名,其实个人觉得用“共享书签”会更好。

自Windows 95开始,微软对系统图标做了大规模的改进,包括真彩色支持、重新设计的3D图标等,到Windows 2000和XP后,几乎所有shell32.dll中图标都被更新过多次。
今天在安装毛泽东字体的时候发现这个爷爷级对话框,用过Windows 3.1的应该会有很深的印象- 文件夹图标、硬盘、光盘图标。细心一点可以发现对话框左上角用的是缺省图标,可以推测这个对话框的代码可能连续使用了超过10年的时间而没做任何修改。不清楚Vista里面有没有更新。
上周五(8月17日),IBM正式发布了Lotus Notes/Domino 8.0。至此,从今年4月份至今,IBM Lotus品牌下连续发布了Lotus Sametime 7.5.1, Lotus Connections 1.0, Lotus Quicker 8和Lotus Notes/Domino 8四个重要的产品升级(其中Connections 1.0是全新产品)。
Lotus产品线也启用了一套全新图标,下面是来自Alan Lepofsky (IBM)博客上的Lotus产品logo:
从左到右分别是:Notes, Sametime, Quickr, Connections
成立已满25年的Lotus软件,在融入IBM 12年后其产品线已经随着时代进步发生了多次重大调整。从98年并购Ubique获得Sametime的早期雏形;到实现从Lotus 1-2-3向IBM Productivity Tools的迁移;到进入企业社会软件市场。作为最近10年间产品转型的技术推动力,Web, Java/J2EE, Eclipse等技术和开放标准是促进Lotus产品升级换代的重要因素。
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,最简单的理解(本人理解)就是用脚本语言开发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。
自打5月份正式成为“张江男”后,工作午餐比以前在城里的时候变化了很多。在瑞安上班,每天12点出来在淮海路觅食,基本就是巴士、醉美、大旺、干锅居、黑土地、2001、真功夫。。。一顿饭连吃带走路,差不多要一个小时。
在887号,午餐问题变得很简单:一共三个园区食堂,6、8、10块三种组合,一般11点半吃饭(12点后,有两个食堂基本上以及没什么菜了),20分钟后可以回到办公室。加班的同事,也可以很方便的吃到晚餐,不过要在6点前去食堂。
另外,887号还提供早餐,8点开门,9点半前基本还能吃到,有包子、馒头、花卷、鸡蛋、烧卖、稀饭和豆浆等,价格很便宜。我现在每天都在公司吃早餐,质量比在黄陂南路地铁黛玲特买羊角包改善了很多。
隆重一点,可以去张江地铁。开车的话可以凭在地铁商圈内的消费凭证免费停车(肯德基只能1个小时内有效,其他店3个小时)。