<?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>Tinoweb</title>
	<atom:link href="http://www.tinoweb.cn/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.tinoweb.cn</link>
	<description>万物有终极,浮生欲何成</description>
	<lastBuildDate>Fri, 03 Sep 2010 16:54:28 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Ubuntu下安装Lua</title>
		<link>http://www.tinoweb.cn/2010/09/04/ubuntu%e4%b8%8b%e5%ae%89%e8%a3%85lua/</link>
		<comments>http://www.tinoweb.cn/2010/09/04/ubuntu%e4%b8%8b%e5%ae%89%e8%a3%85lua/#comments</comments>
		<pubDate>Fri, 03 Sep 2010 16:54:28 +0000</pubDate>
		<dc:creator>henson</dc:creator>
				<category><![CDATA[Lua]]></category>

		<guid isPermaLink="false">http://www.tinoweb.cn/?p=577</guid>
		<description><![CDATA[ 1、下载lua的源码包，地址如下，最新版本5.1.4。
http://www.lua.org/ftp/lua-5.1.4.tar.gz
2、下载ubuntu的编译支持
sudo apt-get install build-essential
注意，这里不仅仅是安装gcc而已，还包括很多其他工具。
3、下载libreadline相关支持，这个东西在编译时需要用到，无奈。
sudo apt-get install libreadline5
sudo apt-get install libreadline5-dev
4、编译以及安装
tar xzvf lua-5.1.2.tar.gz
cd lua-5.1.2
make linux
sudo make install
5、测试
$ lua
Lua 5.1.2 Copyright (C) 1994-2007 Lua.org, PUC-Rio
>
按下Ctrl+D退出。
 ]]></description>
			<content:encoded><![CDATA[ <p>1、下载lua的源码包，地址如下，最新版本5.1.4。<br />
http://www.lua.org/ftp/lua-5.1.4.tar.gz</p>
<p>2、下载ubuntu的编译支持<br />
sudo apt-get install build-essential<br />
注意，这里不仅仅是安装gcc而已，还包括很多其他工具。</p>
<p>3、下载libreadline相关支持，这个东西在编译时需要用到，无奈。<br />
sudo apt-get install libreadline5<br />
sudo apt-get install libreadline5-dev</p>
<p>4、编译以及安装<br />
tar xzvf lua-5.1.2.tar.gz<br />
cd lua-5.1.2<br />
make linux<br />
sudo make install</p>
<p>5、测试<br />
$ lua<br />
Lua 5.1.2 Copyright (C) 1994-2007 Lua.org, PUC-Rio<br />
><br />
按下Ctrl+D退出。</p>
 ]]></content:encoded>
			<wfw:commentRss>http://www.tinoweb.cn/2010/09/04/ubuntu%e4%b8%8b%e5%ae%89%e8%a3%85lua/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lua学习笔记(二)</title>
		<link>http://www.tinoweb.cn/2010/07/28/lua%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e4%ba%8c/</link>
		<comments>http://www.tinoweb.cn/2010/07/28/lua%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e4%ba%8c/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 15:37:07 +0000</pubDate>
		<dc:creator>henson</dc:creator>
				<category><![CDATA[Lua]]></category>

		<guid isPermaLink="false">http://www.tinoweb.cn/?p=575</guid>
		<description><![CDATA[ 1.Lua可以对多个变量同时赋值，变量列表和值列表的各个元素用逗号分开。
a, b = 10, 2*x
遇到赋值语句Lua会先计算右边所有的值然后再执行赋值操作。
x, y = y, x
a[i], a[j] = a[j], a[i]
但变量个数和值的个数不一致时，Lua会一直以变量个数为基础采取以下策略
a. 变量个数>值的个数  按变量个数补足nil
b. 变量个数]]></description>
			<content:encoded><![CDATA[ <p>1.Lua可以对多个变量同时赋值，变量列表和值列表的各个元素用逗号分开。<br />
a, b = 10, 2*x</p>
<p>遇到赋值语句Lua会先计算右边所有的值然后再执行赋值操作。<br />
x, y = y, x<br />
a[i], a[j] = a[j], a[i]</p>
<p>但变量个数和值的个数不一致时，Lua会一直以变量个数为基础采取以下策略<br />
a. 变量个数>值的个数  按变量个数补足nil<br />
b. 变量个数<值的个数  多余的值会被忽略</p>
<p>2.使用local创建一个局部变量，与全局变量不同，局部变量只在被声明的那个代码块内有效。代码块：指一个控制结构内，一个函数体，或者一个chunk（变量被声明的那个文件或者文本串)</p>
<p>应该尽可能的使用局部变量，有两个好处：<br />
A. 笔名命名冲突<br />
B. 访问局部变量的速度比全局变量更快</p>
<p>给block划定一个明确的界限：do..end内的部分。</p>
<p>3. Lua语法要求break和return只能出现在block的结尾一句（也就是说：作为chunk的最后一句，或者在end之前，或者else钱，或者until前）。<br />
有时候为了调试或者其他目的需要在block的中间使用return或者break，可以显示的使用do..end</p>
<p>4. Lua函数可以返回多个结果值</p>
 ]]></content:encoded>
			<wfw:commentRss>http://www.tinoweb.cn/2010/07/28/lua%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e4%ba%8c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lua学习笔记(一)</title>
		<link>http://www.tinoweb.cn/2010/07/28/lua%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e4%b8%80/</link>
		<comments>http://www.tinoweb.cn/2010/07/28/lua%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e4%b8%80/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 16:09:12 +0000</pubDate>
		<dc:creator>henson</dc:creator>
				<category><![CDATA[Lua]]></category>

		<guid isPermaLink="false">http://www.tinoweb.cn/?p=573</guid>
		<description><![CDATA[ 一、类型和值
1. Lua是动态类型语言，变量不要类型定义。
Lua中有8个基本类型分别为：nil,boolean,number,string,userdata,function,thread,table。
函数type可以测试给定变量或者值的类型。
2.  Nil
Lua中特殊的类型，它只有一个值：nil；一个全局变量没有被赋值以前默认值为nil；给全局变量赋nil可以删除该变量。
3. Lua中所有的值都可以作为条件。在控制结构的条件中除了false和nil为假，其他值都为真。所以Lua认为0和空串都是真。
4. Numbers表示实数，Lua中没有整数
5. 一个string可以只包含一个字母也可以包含一本书，Lua可以高效的处理长字符串，1M的string在Lua中是很常见的。可以使用单引号或者双引号表示字符串。还可以使用[[...]]表示字符串。
6.   ..在Lua中是字符串连接符，当在数字后面写..时，必须加上空格以防止被解释错误。
7. 显式将string转成数字可以使用函数tonumber(),如果string不是正确的数字该函数将返回nil。反之，可调用tostring()
8. userdata可以将C数据存放在Lua变量中，userdata在Lua中除了赋值和相等比较外，没有预定义的操作。userdata用来描述应用程序或者使用C实现的库创建的新类型。
二、表达式
1. ==和~=比较两个值，如果两个值类型不同，Lua认为两者不同；nil只和自己相等。
2. 为了避免不一致的结果，火鹤比较数字和字符串，Lua会报错，比如：2 < &#8220;15&#8243;
3. and 和 or的运算结果不是true和false，而是和它的两个操作数相关
a and b &#8211;如果a为false，则返回a，否则返回b
a or b &#8211;如果a为true，则返回a，否则返回b
x = x or v
等价于
if not x then
	x = v
end
4. not的结果一直返回false或者true
5. 表的构造
构造器是创建和初始化表的表达式。表是Lua特有的功能强大的东西。最简单的构造函数是{}，用来创建一个空表。
days = {&#8221;Sunday&#8221;, &#8220;Monday&#8221;, &#8220;Tuesday&#8221;}
&#8220;Sunday&#8221;初始化为days[1]（第一个元素索引为1）
 ]]></description>
			<content:encoded><![CDATA[ <p>一、类型和值<br />
1. Lua是动态类型语言，变量不要类型定义。<br />
Lua中有8个基本类型分别为：nil,boolean,number,string,userdata,function,thread,table。<br />
函数type可以测试给定变量或者值的类型。</p>
<p>2.  Nil<br />
Lua中特殊的类型，它只有一个值：nil；一个全局变量没有被赋值以前默认值为nil；给全局变量赋nil可以删除该变量。</p>
<p>3. Lua中所有的值都可以作为条件。在控制结构的条件中除了false和nil为假，其他值都为真。所以Lua认为0和空串都是真。</p>
<p>4. Numbers表示实数，Lua中没有整数</p>
<p>5. 一个string可以只包含一个字母也可以包含一本书，Lua可以高效的处理长字符串，1M的string在Lua中是很常见的。可以使用单引号或者双引号表示字符串。还可以使用[[...]]表示字符串。</p>
<p>6.   ..在Lua中是字符串连接符，当在数字后面写..时，必须加上空格以防止被解释错误。</p>
<p>7. 显式将string转成数字可以使用函数tonumber(),如果string不是正确的数字该函数将返回nil。反之，可调用tostring()</p>
<p>8. userdata可以将C数据存放在Lua变量中，userdata在Lua中除了赋值和相等比较外，没有预定义的操作。userdata用来描述应用程序或者使用C实现的库创建的新类型。</p>
<p>二、表达式<br />
1. ==和~=比较两个值，如果两个值类型不同，Lua认为两者不同；nil只和自己相等。</p>
<p>2. 为了避免不一致的结果，火鹤比较数字和字符串，Lua会报错，比如：2 < &#8220;15&#8243;</p>
<p>3. and 和 or的运算结果不是true和false，而是和它的两个操作数相关<br />
a and b &#8211;如果a为false，则返回a，否则返回b<br />
a or b &#8211;如果a为true，则返回a，否则返回b<br />
x = x or v<br />
等价于<br />
if not x then<br />
	x = v<br />
end<br />
4. not的结果一直返回false或者true</p>
<p>5. 表的构造<br />
构造器是创建和初始化表的表达式。表是Lua特有的功能强大的东西。最简单的构造函数是{}，用来创建一个空表。<br />
days = {&#8221;Sunday&#8221;, &#8220;Monday&#8221;, &#8220;Tuesday&#8221;}<br />
&#8220;Sunday&#8221;初始化为days[1]（第一个元素索引为1）</p>
 ]]></content:encoded>
			<wfw:commentRss>http://www.tinoweb.cn/2010/07/28/lua%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e4%b8%80/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL重设密码</title>
		<link>http://www.tinoweb.cn/2010/06/30/mysql%e9%87%8d%e8%ae%be%e5%af%86%e7%a0%81/</link>
		<comments>http://www.tinoweb.cn/2010/06/30/mysql%e9%87%8d%e8%ae%be%e5%af%86%e7%a0%81/#comments</comments>
		<pubDate>Wed, 30 Jun 2010 05:34:24 +0000</pubDate>
		<dc:creator>henson</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.tinoweb.cn/?p=570</guid>
		<description><![CDATA[ UPDATE mysql.user SET Password=PASSWORD(&#8217;MyNewPass&#8217;) WHERE User=&#8217;root&#8217;;
FLUSH PRIVILEGES;
 ]]></description>
			<content:encoded><![CDATA[ <p>UPDATE mysql.user SET Password=PASSWORD(&#8217;MyNewPass&#8217;) WHERE User=&#8217;root&#8217;;<br />
FLUSH PRIVILEGES;</p>
 ]]></content:encoded>
			<wfw:commentRss>http://www.tinoweb.cn/2010/06/30/mysql%e9%87%8d%e8%ae%be%e5%af%86%e7%a0%81/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FTP: 被动和主动连接</title>
		<link>http://www.tinoweb.cn/2010/06/30/ftp-%e8%a2%ab%e5%8a%a8%e5%92%8c%e4%b8%bb%e5%8a%a8%e8%bf%9e%e6%8e%a5/</link>
		<comments>http://www.tinoweb.cn/2010/06/30/ftp-%e8%a2%ab%e5%8a%a8%e5%92%8c%e4%b8%bb%e5%8a%a8%e8%bf%9e%e6%8e%a5/#comments</comments>
		<pubDate>Wed, 30 Jun 2010 01:27:24 +0000</pubDate>
		<dc:creator>henson</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.tinoweb.cn/?p=568</guid>
		<description><![CDATA[ FTP协议有两种工作方式：PORT方式和PASV方式，即为主动式和被动式。
PORT（主动）方式的连接过程是：客户端向服务器的FTP端口（默认是21）发送连接请求，服务器接受连接，建立一条命令链路。当需要传送数据时，客户端在命令链路上用PORT命令告诉服务器：“我打开了XXXX端口，你过来连接我”。于是服务器从20端口向客户端的XXXX端口发送连接请求，建立一条数据链路来传送数据。
PASV （被动）方式的连接过程是：客户端向服务器的FTP端口（默认是21）发送连接请求，服务器接受连接，建立一条命令链路。当需要传送数据时，服务器在命令链路上用PASV命令告诉客户端：“我打开了XXXX端口，你过来连接我”。于是客户端向服务器的XXXX端口发送连接请求，建立一条数据链路来传送数据。
 概括： 主动模式：服务器向客户端敲门，然后客户端开门
被动模式：客户端向服务器敲门，然后服务器开门 所以，如果你是如果通过代理上网的话，就不能用主动模式，因为服务器敲的是上网代理服务器的门，而不是敲客户端的门 而且有时候，客户端也不是轻易就开门的，因为有防火墙阻挡，除非客户端开放大于1024的高端端口 要用主动模式来下载，请您把下载工具的被动模式（PASV）都不要打勾，用主动模式来下载就OK了,如果在出错，那就被动主动相互转换一下
 ]]></description>
			<content:encoded><![CDATA[ <p>FTP协议有两种工作方式：PORT方式和PASV方式，即为主动式和被动式。<br />
PORT（主动）方式的连接过程是：客户端向服务器的FTP端口（默认是21）发送连接请求，服务器接受连接，建立一条命令链路。当需要传送数据时，客户端在命令链路上用PORT命令告诉服务器：“我打开了XXXX端口，你过来连接我”。于是服务器从20端口向客户端的XXXX端口发送连接请求，建立一条数据链路来传送数据。<br />
PASV （被动）方式的连接过程是：客户端向服务器的FTP端口（默认是21）发送连接请求，服务器接受连接，建立一条命令链路。当需要传送数据时，服务器在命令链路上用PASV命令告诉客户端：“我打开了XXXX端口，你过来连接我”。于是客户端向服务器的XXXX端口发送连接请求，建立一条数据链路来传送数据。<br />
 概括： 主动模式：服务器向客户端敲门，然后客户端开门<br />
被动模式：客户端向服务器敲门，然后服务器开门 所以，如果你是如果通过代理上网的话，就不能用主动模式，因为服务器敲的是上网代理服务器的门，而不是敲客户端的门 而且有时候，客户端也不是轻易就开门的，因为有防火墙阻挡，除非客户端开放大于1024的高端端口 要用主动模式来下载，请您把下载工具的被动模式（PASV）都不要打勾，用主动模式来下载就OK了,如果在出错，那就被动主动相互转换一下</p>
 ]]></content:encoded>
			<wfw:commentRss>http://www.tinoweb.cn/2010/06/30/ftp-%e8%a2%ab%e5%8a%a8%e5%92%8c%e4%b8%bb%e5%8a%a8%e8%bf%9e%e6%8e%a5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL Replace INTO</title>
		<link>http://www.tinoweb.cn/2010/06/17/mysql-replace-into/</link>
		<comments>http://www.tinoweb.cn/2010/06/17/mysql-replace-into/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 03:51:26 +0000</pubDate>
		<dc:creator>henson</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.tinoweb.cn/?p=566</guid>
		<description><![CDATA[ MySQL Replace INTO说明
REPLACE的运行与INSERT很相像。只有一点除外，如果表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值，则在新记录被插入之前，旧记录被删除。请参见13.2.4节，“INSERT语法”。
注意，除非表有一个PRIMARY KEY或UNIQUE索引，否则，使用一个REPLACE语句没有意义。该语句会与INSERT相同，因为没有索引被用于确定是否新行复制了其它的行。

以下是所用算法的更详细的说明（该算法也用于LOAD DATA…REPLACE）：
1. 尝试把新行插入到表中
2. 当因为对于主键或唯一关键字出现重复关键字错误而造成插入失败时：
a. 从表中删除含有重复关键字值的冲突行
b. 再次尝试把新行插入到表中
 ]]></description>
			<content:encoded><![CDATA[ <p>MySQL Replace INTO说明</p>
<p style="padding: 0px; margin: 0px;">REPLACE的运行与INSERT很相像。只有一点除外，如果表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值，则在新记录被插入之前，旧记录被删除。请参见13.2.4节，“INSERT语法”。</p>
<p style="padding: 0px; margin: 0px;">注意，除非表有一个PRIMARY KEY或UNIQUE索引，否则，使用一个REPLACE语句没有意义。该语句会与INSERT相同，因为没有索引被用于确定是否新行复制了其它的行。</p>
<p style="padding: 0px; margin: 0px;">
<p style="padding: 0px; margin: 0px;">以下是所用算法的更详细的说明（该算法也用于LOAD DATA…REPLACE）：</p>
<p style="padding: 0px; margin: 0px;">1. 尝试把新行插入到表中</p>
<p style="padding: 0px; margin: 0px;">2. 当因为对于主键或唯一关键字出现重复关键字错误而造成插入失败时：</p>
<p style="padding: 0px; margin: 0px;">a. 从表中删除含有重复关键字值的冲突行</p>
<p style="padding: 0px; margin: 0px;">b. 再次尝试把新行插入到表中</p>
 ]]></content:encoded>
			<wfw:commentRss>http://www.tinoweb.cn/2010/06/17/mysql-replace-into/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>数据库设计Tool &#8211; DbWrench</title>
		<link>http://www.tinoweb.cn/2010/05/25/%e6%95%b0%e6%8d%ae%e5%ba%93%e8%ae%be%e8%ae%a1tool-dbwrench/</link>
		<comments>http://www.tinoweb.cn/2010/05/25/%e6%95%b0%e6%8d%ae%e5%ba%93%e8%ae%be%e8%ae%a1tool-dbwrench/#comments</comments>
		<pubDate>Tue, 25 May 2010 14:58:59 +0000</pubDate>
		<dc:creator>henson</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[DbWrench]]></category>
		<category><![CDATA[数据库工具]]></category>

		<guid isPermaLink="false">http://www.tinoweb.cn/?p=554</guid>
		<description><![CDATA[ 这周末要去下沙给学生，讲一个选课和课程系统，今天备课中，需要设计一个数据库，画一个diagram，在网上google了一圈,发现还是DbWrench最好。Free，Fast, Easy to use. 因为之前用过，功能及实用性方面都不错，当然功能性跟PowerDesigner是没法比，但对于小型的项目，根本没有必要动用PD这样的大工具，用这个短小精悍的DbWrench就OK了。
首先我们来看下DbWrench官网的介绍：
1. Simple to Learn, Easy to Use
2. Create Entity Relation Diagrams (ERDs)
3. Forward Engineer New Databases
4. Reverse Engineer Existing Databases
5. Synchronize your databases and designs in either direction
6. Advanced SQL Query Editor
7. Cross Platform Support
跨平台，支持Windows, Linux, Mac操作系统及 Microsoft SQL Server, MySQL, PostgreSQL数据库系统
OK，下面上图，来个更直观：（点击图片，查看大图）
官方网站： http://www.dbwrench.com
 ]]></description>
			<content:encoded><![CDATA[ <p>这周末要去下沙给学生，讲一个选课和课程系统，今天备课中，需要设计一个数据库，画一个diagram，在网上google了一圈,发现还是DbWrench最好。Free，Fast, Easy to use. 因为之前用过，功能及实用性方面都不错，当然功能性跟PowerDesigner是没法比，但对于小型的项目，根本没有必要动用PD这样的大工具，用这个短小精悍的DbWrench就OK了。</p>
<p>首先我们来看下DbWrench官网的介绍：<br />
1. Simple to Learn, Easy to Use<br />
2. Create Entity Relation Diagrams (ERDs)<br />
3. Forward Engineer New Databases<br />
4. Reverse Engineer Existing Databases<br />
5. Synchronize your databases and designs in either direction<br />
6. Advanced SQL Query Editor<br />
7. Cross Platform Support</p>
<p>跨平台，支持Windows, Linux, Mac操作系统及 Microsoft SQL Server, MySQL, PostgreSQL数据库系统</p>
<p>OK，下面上图，来个更直观：（点击图片，查看大图）</p>
<p>官方网站： http://www.dbwrench.com</p>

<a href='http://www.tinoweb.cn/2010/05/25/%e6%95%b0%e6%8d%ae%e5%ba%93%e8%ae%be%e8%ae%a1tool-dbwrench/mac_for_eng/' title='mac_for_DbWrench'><img width="150" height="150" src="http://www.tinoweb.cn/wp-content/uploads/2010/05/mac_for_eng-150x150.png" class="attachment-thumbnail" alt="" title="mac_for_DbWrench" /></a>
<a href='http://www.tinoweb.cn/2010/05/25/%e6%95%b0%e6%8d%ae%e5%ba%93%e8%ae%be%e8%ae%a1tool-dbwrench/xp_exp_v163_b/' title='DbWrench'><img width="150" height="150" src="http://www.tinoweb.cn/wp-content/uploads/2010/05/xp_exp_v163_b-150x150.png" class="attachment-thumbnail" alt="" title="DbWrench" /></a>

 ]]></content:encoded>
			<wfw:commentRss>http://www.tinoweb.cn/2010/05/25/%e6%95%b0%e6%8d%ae%e5%ba%93%e8%ae%be%e8%ae%a1tool-dbwrench/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2010.05.22  Google Doodle</title>
		<link>http://www.tinoweb.cn/2010/05/23/2010-05-22-google-doodle/</link>
		<comments>http://www.tinoweb.cn/2010/05/23/2010-05-22-google-doodle/#comments</comments>
		<pubDate>Sat, 22 May 2010 17:36:26 +0000</pubDate>
		<dc:creator>henson</dc:creator>
				<category><![CDATA[Google]]></category>

		<guid isPermaLink="false">http://www.tinoweb.cn/?p=541</guid>
		<description><![CDATA[ In Japan on May 22, 1980, Pac-Man was released &#8211; which is now, although it is May 21st here in USA. To celebrate the 30th anniversary of Pac Man, Google has their first ever playable and interactive logo. Here is a picture of Google.com today:

 ]]></description>
			<content:encoded><![CDATA[ <p>In Japan on May 22, 1980, Pac-Man was released &#8211; which is now, although it is May 21st here in USA. To celebrate the 30th anniversary of Pac Man, Google has their first ever playable and interactive logo. Here is a picture of Google.com today:</p>
<p style="text-align: center;"><img class="size-full wp-image-545 aligncenter" title="Google Doodle" src="http://www.tinoweb.cn/wp-content/uploads/2010/05/4626485351_ff46b10863.jpg" alt="Google Doodle" width="500" height="222" /></p>
 ]]></content:encoded>
			<wfw:commentRss>http://www.tinoweb.cn/2010/05/23/2010-05-22-google-doodle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Base64编码</title>
		<link>http://www.tinoweb.cn/2010/03/22/base64%e7%bc%96%e7%a0%81/</link>
		<comments>http://www.tinoweb.cn/2010/03/22/base64%e7%bc%96%e7%a0%81/#comments</comments>
		<pubDate>Mon, 22 Mar 2010 15:18:24 +0000</pubDate>
		<dc:creator>henson</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.tinoweb.cn/?p=531</guid>
		<description><![CDATA[ 什么是Base64？
按照RFC2045的定义，Base64被定义为：Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。（The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.）
Base64编码详解
Base64 编码要求把3个8位字节（3*8=24）转化为4个6位的字节（4*6=24），之后在6位的前面补两个0，形成8位一个字节的形式。
具体转化形式间下图：
字符串&#8221;小李&#8221;，GBK的中文编码是D0A1 C0EE，转化成字节为
11010000 10100001 11000000 11101110
再把8位转为6位
00110100 00001010 00000111 00000000 00111011 00100000
可以这么考虑：把8位的字节连成一串 11010000101000011100000011101110
然后每次顺序选6个出来之后再把这6二进制数前面再添加两个0，就成了一个新的字节。之后再选出6个来，再添加0，依此类推，直到30个二进制数被选，剩下两个怎么办呢，前面照旧补两个0，后面不够6位的，全部用0补全。
让我们来看看实际结果：
字符串&#8221;小李&#8221;
11010000 HEX:D0 10100001 HEX:A1 11000000 HEX:C0 11101110 HEX:EE 
00110100 00001010 00000111 00000000 00111011 00100000
十进制52 十进制10 十进制7 十进制0 十进制59 十进制32
Base64有其自身的编码表：
The Base64 Alphabet
Value   Encoding
0 [...]]]></description>
			<content:encoded><![CDATA[ <p><strong>什么是Base64？</strong><br />
按照RFC2045的定义，Base64被定义为：Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。（The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.）</p>
<p><strong>Base64编码详解</strong><br />
Base64 编码要求把3个8位字节（3*8=24）转化为4个6位的字节（4*6=24），之后在6位的前面补两个0，形成8位一个字节的形式。<br />
具体转化形式间下图：<br />
字符串&#8221;小李&#8221;，GBK的中文编码是D0A1 C0EE，转化成字节为<br />
11010000 10100001 11000000 11101110</p>
<p>再把8位转为6位<br />
00110100 00001010 00000111 00000000 00111011 00100000</p>
<p>可以这么考虑：把8位的字节连成一串 11010000101000011100000011101110<br />
然后每次顺序选6个出来之后再把这6二进制数前面再添加两个0，就成了一个新的字节。之后再选出6个来，再添加0，依此类推，直到30个二进制数被选，剩下两个怎么办呢，前面照旧补两个0，后面不够6位的，全部用0补全。</p>
<p>让我们来看看实际结果：<br />
字符串&#8221;小李&#8221;<br />
11010000 HEX:D0 10100001 HEX:A1 11000000 HEX:C0 11101110 HEX:EE </p>
<p>00110100 00001010 00000111 00000000 00111011 00100000</p>
<p>十进制52 十进制10 十进制7 十进制0 十进制59 十进制32</p>
<p>Base64有其自身的编码表：</p>
<p><strong>The Base64 Alphabet</strong><br />
Value   Encoding<br />
0 A<br />
1 B<br />
2 C<br />
3 D<br />
4 E<br />
5 F<br />
6 G<br />
7 H<br />
8 I<br />
9 J<br />
10 K<br />
11 L<br />
12 M<br />
13 N<br />
14 O<br />
15 P<br />
16 Q<br />
17 R<br />
18 S<br />
19 T<br />
20 U<br />
21 V<br />
22 W<br />
23 X<br />
24 Y<br />
25 Z<br />
26 a<br />
27 b<br />
28 c<br />
29 d<br />
30 e<br />
31 f<br />
32 g<br />
33 h<br />
34 i<br />
35 j<br />
36 k<br />
37 l<br />
38 m<br />
39 n<br />
40 o<br />
41 p<br />
42 q<br />
43 r<br />
44 s<br />
45 t<br />
46 u<br />
47 v<br />
48 w<br />
49 x<br />
50 y<br />
51 z<br />
52 0<br />
53 1<br />
54 2<br />
55 3<br />
56 4<br />
57 5<br />
58 6<br />
59 7<br />
60 8<br />
61 9<br />
62 +<br />
63 /<br />
(pad)=</p>
<p>这也是 Base64名称的由来，而Base64编码的结果不是根据算法把编码变为高两位是0而低6为代表数据，而是变为了上表的形式。表中，编码的编号对应的是得出的新字节的十进制值。因此，从表2可以得到对应的Base64编码：</p>
<p>字符串&#8221;小李&#8221;<br />
11010000 HEX:D0 10100001 HEX:A1 11000000 HEX:C0 11101110 HEX:EE </p>
<p>00110100 00001010 00000111 00000000 00111011 00100000<br />
十进制52 十进制10 十进制7 十进制0 十进制59 十进制32</p>
<p>这样，字符串&#8221;小李&#8221;经过编码后就成了字符串&#8221;0KHA7g&#8221;了。<br />
Base64将3个字节转变为4个字节，因此，编码后的代码量（以字节为单位，下同）约比编码前的代码量多了 1/3。之所以说是“约”，是因为如果代码量正好是3的整数倍，那么自然是多了1/3。但如果不是呢？<br />
细心的人可能已经注意到了，在The Base64 Alphabet中的最后一个有一个(pad) =字符。这个字符的目的就是用来处理这个问题的。<br />
当代码量不是3的整数倍时，代码量/3的余数自然就是2或者1。转换的时候，结果不够6位的用0来补上相应的位置，之后再在6位的前面补两个0。转换完空出的结果就用就用“=”来补位。譬如结果上面的例子&#8221;小李&#8221;,就不够3的整数，所以用0来补整6个数，再在前面加两个0.</p>
<p>这样，最后的缺少的2个字节用=不上，所以&#8221;小张&#8221;的base64_encode就是&#8221;0KHA7g==&#8221;。</p>
 ]]></content:encoded>
			<wfw:commentRss>http://www.tinoweb.cn/2010/03/22/base64%e7%bc%96%e7%a0%81/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL数据库性能优化的几个关键参数</title>
		<link>http://www.tinoweb.cn/2010/03/17/mysql%e6%95%b0%e6%8d%ae%e5%ba%93%e6%80%a7%e8%83%bd%e4%bc%98%e5%8c%96%e7%9a%84%e5%87%a0%e4%b8%aa%e5%85%b3%e9%94%ae%e5%8f%82%e6%95%b0/</link>
		<comments>http://www.tinoweb.cn/2010/03/17/mysql%e6%95%b0%e6%8d%ae%e5%ba%93%e6%80%a7%e8%83%bd%e4%bc%98%e5%8c%96%e7%9a%84%e5%87%a0%e4%b8%aa%e5%85%b3%e9%94%ae%e5%8f%82%e6%95%b0/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 07:42:49 +0000</pubDate>
		<dc:creator>henson</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.tinoweb.cn/?p=527</guid>
		<description><![CDATA[ 关键参数一：back_log
要求 MySQL 能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求，这就起作用，然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。
back_log 值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接，你需要增加它，换句话说，这值 对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。 试图设定back_log高于你的操作系统的限制将是无效的。
当你观察你的主机进程列表，发现大量 264084 &#124; unauthenticated user &#124; xxx.xxx.xxx.xxx &#124; NULL &#124; Connect &#124; NULL &#124; login &#124; NULL 的待连接进程时，就要加大 back_log 的值了。默认数值是50，我把它改为500。
关键参数二：interactive_timeout
服务器在关闭它前在一个交互连接上等待行动的秒数。一个交互的客户被定义为对 mysql_real_connect()使用 CLIENT_INTERACTIVE 选项的客户。 默认数值是28800，我把它改为7200。
关键参数三：key_buffer_size
索引块是缓冲的并且被所有的线程共享。key_buffer_size是用于索引块的缓冲区大小，增加它可得到更好处理的索引(对所有读和多重写)，到你 能负担得起那样多。如果你使它太大，系统将开始换页并且真的变慢了。默认数值是8388600(8M)，我的MySQL主机有2GB内存，所以我把它改为 402649088(400MB)。
关键参数四：max_connections
允许的同时客户的数量。增加该值增加 mysqld 要求的文件描述符的数量。这个数字应该增加，否则，你将经常看到 Too many connections 错误。 默认数值是100，我把它改为1024 。
关键参数五：record_buffer
每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描，你可能想要增加该值。默认数值是 131072(128K)，我把它改为16773120 (16M)
关键参数六：sort_buffer
每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。默认数值是2097144(2M)，我把它改为 16777208 (16M)。
关键参数七：table_cache
为所有线程打开表的数量。增加该值能增加mysqld要求的文件描述符的数量。MySQL对每个唯一打开的表需要2个文件描述符。默认数值是64，我把它改为512。
关键参数八：thread_cache_size
可以复用的保存在中的线程的数量。如果有，新的线程从缓存中取得，当断开连接的时候如果有空间，客户的线置在缓存中。如果有很多新的线程，为了提高性能可 以这个变量值。通过比较 Connections 和 Threads_created 状态的变量，可以看到这个变量的作用。我把它设置为 80。
关键参数九：wait_timeout
服务器在关闭它之前在一个连接上等待行动的秒数。 默认数值是28800，我把它改为7200。
注：参数的调整可以通过修改 /etc/my.cnf 文件并重启 [...]]]></description>
			<content:encoded><![CDATA[ <p><strong>关键参数一：back_log</strong><br />
要求 MySQL 能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求，这就起作用，然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。</p>
<p>back_log 值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接，你需要增加它，换句话说，这值 对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。 试图设定back_log高于你的操作系统的限制将是无效的。</p>
<p>当你观察你的主机进程列表，发现大量 264084 | unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待连接进程时，就要加大 back_log 的值了。默认数值是50，我把它改为500。</p>
<p><strong>关键参数二：interactive_timeout</strong><br />
服务器在关闭它前在一个交互连接上等待行动的秒数。一个交互的客户被定义为对 mysql_real_connect()使用 CLIENT_INTERACTIVE 选项的客户。 默认数值是28800，我把它改为7200。</p>
<p><strong>关键参数三：key_buffer_size</strong><br />
索引块是缓冲的并且被所有的线程共享。key_buffer_size是用于索引块的缓冲区大小，增加它可得到更好处理的索引(对所有读和多重写)，到你 能负担得起那样多。如果你使它太大，系统将开始换页并且真的变慢了。默认数值是8388600(8M)，我的MySQL主机有2GB内存，所以我把它改为 402649088(400MB)。</p>
<p><strong>关键参数四：max_connections</strong><br />
允许的同时客户的数量。增加该值增加 mysqld 要求的文件描述符的数量。这个数字应该增加，否则，你将经常看到 Too many connections 错误。 默认数值是100，我把它改为1024 。</p>
<p><strong>关键参数五：record_buffer</strong><br />
每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描，你可能想要增加该值。默认数值是 131072(128K)，我把它改为16773120 (16M)</p>
<p><strong>关键参数六：sort_buffer</strong><br />
每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。默认数值是2097144(2M)，我把它改为 16777208 (16M)。</p>
<p><strong>关键参数七：table_cache</strong><br />
为所有线程打开表的数量。增加该值能增加mysqld要求的文件描述符的数量。MySQL对每个唯一打开的表需要2个文件描述符。默认数值是64，我把它改为512。</p>
<p><strong>关键参数八：thread_cache_size</strong><br />
可以复用的保存在中的线程的数量。如果有，新的线程从缓存中取得，当断开连接的时候如果有空间，客户的线置在缓存中。如果有很多新的线程，为了提高性能可 以这个变量值。通过比较 Connections 和 Threads_created 状态的变量，可以看到这个变量的作用。我把它设置为 80。</p>
<p><strong>关键参数九：wait_timeout</strong><br />
服务器在关闭它之前在一个连接上等待行动的秒数。 默认数值是28800，我把它改为7200。</p>
<p>注：参数的调整可以通过修改 /etc/my.cnf 文件并重启 MySQL 实现。</p>
 ]]></content:encoded>
			<wfw:commentRss>http://www.tinoweb.cn/2010/03/17/mysql%e6%95%b0%e6%8d%ae%e5%ba%93%e6%80%a7%e8%83%bd%e4%bc%98%e5%8c%96%e7%9a%84%e5%87%a0%e4%b8%aa%e5%85%b3%e9%94%ae%e5%8f%82%e6%95%b0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
