<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[WPS2000的窝]]></title>
        <image>
        <title>http://hi.baidu.com</title>
        <link>http://hi.baidu.com</link>
        <url>http://img.baidu.com/img/logo-hi.gif</url>
        </image>
<description><![CDATA[]]></description>
<link>http://hi.baidu.com/zhangsilly</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[自由类型--资源型变量]]></title>
        <link><![CDATA[http://hi.baidu.com/zhangsilly/blog/item/9c7e7fdde905cbd38c1029c1.html]]></link>
        <description><![CDATA[
		
		&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 正如我们知道的，PHP的数据结构zval的zvalue_value 字段是一个只能存储long、double、string、HashTable、Object类型的共享体。但我们在扩展中，我们可能会使用许多种自定义数据类型，这些类型如何导入到PHP中呢？资源型变量是一个非常方便的解决方式。<br>
<br>
下文会给出一个非常简单的例子，将一个自定义类型以及相关API包装入PHP。<br>
<br>
万里长征第一步，我们开始制作一个dll吧！在这个dll中，我定义了一个结构体类型，并定义、导出4个操作它的函数。文件如下：<br>
<br>
头文件 sb_lib.h&#160; 文件：<br>
<br>
<span><img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/f82d92ce8e0ffb2c93457e96.jpg"></span><br>
<br>
函数主体 sb_lib.c 文件：<br>
<br>
<span><img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/9757981741ca6026c83d6d90.jpg"></span><br>
<br>
以上两个文件构成我们默认的项目，编译为 dll，得到一个 sb_lib.dll 。好了工程已经走了 60% 了，下面无论是C版本，还是PHP版本，我们都需要调用这个dll，拷贝这个 sb_lib.dll 到 system32 文件夹下，接着执行下面的步骤。<br>
<br>
这一部其实是可选的，之所以放在这里，<font color="#ff0000">主要是面对那些认为凡是扩展因为是C写的一定是高效的想法的，对比PHP调用时的开销</font>，在这一步中，我会编译一个C++版本的程序入口，测试其效率并与PHP扩展wrap后的结果对比效率。在Visual Studio 上面默认解决方案中添加一个新的项目，名字为 main。在项目main上点击右键，将上面定义好的文件 sb_lib.h 添加到项目中（注意，在这里为了表示公平，不要将 sb_lib.c 添加到项目中，因为我希望无论是C版本、还是PHP Wrap过的版本，他们调用的都是同一段Native Code）。在main项目上点击右键，新建项，添加cpp文件 main.cpp 如下：<br>
<br>
<span><img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/f31f92fdb1069a6ad7887d61.jpg"></span><br>
<span><img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/7cd93f06bc90025403088162.jpg"></span><br>
生成项目 main ，得到一个可执行的exe文件，到生成的目录下执行命令<br>
main.exe 100 100000<br>
So Cool, C语言真快！！！<br>
<br>
好了，上面构建的那个main.exe 证明了我们第一步生成的 sb_lib.dll 是可靠的，那么，该到我么包装（wrap）这个dll到PHP中了。八股开始，在Visual Studio中默认的解决方案中再新增一个项目sb，添加php自动生成的ext骨架文件进来（我生成的ext骨架，头文件为 php_sb.h、主体为 sb.c），并添加 sb_lib.h 到项目sb中（注意不要把sb_lib.c添加进来了，为了对比的公平性，我选择不把这些函数编译到 php_sb.dll 扩展中）。<br>
<br>
开始干活，在 php_sb.h 中添加要导出方法声明吧！声明如下：<br>
<span><img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/032bd38b940da0fcfc1f1077.jpg"></span><br>
<br>
然后打开 sb.c ，在 #include *** 下新增一行 <br>
#include &quot;sb_lib.h&quot;<br>
<br>
修改 sb.c 中的函数入口表，将 php_sb.h 中声明的那些函数添加到入口表中：<br>
<span><img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/879412a9023fc7d31f17a27e.jpg"></span><br>
在 sb.c 中定义我们资源性变量的析构函数：<br>
<span><img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/3e254ad5fa73d5eb50da4b79.jpg"></span><br>
修改模块初始化函数，向PHP中注册我的新类型：<br>
<span><img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/401e6ac7dd22f0f3d000607b.jpg"></span><br>
定义我们导出函数的主体：<br>
<span><img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/fdc0238b0f32b13dc9fc7a46.jpg"></span><br>
<br>
Ok，做完上面的步骤，生成项目 sb 为一个dll，将得到的 php_sb.dll 拷贝到PHP（本人使用 5.2.11）到ext 目录下，修改 php.ini ，新增 extension=php_sb.dll 行，哇哦，测试PHP扩展Wrap后的这个dll试试：<br>
<br>
<span><img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/18e94e30750db0b6a8018e4e.jpg"></span><br>
<br>
执行这个PHP文件 <br>
php -q sb.php 100 100000<br>
杯具啊！！！！<font color="#ff0000">这个Wrap过的Extension版本，其效率已经比纯C的版本低了将近10倍了（C++入口和PHP Extension入口，实际上他们都调用的是第一步的 sb_lib.dll）。。。</font><br>
<br>
从上面的例子，你也许已经认识到了Zend Engine的框架限制了程序性能的发挥。回头看看，等等，上面 sb.c 中貌似加了一个名为sum的函数。对的，这就是一个执行加法的函数，下面，我们会对比一下直接使用PHP以及php_sb.dll扩展中的函数的性能。文件名 p.php<br>
<br>
<span><img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/73c73c22f572288b4723e85d.jpg"></span><br>
<br>
命令行执行(调整上面注释的位置)<br>
php -q&#160; p.php 100 100000<br>
以上结果表明<br>
<br>
纯PHP，无函数100000 次加法约耗费0.0367秒（上面 12 + 56 那一行）<br>
纯PHP，使用函数 100000 次加法约耗时 0.18秒（上面 p_sum 那一行）<br>
调用PHP扩展函数，100000 次加法约耗时 0.101 秒（上面sum那一行）<br>
<br>
以上结果表明，在PHP调用扩展中的函数的时候，由于复杂的调用过程，效率未必会有您所期望的性能提升。<br>
<br>
<font color="#cc0000">注：絮絮叨叨的码完了，若有问题需要上面的所有源代码请留言！</font> <a href="http://hi.baidu.com/zhangsilly/blog/item/9c7e7fdde905cbd38c1029c1.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/zhangsilly/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/zhangsilly/blog/item/9c7e7fdde905cbd38c1029c1.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-17  23:54</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Zhangsilly]]></author>
		<guid>http://hi.baidu.com/zhangsilly/blog/item/9c7e7fdde905cbd38c1029c1.html</guid>
</item>

<item>
        <title><![CDATA[Soap简单通吃]]></title>
        <link><![CDATA[http://hi.baidu.com/zhangsilly/blog/item/7b2aaaed5b528e4579f05576.html]]></link>
        <description><![CDATA[
		
		<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  出于业务的需要，和其它部门约定了一个非常复杂的Soap参数格式（多维数组）。他们提供的Soap是使用.Net写的，使用PHP，采用 SoapVar 和 SoapParam 无论如何都无法构建出和 .Net 给出的描述差不多的Soap请求（使用 __getLastRequest 得出）。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  搞了一个多小时，郁闷了，看着 .Net 给出的调用说明，一股想Hack Soap的想法油然而生。NND，为什么不能设置请求体呢?要是能设置请求体的话，照着 .Net 的调用说明拼凑 XML 多好啊！</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  该是动手的时候了！o(∩_∩)o...哈哈，非常简单，Hack完成（人贱合一，果然是最高境界）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  以下代码的作用是，如果 Soap请求的参数只有一个，而且是字符串性质的话，就直接将其作为请求体发出去！除了这点变化外，与PHP自带的Soap扩展无区别（只是利用了OO的一点特性而已）</p>
<p><span><span><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/ed85074e41618b27b2de055d.jpg"><br>
</span><br>
在使用该类的时候，只要在原来传参数的时候，改为传按要求拼凑好的XML就可以了，其它用法一样（上面不就是覆盖掉了 __doRequest 时的请求体嘛）</span></p>
<p> </p> <a href="http://hi.baidu.com/zhangsilly/blog/item/7b2aaaed5b528e4579f05576.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/zhangsilly/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/zhangsilly/blog/item/7b2aaaed5b528e4579f05576.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-03  11:58</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Zhangsilly]]></author>
		<guid>http://hi.baidu.com/zhangsilly/blog/item/7b2aaaed5b528e4579f05576.html</guid>
</item>

<item>
        <title><![CDATA[在PHP扩展中包装C++类]]></title>
        <link><![CDATA[http://hi.baidu.com/zhangsilly/blog/item/a51b80c81c04411d7e3e6f3a.html]]></link>
        <description><![CDATA[
		
		<p>原文： http://devzone.zend.com/article/4486</p>
<p>很久之前，当我遇到这片文章的时候我就将其收藏了，这段时间停了下剑三，而且今天北京下雪，所以想将它翻译一下。不过本人因为换USB无线网卡的原因，Linux系统已经完全格掉了，现在是个纯粹的Windows流。Now，下面给出在Windows下的实践方法。<br>
<br>
注，<font color="#ff0000">请不要将原文的源代码与本文的源代码混用，在有些地方可能不尽相同<br>
阅读本文不需要参照原文，不需要使用原文中的前置步骤（其讲述的是在Linux下的构建步骤）</font><br>
<br>
从cn.php.net 上下载 PHP 源代码以及二进制发行版 （下面使用 5.2.11），解压。<br>
<br>
从命令提示符浏览到PHP源代码包的 ext 目录下，执行命令：<br>
<br>
php -q ext_skel_win32.php --extname=vehicles<br>
<br>
命令提示符输出结果应该如下：<br>
<br>
Creating directory vehicles<br>
Creating basic files: config.m4 config.w32 .cvsignore vehicles.c php_vehicles.h<br>
CREDITS EXPERIMENTAL tests/001.phpt vehicles.php [done].<br>
<br>
To use your new extension, you will have to execute the following steps:<br>
<br>
1. $ cd ..<br>
2. $ vi ext/vehicles/config.m4<br>
3. $ ./buildconf<br>
4. $ ./configure --[with|enable]-vehicles<br>
5. $ make<br>
6. $ ./php -f ext/vehicles/vehicles.php<br>
7. $ vi ext/vehicles/vehicles.c<br>
8. $ make<br>
<br>
Repeat steps 3-6 until you are satisfied with ext/vehicles/config.m4 and<br>
step 6 confirms that your module is compiled into PHP. Then, start writing<br>
code and repeat the last two steps as often as necessary.<br>
<br>
看看 ext 目录下，应该多出一个文件夹 vehicles 。双击文件夹下的 vehicles.dsp （本人因为需要使用OCCI的关系，本机为Visual Studio2005，请注意不同VC版本的细微差异），项目中应该包含两个文件 php_vehicles.h 、 vehicles.c。<br>
<br>
在项目 vehicles 上点击右键，添加 =》类，类名 Car。项目中应该多出两个文件 Car.h 、Car.cpp，修改两个文件定义如下:<br>
<br>
Car.h 文件:<br>
<br>
<span><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/bc85c5ee28187c072cf53463.jpg"></span><br>
<br>
Car.cpp 文件:<br>
<br>
<span><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/0a56b850972580721138c26b.jpg"></span><br>
<br>
然后，修改 vehicles.c 文件，该文件很大仅给出修改部分代码：<br>
<span><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/251f67d3487bf02e3bf3cf26.jpg"></span><br>
<span><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/915ad6d67e35d80106088b2e.jpg"></span><br>
<span><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/251f67d34876f02e3bf3cf2b.jpg"></span><br>
<span><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/67fd40dfc5bacc3d62279832.jpg"></span><br>
上面部分添加在 <span style="color: rgb(0,0,187)">function_entry car_methods</span><span style="color: rgb(0,0,187)">[]&nbsp;&nbsp;&nbsp;&nbsp;  = { </span>之前<br>
修改 PHP_MINIT_FUNCTION 函数如下:<br>
<br>
<span><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/903d59fa255d60b958ee9004.jpg"></span><br>
<br>
修改完毕后，按 Release_TS 配置 生成, 在 PHP源代码目录的 release_ts 目录下可以看到 php_vehicles.dll 已经静静的躺在那里了。拷贝到 PHP二进制ext目录下，修改 php.ini 加载这个扩展，运行原文中例子:<br>
<br>
<span><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/67fd40dfc598cc3d62279810.jpg"></span><br>
它运行的非常棒！</p> <a href="http://hi.baidu.com/zhangsilly/blog/item/a51b80c81c04411d7e3e6f3a.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/zhangsilly/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/zhangsilly/blog/item/a51b80c81c04411d7e3e6f3a.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-01  17:10</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Zhangsilly]]></author>
		<guid>http://hi.baidu.com/zhangsilly/blog/item/a51b80c81c04411d7e3e6f3a.html</guid>
</item>

<item>
        <title><![CDATA[并发相关基本问题【线程局部变量】]]></title>
        <link><![CDATA[http://hi.baidu.com/zhangsilly/blog/item/3aaa53084c7d7fdb63d98601.html]]></link>
        <description><![CDATA[
		
		1、每天吃饭的时候，我们会去食堂拿餐具。然后很多人同时拿着餐具一起夹菜，呵呵这就是并发！但等等，你见过把菜夹到别人碗里去了的哥们么？为什么没有出现我说的情况？我想要点有如下几点：<br>
a、每个人手里的餐具在这段时间内是专属与他一个人的<br>
b、不管在夹什么菜的时候，他手里的餐具还是他自己的那个<br>
这就是线程局部变量（Java文档中给出来的例子比较费解，这里给个简单的版本，没有做任何包装）。<br>
<img border="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/2fe1b8240cc2582c4d088d3f.jpg" small="0" class="blogimg"><br>
这端代码很简单，每个线程都从1，取到9，取9道菜，每次取菜之后检查一下餐具里的菜是不是正好等于我取的道数，如果不等于，则意味着有人把菜弄到我碗里啦！<br>
<br>
无数次的运行证明，我们员工的素质都是很高的，不会出现随意换盘子或者抢别人的盘子的行为。运行结果没有任何警报。 <a href="http://hi.baidu.com/zhangsilly/blog/item/3aaa53084c7d7fdb63d98601.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/zhangsilly/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/zhangsilly/blog/item/3aaa53084c7d7fdb63d98601.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-25  22:32</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Zhangsilly]]></author>
		<guid>http://hi.baidu.com/zhangsilly/blog/item/3aaa53084c7d7fdb63d98601.html</guid>
</item>

<item>
        <title><![CDATA[并发相关基本问题【为什么要关注并发、锁】]]></title>
        <link><![CDATA[http://hi.baidu.com/zhangsilly/blog/item/693f6c6d1ca5c7f14216945e.html]]></link>
        <description><![CDATA[
		
		1、为什么要考虑并发？<br>
请看如下命题，我有10个Worker对像，每个对象会发10次言，每次发言时首先会将自己的名字打印在发言内容之前，然后，紧接着会发表发言内容（内容是 10 个字符 g），发言完后换行。（代码请看下面的 并发.Worker 下的 say 方法）<br>
<img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/f82d92cea7ba0c2e93457e22.jpg"><br>
执行结果如下：<br>
<br>
Thread0Thread3gggggggggg<br>
Thread3gggggggggg<br>
Thread3gggggggggg<br>
Thread3gggggggggg<br>
Thread3gggggggggg<br>
Thread3gggggggggg<br>
Thread3gggggggggg<br>
Thread3gggggggggg<br>
Thread3gggggggggg<br>
Thread3gggggggggg<br>
Thread1gggggggggg<br>
Thread4gggggggggg<br>
Thread4gggggggggg<br>
Thread4gggggggggg<br>
Thread4gggggggggg<br>
Thread4gThread2gggggggggg<br>
gggggggggg<br>
Thread0gggggggggg<br>
Thread0gggggggggg<br>
Thread0gggggggggg<br>
Thread0gggggggggg<br>
Thread0gggggThread2ggggggggg<br>
Thread1gggggggggg<br>
Thread1gggggggggg<br>
Thread4gggggggggg<br>
Thread4gggggggggg<br>
Thread4gggggggggg<br>
Thread4gggggggggg<br>
Thread4gggggggggg<br>
gggggggggg<br>
ggggg<br>
Thread0gggggggggg<br>
Thread0gggggggggg<br>
Thread0gggggggggg<br>
Thread0gggggggggg<br>
Thread2gggggggggg<br>
Thread1ggThread2ggggggggggggggggg<br>
g<br>
Thread1Thread2gggggggggg<br>
gggggggggg<br>
Thread1gggggggggg<br>
Thread2Thread1ggggggggggggggg<br>
Thread1ggggggggggg<br>
Thread2gggggggggg<br>
Thread2gggggggggggggg<br>
<br>
Thread1gggggggggg<br>
Thread2Thread1gggggggggg<br>
gggggggggg<br>
Thread2gggggggggg<br>
成功生成（总时间：0 秒）<br>
<br>
看到这个结果（每次执行结果都不同，但基本上不太可能获得理想的每人发言一行的结果），您一定晕了，我靠，他们抢什么抢啊，太不相亲相爱了吧！ 不好意思，这就是并发问题的由来。等等，我是搞PHP的，不存在线程啊？确实，PHP不存在线程之说，但是无论是多线程，还是多进程，本质上都是一样的，对数据库中的、缓存中的以及文件中的数据来说，上述的并发问题都一样存在！<br>
<br>
请思考如下情况，<br>
您有一个使用积分查看美眉图的页面。当我点击这个页面之后，您页面的某个地方更改了某个代表我积分的$_SESSION 变量（本例以 $_SESSION['code'] 表示），扣掉我的积分，然后做一些清理工作，例如入库啊什么的操作。不好意思，我一直习惯于同时点看N多的连接，同时点击了两个查看美眉图的页面（您单页执行时间20ms的话，可以理解为我20ms内点了多个连接就行了），那么我们从流程上分析会发生生么情。<br>
假定我开始有160分，当A页面开始时,$_SESSION['code'] -= 2 （扣掉了两分，我还有158分，该数据没有真的写入到Session Storage中，Session是当PHP程序终止时或者显示调用session_write_close 时才会写如到storage中的，但无论是否写入storage，都与讨论的结果无关，因为B已经初始化了）；与此同时 B 页面也开始了（注意，B页面初始化Session的时候，由于A没有执行完毕，所以A中对我积分的扣除还没写入到storage中，我刚开始仍然是160分），也扣掉了两分（假定不同的MM图积分数是一样的哈）；您看，我最终会被扣几分？最终结果是，我只被扣掉了2分！仔细想象，有可能A页面先执行完毕，B页面后完，最终的Session会以B页面写入的数据为准，点完这两个页面后，我还是有158分。如果您还提供免费的页面的话，邪恶的说，可以做到不花一点积分看您的MM图哦(仔细想想流程)。<br>
<br>
2、锁<br>
上面的例子真她妈太乱了，能不能让这群人文明点啊！让别人说完再说啊！行，接下来我们开个辩论会好了，给他们加个裁判！裁判同意了才能发言！<br>
<img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/3a84e2197e6c476842a9adcc.jpg"><br>
<img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/4dcf831b635eebf8ac6e75cd.jpg"><br>
<br>
谁拿着牌，谁才能发言！嘿嘿，看谁能黑得过谁！执行结果：<br>
Thread0gggggggggg<br>
Thread0gggggggggg<br>
Thread0gggggggggg<br>
Thread0gggggggggg<br>
Thread1gggggggggg<br>
Thread1gggggggggg<br>
Thread1gggggggggg<br>
Thread1gggggggggg<br>
Thread1gggggggggg<br>
Thread1gggggggggg<br>
Thread1gggggggggg<br>
Thread1gggggggggg<br>
Thread1gggggggggg<br>
Thread1gggggggggg<br>
Thread3gggggggggg<br>
Thread4gggggggggg<br>
Thread4gggggggggg<br>
Thread4gggggggggg<br>
Thread4gggggggggg<br>
Thread4gggggggggg<br>
。。。。。 <br>
下面省略n行，n次执行，虽然发言着顺序不一样，但总归保证了每个人都能把话说完了吧！目的达到了 <a href="http://hi.baidu.com/zhangsilly/blog/item/693f6c6d1ca5c7f14216945e.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/zhangsilly/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/zhangsilly/blog/item/693f6c6d1ca5c7f14216945e.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-25  21:33</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Zhangsilly]]></author>
		<guid>http://hi.baidu.com/zhangsilly/blog/item/693f6c6d1ca5c7f14216945e.html</guid>
</item>

<item>
        <title><![CDATA[我看剑三]]></title>
        <link><![CDATA[http://hi.baidu.com/zhangsilly/blog/item/c202062c2cb8dde68b139927.html]]></link>
        <description><![CDATA[
		
		&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 一直以来，我很少写关于游戏的内容，虽然它现在是我工作之余的主要内容。<br>
<br>
其实凭心而论，剑三现在做的也是相当不错的，即使刚开始游戏内容不怎么丰富，但游戏的平衡性还是值得赞赏的。<br>
<br>
目前，论坛里各个门派都在叫嚣自己门派太弱，以删号为要挟，要求金山加强自己门派。实际上，估计这正是金山目前还没达到暴雪的一个明显例证。要是暴雪，早让玩家死心了！爱玩不玩，休想靠口水操纵平衡性。<br>
<br>
只说说我对熟悉的门派的理解吧。<br>
<br>
纯阳：这是我n次测试中一直主要练的门派。这个门派应该说是比较难上手的一个门派了。纯阳应该说是很有特点的一个门派了，对其它门派来说，两个内功分支其实没有太大差别，例如一个冰心七秀进副本都会换成云裳七秀、傲血天策一旦需要，可以非常方便的换城铁律牢，但对纯阳就不同了，一个纯阳换成另外一种内功（气宗换剑宗或者相反）没有多大实际意义，因为纯阳气宗剑宗的攻击正好是相反的，一个混元性内功攻击，一个外攻攻击。纯阳的练级实际上比其它门派要痛苦，气纯在学四象轮回之前，几乎得和在新手村一样靠回风扫叶踢，而纯阳的练级地点怪有额外要变态一些。纯阳练级一直都不算轻松，论攻击没有万花高，也不像天策那么有霸气，只能说，在任何情况下，纯阳都有一站的能力（风筝流，当前的怪还是都能杀死的）。公测之后，纯阳的打法也更多了一些，至少，不再有那么多的板凳技能了。即使没有参与PK，实际上除了转乾坤没有用过之外，其它的技能用的都比较多了（特别是镇山河，开了70级之后，我发现打小怪都得靠镇山河了）。纯阳的血太少（气宗所有门派中垫底）、无防、导致它中上的攻击力只有在带小号的时候才能完全发挥出来（低等级打高等级会有大量的MISS）。<br>
<br>
天策： 在我了解的门派中，天策还是相当强势的一个门派。在剑三中，你仍然可以看到天策玩家练级时在怪堆里像推土机一样推进去的情况。但老实说，天策是现在最不知足的一个门派了，要加强的呼声是最高的。实际上，他傲血时的攻击力和气纯相差无几，但血却高出一倍。天策要加强的逻辑是，天策是城管，城管怎么能打不过就跑呢？潜意识的认为，天策应该站着直接A就能A过见到的一切。老实说，我当时在飞仙山上练级的时候，长风剑那个任务，作为一个纯阳我每次杀死一个Boss，都一路狂奔，奔到山下脱离战斗（哪个时候当然没有生太极的气场了），然后再上去，我觉得很正常，但居然某些天策玩家觉得这不正常。天策的野战能力是最强的，对气纯，野外偷袭的话一旦远远的一个断魂刺、纯阳就永远的站不起来了。<br>
<br>
万花：一直没有明白，为什么万花会有比作为DPS而存在的纯阳更高的攻击力。万花的瞬间爆发攻击太强，偷袭气纯的话，气纯能做到的估计只是转过身看看是谁偷袭的你。万花估计是一个Bug一样的存在，因为它的攻击高的站不住脚。大家在比较万花和气纯时，因为万花耗内比气纯要多，因此觉得万花在持久攻击输出上的不及气纯的说法是站不住脚的。因为万花的回内技能碧水滔天太过变态（回复内力最大值的60%）、远超过纯阳的抱元守缺（回复固定的一千八百多点内力），在持久输出上，万花未必会输给气纯。万花一直不满的是，它们的技能都要读条（游戏中说是运功时间），但实际上，气纯的技能也都要读条，所有高攻的门派，发招都得读条，除了七秀。<br>
<br>
七秀：一个本来应该完全由女性玩家构成的门派（但实际上并不是），她一直以来在平衡性上就是超过其它门派的存在。估计万花对读条的不满都来自于和七秀玩家的比较吧。在瞬间输出技能上，七秀的攻击是最高的，高到变态。云裳七秀单打无敌就不说了，看看冰心吧。冰心七秀站住不动做炮塔和气纯打，七秀的血下不到一半，气纯就挂了。七秀总是强调七秀的招式有调息时间，但是她们假装对如果气纯的四象轮回改为瞬间释放、两秒调息的话纯阳也就无敌了的事实视而不见（调息时间可以通过跑动来弥补）。七秀 是练级最快的职业，她的抢怪技能真是太变态了。如果你身边有个七秀MM的话，也许你辛辛苦苦打了半天的怪最后系统判定是她的，即使她看起来一招没出（靠剑神无我抢怪）。<br>
<br>
但实际上，上面的这些内容看起来各个门派都不太平衡，但如果真的加入了阵营，则不平衡现象就不会这么严重了。正如您看到的，上面提到的所有不公都来自于偷袭。那么公平的擂台赛如何呢？野战强力的天策和气纯一起垫底了，而在实际的阵营站中，我觉得情况应该更接近擂台赛一点。作为一个气纯，总不可能看到敌对阵营的红名角色之后还不释放纯阳赖以生存的生太极气场吧，这样一来的话，纯阳被天策秒的可能性就几乎没有了。如果看到一个敌对的万花，纯阳实际上是可能杀死一个花间万花的，因为纯阳攻击的所有附加效果均为减速（万花攻击的附加效果都为提高下一招伤害值），而纯阳的攻击距离是高于（或者等于）万花的，另外，纯阳的不读条小招（太极无极）耗内是小于万花小招的，另外，纯阳的盾（坐忘无我）也能消磨掉万花很多的攻击（20多秒的调息时间，除非遇到万花的大招，盾可以抗掉很多次攻击的）。而在野外、冰心七秀遇到天策生存能力很高但杀死天策实际上也很难。<br>
<br>
总的来说，现在剑三里的平衡还不错，即使作为气纯玩家，虽然PK时很不占优势，但是气纯在副本里的表现是相当优秀的。但现在打破平衡的主要来源估计是插件了。对于七秀，其明显超出其它门派的攻击力被剑舞这一个先决条件砍掉了她的机动发招能力（要发大招、必先剑舞、要剑舞、必须站住）。而插件（或者叫宏）则赋予了七秀移动中发大招的能力（宏命令，按下大招之前自动剑舞，大招瞬发之后继续跑动），这已经严重威胁到了门派的平衡了，宏、外挂程序是无法禁止的，唯一能做的也许是得给剑舞这个技能加上一定时间的公共调息时间了（至少得保证七秀在发招的时候是静止的，否则以她过分的攻击力，没有哪个门派可以和七秀一战了）。 <a href="http://hi.baidu.com/zhangsilly/blog/item/c202062c2cb8dde68b139927.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/zhangsilly/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/zhangsilly/blog/item/c202062c2cb8dde68b139927.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-25  15:33</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Zhangsilly]]></author>
		<guid>http://hi.baidu.com/zhangsilly/blog/item/c202062c2cb8dde68b139927.html</guid>
</item>

<item>
        <title><![CDATA[Java还是PHP扩展【优化代码？还是改变结构】]]></title>
        <link><![CDATA[http://hi.baidu.com/zhangsilly/blog/item/17aecf2f29ed5b321e3089a5.html]]></link>
        <description><![CDATA[
		
		&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 一直以来我都有些话想说，今天，我就让天下所有PHP玩家鄙视吧。<br>
<br>
曾经的时候，我也像各位一样，抱着一腔热血，<font color="#cc0000">坚信只要扩展就能救PHP</font>。但是，大约一年前，我已经不这么认为了。<font color="#cc0000">当我提出一个性能问题的时候，总有人会提出用扩展解决，但实际上，我相信，给出这种建议的人估计是没有真正的使用过那个扩展或者是压根没有维护服务器的经验，不知道问题的根本在哪里,完全是意淫。</font><br>
<br>
如果我一直这么说下去，估计大家也都只会认为我是在污蔑，没有真凭实据。下面我讲讲我的一些经历吧。<br>
<br>
我们的项目都是基于PHP、Oracle的。当然，PHP连接Oracle得用到oci扩展，使用这个扩展PHP连接Oracle的性能不知道各位测试过没有。<font color="#cc0000">在采取了Oracle官方给的所有优化建议之后（适当加大 oci_set_prefetch 的值，采用持久连接、基于测试修改游标共享策略），性能仍然离期望的有相当大的距离</font>。<font color="#cc0000">更糟糕的是，持久连接在生产环境下并不是一个有效的优化策略</font>，理由如下：<font color="#cc0000">Oracle服务器可以同时接受的连接数是非常有限的,是非常珍贵的资源</font>，生产环境下的Oracle服务器是由DBA管理的，基本上，他们不会让它处于MTS模式。<font color="#cc0000">前端PHP进程数是远大于可以建立的Oracle连接数的，可以这么认为，绝大多数PHP进程是不可能获得持久连接的。由于PHP的持久连接是基于进程的资源、A进程获得的连接B进程是无法享受的。如果把持久连接的资源也视为一种资源Cache的话，那么实际上生产环境下的命中是非常低的。况且，随着前端PHP服务器的伸展，命中率会越降越低。<br>
</font> <br>
以下给出几个测试结果（很久很久之前测试的，具体的数值已经淡忘了，只记得结论呢了），若有异议，还请各位自行测试下（测试平台如下： Windows XP Sp3、 内存 2.5g（DDR533）、CPU Pentium D 双核2.8G，前端PHP，后端Oracle均安装在一台机器上，数据量100w），测试结果如下（百度表格无法正常显示，以下不以表格形式给出）：<br>
<br>
PHP(5.26) + OCI8 + Oracle 10g + 持久连接 + 绑定变量: 性能最高<br>
PHP(5.26) + OCI8 + Oracle 10g + 非持久连接 + 绑定变量: 上面测试的1/2性能<br>
PHP(5.26) + OCI8 + Oracle 10g + 持久连接 + 非绑定变量: 第一项测试性能的1/3<br>
PHP(5.26) + PHP Java Bridge(Sourceforge版) + DBCP + Oracle + 绑定变量: 约等于第一项测试，略低<br>
PHP(5.26) + PHP Java Bridge(Sourceforge版) + DBCP + Oracle + 非绑定变量: 约等于第一项测试的3/5<br>
<br>
附加非量化的结果: PHP直接通过OCI8扩展连接Oracle，会导致Oracle消耗更多的CPU资源。并且，在Oracle表索引不优化的情况下，PHP通过OCI8连接的性能下降程度远高于PHP通过Bridge使用DBCP访问的下降程度。<br>
<br>
对上面的测试结果，我推测原因如下：OCI8扩展无论是否开启了持久连接，估计初始化、清理过程比较多，导致Oracle服务器消耗更多的CPU（两个版本语句是一样的）。而 Sourceforge版的Java桥，因为它采用http协议传输XML格式的数据（可以理解为简化版本的XML-RPC），也额外的需要消耗一些资源。上面的测试结果只具有一定的参考意义，实际上，生产环境中，需要考虑的东西远比这要多，很显然，上面的测试没有测试网络因素。那么说说生产情况下的结果吧。<br>
<br>
在生产环境下，我将访问次数前10位页面上的数据库请求委托给运行于Tomcat上的使用C3P0访问数据库的XML-RPC（粗粒度的调用），结果是，在一般网络条件下，页面执行时间减少约一半，在网络越不稳定的情况下，性能提升越多，并且极度减少了在网络条件不稳定的情况下FastCGI返回50* Bad Gateway的情况。(只要 DB 和前端不在同一个机房，这个性能提升是相当明显的)。<br>
<br>
下面，我说说经历过的第二个例子。<br>
<br>
有时候，你得接手这种项目、把一些激活码分配给玩家。这是一个简单的项目，逻辑非常简单，不是么。但是，如果有成千上万的玩家同时进来的话，这就不是一个简单的活了。<br>
<br>
你也许会这样做。你的激活码是存放在一张MySQL表中的，表结构也许类似这样：有一个自增的ID、有一列存放这些激活码、还有一列存放玩家的Passport（默认是null、表示还没被使用过），还有一些无关紧要的字段。你可以这样分配一个识别码，先 update `tablename` set `passport` = '玩家的Passport' where `passport` is null limit 1 然后在通过select查找刚才更改的那个激活码进行后续操作，或者说通过 select * from `tablename` where `passport` is null limit 1 for update 锁住在进行操作。但你如果维护数据库的话，你就会发现MySQL进程里密密麻麻都被上面条语句给阻塞了，系统的吞吐量无限接近与0。<br>
<br>
如何解决上述这种问题呢？<font color="#cc0000">Use Java，is Simple！</font>看到上面的自增字段么？如果我们有一个全局的计数器（绝对准确的），当前的计数永远指向下一个待发的激活码ID，那么这条该死的分配语句不就绕开了(变成了使用主键查找一条记录)！那么打造一个可靠的计数器大约需要多久了？<font color="#cc0000">1个小时，花15分钟编写这个计数器，然后花45分钟在各种情况下验证它的可靠性。</font>简易如下的一个类就是可靠的：<br>
<img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/251f67d32e405e2d3bf3cf1d.jpg"><br>
使用Tomcat写个简单的Servlet发布这个类，在一台退役的联想双核服务器上(Oracle JRocket 1.6)，上述计数器方案在前端PHP请求中先HTTP请求一次 hasMoreId ，然后请求一次 getCurrentId ，每秒大约可以处理14000次请求。结论证明，这个简易的计数器无论是性能，还是可靠性都是满足我们的需求的。（<font color="#cc0000">MySQL处理事务事，一般的测试机器sysbench中每秒约可以完成4000次事务</font>，实际上，我们的业务中会比sysbench测试的复杂的多，也就是说，这个计数器的性能是远高于单台MySQL处理的极限的）。<br>
<br>
当然，您可以认为，这种计数器，PHP也很容易做到的。<font color="#cc0000">文件存储计数器的方案估计您是不会提的，毕竟可靠性、效率都是相当的低</font>。您估计会觉得，<font color="#cc0000">使用 Memcache 来完成啊！</font>我同意，Memcache是可以完成一个计数器的，因为 <font color="#cc0000">incre 指令是原子的</font>(也就是说：Memcache::increment 应该是原子操作，不会出现计数不准确的情况)。那么，<font color="#cc0000">咱们来讨论讨论这个计数器的数据初始化问题吧，请问这里您怎么保证数吧个PHP处理进程之间互斥不导致n个PHP进程同时进行数据初始化（从数据库里求数据，然后把这个数据存到Memcache中）？Memcache作为存储设备是不可靠的，即使是在内存足够的情况下（时间越长越有可能发现这种情况），数据的初始化可能发生在任何时候(一旦原值丢失，都会导致重新初始化数据)，这不是人手工通过防火墙限制访问能够解决的</font>。BTW：上面的内容也许对一个PHP初级玩家来说，太高深了，毕竟很多人看待PHP执行的时候还是从PHP源代码的第一行看到最后一行的，而不会考虑其它进程对它的影响。那么，<font color="#cc0000">说点简单的吧，您写个PHP 的 Hello World 然后使用 ab 测试一下压力，每秒能处理多少次请求? 3000次每秒？OMG、即使是您使用Memcache写的计数器就像您写的Hello World一样高效，估计您的上司听到这个数据也不会满意的，您的这个计数器早于数据库本身让系统的扩展性达到瓶颈啊。</font><br>
<br>
很长时间以来，我一直在考虑一个问题。当遇到PHP性能瓶颈问题的时候，我们第一反应就是使用扩展代替它的考虑是不是对的。例如，使用扩展版本的纯真IP解析扩展代替CoolCode的PHP版本，但当你真用扩展替代了原来的PHP版本，才发现系统的性能没有提升(当然不可能有性能提升。我维护的不是ip138)。<font color="#cc0000">依据日志去优化系统，而不是YY</font>。<font color="#cc0000">性能问题，很多都是结构上的，而非代码级别的，扩展不是出路，跳出PHP思维的枷锁才是王道。</font><br>
<br>
海龙和我讨论过<font color="#cc0000">如何写好一个Web Game</font>。对市场方面，我不了解，但对技术方面，我还是坚定的坚持我当时的理解。<font color="#cc0000">使用Java制作PHP与MySQL的中间件，PHP只通过Socket与Java中间件打交道、Java维持前端数据与数据库中数据的同步，这样的Web Game才能保证Web Game本身的高性能</font>。（他主业是PHP，但对Java也有相当的了解，我看来一个人实现这个中间件，使用Java的话并不是不可实现的难题）<br>
<br>
对扩展的崇拜，可能是源自对C语言性能的盲目崇拜。但请注意，<font color="#cc0000">您用C语言编写自己的扩展的时候，您也不是连最基本函数也从头码起，您得使用很多库（至少，您得符合Zend Engine的框架吧），库是否高效，您 想过没有，这与Java是否高效，已经是一码事了，把高性能的一些先决条件交给了别人</font>。要不，<font color="#cc0000">为什么基于Java 的Quercus引擎为什么会比基于C的原生PHP引擎高效哪么多呢</font>？（您可以使用Tomcat + Quercus 试试，实际上这种方案，PHP是不会编译为Java的Class的，但效率乐观的说，会是原生PHP引擎的8倍以上）。 <a href="http://hi.baidu.com/zhangsilly/blog/item/17aecf2f29ed5b321e3089a5.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/zhangsilly/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/zhangsilly/blog/item/17aecf2f29ed5b321e3089a5.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-25  12:19</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Zhangsilly]]></author>
		<guid>http://hi.baidu.com/zhangsilly/blog/item/17aecf2f29ed5b321e3089a5.html</guid>
</item>

<item>
        <title><![CDATA[高效的制作一些小工具【Demo】]]></title>
        <link><![CDATA[http://hi.baidu.com/zhangsilly/blog/item/d9f5e999e9f42a026f068cb5.html]]></link>
        <description><![CDATA[
		
		&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 常常有需求制作一些小工具，无论是服务器端的还是客户端的。通常来说，我并不认为图形界面是必须的，但不得不承认，有时候有个图形界面确实还是蛮爽的。<br>
<br>
上周，同事基于我之前编写的SQL Proxy制作了一个图形界面工具，其PHP的客户端代码翻译成C++、最爽的是，利用QT提供了一个明显比print_r优秀得多的显示效果。<br>
<br>
很久没有编写过GUI的程序了。虽然QT看起来确实很舒服，但开发效率个人觉得还是不够高。这里，我还是想介绍怎么使用Java在一个小时内编写这种小工具。（本文假设你对Java、NetBeans的了解程度仅限于听说过，事实上，下面的代码估计大家认为远不需一个小时）。<br>
<br>
IDE我还是选择NetBeans（6.7.1），Eclipse的资源消耗我的机器吃不消。<br>
<br>
首先，新建一个工程： 选择 <font color="#660000">Java 桌面应用程序</font><br>
<br>
<img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/931d2dd9d4c6abc438012fb1.jpg"><br>
<br>
点击 <font color="#660000">下一步</font><br>
<br>
<img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/a2898009360636afd0581bb3.jpg"><br>
<br>
选择 <font color="#660000">基本应用程序</font>，点击<font color="#660000">完成</font>（试试 数据库应用程序，那真是相当好的一个例子）。 NetBeans应该会自动打开设计窗口（如果没有自动打开，或者不小心被你关了，你可以点击最左边项目标签下，DesktopApplication1 项目下，源包，打开下面的 ******View.java 文件）<br>
<br>
<img border="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/4c08dc105b0e932c203f2e82.jpg" small="0" class="blogimg"><br>
<br>
拖动一个 <font color="#660000">文本区域</font> 到窗体上方、拖动一个 <font color="#660000">滚动窗格</font> 到下方，摆放如图：<br>
<br>
<img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/5ed74c950a8ea8257af48090.jpg"><br>
<br>
拖动一个<font color="#660000">表</font>（JTable ）到 下面的 <font color="#660000">滚动窗格</font>(JScrollPane) 中：<br>
<br>
<img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/0dbc04fba707e93b6c22eb9f.jpg"><br>
<br>
点击 NetBeans 工具栏上的<font color="#660000">绿色大箭头（运行主项目）</font>，预览：<br>
<br>
<img border="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/ed1500da36c892f6b7fd4866.jpg" small="0" class="blogimg"><br>
<br>
最大化，最小化这个窗口试试，如果 其中的表格以及文本区域不跟着窗口的变化而变大缩小的话，请进入设计窗口，右键点击控件，选择<font color="#660000">自动调整大小</font>，勾上 <font color="#660000">水平</font>、<font color="#660000">垂直</font>就行了（在属性面板的 layout 下也可以设置）。<br>
<br>
好了，开始自定义表格的数据吧，总不至于就显示title1、title2 之类的吧。右键点击表格控件，弹出菜单中选择第一项，<font color="#660000">表内容</font>， 弹出窗口如下，先选择<font color="#660000">列</font>标签：<br>
<br>
<img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/bc85c5ee833d91042cf53445.jpg"><br>
<br>
然后选择<font color="#660000">行</font>标签，将<font color="#660000">计数</font>设置为 0（删除所有的行），点击 <font color="#660000">关闭</font>。现在窗口（预览）应该如下：<br>
<br>
<img border="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/18e94e30106613b4a8018e26.jpg" small="0" class="blogimg"><br>
<br>
Ok，该是时候给这个窗体增加点功能了。要不这样，约定在上面的文本区域里输入一个数字、然后按下F8，则在下面的表格中创建这么多行数据。<br>
<br>
定义生成数据的函数（暂时直接在 DesktopApplication1View.java 尾部直接添加如下代码 ）<br>
<br>
<img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/e4eed6940b8dd633d31b702a.jpg"><br>
<br>
在<font color="#660000">文本区域</font>上点击右键，<font color="#660000">事件</font>，选择<font color="#660000"> key</font> ， 然后选择 <font color="#660000">keypressed</font>， NetBeans会为你自动生成事件处理函数。在函数体中添加几行代码：<br>
<br>
<img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/8ed83a63d37bc04d0d33fa3a.jpg"><br>
<br>
Ok，完成这些，预览效果(上面文本框中输入数字，按 F8 刷新下面 表格)。<br>
<br>
<img border="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/f8448043672e7a3e72f05d00.jpg" small="0" class="blogimg"><br>
<br>
对了，我想让我的表格奇数行和偶数行颜色不一样，咋办？在表格控件上点击右键，选择 <font color="#660000">定制代码</font>，在NetBeans为我们定义好的代码<font color="#660000">最后面</font>，添加如下代码：<br>
<br>
<img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/2b04fc6e68b1faf780cb4a10.jpg"><br>
<br>
好了，表格当然要支持排序啦。So easy，在刚才的<font color="#660000">定制代码</font>窗口中，增加一行 jTable1.setAutoCreateRowSorter(true);&#160; That‘s enough！（你也可以在表格控件的<font color="#660000">属性面板</font>里勾上 <font color="#660000">autoCreateRowSorter</font> ）。预览（点击表头排序）：<br>
<br>
<img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/e4d664fa274fd0a49f5146e5.jpg"><br>
<br>
O，太简单了，不过，我们是不是得提供表格<font color="#660000">数据的复制</font>呢？继续返回我们的设计器。在表格控件上点击右键，选择<font color="#660000">事件</font>，再选择<font color="#660000">key</font>、然后选择<font color="#660000">keyPressed</font>，和上面的F8快捷键一样，NetBeans还是会给我们创建一个方法，补充几行代码如下：<br>
<br>
<img border="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/afeca9dc708f118ccc1166ea.jpg" small="0" class="blogimg"><br>
<br>
于是，整行复制的功能就完成了，选择其中一行，按下 Ctrl + C， 打开一个记事本粘贴。o(∩_∩)o...哈哈，复制功能完成。<br>
<br>
已经扯了很长了，哦，貌似光截图啊。不过使用NetBeans编写一些GUI的小工具确实就是这么简单:-) <a href="http://hi.baidu.com/zhangsilly/blog/item/d9f5e999e9f42a026f068cb5.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/zhangsilly/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/zhangsilly/blog/item/d9f5e999e9f42a026f068cb5.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-20  16:19</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Zhangsilly]]></author>
		<guid>http://hi.baidu.com/zhangsilly/blog/item/d9f5e999e9f42a026f068cb5.html</guid>
</item>

<item>
        <title><![CDATA[Linux下PHP socket问题]]></title>
        <link><![CDATA[http://hi.baidu.com/zhangsilly/blog/item/c30fe58f5e05dee4f11f3649.html]]></link>
        <description><![CDATA[
		
		&#160;&#160;&#160;&#160;&#160;&#160;&#160; 因为一些原因，花了一天时间将原来的基于XML-RPC的调用改为直接通过TCP协议完成，不再走HTTP协议(不再使用繁重的XML通讯，采用<a href="http://java.net/project/phpserializer" target="_blank">phpserializer</a> 传输)。服务基于MINA，实现特定的Codec也不困难，但最麻烦的事情在于：在Linux下，读取一个socket中的内容，无论是采用 fread($sock, 4096) 还是 stream_socket_recvfrom($sock, 4096) 在Linux (Windows没问题)下都不能保证正确的读出指定长度（4096byte）。也就是说：<br>
<br>
function readSocket($socket)<br>
{<br>
$str = '';<br>
do<br>
{<br>
$l = stream_socket_recvfrom($socket, 4096);<br>
$str .= '';<br>
}<br>
while (strlen($socket) === 4096);<br>
return $str;<br>
}<br>
<br>
是无法正确的读出所有的返回内容的，在非Windows 系统下(Linux以及Mac OS), 每次 stream_socket_recvfrom或者fread从socket读出的内容长度是固定的若干种值，在我的测试机上1460以及2000是常出现的情况。当然:<br>
function readSocket($socket)<br>
{<br>
$str = '';<br>
while($l = stream_socket_recvfrom($socket, 4096))<br>
{<br>
$str .= $l;<br>
}<br>
return $str;<br>
}<br>
这个函数则更加糟糕，它会导致整个程序挂起，一直处于等待中，直到等到服务器端设置的Idle时限为止。出现这种状况的原因是，当最后一次stream_socket_recvfrom 或者 fread 的时候，如果缓冲区里真的没有内容的话（期望 stream_socket_recvfrom 读出空），这个函数调用会挂起，等待缓冲区填充内容以完成这次读取（也就是说，退出的条件本身不太可能发生，永远到不了头）。<br>
<br>
stream_set_blocking($socket, false) 则是更糟糕的。它将直接导致 stream_socket_recvfrom无论缓冲区里有没有内容，都直接返回。基本上，如果采用这种模式的话，发送请求后，立即从 socket 里读取的话，结果都是空。<br>
<br>
注意 stream_socket_recvfrom($socket, 4096, STREAM_OOB) 、stream_socket_recvfrom($socket, 4096) 、stream_socket_recvfrom($socket, 4096, STREAM_PEEK) 的区别。<br>
<br>
最后，和ProtocolDecoder 一样，在ProtocolEncoder中在编码数据的末尾添加特定的标志（传输的内容中不肯能出现的控制字符，方向键），客户端检测该标志解决此问题。 <a href="http://hi.baidu.com/zhangsilly/blog/item/c30fe58f5e05dee4f11f3649.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/zhangsilly/blog/category/Php">Php</a>&nbsp;<a href="http://hi.baidu.com/zhangsilly/blog/item/c30fe58f5e05dee4f11f3649.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-09  23:09</pubDate>
        <category><![CDATA[Php]]></category>
        <author><![CDATA[Zhangsilly]]></author>
		<guid>http://hi.baidu.com/zhangsilly/blog/item/c30fe58f5e05dee4f11f3649.html</guid>
</item>

<item>
        <title><![CDATA[PHP的Session]]></title>
        <link><![CDATA[http://hi.baidu.com/zhangsilly/blog/item/5bb15d334d8be2f21b4cffcf.html]]></link>
        <description><![CDATA[
		
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;  对PHP的Session不满很久了，一直以来都缺乏一个很好的Storage。默认的file，不看日志还好，一看总会吓一跳，毛毛多的session_start slow（机器负载很轻、IO也没有任何问题），google一下 session_start slow，抱怨的人还真不少。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;  存储到Memcache里去吧，Memcache的LRU(slab内LRU，即使Memcache还有空闲内存也会丢失数据)真是一个问题，常常发现Session还没超时，session就找不到需要重新登陆了。咨询了一下张宴，Memcachedb不支持expires，而且还没有办法遍历整个存储，用来作为session的storage就很不合适了。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;  一直有一个想法，想做一个Session Server，苦于没有时间总是无法付诸实现（小穆也不赞成，认为不利于以后其它人接手）。不得以，还得在 /dev/shm 下建3级目录（16 * 16 * 16）强撑着（可以说，超过99.99%的情况下，使用本地文件作为session的storage都是Ok的，但偶尔会卡一下，而且一卡就会很严重，甚至达到数十秒级）。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;  使用多级目录存储Session，创建目录的脚本PHP已经自带了。但要注意，一旦使用多级目录存储Session、GC也得自己管理了。换句话说，PHP管杀不管埋，过一两天，find看看，目录下已经有几百万个Session文件了。当然，GC也很容易，比较懒，直接在 crontab 里加一行:<br>
*/5 * * * * find /dev/shm -type f -cmin +24 -print | xargs rm -f<br>
就行了</p> <a href="http://hi.baidu.com/zhangsilly/blog/item/5bb15d334d8be2f21b4cffcf.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/zhangsilly/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/zhangsilly/blog/item/5bb15d334d8be2f21b4cffcf.html#comment">查看评论</a>]]></description>
        <pubDate>2009-09-14  15:36</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Zhangsilly]]></author>
		<guid>http://hi.baidu.com/zhangsilly/blog/item/5bb15d334d8be2f21b4cffcf.html</guid>
</item>

<item>
        <title><![CDATA[我还活着~~]]></title>
        <link><![CDATA[http://hi.baidu.com/zhangsilly/blog/item/1fffe838927b4bc8d4622562.html]]></link>
        <description><![CDATA[
		
		<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  离上次更新Blog确实已经比较久了，不过各位朋友请放心，偶还活着，正在剑侠的世界里行侠仗义，一心一意的做一个好铁匠...</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  公测后，我还是练了一个纯阳，不过这次是专心练的气纯。偶尔看看论坛，也会提到纯阳是最飘逸的一个门派，但在公测之前，我从来没觉得。现在，我终于领会了，飘逸是一个什么意思了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  纯阳的血（气纯）是各大门派垫底的，而且还没有基础防御（防御全靠装备、但在满级之前，装备一般都乱到不加什么防御），应该说，是整个世界里有名的脆脆，被碰两下，血条就看起来特恐怖了。公测的时候，我终于领会到了什么叫飘逸（或者叫风骚），从38级（准确的说，是36级）开始，所有的二人精英（除了八歧大蛇，阿里曼祭司也比较难打，内力不够，但熬到两次抱元守缺，也可以杀死），一个人都轻松杀过了，无论周围有多少小怪。纯阳可以在密密麻麻的小怪群中杀死老大，然后全身而退，全凭自己那最最孱弱的身躯（很多时候，为了抢怪，不论自己血是否是红的，奔到就直接开始，即使本来血量比小怪都还少）。纯阳是最有武侠情调的，我觉得，不像天策，太过霸气，一路像推土机一样，二人精英也是站着对轰就能打过。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  老实说，纯阳两个分支都不错，在三测的时候，一个剑纯居然能够杀死一个五人精英（一队人未必能够打得过，还n次团灭）。当然，不论是那个分支的纯阳，都要靠操作，而气纯的操作明显要简单于剑纯，虽然剑纯的血是气纯的两倍，并且剑纯是有外防的，但剑纯操作不好连打小怪都不行。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  剑三有点地方很变态，副本里的怪太强，对气纯来说，挨三下必死。所以纯阳在副本里不太受人待见。想想这也是应该的，倘若副本里的怪攻击不是这么变态的话，恐怕就会出现牛逼的纯阳单刷副本了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  纯阳的飘逸中也充满了猥琐。很多任务是一些采集任务，作为一个纯阳，开了坐忘无我一路生太极在怪堆里强采任务物品（或者是矿等，在坐忘无我效果没有被打掉之前，所有的攻击直接显示化解，不会打断你的采集动作），回头看看，身后毛毛多的怪像小学生放学跟着队长一样跟着你，那是多么有成就感的一件事啊！回头看看那些武林称霸，号称城管的天策，还得想推土机样推进来，是不是更有成就感了？<img src="http://img.baidu.com/hi/jx/j_0045.gif"></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  梯云纵，应该说是纯阳的最大特色了（当然，范围控制技能应该也是一大特色，估计更重要），极大的简化了纯阳的跳山操作。梯云纵，跳得最高，还可以从水中起跳，不必要像替他门派一样，需要跳出水面之后再使用轻功，并且，使用梯云纵的时候，是可以在空中发招。想象一下，一个纯阳拖着一把剑一路奔过，即使前面有山坡也直接梯云上去，落地之前已经发了重重的一招（两仪化形），落地开始生太极一路风筝，直到怪死，碰都碰不到你一下，即使是电影中的英雄，也不过如此吧。</p> <a href="http://hi.baidu.com/zhangsilly/blog/item/1fffe838927b4bc8d4622562.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/zhangsilly/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/zhangsilly/blog/item/1fffe838927b4bc8d4622562.html#comment">查看评论</a>]]></description>
        <pubDate>2009-09-12  12:42</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Zhangsilly]]></author>
		<guid>http://hi.baidu.com/zhangsilly/blog/item/1fffe838927b4bc8d4622562.html</guid>
</item>

<item>
        <title><![CDATA[MySQL函数与存储过程]]></title>
        <link><![CDATA[http://hi.baidu.com/zhangsilly/blog/item/e1d1eba1b026a38246106476.html]]></link>
        <description><![CDATA[
		
		&#160;&#160;&#160;&#160; 一直在Oracle中写存储过程，直到发现反恐居然也使用MySQL写存储过程。<br>
<br>
编写MySQL的存储过程很容易。例如，创建表结构：<br>
<br>
CREATE TABLE IF NOT EXISTS `ooo` (<br>
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,<br>
`sex` char(1) CHARACTER SET gb2312 NOT NULL,<br>
`age` smallint(3) unsigned NOT NULL,<br>
`money` float NOT NULL,<br>
`create_time` datetime NOT NULL,<br>
PRIMARY KEY (`id`)<br>
) ENGINE=InnoDB&#160; DEFAULT CHARSET=gbk <br>
<br>
编写存储过程创建测试数据:<br>
<br>
<br>
<img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/55e95dd7d9e63cf7a044dfa5.jpg"><br>
<br>
执行 call create_data(10000); 创建测试数据，编写查询存储过程:<br>
<br>
<img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/49e05b556ad040eeb645aea2.jpg"><br>
<br>
执行该存储过程，结果如下:<br>
<br>
<img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/1d24b1feeee9171b5d6008ac.jpg"><br>
<br>
自定义函数要 5.1 以上才支持，编写一个累加求和的函数:<br>
<br>
<img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/9bc9c62b6bd79ed0e7cd40a8.jpg"><br>
<br>
执行结果如下:<br>
<br>
<img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/9d9a8013bf2229285baf53aa.jpg"> <a href="http://hi.baidu.com/zhangsilly/blog/item/e1d1eba1b026a38246106476.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/zhangsilly/blog/category/Php">Php</a>&nbsp;<a href="http://hi.baidu.com/zhangsilly/blog/item/e1d1eba1b026a38246106476.html#comment">查看评论</a>]]></description>
        <pubDate>2009-08-24  18:22</pubDate>
        <category><![CDATA[Php]]></category>
        <author><![CDATA[Zhangsilly]]></author>
		<guid>http://hi.baidu.com/zhangsilly/blog/item/e1d1eba1b026a38246106476.html</guid>
</item>

<item>
        <title><![CDATA[使用Java虚拟机运行PHP]]></title>
        <link><![CDATA[http://hi.baidu.com/zhangsilly/blog/item/8848f80147a8f20f1c95831f.html]]></link>
        <description><![CDATA[
		
		<p>自从Google app支持Java之后，就有若干发烧友采用越狱方案把自己的Web应用放到Google上。第一时间，我也试图在Google上放个博客，采用的方案就是Quercus（后来，因为发现写那玩意儿必须安装Eclipse，我的机器运行这玩意儿太凑合，于是就放弃了）。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;  几个月后的今天，作为PHPe的老会员偶尔回去看看，居然发现PHPe也在采用 Quercus 运行 PHPWind的方案了，惊奇啊！！！同时，同事现在也准备利用Java越狱Google，于是重新看了看Quercus。本人对 Quercus 了解的不多，而且也比较孤陋寡闻，平常看看小说练练级，感觉已经差不成山人一个了。况且，我对Resin过敏，向来都是以Tomcat为中心的，估计 Quercus 特性也未必能完全发挥。不过至少有一点，我特别 喜欢，采用 Quercus 的话，给PHP 写扩展实在是太方便了，而且还支持PHP、Java混写，真是爽死了（虽然不是一个好习惯）。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;  从性能上讲， Quercus 真的比 C版的PHP快很多，4倍的性能提升真的不是盖的。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;  我做了如下一个测试：</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;  CPU: Intel Pentium D 2.8G<br>
RAM: 2.5G(DDR 533)<br>
OS: Windows XP SP2<br>
PHP全套: Apache 2.2 + PHP5.26<br>
Java全套: Sun Java VM 1.6 update 14&#160;&#160;&#160;&#160;  Tomcat 6.0.18&#160;&#160;&#160;&#160;  Quercus3.21<br>
测试代码: CodeIgniter_1.7.1 默认页面<br>
<br>
Java版配置:<br>
拷贝Quercus WEB-INF/lib 下的 3 个jar文件到 Tomcat 根目录下的 lib 下，并修改 Tomcat conf 下的 web.xml ,让Quercus 全局范围内拦截所有 *.php 的请求，其它均默认。<br>
PHP环境，开GD、MySQL扩展<br>
<br>
Quercus ab结果：<br>
<img border="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/5c50d10ada11ce17b0351da0.jpg" small="0" class="blogimg"></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;  Native PHP 测试结果:</p>
<p align="left"><img border="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/8848f80179c31c2f1c9583a2.jpg" small="0" class="blogimg"></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;  结论：<br>
<font color="#0000ff">Quercus 运行 PHP ，在执行复杂程序时，性能远超原生的PHP</font>（上面可以看到几乎是 8 倍）。直接看CodeIgnitor 下的Bench时间， Quercus 页面执行时间小于 0.016 秒，原生PHP +　Apache 的组合 执行时间均大于 0.035秒。难怪wiki.php.net 上，很多项目都想着从Zend上越狱！Zend这个解析器，确实是太慢了！</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;  附加说明:<br>
Quercus 只进行简单的函数bench确实有可能不如原生的PHP（同事的测试证明）。<br>
内存占用率，原生PHP + Apache ，httpd进程约占用 61M；Quercus 下 Tomcat 约占用 70M 内存<br>
CPU利用率，两者均达到90 ~ 95 % （Windows 任务管理器）<br>
<font color="#0000ff">Native PHP 安装 eAccelerator 之后，对复杂应用程序一般有明显的提高。但同时， Quercus 也没有开启编译（Tomcat上，一旦开启，控制台会出现大量的异常，提示找不到包，估计那些包只有Resin有吧），另外Sun 的VM性能也不怎么样，换Oracle JRocket 也会有明显的性能提升。<br>
</font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;  未测试部分:<br>
Quercus 下PHP的数据库的性能是否会提高（但通常来说，Java数据库操作性能、文件IO性能均高于原生PHP，相信 Quercus 在这部分也会高于原生PHP，但仍待验证)</p>
<p>==================================================================================</p>
<p>尝试了一下连库（MySQL），性能也很强劲！唯一不爽的是，一旦程序使用了某些加密方式（例如phpMyAdmin），就会报：</p>
<pre>java.lang.RuntimeException: java.security.InvalidKeyException: Illegal key size 的异常<br><br>google了一下，貌似是JDK不支持这种加密方式，貌似下载第三方的jar可以解决这个问题</pre> <a href="http://hi.baidu.com/zhangsilly/blog/item/8848f80147a8f20f1c95831f.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/zhangsilly/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/zhangsilly/blog/item/8848f80147a8f20f1c95831f.html#comment">查看评论</a>]]></description>
        <pubDate>2009-08-06  23:38</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Zhangsilly]]></author>
		<guid>http://hi.baidu.com/zhangsilly/blog/item/8848f80147a8f20f1c95831f.html</guid>
</item>

<item>
        <title><![CDATA[终于跳上了巴陵县门口的柱子！哈哈]]></title>
        <link><![CDATA[http://hi.baidu.com/zhangsilly/blog/item/ccd2c3451bb95e3686947368.html]]></link>
        <description><![CDATA[
		
		<div align="left" forimg="1"><img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/81e462fab8125936a9d311f7.jpg"></div>
<br>
看镇内：<br>
<br>
<div align="left" forimg="1"><img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/3a0033d9424fa80410df9bf3.jpg"></div>
<br>
<br>
<div align="left" forimg="1"><img border="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/e1899dbf6ab4ad2318d81f4b.jpg" small="0" class="blogimg"></div>
<br>
<br>
<div align="left" forimg="1"><img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/49e05b5536b914ecb645aeff.jpg"></div>
<br>
<br>
<div align="left" forimg="1"><img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/a083c922bbacf3dbd6cae2f9.jpg"></div>
<br>
<br>
唐朝的基础建设啊！这么远的绳桥还要求2分30秒跑过（上图我已经跑了至少一半了，但最终还是掉下去了）（唐朝已经有 分钟、秒的概念了么？），还得过去采药并且跑回去！！！！<br>
<br>
下面为直接从起点看<br>
<br>
<div align="left" forimg="1"><img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/e1d1eba182bd8da3461064c2.jpg"></div>
<br>
<br>
操作真的太牛X了，真佩服我自己，从绳桥上掉下去，居然没死，还跑上来了。。。。哈哈哈<br>
<br>
<div align="left" forimg="1"><img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/b795baf8ccfcae27d8f9fdcf.jpg"></div> <a href="http://hi.baidu.com/zhangsilly/blog/item/ccd2c3451bb95e3686947368.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/zhangsilly/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/zhangsilly/blog/item/ccd2c3451bb95e3686947368.html#comment">查看评论</a>]]></description>
        <pubDate>2009-07-31  21:51</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Zhangsilly]]></author>
		<guid>http://hi.baidu.com/zhangsilly/blog/item/ccd2c3451bb95e3686947368.html</guid>
</item>

<item>
        <title><![CDATA[纯真IP解析每秒能解析100w次了]]></title>
        <link><![CDATA[http://hi.baidu.com/zhangsilly/blog/item/77c1e812cde18ec7c3fd7893.html]]></link>
        <description><![CDATA[
		
		<p>测试环境：<br>
<br>
网上下载的版本均不能很好的满足我的要求（主要用于资料分析），重新改写了一下（和网上的开源版本已经没有任何关系了，即以下 IpSeeker类、该类线程安全、并在我的适用范围下更快速）<br>
<br>
Intel 1.6G（奔腾双核），内存2G, Windows XP Sp2、Java SDK1.6<br>
<br>
10线程生成、解析IP得到上述结果(从任务管理器上看，CPU利用率不高)<br>
<br>
测试代码（IpEntry既是返回的IP信息，除了纯真的所有信息外，另带加工后的省份编码）：</p>
<div forimg="1" align="left"><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/e71b2acb49bf7b38bf09e696.jpg"><br>
<div forimg="1" align="left"><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/3a97a31ffbf7e244f724e493.jpg"><br>
<div forimg="1" align="left"><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/zhangsilly/pic/item/ea651bed217301f3b31cb19d.jpg"></div>
</div>
</div> <a href="http://hi.baidu.com/zhangsilly/blog/item/77c1e812cde18ec7c3fd7893.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/zhangsilly/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/zhangsilly/blog/item/77c1e812cde18ec7c3fd7893.html#comment">查看评论</a>]]></description>
        <pubDate>2009-07-11  14:06</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Zhangsilly]]></author>
		<guid>http://hi.baidu.com/zhangsilly/blog/item/77c1e812cde18ec7c3fd7893.html</guid>
</item>


</channel>
</rss>