<?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>Lefter &#187; 程序相关</title>
	<atom:link href="http://lefter.net/blog/category/programme/feed/" rel="self" type="application/rss+xml" />
	<link>http://lefter.net/blog</link>
	<description>blog of lefter</description>
	<lastBuildDate>Mon, 23 Nov 2009 10:27:56 +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>CSS,JS文件压缩工具</title>
		<link>http://lefter.net/blog/compressor/</link>
		<comments>http://lefter.net/blog/compressor/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 10:27:56 +0000</pubDate>
		<dc:creator>lujo</dc:creator>
				<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[程序相关]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[yuicompressor]]></category>

		<guid isPermaLink="false">http://lefter.net/blog/?p=1122</guid>
		<description><![CDATA[js/css文件常见的压缩工具有：		

			YUIcompressor GUI TBcompressor
			ESC(ECMAScript cruncher)
			JSmin
  GUI:JsMinGUI
			Dojo ShrinkSafe
			在线Js压缩
			Google Closure compiler   Closure Tools			
打包下载地址
		
Yuicompre... ]]></description>
			<content:encoded><![CDATA[<h4>js/css文件常见的压缩工具有：</h4>		
<ul>
			<li><a href="http://yuilibrary.com/downloads/#yuicompressor">YUIcompressor</a><sup> GUI TBcompressor</sup></li>
			<li><a href="http://www.saltstorm.net/depo/esc/">ESC(ECMAScript cruncher)</a></li>
			<li><a href="http://www.crockford.com/javascript/jsmin.html">JSmin</a>
 <sup> GUI:JsMinGUI</sup></li>
			<li><a href="http://www.dojotoolkit.org/docs/shrinksafe">Dojo ShrinkSafe</a></li>
			<li><a href="http://dean.edwards.name/packer/">在线Js压缩</a></li>
			<li><a href="http://code.google.com/closure/compiler/">Google Closure compiler</a>  <sup> <a href="http://code.google.com/closure/">Closure Tools</a></sup></li>			
<li><strong><a href="http://lefter.googlecode.com/files/JS-css%E5%8E%8B%E7%BC%A9%E5%B7%A5%E5%85%B7.7z">打包下载地址</a></strong></li>
		</ul>
<h4>Yuicompressor的用法</h4>
<pre><code>java -jar D:\yuicompressor-2.4.2\build\yuicompressor-2.4.2.jar 
--charset UTF-8 D:\my.js -o D:\my-min.js
	
java -jar D:\yuicompressor-2.4.2\build\yuicompressor-2.4.2.jar 
--charset UTF-8 D:\my.css -o D:\my-min.css 
</code></pre>
<p>具体语法和其他参数参考：<a href="http://www.julienlecomte.net/yuicompressor/">julienlecomte Yuicompressor</a>。 也可以写一个批处理文件<a href="http://hi.baidu.com/wymwon/blog/item/f060cd6e868b6adc80cb4a6f.html">具体格式</a>，同时处理多个文件，例如:将D盘中的WEBsite文件夹下的所有.CSS , .JS文件进行压缩</p>
<pre><code>@echo off
::设置YUI Compressor启动目录
SET YUIFOLDER=D:\yuicompressor-2.4.2\build
::设置你的JS和CSS根目录，脚本会自动按树层次查找和压缩所有的JS和CSS
SET JSFOLDER=D:\WEBsite
echo look for JavaScript, CSS ...
chdir /d %JSFOLDER%
for /r . %%a in (*.js *.css) do (
@echo It's compressing  %%~a ...
@java -jar %YUIFOLDER%\yuicompressor-2.4.2.jar --charset UTF-8 %%~fa -o %%~fa
 )
@echo OK!
pause &amp; exit</code></pre>
<h4>ESC(ECMAScript cruncher)</h4>
<p>这个工具只能在Windows下使用,ESC.wsf提供5种压缩级别，从0到4：<br/>
Level 0 :: No compression 不对JS文件进行压缩<br/>
Level 1 :: Comment removal 移除JS文件中的注释<br/>
Level 2 :: Whitespace removal 移除JS文件中的注释及空行（默认，一般选择此级别就足够了）<br/>
Level 3 :: Newline removal 移除JS文件中的注释，将所有代码合并为一行<br/>
Level 4 :: Variable substitution 提供最新的压缩率，移除JS文件中的注释，将所有代码合并为一行，并且修改JS文件中的变量名。例如：将"big.js"按照压缩级别2来压缩（ESC.wsf默认压缩级别为2）为"min.js"</p>
<pre><code>cscript ESC.wsf -ow min.js big.js </code></pre>
<h4>Google Closure Tools 包含三大块</h4>
<ol>
<li><a href="http://code.google.com/closure/compiler/">Closure Compiler</a>：这是个JavaScript优化器，可以将JavaScript编译成压缩的、高性能代码。它除了能移除无效代码，重写代码使其最小化且运行更快，还能检查语法、变量引用和类型，并对一些常见JavaScript错误提出警告。同时，它还提供了Closure Inspector（一个Firefox插件）用于调试编译后的代码。<a href="http://closure-inspector.googlecode.com/files/closureinspector09.xpi">FireFox插件</a></li>
<li><a href="http://code.google.com/closure/library/">Closure Library</a>：这是个广泛的、经过良好测试、模块化且跨浏览器的JavaScript库。在例子中可以看到，Google Docs就是用这个库写的。</li>
<li><a href="http://code.google.com/closure/templates/">Closure Templates</a>：这是一个为Java和JavaScript实现的模板系统，可在服务器和客户端使用相同的模板。值得一提的是，JavaScript模板会进行预编译处理，以提高其性能。此外，Gmail和Google Docs也是使用该模板系统。</li>
</ol>]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/compressor/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>推荐几款漂亮的ubuntu主题</title>
		<link>http://lefter.net/blog/ubuntu-themes/</link>
		<comments>http://lefter.net/blog/ubuntu-themes/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 04:59:38 +0000</pubDate>
		<dc:creator>lujo</dc:creator>
				<category><![CDATA[生活及其他]]></category>
		<category><![CDATA[程序相关]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://lefter.net/blog/?p=831</guid>
		<description><![CDATA[

不喜欢 Ubuntu 自带的咖啡色主题的朋友可以试一下

1：编辑源文件
sudo gedit /etc/apt/sources.list

修改源并报存
deb http://ppa.launchpad.net/bisigi/ppa/ubuntu jaunty main
deb-src http://ppa.launchpad.net/bisigi/ppa/... ]]></description>
			<content:encoded><![CDATA[<a title="进入作者的HOME" href="http://www.bisigi-project.org/?page_id=6"><img src="http://lefter.net/blog/wp-content/uploads/2009/08/sendpix0.jpg" alt="linux-theam" title="linux-themes" style="background:none"/></a>
<p>
不喜欢 Ubuntu 自带的咖啡色主题的朋友可以试一下
</p>
1：编辑源文件
<pre><code>sudo gedit /etc/apt/sources.list
</code></pre>
修改源并报存
<pre><code>deb http://ppa.launchpad.net/bisigi/ppa/ubuntu jaunty main
deb-src http://ppa.launchpad.net/bisigi/ppa/ubuntu jaunty main
</code></pre>
2:导入密钥
<pre><code>sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com
1781bd45c4c3275a34bb6aec6e871c4a881574de
</code></pre>
3:更新源
<pre><code>sudo apt-get update
</code></pre>
4:安装(整个)<pre><code>sudo aptitude install zgegblog-themes</code></pre>
或者单独安装（1个或者几个）
<pre><code>sudo aptitude install showtime-theme
sudo aptitude install balanzan-theme
sudo aptitude install infinity-theme
sudo aptitude install wild-shine-theme
sudo aptitude install exotic-theme
sudo aptitude install tropical-theme
sudo aptitude install bamboo-zen-theme
sudo aptitude install ubuntu-sunrise-theme
sudo aptitude install  aquadreams-theme
</code></pre>
附卸载方法<pre><code>sudo aptitude remove zgegblog-themes(Themse Name)</code></pre>]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/ubuntu-themes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>自动改变CSS，JS版本</title>
		<link>http://lefter.net/blog/automatically-version-your-css-and-javascript-files/</link>
		<comments>http://lefter.net/blog/automatically-version-your-css-and-javascript-files/#comments</comments>
		<pubDate>Sun, 09 Aug 2009 03:35:36 +0000</pubDate>
		<dc:creator>lujo</dc:creator>
				<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[程序相关]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://lefter.net/blog/?p=759</guid>
		<description><![CDATA[在雅虎工程师，史蒂夫Souders 的高性能网站建设中，有很多条关于网站性能优化的建议,其中第3条建议您使用树立了一个Expires头的静态文件（图片， CSS和JavaScript ），实施Expires头很简单，在您... ]]></description>
			<content:encoded><![CDATA[在雅虎工程师，史蒂夫Souders 的<a href="http://oreilly.com/catalog/9780596529307/">高性能网站建设</a>中，有很多条关于网站性能优化的<a href="http://developer.yahoo.com/performance/rules.html">建议</a>,其中<a href="http://developer.yahoo.com/performance/rules.html#expires">第3条建议</a>您使用树立了一个Expires头的静态文件（图片， CSS和JavaScript ），实施Expires头很简单，在您的<a href="http://www.freewebmasterhelp.com/tutorials/htaccess/1" title="Apache非常强大的分布式配置文件">.htaccess</a>的文件，您可以使用下面的代码
<pre><code>#Far Future Expires Header
&lt;FilesMatch "\.(gif|png|jpg|js|css|swf)$"&gt;
    ExpiresActive On
    ExpiresDefault "access plus 10 years"
&lt;/FilesMatch&gt;
</code>
</pre>
作者指出：<blockquote>Keep in mind, if you use a far future Expires header you have to change the component’s filename whenever the component changes. At Yahoo! we often make this step part of the build process: a version number is embedded in the component’s filename, for example, yahoo_2.0.6.js.</blockquote>
要生成像yahoo_2.0.6.js可以按照下面的方法：
<p>第一步，建立一些可规则重写的存储模块，一边存储文件的版本号，因此还是在.htaccess的文件中加入下面的代码</P><pre><code>#Rules for Versioned Static Files
RewriteRule ^(scripts|css)/(.+)\.(.+)\.(js|css)$ $1/$2.$4 [L]
</code></pre>
<p>然后写一个PHP函数来检查文件的最后修改日期，然后将服务器的修改时间作为版本号</p>
<pre><code>&lt;?php 
function autoVer($url){$path = pathinfo($url); 
$ver = '.'.filemtime($_SERVER['DOCUMENT_ROOT'].$url).'.';
echo $path['dirname'].'/'.str_replace('.', $ver, $path['basename']); } 
?&gt; 
</code></pre>
然后我们可以将这个函数包含到页面中
<pre><code>include($_SERVER['DOCUMENT_ROOT'].'/path/to/autoVer.php'); 
&lt;link rel="stylesheet" href="&lt;?php autoVer('/css/structure.css'); ?&gt;" 
type="text/css" /&gt; 
&lt;script type="text/javascript" src="&lt;?php autoVer('/scripts/prototype.js'); ?&gt;"&gt;
&lt;/script&gt; :include($_SERVER['DOCUMENT_ROOT'].'/path/to/autoVer.php'); 
&lt;link rel="stylesheet" href="&lt;?php autoVer('/css/structure.css'); ?&gt;"
type="text/css" /&gt;
&lt;script type="text/javascript" src="&lt;?php autoVer('/scripts/prototype.js'); ?&gt;"&gt;
&lt;/script&gt; 
</code></pre>
然后经过解析之后在页面文件看到的HTML代码将会是
<pre><code>&lt;script type="text/javascript" src="/prototype.197993206.js">&lt;/script&gt; 
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/automatically-version-your-css-and-javascript-files/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>新闻网被人攻击啦</title>
		<link>http://lefter.net/blog/someone-into-newscenter/</link>
		<comments>http://lefter.net/blog/someone-into-newscenter/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 02:04:14 +0000</pubDate>
		<dc:creator>lujo</dc:creator>
				<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[程序相关]]></category>
		<category><![CDATA[css]]></category>

		<guid isPermaLink="false">http://lefter.net/blog/?p=667</guid>
		<description><![CDATA[今天早上还在睡觉的时候，工作室同学打电话说新闻网不能访问了，我用Firefox能打开,但是用IE打开会报错XML 文档只能有一个顶层元素。处理资源'http://www.news.uestc.edu.cn/' 时出错。第 163 行，位... ]]></description>
			<content:encoded><![CDATA[<p>今天早上还在睡觉的时候，工作室同学打电话说新闻网不能访问了，我用Firefox能打开,但是用IE打开会报错<img  title="IE下报错" alt="IE下报错" src="http://lh6.ggpht.com/_M2p9f-QlWt4/SjrnoeMCKII/AAAAAAAABuA/GdCzYD0J-Qs/s640/%E6%9C%AA%E6%A0%87%E9%A2%98-1.jpg" /><code>XML 文档只能有一个顶层元素。处理资源'http://www.news.uestc.edu.cn/' 时出错。第 163 行，位置: 2<br />
< a href="http://devturkler.com" title="devturk">< font color="#FFFFFF" >turkler< /a ><br />
-^<br />
</code>我看怎么多出了一个链接，然后代开这个链接，好像能打开，我想知道是那个国家的人攻击的，想查一下其IP地址是那个国家的，但是PING不通，太强了 <ins datetime="2009-06-19T02:16:54+00:00">现在知道是土耳其人侵略了我们:)</ins></p>
<p>后来才注意到Firefox里面也是不正常的，因为下面多出了一行空白，因为他给链接用的白色的字体，背景也是白色的所以就不能看见；但是FIREFOX为什么不报错呢，我想是因为我们新闻网的前端架构采用XSL解析XML的方式,而XSL也是一种XML,XML相对html要规范的多,很多标签如CENTER，FONT等都被取消了,还有所有的标签必须关闭,而他用的<code>< a >< font color="#FFFFFF" >turkler< /a ></code>这两点都不满足，而Firefox渲染的时候是把XML直接转换为HTML(在IE，和firefox下分别查看源文件就可以知道)，因此不报错！但是能解析出来，只是此人用了白色的字体，而背景也是白色的，所以看不出来罢了，全选的时候就能看出来了<img alt="FIREFOX下面的效果" title="FIREFOX下面的效果" src="http://lh3.ggpht.com/_M2p9f-QlWt4/SjrnokIOpBI/AAAAAAAABuE/-vscosXBTpU/s640/%E6%9C%AA%E6%A0%87%E9%A2%98s-1.jpg"/></p>
<p>我滴神啦，被改掉的DEFAULT文件，还不知道有没有其他的文件被改掉<img alt="被改之后的文件" title="被改之后的文件"  src="http://lh6.ggpht.com/_M2p9f-QlWt4/SjrnooQVYkI/AAAAAAAABuI/7rv6GfDx2ck/s640/%E6%9C%AA%E5%91%BD%E5%90%8D.jpg" /></p>
<p>还好此人没有多少恶意，只是加上他的链接在上面，可能是想赚取PR，也给我们敲了个警钟。现在应该找出我们的服务器的漏洞出在哪里，大家不要在上面安装其他的软件</p>
]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/someone-into-newscenter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu安装 Apache</title>
		<link>http://lefter.net/blog/ubuntu-apache/</link>
		<comments>http://lefter.net/blog/ubuntu-apache/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 02:20:30 +0000</pubDate>
		<dc:creator>lujo</dc:creator>
				<category><![CDATA[程序相关]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://lefter.net/blog/?p=658</guid>
		<description><![CDATA[Ubuntu为我们提供了 su apt-get install 命令，通过它你可以很方便地安装一些软件，这些软件是放在Ubuntu放置在各个地方的服务器上面，如果你想安装的软件是比较常见的，一般都可以通过它来下载... ]]></description>
			<content:encoded><![CDATA[<p>Ubuntu为我们提供了 su apt-get install 命令，通过它你可以很方便地安装一些软件，这些软件是放在Ubuntu放置在各个地方的服务器上面，如果你想安装的软件是比较常见的，一般都可以通过它来下载.<br />
<code>sudo apt-get install apache2</code></p>
<p>配置网站目录，在Ubuntu下面的 apache 目录存放方式跟 Window下面有很大区别，它的配置文件是存放在 etc/apache2/ 这个文件夹下面,又将以前的配置文件分成了
<dl>
<dt>etc/apache2/conf.d/charset</dt>
<dd>这个是网站编码配置，里面内容很少，打开看就知道了，我这里将最后行的 ＃AddDefaultCharset UTF-8 前面的#去掉，使用UTF-8编码，当然也可以把 UTF-8改成别的编码.</dd>
<dt>etc/apache2/sites-available/default </dt>
<dd>这个是网站目录配置，想更改网站目录的话，就修改这个，默认的网站目录是/var/www(所有者为root,所以修改起来很不方便)</dd>
</dl>
<p>像LINUX源一样，要有一定的权限才能修改上面的配置文件，可以这样：<code>1:su  输入root密码 2:gedit etc/apache2/conf.d/charset </code>或者直接临时获取权限<code>1:sudo gedit etc/apache2/conf.d/charset </code>
</p>
<p>重启apache即可,<code>sudo service apache2 restart</code>也可以<code>sudo /etc/init.d/apache2 restart</code></p>
<p>BTW: init.d 下面是系统的服务类程序（比如xinet,samba,vsftp，xserver,apche,mysql）的启动登记   各个init.x目录下的文件表示这个运行级别下服务的运行与否,这里面的文件通常是一些脚本,来启动和结束各个服务的,具体的内容你可以用任何一个编辑器打开看的 </p>
<p><strong>顺便提一下mysql</strong> ，开启mysql的方法和apche一样：<code>sudo /etc/init.d/mysql start</code>不知我什么时候已经把 mysql安装成功了,因为我的/etc/nit.d/ 目录下有 mysal文件，于是我在终端上输入 mysql，提示<code>ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'h'</code>我想也是由于权限的问题造成的输入<code>mysql --user=root -p</code>就对了，然后就可以在终断开上运行MySql的命令了比如<br />
<code>mysql > show databases;<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/ubuntu-apache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>程序运行机制</title>
		<link>http://lefter.net/blog/scope/</link>
		<comments>http://lefter.net/blog/scope/#comments</comments>
		<pubDate>Sat, 18 Apr 2009 06:23:52 +0000</pubDate>
		<dc:creator>lujo</dc:creator>
				<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[程序相关]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://lefter.net/blog/?p=491</guid>
		<description><![CDATA[先看下面两个例子：试试看将弹出什么消息？
var a = 1;
function foo(a) {
     alert(a);
      var a = 2;
}
foo(3);
var a = "right";
(function() {
    alert(a);
    var a = "wrong";
})();

来自《编译原理》：对于传统编译型... ]]></description>
			<content:encoded><![CDATA[<p>先看下面两个例子：试试看将弹出什么消息？</p>
<pre><code>var a = 1;
function foo(a) {
     alert(a);
      var a = 2;
}
foo(3);</code></pre>
<pre><code>var a = "right";
(function() {
    alert(a);
    var a = "wrong";
})();
</code></pre>
<blockquote><p>来自《编译原理》：对于传统编译型语言来说，编译步骤分为：词法分析、语法分析、语义检查、代码优化和字节生成。<br />
但对于解释型语言来说，通过<a href="http://en.wikipedia.org/wiki/Lexical_analysis">词法分析</a>和语法分析得到语法树后，就可以开始解释执行了。</p></blockquote>
<p>
第二个函数输出结果是undefined, 这种现象被称成“预解析”：JavaScript引擎会优先解析var变量和function定义。在预解析完成后，才会执行代码。如果一个文档流中包含多个script代码段运行顺序是：<br />
<strong>step1.</strong> 读入第一个代码段<br />
<strong>step2.</strong> 做语法分析，有错则报语法错误（比如括号不匹配等），并跳转到step5<br />
<strong>step3.</strong>对var变量和function定义做“预解析”（永远不会报错的，因为只解析正确的声明,在step2的语法分析阶段完成，并存储在语法树中。当执行到函数实例时，会将varDelcs和funcDecls从语法树中复制到执行环境的scriptObject上）<br />
<strong>step4.</strong> 执行代码段，有错则报错（比如变量未定义,未定义变量意味着在scriptObject的变量表中找不到，JS引擎会沿着scriptObject的upvalue往上寻找，如果都没找到，对于写操作i = 1; 最后就会等价为 window.i = 1; 给window对象新增了一个属性。对于读操作，如果一直追溯到全局执行环境的scriptObject上都找不到，就会产生运行期错误）<br />
<strong>step5.</strong> 如果还有下一个代码段，则读入下一个代码段，重复step2<br />
<strong>step6.</strong> 结束<br />
通过编译，JavaScript代码已经翻译成了语法树，然后会立刻按照语法树执行。进一步的执行过程，需要理解JavaScript的作用域机制，JavaScript采用的是词法作用域（lexcical scope）。通俗地讲，就是JavaScript变量的作用域是在定义时决定而不是执行时决定，也就是说词法作用域取决于源码，编译器通过静态分析就能确定，因此词法作用域也叫做静态作用域（static scope）。但需要注意，with和eval的语义无法仅通过静态技术实现，实际上，只能说JS的作用域机制非常接近lexical scope.</p>
]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/scope/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
