小米越来越low了!

小米越来越low了!

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

小米用台湾艺人做宣传
小米用台湾艺人做宣传
Firefox吞噬硬盘

Firefox吞噬硬盘

我承认是个标题党,实际是指Firefox频繁读写对硬盘有一些损害(其他浏览器也有类似的问题,都属于高IO类型软件),来自一篇网络上的文章,原文请点击这里

在这篇文章中也提到了解决方式:在firefox地址栏中输入“about:config”,然后找到参数“browser.sessionstore.interval”,默认值是15000(15秒),修改这个值即可。

从这个参数的含义看,似乎是firefox保存会话(页面)的频率,一般应用而言估计也没太大意义,改大点(例如600000)好了。

 

忙碌的一天

忙碌的一天

今天度过了忙碌的一天,然而其实什么都没有做,至少没做什么有意义的事情。

昨天收到短信,告知了上次交通违规的事(请点击这里了解细节),于是上午就打算去处理这事。先跑蛇口交警大队,据说打印机坏了,不处理,然后跑到南山交警大队去处理(人山人海啊)。结论是罚两百,不扣分,因此其实不用打印,直接在自助终端交罚款就行。在查询的时候咨询了交警同志,也认为这种罚单是有疑问的,想想折腾回江西提出异议的各种可能,还是直接交罚款了事。

一上午就这么过去了。

中午收到了windows系统升级的通知,于是习惯性的点击同意:升级失败回退一次;再次升级,中间异常退出若干次;升级完成后,出现几段鸡汤文字,然后卡死一次;冒险重新启动,然后发现程序异常一次……各种心惊肉跳的感觉。终于升级完成,版本变成”14393 187″,忍不住吐槽:真丑!微软越做越奇葩了,是因为三哥当头了么?

一下午就这么过去了。

晚上看着熊孩子写作业,怒火中烧,怎么就教不会?!

一天就这么过去了。

 

从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这类通用型语言基本无风险,正如我们在项目早期作出的选择一样,在当时都是非常正确的。只是我们要与时俱进而已。

华为任正非在日本研究中心的讲话

华为任正非在日本研究中心的讲话

新闻链接请点击这里

其中关于『质量』的观点可以看出,华为非常重视质量体系。不愧是标杆企业,让人肃然起敬!华为大概是国内企业里目前唯一一个有可能成为伟大企业的,向华为学习!

与苗的对话

与苗的对话

今天苗开学,早上心情很激动,早早就起来了。象往常一样,骑自行车驮着苗去深圳湾关口集合。

路上一般都和苗有说有笑,轻松快乐,然而今天苗忽然问了一些问题,让我心情十分唏嘘:

“爸爸,我以后能在深圳上小学吗?”

“恐怕不能 ……”

“为什么不能在深圳上小学?”

“哦,因为深圳这边的学校不允许招收香港的小孩 ……”

“那我是香港小孩吗?”

“嗯,是的 ……”

“那哥哥是大陆小孩吗?”

“啊,哥哥是大陆小孩。”

“为什么我不能是大陆小孩呢?”

“……大陆只允许一家生一个小孩,所以我们当时就跑香港生你了……”

……

现在也没别的想法,只希望苗能健康快乐地成长。

Linux性能调优的两个参数

Linux性能调优的两个参数

可以修改/etc/sysctl.conf文件,添加或者修改以下两个参数,对linux性能进行调优:

vm.swappiness = 10
vm.vfs_cache_pressure = 200

swappiness默认值是60,值越小,则linux越多利用内存、少用swap。

vfs_cache_pressure默认值是100,值越大,则linux尽可能早回收内存。

量子通信卫星

量子通信卫星

据说今天晚上要发射一颗量子通信卫星,顾名思义就是进行量子通信。对此我感到非常震惊!作为一名科普爱好者,我有限的量子理论知识大概只有以下几点:

(1)量子纠缠态。一个量子分裂成两个量子,这两个量子就是自纠缠的。一个向左转,另一个就向右转。理论上讲,这种纠缠态是跨越空间限制的,即使两个量子分布在宇宙的两端,它们的纠缠状态也不会改变。我猜想量子通信大概就是基于量子纠缠态来通信,通过控制一个量子的状态,影响另一个量子,从而实现通信。从这个角度讲,量子通信简直就是超越光速的通信方式。

(2)测不准原理。这基本就是现代量子理论的基石之一,大概是指无法准确测量量子的状态,因为测量本身就是一种能量干扰,会影响到量子的状态。如果测量某个参数越准确,则其他参数的结果就越不准确。

既然测不准,因此实际上是无法准确控制量子的状态。既然无法准确控制,就不可能实现通信。反过来说,如果实现了通信,则必然有某种手段能准确控制量子的状态,也就是说“测不准原理”是不是可以over了?

理论基石居然有可能被动摇,这简直就是突破天际!怎么做到的?感觉有幸要见证历史,求科普。

2016-08-19 更新:看了一些新闻报道,貌似是利用光子的不可分割、不可复制特点,产生密钥,对通信进行加密。当然这仍然很厉害,但是完全不是『利用量子纠缠态进行远距离通信』。我觉得『量子通信』这个表达不准确,应该是『量子加密』才对,天际并没有被突破。

逆向停车

逆向停车

今天开车带孩子们出去玩了一整天,心情很愉快。下午到餐馆吃完饭回来,心情立刻沮丧,居然被抄了一张罚单!同时也感到困惑,因为汽车很明显停在汽车停车位以内,也没有压白线。老姐告诉我说可能是车头方向和别人相反,属于『逆向停车』违规。

我对此有些异议,回家后重新上网学习了一下交通安全法。在法规中,只有临时停车时对方向有要求,而对停车位内停车并没有类似的要求。于是拨打了罚单上留的交警支队的电话号码想咨询一下,无人接听。

印象中深圳没有类似的判罚尺度,重新搜索了一下网上类似的案例,感觉每个地方的具体执行情况都有不同。既然是地方的规定,也没必要硬拗,遵循便是,只是开车将近十年,终于破功被罚一单,心情实在有点糟。

Lua小坑之整数

Lua小坑之整数

在最近的一次开发中,需要将两个整数做除法,例如以下简单语句:

c=a/b

由于a和b都是整数,因此我又想当然地认为c也是整数,而实际上Lua将c转换成浮点数,导致后续逻辑判断和处理都出错了。这又是Lua让人意外的一个地方,我很困惑设计者为什么要这么设计。在Lua 5.3的reference manual文档中,对此有明确说明:

Exponentiation and float division always convert integer operands to floats.

据说5.3版本之前,Lua甚至都不支持整数,只有浮点数。而我们的程序通常只有两种类型:整数和字符串,因此重新将计算结果转换回整数是个急需解决的问题。在翻看manual文档时,看到math.tointeger接口,试了一下,结果极为悲催,返回了nil值!这是搞个毛线啊?

幸运地是lua对C很友好,因此只好手工打造一个接口给Lua程序用:

static int bluaToInt(lua_State *L)
{
 assert(NULLP!=L);
 int intVal = 0;
 int type = lua_type(L,1);
 switch( type )
 {
 case LUA_TNUMFLT: 
 intVal = (int)luaL_checknumber(L,1);
 break;
 
 case LUA_TNUMINT:
 intVal=(int)luaL_checkinteger(L, 1);
 break;

 case LUA_TSTRING:
 intVal = BclStrToInt(luaL_checkstring(L,1));
 break;
 
 default:
 assert(0);
 break;
 }

 lua_pushinteger(L, intVal);
 return 1;
}

将上述函数注册到Lua中,定义为“ToInt”,然后在脚本中使用即可。由此上述示例代码变为:

c=ToInt(a/b)

这样就能确保c为整数类型。