﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-大道无亲 大象无形 大音希声 大巧若拙 大智若愚 大器晚成</title><link>http://www.cppblog.com/CornerZhang/</link><description>生命的隐喻：自我意识产生于躯体，躯体产生于食物，食物源于物质，物质源于太阳辐射能。
&lt;P&gt;http://cyberzei.spaces.live.com&lt;/P&gt;
</description><language>zh-cn</language><lastBuildDate>Sun, 05 Jul 2009 21:45:38 GMT</lastBuildDate><pubDate>Sun, 05 Jul 2009 21:45:38 GMT</pubDate><ttl>60</ttl><item><title>C代码中符合标准的方式输出中文</title><link>http://www.cppblog.com/CornerZhang/archive/2009/07/01/89011.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Wed, 01 Jul 2009 09:58:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2009/07/01/89011.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/89011.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2009/07/01/89011.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/89011.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/89011.html</trackback:ping><description><![CDATA[wchat_t str[40] = { L"我的英文名为Corner Zhang!\n" };
<br />
setlocale(LC_ALL, "chs');
<br />
wprintf(L"%s", str);<img src ="http://www.cppblog.com/CornerZhang/aggbug/89011.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2009-07-01 17:58 <a href="http://www.cppblog.com/CornerZhang/archive/2009/07/01/89011.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编程时经常使用到的标点符号列表!</title><link>http://www.cppblog.com/CornerZhang/archive/2009/07/01/89009.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Wed, 01 Jul 2009 09:44:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2009/07/01/89009.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/89009.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2009/07/01/89009.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/89009.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/89009.html</trackback:ping><description><![CDATA[Punctuation type:<br /> ~ -- waveline 波浪线 <br />! -- bang 叹号 <br />@ -- at ??? <br /># -- pond 井号 <br />$ -- dollar 美元符 <br />%-- percent 百分号 <br />^ -- accent 幂 <br />&amp; -- and 和 <br />* -- star 星号 <br />( -- open round 左括号<br />）-- close round 右括号 <br />+ -- plus 加 <br />- -- sub 减 <br />= -- equal 等于 <br />_ -- underline 下划线 <br />\ -- backslash 反斜线 <br />| -- vertical 竖线 <br />{ -- open brace 左花括号 <br />} -- close brace 右花括号 <br />[ -- open quad 左方括号 <br />] -- close quad 左方括号 <br />: -- colon 冒号 <br />; -- semicolon 分号 <br />" -- quote 引号 <br />' -- single quote 单引号 <br />? -- question 问号 <br />/ -- slash 斜线 <br />&lt; -- open angle 左尖括号 <br />&gt; -- close angle 右尖括号 <br />, -- comma 逗号 <br />. -- dot 点号<br /><br />还有空白符: <br />' ' -- space 空格<br />'\n' -- newline 换行<br />'\t' -- table 制表符<br />\r' -- return ？？？<img src ="http://www.cppblog.com/CornerZhang/aggbug/89009.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2009-07-01 17:44 <a href="http://www.cppblog.com/CornerZhang/archive/2009/07/01/89009.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的游戏引擎设计</title><link>http://www.cppblog.com/CornerZhang/archive/2009/05/03/81800.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Sun, 03 May 2009 15:12:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2009/05/03/81800.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/81800.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2009/05/03/81800.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/81800.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/81800.html</trackback:ping><description><![CDATA[<p>core – 包含 container, memory, allocator, timer, algorithms, multi-thread, byte-endian checking, math function, linear math,string,dictory,lexer,parser
</p><p>module stub – lunch and manage module systems, like rendersytem/soundsystem … (module 就是对应windows下的dll, linux下的so)
</p><p>framework – 含有整个游戏引擎的条件编译宏，版本信息，和module的定义接口, 等等
</p><p>rendersystem的实现
</p><p>soundsystem的实现
</p><p>inputsystem的实现
</p><p>networksystem的实现
</p><p>resourcesystem的实现 – 统一的资源管理系统
</p><p>filesystem的实现 – 文件的读写,和打包
</p><p>game的实现
</p><p>[需要的时候再加入physics和AI的模块]</p><img src ="http://www.cppblog.com/CornerZhang/aggbug/81800.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2009-05-03 23:12 <a href="http://www.cppblog.com/CornerZhang/archive/2009/05/03/81800.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Unreal Engine (虚幻) 开发的游戏列表</title><link>http://www.cppblog.com/CornerZhang/archive/2009/04/30/81585.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Thu, 30 Apr 2009 10:02:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2009/04/30/81585.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/81585.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2009/04/30/81585.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/81585.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/81585.html</trackback:ping><description><![CDATA[Unreal Engine 1:<br /> Deus Ex （2000） Ion Storm <br />Rune （2000） Human Head Studios <br />Clive Barker's Undying （2001） Dreamworks Interactive （是不是觉得很眼熟） <br />X-COM：Enforcer （2001） MicroProse <br /><br />Unreal Engine 2: <br />LineageII （2002）NC Soft -- 3D 网游 <br />Tom Clancy’s Splinter Cell （2002）Ubisoft <br />Deus Ex：Invisible War （2003）Ion Storm <br />Tom Clancy’s Rainbow Six 3：Reaven Shield （2003）Ubisoft <br />XIII （2003）Ubisoft Thief：Deadly Shadows （2004）Ion Storm <br />Tom Clancy’s Rainbow Six 3：Athena Sword （2004）Ubisoft <br />Tom Clancy’s Splinter Cell：Pandora Tomorrow（2004）Ubisoft <br />Tribes：Venegeance （2004）Irrational Games <br />Advent Rising （2005）GlyphX Games Brother <br />In Arms：Road to Hill 30 （2005）Gearbox Software <br />Jinyong Online 2 （2005）Soft World <br />Star Wars：Repubilc Commando （2005）LucasArts -- 3D 网游 <br />SWAT 4 （2005）Irrational Games <br />Tom Clancy’s Splinter Cell：Chaos Theory （2005）Ubisoft <br />Red Steel （2006）Ubisoft <br />Tom Clancy’s Splinter Cell：Double Agent （2006）Ubisoft <br />Tom Clancy’s Ghost Recon 2 （2006）Ubisoft <br />Tom Clancy’s Ghost Recon Advanced Warfighter （2006）Ubisoft <br />Huang Yi Online （2007）Soft World -- 3D 网游 <br />Ragnarok Online 2：The Gate of the World （2007）Gravity -- 3D 网游 <br />Tom Clancy’s Splinter Cell：Conviction （2008）Ubisoft <br /><br />Unreal Engine 3: <br />Tom Clancy’s Rainbow Six：Vegas （2006）Ubisoft <br />BioShock （2007）2K Bastion/2K Australia <br />Lost Odyssey （2007）Miswalker <br />Medal of Honor：Airborns （2007）Electronic Arts <br />Stranglehold （2007）Midway Chicago<img src ="http://www.cppblog.com/CornerZhang/aggbug/81585.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2009-04-30 18:02 <a href="http://www.cppblog.com/CornerZhang/archive/2009/04/30/81585.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(分享) 什么是游戏引擎? What ... Game Engine</title><link>http://www.cppblog.com/CornerZhang/archive/2009/04/14/79844.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Mon, 13 Apr 2009 17:10:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2009/04/14/79844.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/79844.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2009/04/14/79844.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/79844.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/79844.html</trackback:ping><description><![CDATA[<p>以下是摘自日本著名杂志《FAMI通》游戏中文版评论杂志</p>
		<p>在阅读各种游戏介绍的时候我们常常会碰见“引擎”（Engine）这个单词，引擎在游戏中究竟起着什么样的作用？它的进化对于游戏的发展产生了哪些影响？希望下面这篇文章能为大家释疑。</p>
		<p>一、什么是引擎</p>
		<p>我们可以把游戏的引擎比作赛车的引擎，大家知道，引擎是赛车的心脏，决定着赛车的性能和稳定性，赛车的速度、操纵感这些直接与车手相关的指标都是建立在引擎的基础上的。游戏也是如此，玩家所体验到的剧情、关卡、美工、音乐、操作等内容都是由游戏的引擎直接控制的，它扮演着中场发动机的角色，把游戏中的所有元素捆绑在一起，在后台指挥它们同时、有序地工作。简单地说，引擎就是“用于控制所有游戏功能的主程序，从计算碰撞、物理系统和物体的相对位置，到接受玩家的输入，以及按照正确的音量输出声音等等。”</p>
		<p>可见，引擎并不是什么玄乎的东西，无论是2D游戏还是3D游戏，无论是角色扮演游戏、即时策略游戏、冒险解谜游戏或是动作射击游戏，哪怕是一个只有1兆的小游戏，都有这样一段起控制作用的代码。经过不断的进化，如今的游戏引擎已经发展为一套由多个子系统共同构成的复杂系统，从建模、动画到光影、粒子特效，从物理系统、碰撞检测到文件管理、网络特性，还有专业的编辑工具和插件，几乎涵盖了开发过程中的所有重要环节，以下就对引擎的一些关键部件作一个简单的介绍。首先是光影效果，即场景中的光源对处于其中的人和物的影响方式。游戏的光影效果完全是由引擎控制的，折射、反射等基本的光学原理以及动态光源、彩色光源等高级效果都是通过引擎的不同编程技术实现的。</p>
		<p>其次是动画，目前游戏所采用的动画系统可以分为两种：一是骨骼动画系统，一是模型动画系统，前者用内置的骨骼带动物体产生运动，比较常见，后者则是在模型的基础上直接进行变形。引擎把这两种动画系统预先植入游戏，方便动画师为角色设计丰富的动作造型。引擎的另一重要功能是提供物理系统，这可以使物体的运动遵循固定的规律，例如，当角色跳起的时候，系统内定的重力值将决定他能跳多高，以及他下落的速度有多快，子弹的飞行轨迹、车辆的颠簸方式也都是由物理系统决定的。</p>
		<p>碰撞探测是物理系统的核心部分，它可以探测游戏中各物体的物理边缘。当两个3D物体撞在一起的时候，这种技术可以防止它们相互穿过，这就确保了当你撞在墙上的时候，不会穿墙而过，也不会把墙撞倒，因为碰撞探测会根据你和墙之间的特性确定两者的位置和相互的作用关系。</p>
		<p>渲染是引擎最重要的功能之一，当3D模型制作完毕之后，美工会按照不同的面把材质贴图赋予模型，这相当于为骨骼蒙上皮肤，最后再通过渲染引擎把模型、动画、光影、特效等所有效果实时计算出来并展示在屏幕上。渲染引擎在引擎的所有部件当中是最复杂的，它的强大与否直接决定着最终的输出质量。</p>
		<p>引擎还有一个重要的职责就是负责玩家与电脑之间的沟通，处理来自键盘、鼠标、摇杆和其它外设的信号。如果游戏支持联网特性的话，网络代码也会被集成在引擎中，用于管理客户端与服务器之间的通信。</p>
		<p>通过上面这些枯燥的介绍我们至少可以了解到一点：引擎相当于游戏的框架，框架打好后，关卡设计师、建模师、动画师只要往里填充内容就可以了。因此，在3D游戏的开发过程中，引擎的制作往往会占用非常多的时间，《马科斯·佩恩》的MAX-FX引擎从最初的雏形Final Reality到最终的成品共花了四年多时间，LithTech引擎的开发共花了整整五年时间，耗资700万美元，Monolith公司（LithTech引擎的开发者）的老板詹森·霍尔甚至不无懊悔地说：“如果当初意识到制作自己的引擎要付出这么大的代价的话，我们根本就不可能去做这种傻事。没有人会预料得到五年后的市场究竟是怎样的。”</p>
		<p>正是出于节约成本、缩短周期和降低风险这三方面的考虑，越来越多的开发者倾向于使用第三方的现成引擎制作自己的游戏，一个庞大的引擎授权市场已经形成。</p>
		<p>二、引擎的进化</p>
		<p>曾经有一段时期，游戏开发者关心的只是如何尽量多地开发出新的游戏并把它们推销给玩家。尽管那时的游戏大多简单粗糙，但每款游戏的平均开发周期也要达到8到10个月以上，这一方面是由于技术的原因，另一方面则是因为几乎每款游戏都要从头编写代码，造成了大量的重复劳动。渐渐地，一些有经验的开发者摸索出了一条偷懒的方法，他们借用上一款类似题材的游戏中的部分代码作为新游戏的基本框架，以节省开发时间和开发费用。根据马老先生的生产力学说，单位产品的成本因生产力水平的提高而降低，自动化程度较高的手工业者最终将把那些生产力低下的手工业者淘汰出局，引擎的概念就是在这种机器化作业的背景下诞生的。</p>
		<p>每一款游戏都有自己的引擎，但真正能获得他人认可并成为标准的引擎并不多。纵观九年多的发展历程，我们可以看出引擎最大的驱动力来自于3D游戏，尤其是3D射击游戏。尽管像 Infinity这样的2D引擎也有着相当久远的历史，从《博德之门》（Baldur’s Gate）系列到《异域镇魂曲》（Planescape：Torment）、《冰风谷》（Icewind Dale）直至今年夏天将要发布的《冰风谷2》，但它的应用范围毕竟局限于“龙与地下城”风格的角色扮演游戏，包括颇受期待的《夜在绝冬城》（Neverwinter Nights）所使用的Aurora引擎，它们都有着十分特殊的使用目的，很难对整个引擎技术的发展起到推动作用，这也是为什么体育模拟游戏、飞行模拟游戏和即时策略游戏的引擎很少进入授权市场的原因，开发者即便使用第三方引擎也很难获得理想的效果，采用《帝国时代2》（Age of Empires）引擎制作的《星球大战：银河战场》（Star Wars：Galactic Battleground）就是一个最好的例子。</p>
		<p>因此，下面对引擎的历史回顾将主要围绕动作射击游戏的变迁展开，动作射击游戏同3D引擎之间的关系相当于一对孪生兄弟，它们一同诞生，一同成长，互相为对方提供着发展的动力。</p>
		<p>引擎的诞生（1992年~1993年）</p>
		<p>1992年，3D Realms公司/Apogee公司发布了一款只有2兆多的小游戏——《德军司令部》（Wolfenstein 3D），稍有资历的玩家可能都还记得初接触它时的兴奋心情，用“革命”这一极富煽动色彩的词语也无法形容出它在整个电脑游戏发展史上占据的重要地位。这部游戏开创了第一人称射击游戏的先河，更重要的是，它在X轴和Y轴的基础上增加了一根Z轴，在由宽度和高度构成的平面上增加了一个向前向后的纵深空间，这根 Z轴对那些看惯了2D游戏的玩家造成的巨大冲击可想而知。</p>
		<p>Wolfenstein 3D引擎的作者是大名鼎鼎的约翰·卡马克，这位id Software公司的首席程序师正是凭借这款Wolfenstein 3D引擎在游戏圈里站稳了脚跟。事实上，《德军司令部》并非第一款采用第一人称视角的游戏，在它发售前的几个月，Origin公司就已经推出了一款第一人称视角的角色扮演游戏——《创世纪：地下世界》（Ultima Underworld），这款角游戏采用了类似的技术，但它与Wolfenstein 3D引擎之间有着相当大的差别，举例来说，《地下世界》的引擎支持斜坡，地板和天花板可以有不同的高度，分出不同的层次，玩家可以在游戏中跳跃，可以抬头低头，这些特性Wolfenstein 3D引擎都无法做到，而且从画面上看，《德军司令部》更接近漫画风格而不是传统的像素画面。</p>
		<p>尽管从技术细节上看，Wolfenstein 3D引擎比不上《创世纪：地下世界》的引擎，但它却更好地利用了第一人称视角的特点，快速火爆的游戏节奏使人们一下子记住了“第一人称射击游戏”这个单词，而不是“第一人称角色扮演游戏”。《德军司令部》后来还发布过一款名义上的续集——《三元的崛起》（Rise of the Triad），这款游戏在Wolfenstein 3D引擎的基础上增加了许多重要特性，包括跳跃和抬头低头等动作。</p>
		<p>引擎诞生初期的另一部重要游戏同样是出自id Software公司的一款非常成功的第一人称射击游戏——《毁灭战士》（Doom）。Doom引擎在技术上大大超越了Wolfenstein 3D引擎，《德军司令部》中的所有物体大小都是固定的，所有路径之间的角度都是直角，也就是说你只能笔直地前进或后退，这些局限在《毁灭战士》中都得到了突破。尽管游戏的关卡还是维持在2D平面上进行制作，没有“楼上楼”的概念，但墙壁的厚度可以为任意，并且路径之间的角度也可以为任意，这使得楼梯、升降平台、塔楼和户外等各种场景成为可能。</p>
		<p>由于Doom引擎本质上依然是二维的，因此可以做到同时在屏幕上显示大量角色而不影响游戏的运行速度，这一特点为游戏创造出了一种疯狂刺激的动作风格，在这方面迄今为止大约只有《英雄萨姆》（Serious Sam）系列能与之相比，除此之外还没有哪款3D引擎能在大批敌人向你涌来的时候依然保持游戏的流畅，这也是为什么如今市面上的大部分第一人称射击游戏都在积极地培养玩家的战术运用能力、提高玩家的射击准确率而拒绝滥砍滥杀的主要原因之一。值得一提的是，尽管Doom引擎缺乏足够的细节度，但开发者仍然在《毁灭战士》中表现出了惊人的环境效果，其纯熟的设计技巧实在令人赞叹。</p>
		<p>不过更值得纪念的是，Doom引擎是第一个被用于授权的引擎。1993年底，Raven公司采用改进后的Doom引擎开发了一款名为《投影者》（ShadowCaster）的游戏，这是游戏史上第一例成功的嫁接手术。1994年Raven公司采用Doom引擎开发《异教徒》（Heretic），为引擎增加了飞行的特性，成为跳跃动作的前身。1995年Raven 公司采用Doom引擎开发《毁灭巫师》（Hexen），加入了新的音效技术、脚本技术以及一种类似集线器的关卡设计，使你可以在不同关卡之间自由移动。 Raven公司与id Software公司之间的一系列合作充分说明了引擎的授权无论对于使用者还是开发者来说都是大有裨益的，只有把自己的引擎交给更多的人去使用才能使引擎不断地成熟起来。</p>
		<p>《毁灭战士》系列本身就相当成功，大约卖了350万套，而授权费又为id Software公司带来了一笔可观的收入。在此之前引擎只是作为一种自产自销的开发工具，从来没有哪家游戏商考虑过依靠引擎赚钱，Doom引擎的成功无疑为人们打开了一片新的市场。</p>
		<p>
				<br />引擎的转变（1994年~1997年）</p>
		<p>在引擎的进化过程中，肯·西尔弗曼于1994年为3D Realms公司开发的Build引擎是一个重要的里程碑，Build引擎的“肉身”就是那款家喻户晓的《毁灭公爵》（Duke Nukem 3D）。《毁灭公爵》已经具备了今天第一人称射击游戏的所有标准内容，如跳跃、360度环视以及下蹲和游泳等特性，此外还把《异教徒》里的飞行换成了喷气背包，甚至加入了角色缩小等令人耳目一新的内容。在Build引擎的基础上先后诞生过14款游戏，例如《农夫也疯狂》（Redneck Rampage）、《阴影武士》（Shadow Warrior）和《血兆》（Blood）等，还有台湾艾生资讯开发的《七侠五义》，这是当时（至今依然是）国内不多的几款3D射击游戏之一。Build 引擎的授权业务大约为3D Realms公司带来了一百多万美元的额外收入，3D Realms公司也由此而成为了引擎授权市场上的第一个“暴发户”。不过从总体来看，Build引擎并没有为3D引擎的发展带来任何质的变化，突破的任务最终由id Software公司的《雷神之锤》（Quake）完成了。</p>
		<p>《雷神之锤》紧跟在《毁灭公爵》之后发售，两者孰优孰劣一时之间成为玩家的热门话题。从内容的精彩程度来看《毁灭公爵》超过《雷神之锤》不少，但从技术的先进与否来看，《雷神之锤》是毫无疑问的赢家。Quake引擎是当时第一款完全支持多边形模型、动画和粒子特效的真正意义上的3D引擎，而不是Doom、Build那样的2.5D引擎。此外Quake引擎还是连线游戏的始作俑者，尽管几年前的《毁灭战士》也能通过调制解调器连线对战，但最终把网络游戏带入大众的视野之中的是《雷神之锤》，是它促成了电子竞技产业的发展。</p>
		<p>一年之后，id Software公司推出《雷神之锤2》，一举确定了自己在3D引擎市场上的霸主地位。《雷神之锤2》采用了一套全新的引擎，可以更充分地利用3D加速和 OpenGL技术，在图像和网络方面与前作相比有了质的飞跃，Raven公司的《异教徒2》（Heretic II）和《军事冒险家》（Soldier of Fortune）、Ritual公司的《原罪》（Sin）、Xatrix娱乐公司的《首脑：犯罪生涯》（Kingpin：Life of Crime）以及离子风暴工作室去年夏天刚刚发布的《安纳克朗诺克斯》（Anachronox）都采用了Quake II引擎。</p>
		<p>Quake II引擎的授权模式大致如下：基本许可费从40万美元到100万美元不等，版税金视基本许可费的多少而定，40万美元的许可费大约需提取10%以上的版税金，100万美元的许可费则提取很少一部分版税金。这样算下来，《雷神之锤2》通过引擎授权所获得的收入至少有一千万美元，尽管游戏本身的销售业绩比起《毁灭战士》来要差很多，大约卖了110多万套，收入在4500万美元左右，但在授权金这一块它所获得的盈利显然要远远高于《毁灭战士》，此时的引擎已经从一种单纯的工具变成了一块令人垂涎欲滴的肥肉。</p>
		<p>俗话说“一个巴掌拍不响”，没有实力相当的竞争者，任何市场都无法发展起来的。正当 Quake II独霸整个引擎市场的时候，Epic Megagames公司（即现在的Epic游戏公司）的《虚幻》（Unreal）问世了。毫不夸张，第一次运行这款游戏的时候，我的确被眼前的画面惊呆了，尽管当时只是在300x200的分辨率下运行的这款游戏（四大悲事之一：玩游戏机器不够劲）。除了精致的建筑物外，游戏中的许多特效即便在今天看来依然很出色，荡漾的水波，美丽的天空，庞大的关卡，逼真的火焰、烟雾和力场等效果。从单纯的画面效果来看，《虚幻》是当之无愧的佼佼者，其震撼力完全可以与人们第一次见到《德军司令部》时的感受相比。 Unreal引擎可能是使用最广的一款引擎，在推出后的两年之内就有18款游戏与Epic公司签订了许可协议，这还不包括Epic公司自己开发的《虚幻》资料片《重返纳帕利》，其中比较近的几部作品如第三人称动作游戏《北欧神符》（Rune）、角色扮演游戏《杀出重围》（Deus Ex）以及永不上市的第一人称射击游戏《永远的毁灭公爵》（Duke Nukem Forever），这些游戏都曾经或将要获得不少好评。</p>
		<p>Unreal 引擎的应用范围不限于游戏制作，还涵盖了教育、建筑等其它领域。Digital Design公司曾与联合国教科文组织的世界文化遗产分部合作采用Unreal引擎制作过巴黎圣母院的内部虚拟演示，Zen Tao公司采用Unreal引擎为空手道选手制作过武术训练软件，另一家软件开发商Vito Miliano公司也采用Unreal引擎开发了一套名为“Unrealty”的建筑设计软件，用于房地产的演示。</p>
		<p>这款与《雷神之锤2》同时代的引擎经过不断的更新，至今依然活跃在游戏市场上，丝毫没有显出老迈的迹象，实属难得</p>
		<p>引擎的革命（1998年~2000年）</p>
		<p>游戏的图像发展到《虚幻》这里已经达到了一个天花板的高度，接下去的发展方向很明显不可能再朝着视觉方面进行下去。前面说过，引擎技术对于游戏的作用并不仅局限于画面，它还影响到游戏的整体风格，例如，所有采用Doom引擎制作的游戏，无论是《异教徒》还是《毁灭巫师》，都有着相似的内容，甚至连情节设定都如出一辙。玩家开始对端着枪跑来跑去的单调模式感到厌倦，开发者们不得不从其它方面寻求突破，由此掀起了第一人称射击游戏的一个新的高潮。</p>
		<p>两部划时代的作品同时出现在1998年——Valve公司的《半条命》（Half-Life）和LookingGlass工作室的《神偷：暗黑计划》（Thief：The Dark Project），尽管此前的《系统震撼》（System Shock）等游戏也为引擎技术带来过许多新的特性，但没有哪款游戏能像《半条命》和《神偷》那样对后来的作品以及引擎技术的进化造成如此深远的影响。</p>
		<p>曾获得无数大奖的《半条命》采用的是Quake和Quake II引擎的混合体，Valve公司在这两部引擎的基础上加入了两个很重要的特性：一是脚本序列技术，这一技术可以令游戏以合乎情理的节奏通过触动事件的方式让玩家真实地体验到情节的发展，这对于诞生以来就很少注重情节的第一人称射击游戏来说无疑是一次伟大的革命；第二个特性是对人工智能引擎的改进，敌人的行动与以往相比明显有了更多的狡诈，不再是单纯地扑向枪口。这两个特点赋予了《半条命》引擎鲜明的个性，在此基础上诞生的《要塞小分队》、《反恐精英》和《毁灭之日》等优秀作品又通过网络代码的加入令《半条命》引擎焕发出了更为夺目的光芒。 在人工智能方面真正取得突破的游戏是Looking Glass工作室的《神偷：暗黑计划》，游戏的故事发生在中古年代，玩家扮演一名盗贼，任务是进入不同的场所，在尽量不引起别人注意的情况下窃取物品。《神偷》采用的是Looking Glass工作室自行开发的Dark引擎，Dark引擎在图像方面比不上《雷神之锤2》或《虚幻》，但在人工智能方面它的水准却远远高于后两者，游戏中的敌人懂得根据声音辨认你的方位，能够分辨出不同地面上的脚步声，在不同的光照环境下有不同的目力，发现同伴的尸体后会进入警戒状态，还会针对你的行动做出各种合理的反应，你必须躲在暗处不被敌人发现才有可能完成任务，这在以往那些纯粹的杀戮游戏中是根本见不到的。如今的绝大部分第一人称射击游戏都或多或少地采用了这种隐秘的风格，包括新近发布的《荣誉勋章：盟军进攻》（Medal of Honor：Allied Assault）。遗憾的是，由于Looking Glass工作室的过早倒闭，Dark引擎未能发扬光大，除了《神偷：暗黑计划》外，采用这一引擎的只有《神偷2：金属时代》（Thief 2：The Metal Age）和《系统震撼2》等少数几款游戏。</p>
		<p>受《半条命》和《神偷：暗黑计划》两款游戏的启发，越来越多的开发者开始把注意力从单纯的视觉效果转向更具变化的游戏内容，其中比较值得一提的是离子风暴工作室出品的《杀出重围》，《杀出重围》采用的是Unreal引擎，尽管画面效果十分出众，但在个体的人工智能方面它无法达到《神偷》系列的水准，游戏中的敌人更多的是依靠预先设定的场景脚本做出反应，例如砸碎弹药盒可能会引起附近敌人的警惕，但这并不代表他听到了什么，打死敌人后周围的同伙可能会朝你站立的位置奔过来也可能会无动于衷，这些不真实的行为即便在《荣誉勋章：盟军进攻》里也依然存在。图像的品质抵消了人工智能方面的缺陷，而真正帮助《杀出重围》在众多射击游戏中脱颖而出的则是它的独特风格，游戏含有浓重的角色扮演成分，人物可以积累经验、提高技能，还有丰富的对话和曲折的情节。同《半条命》一样，《杀出重围》的成功说明了叙事对第一人称射击游戏的重要性，能否更好地支持游戏的叙事能力成为了衡量引擎的一个新标准。从2000年开始3D引擎朝着两个不同的方向分化，一是如《半条命》、《神偷》和《杀出重围》那样通过融入更多的叙事成分和角色扮演成分以及加强游戏的人工智能来提高游戏的可玩性，二是朝着纯粹的网络模式发展，在这一方面，id Software公司再次走到了整个行业的最前沿，他们意识到与人斗才是其乐无穷，于是在Quake II出色的图像引擎的基础上加入更多的网络成分，破天荒推出了一款完全没有单人过关模式的纯粹的网络游戏——《雷神之锤3竞技场》（Quake III Arena），它与Epic公司稍后推出的《虚幻竞技场》（Unreal Tournament）一同成为引擎发展史上的一个转折点。 随着Quake III引擎的大获成功，id Software公司在引擎授权市场上也大赚了一笔。Raven公司再次同id Software公司合作，采用Quake III引擎制作了第一人称射击游戏《星际迷航：精英部队》（Star Trek Voyager：Elite Force），此外这部引擎还被用于制作第三人称动作游戏《重金属F.A.K.K. 2》（Heavy Metal F.A.K.K 2）和《艾丽丝漫游魔境》（American McGee’s Alice）、最近的两款二战题材的射击游戏《重返德军总部》（Return to Castle Wolfenstein）和《荣誉勋章：盟军进攻》，以及开发中的《绝地放逐者：绝地武士2》（Jedi Outcast：Jedi Knight II）。从地牢到外太空，从童话世界到二战年代，从第一人称视角到第三人称视角，充分显示了Quake III引擎的强大潜力。</p>
		<p>Epic 公司的《虚幻竞技场》虽然比《雷神之锤3竞技场》落后了一步，但如果仔细比较一下的话，你就会发现它的表现要略高出后者一筹。从画面方面看两者差不多打成平手，但在联网模式上，它不仅提供有死亡竞赛模式，还提供有团队合作等多种激烈火爆的对战模式，而且Unreal Tournament引擎不仅可以应用在动作射击游戏中，还可以为大型多人游戏、即时策略游戏和角色扮演游戏提供强有力的3D支持。Unreal Tournament引擎在许可业务方面的表现也超过了Quake III，迄今为止采用Unreal Tournament引擎制作的游戏大约已经有20多款，其中包括《星际迷航深度空间九：坠落》（Star Trek Deep Space Nine：The Fallen）、《新传说》（New Legend）和《塞拉菲姆》（Seraphim）等。</p>
		<p>在1998年到 2000年期间迅速崛起的另一款引擎是Monolith公司的LithTech引擎，这款引擎最初是用在机甲射击游戏《升刚》（Shogo）上的。前面说过，LithTech引擎的开发共花了整整五年时间，耗资700万美元，功夫不负有心人，1998年LithTech引擎的第一个版本推出之后立即引起了业界的主意，为当时处于白热化状态下的《雷神之锤2》vs.《虚幻》之争泼了一盆冷水。</p>
		<p>正是由于过于高昂的开发代价，2002年 Monolith公司决定单独成立一个LithTech公司，以LithTech引擎的授权许可作为主要业务，希望借此捞回一些成本。采用 LithTech第一代引擎制作的游戏包括《血兆2》和《清醒》（Sanity）等。2000年LithTech公司推出了引擎的2.0版本和2.5版本，加入了骨骼动画和高级地形系统，给人留下深刻印象的《无人永生》（No One Lives Forever）以及即将上市的《全球行动》（Global Operations）采用的就是LithTech 2.5引擎，此时的LithTech已经从一名有益的补充者变成了一款同Quake III和Unreal Tournament平起平坐的引擎。如今LithTech引擎的3.0版本也已经发布，并且衍生出了“木星”（Jupiter）、“鹰爪” （Talon）、“深蓝”（Cobalt）和“探索”（Discovery）四大系统，其中“鹰爪”被用于开发《异形大战掠夺者2》（Alien Vs. Predator 2），“木星”将用于《无人永生2》的开发，“深蓝”用于开发PS2版《无人永生》，“探索”则将被用来制作一款尚未公布的大型网络游戏。</p>
		<p>LithTech 引擎除了本身的强大性能外，最大的卖点在于详尽的服务，除了LithTech引擎的源代码和编辑器外，购买者还可以获得免费的升级、迅捷的电子邮件和电话技术支持，LithTech公司甚至还会把购买者请到公司进行手把手的培训。而且LithTech引擎的平均价格也不算很高，大约在25万美元左右，同 Quake III引擎的70万美元相比已经是相当低廉了。 </p>
		<p>引擎的明天（2001年~）</p>
		<p>2001年有许多优秀的3D射击游戏陆续发布，其中一部分采用的是Quake III和Unreal Tournament等现成引擎，如《星际迷航深度空间九：坠落》、《重返德军总部》和《荣誉勋章：盟军进攻》，而更多的则采用的是自己开发的引擎，比较有代表性的包括网络射击游戏《部落2》（Tribes 2）、第一人称射击游戏《马科斯·佩恩》、《红色派系》（Red Faction）和《英雄萨姆》等。</p>
		<p>《部落2》采用的是V12引擎，这款引擎虽然无法同Quake III和Unreal Tournament相提并论，但开发者为它制定的许可模式却相当新颖，你只需花上100美元就可以获得引擎的使用权，不过天下没有免费的午餐，随之而来的一系列规定相当苛刻，例如，开发者不能把该引擎用于为其它游戏发行商、其它商业游戏站点等竞争对手制作游戏，开发出来的游戏必须在发行前交给 GarageGames公司（V12引擎的所有者），不能交给任何第三方，GarageGames公司将拥有这些游戏五年的独家发行权等等。尽管如此，对于那些规模较小的独立开发者来说，这个超低价引擎仍然具有非常大的吸引力。</p>
		<p>《马科斯·佩恩》采用的是MAX-FX引擎，这是第一款支持辐射光影渲染技术（Radiosity Lighting）的引擎，这种技术以往只在一些高级的建筑设计软件中出现过，它能够结合物体表面的所有光源效果，根据材质的物理属性及其几何特性，准确地计算出每个点的折射率和反射率，让光线以更自然的方式传播过去，为物体营造出十分逼真的光影效果。MAX-FX引擎的另一个特点是所谓的“子弹时间” （Bullet Time），这是一种《黑客帝国》风格的慢动镜头，在这种状态下甚至连子弹的飞行轨迹都可以看得一清二楚。MAX-FX引擎的问世把游戏的视觉效果推向了一个新的高峰。</p>
		<p>《红色派系》采用的是Geo-Mod引擎，这是第一款可任意改变几何体形状的3D引擎，也就是说，你可以使用武器在墙壁、建筑物或任何坚固的物体上炸开一个缺口，穿墙而过，或者在平地上炸出一个弹坑躲进去。Geo-Mod引擎的另一个特点是高超的人工智能，敌人不仅仅是在看见同伴的尸体或听见爆炸声后才会做出反应，当他们发现你留在周围物体上的痕迹如弹孔时也会警觉起来，他们懂得远离那些可能对自己造成伤害而自己又无法做出还击的场合，受伤的时候他们会没命地逃跑，而不会冒着生命危险继续作战。 </p>
		<p>《英雄萨姆》采用的是Serious引擎，这款引擎最大的特点在于异常强大的渲染能力，面对大批涌来的敌人和一望无际的开阔场景，你丝毫不会感觉到画面的停滞，而且游戏的画面效果也相当出色。此外值得一提的还有《海底惊魂》（AquaNox）所用的Krass引擎，这款引擎被作为GeForce 3的官方指定引擎，专门用于宣传、演示GeForce 3的效果，视觉方面的表现无可挑剔。 </p>
		<p>可以看出，2001年问世的几部引擎依旧延续了两年多来的发展趋势，一方面不断地追求真实的效果，例如MAX-FX引擎追求画面的真实，Geo- Mod引擎追求内容的真实，《军事冒险家》（Soldier of Fortune）的GHOUL引擎追求死亡的真实；另一方面则继续朝着网络的方向探索，如《部落2》、《要塞小分队2》（Team Fortress 2），以及Monolith公司那款尚未公布的大型网络游戏。 </p>
		<p>不过，由于受到技术方面的限制，把第一人称射击游戏放入大型网络环境中的构想至少在目前还很难实现。众所周知，一般的大型网络游戏多为节奏较慢的角色扮演游戏，这些游戏所使用的引擎，无论是《卡米洛特的黑暗年代》（Dark Age of Camelot）使用的NetImmerse引擎，还是《地平线：伊斯塔里亚大陆》（Horizons：Empires of Istaria）使用的Horizons引擎，或是“据说可以保证50万人在同一虚拟世界中尽情游戏而不会有任何滞后感”的Big World引擎，都无法支持一个供数百名玩家同时战斗的大型团队动态环境。正是基于这样的考虑，id Software公司重新把目光放在了单人模式上，去年年底公布的《雷神之锤4》和《毁灭战士3》将重新建构一个以单人游戏为主的引擎。与此同时，老对手 Epic游戏公司也在紧锣密鼓地开发新一代Unreal引擎和《虚幻竞技场2》的引擎。尽管目前关于这几款引擎的具体资料并不多，但从已展示的几段采用新引擎实时渲染的动画片段来看，它们的确完全超越了市面上的其它引擎，预示着一个新的引擎时代的到来。 </p>
		<p>最后需要指出的是，许多优秀的游戏开发者正在退出游戏开发市场，转而进入引擎授权市场，仅靠开发引擎吃饭，这是个危险的信号。尽管引擎的不断进化使游戏的技术含量越来越高，但最终决定一款游戏是否优秀的因素在于使用技术的人而不是技术本身。如前所述，引擎相当于游戏的框架，框架打好后，你只需往里填充内容即可，在这里，框架只是提供了一种可能性，游戏的精彩与否取决于内容如何而非框架如何。正如《无人永生》开发小组所说：“所有问题最终都会归结为一点 ——你的游戏是否好玩。” </p>
		<p>---全文完--- </p><img src ="http://www.cppblog.com/CornerZhang/aggbug/79844.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2009-04-14 01:10 <a href="http://www.cppblog.com/CornerZhang/archive/2009/04/14/79844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ 代码技巧 (续 02)</title><link>http://www.cppblog.com/CornerZhang/archive/2009/04/13/79004.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Mon, 13 Apr 2009 09:35:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2009/04/13/79004.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/79004.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2009/04/13/79004.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/79004.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/79004.html</trackback:ping><description><![CDATA[<p>6 头文件依赖，Pimpl法，加速编译<br />   举个例子:<br />      // File: SoundSystem.h<br /><br />      #include "StreamFilter.h"<br />      #include "Emitters."<br /><br />      <a title="class" href="http://www.cppblog.com/CornerZhang" >class</a> SoundSystem {<br />      public:<br />         // ...<br />      private:<br />         StreamFilter currentFilter;<br />         EmitModeConfig modeConfig;<br />      };<br />   一目了然的是，看得出SoundSystem实现使用了StreamFilter和EmitModeConfig的定义，所以#include 了他们的定义在此SoundSystem.h中，可是随着项目的不断推进，class SoundSystem中依赖的使用类型会增多，它的header被引入到其它模块中，不知不觉的编译时间越来越长，改进之：<br />      // File: SoundSystem.h<br /><br />      <a title="class" href="http://www.cppblog.com/CornerZhang" >class</a> StreamFilter;<br />      <a title="class" href="http://www.cppblog.com/CornerZhang" >class</a> EmitModeConfig;<br /><br />      <a title="class" href="http://www.cppblog.com/CornerZhang" >class</a> SoundSystem {<br />      public:<br />         // ...<br />      private:<br />         StreamFilter* currentFilterPtr;<br />         EmitModeConfig* modeConfigPtr;<br />      };<br /><br />      // File: SoundSystem.cpp<br />      #include "StreamFilter.h"<br />      #include "Emitters."<br /><br />      SoundSystem::SoundSystem() {<br />         //...<br />         currentFilterPtr = new StreamFilter;<br />         modeConfigPtr = new EmitModeConfig;<br />      }<br /><br />      SoundSystem::~SoundSystem() {<br />         delete currentFilterPtr;<br />         delete modeConfigPtr;<br />         //...<br />      }<br />      这么一来，把StreamFilter和EmitModeConfig的#include藏到了SoundSystem的实现代码中，以后对SoundSystem的部分改动不会导致其它模块的rebuild哦，不过由此可能会牺牲一点效率吧!</p>
		<p>      记得，有位微软的C++翘楚人物，Herb Sutter给这种技巧称为Pimpl ( Private Implemention ), 用的恰到好处时，可以提高项目开发速度，同时模块的头文件间的#include关系得以缓解，可以避开循环依赖，而且可以获得一个良好的物理设计。<br /><br />( to be continued )</p><img src ="http://www.cppblog.com/CornerZhang/aggbug/79004.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2009-04-13 17:35 <a href="http://www.cppblog.com/CornerZhang/archive/2009/04/13/79004.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ 代码技巧 (续 01)</title><link>http://www.cppblog.com/CornerZhang/archive/2009/04/05/79003.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Sun, 05 Apr 2009 05:41:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2009/04/05/79003.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/79003.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2009/04/05/79003.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/79003.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/79003.html</trackback:ping><description><![CDATA[<p>4 更好的使用标准库中的字符串类 (std::basic_string&lt;class Char, <a title="class" href="/CornerZhang">class</a> CharTraits, <a title="class" href="/CornerZhang">class</a> Alloc&gt;)</p>
		<p>   如果在一个实际的项目中要使用标准库的std::string 或 std::wstring，会发现随着时间的推移，越会产生出重写一个自己的字符串类之冲动，而std::string的接口如此之好用，同时code里到处是std::string这样的东西，有时又要向多字节字符转换。此处有一个比较好的方案，不过最好从项目开始就实施：<br />   typedef unsigned char UChar;<br />   typedef unsigned short UWChar;<br /><br />   typedef std::allocator StringAllocator;   // 使得以后有针对字符串分配优化<br /><br />   typedef std::basic_string&lt; UChar, std::char_traits&lt;UChar&gt;, StringAllocator&lt;UChar&gt; &gt; String;<br />   typedef std::basic_string&lt; UWChar, std::char_traits&lt;UWChar&gt;, StringAllocator&lt;UWChar&gt; &gt; WString; // 宽字符版本<br /><br />然后，在项目中就可以使用这个经过定制的String / WString。<br /><br />5 函数名称重载是C++很好的特性，适当使用会带来很好的效果，有时却会自找麻烦，下面就是一例:<br />   <a title="class" href="/CornerZhang">class</a> EntityDefination {<br />   public:<br />      //...<br />      Entity* GetEntity(const char* name);<br />      Entity* GetEntity(const unsigned id);   // 重载<br />   };<br />   自认为这样很好不是吗？<br />   有一次，我写了这样一行代码:<br />   Entity* result = entDef-&gt;GetEntity(0);<br />   知道，发生什么事吗，这是个对GetEntity(const unsigned id)的调用，虽说这是一行测试代码，但足以说明我的类接口上的信息缺了些，遂做了如下改动:<br />      Entity* GetEntityByName(const char* name);<br />      Entity* GetEntityByID(const unsigned id);<br /><br />然后，看看：<br />     Entity× result = entDef-&gt;GetEntityById(0);   // 哈哈！错误一目了然，眼睛调试 :)<br /><br /><br /><br />(to be continued!)</p><img src ="http://www.cppblog.com/CornerZhang/aggbug/79003.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2009-04-05 13:41 <a href="http://www.cppblog.com/CornerZhang/archive/2009/04/05/79003.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ 代码技巧</title><link>http://www.cppblog.com/CornerZhang/archive/2009/04/02/78734.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Thu, 02 Apr 2009 12:13:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2009/04/02/78734.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/78734.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2009/04/02/78734.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/78734.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/78734.html</trackback:ping><description><![CDATA[1 在开发维护代码的过程中，对构造、析构函数的修改比较频繁，所以将它们的实现放在.cpp文件中<br /><br />2 保证 operator = 的不变性，保证对象不会处于部分构造状态:<br />   通常的技巧就是:<br />   T&amp; T::operator = (const T&amp; rhs) {<br />      T temp(rhs);<br />      this-&gt;swap(temp);   // 实现swap<br />      return *this;<br />   }<br /><br />3 整数转字符(int convert to string)<br />   std::string itos_ctm(int num) {<br />      std::stringstream s;<br />      s&lt;&lt;num;<br />      return s.str();<br />   }<br /><br />(to be continued)<img src ="http://www.cppblog.com/CornerZhang/aggbug/78734.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2009-04-02 20:13 <a href="http://www.cppblog.com/CornerZhang/archive/2009/04/02/78734.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有人在管制这个国家吗？ [转]</title><link>http://www.cppblog.com/CornerZhang/archive/2009/01/08/71496.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Thu, 08 Jan 2009 06:45:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2009/01/08/71496.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/71496.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2009/01/08/71496.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/71496.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/71496.html</trackback:ping><description><![CDATA[<p>转帖 [梁文道] <a href="http://www.bullog.cn/blogs/liangwendao/archives/180823.aspx">http://www.bullog.cn/blogs/liangwendao/archives/180823.aspx</a></p>
		<p>梁文道 @ 2008-9-23 2:43:24 阅读(9027) 评论(63) 引用通告 分类: 未归类 <br />改革开放三十年来的中国就像以往的「东亚四小龙」，国家机器的合法性不是建立在形式保证的民众授权之上(如选举)，而是在于经济增长与人民生活的基本保障。至于大家认识到的民族主义和爱国主义等意识形态，其实只是一道黏合剂，让百姓感到自己生活的富足安定是国家的赐予，民族的自豪。假如民生凋敝，社会不安，再多的爱国宣传也挽救不了统治的危机。</p>
		<p>难怪中国政府一直致力于经济的高速增长，因为这正是官方共产主义破产之后仍然力保政权不坠的不二法门。其中的等式是这样的：经济发展等于百姓生活无忧，百姓生活无忧就等于政府长治久安。</p>
		<p>明乎此，便能了解近日「毒奶事件」的严重了。纵观这件事的来龙去脉，我们看见的不只是商人的贪婪无良，还是各个部门各级政府的集体缺席。</p>
		<p>早 在今年二月，就有消费者向工商局投诉「三鹿」奶粉的质量有问题。但当局的回应竟然是要该名消费者先给两万块钱人民币，才能替他检测相关产品！作风就和救命 得先缴订金的无良医院一样。如果政府连它该尽的本份也要收钱才做，谁还需要政府呢？何不干脆让民间自行开办产品检试实验室？说不定取价还能便宜点呢。</p>
		<p>能 够预先测知并且处理牛奶问题的部门有一大串，但它们全到哪里去了呢？至于地方政府，从石家庄市到河北省都曾接过投诉，他们的响应是什么？就算出动到了新西 兰政府，他们依然默不作声。我很难想象新西兰总理打电话给温家宝，对他说「你们那里的牛奶出事了，他们没告诉你吗？」的情景。我只感到政府好像不见了。这 是不是个体制问题？当然是！但它甚至已经和民主不民主无关了。就算是在「东亚四小龙」式的威权体制之下，这种无政府状态也很难发生。不要搞错，就算是邓小 平式的强人统治，也不大可能出现这种整体管治失效的情况。</p>
		<p>政府已经不能保障人民生命的安全，它还能够维持经济的高速增长吗？由次按风暴引发的全球金融海啸必将打击中国来年的出口贸易，我们的内需再怎么扩大也补不上那巨大的缺口吧？</p>
		<p>如此一来，这个国家的合法性能不遇到空前的危机吗？到底有没有人在管治这个国家呢？肯定有，最起码还要有政府部门勒令媒体不得擅自报道毒奶事件，更不能发布类似这篇文章的评论。这是我最能感到政府存在的环节。<br /></p><img src ="http://www.cppblog.com/CornerZhang/aggbug/71496.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2009-01-08 14:45 <a href="http://www.cppblog.com/CornerZhang/archive/2009/01/08/71496.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>优良C++程序设计的法则</title><link>http://www.cppblog.com/CornerZhang/archive/2008/12/14/69049.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Sun, 14 Dec 2008 14:23:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2008/12/14/69049.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/69049.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2008/12/14/69049.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/69049.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/69049.html</trackback:ping><description><![CDATA[<p>
				<font style="BACKGROUND-COLOR: #000000" color="#ffffff">1 首先，了解自己。这样才能知道，哪些是与机器打交道的人是可以做到的，而哪些是不能做的<br />2 知识结构中，一定要对计算机这个"二进制编码系统"有所了解，所以为什么好多C/C++大师人物，推荐学习汇编和现代计算机体系结构<br />    因为，虽说现代的优化编译器很好，但是从另一个角度来说，我们所做的所有编码任务最终要被映射到计算机硬件（这个经过"预编码的二进制系统"，而且硬件本身也有缺陷）环境上，所以这样有助于了解程序到底做了什么事，有助于写出便于调试和优化的代码。<br />3 C++语言各个特性对设计产生的影响<br />4 数据结构、算法的熟悉，这是基本功<br />5 确定目标，人员的，与时间表，尽可能早的让市场人员参与进来，所以建立一些个release point and demo<br />6 让项目相关人员一起讨论，统一口头词汇，一些行业背景概念，建立技术规范说明书（不宜晦涩难懂），统一技术词汇，要有个大家都能接受的代码规范说明，和命名规则，以及一些必要的原则，尽可能多的在这个阶段吧每一项都化为白纸黑字。<br />还有，最重要的是工作内容的量化评估系统！<br />7 模块划分时，考虑参与人员的数量和任务分配，如何使他们有利于分配到自己每一天的任务表中。考虑与代码管理系统的整合关系<br />8 良好接口所拥有的特征审查表: （你会发觉，只要当你不断调整你的借口定义来满足以下四项中的三项时，代码重用性很好，因为这是个符合人性的定义，便于记忆！）<br />    a 功能的正交分解<br />    b 最小化的接口<br />    c 最明确的函数调用语义<br />    d 最适合的出错检查机制<br /><br />9 实现接口时，同时写一些用户代码，以此检查功能正确性和用户端代码的编程范型。由此，推动良好接口的产生<br />10 在接口中写下定义这个接口的初衷，它的产生需求，以及限制与开发状态(实现完成度)<br />11 那些不能用代码描述的接口，就该化为文档<br />12 尽可能引诱那些愿意使代码高质量的程序员参与进来<br />13 接下来... ...精益求精ing<br /></font>
		</p><img src ="http://www.cppblog.com/CornerZhang/aggbug/69049.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2008-12-14 22:23 <a href="http://www.cppblog.com/CornerZhang/archive/2008/12/14/69049.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>不满意的这一年</title><link>http://www.cppblog.com/CornerZhang/archive/2008/12/14/69052.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Sun, 14 Dec 2008 13:27:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2008/12/14/69052.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/69052.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2008/12/14/69052.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/69052.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/69052.html</trackback:ping><description><![CDATA[<p>
				<font style="BACKGROUND-COLOR: #000000" color="#ffffff">早期完成的两个模块用不上，也就是浪费了，不知当初做的是什么规划，而且拿的还是投资人的钱。至今，还没有一个真能领班的，所以，进度总是缓慢，人心定不下啊。<br /><br />考虑下技术人员的立场，他们随着年纪的增大，照理来说对技术会越来越能把握住，可亲自私下问了几个，他们反而觉得没了方向，不知自己做的这些所谓逻辑程序员的活有啥意义，而且技术能力没有多大增长，就是又多写了些小游戏的游戏逻辑代码，而且看他们又是累死累活的自愿加班，这样下去，造了太多的恶。庆幸的是，不是我做了这样的安排。<br /><br />我知道，我也走过来的，对他们个人而言实在浪费时间，除了那一般的收入之外，而且，健康的支出、对他们亲人的陪伴时间减少（太多年轻人的悲欢离合发生中...），太多的隐患！<br /><br />我就不信，在让整个公司运营起来，有一定的收入的同时，就不能照顾自己的好员工！<br /><br /><br /><br /><br /><br />想了想，现在中国政治的形态就是个“北奥模式"，这个模式将会在今后以不同的形态的于经济实体中复现！ </font>
		</p><img src ="http://www.cppblog.com/CornerZhang/aggbug/69052.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2008-12-14 21:27 <a href="http://www.cppblog.com/CornerZhang/archive/2008/12/14/69052.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载] NXN -  AlienBrain Server 的安装</title><link>http://www.cppblog.com/CornerZhang/archive/2008/12/04/68543.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Thu, 04 Dec 2008 03:00:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2008/12/04/68543.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/68543.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2008/12/04/68543.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/68543.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/68543.html</trackback:ping><description><![CDATA[<p class="g_w_100 g_t_wrap g_t_center g_t_bold g_t_24 g_c_pdin c07" id="blogtitle_fks_085065087085085070086094081095087095084069085095">[NXN] AlienBrain Server 的安装</p>
		<div class="g_blog_list">
				<div class="g_t_center g_c_pdin g_p_center c07 content" id="blogtext_fks_085065087085085070086094081095087095084069085095" style="WIDTH: 760px">1. 首先需要 Windows Server 版系统，比如 win2000 server<br />2. 安装过程中，要设置一个 Center Server Name，就用本机的 hostname，不要乱改。（以后 NXN Admin 工具 connect to server 的 server name 就要填这个）<br />3. 新建一个 Project，然后设置好 User Management 中每个用户对此 Project 的访问权限，即可。<br /><br />官方上有教程<br /><a href="http://www.softimage.com/products/alienbrain/" target="_blank"><font color="#4f4fa3">http://www.softimage.com/products/alienbrain/</font></a></div>
		</div><img src ="http://www.cppblog.com/CornerZhang/aggbug/68543.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2008-12-04 11:00 <a href="http://www.cppblog.com/CornerZhang/archive/2008/12/04/68543.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>3dsMax 9 中导出带骨骼动画的 microsoft x file</title><link>http://www.cppblog.com/CornerZhang/archive/2008/12/03/68471.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Wed, 03 Dec 2008 07:59:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2008/12/03/68471.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/68471.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2008/12/03/68471.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/68471.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/68471.html</trackback:ping><description><![CDATA[1 首先下载Panda DirectX Export Plugin for 3ds Max<br />下载地址，自己google吧<br /><br />2 把8.dle放到(MaxDir)/plugins/下<br /><br />3 启动Max9, 打开自己的模型文件，然后File-&gt;Export.../或Export Selected...  , 选"Panda Export"导出器, 确定<br /><br />4 “3DS Max Objects"中勾选<br />       Mesh definition<br />       Materials<br />       Include Animation(requires sub-frames)<br />       Bones<br />       Geometric<br />      为了以后方便，选上Save settings in scene<br />   "Mesh"中勾选<br />       Mesh normals<br />       Mapping coordinates<br />       Vertex colors<br />       Combo单选"Normal"<br />   "Animation"<br />       Sampled<br />       Position, Scale &amp; Rotate<br />       Key Seq.<br />       一个动画序列为Start: 0, End: 30<br />   "X File Settings"<br />      Text<br />      Sub frame hierarchy<br />      Left Handed Axis<br />      Include Animation options勾上, type为Closed, Pos. quality为Linear Positions<br />  "Textures &amp; .fx files"中的保持默认<br /><br />注意: 由于美工那边一直说插件装了后，max9启动报错，究其原因可能是Visual C++ 2005 Redistributable Package或较新版本的DirectX runtime 没有安装，所以请务必装上，还有为max9安上它的SP2 package<br /><br />(完)<img src ="http://www.cppblog.com/CornerZhang/aggbug/68471.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2008-12-03 15:59 <a href="http://www.cppblog.com/CornerZhang/archive/2008/12/03/68471.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GtkRadiant 1.5.0 在 Windows Vista上显示有问题（解决）</title><link>http://www.cppblog.com/CornerZhang/archive/2008/11/13/66791.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Thu, 13 Nov 2008 01:22:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2008/11/13/66791.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/66791.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2008/11/13/66791.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/66791.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/66791.html</trackback:ping><description><![CDATA[1 到GtkRadiant 1.5.0的安装目录下，找到GtkRadiant.exe<br />2 鼠标右击GtkRadiant.exe,打开属性菜单，转到“兼容性”选项卡<br />3 使得:<br />  a 兼容模式为Windows XP SP2 (选择)<br />  b 禁用视觉主题 （勾上）<br />  c 禁用桌面元素（勾上）<br />  d 以管理员身份运行该程序（勾上）<br />4 以上选好后，确定<br /><img src ="http://www.cppblog.com/CornerZhang/aggbug/66791.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2008-11-13 09:22 <a href="http://www.cppblog.com/CornerZhang/archive/2008/11/13/66791.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux 下的常用命令</title><link>http://www.cppblog.com/CornerZhang/archive/2008/10/31/65627.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Fri, 31 Oct 2008 07:41:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2008/10/31/65627.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/65627.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2008/10/31/65627.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/65627.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/65627.html</trackback:ping><description><![CDATA[grep<br /><br />eg: <br />  列出在当前目录下含有VecInt内容的文件列表<br />  grep -l "VecInt" ./* <br /><br /><br /><br />ls<br /><br />eg:<br />  以列表形式列出当前目录下的内容<br />  ls -l <br /><br />ps<br />列出当前系统中的进程<br /><br /><br />kill<br /><br />eg: 杀死PID为8093的进程<br />  kill 8093<br /><br /><br /><br />su<br />  <br /><br />top 实时监测进程<br /><br /><br />free 显示内存使用状态<br /><br /><br /><img src ="http://www.cppblog.com/CornerZhang/aggbug/65627.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2008-10-31 15:41 <a href="http://www.cppblog.com/CornerZhang/archive/2008/10/31/65627.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Crysis mod -- MTV</title><link>http://www.cppblog.com/CornerZhang/archive/2008/10/20/64458.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Mon, 20 Oct 2008 01:32:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2008/10/20/64458.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/64458.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2008/10/20/64458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/64458.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/64458.html</trackback:ping><description><![CDATA[<object width="400" height="225">
				<param name="allowfullscreen" value="true" />
				<param name="allowscriptaccess" value="always" />
				<param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=748442&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" />
				<embed src="http://vimeo.com/moogaloop.swf?clip_id=748442&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225">
				</embed>
		</object>
		<br />
		<a href="http://vimeo.com/748442?pg=embed&amp;sec=748442">Natural Mod 2.0 for Crysis</a> from <a href="http://vimeo.com/user388113?pg=embed&amp;sec=748442">pydon</a> on <a href="http://vimeo.com?pg=embed&amp;sec=748442">Vimeo</a>.<img src ="http://www.cppblog.com/CornerZhang/aggbug/64458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2008-10-20 09:32 <a href="http://www.cppblog.com/CornerZhang/archive/2008/10/20/64458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu 8.04.1 edgy Chinese Input Method</title><link>http://www.cppblog.com/CornerZhang/archive/2008/09/08/61321.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Mon, 08 Sep 2008 09:40:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2008/09/08/61321.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/61321.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2008/09/08/61321.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/61321.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/61321.html</trackback:ping><description><![CDATA[先在System -&gt; Administration -&gt; Language Support里安装上Chinese语言选项<br /><br />vim  /etc/X11/xinit/xinput.d/all_ALL <br />
    <br />
change:<br />
XIM=SCIM<br />
XIM_PROGRAM=/usr/bin/scim<br />
XIM_ARGS="-d"<br />
XIM_PROGRAM_XTRA=<br />
GTK_IM_MODULE=scim<br />
QT_IM_MODULE=scim<br />
DEPENDS="scim,scim-gtk2-immodule | scim-qtimm"<img src ="http://www.cppblog.com/CornerZhang/aggbug/61321.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2008-09-08 17:40 <a href="http://www.cppblog.com/CornerZhang/archive/2008/09/08/61321.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为arm linux 交叉编译boost 1.33.1</title><link>http://www.cppblog.com/CornerZhang/archive/2008/08/21/59498.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Thu, 21 Aug 2008 02:02:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2008/08/21/59498.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/59498.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2008/08/21/59498.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/59498.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/59498.html</trackback:ping><description><![CDATA[<p>首先在arm linux环境上要有zlib<br /><br />1 解开boost压缩包, cd进入解压目录<br /><br />2 编译出bjam,并配置好，看手册页<br /><br />3 产生Makefile: ./configure "-sBUILD=debug release &lt;runtime-link&gt;static/dynamic" --without-python<br /><br />4 更改Makefile:<br />  把文件头上的几个变量改成下面这样，我的编译环境在"/MyDev/arm-linux/bin"下面,其它的不用改<br />   BJAM=./tools/build/jam_src/bin.linuxx86/bjam<br />  TOOLSET=arm-linux-gcc<br />  BJAM_CONFIG= -sPYTHON_ROOT=/usr -sPYTHON_VERSION=2.5<br />  PREFIX=/MyDev/arm-linux/bin<br />  EPREFIX=/MyDev/arm-linux/bin<br />  LIBDIR=/MyDev/Intel_CE_2110-1.1.290/arm-linux-elf/lib<br />  INCLUDEDIR=/MyDev/Intel_CE_2110-1.1.290/arm-linux-elf/include<br /><br />  更改BOOST_ROOT/tools/build/v1/gcc-tools.jam,最好先备份一下这个文件:<br />  把里面出现gcc/g++/ar/as的地方改为arm-linux-gcc/arm-linux-g++/arm-linux-ar/arm-linux-as<br /><br />5 回到BOOST_ROOT<br />   由于是嵌入式系统，所以也需要静态库，所以输入:<br />    bjam "-sBUILD=debug release &lt;runtime-link&gt;static/dynamic"<br /><br />以上步骤在本人的Ubuntu 8.04上一切顺利<br /><br />&lt;end&gt;<br /></p><img src ="http://www.cppblog.com/CornerZhang/aggbug/59498.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2008-08-21 10:02 <a href="http://www.cppblog.com/CornerZhang/archive/2008/08/21/59498.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>compile alsa sound system on linux(arm)</title><link>http://www.cppblog.com/CornerZhang/archive/2008/08/04/57954.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Mon, 04 Aug 2008 04:45:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2008/08/04/57954.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/57954.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2008/08/04/57954.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/57954.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/57954.html</trackback:ping><description><![CDATA[Step 1: get alsa driver/lib/utils arch files from www.alsa-project.org<br />            and ncurses-5.5<br />            note: let extarct them on same directory<br />Step 2: see the script file "customer_alsa_build.sh"<br />            file full context:<br /><br /><br />#!/bin/sh<br /><br /># This script must be run from this directory<br /><br />BUILD_ROOT=$PWD/../..<br />TOP=$PWD<br />LINUX=$BUILD_ROOT/linux-2.6.16.16<br /><br />mkdir tmp;<br /><br /># Create the directory tree to export<br />mkdir -p $BUILD_ROOT/arm-linux-elf/lib/modules/sound<br />mkdir -p $BUILD_ROOT/arm-linux-elf/src<br />mkdir -p $BUILD_ROOT/arm-linux-elf/bin<br />mkdir -p $BUILD_ROOT/arm-linux-elf/etc<br />mkdir -p $BUILD_ROOT/arm-linux-elf/usr/share/alsa<br /><br /># Compile the ALSA driver<br />tar xjf alsa-driver-1.0.11-Olo.tar.bz2<br />cd alsa-driver-1.0.11<br />rm Makefile.conf<br />./configure --with-cross=arm-linux- --prefix=$TOP/tmp --with-kernel=$LINUX --with-redhat=no --with-suse=no --with-oss=no --with-cards=dummy,usb-audio<br />make<br />cd ..<br /><br /># Copy the modules for the target<br />mkdir -p $BUILD_ROOT/arm-linux-elf/lib/modules/sound<br />cp alsa-driver-1.0.11/acore/snd-hwdep.ko        \<br />   alsa-driver-1.0.11/acore/snd.ko              \<br />   alsa-driver-1.0.11/acore/snd-page-alloc.ko   \<br />   alsa-driver-1.0.11/acore/snd-pcm.ko          \<br />   alsa-driver-1.0.11/acore/snd-timer.ko        \<br />   alsa-driver-1.0.11/acore/snd-rawmidi.ko      \<br />   alsa-driver-1.0.11/acore/seq/snd-seq-device.ko \<br />   alsa-driver-1.0.11/acore/seq/snd-seq-dummy.ko \<br />   alsa-driver-1.0.11/usb/snd-usb-audio.ko      \<br />   alsa-driver-1.0.11/usb/snd-usb-lib.ko        \<br />   $BUILD_ROOT/arm-linux-elf/lib/modules/sound<br /><br /><br /># Cross-Compile curses<br />tar xzf ncurses-5.5.tar.gz<br />cd ncurses-5.5/<br />CC=arm-linux-gcc ./configure --host=arm-linux --target=arm-linux --build=i386-linux --with-softfloat --prefix=$TOP/tmp<br />make<br />make install<br />cd ..<br /><br /># Cross-Compile ALSA library<br />tar xjf alsa-lib-1.0.11-Olo.tar.bz2<br />cd alsa-lib-1.0.11<br />CC=arm-linux-gcc ./configure --host=arm-linux --target=arm-linux --build=i386-linux --with-softfloat --exec-prefix=$TOP/tmp --includedir=$TOP/tmp/include<br />make<br /><br /># copy libraries and headers target<br /><br />datadir=$TOP/tmp/share make -e install <br />arm-linux-strip $TOP/tmp/lib/libasound.so.2.0.0<br />cp $TOP/tmp/lib/libasound.so.2.0.0 $BUILD_ROOT/arm-linux-elf/lib/<br />mkdir -p $BUILD_ROOT/arm-linux-elf/include/<br />cp -a $TOP/tmp/include/alsa $BUILD_ROOT/arm-linux-elf/include/<br />pushd $BUILD_ROOT/arm-linux-elf/lib<br />rm -f libasound.so.2<br />rm -f libasound.so<br />ln -s libasound.so.2.0.0 libasound.so.2<br />ln -s libasound.so.2.0.0 libasound.so<br />popd<br />cd ..<br /><br /><br /># Cross-Compile ALSA utils<br />tar xjf alsa-utils-1.0.11.tar.bz2 <br />cp alsa-utils-1.0.11.tar.bz2 $BUILD_ROOT/arm-linux-elf/src<br />cd alsa-utils-1.0.11<br />CC=arm-linux-gcc ./configure --host=arm-linux --target=arm-linux --build=i386-linux --with-softfloat --prefix=$TOP/tmp --with-alsa-prefix=$TOP/tmp/lib/ --with-alsa-inc-prefix=$TOP/tmp/include CPPFLAGS="-I$TOP/tmp/include/alsa -I$TOP/tmp/include/ncurses" <br />make<br />make install<br />arm-linux-strip $TOP/tmp/bin/aplay<br />cp $TOP/tmp/bin/aplay $BUILD_ROOT/arm-linux-elf/bin<br />(cd $BUILD_ROOT/arm-linux-elf/bin; rm -f arecord; ln -s aplay arecord)<br /><br />    run it in your Shell Term<br /><br />(complete)<br /><br />enjoy!<br /><img src ="http://www.cppblog.com/CornerZhang/aggbug/57954.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2008-08-04 12:45 <a href="http://www.cppblog.com/CornerZhang/archive/2008/08/04/57954.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Ubuntu 7.04上安装samba与windows共享</title><link>http://www.cppblog.com/CornerZhang/archive/2008/07/24/57018.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Thu, 24 Jul 2008 01:55:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2008/07/24/57018.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/57018.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2008/07/24/57018.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/57018.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/57018.html</trackback:ping><description><![CDATA[无权限目录共享<br />先是主机方面的设置:<br />[global]<br />workgroup = frog studio<br />server string = Ubuntu Samba Server<br />log file = /var/log/samba/log.%m<br />security = share<br />encrypt passwords = no<br />(其它按默认设置)<br />然后是共享目录设置:<br />[Share Directory]<br />comment = My Share Directory<br />path = /home/share<br />read only = yes<br />public = yes<br />writable = yes<br />设置完成后,我们先输入testparm来测试一下我们的设置有没有错,如果有,系统会有提醒...确定没有错后,我们还要重启一下我们的Samba服务器来让设置生效:<br />/etc/init.d/samba restart<br />接下来我们再进行一次客户端的自我测试:<br />smbclient -L //localhost<br />然后我们就可以看到刚刚我们共享的目录名Share Directory,呵呵 ... 进入Windows网上邻居找一下,我们就可以对Linux的共享目录进行访问了...好,下面来提高一下我们的权限:<br />主机方面的设置<br />[global]<br />workgroup = frog studio<br />server string = Ubuntu Samba Server<br />log file = /var/log/samba/log.%m<br />security = user<br />encrypt passwords = yes<br />smb passwd file = /etc/samba/smbpasswd<br />共享目录设置<br />[Share Directory 2]<br />comment = My Share Directory 2<br />path = /home/share2<br />writable = yes<br />valid users = %S(有权限进入者)<br />create mode = 0664<br />directory mode = 0775<br />设置完成后,再次重启Samba服务器,但现在先不要急于跑到windows下去测试,因为这个是要用户名和密码的,下面我们先创建登录用户和登录密码:<br />useradd smb (创建系统用户名)<br />passwd smb (创建系统用户密码)<br />smbpasswd -a smb (在密码文件里新增一个用户)<br />#smbpasswd -d smb (暂停用户登录)<br />#smbpasswd -e smb (恢复暂停用户)<br />#smbpasswd -x smb (删除用户)<br />更多操作请参考man smbpasswd<br />创建好密码文件后,测试Samba设置,testparm,测试正常后,查看一下我们的共享目录:<br />smbclient -L //localhost<br />一切就绪,我们打开windows下的网上邻居,登录共享目录,输入用户密码,呵呵 ... 就可以看到我们Linux下的共享目录了,并且可以任意创建删除文件,从此让我们的Windows和Linux互联吧...<img src ="http://www.cppblog.com/CornerZhang/aggbug/57018.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2008-07-24 09:55 <a href="http://www.cppblog.com/CornerZhang/archive/2008/07/24/57018.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Olo-Linux下编译freealut</title><link>http://www.cppblog.com/CornerZhang/archive/2008/07/16/56305.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Wed, 16 Jul 2008 07:35:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2008/07/16/56305.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/56305.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2008/07/16/56305.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/56305.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/56305.html</trackback:ping><description><![CDATA[1 下载并解开，URL: <a href="http://www.openal.org/openal_webstf/downloads/freealut-1.1.0.tar.gz">http://www.openal.org/openal_webstf/downloads/freealut-1.1.0.tar.gz</a><br />   我的OpenAL安装目录在系统变量OPENAL_OLO_DIR上<br /><br />2 设置环境变量:<br />   输入<br />   CPPFLAGS="-I${OPENAL_OLO_DIR}/include"<br />   LDFLAGS="-L${OPENAL_OLO_DIR}/lib"<br />   export CPPFLAGS LDFLAGS<br /><br />3 编译设置:<br />   输入: CC=arm-linux-gcc ./configure -prefix=$PREFIX -target=arm-linux --enable-shared -with-softfloat --host=arm-linux<br /><br />4 编译<br />   make<br /><br />5 安装<br />  make install<br /><br />6 确认的方法与编译OpenAL方法的相同<br /><br />(end)<img src ="http://www.cppblog.com/CornerZhang/aggbug/56305.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2008-07-16 15:35 <a href="http://www.cppblog.com/CornerZhang/archive/2008/07/16/56305.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Olo--Linux下编译出OpenAL SDK</title><link>http://www.cppblog.com/CornerZhang/archive/2008/07/16/56301.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Wed, 16 Jul 2008 07:13:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2008/07/16/56301.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/56301.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2008/07/16/56301.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/56301.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/56301.html</trackback:ping><description><![CDATA[1 下载 OpenAL, URL: <a href="http://www.openal.org/openal_webstf/downloads/openal-0.0.8.tar.gz">http://www.openal.org/openal_webstf/downloads/openal-0.0.8.tar.gz</a><br />2 解开到某个目录下，然后cd进来<br />3 设置编译:<br />  输入 export "PREFIX=/MyDev/OLO_PDK/arm-linux-elf/"<br />  CC=arm-linux-gcc ./configure -prefix=$PREFIX -target=arm-linux --enable-shared -with-softfloat --host=arm-linux<br />4 编译SDK:<br />  输入 make<br />5 安装:<br />  输入 make install<br />6 确认安装是否成功，进入Olo的开发包的include和lib中去看看，include中会多出al目录，以及三个header; lib中多出libsound.so.2.0.0以及其它的target link<br /><br />(end)<img src ="http://www.cppblog.com/CornerZhang/aggbug/56301.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2008-07-16 15:13 <a href="http://www.cppblog.com/CornerZhang/archive/2008/07/16/56301.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>试用Microsoft XNA Express 2.0感触</title><link>http://www.cppblog.com/CornerZhang/archive/2008/07/03/55192.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Thu, 03 Jul 2008 02:42:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2008/07/03/55192.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/55192.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2008/07/03/55192.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/55192.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/55192.html</trackback:ping><description><![CDATA[<p>主要特色<br />1 基于C#编程，依赖于.net framework<br />2 与Visual Studio 系列高度集成<br />3 具备一套完整的开发流程，从编码-&gt;调试-&gt;资源整合，还有单元测试和协作开发<br />4 较充分的入门文档，完备的api reference<br /><br />个人感受<br />× 是microsoft力推.net平台的游戏市场<br />× 是奴役一部分游戏新人的良好开端，与当初的Visual Basic 6.0一个思路<br />× 用它的公司或个人将失去游戏开发的核心价值、创造性<br />× 是维持Windows + Visual Studio + XBox 360这个链条的扣环</p><img src ="http://www.cppblog.com/CornerZhang/aggbug/55192.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2008-07-03 10:42 <a href="http://www.cppblog.com/CornerZhang/archive/2008/07/03/55192.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Work on Linux -- Ubuntu 8.04 LTS desktop system</title><link>http://www.cppblog.com/CornerZhang/archive/2008/06/20/54122.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Fri, 20 Jun 2008 05:28:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2008/06/20/54122.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/54122.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2008/06/20/54122.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/54122.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/54122.html</trackback:ping><description><![CDATA[My twinview screenshot picture of desktop<br /><br /><img src="http://www.cppblog.com/images/cppblog_com/cornerzhang/7030/o_UB_sp.jpg" alt="o_UB_sp.jpg" align="center" border="0" height="1024" width="2560" /><br /><br /><br /><img src ="http://www.cppblog.com/CornerZhang/aggbug/54122.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2008-06-20 13:28 <a href="http://www.cppblog.com/CornerZhang/archive/2008/06/20/54122.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一碗阳春面 -- 令人怀念啊！</title><link>http://www.cppblog.com/CornerZhang/archive/2008/06/19/54054.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Thu, 19 Jun 2008 14:01:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2008/06/19/54054.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/54054.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2008/06/19/54054.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/54054.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/54054.html</trackback:ping><description><![CDATA[对于面馆来说，最忙的时候，要算是大年夜了。北海亭面馆的这一天，也是从早就忙得不亦乐乎。<br />　　平时直到深夜十二点还很热闹的大街，大年夜晚上一过十点，就很宁静了。北海亭面馆的顾客，此时也象是突然都失踪了似的。<br />　　就在最后一位顾客出了门，店主要说关门打烊的时候，店门被咯吱咯吱地拉开了。一个女人带着两个孩子走了进来。六岁和十岁左右的两个男孩子，一个身崭新的运动服。女人却穿着不合时令的斜格子的短大衣。<br />　　“欢迎光临！”老板娘上前去招呼。<br />　　“啊，……阳春面……一碗……可以吗？”女人怯生生地问。 那两个小男孩躲在妈妈的身后，也怯生生地望着老板娘。<br />　　“行啊，请，请这边坐，”老板娘说着，领他们母子三人坐到靠近暖气的二号桌，一边向柜台里面喊着，“阳春面一碗！”<br />　　听到喊声的老板，抬头瞥了他们三人一眼，应声答道：“好咧！阳春面一碗——”<br />　　案板上早就准备好的，堆成一座座小山似的面条，一堆是一人份。老板抓了一堆面，继而又加了半堆，一起放进锅里。老板娘立刻领悟到，这是丈夫特意多给这母子三人的。<br />　　热腾腾香喷喷的阳春面放到桌上，母子三人立即围着这碗面，头碰头地吃了起来。<br />　　“真好吃啊！”哥哥说。<br />　　“妈妈也吃呀！”弟弟挟了一筷面，送到妈妈口中。<br />　　不一会，面吃完了，付了150元钱。<br />　　“承蒙款待，”母子三人一起点头谢过，出了店门。<br />　　“谢谢，祝你们过个好年！”老板和老板娘应声答道。<br />　　过了新年的北海亭面馆，每天照样忙忙碌碌。一年很快过去了，转眼又是大年夜。<br />　　和以前的大年夜一样，忙得不亦乐乎的这一天就要结束了。过了晚上十点，正想关门打烊，店门又被拉开了，一个女人带着两个男孩走了进来。<br />　　老板娘看到那女人身上的那件不合时令的斜格子短大衣，就想起去年大年夜那三位最后的顾客。<br />　　“……这个……阳春面一碗……可以吗？”<br />　　“请，请里边坐，”老板娘将他们带到去年的那张二号桌，“阳春面一碗——” “好咧，阳春面一碗——”老板应声回答着，并将已经熄灭的炉火重新点燃起来。<br />　　“喂，孩子他爹，给他们下三碗，好吗？”<br />　　老板娘在老板耳边轻声说道。<br />　　“不行，如果这样的话，他们也许会尴尬的。”<br />　　老板说着，抓了一人半份的面下了锅。<br />　　桌上放着一碗阳春面，母子三人边吃边谈着，柜台里的老板和老板娘也能听到他们的声音。<br />　　“真好吃……”<br />　　“今年又能吃到北海亭的阳春面了。”<br />　　“明年还能来吃就好了……”<br />　　吃完后，付了150元钱。老板娘对着他们的背影，“谢谢，祝你们过个好年！”<br />　　这一天，被这句说过几十遍乃至几百遍的祝福送走了。<br />　　随着北海亭面馆的生意兴隆，又迎来了第三年的大年夜。<br />　　从九点半开始，老板和老板娘虽然谁都没说什么，但都显得有点心神不 定。十点刚过，雇工们下班走了，老板和老板娘立刻把墙上挂着的各种面的价格牌一一翻了过来，赶紧写好“阳春面150元”，其实，从今年夏天起，随着物价的上涨，阳春面的价格已经是200元一碗了。<br />　　二号桌上，在30分钟以前，老板娘就已经摆好了“预约席”的牌子。<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 />　　作为年夜饭的阳春面吃完了，付了150元。 <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 /><img src ="http://www.cppblog.com/CornerZhang/aggbug/54054.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2008-06-19 22:01 <a href="http://www.cppblog.com/CornerZhang/archive/2008/06/19/54054.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu 7.10 上安装 CodeBlocks Binary</title><link>http://www.cppblog.com/CornerZhang/archive/2008/06/18/51589.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Wed, 18 Jun 2008 01:52:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2008/06/18/51589.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/51589.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2008/06/18/51589.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/51589.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/51589.html</trackback:ping><description><![CDATA[<p>ref url: <a href="http://lgp203.free.fr/spip/spip.php?article1">http://lgp203.free.fr/spip/spip.php?article1</a><br /><br />具体安装步骤如下： <br />1、安装必要组件 <br />代码: <br />sudo apt-get install build-essential </p>
		<p>代码: <br />sudo apt-get install gdb </p>
		<p>4、安装最新 wxWidgets 库 <br />代码: <br />sudo apt-get update </p>
		<p>代码: <br />sudo apt-get install libwxgtk2.8-0 libwxgtk2.8-dev wx2.8-headers wx-common </p>
		<p>5、设置 wxWidgets 默认版本 <br />代码: <br />sudo update-alternatives --config wx-config </p>
		<p>6、下载 Code::Blocks 每夜构建版本 <br />sudo gedit /etc/apt/sources.list<br />在最后一行的后面加一行<br /><font face="Courier New">deb http://lgp203.free.fr/ubuntu/ gutsy universe</font><br />获得密钥<br /><font face="Courier New">wget -q http://lgp203.free.fr/public.key -O- | sudo apt-key add -</font><br /><font face="Courier New">下载 并且 安装<br />sudo apt-get install libcodeblocks0 codeblocks libwxsmithlib0 codeblocks-contrib</font></p>
		<p>or download the install package from CodeBlocks site:</p>
		<p>wget http://downloads.sourceforge.net/codeblocks/codeblocks-8.02-src.tar.bz2</p>
		<p>tar xzf codeblocks-8.02-src.tar.bz2</p>
		<p>... and then install these deb packages<br /></p>
		<p>
				<font face="Courier New">
						<br />
				</font>
		</p><img src ="http://www.cppblog.com/CornerZhang/aggbug/51589.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2008-06-18 09:52 <a href="http://www.cppblog.com/CornerZhang/archive/2008/06/18/51589.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NFS在ubuntu 7.10上简单安装(改进)</title><link>http://www.cppblog.com/CornerZhang/archive/2008/06/16/53552.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Mon, 16 Jun 2008 08:01:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2008/06/16/53552.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/53552.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2008/06/16/53552.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/53552.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/53552.html</trackback:ping><description><![CDATA[ref:  <a href="http://timoqi.blogbus.com/logs/17282973.html" minmax_bound="true"><font color="#108dd2">http://timoqi.blogbus.com/logs/17282973.html</font></a><br /><br /><p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">server</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">端：</font></font></p><p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">首先是安装服务器相关软件</font></font></p><pre class="cjk" style="MARGIN-BOTTOM: 0.5cm" minmax_bound="true"><em minmax_bound="true"><font face="Nimbus Mono L, monospace" minmax_bound="true"><strong minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true"><span minmax_bound="true">sudo apt-get install nfs-kernel-server</span></font></font></strong></font></em></pre><p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">然后是编辑</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">/etc/exports</font></font></p><p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">添加：</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true"><strong minmax_bound="true">/home 172.16.30.211(rw,ro,sync,subtree_check)</strong></font></font></p><p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">exports</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">文件的具体修改方式可以通过 </font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">man exports</font></font></p><p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">/home</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">为服务器上需要映射的目录</font></font></p><p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">172.16.30.211</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">为客户端</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">IP</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">，也可以写成 </font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">172.16.30.0/24 </font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">这样的网段形式</font></font></p><p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><br minmax_bound="true" /></p><p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">执行<em minmax_bound="true"></em></font></font><em minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">exportfs -rv</font></font></em></p><p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">用来重新进行同步共享，并显示出来</font></font></p><p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><br minmax_bound="true" /></p><p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">最后重启下</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">nfs</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">服务器程序就可以了</font></font></p><pre class="cjk" style="MARGIN-BOTTOM: 0.5cm" minmax_bound="true"><em minmax_bound="true"><font face="Nimbus Mono L, monospace" minmax_bound="true"><strong minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true"><span minmax_bound="true">sudo /etc/init.d/nfs-kernel-server start</span></font></font></strong></font></em></pre><p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">client</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">端</font></font></p><p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">在</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">7.10</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">中</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">client</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">端需要安装</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">nfs</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">－</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">common</font></font></p><pre class="cjk" style="MARGIN-BOTTOM: 0.5cm" minmax_bound="true"><em minmax_bound="true"><font face="Nimbus Mono L, monospace" minmax_bound="true"><strong minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true"><span minmax_bound="true">sudo apt-get install nfs</span></font></font></strong></font><strong minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true"><span minmax_bound="true">－</span></font></font><font face="Nimbus Mono L, monospace" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true"><span minmax_bound="true">common<br /></span></font></font></font></strong></em><strong minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true"><span minmax_bound="true">映射服务器端的</span></font></font><font face="Nimbus Mono L, monospace" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true"><span minmax_bound="true">/home</span></font></font></font></strong><strong minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true"><span minmax_bound="true">目录</span></font></font></strong><em minmax_bound="true"><font face="Nimbus Mono L, monospace" minmax_bound="true"><strong minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true"><span minmax_bound="true">sudo mount -t nfs 172.16.30.189:/home /home</span></font></font></strong></font></em></pre><br />值得注意的是:<br />sudo 
<p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">NFS</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">在</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">ubuntu7.10</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">下安装</font></font></p><p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">server</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">端：</font></font></p><p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">首先是安装服务器相关软件</font></font></p><pre class="cjk" style="MARGIN-BOTTOM: 0.5cm" minmax_bound="true"><em minmax_bound="true"><font face="Nimbus Mono L, monospace" minmax_bound="true"><strong minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true"><span minmax_bound="true">sudo apt-get install nfs-kernel-server</span></font></font></strong></font></em></pre><p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">然后是编辑</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">/etc/exports</font></font></p><p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">添加：</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true"><strong minmax_bound="true">/home 172.16.30.211(rw,subtree_check)</strong></font></font></p><p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">exports</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">文件的具体修改方式可以通过 </font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">man exports</font></font></p><p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">/home</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">为服务器上需要映射的目录</font></font></p><p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">172.16.30.211</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">为客户端</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">IP</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">，也可以写成 </font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">172.16.30.0/24 </font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">这样的网段形式</font></font></p><p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><br minmax_bound="true" /></p><p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">执行<em minmax_bound="true"></em></font></font><em minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">exportfs -rv</font></font></em></p><p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">用来重新进行同步共享，并显示出来</font></font></p><p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><br minmax_bound="true" /></p><p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">最后重启下</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">nfs</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">服务器程序就可以了</font></font></p><pre class="cjk" style="MARGIN-BOTTOM: 0.5cm" minmax_bound="true"><em minmax_bound="true"><font face="Nimbus Mono L, monospace" minmax_bound="true"><strong minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true"><span minmax_bound="true">sudo /etc/init.d/nfs-kernel-server start</span></font></font></strong></font></em></pre><p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">client</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">端</font></font></p><p style="MARGIN-BOTTOM: 0cm" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">在</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">7.10</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">中</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">client</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">端需要安装</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">nfs</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">－</font></font><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true">common</font></font></p><pre class="cjk" style="MARGIN-BOTTOM: 0.5cm" minmax_bound="true"><em minmax_bound="true"><font face="Nimbus Mono L, monospace" minmax_bound="true"><strong minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true"><span minmax_bound="true">sudo apt-get install nfs</span></font></font></strong></font><strong minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true"><span minmax_bound="true">－</span></font></font><font face="Nimbus Mono L, monospace" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true"><span minmax_bound="true">common</span></font></font></font></strong></em><strong minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true"><span minmax_bound="true">映射服务器端的</span></font></font><font face="Nimbus Mono L, monospace" minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true"><span minmax_bound="true">/home</span></font></font></font></strong><strong minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true"><span minmax_bound="true">目录</span></font></font></strong><em minmax_bound="true"><font face="Nimbus Mono L, monospace" minmax_bound="true"><strong minmax_bound="true"><font face="ZhunYuan" minmax_bound="true"><font style="FONT-SIZE: 10pt" size="2" minmax_bound="true"><span minmax_bound="true">sudo mount -t nfs 172.16.30.189:/home /home 在我的机器上失败<br /></span></font></font></strong></font></em>我输入 mount -t nfs 172.16.1.82:/MyDev /mnt/tmp 成功<br /><br /><br /><br /><br /></pre><br minmax_bound="true" /><img src ="http://www.cppblog.com/CornerZhang/aggbug/53552.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2008-06-16 16:01 <a href="http://www.cppblog.com/CornerZhang/archive/2008/06/16/53552.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu 使用root帐号登入系统</title><link>http://www.cppblog.com/CornerZhang/archive/2008/06/10/52778.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Tue, 10 Jun 2008 10:18:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2008/06/10/52778.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/52778.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2008/06/10/52778.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/52778.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/52778.html</trackback:ping><description><![CDATA[Ubuntu安装后，root用户默认是被锁定了的，不允许登录，也不允许“su”到 root。有人说这是个不好的实践，特别是对于服务器来说。我觉得对于桌面用户来说，这样安全性更高一些，是应该的；但对于服务器可以设置成“允许 su 到root，但不允许root用户直接登录”。而我为了开发时的方便，则在桌面和服务器上都采用这种方式。 
<p>　　允许 su 到 root </p><p>　　非常简单，下面是设置的方法： </p><p>　　me@tipfoo:~$ sudo passwd </p><p>　　Password: &lt;--- 输入安装时那个用户的密码 </p><p>　　Enter new UNIX password: &lt;--- 新的Root用户密码 </p><p>　　Retype new UNIX password: &lt;--- 重复新的Root用户密码 </p><p>　　passwd：已成功更新密码 </p><p>　　允许root登录 </p><p>　　如果要允许root登录（不推荐），则这样操作： </p><p>　　me@tipfoo:~$ gksu /usr/sbin/gdmsetup </p><p>　　（或者使用桌面菜单：系统＞系统管理＞登录窗口） </p><p>　　点“安全”选项页，选择“允许本地管理员登录”。 </p><p>　　注：这一步依赖上一步 </p><p>　　不输入密码直接登录 </p><p>　　在论坛上也看见有人抱怨，家中的Ubuntu不能像Window$那样──不用输入密码就能登录。其实同样能做到： </p><p>　　就在上一步的“安全”选项页中，勾选： </p><p>　　“启用自动登录”，“用户”选择（如：“me”）; </p><p>　　注意：公共用的计算机千万不能这么设置！ </p><p>　　SSH登录远程服务器 </p><p>　　如果远程服务器只允许root用户SSH到服务器时，在Ubuntu下，必须“su 到root”用户才能登录成功(具体是看服务器端的配置)。 </p><p>　　首先，复制密钥到“/root/.ssh/”目录， </p><p>　　me@tipfoo:~$ su </p><p>　　Password: </p><p>　　root@tipfoo:/home/me# chmod 600 -R /root/.ssh/ </p><p>　　root@tipfoo:/home/me# ssh -p 27482 11.22.33.44 </p><p>　　Enter passphrase for key '/root/.ssh/id_rsa': </p><p>　　Last login: Thu Jun 21 14:29:00 2007 from 11.22.33.45</p><!-- 分页 --><!-- 分页end --><img src ="http://www.cppblog.com/CornerZhang/aggbug/52778.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2008-06-10 18:18 <a href="http://www.cppblog.com/CornerZhang/archive/2008/06/10/52778.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网摘-局域网共享文件夹</title><link>http://www.cppblog.com/CornerZhang/archive/2008/06/04/52192.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Wed, 04 Jun 2008 13:52:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2008/06/04/52192.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/52192.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2008/06/04/52192.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/52192.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/52192.html</trackback:ping><description><![CDATA[<br />局域网共享文件夹不能访问，系统提示：“您可能没有权限使用网络资源.请与这台服务器的管理员联系以查明……”<br />   由提示看来，很明显是权限问题，原来的98下共享没有这一问题，只要设置好IP地址和共享文件夹，就立即能够访问，而一旦遇到XP和2003，这一问题就一再出现，很明显与XP和2003的安全性考虑有关。<br />　　文件共享与以下设置有关，于是我对计算机如下设置一一进行了检查：<br />　　（1)NWlink IPX/SPX/NetBIOS Compatible Transport Protocol协议。本协议已经安装就绪，没有问题。<br />　　（2)开启guest账号：右击我的电脑\管理\用户有个guest，双击之去掉“账户已停用”前面的勾。本设置最初没有开启，我将其开启。<br />　　（3)统一各计算机的工作组名：右击我的电脑\属性\计算机名，查看该选项卡中出现的局域网工作组名称，将所有计算机均加入Workgroup工作组。<br />　　（4）使用winxp防火墙的例外：winxp防火墙在默认状态下是全面启用的，这意味着运行计算机的所有网络连接，难于实现网上邻居共享。同时，由于windows防火墙默认状态下是禁止“文件与打印机共享的”，所以，启用了防火墙，往往不能共享打印，解决办法是：进入“本地连接”窗口，点“高级”\“设置”\“例外”\在程序与服务下勾选“文件和打印机共享”。由于网吧计算机使用还原卡，所以我干脆关闭了防火墙。<br />　　（5)删除“拒绝从网络上访问这台计算机”项中的guest账户：运行组策略（gpedit.msc）\本地计算机\计算机配置\windows设置\安全设置\本地策略\用户权利指派\拒绝从网络访问这台计算机。如果其中有guest，则将其删除。这样做的目的是让guest可能从网络访问本机。<br />　　（6)取消“使用简单文件共享”方式：资源管理器\工具\文件夹选项\查看\去掉“使用简单文件共享（推荐）”前面的勾。<br />　　（7)勾选“Microsoft网络的文件和打印机共享”。<br />　　（8)运行服务策略“Services.msc”。启动其中的“Clipbook Server”(文件夹服务器)：这个服务允许你们网络上的其他用户看到你的文件夹。我直接将此服务设置为自动自动启动。<br />　　（9)win98的计算机无法访问win2000/winxp的计算机，原因是：win2000/winxp的计算机中的guest用户被禁用了或者win2000/winxp采用NTFS分区格式，设置了权限控制。一般要允许win98访问的话，win2000/winxp里的安全控制里不要将everyone的账号组删除。<br />　　注意：<br />　　a、如果您没有加入域并想查看“安全”选项卡，则设置显示“安全”选项卡：资源管理器\工具\文件夹选项\查看\去掉“使用简单文件共享（推荐）”前面的勾。<br />　　b、查看文件和文件夹的有效权限：资源管理器\右击要查看有效权限该文件或文件夹\“属性”\单击“安全”选项卡\“高级”\“有效权限”\“选择”\在“名称”框中键入用户或组的名称，然后单击“确定”。选中的复选框表示用户或组对该文件或文件夹的有效权限。<br />　　c、只能在格式化为使用 NTFS 的驱动器上设置权限。<br />　　（10）解决网上邻居太慢的方法：win98，假设网络中没有novell网络，可删除为了兼容novell netware网络而装的ipx/spx兼容协议即可；win2000/xp，可删除系统盘符\documents and setting\用户名\nethood文件夹下的所有文件即可。<br />　　由于网吧继往开来采用XP系统，所以后两条我不用管它，需要98系统访问共享文件夹的朋友可能需要检查该项设置。<br />　　以上所有设置都检查无误之后，我发现访问共享文件夹还是原来的现象，根本没有什么好转。到底是什么原因导致这一问题？以上的设置方法，许多文章都有论及，似乎不应有问题。但既然问题依旧，那就是说还有什么地方需要作设置调整，而这正是大家所忽略的。<br />　　于是我对系统服务和安全策略进行了仔细检查。<br />　　当我依次选择“计算机配置－→Windows设置－→安全设置－→本地策略－→安全选项”，检查组策略时，发现有一条“网络访问：本地账号的共享和安全模式”策略，默认设置为“仅来宾－本地用户以来宾身份验证”，它的另外一个可选设置是“经典：本地用户以自己的身份验证”，怀疑与此设置有关，因此对这一设置进行了修改。<br />　　重新测试时发现问题还是没有解决。做到这里，我已经黔驴技穷了，于是只好求助于网上，可是找来找去，大多说法都与以上设置中的若干条不谋而合，并没有多少新的东西。难道就这样放弃吗？我真是不愿意就这样认输。<br />　　由于我仍然抱着一线希望在网上搜索，终于看到如下一段文字：<br />　　不过我们可能还会遇到另外一个问题，当用户的口令为空时，访问还是会拒绝。原来在“安全选项”中有一个“帐户：使用空白密码的本地帐户只允许控制台登录”策略，默认是启用的，根据Windows XP安全策略中拒绝优先的原则，密码为空的用户通过网络访问使用Windows XP的计算机时便会被禁止。我们只要将这个策略停用即可解决问题。<br />　　原来是这样，难怪我家的XP访问2003的共享文件夹时就必须使用2003的帐户密码访问，使用XP自身的帐户就提示没有权限访问。依照本文说法，如果XP帐户是有密码的，则使用密码后就没有问题了。既然这样，我立即在组策略中找到了这一策略，它是雇用的，不用说，禁用它。再试，共享文件夹访问正常了，而且速度很快。<br />　　结论，共享文件夹访问权限问题是很常见的网络故障，然而大家都对其修正办法讲得不完善，都忽略了“帐户：使用空白密码的本地帐户只允许控制台登录”这一策略。很自然，这个问题也就解决得并不彻底。原因就在于，大家对“密码为空的用户通过网络访问使用Windows XP的计算机时便会被禁止”这一点不了解。这是XP以上系统出于安全考虑而做的设置。这就告诉我们，平时的学习工作一定要深入细致，这样才不至于因忽略一些细节问题而使自己陷于困局 <br /><img src ="http://www.cppblog.com/CornerZhang/aggbug/52192.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2008-06-04 21:52 <a href="http://www.cppblog.com/CornerZhang/archive/2008/06/04/52192.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Ubuntu的注意事项</title><link>http://www.cppblog.com/CornerZhang/archive/2008/05/30/51591.html</link><dc:creator>Corner Zhang</dc:creator><author>Corner Zhang</author><pubDate>Fri, 30 May 2008 05:51:00 GMT</pubDate><guid>http://www.cppblog.com/CornerZhang/archive/2008/05/30/51591.html</guid><wfw:comment>http://www.cppblog.com/CornerZhang/comments/51591.html</wfw:comment><comments>http://www.cppblog.com/CornerZhang/archive/2008/05/30/51591.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/CornerZhang/comments/commentRss/51591.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/CornerZhang/services/trackbacks/51591.html</trackback:ping><description><![CDATA[往往在编译完后 会忘了运行ldconfig, 以至于有些shared object找不到<br /><br />所以， 注意运行sudo ldconfig!<img src ="http://www.cppblog.com/CornerZhang/aggbug/51591.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/CornerZhang/" target="_blank">Corner Zhang</a> 2008-05-30 13:51 <a href="http://www.cppblog.com/CornerZhang/archive/2008/05/30/51591.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>