美国“砖家”

我的朋友 Iceskysl 最近很郁闷,因为他上了著名的风投博客 Venturebeat首页。事情是因为他写了很多Andriod手机的软件,他写的软件很好用,很快下载量过百万。于是被不负责任的美国黑客盯上,最近的BLACK HAT大会上,某个公司借机推出一款叫做lookup的手机查马软件。据说这个软件在大多数手机上查出40%+的程序在偷窃用户数据(WOW!)。而Icekysl是一位来自中国的受欢迎的手机软件作者。于是手机后门+中国威胁立刻就成了这款基于求成的lookup的炒作主题。在BH上炒一炒后就被半懂不懂的VB小编搬上了MobileBeat的首页。MobileBeat作为Venturebeat的重头内容,在国内的互联网“先锋”中很有影响力,于是被国内的各种网站不伦不类地翻译过来再添油加醋地继续炒…读罢新闻之后,我惊叹原来Iceskysl是一个掌控着全球手机的恐怖大BOSS

Errr…..American 砖家 sucks!

一个好看又好用的Cygwin 1.7 终端

一直在使用 Windows环境,所以 Cygwin成了我几乎每天使用到的工具。Cygwin默认通过bat文件调用windows的命令行窗口作为终端,那个DOS窗口的可用性非常糟糕——无法调整窗口大小,无法传入ASCII NUL,复制黏贴非常复杂。

我试试网上的多种改善方案,最后发现子好用的是:PuttyCyg http://code.google.com/p/puttycyg/

PuttyCyg是一个扩张的putty客户端,提供加入 -cygterm方式来模拟Cygwin终端。PuttyCyg的优点是保留了 Putty的一切优点。

Cygwin升级到 1.7之后,我发现PuttyCyg的GUI无法再正常工作,但是通过命令行方式可以正常工作,看来是 PuttyCyg 的一个 Bug。所以在升级了Cygwin之后,可以通过以下命令行(放在快捷方式里更好)来启动 PuttyCyg的终端:

putty.exe -load “cygwin” -cygterm -

其实不加 -load “cygwin” 就可以工作了,但是我是一个字体控,我在 puttycyg里面加了一个名为 cygwin 的 profile,用于调整字体,translation 编码等设置。

和 Ruby 语言的创造者 Matz 吃饭

6月 RubyConfChina 遇见 Ruby 语言的创造者 Matz Yukihiro Matsumoto,一起吃饭

从明天起,我要做一个独立游戏人,开一个麻球帐号,做自己心仪的游戏发布给1亿个人

经过这两个月来盛大同事们不舍昼夜的努力,麻球网正式向中国的FLASH开发者提供服务了!做FLASH游戏开发的朋友都知道Mochi

Media平台。它是全世界最大的FLASH游戏应用提供商(没有之一)!在09年底盛大网络收购了Mochi平台,并在第一时间完成了全套

中文化服务,让国内的FLASH开发者都能搭上这辆穿梭在各大SNS网络中的FLASH快车。从此Mochi有了一个超级萌的中文名字——“麻球”!

麻球好大,麻球之所以超级大,不仅因为麻球每个月有1.4亿个活跃玩家,也不仅仅因为麻球上营运了15,000多款网页游戏,或者因为麻球正在向40,000家游戏网站提供游戏内容。麻球之所以超级大是因为麻球里有很多很多FLASH游戏牛人,他们每个月都在麻球上发布自己最新的游戏作品,它们包括《战争王国》、《桌面塔防》等等许多脍炙人口的FLASH游戏。

麻球上有这么多FLASH牛人是因为麻球的功能方便又好用。通过几行代码就能在自己的游戏里加入用户追踪、道具销售、玩家收费、广告宣传等一系列的功能,然后通过几下点击,就能把游戏作品发布到全世界的SNS社区和游戏网站上去。更重要的是,麻球和开发者站在一起,用它巨大的平台保护开发者的版权利益。因为麻球尊重版权,恪守承诺,所以才能成为世界上最大的FLASH游戏库,拥有那么多经典游戏作品。在麻球上发布作品,永远都不会遇到那些龌龊的让人愤恨的分成问题。

今天麻球向全国的FLASH开发者们广发英雄帖,不仅将这个先进的平台开放给每一位开发者,更为FLASH开发者专门设立了一千万美元的开发基金——这个天下是FLASH开发者们的,所以从明天起,我要做一个独立游戏人,开一个麻球帐号,做自己心仪的游戏发布给1亿个人

《ACTIONSCRIPT中的元编程和开发流程解耦》- SWFSH 活动发言稿

2010年5月30日,在第三届FLASH开发者交流会上的主题演讲,内容关于 ACTIONSCRIPT 中的元编程技巧,和开发流程解耦。

ACTIONSCRIPT中的元编程和开发流程解耦

主讲人:SGF – 谈熠

一条大新闻:Andriod 2.2 性能提高 450%

http://mobile.venturebeat.com/2010/05/21/google-android-froyo/

简而言之: Google 最新发布的 Android 2.2(代号froyo) 虚拟机运行性能提升 450% (4.5倍)。

这意味着大部分低端手机的硬件环境上可以使用 Andriod 实现智能手机的功能。

这意味着在中国,用山寨机的成本就可以制造高级智能手机

这意味着加载Andriod平台的手机出货量将会在一年内达到井喷

这意味着太多了。。。

ActionScript3 中的元编程 Metaprogramming in ActionScript3

今天的ActionScript3看上去已经越来越象JAVA了,这是Adobe刻意营造出来局面,以促进AS快速普及。然而ActionScript在骨子里始终是一个不折不扣的prototype-based的脚本语言,因此AS脚本的本质上是Lambda。在许多环境下,巧妙地利用AS的动态特征,可以通过元编程来减少代码数量并提高实现的质量。这里我举几个例子:

PS: Ruby已经深深地格式化了我对编程语言的理解,因此在以下的实现中我直接参考了Ruby的对应实现。

1. Method missing实现

AS3 提供 flash.util.Porxy 来替代 AS中的Object.__resolve属性。通过继承Proxy类,并重载 callProperty方法,就可以在FLASH的运行时捕捉没有被实现的方法调用。在一些情况下,巧妙得利用这种机制可以大幅降低程序的实现代码量,提高程序的可维护性。比如在开发C/S结构的应用程序时,使用这个方法,可以让服务器端和客户端开发小组在工作上相互解耦,详细请见我在Adobe技术峰会上的发言。

下面就是一段应用在生成环境下的实现代码:

package
{
	use namespace flash_proxy;

        import flash.util.Porxy;
        import mygame.Protocol;
        import mygame.BuffWriter;

	public dynamic class Server
		extends Proxy
	{

		/**
		 * 为Server提供 method missing 捕捉机制,这样向server调用任意未实现的方法都会被编译成指令数据
		 * 发给服务器。
		 * @param name 调用的方法名,即通信协议名,采用驼峰格式,例如 server.runTo
		 * @param rest 发送给服务器的数据参数,比如 server.runTo([40,50])
		 * @return 编译好的发给服务器的bytearray数据
		 */
		flash_proxy override function callProperty(name:*, ...rest):*
		{
			var command:String = (name as QName).localName; // 获取调用的方法名,例如 "runTo"

			// translate camelCase function name to UPPERCASE command name, it become "RUN_TO"
			command = command.replace(/[A-Z]/g, "_$&").toUpperCase();

			// 检查这个调用是否是合法的Protocal命令
			if(!Protocol["hasOwnProperty"]("CMD_"+command))
			{
				// process invalid command
				throw(new ArgumentError("Unknow server command:"+command));
				return;
			}

			var buf:ByteArray = BuffWriter.toBuff(
				Protocol["CMD_"+command],
				rest);

			return buf;
		}
	}
}

2. Duck typing 实现

Duck typing 是Ruby和Python中的一大亮点。Duck typing 本质上是一种结果导向的编程思路,这有悖于OO的结构导向思路,但确是一个非常实用的技巧。AS3引入了类型数组——Vector类型,Vector和Array共享大量的方法和属性,不同之处仅在于Vector是静态类型,而Array是动态类型。在程序中,我们经常会对Array对象进行方法扩展,使用 Duck typing 之后,就可以将这些扩展应用到Vector类型的数据上去。

/**
 * 将一个路径列表序列化并发送给服务器
 * @param path 路径列表,支持 Array, Vector.<Number|int|uint|Point|String>
 */
public function writePath(path:*):void
{
   if(!isArrayLike(path)) return; // 不是可操作的类数组类型
   var parthString:String = ""
   for(var i:int = 0; i<path.length; i++)
	parthString += path[i];
   // ...
   // writing path data to a socket byte array
   // ...
}

/**
 * Finds out if an object is a generic Vector.
 * It works because the value returned for getQualifiedClassName(a vector)
 * is "__AS3__.vec::Vector.<the vector's type>".
 * @param object Object Any object.
 * @return Boolean True if the object is a generic Vector, false otherwise.
 */
function isArrayLike(object:Object):Boolean
{
    if(object is Array) return true;
    var class_name:String = getQualifiedClassName(object);
    return class_name.indexOf("__AS3__.vec::Vector.") === 0;
}

《在FLASH平台上开发大型游戏》- 我在Adobe技术峰会上的发言演讲稿

这是我在2010年4月Adobe中国技术峰会上的演讲讲义。其中主要介绍了我们团队通过在FLASH平台上进行大型软件开发所遇到的周折和探索出的解决和提高的方法。

会后有见腾讯的FLASH开发组博客说我所讲的内容和题目不符。我认为不尽然,每一款游戏开发的具体设计林林总总不一而足。而从技术角度保证你的游戏软件产品不失败的关键是要提高你的软件的产品质量。FLASH技术经过这么多年的演变,已经逐步成熟为一个可靠的软件平台。Adobe为了保证其工具软件的销量,在这个过程投入巨大的资源来维护兼容性,以使得这个巨大的变化能在潜移默化中完成。当越来越多的软件通过FLASH平台在互联网上发布时,软件质量对于产品的重要性已经远远不是Timeline coders所能够实现的。希望我所整理的这些经验和工具能够为大家提供帮助。

《Flash应用程序的内存管理机制和优化方法》- SWFSH 活动发言稿

这是1月的FLASH开发者交流会上我的发言稿,主要讨论FLASH播放器的内存机制、对于这个机制的观察和理解,以及在此基础上如何进行优化。

会议现场的视频:

讲稿PPT:

COC风味的 Flash Builder 代码自动生产功能

Flash Builder 留给我一个大遗憾就是到了4.0还没有提供code template功能,所以要大量编码的时候,还是不得不回到FDT,因为里面积累了许多代码自动完成的模板。昨天不经意间GOOGLE到一个很有意思的东西叫做EclipseMonkey 这个工具可以以脚本的方式玩弄Eclipse的DOM,爽!于是我借用了些Ruby的 convention over configuration 腔调,写了一个自动生产属性和方法的EM脚本

下面是这个东东具体效用的slide,有图有真相,废话不多讲。