Siri Shortcut 初体验

Siri Shortcuts 始于之前的 Workflow。实话说,自己当时对 Workflow 的印象属于鸡肋,由于 iOS 系统的限制,很多功能做不到,也需要在 Widget 去启动。相比 JSBox 的直接明了,功能确实差了不少。而自己却连要用 JSBox 做什么都没想明白,更勿谈 Workflow 了。因此,尽管苹果收购了 Workflow,我也没有对这个应用抱有太多注意力——手机上能做到的所谓效率和自动化实在太有限了,在这上面刻意追求有些错了方向。同样的,还有 IFTTT 这样的应用,不过它的着重点和 Workflow 似乎不太一样,有许多 Applet 是完全不依赖本机的。(比如每个 Google Voice 用户都会尝试的保活 Applet)

今年的 WWDC 推出了 iOS 12,其中将原来的 Workflow 和 Siri 整合到了一起,作为一个新的系统功能叫做 Siri Shortcuts。当然,还是需要额外安装。我一直觉得,Siri 是个有些无用的东西。(当然了,所有的语音助手在这一点上都没什么根本区别,而 Siri 的语音合成还明显不如微软的 Cortana)今年 Google 在开发者大会上用语音助手自动点餐的 Demo 震撼了许多人。而苹果终于选择放下曾经的固执,朝着另一个方向,在 Siri 有根本性的突破之前,走一走 Amazon Echo 的路子,让用户自己定义自己的语音助手。

把 Siri 和 Workflow 结合起来,意味着你可以自定义语音指令,驱使手机去帮你做一些事情。这无关所谓真正的「智能」,不过这确实让它变得更加实用了。另外,Workflow 变成 Shortcuts 之后,显得更加官方化,有更多苹果生态下的 App 开发者主动为它提供了接口,这也使得它的功能边界更拓展了一些。

这里是个有趣的例子,我们想要检查一个人有没有发布新的微博。不想每次都点开,甚至像我这样把微博 App 删除了的人连特别关注都没得设置。我们想用 Siri 做到这一点。就以@带带大师兄为例吧。

新建一个叫做「孙狗微博」的 Shortcut,在里面随便设置一个喜欢的颜色和图案。

New Shortcut

点击进入编辑内容。首先我们需要一个信息源。Shortcuts 有 RSS 的组件,但微博并没有给我们提供官方的 RSS 接口。或者可以在自己的一台 VPS 上写一个脚本定时刷新内容然后暴露一个 API 出来,但这样也太麻烦了。Shortcuts 支持在给定页面上运行一段 JavaScript 代码并返回结果,这个不错。不过这里发现了更好的选择,即微博的 API。这个 API 是从网页调试工具里发现的,带带大师兄的微博内容在这里,以 JSON 格式呈现。

我们需要的字段主要有两个,一个是最新一条微博的发布时间,一条是最新一条微博的内容。方便的是,微博已经帮我们处理好了发布时间的可读性,近在 3 小时前发布的微博,结果会显示为 3 小时前而不是具体的时间。

JSON Format

好了,我们现在可以使用 Shortcuts 的 URL 组件,将字符串「转换」为 URL 对象。然后用「Get Contents of URL」获取内容,注意是 GET 方法。这个的结果就是这个 API 返回的字符串了。

URL Component

接下来需要获取指定位置的数据,在 data/cards/2/mblog 中。我们先将之前的字符串利用「Get Dictionary from Input」转换为 Dictionary,然后一步一步拿到数据。注意,这里的 List 索引是从 1 开始的。

Get Dictionary from Input

mblog 这里的时候,因为我们要用两次,所以先保存到一个变量中,用「Set Variable」,这个组件的输出就是变量的值。

Set Variable

于是乎就可以把时间先念出来了,用「Speak Text」。我手机的语言是英文,所以这里的「Language」不能为默认,而是要指定成中文,不然 Siri 会念不出来。如果系统语言是中文的话应该不存在这个问题。

Speak Text

接下来也一样,先取出之前保存下来的 mblog 的值,因为 JSON 里的原结果是 HTML,所以要先转换一下,不然 Siri 就会把标签符号一个一个念出来了。话说,这里还有富文本、HTML 和 Markdown 的相互转换工具,很有用。

https://i.e7s.me/4a510892-b64b-4e5c-a17a-41bacc500192.jpeg

最后我们在设置里指定一个语言指令,比如「孙狗发微博了吗」。

Text Command Content

看起来运行得不错。

Demo

自 iOS 12 正式版发布以来,有很多应用都专门加入了针对 Siri Shortcuts 的更新。在选择组件的界面,我们也可以看到有许多应用提供的接口,包括我手机并没有安装的 Ulysses 和 Drafts。结合应用的 x-callback-url,能做的事情可以很多,只要有足够的想象力。当然,像我们这里这样简单的流程,已经需要比较复杂的定义和操作。如果真的有更复杂的需求,还是用 JSBox 和 Pythonista 这样的应用好一些。不过,目前这两个应用还不支持从应用返回结果,只能执行特定脚本然后返回输入。希望未来他们能够做得更好。

最后,我把这个 Shortcut 放到了 iCloud 上

高考小记

不知不觉,已是高考结束的第四年了。当初一起参加高考的同学一个个都开始分享自己穿着学士服的毕业照。有些还认得出,有些已经换了个样子。大概知识的冲刷都让大家变得有了内涵。不过我们几个男生,不管讲究的还是不讲究的,从照片看上去还是一个样。倒也只能安慰自己,男性往往成熟得更晚一些。大二的时候还会看到有同学自信地穿着不合身的西装,似乎现在都意识到了,暗示自己是学生会干部,也不过是在朋友圈里多拿几个赞而已。

对于四年前那场考试及其前后的经过,记忆早就变得模糊,也不知道是身体机能在下降,还是时间真的可以抚平痕迹,不光是自己作留下的短暂伤痕。刚上大学那会,大概每隔个礼拜睡觉就会遇到「回去高考」的噩梦,有时候还附带走错考场这样的大礼。后来慢慢就没有了。直到最近,偶尔又开始陷入这个奇怪的梦境中难以脱身。联想自己最近的心理状态,我才意识到梦的逻辑未必那么简单。辛苦也好,不公平也好,高考都不是一场单纯的灾难,也不是压力的重点和释放的起点,十二年以来的课堂在我们心中种下了强烈而又时常不自知的暗示——高考是一场改变,或者说,革命,如果你愿意把人生看作一段历史的话。它可能将你带上高峰,也可能推你坠入深谷。安居乐业的人民是不会革命的。所以当自己不满现状的时候,高考之火又会在熟睡的深夜燎原。尽管高考早已结束,但它实在是和「改变命运」四个字形成了过于深刻乃至本能的心理关联。也因如此,许多人高考期间并不沉闷忧郁——大学能有高三苦吗?其实,中考前我也有过类似想法。

Continue reading “高考小记”

说说隐私

隐私很重要。每个人都知道。可什么才算隐私呢?小时候和同学课上传的小纸条、学期结束给老师的评语、自己拍摄的照片……给定一个事物,我们往往能对它属不属于隐私作出判断。但是对于「哪些是我们的隐私」,我们好像并不如「我家里都有哪些人」清楚。

好吧,按照惯例,先来看看隐私一词有无相对准确权威的定义。

任何人的私生活、家庭、住宅和通信不得任意干涉,他的荣誉和名誉不得加以攻击。 人人有权享受法律保护,以免受这种干涉或攻击。

此定义来自于《世界人权宣言》,亦算作是各国政府制定相关法律时需参考的材料。宣言起草于 1948 年,时值二战结束,各国都已承受过人权被肆意践踏的惨烈后果。然彼时尚无成体系的数字信息存储,更无如今社会无孔不入的网络通信。因此在数字时代,隐私的外延已经有了发展变化。而巨头和权威对个人数字化隐私的监视,也让更多的人重新思考如何用新的方法保护隐私。
Continue reading “说说隐私”

记2017年开源年会

说起来开源年会过去都已经两周了。写参加某项活动的经历似乎像是小学生写作文,不过还是有必要的,毕竟这也算一个自己一直以来向往的事情。每个人对于「开源」的认知都是不同的,这类活动也是,各取所需。说白了,也可以用这种观点来看待上课。现在的课程,一类已会,一类不会,到头来还是没什么长进。

会议的流程和其他技术会议类似,签到入场后门口一排赞助商在为自己的产品打广告。场内演讲的时间很紧凑。有些内容感兴趣,有些内容又有点鸡肋。噢,有送可乐的,很实在。

上午第一场报告是一个国内学者做的,大致讲了一下开源和云计算相关方面的趋势和问题。没有什么亮点,或者说没有本人的关注点,所以印象不深刻了。后面是 GNOME 基金会主席的演讲,跟技术无关,说了一下在当今桌面软件依然具有独到的重要性,以及鼓励大家能够多参与到像 GNOME 这样的项目当中去。当然,我是一个 KDE 爱好者。(如果就 Linux 的这群桌面系统而言)

Continue reading “记2017年开源年会”

我为什么讨厌狼人杀?

昨天早上在知乎上看见有朋友分享这个「你为什么讨厌狼人杀」的问题。点进去之后我非常惊讶——居然在政治、社会话题之外还有这样的让我感觉「解气」的问答。说大家是落井下石也好,不会玩也好,总之无法否认,这个风靡街头巷尾的游戏,是像任何一个明星一样,有不少人对此反感的。

我记得我最开始接触这个游戏的时候还是在初中。那时对杀人游戏和狼人傻傻分不清,印象里反正是那些认识很多朋友的外向同学出去玩的标配。玩得不多,「天黑请闭眼」还是记得住的。一直到刚上大学那会,每次玩这个游戏似乎大家都傻乎乎的,如果是陌生人那就随便票,如果是认识的一起玩,当然就是把大家最爱开玩笑的对象投死了。

其实我真的也不知道狼人游戏是怎么在不长的时间内转变成现在这个样子的,就像我不知道如今微博上一个小有名气的明星转发评论赞数都能上万了一样。狼人和狼人杀有什么区别我不清楚,不过我猜想这名字或多或少都得跟三国杀有关系。说起来,随便一家小的桌游吧藏有的游戏都能摆满一整个柜子,可是大多数人出去玩能想到的恐怕还真只有三国杀和狼人。UNO的话,其实真不太想跟不熟的人玩这个。跟前两者比起来,这个游戏的标准规则存在感实在是太弱,变种又太多,有冲突就挺尴尬的。不过好在它节奏快,而且各自为战,运气成分强,玩起来还是算轻松愉快的。

Continue reading “我为什么讨厌狼人杀?”

关于大学老师上课的一些看法

好像很长的时间都没有好好写过文章了,也不知道放在这里会不会有人发现。之前约定自己,每天或者每周更新这个博客,可惜这件事到现在并没有做到。说实话,其实就是自己懒,未能规划好时间。说到这里,的确是有点羡慕那些平日上课按部就班的同学了。也许他们的实际「水平」不如另外一些人,不过每天跟着老师的进度走,自己完成作业,也按时交,不怕点名,感觉大概是很棒的。这个学期期末的时候要交数据结构的课程设计,那些作业本可以很早以前就写完然后上交的,然而总是觉得这不对那不对。题目只要求用命令行的界面,但是怎么看怎么觉得有点不太能上台面;但是用GUI做吧,用什么库呢?好像也不好看,带个东西也臃肿得很,要求叫可执行文件,还得麻烦一下用Windows的同学。所以就一直拖着。一直到Deadline前,才意识到这个东西实在不能再拖下去了,于是就赶紧三下五除二赶好。你别说,赶作业那段时间虽然时间紧,但是感觉还挺好的。之前的C语言大作业、Cocos的游戏作业,都是这样的,有别人推着走的感觉会很稳。不像自己学东西,没有什么自制力,说好的自己要写编译器,拖拖延延到现在还是没个头。

不过呢,这次去北京参加大型主机的比赛,整个过程中开了不少的会,也在北京玩了一把,收获确实是不少的。每天或者每几天review一次的感觉相当麻烦,不过真的可以保证某个项目的稳定推进。之前想的是,对自己制定一个完整的规划,自己照着这个规划来,每一步完成一个什么。但是一个可行的规划就必须要求制订者对这个项目和工作效率有基本的认识,多数时候这就是意味着丰富的经验。对于个人学习的项目来说,这种做法多半是不可行的。所以不如「走一步看一步」,但是要求一定得强硬,这比较适合假期一个人的时候学习。又说回这个编译器的想法,该写的是一定要写的。可以不忙着设计语言,就照着C11的标准来就行。实现语言的话,可以用Ruby可以用C++,乃至OCaml。我还计划大三的时候开门课讲编译原理呢,估计那时候就真的得用C++来搞了。说来也是惭愧,这学期选了门编译原理,结果好像就没听几次课(老师懂肯定是懂的,但是上课真的无比蛋疼),下周就要考试了还不知道做了多少准备。

Continue reading “关于大学老师上课的一些看法”

Ruby on Rails开发入门手记

上个月的博文里说过,由于要开发同济权益的二手书管理系统,所以用PHP写过这样的代码。第一个版本是纯PHP撸成的,没有用到任何的外部框架,路由也是纯手写.htaccess文件实现的,一共就四个文件,负责分发请求,最后交给处理数据库的文件来输出对应的JSON信息。现在看来,这大概叫强行RESTful吧,哈哈。话说回来呢,当时写的时候,甚至还有点基本的ORM思想,不过觉得太麻烦就没着手完成这个。后来才知道这个模型有个高大上的英文缩写叫做ORM。当然,这个版本的代码,模块性一点都不好。五百多行,基本没法维护。

后来寒假的时候,确实是觉得这个太不行了,需要找个框架重写,顺便学习一个。用哪个框架呢?知乎搜索了一下,就用CodeIgniter吧,相对轻量,又确实有用。这个框架是MVC架构的,但是也没有实现完整的关系对象模型,仅仅是封装了方便的数据库查询器而已。这个版本,自我感觉代码结构好多了,不过好像和前端交互的API还是没有改。

Continue reading “Ruby on Rails开发入门手记”

不受待见的程序员

程序员正在遭受来自这个社会的,同对医生一样的误解。为什么大众会误解医生呢?或者说,为什么医生与患者间的关系开始变糟了呢?行医救人的职业古已有之,尽管那时尚无「白衣天使」这种搪塞个人追求的名字。然而工业时代来袭,全世界的居民都接受了经过塑造的现代生活方式、谋生手段,且几百年而不绝,这种改变仍在快速进行之中。物资丰富、日新月异的年代,每个人都有权获得更好的生活。为了区分这个先后缓急,才有了资本、技术、劳动作为收入分配的依据。医术自古即是一门技术,但那时技术还算不得资本,更何况是「士农工商」的年代?

现今的人不能理解社会系统、国家机器运作的复杂性和脆弱性,他们仍习惯于以小农时代的思维模式打量这个世界的运转。也正由于此我们能够时常看到身边人关于社会管理、国际关系等的的种种呓语。正如和你大谈高层秘辛的出租车司机不必深究汽车原理便可参与营运一样,现代社会允许其成员未曾窥过其逻辑即可自由地享受生活。简言之,现时的医生早已不同于古代,就医过程的参与者也不仅是患者与医者双方。用想当然的逻辑思考规整化的医疗体系,自然是会出问题的。

程序员就更可怜了。如果说医者的职业目的大众还算心中有数的话,对程序员,就真算一片空白了。「开发软件」?软件是什么?即使是日常用到软件的人,也不清楚这些司空见惯的程序的复杂程度(「2000块给我做个淘宝」)——从这个角度讲,社会和软件倒有相似之处。须知,大多数人对职业的认识几乎完全是从个人经验出发的——比如律师就是耍嘴皮子,设计就是随便画画。在建筑行业整体遭冷的今天,仍有不少的重庆人相信搞桥梁是最好的职业之一,因为他们一辈子见得最多的就是桥。更何况,在风口可以吹猪上天的今天,程序员引来了诸多行业的羡慕与嫉妒。又有大批对计算机几无敬畏与热爱的人入行以工程师自居。这些拿着半吊子水平的Java就大谈而谈各路本质论的人继续伤害着程序员在大众眼中的观感,误解自此不可避免。

Continue reading “不受待见的程序员”

cJSON源码分析-实现

好了好了,这篇文章拖了真久啊,活活三个月。不过之前承诺要经常更新博客的,所以先把这个烂尾的坑给填了。

之前提到了cJSON这个C语言写成的JSON解析库的接口,也就是头文件里的内容。这一次我们来分析一下实现。上车吧。

还是按照源代码的逻辑走。我们发现cJSON最开始有一个全局的字符指针ep,以及一个用以返回ep的函数。可以看出,这个ep是用来存储错误信息的。这种实现是C语言的常用手法,即把一些状态用static的方式隐藏在单个文件中,并实现一些函数当作接口。

下面是一个大小写无关的字符串比较函数。看后面的源码可以发现这个函数用在了JSON对象名的查找当中。实现没有什么特别的难点,所以就不提了。顺便说一句,在C++里要实现这个大小写无关比较,可以用STL里的一个方法叫做lexicographical_compare,搭配lambda表达式可以轻松达到目的。

作者把负责动态内存分配和释放的函数直接「填」成了标准库的malloc和free,像C++的allocator一样。如果担心内存碎片的问题,可以自己再当个二道贩子,实现一个内存池,不过那有点背离本文的主题了。作者自己实现了一个版本的strdup,里面也是用这个用户可以更换的cJSON_malloc进行内存分配的。

Continue reading “cJSON源码分析-实现”

夏夜怨记

大概真的有很久没有认真写过一篇日志了。

拖延症想来真是可怕的一件事,从高考、到生日、到搬嘉定,一直想记录下这些时刻,然而最后都因为各种原因忘掉了。

本来说,这次回家,要好好看书,复习物理,认真把之前没做的事情做完。可没想到睡着睡着这暑假就睡过快一半了。从现在开始大概还来得及,但是真的有机会让我意思到「快来不及」吗?

从去年七月底学籍变更开始算起,转到软件学院基本上算整整一年了。说没学到什么东西,那是假的。但是能不能合上当初对于大一的预期呢?恐怕这里不是个问号,甚至都应该是感叹号了。

大一开学第一门课好似一记闷锤,重重地把暑假群里的欢声笑语打得不知所踪。我本是个好为人师的人,也因此,有不少人认识了我。虽说常常觉得会有人因为此对我颇有微词,但是更多的时候笑一笑,只是觉得帮助别人挺好的,足矣。

说Deadline是第一生产力,这话我同意一半。Deadline只能带来产品,带不来作品。除了紧迫感以外,要创造出作品必须的还有一种「渴望」。这样的「渴望」是发自内心的,但对于常人而言,要利用它创造作品,恐怕这期限得是无穷远加上一个epsilon,所以它和期限交织在一起,就是促发我们为作品拼命的动力。

既然半年混一混就过去了,那再来半年似乎就更不是问题了。下半个学期过得更加无趣和无所事事。Cocos已经足够不能带给人成就感了,更何况一个拖了许久需求一删再删的半成品游戏。年级群也在变得越发沉闷,只有俱乐部还能带给人些许慰藉。

其实说到底,这些问题都是自己没有规划没有坚持造成的。规划是简单的,大不了发现有问题再改。难的是坚持。你说每天写一篇日志容不容易?好像也不难。但是甫一打开后台,脑子里各种毛病就来了。觉得浪费时间也好,质量不高也好,一天天就混吃等死推过去了。吹牛的时候我老喜欢提自己初中就学编程的事,然而到今天有太大正面影响吗?还真的没啥。

这并不需什么天才,那个年纪就是能自学那种程度的知识和技能。问题是环境是否容许,例如放学后去办公室搞到午夜才回家,同时学业成绩不能太差。

在知乎上看见Milo谈小孩子学编程的时候说的话,深以为然。如果时间能够给我再一次机会,我真的会做出不一样的选择吗?

在软件这一年,有收获,有遗憾,但这段经历比不上大一一年带来的震撼。回头看自己一直以来的读书经历,好像也能总结出一个道理:

永远不要试图框定自己的界限。否则,你总会发现外面还有所遗漏。