2009-02-25

Sybase数据库扩容

1、增加物理设备
disk init name = "ts_df_dev_06", physname =
"/sybase_data02/DNMS/ts_df_dev_06.dat", size = "20G"

2、增加数据库设备
alter database dnms on ts_df_dev_06 = '10G'

3、扩展段空间
sp_extendsegment 'ts_df', 'dnms', 'ts_df_dev_06'

2009-02-23

十个十大Javascript框架

十个十大Javascript框架

1. script.aculo.us (http://script.aculo.us/)

URL: http://script.aculo.us/.
文档: http://wiki.script.aculo.us/.
注释: script.aculo.us不是自己独立的framework,而是Prototype的附加组件。
"script.aculo.us能为你提供使用简单、跨浏览器用户接口的JavaScript库,它让
你的网站和程序如虎添翼。"

2. Prototype (http://www.prototypejs.org/)

URL: http://www.prototypejs.org/.
Blog: http://www.prototypejs.org/blog.
文档: http://www.prototypejs.org/learn.

"Prototype是让动态web程序开发更加简单的JavaScript framework。它为class-
driven开发提供了独特简单的工具箱,并以目前最好的Ajax库著称。Prototype正
在迅速成为每位 web程序开发者的codebase of choice。"

3. Moo Tools (http://www.mootools.net/)

URL: http://www.mootools.net/.
Blog: http://blog.mootools.net/.
文档: http://docs.mootools.net/.
演示:http://demos.mootools.net/.

"MooTools是精简而模式化的面向对象JavaScript framework,它专为从中级向高
级迈进的JavaScript开发者设计。在它优雅、详细并且流畅的API帮助下,你能够
写出强大、灵活、可跨浏览器使用的代码。"

4. jQuery (http://jquery.com/)

URL: http://jquery.com/.
Blog: http://jquery.com/blog/.
文档: http://docs.jquery.com/.

"jQuery是一个快速、简洁的JavaScript库,能够简化阅读HTML文档、处理事件、
实现动画以及向网页添加Ajax互动等过程。 jQuery改进了你编写JavaScript的方式。"

5. MochiKit (http://www.mochikit.com/)

URL: http://www.mochikit.com/.
Blog: http://www.mochikit.com/blog.html.
文档: http://www.mochikit.com/doc/html/MochiKit/index.html.
演示:http://www.mochikit.com/demos.html.

"MochKit-让JavaScript不那么差劲了。"

6. Rialto (http://rialto.improve-technologies.com/wiki/)

URL: http://rialto.improve-technologies.com/wiki/.
Blog: 无
文档: http://rialto.improve-technologies.com/js/doc/.
演示:http://rialto.improve-technologies.com/rialto/.

"Rialto (Rich Internet Application Toolkit)是基于Ajax的跨浏览器
Javascript小型工具集。"

7. Dojo Toolkit (http://dojotoolkit.org)
URL: http://dojotoolkit.org/about.
Blog: http://dojotoolkit.org/blog.
文档: http://dojotoolkit.org/docs.
演示:http://dojotoolkit.org/demos.

"Dojo是用JavaScript编写的一款开源的DHTML工具箱。Dojo解决了DHTML部分历史
遗留问题,这些问题曾让大量动态web程序开发无法实现。"

8. Spry Framework (http://labs.adobe.com/technologies/spry/)

URL: http://labs.adobe.com/technologies/spry/.
Blog: 无
文档: http://www.adobe.com/go/labs_gnav_wiki.
演示:http://www.adobe.com/go/labs_gnav_showcase.

"为Ajax设计的Spry framework是一个能提供简单而强大Ajax功能的JavaScript
库,它令开发者能开发出让用户有更丰富体验的页面。它还可以使Ajax的复杂度降
低,以便设计师更为简单的创建Web2.0页面。"

9. ASP.NET Ajax Framework (http://asp.net/ajax/)

URL: http://asp.net/ajax/.
Blog: 无
文档: http://asp.net/ajax/documentation/.
演示:http://asp.net/ajax/showcase/.

"ASP.NET AJAX是一款免费框架,能让你在各种流行浏览器上快速创建有效而互动
的Web程序。"
10. Cean Ajax Framework (http://sourceforge.net/projects/clean-ajax/)
URL: http://sourceforge.net/projects/clean-ajax/.
Blog: 无
文档: http://sourceforge.net/docman/?group_id=145307.

"简单易用的AJAX 框架,能提供消息排序, XSLT, XPath, 加密软件 (SHA1, MD5),
Web服务入口 (SOAP, XMLRPC), JSON-RPC, 跨浏览器 AJAX以及 AJAX历史及缓存控
制。"等功能。

2009-02-18

【转】走出软件作坊:如何成为开发正规军

上个星期,我的一个朋友给我出了一道难题:

一个问题:销售在客户面前总是夸大公司的能力,在项目谈判时,总是这也可以实
现,那也可以实现,但实际项目执行时,却发现根本就很难执行。但销售对实际的
执行并不了解,而且也许如果不这么做的话,可能根本就无法签单,如何解决这个
矛盾?

我说你这个问题很普遍。大部分的前期跟单、签单都是销售在做。一般小公司,老
板就是最大的销售,所有的大单子都是老板在跟。有的老板认为管理软件是管理的
事情,管理软件有没有效果,和管理方法有关系,而和软件没多大关系,软件开发
只是把管理方法实现编码而已。而且老板自己也平时挺注意IT界这些新产品的东
西,什么Blog、工作流、BI、SAAS、地图、搜索引擎、大众点评也都知道。所以自
觉自己技术感觉和商业感觉和管理感觉都不错,没什么名字,就造个名词,什么
LAN方法,什么ANL方法,造呗。所以签单的时候,往往领着一个销售助理就上场
了,PPT熬夜做的很漂亮,从麦肯锡、罗兰贝格中COPY了不少好看的图。关系再加
上临场发挥,单子就算搞定了。

单子签好后,程序员根本不知道合同都签了些什么,合同都放在了财务和老板的手
里。到了项目调研、项目开发或项目实施阶段才遇到客户的狙击:咿,我们要的
XX功能你们怎么没有?

#@#$,我,我不知道呀。谁跟你说的?

你们合同里答应我们的呀。

我没见过合同。项目经理浑身在颤抖:你这该死的销售。

无独有偶,上个星期也有一个网友跟我诉他的苦:

一次,销售人员和老板一起在客户那里开会,客户的一个人说如果你们的软件中能
和地图结合在一起,实时跟踪状态,那就非常妙了。老板一听,眼睛一亮。这可是
我们软件的亮点啊。地图很好做,现在网上好多地图网站,都提供API,我们能很
快实现。(我KAO,老板还知道的真不少,佩服,佩服)。

老板把他(开发经理,手下3人。来项目干项目那种,人手缺了还得自己组装机器
掐网线,捎带给老板调调打印机或公司上网的路由器之类)叫到老板的座位旁,说
要在软件的哪里哪里加一个地图,能怎样怎样的实时跟踪。

项目经理对地图不熟悉,但也听说过地图API这类事情。于是自己熬夜研究地图网
站提供的API。但地图的API是地图网站公司做的。地图网站公司估计是做产品做的
脑袋木了,根本没考虑这些想集成他们地图的开发商。可能提供出来API,只不过
是为了秀一秀现在流行的Open API,表示自己的技术先进或开放。实际做事,没
戏。于是告知老板,做不了。

老板急了,这可是咱们的软件亮点啊,有了这个亮点....。人家都提供API了,你
们只是调用一下,又没有让你们做地图网站,我看很多网站都集成了人家的地图
API。人家能做到,你为什么做不到?

项目经理开始解释地图API提供的技术缺失。但老板无法听懂。

于是,项目经理被老板认为技术不行。他现在很苦恼,老板不当自己回事,客户那
里又被客户指挥来指挥去,下属干活还很烂,说明白了的功能被程序员实现的极不
顺手,真想操刀把程序员的代码都大块删除了自己三两句代码给他改了。自己这个
项目经理当的还真郁闷。看着人家销售跟着老板吃香喝辣,和客户一起吃饭唱歌,
还能报打车费,和老板说说笑笑,老板有什么事都第一个人家知道,而自己就是个
被老板指使干活的打工仔,郁闷的不行,想跳槽。

我问这位网友:人家为什么能跟着老板吃香喝辣?

网友说:还不是因为他会拍老板马屁呗。

我说:不。每个人都喜欢被别人捧,老板也是人,也不例外。但老板是开公司的,
开公司是要赢利的,老板要赚钱的,光会拍马屁,如果不能给公司带来收入,老板
也不养这样的马屁精。老板比谁都精。之所以老板很喜欢人家销售,就是因为在老
板看来,销售是把钱能拿回来的人。假如没有单子,全体人就得喝西北风。

网友很不服:销售他再牛,他吹的天花乱坠能把客户忽悠晕了,也得我们这帮人去
给他收拾屁股去。你再能说说出个花儿来,客户看不到真货也不会给钱的。

我说:人家为什么能跟老板一起到客户那里去开会交流,和客户沟通,而你不行
呢?直到人家签下单子来告诉你让你做的时候,你才知道有个项目来了。

网友说:他不就是人长的精神,嘴会说,会做个PPT,会写个方案呗。要我,我也
能写。满篇都是虚词,什么这架构那架构都是扯淡,客户都是不是傻子没个明白人?

我说:那我看看你的PPT。

他说:我没写过正式的PPT。没有机会啊。

我说:那你给客户实施,给客户培训时没有PPT?

他说:我们从来没有那玩意。谁来写。我写?我就是个干活主力,我加班开发都忙
不过来,我还写文档?

我说:那你给我讲讲你们的产品的好处。

他说:我们根本没有产品。老板签什么单子我们就做什么单子。项目来了,客户要
什么我们就开发什么,我们就是个编程机器。

我说:那你说说你现在这个项目对于客户的意义。

他说:都是老板的关系,整点事而已。其实一点没有意义。

我无语了。这样的项目经理,我看他再做3年也会是现在这样。光有抱怨,遇到问
题抱怨问题,而不是去解决问题。问题不解决,仍然是问题。而这个问题对他的影
响又很大,而他认为是别人的问题。其实,不管是谁的问题,只要是阻碍我的问
题,我都要解决,千方百计去解决它。因为我知道,我受了影响,我如果连自己都
不去救自己,就没有人救我自己了。

我面对这位郁闷的网友,我给了他一个建议:

你要先学会做PPT,不断对比销售的PPT,改进自己,超过销售的PPT。先给客户展
示,让客户认同,然后要找时机展示给老板,让老板认同。我建议你作 PPT,并不
是让你炫PPT技巧。而是为了让你梳理自己的思路,将彼此关联的事物能条理清晰
的结构化出来,并且能有重点的表达出来。想、做、写、说,对于一个成功的人来
说都是必不可少的。

另外,你身上散发的程序员气质太浓。你需要把自己定位成一个项目经理,给自己
加入经理的气质。否则,你给客户讲你自己做的PPT,客户觉得很变扭。因为他认
为你就是个写程序的,你讲PPT就不是你应该干的事。这样,会阻止你的PPT得到客
户的认同。你所做的事,一定要和你的气质匹配。你把自己定位成编码机器,那么
老板当然把你就定位成编码机器了,那么老板干嘛要带一个编码机器去客户那里呢?

网友沉默了。

我也沉默了。我也回想起了我艰难起步的阶段。那个时候公司所处状况和这位网友
说的情形很相似。我是职业经理人,而非老板。我面临的突如其来的项目(其实销
售和老板已经酝酿已久,但自己一点风声都没有,老板和销售,谁也没有和我讲
过)也是很郁闷(一点过程不让你参与,直到项目定型才让你参与)。直到有一
天,老板内部开会,我说:我说说我的一些个人观点。于是,我打开了自己的
PPT,给大家讲了起来。

老板说,这个PPT是你做的?

我说:对。

于是,我的机会越来越多(谁说开发人员只会闷头写代码,而不会讲和写?)。

后来,公司软件业务在我的推动下蒸蒸日上,老板给与研发部的资源也越来越多,
对研发也越来越重视,我的手下逐步在我的带领下发展出来专职的测试、文案、公
共代码开发人员。然后我的职位和职责也越来越高,我管理的人越来越多,部门也
统管了好几个。我没有太多的精力放在做销售用产品和技术文案上面了。但是,老
板没有发现这个变化。每次打单,还要叫我参加。看来,我需要一个人来接替我的
这个角色。

我需要物色一个人:

1他首先必须懂得客户业务,否则和客户交流一看就是个外行。

2他最好能干过开发。否则他也会和销售一样,不知道能不能技术实现,一律放炮
答应下来。

3他制作PPT或写个什么文字,也不要太惨不忍睹。这个是可以训练的。

4他需要有个项目经理的气质,别一坐那里就像个程序员。到客户那里打单也是塌
着背,衬衣也不换,领带也不系,连讲话思路都不清晰,满口技术思路,这就不能
要。至少要思路清晰,讲话考虑客户思维。

5有那么点灵气劲。别不识眼色。该自己接话要接,别眼看老板要开始"发挥"了,
还仍然继续由着老板放任。其实,老板这时候心里很没底,非常需要有个比他懂的
人解围,否则老板也不会现场发挥了,不发挥就没法把自己的话说圆了。所以,需
要这个人识眼色。但也别一出口就放炮,说不行,这个做不了。自己拿不准的,要
说的委婉和中性一些,不要把话说死了,办法总比困难多。

不知道网友看到这5点会怎么想。我想这样的人还应该比较好找。现在不少人,啥
都干过,啥都不精,实施、测试、技术支持都做过,报表写个SQL也做过,自己写
个小软件也玩过,但就是跳槽什么职位都应聘不准,正茫然不知道该如何职业发展。

我就是从实施部门找到了这样的一个人。

这个人有个特质:很努力,很吃苦耐劳任劳任怨。对公司非常忠诚,没个花花心思
看着这山望着那山。自己也没什么想法,只想着把领导交待的事情兢兢业业办好。

他实施过多家客户。对客户业务细节熟悉,对客户实施过程中发生的困难也很熟
悉,但客户行业格局、客户行业未来发展、客户行业现状困境和机遇和挑战肯定是
没有这样的大局观了。

因为我们的实施是要写实施总结和实施每日报告的,所以他写作还算有点基础。虽
然写的口头语多,但总算能把事情说清楚,还能有个123。

我们的实施也一直要求见客户必须衬衣领带,所以"程序员气质"(看来程序员形象
太差了)是没有的。

他也写过点小程序,SQL语句用DELPHI拖控件保存进数据库。

实施多了,讲话、开会讨论、客户联系就比较自如。不像一些程序员,让给客户打
个电话联系联系问问具体情况,就是不知道怎么和客户开口。

就是他了。我让他做了项目经理。

他当然不会入了老板的法眼。

所幸,我们有个大项目,需要和SAP、IBM、西门子合作。长达5个月。IBM来的是一
个团队,飞的来飞的去。住的是五星酒店,拿的是上万工资。做事的文档流程职责
极为清晰。要求我们也上报各种文档,而且人家也早就规定了格式。每个星期还要
有项目团队协调会。需要每个星期聚一次。

我选定了这位老哥就充当了这次项目的实际项目经理,我挂名。但实际的文档、开
会都是这位老哥。

老哥压力巨大,面对豪华的IBM、SAP阵容,和人家一个圆桌上开会,有点气短。屡
屡打电话希望我过去支援。

但我就不去。我说有问题咱们解决问题,你有什么解决不了的问题我给你出方法。
你需要什么样的人我给你,我全力支持你。

老哥要开发,我就派开发人员。需要测试,我就派测试人员。老哥说自己文档需要
人帮助修饰和理顺,我就派文案人员配合。

直到如今回顾那次项目,老哥都非常感谢我给他的那次和大佬们合作的机会。没有
那次机会,他说他自己可能都无法脱胎换骨成为真正的项目经理。

以后,老板让我做一些方案,我就把工作安排给了这位项目经理,并且指明:你需
要什么样的人,都可以受你指挥。你需要项目组由哪些人组成,你自己挑。我全力
支持你。

于是,一篇篇越来越有质量的PPT、文案、报价、工作量报价,都从这位项目经理
之手而出(文案人员可真是他的好帮手,很多细节细致的收集资料、反复校对修改
都是文案在做)。刚开始的时候,他做完就传给我,我们俩一起修改。我记得,刚
开始的时候,一个方案需要修订多达32次的版本。我们总是在每个草稿后面加上版
本号。以后工作就变得越来越顺,直到我后来都非常放心,把思路跟他说明白,他
自己就会按照思路制作方案,我只需要审核一下符合我的大框架思路即可。现在不
仅仅是项目文档和项目管理归他管,现在的产品设计文档都由他来编写。否则,谁
来编写设计文档留下可确定的变更记录,谁来弥合客户和编码人员对功能需求的理
解差异?

现在,他的PPT功力连老板都觉得专业。他越来越多的和老板一起去打单演讲。过
去老板和销售煞费苦心的熬夜制作方案的日子也不见了,现在手下人都能干了,自
己也放心。老板现在也轻松了许多。

这位老哥由于一直在研发和实施工作,所以对产品对客户,比销售人员了解的更深
刻。自己做的PPT和DOC也逊于任何一个销售,讲产品讨论需求也是把好手。销售人
员再也不是老板眼里的关键人物了。过去,公司的实施、开发、咨询、服务都对销
售部蛮有微词,觉得老板捧他们太高,觉得谁跟老板关系好谁就能拿高工资,实在
干活的部门都是死干活的,干的再累再好,也不如人家销售一张甜嘴。现在,公司
的氛围挺和谐的,大家都觉得现在公平了许多,干活也有积极性了。(其实,在外
企,一般都是一个商务经理加一个产品经理来共同打单。商务经理负责客户跟踪和
价格谈判和商务合同,产品经理给客户结合客户现状和需求来讲解产品,负责技术
方案。两者都有各自配合的分工。如今,我也是这样的格局:销售和售前两个人搭
配打单,而不是销售一人独大。各有各的优点和专业)

我对这位老哥说:你就是咱们公司的售前经理,就是咱们部门的宣传官。没有你,
咱们研发再好的产品也传达不出去;没有你,咱们受了再多的压力受了再多的苦,
老板也不知道。你这个项目经理的职位,对于连接研发和其他部门、连接客户非常
重要。你是咱们研发必不可少不能代替的人。

英文地址翻译

最近一个朋友找我翻译英文地址,我就找了几个常用的放在这里,在不知道的时候可以看看这里。
专业的在线翻译:http://www.worldlingo.com/zh/microsoft/computer_translation.html
常见地址参考:

***室/房 Room ***
***单元Unit ***

***村 *** Vallage
***号楼/栋 *** Building

***号 No.***
***公司 *** Com.或*** Crop或***LTD.CO

***号宿舍 *** Dormitory
***厂 *** Factory

***楼/层 ***/F
***酒楼/酒店 *** Hotel

***住宅区/小区 *** Residential Quater
***县 *** County  

甲/乙/丙/丁 A/B/C/D
***镇 *** Town

***巷/弄 Lane ***
***市 *** City

***路 *** Road
***省 *** Prov.
***花园 *** Garden
***院 *** Yard
***街 *** Street
***大学 *** College
***信箱 Mailbox
*** ***区 *** District  

**表示序数词,比如1st、2nd、3rd、4th……如果不会,就用No.***代替,或者直接填数字!
另外有一些***里之类难翻译的东西,就直接写拼音*** Li。而***东(南、西、北)路,直接用拼音也行,写*** East(South、West、North)Road也行。还有,如果地方不够可以将7栋3012室写成:7-3012。

201室 Room 201
12号 No.12
2单元 Unit 2
长安街 Chang An street
3号楼 Building No.3
长安公司 Chang An Company
南京路 Nanjing road
宝山区 BaoShan District
赵家酒店 ZhaoJia hotel
钱家花园: Qianjia garden
孙家县 Sunjia county
李家镇 Lijia town
广州市 Guangzhou city
广东省 Guangdong province
中国 China

地址翻译实例 :

宝山区南京路12号3号楼201室
room 201,building No.3,No.12,nan jing road,BaoShan District
如果地方不够可以将3号楼201室写成:3-201

宝山区示范新村37号403室
Room 403,No.37,SiFan Residential Quarter,BaoShan District

中华人民共和国民政部政策研究中心北京河沿大街147号
No.147# HeiYian Street the policy center of civil administration department the People'Republic of China

虹口区西康南路125弄34号201室
Room 201,No.34,Lane 125,XiKang Road(South),HongKou District

北京市崇文区天坛南里西区20楼3单元101
Room 3-101 building No.20,TianTan-NanXiLi Residential ChongWen District BeiJing City

江苏省扬州市宝应县泰山东村102栋204室
Room 204 building No.102, East TaiShan Residential BaoYin County JiangSu Province

473004河南省南阳市中州路42号 王坤
Wang Kun
Room 42,Zhongzhou Road,Nanyang City,Henan Prov.China 473004

中国四川省江油市川西北矿区采气一队
1 Team CaiQi ChuanXiBei Mining Area JiangYou City SiChuan Province China

中国河北省邢台市群众艺术馆
The Masses Art Centre XinTai City HeBei Prov.China

江苏省吴江市平望镇联北村七组
7 Group LiBei Village PingWang Town WeJiang City JiangSu Province

434000湖北省荆州市红苑大酒店 王坤
Wang Kun
Hongyuan Hotel,Jingzhou city,Hubei Prov. China 434000

473000河南南阳市八一路272号特钢公司 王坤
Wang Kun
Special Steel Corp,No.272,Bayi Road,Nanyang City,Henan Prov. China 473000

528400广东中山市东区亨达花园7栋702 王坤
Wang Kun
Room 702, 7th Building,Hengda Garden, East District,Zhongshan, China 528400

361012福建省厦门市莲花五村龙昌里34号601室 王坤
Wang Kun
Room 601, No.34 Long Chang Li,Xiamen, Fujian, China 361012

361004厦门公交总公司承诺办 王坤
Mr. Wang Kun
Cheng Nuo Ban, Gong Jiao Zong Gong Si Xiamen, Fujian, China 361004

266042山东省青岛市开平路53号国棉四厂二宿舍1号楼2单元204户甲 王坤
Mr. Zhou Wangcai
NO. 204, A, Building NO. 1,The 2nd Dormitory of the NO. 4 State-owned Textile Factory,
53 Kaiping Road, Qingdao,Shandong, China 266042  

地址: 中国上海市浦东新区浦东大道2000号阳光世界大厦22层H座  
Address: Suite H,22F,Sunshine World Tower,NO.2000 Pudong Av.,
Pudong New District,ShangHai,China

2009-02-17

最佳VIM技巧

最佳VIM技巧

;:+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;:文档来源: http://www.rayninfo.co.uk/vimtips.html
;:翻译参考: 没有记,请原作者见谅
;:文档日期: 2006-10-13 11:19:04
;:更新记录:
;:作  者: li3
;:生成工具: 2Html.vim
;:blog.asp?name=li3
;:+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;:--------------------------------------------------------------------------------
;:如果你使用的是MS-Windows,可能有的键已经被定义为Windows中的一些默认功能键。如果不
;:想这样,请编辑$VIM\mswin.vim
;:--------------------------------------------------------------------------------
/joe/e ;: 设置光标到匹配"joe"的末尾
/joe/e+1 ;: 设置光标到匹配"joe"的末尾再后移一位
/joe/s-2 ;: 设置光标到匹配"joe"的开头再前移两位
/joe/+3 ;: 搜索"joe" 找到后将光标下移3行
/^joe.*fred.*bill/ ;: 匹配以'j'开头且"joe"到"fred"到"bill"之间至少有一个字符
/^[A-J]\+/ ;: 搜索行首非'A'到'J'重复一次以上的行
/begin\_.*end ;: 多行匹配
/fred\_s*joe/i ;: 多行搜索可以是任何空白字符包括\n,\t等等
/fred\|joe ;: 搜索fred或者joe
/.*fred\&.*joe ;: 搜索同时包括fred跟joe的行
/\<fred\>/i ;: 搜索独立的单词fred
/\<\d\d\d\d\> ;: 搜索独立的4位数字
/\D\d\d\d\d\D ;: 搜索恰好4位的数字
/\<\d\\> ;: 同/\<\d\d\d\d\>
/\([^0-9]\|^\)%.*% ;: 查找以非0~9数字或在行首的%%所包括的内容
;:" 查找空行
/^\n\ ;: 匹配三连续的空行
;:" 使用正则表达式组查找
/\(fred\).*\(joe\).*\2.*\1
;:" 正则表达式重复
/^\([^,]*,\)\
;:" visual 下搜索
:vmap // y/<C-R>"<CR> ;: visually模式下的键盘映射,把//映射成匹配当前选中的文本
:vmap <silent> // y/<C-R>=escape(@",'\\/.*$^~[]')<CR><CR> ;: 包括空白字符
;:" \zs 和 \ze 匹配原 :h /\zs
/<\zs[^>]*\ze> ;: 匹配<与>所包含的内容
;:" 零宽度匹配 :h /\@=
/<\@<=[^>]*>\@= ;: 查找<与>所包含的内容
/<\@<=\_[^>]*>\@= ;: 多行匹配<与>所包含的内容
;:" 多行查找 \_ 的意思是包括换行符
/<!--\_p\--> ;: 匹配<与>所包含的所有内容
/fred\_s*joe/i ;: 匹配fred开始到joe,之间一定得是空白字符
/bugs\(\_.\)*bunny ;: 匹配所有bugs到bunny的字符串
:h \_ ;: help
;:" 查找函数声明,nmap为normal模式下的键盘映射
:nmap gx yiw/^\(sub\<bar>function\)\s\+<C-R>"<CR>
;:" 查找多个文件
:bufdo /searchstr/ ;: 在多个文件缓冲区里执行查找
;:" 更好的多文件查找定位方法
:bufdo %s/searchstr/&/gic ;: 在多个文件缓冲区里查找,按下n停止
;:" 怎样不使用 / 来查找网址
?http://www.vim.org/ ;: 向后查找
;:" 查找指定字符以外的字符串
/\c\v([^aeiou]&\a) ;: 查找4个辅音字母
;:-----------------------------------------------------------------------------
;:#替换
:%s/fred/joe/igc ;: 普通替换命令
:%s/\r//g ;: 删除 DOS 的换行符 ^M
;:" 你的文本文件是否乱七八糟的排成一行?使用如下命令
:%s/\r/\r/g ;: 转换 DOS 回车符 ^M 为真正的回车符
:%s= *$== ;: 删除行尾空白
:%s= \+$== ;: 同上
:%s#\s*\r\?$## ;: 删除尾部空白和dos换行符
:%s#\s*\r*$## ;: 同上
;:" 删除空行
:%s/^\n\// ;: 删除连续3个空行
:%s/^\n\+/\r/ ;: 压缩空行,多个替换为一个
:%s#<[^>]\+>##g ;: 删除html的tag部分
:%s#<\_.\>##g ;: 多行删除 html 的tags (非贪婪方式)
;:" IF YOU ONLY WANT TO KNOW ONE THING
:'a,'bg/fred/s/dick/joe/igc ;: 非常有用
;# 译释:''a,''b指定一个范围:mark a ~ mark b
;# g//用一个正则表达式指出了进行操作的行必须可以被fred匹配
;# 看后面,g//是一个全局显示命令
;# s/dick/joe/igc则对于这些满足条件的行进行替换
;:" 复制列
:%s= [^ ]\+$=&&= ;: 复制最后一列
:%s= \f\+$=&&= ;: 复制最后一列
:%s= \S\+$=&& ;: 复制最后一列
;:" 记忆(反向引用)
:s/\(.*\):\(.*\)/\2: \1/ ;: 将两个字段颠倒
:%s/^\(.*\)\n\1$/\1/ ;: 删除重复行
;:" 非贪婪匹配 \
:%s/^.\pdf/new.pdf/ ;: 删除第一个pdf
;:" use of optional atom \?
:%s#\<[zy]\?tbl_[a-z_]\+\>#\L&#gc ;: lowercase with optional leading characters
;:" 跨越尽量多的行
:%s/<!--\_.\-->// ;: 删除多行注释
:help /\ ;: 查看非贪婪匹配的更多帮助
;:" 使用寄存器替换
:s/fred/<c-r>a/g ;: 将fred替换为寄存器a里的内容 #<c-r>为按下Ctrl与r
:s/fred/<c-r>asome_text<c-r>s/g
:s/fred/\=@a/g ;: 比较好的办法,不显示替换内容
;:" 在一行里写多种命令
:%s/\f\+\.gif\>/\r&\r/g | v/\.gif$/d| %s/gif/jpg/
:%s/a/but/gie|:update|:next ;: 当使用 @: 来重复
;:" 或运算
:%s/suck\|buck/loopy/gc ;: 替换suck或者buck(这里|不是管道)
;:" 调用vim函数
:s/__date__/\=strftime("%c")/ ;: 将__date__替换成当前日期,使用strftime函数
;:" 处理列,替换所有在第三列中的str1
:%s:\(\(\w\+\s\+\)\\)str1:\1str2:
;:" 交换第一列跟第四列
:%s:\(\w\+\)\(.*\s\+\)\(\w\+\)$:\3\2\1:
;:" 过滤form中的内容放在寄存器里
:redir @*|sil exec 'g#<\(input\|select\|textarea\|/\=form\)\>#p'|redir END
:nmap ,z :redir @*<Bar>sil exec 'g@<\(input\<Bar>select\<Bar>textarea\<Bar>/\=form\)\>@p'<Bar>redir END<CR>
;:" 两位以上的数字减三(带进位。这个命令挺有趣)
:%s/\d\+/\=(submatch(0)-3)/
;:" 包含loc或者functions的行中的数字加6
:g/loc\|function/s/\d/\=submatch(0)+6/
;:" 比上面更好的方法
:%s#txtdev\zs\d#\=submatch(0)+1#g
:h /\zs ;查看帮助
;:" 前缀为gg的数字加6
:%s/\(gg\)\@<=\d\+/\=submatch(0)+6/
:h zero-width ;查看帮助
;:" 替换一个特定字符串为数字
:let i=10 | 'a,'bg/Abc/s/yy/\=i/ |let i=i+1 ;# 将yy转换成10,11,12等等
;:" 比上面的更精确
:let i=10 | 'a,'bg/Abc/s/xx\zsyy\ze/\=i/ |let i=i+1 # 将xxyy 转换成 xx11,xx12,xx13
;:" 将查找内容放入内存,然后用\zs进行简单替换
:%s/"\([^.]\+\).*\zsxx/\1/
;:" 将xx替换为此行内容
:nmap <leader>z :%s#\<<c-r>=expand("<cword>")<cr>\>#
;:" 将Vis选中的内容用<>括起来
:vmap <leader>z :<C-U>%s/\<<c-r>*\>/
;:-----------------------------------------------------------------------------
;:" 下面举一些在替换中使用替换的例子
;:" 多种分符可以被用在替换中
:%s,\(all/.*\)\@<=/,_,g ;: 用 _ 替换 "all/"之后的 /
;:" 同样的功能
:s#all/\zs.*#\=substitute(submatch(0), '/', '_', 'g')#
:s#all/#&^M#|s#/#_#g|-j! ;" 查找断行,并合并为一行
;:" 在替换命令中使用替换
:%s/.*/\='cp '.submatch(0).' all/'.substitute(submatch(0),'/','_','g')/
;:-----------------------------------------------------------------------------
;:" 全局显示命令
:g/gladiolli/# ;: 查找并显示匹配的行号
:g/fred.*joe.*dick/ ;: 显示所有含有 fred,joe & dick的行
:g/\<fred\>/ ;: 显示单一单词fred
:g/^\s*$/d ;: 删除所有空行
:g!/^dd/d ;: 删除不含字符串''dd''的行
:v/^dd/d ;: 同上
:g/fred/,/joe/d ;: 删除所有的从fred到joe
:g/-------/.-10,.d ;: 以-------为标记删除之前的10行
:g/{/ ,/}/- s/\n\+/\r/g ;: 删除 之间的空行
:v/\S/d ;: 删除空行
:v/./,/./-j ;: 压缩空行
:g/^$/,/./-j ;: 同上
:g/<input\|<form/p ;: 或运算
:g/^/put_ ;: 双倍行宽 (pu = put)
:g/^/m0 ;: 颠倒文件 (m = move)
:'a,'bg/^/m'b ;: 颠倒选中的 a 到 b
:g/^/t. ;: 重复行
:g/fred/t$ ;: 拷贝行从fred到结尾
:g/stage/t'a ;: 拷贝行从stage 到 marker a(a为标记的位置)
:g/\(^I[^^I]*\)\/d ;: 删除最少包含80个tab的行
;:" 隔行替换
:g/^/ if line('.')%2|s/^/zz /
;:" 查找标记a与b 间所有包含 "somestr"
;:" 复制所有"otherstr"后的行
:'a,'bg/somestr/co/otherstr/ ;: co(py) or mo(ve)
:'a,'bg/str1/s/str1/&&&/|mo/str2/ ;" 范围同上,进行替换
:%norm jdd ;: 隔行删除
;:" 增加数字 (键入 <c-a>) ;#在MS-Windows中<c-a>已经被定义为全选
:.,$g/^\d/exe "norm! \<c-a>" ;: 增加从当前行首到结尾的数字
:'a,'bg/\d\+/norm! ^A ;: 增加数字
;:" 保存全局命令的结果 (注意必须使用添加模式) 你需要使用 qaq 清空寄存器a.
;:"save results to a register/paste buffer 存储结果到 寄存器/粘贴 到 a
:g/fred/y A ;: 添加配备行到寄存器到 a
:g/fred/y A | :let @*=@a ;: 放入复制缓冲区
:let @a=''|g/Barratt/y A |:let @*=@a
:'a,'b g/^Error/ . w >> errors.txt ;" 将查找内容放入一个文件 (文件必须存在)
;:" 复制每一行,然后在复制出来的每一行两侧加上一个 print '复制出来的内容'
:g/./yank|put|-1s/'/"/g|s/.*/Print '&'/
;:" 用文件中的内容替换字符串,-d 表示删除"标记"
:g/^MARK$/r tmp.ex | -d
;:" 精致的显示方法
:g/<pattern>/z#.5 ;: 带行号显示
:g/<pattern>/z#.5|echo "==========" ;: 漂亮的显示
;:" 用 g// 执行正常命令
:g/|/norm 2f|r* ;: 替换第二个|为*
;:" 在新窗口中显示查找结果
:nmap <F3> :redir @a<CR>:g//<CR>:redir END<CR>:new<CR>:put! a<CR><CR>
;:-----------------------------------------------------------------------------
;:" 全局命令和替换命令联姻 (强大的编辑能力)
:'a,'bg/fred/s/joe/susan/gic ;: 可以使用反向引用来匹配
:g/fred/,/joe/s/fred/joe/gic ;: 非行模式
;:-----------------------------------------------------------------------------
;:" 先找fred,然后找joe
:/fred/;/joe/-2,/sid/+3s/sally/alley/gIC
;:-----------------------------------------------------------------------------
;:" create a new file for each line offile eg 1.txt,2.txt,3,txt etc
;:" 将每一行的内容存成一个文件,文件名为 行号.txt 如 1.txt,2.txt 等
:g/^/exe ".w ".line(".").".txt"
;:-----------------------------------------------------------------------------
;:" 绝对精华
;:-----------------------------------------------------------------------------
* # g* g# ;: 查找当前光标下的单词(单个单词) (<cword>) (向前/向后)
% ;: 匹配括号 {}[]()
. ;: 重复上次操作
@: ;: 重复上次的命令
matchit.vim ;: 适%能匹配 <script> <?php等标记
<C-N><C-P> ;: 插入模式下自动完成填词
<C-X><C-L> ;: 行自动完成(超级有用)
/<C-R><C-W> ;: 把单个<cword>单词放入搜索或者命令行
/<C-R><C-A> ;: 把字符串中有的单词<CWORD>放入搜索或者命令行
:set ignorecase ;: 忽略大小写
:syntax on ;: 打开语法高亮 Perl,HTML,PHP 等等
:h regexp<C-D> ;: 按ctrl+d得到包含regexp的列表
;: (按tab自动不齐)
;:-----------------------------------------------------------------------------
;:" 简单编辑更新 _vimrc文件
:nmap ,s :source $VIM/_vimrc ;:普通模式下的键盘映射 ,s映射成加载用户目录下的_vimrc文件
:nmap ,v :e $VIM/_vimrc ;:,v映射成打开_vimrc文件
;:-----------------------------------------------------------------------------
;:#VISUAL 模式 (方便增加 HTML 标签)
:vmap sb "zdi<C-R>z<ESC> ;: 在 VISUALLY模式下将选中的文本前后分别加上
:vmap st "zdi<?= <C-R>z ?><ESC> ;: 加上 <?= ?>
;:-----------------------------------------------------------------------------
;:"vim 7 tabs
vim -p fred.php joe.php ;: 在新tab中打开文件
:tabe fred.php ;: 在新tab中打开 fred.php
:tab ball ;: 每一个文件一个tab
;:" vim 7 .vimrc 配置使用tabs
:nnoremap gf <C-W>gf
:cab e tabe

;:-----------------------------------------------------------------------------
;:" 浏览
:e . ;: 文件浏览器
:Exp(lore) ;: 浏览文件
:Sex(plore) ;: 分割窗口浏览文件
:browse e ;: 打开windows 的 '选择文件'对话
:ls ;: 显示缓冲区
:cd .. ;: 设置当前目录位置
:args ;: 查看当前打开的所有文件
:args *.php ;: 打开所有 *.php文件
:lcd %:p:h ;: 改变路径到当前编辑的文件
:autocmd BufEnter * lcd %:p:h ;: 放入.vimrc自动完成上面的命令
;:-----------------------------------------------------------------------------
;:" 缓冲区浏览(一直排名前10的vim脚本)
;:" 需要 bufexplorer.vim http://www.vim.org/script.php?script_id=42
\be ;: 缓冲浏览器中查看缓冲列表
\bs ;: 同上,但是分割窗口
;:-----------------------------------------------------------------------------
;:" 转换大小写
guu ;: 将正行的字母转换成小写
gUU ;: 将正行的字母转换成大写
Vu ;: 转换选中的行(小写)
VU ;: 转换选中的行(大写)
g~~ ;: 反向转换
vEU ;: 转换词大写
vE~ ;: 反向转换词
ggguG ;: 将当前编辑文件内容全部转换成小写
;:" Visually 模式下选择所有的字母及数字 (放入 .vimrc文件中)
vmap ,c :s/\<\(.\)\(\k*\)\>/\u\1\L\2/g<CR>
:%s/[.!?]\_s\+\a/\U&\E/g ;:" 大写所有句子的第一个字母
;:-----------------------------------------------------------------------------
gf ;: 打开当前光标下或后的文件
:nnoremap gF :view <cfile><cr> ;: 打开当前光标下或后的文件, 如果不存在则创建
ga ;: 显示当前光标下单个字的ascii,十进制,十六进制……
ggVGg? ;: 将整个文件用rot13编码……(谁看得懂啊~~hoho)
ggg?G ;: 同上 (针对大文件)
:8 | normal VGg? ;: 将第八行用rot13编码
:normal 10GVGg? ;: 同上
<C-A>,<C-X> ;: 增加,减少当前光标下的数字
;: win32 用户需要重定义 CNTRL-A
<C-R>=5*5 ;: 插入25 (小型计算器)
;:-----------------------------------------------------------------------------
;:" 几个彩蛋……
:h 42 ;: also http://www.google.com/search?q=42
:h holy-grail
:h!
;:-----------------------------------------------------------------------------
;:" 标记 & 移动
'. ;: 跳回最后编辑的行 (超有用)
`. ;: 同上,但是定位编辑点
g; ;: 跳转到比较旧的编辑位置(如果有的话) (vim6.3后的新功能)
g, ;: 这个是较心的位置 (同上)
:changes :打出改变表
:h changelist ;: 查看"改变表跳转"的帮助
<C-O> ;: 依次沿着你的跳转记录向回跳 (从最近的一次开始)
<C-I> ;: 依次沿着你的跳转记录向前跳
:ju(mps) ;: 列出跳转轨迹
:help jump-motions
:history ;: 列出历史记录
:his c ;: 命令行历史
:his s ;: 搜索历史
q/ ;: 搜索命令历史的窗口
q: ;: 命令行命令历史的窗口
:<C-F> ;: 历史窗口
;:-----------------------------------------------------------------------------
;:" 缩写 & 映射
:map <f7> :'a,'bw! c:/aaa/x
:map <f8> :r c:/aaa/x
:map <f11> :.w! c:/aaa/xr<CR>
:map <f12> :r c:/aaa/xr<CR>
:ab php ;: 查看以php开头的缩写
:map , ;: 列出所有的映射(以逗号开始的)
;:" 允许映射 F10 (win32)
set wak=no ;: :h winaltkeys
;:" 映射中常使用的表示
<CR> ;: 回车
<ESC> ;: Esc
<LEADER> ;: 右斜杠
<BAR> ;: 管道符号
<BACKSPACE> ;: 退格键
<SILENT> ;: 不回显
#显示自定义的 RGB 颜色显示当前光标下的字符串 例如 #445588
:nmap <leader>c :hi Normal guibg=#<c-r>=expand("<cword>")<cr><cr>
:map <f2> /price only\\|versus/ :在map中需要用反斜线 \
;:-----------------------------------------------------------------------------
;:" 简单的 PHP 调试将所有显示的变量放入寄存器a
iab phpdb exit("<hr>Debug <C-R>a ");
;:-----------------------------------------------------------------------------
;:" 使用寄存器来映射 (放入 .vimrc文件自动加载)
:let @m=":'a,'bs/"
:let @s=":%!sort -u"
;:-----------------------------------------------------------------------------
;:" 列出寄存器
:reg ;: 显示当前所有的寄存器
:reg a ;: 显示寄存器a中的内容
;:"1p.... ;: 引用一个叫1的寄存器
:let @y='yy@"' ;: pre-loading registers (put in .vimrc)
qqq ;: 清空寄存器 "q"
;:-----------------------------------------------------------------------------
;:" 一些有用的决窍
;:"ayy@a ;: 把当前行作为命令执行
yy@" ;: 上面的匿名寄存器
u@. ;: 只执行键入的命令
;:-----------------------------------------------------------------------------
;:" 从其它命令处获得输入(需要外部命令)
:r!ls.exe ;: 从ls 获得输入插入到当前位置
!!date ;: 从date获得输入(删除当前行)
;:" 使用外部sort排序
:%!sort -u ;: 用sort排序整个文件(结果覆盖整个文件)
:'a,'b!sort -u ;: 从mark a到mark b之间的内容进行排序
!1} sort -u ;: 排序一个段落
:g/^$/;,/^$/-1!sort ;: 排序一个选中内容 ( ; 号非常重要)
;:-----------------------------------------------------------------------------
;:" 多文件管理 (基本的)
:bn ;: 跳转到下一个buffer
:bp ;: 跳转到前一个buffer
:wn ;: 保存当前buffer并跳转到下一个buffer (超有用)
:wp ;: 保存当前buffer并跳转到前一个buffer
:bd ;: 把当前文件从buffer移出 (超有用)
:bun ;: 卸载当前buffer (关闭这个窗口但是不移出)
:badd file.c ;: 添加file.c到buffer列表
:b 3 ;: 前往第三个 buffer
:b main ;: 前往含有main的buffer中 比如说 main.c
:sav php.html ;: 把当前文件存为php.html并打开
:sav! %<.bak ;: 换一个后缀名保存 (旧方法)
:sav! %:r.cfm ;: 同上
:sav %:s/fred/joe/ ;: 替换文件名
:sav %:s/fred/joe/:r.bak2 ;: 替换文件和后缀
:!mv % %:r.bak ;: 重命名当前文件
:help filename-modifiers
:e! ;: 打开未修改之前的文件
:w c:/aaa/% ;: 存储文件到指定位置
:e # ;: 编辑标记为#的文件在buffer中
:rew ;: 返回到第一个可编辑的文件
:brew ;: 回到第一个buffer
:sp fred.txt ;: 分割窗口打开fred.txt
:sball,:sb ;: 把所有的 buffers分割显示在一个窗口中 (超有用)
:scrollbind ;: in each split window
:map <F5> :ls<CR>:e # ;: 按F5显示所有buffer, 并显示行号
:set hidden ;: 允许不保存当前buffer而进行切换
;:-----------------------------------------------------------------------------
;:" 在分割窗口中快速切换
map <C-J> <C-W>j<C-W>_
map <C-K> <C-W>k<C-W>_
;:-----------------------------------------------------------------------------
;:" 录制命令 (最好的技巧)
qq ;:# 录制命令放入 q寄存器
.. ;:输入一些命令
q ;:# 录制结束
@q ;:执行放入寄存器q中的内容
@@ ;:重复
5@@ ;:重复5次
;:" 编辑一个 寄存器/录制
"qp ;:显示寄存器q中的内容(普通模式下)
<ctrl-R>q ;:显示寄存器q中的内容 (插入模式下)
;:" 你现在可以看到记录内容,随便编辑
"qdd ;:删除,重新存入q
@q ;:执行 录制/寄存器 q
;:" 在可视块中运行记录
;:1) 定义记录/寄存器
qq:s/ to/ from/g^Mq
;:2) 定义可视块
V}
;:3) 键入 ;: 将显示下面信息
:'<,'>
;:4)完成如下操作
:'<,'>norm @q
;:-----------------------------------------------------------------------------
;:"宏记录的map (命令方式结束)
nnoremap ] @q:w!<bar>bd
;:-----------------------------------------------------------------------------
;:" 可视化模式提供一种灵活易用的方法选择一块文本供操作符使用
;:" 记出
v ;: 进入可视化模式
V ;: 进入可视化行选择模式
<C-V> ;: 进入可视化块选择模式
gv ;: 重新选择
o ;: 选择的区域头尾移动
"*y ;: 复制选择区域到paste buffer
V% ;: 选择一个匹配段
V}J ;: 合并一个段落
V}gJ ;: 合并一个段落,并保留空格
;:-----------------------------------------------------------------------------
;:" 删除选中的10行的前两个字符(不过这里应该假设是紧凑的排版格式,不能包含空格、tab等字符的,可是经实验应该是钱3个字符才对啊??)
0<c-v>10j2ld
;:-----------------------------------------------------------------------------
;:" 如何用可视块拷贝几列
;:" 可视块(并非通常的 v 命令)
<C-V>,然后通过移动命令选择列 (win32 <C-Q>)
然后执行 c,d,y,r 等命令
;:-----------------------------------------------------------------------------
;:"用一个块替换另一个块
复制第一个块: ctrl-v move "ay
复制第二个块: ctrl-v move cctrl-o "aP <esc>
;:-----------------------------------------------------------------------------
;:" _vimrc 基本设置
:set incsearch ;: 输入搜索命令时,立即显示目前输入的模式对应的匹配。匹配的字符串被高亮。
:set wildignore=*.o,*.obj,*.bak,*.exe ;: tab补全时忽略这些忽略这些
:set shiftwidth=3 ;: 设置自动缩进为3个字符
:set vb t_vb=". ;: 安静模式,关闭响铃跟闪烁
:set browsedir=buffer ;: 设置文件浏览使用的目录
;: 注:last 使用文件浏览器最近访问相同的目录。
;: buffer 使用相关缓冲区的目录。
;: current 使用当前目录。
;: 使用指定目录。
;:-----------------------------------------------------------------------------
;:" 启动windows中的IE
:nmap ,f :update<CR>:silent !start c:\progra~1\intern~1\iexplore.exe file://%:p<CR>
:nmap ,i :update<CR>: !start c:\progra~1\intern~1\iexplore.exe <cWORD><CR>
;:-----------------------------------------------------------------------------
;:" 在vim里打开ftp
cmap ,r :Nread ftp://209.51.134.122/public_html/index.html
cmap ,w :Nwrite ftp://209.51.134.122/public_html/index.html
gvim ftp://www.somedomain.com/index.html # 使用 netrw.vim
;:-----------------------------------------------------------------------------
;:" 向寄存器中添加内容 (使用相应寄存器名称的大写)
;:" 复制5行放入a寄存器,然后向下跳转10行再复制5行
"a5yy
10j
"A5yy
;:-----------------------------------------------------------------------------
[I ;: 显示当前行中字符的所有匹配(超级有用)
;:-----------------------------------------------------------------------------
;:" 常规缩进
:'a,'b>> ;: 将mark a到mark b之间的内容进行两次缩进
;:" 虚拟模式下缩进 (可重复)
:vnoremap < <gv ;: 这是一个虚拟模式下的键盘映射
;: < 映射为<gv " < 意为向内缩进,
;: gv 上面已有解释,为重复上次选区
;: <gv 也就是先向内缩进然后再选择刚才的选区
;: 这样就可以只按 < 实现重复缩进了
:vnoremap > >gv ;: 向内缩进,原理同上
;:" 块缩进
>i{
>a{
;:" also
>% and <% ;:自己试试看吧,涉及到用 { 的语言很有用,比如c,c++等
;:-----------------------------------------------------------------------------
;:" 重定向 & 粘贴到寄存器 * (*为寄存器名称)
:redir @* ;: 重定向命令到paste缓冲区
:redir END ;: 结束
:redir >> out.txt ;: 重定向到文件
;:" 操作粘贴缓冲区
"*yy ;: 复制到寄存器
"*p ;: 从寄存器中粘贴一行
;:" 复制到粘贴缓冲区 (扩展模式)
:'a,'by* ;: 复制一个范围到粘贴寄存器
:%y* ;: 复制一个括号匹配到粘贴缓冲区
:.y* ;: 复制当前行到粘贴缓冲区
;:" 从剪贴板上过滤非可打印字符
;:" 当从一些 GUI 程序粘贴时会有用处
:nmap <leader>p :let @* = substitute(@*,'[^[:print:]]','','g')<cr>"*p
;:-----------------------------------------------------------------------------
;:" 重新格式化文本
gq} ;: 合并一个段落
gqap ;: 当前段落
ggVGgq ;: 全部段落
Vgq ;: 当前行
:s/.\;\s*\|.\\s\+/&\r/g ;:" 在70列的时候换行
;:-----------------------------------------------------------------------------
;:" 命令使用于多个文件
:argdo %s/foo/bar/e ;: 在所有文件上操做 :args
:bufdo %s/foo/bar/e
:windo %s/foo/bar/e
:argdo exe '%!sort'|w! ;: 包含外部命令
;:-----------------------------------------------------------------------------
;:" 命令行技巧
gvim -h ;: 显示帮助
ls | gvim - ;: 管道操作
cat xx | gvim - -c "v/^\d\d\|^[3-9]/d " ;: 从管道出过滤内容
gvim -o file1 file2 ;: 分割窗口显示两个文件
;:" 打开文件后执行一条命令
gvim.exe -c "/main" joe.c ;: 打开 joe.c & 跳转到 "main"
;:" 在打开一个文件时执行多条命令
vim -c "%s/ABC/DEF/ge | update" file1.c
;:" 在一组文件上执行多条命令
vim -c "argdo %s/ABC/DEF/ge | update" *.c
;:" 从一系列文件中删除一块区域
vim -c "argdo /begin/+1,/end/-1g/^/d| update" *.c
;:" 自动编辑文件 (编辑命令序列Ex commands已经包含在convert.vim中了)
vim -s "convert.vim" file.c
;:#不加载.vimrc跟任何plugin(干净清新的 VIM^_^)
gvim -u NONE -U NONE -N
;:" Access paste buffer contents (put in a script/batch file)
gvim -c 'normal ggdG"*p' c:/aaa/xp
;:" 将paste中的内容送往默认的打印机
gvim -c 's/^/\=@*/|hardcopy!|q!'
;:" gvim 里的 grep (win32 or *nix)
:grep somestring *.php ;: 创建匹配的文件列表
;:" 使用 :cn(向后后) :cp(向前) 操纵列表
:h grep :查看帮助
;:-----------------------------------------------------------------------------
;:" GVIM 的差异比较
gvim -d file1 file2 ;: vimdiff (比较不差异)
dp ;: 把光标处的不同放到另一个文件
do ;: 在光标处从另一个文件取得不同
;:-----------------------------------------------------------------------------
;:" Vim traps 在正则表达式中 + | ( { 都要加上转义符(反斜杠)
In regular expressions you must backslash + (match 1 or more)
In regular expressions you must backslash | (or)
In regular expressions you must backslash ( (group)
In regular expressions you must backslash { (count)
/fred\+/ ;: 匹配 fred/freddy 但不匹配 free
/\(fred\)\/ ;: note what you have to break
;:-----------------------------------------------------------------------------
;:" \v ,或叫做very magic (通常都是这么叫)可以取消转义符
/codes\(\n\|\s\)*where ;: 普通的正则表达式
/\vcodes(\n|\s)*where ;: very magic
;:-----------------------------------------------------------------------------
;:" 把对象送到命令行或者搜索行
<C-R><C-W> ;: 执行当前光标下的单个单词
<C-R><C-A> ;: 执行当前光标下尽可能多的单词
<C-R>- ;: 送至一个小型寄存器(同样使用于插入模式)
<C-R>[0-9a-z] ;: 送至一个命名寄存器 (括弧同上)
<C-R>% ;: 送至文件名(#也行) (同上)
<C-R>=somevar ;: 送至一个变量 (例如 :let sray="ray[0-9]")
;:-----------------------------------------------------------------------------
;:" 控制寄存器
:let @a=@_ ;: 清除寄存器 a
:let @a="" ;: 同上 a
:let @*=@a ;: 拷贝寄存器 a 到 paste buffer
:let @*=@: ;: 拷贝最后执行的命令到 paste buffer
:let @*=@/ ;: 拷贝最后执行的查找命令到paste buffer
:let @*=@% ;: 拷贝当前文件到 paste buffer
;:-----------------------------------------------------------------------------
;:" 帮助的帮助? (使用 TAB)
:h quickref ;: VIM 快速参考页
:h tips ;: Vim'自己的技巧帮助
:h visual<C-D><tab> ;: 虚拟模式的帮助列表
: 然后使用tab选择它们
:h ctrl<C-D> ;: 所有关于ctrl键的帮助列表
:helpg uganda ;: 过滤帮助文件 使用 :cn, :cp 查找下一个及后一个
:helpgrep edit.*director: grep help using regexp
:h :r ;: 关于 :ex 的命令帮助
:h CTRL-R ;: 普通模式相关
:h /\r ;: \r是什么的意思
:h \\zs ;: 使用双反斜线查找关于 \zs 的帮助
:h i_CTRL-R ;: 在插入模式中 <C-R>的解释
:h c_CTRL-R ;: 在命令模式中 <C-R> 的解释
:h v_CTRL-V ;: 虚拟模式
:h tutor ;: VIM 快速指南
<C-[>, <C-T> ;: Move back & Forth in HELP History
gvim -h ;: VIM 命令行帮助
;:-----------------------------------------------------------------------------
;:" 选项设置在那里
:scriptnames ;: 列出所有已经加载的 plugins, _vimrcs文件
:verbose set history? :显示 history的值并显示在那里定义的
:function ;: 列出所有函数
:func SearchCompl ;: 显示指定函数的细节
;:-----------------------------------------------------------------------------
;:" 制作你自己的VIM 帮助
:helptags /vim/vim64/doc ;: 重新编译所有 *.txt 的帮助文件在这个目录里
:help add-local-help :如何添加本地帮助
;:-----------------------------------------------------------------------------
;:" 用外部程序运行文件 (例如 php)
map <f9> :w<CR>:!c:/php/php.exe %<CR>
map <f2> :w<CR>:!perl -c %<CR>
;:-----------------------------------------------------------------------------
;:" 在另一个buffer中,捕捉当前脚本的输出
:new | r!perl # ;: 新建一个buffer,从另一个buffer中读入结果
:new! x.out | r!perl # ;: 同上,并指定一个新文件名
:new+read!ls
;:-----------------------------------------------------------------------------
;:" 创建一个新的buffer, 粘贴q寄存器,然后对它进行排序
:new +put q|%!sort
;:-----------------------------------------------------------------------------
;:" 插入DOS换行符
:%s/$/\<C-V><C-M>&/g ;: (that's what you type
:%s/$/\<C-Q><C-M>&/g ;: for Win32) 对于Win32应该这样
:%s/$/\^M&/g ;: 你看到的^M是一个字符
;:-----------------------------------------------------------------------------
;:" 自动删除行尾 Dos回车符和空格
autocmd BufRead * silent! %s/[\r \t]\+$//
autocmd BufEnter *.php :%s/[ \t\r]\+$//e
;:-----------------------------------------------------------------------------
;:" 对指定文件或文件类型执行某个动作
autocmd VimEnter c:/intranet/note011.txt normal! ggVGg?
autocmd FileType *.pl exec('set fileformats=unix')
;:-----------------------------------------------------------------------------
;:" 把最后一个命令贴到当前位置
i<c-r>:
;:" 把最后一个搜索指令贴到当前位置
i<c-r>/
;:-----------------------------------------------------------------------------
;:" 更多的完成功能
<C-X><C-F> ;:插入当前目录下的一个文件名到当前位置 # 在insert模式下使用 # 然后用 Ctrl-P/Ctrl-N 翻页
;:-----------------------------------------------------------------------------
;:" 替换一个visual区域
;:" 选择一个区域,然后输入 :s/Emacs/Vim/ 等等,vim会自动进入:模式
:'<,'>s/Emacs/Vim/g ;: 前面的' '<.'> 是vim自动添加的
gv ;: 重新选择前一个可视区域 (ULTRA)
;:-----------------------------------------------------------------------------
;:" 在文件中插入行号
:g/^/exec "s/^/".strpart(line(".")."", 0, 4)
:%s/^/\=strpart(line(".")." ", 0, 5)
:%s/^/\=line('.'). ' '
;:-----------------------------------------------------------------------------
;:#用VIM的方式来编号行
:set number ;: 显示行号
:map <F12> :set number!<CR> ;: <F12>开关行号显示
:%s/^/\=strpart(line('.')." ",0,&ts)
;:#从任意行开始编号(需要perl)
:'a,'b!perl -pne 'BEGIN substr($_,2,0)=$a++'
;:#产生数字列表
;:#从223行开始的内容至一个空文件
qqmnYP`n^Aq ;: 用@q来重复一个宏q
;:" 递增已存在数字到文件末
:.,$g/^\d/exe "normal! \<c-a>"
;:" 高级递增,参见:
http://vim.sourceforge.net/tip_view.php?tip_id=150
;:-----------------------------------------------------------------------------
;:" 高级递增 (真的很有用)
;:" 把下面几句放到 _vimrc
let g:I=0
function! INC(increment)
let g:I =g:I + a:increment
return g:I
endfunction
;:" 例如从mark a 到mark b 递增,从223开始,步长为5
:let I=223
:'a,'bs/^/\=INC(5)/
;:" create a map for INC
cab viminc :let I=223 \| 'a,'bs/$/\=INC(5)/
;:-----------------------------------------------------------------------------
;:" 生成从 23-64 的数字列表
o23<ESC>qqYp<C-A>q40@q
;:-----------------------------------------------------------------------------
;:" 在当前插入模式下编辑/移动 (真得很有用)
<C-U> ;: 删除全部
<C-W> ;: 删除最后一个单词
<HOME><END> ;: 移动到行首/行尾
<C-LEFTARROW><C-RIGHTARROW> ;: 向前/后移动一个单词
<C-X><C-E>,<C-X><C-Y> ;: 输入方式时滚屏
;:-----------------------------------------------------------------------------
#加密(小心使用,不要忘了密码)
:X ;: vim会提示你输入密码
:h :X
;:-----------------------------------------------------------------------------
;:" 模式行 (使文件只读等),必须在前/后 5行内
// vim:noai:ts=2:sw=4:readonly:
vim:ft=html: ;: 使用 HTML 语法高亮
:h modeline
;:-----------------------------------------------------------------------------
;:" 建立你自己的菜单项
amenu Modeline.Insert\ a\ VIM\ modeline <Esc><Esc>ggOvim:ff=unix ts=4 ss=4<CR>vim60:fdm=marker<esc>gg
;:-----------------------------------------------------------------------------
;:" 一个保存当前光标下的狭义字到一个文件的函数
function! SaveWord()
normal yiw
exe ':!echo '.@0.' >> word.txt'
endfunction
map ,p :call SaveWord()
;:-----------------------------------------------------------------------------
;:" 删除重复行的函数
function! Del()
if getline(".") == getline(line(".")- 1)
norm dd
endif
endfunction

:g/^/ call Del() ;:#使用该函数的一个例子
;:-----------------------------------------------------------------------------
;:" 双字节编码 (non alpha-numerics)
:digraphs ;: 显示编码表
:h dig ;: 帮助
i<C-K>e' ;: 输入 é
i<C-V>233 ;: 输入 é (Unix)
i<C-Q>233 ;: 输入 é (Win32)
ga ;: 查看字符的hex值
;:#删除非 ascii 字符
:%s/[<C-V>128-<C-V>255]//gi ;: <C-V> Control-V
:%s/[]//gi ;: 查看不可见字符
:%s/[<C-V>128-<C-V>255<C-V>01-<C-V>31]//gi ;: All pesky non-asciis
:exec "norm /[\x00-\x1f\x80-\xff]/" ;:: 同上
;:#在查找框内输入不可见字符
yl/<C-R>" :
/[^a-zA-Z0-9_[:space:][:punct:]] ;:: 找出所有不可见字符
;:-----------------------------------------------------------------------------
;:" 文件名自动完成 (例如 main_c.c)
:e main_<tab> ;: tab 键完成
gf ;: 打开光标处广义字命名的文件 (normal模式)
main_<C-X><C-F> ;: 文件名自动完成(insert模式)
;:-----------------------------------------------------------------------------
;:" Vim复杂使用
;:" 交换两个单词
:%s/\<\(on\|off\)\>/\=strpart("offon", 3 * ("off" == submatch(0)), 3)/g
;:" 交换两个单词
:vnoremap <C-X> <Esc>`.``gvP``P
;:-----------------------------------------------------------------------------
;:" 把text文件转换成html文件(oh,ft)
:runtime! syntax/2html.vim ;: 转换 txt 成 html
:h 2html
;:-----------------------------------------------------------------------------
;:" VIM 有一个内部自带的 grep 命令
:grep some_keyword *.c ;: 得到一个包含some_keyword的c文件名列表
:cn ;: 去下一个出现的位置
;:-----------------------------------------------------------------------------
;:" 强制无扩展名的文件的语法着色方式
:set syntax=perl
;:" 取消语法着色 (很有用)
:set syntax off
;:" 改变色彩主题 (在~vim/vim??/colors中的任何文件)
:colorscheme blue
;:" 通过使用模式行强迫使用 HTML 语法高亮
# vim:ft=html:
;:" 强制自动语法加亮(非标准的文件扩展)
au BufRead,BufNewFile */Content.IE?/* setfiletype html
;:-----------------------------------------------------------------------------
:set noma (non modifiable) ;: 防止修改
:set ro (Read Only) ;: 只读保护
;:-----------------------------------------------------------------------------
;:" 对话 (打开一堆文件)
gvim file1.c file2.c lib/lib.h lib/lib2.h ;: 在"对话"中加载这些文件
:mksession ;: 生成一个Session文件 (默认是Session.vim)
:q
gvim -S Session.vim ;: 重新加载所有文件
;:-----------------------------------------------------------------------------
#标记(tags) (跳转到子程序/函数)
taglist.vim ;: 很流行的插件
:Tlist ;: 显示标记 (函数列表)
<C-]> ;: 跳转到光标处的函数
;:-----------------------------------------------------------------------------
;:" columnise a csv file for display only as may crop wide columns
:let width = 20
:let fill=' ' | while strlen(fill) <width | let fill=fill.fill | endwhile
:%s/\([^;]*\);\=/\=strpart(submatch(1).fill, 0, width)/ge
:%s/\s\+$//ge
;:" Highlight a particular csv column (put in .vimrc)
function! CSVH(x)
execute 'match Keyword /^\([^,]*,\)\\zs[^,]*/'
execute 'normal ^'.a:x.'f,'
endfunction
command! -nargs=1 Csv :call CSVH(<args>)
;:" call with
:Csv 5 ;: highlight fifth column
;:-----------------------------------------------------------------------------
;:" 折叠:隐藏某些片断,使查看更容易
zf} ;: 使用动作命令折叠一个段落
v}zf ;: 使用可视模式折叠一个段落
zf'a ;: 折叠到一个标记上
zo ;: 打开折叠
zc ;: 重新关闭折叠
;:-----------------------------------------------------------------------------
;:" 显示"不可见字符"
:set list
:h listchars
;:-----------------------------------------------------------------------------
;:" 如何在不进入插入模式的情况下粘贴"普通模式的命令"
:norm qqy$jq
;:-----------------------------------------------------------------------------
;:" 处理文件名
:h filename-modifiers ;: 帮助
:w % ;: 写入当前文件
:w %:r.cfm ;: 改变文件扩展名为 .cfm
:!echo %:p ;: 显示完整路径和文件名
:!echo %:p:h ;: 只显示完整路径
:!echo %:t ;: 只显示文件名
:reg % ;: 显示文件名
<C-R>% ;: 插入文件名 (插入模式)
:"%p ;: 插入文件名 (普通模式)
/<C-R>% ;: 在文本中查找文件名
;:-----------------------------------------------------------------------------
;:" 删除,但不破坏 buffer 内容
:"_d ;: 你一直想要的东西
:"_dw ;: 例如:删除一个单词 (使用黑洞???)
;:-----------------------------------------------------------------------------
;:" 送完整的路径名到剪贴板,用于邮件附件等
nnoremap <F2> :let @*=expand("%:p")<cr> :unix
nnoremap <F2> :let @*=substitute(expand("%:p"), "/", "\\", "g")<cr> :win32
;:-----------------------------------------------------------------------------
;:" 不用离开 Vim 就能修改文件名的简单 shell 脚本
$ vim
:r! ls *.c
:%s/\(.*\).c/mv & \1.bla
:w !sh
:q!
;:-----------------------------------------------------------------------------
;:" 在一个文本里计算单词数
g<C-G>
;:-----------------------------------------------------------------------------
;:" 你自己设置高亮显示的例子
:syn match DoubleSpace " "
:hi def DoubleSpace guibg=#e0e0e0
;:-----------------------------------------------------------------------------
;:" reproduce previous line word by word
imap ] @@@<ESC>hhkyWjl?@@@<CR>P/@@@<CR>3s
nmap ] i@@@<ESC>hhkyWjl?@@@<CR>P/@@@<CR>3s
;:" 根据文件类型映射快捷键
:autocmd bufenter *.tex map <F1> :!latex %<CR>
:autocmd bufenter *.tex map <F2> :!xdvi -hush %<.dvi&<CR>
;:-----------------------------------------------------------------------------
;:" 读取 MS-Word 文档,需要 antiword
:autocmd BufReadPre *.doc set ro
:autocmd BufReadPre *.doc set hlsearch!
:autocmd BufReadPost *.doc %!antiword "%"
;:-----------------------------------------------------------------------------
;:" a folding method
vim: filetype=help foldmethod=markerfoldmarker=<<<,>>>
;:A really big section closed with a tag <<<
;:--- remember folds can be nested ---
Closing tag >>>
;:-----------------------------------------------------------------------------
;:" Just Another Vim Hacker JAVH
vim -c ":%s%s*%Cyrnfr)fcbafbe[Oenz(Zbbyranne%|:%s)[[()])-)Ig|norm Vg?"
;:# 译释:呵呵,谁来解释一下吧!
;:# 其实不过是在启动vim的时候执行了一个命令
;:# 先写入了 Just Another Vim Hacker 的rot13编码
;:# 然后再解码
;:-----------------------------------------------------------------------------
;:__END__

2009-02-13

笔记本代工情况[转]

在整个IT业界,代工一直是件非常神秘的事情,许多品牌厂商均不愿意透露自己产品的代工关系,一方面顾及到产品形象和销 量问题,另一方面当然也出于商业保密需求。但有些古话说得好,"纸是包不住火的"、"若要人不知除非已莫为",下面我们一起看看国内外各大笔记本品牌的代 工关系都是怎样的呢?需要提前说明的是,各大品牌厂商与代工厂之间的关系就好比几张蜘蛛网叠在一起,纷繁复杂,同时面对媒体厂商也不愿过多透露自己的代工 情况,因此下面的资料分析仅供参考学习,如有错漏欢迎指正。

联想

  在2000年大举进军笔记本领域的时候,联想最主要的代工伙伴是大众电脑,其接近70%的笔记本均出自大众工厂,其它的30%由仁宝代工。随着联想笔 记本国际步伐的挺进和出货量的大幅提升,到2002年联想开始分散代工,主要合作伙伴除了大众,还有神基、广达、仁宝和纬创。几大强劲对手的实力令大众几 乎一度受困,到2003年开始与联想的代工合作出现萎缩,大量订单被对手夺去,最终还是被联想踢出了代工伙伴名单。此前仁宝也已经出局(后来再续前缘), 如此就剩下神基、广达和纬创三个。其中神基由于更热衷于军工笔记本,对民用机型不感兴趣,于是也很快与联想脱离了关系。

  继联想收购IBM以后,目前联想的代工合作伙伴主要是纬创、广达和仁宝三家,包括IdeaPad、Thinkpad以及天逸等原有系列机型均分摊给三 家代工。纬创主要还是负责15寸和12寸机型,广达则负责14寸机型,仁宝则负责绝大多数的商用机型。如果按比例来算,由于广达的合作单较多也较大,联想 在广达那并非处于一线代工合作伙伴,因此联想将更多的代工产量交给了纬创,纬创几乎包揽Thinkpad所有系列机型的代工生产。当然,这几家的代工型号 界线并不明显,同一款产品型号的不同批次有可能出自不同的代工厂。此外,联想也似乎与神基、志合、和硕等代工厂仍保持着一定的合作关系。

惠普

  惠普的代工伙伴一直以来都比较稳定,主要的包括有纬创、仁宝、广达和英业达四家,广达和英业达主要做消费类中低端和低价小本以及不少商务机型,12寸 则由善长小本代工的纬创一手包办,仁宝则主要做中高端以及部分商务产品。除了这四家,惠普的一些零碎代工业务也会分配给其它代工合作伙伴,如和硕、大众 等。

  与其它笔记本品牌的代工策略有所不同的是,惠普的代工合作比较灵活,同一款产品的代工计划会交给多家代工厂,谁家代工厂出价便宜就会给谁更多的订单 量,当然前提是要保证相同的质量。这种非固定式的代工策略也为惠普赢得了更加有利的整机成本控制。

戴尔

  戴尔尽管也是全球数一数二的笔记本大厂,但其笔记本电脑却全部外包生产,目前的主要代工伙伴有3家,广达、仁宝和纬创。有意思的是一直以来,广达与仁 宝,前者负责戴尔的商务类产品代工,而消费类产品则由仁宝操刀,纬创则依然包办了戴尔的12寸便携机型。不过在2005年的时候,戴尔利用代工策略上的小 手段,顺利的挑起了广达与仁宝之间的竞争火焰,广达也接了消费类的单,商务类的也有部分被仁宝抢去,而在代工成本上均比原来低出不少,戴尔成功的扮演了 "渔翁"的角色。

  不过近两年,戴尔的代工合作模式似乎又趋于平衡,旗下的Latitude系列与Inspiron的低价系列交给了广达,仁宝仍然负责消费类机型,而最 新的Studio系列机型则按不同尺寸类型和比重分给了三家分别代工,纬创在这其中也分得了不少的份额,看来戴尔也在有意的继续扶持纬创,以制衡广达与仁 宝的垄断。另外据传,在2001年的时候三星也曾为戴尔生产过笔记本,但在2005年的时候三星退出了代工市场,从此不再来往。

华硕

  前面已经提到过,目前排名第五的代工厂和硕在今年之前仍是华硕旗下的一个子机构,华硕自有品牌的所有笔记本产品均为自己研发生产。而分家后和硕与华硕 依然关系非同一般,华硕的笔记本产品当然也毫无悬念的仍然由和硕一手包办。

富士通

  在那么多笔记本品牌中,富士通算是最固执最坚持也是最为人尊崇的一个品牌,从2000年之前进入笔记本市场以来富士通一直坚持原厂研发制造,绝大部分 笔记本电脑均在日本本土生产,国内的所有富士通笔记本也全都是原装进口。对此我们也可以看成是富士通牺牲了成本控制而追求最大品质保证的表现。

  作为日本最大的IT厂商,富士通公司在全球拥有500多家子公司和18万名员工,在当今网络社会发展所必须的通信信息技术方面,不论是移动计算、服务 器、中间件、光网络技术、还是新一代移动通信,其都拥有自主产权专利的先进技术和丰富的经验。凭借着自身的技术优势和出众的制造工艺,富士通的笔记本电脑 很早就在业界赢得了"日本小黑"的美称。

索尼

  日韩笔记本一向以细腻时尚的做工著称,但生产这些优秀作品的并非全是日韩本土。索尼的笔记本一直以来一半在日本本土制造,一半由台湾代工厂代工。选择 本土制造的主要是一些极高端机型,如早期的T系列和TZ系列等都在日本生产,现在最新的Z系列究竟是出自台湾广达代工还是在日本生产还不得而知,按照以往 惯例很有可能仍是在日本。

  索尼的出货量并不高,因此代工合作伙伴并不多而且长期比较稳定。其中旗下的绝大多数商务机型基本都交由广达代工,包括专业的G系列和超便携的 SZ、CR系列以及最新推出的SR系列均由广达包办;而定位家庭娱乐应用的大尺寸机型如FW系列和NR系列等则交由华硕代工。选择华硕的原因是因为华硕一 直以来都为索尼代工PSP游戏机,并通过了索尼的质量体系验证,合作关系非常密切。

苹果

  与戴尔一样,苹果的全线产品包括台式机、数码随身听、笔记本电脑等几乎都是采用外包OEM代工形式。最早为苹果笔记本代工的是台湾的致胜,随后在 2001年和2003年,致胜公司两度被精英和华硕收购,因此也致使苹果的代工合作两度转手,使苹果很是郁闷。如此频繁的并购风波一定会对自身的代工外包 造成影响,于是苹果在2003年增加了广达为代工合作伙伴,并把旗下的PowerBook系列机型交给广达代工。当时仍没分家的华硕既有自家品牌也有代 工,代工订单本就比较少,受到广达的竞争更是雪上加霜,于是在后续的竞争中以更低的代工价格在广达手上抢回了订单。所以,最终获利的仍是苹果,看来,挑起 代工厂家之间的竞争已经成为国际大品牌为了降低生产成本的惯用手段了。

  近两年,苹果的笔记本电脑全线更新为MacBook、MacBook Pro和MacBook Air三大系列,其中MacBook绝大部分订单仍由华硕握在手里,广达则代工15.4英寸和17英寸MacBook Pro机型。期间,华硕的代工业务受到了富士康的威胁,不过最后似乎富士康未能如愿,不过苹果最新的MacBook Air代工合作却被广达抢去。

东芝

  东芝笔记本在过去也是选择自已生产和外包代工相结合的模式。 2004年年底之前,东芝拥有3个笔记本电脑生产基地,分别在日本青梅厂、杭州东芝和菲律宾东芝。2004年年底,由于产能利用率严重不足,亏损严重,东 芝关闭了菲律宾工厂。2005年5月,东芝关闭日本青梅厂,青梅厂转为试验产品生产线,青梅厂以前以生产13英寸以下的笔记本电脑为主,这些产品接下来由 杭州厂生产。

  在外包方面,东芝过去最大的合作伙伴是仁宝、英业达和广达。最大的合作是仁宝,东芝大部分的商务机型和彩壳机型都是仁宝代工,约占台企代工厂商的 70%份额,剩下的20%由英业达代工,主要是部分消费类机型;而广达代工的比率最低,可能是东芝也知道广达所接的单都是巨额大单的缘故。进入2007 年以后代工关系发生了变化,最大代工厂变成了广达,其次是英业达,仁宝被冷落后只代工少批量机型。

三星

  三星的笔记本一直以来绝大部分都是自主研发生产,2005年5月份,三星完成了将笔记本电脑生产线全部移至苏州的工程,至此,苏州基地成为了三星笔记 本电脑的全球唯一生产基地。不过随着产量需求的不断提升,三星的苏州工厂似乎已经不能再担负起全部的制造工作,因此有传言称在近两年来三星曾多次对外寻求 代工。另外有说法是三星笔记本的部分高端型号已经交给华硕代工,而中低端型号则交由广达。对于以上两点说法,三星方面都没有作出正式表态,事实如何不得而 知。除了自主研发生产自有品牌的笔记本,三星在05年之前还曾为Dell和Gateway代工,之后很快退出代工业务。

神舟

  当前,神舟最大的代工合作伙伴是志合和广达。广达主要负责中高端机型的代工,如HP系列和承运系列等,志合则包揽了其它绝大部分中低端机型的订单,此 外在2007年期间有部分机型交给了神基代工。其实最早给神舟代工的是志合,志和自2003年初开始为神舟出货,双方首度合作的产品涵盖高、中、低阶产品 线;神舟当时开始销售的"天运系列"全部由志和负责设计量产,当时志合每月为神舟出货4000~5000台笔记本电脑。尽管与志合的合作一直保持得不错, 但考虑到志和还有联想、方正等几个大客户,神舟为了压低代工成本,先后又与建基、伦飞和神基等代工厂建立了关系。

  事实上神舟也有自己有生产工厂设在了深圳,但规模和产能较小,主要是为了能够自主把握产品发布进程,快速响应技术和配置的更新换代,从而取得市场优先 切入权和说话权,也为其笔记本产品屡屡率先突破价格底线提供了极大的帮助。

宏�

  宏�最大的三个代工合作伙伴是纬创、广达和仁宝。纬创能够占居宏�代工合作的首位是因为纬创是泛宏�集团的三大支柱之一,宏�与纬创也算是两兄弟了, 当然肥水不流外人田。对于这三大代工厂宏�的划分比较清晰,广达主要代工强调稳定性能的商务笔记本电脑,仁宝主要代工强调娱乐性能的宽屏笔记本电脑,纬创 则代工其最擅长的12英寸笔记本电脑和平板电脑。

  在分代工分配上宏�采用了三三原则,基本上纬创占了35%,另外的30%在广达、30%在仁宝,剩下的5%左右则交给了06年初才加入的第四家代工厂 英业达,宏�的第一款非计划产品19寸笔记本正是出自英业达之手。宏�代工的三三原则让其产品具备了较高的性价比,尤其中高端产品优势更是明显。

  说起宏�我们不得不提一下已经收至旗下的Gateway,Gateway在早期的部分产品由三星和华宇代工,后来宏�接手Gateway并获得代工主 导权以后,全部产品均交给了广达代工。

明基

  明基在显示器、手机、光驱等领域都是相当强悍的角色,另外明基的关联公司友达也是台湾的第一大液晶面板厂家,因此,当明基在2002年宣布正式进军笔 记本市场的时候,前三大代工厂广达、仁宝和纬创都同意接受明基的订单。但到了后来,明基的出货量远远不能让这些一线代工大厂满意,同时在竞争对手宏�的挑 拨之下,三大代工厂都与明基脱离了代工关系。

  无耐之下明基找到了英业达,当时明基与英业达成立了联盟,英业达为明基代工笔记本电脑,明基则为英业达提供液晶面板。到了2004年,随着笔记本价格 战的打响,英业达给明基的代工成本偏高,明基为了应对价格战不得不找到了另一家代工厂神基进行合作,由神基负责大部分的低端产品;同时在2007年与英业 达取消合作。另外据传2008年华硕完成分家后,明基有意将部分代工交给和硕。目前,明基的笔记本代工主要分给了广达和神基两家,其中今年推出的一款超薄 独显本X31正是出自广达之手。

新蓝

  新蓝目前的主要代工合作伙伴是广达、华硕和仁宝,所占比例大概为60%、20%、20%。传闻新蓝曾经用过精英志合的模具,但由于嫌其做工较差质感一 般,返修率比较高,所以后来才找到了广达并把其列为首席代工伙伴。

海尔

  海尔在2002年进入笔记本市场,但在2002年底就宣布退出,然而在2004年3月又重新加入,可谓一波三折。而在代工方面,海尔与多家代工厂都发 生过关系,包括纬创、仁宝、大众、和硕、精英、三星等。04年初海尔与纬创、仁宝和大众签订了代工协议,三家试探性地各为海尔制造了一批笔记本电脑;后来 华硕也加入到海尔的代工行列。目前海尔的主要代工伙伴是和硕与精英。

TCL

  与海尔一样,TCL也在2002年进入笔记本电脑领域。在2002年12月,TCL与英业达签订了代工合同,后来双方关系解除。接着TCL找过很多代 工厂家,但为了控制代工成本,TCL所找的均为二线代工厂。TCL第一款宽屏笔记本电脑委托神基生产,后来又找上了大众,再后来是蓝天。另外,12 寸轻薄本也交给了口碑较好的纬创代工,而经典作品K10则交给了志合代工生产。目前,TCL的产量逐渐出现萎缩,因此也只能与少数一两个二三线工厂维持着 代工关系。

方正

  方正的笔记本电脑早期委托给蓝天代为生产,后来因为不满意蓝天的散热设计转投其他厂家。2003年方正和蓝天、精英、纬创签订了一年15万台的笔记本 电脑订单,到了2005年,方正搭上了一线代工大厂广达和仁宝,主攻高端领域机型,同时也与神基和志合保持着代工关系,负责中低端产品。










2005年第二季度我国台湾省笔记本电脑出货量达到 1088万台,占全球笔记本电脑出货量的81.2%。其中前六大厂广达、仁宝、纬创、英业达、华硕、志和占了大约86%的份额。广达的出货量高达420万 台,占38.6%。而2005年第二季度整个中国内地的笔记本电脑销量只有69.8万台,广达7月份笔记本电脑出货量为160万台,比整个中国内地笔记本 电脑销量总和的2倍还多20万台。这些笔记本电脑代工厂家同样有能力左右笔记本电脑的价格。谁的下单数量大,代工厂的重视程度就高,报价就会低。相反下单 数量少,被忽视还不说,还要承受高昂的报价。对广达、仁宝、纬创这样的代工厂来说,只有惠普和戴尔才算是大客户,其他厂家的下单量可能不到惠普下单量的 1%,甚至0.1%,会受到什么样的待遇可想而知。而对志和这样的代工厂来说,神舟就是一个大客户。不仅备受重视,价格还好商量。大厂的技术实力是好一 些,但是要看是对待什么样的客户了。小厂的技术实力差一些,但是如果努力的话,品质也不会和大厂差太多。大厂和小厂的格局也不会一成不变,志和在得到富士 康资助后,2005年笔记本电脑出货量预计可以达到200万台以上,已经和华硕的笔记本电脑代工出货量相当,从寂寂无名的小厂一跃成为炙手可热的大厂,股 票连续上涨。英业达第三的位置已经被纬创超越,并且还在不断地下滑。
代工不是见得不人的丑事,代工是很正常的现象,不过也是很神秘的。国内厂家一直对自己的代工厂守口如瓶,不过只要是做了的事,自然就会有人知道。我们就来 指出这些幕后英雄是谁。


湾笔记本电脑的出货量虽然居世界第一,但真正拥有自有品牌的产品不多,只有伦飞、华硕、宏基、仁宝少数几家厂商,推出了自有品牌的笔记本电脑,在数量上与 代工总量相比显然不成比例。在笔记本电脑市场刚刚启动的1995年,伦飞就是当时市场上的当红品牌,也是最早进入内地的台湾笔记本最知名品牌,曾与 IBM、Toshiba等国际品牌名列前三甲,但进入大陆并不顺利,2001年就被挤出了前10名之外。华硕自有品牌笔记本曾预期在国内市场上拿下 18-20%的占有率,但心有余而力不足。
同一个工厂出来的不同品牌笔记本电脑,质量和性能并不一样。不同的品牌的设计架构不同,选择的配件也不一样,检测标准自然更不相同。比如,同是英业达生产 的笔记本电脑,HP的产品使用铝美合金外壳,而国内另一种产品使用的是工程塑料。谁造的笔记本,不等于就是谁的产品,贴谁的牌子,其内质和性能也大有讲 究。消费者选择谁的产品,还是不要光在价格上打算盘,性价比综合指数最高的,才是比较理想的选择。
     
    联想
   在2000年时开始大举进军笔记本电脑和主板领域,当时联想的主要代工伙伴是大众电脑,大众电脑不仅为联想代工笔记本电脑,同时还代工名为QDI的主板。 2000年大众为联想生产了8万台笔记本电脑,占联想笔记本电脑总销量的2/3,2001年为联想生产了18万台笔记本电脑,占联想笔记本电脑总销量的 70%左右。从2002年开始,联想开始分散代工伙伴,联想曾经有5个代工伙伴,分别是神基、大众、广达、纬创、仁宝。仁宝在2002年左右出局。大众的 竞争力在2003年和2004年都有所下降,大众整个集团扩展速度过快,导致大众电脑要为整个集团输血,最终也被联想剔出代工伙伴名单。最后剩下神基、广 达、纬创三个合作伙伴。神基专注于军用笔记本电脑,对民用笔记本电脑兴趣不大,加之联想要求苛刻,付款周期长,神基最终不愿意为联想代工,代工数量日益下 降,联想的昭阳系列以前大部分是神基代工。
   联想目前的代工伙伴主要是仁宝、纬创和广达。纬创将代工生产15英寸宽屏幕机种,预计2005年9月间出货,预计年出货量约50万台;广达则获得14英寸 宽屏幕机种订单,预计年出货量近40万台。仁宝为联想代工的是那款很出名的旭日150C。联想也委托富士康开发了一款笔记本电脑,这款笔记本电脑硬件部分 由鸿海关联厂家志和制造,结构件和外壳由富士康制造,部分软件由联想开发。但是富士康的下游厂家是笔记本电脑代工厂家,如果富士康也做笔记本电脑代工,必 然和下游客户形成竞争关系,并且笔记本电脑代工远不如富士康外壳和构件利润来得高,因此富士康最终也没有为联想代工笔记本电脑。
   根据我国台湾省不愿意透露姓名的代工厂家所述,联想对代工厂家比较严格,收购IBM的PC部门后更是如此,因此愿意为联想代工笔记本电脑的厂家不多,广达 是全球第一大笔记本电脑代工厂,联想和IBM的全部订单也不及惠普给广达下单量的1/6,广达自然不会太看重联想和IBM的订单。据了解,IBM的 T系列和X系列由广达代工。纬创客户单一,主要就是惠普、戴尔、宏基、IBM和联想。前三者2005年下单量估计都在100万台左右,IBM和联想下单量 大约为150万台,其中IBM 100万台。因此,纬创会比较看重和联想的关系。IBM的R系列和12英寸笔记本电脑由纬创代工,纬创最擅长12英寸笔记本电脑的代工。

  北大方正
   自然也是全线委托代工的厂家,PDA委托中环、显卡委托撼讯、主板委托精英,笔记本电脑早期委托蓝天,后来因为不满意蓝天的散热设计转投其他厂家。 2003年方正和蓝天、精英、纬创签订了一年15万台的笔记本电脑订单。目前方正的代工伙伴有广达、仁宝、神基和志和。方正的T6600M、A760和 3600系列由广达代工,方正颐和S2600和E800由志和打造,H320则由仁宝制造。

  清华紫光
   在1999年就开始委托我国台湾省厂家代工笔记本电脑了,最早的代工伙伴是伦飞和志和,当时伦飞相当强大,紫光自己都承认受了伦飞不少的刁难。随着紫光的 进一步发展和伦飞的进一步衰落,紫光也抛弃了伦飞,转投仁宝的怀抱。志和也是紫光的合作伙伴,紫光T150就是志和的作品。清华同方和北大方正都选择了广 达做代工伙伴,清华同方的V系列就是广达的作品。X系列则委托LG代工,而现在LG也出笔记本电脑,显然不可能再为同方代工。同方的F5600则是蓝天代 工的。同方目前的代工伙伴主要就是广达和蓝天。
      
     海尔
   不是刚开始进入笔记本电脑领域的,2002年海尔就推出了游龙系列笔记本电脑,虽然只卖了数千台,但是以当时的市场规模,仍然不算少。2002年年底,海 尔退出笔记本电脑领域,2004年3月又重回笔记本电脑领域。海尔与纬创、仁宝和大众签订了代工协议,三家试探性地各为海尔制造了一批笔记本电脑。并且找 来华硕华南负责人雷师凯充当电脑部主管,虽然后来此人离开,但是华硕一样成为海尔的代工合作伙伴,海尔的H12就是华硕代工。H230则由仁宝制造。精英 也为海尔代工笔记本电脑。纬创为海尔制造了H101,这是和戴尔700M一样的笔记本电脑。大众也为海尔代工,H270就是大众代工的。海尔有5个合作伙 伴,三星可能也是海尔的代工伙伴。

       TCL 
和海尔一样,TCL也在2002年进入笔记本电脑领域,但是TCL从未退出,一直坚持。在2002年12月,TCL和当时我国台湾省第三大笔记本电脑代工 厂家英业达签订了代工合同,委托英业达生产笔记本电脑,后来虽然双方关系解除,但是后来TCL的智能手机还是委托英业达子公司英华达代工。TCL找过很多 代工厂家,但是比较明智的是,TCL从未和那些超级笔记本电脑代工厂家合作,否则的话,成本会相当高。TCL第一款宽屏笔记本电脑委托神达生产,型号为 L9100,原型机为神达8060。后来TCL又找上大众,TCL的L9000就是大众的作品。再后是蓝天,TCL的L9200是蓝天代工的,使用的模具 是蓝天为同方代工的F5600。12英寸笔记本电脑还是纬创做得好,所以TCL的X200就找纬创做,也是和戴尔700M一样的笔记本电脑。TCL经典作 品K10使用的是志和的245Ⅱ准系统,自然就是委托志和生产的,和K10 一样使用245Ⅱ准系统的方正E800就没有那么幸运,一直是半温不火。TCL的T10则使用志和的223Ⅱ准系统,同样紫光的T510D也采用了这个准 系统。

      神舟
    志和自2003年2月开始为神舟出货,双方首度合作的产品涵盖高、中、低阶产品线; 神舟当时开始销售的"天运系列"全部由志和负责设计量产。志和2003年3~4月每月为神舟出货4000~5000台笔记本电脑。
天运系列最引人瞩目的是写下内地笔记本电脑市场新低价的"天运P170C系列",采用Celeron 1.7GHz微处理器、14.1英寸FT LCD面板、128MB内存和20GB硬盘,价格只要5980元。
虽然志和很不错,但是考虑到志和还有联想、方正、紫光这几个大客户,神舟很不快,神舟很快找了建基做合作伙伴,开发了型号为天运M150E的笔记本电脑, 用的是855GME的芯片组; CPU采用C-M 1.5G,硬盘40G,电池锂14.8V 4400mAHr,显卡采用ATi M10 9600 64M独立显卡。
虽然建基的准系统设计得很好,但是建基专注于电脑外设产品,算不上严格意义的笔记本电脑代工厂家,因此神舟又找了早年做笔记本非常出名的伦飞,依照伦飞的 N14PA模具和准系统设计了承龙A211C。

     夏新  
虽然夏新的手机很出名,但是夏新的笔记本电脑并不出名,和手机一样,夏新的笔记本电脑也是代工的,本来笔记本电脑就比手机的代工比例高很多。夏新的代工伙 伴是华宇,这家公司的子公司华冠是全球知名的手机代工大户,为索尼爱立信大量代工手机。夏新在2003年8月开始进军笔记本电脑市场,试验性地委托华宇生 产了很少一批笔记本电脑。2004年3月,夏新大规模下单华宇,下单量高达2万台。不过对于华宇来说这个下单一点儿也不大,华宇每月出货量大约为 10~12万台。

  长城
    也很有可能委托华宇代工笔记本电脑,其T2000与夏新V7 惊人相似,细心人发现,都来自华宇同一个原型机M620。T2000电池上华宇的"M620"标识还在,既然是长城自己产的,T2000上怎么会这么巧合 有个"M620"的标识呢?当然也许我们的判断是错误的。
 
   明基

早期的明基很风光,虽然出货量非常低,但是明基在显示器、手机、光驱三个领域都具备比较强的实力。明基的关联公司友达是我国台湾省第一大液晶面板厂家,明 基的品牌推广工作在我国台湾省IT企业里做得相当不错。所以当明基在2002年开始进军笔记本电脑领域时,广达、仁宝、纬创全球前三大笔记本电脑代工厂家 都同意接受明基的订单,尽管这些订单不到他们最小客户的10%的出货量。

在2003年形势发生了变化,明基的出货量远不能让这些超级代工大厂满意,同时考虑到竞争关系,宏基暗示这些代工大厂不再接受明基的订单,否则就拿不到宏 基的订单,因此前三大笔记本电脑代工厂都基本停止了和明基的合作。无奈之下,明基找到英业达,两者在当时成立了联盟,英业达为明基代工笔记本电脑,明基为 英业达提供液晶面板。英业达的客户结构相当简单,东芝和惠普各占50%,明基的出货量和这两个客户比起来差距较大。

即便是英业达,也算得上笔记本电脑代工一线大厂,水平并不次于广达、仁宝和纬创。而明基由于出货量太低,导致价格比较高。明基最大的优势在屏幕,拥有友达 这样的面板资源。2004年下半年开始,笔记本电脑市场已经呈现价格战态势。明基为应对价格战,找到了神基这样的代工伙伴。明基的低价笔记本电脑大部分都 是神基代工的。明基目前市场上常见的有35款产品,其中21款价格在10000元人民币以上,占60%,而明基的销售主力却是低价格的2100系列。 2100系列的性价比远比那21款10000元人民币以上的产品性价比高,消费者对其高端产品的认同还需要一些时日。



Acer

Acer在选择代工伙伴的时候非常明智,Acer选择的代工伙伴是全球前三大的笔记本电脑代工厂家,在这前三大的代工厂中,Acer的出货量至少排到第 三。这就是Acer的三三原则。所以Acer不可能分散代工订单,Acer的代工伙伴主要的就是广达、仁宝和纬创。Acer的笔记本电脑代工订单大约 35%在广达,30%在仁宝,30%在纬创,还有5%的非计划产品由英业达代工。

Acer的三三原则让Acer具备较高的性价比,尤其在中高端产品,性价比居于第一位置。4100/4600/3000系列就是最佳例子,这些都属于 SONOMA平台。Acer的SONOMA平台产品开发最早,而其他厂家则更关注Napa。Acer的SONOMA产品不仅推出早,性价比也是第一,同样 配置即便是神舟都无法与之对抗。但是SONOMA产品整体价格偏高,而中国内地市场还是低价机销量最大,因此Acer的整体销量很差,但是和去年比已经有 不少起色。而全球范围内,单论SONOMA平台的笔记本电脑,Acer销量仅次于戴尔,全球第二。

Acer对三大代工厂的定位也不相同,广达主要代工强调稳定性能的商务笔记本电脑,仁宝主要代工强调娱乐性能的宽屏笔记本电脑,纬创则代工其最擅长的12 英寸笔记本电脑和平板电脑。

Acer依靠三三原则也使自己的笔记本电脑事业迅速发展,Acer在欧洲市场、亚洲的马来西亚、泰国、印度尼西亚、大洋洲的澳大利亚都占据销量第一的位 置。在笔记本电脑最大的北美市场,Acer刚刚开始发力,成长空间非常大,预计2006年Acer的笔记本电脑销量将超过100万台。




索尼

索尼目前的产品分A/B/T/S/FS/Y六大系列,大约有一半在日本本土制造,一半在我国台湾省代工。T系列是10.6英寸屏幕,S系列是 13.3英寸屏幕,这两种屏幕采购来自东芝松下显示技术公司和日立显示公司,生产基地自然在日本。A系列是不计成本制作,自然在日本生产。索尼在挑选代工 伙伴的时候也很明智,索尼知道以自己的出货量,将订单分散出去的话,任何一家一线笔记本电脑代工大厂都不会很重视索尼这个大客户的。因此索尼只选择了两个 代工伙伴,分别是华硕和广达。

之所以选择华硕是因为华硕为索尼代工PS2游戏机,已经通过了索尼的质量体系验证。华硕为索尼代工的PS2出货量超过2千万部,双方合作关系密切。选择广 达的原因很简单,广达是全球最好的笔记本电脑代工厂家之一。

B系列是商务笔记本电脑,自然由广达代工比较好,基本上全球笔记本电脑大厂的商务系列笔记本电脑都是广达代工的。FS系列都是15.4英寸宽屏产品,由华 硕代工。Y系列是12英寸产品,由广达代工。




NEC
NEC曾经是日本第一大笔记本电脑厂家。NEC的笔记本电脑业务架构在2005年经历了比较大的变化。此前,NEC是将日本总部和海外市场分开的,海外市 场由NEC CI负责。两套结构,导致效率低下,市场占有率节节下滑,不过NEC已经做出改动。NEC总部将直接负责包括中国的东亚市场,NEC CI则只负责欧洲、中东和非洲市场。迫于价格压力,NEC也逐渐扩大代工比例,不过仍然低于50%。NEC CI的代工伙伴是大众、华宇、神基、广达。NEC日本总部的代工合作伙伴只有广达和仁宝。因为NEC总部主要的市场在日本。

NEC目前电脑业务改组工作尚在进行。笔者估计,一旦彻底改组完成,NEC日本总部控制中国市场,那么目前市面上NEC的低价位笔记本电脑恐怕要少些。

NEC CI的代工伙伴主要是大众和广达。大众早期是联想的代工伙伴,为配合联想,大众曾巨资打造中国生产基地。NEC看重大众的中国基地,与大众展开合作, 2003年代工出货量大约70万台。2004年大约90万台。不过广达是全球第一代工厂家,降价能力也是全球第一,2004年中期后,大众就基本退出 NEC CI的代工伙伴名单。华宇的子公司华冠是NEC手机的代工厂家。华宇还为NEC代工服务器和主板以及桌面PC,因此也获得了部分笔记本电脑代工订单,订单 数量相当少,都是计划外订单。神基与NEC在PDA领域早有合作,神基还是日本夏普笔记本电脑最大代工厂,因此神基在2005年成为NEC CI最主要的代工伙伴。不过NEC改组后,笔记本电脑的代工伙伴可能只有广达、仁宝。

在分析了国产厂商与代工厂商合作的情况以后,我们不妨看看国际品牌与代工厂商合作的情况。因为不论是谁,在这个高度分工的时代,都离不开与制造厂商的合 作。




富士通・西门子

富士通・西门子是笔记本电脑大厂中对外代工比例最低的,因为无论是西门子还是富士通,两个厂家都对代工持怀疑态度,除非迫不得已才代工。富士通・西门子对 外代工的思路与众不同,富士通・西门子认为自己的订单数量小,找广达这样的大厂不划算,得不到重视。至于小厂,富士西门子通认为可以培养成大厂。富士通・ 西门子就将一个小厂培养成一个大厂,那就是志合。

志合是我国台湾省惟一没有上市的笔记本电脑厂家。早期的志合致力于开拓德国渠道经销商所谓的白牌市场,陆续取得德国IT渠道商第一名Actebis 和第二名Gericom的订单。第一名Actebis的笔记本电脑品牌TARGA,也在2005年进入了中国。同样身处德国的西门子对志合的产品相当满 意,有意培养志合。同时全球第一大笔记本电脑零组件厂家鸿海持股志合16%的股份,成为志合的大股东,并且给与志合全面帮助。鸿海是全球笔记本电脑开模数 量第一、技术第一的厂家,同时拥有遍布全世界的生产基地。鸿海不仅帮志合开模,同时帮志合生产主板,甚至让出一部分SMT生产线让志合用。

志合在2003年得到富士通・西门子大约40万台笔记本电脑的订单,型号是AMILO L和AMILO D,2004年订单数量达到大约100万台,大部分是消费类宽屏笔记本电脑。2005年可能超过130万台。富士通・西门子也成为志合第一大客户,单论代 工笔记本电脑出货量,志合也从默默无闻的第十大一跃成为我国台湾省第五大笔记本电脑代工厂,超过华硕、神基、华宇、蓝天、微星、伦飞。




苹果

苹果几乎所有的产品都是外包的,包括台式机、iPod和笔记本电脑。最早在2000年苹果就开始外包生产台式机和笔记本电脑产品,最早委托的是我国台湾省 致胜公司。2001年年底,主板大厂精英花60亿元台币买下致胜公司中坜厂,苹果的订单随之变成精英的订单。2003年3月底,华硕以台币30亿元买下中 坜厂,苹果的订单随之成为华硕的订单。苹果也看到我国台湾省企业并购不断,有可能对自己的外包造成影响,因此在2003年的时候增加广达这个新的代工伙 伴。广达负责PowerBook系列笔记本电脑,华硕负责iBook系列笔记本电脑。今年4月,广达以低价格抢单华硕,将本来属于华硕的14英寸宽屏 iBook系列笔记本电脑50万台订单收入囊中,这使得华硕坐卧难安。本来华硕既有代工又有品牌,可以接的订单就很少,苹果的订单一向是十拿九稳的,都被 夺去,华硕不甘心。6月初,华硕负责代工业务的子公司威硕总经理郑定群率领公司高层专程到美国与苹果公司谈判,终于在6月中旬夺回了订单。代价就是更低的 价格,苹果则渔翁得利。




东芝

2004年年底之前,东芝拥有3个笔记本电脑生产基地,分别在日本青梅厂、杭州东芝和菲律宾东芝。2004年年底,东芝关闭了菲律宾工厂,原因是产能利用 率严重不足,亏损严重。2005年5月,东芝关闭青梅厂,青梅厂转为试验产品生产线,青梅厂以前以生产13英寸以下的笔记本电脑为主,目前这些产品将由杭 州厂生产。东芝的举动表明,如果杭州厂的竞争力不够,那么也会关闭,全部外包生产。

东芝预测2005年其笔记本电脑销量大约650万~700万台。目前杭州的基地年产能大约为300万台。东芝有大约有400万~450万台需要外包。东芝 最大的代工伙伴是仁宝,其次是英业达,最后是广达。仁宝最大的客户也就是东芝,东芝给仁宝的订单大约为250万~300万台之间,包括大部分商务机型、彩 色外壳的M50、A3等。英业达和东芝合作由来已久,但是英业达有下滑的趋势,因此东芝只是将少数消费类笔记本电脑订单交给英业达,如宽屏的 M30。总量大约在100万台左右。东芝给广达的订单是试探性的,只有1款15英寸笔记本电脑,总量大约为70万台。也许是东芝看到广达客户都是超级大厂 的原因,所以才下单这么少。此外,全球10大笔记本电脑厂家中,东芝是最后一个下单给广达的。




IBM

IBM的PC事业部被联想买了之后,基本上代工合作伙伴没有变。最早IBM笔记本电脑委托专业EMS大厂四海电子和LG电子制造,后来明显感到竞争力不如 我国台湾省,2003年停止和四海电子的合作,2004年停止和LG电子的合作。现在IBM笔记本电脑代工合作伙伴有3家,分别是纬创、广达和长城国际。 长城国际主要负责最后的组装。主板级生产都是纬创和广达来完成。

IBM第一大代工伙伴是纬创,2005年IBM给纬创的订单大约在150万~180万台之间,给广达的订单大约有100万台。这和联想没有入主之前没有什 么变化。纬创2005年预计笔记本电脑出货量大约为500万台,IBM也是纬创的第一大客户。纬创前身是宏基的系统整机制造部门,后独立成为纬创,具备稳 定的质量控制体系,微软的XBOX本来委托全球第一大EMS厂伟创力和纬创生产,后来发现纬创品质更优秀,基本上全部转给纬创生产。纬创为IBM生产R、 X系列整机和T系列的主板。R系列生产集中在昆山。早先的R系列是由LG电子代工的。X、T系列则在我国台湾省本土生产。

广达最擅长的是商务笔记本电脑的生产,IBM的商用系列主要是T系列。IBM把一部分T系列的主板委托纬创制造,然后由长城国际组装。另外一部分T系列则 委托广达生产。

随着纬创昆山基地产能的进一步加大,将来长城国际很可能没有订单。




惠普

惠普主要的代工伙伴有4家,分别是纬创、仁宝、广达和英业达。惠普的代工策略不同其他厂家。惠普将同一市场区分2款产品线给2家供应商,哪家厂商价格便 宜,便让其生产较大量订单,至于现有机种即便已到产品生命周期终点,只要厂商能够继续提供更具竞争力的价格和改款,依然可以继续出货,因此,惠普的下单数 量是不固定的。谁的设计能力强,谁就是赢家。

广达和仁宝是惠普的主要代工伙伴。2005年广达负责低价位消费类笔记本电脑,这是比较少见的,通常广达都是生产商务笔记本电脑。实际惠普的消费类笔记本 电脑通常是仁宝的,但是广达以低价抢单,不过后来仁宝也低价抢单,把属于广达的商务笔记本电脑订单抢了回来。目前广达手头有惠普绝大部分消费类笔记本电脑 如 Presario 2100, Pavilion ze 40000, ze 50000, Pavilion ze 70000订单,同时还有15英寸商务笔记本电脑Taos的订单。

纬创是公认的12英寸笔记本电脑王者,惠普的12英寸笔记本电脑自然委托纬创生产,同时惠普刻意扶植纬创来制衡广达和仁宝。惠普给纬创的订单比2004年 多了5倍。英业达则主要负责生产特殊机种,如14英寸宽屏笔记本电脑。



戴尔

戴尔是全球第一大笔记本电脑厂家,其笔记本电脑全部外包生产,代工伙伴有3家,就是全球前3大广达、仁宝和纬创。

在代工策略上,戴尔是最难捉摸的。广达一直掌握着戴尔公司主流商用笔记本电脑的订单,而仁宝则一直负责戴尔低价消费性及高单价笔记本电脑产品线。 2005年4月前后,戴尔通过左右手互换,将广达及仁宝双方与自身的合作关系完全作了交换。即仁宝取得了戴尔2006年商用笔记本订单,而广达则获得低、 高价消费性笔记本订单。本来广达认为消费性笔记本电脑不可能由自己代工,但是为了压低仁宝的报价,当戴尔询价时自然报出超低价格,同样仁宝也是如此,认为 自己不可能代工主流商用笔记本电脑,但是为了压低广达的利润,报出低价。没想到戴尔竟然放弃惯例,左右互换,致使两家自食其果,而戴尔则从中渔翁得利。

2009-02-12

一般IIS运行不了ASP.NET,试一下下面四种方法,99%有效:  

一般IIS运行不了ASP.NET,试一下下面四种方法,99%有效:  

  1。.NET 安装的顺序应该是先装IIS,再装VS.NET,如果次序反了,或者IIS重
装了,就需要使用aspnet_regiis.exe -i来重新安装IIS Mapping(主要用于aspx,
asmx等文件的Extention的匹配)。在C:\WINDOWS\Microsoft.NET\Framework\
v1.0.3705目录下,运行下面的命令:aspnet_regiis.exe -i

2。重设ASPNET的密码,然后在下面的目录中找到Machine.config文件:%
Systemroot%\Microsoft.NET\ Framework\v1.0.3705\CONFIG(Systemroot是你的
安装目录),在标识中添加/修改:userName和 password3。如果还不行,重装
IIS,然后再按照方法1进行操作4。如果你的机器是域控制器,你可以参考
Q315158:ASP.NET Does Not Work withASPNET Account on Domain 
Controller:http://support.microsoft.com/default.aspx?scid=KB;EN-
US;Q315158&和你大致讲一下操作的步骤:  

  1)在Administrative Tools->Active Directory Users and Computers中建
立一个名为ASPUSER的用户,将该用户添加到用户组中(默认情况下已在User
Group中)  

  2)在Administrative Tools->Local Security Settings->Local
Policy->UserRight Assignment中,双击右栏的Log on as a batch job项,在弹出
的窗口中点击Add,选择或输入刚才建立的ASPUSER帐号,确定。(需要重启机器)  

  3)确保ASPUSER帐号有相应文件、目录的访问权限4。在下面的目录中找到
Machine.config文件:%Systemroot%\
Microsoft.NET\Framework\v1.0.3705\CONFIG (Systemroot是你的安装目录),
在标识中添加/修改:  

  userName="DomainName\ASPUSER" password="ASPUSERpassword" 其中
ASPUSERpassword是刚刚建立的ASPUSER的密码,DomainName是你的域名   

  最后把机器RESET一下!看看!应该OK了!

Win2003安装IIS时,提示无法复制convlog.exe、iisadmin.mfl等文件的解决方法

Win2003安装IIS时,提示无法复制convlog.exe、iisadmin.mfl等文件的解决方法
2008年10月08日 星期三 14:13
IIS出了点问题,就重新安装。我的系统盘不是SP2的,系统是后来升级到SP2的,
于是在安装IIS时如果老提示无法复制convlog.exe、 iisadmin.mfl等文件。在网
上搜一堆,说是因为损坏了系统内部数据库所致.修复损坏的数据文件即可正常安装。
解决方法如下(开始 > 运行 > 输入 CMD >再输入以下命令):
1、esentutl /g %windir%/security/database/secedit.sdb (该命令参数用于查
询secedit.sdb文件是否被损坏)
2、esentutl /p %windir%/security/database/secedit.sdb (修复secedit.sdb文件)
这样convlog.exe是可以安装了,但到了iisadmin.mfl无法找到。点浏览 >
C:\WINDOWS\ServicePackFiles\i386 ,导航到这个文件夹下,再点确定,就可以
安装了

2009-02-10

MRTG配置笔记

mrtg官方网站:http://oss.oetiker.ch/mrtg/index.en.html

http://www.sunfreeware.com/下载for solaris9 sprac的版本,直接pkgadd进
行安装。
mrtg同时需要libgcc、perl、apache、net-snmp等软件支持。

【mrtg安装配置步骤】
1、安装mrtg
pkgadd -d mrtg-2.16.2-sol9-sparc-local

2、建立mrtg工作目录
mkdir /export/home/gdau/mrtg_test

3、配置apache的httpd.conf
vi /etc/apache/httpd.conf,增加:
-------------------------------------------------------------------
Alias /cmnet/ "/export/home/gdau/mrtg_test/"
<Directory "/export/home/gdau/mrtg">
Options Indexes FollowSymlinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
-------------------------------------------------------------------

4、启动apache
/etc/init.d/apache start、stop、restart

5、生成mrtg.cfg文件
perl /usr/local/mrtg-2/bin/cfgmaker --global "WorkDir:
/export/home/gdau/mrtg_test/221.130.208.50__GXNN-BC-SXNET-RT01-NE80E"
--global "options[_]: growright,bits" --ifdesc=alias
--snmp-options=:::::2 ChinaMobile_Manager_Read@221.130.208.50 --output
/export/home/gdau/mrtg_test/221.130.208.50__GXNN-BC-SXNET-RT01-NE80E/mrtg.cfg


6、进行采集
perl /usr/local/mrtg-2/bin/mrtg
/export/home/gdau/mrtg_test/221.130.208.50__GXNN-BC-SXNET-RT01-NE80E/mrtg.cfg

首次运行会报错,运行三次以上便可以消除错误。

7、生成网页首页文件
perl /usr/local/mrtg-2/bin/indexmaker
--output=/export/home/gdau/mrtg_test/221.130.208.50__GXNN-BC-SXNET-RT01-NE80E/index.html
--title=CMNET
/export/home/gdau/mrtg_test/221.130.208.50__GXNN-BC-SXNET-RT01-NE80E/mrtg.cfg

8、将采集命令放置crontab,最小粒度为5分钟运行。

以下为:自动生成mrtg.cfg配置文件和自动采集shell脚本
-------------------------------------------------------------------
cmnet_flow_mrtg_cfg.sh
-------------------------------------------------------------------
#!/bin/bash

declare -a ip=(218.204.25.245 218.204.25.237 218.204.25.246
211.138.253.254 218.204.25.240 218.204.25.241 211.138.253.249
218.204.25.238 218.204.25.239 218.204.25.254 218.204.26.254
218.204.25.253 218.204.32.254 218.204.25.252 218.204.38.254
218.204.38.226 218.204.25.251 218.204.44.254 218.204.25.250
218.204.50.254 218.204.25.249 218.204.56.254 218.204.25.248 218.204.60.254 )
declare -a host=(GXNN-PB-CMNET-RT01-NEW-RE0 GXNN-PB-CMNET-RT02
OLD-PB-CMNET-RT02 GXNN-PA-CMNET-RT01 GXNN-PA-CMNET-RT04
GXNN-PA-CMNET-RT05 GXNN-PA-CMNET-RT06 GXNN-PA-CMNET-RT07
GXNN-PA-CMNET-RT08 GXLZ-PB-CMNET-RT01 GXLZ-PB-CMNET-RT02.gx.cnmobile.net
GXGL-PB-CMNET-RT01 GXGL-PB-CMNET-RT02 GXYL-PB-CMNET-RT01
GXYL-PB-CMNET-RT02.gx.cnmobile.net GXYL-PA-CMNET-SW01 GXWZ-PB-CMNET-RT01
GXWZ-PB-CMNET-RT02.gx.cnmobile.net GXBH-PB-CMNET-RT01
GXBH-PB-CMNET-RT02.gx.cnmobile.net GXHC-PB-CMNET-RT01
GXHC-PB-CMNET-RT02.gx.cnmobile.net GXBS-PB-CMNET-RT01 GXBS-PB-CMNET-RT02)
declare -a snmp_c=(GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008
GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008
GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008
GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008
GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008
GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008
GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008
GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008)

ip_count=23
host_count=23
snmp_c_count=23
i=0

#生成html前半部
mkdir -p /export/home/gdau/mrtg_test
cd /export/home/gdau/mrtg_test

while [ $i -le $ip_count ]
do
mkdir -p /export/home/gdau/mrtg_test/${ip[$i]}__${host[$i]}
workdir="/export/home/gdau/mrtg_test/${ip[$i]}__${host[$i]}"
output="/export/home/gdau/mrtg_test/${ip[$i]}__${host[$i]}/mrtg.cfg"
snmphost="${snmp_c[$i]}@${ip[$i]}"
perl /usr/local/mrtg-2/bin/cfgmaker --global "WorkDir: $workdir"
--output $output --global "options[_]: growright,bits" --ifdesc=alias
--snmp-options=:::::2 $snmphost

i=$(( $i+1 ))
done

#invoke gather_mrtg_data java program
cd /export/home/gdau/task/gather_mrtg_data
./run_gather_cfg.sh
-------------------------------------------------------------------


-------------------------------------------------------------------
cmnet_flow_mrtg.sh
-------------------------------------------------------------------
#!/bin/bash

declare -a ip=(218.204.25.245 218.204.25.237 218.204.25.246
211.138.253.254 218.204.25.240 218.204.25.241 211.138.253.249
218.204.25.238 218.204.25.239 218.204.25.254 218.204.26.254
218.204.25.253 218.204.32.254 218.204.25.252 218.204.38.254
218.204.38.226 218.204.25.251 218.204.44.254 218.204.25.250
218.204.50.254 218.204.25.249 218.204.56.254 218.204.25.248 218.204.60.254 )
declare -a host=(GXNN-PB-CMNET-RT01-NEW-RE0 GXNN-PB-CMNET-RT02
OLD-PB-CMNET-RT02 GXNN-PA-CMNET-RT01 GXNN-PA-CMNET-RT04
GXNN-PA-CMNET-RT05 GXNN-PA-CMNET-RT06 GXNN-PA-CMNET-RT07
GXNN-PA-CMNET-RT08 GXLZ-PB-CMNET-RT01 GXLZ-PB-CMNET-RT02.gx.cnmobile.net
GXGL-PB-CMNET-RT01 GXGL-PB-CMNET-RT02 GXYL-PB-CMNET-RT01
GXYL-PB-CMNET-RT02.gx.cnmobile.net GXYL-PA-CMNET-SW01 GXWZ-PB-CMNET-RT01
GXWZ-PB-CMNET-RT02.gx.cnmobile.net GXBH-PB-CMNET-RT01
GXBH-PB-CMNET-RT02.gx.cnmobile.net GXHC-PB-CMNET-RT01
GXHC-PB-CMNET-RT02.gx.cnmobile.net GXBS-PB-CMNET-RT01 GXBS-PB-CMNET-RT02)
declare -a snmp_c=(GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008
GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008
GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008
GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008
GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008
GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008
GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008
GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008)

ip_count=23
host_count=23
snmp_c_count=23
i=0

#生成html前半部
mkdir -p /export/home/gdau/mrtg_test
cd /export/home/gdau/mrtg_test

#echo "<HTML>" > /export/home/gdau/mrtg_test/index.html
#echo "<HEAD>" >> /export/home/gdau/mrtg_test/index.html
#echo " <TITLE>CMNET</TITLE>" >> /export/home/gdau/mrtg_test/index.html
#echo " <meta http-equiv=\"content-type\" content=\"text/html;
charset=iso-8859-15\" >" >> /export/home/gdau/mrtg_test/index.html
#echo " <META NAME=\"Command-Line\"
CONTENT=\"/usr/local/mrtg-2/bin/indexmaker
--output=/export/home/gdau/mrtg_test/221.130.208.50__GXNN-BC-SXNET-RT01-NE80E/index.html
--title=CMNET
/export/home/gdau/mrtg_test/221.130.208.50__GXNN-BC-SXNET-RT01-NE80E/mrtg.cfg\"
>" >> /export/home/gdau/mrtg_test/index.html
#echo " <META HTTP-EQUIV=\"Refresh\" CONTENT=\"300\" >" >>
/export/home/gdau/mrtg_test/index.html
#echo " <META HTTP-EQUIV=\"Cache-Control\" content=\"no-cache\" >" >>
/export/home/gdau/mrtg_test/index.html
#echo " <META HTTP-EQUIV=\"Pragma\" CONTENT=\"no-cache\" >" >>
/export/home/gdau/mrtg_test/index.html
#echo " <META HTTP-EQUIV=\"Expires\" CONTENT=\"Thu, 22 Jan 2009 05:57:01
GMT\" >" >> /export/home/gdau/mrtg_test/index.html
#echo " <LINK HREF=\"favicon.ico\" rel=\"shortcut icon\" > " >>
/export/home/gdau/mrtg_test/index.html
#echo "<style type=\"text/css\">" >> /export/home/gdau/mrtg_test/index.html
#echo "/* commandline was: /usr/local/mrtg-2/bin/indexmaker
--output=/export/home/gdau/mrtg_test/221.130.208.50__GXNN-BC-SXNET-RT01-NE80E/index.html
--title=CMNET
/export/home/gdau/mrtg_test/221.130.208.50__GXNN-BC-SXNET-RT01-NE80E/mrtg.cfg
*/" >> /export/home/gdau/mrtg_test/index.html
#echo "/* sorry, no style, just abusing this to place the commandline
and pass validation */" >> /export/home/gdau/mrtg_test/index.html
#echo "</style>" >> /export/home/gdau/mrtg_test/index.html
#echo "</HEAD>" >> /export/home/gdau/mrtg_test/index.html
#echo "<BODY bgcolor=\"#ffffff\" text=\"#000000\" link=\"#000000\"
vlink=\"#000000\" alink=\"#000000\">" >>
/export/home/gdau/mrtg_test/index.html
#echo "<H1>CMNET</H1>" >> /export/home/gdau/mrtg_test/index.html
#echo "<TABLE BORDER=0 CELLPADDING=0 CELLSPACING=10>" >>
/export/home/gdau/mrtg_test/index.html
#echo "<tr>" >> /export/home/gdau/mrtg_test/index.html
#echo "<td>" >> /export/home/gdau/mrtg_test/index.html


while [ $i -le $ip_count ]
do
mkdir -p /export/home/gdau/mrtg_test/${ip[$i]}__${host[$i]}
workdir="/export/home/gdau/mrtg_test/${ip[$i]}__${host[$i]}"
output="/export/home/gdau/mrtg_test/${ip[$i]}__${host[$i]}/mrtg.cfg"
snmphost="${snmp_c[$i]}@${ip[$i]}"
#perl /usr/local/mrtg-2/bin/cfgmaker --global "WorkDir: $workdir"
--output $output --global "options[_]: growright,bits" --ifref=ip
--ifdesc=alias --snmp-options=::1:1::2 $snmphost
perl /usr/local/mrtg-2/bin/mrtg $output
index="$workdir/index.html"
perl /usr/local/mrtg-2/bin/indexmaker --output=$index --title=CMNET $output

# #生成html中部
# echo "<DIV><B><A
HREF="./${ip[$i]}__${host[$i]}/index.html">${host[$i]}</A></B><BR></DIV>"
>> /export/home/gdau/mrtg_test/index.html
# echo "<br>" >> /export/home/gdau/mrtg_test/index.html

i=$(( $i+1 ))
done

#生成html后半部
#echo "</td>" >> /export/home/gdau/mrtg_test/index.html
#echo "</tr>" >> /export/home/gdau/mrtg_test/index.html
#echo "</TABLE>" >> /export/home/gdau/mrtg_test/index.html
#
#echo "<BR>" >> /export/home/gdau/mrtg_test/index.html
#echo "<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0>" >>
/export/home/gdau/mrtg_test/index.html
#echo " <TR>" >> /export/home/gdau/mrtg_test/index.html
#echo " <TD WIDTH=63><A" >> /export/home/gdau/mrtg_test/index.html
#echo " HREF=\"http://oss.oetiker.ch/mrtg/\"><IMG" >>
/export/home/gdau/mrtg_test/index.html
#echo " BORDER=0 SRC=\"mrtg-l.png\" WIDTH=63 HEIGHT=25
ALT=\"MRTG\"></A></TD>" >> /export/home/gdau/mrtg_test/index.html
#echo " <TD WIDTH=25><A" >> /export/home/gdau/mrtg_test/index.html
#echo " HREF=\"http://oss.oetiker.ch/mrtg/\"><IMG" >>
/export/home/gdau/mrtg_test/index.html
#echo " BORDER=0 SRC=\"mrtg-m.png\" WIDTH=25 HEIGHT=25
ALT=\"\"></A></TD>" >> /export/home/gdau/mrtg_test/index.html
#echo " <TD WIDTH=388><A" >> /export/home/gdau/mrtg_test/index.html
#echo " HREF=\"http://oss.oetiker.ch/mrtg/\"><IMG" >>
/export/home/gdau/mrtg_test/index.html
#echo " BORDER=0 SRC=\"mrtg-r.png\" WIDTH=388 HEIGHT=25" >>
/export/home/gdau/mrtg_test/index.html
#echo " ALT=\"Multi Router Traffic Grapher\"></A></TD>" >>
/export/home/gdau/mrtg_test/index.html
#echo " </TR>" >> /export/home/gdau/mrtg_test/index.html
#echo "</TABLE>" >> /export/home/gdau/mrtg_test/index.html
#echo "<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0>" >>
/export/home/gdau/mrtg_test/index.html
#echo " <TR VALIGN=top>" >> /export/home/gdau/mrtg_test/index.html
#echo " <TD WIDTH=88 ALIGN=RIGHT><FONT FACE=\"Arial,Helvetica\" SIZE=2>"
>> /export/home/gdau/mrtg_test/index.html
#echo " version 2.16.2</FONT></TD>" >>
/export/home/gdau/mrtg_test/index.html
#echo " <TD WIDTH=388 ALIGN=RIGHT><FONT FACE=\"Arial,Helvetica\"
SIZE=2>" >> /export/home/gdau/mrtg_test/index.html
#echo " <A HREF=\"http://tobi.oetiker.ch/\">Tobias Oetiker</A>" >>
/export/home/gdau/mrtg_test/index.html
#echo " <A
HREF=\"mailto:tobi+mrtglink@oetiker.ch\">&lt;tobi@oetiker.ch&gt;</A>" >>
/export/home/gdau/mrtg_test/index.html
#echo " and&nbsp;<A
HREF=\"http://www.bungi.com/\">Dave&nbsp;Rand</A>&nbsp;<A
HREF=\"mailto:dlr@bungi.com\">&lt;dlr@bungi.com&gt;</A></FONT>" >>
/export/home/gdau/mrtg_test/index.html
#echo " </TD>" >> /export/home/gdau/mrtg_test/index.html
#echo "</TR>" >> /export/home/gdau/mrtg_test/index.html
#echo "</TABLE>" >> /export/home/gdau/mrtg_test/index.html
#echo "</BODY>" >> /export/home/gdau/mrtg_test/index.html
#echo "</HTML>" >> /export/home/gdau/mrtg_test/index.html

#invoke gather_mrtg_data java program
cd /export/home/gdau/task/gather_mrtg_data
./run_gather_data.sh
-------------------------------------------------------------------

-------------------------------------------------------------------
crontab文件
-------------------------------------------------------------------
0,5,10,15,20,25,30,35,40,45,50,55 * * * *
/export/home/gdau/task/cmnet_flow_mrtg.sh
#3 0,1,2 * * * /export/home/gdau/task/cmnet_flow_mrtg_cfg.sh
-------------------------------------------------------------------


【存在问题】
1、mrtg对大流量端口不支持。mrtg默认针对ifTable进行采集,采集的ifIn和
ifOut都为32位。但是针对高速端口,流速很大,32位的Counter很容易溢出。必须
要配置snmp V2版本支持才行。原理是使用ifXTable中的ifHCIn和ifHCOut来采集。
在生成mrtg.cfg文件时,增加:--snmp-options=:::::2选项
由于mrtg(版本:2.16.2)本身存在bug,需要修改cfgmaker脚本的907行。将:
if(not $speed or $counter eq "" or $counter =~ /\D/ or
$SNMP_Session::errmsg or $Net_SNMP_util::ErrorMessage){
修改为:
if(not $speed or $counter eq "" or $counter !~ /\d/ or
$SNMP_Session::errmsg or $Net_SNMP_util::ErrorMessage){
目的是禁止在mrtg.cfg文件中生成noHC:yes的选项。

2、对华为的设备,不支持采集ifAlias。
修改cfgmaker文件,修改:173行。将:
if ($routers->{$router}{deviceinfo}{Vendor} eq 'cisco' &&
$routers->{$router}{deviceinfo}{sysDescr} =~ m/Version\s+(\d+\.\d+)/) {
push @Variables, ($1 > 11.0 or $1 < 10.0 ) ? "ifAlias" : "CiscolocIfDescr";
if ($1 > 11.2) {push @Variables, "vmVlan";};
if ($1 > 11.3) {push @Variables, "vlanTrunkPortDynamicStatus";};
} elsif ( $routers->{$router}{deviceinfo}{Vendor} =~
/(?:hp|juniper|foundry|dellLan|force10|3com|extremenetworks)/) {
push @Variables, "ifAlias";
}
修改为:
if ($routers->{$router}{deviceinfo}{Vendor} eq 'cisco' &&
$routers->{$router}{deviceinfo}{sysDescr} =~ m/Version\s+(\d+\.\d+)/) {
push @Variables, ($1 > 11.0 or $1 < 10.0 ) ? "ifAlias" : "CiscolocIfDescr";
if ($1 > 11.2) {push @Variables, "vmVlan";};
if ($1 > 11.3) {push @Variables, "vlanTrunkPortDynamicStatus";};
} elsif ( $routers->{$router}{deviceinfo}{Vendor} =~
/(?:hp|juniper|foundry|dellLan|force10|3com|extremenetworks)/) {
push @Variables, "ifAlias";
} else {
push @Variables, "ifAlias";
}

MRTG配置笔记

mrtg官方网站:http://oss.oetiker.ch/mrtg/index.en.html

http://www.sunfreeware.com/下载for solaris9 sprac的版本,直接pkgadd进
行安装。
mrtg同时需要libgcc、perl、apache、net-snmp等软件支持。

【mrtg安装配置步骤】
1、安装mrtg
pkgadd -d mrtg-2.16.2-sol9-sparc-local

2、建立mrtg工作目录
mkdir /export/home/gdau/mrtg_test

3、配置apache的httpd.conf
vi /etc/apache/httpd.conf,增加:
-------------------------------------------------------------------
Alias /cmnet/ "/export/home/gdau/mrtg_test/"
<Directory "/export/home/gdau/mrtg">
Options Indexes FollowSymlinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
-------------------------------------------------------------------

4、启动apache
/etc/init.d/apache start、stop、restart

5、生成mrtg.cfg文件
perl /usr/local/mrtg-2/bin/cfgmaker --global "WorkDir:
/export/home/gdau/mrtg_test/221.130.208.50__GXNN-BC-SXNET-RT01-NE80E"
--global "options[_]: growright,bits" --ifdesc=alias
--snmp-options=:::::2 ChinaMobile_Manager_Read@221.130.208.50 --output
/export/home/gdau/mrtg_test/221.130.208.50__GXNN-BC-SXNET-RT01-NE80E/mrtg.cfg


6、进行采集
perl /usr/local/mrtg-2/bin/mrtg
/export/home/gdau/mrtg_test/221.130.208.50__GXNN-BC-SXNET-RT01-NE80E/mrtg.cfg

首次运行会报错,运行三次以上便可以消除错误。

7、生成网页首页文件
perl /usr/local/mrtg-2/bin/indexmaker
--output=/export/home/gdau/mrtg_test/221.130.208.50__GXNN-BC-SXNET-RT01-NE80E/index.html
--title=CMNET
/export/home/gdau/mrtg_test/221.130.208.50__GXNN-BC-SXNET-RT01-NE80E/mrtg.cfg

8、将采集命令放置crontab,最小粒度为5分钟运行。

以下为:自动生成mrtg.cfg配置文件和自动采集shell脚本
-------------------------------------------------------------------
cmnet_flow_mrtg_cfg.sh
-------------------------------------------------------------------
#!/bin/bash

declare -a ip=(218.204.25.245 218.204.25.237 218.204.25.246
211.138.253.254 218.204.25.240 218.204.25.241 211.138.253.249
218.204.25.238 218.204.25.239 218.204.25.254 218.204.26.254
218.204.25.253 218.204.32.254 218.204.25.252 218.204.38.254
218.204.38.226 218.204.25.251 218.204.44.254 218.204.25.250
218.204.50.254 218.204.25.249 218.204.56.254 218.204.25.248 218.204.60.254 )
declare -a host=(GXNN-PB-CMNET-RT01-NEW-RE0 GXNN-PB-CMNET-RT02
OLD-PB-CMNET-RT02 GXNN-PA-CMNET-RT01 GXNN-PA-CMNET-RT04
GXNN-PA-CMNET-RT05 GXNN-PA-CMNET-RT06 GXNN-PA-CMNET-RT07
GXNN-PA-CMNET-RT08 GXLZ-PB-CMNET-RT01 GXLZ-PB-CMNET-RT02.gx.cnmobile.net
GXGL-PB-CMNET-RT01 GXGL-PB-CMNET-RT02 GXYL-PB-CMNET-RT01
GXYL-PB-CMNET-RT02.gx.cnmobile.net GXYL-PA-CMNET-SW01 GXWZ-PB-CMNET-RT01
GXWZ-PB-CMNET-RT02.gx.cnmobile.net GXBH-PB-CMNET-RT01
GXBH-PB-CMNET-RT02.gx.cnmobile.net GXHC-PB-CMNET-RT01
GXHC-PB-CMNET-RT02.gx.cnmobile.net GXBS-PB-CMNET-RT01 GXBS-PB-CMNET-RT02)
declare -a snmp_c=(GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008
GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008
GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008
GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008
GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008
GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008
GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008
GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008)

ip_count=23
host_count=23
snmp_c_count=23
i=0

#生成html前半部
mkdir -p /export/home/gdau/mrtg_test
cd /export/home/gdau/mrtg_test

while [ $i -le $ip_count ]
do
mkdir -p /export/home/gdau/mrtg_test/${ip[$i]}__${host[$i]}
workdir="/export/home/gdau/mrtg_test/${ip[$i]}__${host[$i]}"
output="/export/home/gdau/mrtg_test/${ip[$i]}__${host[$i]}/mrtg.cfg"
snmphost="${snmp_c[$i]}@${ip[$i]}"
perl /usr/local/mrtg-2/bin/cfgmaker --global "WorkDir: $workdir"
--output $output --global "options[_]: growright,bits" --ifdesc=alias
--snmp-options=:::::2 $snmphost

i=$(( $i+1 ))
done

#invoke gather_mrtg_data java program
cd /export/home/gdau/task/gather_mrtg_data
./run_gather_cfg.sh
-------------------------------------------------------------------


-------------------------------------------------------------------
cmnet_flow_mrtg.sh
-------------------------------------------------------------------
#!/bin/bash

declare -a ip=(218.204.25.245 218.204.25.237 218.204.25.246
211.138.253.254 218.204.25.240 218.204.25.241 211.138.253.249
218.204.25.238 218.204.25.239 218.204.25.254 218.204.26.254
218.204.25.253 218.204.32.254 218.204.25.252 218.204.38.254
218.204.38.226 218.204.25.251 218.204.44.254 218.204.25.250
218.204.50.254 218.204.25.249 218.204.56.254 218.204.25.248 218.204.60.254 )
declare -a host=(GXNN-PB-CMNET-RT01-NEW-RE0 GXNN-PB-CMNET-RT02
OLD-PB-CMNET-RT02 GXNN-PA-CMNET-RT01 GXNN-PA-CMNET-RT04
GXNN-PA-CMNET-RT05 GXNN-PA-CMNET-RT06 GXNN-PA-CMNET-RT07
GXNN-PA-CMNET-RT08 GXLZ-PB-CMNET-RT01 GXLZ-PB-CMNET-RT02.gx.cnmobile.net
GXGL-PB-CMNET-RT01 GXGL-PB-CMNET-RT02 GXYL-PB-CMNET-RT01
GXYL-PB-CMNET-RT02.gx.cnmobile.net GXYL-PA-CMNET-SW01 GXWZ-PB-CMNET-RT01
GXWZ-PB-CMNET-RT02.gx.cnmobile.net GXBH-PB-CMNET-RT01
GXBH-PB-CMNET-RT02.gx.cnmobile.net GXHC-PB-CMNET-RT01
GXHC-PB-CMNET-RT02.gx.cnmobile.net GXBS-PB-CMNET-RT01 GXBS-PB-CMNET-RT02)
declare -a snmp_c=(GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008
GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008
GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008
GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008
GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008
GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008
GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008
GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008 GXMCC_cmnet_nm2008)

ip_count=23
host_count=23
snmp_c_count=23
i=0

#生成html前半部
mkdir -p /export/home/gdau/mrtg_test
cd /export/home/gdau/mrtg_test

#echo "<HTML>" > /export/home/gdau/mrtg_test/index.html
#echo "<HEAD>" >> /export/home/gdau/mrtg_test/index.html
#echo " <TITLE>CMNET</TITLE>" >> /export/home/gdau/mrtg_test/index.html
#echo " <meta http-equiv=\"content-type\" content=\"text/html;
charset=iso-8859-15\" >" >> /export/home/gdau/mrtg_test/index.html
#echo " <META NAME=\"Command-Line\"
CONTENT=\"/usr/local/mrtg-2/bin/indexmaker
--output=/export/home/gdau/mrtg_test/221.130.208.50__GXNN-BC-SXNET-RT01-NE80E/index.html
--title=CMNET
/export/home/gdau/mrtg_test/221.130.208.50__GXNN-BC-SXNET-RT01-NE80E/mrtg.cfg\"
>" >> /export/home/gdau/mrtg_test/index.html
#echo " <META HTTP-EQUIV=\"Refresh\" CONTENT=\"300\" >" >>
/export/home/gdau/mrtg_test/index.html
#echo " <META HTTP-EQUIV=\"Cache-Control\" content=\"no-cache\" >" >>
/export/home/gdau/mrtg_test/index.html
#echo " <META HTTP-EQUIV=\"Pragma\" CONTENT=\"no-cache\" >" >>
/export/home/gdau/mrtg_test/index.html
#echo " <META HTTP-EQUIV=\"Expires\" CONTENT=\"Thu, 22 Jan 2009 05:57:01
GMT\" >" >> /export/home/gdau/mrtg_test/index.html
#echo " <LINK HREF=\"favicon.ico\" rel=\"shortcut icon\" > " >>
/export/home/gdau/mrtg_test/index.html
#echo "<style type=\"text/css\">" >> /export/home/gdau/mrtg_test/index.html
#echo "/* commandline was: /usr/local/mrtg-2/bin/indexmaker
--output=/export/home/gdau/mrtg_test/221.130.208.50__GXNN-BC-SXNET-RT01-NE80E/index.html
--title=CMNET
/export/home/gdau/mrtg_test/221.130.208.50__GXNN-BC-SXNET-RT01-NE80E/mrtg.cfg
*/" >> /export/home/gdau/mrtg_test/index.html
#echo "/* sorry, no style, just abusing this to place the commandline
and pass validation */" >> /export/home/gdau/mrtg_test/index.html
#echo "</style>" >> /export/home/gdau/mrtg_test/index.html
#echo "</HEAD>" >> /export/home/gdau/mrtg_test/index.html
#echo "<BODY bgcolor=\"#ffffff\" text=\"#000000\" link=\"#000000\"
vlink=\"#000000\" alink=\"#000000\">" >>
/export/home/gdau/mrtg_test/index.html
#echo "<H1>CMNET</H1>" >> /export/home/gdau/mrtg_test/index.html
#echo "<TABLE BORDER=0 CELLPADDING=0 CELLSPACING=10>" >>
/export/home/gdau/mrtg_test/index.html
#echo "<tr>" >> /export/home/gdau/mrtg_test/index.html
#echo "<td>" >> /export/home/gdau/mrtg_test/index.html


while [ $i -le $ip_count ]
do
mkdir -p /export/home/gdau/mrtg_test/${ip[$i]}__${host[$i]}
workdir="/export/home/gdau/mrtg_test/${ip[$i]}__${host[$i]}"
output="/export/home/gdau/mrtg_test/${ip[$i]}__${host[$i]}/mrtg.cfg"
snmphost="${snmp_c[$i]}@${ip[$i]}"
#perl /usr/local/mrtg-2/bin/cfgmaker --global "WorkDir: $workdir"
--output $output --global "options[_]: growright,bits" --ifref=ip
--ifdesc=alias --snmp-options=::1:1::2 $snmphost
perl /usr/local/mrtg-2/bin/mrtg $output
index="$workdir/index.html"
perl /usr/local/mrtg-2/bin/indexmaker --output=$index --title=CMNET $output

# #生成html中部
# echo "<DIV><B><A
HREF="./${ip[$i]}__${host[$i]}/index.html">${host[$i]}</A></B><BR></DIV>"
>> /export/home/gdau/mrtg_test/index.html
# echo "<br>" >> /export/home/gdau/mrtg_test/index.html

i=$(( $i+1 ))
done

#生成html后半部
#echo "</td>" >> /export/home/gdau/mrtg_test/index.html
#echo "</tr>" >> /export/home/gdau/mrtg_test/index.html
#echo "</TABLE>" >> /export/home/gdau/mrtg_test/index.html
#
#echo "<BR>" >> /export/home/gdau/mrtg_test/index.html
#echo "<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0>" >>
/export/home/gdau/mrtg_test/index.html
#echo " <TR>" >> /export/home/gdau/mrtg_test/index.html
#echo " <TD WIDTH=63><A" >> /export/home/gdau/mrtg_test/index.html
#echo " HREF=\"http://oss.oetiker.ch/mrtg/\"><IMG" >>
/export/home/gdau/mrtg_test/index.html
#echo " BORDER=0 SRC=\"mrtg-l.png\" WIDTH=63 HEIGHT=25
ALT=\"MRTG\"></A></TD>" >> /export/home/gdau/mrtg_test/index.html
#echo " <TD WIDTH=25><A" >> /export/home/gdau/mrtg_test/index.html
#echo " HREF=\"http://oss.oetiker.ch/mrtg/\"><IMG" >>
/export/home/gdau/mrtg_test/index.html
#echo " BORDER=0 SRC=\"mrtg-m.png\" WIDTH=25 HEIGHT=25
ALT=\"\"></A></TD>" >> /export/home/gdau/mrtg_test/index.html
#echo " <TD WIDTH=388><A" >> /export/home/gdau/mrtg_test/index.html
#echo " HREF=\"http://oss.oetiker.ch/mrtg/\"><IMG" >>
/export/home/gdau/mrtg_test/index.html
#echo " BORDER=0 SRC=\"mrtg-r.png\" WIDTH=388 HEIGHT=25" >>
/export/home/gdau/mrtg_test/index.html
#echo " ALT=\"Multi Router Traffic Grapher\"></A></TD>" >>
/export/home/gdau/mrtg_test/index.html
#echo " </TR>" >> /export/home/gdau/mrtg_test/index.html
#echo "</TABLE>" >> /export/home/gdau/mrtg_test/index.html
#echo "<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0>" >>
/export/home/gdau/mrtg_test/index.html
#echo " <TR VALIGN=top>" >> /export/home/gdau/mrtg_test/index.html
#echo " <TD WIDTH=88 ALIGN=RIGHT><FONT FACE=\"Arial,Helvetica\" SIZE=2>"
>> /export/home/gdau/mrtg_test/index.html
#echo " version 2.16.2</FONT></TD>" >>
/export/home/gdau/mrtg_test/index.html
#echo " <TD WIDTH=388 ALIGN=RIGHT><FONT FACE=\"Arial,Helvetica\"
SIZE=2>" >> /export/home/gdau/mrtg_test/index.html
#echo " <A HREF=\"http://tobi.oetiker.ch/\">Tobias Oetiker</A>" >>
/export/home/gdau/mrtg_test/index.html
#echo " <A
HREF=\"mailto:tobi+mrtglink@oetiker.ch\">&lt;tobi@oetiker.ch&gt;</A>" >>
/export/home/gdau/mrtg_test/index.html
#echo " and&nbsp;<A
HREF=\"http://www.bungi.com/\">Dave&nbsp;Rand</A>&nbsp;<A
HREF=\"mailto:dlr@bungi.com\">&lt;dlr@bungi.com&gt;</A></FONT>" >>
/export/home/gdau/mrtg_test/index.html
#echo " </TD>" >> /export/home/gdau/mrtg_test/index.html
#echo "</TR>" >> /export/home/gdau/mrtg_test/index.html
#echo "</TABLE>" >> /export/home/gdau/mrtg_test/index.html
#echo "</BODY>" >> /export/home/gdau/mrtg_test/index.html
#echo "</HTML>" >> /export/home/gdau/mrtg_test/index.html

#invoke gather_mrtg_data java program
cd /export/home/gdau/task/gather_mrtg_data
./run_gather_data.sh
-------------------------------------------------------------------

-------------------------------------------------------------------
crontab文件
-------------------------------------------------------------------
0,5,10,15,20,25,30,35,40,45,50,55 * * * *
/export/home/gdau/task/cmnet_flow_mrtg.sh
#3 0,1,2 * * * /export/home/gdau/task/cmnet_flow_mrtg_cfg.sh
-------------------------------------------------------------------


【存在问题】
1、mrtg对大流量端口不支持。mrtg默认针对ifTable进行采集,采集的ifIn和
ifOut都为32位。但是针对高速端口,流速很大,32位的Counter很容易溢出。必须
要配置snmp V2版本支持才行。原理是使用ifXTable中的ifHCIn和ifHCOut来采集。
在生成mrtg.cfg文件时,增加:--snmp-options=:::::2选项
由于mrtg(版本:2.16.2)本身存在bug,需要修改cfgmaker脚本的907行。将:
if(not $speed or $counter eq "" or $counter =~ /\D/ or
$SNMP_Session::errmsg or $Net_SNMP_util::ErrorMessage){
修改为:
if(not $speed or $counter eq "" or $counter !~ /\d/ or
$SNMP_Session::errmsg or $Net_SNMP_util::ErrorMessage){
目的是禁止在mrtg.cfg文件中生成noHC:yes的选项。

2、对华为的设备,不支持采集ifAlias。
修改cfgmaker文件,修改:173行。将:
if ($routers->{$router}{deviceinfo}{Vendor} eq 'cisco' &&
$routers->{$router}{deviceinfo}{sysDescr} =~ m/Version\s+(\d+\.\d+)/) {
push @Variables, ($1 > 11.0 or $1 < 10.0 ) ? "ifAlias" : "CiscolocIfDescr";
if ($1 > 11.2) {push @Variables, "vmVlan";};
if ($1 > 11.3) {push @Variables, "vlanTrunkPortDynamicStatus";};
} elsif ( $routers->{$router}{deviceinfo}{Vendor} =~
/(?:hp|juniper|foundry|dellLan|force10|3com|extremenetworks)/) {
push @Variables, "ifAlias";
}
修改为:
if ($routers->{$router}{deviceinfo}{Vendor} eq 'cisco' &&
$routers->{$router}{deviceinfo}{sysDescr} =~ m/Version\s+(\d+\.\d+)/) {
push @Variables, ($1 > 11.0 or $1 < 10.0 ) ? "ifAlias" : "CiscolocIfDescr";
if ($1 > 11.2) {push @Variables, "vmVlan";};
if ($1 > 11.3) {push @Variables, "vlanTrunkPortDynamicStatus";};
} elsif ( $routers->{$router}{deviceinfo}{Vendor} =~
/(?:hp|juniper|foundry|dellLan|force10|3com|extremenetworks)/) {
push @Variables, "ifAlias";
} else {
push @Variables, "ifAlias";
}