过去在微博遇到许多有趣的内容,但常常因为时间太久远,回看收藏链接往往返回的是404,记忆也随之变成了一个个空洞。脑洞打开,是不是可以把一条微博涉及到的各种文件一键打包下载,在本地阅读呢,就像 docx 文档格式一样。

技术方案

从尽可能简单的角度解决问题的角度出发,能在浏览器端完成的话最好,不需要依赖什么脚本和平台,额外花时间去梳理各种业务逻辑相关的琐事。从此出发,在数据来源方面,选择更简单的手机版;保存数据,优先考虑在浏览器端用文件相关的 API 实现。

理论上来说,文件的本质是一系列二进制数据集合,HTML5 FileAPI 提供了处理二进制数据对象的 Blob。在浏览器环境中字符串可以构造成 Blob,微博中涉及到的图片和视频文件的数据也通过 Blob 的方式处理。

有了 Blob 这一层抽象,文件打包压缩的需求,也用 Blob 的方式去实现的话会更自然一些。寻找已有的解决方案,发现 JSZip,它支持创建 zip 的文件,在输入输出的表达上支持包括 Blob 在内的多种格式,也支持 ArrayBuffer, Base64, 字节数组等等方式的表达,省下不少自己处理的功夫。

文件下载方面,可以用 URL.createObjectURL 基于 Blob 创建一个 Object URL,然后创建一个 <a> 元素,触发 click 事件下载,得到最终的文件。

把数据源与保存的方式都理清楚,大致有了一个流程,就可以动手了。

阅读全文 »

过去没有写年终总结的习惯,但看到大伙儿的总结,回想自己整个人经历着大幅度的变革与刷新的一年,或许还是有必要在部落格里记录一下。

时间串起的生活是一条线,但每一个当下与过去频频交织,组成了一个错综复杂的网络,想用线性的文字去描绘它,很多时候得到的是冗长和啰嗦。想想,面对网络,常常需要集中在几个点再出发,才好凝聚表达的力量。就像 "PowerPoint",内容有 Point,表达才有 Power 吧。

回想这一年,因为 0xFFFF 社区而结识 wzpan 师兄,意外争取到了鹅厂实习的机会,鼓起勇气来到深圳。年初在深圳待了一段时间,开学之后回校上课,暑假开始的下半年一直待在深圳实习。两种截然不同的生活状态的交替切换的过程充满了激荡,心境则随着激荡过后渐渐地趋于平静。也试着通过这篇东西,将这一年内心所经历的那些激荡与平静凝聚下来,留作纪念。

阅读全文 »

去年开始博主我大致确立了一个以 RSS 聚合为主,其它信源随缘查看的资讯订阅流程。其中一大需求是同步不同客户端的阅读记录,需要一个服务器端运行的订阅器。当时用的是 Tiny Tiny RSS 和它的 fever 插件,结合 tt-rss 安卓客户端和 Reeder 实现。

忙起来之后,碎片信息积攒得多了,有点超载。闲暇时间,也多消耗在读书类的 APP 和微信的公众号、看一看这类身边人分享的信息之中。加之手上服务器多了,这一套东西也无暇维护,不值得投入精力在反反复复的安装和修改配置上。最近这段时间也逐渐把手头的各个网站都迁移到 Docker,到了 tt-rss 这个站,想不清过去在这里魔改过什么,索性整个服务器重装了,这一套体系被我再次摧毁。

经过这样的建立、崩溃、重组、再崩溃的经历,RSS 这一工具在我的角度的使用场景也明确到了两个字:必读。RSS 满足了从关注的人、关注的领域开始发散的树形结构,与微信构筑的特有的以人的关系网为中心、不刻意的“口耳相传”这样的圈层结构相结合,形成我目前的资讯的主要来源。

RSS 这一块,进一步梳理之后可以得到以下需求:

  • 由于阅读不局限于一个地方,tt-rss 的强大功能反而更不适合,需尽可能地小巧精悍
  • 获得的信息不局限于日常所见,要穿过检查站,不能被 spy 和 filter,传输层加密是必要的
  • 不想在运维上花太多精力,希望安装配置有记录,方便后续的迁移和维护

对应的解决方案:

  1. miniflux:恰到好处的 Web 端阅读器,更新勤快,效率高,支持与各种服务对接。
  2. 域名 + HTTPS:满足加密的需求,Let's Encrypt 有免费的 HTTPS 证书
  3. Docker + Docker Compose:一次配置,一键部署
  4. RSSHub:消息源格式标准化,以便统一订阅

阅读全文 »

周六发现一个安静看书的好去处:科苑站附近的 Dots Coffee。这儿没有星巴克的喧嚣、没有挤满考研考证党后的图书馆的压抑、东西不贵,点杯茶可以坐一整天。一切都刚刚好。

所以周日又来到了这里。两天来我都在整理手里的英文版龙书 PDF,这文档目录书签不完全,为了和 MarginNote 对上,得手动用 Acrobat 给它一个小节一个小节地加上,1000 多页的书,两天弄完,想来也当作对这本书的框架的一种熟悉吧。

一个领域的知识就像是一座山,这座山只存在于心灵的世界,只有在内心足够平静的时候,才可能构建起来;在它足够强大之前,实在是不堪一击,外界的一点点干扰都可能把它摧毁殆尽。在这两天我也渐渐地感受到心中那片名为“编译原理”的那座小山的渐隐渐现。这种感觉熟悉却又陌生,已不记得上次是什么时候有过这种体验了。

恰好周日也是母校北江中学的返校纪念日,回忆起来,上一次可以这样安静祥和地构筑起一座座思想中的大山的体验的日子,不正是在北中的那段时光么?

阅读全文 »

这两年来接触了不少的笔记工具,尝试去建立自己的知识库和信息收集、整理、内化的体系。实习工作的忙碌,则带来了体系的一次又一次的 崩溃-->重建-->崩溃... 的过程,让我对这方面有了更多的思考。

用过各种各样的工具,到最后都是一个“是否顺手”的问题,关键点在于能否跑起一个高效又稳定的流程。这方面需求我觉得大体可以分为两块:

  • 日常的业务相关的琐碎信息的固定
  • 沉淀知识的整理与加工、回顾

从我入 iPad 的那会儿开始,我在尝试着用印象笔记与 OneNote 来做这些事情。时间长了,发现它们其中的一些特点:

首先,它们都强调富文本格式的支持,但编辑功能有点难用。整理起来总是要复制粘贴,很麻烦。

在页面的组织上,两者都是以分区页面的概念去做的,印象笔记的 笔记本组 -> 笔记本 -> 页面,OneNote 则类似一种模仿纸质笔记本的 笔记本 -> 分区 -> 页面 的模式。在这固定的分类模式之下,有些东西很难去界定该怎么分类,整理起来纠结,一忙起来到后头很大概率不会再去回顾,于是也很难坚持下来。

最近开始尝试 Notion,这东西对使用者来说只有两个概念:Page (页面)Block (区块)。它以 Block 为粒度来组织信息。一个页面由 Block 组成,Block 有很多种类型,可以是纯文本、Todo、列表、链接、代码块、甚至还可以是一个新的页面。

最后一点最为关键,页面中可以插入新的页面,如此递归下去,形成了一个灵活的树状结构,就像网页和超链接组成 WWW 网络的形态。在这个模式之下,无论是横向发散还是纵向深入都没有限制,在组织上非常适合一些知识性的东西的梳理,避免固定分类结构难以适应多种多样的知识结构的弊端。

交互上,Notion 的页面上的 Block 调整起来十分灵活,简单地拖动整个 Block 到合适的位置就 OK 了,避免频繁地剪切和粘贴的繁琐与出错的可能性,解放双手。

以 Block 为粒度组织信息的带来的便利,是牺牲了格式的丰富性换来的。这也就决定了它在固定富文本的东西方面还是比较弱势,类似网页上的剪藏等功能也不太完善。这一点不足,可以辅以印象笔记和 OneNote 作为临时固定信息的存在,印象笔记的组织模式类似一种线性的结构,对富文本有比较好的支持,同步能力很强,恰好适应随时间积累的“流水信息”;OneNote 在格式的丰富性方面相比印象笔记更胜一筹,配合 Apple Pencil 几乎可以把当下所接触的信息和联系都定格下来,可以说是一个增强版的纸质笔记本,可以记录一些更细致的东西。

由此得出一个结论:

  • 流水信息的临时固定 --> 印象笔记、OneNote
  • 沉淀知识的整理加工 --> Notion