前面我写了一个系列共三篇的智能家居实践,用的是 Amazon Echo 实现语音控制,但是 Amazon Echo 用户群体太小而且这玩意并没有在中国上市,日常使用中也是各种水土不服,让很多朋友有心无力。然而,正如你早就看到的标题中说的那样,我们还有更容易获得的工具,那就是 Siri。 自从苹果推出了 HomeKit 以来,鉴于苹果庞大的用户量,不断开始有家电厂商开发出兼容 HomeKit 的家电。然而第一个吃螃蟹的人总是有代价的,这些电器的价格不是太贵就是中国买不到,所以使用

终于到了这一临门一脚了。前面了解了这么多基础知识,这一篇,我们终于可以完成这最后一步了 ———— 接入硬件。 理论上市面上所有能接入 Wifi 用手机控制的电器都能用 HomeAssistant 控制。 比如我的硬件列表有:Yeelight, 小米多功能网关, 米家智能插座, sonoff开关,还有 ESP8266 模拟 Wemo Switch,最后还有一个神器 BroadLink。 先来说说 Yeelight 怎么接入。 文档在这里,

这一篇我们要开始学习使用 HomeAssistant 了。在此之前,为了更方便地写代码,我们还需要做一些准备工作。 (一)开启 Samba 还记得上一节中我们使用的 FTP 软件吗?你可以在 /home/pi/hassbian-scripts 这个目录下找到一些已经预装好的脚本,如果没有,可以以 pi 的身份 clone 这个 repo : git clone

某天我像往常一样逛知乎,突然就看到了一篇文章,文章内容是“马克扎克伯格自己打造的智能家庭 AI — Javals”,我相信看过这篇文章或者知道这个报道的人肯定不少。我当时也没觉得我自己也能打造一个 AI 系统,因为小扎的一套完全从改装硬件电路到中央服务器都是自己实现,我没那么大本事,但我当时正好沉迷于效率软件 IFTTT、Workflow、Alfred,其中我发现 IFTTT 里面有很多 Applets 和硬件有关,这勾起了我的好奇心,我虽做不到小扎那样的工程,但能不能利用市面上现有的产品,打造一个类似的智能家居系统? 首先我觉得,

本文只用作技术交流,切莫干出格的事情,请使用者不忘初心。 事情的起因还是昨天虾神放出了这篇文章,外加上对 Pokemon 的强烈热爱,让我第一次有动力实现一次逆向。准确地说,只是第一次重签名。因为虾神把大部分事情都做完了,留给我们动手的只剩重签名这一步了。然而虽然仅仅只有一步,也让我这个逆向新人整整折腾了 5 个小时。不过收获嘛也不小,补了之前漏下的证书的那些事而且也入门一点逆向。 一. 重签名 .dylib 首先,我们 clone 好虾神的项目。你会看到这样的目录结构:

你还记得当初的梦想吗? 三天前,我突然这么问自己。缘于我去了一次学校,进行毕设答辩。 我突然才意识到,原来我还是个理论意义上的学生。九个月前的今天,我还在这里上学、下课、教室宿舍两点一线;如今,我竟然已经成了工作了九个月满脑子只有工作和代码的准毕业生了。 时间真是个可怕的东西。它让人麻木,磨平人的棱角,让人变成一模一样的工业品。仅仅是搬离学校这九个多月,我就已经变得这么世俗。我已经忘了当初在寝室许下的踏遍五大洲的誓言,我甚至发现和室友的微信对话也已经滑到了列表最下方。以前嘲笑工作了的人失去了年轻时的理想和抱负。现在看看自己,真是讽刺。 今早一睁眼,我发现手机上有一条未读消息,

最近工作陆续生产了一些方便开发的工具类,尽管最终没被收入使用,但不妨碍个人使用,故特此开一篇博文,也记录一些自己踩的坑。 UIGestureRecognizer+Block 简单来说,你可以这样使用 UIGestureRecognizer: [self.view addGestureRecognizer:[UITapGestureRecognizer gestureRecognizerWithActionBlock:^(id gestureRecognizer) { //... }]]; 不再需要繁琐地使用 selector 反射,也解决了代码分离的问题。 实现代码如下: static const int target_

已经被玩烂的题目,纯粹好玩,直接上代码吧。 定义树: class Tree { var key: Int var leftTree: Tree? var rightTree: Tree? init(key: Int) { self.key = key } } 非递归实现 思路:广度优先。从上往下,从左往右。

很惭愧,标题很浮夸,其实就是消息转发啦。想这个标题想了很久,本想着取个形象生动有意思的标题,不想水平不够,于是就搞了这么个奇怪的名字出来。但今天这篇博客的确有那么点一箭双雕的意思。 摆事实,讲道理。我们先看这么一个场景。我正在写一个自定义的 TableView 滚动条,可以实时显示当前 Cell 的编号,比原生的黑条更具可视性。 实现原理也很简单,KVO 监听 contentOffset 然后根据 public func indexPathForRowAtPoint(