<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>笨笨剥壳&#124;BENBEN.CC</title>
	<atom:link href="http://www.benben.cc/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.benben.cc/blog</link>
	<description>路漫漫其修远兮，吾将上下而求索。</description>
	<lastBuildDate>Sun, 06 May 2012 07:21:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Javascript 绝句</title>
		<link>http://www.benben.cc/blog/?p=391</link>
		<comments>http://www.benben.cc/blog/?p=391#comments</comments>
		<pubDate>Mon, 30 Apr 2012 13:25:26 +0000</pubDate>
		<dc:creator>破锣锅</dc:creator>
				<category><![CDATA[Javascript/Ajax]]></category>

		<guid isPermaLink="false">http://www.benben.cc/blog/?p=391</guid>
		<description><![CDATA[像诗一样的 Javascript 代码。
1. 取整同时转成数值型：

'10.567890'&#124;0
//结果: 10
'10.567890'^0
//结果: 10
-2.23456789&#124;0
//结果: -2
~~-2.23456789
//结果: -2

2. 日期转数值：

var d = +new Date&#40;&#41;; //1295698416792

3. 类数组对象转数组：

var arr = &#91;&#93;.slice.call&#40;arguments&#41;

4. 漂亮的随机码：

Math.random&#40;&#41;.toString&#40;16&#41;.substring&#40;2&#41;; //14位
Math.random&#40;&#41;.toString&#40;36&#41;.substring&#40;2&#41;; //11位

5. 合并数组：

var a = &#91;1,2,3&#93;;
var b = &#91;4,5,6&#93;;
Array.prototype.push.apply&#40;a, b&#41;;
uneval&#40;a&#41;; //[1,2,3,4,5,6]

6. 用0补全位数：

function prefixInteger&#40;num, length&#41; &#123;
	return &#40;num / Math.pow&#40;10, length&#41;&#41;.toFixed&#40;length&#41;.substr&#40;2&#41;;
&#125;

7. 交换值：

a= &#91;b, b=a&#93;&#91;0&#93;;

8. 将一个数组插入另一个数组的指定位置：

var a = &#91;1,2,3,7,8,9&#93;;
var b = &#91;4,5,6&#93;;
var insertIndex = 3;
a.splice.apply&#40;a, Array.concat&#40;insertIndex, 0, b&#41;&#41;;
// a: [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>像诗一样的 Javascript 代码。</p></blockquote>
<p>1. 取整同时转成数值型：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:"Courier New";"><span style="color: #3366CC;">'10.567890'</span><span style="color: #339933;">|</span><span style="color: #CC0000;">0</span>
<span style="color: #006600; font-style: italic;">//结果: 10</span>
<span style="color: #3366CC;">'10.567890'</span><span style="color: #339933;">^</span><span style="color: #CC0000;">0</span>
<span style="color: #006600; font-style: italic;">//结果: 10</span>
<span style="color: #339933;">-</span><span style="color: #CC0000;">2.23456789</span><span style="color: #339933;">|</span><span style="color: #CC0000;">0</span>
<span style="color: #006600; font-style: italic;">//结果: -2</span>
~~<span style="color: #339933;">-</span><span style="color: #CC0000;">2.23456789</span>
<span style="color: #006600; font-style: italic;">//结果: -2</span></pre></div></div>

<p>2. 日期转数值：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:"Courier New";"><span style="color: #003366; font-weight: bold;">var</span> d <span style="color: #339933;">=</span> <span style="color: #339933;">+</span><span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//1295698416792</span></pre></div></div>

<p>3. 类数组对象转数组：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:"Courier New";"><span style="color: #003366; font-weight: bold;">var</span> arr <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">slice</span>.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span>arguments<span style="color: #009900;">&#41;</span></pre></div></div>

<p>4. 漂亮的随机码：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:"Courier New";">Math.<span style="color: #660066;">random</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">16</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//14位</span>
Math.<span style="color: #660066;">random</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">36</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//11位</span></pre></div></div>

<p>5. 合并数组：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:"Courier New";"><span style="color: #003366; font-weight: bold;">var</span> a <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> b <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">4</span><span style="color: #339933;">,</span><span style="color: #CC0000;">5</span><span style="color: #339933;">,</span><span style="color: #CC0000;">6</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
Array.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">push</span>.<span style="color: #660066;">apply</span><span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> b<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
uneval<span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//[1,2,3,4,5,6]</span></pre></div></div>

<p>6. 用0补全位数：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:"Courier New";"><span style="color: #003366; font-weight: bold;">function</span> prefixInteger<span style="color: #009900;">&#40;</span>num<span style="color: #339933;">,</span> length<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span>num <span style="color: #339933;">/</span> Math.<span style="color: #660066;">pow</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">10</span><span style="color: #339933;">,</span> length<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">toFixed</span><span style="color: #009900;">&#40;</span>length<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>7. 交换值：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:"Courier New";">a<span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span>b<span style="color: #339933;">,</span> b<span style="color: #339933;">=</span>a<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span></pre></div></div>

<p>8. 将一个数组插入另一个数组的指定位置：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:"Courier New";"><span style="color: #003366; font-weight: bold;">var</span> a <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">3</span><span style="color: #339933;">,</span><span style="color: #CC0000;">7</span><span style="color: #339933;">,</span><span style="color: #CC0000;">8</span><span style="color: #339933;">,</span><span style="color: #CC0000;">9</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> b <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">4</span><span style="color: #339933;">,</span><span style="color: #CC0000;">5</span><span style="color: #339933;">,</span><span style="color: #CC0000;">6</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> insertIndex <span style="color: #339933;">=</span> <span style="color: #CC0000;">3</span><span style="color: #339933;">;</span>
a.<span style="color: #660066;">splice</span>.<span style="color: #660066;">apply</span><span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> Array.<span style="color: #660066;">concat</span><span style="color: #009900;">&#40;</span>insertIndex<span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> b<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">// a: 1,2,3,4,5,6,7,8,9</span></pre></div></div>

<p>9. 删除数组元素：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:"Courier New";"><span style="color: #003366; font-weight: bold;">var</span> a <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">3</span><span style="color: #339933;">,</span><span style="color: #CC0000;">4</span><span style="color: #339933;">,</span><span style="color: #CC0000;">5</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
a.<span style="color: #660066;">splice</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">3</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>10. 快速取数组最大和最小值</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:"Courier New";">Math.<span style="color: #660066;">max</span>.<span style="color: #660066;">apply</span><span style="color: #009900;">&#40;</span>Math<span style="color: #339933;">,</span> <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">3</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">//3</span>
Math.<span style="color: #660066;">min</span>.<span style="color: #660066;">apply</span><span style="color: #009900;">&#40;</span>Math<span style="color: #339933;">,</span> <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">3</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">//1</span></pre></div></div>

<p>(出自http://ejohn.org/blog/fast-javascript-maxmin/)</p>
<p>11. 条件判断：</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:"Courier New";"><span style="color: #003366; font-weight: bold;">var</span> a <span style="color: #339933;">=</span> b <span style="color: #339933;">&amp;&amp;</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">//相当于</span>
<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>b<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	a <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
	a <span style="color: #339933;">=</span> b<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> a <span style="color: #339933;">=</span> b <span style="color: #339933;">||</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span> 
<span style="color: #006600; font-style: italic;">//相当于</span>
<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>b<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	a <span style="color: #339933;">=</span> b<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
	a <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>12. 判断IE（两种方法）:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:"Courier New";"><span style="color: #003366; font-weight: bold;">var</span> ie <span style="color: #339933;">=</span> <span style="color: #006600; font-style: italic;">/*@cc_on !@*/</span><span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> ie <span style="color: #339933;">=</span> <span style="color: #339933;">!-</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span></pre></div></div>

<p>原文地址：<a href="http://site.douban.com/widget/notes/22456/note/142716442/">http://bai.lu/RVT1X</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.benben.cc/blog/?feed=rss2&amp;p=391</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Juicer &#8211; 一个Javascript模板引擎的实现和优化</title>
		<link>http://www.benben.cc/blog/?p=390</link>
		<comments>http://www.benben.cc/blog/?p=390#comments</comments>
		<pubDate>Sun, 22 Apr 2012 04:14:55 +0000</pubDate>
		<dc:creator>破锣锅</dc:creator>
				<category><![CDATA[Javascript/Ajax]]></category>

		<guid isPermaLink="false">http://www.benben.cc/blog/?p=390</guid>
		<description><![CDATA[
让我们从一段代码说起，假设有一段这样的JSON数据：

1
2
3
4
var json=&#123;
	name:&#34;流火&#34;,
	blog:&#34;benben.cc&#34;
&#125;;

我们需要根据这段JSON生成这样的HTML代码：

1
&#60;span class=&#34;name&#34;&#62;流火 (blog: benben.cc)&#60;/span&#62;

传统的Javascript代码一定是这个样子：

1
2
var html;
html='&#60;span class=&#34;name&#34;&#62;'+json.name+' (blog: '+json.blog+')&#60;/span&#62;';

不言而喻，这样的代码混杂了html结构和代码逻辑，而且代码不具可读性，不便于后期维护，于是便有了这样一个函数：

1
2
3
4
5
6
function sub&#40;str,data&#41; &#123;
    return str
        .replace&#40;/{(.*?)}/igm,function&#40;$,$1&#41; &#123;
            return data&#91;$1&#93;?data&#91;$1&#93;:$;
        &#125;&#41;;
&#125;

有了这个函数，我们拼接字符串的工作就可以简化为：

1
2
var tpl='&#60;span class=&#34;name&#34;&#62;{name} (blog: {blog})&#60;/span&#62;';
var html=sub&#40;tpl,json&#41;;


看到这里，不用我多说，我想通过这个例子直观的展现出前端模板引擎的好处所在，这么做能够完全剥离html和代码逻辑，便于多人协作和后期的代码维护。当然，当我们的业务逻辑需要对数据源进行循环遍历，if判断等的时候，这个简明的函数很显然并不能满足我们的需求，于是便有了如今这市面上众多的模板引擎，诸如Mustache, jQuery tmpl, Kissy template, ejs, doT, nTenjin, etc.
“如无必要，勿增实体。” 这是著名的奥卡姆剃须刀法则，简单的说就是避免重复造轮子。那么就会有童鞋质疑，既然已然有这么多现成的东西可用，为什么还要重新打造一个呢？
我个人认为一个完善的模板引擎应该兼顾这几点：

语法简明
执行效率高
安全性
错误处理机制
多语言通用性


而市面上现有的模板引擎没有做到兼顾以上几点，比如Mustache支持多种语言，通用性不错，不过性能稍差，而且语法不支持高级特性，例如遍历的时候无法做if判断，也无法获得index索引值，jQuery tmpl依赖jQuery，缺乏可移植性，Kissy template虽然依赖Kissy, 不过性能和语法都值得推荐，doT/nTenjin 性能和灵活性都很不错，但是语法需要用原生的js来写，写好的模板代码可读性稍差。
鱼和熊掌不可兼得，语法的处理，安全性的输出过滤和错误处理机制的引入在一定程度上都会或多或少降低模板引擎的性能，因此就需要我们权衡。Juicer 在实现上首先将性能看做第一个重要的指标，毕竟性能好坏直接影响用户的感知，同时兼顾了安全性和错误处理机制（即便这样会导致性能的略微下降）。
首先来看下jsperf上同几个主流模板引擎的性能对比。


可以看到，性能上比传统模板引擎均有提升，下边的介绍主要从语法、安全性和错误处理，以及如何使用这几个方面介绍下Juicer.
a. 语法

循环 {@each}&#8230;{@/each}
判断 {@if}&#8230;{@else if}&#8230;{@else}&#8230;{@/if}
变量（支持函数）${varname&#124;function}
注释 {# comment here}

详细的语法请参考 Juicer Docs.
b. 安全性
安全性，简单地说就是对输出数据在输出前进行一次转义过滤，避免XSS这样的脚本注入攻击，简单扫下盲，举个XSS的例子。

1
2
3
var json=&#123;
	output:'&#60;script&#62;alert(&#34;XSS&#34;);&#60;/script&#62;'
&#125;;

如果JSON数据是第三方接口返回或者含有用户输入（像BBS、评价）的内容，我们如果赤裸裸的将output写到页面上就会执行恶意的js代码，所以Juicer默认是对数据输出做了安全转义的，当然如果不想被转义，可以使用$${varname}。

1
2
juicer.to_html&#40;'${output}',json&#41;; //输出：&#38;lt;script&#38;gt;alert(&#34;XSS&#34;);&#38;lt;/script&#38;gt;
juicer.to_html&#40;'$${output}',json&#41;; //输出：&#60;script&#62;alert(&#34;XSS&#34;);&#60;/script&#62;

c. 错误处理
如果没有错误处理，当模板引擎编译(Compile)或者渲染(Render)出错时候就会引起后续js代码停止执行，可想而知，如果因为一个逗号或者JSON数据的偶发错误导致整个页面挂掉，是我们不能接受的。但是Juicer在遇到这些错误的时候不会影响后续代码的执行，只会在控制台打出一句警告(Warn)告知开发者模板解析出现错误。

1
2
juicer.to_html&#40;'${varname,,,,,,,}',json&#41;;
alert&#40;'hello, juicer!'&#41;;

执行上边的代码就会看到控制台打出的“Juicer Compile Exception: Unexpected token ,”，但是不会因为错误导致后续的alert被阻塞掉。
实现原理

Juicer对一个模板的编译和渲染的过程主要有以下几个步骤：

1、对模板代码进行语法分析
2、分析后生成原生的Javascript代码字符串
3、将生成的代码转为可重用的Function (Compiled Template)


1
2
3
4
5
6
7
8
var [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://juicer.name"><img src="http://www.benben.cc/uploads/2012/04/22_1335076876.png" alt="" /></a></p>
<p>让我们从一段代码说起，假设有一段这样的JSON数据：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="javascript" style="font-family:"Courier New";"><span style="color: #003366; font-weight: bold;">var</span> json<span style="color: #339933;">=</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000066;">name</span><span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;流火&quot;</span><span style="color: #339933;">,</span>
	blog<span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;benben.cc&quot;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>我们需要根据这段JSON生成这样的HTML代码：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="html4strict" style="font-family:"Courier New";"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;name&quot;</span>&gt;</span>流火 (blog: benben.cc)<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;</span></pre></td></tr></table></div>

<p>传统的Javascript代码一定是这个样子：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="javascript" style="font-family:"Courier New";"><span style="color: #003366; font-weight: bold;">var</span> html<span style="color: #339933;">;</span>
html<span style="color: #339933;">=</span><span style="color: #3366CC;">'&lt;span class=&quot;name&quot;&gt;'</span><span style="color: #339933;">+</span>json.<span style="color: #000066;">name</span><span style="color: #339933;">+</span><span style="color: #3366CC;">' (blog: '</span><span style="color: #339933;">+</span>json.<span style="color: #660066;">blog</span><span style="color: #339933;">+</span><span style="color: #3366CC;">')&lt;/span&gt;'</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>不言而喻，这样的代码混杂了html结构和代码逻辑，而且代码不具可读性，不便于后期维护，于是便有了这样一个函数：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="javascript" style="font-family:"Courier New";"><span style="color: #003366; font-weight: bold;">function</span> sub<span style="color: #009900;">&#40;</span>str<span style="color: #339933;">,</span>data<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">return</span> str
        .<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/{(.*?)}/igm</span><span style="color: #339933;">,</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>$<span style="color: #339933;">,</span>$<span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000066; font-weight: bold;">return</span> data<span style="color: #009900;">&#91;</span>$<span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">?</span>data<span style="color: #009900;">&#91;</span>$<span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">:</span>$<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>有了这个函数，我们拼接字符串的工作就可以简化为：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="javascript" style="font-family:"Courier New";"><span style="color: #003366; font-weight: bold;">var</span> tpl<span style="color: #339933;">=</span><span style="color: #3366CC;">'&lt;span class=&quot;name&quot;&gt;{name} (blog: {blog})&lt;/span&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> html<span style="color: #339933;">=</span>sub<span style="color: #009900;">&#40;</span>tpl<span style="color: #339933;">,</span>json<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p><img src="http://www.benben.cc/uploads/2012/04/22_1335071685.png" alt="" /></p>
<p>看到这里，不用我多说，我想通过这个例子直观的展现出前端模板引擎的好处所在，这么做能够完全剥离html和代码逻辑，便于多人协作和后期的代码维护。当然，当我们的业务逻辑需要对数据源进行循环遍历，if判断等的时候，这个简明的函数很显然并不能满足我们的需求，于是便有了如今这市面上众多的模板引擎，诸如Mustache, jQuery tmpl, Kissy template, ejs, doT, nTenjin, etc.</p>
<p>“如无必要，勿增实体。” 这是著名的奥卡姆剃须刀法则，简单的说就是避免重复造轮子。那么就会有童鞋质疑，既然已然有这么多现成的东西可用，为什么还要重新打造一个呢？</p>
<p>我个人认为一个完善的模板引擎应该兼顾这几点：</p>
<ul>
<li>语法简明</li>
<li>执行效率高</li>
<li>安全性</li>
<li>错误处理机制</li>
<li>多语言通用性</li>
</ul>
<p><img src="http://www.benben.cc/uploads/2012/04/22_1335071580.png" alt="" /></p>
<p>而市面上现有的模板引擎没有做到兼顾以上几点，比如Mustache支持多种语言，通用性不错，不过性能稍差，而且语法不支持高级特性，例如遍历的时候无法做if判断，也无法获得index索引值，jQuery tmpl依赖jQuery，缺乏可移植性，Kissy template虽然依赖Kissy, 不过性能和语法都值得推荐，doT/nTenjin 性能和灵活性都很不错，但是语法需要用原生的js来写，写好的模板代码可读性稍差。</p>
<p>鱼和熊掌不可兼得，语法的处理，安全性的输出过滤和错误处理机制的引入在一定程度上都会或多或少降低模板引擎的性能，因此就需要我们权衡。Juicer 在实现上首先将性能看做第一个重要的指标，毕竟性能好坏直接影响用户的感知，同时兼顾了安全性和错误处理机制（即便这样会导致性能的略微下降）。</p>
<p>首先来看下jsperf上同几个主流模板引擎的性能对比。</p>
<p><img src="http://www.benben.cc/uploads/2012/04/22_1335071141.png" alt="" /></p>
<p><img src="http://www.benben.cc/uploads/2012/04/22_1335071353.png" alt="" /></p>
<p>可以看到，性能上比传统模板引擎均有提升，下边的介绍主要从语法、安全性和错误处理，以及如何使用这几个方面介绍下Juicer.</p>
<p><strong>a. 语法</strong></p>
<ul>
<li>循环 {@each}&#8230;{@/each}</li>
<li>判断 {@if}&#8230;{@else if}&#8230;{@else}&#8230;{@/if}</li>
<li>变量（支持函数）${varname|function}</li>
<li>注释 {# comment here}</li>
</ul>
<p>详细的语法请参考 <strong><a href="http://juicer.name/docs/docs.html">Juicer Docs</a></strong>.</p>
<p><strong>b. 安全性</strong></p>
<p>安全性，简单地说就是对输出数据在输出前进行一次转义过滤，避免XSS这样的脚本注入攻击，简单扫下盲，举个XSS的例子。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="javascript" style="font-family:"Courier New";"><span style="color: #003366; font-weight: bold;">var</span> json<span style="color: #339933;">=</span><span style="color: #009900;">&#123;</span>
	output<span style="color: #339933;">:</span><span style="color: #3366CC;">'&lt;script&gt;alert(&quot;XSS&quot;);&lt;/script&gt;'</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>如果JSON数据是第三方接口返回或者含有用户输入（像BBS、评价）的内容，我们如果赤裸裸的将output写到页面上就会执行恶意的js代码，所以Juicer默认是对数据输出做了安全转义的，当然如果不想被转义，可以使用$${varname}。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="javascript" style="font-family:"Courier New";">juicer.<span style="color: #660066;">to_html</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'${output}'</span><span style="color: #339933;">,</span>json<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//输出：&amp;lt;script&amp;gt;alert(&quot;XSS&quot;);&amp;lt;/script&amp;gt;</span>
juicer.<span style="color: #660066;">to_html</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'$${output}'</span><span style="color: #339933;">,</span>json<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//输出：&lt;script&gt;alert(&quot;XSS&quot;);&lt;/script&gt;</span></pre></td></tr></table></div>

<p><strong>c. 错误处理</strong></p>
<p>如果没有错误处理，当模板引擎编译(Compile)或者渲染(Render)出错时候就会引起后续js代码停止执行，可想而知，如果因为一个逗号或者JSON数据的偶发错误导致整个页面挂掉，是我们不能接受的。但是Juicer在遇到这些错误的时候不会影响后续代码的执行，只会在控制台打出一句警告(Warn)告知开发者模板解析出现错误。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="javascript" style="font-family:"Courier New";">juicer.<span style="color: #660066;">to_html</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'${varname,,,,,,,}'</span><span style="color: #339933;">,</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><span style="color: #3366CC;">'hello, juicer!'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>执行上边的代码就会看到控制台打出的“Juicer Compile Exception: Unexpected token ,”，但是不会因为错误导致后续的alert被阻塞掉。</p>
<p><strong>实现原理</strong></p>
<p><img src="http://www.benben.cc/uploads/2012/04/22_1335075310.png" alt="" /></p>
<p>Juicer对一个模板的编译和渲染的过程主要有以下几个步骤：</p>
<ul>
<li>1、对模板代码进行语法分析</li>
<li>2、分析后生成原生的Javascript代码字符串</li>
<li>3、将生成的代码转为可重用的Function (Compiled Template)</li>
</ul>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="javascript" style="font-family:"Courier New";"><span style="color: #003366; font-weight: bold;">var</span> json<span style="color: #339933;">=</span><span style="color: #009900;">&#123;</span>
	list<span style="color: #339933;">:</span><span style="color: #009900;">&#91;</span>
		<span style="color: #009900;">&#123;</span><span style="color: #000066;">name</span><span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;benben&quot;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
		<span style="color: #009900;">&#123;</span><span style="color: #000066;">name</span><span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;liuhuo&quot;</span><span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#93;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> tpl<span style="color: #339933;">=</span><span style="color: #3366CC;">'{@each data.list as value,key}$${value.name}{@/each}'</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> compiled_tpl<span style="color: #339933;">=</span>juicer.<span style="color: #660066;">compile</span><span style="color: #009900;">&#40;</span>tpl<span style="color: #339933;">,</span><span style="color: #009900;">&#123;</span>errorhandling<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>我们通过compiled_tpl.render.toString()看下编译后的代码：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="javascript" style="font-family:"Courier New";"><span style="color: #003366; font-weight: bold;">function</span> anonymous<span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">var</span> data <span style="color: #339933;">=</span> data <span style="color: #339933;">||</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
	<span style="color: #003366; font-weight: bold;">var</span> out <span style="color: #339933;">=</span> <span style="color: #3366CC;">''</span><span style="color: #339933;">;</span>
	out <span style="color: #339933;">+=</span> <span style="color: #3366CC;">''</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i0 <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> l <span style="color: #339933;">=</span> data.<span style="color: #660066;">list</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i0 <span style="color: #339933;">&lt;</span> l<span style="color: #339933;">;</span> i0<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003366; font-weight: bold;">var</span> value <span style="color: #339933;">=</span> data.<span style="color: #660066;">list</span><span style="color: #009900;">&#91;</span>i0<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #003366; font-weight: bold;">var</span> key <span style="color: #339933;">=</span> i0<span style="color: #339933;">;</span>
		out <span style="color: #339933;">+=</span> <span style="color: #3366CC;">''</span><span style="color: #339933;">;</span>
		out <span style="color: #339933;">+=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>value.<span style="color: #000066;">name</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		out <span style="color: #339933;">+=</span> <span style="color: #3366CC;">''</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	out <span style="color: #339933;">+=</span> <span style="color: #3366CC;">''</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">return</span> out<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>是不是已经明白了Juicer的原理？这个编译后的函数就会每次帮我们完成从数据到html代码的拼装操作。</p>
<p>这里有几点优化的地方值得分享下：</p>
<ul>
<li>1、using += instead of array.push</li>
<li>2、avoid using with {}</li>
<li>3、cache the compiled template (function)</li>
</ul>
<p>这几点优化在大数据量循环渲染时候性能提升显著，不过正因为放弃了with{}语句，所以JSON数据外层必须指定“data.”前缀，如果你觉得这点性能的提升不重要，也可以在options中指定loose:true（松散模式），这样就可以省去data. 前缀。</p>
<p>最后介绍下Options配置项，左侧为参数默认值。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="javascript" style="font-family:"Courier New";"><span style="color: #009900;">&#123;</span>
	cache<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">/</span><span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">,</span>
	loose<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">/</span><span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
	errorhandling<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">/</span><span style="color: #003366; font-weight: bold;">false</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>cache默认为true，即同一个模板编译后是否被juicer缓存，也就是说如果缓存开启的情况下，同一个模板第一次编译后，为了缩短耗时提升性能，后续不会再次执行编译的操作而是直接从缓存中去取编译好的模板函数。</p>
<p>Juicer的API. Juicer有两种使用方法，一种是通过</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="javascript" style="font-family:"Courier New";">juicer.<span style="color: #660066;">to_html</span><span style="color: #009900;">&#40;</span>tpl<span style="color: #339933;">,</span>data<span style="color: #339933;">,</span>options<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>直接根据提供的数据将模板转为html代码，另一种是通过compile方法先将模板编译好，在需要的时候再对模板进行数据的Render操作：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="javascript" style="font-family:"Courier New";"><span style="color: #003366; font-weight: bold;">var</span> compiled_tpl<span style="color: #339933;">=</span>juicer.<span style="color: #660066;">compile</span><span style="color: #009900;">&#40;</span>tpl<span style="color: #339933;">,</span>options<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
compiled_tpl.<span style="color: #660066;">render</span><span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>最后附上Juicer的项目地址，上边有详细的文档和Demo代码。<br />
<a href="http://juicer.name">http://juicer.name</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.benben.cc/blog/?feed=rss2&amp;p=390</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Linux下创建最低权限的SSH账号</title>
		<link>http://www.benben.cc/blog/?p=389</link>
		<comments>http://www.benben.cc/blog/?p=389#comments</comments>
		<pubDate>Tue, 10 Apr 2012 11:18:00 +0000</pubDate>
		<dc:creator>破锣锅</dc:creator>
				<category><![CDATA[Linux/Ubuntu]]></category>

		<guid isPermaLink="false">http://www.benben.cc/blog/?p=389</guid>
		<description><![CDATA[如果你自己有一台 Linux 服务器，那么单纯用来做 Server 岂不是有点浪费了，下边的命令可以让你方便的创建一个安全的Tunnelier 专用SSH账号。

1
2
3
4
5
6
#create user
useradd -M -s /sbin/nologin -n username
#modify the password
passwd username
#remove the user
userdel -r username

]]></description>
			<content:encoded><![CDATA[<p>如果你自己有一台 Linux 服务器，那么单纯用来做 Server 岂不是有点浪费了，下边的命令可以让你方便的创建一个安全的Tunnelier 专用SSH账号。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="bash" style="font-family:"Courier New";"><span style="color: #666666; font-style: italic;">#create user</span>
useradd <span style="color: #660033;">-M</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>nologin <span style="color: #660033;">-n</span> username
<span style="color: #666666; font-style: italic;">#modify the password</span>
<span style="color: #c20cb9; font-weight: bold;">passwd</span> username
<span style="color: #666666; font-style: italic;">#remove the user</span>
userdel <span style="color: #660033;">-r</span> username</pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.benben.cc/blog/?feed=rss2&amp;p=389</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>juicer.js &#8211; another lightweight javascript template engine</title>
		<link>http://www.benben.cc/blog/?p=388</link>
		<comments>http://www.benben.cc/blog/?p=388#comments</comments>
		<pubDate>Sat, 07 Apr 2012 02:21:29 +0000</pubDate>
		<dc:creator>破锣锅</dc:creator>
				<category><![CDATA[Javascript/Ajax]]></category>

		<guid isPermaLink="false">http://www.benben.cc/blog/?p=388</guid>
		<description><![CDATA[
现在各种Javascript模板引擎层出不穷，JST、Mustache、Tenjin，即便如此还是挡不住我自己打造一个的兴趣，遂作此代码，名为榨汁机(Juicer)，目前经过测试，性能上已经完全超越了市面上传统的模板引擎。希望互相交流，把Juicer的性能再提升一个等级。
支持的语法：
1、if

1
&#123;@if ...&#125;...&#123;@/if&#125;

2、each

1
&#123;@each var&#125;...&#123;@/each&#125;

3、inline

1
$&#123;var&#125;

更多的使用方法请参考juicer docs.性能上也毫不逊色，在jsperf上对比了几个常用的模板引擎，称得上是最快的模板引擎了。


放上Demo一枚：

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
&#60;script type=&#34;text/javascript&#34;&#62;
	var data=&#123;
		list:&#91;
			&#123;name:'guokai',show:true&#125;,
			&#123;name:'benben',show:false&#125;,
			&#123;name:'dierbaby',show:true&#125;
		&#93;,
		blah:&#91;
			&#123;num:1&#125;,
			&#123;num:2&#125;,
			&#123;num:3,inner:&#91;
				&#123;'time':'15:00'&#125;,
				&#123;'time':'16:00'&#125;,
				&#123;'time':'17:00'&#125;,
				&#123;'time':'18:00'&#125;
			&#93;&#125;,
			&#123;num:4&#125;
		&#93;
	&#125;;
	var tpl=&#91;
		'&#60;ul&#62;',
			'{@each data.list as it,k}',
				'&#60;li&#62;${it.name} (index: ${k})&#60;/li&#62;',
			'{@/each}',
			'{@each data.blah as it}',
				'&#60;li&#62;',
					'num: ${it.num} &#60;br /&#62;',
					'{@if it.num==3}',
						'{@each it.inner as it2}',
							'${it2.time} &#60;br /&#62;',
						'{@/each}',
					'{@/if}',
				'&#60;/li&#62;',
			'{@/each}',
		'&#60;/ul&#62;'
	&#93;.join&#40;''&#41;;
	document.write&#40;juicer.to_html&#40;tpl,data&#41;&#41;;
&#60;/script&#62;

Project Home: http://juicer.name
Github URI: http://github.com/PaulGuo/Juicer
]]></description>
			<content:encoded><![CDATA[<p><a href="http://juicer.name"><img src="http://www.benben.cc/uploads/2012/04/07_1333764906.png" alt="" /></a></p>
<p>现在各种Javascript模板引擎层出不穷，JST、Mustache、Tenjin，即便如此还是挡不住我自己打造一个的兴趣，遂作此代码，名为榨汁机(Juicer)，目前经过测试，性能上已经完全超越了市面上传统的模板引擎。希望互相交流，把Juicer的性能再提升一个等级。</p>
<p><strong>支持的语法：</strong></p>
<p><strong>1、if</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="javascript" style="font-family:"Courier New";"><span style="color: #009900;">&#123;</span><span style="color: #339933;">@</span><span style="color: #000066; font-weight: bold;">if</span> ...<span style="color: #009900;">&#125;</span>...<span style="color: #009900;">&#123;</span><span style="color: #339933;">@/</span><span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><strong>2、each</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="javascript" style="font-family:"Courier New";"><span style="color: #009900;">&#123;</span><span style="color: #339933;">@</span>each <span style="color: #003366; font-weight: bold;">var</span><span style="color: #009900;">&#125;</span>...<span style="color: #009900;">&#123;</span><span style="color: #339933;">@/</span>each<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><strong>3、inline</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="javascript" style="font-family:"Courier New";">$<span style="color: #009900;">&#123;</span><span style="color: #003366; font-weight: bold;">var</span><span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>更多的使用方法请参考<a href="http://juicer.name/docs/docs.html">juicer docs</a>.性能上也毫不逊色，在jsperf上对比了几个常用的模板引擎，称得上是最快的模板引擎了。</p>
<p><img src="http://www.benben.cc/uploads/2012/04/11_1334156111.png" alt="" /></p>
<p><img src="http://www.benben.cc/uploads/2012/04/11_1334156246.png" alt="" /></p>
<p>放上Demo一枚：</p>

<div class="wp_syntax"><table><tr><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"><pre class="javascript" style="font-family:"Courier New";"><span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;</span>
	<span style="color: #003366; font-weight: bold;">var</span> data<span style="color: #339933;">=</span><span style="color: #009900;">&#123;</span>
		list<span style="color: #339933;">:</span><span style="color: #009900;">&#91;</span>
			<span style="color: #009900;">&#123;</span><span style="color: #000066;">name</span><span style="color: #339933;">:</span><span style="color: #3366CC;">'guokai'</span><span style="color: #339933;">,</span>show<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
			<span style="color: #009900;">&#123;</span><span style="color: #000066;">name</span><span style="color: #339933;">:</span><span style="color: #3366CC;">'benben'</span><span style="color: #339933;">,</span>show<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
			<span style="color: #009900;">&#123;</span><span style="color: #000066;">name</span><span style="color: #339933;">:</span><span style="color: #3366CC;">'dierbaby'</span><span style="color: #339933;">,</span>show<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
		blah<span style="color: #339933;">:</span><span style="color: #009900;">&#91;</span>
			<span style="color: #009900;">&#123;</span>num<span style="color: #339933;">:</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
			<span style="color: #009900;">&#123;</span>num<span style="color: #339933;">:</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
			<span style="color: #009900;">&#123;</span>num<span style="color: #339933;">:</span><span style="color: #CC0000;">3</span><span style="color: #339933;">,</span>inner<span style="color: #339933;">:</span><span style="color: #009900;">&#91;</span>
				<span style="color: #009900;">&#123;</span><span style="color: #3366CC;">'time'</span><span style="color: #339933;">:</span><span style="color: #3366CC;">'15:00'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
				<span style="color: #009900;">&#123;</span><span style="color: #3366CC;">'time'</span><span style="color: #339933;">:</span><span style="color: #3366CC;">'16:00'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
				<span style="color: #009900;">&#123;</span><span style="color: #3366CC;">'time'</span><span style="color: #339933;">:</span><span style="color: #3366CC;">'17:00'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
				<span style="color: #009900;">&#123;</span><span style="color: #3366CC;">'time'</span><span style="color: #339933;">:</span><span style="color: #3366CC;">'18:00'</span><span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
			<span style="color: #009900;">&#123;</span>num<span style="color: #339933;">:</span><span style="color: #CC0000;">4</span><span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#93;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
	<span style="color: #003366; font-weight: bold;">var</span> tpl<span style="color: #339933;">=</span><span style="color: #009900;">&#91;</span>
		<span style="color: #3366CC;">'&lt;ul&gt;'</span><span style="color: #339933;">,</span>
			<span style="color: #3366CC;">'{@each data.list as it,k}'</span><span style="color: #339933;">,</span>
				<span style="color: #3366CC;">'&lt;li&gt;${it.name} (index: ${k})&lt;/li&gt;'</span><span style="color: #339933;">,</span>
			<span style="color: #3366CC;">'{@/each}'</span><span style="color: #339933;">,</span>
			<span style="color: #3366CC;">'{@each data.blah as it}'</span><span style="color: #339933;">,</span>
				<span style="color: #3366CC;">'&lt;li&gt;'</span><span style="color: #339933;">,</span>
					<span style="color: #3366CC;">'num: ${it.num} &lt;br /&gt;'</span><span style="color: #339933;">,</span>
					<span style="color: #3366CC;">'{@if it.num==3}'</span><span style="color: #339933;">,</span>
						<span style="color: #3366CC;">'{@each it.inner as it2}'</span><span style="color: #339933;">,</span>
							<span style="color: #3366CC;">'${it2.time} &lt;br /&gt;'</span><span style="color: #339933;">,</span>
						<span style="color: #3366CC;">'{@/each}'</span><span style="color: #339933;">,</span>
					<span style="color: #3366CC;">'{@/if}'</span><span style="color: #339933;">,</span>
				<span style="color: #3366CC;">'&lt;/li&gt;'</span><span style="color: #339933;">,</span>
			<span style="color: #3366CC;">'{@/each}'</span><span style="color: #339933;">,</span>
		<span style="color: #3366CC;">'&lt;/ul&gt;'</span>
	<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">join</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	document.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #009900;">&#40;</span>juicer.<span style="color: #660066;">to_html</span><span style="color: #009900;">&#40;</span>tpl<span style="color: #339933;">,</span>data<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></td></tr></table></div>

<p><strong>Project Home:</strong> <a href="http://juicer.name">http://juicer.name</a><br />
<strong>Github URI:</strong> <a href="http://github.com/PaulGuo/Juicer">http://github.com/PaulGuo/Juicer</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.benben.cc/blog/?feed=rss2&amp;p=388</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Do more with {Less}</title>
		<link>http://www.benben.cc/blog/?p=387</link>
		<comments>http://www.benben.cc/blog/?p=387#comments</comments>
		<pubDate>Sun, 05 Feb 2012 08:53:30 +0000</pubDate>
		<dc:creator>破锣锅</dc:creator>
				<category><![CDATA[XHTML+CSS]]></category>

		<guid isPermaLink="false">http://www.benben.cc/blog/?p=387</guid>
		<description><![CDATA[
什么是Less?
Less是一种动态样式语言。为什么称它是一种语言呢？因为它将 CSS 赋予了动态语言的特性，如变量，继承，运算，函数等。Less 既可以在客户端上运行（支持IE 6+, Webkit, Firefox），也可以借助 Node.js在服务端运行。
为什么要用Less?

为了写更少的代码
为了提高写代码的效率，减少重复劳动，解放生产力
为了更方便的维护我们写过的代码
为了让我们写的代码能够在一个或者多个项目中复用

总之，Less即将改变我们组织CSS代码的方式。相信我，如果你有CSS的知识基础，那么Less对你而言简直是小菜一碟，你学起来就会感到异常的容易。
Less都有哪些让人眼前一亮新特性？

变量（让人性奋）
混合（这玩意儿很有码感）
嵌套规则（让代码结构更美）
函数 &#038; 运算（丫的更像编程了）

1、变量
利用变量，我们可以单独定义一系列通用的样式，在需要的时候去调用，这样的好处就是在通用属性需要修改的时候只需要改动我们定义的几行代码就行了，而不需要我们再去一行行的改动每一处有引用的地方。

1
2
3
4
5
6
7
8
9
10
//LESS
@color: #4D926F;
&#160;
#header &#123;
	color: @color;
&#125;
&#160;
h2 &#123;
	color: @color;
&#125;

经过Less编译后的代码如下：

1
2
3
4
5
6
7
#header &#123;
	color: #4D926F;
&#125;
&#160;
h2 &#123;
	color: #4D926F;
&#125;

2、混合
混合可以让我们方便的把某一个定义过的Class A引用到另一个Class B中，从而可以实现方便的样式继承，除此之外，我们还可以实现带参数的调用，就好比调用函数一样简单。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//LESS
&#160;
.radius &#40;@radius: 5px) {
	border-radius: @radius;
	-webkit-border-radius: @radius;
	-moz-border-radius: @radius;
&#125;
&#160;
#header &#123;
	.rounded-corners;
&#125;
&#160;
#footer &#123;
	.rounded-corners&#40;10px&#41;;
&#125;

编译后的CSS代码如下：

1
2
3
4
5
6
7
8
9
10
11
#header &#123;
	border-radius: 5px;
	-webkit-border-radius: 5px;
	-moz-border-radius: 5px;
&#125;
&#160;
#footer &#123;
	border-radius: 10px;
	-webkit-border-radius: 10px;
	-moz-border-radius: 10px;
&#125;

3、嵌套规则
有了嵌套规则，我们可以在一个选择器中嵌套另一个选择器来实现继承，从而大大减少了我们的代码量，并且让我们的代码结构更加的清晰易懂。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//LESS
&#160;
#header &#123;
	h1 &#123;
		font-size: 26px;
		font-weight: bold;
	&#125;
&#160;
	p &#123; font-size: 12px;
		a &#123;
			text-decoration: none;
			&#38;:hover &#123; border-width: 1px &#125;
		&#125;
	&#125;
&#125;

编译后的CSS代码如下：

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#header h1 &#123;
	font-size: 26px;
	font-weight: bold;
&#125;
&#160;
#header p [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.lesscss.net/images/logo.png" alt="Less" /></p>
<p><strong>什么是Less?</strong></p>
<p>Less是一种动态样式语言。为什么称它是一种语言呢？因为它将 CSS 赋予了动态语言的特性，如变量，继承，运算，函数等。Less 既可以在客户端上运行（支持IE 6+, Webkit, Firefox），也可以借助 Node.js在服务端运行。</p>
<p><strong>为什么要用Less?</strong></p>
<ol>
<li>为了写更少的代码</li>
<li>为了提高写代码的效率，减少重复劳动，解放生产力</li>
<li>为了更方便的维护我们写过的代码</li>
<li>为了让我们写的代码能够在一个或者多个项目中复用</li>
</ol>
<p>总之，Less即将改变我们组织CSS代码的方式。相信我，如果你有CSS的知识基础，那么Less对你而言简直是小菜一碟，你学起来就会感到异常的容易。</p>
<p><strong>Less都有哪些让人眼前一亮新特性？</strong></p>
<ol>
<li>变量（让人性奋）</li>
<li>混合（这玩意儿很有码感）</li>
<li>嵌套规则（让代码结构更美）</li>
<li>函数 &#038; 运算（丫的更像编程了）</li>
</ol>
<p><strong>1、变量</strong></p>
<p>利用变量，我们可以单独定义一系列通用的样式，在需要的时候去调用，这样的好处就是在通用属性需要修改的时候只需要改动我们定义的几行代码就行了，而不需要我们再去一行行的改动每一处有引用的地方。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="css" style="font-family:"Courier New";">//LESS
<span style="color: #a1a100;">@color: #4D926F;</span>
&nbsp;
<span style="color: #cc00cc;">#header</span> <span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #a1a100;">@color;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
h2 <span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #a1a100;">@color;</span>
<span style="color: #00AA00;">&#125;</span></pre></td></tr></table></div>

<p>经过Less编译后的代码如下：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="css" style="font-family:"Courier New";"><span style="color: #cc00cc;">#header</span> <span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#4D926F</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
h2 <span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#4D926F</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></td></tr></table></div>

<p><strong>2、混合</strong></p>
<p>混合可以让我们方便的把某一个定义过的Class A引用到另一个Class B中，从而可以实现方便的样式继承，除此之外，我们还可以实现带参数的调用，就好比调用函数一样简单。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="css" style="font-family:"Courier New";">//LESS
&nbsp;
<span style="color: #6666ff;">.radius</span> <span style="color: #00AA00;">&#40;</span><span style="color: #a1a100;">@radius: 5px) {</span>
	border-radius<span style="color: #00AA00;">:</span> <span style="color: #a1a100;">@radius;</span>
	-webkit-border-radius<span style="color: #00AA00;">:</span> <span style="color: #a1a100;">@radius;</span>
	-moz-border-radius<span style="color: #00AA00;">:</span> <span style="color: #a1a100;">@radius;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
<span style="color: #cc00cc;">#header</span> <span style="color: #00AA00;">&#123;</span>
	.rounded-corners<span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
<span style="color: #cc00cc;">#footer</span> <span style="color: #00AA00;">&#123;</span>
	.rounded-corners<span style="color: #00AA00;">&#40;</span><span style="color: #933;">10px</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></td></tr></table></div>

<p>编译后的CSS代码如下：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="css" style="font-family:"Courier New";"><span style="color: #cc00cc;">#header</span> <span style="color: #00AA00;">&#123;</span>
	border-radius<span style="color: #00AA00;">:</span> <span style="color: #933;">5px</span><span style="color: #00AA00;">;</span>
	-webkit-border-radius<span style="color: #00AA00;">:</span> <span style="color: #933;">5px</span><span style="color: #00AA00;">;</span>
	-moz-border-radius<span style="color: #00AA00;">:</span> <span style="color: #933;">5px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
<span style="color: #cc00cc;">#footer</span> <span style="color: #00AA00;">&#123;</span>
	border-radius<span style="color: #00AA00;">:</span> <span style="color: #933;">10px</span><span style="color: #00AA00;">;</span>
	-webkit-border-radius<span style="color: #00AA00;">:</span> <span style="color: #933;">10px</span><span style="color: #00AA00;">;</span>
	-moz-border-radius<span style="color: #00AA00;">:</span> <span style="color: #933;">10px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></td></tr></table></div>

<p><strong>3、嵌套规则</strong></p>
<p>有了嵌套规则，我们可以在一个选择器中嵌套另一个选择器来实现继承，从而大大减少了我们的代码量，并且让我们的代码结构更加的清晰易懂。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="css" style="font-family:"Courier New";">//LESS
&nbsp;
<span style="color: #cc00cc;">#header</span> <span style="color: #00AA00;">&#123;</span>
	h1 <span style="color: #00AA00;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">26px</span><span style="color: #00AA00;">;</span>
		<span style="color: #000000; font-weight: bold;">font-weight</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">bold</span><span style="color: #00AA00;">;</span>
	<span style="color: #00AA00;">&#125;</span>
&nbsp;
	p <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">12px</span><span style="color: #00AA00;">;</span>
		a <span style="color: #00AA00;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">text-decoration</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span>
			&amp;<span style="color: #3333ff;">:hover </span><span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">border-width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1px</span> <span style="color: #00AA00;">&#125;</span>
		<span style="color: #00AA00;">&#125;</span>
	<span style="color: #00AA00;">&#125;</span>
<span style="color: #00AA00;">&#125;</span></pre></td></tr></table></div>

<p>编译后的CSS代码如下：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="css" style="font-family:"Courier New";"><span style="color: #cc00cc;">#header</span> h1 <span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">26px</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">font-weight</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">bold</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
<span style="color: #cc00cc;">#header</span> p <span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">12px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
<span style="color: #cc00cc;">#header</span> p a <span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">text-decoration</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
<span style="color: #cc00cc;">#header</span> p a<span style="color: #3333ff;">:hover </span><span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">border-width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></td></tr></table></div>

<p><strong>4、函数 &#038; 运算</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="css" style="font-family:"Courier New";">//LESS
&nbsp;
<span style="color: #a1a100;">@the-border: 1px;</span>
<span style="color: #a1a100;">@base-color: #111;</span>
<span style="color: #a1a100;">@red: #842210;</span>
&nbsp;
<span style="color: #cc00cc;">#header</span> <span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #a1a100;">@base-color * 3;</span>
	<span style="color: #000000; font-weight: bold;">border-left</span><span style="color: #00AA00;">:</span> <span style="color: #a1a100;">@the-border;</span>
	<span style="color: #000000; font-weight: bold;">border-right</span><span style="color: #00AA00;">:</span> <span style="color: #a1a100;">@the-border * 2;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
<span style="color: #cc00cc;">#footer</span> <span style="color: #00AA00;">&#123;</span> 
	<span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #a1a100;">@base-color+#003300;</span>
	<span style="color: #000000; font-weight: bold;">border-color</span><span style="color: #00AA00;">:</span> desaturate<span style="color: #00AA00;">&#40;</span><span style="color: #a1a100;">@red,10%);</span>
<span style="color: #00AA00;">&#125;</span></pre></td></tr></table></div>

<p>编译后的CSS代码如下：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="css" style="font-family:"Courier New";"><span style="color: #cc00cc;">#header</span> <span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#333</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">border-left</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1px</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">border-right</span><span style="color: #00AA00;">:</span> <span style="color: #933;">2px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
<span style="color: #cc00cc;">#footer</span> <span style="color: #00AA00;">&#123;</span> 
	<span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#114411</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">border-color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#7d2717</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.benben.cc/blog/?feed=rss2&amp;p=387</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Python一行代码实现list高效去重</title>
		<link>http://www.benben.cc/blog/?p=386</link>
		<comments>http://www.benben.cc/blog/?p=386#comments</comments>
		<pubDate>Mon, 23 Jan 2012 09:57:44 +0000</pubDate>
		<dc:creator>破锣锅</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.benben.cc/blog/?p=386</guid>
		<description><![CDATA[
1
&#123;&#125;.fromkeys&#40;list&#41;.keys&#40;&#41;

其它方法参见：
http://www.peterbe.com/plog/uniqifiers-benchmark/
]]></description>
			<content:encoded><![CDATA[
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="python" style="font-family:"Courier New";"><span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>.<span style="color: black;">fromkeys</span><span style="color: black;">&#40;</span><span style="color: #008000;">list</span><span style="color: black;">&#41;</span>.<span style="color: black;">keys</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>其它方法参见：<br />
<a href="http://www.peterbe.com/plog/uniqifiers-benchmark/">http://www.peterbe.com/plog/uniqifiers-benchmark/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.benben.cc/blog/?feed=rss2&amp;p=386</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>定风波·苏轼</title>
		<link>http://www.benben.cc/blog/?p=385</link>
		<comments>http://www.benben.cc/blog/?p=385#comments</comments>
		<pubDate>Sat, 21 Jan 2012 14:26:55 +0000</pubDate>
		<dc:creator>破锣锅</dc:creator>
				<category><![CDATA[Hodgepodge]]></category>

		<guid isPermaLink="false">http://www.benben.cc/blog/?p=385</guid>
		<description><![CDATA[序：三月七日，沙湖道中遇雨。雨具先去，同行皆狼狈，余独不觉，已而遂晴，故作此。
莫听穿林打叶声，何妨吟啸且徐行。
竹杖芒鞋轻胜马，谁怕？一蓑烟雨任平生。
料峭春风吹酒醒，微冷，山头斜照却相迎。
回首向来萧瑟处，归去，也无风雨也无晴。
]]></description>
			<content:encoded><![CDATA[<blockquote><p>序：三月七日，沙湖道中遇雨。雨具先去，同行皆狼狈，余独不觉，已而遂晴，故作此。</p></blockquote>
<p>莫听穿林打叶声，何妨吟啸且徐行。<br />
竹杖芒鞋轻胜马，谁怕？一蓑烟雨任平生。<br />
料峭春风吹酒醒，微冷，山头斜照却相迎。<br />
回首向来萧瑟处，归去，也无风雨也无晴。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.benben.cc/blog/?feed=rss2&amp;p=385</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Python一行代码实现tuple转list</title>
		<link>http://www.benben.cc/blog/?p=384</link>
		<comments>http://www.benben.cc/blog/?p=384#comments</comments>
		<pubDate>Tue, 17 Jan 2012 15:35:09 +0000</pubDate>
		<dc:creator>破锣锅</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.benben.cc/blog/?p=384</guid>
		<description><![CDATA[
1
2
def to_list&#40;t&#41;:
	return &#91;i if not isinstance&#40;i,tuple&#41; else to_list&#40;i&#41; for i in t&#93;

]]></description>
			<content:encoded><![CDATA[
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="python" style="font-family:"Courier New";"><span style="color: #ff7700;font-weight:bold;">def</span> to_list<span style="color: black;">&#40;</span>t<span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#91;</span>i <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>i,<span style="color: #008000;">tuple</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">else</span> to_list<span style="color: black;">&#40;</span>i<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> t<span style="color: black;">&#93;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.benben.cc/blog/?feed=rss2&amp;p=384</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Javascript一行代码实现两个数组diff</title>
		<link>http://www.benben.cc/blog/?p=383</link>
		<comments>http://www.benben.cc/blog/?p=383#comments</comments>
		<pubDate>Tue, 17 Jan 2012 15:22:43 +0000</pubDate>
		<dc:creator>破锣锅</dc:creator>
				<category><![CDATA[Javascript/Ajax]]></category>

		<guid isPermaLink="false">http://www.benben.cc/blog/?p=383</guid>
		<description><![CDATA[
1
2
3
4
5
6
7
&#60;script type=&#34;text/javascript&#34; language=&#34;javascript&#34;&#62;
var diff=function&#40;a,b&#41; &#123;
	return &#91;&#93;.concat&#40;a&#41;.filter&#40;function&#40;i&#41; &#123;return !&#40;b.indexOf&#40;i&#41;&#62;-1&#41;;&#125;&#41;;
&#125;
var ret=diff&#40;&#91;1,2,3,4,5&#93;,&#91;1,3,6,8,9,10&#93;&#41;;
//ret is [2,4,5]
&#60;/script&#62;

]]></description>
			<content:encoded><![CDATA[
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="javascript" style="font-family:"Courier New";"><span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span> language<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;javascript&quot;</span><span style="color: #339933;">&gt;</span>
<span style="color: #003366; font-weight: bold;">var</span> diff<span style="color: #339933;">=</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span>b<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">concat</span><span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">filter</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000066; font-weight: bold;">return</span> <span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>b.<span style="color: #660066;">indexOf</span><span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">&gt;-</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #003366; font-weight: bold;">var</span> ret<span style="color: #339933;">=</span>diff<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">3</span><span style="color: #339933;">,</span><span style="color: #CC0000;">4</span><span style="color: #339933;">,</span><span style="color: #CC0000;">5</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">3</span><span style="color: #339933;">,</span><span style="color: #CC0000;">6</span><span style="color: #339933;">,</span><span style="color: #CC0000;">8</span><span style="color: #339933;">,</span><span style="color: #CC0000;">9</span><span style="color: #339933;">,</span><span style="color: #CC0000;">10</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">//ret is [2,4,5]</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.benben.cc/blog/?feed=rss2&amp;p=383</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MySQL数据库root密码忘记怎么办？</title>
		<link>http://www.benben.cc/blog/?p=382</link>
		<comments>http://www.benben.cc/blog/?p=382#comments</comments>
		<pubDate>Mon, 16 Jan 2012 11:39:32 +0000</pubDate>
		<dc:creator>破锣锅</dc:creator>
				<category><![CDATA[PHP+MySQL]]></category>

		<guid isPermaLink="false">http://www.benben.cc/blog/?p=382</guid>
		<description><![CDATA[倘若你一不小心忘了root密码，抑或像我一样误操作将root权限调到了最低，大可不必惊慌失措，采用如下步骤即可轻松找回密码：
1、以安全模式运行MySQL并跳过安全验证

1
/usr/bin/mysqld_safe --skip-grant-tables

2、以root身份登录MySQL

1
/usr/bin/mysql -uroot

3、重置、清空root密码

1
2
mysql&#62; use mysql;
mysql&#62; update user set password='' where user='root';

4、给root重新设置密码

1
/usr/bin/mysqladmin -uroot password 'Your Password Here'

]]></description>
			<content:encoded><![CDATA[<p>倘若你一不小心忘了root密码，抑或像我一样误操作将root权限调到了最低，大可不必惊慌失措，采用如下步骤即可轻松找回密码：</p>
<p>1、以安全模式运行MySQL并跳过安全验证</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:"Courier New";"><span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>mysqld_safe <span style="color: #660033;">--skip-grant-tables</span></pre></td></tr></table></div>

<p>2、以root身份登录MySQL</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:"Courier New";"><span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>mysql <span style="color: #660033;">-uroot</span></pre></td></tr></table></div>

<p>3、重置、清空root密码</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="bash" style="font-family:"Courier New";">mysql<span style="color: #000000; font-weight: bold;">&gt;</span> use mysql;
mysql<span style="color: #000000; font-weight: bold;">&gt;</span> update user <span style="color: #000000; font-weight: bold;">set</span> <span style="color: #007800;">password</span>=<span style="color: #ff0000;">''</span> where <span style="color: #007800;">user</span>=<span style="color: #ff0000;">'root'</span>;</pre></td></tr></table></div>

<p>4、给root重新设置密码</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:"Courier New";"><span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>mysqladmin <span style="color: #660033;">-uroot</span> password <span style="color: #ff0000;">'Your Password Here'</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.benben.cc/blog/?feed=rss2&amp;p=382</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

