<?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>孩子气 &#124; C++, Lua, 大连,程序员</title>
	<atom:link href="http://sunxiunan.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://sunxiunan.com</link>
	<description>sunxiunan</description>
	<lastBuildDate>Thu, 09 Sep 2010 08:10:27 +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>使用Python自动化Windows界面操作</title>
		<link>http://sunxiunan.com/?p=1737</link>
		<comments>http://sunxiunan.com/?p=1737#comments</comments>
		<pubDate>Thu, 09 Sep 2010 08:09:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[tech]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://sunxiunan.com/?p=1737</guid>
		<description><![CDATA[要拷贝几百个文件到另一个目录，有重名现象，但是不想覆盖原有文件，在命令行下应该可以通过命令行开关来完成需求。 但是已经开始拷贝，而且就想使用界面操作，怎么办？（太纠结了！） 好在我们有Python可以使用。 http://www.tizmoi.net/watsup/intro.html http://www.brunningonline.net/simon/blog/archives/winGuiAuto.py.html 其主要设计思想就是使用Windows API找到特定窗口，然后发送键盘或者鼠标消息。 watsup我使用Python2.6，然后安装了PyWin32，还有SendKeys库，最后下载watsup，解压到Python的lib目录即可。 代码极为简单，我对winGuiAuto稍作修改，加了equalText参数，因为原来的wantedText使用的是(wantedText in targetWindows)，只要有&#34;No&#34;在字符串里面就会返回，与我想达到的效果不太一样，当然也可以用selectionFunction加lambda完成，但不想费那劲了。 1: from watsup.winGuiAuto import findControl, findTopWindow, clickButton 2: from time import sleep 3:&#160; 4: aWindow = findTopWindow(wantedText='Confirm File Replace') 5: while aWindow: 6: button = findControl(aWindow, equalText='No') 7: sleep(0.1) 8: clickButton(button) 9: sleep(1) 10: aWindow = findTopWindow(wantedText='Confirm File Replace') .csharpcode, .csharpcode pre { font-size: [...]]]></description>
			<content:encoded><![CDATA[<p>要拷贝几百个文件到另一个目录，有重名现象，但是不想覆盖原有文件，在命令行下应该可以通过命令行开关来完成需求。</p>
<p>但是已经开始拷贝，而且就想使用界面操作，怎么办？（太纠结了！）</p>
<p>好在我们有Python可以使用。</p>
<p><a title="http://www.tizmoi.net/watsup/intro.html" href="http://www.tizmoi.net/watsup/intro.html">http://www.tizmoi.net/watsup/intro.html</a></p>
<p><a title="http://www.brunningonline.net/simon/blog/archives/winGuiAuto.py.html" href="http://www.brunningonline.net/simon/blog/archives/winGuiAuto.py.html">http://www.brunningonline.net/simon/blog/archives/winGuiAuto.py.html</a></p>
<p>其主要设计思想就是使用Windows API找到特定窗口，然后发送键盘或者鼠标消息。</p>
<p>watsup我使用Python2.6，然后安装了PyWin32，还有SendKeys库，最后下载watsup，解压到Python的lib目录即可。</p>
<p>代码极为简单，我对winGuiAuto稍作修改，加了equalText参数，因为原来的wantedText使用的是(wantedText in targetWindows)，只要有&quot;No&quot;在字符串里面就会返回，与我想达到的效果不太一样，当然也可以用selectionFunction加lambda完成，但不想费那劲了。</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum1"> 1:</span> from watsup.winGuiAuto import findControl, findTopWindow, clickButton</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum2"> 2:</span> from time import sleep</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum3"> 3:</span>&#160; </pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum4"> 4:</span> aWindow = findTopWindow(wantedText=<span style="color: #006080">'Confirm File Replace'</span>)</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum5"> 5:</span> <span style="color: #0000ff">while</span> aWindow:</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum6"> 6:</span> button = findControl(aWindow, equalText=<span style="color: #006080">'No'</span>)</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum7"> 7:</span> sleep(0.1)</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum8"> 8:</span> clickButton(button)</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum9"> 9:</span> sleep(1)</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum10"> 10:</span> aWindow = findTopWindow(wantedText=<span style="color: #006080">'Confirm File Replace'</span>)</pre>
<p><!--CRLF--></div>
</div>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>如果你使用Ruby，可以参考这篇，也是一样的使用相关Windows API。</p>
<p><a title="http://rubyonwindows.blogspot.com/2007/05/automating-applications-with-ruby.html" href="http://rubyonwindows.blogspot.com/2007/05/automating-applications-with-ruby.html">http://rubyonwindows.blogspot.com/2007/05/automating-applications-with-ruby.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://sunxiunan.com/?feed=rss2&amp;p=1737</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>美能达第二卷</title>
		<link>http://sunxiunan.com/?p=1736</link>
		<comments>http://sunxiunan.com/?p=1736#comments</comments>
		<pubDate>Mon, 06 Sep 2010 15:12:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[blog]]></category>

		<guid isPermaLink="false">http://sunxiunan.com/?p=1736</guid>
		<description><![CDATA[第二卷使用三菱100的胶卷，由于时间上不凑巧，基本没怎么拍到萌萌。 &#160; &#160;&#160;]]></description>
			<content:encoded><![CDATA[<p>第二卷使用三菱100的胶卷，由于时间上不凑巧，基本没怎么拍到萌萌。</p>
<p><a href="http://sunxiunan.com/wp-content/uploads/2010/09/44860002.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="44860002" border="0" alt="44860002" src="http://sunxiunan.com/wp-content/uploads/2010/09/44860002_thumb.jpg" width="648" height="432" /></a></p>
<p><a href="http://sunxiunan.com/wp-content/uploads/2010/09/44860003.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="44860003" border="0" alt="44860003" src="http://sunxiunan.com/wp-content/uploads/2010/09/44860003_thumb.jpg" width="648" height="432" /></a></p>
<p><a href="http://sunxiunan.com/wp-content/uploads/2010/09/44860004.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="44860004" border="0" alt="44860004" src="http://sunxiunan.com/wp-content/uploads/2010/09/44860004_thumb.jpg" width="648" height="432" /></a> <a href="http://sunxiunan.com/wp-content/uploads/2010/09/44860006.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="44860006" border="0" alt="44860006" src="http://sunxiunan.com/wp-content/uploads/2010/09/44860006_thumb.jpg" width="648" height="432" /></a>&#160; <a href="http://sunxiunan.com/wp-content/uploads/2010/09/44860007.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="44860007" border="0" alt="44860007" src="http://sunxiunan.com/wp-content/uploads/2010/09/44860007_thumb.jpg" width="648" height="432" /></a></p>
<p><a href="http://sunxiunan.com/wp-content/uploads/2010/09/44860011.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="44860011" border="0" alt="44860011" src="http://sunxiunan.com/wp-content/uploads/2010/09/44860011_thumb.jpg" width="648" height="432" /></a></p>
<p><a href="http://sunxiunan.com/wp-content/uploads/2010/09/44860014.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="44860014" border="0" alt="44860014" src="http://sunxiunan.com/wp-content/uploads/2010/09/44860014_thumb.jpg" width="648" height="432" /></a> <a href="http://sunxiunan.com/wp-content/uploads/2010/09/44860012.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="44860012" border="0" alt="44860012" src="http://sunxiunan.com/wp-content/uploads/2010/09/44860012_thumb.jpg" width="648" height="432" /></a>&#160;&#160; <a href="http://sunxiunan.com/wp-content/uploads/2010/09/44860017.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="44860017" border="0" alt="44860017" src="http://sunxiunan.com/wp-content/uploads/2010/09/44860017_thumb.jpg" width="434" height="648" /></a> </p>
<p><a href="http://sunxiunan.com/wp-content/uploads/2010/09/44860027.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="44860027" border="0" alt="44860027" src="http://sunxiunan.com/wp-content/uploads/2010/09/44860027_thumb.jpg" width="648" height="432" /></a></p>
<p><a href="http://sunxiunan.com/wp-content/uploads/2010/09/44860028.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="44860028" border="0" alt="44860028" src="http://sunxiunan.com/wp-content/uploads/2010/09/44860028_thumb.jpg" width="648" height="432" /></a></p>
<p><a href="http://sunxiunan.com/wp-content/uploads/2010/09/44860033.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="44860033" border="0" alt="44860033" src="http://sunxiunan.com/wp-content/uploads/2010/09/44860033_thumb.jpg" width="648" height="432" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://sunxiunan.com/?feed=rss2&amp;p=1736</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>美能达x700第一卷</title>
		<link>http://sunxiunan.com/?p=1711</link>
		<comments>http://sunxiunan.com/?p=1711#comments</comments>
		<pubDate>Mon, 06 Sep 2010 14:59:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[blog]]></category>

		<guid isPermaLink="false">http://sunxiunan.com/?p=1711</guid>
		<description><![CDATA[一方面是喜欢胶片的粗糙感觉以及拍摄以后等待冲洗的那种心情，另一方面，也是主要原因暂时没那么多经费上数码单反，于是从ebay上拍了一台胶片单反相机。 这台胶片单反相机已经有将近30年的历史，曾经在八十年代初得到欧洲相机大奖，也号称是用了它就能达到美。没错，就是美能达x700。 第一卷使用Kodak proimage100胶卷。 下面的片子都没有经过ps处理（当然不排除店家扫描的时候p了），第一卷完全使用P模式。 这是高尔基路。 &#160; 刚起床，这是开头几张，很没经验，对焦对到衣服上了。 妈妈养的花。 &#160; 过曝了，不过还算能看。 萌萌在疯跑中。 装成熟的小女孩。 &#160;&#160;&#160; 拿着巧虎星象仪。 爷孙俩。]]></description>
			<content:encoded><![CDATA[<p>一方面是喜欢胶片的粗糙感觉以及拍摄以后等待冲洗的那种心情，另一方面，也是主要原因暂时没那么多经费上数码单反，于是从ebay上拍了一台胶片单反相机。</p>
<p>这台胶片单反相机已经有将近30年的历史，曾经在八十年代初得到欧洲相机大奖，也号称是用了它就能达到美。没错，就是美能达x700。</p>
<p>第一卷使用Kodak proimage100胶卷。</p>
<p>下面的片子都没有经过ps处理（当然不排除店家扫描的时候p了），第一卷完全使用P模式。</p>
<p><a href="http://sunxiunan.com/wp-content/uploads/2010/09/32230004.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="32230004" border="0" alt="32230004" src="http://sunxiunan.com/wp-content/uploads/2010/09/32230004_thumb.jpg" width="648" height="432" /></a></p>
<p>这是高尔基路。</p>
<p><a href="http://sunxiunan.com/wp-content/uploads/2010/09/32230010.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="32230010" border="0" alt="32230010" src="http://sunxiunan.com/wp-content/uploads/2010/09/32230010_thumb.jpg" width="434" height="648" /></a>&#160; </p>
<p>刚起床，这是开头几张，很没经验，对焦对到衣服上了。</p>
<p><a href="http://sunxiunan.com/wp-content/uploads/2010/09/32230012.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="32230012" border="0" alt="32230012" src="http://sunxiunan.com/wp-content/uploads/2010/09/32230012_thumb.jpg" width="648" height="432" /></a></p>
<p><a href="http://sunxiunan.com/wp-content/uploads/2010/09/32230013.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="32230013" border="0" alt="32230013" src="http://sunxiunan.com/wp-content/uploads/2010/09/32230013_thumb.jpg" width="648" height="432" /></a></p>
<p>妈妈养的花。</p>
<p><a href="http://sunxiunan.com/wp-content/uploads/2010/09/32230015.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="32230015" border="0" alt="32230015" src="http://sunxiunan.com/wp-content/uploads/2010/09/32230015_thumb.jpg" width="434" height="648" /></a>&#160; </p>
<p>过曝了，不过还算能看。 </p>
<p><a href="http://sunxiunan.com/wp-content/uploads/2010/09/32230022.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="32230022" border="0" alt="32230022" src="http://sunxiunan.com/wp-content/uploads/2010/09/32230022_thumb.jpg" width="648" height="432" /></a></p>
<p>萌萌在疯跑中。</p>
<p><a href="http://sunxiunan.com/wp-content/uploads/2010/09/32230028.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="32230028" border="0" alt="32230028" src="http://sunxiunan.com/wp-content/uploads/2010/09/32230028_thumb.jpg" width="648" height="432" /></a></p>
<p><a href="http://sunxiunan.com/wp-content/uploads/2010/09/32230030.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="32230030" border="0" alt="32230030" src="http://sunxiunan.com/wp-content/uploads/2010/09/32230030_thumb.jpg" width="648" height="432" /></a></p>
<p>装成熟的小女孩。</p>
<p><a href="http://sunxiunan.com/wp-content/uploads/2010/09/32230035.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="32230035" border="0" alt="32230035" src="http://sunxiunan.com/wp-content/uploads/2010/09/32230035_thumb.jpg" width="434" height="648" /></a>&#160;&#160;&#160; </p>
<p>拿着巧虎星象仪。</p>
<p><a href="http://sunxiunan.com/wp-content/uploads/2010/09/32230036.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="32230036" border="0" alt="32230036" src="http://sunxiunan.com/wp-content/uploads/2010/09/32230036_thumb.jpg" width="434" height="648" /></a> </p>
<p>爷孙俩。</p>
]]></content:encoded>
			<wfw:commentRss>http://sunxiunan.com/?feed=rss2&amp;p=1711</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Lua协程实现Fibonacci算法</title>
		<link>http://sunxiunan.com/?p=1689</link>
		<comments>http://sunxiunan.com/?p=1689#comments</comments>
		<pubDate>Wed, 25 Aug 2010 03:09:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[lua]]></category>
		<category><![CDATA[lua 协程]]></category>

		<guid isPermaLink="false">http://sunxiunan.com/?p=1689</guid>
		<description><![CDATA[费波拉且数的算法如图所示： 所以a和b分别保存了前两次的结果，每次for循环调用generator都从yield这一行代码恢复然后进行a, b = b, a+b操作。然后判断a是否小于等于n决定返回结果。 如果不用coroutine.wrap，我们可以这样写，效果是一样的，代码稍显啰嗦：]]></description>
			<content:encoded><![CDATA[<p><a href="http://sunxiunan.com/media/LuaFibonacci_9824/image.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://sunxiunan.com/media/LuaFibonacci_9824/image_thumb.png" width="480" height="251" /></a> </p>
<p>费波拉且数的算法如图所示：</p>
<p><a href="http://sunxiunan.com/media/LuaFibonacci_9824/image_3.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://sunxiunan.com/media/LuaFibonacci_9824/image_thumb_3.png" width="350" height="95" /></a> </p>
<p>所以a和b分别保存了前两次的结果，每次for循环调用generator都从yield这一行代码恢复然后进行a, b = b, a+b操作。然后判断a是否小于等于n决定返回结果。</p>
<p>如果不用coroutine.wrap，我们可以这样写，效果是一样的，代码稍显啰嗦：</p>
<p><a href="http://sunxiunan.com/media/LuaFibonacci_9824/image_4.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://sunxiunan.com/media/LuaFibonacci_9824/image_thumb_4.png" width="605" height="411" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://sunxiunan.com/?feed=rss2&amp;p=1689</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>秀秀最近一些胶片</title>
		<link>http://sunxiunan.com/?p=1688</link>
		<comments>http://sunxiunan.com/?p=1688#comments</comments>
		<pubDate>Mon, 23 Aug 2010 07:33:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[photo]]></category>
		<category><![CDATA[宝宝照片]]></category>

		<guid isPermaLink="false">http://sunxiunan.com/?p=1688</guid>
		<description><![CDATA[奥林巴斯Mju2配合Fuji100胶片，这卷拍了很长时间，但是片子质量还是比较给力滴。 最喜欢这张，每天必须的活动：爷爷带着孙女在楼下玩。 Happy的母女俩。 去朋友婚礼我喜欢带着这个小相机，不担心弱光或者没电的情况。]]></description>
			<content:encoded><![CDATA[<p>奥林巴斯Mju2配合Fuji100胶片，这卷拍了很长时间，但是片子质量还是比较给力滴。</p>
<p><img src="http://static.zooomr.com/images/9402831_04da5ea541.jpg" /> </p>
<p>最喜欢这张，每天必须的活动：爷爷带着孙女在楼下玩。</p>
<p><img src="http://static.zooomr.com/images/9402829_c455566d6f.jpg" /> </p>
<p> Happy的母女俩。</p>
<p><img src="http://static.zooomr.com/images/9402819_f6d805ef3e.jpg" /> </p>
<p>去朋友婚礼我喜欢带着这个小相机，不担心弱光或者没电的情况。</p>
<p><img src="http://static.zooomr.com/images/9402813_85689e5956.jpg" /></p>
]]></content:encoded>
			<wfw:commentRss>http://sunxiunan.com/?feed=rss2&amp;p=1688</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>大连Python用户组活动简记</title>
		<link>http://sunxiunan.com/?p=1686</link>
		<comments>http://sunxiunan.com/?p=1686#comments</comments>
		<pubDate>Sun, 22 Aug 2010 14:41:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[tech]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://sunxiunan.com/?p=1686</guid>
		<description><![CDATA[在王元毅（@yuanyi_wang）孜孜不倦的努力以及大连天维科技李丕总经理的大力赞助支持下，大连Python用户组终于在一个大雨滂沱的早晨成立了！ 大连这几天都是湿漉漉的，动辄就是下雨刮风。我从家里出来的时候还没有下雨，结果车坐到一半就开始大雨瓢泼，等到下车的时候，车站路边积了很深的水，只有趟着过才行。 天维科技就在七贤岭车站边上的高层办公楼，16楼。我去的时候还不到九点（约定开会时间九点半），这一带高楼大厦那是多多，可就是没有买吃的地方，与其等着不如去买点吃的，就跑到黑石礁买了麦当劳早餐。结果雨越下越大，再回到天维科技办公楼的时候已经是九点五十，会议室里已经坐了不少朋友，扫一眼大概有八九个人。 大家闲聊了一阵，然后元毅主持会议开始，首先是各自做自我介绍，除了twitter上的ouland、gamtin，其他朋友不是很熟悉。除了天维的李总，基本上都是搞程序开发的，还有几位朋友是做测试方面的工作。 介绍完了各自情况，元毅做了一个对Python的简单介绍。然后我做了一个Lua的简单介绍以及代码简介。 大家除了讨论Python的相关问题，也对天维公司www.5itvi.com非常感兴趣，我在李总作介绍的时候问了不少问题，主要是对他在贝尔实验室的经历非常感兴趣，要知道贝尔实验室那是牛人多多啊。 最后李总给我们演示了天维媒体中心这个产品。这里要着重提一下，天维这个产品有些类似盛大以前的盒子，可以非常高效使用高速宽带，实现游戏、视频点播、高清播放甚至网络电话的这样一个平台。由于不知道产品细节适不适合在这里细说，就不多说我看到的演示过程，但是可以说这个产品是非常有意思的，就我个人而言，对其中网络电话这部分很感兴趣，遥控器可以作为网络电话的话筒。用一句话来说就是：我很有对这个产品的购买欲望。天维这个产品的界面以及服务器部分使用Python完成，就我所知是大连地区唯一一个使用Python做产品的公司。 整个活动其实还是比较简单，没有其他地区用户组活动比较深入的讨论，这是很遗憾的事情，但是比较符合大连整个软件产业的现状。尽管官方大力吹捧大连是所谓的软件产业为主，个人觉得这里面水分太多，所谓的软件开发大部分是日韩或者欧美的外包业务，少有核心研发业务，而且官方几乎也没有组织过什么软件开发方面的论坛或者研讨会。唯一参加过的就是微软在大连的广告宣传（而且也挺水的）。我在讨论中也稍微有些激动的提到，对大连成立Python用户组那是期待已久，其实讨论Python也好，研究DotNet或者Java也罢，Topic是一部分，最重要的是大家有这样一个平台可以线下互相交流。Python大连用户组的成立填补了我这个遗憾，即使现在大家还没有什么深入的内容讨论，也许将来讨论的也未必高深到哪里，但是我真的很爱这种可以跟其他喜欢技术的朋友交流的感觉。]]></description>
			<content:encoded><![CDATA[<p>在王元毅（@yuanyi_wang）孜孜不倦的努力以及大连天维科技李丕总经理的大力赞助支持下，大连Python用户组终于在一个大雨滂沱的早晨成立了！</p>
<p>大连这几天都是湿漉漉的，动辄就是下雨刮风。我从家里出来的时候还没有下雨，结果车坐到一半就开始大雨瓢泼，等到下车的时候，车站路边积了很深的水，只有趟着过才行。</p>
<p>天维科技就在七贤岭车站边上的高层办公楼，16楼。我去的时候还不到九点（约定开会时间九点半），这一带高楼大厦那是多多，可就是没有买吃的地方，与其等着不如去买点吃的，就跑到黑石礁买了麦当劳早餐。结果雨越下越大，再回到天维科技办公楼的时候已经是九点五十，会议室里已经坐了不少朋友，扫一眼大概有八九个人。</p>
<p>大家闲聊了一阵，然后元毅主持会议开始，首先是各自做自我介绍，除了twitter上的ouland、gamtin，其他朋友不是很熟悉。除了天维的李总，基本上都是搞程序开发的，还有几位朋友是做测试方面的工作。</p>
<p>介绍完了各自情况，元毅做了一个对Python的简单介绍。然后我做了一个Lua的简单介绍以及代码简介。</p>
<p>大家除了讨论Python的相关问题，也对<a href="http://www.5itvi.com" target="_blank">天维公司www.5itvi.com</a><cite></cite>非常感兴趣，我在李总作介绍的时候问了不少问题，主要是对他在贝尔实验室的经历非常感兴趣，要知道贝尔实验室那是牛人多多啊。</p>
<p>最后李总给我们演示了天维媒体中心这个产品。这里要着重提一下，天维这个产品有些类似盛大以前的盒子，可以非常高效使用高速宽带，实现游戏、视频点播、高清播放甚至网络电话的这样一个平台。由于不知道产品细节适不适合在这里细说，就不多说我看到的演示过程，但是可以说这个产品是非常有意思的，就我个人而言，对其中网络电话这部分很感兴趣，遥控器可以作为网络电话的话筒。用一句话来说就是：我很有对这个产品的购买欲望。天维这个产品的界面以及服务器部分使用Python完成，就我所知是大连地区唯一一个使用Python做产品的公司。</p>
<p>整个活动其实还是比较简单，没有其他地区用户组活动比较深入的讨论，这是很遗憾的事情，但是比较符合大连整个软件产业的现状。尽管官方大力吹捧大连是所谓的软件产业为主，个人觉得这里面水分太多，所谓的软件开发大部分是日韩或者欧美的外包业务，少有核心研发业务，而且官方几乎也没有组织过什么软件开发方面的论坛或者研讨会。唯一参加过的就是微软在大连的广告宣传（而且也挺水的）。我在讨论中也稍微有些激动的提到，对大连成立Python用户组那是期待已久，其实讨论Python也好，研究DotNet或者Java也罢，Topic是一部分，最重要的是大家有这样一个平台可以线下互相交流。Python大连用户组的成立填补了我这个遗憾，即使现在大家还没有什么深入的内容讨论，也许将来讨论的也未必高深到哪里，但是我真的很爱这种可以跟其他喜欢技术的朋友交流的感觉。</p>
]]></content:encoded>
			<wfw:commentRss>http://sunxiunan.com/?feed=rss2&amp;p=1686</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>C语言中的表达式求值问题</title>
		<link>http://sunxiunan.com/?p=1684</link>
		<comments>http://sunxiunan.com/?p=1684#comments</comments>
		<pubDate>Wed, 18 Aug 2010 05:58:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[tech]]></category>
		<category><![CDATA[c++]]></category>

		<guid isPermaLink="false">http://sunxiunan.com/?p=1684</guid>
		<description><![CDATA[在细读《C programming Language 2nd》（K&#38;R）到53页的时候，看到作者举了这样一个例子： a[i] = i++; 如果你知道这个表达式有什么问题，就不需要继续看下去了，下面内容对你而言有些浅显。 如果你也像我一样，觉得这个很容易理解啊，i++这个表达式就是先取i的值返回，然后对i自加。a[i]就是i的值，然后i自加1。 这其实也是C语言陷阱之一，在K&#38;R中反复强调（page52以及page202），函数参数也好、某个操作符中的操作数也罢，表达式求值次序是不一定的，每个特定机器、操作系统、编译器都不一样。（特例是&#38;&#38;，&#124;&#124;，?:以及逗号操作符，它们会确定表达式求值顺序的） 还有类似的例子如下： f() + (g() * h()) 或者 int i = 7;&#160; printf(&#34;%d\n&#34;, i++ * i++); 在我们一开始提出的问题中，a[i]取下标操作与i++自增的运算顺序是不一定的。这就是一种不确定性。 在第一个表达式中，可以确定的是这些内容：g和h函数的结果会先做乘法运算，然后与f函数的结果做加法运算，但是f，g，h谁先被调用，谁后被调用，这是不一定的，C语言标准没有对此作规定。 第二个表达式中，第一个自增操作和第二个自增操作以及乘法操作的顺序是不一定的，所以结果根本无法确定，即使我们给i++都包裹上括号 (i++) * (i++)也是一样的。括号并不会得到确定的操作数计算顺序，括号只能保证操作数的值（就是表达式或者函数求值的结果）相互计算的顺序。 K&#38;R提供了几个建议，首先是函数调用嵌套赋值语句（或者可能改变参数值的操作）或者自增操作，都会有&#34;side effect”，我们应该确保这种边际效应不会影响程序运行结果，如果某个表达式对同一个变量同时修改两次，那么一定要非常注意这是不是你想得到的结果。 如果不知道特定机器上实现如何，就不要依赖表达式计算顺序；即使知道了实现方式，这种依赖也不是一种好的编程方式。比如f、g、h函数计算，可以用赋值给临时变量来决定需要的顺序，对于print(i++)这个表达式也是如此，在printf之外先计算i的值。用K&#38;R第一版的话来说就是if you don&#8217;t know how they are done on various machines, that innocence may help to protect you. 参考资料： http://www.eskimo.com/~scs/cclass/notes/sx7c.html 《C Programming [...]]]></description>
			<content:encoded><![CDATA[<p>在细读《C programming Language 2nd》（K&amp;R）到53页的时候，看到作者举了这样一个例子：</p>
<p>a[i] = i++;</p>
<p>如果你知道这个表达式有什么问题，就不需要继续看下去了，下面内容对你而言有些浅显。</p>
<p>如果你也像我一样，觉得这个很容易理解啊，i++这个表达式就是先取i的值返回，然后对i自加。a[i]就是i的值，然后i自加1。</p>
<p>这其实也是C语言陷阱之一，在K&amp;R中反复强调（page52以及page202），函数参数也好、某个操作符中的操作数也罢，表达式求值次序是不一定的，每个特定机器、操作系统、编译器都不一样。（特例是&amp;&amp;，||，?:以及逗号操作符，它们会确定表达式求值顺序的）</p>
<p>还有类似的例子如下：</p>
<p>f() + (g() * h())</p>
<p>或者 int i = 7;&#160; printf(&quot;%d\n&quot;, i++ * i++);</p>
<p>在我们一开始提出的问题中，a[i]取下标操作与i++自增的运算顺序是不一定的。这就是一种不确定性。</p>
<p>在第一个表达式中，可以确定的是这些内容：g和h函数的结果会先做乘法运算，然后与f函数的结果做加法运算，但是f，g，h谁先被调用，谁后被调用，这是不一定的，C语言标准没有对此作规定。</p>
<p>第二个表达式中，第一个自增操作和第二个自增操作以及乘法操作的顺序是不一定的，所以结果根本无法确定，即使我们给i++都包裹上括号 (i++) * (i++)也是一样的。括号并不会得到确定的操作数计算顺序，括号只能保证操作数的值（就是表达式或者函数求值的结果）相互计算的顺序。</p>
<p>K&amp;R提供了几个建议，首先是函数调用嵌套赋值语句（或者可能改变参数值的操作）或者自增操作，都会有&quot;side effect”，我们应该确保这种边际效应不会影响程序运行结果，如果某个表达式对同一个变量同时修改两次，那么一定要非常注意这是不是你想得到的结果。</p>
<p>如果不知道特定机器上实现如何，就不要依赖表达式计算顺序；即使知道了实现方式，这种依赖也不是一种好的编程方式。比如f、g、h函数计算，可以用赋值给临时变量来决定需要的顺序，对于print(i++)这个表达式也是如此，在printf之外先计算i的值。用K&amp;R第一版的话来说就是if you don&#8217;t know how they are done on various machines, that innocence may help to protect you. </p>
<p>参考资料：</p>
<p><a title="http://www.eskimo.com/~scs/cclass/notes/sx7c.html" href="http://www.eskimo.com/~scs/cclass/notes/sx7c.html">http://www.eskimo.com/~scs/cclass/notes/sx7c.html</a></p>
<p>《C Programming Language second edition》</p>
]]></content:encoded>
			<wfw:commentRss>http://sunxiunan.com/?feed=rss2&amp;p=1684</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Visual C++ Project uses asm files</title>
		<link>http://sunxiunan.com/?p=1683</link>
		<comments>http://sunxiunan.com/?p=1683#comments</comments>
		<pubDate>Wed, 18 Aug 2010 03:12:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[tech]]></category>
		<category><![CDATA[asm]]></category>

		<guid isPermaLink="false">http://sunxiunan.com/?p=1683</guid>
		<description><![CDATA[As you know, C++ project could embed asm in function. But in some cases, we want to use asm file in our project. How to do? 1, open the project, and insert existing xxx.asm file into project. Or you could generate new file and name it as &#34;xxx.asm&#34;. 2, in C/C++ source code, if you [...]]]></description>
			<content:encoded><![CDATA[<p>As you know, C++ project could embed asm in function. But in some cases, we want to use asm file in our project. How to do?</p>
<p>1, open the project, and insert existing xxx.asm file into project. Or you could generate new file and name it as &quot;xxx.asm&quot;.</p>
<p><a href="http://sunxiunan.com/media/VisualCProjectaddsasmfile_9B70/image.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://sunxiunan.com/media/VisualCProjectaddsasmfile_9B70/image_thumb.png" width="640" height="319" /></a> </p>
<p>2, in C/C++ source code, if you want to use the function, just add declaration before using it. Please note: in C++ code, extern &quot;C&quot; should be added (like above image).</p>
<p>3, edit and save the asm function.</p>
<p><a href="http://sunxiunan.com/media/VisualCProjectaddsasmfile_9B70/image_3.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://sunxiunan.com/media/VisualCProjectaddsasmfile_9B70/image_thumb_3.png" width="648" height="298" /></a> </p>
<p>4, In asm1.asm custom project setting, add following in command line:</p>
<p>ml /c /Cx /coff -Zi &quot;-Fl$(InputDir)\$(InputName).lst&quot; &quot;$(InputPath)&quot;</p>
<p>Add following in outputs:</p>
<p>$(InputName).obj</p>
<p><a href="http://sunxiunan.com/media/VisualCProjectaddsasmfile_9B70/image_4.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://sunxiunan.com/media/VisualCProjectaddsasmfile_9B70/image_thumb_4.png" width="504" height="165" /></a> </p>
<p>Try to compile the asm1.asm, the asm1.lst and asm1.obj files should appear under project folder. </p>
<p>5, Build the solution. All done.</p>
<p>If there are some errors, you could try to copy the asm1.obj to &quot;Debug&quot; or &quot;release&quot; folder, if it could fix the issue, you could modify the path of command line and outputs setting of asm1.asm.</p>
]]></content:encoded>
			<wfw:commentRss>http://sunxiunan.com/?feed=rss2&amp;p=1683</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lua Unicode （Wiki翻译）</title>
		<link>http://sunxiunan.com/?p=1681</link>
		<comments>http://sunxiunan.com/?p=1681#comments</comments>
		<pubDate>Mon, 16 Aug 2010 09:18:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[lua]]></category>
		<category><![CDATA[unicode]]></category>

		<guid isPermaLink="false">http://sunxiunan.com/?p=1681</guid>
		<description><![CDATA[http://lua-users.org/wiki/LuaUnicode 这里尝试着回答一下LuaFaq问题： 我可以使用Unicode字符串么？或者，Lua支持Unicode么？ 简言之，可以，不支持。Lua只有极为精简的支持和足够的辅助功能，就没有其它的了。Unicode是一个庞大而复杂的标准，像是“Lua是否支持Unicode”是比较模糊地问题。 一些问题如下： 我可以存取Unicode字符串么？ 我的Lua程序能用Unicode写么？ 我可以比较Unicode字符串是否相同么？ 字符串排序。 模式匹配。 我可以取得一个Unicode字符串的长度么？ 支持括号型匹配，双向打印，随意的字符串组合以及各种高品质排版技术中产生的问题。 Lua字符串使用8-bit，所以简单的应用是支持的（比如存取操作）。但对于其他复杂操作没有内建支持。想知道更多故事，往下看。 Unicode字符串和Lua字符串 一个Lua字符串是一个至少8bit值的任意组合；可以直接映射到C编译器中的char类型（可能会比8bits更宽，但是一定会保证有8bits）。Lua没有保留任意字符，包括NUL。这意味着你可以成功地在Lua中存储UTF-8字符串。 注意UTF-8只是存储Unicode字符串的一种可能。还有其他编码模式，包括UTF-16和UTF-32以及它们的大端、小端变体。无论如何，所有这些都仅仅是8位字节的组合，可以毫无问题的存储到Lua字符串中。 在Lua中字符串的输入输出（使用IO库）使用C的stdio库，ANSI C不需要stdio库来处理任意8位字节顺序，除非是二进制模式。更进一步说，在非二进制模式，一些8位字节顺序可以转换到其他字符（为了处理不同平台上的换行符）。 这可能影响到处理非二进制的而且不是UTF-8格式的Unicode字符串文件输入输出。UTF-8字符串可能还是安全的，因为UTF-8不使用控制字符如\r \n作为多字节解析的一部分。而且这也不是一定的。如果你需要个确定答案，你应该使用二进制模式输入输出（binary-mode）。（如果你使用二进制模式，行结尾符将不会被转换）。 Unix文件输入输出很长时间里都是8字节整的。如果你不关心可移植性，仅仅在Unix或者类Unix系统上工作，可以完全不用担心前面提到的。 如果你使用Unicode是限制在传送字符串到外部支持Unicode的程序员，应该是不用担心的。例如，你应该可以从数据库取得一个Unicode字符串传递到一个识别Unicode的图形库中。但是也看看下面关于模式匹配和字符串等同比较的章节。 Unicode Lua 程序 字面型Unicode字符串可以出现在你的Lua程序组，UTF-8编码的字符串可以直接用8位字符形式或者使用\ddd语法（注意ddd是一个十进制数）。无论如何没有编码多字节顺序的功能（比如\U+20B4）；你可能不得不手动把它们编码成UTF-8格式或者以正确的大端或小端顺序塞进单独的8位字节数值中（针对UTF-16或者UTF-32）。 如果你不是使用某个char比8位更长字节的操作系统，就不能用任意的Unicode字符作为Lua标示符（变量名或者类似）。你可能使用ANSI以外的8位字符，Lua使用C函数isalpha和isalnum来辨别正确的可作为标示符的字符，所以这与当前locale配置有关。实话讲，使用ANSI以外的的字符做标示符不是一个好主意，因为你的程序可能没法在标准C locale下编译。 比较和排序 Lua字符串比较（使用==操作符）是通过逐个字节比较完成。这意味着==仅仅可以用来比较特殊的等同性，就是Unicode字符已经被正常化为正常可能之一（http://www.unicode.org/faq/normalization.html）。标准Lua库不提供任何正常化Unicode字符串的能力。相应的，非正常化的Unicode字符串也不能被可靠的用作table的key。 如果你想用Unicode类型的字符串等同比较，或者使用Unicode作为table的key，你不能保证你的字符串一定被正常化，然后你不得不自己写或者寻找一个正常化函数，这是一个很重要的练习！ Lua字符串比较操作符（&#60;和&#60;=）使用C语言函数strcoll，这个函数依赖于locale配置。这意味着两个字符串随着locale不同会得到不同的结果。例如，字符串使用西班牙语传统排序与威尔士语排序结果是不一样的。 也许你的操作系统实现了你想要的排序算法，这时候你可以使用它们，否则你可能要自己写函数来对Unicode字符串排序。这是一个更重要的练习。 UTF-8被设计成一个8位字节序的简单逐位比较可以得到同样的结果。UTF-32也是正确的，但是我不知道什么系统使用这个编码方式。不幸的是，简单的逐位比较没有被用作任何语言的排列顺序。 模式匹配 Lua的模式匹配的工作方式也是逐个字节的。通常情况下，这对于Unicode的模式匹配没有用处。即使有时候程序以你预想的方式工作了。例如，&#34;%u&#34;将不能匹配所有Unicode大写字符。你能匹配正常化后的Unicode字符串中的单个Unicode字符，但是你可能也担心字符串顺序。如果没有后续合并字符串，&#34;a&#34;将匹配一个UTF-8字符中的字符a。在UTF-16LE中你能匹配&#34;a%z&#34;。（记住你不能使用\0在Lua模式中） 长度和字符串索引 如果你想知道一个Unicode字符的长度，根据情况不同你会得到不同答案。 如果你想知道一个字符串占据多少个字节，比如你想拷贝到某个buffer中，现有的string.len函数可以工作。 你可能想知道Unicode字符串有多少字符。根据被使用的编码，一个单一的Unicode字符占用4个字节。只有UTF-32LE和UTF-32BE是常数长度编码（每个字符四字节）；UTF-32是一个常数长度编码但是第一个元素应该是”字节序标记”。这不应该被看做字符（UTF-32和变体是最新版本Unicode4.0的一部分）。 一些UTF-16的实现确保所有字符都是两字节长，但是从Unicode3.0版本以后就不是这样。 很高兴的是UTF-8被设计成很容易计算Unicode字符串中符号个数；仅仅计算0&#215;00到0x7f或者0xC2到0xF4范围内的八位字节数字个数。这些是UTF-8字符码的开始。0xC0, 0xC1, 0xF5到0xFF不能用于构成UTF-8字节序；八位字节在0&#215;80到0xBF可以仅仅出现在第二个或者多位编码后面部分。记住你不能使用\0在Lua模式中。 例如，你想使用接下来的代码计算UTF-8字符个数，（对于计算某些非法字符，这是不正确的） local _, count = string.gsub(unicode_string, &#34;[^\128-\193]&#34;, &#34;&#34;) 如果你想知道一个Unicode字符串占据多少打印列（当你使用固定宽度字体），又有不同的回答了。这是因为某些Unicode字符没有一个打印宽度，而另外一些有两倍的打印宽度。合并字符被用于给其他字符加重音，通常打印时不占据额外空间。 所以不同情况下至少有三种不同的长度可能。Lua提供了一种string.len，而其它你需要自己写函数。 有一个类似的问题就是通过位置索引字符串某个字符。string.sub(s, [...]]]></description>
			<content:encoded><![CDATA[<p><a title="http://lua-users.org/wiki/LuaUnicode" href="http://lua-users.org/wiki/LuaUnicode">http://lua-users.org/wiki/LuaUnicode</a></p>
<p>这里尝试着回答一下LuaFaq问题：</p>
<p><strong>我可以使用Unicode字符串么？或者，Lua支持Unicode么？</strong></p>
<p>简言之，可以，不支持。Lua只有极为精简的支持和足够的辅助功能，就没有其它的了。Unicode是一个庞大而复杂的标准，像是“Lua是否支持Unicode”是比较模糊地问题。</p>
<p>一些问题如下：</p>
<p>我可以存取Unicode字符串么？</p>
<p>我的Lua程序能用Unicode写么？</p>
<p>我可以比较Unicode字符串是否相同么？</p>
<p>字符串排序。</p>
<p>模式匹配。</p>
<p>我可以取得一个Unicode字符串的长度么？</p>
<p>支持括号型匹配，双向打印，随意的字符串组合以及各种高品质排版技术中产生的问题。</p>
<p>Lua字符串使用8-bit，所以简单的应用是支持的（比如存取操作）。但对于其他复杂操作没有内建支持。想知道更多故事，往下看。</p>
<p><strong>Unicode字符串和Lua字符串</strong></p>
<p>一个Lua字符串是一个至少8bit值的任意组合；可以直接映射到C编译器中的char类型（可能会比8bits更宽，但是一定会保证有8bits）。Lua没有保留任意字符，包括NUL。这意味着你可以成功地在Lua中存储UTF-8字符串。</p>
<p>注意UTF-8只是存储Unicode字符串的一种可能。还有其他编码模式，包括UTF-16和UTF-32以及它们的大端、小端变体。无论如何，所有这些都仅仅是8位字节的组合，可以毫无问题的存储到Lua字符串中。</p>
<p>在Lua中字符串的输入输出（使用IO库）使用C的stdio库，ANSI C不需要stdio库来处理任意8位字节顺序，除非是二进制模式。更进一步说，在非二进制模式，一些8位字节顺序可以转换到其他字符（为了处理不同平台上的换行符）。</p>
<p>这可能影响到处理非二进制的而且不是UTF-8格式的Unicode字符串文件输入输出。UTF-8字符串可能还是安全的，因为UTF-8不使用控制字符如\r \n作为多字节解析的一部分。而且这也不是一定的。如果你需要个确定答案，你应该使用二进制模式输入输出（binary-mode）。（如果你使用二进制模式，行结尾符将不会被转换）。</p>
<p>Unix文件输入输出很长时间里都是8字节整的。如果你不关心可移植性，仅仅在Unix或者类Unix系统上工作，可以完全不用担心前面提到的。</p>
<p>如果你使用Unicode是限制在传送字符串到外部支持Unicode的程序员，应该是不用担心的。例如，你应该可以从数据库取得一个Unicode字符串传递到一个识别Unicode的图形库中。但是也看看下面关于模式匹配和字符串等同比较的章节。</p>
<p><strong>Unicode Lua 程序</strong></p>
<p>字面型Unicode字符串可以出现在你的Lua程序组，UTF-8编码的字符串可以直接用8位字符形式或者使用\ddd语法（注意ddd是一个十进制数）。无论如何没有编码多字节顺序的功能（比如\U+20B4）；你可能不得不手动把它们编码成UTF-8格式或者以正确的大端或小端顺序塞进单独的8位字节数值中（针对UTF-16或者UTF-32）。</p>
<p>如果你不是使用某个char比8位更长字节的操作系统，就不能用任意的Unicode字符作为Lua标示符（变量名或者类似）。你可能使用ANSI以外的8位字符，Lua使用C函数isalpha和isalnum来辨别正确的可作为标示符的字符，所以这与当前locale配置有关。实话讲，使用ANSI以外的的字符做标示符不是一个好主意，因为你的程序可能没法在标准C locale下编译。</p>
<p><strong>比较和排序</strong></p>
<p>Lua字符串比较（使用==操作符）是通过逐个字节比较完成。这意味着==仅仅可以用来比较特殊的等同性，就是Unicode字符已经被正常化为正常可能之一（<a title="http://www.unicode.org/faq/normalization.html" href="http://www.unicode.org/faq/normalization.html">http://www.unicode.org/faq/normalization.html</a>）。标准Lua库不提供任何正常化Unicode字符串的能力。相应的，非正常化的Unicode字符串也不能被可靠的用作table的key。</p>
<p>如果你想用Unicode类型的字符串等同比较，或者使用Unicode作为table的key，你不能保证你的字符串一定被正常化，然后你不得不自己写或者寻找一个正常化函数，这是一个很重要的练习！</p>
<p>Lua字符串比较操作符（&lt;和&lt;=）使用C语言函数strcoll，这个函数依赖于locale配置。这意味着两个字符串随着locale不同会得到不同的结果。例如，字符串使用西班牙语传统排序与威尔士语排序结果是不一样的。</p>
<p>也许你的操作系统实现了你想要的排序算法，这时候你可以使用它们，否则你可能要自己写函数来对Unicode字符串排序。这是一个更重要的练习。</p>
<p>UTF-8被设计成一个8位字节序的简单逐位比较可以得到同样的结果。UTF-32也是正确的，但是我不知道什么系统使用这个编码方式。不幸的是，简单的逐位比较没有被用作任何语言的排列顺序。</p>
<p><strong>模式匹配</strong></p>
<p>Lua的模式匹配的工作方式也是逐个字节的。通常情况下，这对于Unicode的模式匹配没有用处。即使有时候程序以你预想的方式工作了。例如，&quot;%u&quot;将不能匹配所有Unicode大写字符。你能匹配正常化后的Unicode字符串中的单个Unicode字符，但是你可能也担心字符串顺序。如果没有后续合并字符串，&quot;a&quot;将匹配一个UTF-8字符中的字符a。在UTF-16LE中你能匹配&quot;a%z&quot;。（记住你不能使用\0在Lua模式中）</p>
<p><strong>长度和字符串索引</strong></p>
<p>如果你想知道一个Unicode字符的长度，根据情况不同你会得到不同答案。</p>
<p>如果你想知道一个字符串占据多少个字节，比如你想拷贝到某个buffer中，现有的string.len函数可以工作。</p>
<p>你可能想知道Unicode字符串有多少字符。根据被使用的编码，一个单一的Unicode字符占用4个字节。只有UTF-32LE和UTF-32BE是常数长度编码（每个字符四字节）；UTF-32是一个常数长度编码但是第一个元素应该是”字节序标记”。这不应该被看做字符（UTF-32和变体是最新版本Unicode4.0的一部分）。</p>
<p>一些UTF-16的实现确保所有字符都是两字节长，但是从Unicode3.0版本以后就不是这样。</p>
<p>很高兴的是UTF-8被设计成很容易计算Unicode字符串中符号个数；仅仅计算0&#215;00到0x7f或者0xC2到0xF4范围内的八位字节数字个数。这些是UTF-8字符码的开始。0xC0, 0xC1, 0xF5到0xFF不能用于构成UTF-8字节序；八位字节在0&#215;80到0xBF可以仅仅出现在第二个或者多位编码后面部分。记住你不能使用\0在Lua模式中。</p>
<p>例如，你想使用接下来的代码计算UTF-8字符个数，（对于计算某些非法字符，这是不正确的）</p>
<pre>local _, count = string.gsub(unicode_string, &quot;[^\128-\193]&quot;, &quot;&quot;)</pre>
<p>如果你想知道一个Unicode字符串占据多少打印列（当你使用固定宽度字体），又有不同的回答了。这是因为某些Unicode字符没有一个打印宽度，而另外一些有两倍的打印宽度。合并字符被用于给其他字符加重音，通常打印时不占据额外空间。</p>
<p>所以不同情况下至少有三种不同的长度可能。Lua提供了一种string.len，而其它你需要自己写函数。</p>
<p>有一个类似的问题就是通过位置索引字符串某个字符。string.sub(s, -3)会返回最后三个字节，但未必会返回最后三个字符。</p>
<p>你可能使用接下来代码段枚举UTF-8字节序：</p>
<pre>

 for uchar in string.gfind(ustring, &quot;([%z\1-\127\194-\244][\128-\191]*)&quot;) 

&#160; do -- something 

end
</pre>
<h4>More sophisticated issues</h4>
<p>As you might have guessed by now, Lua provides no support for things like bidirectional printing or the proper formatting of Thai accents. Normally such things will be taken care of by a graphics or typography library. It would of course be possible to interface to such a library that did these things if you had access to one. </p>
<p>There is a little string-like package <a href="http://luaforge.net/projects/sln/">[slnunicode]</a> with upper/lower, len/sub and pattern matching for UTF-8. </p>
<p>See <a href="http://lua-users.org/wiki/ValidateUnicodeString">ValidateUnicodeString</a> for a smaller library. </p>
<p><a href="http://luaforge.net/projects/icu-lua/">[ICU4Lua]</a> is a Lua binding to ICU (International Components for Unicode <a href="http://en.wikipedia.org/wiki/International_Components_for_Unicode">[1]</a>), an open-source library originally developed by IBM. </p>
<p>See <a href="http://lua-users.org/wiki/UnicodeIdentifers">UnicodeIdentifers</a> for platform independent Unicode Lua programs. </p>
]]></content:encoded>
			<wfw:commentRss>http://sunxiunan.com/?feed=rss2&amp;p=1681</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>static link luasocket into lua with VC2010 under windows</title>
		<link>http://sunxiunan.com/?p=1680</link>
		<comments>http://sunxiunan.com/?p=1680#comments</comments>
		<pubDate>Fri, 06 Aug 2010 13:55:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[lua]]></category>

		<guid isPermaLink="false">http://sunxiunan.com/?p=1680</guid>
		<description><![CDATA[1, download lua source code from luabinary project (it includes VC2008 project file). Unzip it to one folder. 2, download luasocket latest code. Unzip it to the folder we create in step1. 3, open lua solution file with vc2010 (I think VC2008 should be OK too). try to build it. Should be successful. 4, add [...]]]></description>
			<content:encoded><![CDATA[<p>1, download lua source code from luabinary project (it includes VC2008 project file). Unzip it to one folder.</p>
<p>2, download luasocket latest code. Unzip it to the folder we create in step1.</p>
<p>3, open lua solution file with vc2010 (I think VC2008 should be OK too). try to build it. Should be successful.</p>
<p>4, add all *.h *.c file of luasocket into the project. Remove following from project: usocket.h usocket.c unix.h unix.c. They are used by unix OS.</p>
<p>5, Modify the project setting. </p>
<p>preprocessor definitions look like: WIN32;_WIN32LUASOCKET_EXPORTS;LUASOCKET_DEBUG;LUASOCKET_API=__declspec(dllexport);NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</p>
<p>and add “Ws2_32.lib;”into library.</p>
<p>6, insert</p>
<pre>&#160; {&quot;mime&quot;, luaopen_mime_core},&#160; {&quot;socket&quot;, luaopen_socket_core},</pre>
<p>into luaL_Reg lualibs[] of linit.c file.</p>
<p>add two extern function declaration.</p>
<pre>int luaopen_mime_core (lua_State *L);int luaopen_socket_core (lua_State *L);</pre>
<p>7, build.</p>
<p>8, change socket.lua under luasocket from require(&quot;socket.core&quot;) to require(&quot;socket&quot;) , change mime.lua, from require(&quot;mime.core&quot;) to require(&quot;mime&quot;)</p>
<p>9, in your test script, for example the testclnt.lua in luasocket/example, add this line </p>
<p>loadfile(&quot;socket.lua&quot;)() </p>
<p>before socket = require(&quot;socket&quot;);</p>
<p>10, run the test. Everything should be OK now.</p>
<p><a title="http://comments.gmane.org/gmane.comp.lang.lua.general/67646" href="http://comments.gmane.org/gmane.comp.lang.lua.general/67646">http://comments.gmane.org/gmane.comp.lang.lua.general/67646</a></p>
<p>&#160;</p>
<pre>

&#160;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://sunxiunan.com/?feed=rss2&amp;p=1680</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
