诗盗·中年女子不如鸭

《#诗盗#·中年女子不如鸭》:一车两位富休假,三餐一线穷在加。闲mang人岂识忙xian中趣?中年女子不如鸭。

注解

  1. 一对土豪夫妻,每人一辆车,车位紧靠,车牌就差一位。最近快过年了,土豪妻子已经休假,所以土豪把车停在俩车位中间,即一车占两位。

  2. 这说的是别人……大过年的还在加班!

  3. 这些别人明明好惨啊!但他们觉得忙才有意思……

  4. 那些穷逼的中年女子真不如鸭,嘎!

Nodejs 实现监控告警

作者: UMU @ MEET.ONE 实验室

钉钉

  1. 选择要接受通知的群,群设置 - 群机器人 - 添加机器人;

  2. 复制 webhook URL,记为 webhook_url;

  3. 发送通知的代码:

1
const fetch = require('node-fetch')

fetch(webhook_url, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "msgtype": "text",
    "text": {"content": text}
  })
}).then(function(res) {
  if (res.ok) {
    console.log('Dingtalk message sent!')
  } else {
   console.log('status = ' + res.status)
  }
})

Telegram

  1. 添加 @BotFather,发送 /newbot 命令,随提示逐步建立一个机器人,得到这个机器人的 token,记为 bot_token。

  2. 选择要接受通知的 Group 或 Channel,按以下任一方式取得 chat_id:

(1) 转发 Group 或 Channel 内的消息到 @getidsbot

(2) 通过 Web 版查看 Group 或 Channel 的 URL 中,p 参数 的值。

  • 如果是 Group,chat_id 为把 g 前缀替换为负号的负整数。比如 p=g268787210,则 chat_id = '-268787210'

  • 如果是 Channel,chatid 为 前部分,并把 c 前缀替换为 -100 的负整数。比如 p=c1383705039_968667419389618100,则 chat_id = '-1001383705039'

  1. 发送通知的代码:
1
2
3
4
const TelegramBot = require('node-telegram-bot-api')
const bot = new TelegramBot(bot_token, {polling: false})

bot.sendMessage(chat_id, text)

阿理银

2018-04-17,收到阿理面试通知邮件,开始观测。

2018-06-01,猎头和面试官都确认全部通过,只是遇到晋升季,HR 比较忙,会延迟谈 offer。稣同时还在面其它公司,所以觉得延迟点更好!

整个面试过程,亲身体会到阿理面试的专业性:有当面聊、写代码笔试、电话技术面两轮、HR 两轮。其中其它部门的技术官面试在专业上叫“交叉面试”,这是稣原公司没有的环节。另外,HR 有一票否决权,这要求 HR 的专业性要很高,否则很难服众。

2018-06-07,主面试官问能不能去杭州,稣其实早就想过这问题,他问的是能不能去 1 年,这远低于稣的预期,直接回答可以去 18 个月。稣 2010 年去过一次杭州,印象太好了,所以去几年,要是混得好,定居是没问题的。

期间,知道好多同事也面了,但他们大多选择待在厦门办事处,有些直接表示非厦门则拒。稣劝过,厦门只是个办事处,可能不长久,最好还是狠点,考虑长期利益去杭州。

2018-08-31,是在原公司最后一天。就在前一天,稣的选择还是不开竞业协议就去阿理银,开了就不去。原计划休息一个月,等 HR 把 offer 理清楚。然而由于稣太穷了,休息一个月?不可能滴,天不让!一辈子也别想休息……

整个 8 月份,现在的公司就每隔几天来催赶紧入职,直到最后一天,稣终于没有其它选项。09-04 入职,中间只休息了一天!

插播一句:现公司很豪爽,把稣的入职日算到 09-03,多发了一天工资!第一天就感动得一把鼻涕……

2018-09-10 早,杭州来电:

- 您好,我是你爸爸 HR,想和您沟通一下,阿理银的 offer。
- 哦……(心理活动:我爸爸?哦,原来是阿理爸爸)稣这个月才刚换公司,过几年吧。谢谢啊,谢谢!
- 这样啊,那不打扰您了,祝您工作顺利。

2018-10,稣了解到的厦门阿理银情况,越来越像自己预料的,混乱、军心难聚。加班太厉害,大家叫苦连天,大佬都在杭州、上海,沟通不便。

当然,稣只能看到槽点。因为如果有些人在厦门阿理银混得很好,他肯定不会找稣吐槽。不过,光看这些问题,稣完全有优势,这些都是稣善于解决的问题。

稣是说如果……厦门阿理银以后如果撤了,很可能就是因为——错过了稣。反过来,如果壮大了,那是某些人的不幸,稣是看好阿理文化的。

这次没有吓醒。

人工神经网络究竟是什么鬼?

难解释的问题,就举个简单的例子说明。PS:稣才入门,也不懂不简单的例子……

题目

有一个未知的函数 f(x1, x2),其中 x1、x2 取值和结果符合下表:

x1 x2 f(x1, x2)
0 0 0
0 1 1
1 0 1
1 1 0

求 f(x1, x2) 的表达式。

求解

人脑抢答

知道异或运算的人可以马上抢答:f(x1, x2) = x1 ^ x2,其中 ^ 是 C 语言里表示 XOR 的运算符。

很明显,这答案是准确无误的,人脑的速度还可以……

放开那个函数,让 AI 来!

人工神经网络(Artificial Neural Network,简称 ANN)解决问题的思路相对而言不太精确,大概就是——通过几个函数算出一个近似值,接近 0 就说是 0,接近 1 就说是 1。

首先,引入一个激活函数:

1
sigmoid(x) = 1.0 / (1 + exp(-x))

举个例子:sigmoid(1.777) = 1.0 / (1 + exp(-1.777)) ≈ 0.855326

类似的激活函数还有 tanh,但其实用 ReLU 更好,既简单又接近生物上的神经元。参考:在神经网络中,激活函数sigmoid和tanh除了阈值取值外有什么不同吗?请问人工神经网络中的activation function的作用具体是什么?为什么ReLu要好过于tanh和sigmoid function?。但是 sigmoid 比较古老,很多教材拿它举例,稣也沿用它。

我们要求的函数是这样的:

1
f(x1, x2) = sigmoid(w1 * g(x1, x2) + w2 * h(x1, x2) + w3)

其中:

1
2
g(x1, x2) = sigmoid(wg1 * x1 + wg2 * x2 + wg3)
h(x1, x2) = sigmoid(wh1 * x1 + wh2 * x2 + wh3)

最终要求的是这三对系数:

1
2
3
wg1 wg2 wg3
wh1 wh2 wh3
w1 w2 w3

通俗说法叫求 w,其中序号为 3 的系数,又叫 bias 或者 b。

函数 f、g、h 其实就是一个神经元(neuron),结构如下:

神经元结构图

神经元结构图 DOT 源文件

训练出来的一个解是:

1
2
3
-5.734 -6.029 1.777
-3.261 -3.172 4.460
-6.581 5.826 -2.444

下面我们来验证一下,举例 x1 = x2 = 0 比较容易算:

1
2
3
4
g(0, 0) = sigmoid(1.777)0.855326
h(0, 0) = sigmoid(4.460)0.988570
f(0.855326, 0.988569) = sigmoid(-6.581 * 0.855326 + 5.826 * 0.988570 + -2.444)
= sigmoid(-2.313491586)0.0900120

结论

ANN 就是数学的运用,训练就是在随机的 w 组合通过参考已知解逐渐纠正误差,逼出正解 w 组合。

打个比方,练习投篮的过程:肉眼观测,无数次调高低角度、出手力度、左右偏差,最终找到一套合适的参数,这个叫培养了球感……

机器学习也差不多是这样的过程,只是它比人快很多。

十年生死两茫茫

1. 稣为什么能在 KJ 待 10 年之久?

答:因为找不到工作。

2. 稣真幽默!

答:稣一向都很严肃,是真的找不到工作……

3. 哦,为什么呢?

答:因为稣知道的太多,一学会就忘。正常的招聘要的是经验,稣没有经验,只有智商。另外,厦门的公司能选择的不多。

4. 不尝试写下来备忘吗?

答:写了。领导不让发表,只能发点皮毛。智商这个东西也不好描述清楚。

5. 有打算创业吗?

答:一直在创,但感觉不够高大上,冒然出手可能被绑定在一个不够高大上的业务上。

6. 听说稣很有钱是真的吗?

答:是……真的……吧!但是 KJ 70-80% 的人比稣更有钱。赫赫……

7. 稣还是蛮幽默的。

答:你高兴就好。稣只是穷得没那么焦虑。

8. 十年最大的感想是什么?

答:活着很容易,活得好很不容易。

9. 稣觉得自己活得好吗?

答:好

个鬼。

10. 有什么建议给大家?

答:挨踢无情,你承受不起,奉劝各位亲朋好友——千万不要学 C++。

诗盗·卧龙小成

《#诗盗#·卧龙小成》:挨踢悟岁月,奇路游红尘。十年浑似醉,回首卧龙深。

改编自霹雳角色“北窗伏龙曲怀觞”的诗号。

天涯无岁月,
歧路有风尘。
百年浑似醉,
是非一片云。

唐朝骆宾王的《春日离长安客中言怀》:

年华开早律,霁色荡芳晨。城阙千门晓,山河四望春。
御沟通太液,戚里对平津。宝瑟调中妇,金罍引上宾。
剧谈推曼倩,惊坐揖陈遵。意气一言合,风期万里亲。
自惟安直道,守拙忌因人。谈器非先木,图荣异后薪。
揶揄惭路鬼,憔悴切波臣。玄草终疲汉,乌裘几滞秦。
生涯无岁月,岐路有风尘。还嗟太行道,处处白头新。

南吕词人张可久的《金字经·乐闲》:

百年浑似醉,
满怀都是春。
高卧东山一片云。
嗔,是非拂面尘,
消磨尽,古今无限人。

注解

工作十几年了,其中在第二个公司差几天就十年整。

云存储

小冰的磁盘坏了,拿去给技术部阿基修,阿基手法纯熟三下五除二就把数据备份出来,小冰交口称赞技术高超。

阿基很谦虚的说:“哪里哪里,我们技术部各个都是淫才,我的技术只能排老三。”

小冰很好奇地问:“不是传说你最好?还有人更厉害?”

阿基指了角落里的米德,说道:“那位技术就比我好,他都建议自建 RAID10 NAT,又安全又保密,磁盘挂了自己就能修复,所以很少人找他,名气也就不高。”

“你再看那边,那位瘦瘦的米开,他都建议使用云存储,所以他们的磁盘不会坏,他的高超之处在于预防故障在前,而且节省成本,但个人用户都不懂云存储的好处,所以他的名气也不大。”

“而我,只会拯救已坏的磁盘,救别人于危难之中,所以名气最大,但实则没有技术含量。”

小冰听完觉得十分有道理,于是选技术部最帅的罗基朗……帮忙买一块新的硬盘。

穿越 2018

1. 白洁的故事

现在是 2017 年 12 月 29 日 22 点,哥在西湖边的一个咖啡厅,思考人生。

差点忘记自我介绍,哥叫白洁,呃,男,不是你们想的那个少妇……是一名爱岗敬业的专业运维,日常工作是写脚本,比如这样的:

1
rm -rf /

这样的:

1
python -c 'import os; os.system("".join([chr(ord(i)-1) for i in "sn!.sg! "]))'

还有这样的:

1
dd if=/dev/zero of=/dev/sda

好吧,你们可能看不懂,说人话,哥是一名背锅侠……黑锅可以背,但是绿帽哥是不能戴的,完全无法忍受。

幽绿的灯光映射在田牌笔记本 Logo 上,哥若有所思,咖啡厅的 BGM 很应景地放着:“爱是一道光,如此美妙”,纳尼,还朗朗上口,居然不由自主跟着哼起来!!

但是哥很快陷入深思,快 4 个月前,哥从币特宝公司离职,理由是老板给哥发了一顶绿帽。

这个公司原来是一个游戏公司,2014 年时,游戏业务有很稳定的收入,老板发大财,团队也有些人员空闲出来,于是老板想扩展新业务,选择了当时很火的皮土坯理财,所以后来公司就有两大业务,都很赚钱。

老板也是个蛮年轻的人,脑子转得快,钱也赚得快,但有个毛病——喜欢 PBC……长话短说,哥追了 8 个月的女神,彼此已经默认,周边人也都认同了,快送入洞房时,迅速失败,原因居然是女神被老板砸钱收走了!

哥离职前就暗自发誓要报仇!在新公司上三个月班,业余时都在学习社工和黑客技术,准备选择目前比较敏感和脆弱的皮土坯业务下手,下一个重重的黑手。

打开田牌笔记本,架起美国云主机加蓝灯,用脚本把以前记录的服务器试探了一遍,通过端口开启情况判断,服务器和上面跑的应用都变化不大,但哥早已没有权限登录,实在懊恼!

尝试了几个系统漏洞,都不成功,难道技术还不够硬?一个小时过去了,有点心灰意冷……果然时间就是金钱,想那时,哥拥有所有服务器的最高管理权限,但基于职业道德,并没有故意留下什么后门。苦恼啊!

等等!时间就是金钱!对了,早期哥部署服务器时,曾经架设过一个 NTP 服务器,币特宝公司的所有服务器都会向一系列的 NTP 服务器同步时间,其中就包含了哥架设的那个 gsntp.cc,当时技术总监有亲自审核过同步脚本,大家还开玩笑地说,那个是“高速 NTP”的意思。事实上,大家并没有重视这个事情,gsntp.cc 是哥个人的域名,是在上上家公司就存在的,大约 2010 年到币特宝时,直接给用上了,直到扩展皮土坯业务时,才有人问过,但由于存在历史悠久,没人去怀疑什么。

后来哥的个人云主机到期,没有续费,NTP 服务也失效了,但由于 NTP 服务器列表有好几个,所以第一个失效也没人发现异常。更加天助我也的是,技术总监是个比较抠的人,币特宝公司内部其实也有自己的 NTP 服务器,但他怕服务器负担大,把自己的服务器放在列表的最后,美其名曰保护资源。哥哈哈一笑,用手指托了托墨镜,赫赫,哥没有近视,戴墨镜是为了在咖啡厅装逼,5.2 视力的双眼,紧盯着屏幕,一个计划展开,指令在键盘上咔咔地输入,一个小时后,这个公司将会陷入漩涡。

23:46,由于是周末,这时候有大量玩家,哥在贴吧已经看到大量玩家在骂,更厉害的是皮土坯的贴吧,很多人在怀疑老板是不是要跑路,自己的钱是不是都飞了……还有一个帖子很好玩,自称内部人士,说这公司快倒闭了,因为欠运营商巨款,服务器被强行断网。神助攻啊!以这家公司的尿性,一群人需要至少 3 小时才能处理好故障,而哥已经准备清理一切,喝完最后一滴咖啡,离开。

2. 值班运维小弟的故事

小弟是一名运维,平时的工作主要是看监控图,有这样的……这样的……还有这样的!没错,其实并没有图,都是一些曲线而已。然后简单分析告警原因,如果解决不了就叫人。

放假前夜,他们都出去 high,就小弟们俩在值班,一切风平浪静地有点困,另一个小伙伴嫌无聊,去蹲坑兼抽烟。趁他不在,顺便骂一句:香烟,真基罢臭。小弟想起,以前看某手机大厂创始人接受采访时,居然当众抽起烟来,这素质……有钱也是乐射。

心里正骂得爽时,突然就出事了,各种应用错误飙升的告警,一台台报上来,直到重要的交易服务器也告警了,小弟几乎吓尿,另一枚小伙伴估计正在吓屎……已经 23 点后,大部分人可能都比较难找,只能硬着头皮一个个电话打过去,慢慢地叫来几个人,产品经理、项目管理、开发。

人是来了,但灾难面积还是一直扩大,小弟已经双腿发软,领导也赶来群聊问话。这简直是小弟职业生涯最壮观的一次救灾时间。围观了一个小时,才有人发现时间发生了跃进,跑到 2018 年 2 月,然后再倒退回现在的正常时间。这直接导致各个分布式系统的核心组件崩溃,进而引起所有集群雪崩……

然而为什么会这样呢?却是木有人搞明白。直到一个扫地僧出现,三言两语之后就发现问题根源出在 NTP 同步脚本。小弟真是佩服,佩服。

3. 扫地僧的故事

作为一名扫地僧,修身养性是基本技能,23 点就睡觉比啥修炼方法都简单实用。周末,最多也就晚个一小时。洗澡时,领导连续给贫僧打了 4 个电话,肯定没好事,最后接到的时间是 23:35,果然出大事了。

线上的问题,正常情况下贫僧是不参与的,之前也没有领导半夜打来电话问候,嗯,平时早就关机了,赫赫。总之,贫僧就安静地扫地,宁静以致远。接到电话时,也是懵逼,但领导特别关爱,明显马上开机干活,说不定还能露两手装装逼。

从工作群的聊天记录看,时间曾经发生跳进和倒退,而且是大规模,这只有 NTP 服务器出错才有可能,于是贫僧看了 NTP 同步脚本,里面有个 gsntp.cc 很可疑,好像是“搞死你逃跑,嘻嘻”的意思……What??居然还是放在同步列表的第一位!然后是 asia.pool.ntp.org,最后才是公司自己的……实在无语。另外,为了分散服务器的压力,同步脚本的计划时间还是随机产生的,每小时一次,但分钟数不一样,所以出问题的时间各自不同,但在一小时内大量出事。那为什么时间又迅速自己复原了?坑爹呢!计划任务里居然有两个时间同步!一个是指向刚刚看的脚本,另一个是直接一行命令强行同步 asia.pool.ntp.org。这一切都对上了,那么是不是这个 gsntp.cc 搞的鬼呢?敲了个命令向它查询时间差,结果这个域名指向的根本就不是 NTP 服务器,而且是加拿大的 IP。怀疑有人在这一小时内,开启了 NTP 服务,导致时间错乱后,又迅速关闭。

查一下同步脚本的 log……尼玛,这 log 里面只有一堆的“同步成功”,没有记录同步前后时间!这特么是谁写的!

蛋定,蛋定,这种事情不是第一次遇到,目前只能全线撤除这个时间同步脚本,改天让人精心改造后再上线。这故障已经找不到负责人了,也没有铁一般的证据解释根本原因,但贫僧的第六感认为这一定和三个月前的那个事件有关。于是贫僧宣告:可能是 DNS 被劫持,NTP 服务器列表中有一个被解析到某个时间错误的 NTP 服务器上了。这么离奇的巧合,你们信吗?

4. 吓醒

稣是不信……本故事纯属做梦,如有雷同,请吓醒!