A Tricky Problem of IBM Directory Server v6.1

I’ve been tortured by this LDAP server for a few days and finally get over it. The scenario is based on Windows XP.
To get IDS running, you have to remove any DB2 instances you installed before. It seems that it can only work with the DB2 instance it provides. For a pre-installed DB2 V9.5 instance, the IDS will report that “GLPSRV064E Failed to initialize be_config”. Secondly, when you create your LDAP instance, use your main OS account (the one you use to log in the system). Otherwise you may get errors like ‘cannot write to slapd.pid’.

软件工程已死?

注:本文是一篇译文,原文为著名的博客作家Jeff Atwood在其博客codinghorror上发表。原文链接在这里。我订阅的英文博客不多,主要就是Jeff Atwood和Joel Spolsky。凑巧的是,两个人还合伙办了一个网站,stackoverflow,一个技术类的问题网站,高质量的回答不少,不像某网站都是”顶”、”接分”之类。
我一向认为,对软件项目加注过多的控制和度量本身完全没有意义。说的就是你,PSP/TSP,看谁呢。A/FR,这些真正代表了什么?哦,他们就是一些数字,真的不代表什么。我们总希望开发过程更加透明,让领导们可以对进度一目了然,并可以控制项目。但实际上他们什么也做不了,只能盯着越来越近的项目期限拼命催促程序员加班。软件真的是一门工程吗?也许开发一个公司的主页是吧,但更多的时候,软件开发就像大型手工作坊。前阵子有一本书叫做《走出软件作坊》,可我怎么看软件开发就像手工作坊呢?
对于软件开发,我个人主张从实践入手。大公司先不谈,对于深陷软件危机的小作坊,就像文中提到的这篇文章所言,别去追什么流程,做好SCM,CI和Tracking,这才是他们看得见摸得着的有效招数。而这些东西,都有很好的开源软件。而日常的控制,做一个Scrum Daily就足够了。
小愤了一把,下面是译文:
当我读到Tom Demarco这篇在IEEE杂志上发表的新文章(pdf)的时候,被彻底雷到了。你也来看看:

我一本早期有关度量的书:, Controlling Software Projects: Management, Measurement, and Estimates [1986] ,在许多需要协同的软件项目的度量工作和计划方面起了一些帮助。我不断反思,书中的建议在当时是否正确,在现在是否还有用,并且这些度量是否还是成功的软件开发所一定要拥有的?我现在的答案分别是不,不,还是不。
我逐渐意识到,软件工程的时代一去不复返了
软件开发现在是而且将来也总是带有一些实验性质的。虽然实际的软件构建并不一定都是实验,但概念上总是。这是我们现在所关注的地方,我们也一直都在关注这点。

如果你被雷焦了,别害怕。我也是。如果想缓解一下读过上面摘要的心情,我强烈推荐扫一扫两页的原文
Tom DeMarco是当前软件工业立最受尊重的权威之一,合著有大作《人件》以及很多软件项目管理类的经典像《与熊共舞》。从Tom这么一位有才干、经验和影响力的大牛这么直接的说软件工程已死
嗯,就像基努里维斯说过,whoa
事情很严重,吓死人。
不过,这对我来说也是种释然。压在我胸口的大石头终于被拿走了。我可以宣布最近五到十年来作为一个软件开发者逐渐意识到,我们干的是手工艺,不是工程。我可以大声地、不愧疚地、胸有成竹地这么宣布。
我认为Jole Spolsky,我的合伙人,最近也有类似的顿悟。他在How Hard Could It Be?: The Unproven Path里这么写道:

对于如何开发软件,我自己有非常强烈的主见,但我通常不说出来。这是件好事,因为随着组织逐渐成型,基本上所有的原则都会被抛弃。
不管这意味着什么,我始终要找到答案。我废弃了七个有关业务和软件工程的原则,没什么坏事发生。我过去是不是太过于小心了?也许我打算尽量不莽撞一点因为这仅仅是我的一个编外项目而不是主业。这次的经验告诉我们,当你在构造一个全新的软件时,可以考虑把那些警告都扔一边去。

是的,我还可以再列出一堆关于你现在手头项目细节的软件工程警告出来:类型(性命攸关,显然),规模(Google那样大的,很自然的),受众(每天好几百万,明显),等等。
但我不打算这么做。
DeMarco似乎在说的–至少,我就是这么说的–控制永远是软件开发项目里遥不可及的幻影。如果你想推动你的项目,唯一靠谱的办法就是练就一身更好的软件开发功夫,更好的技艺和职业素质。
天天渴望着修炼技艺,构建对他们自己意义重大的软件的人们,也许就是会取得最后成功的人们。一起成功的还有他们的软件。
其他所有的东西都是扯淡。

简评 《天朝的崩溃》

首先,此天朝非彼天朝,牛同学看到标题以为是国内的非法出版物。

对于鸦片战争的了解,除了小学时看过的《上下五千年》和《近代八十年》以外,还有《鸦片战争演义》和电影《鸦片战争》,剩下的就是历史课本和其他零星的摘要描述。之前最近一次接触鸦片战争的历史,应该是去年十一的下关静海寺之旅(南京条约签订地),里面有个南京条约纪念馆,所描述的内容基本也和历史课本没有多少差别。然而这本《天朝的崩溃》,基本把我前20年关于鸦片战争的理解重新刷洗了一遍。不为其有多少翻案,而为其翔实的数据,丰富的引证以及客观的评述而折服。当我们脱离了狭隘的民族主义历史观和弱者受欺凌的悲情来看160多年前的硝烟和谈判桌,终于发现历史原来不是像我们一直接受灌输的那样,黑白分明,正义和邪恶势不两立。

全书从”琦善卖国论”谈起,点评了之前的主流史观的矛盾–在总体上把鸦片战争的失败归结于中国的落后,具体上归结于琦善等人的投降卖国;总体上承认大清无力挽回局势,具体上又认定林则徐等主战派代表了正确的方向,只要他们的主张得以实施,中国就有救。在绪论中,作者还提出,历史学的基本价值在于”以史为鉴”,坚持对自我历史的不断批判,不论是妥协者还是抵抗者,是避免它重蹈历史覆辙的坚实保证。

作者在第一章就从军事上给出了清军必败的理由。以往我们总是很难理解为什么远道而来区区几千人十几条船就打开了有百万军队国度的大门,在这里就可以找到答案:装备差,兵力分散,素质低下,战术落后。英军能够数千人一起用,但清军只能分散把守各个海口;清军的调兵经常要从四川贵州陕西湖北来,路途虽不比英军遥远,但走路显然没有坐船舒服,以逸待劳基本也谈不上。此外还有装备上以及作战思想的巨大落后。

林则徐因战前”虎门销烟”战后抗英而成为民族英雄。尽管如此,他的战争准备严重不足,敌情判断出现了严重失误,制敌方略不合实际。一开始吃准英国不会轻易开战,后来认为即使开战也不会如此之快,再后来在战场上的战术也不对头。虽然他有一些洋务思想的萌芽,但已经跟不上历史的要求。”鸦片战争给中国提出的使命是近代化,偏离这一轨道就不可能真正的制夷,反有可能偾事。林则徐没有认识到这一点是他的错误,尽管他那对抗的姿态是可以表扬的。”后人也常把鸦片战争与后来东京湾的黑船做比较,分析为什么列强的出现在两个文化相近的东方国家造成了如此相反的结果。可以知道的是,清廷在战后没有进行任何的反省,对外政策依然为天朝对待番夷的”羁縻”,”清军战士的鲜血白流了”。

那些历史的”罪人”、”投降派”,如琦善、伊里布、牛鉴、奕山、杨芳、奕经、耆英等等,大多数一开始都是”力剿”的主战派。只不过有些人,如伊里布,还没打就知道必败,所以一直避免正面冲突,以妥协为主;有些尝过了英国人的苦头,才纷纷主和。而道光帝就夹在这帮官员当中,时而摇摆在”剿抚”之间,追求的是少花钱,早点了断。

战争的过程也与我印象中的历史不符。记得小时候看到英军第一次进攻厦门时,因闽浙总督邓廷桢早有准备,被迫北上攻打定海,颇为家乡自豪了一番。今次看此书外加一些其他材料,才了解到英军一开始的目标就是定海,在厦门无功而返大半是清军的邀功。而在战争的第二阶段,即使是城防最坚固的厦门石壁炮台(那时胡里山炮台还没建),也只让英军付出了死亡1人,受伤16人的代价,耗时仅3-4个小时。放足球来讲,基本算是”半场教学比赛”。

书里有句话,”知识给人力量,愚昧也给人力量,有时是更大的力量”。让我想到了《1984》里的名言:”Freedom is slavery, Ignorance is power”.

(author: marshall)

推荐有关塑料标识的文章

很久没写blog,先不写技术帖。
在Google Reader上看到一篇觉得很有用的文章,关于塑料标识的。大家在使用塑料制品如微波炉餐盒、矿泉水瓶时是否经常发现上面印着一个由3个箭头框起来的数字?这个小小的标识里还是有大文章的。
文章来源于这里。另外还有参考文献一篇。关于第二种,即HPED,两篇文章有少许不同看法,但差别不大。由于上海自来水水质普遍不好,很多居民饮用楼下制水机售的水,而打水的瓶子,一般就是农夫山泉一加仑(4.5L左右)的白瓶子或者桶装水的桶。前者为2号材料HDPE,后者应该大多为7号材料PC(现在已经禁止使用PET作为桶装水桶了,不排除有非法分子以次充好)。刚才检查了一下,我们打水用2号HDPE,微波炉盒子只有一个有标识为5号材料PP,其他要么没有环保标识,要么有标识没编号(某熊,就是你的饭盒,饭盒底部有些硬块,我怀疑是不是由于受热变形导致的,要考虑换一个鸟)。没有想到的是,我天天盛热水害怕有毒的味全果汁的小瓶子居然也是5号材料PP,看来这么多人拿来当水杯不是没有道理的。
下面就全文转载了:

塑料,我们几乎每天无时无刻都在接触着。当我们清晨起床,穿上拖鞋,端起脸盆,拿着洗面乳、牙膏牙刷去洗漱;接下来早餐吃点啥好呢?喝点奶,吃几片面包,还是喝豆浆吃油条?然后出门,打卡上车,坐在公交车的座位上或者拉着把手去上班……然后,还有很多很多。然而,虽然我们对塑料都很熟悉,但是塑料的标识大家可都知道?如果使用不当的话,很可能会危及到你的生命。下面就让我们一起来看看这些标识都代表着什么,以后可要多加注意了!

塑料,我们几乎每天无时无刻都在接触着。当我们清晨起床,穿上拖鞋,端起脸盆,拿着洗面乳、牙膏牙刷去洗漱;接下来早餐吃点啥好呢?喝点奶,吃几片面包,还是喝豆浆吃油条?然后出门,打卡上车,坐在公交车的座位上或者拉着把手去上班……然后,还有很多很多。然而,虽然我们对塑料都很熟悉,但是塑料的标识大家可都知道?如果使用不当的话,很可能会危及到你的生命。下面就让我们一起来看看这些标识都代表着什么,以后可要多加注意了!

7号 PC 其它类
常见水壶、太空杯、奶瓶,百货公司常用这样材质的水杯当赠品。这种塑料很容易释放出有毒的物质双酚A,对人体有害。使用时不要加热,不要在阳光下直晒。大家注意了,以后要少用了!

6号PS 聚苯乙烯
常见碗装泡面盒、快餐盒。不能放进微波炉中,以免因温度过高而释出化学物。装酸(如柳橙汁)、碱性物质后,会分解出致癌物质。避免用快餐盒打包滚烫的食物,别用微波炉煮碗装方便面。

5号PP 聚丙烯
常见豆浆瓶、优酪乳瓶、果汁饮料瓶、微波炉餐盒。熔点高达167℃,是唯一可以放进微波炉的塑料盒,可在小心清洁后重复使用。需要注意,有些微波炉餐盒,盒体以5号PP制造,但盒盖却以4号PE制造,由于PE不能抵受高温,故不能与盒体一并放进微波炉。

4号PE 聚乙烯
常见保鲜膜、塑料膜等。高温时有有害物质产生,有毒物随食物进入人体后,可能引起乳腺癌、新生儿先天缺陷等疾病。注意保鲜膜别进微波炉!


3号PVC 聚氯乙烯 常见雨衣、建材、塑料膜、塑料盒等。可塑性优良,价钱便宜,故使用很普遍,只能耐热81℃.高温时容易有不好的物质产生,很少被用于食品包装。难清洗易残留,不要循环使用,若装饮品不要购买。

2号HDPE 高密度聚乙烯 常见白色药瓶、清洁用品、沐浴产品。不要再用来做为水杯,或者用来做储物容器装其他物品。清洁不彻底,不要循环使用。

1号PET 聚对苯二甲酸乙二醇脂

常见矿泉水瓶、碳酸饮料瓶等。耐热至70℃易变形,有对人体有害的物质融出。1号塑料品用了10个月后,可能释放出致癌物DEHP。不能放在汽车内晒太阳;不要装酒、油等物质。

矿泉水瓶的底部一般都有一个带箭头的三角型,三角型里面有一个数字。

一般矿泉水瓶子,标示1;农夫山泉4升装,标示2;泡茶的塑料耐热杯,标示5。

阿联酋一个十二岁的女童,因为连续十六个月使用同一个矿泉水瓶,她得了癌病。瓶里面含一种叫做PET的塑料材质,用一次是安全的,如果你因节俭或方便而重复使用,就有致癌危机。

Adding HTTP response header in j_security_check

In WebSphere, the login stuff is handled by the /j_security_check servlet if configured to use federated repository, which is at the top of the WAS invocation chain and there’s on way to intercept the invocation in web.xml. But the login module (which is based on JAAS, Java Authentication & Authorization Service) itself provides a full mechanism of interception and chaining. Besides the open standard JAAS, IBM also develops an proprietary extenstion mechanism named TAI(Trust Association Interceptor). Advanced authentication in WebSphere Application Serveris a good article about this along with a full example. And it’s the main source of this wiki page. It is strongly recommended to read the above link if you want to find out more. Another good reference is the IBM redbook “Websphere Application Server V6.1 Security Handbook”.
WebSphere defines 4 system login configuration that are used in specific siturations related to security:

  • WEB_INBOUND
  • RMI_INBOUND
  • RMI_OUTBOUND
  • DEFAULT

The picture above shows a simplified view of the authentication flow for the WEB_INBOUND configuration:
Web_INBOUND flow
So our custom login module can be placed at the bottom of the chain.
The custom login module can use callbacks to obtain information relevant to the authentication from the envirnoment. In our case, we need to obtain an HttpServletResponse instance in order to populate the P3P header attirbute. There are several callbacks that are available for WEB_INBOUND:

  • NameCallback
  • PasswordCallback
  • WSCredTokenCallbackImpl
  • WSTokenHolderCallback
  • WSServletRequestCallback
  • WSServletResponseCallback
  • WSAppContextCallback

There’s an demostrative example of populating P3P headers in the attachments. There are a few tips while developing and deploying the module:

  • The java version of the byte code should be compliant with WebSphere runtime environment
  • The WebSphere jar file which contains the WSServletResponseCallback lies in WS_ROOT/runtimes/com.ibm.ws.admin.client_6.1.0.jar
  • The output class file should be packed in a jar file and placed in WS_ROOT/lib/ext for WebSphere can reach it globally

Deploy

  1. A similar procedure is also presented in http://www.ibm.com/developerworks/websphere/techjournal/0508_benantar/0508_benantar.html with snapshots.
  2. Open your WebSphere Administrative Console -> Security -> Secure administration, applications, and infrastructure
  3. In the “Authentication” fieldset on the right, follow “Java Authentication Authorization Service” -> “System Logins” -> “WEB_INBOUND” -> “JAAS Login Modules”
  4. Click on “New” button, then input the classname of your custom login module. In this case is “demo.P3PAfterLoginModule”. Check “Use login module proxy”. Save the custom module.
  5. You can adjust the order of the execution of your custom modules. Since our module is intended for the last one, it is not necessary to do this step.
  6. Flush your modification to the configuration file and restart WebSphere.

iBatis中得到数据库自动生成值的方法

iBatis使用SqlMapClient.insert()执行插入语句,这个方法返回一个Object,代表插入的主键值。但如果想得到这个值,必须在<insert>元素中进行另外的配置。在iBatis中文文档的20页中有提到,也可以直接搜索”selectKey”。
主键值的获取支持两种方式,前获取和后获取,如中文文档中例子写的那样。前获取需要把selectkey元素放在前面,后获取反之。


    
        SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL
    
    insert into PRODUCT (PRD_ID,PRD_DESCRIPTION)  values (#id#,#description#)



    insert into PRODUCT (PRD_DESCRIPTION) values (#description#)
    
        SELECT @@IDENTITY AS ID
    

DB2的资料比较少,我试了很多次才搞出来,类似于SQL Server,对于使用了IDENTITY的Column:


	INSERT INTO PRODUCT  (PRD_DESCRIPTION) VALUES (#description#)
	
		SELECT distinct IDENTITY_VAL_LOCAL()  AS ID FROM PRODUCT
	

keyProperty属性必须对应于SQL语句中SELECT出来的Column Alias,在本例中均为“id”