跳到主要内容

豆豆逛街

· 阅读需 1 分钟

最近每个周末都领豆豆去商店逛。

俺们坐的是地铁
DSC02236

从肇嘉浜路出发,一站就到徐家汇了。
DSC02229

玩具店里好东西真多啊。豆豆看上了一个“歌唱小精灵”,可惜这个玩具不适合小小宝。后来豆豆又看上人家的小钢琴了:
DSC02244

商店逛累了,豆豆跑去下馆子。饭馆名叫麦当劳,可惜里面没有豆豆能吃的东西。豆豆休淘气了一会儿就走了。
DSC02261

豆豆玩了一天,浑身是汗。回家赶快洗澡
DSC02190

洗完澡睡一觉,豆豆最近喜欢趴着睡
DSC02276

最近天热,豆豆在家里穿上肚兜了。
DSC02096

查看或添加留言

设计可调节大小的程序界面

· 阅读需 15 分钟

更新内容: https://labview.qizhen.xyz/

程序的界面应该有多大呢?如果程序可能会被很多用户使用,就难免会运行在各类尺寸的屏幕上。如果界面太大,小尺寸的显示屏就无法完全显示;如果界面太小,对于大显示屏来说又是一种浪费。从用户体验的角度考虑,最好程序的界面尺寸是可调的,用户可以选择适合自己的任意尺寸。

程序界面尺寸发生变化,界面上的控件也必须随之调整。控件跟随界面尺寸变化有两种方式:

一种是控件尺寸需要跟随调整的。数据量较大的控件,比如波形显示控件,表格,大文本框等,常常需要调整尺寸以获得尽量大的显示区域。

而有些控件的尺寸最好是固定的,比如按钮,选择框等控件。它们虽然不需要调整尺寸,但是当界面尺寸变化时,它们的位置可能需要调整以获得最佳界面布局。

我打算接下来几天比较一下各种动态调整界面布局的方法,帮助程序员选择最适合当前程序的方法。

窗格和分隔栏

每个VI有一个前面板(Panel),每个前面板又可以是由多个窗格(Pane)组成的。默认情况下,比如新建一个VI,这个VI的前面板就是有单个一个窗格组成的。由于大多数情况,每个面板只有一个窗格,以至于很多人都忽略了窗格的存在。但是在编程时,一定要意识到:LabVIEW程序中的控件是摆放在窗格上,而不是前面板上的;窗格才是摆放在前面板上的。

使用分隔栏可以在前面板上分割出更多的窗格来。分隔栏在控件选板“[xx风格]->Containers”中。分隔栏有横竖之分,可以把原有的方块按照不同方向分成两块。控件无论被放在哪个窗格里,对程序功能都没有影响,只对程序外观有影响。

当前面板的大小改变时,分隔栏也可以跟着移动。在分隔栏的鼠标右键菜单中可以设置一个状态栏跟随面板的哪个边沿一起移动,或者是按比例移动。

image3

在分隔栏的右键菜单最后两项用来设置分隔栏两侧窗格的一些属性。比如,界面划分成窗格后通常不需要显示窗格内的拖动条,在这里可以在这里找到相应设置的子菜单禁止其显示。

在分隔栏的属性也可以通过程序在运行状态下通过程序来设置。它算然不像控件那样在程序框图上有个接线端,但却仍然可以使用右键菜单创建它的属性节点和调用节点。有了这些属性和方法,就可以在程序中调整分隔栏的位置等属性了。比如下面这段程序可以从左到右挪动上图状态栏的位置。

image1

在程序运行时,用户仍然可以再界面上移动分隔栏。若不希望用户改变分隔栏位置,可以在分隔栏的右键菜单中选中“Lock”,这样分隔栏的位置就被锁定了。

分隔栏没有隐藏属性。若希望程序运行时看不到分隔栏,可以通过改变分隔栏颜色来达到“隐藏”的目的。首先,把分隔栏的风格改为经典“Classic”,然后把它的颜色染成与程序框图相同,这样就程序运行时就看不到分割栏了。顺便提一句,分隔栏两侧的窗格是可以有不同背景色的。

窗格也是没有隐藏属性的。在程序运行时需要隐藏某个窗格,只要调整它周围分隔栏的位置,把这个窗格缩起来就行了。

编程调整控件的位置尺寸等属性

在我自己编写过的VI中,用作界面的并不多:一个项目中,可能只有几个VI的界面需要显示给用户看,其它几百个VI都只用得到程序框图。由于涉及界面的VI并不多,但凡需要调整界面尺寸的,我都是使用了在程序中动态调整控件的尺寸与位置的方法。当程序接收到PaneSize这一事件后,根据新的界面的尺寸,重新计算每个控件的位置和大小。

比如下面这个程序界面包含一个波形图控件和一个停止按钮。

image2

当用户改变界面尺寸时,我们希望停止按钮始终停靠在界面右下角,而波形图控件则撑满剩下的界面空间。这些变化都可以通过编程来设置,示例程序如下:

image11

使用编程的方式使控件布局符合变化的界面尺寸,其优点是调整精确稳定。有些控件,比如仪表盘控件,只能通过这种编程的方式才能准确调整其大小。编程的缺点是较为繁琐。对于比较简单的界面,可以考虑使用分隔栏帮助界面布局,省去编程的繁琐。

等比例改变所有控件的尺寸

如果界面简单,只有一个窗格,当界面尺寸变化时,界面所有控件都可以按比例调整自身大小,则只要在VI属性中设置一条“按窗口大小缩放所有控件尺寸”就可以了。

image14

这样设置之后的效果是整个界面按比例缩放,所有的控件都一同变化。但是它并不太精确,反复调整界面尺寸几次,再回复到最初的大小,可能会发现有些控件尺寸有少许改变。这是因为前面板的尺寸和控件的尺寸都只能是整数,这样每次调整界面后,控件与前面板尺寸的比例都会有所变化。也就是说每次界面调整都会引入误差,累积误差还是比较明显的。

仅改变一个主控件的尺寸

大多数程序界面上,只需要有一个能够缩放的控件撑满屏幕就可以了,其它控件没必要调整,只要他们的布局不乱就好。

比如对于有一个波形图控件和一个停止按钮控件组成的界面,我们只需要波形图随界面尺寸的调整而变化。那么我们只要在这个控件右键菜单中选中它的“随方格缩放”属性就可以了。每个界面方格只能有一个控件被设置成随方格缩放。

被设置成这一属性的控件四个边沿的延长线都被深色标注出来了。当界面尺寸被调整时,控件四边到相应的VI前面板四边的距离是不变的,只有被这个四条深色实现包裹出来的矩形区域的尺寸会随界面一起变化。这样一来,可以保证程序的主控件随界面尺寸变化,而其它的控件位置保持稳定。

image17

若主控件有多个,比如说界面上有两个同等重要的波形控件,那么只要把两个主控件Group在一起。由多个控件绑成的组,在外观布局上的行为属性与单个的控件是类似的。把这个组设为“随窗格缩放”,组里的控件就都可以随界面尺寸一起变化了。

image6

当界面尺寸发生变化,上图中的“开始”和“停止”按钮之间的距离也会变动,因为他们一个靠近边界线左端,另一个靠近右端。若需要这两个按钮的相对距离保持不变,也把它们绑成一组就可以了。

借助分隔栏调整控件的位置与尺寸

对于比较复杂的界面,借助于分隔栏同样可以不编程就调整控件的尺寸和位置。我们用下面这样一个比较复杂的界面为例:

image5

这个界面包含五个控件,假设界面要求如下:水箱、油箱、波形图三个控件需按比例随界面尺寸调整,但他们三个控件之间的距离,以及它们距离界面边框的距离不能变化;信息框的长度随界面调整,但高度不变;停止按钮尺寸保持不变,且始终在界面右下角。

我们可以使用分隔栏来定位每个控件的位置。我为了方便在编辑时调整控件尺寸,以及确保控件尺寸和位置在多次调整界面大小后仍然准确,设置了较多的分隔栏。原则是让每个需调整尺寸的控件都有一个可以撑满的窗格。 之后,在控件的右键菜单中选择“Fit Control to Pane”,让它们的尺寸始终与窗格保持一致。

image9

水箱、油箱、波形图、信息四个控件都需要设置为撑满窗格,而停止按钮由于大小不变,不需要有此设置。

我做的例子是比较极端的情况,一般来说不设置这么多分隔栏也可以,只要能保持每个窗格内只有一个跟随界面调整的控件就可以了。

界面上各个控件变化方式不同,全在于分隔栏对齐方式的设置。下图是分隔栏对齐方式的设置:

image15

实际用户的界面一般不会希望显示这么多的分隔栏,可以参考前文介绍的分隔栏隐藏方法将其隐藏。

一些注意事项

有些控件不能改变尺寸

LabVIEW中并非所有的控件都大小可调。大多数尺寸固定的控件都是用来给子VI输入输出参数的,不会用到用户界面上。但也有一些会用于界面,尤其是一些系统风格的控件,比如单选框、复选框控件等。

image

有些控件必须保持长宽比

大多数LabVIEW控件可以分别设置它们的高度和宽度。但有一些控件,比如仪表盘、旋钮等,它们的形状是固定的,只能是正圆。也就是无论大小如何,长宽始终保持一比一。

对于这样的控件是不能使用“Scale Object with Pane”,“Fit Control to Pane”的,LabVIEW对于这类控件大小的自动调整存在bug。对于它们,只能使用编程的方式调整尺寸。

image

界面最小尺寸

无论采用哪种方式调整界面布局,最好都为界面设置一个最小尺寸。因为任何控件都不可能无限小,所以整个界面缩的太小对于用户也是没有意义的。

image

查看或添加留言

豆豆叫爸爸

· 阅读需 1 分钟

虽然豆豆早就能发出“爸”这个音了,但他一直不太爱说这个字。直到最近一个星期,他突然就喜欢上叫“爸爸”了,时不时就叫几声。难道是因为我最近哄他玩的很开心?豆豆也能发“妈”的音了,但也几乎不怎么说。周末我又心血来潮,让豆豆叫“Daddy”,他居然就daddy, daddy的叫起来了。豆豆妈在一旁嫉妒的不得了。

查看或添加留言

《寻路中国》读后感

· 阅读需 4 分钟

有一阵子没怎么读书了。最近找到了一个比较适合阅读的零散时间:上下班的地铁上。为了方便携带,我还特意买了一部Kindle(电纸书)。Kindle到手后,就随意在网上找了几部书来看。可能这本《寻路中国》是比较热门的新书,最先下载的几本书里就有它。

我看的是这本书的英文原版《Country Driving: A Journey Through China form Farm to Factory》,作者:Peter Hessler,这是我读过的第一部非科技类的英文原版书。科技类的书侧重介绍内容,词汇和语法都比较基础,即便英语水平不高,也较容易读懂。文艺类的书,语言本身也是看点之一,通常都比写得比较花哨,读起来难度就大了。还记得我大学那会,刚考过4级就以为自己可以阅读英文原著了,于是去书店随手买了一本,不幸却是《基督山伯爵》。回到寝室读了一页,一半的单词都不认识。我一下子就伤到了,从此再没读过英文原版小说。不过这本《Country Driving》属于纪实文学,比小说的语言朴素,没有太多文邹邹的修饰。而所写的故事又是发生在中国的,不存在文化差异,所以我读得还算比较顺畅。

《Country Driving》写的是一位美国作家在中国真实经历,就连书中的人物都是实名的。全书分三个部分:第一部分是作者两次沿着长城走向自驾游的见闻;第二部分记录了北京附近一户村民几年里的生活变化;最后一部分记录的是浙江一家民营工厂里工人们的生活。

书中翔实记载了村民和工人们的生活环境,经济收入,每日作息,乃至他们的心理活动,思想斗争等。我虽然生在中国,但也不曾接触过村民和农民工们的生活,所以读起来很有新鲜感。比如说中描述了一次村基层换届选举的过程:这种选举普通村民是没份参加的,但即便是党员也对现任的无能又腐败的村支书表示不满,企图另选他人。镇政府了解到这一情况后,派人到村里找党员逐个谈话,要求他们投票给现任支书。实际结果就是选举形同虚设。

外国人写中国的事,一大优点就是能够发现那些我们早已习以为常的不合理的地方吧。纵观全书,我不觉得作者对中国有偏见,但是他对于一些落后思想和制度的嘲讽还是非常辛辣的,不知道这些意味是否会在中文译本中体现出来。

查看或添加留言

中国人的起源

· 阅读需 5 分钟

据说汉族人中有一种独特的身体特征——复型小趾甲:即一只脚或双脚的小脚趾甲呈现分裂为左右两片的形状。我出于好奇,观察了一下身边的亲人,看看他们是否符合这一特征。根据我有限的样本观察,发现一个有趣的现象:南方人(特别是江南地区)复型小趾甲较为常见,而北方人则不明显。至于我自己,身体里南北基因各占一半。我清楚得记得,我小时候记得是有复型小趾甲的,但今天抬起脚丫一看,竟然消失得无影无踪了。老婆家祖上几代都生活在山东,完全没有这种特征;豆豆也没有,看来北方基因在他身上占据了绝对主导。

关于人类的起源,科学界主流观点是“单一起源说”。这一理论认为,现代人类的所有祖先均起源于非洲。大约在7万年前,人类祖先开始从非洲向世界各地迁徙和扩散。然而,中国官方却持一种独特的观点,也就是教科书中沿用的“多地起源假说”。按照这一理论,世界上的其他人种或许源于非洲的猴子,唯独中国人是由“土生土长”的中国猴子演化而来。

如果从这个视角看问题,一些奇怪的现象似乎可以解释得通了。比如,为什么有些国家的人能坦然走在康庄大道上,而中国人要摸着石头过河?也许这和祖先的起源有关:别的民族是旱猴子变的,而中国人是从水猴子进化来的。

不过,玩笑归玩笑,我个人更倾向于世界主流的单一起源说,因为这一理论有坚实的科学依据 - DNA 的对比分析。通过比较不同人群 DNA 之间的差异,可以推算出他们最近的共同祖先生活的年代;综合全球各地人类的 DNA 数据,还可以绘制出人类迁徙的完整路径。

前几天,我看了一部BBC的科教节目,其中详细介绍了人类祖先的扩散路径。研究表明,中国境内的现代人类祖先实际上来自两次大的迁徙浪潮,这也是南北方人基因差异显著的原因之一。

现代智人在大约 7 万年前,离开非洲后,沿着印度洋海岸一路向东,直到亚洲大陆的最东端,然后折向北方。在大约 5 万年前,进入中国南部。这一支迁徙者皮肤较深,颧骨较高,成为了南方人基因的基础。

另一支从智人走出非洲后,一路向北,直达西伯利亚,然后就在那定居了。直到 2 万年前地球气候开始变冷,西伯利亚的大部分地区被终年冰封,迫使一部分当地居民南下进入中国北方,逐渐成为北方蒙古人种的祖先。由于寒冷的气候,他们的皮肤变浅,脸部轮廓更加扁平,眼睛也逐渐变小。这些特征不仅是北方基因的标志,更在现代中国人的外貌中占据了主导地位。

尽管南方的原始人先一步定居中国,但从今天中国人的外貌特征来看,北方迁徙者的基因明显占据了主导地位。这种基因优势的确立,或许与北方人群的繁衍模式、社会组织结构,以及后来的诸多历史事件有关。

查看或添加留言

豆豆是运动健将

· 阅读需 2 分钟

胎动每小时3到5次即达到正常,豆豆在妈妈肚里那会儿,一小时动上三五十次都没问题。医生说这类小宝将来适合做运动员。

豆豆体力超好,每天上串下跳,一刻不停。前两天给他洗澡的时候,他又开始疯狂的踢水。我说咱们这回就让他玩个够,看看他到底能坚持踢多久。于是,他考在我手臂上,两腿交替蹬水蹬了七八分钟,终于累了。我想,这下累到你了吧,可以歇下来好好洗澡了。结果他脚累了玩手:身子往前一倾,开始用手扑腾水。一会手累了,再往后一靠,开始踢水。如此往复几次,地板上水漫金山,爷爷实在受不了了,一把按住他的脚丫,开始强行给他洗澡。

豆豆现在狂爱举高高,只要我朝他伸开双臂说一句“举高高”,他马上就会兴奋的尖叫,然后俩腿猛蹬。由于举高高哄的他很开心,他现在跟老爸感情极好,常常抱着我又啃又亲。

豆豆学会玩手了。现在如果让他“挠”一个,他就会举起小手握拳,张开,握拳再张开。豆豆是个右撇子,目前还只会挠右手。

豆豆抱着爸爸的大腿:
DSC02088

天黑了以后给我租住的房屋窗外照了张像,上海的夜晚亮如白昼
DSC02070

查看或添加留言

Lucene contrib(贡献软件)下常用模块的功能

· 阅读需 5 分钟

Lucene 是一个开源的搜索引擎,它的基本功能是对文本建立索引,帮助快速找到包含关键字的文档。Lucene被广泛的应用到了各种软件中,目前当需要在软件中添加搜索功能时,工程师都首先会想到借助Lucene。虽然Lucene只具备基本的文本索引和搜索功能,但广大工程师在实际应用中对它进行了扩展,添加了大量高级功能,并且将他们的改进贡献了出来。一些最为常用的功能也被收录到了Lucene的发布包中,被放置在contrib文件夹下。

网上对这些附加的模块的介绍比较少,我最近自己研究了一下它们的功能。用于我工作中使用的是Lucene.net,所以我只查看了.net版Lucene所带的功能,可能比java版得要少。

  • Analyzers\Lucene.Net.Analyzers\AR
    阿拉伯语 Analyzer

  • Analyzers\Lucene.Net.Analyzers\BR
    巴西语 Analyzer

  • Contrib.Net
    提供了一个按字母分词的分析器,可以用于子字符串搜索

  • DistributedSearch
    这个项目居然连个工程文件也没提供,所以我也没实验它。从名字来看,大概可以做分布式搜索的。

  • FastVectorHighlighter.Net
    这是一个用于在目标文档中高亮关键词的库。它的功能较Highlighter.Net更为复杂。但是在我所实验的 Lucene.net 2.9.2版本中,它存在严重bug,根本无法使用。

  • Highlighter.Net
    具备简单的高亮关键词的功能。可以把索引中保存的文本拿出来,然后把搜索词从中挑出来。

  • Queries.Net
    这个工具包由多个功能组成:

  • MoreLikeThis
    输入一段文字,然后它可以根据输入的文本生成一个查询语句,在索引库中查找与输入文本类似的文档。它可以用来制作推荐系统:用户找到了一个文档之后,我根据这个文档的内容给用户推荐一些类似的文档。

  • FuzzyLikeThis
    一个用于模糊查找的查询解析器,与lucene自带的FuzzyQuery功能类似,但是使用起来更加简便。

  • BoostingQuery
    允许在查询的时候,设置“上下文词”和提升分数。若搜到的目标文档中包含有“上下文词”,则对目标文档的得分做相应提升(也可以使降低)。

  • TermsFilter
    可以设定一组词作为过滤器,把包含了任意一个词的文档滤出来。

  • Similarity.Net
    包含了MoreLikeThis这一功能。与Queries.Net中那个MoreLikeThis一摸一样。

  • Snowball.Net
    用于词根搜索。西方语言,一个词义会有名词动词等不同词性,在做词根搜索,忽略一个词语的词性和时态,把包含这个词任何一种变换形式的文档都搜出来。

  • Spatial.Net
    为搜索加入距离限制。可以用于地理信息搜索,比如搜索当前位置一公里范围内的加油站。

  • SpellChecker.Net
    如果用户查询的词找不到答案,很可能是拼写错了。这个模块可以给出正确拼写建议。

  • WordNet.Net
    实现同义词搜索。WordNet也是一个开源软件,它是一个字典,也包含了查同义词的功能。

查看或添加留言

Scratch编程语言 1

· 阅读需 3 分钟

八戒2师兄的提示,玩了一下Scratch这个软件。我前面介绍的Modit软件正是模仿了Scratch的编程方法和界面风格,所以两者在编程习惯上完全一致。但这两种软件是应用在完全不同的领域的。

Scratch是由麻省理工开发的一款图形化编程语言,针对儿童,专用于编程实现简单动画效果。我在Scratch的社区下载了几个小朋友们编写的动画游戏,还是非常有趣的。这让我想起了我小时候曾经看到过的LOGO编程语言,从计算机刚刚开始普及,人们就没有忽视如何帮助儿童来学习编写程序。

我猜专为儿童设计的编程语言,短期经济效益不会很高。毕竟除了厂商,愿意为软件开发工具付费的个人不会太多。但这项投资的长期回报是不可忽略的,学生们长大毕业之后,会把曾经的编程经验带入工作中。Modit作为一个纯工业领域的行业软件,完全采纳了Scratch的语法,可见说Scratch的影响力已经从教育迈向了商业领域。

LabVIEW也有针对学生使用的版本,还有和乐高合作生产的专供儿童编程玩乐高玩具的LabVIEW版本。但我觉得不足的是,即便是为学生们使用的LabVIEW依然保持着强烈的测控背景,依然在强调数据采集、测量、控制等功能。如果学生们一提到LabVIEW就想到测控,无疑会限制他们使用LabVIEW的热情和创新。而Scratch这种用来做动画的工具肯定会比做测控的软件更受孩子们欢迎。其实LabVIEW也可以搞个专门编写动画的版本给小朋友们的,让孩子们从小就习惯LabVIEW的语法,以后就离不开它了。

查看或添加留言

满七个月的豆豆

· 阅读需 2 分钟

再过几天豆豆就满七个月了,他的第四颗牙也终于长出来了。

DSC02008

豆豆淘的要命,不睡觉的时候,浑身乱动,没有一刻停歇的。不过睡着的时候,还是蛮安静的:)

DSC02049

今天,我试着把豆豆快速举起来再放下再举起来,玩了几次。哪知道他一下子就喜欢上这个新玩法:一听见“高高”两个字就兴奋,整天搂着我的脖子,不停的撅起他的小屁股表示还要玩。但是据说小宝不适合剧烈晃动,我也不敢跟他玩的太疯。

豆豆现在的主要辅食是米粉和蒸熟了的香蕉。香蕉蒸熟以后闻起来酸溜溜的,我看着就没食欲,豆豆却视若珍馐。所以家里总少不了摆着几串香蕉。

DSC01986

查看或添加留言

豆豆又长出两颗牙

· 阅读需 2 分钟

昨晚我抱着豆豆散步,豆豆突然就很委屈的大哭起来。豆豆从来不会无缘无故的哭闹,我们哄了他半天也不见好。我确定当时没有碰到或弄疼他,所以很担心他是不是生病了。豆豆哼唧了半个小时,心情才开始转好,可一家人整晚都在担心他。

早上,爷爷抱着豆豆出去散步,回来兴冲冲的说找到原因了。爷爷给豆豆擦口水的时候,一眼看到豆豆上牙床露出了两个白色的小尖尖,原来昨晚是冒头的小牙弄疼了豆豆。

一般小宝长牙都是一对一对的长,可是豆豆第一波只长出了左下方一颗门牙。一个月时间过去了,那颗小牙已经高高耸立于牙床之上,但它旁边的伙伴还是一点动静都没有。最后还是两颗上门牙占了先。豆豆现在有三颗牙啦!

查看或添加留言