Thinking dynamic

Write here write now
随笔 - 19, 文章 - 0, 评论 - 2, 引用 - 2
数据加载中……

2006年10月18日

Z-Buffer 与 W-Buffer

Depth-Buffer(深度缓存)有两种:Z-Buffer 和 W-Buffer,这里讨论这两种深度缓存的区别,以及如何在两者之间转换。

w 的含义

3D空间点的坐标是(x,y,z),为了使矩阵乘法具有平移变换的功效,我们用4D空间中的点(x,y,z,w)来表示3D空间中的点(x',y',z'),这两个不同空间点之间的关系是:

    x' = x / w
    y' = y / w
    z' = z / w

像这样用四维空间点表示三维空间点,或者说用 n + 1 维空间点表示 n 维空间点的方法叫做 “齐次坐标表示法”。

实际使用中,在模型->世界转换、世界->视图转换过程中,w 通常保持不变,总是等于一,这样,齐次坐标的前三个分量就是对应3D空间点的三个坐标分量。但是,经过投影变换后,w 将得到一个比例值,比如,一般的透视投影变换矩阵是:

    | W   0   0   0 |
    | 0   H   0   0 |
    | 0   0   Q   1 |
    | 0   0  -QZn 0 |

    其中   Zn  =  近裁剪面 z 坐标
           Zf  =  远裁剪面 z 坐标
            W  =  2 * Zn / 视口宽度
            H  =  2 * Zn / 视口高度
            Q  =  Zf / (Zf - Zn)

将点(x,y,z,1)乘以此矩阵,w 便不再是一,而对应的3D空间点坐标(x / w,y / w,z / w)将出现一个缩放效果。同时,因为 w 的值通常与 z 坐标成正比(比如经过上面这个矩阵的变换,w 的值其实就是 z 坐标的值),所以经过投影变换,物体会产生近大远小的效果。

Z-Buffer 与 W-Buffer 的区别

简单的说,z-buffer 与 w-buffer 的区别就是前者保存的是点的 z 坐标,而后者保存的是点的 w 坐标。

具体的说,两者因为保存的值有不同的含义,所以表现出来的实际效果也会有差别。

z-buffer 保存的是经过投影变换后的 z 坐标,前面说过,投影后物体会产生近大远小的效果,所以距离眼睛比较近的地方,z 坐标的分辨率比较大,而远处的分辨率则比较小,换句话说,投影后的 z 坐标在其值域上,对于离开眼睛的物理距离变化来说,不是线性变化的(即非均匀分布),这样的一个好处是近处的物体得到了较高的深度分辨率,但是远处物体的深度判断可能会出错。

w-buffer 保存的是经过投影变换后的 w 坐标,而 w 坐标通常跟世界坐标系中的 z 坐标成正比,所以变换到投影空间中之后,其值依然是线性分布的,这样无论远处还是近处的物体,都有相同的深度分辨率,这是它的优点,当然,缺点就是不能用较高的深度分辨率来表现近处的物体。

从硬件实现角度来说,几乎所有的硬件3D加速卡都支持 z-buffer,而 w-buffer 的支持没有 z-buffer 那么广泛。另外,早期的 Direct3D 版本看起来也不支持 w-buffer。

Z-Buffer 与 W-Buffer 之间的转换

根据上面的矩阵变换,可以很容易的导出将 w-buffer 转换成 z-buffer 的公式:

    zDepth = Q * ( wDepth - Zn ) / wDepth
           = Zf / ( Zf - Zn ) * ( wDepth - Zn ) / wDepth

这个转换公式有什么用处?举个例子:3DS MAX 使用的是 w-buffer,如果从 3DS MAX 中导出深度信息到 Direct3D 中,作为预渲染的背景使用,就有可能用到上面这个转换。当然,如果在 D3D 中使用 w-buffer,问题就不大了,但是如果使用 z-buffer,不经过这样的转换,渲染结果就会出错。

posted @ 2007-12-01 16:59 cofd 阅读(40) | 评论 (0)编辑

亮度专业词语(转)

在计算机图形学方面有许多的表示亮度的专业词语。正确理解这些词语而不是简单地视为亮度能使你在处理图象时获得更好的效果。
1、什么是Intensity?
  这个词可以解释为强度,表示的是每单位面积传播的(光)辐射能量。Intensity也可以称为线形光测量,可以以诸如每平方米多少瓦此类的单位来衡量。提供给显示器阴极射线管(简称CRT)的电压直接控制了颜色构成的Intensity,但是却是以非线性方式的。所以CRT的电压与Intensity并不是成正比的。
2、什么是Birghtness?
  这个词解释为亮度(下面好几个词的解释都是亮度)。这是由Commission Internationale de L’Eclairage (CIE)根据一个区域发出的光的多少来定义的可视属性。Birghtness是知觉数值,没有固定的客观量度。
3、什么是Luminance?
  这个词解释为光照度,由CIE定义,以Y为表示符号,以视觉属性--光谱敏感性与辐射强度加权得出。Luminance的光度与物理强度成比例。Luminance容易使人觉得与Intensity差不多。但Luminance的频谱组成是与人类视觉的光敏感性相关的。
  Luminance可以以线性光的主要组成:红绿蓝三分量的适当加权和来计算。以目前的摄像设备为例,各系数为:
  在视频方面的标准是以非线性R’G’B’组成的加权和来计算LUMA组成Y’的。虽然这个数值经常被看作Luminance,但它不是。
4、什么是Lightness?
  这个词也是亮度。人类视觉对光的知觉是非线性的。一个Luminance只有另外一个光源的18%的光源,在人看来却是50%。对Luminance的知觉反应称为Lightness,并且被CIE定义为Luminance的修正立方根:
  Yn是参考白色的Luminance。如果你把Luminance(Y)常态化为参考白色那就不需要计算这个商。
  在另一方面,也可以说Lightness知觉是粗略对数的,你可以对Intensity相差只是百分之一多一点的两点发觉不同。
5、什么是Gamma?
  Gamma也是用于表示亮度。一个物理设备发出的光的Intensity通常都不是输入信号的线性输出。传统的CRT具有对电压的功率反应:在显示表面产生的Intensity大约是输入电压的2.5次方。这个数值通俗地称为Gamma。为能产生正确的Intensity必须对这一非线性进行补偿。
6、什么是Gamma校正?
  在视频系统,线性光Intensity通过Gamma校正转换为非线性的视频信号,通常在摄像过程内完成。如下函数把把线性光亮度(Intensity),R,转换为非线性组成R’:
  然后,一个理想的显示器把该转换反转输出:
7、什么是Contrast Ratio?
  Contrast Ratio是对比度的意思,也就是对某一设备或环境而言的最亮的白色和最暗的黑色之间的Intensity的比例。电影院的对比度可以达到80:1,电视在设计时认为你的居室环境是30:1,典型的办公条件下一个CRT显示器的对比度大约是5:1。
8、如何调节显示器的黑度和图象控制?
  一般的显示器上的标识都是错的。Picture Control,通常被标识为Contrast,控制整体亮度(Intensity),Black Level黑度控制,通常被标识为Birghtness,调整黑色偏重。显示一幅从纯白到纯黑过渡的图象,先调整黑度控制使得显示器显示完全是黑色,然后慢慢调节黑度,直到感觉上纯黑的部位开始变亮为止。这是因为图象是基于黑色显示的。当达到这一点后,标记下黑度控制的位置,然后显示一幅彩色图象(一般选取自然景观),调节图象控制到你喜欢的亮度。

posted @ 2007-11-29 17:06 cofd 阅读(57) | 评论 (0)编辑

Silverlight与Html/JavaScript互操作

前段时间写了Flex和JavaScript互操作, 本篇介绍Silverlight和Html/Javascript的互操作性.当然Silverlight可以使用多种托管语言, 我这里使用C#.

摘要:

先介绍一下System.Windows.Browser命名空间下的几个类, 接着介绍Silverlight如何操纵Html元素, 最后介绍如何从Javascript调用Silverlight的方法, 以及Silverlight调用Javascript方法.

1.System.Windows.Browser

Silverlight提供了一组对象来描述Html文档对象模型(DOM), 包括HtmlPage, HtmlDocument, HemlElement, HtmlElementCollection, 等等. 我们可以通过这些对象从Silverlight访问Html页面的内容, 如获取某个Html元素, 导航到新的URL等.(ps:Silverlight 1.1 Complete API List )

首先看HtmlPage类, 其提供了浏览器信息的静态属性BrowserInformation;提供的静态方法Navigate, 可以方便的跳转到其他的web页.提供了Document属性访问Html Dom, 有了它就可以干很多事了

HtmlDocument/HemlElement类用来访问DOM, 有了DOM就可以像Javascript一样做任何事了.

注意: 如果需要Silverlight可以访问Html页面的内容, 在创建Silverlight控件的时候必须将enableHtmlAccess设为true.

2.Silverlight操纵Html

想象Javascript是怎么访问Html元素的, Silverlight也同样可以.

修改页面属性:如修改页面标题, HtmlPage.Document.SetProperty("title", "new title");

操纵html元素:

HtmlElement elem =  HtmlPage.Document.GetElementByID("btn");
elem.SetAttribute("value", "haha");
elem.GetAttribute("value");

elem.AttachEvent("onclick", delegate(object sender, HtmlEventArgs he){
                // ...
            });

3.Javascript调用Silverlight方法

Javascript要想调用Silverlight, Silverlight必须通过DOM提供给Javascript一个可操作的对象.

新建一个silverlight项目, 修改Page.xaml.cs如下:

using System;
using System.Windows;
using System.Windows.Browser;
using System.Windows.Controls;

namespace SilverlightProject1
{
    [Scriptable]
    public partial class Page : Canvas
    {
        public void Page_Loaded(object o, EventArgs e)
        {
            // Required to initialize variables
            InitializeComponent();           

            WebApplication.Current.RegisterScriptableObject("js", this);           
        }

       [Scriptable]
       public string CalledByJs(string name)
        {
            return "i'm silverlight, called by " + name;
        }
    }
}

修改TestPage.html如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Silverlight Project Test Page </title>
    <script type="text/javascript" src="Silverlight.js"></script>
    <script type="text/javascript" src="TestPage.html.js"></script>
    <style type="text/css">
        .silverlightHost { width: 640px; height: 480px; }
    </style>
    <script type="text/javascript">
        function callSL()
        {
            var control = document.getElementById("SilverlightControl");
            var manager = control.Content.js;
            alert( manager.CalledByJs('js') );
        }
    </script>
</head>

<body>
    <div id="SilverlightControlHost" class="silverlightHost" >
        <script type="text/javascript">
            createSilverlight();
        </script>
    </div>
    <input id="btn" type="button" value="call silverlight method" onclick="callSL()" />
</body>
</html>

好像还不支持Silverlight方法返回一个复杂类型, 不过还好Silverlight内置了json的支持, 使用System.Windows.Browser.Serialization命名空间下JavaScriptSerializer序列化一下就ok了.

4.Silverlight调用Javascript方法

Silverlight无法直接调用javascript方法, 不过可以利用事件, 在Silverlight里抛出事件, 在javascript响应该事件.

修改Page.xaml如下:

<Canvas x:Name="parentCanvas"
        xmlns="http://schemas.microsoft.com/client/2007"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Loaded="Page_Loaded"
        x:Class="SilverlightProject1.Page;assembly=ClientBin/SilverlightProject1.dll"
        Width="640"
        Height="480"
        Background="White"
        >
  <TextBlock Text="call js method" MouseLeftButtonDown="OnClick"/>
</Canvas>

修改Page.xaml.cs如下:

using System;
using System.Windows;
using System.Windows.Browser;
using System.Windows.Controls;
using System.Windows.Input;

namespace SilverlightProject1
{
    [Scriptable]
    public partial class Page : Canvas
    {
        public void Page_Loaded(object o, EventArgs e)
        {
            // Required to initialize variables
            InitializeComponent();           

            WebApplication.Current.RegisterScriptableObject("js", this);           
        }

        protected void OnClick(object sender, MouseEventArgs e)
        {
            if (this.CallJs != null )
            {
                EventHandler temp = this.CallJs;
                temp(this, EventArgs.Empty);
            }
        }

       [Scriptable]
        public event EventHandler CallJs;
    }
}

修改TestPage.html.js:在onLoad事件里添加了对Silverlight抛出的CallJs 事件的响应.

// JScript source code

//contains calls to silverlight.js, example below loads Page.xaml
function createSilverlight()
{
    Silverlight.createObjectEx({
        source: "Page.xaml",
        parentElement: document.getElementById("SilverlightControlHost"),
        id: "SilverlightControl",
        properties: {
            width: "100%",
            height: "100%",
            version: "1.1",
            enableHtmlAccess: "true"
        },
        events: { onLoad : OnLoaded}
    });
    // Give the keyboard focus to the Silverlight control by default
    document.body.onload = function() {
      var silverlightControl = document.getElementById('SilverlightControl');
      if (silverlightControl)
      {
        silverlightControl.focus();
      }
    }
}

function OnLoaded(sender, args)
{
    sender.Content.js.CallJs = calledBySL;
}

function calledBySL(sender, args)
{
    alert("i'm js, called by silverlight");
}

done!

我尝试了在Silverlight事件里加了自定义的参数, javascript这边好像接收不到??不知道是什么原因.

总结:

Silverlight与Javascript的互操作的方式和Flex类似, 不过个人还是喜欢Silverlight的方式, C#的语法简单清晰.

参考资料:

[Silverlight探秘]深入探索Silverlight与Javascript的交互

Silverlight 访问html元素

posted @ 2007-11-28 09:34 cofd 阅读(326) | 评论 (0)编辑

Silverlight程序动态创建添加UI元素

我们都知道XAML标签元素在sliverlight运行时被转换成相应的对象. 程序运行时, 也可以动态的添加UI元素.

1.通过对象创建UI元素

Rectangle rc = new Rectangle();
rc.Width = 20;
rc.Height = 20;
rc.Fill = new SolidColorBrush(Colors.Red);
rc.SetValue<double>(Canvas.LeftProperty, 200);

this.Children.Add(rc);

2.通过XAML创建UI元素

通过XamlReader类的Load方法, 动态的创建UI元素

string xamlStr = "<Rectangle Canvas.Left=\"" + 20 + "\" Canvas.Top=\"" + 20 + "\""  
                 + " Width=\""+40+"\" Height=\""+40+"\""  
                 + " Fill =\"Red\" />";

try
{
       Rectangle rc = (Rectangle)XamlReader.Load(xamlStr);
       this.Children.Add(rc);
}
catch { }

posted @ 2007-11-27 20:17 cofd 阅读(72) | 评论 (0)编辑

无废话Silverlight入门

1.Silverlight是什么

Silverlight是一个跨浏览器的、跨平台的插件,为网络带来下一代基于.NET媒体体验和丰富的交互式应用程序。Silverlight提供灵活的编程模型,支持AJAX, VB, C#, Python, Ruby等语言,并集成到现有的网络应用程序中。Silverlight对运行在Mac或Windows上的主流浏览器提供高质量视频信息的快速、低成本的传递

Microsoft® Silverlight™ is a cross-browser, cross-platform plug-in for delivering the next generation of .NET based media experiences and rich interactive applications for the Web. Silverlight offers a flexible programming model that supports AJAX, VB, C#, Python, and Ruby, and integrates with existing Web applications. Silverlight supports fast, cost-effective delivery of high-quality video to all major browsers running on the Mac OS or Windows.

2.开发环境

运行时:

Microsoft Silverlight 1.1Alpha Refresh

开发工具:

Microsoft Visula Studio 2008

Silverlight 1.1 Tools Alpha for Visual Studio 2008

设计工具:(可选)

Expression Blend 2

3.HelloWorld

打开VS, 新建一个Silverlight Project, 修改默认生成的Page.xaml文件为:

<Canvas x:Name="parentCanvas"
        xmlns="http://schemas.microsoft.com/client/2007"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Loaded="Page_Loaded"
        x:Class="SilverlightProject1.Page;assembly=ClientBin/SilverlightProject1.dll"
        Width="640"
        Height="480"
        Background="White"
        >
  <TextBlock x:Name="txt" Text="HelloWorld" MouseLeftButtonDown="SayHi"/>
</Canvas>

修改Page.xaml.cs为:

using System;
using System.Windows.Controls;
using System.Windows.Input;

namespace SilverlightProject1
{
    public partial class Page : Canvas
    {
        public void Page_Loaded(object o, EventArgs e)
        {
            // Required to initialize variables
            InitializeComponent();
        }

        protected void SayHi(object sener, MouseEventArgs e)
        {
            this.txt.Text = "HelloWorld to Silverlight";
        }
    }
}

按ctrl+F5运行.

:)

posted @ 2007-11-27 20:10 cofd 阅读(50) | 评论 (0)编辑

预编译头文件的问题

整了一晚上,终于明白了预编译头文件.

DXUT(The DirectX Utility Library)是初学DirectX的一个好用的框架, 今天照着Sample里的EmptyProject建了一个工程, 引用了DXUT的代码, 并将设置-->C/C++-->Precompiled设置为Use Precompiled Header(/UC), DXUT.h, 发现怎么也编译不过去. 搞了半天才发现DXUT.cpp文件没有设置成Create Precompiled Header(/YC).:(

下面随便介绍一下预编译头文件的原理:

在DXUT.cpp里include一次DXUT.h,生成一次pch,pdb文件,其他地方实际上直接用这个编译的结果,从而减少编译时间,提高编译效率。一般,我们把常用的不变的库头文件放里面,如,atlbase.h,atlcore.h,windows.h等,通常的com里import进来的dll,tlb也放这个里面,这样,它能做到,只编译一次,其他地方直接用编译出的结果。

如果预编译头文件被正确使用时,它确实大大提高我们编程的效率(你工作中,有多少时间是在等编译完成?很多吧,这个时候一般都很无聊,无奈,浪费时间)。但是他太容易用错了. 下面是几种常见的错误用法.

1) 在预编译头文件里include自己的头文件(当然, 如果你的头文件不经常变化, 也可以)

原因:自己的头文件一般会经常变, 便利后导致预编译的东东重新编译, 降低了编译速度.

2) 在其他的头文件里也include 预编译头文件

假设你的其他头文件也include了预编译头文件, 如果别人引用你的这个头文件又没有设置成预编译头文件, 那引用你头文件的这个人就煎熬了.

原因:由于你用到的.h文件里include了预编译头文件,他在他本身的project里,vs能够判断的出他是预编译头,也能找的到需要的pch,pdb文件。所以对写这个.h文件的人没影响。但是你作为他的客户,你工作在你的project下,你include了他的h头文件,而这时vs判断不出他的头文件里include的stdafx是预编译头文件,做普通文件编。那可想而知,他的stdafx里如果有import外面大型的库(如inventor的tlb,非常慢,我们犯了这个错),那编译速度简直是煎熬。最要命的是,以后你做任何简单的修改都要重编,这和预编译解决的问题恰好相反了。

下面给出一个使用预编译头文件的操作步骤, 享受一下预编译头文件给我们带来的编译速度的提升:

1) 添加一个stdafx.h文件(名字随便取, 这里用了VS默认提供的名称), 在这个.h文件里include要使用的头文件(一般是外部的库, 自己写的不常变的头文件也可以加进来)

2) 添加一个stdafx.cpp文件, 并include "stdafx.h"

3)项目属性-->c/c++-->Precompiled设置为Use Precompiled Header, stdafx.h

4)stdafx.cpp属性-->c/c++->Precompiled设置为Create Precompiled Header, stdafx.h

done!

posted @ 2007-11-05 16:19 cofd 阅读(269) | 评论 (1)编辑

Cairngorm框架的优缺点

Cairngorm是Flex官方提供的客户端架构框架, 专注于建立应用程序的骨架而不是提供各种服务。

优点:

分离状态处理, 表现, 动作, 服务端通信, 使得代码简单清晰
程序迭代时能够拥抱变化
保持表现层和数据模型尽可能的简单
开发简单, 测试独立
有利于平行开发

缺点:

结构复杂不容易理解

代码量增多带来维护困难

开发效率低下

 

对于复杂,大型的应用, Cairngorm还是蛮适合的。

posted @ 2007-11-01 16:43 cofd 阅读(130) | 评论 (1)编辑

终于可以做点想做的事了

很久以前就想开发游戏玩玩了, 一直没有时间和机会. 最近稍微闲了点, 于是下定决心学习点游戏开发相关知识.

OGRE(Open-source Graphic Render Engine)是一个开源的图形渲染引擎, 同时支持DirectX和OpenGL, 今天大概看了一下, 跟着它的Tutorial写了一个Sample, 貌似还不错, 就从这个开始我的游戏开发之旅吧. 以后我会陆续介绍OGRE, 权当作是自己的学习笔记, 也供初学者参考.

ps: C++和C#的开发效率真没的比, 现在对代码执行效率的要求也没那么苛刻了, 为什么一下大牛的公司都要求用C++呢? 害的我还得翻出已经蒙了一层灰的C++书来复习...

posted @ 2007-10-30 08:50 cofd 阅读(19) | 评论 (0)编辑

Cairngorm框架的裁剪

1 概述

1.1 Cairngorm比较适合大型的, 复杂的应用, 对于小型, 简单的应用过于庞大繁琐, 降低了开发效率

1.1 通过ServiceLocator + Biz Delegate屏蔽了服务端实现

1.2 简单应用和复杂应用可以共享一个 ServiceLocator + Biz Delegate

 

2 简单应用

2.1 ServiceLocator + Biz Delegate

2.1.1 View层里直接实例化一个Biz Delegate调用其方法.

2.1.2 实例化Biz Delegate时要创建一个Responder对象, 用于处理Biz Delegate返回的结果或异常

 

3 复杂应用

3.1 ServiceLocator + Biz Delegate + MVC

3.1.1 View通过事件通知在Control里注册的Command, Command调用Biz Delegate, 并处理Biz Delegate返回的结果或异常.

3.1.2 处理结果通常意味着改变Model, 由于Model被绑定到View上, Model发生改变时, View也随之改变

 

4 区分简单和复杂的标准

4.1 待定

posted @ 2007-10-26 17:29 cofd 阅读(55) | 评论 (0)编辑

Flex和JavaScript互操作

Flex提供相关对象可以灵活地和当前网页的JavaScript相互进行灵活的调用。那就是说可以通过JavaScript调用Flex内部的方法,同样在Flex时也可以直接调用页面上相关的JavaScript方法。

ExternalInterface对象用于和JavaScript进行互操作。该对象分别提供了addCallBack和Cell方法:

  • addCallBack方法

用于注册一个内部方法用于给JavaScript调用。

private function flashFunction(str:String):String

{

    return str + " i am a flash result";

}

实际上JavaScript是不能直接调用Flex的内部方法的,那如何使JavaScript能够调用呢?

首先通过ExternalInterface.addCallback("callFlash", flashFunction);的方法进行注册,可以把方法放在Applicaion.Initialize的事件中。

方法第一个参数是:外部调用名称就是JavaScript调用的方法名称。

方法第二个参数是:代理执行Flex的内部函数。

JavaScript通过以下方式调用:

<input type="button" value="call flash function" onclick="alert(document.all('jsInterop').callFlash('i am a js argument. '));" />

  • Call方法

用于调用当前页面里的JavaScript方法.

function jsFunction(arg)

{

    return arg + " i am a js result";

}

在Flex里可以通过以下方式调用jsFunction ()方法。

private function onClick():void

{

    var msg:String = ExternalInterface.call("jsFunction", "i am a flash argument. ");

    Alert.show(msg);

}

Flex在和JavaScript整合这方面做得非常好,你并不需要花费太多的工作就能够实现和页面数据元素进行数据交换;同样也可以调用已经有的Ajax功能。

posted @ 2007-10-26 16:29 cofd 阅读(170) | 评论 (0)编辑

[转帖]Flash的过去和未来

Flash是一种交互式矢量多媒体技术,他的前身是Futureplash,后来由于Macromedia公司收购了Future Splash以后便将其改名为 Flash。Futureplash是世界上第一个商用的矢量动画设计软件,上世纪90年代广泛应用于microsoft.com这样的大型网站部署在线交互动画以及迪斯尼(Disney)和梦工厂等动画公司生产2维动画,正是因为这种高端应用,flash的创造者们为flash提供了一些可执行的脚本指令与扩展接口以适应不同公司工业级动画制作流程和网路上的用户交互,这为flash成为一款既具备开发能力又具备设计能力的与众不同的软件奠定了基础。

  Flash从2.0版本开始逐步完善它的脚本语言(action script 1.0),这些语言在早期的flash中能够控制影片播放并且绘制图形,实行人机交互.2000年8月Macromedia 推出了Flash5.0,并推出了全新的actionscript 2.0语言,这是actionscript的一次飞跃,flash5.0 开始了对XML和Smart Clip(智能影片剪辑)的支持。ActionScript的语法已经开始定位为发展成为一种完整的面向对象的语言,并且遵循ECMAScript的标准,就像javascript那样。在后来的FLash 6.0,flash 7.0版本中,Macromedian为Flash加入了流媒体(flv)的支持,使flash可以处理基于on6v编解码标准的压缩视频。Flash8.0版本增加了位图滤镜功能,从8.0版本开始,Flash已不能再被称为矢量图形软件,因为它的处理能力已延伸到了视频、矢量、位图和声音。

  2006年,Macromedia被Adobe收购,由此带了了flash的巨大变革,2007年3月27日发布的Flash9.0成为了 Adobe creative studio cs 3.0中的一个成员,与 Adobe公司的 矢量图形软件illustrator和被称为业界标准的位图图象处理软件photoshop完美的结合在一起,三者之间不仅实现了用户界面上的互通,还实现了文件的互相转换。当然更重要的是,Flash9.0支持全新脚本语言actionscript3.0,actionscript3.0是flash历史上第二次飞跃,从此以后,actionscript终于被认可为一种“正规的”、“完整的”、“清晰的”面向对象语言。新的actionscript包含上百个类库,这些类库函盖了图形、算法、矩阵、xml、网络传输等诸多范围,为开发者提供了一个丰富的开发环境基础。随着actionscript3.0而来的是新的Flash RunTime虚拟机(VM2.0),VM2.0的运行效率是VM1.0的10-15倍。

  Flash player并不是传统意义上的媒体编解码播放器,flash player是一个标准的虚拟机,用来解释运行actionscript和显示包含在swf中的各种图形资源。与.net framework和java runtime不同的是,flashplayer是基于流形式读取并执行swf文件,在基于timeline的swf中按照时间帧顺序运行每一帧的程序。这使得swf文件在网络上的传输更加高效。在经过长期的实践检验之后,开发者普遍认为,在timeline上进行用户界面的开发更加清晰和直观,或许它将成为一种新的应用软件开发潮流,因为用户体验流程在未来的软件开发中越来越重要。(事实上,有很多软件的开发就是通过画“故事板”实现的,timeline 就是“故事板”所集合成的流程)。

  Flash player目前在全世界计算机上的普及率达到98.8%,这是迄今为止市场占有率最高的软件产品(超过了windows、dos和office以及任何一种输入法),通过flash player,开发者制作的flash影片能够在不同的平台上以同样的效果运行,目前,在包括 sony psp以及ps3系列,microsoft xbox系列,microsoft windows mobile 系列的pc和嵌入式平台上,都可以运行flash.业界普遍认为flash下一个主要应用平台将出现在移动设备上,新款的LG“爱巧克力”手机是一个开拓者,它完全使用flash作为手机操作系统的用户界面。

  Adobe不断发掘flash的潜能,基于如此广大的flash player市场占有率,adobe开发了许多延伸产品,比如网络视频会议系统,协同办公系统,销售支持对话系统等,2006年adobe还发布了新的swf开发平台 FLEX, FLEX是面向传统程序员的flash开发工具,FLEX基于IBM  eclips, 包含有比flash更强劲的矢量用户界面组建系统和全新的XML扩展标记语言,开发者使用FLEX可以快速部署被称为下一代互连网核心应用的RIA系统(Rich Internet Application),设计有良好用户体验和丰富交互特性的网站。与Flash相比,Flex更适用于开发大型项目和更加注重代码编写。与此同时,号称Adobe对抗microsoft .net的战略性产品 Apollo也即将发布,Apollo是一种actionscript 3.0语言的桌面应用程序开发环境。同时它的runtime还支持XML和javascript、HTML,也就是说,开发者使用Apollo平台将能够像编写网页一样编写桌面应用程序。

  虽然Flash现在已成为事实上的互连网多媒体标准,但随着下一代操作系统microsoft vista的发布,flash的前景开始逐渐黯淡,microsoft抛弃了GDI、GDI+和MFC,为vista开发了一套全新的图形子系统WPF, WPF是建立在 DirectX 10.0之上的矢量图形系统,几乎具有Flash runtime的全部功能,而且由于Direct 10.0是显卡资源的图形接口,WPF生来就具有flash无法比拟的效率。如果说在vista以前运行3D和矢量界面需要在特定的虚拟机和窗口之内的话,那么在vista中,整个屏幕就是一个3D矢量界面,而且它的效率比flash高100倍。开发矢量动画或矢量界面将不再需要任何其他runtime或activeX的支持。

  macromedia被Adobe收购之后,flash和fireworks开发团队一部分核心人员投奔了microsoft,并开发了基于WPF的设计师软件套装 microsoft Expression, microsoft Expression被认为是microsoft的模仿之作,基本与现有的adobe三款拳头产品flex、illustrotor、dreamweaver功能重叠,其中基于xml的microsoft Blend 几乎和flex同出一辙,由此可以看到microsoft开始阻击adobe,为他的WPF/.net framwork3.0战略扫清障碍。

  不管未来将会如何发展,矢量图形界面已被公认为是未来操作系统/网站/应用程序/RIA的发展方向,矢量图形界面能够给用户带来更丰富的交互体验,基于矢量图形的用户界面设计与开发将在未来成为数字艺术领域的一个越来越重要的分支。VISTA是一个纯粹的矢量图形界面操作系统,它在用户界面上的先进性已经展现得淋漓尽致(flip3D, aero glass等),或许再过2年,当vista逐步普及之时,就是矢量图形的用户界面设计与开发产业蓬勃发展的时候了。不管将来FLASH是否会继续保持着主流地位,我认为从现在开始学习并掌握WPF/FLASH/FLEX/BLEND 这些未来会广泛使用的开发工具是保持个人竞争力的一个好方法。

posted @ 2007-10-25 20:47 cofd 阅读(42) | 评论 (0)编辑

转贴:我的25年嵌入式生涯

周立功,中国嵌入式领域的传奇人物,因为学校的嵌入式和微电子专业的同学比较多,于是也对他逐渐有了一点了解,在这里转一篇他的文章,对于如何创业,可以学到很多。

杂谈:我的25年嵌入式生涯

文/周立功

《程序员》杂志的编辑约我写一篇命题作文,想了几天都无从下手不知道写什么才好。在这篇文章里,我不打算将创业的艰辛与喜悦重新回忆一遍,我确实不想去误导大家,因为我所处的年代是一个物质缺乏的年代,成功相对来说要容易得多。每个人的成长经历都有其个性化的东西,每个人的成功创业经验虽然有一些可以遵循的普遍规律,但一般来说都很难复制,成功需要不断地创新。
对于今天很多的年轻人来说,一味注重技术至上的观念刻骨铭心,其实很多时候努力并非一定有回报。事实上,有不少出类拔萃的人才往往做出来的产品就是卖不掉,因为设计者压根儿就不了解用户的需求和心理以及产品功能的恰当定义,而总想在同事及其老板面前卖弄自己的技术和产品功能。其实有很多思维性的东西恰恰是很多人所忽视的,因为从一开始的出发点就错了,怎么可能取得辉煌的成绩呢?所以有时拥有卓越的技术并不一定代表人生的成功,很多企业就是死在一些自命不凡的“卓越人才”手中。

它山之石可以攻玉,减少“阶段0”的开发
有所“创造”确实是人人期待的,令人瞩目的发明虽然激动人心却谈何容易,人们时常将盖茨没有任何爆炸性的发明作为茶余饭后的笑料,我们不妨从另外一个角度去探索微软的成功奥妙从而为我们所用。
确实不假,盖茨的DOS源代码是从帕特森手上“买”来的。这些年来,我收集了世界各地中英文版有关微软的专著来比较研究,大家仅仅注意到盖茨为建立整个行业架构标准的远见,并叹服盖茨深得市场运作经验的精髓,我认为这些研究成果都是后来者研究微软成功经验,是“牵强附会”不可复制的理论总结。
当初微软公司还仅仅是一家很稚嫩的公司,可以说生存下去是盖茨作为老板唯一的使命。事实上,正当盖茨决定动手来写IBM所要的OS时,原计划在一年左右完成,但IBM公司只给了他几个月的时间。尽管帕特森的QDOS并不完善错误百出,但为了履行对IBM的承诺,盖茨购买了QDOS改贴标签后卖给了IBM公司。盖茨对此心知肚明,因为他知道如果用一年的时间来做OS的开发,他将失去与巨人IBM的合作机会,那是一种浪费。付一小部分的技术费用没有关系,只要能获得Know-how,获得更高的利润就好了。通过支付权利金引入技术,然后以模仿的方式学习他人的技术,再改造成符合IBM需要即可。
“买”――只要有现成的就不需要自己开发,这就是盖茨的过人之处,而且恰恰是很多人忽视的地方,值得我们所有人学习和仿效。盖茨就是由于没有“阶段0”,从而大幅度地降低开发风险。
当年,我是一个人单枪匹马借了2.15万元出来创业的,可以说是负资产,后来才开始有伙伴注资6万元。没有经验怎么办?我有一个非常好习惯,读书从不拘泥于他人的观点,也满足于人云亦云,否则那就是听别人讲故事,那不是您的东西,有入宝山空手而归。我认为,要想成功就必须“研究”成功者的轨迹,向成功者学习。
下面我会把我“第一桶金”的故事告诉你,这也是尽量减少“阶段0”开发一个非常典型的例子。
当年,《羊城晚报》几乎每天都有半版广告刊登信息台(听歌、悄悄话等)广告,一打听广告费每天几十万。当时相信不少人在利用公费电话在拨打这些信息台。后来我送货到客户那里发现电话机都外加了一个铁壳并上了一把锁,从看到那一幕开始,我决定做电话加密码锁,锁长途电话0字头,手机、BB机、信息台的9字头。通过朋友介绍,福州某公司有这个技术,于是我打了一个试探性的电话,使用5000元购买方案和源代码,对方非常爽快地同意了。我生怕有变立即坐飞机到福州去,很快就见到了郑新建工程师,他原来在福州某公司工作,我见到他的时候已经离开了福州某公司,但仍然自己写一些产品解决方案,通过福州某公司销售。买到方案与源代码之后,我立即带样机到各地去做测试,发现这台样机兼容性太差,而且市场已经开始在卖的产品也存在同样的问题,我想只要解决好兼容性的问题,如果在任何地区交换机局域网都能够使用,那就是最好的产品不愁没有市场。
我当时既没有资金也没有生产和销售经验,到底怎么将技术变成市场上所需要的产品呢?那是因为我找到了生产电话分线器的广州市白云区百新电器厂的老板陈国亮,由他生产和销售,每销售一台产品给我提成。以这个项目为起点,我们使用PIC单片机的数量很快就达到了每月100K以上,一年以后Microchip香港公司经理Andi主动找上门来将当时的广州强力电子研究所发展成为了授权分销商。
毫不否认盖茨的远见和判断力是微软至关重要的核心竞争力,但盖茨也绝非天才,否则盖茨就不会在浏览器上输给网景了,尽管微软使用的很多技术都不是微软所发明的,但毫不妨碍微软独步天下。

注重核心技术,其余的外包
通过创业以来第一个项目的成功,我深深地体会到商业模式比技术本身更重要。
通过十多年的努力,我们设计的“铁将军(Steel Mate)”品牌汽车防盗器、汽车倒车雷达不仅成为了全世界范围的“隐性冠军”,而且为GE等世界著名汽车厂商售前市场提供配套产品,与此同时我们为智能卡酒店门锁厂商设计与制造的各种智能卡门锁控制模块在国内也一直处于第一名的地位。
他们为何能够取得与众不同的成功呢?其最大的长处就是产品创意与制造、简约时尚风格的工业设计、模具制造技术以及精心打造的销售渠道,这些厂商深刻明白“注重核心技术做自己擅长的,其余的外包分段取利”的基本道理,而对于我来说就是“智慧出租”,通过与强者合作获得双赢。
通过这些成功经验的积累,我们开始全力以赴注重发展核心技术,将自己不擅长的技术全部外包。比如,我们长期投资清华大学计算机系,并建立以陈渝博士后为主Linux内核开发团队,为公司底层的技术提供良好支撑,而我们自己则将精力集中于Linux驱动开发。这种分工合作、协同开发的模式赢得市场上宝贵的时间,并快速取得了应用成果。
也许有程序员会关心JTAG开发工具问题,那也是一个“外包”的项目。当时,我们在网上发现了一个由计算机爱好者业余时间设计的H-JTAG,这是一个比较稳定的调试器软件,正好适合我们使用。于是我就同设计者联系,并决定由周立功单片机资助他继续开发,同时,其开发成果还免费提供给网上的用户下载,保证它作为一个自由软件。其实,无论是Linux还是H-JTAG都是开源软件,如果担心其它的同行因此受益而超越自己的话,难免需要在公司负担很多开发人员,面面俱到地做许多事实上是重复的开发工作。其实,我们的合作伙伴都是所在领域的专家,如果自己从头到尾去学习和开发,不仅抢了合作伙伴的饭碗,而且结果未必理想。这种情况下不但会延误宝贵的商机,而且还会影响与合作伙伴之间的关系。其实只要引入我们企业长期积累和制定的嵌入式系统工程管理思想和规范,即可得到自己想要的结果:“做你最擅长的,其余的外包”,类似这样的案例在周立功单片机将会越来越多。

专注与差异化生存
1999年1月23日我离开了原公司,先后分别创立了广州周立功单片机发展有限公司与广州致远电子有限公司,分别从事贸易业务与产品制造。
作为代理商通过为客户提供解决方案从而达到大批量销售芯片是代理行业惯常使用的手段,而实际上通过设计能够真正达到增值获得丰厚回报的代理商却少之又少。要知道过去公司的人才数量和资源是非常宝贵的,如果没有正确的战略,机会可能稍纵即逝。事实上创业开始的前几年,我们一共为用户设计了超过100个品类的产品,产品型号超过500种,可以说几乎涉及到了各行各业,但能够带来稳定而丰厚回报的案例几乎没有。我经过一段时间的思考和报表分析发现,目前公司的业务做得太多、太杂,没有将任何一个行业做精。于是我下定决心减少用户数量集中精力在1-2个行业做强、做大,直至成为顶尖的行业专家,坚持十年如一日重点做好汽车配套产品与智能卡门锁控制模块的开发。通过多年的精耕细作,我们通过为直接用户设计产品增值年销售单片机的数量已经超过了1000万片,无论是对用户还是对半导体公司来说,我们无疑是一家非常有价值的代理商。
1999年5月,PHILIPS半导体公司邀请我去上海洽谈是否有意向代理LPC700单片机,当我拿到用户手册时离去上海的时间只有5天。当时公司不像现在有250位大学生,总共只有8个人,怎么办?我一边写商业计划书,一边与大家翻译用户手册、打字和贴图,面对机会就像抓住救命稻草一样加班加点,每天只休息3-5个小时。第5天我赶到上海东亚富豪酒店时,我将整整齐齐的材料放在了来自美国PHILIPS半导体公司2位经理的面前,包括吃饭在内仅仅只洽谈了2个小时,代理权就正式谈下来了。事后他们告诉我,就是因为我与众不同,专注且非常有个性。
风雨变换诱惑莫测,人怕出名猪怕壮,这是常理!随后找上门来要求我们代理芯片的著名半导体公司不下10家。这时候,对于很多人来说不做什么就是一个艰难的选择。此时,我认为不管对方开出的条件多好,有冲突的就是不做,性能不突出的也不做,如果能够形成价值链互补,就一定要通过自己的努力和业绩表现主动去“求”半导体公司授权给我们,我就是这样取得了Keil、Catalyst、Sipex的代理权和信用额度。2004年SHARP半导体公司北京、日本、美国一共五位经理来到我的办公室要求我代理SHARP的ARM,帮助SHARP在中国推广以及制造用于全球销售的开发套件,我根本没有思考就一口回绝了,可以说SHARP给我的条件非常之好,特别是美国人觉得是非常不可思议的事情,作为商人这么好的赚钱机会都不要。为什么?我们之所以暂时“强大”,就是因为我们长期以来专注于发展PHILIPS半导体,集中精力对准焦点成为了小河里的大鱼,进而才引起了众人的关注。如果我们分散了精力,最后的结果一定会什么都不是!
当决定专注的目标之后,接下来的就是想办法如何做得与众不同,这是一件不容易的事情。最重要的就是穷举用户最大的需求和竞争者最容易忽略之处,然后将其做到最好。
为了推广好PHILIPS的单片机和ARM,我们定位于帮助初学者快速入门,至今一共编写出版了20多本专著,并将大部分版权全部捐献给了出版社用于降低成本,同时我也还会继续坚持将这项工作做下去、争取做得更好。***有一句名言:“计算机要从娃娃抓起!”我认为,任何一个有远见的厂商,要想成功地推广嵌入式系统,一定要从在校大学生抓起,这必定是一件一举多得的好事。既能够提高企业的美誉度,又能获得市场占有率,还能为学生提供实践的理论基础。为何很少有厂商或者代理商心甘情愿去做?这不仅可帮助企业建立差异化,而且还能够给企业带来长远的利益,何乐而不为?
比如说,至今在国内任何一家代理商的网站上几乎都找不到完整的芯片中文数据手册、用户手册与应用手册,不是我们的同行不知道其中的重要性。首先大家普遍认为这是半导体公司的份内之事,其次大家或许感到自己做好之后放到网站任由用户免费下载,会给其它代理商占了便宜。但很多人却始终不明白,这是满足用户需求制造公司服务差异化的最佳机会。
于是我们决心从网站入手坚持长期投资,做中国最好的嵌入式系统专业技术网站,建立专业的技术支持与开发团队。特别是对于优质用户的服务,网站还专门开通了“快速绿色通道”,如果这样的用户遇到问题,都是由我、分公司经理及其相关服务部门的经理牵头负责实施“保姆式”的服务,我们实施的服务战略就是:“用有限的资源为有效的用户提供高质量的服务”。
“你若亲近神,神就亲近你!” 2001年8月一篇来自PHILIPS内部刊物的报道《风险意味着机会》,我是被推上了“本地英雄”封底人物栏目的第一位亚洲代理商;2004年PHILIPS半导体公司又给我授予了“优秀卓越贡献奖”,来自全国各地的用户连续多年通过《亚洲资源》媒体将我们公司评选为“本地十大最受客户欢迎的分销商”。没有用户崇高的忠诚度和长期的大力支持,我们不可能从1999年以来连续多年销售单片机取得PHILIPS亚太区第一名的业绩。
一个“人弃我取”的机会成就了我,尽管个人与团队的努力至关重要,但可以毫不掩饰地说,如果没有PHILIPS半导体经理的慧眼相马,一定是巧妇难为无米之炊,业界不会再有我的一席之地。
在嵌入式系统应用技术方面与我们不相伯仲或者说比我们聪明能干的人才何止万千,为何只有少数人能够脱颖而出呢?就是因为想法太多、不专注,不能坚持在一个行业里面十年如一日地下苦功夫。但面对众多的竞争者和后来者,我每天都如履薄冰,不敢有丝毫的懈怠,每天坚持学习到深夜,因为唯有不断地学习和更新思维才有可能具备远见并及时规避可能出现的失误。

关注用户的需求
其实维系企业生命的关键在于产品是否能够获得市场的青睐,我们要做的并非是成为技术的领先者,而是要将技术成果转化为迎合消费者需要的商品。
八十年代是一个物质缺乏的年代,而今天的人们更加注重消费享受和情感的分享,这是任何人都无法否认的现实。我们公司刚开始做产品时,由于我个人偏爱蓝色,所以我凭着老板的权威将所有产品的外观全部都做成蓝色,其实当时也有不少的人向我提出改进意见,但我仍然还是无动于衷,为什么?就是因为我是做技术出身的,而且从创业初期开始一直都是依靠技术一路拼杀过来的,可以说过于迷信技术的力量,因此在很长的一段时间内,公司完全走的是研究的路子。而我却恰恰忽视了用户读产品的心理需求,以至于在产品推向市场之后一直都无法打开局面。
当时,EasyPRO系列编程器面市的时候,其销售数量一年下来都不到500套,同时有用户表示对于产品的设计很不满意,这可以说是一次深刻的教训。于是我下定决心组建工业设计事业部,首先从EasyPRO系列通用编程器开始,亲自管理、研究和参与产品的外观设计,将原来的模具全部废掉重新设计。尽管是第一次设计,在产品的外观上没有做出非常杰出的效果,但无论如何,新产品外观比原有的产品出众得多。2005年10个月的时间里,EasyPRO系列通用编程器的销售数量达到了6000套。2006年我们又推出了SmartPRO系列智能型通用编程器,预计本年度销售编程器的总数量将超过10000套,而这些产品将带着我和我们公司跻身于国内编程器市场主流品牌之列。
从那次深刻的教训以后,我明白好的外观设计可以凸现产品的魅力,让产品与环境融为一体,刺激消费者产生强烈的购买欲望。即使是普通产品,经过精心设计,也会成为一件时尚产品,甚至让人们觉得它就是一件艺术品,从这一点来说,时尚、新潮、艺术化的外观设计是塑造产品品牌形象的第一要素。
从那以后,我开始改变产品简介、广告以及展示会的形象设计,为了配合新的形象,我们展开了大规模、全方位的宣传:一方面尽量多地为用户提供产品简介手册,同时通过大量的媒体广告,让用户认识并初步了解公司,从而迅速有效地提高了品牌知名度;另一方面组织各种全国巡回演讲、免费ARM技术培训活动和产品展示会,而且我们每次参加展示会都是投入4个摊位并进行特装展位设计,目的就是为了获得与用户积极沟通的机会。
2003年暑假期间,周立功单片机投资80万元邀请了行业3位著名的嵌入式系统专家组成讲师团在全国10个城市主办了免费的ARM巡回演讲,提供了免费的午餐,可以说规模空前。这次巡讲中,共有8000多人参加了这次活动,随后公司趁热打铁推出了售价400元的EasyARM2104开发学习套件,第一个月生产的1000套在15天之内抢购一空,直到销售了15000套之后才因新产品的推出而停产。这次活动不仅收回了80万元的宣传费用,而且还直接或间接地影响了超过50万嵌入式相关人员,强有力地达到了品牌宣传的目的。在赢得丰厚利润回报的同时,也打造了嵌入式行业一次非常成功的“事件营销”经典案例,我深深地体会到“俘虏”用户的心是提升品牌的唯一途径。

全球化市场意识
过去,一个公司可能需要等到10年之后才开始考虑是否全球化,而今天由于网络技术的发展,无论我们身处何地,世界各地的新信息仿佛就在眼前,谁也不会被边缘化了,所以今天成立公司明天就要准备全球销售。
这几年ARM已经到了热得不得了的程度,很多人不以为然,其实这是一种必然趋势。事实上,我在美国PHILIPS半导体公司看到,美国1997年出版的《嵌入式系统》杂志就已经大量刊登OS与32位嵌入式系统开发工具等文章和广告。在美国硅谷主办的嵌入式系统展示会上,来自欧美的上千展位展现在我眼前的是各种各样嵌入式系统产品,中国厂商普遍展示的是蜂鸣器、继电器等低档元器件。我第一次身临其境地感受到了中美之间的差距究竟有多大。中国太需要懂得国际市场需求和游戏规则的人才和企业家了。
同样是做USB分析仪,全球只有5家,我们自己的USB分析仪升级版在中国目前定价为3800元,这款产品原来的售价只有1800元,用户还认为太贵了。其实这样的产品在国内一年的销售数量也就200台,但是同样的情况在美国,一个小公司一年的销售额就能够到2000万美元,他们的单台最低售价不低于10000美元,以至于美国同行直接给我来电话,希望我在售价的基础上至少加一个0。
中国企业不做全球化销售能行吗?不行!而且中国企业必须向价值链顶端攀升,否则我们只能做欧美消费品市场的廉价加工基地。

个性化的企业文化,帮助他人走向成功
通过与用户合作所经历的共同成功过程中,用户将我教育成为了一个善良、上进、诚实、优秀的人才。我不仅懂得如何做自己最擅长事情的方式方法,而且也懂得了如何与用户、与员工分享成功的道理。一旦芯片销售数量增大成本下降就主动给用户降价,赢得了用户更长远的支持;公司效益提高了,年终就主动给员工涨工资、加奖金并对优秀员工提供购房津贴。由于公司的规模不大,我们一直以招聘二类本科应届生为主,在内部采取导师制的培养模式,为他们提供至少一年的严格训练,帮助他们规划职业生涯,想尽办法提供机会将他们培养成优秀的人才。这些年来不少公司打电话向我们公司挖人,关键人才从未出现过流失,至今跳槽的员工不超过12人,我深深地感到这就是我人生最大的快乐和财富,离开了支持我的用户和追随我的人才,我将变得一钱不值。
为了保证企业的可持续发展所带来的人才困境,我与江西理工大学合作以五年为期开办了“3+1”嵌入式系统应用开发特训班,与此同时还设立了每人3000元共10人的“周立功奖学金”资助那些动手能力极强而成绩中等的学生,开展校企无缝联接,培养嵌入式系统创新性开发人才的有益尝试,即就是从7个班中选拔30位爱好者用3年的时间修完所有课程,我们为每一位学生提供一台计算机、全套开发工具及其设计中所发生的一切费用,由我们组织著名专家开设专题讲座和课程,学校组织1位专职辅导员和2位指导教师,并由我们提供必要的津贴,然后用一年的时间专门做毕业设计,为此我们制定了严谨、细致的培训计划。
这些年我们还不断赞助各省电子大赛、毕业设计大赛、创新设计大赛,捐赠了50所大学单片机创新实验室,以求扩大企业的知名度和广泛寻求人才的来源。

最后的话
很多开发工程师以为这些都是老板或者经理们应该考虑的问题,与己无关,其实是大错而特错。作为一位优秀而卓越的开发人员,如果希望获得人生的完全成功和快乐,我们时刻需要明白,任何一个企业的可持续发展一定是群策群力的结果。
1981年我经历了高考失败之后上了技校,1999年我作为劳动模范被保送上了大学,创业至今十多年来,往事依然历历在目,用户给予我的回报很多,很难在此一一完全道来,谨以此文与同行、用户分享和交流。
这些年来,我陆续捐资资助教育、设立奖学金以及帮助家乡修建乡村水泥公路、祠堂等公益事业回馈社会。1990年的中秋节,我只身一人南下广东打工,不曾想到会有今天这样的成绩,我一直非常珍惜这来之不易的机会。
作为一个嵌入式技术爱好者,我的愿望就是:“生命不息、奋斗不止!”力争为发展中国的嵌入式系统应用技术贡献自己的一份力量。

posted @ 2007-10-25 19:48 cofd 阅读(44) | 评论 (0)编辑

斯蒂夫•乔布斯的几句很简单的话

1。你们的时间有限,所以不要浪费时间在别人的生活里
2。不要被信条所惑,盲从信条是活在别人的生活里
3。不要让任何人的意见淹没了你内在的心声
4。重要的,拥有跟随内心的直觉和勇气
5。你的内心与直觉知道你真正想成为什么样的人
6。任何其他事物都是次要的

 

斯蒂夫•乔布斯 (苹果公司总裁)
2005年 斯坦福大学毕业典礼

posted @ 2007-10-25 19:26 cofd 阅读(11) | 评论 (0)编辑

十大经典人生哲理故事

抓虾上抓的, 还蛮不错的:

      1. 从前,有两个饥饿的人得到了一位长者的恩赐:一根鱼竿和一篓鲜活硕大的鱼。其中,一个人要了一篓鱼,另一个人要了一根鱼竿,于是他们分道扬镳了。得到鱼的人原地就用干柴搭起篝火煮起了鱼,他狼吞虎咽,还没有品出鲜鱼的肉香,转瞬间,连鱼带汤就被他吃了个精光,不久,他便饿死在空空的鱼篓旁。另一个人则提着鱼竿继续忍饥挨饿,一步步艰难地向海边走去,可当他已经看到不远处那片蔚蓝色的海洋时,他浑身的最后一点力气也使完了,他也只能眼巴巴地带着无尽的遗憾撒手人间。又有两个饥饿的人,他们同样得到了长者恩赐的一根鱼竿和一篓鱼。只是他们并没有各奔东西,而是商定共同去找寻大海,他俩每次只煮一条鱼,他们经过遥远的跋涉,来到了海边,从此,两人开始了捕鱼为生的日子,几年后,他们盖起了房子,有了各自的家庭、子女,有了自己建造的渔船,过上了幸福安康的生活。一个人只顾眼前的利益,得到的终将是短暂的欢愉;一个人目标高远,但也要面对现实的生活。只有把理想和现实有机结合起来,才有可能成为一个成功之人。有时候,一个简单的道理,却足以给人意味深长的生命启示。
  2. 有位秀才第三次进京赶考,住在一个经常住的店里。考试前两天他做了三个梦,第一个梦是梦到自己在墙上种白菜,第二个梦是下雨天,他戴了斗笠还打伞,第三个梦是梦到跟心爱的表妹脱光了衣服躺在一起,但是背靠着背。这三个梦似乎有些深意,秀才第二天就赶紧去找算命的解梦。算命的一听,连拍大腿说:“你还是回家吧。你想想,高墙上种菜不是白费劲吗?戴斗笠打雨伞不是多此一举吗?跟表妹都脱光了躺在一张床上了,却背靠背,不是没戏吗?” 秀才一听,心灰意冷,回店收拾包袱准备回家。店老板非常奇怪,问:“不是明天才考试吗,今天你怎么就回乡了?”秀才如此这般说了一番,店老板乐了:“哟,我也会解梦的。我倒觉得,你这次一定要留下来。你想想,墙上种菜不是高种吗?戴斗笠打伞不是说明你这次有备无患吗?跟你表妹脱光了背靠靠躺在床上,不是说明你翻身的时候就要到了吗?”秀才一听,更有道理,于是精神振奋地参加考试,居然中了个探花。积极的人,象太阳,照到哪里哪里亮,消极的人,象月亮,初一十五不一样。想法决定我们的生活,有什么样的想法,就有什么样的未来。 
  3. 在某个小村落,下了一场非常大的雨,洪水开始淹没全村,一位神父在教堂里祈祷,眼看洪水已经淹到他跪着的膝盖了。一个救生员驾着舢板来到教堂,跟神父说:“神父,赶快上来吧!不然洪水会把你淹死的!”神父说:“不!我深信上帝会来救我的,你先去救别人好了。”过了不久,洪水已经淹过神父的胸口了,神父只好勉强站在祭坛上。这时,又有一个警察开着快艇过来,跟神父说:“神父,快上来,不然你真的会被淹死的!”神父说:“不,我要守住我的教堂,我相信上帝一定会来救我的。你还是先去救别人好了。 ” 又过了一会,洪水已经把整个教堂淹没了,神父只好紧紧抓住教堂顶端的十字架。一架直升飞机缓缓的飞过来,飞行员丢下了绳梯之后大叫:“神父,快上来,这是最后的机会了,我们可不愿意见到你被洪水淹死!!”神父还是意志坚定的说:“不,我要守住我的教堂!上帝一定会来救我的。你还是先去救别人好了。上帝会与我共在的!!” 洪水滚滚而来,固执的神父终于被淹死了……神父上了天堂,见到上帝后很生气的质问: “主啊,我终生奉献自己,战战兢兢的侍奉您,为什么你不肯救我!”上帝说:“我怎么不肯救你?第一次,我派了舢板来救你,你不要,我以为你担心舢板危险;第二次,我又派一只快艇去,你还是不要;第二次,我以国宾的礼仪待你,再派一架直升飞机来救你,结果你还是不愿意接受。所以,我以为你急着想要回到我的身边来,可以好好陪我。” 其实,生命中太多的障碍,皆是由于过度的固执与愚昧的无知所造成。在别人伸出援手之际,别忘了,惟有我们自己也愿意伸出手来,人家才能帮得上忙的!!!
  4. 有一对兄弟,他们的家住在80层楼上。有一天他们外出旅行回家,发现大楼停电了!虽然他们背着大包的行李,但看来没有什么别的选择,于是哥哥对弟弟说,我们就爬楼梯上去!于是,他们背着两大包行李开始爬楼梯。爬到20楼的时候他们开始累了,哥哥说“包包太重了,不如这样吧,我们把包包放在这里,等来电后坐电梯来拿。”于是,他们把行李放在了20楼,轻松多了,继续向上爬。他们有说有笑地往上爬,但是好景不长,到了40 楼,两人实在累了。想到还只爬了一半,两人开始互相埋怨,指责对方不注意大楼的停电公告,才会落得如此下场。他们边吵边爬,就这样一路爬到了60楼。到了60楼,他们累得连吵架的力气也没有了。弟弟对哥哥说,“我们不要吵了,爬完它吧。”于是他们默默地继续爬楼,终于80楼到了!兴奋地来到家门口兄弟俩才发现他们的钥匙留在了20楼的包包里了…… 有人说,这个故事其实就是反映了我们的人生:20岁之前,我们活在家人、老师的期望之下,背负着很多的压力、包袱,自己也不够成熟、能力不足,因此步履难免不稳。20岁之后,离开了众人的压力,卸下了包袱,开始全力以赴地追求自己的梦想,就这样愉快地过了20年。可是到了40岁,发现青春已逝,不免产生许多的遗憾和追悔,于是开始遗憾这个、惋惜那个、抱怨这个、嫉恨那个……就这样在抱怨中度过了20年。到了60岁,发现人生已所剩不多,于是告诉自己不要在抱怨了,就珍惜剩下的日子吧!于是默默地走完了自己的余年。到了生命的尽头,才想起自己好象有什么事情没有完成…… 原来,我们所有的梦想都留在了20岁的青春岁月,还没有来得及完成……
  5. 一个人在高山之巅的鹰巢里,抓到了一只幼鹰,他把幼鹰带回家,养在鸡笼里。这只幼鹰和鸡一起啄食、嬉闹和休息。它以为自己是一只鸡。这只鹰渐渐长大,羽翼丰满了,主人想把它训练成猎鹰,可是由于终日和鸡混在一起,它已经变得和鸡完全一样,根本没有飞的愿望了。主人试了各种办法,都毫无效果,最后把它带到山顶上,一把将它扔了出去。这只鹰像块石头似的,直掉下去,慌乱之中它拼命地扑打翅膀,就这样,它终于飞了起来!秘诀:磨练召唤成功的力量
  6. 有兄弟二人,年龄不过四、五岁,由于卧室的窗户整天都是密闭着,他们认为屋内太阴暗,看见外面灿烂的阳光,觉得十分羡慕。兄弟俩就商量说:“我们可以一起把外面的阳光扫一点进来。”于是,兄弟两人拿着扫帚和畚箕,到阳台上去扫阳光。等到他们把畚箕搬到房间里的时候,里面的阳光就没有了。这样一而再再而三地扫了许多次,屋内还是一点阳光都没有。正在厨房忙碌的妈妈看见他们奇怪的举动,问道:“你们在做什么?”他们回答说:“房间太暗了,我们要扫点阳光进来。”妈妈笑道:“只要把窗户打开,阳光自然会进来,何必去扫呢?” 秘诀:把封闭的心门敞开,成功的阳光就能驱散失败的阴暗。
  7. 雨后,一只蜘蛛艰难地向墙上已经支离破碎的网爬去,由于墙壁潮湿,它爬到一定的高度,就会掉下来,它一次次地向上爬,一次次地又掉下来……第一个人看到了,他叹了一口气,自言自语:“我的一生不正如这只蜘蛛吗?忙忙碌碌而无所得。”于是,他日渐消沉。第二个人看到了,他说:这只蜘蛛真愚蠢,为什么不从旁边干燥的地方绕一下爬上去?我以后可不能像它那样愚蠢。于是,他变得聪明起来。第三个人看到了,他立刻被蜘蛛屡败屡战的精神感动了。于是,他变得坚强起来。秘诀:有成功心态者处处都能发觉成功的力量。
  8. 一个老人在高速行驶的火车上,不小心把刚买的新鞋从窗口掉了一只,周围的人倍感惋惜,不料老人立即把第二只鞋也从窗口扔了下去。这举动更让人大吃一惊。老人解释说: “这一只鞋无论多么昂贵,对我而言已经没有用了,如果有谁能捡到一双鞋子,说不定他还能穿呢!” 秘诀:成功者善于放弃
  9. 中国古代大哲学家老子,有一天他把弟子人叫到床边,他张开口用手指一指口里面,然后问弟子们看到了什么?在场的众第子没有一个能答得上。于是老子就对他们说:“满齿不存,舌头犹在”意思是:牙齿须硬但它寿命不长;舌头须软,但生命力更强。
  10. 老和尚携小和尚游方,途遇一条河;见一女子正想过河,却又不敢过。老和尚便主动背该女子趟过了河,然后放下女子,与小和尚继续赶路。小和尚不禁一路嘀咕:师父怎么了?竟敢背一女子过河?一路走,一路想,最后终于忍不住了,说:师父,你犯戒了?怎么背了女人?老和尚叹道:我早已放下,你却还放不下!启示:君子坦荡荡,小人常戚戚;心胸宽广,思想开朗,遇事拿得起、放得下,才能永远保持一种健康的心态。

posted @ 2007-10-23 12:16 cofd 阅读(84) | 评论 (0)编辑

IronPython Hello world

IronPython是Python编程语言在.NET平台上的实现。它支持一个可交互的控制台,该控制台支持完全的动态编译,并且可以让Python程序员访问所有的.NET库,同时还保持对Python语言完全的兼容性。

下面我们将示范如何运行第一个IronPython程序

IronPython上下载最新的版本, 解压到一个文件夹, 并将该目录添加到用户环境变量的PATH下(Vista下可能要注销一下)
在命令行控制台下输入:ipy, 出现版本号, 版权信息说明安装成功了

找到安装目录下的Tutorial\first.py文件, 修改为:
def add(a, b):
    
"add(a, b) -> returns a + b"
    
return a + b

hi 
= "Hello from "
       
if __name__ == "__main__":
      
print add(hi,"IronPython!")

控制台切换到Tutorial目录, 输入ipy first.py,回车, 结果显示Hello from IronPython!

稍微解释一下代码:
def add(a,b)定义了函数add, 参数a,b. python是动态语言, 所以a,b也不需要类型信息了, 函数的返回值也不需要写了(好简单)
''表示本行为注释
__name__是模块名称, 默认模块名称当然是"__main__"了.
print命令很清楚了, 在控制台打印出结果

好了, 我们的第一个IronPython收工了!

posted @ 2007-10-22 22:42 cofd 阅读(9) | 评论 (0)编辑

介绍一下我的开源小工具SmartStart

快速启动程序的小工具, 详细信息http://www.codeplex.com/ss, 注意运行需要.net framework 2.0.

 

features:

使用简单, 占用资源少

插件式设计, 可以自定义扩展.(例如支持firefox书签)

...

 

个人认为比slickrun好用点.:)

posted @ 2007-08-21 13:03 cofd 阅读(44) | 评论 (0)编辑

用脚本迁移sql server database

经常在项目中需要迁移数据库, 使用management studio脚本生成工具得到的只是数据库的schema,:( 幸好网上有不少第三方的工具, 现在就向大家隆重推荐一个: SQL Server Hosting Toolkit是codeplex上一个项目(目前没有源码,希望以后会有). 该项目雄心勃勃, project roadmap上写到最终会集成到Visual Studio和Management Studio:)

虽然暂时只是一个控制台程序, 使用起来还是挺简单的,比如要将本机数据库Test迁移到另一台服务器上:

先将Test变成脚本(包含schema和data),执行下面的命令

sqlpubwiz script -d Test c:\Test.sql

在把生成的脚本文件在待迁移的sql server上执行一下,整个数据库就过去了,:)简单就是美!

posted @ 2006-10-18 09:27 cofd 阅读(34) | 评论 (0)编辑