-
最近上班上得很happy,S每天下午开会做training,受益匪浅。会议中突然发现:过去觉得S说话印度口音太重而几乎听不太懂,现在却奇迹般的没有在听外语的感觉,我竟然很神奇的听得一气呵成包括激动处加快的语速。另一个奇迹就比较令人沮丧了:跟S聊天我却完全不在行,连一句简单的初中水平问话我都要脑袋空白好半天,之后很笨拙地反应过来其语法构成于是无地自容。看来语言这东西真的要靠环境熏陶的……
人生多么短暂,我常常为自己浪费生命而羞愧,特别是有所收获的时候——这两天这种感觉尤为明显。我无法估算我到底浪费了多少时间在无聊的事情上,并且当时并未感觉到做这些事情有多么无聊,可是一旦投入时间的性价比明显呈指数提高,就会懊恼要是把之前用掉的时间拿来研究今天这些东西,该是多大的产出啊!我总是很懒,懒到没有意志力去克服显而易见的舒适从而获得更有价值的回报。就算是写这些话的当口,我也才突然记起今天开会时写在手心里准备回家google的东西,而此时的我已经眼皮沉沉行将入睡,不知道还有没有毅力去坚持把该做的事情做完。
从前人家说挨踢之苦在于要不停地学习,最初我深以为然,后渐渐不以为然——这世上,只要想学还有什么学不会的吗?现在终于慢慢地了解到这种不以为然,就是传说中的不知天高地厚、不知自己有几斤几两、所谓盲目自大小P孩的典型思维。以为乾坤世界尽在掌握,其实只是井底之蛙。今天开会的时候偶尔开小差,听到某句话,联想到过去的某段代码某个bug,或是高人指点的某些实验code,当时没有深究现在才恍然大悟:原来如此!
有句话很俗很老套小时候很爱用来写作文却其实颇不以为然:学无止境,现在我是真真正正的颇以为然了。
-
最近google上线了音乐搜索,居然都是有版权的,很好很强大!那个泡泡挑歌挺好玩也挺好用,只是一直不知道是基于真正的模式匹配还是只是数据库匹配搞出来的噱头。不管怎样还算不错啦,也确实能满足我一时兴起找首歌听听的非分要求。
不过论技术,逛chinaunix的时候发现了一个好地方:www.midomi.com,真正的哼歌搜索。自己尝试了一下,对音调节奏的匹配真的很厉害!不管是我荒腔走板的破喉咙,还是放的原声,给个10秒左右的数据基本上都能比较准确地识别出来。个别曲子比如国歌、千年等一回,乱哼哼跑点节奏也错不了。虽然数据库里的歌曲不是特别多,但看得出是如假包换的模式识别,更重要的是速度也不赖,技术啊!哪天google去收购它,说不定就可以实现真正大规模的哼歌搜索了!
话说……当年我最想去考的专业还是模式识别啊!怨念地飘走~~~
-
今天遇到两疑,惑而不解,google/baidu/甚至万能的tianya都无法告诉我结果。所以决定先记下来,穷尽一生的时间去找寻答案~~~~~
A. 源码不变,编译出来的静态库却不一样?
环境:linux, gcc/g++, c(C++没试过)。如果目标为静态库,那么每次重新编译后的md5sum都不一样,虽然size是一样的。不过如果是动态库或者是可执行文件,md5就一样了。为虾米呢?????
B. static到底还隐藏着什么不可告人的隐情?
某同事的库,发生过一次怪异的问题:他发现自己加了个全局变量,调用他库的程序运行到某一句跟此变量毫无关系的memcpy就会segmentation fault,哪怕只是定义一下(例如int abc;)什么也不做都不行!我多嘴(顺便拜一下自己神奇的第六感)要他改成static试试看,果然没事了。当时认为的原因是,程序里面某个地方memory有问题,定义了全局变量后刚好影响了某些东西从而写坏了不该写的地方,刚好造成了memcpy指针或者长度不是预想的值;而static变量是另外空间存放的,就没有问题。忽然今天某人又很困惑他的library为什么突然不行了,而且问题出在一个全局变量上。我帮忙看了半天虽然code改了但只是叙述方式变了变而已,也看不出什么所以然来。再一看log跟之前的诡异问题极像就打趣:“你再改成static看看,要是又行了那就搞笑了!”同事呆了几秒,“你这么一说,我之前就是static后来因为XXX改成volatile”。于是再度尝试,遂成。这次俺更困惑了,这么长时间以来,库也改了不知道多少东西,它怎么能又使老招耍赖呢?如果按以前的解释,整个memory、函数地址已经变了,那他就不该那么巧在同一个地方segmentation fault啊!
背景:1)编译环境linux+arm-linux-gcc, 运行环境arm9+linux2.6.26;2) 此库A为静态库,只是整个程序调用的其中一个library;3) 出问题的地方是在另一个库B提供的一个function,它被A调用;4)memcpy的目标和源内存地址都是由物理地址映射的,而两块物理地址都是预留空间且在正常可用memory之前(不相邻),除非linux疯了否则user space & kernel都不会用;5)这两次所定义的变量名,绝对没有在其他文件以及调用库A的其他程序中定义或使用;6)还有什么关键问题要补充暂时没想到
莫非这个library从此全局变量就只能static了???
汇报完毕!
-
纠结了一个月的bug
日期:2009年01月09日 | 分类:IT
最近一个月都消耗在一些磨人的问题上,什么power drop, memory leak, kernel panic,差一点要疯掉。特别是memory leak,几度山穷水尽,又几度柳暗花明。 好几次无计可施,忽然有了发现豁然开朗;朝前奔去直到穷途末路,懊恼之下却又峰回路转;上午还在商量说有可能再一个星期还是找不到原因,下午就开心地盘算八成可以把mantis里面的bug关掉,第二天睡一觉醒来看结果竟是当头一棒……简直太有戏剧效果了!每天在office穿梭,到处找人借PC弄log,有时候看到几天才终于重现的bug欢天喜地如获至宝拿板子去研究状态,有时候看到自以为没问题的测试居然又能重现bug满面愁容身心俱疲。以至于某同事叫我去看板子死了的时候都有点犹疑,估计是被我面对同样事物的不同态度弄得晕头转向。听新闻,老胡说“不折腾”,自己不禁笑起来——本该坚决响应中央号召,可惜RP有问题不能如愿哪!折腾了这么久,现在看起来是终于寻到根了:According to some books, non-reentrant functions should not be call in signal handler. It may lead to some unexpect results such as deadlock. Here's an example of deadlock. It's not easy accured, but sometimes it will. (Another issue of this code is the timing)volatile int gSignaled = 0;
void sig_handler(int signo) {
printf("signal %d received!\n", signo);
gSignaled = 1;
}
int main(void) {
struct sigaction sa;
sigaction(SIGINT, &sa, 0);
while(!gSignaled) {printf("waiting\n");
}
}It lead to deadlock if the instruction execute like this:main:call printf // "printf" in while loop
call malloc //"malloc" in printf
call pthread_mutex_lock(lock the static mutex in malloc function)
// when still in function malloc, it receive a signal.
call sig_handler
call printf // "printf" in signal handler
call malloc
call pthread_mutex_lock(lock the static mutex in malloc function again)
// now it hanppen deadlock!如此重要的隐藏bug,一定要好好记下,以示鞭策!也多亏了Eric的这个发现,我终于能在周报里作总结陈词: print function in signal handler-> deadlock happen->signal pending(144B memory leak every signal)-> signal queue overflow-> no signal can be sent/ received -> can not free resource after pthread exit, 50K+ memory leak every change channel.多谢所有这段时间为了这个问题帮过忙的同事,让我又学到了很多东西! -
没理由写CES而冷落CeBIT!
日期:2008年03月09日 | 分类:IT
CeBIT2008:汉诺威展会简介
http://www.sina.com.cn 2008年02月29日 16:07 新浪科技新浪科技讯 CeBIT2008汉诺威消费电子、信息及通信博览会(以下简称:CeBIT 2008)于2008年3月4日-9日在德国汉诺威市开幕,展会为期7天。2007年展出六大主题分布于27个展馆,囊括商务应用、通信、数字设备及系 统、银行与金融、公共事业园区和未来园区等方面,覆盖70多个国家6000名参展商,其中中国厂商预计将超过410家。新浪科技为CeBIT2008官方 指定唯一中文网站。
展会时间:2008年3月4日—9日
展览地点:德国汉诺威展览中心
展会简介:
CeBIT是IT界最主要的商务平台,拥有最重要的国际信息及通信技术论坛和广泛的媒体影响力,被喻为是整个数码产业最重要的展览会。2007 年展出六大主题分布于27个展馆,囊括商务应用、通信、数字设备及系统、银行与金融、公共事业园区和未来园区等方面,共有70多个国家6000名展商参 展,其中中国厂商超过410家。
展品范围:
1.商务应用:文件管理方案、存储方案;系统软件、系统管理、网络管理、数据库、中间件、开发工具、操作系统、行政系统、IT服务、商业智能、知识管理、内容管理;企业应用包括ERP、CRM、SCM、生产执行系统、自动数据采集;信息安全;ICT外包。
2.通信网络:固定电话、电信与互联网服务;移动通信、固定电话、电信与互联网服务;广播及卫星;网络元件。
3.数字设备及系统:数码影像、办公自动化;计算机(个人电脑、笔记本、PDA);计算机配件及部件;存储、计算机周边、数码电子;显示技术;主板及配件;声卡、显卡;数码娱乐、消费电子产品。
4.银行及金融:银行装备、装置及技术设备;金融服务的整体解决方案;银行设备;电子及移动金融服务;现金管理系统;金融咨询服务;银行财政系统;资本世界。
5.公共事业园区。
6.未来园区。
还有39家中国参展商因为版权问题遭查封,俺们也咩有处理版权,但愿没有那么背~~!
http://tech.sina.com.cn/it/2008-03-07/07302063404.shtml -
好辛苦啊,当夹心饼干……
上层说:给我提供尽量丰富的接口,要傻瓜型的,最好一个大功能一个函数,并发和流程控制全都帮我考虑到;
下层说:我的XX函数没考虑到这个情况,加个参数把!我的XX函数很耗时间,少调用吧!我的XX处理很占CPU,帮我处理吧!
…………
我无语,全局状态标志一加再加,各种处理控制一改再改,1000行的时候以为很完美了,过了一周变成了1700+还没处理完全,有时候想到各种并发的情况和线程控制,已经完全的头晕了。没办法,第一次写单个文件的程序用到笔记,三个并发控制的要点写了三页,5个流程图又是三页,好累啊~~~!
-
segmentation fault
日期:2007年11月08日 | 分类:IT
持续将近一个星期的“segmentation fault”终于告一段落。从无到有,从整天的令人泄气的段错误到几乎完美的(以俺的水平来看)指针、线程控制,我获得了很多。
大约是高中时候就留下的习惯,总是喜欢用最简单的技术尽可能精妙的算法去实现一个功能。大学里更是没写几个称得上程序的东西,于是一直对指针敬而远之,很多好的习惯没有养成,可以说完全没有一个合格的C程序员的风范。本周的这个项目实在是没有办法,很多流程的控制、链表的维护,不得不强迫自己一遍又一遍去重复实现并牢记一些规则与用法。记不牢的,自然是用几乎令人感觉没有希望的调试过程来代替,无数匪夷所思令人抓狂的错误和现象,我只能叹息内存是多么的奇妙!
再加上并不是我一个人写好就可以的程序,所调用的下层更是指针满地都是,什么“谁malloc谁free”这类经典法则往往不能完全执行。幸好同事在这方面比我有经验,我们边写边测边改,竟然在我俩的代码里光指针类的大bug就找出了五六个。无语啊无语,尤其是昨天加的一个小功能,害我找了一整天的bug,结果只是由于偷懒用了个“XXX=XXX=(XXX*)malloc(X)”……今天发现的时候真想找个地方躲起来……
不过总算是基本上搞定了。相比之下,之前担心的线程的暂停、继续、并发控制之类反倒简单得多。虽然是第一次用线程,却也没花什么精力。反倒是学会了很多线程和锁的操作。
呼~呼~总算没有耽误进度,明天开始又要跟驱动和硬件打交道了。老实说写程序比较有成就感。对着硬件示波器往往一整天也没什么大的进展,对着屏幕键盘就不同了,一天至少也能写个百来行,弄出些可以运行的框架来,呵呵。本来下午看了一眼程序正好1000行,想完美地保留这个行数,可惜又加了点并发控制,变成1050了……

-
老天保佑,终于从某驱动的测试工作中解放了!
上午把之前写的一份代码优化到我的极限,实在没有借口了,只好极不情愿地继续debug某驱动,那个头疼~~没有任何注释,变量名都是abc,一个东西能让你结构体-〉指针->结构体->指针……追溯五六层,还很高深地来了个内存映射,用户态和内核态混在一起写……某牛人真让我Orz~~正对着屏幕头昏脑涨,被叫去讨论后一段的工作。问我愿不愿意去做application,心里激动坏了:别说是做应用,就算是去焊板子、去写脚本也比对着完全不知道问题在哪里的某驱动要好啊!马上一口答应下来,怎一个爽字了得!
Happy~~~
不过这一阵子又要忙了,艰巨的任务阿!
-
突然听说前几天过来这边的那个清华研究院工程师原来是当年的湖南高考状元,后来在清华读到博士,继续留校工作……早知道就多看几眼,也好留个牛人的音容笑貌。身边的牛人越来越多了,几年前最最亲爱的那些朋友们,一个个以747的速度越飞越高:前一段毕业的时候,每听到一个人的名字和去向,就不由得感叹一句“大牛啊!”,继而把自己的自信心都一点一点地消磨掉,就像当初分区联赛以后一样……
人比人,气死人,虽然这攀比并非来自于贪欲。其实很多事情在大家相识不久后就可以下定论,比如我竞赛的失败、高考的失利、大学的失语、在通向大牛的高速公路上的失踪……其实不过是性格决定人生罢了。嘿嘿,其实老早就明白,自己这种太不受拘束的脾性和喜欢自我膨胀的脑袋,是达不到当时大多数同伴们水准的——人家说笨鸟先飞,我不但智力上没有优势,体力上也不愿付出,自然是要飞得慢得多且低得多了。
还好我有阿Q作伴。每每陷入回忆陷入自卑,这位朋友就自动跳出来大叫“比上不足比下有余”!于是自己居然也能拍拍胸口,走上大街环视四周,安慰自己:是是是,对自己不要太苛求才能过得快活……
今天心情比较好,MS搞定了I2C——虽然实质上是简单得不能再简单,但也算是首个我独立完成的事情了。之前一直测试、查错、改代码什么的,军功章里有别人的一大半只有我的一小小小小半。想来如果没有半途取消,camera的驱动也是做好了的——事实上就是基本上做好了,不过当时自己居然不知道应该用struct而像写脚本一样弄很多io_write上去,define一大堆寄存器,真有点傻傻的!
不过还是有点可惜,明明难得硬件在,偏偏我又总是调试不好,还找不出原因。搞了很久,还是DK一句“ however, I wonder there exists device with slave address of 0xC6, since the address of the I2C device should be 7 bit, max. value should eb 0x7F”惊醒梦中人。话说清华那边的代码写的很让人郁闷,连个头文件也没有,就只有牛人一句“不用给,这些调用和参数跟一般的I2C都是一样的”,结果是硬件不同,居然只有高7位有效……教训啊教训,整了大部分精力在驱动上面,却没有研究好I2C的细节标准,才会连这么明显的问题都看不出来!

-
要写驱动,却没有datasheet,只有一大堆用来做演示的写寄存器的脚本,华丽的好几页io_write
……这本身已经很让人郁闷了,天知道我要把这些0x???????对应成有意义的控制代码要多久?一个一个算base+offset要多久?更郁闷的是,原来以为可以在类似型号的驱动基础上小作修改,却发现是基于2.4内核的!
当我发现这一点的时候,那真是当头一棒
……尤其是接着又发现还有3个他自己定义的头文件没有给我的时候,我望着重定向输出的一大堆(MS有300+行)未定义宏,彻底地被打击了……
在徒劳地试图去解决或理解那数不清的error之后,在感叹了一番为什么我要的驱动不是内核里面有的不能直接改之后,我终于决定重起炉灶。
真是一种折磨,本来就是赶鸭子上架,现在更是变本加厉成了赶鸭子上楼……大家全部忙得团团转,只有我好像闲一点——那是因为我不知道怎么按时出活啊!这种日子早点结束吧~~~写着这连是否使用中断都待定的驱动,我感觉下班后的天都比平日灰暗了!
只好尽快学习、多多尝试了。理论上来说,世界上没有什么技术是学不会的,尤其是这些“纸老虎”型的。过去也遇见过那么多看起来很难的事,结果不都是有了压力才“绊蛮”搞定的吗?嗯,不管怎样,要给自己打气!时间很紧!







