All posts by 枫中吉姆

3D网页游戏《Minecraft》销量接近150万

 

3D网页游戏《Minecraft》已经售出接近150万份,这款游戏已经越来越流行。现在游戏官方已经推出游戏音效的下载和销售。
Minecraft的音效是由著名的C418制作的,这张专辑名为Alpha,其中包括了大约15分钟时长的音效,这里面包含了所有的Minecraft的音效。你可以在C418的网站上听单曲或者下载所有音轨,其售价为3.99美元。

关于《MineCraft》:
《MineCraft》是一款由一个人独力完成的webgame,游戏设计师Markus Persson 从多款游戏获得灵感,其中较为著名的是《地城守护者》,而发想过程中《Infi(微博)niminer》也对他起了相当大的影响。但是尽管这款游戏只有一个人开发,却曾创下单日获利26 万欧元(相当于人民币242万元左右)的纪录。
《MineCraft》是虽然一款3D 的网页游戏,所呈现的世界并不是华丽的画面与特效,而是著重在游戏性上面。玩家在游戏中只做着「建设」与「破坏」两件事,但是透过像乐高一样的积木来组合与拼凑,轻而易举的就能制作出小木屋、城堡甚至城市,但是若再加上玩家的想像力,空中之城、地底都市都一样能够实现

 

zt qq

apache的作用和tomcat的区别

从网上看到这篇写基础理论比较好,转发一下

经常在用apache和tomcat等这些服务器,可是总感觉还是不清楚他们之间有什么关系,在用tomcat的时候总出现apache,总感到迷惑,到底谁是主谁是次,因此特意在网上查询了一些这方面的资料,总结了一下:

 

apache支持静态页,tomcat支持动态的,比如servlet等,
一般使用apache+tomcat的话,apache只是作为一个转发,对jsp的处理是由tomcat来处理的。

apache可以支持php\cgi\perl,但是要使用java的话,你需要tomcat在apache后台支撑,将java请求由apache转发给tomcat处理。

apache是web服务器,Tomcat是应用(java)服务器,它只是一个servlet(jsp也翻译成servlet)容器,可以认为是apache的扩展,但是可以独立于apache运行。

 

这两个有以下几点可以比较的:
1、两者都是apache组织开发的
2、两者都有HTTP服务的功能
3、两者都是免费的

不同点:
Apache是专门用了提供HTTP服务的,以及相关配置的(例如虚拟主机、URL转发等等)
Tomcat是Apache组织在符合J2EE的JSP、Servlet标准下开发的一个JSP服务器

 

 

二:

APACHE是一个web服务器环境程序 启用他可以作为web服务器使用 不过只支持静态网页 如(asp,php,cgi,jsp)等动态网页的就不行
如果要在APACHE环境下运行jsp 的话就需要一个解释器来执行jsp网页 而这个jsp解释器就是TOMCAT, 为什么还要JDK呢?因为jsp需要连接数据库的话 就要jdk来提供连接数据库的驱程,所以要运行jsp的web服务器平台就需要APACHE+TOMCAT+JDK

整合的好处是:
如果客户端请求的是静态页面,则只需要Apache服务器响应请求
如果客户端请求动态页面,则是Tomcat服务器响应请求
因为jsp是服务器端解释代码的,这样整合就可以减少Tomcat的服务开销

 

 

三:

apache:侧重于http server
tomcat:侧重于servlet引擎,如果以standalone方式运行,功能上与apache等效 , 支持JSP,但对静态网页不太理想;
apache是web服务器,tomcat是应用(java)服务器,它只是一个servlet(jsp也翻译成servlet)容器,可以认为是apache的扩展,但是可以独立于apache运行。
换句话说,apache是一辆卡车,上面可以装一些东西如html等。但是不能装水,要装水必须要有容器(桶),而这个桶也可以不放在卡车上。

 

负载均衡

网络的高速发展令到负载均衡越来越重要。负载均衡分硬件和软件两种,硬件最出名莫过于F5,NetScaler,Radware和Array等,但都很昂贵,一般中小企业消费不起,于是开源免费的软均衡就有很大的市场了,出名的有Nginx,Haproxy和LVS这几个基于LINUX的开源产品。本人喜欢Nginx/HAProxy+Keepalived作Web最前端的负载均衡器/反向代理,整个网站非常稳定,PV达到了亿级/日的访问量,所以无需担心高并发流量冲击下的稳定情况。

另外haproxy支持TCP 的链接,多达8种的负载均衡算法,包括大家熟悉的roundrobin,也带web管理,下面分享个的配置就是haproxy.cfg给大家,

 

global

log 127.0.0.1       local0

#log 127.0.0.1    local1 notice

#log loghost       local0 info

maxconn 30000

chroot /usr/local/haproxy

nbproc   4

uid 99

gid 99

daemon

pidfile /var/run/haproxy-loadbalancing.pid

#debug

#quiet

 

defaults

log          global

mode    http

option   dontlognull

retries   3

option redispatch

maxconn 30000

listen www-appname

bind  xx.xx.xx.xx:80(这里是实际IP)

mode http

balance roundrobin

server webserver1 10.67.222.171:80 weight 1 check

server webserver2 10.67.222.172:80 weight 1 check

option forwardfor

option httpchk

option httplog

option httpclose

contimeout 3000

clitimeout 5000

srvtimeout 5000

log 127.0.0.1 local3

 

listen mina

bind xx.xx.xx.xx:1139

mode tcp

balance roundrobin

option tcplog

option clitcpka

contimeout 300000

clitimeout 300000

srvtimeout 300000

server minaserver1 10.67.222.171:1139 weight 1 maxconn 3000 check

server minaserver2 10.67.222.172:1139 weight 1 maxconn 3000 check

 

listen admin_stats 10.67.222.170:1080

mode http

stats uri /my_stats

maxconn 2

stats auth user:passwd

contimeout 3000

clitimeout 5000

srvtimeout 5000

 

PHP 序列化(serialize)格式详解

大家如果用php会经常看到序列化的格式很茫然,只会使用serialize和unserialize,不明所以然,程序员之大忌。废话少说,先举个简单的例子:

a:3:{s:1:”a”;i:0;s:1:”b”;i:0;s:1:”c”;i:0;}

这个a就是array,a:3就是这个数组有三个值,后面括号就是这三个值了

s:1:”a”;s就是string,s:1″a”,就是string长度是1值是“a”,跟着就不要解释这么哆嗦了吧

详细看下面这篇(来自http://www.coolcode.cn/?p=170)写序列化比较好,分享给大家,技术活有难度哦{#emotions_dlg.tongue_out}

 

1.前言
PHP (从 PHP 3.05 开始)为保存对象提供了一组序列化和反序列化的函数:serialize、unserialize。不过在 PHP 手册中对这两个函数的说明仅限于如何使用,而对序列化结果的格式却没做任何说明。因此,这对在其他语言中实现 PHP 方式的序列化来说,就比较麻烦了。虽然以前也搜集了一些其他语言实现的 PHP 序列化的程序,不过这些实现都不完全,当序列化或反序列化一些比较复杂的对象时,就会出错了。于是我决定写一份关于 PHP 序列化格式详解的文档(也就是这一篇文档),以便在编写其他语言实现的 php 序列化程序时能有一个比较完整的参考。这篇文章中所写的内容是我通过编写程序测试和阅读 PHP 源代码得到的,所以,我不能 100% 保证所有的内容都是正确的,不过我会尽量保证我所写下的内容的正确性,对于我还不太清楚的地方,我会在文中明确指出,也希望大家能够给予补充和完善。
2.概述
PHP 序列化后的内容是简单的文本格式,但是对字母大小写和空白(空格、回车、换行等)敏感,而且字符串是按照字节(或者说是 8 位的字符)计算的,因此,更合适的说法是 PHP 序列化后的内容是字节流格式。因此用其他语言实现时,如果所实现的语言中的字符串不是字节储存格式,而是 Unicode 储存格式的话,序列化后的内容不适合保存为字符串,而应保存为字节流对象或者字节数组,否则在与 PHP 进行数据交换时会产生错误。

PHP 对不同类型的数据用不同的字母进行标示,Yahoo 开发网站提供的 Using Serialized PHP with Yahoo! Web Services 一文中给出所有的字母标示及其含义:

a – array
b – boolean
d – double
i – integer
o – common object
r – reference
s – string
C – custom object
O – class
N – null
R – pointer reference
U – unicode string
N 表示的是 NULL,而 b、d、i、s 表示的是四种标量类型,目前其它语言所实现的 PHP 序列化程序基本上都实现了对这些类型的序列化和反序列化,不过有一些实现中对 s (字符串)的实现存在问题。

a、O 属于最常用的复合类型,大部分其他语言的实现都很好的实现了对 a 的序列化和反序列化,但对 O 只实现了 PHP4 中对象序列化格式,而没有提供对 PHP 5 中扩展的对象序列化格式的支持。

r、R 分别表示对象引用和指针引用,这两个也比较有用,在序列化比较复杂的数组和对象时就会产生带有这两个标示的数据,后面我们将详细讲解这两个标示,目前这两个标示尚没有发现有其他语言的实现。

C 是 PHP5 中引入的,它表示自定义的对象序列化方式,尽管这对于其它语言来说是没有必要实现的,因为很少会用到它,但是后面还是会对它进行详细讲解的。

U 是 PHP6 中才引入的,它表示 Unicode 编码的字符串。因为 PHP6 中提供了 Unicode 方式保存字符串的能力,因此它提供了这种序列化字符串的格式,不过这个类型 PHP5、PHP4 都不支持,而这两个版本目前是主流,因此在其它语言实现该类型时,不推荐用它来进行序列化,不过可以实现它的反序列化过程。在后面我也会对它的格式进行说 明。

最后还有一个 o,这也是我唯一还没弄清楚的一个数据类型标示。这个标示在 PHP3 中被引入用来序列化对象,但是到了 PHP4 以后就被 O 取代了。在 PHP3 的源代码中可以看到对 o 的序列化和反序列化与数组 a 基本上是一样的。但是在 PHP4、PHP5 和 PHP6 的源代码中序列化部分里都找不到它的影子,但是在这几个版本的反序列化程序源代码中却都有对它的处理,不过把它处理成什么我还没弄清楚。因此对它暂时不再 作更多说明了。
3.NULL 和标量类型的序列化
NULL 和标量类型的序列化是最简单的,也是构成符合类型序列化的基础。这部分内容相信许多 PHP 开发者都已经熟知。如果您感觉已经掌握了这部分内容,可以直接跳过这一章。

3.1.NULL 的序列化
在 PHP 中,NULL 被序列化为:

N;
3.2.boolean 型数据的序列化
boolean 型数据被序列化为:

b:<digit>;
其中 <digit> 为 0 或 1,当 boolean 型数据为 false 时,<digit> 为 0,否则为 1。

3.3.integer 型数据的序列化
integer 型数据(整数)被序列化为:

i:<number>;
其 中 <number> 为一个整型数,范围为:-2147483648 到 2147483647。数字前可以有正负号,如果被序列化的数字超过这个范围,则会被序列化为浮点数类型而不是整型。如果序列化后的数字超过这个范围 (PHP 本身序列化时不会发生这个问题),则反序列化时,将不会返回期望的数值。

3.4.double 型数据的序列化
double 型数据(浮点数)被序列化为:

d:<number>;
其 中 <number> 为一个浮点数,其范围与 PHP 中浮点数的范围一样。可以表示成整数形式、浮点数形式和科学技术法形式。如果序列化后的数字范围超过 PHP 能表示的最大值,则反序列化时返回无穷大(INF),如果序列化后的数字范围超过 PHP 所能表示的最小精度,则反序列化时返回 0。

3.5.string 型数据的序列化
string 型数据(字符串)被序列化为:

s:<length>:”<value>”;
其 中 <length> 是 <value> 的长度,<length> 是非负整数,数字前可以带有正号(+)。<value> 为字符串值,这里的每个字符都是单字节字符,其范围与 ASCII 码的 0 – 255 的字符相对应。每个字符都表示原字符含义,没有转义字符,<value> 两边的引号(””)是必须的,但不计算在 <length> 当中。这里的 <value> 相当于一个字节流,而 <length> 是这个字节流的字节个数。

 

4.简单复合类型的序列化
PHP 中的复合类型有数组(array)和对象(object)两种,本章主要介绍在简单情况下这两种类型数据的序列化格式。关于嵌套定义的复合类型和自定义序列化方式的对象的序列化格式将在后面的章节详细讨论。

4.1.数组的序列化
数组(array)通常被序列化为:

a:<n>:{<key 1><value 1><key 2><value 2>…<key n><value n>}
其 中 <n> 表示数组元素的个数,<key 1>、<key 2>……<key n> 表示数组下标,<value 1>、<value 2>……<value n> 表示与下标相对应的数组元素的值。

下标的类型只能是整型或者字符串型,序列化后的格式跟整型和字符串型数据序列化后的格式相同。

数组元素值可以是任意类型,其序列化后的格式与其所对应的类型序列化后的格式相同。

4.2.对象的序列化
对象(object)通常被序列化为:

O:<length>:”<class name>”:<n>:{<field name 1><field value 1><field name 2><field value 2>…<field name n><field value n>}
其中 <length> 表示对象的类名 <class name> 的字符串长度。<n> 表示对象中的字段1个数。这些字段包括在对象所在类及其祖先类中用 var、public、protected 和 private 声明的字段,但是不包括 static 和 const 声明的静态字段。也就是说只有实例(instance)字段。

<filed name 1>、<filed name 2>……<filed name n>表示每个字段的字段名,而 <filed value 1>、<filed value 2>……<filed value n> 则表示与字段名所对应的字段值。

字段名是字符串型,序列化后格式与字符串型数据序列化后的格式相同。

字段值可以是任意类型,其序列化后的格式与其所对应的类型序列化后的格式相同。

但字段名的序列化与它们声明的可见性是有关的,下面重点讨论一下关于字段名的序列化。

4.3.对象字段名的序列化
var 和 public 声明的字段都是公共字段,因此它们的字段名的序列化格式是相同的。公共字段的字段名按照声明时的字段名进行序列化,但序列化后的字段名中不包括声明时的变量前缀符号 $。

protected 声明的字段为保护字段,在所声明的类和该类的子类中可见,但在该类的对象实例中不可见。因此保护字段的字段名在序列化时,字段名前面会加上

/0*/0
的前缀。这里的 /0 表示 ASCII 码为 0 的字符,而不是 /0 组合。

private 声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。因此私有字段的字段名在序列化时,字段名前面会加上

/0<declared class name>/0
的前缀。这里 <declared class name> 表示的是声明该私有字段的类的类名,而不是被序列化的对象的类名。因为声明该私有字段的类不一定是被序列化的对象的类,而有可能是它的祖先类。

字段名被作为字符串序列化时,字符串值中包括根据其可见性所加的前缀。字符串长度也包括所加前缀的长度。其中 /0 字符也是计算长度的。
——————————————————————————–

1 注:在 PHP 手册中,字段被称为属性,而实际上,在 PHP 5 中引入的用 __set、__get 来定义的对象成员更适合叫做属性。因为用 __set、__get 来定义的对象成员与其它语言中的属性的行为是一致,而 PHP 手册中所说的属性实际上在其他语言中(例如:C#)中被称为字段,为了避免混淆,这里也成为字段,而不是属性。

 

5.嵌套复合类型的序列化
上一章讨论了简单的复合类型的序列化,大家会发现对于简单的数组和对象其实也很容易。但是如果遇到自己包含自己或者 A 包含 B,B 又包含 A 这类的对象或数组时,PHP 又该如何序列化这种对象和数组呢?本章我们就来讨论这种情况下的序列化形式。

5.1.对象引用和指针引用
在 PHP 中,标量类型数据是值传递的,而复合类型数据(对象和数组)是引用传递的。但是复合类型数据的引用传递和用 & 符号明确指定的引用传递是有区别的,前者的引用传递是对象引用,而后者是指针引用。

 

如何做html5山寨版愤怒的小鸟

以下是看到网上写的一篇技术贴,分享给大家:

主要有以下几点,主要是一些链接,供大家学习

1.游戏框架
2.Sprite sheet和Animition
3.box2D
4.Audio

1.游戏框架

http://www.brighthub.com/internet/web-development/articles/40512.aspx

http://www.brighthub.com/internet/web-development/articles/40513.aspx

简单而是用的小游戏框架,为你创建好了canvas,而且用了double buffer的canves

主要的类图如下:

框架定义了GameObject基类,游戏中每一个可以活动的部件均可以继承它,还定义了VisualGameObject类,它继承自GameObject类,添加了draw方法,游戏中可见的部件可以从它继承,实现自己的draw方法,draw方法带有参数,就是canvas的context。所有GameObject由GameObjectManager管理,所有自定义的GameObject子类的对象都需要添加到GameObjectManager,它有一个draw方法会被定时调用,如果每1/30秒调用一次,那么你的游戏从设计上来说就是30FPS的。这个方法会把它管理的所有GameObject都调用一遍draw方法(如果有的话),实现所有GameObject的定时重绘,这个就是大家常看到的游戏设计里的主循环。它的功能好比windows编程里的消息循环一样。

有了这个framework,你要做的就是继承VisualGameObject,实现draw方法绘制知己,实例化并添加到GameObjectManager中即可。

 

2.Sprite sheet和Animition

Sprite sheet就是精灵表。

http://codeutopia.net/blog/2009/08/21/using-canvas-to-do-bitmap-sprite-animation-in-javascript/

这篇文章讲解了如何自己实现Animation,主要原理简述如下:

定义SpriteSheet类,它负责从一张大图中剪切出我们需要的一个个小图。把所有你游戏重要到的图片做成一张大图,提高性能,多个小图意味着客户端需要发起多次web request,每个http request含有head,tcp,ip等都含有head,减少请求次数意味着较少数据流量,这个好处你懂的。貌似html5中的websocket就是用的这个原理,来提高系统吞吐量的,将http连接upgrade成websocket,之后所有的双向通信都直接传数据,最少只需要两个字节的表头。

Animation类负责将各个剪切出来的小图拼接成动画,每一个小图是一帧,每一帧定义一个duration,每一帧显示的duration完了,就显示下一帧,然后循环,看起来就是连续的动画了,其实是欺骗了你的眼睛。

 

3.box2D

随着AngryBird的火爆,这个库也进入了广大开发者的视野,现在介绍这个库的文章太多了,我就不啰嗦了,只写几个关键点:

box2D源代码使用c++开发,可以从http://box2d.org/下载到最新版本和文档,它port到了各种平台,如java,c#,flash,javascript。我是用的是box2Dweb,这个javascript库是从actionacript库port过来的,可以从http://code.google.com/p/box2dweb/下载。

Seth Ladd写过几篇很经典的入门级文章:http://creativejs.com/2011/09/box2d-javascript-tutorial-series-by-seth-ladd/

这个库的适用范围是几米到几十米之间,也就是牛顿定律的使用范围(不含天体运动),对于微观离子的运动,用这个库是不合适的,太大的范围也不精确。

速度太快是可以穿越的。这个是我测试过的,如果给小鸟太大的力,使其速度过快,它能够穿越木头。原因是box2D的库每1/60秒(可配置)是一个step,它会计算每个step结束时各个刚体(Rigid body)应该在什么位置,如果发现有重叠的,就认定在这个step中会有碰撞发生,会触发碰撞事件,并且修正刚体的位置,使其不重叠,但是如果某一个刚体速度太快,在这个step结束的时候已经成功穿越的另一个刚体,则碰撞就无法被检测到,实现了穿越。

 

4.Audio

在html5里,audio实现起来非常简单

this.getAudio = function(id){
if(this.audios[id] == undefined) {
this.audios[id] = new Audio();
this.audios[id].src = “music/”+id;
this.audios[id].load();
}
return this.audios[id];
};

var audio = this.getAudio(“title_theme.mp3”);
audio.loop = true;
audio.play();

 

作为一个windows平台程序员,发现web在处理事件时与windows桌面应用有不同之处。桌面程序在处理鼠标或键盘事件时,注册一个事件处理方法就可以了,当事件发生时,这个事件处理方法就会被调用执行。但是web有点不一样,加入你的游戏时30FPS的,1/30秒你的程序才获得一次执行机会,但是在这短短的1/30秒时间内,可能已经发生了好几次鼠标键盘事件,所有需要在事件发生时记录下事件类型及状态,当程序获得执行机会时,读取刚才这些记录,处理事件,删除记录。

 

介绍及源代码下载:

http://www.cnblogs.com/piyeyong/archive/2011/12/30/2307366.html

HTML5 PK FLASH

目前Flash占据网页动画90%的市场, FB, 人人,开心,腾讯,4399的游戏基本都是Flash,这全赖于adobe把as2的脚本语言改为面向对象的as3, 令flash注入生机,但也因为太依赖flash player,以苹果以首的大腕杯葛flash

html5不依赖flash, 基于浏览器, 有人就说这是flash的终结者. 但由于http不支持长连接, websocket就应运而生, 有点类似http+tcp, google chrome和ie9都宣布支持, 貌似一个兼容ios, android, wp7 平台就要横空出世,但由于javascript始终不如as3好用,还有websocket的标准还没最终定, html5的何去何从让我们拭目而待.

 

discuz!–风行全国的开源论坛和SNS架构

大家是不是觉得这个头像很熟悉,好象哪里都有?是,这是大名鼎鼎的discuz!的标志

Discuz! 是康盛Comsenz推出的一套通用的社区论坛软件系统,中小网站采用率很高,风行祖国(听说不能叫中国{#emotions_dlg.laughing})南北,多伦多的YORKBBS和51好象也采用了

好处: 有个技术团队帮你开发, 投资者关注市场就够了

缺点: 网站扩容性不好,大网站象qq,163,新浪都不采用