有时候觉得,人的大脑有点类似一个单核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,在默认情况下,当用户按返回键想退出,它又继续启动推荐,企图把用户留下来继续看。在形成依赖之后,在用户的反感范围内,推送广告之类的内容,在无形中也通过算法选择展示的内容去影响用户的认知。


阅读全文 »

最近启动了刷 LeetCode 的进程,Accepted 了几道题,但两天不到就忘了,即使是留了注释,想想写写笔记还是蛮有必要的,但我不希望不经思考整理就贴一堆代码,把博客搞的乱糟糟的,像 XSDN、XX园、X书 一样,所以也只是想把一些印象深刻的部分,留个笔记。

过去的我过于年少轻狂,把某些高级语言当成了全部,并未好好去用 C/C++ 写过点什么。忽视了那些底层的基础的后果便是,现在在写一些很简单的东西,在需要保证代码质量的时候,要纠结许久去思考某一段代码需要消耗比较大的代价才能下决定。用 C 语言写代码有个好,通过它可以让你弄清楚,计算机底层可以给你什么基本能力,什么能力是需要通过这些基本的东西通过封装的方式实现的,也相当于顺便强化计算机基础了,所以我也打算就用 C 来刷这一套算法题。


题目:

3.Longest Substring Without Repeating Characters
Given a string, find the length of the longest substring without repeating characters.

Examples:

Given "abcabcbb", the answer is "abc", which the length is 3.

Given "bbbbb", the answer is "b", with the length of 1.

Given "pwwkew", the answer is "wke", with the length of 3. Note
that the answer must be a substring, "pwke" is a subsequence and not a
substring.

程序需要统计输入字符串的最长无重复子串的长度。最初想到的是,从第一个字符开始,遍历这个字符的字符,直到出现重复的字符,统计此时的字符串长度,然后从第二个字符开始,重复这个过程,取最大的一个,直到最后一个字符为止,其中因为边界的问题的处理,折腾了许久,不过还是实现了下面的第一版的代码:




阅读全文 »