<?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>Leon&#039;s blog &#187; javascript</title>
	<atom:link href="http://www.leonzhang.com/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.leonzhang.com</link>
	<description>关注: 开源&#38;互联网, GTD with open source and Web</description>
	<lastBuildDate>Mon, 30 Jan 2012 14:24:13 +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>Javascript的字符串里神奇的逗号与数组</title>
		<link>http://www.leonzhang.com/2012/01/05/javascript-comma-belong-to-array/</link>
		<comments>http://www.leonzhang.com/2012/01/05/javascript-comma-belong-to-array/#comments</comments>
		<pubDate>Thu, 05 Jan 2012 12:14:34 +0000</pubDate>
		<dc:creator>leon</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[wtfjs]]></category>

		<guid isPermaLink="false">http://www.leonzhang.com/?p=882</guid>
		<description><![CDATA[先看这行代码： 挺神奇，哈？ 这里有两件事情，首先当然是“==”这家伙引起了类型转换。 转换的规则是当两个对象a和b作比较时，如果一方是简单类型（假设是b吧），另一方是对象（假设是a）；则把a类型转换成b的类型。前面的代码b（”,,,”）是字符串，简单类型，所以要求a（typeof Array是对象对吧）作类型转换到字符串。 另一件事情就是Array的类型转换，转换成字符串时，数组大概就是这样做的：首先把每一个元素转换成字符串，然后调用数组的join方法。既是本上a对象经历了这样的转变： 1. Array([],null,undefined,null) 2. Array(“”,”",”",”") 3. Array(“”,”",”",”").join() 4. “,,,” 最后变成了”,,,”，自然就返回true了。 同样的道理下面这行代码就不难理解了。 再看个变态点的： 其实这里主要是使用了逗号操作符的原因。MDN上时这样说逗号操作符的，从左往右计算，并返回右面的值。 所以(null,&#8217;cool&#8217;,false,NaN,4)的返回值就是4, 然后这个例子就变成，前面一个例子了。WTFJS。]]></description>
			<content:encoded><![CDATA[<p>先看这行代码：</p>
<pre class="brush: jscript; title: ; notranslate">
new Array([],null,undefined,null) == &quot;,,,&quot;; // true
</pre>
<p>挺神奇，哈？<br />
这里有两件事情，首先当然是“==”这家伙引起了类型转换。 转换的规则是当两个对象a和b作比较时，如果一方是简单类型（假设是b吧），另一方是对象（假设是a）；则把a类型转换成b的类型。前面的代码b（”,,,”）是字符串，简单类型，所以要求a（typeof Array是对象对吧）作类型转换到字符串。<br />
另一件事情就是Array的类型转换，转换成字符串时，数组大概就是这样做的：首先把每一个元素转换成字符串，然后调用数组的join方法。既是本上a对象经历了这样的转变：<br />
1. Array([],null,undefined,null)<br />
2. Array(“”,”",”",”")<br />
3. Array(“”,”",”",”").join()<br />
4. “,,,”<br />
最后变成了”,,,”，自然就返回true了。</p>
<p>同样的道理下面这行代码就不难理解了。</p>
<pre class="brush: jscript; title: ; notranslate">
&quot;,,,&quot; == new Array(4); // true
</pre>
<p>再看个变态点的：</p>
<pre class="brush: jscript; title: ; notranslate">
&quot;,,,&quot; == Array((null,'cool',false,NaN,4)); // true
</pre>
<p>其实这里主要是使用了逗号操作符的原因。<a href="https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special/Comma_Operator">MDN</a>上时这样说逗号操作符的，从左往右计算，并返回右面的值。<br />
所以(null,&#8217;cool&#8217;,false,NaN,4)的返回值就是4, 然后这个例子就变成，前面一个例子了。WTFJS。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leonzhang.com/2012/01/05/javascript-comma-belong-to-array/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript的最大值（max）比最小值（min）小</title>
		<link>http://www.leonzhang.com/2012/01/03/min-less-max/</link>
		<comments>http://www.leonzhang.com/2012/01/03/min-less-max/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 11:41:30 +0000</pubDate>
		<dc:creator>leon</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[wtfjs]]></category>

		<guid isPermaLink="false">http://www.leonzhang.com/?p=878</guid>
		<description><![CDATA[Javascript有很多很好的特性，Douglas Crockford的JavaScript: The Good Parts是Javascript之美的最好的书籍。同时Javascript由于设计仓促，也有很多从语言角度来说非常傻b的现象。 网站WTFJS收集各种有趣的Javascript错误，供程序员茶余饭后谈资，未尝不是另一种美。 下面这段代码展示了Javascript对最大最小值的处理，导致了最大值比最小值小的现象。 看上去不错，只要你真拿他们来跟其他数值进行比较。但是用作不比较，还真不知道最大最小值有什么用途？ 推荐书目：]]></description>
			<content:encoded><![CDATA[<p>Javascript有很多很好的特性，Douglas Crockford的<a href="http://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742" title="JavaScript: The Good Parts">JavaScript: The Good Parts</a>是Javascript之美的最好的书籍。同时Javascript由于设计仓促，也有很多从语言角度来说非常傻b的现象。<br />
网站<a href="http://wtfjs.com/">WTFJS</a>收集各种有趣的Javascript错误，供程序员茶余饭后谈资，未尝不是另一种美。</p>
<p>下面这段代码展示了Javascript对最大最小值的处理，导致了最大值比最小值小的现象。</p>
<pre class="brush: jscript; title: ; notranslate">
Math.max();
// -Infinity

Math.min();
// Infinity
</pre>
<p>看上去不错，只要你真拿他们来跟其他数值进行比较。但是用作不比较，还真不知道最大最小值有什么用途？</p>
<pre class="brush: jscript; title: ; notranslate">
console.log(9 &lt; Math.max());
//false
console.log(9 &lt; Math.min());
//true
Math.min() &lt; Math.max();
//false
</pre>
<p>推荐书目：<br />
<img src="http://ecx.images-amazon.com/images/I/51YIYr01vsL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" alt="JavaScript: The Good Parts" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.leonzhang.com/2012/01/03/min-less-max/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>javascript里delete操作符什么时候能成功删除变量?</title>
		<link>http://www.leonzhang.com/2011/12/31/javascript-delete-operator/</link>
		<comments>http://www.leonzhang.com/2011/12/31/javascript-delete-operator/#comments</comments>
		<pubDate>Sat, 31 Dec 2011 03:42:16 +0000</pubDate>
		<dc:creator>leon</dc:creator>
				<category><![CDATA[软件开发]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.leonzhang.com/?p=862</guid>
		<description><![CDATA[ECMAScript里关于delete操作符的解释晦涩的很, 实在不是我能理解的. 有兴趣你可以去看看. 实际中使用中, 经常会碰到Javascript变量有时候能成功删除, 有时候却不掉成功删除的情况. 这篇Understanding delete牛文详细解释了, 为什么会这样, 什么样的变量能成功delete, 什么样的不能成功delete. 简而言之, 就是通过”声明“方式创建的变量不能成功删除, 通过”赋值“方式创建的变量能成功删除; 一但一个变量创建后, 它能不能被删除的属性将不会改变. 一个特例是通过eval()函数执行动态代码创建出来的变量,都是可以删除的. 如下面这段代码在Firefox/Chrome/Nodejs里的运行结果如下: Firebug的console里直接定义的变量(不包括在函数里定义的变量), 似乎是因为以eval()的方式在运行代码. 所以通过在Firebug的console里输入代码创建出来的变量,是可以删除的. Chrome等webkit系的浏览器的开发工具没有这个问题. 这一点在调试代码时可能会引起奇怪的现象.]]></description>
			<content:encoded><![CDATA[<p>ECMAScript里关于delete操作符的解释晦涩的很, 实在不是我能理解的. 有兴趣你可以去<a href="http://www.ecmascript.org/docs.php">看看</a>.</p>
<p>实际中使用中, 经常会碰到Javascript变量有时候能成功删除, 有时候却不掉成功删除的情况.<br />
这篇<a href="http://perfectionkills.com/understanding-delete/">Understanding delete牛文</a>详细解释了, 为什么会这样, 什么样的变量能成功delete, 什么样的不能成功delete.</p>
<p>简而言之, 就是通过”<strong>声明</strong>“方式创建的变量不能成功删除, 通过”<strong>赋值</strong>“方式创建的变量能成功删除; 一但一个变量创建后, 它能不能被删除的属性将不会改变. 一个特例是通过eval()函数执行动态代码创建出来的变量,都是可以删除的.<br />
如下面这段代码在Firefox/Chrome/Nodejs里的运行结果如下:</p>
<pre class="brush: jscript; title: ; notranslate">
(function(global){
    var aaa = &quot;aaa&quot;;
    bbb = &quot;bbb&quot;;
    global.ccc = &quot;ccc&quot;;
    eval(&quot;var ddd='ddd';&quot;);
    console.log(delete aaa);
    console.log(delete bbb);
    console.log(delete ccc);
    console.log(delete ddd);
}(this));
</pre>
<p><a href="http://www.flickr.com/photos/hileon/6604553305/" title="scrn2011-12-31 12 04 18 by hileonzhang, on Flickr"><img src="http://farm8.staticflickr.com/7145/6604553305_89aff58ca5.jpg" width="500" height="367" alt="scrn2011-12-31 12 04 18"></a></p>
<p>Firebug的console里直接定义的变量(不包括在函数里定义的变量), 似乎是因为以eval()的方式在运行代码. 所以通过在Firebug的console里输入代码创建出来的变量,是可以删除的. Chrome等webkit系的浏览器的开发工具没有这个问题. 这一点在调试代码时可能会引起奇怪的现象.</p>
<pre class="brush: jscript; title: ; notranslate">
//在console里粘贴运行下面的代码
var aaa = &quot;aaa&quot;;
console.log(delete aaa);
//在Chrome的开发工具里返回是false, 在Firebug的console里返回是true.
</pre>
<p><a href="http://www.flickr.com/photos/hileon/6604553731/" title="scrn2011-12-31 12 13 13 by hileonzhang, on Flickr"><img src="http://farm8.staticflickr.com/7034/6604553731_54598d0d89.jpg" width="335" height="236" alt="scrn2011-12-31 12 13 13"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.leonzhang.com/2011/12/31/javascript-delete-operator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>对象赋值时的Javascript prototype chain</title>
		<link>http://www.leonzhang.com/2011/12/22/javascript-property-assign-value-and-prototype-chain/</link>
		<comments>http://www.leonzhang.com/2011/12/22/javascript-property-assign-value-and-prototype-chain/#comments</comments>
		<pubDate>Thu, 22 Dec 2011 13:13:28 +0000</pubDate>
		<dc:creator>leon</dc:creator>
				<category><![CDATA[软件开发]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[prototype]]></category>

		<guid isPermaLink="false">http://www.leonzhang.com/?p=853</guid>
		<description><![CDATA[在Web程序员应该知道的Javascript prototype原理里,说到了prototype chain. 但是有一点要特别注明一下, 那就是prototype chain只在对对象的方法和属性调用和读取时有效, 遵循沿着prototype查找方法和属性的规律; 但是在对对象属性进行赋值时, 并不遵循这一规律. 在对Javascript对象的属性进行赋值时, 原则是这样的: 1. 如果该对象本身有这个属性, 则对该属性赋值 2. 如果该对象本身没有这个属性, 则在该对象上新建一个该属性, 并进行赋值. (这时不会通过__proto__属性, 找该对象的prototype, 检查prototype上有没有该属性, 然后在prototype的属性上赋值.) 举个简单的例子: 看console里打出了的对象应该比较清楚. 用对象的数组写法可能更容易理解些.]]></description>
			<content:encoded><![CDATA[<p>在<a href="http://www.leonzhang.com/2011/12/20/javascript-prototype/">Web程序员应该知道的Javascript prototype原理</a>里,说到了prototype chain. 但是有一点要特别注明一下, 那就是prototype chain只在对对象的方法和属性调用和读取时有效, 遵循沿着prototype查找方法和属性的规律; 但是在对对象属性进行赋值时, 并不遵循这一规律.</p>
<p>在对Javascript对象的属性进行赋值时, 原则是这样的:<br />
1. 如果该对象本身有这个属性, 则对该属性赋值<br />
2. 如果该对象本身没有这个属性, 则在该对象上<strong>新建</strong>一个该属性, 并进行赋值. (这时<strong>不会</strong>通过__proto__属性, 找该对象的prototype, 检查prototype上有没有该属性, 然后在prototype的属性上赋值.)</p>
<p>举个简单的例子:</p>
<pre class="brush: jscript; title: ; notranslate">
var Car = function(){
  this.color = &quot;red&quot;;
}
var Jeep = function(){};
Jeep.prototype = new Car();

var myCar= new Jeep();
console.log(myCar.color);
console.log(myCar);
//这时myCar对象本身上并没有color属性,
//访问myCar.color得到的结果是&quot;red&quot;,
//因为这时prototype chain起作用了.

myCar.color = &quot;green&quot;;
console.log(myCar.color);
console.log(myCar);
//这时myCar对象上新建了一个color属性, 值是&quot;green&quot;.
//但是它并没有覆盖掉myCar的__proto__上的color的属性.
//这时候如果读取myCar.color, 按prototype chain的搜索顺序,
//首先找到的是myCar对象自身上的属性color, 值是&quot;green&quot;.
</pre>
<p>看console里打出了的对象应该比较清楚.<br />
<a href="http://www.flickr.com/photos/hileon/6554145055/" title="assign value with prototype chain by hileonzhang, on Flickr"><img src="http://farm8.staticflickr.com/7150/6554145055_09852c38f1.jpg" width="296" height="337" alt="assign value with prototype chain"></a></p>
<p>用对象的数组写法可能更容易理解些.</p>
<pre class="brush: jscript; title: ; notranslate">
var Car = function() {
  this[&quot;color&quot;] = &quot;red&quot;;
}
var Jeep = function() {};
Jeep.prototype = new Car();

var myCar= new Jeep();
console.log(myCar); 

myCar[&quot;color&quot;] = &quot;green&quot;;
console.log(myCar);
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.leonzhang.com/2011/12/22/javascript-property-assign-value-and-prototype-chain/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web程序员应该知道的Javascript prototype原理</title>
		<link>http://www.leonzhang.com/2011/12/20/javascript-prototype/</link>
		<comments>http://www.leonzhang.com/2011/12/20/javascript-prototype/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 14:38:48 +0000</pubDate>
		<dc:creator>leon</dc:creator>
				<category><![CDATA[软件开发]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[prototype]]></category>

		<guid isPermaLink="false">http://www.leonzhang.com/?p=848</guid>
		<description><![CDATA[有同事问了我几个和Javascript的类继承的小问题,我在也不太理解的情况下,胡诌了一通. 回来以后有些内疚, 反省一下, 整理整理Javascript的prototype的原理, 自己清楚点, 也希望对别人也有帮助. 首先js里面没有类这回子事情, 虽然class是js的保留字, 但是到现在也没派上任何用场. 在js里面, 几乎所有的东西都是对象, 函数也是对象, 所以函数可以赋值给别的变量. 另外js对象也可以用数组的方式访问, 也就是说访问obj1.something, 也可以写成obj1['something']. 在js里虽然没有类, 但是有一个在类编程里常用的的概念, Constructor构造器, 或者叫构造函数. 语法上Constructor跟普通的js函数没有区别, 但是Constructor前面加上new关键字就可以产生新的对象. 那么”new Constructor()”这样调用时到底做了什么事情呢? 1. js运行环境首先创建一个空对象 2. 把this变量指向这个对象 3. 把__proto__指向这个构造器的prototype属性 4. 通过this把属性和方法加在这个对象上 5. 最后会把this指向的对象return出来(当然你也可以显示的return别的对象,这是情况跟我讨论的有点不一样) 这里有2个概念比较重要, 第一是Constructor的prototype属性, 它是Constructor的一个保持共享属性和方法的对象. 二通过该Constructor生成的对象的__proto__属性, 它指向了那个prototype对象. 对象的Constructor可以通过该对象的constructor属性获得. 我们定义一个简单的Constructor Demo(), 然后通过他生成一个aDemo对象, 在Chrome的console里把aDemo打出来看到的结果是这样的,这是我们能很清楚的看出这种关系. 换一种写法, 其实跟前面没多大区别, 不过这一次f2()不在创建出来的对象上, 而是在对象的__proto__指向的构造器DemoB上. 这样的好处是当使用DemoB创建很多对象时, 比较节省内存. js的prototype搜索链 prototype Chain js的运行环境是这样使用构造器的prototype的. 当我们对第一个对象调用其方法时, [...]]]></description>
			<content:encoded><![CDATA[<p>有同事问了我几个和Javascript的类继承的小问题,我在也不太理解的情况下,胡诌了一通. 回来以后有些内疚, 反省一下, 整理整理Javascript的prototype的原理, 自己清楚点, 也希望对别人也有帮助.</p>
<p>首先<strong>js里面没有类</strong>这回子事情, 虽然class是js的保留字, 但是到现在也没派上任何用场. 在js里面, 几乎所有的东西都是对象, 函数也是对象, 所以函数可以赋值给别的变量. 另外js对象也可以用数组的方式访问, 也就是说访问obj1.something, 也可以写成obj1['something']. </p>
<p>在js里虽然没有类, 但是有一个在类编程里常用的的概念, Constructor构造器, 或者叫构造函数. 语法上Constructor跟普通的js函数没有区别, 但是Constructor前面加上new关键字就可以产生新的对象.</p>
<p><strong>那么”new Constructor()”这样调用时到底做了什么事情呢?</strong><br />
1. js运行环境首先创建一个空对象<br />
2. 把this变量指向这个对象<br />
3. 把__proto__指向这个构造器的prototype属性<br />
4. 通过this把属性和方法加在这个对象上<br />
5. 最后会把this指向的对象return出来(当然你也可以显示的return别的对象,这是情况跟我讨论的有点不一样)</p>
<p>这里有2个概念比较重要, 第一是Constructor的prototype属性, 它是Constructor的一个保持共享属性和方法的对象. 二通过该Constructor生成的对象的__proto__属性, 它指向了那个prototype对象. 对象的Constructor可以通过该对象的constructor属性获得.</p>
<p>我们定义一个简单的Constructor Demo(), 然后通过他生成一个aDemo对象, 在Chrome的console里把aDemo打出来看到的结果是这样的,这是我们能很清楚的看出这种关系.</p>
<pre class="brush: jscript; title: ; notranslate">
function DemoA(){
  this.title = &quot;this is a demo constructor&quot;;
  this.f1 = function(){}
}
var aDemo = new DemoA();
console.log(aDemo);
</pre>
<p><a href="http://www.flickr.com/photos/hileon/6544059473/" title="jsproto1 by hileonzhang, on Flickr"><img src="http://farm8.staticflickr.com/7168/6544059473_9673d4c407.jpg" width="500" height="161" alt="jsproto1"></a></p>
<p>换一种写法, </p>
<pre class="brush: jscript; title: ; notranslate">
function DemoB(){
  this.title = &quot;this is a demo constructor&quot;;
}
DemoB.prototype.f2 = function () {};
var bDemo = new DemoB();
console.log(bDemo);
</pre>
<p><a href="http://www.flickr.com/photos/hileon/6544059061/" title="jsproto2 by hileonzhang, on Flickr"><img src="http://farm8.staticflickr.com/7156/6544059061_4fbf131085.jpg" width="500" height="165" alt="jsproto2"></a><br />
其实跟前面没多大区别, 不过这一次f2()不在创建出来的对象上, 而是在对象的__proto__指向的构造器DemoB上. 这样的好处是当使用DemoB创建很多对象时, 比较节省内存.</p>
<p><strong>js的prototype搜索链 prototype Chain</strong><br />
js的运行环境是这样使用构造器的prototype的. 当我们对第一个对象调用其方法时, js运行环境首先看, 这个对象本身有没有这个方法, 如果有就直接调用. 如果没找到, 就查找这个对象的__proto__属性指向的对象(就是前面说的该对象的构造器的prototype属性), 如果有该方法就调用, 没有继续查找__proto__属性指向对象的__proto__属性指向的对象, 以此类推. 直到最后, 找到js所有的对象都会指向默认指向的Object(算是js的根对象吧). 所以如果我们给Object上增加个方法, 所以的js对象都能使用. </p>
<p>由于js有对对象函数的prototype chain搜索的特性, 我们可以利用这点来模拟类似其他语言里类(class)的效果. 如:</p>
<pre class="brush: jscript; title: ; notranslate">
function DemoA(){
  this.title = &quot;this is a demo constructor&quot;;
  this.f1 = function(){}
}

function DemoB(){
  this.title = &quot;this is b demo constructor&quot;;
  this.f2 = function(){}
}
DemoB.prototype = new DemoA();

var bDemo = new DemoB();
console.log(bDemo);
</pre>
<p><a href="http://www.flickr.com/photos/hileon/6544059723/" title="jsproto3 by hileonzhang, on Flickr"><img src="http://farm8.staticflickr.com/7172/6544059723_0b67a37a34.jpg" width="500" height="288" alt="jsproto3"></a><br />
这时我们通过bDemo对象, 不但能调用bDemo上的DemoB的f2()方法, 也能__proto__同对对prototype的搜索, 在bDemo上直接调用DemoA的f1()方法.</p>
<p>由于这种写法在语法上太啰嗦, 不容易理解, 我可以定义一个这样的函数.</p>
<pre class="brush: jscript; title: ; notranslate">
function inherit(Child, Parent) {
  Child.prototype = new Parent();
}
</pre>
<p>这样我们前面的例子可以写成这样, 效果是一样的:</p>
<pre class="brush: jscript; title: ; notranslate">
function DemoA(){
  this.title = &quot;this is a demo constructor&quot;;
  this.f1 = function(){}
}

function DemoB(){
  this.title = &quot;this is b demo constructor&quot;;
  this.f2 = function(){}
}

inherit(DemoB, DemoA);

var bDemo = new DemoB();
console.log(bDemo);
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.leonzhang.com/2011/12/20/javascript-prototype/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>SlideShare的新UI: bigfoot</title>
		<link>http://www.leonzhang.com/2011/11/30/slideshare_new_ui_bigfoot/</link>
		<comments>http://www.leonzhang.com/2011/11/30/slideshare_new_ui_bigfoot/#comments</comments>
		<pubDate>Wed, 30 Nov 2011 02:09:29 +0000</pubDate>
		<dc:creator>leon</dc:creator>
				<category><![CDATA[IT与互联网]]></category>
		<category><![CDATA[bookmarklet]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[slideshare]]></category>

		<guid isPermaLink="false">http://www.leonzhang.com/?p=830</guid>
		<description><![CDATA[昨天为了看SlideShare比较清爽些,刚弄了个改变SlideShare ppt缺省大小的Bookmarklet,没想到今天就看到SlideShare在测试更大的ppt画面的新UI设计, bigfoot. 我马上去试了一下,还是不太满意: ppt大小是固定大小(728x562px), 广告位还是很多. 最后我还是bigfoot关掉了,继续使用这个小Bookmarklet.]]></description>
			<content:encoded><![CDATA[<p>昨天为了看SlideShare比较清爽些,刚弄了个<a href="http://www.leonzhang.com/2011/11/29/a_clean_slideshare_ui_without_advertise/">改变SlideShare ppt缺省大小的Bookmarklet</a>,没想到今天就看到SlideShare在测试更大的ppt画面的新UI设计, <a href="http://www.slideshare.net/bigfoot">bigfoot</a>.<br />
<a href="http://www.flickr.com/photos/hileon/6428677901/" title="slideshare_bigfoot_01 by hileonzhang, on Flickr"><img src="http://farm7.staticflickr.com/6108/6428677901_40a2ec9896.jpg" width="500" height="275" alt="slideshare_bigfoot_01"></a></p>
<p>我马上去试了一下,还是不太满意: ppt大小是固定大小(728x562px), 广告位还是很多.<br />
<a href="http://www.flickr.com/photos/hileon/6428678227/" title="slideshare_bigfoot_02 by hileonzhang, on Flickr"><img src="http://farm8.staticflickr.com/7011/6428678227_2d5a1a8643.jpg" width="500" height="430" alt="slideshare_bigfoot_02"></a></p>
<p>最后我还是<a href="http://www.slideshare.net/bigfoot">bigfoot</a>关掉了,继续使用这个小<a href="http://www.leonzhang.com/2011/11/29/a_clean_slideshare_ui_without_advertise/">Bookmarklet</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leonzhang.com/2011/11/30/slideshare_new_ui_bigfoot/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>给我个干净的SlideShare界面</title>
		<link>http://www.leonzhang.com/2011/11/29/a_clean_slideshare_ui_without_advertise/</link>
		<comments>http://www.leonzhang.com/2011/11/29/a_clean_slideshare_ui_without_advertise/#comments</comments>
		<pubDate>Tue, 29 Nov 2011 10:37:29 +0000</pubDate>
		<dc:creator>leon</dc:creator>
				<category><![CDATA[IT与互联网]]></category>
		<category><![CDATA[bookmarklet]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[slideshare]]></category>

		<guid isPermaLink="false">http://www.leonzhang.com/?p=820</guid>
		<description><![CDATA[SlideShare是个很好的资料网站,那里你总能找到符合你胃口的的ppt. 可惜缺省的ppt大小比较小(598&#215;481),有的时候连字也看不清楚.切换成全屏吧,又太招摇,桌面上的消息也不太容易看到. 如果提供个大一点的ppt选项就好了,这就是下面这段Bookmarklet的由来.把它拖到浏览器的收藏夹,以后你在SlideShare上看ppt的时候,单击一下这个Bookmarklet,就会把广告什么的隐藏掉了,ppt的宽度大概是屏幕宽度的70%. 这是点击前和点击后的展示效果:]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.slideshare.net">SlideShare</a>是个很好的资料网站,那里你总能找到符合你胃口的的ppt.<br />
可惜缺省的ppt大小比较小(598&#215;481),有的时候连字也看不清楚.切换成全屏吧,又太招摇,桌面上的消息也不太容易看到.<br />
如果提供个大一点的ppt选项就好了,这就是下面<a href="javascript: (function() {       var rz = function() {        var h = $(window).width() * 3 / 6;        h = h + "px";        $(".player").css("min-width", "400px").css("width", "100%").css("height", h);        $(".column1, .playerWrapper, .player, .slideDisplayer").css("width", "100%").css("height", h);                $(".playerWrapper").attr('style', 'width: 100% !important');        $("#player").attr('width', $(".player").width()).attr('height', $(".player").height())    };    $(".h-top-ad, .h-skyscraper-ad, .h-related-more-tab").css("display", "none");    $(window).bind('resize', rz);    rz();    })();void 0">这段Bookmarklet</a>的由来.把<a href="javascript: (function() {       var rz = function() {        var h = $(window).width() * 3 / 6;        h = h + "px";        $(".player").css("min-width", "400px").css("width", "100%").css("height", h);        $(".column1, .playerWrapper, .player, .slideDisplayer").css("width", "100%").css("height", h);                $(".playerWrapper").attr('style', 'width: 100% !important');        $("#player").attr('width', $(".player").width()).attr('height', $(".player").height())    };    $(".h-top-ad, .h-skyscraper-ad, .h-related-more-tab").css("display", "none");    $(window).bind('resize', rz);    rz();    })();void 0">它</a>拖到浏览器的收藏夹,以后你在SlideShare上看ppt的时候,单击一下<a href="javascript: (function() {       var rz = function() {        var h = $(window).width() * 3 / 6;        h = h + "px";        $(".player").css("min-width", "400px").css("width", "100%").css("height", h);        $(".column1, .playerWrapper, .player, .slideDisplayer").css("width", "100%").css("height", h);                $(".playerWrapper").attr('style', 'width: 100% !important');        $("#player").attr('width', $(".player").width()).attr('height', $(".player").height())    };    $(".h-top-ad, .h-skyscraper-ad, .h-related-more-tab").css("display", "none");    $(window).bind('resize', rz);    rz();    })();void 0">这个Bookmarklet</a>,就会把广告什么的隐藏掉了,ppt的宽度大概是屏幕宽度的70%.</p>
<pre class="brush: jscript; title: ; notranslate">
javascript: (function() {
    var rz = function() {
        var h = $(window).width() * 3 / 6;
        h = h + &quot;px&quot;;
        $(&quot;.player&quot;).css(&quot;min-width&quot;, &quot;400px&quot;).css(&quot;width&quot;, &quot;100%&quot;).css(&quot;height&quot;, h);
        $(&quot;.column1, .playerWrapper, .player, .slideDisplayer&quot;).css(&quot;width&quot;, &quot;100%&quot;).css(&quot;height&quot;, h);
        $(&quot;.playerWrapper&quot;).attr('style', 'width: 100% !important');
        $(&quot;#player&quot;).attr('width', $(&quot;.player&quot;).width()).attr('height', $(&quot;.player&quot;).height())
    };
    $(&quot;.h-top-ad, .h-skyscraper-ad, .h-related-more-tab&quot;).css(&quot;display&quot;, &quot;none&quot;);
    $(window).bind('resize', rz);
    rz();
})();
void 0
</pre>
<p>这是点击前和点击后的展示效果:<br />
<a href="http://www.flickr.com/photos/hileon/6423974229/" title="slideshare with ad by hileonzhang, on Flickr"><img src="http://farm7.staticflickr.com/6229/6423974229_41fe46f90f.jpg" width="500" height="405" alt="slideshare with ad"></a></p>
<p><a href="http://www.flickr.com/photos/hileon/6423974273/" title="slideshare without ad by hileonzhang, on Flickr"><img src="http://farm8.staticflickr.com/7010/6423974273_8e94ce6372.jpg" width="500" height="397" alt="slideshare without ad"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.leonzhang.com/2011/11/29/a_clean_slideshare_ui_without_advertise/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Log.io: 浏览器里的tail -f</title>
		<link>http://www.leonzhang.com/2011/06/13/log-io_the_tail_f_in_browser/</link>
		<comments>http://www.leonzhang.com/2011/06/13/log-io_the_tail_f_in_browser/#comments</comments>
		<pubDate>Mon, 13 Jun 2011 06:16:40 +0000</pubDate>
		<dc:creator>leon</dc:creator>
				<category><![CDATA[软件开发]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[node.js]]></category>

		<guid isPermaLink="false">http://www.leonzhang.com/?p=769</guid>
		<description><![CDATA[前段时间提到过基于node.js的一个挺好玩的应用TermKit. 现在又碰到一个基于node.js的有意思的应用Log.io. Log.io的目标是在浏览器里实现实时监控日志文件.这跟很多人喜欢在终端上通过tail -f来实时监控日志文件类似. 不过通过node.js的良好的异步模式, Log.io把这个功能很好的在浏览器里搞定了. Log.io由两部分组成, harvester和server. harvester负责监视具体的日志文件,当文件有变化是通知server. harvester可以有多个运行实例, 在不同的机器上收集日志. server则负责处理与使用浏览器监视日志的用户的交互. server只有一个运行实例. Log.io的安装步骤如下. 好了,现在可以访问http://”log.io server所在地址”:8998 来看看效果了. 左侧列表按照harvester分组列出来所有监视的日志文件. 右侧上边是当前选中实时监视的日志,支持通过正则表达式搜索. 右侧下面可以显示某个日志文件的历史内容. 看不到图的请看这里, flickr上新上传的图片怎么都看不到呢?!]]></description>
			<content:encoded><![CDATA[<p>前段时间提到过基于node.js的一个挺好玩的应用<a href="http://www.leonzhang.com/2011/05/24/termkit/">TermKit</a>. 现在又碰到一个基于node.js的有意思的应用<a href="http://logio.org/">Log.io</a>. <a href="http://logio.org/">Log.io</a>的目标是在浏览器里实现实时监控日志文件.这跟很多人喜欢在终端上通过tail -f来实时监控日志文件类似. 不过通过node.js的良好的异步模式, Log.io把这个功能很好的在浏览器里搞定了.</p>
<p><a href="http://logio.org/">Log.io</a>由两部分组成, harvester和server.<br />
harvester负责监视具体的日志文件,当文件有变化是通知server. harvester可以有多个运行实例, 在不同的机器上收集日志.<br />
server则负责处理与使用浏览器监视日志的用户的交互. server只有一个运行实例.</p>
<p>Log.io的安装步骤如下.</p>
<pre class="brush: bash; title: ; notranslate">
#重新以全局模式安装socket.io connect underscore等模块
su -
npm uninstall  socket.io connect underscore
npm install -g  socket.io connect underscore

#下载log.io,并配置
git clone git://github.com/NarrativeScience/Log.io.git log.io
sudo git clone https://github.com/remy/Socket.io-node-client.git /usr/local/lib/node/socket.io.client/
sudo git submodule update --init --recursive
cd log.io/
cd bin/
./configure

#安装server
./install/server

#安装harvester
./install/harvester

#配置要监视的日志 /etc/log.io/harvester.conf
#我添加了apache和log.io自己的日志文件

#开启harvester收集日志
/etc/init.d/log.io-harvester start
</pre>
<p>好了,现在可以访问http://”log.io server所在地址”:8998 来看看效果了.</p>
<p><a href="http://www.flickr.com/photos/hileon/5827742944/" title="Log.io: 浏览器里的tail -f by hileonzhang, on Flickr"><img src="http://farm3.static.flickr.com/2040/5827742944_a2baaa7e89_z.jpg" width="640" height="406" alt="Log.io: 浏览器里的tail -f"></a><br />
左侧列表按照harvester分组列出来所有监视的日志文件. 右侧上边是当前选中实时监视的日志,支持通过正则表达式搜索. 右侧下面可以显示某个日志文件的历史内容.</p>
<p>看不到图的请看<a href="http://weibo.com/1672211361/eC3z4zH2asx">这里</a>, flickr上新上传的图片怎么都看不到呢?!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leonzhang.com/2011/06/13/log-io_the_tail_f_in_browser/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TermKit, 图形化的Linux终端</title>
		<link>http://www.leonzhang.com/2011/05/24/termkit/</link>
		<comments>http://www.leonzhang.com/2011/05/24/termkit/#comments</comments>
		<pubDate>Tue, 24 May 2011 04:57:54 +0000</pubDate>
		<dc:creator>leon</dc:creator>
				<category><![CDATA[软件开发]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[termkit]]></category>

		<guid isPermaLink="false">http://www.leonzhang.com/?p=760</guid>
		<description><![CDATA[node.js这两年异军突起,基于node.js的工具也越来越多. TermKit就是这两天网络上讨论很多的一个工具.从TermKit作者的blog看,这是运行在Mac,以node.js写服务端,以js+webkit来写客户端,实现的一个图像化的Terminal终端工具. 作者只做了Mac上的开发.我搜索了一个,看到已经有人做了Linux+Chrome的移植.下载下来是了一下,运行不出结果,就在github上comment了一下,没想到作者马上就修正了. 下面是我安装的步骤: 先你就可以了到Chrome里去访问TermKit了。 可以根据输入动态补齐： 这是ls输出的目录结果： 文件也会动态补齐： 可以直接通过cat查看图形文件： 现在好像还有点问题,就是现实出来的目录没有图标.不知道是不是那些显示依赖Mac的什么环境的原因. 不过感觉这样的工具,很难做到Linux Terminal那么通用.但是做一般的显示目录,运行一些命令,显示图像结果这样的任务还是很方便的.]]></description>
			<content:encoded><![CDATA[<p><a href="http://nodejs.org">node.js</a>这两年异军突起,基于<a href="http://nodejs.org">node.js</a>的工具也越来越多.</p>
<p><a href="https://github.com/unconed/TermKit">TermKit</a>就是这两天<a href="http://weibo.com/k/termkit&#038;Refer=STopic_box">网络上讨论很多</a>的一个工具.从<a href="http://acko.net/blog/on-termkit">TermKit作者的blog</a>看,这是运行在Mac,以node.js写服务端,以js+webkit来写客户端,实现的一个图像化的Terminal终端工具.</p>
<p>作者只做了Mac上的开发.我搜索了一个,看到已经有人做了<a href="https://github.com/Floby/TermKit">Linux+Chrome的移植</a>.下载下来是了一下,运行不出结果,就在github上comment了一下,没想到作者马上就修正了.<br />
<span id="more-760"></span><br />
下面是我安装的步骤:</p>
<pre class="brush: bash; title: ; notranslate">
git clone https://github.com/Floby/TermKit.git
cd TermKit/
npm install
node Node/nodekit.js
</pre>
<p>先你就可以了到Chrome里去访问TermKit了。<br />
可以根据输入动态补齐：<br />
<a href="http://www.flickr.com/photos/hileon/5739719325/" title="termkit01 by hileonzhang, on Flickr"><img src="http://farm6.static.flickr.com/5302/5739719325_e33774f96a.jpg" width="500" height="406" alt="termkit01"></a></p>
<p>这是ls输出的目录结果：<br />
<a href="http://www.flickr.com/photos/hileon/5740269976/" title="termkit02 by hileonzhang, on Flickr"><img src="http://farm6.static.flickr.com/5069/5740269976_81d8b7187d.jpg" width="500" height="404" alt="termkit02"></a></p>
<p>文件也会动态补齐：<br />
<a href="http://www.flickr.com/photos/hileon/5754227156/" title="termkit03 by hileonzhang, on Flickr"><img src="http://farm3.static.flickr.com/2641/5754227156_b410db768b.jpg" width="500" height="404" alt="termkit03"></a></p>
<p>可以直接通过cat查看图形文件：<br />
<a href="http://www.flickr.com/photos/hileon/5754227160/" title="termkit04 by hileonzhang, on Flickr"><img src="http://farm3.static.flickr.com/2800/5754227160_2a4d08b465.jpg" width="500" height="404" alt="termkit04"></a></p>
<p>现在好像还有点问题,就是现实出来的目录没有图标.不知道是不是那些显示依赖Mac的什么环境的原因.</p>
<p>不过感觉这样的工具,很难做到Linux Terminal那么通用.但是做一般的显示目录,运行一些命令,显示图像结果这样的任务还是很方便的.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leonzhang.com/2011/05/24/termkit/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>当mobl遇上新浪微博</title>
		<link>http://www.leonzhang.com/2011/03/25/mobl-weibo-search/</link>
		<comments>http://www.leonzhang.com/2011/03/25/mobl-weibo-search/#comments</comments>
		<pubDate>Thu, 24 Mar 2011 23:38:09 +0000</pubDate>
		<dc:creator>leon</dc:creator>
				<category><![CDATA[软件开发]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mobl]]></category>
		<category><![CDATA[PhoneGap]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[微博]]></category>
		<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.leonzhang.com/?p=701</guid>
		<description><![CDATA[1.mobl上的twitter trends例子 mobl上关于twitter trends的这个例子，还是蛮好玩的。通过调用twitter的API，得到当下twitter上流行的话题。然后再根据每个话题，显示出最近这个话题的tweets。 2.mobl上的twitter trends例子 照猫画虎，来试试做一个新浪微博的类似应用。查了一下微博的API，遗憾的发现关于话题的API还都处于beta状态。而且要用户登录以后才能调用，不像twitter在不登录的情况下就能调用trends类的API。 新浪微博只有Search类的API有不登录调用的API，我们就拿search模拟一下吧。 3.使用mobl的服务调用json mobl提供了一个服务service接口，可以通过URL调用json服务。 修改后的新浪search的服务代码如下： 4.构造mobl界面 还后通过上面的trends服务，构造话题首页： 在通过search服务，构造微博结果显示页。 基本上就搞定了，打包上传到PhoneGap，一个微博应用就新鲜出炉了。 通过浏览器，可以在这里试用一下。在Andriod上跑的界面大概是这个样子。 全部代码如下： 更新： @很潮的猪头哥贡献了一张在iphone上访问的效果图片。]]></description>
			<content:encoded><![CDATA[<h3>1.mobl上的twitter trends例子</h3>
<p>mobl上关于<a href="http://docs.mobl-lang.org/tutorial/twittertrends">twitter trends的这个例子</a>，还是蛮好玩的。通过调用twitter的API，得到当下twitter上流行的话题。然后再根据每个话题，显示出最近这个话题的tweets。</p>
<div>
<img src="http://www.mobl-lang.org/wp-content/uploads/2011/01/Screen-shot-2011-01-17-at-7.26.35-PM-159x300.png" alt="" /><br />
<img src="http://www.mobl-lang.org/wp-content/uploads/2011/01/Screen-shot-2011-01-17-at-9.33.42-PM-159x300.png" alt="" />
</div>
<h3>2.mobl上的twitter trends例子</h3>
<p>照猫画虎，来试试做一个新浪微博的类似应用。查了一下微博的API，遗憾的发现关于话题的API还都处于beta状态。而且要用户登录以后才能调用，不像twitter在不登录的情况下就能调用trends类的API。<br />
新浪微博只有<a href="http://open.t.sina.com.cn/wiki/index.php/Search">Search类的API</a>有不登录调用的API，我们就拿search模拟一下吧。<br />
<span id="more-701"></span></p>
<pre class="brush: jscript; title: ; notranslate">

http://api.t.sina.com.cn/search.json?source=xxx&#038;rpp=100&#038;q=sugarcrm
</pre>
<h3>3.使用mobl的服务调用json</h3>
<p>mobl提供了一个服务service接口，可以通过URL调用json服务。<br />
修改后的新浪search的服务代码如下：</p>
<pre class="brush: jscript; title: ; notranslate">
service Twitter {
  resource trends() : JSON {
    uri = &quot;http://me.leonzhang.com/mobl/weibotrends/trendsjson.php&quot;
    encoding = &quot;jsonp&quot;
    mapper = trendsMapper
  }

  resource search(query : String) : JSON {
    //主要要把xxx改成你自己的api key
    uri = &quot;http://api.t.sina.com.cn/search.json?source=xxx&amp;rpp=200&amp;q=&quot; + query
    encoding = &quot;jsonp&quot;
    mapper = tweetsMapper
  }
}
</pre>
<h3>4.构造mobl界面</h3>
<p>还后通过上面的trends服务，构造话题首页：</p>
<pre class="brush: jscript; title: ; notranslate">
  header(_(&quot;Twitter trends&quot;))
  var trends = async(Twitter.trends())
  whenLoaded(trends) {
    group {
      list(topic in trends) {
        item(onclick={ search(topic.name); }) {
		  label(topic.name)
		}
      }
    }
  }
</pre>
<p>在通过search服务，构造微博结果显示页。</p>
<pre class="brush: jscript; title: ; notranslate">
screen search(query : String) {
  header(query) {
    backButton()
  }
  var results = async(Twitter.search(query))
  whenLoaded(results) {
    list(tweet in results) {
      block(tweetStyle) {
        image(tweet.profile_image_url,
              style=tweetIconStyle)
        &lt;b&gt;label(tweet.from_user) &quot;: &quot;&lt;/b&gt;
        label(tweet.text)
      }
    }
  }
}
</pre>
<p>基本上就搞定了，打包上传到<a href="http://www.phonegap.com/">PhoneGap</a>，一个微博应用就新鲜出炉了。<br />
通过浏览器，可以<a href="http://me.leonzhang.com/mobl/weibotrends/">在这里试用一下</a>。在Andriod上跑的界面大概是这个样子。<br />
<a href="http://www.flickr.com/photos/hileon/5557281164/" title="mobl with weibo 01 by hileonzhang, on Flickr"><img src="http://farm6.static.flickr.com/5291/5557281164_436b7e8230.jpg" width="236" height="431" alt="mobl with weibo 01" /></a><br />
<a href="http://www.flickr.com/photos/hileon/5557281564/" title="mobl with weibo 02 by hileonzhang, on Flickr"><img src="http://farm6.static.flickr.com/5296/5557281564_2ca305a12c.jpg" width="236" height="433" alt="mobl with weibo 02" /></a><br />
<a href="http://www.flickr.com/photos/hileon/5557282004/" title="mobl with weibo 03 by hileonzhang, on Flickr"><img src="http://farm6.static.flickr.com/5131/5557282004_abb4ccb639.jpg" width="236" height="434" alt="mobl with weibo 03" /></a></p>
<p>全部代码如下：</p>
<pre class="brush: jscript; title: ; notranslate">
application weibotrends

import mobl
import mobl::ui::generic
import mobl::ui::stylemixin

// STYLES
style tweetStyle {
  padding: 10px;
  margin: 5px;
  min-height: 50px;
  background-color: white;
  border: 1px solid #444;
  borderRadiusMixin(10px);
}

style tweetIconStyle {
  float: left;
  margin: 0 10px 0 0;
}

// TYPES
type Trend {
  name : String
  url  : String
}

type Tweet {
  profile_image_url : String
  created_at        : String
  from_user         : String
  text              : String
}

// LOGIC
function trendsMapper(json : JSON) : [Trend] {
  return json.trends;
}

function tweetsMapper(json : JSON) : [Tweet] {
  return json.results;
}

// SERVICE
service Twitter {
  resource trends() : JSON {
    uri = &quot;http://me.leonzhang.com/mobl/weibotrends/trendsjson.php&quot;
    encoding = &quot;jsonp&quot;
    mapper = trendsMapper
  }

  resource search(query : String) : JSON {
  	//注意要换成自己的新浪微博API key
    uri = &quot;http://api.t.sina.com.cn/search.json?source=xxx&amp;rpp=200&amp;q=&quot; + query
    encoding = &quot;jsonp&quot;
    mapper = tweetsMapper
  }
}

// UI
screen root() {
  script {
  	  fetchLanguageBundle(&quot;zh.json&quot;);
  	}

  header(_(&quot;Twitter trends&quot;))
  var trends = async(Twitter.trends())
  whenLoaded(trends) {
    group {
      list(topic in trends) {
        item(onclick={ search(topic.name); }) {
		  label(topic.name)
		}
      }
    }
  }
}

screen search(query : String) {
  header(query) {
    backButton()
  }
  var results = async(Twitter.search(query))
  whenLoaded(results) {
    list(tweet in results) {
      block(tweetStyle) {
        image(tweet.profile_image_url,
              style=tweetIconStyle)
        &lt;b&gt;label(tweet.from_user) &quot;: &quot;&lt;/b&gt;
        label(tweet.text)
      }
    }
  }
}
</pre>
<p>更新：<br />
<a href="http://t.sina.com.cn/siyangbi">@很潮的猪头哥</a>贡献了一张<a href="http://t.sina.com.cn/1864596981/zF4kBLneip">在iphone上访问的效果图片</a>。<br />
<img src="http://ww3.sinaimg.cn/bmiddle/6f237df5jw6dfkkz1xcczj.jpg" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.leonzhang.com/2011/03/25/mobl-weibo-search/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>通过phonegap把mobl应用发布各手机平台</title>
		<link>http://www.leonzhang.com/2011/03/18/deliver_mobl_app_to_android/</link>
		<comments>http://www.leonzhang.com/2011/03/18/deliver_mobl_app_to_android/#comments</comments>
		<pubDate>Fri, 18 Mar 2011 15:09:50 +0000</pubDate>
		<dc:creator>leon</dc:creator>
				<category><![CDATA[软件开发]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mobl]]></category>
		<category><![CDATA[PhoneGap]]></category>
		<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.leonzhang.com/?p=697</guid>
		<description><![CDATA[1.PhoneGap是干什么的？ PhoneGap同样也是多平台手机开发工具，它能把你的web应用打包成各各手机平台的本地应用。 打包iPhone应用需要Mac系统，还需要Apple的开发执照。我都没有，只能望洋兴叹了。 打包Android应用没有这些先决条件，咱们就试试这个吧。 2.准备mobl应用 还是拿小小计算器程序为例，mobl项目编译出来的结果在项目下的www目录里。 我们进入这个目录，把TipCalculator.html改名成index.html。 然后把整个www目录通过压缩工具打包成zip格式。 准备工作就完成了。 3.使用phonegap的在线发布工具phonegap build 到PhoneGap的在线发布工具phonegap build网站，点击“New App”新建一个应用，输入应用名称。 选择“upload an archive or index.html file”，上传我们前面做的那个zip压缩包。 等一会程序就打包好了。 4.下载apk在我的华为C8600上试试 下载打包好的apk文件，通过豌豆荚安装到Android平台的华为C8600上。 运行一下还挺像那么回事的。虽然速度慢了点，但是你也知道，C8600的速度本来就不咋地。 至此我们能通过mobl构建一个真正的Android手机应用了。 现在是功能还很简单，但是慢慢来嘛，mobl的功能也在不断增加中。]]></description>
			<content:encoded><![CDATA[<h2>1.PhoneGap是干什么的？</h2>
<p><a href="http://www.phonegap.com">PhoneGap</a>同样也是多平台手机开发工具，它能把你的web应用打包成各各手机平台的本地应用。<br />
打包iPhone应用需要Mac系统，还需要Apple的开发执照。我都没有，只能望洋兴叹了。<br />
打包Android应用没有这些先决条件，咱们就试试这个吧。</p>
<h2>2.准备mobl应用</h2>
<p>还是拿<strong>小小计算器</strong>程序为例，mobl项目编译出来的结果在项目下的<strong>www</strong>目录里。<br />
我们进入这个目录，把<strong>TipCalculator.html</strong>改名成<strong>index.html</strong>。<br />
然后把整个<strong>www</strong>目录通过压缩工具打包成zip格式。<br />
准备工作就完成了。<br />
<span id="more-697"></span></p>
<h2>3.使用phonegap的在线发布工具phonegap build</h2>
<p>到<a href="http://www.phonegap.com">PhoneGap</a>的在线发布工具<a href="https://build.phonegap.com/apps">phonegap build</a>网站，点击“New App”新建一个应用，输入应用名称。<br />
选择“upload an archive or index.html file”，上传我们前面做的那个zip压缩包。<br />
<a href="http://www.flickr.com/photos/hileon/5537523112/" title="mobl with phonegap02 by hileonzhang, on Flickr"><img src="http://farm6.static.flickr.com/5020/5537523112_982c978a4d.jpg" width="500" height="279" alt="mobl with phonegap02" /></a></p>
<p>等一会程序就打包好了。<br />
<a href="http://www.flickr.com/photos/hileon/5537523158/" title="mobl with phonegap01 by hileonzhang, on Flickr"><img src="http://farm6.static.flickr.com/5057/5537523158_fe7450301e.jpg" width="500" height="154" alt="mobl with phonegap01" /></a></p>
<h2>4.下载apk在我的华为C8600上试试</h2>
<p>下载打包好的apk文件，通过<a href="http://wandoujia.com/">豌豆荚</a>安装到Android平台的华为C8600上。<br />
运行一下还挺像那么回事的。虽然速度慢了点，但是你也知道，C8600的速度本来就不咋地。<br />
<a href="http://www.flickr.com/photos/hileon/5537523734/" title="mobl in andriod01 by hileonzhang, on Flickr"><img src="http://farm6.static.flickr.com/5299/5537523734_45ed5a0899.jpg" width="236" height="428" alt="mobl in andriod01" /></a><br />
<a href="http://www.flickr.com/photos/hileon/5536946047/" title="mobl in andriod02 by hileonzhang, on Flickr"><img src="http://farm6.static.flickr.com/5131/5536946047_87824a9821.jpg" width="236" height="428" alt="mobl in andriod02" /></a><br />
<a href="http://www.flickr.com/photos/hileon/5536946299/" title="mobl in andriod03 by hileonzhang, on Flickr"><img src="http://farm6.static.flickr.com/5056/5536946299_551c2b831e.jpg" width="236" height="428" alt="mobl in andriod03" /></a><br />
<a href="http://www.flickr.com/photos/hileon/5536945523/" title="mobl in andriod04 by hileonzhang, on Flickr"><img src="http://farm6.static.flickr.com/5097/5536945523_d5c3e93101.jpg" width="236" height="428" alt="mobl in andriod04" /></a></p>
<p>至此我们能通过mobl构建一个真正的Android手机应用了。<br />
现在是功能还很简单，但是慢慢来嘛，mobl的功能也在不断增加中。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leonzhang.com/2011/03/18/deliver_mobl_app_to_android/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>美化mobl应用界面</title>
		<link>http://www.leonzhang.com/2011/03/17/style-mobl-ui/</link>
		<comments>http://www.leonzhang.com/2011/03/17/style-mobl-ui/#comments</comments>
		<pubDate>Thu, 17 Mar 2011 14:28:20 +0000</pubDate>
		<dc:creator>leon</dc:creator>
				<category><![CDATA[软件开发]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mobl]]></category>
		<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.leonzhang.com/?p=692</guid>
		<description><![CDATA[1.派生mobl界面模块 接着上次我的的”小小计算器”程序。为了修改它的界面风格，我们首先派生一个mobl的模块。 新建一个叫ui.mobl的文件，在里面输入下面两行代码。第一句的意思是新建的模块名叫ui，第二句的意思是ui模块导入所有mobl::ui::generic的内容（开始我还以为mixin是中文迷信的拼音呢！搞了半天是mix in。唉英文差害死人）。 回到tipcalculator.mobl文件，现在可以把里面引用mobl::ui::generic的那句改成引用ui了。 2.使用从mobl::ui::generic导入的变量 OK，准备功能完毕。现在在ui.mobl里就可以使用或者重写mobl::ui::generic里定义的变量了。 比如mobl::ui::generic里的样式变量（样式变量都是以$开头的）$baseColor，它代表了当前界面的基础色。另外里面还定义了$baseColor,$baseColorGreen，$baseColorRed, $baseColorRedish等颜色。 为了修改当前界面的基础色，只要输入下面一句，界面基础色就变成红的了。 当然我们也可以使用mobl::ui::generic里的rgb函数，比如这样整个界面就变成灰的了。这里有关于具体模块内功能的描述，但是似乎文档还不太全面。 3.使用自定义css样式表 我们也可以定义新的样式变量，语法是css的扩展，据说是借鉴了scss的很多特性。 下面定义了两个新的样式变量，相信用过css的应该都能看懂。 但是有一点我没明白，为什么这些变量不再以$开头了呢？而且我换成$还编译不通过。 现在再打开tipcalculator.mobl文件,把里面的按钮使用我们新定义的样式变量。代码如下，效果见后面的图。 运行效果可以看这里.]]></description>
			<content:encoded><![CDATA[<h2>1.派生mobl界面模块</h2>
<p>接着上次我的的”小小计算器”程序。为了修改它的界面风格，我们首先派生一个mobl的模块。<br />
新建一个叫<strong>ui.mobl</strong>的文件，在里面输入下面两行代码。第一句的意思是新建的模块名叫<strong>ui</strong>，第二句的意思是<strong>ui</strong>模块导入所有<strong>mobl::ui::generic</strong>的内容（开始我还以为mixin是中文迷信的拼音呢！搞了半天是mix in。唉英文差害死人）。</p>
<pre class="brush: jscript; title: ; notranslate">
module ui
mixin mobl::ui::generic
</pre>
<p>回到<strong>tipcalculator.mobl</strong>文件，现在可以把里面引用<strong>mobl::ui::generic</strong>的那句改成引用<strong>ui</strong>了。</p>
<pre class="brush: jscript; title: ; notranslate">
//import mobl::ui::generic
import ui
</pre>
<p><img src="http://www.mobl-lang.org/wp-content/uploads/2011/01/Screen-shot-2011-01-14-at-12.59.06-PM-159x300.png" alt="" /></p>
<h2>2.使用从mobl::ui::generic导入的变量</h2>
<p>OK，准备功能完毕。现在在<strong>ui.mobl</strong>里就可以使用或者重写<strong>mobl::ui::generic</strong>里定义的变量了。<br />
比如<strong>mobl::ui::generic</strong>里的样式变量（<em>样式变量都是以$开头的</em>）$baseColor，它代表了当前界面的基础色。另外里面还定义了$baseColor,$baseColorGreen，$baseColorRed, $baseColorRedish等颜色。<br />
为了修改当前界面的基础色，只要输入下面一句，界面基础色就变成红的了。</p>
<pre class="brush: jscript; title: ; notranslate">
style $baseColor = $baseColoRed
</pre>
<p>当然我们也可以使用<strong>mobl::ui::generic</strong>里的<strong>rgb</strong>函数，比如这样整个界面就变成灰的了。<a href="http://docs.mobl-lang.org/">这里</a>有关于具体模块内功能的描述，但是似乎文档还不太全面。</p>
<pre class="brush: jscript; title: ; notranslate">
style $baseColor = rgb(100, 100, 100)
</pre>
<p><img src="http://www.mobl-lang.org/wp-content/uploads/2011/01/Screen-shot-2011-01-14-at-1.03.04-PM-159x300.png" alt="" /></p>
<h2>3.使用自定义css样式表</h2>
<p>我们也可以定义新的样式变量，语法是css的扩展，据说是借鉴了<a href="http://sass-lang.com/">scss</a>的很多特性。<br />
下面定义了两个新的样式变量，相信用过css的应该都能看懂。<br />
但是有一点我没明白，为什么这些变量不再以$开头了呢？而且我换成$还编译不通过。</p>
<pre class="brush: jscript; title: ; notranslate">
style mixin myButtonStyleMixin($fromColor, $toColor) {
  border: 1px solid #000;
  padding: 10px;
  line-height: 3em;
  margin: 5px;
  borderRadiusMixin(5px);
  backgroundGradientMixin($fromColor, $toColor);
}

style myButtonStyle {
  myButtonStyleMixin(#ddd, #bbb);
}

style myButtonPushedStyle {
  myButtonStyleMixin(#aaa, #999);
}
</pre>
<p>现在再打开<strong>tipcalculator.mobl</strong>文件,把里面的按钮使用我们新定义的样式变量。代码如下，效果见后面的图。</p>
<pre class="brush: jscript; title: ; notranslate">
		button(_(&quot;Click me&quot;), style=myButtonStyle,
                   pushedStyle=myButtonPushedStyle, onclick={
		  alert(_(&quot;You clicked me!&quot;));
		})
</pre>
<p><img src="http://www.mobl-lang.org/wp-content/uploads/2011/01/Screen-shot-2011-01-14-at-1.37.11-PM.png" alt="" /></p>
<p>运行效果可以看<a href="http://me.leonzhang.com/mobl/TipCalculator/TipCalculator.html">这里</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leonzhang.com/2011/03/17/style-mobl-ui/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在mobl里显示中文</title>
		<link>http://www.leonzhang.com/2011/03/16/%e5%9c%a8mobl%e9%87%8c%e6%98%be%e7%a4%ba%e4%b8%ad%e6%96%87/</link>
		<comments>http://www.leonzhang.com/2011/03/16/%e5%9c%a8mobl%e9%87%8c%e6%98%be%e7%a4%ba%e4%b8%ad%e6%96%87/#comments</comments>
		<pubDate>Wed, 16 Mar 2011 15:57:22 +0000</pubDate>
		<dc:creator>leon</dc:creator>
				<category><![CDATA[软件开发]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mobl]]></category>

		<guid isPermaLink="false">http://www.leonzhang.com/?p=682</guid>
		<description><![CDATA[昨天的blog里说mobl的IDE不支持中文输入，Zef回复说现在可以通过使用语言文件的方式显示中文，IDE的下一个版本里将解决这个问题。 首先看看mobl的语言文件是什么？ 很多php程序都有自己格式的语言文件，一般就是普通的php文件，比如SugarCRM就是以php数组存放语言文件。Linux里的应用程序通常使用gettext来实现国际化。StatusNet就是采取这种方式。 mobl是主要使用web前台技术，内容一般通过javascript动态产生，国际化也是通过javascript调用json格式的文件来实现的。 这是一个简单的不能再简单的mobl的json语言文件： 再看看怎么使用这个语言文件 以小小计算器程序为例，打开TipCalculator.mobl文件。 首先在开头引用“import mobl”，i18n用到的方式在这个包里。 然后通过“fetchLanguageBundle(“zh.json”);”把json语言文件导入。 最后把原来使用字符串的地方，应“_()”函数包起来就得了。（“_()”好像Drupal呀。） 修改后的TipCalculator.mobl文件如下： 完成后的程序，可以在这里测试。 好了虽然能支持中文了，但是还是希望早日用上支持中文的mobl IDE。]]></description>
			<content:encoded><![CDATA[<p>昨天的blog里说<a href="http://www.mobl-lang.org">mobl</a>的IDE不支持中文输入，<a href="http://zef.me/">Zef</a>回复说现在可以通过使用语言文件的方式显示中文，IDE的下一个版本里将解决这个问题。</p>
<h2>首先看看mobl的语言文件是什么？</h2>
<p>很多php程序都有自己格式的语言文件，一般就是普通的php文件，比如<a href="http://www.sugarcrm.com">SugarCRM</a>就是以php数组存放语言文件。Linux里的应用程序通常使用<a href="http://www.poedit.net/index.php">gettext</a>来实现国际化。<a href="http://status.net/">StatusNet</a>就是采取这种方式。<br />
<a href="http://www.mobl-lang.org">mobl</a>是主要使用web前台技术，内容一般通过javascript动态产生，国际化也是通过javascript调用json格式的文件来实现的。<br />
这是一个简单的不能再简单的mobl的json语言文件：</p>
<pre class="brush: jscript; title: ; notranslate">
{
	&quot;Tip calculator&quot;:&quot;小小计算器&quot;,
	&quot;Click me&quot;:&quot;点我&quot;,
	&quot;You clicked me!&quot;:&quot;被你点了&quot;
}
</pre>
<h2>再看看怎么使用这个语言文件</h2>
<p>以小小计算器程序为例，打开TipCalculator.mobl文件。<br />
首先在开头引用“import mobl”，i18n用到的方式在这个包里。<br />
然后通过“fetchLanguageBundle(“zh.json”);”把json语言文件导入。<br />
最后把原来使用字符串的地方，应“_()”函数包起来就得了。（“_()”好像Drupal呀。）<br />
修改后的TipCalculator.mobl文件如下：</p>
<pre class="brush: jscript; title: ; notranslate">
application TipCalculator

import mobl
import mobl::ui::generic

screen root() {
	script {
  	  fetchLanguageBundle(&quot;zh.json&quot;);
  	}

	var amount     =  20
  	var percentage =  10

  	header(_(&quot;Tip calculator&quot;))
  	group {
	    item { numField(amount, label=&quot;amount&quot;) }
	    item { numField(percentage, label=&quot;percentage&quot;) }
	    item { &quot;$&quot; label(amount * (1 + percentage/100)) }
	}
	group{
		button(_(&quot;Click me&quot;), onclick={
		  alert(_(&quot;You clicked me!&quot;));
		})
	}
}
</pre>
<p>完成后的程序，可以在<a href="http://me.leonzhang.com/mobl/TipCalculator/TipCalculator.html">这里</a>测试。</p>
<p>好了虽然能支持中文了，但是还是希望早日用上支持中文的mobl IDE。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leonzhang.com/2011/03/16/%e5%9c%a8mobl%e9%87%8c%e6%98%be%e7%a4%ba%e4%b8%ad%e6%96%87/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>mobl-新颖的移动设备应用开发工具</title>
		<link>http://www.leonzhang.com/2011/03/16/mobl-mobile-develope-tool/</link>
		<comments>http://www.leonzhang.com/2011/03/16/mobl-mobile-develope-tool/#comments</comments>
		<pubDate>Tue, 15 Mar 2011 23:41:17 +0000</pubDate>
		<dc:creator>leon</dc:creator>
				<category><![CDATA[软件开发]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mobl]]></category>
		<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.leonzhang.com/?p=661</guid>
		<description><![CDATA[mobl是什么 mobl 是一个套手机应用开发工具（有自己界面描述语言+编译工具，提供基于Eclilpse的IDE）。完全基于标准web技术(Html+Css+javascript)，可以快速开发手机应用程序，跨平台，支持包括 iOS、Android 和其他支持 HTML5 技术的手机。 优势 适合各种支持html5和javascript手机平台 开发就是基于web技术,对平台相关的知识需求很少,入手快 劣势 不能完全访问移动设备的很多本地特性 没有native的app好用,好看 helloworld 从这里下载mobl的开发工具以后。通过Eclipse自动生成一个”mobl project”项目，保存一个简单的应用程序就完成了。生成的代码如下： 界面效果是这样的，实际使用效果可以用手机或者支持html5的浏览器直接访问这个页面。 小小计算器 这是一个简单的计算器应用。输入是一个数字和一个百分数，输出是这两个数字乘出来的结果。所有的代码如下： 界面效果是这样的，实际使用效果可以用手机或者支持html5的浏览器直接访问这个页面。 碰到的问题 现在做出来的就是个web应用,如何包装成本地应用,如何发布到app store? 中文支持有些问题,在IDE中输入中文会导致编译不通过.但是只是在IDE环境中,直接编辑.mobl文件,通过命令行编译器编译没有问题. 后记 总体来看，使用mobl开发简单的应用速度非常快，语法很简洁。其他的还不太清楚，日后再看。 我不懂移动开发，但是发现mobl还是挺好玩的。欢迎熟悉移动开发的朋友多指正。]]></description>
			<content:encoded><![CDATA[<h2>mobl是什么</h2>
<p>mobl 是一个套手机应用开发工具（有自己界面描述语言+编译工具，提供基于Eclilpse的IDE）。完全基于标准web技术(Html+Css+javascript)，可以快速开发手机应用程序，跨平台，支持包括 iOS、Android 和其他支持 HTML5 技术的手机。</p>
<h2>优势</h2>
<ul>
<li>适合各种支持html5和javascript手机平台</li>
<li>开发就是基于web技术,对平台相关的知识需求很少,入手快</li>
</ul>
<h2>劣势</h2>
<ul>
<li>不能完全访问移动设备的很多本地特性</li>
<li>没有native的app好用,好看</li>
</ul>
<h2>helloworld</h2>
<p>从这里<a href="http://www.mobl-lang.org/get/">下载</a>mobl的开发工具以后。通过Eclipse自动生成一个”mobl project”项目，保存一个简单的应用程序就完成了。生成的代码如下：</p>
<pre class="brush: jscript; title: ; notranslate">
application hellomobl

import mobl::ui::generic

screen root() {
	header(&quot;Hello world&quot;)
}
</pre>
<p>界面效果是这样的，实际使用效果可以用手机或者支持html5的浏览器直接访问<a href="http://me.leonzhang.com/mobl/hellomobl/hellomobl.html">这个页面</a>。<br />
<img src="http://www.mobl-lang.org/wp-content/uploads/2011/01/helloworld-159x300.png" alt="" /></p>
<h2>小小计算器</h2>
<p>这是一个<a href="http://docs.mobl-lang.org/tutorial/tipcalculator/">简单的计算器</a>应用。输入是一个数字和一个百分数，输出是这两个数字乘出来的结果。所有的代码如下：</p>
<pre class="brush: jscript; title: ; notranslate">
application TipCalculator

import ui

screen root() {
	var amount     =  20  //定义两个变量
  	var percentage =  10

  	header(&quot;Tip calculator&quot;) //标题
  	group {
	    item { numField(amount, label=&quot;amount&quot;) } //把变量amount与数字输入控件绑定
	    item { numField(percentage, label=&quot;percentage&quot;) } //把变量percentage与数字输入控件绑定
	    item { &quot;$&quot; label(amount * (1 + percentage/100)) } //根据这两个变量，计算，通过标签控件输出
	}
}
</pre>
<p>界面效果是这样的，实际使用效果可以用手机或者支持html5的浏览器直接访问<a href="http://hydra.nixos.org/build/850237/download/1/www/">这个页面</a>。<br />
<img src="http://www.mobl-lang.org/wp-content/uploads/2011/01/tipcalculator-159x300.png" alt="" /></p>
<h2>碰到的问题</h2>
<ul>
<li>现在做出来的就是个web应用,如何包装成本地应用,如何发布到app store?</li>
<li>中文支持有些问题,在IDE中输入中文会导致编译不通过.但是只是在IDE环境中,直接编辑.mobl文件,通过<a href="http://docs.mobl-lang.org/cli">命令行编译器</a>编译没有问题.</li>
</ul>
<h2>后记</h2>
<p>总体来看，使用mobl开发简单的应用速度非常快，语法很简洁。其他的还不太清楚，日后再看。<br />
我不懂移动开发，但是发现mobl还是挺好玩的。欢迎熟悉移动开发的朋友多指正。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leonzhang.com/2011/03/16/mobl-mobile-develope-tool/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Zen Coding，快速输入html和css之道</title>
		<link>http://www.leonzhang.com/2010/02/08/zencoding/</link>
		<comments>http://www.leonzhang.com/2010/02/08/zencoding/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 08:15:05 +0000</pubDate>
		<dc:creator>leon</dc:creator>
				<category><![CDATA[软件开发]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[pdt]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[zen-coding]]></category>

		<guid isPermaLink="false">http://www.leonzhang.com/?p=458</guid>
		<description><![CDATA[整理Eclipse for php的时候，无意间看到了这工具，Zen Coding。真是快速编辑html和css的利器，有多厉害，看看这里的演示吧。访问不到的请移步土豆。 作者的主要想法是，通过把编辑器变成一个简单的脚步解释环境，来提高编码的效率。我想这也是VIM这种编辑器反而比一些的IDE效率更高的主要原因。不过Zen Coding的想法更新颖，代码更少。 例如我们要输入这样一段html代码， 以zen coding的方式，就只需要输入“div#header>ul.navigation>li*4>a”，然后按快捷键展开就好了。 心动了，来体验一下zen coding的魅力吧。这个在线的Zen Coding编辑器，是通过js，把普通的html textarea变成了不错的IDE。如何让你网站上的textarea也支持这个功能？试试这个吧。 我常用的代码编辑器是VIM和Eclispe，来看看怎么使它们支持Zen Coding吧。 首先来看看VIM VIM下支持Zen Coding相对比较容易 首先确保你的VIM版本支持python的。我使用的是Debian/squeeze下的vim-nox包，squeeze下支持python的VIM包。 然后下载这两个VIM插件，zencoding.vim和zencoding_vim.py，拷贝到VIM的.vim/plugin目录中。 再从这里，下载Zen Coding for TextMate v0.3.1.zip，把压缩包里的zencoding整个目录拷贝到.vim/plugin下。注意是目录。 OK，现在可以打开VIM试试了。进入插入模式输入“div#header>ul.navigation>li*4>a”，然后按“Ctrl+E”，看看有什么效果，呵呵。 VIM下的Zen Coding的快捷键设置如下： 插入模式下Ctrl+L ：插入缩略代码 可视模式下Ctrl+L ：在选中的文本前后，重复插入缩略代码 插入模式下Ctrl+E：直接在当前编辑位置，运行并插入生产的代码 插入模式下Tab：同Ctrl+E 再说说Eclipse Eclipse下支持Zen Coding实际上是通过js做的。就像在Firefox里有Greasemonkey这样的扩展是用户可以通过js来扩充Firefox；Eclipse下也有个类似的叫Eclipse Monkey的项目。 首先在Eclipse里添加这个更新站点http://download.eclipse.org/technology/dash/update，更新、安装Eclipse Monkey。 然后看这个演示，就知道怎么在项目里加入zen coding的js文件，来扩展Eclipse了。 Zen Coding现在是一个比较新的项目，有兴趣的可以多关心Zen Coding在Google code上的项目。 参考文档： http://code.google.com/p/zen-coding/issues/detail?id=16 http://code.google.com/p/zen-coding/wiki/AptanaHowToEn]]></description>
			<content:encoded><![CDATA[<p>整理<a href="http://www.eclipse.org/pdt/">Eclipse for php</a>的时候，无意间看到了这工具，<a href="http://code.google.com/p/zen-coding/">Zen Coding</a>。真是快速编辑html和css的利器，有多厉害，看看这里的<a href="http://vimeo.com/7405114">演示</a>吧。访问不到的请移步<a href="http://www.tudou.com/programs/view/z7wjoN2E8Cg/">土豆</a>。</p>
<p>作者的主要想法是，通过把编辑器变成一个简单的脚步解释环境，来提高编码的效率。我想这也是VIM这种编辑器反而比一些的IDE效率更高的主要原因。不过Zen Coding的想法更新颖，代码更少。<br />
例如我们要输入这样一段html代码，</p>
<pre class="brush: xml; title: ; notranslate">
&lt;div id=”header”&gt;
    &lt;ul class=”navigation”&gt;
        &lt;li&gt;&lt;a href=”&quot;&gt;&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=”&quot;&gt;&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=”&quot;&gt;&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=”&quot;&gt;&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;
</pre>
<p> 以zen coding的方式，就只需要输入“div#header>ul.navigation>li*4>a”，然后按快捷键展开就好了。</p>
<p>心动了，来体验一下zen coding的魅力吧。这个<a href="http://www.cdolivet.com/editarea/editarea/exemples/exemple_full.html">在线的Zen Coding编辑器</a>，是通过js，把普通的html textarea变成了不错的IDE。如何让你网站上的textarea也支持这个功能？试试<a href="http://www.cdolivet.com/index.php?page=editArea">这个</a>吧。</p>
<p>我常用的代码编辑器是VIM和Eclispe，来看看怎么使它们支持Zen Coding吧。</p>
<h3>首先来看看VIM</h3>
<p>VIM下支持Zen Coding相对比较容易</p>
<ul>
<li>首先确保你的VIM版本支持python的。我使用的是Debian/squeeze下的vim-nox包，squeeze下<a href="http://packages.debian.org/squeeze/vim-python">支持python的VIM包</a>。</li>
<li>然后下载这两个VIM插件，<a href="http://zen-coding.googlecode.com/issues/attachment?aid=-2227862969360034964&#038;name=zencoding.vim">zencoding.vim</a>和<a href="http://zen-coding.googlecode.com/issues/attachment?aid=9155111667227577437&#038;name=zencoding_vim.py">zencoding_vim.py</a>，拷贝到VIM的.vim/plugin目录中。</li>
<li>再从<a href="http://code.google.com/p/zen-coding/downloads/list">这里</a>，下载Zen Coding for TextMate v0.3.1.zip，把压缩包里的zencoding整个目录拷贝到.vim/plugin下。注意是目录。</li>
</ul>
<p>OK，现在可以打开VIM试试了。进入插入模式输入“div#header>ul.navigation>li*4>a”，然后按“Ctrl+E”，看看有什么效果，呵呵。<br />
VIM下的Zen Coding的快捷键设置如下：</p>
<blockquote><p>
插入模式下Ctrl+L ：插入缩略代码<br />
可视模式下Ctrl+L ：在选中的文本前后，重复插入缩略代码<br />
插入模式下Ctrl+E：直接在当前编辑位置，运行并插入生产的代码<br />
插入模式下Tab：同Ctrl+E
</p></blockquote>
<h3>再说说Eclipse</h3>
<p>Eclipse下支持Zen Coding实际上是通过js做的。就像在Firefox里有<a href="https://addons.mozilla.org/en-US/firefox/addon/748?src=api">Greasemonkey</a>这样的扩展是用户可以通过js来扩充Firefox；Eclipse下也有个类似的叫<a href="http://wiki.eclipse.org/Eclipse_Monkey">Eclipse Monkey</a>的项目。</p>
<ul>
<li>首先在Eclipse里添加这个更新站点http://download.eclipse.org/technology/dash/update，更新、安装Eclipse Monkey。</li>
<li>然后看<a href="http://gonzalezmora.com/publications/screencasts/ZenCoding/ZenCoding.html">这个演示</a>，就知道怎么在项目里加入zen coding的js文件，来扩展Eclipse了。</li>
</ul>
<p><img src="http://zen-coding.googlecode.com/svn/wiki/images/aptana-proj-structure.png" alt="zen coding in Eclipse" /></p>
<p>Zen Coding现在是一个比较新的项目，有兴趣的可以多关心<a href="http://code.google.com/p/zen-coding/">Zen Coding在Google code上的项目</a>。</p>
<p>参考文档：</p>
<ul>
<li>http://code.google.com/p/zen-coding/issues/detail?id=16</li>
<li>http://code.google.com/p/zen-coding/wiki/AptanaHowToEn</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.leonzhang.com/2010/02/08/zencoding/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using disk: basic
Database Caching 1/76 queries in 0.060 seconds using disk: basic
Object Caching 1140/1314 objects using disk: basic
Content Delivery Network via N/A

Served from: www.leonzhang.com @ 2012-02-10 17:42:41 -->
