产品研发常见问题

    最近拿到一本《新产品成功的故事》的书,里面提到我国企业在理解和满足客户需求、制定产品开发战略、组织和配置战略资源方面的问题,在这些问题的描述中,我们能看到gemming公司的影子吗?
    1. 未将产品开发和管理作为企业生存和发展的战略看待,企业缺乏基于战略的可持续发展产品规划;
    2. 企业高层领导对产品管理关注和重视不够,长期依赖技术部门和少数技术人员响应和争夺市场,不能形成科学系统的研发体系和完善的营销体系间的协同配合,无法从制度上保证产品开发的成功率和持续性;
    3. 对产品研发的投资力度不够,产品研发后劲不足,不能保证产品同时构思一代,开发一代,销售一代;
    4. 产品研发质量不高,生产流程设计不合理,导致生产成本较高,库存量较大,产品缺乏竞争力,不能有效引导市场并超越对手。

灰度图像标记效果展示

    今天和qym一起去了嘉铭,仔细调整了一些标记相关的参数,包括:最大开光时间、最小开光时间、点间距,并针对昨天的坐标系出现的问题,将X坐标和Y坐标进行了反向。
    首先我标记了自己的相片,效果如下:
screen.width/2)this.width=screen.width/2; >
    然后就标记了几张宝贝仔的图片:
screen.width/2)this.width=screen.width/2; >
screen.width/2)this.width=screen.width/2; >
screen.width/2)this.width=screen.width/2; >
    看得出来宝贝仔坐在什么上面吗?如果你看出来了,说明这照片质量还行了,^_^,上面每幅照片上都标出了标记时间,请相信你的眼睛,这都是真实的测试结果!

    总的来说,我是比较满意这些照片的效果的。CO2激光器能量比较大,在纸片上打会把纸片烧得变形,因此,要出很精细的效果是很难的。而且我们的算法还没有开始做,现在我们直接使用了灰度图像的灰度矩阵,最大开光时间(maxLaserOnTime)和最小开光时间minLaserOnTime定下来以后,灰度值为i的象素点对应开光时间为:
    minLaserOnTime + i / 256.0 * (maxLaserOnTime – minLaserOnTime) 
    这是一个线性关系,但是标记材质对各种能量的反应并不呈线性关系,而会是某种曲线关系,这个曲线的参数是我们后期工作的重点。

    另外,要达到更精细的标记效果,我们不得不考虑光纤激光器,明天我们就可以去实验光纤激光器的性能和用于灰度图像标记时的效果,到时候才是对我们的想法的真正考验!

再一次排大合唱,有种似曾相识的感觉

    还记得大二的时候,参加了系里面的合唱队,将近200多个人的队伍,最终赢得了学校的一等奖。当时的歌曲是《好日子》,艺术团兰老师是我们的教练,她教我们如何发声。
    记得有一天我和其他两位同学迟到了,兰老师叫我们三个人把好日子的高潮部分唱一遍,对着那么多同学,我很难为情,吼出来时,我有种腾云驾雾的感觉,那叫一个紧张…..
    吼完以后,兰老师指着我说,唱得还行,然后叫周围两位同学正式开唱以后只要对准口型就ok了,^_^,有趣的往事……
    团歌真正吼出来后,是很有气势的,歌词也有血有肉,很是震撼。加油!

看到了自动化看不下去了

    COM本身的原理是比较简单的,但是在他基础上实现的应用却是相当麻烦,自动化、ActiveX、COM+,通过简单的基础理论变换出无穷的应用,microsoft的工程师把宏应用到了极致,每种应用都伴随着一堆DYN_和IMP_宏,让人看得好生郁闷。若非专职于相应技术的开发,学习这些理论基础,实在是一件很痛苦的事情。所以,我决定暂停《COM原理与应用》的学习。
    COM除了给了我全新的对于接口、组件的认识,并且叹服于MICROSOFT的宏伟工程的同时,最重要的是,使我对软件复用有了新的认识。COM通过接口的方式,屏蔽了进程内和进程外的组件调用的差异,通过STUFF和PROXY对象,使得在网络上复用组件成为可能,这使我不得不想到我们的DA板卡驱动层,若是用COM实现驱动层的接口,就可以在局域网内共享驱动层接口,就可以在局域网内实现一台主机控制多台打标机、编辑软件与驱动层分离等功能吗?
    当然,若是能够将软件做成WEB版本的,通过浏览器访问标记机,WEB本地编辑好标记内容以后,直接将标记内容上传给远程标记机进行打标,这样也是可以实现上述两个功能,而且这样的情况下,标记机的控制PC可以做的很简单,可以很好的控制成本。
    总之,我认为信息化技术、自动化技术在标记环境中的应用,会是一个趋势,WEB技术会在工业领域大显身手,探讨WEB技术在标记软件上的应用,是很有意义的一件事情。

COM印象记(续)

    总的来说,我觉得COM的实现与ps的插件机制有很多底层机制是非常相似的,最近下到一套solidgraph的源码,它实现了很多非常酷的技术,包括:
    1. 2d/3d绘制、属性设置
    2. 组合功能
    3. 插件机制
    4. .net风格对话框
    5. lua脚本语言控制
    6. 强焊而熟练的opengl渲染
    所有代码基于mfc开发,特别适于我来学习。如果有时间,一定尝试用com来实现一个最小的插件系统。

COM印象记

    《From CPP to COM》,虽然只是一个很小的册子,但是深入浅出,把COM的实现从C++函数逐步推进到COM实例。短短1天时间,不太可能对COM有准确把握,只是把自己的理解写下来。
     1. 什么是interface?
     interface是COM中一个很重要的概念,那么它到底是什么呢?是一个对象的指针,还是类的成员函数指针?在传统C++中,interface总是与function相关的,在COM中也是如此吗?我们看一段代码:
     

以下内容为程序代码:

HRESULT CDB::QueryInterface(REFIID riid, void** ppObject) 
{
    if (riid==IID_IUnknown || riid==IID_IDB) 
    {
        *ppObject=(IDB*) this;
    }
    else 
    {
        return E_NOINTERFACE;
    }

    AddRef();

    return NO_ERROR;
}

很有启发的一段话

    ……,每个人,从出生到死亡,都在忙碌的找寻对手,从一个战场到另一个战场,累积胜利多的人,最大的奖赏,是从容。

回来了,一切还是那么熟悉

    从H3组回到DSP,地点变了,人也变了,要做的事情也变了,但DSP没有变,DSP/BIOS也没有变,呵呵,最后还能到南一楼走一遭,也算是圆满了。
    从H3组回到DSP,突然发现对一些东西有了更清晰的理解,上层软件、DSP程序、CPLD,注意力逐渐关注到可扩展性、通用性、稳定性。
    这支队伍是一支全新的,有实力的队伍,如何把他们的实力转换成实在的战斗力,就看后面的努力了。

函数调用过程中堆栈运行情况

    最近看到很多资料,都是关于堆栈的,忍不住想亲自对函数调用过程中的堆栈运行情况探个究竟,下面待我细细剖来!
    操作系统:windows xp
    编译器:vc 6.0 sp2
    程序编译版本:debug,注意:release版本生成的程序与debug版本相差甚大,但大致原理相同,因此release版本的堆栈运行情况不在本文关注范围内。

    首先看看《Computer Systems》一书中关于函数调用的描述:

    IA32 programs make use of the program stack to support procedure calls. The stack is used to pass procedure arguments, to store return information, to save registers for later restoration, and for local storage. The portion of the stack allocated for a single procedure call is called a stack frame. Figure 3.16 diagrams the general structure of a stack frame. The topmost stack frame is delimited by two pointers, with register %ebp serving as the frame pointer, and register %esp serving as the stack pointer. The stack pointer can move while the procedure is executing, and hence most information is accessed relative to the frame pointer.

    Suppose procedure P (the caller) calls procedure Q (the callee). The arguments to Q are contained within the stack frame for P. In addition, when P calls Q, the return address within P where the program should resume execution when it returns from Q is pushed on the stack, forming the end of P’s stack frame. The stack frame for Q starts with the saved value of the frame pointer (i.e., %ebp). followed by copies of any other saved register values.
    Procedure Q also uses the stack for any local variables that cannot be stored in registers. This can occur for the following reasons:
    1. There are not enough registers to hold all of the local data.
    2. Some of the local variables are arrays or structures and hence must be accessed by array or structure references.
    3. The address operator ‘&’ is applied to one of the local variables, and hence we must be able to generate an address for it.
    Finally, Q will use the stack frame for storing arguments to any procedures it calls.
    As described earlier, the stack grows toward lower addresses and the stack pointer %esp points to the top element of the stack. Data can be stored on and retrieved from the stack using the pushl and popl instructions. Space for data with no specified initial value can be allocated on the stack by simply decrementing the stack pointer by an appropriate amount. Similarly, space can be deallocated by incrementing the stack pointer.


    下面进入测试过程,我的测试代码如下:

    #include 
    void test(int i)
    {
          char output[8];
          strcpy(output, "abcdefg");
    }

    int main()
    {
          test(10); 
          return 0;
    }