Fork me on GitHub

处理列表中事件侦听器的优化

Publish: April 27, 2012 Category: as3/flash No Comments

案例/需求:如下图所示,一个显示列表,假如需要给列表增加点击事件,在点击的时候对列表做一些操作。

一般的做法是:遍历每一行的容器,给这个容器增加一个点击事件,然后在点击事件里得到currentTarget。

as3-list-event.jpg

优化:可以在这个列表容器直接附加一个事件侦听器即可,也就是每一行的父容器增加一个点击事件侦听器,然后在事件方法里通过event.Target得到用户当前点击的是哪一行。

阅读剩余部分...

用nodejs登录qq,用nodejs做一个命令行的qq客户端

Publish: April 23, 2012 Category: node.js No Comments

nodejs提供的http模块让我可以很方便的实现http协议的get/post提交,然后看到手机3GQQ的http登录方式,得到这两种信息,不难抓取出http方式登录qq的协议。如下图

未命名.jpg

已经实现获取qq在线好友列表。不过如果有多次密码出错会需要输入验证码。验证码图片已经保存到当前目录。不过暂时没实现验证码功能。

代码在这里:https://github.com/play175/nodeqq

 用到的工具有chrome,然后安装插件:

  1. User-Agent Switcherfor Chrome:把user-agent修改为android手机浏览器。
  2. Web Developer:可以分析页面的表单信息;
  3. postman:可以模拟post提交。

win2003系统chrome的windows media palyer插件

Publish: April 18, 2012 Category: 未分类内容 2 Comments

 windows server 2003/win2003系统chrome的windows media palyer插件:

在win2003上安装Windows media palyer插件会提示:Package not support server operating systems,说安装包不支持server版的操作系统:

Google到这篇文章:http://arnoutboer.nl/weblog/?p=24 找到解决方案,就是用orca编辑msi安装包的启动条件。

我直接把修改后的安装文件放到这里提供给需要的同学。

下载地址1(本地):wmpChromepPugin.zip (243kb)

 ps:其实其他安装包如果不能在windows server 2003下安装也都可以采用类似的方法,去掉系统限制条件(比如:iTunes)

nodejs新特性cluster的使用

Publish: April 18, 2012 Category: node.js No Comments

Q:cluster是什么?cluster应该怎么用?cluster是多进程吗?

A:nodejs增加了一个模块cluster用于实现node的多进程,其实这是对子进程(child_process)操作的一个封装,让我们更简单的使用多进程来增加程序在多核CPU机器上的性能表现。

关于cluster的使用,新手或者不了解真相的童鞋很容易犯错。举个例子:

  1. var cluster = require('cluster'); 
  2. var share_var = 0;//这里定义数据不会被所有进程共享,各个进程有各自的内存区域 
  3. if (cluster.isMaster) { 
  4.     //当前代码在主进程中 
  5.     var numCPUs = require('os').cpus().length; 
  6.     for (var i = 0; i < numCPUs; i++) { 
  7.         var worker = cluster.fork(); 
  8.     }    
  9.     share_var++; //这里操作的是当前进程中的数据 
  10. else { 
  11.      //当前代码在子进程中,会被调用numCPUs次 
  12.     share_var++; //这里操作的是当前进程中的数据 

不少人以为在全局定义了变量share_var,可以被master和所有worker共享,其实各个进程是不能共享这个变量的。

如果需要共享数据,需要在进程间使用消息通知来达到这个目的。官方文档中的例子很好的说明了进程间如果共享数据:

阅读剩余部分...

一种很好的九宫格图片的处理方式

Publish: April 13, 2012 Category: 未分类内容,as3/flash No Comments

 在图片需要放大时,需要采用scale9grid(九宫格)放大,这样处理就保证了图片边缘不会因为放大而比例失常导致失真,

而在处理九宫格图片时我们需要边角的宽高像素,这个信息可以保存在UI配置文件或者代码中,当然最好的方式是保存在图片中,这样美术在输出九宫格图片的时候就可以按照自己的要求给出边角像素。

在google的android也定义了一种九宫格png,今天在看迅雷的皮肤就发现一个很好的方式,请先看图:

MainFrame.png  NormalFrame.png  TipsFrame.png  welcomeFrame.png 

上门几个图片,用特定颜色的线条标识出了九宫格的边角宽高,然后在程序处理图片的时候,只要根据特定颜色,找到这根线,然后进一步根据线条切割出九宫格需要的边角图片就可以了。(迅雷这个紫色是被程序处理成透明色,这样还可以达到非规则边缘的图片透明效果)

这个方式适用于所有的开发领域,值得借鉴!

关于RPC、Remoting通用做法的思考

Publish: March 30, 2012 Category: 未分类内容 No Comments

 这篇文章会持续更新关于rpc、Remoing,C/S间3通信方式的思考碎片。

在写node_rpc这个通信框架和以前的flash webgame(YYNetwork)开发中,通信都是基于一种类似RPC的通信方式,也即是客户端和服务端相互调用各自的公开方法,这种调用时透明的,逻辑部分不需要考虑通信层的具体实现,类似直接调用本地方法。由于调用远程的方法是通过网络传输的异步方式,所以这些调用都会提供一个回调方法(callback)的参数。

1.首先,既然互相调用方法,那么需要互相公开方法和方法的参数。这可以通过人工或者自动的方式来互相公开,也可以在建立连接的时候服务端和客户端各自智能读取应该公开的方法列表发给对方。人工方式公开就是在服务端和客户端写代码的时候,人为的吧方法名称写在代码里,通信的时候传输这个方法名字或者方法列表的索引数字。
    在node_rpc的实现是通过在建立连接,初始化的时候互相将公开的方法列表发给对方的,服务端把服务端的方法列表发给客户端,客户端把客户端的方法发给服务端,这样各自都存有对方的方法列表,建立一个对方法名称的索引,以后通信的时候能只需要传这个索引,加上参数就可以了。

Effective C#

Publish: March 30, 2012 Category: C# No Comments

引用来源:http://www.dotblogs.com.tw/alonstar/archive/2009/11/06/11439.aspx?fid=13918

其实一开始是在找Effective C#这本书…结果发现CodeProject上面有不错的文章,有几点是蛮常用的,另外还有后来其它人讨论过,有别的意见的,就整理一下跟大家分享一下:D

来源:http://www.codeproject.com/KB/cs/effectivecspart1.aspx

‧Item1 - Prefer the Length property when checking string size. [Performance]
‧Item2 - Prefer StringBuilder over string concatenation. [Performance]
‧Item3 - Avoid Boxing and UnBoxing as much as possible. [Performance]
‧Item4 - Prefer String.Equal method over == operator. [Performance]
‧Item5 - Use Native Image Generator (Ngen.exe) in case of long and heavy initialization. [Performance]
‧Item6 - Prefer 'for' over 'foreach'. [Performance]  <<有待讨论
‧Item7 - Prefer the 'as' operator over direct type casting. [Usage]
‧Item8 - Use the 'checked' keyword to avoid overflow. [Usage]
‧Item9 - Use the 'is' operator before casting. [Usage]
‧Item10 - Use Explicit interface to 'hide' the implementation of an interface. [Usage]
‧Item11 - Use @ to ease the work with literal paths. [Usage]
‧Item12 - Make your API assembly CLS compliant. [Usage]
‧Item13 - Define destructor and implement IDisposable interface for classes that use native resources directly. [Garbage Collection]
‧Item14 - Avoid the use of GC.Collect [Garbage Collection]
‧Item15 - Use StructLayout attribute, for classes and structs, when using COM Interop. [COM Interop]

 

‧Item1 - Prefer the Length property when checking string size. (使用Length属性来判断字串大小。)


通常判断字串是否为空有好几个方法,如果确认字串不可能为null,则使用Length; 如果可能为null,则使用String.IsNullOrEmpty。

儘量不要直接使用!=。

  1. if(str != "") {};  
  2. if(str.Length > 0) {};  
  3. if(!String.IsNullOrEmpty(str)) {};  
 
 

 [Performance][VB.NET].NET空字串判断彻底研究

‧Item2 - Prefer StringBuilder over string concatenation. (使用StringBuilder来进行字串连接)


在大量文字串接的时候,儘量使用StringBuilder,比较简省效能,不过有时候还是要依据不同的状况而定。
可以参考
StringBuilder串接字串的迷思 
String与Stringbuilder组字串的效能比较

  1. //NO 
  2. String strConcat; 
  3. ArrayList arrayOfStrings = new ArrayList(); 
  4. arrayOfStrings.Add("a");  
  5. arrayOfStrings.Add("b"); 
  6. foreach (string s in stringContainer) { 
  7.   strConcat += s;  
  8. }  
  9.  
  10. //YES 
  11. StringBuilder sbConcat = new StringBuilder (); 
  12. foreach (string s in arrayOfStrings ) {  
  13.   sbConcat.append(s); 
  14. }  
 
 

阅读剩余部分...

node_rpc——浏览器客户端和node服务端之间的通信库

Publish: March 29, 2012 Category: project,node.js No Comments

 
node_rpc是一个兼容IE6、7、8和所有浏览器的浏览器客户端和node服务端之间的通信库,Ajax Long Pooling (comet)

 

Use/使用

Server/服务端:

  1. var app = require('node_exsvr'); 
  2. var node_rpc =  require('node_rpc'); 
  3.  
  4. //监听,默认80端口 
  5. app.listen(); 
  6.  
  7. //静态文件 
  8. app.get('/',app.staticHandler('index.html')); 
  9.  
  10. //node_rpc 
  11. node_rpc(function(client){ 
  12.    //客户端连接成功 
  13.     console.log('welcome,'+client.sessionID); 
  14.  
  15.     this.login = function(name){//方法被客户端调用 
  16.         console.log(name); 
  17.         client.hello('hello,'+name);//直接调用客户端方法 
  18.         return ({ss:'1'});//返回json对象给客户端 
  19.     }; 
  20.      
  21.     this.say = function (msg,callback) { 
  22.         console.log(msg); 
  23.         callback('you said.'); 
  24.     }; 
  25. },app); 

Client/客户端:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  2. <html xmlns="http://www.w3.org/1999/xhtml">  
  3.  <head>  
  4.   <title> node_rpc </title>  
  5.   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  6.   <script type="text/javascript" src="/noderpc.js"></script>  
  7.  </head>  
  8.  <body onload="ready()">  
  9.   <h1>node_rpc</h1>  
  10.   <script type="text/javascript">  
  11.   <!--  
  12.    
    1. function ready() {   
    2.        node_rpc(function(){   
    3.            this.hello = function(s){//将可直接被服务端调用   
    4.            console.log(s);   
    5.            };   
    6.            this.count = function(s){//将可直接被服务端调用   
    7.                console.log('count:'+s);   
    8.            };   
    9.        }).connect(function (remote) {   
    10.                //直接调用服务端   
    11.               remote.login('xxx',function(res){   
    12.                    console.log(res);//从服务端返回   
    13.                    remote.say('hello,svr',function(r){   
    14.                        console.log('say,return:'+r);   
    15.                    });   
    16.               });   
    17.        });   
    18.    }   
  13.   //-->  
  14.   </script>  
  15.  </body>  
  16. </html>  

Contact

yoyo (http://yoyo.play175.com/)

Download

 

You can download this project in either zip or tar formats.

You can also clone the project withGit by running:

$ git clone git://github.com/play175/node_rpc

 

nodejs作为网游服务端的可行性尝试

Publish: March 28, 2012 Category: node.js No Comments

nodejs是什么?回答这个问题,我节选了百度百科关于nodejs的描述:

Node是一个Javascript运行环境(runtime)。实际上它是对GoogleV8引擎(应用于Google Chrome浏览器)进行了封装。V8引 擎执行Javascript的速度非常快,性能非常好。Node对一些特殊用例进行了优化,提供了替代的API,使得V8在非浏览器环境下运行得更好。例 如,在服务器环境中,处理二进制数据通常是必不可少的,但Javascript对此支持不足,因此,V8.Node增加了Buffer类,方便并且高效地 处理二进制数据。因此,Node不仅仅简单的使用了V8,还对其进行了优化,使其在各环境下更加给力。 V8引擎本身使用了一些最新的编译技术。这使得用Javascript这类高级语言编写出来的代码与用C这类高级语言写出来的代码性能相差无几,却节省了开发成本。对性能的苛求是Node的一个关键因素。 Javascript是一个事件驱动语言,Node利用了这个优点,编写出可扩展性高的服务器。Node采用了一个称为“事件循环(event loop)”的架构,使得编写可扩展性高的服务器变得既容易又安全。提高服务器性能的技巧有多种多样。Node选择了一种既能提高性能,又能减低开发复杂 度的架构。这是一个非常重要的特性。并发编程通常很复杂且布满地雷。Node绕过了这些,但仍提供很好的性能。

目前已经有不少游戏使用node来做gameserver了,在mozilla有一个开源项目叫BrowserQuest就是用HTML5 canvas + node.js制作的。你可以在这里在线试玩:http://browserquest.mozilla.org/,该项目的github地址是:https://github.com/mozilla/BrowserQuest .

从截图可以看到,当前游戏在线人数有1300多人(可以在http://browserquest.mozilla.org/status/看到更多游戏当前的在线数据):

BrowserQuest.jpg

未完待续。。

node_exsvr——nodejs一个简单的web服务器

Publish: March 27, 2012 Category: project,node.js No Comments

node_exsvr 是一个简单的web服务器,为web服务做了很多基础工作 ,如果你正在制作一个简单高效快速开发的web服务,这是一个不错的选择

项目主页:http://play175.github.com/node_exsvr/

代码开源/githubhttps://github.com/play175/node_exsvr

特性

  • 支持get/post路由
  • 支持全局handle路由(没有cookie和session的支持,比get和post路由的效率更高)
  • 支持cookie
  • 支持json输入和输出
  • 支持body parser
  • 支持session

阅读剩余部分...