Category Archives: Uncategorized

民科旋翼机和学术研究

寒假同学聚会,聊起了民间科学家,某逗童鞋提到了民科做出来一个直升机,很牛逼的样子。于是回家一番搜索,果然找到了相关网站和视频。一看视频,矮油卧槽,碉堡了,这玩意真能飞啊!报道:造飞机制潜艇 民间科学家:发疯还是发明

但是这个跟平常印象中的直升机不一样。直升机的屁股上怎么有个朝后的用来推进的螺旋桨呢?不应该是有个平衡尾翼什么的,螺旋桨是朝着侧面的嘛。上知乎。

果然,由于,直升机上面的螺旋桨是发动机带着转呀,有力就有反作用力,底下的机身不也要反转么?为了不让机身反转,在尾巴上加个侧面的螺旋桨,抵消反转的作用力哇!或者,就是有两个螺旋桨,转向相反,就不需要尾翼了。我的那个玩具直升机也是这个原理,有两个螺旋桨。详情请自行知乎:http://www.zhihu.com/topic/19640478

那视频中的就不是直升机啊!视频标题很严谨啊!这是旋翼机啊!旋翼机是什么啊!很安全的一种飞行器,上方的旋翼不是由发动机带动的,是气流推动自转的,所以下面不会给反转。主要是朝后的螺旋桨提供动力。这货没油了也不会掉下来,上方的螺旋桨会接着自转,会滑翔然后着陆,十分安全。

这样一看,民科做的东西还是很靠谱的!因为要求就仅仅是能飞,不要求负重多少,飞的稳不稳,扎实不扎实,舒服不舒服,噪音小不小。能飞起来就行。

实际上,这玩意说不上是发明,理论早有了,外国这种飞机也到处飞了,只是国内禁飞而已。这应该是手工做了一个旋翼机的实现。

我怎么突然想到了自己上个暑假在实验室做的东西呢。

弄一个别人做的飞机引擎(Lucene), 装一个朝后的螺旋桨(写了一个只能爬特定网站的爬虫) 上面弄一个没有动力的螺旋桨装点门面(写了点好看的前端) 然后不懂行的人一看,这造了个直升机啊!(做了个搜索引擎啊!) 其实是个旋翼机。(站内搜索)

中国早期的直升机,据说是苏联的图纸。所以还是架构师牛逼。实现一个架构,用土办法都能实现啊。

OAuth原理介绍

绪论

OAuth是近年来逐渐广为使用的Web服务认证协议,他所解决的是在Web服务之间共享一个身份认证的问题。例如,在OAuth出现以前,人人网想要导入你在MSN的联系人,这时,人人网就会让用户输入他在MSN的用户名和密码,并保证不会窃取用户的密码,之后就可以导入联系人。这样是十分危险的,一方面,人人网本身是否可信就有问题,万一人人网的某一个员工在其中窃取了密码并以此牟利,很难防范;另一方面,假设人人网没有问题,但是密码存在于人人网的这一段时间里,如果有黑客攻破了人人网的服务器,同样,用户的密码会有被窃取的风险。

因此,2007年末,OAuth 1.0(RFC 5869)诞生,并迅速成为标准。但是很快,OAuth 1.0被爆出有安全漏洞,于是发布了OAuth 1.0a修复了这个安全漏洞。在2008年,IETF(Internet Engineering Task Force)接手了OAuth的制定,OAuth 2.0的制定工作也一直在进行中,到现在主要框架已经提交发布为RFC 6749,还有其他的RFC正在制定中。

OAuth 1.0

OAuth中有三个比较核心的角色:

用户 User,即一个普通用户

消费方应用 一个希望使用用户的身份对服务方进行操作的应用或服务

服务方 Sevice Provider 一个需要验证用户身份,并提供服务的Web服务

一个典型的用户场景是,小明(User)需要打印他的一些照片,并打算使用一个网络打印机服务(Consumer),但是他的照片在另外一个网络相册服务上(Service Provider),他希望打印机能够自己去网络相册上下载图片并打印,但是又不希望给打印机服务提供自己在网络相册的服务上的账户。而此时,网络相册服务提供了OAuth认证服务,于是,小明可以让Consumer通过OAuth对自己进行认证。

认证的步骤如下图:

oauth

  1. 向Service Provider请求一个请求令牌RT,这个RT是没有经过用户授权的令牌
  2. 引导用户到Service Provider的网站上,对网站的请求参数中需要包括令牌RT,或者让用户输入RT也行。
  3. 向用户确认对这个Consumer进行授权,用户授权后,令牌RT变成已授权的令牌。
  4. 引导用户回到Consumer的网站。
  5. 这时拿RT(已经授权过)去向Service Provider换取访问令牌AT
  6. 使用访问令牌AT来获取Service Provider上受保护的用户资源

而对于小明,他所要面对的操作包括两步:

1. 在网络打印机服务的网站上,通过链接进入网络相册服务的认证授权页

2. 在网络相册服务的授权页,点击确认授权。如果此时小明没有登录网络相册服务,则在授权之前需要先进行一次登录。

藉此,网络打印机服务就可以通过Access Token对资源进行访问了。

基于HTTP的OAuth认证

OAuth默认使用HTTP请求的方式来完成服务间的通信,因此,由于HTTP本身是不加密的,安全性很弱,因此,在所有请求中都要加入验证的签名信息。

HTTP首部参数和签名

OAuth使用HTTP标准的Authorization和WWW-Authenticate首部来传送OAuth协议参数。因此Service Provider和Consumer都需要能够对这两个首部进行读写。

另一方面,所有对令牌的请求和受保护资源的请求都需要进行签名,以防止未经授权的第三方盗用令牌。但是具体的签名算法可以自定义。签名时,使用编码后的请求参数按照组成一个基础字符串(Base String),并使用HMAC-SHA1,RSA-SHA1,PLAINTEXT或其他方式来生成。Service Provider通过同样的方式来校验请求方的真实性。

Consumer获取请求令牌

Consumer向Service Provider的请求令牌URL发起一个请求,请求包含以下参数

  • oauth_consumer_key: 消费方键值。
  • oauth_signature_method:

    消费方签署本请求所用的签名方法。

  • oauth_signature:

    签名,定义于签署请求 (签署请求)。

  • oauth_timestamp:

    定义于Nonce and Timestamp (单次值与时间戳)。

  • oauth_nonce:

    定义于Nonce and Timestamp (单次值与时间戳)。

  • oauth_version:

    可选。如果存在,其值必须为1.0。如果参数不存在,服务提供方必须假定协议版本为1.0。 服务提供方对1.0以外取值的响应尚未定义。

    额外参数:

    由服务提供方定义的任意额外参数。

其中,消费方键值是服务提供方之前给消费方的,同时也会给一个secret值,用来认证消费方。

Service Provider返回未授权的请求令牌

Service Provider会生成请求令牌和令牌密钥,并在HTTP响应头中返回。包含参数如下:

  • oauth_token:

    请求令牌

  • oauth_token_secret:

    令牌密钥

Consumer引导用户到Service Provider

Consumer需要构造一个指向Service Provider来进行授权的URL的HTTP GET请求,包含参数如下:

  • oauth_token:

    可选。在前述步骤中获得的请求令牌。服务提供方可以声明此参数为必须,也可以允许不包含在授权URL中并提示用户手工输入。

  • oauth_callback:

    可选。消费方可以指定一个URL,当 获取用户授权 (获取用户授权)成功后,服务提供方将重定向用户到这个URL。

这个地址是在Consumer请求到未授权的令牌时,重定向到的位置。

Service Provider认证用户并获取许可

如果用户没有在服务方这边登陆,那么用户需要首先登陆。之后在许可页面,确认许可Consumer使用Service Provider提供的内容。

Service Provider将用户引导回消费方

一般的,Consumer需要向Service Provider提供一个回调地址,服务方会将用户重定向到这个地址,并通过这个请求来告知Consumer是否已经被授权。参数包括:

oauth_token: 被用户授权或否决的请求令牌

Consumer请求访问令牌

Consumer需要将已授权的请求令牌和密钥换成真正的访问令牌和密钥。因此,需要向Service Provider发起一个请求,这个请求需要包含签名。参数如下:

  • oauth_consumer_key:

    消费方键值。

  • oauth_token:

    之前获取的请求令牌。

  • oauth_signature_method:

    消费方使用的签署方法。

  • oauth_signature:

    签署请求 (签署请求)中定义的签名。

  • oauth_timestamp:

    在单次值与时间戳 (单次值与时间戳)中定义。

  • oauth_nonce:

    在单次值与时间戳 (单次值与时间戳)中定义。

  • oauth_version:

    可选。如果存在,其值必须为1.0。如果参数不存在,服务提供方必须假定协议版本为1.0。 服务提供方对1.0以外取值的响应尚未定义。

Service Provider返回访问令牌

如果换令牌成功,返回的参数包括:

  • oauth_token:

    访问令牌。

  • oauth_token_secret:

    令牌密钥。

    附加参数:

    服务提供方指定的附加参数。

访问受保护的资源

Consumer收到令牌和密钥后,就可以访问受保护的资源,同时也要进行签名。请求需要包含的参数如下:

  • oauth_consumer_key:

    消费方键值。

  • oauth_token:

    访问令牌。

  • oauth_signature_method:

    消费方使用的签署方法。

  • oauth_signature:

    签署请求 (签署请求)中定义的签名。

  • oauth_timestamp:

    定义于单次值与时间戳 (单次值与时间戳).

  • oauth_nonce:

    定义于单次值与时间戳 (单次值与时间戳).

  • oauth_version:

    可选。如果存在,其值必须为1.0。如果参数不存在,服务提供方必须假定协议版本为1.0。 服务提供方对1.0以外取值的响应尚未定义。

单次值和时间戳

请求时间戳用格林威治时间1970年1月1日0时0分0秒起的秒数表示,除非服务提供方另外指定。 请求时间戳必须是个正整数,并必须不小于上一个请求中的时间戳。

消费方必须为一个时间戳的所有请求的生成不同的单次值。 单次值是一个随机字符串,是为每次请求生成的唯一值。 服务提供方用单次值验证一个请求之前从未被发起过,有助于防止非安全通道(例如HTTP)上的重放攻击。

OAuth 1.0的问题和OAuth 2.0

从上一章我们可以看到,OAuth 1.0由于使用了HTTP请求,因此需要额外的加密签名来保证整个认证过程的安全性。这样造成了他的主要问题:首先,签名逻辑过于复杂,对开发者不够友好,授权流程太过单一,除了Web应用以外,对桌面、移动应用来说不够友好。因此,IETF希望在OAuth 2.0中完全的去除掉加密这个环节,而利用HTTPS和SSL所提供的安全通道来保证安全性。

除此之外,OAuth 2.0针对不同的情况使用不同的授权流程,和老版本只有一种授权流程相比,新版本提供了四种授权流程,可依据客观情况选择。

OAuth2.0定义的角色比1.0中多了一种,它的四种角色是:

  • Resource Owner:User
  • Resource Server:Service Provider
  • Client:Consumer
  • Authorization Server:Service Provider

也就是说,认证服务器被从Service Provider中拆分开来。而授权流程也氛围以下四种:

  • Authorization Code 可用范围:此类型可用于有服务端的应用,是最贴近老版本的方式。基本流程就是拿Authorization Code换Access Token。
  • Implicit Grant

    可用范围:此类型可用于没有服务端的应用,比如Javascript应用。没有服务端的应用,其信息只能保存在客户端,如果使用Authorization Code授权方式的话,无法保证client_secret的安全。

  • Resource Owner Password Credentials

    可用范围:不管有无服务端,此类型都可用。仅适用于可信赖的应用。

  • Client Credentials

    可用范围:不管有无服务端,此类型都可用。仅适用于获取与用户无关的公共信息。

OAuth 2.0标准还在制定当中,也有人认为OAuth去掉了加密认证是个完全错误的决定,会导致OAuth本身不够安全,这里就不再深入分析了。

参考文献:

  1. E. Hammer-Lahav. The oauth 1.0 protocol. 2010. https://tools.ietf.org/html/rfc5849
  2. Oauth. http://en.wikipedia.org/wiki/OAuth.
  3. The oauth 2.0 authorization framework. http://tools.ietf.org/html/

    rfc6749.

  4. Oauth的改变. http://huoding.com/2011/11/08/126.
  5. Oauth 2.0. http://oauth.net/2/.
  6. Oauth 2.0对web有害吗?. http://www.infoq.com/cn/news/2010/09/oauth2-bad-for-web.

移动互联网的app入口

现在没有人再怀疑移动互联网的价值了。而移动互联网同样也有Web和App之争。

从现在来看,应该是App占据明显的上风。

问题来了,App太多了,用户要在好几屏上找到想用的App,实在是太麻烦了。

解决这个问题有两种思路:

1. 做一个大一统App,例如QQ,啥功能我都有,都冲我来吧。

这种方案,说实话,很难实现。一旦不能包含所有用户需要的功能,就会变成:

  1. 用户先在主屏上找应用
  2. 用户接着在应用里,找到相应的功能

我去,更复杂了。这其实就是Web。

2. 把App的功能进一步打散,一个App只做一件事,用户想做一件事就想到对应的App,提升用户在主屏找应用的效率。

这种思路,现有的方案包括ios上的搜索栏、Siri语音助手。不过安卓因为苹果牛逼的专利,没法做搜索栏,先天不足啊。语音助手倒是一个不错的approach,如果能做到所有应用的语音识别,想必是一件很爽的事。

屏幕尺寸和人机交互

电影

——尺寸: 百平米
人类接触的第一块会动屏幕应该是电影的幕布,当然准确的说是荧幕。大约是100年前,电影作为一种娱乐形式开始为人类带来无尽的乐趣。电影院的荧幕一般都非常大,200~600多平米,从而在视觉上给人以很强的冲击力。大屏幕也意味着,人基本上只能看和听,不太可能与电影有更多的交互。大屏幕也仅仅适合到专门的地方,例如电影院观看,也不太可能在家里或者路上观看。当然现在各种所谓4D电影干各种捅人屁股的事,算是一种有限的交互探索吧。

电视

——尺寸: 平米
交互有限就意味着:明显不个性化,看电影就属于大伙一块看,不自由。于是人类发明了一块小一点的屏幕,可以放在家里,挂在墙上,抱在怀里(如果你乐意的话)。电视通过频道和遥控器提供给人们特定的交互,让人们开始能够有所选择的收看自己喜欢的东西。特别是,你只需要按几个按钮,屏幕中就能出现一个人或者好多人在告诉你一些新闻、趣事、天气预报,这是一件多么科幻的事情啊!你仅仅动了动手指啊,也不需要想许多啊。

个人电脑

——尺寸: 平米
电视机的交互简单到难以置信,也就意味着,人们能干的太少了。Geek们说,我们要对着电视机干更多的事,于是,在同级别的屏幕尺寸上,人类有了电脑。然而电脑的交互过于复杂,硬件上要明白键盘、鼠标,开关、接口,软件上要弄明白xp、360、扣扣。强大的功能意味着学习成本,从而让一大部分用户没法使用电脑,还是去按几个键看电视吧。电脑给人类带来了交互上的伟大进步,但同时,不得不承认,过于复杂的交互让一部分熟练工产生了一种莫名其妙的优越感,这种优越感确正式科技不够发达所带来交互瓶颈的牺牲品。好像说的有点绕,简而言之就是,我居然要敲这么硬这么多键的键盘才能写文章,这么多按钮啊!一支笔上最多只有一个按钮啊!居然也能写文章啊!

移动终端

——尺寸: 平方厘米
其实就是手机。为了照顾一下PDA、mp4什么的,说成终端吧,互联网终端。电脑屏幕越做越小,本来用来打电话的手机屏幕(手机居然需要屏幕!电话就没有啊!)越做越大,于是,有了iphone。移动终端终于实现了,你在家里、路上、上厕所的时候都有一块屏幕了。比起来只能跑到电影院才能看到的大荧幕,这个明显更适合看苍老师。这种私密的、个性化的事,当然要在只有自己能看到的屏幕上看。如果说PC通过键盘、鼠标、图形界面的组合为人类提供了相当复杂而有效的交互,移动终端上能提供的交互就捉襟见肘了。所以大家喜欢用手机用来拍照片上传,这是操作最少、产生信息量最大的方式。

眼镜!?

——尺寸: 平方厘米
手机所提供的交互,在于你要低着头,手握手机,然后大拇指动来动去。时间长了手酸脖子算啊,走路还容易撞人,当然以此为由撞美女这事我会乱说么?不如放在眼镜上啊!从此可以在45度角仰望天空的时候边刷微薄边流泪了有木有!可是我居然不能用手指头在眼镜上戳来戳去,这可怎么办怎么办。不过人类不是已经发明了鼠标么,鼠标不连在屏幕上啊。所以45度角仰望天空的时候,手插在裤兜里,握着一个仓鼠标,就是仓鼠大小般的鼠标,摸来摸去,就看到微薄从第一条刷到了最后一条,然后又有25条新微薄。最终情景就是,路上的行人手都插在裤兜里卧仓鼠标,戴着一个厚框眼镜,眼睛正视前方,然后就不小心掉坑里了。

 

来,本文地址:http://nius.me/screen-size-and-human-computer-interaction

Resume of Zhihao Deng

I am Zhihao Deng, whose majored is Spatial-Informatics & Digitalized Technology, in International School of Software (ISS) of WHU. My major requires both the skills in programming and the technology related with GIS. Personally, I have a great interest in the subject of software engineering and Internet industry. As the major Software Engineering (SE) and my own major are under the same department, I can easily get access to various knowledge in SE and work with rather nice guys to improve myself.

I was interested in the Java language at the very beginning and get myself involved in the beautiful objective oriented design of this brilliant open-source masterwork. With the technology of database and front-end scripts, I can build a web site by myself independently. With the development of the mobile internet, I even studied the Android API to build embedded software. However, the more technology I studied, the more problems I found in the cooperative development of a program. Therefore, I gradually turned myself into a role of manager and leader in a project, and tried some advanced methods in Software Engineering like Agile, Scrum, to make a project’s development more efficient. As performing like a project manager in a small group, I in fact play the role of product manager at the same time. I have gotten a conclusion that what does matter most is not how advanced techniques you use, but the requirements of the users’ your project meets. So I push myself into the study of product manager in software engineering and get an internship of this occupation in Taobao.com.

Before coming to HangZhou for internship, I have already lead several projects in the academic period in University. The most successful one is the E-razor Arbitrage Software, which won the championship of the sixth Citi Financial & IT Competition in December, 2010. My team and I fought together for about 7 months from May to December, perfecting the product over and over in 3 iterations. I worked as the team leader and also the product manager. Besides that, I designed the database of the product and was also responsible for the development of Android client.

After these years’ study in software and internet, I gradually get some essential knowledge of this great new world created by programmers, which is far behind enough. As we can see, China’s software engineering is still falling behind that in U.S. while China’s programmers are catching up. It is also my mission to devote myself into this progress and contribute to building a nice environment of software and internet in China. To achieve this, I should get more knowledge in SE and experience in developing more complicated and large system or project. And I think with the higher platform in postgraduate session, I can improve myself in a fast and stable way.

Hello world again!

自从7月初一不小心在之前的主机上把博客误删掉后,一直都没有时间重建。

重建博客一直是心中的牵挂,但总是没能抽出时间,转眼两个月过去了。

没有博客,连写东西都不知道往哪写。这两个月在diandian上暂时写了两篇,完全没感觉。又寄希望于SAE能够支持域名绑定,结果网上的办法是通过GAE做一次中转,伪geek表示压力很大= =!

今晚想着再也不能拖了,刚好上周招财童鞋推荐了几个便宜的host网站,于是果断搞起啊~

用note pad从之前博客导出的数据库中找出了所有文章的文字,其实也没有几篇文章,后面好几篇都是和路人网相关的,哈哈。吴总加油咯!

图片是丢了,以后应该用个公共的图床,貌似淘宝有一个,如果是真的,简直美翻了。

Whatever, Nius is back!