《易中天品三国》

   
今天终于听完了全套的《易中天品三国》,这是我最喜欢的《百家讲坛》专题之一。喜欢它的原因之一是我非常欣赏易中天先生的历史观:分析评价一个历史人物的
时候应该避免做道德评价,而是进行科学分析。换句话说,研究历史是为了以史为鉴,吸取前人的经验教训。因此,就不应该把一个人历史上的功过归结为其道德的
善恶,而是更应该关注社会制度对人的影响。

    
我从小受的教育,是用道德评价的方法分析一个人:好人干好事;坏人干坏事。小时候的每一个故事,每一部电影都在重复着同一个的模式:好人从里到外都美的像
朵花;而坏人不但鼻歪眼斜,并且一定要坏事做绝。我当时心目中的头号坏蛋是蒋介石,我以为中国所有的苦难都是他造成的,提起他恨得牙根都痒痒。当得知西
安事变中,好人一伙把蒋介石抓住又放掉之后,我简直懊恼的要吐血(大概跟林冲听说宋江放走高俅时的感觉差不多)。如果当时把这个第一反派一杀,咱们不是早
十三年就解放了?现在想来,那时候还真幼稚。不过毕竟年龄小嘛,容易被愚弄的。
    那些人如此钟情于给大家灌输道德来评价的观点,说明这个观点的确有可利用的价值:
    首先,它确实可以用在某些人身上。即便是最黑暗时代,也可能会找出那么一两个不同流合污的人,再加上后世点缀,他们俨然就成了完美无暇的君子。他们的所作的一切只能用道德高尚来解释。相反也有那么些人不论如何管制,都铁了心与社会为敌。
    其次,利用道德标准,可以轻易的为重大失误找到替罪羊。比如说:不是我们打不过日本人,而是因为汉奸太多。当汉奸就是因为他们的道德败坏;说他们道德败坏,是因为他们当了汉奸。当官的贪污受贿,也是因为他们道德差。

   
我的看法是这样的,不论啥环境下都高尚的人也许是有的。但是道德是很难衡量和评价的东西,真善与伪善往往只有到了最后关头才分辨的出来,而到那时一
切就已经晚了。再有,绝对高尚和绝对卑鄙的人都是极其罕见的,刨去感情因素,着两种人所具有的都是“变态”的人格。我们不能指望这些极其个别的人对社会
产生太大作用。
    人性天生就有恶的一面,一旦环境适合,它就会滋生膨胀。任何一个人,在特定环境下,都有可能被内心恶的一面占据,成为汉奸、贪官等反面人物。能阻止这一切发生的就只有合理的社会制度,一个让有能力做恶的人受到制约的制度。
    倾向于培养奴才的国家,每个被培养出来的奴才都是优秀的汉奸候选人;相反若是一个国家的公民天天跟自己的政府示威抗议,自然更不会屈服于外来统治。
   
有一次,看到一个主帖,说是某贪官被抓。回帖的一片骂声,不过里面也有个为贪官抱不平的,责问大家:“你们凭啥骂啊,换了你们当官,说不定更贪呢”。如果换了是我当官,我是会造福一方百姓呢,还是也只顾着自己捞钱呢?我想,那就完全取决于当时的官员选拔制度和监督机制了。如果,我的官位是上司给的,我肯定是
按照他的意思办事;如果,官位要选民来选,那就麻烦了一些,毕竟讨好一大群人比只讨好一个人要困难得多。如果只有上司监督我的行为,我想贪污还是比较容易
的,大不了我把弄来的钱分大头给他,自己只留小份;如果新闻媒体,人民群众都能来监督我的话,那只好老老实实干活,别的啥也别想了。

《生活随笔》目录

广告

创建了一个 msn 的群给 LabVIEW

从来没用过QQ,据说它的群功能很好用,但是msn没这个功能。后来有个第三方公司和msn合作,提供了类似群的功能。我听说后就跑上去给LabVIEW建了一个。可是当时没几个人,所以一直都没用。现在有半年过去了,再跑上去一看,成员居然多起来了。而且经常有人发言,不像以前那样冷清了。
把 msngroup7773@hotmail.com 加为 messenger 好友,就可以加入这个群了。

小白鼠

    在没有特殊上下文的时候,小白鼠就是 White Mouse。“小”就不用特别翻译出来了。顺便说一句,我今天搞清楚了 Mouse 和 Rat 的区别。这是两类不同的老鼠,主要外在区别就是体型不一样:Mouse 是小老鼠,Rat 是大老鼠。我这辈子接触的老鼠不多,对它们该有多大,也没概念。所以,估计下次再遇到一只老鼠,恐怕还是不能确定它属于 Mouse 还是 Rat。但是,我自己又总结了一条使用这两个词的规律,那就是:如果是可爱的老鼠,那就要用 Mouse,比如米老鼠、小白鼠;如果令人讨厌的老鼠,比如形容贪官、小偷等的就要用 Rat。

    再来说小白鼠,有时候它是这样用的:比如你照着菜谱做了一个蛋糕出来,可是看着它黑乎乎、烂兮兮模样自己都不敢下嘴。这时候你就会拉你身边最好欺负的人来当小白鼠。英语里,那个人不叫 White Mouse,而是有个固定的俗语称谓:Guinea Pig(荷兰猪)。
    荷兰猪这个词也挺有意思的。英语里叫它“几内亚猪”、中文叫它“荷兰猪”,也搞不清它是哪来的,而且它显然不是猪。

英语学习》目录

遇到热情的美国母女二人

    刚才和几个同事去一家叫 Salt Lick
的店吃烤肉。我们几个研究菜单时候的迷惑表情被旁边一位阿姨看到了,她和她女儿刚吃好饭正准备走。于是主动的跑上来给我们介绍这家店的特色菜,顺带又开始
介绍德州风情。而她的女儿更是现身说法,指着身上的衣服,给我们介绍了一下德州特色服饰。女儿大约20出头,绝对是难得一见的大美女,身材、皮肤都非常棒;而母亲看上去也相当年轻,完全不像一般美国人老的那么比较快。不是她自己说他们是母女,我以为她才三十多呢。
    我们聊了几分钟,母女俩说了白白。俺们几个都没想到会有美女主动跑来搭讪
的,一个劲赞叹美国人民的热情。谁知过了几分钟,母女俩又拿了个收银条跑回来了。说是替我们买了本店的特色甜点,邀请我们品尝一下,我们更是感激不尽了。后来上菜的时候发现她们母女请我们吃得是一大个核桃派,要三十多美金呢。这美国人民对待陌生人也太有好点了吧。
    其实昨天我也遇到了一个好人。昨晚去一家店里换煤气罐,由于不知道咋个换发,我直接就把煤气罐拎到收银台去了。结果正好被一个刚结完帐美国老大爷看到,他说煤气罐不是在这里换的,接着拎起它就走。一直帮我把它拿到正确的换领地方,又跟我交代了几句才走。老大爷的腿脚明显没我利索,看他这么热情我都不知道说啥好了。

    从小就被告知,中国人重礼仪,富有人情味;资本主义社会的人际关系是尔虞我诈,冷酷无情的。而我这几年的亲身体验却总是恰恰相反,比如感触比较深的:在美国开车的,看见老远有个人走过来,都会停下来,等行人过去再继续开。几辆汽车同时开到没有指示灯的路口,都会停下来,谦让一番。在上海,就不用我说了,不论开车也好,走路也好,比得就是谁胆大不怕死。当然,遇到开宝马的,你一定不要企图跟他比了。
    在上海,如果有个不认识美女突然跑来说要请你吃块价格不菲的蛋糕,还没鬼迷心窍的人恐怕都不敢受用吧;超市里突然蹦出个陌生人说要帮你拎包,你又会咋想呢?

    中国历来有儒家传统,相信人性本善;而美国则信奉人性本恶,主张人性和权力必须受到制约。不过无论他们主张如何,现实生活里,我体验更多的却是美国社会中人性善的体现远多于中国社会。
    要我说,每个人都天生的知道趋利避害,每个人的人性中都具有善恶两面。人要适应社会生活,就必须把符合这个社会的一面展现出来,并且压抑相反的另一面。归根结底,是社会制度决定了人的善恶倾向。公正、法治的社会,驱使每个人都向善,以获得社会的认同这样才能更好的生活;而人治的社会则恰恰相反。

《生活随笔》目录

调用动态链接库 4 – 结构型参数的设置

https://lv.qizhen.xyz/external_call_dll

    C 语言中的结构(struct),在一些简单情况下,可以和 LabVIEW 中的 Cluster 相对应。但是,对于比较复杂的情况,LabVIEW 中的 Cluster 要做适当调整,才能够对应起来。

    在讨论结构型参数的映射前,一定要先了解一下字节对齐的概念。我在这里只做一个简单说明,详细内容可以查找相关的专题文章。
    C 语言中的一个结构 typedef struct { char a; int b} MyStct;  结构中的元素a所在的地址是:0xAAAA0000,b 的存放地址是与结构的字节对齐设置相关的。如果采用1字节对齐,b是紧挨着a存放的,b的地址就是:0xAAAA0001;如果采用2字节对齐,b的存放地址是紧挨着a的第一个偶数地址,也就是:0xAAAA0002;如果采用4字节对齐,b的存放地址是紧挨着a的第一个4整数倍地址,也就是:0xAAAA0004……
    C 语言的字节对齐数可以由 #pragma pack 指令指定,也可以在工程属性里指定。但是 LabVIEW 的 Cluster 只能是1字节对齐的。因此,C 语言中,非1字节对齐的结构与Cluster对应时,一定要做适当调整。比如,结构 typedef struct { char a; int b} MyStct;  是2字节对齐的,那么,对应的LabVIEW Cluster 第一个元素还应该是 I8 型的a,但是,不能紧接着就放b,因为C语言中,b的起始地址不是紧挨着a的,他们中间还有一个无意义的数据,C的结构体虽然表现不出来,LabVIEW中却需要把它考虑进去。
    如果是自己编写一个DLL给LabVIEW使用,为了方便,可以把C代码中所有的结构都设为1字节对齐。

    C 语言的结构中如果还嵌套了数组,是不能直接对应于LabVIEW中嵌套了数组的Cluster的。在LabVIEW中,只能把数组的元素都拆开来放在Cluster中。

    下面是一些对应的实例:

 

C LabVIEW

#pragma pack (1)
typedef struct { char a; int b} MyStct;
MyStct* testStruct;

#pragma pack (2)
typedef struct { char a; int b} MyStct;
MyStct* testStruct;

#pragma pack (4)
typedef struct { char a; int b} MyStct;
MyStct* testStruct;

#pragma pack (1)
typedef struct { char a; char* str; int b} MyStct;
MyStct* testStruct;

#pragma pack (1)
typedef struct { char a; char str[5]; int b} MyStct;
MyStct* testStruct;

    上面这个表中有两点需要注意的:
    一是,表格中的第四个例子,结构中含有一个指针,LabVIEW中的Cluster只能用一个U32数值(32位系统上,64位系统上使用U64)来表示指针的地址。不能把指针指向的内容放到Cluser中去。后面的章节再讨论当我们在LabVIEW中得到了一个数据的地址后,如何从这个地址中把数据拿出来。
    第二,上面C语言中声明的 testStruct 变量,是指向结构的指针。就是说C函数的变量类型为结构的指针时,才能在LabVIEW中使用Cluster与之对应。CLN节点的配置面板中,没有一个专门的参数类型叫做“struct”或者“Cluster”,选择“Adapt to Type”就可以了。
    如果参数的类型就是结构而非指针,考虑到C函数参数的压栈顺序,把一个结构体作为参数传给函数,等价于把结构中每个元素分别作为参数传递给函数。下面是一个例子:

 

输入/输出

输入

输出或兼作输入输出

C语言声明

typedef struct{int left; int top;} Position;
long TestStructure(Position inPos);

typedef struct{int left; int top;} Position;
long TestStructure(Position *pos);

LabVIEW
中的配置

 

 

LabVIEW
的使用

 

 

 《我和 LabVIEW》目录

调用动态链接库 3 – 简单数据类型参数的设置

    复杂问题先从简单地说起,在DLL和LabVIEW之间传递参数,最常用的三种数据类型是:数值类型、字符串、数值型数组。这几种类型的参数配置起来还是比较简单的。

1. 数值类型
    LabVIEW 多种不同精度的数值类型与C语言中的数值类型的匹配是相当直观的,比如 4-byte Single 对应 C 语言中的 float。LabVIEW 自带的例子“LabVIEW 8.5\examples\dll\data passing\Call Native Code.llb”中详细的列出了简单数据类型在 LabVIEW 与 C 之间的对应关系。
    C 语言中经常把指针,或者数据的地址在函数间传递。在32位操作系统中,可以使用int32数值来表示指针。因此,当需要在LabVIEW中传递指针数据时,可以使用I32或U32数值类型来表示这个地址类型的数据。但是,64位的程序中,数据的地址只能使用I64或U64来表示。这样,如果一个调用了DLL函数的VI,并且函数参数中有地址型数据,使用固定数据类型的数值来表示地址,就要准备两份代码。解决方法就是使用 LabVIEW 中的新的数据类型 Pointer-sized Integer。这个数据类型的长度在不同的平台上会自动使用32位或64位长度。
    如果在C语言函数参数声明中有const关键字,可以选中Constant选项。

输入/输出

输入

输出或兼作输入输出

C语言声明

float red;

float* red;

LabVIEW
中的配置

LabVIEW
的使用

2. 布尔类型
    布尔类型在 DLL 函数和 LabVIEW VI 之间传递没有专有的数据类型,是利用数值类型来传递的。输入时先把布尔值转变为数值,在传递给DLL函数;输出时再把数值转为布尔值。

输入/输出

输入

输出或兼作输入输出

C语言声明

bool red;

bool* red;

LabVIEW
中的配置

LabVIEW
的使用

3. 数值型数组
    对于数组的传递,LabVIEW 只支持 C 数据类型中的数值型数组。传递数组类型需要注意的的是“Array Format”要选择“Array Data Pointer”。这个设置中还有其他两个选项,像这种带有“Handle”的参数类型都是表示LabVIEW定义的特殊类型的。在第三方的DLL中不会使用到。
    数组参数作为输出值时,要记得为输出的数组数据开辟空间。开辟数据空间的方法有两种:
    第一种方法,创建一个长度满足要求的数组,作为初始值传递给参数,输出数的数据就会被放置在输入数组的所在的内存空间内。
    第二种方法是直接在参数配置面板上进行设置。在 Minimum size 中写入一个固定的数值,LabVIEW 就会按此大小为输出的数组开辟空间。在 Minimum size 中选择函数的其它数值参数,而不是固定数值。这样 LabVIEW 会按照当时被选择的参数的值的大小来开辟空间。

输入/输出

输入

输出或兼作输入输出

C语言声明

int values[];

int values[];

LabVIEW
中的配置

LabVIEW
的使用

4. 字符串类型
    字符串与使用与数组是非常类似的,实际上在C语言中字符串就是一个I8数组。

输入/输出

输入

输出或兼作输入输出

C语言声明

char* name;

char* name;

LabVIEW
中的配置

LabVIEW
的使用

《我和 LabVIEW》目录

LabVIEW新特性预览:利用贝塞尔曲线提高程序运行效率

    目前 LabVIEW 在程序框图上的连线或横或竖,没有斜向连的,更不会出现曲线。如果需要连接的两个端点不在同一高度上,则数据连线会出现数个90度的直角弯。这种连线方式虽然整洁,但却会严重影响 LabVIEW 的运行速度。
    LabVIEW 运行时,数据在连线上流动。每当遇到转弯时,数据流速就必须减缓,否则高速运动产生的离心力会把数据从数据线上甩出去。这同汽车转直角弯时必须刹车是一个道理。

    一个叫做 MGI 的网站今天公布了下一版本 LabVIEW 的一个重要新特性:LabVIEW 将在程序框图上使用圆滑曲线代替所有的直角转弯。这样,数据再需要改变流向的时候,由于转弯半径大大增加,离心力相对较低,数据可以保持高速流过转弯的曲线。
    新特性的原理图如下:

 
直角转弯方式迫使数据在转弯处降低流速;
而新的曲线转弯方式允许数据保持高速流动。

    看完这篇报道,你是为 LabVIEW 的革新振奋不已,还是对其改进效果将信将疑呢?祝贺你,April Fool:) 这其实是原载于http://www.mooregoodideas.com/ 的一个愚人节笑话。

《我和LabVIEW》