<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[WEB交互设计]]></title>
<link>http://www.xyeweb.com/</link>
<description><![CDATA[-  关注WEB应用开发技术 - 互联网信息 - 软件工程 - www.xyeweb.com]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog2 v2.4]]></copyright>
<webMaster><![CDATA[huheng1234@163.com(胡亨)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>WEB交互设计</title> 
	<url>http://www.xyeweb.com/images/logos.gif</url> 
	<link>http://www.xyeweb.com/</link> 
	<description>WEB交互设计</description> 
</image>

			<item>
			<link>http://www.xyeweb.com/default.asp?id=496</link>
			<title><![CDATA[【JS】 split()函数使用方法]]></title>
			<author>huheng1234@163.com(huheng1234)</author>
			<category><![CDATA[HTML/JS/CSS]]></category>
			<pubDate>Sat,19 May 2012 00:17:21 +0800</pubDate>
			<guid>http://www.xyeweb.com/default.asp?id=496</guid>	
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;你可以使用split方法用限位器来分割一系列的名称，然后将其放在一个数组中．例如：<br/><textarea name="code" class="js">
var my_friends =&#34;trixie,moxie,sven,guido,hermes&#34;;
var friend_array =my_friends.split(&#34;,&#34;);
for (loop=0; loop < friend_array.length;loop++)
{     document.writeln(friend_array[loop] + &#34; is myfriend.<br>&#34;);}</textarea><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这段代码将字符串my_friends分割成包含５个元素的数组．JavaScript可以为你自动建立一个数组，所以你无需使用new&nbsp;Array()．<br/>&nbsp;&nbsp;&nbsp;将字符串分割成数组之后，我们使用了循环语句写出每一个名称．我们可以利用split方法简化前面所讲到的域名提取：<br/><textarea name="code" class="js">
var the_url = prompt(&#34;What’s the URL?&#34;,&#34;&#34;);
var first_split = the_url.split(&#34;//&#34;);
var without_resource = first_split[1];
var second_split = without_resource.split(&#34;/&#34;);
var domain = second_split[0];</textarea><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这段代码简化了很多而且也更容易理解．我们来分析一些这段代码：<br/><textarea name="code" class="js">
var the_url = prompt(&#34;What’s the URL?&#34;,&#34;&#34;); </textarea><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;提示用户输入一个URL，假设用户输入&#34;<a href="http://www.xyeweb.com/javascri&#112;t/index.html" target="_blank">http://www.xyeweb.com/javascri&#112;t/index.html</a>&#34;;&nbsp;．<br/><textarea name="code" class="js">
var first_split = the_url.split(&#34;//&#34;); </textarea><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将用户输入的字符串分割成两块：first_split[0]是&#34;http:&#34;，first_split[1]是&#34;www.xyeweb.com/javascript/index.html.&#34;&nbsp;<br/><textarea name="code" class="js">
var without_resource = first_split[1]; </textarea><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;提取出数组中的第２个元素，所以现在without_resource是&#34;www.xyeweb.com/javascript/index.html.&#34;&nbsp;<br/><textarea name="code" class="js">
var second_split = without_resource.split(&#34;/&#34;); </textarea><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将without_resource分割成３块：www.xyeweb.com,javascript,&nbsp;和index.html．现在你可以看到split的用途了吧？<br/><textarea name="code" class="js">
var domain = second_split[0]; </textarea><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;现在我们提取出新数组中的第１个元素就可得出域名．&nbsp;]]></description>
		</item>
		
			<item>
			<link>http://www.xyeweb.com/default.asp?id=495</link>
			<title><![CDATA[【JS】 substring()函数使用方法]]></title>
			<author>huheng1234@163.com(huheng1234)</author>
			<category><![CDATA[HTML/JS/CSS]]></category>
			<pubDate>Sat,19 May 2012 00:09:12 +0800</pubDate>
			<guid>http://www.xyeweb.com/default.asp?id=495</guid>	
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;子字符串（substring）和charAt有些象，不同之处在于它能够从一个单词中抓取整个的子字符串，而不只是字母，这里是其格式：<br/>var&nbsp;the_substring&nbsp;=&nbsp;the_string.substring(from,&nbsp;to);<br/>&#34;From&#34;指的是子字符串中第１个字母的位置，&#34;to&#34;有点奇特，它是该子字符串中比最后一个位置大１的位置．使用这种神奇的方法你可以标记子字符串的起始和结束位置，用&#34;to&#34;的位置减去&#34;from&#34;的位置就会得出该子字符串的长度：<br/><textarea name="code" class="js">
var the_string = &#34;monkey&#34;;
var clergy = the_string.substring(0,4);
var tool = the_string.substring(3,6);</textarea><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;运行该段代码后变量clergy的值为&#34;monk&#34;;&nbsp;变量tool的值为&#34;key&#34;。<br/>&nbsp;&nbsp;&nbsp;&nbsp;子字符串常和indexOf一起使用，将字符串分成若干块．例如，你可以从一个给定的URL中抽取出其域名：<br/><textarea name="code" class="js">
var the_url = prompt(&#34;What’s the URL?&#34;,&#34;&#34;);
var lead_slashes = the_url.indexOf(&#34;//&#34;);
var domain_start = lead_slashes + 2;
var without_resource = the_url.substring(domain_start, the_url.length);
var next_slash = without_resource.indexOf(&#34;/&#34;);
var domain = without_resource.substring(0, next_slash);</textarea><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这段代码的意思是：如果你输入<br/>&#34;<a href="http://www.xyeweb.com/javascri&#112;t/index.html" target="_blank">http://www.xyeweb.com/javascri&#112;t/index.html</a>&#34;;，则域名就是&#34;www.xyeweb.com&#34;&nbsp;．如果这个方法对你来说有些麻烦，我将向你介绍如何使用split<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;方法简化其执行过程．但是首先我们作一些分析．基本的技巧是将第１个斜杠和第２个斜杠之间的内容分离出来：<br/><textarea name="code" class="js">
var the_url = prompt(&#34;What’s the URL?&#34;,&#34;&#34;); </textarea><br/>//这行代码向用户询问一个URL．假设用户输入了&#34;<a href="http://www.xyeweb.com/javascri&#112;t/index.html" target="_blank">http://www.xyeweb.com/javascri&#112;t/index.html</a>.&#34;;&nbsp;<br/><textarea name="code" class="js">
var lead_slashes = the_url.indexOf(&#34;//&#34;); </textarea><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这行代码确定第一个双斜杠的位置．在本例中lead_slashes的值是５，因为双斜杠的位置从５开始．你可能会想，通常的URL都是以<a href="http://" target="_blank">http://</a>开始，所以双斜杠的位置肯定是在５开始，为什么还要加入indexOf这一段多余的代码呢？但是问题的关键在于你不知道用户在填入URL时是否一定填入http:，他们也许会不小心多键入了一个空格，也许他们所键入的URL在一个加密服务器上，其URL是&#34;<a href="https://www.xyeweb.com/" target="_blank">https://www.xyeweb.com/</a>&#34;;&nbsp;．在编程你必须预料到种种可能发生的问题．所以我们必须用indexOf方法确定双斜杠的确切的起始位置．<br/><textarea name="code" class="js">
var domain_start = lead_slashes + 2; </textarea><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这行代码用于计算该域名的第１个字母的起始位置．由于这里有一个双斜杠，所以域名第１个字母的起始位置应该在双斜杠所在位置加２的位置．<br/><textarea name="code" class="js">
var without_resource = the_url.substring(domain_start, the_string.length); </textarea><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这段代码将域名起始位置往后的所有字符都提取出来．所以执行完这行代码后<br/>without_resource是&#34;www.xyeweb.com/javascript/index.html.&#34;&nbsp;<br/><textarea name="code" class="js">
var next_slash = without_resource.indexOf(&#34;/&#34;); </textarea><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这行代码计算出该字符串中下一个斜杠的位置，而从该字符串起始位置到这个斜杠之间的内容就是域名．在本例中下一个斜杠的位置是17。<br/><textarea name="code" class="js">
var domain = without_resource.substring(0, next_slash); </textarea><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最后一步是提取出该字符串起始位置到下一个斜杠之间的所有内容．在本例中使得域名等同于&#34;www.xyeweb.com&#34;。<br/>&nbsp;&nbsp;&nbsp;&nbsp;这样做确实很麻烦，利用split方法则可以使该过程容易很多.]]></description>
		</item>
		
			<item>
			<link>http://www.xyeweb.com/default.asp?id=494</link>
			<title><![CDATA[【JS】 charAt()函数使用方法]]></title>
			<author>huheng1234@163.com(huheng1234)</author>
			<category><![CDATA[HTML/JS/CSS]]></category>
			<pubDate>Fri,18 May 2012 23:59:41 +0800</pubDate>
			<guid>http://www.xyeweb.com/default.asp?id=494</guid>	
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chatAt方法用于发现一个字符串中某个特定位置的字符。<br/>&nbsp;&nbsp;&nbsp;&nbsp;这里是一个例子：<br/><textarea name="code" class="js">
var the_word = &#34;monkey&#34;;
var the_first_letter = the_word.charAt(0);
var the_second_letter = the_word.charAt(1);
var the_last_letter = the_word.charAt(the_word.length-1);

the_first_letter(第1个字符)是&#34;m&#34;
the_second_letter(第2个字符)是&#34;o&#34;
the_last_letter(最后一个字符)是 &#34;y&#34;
</textarea><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注意利用字符串的length(长度)属性你可以发现在包含多少个字符。在本例中，the_word是&#34;monkey&#34;，所以the_word.length是6。不要忘记在一个字符串中第1个字符的位置是0，所以最后一个字符的位置就是length-1。所以在最后一行中用了the_word.length-1。]]></description>
		</item>
		
			<item>
			<link>http://www.xyeweb.com/default.asp?id=493</link>
			<title><![CDATA[【JS】 indexOf()函数使用方法]]></title>
			<author>huheng1234@163.com(huheng1234)</author>
			<category><![CDATA[HTML/JS/CSS]]></category>
			<pubDate>Fri,18 May 2012 23:56:13 +0800</pubDate>
			<guid>http://www.xyeweb.com/default.asp?id=493</guid>	
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indexOf用于发现一系列的字符在一个字符串中等位置并告诉你子字符串的起始位置。如果一个字符串中不包含该子字符串则indexOf返回returns&nbsp;&#34;-1.&#34;<br/>例子：<br/><textarea name="code" class="js">
var the_word = &#34;monkey&#34;; 
//让我们从单词 &#34;monkey&#34;开始。 
var location_of_m = the_word.indexOf(&#34;m&#34;); 
//location_of_m(字母m的位置)将为0，因为字母m位于该字符串的起始位置。
var location_of_o = the_word.indexOf(&#34;o&#34;); 
//location_of_o(字母o的位置)将为1。
var location_of_key = the_word.indexOf(&#34;key&#34;); 
//location_of_key(key的位置)将为3因为子字符串“key”以字母k开始，
//而k在单词monkey中的位置是3。
var location_of_y = the_word.indexOf(&#34;y&#34;); 
//location_of_y)字母y的位置)是5。 
var cheeky = the_word.indexOf(&#34;q&#34;); 
//cheeky值是-1，因为在单词“monkey”中没有字母q。</textarea><br/>indexOf更实用之处:<br/><textarea name="code" class="js">
var the_email = prompt(&#34;What’s your email address?&#34;, &#34;&#34;);
var the_at_is_at = the_email.indexOf(&#34;@&#34;);
if (the_at_is_at == -1)
{
     alert(&#34;You loser, email addresses must have @ signs in them.&#34;);
}
</textarea><br/>这段代码询问用户的电子邮件地址，如果用户输入的电子邮件地址中不包含字符则提示用户＂＠你输入的电子邮件地址无效，电子邮件的地址必须包含字符@。＂<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.xyeweb.com/default.asp?id=492</link>
			<title><![CDATA[JavaScript 错误处理与调试]]></title>
			<author>huheng1234@163.com(huheng1234)</author>
			<category><![CDATA[HTML/JS/CSS]]></category>
			<pubDate>Thu,17 May 2012 11:58:47 +0800</pubDate>
			<guid>http://www.xyeweb.com/default.asp?id=492</guid>	
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在Web开发过程中，编写JavaScript程序时或多或少会遇到各种各样的错误，有语法错误，逻辑错误。如果是一小段代码，可以通过仔细检查来排除错误，但如果程序稍微复杂点，调试JS便成为一个令Web开发者很头痛的问题。下面总结一下JS错误处理与调试的方法<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;<strong>方法1：用alert()&nbsp;和document.write()方法监视变量值。</strong><br/>&nbsp;&nbsp;&nbsp;&nbsp;alert()在弹出对话框显示变量值的同时，会停止代码的继续运行，直到用户单击“确定”按钮，而document.write()则在输出值后继续运行代码。调试JS时可以根据具体情况来选择这种方法。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;例如下面代码：将数组a中以1开头的数据添加到数组b中<br/><textarea name="code" class="js">
<!DOCTYPE html PUBLIC &#34;-//W3C//DTD XHTML 1.0 Transitional//EN&#34; 
&#34;<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" target="_blank">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</a>&#34;>
<html xmlns=&#34;<a href="http://www.w3.org/1999/xhtml" target="_blank">http://www.w3.org/1999/xhtml</a>&#34; >
<head>
    <title>无标题页</title>
    <script type=&#34;text/javascript&#34;>
    var a=[&#34;123&#34;,&#34;456&#34;,&#34;789&#34;,&#34;111&#34;];
    function AlertMessage()
    { 
      var b=new Array(&#34;1111&#34;);
      for(var i=0;i<a.length;i++)
      {
       
         if(a[i].indexOf(&#34;1&#34;)!=0)
         {
           alert(a[i]);
           b.push(a[i]);
         }
      }
    }
    
    </script>
</head>
<body >
<input type=&#34;button&#34;  value=&#34;点我&#34;  onclick=&#34;AlertMessage()&#34;/>
</body>
</html>
</textarea><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果加入的值比较多，则可以使用document.writer()方法，避免反复点击确定按钮。<br/>&nbsp;&nbsp;&nbsp;&nbsp;<strong>方法2：用onerror事件找到错误：</strong><br/>&nbsp;&nbsp;&nbsp;&nbsp;当页面出现异常时，error事件会在window对象上触发，它能够在一定程序上告诉开发者出现了错误，并帮助开发者找到错误所在，如下例：<br/><textarea name="code" class="js">
<!DOCTYPE html PUBLIC &#34;-//W3C//DTD XHTML 1.0 Transitional//EN&#34; 
&#34;<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" target="_blank">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</a>&#34;>
<html xmlns=&#34;<a href="http://www.w3.org/1999/xhtml" target="_blank">http://www.w3.org/1999/xhtml</a>&#34; >
<head>
    <title>无标题页</title>
    <script type=&#34;text/javascript&#34;>
    window.onerror=function()
    {
       alert(&#34;不好意思，出错了!&#34;);
    }
    
    </script>
</head>
<body onload=&#34;NonExist()&#34; >
</body>
</html>
</textarea><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;代码运行body标记的onload事件时调用了一个不存在的函数NonExist(),产生了错误.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要避免浏览器自己的错误提示很简单，只需要要onerror事件的处理函数最后返回ture便可，代码如下：<br/><textarea name="code" class="js">
<!DOCTYPE html PUBLIC &#34;-//W3C//DTD XHTML 1.0 Transitional//EN&#34; 
&#34;<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" target="_blank">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</a>&#34;>
<html xmlns=&#34;<a href="http://www.w3.org/1999/xhtml" target="_blank">http://www.w3.org/1999/xhtml</a>&#34; >
<head>
    <title>无标题页</title>
    <script type=&#34;text/javascript&#34;>
    window.onerror=function()
    {
       alert(&#34;不好意思，出错了!&#34;);
       return true;//屏蔽系统事件
    }
    
    </script>
</head>
<body onload=&#34;NonExist()&#34; >
</body>
</html>
</textarea><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;但这样处理对于解决错误并没有任何的帮助。其实onerror还提供了3个参数来确定错误的性质，代码：<br/><textarea name="code" class="js">
<!DOCTYPE html PUBLIC &#34;-//W3C//DTD XHTML 1.0 Transitional//EN&#34; &#34;<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" target="_blank">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</a>&#34;>
<html xmlns=&#34;<a href="http://www.w3.org/1999/xhtml" target="_blank">http://www.w3.org/1999/xhtml</a>&#34; >
<head>
    <title>无标题页</title>
    <script type=&#34;text/javascript&#34;>
    window.onerror=function(message,url,line)
    {
       alert(&#34;不好意思，出错了:\n错误提示：&#34;+message+&#34;\nUrl：&#34;+url+&#34;\n行号：&#34;+line);
       return true;//屏蔽系统事件
    }
    
    </script>
</head>
<body onload=&#34;NonExist()&#34; >
</body>
</html>
</textarea><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在IE浏览器中发生error事件时，正常的代码会继续执行，所有的变量和数据都保存下来，并可以通过onerror事件处理函数访问。而在Firefox中，正常的代码执行都会结束，同时所有的错误发生之前的变量和数据都会被销毁.<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>方法3：用try….catch语句找到错误</strong><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过try…..catch可以很轻松的找到错误的问题，不过可惜的是该语句并不能很好地处理语句错误。如下例：<br/><textarea name="code" class="js">
<!DOCTYPE html PUBLIC &#34;-//W3C//DTD XHTML 1.0 Transitional//EN&#34; 
&#34;<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" target="_blank">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</a>&#34;>
<html xmlns=&#34;<a href="http://www.w3.org/1999/xhtml" target="_blank">http://www.w3.org/1999/xhtml</a>&#34; >
<head>
    <title>无标题页</title>
    <script type=&#34;text/javascript&#34;>
    try
    {
      alert(&#34;这个是try...catch的例子&#34;));
    }
    catch(exception)
    {
       var error=&#34;&#34;;
       for(var i in exception)
       {
          error+=i+&#34;：&#34;+exception[i]+&#34;\n&#34;;
       }
        alert(error);
    }
    
    </script>
</head>
<body>
</body>
</html>
</textarea><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>方法4：使用Firefox错误控制台调试：</strong><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在Firefox菜单栏中选择“工具”－&gt;“错误控制台”,便可以打开它，所有浏览中运行的错误，警告，消息都会传错误控制台，Firefox提示的错误信息要比IE全面而且准确的多。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>方法5：使用Firefox插件FireBug</strong><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Firebug是Firefox下的一款开发类插件，现属于Firefox的五星级强力推荐插件之一。它集HTML查看和编辑、Javascript控制台、网络状况监视器于一体，是开发JavaScript、CSS、HTML和Ajax的得力助手。Firebug如同一把精巧的瑞士军刀，从各个不同的角度剖析Web页面内部的细节层面，给Web开发者带来很大的便利。具体如何安装使用FireBug可参考这篇文章：<a href="http://apps.hi.baidu.com/share/detail/15314208" target="_blank">http://apps.hi.baidu.com/share/detail/15314208</a><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>方法6：使用Miscrosoft&nbsp;Script&nbsp;Debugger调试：</strong><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在IE菜单栏中打开“工具”－&gt;“Internet选项“，选择”高级“，将”禁用脚本调试“复选框的勾去掉。具体如何使用就不介绍了。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>方法7：使用IE下的JS调试工具companion.js</strong><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一款像firefox中的firedebug工具类似的一个工具包，它的特点就是可以有好的提示错误，并且可以在IE浏览器下方出现控制台输出.方便及时调试。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;具体可参考这篇文章：<a href="http://hi.baidu.com/argv/blog/item/f4efe67ac370f7e12f73b3ad.html" target="_blank">http://hi.baidu.com/argv/blog/item/f4efe67ac370f7e12f73b3ad.html</a><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;还有其他JS调试工具就不一一介绍了，大家也可以介绍多几种比较好的JS错误处理方法或JS调试工具。]]></description>
		</item>
		
			<item>
			<link>http://www.xyeweb.com/default.asp?id=491</link>
			<title><![CDATA[oracle 查看表空间剩余量]]></title>
			<author>huheng1234@163.com(huheng1234)</author>
			<category><![CDATA[DB/SQL]]></category>
			<pubDate>Mon,14 May 2012 10:34:19 +0800</pubDate>
			<guid>http://www.xyeweb.com/default.asp?id=491</guid>	
		<description><![CDATA[1、查看所有表空间大小、剩余量：<br/><textarea name="code" class="sql">
sel&#101;ct dbf.tablespace_name,
dbf.totalspace &#34;总量(M)&#34;,
dbf.totalblocks as 总块数,
dfs.freespace &#34;剩余总量(M)&#34;,
dfs.freeblocks &#34;剩余块数&#34;,
(dfs.freespace / dbf.totalspace) * 100 &#34;空闲比例&#34; 
from (sel&#101;ct t.tablespace_name,
sum(t.bytes) / 1024 / 1024 totalspace,
sum(t.blocks) totalblocks
from dba_data_files t
group by t.tablespace_name) dbf,
(sel&#101;ct tt.tablespace_name,
sum(tt.bytes) / 1024 / 1024 freespace,
sum(tt.blocks) freeblocks
from dba_free_space tt
group by tt.tablespace_name) dfs
wh&#101;re trim(dbf.tablespace_name) = trim(dfs.tablespace_name)
</textarea><br/>2、查看当前用户各表所占表空间<br/><textarea name="code" class="sql">
Sel&#101;ct Segment_Name,Sum(bytes)/1024/1024 From User_Extents Group By Segment_Name</textarea><br/><br/>3.&nbsp;&nbsp;使用如下语句查看一下谁在用临时段<br/><textarea name="code" class="sql">
Sel&#101;ct se.username, se.SID, se.serial#, se.sql_address, 
se.machine, se.program, su.TABLESPACE,  su.segtype,  su.CONTENTS
FROM v$session se, v$sort_usage su
Wh&#101;re se.saddr = su.session_addr;</textarea>]]></description>
		</item>
		
			<item>
			<link>http://www.xyeweb.com/default.asp?id=490</link>
			<title><![CDATA[Oracle常用字符函数和日期函数]]></title>
			<author>huheng1234@163.com(huheng1234)</author>
			<category><![CDATA[DB/SQL]]></category>
			<pubDate>Wed,25 Apr 2012 10:51:13 +0800</pubDate>
			<guid>http://www.xyeweb.com/default.asp?id=490</guid>	
		<description><![CDATA[<strong>String类：ASCII，CHR，UPPER，LOWER，INITCAP，LTRIM，RTRIM，TRIM，LPAD，RPAD，REPLACE，CONTACT，SUBSTR，||，INSTR，LENGTH</strong><br/>ASCII(c1):c1是一字符串，返回与字符串第一个字符对应的十进制数(字符的ASCII码);他的逆函数是CHR()。<br/>CHR(i):i是一个数字，给出整数,返回对应的字符;它的逆函数是ASCII()。<br/>例子：<br/><textarea name="code" class="sql">
Sel&#101;ct ASCII ('赵'), CHR (54740), ASCII ('zhao'), ASCII ('z'), CHR (122)
FROM DUAL
</textarea><br/><img src="http://www.xyeweb.com/attachments/month_1204/82012425104332.png" border="0" alt=""/><br/><br/>UPPER(string):string是字符串，返回字符串对应的大写字符串<br/>LOWER(string):string是字符串，返回字符串对应的大写字符串<br/>INITCAP(c1):&nbsp;c1为字符串，函数将每个单词的第一个字母大写其它字母小写返回。单词由空格，控制字符，标点符号分隔。<br/>例子：<br/><textarea name="code" class="sql">
Sel&#101;ct UPPER ('sd'), LOWER ('QSD'), INITCAP ('QASdfd'), UPPER ('Sd'),
       LOWER ('qSd'), INITCAP ('sfdfSDD')
FROM DUAL</textarea><br/><img src="http://www.xyeweb.com/attachments/month_1204/v2012425104526.png" border="0" alt=""/><br/><br/>LTRIM(c1,c2):&nbsp;c1,c2均为字符串，返回删除c1左边出现的字符串c2后的字符串<br/>RTRIM(c1,c2):&nbsp;c1,c2均为字符串，返回删除c1右边出现的字符串c2后的字符串<br/>TRIM(c1):c1为字符串，返回去掉才左右两边的空格后的字符串<br/>LPAD(c1,i,[c2]):c1,c2均为字符串，i为整数。在c1的左侧用c2字符串补足致长度i,可多次重复，如果i小于c1的长度，那么只返回i那么长的c1字符，其他的将被截去。c2的缺省值为单空格。<br/>RPAD(c1,i,[c2])：c1,c2均为字符串，i为整数。在c1的右侧用c2字符串补足致长度i,可多次重复，如果i小于c1的长度，那么只返回i那么长的c1字符，其他的将被截去。c2的缺省值为单空格。<br/>例子：<br/><textarea name="code" class="sql">
Sel&#101;ct LTRIM('ASDF','A') LT,RTRIM('ASDF','F') RT,
       LTRIM('ASDF','F') LNT,RTRIM('ASDF','A') RNT,
       TRIM('ASDF') TN,TRIM(' ASDF') TL,TRIM(' ASDF ') TA,
       LPAD('ASDF',7,'F') LP,RPAD('ASDF',7,'F') RP,
      LPAD('ASDF',3,'F') LNP,RPAD('ASDF',3,'F') RNP,
       LPAD('ASDF',7) LP,RPAD('ASDF',7) RP
FROM DUAL</textarea><br/><img src="http://www.xyeweb.com/attachments/month_1204/y2012425104715.png" border="0" alt=""/><br/><br/>SUBSTR(string,start,count):start,count均为整数。取子字符串,返回从start开始,取count个字符组成的字符串。<br/>REPLACE(&#39;string&#39;,&#39;s1&#39;,&#39;s2&#39;):string&nbsp;希望被替换的字符或变量，s1&nbsp;被替换的字符串，s2&nbsp;要替换的字符串，返回用s2替换出现在string中的s1后的字符串。<br/>CONCAT(c1,c2):c1,c2均为字符串,连接两个字符串;函数将c2连接到c1的后面，如果c1为null,将返回c2.如果c2为null,则返回c1，如果c1、c2都为null，则返回null。他和操作符||返回的结果相同。<br/>||：表示连接，同contact(c1,c2)函数<br/>例子：<br/><textarea name="code" class="sql">
Sel&#101;ct SUBSTR('ASDF',2,2) SN,SUBSTR('ASDF',2,4) SRN,SUBSTR('ASDF',-1,2) SLN,
       REPLACE('ASSDF','S','A') RN, REPLACE('ASSDF','E','A') RNN,
       CONCAT('ABC','DEF') CN, 'ABC' || 'DEF'CN
FROM DUAL</textarea><br/><img src="http://www.xyeweb.com/attachments/month_1204/c2012425104824.png" border="0" alt=""/><br/><br/>LENGTH(c1):c1为字符串，返回字符串的长度;如果c1为null，那么将返回null值。<br/>INSTR(C1,C2,I,J)：&nbsp;在一个字符串中搜索指定的字符,返回指定的字符的位置;C1&nbsp;:被搜索的字符串，C2&nbsp;:希望搜索的字符串，I&nbsp;:搜索的开始位置,默认为1，J&nbsp;:出现&nbsp;的次数,默认为1；当没有发现需要的字符时返回0,如果I为负数，那么搜索将从右到左进行，但是位置的计算还是从左到右。<br/>例子：&nbsp;<br/><textarea name="code" class="sql">
Sel&#101;ct LENGTH('ASDF'),LENGTH(NULL),
       INSTR('ASDF','S',1,2),INSTR('ASDF','S',1,1),INSTR('ASDF','S',-1,2)
FROM DUAL</textarea><br/><img src="http://www.xyeweb.com/attachments/month_1204/k2012425104925.png" border="0" alt=""/><br/><br/><strong>Date类：SYSDATE，sysdate_，LAST_DAY，ADD_MONTHS，to_date</strong><br/>SYSDATE：返回当前日期时间<br/>sysdate_：返回当前日期<br/>LAST_DAY(date)：返回给定日期的最后一天<br/>ADD_MONTHS(date,n)：返回对给定日期增加或减少给定的月数的日期<br/>例子：<br/><textarea name="code" class="sql">
Sel&#101;ct SYSDATE, sysdate_, LAST_DAY (SYSDATE),
       ADD_MONTHS (LAST_DAY (SYSDATE), 4)
FROM DUAL</textarea><br/><img src="http://www.xyeweb.com/attachments/month_1204/82012425105030.png" border="0" alt=""/><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.xyeweb.com/default.asp?id=489</link>
			<title><![CDATA[Jira 用户权限相关设置 ]]></title>
			<author>huheng1234@163.com(huheng1234)</author>
			<category><![CDATA[Other]]></category>
			<pubDate>Wed,15 Feb 2012 11:57:29 +0800</pubDate>
			<guid>http://www.xyeweb.com/default.asp?id=489</guid>	
		<description><![CDATA[<strong>一、项目角色设置</strong><br/>项目角色按以下项目进行设置：<br/><br/>项目管理人&nbsp;(默认成员置空)<br/>开发人员&nbsp;(默认成员置空)<br/>测试人员&nbsp;(默认成员置空)<br/>基础用户&nbsp;(默认成员置空)<br/><strong>二、用户组设置</strong><br/>系统自带用户组不做操作：<br/><ul><br/><li>jira-administrators<br/></li><li>jira-developers<br/></li><li>jira-users<br/></li></ul><br/>每个项目分配一个用户组，然后在项目角色的“基础用户”中指定此默认组。<br/><br/>例如先创建一个用户组&#34;Linux&nbsp;版相关人员&#34;，然后将相关人员添加至此组，最后在项目&#34;U-Mail&nbsp;for&nbsp;Linux&nbsp;邮件系统&#34;中指定其基础用户组为此组。<br/><br/><br/>&nbsp;<strong>三、权限方案设置</strong><br/>每个权限可供选择的对象有以下几种：<br/><br/>提交人<br/>组&nbsp;(选择)<br/>单个用户&nbsp;(填写)<br/>项目管理者<br/>接受人<br/>项目角色&nbsp;(选择)<br/>自定义字段-用户<br/>自定义字段-组<br/>以下为自定的权限列表：<br/><br/><span style="color:Red">Project&nbsp;Permissions&nbsp;(项目权限)</span><br/>Administer&nbsp;Projects&nbsp;(项目管理)：项目管理者<br/>浏览项目：基础用户<br/>View&nbsp;Version&nbsp;Control&nbsp;(查看版本控制)：提交人&nbsp;接受人&nbsp;项目管理者<br/><span style="color:Red">Issue&nbsp;Permissions&nbsp;(问题权限)</span><br/>Cr&#101;ate&nbsp;Issues&nbsp;(创建问题)：基础用户<br/>Edit&nbsp;Issues&nbsp;(修改问题)：提交人&nbsp;接受人&nbsp;项目管理者<br/>Schedule&nbsp;Issues&nbsp;(安排问题)：提交人&nbsp;接受人&nbsp;项目管理者<br/>Move&nbsp;Issues&nbsp;(移动问题)：接受人&nbsp;项目管理者<br/>Assign&nbsp;Issues&nbsp;(分配问题)：提交人&nbsp;接受人&nbsp;项目管理者<br/>Assignable&nbsp;User&nbsp;(转交问题)：基础用户<br/>Resolve&nbsp;Issues&nbsp;(解决问题)：提交人&nbsp;接受人&nbsp;项目管理者<br/>Close&nbsp;Issues&nbsp;(关闭问题)：提交人&nbsp;项目管理者<br/>Modify&nbsp;Reporter&nbsp;(修改提交人)：项目管理者<br/>Del&#101;te&nbsp;Issues&nbsp;(删除问题)：项目管理者<br/>Link&nbsp;Issues&nbsp;(链接问题)：提交人&nbsp;接受人&nbsp;项目管理者<br/>Set&nbsp;Issue&nbsp;Security&nbsp;(设置问题安全)：提交人&nbsp;接受人&nbsp;项目管理者<br/><span style="color:Red">Voters&nbsp;&amp;&nbsp;Watchers&nbsp;Permissions&nbsp;(投票&amp;监控权限)</span><br/>View&nbsp;Voters&nbsp;and&nbsp;Watchers&nbsp;(查看投票/监控信息)：基础用户<br/>Manage&nbsp;Watcher&nbsp;List&nbsp;(管理监控问题列表)：项目管理者<br/><span style="color:Red">Comments&nbsp;Permissions&nbsp;(评论权限)</span><br/>Add&nbsp;Comments&nbsp;(添加评论)：项目管理者&nbsp;提交人&nbsp;接受人<br/>Edit&nbsp;All&nbsp;Comments&nbsp;(修改所有评论)：项目管理者<br/>Edit&nbsp;Own&nbsp;Comments&nbsp;(修改自己的评论)：基础用户<br/>Del&#101;te&nbsp;All&nbsp;Comments&nbsp;(删除所有评论)：项目管理者<br/>Del&#101;te&nbsp;Own&nbsp;Comments&nbsp;(删除自己的评论)：基础用户<br/><span style="color:Red">Attachments&nbsp;Permissions&nbsp;(附件权限)</span><br/>Cr&#101;ate&nbsp;Attachments&nbsp;(创建附件)：项目管理者&nbsp;提交人&nbsp;接受人<br/>Del&#101;te&nbsp;All&nbsp;Attachments&nbsp;(删除所有附件)：项目管理者<br/>Del&#101;te&nbsp;Own&nbsp;Attachments&nbsp;(删除自己的附件)：基础用户<br/><span style="color:Red">Time&nbsp;Tracking&nbsp;Permissions</span><br/>Work&nbsp;On&nbsp;Issues&nbsp;(添加工作记录)：接受人<br/>Edit&nbsp;Own&nbsp;Worklogs&nbsp;(修改自己的工作记录)：基础用户<br/>Edit&nbsp;All&nbsp;Worklogs&nbsp;(修改所有工作记录)：项目管理者<br/>Del&#101;te&nbsp;Own&nbsp;Worklogs&nbsp;(删除自己的工作记录)：基础用户<br/>Del&#101;te&nbsp;All&nbsp;Worklogs&nbsp;(删除所有工作记录)：项目管理者]]></description>
		</item>
		
			<item>
			<link>http://www.xyeweb.com/default.asp?id=488</link>
			<title><![CDATA[项目经理的一些个人体会]]></title>
			<author>huheng1234@163.com(huheng1234)</author>
			<category><![CDATA[Other]]></category>
			<pubDate>Fri,10 Feb 2012 15:51:26 +0800</pubDate>
			<guid>http://www.xyeweb.com/default.asp?id=488</guid>	
		<description><![CDATA[一个项目经理的一些个人体会<br/><br/>本人做项目经理工作多年，感到做这个工作最要紧的就是要明白，什么叫因地制宜、因势利导，就是说只有最合适的，没有什么叫对的，什么叫错的，项目经理的工作就是利用有限的资源把事情做到客户期望的水平，企业的根本目的就是赚钱，不是研究机构，所以，项目经理最忌讳的就是完美主义倾向，尤其是做技术人员出身的，喜欢寻找标准答案，耽误了工作进度，也迷茫了自己。以下是本人一些做项目经理的个人体会，写出来供大家指点，在讨论过程中共同提高水平。由于本人的经历主要是做和软件开发相关项目的管理工作，所以，这些经验可能不适合用在工程项目管理领域。<br/><br/>项目开始阶段是一个最重要的阶段。项目经理在接手一个新项目的时候，首先要尽可能地多从各个方面了解项目的情况，如：<br/><br/>1.&nbsp;这个项目是什么项目，具体大概做什么事情，是谁提出来的，目的是解决什么问题。在国内很多客户都很不成熟的情况下，千万不要根据项目的名称望文生义地去想象项目的目标。一个名为&#34;办公自动化&#34;的项目很有可能在你进场以后一个月才发现客户其实需要的是一个计算机生产管理辅助信息系统。你前期了解情况的工作越详细，后面的惊讶就越少，项目的风险就越小。<br/><br/>2.&nbsp;这个项目里牵涉哪些方面的人，如投资方、具体业务干系方、项目建成后的运营方、技术监督方等等，很多项目里除了业主单位的结构很复杂以外，还有一些其他单位也会牵涉进来，如项目监理公司、业主的行业主管机构等。项目经理需要了解每个方面的人对这个项目的看法和期望是什么。事先了解各个方面的看法和期望，可以让你在做项目碰到问题的时候，就每件事情分析哪些人会在什么方面支持你，哪些人会出于什么目的反对你，从而提前准备联合朋友去对抗敌人，让事情向你所希望的方向发展。没有永远的朋友，也没有永远的敌人，只有一致的利益，这句话作为项目经理是一定要记住的。就像二战时候的英国首相邱吉尔，他是个典型的反苏反共分子，但是在苏联进行几大保卫战的时候，他冒着德国潜艇的炮火，忍受路途运输损失一半的代价，把大量的坦克、飞机、军用卡车送到了苏联军队的手中，因为他那时候最主要的任务就是打击纳粹德国。所以，在项目的最初阶段，根据各个方面的情况，经过平衡后得出一个项目大致目标并获得其他人的认可，这个是一个成功项目的第一步；<br/><br/>3.&nbsp;基本了解了客户的情况后，下面的事情就是了解自己公司各方面对这个项目的看法。首先是高层领导是否重视，这个决定了你在需要资源的时候，公司是否会根据你的要求提供最有力的支持。一般说来，领导口头肯定是说支持的，你需要做的是了解公司对这个项目的实际期望，是想把项目越做越大还是想赚钱？是想做样板工程还是干脆想敷衍了事，公司领导对项目的态度决定了你做这个项目的战略，而这个战略方针将对你做项目计划产生直接的影响；<br/><br/>4.&nbsp;在做整体项目计划前，还要大致计算一下你手上的资源。首先是时间，现在市场竞争激烈，往往很多项目要求在几乎不可能的时间范围里完成。对于这一点，你在做项目的风险控制计划的时候要充分考虑。其次是人员，根据项目预算和已往经验，大致计算一下未来的项目小组有多少种角色，每个角色目前公司是否有人，是否能完全归这个项目使用，是否需要另外招聘一些人员，招聘的准备工作要尽早启动。最后就是一些设备的准备，项目所需大件关键设备要尽早预定，以后不管发生设备等人还是人等设备的情况，浪费的都是你的时间。所以，项目经理不仅要和客户有很好的沟通，熟悉自己公司内部的各种办事流程，知道如何和人事、财务部门打交道，也是一个很重要的方面；<br/><br/>5.&nbsp;现在是做项目说明书的时候了。一份好的项目说明书不仅将要做的事情描述得很清楚（主要是讲做什么，而不是说怎么做），而且把如何检查也说明得很透彻。也就是说它不仅说明白了要做哪些事情，也让客户的业务人员（一般不懂技术）知道项目做成什么样就算完成了。简单地说，项目说明书描述项目做哪些事情和每件事情做到什么程度以及如何检查每一个结果。<br/><br/>6.&nbsp;是到做总体计划的时间了吗？不，你现在已经知道了客户的目标和你手上的资源，那么做计划以前，你还需要和你的经理和客户充分沟通资源的问题。因为很多资源是还不明确的，你需要写一份报告，详细分析这个项目的风险以及对资源的需求情况。如果一些问题不能得到解决的话，将发生什么样的后果。如果资源不够，就要高层改变策略，增加对这个项目的投入。甚至在条件许可的情况下，有些公司会放弃这个项目。总之，没有人能完成一个不可能完成的任务，如果项目经理不能尽早发现风险，做出对策，那么就只能去当烈士了。<br/><br/>7.&nbsp;明白了要做哪些事情和你手上的筹码以及你做这个项目的总体策略，现在是成立项目小组的时候了。很多项目经理都没有自己选择组员的权利，那么，就尽量发挥你的影响力去寻找那些你想要的人吧。成员的组成根据项目不同，相差较大，很难有什么具体要求，但是，一定要有精通客户业务的人，很多小项目里，这个人就是项目经理本人，大项目里会配备行业专家（Industry&nbsp;expert），这样和客户沟通起来才不会鸡同鸭讲，双方才可以相互理解。我经常看到的情况是我们的技术人员和客户交谈时满口的专业术语，结果搞得客户一头雾水，反过来，他还指责客户不懂技术。其实，明白自己想做什么的客户已经是很好的客户了，不知道自己要做什么，更不懂怎么做还要指手画脚的客户到处存在，但是要明白，是客户选择了你，而不是你选择了客户，有了客户你才有工资拿，心平气和一点吧；<br/><br/>8.&nbsp;现在你要面对三群人：你的领导、你的组员和你的客户，和这些人沟通，让他们知道你打算怎么做，什么时候要他们做什么准备这些事情将是你的主要工作。既然沟通这么重要，那些事先定义一下沟通的原则也是一件很要紧的事情。很多沟通原则都是潜规则，如果你在一个部门时间做长了，对这些规则的运用觉得是一件理所应当的事情，但是，你现在面对的是多个部门甚至多个单位，不把沟通规则说清楚，你以后就会吃亏。下面的东西看起来无聊，其实还是很管用的：第一个是规定信息的流动方式和介质，是推还是拉。推的意思就是项目经理将主动发布信息，不管通过电话、邮件还是书面方式，保证将信息传达到每个人。这种情况适合小项目，人少；拉的意思就是项目经理就是一个类似web服务器，你自己需要什么信息就去问他。当然，没有项目经理把自己搞得那么累，他会用发布信息到公共介质的方式公布信息，简单的是白板，复杂一点的是项目的公共信息交互区，潜规则就是我发了你没去看就不要说我没告诉你。说这些看似很无聊，其实里面牵涉信息传达不完全的责任问题。当然，这些都是指一般的方式，而且不要绝对化，一般情况下，主动沟通和被动访问是同时存在的，尤其是对领导，项目经理更加应该主动去和领导沟通。第二个问题就是文档问题，很多人怕写文档，但是项目经理一定要牢记&#34;好记性不如烂笔头&#34;的道理。有理有时候为什么会说不清呢？就是因为没有证据。所以项目经理开始就要和客户说清楚有些文档是必须签字的，比如项目经理的项目日志，每个星期至少让客户签字，另外所有达成共识的东西，比如会议纪要，甚至领导的讲话记录，都要写成文档，双方签字，这样以后扯皮的时候，就能做到有据可查。记住：说了的就和没说一样，只有写下来大家签字后才算真正认可了的。还有一些问题，比如你提交的报告，给领导（包括本方领导和客户领导）做一个选择题，结果领导压住不批，让你无所适从，结果拖延了进度。这时候，你可以等，但是注意要留记录，标明是谁的责任；另外，如果你在开始阶段就和领导商定：如果批示提交三天后没有得到领导答复就算对方同意，这样你就会主动很多。再比如不同事件的审批流程问题：什么等级的事情记录在项目日志里、什么等级的事情要双方项目经理专门签署备忘录、什么等级的事情要双方领导出面签署合同附件等等。事先想得越周到，以后的工作就越主动。<br/><br/>&nbsp;&nbsp;好了，做了很多前期工作，定义了一些游戏规则，现在是坐下来做计划的时候了。这一节，任意找一本项目管理的书都会说得比我好，所以我就少写一点，说一些自己的体会就是了。首先是找几个关键组员，比如客户业务专家、系统分析员等等，做一下项目模块划分工作。项目分成几块去做，每一块完成什么，模块之间的信息如何交换等等。需求定义的是做什么的问题，而这里说的是怎么做的问题。这里要强调一点：完成一个目标有很多种方式，你要选一种你最熟悉的，而不是看上去最完美的，这个思路会让你的项目减少很多风险。有时候客户会被某种新技术打动，坚持要你采用那种新技术，你就应该告诉他：你选我做这个项目，就应该容许我采用自己最喜欢的方式做事情，新技术之所以有诱惑力，就是因为吃亏的人还不多，我不希望你成为第一批受害者。采用一个计划会让你的工作更加明确，比如用微软的Project软件，你填写完表格以后，就可以知道这个项目有多少件事情要做，每件事情需要什么资源，他们之间的前后关系如何，消耗的时间有多长，完成后有什么标志等。所有的结果可以用例如甘特图的形式表现出来。你做完这个表以后会惊奇地发现，甘特图上项目的结束时间会远远落后于你的计划结束时间（签合同的人永远不会先征求你的意见的）。当然，学过项目管理的人会大谈什么WBS、优化路径之类的东西，但是我的经验是你再优化也不可能把这些东西安排到计划的时间结束。如果你没碰到这个问题，在我恭喜你挑了一个轻松活之前，请你再去确认你是否罗列了所有要做的事情和正确评估了他们所需要的时间。这时候，你就要考虑牺牲一些任务的时间（也意味着质量）了。按照什么标准牺牲？这个项目的战略！我们在第三节提到过的战略。我的经验是如果你什么都赶进度，其结果可能就是十件事情你一件也没做好，想想多么失败啊。所以，把资源投到你熟悉和有把握的事情上，最后的结果是十件事情，你有三件做成了精品，三件完成，还有四件因为某些原因延误，成绩单是否靓丽了很多呢？战略决定优先级，而正确排列事情的优先级是一个项目经理能力的主要体现。<br/><br/>&nbsp;&nbsp;好，现在项目已经完成了前期工作，了解了项目的目标、搞清楚了手上的资源，制定了项目的策略，然后编制了项目的整体计划，项目进入实施阶段。进入这个阶段反而是项目经理比较空闲的时候，不像前期的时候项目经理要象记者一样到处和不同的人接触，搞清楚他们在说什么，努力猜测他们在想什么和他们的真正目的，那才是最累人的事情。当然，小项目的项目经理往往自己也是一个资源，要做很多事情，这时候反而比谁都苦。项目经理这段时间的主要工作是保持和客户领导以及自己领导的沟通。和客户领导沟通时特别要注意，除非你需要对方给你支持，那么你才需要讲得具体一点，否则，告诉他一切正常就可以了，而且态度要积极一些，千万不要说一些领导不懂的细节，比如：<br/><br/>“王局长，最近项目进度还算正常，就是JVM经常发生一些内存泄漏的情况…”<br/>王局长：“……(*&amp;$@@”<br/><br/>&nbsp;&nbsp;和自己的领导汇报也要注意这个问题，除非他是一个技术高手，你需要他的技术经验，否则一般就汇报进度是否正常以及有问题时你的对策和打算就可以了，有些需要他支持的地方，比如资源调用需要说详细一点。<br/><br/>&nbsp;&nbsp;和组员开会，除了一些项目进度跟踪会议以外，还有很多讨论会，需要大家用头脑风暴方法给出解决问题。与会人员很多都是技术人员，他们的特点是注重细节、缺乏大局观、有点消极悲观、自尊心强（如果总结得不对，欢迎大家拍砖），所以，你作为会议的主持人，只要负责提出问题和记录下他们的观点，千万不要做评判者的角色。一个问题，有很多方面，从不同的角度看，现象是完全不同的，想想盲人摸象的故事吧。这些技术人员，他们往往精通一个方面，就自己的角度发表见解，除非一些很特别的情况，你都应该认为，他们提出的方案，从他们的角度来看是最合理的。你的长处是掌握事情的优先级，评估各个方面的轻重缓急，从而根据他们的意见得出一个合适的（而不是正确的）方案。所以，在会议上，你要充分尊重每一个人和他的意见，夸奖那些意见提得比较好的人，千万不要把会议带入无休止的争论（你要让大家知道事情不是非黑即白的，而是多元的，唉，我们的教育惹的祸…）。会后，你自己整理结果，写文档，做决定。会议上大家的面子都被照顾了，自然实施起来的阻力就小，如果还有意见的，你就私下找他聊，如果还不能说服他，你就要让他明白，因为你负责这个项目、你担当风险，所以，这个优先级应该你来判断。组织中的高层，并不见得水平会比一般的成员高，但是，他要承担组织的风险，加之信息的不对称性，所以，对事情的优先级的判断肯定比下属强。<br/><br/>&nbsp;&nbsp;另外，你还可以采用一些专业的方法论来解决这种讨论问题，比如著名的六顶思考帽。你可以按照不同的帽子颜色来组织大家思考，如在白色帽子里讨论客观的事实；在黄色帽子里讨论做这个事情的好处；在绿色帽子里发挥创新，看看这个事情能做成什么样子，发挥想象力；在蓝色帽子里讨论做事情的逻辑、步骤；在黑色帽子里讨论未来的风险和预防措施；在红色的帽子里谈谈大家对这个事情的主观感受。这样会议才不会失控，观点也被罗列得很清楚。<br/><br/>在开发过程中，内部管理还要注意的一点是时刻强调以验收为目的的思想，每个任务的最终可交付成果一定要是可以被检查的，比如，【界面要求：美观大方、简洁明快】，这个要求我就不知道如何检查。所以，给开发小组布置任务的时候就要考虑如何检查结果，比如我见过一个计划，里面有一个任务【开发人员熟悉EJB编程】，这个任务，除了让这些人去参加一些专业认证考试，否则，结果很难被检查。所以，时刻考虑如何检查结果、如何向客户交付是项目经理一直要注意的事情，我听说有些老项目经理拿到项目是倒排计划的，即首先看如何验收和验收标准，然后决定工作计划。很多项目开始了很久，还不知道如何验收，那么这个项目出问题的可能性就很大了。做项目就是为了验收，拿到钱，我们的角色不是研究机构，我们的目的就是在付出那么多劳动后得到结果。另外我插一句：我是极其不主张到客户现场开发的。尤其是一大群技术人员直接和客户交流，很容易引起冲突和矛盾（技术人员的本性决定的）。我的做法是项目经理和项目实施人员到现场，软件开发人员还是在公司做项目。项目实施人员就是初级项目经理，他们了解自己的产品，懂得一些客户的业务，关键是在于他们具有良好的沟通能力，俗称“皮厚”。他们是客户和研发人员的桥梁，其职业方向也是很机动灵活，以后可以有很多方向可以转，比如销售、行业顾问等，其出路反而比开发人员的路要宽得多。<br/><br/>接着，我们再谈谈最让人头痛的需求变更问题。变更通常分为两种：一种是部分更改了原先的目标，即需求变更；另一种是没改变目标，但是客户不满意目前的实现方式，大到流程的实现，小到界面的布局，都是属于这类。碰到这种情况是难以避免的，主要是事先沟通的不够充分和客户随着项目的进展，慢慢想清楚了问题，改变了以前的思路。这时候，如果需要改并且你的战略是容许这种情况的，那么注意下面几点：<br/><br/>1.&nbsp;确保以前的文档，就是记载着以前的结论的东西，客户是否签过字，如果没有，赶紧把你的工作停下来，赶快再和客户自己确认一下你的方案，然后让他签字，避免以后说话没有凭据；<br/><br/>2.&nbsp;和客户坐下来，自己探讨他修改的根本目的是什么，是不是有同样能达到相同目的，但是对你来说有代价更小的选择？<br/><br/>3.&nbsp;（项目初期的工作）明确更改流程，一般是客户指定一人签字（否则客户每个领导都有权力来插一杠子，你就废了），以正式项目文件的方式提交给你，然后，你做评估分析，分析对成本、进度的影响，在你的领导同意后，出相应意见书，主要是要说明更改设计的原因和指出由此带来的不确定后果（这个东西先写出来，后面如果真的发生了，至少不是你的错）。然后再让客户在上面签字。见过医院给病人做手术以前让家人签的免责条款吗？对，就学习那个，让大家都意识到任何的更改都有成本和代价。<br/><br/>所以，对于这种需求天天变的客户，你就一定要事先做好规矩：<br/>一、统一联系人，客户指定一个人和项目组进行沟通，不能张领导、王领导都来说几句，如果他们意见不一致，那你只有得罪领导的选择了，所以，项目的最初就要定好规矩，我项目组只认一个的意见，有什么要求你们内部先统一再和我谈，我不想卷入你们内部业务部门之间的矛盾之中；<br/><br/>二、所有需求变更全部要有书面文字，这点切记！这样做好处多多：<br/>*有书面证据，以后他还想改，你有了他以前要求的证据，告诉他：你以前可是这么说的；<br/>*便于需求变更管理，需求如何慢慢演变的历史可以看清楚，从而更深切地体会客户的目的；<br/>*对于客户来说，嘴巴一动最方便，反正是你们做，不花他的资源，所以要求是否合理，是否和项目的目的一致，他是不负责任的。但是如果要他写书面要求，还要签字盖章，他就要谨慎多了，而且一写东西，思想就会更加深入，很多无理要求也就这样胎死腹中了；<br/><br/>系统开发告一段落后，就进入客户培训、系统验收阶段，这个阶段，我一般会注意以下几个问题：<br/><br/>给客户做培训前，多注意一些表面功夫。很多程序员认为，既然很多系统采用原型法，有一个由粗到精的过程，那么系统的逻辑核心是否正确才是关键，至于界面如何，界面上的用词是否准确，那是无关紧要的问题；而且培训的时候也是空手上台、信手拈来，想到哪里说到哪里，下面听讲的人不知所云，云山雾罩，培训效果自然可以想象。我的体会是，给客户做培训的版本，如果你在做多次测试以后仍然不能确定逻辑是否合乎要求，那么，你至少要在界面上多花一点功夫。注意每个界面的布局、用词、链接的正确性等等，总之不要让客户看到一些他不该看到的东西，否则，仅仅因为一些无关紧要的报错就让客户第一印象觉得系统不稳定，那你就真的比窦娥还冤了。如果工作再做得详细一点，可以做一些类似Flash的东西，把一些你要强调的重点用通俗易懂、轻松愉快的方式表达出来。文档方面，准备至少两个文档：用户手册和培训手册。这两个文档的内容很多都是一致的，但是角度完全不同。用户手册往往是站在系统设计者的角度，按照自己的思路，分模块讲解系统的操作和功能；而培训手册，一定要站在客户业务人员的角度，根据每个角色面对不同业务的办理，如何通过使用本系统的一系列功能来实现目标。所以，第一次培训以前，系统界面是否完整正确、培训文档是否完备、培训时所举的例子是否有代表性都是很关键的因素，第一炮打不响，以后就麻烦很多。<br/><br/>上面讲的是培训的时候，丑媳妇要化妆好再去见公婆的问题。其实，项目实施中还有一个考验项目经理功力的就是如何调动客户积极性的问题。一般来说，客户是懒的，这就是他花钱找你做事情的原因。一个项目的成败，和客户的配合程度很有关系。根据我的分析，一般项目中的客户都可以分为三类：支持的、消极观望的、抵触的。他们人数的分布一般是一个纺锤形：支持的和抵触的人少，观望的人多（如果你接了一个人人都抵触你的项目，那你还是不要做了）。首先，分析一下那些人为什么支持你和抵触你。很简单，于公于私两个方面分析，上了新系统，谁的工作量有所变化？谁的潜在利益是否受到威胁？谁的岗位是不是因为新系统而消失？传统的利益格局因为新系统的使用而发生怎么样的变化，这些东西，都是项目经理必须去了解的，这样，你才能团结那些支持你的人，消减那些抵触你的人。项目经理是一个很奇怪的角色，属于典型的责任大、权力小的角色，他能做的只有借力打力，不管在自己公司还是在客户那里，一定要依靠别人才能完成自己的目的。只有了解哪些人会因为什么而帮助你，哪些人会因为什么而抵触你，你才能让客户配合你做工作。比如上一些内部计算机辅助管理系统，其必然后果就是让本来管理混乱时有人可以浑水摸鱼的一些利益消失掉了，这样，有些人肯定就要捣乱，到处诋毁这个系统。这时候，你就可以散布一些&#34;谁抵制新系统就说明自己屁股上有屎&#34;这类的论调去压制他们，减弱他们的影响。总之，团结积极分子，打压敌对分子，带动大多数是你的基本策略。<br/><br/>还有一个体会和大家分享：千万不要觉得对方的领导（中层干部）是应该配合你工作的，特别是一些国营单位，多一事不如少一事，他干吗要帮你？我的经验是：对方领导如果没有拿你的事情作为内部斗争的武器而从中作梗（当然，他针对的不一定是你），那已经是算合作的了，记住，他不捣乱就是帮你忙了。<br/><br/>作为项目经理，其实脑子里就是几样东西：做哪些事情、做到什么程度、怎么交货、手上的资源以及各个事情的优先级。所谓多快好省那是人类的梦想，这四个方面都是相互矛盾的，属于典型的又要马儿跑，又要马儿不吃草的类型。一般说来，项目经理在考虑问题的轻重缓急方面，往往是把快放在第一位，各方领导都会给你最后期限，所以保进度是第一位的；省是第二位的，企业的根本目的是盈利，如果收入不能增加的话，至少费用要控制住；好是第三位的，没办法，谁都想精益求精，但是，没有强大的资源保障，质量只好先牺牲了；最后是多，客户的要求源源不断，如何降低客户的期望值，把项目控制在一个合适的范围内，让客户从理想回到现实也是项目经理的分内工作。<br/><br/>验收前，除了做好文档工作，即可交付成果以外，多花时间搞清楚客户的做事情流程是很重要的事情，一个公司做事情必定有流程，所以搞清楚流程十分关键。比如验收、付款这些你极其关心的事情，客户那边的流程是怎么样的，谁牵头组织、哪些人参加，要什么文件、走什么程序、哪些人签字、最后出什么文档等等，都要搞清楚，特别要事先分析和打听哪个环节容易卡壳，做好事先的准备。<br/><br/>我对验收最大的体会就是举证问题。即千万不要让客户这么想：你必须有证据证明你的系统是没问题的。这样你就没戏了，微软那么多天才，做了个Windows还天天打补丁，要你的程序没问题，既不可能，你也没办法拿出证据。你要让客户明白，所谓验收，就是我按照测试文档的测试用例跑一遍，结果和预期结果一致就应该算通过了，而且还容许有一些小错误留在验收后改正，他可以对测试用例提意见。所以，验收前双方要确认测试计划和测试用例。如果他认为系统不符合要求，那么他应该举证，证明这个系统和最初设计相背离的。所以，参考法律概念，千万不要举证倒置。另外，认为系统完美了才能验收的想法也是错误的，软件开发合同里一定要注明验收以后维护期的费用问题，否则，客户担心一旦验收就得不到你们的支持，自然不配合验收，那么，你这个项目经理就很难交功课了。<br/><br/>最后，我想谈谈如何评价项目经理的绩效的问题，我认为，项目经理有以下几个档次：<br/><br/>*最差的项目经理：项目过程中总是出现意外，然后自己又解决不了，结果成为烈士；<br/>*二流的项目经理：项目也经常出现意外，但是他一马当先，奋勇向前，解决了一个又一个问题，最后，勉强算把项目结束了，获得了领导的一致好评；<br/>*一流的项目经理：平时很少见他做具体的事情，整天找人聊天，然后就是写报告、做计划，最后项目顺利结束，整个过程平淡无奇；&nbsp;<br/><br/>项目管理到底是一门科学还是一门艺术呢？所谓科学就是经过反复论证，输入和输出有必然规律的东西，种瓜得瓜；而艺术就是思想火花的闪耀，主要靠灵感。项目管理这个东西，据一个前辈说，在国外是科学，80%是有规律可循的；在国内是艺术，主要靠个人魅力、感染能力等东西。看明白了PMBOK，学会了一些做事情的方式，只是搞懂了那个20%的科学的东西，还有80%的空间，属于见仁见智的领域了。所以，加强很多方面的个人能力，如练就出色沟通能力、提升自己的个人魅力对于项目经理来说是多么重要啊，无论是对内还是对外。作为一个一流的专业人士，在顺利让客户签字的同时，如何让自己的领导知道你的价值，这也是体现自己能力的一种途径。]]></description>
		</item>
		
			<item>
			<link>http://www.xyeweb.com/default.asp?id=487</link>
			<title><![CDATA[Oracle中NULL及DUAL表详解]]></title>
			<author>huheng1234@163.com(huheng1234)</author>
			<category><![CDATA[DB/SQL]]></category>
			<pubDate>Mon,30 Jan 2012 09:57:56 +0800</pubDate>
			<guid>http://www.xyeweb.com/default.asp?id=487</guid>	
		<description><![CDATA[1．NULL&nbsp;使用详解<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;常常会有人问到，什么是NULL？顾名思义，NULL就是空，ORACLE中以及其他的数据库中，含有空值的表的列的长度为零。ORACLE允许任何一种数据类型的字段为空，除了以下两种情况：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;1、定义该列为主键字段（primary&nbsp;key）；<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;2、定义该列时已显式的加了&nbsp;NOT&nbsp;NULL&nbsp;的限制条件的字段。<br/><br/>1.1．具体说明：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;1、等价于没有任何值、是未知数；<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;2、NULL与0、空字符串、空格都不同；<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;3、对空值做加、减、乘、除等运算操作，结果仍为空；<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;4、NULL的处理使用NVL函数；<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;5、查询、比较时使用关键字用“is&nbsp;null”和“is&nbsp;not&nbsp;null”；<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;6、空值不能被索引，所以查询时有些符合条件的数据可能查不出来，比方在count(*)中，用nvl(列名,0)处理后再查；<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;7、排序时比其他数据都大（索引默认是降序排列，小→大），所以NULL值总是排在最后。<br/><br/>1.2．使用方法举例：<br/><textarea name="code" class="sql">
SQL> sel&#101;ct 1 from dual wh&#101;re null=null;
没有查到记录
</textarea><br/><textarea name="code" class="sql">
SQL> sel&#101;ct 1 from dual wh&#101;re null='';
没有查到记录
</textarea><br/><textarea name="code" class="sql">
SQL> sel&#101;ct 1 from dual wh&#101;re ''='';
没有查到记录
</textarea><br/><textarea name="code" class="sql">
SQL> sel&#101;ct 1 from dual wh&#101;re null is null;

        1

---------

        1
</textarea><br/><textarea name="code" class="sql">
SQL> sel&#101;ct 1 from dual wh&#101;re nvl(null,0)=nvl(null,0);

        1

---------

        1
</textarea><br/><textarea name="code" class="sql">
--对空值做加、减、乘、除等运算操作，结果仍为空。
SQL> sel&#101;ct 1+null from dual;
SQL> selec t 1-null from dual;
SQL> selec t 1*null from dual;
SQL> selec t 1/null from dual;
查询到一个记录.
</textarea><br/>1.3．设置某些列为空值<br/><textarea name="code" class="sql">
updat e table1 se t  col1=NULL wh&#101;re col1 is not null;
</textarea><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;熟练使用Oracle的空值用法，熟悉它的约定，以确保查出的结果。<br/><br/>2．Dual伪列<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;含义解释：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;Dual&nbsp;是&nbsp;o&#114;acle中的一个实际存在的表，任何用户均可读取，常用在没有目标表的selec&nbsp;t语句块中。<br/>2.1．使用方法：<br/><textarea name="code" class="sql">
--查看当前连接用户
SQL> sel&#101;ct user from dual;

USER
------------------------------
SYSTEM

--查看当前日期、时间
SQL> sel&#101;ct sysdate from dual;

SYSDATE
----------
18-4月 -03

SQL> sel&#101;ct to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2003-04-18 22:37:56

  --当作计算器用
SQL> sel&#101;ct 1+2 from dual;

       1+2
----------
         3

--查看序列值
SQL> cr&#101;ate sequence aaa increment by 1 start with 1;

SQL> sel&#101;ct aaa.nextval from dual;

          NEXTVAL
----------
         1

SQL> sel&#101;ct aaa.currval from dual;

   CURRVAL
----------
         1
</textarea>]]></description>
		</item>
		
</channel>
</rss>
