最近自己有个批量调用 API 抓取数据的需求,类似爬虫抓数据的感觉。听到爬虫二字,我们常常想到的是 Python, Beautiful Soup 之流,而对于简单地抓取数据这种需求来说,一个小米加步枪就能干掉的东西,拉个加农炮来,显得有些大材小用。实际上,只需要围绕着 抓取->格式转换处理->保存 这简单三步,然后用合适的工具或编程语言实现就好了。

驱动整个批量抓取过程的核心在于一个循环,把所有要访问的 URL 放在一个数组,循环遍历一下。对于我这样搞前端的来说,结合现代 JS 的 async/await 很容易就可以写出类似下方的代码(这里我用了 Axios 库处理 HTTP 请求)。

// Input
let read = fs.readFileSync('url-list.txt', 'utf-8');
let urlList = read.split('\n');

(async () => {
  for (let current = 0; current < urlList.length; current++) {
    const url = urlList[current];
    console.log(current, url);
    // get
    let { data } = await Axios.get(url);
    fs.writeFileSync(`result/${url}`, JSON.stringify(data));
  }
})();

阅读全文 »

有时候觉得,人的大脑有点类似一个单核CPU的电脑,同一时刻只能做一件事情,如果中途需要做别的事情的话,得把正在干的事情的上下文保存起来,再切换到新的事情上,新的事情处理完后又切回来,加载回原本的上下文继续干活。

电脑CPU可以随时切换,可以把之前保存的工作上下文完美地恢复,于是设计电脑的人可以把CPU的运行时间切割成很短的时间片,然后让CPU一个个任务切换着执行,每个任务耗完一个几毫秒的时间片之后就切到下一个任务,运行几毫秒又切到下一个任务,如此往复循环,看起来好像真的是“同时执行多个任务”的样子。

而人的话,任务切换的过程中,任务的上下文并不能很好地保存,切换回来正在执行的工作的时候,相比之前往往会有一些信息以及思路的丢失,任务的切换伴随着保存和加载上下文的过程的开销,对于电脑来说,这些开销都是小菜一碟; 但对于人脑来说,保存和恢复上下文过程的脑力开销是十分巨大的。

平时学习工作的时候,时不时无意识地掏出手机刷刷,或者是突然来了一条微信/QQ信息,这都无形中引起了任务的切换。最可怕的是,我们的大脑因为忙于处理它们传来的各种符号和感官刺激,导致了这一切都发生在无形之中而不自知。

For example, 在你平时看着书的时候,如果有人突然找你做些什么事情的话,这个打断是很明显的,而手机。。。

于是,直到一天快结束的时候,才开始说:
“我特么一整天究竟干了些啥???”


这是在去年修《操作系统》课程的时候曾经冒出的一些小小的想法,当时随手发到了朋友圈,今天偶然在一个群里遇到了这个话题,突然想起以前思考过这个,找了好久才找到,想来还是搬运过来吧,尘封在票圈的信息洪流之中,自己都不去看的感觉,有点小小的难受。也不得不说,人总是下意识地喜欢那些顺手的东西。

这学期的安全学课程有个作业,内容是写一个软件实现 SHA3 Hash 值的快速计算。想一想老师这么安排,大致上也有一种推广新的密码学算法的意图。既然希望应用起来,天然跨平台的 Web 显然是一项非常具备优势的技术,想到 HTML5 有定义网页与文件系统交互的 File API 标准,而且很多浏览器已经实现,基于浏览器端,实现一个 Sha3 的在线哈希岂不是更好?

根据文档,浏览器端的 FileReader 对象提供了 readAsArrayBuffer 的方法,可以将文件的二进制内容读取到 ArrayBuffer 字节数组对象中,然后就能通过JS去操作包含文件内容的字节数组,这也让浏览器端实现文件哈希提供了可能。当然,实际上也是可以实现的,这里分为两个部分来介绍这个过程。

阅读全文 »

开放的互联网对我来说一直都充满着魅力。一直觉得,互联网的各种开放协议设计得十分精巧,很多东西都恰到好处,就像邮件、日历、RSS订阅之流。大学两年来,我接触的最多的也是它们,于是乎对于身边事物的追求,也有类似的近乎极致的强迫症,很多东西都希望向着某些极致的标准去设计。

大概也是如此,一直以来我对于工具、对于解决问题的方式这一块似乎都带着一种莫名的执念。在看《Learning How To Learn》的时候,我遇到一个叫 Anki 的记忆工具,发现这个工具所带来的便利,我为此疯狂了一段时间,仿佛一切的学习,都应该是围绕着艾宾浩斯记忆曲线间隔重复的记忆。后来遇到了一个名为 MarginNote 的软件,看了介绍,并因为它能够自动制作 Anki 卡片而有所期待。但因为这软件只能在 Apple 的平台下运行,一直只能干巴巴地看着。

最近终于攒够零花钱,入了 iPad + Apple Pencil,搞上了 MarginNote 3 的试用,几天内刷了好几章的 CSAPP,的确舒爽。在这过程中,也把 Evernote,OneNote,Reeder 等东西也一并安了过去。通过 iPad 和无敌的触控笔,我也开始体会到这一系列设计的及其人性化的工具的便利,但对于它们的使用,似乎还是有那么一些迷茫。

在工具的不断切换中,我越来越觉得,自己的关注重点是不是有点偏了,我追求的应该是某些工具或者某种标准吗?

阅读全文 »

今天在 阑夕的一条微博 又看到了“他们的时间和生命不值钱,是我们的产品给了他们幸福感”这句熟悉的话,想起了在上一次看到这句话的时候关于信息爆炸的一些思考,也试着整理整理。

自从互联网诞生开始以来,我们渐渐进入了信息过载的时代,面对信息过载,通常有以下思路:一种是走编辑精选路线,在特定的专题上提供高质量的信息源,比如杂志,网站,新闻客户端等;另一种是走聚合路线,就像博客时代的RSS订阅,现在的微博、微信公众号、今日头条等等。

历史的潮流到了移动互联网,信息传达门槛变得极低,很多东西不需要过多的处理和筛选,就能交给对方。无形中也加重了信息过载的现象,人们每天面对目不暇接、良莠不齐的信息,深入思考的时间的剥夺也日益严重。如何应对这爆炸的信息,快速获得自己需要的部分,也成为了一种需求。

张一鸣 为佩奇关闭Google Reader的魄力叫好! 一文说,

我发现,要成为Google Reader常用用户必须具备两个特点:

一、信息组织能力强,明确知道自己想要的信息在哪。
二、自制力强,有规律的整理并能控制好RSS源的数量。

显然,能达到这两个条件的用户并不多。这也是为什么愤慨的Google Reader用户多是媒体从业人员。一款本该面对大众的产品却只能满足的是很小的一部分用户的需求,那就注定不会走得长远。

在我使用过一段Google Reader后,就已经不看好它的前景。这里订阅模式对用户要求太高,用户需要自己去想好“我喜欢什么,我订什么”。

对于那部分有一些兴趣但不是太喜欢的内容到底是订是不订,这也够让用户纠结的。比如我并不想看来自36氪所有文章,我只想看其中跟移动互联网有关的。那我到底是订还是不订呢?

所以,我认为这个订阅过程的用户体验就很不好。

我认为,虽说 RSS 订阅的门槛比较高,要求用户具备信息组织和筛选的能力和一定的自律才玩的转,但这应该是信息获取方面一种比较极致又纯粹的状态:各种更新的信息源以统一的方式输出,把选择的权力交还给用户,以辅助用户更高效地获取信息为主要功能。一切的中心,都应该从「让用户更好地掌控信息」的角度出发,而不是通过信息的控制去掌控用户。

面对用户的门槛,大概有两种策略,一种是保持本心,做好产品,引导用户,提高用户整体的信息素养,更好地使用工具去为自己更高效地获取信息而服务,另一种是用更低门槛产品去填补这个空缺。从产品的角度来说,没有情怀和价值观的驱动,第一种显然是无稽之谈,使用 RSS 应对信息爆炸的用户毕竟占少数,往这个方向去努力,强迫用户去学习,大多数的用户大概会选择更傻瓜更方便的工具,在 KPI 的范围内是吃力不讨好的。

所以商业公司大都偏向于第二种策略:降低产品的门槛,迎合这部分用户选择信息的需求。但毕竟还是商业公司,当看到这部分用户需求的巨大缺口,它会不断捕获存在这个空缺的用户,试图成为用户的一部分并控制它,使用户依赖于此,并从中获得利润。

在广告模式的加持下,利润压力的驱使下,在同行的竞争下,它必然会考虑加入让用户沉迷其中的元素,不知不觉中夺走用户的时间,也不会告诉用户什么他们降低的是什么的门槛。比如说,今日头条的APP,在默认情况下,当用户按返回键想退出,它又继续启动推荐,企图把用户留下来继续看。在形成依赖之后,在用户的反感范围内,推送广告之类的内容,在无形中也通过算法选择展示的内容去影响用户的认知。


阅读全文 »