<?xml version="1.0" encoding="UTF-8"?><!-- generator="WordPress/2.8" -->
<rss version="0.92">
<channel>
	<title>Some reminiscences, some memories</title>
	<link>http://www.mikespook.com</link>
	<description>Just another boring day</description>
	<lastBuildDate>Tue, 30 Jun 2009 09:35:43 +0000</lastBuildDate>
	<docs>http://backend.userland.com/rss092</docs>
	<language>en</language>
	
	<item>
		<title>SB玩家，大家围观</title>
		<description>别人发群上的，非常搞笑。转到这里，给大家围观一下……

/*-----------------------------------------------------------------*/

某马甲悄悄的对JJ说：珊瑚舞，怎么才能离开公会啊？
珊瑚舞悄悄的对[某马甲]说：/GQUIT
珊瑚舞离开了公会。
[公会][幸福晨晨]：？？？
珊瑚舞加入了公会。
[公会][卡卡呦]：欢迎回来！
[公会][幸福晨晨]：饿.....
[公会][卡卡呦]：355，你怎么走了？
[公会][珊瑚舞]：毛巾花露水的！有S B害我，问我怎么退出工会。
[公会][幸福晨晨]：那你是怎么回答的？
珊瑚舞离开了公会。
[公会][幸福晨晨]：？
[公会][卡卡呦]：......汗!!
[公会][疯狂暴击]：。。。。。。。
[公会][卡卡哟]：。。。。。。。
珊瑚舞加入了公会。
[公会][卡卡呦]：再次欢迎355回来
[公会][幸福晨晨]：JJ，你怎么又走了？
[公会][珊瑚舞]：少装蒜，还不是你害我！
[公会][幸福晨晨]：我怎么害你了？
[公会][珊瑚舞]：你问我怎么回答退会指令的！
[公会][幸福晨晨]：那你是怎么回答的啊？
珊瑚舞离开了公会。
[公会][幸福晨晨]：。。。。。这里不适合我?我回火星去了.
幸福晨晨下线了。
珊瑚舞加入了公会。
[公会][卡卡呦]：再次再次欢迎355回来。。。
[公会][疯狂暴击]：毛了毛了,老婆你退来退去的干什么呢？
[公会][珊瑚舞]：。。。有人害我。。。
[公会][疯狂暴击]：？
[公会][珊瑚舞]：他们问我怎么退会
[公会][疯狂暴击]：你怎么回答的？
[公会][珊瑚舞]：。。。你猜？
疯狂暴击离开了公会。
[公会][珊瑚舞]：毛了毛了。。。BJ和我一样S B！！真没选错人.
疯狂暴击加入了公会。
[公会][珊瑚舞]：哈哈，回来啦？记得下次在前面加个空格哦。
[公会][疯狂暴击]：在什么前面加空格？
珊瑚舞离开了公会。
[公会][卡卡哟]：。。。服了！！！
[公会][卡卡哟]：在/gquit前面加空格，就行了。
疯狂暴击开了公会
[公会][卡卡哟]：。。。
珊瑚舞加入了公会。
[公会][珊瑚舞]J那个死人呢？！！！
[公会][卡卡哟]：畏罪潜逃了。。。
疯狂暴击加入了公会。
[公会][疯狂暴击]：日，空格键坏了。
[公会][魍魉魑魅俊]：怎么了？
[公会][珊瑚舞]：有人骗我退出工会
[公会][魍魉魑魅俊]：那你怎么回答的？
[公会][珊瑚舞]：你少忽悠我！
[公会][卡卡哟]：还是我来解释吧，这两个要再说没准又要退会了。
卡卡哟离开了工会。
[公会][珊瑚舞]：哈哈
[公会][疯狂暴击]：。。。
卡卡哟加入了工会。
[公会][疯狂暴击]：退了就别回来了。。。
[公会][卡卡哟]：NND，我的空格键也坏了，没注意。
[公会][疯狂暴击]：哈哈，你也有今天。
[公会][疯狂暴击]：就一个命令，瞧折腾的。下次别打英文命令了，打中文。
[公会][卡卡哟]：中文命令是什么？
疯狂暴击离开了工会。
[公会][卡卡哟]：。。。
[公会][珊瑚舞]：。。。。
疯狂暴击加入了工会。
[公会][疯狂暴击]：谁再和我说话我怒了啊！
[公会][魍魉魑魅俊]：息怒息怒。。。
[公会][卡卡哟]：我不说了。。。
[公会][珊瑚舞]：。。。是不是打“/退出工会”了？
[公会][疯狂暴击]：。。。你打错字了
[公会][珊瑚舞]：哪个字？
[公会][疯狂暴击]：应该是“公会”。
魍魉魑魅俊离开了工会
[公会][疯狂暴击]：。。。这和我没关系。。
[公会][珊瑚舞]：跟我也没关系。。。。
幸福晨晨上线了
魍魉魑魅俊加入了工会
[公会][Gavin]：真是猪头啊~~
[公会][珊瑚舞]：up
[公会][枫舞]：......
[公会][Gavin]：其实还有更加好玩的命令，例如/gdi**and
[公会][珊瑚舞]：什么命令啊？打了一点反应都没有..
[公会][魍魉魑魅俊]：我也是没有反应，ga你在忽悠我们吧？
[公会][幸福晨晨]：/gdi**and
SilverTimes已经成功解散
[1-综合][奥格瑞玛][珊瑚舞]：饿。。。啊啊啊啊啊
[1-综合][奥格瑞玛][Gavin]：=_=
[1-综合][奥格瑞玛][枫舞]：=。=
[1-综合][奥格瑞玛][逍遥]：靠！都给我回来！！！！ga你死定了！！！
[1-综合][奥格瑞玛][Gavin]：= =&#124;&#124;谁叫你打的。。。你当会长都不知道这个命令是解散公会的我有什么办法=。= </description>
		<link>http://www.mikespook.com/index.php/archives/366</link>
			</item>
	<item>
		<title>Mysql 性能改进——最快实践</title>
		<description>没错，标题我没打错。这里不是最佳实践，而是最快实践。在服务器上线，巨大的压力导致相应缓慢的时候，最佳实践已经毫无意义。这个时候，目的只有一个：最快改善性能，给开发人员重新设计、调整应用留出一定的时间。

这里不是细腻的微调，而是最粗旷的拉升。用最简单（可快速实施），变更最少（尽量避免变更引入新的 bug 和问题）的方法迅速改善 mysql 的性能。所以我这里的最快实践，不一定是最好的，不一定是最有效的，但是一定是最快能看到性能改善的方法。
tmp_table_size
实施难度：容易

实施时间：短

实施效果：明显

tmp_table_size 默认 32M，根据手册上的说法，这个限制了内存临时表的大小。增大这个值可以立刻改善 mysql 的性能，虽然不是万灵丹，但却是个救命药。网上解释很多不多说了。
thread_cache_size
实施难度：容易

实施时间：短

实施效果：一般

在使用 SHOW STATUS; 查看 mysql 参数时，如果 thread_created 这个值很高的话，可以将 thread_cache_size 设置得大一些。内存允许的情况下，128 或者更大都是可以考虑的。mysql 通过内建的线程复用机制来实现了一个连接池。如果你的应用出现 max connection 的情况话（php 发生这种情况尤为严重），还是请开启 thread_cache_size 吧。
索引
实施难度：一般

实施时间：一般

实施效果：明显

不知什么时候，有一位高人说“对于 where 查询的条件字段，都加上索引会提高查询效率”。于是大家忙不停的将所有可能的字段都加上了索引。潘多拉的魔盒从此打开……

上图：



这样的表中，假设 t2 的总记录数不超过10 条。如果 t2_c1 这个字段有这样的查询 select * from t1 where t2_c1 = 1; 不少童鞋都会在 t2_c1 上加多一个索引，为了让这个搜索更快一些。这会是真的么？

显然不是！

在 t2_c1 字段的数据差异很小的情况下，使用索引不会比全表扫描快。更有可能的情况是，索引不但导致 t1 表数据修改变慢，同时导致查询变慢。为什么？大家先学习一下“随机存取”和“连续预读”的差异就明白了。不必要的索引还是去掉吧！我甚至见过索引比数据都大的表，如果读索引的速度比直接读数据都慢，这会有什么后果？太可怕了……
只查要用到的列
实施难度：大

实施时间：长

实施效果：明显

这绝对是老生常谈，但是总有人不在意。他们心中有疑问：“为什么？为什么？为什么 SELECT * ...</description>
		<link>http://www.mikespook.com/index.php/archives/361</link>
			</item>
	<item>
		<title>关于这次广州地区网络通讯中断的猜想</title>
		<description>首先，写这篇东西的时候我是阴谋论者。其次，我现在已经因为不能正常上 gmail 收邮件和用 google 搜英文资料而七窍生烟。也就是说我现在处于精神异常状态。精神失常者不为自己的言行负责。

大家还都记得上次暴风影音导致网络瘫痪的事情吧？其实也怪不得暴风影音，只是有那么几台 dns 挂了，然后就向上查询，谁知道电信干线的 dns 还不如商业公司的免费服务器耐用，还没查就挂了。干线啊，干线挂了谁不受影响？

这次 google 被封了，当然天朝不是真的想干掉 google，所以也就是小小的教育一下，只从 DNS 解析在大局域网内禁用了 google。没想到邓爷爷的“从娃娃抓起”颇有成效，广大不明真相的群众学会了更改 DNS 的方式来绕过封锁，继续浏览和访问邪恶的 google。

天朝震惊，GFW怒了。

于是一大批 DNS 受到牵连，被干掉了。但是随之而来的问题是，一个 DNS 被干掉上万个查询被顶起。大家就相互查DNS吧，查啊，查啊，查不到……一不小心，干线上的设备就给查坏了。没错，就是这样，多脆弱啊，那当然了，要不然你以为真是 Matrix revolution 啊?

我又在扯淡了，干TND GFW……

PS: 经测试这两个 DNS 可用，包括 google 和 gmail 访问。

208.67.222.222
208.67.220.220 </description>
		<link>http://www.mikespook.com/index.php/archives/355</link>
			</item>
	<item>
		<title>PHP 5.3 RC4 发布</title>
		<description>6月19日发布的PHP 5.3 RC4 同之前的RC版本并无很大出入，仅仅是修复bug和稳定性的改进。

新的一些特性，大家都讨论过了。不过我觉得还是有必要再罗嗦一下。
关于命名空间
namespaces 多少人期待了多少年，时间长到我以为 php 不会有命名空间了。突然有消息说 5.3 含有 namespaces，并且使用很有争议的“\”作为分隔符号。

其实，没有命名空间，大家都想出了各种各样的替代方法。比如经典的“_”对应子目录之类的。在大家屡试不爽的时候，突然在一个小版本号升级中引入了namespaces，实在让人摸不着头脑。不过看一下从 php4 -&#62; php5 的升级周期，或许真正的 namespaces 只有在 php6 的时候才能稳定和成熟。php 5.3 的namespaces 或许只是 perview 而已。

这些大家应该都是知道的，不多说了。总之 namespaces 很好用，又总之，真正用到 namespaces 的那天还很遥远。
关于推迟静态绑定
叫这个名字，不一定准确，我只是隐约记得 Late Static Bindings 是这个叫法吧。这个东西能带来一个好处，就是代码的动态性更强，越晚的绑定，越低的耦合。我遇到过这种情况，在项目中有一个类要重写其中的一些方法，但是由于过早的绑定机制，导致不重写其中的大部分代码就不可能完成类似的任务。最后的结果是出现了种种丑陋的，难以维护的代码编写方式来实现这个本不复杂的问题。

例如在php网站上提供的这个代码中：
class A {
    public static function who() {
        echo __CLASS__;
 ...</description>
		<link>http://www.mikespook.com/index.php/archives/352</link>
			</item>
	<item>
		<title>没有大团队——Nothing is big enough!</title>
		<description>刚才看到 Fenng 写的这篇博文：大技术团队的危险性。其中的一些东西，确实有一些感触。

维基百科上对于“团队”的定义是这样的（http://zh.wikipedia.org/wiki/%E5%9B%A2%E9%98%9F）：
“团队由若干独立成员共同组建，有临时与长期之分。团队要为某一共同目标而奋斗，这需要团队成员贡献各自不同的专业特长。对团队的管理不同于上下级关系的管理，是横向的交流与沟通而不是纵向的命令与服从。”
虽然不是一个十分正式的定义，不过能说明几个问题。

	团队不是一个人在战斗。
	团队有统一的目标。
	团队成员一定有分工。
	团队的工作方式是合作的，而不是管制。

团队成员不光可以是个人，还可以是一个紧凑的组织，部门甚至公司。成员间进行平等的沟通、交流，相互支撑最终达到一个确定的、统一的目标。

由于沟通交流是平等的、横向的，那么就意味着任何沟通都是点对点的。当团队成员增加时，沟通的难度也就加大。

听起来有点像早期没有交换设备的点对点电话。在只有2个端点时有1条通信链路，3个端点就增加到3条，4个端点就增加到6条……那么对于一个有 n 个成员的团队，每个团队成员就需要有 n-1 个沟通链路。当沟通链路数足够大时，整个团队的人都在忙着沟通，而不是真正进行工作。当超过临界，沟通链路超过单个成员所能承受的极限时，为了维持团队正常的运作，有一些沟通链路会被忽略。一些工作关系相对疏远的成员不再进行沟通。这时从行政架构上虽然还是一个大团队，但是这个大团队已经不复存在，由若干个自然形成的小团队取而代之。

4-5个人组成了开发小组。4-5个开发小组组成了技术组。技术组、客服、市场……组成了项目组。项目1组、项目2组……组成了项目部……自最终稳定的团队结构是树形的，是分层的。站在每层去看，每层的团队都是小团队。当某一层上的团队开始有大团队出现时必然会有新的层次出现，将大团队重新划分为小团队。

这或许就是“无为而治”的道理吧。

硬是要将这种很有美感的、自然的组织架构重新排布，徒增本不需要的沟通链路，那么团队的结果或许跟瓦沙一样最终沉没。 </description>
		<link>http://www.mikespook.com/index.php/archives/348</link>
			</item>
	<item>
		<title>算数与数学</title>
		<description>只是灵感一发随手写点东西，所以不必太在意一些素材的来源和准确性。

先来看一个统计资料，据说中国学生的计算能力和对数字的敏感程度比国外学生普遍要高。然后有研究机构发表文章说因为汉语的数字都是单音节发音，更容易记忆和识别。当然，这个没错，五的确比 Five 好说出口，八比Eight明显容易听清。

在很早很早以前，大约“外国人还在树上当猴子的时候，中国人已经在研究勾股定理了。”这不是我说的，是我上小学的时候，给我们做数学启蒙的数学协会的会长讲的。虽然是个玩笑话，但是足以说明中国的算数在很早以前就有高度的发展。

自然辩证法的老师还说过，虽然中国的算数发展很高，但是遗憾的是没有能够归纳总结，上升到数学的高度来看问题。而近代科学的许多重要发展都是建立在数学体系的日趋完整上面。所以中国在近现代科学技术的发展总是难以突破。

综合上面的材料，我在上楼的时候突然有一个灵感。没有经过严格的证明和推敲，不过有点意思。

如果说中国的算数的发展和计算能力的突出是因为单音节的数字发音导致的。那么，止步不前在算数这一具体的领域，而没有演进成数学这一更加抽象理论或许也是这个容易识别的单音节造成的呢？因为数字的容易听读，注意力集中在具体的数字上而导致计算高度发达。但是正是由于过分关注数字，而没有进一步的抽象算数的发达就掩盖了本可以衍生出的抽象的、理论化的数学的产生。

相比西方，英语可能是还是数字发音相对简单的一种语言。德语、法语、拉丁语这些在数字表达上多少还有一些复杂的、特殊的东西。西方那些精通算数的人，或许就是因为这些数字发音太繁琐，交流很麻烦。就把数字抽象成一个一个的字母，而这些本是为了交流方便的字母的替换和抽象就今儿上升到一个体系化的、公式化的科学——数学就这么演进出来了。

其实，我是扯淡的…… </description>
		<link>http://www.mikespook.com/index.php/archives/346</link>
			</item>
	<item>
		<title>《围墙》——钱终输</title>
		<description>序章：墙里的人想冲出去，墙外的人想挤进来……
PS：问候一下国外的友人：“今天你‘墙’了吗？”
话不多说，来张猛图的。别人没见过的，我亲自从德国带回来的……………

……………照片：
 </description>
		<link>http://www.mikespook.com/index.php/archives/342</link>
			</item>
	<item>
		<title>在游戏中使用脚本语言</title>
		<description>这只是一个有趣的探索，demo 使用 java 编写。模拟了一个龙与地下城类 RPG 游戏中，在不同的房间内移动的简单游戏场景。

阅读本文前，首先下载使用 Netbeans 6.5 建立的完整项目代码：下载。然后，我会用 UML 图的方式来说明如何在游戏中使用脚本，其中可能还会简介一下游戏中实体对象的建立和管理（不知道值得不值得另外写一篇文章来介绍了）。

I have a dream...

现在要构建一个极为无聊的小世界。说它小，是因为我只打算让它有三个房间，三个房间之间两两互通的门。仅此而已。首先上图：

我们假设左边上面的房间叫 room-1，右边上面的房间叫 room-2，下面的房间叫 room-3。玩家在这三个房间中穿行，当然，不可能是穿墙。人，一定是要走门的。如图。就这么简单的逻辑而已，不用脚本语言也能轻松完成。不过如果希望多来一点拓展性呢？比如，room-3 不允许等级在5级以下玩家进入；room-2 当十级以上玩家进入后就会自动瞬间移动到 room-1；门锁住以后就不能通过，更夸张一点，门锁住以后如果不把锁打坏就不能通过……可能性太多了。不用脚本的情况下，如果要将这么多都实现，是一件非常繁琐的事情。

好吧，让我们来看看那些游戏公司是怎么解决这个问题的。哦，需要说明的是，这里的解决方案仅仅是一个 demo，只用来解释原理。真正的环境中，还要更复杂一点，不过也就是复杂一点点而已。

游戏中实体类如图设计，为了简化期间，没有实体管理器，所以也没有集成自统一的父类。

Ninny 类也就是玩家，有保存当前所在房间的成员变量。Room 类也就是房间，保存有在当前房间的玩家列表。Door 是描述门的类，保存了这个门连接的两个房间的列表。

为了简单期间，demo 中使用了 java 内置的 javascript 作为脚本语言，详情看这里。

本来还想多写一点的，急着出门。算了，反正有代码，大家看看先。有空回头写。重点在 js 目录下的那几个脚本 enterDoor.js，exitDoor.js，enterRoom.js，exitRoom.js。

好，继续！

为了用起来方便，稍稍封装了一下Scripting的代码。大家直接看代码，不说话：

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class Script {

    private final static ScriptEngineManager factory ...</description>
		<link>http://www.mikespook.com/index.php/archives/330</link>
			</item>
	<item>
		<title>服务器又休息了两天</title>
		<description>服务器又休息了两天，原因说出来很“囧”。xxiyy.com，就是我一直用的那个“沪ICP备05006454号”突然被查，说是没有备案。

不知道为什么，我手里有明明用了几年的备案号和那个 cert 备案证书，但是用备案号和域名都查不到备案的信息。而上星期我又将 xxiyy.com 从以前的服务器转到了这台服务器上，于是服务器就这么给封了两天。如果不转，我都不知道备案信息就这么人间蒸发了。

天朝要拿捏，我又能说什么呢？重新备过吧。想做个良民可真难！！！

不过话又说回来，想想人家窦娥。我只是蒸发了一个备案信息，服务器休息了两天而已。天朝没有把我也蒸发了是我莫大的荣幸，所以心里也特平衡了。

“向前进，向前进。备案的责任重，工信的冤仇深 ” </description>
		<link>http://www.mikespook.com/index.php/archives/326</link>
			</item>
	<item>
		<title>MySQL InnoDB 隔离级别探索</title>
		<description>概述
本文会简单介绍 Mysql 使用的支持事务的存储引擎 InnoDB 的隔离级别，以及每个隔离级别下回产生的并发问题。同时为了更加深刻的理解 InnoDB 引擎的隔离级别，还会探讨如何通过加锁解决不同隔离级别下的并发问题。本文使用的实验环境是 mysql-5.1.33-win32，其他版本的 MySQL 可能会有不同。
隔离级别标准
SQL 标准中定义了四个隔离级别，他们分别是：





READ-UNCOMMITTED

读未提交



READ-COMMITTED

读提交



REPEATABLE-READ

可重复读



SERIALIZABLE

串行化



在 InnoDB 中根据 SQL:1992 事务隔离级别，使用 REPEATABLE-READ 作为默认隔离级别。
并发产生的问题
为了说明下面的并发问题，首先建立一个表 foobar：
DROP TABLE IF EXISTS `foobar`;
CREATE TABLE `foobar` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `value` int(10) unsigned NOT NULL DEFAULT '0',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB;
并插入一条数据：
INSERT INTO `foobar`(`value`) ...</description>
		<link>http://www.mikespook.com/index.php/archives/317</link>
			</item>
</channel>
</rss>
