<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Lua on Shell&#39;s Home</title>
		<link>//blog.shell909090.org/tags/lua/</link>
		<description>Recent content in Lua on Shell&#39;s Home</description>
		<generator>Hugo</generator>
		<language>en-us</language>
		
		
		
			<copyright>CC-BY-SA4.0</copyright>
		
		
			<lastBuildDate>Fri, 15 Jun 2012 07:19:45 +0800</lastBuildDate>
		
			<atom:link href="//blog.shell909090.org/tags/lua/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>快速深入一门语言的几个问题</title>
				<link>//blog.shell909090.org/blog/archives/2194/</link>
				<pubDate>Fri, 15 Jun 2012 07:19:45 +0800</pubDate>
				<guid>//blog.shell909090.org/blog/archives/2194/</guid>
				<description>&lt;p&gt;劳资明天要结婚了，今天婚前最后一个blog。&lt;/p&gt;&#xA;&lt;p&gt;1.hello, world&lt;/p&gt;&#xA;&lt;p&gt;目标：屏幕上打印出hello, world。&lt;/p&gt;&#xA;&lt;p&gt;原因：不解释。&lt;/p&gt;&#xA;&lt;p&gt;进阶：当命令行给与不同参数的时候，打印hello,&lt;/p&gt;&#xA;&lt;p&gt;名字。给与开关的时候，打印hello, 123。&lt;/p&gt;&#xA;&lt;p&gt;2.正则提取&lt;/p&gt;&#xA;&lt;p&gt;目标：写一个正则表达式(或者类似的东西)，从一段网页源码中找到某个标签的内容，去掉前后空格，显示。&lt;/p&gt;&#xA;&lt;p&gt;原因：测试字符串处理能力。&lt;/p&gt;&#xA;&lt;p&gt;进阶：支持正则扩展&lt;/p&gt;&#xA;&lt;p&gt;3.扫描排重&lt;/p&gt;&#xA;&lt;p&gt;目标：将某个目录和子目录下的所有文件扫描，排除重复的文件。&lt;/p&gt;&#xA;&lt;p&gt;原因：测试文件系统操作能力。&lt;/p&gt;&#xA;&lt;p&gt;进阶：多线程处理，注意吞吐颠簸。&lt;/p&gt;&#xA;&lt;p&gt;4.做24点自动计算程序&lt;/p&gt;&#xA;&lt;p&gt;目标：写一个程序，能够计算24点。要求能够自定义扩展算符。&lt;/p&gt;&#xA;&lt;p&gt;原因：检查深度优先搜索，栈，结构设计，抽象处理能力等等。&lt;/p&gt;&#xA;&lt;p&gt;进阶：做并发处理。有数种语言可能无法实现并发，或并发实现难度大，不美观，例如python。&lt;/p&gt;&#xA;&lt;p&gt;5.做一个计算器&lt;/p&gt;&#xA;&lt;p&gt;目标：做一个计算器，要求能计算1+2*3=7，并支持()。&lt;/p&gt;&#xA;&lt;p&gt;原因：表达式解析和处理需要用到程序的方方面面，字符串处理等等。&lt;/p&gt;&#xA;&lt;p&gt;进阶：做一个本语言的eval函数出来。&lt;/p&gt;&#xA;&lt;p&gt;7.抓网页&lt;/p&gt;&#xA;&lt;p&gt;目标：实现一个服务，定期下载符合规则的一批网页，解析，获得格式化的数据，并存入数据库。&lt;/p&gt;&#xA;&lt;p&gt;原因：测试系统开发能力，基础网络库，字符串处理能力。&lt;/p&gt;&#xA;&lt;p&gt;进阶：分布化抓取。&lt;/p&gt;&#xA;&lt;p&gt;8.留言板&lt;/p&gt;&#xA;&lt;p&gt;目标：设计一个留言板，将所有人提交的话保存起来，能一并展示。提交不需验证，展示不需分页。&lt;/p&gt;&#xA;&lt;p&gt;原因：测试网络服务能力，数据库支持和多国语言支持。&lt;/p&gt;&#xA;&lt;p&gt;进阶：防止XSS攻击。&lt;/p&gt;&#xA;&lt;p&gt;9.异步大并发服务器&lt;/p&gt;&#xA;&lt;p&gt;目标：设计一个异步http服务器，能对请求做出响应，添加，删除，修改数据库中的数据。不得使用现有的http框架和容器。&lt;/p&gt;&#xA;&lt;p&gt;原因：集成性测试&lt;/p&gt;&#xA;&lt;p&gt;进阶：不使用现有数据库，自己写一个。。。&lt;/p&gt;</description>
			</item>
			<item>
				<title>语言的效率差异2</title>
				<link>//blog.shell909090.org/blog/archives/2174/</link>
				<pubDate>Fri, 18 May 2012 07:14:24 +0800</pubDate>
				<guid>//blog.shell909090.org/blog/archives/2174/</guid>
				<description>&lt;h1 id=&#34;问题&#34;&gt;问题&lt;/h1&gt;&#xA;&lt;p&gt;为了更深入的测试语言，我做了一个经典问题——24点。&lt;/p&gt;&#xA;&lt;p&gt;这个问题主要是测试递归，循环效率，还有数组和树的复制性能。&lt;/p&gt;&#xA;&lt;p&gt;为了简化问题，方便测试，我的问题是这样描述的：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;有一个数组，里面有多个正整数。有一个操作数组，其中每个都是双目操作符。找出以两者构成算式，其值等于给定值的所有表达式组合。&#xA;要求不得遗漏，可以有少量重复。例如可交换算符的交换同构暂不做排重。&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;实际运行的时候，取+-*/和3 4 6 8，运行100次，查看时间消耗。正确的单次输出结果应当是这样的。&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;(((8 + 4) / 3) * 6) = 24&#xA;(6 / (3 / (8 + 4))) = 24&#xA;(((8 + 4) * 6) / 3) = 24&#xA;(((8 / 4) + 6) * 3) = 24&#xA;(((8 - 6) * 3) * 4) = 24&#xA;(((8 - 6) * 4) * 3) = 24&#xA;(((3 * 4) - 8) * 6) = 24&#xA;((8 - (6 / 3)) * 4) = 24&#xA;(((4 + 8) / 3) * 6) = 24&#xA;(6 / (3 / (4 + 8))) = 24&#xA;(((4 + 8) * 6) / 3) = 24&#xA;(((8 / 4) + 6) * 3) = 24&#xA;(((4 * 3) - 8) * 6) = 24&#xA;(((8 - 6) * 3) * 4) = 24&#xA;(((8 - 6) * 4) * 3) = 24&#xA;((8 - (6 / 3)) * 4) = 24&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h1 id=&#34;python&#34;&gt;python&lt;/h1&gt;&#xA;&lt;p&gt;python的解很复杂，长达31行，以下是我写的解。当然，还有更简单的版本，我可以用eval来干这个事情，代码只有24行，但是确实给人很evil的感觉。&lt;/p&gt;</description>
			</item>
			<item>
				<title>语言的效率差异1</title>
				<link>//blog.shell909090.org/blog/archives/2172/</link>
				<pubDate>Mon, 14 May 2012 02:52:27 +0800</pubDate>
				<guid>//blog.shell909090.org/blog/archives/2172/</guid>
				<description>&lt;h1 id=&#34;问题&#34;&gt;问题&lt;/h1&gt;&#xA;&lt;p&gt;为了测试语言的效率，做一个正则解析。&lt;/p&gt;&#xA;&lt;p&gt;预先说好，正则解析的问题是老板正在做的一个实际问题，我把其他和效率无关的部分去了。因此我接受“用法不正确”这样的反驳理由，但是不接受“这不是典型用例”的理由。我欢迎你指正我的用法错误，或者对语言不了解导致的效率低下，但是别来和我吵吵这种例子太特殊。另外，在调整代码和评估速度的时候，顺便注意一下代码行数。我知道用汇编逐行写和优化会很优秀，但是这对实际工作基本没有帮助。&lt;/p&gt;&#xA;&lt;p&gt;问题是这样的：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;有一个文本文件，每行两个数，要求解析出来这两个数。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;我用python生成了数据，代码是这样的&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;with open(sys.argv[1], &#39;w&#39;) as fo:&#xA;&#x9;for i in xrange(500000):&#xA;&#x9;&#x9;fo.write(&#39;%d %dn&#39; % (i, random.randint(0, 10000)))&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;正则分析速率，是个典型的CPU密集操作。对于非编译型语言而言(这里的编译是指正则表达式的解析预编译，实际上除了lisp还真没有编译型的，即使是go也是现场拿到正则进行解析的)，这主要是看正则库的实现效率。很多时候，语言的效率问题并不取决于语言本身，还取决于语言的库的实现。大部分情况下我们都不可能砍掉系统的库重新来一个，那还不如换一门语言。&lt;/p&gt;&#xA;&lt;h1 id=&#34;python&#34;&gt;python&lt;/h1&gt;&#xA;&lt;p&gt;我首先贴出python语言的解答。&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;reline = re.compile(&#39;(d+) (d+)&#39;)&#xA;def main():&#xA;&#x9;with open(sys.argv[1], &#39;r&#39;) as fi:&#xA;&#x9;&#x9;for line in fi: reline.match(line).groups()&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;这是性能&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;real  0m0.466s&#xA;user  0m0.436s&#xA;sys   0m0.012s&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h1 id=&#34;common-lisp&#34;&gt;common lisp&lt;/h1&gt;&#xA;&lt;p&gt;我找了N个正则包，实际能用的只有ppcre。有些包号称很快，实际测试下来还不如ppcre。&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;(require :cl-ppcre)&#xA;&#xA;(defun grepfile (filename)&#xA;  (let*&#xA;&#x9;  ((cl-ppcre:*use-bmh-matchers* t)&#xA;&#x9;   (cl-ppcre:*regex-char-code-limit* 256)&#xA;&#x9;   (scanner&#xA;&#x9;(cl-ppcre:create-scanner &amp;quot;d+ d+&amp;quot;)))&#xA;&#x9;(with-open-file (in filename)&#xA;&#x9;  (loop&#xA;&#x9; for line = (read-line in nil) while line do&#xA;&#x9;   (cl-ppcre:split scanner line)))))&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;代码在slime里面测试(time (grepfile &amp;ldquo;data.dat&amp;rdquo;))，下面是结果&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
