skip to main |skip to sidebar

2007-05-30

ColdFusion 8 Beta 公开

ColdFusion 8 的Beta版在 Adobe labs 公开了。(ColdFusion 8 @Labs

主要的新功能有:

  • Server monitoring to help identify server bottlenecks, allowing for tuning and improved performance.
  • Step through code debugging in a new Eclipse plug-in debugger.
  • Adobe Flex™ and Ajax features that let ColdFusion power personalized, multimedia-rich applications to enhance users’ experiences on the web.
  • High-quality, dynamically created on-demand multimedia presentations.
  • PDF document and form integration for a printable, portable way to intelligently capture and share information.
  • Image creation and manipulation with more than 50 new CFML tags and functions.
  • Native support for .NET objects to easily integrate ColdFusion applications with enterprise data and infrastructure services.
  • Significant application runtime and server performance improvements.

2007-05-29

advancedflex - debugger framework 0.1 alpha发布

debugger framework ver 0.1 alphaDbug Project 的第一个公开的框架

它是一个为了Flash&Flex&Apollo测试的框架。

实现的:

  • advancedflex.debugger //公用库。
  • advancedflex.debugger.errors //公用库的错误类库。
  • advancedflex.debugger.display //包含了用AS3.0写的,显示一些信息(比如FPS)的DisplayObject。
  • advancedflex.debugger.display.mxml //包含了用MXML写的,显示一些信息(比如FPS)的组件。

未实现的:

  • advancedflex.debugger.aut //Actionscript Unit Test framework(有GUI,可以用FlexAnt启动)。
  • advancedflex.debugger.logging //Logging framework,增强了mx.logging的框架(有GUI,支持HTML标签)。
  • advancedflex.debugger.ui //用于与GUI窗口(Apollo或Flex写的)通讯的库。

下载

2007-05-27

Advanced Flex Porject

Project Home:http://code.google.com/p/advancedflex/

Project Blog:http://advancedflex.blogspot.com/

这是一个我开发的开源框架希望大家参与开发与维护。

2007-05-25

论Wiki的语法

Wiki的语法实在是太简单了。连小学生都能理解。

Wiki的语法实在是太复杂了。对开发者太不友好。

  • Wiki写的文章要想通过HTML验证难上加难。
  • img标签无法加上alt属性。搜索引擎无法阅读。
  • 为了打"*"等转译字符真是要人命。
  • 无法指定字体的颜色。
  • 机器编译的结果常常与期望的不一样。
  • ……

Wiki本身是好的,但它的语法却如此……

以前的 BB code 虽然较难,但起码HTML验证能通过,搜索引擎能阅读!

2007-05-20

XML/XSL+SWFObject=Flex!

震撼!

XML/XSL + SWFObject(Javascript) = Flex!

源程序是用XML写的,但用了XSLT技术和js,XML变为了Flex

  • Flex对搜索引擎不友好将会一去不复返
  • Flex的大小将减小很多(SWFObject可以缓存,每次只需下载XML即可)。

但它也不是十全十美的。因为它必须用js。希望以后能有所改变。

Flex over XML/XSL

FreeHand 长眠了

虽然还没有正式发表,但已经表示结束开发了。今后将不会添加新功能与改Bug,但还会继续贩卖。支持也不会变。

Illustrator CS3可以使用FreeHand的文件,推荐FreeHand的用户转为Illustrator。凭FreeHand(无论给什么版本)都可以用特别的升级到Illustrator CS3。(FreeHand no longer updated; moving to Illustrator

除了Vista,还可以继续使用。

优胜劣汰,嗨~

2007-05-13

真的需要AOP吗?

关于AOP的介绍,在网上等有很多,在这里不再多说。

真的需要AOP吗?

  • 从运行方式来看类似于Decorator,他会拦截方法,一般是用反射,这就会导致大量资源浪费。
  • 在方法的前后的共同处理一般是写log。所以AOP带来的最大的好处就是Debug。问:一个程序允不允许在Debug上花费大量的资源?一个程序的log到底有多少?
  • 因为AOP是通过Proxy来实现的,所以代码会变得难以阅读。
  • 以后要去掉AOP时,代码的改动会变得很大。
  • 添加AOP时很麻烦。
  • 还不成熟。

FLVCheak发布了!

FLVCheak的alpha版在 Adobe Labs 里发布了。

FLVCheck 是用来验证 Adobe 产品以外的工具来作成的flv文件的格式是否正确的。为了防止因错误的格式的flv在FMS里流式播放时而出错的问题,在播放前检查一次flv文件。

FLVCheak 会修复文件内部的timestamp、metadata、messageHeader的错误。但图像与声音的错误只会弹出错误不会修复。

FLVCheak可以在 Labs 里下载(Adobe Labs Download/Adobe FLVCheck tool)。

这次的alpha版只有win版的。为CUI的DOS命令。使用方法是:

  1. 准备一个flv文件。
  2. 运行下载的zip文件你的 vcredist_x86.exe。(仅限第一次)
  3. 打开DOS。
  4. 运行 FLVCheck(-h会显示帮助)

2007-05-06

Flex2 Tag for JSP

以前在Adobe lab发布了一个Flex Tag Library for JSP的东西,但好像关注的人很少。所以我向大家介绍一下。

使用JSP Tag Library就能在JSP里镶入MXML。这个功能虽包含在flex1.x里,但flex2却没包含。

安装方法:

  1. 停止FDS(它需要FDS 2.0.1,Express版可)。
  2. 下载 (flex2_tag_library_for_jsp.zip: 31KB)。
  3. 把下载的zip文件里的flex-bootstrap-jsp.jar拷贝到/WEB-INF/lib。
  4. 把下载的zip文件里的flex-webtier-jsp.jar拷贝到/WEB-INF/flex/jars。
  5. 在web.xml文件添加以下内容。
    Code:XML
    <taglib>
      <taglib-uri>FlexTagLib</taglib-uri>
      <taglib-location>/WEB-INF/lib/flex-bootstrap-jsp.jar</taglib-location>
    </taglib>
  6. 重启动FDS。

使用方法:

标签的声明:

Code:jsp
<%@ taglib uri="FlexTagLib" prefix="mm" %>

镶入MXML,类似于jsp:include,但它包含的不是jsp,是MXML:

Code:jsp
<mm:mxml source="flexApp.mxml"/>

在jsp里插入MXML代码:

Code:jsp
<mm:mxml>
  <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*">
    <mx:Text text="Hello World" />
  </mx:Application>
</mm:mxml>

还可以动态地编译代码: *因为他不能缓存,所以对开销很大,要注意。

Code:jsp
<mm:mxml>
  <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*">
    <% if (request.isUserInRole("admin")) { %>
      <AdminConsole/>
    <% } else { %>
      <UserConsole/>
    <% } %>
  </mx:Application>
</mm:mxml>

往flex程序里传参数:

Code:jsp
<mm:mxml source="flashvarTest.mxml" width="400" height="200">
  <mm:flashvar name="javaVersion" value='<%= System.getProperty("java.version") %>' />
  <mm:flashvar name="currentDate" value="<%= new java.util.Date().toString() %>"/>
</mm:mxml>

这里向flashvarTest传了javaVersioncurrentDate两个参数。在flex程序里用Application.application.parameters.valueName的形式来访问。

Sample:

Code:jsp
<%@ taglib uri="FlexTagLib" prefix="mm" %>
<mm:mxml height="300" width="600">
  <mm:flashvar name="javaVersion" value='<%= System.getProperty("java.version") %>' />
  <mm:flashvar name="currentDate" value="<%= new java.util.Date().toString() %>"/>
  <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300" >
    <mx:VBox>
      <mx:HBox>
        <mx:Label text="Java version: "/>
        <mx:Label text="{Application.application.parameters.javaVersion}" fontWeight="bold"/>
      </mx:HBox>
      <mx:HBox>
        <mx:Label text="Current Time: "/>
        <mx:Label text="{Application.application.parameters.currentDate}" fontWeight="bold"/>
      </mx:HBox>
    </mx:VBox>
  </mx:Application>
</mm:mxml>

2007-05-04

Apollo入门 - Apollo网络浏览器(2)追加后退按钮

Apollo入门 - Apollo网络浏览器(1)

追加"Back(后退)"按钮

首先追加一个后退按钮

Code:MXML
<?xml version="1.0" encoding="utf-8"?>
<mx:ApolloApplication xmlns:mx="http://www.adobe.com/2006/mxml">
  <mx:HBox>
    <mx:TextInput id="inputTF" width="225" text="http://"/>
    <mx:Button label="Move" click="html.location = inputTF.text;"/>
    <!--后退按钮-->
    <mx:Button label="Back" click="back()"/>
    </mx:HBox>
  <mx:HTML id="html" width="100%" height="100%"/>
</mx:ApolloApplication>

在追加的按钮的标签里有一个click="back()",这是当按下后退按钮时的回调函数。

下面来写back()函数。在MXML里写Actionscript用Script标签。

mx:HBox的前面添加以下内容:

Code:MXML
<mx:Script>
  <![CDATA[
  // 记录历史的数组
  private var history:Array = new Array();
  private function back():void {
    if (history.length > 1) {
      history.pop(); // 移除现在的URL
      var prevURL:String = history[history.length - 1]; // 得到前一个URL
      html.location = prevURL; // 变更HTML组件
      inputTF.text = prevURL; // 变更输入框
    }
  }
  ]]>
</mx:Script>

接着,在URL变更时在history数组里添加一个新的历史记录。

当HTML组件读取完毕时会触发complete事件。所以在HTML组件的标签加上complete="pushURL(event)"

Code:MXML
<mx:HTML id="html" width="100%" height="100%" complete="pushURL(event)"/>

下面来添加pushURL()函数。

Code:Actionscript
private function pushURL(e:Event):void {
  // 添加新的URL
  history.push(html.location);
  // 变更输入框
  inputTF.text = html.location;
}

以下为全部代码。

Code:MXML
<?xml version="1.0" encoding="utf-8"?>
<mx:ApolloApplication xmlns:mx="http://www.adobe.com/2006/mxml">
  <mx:Script>
    <![CDATA[
    // 记录历史的数组
    private var history:Array = new Array();
    private function back():void {
      if (history.length > 1) {
        history.pop(); // 移除现在的URL
        var prevURL:String = history[history.length - 1]; // 得到前一个URL
        html.location = prevURL; // 变更HTML组件
        inputTF.text = prevURL; // 变更输入框
      }
    }
    private function pushURL(e:Event):void {
      // 添加新的URL
      history.push(html.location);
      // 变更输入框
      inputTF.text = html.location;
    }
    ]]>
  </mx:Script>
  <mx:HBox>
    <mx:TextInput id="inputTF" width="225" text="http://"/>
    <mx:Button label="Move" click="html.location = inputTF.text;"/>
    <!--后退按钮-->
    <mx:Button label="Back" click="back()"/>
    </mx:HBox>
  <mx:HTML id="html" width="100%" height="100%" complete="pushURL(event)"/>
</mx:ApolloApplication>

比如我在文本框里输入了http://www.google.cn,点击Move后,就出现了以下画面。

我收到了MXNA的E-mail了

收到了MXNA的E-mail:

Your site has been added to the Macromedia XML News Aggregator (MXNA 2.0):

Apollo入门 - Apollo网络浏览器(1)

我们来做一个Apollo网络浏览器。

1.新建一个Apollo项目。

选择Basic,点Next。

取名为Brower,点Next。

Main Source folder 里写入src,点Next。

  • ID(程序的ID,推存使用类似于com.sample.appName的形式)为sample.Brower。
  • Name(程序的名字)为Brower。
  • Publisher(作者)为你的名字
  • Description(简述)为It is a Apollo Brower。
  • Copyright(版权信息)为2007。

点Finish。

2.在Brower.mxml里写入

Code:MXML
<?xml version="1.0" encoding="utf-8"?>
<mx:ApolloApplication xmlns:mx="http://www.adobe.com/2006/mxml">
  <mx:HBox>
    <mx:TextInput id="inputTF" width="225" text="http://"/>
    <mx:Button label="Move" click="html.location = inputTF.text;"/>
  </mx:HBox>
  <mx:HTML id="html" width="100%" height="100%"/>
</mx:ApolloApplication>

3.按Ctrl+s保存文件,再执行mxml文件。

比如我在文本框里输入了http://www.google.cn,点击Move后,就出现了以下画面。

Apollo的扩展名.air的意思

原文:Aedis.Ju: What about .air mean?

Apollo的文件的扩展名是.air。

它的意思我猜是:

air != atomsphere;

air = ria = RIA = Rich Internet Application!

2007-05-03

鲜为人知的细节 - Number类

从AS2.0转到AS3.0的人可能对新加的类十分了解,但扩展的类可能就有些生疏了。下面来讲一下简单却容易忽略的细节。

Number是能表示浮点小数和整数的类型。它是在IEEE-754里定义的64-bit的双精度浮点小数,可以描述4.94e-324 ~ 1.80e+308的值。相当于Java的Double。(注意,他与AS2.0的Number不一样)

toFixed()(AS3.0新添加)

AS3 function toFixed(fractionDigits:uint):String

toFixed()是保留fractionDigits位小数,再变化为字符串。fractionDigits的范围是0~20。

Code:Actionscript
var num1:Number = 7.31843;
trace(num1.toFixed(2)); // => 7.32
var num2:Number = 4;
trace(num2.toFixed(2)); // =>4.00

toExponential()(AS3.0新添加)

AS3 function toExponential(fractionDigits:uint):String

toExponential()与toFixed()差不多,只是结果用科学技术表示法表示。fractionDigits的范围是0~20。

Code:Actionscript
var num1:Number = 731843;
trace(num1.toExponential(2)); // => 7.31e+5
var num2:Number = 4;
trace(num2.toExponential(2)); // => 4.00
var num3:Number = 0.731843;
trace(num3.toExponential(2)); // => 7.31e-1

注意,如果是0~10的值,就不会用科学技术表示法表示。

toPrecision()(AS3.0新添加)

AS3 function toPrecision(precision:uint):String

toPrecision()是保留precision位有效位数,再返回值,返回形式是小数表示法或科学技术表示法。precision的范围是0~21。

Code:Actionscript
var num1:Number = 73.1843;
trace(num1.toPrecision(3)); // => 73.1
var num2:Number = 4000;
trace(num2.toPrecision(3)); // => 4.00e+3

反向链接(导入链接)的质量

反向链接(导入链接)的质量 - SEO - 黑色梦中的SEO博客

反向链接一般原则

反向链接一般原则 - SEO - 黑色梦中的SEO博客

论编程语言的优劣

一些语法十分"烂"的语言现在嫣紫嫣红,但一些语法明了的语言却无人问津……

一些效率十分"低"的语言现在叱咤风云,但一些效率较高的语言却一跌千丈……

*以下均以ECMAScript语法为基准来说明

语言名称 语言的"烂"
Ruby
  • 变量的命名规则:
    • 以小写字母、"_"(下滑线)开头:变量(Variable)。
    • "$"开头:全局变量(Global variable)。
    • "@"开头:实例变量(Instance variable)。
    • "@@"开头:类变量(相当于类的属性,Class variable)。
    • 大写字母开头:常量(Constant)

    这样的规则会遇到一些问题:

    1. 有些固有名词是必须大写的,但根据命名规则却不得不小写,使程序难以阅读。
    2. 不能使用非字母、 "_"(下滑线)的字符,这对有些e文不好的人来说是灾难。(虽然本人一贯用e文)
  • 类型的转换

在Ruby里

  • Instance.toString()是Instance.to_s。
  • Instance.toArray()是Instance.to_a或Instance.to_ary。
  • Instance.toInteger()是Instance.to_i。

按照这种命名规则,就可以推出:

    • Instance.toSource() => Instance .to_s
    • Instance.toStream() => Instance .to_s

问,谁能读懂?

  • 块(block)

    Ruby有以下多种块

    • then...end
    • begin...end
    • {...}

    问同样是块,何必需要分多种形式?

  • 还有多重赋值、类的定义等不胜枚举。
  • 效率就不必说了,慢中的慢
  • 难以Debug
  • 它会使Java灭亡?白日梦!取代PHP、Perl就不错了
PHP
  • 语法比Ruby好一点,但还是不明了。
  • HP没有原生支援Unicode或是多位元字集(例如中文、日文、韩文等需要用两个以上ASCII字符来表示的字集),导致用PHP写的软件在国际语言化上遇到相当多的困难。

  • PHP没有名字空间(Namespace)的设计,降低了PHP语言设计上的弹性,也导致函数名称过长的问题。

  • PHP的函数命名规则非常的混乱,许多函数功能类似,但是却使用不同的函数名称和参数顺序,例如strpos($haystack, needle) 和 in_array($needle, $haystack)、strcasecmp 和 stristr,导致编写PHP程序时需要做相当多的手册查询工作,初学者也往往不知不觉重新编写已经内建的函数,降低了开发的效率。

  • PHP的魔术引号(magic quotes)功能可以自动处理使用者输入字串中的跳脱字符,有效避免SQL隐码攻击(SQL injection),但是因为不是每个使用者的输入都会写入到数据库,处理这些没有写入数据库的字串便浪费了效能。此外不是每个PHP环境都会开启魔术引号,程序设计时需要便需要对不同的服务器环境做因应,造成程序设计上的麻烦。

  • 有些PHP的延伸函式库不是执行绪安全(threadsafe),导致PHP安装在多执行绪的服务器例如Apache 2上会发生不稳定的状况。

VB
  • =运算符

    在if里是表示判断是否相等;在其他地方却是赋值。

    同一个运算符却又两个意思!

  • VB并不是非常简便,它开发的程序只能运行在Microsoft Windows中。

  • 档案太大了。Visual Studio要用好几张盘才能装下。VB程序在运行时候还需要一个1.4M大小的运行库。

  • IDE中有错误。

  • VB不能很好的综合Windows的基础API,很多时候要使用低级运算的“小伎俩”来进行编程。而C语言的低级内存运算比VB的要简单得多。

  • 很多程序员对VB程序的品质有强烈的反感。很多人认为VB不配他们使用,认为它是一种给儿童和菜鸟程序员的语言。它自从设计开始就是一种简单的语言。一些C++和Java中的特性在VB中并没有出现。在感受开发的方便和快速的同时,一些类似于编译时进行类型和声明检查的功能在默认情况下是关闭的。这样一些程序员一边感叹VB-的易用性,一边沮丧地地看着一些类似于“未定义类型”错误的发生。
  • 一些批评家认为VB的简单特性使得其在未来具有伤害性。很多人自学了VB,但是并没有学到好的编程习惯。当VB进入课堂的时候,学生们不会学到很多 基础的程序技术和结构,因为很多技术已经包含在那些对用户可见的组件里面了。不用学习标准的编程习惯,因为VB具有可视化的特性,所以导致了一些莫名其妙的代码的产生。而且很多错误和警告的检查默认情况下都是关闭的,程序员很难找到隐藏的错误。有经验的程序员在用VB编程的时候都会把这些选项打开。

  • 很多批评家批评微软简单地拷贝了BASIC的思想到VB中。著名的计算机科学家Edsger Dijkstra说过一句名言:“如果一个学生最早学过BASIC,那么几乎不可能让他学会优秀的编程:因为这些人已经放弃了涅磐的希望。另外一个笑话是:“真正的程序员不用BASIC。12岁以下的孩子才用。”

Python

说实话,我并不对它特反感,反而认为它的语法漂亮。但一个和其他大多数语言(如C)的区别就是,一个模块的界限,完全是由每行的首字符在这一行的位置来决定的(而C语言是用一对花括号{ }来明确的定出模块的边界的,与字符的位置毫无关系)。

但代码经常会拷贝/粘贴,但缩进有可能出错(比如网上的代码)。但因为没有明确的块语句,使得程序员难以知道那里是结束等。

Java

Java的多层结构

以前只有1层,后来Struts出来後有了MVC(Model View Controler),接着又出来了一个O/R Mapping的持久层。表面上看来这样很好,但其实不然:

比如现在画面上有一个有名字、密码的From。现在要求添加一个邮件地址的输入框。改动的结果是:View层要添加一个输入框;Controler层要添加一个邮件地址的处理;Model层要添加邮件地址的空间(Bean等);持久层要添加邮件地址的O/R Mapping;数据库要添加邮件地址存放空间。结果一个小小的改动五个层全改了。

Java的Bean

一个Java程序里大约1/4的类是Bean。Bean的结构实在是太简单了。几个private的变量,以及相应的getter/setter。要写它的工程量不小。为怎么不用动态?

其他

Java试图通过新的方式解决软件编写的复杂性。很多人认为Java语言做到了它承诺的一切。但是Java并不是一门完美的语言,在编程风格、编程环境和需求方面并没有获得全球性的认可。

  • 并不是所有的工程和环境需要企业级别的复杂性,比如一个简单的个人网站或者独自编程的程序员所写的程序。这些程序员会发现Java的复杂管理对于自己要做的程序来说过于强大了。
  • Java经常让那些并不是对面向对象编程很热心的程序员感到不满。
  • 一些人觉得Java在面向对象上面做的没有Ruby和Smalltalk纯粹。但是最新出现的用Java实现的语言Groovy解决了这些问题。
  • 作为一种已经建立的新技术,Java显然综合了很多语言的特性,比如C++、C语言、Python等等。一些对于Java的评论认为Java的不变性在动摇,有些人认为Java只是一种“新的COBOL"语言。
  • 有些程序员不喜欢原始类型和类的分离,尤其是那些曾经使用过Smalltalk和Ruby的程序员。他们会问:“这就是一切皆对象?”
  • 事实上,JAVA语言本身只是Smalltalk的一个不完整的代替品。JAVA的流行与SUN背后的支持分不开。
  • Java的代码相对于其他的代码来说过于冗长,这与它的轻便化声明相违背。
  • Java语言在单范例程序方面非常出色。历史上的Java则在这方面做的不好。
  • Java是一种单层继承的语言。这也导致了程序员在试图使用多重继承时候的不便,而很多语言都可以使用这个特性。但是Java可以使用接口类,把多重继承可能导致的风险减少到最小。
  • Java不支持运算符重载,这是为了防止运算符重载使得代码的功能变的不清晰。但是用Java实现的语言Groovy可以进行运算符重载。
  • 准确地说,JAVA不是平台无关的,它本身就是一个平台。

使用Swing平台编写的带有GUI(图形用户界面)的程序和其他原始程序非常不同。选用AWT工具包编写程序的程序员看到的都是原始界面,而且也无法获得先进的GUI编程支持,如果使用的话,就要提供每个平台上面所需的API,这将是一项庞大的工 程。Swing则是完全用Java语言所写的程序,避免了界面元素重复的问题,只使用所有平台都支持的最基本的绘图机制。但是很多用户不知道如何在 Java风格和Windows风格之间进行转换,结果造成了Java程序的界面在很多程序中非常特殊。苹果电脑已经提供了优化过的Java运行时程序,包含了Mac OS X的经典Aqua界面风格。

Java语言的一些特性不可避免的有额外的性能代价,例如数组范围检查、运行时类型检查等等。Java程序的性能还会因为不同的动态复杂性和垃圾处 理机制使用的多少而各有不同。如果JVM的实现比较优化的话,那么这些功能甚至可以增加内存分配的性能。这和总是使用STL或者托管C++的程序的情况类似。

尽管如此,仍然有许多人认为Java的性能低。这部分归因于Sun公司最初的JVM实现使用未优化的解释机制来执行字节码。一些新版本的JVM使用Just-In-Time(JIT) 编译器,在加载字节码的时候将其编译成针对运行环境的本地代码来实现一些本地编译器的优化特性。Just-In-Time机制和本地编译的性能比较仍旧是 一个有争议的话题。JIT编译需要很多时间,对于运行时间不长或者代码很多的大型程序并不适宜。但是不算JIT编译阶段的话,程序的运行性能在很多JVM下可以和本地编译的程序一争短长,甚至在一些计算比较密集的数值计算领域也是这样。目前,Java已经使用更先进的HotSpot技术来代替JIT技术,Java的性能有了更进一步的提升。

Java的设计目的主要是安全性和可移植性,所以对于一些特性,比如对硬件架构和内存地址访问的直接访问都被去除了。如果需要间接调用这些底层功能的话,就需要使用JNI(Java 本地接口)来调用本地代码,而间接访问意味着频繁调用这些特性时性能损失会很大,微软的.NET平台也有这样的问题。所以到目前为止,性能敏感的代码,例 如驱动程序和3D视频游戏,还是大多使用本地编译,甚至直接以不直接支持面向对象的C语言或机器码编写。