<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>豆皮儿</title>
	<atom:link href="http://www.doupie.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.doupie.com</link>
	<description>程序员的豆皮</description>
	<lastBuildDate>Thu, 02 Sep 2010 07:40:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>crontab</title>
		<link>http://www.doupie.com/2010/09/02/crontab/</link>
		<comments>http://www.doupie.com/2010/09/02/crontab/#comments</comments>
		<pubDate>Thu, 02 Sep 2010 07:40:53 +0000</pubDate>
		<dc:creator>Jayson</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[crontab]]></category>

		<guid isPermaLink="false">http://www.doupie.com/?p=548</guid>
		<description><![CDATA[名称 : crontab 使用权限 : root用户和crontab文件的所有者 语法 : crontab [-e [UserName]&#124;-l [UserName]&#124;-r [UserName]&#124;-v [UserName]&#124;File ] 说明 : crontab 是用来让使用者在固定时间或固定间隔执行程式之用，换句话说，也就是类似使用者的时程表。-u user 是指设定指定 user 的时程表，这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话，就是表示设定自己的时程表。 参数 : -e [UserName]: 执行文字编辑器来设定时程表，内定的文字编辑器是 VI，如果你想用别的文字编辑器，则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe) -r [UserName]: 删除目前的时程表 -l [UserName]: 列出目前的时程表 -v [UserName]:列出用户cron作业的状态 时程表的格式如下 : f1 f2 f3 f4 f5 program 其中 [...]]]></description>
			<content:encoded><![CDATA[<p><strong>名称</strong> : crontab<br />
<strong>使用权限</strong> : root用户和crontab文件的所有者<br />
<strong>语法</strong> :<br />
crontab [-e [UserName]|-l [UserName]|-r [UserName]|-v [UserName]|File ]<br />
<strong>说明</strong> :<br />
crontab 是用来让使用者在固定时间或固定间隔执行程式之用，换句话说，也就是类似使用者的时程表。-u user 是指设定指定 user 的时程表，这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话，就是表示设定自己的时程表。<br />
<strong>参数</strong> :<br />
-e [UserName]: 执行文字编辑器来设定时程表，内定的文字编辑器是 VI，如果你想用别的文字编辑器，则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)<br />
-r [UserName]: 删除目前的时程表<br />
-l [UserName]: 列出目前的时程表<br />
-v [UserName]:列出用户cron作业的状态<br />
<strong>时程表的格式如下</strong> :<br />
f1 f2 f3 f4 f5 program<br />
其中 f1 是表示分钟，f2 表示小时，f3 表示一个月份中的第几日，f4 表示月份，f5 表示一个星期中的第几天。program 表示要执行的程式。<br />
当 f1 为 * 时表示每分钟都要执行 program，f2 为 * 时表示每小时都要执行程式，其余类推<br />
当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行，f2 为 a-b 时表示从第 a 到第 b 小时都要执行，其余类推<br />
当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次，f2 为 */n 表示每 n 小时个时间间隔执行一次，其余类推<br />
当 f1 为 a, b, c,&#8230; 时表示第 a, b, c,&#8230; 分钟要执行，f2 为 a, b, c,&#8230; 时表示第 a, b, c&#8230;个小时要执行，其余类推<br />
使用者也可以将所有的设定先存放在档案 file 中，用 crontab file 的方式来设定时程表。<br />
<strong>使用方法</strong>:<br />
用VI编辑一个文件 cronfile，然后在这个文件中输入格式良好的时程表。编辑完成后，保存并退出。<br />
在命令行输入<br />
$: crontab cronfile<br />
这样就将cronfile文件提交给c r o n进程，同时，新创建cronfile的一个副本已经被放在/ v a r / s p o o l / c r o n目录中，文件名就是用户名。<br />
<strong>例子</strong> :<br />
每月每天每小时的第 0 分钟执行一次 /bin/ls :<br />
0 * * * * /bin/ls<br />
在 12 月内, 每天的早上 6 点到 12 点中，每隔 20 分钟执行一次 /usr/bin/backup :<br />
*/20 6-12 * 12 * /usr/bin/backup<br />
周一到周五每天下午 5:00 寄一封信给 alex@domain.name :<br />
0 17 * * 1-5 mail -s &#8220;hi&#8221; alex@domain.name &lt; /tmp/maildata<br />
每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分&#8230;.执行 echo &#8220;haha&#8221;<br />
20 0-23/2 * * * echo &#8220;haha&#8221;<br />
<strong>注意</strong> :<br />
当程式在你所指定的时间执行后，系统会寄一封信给你，显示该程式执行的内容，若是你不希望收到这样的信，请在每一行空一格之后加上 &gt; /dev/null 2&gt;&amp;1 即可。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.doupie.com/2010/09/02/crontab/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>学习算法之路</title>
		<link>http://www.doupie.com/2010/08/21/%e5%ad%a6%e4%b9%a0%e7%ae%97%e6%b3%95%e4%b9%8b%e8%b7%af/</link>
		<comments>http://www.doupie.com/2010/08/21/%e5%ad%a6%e4%b9%a0%e7%ae%97%e6%b3%95%e4%b9%8b%e8%b7%af/#comments</comments>
		<pubDate>Sat, 21 Aug 2010 05:19:11 +0000</pubDate>
		<dc:creator>Jayson</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[分享]]></category>

		<guid isPermaLink="false">http://www.doupie.com/?p=544</guid>
		<description><![CDATA[第一阶段：练经典常用算法，下面的每个算法给我打上十到二十遍，同时自己精简代码， 因为太常用，所以要练到写时不用想，10-15分钟内打完，甚至关掉显示器都可以把程序打 出来. 1.最短路(Floyd、Dijstra,BellmanFord) 2.最小生成树(先写个prim,kruscal要用并查集，不好写) 3.大数（高精度）加减乘除 4.二分查找. (代码可在五行以内) 5.叉乘、判线段相交、然后写个凸包. 6.BFS、DFS,同时熟练hash表(要熟，要灵活,代码要简) 7.数学上的有：辗转相除（两行内），线段交点、多角形面积公式. 8. 调用系统的qsort, 技巧很多，慢慢掌握. 9. 任意进制间的转换 第二阶段：练习复杂一点，但也较常用的算法。 如： 1. 二分图匹配（匈牙利），最小路径覆盖 2. 网络流，最小费用流。 3. 线段树. 4. 并查集。 5. 熟悉动态规划的各个典型：LCS、最长递增子串、三角剖分、记忆化dp 6.博弈类算法。博弈树，二进制法等。 7.最大团，最大独立集。 8.判断点在多边形内。 9. 差分约束系统. 10. 双向广度搜索、A*算法，最小耗散优先. 相关的知识 图论 路径问题 0/1边权最短路径 BFS 非负边权最短路径（Dijkstra） 可以用Dijkstra解决问题的特征 负边权最短路径 Bellman-Ford Bellman-Ford的Yen-氏优化 差分约束系统 Floyd 广义路径问题 传递闭包 极小极大距离 / 极大极小距离 Euler Path / [...]]]></description>
			<content:encoded><![CDATA[<p>第一阶段：练经典常用算法，下面的每个算法给我打上十到二十遍，同时自己精简代码，</p>
<p>因为太常用，所以要练到写时不用想，10-15分钟内打完，甚至关掉显示器都可以把程序打</p>
<p>出来.</p>
<p>1.最短路(Floyd、Dijstra,BellmanFord)</p>
<p>2.最小生成树(先写个prim,kruscal要用并查集，不好写)</p>
<p>3.大数（高精度）加减乘除</p>
<p>4.二分查找. (代码可在五行以内)</p>
<p>5.叉乘、判线段相交、然后写个凸包.</p>
<p>6.BFS、DFS,同时熟练hash表(要熟，要灵活,代码要简)</p>
<p>7.数学上的有：辗转相除（两行内），线段交点、多角形面积公式.</p>
<p>8. 调用系统的qsort, 技巧很多，慢慢掌握.</p>
<p>9. 任意进制间的转换</p>
<p>第二阶段：练习复杂一点，但也较常用的算法。</p>
<p>如：</p>
<p>1. 二分图匹配（匈牙利），最小路径覆盖</p>
<p>2. 网络流，最小费用流。</p>
<p>3. 线段树.</p>
<p>4. 并查集。</p>
<p>5. 熟悉动态规划的各个典型：LCS、最长递增子串、三角剖分、记忆化dp</p>
<p>6.博弈类算法。博弈树，二进制法等。</p>
<p>7.最大团，最大独立集。</p>
<p>8.判断点在多边形内。</p>
<p>9. 差分约束系统.</p>
<p>10. 双向广度搜索、A*算法，最小耗散优先.</p>
<p>相关的知识</p>
<p>图论</p>
<p>路径问题</p>
<p>0/1边权最短路径</p>
<p>BFS</p>
<p>非负边权最短路径（Dijkstra）</p>
<p>可以用Dijkstra解决问题的特征</p>
<p>负边权最短路径</p>
<p>Bellman-Ford</p>
<p>Bellman-Ford的Yen-氏优化</p>
<p>差分约束系统</p>
<p>Floyd</p>
<p>广义路径问题</p>
<p>传递闭包</p>
<p>极小极大距离 / 极大极小距离</p>
<p>Euler Path / Tour</p>
<p>圈套圈算法</p>
<p>混合图的 Euler Path / Tour</p>
<p>Hamilton Path / Tour</p>
<p>特殊图的Hamilton Path / Tour 构造</p>
<p>生成树问题</p>
<p>最小生成树</p>
<p>第k小生成树</p>
<p>最优比率生成树</p>
<p>0/1分数规划</p>
<p>度限制生成树</p>
<p>连通性问题</p>
<p>强大的DFS算法</p>
<p>无向图连通性</p>
<p>割点</p>
<p>割边</p>
<p>二连通分支</p>
<p>有向图连通性</p>
<p>强连通分支</p>
<p>2-SAT</p>
<p>最小点基</p>
<p>有向无环图</p>
<p>拓扑排序</p>
<p>有向无环图与动态规划的关系</p>
<p>二分图匹配问题</p>
<p>一般图问题与二分图问题的转换思路</p>
<p>最大匹配</p>
<p>有向图的最小路径覆盖</p>
<p>0 / 1矩阵的最小覆盖</p>
<p>完备匹配</p>
<p>最优匹配</p>
<p>稳定婚姻</p>
<p>网络流问题</p>
<p>网络流模型的简单特征和与线性规划的关系</p>
<p>最大流最小割定理</p>
<p>最大流问题</p>
<p>有上下界的最大流问题</p>
<p>循环流</p>
<p>最小费用最大流 / 最大费用最大流</p>
<p>弦图的性质和判定</p>
<p>组合数学</p>
<p>解决组合数学问题时常用的思想</p>
<p>逼近</p>
<p>递推 / 动态规划</p>
<p>概率问题</p>
<p>Polya定理</p>
<p>计算几何 / 解析几何</p>
<p>计算几何的核心：叉积 / 面积</p>
<p>解析几何的主力：复数</p>
<p>基本形</p>
<p>点</p>
<p>直线，线段</p>
<p>多边形</p>
<p>凸多边形 / 凸包</p>
<p>凸包算法的引进，卷包裹法</p>
<p>Graham扫描法</p>
<p>水平序的引进，共线凸包的补丁</p>
<p>完美凸包算法</p>
<p>相关判定</p>
<p>两直线相交</p>
<p>两线段相交</p>
<p>点在任意多边形内的判定</p>
<p>点在凸多边形内的判定</p>
<p>经典问题</p>
<p>最小外接圆</p>
<p>近似O(n)的最小外接圆算法</p>
<p>点集直径</p>
<p>旋转卡壳，对踵点</p>
<p>多边形的三角剖分</p>
<p>数学 / 数论</p>
<p>最大公约数</p>
<p>Euclid算法</p>
<p>扩展的Euclid算法</p>
<p>同余方程 / 二元一次不定方程</p>
<p>同余方程组</p>
<p>线性方程组</p>
<p>高斯消元法</p>
<p>解mod 2域上的线性方程组</p>
<p>整系数方程组的精确解法</p>
<p>矩阵</p>
<p>行列式的计算</p>
<p>利用矩阵乘法快速计算递推关系</p>
<p>分数</p>
<p>分数树</p>
<p>连分数逼近</p>
<p>数论计算</p>
<p>求N的约数个数</p>
<p>求phi(N)</p>
<p>求约数和</p>
<p>快速数论变换</p>
<p>……</p>
<p>素数问题</p>
<p>概率判素算法</p>
<p>概率因子分解</p>
<p>数据结构</p>
<p>组织结构</p>
<p>二叉堆</p>
<p>左偏树</p>
<p>二项树</p>
<p>胜者树</p>
<p>跳跃表</p>
<p>样式图标</p>
<p>斜堆</p>
<p>reap</p>
<p>统计结构</p>
<p>树状数组</p>
<p>虚二叉树</p>
<p>线段树</p>
<p>矩形面积并</p>
<p>圆形面积并</p>
<p>关系结构</p>
<p>Hash表</p>
<p>并查集</p>
<p>路径压缩思想的应用</p>
<p>STL中的数据结构</p>
<p>vector</p>
<p>deque</p>
<p>set / map</p>
<p>动态规划 / 记忆化搜索</p>
<p>动态规划和记忆化搜索在思考方式上的区别</p>
<p>最长子序列系列问题</p>
<p>最长不下降子序列</p>
<p>最长公共子序列</p>
<p>最长公共不下降子序列</p>
<p>一类NP问题的动态规划解法</p>
<p>树型动态规划</p>
<p>背包问题</p>
<p>动态规划的优化</p>
<p>四边形不等式</p>
<p>函数的凸凹性</p>
<p>状态设计</p>
<p>规划方向</p>
<p>线性规划</p>
<p>常用思想</p>
<p>二分          最小表示法</p>
<p>串</p>
<p>KMP                              Trie结构</p>
<p>后缀树/后缀数组            LCA/RMQ</p>
<p>有限状态自动机理论</p>
<p>排序</p>
<p>选择/冒泡        快速排序        堆排序            归并排序</p>
<p>基数排序        拓扑排序        排序网络</p>
<p>中级:</p>
<p>一.基本算法:</p>
<p>(1)C++的标准模版库的应用. (poj3096,poj3007)</p>
<p>(2)较为复杂的模拟题的训练(poj3393,poj1472,poj3371,poj1027,poj2706)</p>
<p>二.图算法:</p>
<p>(1)差分约束系统的建立和求解. (poj1201,poj2983)</p>
<p>(2)最小费用最大流(poj2516,poj2516,poj2195)</p>
<p>(3)双连通分量(poj2942)</p>
<p>(4)强连通分支及其缩点.(poj2186)</p>
<p>(5)图的割边和割点(poj3352)</p>
<p>(6)最小割模型、网络流规约(poj3308, )</p>
<p>三.数据结构.</p>
<p>(1)线段树. (poj2528,poj2828,poj2777,poj2886,poj2750)</p>
<p>(2)静态二叉检索树. (poj2482,poj2352)</p>
<p>(3)树状树组(poj1195,poj3321)</p>
<p>(4)RMQ. (poj3264,poj3368)</p>
<p>(5)并查集的高级应用. (poj1703,2492)</p>
<p>(6)KMP算法. (poj1961,poj2406)</p>
<p>四.搜索</p>
<p>(1)最优化剪枝和可行性剪枝</p>
<p>(2)搜索的技巧和优化 (poj3411,poj1724)</p>
<p>(3)记忆化搜索(poj3373,poj1691)</p>
<p>五.动态规划</p>
<p>(1)较为复杂的动态规划(如动态规划解特别的施行商问题等)</p>
<p>(poj1191,poj1054,poj3280,poj2029,poj2948,poj1925,poj3034)</p>
<p>(2)记录状态的动态规划. (POJ3254,poj2411,poj1185)</p>
<p>(3)树型动态规划(poj2057,poj1947,poj2486,poj3140)</p>
<p>六.数学</p>
<p>(1)组合数学:</p>
<p>1.容斥原理.</p>
<p>2.抽屉原理.</p>
<p>3.置换群与Polya定理(poj1286,poj2409,poj3270,poj1026).</p>
<p>4.递推关系和母函数.</p>
<p>(2)数学.</p>
<p>1.高斯消元法(poj2947,poj1487, poj2065,poj1166,poj1222)</p>
<p>2.概率问题. (poj3071,poj3440)</p>
<p>3.GCD、扩展的欧几里德(中国剩余定理) (poj3101)</p>
<p>(3)计算方法.</p>
<p>1.0/1分数规划. (poj2976)</p>
<p>2.三分法求解单峰(单谷)的极值.</p>
<p>3.矩阵法(poj3150,poj3422,poj3070)</p>
<p>4.迭代逼近(poj3301)</p>
<p>(4)随机化算法(poj3318,poj2454)</p>
<p>(5)杂题.</p>
<p>(poj1870,poj3296,poj3286,poj1095)</p>
<p>七.计算几何学.</p>
<p>(1)坐标离散化.</p>
<p>(2)扫描线算法(例如求矩形的面积和周长并,常和线段树或堆一起使用).</p>
<p>(poj1765,poj1177,poj1151,poj3277,poj2280,poj3004)</p>
<p>(3)多边形的内核(半平面交)(poj3130,poj3335)</p>
<p>(4)几何工具的综合应用.(poj1819,poj1066,poj2043,poj3227,poj2165,poj3429)</p>
<p>高级:</p>
<p>一.基本算法要求:</p>
<p>(1)代码快速写成,精简但不失风格</p>
<p>(poj2525,poj1684,poj1421,poj1048,poj2050,poj3306)</p>
<p>(2)保证正确性和高效性. poj3434</p>
<p>二.图算法:</p>
<p>(1)度限制最小生成树和第K最短路. (poj1639)</p>
<p>(2)最短路,最小生成树,二分图,最大流问题的相关理论(主要是模型建立和求解)</p>
<p>(poj3155, poj2112,poj1966,poj3281,poj1087,poj2289,poj3216,poj2446</p>
<p>(3)最优比率生成树. (poj2728)</p>
<p>(4)最小树形图(poj3164)</p>
<p>(5)次小生成树.</p>
<p>(6)无向图、有向图的最小环</p>
<p>三.数据结构.</p>
<p>(1)trie图的建立和应用. (poj2778)</p>
<p>(2)LCA和RMQ问题(LCA(最近公共祖先问题) 有离线算法(并查集+dfs) 和 在线算法</p>
<p>(RMQ+dfs)).(poj1330)</p>
<p>(3)双端队列和它的应用(维护一个单调的队列,常常在动态规划中起到优化状态转移的</p>
<p>目的). (poj2823)</p>
<p>(4)左偏树(可合并堆).</p>
<p>(5)后缀树(非常有用的数据结构,也是赛区考题的热点).</p>
<p>(poj3415,poj3294)</p>
<p>四.搜索</p>
<p>(1)较麻烦的搜索题目训练(poj1069,poj3322,poj1475,poj1924,poj2049,poj3426)</p>
<p>(2)广搜的状态优化:利用M进制数存储状态、转化为串用hash表判重、按位压缩存储状态、双向广搜、A*算法. (poj1768,poj1184,poj1872,poj1324,poj2046,poj1482)</p>
<p>(3)深搜的优化:尽量用位运算、一定要加剪枝、函数参数尽可能少、层数不易过大、可以考虑双向搜索或者是轮换搜索、IDA*算法. (poj3131,poj2870,poj2286)</p>
<p>五.动态规划</p>
<p>(1)需要用数据结构优化的动态规划.</p>
<p>(poj2754,poj3378,poj3017)</p>
<p>(2)四边形不等式理论.</p>
<p>(3)较难的状态DP(poj3133)</p>
<p>六.数学</p>
<p>(1)组合数学.</p>
<p>1.MoBius反演(poj2888,poj2154)</p>
<p>2.偏序关系理论.</p>
<p>(2)博奕论.</p>
<p>1.极大极小过程(poj3317,poj1085)</p>
<p>2.Nim问题.</p>
<p>七.计算几何学.</p>
<p>(1)半平面求交(poj3384,poj2540)</p>
<p>(2)可视图的建立(poj2966)</p>
<p>(3)点集最小圆覆盖.</p>
<p>(4)对踵点(poj2079)</p>
<p>八.综合题.</p>
<p>(poj3109,poj1478,poj1462,poj2729,poj2048,poj3336,poj3315,poj2148,poj1263)</p>
<p>初期:</p>
<p>一.基本算法:</p>
<p>(1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586)</p>
<p>(3)递归和分治法.                  (4)递推.</p>
<p>(5)构造法.(poj3295)            (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)</p>
<p>二.图算法:</p>
<p>(1)图的深度优先遍历和广度优先遍历.</p>
<p>(2)最短路径算法(dijkstra,bellman-ford,floyd,heap+dijkstra)</p>
<p>(poj1860,poj3259,poj1062,poj2253,poj1125,poj2240)</p>
<p>(3)最小生成树算法(prim,kruskal)</p>
<p>(poj1789,poj2485,poj1258,poj3026)</p>
<p>(4)拓扑排序 (poj1094)</p>
<p>(5)二分图的最大匹配 (匈牙利算法) (poj3041,poj3020)</p>
<p>(6)最大流的增广路算法(KM算法). (poj1459,poj3436)</p>
<p>三.数据结构.</p>
<p>(1)串 (poj1035,poj3080,poj1936)</p>
<p>(2)排序(快排、归并排(与逆序数有关)、堆排) (poj2388,poj2299)</p>
<p>(3)简单并查集的应用.</p>
<p>(4)哈希表和二分查找等高效查找法(数的Hash,串的Hash)</p>
<p>(poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503)</p>
<p>(5)哈夫曼树(poj3253)</p>
<p>(6)堆</p>
<p>(7)trie树(静态建树、动态建树) (poj2513)</p>
<p>四.简单搜索</p>
<p>(1)深度优先搜索 (poj2488,poj3083,poj3009,poj1321,poj2251)</p>
<p>(2)广度优先搜索(poj3278,poj1426,poj3126,poj3087.poj3414)</p>
<p>(3)简单搜索技巧和剪枝(poj2531,poj1416,poj2676,1129)</p>
<p>五.动态规划</p>
<p>(1)背包问题. (poj1837,poj1276)</p>
<p>(2)型如下表的简单DP(可参考lrj的书 page149):</p>
<p>1.E[j]=opt{D+w(i,j)} (poj3267,poj1836,poj1260,poj2533)</p>
<p>2.E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最长公共子序列)</p>
<p>(poj3176,poj1080,poj1159)</p>
<p>3.C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最优二分检索树问题)</p>
<p>六.数学</p>
<p>(1)组合数学:</p>
<p>1.加法原理和乘法原理.</p>
<p>2.排列组合.</p>
<p>3.递推关系.</p>
<p>(POJ3252,poj1850,poj1019,poj1942)</p>
<p>(2)数论.</p>
<p>1.素数与整除问题</p>
<p>2.进制位.</p>
<p>3.同余模运算.</p>
<p>(poj2635, poj3292,poj1845,poj2115)</p>
<p>(3)计算方法.</p>
<p>1.二分法求解单调函数相关知识.(poj3273,poj3258,poj1905,poj3122)</p>
<p>七.计算几何学.</p>
<p>(1)几何公式.</p>
<p>(2)叉积和点积的运用(如线段相交的判定,点到线段的距离等). (poj2031,poj1039)</p>
<p>(3)多边型的简单算法(求面积)和相关判定(点在多边型内,多边型是否相交)</p>
<p>(poj1408,poj1584)</p>
<p>(4)凸包. (poj2187,poj1113)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.doupie.com/2010/08/21/%e5%ad%a6%e4%b9%a0%e7%ae%97%e6%b3%95%e4%b9%8b%e8%b7%af/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>提高PHP编程效率的53个要点</title>
		<link>http://www.doupie.com/2010/08/15/%e6%8f%90%e9%ab%98php%e7%bc%96%e7%a8%8b%e6%95%88%e7%8e%87%e7%9a%8453%e4%b8%aa%e8%a6%81%e7%82%b9/</link>
		<comments>http://www.doupie.com/2010/08/15/%e6%8f%90%e9%ab%98php%e7%bc%96%e7%a8%8b%e6%95%88%e7%8e%87%e7%9a%8453%e4%b8%aa%e8%a6%81%e7%82%b9/#comments</comments>
		<pubDate>Sun, 15 Aug 2010 06:15:07 +0000</pubDate>
		<dc:creator>Jayson</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[分享]]></category>

		<guid isPermaLink="false">http://www.doupie.com/?p=541</guid>
		<description><![CDATA[用单引号代替双引号来包含字符串，这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量，单引号则不会，注意：只有echo能这么做，它是一种可以把多个字符串当作参数的“函数”（译注：PHP手册中说echo是语言结构，不是真正的函数，故把函数加上了双引号）。 1、如果能将类的方法定义成static，就尽量定义成static，它的速度会提升将近4倍。 2、$row[’id’] 的速度是$row[id]的7倍。 3、echo 比 print 快，并且使用echo的多重参数（译注：指用逗号而不是句点）代替字符串连接，比如echo $str1,$str2。 4、在执行for循环之前确定最大循环数，不要每循环一次都计算最大值，最好运用foreach代替。 5、注销那些不用的变量尤其是大数组，以便释放内存。 6、尽量避免使用__get，__set，__autoload。 7、require_once()代价昂贵。 8、include文件时尽量使用绝对路径，因为它避免了PHP去include_path里查找文件的速度，解析操作系统路径所需的时间会更少。 9、如果你想知道脚本开始执行（译注：即服务器端收到客户端请求）的时刻，使用$_SERVER[‘REQUEST_TIME’]要好于time()。 10、函数代替正则表达式完成相同功能。 11、str_replace函数比preg_replace函数快，但strtr函数的效率是str_replace函数的四倍。 12、如果一个字符串替换函数，可接受数组或字符作为参数，并且参数长度不太长，那么可以考虑额外写一段替换代码，使得每次传递参数是一个字符，而不是只写一行代码接受数组作为查询和替换的参数。 13、使用选择分支语句（译注：即switch case）好于使用多个if，else if语句。 14、用@屏蔽错误消息的做法非常低效，极其低效。 15、打开apache的mod_deflate模块，可以提高网页的浏览速度。 16、数据库连接当使用完毕时应关掉，不要用长连接。 17、错误消息代价昂贵。 18、在方法中递增局部变量，速度是最快的。几乎与在函数中调用局部变量的速度相当。 19、递增一个全局变量要比递增一个局部变量慢2倍。 20、递增一个对象属性（如：$this-&#62;prop++）要比递增一个局部变量慢3倍。 21、递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。 22、仅定义一个局部变量而没在函数中调用它，同样会减慢速度（其程度相当于递增一个局部变量）。PHP大概会检查看是否存在全局变量。 23、方法调用看来与类中定义的方法的数量无关，因为我（在测试方法之前和之后都）添加了10个方法，但性能上没有变化。 24、派生类中的方法运行起来要快于在基类中定义的同样的方法。 25、调用带有一个参数的空函数，其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。 26、Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面，少用脚本。 27、除非脚本可以缓存，否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能，以免除编译开销。 28、尽量做缓存，可使用memcached。memcached是一款高性能的内存对象缓存系统，可用来加速动态Web应用程序，减轻数据库负载。对运算码 (OP code)的缓存很有用，使得脚本不必为每个请求做重新编译。 29、当操作字符串并需要检验其长度是否满足某种要求时，你想当然地会使用strlen()函数。此函数执行起来相当快，因为它不做任何计算，只返回在zval 结构（C的内置数据结构，用于存储PHP变量）中存储的已知字符串长度。但是，由于strlen()是函数，多多少少会有些慢，因为函数调用会经过诸多步骤，如字母小写化（译注：指函数名小写化，PHP不区分函数名大小写）、哈希查找，会跟随被调用的函数一起执行。在某些情况下，你可以使用isset() 技巧加速执行你的代码。 （举例如下） if (strlen($foo) &#60; 5) { echo “Foo is too short”$$ } （与下面的技巧做比较） if [...]]]></description>
			<content:encoded><![CDATA[<p>用单引号代替双引号来包含字符串，这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量，单引号则不会，注意：只有echo能这么做，它是一种可以把多个字符串当作参数的“函数”（译注：PHP手册中说echo是语言结构，不是真正的函数，故把函数加上了双引号）。</p>
<p>1、如果能将类的方法定义成static，就尽量定义成static，它的速度会提升将近4倍。</p>
<p>2、$row[’id’] 的速度是$row[id]的7倍。</p>
<p>3、echo 比 print 快，并且使用echo的多重参数（译注：指用逗号而不是句点）代替字符串连接，比如echo $str1,$str2。</p>
<p>4、在执行for循环之前确定最大循环数，不要每循环一次都计算最大值，最好运用foreach代替。</p>
<p>5、注销那些不用的变量尤其是大数组，以便释放内存。</p>
<p>6、尽量避免使用__get，__set，__autoload。</p>
<p>7、require_once()代价昂贵。</p>
<p>8、include文件时尽量使用绝对路径，因为它避免了PHP去include_path里查找文件的速度，解析操作系统路径所需的时间会更少。</p>
<p>9、如果你想知道脚本开始执行（译注：即服务器端收到客户端请求）的时刻，使用$_SERVER[‘REQUEST_TIME’]要好于time()。</p>
<p>10、函数代替正则表达式完成相同功能。</p>
<p>11、str_replace函数比preg_replace函数快，但strtr函数的效率是str_replace函数的四倍。</p>
<p>12、如果一个字符串替换函数，可接受数组或字符作为参数，并且参数长度不太长，那么可以考虑额外写一段替换代码，使得每次传递参数是一个字符，而不是只写一行代码接受数组作为查询和替换的参数。</p>
<p>13、使用选择分支语句（译注：即switch case）好于使用多个if，else if语句。</p>
<p>14、用@屏蔽错误消息的做法非常低效，极其低效。</p>
<p>15、打开apache的mod_deflate模块，可以提高网页的浏览速度。</p>
<p>16、数据库连接当使用完毕时应关掉，不要用长连接。</p>
<p>17、错误消息代价昂贵。</p>
<p>18、在方法中递增局部变量，速度是最快的。几乎与在函数中调用局部变量的速度相当。</p>
<p>19、递增一个全局变量要比递增一个局部变量慢2倍。</p>
<p>20、递增一个对象属性（如：$this-&gt;prop++）要比递增一个局部变量慢3倍。</p>
<p>21、递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。</p>
<p>22、仅定义一个局部变量而没在函数中调用它，同样会减慢速度（其程度相当于递增一个局部变量）。PHP大概会检查看是否存在全局变量。</p>
<p>23、方法调用看来与类中定义的方法的数量无关，因为我（在测试方法之前和之后都）添加了10个方法，但性能上没有变化。</p>
<p>24、派生类中的方法运行起来要快于在基类中定义的同样的方法。</p>
<p>25、调用带有一个参数的空函数，其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。</p>
<p>26、Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面，少用脚本。</p>
<p>27、除非脚本可以缓存，否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能，以免除编译开销。</p>
<p>28、尽量做缓存，可使用memcached。memcached是一款高性能的内存对象缓存系统，可用来加速动态Web应用程序，减轻数据库负载。对运算码 (OP code)的缓存很有用，使得脚本不必为每个请求做重新编译。</p>
<p>29、当操作字符串并需要检验其长度是否满足某种要求时，你想当然地会使用strlen()函数。此函数执行起来相当快，因为它不做任何计算，只返回在zval 结构（C的内置数据结构，用于存储PHP变量）中存储的已知字符串长度。但是，由于strlen()是函数，多多少少会有些慢，因为函数调用会经过诸多步骤，如字母小写化（译注：指函数名小写化，PHP不区分函数名大小写）、哈希查找，会跟随被调用的函数一起执行。在某些情况下，你可以使用isset() 技巧加速执行你的代码。<br />
（举例如下）</p>
<p>if (strlen($foo) &lt; 5) { echo “Foo is too short”$$ }</p>
<p>（与下面的技巧做比较）</p>
<p>if (!isset($foo{5})) { echo “Foo is too short”$$ }</p>
<p>调用isset()恰巧比strlen()快，因为与后者不同的是，isset()作为一种语言结构，意味着它的执行不需要函数查找和字母小写化。也就是说，实际上在检验字符串长度的顶层代码中你没有花太多开销。</p>
<p>34、当执行变量$i的递增或递减时，$i++会比++$i慢一些。这种差异是PHP特有的，并不适用于其他语言，所以请不要修改你的C或Java代码并指望它们能立即变快，没用的。++$i更快是因为它只需要3条指令(opcodes)，$i++则需要4条指令。后置递增实际上会产生一个临时变量，这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种，正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意，因为并不是所有的指令优化器都会做同样的优化处理，并且存在大量没有装配指令优化器的互联网服务提供商（ISPs）和服务器。</p>
<p>35、并不是事必面向对象(OOP)，面向对象往往开销很大，每个方法和对象调用都会消耗很多内存。</p>
<p>36、并非要用类实现所有的数据结构，数组也很有用。</p>
<p>37、不要把方法细分得过多，仔细想想你真正打算重用的是哪些代码？</p>
<p>38、当你需要时，你总能把代码分解成方法。</p>
<p>39、尽量采用大量的PHP内置函数。</p>
<p>40、如果在代码中存在大量耗时的函数，你可以考虑用C扩展的方式实现它们。<br />
41、评估检验(profile)你的代码。检验器会告诉你，代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序，评估检验总体上可以显示出代码的瓶颈。<br />
42、mod_zip可作为Apache模块，用来即时压缩你的数据，并可让数据传输量降低80%。</p>
<p>43、在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下，尽量用file_get_contents，因为他的效率高得多！但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题；</p>
<p>44、尽量的少进行文件操作，虽然PHP的文件操作效率也不低的；</p>
<p>45、优化Select SQL语句，在可能的情况下尽量少的进行Insert、Update操作(在update上，我被恶批过)；</p>
<p>46、尽可能的使用PHP内部函数（但是我却为了找个PHP里面不存在的函数，浪费了本可以写出一个自定义函数的时间，经验问题啊！）；</p>
<p>47、循环内部不要声明变量，尤其是大变量：对象(这好像不只是PHP里面要注意的问题吧？)；</p>
<p>48、多维数组尽量不要循环嵌套赋值；</p>
<p>49、在可以用PHP内部字符串操作函数的情况下，不要用正则表达式；</p>
<p>50、foreach效率更高，尽量用foreach代替while和for循环；</p>
<p>51、用单引号替代双引号引用字符串；</p>
<p>52、“用i+=1代替i=i+1。符合c/c++的习惯，效率还高”；</p>
<p>53、对global变量，应该用完就unset()掉；</p>
<p>出处：<a href="http://www.52blogger.com">龙哥博客</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.doupie.com/2010/08/15/%e6%8f%90%e9%ab%98php%e7%bc%96%e7%a8%8b%e6%95%88%e7%8e%87%e7%9a%8453%e4%b8%aa%e8%a6%81%e7%82%b9/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scrum术语字典</title>
		<link>http://www.doupie.com/2010/08/10/scrum%e6%9c%af%e8%af%ad%e5%ad%97%e5%85%b8/</link>
		<comments>http://www.doupie.com/2010/08/10/scrum%e6%9c%af%e8%af%ad%e5%ad%97%e5%85%b8/#comments</comments>
		<pubDate>Tue, 10 Aug 2010 08:19:51 +0000</pubDate>
		<dc:creator>Jayson</dc:creator>
				<category><![CDATA[项目管理]]></category>
		<category><![CDATA[scrum]]></category>

		<guid isPermaLink="false">http://www.doupie.com/?p=536</guid>
		<description><![CDATA[电子书目录： 1    燃尽图（Burn down Charts） 2    每日站会（Daily Scrum Meeting） 3    障碍（Impediments） 4    产品Backlog(Product Backlog) 5    产品Backlog项（Product Backlog Item） 6    产品backlog项的工作量（Product Backlog Item Effort） 7    产品燃尽图（Product Burn down Chart） 8    产品负责人的角色 （Product Owner Role） 9    发布（Release） 10   发布燃尽图 （Release Burn down Chart） 11   Scrum角色（Scrum Roles） 12   Scrum Master角色 13   Sprint 14   Sprint Backlog 15   Sprint燃尽图（Sprint Burn down Chart） 16   Sprint 目标 17   Sprint计划会议 （Sprint Planning Meeting） 18   Sprint评审会议（Sprint Review Meeting） 19   Sprint任务（Sprint Task） 20   团队（Team） 21   团队成员（Team Member） 22   速率（Velocity）]]></description>
			<content:encoded><![CDATA[<p>电子书目录：</p>
<p>1    燃尽图（Burn down Charts）</p>
<p>2    每日站会（Daily Scrum Meeting）</p>
<p>3    障碍（Impediments）</p>
<p>4    产品Backlog(Product Backlog)</p>
<p>5    产品Backlog项（Product Backlog Item）</p>
<p>6    产品backlog项的工作量（Product Backlog Item Effort）</p>
<p>7    产品燃尽图（Product Burn down Chart）</p>
<p>8    产品负责人的角色 （Product Owner Role）</p>
<p>9    发布（Release）</p>
<p>10   发布燃尽图 （Release Burn down Chart）</p>
<p>11   Scrum角色（Scrum Roles）</p>
<p>12   Scrum Master角色</p>
<p>13   Sprint</p>
<p>14   Sprint Backlog</p>
<p>15   Sprint燃尽图（Sprint Burn down Chart）</p>
<p>16   Sprint 目标</p>
<p>17   Sprint计划会议 （Sprint Planning Meeting）</p>
<p>18   Sprint评审会议（Sprint Review Meeting）</p>
<p>19   Sprint任务（Sprint Task）</p>
<p>20   团队（Team）</p>
<p>21   团队成员（Team Member）</p>
<p>22   速率（Velocity）</p>
]]></content:encoded>
			<wfw:commentRss>http://www.doupie.com/2010/08/10/scrum%e6%9c%af%e8%af%ad%e5%ad%97%e5%85%b8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scrum的四个工件</title>
		<link>http://www.doupie.com/2010/08/10/scrum%e7%9a%84%e5%9b%9b%e4%b8%aa%e5%b7%a5%e4%bb%b6/</link>
		<comments>http://www.doupie.com/2010/08/10/scrum%e7%9a%84%e5%9b%9b%e4%b8%aa%e5%b7%a5%e4%bb%b6/#comments</comments>
		<pubDate>Tue, 10 Aug 2010 08:17:40 +0000</pubDate>
		<dc:creator>Jayson</dc:creator>
				<category><![CDATA[项目管理]]></category>
		<category><![CDATA[scrum]]></category>

		<guid isPermaLink="false">http://www.doupie.com/?p=532</guid>
		<description><![CDATA[在Scrum中有四个工件:  产品Backlog（Product Backlog），发布燃尽图（Release Burndown Chart），Sprint Backlog 和Sprint燃尽图（Sprint Burndown Chart）。 产品Backlog（Product Backlog） 产品backlog是一个产品或项目期望的、排列好优先级的功能列表。优先级由商业价值、风险、和必要性决定。产品负责人负责产品Backlog的内容、可用性和优先级。产品Backlog永远不会是完整的，最初的版本只列出最基本的和非常明确的需求，这些需求至少要足够一个Sprint开发。随着团队对产品，以及它的客户或用户的了解，产品Backlog在不断的演进，所以产品Backlog是动态的，它经常发生变化以确保产品更合理、更具竞争力和更有用。只要产品存在，产品Backlog就存在。 产品Backlog中包含开发和交付成功产品需要的所有条件和因素。 产品Backlog条目的属性包括描述、优先级和估算。产品Backlog的条目可以包括功能性需求（使用业务语言描述，以用户为中心），也包括非功能性需求（从技术层面出发，产品需要具备的能力）。使用用户故事来描述产品Backlog条目是一个非常有效的实践，我们通常也把验收条件或验收测试作为产品Backlog条目的一个属性。 优先级高的产品Backlog条目需要立即进行开发。优先级越高的条目越详细，优先级越低的条目越概括。 这里有一个Excel版本的产品Backlog中文模板供您下载： http://www.scrumcn.com//down/html/index.php?13.html 发布燃尽图（Release Burndown Chart） 在Scrum项目中，团队通过每个Sprint结束时更新的发布燃尽图来跟踪整个发布计划的进展。发布燃尽图记录了在一段时间内产品Backlog的总剩余估算工作量的变化趋势。X轴代表的项目周期，以Sprint为单位， Y轴代表的是剩余工作量，通常以用户故事点、理想人天或者team-days为单位。 上述Excel版本的产品Backlog模板中提供了发布燃尽图的样例，请参考。 Sprint Backlog Sprint Backlog 是团队承诺在当前Sprint完成的任务列表。Sprint Backlog中的任务是由产品Backlog选取的需求条目细化和分解而来，这些任务要确保将产品Backlog条目转化为潜在可交付的产品增量。在Sprint的中选择完成哪些产品Backlog条目取决于产品Backlog中条目的优先级以及团队完成这些不同条目所花费时间。选择哪些条目和多少条目放入Sprint Backlog由团队决定。因为由团队承诺去完成这些任务，所有必须由他们自己来做决定。 在整个Sprint过程中，团队持续的修改Sprint Backlog，一些新的任务也会在Sprint过程中涌现出来。因为它涉及到个体要完成的任务，所以有时候会遗漏一些任务，或者一些任务不再需要了，亦或某项任务耗费的时间超出了估算或者低于估算。当出现新任务时或者工作量发生变化时，团队需要将其更新到Sprint Backlog中去。随着任务进行或者被完成，需要更新每项任务的剩余工作估算小时数。如果某项任务失去开发的意义，就可以将其除去。在Sprint内只有团队可以对Sprint Backlog进行修改，也只有团队可以对列表的内容或估算进行修改。Sprint Backlog是高可见度的，是对团队计划在当前Sprint内完成工作的实时反映，并且，该列表只属于团队。 这里有一个Excel版本的Sprint Backlog中文模板供您下载： http://www.scrumcn.com//down/html/?25.html Sprint燃尽图（Sprint Burndown Chart） Sprint Burndown Chart 显示了Sprint中累积剩余的工作量，它是一个反映工作量完成状况的趋势图。 图中Y轴代表的是剩余工作量，X轴代表的是Sprint的工作日。 在Sprint开始的时候，Scrum Team会标示和估计在这个Sprint需要完成的详细的任务。所有这个Sprint中需要完成，但没有完成的任务的工作量是累积工作量，Scrum master 会根据进展情况每天更新累积工作量，如果在Sprint结束时，累积工作量降低到0，Sprint就成功结束。 Product Backlog 功能点被放到Sprint的固定周期中，Sprint Backlog 会因为如下原因发生变化: [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-size: x-small;">在Scrum中有四个工件:  产品Backlog（Product Backlog），发布燃尽图（Release Burndown Chart），Sprint Backlog 和Sprint燃尽图（Sprint Burndown Chart）。</span></p>
<p><strong>产品Backlog（Product Backlog）</strong><br />
产品backlog是一个产品或项目期望的、排列好优先级的功能列表。优先级由商业价值、风险、和必要性决定。产品负责人负责产品Backlog的内容、可用性和优先级。产品Backlog永远不会是完整的，最初的版本只列出最基本的和非常明确的需求，这些需求至少要足够一个Sprint开发。随着团队对产品，以及它的客户或用户的了解，产品Backlog在不断的演进，所以产品Backlog是动态的，它经常发生变化以确保产品更合理、更具竞争力和更有用。只要产品存在，产品Backlog就存在。</p>
<p>产品Backlog中包含开发和交付成功产品需要的所有条件和因素。 产品Backlog条目的属性包括描述、优先级和估算。产品Backlog的条目可以包括功能性需求（使用业务语言描述，以用户为中心），也包括非功能性需求（从技术层面出发，产品需要具备的能力）。使用用户故事来描述产品Backlog条目是一个非常有效的实践，我们通常也把验收条件或验收测试作为产品Backlog条目的一个属性。</p>
<p>优先级高的产品Backlog条目需要立即进行开发。优先级越高的条目越详细，优先级越低的条目越概括。<br />
这里有一个Excel版本的产品Backlog中文模板供您下载：<br />
<a href="http://www.scrumcn.com//down/html/index.php?13.html"><span style="font-size: x-small;">http://www.scrumcn.com//down/html/index.php?13.html</span></a><br />
<span style="font-size: x-small;"><strong>发布燃尽图（Release Burndown Chart）</strong><br />
在Scrum项目中，团队通过每个Sprint结束时更新的发布燃尽图来跟踪整个发布计划的进展。发布燃尽图记录了在一段时间内产品Backlog的总剩余估算工作量的变化趋势。X轴代表的项目周期，以Sprint为单位， Y轴代表的是剩余工作量，通常以用户故事点、理想人天或者team-days为单位。<br />
上述Excel版本的产品Backlog模板中提供了发布燃尽图的样例，请参考。</span></p>
<p><span style="font-size: x-small;"><strong>Sprint Backlog</strong><br />
Sprint Backlog 是团队承诺在当前Sprint完成的任务列表。Sprint Backlog中的任务是由产品Backlog选取的需求条目细化和分解而来，这些任务要确保将产品Backlog条目转化为潜在可交付的产品增量。在Sprint的中选择完成哪些产品Backlog条目取决于产品Backlog中条目的优先级以及团队完成这些不同条目所花费时间。选择哪些条目和多少条目放入Sprint Backlog由团队决定。因为由团队承诺去完成这些任务，所有必须由他们自己来做决定。</span></p>
<p>在整个Sprint过程中，团队持续的修改Sprint Backlog，一些新的任务也会在Sprint过程中涌现出来。因为它涉及到个体要完成的任务，所以有时候会遗漏一些任务，或者一些任务不再需要了，亦或某项任务耗费的时间超出了估算或者低于估算。当出现新任务时或者工作量发生变化时，团队需要将其更新到Sprint Backlog中去。随着任务进行或者被完成，需要更新每项任务的剩余工作估算小时数。如果某项任务失去开发的意义，就可以将其除去。在Sprint内只有团队可以对Sprint Backlog进行修改，也只有团队可以对列表的内容或估算进行修改。Sprint Backlog是高可见度的，是对团队计划在当前Sprint内完成工作的实时反映，并且，该列表只属于团队。</p>
<p><span style="font-size: x-small;">这里有一个Excel版本的Sprint Backlog中文模板供您下载：<br />
</span><a href="http://www.scrumcn.com//down/html/?25.html"><span style="font-size: x-small;">http://www.scrumcn.com//down/html/?25.html</span></a></p>
<p><span style="font-size: x-small;"><strong>Sprint燃尽图（Sprint Burndown Chart）</strong><br />
Sprint Burndown Chart 显示了Sprint中累积剩余的工作量，它是一个反映工作量完成状况的趋势图。 图中Y轴代表的是剩余工作量，X轴代表的是Sprint的工作日。<br />
<img src="../../pic/gif/1279527367.jpg" alt="" /><br />
</span></p>
<p><span style="font-size: x-small;">在Sprint开始的时候，Scrum Team会标示和估计在这个Sprint需要完成的详细的任务。所有这个Sprint中需要完成，但没有完成的任务的工作量是累积工作量，Scrum master 会根据进展情况每天更新累积工作量，如果在Sprint结束时，累积工作量降低到0，Sprint就成功结束。<br />
Product Backlog 功能点被放到Sprint的固定周期中，Sprint Backlog 会因为如下原因发生变化:<br />
1. 随着时间的变化，开发团队对于需求有了更好的理解，有可能发现需要增加一些新的任务到Sprint Backlog中。<br />
2. 程序缺陷做为新的任务加进来，这个都做为承诺提交任务中未完成的工作，这些也许可以分开进行跟踪。</span></p>
<p>Product Owner也许会和Scrum team一起工作，以帮助team更好的理解Sprint的目标，ScrumMaster和team也许会觉得小的调整不会影响sprint的进度，但会给客户带来更多商业价值。<br />
<span style="font-size: x-small;">由于在Sprint的刚开始的时候，增加的任务工作量可能大于完成的任务工作量，所以燃尽图有可能呈上升趋势。</span></p>
<p><span style="font-size: x-small;">来源：http://www.scrumcn.com/scrumbase/html/?25.html</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.doupie.com/2010/08/10/scrum%e7%9a%84%e5%9b%9b%e4%b8%aa%e5%b7%a5%e4%bb%b6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scrum三个角色及其职责介绍</title>
		<link>http://www.doupie.com/2010/08/10/scrum%e4%b8%89%e4%b8%aa%e8%a7%92%e8%89%b2%e5%8f%8a%e5%85%b6%e8%81%8c%e8%b4%a3%e4%bb%8b%e7%bb%8d/</link>
		<comments>http://www.doupie.com/2010/08/10/scrum%e4%b8%89%e4%b8%aa%e8%a7%92%e8%89%b2%e5%8f%8a%e5%85%b6%e8%81%8c%e8%b4%a3%e4%bb%8b%e7%bb%8d/#comments</comments>
		<pubDate>Tue, 10 Aug 2010 08:13:00 +0000</pubDate>
		<dc:creator>Jayson</dc:creator>
				<category><![CDATA[项目管理]]></category>
		<category><![CDATA[scrum]]></category>

		<guid isPermaLink="false">http://www.doupie.com/?p=528</guid>
		<description><![CDATA[每个Scrum团队包括3个角色： 产品负责人（Product Owner）, ScrumMaster和 Scrum 团队。 产品负责人 产品负责人的职责：  确定产品的功能，负责维护产品Backlog。  决定产品的发布日期和发布内容。  为产品的投资回报率(ROI)负责。  根据市场价值确定功能优先级。  在每个Sprint开始前调整功能和调整功能优先级。  在Sprint结束时接受或拒绝接受开发团队的工作成果。 产品负责人是一个人，而不是一个委员会。可能会有一些委员会向产品负责人提出建议或影响他的决策，但要想改变某条目的优先级必须先说服产品负责人。实施Scrum的企业可能发现这样会影响他们制定优先级和需求的方法。 为保证产品负责人的工作取得成功，企业中的所有人员都必须尊重他的决定。任何人都不得要求团队按照另一套优先级开展工作，团队也不允许听从任何人带有威胁恐吓性的指令。产品负责人所作的决定需要通过产品Backlog内容和优先级使其可视化。这种可视化要求产品负责人全力以赴，同时也使其成为一个费心费力但又值得去做的角色。 ScrumMaster ScrumMaster 作为Team Leader和Product owner紧密地工作在一起，他可以及时地为团队成员提供帮助。他必须: 保证团队资源完全可被利用并且全部是高产出的。 保证各个角色及职责的良好协作。 解决团队开发中的障碍。 做为团队和外部的接口，屏蔽外界对团队成员的干扰。 保证开发过程按计划进行，组织每日站会、Sprint计划会议、Sprint评审会议和Sprint回顾会议。 ScrumMaster 除了主持每日站会（Daily Scrum Meeting）之外，还有三个主要职责： ScrumMaster 需要知道什么任务已经完成，哪些任务已经开始，哪些新的任务已发现，和哪些估算可能已经发生变化。ScrumMaster 需要根据以上的情况更新反映每天完成的工作量以及还有多少没有完成的燃尽图（Burndown Chart）。 ScrumMaster 还必须仔细考虑同时在进行开发的任务数，同时进行的工作需要做到最小化，以实现精益生产率的收益。 该ScrumMaster 需要找出阻碍团队的障碍和依赖。他们需要的优先次序和跟踪。根据优先级指定计划解决这些障碍。其中有些问题可以在团队内部解决，有些则要团队之间的协调，还有的要管理层的介入来解决，甚至有些是公司的问题阻碍了团队达到他们的生产力。比如：一个电信公司最近实施了Scrum，但后来发现只有两个问题和Scrum Team有关，其他的全是公司的问题需要管理层关注。 最后但并非最不重要， ScrumMaster 可能会注意到，个人问题或冲突在Scrum里是需要解决的。这些都需要被澄清，或通过内部的沟通解决，或向管理层和HR寻求帮助解决。ScrumMaster 必须注意去确保团队资源完全可被利用并且全部是高产出的。 Scrum 团队 Scrum团队的职责是在每个Sprint中将产品Backlog中的条目转化成为潜在可交付的功能增量。 Scrum团队的一些特点： 1. Scrum团队的规模控制在5-9个人。 [...]]]></description>
			<content:encoded><![CDATA[<p>每个Scrum团队包括3个角色： 产品负责人（Product Owner）, ScrumMaster和 Scrum 团队。</p>
<p>产品负责人</p>
<p>产品负责人的职责：</p>
<p> 确定产品的功能，负责维护产品Backlog。<br />
 决定产品的发布日期和发布内容。<br />
 为产品的投资回报率(ROI)负责。<br />
 根据市场价值确定功能优先级。<br />
 在每个Sprint开始前调整功能和调整功能优先级。<br />
 在Sprint结束时接受或拒绝接受开发团队的工作成果。</p>
<p>产品负责人是一个人，而不是一个委员会。可能会有一些委员会向产品负责人提出建议或影响他的决策，但要想改变某条目的优先级必须先说服产品负责人。实施Scrum的企业可能发现这样会影响他们制定优先级和需求的方法。</p>
<p>为保证产品负责人的工作取得成功，企业中的所有人员都必须尊重他的决定。任何人都不得要求团队按照另一套优先级开展工作，团队也不允许听从任何人带有威胁恐吓性的指令。产品负责人所作的决定需要通过产品Backlog内容和优先级使其可视化。这种可视化要求产品负责人全力以赴，同时也使其成为一个费心费力但又值得去做的角色。</p>
<p>ScrumMaster</p>
<p>ScrumMaster 作为Team Leader和Product owner紧密地工作在一起，他可以及时地为团队成员提供帮助。他必须:</p>
<p>保证团队资源完全可被利用并且全部是高产出的。<br />
保证各个角色及职责的良好协作。<br />
解决团队开发中的障碍。<br />
做为团队和外部的接口，屏蔽外界对团队成员的干扰。<br />
保证开发过程按计划进行，组织每日站会、Sprint计划会议、Sprint评审会议和Sprint回顾会议。<br />
ScrumMaster 除了主持每日站会（Daily Scrum Meeting）之外，还有三个主要职责：</p>
<p>ScrumMaster 需要知道什么任务已经完成，哪些任务已经开始，哪些新的任务已发现，和哪些估算可能已经发生变化。ScrumMaster 需要根据以上的情况更新反映每天完成的工作量以及还有多少没有完成的燃尽图（Burndown Chart）。<br />
ScrumMaster 还必须仔细考虑同时在进行开发的任务数，同时进行的工作需要做到最小化，以实现精益生产率的收益。<br />
该ScrumMaster 需要找出阻碍团队的障碍和依赖。他们需要的优先次序和跟踪。根据优先级指定计划解决这些障碍。其中有些问题可以在团队内部解决，有些则要团队之间的协调，还有的要管理层的介入来解决，甚至有些是公司的问题阻碍了团队达到他们的生产力。比如：一个电信公司最近实施了Scrum，但后来发现只有两个问题和Scrum Team有关，其他的全是公司的问题需要管理层关注。<br />
最后但并非最不重要， ScrumMaster 可能会注意到，个人问题或冲突在Scrum里是需要解决的。这些都需要被澄清，或通过内部的沟通解决，或向管理层和HR寻求帮助解决。ScrumMaster 必须注意去确保团队资源完全可被利用并且全部是高产出的。</p>
<p>Scrum 团队</p>
<p>Scrum团队的职责是在每个Sprint中将产品Backlog中的条目转化成为潜在可交付的功能增量。</p>
<p>Scrum团队的一些特点：</p>
<p>1. Scrum团队的规模控制在5-9个人。<br />
如果成员少于5人，那么相互交流就减少了，团队的生产力也会下降。更重要的是，团队在Sprint中可能会受到技能限制，从而导致无法交付可发布的产品模块。如果成员多于9人，那么成员之间就需要太多的协调沟通工作。大型团队会产生太多复杂性，不便于经验过程控制。对于大型项目来说，可以采用多个小的Scrum团队，通过Scrum of Scrums解决团队间的沟通协调问题。</p>
<p>2. Scrum团队是跨职能的团队。<br />
团队成员必须具备交付产品增量所需要的各种技能。团队成员常常具备如编程、质量控制、业务分析、架构、用户界面设计或数据库设计等的专业技能。在Scrum团队中没有头衔的概念，每个人都必须尽心尽力完成Sprint目标。团队中不允许包括测试或业务分析等在特定领域工作的子团队。</p>
<p>3. Scrum团队是自组织的。<br />
任何人，包括ScrumMaster都没有权利规定团队如何将产品Backlog转化成可交付的功能增量，而是由团队自己确定。每个团队成员利用自己的专业技能，解决遇到的问题。这种协同配合提高了团队整体效率。</p>
<p>团队的构成在Sprint结束时可能会发生变化，每次团队成员的变化，都会降低通过自组织而获取的生产力。因此，改变团队构成时务必要谨慎。</p>
<p>来源：http://www.scrumcn.com/scrumbase/html/?14.html</p>
]]></content:encoded>
			<wfw:commentRss>http://www.doupie.com/2010/08/10/scrum%e4%b8%89%e4%b8%aa%e8%a7%92%e8%89%b2%e5%8f%8a%e5%85%b6%e8%81%8c%e8%b4%a3%e4%bb%8b%e7%bb%8d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scrum的六个时间箱</title>
		<link>http://www.doupie.com/2010/08/10/scrum%e7%9a%84%e5%85%ad%e4%b8%aa%e6%97%b6%e9%97%b4%e7%ae%b1/</link>
		<comments>http://www.doupie.com/2010/08/10/scrum%e7%9a%84%e5%85%ad%e4%b8%aa%e6%97%b6%e9%97%b4%e7%ae%b1/#comments</comments>
		<pubDate>Tue, 10 Aug 2010 07:35:55 +0000</pubDate>
		<dc:creator>Jayson</dc:creator>
				<category><![CDATA[项目管理]]></category>
		<category><![CDATA[scrum]]></category>

		<guid isPermaLink="false">http://www.doupie.com/?p=524</guid>
		<description><![CDATA[时间箱机制是Scrum的一个非常重要的方面。在Scrum框架中有六个时间箱。 时间箱一：Sprint Sprint的本意是指冲刺，在Scrum中，一个Sprint就是一个迭代，Sprint长度通常2-4周，它是一个时间箱，在项目进行过程中不允许延长或缩短Sprint长度。在Sprint中，ScrumMaster要确保没有任何影响Sprint目标的变更发生。团队构成和质量目标在Sprint中均保持不变。Sprint由Sprint计划会议、开发工作(需求分析、设计、开发、测试、质量控制等)、每日站会、Sprint评审会议和Sprint回顾会议等活动组成。Sprint一个紧跟一个进行，之间没有任何时间间隔。 其它的5个时间箱对应Scrum的5个仪式： 时间箱二：发布计划会议（Release Planning Meeting） 发布计划会议的目的是建立Scrum团队以及组织内的其他部门能够理解和沟通的计划和目标。发布计划会议需要回答以下两个问题：“我们如何以最佳方式将愿景转化为成功的产品？我们怎样才能达到或甚至超越客户的满意度和投资回报？”发布计划确定发布目标、具有最高优先级的产品Backlog条目、重大风险和发布所包含的全部特性和功能。另外， 发布计划会议确立大致交付日期和费用，如果没有任何变化就应当保持该日期和费用。组织可以检视开发进程，以每个Sprint为基础调整发布计划。 发布计划会议是完全是可选的。如果项目开始的时候没有这个会议，那么这些工件的缺少将成为一个需要被移除的障碍，解决这个障碍便成为了产品Backlog中的一个条目。 Scrum以迭代的方式构建产品，每个Sprint中都会交付产品增量，通常价值最高、风险最大的部分先开发。产品增量随着Sprint交替而完成，每个增量都是整个产品的可交付一部分。当创造出足够多的有价值的、可供投资方使用的产品增量时，产品就可以发布了。 大多数组织已经有自己的发布计划过程，并且在大多数过程中的大部分计划已经在发布之初完成，而且也不会更改。在Scrum发布计划会议上确立一个整体目标和预期结果。发布计划会议通常不超过组织构建传统发布计划的15-20%时间。然而，Scrum发布在每个Sprint评审和计划会议上都执行准时（Just-in-time）计划，同时，在每日站会上执行每日准时（Just-in-time）计划。总的看来，Scrum发布可能比传统的发布计划耗费略多的工作。 发布计划会议需要为该发布做产品Backlog条目的估算和优先级排列。 时间箱三：Sprint计划会议（Sprint Planning Meeting） Sprint计划会议的产物是Sprint Backlog。对于一个月为周期的Sprint，计划会议的时间箱限定为8小时。对于较短的Sprint，计划会议一般安排整个Sprint周期的5%时间。Sprint计划会议的内容包括以下两个部分：第一部分，4小时的时间箱中需要确定该Sprint将要完成什么任务。第二部分，也是4小时的时间箱，团队研究在Sprint内如何构建产品增量。 Sprint计划会议包含两部分内容：“做什么”和“怎么做”。一些Scrum团队将这两部分结合起来。第一部分，Scrum团队处理“做什么”的问题。产品负责人给团队介绍最高优先级的产品Backlog条目，并一起决定接下来的Sprint中开发什么功能。Sprint计划会议需要输入包括产品Backlog、最新的产品增量、团队的能力和以往的表现。团队自己决定选择多少产品Backlog的条目，因为只有团队可以评估在接下来的Sprint内可以完成什么工作。 选定产品Backlog条目后，Sprint目标也就明确了。Sprint目标通过实现产品Backlog的条目来达到。Sprint目标为团队提供指导，使团队明确构建的产品增量的目的。Sprint目标是发布目标的子集。 确定Sprint目标的原因是在功能方面为团队留出一定的回旋余地。例如，上一个Sprint的目标可能是：“通过一种安全、可重获的交易中间件实现客户账户修改功能的自动化”。所以当团队工作时，就会紧记这个目标。为了达到这个目标，团队就需要实现该功能和技术。如果团队感觉实现过程比预期的难度大，那么就可以和产品负责人协商，只实现部分功能。 在Sprint计划会议的第二部分，团队需要处理“怎么做”的问题。在Sprint计划会议的第二个4小时时间箱中，团队需要弄清楚如何将“做什么”会议阶段选定的产品Backlog条目转化成完成的增量。通常团队会先以设计展开工作，设计过程中，团队确定任务，这些任务就是将产品Backlog转化成可用软件的具体工作。任务需要被分解，以便在一天之内完成。这个任务列表就是SprintBacklog。团队通过自组织，并且是自己认领的方式分担任务，任务认领可以在Sprint计划会议上进行，或也可以Sprint中及时（Just-in-time）确定。 通常，Sprint计划会议上只设计出SprintBacklog的60- 70%。剩余部分后续完成，或者给出大体的估算并在Sprint中再分解。 产品负责人会参加Sprint计划会议的第二部分，为团队讲解产品Backlog条目，并协助团队权衡取舍。如果团队认为工作量过大或太小，就可以和产品负责人重新协商、确定产品Backlog。团队也可以邀请其他人员参加会议，以寻求技术和领域建议。新组建的团队常常在这次会议中第一次意识到：整个团队要么一起成功，要么一起失败，没有个体这个概念。团队同时认识到必须依靠自己。正因为意识到这一点，整个团队才逐渐自组织并形成自己的特色，真正成为一个团队。 时间箱四：每日站会（Daily Scrum Meeting） 团队每天15分钟的检视和调整会议称之为每日站会。每日站会在各个Sprint都是在同一时间，同一地点进行，因为会议时间很短，通常，会议都是站立进行的。会议上，每个团队成员需要回答以下三个问题： 从上次会议到现在都完成了哪些工作？ 下次每日站会之前准备完成什么？ 工作中遇到了哪些障碍？ 每日站会可以增强交流沟通、省略其他会议、确定并排除开发遇到的障碍、强调和提倡快速决策、提高每个成员对项目的认知程度。 ScrumMaster要确保团队举行每日站会，团队则负责召开会议。ScrumMaster指导团队执行规则来控制会议时间，并保证团队成员进行简短有效的汇报。ScrumMaster也要确保“鸡” 的角色不允许在会议上发言或以各种方式干扰会议。 每日站会不是进度汇报会议。这个会议是为那些将产品Backlog条目转化成为产品增量的人（ 团队）召开的。团队承诺实现Sprint目标和完成产品Backlog条目，每日站会对Sprint目标的进展的检视（三个问题）。紧随每日站会之后的一些解决问题的会议通常是对Sprint中的下一步工作进行调整，目的在于增加团队实现目标的可能性。这是Scrum经验过程中的重要检视和调整的会议。 时间箱五：Sprint评审会（Sprint Review Meeting） Sprint结束时要举行Sprint评审会议，一个月的Sprint通常对应时长4小时Sprint评审会议。对于时间少于一个月的Sprint来说，该会议的时长不要超过整个Sprint的5%。 Sprint评审会议中，Scrum团队和利益干系人沟通Sprint中完成了哪些工作。然后，根据完成情况和Sprint期间产品Backlog的变化，他们确定接下来的工作。这是一个非正式会议，会议中进行功能演示，以促进下一步工作的互助与合作。 评审会议至少要包含以下因素：产品负责人确定完成了哪些工作和剩余哪些工作。团队讨论在Sprint中哪些工作进展顺利、遇到了什么问题、问题是如何解决的。然后，团队演示完成的工作并答疑。产品负责人和与会人员讨论产品Backlog，并根据不同的速率计划出可能的完成日期。接着，整个团体就哪些工作已经完成，同时这对下一步工作有何意义进行探讨。Sprint评审会议为接下来的Sprint计划会议提供了宝贵的参考信息。 时间箱六：Sprint 回顾会议（Sprint RetrospectiveMeeting） 在Sprint评审会议结束之后和下个Sprint计划会议之前，Scrum团队需要举行Sprint回顾会议。对于长度为一个月的Sprint，回顾会议的长度一般为3小时，在会议上，ScrumMaster鼓励团队在Scrum过程框架和时间的范围内，对自己的开发过程进行改进，使下一个Sprint的效率更高、工作更容易。许多书籍都介绍了召开回顾会议的技巧。 回顾会议旨在对前一个Sprint周期中的人、关系、过程和工具进行检验。检验应当确定并重点发展那些进展顺利的，和那些如果采用不同方法可以取得更好效果的条目。这些包括：Scrum团队、会议安排、工具、“完成”定义、沟通方法和将产品Backlog条目转化成“完成”工作的过程。在Sprint回顾会议的最后，Scrum团队应该确定将要在下个Sprint中实现的有效改进方法。这些变化更适应于经验检验。 来源：http://www.scrumcn.com/scrumbase/html/?24.html]]></description>
			<content:encoded><![CDATA[<p>时间箱机制是Scrum的一个非常重要的方面。在Scrum框架中有六个时间箱。</p>
<p>时间箱一：Sprint</p>
<p>Sprint的本意是指冲刺，在Scrum中，一个Sprint就是一个迭代，Sprint长度通常2-4周，它是一个时间箱，在项目进行过程中不允许延长或缩短Sprint长度。在Sprint中，ScrumMaster要确保没有任何影响Sprint目标的变更发生。团队构成和质量目标在Sprint中均保持不变。Sprint由Sprint计划会议、开发工作(需求分析、设计、开发、测试、质量控制等)、每日站会、Sprint评审会议和Sprint回顾会议等活动组成。Sprint一个紧跟一个进行，之间没有任何时间间隔。</p>
<p>其它的5个时间箱对应Scrum的5个仪式：</p>
<p>时间箱二：发布计划会议（Release Planning Meeting）</p>
<p>发布计划会议的目的是建立Scrum团队以及组织内的其他部门能够理解和沟通的计划和目标。发布计划会议需要回答以下两个问题：“我们如何以最佳方式将愿景转化为成功的产品？我们怎样才能达到或甚至超越客户的满意度和投资回报？”发布计划确定发布目标、具有最高优先级的产品Backlog条目、重大风险和发布所包含的全部特性和功能。另外， 发布计划会议确立大致交付日期和费用，如果没有任何变化就应当保持该日期和费用。组织可以检视开发进程，以每个Sprint为基础调整发布计划。</p>
<p>发布计划会议是完全是可选的。如果项目开始的时候没有这个会议，那么这些工件的缺少将成为一个需要被移除的障碍，解决这个障碍便成为了产品Backlog中的一个条目。</p>
<p>Scrum以迭代的方式构建产品，每个Sprint中都会交付产品增量，通常价值最高、风险最大的部分先开发。产品增量随着Sprint交替而完成，每个增量都是整个产品的可交付一部分。当创造出足够多的有价值的、可供投资方使用的产品增量时，产品就可以发布了。</p>
<p>大多数组织已经有自己的发布计划过程，并且在大多数过程中的大部分计划已经在发布之初完成，而且也不会更改。在Scrum发布计划会议上确立一个整体目标和预期结果。发布计划会议通常不超过组织构建传统发布计划的15-20%时间。然而，Scrum发布在每个Sprint评审和计划会议上都执行准时（Just-in-time）计划，同时，在每日站会上执行每日准时（Just-in-time）计划。总的看来，Scrum发布可能比传统的发布计划耗费略多的工作。</p>
<p>发布计划会议需要为该发布做产品Backlog条目的估算和优先级排列。</p>
<p>时间箱三：Sprint计划会议（Sprint Planning Meeting）</p>
<p>Sprint计划会议的产物是Sprint Backlog。对于一个月为周期的Sprint，计划会议的时间箱限定为8小时。对于较短的Sprint，计划会议一般安排整个Sprint周期的5%时间。Sprint计划会议的内容包括以下两个部分：第一部分，4小时的时间箱中需要确定该Sprint将要完成什么任务。第二部分，也是4小时的时间箱，团队研究在Sprint内如何构建产品增量。</p>
<p>Sprint计划会议包含两部分内容：“做什么”和“怎么做”。一些Scrum团队将这两部分结合起来。第一部分，Scrum团队处理“做什么”的问题。产品负责人给团队介绍最高优先级的产品Backlog条目，并一起决定接下来的Sprint中开发什么功能。Sprint计划会议需要输入包括产品Backlog、最新的产品增量、团队的能力和以往的表现。团队自己决定选择多少产品Backlog的条目，因为只有团队可以评估在接下来的Sprint内可以完成什么工作。</p>
<p>选定产品Backlog条目后，Sprint目标也就明确了。Sprint目标通过实现产品Backlog的条目来达到。Sprint目标为团队提供指导，使团队明确构建的产品增量的目的。Sprint目标是发布目标的子集。</p>
<p>确定Sprint目标的原因是在功能方面为团队留出一定的回旋余地。例如，上一个Sprint的目标可能是：“通过一种安全、可重获的交易中间件实现客户账户修改功能的自动化”。所以当团队工作时，就会紧记这个目标。为了达到这个目标，团队就需要实现该功能和技术。如果团队感觉实现过程比预期的难度大，那么就可以和产品负责人协商，只实现部分功能。</p>
<p>在Sprint计划会议的第二部分，团队需要处理“怎么做”的问题。在Sprint计划会议的第二个4小时时间箱中，团队需要弄清楚如何将“做什么”会议阶段选定的产品Backlog条目转化成完成的增量。通常团队会先以设计展开工作，设计过程中，团队确定任务，这些任务就是将产品Backlog转化成可用软件的具体工作。任务需要被分解，以便在一天之内完成。这个任务列表就是SprintBacklog。团队通过自组织，并且是自己认领的方式分担任务，任务认领可以在Sprint计划会议上进行，或也可以Sprint中及时（Just-in-time）确定。</p>
<p>通常，Sprint计划会议上只设计出SprintBacklog的60- 70%。剩余部分后续完成，或者给出大体的估算并在Sprint中再分解。</p>
<p>产品负责人会参加Sprint计划会议的第二部分，为团队讲解产品Backlog条目，并协助团队权衡取舍。如果团队认为工作量过大或太小，就可以和产品负责人重新协商、确定产品Backlog。团队也可以邀请其他人员参加会议，以寻求技术和领域建议。新组建的团队常常在这次会议中第一次意识到：整个团队要么一起成功，要么一起失败，没有个体这个概念。团队同时认识到必须依靠自己。正因为意识到这一点，整个团队才逐渐自组织并形成自己的特色，真正成为一个团队。</p>
<p>时间箱四：每日站会（Daily Scrum Meeting）</p>
<p>团队每天15分钟的检视和调整会议称之为每日站会。每日站会在各个Sprint都是在同一时间，同一地点进行，因为会议时间很短，通常，会议都是站立进行的。会议上，每个团队成员需要回答以下三个问题：</p>
<p>从上次会议到现在都完成了哪些工作？</p>
<p>下次每日站会之前准备完成什么？</p>
<p>工作中遇到了哪些障碍？</p>
<p>每日站会可以增强交流沟通、省略其他会议、确定并排除开发遇到的障碍、强调和提倡快速决策、提高每个成员对项目的认知程度。</p>
<p>ScrumMaster要确保团队举行每日站会，团队则负责召开会议。ScrumMaster指导团队执行规则来控制会议时间，并保证团队成员进行简短有效的汇报。ScrumMaster也要确保“鸡” 的角色不允许在会议上发言或以各种方式干扰会议。</p>
<p>每日站会不是进度汇报会议。这个会议是为那些将产品Backlog条目转化成为产品增量的人（ 团队）召开的。团队承诺实现Sprint目标和完成产品Backlog条目，每日站会对Sprint目标的进展的检视（三个问题）。紧随每日站会之后的一些解决问题的会议通常是对Sprint中的下一步工作进行调整，目的在于增加团队实现目标的可能性。这是Scrum经验过程中的重要检视和调整的会议。</p>
<p>时间箱五：Sprint评审会（Sprint Review Meeting）</p>
<p>Sprint结束时要举行Sprint评审会议，一个月的Sprint通常对应时长4小时Sprint评审会议。对于时间少于一个月的Sprint来说，该会议的时长不要超过整个Sprint的5%。</p>
<p>Sprint评审会议中，Scrum团队和利益干系人沟通Sprint中完成了哪些工作。然后，根据完成情况和Sprint期间产品Backlog的变化，他们确定接下来的工作。这是一个非正式会议，会议中进行功能演示，以促进下一步工作的互助与合作。</p>
<p>评审会议至少要包含以下因素：产品负责人确定完成了哪些工作和剩余哪些工作。团队讨论在Sprint中哪些工作进展顺利、遇到了什么问题、问题是如何解决的。然后，团队演示完成的工作并答疑。产品负责人和与会人员讨论产品Backlog，并根据不同的速率计划出可能的完成日期。接着，整个团体就哪些工作已经完成，同时这对下一步工作有何意义进行探讨。Sprint评审会议为接下来的Sprint计划会议提供了宝贵的参考信息。</p>
<p>时间箱六：Sprint 回顾会议（Sprint RetrospectiveMeeting）</p>
<p>在Sprint评审会议结束之后和下个Sprint计划会议之前，Scrum团队需要举行Sprint回顾会议。对于长度为一个月的Sprint，回顾会议的长度一般为3小时，在会议上，ScrumMaster鼓励团队在Scrum过程框架和时间的范围内，对自己的开发过程进行改进，使下一个Sprint的效率更高、工作更容易。许多书籍都介绍了召开回顾会议的技巧。</p>
<p>回顾会议旨在对前一个Sprint周期中的人、关系、过程和工具进行检验。检验应当确定并重点发展那些进展顺利的，和那些如果采用不同方法可以取得更好效果的条目。这些包括：Scrum团队、会议安排、工具、“完成”定义、沟通方法和将产品Backlog条目转化成“完成”工作的过程。在Sprint回顾会议的最后，Scrum团队应该确定将要在下个Sprint中实现的有效改进方法。这些变化更适应于经验检验。</p>
<p>来源：http://www.scrumcn.com/scrumbase/html/?24.html</p>
]]></content:encoded>
			<wfw:commentRss>http://www.doupie.com/2010/08/10/scrum%e7%9a%84%e5%85%ad%e4%b8%aa%e6%97%b6%e9%97%b4%e7%ae%b1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Singleton pattern</title>
		<link>http://www.doupie.com/2010/08/03/php-singleton-pattern/</link>
		<comments>http://www.doupie.com/2010/08/03/php-singleton-pattern/#comments</comments>
		<pubDate>Tue, 03 Aug 2010 03:19:46 +0000</pubDate>
		<dc:creator>Jayson</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[pattern]]></category>

		<guid isPermaLink="false">http://www.doupie.com/?p=522</guid>
		<description><![CDATA[class Singleton { private $database; private static $instance; private function __construct() { $this->database = null; } public static function getInstance() { if( !(self::$instance instanceof self)) { self::$instance == new self(); } return self::$instance } //singleton class should not be cloneable. private function __clone(){} }]]></description>
			<content:encoded><![CDATA[<pre class="brush:php">
class Singleton
{
  private $database;
  private static $instance;
  private function __construct()
  {
     $this->database = null;
  }
  public static function getInstance()
  {
    if( !(self::$instance instanceof self))
    {
      self::$instance == new self();
    }
    return self::$instance
  }
  //singleton class should not be cloneable.
  private function __clone(){}
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.doupie.com/2010/08/03/php-singleton-pattern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>类与对象(PHP5)之十二：对象克隆(Object cloning)</title>
		<link>http://www.doupie.com/2010/08/02/%e7%b1%bb%e4%b8%8e%e5%af%b9%e8%b1%a1php5%e4%b9%8b%e5%8d%81%e4%ba%8c%ef%bc%9a%e5%af%b9%e8%b1%a1%e5%85%8b%e9%9a%86object-cloning/</link>
		<comments>http://www.doupie.com/2010/08/02/%e7%b1%bb%e4%b8%8e%e5%af%b9%e8%b1%a1php5%e4%b9%8b%e5%8d%81%e4%ba%8c%ef%bc%9a%e5%af%b9%e8%b1%a1%e5%85%8b%e9%9a%86object-cloning/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 09:48:39 +0000</pubDate>
		<dc:creator>Jayson</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[分享]]></category>

		<guid isPermaLink="false">http://www.doupie.com/?p=519</guid>
		<description><![CDATA[通过完全地复制属性创建一个对象的拷贝不是通常想要的行为。需求的一个好的实例适合于拷贝构造函数， 如果有一个对象描述一个GTK窗口和对象保存这个GTK窗口的资源，当你创建一个副本，你或许想创建一个相同的属性新窗口使用和保存新对象资源的新窗口。另一个例子是当你复制父对象时如果保存一个引用给另一个对象，你想创建其他类的一个新实例来分开拷贝所属的复制品。一个对象的拷贝是使用clone关键字来创建的(如果可能的话可以调用对象的__clone()方法)，一个对象的__clone()方法不能被直接声明。 PHP代码如下: $copy_of_object = clone $object; 当一个对象被克隆时，PHP5将执行一个所有对象的属性的浅拷贝。任何对其它变量引用的属性将只保留引用。如果一个__clone()方法被定义，然后重新创建一个对象的克隆方法来允许任何必需的属性当它需要被改变时调用。 例子 19-30. 克隆一个对象 PHP代码如下: instance=++self::$instances; } public function __clone() { $this-&#62;instance=++self::$instances; } } class MyCloneable { public $object1; public $object2; function __clone() { $this-&#62;object1=clone($this-&#62;object1);//Force a copy of this-&#62;object,otherwise it will point to same object. } } $obj = new MyCloneable(); $obj-&#62;object1 = new SubObject(); $obj-&#62;object2 = new [...]]]></description>
			<content:encoded><![CDATA[<p>通过完全地复制属性创建一个对象的拷贝不是通常想要的行为。需求的一个好的实例适合于拷贝构造函数，<br />
如果有一个对象描述一个GTK窗口和对象保存这个GTK窗口的资源，当你创建一个副本，你或许想创建一个相同的属性新窗口使用和保存新对象资源的新窗口。另一个例子是当你复制父对象时如果保存一个引用给另一个对象，你想创建其他类的一个新实例来分开拷贝所属的复制品。一个对象的拷贝是使用clone关键字来创建的(如果可能的话可以调用对象的__clone()方法)，一个对象的__clone()方法不能被直接声明。<br />
PHP代码如下:</p>
<p>$copy_of_object = clone $object;</p>
<p>当一个对象被克隆时，PHP5将执行一个所有对象的属性的浅拷贝。任何对其它变量引用的属性将只保留引用。如果一个__clone()方法被定义，然后重新创建一个对象的克隆方法来允许任何必需的属性当它需要被改变时调用。<br />
例子 19-30. 克隆一个对象<br />
PHP代码如下:</p>
<pre class="brush:php">
instance=++self::$instances;  }
public function __clone() {  $this-&gt;instance=++self::$instances;  }
}
class MyCloneable
{   public $object1;
public $object2;
function __clone()
{
$this-&gt;object1=clone($this-&gt;object1);//Force a copy of this-&gt;object,otherwise it will point to same object.
}
}
$obj = new MyCloneable();
$obj-&gt;object1 = new SubObject();
$obj-&gt;object2 = new SubObject();
$obj2 = clone $obj;
print("Original Object:\n");
print_r($obj);
print("Cloned Object:\n");
print_r($obj2);
?&gt;
</pre>
<p>上例将输出：</p>
<pre class="brush:plain">
Original Object:
MyCloneable Object
(
[object1] =&gt; SubObject Object
(
[instance] =&gt; 1
)
[object2] =&gt; SubObject Object
(
[instance] =&gt; 2
)
)
Cloned Object:
MyCloneable Object
(
[object1] =&gt; SubObject Object
(
[instance] =&gt; 3
)
[object2] =&gt; SubObject Object
(
[instance] =&gt; 2
)
)
</pre>
<p>来源：http://www.phpchina.com/html/63/n-1263.html</p>
]]></content:encoded>
			<wfw:commentRss>http://www.doupie.com/2010/08/02/%e7%b1%bb%e4%b8%8e%e5%af%b9%e8%b1%a1php5%e4%b9%8b%e5%8d%81%e4%ba%8c%ef%bc%9a%e5%af%b9%e8%b1%a1%e5%85%8b%e9%9a%86object-cloning/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSS position定位</title>
		<link>http://www.doupie.com/2010/07/29/css-position%e5%ae%9a%e4%bd%8d/</link>
		<comments>http://www.doupie.com/2010/07/29/css-position%e5%ae%9a%e4%bd%8d/#comments</comments>
		<pubDate>Thu, 29 Jul 2010 07:29:16 +0000</pubDate>
		<dc:creator>Jayson</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[css]]></category>

		<guid isPermaLink="false">http://www.doupie.com/?p=517</guid>
		<description><![CDATA[css定位主要通过position属性和float属性 position属性有四个值，分别为static，relative，absolute，fixed static是默认值，即按元素既定的规则解析排列，因为position不是继承的，所以也很少会有情况用到 relative，相对定位很容易造成误解，首先相对定位是作用元素本身的，但是如果你只设了position:relative但是没有设置left,right,top,bottom的值，那么元素本身的位置是不会变化的。但是设置relative的元素会影响到其子元素的定位，尤其当子元素使用absolute定位时。另外设置了relatvie属性的元素可以使用z－index属性，而且任何relative元素都会在static元素之上，无论是否设置了z－index。 absolute，绝对定位的元素不会参与其他元素的flow，也不会影响他们的定位，可以把绝对定位的元素想象成独立的， fixed，固定定位，和absolute类似，但是它只相对浏览器窗口（viewport）定位，不会受父元素的局限。而且fixed的元素不会随着窗口页面滚动而滚动。但是fixed元素IE6不支持，所以需要hacker #top{ position:fixed; _position:absolute; bottom:0; right:20px; _bottom:auto; _top:expression(eval(document.documentElement.scrollTop+document.documentElement.clientHeight-this.offsetHeight-(parseInt(this.currentStyle.marginTop,10)&#124;&#124;0)-(parseInt(this.currentStyle.marginBottom,10)&#124;&#124;0))); } 通过绝对定位来实现，但是这样在拖动浏览器的时候会出现闪动的现象，解决的方法是，添加 *html{ background-image:url(about:blank); background-attachment:fixed; } 这样问题就解决了。 强烈推荐读一下这个，http://www.barelyfitz.com/screencast/html-training/css/positioning/]]></description>
			<content:encoded><![CDATA[<p>css定位主要通过position属性和float属性</p>
<p>position属性有四个值，分别为static，relative，absolute，fixed</p>
<p>static是默认值，即按元素既定的规则解析排列，因为position不是继承的，所以也很少会有情况用到</p>
<p>relative，相对定位很容易造成误解，首先相对定位是作用元素本身的，但是如果你只设了position:relative但是没有设置left,right,top,bottom的值，那么元素本身的位置是不会变化的。但是设置relative的元素会影响到其子元素的定位，尤其当子元素使用absolute定位时。另外设置了relatvie属性的元素可以使用z－index属性，而且任何relative元素都会在static元素之上，无论是否设置了z－index。</p>
<p>absolute，绝对定位的元素不会参与其他元素的flow，也不会影响他们的定位，可以把绝对定位的元素想象成独立的，</p>
<p>fixed，固定定位，和absolute类似，但是它只相对浏览器窗口（viewport）定位，不会受父元素的局限。而且fixed的元素不会随着窗口页面滚动而滚动。但是fixed元素IE6不支持，所以需要hacker</p>
<pre class="brush:css">
#top{
position:fixed;
_position:absolute;
bottom:0;
right:20px;
_bottom:auto;
_top:expression(eval(document.documentElement.scrollTop+document.documentElement.clientHeight-this.offsetHeight-(parseInt(this.currentStyle.marginTop,10)||0)-(parseInt(this.currentStyle.marginBottom,10)||0)));
}
</pre>
<p>通过绝对定位来实现，但是这样在拖动浏览器的时候会出现闪动的现象，解决的方法是，添加</p>
<pre class="brush:css">
*html{
background-image:url(about:blank);
background-attachment:fixed;
}
</pre>
<p>这样问题就解决了。</p>
<p>强烈推荐读一下这个，http://www.barelyfitz.com/screencast/html-training/css/positioning/</p>
]]></content:encoded>
			<wfw:commentRss>http://www.doupie.com/2010/07/29/css-position%e5%ae%9a%e4%bd%8d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->