input button submit

以前做表单的按钮使用这两个元素
普通按钮:<input type="button">
提交按钮:<input type="submit">
后来做表单的按钮使用这两个元素
普通按钮:<button>
提交按钮:<button type="submit">
今天发现
<button> 和 <button type="submit"> 是一样的,都是提交按钮,囧
和 <input type="button"> 对应的:
不是 <button>
而是 <button type="button">
也就是说 <button> 元素的 type 默认是 submit 不是 button
分类: HTML | 我要留言

哪里需要注释 ——《The Art of Readable Code》第五章导读

注释不只是为了解释一段代码的作用,注释是为了将代码编写者所知道的信息全部传达给阅读者。

当你编写代码的时候,你脑中会有很多有价值的信息,这些信息形成一个编写代码的思维环境。 最后,代码写完了,这些环境信息却丢失了。 当其他人阅读代码时,由于不在这个“环境”中,就很难理解那些代码。 注释要做的,就是让阅读者能根据注释提供的信息,还原这个“环境”。

阅读全文

分类: Books | 我要留言

方便网页游戏合服的数据库设计思路

合服应该算是游戏生命周期中的一环,很多游戏开发者都会经历这个过程,而根据我自己的经验,网页游戏合服更为普遍和频繁。我经历过合服的痛苦历程,甚至听说过有些游戏由于最初的设计原因导致无法合服。当然真正的无法合服应该是不存在的,我想大概是因为这个痛苦超过了常人的忍受能力,或者是这个过程成本过高。 所以说,我们最好在早期开发过程中就预先考虑好这个问题。


环境说明

以下的内容直接使用 MySQL 的术语和语句,不过就算你使用其他数据库,也应该很容易理解这些概念。


主键冲突

合服时遇到的最普遍情况当属主键冲突。

玩家角色、道具等等都是在游戏运行过程中添加进去的数据,我们用数据库的 AUTO_INCREMENT 特性来创建这些数据的主键,来保证他们在游戏中的唯一性。 比如我们定义了玩家的ID字段为 `uid` int(11) NOT NULL AUTO_INCREMENT ,那么玩家的道具表中势必也会有一个字段 `uid` int(11) NOT NULL ,用来表明这个道具是哪个玩家的,类似的,玩家的装备等等也会用类似方法表明归属。

当合服时问题就来了,AUTO_INCREMENT 只能保证数据在这个服务器中唯一,最终导致服务器 A 中有个玩家的 uid 是 1 ,服务器 B 中也有个玩家的 uid 是 1 ,在解决这个冲突前是不能合服的。

我们常常采用的方法就是把服务器 B 中的所有 uid 都加上一个数,以保证服务器 B 中最小的 uid 也比服务器 A 中的大,这样就把冲突解决了,当然还要做一些其他工作,因为玩家表中 uid 改了,所以道具表中的 uid 也要做相应的修改,以保证合服后道具还属于原来那个玩家,然后还有装备表等等要如法炮制。如果你使用了外键,还得加上删除和重做外键的步骤。

同时,道具表和装备表等又有自己的主键冲突要解决,表越多,表之间的关系越复杂,修改一个表的主键牵涉到的相关表也就越多。虽然解决问题的规则和方法很简单,但实际操作起来,这样一层层套在一起简直让人疯狂。


主键冲突的避免

通过上面的描述,主键冲突产生的原因和解决主键冲突的方法都已经很明了了。那么与其每次这么手动去处理,不如把这个解决的方法提前到数据库产生数据前。

首先,我们给每个服务器一个编号,我想这很容易,服务器本来就是一服二服这么下来的。 然后预估每个表最多会有多少数据:比如我预计我们一个服务器不会达到1亿个玩家,那么用服务器编号乘上这个预估的数,比如 1 服,就是 1 x 100000000 = 100000000 ,2 服就是 2 x 100000000 = 200000000。在开服前我们用 ALTER TABLE x AUTO_INCREMENT = y 把 AUTO_INCREMENT 的字段设定从这里开始计数。这么一来,合服时就不会出现主键冲突了。

事实上,我很懒,懒得去给每张表估计最多会有多少数据;也很胆小,不想承担数据量超过我预估的值的风险。 所以我干脆预估所有表都是 100 亿,事实上这已经超过了 int(11) 的最大值,就没什么好担心的了。 我们要做的就是把原来使用的 int(11) 改成 bigint(20)。

别怕太大,硬盘很便宜,AUTO_INCREMENT 也不用你去数。 牺牲那么点存储空间,换得我们开发人员的安枕无忧,我觉得太划算了。

分类: 默认 | 我要留言

如何写好一个教程

要明确和清晰的将教程分为多个步骤。

核心思想要用简短的语句进行表述,并通过适当的重复来进行强化。

用黑体和斜体等标注重要内容。

尽可能多的使用可视化元素,以表达文字难以表述的内容。

读你的教程的人可能完全是个新手,你不该期望他已经对你提到的东西有所了解。所以,不要跳过任何步骤,并且每个步骤都要尽可能详细。

确保你的教程可以被你的读者理解。不要使用他们可能不懂的术语和缩写却不加以解释。

给出一些讨论相关话题的文章的链接,以作参考

给出一些实际的例子并告诉他们该如何做。

发表它,从而得到反馈建议并进行改进。

分类: 默认 | 我要留言

读Xui,学JavaScript (1)

初篇,hearder & footer —— 匿名函数

阅读全文

分类: JavaScript | 我要留言