Jason Koo

      Stay hungry, Stay foolish!

导航

回顾我接触到的一些技术和工具

Posted on 2012-06-14 23:32  Jason Koo  阅读(218)  评论(0编辑  收藏  举报

       读研马上就要一年了。

       这一年里,研究性的东西基本上没做,大部分时间都是在给老板开发一个项目。当然,除了开发任务,我还要负责服务器的搭建、项目的部署以及维护等工作。总之,任务比较杂,东一块,西一块。我也一直很焦虑,因为接触的东西太多了,很多东西只是略知皮毛,掌握得不够扎实。现在趁着清闲,总结一下这一年来接触到的技术和工具。

       我依然记得,去年刚来学校,老师交给我的第一项任务就是读两篇有关sensor network的论文,这两篇论文足足有一本书厚,而且全是英文,当时真是痛苦不堪。读完论文,我隐隐觉得老板是不是要研究物联网啊,这么有前途的东西,我一定要好好努力啊。可是,事实并不是我想的那样。

       两篇论文过去。老板给我布置了第二项任务,这项任务需要我实现一个基于地理位置的搜索功能。手机端发出文字查询,服务器端通过计算返回与手机端当前位置最近的N个和查询文字相关的内容。这种文本内容的查询直接使用数据库的模糊查询功能会非常耗时,特别是当数据库里的记录数十分庞大的时候。我们需要一种更高效的接解决方案。那就是使用Lucene对待查询内容建立索引,请求到来直接通过索引找到目标Id,根据目标Id在数据库里找到Id对应的记录,最后把记录返回给手机端。所以,我接触到的第一个技术就是Lucene。Lucene是一个高效的索引功能,使用它可以对纯文本建立索引,从而实现全文检索。

      实现了这项功能后,我又接到了第三个小任务。那就是如何根据两点的经纬度算出两点之间的球面距离。我不是数学家,对于这种计算问题,我无从下手。我也只是从网上找了一个计算公式,然后用Java语言实现了这个转换功能。前几天,和另外一个搞技术的人讨论,他指出我这种实现策略效率太低。不能使用这种包括了三角函数、根号的计算公式,太消耗CPU资源了。如果在线用户数多的时候,服务器肯定吃不消。他说应该用一种简单的近似计算公式,我当时只是点头同意,并没有深入去找具体实现方法。现在仔细想想,其实我在上学期已经接触过一种近似的计算方法。只是没有深入去理解其中的原理。lightrod(后面会介绍的详细一些)使用了一种近似计算策略,它提前把每一点的经度和纬度转换为一种peano码,使用这种转换后的peano码可以快速地计算出两点之间的球面距离。

      接下来的任务是用网页以图表的形式来展示某样东西(具体内容不便透露)的统计信息,以便根据该统计信息做出合理的决策。统计信息的计算是通过写入数据库的log得出的。具体的计算过程只是涉及到一个复杂的sql语句查询,使用到了group by,还有order by, 还有count(*)等,很是复杂,当时费了很大劲才组合好我想要的sql语句。计算出统计信息,需要将信息以图表的形式在web端展现出来。我当时搜索了很久,想要寻找一款适合的图表绘制工具。我当时浏览了JFreeChart, Open Flash Chart, FusionChartsFree还有google chart等,最终还是选择了open Flash chart,因为这种工具画得图很美观,有动态效果,只是对中文支持的不是很好。

      接下来是老板要求听一个美国教授的讲座,这位教授叫张晓东,是在美国的华人里研究成就非常突出一位教授。他一开始讲得为facebook实现海量数据分析的一种表结构很吸引我。只是我没有深入去读他的论文。从他的这次讲座,我了解了云计算,Hadoop,Hive等很多东西,还知道了非关系型数据库很火。

       接下来就是真的开始接触整个项目了。整个项目采用了struts这种框架,数据访问采用了ibatis这种数据映射框架。从最开始接触,到现在熟练地熟悉整个开发流程,我花了不到一个月的时间。接着我就是用这种框架开发了一个商家的后台管理系统。在这期间,我也接触到了版本控制系统git。使用这种工具来实现对项目的版本控制。

       接下来可能顺序有点乱,因为接触的太多了,顺序记不太清了。

       接着,老板开始让我调研推荐系统。因为我们的项目有推荐功能。我就读了很多(当然没有通读)有关Recommender System的论文。我再一次激动了,我要是能一直研究这种推荐系统,那我将来一定会很牛逼。可是我又想太多了。我读了论文,然后做了一个有关推荐系统的Presentation.然后老板就让我实现一个demo。其实,当时我还是很重视这个任务的,构思了很久。然后,使用非常少的数据实现了一个推荐小功能。可是老板再也没有问过我的这个任务。现在想想,当时可用数据实在是太少了,条目的分类也不完善,而且自己的数学理论功底又不深,实现一个推荐系统简直是天方夜谭。

        在接下来,老板邀请了一个美国的教授过来讲座。这个教授和我们老板应该早就认识。这个教授讲得内容大概就是她带领自己的学生,使用Hadoop这种MapReduce分布式计算框架进行one-pass analytics,这里翻译成一趟分析不知道合不合适。我觉得这里的一趟就是对数据只扫描一遍的意思。然后他们提出了一种对Hadoop进行效率分析的模型,通过该模型找到Hadoop的薄弱点,并进行优化,优化后的Hadoop性能有明显的提升。因而他们发的paper在一个什么会议上是top 4.

       我的老板看到人家取得这么好的成果,心里很羡慕。于是就开始让我也研究MapReduce,学习如何进行海量数据分析。我又一次沸腾了,事后证明我又想多了。我兴致勃勃地读了google的MapReduce论文,还买了Hadoop权威指南准备看。我还在自己的电脑上搭建了一个Hadoop平台,运行了简单的单词统计运算,当然底层的HDFS是不可少的。其间,老板又让我调研了一下一些提供云服务的商家,比如Amazon的弹性云,还有国内的万网等,最后又不了了之。

        接下来是什么原因我记不清了。老板又开始让我研究NoSQL。可能是因为她觉得我们的项目将来数据量非常巨大,使用普通的关系型数据库肯定存不下。我觉得我们老板想多了。于是我又兴致勃勃地研究了NoSQL,包括MongoDB, CouchDB, Casandra, Voldemort, HBase等等。当然也做了展示。但是Amazon的那篇关于NoSQL的鼻祖的论文,我至今来没时间看。

        除了完成老板交给的任务,上学期的课程也完成了一些项目。比如多媒体课实现了一个jpg图片显示的程序;人工智能课实现了主题爬虫、词性标注、对一幅图片根据其像素点的颜色值进行聚类,实现的时候使用了MatLab,这是我第一次使用MatLab;信息检索课实现了一个使用微软的N-gram服务的分词程序,当然效果并不是很好;机器学习课实现了一些分类算法,其间接触了一个叫做jama的Java类库,感觉这个类库对矩阵运算处理得很好。

        以上差不多就是我第一学期接触到的东西,以及实现的一些东西。

        接下来,就是这学期的事情了。

        这学期很大的时间是负责实现我们这个项目的Web端的开发工作。从前台的HTML,CSS,JavaScript到后台的Struts,iBatis,数据库的设计都有涉及。总之接触的太多了,但是没有一个是精通的。

          我首先负责实现了一个审核系统,这个审核系统只是针对单个审核人员,没有调度功能。这个系统的实现和我们原来的项目分开,也就是我单独建立了一个项目,这个项目我并没有使用我们项目使用的struts和ibatis,我换了更高版本的,struts2和mybatis。当然一开始我要读这些工具的文档,边学习边开发。通过使用这两个工具,我感觉我们项目原来采用的struts和ibatis有些过时了,这两个工具功能逻辑更加清晰,使用更方便。

           我的界面做得很好,老板决定让我负责修改我们项目的界面,因为原来的界面太丑了。可是,我又不是专业的美工人员,让我美化界面真是浪费我宝贵的青春啊。老板找了一些比较不错的界面,让我模仿。可是当我就快要修改完的时候,老板又发现了一个twitter开发的CSS模版工具叫做bootstrap,我就把我花了很大功夫修改的界面全部扔掉,使用bootstrap重新修改。bootstrap在刚开始用的时候确实感觉不错,它不仅提供了样式的模版,还提供了一些动态内容的模版,比如Modals、Dropdowns、Scrollspy、Togglable tabs、Carousel等等,但是当你用了一段时间之后就会有一种审美疲劳,而且前端的界面设计要受到这种模版提供组件的限制,更糟糕的是,我觉得它的默认风格并不适合我们的项目。当然,你可以设计自己的风格,但是我不是美工人员,我不可能设计出符合我们项目的具有一致风格的模版。

        开发完的项目需要部署到服务器上,服务器配置和维护的任务就落在了我的身上。其间我学习了apache的配置,在一台服务器上配置多个tomcat实例,还有使用mod_jk模块实现apache和tomcat的通信,也就是通过配置使到达apache的请求转移到后端的tomcat.我又重新设计了架构,让部署更加方便快捷。我也学会了在服务器端配置ssh服务器,使得远程也可以登录服务器。最近,我发现,我配置的多实例tomcat似乎有问题,并没有实现我们预期的日志分离的目的,看来还要研究一下怎么改进。或者彻底放弃现在的方案。

        在开发期间,老板让我研究了一下Augmented Reality这项新技术。我主要研究了两个项目,一个是前面提到的lightrod,还有就是layar,当然由于lighrod已经废弃,我将主要经历放在了研究layar上,我详细阅读了layar的文档,大致明白了layar的架构。基本思想就是开发者要自己建立一个数据库,这个数据库里存放了一些虚拟元素,比如按钮,输入框,图片等等,还要存放这些虚拟元素的动作对象,这些动作对象的属性就是一些动作,比如放大,旋转,移动等等,具体参数可以根据文档进行设置。当然开发者还要提供现实场景的图片(这些现实场景图片就是我们用手机或者相机拍摄的身边的实物或环境图片)并上传到layar的服务器。开发者需要将现实场景图片与相应的虚拟元素进行绑定。当安装有layar客户端软件的手机使用摄像头扫描到相应的实景区域时,layar服务器会进行快速地匹配计算,当匹配到开发者上传的实景图片时,就是显示绑定的虚拟元素,并触发这些虚拟元素的动作。当然快速匹配的核心功能在layar服务器上,开发者是无法获得的。还有就是根据动作属性来实现虚拟元素的动态效果也是layar实现的。所以可以看到layar拥有两项最核心的技术。其他的开发者只能当它的奴隶。o(∩_∩)o...,说的有点离谱了。虽然研究了这种增强现实技术,但由于核心功能我们无法获得,而且也不能将其与我们的系统很好的嫁接,所以最终还是放弃了这种技术。

       再接下来,我有负责修改我先前的审核系统。这次要能支持任务调度功能,支持多个审核人员同时审核。所以这个系统的核心功能是要实现一个调度策略,很好的为审核人员分配审核任务。任务队列我不知道怎么放在内存里,所以我在数据库里建了几个表,模拟队列。还使用了quartz scheduler这种任务调度器,来完成一些定时任务的调用。最后完成了,但是如何测试,就不清楚了。还有就是总感觉我的实现有什么漏洞,我目前还没想到。

       最后,也就是现在我要完成的任务。我现在的任务是要实现一个日志分析系统,将分析的结果以图表的形式展现给目标人群,让他们可以根据直观的统计信息作出相应的决策。我目前的思路是使用Hadoop来处理日志,并计算出相应的统计量,然后将统计量放入MongoDB这种菲关系型数据库中。上层要实现一个查询器,负责将用户可以理解的查询参数转换成查询主键,然后获得相应的统计信息,返回给web端,web端使用图表工具和返回的数据生成图表。

      时间不早了,写得手有些酸了。以上大概就是我这一年所接触的技术和工具,完成的任务。总结一下,可以理清思路,找到明确的方向。有时间在再把内容详细扩充一下。