<?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>Nocoo.Weblog &#187; 作品发布</title>
	<atom:link href="http://www.nocoo.us/category/works/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.nocoo.us</link>
	<description>Professional, Passion and Patient</description>
	<lastBuildDate>Sun, 27 Jun 2010 09:55:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>兼容各种浏览器的JavaScript图片幻灯片</title>
		<link>http://www.nocoo.us/2009/04/javascript-slideshow/</link>
		<comments>http://www.nocoo.us/2009/04/javascript-slideshow/#comments</comments>
		<pubDate>Wed, 08 Apr 2009 16:01:54 +0000</pubDate>
		<dc:creator>nocoo</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[作品发布]]></category>

		<guid isPermaLink="false">http://www.nocoo.us/?p=3715</guid>
		<description><![CDATA[兼容IE6,IE7,IE8,Firefox,Maxthon,Safari,Opera. functions.js /* 存储参数 */ var links = new Array(); var imgs = new Array(); var titles = new Array(); /* 显示参数 */ var imageWidth = 457;//图片宽度 var imageHeight = 210;//图片高度 var loading = &#34;http://www.zainanfang.com/wp-content/themes/zainanfang/images/loading.png&#34;;//加载中图片 var hightColor = &#34;#CF9262&#34;;//高亮色彩 var lowColor = &#34;#F5F8F3&#34;;//低亮色彩 var titleColor = &#34;#000&#34;;//题目文字色彩 /* 控制参数 */ var count = 4;//图片个数 var [...]]]></description>
			<content:encoded><![CDATA[<p>兼容IE6,IE7,IE8,Firefox,Maxthon,Safari,Opera.</p>
<h3>functions.js</h3>
<pre class="brush: js">
/* 存储参数 */
var links = new Array();
var imgs = new Array();
var titles = new Array();

/* 显示参数 */
var imageWidth = 457;//图片宽度
var imageHeight = 210;//图片高度
var loading = &quot;http://www.zainanfang.com/wp-content/themes/zainanfang/images/loading.png&quot;;//加载中图片
var hightColor = &quot;#CF9262&quot;;//高亮色彩
var lowColor = &quot;#F5F8F3&quot;;//低亮色彩
var titleColor = &quot;#000&quot;;//题目文字色彩

/* 控制参数 */
var count = 4;//图片个数
var changeTime = 2000;//切换时间,单位毫秒

/* 初始化容器 */
for(var i = 1; i &lt;= count; i++) { imgs[i] = new Image(); imgs[i].src = loading; titles[i] = &quot;&quot;; links[i] = &quot;#&quot;;}

/* 插入CSS代码 */
var str = &quot;&lt;style type=&#039;text/css&#039;&gt;&quot;;
str += &quot;#imgnv{height:16px;display:inline;}#imgnv div{float:left;margin-right:1px;display:inline;}&quot;;
str += &quot;#imgnv div.on,#imgnv div.off{margin-bottom:1px;width:30px;height:15px;line-height:16px!important;font-size:9px;text-align:center;cursor:pointer;cursor:hand}&quot;;
str += &quot;#imgnv div.on{background:&quot;+hightColor+&quot;;color:&quot;+lowColor+&quot;;}&quot;;
str += &quot;#imgnv div.off{background:&quot;+lowColor+&quot;;color:&quot;+hightColor+&quot;;text-decoration:none}&quot;;
str += &quot;#titnv{color:&quot;+titleColor+&quot;;text-align:center;font-weight:bold;margin-top:5px;}&quot;;
str += &quot;&lt;/style&gt;&quot;;
str += &quot;&lt;div style=&#039;position:relative;border:1px solid #FFF&#039;&gt;&quot;;
str += &quot;&lt;div&gt;&lt;a id=&#039;dlink&#039; href=&#039;#&#039;&gt;&lt;img id=&#039;dimg&#039; src=&#039;&quot; + loading + &quot;&#039; border=&#039;0&#039; width=&#039;&quot; + imageWidth + &quot;&#039; height=&#039;&quot;+imageHeight+&quot;&#039; style=&#039;filter:Alpha(opacity=100)&#039; onmouseover=&#039;Pause(true)&#039; onmouseout=&#039;Pause(false)&#039;&gt;&lt;/a&gt;&lt;/div&gt;&quot;;

/* 添加图片 */
str += &quot;&lt;div id=&#039;imgnv&#039;&gt;&quot;;
for(var i = 1; i &lt;= count; i++)
{
str += &quot;&lt;div id=&#039;it&quot;+i+&quot;&#039; class=&#039;&quot;;
if(i == 1) str += &quot;on&quot;; else str += &quot;off&quot;;
str += &quot;&#039; onmouseover=&#039;ImgSwitch(&quot;+i+&quot;, true)&#039; onmouseout=&#039;Pause(false)&#039;&gt;&quot;+i+&quot;&lt;/div&gt;&quot;;
}
str += &quot;&lt;/div&gt;&lt;div id=&#039;titnv&#039;&gt;&lt;/div&gt;&quot;;
str += &quot;&lt;/div&gt;&quot;;

function SetAlpha(){if(document.all){if(oi.filters &amp;amp;amp;amp;&amp;amp;amp;amp; oi.filters.Alpha) oi.filters.Alpha.opacity = opacity;}else{oi.style.MozOpacity = ((opacity &gt;= 100)? 99:opacity) / 100;}}
function ImgSwitch(id, p){if(p){pause = true;opacity = 100;SetAlpha();}oi.src = imgs[id].src;document.getElementById(&quot;dlink&quot;).href = links[id];document.getElementById(&quot;it&quot; + lastid).className = &quot;off&quot;;document.getElementById(&quot;it&quot; + id).className = &quot;on&quot;;document.getElementById(&quot;titnv&quot;).innerHTML = &quot;&lt;strong&gt;&quot; + titles[id] + &quot;&lt;/strong&gt;&quot;;curid = lastid = id;}
function ScrollImg(){if(pause &amp;amp;amp;amp;&amp;amp;amp;amp; opacity &gt;= 100) return;if(sw == 0){opacity += 2;if(opacity &gt; delay){ opacity = 100; sw = 1; }}if(sw == 1){opacity -= 3;if(opacity &lt; 10){ opacity = 10; sw = 3; }}SetAlpha();if(sw != 3) return;sw = 0;curid++; if(curid &gt; count) curid = 1;ImgSwitch(curid, false);}
function Pause(s){pause = s;}
function StartScroll(){setInterval(ScrollImg, speed);}
function CheckLoad(){if (imgs[1].complete == true &amp;amp;amp;amp;&amp;amp;amp;amp; imgs[2].complete == true) {clearInterval(checkid);setTimeout(StartScroll, changeTime);}}
</pre>
<h3>index.php</h3>
<pre class="brush: js">
&lt;script src=&quot;&lt;?php bloginfo(&#039;template_directory&#039;) ?&gt;/functions.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
links[1] = &quot;&lt;?php global $post; echo get_post_meta(198, &#039;link1&#039;, true); ?&gt;&quot;;
links[2] = &quot;&lt;?php global $post; echo get_post_meta(198, &#039;link2&#039;, true); ?&gt;&quot;;
links[3] = &quot;&lt;?php global $post; echo get_post_meta(198, &#039;link3&#039;, true); ?&gt;&quot;;
links[4] = &quot;&lt;?php global $post; echo get_post_meta(198, &#039;link4&#039;, true); ?&gt;&quot;;

imgs[1].src = &quot;&lt;?php global $post; echo get_post_meta(198, &#039;image1&#039;, true); ?&gt;&quot;;
imgs[2].src = &quot;&lt;?php global $post; echo get_post_meta(198, &#039;image2&#039;, true); ?&gt;&quot;;
imgs[3].src = &quot;&lt;?php global $post; echo get_post_meta(198, &#039;image3&#039;, true); ?&gt;&quot;;
imgs[4].src = &quot;&lt;?php global $post; echo get_post_meta(198, &#039;image4&#039;, true); ?&gt;&quot;;

titles[1] = &quot;&lt;?php global $post; echo get_post_meta(198, &#039;title1&#039;, true); ?&gt;&quot;;
titles[2] = &quot;&lt;?php global $post; echo get_post_meta(198, &#039;title2&#039;, true); ?&gt;&quot;;
titles[3] = &quot;&lt;?php global $post; echo get_post_meta(198, &#039;title3&#039;, true); ?&gt;&quot;;
titles[4] = &quot;&lt;?php global $post; echo get_post_meta(198, &#039;title4&#039;, true); ?&gt;&quot;;
document.write(str);

var oi = document.getElementById(&quot;dimg&quot;);
var pause = false;
var curid = 1;
var lastid = 1;
var sw = 1;
var opacity = 100;
var speed = 15;
var delay = (document.all)? 400:700;
var checkid = setInterval(CheckLoad, 10);
&lt;/script&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.nocoo.us/2009/04/javascript-slideshow/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>在南方网站设计</title>
		<link>http://www.nocoo.us/2009/04/zainanfangcom/</link>
		<comments>http://www.nocoo.us/2009/04/zainanfangcom/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 11:10:00 +0000</pubDate>
		<dc:creator>nocoo</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[作品发布]]></category>
		<category><![CDATA[开发心得]]></category>
		<category><![CDATA[心情日记]]></category>
		<category><![CDATA[服务器和集群技术]]></category>

		<guid isPermaLink="false">http://www.nocoo.us/?p=3697</guid>
		<description><![CDATA[最近在忙什么?很久没写文字了吧~ 这几天一连接了两个网站项目来做,成功地都变成了WordPress后台.为WordPress开发模板真的是一件只能用惬意来形容的事情.一旦习惯了WordPress的&#8221;方言&#8221;,强大的功能实现起来并不是一个梦. 整体感觉起来,WordPress中提供对每篇文章的自定义域是最强大的功能,简直提供了一个小型数据库,你可以定义成任何东西! 上图就是最近一直在做的一个网站,在南方,是一个诗社.]]></description>
			<content:encoded><![CDATA[<p>最近在忙什么?很久没写文字了吧~<br />
这几天一连接了两个网站项目来做,成功地都变成了WordPress后台.为WordPress开发模板真的是一件只能用惬意来形容的事情.一旦习惯了WordPress的&#8221;方言&#8221;,强大的功能实现起来并不是一个梦.<br />
整体感觉起来,WordPress中提供对每篇文章的自定义域是最强大的功能,简直提供了一个小型数据库,你可以定义成任何东西!</p>
<p><a href="http://www.nocoo.us/wp-content/uploads/2009/04/zainanfang.jpg"><img src="http://www.nocoo.us/wp-content/uploads/2009/04/zainanfang-600x975.jpg" alt="zainanfang" title="zainanfang" width="600" height="975" class="alignnone size-large wp-image-3698" /></a></p>
<p>上图就是最近一直在做的一个网站,<a href="http://www.zainanfang.com">在南方</a>,是一个诗社.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nocoo.us/2009/04/zainanfangcom/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>创造爱的世界</title>
		<link>http://www.nocoo.us/2009/03/love-world-builder/</link>
		<comments>http://www.nocoo.us/2009/03/love-world-builder/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 02:38:55 +0000</pubDate>
		<dc:creator>nocoo</dc:creator>
				<category><![CDATA[作品发布]]></category>
		<category><![CDATA[心情日记]]></category>
		<category><![CDATA[心情]]></category>

		<guid isPermaLink="false">http://www.nocoo.us/?p=3611</guid>
		<description><![CDATA[趁我们还有实时创造属于自己的爱的世界的机会的时候，别浪费了它。]]></description>
			<content:encoded><![CDATA[<p><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" width="624" height="351"><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=3365942&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><param name="quality" value="high" /><param name="bgcolor" value="#FFFFFF" /><object data="http://vimeo.com/moogaloop.swf?clip_id=3365942&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" width="624" height="351" type="application/x-shockwave-flash"><param name="quality" value="high" /><param name="bgcolor" value="#FFFFFF" /><param name="pluginurl" value="http://www.macromedia.com/go/getflashplayer" /></object></object></p>
<p>趁我们还有实时创造属于自己的爱的世界的机会的时候，别浪费了它。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nocoo.us/2009/03/love-world-builder/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>网页读取并嵌入Google Docs文档及表格(PHP)</title>
		<link>http://www.nocoo.us/2009/02/php-google-docs-spreadsheet-document/</link>
		<comments>http://www.nocoo.us/2009/02/php-google-docs-spreadsheet-document/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 02:13:24 +0000</pubDate>
		<dc:creator>nocoo</dc:creator>
				<category><![CDATA[作品发布]]></category>
		<category><![CDATA[开发心得]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.nocoo.us/?p=3579</guid>
		<description><![CDATA[什么是 Google 数据 API？ Google 数据 API 提供用于在网络上读写数据的简单标准协议。 这些 API 可以使用基于 XML 的两种标准联合格式：Atom 或 RSS。它们还具有一个供稿发布系统，其中包括 Atom 发布协议和用于处理查询的一些扩展功能（使用 Atom 的标准扩展模型）。 许多 Google 服务都支持 Google 数据 API 协议。以下数据 API 可以使您的客户端应用程序与 Google 服务进行互动： Google 企业应用套件 API Google Base 数据 API Blogger 数据 API Google 图书搜索数据 API Google 日历数据 API Google Code 搜索数据 API Google Contacts 数据 API Google [...]]]></description>
			<content:encoded><![CDATA[<h3>什么是 Google 数据 API？</h3>
<blockquote><p>
Google 数据 API 提供用于在网络上读写数据的简单标准协议。<br />
这些 API 可以使用基于 XML 的两种标准联合格式：Atom 或 RSS。它们还具有一个供稿发布系统，其中包括 Atom 发布协议和用于处理查询的一些扩展功能（使用 Atom 的标准扩展模型）。<br />
许多 Google 服务都支持 <a href="http://code.google.com/intl/zh-CN/apis/gdata/overview.html">Google 数据 API 协议</a>。以下数据 API 可以使您的客户端应用程序与 Google 服务进行互动：</p>
<ul>
<li><a href="http://code.google.com/apis/apps/">Google 企业应用套件 API</a></li>
<li><a href="http://code.google.com/apis/base/">Google Base 数据 API</a></li>
<li><a href="http://code.google.com/apis/blogger/">Blogger 数据 API</a></li>
<li><a href="http://code.google.com/apis/books/">Google 图书搜索数据 API</a></li>
<li><a href="http://code.google.com/apis/calendar/">Google 日历数据 API</a></li>
<li><a href="http://code.google.com/apis/codesearch/">Google Code 搜索数据 API</a></li>
<li><a href="http://code.google.com/apis/contacts/">Google Contacts 数据 API</a></li>
<li><a href="http://code.google.com/apis/finance/">Google 财经文件夹数据 API</a></li>
<li><a href="http://code.google.com/apis/health/">Google Health 数据 API</a></li>
<li><a href="http://code.google.com/apis/notebook/">Google 记事本数据 API</a></li>
<li><a href="http://code.google.com/apis/spreadsheets/">Google 电子表格数据 API</a></li>
<li><a href="http://code.google.com/apis/picasaweb/">Picasa 网络相册数据 API</a></li>
<li><a href="http://code.google.com/apis/documents/">Google 在线文档列表数据 API</a></li>
<li><a href="http://code.google.com/apis/webmastertools/">网站管理员工具数据 API</a></li>
<li><a href="http://code.google.com/apis/youtube/">YouTube 数据 API</a></li>
</ul>
</blockquote>
<h3>动机</h3>
<p>这几天我在做自己的一个网站制作及托管服务的网站，牵涉到一些客户信息的管理什么的，最好是能做成OA之类的形式，就像Google Docs里的SpreadSheet一样，在线编辑，在线显示。不过我实在没时间去自己做这种东西，于是我在想是不是能直接通过API把Google Docs里的SpreadSheet直接嵌入我自己写的网页里去。不见得需要编辑功能，估计Google也不会提供，不然Google Docs不就变成带有后门的网站留言文本编辑器了么&#8230;(所谓带有后门，是指与一般留言文本编辑器不同，不是把数据存储在本地网站，而是存储在另一个服务器，在这里就是Google Docs服务器上)</p>
<p><a href="http://www.nocoo.us/wp-content/uploads/2009/02/php_google_docs1.png"><img src="http://www.nocoo.us/wp-content/uploads/2009/02/php_google_docs1-600x200.png" alt="php_google_docs1" title="php_google_docs1" width="600" height="200" class="alignnone size-large wp-image-3583" /></a></p>
<p>站在巨人的肩上，感谢<a href="http://broken-watch.info/">Lim Jiunn Haur</a>写的WordPress插件<a href="http://wordpress.org/extend/plugins/inline-google-docs/">Inline Google Docs</a>早就提供了这个功能，我把这个插件拆开，去掉多余的，为我所用了。</p>
<p><a href="http://www.nocoo.us/wp-content/uploads/2009/02/php_google_docs2.png"><img src="http://www.nocoo.us/wp-content/uploads/2009/02/php_google_docs2-600x355.png" alt="php_google_docs2" title="php_google_docs2" width="600" height="355" class="alignnone size-large wp-image-3584" /></a></p>
<h3>使用方法</h3>
<p>用法很简单，后面的<a href="#download">相关下载</a>中提供了一个RAR包，当中包含两个文件夹，styles里包含了一个CSS，用于修饰SpreadSheet表格显示的效果，这里的风格基本上是白灰风格，如上图所示。鉴于保密需求我做了模糊处理，反正就那么个意思。你需要在你的网站中加入这个CSS或者将这个集成到你的CSS中，或者干脆不要，自己写。<br />
includes文件夹是库，其中Zend是Google Data API库，由Google发布。gdocs是本文所述的库。加载Google Data API库的代码在gdocs下gdocs.php中，你可能需要做一点路径修改之类。至少在你的全局include库的地方加入Zend的位置，并include gdocs.php这个文件。</p>
<pre class="brush: php">
/* Add Zend library to path */
$path = dirname (__FILE__) . &quot;/includes&quot;;
set_include_path (get_include_path () . PATH_SEPARATOR . $path);
</pre>
<p>另有一个全局配置文件config.php，我并没有给出，你自己要补上。示例如下：</p>
<pre class="brush: php">
/*  Site Configuration */
define(&#039;SITE_URL&#039;, &#039;http://www.yourdomain.com/&#039;);

/*  Google Docs Settings */
define(&#039;GOOGLE_DOMAIN&#039;, &#039;yourdomain.com&#039;);
define(&#039;GOOGLE_USERNAME&#039;, &#039;username@yourdomain.com&#039;);
define(&#039;GOOGLE_PASSWORD&#039;, &#039;YourGooglePassword&#039;);
define(&#039;PROXY_HOST&#039;, &#039;&#039;);
define(&#039;PROXY_PORT&#039;, &#039;&#039;);
define(&#039;PROXY_USERNAME&#039;, &#039;&#039;);
define(&#039;PROXY_PASSWORD&#039;, &#039;&#039;);
</pre>
<p>调用显示Google Docs中包含的文档时，PHP代码如下：</p>
<pre class="brush: php">
gdocs_list();
</pre>
<p>具体的显示风格请自行修改includes的gdocs下，gdisplay.php文件。</p>
<p>调用显示某一个具体的SpreadSheet的时候，$atts['type']置&#8217;spreadsheet&#8217;，st_id为SpreadSheet的ID，例如&#8217;pNrLCrMF9srEYeIRCLO5kEF&#8217;，wt_id为工作表ID，例如&#8217;od6&#8242;，PHP代码如下：</p>
<pre class="brush: php">
$atts[&#039;type&#039;] = $_GET[&#039;type&#039;];
$atts[&#039;st_id&#039;] = $_GET[&#039;st_id&#039;];
$atts[&#039;wt_id&#039;] = $_GET[&#039;wt_id&#039;];
$atts[&#039;style&#039;] = &#039;googledocs&#039;;
$atts[&#039;headings&#039;] = NULL;

gdocs_display($atts);
</pre>
<h3>注意事项</h3>
<ul>
<li>按照原作者<a href="http://broken-watch.info/">Lim Jiunn Haur</a>代码中的声明，本作品源代码依旧遵循<a href="http://opensource.org/licenses/gpl-license.php">GNU Public License</a>。</li>
<li>修改之后的代码示例只包含了必要的我能用到的功能，就是对Google Docs中Document和SpreadSheet的列表，以及SpreadSheet的显示功能，其他功能并未写出实例，但是包含的Google Data API是完整的，应该可以写出进一步功能的代码，这里留给读者去自行研究吧。</li>
</ul>
<h3><a name="download">相关下载</a></h3>
<ul>
<li><a href="http://download.nocoo.us/Download/Archive/PHPGoogleData.rar">修改整理过的PHP版Google Data API库</a></li>
</ul>
<h3>参考资料</h3>
<ul>
<li><a href="http://code.google.com/intl/zh-CN/apis/gdata/">Google Data API官方文档</a></li>
<li><a href="http://wordpress.org/extend/plugins/inline-google-docs/">WordPress插件：Inline Google Docs</a></li>
<li><a href="http://broken-watch.info/">Inline Google Docs作者Lim Jiunn Haur的主页，不过我这儿打不开，估计被墙了</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.nocoo.us/2009/02/php-google-docs-spreadsheet-document/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>My Gmail</title>
		<link>http://www.nocoo.us/2009/02/my-gmail/</link>
		<comments>http://www.nocoo.us/2009/02/my-gmail/#comments</comments>
		<pubDate>Sat, 14 Feb 2009 03:53:38 +0000</pubDate>
		<dc:creator>nocoo</dc:creator>
				<category><![CDATA[作品发布]]></category>
		<category><![CDATA[心情日记]]></category>
		<category><![CDATA[Gmail]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[心情]]></category>

		<guid isPermaLink="false">http://www.nocoo.us/?p=3564</guid>
		<description><![CDATA[情人节，给自己的Gmail换了一个漂亮的主题~]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.nocoo.us/wp-content/uploads/2009/02/214gmail.png"><img src="http://www.nocoo.us/wp-content/uploads/2009/02/214gmail-600x887.png" alt="214gmail" title="214gmail" width="600" height="887" class="alignnone size-large wp-image-3565" /></a></p>
<p>情人节，给自己的Gmail换了一个漂亮的主题~</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nocoo.us/2009/02/my-gmail/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>符合标准的TreeView实现(Div+CSS+JS+ASP.NET)</title>
		<link>http://www.nocoo.us/2009/01/standard-treeview/</link>
		<comments>http://www.nocoo.us/2009/01/standard-treeview/#comments</comments>
		<pubDate>Thu, 15 Jan 2009 01:02:46 +0000</pubDate>
		<dc:creator>nocoo</dc:creator>
				<category><![CDATA[Web标准化研究]]></category>
		<category><![CDATA[作品发布]]></category>
		<category><![CDATA[开发心得]]></category>
		<category><![CDATA[微软技术]]></category>
		<category><![CDATA[服务器和集群技术]]></category>
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.nocoo.us/?p=3428</guid>
		<description><![CDATA[这几天有点小活，要求是ASP.NET的，虽然我不怎么看好ASP.NET，但是人家要求了我也就照做吧。 最复杂的部分是一个TreeView。出于兼容性和简单性考虑没有用ASP.NET的TreeView控件，而是参考一篇文章自行写了一个出来。 [singlepic=18460] 技术指标如下： 实现：Div+CSS+JavaScript+ASP.NET(C#) 功能：可以实现无限级的TreeNode 标准：在IE 7和Firefox 3.1下显示效果相同，兼容XHTML 1.0 Strict最严格的网页标准 效果如左图所示。最后一个函数可能会因为超宽看不到全部，具体请参照文章附件中的源代码。 附件下载：http://download.nocoo.us/Download/Archive/TreeViewCode.rar TreeNode.cs /// &#60;summary&#62; /// TreeView结点类 /// &#60;/summary&#62; public class TreeNode { private string name; private string href; private List&#60;TreeNode&#62; subNodes = new List&#60;TreeNode&#62;(); /// &#60;summary&#62; /// 结点名 /// &#60;/summary&#62; public string Name { get { return name; } } /// &#60;summary&#62; /// [...]]]></description>
			<content:encoded><![CDATA[<p>这几天有点小活，要求是ASP.NET的，虽然我不怎么看好ASP.NET，但是人家要求了我也就照做吧。<br />
最复杂的部分是一个TreeView。出于兼容性和简单性考虑没有用ASP.NET的TreeView控件，而是参考<a href="http://www.cnblogs.com/FrankChen/archive/2008/03/26/1122936.html">一篇文章</a>自行写了一个出来。</p>
<p>[singlepic=18460]</p>
<p>技术指标如下：</p>
<ul>
<li><strong>实现：</strong>Div+CSS+JavaScript+ASP.NET(C#)</li>
<li><strong>功能：</strong>可以实现无限级的TreeNode</li>
<li><strong>标准：</strong>在IE 7和Firefox 3.1下显示效果相同，兼容XHTML 1.0 Strict最严格的网页标准</li>
</ul>
<p>效果如左图所示。<strong>最后一个函数可能会因为超宽看不到全部，具体请参照文章附件中的源代码。</strong><br />
<strong>附件下载：</strong><a href="http://download.nocoo.us/Download/Archive/TreeViewCode.rar">http://download.nocoo.us/Download/Archive/TreeViewCode.rar</a></p>
<h3>TreeNode.cs</h3>
<pre class="brush: c#">
/// &lt;summary&gt;
/// TreeView结点类
/// &lt;/summary&gt;
public class TreeNode
{
    private string name;
    private string href;
    private List&lt;TreeNode&gt; subNodes = new List&lt;TreeNode&gt;();

    /// &lt;summary&gt;
    /// 结点名
    /// &lt;/summary&gt;
    public string Name { get { return name; } }
    /// &lt;summary&gt;
    /// 结点链接
    /// &lt;/summary&gt;
    public string Href { get { return href; } }
    /// &lt;summary&gt;
    /// 下级结点个数
    /// &lt;/summary&gt;
    public int Count { get { return this.subNodes.Count; } }
    /// &lt;summary&gt;
    /// 获取或者设置下级结点
    /// &lt;/summary&gt;
    /// &lt;param name=&quot;index&quot;&gt;序号&lt;/param&gt;
    /// &lt;returns&gt;下级结点&lt;/returns&gt;
    public TreeNode this[int index]
    {
        get { return subNodes[index]; }
        set { subNodes[index] = value; }
    }

    /// &lt;summary&gt;
    /// 构造函数
    /// &lt;/summary&gt;
    /// &lt;param name=&quot;name&quot;&gt;结点名&lt;/param&gt;
    public TreeNode(string name)
    {
        this.name = name;
        this.href = null;
    }

    /// &lt;summary&gt;
    /// 构造函数
    /// &lt;/summary&gt;
    /// &lt;param name=&quot;name&quot;&gt;结点名&lt;/param&gt;
    /// /// &lt;param name=&quot;href&quot;&gt;结点链接&lt;/param&gt;
    public TreeNode(string name, string href)
    {
        this.name = name;
        this.href = href;
    }

    /// &lt;summary&gt;
    /// 添加下级结点
    /// &lt;/summary&gt;
    /// &lt;param name=&quot;node&quot;&gt;新结点&lt;/param&gt;
    public void Add(TreeNode node)
    {
        subNodes.Add(node);
    }
}
</pre>
<h3>TreeView.cs</h3>
<pre class="brush: c#">
/// &lt;summary&gt;
/// TreeView
/// &lt;/summary&gt;
public class TreeView
{
    private List&lt;TreeNode&gt; nodes = new List&lt;TreeNode&gt;();

    /// &lt;summary&gt;
    /// 填充测试用数据
    /// &lt;/summary&gt;
    public void FillTestData()
    {
        TreeNode node1 = new TreeNode(&quot;中国&quot;, &quot;#&quot;);
        TreeNode node11 = new TreeNode(&quot;华北地区&quot;, &quot;#&quot;);
        TreeNode node111 = new TreeNode(&quot;河南省&quot;, &quot;#&quot;);
        TreeNode node112 = new TreeNode(&quot;河北省&quot;, &quot;#&quot;);
        TreeNode node113 = new TreeNode(&quot;山东省&quot;, &quot;#&quot;);
        TreeNode node1131 = new TreeNode(&quot;青岛市&quot;, &quot;#&quot;);
        TreeNode node1132 = new TreeNode(&quot;济南市&quot;, &quot;#&quot;);
        TreeNode node11321 = new TreeNode(&quot;市中区&quot;, &quot;#&quot;);
        TreeNode node11322 = new TreeNode(&quot;历下区&quot;, &quot;#&quot;);
        TreeNode node11323 = new TreeNode(&quot;槐荫区&quot;, &quot;#&quot;);
        TreeNode node11324 = new TreeNode(&quot;天桥区&quot;, &quot;#&quot;);
        TreeNode node11325 = new TreeNode(&quot;长清区&quot;, &quot;#&quot;);
        TreeNode node1133 = new TreeNode(&quot;菏泽市&quot;, &quot;#&quot;);
        TreeNode node1134 = new TreeNode(&quot;济宁市&quot;, &quot;#&quot;);
        TreeNode node1135 = new TreeNode(&quot;德州市&quot;, &quot;#&quot;);
        TreeNode node12 = new TreeNode(&quot;东北地区&quot;, &quot;#&quot;);
        TreeNode node13 = new TreeNode(&quot;西北地区&quot;, &quot;#&quot;);
        TreeNode node14 = new TreeNode(&quot;华东地区&quot;, &quot;#&quot;);
        TreeNode node15 = new TreeNode(&quot;西南地区&quot;, &quot;#&quot;);
        TreeNode node16 = new TreeNode(&quot;华南地区&quot;, &quot;#&quot;);
        TreeNode node17 = new TreeNode(&quot;华中地区&quot;, &quot;#&quot;);
        TreeNode node18 = new TreeNode(&quot;港澳台地区&quot;, &quot;#&quot;);

        node1132.Add(node11321);
        node1132.Add(node11322);
        node1132.Add(node11323);
        node1132.Add(node11324);
        node1132.Add(node11325);

        node113.Add(node1131);
        node113.Add(node1132);
        node113.Add(node1133);
        node113.Add(node1134);
        node113.Add(node1135);

        node11.Add(node111);
        node11.Add(node112);
        node11.Add(node113);

        node1.Add(node11);
        node1.Add(node12);
        node1.Add(node13);
        node1.Add(node14);
        node1.Add(node15);
        node1.Add(node16);
        node1.Add(node17);
        node1.Add(node18);

        nodes.Add(node1);
        nodes.Add(new TreeNode(&quot;俄罗斯&quot;, &quot;&quot;));
        nodes.Add(new TreeNode(&quot;美国&quot;));
        nodes.Add(new TreeNode(&quot;韩国&quot;));
        nodes.Add(new TreeNode(&quot;澳大利亚&quot;));
        nodes.Add(new TreeNode(&quot;印度&quot;, &quot;&quot;));
        nodes.Add(new TreeNode(&quot;加拿大&quot;, &quot;&quot;));
    }

    /// &lt;summary&gt;
    /// 获取TreeView的html代码
    /// &lt;/summary&gt;
    /// &lt;returns&gt;&lt;/returns&gt;
    public string GetHtmlString()
    {
        StringBuilder sb = new StringBuilder();
        sb.AppendLine(&quot;&lt;ul&gt;&quot;);
        for (int i = 0; i &lt; nodes.Count; i++)
        {
            sb.AppendLine(GetNodeHtml(nodes[i], 1, (i + 1).ToString()));
        }
        sb.AppendLine(&quot;&lt;/ul&gt;&quot;);
        return sb.ToString();
    }

    private string GetNodeHtml(TreeNode thisNode, int depth, string id)
    {
        StringBuilder sb = new StringBuilder();
        bool hasSub = (thisNode.Count &gt; 0) ? true : false;
        sb.AppendLine(string.Format(&quot;&lt;li id=\&quot;depth_{0}_item_{1}\&quot;&gt;&quot;, depth, id));
        sb.AppendLine(string.Format(
            &quot;&lt;div class=\&quot;{0}\&quot; id=\&quot;depth_{1}_item_{2}_ico\&quot; onclick=\&quot;controlNode(this,&#039;depth_{1}_item_{2}&#039;)\&quot;&gt;&lt;/div&gt;&lt;h1&gt;{3}&lt;/h1&gt;&quot;,
            hasSub ? &quot;closedir&quot; : &quot;nodir&quot;,
            depth,
            id,
            (thisNode.Href == null || thisNode.Href.Equals(&quot;&quot;)) ? thisNode.Name : string.Format(&quot;&lt;a href=\&quot;{0}\&quot;&gt;{1}&lt;/a&gt;&quot;, thisNode.Href, thisNode.Name)
            ));
        if (hasSub)
        {
            sb.AppendLine(string.Format(&quot;&lt;div id=\&quot;depth_{0}_item_{1}_layer\&quot; style=\&quot;display:block;\&quot;&gt;&quot;, depth, id));
            sb.AppendLine(&quot;&lt;ul&gt;&quot;);
            for (int i = 0; i &lt; thisNode.Count; i++)
            {
                sb.AppendLine(GetNodeHtml(thisNode[i], depth + 1, string.Format(&quot;{0}_{1}&quot;, id, i + 1)));
            }
            sb.AppendLine(&quot;&lt;/ul&gt;&quot;);
            sb.AppendLine(&quot;&lt;/div&gt;&quot;);
        }
        sb.AppendLine(&quot;&lt;/li&gt;&quot;);
        return sb.ToString();
    }
}
</pre>
<h3>ASP.NET页面调用：</h3>
<pre class="brush: c#">
&lt;%
    CMC.TreeView list = new CMC.TreeView();
    list.FillTestData();
    Response.Write(list.GetHtmlString());
%&gt;
</pre>
<h3>ASP.NET页面JavaScript：</h3>
<pre class="brush: js">
defaultNodeState();

function defaultNodeState()
{
	var nodeState = getCookie(&quot;nodeState&quot;);
	if(nodeState == null)
	{
	    nodeState = &quot;,|,|,&quot;;
		setCookie(&quot;nodeState&quot;,nodeState);
	}
	var layer = nodeState.split(&#039;|&#039;);
	for(var i=0;i&lt;layer.length;i++)
	{
		if(layer[i] != &quot;,&quot;)
		{
			var lItem = layer[i].split(&#039;,&#039;);
			var nodeIco = document.getElementById(lItem[0]+&quot;_ico&quot;);
			var nodeLayer = document.getElementById(lItem[0]+&quot;_layer&quot;);
			OpenNode(nodeIco);
			ShowDiv(nodeLayer);
		}
	}
}
function controlNode(obj,layerId)
{
	var className = obj.className.toLowerCase();
	var layer = document.getElementById(layerId + &quot;_layer&quot;);

	cookiesNode(layerId, className);
	if(className == &quot;opendir&quot;)
	{
		HideDiv(layer);
		obj.className = &quot;closedir&quot;;
	}
	else if (className == &quot;closedir&quot;)
	{
		ShowDiv(layer);
		obj.className = &quot;opendir&quot;;
	}
}

function cookiesNode(layerId,className)
{
    var nodeState = getCookie(&quot;nodeState&quot;);
	if(nodeState == null)
	{
	    nodeState = &quot;,|,|,&quot;;
		setCookie(&quot;nodeState&quot;,nodeState);
	}
	var layer = nodeState.split(&#039;|&#039;);
	var lDepth = getDepth(layerId);
	if(className == &quot;opendir&quot;)
	{

		layer[lDepth-1] = &quot;,&quot;
	}
	else
	{
		if(layer[lDepth-1] &amp;amp;&amp;amp;amp layer[lDepth-1] != &quot;,&quot;) {
                        var lItem = layer[lDepth - 1].split(&#039;,&#039;);
			var lIco = document.getElementById(lItem[0]+&quot;_ico&quot;);
			var lLayer = document.getElementById(lItem[0] + &quot;_layer&quot;);
			HideDiv(lLayer);
			CloseNode(lIco);
			    }
			    layer[lDepth - 1] = layerId + &quot;,&quot; + lDepth;
		    }
	var cValue = layer[0];
	for(var i=1;i&lt;layer.length;i++)
	{
		cValue += &quot;|&quot; + layer[i];
	}
	setCookie(&quot;nodeState&quot;,cValue);
}

function getDepth(layerId)
{
	var lItem = layerId.split(&#039;_&#039;);
	return lItem[1];
}

function OpenNode(obj)
{
	obj.className = &quot;opendir&quot;;
}
function CloseNode(obj)
{
	obj.className = &quot;closedir&quot;;
}
function HideDiv(obj)
{
    obj.style.display=&#039;none&#039;;

}
function ShowDiv(obj)
{
    obj.style.display=&#039;block&#039;;
}

//设置cookies
function setCookie(name,value)
{
    var Days = 30;
    var exp = new Date();
    exp.setTime(exp.getTime() + Days*24*60*60*1000);
    document.cookie = name + &quot;=&quot; + escape(value) +
      &quot;;expires=&quot; + exp.toGMTString();
}
//读取cookies
function getCookie(name)
{
    var arr,reg = new RegExp(&quot;(^| )&quot; + name + &quot;=([^;]*)(;|$)&quot;);
    if(arr = document.cookie.match(reg)) return unescape(arr[2]);
    else return null;
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.nocoo.us/2009/01/standard-treeview/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>对字符串数组生成一个随机序</title>
		<link>http://www.nocoo.us/2008/12/random-string-array/</link>
		<comments>http://www.nocoo.us/2008/12/random-string-array/#comments</comments>
		<pubDate>Fri, 26 Dec 2008 12:17:30 +0000</pubDate>
		<dc:creator>nocoo</dc:creator>
				<category><![CDATA[作品发布]]></category>
		<category><![CDATA[开发心得]]></category>
		<category><![CDATA[微软技术]]></category>
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.nocoo.us/?p=3323</guid>
		<description><![CDATA[这种情况： 一组照片，或者MP3歌曲，知道它们的路径，保存在一个数组中。现在想随机播放之。要求，每首歌出现的概率相等，且播放完全部之前不会重复，并且保证顺序可以前后无限快进或者快倒。 using System; using System.Collections.Generic; using System.Text; using System.IO; namespace RandomStringArray { class Program { private static int count = 50; static void Main(string[] args) { string[] originalArray = GetStringArray(); string[] randomArray = new string[originalArray.Length]; SortedList&#60;int, string&#62; list = new SortedList&#60;int, string&#62;(); for (int i = 0; i &#60; originalArray.Length; i++) { list.Add(originalArray[i].GetHashCode(), originalArray[i]); [...]]]></description>
			<content:encoded><![CDATA[<p>这种情况：<br />
一组照片，或者MP3歌曲，知道它们的路径，保存在一个数组中。现在想随机播放之。要求，每首歌出现的概率相等，且播放完全部之前不会重复，并且保证顺序可以前后无限快进或者快倒。</p>
<pre class="brush: c#">
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace RandomStringArray
{
    class Program
    {
        private static int count = 50;

        static void Main(string[] args)
        {
            string[] originalArray = GetStringArray();
            string[] randomArray = new string[originalArray.Length];

            SortedList&lt;int, string&gt; list = new SortedList&lt;int, string&gt;();
            for (int i = 0; i &lt; originalArray.Length; i++)
            {
                list.Add(originalArray[i].GetHashCode(), originalArray[i]);
            }

            int index = 0;
            foreach (KeyValuePair&lt;int, string&gt; item in list)
            {
                randomArray[index++] = item.Value;
            }

            // Print Result
            Console.WriteLine(&quot;Original:&quot;);
            for (int i = 0; i &lt; originalArray.Length; i++)
            {
                Console.WriteLine(string.Format(&quot;[{0}]{1}&quot;, i, originalArray[i]));
            }
            Console.WriteLine(&quot;Random:&quot;);
            for (int i = 0; i &lt; randomArray.Length; i++)
            {
                Console.WriteLine(string.Format(&quot;[{0}]{1}&quot;, i, randomArray[i]));
            }
        }

        /// &lt;summary&gt;
        /// Generate a directories list for test
        /// &lt;/summary&gt;
        /// &lt;returns&gt;Directories list&lt;/returns&gt;
        private static string[] GetStringArray()
        {
            if (!Directory.Exists(&quot;Temp&quot;))
            {
                Directory.CreateDirectory(&quot;Temp&quot;);

                for (int i = 0; i &lt; count; i++)
                {
                    Directory.CreateDirectory(&quot;Temp\\&quot; +
                                Guid.NewGuid().ToString());
                }
            }
            return Directory.GetDirectories(&quot;Temp&quot;);
        }
    }
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.nocoo.us/2008/12/random-string-array/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>祈祷</title>
		<link>http://www.nocoo.us/2008/12/pray/</link>
		<comments>http://www.nocoo.us/2008/12/pray/#comments</comments>
		<pubDate>Thu, 18 Dec 2008 16:00:42 +0000</pubDate>
		<dc:creator>nocoo</dc:creator>
				<category><![CDATA[作品发布]]></category>
		<category><![CDATA[心情日记]]></category>
		<category><![CDATA[心情]]></category>

		<guid isPermaLink="false">http://www.nocoo.us/?p=3275</guid>
		<description><![CDATA[以我最擅长的方式去纪念：http://www.sincer.net/]]></description>
			<content:encoded><![CDATA[<div style="text-align: center; background-color: #000;">
<img src="http://www.nocoo.us/wp-content/gallery/blog-pics-3/sincer.png" alt="heaven" />
</div>
<p><strong>以我最擅长的方式去纪念：</strong><a href="http://www.sincer.net/">http://www.sincer.net/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nocoo.us/2008/12/pray/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>个人信息管理整合方案(上)</title>
		<link>http://www.nocoo.us/2008/12/personal-life-management-1/</link>
		<comments>http://www.nocoo.us/2008/12/personal-life-management-1/#comments</comments>
		<pubDate>Tue, 16 Dec 2008 16:02:59 +0000</pubDate>
		<dc:creator>nocoo</dc:creator>
				<category><![CDATA[作品发布]]></category>
		<category><![CDATA[心情日记]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[RedMine]]></category>

		<guid isPermaLink="false">http://www.nocoo.us/?p=3185</guid>
		<description><![CDATA[0. 动机 如果你是一个没什么事情的人，估计这篇文章对你来说一点作用都没，甚至觉得有点无病呻吟。 如果你是个忽然间陷入忙碌的工作中的人，你可能还没意识到工作和生活可以有一套方法去管理。恭喜你，这篇文章目标就是写给你的。当然这里的方案都是我在使用的方案，很多时候也许对你来说，还存在着更好的方案。（举个例子，我用联通，也许你用移动，那么恭喜你你可以用飞信。飞信是开放API的你知道吗？这种优势，写个程序，也许可以让你的烤面包机给你发SMS呢。） 如果你和我一样是一个被事情缠住根本无法脱身而不得不做，而且和我一样是一个崇尚高效鄙夷浪费时间的人，看过这篇文章之后，一定会产生共鸣吧。我希望你能够在下面留言，告诉我你的方法，我们共同进步。 1. 圣经 《时间管理——给系统管理员》，Thomas A. Limoncelli 这本书是圣经。 记得第一次读这本书纯属比较懒的一种动机。2008发生了很多事情，在这一年里，我在2月、3月、4月、5月、6月、7月、8月、9月都回家一次。在回家的火车里，读一本书俨然是routine。记得以前拿着Java编程思想啃，也学习过打印出书的某一章读完这样破坏环境的事情。其实拿起这本书的时候我的角色是一个新系统管理员想学点东西，放下这本书的时候是一个激动的我寻找到了知音一晚上没睡着觉满脑子想架一套个人信息管理系统。 可惜豆瓣没有六颗星。 2. 信息中心——E-mail 别告诉我看到这个题目你很惊讶。我也知道很多人一个月都不一定打开一次Email。记得我入职MSRA Intern的第一天，被HR MM（97分！！）领着去见我的Mentor，海东见到我第一件事情是领我到计算机旁边，然后让我先建好工作环境，说，这是Outlook，用你的域帐户登陆。Outlook是你的最重要的工作工具，重于Visual Studio。其实那个时候我已经很重视了Email的作用。 身份： 我知道你是个忙人，你一定有很多种身份吧~你也许喜欢注册很多很NB的邮箱，但是注册了就忘记了。其实，Gmail可以管理这样的多重身份，最终效果就是你只需要在一个Gmail里检查邮件就可以，不需要一次性登录到所有的邮箱。那样真的很麻烦，估计这也是某些人远离Email的原因之一。 [singlepic=18227,600,413] 解决多重身份问题，使用Gmail的Accounts概念。原理其实很简单，大家都知道Email发件人其实是可以伪造的吧。Gmail其实是在你授权之下伪造发件人地址，使用你指定的发件人。 当然不是能乱用的，必须先加入到Gmail中，有一个邮件验证的过程。 [singlepic=18228] 利用Gmail Accounts，你可以用任何一个邮箱的名义发送邮件。 也许你会问，怎么收呢？答案是邮件转发，你只需要简单地登陆进那些邮箱，设置自动转发，然后把所有邮件转发到你的主Gmail，然后在主Gmail把这个帐户设置成Accounts之一，就可以完全不必登录进那个邮箱，进行收发操作了。 [singlepic=18229] 进一步，如果你用126等等一些垃圾提供商的服务，会发现转发是不允许或者需要收费的，这时候我的选择就是不用这家的邮件。当然可能有点偏激，其实Gmail还可以用POP协议登陆进这些邮箱进行收信。不过我总是觉得不爽啊，尤其是Gmail如果自动POP进QQ邮箱收信，每次登陆QQ的时候都会发现，上次登录地点是美国，让人很不爽。原理其实是QQ把POP登陆QQ邮箱也算作帐户登陆了，这样Gmail服务器登陆QQ的POP时，记录的IP就是Gmail服务器，当然在美国了。 如果你用的是Google Apps或者其他Gmail邮箱，会发现这个过程是迅速准确而且令人愉悦的。这也是为什么我极力推荐Gmail的原因，它免费，好用，进取，竭力把所有功能都给你，而且不会想方设法对你收费。 备份： 你的数据，重要的数据，应当备份到哪里比较安全？ 回答脑子的，不错，不过我比较笨，记不住那么多。 回答U盘的，赶快去买彩票吧。 回答硬盘的，相信你不久会遇到一次人生重大波折。 回答服务器的，我想告诉你，万一你的网管比较不负责任怎么办。 个人认为，Gmail是个不错的选择。Gmail提供了7273 MB空间（到我写作的这一刻），虽然不够放几百GB的照片，但是放写重要的文档（比如爱人曾经给我发过的全部短信，我都有保留。怎么保留，请见第8部分）还是足够的，这些文档极度极度重要，但是很小，几兆而已。 3. 统一数据集 协同工作的精华在于数据的统一。即，不管你人在什么地方，用哪台计算机，都可以对同一个数据进行工作。这里的数据，可以指照片、Word文档、程序源代码都可以。就是说需要一种方法，使得可以在任何地方都可以立刻开展工作。 简单的做法是拿个U盘&#8230;唉，解释一下吧。拿个U盘，拷贝你的全部需要用的数据到处走。缺点，容易丢失，导致严重的个人隐私泄露问题。另外，U盘基于文件系统，到处插，中毒是必然的，不考虑这个，万一文件系统损坏，丢失数据为大。 使用统一数据集这里的方法主要有： 数据同步方法 数据同步是获取统一数据集的最直观的方法，目的是能够在任何地方，很快地获取到最新的版本。 简单的一种方式是用一个FTP软件，在一台服务器上架设一个FTP服务器，然后在每个地方展开工作前，下载工作副本，工作完成后上传过去更新数据集。这种方式缺点明显：带宽占用相对较大，此外不能协同工作。想象这样一种情况：你和另外一个人同时做这件事情。你下载一个版本，修改过程中，另一个人也想修改。他不知道你在改，也下载了版本。你修改结束后上传更新了文件，然后他修改完也上传更新了版本。最后就是服务器上的版本是他修改的版本，你的修改丢失了。 我觉得比较好的解决方案是用SVN。SVN是用于程序开发源代码的版本控制系统。支持多人开发，能够合并简单的更新冲突问题。SVN需要服务器支持，简单的说就是需要一个SVN服务器，然后里面可以设置几个账号，大家一起协同工作。工作前，进行Checkout检出最新的工作数据，然后修改，然后Commit提交修改。服务器会保留每一个版本，这样可以随时恢复到任意一个版本状态。这样可以避免走了弯路回不来的现象。此外，SVN还可以集成到第5部分介绍的Redmine系统中，记录每次更新的详细信息。SVN也有缺点，Windows下还是需要装个软件的，不像FTP一样Windows Explorer可以直接打开。 一张图胜过千个字，下面展示一下同样一个数据集，注意，同一个数据集，在SVN的掌管下，可以呈现的状态： [singlepic=18251,600,453] 上图是导入了SVN的一个文件夹，在Vista系统中。在这里你可以对文件进行和原来一样的修改，修改结束，右键，提交更新，写上本次更新的内容，SVN会自动提交到服务器去。 [singlepic=18249] 上图是Vista下SVN工具TortoiseSVN中，查看服务器上的目录结构和文件。 [...]]]></description>
			<content:encoded><![CDATA[<h3>0. 动机</h3>
<p>如果你是一个没什么事情的人，估计这篇文章对你来说一点作用都没，甚至觉得有点无病呻吟。<br />
如果你是个忽然间陷入忙碌的工作中的人，你可能还没意识到工作和生活可以有一套方法去管理。恭喜你，这篇文章目标就是写给你的。当然这里的方案都是我在使用的方案，很多时候也许对你来说，还存在着更好的方案。（举个例子，我用联通，也许你用移动，那么恭喜你你可以用飞信。飞信是开放API的你知道吗？这种优势，写个程序，也许可以让你的烤面包机给你发SMS呢。）<br />
如果你和我一样是一个被事情缠住根本无法脱身而不得不做，而且和我一样是一个崇尚高效鄙夷浪费时间的人，看过这篇文章之后，一定会产生共鸣吧。我希望你能够在下面留言，告诉我你的方法，我们共同进步。</p>
<h3>1. 圣经</h3>
<table style="width:100%;">
<tr>
<td style="width:152px;">
<img src="http://www.nocoo.us/wp-content/uploads/2008/12/s2754540.jpg" alt="s2754540" title="s2754540" width="150" height="231" class="alignnone size-full wp-image-3186" />
</td>
<td>
《时间管理——给系统管理员》，Thomas A. Limoncelli<br />
这本书是圣经。<br />
记得第一次读这本书纯属比较懒的一种动机。2008发生了很多事情，在这一年里，我在2月、3月、4月、5月、6月、7月、8月、9月都回家一次。在回家的火车里，读一本书俨然是routine。记得以前拿着Java编程思想啃，也学习过打印出书的某一章读完这样破坏环境的事情。其实拿起这本书的时候我的角色是一个新系统管理员想学点东西，放下这本书的时候是一个激动的我寻找到了知音一晚上没睡着觉满脑子想架一套个人信息管理系统。<br />
可惜豆瓣没有六颗星。
</td>
</tr>
</table>
<h3>2. 信息中心——E-mail</h3>
<p>别告诉我看到这个题目你很惊讶。我也知道很多人一个月都不一定打开一次Email。记得我入职MSRA Intern的第一天，被HR MM（97分！！）领着去见我的Mentor，海东见到我第一件事情是领我到计算机旁边，然后让我先建好工作环境，说，这是Outlook，用你的域帐户登陆。Outlook是你的最重要的工作工具，重于Visual Studio。其实那个时候我已经很重视了Email的作用。</p>
<p><strong>身份：</strong><br />
我知道你是个忙人，你一定有很多种身份吧~你也许喜欢注册很多很NB的邮箱，但是注册了就忘记了。其实，Gmail可以管理这样的多重身份，最终效果就是你只需要在一个Gmail里检查邮件就可以，不需要一次性登录到所有的邮箱。那样真的很麻烦，估计这也是某些人远离Email的原因之一。</p>
<p>[singlepic=18227,600,413]</p>
<p>解决多重身份问题，使用Gmail的Accounts概念。原理其实很简单，大家都知道Email发件人其实是可以伪造的吧。Gmail其实是在你授权之下伪造发件人地址，使用你指定的发件人。</p>
<p><span id="more-3185"></span></p>
<p>当然不是能乱用的，必须先加入到Gmail中，有一个邮件验证的过程。</p>
<p>[singlepic=18228]</p>
<p>利用Gmail Accounts，你可以用任何一个邮箱的名义发送邮件。<br />
也许你会问，怎么收呢？答案是邮件转发，你只需要简单地登陆进那些邮箱，设置自动转发，然后把所有邮件转发到你的主Gmail，然后在主Gmail把这个帐户设置成Accounts之一，就可以完全不必登录进那个邮箱，进行收发操作了。</p>
<p>[singlepic=18229]</p>
<p>进一步，如果你用126等等一些垃圾提供商的服务，会发现转发是不允许或者需要收费的，这时候我的选择就是不用这家的邮件。当然可能有点偏激，其实Gmail还可以用POP协议登陆进这些邮箱进行收信。不过我总是觉得不爽啊，尤其是Gmail如果自动POP进QQ邮箱收信，每次登陆QQ的时候都会发现，上次登录地点是美国，让人很不爽。原理其实是QQ把POP登陆QQ邮箱也算作帐户登陆了，这样Gmail服务器登陆QQ的POP时，记录的IP就是Gmail服务器，当然在美国了。<br />
如果你用的是Google Apps或者其他Gmail邮箱，会发现这个过程是迅速准确而且令人愉悦的。这也是为什么我极力推荐Gmail的原因，它免费，好用，进取，竭力把所有功能都给你，而且不会想方设法对你收费。</p>
<p><strong>备份：</strong><br />
你的数据，重要的数据，应当备份到哪里比较安全？<br />
回答脑子的，不错，不过我比较笨，记不住那么多。<br />
回答U盘的，赶快去买彩票吧。<br />
回答硬盘的，相信你不久会遇到一次人生重大波折。<br />
回答服务器的，我想告诉你，万一你的网管比较不负责任怎么办。<br />
个人认为，Gmail是个不错的选择。Gmail提供了7273 MB空间（到我写作的这一刻），虽然不够放几百GB的照片，但是放写重要的文档（比如爱人曾经给我发过的全部短信，我都有保留。怎么保留，请见第8部分）还是足够的，这些文档极度极度重要，但是很小，几兆而已。</p>
<h3>3. 统一数据集</h3>
<p>协同工作的精华在于数据的统一。即，不管你人在什么地方，用哪台计算机，都可以对同一个数据进行工作。这里的数据，可以指照片、Word文档、程序源代码都可以。就是说需要一种方法，使得可以在任何地方都可以立刻开展工作。<br />
简单的做法是拿个U盘&#8230;唉，解释一下吧。拿个U盘，拷贝你的全部需要用的数据到处走。缺点，容易丢失，导致严重的个人隐私泄露问题。另外，U盘基于文件系统，到处插，中毒是必然的，不考虑这个，万一文件系统损坏，丢失数据为大。<br />
使用统一数据集这里的方法主要有：<br />
<strong>数据同步方法</strong><br />
数据同步是获取统一数据集的最直观的方法，目的是能够在任何地方，很快地获取到最新的版本。<br />
简单的一种方式是用一个FTP软件，在一台服务器上架设一个<strong>FTP</strong>服务器，然后在每个地方展开工作前，下载工作副本，工作完成后上传过去更新数据集。这种方式缺点明显：带宽占用相对较大，此外不能协同工作。想象这样一种情况：你和另外一个人同时做这件事情。你下载一个版本，修改过程中，另一个人也想修改。他不知道你在改，也下载了版本。你修改结束后上传更新了文件，然后他修改完也上传更新了版本。最后就是服务器上的版本是他修改的版本，你的修改丢失了。<br />
我觉得比较好的解决方案是用<strong>SVN</strong>。SVN是用于程序开发源代码的版本控制系统。支持多人开发，能够合并简单的更新冲突问题。SVN需要服务器支持，简单的说就是需要一个SVN服务器，然后里面可以设置几个账号，大家一起协同工作。工作前，进行Checkout检出最新的工作数据，然后修改，然后Commit提交修改。服务器会保留每一个版本，这样可以随时恢复到任意一个版本状态。这样可以避免走了弯路回不来的现象。此外，SVN还可以集成到第5部分介绍的Redmine系统中，记录每次更新的详细信息。SVN也有缺点，Windows下还是需要装个软件的，不像FTP一样Windows Explorer可以直接打开。<br />
一张图胜过千个字，下面展示一下同样一个数据集，注意，同一个数据集，在SVN的掌管下，可以呈现的状态：</p>
<p>[singlepic=18251,600,453]</p>
<p>上图是导入了SVN的一个文件夹，在Vista系统中。在这里你可以对文件进行和原来一样的修改，修改结束，右键，提交更新，写上本次更新的内容，SVN会自动提交到服务器去。</p>
<p>[singlepic=18249]</p>
<p>上图是Vista下SVN工具TortoiseSVN中，查看服务器上的目录结构和文件。</p>
<p>[singlepic=18250]</p>
<p>上图是通过浏览器访问SVN的样子，访问的时候一样需要用户名密码。在你特别想在一个地方下载某一个文件的时候非常有用，能上网就行，不需要装任何软件。</p>
<p>[singlepic=18248,600,479]</p>
<p>上图是通过第5节重点介绍的<a href="http://www.redmine.net/">Redmine.NET</a>查看SVN的样子。注意，你在提交中的注释，这里都可以看到，并且可以关联到Redmine的问题，显示当前问题的状态。删除线划掉的表示问题已经关闭。具体解释在第5节。<br />
<strong>你要是心动了，需要一个可以在外网使用的SVN，可以联系我~</strong></p>
<p><strong>远程连接方法</strong><br />
远程连接方法主要是解决如何在任何地方连接到你的数据的问题。<br />
基本上看，这个问题是怎么做端口映射的问题。不管是在家里在学校实验室还是在公司，估计共享上网方式是最普遍的。如果是在家里和宿舍，那么你可以对路由器进行设置，映射TCP 3389到你的计算机，这样可以在外网使用任何Windows都会自带的远程桌面软件连接到你的计算机，既然连上了你的计算机，自然数据集的问题不用再烦恼了。<br />
远程桌面可以在任何Windows上打开，在运行中输入mstsc回车即可。</p>
<p>[singlepic=18253]</p>
<p>第一次打开mstsc的你一定和当年的我一样迷惑，输入什么呢？<br />
在这里是一个问题，如何确定你的计算机IP的问题。如果在公司内网，IP一般是固定的，这个好说。如果在家里使用ADSL拨号方式，IP每次拨号都会变动，这就产生了问题，你怎么知道当前这一刻你家的路由器获取到了哪个IP？因为不知道IP，纵然你做好了3389端口映射一样连不上。<br />
解决方案有以下三种：</p>
<ul>
<li><strong>人肉法：</strong>每天上班之前我进入路由器状态页面，拿小纸条抄下IP，然后狂奔到公司，并且一路上祈祷不要断线不要重启不要换IP。</li>
<li><strong>花生壳：</strong>花生壳是一款动态DNS软件，有免费的域名可以申请。你装一个花生壳在你机器，这样程序就会自动每隔一段时间向服务器报告IP，然后你访问你注册的免费域名，解析到最新的IP。这是一种不错的选择，甚至某些街机路由器都内置上一个。不过我不太信任，因为很多关键时刻花生壳掉线！然后做网管的我就被人看起来像个傻瓜。</li>
<li><strong>我的办法：</strong>我自己写了一个软件，使用花生壳的这种方式，程序运行在后台，我为这个位置（计算机）设置一个名字。程序每半小时会访问一个页面，那个页面把IP和时间和位置记录到数据库。然后我访问一个页面，根据位置的名字，可以查出最新的IP，然后我用这个IP直接连。这也是上图mstsc中Magic IP的来源。和花生壳的区别？至少我可以知道最后一个IP吧。在花生壳里，保持最后一个IP是需要付费的。</li>
</ul>
<p>[singlepic=18252,600,437]</p>
<h3>4. 个人事务管理</h3>
<p>第3节介绍个人事务管理，第4节会介绍一般事务管理。首先说说有什么区别。<br />
个人事务主要是个人日常生活的事情，生活琐事之类，特点是与时间非常相关的，在某个特定的时间你必须出现在某个地方做某件事情，比如回家吃饭，去超市买东西都算上。对这种事情你的一般期望是能够避免冲突地办好这些事情，毕竟你不能分身。<br />
一般事务是相对持久的事情，可能是个人兴趣的某种开发工作，写本书，写个程序这种，可以用阶段性来量度（章节、子系统、功能、短期目标等），这些事情可能会遭遇延期，其实也是很正常的事情，所以要可以容纳延期。</p>
<p>[singlepic=18230,600,430]</p>
<p>个人事务管理我推荐Google Calendar。其实Google Calendar做的最主要的事情任何日程管理软件包括Outlook都能做。也许你的手机或者PDA也有同样的功能。不过我总觉得为了查个日程，随身带个Macbook或者HP PDA，绝对是装B的行为。不如礼貌地问问你的客户，我能用一下你的电脑吗？然后打开随便一个浏览器，登陆即可。此外，这叫“云计算”，不会丢失数据哦~</p>
<p>[singlepic=18233,600,300]</p>
<p>此外，Google Calendar最吸引我的地方是它可以用SMS短信方式把任务发到你的手机上，支持中国！移动自然没话说，联通的号码也支持。你需要做的，就是在你的Google Calendar里注册一下手机号码。</p>
<p>[singlepic=18232,600,355]</p>
<p>然后在需要短信通知的项目中设置SMS提醒即可。</p>
<p>[singlepic=18231,600,466]</p>
<p>Gmail的新版本中，Email发送界面中已经加入了实时任务添加，越来越接近Outlook了，我觉得这个功能是Outlook的精华，总有一天，Gmail+Google Calendar可以替代Outlook的地位。<br />
这件事情的极致是这样的，最终，你给一群人发开会通知，带上一个Google Calendar event，然后接受邀请的人的日程表里这个时间变成忙碌状态。这样，你甚至可以查看某个人到底是在哪个时间段有空。</p>
<h3>5. 一般事务管理</h3>
<p>重点在一般事务里推出<a href="http://www.redmine.net/">Redmine.NET</a>。<br />
<a href="http://www.redmine.net/">Redmine.NET</a>是我创建并维护的一个项目管理站点。每个人可以免费注册一个自己的项目，进行进度控制和版本库控制。为什么我要做这件事情呢？原因很简单，我自己的生活和<a href="http://www.redmine.net/">Redmine.NET</a>高度的集成。<br />
Redmine是一个基于Ruby on Rails的开源项目管理软件。</p>
<p>[singlepic=18247,600,356]</p>
<p>Redmine支持： Subversion、Darcs、Mercurial、Cvs、Bazaar、Git和Filesystem这些几乎全部的版本管理系统。<br />
像典型的项目管理系统一样，Redmine可以称为是问题驱动的，以SVN为中心的项目管理系统。</p>
<p>[singlepic=18234,600,447]</p>
<p>上图是一个典型的项目在Redmine中的首页。主要展示一些概要信息。</p>
<p>[singlepic=18238,600,515]</p>
<p>Redmine的核心是问题。一个问题可以是三种：</p>
<ul>
<li><strong>Bug：</strong>项目中发现的行为与预想不同的现象，可以称为缺陷或者错误。</li>
<li><strong>Feature：</strong>计划做的事情，计划的项目应该具有的特性或功能。</li>
<li><strong>Support：</strong>反馈任务，或者沟通任务，或者支持项目开发继续的任务。</li>
</ul>
<p>按照项目管理理论，问题需要区分优先级，三级优先级足够处理所有任务。 高优先级类别中保存尽可能少的问题是必要的，可以避免开发团队感到过于沮丧。<br />
如果你的问题列表中包含了过多的S1优先级问题，说明你混淆了问题优先级和问题紧迫性的概念。问题应当具有优先级别和截止时间两个属性。一个问题也许已经延期了几天，但是仍旧没有必要因为延期而提升其优先级。除非因为这个延期导致了其他同级别或更高级别问题无法进行，在这种情况下才导致问题优先级的提升。虽然看起来是因为延期导致了优先级提升，但是真正的原因并不是这样。因此，截止时间近的问题不应当盲目赋予高优先级。</p>
<ul>
<li><strong>High/S1 ：</strong>S1级别的问题是必须立刻修复的问题。通常有一些突如其来的问题，破坏了发布代码或者耽误了*所有*当前开发。当遇到一个S1优先级的问题时，必须立刻分配开发人员和开发时间处理这个问题，除非有其他S1级别的问题排在这个队列前面。所有的特性(Features)开发和不如它严重的问题都应该放到一边，直到这个S1问题解决为止。</li>
<li><strong>Normal/S2 ： </strong>S2级别涵盖了重要的但无需停止人们正在进行工作的问题。这可能包括非常重要的特性和相当重要的错误修复，但是只要这些重要问题没有影响到发布和阻止掉所有人的开发，优先级仍应该保持为S2级别。按照微软“零错误方法学”，在开发人员打算接受一个新的任务之前，应当首先着手解决现有的S2级别的问题，然后处理S3级别的或者没有归类的问题。如果发现某S2问题由于某种原因无法继续进行工作，或者重要性降低，则应当将其降级为S3。</li>
<li><strong>Low/S3 ：</strong>最低层次的问题。S3应该用在新特性的*相关工作*和*非基础性*的缺陷修复上。S3问题应该在S1和S2中都没有问题时才开始处理。S3中的任务通常可以在规划时拟好大纲，即在设计项目路线图时现行提出题目并加入问题列表，随着项目开发逐渐完善其内容，直至解决。</li>
</ul>
<p><strong>下半部分：</strong><a href="http://www.nocoo.us/2008/12/personal-life-management-2">http://www.nocoo.us/2008/12/personal-life-management-2</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nocoo.us/2008/12/personal-life-management-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A Preview!</title>
		<link>http://www.nocoo.us/2008/12/a-preview/</link>
		<comments>http://www.nocoo.us/2008/12/a-preview/#comments</comments>
		<pubDate>Wed, 10 Dec 2008 07:29:17 +0000</pubDate>
		<dc:creator>nocoo</dc:creator>
				<category><![CDATA[作品发布]]></category>
		<category><![CDATA[开发心得]]></category>
		<category><![CDATA[微软技术]]></category>
		<category><![CDATA[心情日记]]></category>
		<category><![CDATA[服务器和集群技术]]></category>
		<category><![CDATA[ARsync]]></category>

		<guid isPermaLink="false">http://www.nocoo.us/?p=3172</guid>
		<description><![CDATA[[singlepic=18221] 用户登录 [singlepic=18222,610,422] 远程文件夹同步]]></description>
			<content:encoded><![CDATA[<p>[singlepic=18221]<br />
用户登录</p>
<p>[singlepic=18222,610,422]<br />
远程文件夹同步</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nocoo.us/2008/12/a-preview/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>叶子</title>
		<link>http://www.nocoo.us/2008/12/leaves/</link>
		<comments>http://www.nocoo.us/2008/12/leaves/#comments</comments>
		<pubDate>Fri, 05 Dec 2008 01:18:25 +0000</pubDate>
		<dc:creator>nocoo</dc:creator>
				<category><![CDATA[作品发布]]></category>
		<category><![CDATA[心情日记]]></category>
		<category><![CDATA[行摄]]></category>

		<guid isPermaLink="false">http://www.nocoo.us/?p=3160</guid>
		<description><![CDATA[[singlepic=18219] [2008年12月05日 08:03] 摄于 [同济大学嘉定校区电子与信息工程学院大楼] 天气忽然变得好冷。不过早晨还是看到有MM穿裙子&#8230;我寒&#8230; 各位保重身体。]]></description>
			<content:encoded><![CDATA[<p>[singlepic=18219]</p>
<p>[2008年12月05日 08:03] 摄于 [同济大学嘉定校区电子与信息工程学院大楼]</p>
<p>天气忽然变得好冷。不过早晨还是看到有MM穿裙子&#8230;我寒&#8230;<br />
各位保重身体。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nocoo.us/2008/12/leaves/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>行摄：水天一色</title>
		<link>http://www.nocoo.us/2008/12/clear-sky-lake/</link>
		<comments>http://www.nocoo.us/2008/12/clear-sky-lake/#comments</comments>
		<pubDate>Tue, 02 Dec 2008 03:12:59 +0000</pubDate>
		<dc:creator>nocoo</dc:creator>
				<category><![CDATA[作品发布]]></category>
		<category><![CDATA[行摄]]></category>
		<category><![CDATA[摄影]]></category>

		<guid isPermaLink="false">http://www.nocoo.us/?p=3140</guid>
		<description><![CDATA[[singlepic=18218] 心如止水]]></description>
			<content:encoded><![CDATA[<p>[singlepic=18218]</p>
<p>心如止水</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nocoo.us/2008/12/clear-sky-lake/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>今晚谁在微笑</title>
		<link>http://www.nocoo.us/2008/12/moon-stars-smiling/</link>
		<comments>http://www.nocoo.us/2008/12/moon-stars-smiling/#comments</comments>
		<pubDate>Mon, 01 Dec 2008 11:13:49 +0000</pubDate>
		<dc:creator>nocoo</dc:creator>
				<category><![CDATA[作品发布]]></category>
		<category><![CDATA[行摄]]></category>
		<category><![CDATA[摄影]]></category>

		<guid isPermaLink="false">http://www.nocoo.us/?p=3138</guid>
		<description><![CDATA[接Der愚电话，拿相机到电信楼门口来拍照，也不告诉我拍什么&#8230; 下去一看，转头就回实验室了&#8230;没带三脚架~ [singlepic=18215] [singlepic=18216] 然而我的手却颤抖了&#8230; [singlepic=18217]]]></description>
			<content:encoded><![CDATA[<p>接Der愚电话，拿相机到电信楼门口来拍照，也不告诉我拍什么&#8230;<br />
下去一看，转头就回实验室了&#8230;没带三脚架~</p>
<p>[singlepic=18215]</p>
<p>[singlepic=18216]</p>
<p>然而我的手却颤抖了&#8230;</p>
<p>[singlepic=18217]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nocoo.us/2008/12/moon-stars-smiling/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Visual Studio 2008 C#项目代码行统计工具</title>
		<link>http://www.nocoo.us/2008/11/nocoo-code-counter/</link>
		<comments>http://www.nocoo.us/2008/11/nocoo-code-counter/#comments</comments>
		<pubDate>Wed, 26 Nov 2008 01:47:09 +0000</pubDate>
		<dc:creator>nocoo</dc:creator>
				<category><![CDATA[作品发布]]></category>
		<category><![CDATA[微软技术]]></category>
		<category><![CDATA[心情日记]]></category>
		<category><![CDATA[Visual Studio 2008]]></category>

		<guid isPermaLink="false">http://www.nocoo.us/?p=3127</guid>
		<description><![CDATA[我写的一个工具，可以打开一个Visual Studio 2008项目的解决方案.sln文件，分析其中的C#项目，统计代码行数。代码目前主要统计总行数、空行数、注释行这三种，计算注释比例和代码循环嵌套深度。 [singlepic=18214] [singlepic=18213,610,392] 目前只对Visual Studio 2008的C#项目做过测试，别的项目我目前用不到，运行会有什么结果我不知道&#8230;不过肯定不会造成损失，放心试试吧。 下载：http://www.redmine.net/projects/list_files/nocoocodecounter]]></description>
			<content:encoded><![CDATA[<p>我写的一个工具，可以打开一个Visual Studio 2008项目的解决方案.sln文件，分析其中的C#项目，统计代码行数。代码目前主要统计总行数、空行数、注释行这三种，计算注释比例和代码循环嵌套深度。</p>
<p>[singlepic=18214]</p>
<p>[singlepic=18213,610,392]</p>
<p>目前只对Visual Studio 2008的C#项目做过测试，别的项目我目前用不到，运行会有什么结果我不知道&#8230;不过肯定不会造成损失，放心试试吧。<br />
<strong>下载：</strong><a href="http://www.redmine.net/projects/list_files/nocoocodecounter">http://www.redmine.net/projects/list_files/nocoocodecounter</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nocoo.us/2008/11/nocoo-code-counter/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Redmine.NET</title>
		<link>http://www.nocoo.us/2008/11/redmine-net/</link>
		<comments>http://www.nocoo.us/2008/11/redmine-net/#comments</comments>
		<pubDate>Sat, 22 Nov 2008 16:00:48 +0000</pubDate>
		<dc:creator>nocoo</dc:creator>
				<category><![CDATA[作品发布]]></category>
		<category><![CDATA[开发心得]]></category>
		<category><![CDATA[心情日记]]></category>
		<category><![CDATA[服务器和集群技术]]></category>
		<category><![CDATA[RedMine]]></category>

		<guid isPermaLink="false">http://www.nocoo.us/?p=3122</guid>
		<description><![CDATA[[singlepic=18212,640,610] Redmine.NET是我最近一段时间的心血。在之前我曾经写过几篇Redmine的博文，Redmine我也一直在用。现在既然DreamHost支持Ruby，何不建一个Redmine给自己管理项目呢？ 一开始是这么想的，但是发现Redmine.NET域名尚未注册我立刻心动了。那段时间Godaddy被GFW掉，我冒着一定的风险用PVN连上Godaddy注册到了这个域名。真的是很难得。 做到现在也快一个月了吧，现在把自己个人SVN里面的东西全都搬进去了，感觉超方便。尤其是事情多的时候，在Issues里面自己给自己提一下，总归不会忘记的。 我给Redmine.NET的定位是“免费的项目管理平台”，目标是像SourceForge一样给开源项目提供家。不过就我自己的力量肯定是不行的，暂且先做我的项目管理系统吧。]]></description>
			<content:encoded><![CDATA[<p>[singlepic=18212,640,610]</p>
<p><a href="http://www.redmine.net">Redmine.NET</a>是我最近一段时间的心血。在之前我曾经写过几篇Redmine的博文，Redmine我也一直在用。现在既然DreamHost支持Ruby，何不建一个Redmine给自己管理项目呢？<br />
一开始是这么想的，但是发现<a href="http://www.redmine.net">Redmine.NET</a>域名尚未注册我立刻心动了。那段时间Godaddy被GFW掉，我冒着一定的风险用PVN连上Godaddy注册到了这个域名。真的是很难得。<br />
做到现在也快一个月了吧，现在把自己个人SVN里面的东西全都搬进去了，感觉超方便。尤其是事情多的时候，在Issues里面自己给自己提一下，总归不会忘记的。<br />
我给<a href="http://www.redmine.net">Redmine.NET</a>的定位是“免费的项目管理平台”，目标是像SourceForge一样给开源项目提供家。不过就我自己的力量肯定是不行的，暂且先做我的项目管理系统吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nocoo.us/2008/11/redmine-net/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>一叶而知秋</title>
		<link>http://www.nocoo.us/2008/11/dull-leaf/</link>
		<comments>http://www.nocoo.us/2008/11/dull-leaf/#comments</comments>
		<pubDate>Fri, 21 Nov 2008 16:00:49 +0000</pubDate>
		<dc:creator>nocoo</dc:creator>
				<category><![CDATA[作品发布]]></category>
		<category><![CDATA[行摄]]></category>
		<category><![CDATA[摄影]]></category>

		<guid isPermaLink="false">http://www.nocoo.us/?p=3120</guid>
		<description><![CDATA[[singlepic=18211] 摄于2008年09月19日，山东济南]]></description>
			<content:encoded><![CDATA[<p>[singlepic=18211]</p>
<p>摄于2008年09月19日，山东济南</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nocoo.us/2008/11/dull-leaf/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>多文件夹随机图片屏幕保护</title>
		<link>http://www.nocoo.us/2008/11/picscreensaver/</link>
		<comments>http://www.nocoo.us/2008/11/picscreensaver/#comments</comments>
		<pubDate>Wed, 05 Nov 2008 01:50:56 +0000</pubDate>
		<dc:creator>nocoo</dc:creator>
				<category><![CDATA[作品发布]]></category>
		<category><![CDATA[作品]]></category>

		<guid isPermaLink="false">http://www.nocoo.us/?p=3034</guid>
		<description><![CDATA[[singlepic=18205] 动机 生活变好了，显示器也不只是用来看的了。面子工作越来越重要，有些安放在走廊里的显示器，需要承担起播放幻灯片的工作&#8230; MSRA走廊里有不少19寸宽屏显示器（好几年前就有，那时候19寸是巨大的），后面连着Dell的台式机，装上Windows Server 2003，然后做一件事情——循环放照片。 [singlepic=18206] Aha，我记得有一张照片来着&#8230; 功能 软件的功能是，每次可以指定一个文件夹加入播放列表，加入时可以指定是否包含其子文件夹的内容，一旦选择包含子文件夹，则此文件夹下全部文件都会被加入播放列表。 播放列表会自动存储在相同目录下（dir.ini），下次启动时会自动继续播放。 常见播放选项，如切换时间、重新开始、暂停、继续、随机播放等，都在支持范围内。 发布文件中包含一个exe和一个scr，文件，其中scr文件可以拷贝至C:\Windows\System32中，这样就可以在Windows屏幕保护中使用。 下载 More，自己试试看~ http://download.nocoo.us/Download/NocooTools/PicScreenSaver/PicScreenSaver_Release_1.0.rar]]></description>
			<content:encoded><![CDATA[<p>[singlepic=18205]</p>
<h3>动机</h3>
<p>生活变好了，显示器也不只是用来看的了。面子工作越来越重要，有些安放在走廊里的显示器，需要承担起播放幻灯片的工作&#8230;<br />
MSRA走廊里有不少19寸宽屏显示器（好几年前就有，那时候19寸是巨大的），后面连着Dell的台式机，装上Windows Server 2003，然后做一件事情——循环放照片。</p>
<p>[singlepic=18206]</p>
<p>Aha，我记得有一张照片来着&#8230;</p>
<h3>功能</h3>
<p>软件的功能是，每次可以指定一个文件夹加入播放列表，加入时可以指定是否包含其子文件夹的内容，一旦选择包含子文件夹，则此文件夹下全部文件都会被加入播放列表。<br />
播放列表会自动存储在相同目录下（dir.ini），下次启动时会自动继续播放。<br />
常见播放选项，如切换时间、重新开始、暂停、继续、随机播放等，都在支持范围内。<br />
发布文件中包含一个exe和一个scr，文件，其中scr文件可以拷贝至C:\Windows\System32中，这样就可以在Windows屏幕保护中使用。</p>
<h3>下载</h3>
<p>More，自己试试看~<br />
<a href="http://download.nocoo.us/Download/NocooTools/PicScreenSaver/PicScreenSaver_Release_1.0.rar">http://download.nocoo.us/Download/NocooTools/PicScreenSaver/PicScreenSaver_Release_1.0.rar</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nocoo.us/2008/11/picscreensaver/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>童话</title>
		<link>http://www.nocoo.us/2008/11/fairy-tales/</link>
		<comments>http://www.nocoo.us/2008/11/fairy-tales/#comments</comments>
		<pubDate>Mon, 03 Nov 2008 00:21:22 +0000</pubDate>
		<dc:creator>nocoo</dc:creator>
				<category><![CDATA[作品发布]]></category>
		<category><![CDATA[行摄]]></category>
		<category><![CDATA[摄影]]></category>

		<guid isPermaLink="false">http://www.nocoo.us/?p=3023</guid>
		<description><![CDATA[[singlepic=18204] 你可知对于一个每日生活在灰色笼罩的人来说，第一次看到彩色的树，是什么感觉~ 这番景象，只应该发生在我们的梦里。]]></description>
			<content:encoded><![CDATA[<p>[singlepic=18204]</p>
<p>你可知对于一个每日生活在灰色笼罩的人来说，第一次看到彩色的树，是什么感觉~<br />
这番景象，只应该发生在我们的梦里。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nocoo.us/2008/11/fairy-tales/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>微软最新安全漏洞(KB958644)原理猜测分析</title>
		<link>http://www.nocoo.us/2008/10/kb958644-analyze/</link>
		<comments>http://www.nocoo.us/2008/10/kb958644-analyze/#comments</comments>
		<pubDate>Fri, 24 Oct 2008 16:00:09 +0000</pubDate>
		<dc:creator>nocoo</dc:creator>
				<category><![CDATA[作品发布]]></category>
		<category><![CDATA[开发心得]]></category>
		<category><![CDATA[微软技术]]></category>
		<category><![CDATA[服务器和集群技术]]></category>
		<category><![CDATA[Windows Server]]></category>
		<category><![CDATA[安全]]></category>
		<category><![CDATA[微软]]></category>

		<guid isPermaLink="false">http://www.nocoo.us/?p=2975</guid>
		<description><![CDATA[今天释出的KB958644号紧急更新，引起了我不小的兴趣，很希望知道到底是什么东西导致微软捅了这么大的篓子呢？无奈，因为出品公司（微软）承认这是一个严重的安全漏洞，提出问题的网站（http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-4250）已经去除了关于此漏洞的详细说明。这条路不通了。 MS08-067（http://support.microsoft.com/?kbid=958644）描述了什么样的系统里具体什么样的文件会出问题。从中可以看到，主要问题出在Netapi32.dll这个DLL。可以看出，自Microsoft Windows 2000 Service Pack 4（不是说之前的就没有，而是只从SP4开始技术支持）开始的5.0.2195.7203版本的Netapi32.dll，直到Windows Vista、Windows Server 2008甚至Windows 7 Pre-Beta的6.1.6801.4106版本Netapi32.dll都逃脱不了噩运。 重要的提示来自Microsoft Security Bulletin MS08-067 – Critical(Vulnerability in Server Service Could Allow Remote Code Execution (958644))一文。文中特别指出，这个漏洞如此广泛，甚至Windows Server 2008的Server Core installation也会受到同样安全威胁等级的威胁。这说明，这个漏洞存在很基础的地方。 Server Core installation是Server功能的极小集，根据Compare Server Core Installation Options一文，Server Core installation可以安装以下功能： Active Directory Domain Services Active Directory Lightweight Directory Services DHCP Server DNS Server File Services [...]]]></description>
			<content:encoded><![CDATA[<p>今天释出的KB958644号紧急更新，引起了我不小的兴趣，很希望知道到底是什么东西导致微软捅了这么大的篓子呢？无奈，因为出品公司（微软）承认这是一个严重的安全漏洞，提出问题的网站（<a href="http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-4250">http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-4250</a>）已经去除了关于此漏洞的详细说明。这条路不通了。<br />
MS08-067（<a href="http://support.microsoft.com/?kbid=958644">http://support.microsoft.com/?kbid=958644</a>）描述了什么样的系统里具体什么样的文件会出问题。从中可以看到，主要问题出在Netapi32.dll这个DLL。可以看出，自Microsoft Windows 2000 Service Pack 4（不是说之前的就没有，而是只从SP4开始技术支持）开始的5.0.2195.7203版本的Netapi32.dll，直到Windows Vista、Windows Server 2008甚至Windows 7 Pre-Beta的6.1.6801.4106版本Netapi32.dll都逃脱不了噩运。<br />
重要的提示来自<a href="http://www.microsoft.com/technet/security/bulletin/MS08-067.mspx">Microsoft Security Bulletin MS08-067 – Critical(Vulnerability in Server Service Could Allow Remote Code Execution (958644))</a>一文。文中特别指出，这个漏洞如此广泛，甚至Windows Server 2008的Server Core installation也会受到同样安全威胁等级的威胁。这说明，这个漏洞存在很基础的地方。<br />
Server Core installation是Server功能的极小集，根据<a href="http://www.microsoft.com/windowsserver2008/en/us/compare-core-installation.aspx">Compare Server Core Installation Options</a>一文，Server Core installation可以安装以下功能：</p>
<ul>
<li>Active Directory Domain Services</li>
<li>Active Directory Lightweight Directory Services</li>
<li>DHCP Server</li>
<li>DNS Server</li>
<li>File Services</li>
<li>Hyper-V</li>
<li>Print Services</li>
<li>Web Services (IIS) without ASP.NET</li>
</ul>
<p>鉴于Windows 2000也是受害者，因此不可能是Active Directory Lightweight Directory Services和Hyper-V的问题。<br />
<a href="http://msdn.microsoft.com/en-us/library/ms723894(VS.85).aspx">Server Core Functions by DLL</a>一文给出了netapi32.dll的详细功能说明。<br />
我不辞辛苦地把提到的API函数进行Google，存在漏洞的API肯定是存在在Windows 2000以来所有版本Windows中的，例如<a href="http://msdn.microsoft.com/en-us/library/ms675982(VS.85).aspx">DsGetDcCloseW</a>这样的API，微软文档声称“Client：Requires Windows Vista or Windows XP，Server：Requires Windows Server 2008 or Windows Server 2003.”，因此不可能是与漏洞有关。<br />
剩下的可疑的Windows API有这些：</p>
<ul>
<li>netapi32.dll 	DsAddressToSiteNamesA</li>
<li>netapi32.dll 	DsAddressToSiteNamesExA</li>
<li>netapi32.dll 	DsAddressToSiteNamesExW</li>
<li>netapi32.dll 	DsAddressToSiteNamesW</li>
<li>netapi32.dll 	DsDeregisterDnsHostRecordsA</li>
<li>netapi32.dll 	DsDeregisterDnsHostRecordsW</li>
<li>netapi32.dll 	DsEnumerateDomainTrustsA</li>
<li>netapi32.dll 	DsEnumerateDomainTrustsW</li>
<li>netapi32.dll 	DsGetDcNameA</li>
<li>netapi32.dll 	DsGetDcNameW</li>
<li>netapi32.dll 	DsGetDcOpenA</li>
<li>netapi32.dll 	DsGetDcOpenW</li>
<li>netapi32.dll 	DsGetDcSiteCoverageA</li>
<li>netapi32.dll 	DsGetDcSiteCoverageW</li>
<li>netapi32.dll 	DsGetSiteNameA</li>
<li>netapi32.dll 	DsGetSiteNameW</li>
<li>netapi32.dll 	DsMergeForestTrustInformationW</li>
<li>netapi32.dll 	DsRoleFreeMemory</li>
<li>netapi32.dll 	DsRoleGetPrimaryDomainInformation</li>
<li>netapi32.dll 	NetApiBufferAllocate</li>
<li>netapi32.dll 	NetApiBufferFree</li>
<li>netapi32.dll 	NetApiBufferReallocate</li>
<li>netapi32.dll 	NetApiBufferSize</li>
<li>netapi32.dll 	NetConnectionEnum</li>
<li>netapi32.dll 	NetDfsAdd</li>
<li>netapi32.dll 	NetDfsAddFtRoot</li>
<li>netapi32.dll 	NetDfsAddStdRoot</li>
<li>netapi32.dll 	NetDfsAddStdRootForced</li>
<li>netapi32.dll 	NetDfsEnum</li>
<li>netapi32.dll 	NetDfsGetClientInfo</li>
<li>netapi32.dll 	NetDfsGetInfo</li>
<li>netapi32.dll 	NetDfsRemove</li>
<li>netapi32.dll 	NetDfsRemoveFtRoot</li>
<li>netapi32.dll 	NetDfsRemoveStdRoot</li>
<li>netapi32.dll 	NetDfsSetClientInfo</li>
<li>netapi32.dll 	NetDfsSetInfo</li>
<li>netapi32.dll 	NetFileClose</li>
<li>netapi32.dll 	NetFileEnum</li>
<li>netapi32.dll 	NetFileGetInfo</li>
<li>netapi32.dll 	NetGetAnyDCName</li>
<li>netapi32.dll 	NetGetDCName</li>
<li>netapi32.dll 	NetGetDisplayInformationIndex</li>
<li>netapi32.dll 	NetGetJoinableOUs</li>
<li>netapi32.dll 	NetGetJoinInformation</li>
<li>netapi32.dll 	NetGroupAdd</li>
<li>netapi32.dll 	NetGroupAddUser</li>
<li>netapi32.dll 	NetGroupDel</li>
<li>netapi32.dll 	NetGroupDelUser</li>
<li>netapi32.dll 	NetGroupEnum</li>
<li>netapi32.dll 	NetGroupGetInfo</li>
<li>netapi32.dll 	NetGroupGetUsers</li>
<li>netapi32.dll 	NetGroupSetInfo</li>
<li>netapi32.dll 	NetGroupSetUsers</li>
<li>netapi32.dll 	NetLocalGroupAdd</li>
<li>netapi32.dll 	NetLocalGroupAddMembers</li>
<li>netapi32.dll 	NetLocalGroupDel</li>
<li>netapi32.dll 	NetLocalGroupDelMembers</li>
<li>netapi32.dll 	NetLocalGroupEnum</li>
<li>netapi32.dll 	NetLocalGroupGetInfo</li>
<li>netapi32.dll 	NetLocalGroupGetMembers</li>
<li>netapi32.dll 	NetLocalGroupSetInfo</li>
<li>netapi32.dll 	NetLocalGroupSetMembers</li>
<li>netapi32.dll 	NetQueryDisplayInformation</li>
<li>netapi32.dll 	NetRemoteComputerSupports</li>
<li>netapi32.dll 	NetRemoteTOD</li>
<li>netapi32.dll 	NetRenameMachineInDomain</li>
<li>netapi32.dll 	NetScheduleJobAdd</li>
<li>netapi32.dll 	NetScheduleJobDel</li>
<li>netapi32.dll 	NetScheduleJobEnum</li>
<li>netapi32.dll 	NetScheduleJobGetInfo</li>
<li>netapi32.dll 	NetServerComputerNameAdd</li>
<li>netapi32.dll 	NetServerComputerNameDel</li>
<li>netapi32.dll 	NetServerDiskEnum</li>
<li>netapi32.dll 	NetServerEnum</li>
<li>netapi32.dll 	NetServerGetInfo</li>
<li>netapi32.dll 	NetServerSetInfo</li>
<li>netapi32.dll 	NetServerTransportAdd</li>
<li>netapi32.dll 	NetServerTransportAddEx</li>
<li>netapi32.dll 	NetServerTransportDel</li>
<li>netapi32.dll 	NetServerTransportEnum</li>
<li>netapi32.dll 	NetSessionDel</li>
<li>netapi32.dll 	NetSessionEnum</li>
<li>netapi32.dll 	NetSessionGetInfo</li>
<li>netapi32.dll 	NetShareAdd</li>
<li>netapi32.dll 	NetShareCheck</li>
<li>netapi32.dll 	NetShareDel</li>
<li>netapi32.dll 	NetShareEnum</li>
<li>netapi32.dll 	NetShareGetInfo</li>
<li>netapi32.dll 	NetShareSetInfo</li>
<li>netapi32.dll 	NetStatisticsGet</li>
<li>netapi32.dll 	NetUnjoinDomain</li>
<li>netapi32.dll 	NetUseAdd</li>
<li>netapi32.dll 	NetUseDel</li>
<li>netapi32.dll 	NetUseEnum</li>
<li>netapi32.dll 	NetUseGetInfo</li>
<li>netapi32.dll 	NetUserAdd</li>
<li>netapi32.dll 	NetUserChangePassword</li>
<li>netapi32.dll 	NetUserDel</li>
<li>netapi32.dll 	NetUserEnum</li>
<li>netapi32.dll 	NetUserGetGroups</li>
<li>netapi32.dll 	NetUserGetInfo</li>
<li>netapi32.dll 	NetUserGetLocalGroups</li>
<li>netapi32.dll 	NetUserModalsGet</li>
<li>netapi32.dll 	NetUserModalsSet</li>
<li>netapi32.dll 	NetUserSetGroups</li>
<li>netapi32.dll 	NetUserSetInfo</li>
<li>netapi32.dll 	NetValidatePasswordPolicy</li>
<li>netapi32.dll 	NetWkstaGetInfo</li>
<li>netapi32.dll 	NetWkstaSetInfo</li>
<li>netapi32.dll 	NetWkstaTransportAdd</li>
<li>netapi32.dll 	NetWkstaTransportDel</li>
<li>netapi32.dll 	NetWkstaTransportEnum</li>
<li>netapi32.dll 	NetWkstaUserEnum</li>
<li>netapi32.dll 	NetWkstaUserGetInfo</li>
<li>netapi32.dll 	NetWkstaUserSetInfo</li>
</ul>
<p>接下来只能猜了&#8230;<br />
基于以上各点线索，猜测KB958644特大漏洞的原理可能是以下：</p>
<ul>
<li>文件共享及发现(共享打印机等)</li>
<li>Active Directory目录服务</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.nocoo.us/2008/10/kb958644-analyze/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nocoo.Tools：工作窗口截图工具</title>
		<link>http://www.nocoo.us/2008/10/screen-capture/</link>
		<comments>http://www.nocoo.us/2008/10/screen-capture/#comments</comments>
		<pubDate>Mon, 20 Oct 2008 05:28:06 +0000</pubDate>
		<dc:creator>nocoo</dc:creator>
				<category><![CDATA[作品发布]]></category>
		<category><![CDATA[作品]]></category>

		<guid isPermaLink="false">http://www.nocoo.us/?p=2926</guid>
		<description><![CDATA[发布一款小工具吧。设想这样一种需求： 有时候你可能想写一份教程，关于一个东西该怎么配置，可能有多个关键步骤。当然屏幕录像是最好的，不过比较大嘛。你可以用Print Screen去获取每次一张全屏幕图像，然后Photoshop到合适大小，只给人看到工作窗口，而看不到别的（因为可能涉及到隐私，比如一封给朋友没写完的抱怨老板邮件的标题栏之类的）。多麻烦。 这款小工具，打开之后就显示一个窗口，最小化就会缩在任务栏不再烦你。需要截图的时候，按下组合键：Ctrl + F12，就会把截图放在桌面一个叫做ScreenShots的文件夹里，截图只会包含当前的工作窗口，不包含别的东西。 当然，你可以一边操作一边截图，图像是按照时间戳取名字的，不会重复，每按一次快捷键就会截一张图像，你的操作，不会被打断。 对了，图片会保存成JPG格式，默认100%质量，可以在界面里设置质量，你可以按照需求降低质量以便缩小文件大小。 效果是这样的： [singlepic=18109,650,487] P.S. 我的Vista是正版的，别指责我。 下载：http://download.nocoo.us/Download/NocooTools/ScreenCapture/Release.rar]]></description>
			<content:encoded><![CDATA[<p>发布一款小工具吧。设想这样一种需求：<br />
有时候你可能想写一份教程，关于一个东西该怎么配置，可能有多个关键步骤。当然屏幕录像是最好的，不过比较大嘛。你可以用Print Screen去获取每次一张全屏幕图像，然后Photoshop到合适大小，只给人看到工作窗口，而看不到别的（因为可能涉及到隐私，比如一封给朋友没写完的抱怨老板邮件的标题栏之类的）。多麻烦。<br />
这款小工具，打开之后就显示一个窗口，最小化就会缩在任务栏不再烦你。需要截图的时候，按下组合键：Ctrl + F12，就会把截图放在桌面一个叫做ScreenShots的文件夹里，截图只会包含当前的工作窗口，不包含别的东西。<br />
当然，你可以一边操作一边截图，图像是按照时间戳取名字的，不会重复，每按一次快捷键就会截一张图像，你的操作，不会被打断。<br />
对了，图片会保存成JPG格式，默认100%质量，可以在界面里设置质量，你可以按照需求降低质量以便缩小文件大小。</p>
<p>效果是这样的：<br />
[singlepic=18109,650,487]</p>
<p>P.S. 我的Vista是正版的，别指责我。</p>
<p><strong>下载：</strong><a href="http://download.nocoo.us/Download/NocooTools/ScreenCapture/Release.rar">http://download.nocoo.us/Download/NocooTools/ScreenCapture/Release.rar</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nocoo.us/2008/10/screen-capture/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
