<?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>碧云涛小屋 &#187; 挨踢技术</title>
	<atom:link href="http://blog.axqd.net/categories/tech/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.axqd.net</link>
	<description>by aXqd</description>
	<lastBuildDate>Sat, 17 Jul 2010 16:42:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
	<atom:link rel='hub' href='http://blog.axqd.net/?pushpress=hub'/>
		<item>
		<title>Video and photo solution on WordPress</title>
		<link>http://blog.axqd.net/2010/07/17/video-and-photo-solution-on-wordpress/</link>
		<comments>http://blog.axqd.net/2010/07/17/video-and-photo-solution-on-wordpress/#comments</comments>
		<pubDate>Sat, 17 Jul 2010 10:36:01 +0000</pubDate>
		<dc:creator>axqd</dc:creator>
				<category><![CDATA[挨踢技术]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[jw image rotator]]></category>
		<category><![CDATA[monoslideshow]]></category>
		<category><![CDATA[nextgen gallery]]></category>
		<category><![CDATA[photo]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.axqd.net/?p=950</guid>
		<description><![CDATA[1. Video Solution 在WordPress的Plugins-&#62;Add New页面里搜索&#8221;HTML5 and Flash Video Player&#8221;，安装完成并激活后,就可以用下面的方式嵌入视频: Without Html5 Video Support: [ videoplayer file="video/xxx.flv" /] With Html5 Video Support: [ videoplayer file="video/xxx.(mp4, ogg, webm)" /] 注意, 去掉&#8217;['后面的空格,但保留 '/]&#8216;前面的空格。具体效果，见这里。 2. Photo Solution 在WordPress的Plugins-&#62;Add New页面里搜索&#8221;NextGEN Gallery&#8220;和&#8221;NextGEN Monoslideshow&#8220;，安装完成后，需要先下载相关SWF文件到&#8217;wp-content\uploads&#8217;，然后再激活。 需要下载的文件有： JW Image Rotator &#8211; 非商业用途，免费 下载地址是这里：http://www.longtailvideo.com/players/jw-image-rotator/ 解压缩后，释放imagerotator.swf文件到&#8217;wp-content\uploads&#8217;目录。 Mono Slideshow &#8211; 收费，25欧 Demo地址：http://www.monoslideshow.com/demo 需要的文件是monoslideshow.swf，同样需要释放到&#8217;wp-content\uploads&#8217;目录。 如果你很邪恶或者你很穷困潦倒，欢迎使用google的filetype:swf，自行查找，大家共同鄙视之&#8230; 小声说，最好的偷窃地方是这里。 好了，最后配置一下路径： Gallery-&#62;Options-&#62;Slideshow下面的路径； [...]]]></description>
			<content:encoded><![CDATA[<p><strong>1. Video Solution</strong></p>
<p>在WordPress的Plugins-&gt;Add New页面里搜索&#8221;HTML5 and Flash Video Player&#8221;，安装完成并激活后,就可以用下面的方式嵌入视频:</p>
<ul>
<li>Without Html5 Video Support:<br />
[ videoplayer file="video/xxx.flv" /]</li>
<li>With Html5 Video Support:<br />
[ videoplayer file="video/xxx.(mp4, ogg, webm)" /]</li>
</ul>
<p>注意, 去掉&#8217;['后面的空格,但保留 '/]&#8216;前面的空格。具体效果，见<a href="http://blog.axqd.net/2010/02/05/nobody-but-you/" target="_blank">这里</a>。</p>
<p><strong>2. Photo Solution</strong></p>
<p>在WordPress的Plugins-&gt;Add New页面里搜索&#8221;<a href="http://wordpress.org/extend/plugins/nextgen-gallery/" target="_blank">NextGEN Gallery</a>&#8220;和&#8221;<a href="http://wordpress.org/extend/plugins/nextgen-monoslideshow/" target="_blank">NextGEN Monoslideshow</a>&#8220;，安装完成后，需要先下载相关SWF文件到&#8217;wp-content\uploads&#8217;，然后再激活。</p>
<p>需要下载的文件有：</p>
<ul>
<li>JW Image Rotator &#8211; 非商业用途，免费<br />
下载地址是这里：<a href="http://www.longtailvideo.com/players/jw-image-rotator/" target="_blank">http://www.longtailvideo.com/players/jw-image-rotator/</a><br />
解压缩后，释放imagerotator.swf文件到&#8217;wp-content\uploads&#8217;目录。</li>
<li>Mono Slideshow &#8211; 收费，25欧<br />
Demo地址：<a href="http://www.monoslideshow.com/demo" target="_blank">http://www.monoslideshow.com/demo</a><br />
需要的文件是monoslideshow.swf，同样需要释放到&#8217;wp-content\uploads&#8217;目录。<br />
如果你很邪恶或者你很穷困潦倒，欢迎使用google的filetype:swf，自行查找，大家共同鄙视之&#8230;<br />
小声说，最好的偷窃地方是<a href="http://nextgen-gallery.com/slideshow/nextgen-monoslideshow/" target="_blank">这里</a>。</li>
</ul>
<p>好了，最后配置一下路径：</p>
<ul>
<li>Gallery-&gt;Options-&gt;Slideshow下面的路径；</li>
<li>Gallery-&gt;Monoslideshow下面的路径；</li>
</ul>
<p>在Gallery里放好图片，获得Gallery的ID，你就可以开始插入图片了：</p>
<ul>
<li>基于JW Image Rotator的Slide show方式:<br />
[ slideshow id=2 ]</li>
<li>基于Mono Slideshow的Mono Slideshow方式:<br />
[ monoslideshow id=2 ]</li>
</ul>
<p>注意去掉&#8217;['后面和']&#8216;前面的空格，效果如下：（如果要指定长宽，请用w和h参数）</p>
<ul>
<li>Slide Show &#8211; 这种方式很实用，一定要试试全屏按钮，很震撼&#8230;<br />
[[Show as slideshow]]</li>
<li>Mono Slide Show &#8211; 这种方式有很多参数，特别是preset参数可以选择，具体请参考上面的<a href="http://www.monoslideshow.com/demo" target="_blank">Demo地址</a>和下面的附录，效果也很炫&#8230;<br />
<div class="monoslideshow">
<div class="swfobject" id="mo2_1" style="width:500px; height:375px;">
<p>The <a href="http://www.macromedia.com/go/getflashplayer">Flash Player</a> and <a href="http://www.mozilla.com/firefox/">a browser with Javascript support</a> are needed..</p>
</div></div>
<script type="text/javascript" defer="defer">
var mo2_1 = {
	params : {
		wmode : "transparent",
		allowfullscreen : "true"},
	flashvars : {
		showLogo : "false",
		showRegistration : "false",
		dataFile : "http%3A%2F%2Fblog.axqd.net%2Findex.php%3Fcallback%3Dmonoslideshow%26gid%3D2%26preset%3Dtv-swap"},
	attr : {
		bgColor : "#000000",
		styleclass : "slideshow",
		name : "so2"},
	start : function() {
		swfobject.embedSWF("http://blog.axqd.net/wp-content/uploads/monoslideshow.swf", "mo2_1", "500", "375", "7.0.0", false, this.flashvars, this.params , this.attr );
	}
}
mo2_1.start();
</script></li>
</ul>
<p>附：Mono Slideshow的preset参数：</p>
<ul>
<li> preset=&#8217;iris&#8217;</li>
<li> preset=&#8217;melt&#8217;</li>
<li>preset=&#8217; news-flash&#8217;</li>
<li>preset=&#8217; rgb-separation&#8217;</li>
<li>preset=&#8217; simple-focus-fade&#8217;</li>
<li>preset=&#8217; simple-shatter&#8217;</li>
<li>preset=&#8217; sparkles&#8217;</li>
<li>preset=&#8217; spot&#8217;</li>
<li>preset=&#8217; tv-swap&#8217;</li>
<li>preset=&#8217; widescreen&#8217;</li>
<li>preset=&#8217; white-water-drop&#8217;</li>
<li>preset=&#8217; wipe-3d&#8217;</li>
<li>preset=&#8217; zoom&#8217;</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.axqd.net/2010/07/17/video-and-photo-solution-on-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Steps to install mirrorrr and birdnest to GAE</title>
		<link>http://blog.axqd.net/2010/04/14/steps-to-install-mirrorrr-and-birdnest-to-gae/</link>
		<comments>http://blog.axqd.net/2010/04/14/steps-to-install-mirrorrr-and-birdnest-to-gae/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 04:53:41 +0000</pubDate>
		<dc:creator>axqd</dc:creator>
				<category><![CDATA[挨踢技术]]></category>
		<category><![CDATA[gfw]]></category>
		<category><![CDATA[google app engine]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.axqd.net/?p=889</guid>
		<description><![CDATA[Create a GAE application named &#8216;&#60;xxx&#62;-proxy&#8217;; @ https://appengine.google.com Download the GAE SDK and then unzip it; @ https://code.google.com/appengine/downloads.html svn checkout http://mirrorrr.googlecode.com/svn/trunk/ &#60;xxx&#62;-proxy Change application name to &#8216;&#60;xxx&#62;-proxy&#8217; and version to &#8217;1&#8242; in app.yaml file Delete index.yaml file appcfg.py update xxx-proxy 自己建一个是好习惯，表老抢别人的流量用，霍霍~~~ Updated: Steps to install Birdnest to GAE Create a GAE application named &#8216;&#60;xxx&#62;-twitter&#8217;; @ [...]]]></description>
			<content:encoded><![CDATA[<ol>
<li>Create a GAE application named &#8216;&lt;xxx&gt;-proxy&#8217;;<br />
@ https://appengine.google.com</li>
<li>Download the GAE SDK and then unzip it;<br />
@ https://code.google.com/appengine/downloads.html</li>
<li>svn checkout http://mirrorrr.googlecode.com/svn/trunk/ &lt;xxx&gt;-proxy</li>
<li>Change application name to &#8216;&lt;xxx&gt;-proxy&#8217; and version to &#8217;1&#8242; in app.yaml file</li>
<li>Delete index.yaml file</li>
<li>appcfg.py update xxx-proxy</li>
</ol>
<p>自己建一个是好习惯，表老抢别人的流量用，霍霍~~~</p>
<p><strong>Updated: Steps to install Birdnest to GAE</strong></p>
<ol>
<li>Create a GAE application named &#8216;&lt;xxx&gt;-twitter&#8217;;<br />
@ https://appengine.google.com</li>
<li>Download the GAE SDK and then unzip it;<br />
@ https://code.google.com/appengine/downloads.html</li>
<li> svn checkout http://birdnest.googlecode.com/svn/branches/gae/<br />
DO NOT USE TRUNK</li>
<li>Change application name to &#8216;&lt;xxx&gt;-twitter &#8216; in app.yaml file</li>
<li>Remove the following codes from code.py file.<br />
<blockquote><p>import socket<br />
import re<br />
ua = web.ctx.environ.get(&#8220;HTTP_USER_AGENT&#8221;, &#8216;None&#8217;)<br />
if ua.find(&#8216;jibjib) &gt;= 0:<br />
socket.setdefaulttimeout(60)<br />
elif ua.find(&#8216;zh-CN&#8217;) &gt;= 0:<br />
#raise Exception(&#8216;unknown error&#8217;)<br />
socket.setdefaulttimeout(2)<br />
else:<br />
socket.setdefaulttimeout(2)</p></blockquote>
</li>
<li>appcfg.py update xxx-twitter</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.axqd.net/2010/04/14/steps-to-install-mirrorrr-and-birdnest-to-gae/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Slice as a copy</title>
		<link>http://blog.axqd.net/2010/04/06/slice-as-a-copy/</link>
		<comments>http://blog.axqd.net/2010/04/06/slice-as-a-copy/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 14:55:53 +0000</pubDate>
		<dc:creator>axqd</dc:creator>
				<category><![CDATA[挨踢技术]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[slice]]></category>

		<guid isPermaLink="false">http://blog.axqd.net/?p=872</guid>
		<description><![CDATA[Fine, I have no choice, but to say I am an outman&#8230; I&#8217;ve no idea that python slice can be used as a copy of the original array, which, of course, can save us a tons of typing. Again, when I talked about slice, I mean array slice, not immutable/optimized string slice. &#62;&#62;&#62; a = [...]]]></description>
			<content:encoded><![CDATA[<p>Fine, I have no choice, but to say I am an outman&#8230; I&#8217;ve no idea that python slice can be used as a copy of the original array, which, of course, can save us a tons of typing.</p>
<p>Again, when I talked about slice, I mean array slice, not immutable/optimized string slice.</p>
<blockquote><p>&gt;&gt;&gt; a = [ 1, 2, 3 ]<br />
&gt;&gt;&gt; b = a[ : ]</p>
<p>&gt;&gt;&gt; id( a )<br />
12822008<br />
&gt;&gt;&gt; id( b )<br />
17547792</p>
<p>&gt;&gt;&gt; id( a[ 0 ] )<br />
505408872<br />
&gt;&gt;&gt; id( b[ 0 ] )<br />
505408872</p></blockquote>
<blockquote><p>&gt;&gt;&gt; a = &#8217;123&#8242;<br />
&gt;&gt;&gt; b = a[ : ]</p>
<p>&gt;&gt;&gt; id( a )<br />
12578656<br />
&gt;&gt;&gt; id( b )<br />
12578656</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.axqd.net/2010/04/06/slice-as-a-copy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Buzz in Chengdu</title>
		<link>http://blog.axqd.net/2010/02/11/google-buzz-in-chengdu/</link>
		<comments>http://blog.axqd.net/2010/02/11/google-buzz-in-chengdu/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 03:20:22 +0000</pubDate>
		<dc:creator>axqd</dc:creator>
				<category><![CDATA[WEB]]></category>
		<category><![CDATA[buzz]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://blog.axqd.net/?p=806</guid>
		<description><![CDATA[Buzz发布后的第二天一早，成都BUZZ分布图： Zoom zoom&#8230;]]></description>
			<content:encoded><![CDATA[<p>Buzz发布后的第二天一早，成都BUZZ分布图：</p>
<div id="attachment_807" class="wp-caption alignnone" style="width: 330px"><a href="http://blog.axqd.net/wp-content/uploads/2010/02/IMG_6616.png"><img src="http://blog.axqd.net/wp-content/uploads/2010/02/IMG_6616.png" alt="BUZZ in Chengdu" title="BUZZ in Chengdu" width="320" height="480" class="size-full wp-image-807" /></a><p class="wp-caption-text">BUZZ in Chengdu</p></div>
<p>Zoom zoom&#8230;</p>
<div id="attachment_808" class="wp-caption alignnone" style="width: 330px"><a href="http://blog.axqd.net/wp-content/uploads/2010/02/IMG_6615.png"><img src="http://blog.axqd.net/wp-content/uploads/2010/02/IMG_6615.png" alt="BUZZ in Chengdu" title="BUZZ in Chengdu" width="320" height="480" class="size-full wp-image-808" /></a><p class="wp-caption-text">BUZZ in Chengdu</p></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.axqd.net/2010/02/11/google-buzz-in-chengdu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BASH取得脚本所在路径</title>
		<link>http://blog.axqd.net/2009/12/22/get-script-path-in-bash/</link>
		<comments>http://blog.axqd.net/2009/12/22/get-script-path-in-bash/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 09:08:11 +0000</pubDate>
		<dc:creator>axqd</dc:creator>
				<category><![CDATA[自由世界]]></category>
		<category><![CDATA[bash]]></category>

		<guid isPermaLink="false">http://blog.axqd.net/?p=758</guid>
		<description><![CDATA[脚本所在路径通常来说，比pwd好用得多。以前，总是直接dirname $0，或者在perl里从__FILE__里取。今天又要写这个，看恶心了，想起bash自己就能做这种事情，但不记得语法了。于是google了一下&#8221;bash string manipulate&#8221;。 果然很好很强大：http://tldp.org/LDP/abs/html/string-manipulation.html 用得上的是这段： ${string%substring} Deletes shortest match of $substring from back of $string. 于是${0%/*}把末尾&#8217;/'以后的全删掉就行了。 当然，这是相对于pwd的路径，不过已经够用了。]]></description>
			<content:encoded><![CDATA[<p>脚本所在路径通常来说，比pwd好用得多。以前，总是直接dirname $0，或者在perl里从__FILE__里取。今天又要写这个，看恶心了，想起bash自己就能做这种事情，但不记得语法了。于是google了一下&#8221;bash string manipulate&#8221;。</p>
<p>果然很好很强大：<a href="http://tldp.org/LDP/abs/html/string-manipulation.html">http://tldp.org/LDP/abs/html/string-manipulation.html</a></p>
<p>用得上的是这段：<br />
${string%substring}<br />
Deletes shortest match of $substring from back of $string.</p>
<p>于是${0%/*}把末尾&#8217;/'以后的全删掉就行了。<br />
当然，这是相对于pwd的路径，不过已经够用了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.axqd.net/2009/12/22/get-script-path-in-bash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web 2.0之流毒</title>
		<link>http://blog.axqd.net/2009/11/28/lick/</link>
		<comments>http://blog.axqd.net/2009/11/28/lick/#comments</comments>
		<pubDate>Sat, 28 Nov 2009 12:01:47 +0000</pubDate>
		<dc:creator>axqd</dc:creator>
				<category><![CDATA[WEB]]></category>
		<category><![CDATA[omytime]]></category>

		<guid isPermaLink="false">http://blog.axqd.net/?p=753</guid>
		<description><![CDATA[好吧，国人有了推、咪咪、土豆、豆瓣。但是作为一个挺有爱的网站，实在不知为何非要搞成这样&#8230; 1. OhMyTime要译成&#8230; 2. 我舔&#8230; 3. 舔后还要有感&#8230;]]></description>
			<content:encoded><![CDATA[<p>好吧，国人有了推、咪咪、土豆、豆瓣。但是作为一个<a href="http://www.omytime.com/">挺有爱的网站</a>，实在不知为何非要搞成这样&#8230;</p>
<p>1. OhMyTime要译成&#8230;</p>
<div id="attachment_755" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.axqd.net/wp-content/uploads/2009/11/1.JPG"><img class="size-medium wp-image-755" title="Oh my God" src="http://blog.axqd.net/wp-content/uploads/2009/11/1-300x196.jpg" alt="Oh my God" width="300" height="196" /></a><p class="wp-caption-text">Oh my God</p></div>
<p>2. 我舔&#8230;</p>
<div id="attachment_756" class="wp-caption alignnone" style="width: 128px"><a href="http://blog.axqd.net/wp-content/uploads/2009/11/2.JPG"><img class="size-full wp-image-756" title="舔" src="http://blog.axqd.net/wp-content/uploads/2009/11/2.JPG" alt="舔" width="118" height="82" /></a><p class="wp-caption-text">舔</p></div>
<p>3. 舔后还要有感&#8230;</p>
<div id="attachment_754" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.axqd.net/wp-content/uploads/2009/11/3.JPG"><img class="size-medium wp-image-754" title="舔后感" src="http://blog.axqd.net/wp-content/uploads/2009/11/3-300x69.jpg" alt="舔后感" width="300" height="69" /></a><p class="wp-caption-text">舔后感</p></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.axqd.net/2009/11/28/lick/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Notes from &#8220;Systems that never stop&#8221; by Joe Armstrong</title>
		<link>http://blog.axqd.net/2009/10/31/infoq-notes/</link>
		<comments>http://blog.axqd.net/2009/10/31/infoq-notes/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 04:46:53 +0000</pubDate>
		<dc:creator>axqd</dc:creator>
				<category><![CDATA[挨踢技术]]></category>
		<category><![CDATA[InfoQ]]></category>
		<category><![CDATA[Joe Armstrong]]></category>

		<guid isPermaLink="false">http://blog.axqd.net/?p=750</guid>
		<description><![CDATA[1. isolation; 2. concurrency &#8211; built in programming language instead of operating system; 3. must detect failures &#8211; must work across machine boundaries; 4. failure identification; 5. live code upgrade &#8211; for post hock debugging; 6. stable storage; 不知道为什么，一直挺喜欢Joe Armstrong的讲座，虽然每次都是差不多的内容。可能是因为他的声音很有特色，非常的comedy]]></description>
			<content:encoded><![CDATA[<p>1. isolation;<br />
2. concurrency &#8211; built in programming language instead of operating system;<br />
3. must detect failures &#8211; must work across machine boundaries;<br />
4. failure identification;<br />
5. live code upgrade &#8211; for post hock debugging;<br />
6. stable storage;</p>
<p>不知道为什么，一直挺喜欢Joe Armstrong的讲座，虽然每次都是差不多的内容。可能是因为他的声音很有特色，非常的comedy <img src='http://blog.axqd.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.axqd.net/2009/10/31/infoq-notes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一根黄瓜</title>
		<link>http://blog.axqd.net/2009/10/23/cucumber/</link>
		<comments>http://blog.axqd.net/2009/10/23/cucumber/#comments</comments>
		<pubDate>Fri, 23 Oct 2009 14:15:37 +0000</pubDate>
		<dc:creator>axqd</dc:creator>
				<category><![CDATA[挨踢技术]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[DSL]]></category>
		<category><![CDATA[易语言]]></category>

		<guid isPermaLink="false">http://blog.axqd.net/?p=741</guid>
		<description><![CDATA[# language: zh-CN 功能:加法 为了避免一些愚蠢的错误 作为一个数学白痴 我希望有人告诉我数字相加的结果 场景: 两个数相加 假如我已经在计算器里输入6 而且我已经在计算器里输入7 当我按相加按钮 那么我应该在屏幕上看到的结果是13 第一眼，Cucumber， 嗯， 不错&#8230;但是突然，想起一个怪物， 易语言，身躯一震： .版本 2 .子程序 _编辑框1_内容被改变 .如果真 (取文本长度 (编辑框1.内容) ＝ 2) 编辑框2.获取焦点 () .如果真结束 复又觉得，如果仅局限于配置文件，尚可接受&#8230; 复又觉得，DSL已然模糊了二者的界限&#8230; 复又觉得，区别在于是LL parse抑或Regular parse&#8230; 复又觉得，区别在于复杂程度&#8230; 好吧，最后觉得，自己是个白痴&#8230;]]></description>
			<content:encoded><![CDATA[<p># language: zh-CN<br />
功能:加法<br />
为了避免一些愚蠢的错误<br />
作为一个数学白痴<br />
我希望有人告诉我数字相加的结果</p>
<p>场景: 两个数相加<br />
假如我已经在计算器里输入6<br />
而且我已经在计算器里输入7<br />
当我按相加按钮<br />
那么我应该在屏幕上看到的结果是13</p>
<p><strong>第一眼，Cucumber， 嗯， 不错&#8230;但是突然，想起一个怪物， 易语言，身躯一震：</strong></p>
<p>.版本 2<br />
.子程序 _编辑框1_内容被改变<br />
.如果真 (取文本长度 (编辑框1.内容) ＝ 2)<br />
编辑框2.获取焦点 ()<br />
.如果真结束</p>
<p><strong>复又觉得，如果仅局限于配置文件，尚可接受&#8230;<br />
复又觉得，DSL已然模糊了二者的界限&#8230;</p>
<p>复又觉得，区别在于是LL parse抑或Regular parse&#8230;<br />
复又觉得，区别在于复杂程度&#8230;</p>
<p>好吧，最后觉得，自己是个白痴&#8230;</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.axqd.net/2009/10/23/cucumber/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Camtasia Studio 6</title>
		<link>http://blog.axqd.net/2009/10/17/camtasia-studio-6/</link>
		<comments>http://blog.axqd.net/2009/10/17/camtasia-studio-6/#comments</comments>
		<pubDate>Sat, 17 Oct 2009 15:44:27 +0000</pubDate>
		<dc:creator>axqd</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Camtasia Stuidio]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://blog.axqd.net/?p=737</guid>
		<description><![CDATA[下周要负责录一个内部产品的Tutorial，于是先行用Camtasia Studio来录了一个测试教程，还是蛮好用的。 缺点有: Smart Focus显得移动过于频繁； 生成Flash预加载缓冲内容过多，将近5%；（不知有没有配置选项） 机器embeded的话筒录下来，感觉完全是另外一个人的声音； 突然发现，&#8221;嗯啊哈&#8221;的，如此之多，呵呵。 附测试结果：【教程整个很白痴，纯粹测试性质】 http://www.axqd.net/hotkey/ for Hotkey Power on http://www.axqd.net/ PS: 工作后真是没法坚持定期写Blog了，一切随缘吧，想起了又无事，就多写几篇。]]></description>
			<content:encoded><![CDATA[<p>下周要负责录一个内部产品的Tutorial，于是先行用Camtasia Studio来录了一个测试教程，还是蛮好用的。</p>
<p>缺点有:</p>
<p>Smart Focus显得移动过于频繁；</p>
<p>生成Flash预加载缓冲内容过多，将近5%；（不知有没有配置选项）</p>
<p>机器embeded的话筒录下来，感觉完全是另外一个人的声音；</p>
<p>突然发现，&#8221;嗯啊哈&#8221;的，如此之多，呵呵。</p>
<p>附测试结果：【教程整个很白痴，纯粹测试性质】</p>
<p><a href="http://www.axqd.net/hotkey/">http://www.axqd.net/hotkey/</a> for Hotkey Power on <a href="http://www.axqd.net/">http://www.axqd.net/</a></p>
<p>PS: 工作后真是没法坚持定期写Blog了，一切随缘吧，想起了又无事，就多写几篇。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.axqd.net/2009/10/17/camtasia-studio-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Code Jam 2009 (Qualification)</title>
		<link>http://blog.axqd.net/2009/09/04/google-code-jam-2009-qualification/</link>
		<comments>http://blog.axqd.net/2009/09/04/google-code-jam-2009-qualification/#comments</comments>
		<pubDate>Fri, 04 Sep 2009 02:41:07 +0000</pubDate>
		<dc:creator>axqd</dc:creator>
				<category><![CDATA[挨踢技术]]></category>
		<category><![CDATA[google code jam]]></category>

		<guid isPermaLink="false">http://blog.axqd.net/?p=714</guid>
		<description><![CDATA[书接上篇 1. [84%/84%] Alien Language：给定pattern，求辞典中满足pattern的词的个数。 这道题，题目吓一跳，以为是和practise一样的，结果是另外一道。 内容再次吓一跳，perl代码简单到爆。直接把&#8217;(&#8216;、&#8217;)'换成&#8217;['、']&#8216;，当作字符类编译成正则，然后挨个匹配计数就行了。 2. [88%/86%] Watersheds：给定地图和高度，求有几个水凼凼。 这道题遍历每个cell，判断水流，由链表确定等价类，最后从小到大标号既可。 3. [88%/56%] Welcome to Code Jam：给定目标，求子串。 这道题一看，大量操作单个字符，选c会比perl有优势，所以用c。 简单的动态规划即可，有大量重复子问题。当前text中包含target的数量，等于当前text中，所有的target[0]其后的子串，所包含的target[1~end]的数量之和。 由于结果只需要4位，所以用int表示结果已经足够，计数的时候，超过9999，则减去10000。 可惜这道题的大数据集，我还是超时了，因为小数据集我time了一下，只用了0.001s，所以偷懒了一下，没有加缓存，准备直接用机器硬抗大数据集，等了近5分钟，居然还没算出结果，这时再更改程序加缓存、编译、上传就来不及了。 加入4行代码的缓存之后，大数据集time结果如下： real    0m0.031s user   0m0.028s sys    0m0.000s 不到0.1s，很难想像加入缓存会有如此大的区别，真是遇鬼了。 GCJ 2009 Qualification Solution Download]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.axqd.net/2009/08/30/google-code-jam-2009-practise/">书接上篇</a></p>
<p>1. [84%/84%] Alien Language：给定pattern，求辞典中满足pattern的词的个数。</p>
<p>这道题，题目吓一跳，以为是和practise一样的，结果是另外一道。</p>
<p>内容再次吓一跳，perl代码简单到爆。直接把&#8217;(&#8216;、&#8217;)'换成&#8217;['、']&#8216;，当作字符类编译成正则，然后挨个匹配计数就行了。</p>
<p>2. [88%/86%] Watersheds：给定地图和高度，求有几个水凼凼。</p>
<p>这道题遍历每个cell，判断水流，由链表确定等价类，最后从小到大标号既可。</p>
<p>3. [88%/56%] Welcome to Code Jam：给定目标，求子串。</p>
<p>这道题一看，大量操作单个字符，选c会比perl有优势，所以用c。</p>
<p>简单的动态规划即可，有大量重复子问题。当前text中包含target的数量，等于当前text中，所有的target[0]其后的子串，所包含的target[1~end]的数量之和。</p>
<p>由于结果只需要4位，所以用int表示结果已经足够，计数的时候，超过9999，则减去10000。</p>
<p>可惜这道题的大数据集，我还是超时了，因为小数据集我time了一下，只用了0.001s，所以偷懒了一下，没有加缓存，准备直接用机器硬抗大数据集，等了近5分钟，居然还没算出结果，这时再更改程序加缓存、编译、上传就来不及了。</p>
<p>加入4行代码的缓存之后，大数据集time结果如下：</p>
<p>real    0m0.031s<br />
user   0m0.028s<br />
sys    0m0.000s</p>
<p>不到0.1s，很难想像加入缓存会有如此大的区别，真是遇鬼了。</p>
<p><a href="http://blog.axqd.net/wp-content/uploads/2009/09/GCJ-2009-Qualification.zip">GCJ 2009 Qualification Solution Download</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.axqd.net/2009/09/04/google-code-jam-2009-qualification/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Google Code Jam 2009 (Practise)</title>
		<link>http://blog.axqd.net/2009/08/30/google-code-jam-2009-practise/</link>
		<comments>http://blog.axqd.net/2009/08/30/google-code-jam-2009-practise/#comments</comments>
		<pubDate>Sun, 30 Aug 2009 04:41:34 +0000</pubDate>
		<dc:creator>axqd</dc:creator>
				<category><![CDATA[挨踢技术]]></category>
		<category><![CDATA[algorithm]]></category>
		<category><![CDATA[google code jam]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://blog.axqd.net/?p=700</guid>
		<description><![CDATA[去年做了做Google Code Jam的入围题，挺好玩的。今年早早的就收到了邮件，并且还附上了四道练习题。 1. [74%/80%] Alien Number：给定源语言以及目标语言，要求翻译一个数字。 这题按最自然的思路就行了。为方便起见，把源数字先转换成十进制，然后再用和十进制转二进制相同的辗转相除法，求得目标数字的表示。 2. [80%/84%] Always Turn Left：给定总是左转的规则及实际路线，要求实际的迷宫。 如果你身陷迷宫，“总是左转”的规则，或者说“手不离墙，摸着墙走”的规则，兴许能救你一命。 其实，这道题中，我们能得到的所有讯息，都在来回走的路径里面。所以只要跟着路径实际来回走一遍，并沿路，总结迷宫信息，最后得到的便是整个迷宫。 对于左右转及方向的表示，一堆if-else，时空都坏；归纳到一个表里面查表，空间效率也不高；其实就四个方向，如果NESW分别表示为0123的话，简单的加减取模，就能实现左右转了。至于walk through的坐标处理，选择一个简单的闭包最为理想。 另外，在处理路径的时候，维护一个x、y坐标的最大、最小值，以便于最后输出迷宫。 在输出迷宫的时候，不用先存储那张转换表，而直接把YES当成1，NO当成0，作为4位的二进制数，再表示为16进制，刚好就是那张表。 ==== 从题目前括号里表示的人们的成功率上来看，前两题比较简单，后两题比较困难 ==== 3. [68%/49%] Egg Drop：给定某个可解扔蛋问题的三个参量，在保持可解的情况下，求每个参量的极大值或极小值 这道题有很自然的思路，那便是Fmax的递推式： 设想现在在第 i 层扔蛋，那么第 i 层扔了，就能确定状态，因此本身算一层 ( 1 )； 如果蛋没碎，往上验，最多还能验F( D – 1, B )层[ 因为第 i 层扔了一次，D减1；蛋没碎，B不变 ]； 如果蛋碎了，往下验，最多还能验F( D – 1, B – 1 )层[ 因为第 i [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.axqd.net/2008/07/18/google-code-jam-2008/" target="_blank">去年做了做Google Code Jam的入围题</a>，挺好玩的。今年早早的就收到了邮件，并且还附上了四道练习题。</p>
<p>1. [74%/80%] Alien Number：给定源语言以及目标语言，要求翻译一个数字。</p>
<p>这题按最自然的思路就行了。为方便起见，把源数字先转换成十进制，然后再用和十进制转二进制相同的辗转相除法，求得目标数字的表示。</p>
<p>2. [80%/84%] Always Turn Left：给定总是左转的规则及实际路线，要求实际的迷宫。</p>
<p>如果你身陷迷宫，“总是左转”的规则，或者说“手不离墙，摸着墙走”的规则，兴许能救你一命。</p>
<p>其实，这道题中，我们能得到的所有讯息，都在来回走的路径里面。所以只要跟着路径实际来回走一遍，并沿路，总结迷宫信息，最后得到的便是整个迷宫。</p>
<p>对于左右转及方向的表示，一堆if-else，时空都坏；归纳到一个表里面查表，空间效率也不高；其实就四个方向，如果NESW分别表示为0123的话，简单的加减取模，就能实现左右转了。至于walk through的坐标处理，选择一个简单的闭包最为理想。</p>
<p>另外，在处理路径的时候，维护一个x、y坐标的最大、最小值，以便于最后输出迷宫。</p>
<p>在输出迷宫的时候，不用先存储那张转换表，而直接把YES当成1，NO当成0，作为4位的二进制数，再表示为16进制，刚好就是那张表。</p>
<p>==== 从题目前括号里表示的人们的成功率上来看，前两题比较简单，后两题比较困难 ====</p>
<p>3. [68%/49%] Egg Drop：给定某个可解扔蛋问题的三个参量，在保持可解的情况下，求每个参量的极大值或极小值</p>
<p>这道题有很自然的思路，那便是Fmax的递推式：</p>
<p>设想现在在第 i 层扔蛋，那么第 i 层扔了，就能确定状态，因此本身算一层 ( 1 )；<br />
如果蛋没碎，往上验，最多还能验F( D – 1, B )层[ 因为第 i 层扔了一次，D减1；蛋没碎，B不变 ]；<br />
如果蛋碎了，往下验，最多还能验F( D – 1, B – 1 )层[ 因为第 i 层扔了一次，D减1；蛋碎了，B也减1 ]。</p>
<p>由于每次验证，蛋只能处于碎或不碎状态中的一种，所以二者并不互相影响。故：</p>
<p>F(D, B) = 1 + F( D – 1, B ) + F( D – 1, B – 1 )</p>
<p>接下来如何计算这个递推式，是个问题。如果这个问题解决了，那么要找到最小的D和B，直接查表既可。</p>
<p>容易看出，递推式中有大量重复的子问题，动态规划应该效果不错。不过，我们还是先来看看数据膨胀速度如何：</p>
<p>[B]<br />
1 3 7 15<br />
1 3 7 14<br />
1 3 6 10<br />
1 2 3 4   [D]</p>
<p>左上部分不用计算，就是对角线上的数字，因为能打碎的数量，如果超过总的实验次数，多出来的这部分就没意义了。故：</p>
<p>F( D, B ) = F( D, D ) if( B &gt; D )</p>
<p>直接观察对角线上的数字，容易看出，对角线上的数字为 2^D &#8211; 1。</p>
<p>即使没有看出来，也可以推出来。只用由F(D, B)的递推式和上面B&gt;D的性质，得出递推式 A(n)=2A(n-1)+1，并求解既可。</p>
<p>由此可见，这张表的数字膨胀速度相当快(2^n)。因此，我们得充分利用一个很不起眼的条件，那便是F有2^32的大小限制。</p>
<p>B再大，在应用上面B&gt;D的性质后，也不会超过32。整张表的纵向高度就限制得很小了。</p>
<p>但整张表的横向高度依然可以很大，比如F( 2000000000, 1 )，这种情况即使动态规划会很吃苦头。</p>
<p>观察每一列，都是从 D ~ (2 ^ D – 1)，之间的每个数的差值，刚好是杨辉三角。</p>
<p>1&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;0<br />
1          1&#8212;&#8212;&#8212;&#8212;-1<br />
1          2       1&#8212;&#8212;&#8212;&#8211;2<br />
1        3         3        1&#8212;&#8212;-3<br />
1        4         6        4        1&#8212;-4<br />
0Cr4 1Cr4 2Cr4 3Cr4 4Cr4</p>
<p>15 – 1 = 14<br />
14 – 4 = 10<br />
10 – 6 = 4</p>
<p>所以，从D开始往上累加各个组合数，既可得出某一位的值。而这个累加过程，一旦大于2 ^ 32便可退出。</p>
<p>算出了Fmax，Bmin可以直接挨个找，因为表的纵向高度有限。而Dmin，则需要一个简单的折半查找，以应对F( 2000000000, 1 )类似的情况。</p>
<p>4. [64%/31%] Shopping Plan：给定商店、油费和要买的东西，求最低花费</p>
<p>31%的大数据集通过率，可见这道题的时间或者空间复杂度比较高。</p>
<p>这道题乍看之下，容易让人想起Dijkstra算法[<a href="http://www.people.com.cn/GB/it/48/298/20020917/824179.html" target="_blank">王选貌似还谈论过Dijkstra这个人</a>]。但我很难想到简单的一个数，来指征当前选择的优劣。因为要考虑的因素，实在很多，离家的远近、当前购买物的价格、路径、还有买了是否需要立刻回家等等。</p>
<p>另外，最优子结构的寻找，也颇为困难。因为容易理解，买abcd的最佳路径不一定包括买abc的最优路径。</p>
<p>在这种情况下，我们不得不增强条件。我们以a. 从某个商店出发，b. 买完某些商品，c. 并且当前是否需要回家为基准计算最小值。</p>
<p>这里面依然可以看出，有大量的重复子问题，可以动态规划。</p>
<p>我们遍历当前商店里能买到的并且当前需要购买的商品，买之，然后再遍历所有商店作为下一个商店，并且考虑当前买的商品是否需要立刻放回家。如果已经买完了，则立刻回家。</p>
<p>这里有一个想法很诱惑，那便是走过的商店便不需要再走。因为非perishable的商品始终能顺带带走，perishable的商品始终要立刻回家，也不需要第二次光顾来买。所以，如果以空间换时间，在过程中排除掉某些商店，效果应该不错。但再仔细想想就会发现，这里的空间开销很大，即使用bit set，也需要2 ^50。而所换来的时间并不多，因为我们依然得处理这个比特集。</p>
<p>这样实现的一个perl脚本的性能如下：</p>
<p>[小数据集 100 cases] &#8211; 工作很好</p>
<p>real  0m0.297s<br />
user 0m0.260s<br />
sys  0m0.040s</p>
<p>[大数据集 20 cases] &#8211; 严重超时</p>
<p>real   35m4.110s<br />
user  34m20.661s<br />
sys    0m42.387s</p>
<p>0.297s已经是对perl脚本做性能调校之后的结果，所以不更改算法或者更改编程语言，很难有所提高了。这里我选择了后面一种方式，用纯C实现了一个相同的算法：</p>
<p>由于perl处理文本始终还是方便很多，所以先用preprocess.pl脚本把input文本解析为利于C解析的格式。[这里是每行一个数字，并处理掉商品名称]</p>
<p>然后用纯C的程序读入处理后的文本，并输出，[ $gcc –O3 run.c –lm ]下面是一些性能数据：</p>
<p>[小数据集 100 cases]</p>
<p>real    0m0.223s<br />
user   0m0.220s<br />
sys    0m0.004s</p>
<p>完全没有缓存的版本，已然比perl的要好，接下来为算路费的函数添加缓存：</p>
<p>real    0m0.128s<br />
user   0m0.124s<br />
sys    0m0.004s</p>
<p>再为递归函数添加缓存：</p>
<p>real    0m0.004s<br />
user   0m0.004s<br />
sys    0m0.000s</p>
<p>这里就已经相当理想了，可以预见大数据集性能也不会差。</p>
<p>[大数据集 20 cases]</p>
<p>real    0m16.551s<br />
user   0m16.501s<br />
sys    0m0.048s</p>
<p>16s，算是很完美的性能了。同样的算法，动态脚本和纯C还是没法比啊，呵呵。即使在极限情况，50个商店，15个待购商品的case，也能在0m12.260s内解决。</p>
<p><a href="http://blog.axqd.net/wp-content/uploads/2009/08/GCJ-2009-Practise.zip">GCJ 2009 Practise Solution Download</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.axqd.net/2009/08/30/google-code-jam-2009-practise/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Oh&#8230;Twitter</title>
		<link>http://blog.axqd.net/2009/08/10/ohtwitter/</link>
		<comments>http://blog.axqd.net/2009/08/10/ohtwitter/#comments</comments>
		<pubDate>Mon, 10 Aug 2009 08:08:38 +0000</pubDate>
		<dc:creator>axqd</dc:creator>
				<category><![CDATA[WEB]]></category>
		<category><![CDATA[gfw]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.axqd.net/2009/08/10/ohtwitter/</guid>
		<description><![CDATA[云南真是避暑胜地，闭关一周安安静静看看书，其实也挺不错的。 言归正传，一直以来因为公司提供了很多VPN，所以也没有特别关注翻墙的问题。但今天突然发现博客首页的flash twitter插件没法用了。所以干脆就直接换成javascript的，然后开始翻墙。 翻墙基本原理是拿我这台博客服务器做代理，php不太熟，其间还google了一下“php if statement”： http://blog.axqd.net/wp-content/themes/emplode/axqd.php?callback=TWTR.Widget.receiveCallback&#38;count=50&#38;since_id=2769255170&#38;clientsource=TWITTERINC_WIDGET &#60;?php if( $_GET[ 'since_id' ] &#38;&#38; preg_match( &#8216;/^[0-9]+$/&#8217;, $_GET[ 'since_id' ] ) ) &#160; echo file_get_contents(&#34;http://twitter.com/statuses/user_timeline/axqd.json?callback=TWTR.Widget.receiveCallback&#38;count=50&#38;clientsource=TWITTERINC_WIDGET&#38;since_id=&#34;.$_GET[ 'since_id' ]); else &#160; echo file_get_contents(&#34;http://twitter.com/statuses/user_timeline/axqd.json?callback=TWTR.Widget.receiveCallback&#38;count=50&#38;clientsource=TWITTERINC_WIDGET&#34;); ?&#62; 搞定之后，可以选择自己处理这个json对象。不过既然已经有现成的，为什么不用呢？于是比照博客皮肤，在twitter官方配色了一个JS版本的client。 接下来转换资源地址有点麻烦： 先啃容易的骨头，VPN出去，下载相应的静态资源，比如style sheet，js file，还有几个png、gif啥的，然后修改其中一些资源里面的引用地址，再通通一股脑传到服务器上。 接下来改js文件，可惜的是，这个js文件是混淆过的，也不太知道怎么还原。好在混淆器大多像下面这样，在后面搞得像是符号表似的： &#8216;&#124;&#124;&#124;&#124;this&#124;function&#124;return&#124;&#124;if&#124;var&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;&#124;twtr&#124;false&#124;div&#124;id&#124;else&#124;true&#124;tweet&#124;&#124;user&#124;class&#124;net&#124;http&#124;call&#124;results…&#8217; 我试着替换其中某些字符串，在本地多尝试几遍，居然找到一个可用的替换。 当然这种方式也有不太爽的地方，细心的你会发现到twitter.com的链接全都被换成了blog.axqd.net。:P 不过反正放这个插件的目的在于展示，而不在于收集reply，所以也就懒得处理这个问题了，呵呵。]]></description>
			<content:encoded><![CDATA[<p>云南真是避暑胜地，闭关一周安安静静看看书，其实也挺不错的。</p>
<p>言归正传，一直以来因为公司提供了很多VPN，所以也没有特别关注翻墙的问题。但今天突然发现博客首页的flash twitter插件没法用了。所以干脆就直接换成javascript的，然后开始翻墙。</p>
<p>翻墙基本原理是拿我这台博客服务器做代理，php不太熟，其间还google了一下“php if statement”：</p>
<p><u>http://blog.axqd.net/wp-content/themes/emplode/axqd.php?callback=TWTR.Widget.receiveCallback&amp;count=50&amp;since_id=2769255170&amp;clientsource=TWITTERINC_WIDGET</u></p>
<p>&lt;?php    <br />if( $_GET[ 'since_id' ] &amp;&amp; preg_match( &#8216;/^[0-9]+$/&#8217;, $_GET[ 'since_id' ] ) )     <br />&#160; echo file_get_contents(<u>&quot;http://twitter.com/statuses/user_timeline/axqd.json?callback=TWTR.Widget.receiveCallback&amp;count=50&amp;clientsource=TWITTERINC_WIDGET&amp;since_id=&quot;.$_GET[ 'since_id' ]</u>);     <br />else     <br />&#160; echo file_get_contents(<u>&quot;http://twitter.com/statuses/user_timeline/axqd.json?callback=TWTR.Widget.receiveCallback&amp;count=50&amp;clientsource=TWITTERINC_WIDGET&quot;</u>);     <br />?&gt;</p>
<p>搞定之后，可以选择自己处理这个json对象。不过既然已经有现成的，为什么不用呢？于是比照博客皮肤，在twitter官方配色了一个JS版本的client。</p>
<p>接下来转换资源地址有点麻烦：</p>
<p>先啃容易的骨头，VPN出去，下载相应的静态资源，比如style sheet，js file，还有几个png、gif啥的，然后修改其中一些资源里面的引用地址，再通通一股脑传到服务器上。</p>
<p>接下来改js文件，可惜的是，这个js文件是混淆过的，也不太知道怎么还原。好在混淆器大多像下面这样，在后面搞得像是符号表似的：</p>
<p>&#8216;||||this|function|return||if|var||||||||||||||||||||||||||||||||||||||twtr|false|div|id|else|true|tweet||user|class|net|http|call|results…&#8217;</p>
<p>我试着替换其中某些字符串，在本地多尝试几遍，居然找到一个可用的替换。</p>
<p>当然这种方式也有不太爽的地方，细心的你会发现到twitter.com的链接全都被换成了blog.axqd.net。:P</p>
<p>不过反正放这个插件的目的在于展示，而不在于收集reply，所以也就懒得处理这个问题了，呵呵。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.axqd.net/2009/08/10/ohtwitter/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ESXi Update 2&#8230;囧rz</title>
		<link>http://blog.axqd.net/2009/02/03/esxi-update-2/</link>
		<comments>http://blog.axqd.net/2009/02/03/esxi-update-2/#comments</comments>
		<pubDate>Tue, 03 Feb 2009 09:44:04 +0000</pubDate>
		<dc:creator>axqd</dc:creator>
				<category><![CDATA[挨踢技术]]></category>

		<guid isPermaLink="false">http://blog.axqd.net/?p=530</guid>
		<description><![CDATA[ESXi Update 2真的让人郁闷，安装的时候硬盘驱动就有够费事的了。 这下想升Update 3，备份个镜像也麻烦死人。 本来挺好用的Datastore Browser，一传大文件就报&#8217;I/O error occurred&#8217;。 官网上看到有新版本的VI Client，懒得查release notes，直接升级。 结果VI Updater又有问题，总是croak &#8216;no update available&#8217;。 手动下patch包：http://support.vmware.com/selfsupport/download/ Self Support，网址ZTMD取得好。郁闷的是，升级后，VI Client问题依旧。 网上又说可以开ESXi Server的SSH daemon，结果拜我升级所赐，SSH和FTP也没有了。 算了，还算以前看到一篇文章，提到过ESXi Datastore的Web Access： https://(ip address)/folder?dcPath=ha-datacenter&#38;dsName=datastore1 于是cygwin + wget解决问题(WGet for Windows居然还不支持带用户名、密码的URL 囧rz&#8230;)： wget -m &#8211;no-check-certificate https://(username):(passwd)@(ip address)/folder?dcPath=ha-datacenter&#38;dsName=datastore1 最后有点小插曲，就是URL Encode，由于密码里用了&#8217;@'，所以不转成%40会有歧义： SPACE %20 [ %5B &#60; %3C ] %5D &#62; %3E ` %60 # [...]]]></description>
			<content:encoded><![CDATA[<p>ESXi Update 2真的让人郁闷，安装的时候硬盘驱动就有够费事的了。<br />
这下想升Update 3，备份个镜像也麻烦死人。</p>
<p>本来挺好用的Datastore Browser，一传大文件就报&#8217;I/O error occurred&#8217;。<br />
官网上看到有新版本的VI Client，懒得查release notes，直接升级。<br />
结果VI Updater又有问题，总是croak &#8216;no update available&#8217;。<br />
手动下patch包：<a title="VMWare Self Support" href="http://support.vmware.com/selfsupport/download/">http://support.vmware.com/selfsupport/download/</a><br />
Self Support，网址ZTMD取得好。郁闷的是，升级后，VI Client问题依旧。</p>
<p>网上又说可以开ESXi Server的SSH daemon，结果拜我升级所赐，SSH和FTP也没有了。</p>
<p>算了，还算以前看到一篇文章，提到过ESXi Datastore的Web Access：</p>
<p><span style="text-decoration: underline;">https://(ip address)/folder?dcPath=ha-datacenter&amp;dsName=datastore1</span></p>
<p>于是cygwin + wget解决问题(WGet for Windows居然还不支持带用户名、密码的URL 囧rz&#8230;)：</p>
<p>wget -m &#8211;no-check-certificate <span style="text-decoration: underline;">https://(username):(passwd)@(ip address)/folder?dcPath=ha-datacenter&amp;dsName=datastore1</span></p>
<p>最后有点小插曲，就是URL Encode，由于密码里用了&#8217;@'，所以不转成%40会有歧义：</p>
<table border="0">
<tbody>
<tr>
<td style="width: 25%;">SPACE</td>
<td style="width: 25%;">%20</td>
<td style="width: 25%;">[</td>
<td style="width: 25%;">%5B</td>
</tr>
<tr>
<td>&lt;</td>
<td>%3C</td>
<td>]</td>
<td>%5D</td>
</tr>
<tr>
<td>&gt;</td>
<td>%3E</td>
<td>`</td>
<td>%60</td>
</tr>
<tr>
<td>#</td>
<td>%23</td>
<td>;</td>
<td>%3B</td>
</tr>
<tr>
<td>%</td>
<td>%25</td>
<td>/</td>
<td>%2F</td>
</tr>
<tr>
<td>{</td>
<td>%7B</td>
<td>?</td>
<td>%3F</td>
</tr>
<tr>
<td>}</td>
<td>%7D</td>
<td>:</td>
<td>%3A</td>
</tr>
<tr>
<td>|</td>
<td>%7C</td>
<td>@</td>
<td>%40</td>
</tr>
<tr>
<td>\</td>
<td>%5C</td>
<td>=</td>
<td>%3D</td>
</tr>
<tr>
<td>^</td>
<td>%5E</td>
<td>&amp;</td>
<td>%26</td>
</tr>
<tr>
<td>~</td>
<td>%7E</td>
<td>$</td>
<td>%24</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://blog.axqd.net/2009/02/03/esxi-update-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Beautiful Code</title>
		<link>http://blog.axqd.net/2009/01/30/beautiful-code/</link>
		<comments>http://blog.axqd.net/2009/01/30/beautiful-code/#comments</comments>
		<pubDate>Fri, 30 Jan 2009 04:36:09 +0000</pubDate>
		<dc:creator>axqd</dc:creator>
				<category><![CDATA[挨踢技术]]></category>

		<guid isPermaLink="false">http://blog.axqd.net/?p=526</guid>
		<description><![CDATA[&#60;Beautiful Code&#62;一书不算薄，里面的38位作者，也算得上个顶个的牛。但总的来说，信息量却不太大。 耐着性子看到最后一章：&#60;Writing Programs for &#8220;The Book&#8221; by Brian Hayes&#62;，却突然有眼前一亮的感觉。 我对Brian这个人不太熟悉，从书后的介绍中得知，Brian是&#60;American Scientist&#62;计算机专栏的作者。比起其他几篇文章，这篇在文字上，明显要自然流畅一些。 Brian在本书中讨论的问题，其实很简单&#8212;判断三点共线。 我们人在判断这个问题的时候，自然可以简单的进行目测。当目测不足以区分的时候，可以连接任意两点，接着看另外一点是否在那条直线上。 放到程序里，最自然的思路莫过于，过同一点计算并比较斜率。然而，诚如书中所言，计算斜率的方法有一个边界条件&#8212;平行于Y轴的直线斜率不存在。对于这些边界条件，不得不加上条件跳转去处理。更为糟糕的是，如果三个点中，有两个点都是原点，那么这三点肯定是共线的，但这两个原点的斜率，却可以为任意值。 我们注意到，很多边界条件是由坐标系带来的。因此，如果我们选择计算三个点两两之间的距离，并且比较短边长度之和与长边长度。我们可以绕过很多泥沼，代码也因此变得简洁。 然而，这样做依然存在一个固有的问题&#8212;有理数的点之间，可以有无理数的距离。这当然是计算距离时，开根号给闹的。无理数距离的问题在于，这种精度问题，并不是由问题的输入带来，而是由中间步骤产生的。 Brian最后给出Jonathan Shewchuk的方案是，计算三点所构成三角形的面积，并与0作比较。 计算面积比起计算边长的优势在于，面积可以通过同顶点两个矢量的叉乘来计算(如下图所示)从而避免了开根号。也由此把精度问题，限制于输入数据的精度。 &#124;x1-x3 y1-y3&#124; &#124;x2-x3 y2-y3&#124; 最终代码如下(三个点分别为p, q, r)： (defun area-collinear (px py qx qy rx ry) (= (* (- px rx) (- qy ry)) (* (- qx rx) (- py ry)))) 这个例子虽然极其简单，但把它稍稍一般化，就能反映出很多问题： 大部分情况下，我们会写出类似于计算斜率的直觉算法。更糟糕的是，我们甚至可能漏掉斜率不存在，或者斜率为任意值的边界。 DEV CC之后，QA一测，发现了斜率不存在的问题，于是代码里加上一句if条件分支，注释上bug号。 Beta之后，用户complain如此明显的，原点斜率不存在的bug，大家开会聒噪一番，DEV和QA相互指责一番，于是乎又多了一句if。 [...]]]></description>
			<content:encoded><![CDATA[<p>&lt;Beautiful Code&gt;一书不算薄，里面的38位作者，也算得上个顶个的牛。但总的来说，信息量却不太大。</p>
<p>耐着性子看到最后一章：&lt;Writing Programs for &#8220;The Book&#8221; by Brian Hayes&gt;，却突然有眼前一亮的感觉。</p>
<p>我对Brian这个人不太熟悉，从书后的介绍中得知，<a href="http://bit-player.org/">Brian</a>是&lt;American Scientist&gt;计算机专栏的作者。比起其他几篇文章，这篇在文字上，明显要自然流畅一些。</p>
<p>Brian在本书中讨论的问题，其实很简单&#8212;判断三点共线。</p>
<p>我们人在判断这个问题的时候，自然可以简单的进行目测。当目测不足以区分的时候，可以连接任意两点，接着看另外一点是否在那条直线上。</p>
<p>放到程序里，最自然的思路莫过于，过同一点计算并比较斜率。然而，诚如书中所言，计算斜率的方法有一个边界条件&#8212;平行于Y轴的直线斜率不存在。对于这些边界条件，不得不加上条件跳转去处理。更为糟糕的是，如果三个点中，有两个点都是原点，那么这三点肯定是共线的，但这两个原点的斜率，却可以为任意值。</p>
<p>我们注意到，很多边界条件是由坐标系带来的。因此，如果我们选择计算三个点两两之间的距离，并且比较短边长度之和与长边长度。我们可以绕过很多泥沼，代码也因此变得简洁。</p>
<p>然而，这样做依然存在一个固有的问题&#8212;有理数的点之间，可以有无理数的距离。这当然是计算距离时，开根号给闹的。无理数距离的问题在于，这种精度问题，并不是由问题的输入带来，而是由中间步骤产生的。</p>
<p>Brian最后给出Jonathan Shewchuk的方案是，计算三点所构成三角形的面积，并与0作比较。</p>
<p>计算面积比起计算边长的优势在于，面积可以通过同顶点两个矢量的叉乘来计算(如下图所示)从而避免了开根号。也由此把精度问题，限制于输入数据的精度。</p>
<p><code>|x1-x3 y1-y3|<br />
|x2-x3 y2-y3|</code></p>
<p>最终代码如下(三个点分别为p, q, r)：</p>
<p><code>(defun area-collinear (px py qx qy rx ry)<br />
(= (* (- px rx) (- qy ry)) (* (- qx rx) (- py ry))))</code></p>
<p>这个例子虽然极其简单，但把它稍稍一般化，就能反映出很多问题：</p>
<p>大部分情况下，我们会写出类似于计算斜率的直觉算法。更糟糕的是，我们甚至可能漏掉斜率不存在，或者斜率为任意值的边界。<br />
DEV CC之后，QA一测，发现了斜率不存在的问题，于是代码里加上一句if条件分支，注释上bug号。<br />
Beta之后，用户complain如此明显的，原点斜率不存在的bug，大家开会聒噪一番，DEV和QA相互指责一番，于是乎又多了一句if。<br />
ZB之后，大家怀着忐忑的心情RTM，指望CRT不要过来抱怨，用户报了一堆bug，又得加班。</p>
<p>于是在质量保障指引下，代码距离美丽的标准渐行渐远。直到某一天，performance真正成了问题。</p>
<p>牛人大笔一挥，升级算法为计算边长，更新产品名称为XXX 2009(Engine Updated)。<br />
不久，挑剔而又无聊的客户开始抱怨精度问题，大家讨论一番，牛人决定By Design回去，并且在Readme里面的Known Issues里加上一句说明。<br />
当时间沉淀了计算边长的代码，这段代码也就成了不朽的丰碑和牛人津津乐道的谈资。</p>
<p>这时候，偏有不喑世事的小屁孩说，为什么我们不计算面积呢？<br />
牛人说，我呸&#8230;哪凉快哪待着去&#8230;</p>
<p>牛人就是牛人，小屁孩暂时还不明白一个道理。如果你写了计算面积的代码，你就作出了一个假定&#8212;人们都知道用叉乘来计算面积。<br />
小屁孩以为自己的长篇注释，能够把问题说清楚。然而，忙碌的人们谁会想听你一个小屁孩的教导。<br />
这时候，小屁孩不得不感叹思科电话设计的完美，即使你把听筒拿起来，依然能有人打爆小屁孩的电话，要他亲自，一遍又一遍的解释。</p>
<p>世界的完美，往往就体现在对于完美的求不得与不可求。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.axqd.net/2009/01/30/beautiful-code/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hotkey Power</title>
		<link>http://blog.axqd.net/2009/01/06/hotkey-power/</link>
		<comments>http://blog.axqd.net/2009/01/06/hotkey-power/#comments</comments>
		<pubDate>Tue, 06 Jan 2009 05:06:30 +0000</pubDate>
		<dc:creator>axqd</dc:creator>
				<category><![CDATA[挨踢技术]]></category>

		<guid isPermaLink="false">http://blog.axqd.net/?p=509</guid>
		<description><![CDATA[一直想找到一个合适的Embeded Language，只因为厌恶tcl的语法&#8230; 这个Hotkey程序整合了几个我喜欢的脚本，并用AutoHotKey生成exe，可以直接运行。 傻瓜步骤： 1. 下载并双击运行 &#8211; 会生成一个Config.ini配置文件 2. 右键点tray icon，然后点Help看看帮助 3. 更改Config.ini文件，然后重新双击运行，加载配置 源码清单： http://github.com/axqd/HotKeyCombination 视频教程： http://blog.axqd.net/2009/10/17/camtasia-studio-6/]]></description>
			<content:encoded><![CDATA[<p>一直想找到一个合适的Embeded Language，只因为厌恶tcl的语法&#8230;</p>
<p>这个Hotkey程序整合了几个我喜欢的脚本，并用AutoHotKey生成exe，可以直接运行。</p>
<p>傻瓜步骤：</p>
<p>1. <a href="http://www.axqd.net/hotkey/HotKey.exe">下载</a>并双击运行 &#8211; 会生成一个Config.ini配置文件<br />
2. 右键点tray icon，然后点Help看看帮助<br />
3. 更改Config.ini文件，然后重新双击运行，加载配置</p>
<p>源码清单：<br />
<a href="http://github.com/axqd/HotKeyCombination">http://github.com/axqd/HotKeyCombination</a></p>
<p>视频教程：<br />
<a href="http://blog.axqd.net/2009/10/17/camtasia-studio-6/">http://blog.axqd.net/2009/10/17/camtasia-studio-6/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.axqd.net/2009/01/06/hotkey-power/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>What The C*nt&#8230;</title>
		<link>http://blog.axqd.net/2009/01/04/what-the-cnt/</link>
		<comments>http://blog.axqd.net/2009/01/04/what-the-cnt/#comments</comments>
		<pubDate>Sun, 04 Jan 2009 06:14:03 +0000</pubDate>
		<dc:creator>axqd</dc:creator>
				<category><![CDATA[microsoft]]></category>

		<guid isPermaLink="false">http://blog.axqd.net/?p=502</guid>
		<description><![CDATA[其他方面不知道，但UI让我只晃了一眼，就求饶不想再看另一眼的，恐怕也非Windows 2k8 Server Core Edition莫属了。 乍看之下，像是中毒之后，explorer被cmd换掉的产物。 唉，工作了就是惨。见过烂的，没见过这么烂的&#8230;]]></description>
			<content:encoded><![CDATA[<p>其他方面不知道，但UI让我只晃了一眼，就求饶不想再看另一眼的，恐怕也非Windows 2k8 Server Core Edition莫属了。</p>
<p>乍看之下，像是中毒之后，explorer被cmd换掉的产物。</p>
<p>唉，工作了就是惨。见过烂的，没见过这么烂的&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.axqd.net/2009/01/04/what-the-cnt/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>一道面试题</title>
		<link>http://blog.axqd.net/2008/08/28/face-questions/</link>
		<comments>http://blog.axqd.net/2008/08/28/face-questions/#comments</comments>
		<pubDate>Thu, 28 Aug 2008 10:15:51 +0000</pubDate>
		<dc:creator>axqd</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[心情日记]]></category>

		<guid isPermaLink="false">http://blog.axqd.net/?p=484</guid>
		<description><![CDATA[最近帮某公司出了一道面试题，由于面试官技术参差不齐。所以，题目要求：上手容易（不然冷场了，面试官不易处理），还有就是不怎么暴露面试官的无知。 题目内容比较open，没有标准答案，只是要求用伪码实现简化版的windows计算器标准模式，相信大家上手应该都不成问题。 然而实际效果，这道题目区分度还是蛮大的。正是因为按键少，上手就写程序，很容易就成为意大利面条式的代码。甚至有人电话面试的时候，没到5分钟，就直接压了电话。 按键设定为只有以下18个： 0 1 2 3 4 5 6 7 8 9 . + &#8211; * / = C +/- 由于对一切乱七八遭的输入，都要能够接受，不做异常处理，我们有下面一些约定： 1. 忽略前置0: 000000 => 0； 2. 忽略多个.：1&#8230;..23 => 1.23； 3. 多个操作符(包括=)取最后一个（这与windows的版本有细微出入）：*/2 => /2； 最后，是一些考量： 1. 有限状态机在这里是比较自然的思路； 2. 初始计算前加入0+的计算，可以与后面的情况合并处理； 3. Clear和+/-可以不进入状态机处理，而提前解决掉； 4. 一般都能把数字&#8221;0~9&#8243;和&#8221;.&#8221;、&#8221;+-*/&#8221;和&#8221;=&#8221;统一处理；但问题在于，用了大量的if来别扭的处理&#8221;=&#8221;，其实&#8221;=&#8221;之所以别扭，就是因为他和&#8221;+-*/&#8221;最大的不同，在于它是unary operator，而其他的是binary operator。如果考虑到这里，那么对于后续问题。例如，如何加入对于sin/cos/开根号等的支持，也能作出较好的回答； 5. 还有一个小陷阱，除0的考虑； 总之，简单的一道题目，但在面试的特殊环境下，能够较好的区分出应聘者的设计水平。 为了更好的在面试的时候说明题目，我用flex实现了一个界面（因为只起演示作用，所以有个已知的bug就是超长的输入数字，或者回显的超长数字结果，会使程序的显示产生未定义行为）[Updated: 加了个限长为10，现在可以忽略这句话了]。 附件里有代码和状态转换图，有兴趣的可以下来看看。有更好的考量，还望多多指教。 http://www.axqd.net/calculator/]]></description>
			<content:encoded><![CDATA[<p>最近帮某公司出了一道面试题，由于面试官技术参差不齐。所以，题目要求：上手容易（不然冷场了，面试官不易处理），还有就是不怎么暴露面试官的无知。</p>
<p>题目内容比较open，没有标准答案，只是要求用伪码实现简化版的windows计算器标准模式，相信大家上手应该都不成问题。</p>
<p>然而实际效果，这道题目区分度还是蛮大的。正是因为按键少，上手就写程序，很容易就成为意大利面条式的代码。甚至有人电话面试的时候，没到5分钟，就直接压了电话。</p>
<p>按键设定为只有以下18个：<br />
0 1 2 3 4 5 6 7 8 9 . + &#8211; * / = C +/-</p>
<p>由于对一切乱七八遭的输入，都要能够接受，不做异常处理，我们有下面一些约定：<br />
1. 忽略前置0: 000000 => 0；<br />
2. 忽略多个.：1&#8230;..23 => 1.23；<br />
3. 多个操作符(包括=)取最后一个（这与windows的版本有细微出入）：*/2 => /2；</p>
<p>最后，是一些考量：<br />
1. 有限状态机在这里是比较自然的思路；<br />
2. 初始计算前加入0+的计算，可以与后面的情况合并处理；<br />
3. Clear和+/-可以不进入状态机处理，而提前解决掉；<br />
4. 一般都能把数字&#8221;0~9&#8243;和&#8221;.&#8221;、&#8221;+-*/&#8221;和&#8221;=&#8221;统一处理；但问题在于，用了大量的if来别扭的处理&#8221;=&#8221;，其实&#8221;=&#8221;之所以别扭，就是因为他和&#8221;+-*/&#8221;最大的不同，在于它是unary operator，而其他的是binary operator。如果考虑到这里，那么对于后续问题。例如，如何加入对于sin/cos/开根号等的支持，也能作出较好的回答；<br />
5. 还有一个小陷阱，除0的考虑；</p>
<p>总之，简单的一道题目，但在面试的特殊环境下，能够较好的区分出应聘者的设计水平。</p>
<p>为了更好的在面试的时候说明题目，我用flex实现了一个界面（因为只起演示作用，所以有个已知的bug就是超长的输入数字，或者回显的超长数字结果，会使程序的显示产生未定义行为）[Updated: 加了个限长为10，现在可以忽略这句话了]。</p>
<p>附件里有代码和状态转换图，有兴趣的可以下来看看。有更好的考量，还望多多指教。</p>
<p><a href="http://www.axqd.net/calculator/">http://www.axqd.net/calculator/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.axqd.net/2008/08/28/face-questions/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Google Code Jam 2008</title>
		<link>http://blog.axqd.net/2008/07/18/google-code-jam-2008/</link>
		<comments>http://blog.axqd.net/2008/07/18/google-code-jam-2008/#comments</comments>
		<pubDate>Fri, 18 Jul 2008 12:43:07 +0000</pubDate>
		<dc:creator>axqd</dc:creator>
				<category><![CDATA[挨踢技术]]></category>

		<guid isPermaLink="false">http://blog.axqd.net/?p=460</guid>
		<description><![CDATA[邮件提示通知，先前注册的Google Code Jam开始了，于是登进去做做题。 Qualification Round总共三题。大致看了一下，最后一题&#8212;&#8217;苍蝇拍&#8217;，没啥自然的思路，感觉算起来比较麻烦，于是就选了其他两题。这两题倒都还有比较明显的思路。 其实，从Google Code Jam设置的方式来看，Qualification Round的题都不难，但通过大、小输入数据集来考察程序员对于各个边界条件的处理。 第一题，&#8217;拯救宇宙&#8217;； 由于&#8217;Queries must be processed in the order they&#8217;re received.&#8217;，所以简单的标记，然后找大块就可以算出转换次数，如果需要，也可以得出其中一个可行的转换路径。时间复杂度O(N)。 需要注意的地方是： 1. Base case查询个数可能为0； 我在第一次试验Small Input的时候Fail掉，是由于忘了清空标记的时候，把缓存的标记计数也一并清0。 改正后，Small/Large Input结果均正确。 郁闷的是，这题Large Input在上传结果的时候，不知是Firefox缓存还是Google Code Jam系统的问题，Large Output依然为前一次上传的Small Output的文件。以后大家一定要注意检查一下上传结果。 第二题，&#8217;火车时刻表&#8217;； A、B两边分别按时间排序后，各自顺序统计一遍，也很简单，时间复杂度依然为O(N)。 需要注意的地方是： 1. 如何组织录入数据。我采用的是以时间为key的两个哈希表。 2. 时间可能重叠。这是比较明显的一个问题。重叠的时间在key上通过+1、-1来相互抵消。这样在录入数据的时候，就把重叠时间的问题解决了。 3. 时间超过24小时的问题也很明显。但由于&#8217;All arrivals and departures occur on the same day.&#8217;，所以反而让我忽略了这个问题。但其实这个问题依然存在于类似&#8217;23:52&#8242; + &#8217;20 mins turn around [...]]]></description>
			<content:encoded><![CDATA[<p>邮件提示通知，先前注册的Google Code Jam开始了，于是登进去做做题。<br />
Qualification Round总共三题。大致看了一下，最后一题&#8212;&#8217;苍蝇拍&#8217;，没啥自然的思路，感觉算起来比较麻烦，于是就选了其他两题。这两题倒都还有比较明显的思路。</p>
<p>其实，从Google Code Jam设置的方式来看，Qualification Round的题都不难，但通过大、小输入数据集来考察程序员对于各个边界条件的处理。</p>
<p>第一题，&#8217;拯救宇宙&#8217;；<br />
由于&#8217;Queries must be processed in the order they&#8217;re received.&#8217;，所以简单的标记，然后找大块就可以算出转换次数，如果需要，也可以得出其中一个可行的转换路径。时间复杂度O(N)。</p>
<p>需要注意的地方是：<br />
1. Base case查询个数可能为0；</p>
<p>我在第一次试验Small Input的时候Fail掉，是由于忘了清空标记的时候，把缓存的标记计数也一并清0。<br />
改正后，Small/Large Input结果均正确。</p>
<p>郁闷的是，这题Large Input在上传结果的时候，不知是Firefox缓存还是Google Code Jam系统的问题，Large Output依然为前一次上传的Small Output的文件。以后大家一定要注意检查一下上传结果。</p>
<p>第二题，&#8217;火车时刻表&#8217;；<br />
A、B两边分别按时间排序后，各自顺序统计一遍，也很简单，时间复杂度依然为O(N)。</p>
<p>需要注意的地方是：<br />
1. 如何组织录入数据。我采用的是以时间为key的两个哈希表。<br />
2. 时间可能重叠。这是比较明显的一个问题。重叠的时间在key上通过+1、-1来相互抵消。这样在录入数据的时候，就把重叠时间的问题解决了。<br />
3. 时间超过24小时的问题也很明显。但由于&#8217;All arrivals and departures occur on the same day.&#8217;，所以反而让我忽略了这个问题。但其实这个问题依然存在于类似&#8217;23:52&#8242; + &#8217;20 mins turn around time&#8217;的情况里。我后来加上了对这种情况的ignore的处理。</p>
<p>总之，如果有心情的话，做做Code Jam的题还蛮不错的。</p>
<p><a href="http://blog.axqd.net/wp-content/uploads/2008/07/saving_the_universetar.gz">下载Saving The Universe相关文件</a></p>
<p><a href="http://blog.axqd.net/wp-content/uploads/2008/07/saving_the_universetar.gz"></a><a href="http://blog.axqd.net/wp-content/uploads/2008/07/train_timetabletar.gz">下载Train Timetable相关文件</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.axqd.net/2008/07/18/google-code-jam-2008/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Debian常用命令</title>
		<link>http://blog.axqd.net/2007/06/10/debian-common-commands/</link>
		<comments>http://blog.axqd.net/2007/06/10/debian-common-commands/#comments</comments>
		<pubDate>Sun, 10 Jun 2007 02:25:09 +0000</pubDate>
		<dc:creator>axqd</dc:creator>
				<category><![CDATA[自由世界]]></category>

		<guid isPermaLink="false">http://blog.axqd.net/?p=428</guid>
		<description><![CDATA[查看软件xxx安装内容 dpkg -L xxx 查找软件 apt-cache search 正则表达式 查找文件属于哪个包 dpkg -S filename apt-file search filename 查询软件xxx依赖哪些包 apt-cache depends xxx 查询软件xxx被哪些包依赖 apt-cache rdepends xxx 增加一个光盘源 apt-cdrom add 系统升级 apt-get update apt-get upgrade apt-get dist-upgrade 清除所有删除包的残余配置文件 dpkg -l &#124;grep ^rc&#124;awk ''{print $2}'' &#124;tr ["\n"] [" "]&#124;sudo xargs dpkg -P - 编译时缺少h文件的自动处理 auto-apt run ./configure 查看安装软件时下载包的临时存放目录 ls /var/cache/apt/archives [...]]]></description>
			<content:encoded><![CDATA[<p>查看软件xxx安装内容<br />
<code>dpkg -L xxx</code></p>
<p>查找软件<br />
<code>apt-cache search 正则表达式</code></p>
<p>查找文件属于哪个包<br />
<code>dpkg -S filename<br />
apt-file search filename</code></p>
<p>查询软件xxx依赖哪些包<br />
<code>apt-cache depends xxx</code></p>
<p>查询软件xxx被哪些包依赖<br />
<code>apt-cache rdepends xxx</code></p>
<p>增加一个光盘源<br />
<code>apt-cdrom add</code></p>
<p>系统升级<br />
<code>apt-get update<br />
apt-get upgrade<br />
apt-get dist-upgrade</code></p>
<p>清除所有删除包的残余配置文件<br />
<code>dpkg -l |grep ^rc|awk ''{print $2}'' |tr ["\n"] [" "]|sudo xargs dpkg -P -</code></p>
<p>编译时缺少h文件的自动处理<br />
<code>auto-apt run ./configure</code></p>
<p>查看安装软件时下载包的临时存放目录<br />
<code>ls /var/cache/apt/archives</code></p>
<p>备份当前系统安装的所有包的列表<br />
<code>dpkg --get-selections | grep -v deinstall > ~/somefile</code></p>
<p>从上面备份的安装包的列表文件恢复所有包<br />
<code>dpkg --set-selections < ~/somefile<br />
dselect</code></p>
<p>清理旧版本的软件缓存<br />
<code>apt-get autoclean</code></p>
<p>清理所有软件缓存<br />
<code>apt-get clean</code></p>
<p>删除系统不再使用的孤立软件<br />
<code>apt-get autoremove</code></p>
<p>查看包在服务器上面的地址<br />
<code>apt-get -qq --print-uris install ssh | cut -d\'' -f2</code></p>
<p>查看内核<br />
<code>uname -a</code></p>
<p>查看Ubuntu版本<br />
<code>cat /etc/issue</code></p>
<p>查看内核加载的模块<br />
<code>lsmod</code></p>
<p>查看PCI设备<br />
<code>lspci</code></p>
<p>查看USB设备<br />
<code>lsusb</code></p>
<p>查看网卡状态<br />
<code>ethtool eth0</code></p>
<p>查看CPU信息<br />
<code>cat /proc/cpuinfo</code></p>
<p>显示当前硬件信息<br />
<code>lshw</code></p>
<p>查看硬盘的分区<br />
<code>fdisk -l</code></p>
<p>查看IDE硬盘信息<br />
<code>hdparm -i /dev/hda</code></p>
<p>查看STAT硬盘信息<br />
<code>hdparm -I /dev/sda<br />
或<br />
apt-get install blktool<br />
blktool /dev/sda id</code></p>
<p>查看硬盘剩余空间<br />
<code>df -h<br />
df -H</code></p>
<p>查看目录占用空间<br />
<code>du -hs 目录名</code></p>
<p>优盘没法卸载<br />
<code>sync<br />
fuser -km /media/usbdisk</code></p>
<p>查看当前的内存使用情况<br />
<code>free -m</code></p>
<p>查看当前有哪些进程<br />
<code>ps -aux</code></p>
<p>中止一个进程<br />
<code>kill 进程号<br />
或 killall 进程名</code></p>
<p>强制中止一个进程<br />
<code>kill -9 进程号<br />
或 killall -9 进程名</code></p>
<p>查看当前进程的实时状况<br />
<code>top</code></p>
<p>查看进程打开的文件<br />
<code>lsof -p</code></p>
<p>配置 ADSL<br />
<code>pppoeconf</code></p>
<p>ADSL手工拨号<br />
<code>pon dsl-provider</code></p>
<p>激活 ADSL<br />
<code>/etc/ppp/pppoe_on_boot</code></p>
<p>断开 ADSL<br />
<code>poff</code></p>
<p>查看拨号日志<br />
<code>plog</code></p>
<p>根据IP查网卡地址<br />
<code>arping IP地址</code></p>
<p>查看当前IP地址<br />
<code>ifconfig eth0</code></p>
<p>查看当前监听80端口的程序<br />
<code>lsof -i :80</code></p>
<p>查看当前网卡的物理地址<br />
<code>arp -a | awk ''{print $4}''<br />
ifconfig eth0 | head -1 | awk ''{print $5}''</code></p>
<p>立即让网络支持nat<br />
<code>echo 1 > /proc/sys/net/ipv4/ip_forward<br />
iptables -t nat -I POSTROUTING -j MASQUERADE</code></p>
<p>查看路由信息<br />
<code>netstat -rn<br />
route -n</code></p>
<p>手工增加删除一条路由<br />
<code>route add -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1<br />
route del -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1</code></p>
<p>修改网卡MAC地址的方法<br />
<code>ifconfig eth0 down #关闭网卡<br />
ifconfig eth0 hw ether 00:AA:BB:CC:DD:EE #然后改地址<br />
ifconfig eth0 up #然后启动网卡</code></p>
<p>统计当前IP连接的个数<br />
<code>netstat -na|grep ESTABLISHED|awk ''{print $5}''|awk -F: ''{print $1}''|sort|uniq -c|sort -r -n<br />
netstat -na|grep SYN|awk ''{print $5}''|awk -F: ''{print $1}''|sort|uniq -c|sort -r -n</code></p>
<p>统计当前20000个IP包中大于100个IP包的IP地址<br />
<code>tcpdump -tnn -c 20000 -i eth0 | awk -F "." ''{print $1"."$2"."$3"."$4}'' | sort | uniq -c | sort -nr | awk '' $1 > 100 ''</code></p>
<p>屏蔽IPV6<br />
<code>echo "blacklist ipv6" | tee /etc/modprobe.d/blacklist-ipv6</code></p>
<p>添加一个服务<br />
<code>update-rc.d 服务名 defaults 99</code></p>
<p>删除一个服务<br />
<code>update-rc.d 服务名 remove</code></p>
<p>临时重启一个服务<br />
<code>/etc/init.d/服务名 restart</code></p>
<p>临时关闭一个服务<br />
<code>/etc/init.d/服务名 stop</code></p>
<p>临时启动一个服务<br />
<code>/etc/init.d/服务名 start</code></p>
<p>配置默认Java使用哪个<br />
<code>update-alternatives --config java</code></p>
<p>修改用户资料<br />
<code>chfn userid</code></p>
<p>给apt设置代理<br />
<code>export http_proxy=http://xx.xx.xx.xx:xxx</code></p>
<p>修改系统登录信息<br />
<code>vi /etc/motd</code></p>
<p>转换文件名由GBK为UTF8<br />
<code>apt-get install convmv<br />
convmv -r -f cp936 -t utf8 --notest --nosmart *</code></p>
<p>批量转换src目录下的所有文件内容由GBK到UTF8<br />
<code>find src -type d -exec mkdir -p utf8/{} \;<br />
find src -type f -exec iconv -f GBK -t UTF-8 {} -o utf8/{} \;<br />
mv utf8/* src<br />
rm -fr utf8</code></p>
<p>转换文件内容由GBK到UTF8<br />
<code>iconv -f gbk -t utf8 $i > newfile</code></p>
<p>转换 mp3 标签编码<br />
<code>apt-get install python-mutagen<br />
find . -iname “*.mp3” -execdir mid3iconv -e GBK {} \;</code></p>
<p>控制台下显示中文<br />
<code>apt-get install zhcon<br />
使用时，输入zhcon即可</code></p>
<p>快速查找某个文件<br />
<code>whereis filename<br />
find 目录 -name 文件名</code></p>
<p>查看文件类型<br />
<code>file filename</code></p>
<p>显示xxx文件倒数6行的内容<br />
<code>tail -n 6 xxx</code></p>
<p>让tail不停地读地最新的内容<br />
<code>tail -n 10 -f /var/log/apache2/access.log</code></p>
<p>查看文件中间的第五行 ( 含 ) 到第 10 行 ( 含 ) 的内容<br />
<code>sed -n ''5,10p'' /var/log/apache2/access.log</code></p>
<p>查找包含xxx字符串的文件<br />
<code>grep -l -r xxx .</code></p>
<p>查找关于xxx的命令<br />
<code>apropos xxx<br />
man -k xxx</code></p>
<p>通过ssh传输文件<br />
<code>scp -rp /path/filename username@remoteIP:/path  #将本地文件拷贝到服务器上<br />
scp -rp username@remoteIP:/path/filename /path  #将远程文件从服务器下载到本地</code></p>
<p>查看某个文件被哪些应用程序读写<br />
<code>lsof 文件名</code></p>
<p>把所有文件的后辍由rm改为rmvb<br />
<code>rename ''s/.rm$/.rmvb/'' *</code></p>
<p>把所有文件名中的大写改为小写<br />
<code>rename ''tr/A-Z/a-z/'' *</code></p>
<p>删除特殊文件名的文件，如文件名：--help.txt<br />
<code>rm -- --help.txt 或者 rm ./--help.txt</code></p>
<p>查看当前目录的子目录<br />
<code>ls -d */. 或 echo */.</code></p>
<p>将当前目录下最近30天访问过的文件移动到上级back目录<br />
<code>find . -type f -atime -30 -exec mv {} ../back \;</code></p>
<p>将当前目录下最近2小时到8小时之内的文件显示出来<br />
<code>find . -mmin +120 -mmin -480 -exec more {} \;</code></p>
<p>删除修改时间在30天之前的所有文件<br />
<code>find . -type f -mtime +30 -mtime -3600 -exec rm {} \;</code></p>
<p>查找guest用户的以avi或者rm结尾的文件并删除掉<br />
<code>find . -name ''*.avi'' -o -name ''*.rm'' -user ''guest'' -exec rm {} \;</code></p>
<p>查找的不以java和xml结尾,并7天没有使用的文件删除掉<br />
<code>find . ! -name *.java ! -name ‘*.xml’ -atime +7 -exec rm {} \;</code></p>
<p>统计当前文件个数<br />
<code>ls /usr/bin|wc -w</code></p>
<p>统计当前目录个数<br />
<code>ls -l /usr/bin|grep ^d|wc -l</code></p>
<p>显示当前目录下2006-01-01的文件名<br />
<code>ls -l |grep 2006-01-01 |awk ''{print $8}''</code></p>
<p>解压缩 xxx.tar.gz<br />
<code>tar -zxvf xxx.tar.gz</code></p>
<p>解压缩 xxx.tar.bz2<br />
<code>tar -jxvf xxx.tar.bz2</code></p>
<p>压缩aaa bbb目录为xxx.tar.gz<br />
<code>tar -zcvf xxx.tar.gz aaa bbb</code></p>
<p>压缩aaa bbb目录为xxx.tar.bz2<br />
<code>tar -jcvf xxx.tar.bz2 aaa bbb</code></p>
<p>特殊 URI 地址<br />
<code>* computer:/// - 全部挂载的设备和网络<br />
* network:/// - 浏览可用的网络<br />
* burn:/// - 一个刻录 CDs/DVDs 的数据虚拟目录<br />
* smb:/// - 可用的 windows/samba 网络资源<br />
* x-nautilus-desktop:/// - 桌面项目和图标<br />
* file:/// - 本地文件<br />
* trash:/// - 本地回收站目录<br />
* ftp:// - FTP 文件夹<br />
* ssh:// - SSH 文件夹<br />
* fonts:/// - 字体文件夹，可将字体文件拖到此处以完成安装 * themes:/// - 系统主题文件夹</code></p>
<p>详细显示程序的运行信息<br />
<code>strace -f -F -o outfile <cmd></code></p>
<p>设置日期<br />
<code>date -s mm/dd/yy</code></p>
<p>设置时间<br />
<code>date -s HH:MM</code></p>
<p>将时间写入CMOS<br />
<code>hwclock --systohc</code></p>
<p>读取CMOS时间<br />
<code>hwclock --hctosys</code></p>
<p>从服务器上同步时间<br />
<code>ntpdate time.nist.gov<br />
ntpdate time.windows.com</code></p>
<p>从mysql中导出和导入数据<br />
<code>mysqldump 数据库名 > 文件名  #导出数据库mysqladmin create 数据库名 #建立数据库<br />
mysql 数据库名 < 文件名 #导入数据库</code></p>
<p>忘了mysql的root口令怎么办<br />
<code>/etc/init.d/mysql stop<br />
mysqld_safe --skip-grant-tables &#038;<br />
mysqladmin -u user password ''newpassword''''<br />
mysqladmin flush-privileges</code></p>
<p>修改mysql的root口令<br />
<code>mysqladmin -uroot -p password ''你的新密码''</code></p>
<p>下载网站文档<br />
<code>wget -r -p -np -k http://www.21cn.com<br />
· -r：在本机建立服务器端目录结构；<br />
· -p: 下载显示HTML文件的所有图片；<br />
· -np：只下载目标站点指定目录及其子目录的内容；<br />
· -k: 转换非相对链接为相对链接。</code></p>
<p>如何删除Totem电影播放机的播放历史记录<br />
<code>rm ~/.recently-used </code></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.axqd.net/2007/06/10/debian-common-commands/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Calendar Bug</title>
		<link>http://blog.axqd.net/2007/03/29/google-calendar-bug/</link>
		<comments>http://blog.axqd.net/2007/03/29/google-calendar-bug/#comments</comments>
		<pubDate>Thu, 29 Mar 2007 02:21:03 +0000</pubDate>
		<dc:creator>axqd</dc:creator>
				<category><![CDATA[挨踢技术]]></category>

		<guid isPermaLink="false">http://blog.axqd.net/?p=427</guid>
		<description><![CDATA[修改C:\Documents and Settings\[your username]\Application Data\Mozilla\Firefox\Profiles\euaxxzw1.default\extensions\{9BE36B8C-F2A0- 41d1-AA51-402328BE8496}\chrome\goocal.jar包里面： content\goocal.js 57行 window.removeEventListenter("load", gc.onload, false); =&#62; window.removeEventListener("load", gc.onload, false); 也是因为影响不大，google测试也没发现]]></description>
			<content:encoded><![CDATA[<p>修改C:\Documents and Settings\[your username]\Application Data\Mozilla\Firefox\Profiles\euaxxzw1.default\extensions\{9BE36B8C-F2A0- 41d1-AA51-402328BE8496}\chrome\goocal.jar包里面： content\goocal.js</p>
<p>57行<br />
<code>window.removeEventListenter("load", gc.onload, false);</code><br />
=&gt;<br />
<code>window.removeEventListener("load", gc.onload, false);</code></p>
<p>也是因为影响不大，google测试也没发现</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.axqd.net/2007/03/29/google-calendar-bug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
