Archives for linux

linux-os

不要复杂化Vim

我是本科的时候接触Vim的,当时就沉迷其中无法自拔,想想也可以理解,一个20出头崇尚黑客文化的少年,无意间发现了可以整天在键盘上打字而手不用碰鼠标的方式,多酷啊,写东西的效率提高不说,关键是在别人面前装黑客可以装得更像。于是乎,花大量的时间先记住各种按键,然后花大量时间去网上找Vimrc模版,能集成多少就集成多少,最后花大量时间找各种插件,什么插件看上去牛逼就装。最后抱着“把Vim打造成IDE”的远大理想,在网上到处搜寻相关文章,还到处找人争论吵架,总之最后不把Vim搞成编辑器中的高富帅,高大全,心里总是不甘心的。 当然不是所有的Vimer都是和我当时一样幼稚的,但从我的观察看,类似的Vimer还是不少的。我可以理解为什么这部分Vimer会经历这个过程,但可惜的是,很多人用了很多年,还处在这个阶段,在我看来,那就是陷入了Vim的使用误区了。我在这里谈谈为什么我有这种论断,也希望能帮助年轻或者刚入门的Vimers赶紧跳出这个误区,把时间用在更有意义的地方。

一个新的开源项目Libsvm-androidjni

我创建了一个关于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下载。

Hackborn的吐槽和Munn的剖析: Android graphics低性能背后的真像

Google+上有意思的讨论从未间断,几乎已是Google+的标志性特色了。最近两天,移动领域的爱好者都被Dianne Hackborn的一则吐槽所吸引。吐槽要火,两大因素不可缺少,一是该话题乃众人关注,却无统一意见。二是吐槽中有大料或者干货爆出,引人入胜。此番吐槽吸引人的地方,正是因为此吐槽是关于饱受争议的Android graphics性能的,自从Android推出的第一天起,graphics的渲染,动画切换等就为人诟病,到后来几乎成了果粉安粉大战的必备话题。而吐槽之人呢?是Android团队中比较senior的架构工程师Dianne Hackborn,相信关注Android开发的朋友,都不会对此女陌生。 为什么Dianne Hackborn身为Android内部人士,会突然公开讨论如此敏感的一个话题呢?用她自己的话说,就是“受够了外界谣传的关于Android图形渲染的不实信息”。我把她吐槽的大概重点归纳如下:

谈谈Android 4.0

昨天刚拿到Galaxy Nexus,把玩了差不多一天了。这篇文章并不想花大篇幅介绍这款机器的硬件和软件,如果你好奇,可以看一下下面这些知名网站的评测,再详细不过了 Engadget The Verge: 8.6/10(和iPhone4s同分) SlashGear Boy Genius Report TechRadar PhoneArena: 9.5/10 GigaOM:一个iPhone用户的评测 Gizmodo GigaOM 如果真要总结,那只有一句话,这是Android有史以来第一款能和苹果手机并肩的机器。这篇文章里,我就谈谈,在我眼里,Android的后续发展,和ICS的意义,当然都是结合了我在Google4个月的所见所闻以及感想。很多朋友希望看到我有一篇专门的实习总结,我想了想还是算了,首先我实习做的东西比较保密,没法说,其次也没什么写的,Google工作环境好,条件好,牛人多,大家都知道,没必要再吹一次。

如何对Android的本地代码进行profiling

现在用Android native code写程序库的人越来越多。对于那些需要写的库实时性要求特别强的应用,通过profiling来进行优化是一个非常有用的特性,因为它能帮你理解程序编译后的本质,比如多少instruction,哪些method调用多少次,多长时间,等等。 Android开发环境提供了Traceview这样一个工具,可以点到这个链接里面去看官方对他的介绍。总的来说,就是它提供给程序开发者目标程序的执行日志,以此帮助你调试程序和优化性能。有两种方法能够声称traceview所需的log,一种是利用DDMS的profiling特性,通过控制什么时候开始和结束logging来获得log。这个方法在你没有程序源代码的时候有用,因为只需要Run程序就能获得log信息,但是没有精准的起始中止控制。另一种是通过将Android自带的Debug类加到code中,然后调用里面的method来开始和中止trace信息的纪录。这个方法能让开发者非常精准地控制什么时候开始纪录,什么时候结束纪录,因为开始和技术都是在code中执行的。

给vim添加自动代码长度检测逻辑

每一种编程语言都有自己的代码规范,这里面少不了的就有代码长度。比如一般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 会和第一个方法产生的效果差不多。 介绍给有这种需求的朋友使用。

Android上Tcpdump的使用

前几天在看如何在Android上实时抓到ap的beacon的RSSI信息,而不是通过调用wifiscan的方式,所以研究了一下tcpdump在Android上的使用。可惜最后发现不可用,不过在这里,还是把过程记录下来,拱别人参考。说明一下,这个方法只适用于破解了的ROM。 要使用tcpdump,首先当然是下载可在Android上运行的二进制执行文件,下载地址包括这里和这里。你要是蛋疼想自己交叉编译一个呢,那就参考这个文章吧。 之后的事情就简单了 adb push ./tcpdump-arm ./any-place-you-want chmod 777 tcpdump-arm

Xcode与vim的集成

因为实在太习惯vim的编辑方式了,虽然xcode有强大的自动提示,有些时候还是不自觉想切换到vim,比如要全局替换一个词的时候,总觉得%s要方便得多。xcode有一个很爽的特性,就是从file panel中单击文件名时,就直接在xcode中显示,此时你可以直接在xcode中编辑。它也提供可选的选项,供你指定双击文件名时候调用的编辑器名字。设置很简单,就是去xcode的preference里面,找到’File Types’,进入file->text->sourcecode,调出弹出菜单,然后选择’External Editor’,并选中MacVim即可。 当然,你也可以直接从CLI中用vim打开相关的source files,不过存在一个小问题,就是在cocoa环境中,源代码文件是.m结尾的,不巧的是,Matlab的代码文件也是以.m结尾的。所以在vimrc文件中要做一下这个调整:

Samsung Galaxy S上手感受

先说一下配置 4 inch capacitive Super AMOLED Display 1GHz Hummingbird processor 1500mAh lithium ion battery 5MP camera with 720p video recording 2GB microSD card preloaded 在最新一代Android手机中做出选择时,由于EVO和DroidX都缺少移动计算研究中一个杀手级的部件:陀螺仪,所以,硬件配置不相上下的Sumsang Galaxy S就成了我的唯一选择。我是从Tmobile买的Sumsang Vibrant,实际上和原版Galaxy S是一模一样的,区别就是多了一坨我用不着的程序。 直入主题吧,先来一张包装照

Gingerbread,向左走还是向右走?

今天网上广为流传的消息,是来自TechCrunch的,Android团队正在努力解决用户体验的问题。伴随而来的,是Google正在考虑停止厂商自定义UI的权利,包括Sense UI、Moto Blur、Ninja Blur等等,原因是Google认为这些界面实际上是拖慢了系统速度,却没有带来什么实质性好处,还给升级平添一道障碍。如果消息属实的话,Android还说Gingerbread的用户体验能接近iPhone。 刚读到这个消息时,我的第一感觉是,这是一个代表Android发展分叉口的版本,成败,可能就在此一役,而且,一旦消息属实,Android是在进行一个大的赌博。

Android并不伟大,但丝毫不令人沮丧

自从Google IO大会之后,Android单挑iPhone OS的新闻甚嚣尘上。人们开始真正对这场所谓的战争感兴趣,并不厌其烦一次又一次地去将所有的细节放在放大镜下分析。昨天在twitter上看到朋友分享的cnbeta的一篇文章—为什么说Android令人沮丧,看完之后的感想就是,很多观点实在无法认同,并且,文章中充满了自己的想象,然后把自己的想象以事实的口吻说出。举两个例子。该文说 Google控制社区的核心手法就是频繁升级Android的同时少量修改API,造成兼容性问题。 我不明白没有API的升级的话,一个新系统如何保证竞争力。Android目前的发展阶段决定了每一次major update都必然伴随API的改动,原作者却想当然认为这是Google控制社区的核心手法,是Google为了“故意造成兼容性”的手段。我们国家的人民现在对什么事情估计都能联想到“阴谋论”了。 当年Windows Mobile就是死在三方ROM之上,Android不过是在重复Windows Mobile的老路。 我不知道作者有什么证据说当年Windows Mobile就是死在三方ROM之上的,难道他统计过Windows Mobile用户自己刷ROM的比例?实际上,这个衰落的原因主要在于下面几点 Windows Mobile可靠性差,可用性差,反应奇慢,用户体验差得发指。 Windows Mobile的一些常用软件很难让人满意,比如以前的IE。 Windows Mobile的创新太少太慢。这个是关键点。Windows Mobile早期手机很贵,面向的是比较小众的高端市场,又没有好的系统表现,不过由于MS的影响力和推广,总算还是有不错的份额。iPhone和Android崛起的时候,微软没有想过问题的严峻性,继续不紧不慢躺在老版本上做小改动,而且release一个几乎没啥创新的新版本都要按年来计。随着iPhone和Android就像赛跑一样发布一个个重量级的新版本系统时,微软开始着手这些问题的改进了,可惜的是,iPhone和Android已经吸引走了大批开发者,而且从系统本身性能和特性来讲,Windows Mobile再也不占任何优势。 所以,Windows Mobile之衰败,主要是自己系统的原因,归咎于第三方ROM实在不公平。事实上,除了Geek和有不浅的电脑知识的人,大部分普通用户在购买手机之后都不会去刷ROM。 回到正题。这里,我展开谈谈,为什么Android不仅不令人沮丧,反而可以算是表现优异。

Ubuntu 10.04

回国之后搞到一台Compaq510玩,在上面安装了Ubuntu 10.04。我上一个使用的ubuntu版本是9.04,通过简单对比,我对10.04的感受是 bug还是不少,进步相当不小,Ubuntu在继续大步跑 这是我第一次用非thinkpad的机器装ubuntu,所有硬件都没有问题,驱动不用任何修改,skype一次性成功。唯一的问题是自己编译安装vim7.2有点问题,懒得折腾,也就直接在源里面安装了vim-gnome,一看还是huge特性,贼喜。

目前最好的Android2.1 ROM之一 for Hero

http://forum.xda-developers.com/showthread.php?t=622468 推荐一下,这个ROM我用了一段时间了,没啥大问题才写这个post推荐。Sense UI,2.1ROM,基本功能都有,用着很流畅,一点都不慢。缺点在上面连接中也有讨论,基本都是我用不上的功能,所以不care。 要刷机的朋友最好把radio镜像升级到6.35.09.26。做好备份。步骤其参考我之前的文章。 BTW: 如果这个网址国内被wall了,或者下载的网址被wall了,留言说一声,我可以把这个ROM上传到我的空间。

彩色的Android debugging logcat term

Andorid的logcat通常都会输出无数多的信息,至少对于我来说,经常把眼睛看花。Jeff Sharkey针对此写了一个python脚本,专门负责整理logcat的输出流并给不同的tag信息加上对应的颜色。如图 怎么用呢?很简单,或者直接执行 $ ~/coloredlogcat.py 或者用管道 $ adb logcat | ~/coloredlogcat.py 这个脚本需要你的terminal是 ANSI-compatible的。脚本在此下载: 下载1 下载2 下载完后自己改后缀

Android 2.0上使用蓝牙通信的代码片断

服务器端: UUID uuid = uuid.fromString(“27648B4D-D854-5674-FA60E4F535E44AF7″); //generate your own UUID at http://www.uuidgenerator.com BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); BluetoothServerSocket serverSocket = adapter.listenUsingRfcommWithServiceRecord(“MyBluetoothApp”, uuid); BluetoothSocket socket = serverSocket.accept(); // blocks until a connection is accepted serverSocket.close(); // close the listening socket – does not close the connected client socket