双十一

双十一

我是很反感“双十一”这种极度鬼畜的营销节日的,今年的双十一提前了N天开始酝酿,照这个节奏,早晚有一天会从“十一”开始。

今天一大早客户上报了一个 bug,不得不定位、重新出版本。忙完了后看一下股市,股价居然也凑热闹打折。晕死!

晚上老婆在网上买的被套也送到了,拆开一看,简直无法直视!质量差不说,卖相和直播完全不一样啊……熬夜看直播、下单,到底图啥?

所谓的玩法也是各种折腾,自以为是。唯一值得庆幸的是,京东的图书有些优惠,折腾了一顿优惠券,再加上 plus 会员的一些优惠,最后买了几本书。其实最近几年我都不再买纸质书,基本就是在 kindle 里直接买电子版,这次主要还是希望收藏、纪念吧,以后都不可能再这样了。

觉得这种节日实在是无聊,是我老了吗?

和平要实力相当才可获取,不存在祥林嫂式和平

和平要实力相当才可获取,不存在祥林嫂式和平

原文链接请点击这里。我是任总正非的粉丝,相当服气!

10月27日,华为“心声社区”刊发创始人任正非9月14-18日访问北京大学、清华大学、中国科学院等学校与部分科学家、学生代表座谈时的发言,题为《向上捅破天,向下扎到根》。全文如下:

习主席在与科学家座谈会讲了,基础教育、基础研究、基础理论、基础工业,也讲了科学家的好奇心驱动。国家不仅要重视科学理论、工程技术的研究,也要重视一些不以应用为目的的纯研究。不然我们怎么能向上捅破天呢?我们这么大的经济总量,允许一部分人是“梵高”应该是可以的。科学史上,有一种生存了八千万年的蛭虫,多少科学家研究了数十年,有些科学家因找不到雄的蛭虫而发大火,实际上他已经走到诺贝尔奖的边上了,最后由比利时科学家发现它是单性繁殖。两性繁殖,两条基因链的结合会产生突变,会有优秀的一代产生,当然,不健康的就流产了,自然淘汰。那么单亲繁殖的基因链若有病变、有问题,遗传下去不就灭绝了吗?她发现蛭虫的基因链会断裂,又会重新整合,这不就是优选吗?所以它们经历八千万年,经历多少灾难,还存活下来了。

我国的经济总量这么大,这么大的一棵树,根不强是不行的,不扎到根,树是不稳的,万一刮台风呢?我们拧开水龙头就出水的短、平、快的经济发展模式是不可持续的。我国的基础工业还是不强的,小小一滴胶,就制约一个国家的故事,我们已经看到了,这是分子工程,是高科技中的高科技。而这几千种胶、研磨剂、特种气体……,都是高科技中的高科技,我国现在还基本达不到,很多种技术一年的需求量只有几千万美元、几百万美元甚至更少,试看泡沫经济下有几个公司肯干这种事。缺一种就会卡了一个国家的脖子。

过河需要船和桥,我们有了很好的科学目标,过河的船夫就是人才,人才来自教育,因此,国家的发展根本在教育。我们振兴中华,不是靠口号,而是要靠“船”和“桥”。

我国每年有七、八百万大学生毕业,加上中专生大约有一千万,聪明人很多,如果允许差别化的教育,就是姹紫嫣红。一二一,齐步走,同质化就缺少活力,就不易产生天才。世界有一个乔布斯就改变了移动互联网。差异化就容易产生尖子,政策要支持少数人因材施教。同时,也要重视农村教育,现在有些种田能手、养猪状元,如果他们过去有机会受到系统教育,也许就能成为精英、天才。早期中国共产党的领袖大多来自农村,毛泽东、粟裕……。我们今天的农村孩子中,怎么知道不会有明天的爱因斯坦呢?深圳很重视中小学教育,全国达到深圳的水平可能有一些困难。但如果国家每年给边远地区一些经费,让穷孩子每天能吃上二两肉,也许比修些大房子强,房子总会旧的,孩子总会成为博士的,而且他们会更忠于祖国。那么二、三十年后,我们的创新能力就大幅度增强,与美国的差距会适当缩小。没有创新是支撑不了我们这么大的经济总量持续发展的。

在科学、技术、工程领域,不同人才选择不同的方向,充分发挥每个人的才智。多学科交叉突破会更有可能,横向融合创新才能形成颠覆性的效果;科学、技术、工程垂直打通才会形成能力,真正落实创新驱动发展的理念。因此合作交流越来越重要,当然,大学还是应偏科学理论,偏重发现;企业偏重技术、工程,偏重发明,结合起来,力量才会更强大。

美国是世界上最强大的科技国家,特别是在吸引全球优秀人才上,有特别独到的优势。我们今天的科研状况很像二战前的美国,二战前50年时间,尽管美国产业已经领先全球,但在科研上充满功利主义,不重视基础研究、基础教育,大量依赖欧洲的灯塔照耀,利用欧洲的基础研究成果,发展短、平、快的产业。二战即将结束时,罗斯福总统的科技顾问范内瓦·布什在“科学:无尽的前沿”中提出要重视不以应用为目的的基础研究,面向长远,逐步摆脱了对欧洲基础科学研究的依赖,从此,美国基础科学研究远远领跑全球,形成若干重大突破。美国经过几十年的实践,上世纪九十年代,美国普林斯顿大学的唐纳德·斯托克斯1997年在“基础科学与技术创新:巴斯德象限”中,强调美国不仅需要纯技术研究,即波尔象限,也要纯应用开发的爱迪生象限,更强调应用驱动的基础科学研究。理论上遥遥领先,又与应用结合,这样既拓展了科学认知,又能创造价值。例如,北大张平文副校长说,据说波音777飞机的风洞吹风是使用全新的空气动力学软件模拟仿真的,使过去需要80次风洞试验减少到现在的7次左右,那么说明美国已把空气动力学的漩涡都变成了经典力学方程。而我们不吹风还不敢造飞机。俄罗斯将核发动机小型化,形成了战略威慑;美国把核弹小型化、战术化、无污染化。和平需要实力相当才可获取,祥林嫂式的和平是不存在的。美国的科技发展史就是一面镜子,我们以此来反思我国的科技发展战略的系统性、科学性。学人之长,长自己之力。

现在美国主张中美科技脱钩,美国是因为开放才走到今天的强大,封闭会重返落后的。清华张钹教授讲,美国越讲脱钩,我们越要高举科学无国界,坚持开放和国际化。科学是对客观规律的认识,真理只有一个,不存在东方科学、西方科学。论文都会公开发表,可以查询的,我们要站在前人的肩膀上,摸到上帝的脚。我们要坚持向一切先进学习,封闭是不会成功的。华为今天遇到的困难,不是依托全球化平台,在战略方向上压上重兵产生突破,而有什么错误。而是我们设计的先进芯片,国内的基础工业还造不出来,我们不可能又做产品,又去制造芯片。就如我们缺粮,不能自己种稻子一样。技术创新它是可以依据理论,独立设计、发明出来的。就如汽车,都是四个轮子,车都不一样。理论是可以在网上看到的,是大江、大洋、大山阻隔不了的。

科学发现、技术创新中最主要的是宽容。领导经常会问,最新进展怎么样了,你们研究成果有什么价值,能创造多少GDP。科学家要么说不出话,要么只好说违心的话。当科学家过多关心应用、关心价值,他的锚就锚在地上了,怎么飞得高?科学的道路是漫长的孤寂的道路,多少代人孜孜不倦的努力,才发现一点点真理。急功近利只有戏剧作家,才会写出科学家既会弹钢琴又会魔术般地出成果。我们要耐得住科学家的寂寞与无奈。就如我司5G Massive MIMO,起初没有人认同,搞了八年终于成功上市,成为核心竞争力。又如,2G与3G之间的算法打通,没有公司莫斯科研究所的小伙子安德烈默默无闻的几年,没有宽容,就没有华为的无线成功。我们如何追溯对这些过程中默默无闻贡献的人,并给予鼓励,包括中途已离职的有功员工,是我们干部部门应该改进的地方。过去几年由于评价不清楚、不准确,给人家打C了,可不可以追溯把他们重新评定为A、B+,他们本来就是A的。我们只有尊重历史,才会英雄辈出。只有承认科学的历史观,才会有科学的发展观。我们今天受到百年未闻的打压及围剿,20万员工的忘我奋斗,正在挽救公司的存亡,如果我们还有可能胜利的一天,我们不要忘了千万奋斗的英雄,各级干部部门要作好记录工作,追溯英雄,是为了产生更多的英雄。英雄是平凡人,不要忘记他们。忘记就意味着背叛。

我们处在一个最好的时代,我们的年青人又如此活跃,我们的国家一定充满希望。同学们快快起来,担负起天下的兴亡。你们今天桃李芬芳,明天是社会的栋梁。你们是早上八、九点钟的太阳,希望寄托在你们身上。

xrdp的小问题

xrdp的小问题

目标系统是 Debian, 采用 xrdp 远程登录窗体界面,总是在显示登录时黑屏。查了很久一直没有结论,后来就干脆用 vnc 算了。

今天在查其他问题时,无意间翻查到文件 “/usr/share/doc/xrdp/README.Debian”, 里面提示需要修改“/etc/X11/Xwrapper.config”文件,将

allowed_users=console

修改为

allowed_users=anybody

重启后,果然可以通过xrdp正常登录了! 只是比较奇怪,为什么 Debian 系统不将默认值修改为 anybody?是没人维护的原因吗? 那为啥又在 readme 文件中单独说明呢?

另外,由于 Raspberry Pi 也是基于 Debian 系统,因此 Pi 中做同样的修改,也可以通过 xrdp 正常登录。

xrdp 读取 “/etc/ssl/private/ssl-cert-snakeoil.key” 进行加密,但是这个文件默认只有 “ssl-cert” 组的成员才可以读取,因此还需要将 xrdp 用户加入该组:

sudo adduser xrdp ssl-cert
奇怪的需求

奇怪的需求

工作中经常会遇到客户提出各种各样的需求,有些需求很合理,有些需求很有难度,有些需求则让人摸不着头脑,比如今天遇到的一个需求。客户的需求看上去似乎不复杂:

呼叫离线(offline)的被叫用户时,先 push 一个通知(notification)给被叫用户,收到响应后再发起呼叫。

我推测这位客户可能在构建某个移动APP。移动APP经常遇到的问题是:希望常驻后台,但是手机的电源管理往往会优化掉应用。这导致该移动APP会强制退出运行,从而无法正常接收消息、更无法接收呼叫。

客户提出的需求不应该是这个场景的解决方案。应当是APP自身向系统申请足够的权限驻留内存,并且APP应该和 SIP 服务器定时 keep-alive 保持激活状态。前者是APP自身的设计问题,后者是SIP注册、激活问题(标准流程)。

当然这只是我的个人推测,不太适合直接反馈给客户,因此向客户简单地提示了几个问题:

(1)离线状态下,怎么保证收到 notification 呢?

(2)既然可以收到 notification, 为什么就不能收到 SIP 的呼叫消息(INVITE)呢?

2020-10-12 更新: 稍微了解了一下相关的内容,大概是 iOS、Android 提供了统一的通知机制。如果收到了 notifications, 系统会从后台启动程序,这样 SIP 终端又可以重新注册并接收呼叫了。 这种模式当然是可以工作的,不过方案确实也很丑陋。另外,由于 GMS 在大陆已经不可描述了, 因此大陆的 Android 手机就更奇葩一些,通过应用程序链之间互相唤醒、互相调用(脏得一批 ……)。

2020-11-28 更新: RFC8599 定义了 SIP PUSH NOTIFICATION 的规范,对于移动终端 APP 类的 wake up 机制进行了定义。还不清楚该规范的应用情况,待进一步了解。

NAME、CNAME 格式

NAME、CNAME 格式

总体而言, 早期 DNS 协议是个比较简单的协议。受限于 UDP 大小和数据量, 基于 UDP 的 DNS 协议限制了包大小,并且采用二进制编码方式力求减少数据量占用。

二进制编码方式相比文本方式(例如HTTP、SIP、SMTP等)最明显的缺点就是不直观,再用一些技巧减少数据量,DNS 协议在定义、实现方面总显得有些弯弯绕绕。

比如 NAME、CNAME 等结构的编码。

本文记录了这些古怪的编码方式,方便以后查找,并帮助后续的开发者不会被代码给绕晕。作为我个人来说,还是尽快忘记这些吧。


方式一:纯压缩编码方式

这种方式应用很普遍,以“0xc0”标记开始,加上一个字节的 offset,进行消息包内的寻址即可。如下图所示:

DNS offset 编码
offset 方式编码

其中, 0x0c 就是偏移量。


方式二:直接编码方式

这种方式比较直接,占用数据量也相对大一些,将域名完整信息存在数据包中。如下图所示:

直接编码
直接编码方式

需要说明的是:并不是直接将所有字符存进去就 OK 了。对于域名数据,以“.”符号分割成几个单元,每个单元数据采用 “length + value” 方式进行编码,最后以0x00结束编码。以上述数据为例:

08 6e 73 69 6e 61 69 6d 67 04 67 73 6c 62 08 73
69 6e 61 65 64 67 65 03 63 6f 6d 00

比如,第一个 0x08,说明后面的“nsinaimg”(即 6e 73 69 6e 61 69 6d 67)长度;然后是 0x04,说明后面的“gslb”(即67 73 6c 62)长度……其他单元类推。


方式三: 混合编码方式

这种方式其实就是综合了上述两种方式。以直接编码方式开始,然后以压缩(偏移)编码方式结尾。如下图所示:

混合编码方式
混合编码方式

对图中的数据码流描述如下:

03 6b 6c 6e 04 67 72 69 64 c0 38

0x03 描述了“kln”(即 6b 6c 6e)的长度,0x04 描述了“grid”(即 67 72 69 64)的长度,而域名的后续部分,通过“c0 38”编码可以知道:需要偏移0x38字节获取。

小升初报名

小升初报名

今天(2020-05-15)上深圳南山教育局网站(这里),给老大报名小升初。毕竟是小孩人生中的一件大事,全程很紧张,生怕某项细节填错了,每项都仔细审核两遍,汗流浃背。

上午九点报名,到下去三点左右基本搞完了…… 中间出现的问题无非就是:网站打不开了、502网关错误了、Nginx 崩溃了等等。

作为一名 IT 行业人士,我非常冷静,并表示理解。自己辛苦点,无非就是隔几分钟去 refresh 一下,并按照惯例祈祷上帝、佛祖、真主、以及各路神仙保佑。

总体上还顺利吧,感谢!

2020-05-18 更新:这两天晚上又上去看看审核结果,看是否需要补充材料。速度非常快,网站也很稳定。这说明前两天实在太多家长急急忙忙地冲进去报名了(包括我自己)。家长们的情绪可以理解,毕竟现在孩子的事是头等大事,心里都想赶紧办妥了,以免夜长梦多。

SSH 配置证书登录

SSH 配置证书登录

SSHd 配置采取了一些安全措施,比如:修改端口、禁止 root 远程登录(这里)、启动 fail2ban 防止恶意登录(这里),等等。目前看这些措施基本满足了日常的维护管理需求。

通常还会采取证书登录方式,禁止密码鉴权登录。不过以往考虑到密码方式更方便,因此没有动力去修改。时间就这么过去了……

最近登录服务器检查日志, 惊讶地发现 fail2ban 每日的日志居然有十几M之多,全是各类奇葩以各种方式尝试登录 SSH。虽然 fail2ban 工作得很好,但是万一出现了 bug 呢? 万一哪个变态就是锲而不舍、经年累月地尝试登录呢?应该下狠手,让老铁们彻底绝望,因此决定禁止密码方式登录,要求采用证书登录。

配置不复杂,涉及客户端生成证书密钥,以及将公钥上传到服务器等。主要参考 Linode 的两篇配置文档(这里这里)。 以下是详细步骤:

生成证书

客户端也是 Linux 系统,因此相当简单:

ssh-keygen -b 4096

该命令在当前用户的 .ssh 目录下创建了两个文件: id_rsa 以及 id_rsa.pub 。

其中 “id_rsa.pub” 是当前用户的公钥文件,将其上传到服务器上,然后添加进 ~/.ssh/authorized_keys 文件中:

cat id_rsa.pub >> .ssh/authorized_keys

添加完成后,服务器上的 id_rsa.pub 文件不用再保留,删除即可。要注意,authorized_keys 文件应该设置为别人不允许访问,确保足够的安全性。例如设置文件权限为600:

chmod 600 authorized_keys

当 SSH 客户端登录时, SSHd 默认读取该用户的 authorized_keys 信息进行证书鉴权。

修改 /etc/ssh/sshd_config 文件

PasswordAuthentication no

然后重启 sshd 即可:

sudo systemctl restart sshd

之后,客户端如果采用密码鉴权方式登录,或者粗暴破解,将被无情拒绝。

如果有多个客户端需要登录服务器,则需要各自生成证书,并将公钥上传到服务器,并添加到 authorized_keys 文件中即可。

Cloudflare 返回的DNS结果

Cloudflare 返回的DNS结果

最近查一个客户遇到的 SIP 呼叫问题,发现在检查 DNS 记录时有问题,没有正确获取 DNS 记录。切换了几个 DNS 服务器测试,只有 Cloudflare DNS 服务器(1.1.1.x 系列) 返回的DNS记录会触发问题。

这并不是说 Cloudflare 的DNS记录有错误,而是我们自己实现的 DNS 库没有考虑到该记录的不同寻常之处。Cloudflare 的返回结果确实有点与众不同。

下图是Google DNS 以及 Ali DNS 返回的DNS结果,请注意其中的 Name 字段的内容(0xC0 0x0C)

Google DNS 结果
Google / Ali DNS 返回结果

很明显,这种DNS结果采用了 compress 方式,通过 offset 来获取真正的Name。图中的 0x0C 实际就是偏移量,指向了包中的另一处地址。Compress 方式最直接的好处就是节省了包大小。

而 Cloudflare 的 DNS 结果如下图所示,直接将域名包含在 Name 中,以 0x03 标注开始,以 0x00 表示字符串结束。不再需要偏移指向其他地址。

Cloudflare 的 DNS 记录
Cloudflare DNS 返回的结果

这种方法的好处是够直接,不再需要跳转获取真实的域名信息。当然坏处是增加了数据包的大小。

我们测试了网络上大部分的 DNS 服务器,目前仅发现 Cloudflare 采取了这种方式,其他服务器都是采用 compress 方式。

站在“人”的体验角度,似乎 Cloudflare 更合理一些。但是要注意,compress 方式更符合计算机的处理,毕竟前面的 Queries 部分已经解析过 Name 了,没必要再解析一次。另一方面,直接 offset 寻址,也远远快于再一次通过判断0x00来解析Name 字符串。

因此我个人认为 Cloudflare 的处理方式,即拖慢了速度,又增加了数据包消耗。当然,以目前计算机的处理能力以及网络速度,这些都是浮云。我们的解决方式也是淡定地接受这个结果,并修改 DNS 库进行适配即可。

在本次查问题中,测试了网上公布的香港 DNS 服务器,全部拒绝了来自大陆 IP 地址的 DNS 请求,真有意思。