成功进入机器人时代 :D

    经过在 eBay 上近半个月的坚苦搏杀,终于赶在十一前拿到了向往已久的 Lego Mindstorms NXT。与那些貌似有趣但本质上只会摇尾巴的所谓娱乐机器人不同,这次 Lego 发布的 NXT 绝对是一个划时代的产品。内建 32bit ARM7 处理器,自带雷达接触传感器,最大三路步进电机输出,支持蓝牙/USB接口。最为关键的是,除了自带的图形化可视编程界面外,提供了较为完整的各种开发SDK,而 MS 更是推出了支持此平台的基于 C# 的开发环境 Microsoft Robotics studio。这意味着 NXT 已经脱离了一个玩具的范畴,第一次让机器人变得平民化,是迈向机器人时代的坚实的一步。回想当年 Intel 推出的 8086/8088 正是扮演了类似的角色,让 PC 真正成为平民化的工具,相信机器人时代的到来也不再是科幻小说中的情节。
    说了半天废话,让我们先来看看 NXT 的第一印象,好大一个包装盒,呵呵

 

    完整版本的 NXT 在 Lego 自己网站上标价 $250,但实际上通过 eBay 等方式 $200-$210 就能拿下,不过比较郁闷的是从米国邮寄回来大概需要 $50-$60,如果有朋友能从国外或香港带是最合适不过了。

    拆开大盒子,其实里面东西不算太多。最多的是大把大把的 Lego 塑料积木,这是组成各种不同机器人造型的基础原料,种类我可以负责任的说是相当的多,光十字形连接杆就有9种不同长度,各种转接头的种类更是繁多,搞得我大部分时间用在寻找合适的元件上,回头得去买个厨房用的佐料盒分门别类 :P

    除此之外在几个小盒子里面装的是 NXT 的核心部件,缺省自带一个主机兼控制器、四种传感器、三个步进电机以及一对乱七八糟的连接线啥的。具体的功效回头等我弄明白了再单独解说。:P

    再来一张核心部件的分解图,呵呵

    主机上提供是个传感器输入接口(1,2,3,4),三个步进电机输出接口(A, B, C),一个 USB 接口用于从 PC 上下载程序,一个小 LCD 黑白屏用于基本控制和状态显示,此外还内建蓝牙接口用于与外部通讯。能源部分使用六节 5 号电池,没有发现外接电源的接口。可以说整个系统设计的非常简介,在满足基本功能的前提下一点多余都没有,回头有时间将之拆开再仔细分析一把 :D  

 
    作为老牌的玩具厂商,LEGO 的可视化编程环境做的非常简单易用。从左边工具条中将各种常见操作(如A口步进电机正向转3圈,或者声音传感器收到一定大小的声音)拖动到中央工作区,然后用逻辑条件进行组合,最后点击一个 Download 按钮就会自动编译并下载到 NXT 的 Flash 上。此外右边还通过 Flash 方式提供了非常详细的 Step by Step 快速入门,可以根据上面的说明快速熟悉各种部件和环境的使用方法。

     这是我根据 Quick Start 拼装出来的 TriBot 机器人,呵呵。它首先会用雷达探测面前是否有目标(一个蓝色小球);如果有的话就冲过去,直到碰撞传感器告诉它已经到跟前;接着它会等你的暗号,击掌一声后,用两个大钳子夹起球;掉转180度最大速度跑开(没人追你啊);碰到地上有条黑线后放下球。
    呵呵,功能是弱了点,不过好歹是偶的 NXT 第一次露面,来两张特写先 :D

 
发表在 机器人 | 17条评论

泸沽湖 —— 亚丁 D -1

  在我去过的诸多古城或号称古城的地方之中,丽江的大研古城是保护的相对完好的。但这种完好也仅仅体现在建筑风格上,真正的文化的核心————人,实际上也只是保持着商业上的完美。因此除了第一次去丽江时还饶有兴趣的逛逛街市,后面再去时基本上都刻意避开人群,免得看那些已经扮成当地人的外地人,和另外一些想扮成当地人的外地人,在这个纳西主题公园里面,贩卖着廉价的所谓文化。
  不过在这熙熙攘攘的闹市之中,也是有不少闹中取静的好去处。例如下午四五点时,爬到狮子山万古楼下找个木椅、亦或躲到黄山公园的凉棚中,砌上一壶清茶、摊开一本好书、换上一副好心情,在从云中洒下的缕缕昔阳中,体会那种宁静而志远的心境。如果时节好的时候,恰好还能碰到低而厚重的雨云,从远处的山边慢慢笼罩过半壁古城,一面是明媚的阳光,一面是茫茫的细雨,不一会儿就云淡风清又一捧彩虹横挂枝头,就如许巍在歌中唱到的一样:
  
  …
  好像梦里醒来
  见到清新的世界
  此刻寂静的心
  自在又安祥
  我心深处的孤独渴望
  我曾莫名的无尽等待
  就这样消逝风里风里
  就这样消逝风里
  无踪影
  …
  
  待天稍稍有些黑了,可以快步穿过四方街上目光呆滞的人群,去七一街抢上一碗川西的肥肠粉。如果食欲好,则会多走几步到木府边上的阿哩哩,尝尝阿呆自酿的青梅酒和姥姥的臭豆腐烧牛肉,这是丽江古城里面为数不多可以算作美食的 :P
  说起阿哩哩的阿呆,这又是另一个故事了,有兴趣可以逛逛他的 blog (http://alili.tianyablog.com/)。
  
  如果还是不想回去,可以再爬回狮子山,在半山的青年旅馆,要上一杯云南本地的小粒咖啡,坐在长长的木廊边,凝视着山下的万家灯火。四方街上的熊熊火焰与欢闹人群,给夜幕笼罩下的古城凭增一份奢靡。而在此时,摇曳的灯火和喧嚣的歌声,在黑暗中被放大并扭曲,让距离和时间都慢慢变得不真实起来。
  
  不过这次我还是选择呆在客栈里面调整心态,以尽早从快节奏的都市生活切换到慢节奏的度假生活。
  
  睡到自然醒,洗个热水澡,然后靸着拖鞋,窝在院里的沙发中,看着那只刚刚几个月的小狗,步履蹒跚在院中乱窜。
  
  这家客栈有个小而精致的院落,可以看出以前的房东下过一番心思,虽然面积不大但各种植物错落有致,四季常青且花期相接。一面客房门前立着大片的大叶爬山虎,遮住烈日的同时不忘放入丝丝缕缕的光斑;对过是一棵挺拔的樱花树,不巧刚刚过了花期,只剩一些被雨打过的残花;四周则是一些叫不上名字的高矮植物,零零散散但并不杂乱的点缀在院中。青石和石子铺就的地面古朴而典雅,加上仿古的红漆大门和黄铜门环,真有点古意但并不显得做作。
  
  在院里发了会儿呆翻了会儿书,趁天气凉爽到菜市场去溜达了一圈。如果说有什么地方能够让你直接感受到生活真实,那应该就是菜市场或农贸市场了。四处看看,给朋友带了条当地土烟,本还想整个西瓜回去,掂了掂分量只好放弃 :S
  
  估计是因为老板怕吵,客栈里没有自动洗衣机,于是拿着盆子杀到白马龙潭寺门口洗衣服去 :S 跟一群大妈大婶一起,蹲在三眼井的末端,使尽十八般手艺慢慢折腾那几件衣物,全然不顾旁边参观的旅客诧异的目光。这三眼井历经百年的沧桑,蹲在井边的人换了一代又一代,真让我有点时光回朔的感觉 :)
  
  晚上本想请老板出去喝酒,结果反而被老板拉回家蹭饭,完了又是一人一杯清茶,有一搭没一搭的聊天。虽然有李江山这样一个豪气的汉语名字,但他实际上内心并不适应丽江的商业气氛,对我这种扛着大包的背包组也有着独特的偏爱。在丽江生活几年之后,实际上他的心还留在虎跳峡的群山之中。而与我一样无奈的是,也只能通过不断的抱怨,和偶尔的调剂来缓解,并无法去打破或改变什么。而我这样的背包客,在能唤起他对往日回忆的同时,共同的对大自然的热爱和对生活的感恩,也使得交流起来格外容易。也许这就是现代人的悲哀,在现实和理想之间无法自己把握方向。
发表在 旅游 | 1条评论

泸沽湖 —— 亚丁 D -2

  本来是不打算写游记的,一来自己比较懒而且号称比较忙,二来一直以为旅程是无法记述而只能体会的。但架不住诸多朋友的反复关心,只好把一些零散的感想记录一下,希望能让朋友们分享我的快乐 :)
D -2
  直到再一次踏出丽江机场的大门,在寂静星空照耀和凉爽的夜风吹拂下,呼吸着掺杂着沁人心脾的淡淡草香的气息,才真正意识到我又回到这个梦中的地方。虽然此时还不知我的大包被转运到哪架飞机上,也不知未来几天的旅程该如何安排,但现在想什么也没用,当务之急是找个小酒馆吃点新鲜的菜肴,加上一瓶冰镇的本地啤酒。:P
  
  也许这就是我喜欢走长线的原因之一,从一个未知到另一个未知。
  
  虽然从一个多月以前就开始准备这趟行程,但我并无意去把每一个细节都安排清楚。毕竟长线中有太多的不确定因素,明确方向然后坚定的前行是我唯一可控的。而在此过程中碰到的问题和解决问题的过程,往往才是旅程中最有趣的谈资。
  就好比今天的旅程:早上还在公司翘着二郎腿开周年庆典大会,中午就匆匆忙忙打车去机场去赶堵车实况,好容易提前5分钟赶到换了登机牌后发现飞机晚点,百无聊赖在候机厅看完所有杂志后,到了丽江机场只好再一路狂奔,可还是晚了半分种才注册完毕,托运行礼却因为还没取到,只能跟着后面的航班转运,还免费获赠一张机场对我行礼不负责任的免责声明。于是我只好在饿着坐了一天飞机后,孤零零一个人躺在候机厅沙发上,等着还不知道在哪儿的行礼 :S 用当时某人给我回的短信的话来说,就是每一个精彩的旅程都有一个糟糕的开始,哈哈,我定义他在夸奖我 :D
  
  也许是老天想多给我一个理由留在丽江,机场工作人员告诉我行礼要跟午夜最后一趟航班过来,于是我用最快的速度冲出机场,快步走向向往已久的最近的一个小酒馆,哈哈,一份火腿、一盆菜汤、一瓶啤酒、一碗米饭,完了再来上一壶龙井,开始有点找到度假的感觉了。 :P
  
  因为准备转长途车去泸沽湖,决定住客运站附近的白马龙潭客栈,打电话跟老板套了套交情并订了床位,领到行礼后跟几个成都来的朋友拼车回丽江,顺道帮客栈老板拉了一票生意,忽悠了一车人直接开了过去。
  说起这个客栈老板也是个很有趣的人,父母是在虎跳峡开著名的纳西雅阁客栈,女朋友是以前在虎跳峡客栈拣到的外地游客,然后家族业务拓展到丽江租了个小院落。沉默寡言但却很风趣,待人宽厚但疾恶如仇,没事就坐在院中沙发里跟游客聊天,时不时会掏出一些有趣的照片,或者告诉你一条新的线路,真有点象某某游戏里面客栈的提供游戏线索 NPC,哈哈。
  既然到客栈已经一点多了,估计明天也是走不了的,索性跟这哥们一人一杯茶聊上了。春节从虎跳回来去梅里之前,就是住在他这儿,所以先给他灌输了一番梅里的大好形势,然后又听他侃了一通黎明和老君山,看来我的 todo list 又要加长了。
  看看天色啥也没看出来,只好看看表已经不早了,于是约着明天找地方请他喝酒,然后洗洗睡一夜无梦。
发表在 旅游 | 1条评论

被遗忘的寂静村落

    年前受 arrow 委托,趁春节假期机会实地考察了xfocus正在筹建的小二地小学相关情况。
    从熙熙攘攘的丽江大研古城出发,半天的长途车又加上三个多小时颠簸的土路,才来到这个山腰上似乎被遗忘的寂静村落。

 
     这就是此行的目的地,云南省宁蒗县烂泥菁乡大二地行政村的小二地自然村,一个只有65户309人的小村落,大部分居民是彝族。
    因为此行的主要目的是考察教育方面的情况,下车第一件事就是寻找正在使用的校舍。但在当地老乡的带领下,看到的只能算一个校舍的基址了。

 
    因为原本校舍过于简陋,已经被拆掉。而二三十个学龄儿童只能挤在这样一间破旧的木屋里面,在一位外村派来的教师的指导下艰苦的学习。
 

    虽然来之前做好了充分的思想准备,但看到这样简陋的教学设置,心里还是感觉堵得慌。

    而那些孩子却似乎早就习以为常,活泼的在“校舍”上爬入爬出,仿佛要向我展示这就是他们的天地。

    在与当地村民和孩子的攀谈中,我了解到他们主要靠种田为生。但高寒的气候、贫瘠的土地和落后的耕种方法,导致仅能收获少许土豆、玉米和青稞作为口粮。一日三餐也只能以土豆作为食物,唯一的奢侈品是年节时宰杀的猪肉晒制的腊肉,和偶尔获取到的大米。没错,就是我们平时挑三拣四的大米,被他们作为一种奢侈品进行消费。

    “家徒四壁”这个我们从小学课本忆苦思甜文章中熟悉到的成语,是当地居民家里的真实写照。一个火炕、一口大锅,这就是一个普通居民家的客厅。

    外表看起来貌似光鲜的家庭,最大的经济来源就是门口这几只羊了。村民平均年收入,出去作为口粮的农作物,大概只有200人民币左右;每学期55人民币的学费,就已使的数个孩子因为经济原因辍学。而全村最高学历的,是一位刚刚搬来不就的高二在读学生。需要读完小甚至初中的学生,要跟不远处根本没有学校的大平子村同学一起,步行5公里山路到大二地村去住读。

    从丽江这样的花花世界,来到这个被遗忘的村落,再看着路边村民眼中呆滞的目光,巨大的反差给人一种非常压抑的感觉。

    但无论外界条件多么艰难,孩子们眼中的纯真是相同的,从那份企盼中你能感受到希望,获得希望去改变这一切的力量。

    虽然我们能做的可能很少,要改变这个状况可能很难,需要耗费的时间可能很长,但我们毕竟开始了,开始做我们力所能及的事情。哪怕这个过程再艰难,只要我们开始去做,坚持去做就一定会有成果。

    对我们这可能只是今年的一座校舍,但对这些孩子来说,这可能是一生一次的机会。那位可能初中肆业去打工的小男孩,那位可能高小肆业回家操持家务的小女孩,可能因为我们现在的协助,成为能够更加强有力把握自己命运的主人。

    我们所付出的,仅仅是一件喜欢的衣服,一个电脑配件,几顿腐败的晚餐,得到的则将是我们与他们共同的希望。

 

发表在 旅游 | 5条评论

又是一年佳节时

    听到窗外爆竹声声,才恍然发现又是一年佳节时。
    已不记得从哪年开始,对这种节日的热闹氛围日渐生分。在家人围坐在电视前看春晚时,我总是喜欢躲在房间里静静的听着歌,写着一些有用或没用的代码和文章。似乎在这种时候,那种孤寂中的空灵的感觉往往能让我状态奇佳。
    依稀记得高考前的那个除夕,在写一个 DOS 下的工具程序。几千行的汇编加上所知的各种 TSR 技巧,基本上是我在 DOS 下编码的顶峰,也让我第一次体会到那种落寞的感觉。
    大学毕业前那年的春节,似乎正在写那个又臭又长的《CLR 结构分析》系列。几十M的英文资料,前后几万字的文章和大几百K的代码,也是我现在所无法企及的。
    似乎只有在指尖不停的跳动时,在耗尽脑力的疲惫后,才能真实体验到自我的真实存在。
    而今年的春节,我选择了行走,不知在虎跳那秀美的山河中,又是何等的一番感受呢?
    又是一年佳节时……期待
发表在 爱好 | 4条评论

透视 Java

    自从全面进入网络购物时代之后,唯一能保留下来逛商店习惯的就是逛书店了。虽然不再象以前那样每次大包小包往回扛,但却很享受书店里那种氛围。虽然在一堆一堆的烂书中惹眼的还是那些熟悉面孔,但常常能在不经意中发现几个漏网之鱼。
    例如前几个月曾在书架角落里面翻出《精通 AspectJ》、《事务性 COM+ 编程》、《应用框架的设计与实现》等几本计划外的好书 :D 加上今天的意外收获《透视 Java》,都是些潜在读者群较小,内容覆盖面不大但较为深入的书,通俗的话说就是识货的人可能不多,呵呵。不过相对于那些有书店和出版社背景的热抄书籍,这些相对冷门的书往往更能脚踏实地一些。
    例如这本清华出的《透视 Java ——反编译、修补和逆向技术》,虽然在技术点上讲的并不非常深入,但在逆向工程的Java领域,却能够非常全面的覆盖从混淆到反编译各个环节。

    相对《黑客反汇编揭密》这样的底层剖析书籍来说,此书更偏向于技术方向的介绍,以及相关现有工具和实现的比较。第2-5章简单介绍了Java领域逆向工程一些基本的概念和方法;第6-13章则扩展到测试、调试和性能调优等领域;第14-18章提及了一些较为深入的话题。
    晚上看了一下第一部分,大概翻了一下后面的内容,感觉此书的定位还是很明确的。属于让圈外人能够走马观花对整个情况有所了解,圈内人则可以当作饭后消遣了解一下Java领域的特定情况。平均4-5页纸的章节,基本上也能做到言之有物,乌克兰人在这方面还是挺厚道的。毕竟折腾逆向工程的人本来就少,大部分对这方面感兴趣的朋友目的性都很强。真要是把每一点展开来讲,估计除非是真正做这方面的人,否则都会被侃晕过去,呵呵。如何把问题展开来讲,又能收的住,而且言之有物,其实是很见功底的,总不能都像《黑客反汇编揭密》那样一个章节写4xx页吧,呵呵。
    因此此书的优点和缺点都是讲的太杂了,横的从混淆、反编译扯到跟踪和性能分析,纵的从包、类一级到字节码和JNI。可以说把这个小小领域里面可能涉及到的名词和概念一股脑都打包给了读者。如果不是在 Java 领域折腾过一段时间,并且有相当底层知识和其他领域基本概念的话,估计这么大信息量还真不一定撑的住,呵呵。不过好处是通读一遍把七七八八概念一记,出去忽悠人的话估计挺管用 :D
    另外一个亮点是此书相对来说比较新,加上作者知识面比较广,非常适合希望大概了解这个领域,并寻找学习和研究切入点的同学。毕竟这个领域成型的资料相对较少,有这么个roadmap未尝不是件好事。因此单独把此书拿出来 blog 之,如果大家对其中某些技术点有兴趣,可以一起讨论共同学习 :D
   
   
发表在 图书 | 3条评论

Java 线程锁定优化策略

Brian Goetz 最近在其 dw  Java theory and practice 专栏  里发表了几篇有趣的文章,介绍了 Sun HotSpot JVM 在以后几个版本中,对锁定等性能优化的思路。

Synchronization optimizations in Mustang

其中核心的思路是将锁分为 contended 和 uncontended 两类来分别优化。根据 80/20 经验原则和一些实测数据,大多数的线程锁实际上都只是预防性的。例如被广泛使用的 Vector 类中,绝大多数方法都被缺省加上 synchronized 修饰符以避免多线程问题,虽然这能够最大限度降低潜在的问题,但相应付出的代价也是巨大的。因为大量的实际使用都是局部或者不会涉及线程同步情况的,例如下面这种情况:

以下内容为程序代码:

   public String getStoogeNames() {
      Vector v = new Vector();
       v.add("Moe");
       v.add("Larry");
       v.add("Curly");
       return v.toString();
  } 

要缓解此问题,一方面可以从使用者角度通过库的选择来避免无效锁定,另一方面则可以由 JVM 根据行为进行锁定优化。
对前者来说,随着 JDK 的发展可以说灵活性大大增强。例如选择性使用 ArrayList 和 Collections.synchronizedList 可以获得类似的能力,但并不用付出不必要的代价;同时也可以使用已成为 JDK 1.5 标准库的 concurrent 库,根据多线程的使用情况进行锁定优化。这方面 C/C++ 库的设计理念非常优秀,那就是决不为用不到的东西付出代价。
对后者来说,则可以发挥 JVM 与传统静态编译相比最大的优势,根据运行时行为进行优化。

Lock elision 的思路,就是通过 escape 分析找出根本不存在多线程引用可能性的锁。对这种情况 Java 语言规范中明确允许进行优化,直接去掉不必要的锁定语义。而最大的问题则在于如何进行 escape 分析,并找到锁的可优化范围。因为相对于基于栈的 C/C++ 来说,Java 内存模型目前是完全基于堆的,每个对象都在全局堆中可以由任何外部线程访问。
有兴趣深入研究的话,可以看看下面这两篇文章

http://www.research.ibm.com/people/g/gupta/toplas03.pdf
http://www.research.ibm.com/people/j/jdchoi/escape-pointsto.html

Adaptive locking 的思路,则是将 contended 的锁定按锁定时间进一步细分。因为对大多数锁定来说,锁定的时间都是非常短的,例如很多 get/set 方法,以及简单的内存操作。对这些方法来说,如果要完成一个完整的锁定流程,需要涉及到对象锁状态更新、等待线程对象构建、甚至与操作系统一级的线程调度打交道。相对于实际要工作所耗费的时间来说,锁定这个操作自身消耗的资源可能反而是大头。对这些情况而言,与其建立一个完整的锁上下文,不如直接用 spin 锁机制进行等待:

以下内容为程序代码:

  while (lockStillInUse)
      ;

如果一定时间或尝试次数后还是无法获得锁,则 JVM 可以将此锁的类型转换为长时间的锁,然后构造完整的锁上下文进行管理。而这种优化方法,最能够体现动态 JIT 相对于传统静态编译器的优势,因为这些执行行为的信息是无法静态获取的。

Lock coarsening 的思路,则是通过将临近的几个相同锁定进行合并,以减少不必要的重复锁定操作。这种优化的原理是基于重复方法往往同时出现的模式,例如下面这种常见情况

以下内容为程序代码:

     public void addStooges(Vector v) {
       v.add("Moe");
       v.add("Larry");
       v.add("Curly");
  }

对这种情况来说,每次调用 add 方法进行锁定和解锁是没必要的,JVM 可以根据运行时信息选择性合并同类型锁。随着现在机器自动代码生成的广泛引用,可以预期这种基于行为对锁进行合并的思路会非常有用。

此外 David Dagastine 在其 blog 上也对 Java 同步锁优化进行了讨论

关于 Escape 分析 Brian Goetz 还在另外一篇讨论 Java 性能问题误解的文章中有所提及。

Urban performance legends
Urban performance legends, revisited

文中讨论了一些对 Java 性能问题的常见误解,其中很多问题是旧版本 JVM 和 Java 库中存在的,随着 JDK 的不断更新已经不同程度上得到缓解,例如下述等等问题。

Synchronization is really slow
Declaring classes or methods final makes them faster
Immutable objects are bad for performance

这些问题的出现,往往是因为使用者对 JVM 的实现和优化思路不熟悉导致的。实际上 HotSpot 自从 JDK 1.3 版本以后,实际上有了非常大的进步,无论是从功能还是性能上,都已经远远超出了某些人的预期。而在可以预见的 Mustang 和 Dolphin 中,更高级和动态的优化还会不断加入进来,并从 JVM 一级对应用产生透明的性能提升。

例如基于 Escape 分析的栈分配优化,有可能一改 JVM 只从堆中建立对象的传统,直接将动态分析得到的仅由线程自身使用的对象,以类似 C/C++ 的方式直接在栈中分配。这一改进如果能够成熟,对 JVM 性能的提升将是非常可观的。因为对现代 CPU 架构来说,提升性能的一个关键问题就在于 Cache 的使用。相对于位置离散的堆来说,栈一般都能确保在缓存中的命中率;而在堆中分配内存,哪怕分配性能很高,但因为缓存往往无法命中,带来的性能缺失会非常大。而且使用基于栈的内存管理模式,还可以享受到析构对象的快捷性,函数调用完成后,只需要将原函数的栈顶指针弹出即可释放所有临时对象。

如果对此方面有兴趣,可以看看 Brian Goetz 这个非常不错的 Java theory and practice 专栏 ,下面是其中关于性能优化的其他文章

Performance management – do you have a plan?
Is that your final answer?
To mutate or not to mutate?

发表在 计算机与 Internet | 6条评论