Icing on the cake.

    这是今天在信里看到的一句成语。Icing 是蛋糕外面的那层糖衣,想起蛋糕已经可以流口水了,再加一层糖衣那就更别提多馋人了。所以这个短语翻译成中文就是“锦上添花”。
    比如,同办公室的小王跑来对你说:“今天老板升我做高级工程师啦:)”看你反应不大,又说:“还加了我的薪:D”。虽然这时候你肯定在想:“这年头就是马屁精吃香”,不过还是可以假装替他开心,说:“Wow! Icing on the cake!”

英语学习

编辑

数据流驱动的编程语言

    在面向对象的编程思想出现以前,文本编程语言主要采用的是面向过程的编程方法。面向过程有时候也被称为控制流驱动的编程方法。想我以前编程序,经常要先设计一个流程图,然后,照着流程图翻译成 C 代码就行了。

    LabVIEW 程序是数据流驱动的,这与面向过程的程序还是比较相似的,但是也有一些区别。
    面向过程的程序执行起来,就只有一条线,代码按照设计好的顺序一条一条执行下去。代码中的某一条语句,即便它的输入条件都已经被满足,它也要等到它前面的代码都被执行完后,才能被运行。
    数据有时候不仅是在一条线上流动:数据线可能有分叉。而一个程序上也可能同时有多个数据在不同的线上流动。程序可以被扩展成一张网(有时候 LabVIEW 程序的框图线连得乱七八糟,就像一张网:)。一个节点运行完,数据从这个节点输出,会同时被传给所有用到它的其它节点去。一个节点只要它所有的输入都已经准备好了,就会被执行,不需要等待其它节点执行完。这样一来,经常有多个节点同时运行着的,LabVIEW 会自动把他们放到不同的线程中去运行。这就是数据流驱动的程序的一大特性:是自动多线程运行的。一般的文本编程语言,除非有显示的调用开辟新线程函数,否则所有代码都在同一个线程内顺序执行。

    自动多线程,为编程人员带来的不少方便。但是,由于多线程程序更为复杂,可能导致出错的隐患更多,LabVIEW 不得不做一些其它语言不需要做的工作,来保证用户可以方便的用 LabVIEW 开发出安全高效的程序。
    多线程程序中最常见的问题就是多个线程访问同一资源或内存时发生冲突。先以内存中的数据为例,程序运行在单线程状态下,写进这块内存的数据是什么,下次读出来一定就是你写进去的。而多线程状态下就不一定了,说不定在读写之间,内存被别的线程修改了,读出来的数据就是错误的。一般的文本语言不需要编译器来考虑如何防止用户做出类似的错误操作,因为他们默认情况下只会使用一个线程。多线程一定是在用户有意识开辟的。既然是有意识开辟的,用户在使用多线程的时候就也会留心类似的不安全问题。LabVIEW 却不能像其它语言编译器一样,不去考虑这个问题,LabVIEW 用户会在无意识的状态下就编写出多线程的程序来。如果用 LabVIEW 写出来的程序总是出错,LabVIEW 就会渐渐失去客户。
     LabVIEW 采取的保护措施之一就是它的传参方式。

相关文章:
    我和 LabVIEW

员工们的囚徒困境

    几个月前看了一本 James Miller 写的《Game Theory at Work》,一直想写读后感的,可是一直没肯花时间。现在总算有心情写了。

    这本书看了之后收获相当大,理解了许多以前不知道的概念。比如说以前看电影《美丽心灵》,听说了纳什均衡这么个概念,可是一直不知道它是什么意思,现在总算懂了。
    还有些现象生活中常见,却一直没有仔细全面对其思考过,现在看了书,理解又深了一个层次。比如说逆向选择原理:追女生的时候,如果你猴急猴急得,那十有八九会失败;如果你若即若离的,那可能就要论到对方猴急了。找工作也是,如果你面试时,表现的特别向往这个公司,面试官就会怀疑你的能力;反过来,是公司死乞百赖非要你去,你就会后悔自己工资开低了。
    不过,博弈论中最著名的一条原理应当是囚徒困境,很多经济方面的书也会专门讲解这个原理。

一、囚徒困境

    先引用经济学家曼昆(N. Gregory Mankiw)的《经济学原理 Principles of Economics》中的描述说明一下啥叫囚徒困境:

    警方有充足的证据证实邦妮(Bonnie)和克莱德(Clyde)犯有非法持有枪支的轻罪,如果这项罪名成立,他们将被判入狱1年。警方同时怀疑这两人犯有抢劫银行的重罪,但缺乏相应的铁证。于是警方将两人分别关在隔离的审讯室进行审讯。警方对嫌疑人进行了相同的讯问:“因非法持有枪支,现在就可以判你1年徒刑。如果你承认抢劫银行并指控你的同伙,你将被豁免诉讼并得到释放。你的同伙将因此坐牢20年。但是,如果你们两人都坦白罪行,因为我们不需要你的呈堂证词并省去审判的费用,你将被判8年徒刑。”(注意,美国法律允许犯罪嫌疑人主动承认控罪以换取较轻的刑罚。)
    邦妮和克莱德该怎么办呢?我们假设着两个罪犯都是自私和理性的。
    先考虑邦妮的决定。她是这样考虑的,“我不知道克莱德会怎样做。如果他保持沉默,我的最佳策略是坦白,这样我可以马上得到释放而不用坐1年的牢房。如果他坦白,我最好的策略还是坦白,我将坐牢8年而不用坐牢20年。因此,无论克莱德怎样做,我最好坦白。”
    克莱德也会有与邦妮同样的想法:无论邦尼怎么选择,坦白都是我最好的选择。因此两个罪犯都会坦白并揭发对方,一起在牢里呆上8年。如果他们两个都保持沉默,只要1年就会出去,但是理性的博弈使他们共同选择了对他们来说最坏的结局。

    囚徒困境在日常生活中其实非常普遍。比如说一个小镇上有两家生产饮料的公司,如果他们两个都不做广告,那么他们平分市场,都会赚到一大笔利润。可是因为每家公司都会认为,做广告吸引客户使自己的最优选择,所以两家公司都会做广告。最后他们还是评分市场,但利润都交给了广告商,谁也没赚到钱。

二、摆脱囚徒困境

    当我们遇到相似的情形时,还是有可能从囚徒困境中摆脱出来的。签订协定就是最好的摆脱囚徒困境的方法。比如说两个小朋友干了坏事,被老师叫去之前通常会约定好,谁都不许出卖对方。这样老师就调查不出他们更多的不了记录,对两个人的惩罚都会比较轻。
    那么邦妮和克莱德可不可以在被抓之前先协商好,都不招供呢。当然可以,但是这种协商,并不会影响他们在被审讯的时候所做的决策。因为虽然有了协议,但邦妮还是不敢确信克莱德是否会出卖自己,并且不论克莱德是否被判协约,自己出卖克莱德肯定是有好处的。反过来克莱德是这么想的,所以到最后他俩还是会同时出卖对方。

    由此可见,仅仅签订协约是没用的——没有约束力的协议就是一张废纸。对违反协约的行为要有所惩罚,协约才能执行下去。两个小朋友不会出卖对方是因为如果这次我出卖了你,你下次就会反过来告我的状。这是一种非常有效的惩罚,迫使两个小朋友相互袒护。邦妮和克莱德恐怕再也没有机会一起进监狱了,所以他们不用担心另一方以后会报复自己的叛徒行为。当然如果他们俩属于某个帮派那就不一样了,帮派通常会对叛徒做出严厉惩罚,比如灭其全家。所以帮派成员有时是会宁死不屈的。
    加入帮派毕竟还是特例,通常对于类似的多次博弈,对违约者最有效的惩罚就是,下一次对方也会违约。

    如果一个小镇政府有一个为期一年的采购计划,每个月采购一批饮料。如果小镇上的两家饮料公司的报价一致,那么政府就把订单一分为二。否则,政府会把更多的订单给报价低的那个公司。显然,这两家公司都报出同样的高价,才符合其利益。在这种多次博弈中,他们会联合起来出高价吗?如果会,那么在12次博弈中他们会合作几次呢?
    加入他们开始签订了合约,都报出一个比较高的价位。不过,显然最后一次他们不需要遵守合约,因为反正以后没有采购计划了,违约也不会有什么坏处。如果是这样,倒数第二次也不需要遵守合约,因为不论怎样倒数第一次都是要违约的,那就不存在是否有惩罚的问题。所以倒推下来,一次合约都不用遵守。两家公司最后可能还是两败俱伤。

    只有博弈次数是无限的,或者双方都不确定博弈还要确定几次,这种摆脱囚徒困境的合约在有约束力。

三、让员工们陷入囚徒困境

    假如你是一个事业部门的经理,手下有七八个业务员。有什么好办法让他们拼命干活呢?看完了上面的文字,你一定已经想到了一个好办法——让他们陷入囚徒困境。一旦每个员工都觉得,拼命工作,无条件的加班加点是自己的最优选择,老板的日子就舒心了。
    让员工们陷入这种困境的方法很多。比如:
    威逼——安员工业绩给他们打分评级,告诉他们,得分最差的扣工资;
    利诱——得分最高的给奖金;
    煽风点火——对小王说:“小王啊,你知道我们公司要提拔一批新的管理人员,我是很看好你的。不过你看老张,都拖家带口的得了,最近还经常干到半夜,也在叫着劲呢。你现在没有家庭负担,可不能比他落后了,这样我也好在老板那给你说好话。”然后对老张说:“你看人家小王,天天工作到半夜,才毕业没多久,业绩已经有声有色了。你可是老员工了,如果成绩还比不上新来的,让我怎么向老板推荐你啊?”
    总之,这一套手段耍下来,如果运用得好,员工能都应该攀比着加班加点呢吧!

    也不一定!尤其是如果你接管的部门成立已久,员工们都非常熟悉有一定交情的时候,这套手段就不那么灵验了。工资是按月领的,员工们在进行的是无法预期次数的多次博弈。有理性的员工很快就会发现,听老板的话只会让自己更辛苦。渐渐的他们就会达成默契,从囚徒困境中摆脱出来:原来什么样还是什么样,能偷懒就偷懒。奖金轮流拿;拿了奖金的要大出血,安抚住其他没拿到奖金的。
    这时候,你会想到,找一个非理性的人来,扰乱员工们的默契。于是招聘一个任劳任怨,加班加点的蠢驴到办公室,如果别人不努力,每个月的奖金就都给蠢驴。但这样做,还是不见得有成效。因为其他员工会孤立蠢驴,作为对他的惩罚,这就大大增加了蠢驴的博弈成本。过不了多久,蠢驴就会发现,或者加入到其它同事的阵营里去;或者,到处树敌,得到的奖金还补偿不了损失,而且失去了大家的帮助,工作很难进行,奖金还是拿不了多久。于是呼,蠢驴进化成野牛、狐狸或者其他什么动物,囚徒困境还是没出现。
    让员工去跟不太容易与他们达成默契或合约的人博弈,就可以让他们在囚徒困境中多陷一会。比如,让员工以小组的方式相互竞赛,就比对个体的激励更有效一些。甚至可以让自己的部门和处在异地的同性质部门竞争,这样的两个部门人员因为没什在一起相处的机会,是很难达成协议的。

    我们一直讨论的都是在参与博弈的人都是理性(自私、对物质的追求先于对精神的追求)的情况下会出现的结果。不过,人都会暂时丧失理智,或者不完全“理智”的时候。在这种状态下,人会做出利他的举动。传教、树立偶像、宣扬仇恨等等,都会让人失去博弈论中所定义的理性状态。有些管理者可能会希望被管理者是非理性的,这样就降低了控制了他们的难度,比如更容易让他们陷入囚徒困境。但实际上容易控制不等于容易管理。非理性人会做出不可预期的举动,大大增加管理成本。最好的管理方法,还是让所有人都保持理智,所有的事都按制度进行。

四、制定薪水的策略

    一个公司里,不同部门,不同职位的人工资有可能差距很大的。不过我们这里讨论一下,如何给同样一批员工定工资。
    以销售人员为例(销售人员的业绩好坏最容易评定,适合举例),一个业务部有那么七八个工作时间差不多的销售人员,如何给他们定工资呢?

    大家所有人工资全一样显然是不行的,咱么国家以前就这样。《经济学原理》第四条就是人们会对激励做出反应。没有了浮动的薪水做激励,大多数人都不会认真工作,企业的销售业绩也就不可能好到哪去。
    以相对业绩决定工资也不行。这个方法就是我们前面说的诱使员工陷入囚徒困境的方法。员工会达成默契,使这种薪金方案失去激励作用。

    那就只剩下工资与绝对业绩相关的新近策略上了。理想状况当然是薪水与业绩百分之百挂钩,比如薪水就是你销售额的10%。你卖了1块钱,工资就是一毛;卖了100万,工资就是10万。这种策略也有缺点,就是员工的风险太大,人总是尽量回避风险的。
    如果有两家公司,一家说每月给你1万元,另一家说工资不定,可能一毛没有也可能一个月有10万。你会选择哪一家?想想我们这些人为什么还要在这里看老板脸色,不去自己开公司就知道答案了。主要原因不是我们的水平比老板差,而是我们不愿意承担风险。尽管自己开公司收入可能会多几十几百倍,但是只要还存在开不了张的风险,就足以吓退我们了。
    对于一个准备开始做销售的新人,他是不会轻易接受薪水与业绩百分之百挂钩这种方案的。所以大多公司可能还是才有这种方案:有一个基本工资,在基本工资之外,还有与销售额相关的提成。
    不过,对于有自信可以不会效益太差的老员工,薪水与业绩百分之百挂钩对他们的激励会更有效。这和开公司只要挺过一段时间,就不会愿意去给别人打工了原因是相同的。

生活随笔

编辑

发现一个新的搜索网站

    网站名叫“有道 Youdao”:http://www.yodao.com/
    它有两个比较有特色的搜索栏目。一个是博客搜索,在搜到相关博客同时,还会提供出博客的一些统计数据。
    比如这是本博客的统计数据:http://blog.yodao.com/search?q=url:http%3A%2F%2Fruanqizhen.spaces.live.com%2F&t=b&lq=labview&keyfrom=blog.blog

    另一个是海量辞典,做技术翻译比金山词霸更有用。我以前还写过一篇文章关于如何在网上搜索翻译的,本以为有了这个网站,那篇文章就过时了。但是刚才试了一下,这个海量辞典还不是非常智能,看来我的土办法还能再用上一阵子:)

    提到搜索,Google是老大,一般性的网页搜索可以不去考虑其它搜索引擎了。不过这也不表示其它搜索网站就没法活了。Google 也不是把所有方面都做到了最好。其它搜索网站,搞搞有特色的东西,在某些搜索功能上超过Google也很正常。

G 语言

    G 语言是图形化编程语言(Graphical Programing Language)的缩写。LabVIEW 有的时候也被叫做 G 语言。我们可以这样理解:LabVIEW 是一个开发环境(类似的如 Visual Studio 也是一个开发环境),在这个环境下编写的代码就是 G 语言代码(类似的如在 Visual Studio 下写出的C代码)。

    目前在中国,很多工程师认为 LabVIEW 是一个应用在工业测控领域的应用软件,并不理解他是一个编程语言。原因有两个,首先是因为它和以往其它的编程语言差距太大,第一次看到它的人倒是更容易联想到电路板布线、工业总线配置软件等;其次是因为 LabVIEW 在中国使用的年头不多,大多数用户仅用到了 LabVIEW 的一小部分功能,还没有真正体验到 LabVIEW 的强大。
    既然是一门编程语言,在使用 LabVIEW 的时候,就应该按照程序设计的思想来解决问题。举一个例子来说明如果用程序设计的思想来解决问题:

    我们需要解决的问题是求两个正整数的最大公约数,这是一个非常常见的编程例子。
    用 LabVIEW 来解决这个问题,应当与用其他语言求解这个问体的思路是一致的。按照程序设计的一般方法,解决这个问题可以三个步骤:

    第一:确定问题的需求,给出需求的详细说明。对于这个求最大公约数的问题,我们在这一步需要做的就是写出程序输入输出的详细定义。如果是用普通的文本语言编程,你至少应该以文档的方式吧问题需求记录下来。但是 LabVIEW 程序员在这一步有个更方便的设计方法——直接在 VI 的前面板上定义程序输入输出:程序需要两个输入值(a, b),用 Numeric control 代表,一个输出(x)用 indicator 代表。输入要求是正整数,我们可以把 Numeric control 的数据类型设置为 U32,并在这个控件的属性中设置最小值为1。再为 VI 和它每个控件添加上帮助信息,VI 的前面板就可以用户提供一个详细的 VI 的功能描述以及接口定义。

    第二:设计解决问题的算法。一个问题通常不只会有一种解决方法(算法),比如说我们的求最大公约数问题,你可以采用穷举算法,把1到a之间所有的整数都试一遍,然后找到那个最大的公约数;也可以使用g.c.d.算法
    多数情况下这一步骤和具体的语言环境无关,比如说我们的问题不论采用哪种语言编写,g.c.d.算法的效率都高于穷举法。但是某些时候可能要考虑 G 语言不同与文本语言的特性,在 G 语言下使用不同于其他语言的算法。比如要遍历一棵树,可以使用递归的算法,也可以使用循环的算法。在C语言下,一般会选择递归的算法,因为递归算法的思维方式更自然,更容易掌握,实现起来也比较方便;但是在 G 语言下,递归的实现并不那么容易,效率也比较低,所以在 G 语言中,选择循环的算法更加适合。
    对于我们要解决求最大公约数问题,我们还是选用g.c.d.算法,它的运算过程如下:
        Step1: If (a mod b == 0) goto Step3; else goto Step2;
        Step2: (a, b) = (b, a mod b); goto Step1;
        Step3: x=a; return;

    第三:在 LabVIEW 下实现设计好的算法。G 语言之所以被称之为图形化的编程语言,并不仅仅是因为它的程序又图形化的界面(前面板),最本质的原因是因为它的代码也是通过画图的方式来编写的(程序框图)。
    针对本例,可以使用 while 循环,a 和 b 分别用循环上的两对移位寄存器表示。在循环体内首先判断 a 是否被 b 整除,如果是,结束循环;否则把 b 和 a mod b 赋给两个移位寄存器,进入下一次循环。

    图形化编程语言是数据流驱动(以后再解释)的,与一般文本编程语言的过程驱动机制有很大差别,因而在程序设计的思路上也与文本编程语言有所区别。尤其是有过文本编程经验的程序员开始使用 LabVIEW 的时候,会感觉 LabVIEW 缺失了很多文本语言常用的功能,比如使用局部变量、跳出循环等等,因而 LabVIEW 用起来不是太方便。另外 LabVIEW 编写出来的的代码连线乱七八糟,造成程序阅读和维护的困难。不过这些问题其实不能算是 LabVIEW 本身的问题,主要是由于编程者还没有掌握 G 语言的编程思想造成的。
    LabVIEW 虽然不能覆盖所有文本语言的优点,但它具有自己的特色。在编写与工业领域设计、测量、控制等相关的程序或系统时,其开发效率大大高于其它语言。
    在 LabVIEW 中可以为代码添加图文并茂的注释,再加上人类对图形的识别速度远远超过对文本的分析速度,一个优秀程序员编写的 G 语言代码的可读性要高于文本语言一个层次。

相关文章:
    我和 LabVIEW

编辑

谷歌拼音输入法

    前几天,早上刚到公司,旁边的 Google 粉丝就对我们宣布,Google 推出拼音输入法了。我一向很欣赏 Google 的产品。所以马上要来试用。
    当初搜狗推出拼音输入法的时候我的眼睛就为之一亮。词库与网络上的搜索频率相关联,这个创新真的是很让人激动。只可惜我一向是使用整句输入的,搜狗在这方面做得不好,因此我并没有换用它。我一直盼望着有种输入法可以把即时更新词库和整句输入的功能结合起来,现在终于等到了:)

试用了几天Google输入法,感觉真的很不错,赞他这个输入法的同时,也使我有了一些想法。

一、整句拼音输入法的历史

    我从一开始有整句输入的工具开始,就一直依赖于这种风格的输入法。先后试用过五六种整句拼音输入法。拼音输入法这东西,基本不可能直接拿它来卖钱,但开发整句输入法的难度却是相当大的。个人或者几个联合起来的爱好者基本上没有能力进行开发。比较好用的整句输入法,基本都是一些商业公司的的副产品。
    最早一个我用了比较久的拼音输入法是欧姆龙公司开发的“拼音王95”。欧姆龙公司公司据我所知主要是生产电子产品的,常会见到他们的传感器、医疗仪器等,可是不知道他们怎么会想到开发了一款拼音输入法。但是后来再也没看到“拼音王95”的升级产品,估计欧姆龙公司最终放弃了在这方面的投入,应该是没有在这款拼音输入法上得到什么收益。
    后来的“智能狂拼”从各方面都优于“拼音王95”,我于是改换“智能狂拼”。我最近又到开发“智能狂拼”的中文之星公司的网站上浏览了一下,感觉这个公司已经半死不活了,显然他也没在拼音输入法上捞到什么钱。
    等到有了“微软拼音2003”,我就换用了微软拼音。我感觉微软拼音在整句输入正确率上比以往几个输入法都高。而且在与Windows的耦合度,使用的方便程度上都远远超出了其他公司的产品。之后直到前几天再也没有发现过更好的整句拼音输入法。但是拼音输入法在微软公司的地位显然比较低,这款输入法多年来很少更新,词库一直跟不上潮流。所以,以聊天为主的用户一般是不大喜欢这个输入法的。如果词库可以经常根据网上的最新数据更新,那就可以弥补了这个不足了。
    可以说自2003年以来,整句拼音输入法就一直没有什么实质上的革新了。直到最近,搜狗输入法把词频调整与网络搜索频率关联起来,才算是一个真正的创新。可惜搜狗只前进了一小步之后就把精力放到什么换皮肤上去了,真是本末倒置,恐怕这个输入法的前途不妙啊。
    相比之下,谷歌输入法一出来就具备了我最想要的几个功能,所以我当即就转向谷歌拼音了。谷歌拼音现在是第一个版本,功能算不上强大,并没有显著的胜过其他输入法。但是我一向对 Google 有信心,相信它很快就会做得更好。

    据说谷歌拼音输入法开发人员只有两个,而且开发花费的时间相当短。这与智能狂拼的开发形成了鲜明的对比,智能狂拼的第三个版本,我好早就看到有 beta 版了,不过等到最终发布似乎又间隔了有一两年。Google 能如此神速,大概跟 Google 的前期积累有关,Google 是做搜索引擎的,又聚集了那么多牛人,对语言的研究应当比其他公司更为深入。还有就是,很多部件可以是直接买来,或者先借用别人的–不是说他和搜狗输入法很像吗。

二、拼音输入法能赚钱吗?

    虽然我用过的前两个拼音输入法,看上去都没给他们的公司带来多少收益,谷歌拼音输入法却不一定。Google 是靠收集、搜索信息赚钱的,利用拼音输入法来帮助搜集、统计大家一天到晚在写些什么东西,这对他们来说或许是笔巨大财富。
    信息历来都是非常重要的资源,很多专业公司和人员都是靠垄断信息赚钱的。收集信息一向有利可图。现在网络如此发达,信息共享的成本虽然低了,但在浩如烟海的信息中找到自己真正想要的内容还是不那么容易的。所以现在除了信息收集以外,数据挖掘也成了一个赚钱的好渠道。
    目前收集、挖掘信息的最主要途径还是到网上去爬。但是这方法已经非常成熟了,近期恐怕很难再有大的突破。输入法倒是一个比较好的新途径。

    最近几个新的拼音输入法都比较吸引眼球,而且都是搜索网站公司做的。(已经发布的搜狗、谷歌和传说中的百度输入法)

三、即时利用网络上可搜集到的信息,是未来软件产品的一个趋势

    软件产品通过更便捷的利用网络上的资源,来为用户提供更好的服务应该是将来的一个趋势。具体的说,比如拼音输入法,通过查询网上的词汇搜索频率来及时调整自己的词频设置,这就为用户带来了更好的体验。或许其他的软件,比如翻译软件,也多年来一直没什么进展的,同样可以利用网络上的海量信息,查询已有的类似翻译,为需要翻译的语句找到更贴切自然的翻译结果。

    搜狗为了压制谷歌,说自己已经申请了吧网上信息和输入法关联的专利。如果这也可以,那差不多所有的工具都可以申请类似专利了,大家快去抢注啊!

四、拼音输入法还可以改进的地方

    针对拼音输入法,我觉得至少还有一些重大的改进可以做。首先是在线词库(句库),现在的输入法词库虽然具备了同步功能,但还是保存在本机上的。这样其规模就不可能做得太大。对于整句输入,这种规模的词库还是不够用。今后的输入法因该具备在线词库甚至是句库功能,用户在敲拼音的同时,到服务器上的超大词句库中寻找最为贴切的匹配。这样将使整句输入的正确率得到一个本质上的提高。
    谷歌输入法上的用户词库自动同步功能蛮好的,但是除了同自己的词库同步以外,还可以考虑建立一些共同的小组,用户可以选择和某些组织的词库也同步起来。比如一个公司内部的员工会用到相当多共同词汇,这个公司的员工可以都选测同步到一个帐号上去。某个行业也可以有自己的词库。

    这几天试用谷歌输入法,发现它竟然不具备语法分析的功能,因此还不能算是和智能狂拼、微软拼音等一样的完整整句输入法。希望它后续的版本能把这些功能完善起来。

生活随笔

 编辑

如何调试 LabVIEW 调用的DLL

 

问题(Frank):
    我用 Labwindow 编写了一个读文件的动态库, 即向动态库传递文件路径及文件名和某特定字符串,然后通个三个参数返回读到的值, 在labVIEW里调用该动态库,结果返回值老是显示打开文件失败, 不知错误出现在那里,另外在LabVIEW里如何调试确定传到动态库的参数是符合函数参数格式的呢?该函数在Labwindow里调试没有问题.请大侠指点迷津,不胜感激!

回答:
    我好久没有用过 CVI 了,计算机上也没有装,不过用 CVI 来调试,应该和用 VC 来调试原理是相同的,步骤也想类似。我就以 VC 为例说明一下。首先在 Debug 模式下 build 出一个 DLL 来。 (VC 7.1 即便是 release 模式下也可以设置断点,单步运行,但别的编译器不一定行。)然后用这个新的 Debug DLL 覆盖原有的DLL。

    关闭 LabVIEW,点击 VC 菜单 Debug->Start (F5)。因为工程生成的是不可以直接执行的 DLL 文件,这是 VC 会弹出一个对话框,问你用什么运行。选择浏览,然后找到 LabVIEW.exe。(这个可执行文件也可以在工程属性中 Debugging->Command 一栏设置。)之后,VC 就会把 LabVIEW 调用起来。

    在 VC 中设置好断点。在 LabVIEW 中运行想要调试的 VI。程序会停在你设置断点的地方。

技术文章和问题讨论

编辑