﻿
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[程序之美]]></title> 
<link>http://narmy.cn/linux/index.php</link> 
<description><![CDATA[__________高万龙的博客  博客已转移至http://narmy.cn/blog]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[程序之美]]></copyright>

<item>
<link>http://narmy.cn/linux/read.php/130.htm</link>
<title><![CDATA[《程序员的自我修养——链接、装载与库》勘误]]></title> 
<author>lengyuex &lt;lengyuex@gmail.com&gt;</author>
<category><![CDATA[C &#124;&#124; OS]]></category>
<pubDate>Wed, 19 May 2010 23:32:56 +0000</pubDate> 
<guid>http://narmy.cn/linux/read.php/130.htm</guid> 
<description>
<![CDATA[ 
	<span style="font-family: courier new;"><br/>《程序员的自我修养——链接、装载与库》<br/>2010年3月第5次印刷<br/>电子工业出版社<br/><br/>这本书确实不错，刚看完一遍，有很多收获。有一些自己觉得是错误的地方指出来，望对他人有用。<br/><br/><br/>1.&nbsp;&nbsp;P51.图2-8链接过程：<br/>原：Propressing 。<br/>应改为：Preprocessing<br/><br/>2．P60.第二段第二行：<br/>&nbsp;&nbsp;原：保存一份改程序的指令部分。<br/>应改为：保存一份该程序的指令部分。<br/><br/>3．P85.第六行：<br/>&nbsp;&nbsp;原：它被定义在.bss段，即下标为3。<br/>&nbsp;&nbsp;应改为：它被定义在.data段，即下标为3。<br/><br/>4．P104.第三段第三行：<br/>&nbsp;&nbsp;原：如第偏移为0x18的mov指令，<br/>&nbsp;&nbsp;应改为：如偏移为0x18的mov指令，<br/><br/>5．P134:第一段第一行：<br/>&nbsp;&nbsp;原：微软引入了一种叫PE(Protable Executable)的可执行格<br/>&nbsp;&nbsp;应改为：微软引入了一种叫PE(Portable Executable)的可执行格<br/><br/>6．P151:第四段第一行：<br/>&nbsp;&nbsp;原：从地址0xC00000000到<br/>&nbsp;&nbsp;应改为：从地址0xC0000000到<br/><br/>7．P154:第二段第一行：<br/>&nbsp;&nbsp;原：由于模块A和模块B之间相互调用依赖关系，<br/>&nbsp;&nbsp;应改为：由于模块A和模块B之间没有相互调用依赖关系，<br/><br/>8．P255:第二段第四行：<br/>&nbsp;&nbsp;原：我们在本书的第4章还会<br/>&nbsp;&nbsp;应改为：我们在本书的第4部分还会<br/><br/>9．P286:第三段第三行：<br/>&nbsp;&nbsp;原：先入栈的数据后出栈（First In Last Out, FIFO）,<br/>&nbsp;&nbsp;应改为：先入栈的数据后出栈（First In Last Out, FILO）,<br/><br/>10．P339:【小实验】第四段第一行：<br/>&nbsp;&nbsp;原：va_start将va_list定义的指针指向函数的最后一个参数后面的位置，<br/>&nbsp;&nbsp;应改为：va_start将va_list定义的指针指向函数的最后一个具名参数后面的位置，<br/><br/>11．P368:第三段代码最后大括号后面应该加分号。<br/><br/>12．P400:第三段命令行：<br/>&nbsp;&nbsp;原：$objdump –d –start-address=0xffffe400 –stop-address=0xffffe414&nbsp;&nbsp;linux-gate.dso<br/>&nbsp;&nbsp;应改为：$objdump –d –start-address=0xffffe400 –stop-address=0xffffe408&nbsp;&nbsp;linux-gate.dso<br/><br/><br/> 高万龙<br/>lengyuex@gmail.com<br/>2010/5/19<br/></span>
]]>
</description>
</item>
<item>
<link>http://narmy.cn/linux/read.php/129.htm</link>
<title><![CDATA[马屁股和航天飞机的关系]]></title> 
<author>lengyuex &lt;lengyuex@gmail.com&gt;</author>
<category><![CDATA[有用的 &#124;&#124; 有趣的]]></category>
<pubDate>Tue, 11 May 2010 02:32:27 +0000</pubDate> 
<guid>http://narmy.cn/linux/read.php/129.htm</guid> 
<description>
<![CDATA[ 
	马屁股和航天飞机的关系<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;美国铁路两条铁轨之间的标准距离是四点八五英尺。这是一个很奇怪的标准，<br/>究竟从何而来的？ <br/>　　原来这是英国的铁路标准，因为美国的铁路最早是由英国人设计建造的。那么，为<br/>什么英国人用这个标准呢？<br/><br/>　　原来英国的铁路是由建电车轨道的人设计的，而这个四点八五英尺正是电车所用的<br/>标准。电车轨标准又是从哪里来的呢？<br/><br/>　　原来最先造电车的人以前是造马车的。而他们是用马车的轮宽做标准。好了，那<br/>么，马车为什么要用这个一定的轮距离标准呢？<br/><br/>　　因为如果那时候的马车用任何其它轮距的话，马车的轮子很快会在英国的老路上撞<br/>坏的。为什么？<br/><br/>　　因为这些路上的辙迹的宽度为四点八五英尺。这些辙迹又是从何而来呢？<br/><br/>　　答案是古罗马人定的，四点八五英尺正是罗马战车的宽度。如果任何人用不同的轮<br/>宽在这些路上行车的话，他的轮子的寿命都不会长。我们再问：罗马人为什么用四点八<br/>五英尺为战车的轮距宽度呢？<br/><br/>　　原因很简单，这是两匹拉战车的马的屁股的宽度。故事到此应该完结了，但事实上<br/>还没有完。<br/><br/>　　下次你在电视上看到美国航天飞机立在发射台上的雄姿时，你留意看，在它的燃料<br/>箱的两旁有两个火箭推进器，这些推进器是由设在犹他州的工厂所提供的。如果可能的<br/>话，这家工厂的工程师希望把这些推进器造得再胖一些，这样容量就会大一些，但是他<br/>们不可以，为什么？<br/><br/>　　因为这些推进器造好后要用火车从工厂运到发射点，路上要通过一些隧道，而这些<br/>隧道的宽度只比火车轨道的宽度宽了一点点。<br/><br/>　　故事是颇有趣的。从一定意义上说，今天世界上最先进的运输系统的设计，或许是<br/>由两千年前两匹战马的屁股宽度来决定的。历史惯性的力量是多么的强大，要冲破由惯<br/>性形成的规则又是多么的艰难。<br/>
]]>
</description>
</item>
<item>
<link>http://narmy.cn/linux/read.php/128.htm</link>
<title><![CDATA[有的女生就像Windows 虽然很优秀，但是安全隐患太大。有的女生就像UNIX 她条件很好，然而不是谁都能玩的起]]></title> 
<author>lengyuex &lt;lengyuex@gmail.com&gt;</author>
<category><![CDATA[有用的 &#124;&#124; 有趣的]]></category>
<pubDate>Tue, 04 May 2010 13:48:02 +0000</pubDate> 
<guid>http://narmy.cn/linux/read.php/128.htm</guid> 
<description>
<![CDATA[ 
	笑话一：爱情观 <br/>　　爱情就是死循环，一旦执行就陷进去了。 <br/>　　爱上一个人，就是内存泄漏--你永远释放不了。 <br/>　　真正爱上一个人的时候，那就是常量限定，永远不会改变。 <br/>　　女朋友就是私有变量，只有我这个类才能调用。 <br/>　　情人就是指针用的时候一定要注意，要不然就带来巨大的灾难。 <br/><br/>笑话二：女人篇 <br/>　　有的女人就是Windows虽然很优秀，但是安全隐患太大。 <br/>　　有的女人就是MFC她条件很好，然而不是谁都能玩的起。 <br/>　　有的女人就是C#长的很漂亮，但是家务活不行。 <br/>　　有的女人就是C++,她会默默的为你做很多的事情。 <br/>　有的女人就是汇编虽然很麻烦，但是有的时候还得求它。 <br/>　　有的女人就是SQL，她会为你的发展带来莫大的帮助。 <br/><br/>笑话三：程序员喝酒 <br/>　　大家喝的是啤酒。这时你入座了。 <br/>　　你给自己倒了杯可乐，这叫低配置。 <br/>　　你给自已倒了杯啤酒，这叫标准配置。 <br/>　　你给自己倒了杯茶水，这茶的颜色还跟啤酒一样，这叫木马。 <br/>　　你给自己倒了杯可乐，还滴了几滴醋，不仅颜色跟啤酒一样，而且不冒热气还有泡泡，这叫超级木马。 <br/>　　你的同事给你倒了杯白酒，这叫推荐配置。 <br/><br/>人到齐了，酒席开始了。 <br/>　　你先一个人喝了一小口，这叫单元测试。 <br/>你跟旁边的人说哥们咱们随意，这叫交叉测试。 <br/>　但是他说不行，这杯要干了，这叫压力测试。 <br/>　　于是你说那就大家一起来吧，这叫内部测试。 <br/>　　这个时候boss向全场举杯了，这叫公开测试。 <br/><br/>菜过三巡，你就不跟他们客气了。 <br/>　　你向对面的人敬酒，这叫p2p. <br/>　　你向对面的人敬酒，他回敬你，你又再敬他...这叫tcp. <br/>　　你向一桌人挨个敬酒，这叫令牌环。 <br/>　　你说只要是兄弟就干了这杯，这叫广播。 <br/>　　可是你的上司jj听了不高兴了，只有兄弟么，罚酒三杯。这叫炸弹。 <br/>　　可是你的下级mm听了不高兴了，我喝一口，你喝一杯，这叫恶意攻击。 <br/>　　有一个人过来向这桌敬酒，你说不行你先过了我这关，这叫防火墙。 <br/>　　你的小弟们过来敬你酒，这叫一对多。 <br/>　　你是boss，所有人过来敬你酒，这叫服务器。 <br/><br/>酒是一样的，可是喝法是不同的。 <br/>　　你喝了一杯，boss喝了一口，这叫c#。 <br/>　　你喝了一杯，mm喝了一口，这叫vb。 <br/>　　你喝了一杯，你大哥喝了半杯，这叫c++。 <br/>　　你喝了半杯，你小弟喝了一杯，这叫汇编。 <br/>　　你喝了一杯，你的搭档也喝了一杯，这叫c。 <br/><br/>酒是一样的，可是喝酒的人是不同的。 <br/>你越喝脸越红，这叫频繁分配释放资源。 <br/>　　你越喝脸越白，这叫资源不释放。 <br/>　　你已经醉了，却说我还能喝，叫做资源额度不足。 <br/>　　你明明能喝，却说我已经醉了，叫做资源保留。 <br/>　　你喝一段时间就上厕所，这叫cache。 <br/><br/>酒过三巡，你也该活动活动了。 <br/>　　你一桌一桌的走，这叫轮巡。 <br/>　　你突然看到某一桌的漂亮mm，走了过去，这叫优先级。 <br/>　　你去了坐下来就不打算走了，这叫死循环。 <br/>　　你的老大举杯邀你过去，你只好过去，这叫启动事件。 <br/>　　你向一桌敬酒，他们说不行不行我们都喝白的，于是你也喝白的，这叫本地化。 <br/>　　你向boss敬酒，可是boss被围了起来，你只能站在外圈，这叫排队。 <br/>　　你终于到了内圈，小心翼翼的向前一步，这叫访问临界区。 <br/>　　你拍着boss的肩膀说哥们咱们喝一杯，这叫越界。 <br/>　　你不知喝了几圈了，只会说两个字，干了，这叫udp。 <br/>　　可是还有人拿着酒瓶跑过来说，刚才都没跟你喝，这叫丢包。 <br/><br/>喝酒喝到最后的结果都一样。 <br/>　　你突然跑向厕所，这叫捕获异常。 <br/>　　你在厕所吐了，反而觉得状态不错，这叫清空内存。 <br/>　　你在台面上吐了，觉得很惭愧，这叫程序异常。 <br/>　　你在boss面前吐了，觉得很害怕，这叫系统崩溃。 <br/>　　你吐到了boss身上，只能索性晕倒了，这叫硬件休克。 <br/><br/>笑话四：大腕篇 <br/>写就要写最难懂的程序， <br/>　　用记事本做编辑器， <br/>　　编译就得用最难用的编译器， <br/>　　程序不带半点注释， <br/>　　程序里面至少要有三个类， <br/>　什么多继承呀, 多线程呀，template呀，inline呀， <br/>　　能给他用的全给他用上 一行里面有while有++有?:有goto， <br/>　　文章里面一定要搬出一个XX哥， <br/>　　用很随意的语气，关系特好的样子， <br/>　　如果自己出书 ，甭管是什么语言 一开头都打印“hello world! ” <br/>　　一副专业人士的派头(儿)， <br/>　　倍(儿)有感觉， <br/>　　编程中场再去冲杯咖啡， <br/>　　咖啡要雀巢的， <br/>　　一个程序最多也就一两个小时就搞定， <br/>　　最后再来句“最近感冒了，哎～” <br/>　　就一个字(儿)——酷！ <br/><br/>用下你写的程序就得要跟七八十个参数， <br/>　　同行的人不是用C就是用汇编， <br/>　　你要是用VB， <br/>　　你都不好意思跟人家打招呼。 <br/><br/>你说这样的高手，一个月得拿多少钱？ <br/>　　我觉得怎么着也得两千吧？ <br/>　　两千 那是老板！ <br/>　　五百封顶！ <br/>　　你别嫌少，还是日元。 <br/>　　你得理解老板的处境， <br/>　　本来公司就经营的惨不忍睹， <br/>　　根本不会再多给你一分钱。 <br/><br/>什么叫编程高手，你知道吗？ <br/>　编程高手就是写什么程序， <br/>　　都写最难的，不写最好的。 <br/>　所以，我们编程菜鸟的口号(儿)就是—— <br/>　　不求好用，但求难懂！<br/><br/> <br/><br/> <br/><br/> <br/><br/> <br/><br/> <br/><br/> <br/><br/> <br/><br/> <br/><br/> <br/><br/>一个高级程序员编的追女孩子的程序<br/><br/> <br/><br/>#define AND &&<br/><br/> <br/><br/>RESULT love(boy, girl)<br/><br/> <br/><br/>&#123; <br/>　　if( boy.有房() AND boy.有车() ) <br/>　　&#123; <br/>　　　boy.Set(Nothing); <br/>　　　return girl.嫁给(boy); <br/>　　&#125; <br/>　　else if( girl.愿意等() ) <br/>　　&#123; <br/>　　　next_year: <br/>　　　for( day=1; day<=365; day++) <br/>　　　&#123; <br/>　　　　if( day == 情人节 ) <br/>　　　　　if( boy.GiveGirl(玫瑰) ) <br/>　　　　　　girl.感情++; <br/>　　　　　else <br/>　　　　　　girl.感情--; <br/>　　　　if( day == girl.生日) <br/>　　　　　if( boy.GiveGirl(玫瑰) ) <br/>　　　　　　girl.感情++; <br/>　　　　　else <br/>　　　　　　girl.感情--; <br/>　　　　boy.拼命赚钱(); <br/>　　　&#125; <br/>　　　年龄++; <br/>　　　girl.感情--; <br/>　　　if( boy.有房() AND boy.有车() ) <br/>　　　&#123; <br/>　　　　boy.Set(Nothing); <br/>　　　　return girl.嫁给(boy); <br/>　　　&#125; <br/>　　　else if( boy.赚钱 > 100,000 AND girl.感情 > 8 ) <br/>　　　　goto next_year; <br/>　　　else <br/>　　　　return girl.goto( another_boy); <br/>　　&#125; <br/>　　return girl.goto( another_boy);<br/><br/><br/><br/><br/>程序员之男女：<br/>　程序员就象男人，语言就象女人。每个男人都想要很多女人，却很少有男人能真正了解女人，因为男人总是朝三暮四，而女人每天都在变，甚至有些是经过变性和美容的。<br/><br/>我们都笑了：<br/>　Borland说我很有前途，Sun笑了；Sun说我很有钱，IBM笑了；IBM说我很专业，Sybase笑了；Sybase说我数据库很牛，Oracle笑了；Oracle说我是开放的，Linux笑了；Linux说我要打败Unix，微软笑了；微软说我的系统很稳定，我们都笑了。 <br/><br/>语言与汽车：<br/>　Delphi就象吉普车，什么路上都能开，却在什么路上也开不好；PB就象卡丁车，只能在固定线路上开，到了室外就有些不稳了；VC就象是跑车，你开得起却买不起，而且一旦发生故障，想修都找不到毛病在哪；Java就象敞棚车，不管刮风下雨，还是艳阳高照，都能照开不误；VB就是摩托车了，骑的时间越长，你越痛恨它！ <br/><br/>程序员的理想：<br/>　天下语言剩一庙，晚上加班M M 抱； <br/>　部门经理都死掉，全部奖金一人要。 <br/><br/>程序员的放弃：<br/>　为了发展，放弃金钱；为了金钱，放弃美女；为了美女，放弃自由；为了自由，放弃一切。 <br/><br/>几个年龄段的程序员：<br/>　20岁的程序员没实力，30岁的程序员会做PPT，40岁的程序员有实力没魅力，50岁的程序员只有资历，60岁的程序员抱着孙子说这就是IT，70岁的程序员躺着病床上用电脑给自己算命。 <br/><br/>程序员恋爱篇：<br/>　单位的，没胆量（怕被别人发现）；介绍的，没商量（要钱要房）；网上的，见死光（全是恐龙）。 <br/><br/>程序员四大悲：<br/>　请假遇减薪，辞职逢生病，升迁遇倒闭，出差在外地。&nbsp;&nbsp;<br/><br/> <br/><br/> <br/><br/> <br/><br/>讽刺与幽默：<br/><br/> <br/><br/>　　中国电信招聘程序员，程序员A、B、C前去面试。考官问他们程序出错的经历及如何对付时间这种数据。　 <br/><br/>　　A：我编过数万行程序，从来没出过错。我很细心，将时间精确到毫秒没任何问题。　 <br/><br/>　　B：程序出错在所难免，但我特别擅长在最短时间内将错误找出来并将其纠正。用四舍五入将时间精确到秒就足够了，精度太高影响运算速度。　 <br/><br/>　　C：迄今为止，我编的程序只出过一种错误：运算结果总是比正确结果大一些。至于时间，学过计算机的人都知道，计算机用二进制进行计算，而时间是六十进制，所以，处理时间这种数据有技术难点。我认为可用近似取值将问题简化，比如一分钟三十秒，就近似为三分钟这种可以被六十整除的数。　 <br/><br/>　　结果，程序员C被录用了。<br/><br/> 
]]>
</description>
</item>
<item>
<link>http://narmy.cn/linux/read.php/127.htm</link>
<title><![CDATA[xmonad  @ubuntu10.04]]></title> 
<author>lengyuex &lt;lengyuex@gmail.com&gt;</author>
<category><![CDATA[linux experience]]></category>
<pubDate>Mon, 03 May 2010 22:46:35 +0000</pubDate> 
<guid>http://narmy.cn/linux/read.php/127.htm</guid> 
<description>
<![CDATA[ 
	<span style="font-family: courier new;"><br/>Like the Big workspace in Xmonad. I think it is very suitable for programmers .<br/><br/>1. Install the Xmonad .<br/>2.<br/>~/.xmonad/xmonad.hs<br/><div class="code"><br/><br/><br/>import XMonad<br/>import XMonad.Hooks.DynamicLog<br/>import XMonad.Hooks.ManageDocks<br/>import XMonad.Util.Run(spawnPipe)<br/>import XMonad.Util.EZConfig(additionalKeys)<br/>import XMonad.Util.WorkspaceCompare<br/>import System.IO<br/><br/>myManageHook = composeAll<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#91; className =? &quot;Gimp&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&gt; doFloat<br/>&nbsp;&nbsp;&nbsp;&nbsp;, className =? &quot;Vncviewer&quot; --&gt; doFloat<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#93;<br/><br/>main = do<br/>&nbsp;&nbsp;&nbsp;&nbsp;xmproc &lt;- spawnPipe &quot;xmobar&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;xmonad $ defaultConfig<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123; manageHook = manageDocks &lt;+&gt; myManageHook -- make sure to include myManageHook definition from above<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;+&gt; manageHook defaultConfig<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, layoutHook = avoidStruts&nbsp;&nbsp;$&nbsp;&nbsp;layoutHook defaultConfig<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, logHook = dynamicLogWithPP $ xmobarPP<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123; ppOutput = hPutStrLn xmproc<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, ppTitle = xmobarColor &quot;green&quot; &quot;&quot; . shorten 50<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, modMask = mod4Mask&nbsp;&nbsp;&nbsp;&nbsp; -- Rebind Mod to the Windows key<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; `additionalKeys`<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#91;((controlMask, xK_Print), spawn &quot;sleep 0.2; scrot -s&quot;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, ((0, xK_Print), spawn &quot;scrot&quot;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, ((mod4Mask, xK_semicolon), sendMessage Expand)<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#93;<br/><br/><br/><br/></div><br/><br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">由于super+l用来expand 主窗口的键跟windows下的锁定冲突，所以我又设置了super+;也就是L键右面那个做为expand主窗口键。并且这里把Alt键改成了Super键,也是由于冲突的原因。</div></div><br/><br/>xmobar - ~/.xmobarrc<br/><div class="code"><br/>Config &#123; font = &quot;-misc-fixed-*-*-*-*-13-*-*-*-*-*-*-*&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , bgColor = &quot;black&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , fgColor = &quot;grey&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , position = TopW L 85<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , commands = &#91; Run Network &quot;wlan0&quot; &#91;&quot;-L&quot;,&quot;0&quot;,&quot;-H&quot;,&quot;32&quot;,&quot;--normal&quot;,&quot;green&quot;,&quot;--high&quot;,&quot;red&quot;&#93; 10<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, Run Cpu &#91;&quot;-L&quot;,&quot;15&quot;,&quot;-H&quot;,&quot;50&quot;,&quot;--normal&quot;,&quot;green&quot;,&quot;--high&quot;,&quot;red&quot;&#93; 10<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, Run Memory &#91;&quot;-t&quot;,&quot;Mem: %&quot;&#93; 10<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, Run Swap &#91;&#93; 10<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, Run Date &quot;%a %b %_d %Y %H:%M:%S&quot; &quot;date&quot; 10<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, Run StdinReader<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , sepChar = &quot;%&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , alignSep = &quot;&#125;&#123;&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , template = &quot;%StdinReader% &#125;&#123; %cpu% &#124; %memory% * %swap% &#124; %wlan0% &#124; %date%&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/><br/></div><br/>gdm - /usr/share/xsessions/xmonad.desktop<br/><br/><div class="code"><br/>&#91;Desktop Entry&#93;<br/>Encoding=UTF-8<br/>Name=XMonad<br/>Comment=Leightweight tiling window manager<br/>Exec=xmonad.start<br/>Icon=xmonad.png<br/>Type=XSession<br/></div><br/>xmonad.start is a custom script.<br/><br/>xmonad.start - /usr/local/bin/xmonad.start<br/><div class="code"><br/>#!/bin/bash<br/><br/>xrdb -merge .Xresources<br/><br/>trayer --edge top --align right --SetDockType true --SetPartialStrut true --expand true --width 15 --height 12 --transparent true --tint 0x000000 &amp;<br/><br/>gnome-screensaver<br/><br/>gnome-settings-daemon<br/><br/>if &#91; -x /usr/bin/gnome-power-manager &#93; ; then<br/>&nbsp;&nbsp; sleep 1<br/>&nbsp;&nbsp; gnome-power-manager<br/>fi<br/><br/>if &#91; -x /usr/bin/nm-applet &#93; ; then<br/>&nbsp;&nbsp; nm-applet --sm-disable &amp;<br/>fi<br/><br/>kmix --keepvisibility<br/><br/>#feh --bg-scale /mnt/archivio/foto/2008-2009-dublino/2009-04-10-stefano/hapenny-desktop.jpg &amp;<br/><br/>exec xmonad<br/><br/></div><br/><br/><br/>最后我再把windowmanager从metacity设成xmonad，就完成了。<br/><br/>&nbsp;&nbsp; $ gconftool-2 -t string -s /desktop/gnome/applications/window_manager/current xmonad<br/>&nbsp;&nbsp; $ gconftool-2 -t string -s /desktop/gnome/session/required_components/windowmanager xmonad<br/><br/><br/><br/>also, here is a step-by-step config<br/><a href="http://haskell.org/haskellwiki/Xmonad/Config_archive/John_Goerzen%27s_Configuration" target="_blank">http://haskell.org/haskellwiki/Xmonad/Config_archive/John_Goerzen%27s_Configuration</a><br/><br/>and here is a config archive .<br/><br/><a href="http://haskell.org/haskellwiki/Xmonad/Config_archive" target="_blank">http://haskell.org/haskellwiki/Xmonad/Config_archive</a><br/><br/>Enjoy.<br/></span><br/>
]]>
</description>
</item>
<item>
<link>http://narmy.cn/linux/read.php/126.htm</link>
<title><![CDATA[我的大学，我的先锋(毕业纪念册版)]]></title> 
<author>lengyuex &lt;lengyuex@gmail.com&gt;</author>
<category><![CDATA[随笔]]></category>
<pubDate>Sun, 02 May 2010 01:16:12 +0000</pubDate> 
<guid>http://narmy.cn/linux/read.php/126.htm</guid> 
<description>
<![CDATA[ 
	<span style="font-family: courier new;"><br/><br/><span style="color: red;"><span style="font-size: 24px;">我的大学，我的先锋</span></span><br/>毕设快成型了，毕业的味儿越来越浓了。四年的大学生活，回想这四年，有很多事依然记得十分清楚。回忆一下我的四年，把有些该写的写下来，做为对自己四年的一个认识和总结。<br/><br/>大一，2006年，大概8月27，28开学，我21号左右就到学校了，来学校的路确实挺长，在本部老乡那里住了几天，玩了几天，习惯了一下沈阳。27号到基础学院报到，那天下雨，记得很清楚。军训，上课，吃饭，睡觉。基本生活就是这样，平淡得像一湖死水，当时的感觉就是大学远没有想像中的那么美好，但是大一在基础学院时候还会幻想，基础学院不怎么样，校本部肯定比这里精彩多了，相信大部分人都这么想过，然而等后来到了本部才知道，基础学院是多么的安静，多么适合学习，生活，做学问。 其实对于平时的生活，没有多少可以讲出来的，好像也没有什么线索，都是很分散的东西。大一的时候大多的空闲时间我们都交给了网吧，也许大一留给我的记忆也就是那一堆网吧和网吧里各种有特点的人吧。清楚地记得校门右边的黄金网吧，没去过几次，机器太破了，刚开始一直在鑫洋，后来转到万山，网通家园也有卡，也常去，校门对面的青青网吧也就是偶尔上一次，那里环境也觉得不行，后来到了第二学期，常来常网和捷和网吧就基本上成了我们的固定上网地点了，那里大而且环境还不错，经常包宿一个班的人玩跑跑卡丁车。大一的第一学期，我挂科了，高等代数。说起原因，刚来的时候老乡告诉我说只要学了一点，肯定能过，我坚信了，而且想大学本来就是来玩的，后来第一学期期末考试，正好是1.4号，元旦放假是1.1-1.3号三天，我就整整地玩了3天，4号早上考高代，心里一点底都没有，3号晚上还在寝室上了几柱香，结果过年回家前还是知道了自己挂科的噩耗。再说计算机，大一从大概第一学期的军训结束，我无意中遇到了一本杂志《黑客X档案》，从此以后每期我都买，几乎没有一点计算机基础的我，似懂非懂的看了一年多。那时候觉得很好玩，跟着网上一群所谓的黑客爱好者一起黑别人网站，到别人网站上到处挂上很埋汰人的东西，抓肉鸡，偷窥别人计算机里面都有啥东西，要是偶尔黑一个两个的网站服务器，大家还要一起庆祝一下，我们还一起经营一些黑客网站，那时候跟网上很多不认识的人一起搞，觉得也挺有意思的，乐在其中，虽然现在想想当时确实挺无聊。还有一个就是周末的时候我们班的人一起去上网吧，一般都没有机器，机器确实很紧张，一般都是我们一起等，先等一个，让我先上，然后他们替我把风，我把网吧一楼的所有机器全整死机，终于有人受不了走了，我们班的就下去一楼坐下，然后我也下去一楼坐。每次都这样，后来还被网管抓到过一次，还责令让我以后不准进他这个网吧，当时跟一个同学在一起被网管骂，确实挺囧。就这样过完了大一。总结大一，除了玩，基本没有什么收获，虽然听了很多比较成功的学长的讲座，但大多左进右出，没听进去，就当是听着玩了，也没有几个人真正在意过。都说大一就是迷茫，说得一点也没有错，大一只是思想慢慢成熟的一个过渡期，要是早能看清楚，早能懂得张罗自己的喜好和前途就不致于荒废和迷茫了。<br/><br/>大二。大一结束的暑假，没有回家，在寝室里面上网，当时用学校的教育网。一个暑假混迹于先锋BT。可以算是真正与先锋开始结缘。至于注册，我也记不太清楚了，也可能老早就注册过了，时间记不清了，也不细究之。整个暑假也上过几次先锋论坛，但是当时并没有产生兴趣，到是在BT上，认识了一些人，最先认识的就是水天使，super超，他们都挺聊得开，后来又认识了allstar。当时对先锋网这个组织很陌生，一点都不明白，不过一个假期在BT上确实混得挺开心的，下资源，给别人共享资源，跟着大家灌水，不亦乐乎。大二上学期先锋网技术部招新，我问了一下allstar这是怎么回事，他说他可以推荐我去，我很开心，在他的推荐下我去面试了，在这其间又认识了xiaomao101,offar,寇鑫桐（桐哥的ID我一直都不知道），当然还有逆风，而当时不知道他叫逆风。面试的时候是offar面试的，当时我也不知道为什么没有让我进技术部，后来他们告诉我因为我碰过黑客方面的东西，因此这个人看起来比较有危险性。从那次开始，虽然我没有进去先锋网技术部，但是认识了不少先锋的人，接着渐渐地熟悉了先锋的一切，开始混迹于先锋论坛。记不得是啥时候电脑版的版主要毕业退休了，我申请了该版的VIP（现在的论坛已经不存在这个东西了），当时的VIP是做为版主候选人的一个位置，帮助版主处理本版事务。深入电脑版后，知道本版以前的版主有个叫晨风dicka的，知道了有一个先锋电脑维修组。后来在neufyj和云中漫步两个版主的代领下，我熟悉了当版主要干的事情，回答问题，回答别人提的一些电脑问题，我不会的就上网查，自己实践，说真的，当时确实挺水的。但是总是在尽力地回答别人提出的问题，而且很认真，我发现我有一个优点就是做事很认真，在这段时间里，对计算机有了很全面的认识，包括软件和硬件，虽然现在看来当时仅仅是很表面的，不深入的理解，但还是积累了不少的经验，至少来说熟悉了计算机，深深地喜欢上了计算机。我版主转正的时候，正好温柔的暴徒接替支点当上论坛管理员，按照先锋网的传统雪糕文化，大家都要请雪糕的，于是我们两个便合请了一次。具体日期已记不清了，晚上9点，四舍超市下面，那是我第一次参加先锋吃雪糕活动，第一次请雪糕，第一次见到了先锋上这么多以前不认识的人。那次，第一次见了暴徒，第一次见了晨风，还握了手，我对他说的是“久仰，久仰”。第一次见了neufyj,第一次见了云中漫步，第一次见了支点，第一次见了kuc-,第一次见了很多当时我叫不出来ID的人，其它的人有点记不清了，也就不提出来了。后来整个一学期，参加吃雪糕，经常跟xiaomao101,云中漫步，neufyj给别人修电脑，也忙得很开心。在这期间，应该说在计算机硬件上面有了全面的了解，虽然当时不明白其中的原理，但是已经很清楚了各个部件的作用，测试各个部件的问题，也有很大的收获。在吃雪糕的过程中又认识了啸啸，红中，老牛，礼服，斯小荔，蔷薇，还有我那学长班班，生活区的版主小老虎，哈哈。宋东蛟（ID英文的，想不起来了），哦，还有平淡生活，他以前不叫这个名儿，时间太长，以前的名儿我都记不得了。这些都是几年前的事了，有些人能想起来什么样儿也很难想起来ID了。记不起来的也就先不想了。这些都是先锋网的著名ID。&nbsp;&nbsp;后来到了第二学期，技术部又一次招新，因为已经都混熟了，技术部的人对我也比较了解，就直接让我进了技术部，没有面试，觉得也是理所当然的事情。当时ciwei6744（下简称ciwei）是站长，xiaomao101快要毕业了，于是开始了在技术部学习工作的一学期。Ciwei,真38无双（下简称38），还有bluefire,云游，花采大盗，跟我一起进技术部的还有lixm（下面我叫他学明，叫lixm不习惯），还有杉一，还有我就不说了，技术部很多人不常在论坛上说话，可能别人也不知道这些ID。在技术部，我主要是管理服务器，专业一点讲就是运维吧，跟网管差不多，这时候才是真正地开始正规地接触linux的开始，这可以说这是我人生的一个很大转折点，是将linux真正视为终身事业的开始。&nbsp;&nbsp;到现在该是仔细说说Linux的时候了，第一次接触这个玩意的时候是在大一玩黑客的时候，多多少少要了解一点，真正接触还是在大二第一学期，开始用ubuntu 6.04，后来7，8，都用了，后来Fedora 7,8 9,10。当初用得很乱，可以说完全是瞎折腾，熟悉环境而已。当时玩linux没有目的，很单纯地认为很新奇，很新鲜，玩这个跟别人不一样。当然用的时间长了自然就熟悉了，进技术部后跟xiaomao101,38学到了很多Linux的东西，交流的多了，懂的就越多了，要不怎么说Linux这东西是靠经验的东西呢。&nbsp;&nbsp;这学期结束的时候，团委按惯例都要请老站长们吃个饭，大家一起聚聚，这次吃过饭ciwei就要退了，下学期开始做毕业实习了，这次聚会上来的人还是比较多的，kuc-,有颜色的猫（老猫），朱巍，二郎，娃娃tree,allstar,offar,xiaomao101,bluefire都来了。之后38也离开了技术部，我做了站长，学明做了技术部部长。从这就开始在领导langhua，还有celine老师的指导下为先锋工作。Langhua给了我很多思想上的进步，我学到了很多，跟celine老师合作也很愉快。当然还有学生会、冰花通讯社、艺术团的几个同学，张，姜，陆，董，王等，跟他们也合作得很好，当然也学到了很多，包括怎样办先锋之夜这样的晚会等，每个人都有做事的风格和优点，有很多值得学习的地方。<br/><br/>大三。其它没有什么可说的地方，基本把全部精力都放到了先锋网上。先是招新，有很多先锋上的朋友们前来捧场，这次招新技术部又来了很多新成员，包括乐小嘎，什锦果冻，很可爱的“宝贝”还有我的下一任站长“天空sky”，“冻猪”等。面试很重要，学明主持面试，我在旁听。话说真正面试别人的时候才知道，做为一个面试官应该看重新人的哪一点，基本大家的技术都一个水平，没有直接可以拿出手的，也就只能看这个人够不够认真，够不够勤奋，人品有没有什么问题。第一学期最重要的自然是先锋卡拉OK大赛和先锋之夜。前期的准备和最后的成功举办，都离不开先锋上各位的辛苦劳动。其实这样一个活动，前期的准备才是令人难忘和感到幸福的。大家在一起吹气球，一起排练节目，那种气氛是我最喜欢的。其间又认识了很多人，盼盼，冉茜，凌风儿，不二，fancy_neu,土耳其，小不点，很久以前了，记不得啥时候认识的了，小宝的姥爷，小狼，sunyufan，苍蝇，子木，青豆花生，缘和，by1986,自动小狗，jojo,小冰，三天快乐，小喜等等。BT上一群人更是熟悉。从刚开始的drrobbie，酒剑仙，teamo，小七，sky大哥，C男，小流，恋爱，囧，雪乱飞，小夜，七海到后来的小舞，南哥，碧海浩天，包括后来的genii,jx,无名剑客，飞影等等。还有一些论坛和BT上熟识的人，我就不列了，大家心知肚明的都。话说主持办先锋之夜这样一个大型的活动确实在大学里是一个很难得的机会，很能锻炼人，很幸运地有了这样一个机会。&nbsp;&nbsp;又该说Linux了，大二暑假的时候跟ciwei,学明一起报了RHCT的班，学了一假期，Linux水平有了很大的提高，其间认识了很多爱好Linux的同学，很开心，尤其认识了付冲老师，我们都叫他冲哥，上他课的日子是我大学上过最好最快乐的课，也是大学收获最大听得最认真的课。大三的上学期通过了RHCT，下学期通过了RHCE。准备考RHCE的那段时间确实挺苦，几大本的英文材料，我至少看过了三遍，但是仍然忙得心里美美的，因为目标明确，兴趣浓厚，这是再好不过的了。这段时间给了我linux上丰富的经验和坚实的基础。&nbsp;&nbsp;&nbsp;&nbsp;再回到先锋，大三下学期开学，经过一寒假的改进，开学前两天，我跟学明连续干了两天一夜，将论坛，BT，先锋Home，重新改版了，还包括主站。全面的大换血，连服务器的架构和布局都重新做了一次，忙得很快乐，为大家带来了全新的先锋，倍感欣慰，当然也有骂声，不过那都无所谓的次要的，只要以后的先锋人走在我们铺的路上感觉舒服就是最大的安慰了，当时改版的时候能顶住压力就是坚信这一点。<br/><br/>大四。找工作，忙，先锋的活动参加的少了一些。不过先锋卡拉OK的时候我去了，先锋之夜我也去了，不过是做为评委和嘉宾去的，同去的还有老猫跟学明，跟老猫坐在一起，突然有一种前浪被拍死的感觉，老站长，被划为跟老猫是一类的人了。&nbsp;&nbsp;对于找工作，我们专业确实不太好找，期间投了很多简历，也面试了很多公司，对于我来说还算有一些优势，但是想找到自己真正喜欢的工作还是很伤脑筋的。有时候找工作就是碰运气，但是我觉得只有抓住每个机会才有可能找到自己喜欢的工作。像我，刚开始一直想做linux运维，突然一个机会来了，说我可以做linux内核研发，而在这之前我一直以为这是过几年再开始想的工作，这就是找工作的缘份。<br/><br/>总结四年，有得有失。没过英语四级，很遗憾，这在找工作的时候给自己减少了很大的一部分竞争力，成绩不好，没拿过奖学金，还挂过几科。但是找到了自己喜欢的方向，一直在自己喜欢的linux道路上努力，很自豪地说有很长一段时间晚上看书一直到凌晨2点左右，因此读了很多喜欢的而且很有用的书，四年认识了很多人，也学到了很多做人的道理，比以前处世稳重多了，更少了很多做技术不应该有的浮燥，总的来讲并没有得不偿失。<br/><br/>现在离校还有几个月，不至于那么伤感，但还是很感谢大学的同学，老师，感谢先锋一群可爱的人们，给我了大学生活的一半甚至一大半，这里也就能列列先锋的ID，简单说说还能记得清的事，说说经历和经验。但要细说，肯定篇赋不够。但愿大家毕业后都能有个自己喜欢的归宿吧。<br/><br/></span>
]]>
</description>
</item>
<item>
<link>http://narmy.cn/linux/read.php/125.htm</link>
<title><![CDATA[vim自己的IDE]]></title> 
<author>lengyuex &lt;lengyuex@gmail.com&gt;</author>
<category><![CDATA[C &#124;&#124; OS]]></category>
<pubDate>Sat, 01 May 2010 02:26:39 +0000</pubDate> 
<guid>http://narmy.cn/linux/read.php/125.htm</guid> 
<description>
<![CDATA[ 
	<span style="font-family: courier new;"><br/><br/><br/>生成tags文件、配置vi<br/>-------------------------------------------<br/>（1）进入源码所在目录：<br/># cd /usr/src/linux<br/>（2）生成针对源码的tags，因为ctags确省不把函数声明作为tag所以要加--c-types=+px（见注1）<br/># ctags -R --c-types=+px<br/>（3）在vi配置文件中加入生成的tags<br/># vi /etc/vim/vimrc<br/>set tags=/usr/src/linux/tags<br/><br/><br/><br/><br/>使用tag查找对象：<br/>-------------------------------------------<br/>ctags -R<br/>"-R"表示递归创建，也就包括源代码根目录下的所有子目录下的源程序。"tags"文件中包括这些对象的列表：<br/>(1)用#define定义的宏<br/>(2)枚举型变量的值<br/>(3)函数的定义、原型和声明<br/>(4)名字空间（namespace）<br/>(5)类型定义（typedefs）<br/>(6)变量（包括定义和声明）<br/>(7)类（class）、结构（struct）、枚举类型（enum）和联合（union）<br/>(8)类、结构和联合中成员变量或函数<br/><br/>vim用这个"tags"文件来定位上面这些做了标记的对象（见注1），下面介绍一下定位这些对象的方法：<br/><br/>1) 用命令行。在运行vim的时候加上"-t"参数，例如：<br/># vim -t foo_bar<br/>这个命令将打开定义"foo_bar"（变量或函数或其它）的文件，并把光标定位到这一行。<br/><br/>2) 在vim编辑器内用":ta"命令，例如：<br/>:ta foo_bar<br/><br/><br/>3) 最方便的方法是把光标移到变量名或函数名上，然后按下" Ctrl-]";用"Ctrl-o"退回原来的地方。用 Ctrl-]延着调用树向前跳转, 用Ctrl-t向回跳转<br/><br/>4) 分割窗口<br/>":tag"命令会将当前窗口的文件替换为包含新函数的文件。怎样才能同时查看两个文件呢？你可以使用 ":split"命令将窗口分开然后再用":tag"命令。vim 有个缩写命令可以做到这些：<br/>:stag tagname<br/>使用下面的命令可以分割当前窗口并跳转到光标下的标签:<br/>Ctrl-w-]<br/>如果指定了计数参数，新窗口将包含指定的那么多行。<br/><br/>5) 多个匹配<br/>当一个函数（或类中的方法）被定义多次， ":tags" 命令会跳转到第一处。如果在当前文件中存在匹配，那它将会被首先使用。 你现在可以跳转到同一个标签的其它匹配处：<br/>:tnext<br/>重复执行这个命令可以找到更多的匹配。如果存在很多匹配，你可以选择要跳转到哪一个：<br/>:tselect tagname<br/>vim 会为你展示一个选择列表：<br/># pri kind tag&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file<br/>1 F&nbsp;&nbsp; f&nbsp;&nbsp;&nbsp;&nbsp;mch_init&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os_amiga.c<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mch_init()<br/>2 F&nbsp;&nbsp; f&nbsp;&nbsp;&nbsp;&nbsp;mch_init&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os_mac.c<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mch_init()<br/>3 F&nbsp;&nbsp; f&nbsp;&nbsp;&nbsp;&nbsp;mch_init&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os_msdos.c<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mch_init(void)<br/>4 F&nbsp;&nbsp; f&nbsp;&nbsp;&nbsp;&nbsp;mch_init&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os_riscos.c<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mch_init()<br/>Enter nr of choice (<CR> to abort):<br/>你现在可以输入要跳转到的匹配代号（在第一列）。其它列的信息可以让你知道匹配在何处被定义。<br/>以用这些命令在各匹配的标签间移动：<br/>:tfirst&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 到第一个匹配<br/>:[count]tprevious&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 向前 [count] 个匹配<br/>:[count]tnext&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 向后 [count] 个匹配<br/>:tlast&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;到最后一个匹配<br/>如果没有指定，[count] 省缺为一。<br/><br/>6) 猜测标签名<br/>命令行补全是避免输入长标签名的好办法。只需输入开始的一部分然后按 <Tab>：<br/>:tag write_<Tab><br/>你会得到第一个匹配。如果这不是你想要的，重复输入 <Tab> 直到你找到正确的匹配。<br/><br/>有时你只知道一个函数名的一部分，或是你有很多以相同字符串开头而结尾不同的标记。这时你可以告诉vim使用一个模式来查找标签。<br/>假设你要跳转到一个包含 "block" 的标签。首先输入：<br/>:tag /block<br/>现在再利用命令行补全功能：输入 <Tab>。vim 会找到所有包含 "block" 的标签并使用第一个匹配。<br/>标签名前面的 "/" 告诉vim这不是一个确定的标签名而是一个模式。你可以利用有关查找模式的所有特性。举个列子，假设你要选择所有以 "write_" 开头的标签：<br/>:tselect /^write_<br/>"^" 指定标签以 "write_" 开头，否则在中间含有 "write_" 的标签名也会被找到。类似地，"$" 指定标签名结尾处的匹配。<br/><br/>7) 预览窗口<br/>当编辑含有函数调用的代码时，你需要使用正确的调用参数。要获知所要传递的值，你可以查看这个函数是如何定义的。标签机制对此十分适用。如果定义可在另一个窗口内显示那就更好了。对此我们可以利用预览窗口。<br/>打开一个预览窗口来显示函数 "write_char"：<br/>:ptag write_char<br/>vim 会打开一个窗口，跳转到 "write_char" 标签。然后它会回到原来的位置。这样你可以继续输入而不必使用 CTRL-w w命令在两个分割窗口移动光标。<br/>如果函数名出现在文本中，你可以用下面的命令在预览窗口中得到其定义：<br/>Ctrl-w-]<br/>用下面的命令关闭预览窗口：<br/>:pclose<br/><br/>要在预览窗口中编辑一个指定的文件，用 ":pedit" 。这在编辑头文件时很有用，比如：<br/>:pedit defs.h<br/>最后， "psearch" 可用来查找当前文件和任何包含文件中的单词并在预览窗口中显示匹配。这在使用没有标签文件的库函数时十分有用。例如：<br/>:psearch popen<br/>这会在预览窗口中显示含有 popen() 原型的 "stdio.h" 文件：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FILE&nbsp;&nbsp;&nbsp;&nbsp;*popen __P((const char *, const char *));<br/>你可以用 'previewheight' 选项指定预览窗口打开时的高度。<br/><br/><br/><br/><br/><br/>注：<br/>-------------------------------------------<br/>（1）<br/>--<LANG>-kinds=[+&#124;-]kinds 或者<br/>--<LANG>-types=[+&#124;-]kinds<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;<LANG> is case-insensitive and is one of the built-in language names (see the --list-languages option for a complete list).<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;The specific sets of flags recognized for each language, their meanings and defaults may be list using the --list-kinds option.<br/><br/># ctags --list-kinds<br/>C<br/>&nbsp;&nbsp;&nbsp;&nbsp;c classes<br/>&nbsp;&nbsp;&nbsp;&nbsp;d macro definitions<br/>&nbsp;&nbsp;&nbsp;&nbsp;e enumerators (values inside an enumeration)<br/>&nbsp;&nbsp;&nbsp;&nbsp;f function definitions<br/>&nbsp;&nbsp;&nbsp;&nbsp;g enumeration names<br/>&nbsp;&nbsp;&nbsp;&nbsp;l local variables [off]<br/>&nbsp;&nbsp;&nbsp;&nbsp;m class, struct, and union members<br/>&nbsp;&nbsp;&nbsp;&nbsp;n namespaces<br/>&nbsp;&nbsp;&nbsp;&nbsp;p function prototypes [off]<br/>&nbsp;&nbsp;&nbsp;&nbsp;s structure names<br/>&nbsp;&nbsp;&nbsp;&nbsp;t typedefs<br/>&nbsp;&nbsp;&nbsp;&nbsp;u union names<br/>&nbsp;&nbsp;&nbsp;&nbsp;v variable definitions<br/>&nbsp;&nbsp;&nbsp;&nbsp;x external variable declarations [off]<br/>（2）<br/>--- 对 c++<br/>--- ctags -R --language-force=c++ --c++-types=+px --verbose --extra=+q<br/>--- extra=+q 用来增加生成 Class::member 的形式, 默认没有这样就可以用 :ts CView::OnDraw 这种形式看<br/>--- 因为c++一些头文件不用.h所以要用--language-force<br/><br/>--- 对 java<br/>--- ctags -R --languages=java c:/jdk131/src<br/>--- 要把src.jar展开<br/><br/><br/>2.整好了ctags，一切都好办了。<br/><br/>再加上根据建立的tags的自动补全，一切都很完美。<br/>OmniCppComplete : C/C++ omni-completion with ctags database <br/><br/><a href="http://www.vim.org/scripts/script.php?script_id=1520" target="_blank">http://www.vim.org/scripts/script.php?script_id=1520</a><br/><br/>SuperTab : Do all your insert-mode completion with Tab!<br/><a href="http://www.vim.org/scripts/script.php?script_id=182" target="_blank">http://www.vim.org/scripts/script.php?script_id=182</a><br/><br/>再加一个taglist:<br/><br/>taglist.vim : Source code browser (supports C/C++, java, perl, python, tcl, sql, php, etc) <br/><a href="http://www.vim.org/scripts/script.php?script_id=273" target="_blank">http://www.vim.org/scripts/script.php?script_id=273</a><br/><a href="http://narmy.cn/linux/attachment.php?fid=33" target="_blank"><img src="http://narmy.cn/linux/attachment.php?fid=33" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><div class="code"><br/>let c_hi_identifiers = &#039;all&#039;<br/>let c_hi_libs = &#91;&#039;*&#039;&#93;<br/>let g:ctags_statusline = 1<br/><br/>syntax enable<br/>syntax on<br/>set nocp<br/>filetype plugin on<br/>set tags+=/path/to/tags<br/><br/>let generate_tags = 1<br/><br/>set noai&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;习惯关闭自动缩进<br/></div><br/></span>
]]>
</description>
</item>
<item>
<link>http://narmy.cn/linux/read.php/124.htm</link>
<title><![CDATA[makefile 手册摘要]]></title> 
<author>lengyuex &lt;lengyuex@gmail.com&gt;</author>
<category><![CDATA[C &#124;&#124; OS]]></category>
<pubDate>Tue, 27 Apr 2010 01:52:46 +0000</pubDate> 
<guid>http://narmy.cn/linux/read.php/124.htm</guid> 
<description>
<![CDATA[ 
	<span style="font-family: courier new;"><br/><br/><br/><span style="font-size: 24px;"><span style="color: red;">GUN make的执行过程分为两个阶段。</span></span><br/>第一阶段：读取所有的makefile文件（包括“MAKIFILES”变量指定的、指示符“include”指定的、以及命令行选项“-f(--file)”指定的makefile文件），内建所有的变量、明确规则和隐含规则，并建立所有目标和依赖之间的依赖关系结构链表。<br/>在第二阶段：根据第一阶段已经建立的依赖关系结构链表决定哪些目标需要更新，并使用对应的规则来重建这些目标。<br/><br/><span style="font-size: 24px;"><span style="color: red;">make的执行过程如下：</span></span><br/>1. 依次读取变量“MAKEFILES”定义的makefile文件列表<br/>2. 读取工作目录下的makefile文件（根据命名的查找顺序“GNUmakefile”，“makefile”，“Makefile”，首先找到那个就读取那个）<br/>3. 依次读取工作目录makefile文件中使用指示符“include”包含的文件<br/>4. 查找重建所有已读取的makefile文件的规则（如果存在一个目标是当前读取的某一个makefile文件，则执行此规则重建此makefile文件，完成以后从第一步开始重新执行）<br/>5. 初始化变量值并展开那些需要立即展开的变量和函数并根据预设条件确定执行分支<br/>6. 根据“终极目标”以及其他目标的依赖关系建立依赖关系链表<br/>7. 执行除“终极目标”以外的所有的目标的规则（规则中如果依赖文件中任一个文件的时间戳比目标文件新，则使用规则所定义的命令重建目标文件）<br/>8. 执行“终极目标”所在的规则<br/><br/><span style="font-size: 24px;"><span style="color: red;">变量取值</span></span><br/>变量定义解析的规则如下：<br/>IMMEDIATE = DEFERRED<br/>IMMEDIATE ?= DEFERRED<br/>IMMEDIATE := IMMEDIATE<br/>IMMEDIATE += DEFERRED or IMMEDIATE<br/>define IMMEDIATE<br/>DEFERRED<br/>Endef<br/>当变量使用追加符（+=）时，如果此前这个变量是一个简单变量（使用 :=定义的）则认为它是立即展开的，其它情况时都被认为是“延后”展开的变量。<br/><br/><span style="font-size: 24px;"><span style="color: red;">书写规则是我们需要注意的几点：</span></span><br/>1. 规则的命令部分有两种书写方式：a. 命令可以和目标：依赖描述放在同一行。命令在依赖文件列表后并使用分号（；）和依赖文件列表分开。b. 命令在目标：依赖的描述的下一行，作为独立的命令行。当作为独立的命令行时此行必须以[Tab]字符开始。在Makefile中，在第一个规则之后出现的所有以[Tab]字符开始的行都会被当作命令来处理。<br/>2. Makefile中符号“$”有特殊的含义（表示变量或者函数的引用），在规则中需要使用符号“$”的地方，需要书写两个连续的（“$$”）。<br/>3. 前边已提到过，对于Makefile中一个较长的行，我们可以使用反斜线“&#92;”将其书写到几个独立的物理行上。虽然make对Makefile文本行的最大长度是没有限制的，但还是建议这样做。不仅书写方便而且更有利于别人的阅读（这也是一个程序员修养的体现）。<br/><br/><br/><span style="font-size: 24px;"><span style="color: red;">wildcard使用：通配PATH下.o文件</span></span><br/>一般我们可以使用“$(wildcard *.c)”来获取工作目录下的所有的.c文件列表。复杂一些用法；可以使用“$(patsubst %.c,%.o,$(wildcard *.c))”，首先使用“wildcard”函数获取工作目录下的.c文件列表；之后将列表中所有文件名的后缀.c替换为.o。这样我们就可以得到在当前目录可生成的.o文件列表。因此在一个目录下可以使用如下内容的Makefile来将工作目录下的所有的.c文件进行编译并最后连接成为一个可执行文件：<br/>#sample Makefile<br/>objects := $(patsubst %.c,%.o,$(wildcard *.c))<br/>foo : $(objects)<br/>cc -o foo $(objects)<br/><br/><span style="font-size: 24px;"><span style="color: red;">@禁止命令回显</span></span><br/>如果规则的命令行以字符“@”开始，则make在执行这个命令时就不会回显这个将要被执行的命令。典型的用法是在使用“echo”命令输出一些信息时。如：<br/>@echo 开始编译XXX模块......<br/>执行时，将会得到“开始编译XXX模块......”这条输出信息。如果在命令行之前没有字符“@”，那么，make的输出将是：<br/>echo编译XXX模块......<br/>编译XXX模块......<br/><br/><span style="font-size: 24px;"><span style="color: red;">Makefile中命令行书写规则</span></span><br/>Makefile中书写在同一行中的多个命令属于一个完整的shell命令行，书写在独立行的一条命令是一个独立的shell命令行。因此：在一个规则的命令中，命令行“cd”改变目录不会对其后的命令的执行产生影响。就是说其后的命令执行的工作目录不会是之前使用“cd”进入的那个目录。如果要实现这个目的，就不能把“cd”和其后的命令放在两行来书写。而应该把这两条命令写在一行上，用分号分隔。这样它们才是一个完整的shell命令行。如：<br/>foo : bar/lose<br/>cd bar; gobble lose > ../foo<br/>如果希望把一个完整的shell命令行书写在多行上，需要使用反斜杠（&#92;）来对处于多行的命令进行连接，表示他们是一个完整的shell命令行。例如上例我们以也可以这样书写：<br/>foo : bar/lose<br/>cd bar; &#92;<br/>gobble lose > ../foo<br/><br/><span style="font-size: 24px;"><span style="color: red;">部分标准的伪目标和空目标命名：</span></span><br/><br/>all<br/>作为Makefile的顶层目标，一般此目标作为默认的终极目标。<br/><br/>clean<br/>这个伪目标定义了一组命令，这些命令的功能是删除所有由make创建的文件。<br/><br/>mostlyclean<br/>和“clean”伪目标功能相似。区别在于它所定义的删除命令不会全部删除由make生成的文件。比如说不需要删除某些库文件。<br/><br/>&#56256;distclean<br/>realclean<br/>clobber<br/><br/>同样类似于伪目标“clean”，但它们所定义的删除命令所删除的文件更多。可以包含非make创建的文件。例如：编译之前系统的配置文件、链接文件等。<br/><br/>install<br/>将make成功创建的可执行文件拷贝到shell 环境变量“PATH”指定的某个目录。典型的，应用可执行文件被拷贝到目录“/usr/local/bin”，库文件拷贝到目录“/usr/local/lib”目录下。<br/><br/>print<br/>打印出所有被更改的源文件列表。<br/><br/>tar<br/>创建一个tar文件（归档文件包）。<br/><br/>shar<br/>创建一个源代码的shell文档（shar文件）。<br/><br/>dist<br/>为源文件创建发布的压缩包，可以使各种压缩方式的发布包。<br/>&#56256;<br/>TAGS<br/>创建当前目录下所有源文件的符号信息（“tags”）文件，这个文件可被vim使用。<br/>&#56256; check<br/>&#56256; test<br/>对Makefile最后生成的文件进行检查。<br/>这些功能和目标的对照关系并不是GNU make规定的。你可以在Makefile中定义任何命名的伪目标。但是以上这些都被作约定，所有开源的工程中这些特殊的目标的命名都是按照这种约定来的。既然绝大多数程序员都遵循这种约定，自然我们也应该按照这种约定来做。否则在别人看来这样Makefile只能算一个样例，不能作为正式版本。<br/><br/></span>
]]>
</description>
</item>
<item>
<link>http://narmy.cn/linux/read.php/123.htm</link>
<title><![CDATA[SVNgoogle code]]></title> 
<author>lengyuex &lt;lengyuex@gmail.com&gt;</author>
<category><![CDATA[C &#124;&#124; OS]]></category>
<pubDate>Mon, 12 Apr 2010 14:32:45 +0000</pubDate> 
<guid>http://narmy.cn/linux/read.php/123.htm</guid> 
<description>
<![CDATA[ 
	前两天看到别的googlecode project ，突然想到自己的项目，于是马上把它放到了code上，每修改一次svn 一个新version。<br/><br/>太好了，以前一直没有发现，真是惭愧啊。<br/><br/><br/>subversion Ubuntu 下安装<br/><br/><a href="http://wiki.ubuntu.org.cn/SubVersion" target="_blank">http://wiki.ubuntu.org.cn/SubVersion</a><br/><br/>subversion Manual <br/><br/><a href="http://svnbook.red-bean.com/" target="_blank">http://svnbook.red-bean.com/</a>
]]>
</description>
</item>
<item>
<link>http://narmy.cn/linux/read.php/122.htm</link>
<title><![CDATA[我的大学，我的先锋]]></title> 
<author>lengyuex &lt;lengyuex@gmail.com&gt;</author>
<category><![CDATA[随笔]]></category>
<pubDate>Sat, 10 Apr 2010 02:18:37 +0000</pubDate> 
<guid>http://narmy.cn/linux/read.php/122.htm</guid> 
<description>
<![CDATA[ 
	我的大学，我的先锋<br/><br/>毕设快成型了，毕业的味儿越来越浓了。四年的大学生活，回想这四年里的事情，很多依然记得十分清楚。下面就以题目为主要内容，回忆一下我的四年，有些记不得当然也编不出来，有些不想说出来的当然也就只能藏在心里。<br/><br/>大一，2006年，好像是8月27，28开学，我大概21左右就到学校了，来学校的路确实挺长，在本部老乡那里住了几天，玩了几天，习惯了一下沈阳。27号到基础学院报到，那天下雨，记得很清楚。军训，上课，吃饭，睡觉。平淡，感觉大学远没有想像中的那么美好，但是大一在基础学院时候还会幻想，基础学院不怎么样，校本部肯定比这里精彩多了。呵呵 ，肯定大部分人都这么想过，结果后来到了本部才知道，基础学院是多么的安静，多么适合学习生活。 其实对于平时的生活，没有多少可以讲出来的，好像也没有什么线索，都是很分散的东西。大一的时候大多的空闲时间我们都交给了网吧，校门右边的黄金网吧，没去过几次，机器太破了，刚开始我一直在鑫洋，后来转到万山，网通家园也有卡，也常去，校门对面的青青网吧也就是偶尔上一次，那里环境也觉得不行，后来到了第二学期吧，常来常网和捷和网吧就基本上成了我们的固定上网地点了，大而且环境还不错，经常包宿一个班的人玩跑跑卡丁车。大一的第一学期，我挂科了，高等代数。说起原因，刚来的时候老乡告诉我说只要学了，肯定能过，我信了，后来第一学期期末考试，正好是1.4号，元旦放假是1.1-1.3号三天，我就整整地玩了3天，4号早上考高代，心里一点底都没有，想想3号晚上还在寝室上了几柱香，结果过年回家前还是知道了自己挂科的噩耗。再说计算机，大一从大概第一学期的军训结束，我无意中遇到了一本杂志《黑客X档案》，从此以后每期我都买，几乎没有一点计算机基础的我，似懂非懂的看了一年多。那时候觉得很好玩，跟着网上一群所谓的黑客爱好者一起黑别人网站，到别人网站上到处挂上很埋汰人的东西，抓肉机，偷窥别人计算机里面都有啥东西，要是偶尔黑一个两个的网站服务器，大家还要一起庆祝一下，我们还一起经营一些黑客网站，那时候跟网上很多不认识的人一起搞，觉得也挺有意思的，乐在其中，虽然现在想想当时挺无聊。还有一个就是周末的时候我们班的人一起去上网吧，一般都没有机器，机器确实很紧张，一般都是我们一起等，先等一个，让我坐下，然后他们替我把风，我把网吧一楼的所有机器全整死机，终于有人受不了走了，我们班的就下去一楼坐下，然后我也下去一楼坐。每次都这样，后来还被网管抓到过一次，还责令让我以后不准进他这个网吧，当时跟一个同学在一起被网管骂，确实挺囧。就这样过完了大一。<br/><br/>大二。大一结束的暑假，没有回家，在寝室里面上网，当时用的是校园网。一个暑假混迹于先锋BT。可以算是真正与先锋开始结缘。至于注册，我也记不太清楚了，也可能老早就注册过了，时间记不清了，不细究之。整个暑假也上过几次论坛，但是当时并没有产生兴趣，到是在BT上，认识了一些人，最先认识的就是水天使，super超，后来又认识了allstar。对先锋这个组织很陌生，一点都不懂，不过一个假期在BT上确实混得挺开心的。大二上学期先锋网技术部招新，我问了一下allstar这是怎么回事，他说他可以推荐我去，我很开心，在他的推荐下我去面试了，其间又认识了xiaomao101,offar,寇鑫桐（桐哥的ID我一直都不知道），当然还有逆风，当时不知道他叫逆风的。面试的时候是offar面试的，后来我也不知道为什么没有让我进技术部，后来他们告诉我因为我碰过黑客的东西，这个人看起来比较危险。从那次开始，虽然我没有进去先锋网技术部，但是认识了不少先锋的人，然后渐渐地熟悉了先锋的一切，开始混论坛。记不得是啥时候电脑版的版主要毕业退了，我申请了该版的VIP（现在的论坛已经不存在这个东西了），当时的VIP是做为版主候选人的一个位置，帮助版主处理本版事务。深入电脑版后，知道本版以前的版主有个叫晨风dicka的，知道了有一个先锋电脑维修组。后来在neufyj和云中漫步两个版主的代领下，我熟悉了当版主要干的事情，回答问题，回答别人提的一些电脑问题，我不会的就上网查，自己实践，说真的，当时确实挺水的。我版主转正的时候，正好温柔的暴徒正好接替支点当上论坛管理员，按理说，大家都要请雪糕的，于是我们两个决定合请。具体日期我记不清楚，晚上9点，四舍超市下面，那是我第一次参加先锋吃雪糕活动，第一次请雪糕，第一次见到了先锋上这么多以前不认识的人。那次，第一次见了暴徒，第一次见了晨风，还握了手，我对他说的是“久仰，久仰”。第一次见了neufyj,第一次见了云中漫步，第一次见了支点，第一次见了kuc-,第一次见了很多当时我叫不出来ID的人，其它的人有点记不清了，也就不提出来了。后来整个一学期，参加吃雪糕，经常跟xiaomao101,云中漫步，neufyj给别人修电脑，也忙得很开心。在吃雪糕的过程中又认识了啸啸，红中，老牛，礼服，斯小荔，蔷薇，还有我那学长班班，生活区的版猪小老虎，哈哈。宋东蛟（ID英文的，想不起来了），哦，还有平淡生活，他以前不叫这个名儿，时间太长，以前的名儿我都记不得了。这些都是几年前的事了，有些人能想起来什么样儿也很难想起来ID了。记不起来的先不想了。&nbsp;&nbsp;后来到了第二学期，技术部又一次招新，因为都很熟，对我也比较了解，就直接让我进了技术部，没有面试，呵呵 。当时ciwei6744（下简称ciwei）是站长，xiaomao101快要毕业了，于是开始了在技术部学习工作的一学期。Ciwei,真38无双（下简称38），哈哈，还有bluefire,云游，花采大盗，跟我一起进技术部的还有lixm（下面我叫他学明，叫lixm不习惯），还有杉一，还有我就不说了，技术部很多人不常在论坛上说话，可能别人也不知道这些ID。&nbsp;&nbsp;现在该是说说Linux的时候了，第一次接触这个玩意的时候是在大一玩黑客的时候，多多少少要了解一点，真正接触还是在大二第一学期，开始用ubuntu 6.04，后来7，8，都用了，后来Fedora 7,8 9,10。当初用得很乱，可以说完全是瞎折腾，熟悉环境而已。用的时间长了自然就熟悉了，进技术部后跟xiaomao101,38学到了很多Linux的东西，交流的多了，懂的就越多了，要不怎么说Linux这东西是靠经验的东西呢。记得学明当时想学Linux，要在自己机器上装一个ubuntu,遇到了点问题，我跟38到他寝室去帮他看，当时没有解决，很菜，那天雨下得很大。当然后来知道是驱动问题。&nbsp;&nbsp;这学期结束的时候，团委按惯例都要请老站长们吃个饭，大家一起聚聚，这次吃过饭ciwei就要退了，下学期开始做毕业实习了，这次聚会上来的人还是比较多的，kuc-,有颜色的猫（老猫），朱巍，二郎，娃娃tree,allstar,offar,xiaomao101,bluefire都来了。之后38也离开了技术部，我做了站长，学明做了技术部部长。从这就开始在领导langhua，还有celine老师的指导下为先锋工作。Langhua给了我很多思想上的进步，我学到了很多，跟celine老师合作也很愉快。当然还有学生会、艺术团的几个同学，张，姜，陆等，跟他们也合作得很好，当然也学到了很多，包括怎样办先锋之夜这样的晚会等。<br/><br/>大三。其它没有什么可说的地方，基本把全部精力都放到了先锋网上。先是招新，有很多先锋上的朋友们前来捧场，这次招新技术部又来了很多新成员，包括乐小嘎，什锦果冻，很可爱的“宝贝”还有我的下一任站长“天空sky”，“冻猪”等。第一学期最重要的自然是先锋卡拉OK大赛和先锋之夜。前期的准备和最后的成功举办，都离不开先锋上各位的辛苦劳动。觉得看到大家在一起吹气球，一起排练节目，那种气氛是我最喜欢的。其间又认识了很多人，盼盼，冉茜，凌风儿，不二，fancy_neu,土耳其，小不点，很久以前了，记不得啥时候认识的了，小宝的姥爷，小狼，sunyufan，苍蝇，子木，青豆花生，缘和，by1986,自动小狗，jojo,小冰，三天快乐，小喜等等。BT上一群人更是熟悉。从刚开始的drrobbie，酒剑仙，teamo，小七，sky大哥，C男，小流，恋爱，囧，雪乱飞，小夜，七海到后来的小舞，南哥，碧海浩天，包括后来的genii,jx,无名剑客，飞影等等。还有一些论坛和BT上熟识的人，我就不列了，大家心知肚明的都，哈哈。&nbsp;&nbsp;再说说Linux吧，大二暑假的时候跟ciwei,学明一起报了RHCT的班，学了一假期，Linux水平有了很大的提高，其间认识了很多爱好Linux的同学，很开心，尤其认识了冲哥，这么说吧，冲哥是我大学见到的最好的老师，没有“之一”，可惜至今仍没有帮冲哥找到对相。大三的上学期通过了RHCT，下学期通过了RHCE。&nbsp;&nbsp;&nbsp;&nbsp;再回到先锋，大三下学期开学，经过一寒假的改进，开学前两天，我跟学明连续干了两天一夜，将论坛，BT，先锋Home，重新改版了，哦，还包括主站。全面的大换血，连服务器的架构和布局都重新做了一次，忙得不亦乐乎，为大家带来了全新的先锋，倍感欣慰，当然也有骂声，不过那都无所谓的次要的，只要以后的先锋人走在我们铺的路上感觉舒服就是最大的安慰了，当时改版的时候能顶住压力就是相信这一点。<br/><br/><br/>大四。找工作，忙，先锋的活动参加的少了一些。不过先锋卡拉OK的时候我去了，先锋之夜我也去了，不过是做为评委和嘉宾去的，同去的还有老猫跟学明，跟老猫坐在一起，突然有一种前浪被拍死的感觉，都跟老猫是差不多的人了，汗了一下。到是晨风，退的时候跟我一起退的，他到是比我还老，哈哈。行了，基本差不多了。&nbsp;&nbsp;Btw，对于Linux，搞了这么长时间，给比我Linux经验少的一点建议，刚开始的时候学学shell，系统管理无可厚非，但是对于不想以后做运维的人来说，系统管理不需搞得太深，多搞搞开发比较好。另外对于C语言，我也不是什么高手，但我觉得在Linux上面做C开发有助于精通C，做VC达不到这种高度。如果觉得说得不对，完全可以置之不理。呵呵 。<br/>现在离校还有几个月，不至于那么伤感，但还是感谢大学的同学，感谢先锋一群可爱的人们，给我了大学生活的一半甚至一大半，这里也就能列列ID，要是细说各个ID的故事，那我也知道不少，经历过不少，但这要是写下来，怕我的毕业论文就该完不成了，要是谁有兴趣，可以单独请我吃饭我给你讲讲，哈哈。<br/>
]]>
</description>
</item>
<item>
<link>http://narmy.cn/linux/read.php/121.htm</link>
<title><![CDATA[转载:真正的编程高手-----激励计算机专业的大学生]]></title> 
<author>lengyuex &lt;lengyuex@gmail.com&gt;</author>
<category><![CDATA[有用的 &#124;&#124; 有趣的]]></category>
<pubDate>Wed, 07 Apr 2010 07:46:40 +0000</pubDate> 
<guid>http://narmy.cn/linux/read.php/121.htm</guid> 
<description>
<![CDATA[ 
	Bill Joy<br/><br/><br/>前任Sun的首席科学家，当年在Berkeley时主持开发了最早版本的BSD。他还是vi和csh的作者。当然，Csh Programming Considered Harmful 是另一个话题乐。据说他想看看自己能不能写个操作系统，就在三天里写了个自己的Unix, 也就是BSD的前身。当然是传说了，但足见他的功力。另一个传说是，1980年初的时候，DARPA让BBN在Berkley Unix里加上BBN开发的TCP/IP代码。但当时还是研究生的B伯伯怒了，拒绝把BBN TCP/IP加入BSD，因为他觉得BBN的TCP/IP写得不好。于是B伯伯出手了，端的是一箭封喉，很快就写出了高性能的伯克利版TCP/IP。当时BBN和DARPA签了巨额合同开发TCP/IP Stack，谁知他们的代码还不如一个研究生的好。于是他们开会。只见当时B伯伯穿个T-shirt出现在会议室(当时穿T-shirt不象现在，还是相当散漫的哈)。只见BBN问：你怎么写出来的？而B伯伯答：简单，你读协议，然后编程就行了。最令偶晕倒的是，B伯伯硕士毕业后决定到工业界发展，于是就到了当时只有一间办公室的Sun, 然后他就把Sparc设计出来乐... 象这种软硬通吃的牛人，想不佩服都不行的说。据Bill Joy的同事说，一般开会的时候B伯伯总是拿一堆杂志漫不经心地读。但往往在关键之处，B伯伯发言，直切要害，提出漂亮的构想，让同事们彻底崩溃。对了，他还是Java Spec和JINI的主要作者之一。<br/><br/>John Carmack<br/><br/><br/>ID Software的founder和Lead Programmer。上个月和一个搞图形的师兄聊天，他竟然不知道John Carmack, 也让偶大大地晕了一把。不过也许搞研究的和搞实战的多少有些隔吧。想必喜欢第一人称射击游戏的都知道J哥哥。90年代初只要能在PC上搞个小动画都能让人惊叹一番的时候，J哥哥就推出了石破天惊的Castle Wolfstein, 然后再接再励，doom, doomII, Quake...每次都把3-D技术推到极致。J哥哥的简历上说自己的专长是"Exhaust 3-D technology"，真是牛人之言不我欺的说。做J哥哥这样的人是很幸福的，因为各大图形卡厂家一有了新产品就要向他“进贡”，不然如果他的游戏不支持哪种卡，哪种卡基本就会夭折乐。当初MS的Direct3D也得听取他的意见，修改了不少API。当然，J哥哥在结婚前十数年如一日地每天编程14小时以上，也是偶们凡人望尘莫及的。对了，J哥哥高中肆业(?!)，可以说是自学成才。不过呢，谁要用这个例子来为自己学习不好辩护，就大错特错了。那Leonardo Da Vinci还是自学成才呢(人是私生子，不能上学)。普通人和天才还是有区别的。对了，其实偶们叫“达分奇”是相当不对的，因为Vinci是地名，而Da Vinci就是从Vinci来的人的意思。换句话说，Leonardo Da Vinci就是“从Vinci来的Leonardo”的意思。叫别人“Da Vinci”就不知所谓乐。嗯，扯远了，打住。<br/><br/>David Cutler<br/><br/><br/>VMS和Windows NT的首席设计师，去微软前号称硅谷最牛的kernel开发员。当初他和他的手下在微软一周内把一个具备基本功能的bootable kernel写出来，然后说："who can't write an OS in a week?"，也是牛气冲天的说。顺便说一句，D爷爷到NT3.5时，管理1500名开发员，自己还兼做设计和编程，不改coder本色啊。D爷爷天生脾气火爆，和人争论时喜欢双手猛击桌子以壮声势。:-) 日常交谈F-word不离口。他面试秘书时必问："what do you think of the word 'FUCK'?"，让无数美女刹羽而归。终于有一天，一个同样火爆的女面对这个问题脱口而出："That's my favorite word"。于是她被录取乐，为D爷爷工作到NT3.5发布。<br/><br/>Donald E. Knuth<br/><br/><br/>高爷爷其实用不着偶多说。学编程的不知道他就好像学物理的不知道牛顿，学数学的不知道欧拉，学音乐的不知道莫扎特，学Delphi的不知到Anders Hejlsberg，或者学Linux不知道Linus Torvalds一样，不可原谅啊。:-) 为了让文章完整，就再罗唆几句吧。高爷爷本科时就开始给行行色色的公司写各种稀奇古怪的编译器挣外快了。他卖给别人时收一两千美元，那些公司拿了code，加工一下卖出去就是上万上十万。不过也没见高爷爷不爽过，学者本色的说。想想那可是60年代初啊，高爷爷写编译器写多了，顺带就搞出了个Attribute Grammar和LR(k)，大大地造福后人啊。至于高爷爷在CalTech的编程比赛(有Alan Kay得众多高高手参加)总是第一，写的Tex到86年就code freeze，还附带2^n美分奖励等等都是耳熟能详，偶就不饶舌乐。顺便说一下，高老大爷是无可争议的写作高手。他给Concrete Mathematics写的前言可谓字字铿锵，堪为前言的典范。他的技术文章也是一绝，文风细致，解释精当，而且没有学究气，不失轻快跳脱。记得几年前读Concrete Mathematics，时不时开怀大笑，让老妈极其郁闷，觉得我nerdy到家，不可救药。其实呢，子非鱼，安知鱼之乐，更不知那完全是高爷爷的功劳。说到写作高手，不能不提Stephen A. Cook。他的文章当年就被我们的写作老师极力推荐，号称典雅文风的样本。库爷爷一头银发，身材颀长，总是面带谦和的微笑，颇有仙风道骨，正好和他的仙文相配的说。高爷爷其实还是开源运动的先驱。虽然他没有象Richard Stallman那样八方奔走，但他捐献了好多作品，都可以在网上看到，比如著名的Mathematical Writing，MMIXWare，The Tex Book等，更不用说足以让他流芳百世的Tex乐。<br/><br/>Ken Thompson<br/><br/><br/>C语言前身B语言的作者，Unix的发明人之一(另一个是Dennis M. Riche老大，被尊为DMR)，Belle(一个厉害的国际象棋程序)的作者之一，操作系统Plan 9的主要作者(另一个是大牛人Rob Pike, 前不久被google挖走了)。Ken爷爷也算是计算机历史上开天辟地的人物了。1969年还是计算机史前时代，普通人都认为只有大型机才能运行通用的操作系统，小型机只有高山仰止的份儿。至于用高级语言来写操作系统，更是笑谈。Ken爷爷自然不是池中物，于是他和DMR怒了，在1969年到1970间用汇编在PDP-7上写出了UNIX的第一个版本。他们并不知道，一场轰轰烈烈的UNIX传奇由此拉开了序幕。Ken爷爷在1971年又把Unix用C重写，于是C在随后20年成就了不知多少豪杰的梦想和光荣。Ken爷爷还有段佳话：装了UNIX的PDP-11最早被安装在Bell Lab里供大家日常使用。很快大家就发现Ken爷爷总能进入他们的帐户，获得最高权限。Bell Lab里的科学家都心比天高，当然被搞得郁闷无比。于是有高手怒了，跳出来分析了UNIX代码，找到后门，修改代码，然后重新编译了整个UNIX。就在大家都以为“这个世界清净了”的时候，他们发现Ken爷爷还是轻而易举地拿到他们的帐户权限，百思不解后，只好继续郁闷。谁知道这一郁闷，就郁闷了14年，直到Ken爷爷道出个中缘由。原来，代码里的确有后门，但后门不在Unix代码里，而在编译Unix代码的C编译器里。每次C编译器编译UNIX的代码，就自动生成后门代码。而整个Bell Lab的人，都是用Ken爷爷的C编译器。<br/><br/>Rob Pike<br/><br/><br/>AT&T Bell Lab前Member of Technical Staff，现在google研究操作系统。罗伯伯是Unix的先驱，是贝尔实验室最早和Ken Thompson以及Dennis M. Ritche开发Unix的猛人，UTF-8的设计人。他还在美国名嘴David Letterman的晚间节目上露了一小脸，一脸憨厚地帮一胖子吹牛搞怪。让偶佩服不已的是，罗伯伯还是1980年奥运会射箭的银牌得主。他也是个颇为厉害的业余天文学家，设计的珈玛射线望远镜差点被NASA用在航天飞机上。他还是两本经典，The Unix Programming Environment 和 The Practice of Programming 的作者之一。如果初学者想在编程方面精益求精，实在该好好读读这两本书。它们都有中文版的说。罗伯伯还写出了Unix下第一个基于位图的窗口系统，并且是著名的blit终端的作者。当然了，罗伯伯还是号称锐意革新的操作系统，Plan9，的主要作者。可惜的是，Plan9并没有引起多少人的注意。罗伯伯一怒之下，写出了振聋发聩的雄文 Systems Software Research is Irrelevant，痛斥当下系统开发不思进取，固步自封的弊病。虽然这篇文章是罗伯伯含忿出手，颇有偏激之词，但确实道出了系统开发的无奈：开发周期越来越长，代价越来越大，用户被统一到少数几个系统上，结果越来越多的活动是测量和修补，而真正的革新越来越少。就在罗伯伯郁闷之极的时候，google登门求贤来乐。如果说现在还有一家大众公司在不遗余力地把系统开发推向极致的话，也就是google乐。随便看看google的成果就知道了。具有超强容错和负载平衡能力的分布式文件系统GFS(现在能够用100,000台廉价PC搭起一个巨型分布系统，并且高效便宜地进行管理的系统也不多哈)，大规模机器学习系统(拼写检查，广告匹配，拼音搜寻。。。哪个都很牛的说)，更不用说处理海量并行计算的各式google服务了。Rob在System Software Research is Irrelevant里萧瑟地说现在没有人再关心系统研究的前沿成果了。想不到他错了，因为google关心。google网络了大批功成名就的牛人，还有大量初生牛犊般博士做开发，显然不是没事耍酷，而是因为它们的开发总是试图吸取系统研究的最新成果。想必Rob Pike在google很幸福。愿他做出更棒的系统。<br/><br/>Dennis M. Ritchie<br/><br/><br/>既然Ken Thompson是我的偶像，新闻组上人称DMR的Dennis M. Ritchie自然也是，毕竟两人共同缔造了UNIX，而Dennis几乎独力把C搞大(当然，C的前身是B，而B是Ken Thompson一手做出来的)。J D两人1983年分享图灵奖，是有史以来少数几个因工程项目得奖的工程师(本来是唯一的一对儿，但Alan Kay才因为SmallTalk得奖，所以就成了唯二的乐)。一个人一生能做出一个卓越的系统已经不易，DMR的C和UNIX长盛不衰近30年，至今生机勃勃，DMR此生可以无憾的说。D爷爷也算有家学渊源：他老爸在AT&T贝尔实验室工作了一辈子，并在电路设计方面卓有成就，还出了本颇有影响的书The Design of Switching Circuits，据说在交换理论和逻辑设计方面有独到的论述。当然，D爷爷和他老爸是不同时代的人：他老爸的研究成形于晶体管发明之前，而D爷爷的工作离了晶体管就玩儿不转乐。:-D不要看D爷爷搞出了C，其实他最爱的编程语言是Alef，在Plan9上运行，支持并行编程。Alef的语法和C相似，但数据类型和执行方式都和C大大不同。说到语言，D爷爷对后来人有非常中肯的建议：抱着学习的目的来开发你自己的语言，不要冀望于它被众人接受。这个建议不光对语言开发有用，也适用于其它大型系统的开发。别的不说，DMR后来领导自己的团队在1995年和1996分别推出了Plan9和Inferno操作系统，又用多少人知道呢？其实，D爷爷当初也没想过C会风行世界。他开发C的初衷和Eric S. Raymond在Cathedral and Bazaar里阐述的一样，就是要消除自己对现有工具的不爽之处。谁知D爷爷无心插柳，C竟然受到众多程序员的狂热拥戴，连D爷爷自己都大惑不解。在一次采访中D爷爷说大概那是因为C的抽象程度碰巧既满足了程序员的要求，又容易实现。当然C一度是Unix上的通用语言也是原因。但不管怎么说，D爷爷对编程语言出色的审美意识奠定了C广为流传的基础。最后八卦一下。D爷爷的业余爱好和NBA大牛Karl Malone一样：开卡车。不过D爷爷更喜欢开NASCAR，而KM独爱巨无霸。J D爷爷自称心中不供偶像，如果一定要说一个，那就是Ken Thompson了。现在Ken爷爷退休当飞机教练去了，而D爷爷当了贝尔实验室系统开发部的头，整日忙于开支票。他俩合作20年，屡屡创造历史。这段令人神往的佳话，也就长留你我心中乐。P.S.，很多人都以为Brian W. Kernighan是C的作者。其实BWK只是写了那本经典K&R C。据D爷爷说，他，Ken和Kernighan三人中，Kernighan最能写文章，他次之，而Ken写得最少；但说到编程，Ken爷爷才是当之无愧的老大。<br/><br/>Edsger Wybe Dijkstra<br/><br/><br/>就是E.W. Dijkstra. 一提到EWD，很多人就会想起找最短路径的Dijkstra Algorithm，就好像一提到Sir. Tony Hoare，就想起Quick Sort一样。其实这些个算法不过是两个牛人在他们职业生涯中最琐碎的贡献。比如Dijkstra算法，无非是戴爷爷在1956年为了展示新计算机ARMAC的计算能力，初试身手的成果，属于他的算法处女作。据戴爷爷自述，他搞出最短路径算法的时候连纸笔都没用。当时他和他老婆在阿姆斯特丹一家咖啡厅的阳台上晒太阳喝咖啡，突然就把这个算法想出来乐。而且当时的算法研究还比较原始，牛人们忙着用计算机搞数值计算，对离散算法不屑一顾。那时连一个象样的专注于离散算法的专业期刊都没有。戴爷爷于是推迟发表这个算法。直到1959年，他才把这个算法发表在Numerische Mathematik的创刊号上，权为捧场。:-) EWD在多个领域牛气冲天，端的是理论和编程两手硬的高手。只不过他的很多工作比较深刻，学校的老先生们觉得本科生接受不了，不给本科生讲而已。戴爷爷大概因为最短路径算法一战成名，于是有人请他参加另一台计算机X1的设计工作，并且把设计实时中断系统的任务派给了他。现在看来实时中断也许不算什么，但要知到，X1前根本就没有实时中断的概念。实现它简直就是一场豪赌。戴爷爷起初还不情愿，但经不住项目负责人Bram和Carel的轮番“吹捧”：我们知道实时中断让您工作变得非常困难，但象您这样的牛人肯定能做出来的说。结果戴爷爷被糖衣炮弹彻底击穿，接下了这个烫手山芋。两三年后，他不仅搞出了实时中断，还围绕这个写出了自己的博士论文，顺利戴上博士帽。让戴爷爷真正成名立万的还是在X1上开发的Algo60，最早的高级语言之一。戴爷爷没日没夜地工作了8个月，就搞出了Algo60，也因此获得了1972年的图灵奖。因为Algo60，戴爷爷发表了一篇石破天惊的文章：Recursive Programming，于是人们才知道，原来高级语言也可以高效地实现递归，原来从此以后，所有程序员都不可避免地和戴爷爷发明的一个词(应该说是概念)打交道：堆栈。而且Algo60还让戴爷爷深入地思考多道程序设计的问题，最终发明了每个系统程序员都绕不开的概念：semaphore。当然，戴爷爷总是把他发明的概念严格形式化，极具科学家本色的说。和这些成就想比，他提出的吃饭的哲学家问题，也就没什么好说的了。说来好笑，当时的大学(忘了哪所了)还是觉得戴爷爷没有受过正统的数学训练，也不是专门搞数值分析的，所以最后不太情愿地给了他一个教职。这种小挫折并不能妨碍象戴爷爷这样的牛人创造历史。他一边教数值分析(:-D)，一边开始开发一个新的操作系统，并培养计算机科学家。几年后，THE Multiprogramming System横空出世。THE是第一个支持松散耦合，显式同步的进程并由此使得严格证明系统没有死锁变得容易的操作系统。可惜戴爷爷任职的系不识货，还强行解散了他的研究小组(1972年戴爷爷给他的系主任说他得了图灵奖，系主任的第一反应是你们搞计算机就喜欢乱发奖)。这让戴爷爷相当郁闷，得了抑郁症。在极度郁闷之中，戴爷爷决定用写作来治疗自己的抑郁症。于是经典就诞生乐：Notes on Structured Programming。戴爷爷从此被尊为结构化编程的奠基人，而且他的抑郁症也被治好乐。EWD太牛，结果他的故事也太多。先到这里吧。1973起，他的故事就在美国发生了。<br/><br/>Anders Hejlsberg<br/><br/><br/>微软.NET的首席架构师，编程语言设计和实现的顶尖高手。他一手做出了Turbo Pascal，也是Delphi, J++(尤其是WFC)，C#和.NET的主要作者。这些作品的名字足以为他立传。作为一个程序员，我在这样的大师面前实在无语。生子当如Anders的说。李维的《Borland传奇》里已详细讲述了Anders的传奇故事，我就不用费舌了：<a href="http://java.mblogger.cn/iexploiter/posts/1505.aspx" target="_blank">http://java.mblogger.cn/iexploiter/posts/1505.aspx</a>。Artima上有Anders谈C#的系列访谈。MSDN上有一段Anders导游的录像。有兴趣可以去看看牛人的丰采。
]]>
</description>
</item>
</channel>
</rss>