发布于 2011-12-21, 504次阅读
我创建了一个关于libsvm库+Android的开源项目 Libsvm-androidjni.
这个项目的目的是让当今最流行的SVM支持向量机机器学习库Libsvm被移植到Android平台中。当然官方提供了Java库,但用Java来进行大规模的SVM计算还是太低效了,所以这个项目是要把c/c++版本的库移植到JNI环境下。
目前的code状态是svm的training和prediction功能皆可正常运行。具体的使用方式请参考README。虽然是c++环境,但主体code还是c的风格,这和我个人喜好有关,不影响使用。
目前还有一些高级功能不完善,比如完整的参数传递和误差计算。
项目代码请到https://github.com/cnbuff410/Libsvm-androidjni下载。
发布于 2011-12-15, 304次阅读
我曾经写过的一篇博客是在blog中用LaTex输入数学公式。里面提到过“在线生成的方法”,并推荐了几个网站。今天在Chrome应用商店里发现了一个应用叫Daum Equation Editor,非常非常好用,界面漂亮,选项众多,支持字体特效和大小的调整,输出图片或者latex文字。基本上秒杀我那篇文章里推荐的那些软件。所以在这里再推荐一下:)
发布于 2011-12-06, 888次阅读
Google+上有意思的讨论从未间断,几乎已是Google+的标志性特色了。最近两天,移动领域的爱好者都被Dianne Hackborn的一则吐槽所吸引。吐槽要火,两大因素不可缺少,一是该话题乃众人关注,却无统一意见。二是吐槽中有大料或者干货爆出,引人入胜。此番吐槽吸引人的地方,正是因为此吐槽是关于饱受争议的Android graphics性能的,自从Android推出的第一天起,graphics的渲染,动画切换等就为人诟病,到后来几乎成了果粉安粉大战的必备话题。而吐槽之人呢?是Android团队中比较senior的架构工程师Dianne Hackborn,相信关注Android开发的朋友,都不会对此女陌生。
为什么Dianne Hackborn身为Android内部人士,会突然公开讨论如此敏感的一个话题呢?用她自己的话说,就是“受够了外界谣传的关于Android图形渲染的不实信息”。我把她吐槽的大概重点归纳如下:
延伸阅读 »
发布于 2011-12-04, 1,539次阅读
昨天刚拿到Galaxy Nexus,把玩了差不多一天了。这篇文章并不想花大篇幅介绍这款机器的硬件和软件,如果你好奇,可以看一下下面这些知名网站的评测,再详细不过了
如果真要总结,那只有一句话,这是Android有史以来第一款能和苹果手机并肩的机器。这篇文章里,我就谈谈,在我眼里,Android的后续发展,和ICS的意义,当然都是结合了我在Google4个月的所见所闻以及感想。很多朋友希望看到我有一篇专门的实习总结,我想了想还是算了,首先我实习做的东西比较保密,没法说,其次也没什么写的,Google工作环境好,条件好,牛人多,大家都知道,没必要再吹一次。
延伸阅读 »
发布于 2011-11-17, 968次阅读
现在用Android native code写程序库的人越来越多。对于那些需要写的库实时性要求特别强的应用,通过profiling来进行优化是一个非常有用的特性,因为它能帮你理解程序编译后的本质,比如多少instruction,哪些method调用多少次,多长时间,等等。
Android开发环境提供了Traceview这样一个工具,可以点到这个链接里面去看官方对他的介绍。总的来说,就是它提供给程序开发者目标程序的执行日志,以此帮助你调试程序和优化性能。有两种方法能够声称traceview所需的log,一种是利用DDMS的profiling特性,通过控制什么时候开始和结束logging来获得log。这个方法在你没有程序源代码的时候有用,因为只需要Run程序就能获得log信息,但是没有精准的起始中止控制。另一种是通过将Android自带的Debug类加到code中,然后调用里面的method来开始和中止trace信息的纪录。这个方法能让开发者非常精准地控制什么时候开始纪录,什么时候结束纪录,因为开始和技术都是在code中执行的。
延伸阅读 »
发布于 2011-09-18, 1,588次阅读
每一种编程语言都有自己的代码规范,这里面少不了的就有代码长度。比如一般c或者python就是80,而java就是100。很多朋友都喜欢在vim下写代码,也就习惯了设置不同长度的wrap来处理这个问题。但wrap有时候会很不方便。这里介绍两个另类但是也很常用的方法。
一种是在vim里面自动在80/100的地方画一条红色竖线,提醒你,一旦你越线,就超过代码长度了。这个命令是(以80为例子)
au BufRead,BufNewFile *.c,*.cpp,*.py match Error /\%80v.\%81v./
另一种是不画醒目的竖线,但一旦你的type的code到了一定位置,就用下划线标示出来。我个人更prefer这种:
au BufRead,BufNewFile *.c,*.cpp,*.py 2match Underlined /.\%81v/
另外,根据读者朋友的留言,vim7.3内置了该功能,比如
:set colorcolumn=81
会和第一个方法产生的效果差不多。
介绍给有这种需求的朋友使用。
发布于 2011-08-21, 1,915次阅读
本文提供排版更佳的PDF版本下载。
JNI,全称Java Native Interface,是用于让运行在JVM中的Java代码和运行在JVM外的Native代码(主要是C或者C++)沟通的桥梁。代码编写者即可以使用JNI从Java的程序中调用Native代码,又可以从Native程序中调用Java代码。这样,编程人员可以将低阶的代码逻辑包装到高阶的程序框架中,获得高性能高效率的同时保证了代码框架的高抽象性。
在Android中,仅有以下类库是允许在JNI中使用的:
- libc (C library) headers
- libm (math library) headers
- JNI interface headers
- libz (Zlib compression) headers
- liblog (Android logging) header
- OpenGL ES 1.1 (3D graphics library) headers (since 1.6)
- A Minimal set of headers for C++ support
JNI本身仅仅是一个把两者融合的工具,作为编程者需要做的,就是在Java代码和Native代码中按照固定的格式告诉JNI如何调用对方。在Android中,有两种方式可以调用JNI,一种是Google release的专门针对Android Native开发的工具包,叫做NDK。去Android网站上下载该工具包后,就可以通过阅读里面的文档来setup一个新的包含Native代码的工程,创建自己的Android.mk文件,编译等等;另一种是完整的源码编译环境 ,也就是通过git从官方网站获取完全的Android源代码平台。这个平台中提供有基于make的编译系统。更多细节请参考这里。不管选择以上两种方法的哪一个,都必须编写自己的Android.mk文件,有关该文件的编写请参考相关文档。
下面通过一个简单的使用例子来讲解JNI。Android给C和C++提供的是两套不同的Native API,本文仅以C++举例说明。假设这么一个需求,Java代码需要打印一个字符串,而该字符串需要Native代码计算生成。对应的JNI流程是这样的:
延伸阅读 »
发布于 2011-05-01, 3,461次阅读
前两天在Facebook上碰到一位同学,同名同姓,同毕业于西电,同在美国读书,同去Google实习。
这世上还真有这么巧的事。
发布于 2011-04-10, 5,538次阅读
这次拿到Google总部的实习offer挺不容易的,也挺幸运的。每年都有很多中国学生申请他家的实习,不管是总部还是分部,我估摸着我可以把这段经历写出来,算是一个回忆,也给后面的学弟学妹一个参考。
首先想对以后希望去的朋友说的是,因为Google实习应该是计算机行业最顶级的实习待遇了,所以外面很多人传美国名校的学校找有优势。我想说,这不是让你退缩的理由。我看了一下今年实习的名单,确实MSBHCP这几个学校很有优势,学生很多,但后面的不错的学校也都不少人,比如Gatech, Purdue, UC其他系列等等。我们学校CS也就30出头的排名,除我以外还去了一个本科生一个研究生。所以你有想法,就去试,大家都要经历技术面和项目面,有实力就可能进,用实力说话。
第二个需要提到的,就是找实习,要趁早。Google今年有几百个实习坑,基本上80%已经在三月之前就定了,我就因为这个吃了亏,差点没等到match的host。所以如果下次再申请他家,一定要上一年12月左右就开始准备。
下面讲讲具体的经历吧。
延伸阅读 »
发布于 2011-03-21, 2,739次阅读
记得去年和音乐男朱强聊天,说起他回国了一个月
问:过得如和?
答曰:甚爽。
问:为何?
答曰:天天都有喜剧片看。
问:笑话何来?
答曰:新闻联播。此乃GRE考生练习argument写作的最佳素材。
为啥直至今日还能记得此对话?近日听闻国内新闻报道,卡扎菲甚为节俭,利比亚人民为了保护卡扎菲和西方国家抗争,卡扎菲作为民族英雄死死抗争。皆出自CCTV。遂有此感叹。
发布于 2011-02-18, 5,542次阅读
这是《小波变换和motion信号处理》系列的第二篇,深入小波。第一篇我进行了基础知识的铺垫,第三篇主要讲解应用。
在上一篇中讲到,每个小波变换都会有一个mother wavelet,我们称之为母小波,同时还有一个father wavelet,就是scaling function。而该小波的basis函数其实就是对这个母小波和父小波缩放和平移形成的。缩放倍数都是2的级数,平移的大小和当前其缩放的程度有关。
还讲到,小波系统有很多种,不同的母小波,衍生的小波基就完全不同。小波展开的近似形式是这样:

其中的
就是小波级数,这些级数的组合就形成了小波变换中的基basis。和傅立叶级数有一点不同的是,小波级数通常是orthonormal basis,也就是说,它们不仅两两正交,还归一化了。
我们还讲了一般小波变换的三个特点,就是小波级数是二维的,能定位时域和频域,计算很快。但我们并没有深入讲解,比如,如何理解这个二维?它是如何同时定位频域和时域的?
在这一篇文章里,我们就来讨论一下这些特性背后的原理。
延伸阅读 »
发布于 2011-02-15, 5,101次阅读
这是《小波变换和motion信号处理》系列的第一篇,基础普及。第二篇我准备写深入小波的东西,第三篇讲解应用。
记得我还在大四的时候,在申请出国和保研中犹豫了好一阵,骨子里的保守最后让我选择了先保研。当然后来也退学了,不过这是后话。当时保研就要找老板,实验室,自己运气还不错,进了一个在本校很牛逼的实验室干活路。我们实验室主要是搞图像的,实力在全国也是很强的,进去后和师兄师姐聊,大家都在搞什么小波变换,H264之类的。当时的我心思都不在这方面,尽搞什么操作系统移植,ARM+FPGA这些东西了。对小波变换的认识也就停留在神秘的“图像视频压缩算法之王”上面。
后来我才发现,在别的很广泛的领域中,小波也逐渐开始流行。比如话说很早以前,我们接触的信号频域处理基本都是傅立叶和拉普拉斯的天下。但这些年,小波在信号分析中的逐渐兴盛和普及。这让人不得不感到好奇,是什么特性让它在图象压缩,信号处理这些关键应用中更得到信赖呢?说实话,我还在国内的时候,就开始好奇这个问题了,于是放狗搜,放毒搜,找遍了中文讲小波变换的科普文章,发现没几个讲得清楚的,当时好奇心没那么重,也不是搞这个研究的,懒得找英文大部头论文了,于是作罢。后来来了这边,有些项目要用信号处理,不得已接触到一些小波变换的东西,才开始硬着头皮看。看了一些材料,听了一些课,才发现,还是那个老生常谈的论调:国外的技术资料和国内真TNND不是一个档次的。同样的事情,别人说得很清楚,连我这种并不聪明的人也看得懂; 国内的材料则绕来绕去讲得一塌糊涂,除了少数天才没几个人能在短时间掌握的。
牢骚就不继续发挥了。在这个系列文章里,我希望能简单介绍一下小波变换,它和傅立叶变换的比较,以及它在移动平台做motion detection的应用。如果不做特殊说明,均以离散小波为例子。考虑到我以前看中文资料的痛苦程度,我会尽量用简单,但是直观的方式去介绍。有些必要的公式是不能少的,但我尽量少用公式,多用图。另外,我不是一个好的翻译者,所以对于某些实在翻译不清楚的术语,我就会直接用英语。我并不claim我会把整个小波变换讲清楚,这是不可能的事,我只能尽力去围绕要点展开,比如小波变换相对傅立叶变换的好处,这些好处的原因是什么,小波变换的几个根本性质是什么,背后的推导是什么。我希望达到的目的就是一个小波变换的初学者在看完这个系列之后,就能用matlab或者别的工具对信号做小波变换的基本分析并且知道这个分析大概是怎么回事。
最后说明,我不是研究信号处理的专业人士,所以文中必有疏漏或者错误,如发现还请不吝赐教。
延伸阅读 »
发布于 2011-01-25, 3,539次阅读
某次在写compiler作业的时候,需要验证自己生成的汇编代码兼容多平台。结果发现在Linux下没问题,在Mac OS X下会出现
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: 13 at address: 0×00000000
的错误。查阅Mac OS X ABI Function Call Guide,发现在Mac基于Intel x86的平台上,function call的地址必须是16字节对齐的。解决方法是在gcc命令中加入flag: -mstackrealign。
这里是这个flag对应的解释:
延伸阅读 »
发布于 2011-01-20, 3,562次阅读
这两年,Android的浪潮是一波接着一波,导致的现象就是每隔三五天就有新的手机出来。HTC,MOTO,三星,LG,你不一个月推一款,出门都不好意思和别人打招呼。各个评测网站也就甩开膀子搞评测,出来一款跑一款分,简直有点病态的趋势。各种各样的评测软件也层出不穷,基于Pi的,基于Linpack的,等等等等。对于消费者来说,这可就难办了,乱花渐欲迷人眼,这么多款,选谁好呢?今天看这里用x软件评测说a>b>c>d,明天就在那里看用y标准评测说a<b<c<d。该信谁呢。
如果想要从这些林林总总的测试中跳出来,搞清楚到底它们测试的是什么性能,就要理解这些测试到底都干了些什么,这些分数背后的本质是什么。实际上,不管是电脑也好,手机也好,这些跑分测试,本质上都是选择某一种workload,然后让机器去执行,然后通过某些执行后得到的结果,比如耗费的时间,总共执行的指令等,转换成分数。所以,workload是所有测试的本质决定者。
延伸阅读 »
发布于 2010-12-31, 5,618次阅读
估计关注我twitter的朋友都知道两件事
1 我最近去三藩旅游了
2 在和@lordhong和@YtwYtw聚会的路上,那个风雨交加的夜晚,我的iPhone4屏幕摔碎了
话说当初ip4到手后,我就采取坚决不戴套的原则,一直裸用此机,因一直注意,倒也没有任何问题。三藩之行大概是欣赏了不少美景,大大败坏了人品,万事不顺,结果在出车门买水的一瞬间,iPhone4掉在了冰冷的地上,前屏幕就这么碎了。当时也没啥想法,继续去日本料理店和hong大等人会餐。晚上开会酒店,总算有一丝郁闷:大爷的,才用了半年,不长不短。要说用一年以上吧,我就考虑换一台了,要说用了2-3个月吧,因为是用American Express卡买的,还可以用purchase protection选项免费换新。现在这时间段,换也舍不得,换新也换不了。平时在网上看别人屏幕摔坏当看笑话,这次轮到我身上了,报应阿
延伸阅读 »