<?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>EverET.org</title>
	<atom:link href="http://everet.org/feed" rel="self" type="application/rss+xml" />
	<link>http://everet.org</link>
	<description>Better to do something imperfectly than to do nothing flawlessly.</description>
	<lastBuildDate>Tue, 21 Feb 2012 05:47:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>给电脑装了6块硬盘后</title>
		<link>http://everet.org/2012/02/6-hard-disk-is-installed-to-the-computer.html</link>
		<comments>http://everet.org/2012/02/6-hard-disk-is-installed-to-the-computer.html#comments</comments>
		<pubDate>Mon, 20 Feb 2012 17:09:29 +0000</pubDate>
		<dc:creator>Stupid ET</dc:creator>
				<category><![CDATA[我的分享]]></category>
		<category><![CDATA[我的生活]]></category>

		<guid isPermaLink="false">http://everet.org/?p=575</guid>
		<description><![CDATA[今天在光驱位装了块硬盘，于是想在弄过几块硬盘看看到了Z盘会发生什么事情。 最后发现到了Z盘后，就识别不了新的硬盘了。Windows果然弱爆了。 今天贡献硬盘的有洪科，晓彬，钦杰，桐文，谢谢他们啊~~ 见证历史的图!!]]></description>
			<content:encoded><![CDATA[<p>今天在光驱位装了块硬盘，于是想在弄过几块硬盘看看到了Z盘会发生什么事情。</p>
<p>最后发现到了Z盘后，就识别不了新的硬盘了。Windows果然弱爆了。</p>
<p>今天贡献硬盘的有洪科，晓彬，钦杰，桐文，谢谢他们啊~~</p>
<p>见证历史的图!!<span id="more-575"></span></p>
<p><a href="http://everet.org/wp-content/uploads/2012/02/1111.png" rel="lightbox[575]"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="1111" src="http://everet.org/wp-content/uploads/2012/02/1111_thumb.png" alt="1111" width="986" height="808" border="0" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://everet.org/2012/02/6-hard-disk-is-installed-to-the-computer.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>编译原理知识回顾&#8212;&#8212;中间代码生成</title>
		<link>http://everet.org/2012/02/intermediate-code-generation.html</link>
		<comments>http://everet.org/2012/02/intermediate-code-generation.html#comments</comments>
		<pubDate>Sun, 19 Feb 2012 05:23:35 +0000</pubDate>
		<dc:creator>Stupid ET</dc:creator>
				<category><![CDATA[我的分享]]></category>
		<category><![CDATA[compile]]></category>

		<guid isPermaLink="false">http://everet.org/?p=567</guid>
		<description><![CDATA[学完编译原理已经一年了，也有半年被因为学其他东西而没空继续深入学习编译原理。 现在终于有机会继续学习了。 首先回顾下，编译原理考试第一题的答案。就是翻译的步骤。 对于编译，第一步是词法分析。也就是分出一个个Token。 例如，像一行赋值语句：a[index] = 4 + 2 ，我们可以将其拆成一个个基本元素，每种元素都有自己的类型。如下所示： 这些Token将作为编译过程中最基本的元素。 标识符(identifier) a,&#160; index 左方括号(left bracket) [ 右方括号(right bracket) ] 等号(assignment) = 加号(plus) + 数字(number) 4,&#160; 2 当这些Token它们组合在一起，就成了句子。在这个时候，我们就可以进行语法分析了。 我们可以将其组织成一棵抽象的语法树。根节点就是抽象的表达式，因为这个一句话就是一个表达式。然后可以分割为赋值表达式的3个元素，然后逐级分割，到了叶子就是基本的词法单元Token了。 在做完语法分析后，我们就要进行语义分析。为什么要语义分析呢？我们要根据语义来标记这棵语法树，让其变成标记树，然后才好根据这棵树生成中间代码。 通常，我们的中间代码都是一种三地址码。可以理解为只有三个变量以内的表达式。 对于三地址码，我们可以进行代码优化，例如想上述的代码可以优化成： 对于优化后的中间代码，我们可以方便的将其翻译成汇编代码。 我们假设变量a的类型是占4个字节。于是可以翻译成下述汇编 于是关于代码生成的部分就完成了。]]></description>
			<content:encoded><![CDATA[<p>学完编译原理已经一年了，也有半年被因为学其他东西而没空继续深入学习编译原理。</p>
<p>现在终于有机会继续学习了。</p>
<p>首先回顾下，编译原理考试第一题的答案。就是翻译的步骤。</p>
<p><a href="http://everet.org/wp-content/uploads/2012/02/image4.png" rel="lightbox[567]"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://everet.org/wp-content/uploads/2012/02/image_thumb4.png" width="619" height="486" /></a></p>
<p><span id="more-567"></span>
<p>对于编译，第一步是词法分析。也就是分出一个个Token。</p>
<p>例如，像一行赋值语句：a[index] = 4 + 2 ，我们可以将其拆成一个个基本元素，每种元素都有自己的类型。如下所示：</p>
<p><a href="http://everet.org/wp-content/uploads/2012/02/image5.png" rel="lightbox[567]"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://everet.org/wp-content/uploads/2012/02/image_thumb5.png" width="652" height="281" /></a></p>
<p>这些Token将作为编译过程中最基本的元素。</p>
<table border="0" cellspacing="0" cellpadding="2" width="400">
<tbody>
<tr>
<td valign="top" width="134">标识符(identifier)</td>
<td valign="top" width="266">a,&#160; index</td>
</tr>
<tr>
<td valign="top" width="134">左方括号(left bracket)</td>
<td valign="top" width="266">[</td>
</tr>
<tr>
<td valign="top" width="134">右方括号(right bracket)</td>
<td valign="top" width="266">]</td>
</tr>
<tr>
<td valign="top" width="134">等号(assignment)</td>
<td valign="top" width="266">=</td>
</tr>
<tr>
<td valign="top" width="134">加号(plus)</td>
<td valign="top" width="266">+</td>
</tr>
<tr>
<td valign="top" width="134">数字(number)</td>
<td valign="top" width="266">4,&#160; 2</td>
</tr>
</tbody>
</table>
<p>当这些Token它们组合在一起，就成了句子。在这个时候，我们就可以进行语法分析了。</p>
<p>我们可以将其组织成一棵抽象的语法树。根节点就是抽象的表达式，因为这个一句话就是一个表达式。然后可以分割为赋值表达式的3个元素，然后逐级分割，到了叶子就是基本的词法单元Token了。</p>
<p><a href="http://everet.org/wp-content/uploads/2012/02/image6.png" rel="lightbox[567]"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://everet.org/wp-content/uploads/2012/02/image_thumb6.png" width="658" height="343" /></a></p>
<p>在做完语法分析后，我们就要进行语义分析。为什么要语义分析呢？我们要根据语义来标记这棵语法树，让其变成标记树，然后才好根据这棵树生成中间代码。</p>
<p><a href="http://everet.org/wp-content/uploads/2012/02/image7.png" rel="lightbox[567]"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://everet.org/wp-content/uploads/2012/02/image_thumb7.png" width="643" height="240" /></a></p>
<p>通常，我们的中间代码都是一种三地址码。可以理解为只有三个变量以内的表达式。</p>
<p><a href="http://everet.org/wp-content/uploads/2012/02/image8.png" rel="lightbox[567]"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://everet.org/wp-content/uploads/2012/02/image_thumb8.png" width="504" height="108" /></a></p>
<p>对于三地址码，我们可以进行代码优化，例如想上述的代码可以优化成：</p>
<p><a href="http://everet.org/wp-content/uploads/2012/02/image9.png" rel="lightbox[567]"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://everet.org/wp-content/uploads/2012/02/image_thumb9.png" width="148" height="41" /></a></p>
<p>对于优化后的中间代码，我们可以方便的将其翻译成汇编代码。</p>
<p>我们假设变量a的类型是占4个字节。于是可以翻译成下述汇编</p>
<p><a href="http://everet.org/wp-content/uploads/2012/02/image10.png" rel="lightbox[567]"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://everet.org/wp-content/uploads/2012/02/image_thumb10.png" width="123" height="131" /></a></p>
<p>于是关于代码生成的部分就完成了。</p>
]]></content:encoded>
			<wfw:commentRss>http://everet.org/2012/02/intermediate-code-generation.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTTP状态码</title>
		<link>http://everet.org/2012/02/the-http-status-code.html</link>
		<comments>http://everet.org/2012/02/the-http-status-code.html#comments</comments>
		<pubDate>Sat, 18 Feb 2012 08:44:30 +0000</pubDate>
		<dc:creator>Stupid ET</dc:creator>
				<category><![CDATA[我的分享]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://everet.org/?p=550</guid>
		<description><![CDATA[发现到了现在，我还是除了一些基本的状态码之外， 其他状态码都不是很熟悉，于是找了些状态码过来记录一下，也当做备忘了。 下面的拿Vim把返回码处理成表格还加了颜色，哈哈，果然用Vim就是像刷屏一样。配合宏真是无敌了！ 100 Continue 初始的请求已经接受，客户应当继续发送请求的其余部分 101 Switching Protocols 服务器将遵从客户的请求转换到另外一种协议 200 OK 一切正常，对GET和POST请求的应答文档跟在后面 201 Created 服务器已经创建了文档，Location头给出了它的URL。 202 Accepted 已经接受请求，但处理尚未完成。 203 Non-Authoritative Information 文档已经正常地返回，但一些应答头可能不正确，因为使用的是文档的拷贝 204 No Content 没有新文档，浏览器应该继续显示原来的文档。如果用户定期地刷新页面，而Servlet可以确定用户文档足够新，这个状态代码是很有用的 205 Reset Content 没有新的内容，但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容 206 Partial Content 客户发送了一个带有Range头的GET请求，服务器完成了它 300 Multiple Choices 客户请求的文档可以在多个位置找到，这些位置已经在返回的文档内列出。如果服务器要提出优先选择，则应该在Location应答头指明。 301 Moved Permanently 客户请求的文档在其他地方，新的URL在Location头中给出，浏览器应该自动地访问新的URL。 302 Found 类似于301，但新的URL应该被视为临时性的替代，而不是永久性的。 303 See Other 类似于301/302，不同之处在于，如果原来的请求是POST，Location头指定的重定向目标文档应该通过GET提取 304 Not Modified 客户端有缓冲的文档并发出了一个条件性的请求（一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档）。服务器告诉客户，原来缓冲的文档还可以继续使用。 305 ]]></description>
			<content:encoded><![CDATA[<p>发现到了现在，我还是除了一些基本的状态码之外， 其他状态码都不是很熟悉，于是找了些状态码过来记录一下，也当做备忘了。</p>
<p>下面的拿Vim把返回码处理成表格还加了颜色，哈哈，果然用Vim就是像刷屏一样。配合宏真是无敌了！</p>
<table width="400" border="0" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td><strong><span style="color: #9bbb59;">100</span></strong><br />
Continue</td>
<td>初始的请求已经接受，客户应当继续发送请求的其余部分</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">101</span></strong><br />
Switching Protocols</td>
<td>服务器将遵从客户的请求转换到另外一种协议</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">200</span></strong><br />
OK</td>
<td>一切正常，对GET和POST请求的应答文档跟在后面</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">201</span></strong><br />
Created</td>
<td>服务器已经创建了文档，Location头给出了它的URL。</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">202</span></strong><br />
Accepted</td>
<td>已经接受请求，但处理尚未完成。</td>
</tr>
</tbody>
</table>
<p><span id="more-550"></span></p>
<table width="400" border="0" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td></td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">203</span></strong><br />
Non-Authoritative Information</td>
<td>文档已经正常地返回，但一些应答头可能不正确，因为使用的是文档的拷贝</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">204</span></strong><br />
No Content</td>
<td>没有新文档，浏览器应该继续显示原来的文档。如果用户定期地刷新页面，而Servlet可以确定用户文档足够新，这个状态代码是很有用的</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">205</span></strong><br />
Reset Content</td>
<td>没有新的内容，但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">206</span></strong><br />
Partial Content</td>
<td>客户发送了一个带有Range头的GET请求，服务器完成了它</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">300</span></strong><br />
Multiple Choices</td>
<td>客户请求的文档可以在多个位置找到，这些位置已经在返回的文档内列出。如果服务器要提出优先选择，则应该在Location应答头指明。</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">301</span></strong><br />
Moved Permanently</td>
<td>客户请求的文档在其他地方，新的URL在Location头中给出，浏览器应该自动地访问新的URL。</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">302</span></strong><br />
Found</td>
<td>类似于301，但新的URL应该被视为临时性的替代，而不是永久性的。</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">303</span></strong><br />
See Other</td>
<td>类似于301/302，不同之处在于，如果原来的请求是POST，Location头指定的重定向目标文档应该通过GET提取</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">304</span></strong><br />
Not Modified</td>
<td>客户端有缓冲的文档并发出了一个条件性的请求（一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档）。<a href="http://xfeng.me/tags/%e6%9c%8d%e5%8a%a1%e5%99%a8/">服务器</a>告诉客户，原来缓冲的文档还可以继续使用。</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">305</span></strong><br />
Use Proxy</td>
<td>客户请求的文档应该通过Location头所指明的代理服务器提取</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">307</span></strong><br />
Temporary Redirect</td>
<td>和302（Found）相同。许多浏览器会错误地响应302应答进行重定向，即使原来的请求是 POST，即使它实际上只能在POST请求的应答是303时才能重定向。由于这个原因，HTTP 1.1新增了307，以便更加清除地区分几个状态代码： 当出现303应答时，浏览器可以跟随重定向的GET和POST请求；如果是307应答，则浏览器只能跟随对GET请求的重定向。</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">400</span></strong><br />
Bad Request</td>
<td>请求出现语法错误。</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">401</span></strong><br />
Unauthorized</td>
<td>客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头，浏览器据此显示用户名字/密码对话框，然后在填写合适的Authorization头后再次发出请求。</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">403</span></strong><br />
Forbidden</td>
<td>资源不可用。</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">404</span></strong><br />
Not Found</td>
<td>无法找到指定位置的资源</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">405</span></strong><br />
Method Not Allowed</td>
<td>请求方法（GET、POST、HEAD、Delete、PUT、TRACE等）对指定的资源不适用。</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">406</span></strong><br />
Not Acceptable</td>
<td>指定的资源已经找到，但它的MIME类型和客户在Accpet头中所指定的不兼容</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">407</span></strong><br />
Proxy Authentication Required</td>
<td>类似于401，表示客户必须先经过代理服务器的授权。</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">408</span></strong><br />
Request Timeout</td>
<td>在服务器许可的等待时间内，客户一直没有发出任何请求。客户可以在以后重复同一请求。</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">409</span></strong><br />
Conflict</td>
<td>通常和PUT请求有关。由于请求和资源的当前状态相冲突，因此请求不能成功。</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">410</span></strong><br />
Gone</td>
<td>所请求的文档已经不再可用，而且服务器不知道应该重定向到哪一个地址。它和404的不同在于，返回407表示文档永久地离开了指定的位置，而404表示由于未知的原因文档不可用。</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">411</span></strong><br />
Length Required</td>
<td>服务器不能处理请求，除非客户发送一个Content-Length头。</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">412</span></strong><br />
Precondition Failed</td>
<td>请求头中指定的一些前提条件失败</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">413</span></strong><br />
Request Entity Too Large</td>
<td>目标文档的大小超过服务器当前愿意处理的大小。如果服务器认为自己能够稍后再处理该请求，则应该提供一个Retry-After头</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">414</span></strong><br />
Request URI Too Long</td>
<td>URI太长</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">416</span></strong><br />
Requested Range Not Satisfiable</td>
<td>服务器不能满足客户在请求中指定的Range头</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">500</span></strong><br />
Internal Server Error</td>
<td>服务器遇到了意料不到的情况，不能完成客户的请求</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">501</span></strong><br />
Not Implemented</td>
<td>服务器不支持实现请求所需要的功能。例如，客户发出了一个服务器不支持的PUT请求</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">502</span></strong><br />
Bad Gateway</td>
<td>服务器作为网关或者代理时，为了完成请求访问下一个服务器，但该服务器返回了非法的应答</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">503</span></strong><br />
Service Unavailable</td>
<td>服务器由于维护或者负载过重未能应答。例如，Servlet可能在数据库连接池已满的情况下返回503。服务器返回503时可以提供一个Retry-After头</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">504</span></strong><br />
Gateway Timeout</td>
<td>由作为代理或网关的服务器使用，表示不能及时地从远程服务器获得应答</td>
</tr>
<tr>
<td><strong><span style="color: #9bbb59;">505</span></strong><br />
HTTP Version Not Supported</td>
<td>服务器不支持请求中所指明的HTTP版本</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://everet.org/2012/02/the-http-status-code.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Python抓取京东商城的所有笔记本电脑的参数</title>
		<link>http://everet.org/2012/02/python-crawl-jingdong.html</link>
		<comments>http://everet.org/2012/02/python-crawl-jingdong.html#comments</comments>
		<pubDate>Fri, 17 Feb 2012 10:53:24 +0000</pubDate>
		<dc:creator>Stupid ET</dc:creator>
				<category><![CDATA[我的代码]]></category>
		<category><![CDATA[我的分享]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://everet.org/?p=532</guid>
		<description><![CDATA[最近洪爷要写数据挖掘的论文需要些数据，于是俺又有机会做苦力了。昨天刚刚回到学校，晚上就帮洪爷写了个爬虫来爬数据京东商城的笔记本的参数。 为了快速完成，基本原理就是人工找到笔记本的页面。 然后他有22页（Page），编号规则如下： http://www.360buy.com/products/670-671-672-0-0-0-0-0-0-0-1-1-1.html http://www.360buy.com/products/670-671-672-0-0-0-0-0-0-0-1-1-%d.html http://www.360buy.com/products/670-671-672-0-0-0-0-0-0-0-1-1-22.html 我们可以先访问每一页，每一页有很多个笔记本，然后我们从中汲取出每个笔记本的页面的url，记录下每台笔记本的网页的url，然后在访问每一个笔记本的页面，从中取出笔记本的参数，OK，非常简单，打完收工。 为了加速，我们采用多线程，一些工作线程访问Page，从中取出笔记本产品Product的url放到一个队列里。然后另一些工作线程从队列里取出笔记本的url，然后从中取出笔记本的参数。然后输出到文件中。 点击下载源代码：jindong 输出如下的文件：]]></description>
			<content:encoded><![CDATA[<p>最近洪爷要写数据挖掘的论文需要些数据，于是俺又有机会做苦力了。昨天刚刚回到学校，晚上就帮洪爷写了个爬虫来爬数据京东商城的笔记本的参数。</p>
<p>为了快速完成，基本原理就是人工找到笔记本的页面。</p>
<p>然后他有22页（Page），编号规则如下：</p>
<p>http://www.360buy.com/products/670-671-672-0-0-0-0-0-0-0-1-1-<span style="color: #ffc000;">1</span>.html</p>
<p>http://www.360buy.com/products/670-671-672-0-0-0-0-0-0-0-1-1-<span style="color: #ffc000;">%d</span>.html</p>
<p>http://www.360buy.com/products/670-671-672-0-0-0-0-0-0-0-1-1-<span style="color: #ffc000;">22</span>.html</p>
<p><span id="more-532"></span></p>
<p>我们可以先访问每一页，每一页有很多个笔记本，然后我们从中汲取出每个笔记本的页面的url，记录下每台笔记本的网页的url，然后在访问每一个笔记本的页面，从中取出笔记本的参数，OK，非常简单，打完收工。</p>
<p>为了加速，我们采用多线程，一些工作线程访问Page，从中取出笔记本产品Product的url放到一个队列里。然后另一些工作线程从队列里取出笔记本的url，然后从中取出笔记本的参数。然后输出到文件中。</p>
<p><a href="http://everet.org/wp-content/uploads/2012/02/QQ20120217184108.png" rel="lightbox[532]"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="QQ截图20120217184108" src="http://everet.org/wp-content/uploads/2012/02/QQ20120217184108_thumb.png" alt="QQ截图20120217184108" width="438" height="188" border="0" /></a></p>
<pre>点击下载源代码：<a href="http://everet.org/wp-content/uploads/2012/02/jindong.rar">jindong</a>
<pre class="brush: python; title: ; notranslate">
#!/usr/bin/env python
# author: Cedric Porter [ Stupid ET ]
# contact me: cedricporter@gmail.com

from urllib import urlopen
import threading
import re
import Queue

def get_info(url):
    '''abstracts product info '''
    p = re.compile('&lt;tr&gt;&lt;td .*?&gt;(.*?)&lt;/td&gt;&lt;td&gt;(.*?)&lt;/td&gt;&lt;/tr&gt;')
    text = urlopen(url).read()
    info = []

    for t, v in p.findall(text):
        info.append((t, v))

    return info

def get_urls(page_url):
    '''gets product urls from a page'''
    p = re.compile(r&quot;&lt;div class='p-name'&gt;&lt;a target='_blank' href='(.*?)'&gt;&quot;, re.S)
    text = urlopen(page_url).read()

    urls = []
    for url in p.findall(text):
        urls.append(url)

    return urls

def get_page_urls():
    '''creates urls of the pages'''
    page_urls = []
    for i in range(1, 23):
        page_urls.append('http://www.360buy.com/products/670-671-672-0-0-0-0-0-0-0-1-1-%d.html'% i)
    return page_urls

def product_worker(product_url_queue):
    '''thread of product worker, downloads product info'''
    global g_mutex, f, g_c, g_done
    while not g_done or product_url_queue.qsize() &gt; 0:
        url = product_url_queue.get()
        try:
            info = get_info(url)
        except Exception, e:
            product_url_queue.put(url)
            print e
            continue

        g_mutex.acquire()
        print '==&gt;', g_c
        g_c += 1
        for t, v in info:
            f.write(t + ':::' + v + '\n')
        f.write('\n#####\n')
        f.flush()
        g_mutex.release()

def page_urls_worker(product_url_queue, page_url):
    '''thread function of page urls worker, downloads page urls'''
    for product_url in get_urls(page_url):
        product_url_queue.put(product_url)
        print '.'

f = open('data.txt', 'w')   # output file
g_c = 0                     # counter, for telling us the process
g_done = False              # end flag
g_mutex = threading.Lock()  # mutex

def main():
    global g_done
    threading_pool = []
    q = Queue.Queue()
    num_product_worker = 50

    for i in range(num_product_worker):
        th = threading.Thread(target=product_worker, args=(q,))
        threading_pool.append(th)
        th.start()

    page_urls_worker_pool = []
    for page_url in get_page_urls():
        pth = threading.Thread(target=page_urls_worker, args=(q, page_url))
        pth.start()
        page_urls_worker_pool.append(pth)

    for th in page_urls_worker_pool:
        threading.Thread.join(th)

    g_done = True

    for th in threading_pool:
        threading.Thread.join(th)

if __name__=='__main__':
    main()
</pre>
<p>输出如下的文件：<br />
<a href="http://everet.org/wp-content/uploads/2012/02/QQ截图20120217192017.png" rel="lightbox[532]"><img class="alignnone size-full wp-image-538" title="QQ截图20120217192017" src="http://everet.org/wp-content/uploads/2012/02/QQ截图20120217192017.png" alt="" width="428" height="852" /></a></pre>
]]></content:encoded>
			<wfw:commentRss>http://everet.org/2012/02/python-crawl-jingdong.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>两台Burst.Net主机传输文件真快</title>
		<link>http://everet.org/2012/02/burst-net-transfer.html</link>
		<comments>http://everet.org/2012/02/burst-net-transfer.html#comments</comments>
		<pubDate>Mon, 13 Feb 2012 05:28:31 +0000</pubDate>
		<dc:creator>Stupid ET</dc:creator>
				<category><![CDATA[我的生活]]></category>

		<guid isPermaLink="false">http://everet.org/?p=526</guid>
		<description><![CDATA[在两台主机间传数据真快啊，不过也说明是100Mb的网，可惜可惜。 2月8日，burst出了优惠码，我决定用优惠码，有个8折，而且以后都是8折，还好。]]></description>
			<content:encoded><![CDATA[<p>在两台主机间传数据真快啊，不过也说明是100Mb的网，可惜可惜。</p>
<p>2月8日，burst出了优惠码，我决定用优惠码，有个8折，而且以后都是8折，还好。</p>
<p><a href="http://everet.org/wp-content/uploads/2012/02/image3.png" rel="lightbox[526]"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://everet.org/wp-content/uploads/2012/02/image_thumb3.png" width="654" height="121" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://everet.org/2012/02/burst-net-transfer.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>搭好了FTP服务器，用户体验好多啦</title>
		<link>http://everet.org/2012/02/ftp.html</link>
		<comments>http://everet.org/2012/02/ftp.html#comments</comments>
		<pubDate>Sat, 11 Feb 2012 09:43:21 +0000</pubDate>
		<dc:creator>Stupid ET</dc:creator>
				<category><![CDATA[我的生活]]></category>

		<guid isPermaLink="false">http://everet.org/?p=512</guid>
		<description><![CDATA[刚刚无聊想了下，还是搭个FTP服务器让别人上传文件方便些，于是就开工了，花了点时间配了下vsftpd，据说还支持ipv6，不过在家没法测试。于是同志们终于可以用FTP直接操控自己网页的文件了，以前直接丢个shell给别人这样用户体验不太好啊~呵呵~ 有个ftp直接修改文件，这样也方便很多了。 努力~~~]]></description>
			<content:encoded><![CDATA[<p>刚刚无聊想了下，还是搭个FTP服务器让别人上传文件方便些，于是就开工了，花了点时间配了下vsftpd，据说还支持ipv6，不过在家没法测试。于是同志们终于可以用FTP直接操控自己网页的文件了，以前直接丢个shell给别人这样用户体验不太好啊~呵呵~</p>
<p>有个ftp直接修改文件，这样也方便很多了。</p>
<p>努力~~~</p>
]]></content:encoded>
			<wfw:commentRss>http://everet.org/2012/02/ftp.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>服务器迁移告一段落</title>
		<link>http://everet.org/2012/02/server-migration.html</link>
		<comments>http://everet.org/2012/02/server-migration.html#comments</comments>
		<pubDate>Fri, 10 Feb 2012 07:23:41 +0000</pubDate>
		<dc:creator>Stupid ET</dc:creator>
				<category><![CDATA[我的生活]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://everet.org/?p=501</guid>
		<description><![CDATA[原来的主机是基于Xen的，价格非常的贵，于是现在换了基于OpenVZ的burst.net的主机，性能虽然可能比不上原来的，但是便宜了不少。内存从128MB换成了512MB，不过价格便宜了一半。感觉速度还是快了很多很多啊~而且还有原生的ipv6的支持，不再需要借助tunnelbreaker，真是校网的救星。 不过想起昨天还真是悲剧，开通了10分钟84就将账号发给我，但是竟然没有ip地址，这真是奇葩啊。于是发了ticket就去闲逛了，我们比他们晚13个小时，他们上午8点上班，也就是我们的晚上9点。于是晚上9点多就有人回复解决了问题，把问题修复了，并且把ip重新发了。然后技术支持很好心的问了还有什么需要帮忙，然后就再顺便帮忙分配了一些ipv6的地址。 于是今天开工迁移了。这次将网站都迁移过去了，等过几天再把Git版本库也迁移过去。 原来的主机用的是nginx（发音同 engine x），换到burst.net后默认就装了apache，于是就决定换回apache了，重新配置了下换成worker模式，感觉和nginx差不多吧。 在如下python写的简单的压力测试下服务器基本也没什么压力。 现在服务器上挂了4个wordpress，也没什么压力。 前几天在原来的服务器上用nginx+webpy写个几个查看信息的页面，webpy就占了60MB的内存，而且发了几百个并发就死了，这让我情何以堪。可能是我的配置有问题，不过内存还是比较无语的问题，所以还是找找更轻量级的实现了。]]></description>
			<content:encoded><![CDATA[<p>原来的主机是基于Xen的，价格非常的贵，于是现在换了基于OpenVZ的burst.net的主机，性能虽然可能比不上原来的，但是便宜了不少。内存从128MB换成了512MB，不过价格便宜了一半。感觉速度还是<strong>快</strong>了很多很多啊~而且还有原生的<strong>ipv6</strong>的支持，不再需要借助tunnelbreaker，真是校网的救星。</p>
<p>不过想起昨天还真是悲剧，开通了10分钟84就将账号发给我，但是竟然没有ip地址，这真是奇葩啊。于是发了ticket就去闲逛了，我们比他们晚13个小时，他们上午8点上班，也就是我们的晚上9点。于是晚上9点多就有人回复解决了问题，把问题修复了，并且把ip重新发了。然后技术支持很好心的问了还有什么需要帮忙，然后就再顺便帮忙分配了一些ipv6的地址。</p>
<p><a href="http://everet.org/wp-content/uploads/2012/02/QQ截图20120210155314.jpg" rel="lightbox[501]"><img class="alignnone size-medium wp-image-507" title="QQ截图20120210155314" src="http://everet.org/wp-content/uploads/2012/02/QQ截图20120210155314-640x578.jpg" alt="" width="640" height="578" /></a></p>
<p>于是今天开工迁移了。这次将网站都迁移过去了，等过几天再把Git版本库也迁移过去。</p>
<p>原来的主机用的是nginx（发音同 engine x），换到burst.net后默认就装了apache，于是就决定换回apache了，重新配置了下换成worker模式，感觉和nginx差不多吧。</p>
<p>在如下python写的简单的压力测试下服务器基本也没什么压力。<span id="more-501"></span></p>
<pre class="brush: python; title: ; notranslate">
#!/usr/bin/python
from urllib import urlopen
import threading

class Flood(threading.Thread):
    def run(self):
        for i in range(100):
            url = urlopen('http://everet.org/2012/02/how-to-open-sack.html')
            print url.getcode()
q = []
for i in range(50):
    t = Flood()
    t.start()
    q.append(t)
for i in q:
    i.join()

#
</pre>
<p><a href="http://everet.org/wp-content/uploads/2012/02/image.png" rel="lightbox[501]"><img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://everet.org/wp-content/uploads/2012/02/image_thumb.png" alt="image" width="581" height="318" border="0" /></a></p>
<p>现在服务器上挂了4个wordpress，也没什么压力。</p>
<p>前几天在原来的服务器上用nginx+webpy写个几个查看信息的页面，webpy就占了60MB的内存，而且发了几百个并发就死了，这让我情何以堪。可能是我的配置有问题，不过内存还是比较无语的问题，所以还是找找更轻量级的实现了。</p>
]]></content:encoded>
			<wfw:commentRss>http://everet.org/2012/02/server-migration.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>[分享]如何拆米袋的缝合线</title>
		<link>http://everet.org/2012/02/how-to-open-sack.html</link>
		<comments>http://everet.org/2012/02/how-to-open-sack.html#comments</comments>
		<pubDate>Fri, 10 Feb 2012 03:17:35 +0000</pubDate>
		<dc:creator>Stupid ET</dc:creator>
				<category><![CDATA[我的分享]]></category>

		<guid isPermaLink="false">http://everet.org/?p=495</guid>
		<description><![CDATA[今天家里的米用完了，我爸让我拆米袋，于是想看看怎么正确地拆米袋的先。 以前每次都是非常麻烦地的拿个剪刀慢慢剪，要剪很久才能剪开，今天上网找了下，发现还真有方法，一试就轻松打开了米袋的缝合线。 四句话：双线对着我，须从左边扯，剪断出线头，两边一拉的。 双线对着我：是说面对面袋、米袋封口的双线。 须从左边扯：是说从左边拆。 剪断出线头：是说剪断封口处多余的线头。 两边一拉的：是说剪断出线头后，会出现两个线头，一手拉一个线头，向两边拉，封口就开了。 正规封口机封的口很好拆，不正规封口机封的口很难拆。 此法只给还不会拆米袋的缝合线菜鸟们看的： 1、看一下米袋的缝合线，两面是不同的。如图1： 2、沿米袋边，在X处，用剪刀把线剪断（一定要在红色的箭头方向）。如图2： 3、把A面的双线环形处的断线清理干净。如图3： 4、在B面的箭头方向X处拿住缝合线，只要轻轻地一拉，应该能顺利的把袋口拆开。如图4： 以上方法只适用于单线缝合的，如果是用双线缝合的，那A面更复杂些，折线时也更难些。其方法是：（到上述的第4步时），B面只能拉几针（就拉不了），接下来拉A面的线头（也只能拉几针），再拉B面的线头，这样只能反复地拉两面的线头，才能拆完。]]></description>
			<content:encoded><![CDATA[<p>今天家里的米用完了，我爸让我拆米袋，于是想看看怎么正确地拆米袋的先。</p>
<p>以前每次都是非常麻烦地的拿个剪刀慢慢剪，要剪很久才能剪开，今天上网找了下，发现还真有方法，一试就轻松打开了米袋的缝合线。</p>
<p>四句话：双线对着我，须从左边扯，剪断出线头，两边一拉的。<br />
双线对着我：是说面对面袋、米袋封口的双线。<br />
须从左边扯：是说从左边拆。<br />
剪断出线头：是说剪断封口处多余的线头。<br />
两边一拉的：是说剪断出线头后，会出现两个线头，一手拉一个线头，向两边拉，封口就开了。<br />
正规封口机封的口很好拆，不正规封口机封的口很难拆。</p>
<p><br clear="all" />此法只给还不会拆米袋的缝合线菜鸟们看的：</p>
<p>1、看一下米袋的缝合线，两面是不同的。如图1：</p>
<p>2、沿米袋边，在X处，用剪刀把线剪断（一定要在红色的箭头方向）。如图2：</p>
<p>3、把A面的双线环形处的断线清理干净。如图3：</p>
<p>4、在B面的箭头方向X处拿住缝合线，只要轻轻地一拉，应该能顺利的把袋口拆开。如图4：</p>
<p><span id="more-495"></span></p>
<p><a href="http://everet.org/wp-content/uploads/2012/02/48462a89n856a3bab73e7690.jpg" rel="lightbox[495]"><img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="48462a89n856a3bab73e7&amp;690" src="http://everet.org/wp-content/uploads/2012/02/48462a89n856a3bab73e7690_thumb.jpg" alt="48462a89n856a3bab73e7&amp;690" width="200" height="120" border="0" /></a></p>
<p><a href="http://everet.org/wp-content/uploads/2012/02/48462a89n856a3d9dfb83690.jpg" rel="lightbox[495]"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="48462a89n856a3d9dfb83&amp;690" src="http://everet.org/wp-content/uploads/2012/02/48462a89n856a3d9dfb83690_thumb.jpg" alt="48462a89n856a3d9dfb83&amp;690" width="200" height="127" border="0" /></a></p>
<p><a href="http://everet.org/wp-content/uploads/2012/02/48462a89n856a4344db11690.jpg" rel="lightbox[495]"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="48462a89n856a4344db11&amp;690" src="http://everet.org/wp-content/uploads/2012/02/48462a89n856a4344db11690_thumb.jpg" alt="48462a89n856a4344db11&amp;690" width="200" height="85" border="0" /></a></p>
<p><a href="http://everet.org/wp-content/uploads/2012/02/48462a89n8545e08bd16f690.jpg" rel="lightbox[495]"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="48462a89n8545e08bd16f&amp;690" src="http://everet.org/wp-content/uploads/2012/02/48462a89n8545e08bd16f690_thumb.jpg" alt="48462a89n8545e08bd16f&amp;690" width="200" height="127" border="0" /></a></p>
<p>以上方法只适用于单线缝合的，如果是用双线缝合的，那A面更复杂些，折线时也更难些。其方法是：（到上述的第4步时），B面只能拉几针（就拉不了），接下来拉A面的线头（也只能拉几针），再拉B面的线头，这样只能反复地拉两面的线头，才能拆完。</p>
]]></content:encoded>
			<wfw:commentRss>http://everet.org/2012/02/how-to-open-sack.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Clover数据结构</title>
		<link>http://everet.org/2012/02/clover-data-structure.html</link>
		<comments>http://everet.org/2012/02/clover-data-structure.html#comments</comments>
		<pubDate>Mon, 06 Feb 2012 13:09:44 +0000</pubDate>
		<dc:creator>Stupid ET</dc:creator>
				<category><![CDATA[我的分享]]></category>
		<category><![CDATA[Clover]]></category>

		<guid isPermaLink="false">http://www.everet.org/?p=481</guid>
		<description><![CDATA[论文： http://www.om.sist.chukyo-u.ac.jp/main/research/origami/journal/jvca.html#conclusions]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.everet.org/wp-content/uploads/2012/02/fig6.gif" rel="lightbox[481]"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="fig6" border="0" alt="fig6" src="http://www.everet.org/wp-content/uploads/2012/02/fig6_thumb.gif" width="281" height="506" /></a></p>
<p><span id="more-481"></span>
<p><a href="http://www.everet.org/wp-content/uploads/2012/02/fig7.gif" rel="lightbox[481]"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="fig7" border="0" alt="fig7" src="http://www.everet.org/wp-content/uploads/2012/02/fig7_thumb.gif" width="320" height="488" /></a></p>
<p>论文：</p>
<p><a href="http://www.om.sist.chukyo-u.ac.jp/main/research/origami/journal/jvca.html#conclusions" target="_blank">http://www.om.sist.chukyo-u.ac.jp/main/research/origami/journal/jvca.html#conclusions</a></p>
]]></content:encoded>
			<wfw:commentRss>http://everet.org/2012/02/clover-data-structure.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>《Unix网络编程》的代码在Ubuntu上编译</title>
		<link>http://everet.org/2012/02/unix-network-programming-compile-on-ubuntu.html</link>
		<comments>http://everet.org/2012/02/unix-network-programming-compile-on-ubuntu.html#comments</comments>
		<pubDate>Mon, 06 Feb 2012 09:44:10 +0000</pubDate>
		<dc:creator>Stupid ET</dc:creator>
				<category><![CDATA[我的分享]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.everet.org/?p=469</guid>
		<description><![CDATA[书的示例代码在 http://pix.cs.olemiss.edu/csci561/prg561.1.html 我在Ubuntu 10.10上编译会出现错误如下错误 tcpservpoll01.c: In function ‘main’: tcpservpoll01.c:13: error: ‘OPEN_MAX’ undeclared (first use in this function) tcpservpoll01.c:13: error: (Each undeclared identifier is reported only once tcpservpoll01.c:13: error: for each function it appears in.) tcpservpoll01.c:13: warning: unused variable ‘client’ make: *** [tcpservpoll01.o] Error 1 解决方案是去定义一下OPEN_MAX它。 我们在unp.h里面加上 #define OPEN_MAX 1024 就好了。 设为1024的原因见 http://blog.chinaunix.net/space.php?uid=23242876&#38;do=blog&#38;id]]></description>
			<content:encoded><![CDATA[<p>书的示例代码在 <a href="http://pix.cs.olemiss.edu/csci561/prg561.1.html" target="_blank">http://pix.cs.olemiss.edu/csci561/prg561.1.html</a></p>
<p>我在Ubuntu 10.10上编译会出现错误如下错误</p>
<blockquote><p>tcpservpoll01.c: In function ‘main’:<br />
tcpservpoll01.c:13: error: ‘OPEN_MAX’ undeclared (first use in this function)<br />
tcpservpoll01.c:13: error: (Each undeclared identifier is reported only once<br />
tcpservpoll01.c:13: error: for each function it appears in.)<br />
tcpservpoll01.c:13: warning: unused variable ‘client’<br />
make: *** [tcpservpoll01.o] Error 1<br />
解决方案是去定义一下OPEN_MAX它。</p></blockquote>
<p>我们在unp.h里面加上</p>
<blockquote><p>#define OPEN_MAX 1024</p></blockquote>
<p>就好了。</p>
<p>设为1024的原因见 <a href="http://blog.chinaunix.net/space.php?uid=23242876&amp;do=blog&amp;id=2480261" target="_blank">http://blog.chinaunix.net/space.php?uid=23242876&amp;do=blog&amp;id=2480261</a></p>
]]></content:encoded>
			<wfw:commentRss>http://everet.org/2012/02/unix-network-programming-compile-on-ubuntu.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.764 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2012-02-21 14:38:08 -->

