<?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>南柯一梦</title>
	<atom:link href="http://www.lfyzjck.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.lfyzjck.com</link>
	<description>专注互联网、IT行业</description>
	<lastBuildDate>Fri, 18 Nov 2011 15:25:52 +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>HP Veer入手小记</title>
		<link>http://www.lfyzjck.com/2011-11-18/565.html</link>
		<comments>http://www.lfyzjck.com/2011-11-18/565.html#comments</comments>
		<pubDate>Fri, 18 Nov 2011 14:53:05 +0000</pubDate>
		<dc:creator>南柯一梦</dc:creator>
				<category><![CDATA[杂谈]]></category>
		<category><![CDATA[Veer]]></category>
		<category><![CDATA[WebOS]]></category>

		<guid isPermaLink="false">http://www.lfyzjck.com/?p=565</guid>
		<description><![CDATA[由于之前的触屏手机不能摸了，加上手头紧张，千挑万选之下发现了HP Veer这个机器。到现在为止入手HP Veer有小半个月了，经过几番折腾终于达到能用状态了，写篇文章纪念下。不得不说WebOS是个发育不健全的系统，虽然也有很多优秀的地方。 1、外观 Veer的尺寸很小，只有3.1英寸，大概就是横放在手掌心里，刚好能占据一半的面积。只有你把键盘滑出来，拿在手里才会觉得踏实，否则就有种随时都会从你手中溜走的感觉，以至于现在上厕所都不敢再看手机了。就这点来说，Veer的尺寸和外观的确比较适合女性。右上方有电源/锁屏键，还有一个静音键（我觉得这个有些多余），右侧是usb以及耳机扩展槽的接口。Veer的USB接口设计这里需要单独提下，USB线跟手机连接的一端通过磁石吸附到手机的接口上，很独特而且感觉非常舒服，但仅限感觉。实际用的过程中就会发现，由于没有传统接口那样的插槽，USB连接很不牢固，很容易断开。充电或者跟电脑连接的时候，你不得不小心翼翼的把手机摆好，而且不能乱碰。 再说说键盘吧，按键本身包括按键的间隔都非常小，得用指甲盖才能准确按到，手大的人要尤其注意了。全键盘输入习惯后还算流畅，问题不大。 2、操作体验 这个是WebOS最值得一提的地方了。Veer的硬件还算给力，800MHZ的CPU，512MB RAM + 8GB ROM，配合WebOS操作非常流畅，这点上远胜Android（曾经的Hero用户泪奔）。卡片式的界面很有爱而且确实很方便，手势输入很强大。照相机没有闪光灯，不过拍照质量和速度都不错。最给力的还是游戏了，可玩的比较多，而且画面流畅，对比650元的价格，不得不说性价比超值。（低端Android机在这点可能也要被秒杀了） 3、软件 通讯录和邮件方面都没有问题，用Google Sync或者Exchange都可以轻松搞定，Calendar同步需要打个补丁，理所当然的没有农历。 由于第三方软件相对贫乏，追求便利性的话还是绕道玩Android比较好。当然常用的QQ，Renren，新浪微博的客户端还是有的，地图暂时没找到合适且能用的，于是GPS就成了摆设。 中文输入法虽然差强人意，不过还好有而且能用。HP收购WebOS后大概没考虑过进入中国市场（当然现在更加不可能），WebOS完全没有针对中文用户的优化（我本来想用“几乎”的，但仔细想想确实没有）。界面想改成中文也需要装个蛋疼的补丁，而且会引发其他奇怪的问题。所以我很淡定的到现在也还在看着英文界面。 浏览器目前还没第三方的，自带的效果好但是耗流量，看看专门手机版的网页还是没什么压力。对我这种打开浏览器只看GR的人来说，更是无所谓的事情。J2ME版的UC虽然能用，但也是一蛋疼的货，嫌麻烦的直接忽略吧。 最后来吐槽下Veer的重力感应系统，系统没有提供可以关闭重力感应的地方，于是有时候侧躺下看手机的时候，竖着拿手机屏幕会横过来，横着拿手机屏幕会竖过来，然后就有点想骂人的冲动。 4、结论 单纯的看硬件配置，这个价格很划算；单纯想体验吧WebOS,Veer也是不错的选择；单纯每天发发短信打打电话，偶尔用游戏打发下时间的人，Veer也挺适合；单纯想装B的人，这个机器拿出去也很拉风，撞机概率小的一塌糊涂，真的撞机了我也强烈建议认识下会买Veer的那个人。但是如果期待Veer像iPhone或者Android给您生活带来便利，不好意思，这个机器是用来折腾您的，不是供您折腾的。 热门日志豆瓣风格的Wordpress主题数独(soduku)解法——基于Python的实现图书馆自动续借系统更换域名到lfyzjck.com各种排序算法(Python实现)]]></description>
			<content:encoded><![CDATA[<p>    由于之前的触屏手机不能摸了，加上手头紧张，千挑万选之下发现了HP Veer这个机器。到现在为止入手HP Veer有小半个月了，经过几番折腾终于达到能用状态了，写篇文章纪念下。不得不说WebOS是个发育不健全的系统，虽然也有很多优秀的地方。</p>
<p><strong>1、外观</strong></p>
<p>    Veer的尺寸很小，只有3.1英寸，大概就是横放在手掌心里，刚好能占据一半的面积。只有你把键盘滑出来，拿在手里才会觉得踏实，否则就有种随时都会从你手中溜走的感觉，以至于现在上厕所都不敢再看手机了。就这点来说，Veer的尺寸和外观的确比较适合女性。右上方有电源/锁屏键，还有一个静音键（我觉得这个有些多余），右侧是usb以及耳机扩展槽的接口。Veer的USB接口设计这里需要单独提下，USB线跟手机连接的一端通过磁石吸附到手机的接口上，很独特而且感觉非常舒服，但仅限感觉。实际用的过程中就会发现，由于没有传统接口那样的插槽，USB连接很不牢固，很容易断开。充电或者跟电脑连接的时候，你不得不小心翼翼的把手机摆好，而且不能乱碰。</p>
<p>    再说说键盘吧，按键本身包括按键的间隔都非常小，得用指甲盖才能准确按到，手大的人要尤其注意了。全键盘输入习惯后还算流畅，问题不大。</p>
<p><strong>2、操作体验</strong></p>
<p>    这个是WebOS最值得一提的地方了。Veer的硬件还算给力，800MHZ的CPU，512MB RAM + 8GB ROM，配合WebOS操作非常流畅，这点上远胜Android（曾经的Hero用户泪奔）。卡片式的界面很有爱而且确实很方便，手势输入很强大。照相机没有闪光灯，不过拍照质量和速度都不错。最给力的还是游戏了，可玩的比较多，而且画面流畅，对比650元的价格，不得不说性价比超值。（低端Android机在这点可能也要被秒杀了）</p>
<p><span id="more-565"></span></p>
<p><strong>3、软件</strong></p>
<p>    通讯录和邮件方面都没有问题，用Google Sync或者Exchange都可以轻松搞定，Calendar同步需要打个补丁，理所当然的没有农历。<br />
    由于第三方软件相对贫乏，追求便利性的话还是绕道玩Android比较好。当然常用的QQ，Renren，新浪微博的客户端还是有的，地图暂时没找到合适且能用的，于是GPS就成了摆设。<br />
    中文输入法虽然差强人意，不过还好有而且能用。HP收购WebOS后大概没考虑过进入中国市场（当然现在更加不可能），WebOS完全没有针对中文用户的优化（我本来想用“几乎”的，但仔细想想确实没有）。界面想改成中文也需要装个蛋疼的补丁，而且会引发其他奇怪的问题。所以我很淡定的到现在也还在看着英文界面。<br />
    浏览器目前还没第三方的，自带的效果好但是耗流量，看看专门手机版的网页还是没什么压力。对我这种打开浏览器只看GR的人来说，更是无所谓的事情。J2ME版的UC虽然能用，但也是一蛋疼的货，嫌麻烦的直接忽略吧。</p>
<p>    最后来吐槽下Veer的重力感应系统，系统没有提供可以关闭重力感应的地方，于是有时候侧躺下看手机的时候，竖着拿手机屏幕会横过来，横着拿手机屏幕会竖过来，然后就有点想骂人的冲动。</p>
<p><strong>4、结论</strong></p>
<p>    单纯的看硬件配置，这个价格很划算；单纯想体验吧WebOS,Veer也是不错的选择；单纯每天发发短信打打电话，偶尔用游戏打发下时间的人，Veer也挺适合；单纯想装B的人，这个机器拿出去也很拉风，撞机概率小的一塌糊涂，真的撞机了我也强烈建议认识下会买Veer的那个人。但是如果期待Veer像iPhone或者Android给您生活带来便利，不好意思，这个机器是用来折腾您的，不是供您折腾的。</p>
<h2  class="related_post_title">热门日志</h2><ul class="related_post"><li><a href="http://www.lfyzjck.com/2011-05-16/521.html" title="豆瓣风格的Wordpress主题">豆瓣风格的Wordpress主题</a></li><li><a href="http://www.lfyzjck.com/2011-01-12/438.html" title="数独(soduku)解法——基于Python的实现">数独(soduku)解法——基于Python的实现</a></li><li><a href="http://www.lfyzjck.com/2011-04-18/511.html" title="图书馆自动续借系统">图书馆自动续借系统</a></li><li><a href="http://www.lfyzjck.com/2010-03-16/310.html" title="更换域名到lfyzjck.com">更换域名到lfyzjck.com</a></li><li><a href="http://www.lfyzjck.com/2011-05-19/530.html" title="各种排序算法(Python实现)">各种排序算法(Python实现)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.lfyzjck.com/2011-11-18/565.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>在Yii Framework中集成Twig</title>
		<link>http://www.lfyzjck.com/2011-09-24/558.html</link>
		<comments>http://www.lfyzjck.com/2011-09-24/558.html#comments</comments>
		<pubDate>Sat, 24 Sep 2011 06:45:35 +0000</pubDate>
		<dc:creator>南柯一梦</dc:creator>
				<category><![CDATA[PHPer]]></category>
		<category><![CDATA[Twig]]></category>
		<category><![CDATA[Yii Framework]]></category>

		<guid isPermaLink="false">http://www.lfyzjck.com/?p=558</guid>
		<description><![CDATA[Twig是一款快速、安全、灵活的PHP模板引擎，它内置了许多filter和tags，并且支持模板继承，能让你用最简洁的代码来描述你的模板。他的语法和Python下的模板引擎Jinjia以及Django的模板语法都非常像。 比如我们在PHP中需要输出变量并且将其进行转义时，语法比较累赘： 1 2 &#60; ?php echo $var ?&#62; &#60; ?php echo htmlspecialchars&#40;\$var, ENT_QUOTES, 'UTF-8'&#41; ?&#62; 但是在Twig中可以这样写: 1 2 3 {{ var }} {{ var&#124;escape }} {{ var&#124;e }} {# shortcut to escape a variable #} 遍历数组： 1 2 3 &#8230; <a href="http://www.lfyzjck.com/2011-09-24/558.html">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Twig是一款快速、安全、灵活的PHP模板引擎，它内置了许多filter和tags，并且支持模板继承，能让你用最简洁的代码来描述你的模板。他的语法和Python下的模板引擎Jinjia以及Django的模板语法都非常像。<br />
比如我们在PHP中需要输出变量并且将其进行转义时，语法比较累赘：</p>

<div class="wp_codebox"><table><tr id="p5588"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p558code8"><pre class="php" style="font-family:Consolas;"><span style="color: #339933;">&lt;</span> ?php <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$var</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #339933;">&lt;</span> ?php <span style="color: #b1b100;">echo</span> <a href="http://www.php.net/htmlspecialchars"><span style="color: #990000;">htmlspecialchars</span></a><span style="color: #009900;">&#40;</span>\<span style="color: #000088;">$var</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">ENT_QUOTES</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'UTF-8'</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>但是在Twig中可以这样写:</p>

<div class="wp_codebox"><table><tr id="p5589"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p558code9"><pre class="html" style="font-family:Consolas;">{{ var }}
{{ var|escape }}
{{ var|e }}         {# shortcut to escape a variable #}</pre></td></tr></table></div>

<p>遍历数组：</p>

<div class="wp_codebox"><table><tr id="p55810"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p558code10"><pre class="html" style="font-family:Consolas;">{% for user in users %}
  * {{ user.name }}
{% else %}
  No user has been found.
{% endfor %}</pre></td></tr></table></div>

<p><span id="more-558"></span><br />
但是要在Yii Framework集成Twig就会遇到点麻烦了，官方网站中已经有能够集成Twig的方案，所以这里我也不再赘述。但是由于Twig中是不支持PHP语法的，所以在有些表达上会遇到困难，比如我们在写Form的视图时，经常会这么写：</p>

<div class="wp_codebox"><table><tr id="p55811"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code" id="p558code11"><pre class="php" style="font-family:Consolas;"><span style="color: #339933;">&lt;</span> ?php <span style="color: #000088;">$form</span><span style="color: #339933;">=</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">beginWidget</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'CActiveForm'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
	<span style="color: #339933;">&lt;</span>span<span style="color: #339933;">&gt;</span>Login<span style="color: #339933;">&lt;/</span>span<span style="color: #339933;">&gt;</span>
	<span style="color: #339933;">&lt;</span>ul<span style="color: #339933;">&gt;</span>
		<span style="color: #339933;">&lt;</span>li<span style="color: #339933;">&gt;</span>
			<span style="color: #339933;">&lt;</span> ?php <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">label</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$model</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'username'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
			<span style="color: #339933;">&lt;</span> ?php <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">textField</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$model</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'username'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
		<span style="color: #339933;">&lt;/</span>li<span style="color: #339933;">&gt;</span>
		<span style="color: #339933;">&lt;</span>li<span style="color: #339933;">&gt;</span>
			<span style="color: #339933;">&lt;</span> ?php <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">label</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$model</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'password'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
			<span style="color: #339933;">&lt;</span> ?php <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">passwordField</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$model</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'password'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
		<span style="color: #339933;">&lt;/</span>li<span style="color: #339933;">&gt;</span>
		<span style="color: #339933;">&lt;</span>li <span style="color: #000000; font-weight: bold;">class</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;last&quot;</span><span style="color: #339933;">&gt;</span>
			<span style="color: #339933;">&lt;</span>button type<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;submit&quot;</span><span style="color: #339933;">&gt;</span>Login<span style="color: #339933;">&lt;/</span>button<span style="color: #339933;">&gt;</span>
		<span style="color: #339933;">&lt;/</span>li<span style="color: #339933;">&gt;</span>
	<span style="color: #339933;">&lt;/</span>ul<span style="color: #339933;">&gt;</span>
	<span style="color: #339933;">&lt;</span> ?php <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">error</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$model</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'password'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #339933;">&lt;</span> ?php <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">endWidget</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>但是这样的语法是没法在twig中表达的，所以想去扩展下Twig的功能，让他能够支持我们自定义的widget标签，然后自动解析成我们需要的代码。<br />
总共需要两个类：TokenParser和Node，下面直接上代码：</p>

<div class="wp_codebox"><table><tr id="p55812"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
</pre></td><td class="code" id="p558code12"><pre class="php" style="font-family:Consolas;"><span style="color: #339933;">&lt;</span> ?php
<span style="color: #666666; font-style: italic;">/*
 * This file is an extension of Twig.
 *
 * (c) 2010 lfyzjck
 */</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * parser widget tag in Yii framework
 *
 * {% beginwidget 'CActiveForm' as form %}
 *    content of form
 * {% endwidget %}
 *
 */</span>
<span style="color: #000000; font-weight: bold;">class</span> Yii_WidgetBlock_TokenParser <span style="color: #000000; font-weight: bold;">extends</span> Twig_TokenParser
<span style="color: #009900;">&#123;</span>
    <span style="color: #009933; font-style: italic;">/**
     * Parses a token and returns a node.
     *
     * @param Twig_Token $token A Twig_Token instance
     *
     * @return Twig_NodeInterface A Twig_NodeInterface instance
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> parse<span style="color: #009900;">&#40;</span>Twig_Token <span style="color: #000088;">$token</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$lineno</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$token</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$stream</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">parser</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getStream</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$name</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$stream</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">expect</span><span style="color: #009900;">&#40;</span>Twig_Token<span style="color: #339933;">::</span><span style="color: #004000;">STRING_TYPE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$stream</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">test</span><span style="color: #009900;">&#40;</span>Twig_Token<span style="color: #339933;">::</span><span style="color: #004000;">PUNCTUATION_TYPE</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$args</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">parser</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getExpressionParser</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">parseHashExpression</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$args</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Twig_Node_Expression_Array<span style="color: #009900;">&#40;</span><a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$lineno</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000088;">$stream</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">expect</span><span style="color: #009900;">&#40;</span>Twig_Token<span style="color: #339933;">::</span><span style="color: #004000;">NAME_TYPE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$assign</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$stream</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">expect</span><span style="color: #009900;">&#40;</span>Twig_Token<span style="color: #339933;">::</span><span style="color: #004000;">NAME_TYPE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$stream</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">expect</span><span style="color: #009900;">&#40;</span>Twig_Token<span style="color: #339933;">::</span><span style="color: #004000;">BLOCK_END_TYPE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000088;">$body</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">parser</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">subparse</span><span style="color: #009900;">&#40;</span><a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'decideBlockEnd'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$stream</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">expect</span><span style="color: #009900;">&#40;</span>Twig_Token<span style="color: #339933;">::</span><span style="color: #004000;">BLOCK_END_TYPE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> Yii_Node_WidgetBlock<span style="color: #009900;">&#40;</span><a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span>
			<span style="color: #0000ff;">'alias'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$name</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getValue</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
			<span style="color: #0000ff;">'assign'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$assign</span><span style="color: #339933;">,</span>
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$body</span><span style="color: #339933;">,</span> <span style="color: #000088;">$args</span><span style="color: #339933;">,</span> <span style="color: #000088;">$lineno</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getTag</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * Gets the tag name associated with this token parser.
     *
     * @param string The tag name
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getTag<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">'beginwidget'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> decideBlockEnd<span style="color: #009900;">&#40;</span>Twig_Token <span style="color: #000088;">$token</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$token</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">test</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'endwidget'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Yii_Node_WidgetBlock <span style="color: #000000; font-weight: bold;">extends</span> Twig_Node
<span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$attrs</span><span style="color: #339933;">,</span> Twig_NodeInterface <span style="color: #000088;">$body</span><span style="color: #339933;">,</span> Twig_Node_Expression_Array <span style="color: #000088;">$args</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span> <span style="color: #000088;">$lineno</span><span style="color: #339933;">,</span> <span style="color: #000088;">$tag</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$attrs</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/array_merge"><span style="color: #990000;">array_merge</span></a><span style="color: #009900;">&#40;</span><a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'value'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #000088;">$attrs</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$nodes</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'args'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$args</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'body'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$body</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
		parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$nodes</span><span style="color: #339933;">,</span> <span style="color: #000088;">$attrs</span><span style="color: #339933;">,</span> <span style="color: #000088;">$lineno</span><span style="color: #339933;">,</span><span style="color: #000088;">$tag</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> compile<span style="color: #009900;">&#40;</span>Twig_Compiler <span style="color: #000088;">$compiler</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$compiler</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addDebugInfo</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$compiler</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'$context[&quot;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getValue</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&quot;] = $context[&quot;this&quot;]-&gt;beginWidget(&quot;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'alias'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&quot;,'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$argNode</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getNode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'args'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$compiler</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">subcompile</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$argNode</span><span style="color: #009900;">&#41;</span>
				 <span style="color: #339933;">-&gt;</span><span style="color: #004000;">raw</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">');'</span><span style="color: #009900;">&#41;</span>
				 <span style="color: #339933;">-&gt;</span><span style="color: #004000;">raw</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000088;">$compiler</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">indent</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">subcompile</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getNode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'body'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000088;">$compiler</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raw</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'$context[&quot;this&quot;]-&gt;endWidget();'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>然后在Twig初始化的地方增加我们的语法解析类：</p>

<div class="wp_codebox"><table><tr id="p55813"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p558code13"><pre class="php" style="font-family:Consolas;"><span style="color: #000088;">$twig</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addTokenParser</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Yii_WidgetBlock_TokenParser<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>然后我们就可以在twig的模板里这么写了：</p>

<div class="wp_codebox"><table><tr id="p55814"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p558code14"><pre class="html" style="font-family:Consolas;">{% beginwidget 'CActiveForm' as form %}
	&lt;ul&gt;
		&lt;li&gt;
			{{ form.label(model, 'username') }}
			{{ form.textField(model, 'username') }}
		&lt;/li&gt;
		&lt;li&gt;
			{{ form.label(model, 'password') }}
			{{ form.passwordField(model, 'password') }}
		&lt;/li&gt;
	&lt;/ul&gt;
{% endwidget %}</pre></td></tr></table></div>

<h2  class="related_post_title">你可能还对以下日志感兴趣</h2><ul class="related_post"><li><a href="http://www.lfyzjck.com/2011-04-11/506.html" title="在Yii中实现CKEditor编辑器中的图片上传功能">在Yii中实现CKEditor编辑器中的图片上传功能</a></li><li><a href="http://www.lfyzjck.com/2010-11-27/396.html" title="PHP的文件缓存(File Cache)">PHP的文件缓存(File Cache)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.lfyzjck.com/2011-09-24/558.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fedora 15下安装RT5370无线网卡驱动小记</title>
		<link>http://www.lfyzjck.com/2011-09-12/548.html</link>
		<comments>http://www.lfyzjck.com/2011-09-12/548.html#comments</comments>
		<pubDate>Mon, 12 Sep 2011 02:38:14 +0000</pubDate>
		<dc:creator>南柯一梦</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[rt5370]]></category>
		<category><![CDATA[w311m]]></category>

		<guid isPermaLink="false">http://www.lfyzjck.com/?p=548</guid>
		<description><![CDATA[几天前给台式机买了块无线网卡，因为自己是windows和linux双系统，所以希望无线网卡也能支持Linux。最后选定了腾达的W311M，因为官方明确表示这款USB无线网卡支持Linux。 网上大概查了一下，安装何种驱动主要取决于无线网卡所用的芯片型号，比如我这款网卡就是Ralink rt5370，然后从源码编译安装，一般就能正常使用。 不过我把无线网卡插入电脑后就能直接识别了，但是却连不上任何一个AP。查看了一下系统已加载的mod，发现了rt2800usb及rt2800lib两个mod，大概是rt2800的驱动能兼容rt2870系列的芯片吧。 $ lsusb Bus 001 Device 004: ID 148f:5370 Ralink Technology, Corp. &#160; 驱动下载地址： http://www.tenda.com.cn/uploadfile/downloads/uploadfile/201108/Ralink/5370%20Linux.rar 驱动解压后会发现这个驱动不止适用rt5370，同样可以用于rt3070、rt2870（貌似rt5370,rt3070都是rt2870内核的？不过这点没有证实过）。直接make源码会报错，所以我们需要先修改一些文件： 1、在os/linux/config.mk中找到HAS_WPA_SUPPLICANT以及HAS_NATIVE_WPA_SUPPLICANT_SUPPORT，将他们的值都设为”y”（不含引号） 2、在os/linux/usb_main_dev.c中加入一行：MODULE_LICENSE(“GPL”);否则的话make时会报错缺少授权协议。 3、用su提权至root，在源码根目录下：make &#038;&#038; make install 屏蔽系统自带的驱动了： 编辑 /etc/modprobe.d/blacklist.conf，加入下面两行： blacklist rt2800lib blacklist rt2800usb 完成上面这些工作，就可以加载模块了： modprobe rt5370sta ifconfig ra0 192.168.1.100 up #网卡名称也许不是ra0，请自行通过ifconfig查看 iwconfig &#8230; <a href="http://www.lfyzjck.com/2011-09-12/548.html">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>几天前给台式机买了块无线网卡，因为自己是windows和linux双系统，所以希望无线网卡也能支持Linux。最后选定了腾达的W311M，因为官方明确表示这款USB无线网卡支持Linux。</p>
<p>网上大概查了一下，安装何种驱动主要取决于无线网卡所用的芯片型号，比如我这款网卡就是Ralink rt5370，然后从源码编译安装，一般就能正常使用。</p>
<p>不过我把无线网卡插入电脑后就能直接识别了，但是却连不上任何一个AP。查看了一下系统已加载的mod，发现了rt2800usb及rt2800lib两个mod，大概是rt2800的驱动能兼容rt2870系列的芯片吧。</p>
<p><code><br />
$ lsusb<br />
Bus 001 Device 004: ID 148f:5370 Ralink Technology, Corp.<br />
</code></p>
<p>&nbsp;<br />
<b>驱动下载地址：</b> <a href="http://www.tenda.com.cn/uploadfile/downloads/uploadfile/201108/Ralink/5370%20Linux.rar">http://www.tenda.com.cn/uploadfile/downloads/uploadfile/201108/Ralink/5370%20Linux.rar</a></p>
<p>驱动解压后会发现这个驱动不止适用rt5370，同样可以用于rt3070、rt2870（貌似rt5370,rt3070都是rt2870内核的？不过这点没有证实过）。直接make源码会报错，所以我们需要先修改一些文件：</p>
<ol>
<li>1、在os/linux/config.mk中找到HAS_WPA_SUPPLICANT以及HAS_NATIVE_WPA_SUPPLICANT_SUPPORT，将他们的值都设为”y”（不含引号）</li>
<li>2、在os/linux/usb_main_dev.c中加入一行：<br />MODULE_LICENSE(“GPL”);<br />否则的话make时会报错缺少授权协议。</li>
<li>3、用su提权至root，在源码根目录下：make &#038;&#038; make install
<p>屏蔽系统自带的驱动了：</p>
<p>编辑 /etc/modprobe.d/blacklist.conf，加入下面两行：</p>
<p><code><br />
blacklist rt2800lib<br />
blacklist rt2800usb<br />
</code>
</li>
</ol>
<p>完成上面这些工作，就可以加载模块了：<br />
<code><br />
modprobe rt5370sta<br />
ifconfig ra0 192.168.1.100 up                      #网卡名称也许不是ra0，请自行通过ifconfig查看<br />
iwconfig ra0<br />
</code><br />
顺利的话已经可以连接无线开始上网冲浪了。</p>
<p>后记：说实话这个驱动一直让我折腾了好久，主要是一直没发现和系统自带驱动相冲突的问题，不过最后还是可以用了。这款网卡信号算不上强，但还够用，毕竟是Mini系列的，加之价格有便宜的要死，总体来说是一款性价比很高的网卡。Windows下面有软AP，Linux下还没实验过，反正没有太大的需求。</p>
<h2  class="related_post_title">你可能还对以下日志感兴趣</h2><ul class="related_post"><li><a href="http://www.lfyzjck.com/2010-03-02/305.html" title="Fedora 12下使用root用户登录到系统">Fedora 12下使用root用户登录到系统</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.lfyzjck.com/2011-09-12/548.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>各种排序算法(Python实现)</title>
		<link>http://www.lfyzjck.com/2011-05-19/530.html</link>
		<comments>http://www.lfyzjck.com/2011-05-19/530.html#comments</comments>
		<pubDate>Thu, 19 May 2011 13:12:49 +0000</pubDate>
		<dc:creator>南柯一梦</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[二路并归排序]]></category>
		<category><![CDATA[快速排序]]></category>
		<category><![CDATA[排序算法]]></category>

		<guid isPermaLink="false">http://www.lfyzjck.com/?p=530</guid>
		<description><![CDATA[Python实现的快速排序，二路并归排序，冒泡排序，选择排序 <a href="http://www.lfyzjck.com/2011-05-19/530.html">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>前段时间为准备百度面试恶补的东西，虽然最后还是被刷了，还是把那几天的“战利品”放点上来，算法一直是自己比较薄弱的地方，以后还要更加努力啊。</p>
<p>下面用Python实现了几个常用的排序，如快速排序，选择排序，以及二路并归排序等等。</p>

<div class="wp_codebox"><table><tr id="p53015"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
</pre></td><td class="code" id="p530code15"><pre class="python" style="font-family:Consolas;"><span style="color: #808080; font-style: italic;">#encoding=utf-8</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">random</span>
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">copy</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">copy</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> directInsertSort<span style="color: black;">&#40;</span>seq<span style="color: black;">&#41;</span>:
	<span style="color: #483d8b;">&quot;&quot;&quot; 直接插入排序 &quot;&quot;&quot;</span>
	size = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>seq<span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>,size<span style="color: black;">&#41;</span>:
		tmp, j = seq<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span>, i
		<span style="color: #ff7700;font-weight:bold;">while</span> j <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">0</span> <span style="color: #ff7700;font-weight:bold;">and</span> tmp <span style="color: #66cc66;">&lt;</span> seq<span style="color: black;">&#91;</span>j-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>:
			seq<span style="color: black;">&#91;</span>j<span style="color: black;">&#93;</span>, j = seq<span style="color: black;">&#91;</span>j-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>, j-<span style="color: #ff4500;">1</span>
		seq<span style="color: black;">&#91;</span>j<span style="color: black;">&#93;</span> = tmp
	<span style="color: #ff7700;font-weight:bold;">return</span> seq
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> directSelectSort<span style="color: black;">&#40;</span>seq<span style="color: black;">&#41;</span>:
	<span style="color: #483d8b;">&quot;&quot;&quot; 直接选择排序 &quot;&quot;&quot;</span>
	size = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>seq<span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>,size - <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>:
		k = i<span style="color: #66cc66;">;</span>j = i+<span style="color: #ff4500;">1</span>
		<span style="color: #ff7700;font-weight:bold;">while</span> j <span style="color: #66cc66;">&lt;</span> size:
			<span style="color: #ff7700;font-weight:bold;">if</span> seq<span style="color: black;">&#91;</span>j<span style="color: black;">&#93;</span> <span style="color: #66cc66;">&lt;</span> seq<span style="color: black;">&#91;</span>k<span style="color: black;">&#93;</span>:
				k = j
			j += <span style="color: #ff4500;">1</span>
		seq<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span>,seq<span style="color: black;">&#91;</span>k<span style="color: black;">&#93;</span> = seq<span style="color: black;">&#91;</span>k<span style="color: black;">&#93;</span>,seq<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span>
	<span style="color: #ff7700;font-weight:bold;">return</span> seq
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> bubbleSort<span style="color: black;">&#40;</span>seq<span style="color: black;">&#41;</span>:
	<span style="color: #483d8b;">&quot;&quot;&quot;冒泡排序&quot;&quot;&quot;</span>
	size = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>seq<span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>,size<span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">for</span> j <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>,size-i<span style="color: black;">&#41;</span>:
			<span style="color: #ff7700;font-weight:bold;">if</span> seq<span style="color: black;">&#91;</span>j+<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">&lt;</span> seq<span style="color: black;">&#91;</span>j<span style="color: black;">&#93;</span>:
				seq<span style="color: black;">&#91;</span>j+<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>,seq<span style="color: black;">&#91;</span>j<span style="color: black;">&#93;</span> = seq<span style="color: black;">&#91;</span>j<span style="color: black;">&#93;</span>,seq<span style="color: black;">&#91;</span>j+<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
	<span style="color: #ff7700;font-weight:bold;">return</span> seq
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> _divide<span style="color: black;">&#40;</span>seq, low, high<span style="color: black;">&#41;</span>:
	<span style="color: #483d8b;">&quot;&quot;&quot;快速排序划分函数&quot;&quot;&quot;</span>
	tmp = seq<span style="color: black;">&#91;</span>low<span style="color: black;">&#93;</span>
	<span style="color: #ff7700;font-weight:bold;">while</span> low <span style="color: #66cc66;">!</span>= high:
		<span style="color: #ff7700;font-weight:bold;">while</span> low <span style="color: #66cc66;">&lt;</span> high <span style="color: #ff7700;font-weight:bold;">and</span> seq<span style="color: black;">&#91;</span>high<span style="color: black;">&#93;</span> <span style="color: #66cc66;">&gt;</span>= tmp: high -= <span style="color: #ff4500;">1</span>
		<span style="color: #ff7700;font-weight:bold;">if</span> low <span style="color: #66cc66;">&lt;</span> high:
			seq<span style="color: black;">&#91;</span>low<span style="color: black;">&#93;</span> = seq<span style="color: black;">&#91;</span>high<span style="color: black;">&#93;</span>
			low += <span style="color: #ff4500;">1</span>
		<span style="color: #ff7700;font-weight:bold;">while</span> low <span style="color: #66cc66;">&lt;</span> high <span style="color: #ff7700;font-weight:bold;">and</span> seq<span style="color: black;">&#91;</span>low<span style="color: black;">&#93;</span> <span style="color: #66cc66;">&lt;</span>= tmp: low += <span style="color: #ff4500;">1</span>
		<span style="color: #ff7700;font-weight:bold;">if</span> low <span style="color: #66cc66;">&lt;</span> high:
			seq<span style="color: black;">&#91;</span>high<span style="color: black;">&#93;</span> = seq<span style="color: black;">&#91;</span>low<span style="color: black;">&#93;</span>
			high -= <span style="color: #ff4500;">1</span>
	seq<span style="color: black;">&#91;</span>low<span style="color: black;">&#93;</span> = tmp
	<span style="color: #ff7700;font-weight:bold;">return</span> low
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> _quickSort<span style="color: black;">&#40;</span>seq, low, high<span style="color: black;">&#41;</span>:
	<span style="color: #483d8b;">&quot;&quot;&quot;快速排序辅助函数&quot;&quot;&quot;</span>
	<span style="color: #ff7700;font-weight:bold;">if</span> low <span style="color: #66cc66;">&gt;</span>= high: <span style="color: #ff7700;font-weight:bold;">return</span>
	mid = _divide<span style="color: black;">&#40;</span>seq, low, high<span style="color: black;">&#41;</span>
	_quickSort<span style="color: black;">&#40;</span>seq, low, mid - <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
	_quickSort<span style="color: black;">&#40;</span>seq, mid + <span style="color: #ff4500;">1</span>, high<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> quickSort<span style="color: black;">&#40;</span>seq<span style="color: black;">&#41;</span>:
	<span style="color: #483d8b;">&quot;&quot;&quot;快速排序包裹函数&quot;&quot;&quot;</span>
	size = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>seq<span style="color: black;">&#41;</span>
	_quickSort<span style="color: black;">&#40;</span>seq, <span style="color: #ff4500;">0</span>, size - <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">return</span> seq
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> merge<span style="color: black;">&#40;</span>seq, left, mid, right<span style="color: black;">&#41;</span>:
	tmp = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
	i, j = left, mid
	<span style="color: #ff7700;font-weight:bold;">while</span> i <span style="color: #66cc66;">&lt;</span> mid <span style="color: #ff7700;font-weight:bold;">and</span> j <span style="color: #66cc66;">&lt;</span>= right:
		<span style="color: #ff7700;font-weight:bold;">if</span> seq<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span> <span style="color: #66cc66;">&lt;</span> seq<span style="color: black;">&#91;</span>j<span style="color: black;">&#93;</span>:
			tmp.<span style="color: black;">append</span><span style="color: black;">&#40;</span>seq<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
			i += <span style="color: #ff4500;">1</span>
		<span style="color: #ff7700;font-weight:bold;">else</span>:
			tmp.<span style="color: black;">append</span><span style="color: black;">&#40;</span>seq<span style="color: black;">&#91;</span>j<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
			j += <span style="color: #ff4500;">1</span>
	<span style="color: #ff7700;font-weight:bold;">if</span> i <span style="color: #66cc66;">&lt;</span> mid: tmp.<span style="color: black;">extend</span><span style="color: black;">&#40;</span>seq<span style="color: black;">&#91;</span>i:<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">if</span> j <span style="color: #66cc66;">&lt;</span>= right: tmp.<span style="color: black;">extend</span><span style="color: black;">&#40;</span>seq<span style="color: black;">&#91;</span>j:<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
	seq<span style="color: black;">&#91;</span>left:right+<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> = tmp<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span>:right-left+<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> _mergeSort<span style="color: black;">&#40;</span>seq, left, right<span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">if</span> left == right: 
		<span style="color: #ff7700;font-weight:bold;">return</span>
	<span style="color: #ff7700;font-weight:bold;">else</span>:
		mid = <span style="color: black;">&#40;</span>left + right<span style="color: black;">&#41;</span> / <span style="color: #ff4500;">2</span>
		_mergeSort<span style="color: black;">&#40;</span>seq, left, mid<span style="color: black;">&#41;</span>
		_mergeSort<span style="color: black;">&#40;</span>seq, mid + <span style="color: #ff4500;">1</span>, right<span style="color: black;">&#41;</span>
		merge<span style="color: black;">&#40;</span>seq, left, mid+<span style="color: #ff4500;">1</span>, right<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#二路并归排序</span>
<span style="color: #ff7700;font-weight:bold;">def</span> mergeSort<span style="color: black;">&#40;</span>seq<span style="color: black;">&#41;</span>:
	size = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>seq<span style="color: black;">&#41;</span>
	_mergeSort<span style="color: black;">&#40;</span>seq, <span style="color: #ff4500;">0</span>, size - <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">return</span> seq
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
	s = <span style="color: black;">&#91;</span><span style="color: #dc143c;">random</span>.<span style="color: black;">randint</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>,<span style="color: #ff4500;">100</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>,<span style="color: #ff4500;">20</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>
	<span style="color: #ff7700;font-weight:bold;">print</span> s
	<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
	<span style="color: #ff7700;font-weight:bold;">print</span> directSelectSort<span style="color: black;">&#40;</span><span style="color: #dc143c;">copy</span><span style="color: black;">&#40;</span>s<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">print</span> directInsertSort<span style="color: black;">&#40;</span><span style="color: #dc143c;">copy</span><span style="color: black;">&#40;</span>s<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">print</span> bubbleSort<span style="color: black;">&#40;</span><span style="color: #dc143c;">copy</span><span style="color: black;">&#40;</span>s<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">print</span> quickSort<span style="color: black;">&#40;</span><span style="color: #dc143c;">copy</span><span style="color: black;">&#40;</span>s<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">print</span> mergeSort<span style="color: black;">&#40;</span><span style="color: #dc143c;">copy</span><span style="color: black;">&#40;</span>s<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>运行结果如下：</p>

<div class="wp_codebox"><table><tr id="p53016"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code" id="p530code16"><pre class="python" style="font-family:Consolas;">E:\python_project\practice<span style="color: #66cc66;">&gt;</span>sorting.<span style="color: black;">py</span>
<span style="color: black;">&#91;</span><span style="color: #ff4500;">10</span>, <span style="color: #ff4500;">47</span>, <span style="color: #ff4500;">56</span>, <span style="color: #ff4500;">76</span>, <span style="color: #ff4500;">64</span>, <span style="color: #ff4500;">84</span>, <span style="color: #ff4500;">26</span>, <span style="color: #ff4500;">8</span>, <span style="color: #ff4500;">47</span>, <span style="color: #ff4500;">51</span>, <span style="color: #ff4500;">88</span>, <span style="color: #ff4500;">81</span>, <span style="color: #ff4500;">32</span>, <span style="color: #ff4500;">95</span>, <span style="color: #ff4500;">91</span>, <span style="color: #ff4500;">29</span>, <span style="color: #ff4500;">28</span>, <span style="color: #ff4500;">69</span>, <span style="color: #ff4500;">61</span>, <span style="color: #ff4500;">45</span><span style="color: black;">&#93;</span>
&nbsp;
&nbsp;
<span style="color: black;">&#91;</span><span style="color: #ff4500;">8</span>, <span style="color: #ff4500;">10</span>, <span style="color: #ff4500;">26</span>, <span style="color: #ff4500;">28</span>, <span style="color: #ff4500;">29</span>, <span style="color: #ff4500;">32</span>, <span style="color: #ff4500;">45</span>, <span style="color: #ff4500;">47</span>, <span style="color: #ff4500;">47</span>, <span style="color: #ff4500;">51</span>, <span style="color: #ff4500;">56</span>, <span style="color: #ff4500;">61</span>, <span style="color: #ff4500;">64</span>, <span style="color: #ff4500;">69</span>, <span style="color: #ff4500;">76</span>, <span style="color: #ff4500;">81</span>, <span style="color: #ff4500;">84</span>, <span style="color: #ff4500;">88</span>, <span style="color: #ff4500;">91</span>, <span style="color: #ff4500;">95</span><span style="color: black;">&#93;</span>
<span style="color: black;">&#91;</span><span style="color: #ff4500;">8</span>, <span style="color: #ff4500;">10</span>, <span style="color: #ff4500;">26</span>, <span style="color: #ff4500;">28</span>, <span style="color: #ff4500;">29</span>, <span style="color: #ff4500;">32</span>, <span style="color: #ff4500;">45</span>, <span style="color: #ff4500;">47</span>, <span style="color: #ff4500;">47</span>, <span style="color: #ff4500;">51</span>, <span style="color: #ff4500;">56</span>, <span style="color: #ff4500;">61</span>, <span style="color: #ff4500;">64</span>, <span style="color: #ff4500;">69</span>, <span style="color: #ff4500;">76</span>, <span style="color: #ff4500;">81</span>, <span style="color: #ff4500;">84</span>, <span style="color: #ff4500;">88</span>, <span style="color: #ff4500;">91</span>, <span style="color: #ff4500;">95</span><span style="color: black;">&#93;</span>
<span style="color: black;">&#91;</span><span style="color: #ff4500;">8</span>, <span style="color: #ff4500;">10</span>, <span style="color: #ff4500;">26</span>, <span style="color: #ff4500;">28</span>, <span style="color: #ff4500;">29</span>, <span style="color: #ff4500;">32</span>, <span style="color: #ff4500;">45</span>, <span style="color: #ff4500;">47</span>, <span style="color: #ff4500;">47</span>, <span style="color: #ff4500;">51</span>, <span style="color: #ff4500;">56</span>, <span style="color: #ff4500;">61</span>, <span style="color: #ff4500;">64</span>, <span style="color: #ff4500;">69</span>, <span style="color: #ff4500;">76</span>, <span style="color: #ff4500;">81</span>, <span style="color: #ff4500;">84</span>, <span style="color: #ff4500;">88</span>, <span style="color: #ff4500;">91</span>, <span style="color: #ff4500;">95</span><span style="color: black;">&#93;</span>
<span style="color: black;">&#91;</span><span style="color: #ff4500;">8</span>, <span style="color: #ff4500;">10</span>, <span style="color: #ff4500;">26</span>, <span style="color: #ff4500;">28</span>, <span style="color: #ff4500;">29</span>, <span style="color: #ff4500;">32</span>, <span style="color: #ff4500;">45</span>, <span style="color: #ff4500;">47</span>, <span style="color: #ff4500;">47</span>, <span style="color: #ff4500;">51</span>, <span style="color: #ff4500;">56</span>, <span style="color: #ff4500;">61</span>, <span style="color: #ff4500;">64</span>, <span style="color: #ff4500;">69</span>, <span style="color: #ff4500;">76</span>, <span style="color: #ff4500;">81</span>, <span style="color: #ff4500;">84</span>, <span style="color: #ff4500;">88</span>, <span style="color: #ff4500;">91</span>, <span style="color: #ff4500;">95</span><span style="color: black;">&#93;</span>
<span style="color: black;">&#91;</span><span style="color: #ff4500;">8</span>, <span style="color: #ff4500;">10</span>, <span style="color: #ff4500;">26</span>, <span style="color: #ff4500;">28</span>, <span style="color: #ff4500;">29</span>, <span style="color: #ff4500;">32</span>, <span style="color: #ff4500;">45</span>, <span style="color: #ff4500;">47</span>, <span style="color: #ff4500;">47</span>, <span style="color: #ff4500;">51</span>, <span style="color: #ff4500;">56</span>, <span style="color: #ff4500;">61</span>, <span style="color: #ff4500;">64</span>, <span style="color: #ff4500;">69</span>, <span style="color: #ff4500;">76</span>, <span style="color: #ff4500;">81</span>, <span style="color: #ff4500;">84</span>, <span style="color: #ff4500;">88</span>, <span style="color: #ff4500;">91</span>, <span style="color: #ff4500;">95</span><span style="color: black;">&#93;</span></pre></td></tr></table></div>

<h2  class="related_post_title">你可能还对以下日志感兴趣</h2><ul class="related_post"><li><a href="http://www.lfyzjck.com/2011-04-18/511.html" title="图书馆自动续借系统">图书馆自动续借系统</a></li><li><a href="http://www.lfyzjck.com/2011-01-12/438.html" title="数独(soduku)解法——基于Python的实现">数独(soduku)解法——基于Python的实现</a></li><li><a href="http://www.lfyzjck.com/2010-12-14/412.html" title="Python中对字典(dict)和列表(list)的排序">Python中对字典(dict)和列表(list)的排序</a></li><li><a href="http://www.lfyzjck.com/2010-12-04/401.html" title="Python中zip()函数用法举例">Python中zip()函数用法举例</a></li><li><a href="http://www.lfyzjck.com/2010-11-09/378.html" title="python的enumerate函数">python的enumerate函数</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.lfyzjck.com/2011-05-19/530.html/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>豆瓣风格的WordPress主题</title>
		<link>http://www.lfyzjck.com/2011-05-16/521.html</link>
		<comments>http://www.lfyzjck.com/2011-05-16/521.html#comments</comments>
		<pubDate>Mon, 16 May 2011 15:21:48 +0000</pubDate>
		<dc:creator>南柯一梦</dc:creator>
				<category><![CDATA[PHPer]]></category>
		<category><![CDATA[douban]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[Wordpress Theme]]></category>

		<guid isPermaLink="false">http://www.lfyzjck.com/?p=521</guid>
		<description><![CDATA[丢在电脑已经很久的一份设计稿，今天把它放出来了，就是你现在看到的这个主题。 这个主题是基于Wordpress默认主题twentyten开发的，第一次做很多不足还请见谅。目前版本是v0.1，如果您有什么建议，请不要吝惜您的键盘寿命，在文章内给我留言。 功能： 完整的小工具支持 支持自定义菜单 支持Wordpress插件 更新日志： 2011-5-17： 发布wordpress-douban-style v0.2，修复了部分样式问题，移动搜索条到页面顶部，添加订阅按钮和follow按钮。 2011-11-4： 增加图片lazyload，文章部分字体改为豆瓣的深灰色，使用主题自带的jQuery而不是Wordpress中的jQuery。 下载：douban-wordpress-theme-v0.3.tar.gz 你可能还对以下日志感兴趣趁热打铁，说说Wordpress的自定义菜单(custom menus)将Google reader中订阅的内容展示在WordPress中]]></description>
			<content:encoded><![CDATA[<p>丢在电脑已经很久的一份设计稿，今天把它放出来了，就是你现在看到的这个主题。</p>
<p>这个主题是基于Wordpress默认主题twentyten开发的，第一次做很多不足还请见谅。目前版本是v0.1，如果您有什么建议，请不要吝惜您的键盘寿命，在文章内给我留言。</p>
<p>功能：</p>
<ol>
<li>完整的小工具支持</li>
<li>支持自定义菜单</li>
<li>支持Wordpress插件</li>
</ol>
<p><a href="http://www.lfyzjck.com/wp-content/uploads/2011/05/screenshot.png"><img class="aligncenter size-full wp-image-522" title="screenshot" src="http://www.lfyzjck.com/wp-content/uploads/2011/05/screenshot.png" alt="豆瓣风格的Wordpress主题截图" width="300" height="260" /></a></p>
<blockquote><p>更新日志：</p>
<p>2011-5-17： 发布wordpress-douban-style v0.2，修复了部分样式问题，移动搜索条到页面顶部，添加订阅按钮和follow按钮。<br />
2011-11-4： 增加图片lazyload，文章部分字体改为豆瓣的深灰色，使用主题自带的jQuery而不是Wordpress中的jQuery。
</p></blockquote>
<p>下载：<a title="点击下载" href="http://www.lfyzjck.com/wp-content/download/douban-wordpress-theme-v0.3.tar.gz" target="_blank">douban-wordpress-theme-v0.3.tar.gz</a></p>
<h2  class="related_post_title">你可能还对以下日志感兴趣</h2><ul class="related_post"><li><a href="http://www.lfyzjck.com/2011-01-30/464.html" title="趁热打铁，说说Wordpress的自定义菜单(custom menus)">趁热打铁，说说Wordpress的自定义菜单(custom menus)</a></li><li><a href="http://www.lfyzjck.com/2009-06-12/72.html" title="将Google reader中订阅的内容展示在WordPress中">将Google reader中订阅的内容展示在WordPress中</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.lfyzjck.com/2011-05-16/521.html/feed</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
		<item>
		<title>ShoutBox</title>
		<link>http://www.lfyzjck.com/2011-04-20/516.html</link>
		<comments>http://www.lfyzjck.com/2011-04-20/516.html#comments</comments>
		<pubDate>Wed, 20 Apr 2011 12:31:00 +0000</pubDate>
		<dc:creator>南柯一梦</dc:creator>
				<category><![CDATA[PHPer]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Shoutbox]]></category>
		<category><![CDATA[sqlite]]></category>

		<guid isPermaLink="false">http://www.lfyzjck.com/?p=516</guid>
		<description><![CDATA[知道这个东西叫Shoutbox也花了很多时间，任何人都可以在这个盒子里很方便的发送消息，消息会被即时的显示在页面上，被所有人看到。这种shoutbox在很多国外论坛上很常见，国内好像不怎么有。去年跟小豪做很多无聊项目的时候，有客户提出要求要实现这么个功能，这大概是唯一感觉还好玩点的东西了吧！可惜最后还是没用用上，哈哈。无聊放上来，怀念一下那段时光。 截图： 原理其实比较简单，就是利用Ajax定时刷新，删掉旧的消息把新的消息弹出来，但是看起来还是蛮酷的东西。 代码就不放了，数据库用的是sqlite，搭好PHP环境直接就可以运行。 下载地址：Shoutbox 你可能还对以下日志感兴趣通过gettext方式实现PHP国际化（i18n）PHP的文件缓存(File Cache)通过Yahoo Finance API获取股票数据Fedora下用配置nginx+fastcgi+php+mysql开发环境Mcrypt模块简介（译）]]></description>
			<content:encoded><![CDATA[<p>知道这个东西叫Shoutbox也花了很多时间，任何人都可以在这个盒子里很方便的发送消息，消息会被即时的显示在页面上，被所有人看到。这种shoutbox在很多国外论坛上很常见，国内好像不怎么有。去年跟小豪做很多无聊项目的时候，有客户提出要求要实现这么个功能，这大概是唯一感觉还好玩点的东西了吧！可惜最后还是没用用上，哈哈。无聊放上来，怀念一下那段时光。</p>
<p>截图：</p>
<div><a href="http://www.lfyzjck.com/wp-content/uploads/2011/04/shoutbox.jpg"><img class="aligncenter size-full wp-image-517" title="shoutbox" src="http://www.lfyzjck.com/wp-content/uploads/2011/04/shoutbox.jpg" alt="shoutbox" width="418" height="351" /></a></div>
<div>原理其实比较简单，就是利用Ajax定时刷新，删掉旧的消息把新的消息弹出来，但是看起来还是蛮酷的东西。</div>
<div>代码就不放了，数据库用的是sqlite，搭好PHP环境直接就可以运行。</div>
<div></div>
<div><strong>下载地址：<a title="点击下载" href="http://www.lfyzjck.com/wp-content/download/shoutbox.rar" target="_blank">Shoutbox</a></strong></div>
<h2  class="related_post_title">你可能还对以下日志感兴趣</h2><ul class="related_post"><li><a href="http://www.lfyzjck.com/2010-12-29/399.html" title="通过gettext方式实现PHP国际化（i18n）">通过gettext方式实现PHP国际化（i18n）</a></li><li><a href="http://www.lfyzjck.com/2010-11-27/396.html" title="PHP的文件缓存(File Cache)">PHP的文件缓存(File Cache)</a></li><li><a href="http://www.lfyzjck.com/2010-11-25/389.html" title="通过Yahoo Finance API获取股票数据">通过Yahoo Finance API获取股票数据</a></li><li><a href="http://www.lfyzjck.com/2010-11-07/370.html" title="Fedora下用配置nginx+fastcgi+php+mysql开发环境">Fedora下用配置nginx+fastcgi+php+mysql开发环境</a></li><li><a href="http://www.lfyzjck.com/2010-03-31/252.html" title="Mcrypt模块简介（译）">Mcrypt模块简介（译）</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.lfyzjck.com/2011-04-20/516.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>图书馆自动续借系统</title>
		<link>http://www.lfyzjck.com/2011-04-18/511.html</link>
		<comments>http://www.lfyzjck.com/2011-04-18/511.html#comments</comments>
		<pubDate>Mon, 18 Apr 2011 08:23:34 +0000</pubDate>
		<dc:creator>南柯一梦</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[OPAC]]></category>
		<category><![CDATA[自动续借]]></category>

		<guid isPermaLink="false">http://www.lfyzjck.com/?p=511</guid>
		<description><![CDATA[不得不说，春日的杭州真的不是一般的漂亮，自己在杭州呆了两年也从未有过这种感觉。Linux不争气的挂掉，直接导致很多事情没法做，不过忍受每天N次的网络掉线也不是什么开心的事情。手头几个项目都接近尾声，虽然有很多的不开心，但还是坚持做下去了，真的只要认真付出就总有收获。扯的远了，进入今天的正题——图书馆自动续借系统。 功能： 自动续借快过期的图书。 无法继续续借的会发送Email提醒。 已超期图书提醒。 使用： 修改setting.py.example，设置好邮箱的SMTP地址和帐号密码，使用前将setting.py.example 改名为 setting.py。 通过command.py将待监测用户加入数据库。 同过windows的任务计划或者linux的crontab定时执行，每天一次即可。 command.py使用说明： 增加新监测用户 python command.py add -u 学号 -p 图书馆登录密码 -e Email 将用户从数据库中删除 python command.py del -u 学号 虽然只试过自己学校的系统，不过理论上支持所有的OPAC V4.5系统。贴一部分核心的代码： functions.py 1 2 3 4 5 6 7 8 9 &#8230; <a href="http://www.lfyzjck.com/2011-04-18/511.html">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>不得不说，春日的杭州真的不是一般的漂亮，自己在杭州呆了两年也从未有过这种感觉。Linux不争气的挂掉，直接导致很多事情没法做，不过忍受每天N次的网络掉线也不是什么开心的事情。手头几个项目都接近尾声，虽然有很多的不开心，但还是坚持做下去了，真的只要认真付出就总有收获。扯的远了，进入今天的正题——图书馆自动续借系统。</p>
<h3><strong>功能：</strong></h3>
<ol>
<li>自动续借快过期的图书。</li>
<li>无法继续续借的会发送Email提醒。</li>
<li>已超期图书提醒。</li>
</ol>
<h3><strong>使用：</strong></h3>
<ol>
<li>修改setting.py.example，设置好邮箱的SMTP地址和帐号密码，使用前将setting.py.example 改名为 setting.py。</li>
<li>通过command.py将待监测用户加入数据库。</li>
<li>同过windows的任务计划或者linux的crontab定时执行，每天一次即可。</li>
</ol>
<p>command.py使用说明：</p>
<p>增加新监测用户</p>
<blockquote><p>python command.py add -u 学号 -p 图书馆登录密码 -e Email</p></blockquote>
<p>将用户从数据库中删除</p>
<blockquote><p>python command.py del -u 学号</p></blockquote>
<p>虽然只试过自己学校的系统，不过理论上支持所有的OPAC V4.5系统。贴一部分核心的代码：<br />
<span id="more-511"></span></p>
<p>functions.py</p>

<div class="wp_codebox"><table><tr id="p51120"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
</pre></td><td class="code" id="p511code20"><pre class="python" style="font-family:Consolas;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">httplib</span>,<span style="color: #dc143c;">urllib</span>,<span style="color: #dc143c;">urllib2</span>,<span style="color: #dc143c;">cookielib</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">re</span>
<span style="color: #ff7700;font-weight:bold;">from</span> setting <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span>
<span style="color: #ff7700;font-weight:bold;">from</span> models <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span>
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">time</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">xml</span>.<span style="color: black;">parsers</span>.<span style="color: black;">expat</span>
&nbsp;
cookie = <span style="color: #dc143c;">cookielib</span>.<span style="color: black;">CookieJar</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
opener = <span style="color: #dc143c;">urllib2</span>.<span style="color: black;">build_opener</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">urllib2</span>.<span style="color: black;">HTTPCookieProcessor</span><span style="color: black;">&#40;</span>cookie<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">urllib2</span>.<span style="color: black;">install_opener</span><span style="color: black;">&#40;</span>opener<span style="color: black;">&#41;</span>
&nbsp;
common_header = <span style="color: black;">&#123;</span>
		<span style="color: #483d8b;">&quot;Host&quot;</span>:<span style="color: #483d8b;">&quot;210.32.33.91:8080&quot;</span>,
		<span style="color: #483d8b;">&quot;User-Agent&quot;</span>: <span style="color: #483d8b;">&quot;Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12&quot;</span>,
		<span style="color: #483d8b;">&quot;Accept&quot;</span>:<span style="color: #483d8b;">&quot;text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8&quot;</span>,
		<span style="color: #483d8b;">&quot;Accept-Language&quot;</span>: <span style="color: #483d8b;">&quot;zh-cn,zh;q=0.5&quot;</span>,
		<span style="color: #483d8b;">&quot;Accept-Charset&quot;</span>: <span style="color: #483d8b;">&quot;GB2312,utf-8;q=0.7,*;q=0.7&quot;</span>,
		<span style="color: #483d8b;">&quot;Keep-Alive&quot;</span>:<span style="color: #483d8b;">&quot;115&quot;</span>,
		<span style="color: #483d8b;">&quot;Connection&quot;</span>:<span style="color: #483d8b;">&quot;Keep-Alive&quot;</span>,
		<span style="color: #483d8b;">&quot;Referer&quot;</span>: <span style="color: #483d8b;">&quot;http://210.32.33.91:8080/reader/login.php&quot;</span>,
		<span style="color: #483d8b;">&quot;Content-Type&quot;</span>:<span style="color: #483d8b;">&quot;application/x-www-form-urlencoded&quot;</span>, 	
		<span style="color: black;">&#125;</span>
<span style="color: #ff7700;font-weight:bold;">def</span> login<span style="color: black;">&#40;</span>stu_no, passwd<span style="color: black;">&#41;</span>:
	post_params = <span style="color: #dc143c;">urllib</span>.<span style="color: black;">urlencode</span><span style="color: black;">&#40;</span><span style="color: black;">&#123;</span>
		<span style="color: #483d8b;">'number'</span>: stu_no,
		<span style="color: #483d8b;">'passwd'</span>: passwd,
		<span style="color: #483d8b;">'select'</span>: <span style="color: #483d8b;">'cert_no'</span>,
		<span style="color: #483d8b;">'returnUrl'</span>: <span style="color: #483d8b;">''</span>,
		<span style="color: black;">&#125;</span><span style="color: black;">&#41;</span>
	login_page = <span style="color: #dc143c;">urllib2</span>.<span style="color: black;">Request</span><span style="color: black;">&#40;</span>LOGIN_CHECK_URL, post_params, common_header<span style="color: black;">&#41;</span>
	response = opener.<span style="color: #008000;">open</span><span style="color: black;">&#40;</span>login_page<span style="color: black;">&#41;</span>
	response.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> logout<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
	logout_page = <span style="color: #dc143c;">urllib2</span>.<span style="color: black;">Request</span><span style="color: black;">&#40;</span>LOGOUT_URL<span style="color: black;">&#41;</span>
	response = opener.<span style="color: #008000;">open</span><span style="color: black;">&#40;</span>logout_page<span style="color: black;">&#41;</span>
	response.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> renew_book<span style="color: black;">&#40;</span>bookid<span style="color: black;">&#41;</span>:
	header = <span style="color: #008000;">dict</span><span style="color: black;">&#40;</span>common_header<span style="color: black;">&#41;</span>
	header.<span style="color: black;">update</span><span style="color: black;">&#40;</span><span style="color: black;">&#123;</span>
		<span style="color: #483d8b;">'X-Requested-With'</span>: <span style="color: #483d8b;">'X-Requested-With'</span>,
		<span style="color: #483d8b;">'X-Prototype-Version'</span>: <span style="color: #483d8b;">'1.6.0.2'</span>,
		<span style="color: #483d8b;">'Referer'</span>: BOOK_LIST_URL,
		<span style="color: #483d8b;">'Cache-Control'</span>: <span style="color: #483d8b;">'no-cache'</span>,
	<span style="color: black;">&#125;</span><span style="color: black;">&#41;</span>
	params = <span style="color: #dc143c;">urllib</span>.<span style="color: black;">urlencode</span><span style="color: black;">&#40;</span><span style="color: black;">&#123;</span>
		<span style="color: #483d8b;">'bar_code'</span>: bookid,
		<span style="color: #483d8b;">'time'</span>: <span style="color: #008000;">int</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">time</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">1000</span><span style="color: black;">&#41;</span>,
		<span style="color: black;">&#125;</span><span style="color: black;">&#41;</span>
	renew_page = <span style="color: #dc143c;">urllib2</span>.<span style="color: black;">Request</span><span style="color: black;">&#40;</span>RENEW_URL + <span style="color: #483d8b;">'?'</span> + params, <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>, header<span style="color: black;">&#41;</span>
	response = opener.<span style="color: #008000;">open</span><span style="color: black;">&#40;</span>renew_page<span style="color: black;">&#41;</span>
	msg = <span style="color: #dc143c;">re</span>.<span style="color: black;">findall</span><span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'&lt;font color=red&gt;(?P&lt;msg&gt;.*)&lt;/font&gt;'</span>,response.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
	response.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">return</span> msg<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> booklist<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
	books_page = <span style="color: #dc143c;">urllib2</span>.<span style="color: black;">Request</span><span style="color: black;">&#40;</span>BOOK_LIST_URL<span style="color: black;">&#41;</span>
	response = opener.<span style="color: #008000;">open</span><span style="color: black;">&#40;</span>books_page<span style="color: black;">&#41;</span>
	data = response.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	response.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">return</span> data
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> process_booklist<span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>:
	bookids = <span style="color: #dc143c;">re</span>.<span style="color: black;">findall</span><span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'&lt;td bgcolor=&quot;#FFFFFF&quot; class=&quot;whitetext&quot; width=&quot;10%&quot;&gt;(?P&lt;bookid&gt;<span style="color: #000099; font-weight: bold;">\d</span>+)&lt;/td&gt;'</span>,data<span style="color: black;">&#41;</span>
	names = <span style="color: #dc143c;">re</span>.<span style="color: black;">findall</span><span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'&lt;td bgcolor=&quot;#FFFFFF&quot; class=&quot;whitetext&quot; width=&quot;40%&quot;&gt;&lt;a .*&gt;(?P&lt;name&gt;.*)&lt;/a&gt; / (?P&lt;author&gt;.*)&lt;/td&gt;'</span>,data<span style="color: black;">&#41;</span>
	borrow_time = <span style="color: #dc143c;">re</span>.<span style="color: black;">findall</span><span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'&lt;td bgcolor=&quot;#FFFFFF&quot; class=&quot;whitetext&quot; width=&quot;11%&quot;&gt;(?P&lt;borrow_time&gt;[0-9-]+)&lt;/td&gt;'</span>,data<span style="color: black;">&#41;</span>
	return_time = <span style="color: #dc143c;">re</span>.<span style="color: black;">findall</span><span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'&lt;td bgcolor=&quot;#FFFFFF&quot; class=&quot;whitetext&quot; width=&quot;11%&quot;&gt;&lt;font color=.*&gt;(?P&lt;return_time&gt;[0-9-]+)        &lt;/font&gt;'</span>,data<span style="color: black;">&#41;</span>
	renew =  <span style="color: #dc143c;">re</span>.<span style="color: black;">findall</span><span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'&lt;td bgcolor=&quot;#FFFFFF&quot; class=&quot;whitetext&quot; width=&quot;8%&quot;&gt;(<span style="color: #000099; font-weight: bold;">\d</span>)&lt;/td&gt;'</span>,data<span style="color: black;">&#41;</span>
&nbsp;
	bookcollecter = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
	<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span>bookids<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>:
		book = Book<span style="color: black;">&#40;</span><span style="color: #008000;">dict</span><span style="color: black;">&#40;</span>
			bookid = bookids<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span>,
			title = unescape<span style="color: black;">&#40;</span>names<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>,
			author = unescape<span style="color: black;">&#40;</span>names<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>,
			borrow_time = borrow_time<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span>,
			return_time = return_time<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span>,
			renew = renew<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span>,
			<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
		bookcollecter.<span style="color: black;">append</span><span style="color: black;">&#40;</span>book<span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">return</span> bookcollecter
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> unescape<span style="color: black;">&#40;</span>s<span style="color: black;">&#41;</span>:
	<span style="color: #483d8b;">&quot;&quot;&quot; unescape html entity strings &quot;&quot;&quot;</span>
	want_unicode = <span style="color: #008000;">False</span>
	<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>s, <span style="color: #008000;">unicode</span><span style="color: black;">&#41;</span>:
		s = s.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;utf-8&quot;</span><span style="color: black;">&#41;</span>
		want_unicode = <span style="color: #008000;">True</span>
&nbsp;
	<span style="color: #808080; font-style: italic;"># the rest of this assumes that `s` is UTF-8</span>
	<span style="color: #008000;">list</span> = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
&nbsp;
	<span style="color: #808080; font-style: italic;"># create and initialize a parser object</span>
	p = <span style="color: #dc143c;">xml</span>.<span style="color: black;">parsers</span>.<span style="color: black;">expat</span>.<span style="color: black;">ParserCreate</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;utf-8&quot;</span><span style="color: black;">&#41;</span>
	p.<span style="color: black;">buffer_text</span> = <span style="color: #008000;">True</span>
	p.<span style="color: black;">returns_unicode</span> = want_unicode
	p.<span style="color: black;">CharacterDataHandler</span> = <span style="color: #008000;">list</span>.<span style="color: black;">append</span>
&nbsp;
	<span style="color: #808080; font-style: italic;"># parse the data wrapped in a dummy element</span>
	<span style="color: #808080; font-style: italic;"># (needed so the &quot;document&quot; is well-formed)</span>
	p.<span style="color: black;">Parse</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;&lt;e&gt;&quot;</span>, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
	p.<span style="color: black;">Parse</span><span style="color: black;">&#40;</span>s, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
	p.<span style="color: black;">Parse</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;&lt;/e&gt;&quot;</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #808080; font-style: italic;"># join the extracted strings and return</span>
	es = <span style="color: #483d8b;">&quot;&quot;</span>
	<span style="color: #ff7700;font-weight:bold;">if</span> want_unicode:
		es = u<span style="color: #483d8b;">&quot;&quot;</span>
	<span style="color: #ff7700;font-weight:bold;">return</span> es.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #008000;">list</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>models.py——定义了所需的数据模型</p>

<div class="wp_codebox"><table><tr id="p51121"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
</pre></td><td class="code" id="p511code21"><pre class="python" style="font-family:Consolas;"><span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">datetime</span> <span style="color: #ff7700;font-weight:bold;">import</span> date
<span style="color: #ff7700;font-weight:bold;">from</span> setting <span style="color: #ff7700;font-weight:bold;">import</span> DB_FILE
<span style="color: #ff7700;font-weight:bold;">import</span> sqlite3
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Db<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
	handle = <span style="color: #008000;">False</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #008000;">self</span>.<span style="color: black;">setUp</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
		<span style="color: #008000;">self</span>.<span style="color: black;">getDbHandle</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> setUp<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">exists</span><span style="color: black;">&#40;</span>DB_FILE<span style="color: black;">&#41;</span>:
			c = <span style="color: #008000;">self</span>.<span style="color: black;">getDbHandle</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
			c.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'CREATE TABLE &quot;user&quot; (&quot;stu_no&quot; VARCHAR, &quot;password&quot; VARCHAR, &quot;email&quot; VARCHAR);'</span><span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> getDbHandle<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">handle</span>:
			<span style="color: #008000;">self</span>.<span style="color: black;">conn</span> = sqlite3.<span style="color: black;">connect</span><span style="color: black;">&#40;</span>DB_FILE<span style="color: black;">&#41;</span>
			<span style="color: #008000;">self</span>.<span style="color: black;">handle</span> = <span style="color: #008000;">self</span>.<span style="color: black;">conn</span>.<span style="color: black;">cursor</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">handle</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> query<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, sql<span style="color: black;">&#41;</span>:
		<span style="color: #008000;">self</span>.<span style="color: black;">handle</span>.<span style="color: black;">execute</span><span style="color: black;">&#40;</span>sql<span style="color: black;">&#41;</span>
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">handle</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> execute<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, sql<span style="color: black;">&#41;</span>:
		<span style="color: #008000;">self</span>.<span style="color: black;">handle</span>.<span style="color: black;">execute</span><span style="color: black;">&#40;</span>sql<span style="color: black;">&#41;</span>
		<span style="color: #008000;">self</span>.<span style="color: black;">conn</span>.<span style="color: black;">commit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">handle</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Book<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, data <span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span><span style="color: #008000;">type</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span> == <span style="color: #008000;">dict</span><span style="color: black;">&#41;</span>:
			<span style="color: #008000;">self</span>.<span style="color: #0000cd;">__dict__</span> = data
		<span style="color: #008000;">self</span>.<span style="color: black;">today</span> = date.<span style="color: black;">today</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__unicode__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">title</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> has_overdue<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">str2date</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">return_time</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #008000;">self</span>.<span style="color: black;">today</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> str2date<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, date_str<span style="color: black;">&#41;</span>:
		y,m,d = date_str.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'-'</span><span style="color: black;">&#41;</span>
		<span style="color: #ff7700;font-weight:bold;">return</span> date<span style="color: black;">&#40;</span><span style="color: #008000;">int</span><span style="color: black;">&#40;</span>y<span style="color: black;">&#41;</span>, <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>m<span style="color: black;">&#41;</span>, <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>d<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> can_renew<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">int</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">renew</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #ff4500;">2</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #008000;">self</span>.<span style="color: black;">remain_days</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #ff4500;">15</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> remain_days<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		remain = <span style="color: #008000;">self</span>.<span style="color: black;">str2date</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">return_time</span><span style="color: black;">&#41;</span> - <span style="color: #008000;">self</span>.<span style="color: black;">today</span>
		<span style="color: #ff7700;font-weight:bold;">return</span> remain.<span style="color: black;">days</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> User<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, stu_no, <span style="color: #dc143c;">pwd</span>, <span style="color: #dc143c;">email</span><span style="color: black;">&#41;</span>:
		<span style="color: #008000;">self</span>.<span style="color: black;">stu_no</span> = stu_no
		<span style="color: #008000;">self</span>.<span style="color: black;">password</span> = <span style="color: #dc143c;">pwd</span>
		<span style="color: #008000;">self</span>.<span style="color: #dc143c;">email</span> = <span style="color: #dc143c;">email</span>
	<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__unicode__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">stu_no</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> UserCollecter<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
	db = Db<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	collecter = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		result = <span style="color: #008000;">self</span>.<span style="color: black;">db</span>.<span style="color: black;">query</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;select * from user&quot;</span><span style="color: black;">&#41;</span>
		<span style="color: #ff7700;font-weight:bold;">for</span> row <span style="color: #ff7700;font-weight:bold;">in</span> result:
			<span style="color: #008000;">self</span>.<span style="color: black;">collecter</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span>User<span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>, row<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>, row<span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> getUsers<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">collecter</span></pre></td></tr></table></div>

<p>最后是main.py</p>

<div class="wp_codebox"><table><tr id="p51122"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
</pre></td><td class="code" id="p511code22"><pre class="python" style="font-family:Consolas;"><span style="color: #808080; font-style: italic;">#encoding=utf-8</span>
<span style="color: #ff7700;font-weight:bold;">from</span> functions <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span>
<span style="color: #ff7700;font-weight:bold;">from</span> models <span style="color: #ff7700;font-weight:bold;">import</span> UserCollecter
<span style="color: #ff7700;font-weight:bold;">from</span> mail <span style="color: #ff7700;font-weight:bold;">import</span> send_mail
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
 	usercollecter = UserCollecter<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	users = usercollecter.<span style="color: black;">getUsers</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">for</span> <span style="color: #dc143c;">user</span> <span style="color: #ff7700;font-weight:bold;">in</span> users:
		login<span style="color: black;">&#40;</span><span style="color: #dc143c;">user</span>.<span style="color: black;">stu_no</span>, <span style="color: #dc143c;">user</span>.<span style="color: black;">password</span><span style="color: black;">&#41;</span>
		data = booklist<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
		books = process_booklist<span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>
&nbsp;
		expired_books = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
		will_expired_books = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
&nbsp;
		<span style="color: #ff7700;font-weight:bold;">for</span> book <span style="color: #ff7700;font-weight:bold;">in</span> books:
			<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> book.<span style="color: black;">has_overdue</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
				<span style="color: #ff7700;font-weight:bold;">if</span> book.<span style="color: black;">can_renew</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
					msg = renew_book<span style="color: black;">&#40;</span>book.<span style="color: black;">bookid</span><span style="color: black;">&#41;</span>
				<span style="color: #ff7700;font-weight:bold;">elif</span> book.<span style="color: black;">remain_days</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">0</span> <span style="color: #ff7700;font-weight:bold;">and</span> book.<span style="color: black;">remain_days</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #ff4500;">4</span>:
					will_expired_books.<span style="color: black;">append</span><span style="color: black;">&#40;</span>book<span style="color: black;">&#41;</span>
			<span style="color: #ff7700;font-weight:bold;">else</span>:
				expired_books.<span style="color: black;">append</span><span style="color: black;">&#40;</span>book<span style="color: black;">&#41;</span>
		<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>expired_books<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">or</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>will_expired_books<span style="color: black;">&#41;</span>:
			content = r<span style="color: #483d8b;">'&lt;h1&gt;%s&lt;/h1&gt;&lt;br /&gt;'</span> <span style="color: #66cc66;">%</span> MAIL_SUBJECT
			<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>expired_books<span style="color: black;">&#41;</span>:
				content = r<span style="color: #483d8b;">'&lt;h3&gt;您的以下图书将要到期：&lt;/h3&gt;&lt;ul&gt;'</span> <span style="color: #66cc66;">%</span> MAIL_SUBJECT
				<span style="color: #ff7700;font-weight:bold;">for</span> b <span style="color: #ff7700;font-weight:bold;">in</span> will_expired_books:
					content += r<span style="color: #483d8b;">'&lt;li&gt;%s&lt;/li&gt;'</span> <span style="color: #66cc66;">%</span> b.<span style="color: black;">title</span>
				content += r<span style="color: #483d8b;">'&lt;/ul&gt;'</span>
			<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>will_expired_books<span style="color: black;">&#41;</span>:
				content += <span style="color: #483d8b;">'&lt;h3&gt;以下图书已经到期：&lt;/h3&gt;&lt;ul&gt;'</span>
				<span style="color: #ff7700;font-weight:bold;">for</span> b <span style="color: #ff7700;font-weight:bold;">in</span> expired_books:
					content += r<span style="color: #483d8b;">'&lt;li style=&quot;color:red;&quot;&gt;%s&lt;/li&gt;'</span> <span style="color: #66cc66;">%</span> b.<span style="color: black;">title</span>
				content += r<span style="color: #483d8b;">'&lt;/ul&gt;'</span>
			content += <span style="color: #483d8b;">'&lt;div style=&quot;text-indent:10em&quot;&gt;forever 21#322&lt;/div&gt;'</span>
			send_mail<span style="color: black;">&#40;</span><span style="color: #dc143c;">user</span>.<span style="color: #dc143c;">email</span>, MAIL_SUBJECT,content<span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p><strong>打包下载：</strong><a href="http://www.lfyzjck.com/wp-content/download/auto-book.rar" title="图书馆自动续借系统">auto-book.rar</a></p>
<h2  class="related_post_title">你可能还对以下日志感兴趣</h2><ul class="related_post"><li><a href="http://www.lfyzjck.com/2011-05-19/530.html" title="各种排序算法(Python实现)">各种排序算法(Python实现)</a></li><li><a href="http://www.lfyzjck.com/2011-01-12/438.html" title="数独(soduku)解法——基于Python的实现">数独(soduku)解法——基于Python的实现</a></li><li><a href="http://www.lfyzjck.com/2010-12-14/412.html" title="Python中对字典(dict)和列表(list)的排序">Python中对字典(dict)和列表(list)的排序</a></li><li><a href="http://www.lfyzjck.com/2010-12-04/401.html" title="Python中zip()函数用法举例">Python中zip()函数用法举例</a></li><li><a href="http://www.lfyzjck.com/2010-11-09/378.html" title="python的enumerate函数">python的enumerate函数</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.lfyzjck.com/2011-04-18/511.html/feed</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>在Yii中实现CKEditor编辑器中的图片上传功能</title>
		<link>http://www.lfyzjck.com/2011-04-11/506.html</link>
		<comments>http://www.lfyzjck.com/2011-04-11/506.html#comments</comments>
		<pubDate>Mon, 11 Apr 2011 13:33:40 +0000</pubDate>
		<dc:creator>南柯一梦</dc:creator>
				<category><![CDATA[PHPer]]></category>
		<category><![CDATA[CKEditor]]></category>
		<category><![CDATA[Yii]]></category>
		<category><![CDATA[Yii Framework]]></category>
		<category><![CDATA[图片上传]]></category>

		<guid isPermaLink="false">http://www.lfyzjck.com/?p=506</guid>
		<description><![CDATA[这几天做的一个项目中需要在所见即所得编辑器中实现图片上传的功能，我因为比较喜欢CKEditor的界面而选择了它。虽然有跟CKEditor配合良好的CKFinder，不过这个东东的功能太复杂，简单看了下CKEdtior的文档，发现这个功能还是可以自己实现而不用借助CKFinder的。 下面代码虽然基于Yii Framework的，但是用其他框架或者语言思路却是完全一样的，有需要的童鞋可以参考一下。 首先要让CkEditor出现图片上传的功能，需要配置编辑器的filebrowserImageUploadUrl属性： 1 2 3 4 5 CKEDITOR.replace&#40; 'editor1', &#123; filebrowserUploadUrl : '/uploader/upload.php', filebrowserImageUploadUrl : '/uploader/upload.php?type=Images' &#125;&#41;; 然后在对应的URL上实现图片上传的功能，并向CKEditor返回特定格式的HTML代码，CKEditor就能正常预览并插入图片了。 下面只截取控制器的部分代码，Controller部分我是这样实现的： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 &#8230; <a href="http://www.lfyzjck.com/2011-04-11/506.html">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>这几天做的一个项目中需要在所见即所得编辑器中实现图片上传的功能，我因为比较喜欢CKEditor的界面而选择了它。虽然有跟CKEditor配合良好的CKFinder，不过这个东东的功能太复杂，简单看了下CKEdtior的文档，发现这个功能还是可以自己实现而不用借助CKFinder的。</p>
<p>下面代码虽然基于Yii Framework的，但是用其他框架或者语言思路却是完全一样的，有需要的童鞋可以参考一下。</p>
<p>首先要让CkEditor出现图片上传的功能，需要配置编辑器的filebrowserImageUploadUrl属性：</p>

<div class="wp_codebox"><table><tr id="p50626"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p506code26"><pre class="javascript" style="font-family:Consolas;">CKEDITOR.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">'editor1'</span><span style="color: #339933;">,</span>
    <span style="color: #009900;">&#123;</span>
        filebrowserUploadUrl <span style="color: #339933;">:</span> <span style="color: #3366CC;">'/uploader/upload.php'</span><span style="color: #339933;">,</span>
        filebrowserImageUploadUrl <span style="color: #339933;">:</span> <span style="color: #3366CC;">'/uploader/upload.php?type=Images'</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>然后在对应的URL上实现图片上传的功能，并向CKEditor返回特定格式的HTML代码，CKEditor就能正常预览并插入图片了。<br />
下面只截取控制器的部分代码，Controller部分我是这样实现的：</p>

<div class="wp_codebox"><table><tr id="p50627"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
</pre></td><td class="code" id="p506code27"><pre class="php" style="font-family:Consolas;"><span style="color: #009933; font-style: italic;">/**
 * 保存上传的图片
 *
 * @return string javascript code
 * @author lfyzjck
 **/</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> actionImg<span style="color: #009900;">&#40;</span><span style="color: #000088;">$type</span><span style="color: #339933;">,</span> <span style="color: #000088;">$CKEditor</span><span style="color: #339933;">,</span> <span style="color: #000088;">$CKEditorFuncNum</span><span style="color: #339933;">,</span> <span style="color: #000088;">$langCode</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'zh-cn'</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><a href="http://www.php.net/empty"><span style="color: #990000;">empty</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$CKEditorFuncNum</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #000088;">$type</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">'Images'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">mkhtml</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$CKEditorFuncNum</span><span style="color: #339933;">,</span><span style="color: #0000ff;">''</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'错误的函数调用'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><a href="http://www.php.net/isset"><span style="color: #990000;">isset</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_FILES</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'upload'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">//获取关于图片上传配置</span>
		<span style="color: #000088;">$options</span> <span style="color: #339933;">=</span> Options<span style="color: #339933;">::</span><span style="color: #004000;">model</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">findByPk</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$form</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> UploadForm<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'image'</span><span style="color: #339933;">,</span><span style="color: #000088;">$options</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">upload</span> <span style="color: #339933;">=</span> CUploadedFile<span style="color: #339933;">::</span><span style="color: #004000;">getInstanceByName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'upload'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">validate</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">//文件名：时间+源文件名</span>
			<span style="color: #000088;">$target_filename</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/date"><span style="color: #990000;">date</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Ymd-hm'</span><span style="color: #339933;">,</span><a href="http://www.php.net/time"><span style="color: #990000;">time</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #000088;">$form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">upload</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$path</span> <span style="color: #339933;">=</span> Yii<span style="color: #339933;">::</span><span style="color: #004000;">app</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">basePath</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/../uploads/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$target_filename</span><span style="color: #339933;">;</span>			<span style="color: #666666; font-style: italic;">//图片保存路径</span>
			<span style="color: #000088;">$form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">upload</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">saveAs</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$path</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">mkhtml</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$CKEditorFuncNum</span><span style="color: #339933;">,</span>Yii<span style="color: #339933;">::</span><span style="color: #004000;">app</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">baseUrl</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/uploads/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$target_filename</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;上传成功&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">mkhtml</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$CKEditorFuncNum</span><span style="color: #339933;">,</span><span style="color: #0000ff;">''</span><span style="color: #339933;">,</span><span style="color: #000088;">$form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getError</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'upload'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009933; font-style: italic;">/**
 * 返回CKEditor的提示信息
 *
 * @return void
 * @author lfyzjck
 **/</span>
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> mkhtml<span style="color: #009900;">&#40;</span><span style="color: #000088;">$fn</span><span style="color: #339933;">,</span> <span style="color: #000088;">$fileurl</span><span style="color: #339933;">,</span> <span style="color: #000088;">$message</span><span style="color: #009900;">&#41;</span> 
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$str</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'&lt;script type=&quot;text/javascript&quot;&gt;window.parent.CKEDITOR.tools.callFunction('</span><span style="color: #339933;">.</span><span style="color: #000088;">$fn</span><span style="color: #339933;">.</span><span style="color: #0000ff;">', &quot;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$fileurl</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&quot;, \''</span><span style="color: #339933;">.</span><span style="color: #000088;">$message</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'\')&lt;/script&gt;'</span><span style="color: #339933;">;</span>
	<a href="http://www.php.net/exit"><span style="color: #990000;">exit</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>需要特别说明的mkhtml函数，他会调用CKEditor的函数产生提示信息。上传成功的时候将图片链接返回，CKEditor会根据URL生成图片预览。<br />
<span id="more-506"></span><br />
然后是UploadForm的代码，这里会验证图片的格式和大小是否符合要求。</p>

<div class="wp_codebox"><table><tr id="p50628"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="code" id="p506code28"><pre class="php" style="font-family:Consolas;"><span style="color: #000000; font-weight: bold;">class</span> UploadForm <span style="color: #000000; font-weight: bold;">extends</span> CFormModel
<span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$upload</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$options</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$type</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$type</span><span style="color: #339933;">,</span> <span style="color: #000088;">$options</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">options</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$options</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">type</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$type</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #009933; font-style: italic;">/**
	 * Declares the validation rules.
	 * The rules state that username and password are required,
	 * and password needs to be authenticated.
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> rules<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span>
			<a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'upload'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'file'</span><span style="color: #339933;">,</span> 
				<span style="color: #0000ff;">'types'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">options</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;allow_&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">type</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;_type&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> 
				<span style="color: #0000ff;">'maxSize'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1024</span> <span style="color: #339933;">*</span> <span style="color: #009900;">&#40;</span>int<span style="color: #009900;">&#41;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">options</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;allow_&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">type</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;_maxsize&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
				<span style="color: #0000ff;">'tooLarge'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'文件大小超过限制'</span><span style="color: #339933;">,</span>
			<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h2  class="related_post_title">你可能还对以下日志感兴趣</h2><ul class="related_post"><li><a href="http://www.lfyzjck.com/2011-09-24/558.html" title="在Yii Framework中集成Twig">在Yii Framework中集成Twig</a></li><li><a href="http://www.lfyzjck.com/2010-11-27/396.html" title="PHP的文件缓存(File Cache)">PHP的文件缓存(File Cache)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.lfyzjck.com/2011-04-11/506.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>从日本的核爆炸说起</title>
		<link>http://www.lfyzjck.com/2011-03-17/490.html</link>
		<comments>http://www.lfyzjck.com/2011-03-17/490.html#comments</comments>
		<pubDate>Thu, 17 Mar 2011 03:11:28 +0000</pubDate>
		<dc:creator>南柯一梦</dc:creator>
				<category><![CDATA[杂谈]]></category>
		<category><![CDATA[日本地震]]></category>
		<category><![CDATA[福岛县核电站]]></category>

		<guid isPermaLink="false">http://www.lfyzjck.com/?p=490</guid>
		<description><![CDATA[昨天傍晚上新浪微博，发现上面充斥关于食盐脱销的消息，事情发展到这一步，真的让人有点啼笑皆非。好在学校里一切如常，不知道会不会闹到炒菜做饭都没盐的底部。事情大概的发展经历是这样子的： 日本福岛核电站发生爆炸以后，大家就在热烈讨论着放射性微粒会不会随着大风或者海流影响到中国，万一有影响该如何防范的问题。据卫生部回应以及方舟子先生的建议 ﻿@方舟子：核尘埃若含放射性碘，人体吸入后富集在甲状腺，对甲状腺造成伤害。服用碘片可减少对放射性碘的吸收，保护甲状腺。在吸入放射性碘数小时前服用可起到100%保护作用。在吸入的同时服用也基本可保护。所以没必要提前服用。碘片剂量（100毫克）远远超出碘的每日限量（一天1.1毫克），没事不要乱吃。 对于这个说法我虽然无法驳斥，但我相信放射性微粒绝对不止有碘元素，阻断对碘的吸收到底对防辐射有多大帮助很难评估，不如躲在室内不要出来的实在。之后的一条短信才是将这次事件推向了高潮： BBC新闻台的最新消息：日本政府证实因第二波地震而波及的福岛显的核子厂，辐射外泄抢救失败，以开始蔓延至亚洲区域国家。预期今日下午4点抵达菲律宾。促使人们在接下来的24小时尽量不要外出，穿长袖衣物，保护身体免受辐射攻击，尤其是颈项部位最容易受害。请把这条讯息传达给您身在亚洲各地的亲人与朋友！ 人们都为了自己的亲友善意的转发着这条短信。这条真假参半的讯息也是煞费苦心，不知道从什么时候开始，英国的BBC的公信度已经超过了国内各大传统媒体。收到短信的时候我已经在怀疑了，日本2号机组发生爆炸已经是受到短信前一天的事情了，为什么在这么长的时间里就没有听说核辐射会立即扩散到亚洲的消息？作为一名微博控，我表示不能理解。。。晚上回到寝室就听说食盐被抢购一空，浙江、上海一代据说盐都卖光了。原因是人们担心海水受到辐射污染，生产出来的盐不安全，都开始囤积。于是短时间内，网上流传这样的段子： 今年卖盐，明年买房～ 相比日本民众遭遇如此大的危难都可以井然有序，中国人对一条不靠谱的流言就已经有如此的反应，也难怪了政府喜欢隐瞒危机，更难怪民众不信任政府。其实早有一种先入为主观念，人民更愿意相信这次日本核危机是对中国有影响的，所以他们会等待，等待有个媒体站出来说：“核辐射要来了，大家快跑吧！”，在此之前的任何砖家的辟谣恐怕都会被无视。 一个很有意思的现象是，在谣言到处散播的时候，身边一些做互联网的人都非常冷静的驳斥这些不实的言论，难道做互联网的人更理智或者更聪明么？昨晚跟室友讨论食盐售罄的事情，我引用了《杭州日报》的一条消息，说这个事情不用恐慌。室友表示出不屑，说难道杭州日报的消息就值得相信么？今天忽然明白了，并非做互联网的人就更理智，而是他们接触到信息更多，他们能同时看到各种谣言和辟谣，逼迫着思考着谁对谁错。一般民众看到更多的是口径一致的辟谣消息，反而让人怀疑。或许攻破谣言的最好方法，就是让他曝露在阳光之下，而不是试图阻止它的传播。 热门日志豆瓣风格的Wordpress主题数独(soduku)解法——基于Python的实现图书馆自动续借系统更换域名到lfyzjck.com各种排序算法(Python实现)]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.lfyzjck.com/wp-content/uploads/2011/03/7061c249tw6dfavip26h9j.jpg"><img style="padding: 20px; float: left;" title="7061c249tw6dfavip26h9j" src="http://www.lfyzjck.com/wp-content/uploads/2011/03/7061c249tw6dfavip26h9j.jpg" alt="人们抢购食盐" width="289" height="407" /></a></p>
<div>
<p>昨天傍晚上新浪微博，发现上面充斥关于食盐脱销的消息，事情发展到这一步，真的让人有点啼笑皆非。好在学校里一切如常，不知道会不会闹到炒菜做饭都没盐的底部。事情大概的发展经历是这样子的：</p>
<p>日本福岛核电站发生爆炸以后，大家就在热烈讨论着放射性微粒会不会随着大风或者海流影响到中国，万一有影响该如何防范的问题。据卫生部回应以及方舟子先生的建议</p>
<blockquote><p>﻿<a href="http://t.sina.com.cn/1195403385">@方舟子<img title="新浪认证" src="http://img.t.sinajs.cn/t3/style/images/common/transparent.gif" alt="" /></a>：核尘埃若含放射性碘，人体吸入后富集在甲状腺，对甲状腺造成伤害。服用碘片可减少对放射性碘的吸收，保护甲状腺。在吸入放射性碘数小时前服用可起到100%保护作用。在吸入的同时服用也基本可保护。所以没必要提前服用。碘片剂量（100毫克）远远超出碘的每日限量（一天1.1毫克），没事不要乱吃。</p></blockquote>
<p>对于这个说法我虽然无法驳斥，但我相信放射性微粒绝对不止有碘元素，阻断对碘的吸收到底对防辐射有多大帮助很难评估，不如躲在室内不要出来的实在。之后的一条短信才是将这次事件推向了高潮：</p>
<p><span id="more-490"></span></p>
<blockquote><p>BBC新闻台的最新消息：日本政府证实因第二波地震而波及的福岛显的核子厂，辐射外泄抢救失败，以开始蔓延至亚洲区域国家。预期今日下午4点抵达菲律宾。促使人们在接下来的24小时尽量不要外出，穿长袖衣物，保护身体免受辐射攻击，尤其是颈项部位最容易受害。请把这条讯息传达给您身在亚洲各地的亲人与朋友！</p></blockquote>
<p>人们都为了自己的亲友善意的转发着这条短信。这条真假参半的讯息也是煞费苦心，不知道从什么时候开始，英国的BBC的公信度已经超过了国内各大传统媒体。收到短信的时候我已经在怀疑了，日本2号机组发生爆炸已经是受到短信前一天的事情了，为什么在这么长的时间里就没有听说核辐射会立即扩散到亚洲的消息？作为一名微博控，我表示不能理解。。。晚上回到寝室就听说食盐被抢购一空，浙江、上海一代据说盐都卖光了。原因是人们担心海水受到辐射污染，生产出来的盐不安全，都开始囤积。于是短时间内，网上流传这样的段子：</p>
<blockquote><p>今年卖盐，明年买房～</p></blockquote>
<p>相比日本民众遭遇如此大的危难都可以井然有序，中国人对一条不靠谱的流言就已经有如此的反应，也难怪了政府喜欢隐瞒危机，更难怪民众不信任政府。其实早有一种先入为主观念，人民更愿意相信这次日本核危机是对中国有影响的，所以他们会等待，等待有个媒体站出来说：“核辐射要来了，大家快跑吧！”，在此之前的任何砖家的辟谣恐怕都会被无视。</p>
<p>一个很有意思的现象是，在谣言到处散播的时候，身边一些做互联网的人都非常冷静的驳斥这些不实的言论，难道做互联网的人更理智或者更聪明么？昨晚跟室友讨论食盐售罄的事情，我引用了《杭州日报》的一条消息，说这个事情不用恐慌。室友表示出不屑，说难道杭州日报的消息就值得相信么？今天忽然明白了，并非做互联网的人就更理智，而是他们接触到信息更多，他们能同时看到各种谣言和辟谣，逼迫着思考着谁对谁错。一般民众看到更多的是口径一致的辟谣消息，反而让人怀疑。或许攻破谣言的最好方法，就是让他曝露在阳光之下，而不是试图阻止它的传播。</p>
</div>
<h2  class="related_post_title">热门日志</h2><ul class="related_post"><li><a href="http://www.lfyzjck.com/2011-05-16/521.html" title="豆瓣风格的Wordpress主题">豆瓣风格的Wordpress主题</a></li><li><a href="http://www.lfyzjck.com/2011-01-12/438.html" title="数独(soduku)解法——基于Python的实现">数独(soduku)解法——基于Python的实现</a></li><li><a href="http://www.lfyzjck.com/2011-04-18/511.html" title="图书馆自动续借系统">图书馆自动续借系统</a></li><li><a href="http://www.lfyzjck.com/2010-03-16/310.html" title="更换域名到lfyzjck.com">更换域名到lfyzjck.com</a></li><li><a href="http://www.lfyzjck.com/2011-05-19/530.html" title="各种排序算法(Python实现)">各种排序算法(Python实现)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.lfyzjck.com/2011-03-17/490.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>【译】Ajax和Web Service中的数据格式</title>
		<link>http://www.lfyzjck.com/2011-02-24/470.html</link>
		<comments>http://www.lfyzjck.com/2011-02-24/470.html#comments</comments>
		<pubDate>Thu, 24 Feb 2011 05:35:17 +0000</pubDate>
		<dc:creator>南柯一梦</dc:creator>
				<category><![CDATA[杂谈]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[JSONP]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[Web Servcie]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.lfyzjck.com/?p=470</guid>
		<description><![CDATA[原文地址：http://blogs.sitepoint.com/2011/02/05/ajax-data-formats-xml-soap-html/ 当Jesse James Garrett发明了AJAX的时候，它本来的意思是“异步JavaScript和XML”（Asynchronous JavaScript and XML），本质上，你可以通过以下步骤实现： 创建一个Web Service，比如一个通过HTTP GET/POST方式传递参数后就能返回XML数据的PHP页面。 编写客户端JavaScript访问Web Service，即传递参数并取出返回的XML，因为请求是被异步的处理的缘故，浏览器在等待数据返回的过程中不会锁死。 解析XML并相应的更新HTML文档。 AJAX这个名字被很多开发人员滥用。今天，这个由大写字母构成的缩写已经进化成Ajax——任何在浏览器和服务器之间传输数据并且不需要整个页面刷新的技术代名词，原因如下： 异步方法并不是必须的（虽然大部分时候需要） 你不是必须使用Javascript 你当然也不一定需要XML 最终，不论你使用何种技术，你仍然必须在两个设备之间传输数据。这篇是这个系列文章的第一部分，谈论各种格式的优缺点。 XML 在开始的时候，XML是最合适的选择。因为几乎没有其他正式的数据交换格式，而且大部分语言提供了创建、验证、解析XML的库。即使你使用的语言没有直接支持XML，但XML几乎是纯文本： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 &#8230; <a href="http://www.lfyzjck.com/2011-02-24/470.html">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>原文地址：</strong><a href="http://blogs.sitepoint.com/2011/02/05/ajax-data-formats-xml-soap-html/">http://blogs.sitepoint.com/2011/02/05/ajax-data-formats-xml-soap-html/</a></p>
<p>当Jesse James Garrett发明了AJAX的时候，它本来的意思是“异步JavaScript和XML”（Asynchronous JavaScript and XML），本质上，你可以通过以下步骤实现：</p>
<ol>
<li>创建一个Web Service，比如一个通过HTTP GET/POST方式传递参数后就能返回XML数据的PHP页面。</li>
<li>编写客户端JavaScript访问Web Service，即传递参数并取出返回的XML，因为请求是被异步的处理的缘故，浏览器在等待数据返回的过程中不会锁死。</li>
<li>解析XML并相应的更新HTML文档。</li>
</ol>
<p>AJAX这个名字被很多开发人员滥用。今天，这个由大写字母构成的缩写已经进化成Ajax——任何在浏览器和服务器之间传输数据并且不需要整个页面刷新的技术代名词，原因如下：</p>
<ol>
<li>异步方法并不是必须的（虽然大部分时候需要）</li>
<li>你不是必须使用Javascript</li>
<li>你当然也不一定需要XML</li>
</ol>
<p>最终，不论你使用何种技术，你仍然必须在两个设备之间传输数据。这篇是这个系列文章的第一部分，谈论各种格式的优缺点。<br />
<span id="more-470"></span></p>
<h2>XML</h2>
<p>在开始的时候，XML是最合适的选择。因为几乎没有其他正式的数据交换格式，而且大部分语言提供了创建、验证、解析XML的库。即使你使用的语言没有直接支持XML，但XML几乎是纯文本：</p>

<div class="wp_codebox"><table><tr id="p47036"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
</pre></td><td class="code" id="p470code36"><pre class="xml" style="font-family:Consolas;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;products<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;book<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>The Principles of Beautiful Web Design, 2nd Edition<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>http://www.sitepoint.com/books/design2/<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;author<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Jason Beaird<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/author<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;publisher<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>SitePoint<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/publisher<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;price</span> <span style="color: #000066;">currency</span>=<span style="color: #ff0000;">&quot;USD&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>39.95<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/price<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/book<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;book<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>jQuery: Novice to Ninja<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>http://www.sitepoint.com/books/jquery1/<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;author<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Earle Castledine <span style="color: #ddbb00;">&amp;amp;</span> Craig Sharkie<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/author<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;publisher<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>SitePoint<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/publisher<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;price</span> <span style="color: #000066;">currency</span>=<span style="color: #ff0000;">&quot;USD&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>29.95<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/price<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/book<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;book<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Build Your Own Database Driven Website<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>http://www.sitepoint.com/books/phpmysql4/<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;author<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Kevin Yank<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/author<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;publisher<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>SitePoint<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/publisher<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;price</span> <span style="color: #000066;">currency</span>=<span style="color: #ff0000;">&quot;USD&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>39.95<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/price<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/book<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/products<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>XML的优点包括：</p>
<ul>
<li>XML相比其他数据格式非常便于人类阅读和理解（假定你使用容易理解的标签）。在我之前的文章中，<a href="http://blogs.sitepoint.com/2011/01/05/create-your-own-twitter-widget-1/">怎样使用PHP创建自己的Twitter的Widget</a>，我使用XML格式的feed作为参考即使应用程序并没有真正使用它。</li>
<li>绝大多数语言包括Javascript提供了对XML出色的支持</li>
<li>XML提供了合理的安全特性，数据必须被提取和分析，因此不能轻易的包含的恶意数据。</li>
</ul>
<p>不幸的是，使用XML也有很多缺点：</p>
<ul>
<li>对于你发布的数据，并不总存在一个符合工业标准的XML规范，你必须适应一种规范比如RSS，但是即使那样，你也必须编写代码以使客户端能够理解。</li>
<li>XML对于少量数据来说高度冗余，理想情况下，Ajax响应的数据应该尽可能的少，以便减少带宽和浏览器资源的占用</li>
<li>XML有时候有些模棱两可。一个项目有时候既可以看成一个新的元素也能看成一个已存在元素的一项属性。你必须慎重选择属性来减小XML的体积，但这不是一个很好的采纳理由</li>
<li>在Javascript中解析XML比较繁琐，XPath没有被完整的支持，因此必须将数据解开并将字符串转换成Javascript的变量才能使用</li>
</ul>

<div class="wp_codebox"><table><tr id="p47037"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p470code37"><pre class="javascript" style="font-family:Consolas;"><span style="color: #006600; font-style: italic;">// grab value in first &lt;data&gt; element</span>
<span style="color: #003366; font-weight: bold;">var</span> xml <span style="color: #339933;">=</span> xhr.<span style="color: #660066;">responseXML</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> nodes <span style="color: #339933;">=</span> xml.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;data&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> data <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>nodes.<span style="color: #660066;">length</span> <span style="color: #339933;">&gt;</span> <span style="color: #CC0000;">0</span> <span style="color: #339933;">?</span> nodes<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">firstChild</span>.<span style="color: #660066;">nodeValue</span> <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>很多开发者认为XML已经快死亡了，但我不这么认为。XML也许不是Ajax客户端的最佳选择，但你并不总是知道Web服务能提供给你什么，XML因为它的普遍存在也成为一种不错的选择——千万不要忽视它。</p>
<h2>SOAP</h2>
<p>SOAP是一个标准的Web服务数据交换格式，所有技术细节可以多达好几百页，但最终SOAP依赖于定义良好的XML模式。<br />
几乎没有开发者愿意直接使用SOAP，SOAP的优势在与客户端代码库能自动将XML响应解析成本地对象，比如.NET开发者能轻松的创建基于SOAP的Web Service服务端和客户端。就开发着而言，他们仅仅是一个C#对象——即使他们是在远程机器是被实例化的。<br />
不幸的是，SOAP与的XML亲缘，决定了：</p>
<ul>
<li>SOAP比XML更加冗余</li>
<li>在Javascript中解析SOAP消息仍然非常困难，也许你可以借助SOAP的一些库来实现，但这对开发者和浏览器而言都是一个不小的负担。</li>
</ul>
<p>对于服务端到服务端（Server-to-server）的通信而言，SOAP仍然是一个可行的选择——尤其当两台服务器处在同一个网络中时。然而，SOAP对大多数Ajax请求而言显得过于笨拙。</p>
<h2>HTML</h2>
<p>如果你希望将Ajax返回的数据直接插入到页面当中而不想进一步解析的话，HTML是一个很不错的选择。比如，假设你有一个小型的购物车控件，它需要出现在每个页面当中。你已经有了服务端代码能够创建这个购物车，当商品被购买的时候，购物车的HTML代码就能通过Ajax响应的方式相应返回。<br />
HTML的有点包括：</p>
<ul>
<li>能够轻松的重用现有代码构建Web服务端。</li>
<li>在客户端不需要很复杂的数据解析。</li>
<li>HTML可以通过innerHTML方法快速插入到页面当中。</li>
</ul>
<p>当然也有劣势：</p>
<ul>
<li>想从HTML代码中提取出有用数据可能会比较困难。比如当你想把购物车展示在别的地方的时候，想HTML代码中识别出有用数据就不那么容易了。</li>
<li>相比需要的信息，HTML还是有些冗余，甚至比等价的XML信息的体积还要大</li>
<li>将HTML直接注入到页面中有破坏当前页面布局的风险</li>
<li>安全问题——响应数据中可能包含恶意脚本</li>
</ul>
<h2><a href="http://zh.wikipedia.org/wiki/JSON">JSON</a></h2>
<p>Javascript对象表示（JavaScript Object Notation）是由Javascript专家Douglas Crockford发明的。JSON本质上是由Javascript对象（obejct）和数组（array）语法表示的轻量级的数据交换格式。<br />
我们把刚刚图书例子中的XML转化成等价的JSON表示：</p>

<div class="wp_codebox"><table><tr id="p47038"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code" id="p470code38"><pre class="javascript" style="font-family:Consolas;"><span style="color: #009900;">&#91;</span>
	<span style="color: #009900;">&#123;</span>
		title<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;The Principles of Beautiful Web Design, 2nd Edition&quot;</span><span style="color: #339933;">,</span>
		url<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;http://www.sitepoint.com/books/design2/&quot;</span><span style="color: #339933;">,</span>
		author<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;Jason Beaird&quot;</span><span style="color: #339933;">,</span>
		publisher<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;SitePoint&quot;</span><span style="color: #339933;">,</span>
		price<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
			currency<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;USD&quot;</span><span style="color: #339933;">,</span>
			amount<span style="color: #339933;">:</span> <span style="color: #CC0000;">39.95</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
	<span style="color: #009900;">&#123;</span>
		title<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;jQuery: Novice to Ninja&quot;</span><span style="color: #339933;">,</span>
		url<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;http://www.sitepoint.com/books/jquery1/&quot;</span><span style="color: #339933;">,</span>
		author<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;JEarle Castledine &amp; Craig Sharkie&quot;</span><span style="color: #339933;">,</span>
		publisher<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;SitePoint&quot;</span><span style="color: #339933;">,</span>
		price<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
			currency<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;USD&quot;</span><span style="color: #339933;">,</span>
			amount<span style="color: #339933;">:</span> <span style="color: #CC0000;">29.95</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
	<span style="color: #009900;">&#123;</span>
		title<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;Build Your Own Database Driven Website&quot;</span><span style="color: #339933;">,</span>
		url<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;http://www.sitepoint.com/books/phpmysql4/&quot;</span><span style="color: #339933;">,</span>
		author<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;Kevin Yank&quot;</span><span style="color: #339933;">,</span>
		publisher<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;SitePoint&quot;</span><span style="color: #339933;">,</span>
		price<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
			currency<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;USD&quot;</span><span style="color: #339933;">,</span>
			amount<span style="color: #339933;">:</span> <span style="color: #CC0000;">39.95</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#93;</span></pre></td></tr></table></div>

<p>这是一个用对象描述书籍信息的数组，包含title、url、author、publisher、price属性，其中price也是一个对象，包括currency和amount两个属性。<br />
在Javascript中解析一串JSON数据非常容易。理想情况下，你可以使用浏览器自带的JSON.parse(json-string)方法或者像Douglas Crockford’s <a href="https://github.com/douglascrockford/JSON-js">JSON-js</a>这样的第三方库，即便上面这些方法都不行，你还是可以使用Javascript自带的eval()函数，这样几乎不用写什么代码就能完成对JSON的解析。</p>

<div class="wp_codebox"><table><tr id="p47039"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p470code39"><pre class="javascript" style="font-family:Consolas;"><span style="color: #003366; font-weight: bold;">var</span> json <span style="color: #339933;">=</span> xhr.<span style="color: #660066;">responseText</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> book <span style="color: #339933;">=</span> JSON.<span style="color: #660066;">parse</span><span style="color: #009900;">&#40;</span>json<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>book<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">title</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// first book title</span>
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>book<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">url</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// second book URL</span></pre></td></tr></table></div>

<p>使用JSON的优势有以下几点：</p>
<ul>
<li>相比XML更加小型，更少的冗余</li>
<li>XML通常情况下可读性比较好，尽管使用制表符和换行会增大他的体积。浏览器不会像XML那样将JSON格式化成可读的格式来正常显示，当然在Firefox, Chrome和Opera中有插件可以完成这项任务。</li>
<li>在Javascript中解析JSON数据非常方便</li>
<li>JSON也被其他语言支持，比如PHP、Python</li>
</ul>
<p>当然JSON也有不足之处：</p>
<ul>
<li>相比XML，JSON还没有在服务端语言中获得广泛的支持，尽管已经有很多第三方的库可以完成这些任务</li>
<li>过度依赖Javascript的eval()方法可能会引发一些安全问题</li>
</ul>
<h2>JSONP (or JSON-P)</h2>
<p>如果你使用XMLHttpRequest去掉用一个JSON服务端，会返回可以用JSON.parse()或着eval()解析的字符串。同时你也可以用脚本注入技术，比如将script标签插入到DOM树中来加载远程代码。</p>

<div class="wp_codebox"><table><tr id="p47040"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p470code40"><pre class="javascript" style="font-family:Consolas;"><span style="color: #003366; font-weight: bold;">var</span> script <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;script&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
script.<span style="color: #660066;">src</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;http://webservice.com/?a=1&amp;b=2&quot;</span><span style="color: #339933;">;</span>
document.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;head&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>script<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>与XMLHttpRequest不同的是，脚本注入技术可以跨域请求。这使得这种技术常被用于流量分析、书签、Widget控件以及广告系统中。不幸的是，通过这种技术返回JSON数据被当作本地Javascript代码立即执行而不会赋值给变量。这个问题我们可以通过传递给Web服务一个回调函数（callback function）来克服。</p>

<div class="wp_codebox"><table><tr id="p47041"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p470code41"><pre class="javascript" style="font-family:Consolas;"><span style="color: #003366; font-weight: bold;">var</span> script <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;script&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
script.<span style="color: #660066;">src</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;http://webservice.com/?a=1&amp;b=2&amp;callback=MyDataHandler&quot;</span><span style="color: #339933;">;</span>
document.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;head&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>script<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>当下载完成的时候，服务端返回的JSON数据就会赋给回调函数，这就是JSONP技术——JSON with padding。</p>

<div class="wp_codebox"><table><tr id="p47042"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code" id="p470code42"><pre class="javascript" style="font-family:Consolas;">MyDataHandler<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#91;</span>
	<span style="color: #009900;">&#123;</span>
		title<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;The Principles of Beautiful Web Design, 2nd Edition&quot;</span><span style="color: #339933;">,</span>
		url<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;http://www.sitepoint.com/books/design2/&quot;</span><span style="color: #339933;">,</span>
		author<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;Jason Beaird&quot;</span><span style="color: #339933;">,</span>
		publisher<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;SitePoint&quot;</span><span style="color: #339933;">,</span>
		price<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
			currency<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;USD&quot;</span><span style="color: #339933;">,</span>
			amount<span style="color: #339933;">:</span> <span style="color: #CC0000;">39.95</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	...
<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>JSON和JSONP已经成为Ajax通信中非常流行的数据格式，但是将来开始有可能出现体积更小的数据格式。</p>
<h2  class="related_post_title">你可能还对以下日志感兴趣</h2><ul class="related_post"><li><a href="http://www.lfyzjck.com/2009-10-05/236.html" title="获取QQ好友的滔滔心情">获取QQ好友的滔滔心情</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.lfyzjck.com/2011-02-24/470.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

