<?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>北漂IT民工的博客 &#187; 编程技术</title>
	<atom:link href="http://www.3gcnbeta.com/wordpress/category/%e7%bc%96%e7%a8%8b%e6%8a%80%e6%9c%af/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.3gcnbeta.com/wordpress</link>
	<description>北漂IT民工的博客</description>
	<lastBuildDate>Tue, 18 Oct 2011 08:20:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Android的getSharedPreferences所具备的坑爹行为</title>
		<link>http://www.3gcnbeta.com/wordpress/2011/08/27/android%e7%9a%84getsharedpreferences%e6%89%80%e5%85%b7%e5%a4%87%e7%9a%84%e5%9d%91%e7%88%b9%e8%a1%8c%e4%b8%ba/</link>
		<comments>http://www.3gcnbeta.com/wordpress/2011/08/27/android%e7%9a%84getsharedpreferences%e6%89%80%e5%85%b7%e5%a4%87%e7%9a%84%e5%9d%91%e7%88%b9%e8%a1%8c%e4%b8%ba/#comments</comments>
		<pubDate>Sat, 27 Aug 2011 04:01:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://www.3gcnbeta.com/wordpress/?p=1470</guid>
		<description><![CDATA[坑爹的SharedPreferences 现象描述： 通过提供给js的接口来读取存在SharedPreferences里的字符串。 在JS里调用接口读出来一个字符: abc  = &#8216;abc&#8217;; 在js里执行: abc == &#8216;abc&#8217; 返回true 然后用 switch(abc) { case &#8216;abc&#8217;: //  这里永远进不去 break; } 如果先执行一下: abc = “” + abc 前面的switch就能进去。 坑爹！ &#160;]]></description>
			<content:encoded><![CDATA[<p>坑爹的SharedPreferences</p>
<p>现象描述：</p>
<p>通过提供给js的接口来读取存在SharedPreferences里的字符串。</p>
<p>在JS里调用接口读出来一个字符:</p>
<p>abc  = &#8216;abc&#8217;;</p>
<p>在js里执行:</p>
<p>abc == &#8216;abc&#8217;</p>
<p>返回true</p>
<p>然后用</p>
<p>switch(abc)</p>
<p>{</p>
<p>case &#8216;abc&#8217;:</p>
<p>//  这里永远进不去</p>
<p>break;</p>
<p>}</p>
<p>如果先执行一下:</p>
<p>abc = “” + abc</p>
<p>前面的switch就能进去。</p>
<p>坑爹！</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3gcnbeta.com/wordpress/2011/08/27/android%e7%9a%84getsharedpreferences%e6%89%80%e5%85%b7%e5%a4%87%e7%9a%84%e5%9d%91%e7%88%b9%e8%a1%8c%e4%b8%ba/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nginx 下WordPress是配置,包括子目录时的配置</title>
		<link>http://www.3gcnbeta.com/wordpress/2011/05/17/nginx-%e4%b8%8bwordpress%e6%98%af%e9%85%8d%e7%bd%ae%e5%8c%85%e6%8b%ac%e5%ad%90%e7%9b%ae%e5%bd%95%e6%97%b6%e7%9a%84%e9%85%8d%e7%bd%ae/</link>
		<comments>http://www.3gcnbeta.com/wordpress/2011/05/17/nginx-%e4%b8%8bwordpress%e6%98%af%e9%85%8d%e7%bd%ae%e5%8c%85%e6%8b%ac%e5%ad%90%e7%9b%ae%e5%bd%95%e6%97%b6%e7%9a%84%e9%85%8d%e7%bd%ae/#comments</comments>
		<pubDate>Tue, 17 May 2011 06:04:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[wordpress]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[Woredpress]]></category>

		<guid isPermaLink="false">http://www.3gcnbeta.com/wordpress/?p=1462</guid>
		<description><![CDATA[在你的其他配置项基础之上还需要添加下面的代码: server { #用于管理界面的处理 rewrite /wp-admin$ $scheme://$host$uri/ permanent; location / { #/wordpress是你的子目录名字,没有子目录就可以不用写 try_files $uri /wordpress$uri/ /wordpress/index.php?q=uri&#38;$args; } }]]></description>
			<content:encoded><![CDATA[<p>在你的其他配置项基础之上还需要添加下面的代码:</p>
<p>server {</p>
<p>#用于管理界面的处理<br />
rewrite /wp-admin$ $scheme://$host$uri/ permanent;</p>
<p>location / {</p>
<p>#/wordpress是你的子目录名字,没有子目录就可以不用写<br />
try_files $uri /wordpress$uri/ /wordpress/index.php?q=uri&amp;$args;<br />
}<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3gcnbeta.com/wordpress/2011/05/17/nginx-%e4%b8%8bwordpress%e6%98%af%e9%85%8d%e7%bd%ae%e5%8c%85%e6%8b%ac%e5%ad%90%e7%9b%ae%e5%bd%95%e6%97%b6%e7%9a%84%e9%85%8d%e7%bd%ae/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>对权限管理系统的一些思考</title>
		<link>http://www.3gcnbeta.com/wordpress/2011/03/08/%e5%af%b9%e6%9d%83%e9%99%90%e7%ae%a1%e7%90%86%e7%b3%bb%e7%bb%9f%e7%9a%84%e4%b8%80%e4%ba%9b%e6%80%9d%e8%80%83/</link>
		<comments>http://www.3gcnbeta.com/wordpress/2011/03/08/%e5%af%b9%e6%9d%83%e9%99%90%e7%ae%a1%e7%90%86%e7%b3%bb%e7%bb%9f%e7%9a%84%e4%b8%80%e4%ba%9b%e6%80%9d%e8%80%83/#comments</comments>
		<pubDate>Tue, 08 Mar 2011 09:47:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[WEB服务器技术]]></category>

		<guid isPermaLink="false">http://www.3gcnbeta.com/wordpress/?p=1443</guid>
		<description><![CDATA[权限系统的设计看上去是一个比较复杂的设计。目前还没有非常明确并取得共识的系统设计方案。 下面主要是根据我对权限管理系统的理解进行一个系统设计方案的分析。 首先，权限的设置是围绕着人展开的，而人可以分成多种角色，而这些角色可以是位于不同的组织内。 这样我们就可以很自然感觉到：人，角色，组织都是跟权限相关的。 我们再进一步的思考，会发现一个权限系统主要考查的问题是： 谁在什么地方，对什么东西进行了什么操作。 (如果更复杂的话，还可以包含时限信息，等其它前件） 因为主要考虑的是人可以做什么，所以主要的包括的点是这几个。 简单一下，要点是四个： 谁， 地方， 东西， 操作。 所以我们要分析这些要件分别可能是什么，并且他们之间是什么关系。 谁，是一个执行者，那可能是一个用户，一个管理员，一个后台的编辑，也可能是一个特定的人群。因些谁我们至少可以用：用户，角色，组来将他们表示出来。 而用户可以用组与角色来组织起来。假设组是一种树状的垂直组织，那么角色就可以是一种平面的组织。因此他们是有必要共存的一种用户分类方式。 那么这些用户相关的分类应该如何组织起来的呢？ 就是涉及到了一些功能性的模块系统，比如用户管理系统，组织架构管理系统，员工管理系统。 通过组织架构管理系统，可以将用户与某些组织有效的组织起来。 但是一旦到了一个系统中，那么就必须要有一个资源的分配权限。 而资源一般都是跟一些结构，频道之类的东西相关的。 比如在组织架构管理系统里，组织本身就是一个资源，他包含创建，删除，更新组织的基本功能，还需要包含添加组成员，组长，副组长都角色的功能。 而这个组织本身又是这个组织结构的节点。 他本身会具有位置的信息，就是上面提到的地方的概念。 而组织的节点可以是一个人组成，也可以是一些角色组织。 如果管理层可能包含CEO，CFO，COO等等，只要给定了这个组织下的角色权限，那么不管指定谁是CEO，他就会具有CEO的权力。 所以我们可以得出来对于权限的管理，至少应该得到下面的几项关键数据： 组织架构/模块， 组织架构/模块的节点， 用户/角色， 用户/角色的标志符， 资源的类型， 资源的标志， 资源的动作标识 那么对应的，组织架构及其节点是我们所说的地方，用户/角色是我们所说的人，资源就是东西，动作标识是干什么。 这样就基本上定义了一个权限。 通过这种形式对权限进行组织，可以实现一个组织下，用户的权限非常细致的控制。 当然实现起来也会相对比较麻烦。 因为权限还会有一定的承继关系，用户，角色，组织权限的优先级关系，都会涉及到。 一般情况下，只要对一个用户设定组权限就可以了。 但是通过角色或者用户的特有权限设置，可以达到很精确的控制。]]></description>
			<content:encoded><![CDATA[<p>权限系统的设计看上去是一个比较复杂的设计。目前还没有非常明确并取得共识的系统设计方案。<br />
下面主要是根据我对权限管理系统的理解进行一个系统设计方案的分析。<br />
首先，权限的设置是围绕着人展开的，而人可以分成多种角色，而这些角色可以是位于不同的组织内。<br />
这样我们就可以很自然感觉到：人，角色，组织都是跟权限相关的。<br />
我们再进一步的思考，会发现一个权限系统主要考查的问题是：<br />
谁在什么地方，对什么东西进行了什么操作。 (如果更复杂的话，还可以包含时限信息，等其它前件）</p>
<p>因为主要考虑的是人可以做什么，所以主要的包括的点是这几个。<br />
简单一下，要点是四个： 谁， 地方， 东西， 操作。<br />
所以我们要分析这些要件分别可能是什么，并且他们之间是什么关系。<br />
谁，是一个执行者，那可能是一个用户，一个管理员，一个后台的编辑，也可能是一个特定的人群。因些谁我们至少可以用：用户，角色，组来将他们表示出来。<br />
而用户可以用组与角色来组织起来。假设组是一种树状的垂直组织，那么角色就可以是一种平面的组织。因此他们是有必要共存的一种用户分类方式。</p>
<p>那么这些用户相关的分类应该如何组织起来的呢？</p>
<p>就是涉及到了一些功能性的模块系统，比如用户管理系统，组织架构管理系统，员工管理系统。</p>
<p>通过组织架构管理系统，可以将用户与某些组织有效的组织起来。<br />
但是一旦到了一个系统中，那么就必须要有一个资源的分配权限。</p>
<p>而资源一般都是跟一些结构，频道之类的东西相关的。</p>
<p>比如在组织架构管理系统里，组织本身就是一个资源，他包含创建，删除，更新组织的基本功能，还需要包含添加组成员，组长，副组长都角色的功能。</p>
<p>而这个组织本身又是这个组织结构的节点。</p>
<p>他本身会具有位置的信息，就是上面提到的地方的概念。</p>
<p>而组织的节点可以是一个人组成，也可以是一些角色组织。</p>
<p>如果管理层可能包含CEO，CFO，COO等等，只要给定了这个组织下的角色权限，那么不管指定谁是CEO，他就会具有CEO的权力。</p>
<p>所以我们可以得出来对于权限的管理，至少应该得到下面的几项关键数据：<br />
组织架构/模块， 组织架构/模块的节点， 用户/角色， 用户/角色的标志符， 资源的类型， 资源的标志， 资源的动作标识</p>
<p>那么对应的，组织架构及其节点是我们所说的地方，用户/角色是我们所说的人，资源就是东西，动作标识是干什么。</p>
<p>这样就基本上定义了一个权限。</p>
<p>通过这种形式对权限进行组织，可以实现一个组织下，用户的权限非常细致的控制。</p>
<p>当然实现起来也会相对比较麻烦。</p>
<p>因为权限还会有一定的承继关系，用户，角色，组织权限的优先级关系，都会涉及到。</p>
<p>一般情况下，只要对一个用户设定组权限就可以了。</p>
<p>但是通过角色或者用户的特有权限设置，可以达到很精确的控制。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3gcnbeta.com/wordpress/2011/03/08/%e5%af%b9%e6%9d%83%e9%99%90%e7%ae%a1%e7%90%86%e7%b3%bb%e7%bb%9f%e7%9a%84%e4%b8%80%e4%ba%9b%e6%80%9d%e8%80%83/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>__autoload + singleton 改进思路</title>
		<link>http://www.3gcnbeta.com/wordpress/2011/02/28/__autoload-singleton-%e6%94%b9%e8%bf%9b%e6%80%9d%e8%b7%af/</link>
		<comments>http://www.3gcnbeta.com/wordpress/2011/02/28/__autoload-singleton-%e6%94%b9%e8%bf%9b%e6%80%9d%e8%b7%af/#comments</comments>
		<pubDate>Mon, 28 Feb 2011 11:24:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[WEB服务器技术]]></category>

		<guid isPermaLink="false">http://www.3gcnbeta.com/wordpress/?p=1440</guid>
		<description><![CDATA[看到公司的Singleton实例很痛苦的每次都实现一个instance函数。我感觉很麻烦。 下面我基于减少instance函数的观点出发，做一个实验。 目标是用以实现一个可以省掉重复定义函数的基类。 下面是我的代码 文件组织： /home/eric/phptest/ &#124;-Application.php &#124;-index.php &#124;-Session.php `-Singleton.php 1. Singleton文件： 所有Singleton的基类 &#60;?php abstract class Singleton { static private $instances = array(); public static function getIntance($class) { if(!array_key_exists($class, self::$instances) &#124;&#124; !isset(self::$instances[$class])) { self::$instances[$class] = new $class(); } return self::$instances[$class]; } abstract public function instance(); }; ?&#62; 2. 两个Singleton模式类的测试文件： a) Session.php &#60;?php class Session extends [...]]]></description>
			<content:encoded><![CDATA[<p>看到公司的Singleton实例很痛苦的每次都实现一个instance函数。我感觉很麻烦。</p>
<p>下面我基于减少instance函数的观点出发，做一个实验。</p>
<p>目标是用以实现一个可以省掉重复定义函数的基类。</p>
<p>下面是我的代码</p>
<div id="_mcePaste">文件组织：</div>
<div id="_mcePaste">/home/eric/phptest/</div>
<div id="_mcePaste">|-Application.php</div>
<div id="_mcePaste">|-index.php</div>
<div id="_mcePaste">|-Session.php</div>
<div id="_mcePaste">`-Singleton.php</div>
<div></div>
<div id="_mcePaste">1. Singleton文件：</div>
<div id="_mcePaste">所有Singleton的基类</div>
<div id="_mcePaste">&lt;?php</div>
<div id="_mcePaste">abstract class Singleton {</div>
<div id="_mcePaste">static private $instances = array();</div>
<div id="_mcePaste">public static function getIntance($class) {</div>
<div id="_mcePaste">if(!array_key_exists($class, self::$instances) || !isset(self::$instances[$class])) {</div>
<div id="_mcePaste">self::$instances[$class] = new $class();</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">return self::$instances[$class];</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">abstract public function instance();</div>
<div id="_mcePaste">};</div>
<div id="_mcePaste">?&gt;</div>
<div id="_mcePaste">2. 两个Singleton模式类的测试文件：</div>
<div id="_mcePaste">a) Session.php</div>
<div id="_mcePaste">&lt;?php</div>
<div id="_mcePaste">class Session extends Singleton {</div>
<div id="_mcePaste">public function instance() {</div>
<div id="_mcePaste">return self::getIntance(__CLASS__);</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">?&gt;</div>
<div id="_mcePaste">b) Application.php</div>
<div id="_mcePaste">&lt;?php</div>
<div id="_mcePaste">class Application extends Singleton {</div>
<div id="_mcePaste">public function instance() {</div>
<div id="_mcePaste">return self::getIntance(__CLASS__);</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">?&gt;</div>
<div></div>
<div id="_mcePaste">3. __autoload函数文件：</div>
<div id="_mcePaste">&lt;?php</div>
<div id="_mcePaste">function __autoload($class) {</div>
<div id="_mcePaste">include $class . “.php”;</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">var_dump(Session::instance());</div>
<div id="_mcePaste">var_dump(Application::instance());</div>
<div id="_mcePaste">?&gt;</div>
<div></div>
<div id="_mcePaste">4.返回结果：</div>
<div id="_mcePaste">object(Session)#1 (0) {</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">object(Application)#2 (0) {</div>
<div id="_mcePaste">}</div>
<div></div>
<div id="_mcePaste">5.成功。</div>
<div id="_mcePaste"></div>
<div>说明：</div>
<div id="_mcePaste">通过定义Singleton父类与利用__autoload来简化一下Singleton子类的实现方式</div>
<div id="_mcePaste">当然我们还是可以不将Singleton写成是抽象类的。</div>
<div id="_mcePaste">直接通过getInstance处传入类名来实现。</div>
<div id="_mcePaste">这样就可以方便子类的实现。不需要每个类都定义一个相同的函数 instance();</div>
]]></content:encoded>
			<wfw:commentRss>http://www.3gcnbeta.com/wordpress/2011/02/28/__autoload-singleton-%e6%94%b9%e8%bf%9b%e6%80%9d%e8%b7%af/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google App Engine Channel API 初体验</title>
		<link>http://www.3gcnbeta.com/wordpress/2010/12/18/google-app-engine-channel-api-%e5%88%9d%e4%bd%93%e9%aa%8c/</link>
		<comments>http://www.3gcnbeta.com/wordpress/2010/12/18/google-app-engine-channel-api-%e5%88%9d%e4%bd%93%e9%aa%8c/#comments</comments>
		<pubDate>Sat, 18 Dec 2010 12:18:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[WEB前沿]]></category>
		<category><![CDATA[Comet]]></category>
		<category><![CDATA[Google App Engine]]></category>

		<guid isPermaLink="false">http://www.3gcnbeta.com/wordpress/?p=1436</guid>
		<description><![CDATA[1. channel api的id分成key与channel api channel api是给客户端的，对于服务器没有什么用。 而key是服务器端的，服务器只要有key就可以了 流程大约是这样 a)创建 key = md5(str).hexdigest() #要限制在64位以内 channel_id = channel.create_channel(key) b) 然后 channel.send_message(key, message) 发送消息 c) 在客户端的注意点是message发出去后，在javascript端也是一个对象。 内容需要通过得到的对象data.data来得到发送的字符串。 2. 在SDK上并没有使用comet技术，而是使用了polling,不断的从服务器取数据。 3. channel api 现在没有状态，无法知道如何客户端是不是已经断开。]]></description>
			<content:encoded><![CDATA[<p>1. channel api的id分成key与channel api<br />
channel api是给客户端的，对于服务器没有什么用。<br />
而key是服务器端的，服务器只要有key就可以了</p>
<p>流程大约是这样<br />
a)创建<br />
key = md5(str).hexdigest()    #要限制在64位以内<br />
channel_id = channel.create_channel(key)<br />
b)<br />
然后<br />
channel.send_message(key, message) 发送消息<br />
c)<br />
在客户端的注意点是message发出去后，在javascript端也是一个对象。<br />
内容需要通过得到的对象data.data来得到发送的字符串。</p>
<p>2. 在SDK上并没有使用comet技术，而是使用了polling,不断的从服务器取数据。</p>
<p>3. channel api 现在没有状态，无法知道如何客户端是不是已经断开。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3gcnbeta.com/wordpress/2010/12/18/google-app-engine-channel-api-%e5%88%9d%e4%bd%93%e9%aa%8c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>javascript  字符转化成整数</title>
		<link>http://www.3gcnbeta.com/wordpress/2010/12/05/javascript-%e5%ad%97%e7%ac%a6%e8%bd%ac%e5%8c%96%e6%88%90%e6%95%b4%e6%95%b0/</link>
		<comments>http://www.3gcnbeta.com/wordpress/2010/12/05/javascript-%e5%ad%97%e7%ac%a6%e8%bd%ac%e5%8c%96%e6%88%90%e6%95%b4%e6%95%b0/#comments</comments>
		<pubDate>Sun, 05 Dec 2010 07:44:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.3gcnbeta.com/wordpress/?p=1427</guid>
		<description><![CDATA[1. 使用函数parseInt将字符串转化成整数 2.转化成整数的规则 a) 字符开头是整数，节取开头的数字： var num = parseInt(&#8217;300day&#8217;);  //结果是300 b) 开头不是整数，返回NaN（英文Not a Number的缩写，表示不是数字） var num = parseInt(&#8216;apple&#8217;); //结果是NaN c) 能识别字面量的八进制与十六进制 var num = parseInt(&#8217;0xF&#8217;);  //结果是15 var num = parseInt(&#8217;034&#8242;); //结果是28,而不是34 d)无法识别小数点 var num = parseInt(&#8216;.5&#8242;); //结果是NaN var num = parseInt(&#8217;2.5&#8242;); //结果是2 f)可以指定字符串的基数（默认是10） var num = parseInt(&#8216;ab&#8217;); //结果是NaN var num = parseInt(&#8216;ab&#8217;, 16); //结果是171]]></description>
			<content:encoded><![CDATA[<p>1. 使用函数parseInt将字符串转化成整数</p>
<p>2.转化成整数的规则</p>
<p>a) 字符开头是整数，节取开头的数字：</p>
<p>var num = parseInt(&#8217;300day&#8217;);  //结果是300</p>
<p>b) 开头不是整数，返回NaN（英文Not a Number的缩写，表示不是数字）</p>
<p>var num = parseInt(&#8216;apple&#8217;); //结果是NaN</p>
<p>c) 能识别字面量的八进制与十六进制</p>
<p>var num = parseInt(&#8217;0xF&#8217;);  //结果是15</p>
<p>var num = parseInt(&#8217;034&#8242;); //结果是28,而不是34</p>
<p>d)无法识别小数点</p>
<p>var num = parseInt(&#8216;.5&#8242;); //结果是NaN</p>
<p>var num = parseInt(&#8217;2.5&#8242;); //结果是2</p>
<p>f)可以指定字符串的基数（默认是10）</p>
<p>var num = parseInt(&#8216;ab&#8217;); //结果是NaN</p>
<p>var num = parseInt(&#8216;ab&#8217;, 16); //结果是171</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3gcnbeta.com/wordpress/2010/12/05/javascript-%e5%ad%97%e7%ac%a6%e8%bd%ac%e5%8c%96%e6%88%90%e6%95%b4%e6%95%b0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Appengine 非本机访问测试</title>
		<link>http://www.3gcnbeta.com/wordpress/2010/12/04/appengine-%e9%9d%9e%e6%9c%ac%e6%9c%ba%e8%ae%bf%e9%97%ae%e6%b5%8b%e8%af%95/</link>
		<comments>http://www.3gcnbeta.com/wordpress/2010/12/04/appengine-%e9%9d%9e%e6%9c%ac%e6%9c%ba%e8%ae%bf%e9%97%ae%e6%b5%8b%e8%af%95/#comments</comments>
		<pubDate>Sat, 04 Dec 2010 04:40:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[WEB服务器技术]]></category>
		<category><![CDATA[Google App Engine]]></category>

		<guid isPermaLink="false">http://www.3gcnbeta.com/wordpress/?p=1425</guid>
		<description><![CDATA[App Engine （Python)在本地测试运行时， 默认绑定了localhost 所以当你想要通过虚拟机或者其它机器访问你的程序时就会出问题无法访问的情况。 其实只要有点IP基础知识的人就可以想到将IP换成是0.0.0.0就可以让服务与IP无关。 所以我们可以在运行时加上以下的参数： &#8211;address=0.0.0.0 这样就可以让不同的IP都能访问到。 当然也可以添加成： &#8211;address=192.168.1.1 仅限于局域网内访问。 总之只要你对IP绑定的原理有一些了解就可以帮助你更好的完成测试。]]></description>
			<content:encoded><![CDATA[<p>App Engine （Python)在本地测试运行时， 默认绑定了localhost 所以当你想要通过虚拟机或者其它机器访问你的程序时就会出问题无法访问的情况。</p>
<p>其实只要有点IP基础知识的人就可以想到将IP换成是0.0.0.0就可以让服务与IP无关。</p>
<p>所以我们可以在运行时加上以下的参数：</p>
<p>&#8211;address=0.0.0.0</p>
<p>这样就可以让不同的IP都能访问到。</p>
<p>当然也可以添加成：</p>
<p>&#8211;address=192.168.1.1</p>
<p>仅限于局域网内访问。</p>
<p>总之只要你对IP绑定的原理有一些了解就可以帮助你更好的完成测试。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3gcnbeta.com/wordpress/2010/12/04/appengine-%e9%9d%9e%e6%9c%ac%e6%9c%ba%e8%ae%bf%e9%97%ae%e6%b5%8b%e8%af%95/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python的缩进引起的BUG</title>
		<link>http://www.3gcnbeta.com/wordpress/2010/12/03/python%e7%9a%84%e7%bc%a9%e8%bf%9b%e5%bc%95%e8%b5%b7%e7%9a%84bug/</link>
		<comments>http://www.3gcnbeta.com/wordpress/2010/12/03/python%e7%9a%84%e7%bc%a9%e8%bf%9b%e5%bc%95%e8%b5%b7%e7%9a%84bug/#comments</comments>
		<pubDate>Fri, 03 Dec 2010 06:57:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.3gcnbeta.com/wordpress/?p=1415</guid>
		<description><![CDATA[if module == 'modify': user = self.getUser() temp = { 'name': user.username, 'contact': user.contact, 'email': user.email, 'intro': user.intro } self.display('user_modify.html', temp) return 当我把 temp的}向外移动两格后，后面添加的两行竟然同样可以执行。 导致了一些莫名其妙的结果。。 而这个if又是写在最后的。 python的缩进，永远的话题!]]></description>
			<content:encoded><![CDATA[<pre name="code" class="py">
      if module == 'modify':
        user = self.getUser()
        temp = {
        'name': user.username,
        'contact': user.contact,
        'email': user.email,
        'intro': user.intro
      }
      self.display('user_modify.html', temp)
      return
</pre>
<p>当我把 temp的}向外移动两格后，后面添加的两行竟然同样可以执行。<br />
导致了一些莫名其妙的结果。。<br />
而这个if又是写在最后的。<br />
python的缩进，永远的话题!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3gcnbeta.com/wordpress/2010/12/03/python%e7%9a%84%e7%bc%a9%e8%bf%9b%e5%bc%95%e8%b5%b7%e7%9a%84bug/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>网络编程中Socket与HTTP，TCP，UDP的区别</title>
		<link>http://www.3gcnbeta.com/wordpress/2010/10/22/%e7%bd%91%e7%bb%9c%e7%bc%96%e7%a8%8b%e4%b8%adsocket%e4%b8%8ehttp%ef%bc%8ctcp%ef%bc%8cudp%e7%9a%84%e5%8c%ba%e5%88%ab/</link>
		<comments>http://www.3gcnbeta.com/wordpress/2010/10/22/%e7%bd%91%e7%bb%9c%e7%bc%96%e7%a8%8b%e4%b8%adsocket%e4%b8%8ehttp%ef%bc%8ctcp%ef%bc%8cudp%e7%9a%84%e5%8c%ba%e5%88%ab/#comments</comments>
		<pubDate>Fri, 22 Oct 2010 01:33:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[WEB服务器技术]]></category>

		<guid isPermaLink="false">http://www.3gcnbeta.com/wordpress/?p=1404</guid>
		<description><![CDATA[Socket的英文意思是插座。 就是有几个孔的固定的插座。 用电器插入后就能得到电能提供他所能提供的服务了。 对应到网络上，Socket（插座）里包含了你所启动的服务（类似于插座对应的电能），而孔就是所对应的端口。 通过端口，客户端就可以访问你所提供的服务。 当然客户端要找到你的服务，在TCP/IP协议族下通常的办法是通过IP协议来得到。 所以Socket是网络协议连接所使用的一种方式，不是协议。 HTTP，TCP，UDP都是一种协议。 TCP,UDP都是基于Socket的连接方式的协议。 所以讲Socket编程基本就是指用TCP/UDP进行编程。 但是这是一种不明确的说法。 要明确讲就要用TCP/UDP/HTTP。 Socket是大部分语言对TCP/UDP封装时所使用的名字。 如果不明确他的意义，将很容易造成困扰。 比如很多程序员以为Socket编程就是TCP编程。 如果不是很明确，可以到国外的论坛上看看。 理解Socket的明确含义。]]></description>
			<content:encoded><![CDATA[<p>Socket的英文意思是插座。</p>
<p>就是有几个孔的固定的插座。</p>
<p>用电器插入后就能得到电能提供他所能提供的服务了。</p>
<p>对应到网络上，Socket（插座）里包含了你所启动的服务（类似于插座对应的电能），而孔就是所对应的端口。</p>
<p>通过端口，客户端就可以访问你所提供的服务。</p>
<p>当然客户端要找到你的服务，在TCP/IP协议族下通常的办法是通过IP协议来得到。</p>
<p>所以Socket是网络协议连接所使用的一种方式，不是协议。</p>
<p>HTTP，TCP，UDP都是一种协议。</p>
<p>TCP,UDP都是基于Socket的连接方式的协议。</p>
<p>所以讲Socket编程基本就是指用TCP/UDP进行编程。</p>
<p>但是这是一种不明确的说法。</p>
<p>要明确讲就要用TCP/UDP/HTTP。</p>
<p>Socket是大部分语言对TCP/UDP封装时所使用的名字。</p>
<p>如果不明确他的意义，将很容易造成困扰。</p>
<p>比如很多程序员以为Socket编程就是TCP编程。</p>
<p>如果不是很明确，可以到国外的论坛上看看。</p>
<p>理解Socket的明确含义。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3gcnbeta.com/wordpress/2010/10/22/%e7%bd%91%e7%bb%9c%e7%bc%96%e7%a8%8b%e4%b8%adsocket%e4%b8%8ehttp%ef%bc%8ctcp%ef%bc%8cudp%e7%9a%84%e5%8c%ba%e5%88%ab/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drupal 菜单的读取方法</title>
		<link>http://www.3gcnbeta.com/wordpress/2010/10/08/drupal-%e8%8f%9c%e5%8d%95%e7%9a%84%e8%af%bb%e5%8f%96%e6%96%b9%e6%b3%95/</link>
		<comments>http://www.3gcnbeta.com/wordpress/2010/10/08/drupal-%e8%8f%9c%e5%8d%95%e7%9a%84%e8%af%bb%e5%8f%96%e6%96%b9%e6%b3%95/#comments</comments>
		<pubDate>Fri, 08 Oct 2010 07:22:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[drupal]]></category>
		<category><![CDATA[WEB服务器技术]]></category>

		<guid isPermaLink="false">http://www.3gcnbeta.com/wordpress/?p=1396</guid>
		<description><![CDATA[1. 通过menu_tree_all_data来读取相应的菜单项 primary-links来读取基本菜单。 也可以读取自定义的菜单。 2. 通过$m['below']来得到是不是有子菜单 &#60;ul&#62; &#60;?php $i = 0; $menuItems = menu_tree_all_data(&#8216;primary-links&#8217;); foreach($menuItems as $key =&#62; $m): ?&#62; &#60;li&#62; &#60;?php $href = drupal_get_path_alias($m['link']['link_path']); $newhref = $href == &#8216;/&#8217; ? $href : &#8216;/&#8217; . $href; $isactive = is_active_menu($newhref); if ($isactive) { print “&#60;a href=&#8217;” . $dir . $href . “&#8216; id=&#8217;navbar$i&#8217; class=&#8217;hover&#8217; onmouseover=\”showMenu(&#8216;navbar$i&#8217;, &#8216;subnav$i&#8217;)\” [...]]]></description>
			<content:encoded><![CDATA[<p>1. 通过menu_tree_all_data来读取相应的菜单项<br />
primary-links来读取基本菜单。<br />
也可以读取自定义的菜单。<br />
2. 通过$m['below']来得到是不是有子菜单</p>
<div id="_mcePaste">&lt;ul&gt;</div>
<div id="_mcePaste">&lt;?php</div>
<div id="_mcePaste">$i = 0;</div>
<div id="_mcePaste">$menuItems = menu_tree_all_data(&#8216;primary-links&#8217;);</div>
<div id="_mcePaste">foreach($menuItems as $key =&gt; $m):</div>
<div id="_mcePaste">?&gt;</div>
<div id="_mcePaste">&lt;li&gt;</div>
<div id="_mcePaste">&lt;?php</div>
<div id="_mcePaste">$href = drupal_get_path_alias($m['link']['link_path']);</div>
<div id="_mcePaste">$newhref = $href == &#8216;/&#8217; ? $href : &#8216;/&#8217; . $href;</div>
<div id="_mcePaste">$isactive = is_active_menu($newhref);</div>
<div id="_mcePaste">if ($isactive) {</div>
<div id="_mcePaste">print “&lt;a href=&#8217;” . $dir . $href . “&#8216; id=&#8217;navbar$i&#8217; class=&#8217;hover&#8217; onmouseover=\”showMenu(&#8216;navbar$i&#8217;, &#8216;subnav$i&#8217;)\” onFocus=\”this.blur()\”&gt;&lt;!&#8211;{$m['link']['title']}&#8211;&gt;&lt;/a&gt;”;</div>
<div id="_mcePaste">} else {</div>
<div id="_mcePaste">print “&lt;a href=&#8217;” . $dir . $href . “&#8216; id=&#8217;navbar$i&#8217; onmouseover=\”showMenu(&#8216;navbar$i&#8217;, &#8216;subnav$i&#8217;)\” onFocus=\”this.blur()\”&gt;&lt;!&#8211;{$m['link']['title']}&#8211;&gt;&lt;/a&gt;”;</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">if ($isactive) {</div>
<div id="_mcePaste">$cursubmenu = $m['below'];</div>
<div id="_mcePaste">$cursubmenunode = $m;</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">if ($m['below']) {</div>
<div id="_mcePaste">?&gt;</div>
<div id="_mcePaste">&lt;div id=”subnav&lt;?php echo $i?&gt;” &gt;</div>
<div id="_mcePaste">&lt;p&gt;.&lt;/p&gt;</div>
<div id="_mcePaste">&lt;p&gt;</div>
<div id="_mcePaste">&lt;span style=”width: 200px”&gt;</div>
<div id="_mcePaste">&lt;?php</div>
<div id="_mcePaste">foreach($m['below'] as $k =&gt; $v) {</div>
<div id="_mcePaste">$a = $dir . drupal_get_path_alias($v['link']['link_path']);</div>
<div id="_mcePaste">echo “&lt;a href=\”$a\”&gt;{$v['link']['title']}&lt;/a&gt;&lt;br /&gt;”;</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">?&gt;</div>
<div id="_mcePaste">&lt;/span&gt;</div>
<div id="_mcePaste">&lt;/p&gt;</div>
<div id="_mcePaste">&lt;/div&gt;</div>
<div id="_mcePaste">&lt;?php</div>
<div id="_mcePaste">}</div>
<div id="_mcePaste">$i++;</div>
<div id="_mcePaste">?&gt;</div>
<div id="_mcePaste">&lt;/li&gt;</div>
<div id="_mcePaste">&lt;?php endforeach; ?&gt;</div>
<div id="_mcePaste">&lt;/ul&gt;</div>
]]></content:encoded>
			<wfw:commentRss>http://www.3gcnbeta.com/wordpress/2010/10/08/drupal-%e8%8f%9c%e5%8d%95%e7%9a%84%e8%af%bb%e5%8f%96%e6%96%b9%e6%b3%95/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>javascript提取HTML页面内容</title>
		<link>http://www.3gcnbeta.com/wordpress/2010/09/30/javascript%e6%8f%90%e5%8f%96html%e9%a1%b5%e9%9d%a2%e5%86%85%e5%ae%b9/</link>
		<comments>http://www.3gcnbeta.com/wordpress/2010/09/30/javascript%e6%8f%90%e5%8f%96html%e9%a1%b5%e9%9d%a2%e5%86%85%e5%ae%b9/#comments</comments>
		<pubDate>Thu, 30 Sep 2010 05:57:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[WEB前端技术]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.3gcnbeta.com/wordpress/?p=1389</guid>
		<description><![CDATA[今天同事有一个用javascript提取的HTML页面的内容的需求。 经过一段时间的试验。 得到下面的代码。 能提取出来相应的HTML标签内的内容。 var reg = /]*?>([^>^]*?>/g; var res = '&#038;nbsp123456'.replace(reg, "$1,"); console.log(res); 结果: “&#038;nbsp,1,2,3,4,5,6,”]]></description>
			<content:encoded><![CDATA[<p>今天同事有一个用javascript提取的HTML页面的内容的需求。<br />
经过一段时间的试验。<br />
得到下面的代码。<br />
能提取出来相应的HTML标签内的内容。</p>
<pre name="code" class="js">
var reg = /<[^>]*?>([^>^<]+)<[^>]*?\/+[^>]*?>/g;
var res = '<a href="forum-10-1.html" class="prev">&#038;nbsp</a><a href="forum-10-1.html">1</a><strong>2</strong><a href="forum-10-3.html">3</a><a href="forum-10-4.html">4</a><a href="forum-10-5.html">5</a><a href="forum-10-6.html">6</a>'.replace(reg, "$1,");
console.log(res);
</pre>
<p>结果:<br />
“&#038;nbsp,1,2,3,4,5,6,”</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3gcnbeta.com/wordpress/2010/09/30/javascript%e6%8f%90%e5%8f%96html%e9%a1%b5%e9%9d%a2%e5%86%85%e5%ae%b9/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>阻塞与非阻塞, 异步与同步分别表示什么含义?</title>
		<link>http://www.3gcnbeta.com/wordpress/2010/09/21/%e9%98%bb%e5%a1%9e%e4%b8%8e%e9%9d%9e%e9%98%bb%e5%a1%9e-%e5%bc%82%e6%ad%a5%e4%b8%8e%e5%90%8c%e6%ad%a5%e5%88%86%e5%88%ab%e8%a1%a8%e7%a4%ba%e4%bb%80%e4%b9%88%e5%90%ab%e4%b9%89/</link>
		<comments>http://www.3gcnbeta.com/wordpress/2010/09/21/%e9%98%bb%e5%a1%9e%e4%b8%8e%e9%9d%9e%e9%98%bb%e5%a1%9e-%e5%bc%82%e6%ad%a5%e4%b8%8e%e5%90%8c%e6%ad%a5%e5%88%86%e5%88%ab%e8%a1%a8%e7%a4%ba%e4%bb%80%e4%b9%88%e5%90%ab%e4%b9%89/#comments</comments>
		<pubDate>Tue, 21 Sep 2010 05:53:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[WEB服务器技术]]></category>

		<guid isPermaLink="false">http://www.3gcnbeta.com/wordpress/?p=1381</guid>
		<description><![CDATA[阻塞与非阻塞是相对于某个操作对OS的进程或者线程的影响来讲的, 阻塞是指某个操作因为使用同步方式会导致进程的阻塞. 非阻塞是指某个操作因为使用异步方式不会导致进程的阻塞. 同步与异步是指某个操作的返回性质来讲的. 同步是指某个操作必须执行完成后才会返回. 异步是指某个操作立即返回,然后再去执行. 同步不一定导到阻塞,只有同步操作的对象是互斥对象时,才会发生阻塞.]]></description>
			<content:encoded><![CDATA[<p>阻塞与非阻塞是相对于某个操作对OS的进程或者线程的影响来讲的,<br />
    阻塞是指某个操作因为使用同步方式会导致进程的阻塞.<br />
    非阻塞是指某个操作因为使用异步方式不会导致进程的阻塞.<br />
同步与异步是指某个操作的返回性质来讲的.<br />
    同步是指某个操作必须执行完成后才会返回.<br />
    异步是指某个操作立即返回,然后再去执行.<br />
同步不一定导到阻塞,只有同步操作的对象是互斥对象时,才会发生阻塞.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3gcnbeta.com/wordpress/2010/09/21/%e9%98%bb%e5%a1%9e%e4%b8%8e%e9%9d%9e%e9%98%bb%e5%a1%9e-%e5%bc%82%e6%ad%a5%e4%b8%8e%e5%90%8c%e6%ad%a5%e5%88%86%e5%88%ab%e8%a1%a8%e7%a4%ba%e4%bb%80%e4%b9%88%e5%90%ab%e4%b9%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>drupal menu_tree_page_data 和 menu_tree_all_data的区别</title>
		<link>http://www.3gcnbeta.com/wordpress/2010/09/14/drupal-menu_tree_page_data-%e5%92%8c-menu_tree_all_data%e7%9a%84%e5%8c%ba%e5%88%ab/</link>
		<comments>http://www.3gcnbeta.com/wordpress/2010/09/14/drupal-menu_tree_page_data-%e5%92%8c-menu_tree_all_data%e7%9a%84%e5%8c%ba%e5%88%ab/#comments</comments>
		<pubDate>Tue, 14 Sep 2010 09:05:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[drupal]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.3gcnbeta.com/wordpress/?p=1376</guid>
		<description><![CDATA[menu_tree_page_data and menu_tree_all_data的区别是后者能将所有的菜单信息都取出来. 而前者不能. 前者只能取出当前的活动的菜单的内容.]]></description>
			<content:encoded><![CDATA[<p>menu_tree_page_data and menu_tree_all_data的区别是后者能将所有的菜单信息都取出来.<br />
而前者不能.<br />
前者只能取出当前的活动的菜单的内容.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3gcnbeta.com/wordpress/2010/09/14/drupal-menu_tree_page_data-%e5%92%8c-menu_tree_all_data%e7%9a%84%e5%8c%ba%e5%88%ab/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drupal 6 管理员密码重置</title>
		<link>http://www.3gcnbeta.com/wordpress/2010/09/10/drupal-6-%e7%ae%a1%e7%90%86%e5%91%98%e5%af%86%e7%a0%81%e9%87%8d%e7%bd%ae/</link>
		<comments>http://www.3gcnbeta.com/wordpress/2010/09/10/drupal-6-%e7%ae%a1%e7%90%86%e5%91%98%e5%af%86%e7%a0%81%e9%87%8d%e7%bd%ae/#comments</comments>
		<pubDate>Fri, 10 Sep 2010 04:51:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[WEB应用]]></category>
		<category><![CDATA[Drupal]]></category>

		<guid isPermaLink="false">http://www.3gcnbeta.com/wordpress/?p=1363</guid>
		<description><![CDATA[需要有对数据库的管理权限: 然后调用下面的代码: UPDATE users SET pass = md5(‘newpassword’) WHERE uid = 1; &#60;/pre&#62;]]></description>
			<content:encoded><![CDATA[<p>需要有对数据库的管理权限:</p>
<p>然后调用下面的代码:</p>
<pre class=”code” name=”sql”>
UPDATE users SET pass = md5(‘newpassword’) WHERE uid = 1;
</pre>
<p>&lt;/pre&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3gcnbeta.com/wordpress/2010/09/10/drupal-6-%e7%ae%a1%e7%90%86%e5%91%98%e5%af%86%e7%a0%81%e9%87%8d%e7%bd%ae/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php里print,echo的区别?</title>
		<link>http://www.3gcnbeta.com/wordpress/2010/08/26/php%e9%87%8cprintecho%e7%9a%84%e5%8c%ba%e5%88%ab/</link>
		<comments>http://www.3gcnbeta.com/wordpress/2010/08/26/php%e9%87%8cprintecho%e7%9a%84%e5%8c%ba%e5%88%ab/#comments</comments>
		<pubDate>Thu, 26 Aug 2010 10:17:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.3gcnbeta.com/wordpress/?p=1361</guid>
		<description><![CDATA[1.首要明确print,echo都不是普通的函数,可以用function_exists函数测试 2.print, echo前者只能打印一个字符,而echo 可以打印多个 print  $a, $b是错误的,而 echo $a, $b是正确的 3.print会有返回值,但是echo没有返回值,性能略好一些]]></description>
			<content:encoded><![CDATA[<p>1.首要明确print,echo都不是普通的函数,可以用function_exists函数测试</p>
<p>2.print, echo前者只能打印一个字符,而echo 可以打印多个</p>
<p>print  $a, $b是错误的,而 echo $a, $b是正确的</p>
<p>3.print会有返回值,但是echo没有返回值,性能略好一些</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3gcnbeta.com/wordpress/2010/08/26/php%e9%87%8cprintecho%e7%9a%84%e5%8c%ba%e5%88%ab/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php语法函数</title>
		<link>http://www.3gcnbeta.com/wordpress/2010/08/26/php%e8%af%ad%e6%b3%95%e5%87%bd%e6%95%b0/</link>
		<comments>http://www.3gcnbeta.com/wordpress/2010/08/26/php%e8%af%ad%e6%b3%95%e5%87%bd%e6%95%b0/#comments</comments>
		<pubDate>Thu, 26 Aug 2010 03:54:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.3gcnbeta.com/wordpress/?p=1357</guid>
		<description><![CDATA[array()， echo()， empty()， eval()， exit()， isset()， list()， print() 和 unset()。]]></description>
			<content:encoded><![CDATA[<p><a href="function.array.html"><strong>array()</strong></a>， <a href="function.echo.html"><strong>echo()</strong></a>， <a href="function.empty.html"><strong>empty()</strong></a>， <a href="function.eval.html"><strong>eval()</strong></a>， <a href="function.exit.html"><strong>exit()</strong></a>， <a href="function.isset.html"><strong>isset()</strong></a>， <a href="function.list.html"><strong>list()</strong></a>， <a href="function.print.html"><strong>print()</strong></a> 和 <a href="function.unset.html"><strong>unset()</strong></a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3gcnbeta.com/wordpress/2010/08/26/php%e8%af%ad%e6%b3%95%e5%87%bd%e6%95%b0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>http的三种交互模式</title>
		<link>http://www.3gcnbeta.com/wordpress/2010/08/11/http%e7%9a%84%e4%b8%89%e7%a7%8d%e4%ba%a4%e4%ba%92%e6%a8%a1%e5%bc%8f/</link>
		<comments>http://www.3gcnbeta.com/wordpress/2010/08/11/http%e7%9a%84%e4%b8%89%e7%a7%8d%e4%ba%a4%e4%ba%92%e6%a8%a1%e5%bc%8f/#comments</comments>
		<pubDate>Wed, 11 Aug 2010 12:04:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[WEB前端技术]]></category>
		<category><![CDATA[WEB应用]]></category>
		<category><![CDATA[WEB服务器技术]]></category>

		<guid isPermaLink="false">http://www.3gcnbeta.com/wordpress/?p=1346</guid>
		<description><![CDATA[from: http://meteorserver.org/interaction-modes/ To stream data, a client initiates a request, the server&#8217;s response begins immediately, and continues indefinitely until the client closes the connection. This would seem to be the ideal method of interaction &#8211; events can be pushed out as they happen on a pre-established connection, the resources spent opening and closing sockets are [...]]]></description>
			<content:encoded><![CDATA[<p>from: <a href="http://meteorserver.org/interaction-modes/">http://meteorserver.org/interaction-modes/</a></p>
<p><img src="http://meteorserver.org/interaction-modes/stream.png" alt="Network traffic diagram demonstrating streaming" width="528" height="132" /></p>
<p>To stream data, a client initiates a request, the server&#8217;s response begins immediately, and continues indefinitely until the client closes the connection. This would seem to be the ideal method of interaction &#8211; events can be pushed out as they happen on a pre-established connection, the resources spent opening and closing sockets are minimised, and since the connection has already been negoitiated, no additional headers or wrapper content are required so the use of bandwidth is also very efficient.</p>
<p>The problems with streaming are evident when the connection is routed to, or via, hosts that are not willing to play ball with this style of interaction. First, web browsers often wait for the entire response to complete before processing it. Second, proxy servers often wait for a response to complete before passing it on to the client, so streaming connections may never get received.</p>
<p>On the server side there are issues as well. By having no timeout on connections, it&#8217;s possible for lots of zombie connections to slowly build up, particularly if the client has failed to disconnect but is no longer listening to the response. This is particularly the case with proxy caches that try to finish downloading files even when their client has disconencted, so that it&#8217;s cached for the next request. And even assuming no zombie connections, there is still the issue of conccurrency &#8211; thousands of open sockets with not very much happening on most of them at any given moment.</p>
<p>Overall, streaming connections are still a very compelling choice where the browser can cope with reading a partially downloaded response, and there are no buffers in the way.</p>
<p><img src="http://meteorserver.org/interaction-modes/shortpoll.png" alt="Network traffic diagram demonstrating short polling" width="528" height="132" /></p>
<p>Short polling cannot pretend to even emulate pushing data to the client, but it is one step up from refreshing an entire page. Using AJAX, the client connects to the server and requests new events. The server sends an immediate response containing the events that have occured since the client last requested an update, and closes the connection. The client waits a predetermined interval and initiates another request.</p>
<p>Using this method, client and server spent the majority of their time not connected to each other, with the regular periodic polling connections being answered and closed by the server within a few milliseconds. This reduces the number of concurrent connections required of the server, but if there are lots of subscribers and the updates being requested by each one require an expensive but repetitive backend operation (like a database query), the server can rapidly become overloaded doing unnecessary tasks over and over again. Meteor addresses this by storing the events in memory and answering polling requests directly from the memory cache, avoiding repetitive database or disk access. This means that even though Meteor is designed to deal with long-lived connections, it is still worth using for polling as well.</p>
<p>Short polling is the most reliable way of updating data that will generally survive most browser and connection setups, but it&#8217;s hardly ideal as it&#8217;s not particularly scalable and the client is by no means receiving updates as they happen.</p>
<p><img src="http://meteorserver.org/interaction-modes/longpoll.png" alt="Network traffic diagram demonstrating long polling" width="528" height="132" /></p>
<p>Sounds like it&#8217;s time for a happy middle ground between streaming and short polling, doesn&#8217;t it? Well, long polling may well fit the bill. The client initiates a request, and if the server has events pending, it sends them and closes the connection, much like short polling. But if the server does not have any events waiting, it holds the connection open until an event occurs, at which point it send the event and closes the connection. The client can then initiate a new connection immediately, since all the waiting is done at the server end.</p>
<p>The obvious benefit to this is that the client can treat the interaction as a simple &#8216;request-response&#8217; and wait for it to complete before processing it rather than having to sniff the response as it loads. It works through proxies and is more resilient to connections dropping. And since the server is actively closing connections all the time, the chance of long-lived zombie connections is much reduced. On the negative side, there is a need to create and close many more connections than for a stream, one for each event that is sent (but far fewer than for short polling, because the server no longer has the thankless task of responding to millions of repeated requests with “no updated events available”). Also events may be slightly delayed if they occur in rapid succession while the client is reinitiating a new connection after the last update.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3gcnbeta.com/wordpress/2010/08/11/http%e7%9a%84%e4%b8%89%e7%a7%8d%e4%ba%a4%e4%ba%92%e6%a8%a1%e5%bc%8f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>地图上进行多次GDirections的代码示例</title>
		<link>http://www.3gcnbeta.com/wordpress/2010/08/10/%e5%9c%b0%e5%9b%be%e4%b8%8a%e8%bf%9b%e8%a1%8c%e5%a4%9a%e6%ac%a1gdirections%e7%9a%84%e4%bb%a3%e7%a0%81%e7%a4%ba%e4%be%8b/</link>
		<comments>http://www.3gcnbeta.com/wordpress/2010/08/10/%e5%9c%b0%e5%9b%be%e4%b8%8a%e8%bf%9b%e8%a1%8c%e5%a4%9a%e6%ac%a1gdirections%e7%9a%84%e4%bb%a3%e7%a0%81%e7%a4%ba%e4%be%8b/#comments</comments>
		<pubDate>Tue, 10 Aug 2010 15:49:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.3gcnbeta.com/wordpress/?p=1344</guid>
		<description><![CDATA[http://ip13800.appspot.com/?act=geo]]></description>
			<content:encoded><![CDATA[<p>http://ip13800.appspot.com/?act=geo</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3gcnbeta.com/wordpress/2010/08/10/%e5%9c%b0%e5%9b%be%e4%b8%8a%e8%bf%9b%e8%a1%8c%e5%a4%9a%e6%ac%a1gdirections%e7%9a%84%e4%bb%a3%e7%a0%81%e7%a4%ba%e4%be%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>将tornado的模板用jinja2代替</title>
		<link>http://www.3gcnbeta.com/wordpress/2010/08/08/jinja2-%e5%9f%ba%e6%9c%ac%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95/</link>
		<comments>http://www.3gcnbeta.com/wordpress/2010/08/08/jinja2-%e5%9f%ba%e6%9c%ac%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95/#comments</comments>
		<pubDate>Sat, 07 Aug 2010 17:36:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[jinja2]]></category>
		<category><![CDATA[tornado]]></category>

		<guid isPermaLink="false">http://www.3gcnbeta.com/wordpress/?p=1298</guid>
		<description><![CDATA[tornado的模板对路径的支持不好。 在Windows平台下面就没有办法用了。 所以需要第三方的模板来支持，同时由于Django是python目前最流行的框架。 考虑到方便移植，我选择了jinja2。 这个与django类似的模板系统。 它的好处是不用象django那样需要将django的整个栈都加进来。 下面是它的基本使用方法： from jinja2 import Environment, FileSystemLoader _TEMPLATE_DIR_ = 'res/html' file = 'index.html' env = Environment(loader = FileSystemLoader(_TEMPLATE_DIR_)) template = env.get_template(file) content = template.render(params) 然后将content输出既可。 但这个时候还不行。 如果你使用了GBK的页面模板。 注:本人特别喜欢用GBK编码。 即使在UTF-8统一了很多程序员的思维的时期， 因为我坚信大部分的程序用UTF-8并没有意义， 除非他要支持多种语言， 但对于大部分WEB网站来讲， 支持多语言基本上是神话。 即使当你需要国际化时，转化也是相当容易的事情。 所以为什么不从GBK开始？ 一个更加轻量的编码。 言归正传，要支持GBK，你需要做一定的修改,代码如下： from jinja2 import Environment, FileSystemLoader _TEMPLATE_DIR_ = 'res/html' file = 'index.html' encoding = [...]]]></description>
			<content:encoded><![CDATA[<p>tornado的模板对路径的支持不好。<br />
在Windows平台下面就没有办法用了。<br />
所以需要第三方的模板来支持，同时由于Django是python目前最流行的框架。<br />
考虑到方便移植，我选择了jinja2。<br />
这个与django类似的模板系统。<br />
它的好处是不用象django那样需要将django的整个栈都加进来。<br />
下面是它的基本使用方法：</p>
<pre name="code" class="python">
from jinja2 import Environment, FileSystemLoader
_TEMPLATE_DIR_ = 'res/html'
file = 'index.html'

env = Environment(loader = FileSystemLoader(_TEMPLATE_DIR_))
template = env.get_template(file)
content = template.render(params)
</pre>
<p>然后将content输出既可。<br />
但这个时候还不行。<br />
如果你使用了GBK的页面模板。</p>
<p>注:本人特别喜欢用GBK编码。<br />
即使在UTF-8统一了很多程序员的思维的时期，<br />
因为我坚信大部分的程序用UTF-8并没有意义，<br />
除非他要支持多种语言，<br />
但对于大部分WEB网站来讲，<br />
支持多语言基本上是神话。<br />
即使当你需要国际化时，转化也是相当容易的事情。<br />
所以为什么不从GBK开始？<br />
一个更加轻量的编码。</p>
<p>言归正传，要支持GBK，你需要做一定的修改,代码如下：</p>
<pre name="code" class="python">
from jinja2 import Environment, FileSystemLoader
_TEMPLATE_DIR_ = 'res/html'
file = 'index.html'
encoding = 'gbk'
params = {}

env = Environment(loader = FileSystemLoader(_TEMPLATE_DIR_, encoding=encoding))
template = env.get_template(file) #这个时候的编辑又变成了内码（unicode）
content = template.render(params).encode(encoding)
</pre>
<p>这样就可以实现编码的统一了。<br />
当然其它保证HTTP各处的编码统一的事情我就不细说了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3gcnbeta.com/wordpress/2010/08/08/jinja2-%e5%9f%ba%e6%9c%ac%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>python 2.6 无法确定得到当前文件的路径</title>
		<link>http://www.3gcnbeta.com/wordpress/2010/08/05/python-2-6-%e6%97%a0%e6%b3%95%e7%a1%ae%e5%ae%9a%e5%be%97%e5%88%b0%e5%bd%93%e5%89%8d%e6%96%87%e4%bb%b6%e7%9a%84%e8%b7%af%e5%be%84/</link>
		<comments>http://www.3gcnbeta.com/wordpress/2010/08/05/python-2-6-%e6%97%a0%e6%b3%95%e7%a1%ae%e5%ae%9a%e5%be%97%e5%88%b0%e5%bd%93%e5%89%8d%e6%96%87%e4%bb%b6%e7%9a%84%e8%b7%af%e5%be%84/#comments</comments>
		<pubDate>Thu, 05 Aug 2010 08:03:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.3gcnbeta.com/wordpress/?p=1294</guid>
		<description><![CDATA[1. os.getcwd()跟当前的环境有关系。返回值并不一定是你想要的。 2. os.path.dirname(__file__)可能为空 3. 解决的办法是创建一个下级包，比如abc import abc path = os.path.dirname(abc.__file__) 这样可以得到包含 abc的路径。 去掉abc就可以得到当前执行文件的路径。 Linux下面可以这样实现： path = path[0:path.rfind('/')]]]></description>
			<content:encoded><![CDATA[<p>1. os.getcwd()跟当前的环境有关系。返回值并不一定是你想要的。<br />
2. os.path.dirname(__file__)可能为空<br />
3. 解决的办法是创建一个下级包，比如abc<br />
import abc<br />
path = os.path.dirname(abc.__file__)</p>
<p>这样可以得到包含 abc的路径。<br />
去掉abc就可以得到当前执行文件的路径。<br />
Linux下面可以这样实现：</p>
<p>path = path[0:path.rfind('/')]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.3gcnbeta.com/wordpress/2010/08/05/python-2-6-%e6%97%a0%e6%b3%95%e7%a1%ae%e5%ae%9a%e5%be%97%e5%88%b0%e5%bd%93%e5%89%8d%e6%96%87%e4%bb%b6%e7%9a%84%e8%b7%af%e5%be%84/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
