posts - 7,comments - 17,trackbacks - 0

 今天这篇主要说说nx系统的模板和缓存。目前缓存这方面,我思考的比较初级,也希望这篇文章能够吸引来一些高手,一起讨论这方面的设计问题。

 为啥要选择模板去做网站,最初的阶段尝试使用,原因非常简单,就是为了提升性能。刚才是做web项目的时候,发现网页展示的慢,数据库的统计查询是最大的瓶颈。

 比如某个seo页面,设计产品同事,需要a-b点线路,b-c点的线路,c-d点线路,这种组合条件。没有办法一条sql语句解决。那个时候采用拼stringbuilder的方法,然后把该模块缓存在内存中。后来发现维护是个大问题,n多行的stringbuilder,找个东西,要痛苦死了,如果页面设计变更,那更是痛苦。需要重新绑定大多数内容。不过虽然累点,但是网站性能还是有了保证了。

            strBuilder.Append("<div class=\"login\">");
strBuilder.Append("<div class=\"lleft\" style=\"padding-left:240px;pading-top:20px;\">");
strBuilder.Append("<ul>");

之后的开发过程中,发现stringbuilder拼成网页,性能更好,基本可以达到响应的极限。我测试下来,一般相应也就几毫秒到二十几毫秒左右。但是方法傻了点。所以在之后的开发,特意留意一下,发现模板引擎可以解决目前碰到的问题。但是程序员需要学习另外的编程语言格式。不过这种学习成本,还是比较小的。

下图是使用模板绑定一个div数据

    <div class="chanelBox w220">
<vt:function var="vCaseTitle" method="GetNewsCategoryList" type="BusinessRule.NewsCategoryDAL"
args="90" />
<div class="title28 clearfix">
<span class="left f14 bold blue ml_10 mt_8">{$:vCaseTitle.rows.0.CategoryShow}</span>
</div>
<div class="content pd_10 lineH180" style="height: 222px; overflow-y: hidden">
<vt:function var="vCaseNews" method="GetTopNewByCategory" type="BusinessRule.NewsDAL"
args="njcase" args="15" />
<vt:foreach from="$vCaseNews" item="vCaseNewItem" index="m">
<vt:function var="vCaseNewShortTitle" method="InterceptionString" type="CommonUtility.StringHelper"
args="$vCaseNewItem.NewsTitle" args="15"/>
<vt:function var="vCaseTitleUrl" method="GetNewsUrl" type="HtmlUrlHelper"
args="$vCaseNewItem.SubDomainCode" args="$vCaseNewItem.CategoryTableName"
args="$vCaseNewItem.News_Id" />
<p>
<span class="xing">*</span> <a target="blank" href="{$:vCaseTitleUrl}" class="dark">{$:vCaseNewShortTitle}</a></p>
</vt:foreach>
</div>
</div>

采用模板之后还解决了共用模块的编程。比如我把网页头作为一个共用模板,那在页面里面,我可以直接使用模板输出。

  <vt:function var="vNavTopHtml" method="GetComponentsHtml" type="NxCms.Core.TemplateDAL"
args="navtop" args="www" output="true" />

大多数页面,都可以粗暴的缓存了,反正一存就是一个页面。客户请求,我直接响应缓存即可。这样开发维护成本都比较小。

比如我的cms需要更新一条新闻,缓存数据源,我只需要更新数据源,不用更新整个页面。相比更新板块,更新整个页面,耗费的资源,肯定是比较大的。就写这么多吧。

 

年后主要研究red5视频聊天,所以啥事情都懒的做。也没啥精神写东西。目前视频聊天这方面,技术上面已经解决了很多问题,大体成为一个产品,已经就在眼前了,之后可以研究的东西也很多了,比如网络通讯,视频格式,图像处理等。需要继续加油了。

 

posted @ 2012-02-28 21:47 编程趋势 阅读(889) 评论(0) 编辑

 今天需要设置Flex中的Camera组件的一些属性,后来发现清晰度不是很高,于是捣鼓了上午半天,设置了很多的参数,竟然发现手册上就是有现成的一些设置方法,郁闷!不过我还是专门设置了几个有用和必要的属性,为自己的程序中应用,其实很简单!
以此为例:
Camera.setMode(320,240,15);

就是要设置一个宽320、高240、播放速率是15fps,他的带宽消耗:

(320*240*15)/1000000 = 1.2(Mbps) = 1152000(Bps)//1000000是1024*1024的取舍写法也即:1000*1000而获得的;

 关于所消耗的带宽,换成我们能看懂的带宽计算就是:

320*240*15/8000 = 144K/s (也即每秒144K)//由此可见,画面的尺寸和播放率的播放效果是跟带宽有一定的关系的~

接下来可以这样设置视频的质量:
由于在设置的时候function setQuality(bandwidth:int, quality:int)使用的单位是不一样的,bandwidth使用的是kbps,而不是Bps,要转换(8 bits =1 byte ),所以要转换一下1152000/8 = 144000 (kbps) ,
接下来要设置播放的质量时候必须这样设置

Camera.setQuality(144000,85);// (85为常规的视频质量,最好就采用这个数值)

接下来就是设置传输的视频关键帧了,可以根据实际的带宽情况来设置,记住:关键帧数值越小带宽使用率越大,反之关键帧数值越大带宽使用率越小。值 例如:1 表示每一帧都是关键帧,那么就是每帧都要传输出去,就会加大带宽的使用了,依此类推。可接受值为 1 至 48。对于画面质量要求不高的话,可以设置到48;对于质量要求很高的话,最好设置到5-10左右;

Camera.setKeyFrameInterval(48);

对于摄像头来说,最佳的成像比例是4:3,所以最好是将所成像的比例按照这个最小比例设置!

下面是网络摄像头和数字视频摄像头内置的典型设置:

160 x 120
176 x 144
320 x 240
360 x 240
352 x 288
640 x 480

本地视频捕捉分辨率一般都设置为4:3(宽和高)的比例。虽然没有操作比例的必要,当你入门它不是一个坏的想法。用4:3的比例,您能够优化你的摄像头看到的东西。


一些Flex的Camera的常规设定:

打开摄像头:
Camera camera = Camera.getCamera();

//将摄像头的捕获模式设置为最符合指定要求的本机模式.
camera.setMode(240,180,15);

//指定进行完整传输而不由视频压缩算法进行插值处理的视频帧(称为关键帧)。camera.setKeyFrameInterval(60);

//设置每秒的最大带宽或当前输出视频输入信号所需的画面质量
camera.setQuality(144,85 );
Video video = new Video(camera.width*2, camera.height*2);

//正在捕获视频数据的 Camera 对象
video.attachCamera(camera);


关闭摄像头:

//如果 getCamera() 返回 null,则表明摄像头正由另一个应用程序使用,或者系统上没有安装摄像头。
camera = Camera.getCamera(null);
camera = null;

//正在捕获视频数据的 Camera 对象。 若要切断与该 Video 对象的连接,请传递 null
video.attachCamera(null);

 

记录这篇文章,备忘一下

posted @ 2012-02-20 18:02 编程趋势 阅读(112) 评论(0) 编辑

 

今天把red5 rc1版本安装在服务器上,发现有错误,需要删除两个jar文件。

异常java.lang.ClassCastException:org.slf4j.helpers.BasicMDCAdapter不能转换为ch.qos.logback.classic.util.LogbackMDCAdapter

 
java.lang.ClassCastException: org.slf4j.helpers.BasicMDCAdapter cannot be cast to ch.qos.logback.classic.util.LogbackMDCAdapter
 
    at ch.qos.logback.classic.spi.LoggingEvent.<init>(LoggingEvent.java:133)
    at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:469)
    at ch.qos.logback.classic.Logger.filterAndLog_1(Logger.java:443)
    at ch.qos.logback.classic.Logger.info(Logger.java:633)
    at org.red5.server.Launcher.launch(Launcher.java:56)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at org.red5.server.Bootstrap.bootStrap(Bootstrap.java:135)
    at org.red5.server.Bootstrap.main(Bootstrap.java:50)
 
 
删除这两个文件才能正常运行...
 
com.springsource.slf4j.juli - 1.6.1.jar 
com.springsource.slf4j.log4j-1.6.1.jar 
posted @ 2012-02-18 14:22 编程趋势 阅读(54) 评论(0) 编辑

在用flex做视频系统的时候,想到一个需求,就是客户录制自己的桌面,远程给red5服务器,red5服务器接受,通过rtmp协议分发给其他用户。

客户端发送视频到red5,有几种方式:

1.使用flex air作为客户端。这种方式最为原生,成本也最小。我考虑在下一步的学习中研究。

2.使用其他程序实现rtmp,比如java,.net。这种方法需要自己实现,难度有点大,还需要研究rtmp协议。目前没有太强烈的需求。

3.使用已有开源项目实现。这种比较简单,还可以顺便学习一下rtmp协议的实现。

在网上找了几个开源项目,找的还真费力。其中最靠谱的,肯定是直接从red5里面剥离,看看源码放弃了。包之间引用看起来比较复杂。从源码里面,也没太明白rtmp接收入口。

之后有找到一个商业项目juv,要钱,大约399美元。价格太贵,也放弃了。 项目地址:http://www.smaxe.com/juvclient.jsf

最后找到flazr,Flazr 是一个实现了 RTMP 流媒体传输协议的 Java 类库,里面还包括客户端,看起来还是比较有戏。下载之后看了一下代码,感觉是从也是从red5剥离下来的。

下图是我把本地录屏传输到red5 oflademo中的显示效果。

如果有需要交流red5和flex的,可以加入我的微博,一起讨论哦

 

 

posted @ 2012-02-03 15:07 编程趋势 阅读(871) 评论(3) 编辑

 2011年暑假的时候,产生了设计一个cms的念头。采用的是asp.net技术。

   主要原因有五

原因一:公司不断的在做新站,新站(三到四个)的维护量比较大。新站和老站用了几个新闻管理后台。程序员维护工作量比较大。而且老代码写的不是太好,比如like横飞,sql乱爬。修改起来牵连太多,非常容易出错,出错了,找到错误需要花费大量时间。

原因二:上一家公司,有一个部门,专门做站群,大约10-30个人,天天上seo站,这些站都是程序员操作,一个人花几周的时间做一个站,听说做了好几千个,很多站之间没啥区别,就是样式换换,url换换,title换换,数据源换换。当时在公司,觉得这样好傻。说别人傻么,自己比较提出解决方法,否则傻的就是自己了。

原因三:解决程序员和美工编辑的分工,美工编辑上个专题,直接跑过来,找个程序员,就叫上,每次都吓到我。程序员应该多花时间学习新技术。重复劳动,交给系统把。

原因四:做了这么久的asp.net b2c网站,深深的感觉asp.net编译一次不容易。项目变大,页面数量变多的时候,编译发布一次,那个叫喷血啊。之前机器性能差,编译一次,要等好几分钟,天天啥事情不用干了,等vs工作。

原因五:url自己重写,方便seo,自己配置,控制能力更强。特别体现在二级域名上边。

还有性能,缓存,模块重用等等等等,都是问题。

中间插上一小段,曾经看到一个兄弟做项目用到url重写,看了一眼http.ini文件,吓到我了,每个城市地区都加上一条映射。一个项目粗看,起码加上了成百上千条。口味太重。

例子:

http://www.xx.com/suzhou/1.html

http://www.xx.com/nanjing/2.html

 

 

本人比较懒,在年轻的时候也受到过开源项目的伤害(主要是代码看不懂,项目配置不起来),所以就按照工作需求设计。nxcms主要是单个web,实现多站系统,并且系统间相对独立,这样可以快速上新站,并且后台采用通用方式。页面采用模块开发。

使用的技术也很简单,VTemplate,dbhelper,log4net

特别要感谢VTemplate这个开源项目。http://www.cnblogs.com/kingthy/,曾几何时,为了提高性能,我还拿页面拼string,有了模版技术,开发起来,爽多了。

上图:网站结构图

 

页面请求流程:

用户请求-》iis-》识别用户域名二级域名等信息-》urlmodule-》加载页模板-》数据绑定。

数据简图:

页面管理融合了页面的基本信息,url重写信息等,页模板的保存。并且开除编辑后台,让编辑最快速的上线专题。

新闻站seo理想结构,以下是我目前的粗浅认识:

http://www.xx.com/

http://www.xx.com/html/

http://www.xx.com/html/index_2.html

http://www.xx.com/html/1.html

http://www.xx.com/html/jc/

http://www.xx.com/html/jc/index_2.html

http://www.xx.com/html/jc/1.html

 

图片和资源管理,当然也是通过数据库管理,接下来的文章,我会对每个用到的技术点进行分析。比如url重写,比较我在项目中对缓存的理解。并且之后的文章,我还会写到程序员,美工编辑,通过系统协同工作。

项目的开发,参考了discuz的开源代码,对此表示感谢。

这段时间,我也在研究flex,android,flex开发分成二部分,一个是red5开发视频服务器,还一个主要是针对pad。有兴趣的朋友,可以加我的微博,一起讨论哦

http://weibo.com/codetrend

posted @ 2012-01-16 15:05 编程趋势 阅读(1417) 评论(4) 编辑
摘要: 一般程序员用百度的很少,即使用,多半也是搜写娱乐八卦,所以google访问速度太慢,非常影响程序员的工作效率。原因是在海外用Google一直都很顺畅,并无任何重大的问题,但中国当局针对Google有新一轮的防火墙升级,这次升级的特色,就是针对Google一 系列加密的服务,包括了加密版本的Google搜寻服务,以及利用加密功能进行通讯的Gmail,每隔十分钟,中国两大电讯公司的海外关闸,就会针对 Google的通讯作出处理,令你和Google主机之间的连接出现间歇性中断。解决方法是修改host文件,把下面这段粘帖进去,就可以解决。#Google By FGQI 203.208.46.165 0阅读全文
posted @ 2012-01-13 17:50 编程趋势 阅读(330) 评论(8) 编辑
摘要: 最近准备拿flex做个项目练练手,初步设定需求是个视频聊天软件,通信视频服务选用red5,远程录屏选用java开源项目,前端使用flex。在开发过程中,碰到一些小问题,通过博客记录下来,方便以后回顾。 客户聊天功能我使用了两种方式进行数据传输,客户端都监听shareobject对象,还有一种是客服端call服务器的方法,通过服务器invoke通知。这中间模块建立的模块有点多,感觉挺乱的,所以采用动态模块加载。 网上查了一下,看到模块加载,有两种方式,一种是ModuleLoader,另一种是使用ModuleManager。网上说ModuleLoader比ModuleManager简单,实际使用.阅读全文
posted @ 2012-01-06 14:10 编程趋势 阅读(1239) 评论(2) 编辑
仅列出标题