<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[Akins's Blog]]></title>
<link>http://www.iakins.com/</link>
<description><![CDATA[踏上征途]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog2 v2.4]]></copyright>
<webMaster><![CDATA[(akins)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>Akins&#39;s Blog</title> 
	<url>http://www.iakins.com/images/logos.gif</url> 
	<link>http://www.iakins.com/</link> 
	<description>Akins&#39;s Blog</description> 
</image>

			<item>
			<link>http://www.iakins.com/default.asp?id=126</link>
			<title><![CDATA[VS 2005 web Project 一种错误的解决方法.]]></title>
			<author>(akins)</author>
			<category><![CDATA[编程 Programming]]></category>
			<pubDate>Fri,26 Dec 2008 17:35:30 +0800</pubDate>
			<guid>http://www.iakins.com/default.asp?id=126</guid>	
		<description><![CDATA[<p><strong>错误信息:<br /></strong>Error&nbsp;1&nbsp;未能加载文件或程序集&ldquo;Microsoft.Office.InfoPath.FormControl, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c&rdquo;或它的某一个依赖项。系统找不到指定的文件。&nbsp;D:\CSBHRMIS\CSBWeb\Web.config&nbsp;139&nbsp;<br /><br /><br />错误信息提到未能加载文件,我们就在google.cn上查找&quot;Microsoft.Office.InfoPath.FormControl&quot;,结果在MSDN的一篇文章里提到这个类是属于Microsoft.Office.InfoPath.FormControl.DLL文件的.</p>
<p>再对照Website下面的Bin 文件夹发现没有该文件，加之本机并无安装office 2007,自然就不会有Microsoft.Office.InfoPath.FormControl.dll这个文件了.</p>
<p>解决方法:从别的机器上COPY该DLL,装office 2007,选上Infopath 2007<br /></p>
<p><strong></strong></p>]]></description>
		</item>
		
			<item>
			<link>http://www.iakins.com/default.asp?id=125</link>
			<title><![CDATA[SQL SERVER 2005新增语法]]></title>
			<author>(akins)</author>
			<category><![CDATA[资料 documents]]></category>
			<pubDate>Fri,26 Dec 2008 16:21:08 +0800</pubDate>
			<guid>http://www.iakins.com/default.asp?id=125</guid>	
		<description><![CDATA[<p>SQL SERVER 2005已经出来好长时间了,一直没有静下心来仔细研究研究,最近刚刚弄了一个English Enterprise版本,把自己学到的和大家一起分享吧</p>
<p>1.表的同义名(Synonyms)</p>
<p>为表创建同义名,这样就可以在Select语句里边使用表的同义名了.注意在更改表的定义的时候只能使用表的原名,而不能使用表的同义名.</p>
<p>--创建同义名</p>
<p>Create SYNONYM <font face="NSimsun"><tt><em>syn_OR</em></tt><br /></font>FOR <em><font face="Courier New">dbo.Orders</font></em></p>
<p><font face="Courier New"><em>--</em>使用</font><font face="Arial">同义名查询表</font></p>
<p>select * from syn_OR</p>
<p>--删除同义名</p>
<p>Drop SYNONYM syn_OR</p>
<p>2.INTERSECT 操作符</p>
<p>INTERSECT操作符就是取表集A和表集B的交集.</p>
<p>--查询,Northwind数据库</p>
<p>select * from orders<br />intersect<br />select * from orders<br />where customerid='vinet'</p>
<p>3.<font face="Courier New">varchar(max)</font>,<font face="Courier New">nvarchar(max)</font>,<font face="Courier New">varbinary(max)数据类型.</font></p>
<p><font face="Courier New">还记得在大文本的时候,我们被迫使用text数据类型带来的不便吗?这回好了,2005带来的新的数据类型兼容以前的varchar数据类型,但是存储的空间更大了.varchar(max)和varbinary(max)可以存储2<sup>31</sup>,而nvarchar(max)可以存储2<sup>30</sup>字节,够用了吧!</font></p>
<p><font face="Courier New">--&nbsp;&nbsp; 创建测试表</font></p>
<p>create table #t(id int,Study_Varcharmax varchar(max))</p>
<p>--&nbsp;&nbsp; 插入数据<br />insert #t select 1,'Imagine this is a very long non-Unicode string'<br />insert #t select 2,'Imagine this is another very long non-Unicode string'</p>
<p>--&nbsp;&nbsp; 使用.write语法来进行更新</p>
<p>update #t<br />set Study_Varcharmax .write('n incredibly', 17, 5)<br />where id = 1</p>
<p>--&nbsp;&nbsp; 查询结果.<br />select * from #t<br />当然varchar(max)完全兼容以前的varchar数据类型,比如你可以在游标的fetch语句取得它的值,使用.write更新,在触发器的inserted或者deleted里边引用,还可以使用字符串函数如,len,substr等.<br /></p>
<p>4.Top后边的参数.</p>
<p>还记得Top后边不能使用参数给我们带来的不便吗?2005终于可以在Top后边使用参数了,快来和我一起试验吧!</p>
<p>DECLARE @n int<br />SET @n = 10</p>
<p>Select TOP(@n) *<br />FROM Products<br />ORDER BY UnitPrice DESC</p>
<p>5.获取DML语句所影响的行.</p>
<p>以前我们只能通过触发器来获取删除或者更新语句所影响的行的信息,现在我们只要使用新的Output语法,就能轻松的获取DML语句所影响的行的信息.</p>
<p>--&nbsp;&nbsp; 创建测试表,并插入测试数据</p>
<p>create table #t(id int,name varchar(200))</p>
<p>insert #t select 1,'first'<br />insert #t select 2,'second'</p>
<p>--&nbsp;&nbsp; 使用表变量来保存输出结果集.</p>
<p>declare @tb_t table(id int,name varchar(200))</p>
<p>update #t set name='abc' <br />output inserted.id,inserted.name into @tb_t<br />where id=1</p>
<p>select * from @tb_t</p>
<p>6.新增的Some,Any,All运算符.</p>
<p>语法:&lt;<tt><em><font face="NSimsun">scalar_expression</font></em></tt>&gt; { = | &lt;&gt; | != | &gt; | &gt;= | !&gt; | &lt; | &lt;= | !&lt;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {SOME | ANY} {<tt><em><font face="NSimsun">subquery</font></em></tt>}<br />子查询返回一个结果集,<font face="Courier New"><em>scalar_expression</em>和结果集任何一个比较成功,就返回True.</font></p>
<p>&lt;<tt><em><font face="NSimsun">scalar_expression</font></em></tt>&gt; { = | &lt;&gt; | != | &gt; | &gt;= | !&gt; | &lt; | &lt;= | !&lt;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; All {<tt><em><font face="NSimsun">subquery</font></em></tt>}</p>
<p>自查询返回一个结果集,<font face="Courier New"><em>scalar_expression</em>只有和结果集所有比较成功,才返回True.</font></p>
<p><font face="Courier New">刚接触这个运算符,感觉和in比较类似,而实际上如果合理运用,这个运算符的功能是非常强大的.</font></p>
<p><font face="Arial">select * </font></p>
<p><font face="Arial">from Products</font></p>
<font face="Arial">
<p><br />where CategoryID=any(select categoryid </p>
<p>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from dbo.Categories </p>
<p>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where categoryName in ('Produce','Seafood'))<br /><br /><br /></p>
</font>
<p>7.PIVOT and UNPIVOT</p>
<p>PIVOT and UNPIVOT的功能相信大家都已经熟悉了,我们结束了用拼凑SQL字符串的方式来进行行列转换的时代.但是Pivot的功能不只如此,我觉得它最大的功能是能让我们灵活的对数据表进行聚集分析,就像OLAP多维数据集那样.</p>
<p>-- Northwind的Order表:统计每个雇员在1996,1997,1998的定单数量.</p>
<p>select EmployeeID,[1996] as Y_1996,[1997] as Y_1997,[1998] as Y_1998<br />from<br />(<br />select EmployeeID,Year(OrderDate) as Year_Order,OrderID <br />from orders<br />) t<br />pivot<br />(count(OrderID) for Year_Order in ([1996],[1997],[1998])) pvt<br />order by EmployeeID</p>
<p>8.表值函数增强功能.</p>
<p>以前我们使用表值函数,只能用select * from 表值函数 的形式,如果我们想和别的表连接就做不到了.现在2005新增的{CROSS | OUTER} APPLY运算符可以让我们轻松的做到这一点.下边我就以一个例子来说明.</p>
<p>表1(t):sail&nbsp;&nbsp; cmd<br />9258&nbsp;&nbsp; LBQR|LB <br />92587&nbsp;&nbsp; A|19|1 </p>
<p><br />想变成如下的形式:</p>
<p>sail&nbsp;&nbsp; cmd<br />9258&nbsp;&nbsp; LBQR<br />9258&nbsp;&nbsp; LB <br />92587&nbsp;&nbsp; A<br />92587　19<br />92587　1<br />-- 步骤1:表值函数</p>
<p>create function dbo.fn_t(@sail int,@cmd varchar(1000))<br />returns @tb_t table(sail int,cmd varchar(1000))<br />as<br />begin<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(charindex('|',@cmd)&gt;0)&nbsp;&nbsp; -- 循环取得列表值,并插入@tb_t表里边.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert @tb_t select @sail,left(@cmd,charindex('|',@cmd)-1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set @cmd=stuff(@cmd,1,charindex('|',@cmd),'')<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert @tb_t select @sail,@cmd&nbsp;&nbsp; -- 插入最后一个值<br />return<br />end<br />Go</p>
<p>--&nbsp;&nbsp; 步骤2:查询</p>
<p>select t.sail,b.cmd<br />from&nbsp;&nbsp; t <br />&nbsp;&nbsp;&nbsp;&nbsp; cross apply&nbsp;&nbsp; dbo.fn_t(t.sail,t.cmd) b<br />order by&nbsp;&nbsp; t.sail</p>
<p>9.新的Ranking函数.</p>
<p>a.Row_Number()函数</p>
<p>--&nbsp;&nbsp; Northwind表：对顾客的City进行排名</p>
<p>select Row_Number() over(Order By City) as RowID,*<br />from Customers</p>
<p>--&nbsp;&nbsp; Northwind表:对国家内的城市进行排名</p>
<p>select Row_Number() over(Partition by Country order By City),*<br />from Customers<br />b.Dense_Rank()函数</p>
<p>总的来说，Dense_Rank()函数和Row_Number()函数的功能是类似的，只不过在排名结果上略有不同．在有相同的值的时候，Dense_Rank()排名是连续的，而Row_Number()排名是跳跃的．</p>
<p>10.错误处理.(try catch)</p>
<p>还记得我们在SQL脚本里边使用大量的if&nbsp;&nbsp; @@error&gt;0这样的语句来进行错误检测吗?现在好了,2005的try catch语法可以让我们轻松的进行错误检测.注意try catch 不能检测严重级小于等于10或者的错误,因为这样的错误只是一些警告信息.也不能检测严重级别大于20的的错误,因为这样的错误会终止数据库引擎的工作.</p>
<p>--&nbsp;&nbsp; 创建测试表</p>
<p>create table #t(id int identity(1,1),name varchar(100) not null)</p>
<p>--&nbsp;&nbsp; 执行脚本<br />begin try<br />insert #t(name) select Null&nbsp;&nbsp; --插入空值,违反了非空的约束条件.<br />end try<br />begin catch<br />select ERROR_NUMBER(&nbsp;&nbsp; ) ErrorNumber,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ERROR_STATE(&nbsp;&nbsp; ) ErrorState,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ERROR_SEVERITY(&nbsp;&nbsp; ) ErrorSeverity,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ERROR_MESSAGE(&nbsp;&nbsp; ) ErrorMessage<br />end catch<br />11.DDL触发器.</p>
<p>我记得以前我们总是为一个表的突然失踪而苦恼,不知道这个表被谁给删除了.现在好了,使用DDL触发器,我们可以追踪表的去向了.</p>
<p>--&nbsp;&nbsp; 测试表</p>
<p>create table t(id int identity(1,1),name varchar(100) not null)</p>
<p>--&nbsp;&nbsp; 日志记录表.记住详细信息是存储在xml类型中.</p>
<p>create table DB_Log(F_LogID int identity(1,1),F_Content xml not null)</p>
<p>--&nbsp;&nbsp; 创建触发器.</p>
<p>create trigger tri_t<br />on database<br />for create_table,drop_table<br />as<br />insert into DB_Log values(EventData())<br />Go</p>
<p>--删除表</p>
<p>drop table t</p>
<p>select * from DB_Log</p>
<p>--&nbsp;&nbsp; 追踪信息.看起来信息非常详细的.足够我们把&quot;凶手&quot;追查出来的.</p>
<p>&lt;EVENT_INSTANCE&gt;<br />&nbsp;&nbsp; &lt;EventType&gt;Drop_TABLE&lt;/EventType&gt;<br />&nbsp;&nbsp; &lt;PostTime&gt;2006-05-13T09:11:15.767&lt;/PostTime&gt;<br />&nbsp;&nbsp; &lt;SPID&gt;54&lt;/SPID&gt;<br />&nbsp;&nbsp; &lt;ServerName&gt;LILY\STUDY2005&lt;/ServerName&gt;<br />&nbsp;&nbsp; &lt;LoginName&gt;LILY\Administrator&lt;/LoginName&gt;<br />&nbsp;&nbsp; &lt;UserName&gt;dbo&lt;/UserName&gt;<br />&nbsp;&nbsp; &lt;DatabaseName&gt;Northwind&lt;/DatabaseName&gt;<br />&nbsp;&nbsp; &lt;SchemaName&gt;dbo&lt;/SchemaName&gt;<br />&nbsp;&nbsp; &lt;ObjectName&gt;t&lt;/ObjectName&gt;<br />&nbsp;&nbsp; &lt;ObjectType&gt;TABLE&lt;/ObjectType&gt;<br />&nbsp;&nbsp; &lt;TSQLCommand&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;SetOptions ANSI_NULLS=&quot;ON&quot; ANSI_NULL_DEFAULT=&quot;ON&quot; ANSI_PADDING=&quot;ON&quot; QUOTED_IDENTIFIER=&quot;ON&quot; ENCRYPTED=&quot;FALSE&quot; /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;CommandText&gt;drop table t<br />&lt;/CommandText&gt;<br />&nbsp;&nbsp; &lt;/TSQLCommand&gt;<br />&lt;/EVENT_INSTANCE&gt;<br />12.使用OpenRowSet来读取数据文件.</p>
<p>以前我们只能用OpenRowSet来读取别的数据源的数据,但是对于数据文件的读取就不那边方便了.新的OpenRowSet语法增加了Bulk功能,可以让我们直接从数据文件里边读取数据.</p>
<p>--&nbsp;&nbsp; 生成用于测试的数据文件和格式文件.(以Northwind的Customers表为例)</p>
<p>Bcp Northwind.dbo.Customers out D:\Customer.txt&nbsp;&nbsp; -T -c</p>
<p>Bcp Northwind.dbo.Customers format nul -f D:\Customer.fmt&nbsp;&nbsp; -T -c</p>
<p>--&nbsp;&nbsp; 使用OpenRowSet来读取刚才生成的数据文件.</p>
<p>select *</p>
<p>from OpenRowSet(Bulk N'D:\Customer.txt',FormatFile=N'D:\Customer.fmt') as t</p>
<p>13.外连接的另类语法.</p>
<p>以前内连接我们可以使用where来代替,但是外连接就没有这样的语法了.2005新推出的*=和=*让我们做到了这点.</p>
<p>--&nbsp;&nbsp; Northwind</p>
<p>select a.*,b.*<br />from Products a,Categories b<br />where a.CategoryID*=b.CategoryID</p>]]></description>
		</item>
		
			<item>
			<link>http://www.iakins.com/default.asp?id=124</link>
			<title><![CDATA[Visual SourceSafe 2005(Vss2005)使用经验总结]]></title>
			<author>(akins)</author>
			<category><![CDATA[项目管理]]></category>
			<pubDate>Fri,26 Dec 2008 15:41:35 +0800</pubDate>
			<guid>http://www.iakins.com/default.asp?id=124</guid>	
		<description><![CDATA[<p><strong>vss2005中的符号所代表的意义：</strong><br />小人代表别人已经签出了这个文件<br />对号代表 你自己签出了文件<br />小锁是没有人签出的文件<br />加号是已经在版本数据库中删除了的页面。<br /><strong>连接方式： <br /></strong>局域网方式连接 <br />Internet 方式连接 <br />在局域网方式连接时，需要输入自己的 vss 登陆帐号，账号可以通过管理器，自己在 vss 系统中注册； <br />Internet 连接时默认使用的是 vss 中的 administrator 账号； <br />请大家都使用自己英文名字的账号登陆 vss ，这样在出现文件无法签出时，可以根据账号，找到指定人员。 <br /><strong>签出文件：</strong> <br />每次仅签出需要的文件，无关文件不要签出； <br />公用文件修改时，尽量使用重构功能，保证旧的代码、用法不受修改的影响； <br /><strong>签入文件：</strong> <br />保证签入的文件后，项目可以编译通过 <br />如果文件依赖其他文件中的代码，则相应的文件需要同时签入。 <br />签出修改他人创建文件： <br />应该先与创建人联系是否可以修改 <br />修改后，应该及时签入文件 </p>
<p><br /><strong>每日下班时，请检查以下项目： <br /></strong>是否签出了别人文件。 <br />是否签出了公用代码。 <br />是否有无法编译通过的代码签入了； <br />相同账号在不同机器登陆，会被认为是不同用户； <br />必须强行签入文件时，需要使用和签出账号相同的账号； <br />Guest 帐户为无密码帐户，所以用该帐户登陆，不会提示输入密码，所以尽量不要用该帐户登陆，防止账号错误； <br />Internet 方式连接也会使用 administrator 帐户自动登陆。 <br />编程时发现代码错误出现在锁定项目时，先获取新版本，在继续编译，如果错误继续存在，则和在页面创建者联系是否嵌入错误；</p>]]></description>
		</item>
		
			<item>
			<link>http://www.iakins.com/default.asp?id=123</link>
			<title><![CDATA[我对如何做好Team Leader的认识]]></title>
			<author>(akins)</author>
			<category><![CDATA[项目管理]]></category>
			<pubDate>Mon,22 Dec 2008 16:47:31 +0800</pubDate>
			<guid>http://www.iakins.com/default.asp?id=123</guid>	
		<description><![CDATA[<p>TeamLeader是比较尴尬的角色，是从技术往管理的一个尝试性的阶段，这个阶段是比较辛苦的，因为你是技术的领头人，又要安排好几个下属的工作。我做过一段时间半调子的TL，觉得做TL的应该注意到几点：</p>
<p>1. TL首先要注意自己的定位，许多事情你都有责任。从单位的角度，是希望你能站在他们的立场上把事情做好；从下属的角度，他们希望能够遇到一个开明的头。所 以你一开始就要注意好你的策略，你是否和你的上层有明确的沟通，你能做到什么，什么你不能做；你决定你自己是站在哪一方面，当你决定你站在一方面以后，自 然跟另一方面就有对立的地方，你如何缓和这样的气氛。在大的公司里，由于制度的完善，这些还是比较容易做到的，怕就怕在一些没有具体制度的地方，会带来一 定程度的混乱。</p>
<p>&nbsp;</p>
<p>2. TL要了解到自己Team的消化能力，对自己要了解清楚。不能因为自己掌握了所有的技术要点，就认为手下也掌握，后者说，知道手下没有掌握，但是认为有自 己在不会出问题。说下常犯的几个问题，有些TL为了迎合单位的胃口，不管设计文档的复杂度如何，一口全部答应，这就包含着相当的风险，回头你是要对上负责 的，同时你又是要对下面人负责的，下面人搞不定的事情，最后全部堆在你这里，增加自己的负担；所以说，对自己组的消化能力要有充分的了解，这样能决定你担 多少的重任。该修改的修改，该推却的推却，我们做一件事情，要么成功，要么不做，不要一味的争取表现。</p>
<p>&nbsp;</p>
<p>3. 个人认为，做一个程序员，首先最最重要的是会做人，现在这个社会没有谁缺不了谁，互相配合才能做的更好。程序员常有的几个性格缺陷：虚荣，攀比，好斗；虚 荣，喜欢说一些别人不大知道的名词显得自己博学，或者是好为人师；攀比，听到别人说的名词，自己赶紧去想知道是什么；好斗，喜欢跟人家争论一些皮毛问题； 这些都是大忌。除了自己要修正性格缺陷以外，还要多关心下属的状态。要用安慰和潜移默化的方式改正掉他们的缺点，切忌正面冲突，这更加激化他们好斗的本 性；TL自己在为人处事方面要很注意。虽然TL是技术头头，但真正让你用技术去压制其他人的机会很少很少，大多数时候要注意跟人表达的方式。不要制造的办 公事整天就是你的吼叫，跟第三方的人员交流的时候尤其要注意，你的态度会影响到属下，如果你对一个第三方人员不满而出言不逊，你的下属后续也会跟进。问题 总是在和平的方式下更容易解决。</p>
<p>&nbsp;</p>
<p>4. 作为TL，要注意制度和习惯。习惯就是，你做计划表的习惯；要会做计划，掌握预期进度；制度更要注意。毕竟你没有行政权力，不能够摆官腔，不宜用强制的方 式开周会，下达强硬的计划等等，许多计划和制度，你要暗暗记在本子上，潜移默化的进行，你主要负责对你的老板做一个进度报告，照顾好下属让他们能够在计划 内做好事情。强制的开周会，下达计划是很威风，但是容易导致抵触情绪。</p>
<p>&nbsp;</p>
<p>以上是我的一些经验，我比较注意为人处世方面进行着手，至于技术，做过TL的都知道，除非你没有很好的计划性和习惯，不然下属培养一段时间后是很容 易自己的问题自己解决的，靠自己一直出面解决难题，那你就进入了死循环，永远跳不出来。希望我这翻没有经过整理的言论能够对您有帮助，谢谢。</p>]]></description>
		</item>
		
			<item>
			<link>http://www.iakins.com/default.asp?id=122</link>
			<title><![CDATA[项目管理实战之团队管理 ]]></title>
			<author>(akins)</author>
			<category><![CDATA[项目管理]]></category>
			<pubDate>Mon,22 Dec 2008 15:59:11 +0800</pubDate>
			<guid>http://www.iakins.com/default.asp?id=122</guid>	
		<description><![CDATA[一个系统不仅需要优秀的分析和设计，更需要一个良好的过程将其从蓝图转化为实现。这个过程中最重要的是对团队的管理，也就是人的管理。一个优秀的团队和一个糟糕的团队的效能是天壤之别，她们之间的比例不是1:100或1:1000这样量化的数字能够表示的。就像一个团队建造了一幢摩天大楼屹立于云霄，而另一个团队的建筑物还没有10米高便开始摇摇欲坠！这是质的差别，也是团队灵魂的差别。<br />&nbsp;&nbsp;&nbsp;&nbsp;而团队的领头人就是项目经理，他的能力/素质直接影响着项目的成败！我们不需要一个团队的所有成员个个都是优秀的，但是为了确保你的项目成功，请雇佣一个优秀的项目经理！<br />&nbsp;&nbsp;&nbsp;&nbsp;以前，自己通常都是单干，最多时也是两三个人合作，项目进展良好。现在负责一个较大项目开发，需要协调整个团队成员，保证项目的进展。原以为，这是一件很简单的事情，和以前一样嘛。结果随着项目的进展，问题越来越多，而其中的绝大多数问题都不是技术上的，而是对组员管理协调的问题。想使一个团队高效并保持高效，我们需要花不少的气力。以下几点是从我前段时间的实践中总结出来的，只是自己的经验小结，也并没有打算写成一篇完整的关于团队管理的论文，毕竟在这方面自己的功力还浅薄的很。希望和大家多多交流这方面的心得。对团队的管理需要重视以下几个方面：&nbsp;<br />(1)让合适的人做合适的事。了解每一个组员的知识结构和背景，知道他们各自擅长什么，把任务安排给能最有效最迅速解决它的人。<br /><br />(2)把项目的主要功能/任务以列表的形式形成文档、把每个组员的阶段任务以列表的形式形成文档。这是重要的，否则，你自己和你的组员将会常常忘记目标是什么、自己要做什么。<br /><br />(3)不要给组员我们的项目不着急的感觉。让每个组员都有紧迫感。一个安逸/懒散的团体不可能按时按质提交项目，即使这个项目本质上并不紧迫。<br /><br />(4)在组员的上一阶段任务提交之前，就应当安排好该组员的下一阶段任务。不要让任何一个组员闲散着。因为无论在什么时候，系统的任何一个模块都有改进/重构/整理的需要，我们的设计/实现永远都不够优秀。<br /><br />(5)对某一特定的环节，清晰明确地告诉你的组员你想要的是什么，否则，你就准备把同样的事情告诉他第二遍第三遍。让另外一个人完整地了解你的意图不是一件简单的事情。<br /><br />(6)充分地交流。就这个项目而言，你和你的组员之间的交流可能还远远不够！<br /><br />(7)锻炼/指导你的组员、相信你的组员。如果作为项目经理的你是个优秀的程序员，那么千万不要相信自己能完成所有的主要/核心功能。你也许可以完成某一模块，但是更多的模块是由你的组员完成的。<br /><br />(8)千万不要惟我独尊。也许你很坚信自己的方案是优秀的，但是如果你的组员提出了新的方案，那么请你重视这个新方案，并一视同仁的从这两个方案中抉择更适用于当前项目的那个。我就从组员那里吸收了很多精彩的想法，并将它们运用到项目中。<br /><br />(9)坚决的执行力！前提是你必须有足够的判断力和决断力。当有些议题没有结论的时候，你需要来拍板。<br /><br />(10)公平公正的对待每个组员。千万不要偏袒任何一个！<br /><br />(11)请记住，项目经理不是&ldquo;官&rdquo;。<br />]]></description>
		</item>
		
			<item>
			<link>http://www.iakins.com/default.asp?id=121</link>
			<title><![CDATA[做一个合格的Team Leader －－ 基本概念]]></title>
			<author>(akins)</author>
			<category><![CDATA[项目管理]]></category>
			<pubDate>Mon,22 Dec 2008 15:41:25 +0800</pubDate>
			<guid>http://www.iakins.com/default.asp?id=121</guid>	
		<description><![CDATA[1.领导和管理<br/>&nbsp;&nbsp; 人们乐于被领导；他们不喜欢被管理，不喜欢像牛一样被驱赶或指挥。<br/>&nbsp;&nbsp; 管理者强迫人们服从他们的命令，而领导者则会带领他们一起工作。<br/>&nbsp;&nbsp; 管理是客观的，没有个人感情因素，它假定被管理者没有思想和感受，必须被告知要做什么和该如何做。管理适合处理无生命的对象或者例行公事。<br/>&nbsp;&nbsp; 领导是引领、引导，它激励人们达成目标。领导力是带有强烈个人感情色彩的，它不是你能命令的，也不是你能测量评估和测试的。<br/><br/>2.变革型领导（内在激励）和交易型领导（外在激励）的区别。<br/><br/>3.Team Leader的任务<br/>&nbsp;&nbsp; 从一个更概括性的层次上，Team Leader的工作中最优先的任务如下：<br/>（1）按期、按预算交付高质量的产品。<br/>（2）确保团队完成高质量的工作。<br/>（3）建设有凝聚力和高回报的团队环境，并促使高效的团队协作。<br/>&nbsp;&nbsp; 另外，Team Leader还有一些重要的工作：<br/>（1）保持团队目标清晰明确，并且确保每一个组员都了解他目前的任务对达到这一目标有多大贡献。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 目标是很重要的，它提供关注的焦点、动力和活力，这些要素可以帮助团队获得成功。<br/>（2）为团队树立榜样。“老板的速度就是团队的速度。”<br/>（3）相信团队，并鼓励团队做到最好。<br/>（4）Team Leader必须为团队所做的每一件事承担责任。<br/>（5）生产率与工作环境的稳定性是直接相关的，工作环境的变化必须控制在一定的速度和比例内，才不会超出组织的容忍度。<br/><br/>4.三种激励手段：恐吓、贪念、承诺。<br/>&nbsp;&nbsp; 如果管理层采用威胁和恐吓作为激励手段，将会导致人们沿着马斯洛层级向下移动。<br/>&nbsp;&nbsp; 基于报酬（贪念）的激励体系的问题在于，人类活动很少有可以简单倒用评价方法直接度量的程度。<br/>&nbsp;&nbsp; 使用经济或类似的奖励手段的激励体系会将员工的工作目标转为报酬，这将代替自我实现的渴望。<br/>&nbsp;&nbsp; 承诺是最好的激励手段，它之所以有作用，完全在于个体或团队信守诺言的欲望。有效的承诺激励必须满足以下条件：<br/>（1）承诺必须是自愿的。<br/>（2）承诺必须是可见的。<br/>（3）承诺必须可信（由计划支持）。<br/>（4）做出承诺的人必须是完成所需工作的人。<br/><br/>5.强化承诺<br/>&nbsp;&nbsp; 另外，需要有一种方式可以在工作中周期性的强化承诺。要想提供及时的反馈，需要把完整的承诺拆分为里程碑，它们可以对进度进行间接的过程测量。<br/>&nbsp;&nbsp; 反馈很重要，因为它提供了迈向目标进度的证据<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.iakins.com/default.asp?id=120</link>
			<title><![CDATA[不错的视频]]></title>
			<author>(akins)</author>
			<category><![CDATA[News 相关新闻]]></category>
			<pubDate>Fri,12 Dec 2008 18:04:14 +0800</pubDate>
			<guid>http://www.iakins.com/default.asp?id=120</guid>	
		<description><![CDATA[<embed src="http://player.youku.com/player.php/sid/11216428/v.swf" width="400" height="300" type="application/x-shockwave-flash"></embed><br /><br />如果没有通过音频编辑软件修改,单靠个人就能变声唱成这样,那就太强了....]]></description>
		</item>
		
			<item>
			<link>http://www.iakins.com/default.asp?id=118</link>
			<title><![CDATA[一个很头痛的SWF加载问题,及解决方法]]></title>
			<author>(akins)</author>
			<category><![CDATA[Flash AS3 3D]]></category>
			<pubDate>Wed,10 Dec 2008 15:37:30 +0800</pubDate>
			<guid>http://www.iakins.com/default.asp?id=118</guid>	
		<description><![CDATA[两个SWF(一个主SWF,一个作为模块准备<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%BC%D3%D4%D8">加载</span>进主SWF). 分别运行都没有问题. 但是一旦加载进去就出问题了.<br />报错:<br />=============================<br />TypeError: Error #1009: 无法访问空对象引用的<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%CA%F4%D0%D4">属性</span>或方法。<br /><br /><br />问题出在stage属性为null身上.<br />害死个人的stage啊~~ (哭)<br />====================<br />细部分析和总结:<br />由于主SWF和子SWF单独运行都没有问题,一旦要求主SWF加载子SWF的时候就报找不对象或者属性这个问题.导致子SWF不能顺利运行.<br />原因在子SWF的stage属性上. 单独运行的子SWF的时候,实例已经处于舞台上.所以子SWF的stage属性是事实存在的.所以在子SWF类构造函数中引用stage属性是正常的.但是一旦被主SWF加载的时候.主SWF还没有来得及addChild(子SWF),导致子SWF的stage属性为null.在过构造函数中引用值为null的stage导致错误发生.以至于不能正常加载.<br /><br />=========<br />解决这个问题办法:<br />&nbsp; &nbsp;&nbsp; &nbsp;在子SWF类构造函数中加入(红色)<br />//举例code:<br />//===============<br />package{<br />&nbsp; &nbsp; import flash.display.MovieClip;<br />&nbsp; &nbsp; import flash.events.Event;<br />&nbsp; &nbsp; public class&nbsp;&nbsp;testClass extends MovieClip{<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;public function testClass():void<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;{<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<font color="#ff0000">this.addEventListener(Event.ADDED_TO_STAGE,onStageHandler);</font><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;}<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;priatve function onStageHandler(evt:Event)<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; {<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; init()<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; this.removeEventListener(Event.ADDED_TO_STAGE,onStageHandler);<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; }<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; priatve function init():void<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;{<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; //子SWF的主体构CODE放这里.<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;//对stage属性的引用<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br />&nbsp; &nbsp; }//endclass<br />}//endpackage<br /><br />]]></description>
		</item>
		
			<item>
			<link>http://www.iakins.com/default.asp?id=117</link>
			<title><![CDATA[AS3 关于Depth的问题]]></title>
			<author>(akins)</author>
			<category><![CDATA[Flash AS3 3D]]></category>
			<pubDate>Wed,10 Dec 2008 12:28:00 +0800</pubDate>
			<guid>http://www.iakins.com/default.asp?id=117</guid>	
		<description><![CDATA[&nbsp;&nbsp; As2里面里有关于深度的函数方法 SwapDepths&nbsp;,getNextHighestDepth.&nbsp;但AS3里没有这样的函数来处理.所以AS2 转AS3 关于深度很多朋友不适应.
<p>AS3里的深度其实处理起来并不复杂,不过得弄清楚机制.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>对于已经在舞台存在的对象，不管你文档原来有多少个层，AS3只会看对象的数量，每多一个对象，层的序数自动加1. <br />比方说，你在Flash里面有3个层，第一层（最低的），有1个MC，叫AAAA，和一些用绘图工具画的东西，第二层，也有一个MC ，叫BBBB，同样也有一些绘图工具画的东西。第三层，有个MC叫CCCC .好了，那么不管你第一层 用绘图工具画了什么东西，有多少个组，组的层叠情况怎样，统统都只属于一个 Shape 对象，AAAA是一个MC对象，那么第一层就有2个对象了，他们分别获得0和1的序数顺序，第二层也是，无论用绘图工具画了什么也被视作一个Shape对象，还有一个 BBBB的MC对象，他们获得，2和3序数，第三层CCCC获得 4。那么这个文件就一共有5个对象。 <br /><br />所谓深度自动分配，就是中间不会出现空的索引，都是连续的序数来的。不象AS2那样可以随便指定深度。 <br /><br />AS3要卸载任何显示对象，都可以用<a href="http://www.51as.com/" target="_blank">removeChild</a>()来从显示列表中删除。但removeChild不会把对象完全销毁。可以用AddChild来重新加载他。</p>
<p>所以实际上AS3里已经把深度变成索引(index)的概念. DisplayObject&nbsp; 对象也就是 MovieClip&nbsp;, Sprite 里提供一些函数了,改变或者获取这个索引.</p>
<p>例如:</p>
<span style="FONT-WEIGHT: bold">getChildAt(index:int):DisplayObject <br />返回位于指定索引处的子显示对象实例。
<p><a href="http://www.51as.com/" target="_blank">getChildIndex</a>(child:DisplayObject):int <br />返回 DisplayObject 的 child 实例的索引位置。</p>
<p>&nbsp;setChildIndex(child:DisplayObject, index:int):void <br />更改现有子项在显示对象容器中的位置。 </p>
<p>swapChildren(child1:DisplayObject, child2:DisplayObject):void <br />交换两个指定子对象的 Z 轴顺序（从前到后顺序）。 </p>
<p>swapChildrenAt(index1:int, index2:int):void <br />在子级列表中两个指定的索引位置，交换子对象的 Z 轴顺序（前后顺序）。</p>
<p>removeChildAt(index:int):DisplayObject <br />从 DisplayObjectContainer 的子列表中指定的 index 位置删除子 DisplayObject。</p>
</span>]]></description>
		</item>
		
			<item>
			<link>http://www.iakins.com/default.asp?id=116</link>
			<title><![CDATA[eval 函数 ]]></title>
			<author>(akins)</author>
			<category><![CDATA[Flash AS3 3D]]></category>
			<pubDate>Tue,09 Dec 2008 15:27:24 +0800</pubDate>
			<guid>http://www.iakins.com/default.asp?id=116</guid>	
		<description><![CDATA[<h1><span class="searchhilite">eval</span> 函数 </h1>
<!--googleoff: index--><!-- END PAGE TITLE --><!-- BEGIN CONTENT WRAPPER -->
<div id="content_wrapper"><!--googleon: index-->
<div>
<p><samp class="codeph"><span class="searchhilite"><samp class="codeph">eval</samp></span>(</samp><i><samp class="codeph">expression:Object</samp></i><samp class="codeph">) </samp><i><samp class="codeph">:Object</samp></i><samp class="codeph"><span class="searchhilite"><samp class="codeph">eval</samp></span>(</samp><i><samp class="codeph">expression:String</samp></i><samp class="codeph">) </samp><i><samp class="codeph">: Object</samp></i></p>
<p>按名称访问变量、属性、对象或影片剪辑。 如果表达式是变量或属性，则返回该变量或属性的值。 如果表达式是对象或影片剪辑，则返回对该对象或影片剪辑的引用。 如果找不到表达式中指定的元素，则返回 undefined。</p>
<p>在 Flash 4 中，<samp class="codeph"><span class="searchhilite"><samp class="codeph">eval</samp></span>()</samp> 用于模拟数组；在 Flash 5 或更高版本中，您应该使用 Array 类来模拟数组。</p>
<p>在 Flash 4 中，您还可以使用 <samp class="codeph"><span class="searchhilite"><samp class="codeph">eval</samp></span>()</samp> 动态地设置和检索变量值或实例名称。 然而，也可以使用数组访问运算符 (<samp class="codeph">[]</samp>) 来实现这一点。</p>
<p>在 Flash 5 或更高版本中，不能使用 <samp class="codeph"><span class="searchhilite"><samp class="codeph">eval</samp></span>()</samp> 动态设置和检索变量值或实例名称，因为不能在等式的左侧使用 <samp class="codeph"><span class="searchhilite"><samp class="codeph">eval</samp></span>()</samp>。 例如，将代码</p>
<p><samp class="codeph"><span class="searchhilite"><samp class="codeph">eval</samp></span> (&quot;var&quot; + i) = &quot;first&quot;;</samp></p>
<p>替换为：</p>
<p><samp class="codeph">this[&quot;var&quot;+i] = &quot;first&quot;</samp></p>
<p>或者替换为：</p>
<p><samp class="codeph">set (&quot;var&quot; + i, &quot;first&quot;);</samp></p>
<p><a id="143676" name="143676"></a><strong>参数</strong></p>
<p><dfn class="term">expression</dfn><samp class="codeph">:Object</samp> -- 要检索的变量、属性、对象或影片剪辑的名称。 此参数可以是一个字符串，也可以是对对象实例的直接引用（也就是说，引号 (&quot; &quot;) 是可选的）。</p>
<p><a id="143680" name="143680"></a><strong>返回</strong></p>
<p><samp class="codeph">Object</samp> -- 一个值（对对象或影片剪辑的引用）或 <samp class="codeph">undefined</samp>。</p>
<p><a id="143684" name="143684"></a><strong>示例</strong></p>
<p>下面的示例使用 <samp class="codeph"><span class="searchhilite"><samp class="codeph">eval</samp></span>()</samp> 为动态命名的影片剪辑设置属性。 此 ActionScript 为三个影片剪辑（分别称为 <samp class="codeph">square1_mc</samp>、<samp class="codeph">square2_mc</samp> 和 <samp class="codeph">square3_mc</samp>）设置 <samp class="codeph">_rotation</samp> 属性。</p>
<pre>for (var i = 1; i &lt;= 3; i++) {
setProperty(<span class="searchhilite">eval</span>(&quot;square&quot;+i+&quot;_mc&quot;), _rotation, 5);
}
</pre>
<p>也可以使用以下 ActionScript：</p>
<pre>for (var i = 1; i &lt;= 3; i++) {
this[&quot;square&quot;+i+&quot;_mc&quot;]._rotation = -5;
}
</pre>
</div>
</div>]]></description>
		</item>
		
</channel>
</rss>