Category Archives: literature

Mac,Linux,Windows手感对比

本科时候专业课基本用windows和visual studio做的,当时vs的臃肿和必须使用盗版让我对微软毫无好感,然后拥抱了开源世界,用了两年ubuntu linux,直到今年买了Mac。突发奇想做下对比。

常用软件兼容性

Mac:Chrome, Office, QQ, 迅雷,搜狗输入法
Linux: Chrome, 永中Office,Web QQ,浏览器自带下载,fcitx
Windows: 常用软件其实就是指Windows上能用的软件

所以,到今天日常工作上,三个系统基本都能正常使用。体验上Windows最好,Mac次之。

命令行工具

Mac: 自带unix shell,用包管理器homebrew可以安装缺少的linux上常用的工具,也可以装其他shell
Linux: 喜欢命令行的程序员的天堂。用起来十分舒服。
Windows: 用Cygwin可以勉强找到shell的感觉,美中不足是有的时候某些脚本依赖某个shell命令,万一在cygwin中没装,跑步起来还找不着原因

在命令行工具上,三个平台也都做到了可用。体验上linux最好,Mac次之。

软件安装和升级

Windows: 在网上下安装包,然后双击安装。常用软件一般自动升级。不常用软件需要重新安装来升级。
Linux: 用命令行的包管理器搞定一切。一行命令就可以安装chrome,感觉棒极了!升级所有软件只需要一行命令。大部分软件还可以下载源码编译安装,此时升级需要下载新版本源码重新安装。
Mac:图形界面软件,基本下载程序/安装程序安装。命令行软件,通过包管理器,比较弱。还支持从Apple Store安装,但国内大环境下基本没用过。

Linux的一行命令安装/升级已经把体验做到了极致。Mac各种安装方式杂糅。Windows最苦力,啥都要自己下。当然第三方360软件管家什么的可以弥补,但是这些流氓吵来吵去,一不小心qq、搜狗就不能用了。

图形界面

Windows:从win7到win8有个飞跃,以至于让升级系统最快的中国人(因为不要钱)都不升级了。用户最熟悉的,没有办法订制的,看起来凑活的图形界面。但依赖于其的众多图形界面软件(小白请直接理解为常用软件)使其功能最强大。
Linux: 高度可定制化,想怎么改就怎么改的图形界面。但稳定性较差,一不小心碰到G点就坏了。图形界面系统分裂出太多版本,以至于极难制作图形界面软件,以至于整体体验较差。但可以自定义的炫酷拽。
Mac:精致、漂亮的图形界面。用户不能订制,也不想订制,默认的足够好了。基于Mac的图形界面软件的常用软件也渐渐增多。很多开发者工具的图形界面版本都只有Mac的。

Mac作为图形界面的鼻祖,堪称典范。Windows靠兼容的软件功能最强。Linux满足屌丝程序员当神的欲望。

系统稳定性

Windows:蓝屏的,好喝的。不过现在蓝屏情况已经大大减少,但仍然存在。
Linux: 十分稳定,不会挂掉。但是图形界面经常挂。
Mac: 系统挂掉是什么,好吃吗?

三个平台都挺稳定了。

系统安装

Windows: 网络上有出奇多的教程、安装方法,小白用户级别,驱动兼容性最好。
Linux: 发行版的安装都做的十分容易,适合在已有windows的机器上做双系统。驱动不全,有可能装上用不了或者出问题。
Mac:你花上两天时间,看了无数教程,终于在PC上装上了Mac,发现居然跑起来了!接着10秒钟之后CPU因为风扇不转过热挂掉了。

作为程序员

曾经我很排斥windows,觉得开源世界才是程序员的归属。回过头来发现,其实只要在系统上弄好工具链,啥系统都一样。渐渐也没有了偏见。三个系统各有各的长处,各有各的不足,总有用的不爽的地方,总有用的顺手的一天。

通过历史预测未来

根据历史预测未来似乎就是彻底不靠谱的事,我之前也是这么认为,直到最近膝盖中了一箭。好吧,其实是看到《失控》最后几章让我对这个问题重新思考了一下。

股票涨跌

金融机构、投资个人都希望对股票的涨跌做出预测,什么K线图分析,眼花缭乱的理论,都是从历史数据来对未来做出判断,但效果好像都不是那么的好。于是,就有价值投资理论云云,要从股票的实际价值出发,历史数据就是不靠谱的,要看实际价值。

物理定律

无论是牛顿力学还是相对论,都在干一件事:预测未来。物理最早就是在研究天体的运动,第谷、托勒密以及我想不起来名字的种种都在通过记录、观察行星运行的数据,从其中总结出经典的力学定律。至少现在的建筑、机械都离不开力学,汽车、飞机简直把物理学发挥到极致了。

后来爱因斯坦提出了相对论,物理定律做出了修正,预测的更精确了。这是成功的根据历史预测未来啊有木有。

踢球的贝克汉姆

虽然物理学让我们造出了汽车、飞机,但是,日常生活中很多事,其实并不需要物理公式的介入。例如贝克汉姆也许会在赛后没事计算一下自己踢球的弧线公式,但在场上开任意球的时候,他的脑袋里一定不是在算公式。

人类通过不断的trial-error,大脑会对碰到的模式进行总结、固化,形成肌肉记忆。这与更高级抽象的物理公式是完全不同的approach。踢球的大脑通过多次重复形成的记忆,以及对当时场上的情况作出了预判,判断出该使用怎样的力量、角度、击球点,来指导黄金右脚踢出漂亮的弧线。这里并不需要高层的抽象建模。

人类天生就会预测未来!不然我们怎么生活的啊!

马饲料和石油

曾经有人担心马饲料不够,因为按照当时马匹的增长速度,以及饲料的种植程度来看,很快马饲料就会不够用。然后,人们发明了汽车,马儿再也不用担心饿死了,但估计要担心直接被处理掉= =b。现在很多人担心石油会枯竭,有各种各样的预测数据。但会不会也是马饲料呢?长期预测,总是不那么靠谱的原因是,突然、巨大的变化总会存在,虽然一定时间内,是渐变的。

如果仅仅根据数据,预测下个月饲料价格,我倒觉得是十分靠谱的。

短期预测和长期预测

《失控》中对历史预测未来的结论,是长期预测不靠谱,而短期预测恰恰相反,是很靠谱的。我完全可以说下一秒我的电脑还是好的,但是10年后我就不敢说了。因此华尔街会雇佣预测公司,短期预测股票的涨跌。

不过想了这么多,还是不敢去投资股票。

To be or not to be, that is a question.

These days I am thinking about what should I do in the future. What’s my career? A programmer hired by Google? A product manager hired by Alibaba? Or a All-Star hired by myself? Different jobs require different knowledge and techniques. I have a little more than one year to shape myself. The year that will define my life.

Option 1. To be a geek, make products but not get them promoted.

I start programming and giving birth to products but care nothing about the operating or promoting. To meet this requirements, I need:

  • light weight techniques and frameworks, lots of open-source fundamentals.
  • one man, or a team of 2 or 3.

Then, I can enjoy:

  • the happiness of creating things.
  • become confident on my techniques.
  • highly free schedule

Option 2. To be an entrepreneur (PM+Excut), make one product and promote it and polish it.

I focus on one product and make this product my career and start a business.I need:

  • mature techniques and collaborative tools to make the product reliable
  • a whole team to support the system.

Then, I can get:

  • a career
  • a real business
  • irregular life style
  • the opportunity to be the next big one (hehe…)

I am making choice. As I am still a post-graduate student in zju, maybe option 1 is best for me cause a career is waiting for me after my graduation from school. So, just do what I really want in school.

如果北京是一个互联网产品

回一趟武汉,就见到一个好友。一问,大家在北京聚会的不亦乐乎。想到自己在杭州孑然一身,便觉得悲从中来。开玩笑啦,其实在杭州还是认识到不少新朋友的~

如果北京是一个互联网产品,我想那一定是垄断级别的。硬件上的配置底子很好,于是吸引了大批用户。垄断产生的结果是,你用我用,于是大家就都用了。为什么要去北京?因为大家都在北京。你不用qq,都没法跟人交流。但是用户一多,服务器就有点扛不住了。北京的城市架构师目测能力不足,搞的生存环境很差,而且这个应用价格还很高,月租费就能吃掉你实习工资。但由于北京的垄断地位,大家还是想去北京,先闯荡几年再说呗。

相比之下,杭州简直就是一个小而美的app。该有的都有,体验很好,价格还不一定低。就像path,用起来很爽,也有一些人,周末骑个自行车就可以满城玩,但用久了还是觉得不够大气。

google trend与预测股票走势

这两天周围谈论的最多的可能是一篇发在nature上的,利用google trend(谷歌趋势)来预测股市的论文。我不懂股市,估计自己的学术功底是看不懂论文的,就想想这种研究的思路吧。

Google Trend大家应该都玩过,用来看某个关键词的搜索量的统计信息用的,例如这个月,搜索债务的次数的涨跌。人对某个关键词的搜索,如债务,获取公司的债务信息,相当于一种建模。我想看某公司的债务情况,来对这个公司的表现进行估计和预测(或者说,描述?),这就对这个公司进行了一次建模,表示为

y = f(x)

就是说,这个公司的情况(或者说股价)y是债务x的一个函数。真实的模型可能每个投资者心里都不一样,有f1, f2, f3…等等

但是股票这玩意嘛,谁都没法准确预测,f就不靠谱。但是还是得炒股赚钱啊,怎么办。应该看看f1, f2, f3…这里面哪个函数表现最好,描述的最贴切,预测的更准,就听哪个f的。

y = best(f1, f2, f3,…)(x)

当然,我们也可能觉得f1可能性最大,给它90%的权重,其他各分1%的权重,把结果加起来等等。最终形成的是形如:

y = g(f1(x), f2(x), f3(x)…)

也就是说,g是模型的模型,在模型f之上的层次建立了一个新的模型。对g求导就可以还原出f。

讲了半天,这跟Google Trend有毛关系。如果我们把人对股票信息的模型记为f,那么为了得到f所需要的信息(变量的值),我需要去google搜索,例如搜索债务,于是,通过一个人google的搜索记录,可以大概体现出f是的情况,是可以对应的。Google Trend是对所有人搜索记录的统计,可以看成上式中的g,也就是说,这是对所有模型的一个概括。

因此,开始提到的论文大概就是在所有人对股票的建模基础上,建了一个更高层次的模型。

这让我想起来计算理论中,元系统的概念。元系统是描述系统的系统,就像上面的g函数。同样的,我们可以用一个模型h,来描述g,生成一个元元系统,以此类推,还有元元元系统,元元元元系统……我们可以在这些系统中,任意挑某个层次的系统来解决我们的问题。用Google Trend相当于用了一个元元系统。

利用地图网格保存和保护密码

这个方法其实挺有意思的,只是我要交计算机安全的作业,写成论文的格式了= =b……

绪论

密码遗忘和主账户

计算机安全中一个重要的领域在于,密码的安全性。让用户记住密码是一件十分麻烦的事,特别是在过一阵子没有使用该密码之后,用户很容易遗忘这个密码。用户几乎不可能使用一个易于记忆同时又复杂的难以猜测的密码。现行的一些帮助用户记住密码的服务集中在帮助用户用一个主账户、密码来管理其他的密码,例如浏览器可以帮助用户自动记住用户名和密码,用户只需要登录浏览器账户这一个账号,就可以得到不同网站的用户名和密码。

但是,这仍然不能避免用户遗忘这个浏览器账户的密码,或者说这个主账户的密码。

门钥匙和门

在现实世界中,门钥匙和门对应这密码和账户的隐喻。生活中,我们可能会把钥匙弄丢,但是并不担心别人会对自己家破门而入,因为我们知道,拾到钥匙的人并不知道这个钥匙能够开哪一扇门。但如果是小偷有针对性的将钥匙偷走了,那么我们可能需要考虑换一把锁,因为小偷可能通过其他方式知道了我们住在哪一间屋子,也就是说知道钥匙和门的对应关系。

从另一个角度来看,在大学寝室中,同学们有时会把钥匙放在某一间不是自己寝室的门栏上,这样出门就可以不带钥匙。这时,小偷即使拿到钥匙,由于钥匙并不是开它所放置的位置下面的门,小偷拿到钥匙就和上面讨论的捡到钥匙一样,同样无法进入任何一个房间:一间间试钥匙的代价是巨大的,不一定能试出来,还有可能引起路人的怀疑。

这上面两个例子,我们可以看出,钥匙和门的对应关系,是其中的关键,如果能够做到隐藏钥匙和门,也就是说密码和账户的对应关系,那么,小偷即使分别知道了密码和账户,也不能做出任何进一步的破坏行动。这也是本文所主要讨论的保护密码的方式,密码也可以明文保存,供任何用户查阅,但利用信息隐藏来隐藏账户和密码的关系,帮助用户保存、保护密码。

识别而不是回想

在用户体验领域,一个公认的可用性原则是:识别而不是回想(recognition rather than recall)。这里的意思是,当用户看到用户界面时,尽量不要让用户去回想这个界面的用途,而是让用户能够识别出这个界面的用途。换在这里,我们仍然可以借鉴这一个思路,让用户辨别出它的密码,而不是回想起它的密码。通过这一点,哪怕用户忘记了密码,也能够通过一定的途径辨别出它的密码,但是心怀鬼胎的人不能辨别出来,就达到了隐藏密码的效果。

地图网格的密码隐藏

地图网格

map grid

上面是一幅地图,地图被分成了很多网格。初始的时候,我们可以将整个地球的地图都分成类似的网格,并对每个网格填入1-10个数量的密码,这些密码可以随机生成,也可以通过彩虹表生成。例如某点的密码为[123456, zhang1999, 2012wang]。

普通用户可以选择地图中任意一个网格,填入他的密码,例如填入deng199011,而用户只需要记住这个网格在地图上的位置。后台把用户填入的密码明文存放,但对密码的地址加密。例如这样一张表:

  • Hash(经纬度) primary key
  • 密码序列

在上面的例子中,密码序列里最终会存放[123456, zhang1999, 2012wang, deng199011]。用户记住他所存放密码的网格所在地图位置是相对简单的,例如他可以放在一个他熟悉的位置。当用户点开他所记忆的网格,就可以看到这个网格下的所有密码,即一共四个密码,因为他对自己的密码至少有一点模糊的印象,从10个密码中选出自己的密码还是相对容易的,最坏的情况把这10个密码全部尝试一遍。

这里,用户回忆密码的过程,从回想(recall)变成了识别(recognizition),识别它家的地址,或者经常出现的地点,减少了用户的记忆具体数字的负担。

密码的作用区域:不同用户位置,不同的密码

上面的策略可能会让人觉得,如果一个自己常在的地点已经10个密码以上了,不太方便再存放一个新的密码了,这时,用户就不太知道应该把密码放在哪里了。因此,我们可以更进一步,让用户设置这个密码的作用区域。

密码的作用区域,是用户自身在哪些位置,查看这张地图,可以看见这个密码的区域。也就是说,这里需要对用户进行定位。这在移动互联网时代已经不是什么问题了。注意,这里的有两个位置,一个是密码所在的地图上的网格的位置,一个是用户自身的全球定位,两者不能混淆。一个可能的表如下:

  • Hash(经纬度) primary key
  • (密码,作用区域)元组组成的序列

当用户设置了密码的作用区域的时候,只有在这个作用区域的人才能看见这个密码。例如,我设置deng199011的密码到地图上某个网格,并设置其作用区域为浙江大学附近区域。这时,只有浙江大学附近的人查看地图,打开这个网格,才能够看到包含这个密码。其他地区的人看这张地图,密码序列是不包含deng199011这个密码的。

这样,利用用户自身的位置,一方面减轻了同一位置多个密码的问题,另一方面,也让密码信息得以进一步隐藏。

 安全性和可用性

所能面对的攻击

1. 账号被盗

因为黑客根本就不知道密码所对应什么账号,所以也就不存在账号被盗的问题。

2. 黑客通过本网站获取明文密码来建立彩虹表

由于后台数据库本身每个地址都有随机生成的密码,同时地址被加密,黑客无法辨识哪些是用户添加的密码,只能拿走完整的数据库。而完整的数据库密码数量过于庞大以至于对黑客没有意义。

社会学攻击

如果黑客通过社会学方法,知道了被攻击人的地址和可能存放密码的地址,并且知道被攻击人的常用账号,是可能通过遍历的方式来找到密码。因此,社会学攻击是这个系统的一个弱点。这里提出两个改进,能够加大社会学攻击的难度。

  1. 对显示的密码做captcha,增加遍历某一区域密码的难度
  2. 实际上,地图背景理论上可以换成任意一幅图。用户可以添加自己的图片,通过搜素获得自己上传的图片,并找到图片上对应的位置。这将会使机制变的复杂,但能够较好的防范社会学攻击。

热点问题

在上一章中,我们提到如果一个网格添加了过多的密码,会导致这个网格里的密码数多到难以忍受。而系统本身是不允许编辑和删除的,因为编辑和删除以为着某个人的密码可能被改掉了,这是不允许发生的。因此,还是会有可能产生\textbf{热点},就是很多人在这个位置添加了自己的密码,以至于数量多到不可忍受,例如100条,从100条密码中找到自己的密码可能会是一个十分痛苦的过程。

热点问题是伴随用户量上升会出现的问题,一方面,用户自己会避开热点,选择相对自己熟悉但是并不十分热的地点,这将有助于减缓问题;另一方面,系统本身用户数会达到会产生热点问题的级别的可能性也比较小,由于地图上网格的选择很多,用户的密码更有可能会稀疏的分布在网格中。

与现有替代产品的比较

1. 密码提示问题

很多网站都提供了密码提示问题来帮助丢失密码的用户来找回密码。这也是一种转移记忆对象的方式,把枯燥的英文、数字记忆,改为对特定与自己相关的的问题的记忆。但从实际使用的效果上来看,仍然会有用户不记得自己所设置的一些主观性很强的问题的答案,同样的,这种方式也不能防范社会化攻击,并且面对社会化攻击更加脆弱。而通过地图的方式,用户所增加的额外记忆仅仅是自己所选择的哪一个地址,如果选择的是自己的家或者工作单位,这几乎没有增加额外记忆,其他都是通过用户的辨识,在地图上寻找来找回密码,用辨识(recognition)代替了回忆(recall)。而用户对自己家地址的记忆是非常牢固的,甚至对于一些记忆有缺陷的人,仍然能够记住自己常去的位置。

2. 密码仓库

密码仓库是一个密码管理服务,一般来说,用户将网站账户和密码记录在密码仓库中,并使用一个密码来访问密码仓库,达到记住一个主密码,就能够记住其他所有的账户和密码的效果。有些密码仓库还使用公私钥的方式来取代主密码,用户需要提供公钥,并使用自己的私钥访问。现代浏览器基本上都已经自带了密码仓库的功能,帮助用户自动填写登录表单,而用户需要登录这个浏览器的账户,也就是输入所谓的主密码。密码仓库的一个显著问题就在于,用户仍然可能会遗忘主密码,或者弄丢了与公钥配对的私钥(完全没救了)。考虑可用性的话,普通用户也无法接受一个需要使用公私钥系统的密码服务。因此,密码仓库可以与地图网格服务相结合使用,从而取长补短,更彻底的弥补密码忘记的问题。

总结

综上,我们可以看出,地图网格系统是对现有的密码系统的一个很好的补充,并且能够更好的替代一些例如密码提示问题等找回密码的方式,帮助用户更好的找回、辨识出他的密码,同时提供非常理想的密码信息隐藏,将账户信息与密码信息分离开,帮助用户保护账户不被盗用。最重要的是,方便用户的使用,用户只需要在地图上找到自己的家,并在网格中填入/查看自己的密码。

产品孵化、微博营销和人际网络

好吧,这种标题的文章我一般不怎么看。不过考虑到3 Dumbass Start-up Mistakes That You’re Probably Making上了hacker news,还是看了一下,觉得讲的还是有道理的:) 但我实在不愿意起这么傻的对应中文标题,还是换个名字吧。

1. idea incubation

idea孵化,在正式发布产品之前,把产品孵化好。孵化这个词时髦而恰如其分,但是,说了相当于啥也没说,因为孵化具体如何操作谁也说不清楚。不过文章中提到的一点就在于,在baby孵化好之前,早产儿一般容易挂。在正式发布产品之前,对需求、市场做好功课,不断精炼等等。什么时候算是孵化好了,这个指标文中没有说。似乎可以一些孵化器的标准,例如xx工场。

2. social media marketing

这里文中提到,社交账号需要尽量少的提到个人信息。同时,要显得自己是一个guru。似乎国内的社交账号一般都要显得自己是心灵鸡汤。社交网络中一个重要的一点是,创造social proof,就是要人们按照你说的去做,例如“别担心,第一次你是不会怀孕的,相信我,我在健康课上学过。[链接]”。而创造social proof的一个方法就是,让账号是一个guru,想象自己是马丁路德金,然后号召大家:

@MLKjr: Injustice anywhere is a threat to justice everywhere. Here’s an article for my followers to consider [insert link].

不要提自己的个人信息,例如我今天吃了啥。Nobody cares。

3. networking

创业初期构造自己的人脉= =?或者这里的词:network很重要。糟糕的是,人脉的含义是利用别人带来的资源,完成自己想要做的事,这往往行不通的。就像在人人上加了一个人为好友,就直接要求资源或者长时间的咨询。我对这种人真是无语至极,到后来就只好呵呵了。文中打了一个比喻,人就像网络中的一个节点(事实上也是),信息、资源在节点之间来回的传递,而不是单向的传递到你这里。这就是所谓的win-win。你首先得为其他人提供价值,别人才会回馈于你。

Planning 2013

I have been as Product Manager and Developer (with testing & operating). Now I know how to give birth to a web product from scratch. But I don’t know how to raise the products.

So, let me know in 2013 to raise a product up. Carry on! :)

研究型人才和工程型人才

在《打造Facebook》中,作者提到Facebook也字慢慢摸索研究型人才如何在一家节奏很快的技术公司立足。这确实是一直困扰我的问题。更准确的说,困扰我的是,做一名什么样的人才。

研究型人才

做研究重要的是理论和逻辑,要弄清楚前因后果,并小心翼翼的证明这些都是对的。对研究成果的质量要求高(但注意,不是所依托的项目,而是项目中涉及到的一个研究点),时间要求低,因为研究本身就是不知道啥时候会出什么样的成果的,所依托的项目一般也并不是要真是运行的项目,仅仅是为了研究所用。

项目型人才

项目型人才重要的是完成项目,要求速度、可用性等,做项目不光要把某一个点搞定,项目涉及到的任何细枝末节都要去做,得擦屁股(做研究就不用擦屁股,一个安全漏洞百出的系统仍然可以是一个很好的实验)。Facebook的理念是Get things done better than perfect,项目型人才就是要get things done。但是把问题解决了,但是没有完善的理论支持,没法发paper呀。

硕士研究生似乎看起来应该是研究型人才,选一个课题,找一个可以依托的项目往里研究就好了。但在zju,似乎要做的项目是真的要在线上跑的东西,于是,重心似乎在系统的可用性上( ⊙ o ⊙ )。Whatever。

进程优先级

这两天复习高级操作系统,忽然想到曾经一直让我很奇怪的问题。

从前电脑卡,于是打开进程管理器查看进程,想看看能不能把自己正在使用软件变的不卡,于是,想当然的跳高相应进程的优先级。可是调高之后发现似乎没啥效果…

突然想起来这事,虽然现在电脑好,也比较少用windows了。调高进程优先级,仅仅能够让操作系统在进程调度时,有该进程的计算时优先计算,但这个进程卡更有可能是内存不足,反复从硬盘加载内存;硬盘转速慢;显卡性能差;网速慢都有可能造成软件用户界面很卡。

So,怪不得从前的我在那干着急。