2008年10月9日星期四

所看见的并非是事情的全部。

十一回家,因为没买到坐票,只好在动车组上站着,中途见一对母女(女孩大约3-4岁的样子)上车,在火车行驶的过程中,这位母亲到处走动并告诉人家说她手上的车票是有坐的,但是位置被别人占了。很多好心人都劝她去跟别人理论,凭什么有座票却没座位,何况还带个孩子。这位母亲推说不想跟别人吵架,非要等列车员来解决。原本如此简单的事情,让周围的人议论纷纷,有的说这位母亲比较软弱,有的给她打气,最终只见说话不见任何人以任何实际行动来帮忙。
此时,我十分的看不顺这些动嘴皮子的,所以就在心里盘算着该怎么帮忙。心中设想着各种情况出现的可能,把最坏的暴力解决问题的想法都有了。
也许是我想的太多,也属于沉默的大多数。
列车员来了,列车员带着母女两人,来到了座位旁。拿着票说这母女有车票,座位在这。可座上的人却说她也有座票,而且座位也是这里。??? 怎么会出现同一张座位有两张票?列车员拿着票,左看右看,上看下看,许久后,对这母女说,你的票是假票。传说中的假火车票就这样横空出世了。
列车员把母女两人又带到了列车长那里,后面的事情就不知道了。。。。
上面这件事,让我思考了很久。
1. 助人为乐,没有错。该出手时就出手
2. 做事情要考虑周全,因为不是什么性命攸关的事情,所以还是要考虑一下的,千万不能动不动就想到暴力解决问题。暴力只会带来更多的暴力,除非对方就是欠扁!
3. 我们看到的是事情的全部吗?如果不是在列车员几经研究才发现出是假票,难道我们拿着假票理直气壮的去要座?

-- 写到这里,不知该怎么继续了,我开始迷惑自己刚开始坚持的观点了。刚刚脑袋里闪现出我们经常看电视遇到的情形,某人做了很多好事,却因为别人看到某人恰巧做的一件不好的事情而产生种种的误会。所以还是要冷静的分析,多沟通。把事情的全部过程弄明白了再发表意见。也许这是我想表达的意思。

2008年9月25日星期四

不仅要造砖,还要和泥,还要讲究方法!

传说中的程序高手说写程序就像搭积木,把各个模块做好然后搭在一起就好了。

以前我都是把焦点放在积木上面,想着怎么造积木。积木的制造方法有个准则就是:高内聚,低耦合。

然而当积木造好以后却不知怎么搭起来。

此时我们需要的就是和泥,用水泥把各个砖头连接起来,从而造成高楼大厦。水泥也有另一个说法叫:胶水层,顾名思义就是像胶水一样把各个模块连接起来。

积木和胶水都有了,怎样才能更有效的把大楼搭建起来呢?设计模式,最有名的就是4人组的23个设计模式,当然我们不能局限于这几种模式,这些模式是前辈们总结整理出来的,具有一定的通用性和代表性。在实战中我们也要把自己的一些常用方法总结出来,如果也同样具有通用性的话,那可是造福人类了。

积木,胶水。其实也是软件分层开发的原因之一。

2008年9月21日星期日

欲善其事,必先利其器

欲善其事,必先利其器。不是说没了利器就不能善其事,而是在某种程度上利器是善其事的有力支持。相同的人去劈柴,在同样的时间内,钝斧的效率是远不及利斧的。
昨天我跟老婆一起从枫林路中山医院出发一路骑自行车去朱家角(计划是去上海大观园)。我骑的是一辆凤凰牌公路车,老婆骑的是普通城市车。公路车在速度上远高于城市车,而且骑的人也不会感觉到累。此为器一利。(中途,老婆也试着骑公路车,那个公路车的龙头实在僵硬,老婆在车上浑身紧张)
我的公路车是一周前买的二手车。自己从没骑过公路车,所以就当练习了。前面说过车子的龙头很僵硬,第二就是不能大转弯(非上海俗语中的大转弯)因为前车胎和脚蹬的距离太近,转弯大的时候会碰到脚。(如果这里有所改进,会成为灵活专项的利器之一)
昨天全部路程约90公里。到朱家角的时候,我的双手手腕有些疼痛,手掌更甚。为什么骑自行车手会很疼?我们走的路线是虹桥路转延安西路再转到沪青平公路(318国道)。这一路的道路也不是一马平川,路面状况绝不及奥运会公路自行车比赛的赛道。骑公路车时重心前倾,手臂承受不少的力量,我的公路车没有避震器,在坑洼路面上遇到的颠簸全部通过龙头传递到手臂了。近8个小时的颠簸,手掌已经有些肿胀。今早起来,肩部也是酸痛。(在道路不平的路面骑车,尤其是长时间的,一定要选择有避震器的自行车。这也可以成为利器之一.)
速度,公路车的速度可以轻松保持在25km/h 还可以快速的提高到35km/h。在车上被风吹得感觉太好了。可以上的了高速度,也是利器之一
以上举了一些例子来说明一个好的工具可以带来很多好处,但是这些都是提高成绩的要素,而不是基本功。如果自行车都不会骑,那给你辆超豪华的利器又有何用?
高手和俗人的区别之一是拥有扎实的基本功,并能熟练的使用利器。有了这个就能快速的消灭拦路虎!

btw, 在路上遇到4位看上去60岁以上的老人家,骑自行车。听口音像是北方人,他们向我打听去杭州的路线。猜想杭州也许并不是他们的目的地。

2008年9月17日星期三

强烈支持Web标准

我在linux下工作,支持正版软件!

有些网站就是懒,依赖着M$的统治地位,开发时就根本不在乎其他平台用户的感受!

今日,我访问国泰君安的网站准备开户在股市低迷时期杀入,可在firefox平台上,填写开户预约的时候,选择地区营业庭时,选择城市后就玩完了,下级菜单无法使用!这不是逼着我转向window吗?

虽然我可以依靠工作的优势得到正版Windows,可是我真的需要在linux下工作,学习!

再次鄙视一下那些乱来的,懒的,急功近利的网站!

强烈支持 Web标准

2008年9月16日星期二

记阿里软件开放平台--淘宝API

现在很多的internet站点都开放了API,吸引广大的程序员和有眼光的商人利用host站点的资源来进行扩展开发。这样会带来不少的好处。
1. host提供者可以免费的获取广大的资源(有技术能力的人)来为他扩展系统,从而提高host用户的粘度,并且host并需要为此负担更多的风险,还可以更便捷的收购!
2. 寻找更好的创意。俗话说三个臭皮匠顶个诸葛亮,何况隐藏在"民间“的程序/创意高手不计其数!
3. 让草根更容易赚到第一桶金。创业的成本是跟高的,host提供API并共享了庞大的用户群,让一些有能力的个人或小公司得以付出比较少的成本就能将技术转化成生产力!

基于以上和更多的诱惑,淘宝网也开放了自己的API。

这个中秋节有一半的时间在倒腾这个淘宝的API。
首先,阅读文档,这是入门的不二之选。我认为淘宝的文档实在太少,而且文档的发布也不怎么正规。随便找个不不知道是什么身份的人在淘宝的论坛里发个帖子就算是文档的发布了。文档中的示例代码残缺不全,以前看ThinkPHP文档的时候也是这个感觉。

阅读文档之后,实现一个demo。我选择的是淘宝的web版本的API,API调用的方式为REST。另外我需要一个虚拟主机用来托管程序,这里我选择了google的 app engine。所以python也就成了我的主要开发语言。

在淘宝的文档中介绍了.net,java, php 的示例代码。我选择python来实现其实也并不困难。东西准备的差不多了,我们开始实验下吧。在众多杂乱无章的文档中,我看到了些说明。在开发之前要验证一下淘宝API的有效性。如调用 http://sipdev.alisoft.com/sip/rest?sip_apiname=alisoft.validateUser 则会返回xml格式的数据。内容大致是需要appkey。 就这个URL我折腾了好久阿。win+ie, win+firefox, linux+firefox 几个平台我都尝试访问,可是返回的却始终是ContentLength=0的东西!而淘宝生产环境的API,http://sipd.alisoft.com/sip/rest?sip_apiname=alisoft.validateUser倒是能时不时的返回几个文档中说的结果。

至此只好用淘宝生产环境的API来开发了。

使用淘宝API需要生成一个MD5的签名用来认证。生成签名的步骤是,将code,appkey,appname等属性以及其值拼接成一个字符串后用MD5生成一个32位的字符串。我们都知道MD5签名时,内容有任何细微的差别生成的code都不一样。所以拼接这个字符串一定要小心小心再小心,不要多,不要少,注意区分大小写。

生成签名后就是通过REST来调用API了。

完整使用淘宝API还需要作很多工作,虽然文档比较烂,但总比没有的好。多看看,兴许能捡到什么有用的信息。

BTW:我的第一个淘宝认证API调用失败了,最后的erro是签名不正确。如果谁热心愿意帮助我一下,我把代码发过去帮我review一下!谢谢!

2008年9月9日星期二

保存劳动成果

在日常工作中,总要写一些小工具,或者一些代码片段等,这些都是自己的劳动成果,而且还有复用、备忘等功效。所以保存这些东西是有必要的。

管理这些文件是绝对有必要引入版本控制的,好处嘛是在是太多了,想知道的Google一下。因为是个人的文件管理,所以我选择了subversion

subversion 是一个CS结构的版本管理工具,所以我需要一个稳定的Server端。个人资金有限不能自己托管服务器以供使用,这时又想到Google了。Google提供了免费的SVN服务器为各个开源项目使用。虽然咱最开始的目的是为了私用,由于Google SVN Server的特性,咱的文档可以自由访问,如果自己的文档能为他人提供便利,也不枉自己一心想为Freedom Software做点贡献。

如果你也有兴趣跟大家一起分享,我随时欢迎您的加入!


项目地址: http://code.google.com/p/misc-snippets/

2008年9月8日星期一

我想哭但是哭不出来!

入行做程序员也不是一天两天了,居然还是犯这样的低级错误,绝对不可原谅。
最近在写一个开源的项目svnaccesspolicy(用于管理在apache环境下的svn用户信息) ,基本功能已经完成,这些天一直在重构代码,让项目变得更模块话,更现代一些。重构阿重构,慢慢的快成形了。

这时忍不住要玩 Debian Live USB了,也就是把debian安装在2G的优盘上。安装很容易,为了能让在windows上也能查看优盘上的信息,把优盘分了2个区,分别是fat和fat32格式的。这时也为后面的遭遇埋下了伏笔。

优盘上的debian可以使用了,我就迫不及待的把svnaccesspolicy的源代码cut到了优盘上进行开发。此时既没check in代码也没用copy。

在家里使用一切到还顺利,毕竟全是linux环境。等到了公司,才发现windows竟然不认识分区的优盘,只能看到优盘的第一个主分区。而那个主分区是live debian系统的,源码都不在那里。于是乎,打开vmware尝试重新整理优盘。在做这些之前,由于live系统的不方便,就把代码打包压缩,并复制到了 vmdk (vmware的虚拟硬盘上)。然后尝试安装了centos, suse, ubuntu 等,再次证明如此安装系统到优盘上是需要大量做工作的。就暂时放弃,改装最新的live debian。

一切算是回到从前,准备把备份在vmware虚拟硬盘上的文件还原的时候,这才发现虚拟硬盘上空空也!空空也!辛苦的工作就这样付之东流!

切记,切记,工作要稳重。 实验环境要和工作环境完全分开。否则真的是欲哭无泪阿!

2008年9月7日星期日

你必须了解他,才能真的随心所欲!

你要了解游戏规则,
你要了解语言的规则,
你要了解系统的规则,
你要了解计算机运作的规则,
......

要了解很多才行,事实上没有人能完全了解所有,这也是人与人之间的差异所在!
尽可能多的去了解兴趣所在的领域吧! Enjoy!

2008年9月3日星期三

google chrome 第一天体验

google 终于推出浏览器了,试想google的大部分应用都是通过浏览器操作的,怎么能让自家命脉捏在别人手上? 如今满天飞的浏览器,google chrome 又能给大家带来什么?

google 其实还是很霸道的(不霸道如何跟更强悍的microsoft抗争,不霸道怎么能降服如此之多的电脑菜鸟?哈哈),google chrome 的安装是一步到位,不给你任何选择的余地,默认安装在C盘。(还好根据以往经验C盘绝对是足够的大)

早在昨天就通过新闻和google blog了解了下google chrome,当启动google chrome以后还是掩饰不住对它简洁风格的喜爱。那是一个漂亮 ^_^。

今天是在公司初体验google chrome的,这个不刚使用就发现个有个地方让人无法忍受。我们公司的网络环境是这样的, ISA Server 把关,客户端使用代理上网。如果把网络连接设置为自动检测代理,google chrome的速度就真的让人无法忍受了,每次请求文件都要长时间的等待代理响应。把google chrome的rander快速的特性完全掩盖了。经过研究,把自动检测代理设置unchecked,速度会提升不少。

下班回家后,迫不及待的在自己的本本上安装 gogole chrome,公司里的代理问题不存在了。完全沉浸在它的快速,简洁的体验中。。。

BTW:老婆把我的本本霸占玩泡泡糖了,我只好在128M内存的图拉丁的ubuntu上写blog。有时间给大家介绍一下我的轻量级桌面。(其实也不轻量,web server 就安装了 apache2 lighttpd nginx , DB server 装了 MySQL, PostgreSQL 而且此时都启动起来了。呵呵)

2008年8月31日星期日

50公里

刚买的码表派上用场了,昨天骑自行车到张江一个来回跑了50公里,总体感觉还行,就是路上的灰多了些,尤其是回来时在中山南路高架下面,实在受不了,瞅准机会马上就溜到斜土路上。
运动以后的当天真的很舒服,晚上睡的很舒服。平时虽然有些困,但是脑袋总是在活动的状态,多梦,锻炼以后那个困劲抵挡不住啊,倒在床上马上呼呼大睡,一觉到天亮,怎么一个爽字了得!
出去锻炼的好处可不仅仅是为了好好睡觉。还可以去欣赏上海这个国际都市很普通的一面,弄堂,形形色色的上海人。
每次骑自行车出去的目的地,都尽量是一个有绿色,人烟稀少的地方。这样能放松心情,好好的思考一下。每日里,宅在公司和家里,思维都已经接近枯竭。做的每一件事情都觉得无聊。利用周末出去,找回灵感。

让生活在多姿多彩起来!

2008年8月28日星期四

IE 8 beta 2 貌似还不错

很久以前使用的 IE 8 beta 1 真的是惨不忍睹,这不,beta 2 出来救火了。粗略的使用下,访问了几个站点。发现速度快了些。有些网站的排版有点变型,如豆瓣,CSDN等,还好变型的不是很离谱!
样子有了些改进,比IE7漂亮。

回家在xp上安装一个 IE 8 beta 2

下载地址

2008年8月27日星期三

[转]两分钟让你明白什么是ERP

ERP(Enterprise ResourcePlanning)企业资源计划系统,是指建立在信息技术基础上,以系统化的管理思想,为企业决策层及员工提供决策运行手段的管理平台。

一天中午,丈夫在外给家里打电话:“亲爱的老婆,晚上我想带几个同事回家吃饭可以吗?”(订货意向)

妻子:“当然可以,来几个人,几点来,想吃什么菜? ”

丈夫:“6个人,我们7点左右回来,准备些酒、烤鸭、番茄炒蛋、凉菜、蛋花汤……。你看可吗?”(商务沟通)

妻子:“没问题,我会准备好的。”(订单确认)

妻子记录下需要做的菜单(MPS计划),具体要准备的东西:鸭、酒、番茄、鸡蛋、调料……(BOM物料清单),发现需要:1只鸭蛋,5瓶酒,4个鸡蛋……(BOM展开),炒蛋需要6个鸡蛋,蛋花汤需要4个鸡蛋(共用物料)。

打开冰箱一看(库房),只剩下2个鸡蛋(缺料)。

来到自由市场,妻子:“请问鸡蛋怎么卖?”(采购询价)

小贩:“1个1元,半打5元,1打9.5元。”

妻子:“我只需要8个,但这次买1打。”(经济批量采购)

妻子:“这有一个坏的,换一个。”(验收、退料、换料)

回到家中,准备洗采、切菜、炒菜……(工艺线路),厨房中有燃气灶、微波炉、电饭煲……(工作中心)。

妻子发现拨鸭毛最费时间(瓶颈工序,关键工艺路线),用微波炉自己做烤鸭可能来不及(产能不足),于是阅览室在楼下的餐厅里买现成的(产品委外)。

下午4点,接到儿子的电话:“妈妈,晚上几个同学想来家里吃饭,你帮忙准备一下。”(紧急订单)

“好的,你们想吃什么,爸爸晚上也有客人,你愿意和他们一起吃吗?”

“菜你看着办吧,但一定要有番茄炒鸡蛋,我们不和大人一起吃,6:30左右回来。”(不能并单处理)

“好的,肯定让你们满意。”(订单确定)

“鸡蛋又不购了,打电话叫小贬送来。”(紧急采购)

6:30,一切准备就绪,可烤鸭还没送来,急忙打电话询问:“我是李太,怎么订的烤鸭还不送来?”(采购委外单跟催)

“不好意思,送货的人已经走了,可能是堵车吧,马上就会到的。”

门铃响了。

“李太太,这是您要的烤鸭。请在单上签一个字。”(验收、入库、转应付账款)

6:45,女儿的电话:“妈妈,我想现在带几个朋友回家吃饭可以吗?”(呵呵 ,又是紧急订购意向,要求现货)

“不行呀,女儿,今天妈已经需要准备两桌饭了,时间实在是来不及,真的非常抱歉,下次早点说,一定给你们准备好。”(哈哈,这就是ERP的使用局限,要有稳定的外部环境,要有一个起码的提前期 )。
…… ……

送走了所有客人,疲惫的妻子坐在沙发上对丈夫说:“亲爱的,现在咱们家请客的频率非常高,应该要买些厨房用品了(设备采购),最好能再雇个小保姆(连人力资源系统也有缺口了)。
丈夫:“家里你做主,需要什么你就去办吧。”(通过审核)

妻子:“还有,最近家里花销太大,用你的私房钱来补贴一下,好吗?”(最后就是应收货款的催要)

现在还有人不理解ERP吗?记住,每一个合格的家庭主妇都是生产厂长的有力竞争者

2008年8月25日星期一

Python中的lambda函数

Python支持一种有趣的语法,它允许你快速定义单行的最小函数。这些叫做lambda函数,是从Lisp借鉴来的,可以用在任何需要函数的地方。
  • 总的来说,lambda函数可以接收任意多个参数并且返回单个表达式的值。lambda函数不能包含命令,包含的表达式不能超过一个。不要试图向lambda函数中塞入太多的东西;如果你需要更复杂的东西,应该定义一个普通函数,然后想让它多长就多长。(当然,太长的函数也是不推荐的)
  • lambda函数是一种风格问题。不一定非要使用它们;任意能够使用它们的地方,都可以定义一个单独的普通函数来进行替换。一般将它们用在需要封装的特殊的,非重用代码上,避免令代码中充斥着大量的单行函数。
lambda示例
1 # 普通函数
2 def f(x):
3      return x*2
4
5 >>>f(3)
6 6
7
8 # lambda函数
9 func = lambda x: x*2
10 >>>func(3)
11 6
12 >>>(lambda x: x*2)(3)
13 6

2008年8月24日星期日

万里长征第一步

有些事情现在不做,也许以后永远也不会做。

第一步终于迈了出去。骑自行车出行,从徐家汇到闵行紫竹工业园。从Google地图上看距离约33公里,一个来回加上在紫竹工业园以及交大闵行校区骑行的路程一共约75公里。

一直梦想着能骑自行车出去,这次紫竹之行很成功,积累了一些自行车出行的经验。为自己自行车环中国游迈出了第一步!

一行三人,Shirley表现很出色!作为一名女生,75公里的路程硬是坚持了下来。好样的!

2008年8月21日星期四

借口是多么的苍白无力

面对犀利的询问者,无论什么样的托辞、借口都显得如此苍白。

还是认真的做好自己的工作。为自己的理想和目标工作!

2008年8月18日星期一

只有失败是不够的

更重要的是失败后总结,并修正错误。
俗话说失败是成功之母,这句话其实是概括了总结失败修正失败。只有总结失败,并修正才能不在同一个地方摔倒两次。

2008年8月17日星期日

沟通

        在我看来,读书也是一种沟通,是与作者的一次沟通。作者通过他的著作来告诉你他想要表达的思想,如果能读懂作者的表达的思想,那么这次沟通就是成功的。如果通过阅读而不能理解作者的意思,那就说明此次沟通存在问题,自己的知识水平和作者不是一个高度、自己和作者的专业领域不同、作者是个疯子?这些都是造成沟通障碍的可能原因。


        平时的工作生活中,我们也免不了要和其他人进行沟通,那每次沟通的成果如何呢?作为一名技术人员,免不了要和一些非技术员进行沟通。此时如何让他们知道自己在说些什么呢?众所周知,一些大牛们说的话都很通俗易懂,以至于人们有点怀疑他们是不是真的专家。殊不知,这才是牛的最高境界。将专业知识用平明话的语言来进行表达。什么是相对论?爱因斯坦曾经这样说过,当你和你心爱的人在一起时,一个小时好像10分钟一样的就过去了,如果让你一个人大热天的坐在火热的锅炉旁边的话,即使是一分钟,你也会觉得是像1小时或者更长一样。这样的描述,各个年龄段的人应该都能听的懂。你说不是吗?


        上面说的是大家在技术背景不同的情况下进行沟通时,当大家都是专业技术人员的话又该如何沟通呢?难道也要将专业技术术语来描述成平民化的语言?此时完全没有必要,既然大家都是在相同的背景下进行沟通,那么就尽可能的使用专业术语,言简意赅的描述有画龙点睛之妙。


        造成沟通困难的原因,大都是人的原因,个体的差异导致沟通时出现鸡同鸭讲的局面。为了保证有效的沟通,一,用平民化的语言来描述,也就是站在对方的角度来描述问题。二,进行专业沟通时要统一专业术语,当有新的专业术语出现时,大家要及时更新,保证描述的一致性。

2008年8月12日星期二

十年学会编程

著者: Peter Norvig
翻译: Dai Yuwen

为何人人都这么着急?

信步走进任何一家书店,你会看到名为《如何在7天内学会Java》的书,还有各种各样类似的书:在几天内或几小时内学会Visual Basic, Windows, Internet等等,一眼望不到尽头。我在Amazon 上做了如下的 强力检索 :
pubdate: after 1992 and title: days and
(title: learn or title: teach yourself)

得到了248个结果。前78个都是计算机类书籍(第79个是 Learn Bengali in 30 days)。我用"hours"替换"days",得到了类似的结果:更多的253书。前77本是计算机类书籍,第78本是 Teach Yourself Grammar and Style in 24 Hours。在前200本书中,有96% 是计算机类书籍。

结论是:要么人们都在忙忙地学习计算机,要么计算机比其它任何东西都容易学。没有书籍教你在几天内学会古典音乐、量子物理,或者是养狗。

让我们分析一下,象一本名为《三天内学会Pascal》的书意味着什么:

* 学习: 在三天里,你没有时间写一些重大的程序,并从成功或失败中得益。你没有时间与有经验的程序员合作,并理解在那样的环境下工作是怎么回事。一句话,你不会有时间学到太多东西。因此他们只能谈论一些肤浅的东西,而不是深入的理解。正如亚力山大教皇所说,浅尝辄止是危险的事情。

* Pascal: 在三天时间里,你可能学会Pascal的语法(如果你已经学过类似的语言),但你学不到更多的如何使用这些语法的知识。也就是说,假如你曾是个BASIC 程序员,你可以学着用Pascal语法写出BASIC风格的程序,但你不可能了解Pascal真正的好处(和坏处)。那么关键是什么? Alan Perlis 说过:“一种不改变你编程的思维方式的语言,不值得去学。” 一种可能的情况是:你必须学一点儿Pascal(或可能性更大的象Visual Basic 或 JavaScript之类),因为你为了完成某种特定的任务,需要与一个现存的工具建立接口。不过那不是学习如何编程,而是在学习如何完成那个任务。

* 三天内: 很不幸,这不够,原因由下一节告诉我们。

在十年里学会编程

研究表明 (Hayes,Bloom) 在任何一种领域内,象下棋、作曲、绘画、钢琴演奏、游泳、网球、以及原子物理学和拓扑学,等等,要达到专家水平大约都要化十年时间。没有真正的捷径:即使是莫扎特,4岁时就是音乐神童,13年后才开始写出世界级的作品。在另一方面,披头士似乎在1964年的Ed Sullivan表演上一炮走红。但他们从1957年就开始表演,在获得大众青睐后,他们的第一个重大成功,Sgt. Peppers,是1967年发行的。Samuel Johnson (塞缪尔·约翰逊,英国辞典编纂家及作家)认为要花比十年更长的时间:“在任何领域中出类拔萃都要用毕生的劳作来取得;它不可能用较低的代价获得。” 而Chaucer(乔叟,英国诗人)感叹到:“人生短暂,学海无涯。”

这是我为编程成功开出的方子:

* 设法对编程感兴趣,并且因为它有趣而编一些程序。确保编程一直充满足够乐趣,这样你才愿意投入十年宝贵时间。

* 与其他程序员交流; 阅读其它程序。这比任何书本或训练课程都重要。

* 写程序。 最好的学习方式是 从实践中学习。 用更技术性的话说,“在一个给定的领域内,个人的最大能力不是自动地由扩展了的经验取得的,但即使是高度有经验的人也可以通过有意识的努力来提高自己的能力” (p. 366) 和 “最有效的学习需要因人而异的适当难度,目标明确的任务,丰富的信息反馈,以及重复的机会和错误修正。” (p. 20-21) 此书 Cognition in Practice: Mind,Mathematics,and Culture in Everyday Life 是阐明此观点的令人感兴趣的参考文献。

* 如果愿意,在大学里呆上4年或更长(在研究生院里)。你会接触到一些需要学历证明的工作,你会对此领域有更深的理解。如果你不喜欢学校,你可以(通过一些贡献)在工作中获得相似的经验。在任何情况下,光啃书本是不够的。Eric Raymond,The New Hacker's Dictionary一书的作者,说过,“计算机科学不能把任何人变成编程专家,就象光研究刷子和颜料不会使人变成画家一样。” 我雇佣过的最好的程序员之一仅有高中程度;他做出了许多优秀的 软件,有他自己的新闻组,而且通过股票期权,他无疑比我富有的多。

* 和其他程序员一起做项目。在其中的一些项目中作为最好的程序员; 而在另一些项目中是最差的。当你是最好的,你能测试领导项目的能力,用你的观点激发别人。当你是最差的,你学习杰出者是怎么做的,了解他们不喜欢做什么(因为他们吩咐你做事)。

* 在其他程序员 之后接手项目。使自己理解别人写的程序。当程序的原作者不在的时候,研究什么需要理解并且修改它。思考如何设计你的程序以便后来者的维护。

* 学习至少半打的编程语言。包括一种支持类抽象的语言(象Java 或C++),一种支持函数化抽象的语言(象Lisp或ML),一种支持语法抽象的语言(象 Lisp),一种支持声明规格说明的语言(象Prolog或C++ 的模板),一种支持共行程序(coroutine)的语言(象Icon或Scheme),一种支持并行的语言(象Sisal)。

* 请记住“计算机科学”中有“计算机”一词。了解你的计算机要花多长时间执行一条指令,从内存中取一个字(有cache),从磁盘中读取连续的字,和在磁盘中找到新的位置。(答案)

* 参与一种语言标准化的工作。它可以是ANSI C++委员会,也可以是决定你周围小范围内的编程风格是应该两个还是四个空格缩进。通过任何一种方式,你了解到其他人在某种语言中的想法,他们的理解深度,甚至一些他们这样想的原因。

* 找到适当的理由尽快地从语言标准化的努力中脱身。

明白了这些,仅从书本中你能得到多少就成了一个问题。在我第一个孩子出生前,我读了所有的(关于育儿的)How to 书籍,仍然感觉是个手足无措的新手。30个月以后,我的第二个孩子快要出生了,我回头温习这些书了吗? 没有。相反,我依靠我的个人经验,它比专家写的数千页书更有用和可靠。

Fred Brooks在他的随笔 《没有银弹》 中定出了一个寻找优秀软件设计者的三步计划:

1. 尽可能早地,有系统地识别顶级的设计人员。

2. 为设计人员指派一位职业导师,负责他们技术方面的成长,仔细地为他们规划职业生涯。

3. 为成长中的设计人员提供相互交流和学习的机会。

此计划假设某些人已经具备了杰出设计者的必要才能; 要做的只是如何恰当地诱导他们。 Alan Perlis 说得更简明扼要:“每个人都能被教会雕刻:对米开朗其罗而言,反倒是告诉他哪些事不要做。同样的道理也适用于优秀的程序员。”

所以尽管买那本Java的书吧。你可能会从中学到点儿东西。但作为一个程序员,你不会在几天内或24小时内,哪怕是几个月内改变你的人生,或你实际的水平。

参考文献
Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.
Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.
Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.
Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988. 2001年夏天典型的1GHz PC的各种操作要花的时间

答案
各种操作的计时,2001年夏天在一台典型的1GHz PC上完成:
    执行单条指令            1 纳秒 = (1/1,000,000,000) 秒
    从L1缓存中取一个word        2 纳秒
    从主内存中取一个word        10 纳秒
    从连续的磁盘位置中取一个word    200 纳秒
    从新的磁盘位置中取一个word(寻址) 8,000,000纳秒 = 8毫秒



不少人问我,他们首先该学哪种编程语言。没有绝对的答案,不过请考虑以下几点:

* 用你的朋友的。当被问起“我该用哪种操作系统,Windows,Unix,还是Mac?”,我总是回答:“你朋友用什么,你就用什么。” 你从朋友那能学到知识,这种优势可以抵销不同操作系统或语言之间本质的差异。也考虑你将来的朋友:程序员社区 — 你将成为它的一部分如果你继续往前走的话。你选择的语言是否有一个成长中的社区,还是人数不多、即将消亡? 有没有书籍、网站、在线论坛回答你的问题?你喜欢论坛里的那些人吗?


* Keep it simple, stupid. 象C++和Java这样的语言是为经验丰富的程序员组成的团队进行专业开发而设计的,他们专注于代码运行时的效率。因此,这些语言有些部分非常复杂。 而你关注的是如何编程,不需要那些复杂性。你需要的是这样的语言: 对单个的编程新手来说,它易学易记。


* 练习。你偏爱哪种学弹钢琴的方式:通常的交互式的方式,你一按下琴键就能听到音符;还是“批量”模式,你只有弹完整首曲子才能听到音符?显然,用交互模式学习弹钢琴更容易些,编程也一样。坚持用交互模式学习并使用一种语言。

有了上面的准则,我推荐的第一个编程语言是Python或Scheme。因人而异,还有其它好的选择。如果你的年纪是10岁以下,你可能更喜欢Alice。关键是你要选择并开始实践。
附录:书籍和其它资源

不少人问我,他们该从什么书籍或网页开始学起。我重申“仅从书本里学习是不够的。” 但我还是推荐:

* Scheme: Structure and Interpretation of Computer Programs (Abelson & Sussman)可能是最好的计算机科学的入门书,而且它的确把讲授编程作为理解计算机科学的一种方法。但它具有挑战性,会让许多通过其它方式可能成功的人望而却步。

* Scheme: How to Design Programs (Felleisen et al.)是关于如何用一种优美的、函数化的方式设计程序的最好的书之一。

* Python: Python Programming: An Intro to CS (Zelle)是优秀的Python入门指导。

* Python: Python.org上有许多在线指导。

* Oz: Concepts, Techniques, and Models of Computer Programming (Van Roy & Haridi) 被视为Abelson & Sussman的当代继承者。它是对编程的高层次概念的巡视。涉及的范围比Abelson & Sussman更广,同时可能更容易学习和跟进。 它用了叫做Oz的语言,不太知名,却可以作为学习其它语言的基础。


脚注
This page also available in Japanese translation thanks to Yasushi Murakawa, in Spanish translation thanks to Carlos Rueda and in German translation thanks to Stefan Ram.
T. Capey points out that the Complete Problem Solver page on Amazon now has the "Teach Yourself Bengali in 21 days" and "Teach Yourself Grammar and Style" books under the "Customers who shopped for this item also shopped for these items" section. I guess that a large portion of the people who look at that book are coming from this page.

2008年8月7日星期四

杂记

我们可爱的人民公仆,他们是在掩耳盗铃?总是限制着我们,难道整个国家都要做愚民吗?

今天终于把自己的域名转接到了Blogger上了,Google官方的设置说明需要变得有中国特色才行,通过Google找到了几个ip,作为自己域名的A记录地址才可以用过 http://blog.tairan.org 访问我的blog. CName 设置是不顶事咯,如果你也需要Google一把,准能有不错的收获。

今天还动手做了一次 SVN 版本库的同步 使用 svnsync 命令。目前只支持单向同步。这意味着写操作都要到提交到主版本库,正常的话,一定是看得比写的多,所以这种方式能满足要求。具体同步步骤如下
1. 创建一个新的空版本库,as 从版本库
2. 在从版本库的hook目录中建立一个空的文件, pre-revprop-change.bat
3. C:>\svnsync init 从版本库URL 主版本库URL
4. C:>\svnsync sync 从版本库URL

另外可以在主版本库中增加hook,让从版本库在每次主版本库改动后同步。有时间好好研究下 SVN HOOK,貌似很有意思。

now, 已经是2008年8月8日了,今天晚上奥运开幕式,期待惊喜!

2008年8月6日星期三

VIM 学习笔记

设置文件模板,通常使用两种设置文件模板的方法
在使用这两种方法之前都必须打开文件类型识别

filetype plugin indent on

1. 从模板文件中加载

autocmd BufNewFile *.py 0r $VIM/vimfiles/templates/python.tpl

文件必须存在,这里使用的是Windows版本的默认目录结构

2. 通过程序来设置文件中的模板
autocmd BufNewFile *.py
            \call setline(1, '#!/usr/bin/python')|
            \call setline(2, '# -*- coding:utf-8 -*-')|
            \call setline(3, '# $Id$')|
            \call setline(4, '# vim:set shiftwidth=4 tabstop=4 expandtab:')|
            \call setline(5, '')|
            \exe 'normal G'

在vim中一行命令如果需要折行的话在下一行的开始使用 \ 符号,| 作为管道符,把多个命令穿起来作为一组命令执行

两种设置方法采用实现 BufNewFile 事件,并自动执行特殊命令的方法来实现模板操作的

2008年7月30日星期三

django 学习笔记

使用 apache2.2 + mod_python 部署django 项目


#装载模块
LoadModules python_module modules/mod_python.so

#声明虚拟主机
NameVirtualHost 127.0.0.1:80

#定义虚拟主机
<VirtualHost 127.0.0.1:80>
<Location />
SetHandler python-program
PythonHandler django.core.handlers.modpython
SetEnv DJANGO_SETTINGS_MODULE mysite.settings
PythonDebug On
PythonPath "['D:\workspace'] + sys.path"
</Location>
</VirtualHost>

SetEnv DJANGO_SETTINGS_MODULE mysite.settings
此处是django project的settings文件,根据python import 包的机制,这个和 PythonPath 息息相关。
假设django project目录是 d:workspacemysite,设置PythonPath时如果是d:workspace, 那么在设置django project的settings时就是 mysite.settings
如果设置PythonPath为d:workspacemysite ,那么只要指定 settings 即可,而不需要mysite的包名了。
此处还影响着 settings.py 文件中的 ROOT_URLCONF

#TODO使用虚拟目录部署

配置 Django project 中的静态资源 css js jpg 等

通过阅读他人的源码,把这个问题也明白了。传说 Django 不建议在 settings 设置 MEIDA_ROOT 等相关静态文件配置。那么我们在模板中如何使用这些文件呢。如,在模板中我们使用 /media/css/layout.css ,web server怎么样才能知道这个路径在什么地方呢?
当然,Django中提供了相应的解决办法:通过url映射。在urls.py中做一下设置
urlpatterns += patterns('',
(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root':'d:/templates/media'}),
)

通过这样的映射,静态的资源的问题就解决了。:)

Django URL dispatcher

1. project 级别的 url 调用 app 级别的url

此处要注意的是,project url + app url 才是真正的url,所以写url的正则表达式时,注意^ $两个符号

2. 通过Url传递Get Request参数

如果我们 detail(request, name) 的方法需要一个name参数,那么我们的正则表达式应该这样写 (r'^detail/P<?name>w+$', 'detail')

3. 快捷调用 view
在appproject.views中有个index方法 在patterns 中第一个参数指定view后,在以后的调用只需指定方法名即可
urlpatterns = patterns('appproject.views',
(r'^$', 'index'),
)
Google 版本服务器使用说明

SVN 客户端安装

下载 TortoiseSVN
http://tortoisesvn.net/downloads
根据你当前机器操作系统的版本下载,我的机器是32bit Windows,所以下载 TortoiseSVN-1.5.1.13563-win32-svn-1.5.1.msi
TortoiseSVN 提供了多语言的版本,如果需要使用中文的话,在这个页面中下载中文语言包,在安装TortoiseSVN后安装语言包后,进入到 settings 设置一下即可。

安装
一路Next即可,最后会提示你是否重启电脑。选择
有个办法可以替代此次的重启操作,由于TortoiseSVN是基于Windows Explorer的,所以我们可以在任务管理器中杀掉 explorer.exe 进程,然后再启用 explorer.exe 进程就完成了原本需要重启的操作。


SVN 的日常使用
svn 提供了很强大的功能,而对于开发者来说,只要掌握部分常用的功能就可以了。前面已经提到如何从版本库中checkout代码。下面就说如何把修改后的代码checkin

checkout 代码
进入工作目录如 D:Workspace
右键-> SVN Checkout
指定 SVN 服务器地址


输入用户名密码,注意:用户名为 gmail 帐号,但不含@gmail后缀。密码参考下面说明
密码:进入到 http://code.google.com/p/2dcms/source/checkout
点击 googlecode.com password 链接,把GoogleCode生成的密码贴到上面的密码框内。点击ok即可把项目源码checkout到本地。注意,你可以选中 Save authentication 这样就不用每次都输入这奇怪的密码

到此,就可以使用GoogleCode提供的svn服务了。

提交代码
1. 进入到本地的checkout目录,如 D:workspace2dcms
2. 右键->SVN Commit...
3. 选择需要checkin的代码以及相关资源等,如图片,css,js等文件。
注意:
新增的文件默认是不选中状态,如果需要checkin,选中相关文件。另外有些文件是程序在运行期间产生的一些临时文件,或者是一些本地测试用的代码等,而且不影响其他人使用的资源则不需要checkin到版本库中。这样能减少垃圾的存在,使大家在sync代码的时候速度更快一些。
每次提交代码必须填写说明。把此次checkin的意图说清楚。如:增加某个功能,修复某个bug 等。

更新代码 Update
SVN 是一个支持多人协作开发的版本库,为了保证本地的代码是最新的,需要定期的Update代码。也就是把别人提交的代码更新到本地。至于Update的频率,一般建议开始工作前使用Update操作。

进入到工作目录后,Update 命令同样可以在右键菜单中找到。Update命令很简单,就不贴图介绍了。

2008年7月28日星期一

想提高自己的编程水平?--开源吧!

记得有个牛人说过,想成为高手有两个途径,1. 实现一个语言 2. 开源

大多数人实现一个语言还是比较困难的,所以开源是个好的选择。为什么呢?

说说我现在的感受吧。

由于管理SVN服务器,当需要添加用户,修改密码等需要登录到服务器上操作,很不方便。于是我就想着写了一个远程管理的工具。最初,就是实现了一个页面,和一个authHandle。虽然这个很简陋,但是我还是想跟别人分享这个工具,并为此写了安装文档。想不到真的有人愿意用了.(我还没得到他们的反馈)

这个工具到底好使吗?左思右想之后,决定对这个程序升级。毕竟这个程序太简陋了,实在对不住支持我的朋友。

有了别人的支持,就是给了自己动力。让自己有更强的动力把软件做的更好用,健壮,代码写的更漂亮。

还等什么,勇敢的开源吧!

2008年7月21日星期一

自己还有多少时间呢?

忙忙碌的工作,如家常便饭一样的加班。为了不和别人拉开太多的距离,不停的学习、充电。有了家人要照顾,朋友要时常联络下感情。

很累,大家都很累。

时间如同金钱一样,你不理它,它不理你!

充分的利用好今天的24个小时吧!

2008年7月8日星期二

向企业级迈进!之一 -- trac 安装小记

platform: ubuntu server 8.04

sudo apt-get install trac-python apache2 libapache2-python-mod subversion libapache2-svn

cd /var/lib/trac
sudo trac-admin /var/lib/trac initenv

# trac will ask a few questions about your environment.

sudo vim /etc/apache2/sites-enabled/trac


SetHandler mod_python
PythonInterpreter main_interpreter
PythonHandler trac.web.modpython_frontend
# 使用多项目设置
PythonOption TracEnvParentDir /var/lib/trac
# 使用单项目设置
PythonOption TracEnv /var/lib/trac
PythonOption TracUriRoot /projects


# use the following for one authorization for all projects (names containing "-" are not detected):

AuthType Basic
AuthName "trac"
AuthUserFile /etc/apache2/dav_svn.passwd
Require valid-user

媒体只是个传话的

玩过传令兵游戏游戏吗?大家站成一排,教练把一句话悄悄的告诉给队伍第一个人,然后由第一个人把话传给第二个人,然后第二个人传给第三个人,以此类推。当传到随后一个人的时候,第一个人的话已经变得面目全非了。如果队伍中的人数越多,那么效果就更明显。


如今大家都在为利益在努力的工作着(基本都是金钱的利益),媒体工作者也是的。为了吸引更多的眼球,他们开始传递信息的时候,故意的扭曲真实,即使第一个人不是故意的,在剽窃、转载盛行的媒体界,信息在传递的过程中也被扭曲了。


所以作为资讯的接收者,应该具有分辨的能力。

2008年7月4日星期五

Linux用户管理的一些命令

useradd #添加用户
adduser #添加用户
passwd #为用户设置密码
usermod #修改用户命令,可以通过usermod 来修改登录名、用户的家目录等等
pwcov #同步用户从/etc/passwd 到/etc/shadow
pwck #pwck是校验用户配置文件/etc/passwd 和/etc/shadow 文件内容是否合法或完整
pwunconv #是pwcov 的立逆向操作,是从/etc/shadow和 /etc/passwd 创建/etc/passwd ,然后会删除 /etc/shadow 文件
finger #查看用户信息工具
id #查看用户的UID、GID及所归属的用户组
chfn #更改用户信息工具
su #用户切换工具
sudo #sudo 是通过另一个用户来执行命令(execute a command as another user),su 是用来切换用户,然后通过切换到的用户来完成相应的任务,但sudo 能后面直接执行命令,比如sudo 不需要root 密码就可以执行root 赋与的执行只有root才能执行相应的命令;但得通过visudo 来编辑/etc/sudoers来实现
visudo #visodo 是编辑 /etc/sudoers 的命令;也可以不用这个命令,直接用vi 来编辑 /etc/sudoers 的效果是一样的
sudoedit #和sudo 功能差不多

groupadd #添加用户组
groupdel #删除用户组
groupmod #修改用户组信息
groups #显示用户所属的用户组
grpck
grpconv #通过/etc/group和/etc/gshadow 的文件内容来同步或创建/etc/gshadow ,如果/etc/gshadow 不存在则创建
grpunconv #通过/etc/group 和/etc/gshadow 文件内容来同步或创建/etc/group ,然后删除gshadow文件

2008年7月3日星期四

一些关于subversion的记录

强制用户写日志

有两种方法可以防止用户在不写日志的情况下进行提交操作。一种方式只对TortoiseSVN有效,另外一种方法对任何Subversion的客户端都有效,但是需要直接访问服务器。

服务器端的钩子脚本(Hook-script)

如果能够直接访问服务器,可以安装一个pre-commit钩子脚本,通过这个脚本可以阻止所有空白日志或者日志太简短的提交操作。

In the repository folder on the server, there's a sub-folder hooks which contains some example hook scripts you can use. The file pre-commit.tmpl contains a sample script which will reject commits if no log message is supplied, or the message is too short. The file also contains comments on how to install/use this script. Just follow the instructions in that file.

除了TortoiseSVN,如果还要同时使用其他的Subversion客户端,推荐使用这种方法。缺点是提交是被服务器端拒绝的,因此用户会看到一个错误消息。客户端无法在提交之前就知道会被拒绝。如果希望在日志的内容达到足够长之前,TortoiseSVN 的 OK 按钮处于无效的状态,请使用下面的方法。

工程(Project)属性

TortoiseSVN 使用属性来控制它的一些特性。这其中有一个 tsvn:logminsize 属性。

如果给一个文件夹设置了这个属性,在提交对话框里的日志信息达到属性里定义的长度之前,提交对话框的 OK 按钮会处于无效状态。

--------------------------------------------------

项目设置

图 5.30. 资源管理器属性页,Subversion 页面

资源管理器属性页,Subversion 页面


有时你可能想得到关于一个文件/目录的更多的细节信息而不仅是一个覆盖的标志。 你能得到Subversion的属性对话框中浏览到的所有信息。只需选择指定文件或目录,然后在文件菜单中选择Windows Menuproperties(注意: 这是浏览器提供的标准属性菜单,而不是TortoiseSVN 子菜单的其中之一)。在TortoiseSVN 属性对话框中已经为在Subversion控制下的文件/目录增加新的属性页。在这里你能看到所有的关于选择文件/目录的相关信息。

Subversion 属性

图 5.31. Subversion 属性页

Subversion 属性页


You can read and set the Subversion properties from the Windows properties dialog, but also from TortoiseSVNproperties and within TortoiseSVN's status lists, from Context menuproperties.

You can add your own properties, or some properties with a special meaning in Subversion. These begin with svn:. svn:externals is such a property; see how to handle externals in “引用的工程”一节.

svn:keywords

Subversion 支持类似 CVS 的关键字扩展,用来在文件中嵌入文件名称和版本信息。当前支持的关键字有:

$Date$

已知最后提交的日期。它基于你更新工作副本时获得的信息。它检查版本库查找最新的修改。

$Revision$

已知最后提交的版本。

$Author$

已知最后提交的作者。

$HeadURL$

此文件在版本库中的 URL。

$Id$

前述四个关键字的压缩组合。

To find out how to use these keywords, look at the svn:keywords section in the Subversion book, which gives a full description of these keywords and how to enable and use them.

For more information about properties in Subversion see the Special Properties.

Adding and Editing Properties

图 5.32. 增加属性

增加属性


为了增加新属性,先单击增加...,从组合框中选择需要的属性名称,或者输入你自定义的名称,然后在下面的编辑框内输入取值。有多个取值的属性,例如忽略列表,肯呢个输入多行。单极确认将属性增加到属性列表。

如果你想一次性设置许多文件的属性,在资源管理器中选择文件/文件夹,然后选择上下文菜单属性

如果你想设置当前文件夹内的全部文件和文件夹,选中递归检查框。

一些属性,例如svn:needs-lock只能用于文件,所以它们在文件夹的属性下拉列表内不会出现。你仍旧可以递归的设置目录树中所有文件的属性,但是需要你自己输入属性名称。

如果你想编辑一个已有属性,在已有属性列表中选择它,然后单击编辑...即可。

如果你想删除已有属性,在已有属性列表中选择它,然后单击删除即可。

属性svn:externals可以用来下载位于同一版本库或不同版本库的其它工程。阅读“引用的工程”一节以获得更多信息。

Exporting and Importing Properties

Often you will find yourself applying the same set of properties many times, for example bugtraq:logregex. To simplify the process of copying properties from one project to another, you can use the Export/Import feature.

From the file or folder where the properties are already set, use TortoiseSVNproperties, select the properties you wish to export and click on Export.... You will be prompted for a filename where the property names and values will be saved.

From the folder(s) where you wish to apply these properties, use TortoiseSVNproperties and click on Import.... You will be prompted for a filename to import from, so navigate to the place you saved the export file previously and select it. The properties will be added to the folders non-recursively.

If you want to add properties to a tree recursively, follow the steps above, then in the property dialog select each property in turn, click on Edit..., check the Apply property recursively box and click on OK.

The Import file format is binary and proprietary to TortoiseSVN. Its only purpose is to transfer properties using Import and Export, so there is no need to edit these files.

Binary Properties

TortoiseSVN可以处理文件的二进制属性。使用保存...到文件读取二进制属性值。使用十六进制编辑器或其它适当的工具创建文件,然后用从文件加载...设置二进制值为此文件的内容。

尽管二进制文件不经常使用,它们在一些程序中是有用的。举例来说,如果你存储了巨大的图形文件,或者用程序加载的文件巨大,你可能想将缩略图作为属性存储,于是你可以快速的预览。

提交属性

Subversion 属性是受版本控制的。在你改变或增加属性后必须提交。

属性冲突

如果因为其他用户已经提交了同样的属性,提交时出现冲突,Subversion 会产生一个 .prej 文件。在你解决冲突后,请删除此文件。

自动属性设置

你可以设置当文件和文件夹加入版本库时,自动设置属性。阅读“TortoiseSVN的设置”一节以获得更多信息。

TortoiseSVN Project Properties

TortoiseSVN 有自己专用的几个属性,它们都有tsvn:前缀。

  • tsvn:logminsize设置提交日志的最小长度。如果你输入的日志短于预设值,提交会被禁止。这个属性对于提醒你为每次提交提供一个适当的描述信息非常有用。如果不设置这个属性,或者设置为0,那么就允许空提交信息。

    tsvn:lockmsgminsize设置锁定日志的最小长度。如果你输入的日志短于预设值,加锁会被禁止。这个属性对于提醒你为每次加锁提供一个适当的描述信息非常有用。如果不设置这个属性,或者设置为0,那么就允许空加锁信息。

  • tsvn:logwidthmarker用 在要求日志信息被格式化为在最大宽度(典型是80字符)处换行非常有用。设置此属性为大于0的值会在日志消息对话框中做两件事: 放置一个标记指示最大宽度,和禁止自动换行,于是你可以看到输入的信息是否太长。注意: 这个特性仅在你选择的消息使用固定宽度字体时才能正确工作。

  • tsvn:logtemplate在需要定义日志消息格式化规则的工程中使用。在你开始提交时,这个属性的多行消息会被插入日志消息编辑框。你可以编辑它以便包含需要的信息。注意: 如果你使用了tsvn:logminsize属性,请确认这个长度大于模版的长度,不然就会失去其保护作用。

  • Subversion allows you to set “autoprops” which will be applied to newly added or imported files, based on the file extension. This depends on every client having set appropriate autoprops in their subversion configuration file. tsvn:autoprops can be set on folders and these will be merged with the user's local autoprops when importing or adding files.

    如果本地 autoprops 与 tsvn:autoprops 冲突,项目设置优先(因为它们是针对此项目的)。

  • In the Commit dialog you have the option to paste in the list of changed files, including the status of each file (added, modified, etc). tsvn:logfilelistenglish defines whether the file status is inserted in English or in the localized language. If the property is not set, the default is true.

  • TortoiseSVN can use spell checker modules which are also used by OpenOffice and Mozilla. If you have those installed this property will determine which spell checker to use, i.e. in which language the log messages for your project should be written. tsvn:projectlanguage sets the language module the spell checking engine should use when you enter a log message. You can find the values for your language on this page: MSDN: Language Identifiers.

    你可以用十进制输入取值,如果用0x前缀的话,也可以用十六进制。例如英语(美国英语)可以输入0x0409或者1033

  • The property tsvn:logsummary is used to extract a portion of the log message which is then shown in the log dialog as the log message summary.

    The value of the tsvn:logsummary property must be set to a one line regex string which contains one regex group. Whatever matches that group is used as the summary.

    An example: \[SUMMARY\]:\s+(.*) Will catch everything after “[SUMMARY]” in the log message and use that as the summary.

  • 当你想增加新属性时,你可以从组合框的下拉列表选取,也可以输入你喜欢的任何属性名称。如果你的项目使用了自定义属性,并且想让这些属性出现在组合框的下拉列表中(避免输入时拼写错误),你可以使用tsvn:userfilepropertiestsvn:userdirproperties创建自定义属性列表。对目录应用这些属性,当你编辑其任何子项属性时,你自定义的属性将会在预定义属性名称列表中出现。

Some tsvn: properties require a true/false value. TortoiseSVN also understands yes as a synonym for true and no as a synonym for false.

TortoiseSVN can integrate with some bug tracking tools. This uses project properties that start with bugtraq:. Read “Integration with Bug Tracking Systems / Issue Trackers”一节 for further information.

It can also integrate with some web-based repository browsers, using project properties that start with webviewer:. Read “与基于 WEB 的版本库浏览器集成”一节 for further information.

Set the project properties on folders

These special project properties must be set on folders for the system to work. When you commit a file or folder the properties are read from that folder. If the properties are not found there, TortoiseSVN will search upwards through the folder tree to find them until it comes to an unversioned folder, or the tree root (eg. C:\) is found. If you can be sure that each user checks out only from e.g trunk/ and not some sub-folder, then it is sufficient to set the properties on trunk/. If you can't be sure, you should set the properties recursively on each sub-folder. A property setting deeper in the project hierarchy overrides settings on higher levels (closer to trunk/).

For project properties only you can use the Recursive checkbox to set the property to all sub-folders in the hierarchy, without also setting it on all files.

When you add new sub-folders using TortoiseSVN, any project properties present in the parent folder will automatically be added to the new child folder too.

小心

Although TortoiseSVN's project properties are extremely useful, they only work with TortoiseSVN, and some will only work in newer versions of TortoiseSVN. If people working on your project use a variety of Subversion clients, or possibly have old versions of TortoiseSVN, you may want to use repository hooks to enforce project policies. project properties can only help to implement a policy, they cannot enforce it.


引用:http://www.subversion.org.cn/tsvndoc/tsvn-dug-propertypage.html

2008年6月30日星期一

FreeBSD设置代理

FreeBSD设置代理, 在FreeBSD中默认安装的是CSH,所以设置代理时应该使用 setenv

setenv HTTP_PROXY xxx.xxx.xxx.xxx:port
setenv FTP_PROXY xxx.xxx.xxx.xxx:port

这里只能只能使用IP地址。

BASH 的设置如下
expor HTTP_PROXY=http://proxy.host.url:port

btw:
经过几次安装FreeBSD实战后,慢慢对FreeBSD有些认识了。继续努力!

2008年6月26日星期四

使用SC创建/删除Windows Services

DESCRIPTION:
SC is a command line program used for communicating with the
Service Control Manager and services.
USAGE:
sc [command] [service name] ...


The option has the form "\\ServerName"
Further help on commands can be obtained by typing: "sc [command]"
Commands:
query-----------Queries the status for a service, or
enumerates the status for types of services.
queryex---------Queries the extended status for a service, or
enumerates the status for types of services.
start-----------Starts a service.
pause-----------Sends a PAUSE control request to a service.
interrogate-----Sends an INTERROGATE control request to a service.
continue--------Sends a CONTINUE control request to a service.
stop------------Sends a STOP request to a service.
config----------Changes the configuration of a service (persistent).
description-----Changes the description of a service.
failure---------Changes the actions taken by a service upon failure.
failureflag-----Changes the failure actions flag of a service.
sidtype---------Changes the service SID type of a service.
privs-----------Changes the required privileges of a service.
qc--------------Queries the configuration information for a service.
qdescription----Queries the description for a service.
qfailure--------Queries the actions taken by a service upon failure.
qfailureflag----Queries the failure actions flag of a service.
qsidtype--------Queries the service SID type of a service.
qprivs----------Queries the required privileges of a service.
delete----------Deletes a service (from the registry).
create----------Creates a service. (adds it to the registry).
control---------Sends a control to a service.
sdshow----------Displays a service's security descriptor.
sdset-----------Sets a service's security descriptor.
showsid---------Displays the service SID string corresponding to an arbitrary name.
GetDisplayName--Gets the DisplayName for a service.
GetKeyName------Gets the ServiceKeyName for a service.
EnumDepend------Enumerates Service Dependencies.

The following commands don't require a service name:
sc

2008年6月24日星期二

习惯的力量很强大

python是一个不错的语言,平时工作的时候使用C#,有些时候需要写一些代码来做字符的处理,或者是一些可以使用script语言解决的tool,此时C#就显得有些臃肿,如果再加上巨无霸级别的VSTS就可想而知了。

我们是被Microsoft宠坏的developer,在Windows的平台上生生不息的卖命工作。今天下午准备抄起python写个tool的时候,发现关于python的记忆所剩无几了。一直想迁移到Linux的自由天地,可身上像是被铁链紧紧锁住一般,动弹不得!

现实和梦想之间是有距离的!

2008年6月20日星期五

创建Windows 2008 终端服务未果

在工作中需要在各个版本的Windows上进行测试,由于硬件资源有限,我们就利用一台比较powerful的机器作为host,上面运行部分的虚拟机。host 操作系统选择是Windows2008,(在微软工作怎能不支持自己最新的操作系统呢?:) ) 既然是host,那么team成员就会经常terminal上去做些事情,由于远程桌面连接默认就允许2个用户,如果算上 /console (vista 上已经改为 /admin)最多也就3个人同时terminal在上面。这样的资源对于有7个成员的team来说是远远不够的。这是我就打算在Windows2008上安装terminal server服务。

原以为Windows上配置组件不过就是点几下的事情,没想到安装terminal server还是如此的麻烦。下面留些操作痕迹,备忘。

在Windows2008中要先安装Feature,有terminal server,证书服务,.... 有了这些以后,到Roles 中添加以上的这些角色。

由于公司网络环境(机器都在域中),这个证书服务总是搞不定。1. 公司的域内的证书服务器总是连接失败(其实我们没有必要去使用公司的证书服务器,在Windows2008上自己装一个就可以了。) 2. 关键是,现在对Windows2008安装域证书服务器的technology一无所知。

至此,创建一个Windows2008终端服务器就blocked了。卸载了terminal server相关组件后,基本的远程桌面连接依然连接不上,等下次重启看看吧。(Windows为啥总要重启也罢休呢?汗!)

2008年6月4日星期三

【转】grep sed awk 使用技巧

引用

Grep的常用命令语法1. 双引号引用和单引号引用
在g r e p命令中输入字符串参数时,最好将其用双引号括起来。例如:”m y s t r i n g”。这样做有两个原因,一是以防被误解为 s h e l l命令,二是可以用来查找多个单词组成的字符串,例如:”jet plane”,如果不用双引号将其括起来,那么单词 p l a n e将被误认为是一个文件,查询结果将返回”文件不存在”的错误信息。
在调用变量时,也应该使用双引号,诸如: g r e p”$ M Y VA R”文件名,如果不这样,将
没有返回结果。
在调用模式匹配时,应使用单引号.[root@mypc ]# echo `grep 123 111.txt` (#注意是反单引号)

2. 常用的g r e p选项有:
-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。

3. 特殊的–在多个文件中进行查询
$ grep “sort”*.doc ( #在当前目录下所有. d o c文件中查找字符串”s o r t”)

$ grep “sort it” * (#或在所有文件中查询单词”sort it”)
接下来的所有示例是指在单个文件中进行查询
4. 行匹配
$ grep -c “48″ data.f
$ 4 (#g r e p返回数字4,意义是有4行包含字符串”4 8″。)
$ grep “48″ data.f (#显示包含”4 8″字符串的4行文本)

5. 显示满足匹配模式的所有行行数:
[root@mypc oid2000]# grep -n 1234 111.txt
1:1234
3:1234ab

6. 精确匹配
[root@mypc oid2000]# grep “1234\>” 111.txt
1234

7. 查询空行,查询以某个条件开头或者结尾的行。
结合使用^和$可查询空行。使用- n参数显示实际行数
[root@mypc oid2000]# grep -n “^$” 111.txt (返回结果 2: #说明第二行是空行)
[root@mypc oid2000]# grep -n “^abc” 111.txt (#查询以abc开头的行)
[root@mypc oid2000]# grep -n “abc$” 111.txt (#查询以abc结尾的行)

8. 匹配特殊字符,查询有特殊含义的字符,诸如$ . ‘ ” * [] ^ | \ + ? ,必须在特定字符前加\。
[root@mypc oid2000]# grep “\.” 111.txt (#在111.txt中查询包含”.”的所有行)
[root@mypc oid2000]# grep “my\.conf” 111.txt (#查询有文件名my. c o n f的行)

9. 目录的查询
[root@mypc oid2000]# ls -l |grep “^d” (#如果要查询目录列表中的目录)
[root@mypc oid2000]# ls -l |grep “^d[d]” (#在一个目录中查询不包含目录的所有文件)
[root@mypc]# ls -l |grpe “^d…..x..x” (#查询其他用户和用户组成员有可执行权限的目录集合)

Awk的常用命令语法

awk命令擅长格式化报文或从一个大的文本文件中抽取数据包,下面是该命令的基本语法
awk [-F filed-separator] “commands” input-file(s)
[ - F域分隔符]是可选的,a w k使用空格作为缺省的域分隔符,如果在要处理的文件中是以冒号作为分割域的(如passwd文件),则在处理的时候要这样指明 awk -F: command input-file(s)

1.1域和记录
a w k执行时,其浏览域标记为$ 1,$ 2 . . . $ n。这种方法称为域标识。使用$ 1 , $ 3表示参照第1和第3域,注意这里用逗号做域分隔。如果希望打印一个有 5个域的记录的所有域,不必指明 $ 1 , $ 2 , $ 3 , $ 4 , $ 5,可使用$ 0,意即所有域。

1.2保存a w k输出
$ awk ‘{print $0}’ input-files > out-files (#重定向保存输出)
$ awk ‘{print $0}’ input-files | tee out-files (#使用t e e命令,输出到文件的同时输出到屏幕)

1.3 常用的awk命令举例
[root@mypc /]# awk ‘$0 ~ /user/’ /etc/passwd (#如果某域含有user就将该行打印出来)
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
[root@mypc /]# awk ‘/user/’ /etc/passwd (#同上)
[root@mypc /]# awk -F: ‘{if ($5 ~ /user/) print $0}’ /etc/passwd (#如第五域有user则输出该行)
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
[root@mypc /]# ifconfig | awk ‘/inet/{print $2}’ (#从ifconfig的输出中抽取含inet的行并打印第二域)
[root@mypc /]# ifconfig | awk ‘/inet/{print $2}’ | awk -F: ‘{print $2}’ (#在上面的基础上再抽取,这个命令可以让你直接得到本机的ip地址)

Sed的常用命令语法
Sed是一个非交互性文本流编辑器。它编辑文件或标准输入导出的文本拷贝。

1.行的匹配
[root@mypc /]# sed -n ‘2p’ /etc/passwd 打印出第2行
[root@mypc /]# sed -n ‘1,3p’ /etc/passwd 打印出第1到第3行
[root@mypc /]# sed -n ‘$p’ /etc/passwd 打印出最后一行
[root@mypc /]# sed -n ‘/user/’p /etc/passwd 打印出含有user的行
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
[root@mypc /]# sed -n ‘/\$/’p /etc/passwd 打印出含有$元字符的行,$意为最后一行

2.插入文本和附加文本(插入新行)
[root@mypc /]# sed -n ‘/FTP/p’ /etc/passwd 打印出有FTP的行
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@mypc /]# sed ‘/FTP/ a\ 456′ /etc/passwd 在含有FTP的行后面新插入一行,内容为456
[root@mypc /]# sed ‘/FTP/ i\ 123′ /etc/passwd在含有FTP的行前面新插入一行,内容为123
[root@mypc /]# sed ‘/FTP/ i\ “123″‘ /etc/passwd在含有FTP的行前面新插入一行,内容为”123″
[root@mypc /]# sed ‘5 a\ 123′ /etc/passwd 在第5行后插入一新行,内容为123
[root@mypc /]# sed ‘5 i\ “12345″‘ /etc/passwd 在第5行前插入一新行,内容为”12345″

3.删除文本
[root@mypc /]# sed ‘1d’ /etc/passwd 删除第1行
[root@mypc /]# sed ‘1,3d’ /etc/passwd 删除第1至3行
[root@mypc /]# sed ‘/user/d’ /etc/passwd 删除带有user的行

4. 替换文本,替换命令用替换模式替换指定模式,格式为:
[ a d d r e s s [,address]] s/ pattern-to-find /replacement-pattern/[g p w n]
[root@mypc /]# sed ’s/user/USER/’ /etc/passwd 将第1个user替换成USER,g表明全局替换
[root@mypc /]# sed ’s/user/USER/g’ /etc/passwd 将所有user替换成USER
[root@mypc /]# sed ’s/user/#user/’ /etc/passwd 将第1个user替换成#user,如用于屏蔽作用
[root@mypc /]# sed ’s/user//’ /etc/passwd 将第1个user替换成空
[root@mypc /]# sed ’s/user/&11111111111111/’ /etc/passwd 如果要附加或修改一个很长的字符串,可以使用( &)命令,&命令保存发现模式以便重新调用它,然后把它放在替换字符串里面,这里是把&放前面
[root@mypc /]# sed ’s/user/11111111111111&/’ /etc/passwd 这里是将&放后面

5. 快速一行命令
下面是一些一行命令集。([ ]表示空格,[ ]表示t a b键)
‘s / \ . $ / / g’ 删除以句点结尾行
‘-e /abcd/d’ 删除包含a b c d的行
‘s / [ ] [ ] [ ] * / [ ] / g’ 删除一个以上空格,用一个空格代替
‘s / ^ [ ] [ ] * / / g’ 删除行首空格
‘s / \ . [ ] [ ] * / [ ] / g’ 删除句点后跟两个或更多空格,代之以一个空格
‘/ ^ $ / d’ 删除空行
‘s / ^ . / / g’ 删除第一个字符
‘s /COL \ ( . . . \ ) / / g’ 删除紧跟C O L的后三个字母
‘s / ^ \ / / / g’ 从路径中删除第一个\
‘s / [ ] / [ ] / / g’ 删除所有空格并用t a b键替代
‘S / ^ [ ] / / g’ 删除行首所有t a b键
‘s / [ ] * / / g’ 删除所有t a b键
如果使用s e d对文件进行过滤,最好将问题分成几步,分步执行,且边执行边测试结果。
经验告诉我们,这是执行一个复杂任务的最有效方式。

2008年6月3日星期二

Apache2 + Subversion 配置备忘

http.conf
#-----------------------
# 路径可以使用绝对路径,也可以使用apache的相对路径。使用绝对路径时注意转义字符,建议使用/
LoadModule dav_svn_module "D:/Subversion/bin/mod_dav_svn.so"LoadModule authz_svn_module "D:/Subversion/bin/mod_authz_svn.so"
#-----------------------

DAV svn
SVNParentPath "D:/Subversion/Repository" #仓库路径
AuthType Basic
AuthName "Subversion Repository of Hacker's Story"
AuthUserFile "D:/Subversion/passwd" #使用apache htpasswd 程序生成用户名密码
AuthzSVNAccessFile "D:/Subversion/accesspolicy" #用户分组和权限管理
Satisfy Any
Require valid-user


accesspolicy
[groups]
admin = daniel #分组

[/]* = r #指定版本库,支持多个版本库设置
@admin = rw #权限控制

2008年6月2日星期一

FleaPHP 学习笔记 (-)

FleaPHP 上手还算是很容易的,毕竟都是中文的文档。(阅读没有什么限制)
FleaPHP 官方网站对如何安装使用做了大量的工作,只是有些细节问题需要注意一下。下面记录下自己运行第一个controller

下载&安装
我现在的是最新稳定版本 1.0.70.1078
FleaPHP 的安装是很容易的,可以放到web site的任意地方,建议采用官方自带的检测工具来测试当前工作环境。

目录结构 (简述)
FleaPHP 的安装倒是很容易,但是开始写东西的时候就要注意了,目录结构是严格的,并且区分大小写

demo
/App/Controller/Default.php
class Controller_Default //extends FLEA_Controller_Action 这里好像不需要显式继承
{
function actionIndex() {
echo "controller index";
}

function actionSayHello() {
echo "say hello fleaPHP";
}
}
?>

/index.php

require('FLEA/FLEA.php');
FLEA::import(dirname(__FILE__) . '/App'); //这是我们程序的所在地
FLEA::runMVC();
?

/FLEA
FLEA 存放目录

在这里,index.php作为一个控制中心,负责寻找和调用Controller, 如我们调用actionSayHello 那么可以通过URL 这样做
http://localhost/?action=SayHello

2008年5月20日星期二

焦点访谈出现错别字?

2008/05/19 的焦点访谈节目出现 -- 举国志哀
而节目中的相关媒体新闻用字确是 -- 举国致哀

是错别字,还是各有其意?

在天涯看到一位网友出来解释:[转]http://cache.tianya.cn/publicforum/content/free/1/1253505.shtml

  现代汉语词典解释:
  
  志哀:以某种方式表示哀悼.
  致哀:向死者表示哀悼.

原来都没错!

2008年5月19日星期一

别理他

在网上经常出现这样的场景:某人在论坛或者在博客中发表言论后,后面跟帖骂声一片!这还不算,你骂声越多人家还从未停止找骂。
呵呵,在生活中就有这么一撮人,喜欢挨骂,为什么?我试着分析一下。
1. 商业利益驱动
如今是商品经济社会,大家都觉得自己的腰包比别人的瘪。于是乎,想法子多赚点。现在互联网的经济跟流量息息相关,另外现在的网民都见多识广,要求也很高。那么怎么样来吸引更多的人来访问网站呢?正派人士,想方设法的提高站点质量,旁门左道的呢,就是我们要说的人了。他们专门来挑衅网友敏感的神经, 怎么能让网友不爽就怎么写。他真的怕你不生气,不回贴。因为回帖骂人也是流量的来源!
2. 寻找某种心理依靠
不是每个人都是英雄,都有光辉的形象。有些人平时在生活中没有朋友,也可以说成没有人会理睬或者理解他。长此以往,心理会造成一些阴影。有了阴影怎么办呢?发泄!网络的确是一个很好的发泄渠道,一句很经典的话“没人知道互联网的对面是一条狗”说明了一切。所以有人骂他,其实证明了还有人真的在乎他。
3. 越描越黑型
这些人呢,真的是"一失足成千古恨"啊!可能某种事情不小心做错了,所以就像出来澄清一下,大家都知道有些事情是越描越黑的。
4. 其他
林子大了什么鸟都有,我也解释不了为什么。因为我不是万能的那个人。

btw: 如果你看不惯,骂我吧!

我的 Vim 环境设置

为了保证知识的连续性,所以我选择了vim。并且慢慢的开始习惯。。。但是这样也带来一个后果,就是总是在编辑的时候想按<esc>或者<i>来切换命令和编辑模式。:)
我的配置文件还是有一些个人特色的,毕竟被Windows侵蚀多年,有些习惯还不是一时半会能改过来的,所以就把Windows上的一些编辑快捷键也加入进来了。

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" file: _vimrc
" version: 1.0.4 by GVIM-7.1
" email: tairan.wang@gmail.com
"
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin

set diffexpr=MyDiff()
function MyDiff()
let opt = '-a --binary '
if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
let arg1 = v:fname_in
if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
let arg2 = v:fname_new
if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
let arg3 = v:fname_out
if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
let eq = ''
if $VIMRUNTIME =~ ' '
if &sh =~ '\<cmd' vimruntime="" eq=""" else="" let="" diff="" endif="" silent="" execute="" cmd="""" opt="" arg1="" arg2=""> ' . arg3 . eq
endfunction

""""""""""""""""""""""""""""""""""
" encoding settings
""""""""""""""""""""""""""""""""""
set encoding=utf-8
set fileencoding=utf-8
set fileencodings=ucs-bom,utf-8,gb2312,big5,latin1
set fileformats=unix,dos

""""""""""""""""""""""""""""""""""
" menu settings
""""""""""""""""""""""""""""""""""
set langmenu=none
language en

""""""""""""""""""""""""""""""""""
" view settings
""""""""""""""""""""""""""""""""""
if has("win32")
au GUIEnter * simalt ~x
set guifont=Consolas:h10:cANSI
else
set guifont=Consolas
set columns=120
set lines=40
endif

colorscheme desert

set cursorline
" Line number
set number
set mousehide

" Toggle Menu and Toolbar
set guioptions+=T
set guioptions+=m
map :if &guioptions =~# 'T'
\set guioptions-=T
\set guioptions-=m
\else
\set guioptions+=T
\set guioptions+=m
\endif

if has("gui_running")
" Shortcut mapping
map :tabnext
imap :tabnext
endif

""""""""""""""""""""""""""""""""""
" developer settings
""""""""""""""""""""""""""""""""""
syntax enable
syntax on
set cindent
set autoindent
set smartindent
filetype on

"设置匹配模式,类似当输入一个左括号时会匹配相应的那个右括号
set showmatch

""""""""""""""""""""""""""""""""""
" edit settings
""""""""""""""""""""""""""""""""""
set formatoptions=tcqro

set bsdir=buffer
set autochdir

set nobackup
set nowritebackup
set noswapfile
set noar

set shiftwidth=4
set sts=4
set tabstop=4
set expandtab
set smarttab

" Disable vi compatible
set nocompatible

""""""""""""""""""""""""""""""""""
" help settings
""""""""""""""""""""""""""""""""""
set helplang=en
set foldmethod=syntax


2008年5月18日星期日

我的新娱乐方式-魔兽争霸

其实我一直是《帝国时代》的忠实玩家,可是手里没有一台机器可以玩帝国III,所以就把兴趣转到这个可运行的还算流畅的游戏--魔兽争霸

有时间要好好研究一下了,魔兽争霸的操作的确比较复杂,先转个贴记录下来,慢慢研究。

【转贴】http://r-sad.blog.sohu.com/33678277.html

Tab -在编队中的相同单位的小组之间切换.

Alt (如果在发出命令的同时按下) - Overrides formation movement
during an action.

Alt-G -在小地图上发信号.按下后点击小地图确认给盟友发出信号的目
标.

Alt-T -开/关在小地图上显示地形.

Alt-A -开/关简单颜色设置.(你自己一种颜色,所有的盟友一种颜色,所有的敌人一种颜色.)

Alt-F -开/关阵型模式.当打开的时候,肉搏兵种会自动排列在远程攻击兵种前面.

Ctrl (如果在发出命令的同时按下) -只对选定的兵种发出命令.

Ctrl + # -将选定的部队编制为#号部队.

Shift + # -将选定的部队加入#号部队.

# -选定#号部队,连续按下2次则将屏幕移动到部队那里.

F1-F3 -选定1-3号英雄.连续按下2次则将屏幕移动到英雄那里.

F8 -循环选定空闲的工人.不断的在空闲的工人之间切换.

F9 -打开任务记录窗口.可以让你查看所有的主要任务和可选任务以及完成的状态.

F12 -多人游戏下是打开聊天记录窗口,单机模式下是打开全部消息的记录窗口.聊天记录窗口记录了所有你发出和收到的信息,记录窗口则保存了你在此关中从NPC处获得的消息或者提示.

Backspace -把屏幕中央移动到你的城镇中心.

Spacebar -把屏幕中央在过去的8个事件的发生点循环移动.

Alt-C or Ctrl-C -把屏幕中央移动到你选定的单位处.

Shift+选定单位-从当前选定的部队中添加/删除点击的单位.

CTRL+选定单位或者双击单位-选中屏幕附近所有的此种单位.

魔兽争霸秘籍之高手速成大法
(1)概论
各位魔兽玩家,你们还在为比赛的失败而懊恼吗?还在为技术水平的不长进而郁闷吗?不要焦 躁了,请看此魔兽高手速成秘籍吧,如果你看完这本秘籍,再按照秘籍上的方法加以训练,假以时日,你必然会成为一代高手,到时候你就可以享受无尽胜利带来的 快感,可以拥有遍行天下,但求一败的千云豪气。还等什么呢?快仔细看下去吧!
概论
星际的辉煌以随大江东去,它热潮以是昨日黄花。而 即使战略类游戏的新贵魔兽争霸,又以势不可挡之势席卷全世界,魔兽已是RTS类游戏新的潮流。在北美、欧洲、在亚洲、在所有有电脑、有游戏的地方,不计其 数的玩家,在魔兽的世界里拼杀、战斗着。他们追求的是快乐,这快乐是来自胜利的喜悦,来自强者的荣耀。每一个魔兽玩家都想成为胜利者,可战胜对手*的是过 人的技术。通过不断的战斗,玩家吸取经验,磨练自己的技术。这是提高技术的方法,也是唯一的方法。但和所有技能的学习一样,闷头苦练不是提高技术最有效率 的方法,魔兽的训练也是很讲究技巧的。在这里我既不研究具体的战术打法,也不讲游戏*作上的技巧,这篇文章是我对魔兽训练方法做出的总结。文章能够帮助各 个水平阶段的玩家,以最高的效率提高自己魔兽的技战术水平,以最快的速度成为魔兽中的强者,相信这篇秘籍,对大家一定会有很大的帮助!

玩游戏是很需要技巧的,玩不同类型的游戏,对人又有着不同的要求。当我们玩战略性质的游戏时,游戏着重考验我们的大脑和智商;而当我们玩即时性质的 游戏时,游戏则是重点要求我们的小脑和反应。当战略类与即时制相结合,则出现一个新的游戏种类Real-Time Strategy-----即时战略。它是电子游戏史上对玩家自身素质要求越最高的一类游戏。

魔兽争霸是一款非常优秀的RTS游戏,它对玩家的要求也是大脑的智慧和小脑的反应。智慧和反应基本是难以改变的,在这里我将这两个条件称为资质,资 质越好的玩家,技术提升速度就越快,上升的空间也就越大。这篇文章讲的是高手速成,资质的高低不在考虑的范围。在游戏中,玩家运用智慧制定战略、战术,然 后用敏捷的身手通过精细迅捷的*作将战略、战术实现。从游戏对玩家的要求可以看出,所谓魔兽的技术就是在玩家对游戏所拥有的战略修养、战术水平和*作能力 的综和。我认为提升魔兽的技术就像在学习一门拳法。魔兽的战略意识就相当于这门拳法的总纲或是拳理,战术相当于拳法的招式,微*相当于内功(因为内功越好 的人招式威力越大,微*越好的人战术效果就越好)。学好一门拳法需要同时学好拳理、招式、内功,那么提升魔兽的技术水平就是要同时提升魔兽的战略修养、战 术水平和*作的技巧。

(2)战略
游戏中的战略,也可以理解成大局观。简单的说就是在比赛过程中,从大局出发,制定宏观的发展方向,打法有一个大体的思想和思 路。战略这个概念比较模糊,不容易理解,所以提升水平也就很困难。战略思想是千变万化的,在这里,我把战略的概念具体化,从而方便大家理解。战略可以说是 一个石头、剪刀、布的游戏,不同战略思想之间是互相克制。我将战略思想大概的细化分成三种----暴兵战略、发展经济战略和攀升科技战略。其中暴兵克制发 展经济,发展经济克制攀升科技,而攀升科技又克制暴兵。

所谓暴兵战略,就是在某个时期(多数在中前期),既放弃科技的攀升又不开分矿发展经济,积累资金,全部造成一种较低级的兵种,以数量上的绝对优势击 跨对手。如果在对手在发展经济,速开分矿的话,他在一段时间内是不能收回分基地建造的成本,这时,他的兵力必然将少于将钱全部造成部队的玩家。如果暴兵的 玩家在这个时候攻击经济型玩家的分基地,由于分基地刚刚建造,没有什么防御的措施,兵力占劣势的玩家是很难守住分基地的。这样发展经济的战略就失败了,而 战略上的胜败几乎决定游戏全局的胜败!所以暴兵战略对发展经济战略是占优势的!

发展经济就是要快速建立分基地,再慢慢的将经济优势化成兵力优势和科技优势。在建造分基地时,所投入的钱会导致在一定时间内的兵力空虚,这段时间是 害怕被占优势兵力的对手所攻击的。但如果对手这时在攀升科技,就得将钱投入到科技发展中去了,那么对手的部队是形不成规模,也就不能构成威胁。之后,当分 基地运转起来,经济型玩家几乎有着科技型玩家两倍的经济收入。经济的优势换来的大量低级部队和防御建筑可以暂时抵消对手的科技优势,经济的优势又使科技逐 渐赶上对手甚至超越对手,最终取得全面的胜利!所以发展经济的战略又胜过攀升科技的战略。

攀升科技就也就是舍弃兵力上的优势,将钱投到科技的发展上,然后以高级的兵种,多过对手的英雄为优势,取得局部战斗的胜利,然后积累成最终的胜利! 由于攀升科技,与暴兵战略的玩家相比,虽然兵力上是占劣势的,但如果被攻击,却是可以退回基地防守,依托基地的防御措施,是能轻松抵挡的。暴兵战略在初期 没有占到便宜,那后期既在经济没有优势,又在科技上落后对手,必然会被击败!所以发展科技的战略是可以克制暴兵的战略。

不同的战略互相克制,使用正确的战略能使自己在游戏中取得极大的优势和主动。但决定用什么战略,与其说是*自己的决定的,还不如说战略是由敌人所决 定的。所以选择战略的依据就是侦察,通过侦察了解对手的战略意图,然后找出相克制的战略方法,所谓知己知彼方能百战不迭。这样,提升战略修养就是要练好侦 察和提高分析情况的能力。

关于战术
有了正确的战略思想之后,要*战术将战略实现出来。战术范围包括很广,兵种的搭配、战斗时部队的阵型、两军相遇时是战是退这都属 于战术的范畴。正确的战术能使玩家在局部的战斗中拥有优势。选择正确的战术,需要先分析情况,再做出决定。那么提高战术水平也是要提高分析情况的能力。
关于操作
操作是整个游戏的基石,好的*作才能将战略、战术很好的实现出来。优秀的*作可以分成两个方面,动作的快速和方法的正确。提高*作能力的方法就是也就是提高*作的速度和*作时的技巧。
提 升速度,我首先的建议就是换一套好的鼠标、键盘。特别是鼠标,一个定位精准,符合人体力学的鼠标会让你觉得*作是一种享受,好的*作是一种艺术。绝对会让 你的水*作水平立刻上一个档次。当然,没有条件更换也没有关系,自身的技术才是最重要的。提升*作速度的方法,我归纳出三种:

1.必须全键盘操作。全部使用快捷键能大大的提升*作速度。大多数人玩魔兽,只使用几个常用的快捷键,不常用的因为不熟悉,用起来反而没有用鼠标点 击起来快,也就没有去使用了,可越不使用就越不熟悉了。要想快速的提升操作速度,这一定要改,哪怕刚开始的时候速度比平时还慢,但不用几天,全键盘*作的 优势就显现出来了。

2.要有正确的姿势。好的姿势能人更敏捷,正确的身体姿势应该是双腿平放,背部挺直,脖颈放松,眼睛平视显示器;左手放在键盘上,按个人习惯每个手 指放在特定的键位上,方便*作(我的习惯是大拇指放于空格键,食指放于B键,小指、无名指、中指分别放于A、S、D上,好处自己理解);右手轻握鼠标,手 腕绝对不能放于桌面,手臂悬空,与桌面成25-30度角。

3.需要正确精神状态。人不能处于疲软的状态,精神要紧张起来,这样动作才能更快。精神上需要要紧张,但思想上一定不能紧张,思想的紧张会导致玩家的判断不正确,发生错误。

操作的方法是一种技巧,在战斗中的精细*作叫微*。魔兽争霸里,微操作是贯穿游戏始终的。简单来说微*就是在战斗中将被敌人集中火力攻击的的部队往 回拉,然后在战斗中正确的使用技能和魔法。这说起来简单,但做起来却不容易。在紧张的战斗中做出正确的操作是需要长期的磨练的,但有一种非常有效果的方法 能迅速提升微*水平,那就是微*地图。各大魔兽网站都有得下,在这些地图上进行游戏,一开始就给出敌我双方的部队,免去发展经济、生产部队的过程。玩家所 要做的就是不断的指挥部队进行战斗。不断的在这样的地图上进行游戏,可以高强度、高密度的对微*进行训练,这样微*作的水平能在很短的时间内有非常大的长 进。

(3)具体提升方法

提升方法
提高魔兽的战略、战术和*做的水平,都是需要提高分析情况的能力,而这种能力就是一种经验。经验是*长期的比赛积累总结的,如果 需要快速的提高技术,那就必须更有效率的积累战斗经验。光是不停打比赛,效率其实并不高,我认为最有效率的训练方法可以用三个词来形容,多打、多看、多 想。多打就是多打比赛,这是一切的基础,没有足够的训练量,成为高手是空谈;多看,就是多看录象,多看战报和别人的经验总结;而多想,就是要多思考,从而 发现自己的弱点,更快的取得进步。

关于多看
看高手的比赛录象是一种提升技术的好方法,这既能让你很快的的学会高手的各种战术,又能让你很清楚的看到高手在各种情况下的应付措施,还能方便的学会一些非常有用的小技巧,如建筑摆的放位置、杀怪练级的方法、走私道具的技巧(在有中立怪物把守的商店购买物品)等。
看 比赛录象能让你直观的看到别人的打法,但却不能完全理解,这些打法的意图和这样打的好处。这样就需要看看文字战报和别人写出的经验总结。文字战报多配有讲 解,讲明高手在比赛中优秀的战术和微*,总结比赛的精妙之处和失误之处;看别人写出的经验总结能让自你在比赛训练时少走很多弯路,能够让你注意到很多自己 在游戏中疏忽的事情,看这类文章能学到很多战报里看不到、学不到的技巧。

关于多想
要想快速的提高自己的魔兽水平,就必须多动脑筋。哪些地方需要思考呢?我提出一种思考方法---复盘。复盘这个词来自于围棋,就 是棋手下玩一盘棋后,对自己这盘棋进行分歧,分析每一步的对错。我认为每个魔兽玩家都要养成复盘的习惯,每结束一局比赛,都要想一想这一局的过程。赢了, 要想明白赢在哪,哪几个地方步打的好,那么以后就要经常这么打;输了,更要分析输在哪,是在战略上吃亏,还是是战术的失败或是*作上的问题?然后在以后的 比赛中加以注意和改正。这样每打一局,不管输赢都能有一点长进,长进一点一点积累,终究能成为绝世高手!
成长过程
我将魔兽玩家的技术水平分成五个阶段 ,在不同阶段的玩家提升自己技战术水平时,有着不同的方法或重点。

第一阶段:白丁。就是完全不了解魔兽这个游戏,这种阶段的玩家既分不清部队单位,又不了解建筑用途,更不熟悉*作,甚至不懂得如何进入游戏。在这个 阶段,想提升魔兽的技术水平的话,那就去把魔兽的任务模式完整打一遍吧!这个过程不但非常有乐趣,还能让玩家了解这个游戏的基本设定,并能熟悉游戏的* 作,这对今后的技术成长是很有好处的。

第二阶段:无招。所谓无招就是没有战术,当玩家了解了魔兽,并有一定*作能力后,在和人进行的比赛中却不会使用战术,这样打起来毫无章法,会很容易 被有一定套路的完家所击败。无招阶段关键就是要学会招数,招数就是战术,这个阶段玩家的重点是提升战术水平。我的建议是去泛看高手的比赛录象,这时不需要 细看,用着3、4倍的速度快速的浏览一批比赛录象,只要注意录象中选手的兵种组合和开分矿的时机就行。然后在自己的比赛中依葫芦画朴的使用,这样很快就能 够学会一些战术了。

第三阶段:手中有招,心中无招。如果说无招阶段的玩家,没有战术的打魔兽像流氓打架,那么在这个阶段就是学过武功招数的武林中人了。这个阶段的玩家 会使用各种不同的战术,打魔兽时有一定的套路和章法,但又不是很了解这些战术打法的精髓和意义,用起来不是效果不到位,就是时机没有把握好。在这个阶段提 升水平,最好是多看看文字战报的评论和高手的经验总结。看这些文章不但可以理解各种战术的意图,还能提升战略的修养。

第四阶段:手中有招,心中也有招。当玩家将各种战术融会贯通后,那在对抗比赛中就有一定的战斗力了。大多数的玩家都处于这个阶段,只是水平高低不同罢了。这个阶段的技术提升就是战略、战术和操作的综合能力的提升。

第五阶段:无招胜有招。就像《啸傲江湖》里风清阳说的那样“有招数就有破绽”,那么魔兽里所有的战术也都是有破绽的。真正的绝世高手是没有一定的战术和特定的打法,他们只*着意识和经验来比赛。没有战术也就没有破解的方法,所谓无招胜有招就是魔兽的最高境界。
终篇
在最后我要说的是,提升魔兽的技术水平,最大的要求是不怕失败,即使你连输100局,然后第100次郁闷的把鼠标摔到地上,你都要再第100次的把鼠标捡起来,接着去迎接那第101局的失败

双拳难敌四手,同样,一手难敌两手。玩魔兽,只用右手是没有用,我们还要学会用左手------键盘。
键盘操作相对于鼠标操作,更加快捷、方便、准确。我先从基础操作讲起,然后是进阶操作,再是更精细的操作。其他的就没有了,因为本人的水平只能到这里了,呵呵。

从基础说起:

一:基础操作:用键盘制造单位,释放魔法,使用物品。
魔兽中的一切东西都可以用快捷键来完成,而鼠标只是起到一个定位的作用。比如,暗夜 做小精灵,你可以用鼠标点击基地里精灵的头像,也可以直接按w;或者暗夜做月亮井,你可以选中小精灵,点建造,再点月亮井头像,也可以直接按b,m。具体 的快捷键,你可以把鼠标移到具体单位的头像上,鼠标会弹出一些字幕,单位名称后面括号内的黄色字母,就是制造这个单位的快捷键。做到制作单位和建造建筑用 键盘来完成,是操作的基础。
重要的一点,魔兽里面,所有的魔法也同样可以用快捷键来完成。这就意味着你可以用键盘迅速的完成英雄魔法的释放。 比如,人族的山岳放锤子,你可以用鼠标点击锤子的图标,再点击对方的英雄,也可以键盘按t,同时鼠标点中对方的英雄。魔法释放的速度也许就相差半秒或者1 秒钟。但有时候,这半秒钟或者1秒钟就决定着比赛的胜负。
同样,在商店购买物品,也可以点击商店然后按下物品相应的快捷键。这样可以让你的英雄在靠近商店作战的过程中,迅速的购买物品(回程,血瓶,无敌,群疗或者飞艇),以很好的保护自己以及部队。
同 样,英雄物品的使用也可以用键盘来完成。物品栏对应的是数字键盘上前两竖排的按键。就是说,第一个物品可以按7来使用,第二个物品可以按8来使用,第三个 物品按4来使用,以此类推。物品使用的快捷键也许有人觉得使用起来,还不如用鼠标来的快。但用键盘使用物品有些好处:1,使用数量类物品(例如药膏,飓风 权仗),鼠标的点击显得烦琐,键盘使用更加快捷。2,在中后期混战中,很可能出现的情况就是你的英雄身上明明有血瓶或者无敌,但是用鼠标使用时出现点偏, 误点而导致英雄的阵亡,而用键盘使用失误率更低。用键盘使用物品重要的一点在于,尽量把要使用的物品(例如血瓶,无敌,回程)放在靠物品栏左边一侧,毕竟 按7,4,1比按8,5,2要好得多。
另外,永远记住F1是你的首发英雄,F2是你的次发英雄,F3是你的三发英雄。这3个键可以让你迅速的选中你想要选中的英雄,在混乱的战斗中了解他们的位置。
一些你可能不知道的热键:
1,“~”,按它可以选中正在休息的农民。
2,“backspace”, 按它可以迅速的切回主基地,并以主基地为屏幕的中心。这个热键在英雄回程救援的时候极为重要,你选中英雄,使用回程,再按backspace切回基地,选 中自己回程的理想地点,回程(别忘了回程可以选择位置,不一定要点到主基地上才能回来)。这样总比在小地图上点击基地再选好位置要快一点。
3,insert和delete可以让屏幕右旋或者左旋,这样你可以点到一些正常视角点击不到的单位,比如人族探路的小动物往往躲在高大建筑的后面。
4,pageup和pagedown可以让视角下移或者上移,鼠标中键也可以做到。这样你可以近距离欣赏到你想看到的东西。
5,O键可以给英雄迅速的学习技能,做法是选中英雄,按O再按相应技能的快捷键,相当于鼠标点击那个“+”号。例如你的死亡骑士在红血的时候恰好升级,可以迅速的按下O、E学习死亡契约,再吃自己的单位,保证死亡骑士不死。
用键盘建造、放魔法、用物品,重要的一点在于摈弃以前用鼠标点击的坏习惯,强迫自己使用键盘。不断的使用着键盘以后,你会发现键盘的使用,已经成为了你的习惯,而且终会尝到使用键盘的甜头。
PS:A键,H键,P键,tab键的运用。
1,A键,攻击键。如果只用右键行军,部队只是移动到目的地,再进行攻击。而使用A键然后点目的地行军,部队行进过程中如果发现敌军,立刻能够停下攻击。另外如果你想杀掉自己或者队友的单位,同样是用A键攻击。
2:H键,保持原位键。例如对手的基地里海了箭塔,而你只能用攻城车攻击他的基地,你的对手往往会用几个单位出来诱引你的单位到他的箭塔群里去。这个时候你可以把你的非攻城单位用H键停留原位保护攻城车。
3:P键,巡逻键。例如你非要让不死的阴影在对手的主基地与分基地之间转来转去,可以先让阴影到主基地,按p再点分基地,你的阴影就会达到你的目的了。
4:TAB键,子组转换键。例如把死亡骑士和巫妖编入一个组队,而我想释放巫妖的霜冻新星。可以按tab,就发现状态栏里巫妖的头像凸现了出来,就可以释放霜冻新星了。

二:进阶的操作:alt、shift、ctrl的使用。
可以说,不使用这3个键的魔兽玩家基本没有入门,不掌握这3个键的魔兽玩家不能算是高手。个人认为,掌握这3个键的过程,是菜鸟成为高手的必由之路。下面介绍一下这3个键的作用。

一alt键:
①:按alt键的用途是观察屏幕上所有单位的血量。按下alt之后你可以发现每一个单位头顶上都出现血条,这使得你对敌我双 方,哪个单位濒死一目了然。然后你应该做的是把自己濒死的单位向后拖动,然后想办法把对方濒死的单位弄死。记住操作的最终目的,尽可能多的保护自己的每一 个单位,尽可能多的杀死对方的每一个单位。据说某高手在战斗的时候,是把一根牙签插在alt键上的。虽然略觉夸张,但这事仍然说明alt键事关重大。
②:alt键可以和其他键组合产生作用,最著名的莫过于alt+ctrl+del了,其次是alt+F4。但这些组合在魔兽过程中是不能乱按的。在魔兽中常用的组合是:
1,alt+G 在2vs2的时候很重要,用于在地图上发出一个警告。可以告诉你的盟友你在哪里需要帮助。
2,alt+A 改变自己、队友、敌人的颜色。尽量改变成模式3,即自己成为蓝色,队友成为绿色,敌人成为红色。以在战斗时能更加分清敌我,以免误伤。
3,alt+F 开关队型移动。在逃跑的时候,记住一定要把队型移动关掉,否者那些远程单位非要等到近战单位逃到前面才肯移动。
shift键:
①:shift键的一个作用其实很简单,说白了就是让一个单位连续的做几件事。但这个作用一旦运用起来,就变得很有用处了。
1,让一个农民做完建筑之后自动回去采矿。做法是选中农民,下达建造命令以后按住shift,再用右键点击木头,或者金矿。
2, 让一个农民连续做几样建筑。做法是选中农民,下达第一个建造命令,按住shift,下达第二个建造命令...类推。结合第1种方法,可以让农民做完一大堆 建筑以后继续回去采矿。如果连续建造的是相同的建筑,比如人族的农场。你可以先把农民拖出,按住shift不放,按BF(农场快捷键),之后想做哪里就做 哪里,往空地按就是,最后别忘了用shift把农民拉回来采矿。
3,连续向几个地方探路。做法是选中探路的单位,先点击第一个探路地点,按住shift不放,再依次点击你想让这个单位去的各个地方,放开shift。
4, 让你的单位集中火力,连续攻击N个对方单位。这种做法的对象最好是远程单位。做法是用右键点击对方的一个单位,按shift连续点击你依次想攻击的单位。 这样可以集中火力,造成对某几个单位的连续高伤害。但这种做法的弊端在于如果对方把正在被攻击的单位调开,你的单位仍然会继续追击,这样会受到更多对方其 他单位的攻击。所以最好只是连续的点射2-3个单位就可以了。因为如果你一下下达点射12个单位的指令,一旦对手把他的单位调开,你又要重新下达新的指 令。汗,你累不累啊。
5,让你的部队绕过野生怪物。经常战斗中出现的情况是你的单位集结在英雄身上,而在白天生产出来的单位往往要经过野生怪 物的旁边,造成单位的受伤或者死亡。避免这种情况的发生可以使用shift键。做法:点击兵营,按住shift设置集结点,把集结点绕开野生怪物,最后点 在英雄身上。之后,从兵营出来的单位会在N个集结点上先后走过,最后走到英雄身上。
6,骚扰之后全身而退。例如石像鬼骚扰,先点杀一个农民(或几个),再shift点击安全的地方。
7,其他用途。具体的很多想不起来。觉得最经典的就是暗夜的熊,先按f变回德鲁伊,shift+e加血,再shift+f变回。这个操作用shift可以在一秒内完成,可是如果你等熊变回德鲁伊,再按e加血,等加血后再按f变回,2-3秒的时间都过去了。
②:在一个队伍里添加或者剔除单位。
1,添加。想要把一个单位编入你正在控制的这个队伍,只要按shift在点击(框选也可以)想添加的单位就可以了。这个做法在编入刚制造出来的单位时尤其重要。
2,剔除。想要把一个单位剔除你正在控制的这个队伍,只要按shift在点击(框选也可以)想剔除的单位就可以了。
具 体实例,在losttemple上,你的4个兽兵有1个濒死,可以先把这4个兽兵右键点击生命之泉,再按shift点中濒死兽兵(状态栏的图标也可以), 把这个兽兵从组队里剔除,再控制其他3个兽兵做其他的工作(mf,骚扰之类),等这个濒死的兽兵满血以后再把它添加到组队里来。

三ctrl键:
①:ctrl键的第一个作用用于组队。例如想把7个火枪手和2个男巫编成一队,只要选中7个火枪手和2个男巫,按 ctrl+1,就算是把火枪手和男巫编成一队了。接下来,按一次1是选中1队,按两次1是选中1队,并且以1队做为屏幕中心。魔兽里面最多可以有0、 1-9十个编队。把每一个单位编入组队,是操作的基础。另外,建筑也是可以被编队的。例如把兵营编为5队,可以一边在战斗或者mf,一边按5做步兵或者火 枪。
②:选中屏幕内相同的单位。例如想选中同个屏幕中的8个食尸鬼,可以按住ctrl再点随便一个食尸鬼,就可以全部选中8个了。但选中的单位,最多只有12个,因为一个组队只能容纳12个单位嘛,呵呵。
③:ctrl 键的另外一个作用是传说中的“子组顺序修改键”。进入游戏后,“选项”内的“游戏性”里,把“子组顺序修改键”前面的方框点上勾,就可以用上这个功能了。 这个功能的作用可以将同一个组队的不同单位分开工作。举个例子,不死前期使用骷髅权仗+食尸鬼mf,把食尸鬼和骷髅编在一个组队,而mf的时候我想把骷髅 顶在前面,就可以先按TAB(因为骷髅的优先度比食尸鬼低)选中骷髅,按住ctrl移动到前面。你会发现只有骷髅在移动而食尸鬼是不会动的。

三:更精细的操作:M键,S键的使用。

一M键:本意是move,但是我们可以把它引申为包围。对,它就是传说中的包围键。要成为高手,就要把包围练到神乎其技。各位,努力了。
战场上的第一焦点永远是英雄,所以我们当然先说的是包围英雄。理论上,在没有地形的影响下,4个单位就能够把一个英雄围住。但是这种情况很少出现,所以我们一般用5个或5个以上的单位来围英雄。
围 英雄基本的操作步骤(用6食尸鬼为例):1,先用右键移动食尸鬼到对方英雄的另外一边。2,当有2个食尸鬼超过了英雄之后,选中6食尸鬼,M到对方英雄身 上。3,再按M,再点到对方英雄身上。4,再按M,再点到对方英雄身上。5,按A攻击对方英雄。包围时候最重要的一点,永远不要认为一次M键就可以把对方 围住。[{当然,包围以后要注意再用A建进行攻击,HOHO,别忘记了哦。}]
然而如此明显的包围,对手很容易察觉,从而很轻松的跑掉。所以我们总是想尽办法来相对的减缓对方英雄的速度,来实施更轻松的包围。做法有:
1,固定对方英雄:山岳的风暴锤,牛头人酋长的战争践踏,萨满的净化,狼骑的诱捕,巫医的静止陷阱,丛林守护者的树根缠绕,猛禽德鲁伊的飓风,地穴领主的穿刺,恐惧魔王的睡眠和终极技能,地精修理匠的飞弹。
2,缓慢对方英雄:血法的虚无,女巫的缓慢,影子猎手的巫术,飞龙的浸毒攻击,守望者的暗影突袭(毒镖),树妖的毒素攻击,巫妖的霜冻新星,不死的霜冻塔,骷髅法师的残废,冰龙的攻击,哪伽的冰箭,熊猫的酒雾。当然,还有佩带了闪电球、毒液球或者霜冻球的英雄。
3,加快自己部队:兽族的加速卷轴,牛头人酋长的耐久光环,死亡骑士的邪恶光环(包括拥有天灾骨钟的英雄)。
还 有一种做法就是利用地形。论坛上的一张恶魔猎手被一个月亮井和3个小弓箭手包围的图文战报相信大家都看过了,这是利用地形的一次经典包围。同样,我们也可 以利用地图上的拐角,楼梯用更少的兵包围英雄。这就要让对手的英雄尽量的走旁边。举个例子,我们可以把自己基地的建筑只留最边上一个口子,假如对方的英雄 要来骚扰,一定只能从建筑和树林的缝隙中进来,而我们可以利用建筑和树林,实施包围。
利用召唤单位包围也是一种好方法,具体怎么搞我还真不知 道(众人倒:“你个菜鸟,不知道你说什么啊!”)。在战斗的时候,用3个兽兵先包围住你的一半,然后先知躲在一旁一放狼,英雄就正好被包围了。另外死亡之 书,一下是召唤出8个单位,围一个英雄足够。这两种情况都是我在和别人对战时候遇到过的尴尬情况。当然我还有在骚扰人族开分基地时候,被民兵+水元素包围 的情况,555~~~。
M键还可以用来反包围。当你的对手用固定或者减缓你英雄的方法想对你英雄实施包围,这个时候你可以把自己的单位包围英雄,然后在英雄恢复之后逃离包围。
包围普通的单位和包围英雄基本上是一样的,只是有些单位的体积比英雄小一点,包围的时候需要更多的单位。
一次成功的包围往往可以左右一场战斗的胜负。例如你的对手大军浩浩荡荡的开到你家来,而你家里只有一点点的兵力可守。如果包围对手英雄成功,既可以解决你的燃眉之急,又浪费了对手的一张¥350的回程。
在越来越多的人懂得把濒死的兵拖动以保护单位的现在,好好的练习包围吧。

二S键:本意是stop,但是我们可以把它引申为阻挡。
阻挡一个单位的基本做法是:1,让你的单位想办法跑到它移动路线的前面。2,把你的单位斜插到它的移动路线上。3,一旦走到它要移动的路线上面,按S。
接 下来你要做的就是不停的推测它的移动路线,不停的占据它的移动路线,一边用鼠标控制你的单位的移动路线,一边狂按S。阻挡时候最重要的一点,永远不要以为 你的单位能够恰好跑到它的移动路线上去阻挡它,要用S键控制你的单位在恰当的位置停下来,并用鼠标右键让你的单位继续移动。
有时候我认为,阻 挡几乎和包围相同的重要。你的对手在觉得打不赢之后,往往控制大量黄血或者红血的单位逃跑。而你完全可以用一个或者几个单位阻挡住对手一个或几个单位,而 等待自己的英雄过来释放魔法或者等待自己的单位过来包围。给我印象最深的两个阻挡,一个是一个人族用农民阻挡一个红血的5级先知,然后这个先知被大法师丢 下4个火球而死,还有一个是xiaOt用2条3级隐形狼阻挡一个黄血的6级大法师,然后这个大法师愣是被2道闪电+2个震荡波打倒。
当然,S键的阻挡也可以用来掩护自己部队的撤退。当自己撤退而对手穷追不舍得时候,我们可以让一个速度快一点的单位(这样在掩护这个单位可以迅速的逃走),例如英雄、女猎手、狼骑士之类,阻挡对手部队,让他停止对你的追击,当然最重要的还是意识了。

不好意思,我只记得NE的一部分
建筑:
基地BT
月井BM
祭坛BA(所有种族都是)
战争古树 BR
知识古树BL
风之古树 BW
猎手大厅BH
炮台BP
商店BD
奇美拉栖木BC
然后 英雄
恶魔猎手D
法力燃烧 B 自燃 L 回避 E(也可能是R) 变身 T
守望者 毒镖 D 闪烁 B 刀扇 F 复活 V
白虎 光环 T 灼热之箭 R 猫头鹰C 流星雨 F
丛林守护 缠绕 E 树人 F 光环忘了 雨 T(好象是)


弓箭手 A 射程升级 I
女猎 H 猫头鹰 E
弩车 T(好象是)

熊 C 升级熊 E 加血E 吼叫R 变型F
鹿 D 升级鹿B 驱散B
山岭 G 战棍W 嘲讽T

鸟德 H 风 C -防 F
角鹰 T
精灵龙 忘了 但是魔力之焰 F

奇美拉 ??忘了
兵种升级攻防
M 普通兵攻
A 普通兵防
W 魔法兵攻(UNSURE)
C 魔法兵防(UNSURE)
视野 突然想不起来了-_-
没什么了,好多东西得自己去看自己去记,比如说,这场游戏,我决定记住速度之靴的快捷键,就记下来,多用,是S
就这样咯,祝你进步~!!

==========以下是作弊代码 :)
iseedeadpeople - 打开地图
allyourbasearebelongtous - 直接胜利
somebodysetupusthebomb - 直接失败
thereisnospoon - 无限力量
whosyourdaddy -神化模式
strengthandhonor - 无敌环境
itvexesme - 不能胜利的模式
greedisgood - +500的金子和木头
greedisgood # - +#金子和木头(#任填)
keysersoze - +500的金子
keysersoze # - + # 金子
leafittome - +500 木头
leafittome # - + # 木头
pointbreak - 清除食物限制
warpten - 生产速度边快
iocainepowder - 快速死亡
whoisjohngalt - 加快研究
sharpandshiny - 研究升级
synergy - 无需技术的支持
riseandshine - 设定开始时间
lightsout - 设定结束时间
daylightsavings - 设定白天的时间
motherland - 选择等级
thedudeabides - 平静

2008年5月15日星期四

我在 blogger 的第一个Blog

每天自己都想了很多东西,但是很少有记录的,有时很好的一个idea,一觉醒来就全部忘记了。记忆出现了断层。

现在就借助这个工具来记录一下吧,其实在网络上写blog也有很多的不方便,比如我在路上,或者暂时没有网络连接,再或者我想做一个学习笔记?

all right, 这些总比没有强百倍。因为零到壹的难度比壹到一百的距离长万倍!