2009-05-08
最近想用Flex 做一个应用,其实是对原先的一个应用重新写(easylf.net) ,原因有两个:
1.easylf.net 是在学Flex 的过程中写的,代码很乱很不成熟,需要重新写了。
2.后台用asp.net 2.0 提供服务,经过这么长时间的体会发现Java 才是服务端的王道。
慢是原先的一个严重问题,所以新版本方方面面都要为效率考虑,老的的应用以WebService 提供服务,无疑是超级慢服务调用协议,经过无数次的上百度Google,终于找到了高科技AMF3,据说效率非常高,最起码在Flex 上是这样,结果来源于这样的一个测试网站
http://www.jamesward.com/census/
这是我的测试结果:
测试启用了GZIP,5000行返回数据
?

哇,AMF3好强,虽然大家都明知道是Adobe 在Flex 上对这个东西进行了特殊优化,但就像显摆大牛说的那样:“最起码我们知道在Flex上什么效率最高”
Flex 的 remoting service 中,有大概这么几种 :
1.HTTP Service
2.Web Service
3.RPC
HTTP Service 无疑是最灵活最强大的方式,但也最麻烦,需要自己定制的东西太多,自己做解析自己做加密,我是个天生的懒人,所以首先排除。我更想把精力放在功能上,而不是无谓的敲重复代码。
Web Service 前一段挺时髦的东西,各大语言技术均支持,根本不用考虑兼容性的问题,而且有完善的标准,一旦想和别人的系统做接口也很容易做到,但缺点就是解析效率太成问题了,以前做的东西慢的像牛一样,这样庞大的东西不适合我这种轻量级的应用。
RPC (Remote Procedure Call :远程过程调用协议)简单说就是直接调用服务器端的对象方法,而不用专门为这些需要调用的方法写接口或wsdl描述文档,这无疑超级适合我这种懒人,在client 犹如调用本地方法一样调用server的对象和方法。
针对Flex 和 JAVA 之前的RPC ,有很多的选择,例如:
LiveCycle Data Services ,BlazeDS GraniteDS
LDS 是 Adobe 官方的付费框架,功能强大,但谁让咱是穷人呢
BlazeDS 是Adobe官方推出的开源项目,功能上是LDS的阉割版本,同时也不如GraniteDS 强大
GraniteDS 是由第三方推出的开源RPC 框架,功能强大,但自从BlazeDS 推出后,似乎GDS的作者也感到前途渺茫,详情可看此文
未完待继续
2007-06-28
工作三个月了,工作上一直在做C/S 的东西,一直没太多的时间捣鼓一些小玩意,不过最近又重新开始接触B/S ,这让我想起了以前做的一个小东东,应该在Blog中提一下,算是做个广告吧。
这是我学习Flex 的过程中的一个作品,做的很粗糙,不过是一边做一边学,也不能在质量上要求很高,前台是 Flex 2 用 Flex Builder 2 构建 ,后台为 .NET Web Service 用 Visual Studio 2005 构建,语言是VB.NET 。
还是用老的www.easylf.net 的空间和域名,似乎搞了几次什么也没成功,现在完全变成实验田了,这样也不错。
现在仅仅做了个记事本和文件夹的功能,功能简单,bug 多多,以后有时间慢慢改进吧。
前一阵子FreeTime 一直在搞Flex ,现在基本没有时间了,最近工作上的事情比较多,我又是新手,所以做什么事情都要打出点时间的富裕,用来修改bug。现在只能用时间来弥补质量上的不足。最近加班比较多,希望忙过这一段,可以休息一下。
2007-05-17
今天遇到了一个C++Builder 全局变量的问题,经过查找资料,终于解决了
A.CPP
#include <B.H>
ShowMessage(MainVersion);
B.H
AnsiString MainVersion;
C.CPP
#include <B.H>
MainVersion=”T-bag”;
这样三个文件,C.CPP 修改了 MainVersion 的值后,A.cpp显示为空,奇怪哈。
Google 得到:全局变量需要加:extern 关键字
于是修改为:extern AnsiString MainVersion
问题依然如故
再Google ,原来VCL 对 extern 关键字做了扩展,改为
extern PACKAGE AnsiString MainVersion;
编译失败,
在B.CPP 中加入
AnsiString MainVersion;
问题全部解决。
奇怪哈,以前声明全局变量只放在.H 文件中,用extern PACKAGE 关键字还需要在.CPP中写一份,不知道其中的原因,如果哪位看官明白,请告诉小弟。
在印象中,S51 和 S52的区别不太大,正是由于平常的不仔细,在后面的开发中遇到了问题,记忆深刻,特意把一些经验记录下来,希望能给需要的人一些帮助。
前些日子,朋友有几台基于89S51的设备需要维修,实际上就是MCU坏掉了,由于厂家已经不给维护,只能重写全部程序,在对设备的硬件仔细研究之后,我开始动手了。
由于当时手头没有PLCC封装的89S51 ,就用 89S52 替代,毕竟硬件外围电路上,89S51 和S52 是没有区别的(也可能有,但我还没发现,呵呵)。没多长时间,程序开发调试完成。于是买来几块89S51,准备编译一下,问题出现了,首先出现错误提示:
ADDRESS SPACE OVERFLOW XXXX
经Google得到,原来89S51 的 内存只有 128字节 而89S52内存有 256 字节,明显是内存不够用了,经过优化减少全局变量,Data=110.4 bytes 已经少于 128字节,编译成功,烧写。
芯片装到设备上,出现了跑飞的情况,原以为是程序逻辑的问题,经过仔细查找没发现错误的地方,但程序仍然跑飞,很奇怪。
再Google ,发现:虽然89S51 有 128 字节的内存,但不能全部给全局变量使用,需要预留20~30字节给堆栈使用,否则程序当然会跑飞。
反复查看代码,发现程序中有一些常量,但仍然放在内存中,比如:
char a[]={'a','b','c','d'};
偶尔发现别人的代码中有这种形式的定义:
char code a[]={'a',b','c','d'};
原来,常量可以放在程序Rom里,于是将一些程序中不需要变化的变量(其实就是常量哈)全部修改为char code a;的形式,烧写,调试,以前跑飞的情况终于解决了。
另外,对于只使用正值的char 可以修改为 unsigned char,也可以节省一些内存。
2007-05-15
2007-04-28
/*=======================================
1602lcd模块驱动程序
==========================================
说明:1.晶体:11.0592MHz
2.1602驱动:ks0066
******************************************/
#i nclude
#i nclude
#define lcm_rs P2_7 //寄存器选择
#define lcm_rw P2_6 //读/写控制
#define lcm_e P2_5 //读/写使能
#define lcm_blk P2_4 //背光led 1.off 0.on
#define lcm_data P0
//函数声明
void delay5ms(void);
void delay400ms(void);
void lcm_write_command(unsigned char wc_lcm,busy_c);
/***********************************
//函数名称: void lcm_ini(void)
//传递参数: 无
//返 回 值: 无
//函数功能: LCM初始化
//函数说明:
***********************************/
void lcm_ini(void)
{
lcm_data = 0;
lcm_write_command(0x38,0); //16*2显示,5*7点阵,8位数据接口,不检测忙
delay5ms();
lcm_write_command(0x38,0);
delay5ms();
lcm_write_command(0x38,0); //三次显示模式, 不检测忙
delay5ms();
lcm_write_command(0x38,1); //16*2显示,5*7点阵,8位数据接口,需要检测忙
lcm_write_command(0x80,1); //关闭显示
lcm_write_command(0x01,1); //clear显示
lcm_write_command(0x06,1); //指针和光标+1,不滚屏
lcm_write_command(0x0c,1); //开显示,不显示光标
}
/***********************************
//函数名称: unsigned char lcm_read_status(void)
//传递参数: 无
//返 回 值: unsigned char
//函数功能: 读lcm状态,等待lcm空闲
//函数说明: DB7=1,忙
***********************************/
unsigned char lcm_read_status(void)
{
lcm_data=0xff;
lcm_rs=0;
lcm_rw=1;
lcm_e=0;
lcm_e=0;
lcm_e=1;
while(lcm_data & 0x80);
return lcm_data;
}
/***********************************
//函数名称: void lcm_write_data(unsigned char wd_lcm)
//传递参数: unsigned char wd_lcm
//返 回 值: 无
//函数功能: lcm写数据
//函数说明:
***********************************/
void lcm_write_data(unsigned char wd_lcm)
{
lcm_read_status(); //判断lcm忙标志
lcm_data = wd_lcm;
lcm_rs = 1;
lcm_rw = 0;
lcm_e = 0;
lcm_e = 0;
lcm_e = 1;
}
/***********************************
//函数名称: void lcm_write_command(unsigned char wc_lcm, busy_c)
//传递参数: unsigned char wc_lcm, busy_c
//返 回 值: 无
//函数功能: lcm写命令
//函数说明: busy_c=0是,不用检测忙信号
***********************************/
void lcm_write_command(unsigned char wc_lcm, busy_c)
{
if (busy_c)
lcm_read_status();
lcm_data = wc_lcm;
lcm_rs=0;
lcm_rw = 0;
lcm_e = 0;
lcm_e = 0;
lcm_e = 1;
}
/***********************************
//函数名称: void disp_one_char(unsigned char x, unsigned char y,unsigned char disp_data)
//传递参数: unsigned char x, unsigned char y,unsigned char disp_data
//返 回 值: 无
//函数功能: 指定位置显示一个字符
//函数说明:
***********************************/
void disp_one_char(unsigned char x,unsigned char y,unsigned disp_data)
{
y = y&0x01;
x = x&0x0f; //限制2行,没行15个字
if (y)
x =x + 0x40; //算RAM地址
x = x + 0x80;
lcm_write_command(x,0);
lcm_write_data(disp_data);
}
/***********************************
//函数名称: void disp_one_char(unsigned char x, unsigned char y,unsigned char *disp_data)
//传递参数: unsigned char x, unsigned char y,unsigned char *disp_data
//返 回 值: 无
//函数功能: 指定位置显示一串字符
//函数说明:
***********************************/
void disp_list_char(unsigned char x,unsigned char y,unsigned char *disp_data)
{
unsigned char char_length,j;
char_length = strlen(disp_data);
y = y&0x1;
x = x&0x0f;
for (j=0;j