这个周末去参加了HackShanghai的Hackathon活动,感觉挺棒的,这里是活动的记录。
Hackathon
Hackathon,就是一个在极短的时间内做一个东西的活动,到目前为止也算是参加过三次类似的活动了,感觉这类比赛的魅力在于,在活动中有很多的选择,很多的变数。可以类比一下MOBA类游戏和一般的游戏,Hackathon就像是一个MOBA类型的游戏,我跟我的队友可以一起,在很短的时间内完成一局游戏。这局游戏里,成败不单单看你的技术,还有你的阵容,你的状态,等等。有时候就算技术上跟其他的队伍有很大的差距,但是如果阵容合理,创意够炫,状态够好,一样可以逆袭。而一般的比赛,项目,都是一个非常长期的过程,要进行需求分析,技术方案制定,等等,另外还有完善的错误处理,异常处理机制,要保证没有Bug,是一个比较看能力的过程,相比Hackathon而言就少了一点乐趣。
HackShanghai
HackShanghai是上海纽约大学举办的Hackathon活动,共有250左右的参与者,其中还有不少外国友人。跟之前参加过的比赛不同的地方在于,它有提供硬件,可以基于某些硬件进行编程,这样就增添了更多选择。
而且上海纽约大学豪华的硬件设施也是棒棒的,虽然只去过B1,1,2,3,15这么几层楼,但是已经被震撼到了,还真没见过哪所大学有如此场地。只能说不愧NYU。。。
记录
在这次比赛里,我是遇到了自己的小学同学,飞哥。所以就随自己的小学同学一起,以及同学院同班的一个大学同学,组成了一队,本来还有一个学弟要一起,但是后来不知道学弟是没有参加这次比赛还是之类的,莫名失去了联系,也不太清楚原因,所以到最后,我们就是三个人一队,开始了Coding。
Idea
本来,我们想做的是一个文件分享转移的东西,举个例子就是,你在这个电脑上“抓住”一个文件,然后往另一台电脑上一扔,文件就这样被扔过去了。其实这就是一般的文件的上传与下载,但是跟传统方式不同的是,我们是基于动作的,交互感特别强。
后来,在一个加拿大的设计师听了我们的Idea之后,不知道是他理解错了我们的意思还是有了自己的新想法,提出了一个更让我觉得眼前一亮的做法:可以实现内容的同步传输。举个例子,当你写代码写到一半,遇到一个Bug,写不下去了,就对你的同学B说,B啊,我代码写不下去了,你能帮帮我么,然后,就把你的编辑器连同代码,就这样扔给B,B是大神,分分钟调完了Bug,于是又自豪地把代码扔回给了你。这种情况下的交互感是赞爆的,甚至可以不停扔你的代码,扔给所有人看一看,这种场景想想就酷炫。
我们的Idea,就是基于上面的两个例子,接下来就是实现的过程。
实现
对于上面的第一个例子,要做到这一点首先需要有一个文件系统。而如果直接在系统下操作,代码的难度会非常高,做的操作可能会比较难实现,所以我们就考虑用Javascript来模拟你的文件系统,在浏览器里做上传下载的操作,这是比较容易实现的。
对面上面的第二个例子,本来我们是想写一个Sublime的插件,来完成在Sublime上的这种功能的。但是后来飞哥发现Sublime插件不能import外部的类,所以不能整合Leap Motion进去,于是放弃。后来转战了Web编辑器上面,因为浏览器肯定可以支持Leap Motion的Javascript API,所以我们可以在一个基于Web的编辑器上写代码,然后把这个Web编辑器的Url包括我们已经写的代码,扔给B,这样就实现了我们第二个例子想做的操作。
就在飞哥和周在找Web编辑器的时候,整个想法又被我一句话带去了新的方向。我觉得这样子在Web编辑器里要实现这一功能,也是十分困难的,因为很难找到一个代码复杂度适合我们这个项目的Web编辑器,要想修改这个编辑器,肯定是要花费很多时间的,基本等于重构它一遍吧。所以我就想,我们要的是这样一个概念,并不是这样一个功能。所以,我们可以做得简单一点,实现一挥手,你现在正在浏览的页面,会挥到B的浏览器里。这个实现起来的难度是大大低于之前的做法的,而且我也认为这可以充分展示我们的想法。于是后来我们就改为这样做了。
那为了实现这一功能,我们需要让浏览器能一直在监听我们的Leap Motion,我们想到的实现方式有两种,一种是把Leap Motion的控制脚本插到浏览器打开的每一个网页中,这样,当你浏览的时候,是可以执行到的。但是这里可能存在一个问题,那就是如果所有页面都有这样一个脚本,那么会不会浏览器打开的每个页面都一直在监听Leap Motion,但是实验发现在浏览某个Tab时,其他Tab是处于挂起状态的,并不会发生这么一个问题,所以我们的发送就这样来实现了。
那接收该如何实现呢,我的服务器知道了挥手发送的发生,那客户端该如何接收呢,接收了又该做些什么呢,这也是挺大的问题。后来是周一人Carry了这个问题,他解决了Chrome插件的一系列问题,最后实现由Chrome插件做客户端,不断发送跨域Ajax请求访问我们的服务器,然后打开相应的页面,简单来说就是轮询。
完成度
最后我们基本实现了文件系统下文件的拖拽分享,以及HTML页面的挥手分享,完成度还是很高的。但是存在一个问题,就是展示的效果不是太好,因为动作跟功能有些分离。举个例子我们在文件系统下的上传,是用画圆圈的姿势来实现的,这样就没有很强的现实感,如果用上推等等姿势来定义,会更好,这也是后来才发现的问题。
总结
收获很多。
首先需要吐槽一下,Leap Motion还不是很成熟,尤其是对于Gesture的识别,无论是自己定义的,还是自带的。而且,由于它是用算法模拟手,所以如果它看不到你的手的某些部分,它会预测地画出那些部分的位置,而因为是预测,所以可能不太准确,也可能导致没有被观测到的部分本身没有做任何动作,但是预测的部分却被预测做了这些动作,这也是比较惨的。
不过,这次活动我们的创意在我看来真是赞爆了,是我做过的第一个让我自己都眼前一亮的东西。我觉得我会努力把他实现出来,因为这个实在太棒了。如果将来能够实现Idea里想到的,那绝对是一个够Geek的东西。
最后,感谢上海纽约大学NYU以及她的Volunteer们,这两天真是辛苦他们了,听说提前5个月就开始筹备这个活动了~?有点拼啊~点个赞。
花絮
- 目测有80%的参与者都是用Macbook的
- 目测有99%的参与者都跟我是一个性别的
- 上海纽约大学这么好的学校,怎么饭菜也是一般般