天津大学长江学者包建民——世界第一台96通道毛细管电泳仪推出者兼二手故障仪器购置者

20 03 2009年

包建民,1993年美国普渡大学理学博士,1993-2000年美国宝洁医药公司科学家和资深科学家,2000-2003年(或2000-2004年)任美国赛万事公司资深科学家、分析研发部经理。2002年任教育部长江学者,2003年起任天津大学教授、博士生导师、药学院副院长,兼任河北亿能普药业有限公司总经理

加盟美国宝洁公司后,“在宝洁建立了第一个微芯片实验室,并与多所大学和公司合作,推出了两种(紫外和LIF)世界上第一台商业化的含96根毛细管的高效多通道毛细管电泳系统”。

2000年4月24日,SpectruMedix公司宣布向宝洁医药公司出售该公司生产的世界上第一台具有96根毛细管的电泳仪,型号为HTS9610。

2002年和2003年,包建民作为作者之一,发表用HTS9610电泳仪进行实验分析的两篇论文。

2008年12月24日,作者9852qi在新语丝举报天津大学药学院购进国外淘汰二手仪器不能正常运行。

2009年3月2日,作者9852qi称,天津大学调查发现,药学院购进的四台二手仪器中,三台仪器因故障闲置至今,未能通过验收、未能正常使用,其中包括价值48.7万的Spectrumedix 96通道毛细管电泳仪。据称,包建民一手操办购置此批二手设备,“涉嫌以次充好,骗取差价,中饱私囊,侵吞公款”。

2009年3月4日,天津大学网站公布《07/08年度大型仪器效益评价清单(2009.03.4)》,其中包括设备编号为20064990的美国Spectrumedix公司HTS9610型号96通道毛细管电泳仪,单价459453.77,领用人为包建民。

包建民购进、领用的这台二手故障仪器,不会是他当年在宝洁与“多所大学和公司合作推出”、并由宝洁购进、并在宝洁做实验发表论文的那个世界第一台96通道毛细管电泳仪吧?



再说谭浩强大师的“赋值表达式”

14 03 2009年

俺开始跟着谭浩强大师的《C程序设计》第三版开始学习C语言了。学到现在,发现的最精彩的部分,是第3章第9节第4小节“赋值表达式”(第63、64页)。

谭大师在这一小节指出“常变量不能作左值,因为常变量不能被赋值”。张云楼同学满面疑惑举手提问:“有常量、有变量,什么叫常变量呢?”听说张同学跟谭大师学了10几年的C语言,从第一版学到第三版,眼看着本书发行量从300万长到1000万,怎么连这写得是最清楚的一句话都不明白呢?赶紧翻书,发现这也怪不得张同学:本书只讲了常量、变量,除本小节这句话外根本就没“常变量”这仨字;突然蹦出来个新名词新概念,同学们摸不着头脑啊。课外俺又考证了一番,本书第二版还没有“常变量”一说,但在2004年和2006年谭大师分别出了一本《C++程序设计》和《C++面向对象程序设计》,其中有一节“用const定义常变量”。看来,这个“常变量”果然就是eng老师课外指导张同学时说的constant variable,即用const标识符所标识的、初始化后程序不能改变其值的变量。好像K&R(The C Programming Language)第二版至少在10年前(也有可能在20余年前第二版初次发行的1988年,未能考证)就按ANSI C标准全面讲述了这个const标识符;相比之下,好像谭大师有点儿与时俱进得太慢了吧?稍微“俱进”了一下,又有点儿太急躁太粗糙了吧?

更精彩的还是本小节那些赋值表达式的例子,那简直是在英勇地挑战脆弱的C编译器的容忍极限。除了据“注意版本”同学说“有些版本的编译器确实是支持”、但不幸不被本书推荐上机用的Turbo C 2.0、Turbo C++ 3.0、Visual C++中的C编译器支持、eng老师怀疑只有“谭氏版”编译器才支持、挑战极限可能没有成功的表达式(a=3*5)=4*3外,最令人惊叹的是谭大师给出了求解步骤的这个表达式:a+=a-=a*a。多亏了谭大师的循循善诱,否则这个表达式非把俺搞“精分”了不可。

据谭大师书中说,类似的这些赋值表达式还是“C语言灵活性的一种表现。在第6章中将进一步看到这种应用及其优越性”。可是,俺那个程序员邻居告诉俺,说是这种晦涩的表达式正是编程大忌;有一回他卖弄了一下,写了个类似这样的表达式,竟然还被人骂作变态。

原本简单明了的赋值表达式竟然可以复杂到这种程度,比“茴”字的四种写法都难。感谢谭大师,让俺终于明白了为什么很多同学都说C语言很难学,更让俺为学完了本小节而感到无比的骄傲。



也说谭浩强大师的低级错误

13 03 2009年

张云楼同学说:

《C程序设计》例3.3说在TurboC上32767+1没有得到32768,得到的是-32768。然后作者说“将变量b改成long型就可以得到预期结果32768了”,敢问谭教授上机试过没有,我试过了,不行。

“注意版本”同学驳斥说:

例1作者试过了TC几个版本,编译模式估计是缺省的,改过吗?感觉现在用TC很少了吧,近20年前流行的。我相信教材作者至少在某个版本上试验过,很可能后来版本更新了引起问题。版本兼容性问题在计算机界普遍存在。

谭大师在《C程序设计》(2005年第三版第44页)说:

在Turbo C和Turbo C++中,一个int型的变量的最大允许值为32767,如果再加1,会出现什么情况?
例3.3 整型数据的溢出
#include <stdio.h>
main()
{
  int a,b;
  a=32767;
  b=a+1;
  printf(”%d, %d\n”, a, b);
}
运行结果为:
32767, -32768
……将变量b改成long型就可得到预期结果32768。

经Turbo C 2.01实验(其他16位编译系统应有同样结果),证明谭大师所说的“将变量b改成long型就可得到预期结果32768”错误。

将变量b改成long型,输出仍为-32768。原因是printf函数按%d两字节int型整数格式,取传递过来的b的4字节中的低两字节(二进制1000000000000000,对应-32768)输出。

再将printf中与b对应的格式符%d改为%ld,输出仍为-32768。原因是b=a+1一句中,a+1运算按编译器默认的两字节整数进行,结果为二进制1000000000000000(对应-32768);赋值给b时,b的高两字节将进行符号位扩展(而非填0),b的值为二进制11111111111111111000000000000000(对应4字节long型整数-32768)。因此,还必须将a+1中的a或1强制转换或设置为long型,使a+1运算按4字节整数进行,才能得到预期结果32768。

以下是修改后的程序(三处修改缺一不可):
#include <stdio.h>
main()
{
  int a;
  long b;
  a=32767;
  b=(long)a+1; /* or b=a+1L */
  printf(”%d, %ld\n”, a, b);
}

谭大师所谓“将变量b改成long型就可得到预期结果32768”不可能在任何一个16位C编译系统上成功(而在32位系统上,根本不会出现例3.3的溢出问题),因此,谭大师显然如张云楼同学所猜测没有上机试过;也不存在“注意版本”同学所谓的“版本更新了引起问题”。

注:可在http://books.google.com中搜索“整型数据的溢出”,即可一瞻谭大师大作风采(封面上赫然印着“发行700万册记录”)。

补记:
在网上找了个谭浩强著《C程序设计》第二版扫描版(未知出版年份版次),错误与google books上的第三版(2005年清华大学出版社)相同。又据无敌法王提供的第二版(2004年9月第53次印刷),相应表述已改正为:“将变量a和b改成long型,并按%ld格式输出,就可得到预期的结果32768”。据此推测,此书第三版是在错误的第二版老版本上“升级”的,在这方面,确如“注意版本”同学所说,“版本更新了引起问题”。

补记2:
无敌法王亲自前往新华书店核实,本书第三版第22次印刷中错误已纠正为:
“将变量b改成long型(同时将a+1改成a+1L,并按%ld格式输出),就可得到预期结果32768。”