让淘汰的旧手机几分钟变为全天候监控摄像头发挥余热

虽然双十一已经过去几天了,但是相信还有不少人还沉浸在剁手的快感和收货的愉悦之中。我也不能免俗,这个双十一除了一些生活用品,同时剁了两个手机,一个水果,一个安卓。

新手机自然拿到手里都是“真香”,但是淘汰的安卓手机处理起来真的挺尴尬的:卖二手吧,价格低到让你有扔垃圾桶的冲动(在保值率上,水果真的是秒安卓几十条大街);真的扔垃圾桶吧,又很难接受自己抱着一个“垃圾”用了一年的事实……

本着物尽其用+尽可能少折腾的原则,参考了一下蛤乎的如何充分利用闲置的旧手机,让其发挥余热,准备把淘汰的安卓手机变成一个监控摄像头。

简单Google了一下,第一个找到的是掌上看家的app. 我相信很多人无论是搜索文章还是视频,第一个找到的大概率都是它。如果你是想把旧手机变废为宝,就不要浪费时间安装这个app了,因为这个方案免费版只支持640分辨率的。高分辨率的收费比海康威视硬件方案还贵。应该说贵的离谱。商业行为没有对错,只是告诉大家,这个掌上管家的方案横向比较下,没有存在的意义。

顺着线索跟了一下,原来掌上关键其实是copy海外获得了Google应用大奖的“阿福管家”。这个方案非常良心,免费方案几乎没有任何限制,而且产品体验优秀。唯一的缺点,也是需要科学上网才能使用……心有不甘,尝试了一下,只能放弃。

转了一圈,最终锁定到了”IP摄像头”这个应用上。这个应用非常符合这次折腾的目的——快糙猛:只需要在旧手机上安装一个IP摄像头的app, 然后通过一个http地址就可以实现对摄像头内容查看与控制。分辨率可以轻松上到1080P。

由于想在运营商的限制,如果希望通过公网远程访问IP摄像头,则需要做一下内网穿透。这块对于老司机来说应该都不是问题,简单说下我推荐的方案:

(前提是你的宽带有一个公网IP,如果没有公网IP……那下面的就不用看了)

一共两步:

  1. 使用DDNS将域名解析到自己的公网IP,并保持更新。
  2. 设置公网端口与内网端口映射。

使用DDNS解析域名到公网IP

如果你已经熟悉DDNS,那么你应该已经知道DDNS的多个服务上,以及他们的优劣,可以略过。总之,不要使用花生壳:不付费不能用;付费之后喂你eating shit, 更难受。这里推荐ChangeIP家的服务,原因很简单:真正免费,无套路送DDNS域名。

  1. 首先到ChangeIP官网注册账号,并到邮箱激活。邮箱请认真填写,激活邮箱后才能获取免费DDNS服务。
  2. 然后在Free Dynamic DNS Hosting选择免费的DDNS域名,一路continue确认即可。假设我们申请到的域名是 demo.dynamic-dns.net
  3. 申请到域名以后,下载Dynamic DNS Update 这个app到旧手机,然后配置ChangeIP的账号和域名实现DDNS自动更新。

公网端口与内网端口映射

  1. 到旧手机的wifi连接选项中设置IP获取方式为静态。假定我们最终设定的手机静态IP为192.168.1.101
  2. 在拨号的主路由上设置路由器的端口转发规则。IP摄像头默认的http端口是8081,这是一个比较敏感的端口,建议大家把公网端口换一个高位端口,例如公网 11170 端口映射到内网手机(192.168.1.101)的8081端口上.

一切就绪以后,给旧手机找一个风水宝地插上电源固定好,通过 http://demo.dynamic-dns.net:11170 访问我们的旧手机摄像头了。你也可以在新手机上也安装一个IP摄像头app, 然后把这个地址添加进去就可以在手机上远程查看了。

Enjoy!

秋天的况味

大概我所爱的不是晚秋,是初秋,那时暄气初消,月正圆,蟹正肥,桂花皎洁,也未陷入凛冽萧瑟气态,这是最值得赏乐的。

那时的温和,如我烟上的红灰,只是一股熏热的温香罢了。或如文人已排脱下笔惊人的格调,而渐趋纯熟练达,宏毅坚实,其文读来有深长意味。

这就是庄子所谓“正得秋而万宝成”结实的意义。

——《秋天的况味》 林语堂

可能是因为秋天出生的缘故吧,每每重要的决定,印象深刻的经历都发生在秋天。

去年的满满焦虑并没有在今年化解,反而有愈演愈烈。要说今年秋天与去年最大的不同,也许应该是看事情的不缓不急与平和,如同路两旁的桂花,毫不起眼,但是散发着绵长独特的香味,难以忘怀。

是日,老爸张罗了一桌菜,老妈说几十年来,老爸这是第一次。傍晚时候,妞儿发来了家里门铃的出入记录:一段老爸今天十几次出入的记录。盯着屏幕发呆了良久,不知道说什么,假装俏皮的回复了一个狡黠的表情。当妞儿说父爱如山,内心深处一直想不表露的小心思,瞬间崩溃。子当如水,父爱如山,这是需要去体悟和兑现一生的事。

回成都以后,很多北京的朋友,亦师亦友,少了很多叙旧的机会。赶着国庆后的第一个周日,见到了大学的恩师。为导师如今的发展和成就由衷高兴,当然也免不了作为当年实验室第一批排头兵暗自自豪。了解到了很多朋友的近况,然后对应着他们每个人朋友圈对应时期的晒图,深感每张图背后的拼搏不息与勤勉向前。哪有什么岁月静好,也没有什么easy模式,为最好的结果努力,为最坏的结果买单,成长路上,难免如此。

曾经以为自己是一个能够仗剑走天涯的人,但是发现是一个特别小家情怀的人。国庆所有在老家的时间都花在了拾掇老家的“杂事”上。解决了好几个十几年一直用起来不顺手但是却一直“将就”过来的设计。当然,也免不了两个手都有轻微挂彩。我想,哪天自己真的干不动的时候,这里就是自己养老的港湾了吧。不过,现在还远远、远远不是时候。

女儿一天天长大,已经从当初盼望她快快成长的心态扭转为希望她长慢一些,再慢一些。陪她玩的时候,接她幼儿园放学的时候,心态上会不由自主的举重若轻,不仅仅是因为发现她又长高了,而是感受到了一种独特的“小确幸”。

邓肯说:“世人只会吟咏春天与恋爱,真无道理。须知秋天的景色,更华丽,更恢奇,而秋天的快乐有万倍的雄壮,惊奇,都丽。我真可怜那些妇女识见偏狭,使她们错过爱之秋天的宏大的赠赐。”若邓肯者,可谓识趣之人。

时序异常数据检测从理论到落地

最近在解决一个挺有意思的问题,该问题可以抽象简化为:如何检测外部依赖接口发生异常。如果是在中小公司,那么这个问题其实是不需要解决的,从研发层面规范接口的格式,并规定依赖接口必须达到要求的可用性,只要调用成功率低于规范就进行告警。不幸的是,这个方法在当前的BU中是推不动的,是为背景。

简单的对接口调用失败量对齐时间轴看了一下,这是一个典型的时序数据异常检测问题。

从分类看,当前发展阶段的时序异常检测算法和模型可以分为一下几类:

  • 统计模型:优点是复杂度低,计算速度快,泛化能力强悍。因为没有训练过程,即使没有前期的数据积累,也可以快速的投入生产使用。缺点是准确率一般。但是这个其实是看场景的,并且也有简单的方法来提高业务层面的准确率。这个后面会提到。
  • 机器学习模型:鲁棒性较好,准确率较高。需要训练模型,泛化能力一般。
  • 深度学习模型:普遍需要喂大量的数据,计算复杂度高。整体看,准确性高,尤其是近段时间,强化学习的引入,进一步巩固其准确性方面的领先优势。

而我们希望在9月份就能够上线运行,并且没有历史数据,更不要提打标数据了。因此,只能选择统计模型作为一期落地的方案。而在统计模型中,twitter 在2015年发布的 AnomalyDetection 自然是翘楚。如果你正好使用 R 语言,那么直接上手就可以用。如果你需要 pure python 版本,推荐使用 Twitter’s Anomaly Detection in Pure Python.

S-H-ESD 原理

twitter 公开的异常检测算法的核心是使用了S-H-ESD异常检测算法。这种算法的思想是将时序数据使用 STL 分解,然后将分解的余项使用 Grubbs’ Test 进行异常点的检测(实际使用的算法考虑了极值异常点对整体的影响,实际使用的是的Grubbs’ Test变形)。关于算法的细节可以参看 twitter 发布的论文 Automatic Anomaly Detection in the Cloud Via Statistical Learning. 显然,这个算法之所以有效的两个关键就是 STL 和 Grubbs’ Test。

STL 将时序数据分解为 趋势 + 周期 + 余项:

直观上,可以将趋势项理解为时序数据的骨骼;周期数据是数据的振幅;余项是则是消除趋势和周期数据后,相对平滑稳定的“皮毛”。而这种皮毛数据是符合 Grubbs’ Test 假设中正常数据正态分布的。反之,则被 Grubbs’ Test 认为是异常数据。

因此,S-H-ESD 只适用于周期性数据。对于无周期性或数据变化特别剧烈的时序数据,S-H-ESD都不是好的选择。

S-H-ESD 用于生产环境

S-H-ESD 原理简单,理论效果也非常不错,基本起手能达到 40% ~ 60% 的准确率。但是实际应用中经常会遇到以下典型的误报情况:

而这种误报其实很难从算法本身消除,即使消除了其实也没有泛化性。一种简单的思路是引入更多数据和规则:

  • 上图中我们只是用的接口的报错量作为时序数据,单村在报错量上提高准确性在统计模型这个大前提下边际成本已经很高了。因此,可以考虑引入接口调用量和成功率来综合判断该点是否真正异常。
  • 结合实际业务,设定一些简单的规则减少误报量。对于我们的场景,可以设定的规则有报错量的基础阈值、报错点的持续时长等。

S-H-ESD 不是银弹,结合多维数据和业务规则以后,准确率基本达到了我们的预期。S-H-ESD 也不是终点,确切说是我们顺便解决当前问题,同时收集异常数据的手段。未来,我们会尝试结合深度学习模型提高异常检测点上的准确性,同时融合多维数据,将点上的异常检测逐步整合为线和面上的检测能力。

扩展阅读