<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="/xsl/rss.xsl" type="text/xsl" media="screen"?>
<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:ppp="http://blog.sohu.com/rss/module/ppp/"
	>

	<channel>
		<title>二十四小时一秒钟</title>
		<link>http://1seconds.blog.sohu.com/</link>
		<description><![CDATA[有你的世界，二十四小时一秒钟，没你的世界，一秒钟二十四小时]]></description>
		<pubDate>Tue, 28 Aug 2007 16:48:33 +0800</pubDate>
		<generator>搜狐博客</generator>
		<ppp:ebi>a7c48e5792</ppp:ebi>
		<image>
			<title>http://blog.sohu.com</title>
			<url>http://js.pp.sohu.com/ppp/blog/images/common/logo_150_60.gif</url>
			<link>http://blog.sohu.com/</link>
			<width>100</width>
			<height>43</height>
			<description>搜狐博客</description>
		</image>
		<item>
			<title>五种常见的PHP设计模式</title>
			<link>http://1seconds.blog.sohu.com/61706884.html</link>
			<comments>http://1seconds.blog.sohu.com/61706884.html#comment</comments>
			<dc:creator>二十四小时一秒钟</dc:creator>
			<pubDate>Tue, 28 Aug 2007 16:48:33 +0800</pubDate>
			<category>我喜欢的盒子</category>
			<guid>http://1seconds.blog.sohu.com/61706884.html</guid>
			<description><![CDATA[<div><font color="#993300" size="5"><strong>五种常见的PHP设计模式</strong></font></div>
<div>
<div>
<div>
<p><br />设计模式只是为 <a href="#"><u><strong>Java</strong></u></a> 架构师准备的 &mdash;&mdash; 至少您可能一直这样认为。实际上，设计模式对于每个人都非常有用。如果这些工具不是 &ldquo;架构太空人&rdquo; 的专利，那么它们又是什么？为什么说它们在 <a href="#"><u><strong></strong></u>应用程序中非常有用？本文解释了这些问题。</a><a href="#"><u><strong>PHP</strong></u></a></p>
<p>设计模式 一书将设计模式引入<a href="#"><u><strong>软件</strong></u></a>社区，该书的作者是 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides Design（俗称 &ldquo;四人帮&rdquo;）。所介绍的设计模式背后的核心概念非常简单。经过多年的软件开发实践，Gamma 等人发现了某些具有固定设计的模式，就像建筑师设计房子和建筑物一样，可以为浴室的位置或厨房的构造方式开发模板。使用这些模板或者说设计模式 意味着可以更快地设计更好的建筑物。同样的概念也适用于软件。</p>
<p>设计模式不仅代表着更快开发健壮软件的有用方法，而且还提供了以友好的术语封装大型理念的方法。例如，您可以说您正在编写一个提供松散耦合的消息传递系统，也可以说你正在编写名称为观察者 的模式。</p>
<p>用较小的示例展示模式的价值是非常困难的。这往往有些大材小用的意味，因为模式实际上是在大型代码库中发挥作用的。本文不展示大型应用程序，所以您需要思索的是在您自己的大型应用程序中应用示例原理的方法 &mdash;&mdash; 而不是本文演示的代码本身。这不是说您不应该在小应用程序中使用模式。很多良好的应用程序都以小应用程序为起点，逐渐发展到大型应用程序，所以没有理由不以此类扎实的编码实践为基础。</p>
<p>既然您已经了解了设计模式以及它们的有用之处，现在我们来看看 PHP V5 的五种常用模式。</p>
<p><strong>工厂模式</strong></p>
<p>最初在设计模式 一书中，许多设计模式都鼓励使用松散耦合。要理解这个概念，让我们最好谈一下许多开发人员从事大型系统的艰苦历程。在更改一个代码片段时，就会发生问题，系统其他部分 &mdash;&mdash; 您曾认为完全不相关的部分中也有可能出现级联破坏。</p>
<p>该问题在于紧密耦合 。系统某个部分中的函数和类严重依赖于系统的其他部分中函数和类的行为和结构。您需要一组模式，使这些类能够相互通信，但不希望将它们紧密绑定在一起，以避免出现联锁。</p>
<p>在大型系统中，许多代码依赖于少数几个关键类。需要更改这些类时，可能会出现困难。例如，假设您有一个从文件读取的 User 类。您希望将其更改为从<a href="#"><u><strong>数据库</strong></u></a>读取的其他类，但是，所有的代码都引用从文件读取的原始类。这时候，使用工厂模式会很方便。</p>
<p>工厂模式 是一种类，它具有为您创建<a href="#"><u><strong>对象</strong></u></a>的某些方法。您可以使用工厂类创建对象，而不直接使用 new。这样，如果您想要更改所创建的对象类型，只需更改该工厂即可。使用该工厂的所有代码会自动更改。</p>
<p>清单 1 显示工厂类的一个示列。等式的服务器端包括两个部分：数据库和一组 PHP 页面，这些页面允许您添加反馈、请求反馈列表并获取与特定反馈相关的文章。</p>
<p><br /><strong>清单 1. Factory1.php</strong></p>
<p>&lt;?php<br />interface IUser<br />{<br />&nbsp; function getName();<br />}</p>
<p>class User implements IUser<br />{<br />&nbsp; public function __construct( $id ) { }</p>
<p>&nbsp; public function getName()<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; return &quot;Jack&quot;;<br />&nbsp; }<br />}</p>
<p>class UserFactory<br />{<br />&nbsp; public static function Create( $id )<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; return new User( $id );<br />&nbsp; }<br />}</p>
<p>$uo = UserFactory::Create( 1 );<br />echo( $uo-&gt;getName().&quot;\n&quot; );<br />?&gt;<br />&nbsp;</p>
<p>IUser 接口定义用户对象应执行什么操作。IUser 的实现称为 User，UserFactory 工厂类则创建 IUser 对象。此关系可以用图 1 中的 UML 表示。</p>
<p><a href="http://www.phpchina.com/batch.download.php?aid=613" target="_blank"><img alt="" src="http://www.phpchina.com/attachments/2006/11/20061103_844ea0852562927d725bea2b3c5b1b79.jpg" border="0" /></a><br />图 1. 工厂类及其相关 IUser 接口和用户类</p>
<p><br />如果您使用 php 解释器在命令行上运行此代码，将得到如下结果：</p>
<p>% php factory1.php <br />Jack<br />%<br />&nbsp;</p>
<p>测试代码会向工厂请求 User 对象，并输出 getName 方法的结果。</p>
<p>有一种工厂模式的变体使用工厂方法。类中的这些公共静态方法构造该类型的对象。如果创建此类型的对象非常重要，此方法非常有用。例如，假设您需要先创建对象，然后设置许多属性。此版本的工厂模式会将该进程封装在单个位置中，这样，不用复制复杂的初始化代码，也不必将复制好的代码在在代码库中到处粘贴。</p>
<p>清单 2 显示使用工厂方法的一个示例。</p>
<p><strong>清单 2. Factory2.php</strong></p>
<p>&lt;?php<br />interface IUser<br />{<br />&nbsp; function getName();<br />}</p>
<p>class User implements IUser<br />{<br />&nbsp; public static function Load( $id ) <br />&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new User( $id );<br />&nbsp; }</p>
<p>&nbsp; public static function Create( ) <br />&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new User( null );<br />&nbsp; }</p>
<p>&nbsp; public function __construct( $id ) { }</p>
<p>&nbsp; public function getName()<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; return &quot;Jack&quot;;<br />&nbsp; }<br />}</p>
<p>$uo = User::Load( 1 );<br />echo( $uo-&gt;getName().&quot;\n&quot; );<br />?&gt;<br />&nbsp;</p>
<p>这段代码要简单得多。它仅有一个接口 IUser 和一个实现此接口的 User 类。User 类有两个创建对象的静态方法。此关系可用图 2 中的 UML 表示。</p>
<p><a href="http://www.phpchina.com/batch.download.php?aid=614" target="_blank"><img alt="" src="http://www.phpchina.com/attachments/2006/11/20061103_c7c943bac8b082f368bc9c80a5ef9087.jpg" border="0" /></a><br />图 2. IUser 接口和带有工厂方法的 user 类<br />&nbsp;<br />在命令行中运行脚本产生的结果与清单 1 的结果相同，如下所示：</p>
<p>% php factory2.php <br />Jack<br />%<br />&nbsp;<br />如上所述，有时此类模式在规模较小的环境中似乎有些大材小用。不过，最好还是<a href="#"><u><strong>学习</strong></u></a>这种扎实的编码形式，以便应用于任意规模的项目中。</p>
<p><strong>单元素模式</strong></p>
<p>某些应用程序资源是独占的，因为有且只有一个此类型的资源。例如，通过数据库句柄到数据库的连接是独占的。您希望在应用程序中共享数据库句柄，因为在保持连接打开或关闭时，它是一种开销，在获取单个页面的过程中更是如此。</p>
<p>单元素模式可以满足此要求。如果应用程序每次包含且仅包含一个对象，那么这个对象就是一个单元素（Singleton）。清单 3 中的代码显示了 PHP V5 中的一个数据库连接单元素。</p>
<p><strong>清单 3. Singleton.php</strong></p>
<p>&lt;?php<br />require_once(&quot;DB.php&quot;);</p>
<p>class DatabaseConnection<br />{<br />&nbsp; public static function get()<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; static $db = null;<br />&nbsp;&nbsp;&nbsp; if ( $db == null )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $db = new DatabaseConnection();<br />&nbsp;&nbsp;&nbsp; return $db;<br />&nbsp; }</p>
<p>&nbsp; private $_handle = null;</p>
<p>&nbsp; private function __construct()<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; $dsn = 'mysql://root:password@localhost/photos';<br />&nbsp;&nbsp;&nbsp; $this-&gt;_handle =&amp; DB::Connect( $dsn, array() );<br />&nbsp; }<br />&nbsp; <br />&nbsp; public function handle()<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; return $this-&gt;_handle;<br />&nbsp; }<br />}</p>
<p>print( &quot;Handle = &quot;.DatabaseConnection::get()-&gt;handle().&quot;\n&quot; );<br />print( &quot;Handle = &quot;.DatabaseConnection::get()-&gt;handle().&quot;\n&quot; );<br />?&gt;<br />&nbsp;</p>
<p><br />此代码显示名为 DatabaseConnection 的单个类。您不能创建自已的 DatabaseConnection，因为构造函数是专用的。但使用静态 get 方法，您可以获得且仅获得一个 DatabaseConnection 对象。此代码的 UML 如图 3 所示。</p>
<p><a href="http://www.phpchina.com/batch.download.php?aid=616" target="_blank"><img alt="" src="http://www.phpchina.com/attachments/2006/11/20061103_1674043138616c9f14ca3c3fa274776a.jpg" border="0" /></a><br />图 3. 数据库连接单元素<br />&nbsp;<br />在两次调用间，handle 方法返回的数据库句柄是相同的，这就是最好的证明。您可以在命令行中运行代码来观察这一点。</p>
<p>% php singleton.php <br />Handle = Object id #3<br />Handle = Object id #3<br />%</p>
<p>返回的两个句柄是同一对象。如果您在整个应用程序中使用数据库连接单元素，那么就可以在任何地方重用同一句柄。</p>
<p>您可以使用全局变量存储数据库句柄，但是，该方法仅适用于较小的应用程序。在较大的应用程序中，应避免使用全局变量，并使用对象和方法访问资源。</p>
<p><strong>观察者模式</strong></p>
<p>观察者模式为您提供了避免组件之间紧密耦合的另一种方法。该模式非常简单：一个对象通过添加一个方法（该方法允许另一个对象，即观察者 注册自己）使本身变得可观察。当可观察的对象更改时，它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话，而不必了解原因。</p>
<p>一个简单示例是系统中的用户列表。清单 4 中的代码显示一个用户列表，添加用户时，它将发送出一条消息。添加用户时，通过发送消息的日志观察者可以观察此列表。</p>
<p><strong>清单 4. Observer.php</strong></p>
<p>&lt;?php<br />interface IObserver<br />{<br />&nbsp; function onChanged( $sender, $args );<br />}</p>
<p>interface IObservable<br />{<br />&nbsp; function addObserver( $observer );<br />}</p>
<p>class UserList implements IObservable<br />{<br />&nbsp; private $_observers = array();</p>
<p>&nbsp; public function addCustomer( $name )<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; foreach( $this-&gt;_observers as $obs )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $obs-&gt;onChanged( $this, $name );<br />&nbsp; }</p>
<p>&nbsp; public function addObserver( $observer )<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; $this-&gt;_observers []= $observer;<br />&nbsp; }<br />}</p>
<p>class UserListLogger implements IObserver<br />{<br />&nbsp; public function onChanged( $sender, $args )<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; echo( &quot;'$args' added to user list\n&quot; );<br />&nbsp; }<br />}</p>
<p>$ul = new UserList();<br />$ul-&gt;addObserver( new UserListLogger() );<br />$ul-&gt;addCustomer( &quot;Jack&quot; );<br />?&gt;<br />&nbsp;</p>
<p>此代码定义四个元素：两个接口和两个类。IObservable 接口定义可以被观察的对象，UserList 实现该接口，以便将本身注册为可观察。IObserver 列表定义要通过怎样的方法才能成为观察者，UserListLogger 实现 IObserver 接口。图 4 的 UML 中展示了这些元素。</p>
<p><a href="http://www.phpchina.com/batch.download.php?aid=616" target="_blank"><img alt="" src="http://www.phpchina.com/attachments/2006/11/20061103_1674043138616c9f14ca3c3fa274776a.jpg" border="0" /></a><br />图 4. 可观察的用户列表和用户列表事件日志程序<br />&nbsp;</p>
<p>如果在命令行中运行它，您将看到以下输出：</p>
<p>% php observer.php <br />'Jack' added to user list<br />%<br />&nbsp;</p>
<p>测试代码创建 UserList，并将 UserListLogger 观察者添加到其中。然后添加一个消费者，并将这一更改通知 UserListLogger。</p>
<p>认识到 UserList 不知道日志程序将执行什么操作很关键。可能存在一个或多个执行其他操作的侦听程序。例如，您可能有一个向新用户发送消息的观察者，欢迎新用户使用该系统。这种方法的价值在于 UserList 忽略所有依赖它的对象，它主要关注在列表更改时维护用户列表并发送消息这一工作。</p>
<p>此模式不限于内存中的对象。它是在较大的应用程序中使用的数据库驱动的消息查询系统的基础。</p>
<p><strong>命令链模式</strong></p>
<p>命令链 模式以松散耦合主题为基础，发送消息、命令和请求，或通过一组处理程序发送任意内容。每个处理程序都会自行判断自己能否处理请求。如果可以，该请求被处理，进程停止。您可以为系统添加或移除处理程序，而不影响其他处理程序。清单 5 显示了此模式的一个示例。</p>
<p><br /><strong>清单 5. Chain.php</strong></p>
<p>&lt;?php<br />interface ICommand<br />{<br />&nbsp; function onCommand( $name, $args );<br />}</p>
<p>class CommandChain<br />{<br />&nbsp; private $_commands = array();</p>
<p>&nbsp; public function addCommand( $cmd )<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; $this-&gt;_commands []= $cmd;<br />&nbsp; }</p>
<p>&nbsp; public function runCommand( $name, $args )<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; foreach( $this-&gt;_commands as $cmd )<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( $cmd-&gt;onCommand( $name, $args ) )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp; }<br />}</p>
<p>class UserCommand implements ICommand<br />{<br />&nbsp; public function onCommand( $name, $args )<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; if ( $name != 'addUser' ) return false;<br />&nbsp;&nbsp;&nbsp; echo( &quot;UserCommand handling 'addUser'\n&quot; );<br />&nbsp;&nbsp;&nbsp; return true;<br />&nbsp; }<br />}</p>
<p>class MailCommand implements ICommand<br />{<br />&nbsp; public function onCommand( $name, $args )<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; if ( $name != 'mail' ) return false;<br />&nbsp;&nbsp;&nbsp; echo( &quot;MailCommand handling 'mail'\n&quot; );<br />&nbsp;&nbsp;&nbsp; return true;<br />&nbsp; }<br />}</p>
<p>$cc = new CommandChain();<br />$cc-&gt;addCommand( new UserCommand() );<br />$cc-&gt;addCommand( new MailCommand() );<br />$cc-&gt;runCommand( 'addUser', null );<br />$cc-&gt;runCommand( 'mail', null );<br />?&gt;<br />&nbsp;</p>
<p><br />此代码定义维护 ICommand 对象列表的 CommandChain 类。两个类都可以实现 ICommand 接口 &mdash;&mdash; 一个对邮件的请求作出响应，另一个对添加用户作出响应。 图 5 给出了 UML。</p>
<p><a href="http://www.phpchina.com/batch.download.php?aid=617" target="_blank"><img alt="" src="http://www.phpchina.com/attachments/2006/11/20061103_5288f7b75fc9d015a2342b3739c22a4b.jpg" border="0" /></a><br />图 5. 命令链及其相关命令</p>
<p><br />如果您运行包含某些测试代码的脚本，则会得到以下输出：</p>
<p>% php chain.php <br />UserCommand handling 'addUser'<br />MailCommand handling 'mail'<br />%<br />&nbsp;<br />代码首先创建 CommandChain 对象，并为它添加两个命令对象的实例。然后运行两个命令以查看谁对这些命令作出了响应。如果命令的名称匹配 UserCommand 或 MailCommand，则代码失败，不发生任何操作。</p>
<p>为处理请求而创建可扩展的架构时，命令链模式很有价值，使用它可以解决许多问题。</p>
<p><strong>策略模式</strong></p>
<p>我们讲述的最后一个设计模式是策略 模式。在此模式中，算法是从复杂类提取的，因而可以方便地替换。例如，如果要更改搜索引擎中排列页的方法，则策略模式是一个不错的选择。思考一下搜索引擎的几个部分 &mdash;&mdash; 一部分遍历页面，一部分对每页排列，另一部分基于排列的结果排序。在复杂的示例中，这些部分都在同一个类中。通过使用策略模式，您可将排列部分放入另一个类中，以便更改页排列的方式，而不影响搜索引擎的其余代码。</p>
<p>作为一个较简单的示例，清单 6 显示了一个用户列表类，它提供了一个根据一组即插即用的策略查找一组用户的方法。 </p>
<p><br /><strong>清单 6. Strategy.php</strong></p>
<p>&lt;?php<br />interface IStrategy<br />{<br />&nbsp; function filter( $record );<br />}</p>
<p>class FindAfterStrategy implements IStrategy<br />{<br />&nbsp; private $_name;</p>
<p>&nbsp; public function __construct( $name )<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; $this-&gt;_name = $name;<br />&nbsp; }</p>
<p>&nbsp; public function filter( $record )<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; return strcmp( $this-&gt;_name, $record ) &lt;= 0;<br />&nbsp; }<br />}</p>
<p>class RandomStrategy implements IStrategy<br />{<br />&nbsp; public function filter( $record )<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; return rand( 0, 1 ) &gt;= 0.5;<br />&nbsp; }<br />}</p>
<p>class UserList<br />{<br />&nbsp; private $_list = array();</p>
<p>&nbsp; public function __construct( $names )<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; if ( $names != null )<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach( $names as $name )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $this-&gt;_list []= $name;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp; }</p>
<p>&nbsp; public function add( $name )<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; $this-&gt;_list []= $name;<br />&nbsp; }</p>
<p>&nbsp; public function find( $filter )<br />&nbsp; {<br />&nbsp;&nbsp;&nbsp; $recs = array();<br />&nbsp;&nbsp;&nbsp; foreach( $this-&gt;_list as $user )<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( $filter-&gt;filter( $user ) )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $recs []= $user;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return $recs;<br />&nbsp; }<br />}</p>
<p>$ul = new UserList( array( &quot;Andy&quot;, &quot;Jack&quot;, &quot;Lori&quot;, &quot;Megan&quot; ) );<br />$f1 = $ul-&gt;find( new FindAfterStrategy( &quot;J&quot; ) );<br />print_r( $f1 );</p>
<p>$f2 = $ul-&gt;find( new RandomStrategy() );<br />print_r( $f2 );<br />?&gt;<br />&nbsp;</p>
<p><a href="http://www.phpchina.com/batch.download.php?aid=618" target="_blank"><img alt="" src="http://www.phpchina.com/attachments/2006/11/20061103_55383c011e4be9b709d6cb3023b21b50.jpg" border="0" /></a></p>
<p>图 6. 用户列表和用于选择用户的策略</p>
<p>UserList 类是打包名称数组的一个包装器。它实现 find 方法，该方法利用几个策略之一来选择这些名称的子集。这些策略由 IStrategy 接口定义，该接口有两个实现：一个随机选择用户，另一个根据指定名称选择其后的所有名称。运行测试代码时，将得到以下输出：</p>
<p>% php strategy.php <br />Array<br />(<br />&nbsp;&nbsp;&nbsp; [0] =&gt; Jack<br />&nbsp;&nbsp;&nbsp; [1] =&gt; Lori<br />&nbsp;&nbsp;&nbsp; [2] =&gt; Megan<br />)<br />Array<br />(<br />&nbsp;&nbsp;&nbsp; [0] =&gt; Andy<br />&nbsp;&nbsp;&nbsp; [1] =&gt; Megan<br />)<br />%<br />&nbsp;</p>
<p>测试代码为两个策略运行同一用户列表，并显示结果。在第一种情况中，策略查找排列在 J 后的任何名称，所以您将得到 Jack、Lori 和 Megan。第二个策略随机选取名称，每次会产生不同的结果。在这种情况下，结果为 Andy 和 Megan。</p>
<p>策略模式非常适合复杂数据管理系统或数据处理系统，二者在数据筛选、搜索或处理的方式方面需要较高的灵活性。</p>
<p><strong>结束语</strong></p>
<p>本文介绍的仅仅是 PHP 应用程序中使用的几种最常见的设计模式。在设计模式 一书中演示了更多的设计模式。不要因架构的神秘性而放弃。模式是一种绝妙的理念，适用于任何编程语言、任何技能水平。<br /></p>
<p>&nbsp;</p></div></div></div>]]></description>
		</item>
		    
		
		<item>
			<title>思考</title>
			<link>http://1seconds.blog.sohu.com/60839748.html</link>
			<comments>http://1seconds.blog.sohu.com/60839748.html#comment</comments>
			<dc:creator>二十四小时一秒钟</dc:creator>
			<pubDate>Wed, 22 Aug 2007 20:04:14 +0800</pubDate>
			<category>就那些事</category>
			<guid>http://1seconds.blog.sohu.com/60839748.html</guid>
			<description><![CDATA[<p>最近在想一些事情，想很多事情&hellip;&hellip;想很多很多的事情</p>
<p>&nbsp;</p>]]></description>
		</item>
		    
		
		<item>
			<title>javascript中事件的理解</title>
			<link>http://1seconds.blog.sohu.com/59322203.html</link>
			<comments>http://1seconds.blog.sohu.com/59322203.html#comment</comments>
			<dc:creator>二十四小时一秒钟</dc:creator>
			<pubDate>Sat, 11 Aug 2007 15:50:00 +0800</pubDate>
			<category>我喜欢的盒子</category>
			<guid>http://1seconds.blog.sohu.com/59322203.html</guid>
			<description><![CDATA[在javascript中，event事件是一个必不可少的讨论话题，它在和用户的交互中起到了很重要的作用。今天我们就来讨论一下JavaScript中的事件处理，并且结合它来阐叙Ajax框架实现拖动效果的原理了。<br />一、 Event对象<br />&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp; Event对象的主要属性和方法<br />　　event代表事件的状态，专门负责对事件的处理，它的属性和方法能帮助我们完成很多和用户交互的操作，下面我们就来看看它的一些属性和方法。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type：事件的类型，就是HTML标签属性中，没有&ldquo;on&rdquo;前缀之后的字符串，例如&ldquo;Click&rdquo;就代表单击事件。<br /><br />　　srcElement：事件源，就是发生事件的元素。比如&lt;a onclick=&quot;check()&quot;&gt;&lt;/a&gt; a这个链接是事件发生的源头，也就是该事件的srcElement。<br /><br />　　button：声明了被按下的鼠标键，是一个整数。0代表没有按键，1代表鼠标左键，2代表鼠标右键，4代表鼠标的中间键，如果按下了多个鼠标键，就把这些值加在一起，所以3就代表左右键同时按下。<br /><br />　　clientX/clientY：是指事件发生的时候，鼠标的横、纵坐标，返回的是整数，它们的值是相对于包容窗口的左上角生成的。<br /><br />　　offsetX/offsetY：鼠标指针相对于源元素的位置，可以确定单击Image对象的哪个象素。<br /><br />　　altKey，ctrlKey，shiftKey：顾名思义，这些属性是指鼠标事件发生的时候，是否同时按住了Alt、Ctrl或者Shift键，返回的是一个布尔值。<br /><br />　　keyCode：返回keydown和keyup事件发生的时候，按键的代码以及keypress事件的Unicode字符。比如event.keyCode=13代表按下了回车键；<br /><br />　　fromElement、toElement前者是指代mouseover事件移动过的文档元素，后者指代mouseout事件中鼠标移动到的文档元素。<br /><br />　　cancelBubble：一个布尔属性，把它设置为true的时候，将停止事件进一步起泡到包容层次的元素，它用于检测是否接受上层元素的事件的控制。true代表不被上层元素的事件控制，false代表允许被上层元素的事件控制。<br /><br />　　returnValue：一个布尔值属性，设置为false的时候可以阻止浏览器执行默认的事件动作，相当于&lt;a href=&rdquo;#&rdquo; onclick=&rdquo;ProcessMethod();return false;&rdquo; /&gt;。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attachEvent()和detachEvent()方法：为制定DOM对象事件类型注册多个事件处理函数的方法，它们有两个参数，第一个是事件类型，第二个是事件处理函数。在attachEvent()事件执行的时候，this关键字指向的是window对象，而不是发生事件的那个元素。<br /><br />&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp; IE Event对象的一些说明<br />　　Event对象是一个全局属性<br />　　在IE中，不能把Event对象作为参数传递给事件处理程序，只能用window.event或者event来引用Event对象。因为在IE中，Event是window的一个属性，也就是说event是一个全局变量，这个变量提供了事件的细节。<br />3 关于事件的起泡的概念 <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IE中事件的起泡：IE中事件可以沿着包容层次一点点起泡到上层，也就是说，下层的DOM节点定义的事件处理函数，到了上层的节点如果还有和下层相同事件类型的事件处理函数，那么上层的事件处理函数也会执行。例如，&lt;div&gt;标签包含了&lt;a&gt;，如果这两个标签都有 onclick事件的处理函数，那么执行的情况就是先执行&lt;a&gt;标签的onclick事件处理函数，再执行&lt;div&gt;的事件处理函数。如果希望&lt;a&gt;的事件处理函数执行完毕之后，不希望执行上层的&lt;div&gt;的onclick的事件处理函数了，那么就把 cancelBubble设置为false即可。<br />　　<br />二、 IE中拖动DOM元素的例子<br />/*<br />&nbsp;&nbsp; 该函数由mousedown事件处理调用<br />&nbsp;&nbsp; 它为随后发生的mousemove和mouseup事件注册了临时的捕捉事件处理程序<br />&nbsp;&nbsp; 并用这些事件处理程序拖动指定的文档元素<br />&nbsp;&nbsp; 第二个参数必须是mousedown事件的事件对象<br />*/<br />function beginDrag(elementToDrag,event)<br />{<br />&nbsp;&nbsp; //该元素当前位于何处<br />&nbsp;&nbsp; //该元素的样式性质必须具有left和top css属性<br />&nbsp;&nbsp; //此外，我们假定他们用象素做单位<br />&nbsp;&nbsp; //var x=parseInt(elementToDrag.style.left);<br />&nbsp;&nbsp; //var y=parseInt(elementToDrag.style.top);<br />&nbsp;&nbsp;<br />&nbsp;&nbsp; //计算一个点和鼠标点击之间的距离，下面的嵌套的moveHandler函数需要这些值<br />&nbsp;&nbsp; var deltaX=event.clientX-parseInt(elementToDrag.style.left);<br />&nbsp;&nbsp; var deltaY=event.clientY-parseInt(elementToDrag.style.top);<br />&nbsp;&nbsp;<br />//&nbsp;&nbsp; 注册mousedown事件后发生的mousemove和mouseup事件的处理程序<br />//&nbsp;&nbsp; 注意，它们被注册为文档的捕捉事件处理程序<br />//&nbsp;&nbsp; 在鼠标按钮保持按下的状态的时候，这些事件处理程序保持活动的状态<br />//&nbsp;&nbsp; 在按钮被释放的时候，它们被删除<br />&nbsp;&nbsp; document.attachEvent(&quot;onmousemove&quot;,moveHandler);<br />&nbsp;&nbsp; document.attachEvent(&quot;onmouseup&quot;,upHandler);<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; //我们已经处理了该事件，不要让别的元素看到它<br />event.cancelBubble=true;<br />event.returnValue=false;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp; /*<br />&nbsp;&nbsp;&nbsp;&nbsp; 这是在元素被拖动时候捕捉mousemove事件的处理程序，它响应移动的元素<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; */<br />&nbsp;&nbsp; function moveHandler(e)&nbsp;&nbsp;<br />&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp; //把元素移动到当前的鼠标位置<br />&nbsp;&nbsp;&nbsp;&nbsp; e=window.event;<br />&nbsp;&nbsp;&nbsp;&nbsp; elementToDrag.style.left=(event.clientX-deltaX)+&quot;px&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp; elementToDrag.style.top=(event.clientY-deltaY)+&quot;px&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; //不要让别的元素看到该事件<br />&nbsp;&nbsp;&nbsp;&nbsp; event.cancelBubble=true;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; }<br />&nbsp;&nbsp;<br />&nbsp;&nbsp; /*<br />&nbsp;&nbsp;&nbsp;&nbsp; 该事件将捕捉拖动结束的时候发生的mouseup事件<br />&nbsp;&nbsp; */<br />&nbsp;&nbsp; function upHandler(e)<br />&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp; //注销事件处理程序<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.detachEvent(&quot;onmouseup&quot;,upHandler);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.detachEvent(&quot;onmousemove&quot;,moveHandler);}<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; event.cancelBubble=true;<br />&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; 调用它的HTML文件代码：<br />　&lt;html&gt;<br />　&lt;head&gt;<br />　&nbsp;&nbsp;&nbsp;&nbsp; &lt;title&gt;Untitled Page&lt;/title&gt;<br />　&nbsp;&nbsp;&nbsp;&nbsp; &lt;script type=&quot;text/javascript&quot; src=&quot;dragIE.js&quot;&gt;&lt;/script&gt;<br />　&lt;/head&gt;<br />　&lt;body&gt;<br />　&lt;div style=&quot;position:absolute;left:100px;top:100px;background-color:White;border:solid black;&quot;&gt;<br />　&nbsp;&nbsp; &lt;div style=&quot;background-color:Gray;border-bottom:solid black;padding:3px;font-family:Sans-Serif;font-weight:bold;&quot; onmousedown=&quot;beginDrag(this.parentNode,event);&quot;&gt;<br />　&nbsp;&nbsp; 拖动我&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />　&nbsp;&nbsp; &lt;/div&gt;<br />　&nbsp;&nbsp; &lt;div&gt;<br />　&nbsp;&nbsp; &lt;p&gt;This is a test.Testing,testing&lt;/p&gt;&lt;/div&gt;<br />　&lt;/div&gt;<br />　&lt;/body&gt;<br />三、 DOM中的高级事件处理<br />IE 6中的事件处理，并不是W3C DOM标准的事件处理模型，所以如果上述代码运行在Mozilla Firefox的浏览器中，就会失去作用，同时即将发布的IE 7也将支持W3C DOM的二级标准，所以掌握DOM的高级事件处理显得就很重要了，因为W3C DOM二级标准是未来Web的发展方向，同时W3C DOM的API非常常用，为未来更加复杂的Web开发提供了良好的基础。<br />（一）事件处理程序的作用域和事件的传播<br />　　在正式讨论DOM高级事件处理之前，我们有必要了解一下事件处理程序的作用域。事件处理程序的作用域要比普通的函数作用域复杂很多。普通的函数作用域链比较容易，例如在一个普通函数中查找一个变量a，那么JavaScript解释器会先在该函数的调用对象中查找是否有a这个变量，如果没有，将会在作用域链的下一个对象，一般是全局对象中查找。但是事件处理程序没这么简单，特别是用HTML的属性定义的，它们的作用域链的头部是调用它们的对象，而下一个对象并不是全局对象，而是触发事件处理程序的对象。这样就会出现一个问题，window和document都有一个方法open()，如果open()前面不加修饰，那么在事件处理的函数中将会调用document.open()方法，而不是常用的window.open()方法，所以使用的时候应该明确指明是 window.open()。<br />（二）事件传播和注册事件处理程序<br />1.事件传播<br />　　在二级DOM标准中，事件处理程序比较复杂，当事件发生的时候，目标节点的事件处理程序就会被触发执行，但是目标节点的父节点也有机会来处理这个事件。事件的传播分为三个阶段，首先是捕捉阶段，事件从 Document对象沿着DOM树向下传播到目标节点，如果目标的任何一个父节点注册了捕捉事件的处理程序，那么事件在传播的过程中就会首先运行这个程序。下一个阶段就是发生在目标节点自身了，注册在目标节点上的相应的事件处理程序就会执行；最后是起泡阶段，事件将从目标节点向上传回给父节点，同样，如果父节点有相应的事件处理程序也会处理。在IE中，没有捕捉的阶段，但是有起泡的阶段。可以用stopPropagating()方法来停止事件传播，也就是让其他元素对这个事件不可见，在IE 6中，就是把cancelBubble设置为true。<br />2.注册事件处理程序<br />　　和IE一样， DOM标准也有自己的事件处理程序，不过DOM二级标准的事件处理程序比IE的强大一些，事件处理程序的注册用addEventListner方法，该方法有三个参数，第一个是事件类型，第二个是处理的函数，第三个是一个布尔值，true表示制定的事件处理程序将在事件传播的阶段用于捕捉事件，否则就不捕捉，当事件发生在对象上才触发执行这个事件处理的函数，或者发生在该对象的字节点上，并且向上起泡到这个对象上的时候，触发执行这个事件处理的函数。例如：document.addEventListener(&quot;mousemove&quot;,moveHandler,true);就是在mousemove事件发生的时候，调用moveHandler函数，并且可以捕捉事件。<br />　　可以用addEventListener为一个事件注册多个事件处理的程序，但是这些函数的执行顺序是不确定，并不像C#那样按照注册的顺序执行。<br />在Mozilla Firefox中用addEventListener注册一个事件处理程序的时候，this关键字就表示调用事件处理程序的文档元素，但是其他浏览器并不一定是这样，因为这不是DOM标准，正确的做法是用currentTarget属性来引用调用事件处理程序的文档元素。<br />3.二级DOM标准中的Event<br />和IE不同的是，W3C DOM中的Event对象并不是window全局对象下面的属性，换句话说，event不是全局变量。通常在DOM二级标准中，event作为发生事件的文档对象的属性。Event含有两个子接口，分别是UIEvent和MutationEvent，这两个子接口实现了Event的所有方法和属性，而 MouseEvent接口又是UIEvent的子接口，所以实现了UIEvent和Event的所有方法和属性。下面，我们就看看Event、 UIEvent和MouseEvent的主要属性和方法。<br />　　1.Event<br />　　&nbsp;&nbsp; type：事件类型，和IE类似，但是没有&ldquo;on&rdquo;前缀，例如单击事件只是&ldquo;click&rdquo;。<br />　　&nbsp;&nbsp; target：发生事件的节点。<br />　　&nbsp;&nbsp; currentTarget：发生当前正在处理的事件的节点，可能是Target属性所指向的节点，也可能由于捕捉或者起泡，指向Target所指节点的父节点。<br />　　&nbsp;&nbsp; eventPhase：指定了事件传播的阶段。是一个数字。<br />　　&nbsp;&nbsp; timeStamp：事件发生的时间。<br />　　&nbsp;&nbsp; bubbles：指明该事件是否起泡。<br />　　&nbsp;&nbsp; cancelable：指明该事件是否可以用preventDefault()方法来取消默认的动作。<br />　　&nbsp;&nbsp; preventDefault()方法：取消事件的默认动作；<br />　　&nbsp;&nbsp; stopPropagation()方法：停止事件传播。<br />　　2.UIEvent<br />　　&nbsp;&nbsp; view：发生事件的window对象。<br />　　&nbsp;&nbsp; detail：提供事件的额外信息，对于单击事件、mousedown和mouseup事件都代表的是点击次数。<br />　　3.MouseEvent<br />　　　button：一个数字，指明在mousedown、mouseup和单击事件中，鼠标键的状态，和IE中的button属性类似，但是数字代表的意义不一样，0代表左键，1代表中间键，2代表右键。<br />　　　altKey、ctrlKey、shiftKey、metaKey：和IE相同，但是IE没有最后一个。<br />clientX、clientY：和IE的含义相同，但是在DOM标准中，这两个属性值都不考虑文档的滚动情况，也就是说，无论文档滚动到哪里，只要事件发生在窗口左上角，clientX和clientY都是0，所以在IE中，要想得到事件发生的坐标相对于文档开头的位置，要加上 document.body.scrollLeft和document.body.scrollTop。<br />　　　screenX、screenY：鼠标指针相对于显示器左上角的位置，如果你想打开新的窗口，这两个属性很重要。<br />　　　relatedTarget：和IE中的fromElement、toElement类似，除了对于mouseover和mouseout有意义外，其他的事件没什么意义。<br />（三）兼容于两种主流浏览器的拖动DOM元素的例子<br />　　好了，刚才讲了这么多DOM编程和IE中的事件，那么如何编写兼容IE和Mozilla Firefox两种主流浏览器的拖拽程序呢？代码如下：<br />function beginDrag(elementToDrag,event)<br />{<br />&nbsp;&nbsp; var deltaX=event.clientX-parseInt(elementToDrag.style.left);<br />&nbsp;&nbsp; var deltaY=event.clientY-parseInt(elementToDrag.style.top);<br />&nbsp;&nbsp;<br />if(document.addEventListener) <br />{<br />&nbsp;&nbsp; document.addEventListener(&quot;mousemove&quot;,moveHandler,true);<br />&nbsp;&nbsp; document.addEventListener(&quot;mouseup&quot;,upHandler,true);<br />}<br />else if(document.attachEvent)<br />{<br />&nbsp;&nbsp; document.attachEvent(&quot;onmousemove&quot;,moveHandler);<br />&nbsp;&nbsp; document.attachEvent(&quot;onmouseup&quot;,upHandler);<br />&nbsp;&nbsp;<br />}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp; if(event.stopPropagation)&nbsp;&nbsp;&nbsp; event.stopPropagation();<br />&nbsp;&nbsp; else event.cancelBubble=true;<br />&nbsp;&nbsp; if(event.preventDefault)&nbsp;&nbsp; event.preventDefault();<br />&nbsp;&nbsp; else event.returnValue=false;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp; function moveHandler(e)&nbsp;&nbsp;<br />&nbsp;&nbsp; {<br />　　if (!e) e=window.event; //如果是IE的事件对象，那么就用window.event<br />　　//全局属性，否则就用DOM二级标准的Event对象。<br />&nbsp;&nbsp;&nbsp;&nbsp; elementToDrag.style.left=(event.clientX-deltaX)+&quot;px&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp; elementToDrag.style.top=(event.clientY-deltaY)+&quot;px&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(event.stopPropagation)&nbsp;&nbsp;&nbsp; event.stopPropagation();<br />&nbsp;&nbsp;&nbsp;&nbsp; else event.cancelBubble=true;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; }<br />&nbsp;&nbsp;<br />&nbsp;&nbsp; function upHandler(e)<br />&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(document.removeEventListener)<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.removeEventListener(&quot;mouseup&quot;,upHandler,true);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.removeEventListener(&quot;mousemove&quot;,moveHandler,true);}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.detachEvent(&quot;onmouseup&quot;,upHandler);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.detachEvent(&quot;onmousemove&quot;,moveHandler);}<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(event.stopPropagation)&nbsp;&nbsp;&nbsp; event.stopPropagation();<br />&nbsp;&nbsp;&nbsp;&nbsp; else event.cancelBubble=true;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />最后我们来回顾一下事件执行过程中的三个阶段：<br /><span><span><span><font size="3"><span><font face="Times New Roman">1 捕捉阶段，事件从Document对象沿Dom解析的树向下传播给目标节点。<br /></font></span></font>
<p><font size="3"><span><font face="Times New Roman">2 目标节点触发阶段 事件处理程序在目标上的运行阶段 <br /></font></span><span><font face="Times New Roman">3 起泡阶段 事件从目标元素向上传播或者起泡回Document对象的文档层次。</font></span></font></p></span></span></span>]]></description>
		</item>
		    
		
		<item>
			<title>大地之美</title>
			<link>http://1seconds.blog.sohu.com/59156118.html</link>
			<comments>http://1seconds.blog.sohu.com/59156118.html#comment</comments>
			<dc:creator>二十四小时一秒钟</dc:creator>
			<pubDate>Fri, 10 Aug 2007 09:15:09 +0800</pubDate>
			<category>就那些事</category>
			<guid>http://1seconds.blog.sohu.com/59156118.html</guid>
			<description><![CDATA[早上的黄岛，山岛之城。美不胜收，无言以尽]]></description>
		</item>
		    
		
		<item>
			<title>linux下安装飞鸽传书</title>
			<link>http://1seconds.blog.sohu.com/59099464.html</link>
			<comments>http://1seconds.blog.sohu.com/59099464.html#comment</comments>
			<dc:creator>二十四小时一秒钟</dc:creator>
			<pubDate>Thu, 9 Aug 2007 19:15:50 +0800</pubDate>
			<guid>http://1seconds.blog.sohu.com/59099464.html</guid>
			<description><![CDATA[linux 的版飞鸽，<br />下载客户端：<a href="http://www.ipmsg.org/archive/g2ipmsg-0.9.1.tar.gz" target="_blank">http://www.ipmsg.org/archive/g2ipmsg-0.9.1.tar.gz</a><br />下载<span style="text-decoration: underline;"><span style="font-weight: bold;">xml-parse:</span></span><a href="http://www.filewatcher.com/m/XML-Parser-2.34.tar.gz.229689.0.0.html" target="_blank">http://www.filewatcher.com/m/XML-Parser-2.34.tar.gz.229689.0.0.html</a><br /><br />然后按照以下步骤安装：<br />安装XML－Parser-2.34：<br />tar zxvf XML-Parser-2.34.tar.gz<br />cd XML-Parser-2.34<br />perl Makefile.PL<br />make<br />make install<br /><br /><br />   <p>安装<a href="http://www.ipmsg.org/archive/g2ipmsg-0.9.1.tar.gz" target="_blank">g2ipmsg-0.9.1.tar.gz</a></p><p>tar zxvf <a href="http://www.ipmsg.org/archive/g2ipmsg-0.9.1.tar.gz" target="_blank">g2ipmsg-0.9.1.tar.gz</a></p><p>注意，在安装之前需要解决一个中文的问题，解决方式是: 修改 src/codeset.c文件中的 IPMSG_PROTO_CODE    &quot;CP932&quot; ，将 CP932修改为GBK<br />./configure --prefix=/usr --sysconfdir=/etc --enable-systray<br /><br />3.make<br /><br />4.make  install </p> <p> </p> <p><br /> </p> <p> </p> <p>安装过程中如果缺少相应的包要进行安装,例如以下的包：<br /></p> <p>sudo apt-get install libxml-parser-perl libgnomeui-dev libpanel-applet2-dev  </p> <p> </p> <p>sudo apt-get install gettext intltool</p><br /><b><a href="http://dir.filewatcher.com/d/Slackware/Other/XML-Parser-2.34.tar.gz.229689.html"></a></b>]]></description>
		</item>
		    
		
		<item>
			<title>js 操作cookie类</title>
			<link>http://1seconds.blog.sohu.com/59081457.html</link>
			<comments>http://1seconds.blog.sohu.com/59081457.html#comment</comments>
			<dc:creator>二十四小时一秒钟</dc:creator>
			<pubDate>Thu, 9 Aug 2007 16:44:54 +0800</pubDate>
			<category>我喜欢的盒子</category>
			<guid>http://1seconds.blog.sohu.com/59081457.html</guid>
			<description><![CDATA[这是一个js操作cookie的类 大家看着学习一下把<br /><br />&lt;script language&quot;javascript&quot;&gt;<br />&nbsp;&nbsp;&nbsp; //构造函数：用户指定的名字和可选的性质为指定的文档创建一个cookie对象<br />&nbsp;&nbsp;&nbsp; //参数：<br />&nbsp;&nbsp;&nbsp; //document：保存cookie的Documen对象，必需的<br />&nbsp;&nbsp;&nbsp; //name&nbsp;&nbsp;&nbsp; ：指定cookie名的字符串。必需的<br />&nbsp;&nbsp;&nbsp; //hours&nbsp;&nbsp; ：一个可选的数字，指定从现在起到cookie过期的小时数<br />&nbsp;&nbsp;&nbsp; //path&nbsp;&nbsp;&nbsp; ：一个可选的字符串，指定了cookie的路径性质<br />&nbsp;&nbsp;&nbsp; //domain&nbsp; ：一个可选的字符串，指定了cookie的域性质<br />&nbsp;&nbsp;&nbsp; //secure&nbsp; ：一个可选的布尔值，如果为true，需要一个安全的cookie。<br />&nbsp;&nbsp;&nbsp; function cookie(document,name,hours,path,domain,secure){<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //该对象的所有与定义属性都以'$'开头<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //这是为了与存储在cookie中的属性值区别开<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.$document = document;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.$name&nbsp;&nbsp;&nbsp;&nbsp; = name;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(hours){<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.$expiration = new Date((new Date()).getTime()+hours*3600000);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }else{<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.$expiration = null;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(path) this.$path = path; else this.$path = null;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(domain) this.$domain = domain; else this.$domain = null;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(secure) this.$secure = secure; else this.$secure = false;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; cookie.prototype.store = function(){<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //首先遍历cookie对象的属性，并且将cookie值连接起来<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //由于cookie将等号和分号作为分隔符，所以我们使用冒号和&amp;来分割存储在单个cookie值中的状态变量。<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //注意，我们对每个状态变量的值进行了转义，以防它含有标点符号或其他非法字符<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var cookieval = '';<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(var prop in this){<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //alert(prop);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(prop.charAt(0)=='$'||((typeof this[prop]) == 'function'))<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; continue;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(cookieval !='')cookieval +='&amp;';<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cookieval += prop+':'+escape(this[prop]);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var cookie = this.$name + &quot;=&quot; +cookieval;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(this.$expiration)<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cookie +=';expires='+this.$expiration.toGMTString();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(this.$path)cookie += ';path='+this.$path;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(this.$domain)cookie += ';domain='+this.$domain;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(this.$secure) cookie += ';secure';<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //alert(cookie);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //下面设置Document.cookie属性来保存cookie.<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.$document.cookie = cookie;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; cookie.prototype.load = function(){<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //首先得到属于该文档的所有cookie列表<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //通过读document.cookie属性可以实现这一点<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var allcookies = this.$document.cookie;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //alert(allcookies);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(allcookies == &quot;&quot;) return false;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //下面从该列表中提取已明明的cookie<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var start = allcookies.indexOf(this.$name + &quot;=&quot;);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(start == -1) return false; //该页未定义cookie<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; start += this.$name.length+1;//跳过名字和等号<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var end = allcookies.indexOf(';',start);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(end == -1)end = allcookies.length;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var cookieval = allcookies.substring(start,end);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //alert(cookieval);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //既然我们已经提取出了已命名的cookie的值，就可以把它分割存储到状态变量名和值中。<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //名字/值对有&amp;分隔符，名字和值之间则由冒号分割<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //我们使用split()方法解析所有数据<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var a = cookieval.split('&amp;');<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (var i=0;i&lt;a.length;i++)<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; a[i]=a[i].split(':');<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //既然我们已经解析了cookie的值，就可以把它分割存储到状态变量名和值中<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //注意我们对属性调用了unescape()方法，因为存储它们时调用了escape()方法<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(var i=0;i&lt;a.length;i++){<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //alert(a[i][0]);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //alert(a[i][1]);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this[a[i][0]] = unescape(a[i][1]);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return true;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; //该函数是cookie对象的remove()方法<br />&nbsp;&nbsp;&nbsp; cookie.prototype.remove = function(){<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var cookie;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cookie = this.$name + '=';<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(this.$path) cookie += ';path='+this.$path;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(this.$domain) cookie += ';domain='+this.$domain;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cookie += ';expires=Fri,02-Jan-1970 00:00:00 GMT';<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.$document.cookie = cookie;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; var visitordata = new cookie(document,'name_color_count_state',240);<br />&nbsp;&nbsp;&nbsp; //如果cookie没有被定义，或者它没有我们需要的数据，就向用户查询数据。<br />&nbsp;&nbsp;&nbsp; if(!visitordata.load()||!visitordata.name||!visitordata.color){<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; visitordata.name = prompt(&quot;what is your name:&quot;,&quot;&quot;);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; visitordata.color = prompt(&quot;what is your favorite color:&quot;,&quot;&quot;);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; //跟踪这个用户访问了多少次页面:<br />&nbsp;&nbsp;&nbsp; if(visitordata.visits == null) visitordata.visits = 0;<br />&nbsp;&nbsp;&nbsp; visitordata.visits++;<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; //保存cookie的值，即使他们已经被保存过了。<br />&nbsp;&nbsp;&nbsp; //以便为这位经常访问的用户将过期日期重置为10天<br />&nbsp;&nbsp;&nbsp; //此外，注意再次保存它们以保存更新的访问状态变量<br />&nbsp;&nbsp;&nbsp; visitordata.store();<br />&nbsp;&nbsp;&nbsp; document.write('&lt;font size=&quot;7&quot; color=&quot;'+visitordata.color+'&quot;&gt;'+<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 'Welcome, '+visitordata.name+'!'+<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; '&lt;/font&gt;'+<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; '&lt;p&gt;You have visited' + visitordata.visits + ' times.');<br />&lt;/script&gt;<br />&lt;form&gt;<br />&nbsp;&nbsp;&nbsp; &lt;input type=&quot;button&quot; value=forget my name onclick=&quot;visitordata.remove();&quot;&gt;<br />&lt;/form&gt;<br />]]></description>
		</item>
		    
		
		<item>
			<title>人民币升值给中国带来什么</title>
			<link>http://1seconds.blog.sohu.com/59063098.html</link>
			<comments>http://1seconds.blog.sohu.com/59063098.html#comment</comments>
			<dc:creator>二十四小时一秒钟</dc:creator>
			<pubDate>Thu, 9 Aug 2007 14:25:23 +0800</pubDate>
			<category>经济观察</category>
			<guid>http://1seconds.blog.sohu.com/59063098.html</guid>
			<description><![CDATA[<table cellspacing="0" cellpadding="10" align="left" border="0">
<tbody>
<tr>
<td>


<div style="Z-INDEX: 1; LEFT: 100px; VISIBILITY: visible; WIDTH: 336px; POSITION: absolute; TOP: 100px; HEIGHT: 280px">



</div></td></tr></tbody></table>现在很多国人都很关心人民币升值这个话题，但又不了解美国迫使人民币升值的真正意图何在，现在鄙人就此浅薄的发表一下我的个人看法！&nbsp;<br /><br />相信大家对80年代的&ldquo;日本经济衰退&rdquo;和90年代的&ldquo;亚洲金融风暴&rdquo;及&ldquo;香港的香港金融保卫战&rdquo;吧！也许有人会说那是国际投机集团&ldquo;美国索罗斯财团&rdquo;搞的，但是，你就没有想过它背后难道就没有美国政府的支持了吗？下面，我仔细分析一下这些事件的前因后果你就会明白了。&nbsp;<br /><br />从1980开始的，特别在1990年和1995年，第一名的美国和第二名的日本之间的GDP差距是多少？日本GDP超过美国GDP的一半！这也是目前为止唯一一次其它国家和美国的经济差距缩小到一半的程度。日本人在欢呼：只要超过美国的GDP，日本就可以恢复&ldquo;正常国家&rdquo;了！美国人没有吭声。&nbsp;<br /><br />按理说，日本还是美国的盟国，其经济也是美国扶持起来的，美国也没有分裂日本的必要（要分裂，二战时就分裂了，也不用等到80-90年代）。美国也不可能对盟国日本使用&ldquo;颠覆性煽动&rdquo;，眼看着美国是阻挡不了日本经济的发展前景的了！世界各国都在兴奋的期待着日本GDP超过美国GDP的那个&ldquo;历史性时刻&rdquo;！日本企业更加疯狂，美国经济的象征&mdash;&mdash;洛克菲勒广场被日本人买下了！美国的精神象征&mdash;&mdash;好莱坞被日本人买了！美国人民的心情一下子掉到了谷底。&ldquo;世界第一&rdquo;就快保不住了！美国人民的荣耀感在急剧下滑，民间开始蔓延仇日情绪。&nbsp;<br /><br />1980年，日本的GDP就快到美国的一半了。有一件事情在1985年发生了，1985年美国拉拢其它五国（7国集团）逼迫日本签署了。以&ldquo;行政手段&rdquo;迫使日元升值。其实的一个中心思想就是日本央行不得&ldquo;过度&rdquo;干预外汇市场。日本当时手头有充足的美元外汇储备，如果日本央行干预，日元升不了值。可惜呀，日本是被去了势的太监。美国驻军、政治渗透、连宪法都是美国人帮它度身定做的，想不签广场协议都不可能。&nbsp;<br /><br />日本最后的结局大家也知道了。1985年9月的广场协议至1988年初.美国要求日元升值。根据协议推高日元，日元兑美元的汇率从协议前的1美元兑240日元上升到1986年5月时的1美元兑160日元。由于美国里根政府坚持认为日元升值仍不到位，通过口头干预等形式继续推高日元。这样，到1988年年初，日元兑美元的汇率进一步上升到1美元兑120日元,&nbsp;正好比广场协议之前的汇率上升了一倍&nbsp;<br /><br />美国人满足了吗？没有。接着看下去，从1993年2月至1995年4月，当时克林顿政府的财政部长贝茨明确表示，为了纠正日美贸易的不均衡，需要?0%左右的日元升值，当时的日元汇率大致在1美元兑120日元左右，所以，根据美国政府的诱导目标，日元行情很快上升到1美元兑100日元。以后，由于克林顿政府对以汽车摩擦为核心的日美经济关系采取比较严厉的态度。到了1995年4月，日元的汇率急升至1美元兑79日元，创下历史最高记录。&nbsp;<br /><br />日元升值的后果是什么？洛克菲勒广场重新回到了美国人手中，通用汽车在这个广场的一卖一买中净赚4亿美元！日资在艰难度日中大规模亏本退出美国。美国人民胜利了！成功的击退了日本的经济进攻！我们可以从事例中看看1995年之后，日本和美国的GDP之比重新拉开了距离，而且越来越大！&nbsp;<br /><br />可能有些网友还是没有明白，日元升值怎么啦？跟我们的谈论有什么关系？日元升值，就是美国对日本的一次经济阻击战！成功的把日本20多年的发展财富大转移到了美国去了。&nbsp;<br /><br />下面我给个例子大家就清楚了。&nbsp;<br /><br />假设我是美国财团，我当然知道1985会发生什么，假设我在1983年吧，我用100亿美元兑换成24000亿日元，进入日本市场，购买日本股票和房地产，日本经济的蓬勃导致股市和房地产发疯一样的上涨，1985年广场协议签订，日元开始升值，到1988年初，股市和房地产假设我已经赚到了一倍（5年才翻一倍是最低假设了），那就是48000亿日元。&nbsp;<br /><br />这时，日元升值到1:120。我把日本的房地产和股票在一年中抛售完，然后兑换回美元，那么，就是400亿美元！在5年时间中，我净赚300亿美元！（还是最低假设）。那么日本呢？突然离开的巨额外资就导致了日本经济的崩溃！经济学用词叫&ldquo;泡沫经济破灭&rdquo;。这就是日本常说的：&ldquo;失去的十年&rdquo;。而我连本带利的400亿美元回到美国，你想一想，美国经济能不旺盛吗？！！日本&ldquo;失去的十年&rdquo;，却正是美国&ldquo;兴旺的十年&rdquo;！看看我的上表就知道了。&nbsp;<br /><br />我只是美国财团中的一个，其它财团呢？嘿嘿，而且我的假设还只是到1988年，如果是到1995年，日元升值到1:79，你我能想象美国在这场经济战争的胜利中，到底从日本刮走了多少财富？&nbsp;<br /><br />美国赚够了，日元现在又重新回到了1:140的位置上，美元的坚挺依然和30年前一样！美元暂时性的贬值，并没有损害到美元的国际地位。这场美日的经济战争，以美国完胜而告终！！&nbsp;<br /><br />美国人玩上瘾了。1998年，同样的手法在东南亚四小龙四小虎身上又来了一次，这就是亚洲金融风暴！唯一不同的，这次不需要广场协议了。因为亚洲这些小虎小龙的外汇储备们直接阻击就可以大获全胜！但是，还是没有战胜财大气粗、军事强盛、奉行霸权主义的美国，结局大家也看到了，东南亚货币在先升后跌中，经济发展的成果被美国抢掠一空！！&nbsp;<br /><br />唯一挺住了索罗斯的进攻而没有经济崩溃的就只有回归后的香港，保住了香港几十年的发展果实。当时索罗斯发动世界舆论（包括香港舆论），大肆攻击香港政府（中国政府）&ldquo;行政干预市场&rdquo;，违反市场经济规则、没有民主自由，要是当时中国屈服于世界的舆论压力而不运用&ldquo;宏观调控&rdquo;进行入市干预，那将酿成大祸，又不知道要有多少国人向当年的日本那样因破产而跳楼自杀了！&nbsp;<br /><br />当时的曾荫权后来说过：&ldquo;决定政府入市干预的前一晚，我坐在床头哭了，不是为我自己，而是怕这个决定如果错误了，害了香港，我怎么向中央政府向市民们交代。&rdquo;大家现在知道为什么美国一再要求他国&ldquo;新闻自由&rdquo;、&ldquo;市场经济&rdquo;、&ldquo;民主人权&rdquo;是建立在自己利益的基础上了吧，知道我国的&ldquo;宏观调控&rdquo;政策的正确性和优势所在了吧。&nbsp;<br /><br />美国停手了吗？没有，因为我国综合势力的增长、国力的增强威胁到了美国的根本利益和&ldquo;世界第一&rdquo;的权威，近来&ldquo;中国公开支持因儿子丑闻陷入困境的安南，指责美国故意借题发挥进行人生攻击。&rdquo;就是最好的证明。所以美国心里就不痛快了，就要整人了，现在强迫人民币升值就是消弱中国的第一步，各位明白了吗？知道为什么中央政府要突然狂力打压上海和北京的房地产市场了吧？知道为什么中国股市那么惨了吗？央行行长周小川在3月还是4月曾说了一件事情：&ldquo;有一个40亿美元的外资在上海炒房地产，已经退出中国了这样的外资，不要也罢！&rdquo;明白了吗？中国股市是一个弱势股市，很容易被美国财团利用。&nbsp;<br /><br />中央不可能放松对股市的控制，否则中国经济将会在外资的攻击中崩溃！前段时间，也就是今年的12月初又有一个240亿美元的外资财团撤离中国上海。现在，大家对国家的宏观调控的优势有所理解了吧，知道了国家出台那么多针对房地产的政策是多么的明智和及时了吧（文件详文附在后面，有兴趣的可以读读）！&nbsp;<br /><br />现在各位知道为什么中国要实行国家外汇管制、汇率控制、打压房地产、控制股市、知道为什么中国要保持巨额外汇储备，为什么最近央行又出台了新的房地产贷款规定，为什么中国政府一直要求进出口贸易平衡，为什么要扩展东南亚贸易市场和欧盟市场，为什么要加WTO了。&nbsp;<br /><br />其实中美之间的经济战争，早就已经开场了，而且来来回回过了几百招了。我们大多数网友还懵懵懂懂的只盯着台海，盯着中亚美军又多了一个军事基地。要知道经济崩溃的灾难远比一场军事战争的后果更严重。军事战争不外乎两种：即&ldquo;侵略战争&rdquo;和&ldquo;卫国战争&rdquo;。而军事上的&ldquo;侵略战争&rdquo;的最终目的就是打垮对方的一切（军事力量和经济实力）达到占领对方领土，进行资源掠夺和控制奴役和剥削对方的国民。&nbsp;<br /><br />这样的事情中国历史上没有少发生，这里我就不例举事例了。而如今的美国就是以军事上的侵略战争为手段，达到奴役和剥削对方为目的的真实意图（对实力弱小的国家而言），看看如今的&ldquo;伊拉克&rdquo;就明白了，美国实际上是侵略占领了伊拉克，控制了伊拉克的石油，以此来满足美国国内巨大的需求量；而对实力强的原苏联（原苏联拥有致对方于死地的核力量），美国就只有发动经济进攻来拖垮他们，苏联的分裂就是最好的例子。&nbsp;<br /><br />也许有的人要说，那是冷战时期的军备竞赛和当时苏联国内政策导致了原苏联因经济崩溃而解体的。但是，你有没有想过，进行军备竞赛是以经济实力为基础的。当时的美国经济实力比苏联强，所以，美国胜利了而苏联解体了。现在轮到我们了，我国现在的经济和军事实力都没有冷战时期的苏联强大，相同点是我国同样也拥有毁灭美国的核武器，只是数量少了一点而已。那在这一轮中，就要看我国领导人的智慧了，建立合理的政策来规避风险，保护自己是当务之急（可喜的是，现在我国已经在这样做了）。&nbsp;<br /><br />可是，美国也没有闲着，而且，作为经济进攻的第一步他们已经早早的迈出了，向美国&ldquo;凯雷财团&rdquo;这样的世界性投机财团收购中国的&ldquo;徐州重工&rdquo;这样的事情已经发生了很多了，在这里我就不一一例举了。他们的目的很明确，控制中国的核心技术，进行世界性的技术垄断。同时乘汇率没有变化之前以美元套取人民币，迫使中国央行大量发行人民币以应付大量的货币兑换需求，为拖垮中国经济打下伏笔。这还是明的进入，暗地里的就更无法统计了。&nbsp;<br /><br />说到这里，也许有很多人不明白美元兑换人民币的行为与拖垮中国经济有什么关系？在这里，我解释一下：在没有大量美国财团恶意涌入中国用大量美元换取人民币之前，我国的经济形式是相对稳定的，但是，实际上，我国发行的人民币的数量远没有我国人民积累的财富数量那么多，因为，任何一种货币，只要能保证本国正常的经济活动就行了，因为印刷货币的成本是很高的。&nbsp;<br /><br />举个例子：中国有13亿人口，平均每人的财富拥有量为1万元每人，中国总共有13万亿元财富，而现实生活中，每个人不可能把自己的全部财富都带在身上，这里就平均一下，平均每个人身上携带1000元现金（携带量为10%，其实这个量已经是很大了），其余的存在银行，也就是说，在正常情况下的流动现金量（术语为：现金流量）为1千亿元，乘以一定的突变系数，（这里为了便于计算，就理想的取值100%），也就是说在正常的经济活动下，中国只要发行2千亿人民币就可以满足本国的经济活动了。&nbsp;<br /><br />而大量的恶意的国外财团的资金涌入中国，表面上是拉动了我国的经济，是国内的消费量变大，也就是使国内的现金流量的需求变大，这样，我国为了满足大众消费的需求，就会大量印刷和发行人民币来满足这种需求（当年的日本就是这样）。据统计，目前在国际上金融市场上的投资有136万亿美元。&nbsp;<br /><br />其中只要有1%涌入中国进行投机经营，按现在的汇率，我国就要发行10.895584万亿元人民币（1.36*7.8644=10.695584+0.2=10.895584万亿元），货币的发行总量已经超过了我国现有的外汇储备量（1万亿美元）的10倍，算把中国的全部外汇储备都拿来也难对付对手，此时，我国的国有经济就是负9.895584万亿元，不能算上全中国人民的全部财富，因为，国家经济崩溃了，我们手中的财富也就一文不值了。&nbsp;<br /><br />如果人民币升值以后，他们再用手头的人民币套取美元，中国国内将会余留大量人民币。那样，国人乃至世界将会对中国失去信心，不再储备和使用甚至抛售手中储备的人民币，使中国的外贸活动受挫，最终导致中国国内的通货膨胀，对外导致信誉危机从而导致金融危机。就向40年代的通货膨胀那样一盒火柴要卖几百块。如果我国政府在这次的人民币汇率这件事上决策错误，那么到时中国近30年来改革开放的经济成果就可能就可能落入他人之手。&nbsp;<br /><br />最近，国内的经济形式来看，客观的将，形式是不容乐观的。按理说，人民币升值了，也就是说钱值钱了，应该是以前1块钱的东西现在只要9毛甚至是8毛就可以买到了；可是现在的国内形式，除了工资没有涨外其余的都涨了。&nbsp;<br /><br />新华网报道说：自8月份开始，北京市场食用油价格震荡上扬。进入11月份，米价、面价、菜价及副食价格均有不同程度的攀升。报道认为，是受国际大豆市场价格上扬的影响，导致食用油价格上升。但是，米面跟风而涨，25公斤装的富强粉涨幅达12%以上，500克大米上涨了6分钱。据了解，在上海、广州、深圳粮油等生活必需品已是涨升一遍，并持续一个多月，其中面粉、食用油的最高涨幅分别已达一成和二成。&nbsp;<br /><br />农副产品涨价说明了我国经济在发展和提高。同时，以农副产品的涨价来增加农民的收入，维护社会的稳定，给国家的发展提供了一个良好的国内环境，对国家的发展是有好处的，因为中国农民的数量毕竟占了总人口比例的70%以上嘛。&nbsp;<br /><br />但是，中国的这四大城市生活必需品的涨价决非偶然。持续7个多月的宏观调控并没有稳定房价，相反，导致房价的节节攀升。早有经济学家警告说，地产泡沫将导致通货膨胀，通货膨胀将引发经济危机。然而，这种声音太微弱，现如今的种种迹象表明，通货膨胀正在步步逼近我们。&nbsp;<br /><br />对比1996年的东京，1997年的香港，北京、上海、广州，深圳这四大房价居高不下的城市，地产泡沫破灭前的迹象已经显现。试图为了一已私利而继续哄抬房价的地方政府，将迎来经济规律的无情惩罚。因为这一轮的通货膨胀是在毫无防备的情况下发出的，可能还不被官方承认，但它实实在在已经来临了。这种处在萌芽状态的通货膨胀选择了一个导致经济危机的最好时机&mdash;&mdash;2007年的元旦和春节前。因此，危害性和破坏性更大。如果有一天方便面也开始涨价时，这场经济危机已无法遏制了。&nbsp;<br /><br />柴米油盐、水电油汽的轮番涨价和全面涨价，对中国的富豪阶层的正常生活不构成任何影响，但是千千万万的普通市民将要付出更多的财富以维持和原来一样的生活水准，也就是说，中国的高房价，间接地是由普通城市居民来买单，日本的国民是花了15年的时间，香港的市民就是花了14年。那么，中国的城市居民要花多少年呢？&nbsp;<br /><br />应对即将到来的通货膨胀，国家自然有金融的手段。可是，中国的人民币在国际市场受到美元的攻击，一年之内升值达5%，而且，还有继续升值的空间。中国的贸易顺差将在人民币的升值中逐渐缩小，国际市场的风险已在加剧。而国内市场生活必需品的全面涨价，将直接影响消费。最后，逼迫央行加大人民币的发行量，中国的通货膨胀就此爆发。这种危机也可能近在眼前。&nbsp;<br /><br />人民币目前在国际货币市场的遭遇是中国汇制改革以来没有过的事，我们目前已经知道美元要干什么？但是，还由不得我们把国际市场的问题解决好，人民币在国内又是这样的尴尬。在不动产涨价的带动下，生活必需品全面涨价，形成了国际与国内两种迥然不同的市场。从某种意义上来说，这样的市场将走向资本的过度投机。说白了，对内将加剧中国社会的贫富分化，对外给资本大鳄可乘之机。&nbsp;<br /><br />如果更深层次的分析，人民币似乎是遭遇来自不同方面的围攻，试图将中国30来年经济发展的成果逐步蚕食。接下来，生活必需品的涨幅将进一步加剧，市民的购买力进一步下降，国内市场进一步缩小，中国的产能将进一步过剩，最后，必然导致大量的中小企业破产，经济危机说来就来。&nbsp;<br /><br />真正要化解这场危机，对目前的经济局势来说，进一步加大宏观调控的力度，理顺房地产市场的管理体制，采取有力措施，坚决把房价降下来，让城市居民在房价下降的过程中感受中国经济的力量，从而增强对未来的信心。也许，这是目前最应该做的一件事，尽管已经做了一些表面工作。&nbsp;<br /><br />我们要清醒地看到高房价的危害性，尤其是对中国社会的破坏更是史无前例。也许现在还不必过于悲观，一切都应该有转机。谁都知道中国经济发生了重大问题，就象一辆出现明显故障的高速列车，轰轰隆隆往前飞奔，不知何时将会出轨或者颠覆。有经济学家预言，2008年中国经济将会硬着陆，届时，社会动荡不可避免。&nbsp;<br /><br />那么，出了这么大的问题，而问题的症结究竟何在呢？&nbsp;<br /><br />发改委专家马晓河指出：我国正在由某一方面的过剩向全面过剩演变。由于产能过剩，内需不旺，中国产品被迫出口，又导致了大量的贸易摩擦，过分依赖国际市场的风险越来越大。马晓河举例说：中国人向世界上的每一个人提供了一双鞋子，可见鞋的产能过剩多少。11月23日，央行副行长苏宁也表示，中国最终消费占GDP比重已从上世纪80年代超过62%下降到2005的52.1%，居民消费率也从1991年的48.8%下降到2005年的38.2%，均达到历史最低水平。而在中国居民消费率持续下降的同时，世界平均消费率达78%&mdash;79%，比较起来差别之大就如天上和地下。&nbsp;<br /><br />上面两位，一位是宏观经济的专家，一位是金融权威，但指出的是一个共同问题，就是因为内需不旺而导致产能过剩，一旦国际市场出现大的风险，中国将有成千上万工业企业面临生存的危险。&nbsp;<br /><br />让我们再来看看近几年推动中国经济高速发展的动因是什么：如果总揽中国经济全局就可以发现，推动中国经济高速增长的一是投资，二是消费，三是出口，可以说这是并驾齐驱的&ldquo;三驾马车。&rdquo;但是，在我国的实践中是&ldquo;重投资、重出口、轻消费，&rdquo;这是问题的表象。为什么中国人会&ldquo;重投资、重出口、轻消费，&rdquo;呢？明知消费是生产力，没有消费就没有生产力，这是一个浅显的经济学常识，但是在宏观经济发展的布局上，连马克思的剩余价值理论都不顾及了？&nbsp;<br /><br />再仔细分析，就会发现很有趣的现象：一是地方政府重投资，前几年表现的是&ldquo;开发区&rdquo;热，后来是&ldquo;基本建设&rdquo;热，再后来就是现在的&ldquo;房地产&rdquo;热；二是大中型企业重工业产品出口，不管是上市公司还是民营企业，只要形成了生产规模，眼光都瞄准了国际市场，大到汽车，家电，小到鞋子，袜子，打火机，一古脑出口。就&ldquo;投资&rdquo;热而言，高房价圈走了老百姓甚至两代人的财富，还有一代人背上了沉重的债务；就&ldquo;出口&rdquo;热而言，贸易顺差继续加剧，贸易摩擦不断增多，人民币升值压力越来越大。&nbsp;<br /><br />有经济学家分析，人民币自汇率改革以来升值了5%，现在的状况是有可能2007年一年就要升值5%，相当于前10多年的升值总幅度。那么这个后果是什么呢？许多经济学家讳莫如深，我可以大胆的告诉大家，后果就是人民币大量从不同渠道流出境，国际洗黑钱的势力乘机介入，甚至可以把中国贪官的钱都洗白了。&nbsp;<br /><br />可以说，在2007年之前，只听说外国人到中国来洗钱，这个局面也将因此而改变，中国人终于到外国去洗钱了。再说得深入一点，就是中国人民创造的财富被别人悄悄地&ldquo;盗走&rdquo;了。<br /><br />发改委专家马晓河先生说：如何解决产能过剩的问题。其实，很简单，产能过剩的解决之道是刺激消费，而刺激消费的唯一办法就是降低房价。房价不降，中国人对未来的预期必将产生较大的压力而不敢消费，还有一部分成了房奴而无钱消费。马晓河先生说，中国工业品利用率有半数低于50%，所以，为了减少风险，必须扩大内需。而内需如何才能扩大呢？&nbsp;<br /><br />中国居民的消费率是38.2%,世界平均消费率是78%&mdash;79%&nbsp;<br /><br />中国居民平均房价收入比是一比十，世界平均房价收入比是一比三&nbsp;<br /><br />两相对照，中国经济问题的症结就暴露出来，是高得离谱的房价将中国居民的财富搜刮一空，还拿什么去消费呢？所以中国人的消费率创下了历史新低。有专家预测，中国房价每下降一个点，将为市场一年增加100亿以上的消费，而中国房价从2006年前三季度的综合平均价位上，至少有30%以上的下降空间，也就是说，只要中国房价下降30%，中国市场一年将增加3000亿的消费总额，中国经济的问题也迎刃而解，中国民众也从此能过上好日子。&nbsp;<br /><br />相反，我国要是领导人的决策事物就控制不好这个局面，我国的经济将会崩溃，国内将动乱，我国的国力衰弱后，必将遭受外强的军事打击。我们都清楚我们现在身处的国际环境有多恶劣。面对当前复杂的国际形势，中国一定要具备打赢两场战争的能力，一是军事战争，二是经济战争。&nbsp;<br /><br />用战争手段夺取别国别人的财富在人类历史上是很常见的。即使在21世纪的今天也还能看到。为了保护中国人民的生命财产，以及可能爆发的军事冲突，中国一定要建设强大的陆军，强大的海军，强大的空军和强大的天军（太空部队）。&nbsp;<br /><br />在人类进入21世纪的今天，谁占领了太空这个制高点，谁就掌握了未来战争的主动权。任何太空非军事化的想法，只能是白日做梦！<br /><br />圣人说得好：落后是要挨打的！中国只有具备了彻底摧毁对手的实力，别人才不敢欺负中国。同时，在人类进入21世纪的今天，由于国际交流和贸易的全球化，一场新的战争----经济战争，已经取代军事战争，成为当今世界一部分人夺取另一部分人财产的主要手段&nbsp;<br /><br />1997年东南亚的金融风暴就是经济战争的一个例子。落后的东南亚国家经济受到了重大打击。国际金融炒家以经济手段达到了以往要用战争手段才能达到的目标。<br /><br />在少迟一点的香港金融保卫战中，时任香港政务司司长的曾荫权和财政司司长任志刚，在中国中央政府的支持下，用大量外汇储备干预了香港的股票市场。中国中央政府派出了两名央行副行长到香港，要求香港的全部中资机构，全力以赴支持香港政府的扶盘行动。经过几个月的较量，香港政府成功击退了国际金融炒家把香港当作提款机的企图。那次的斗争是非常激烈的，香港恒指变动1点，期货的买卖就会相差2.3亿港币。&nbsp;<br /><br />香港金融保卫战虽然过去好多年了，我一直在想，如果没有强大中国做后盾，会不会发生&ldquo;八国联军&rdquo;攻打香港的可能呢？毕竟香港政府干预香港股票市场违反了当今国际主流社会的&ldquo;规矩&rdquo;。&nbsp;<br /><br />中国航油（新加坡）在国际石油期货市场损失5亿美元和一位中国国资委职员在伦敦同期投资再次被吃表明中国在金融市场方面还有很多东西要学。&nbsp;<br /><br />就石油这一项，中国现在每年就要多花几百亿美元。现在是中国需要啥，国际商品市场就涨啥。可以说是&ldquo;抢你没商量&rdquo;。<br /><br />然而，石油等商品的价格对中国经济的危害并不是最严重的。真正可能对中国经济的造成严重危害是人民币汇率体系和不断高涨的房地产市场<br /><br />我总觉得有人要以人民币汇率为突破口，搞垮中国的经济，夺取中国人民的经济成果。从要人民币升值和自由浮动的叫喊声中，我好像闻到了军事战争的火药味。&nbsp;<br /><br />现在有一个说得比唱得还好听得说法，让人民币汇率自由浮动，由市场来决定。&nbsp;<br /><br />难道市场是有鬼决定的吗？由市场来决定，听起来挺公平的，大家都有权。但仔细分析一下，世界上有哪个市场不是由少数人操中的呢？让人民币汇率由市场来决定，说穿了就是由他们来决定。&nbsp;<br /><br />中国政府和人民一定不要忘记1997年东南亚的金融风暴。现在外资的相当一部分是埋下的伏兵。它们就等美国把中国的门撞开（人民币汇价自由浮动），把人民币捧上天，牟取暴利。<br /><br />总之，中国一定要建设具有一不怕苦，二不怕死精神的强大的陆军，强大的海军，强大的空军和强大的天军（太空部队）以应对可能军事战争。同时中国一定要建设热爱国家，具有国际视野，精通国际竟争规则的金融&ldquo;铁军&rdquo;以应对经济战争。只有这样，中国的安全，人民的财富才会得到保护！ ]]></description>
		</item>
		    
		
		<item>
			<title>js的时间冒泡</title>
			<link>http://1seconds.blog.sohu.com/59025611.html</link>
			<comments>http://1seconds.blog.sohu.com/59025611.html#comment</comments>
			<dc:creator>二十四小时一秒钟</dc:creator>
			<pubDate>Thu, 9 Aug 2007 09:12:39 +0800</pubDate>
			<category>我喜欢的盒子</category>
			<guid>http://1seconds.blog.sohu.com/59025611.html</guid>
			<description><![CDATA[<p>这次在调试js的过程中遇到一个问题，首先让我们来看看我们要实现的效果，点击一个按钮然后出现一个div 在点击这个按钮或者点击div之外的地方的时候div隐藏。</p>
<p>如果定义onclick=&quot;show&quot;;document.body.onclick=function(){hide();}</p>
<p>那么在onclick事件被触发的时候先调用show 随后会调用document.onclick的hide();</p>
<p>这就是js的事件气泡。</p>
<p>从而解决这个问题就可以从事件起泡的角度去考虑。看下面一段源代码是我从网上直接找的。大家测试一下就知道怎么回事了。也就是在onclick事件中设置不起泡</p>
<p>&lt;html&gt;<br />&lt;head&gt;<br />&lt;body&nbsp;&nbsp; onclick=&quot;alert('点击body的alert')&quot;&gt;&nbsp; <br />&nbsp; &lt;button&nbsp;&nbsp; onclick=&quot;alert('点击button的alert');event.cancelBubble=false;&quot;&gt;允许事件冒泡&lt;/button&gt;&nbsp; <br />&nbsp; &lt;br&gt;&nbsp; <br />&nbsp; &lt;button&nbsp;&nbsp; onclick=&quot;alert('点击button的alert');event.cancelBubble=true;&quot;&gt;禁止事件冒泡&lt;/button&gt;<br />&lt;/html&gt;</p>
<p>另外一种解决办法是把这个被点击的对象放进&lt;a&gt;&lt;/a&gt;标签中 然后用&lt;a href=&quot;javascript:show();&quot;&gt;这样调用也是可以的&lt;/a&gt;</p>]]></description>
		</item>
		    
		
		<item>
			<title>格式化JS字符串</title>
			<link>http://1seconds.blog.sohu.com/59024952.html</link>
			<comments>http://1seconds.blog.sohu.com/59024952.html#comment</comments>
			<dc:creator>二十四小时一秒钟</dc:creator>
			<pubDate>Thu, 9 Aug 2007 09:05:58 +0800</pubDate>
			<category>我喜欢的盒子</category>
			<guid>http://1seconds.blog.sohu.com/59024952.html</guid>
			<description><![CDATA[这次在写一个文章管理系统的时候遇到了一个问题：当从表单提交数据到数据库后，从数据库里调用内容给JS变量用document.write()输出这个变量那么当textarea中有回车的时候就会提示未结束的字符串。<br />其中的原因是在textarea中的一个回车为asc编码的chr(10)和chr(13)，在进入数据库的时候如过不对回车进行过滤 在读出的时候便会出现如此错误<br />解决这个问题有两种办法，一是客户端。二是服务器，两者的原则都是对输入数据中的回车等符号进行过滤。<br />这里给出服务器端的简单过滤方法，希望能起到抛砖引玉的作用。<br />function txt2HTML($str){<br />&nbsp;&nbsp;&nbsp; $result = str_replace(chr(10),'&lt;br /&gt;',$str);<br />&nbsp;&nbsp;&nbsp; $result = str_replace(chr(13),'',$str);<br />&nbsp;&nbsp;&nbsp; return $result;<br />}<br />这个函数测试在数据库进入之前可以 在调出的时候大家可以自己测试一下]]></description>
		</item>
		    
		
		<item>
			<title>富贵竹开</title>
			<link>http://1seconds.blog.sohu.com/56048631.html</link>
			<comments>http://1seconds.blog.sohu.com/56048631.html#comment</comments>
			<dc:creator>二十四小时一秒钟</dc:creator>
			<pubDate>Fri, 20 Jul 2007 16:44:23 +0800</pubDate>
			<category>就那些事</category>
			<guid>http://1seconds.blog.sohu.com/56048631.html</guid>
			<description><![CDATA[三月份的时候买了一颗富贵竹还有弗朗 还有那个啥来着 忘了 还有同事的一颗竹子 随着时间的流逝 弗朗和那我忘记的花都凋谢了 就剩了两棵柱子相依为命，最近发现这两颗竹子长大了。就像芝麻开花 节节高 等它们再打点了弄楼下去种着&nbsp; 咱们也长成参天大树&nbsp;<img src="http://img3.pp.sohu.com/ppp/blog/images/emotion/14.gif" alt="发火" border="0" /> <br />]]></description>
		</item>
		    
		
	</channel>
</rss>
