Tuesday, December 23, 2008

今天继续加班。很难想像,如此重要、人命关天的系统就是这么几个人在这个作坊里靠某种运气调出来的。至于为什么这么做管用,那就不去管了。等到哪天出毛病了,他们自然也不知道为何会出问题,因为当初为什么好使他也不知道。这就是对国家、对人民负责任的态度吗?
-- Post From My iPhone

Saturday, December 20, 2008

连着加班十天了,每天都到十点多。突然发现在这个单位里我是这么重要(有活干的时候)。真不明白,为什么有这么多高工和研究员,我离开一会儿他们都不知如何做。难道只会动嘴皮子提需求就可以当研究员吗?
也许一切就像罗大佑那首《真的假的》:这个世界生病了,因为每个每个人只剩一张嘴!


-- Post From My iPhone

Friday, December 05, 2008

Posted by Picasa
这是我的数码装备。也许在别人眼里这是时尚数码产品,但在我看来,这两样东西代表着一种IT文化,代表着我对IT行业的热爱。软件世界里那无处不在的智慧火花,那令人吃惊的创造力,那庞杂而又灵巧的系统架构,令我着迷。Thinkpad和iPhone,这两样东西对我来说就好像一辆莲花跑车一样,令人充满力量。

Saturday, September 20, 2008

这篇blog是在iPhone手机上写的,感谢豆丁送给我的iPhone!

Thursday, August 28, 2008

ANSI C99标准中预定议了两个宏,__FILE__和__LINE__。这两个宏在断言中很有
用处。但是,这两个宏的类型却不相同:__FILE__展开为一个字符串,__LINE__
展开为一个整数。
这也就意味着,你可以写出如下代码:



printf("Error at file " __FILE__); //注意中间没有逗号

而以下代码却是非法的:

printf("Error at line" __LINE__);

解决这个问题的第一个想法可能是使用“#”宏操作符:

#define stringify(x) #x
printf("Error at line " stringify(__LINE__) );

但是这只能产生如下输出

Error at line __LINE__

ISO/IEC 9899:1999 中有这样一段话


After all parameters in the replacement list have been substituted and
# and ## processing has taken place, all placemarker preprocessing
tokens are removed. Then, the resulting preprocessing token sequence is
rescanned, along with all subsequent preprocessing tokens of the source
file, for more macro names to replace.


在所有替换列表中的参数和 #及##预处理操作符的置换工作都已经完成,所有占位符都已经被移除之后,其预处理结果将被重新扫描并进行尽可能多的宏替换。



所以,针对上述问题,我们可以利用宏替换重复执行的特性来间接解决,方案如
下:

#define stringify1(x) #x
#define stringify(x) stringify1(x)
printf("Error at line " stringify(__LINE__) );

其宏替换步骤如下:

0 printf("Error at line " stringify(__LINE__) );
1 printf("Error at line " stringify1(3) );
2 printf("Error at line " "3" );

其结果与以下调用等价:

printf("Error at line 3" );

Friday, August 15, 2008

达尔文第一次到澳洲时,带走了一个十岁左右的男孩,让他到英国去“文明化”一下子,并给他起名为约翰·明斯克。若干年后,又托人把他带回澳洲,大有“撒下 文明的种子”之意。达尔文第二次去澳洲考察时,苦苦追寻那男孩的下落,知情者回答是:“我们已经把他吃了。他没有像样的体力,很多事都不会做。” (摘 自:《今晚报》2000.3.20毛志成文)
由此可见,社会的进化是全体社会成员共同进化的结果,而不是个别英雄的贡献。在落后的社会群体里面,思想相对于周围人过于超前的人会被认为是异端,基本上都会被一棒子打死。对于对当时的统治者地位有威胁的先进思想,比如
约翰·明斯克有可能倡导的“部族首领无权吃人”的思想,必然会招到剿杀。如果他还倡导“人人平等”,那你说不吃他吃谁?
对着那些闻起来发馊的程序代码,我已经多次题出来这个产品代码很不专业,不出问题是偶然,出问题是必然。可是,整个项目组的社会形态确是“只要现在没出毛病,而且功能实现,又何必知其所以然?”在这些项目中获得大量的荣耀、金钱和地位的那些专家们又是不是能够理解,使用你所不知其所以然的东西出现你不能解决的问题是公平的,因为你一开始就不知道它为什么能够工作。


Thursday, August 14, 2008

好久不用Emacs了,因为好久不写程序,也好久不写LaTeX文档了。今天冷不丁要对一个有点乱的c文件进行整理,发现里面有很多括号没对齐,所以想用Emacs整理一下。这一用不要紧,我竟然忘了如何查找匹配的括号了。
现在将常用的匹配操作列在这里,以供日后查阅:
C-M-a 到函数头
C-M-e 到函数尾
C-M-h 选中函数
C-M-p 和 C-M-n 查找匹配的括号

Friday, August 08, 2008

ubuntu中的/etc/inittab

在ubuntu发行版中,没有/etc/inittab文件,原因就是ubuntu没有使用传统的sysinit,而是使用了upstart作为替代。upstart的配置文件在/etc/event.d中。
参见upstart官方网站。

Tuesday, August 05, 2008

Ubuntu中文 论坛 :: 阅读主题 - 轻松解决Rhythmbox乱码问题

在Linux下播放mp3出现乱码时,可以试一下这条命令:

mid3iconv -e GBK *.mp3

Monday, August 04, 2008

Thinkpad在Linux下的电池控制

Thinkpad T60本来是有电池充电控制功能的,它可以设置为即使插上AC电源,如果电池的电量高于某一个阈值,笔记本也不会向电池充电。这样可以防止使电池始终进行少量的充电放电过程而带来的电池老化。
但是在Linux下却没有ThinkVantage这个软件,要实现电池充电控制只能令想办法。tp_smapi 项目就提供了一种解决方案,你可以从这里找到它的代码。令外,这里有一些关于tp_smapi的说明。如果你使用ubuntu8.04,那么你就不用费力气下载了,系统已经装好了tp_smapi。你只要在root下使用
sudo modprobe tp_smapi
就可以加载它的驱动,然后使用
echo 1000 > /sys/devices/platform/smapi/BAT0/inhibit_charge_minutes
就可以使thinkpad在1000分钟内不充电。

Saturday, May 17, 2008

emacs关于光标位置的几个常用命令


  • M-x what-page

    显示当前页的页码和当前point在当前页中的行数



  • M-x what-line

    当前point在整个buffer中的行数



  • M-x line-number-mode



    M-x column-number-mode



    mode-bar 中显示行号和列号



  • M-=

    显示在当前选择区域的行数



  • C-x =

    显示当前光标所在位置的字符信息



  • M-x hl-line-mode

    如果enable,则高亮显示当前行



  • M-x size-indication-mode

    是否显示当前buffer的大小


Tuesday, April 29, 2008

每天把工作和学习的心得总结一下,放在博客上,即使一个愿意看的人也没有,也可以当作自己的学习笔记,好记性不如烂笔头嘛。但是写blogger我没找到合适的工具,我又不大懂得使用HTML直接编辑博客,于是我就使用Emacs Muse作为blogger的编辑工具。将编辑好的muse文档发布为html格式的文件后,再把它粘贴到blogger上。而且通过htmlize的配合,Muse可以把blog中的程序代码发布为语法着色的形式。比如:




<src lang="c">
template <unsigned long N>
struct binary
{
static unsigned const value
= binary<N/10>::value << 1
| N%10;
};

template <>
struct binary<0>
{
static unsigned const value = 0;
};

unsigned const one = binary<1>::value;
unsigned const three = binary<11>::value;
unsigned const five = binary<101>::value;
unsigned const seven = binary<111>::value;
unsigned const nine = binary<1001>::value;


</src>


就会生成




template <unsigned long N>
struct binary
{
static unsigned const value
= binary<N/10>::value << 1
| N%10;
};

template <>
struct binary<0>
{
static unsigned const value = 0;
};

unsigned const one = binary<1>::value;
unsigned const three = binary<11>::value;
unsigned const five = binary<101>::value;
unsigned const seven = binary<111>::value;
unsigned const nine = binary<1001>::value;


据说iPhone的3G版本要在6月9号发布,网上也泄漏出来这个iPhone二代的背面的图片,没有了金属面板,全黑色的。但是毕竟是传言,真正的iPhone二代到底是什么样子,要等到乔布斯拿出来那一天才知道。
HeadFirst系列的图书又出了一本C#和一本JavaScript的书。书确实写的很好,关键是使用大量的图形能够很好的把问题讲清楚。但是C#这本书的定位却比较低端,其读者群应该是没有学过或刚刚开始学习程序设计的学生,有一定基础的读者会嫌此书有些罗嗦。