Browsed by
Category: 杂文

随便记点什么

大河不仅仅是大河

大河不仅仅是大河

台湾作家龙应台在香港大学做了个演讲『一首歌,一个时代』,主题大意是一首歌反映一个时代以及对个人成长经历的影响。让人意外的是,在一个互动环节中,现场观众竟然合唱了一小段『我的祖国』(完整视频请点击这里)。

看了视频,非常感动也非常意外。没想到香港现在还有很多人有家国情怀,尤其是港大居然还有这么多年青人会唱这首歌。此举完全刷新了我对香港的认识,看来也不是都仇视大陆。坦率地说,看到现场合唱的时候,我感动得热泪盈眶。

这是件很让人感动的事,然而让人意外的是龙女士事后的回应『大河就是大河』(请点击此处了解全文)。在这篇文章中,龙女士充满了谎言和肆意的扭曲,主要体现在以下几点:

听众合唱了好几首歌,台湾人用国语合唱《绿岛小夜曲》,香港人用粤语合唱《友谊之光》

要没听错的话,实际上只是龙女士播放了视频而已,现场观众并没有合唱,至少在视频里没听出来、没看出来。这个只能现场观众来指正,我个人认为龙女士疑似撒谎。

…第一个念头就是,这是一首“红歌”,…需要勇气…可是这首歌我没听过

同样疑似撒谎。第一个念头想到这是首红歌,还好意思说“没听过”?龙女士技巧性地打断了合唱,因为要不然的话,后面就会有『这是美丽/英雄/强大的祖国,是我生长的地方』。这不仅仅是描述风景的歌曲,这是家国情怀的歌曲。在中国的土地上演唱这首歌,是件很自然的事,不需要额外的勇气。

…这一半陆人一半港人的场内,各自都有自己坚持的信念和立场…

这是不是可以说龙女士在刻意地暗示、营造陆港对立的氛围?平时就最痛恨这种人,故意放大区别、扭曲观点,人为制造对立。人生本无事,庸人自扰之!

…不管在本地政治正确不正确…于是我当场邀请大家一起合唱……我于是让大家合唱的时间拉长一点……

香港师生唱『我的祖国』是完全正确的,有什么可质疑的?

如果不是我眼瞎的话,现场完全是自发合唱的,并不是龙女士邀请大家一起唱。而且正如前面提到的,龙女士技巧性地打断了合唱。这个言论让我觉得龙女士实在很不堪。当时她站在台上内心应该有挫败感和无力感吧?以至于事后慌忙地用这些谎言来掩盖。

…旋律的优美有一种感染力,一会儿就唱开了…

旋律当然优美。世界上优美的旋律还有很多,而引起现场大合唱的,不仅仅是旋律,更是家国情怀。我相信正是这种情怀,让龙女士恐慌了。

……《绿岛小夜曲》,一首包装在爱情里的政治抗议歌……大河就是大河,稻浪就是稻浪罢了

这种奇葩逻辑实在是让人无法理解。视频中龙女士承认『绿岛』作者亲属已经说这只是爱情歌曲,龙女士非要硬掰。绿岛一定不是绿岛,就算作者亲属出来说也不是,而对一首明显家国情怀的歌曲,评价却是『大河就是大河』?还『罢了』?

也许龙女士真没听过『我的祖国』,不过不要紧,现在去听一听或者看一看歌词也不晚。有一点是明确的,龙女士如果一直带着这种畸形的思维,那她永远无法理解家国情怀,永远无法理解为什么会热泪盈眶。在我们心里:

大河不仅仅是大河,稻浪绝不仅仅是稻浪

南京大屠杀

南京大屠杀

昨天(12.13)是南京大屠杀公祭日,『我们这些没有经历过战争的一代,现在站的这块土地上, 曾发生过一场大屠杀,迄今为止,只过去了短短的79年』!

日本仍然没有反省,没有正式道歉! 仍然在极力美化当年的侵略战争!

3cx收购了elastix

3cx收购了elastix

原始新闻链接请点击此处。从新闻内容大致可以得出以下结论:

(1)Elastix V5的内核从Asterisk迁移到3CX。考虑到3cx是商业、不开源的版本,因此elastix从V5版本开始应该就会转向闭源。

(2)以前的Elastix版本,例如使用比较广泛的V2版本,以及充满了bug的V3和V4版本,依然遵循开源协议。相信这些旧版本的用户无法免费升级到V5版本,需要付费购买产品或者购买技术支持才有可能。

(3)3CX可能看重的就是elastix目前已有的大量用户,希望能从产品技术支持、付费购买等途径获得利益。

国内一些专业QQ群里有部分用户表达了对这件事的愤怒情绪,感觉自己被Elastix背叛了。仔细搜索了相关报道和各类消息后,我有些不同的看法。对Elastix项目而言,『被收购』是个不错的商业选项,项目人员获得合理的报酬完全是可以理解的,毕竟这是个商业社会,人不能光靠理想一穷二白地活着。

相反,我对3cx的收购决定感到困惑。Elastix是个不错的项目,也有很多拥趸,但究其根本,依然只是依附在Asterisk上做了个壳而已,这也就意味着客户的迁移成本实际上并不高,客户完全可以从一个壳转另一个壳,比如FreePBX。实际上很快就发现FreePBX在twitter等社交媒体上发帖欢迎Elastix用户进行迁移。

由于这些壳都是使用Asterisk作为核心,因此配置规范(接口)、管理接口实际都遵循Asterisk定义。从Elastix转换到FreePBX,相信比转换到3cx要简单、容易得多。从这点看,我很怀疑Elastix用户会如3cx所愿地迁移到3cx的平台。如果不能顺利完成这种转换,这次收购的价值就会大打折扣。

目前市面上有各种各样的软、硬件PBX,绝大部分其实都是基于两个开源项目:Asterisk和FreeSwitch,差异化无非体现在各种定制化的包装。如果想获取最大利益,应该是直接收购或者控制这两大项目。如果说“条条大路通罗马”,那Elastix、FreePBX不过是其中两条路而已,Asterisk/FreeSwitch才是目的地罗马。与其在道路上设卡收费,不如直接控制罗马。

从这个角度考虑,所有基于这些开源项目的软、硬件产品实际上都有风险。一旦项目被收购,产品就有被扼杀的危险。避免此类危险的唯一路径,大概就是控制住这些项目,或者另起炉灶。

幸运的是我们的产品(miniSIPServer)是完全自主开发,与这些项目毫无关系,因此不存在任何法律和潜在的风险,这也使得我们能够完全掌握自己产品的发展,从而为客户提供安全、可靠、一致、长久的体验。

希望这些开源项目能长久繁荣下去,毕竟一起做大蛋糕、做大市场对大家都有利。

清静了

清静了

我们有个工作论坛,采用phpBB搭建,运行了多年,始终被一个问题困扰:应对各种垃圾帖。目前采用的方法是:

  • 注册时设置Q&A问题,阻止部分机器人注册论坛。
  • 新用户注册后,会发送邮件要求激活。这确保用户是使用有效电子邮件地址。
  • 新用户发的第一个贴必须由管理员审核通过,后续发帖则不用再审核。这确保用户是个有效的用户。

以上措施能保证论坛的基本质量。不过最近发现了另外一个问题:大量的垃圾用户注册成功后并没有发帖,而是在用户信息等处填写了大量的广告等垃圾信息。这类用户多数来自相同的邮件服务器地址,例如xxx@example.ru等,估计是破解了Q&A方式的注册方式,往往一天之内会注册几十甚至上百个用户。

我不是很理解这种行为。因为各搜索引擎其实是看不到用户的个人信息,在个人信息处填写垃圾信息并没有实际意义。这类账户如同牛皮藓般的存在,实在让人觉得心烦,于是开始手工删除它们。

开始时一个个地搜索,一个个地删除,效率很慢。一天删掉几百个账户后,感觉头晕眼花,实在是件单调乏味的工作。仔细检查了phpBB的ACP界面,发现其实是支持批量删除的,真是大快人心。具体操作方法如下:

在“USERS AND GROUPS”界面,点击“Prune users”,然后点击“ Find a member”。在对话框中,可以使用通配查询,例如设置“E-mail”为“*@example.ru”,将该邮件服务器地址的所有注册用户搜索出来,然后点击“Mark all”以及“select marked”。接着在原“Prune users”界面里,设置”Delete pruned user posts” 和”Deactivate or delete”,然后就可以删除掉所有已选择的用户。

删完这些账户后,为防止再次注册,可以强行屏蔽相应的邮件服务器地址,拒绝使用该邮件服务器地址的用户重新注册。在“USERS AND GROUPS”界面,点击“Ban e-mails”设置即可。同样,此处也支持通配符设置。

完成清理工作后(大约删除了一千多垃圾账户),对论坛本身是否有必要存在产生了一些怀疑。实际工作中,客户们往往还是采用邮件、IM以及在线联系等方式,只有少数用户愿意在论坛里公开讨论问题。后续我们再思考一下是否让论坛继续存在下去。

装机 – Ubuntu16.04

装机 – Ubuntu16.04

老婆公司有个让人惊讶的规定:员工笔记本三年后归自己个人所有,公司重新配新电脑! 这是多么让人热爱的公司!老婆工作这几年,家里多了几台笔记本,一水的ThinkPad。上周又过了三年,拿回一台T430。以前拿回电脑时,会恢复到Thinkpad出厂时安装的window系统,这次这台T430居然只是低格了,没有系统?!

当然可以从网上扒一个windows恢复盘下来重装,不过考虑到家里已经有几台windows的笔记本和台式机,实在没有必要再增加一台,因此这次打算装Linux系统试试。

选择发行版本

“Linux发行版本”之争在程序员迷之争论中绝对可以位列前三位!好在是给自己的笔记本选发行版,因此有幸避免了与别人的争论,只要考虑自己的需求就好了。我的基本原则其实很简单:

(1)发行版要有强大的、历史悠久的社区。

(2)或者,有商业背景企业发布的版本。

以上两点只确保一个问题:若干年后,依然能活着并得到强有力的支持。绝大多数妖艳的Linux发行版本,比如Arch等,基本不用考虑了。符合要求的版本大致也就是:Debian、CentOS、Ubuntu等寥寥数种而已。

CentOS的软件实在太老旧了点,有时候不得不自己去编译各类软件,与其这样,还不如用Arch或者Gentoo等版本来得直接。公司做项目时基本都是采用Debian系统做服务器,很满意,但是Debian桌面系统就差强人意。不知道是Debian的问题,还是KDE的问题,使用时总有各种烦人的小毛病,比如鼠标问题等。

因此这次就选择了Ubuntu 16.04 (Unity7),谁会做死去选择Ubuntu的非LTS版本呢?

安装软件

安装Ubuntu系统实在没什么可以说的,下载iso文件,录制u盘,直接安装即可,比装windows还简单,过程枯燥乏味。下面只是记录一些安装应用软件方面需要注意的地方。

安装virtualBox与Windows环境下稍有不同,扩展功能包也收录在软件中心,因此实际执行命令一起安装:

sudo apt-get install virtualbox virtualbox-ext-pack

将其他计算机中的vbox客机导出到新计算机中,U盘必须采用exFat格式才能支持超过4G大小的文件,ubuntu默认没提供对该格式的支持,因此也需要单独安装:

sudo apt-get install exfat-utils

qt开发工具集升级到qt5了,采用以下命令安装:

sudo apt-get install qt5-default
谁在丑怪?!

谁在丑怪?!

上周五台风天,香港幼稚园停课,本来安排好给苗换被褥只好推迟,今天下午赶去幼稚园换被褥。因为过关人多,通常我都不带苗一起走,放学后她自己坐校车到关口走学童通道过关,然后我再去接她,这次苗非常希望我能带她一起坐巴士回家,昨天叮嘱了很多次,让我带上她非常喜欢的一个玩具小手机,因此换完被褥,请老师把苗带出来和我一起走。

路上苗非常开心,拿着玩具手机假装打电话,边走边玩。我们去超市买了瓶饮料,顺便也买了瓶洗衣液(仅此而已,没有买其他东西,包括奶粉),朝巴士站走去。天气很晴朗,一切都很美好。

这时一位香港朋友从后面拍了一下我的肩膀,我回头看见一位中年男士,水电工人(建筑工人?)打扮,对我说了一通粤语,并且指了苗几下。老实说我完全没听懂他的意思,难道苗有什么不得体的地方吗?我非常困惑地看了看苗:因为是周一,苗穿的是学校的礼服,正规而整洁;苗正在假装打手机,声音并不喧嚣,我站在身边也听不太清她的声音。

于是我开始全方位自省:“是哪儿不对吗?…… ”这时已经走到前面去的那位香港朋友回头对我们说了句话,我听明白了:“丑怪,丑怪”。

因为给苗换被褥的关系,也算偶有往来深港两地之间,已经习惯了面对各种不耐烦。但是被人无端当面叫“丑怪”还是第一次,感觉非常错愕和震惊,回想起来也时不时觉得愤怒。

我写下这次经历时,为苗将来的生长环境感到忧心。更让我倍感压抑的是,香港近些年来的氛围越来越差,完全看不到有什么改善的希望。

鼠标滚轮太快

鼠标滚轮太快

系统是Debian 8(64bits),一直有这个问题。比如打开Firefox浏览网页,一般习惯用鼠标滚轮翻页,问题是速度太快,一下就翻过几页,试了几个鼠标都有类似的问题,基本可以排除硬件原因(实际上切换到同一台计算机的windows系统,就一切正常)。

在Debian系统中也设置了鼠标的一些配置,例如“系统设置”中的“鼠标滚轮卷动单位”等,没有效果。

虽然比较烦人,不过勉强用键盘也能避免这个问题,于是就耽搁下来。

最近浏览文档、写文档等情况比较多,没有鼠标滚轮实在很不方便,于是下决心解决这个问题。上网搜了一些解决方案,都没有效果。搜到一个解决方法:插拔鼠标一下。这实在是无厘头,想想插拔一下也不费事,就试一下吧。

太扯了!居然真的有效!这到底是什么情况?

/bin/bash^M: bad interpreter: No such file or directory

/bin/bash^M: bad interpreter: No such file or directory

早上发现预设置的某个脚本没有执行,手工执行时返回以下错误:

/bin/bash^M: bad interpreter: No such file or directory

检查/bin目录,能发现bash,因此不是“no such file”。搜索了一下网络,发现是文件格式问题,脚本文件可能被修改成dos格式了。用vim打开文件,输入”set ff”即可检查当前文件的格式。

将脚本文件修改为unix格式即可,同样,用vim打开文件后,输入以下命令:

set ff=unix

然后存盘保存退出即可。

小米越来越low了!

小米越来越low了!

居然请了一帮台湾艺人做广告,太low了!难道不知道台湾人把大陆人叫“支那贱畜”吗?!真是岂有此理,罢买!!

小米用台湾艺人做宣传
小米用台湾艺人做宣传
从Python到Lua

从Python到Lua

在码农世界里,有几个迷之争论:Vim/Emacs与IDE之争、Tab与Space之争、Windows与Linux(也包括macOS等)之争,诸如此类。任何一个争论都是莫名激烈、动不动就友尽,如果你恨一个人,就把他拖进这些争论吧。

其中最可能流血、最板砖横飞的争论,无疑是语言之争(当然,“PHP是世界上最好的语言”这是毋庸置疑的)。使用某个语言或者不使用某个语言,都可能轻易引发激烈的争吵,需要面对巨大的宗教、舆论压力,因此切换语言对码农来说,几乎就是死生之大事。

最近做了一件让人紧张、脸红、流汗的事:重新改写miniSIPServer产品的业务引擎部分,从Python语言切换到Lua语言。作为熟悉(非精通)Python多年的开发人员,离开自己的舒适区去面对新的挑战,去填新的坑,内心还是蛮纠结的。这个切换工作花费了几个月的时间,排除拖延症导致的时间浪费,如此耗时也是近几年罕见,通常一个复杂点的特性也就几个星期工作量而已。在产品博客上,已经简要描述了这次切换的原因,本文从开发人员视角再补充一些细节。

先泛泛了解一些Python和Lua的共性部分:都是脚本类、解释型语言;都是比较简单、干脆的语法;通常都会应用于粘合性场景。常见的不同之处主要在于:Lua更精干、小巧、速度更快,而Python是通用性、全栈型语言,有更广泛的库支持。Python即可适合开发独立的应用程序、也适合作为胶水语言嵌入到应用中,而Lua基本功能集很小,通常只适合作为辅助型语言使用,不太适合作为独立应用的开发语言使用。

从上面这些简要描述来看,Python语言的应用领域要比Lua广泛得多。实际上简单搜索一下可以发现,Lua仅仅在网络、游戏等领域才有一些应用范例。

离开具体应用场景来谈论语言的优劣就是耍流氓,在考虑、考察了很久以后,最终还是重新选择了Lua,这个决定过程是逐步养成的。

我们自己在设计、开发产品时,总是会狂热地追求简单、精致、高效等特性,从产品名称也可以看出我们对『小巧』的迷恋。将Python及支持库打包进安装包,有数MB之大,而Lua仅仅200KB而已,完成整体打包后,体积能缩小1/3,用户下载我们应用程序的时间相应也能减少1/3!这点从一开始就很吸引我们。

然而最初我们选择的是Python,因为Python的库实在太方便了!例如其中的smtp库、xml库等,在我们产品初期的确帮了大忙。而随着我们自己逐步在MSS的核心自行开发了这些基础库,重新审视后发现:Python的库对我们的产品不再是必须的了。这也就是我们重新思考的一个触发点。

如果说Python是屠龙刀,那Lua就是铅笔刀。如果仅仅是削铅笔,那显然铅笔刀比屠龙刀更合适。对于我们而言,应用脚本语言更多的是考虑对核心功能的封装,以及基于此编写业务逻辑脚本,以脚本语言的动态性适配客户需求的多样性。因此在核心功能完备的情况下,脚本语言越轻巧越好,越简单越好,Lua太适合这种场景了。

Python另外一个让人比较诟病的地方就是GIL。由于GIL的存在,Python无法实现真正的多线程。如果用一个Python实例来满足多种业务的需求,一旦其中一个业务出现问题,整个Python虚拟机可能会锁死,导致整个系统崩溃。如果采用多个Python实例,Python的VM实在太重了,对系统的设计、实现、工作负荷都会造成很大的困扰。

而在这点恰恰发挥出Lua的优势。Lua的VM非常小巧,以至于可以毫不犹豫地启动多个VM来实现业务。实际上,我们最终实现为『一个业务启动一个Lua的VM』。具体设计、实现时不用再考虑资源锁死的问题,而且Lua提供的coroutine也很棒,很多场合下可以轻松满足高性能的要求。启动多个Lua的VM带来的最大好处就是:系统的稳定性有了进一步的提高。事实上相当于每个业务都处于沙盒之中,一旦某个业务出现异常,其他业务可以完全不受影响,即使是对已出问题的业务实例,将沙盒(VM)抹掉即可。单纯这一个特点就足以让我们决定放弃Python,改用Lua了。

而Lua带来的第二个好处是『热更新』特性。在运营级、大型企业级软件系统中,『热更新』是非常重要的特性,可以确保整个系统尽可能地稳定运行。而由于每个业务都由独立的VM运行,因此我们可以做到动态修改业务脚本。实际上,我们在开发新业务引擎时,常常在保持MSS运行的情况下,修改脚本测试各种业务逻辑,效果良好。

Lua比Python简单很多,不做特殊优化,Lua的速度比Python要高出很多。我们在开发测试过程中发现,采用Lua脚本对系统的性能影响不大,比Python要节省资源。MSS作为一个高性能SIP服务器,核心采用C、C++实现,而某些处理过程也有客户化、定制化的需求,更关键的是也存在『热更新』的需求,因此我们甚至希望在考察Lua业务引擎效果的基础上,考虑替换MSS呼叫核心部分的处理逻辑,用Lua实现部分呼叫引擎。

因为简单,所以我们可以比较随意地直接修改Lua的代码,以便满足我们应用场景的一些特殊需求。而面对Python,我们可不敢这么做。

当然Lua也有明显的缺点,『简单』在某种程度上是『简陋』的同义词。很多情况下需要扩展一些功能给Lua使用,另外就是Lua也存在不少的坑,即使是Python和C/C++老手也需要小心翼翼。

最后,老话说得好:“结合应用谈语言”。没有完美的语言,只有适合你应用的语言。当你不知道该怎么选择时,选择Python、Java这类通用型语言基本无风险,正如我们在项目早期作出的选择一样,在当时都是非常正确的。只是我们要与时俱进而已。