Monday, October 8, 2007

performance.

 

工作态度:

 

1.       纪律                      自觉遵守公司规章制度

2.       积极性                 工作努力,做事积极主动,有进取心。

3.       协作性                 和同事和睦相处,相互配合。

4.       成本意识            节约公共物品,减少浪费。

 

工作能力:

 

5.       专业能力            掌握工作所需知识,技能。

6.       适应能力            能迅速融入新工作。

7.       沟通能力            能准确表达自己的意见,正确理解上级指示。

8.       创造力                 有改革创新能力,不断提出合理化建议。

 

工作业绩:

 

9.       正确性                 工作符合岗位要求,做事细致,无事故,值得信赖。

10.   工作效率            有很强的工作效率意识,处理事务迅速,没有误工,能完成标准工作量。

11.   工作成果            按时按量完成交给的工作任务。

 

 

Saturday, September 29, 2007

Read book: Think like a manager

Read this book:

 

Think Like a Manager: Everything They Didn't Tell You When They Promoted You (Paperback)
by Roger Fritz

Tuesday, September 25, 2007

C++ 风格及流派

我确实没有见过哪一种语言能像C++这样,在代码风格方面表现得如此诡谲和难以捉摸:谁也说不清C++代码究竟能衍生出多少种迥异的风格,但我知道,有许多C++初学者在面对不同风格的C++代码时,经常会误以为自己看到的是好几种完全不同的编程语言??仅此一点就足以提醒我们,研究和廓清C++语言风格的演化和发展规律已是当务之急了。

C++语言风格流变史:

详见:http://vcer.net/1181705404640.html

1. 带类的C――C语言风格的因袭

2. I/O――C++的新形象

3. OWLMFC――窗口环境下的风格变异

4. 模板――现代C++风格的基础

5. ATL――COM时代的另类C++

6. 标准C++――一种全新的语言?

7. 读不懂的代码――兼容并包的语言风格

8. C++Builder――Borland的复兴之路

9. Visual C++ .NET――革命还是叛逆?

c++派说:

1. 经典C++流:类是核心,例程多用C Runtime的,很少用模版,一般是正统教育的结果。

2. 古典C流:基本上当C用,偶尔用用对象,不使用异常,喜欢怀旧。

3. MFC流:秉承MFC的风格,主要使用MFC/ATL对象和Win32 API,不喜欢STL,用很多的宏把IDE的语法提示模块折磨到崩溃。

4. Portable流:以C RuntimeSTL为主要工具,使用类和模版,不跨平台毋宁死。

5. Functional流:以模版和STL为主要武器,大量使用函数式语言的设计方法,并号称这才是真正的C++

6. Win32流:多使用全局函数,偏爱Win32 API,但不排斥C Runtime,通常喜欢轻量级的程序,所以身材也比较苗条。

7. Java流:全面使用Java的风格,不能容许任何全局成员,但允许使用STL的集合类,写很多叫Factory的类。

8. COM流:喜欢AddRef()Release(),大量使用接口,隐藏一切可以隐藏的东西,诵经的时候要把上帝替换成COM

9. 戒律流:追求完美的C++程序,计较每一个constthrow(),极力避免不安全的cast,随身一定要带一本ISO C++手册。

10. 混沌流:其程序无常形,无恒道,变幻莫测,吾不知其名

C++杂思录——风格的选择

http://blog.csdn.net/myan/archive/2004/06/16/1916.aspx

同事离职撰文

公司一同事离职时撰文一篇,太有才了:

 

锦涛三年,余辞同济以游。其时,群雄外包,海内未平,或曰:汉略者,位处东海,其势壮焉,其薪高焉,不若往而投之,大业可图。余善其言,乃以孤穷身入汉略事之,历今两载有余,其间大小近十项目,或盛或衰,或荣或哀,皆犹在目,不足与外人道矣。今既辞归。乃做文志之

Windows消息

 

 

GetMessage

::PeekMessage

 

SendMessage

PostMessage

 

PumpMessage

::TranslateMessage

::DispatchMessage

 

Pretranslatemessage

 

消息泵(CWinThread::PumpMessage)

消息循环,(::GetMessage,::PeekMessage)

消息映射

消息路由

消息队列:消息分为队列消息(进入线程的消息队列)和非队列消息(不进入线程的消息队列)

Friday, September 21, 2007

Network programming-TCP model


Server



  1. Initialize WSA.

  2. Create a socket.

  3. Bind the socket.

  4. Listen on the socket.

  5. Accept a connection.

  6. Send and receive data.

  7. Disconnect.


Client



  1. Initialize WSA.

  2. Create a socket.

  3. Connect to the server.

  4. Send and receive data.

  5. Disconnect.



Server Source Code





#include <stdio.h>
#include "winsock2.h"

void main() {

// Initialize Winsock.
WSADATA wsaData;
int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
if ( iResult != NO_ERROR )
printf("Error at WSAStartup()\n");

// Create a socket.
SOCKET m_socket;
m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

if ( m_socket == INVALID_SOCKET ) {
printf( "Error at socket(): %ld\n", WSAGetLastError() );
WSACleanup();
return;
}

// Bind the socket.
sockaddr_in service;

service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr( "127.0.0.1" );
service.sin_port = htons( 27015 );

if ( bind( m_socket, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) {
printf( "bind() failed.\n" );
closesocket(m_socket);
return;
}

// Listen on the socket.
if ( listen( m_socket, 1 ) == SOCKET_ERROR )
printf( "Error listening on socket.\n");

// Accept connections.
SOCKET AcceptSocket;

printf( "Waiting for a client to connect...\n" );
while (1) {
AcceptSocket = SOCKET_ERROR;
while ( AcceptSocket == SOCKET_ERROR ) {
AcceptSocket = accept( m_socket, NULL, NULL );
}
printf( "Client Connected.\n");
m_socket = AcceptSocket;
break;
}

// Send and receive data.
int bytesSent;
int bytesRecv = SOCKET_ERROR;
char sendbuf[32] = "Server: Sending Data.";
char recvbuf[32] = "";

bytesRecv = recv( m_socket, recvbuf, 32, 0 );
printf( "Bytes Recv: %ld\n", bytesRecv );

bytesSent = send( m_socket, sendbuf, strlen(sendbuf), 0 );
printf( "Bytes Sent: %ld\n", bytesSent );

return;
}


Client Source Code







#include <stdio.h>
#include "winsock2.h"

void main() {

// Initialize Winsock.
WSADATA wsaData;
int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
if ( iResult != NO_ERROR )
printf("Error at WSAStartup()\n");

// Create a socket.
SOCKET m_socket;
m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

if ( m_socket == INVALID_SOCKET ) {
printf( "Error at socket(): %ld\n", WSAGetLastError() );
WSACleanup();
return;
}

// Connect to a server.
sockaddr_in clientService;

clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );
clientService.sin_port = htons( 27015 );

if ( connect( m_socket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
printf( "Failed to connect.\n" );
WSACleanup();
return;
}

// Send and receive data.
int bytesSent;
int bytesRecv = SOCKET_ERROR;
char sendbuf[32] = "Client: Sending data.";
char recvbuf[32] = "";

bytesSent = send( m_socket, sendbuf, strlen(sendbuf), 0 );
printf( "Bytes Sent: %ld\n", bytesSent );

while( bytesRecv == SOCKET_ERROR ) {
bytesRecv = recv( m_socket, recvbuf, 32, 0 );
if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET ) {
printf( "Connection Closed.\n");
break;
}
if (bytesRecv < 0)
return;
printf( "Bytes Recv: %ld\n", bytesRecv );
}

return;
}


Tuesday, September 18, 2007

C++ exception

A Crash Course on the Depths of Win32™ Structured Exception Handling

http://www.microsoft.com/msj/0197/exception/exception.aspx

 

How a C++ compiler implements exception handling

http://www.codeproject.com/cpp/exceptionhandler.asp

 

Monday, September 10, 2007

理想团队

下午参加了部门内Team Lead的管理方面的培训,大家讨论了下理想团队的条件,列举如下:

         有共同目标

         计划

         执行力

         良好的制度

         Open,积极的氛围

         公平的激励机制

         凝聚力

         信任

         分工明确

         好的领导

         畅通的沟通平台

         允许多样化

 

Thursday, September 6, 2007

趋势

 

触摸技术

Microsoft Surfacehttp://www.microsoft.com/surface/

Autodesk touch wall: http://www.youtube.com/watch?v=ArlmuNJ2NBc

QQ: http://labs.qq.com/e/16/

 

内文广告

Contera: http://www.kontera.com/default.aspx

宏界:http://www.vogate.com/

Clickeye: http://www.clickeye.cn/

 

Web App

IM: http://wwwl.meebo.com/

Best4c: http://best4c.cn/

 

 

3D:

SecondLife:  http://secondlife.com/

3D Search engine:  http://shape.cs.princeton.edu/search.html

SpaceTime: http://www.spacetime.com/

 

 

附:

未来网络发展的十大趋

http://www.techweb.com.cn/world/2007-09-06/251639.shtml

1.     语义网

2.    人工智

3.    虚拟世

4.    移动技术

5.    注意力经

6.    作为网络服务的网

7.    在线视频/网络电

8.    互联网应

9.    国际网

10. 个性

Tuesday, September 4, 2007

China VS German


超简洁图片版中德文化比较:


http://msn.bbs.ynet.com/viewthread.php?tid=459060


真的非常形象 :) 毕业后进公司一直跟德国的team一起开发,跟德国人已经打了两年多的交道了,虽然多半是通过mail,AIM,telephone等形式的,但是映像还是非常强烈的。



Sunday, September 2, 2007

Notes for Engineering Excellence Traning

Engineering Excellence Traning

People, process, Tools

Advanced  Debuging

 

By Raymond Zhang张银

CPU 的调试支持INT1,INT 3

软件支持调试应该由架构师通盘考虑

Method for fixing bugs: intuition, Diagnostics, Leap of faith, Head in sand, Scientific approach.

软件断点

Int3

         机器码为1字节,即0xCC

         没有数量限

         局限性

属于代码类断点,即可以让CPU执行到代码段内的某个地址时停下来,不适用于数据段和I/O空间.

对于在中执行的程序,比如或其他固件程序,无法动态增加软件断点,硬件断点

Debug Release的区别之一:一个变量如果没有初始化,则在debug中编译器会初始化,而在release版中则不会被初始化(耗费时间),这也是为什么有时在deb ug中是好的而release版中出错的原因之一

CPU的调试寄存器

软件断点设置的是代码段的地址,硬件断点则可以是,代码段,数据段,I/O段的地址

Exception and interuption

高级语言的Exception都来自CPU Exception, 0 Divide-By-Zero, 1 Debug Exception, etc.比如,如果一个指针没有真正指向一个有效地址,这时往指针强行写值,CPU就会抛出Page Fault(14) exception

 

Best Practices:

Design code so bugs are easy to isolate:

         Assertions

         Tracing

         Logging

         Error Messages

         IDs,在代码内部给每个错误分配一个错误ID,帮助开发人员定位源代码

 微软自带一个工具可以看window内核的tracing 信息,什么工具

Write complete unit tests.

Set compiler to its pickiest mode.

Use tools to ensure good code coverage. i.e: Magellan from MSR.

Time spent on quality saves time later!

函数返回值都是放在Ax寄存器中

Windows中的异常

Win32, CLR.Net异常(异常代码e0434f4d) ,C++(0x06d7363)

JIT调试器的设置!与WindbgVS.net结合 cmd:  windbg -i

Dr.Watson

Msdn杂志有调试专

 

《成功人士的七个习惯

Communication:

Listenning skills:

         Value the opinions of others

         Be considerate, don't interrupt.

         Non-verbal message are important also.

Asking questions:

         Make the point.

Persuasion:

Know your audience.

Three type of people

 

Software Lifecycle.

Planning, definition, design, implement, test, CCB, RTM

Milestone,spec,

Feature meeting

unit test, code review.

Code complete, feature complete,

Bug tracking,Bug bush, trigle meeting(PM, Dev,QA)

Soft CCB, Hard CCB

Performance, Security in software lifecycle.

Milestone Quality(MQ), Quality gates

 

Priorities and Time Management.

Make decision: Pugh concept Selection process.

浪费时间: interrupt.

Suggestion:

2 tasks at a time.

Batch process.

Use Outlook's task list.

 

Design

Successful design strategy: simply!

Design Process: basic design, draft, iterator, UML, TDD

Design issue:

         Performance,

         Usability

         Reliability

         Internationalization

         Localizability.

         Security.

Design by Contract.

Design Pattern.

Prototyping.

Documentation.

 

TDD

Unit test.

Performance testing practices.

 

C++ Object model:

每个函数都会被分配一个stack

Compilercompile的过程中将每一个函数需要的stack空间算好了,这些信息就存在exe文件中。然后在运行时再分配空间

对于if else这样的分支,现代编译器都会将这样的block当成一个函数,然后在Active stack中为其分配statck空间

Stack空间是提前分配好了的,即stack是静态存储空间,在运行时已不可改变

内存分配的两个原则: new谁释放。构造函数中分配,析构函数中释放

 

Friday, August 24, 2007

Tips for COM programming.


我们写程序的时候到比较简单,请大家遵守几个原则:
  1、启动组件得到一个接口指针(Interface)后,不要调用AddRef()。因为系统知道你得到了一个指针,所以它已经帮你调用了AddRef()函数;
  2、通过QueryInterface()得到另一个接口指针后,不要调用AddRef()。因为......和上面的道理一样;
  3、当你把接口指针赋值给(保存到)另一个变量中的时候,请调用AddRef();
  4、当不需要再使用接口指针的时候,务必执行Release()释放;
  5、当使用智能指针的时候,可以省略指针的维护工作;(注1)



 总的来说,调用组件程序大概有如下方法:
#include 方法 IDL编译后,为方便C/C++程序员的使用,会产生xxx.h和xxx_i.c文件。我们真幸福,直接#include后就可以使用了
#import 方法 比较通用的方法,vc 会帮我们产生包装类,让我们的调用更方便
加载类型库包装类 方法 如果组件提供了 IDispatch 接口,用这个方法调用组件是最简单的啦。不过还没讲IDispatch,只能看以后的文章啦
加载ActiveX包装类 方法 ActiveX 还没介绍呢,以后再说啦



自动化组件的使用方式 简要说明
示例0 在脚本中调用 在第九回/第十回中,已经做了介绍
示例1 使用 API 方式调用 揭示 IDispatch 的调用原理,但傻子才去这么使用那,会累死了
示例2 使用 CComDispatchDriver 的智能指针包装类 比直接使用 API 方式要简单多啦,这个不错!
示例3 使用 MFC 装载类型库的包装方式 简单!好用!常用!但它本质上是使用 IDispatch 接口,所以执行效率稍差
示例4 使用 #import 方式加载类型库方式 #import 方式使用组件,咱们在第七回中讲过啦。常用!对双接口组件,直接调用自定义接口函数,不再经过 IDispatch,因此执行效率最高啦
示例x vb、java、c#、bcb、delphi....... 反正我不会,自己去请教高人去吧 :-(



通知的方法
  当程序甲方内部发生了某个事件的时候,需要通知乙方,无非使用几个方法:
 通知方式 简单说明 评论
直接消息 PostMessage()
PostThreadMessage() 向窗口或线程发个消息 你什么时候执行我就不管啦
SendMessage() 马上执行消息响应函数 不执行完消息处理函数不会返回
SendMessage(WM_COPYDATA...) 发消息的同时,还可以带过去一些自定义的数据 比较常用,所以单独列了出来
间接消息 InvalidateRect()
SetTimer()
...... 被调用的函数会发送相关的一些消息 这样的函数太多了
回调函数 GetOpenFileName()...... 当用户改变文件选择的时候,执行回调函数 嗨!哥们,这是我的电话,有事就言语一声。


Saturday, August 18, 2007

房子终于定下来了。

一定要写点东东。



七八月份发生了很多事情都来不及记下来。



昨天出去跑了一天终于把房子定下来了,要搬到莘庄去了。找房子是很折磨人的事。来
上海两年多了,住了两个地方。

不过那两个房子找起来还是挺快的,都只看了一个就定下来了。这一次折腾了很长一段
时间,上网查,找中介…



然后就是工作的事也挺烦的。现在的这个项目做了两年多了,经历了三个release,已
经没有了新鲜感和passion,再做下去没有了太多乐趣。6月底跟部门负责人谈了下换项
目的事,到现在已经好长时间了还不能调走。刚开始负责人还是挺爽快的说好我帮你解
决,但是先要跟Atlanta 的manager商量下,这个过程可能有点长,需要我耐心的等
等。大概过了两个多星期,又跟我说德国的 Team知道后very frustrated,希望我能再
慎重的考虑下。不过这两年跟德国的team合作还是很愉快的,他们都是四五十岁的
professional,最年轻的也有三室多岁吧,不想国内,程序员都是20多点的毛头。

但是,情感归情感,还是想坚持换一个项目。现在来了个刚毕业的新员工来顶替我,
开始工作交接了。



前段时间还经常收到猎头电话,诱惑不断。好几个都是小公司或是跟现在的公司差不多
性质的,就直接拒绝了。



房子现在是定下来了,但还有一件事可能又要一番折腾了,就是办居住证的事。找房东
到房产交易中心办证明的念头基本可以打消了,只能想办法找有房子的同事办个亲友证
明了。真是很麻烦。

Monday, August 13, 2007

Overhead in project management.

Overhead task:

Product Support

RRT Support

Trainings

Support for consulting

Other overhead

Monday, August 6, 2007

网络编程应用实例


自动更新
发送错误报告
网络蜘蛛
IM
流媒体
P2P
...


Saturday, July 14, 2007

naming style in STL.

_First, _Last, _Mid, _Next, _Dest, _Before, _After, _Begin, _End, _Left, _Right, _Idx, _Temp, _Prev,

_Count, _Distance,_Old, _New, _Val, _Found,_Result

 

_InIt, _OutIt, _FwdIt, _BidIt, _Ty, _Fn, _Pr.

Monday, July 9, 2007

FW: Generic Programming- common technique.

 

         class _Tr = char_traits<_E>

template<class _E,
 class _Tr = char_traits<_E>,
 class _A = allocator<_E> >
 class basic_string {}

 

         Operator overload

 

_Myt& operator=(const _Myt& _X){}

_Myt& operator+=(const _Myt& _X){}

 

 

          Typename

 

template<class _Iter>

            struct iterator_traits

            {          // get traits from iterator _Iter

            typedef typename _Iter::iterator_category iterator_category;

            typedef typename _Iter::value_type value_type;

            typedef typename _Iter::difference_type difference_type;

            typedef difference_type distance_type;    // retained

            typedef typename _Iter::pointer pointer;

            typedef typename _Iter::reference reference;

            };

 

 

         Marco

_STD_BEGIN    

_STD_END

 

 

         Nested class.

class _CRTIMP ios_base {

            class failure : public runtime_error { … };

            … …

};

 

 

         Explicit

           

explicit basic_ios(_Mysb *_S)

 

explicit

 

c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢? 如果c++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class MyClass { public: MyClass( int num ); } .... MyClass obj = 10; //ok,convert int to MyClass 在上面的代码中编译器自动将整型转换为MyClass类对象,实际上等同于下面的操作: MyClass temp(10); MyClass obj = temp; 上面的所有的操作即是所谓的"隐式转换" 如果要避免这种自动转换的功能,我们该怎么做呢?嘿嘿这就是关键字explicit的作用了,将类的构造函数声明为"显示",也就是在声明构造函数的时候前面添加上explicit即可,这样就可以防止这种自动的转换操作,如果我们修改上面的MyClass类的构造函数为显示的,那么下面的代码就不能够编译通过了,如下所示: class MyClass { public: explicit MyClass( int num ); } .... ...

 

C++中有两种"用户定义的型别转换":型别转换操作符和单参数构造函数。

explicit
就是用来禁止"单参数构造函数"的型别转换功能的。

 

 

         inline

inline ios_base& __cdecl boolalpha(ios_base& _I)

            {_I.setf(ios_base::boolalpha);

            return (_I); }

 

 

         exception, failure, allocator, scentry

 

         Using

Class MyRegOpen{

using std::nothrow;

}

命名空间(Namespace

STL相关的概念是命名空间(namespace)。STL定义在std命名空间中。有3种方法声明使用的命名空间:

1.用using关键字使用这个命名空间,在文件的顶部,但在声明的头文件下面加入:
using namespace std;
这对单个工程来说是最简单也是最好的方法,这个方法可以把你的代码限定在std命名空间中。

2.使用每一个模板前对每一个要使用的对象进行声明(就像原形化):
using std::cout;
using std::endl;
using std::flush;
using std::set;
using std::inserter;
尽管这样写有些冗长,但可以对记忆使用的函数比较有利,并且你可以容易地声明并使用其他命名空间中的成员。

3.在每一次使用std命名空间中的模版时,使用std域标识符。比如:
typedef std::vector VEC_STR;
这种方法虽然写起来比较冗长,但是是在混合使用多个命名空间时的最好方法。一些STL的狂热者一直使用这种方法,并且把不使用这种方法的人视为异类。一些人会通过这种方法建立一些宏来简化问题。

除此之外,你可以把using namespace std加入到任何域中,比如可以加入到函数的头部或一个控制循环体中。

 

         Typename

         c++Template中很多地方都用到了typenameclass这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢?
相信学习C++的人对class这个关键字都非常明白,class用于定义类,在模板引入c++后,最初定义模板的方法为: template<class T>......

这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了typename这个关键字,它的作用同
class
一样表明后面的符号为一个类型,这样在定义模板的时候就可以使用下面的方式了: template<typename
T>......
在模板定义语法中关键字classtypename的作用完全一样。
typename
难道仅仅在模板定义中起作用吗?其实不是这样,typename另外一个作用为:使用嵌套依赖类型(nested depended name),如下所示:

         class MyArray
{
public
typedef int LengthType;
.....
}

template<class T>
void MyMethod( T myarr )
{
typedef typename T::LengthType LengthType;
LengthType length = myarr.GetLength;
}

        
这个时候typename的作用就是告诉c++编译器,typename后面的字符串为一个类型名称,而不是成员函数或者成员变量,这个时候如果前面没有
typename
,编译器没有任何办法知道T::LengthType是一个类型还是一个成员名称(静态数据成员或者静态函数),所以编译不能够通过。

 

Question:

 

1.     extern template class _CRTIMP basic_ios<char, char_traits<char> >;  ??

 

2.     why static?

Struct char_traits{

static void __cdecl assign(_E& _X, const _E& _Y);

}

 

3.     s

 

 

 

 

 

 

Thursday, July 5, 2007

How to hide Office menu especially Word 2007 Ribbon?

From Dmwiki

Jump to: navigation, search

There is a requirement that wrapped CHtmlView into a COM for previewing all kinds of office document. It must hide all menu and toolbars for increase the viewing area and should support office XP\2003\2007.

For Office 2003 it is easy to do that. But for Word 2007, It doesn’t work! It stumppe us for several weeks. I googled and also posted this question in msdn newsgroup, nobody gives the correct solution.

Some MVP of Office said the new Office interface was consciously designed to NOT allow the developer as much freedom with which tools are provided to the user. You won't be able to recover this realestate completely.

Solution for Office 2003:

 Dim iCounter As Integer 
 For iCounter = 1 To CommandBars.Count 
 Application.CommandBars(iCounter).Enabled = False 
 Next

Possible solution for Word 2007 we have tried:

One possibility would be to define and include an XML part for the Ribbon in the document's file structure. The Ribbon XML can set the ribbon to start from scratch( startFromScratch=TRUE) in CustomUI.xml. which would make it "empty". But you can't get rid of the big, round "Office" button that will contain a limited number of basic commands. But this could not hide all the ribbon area completely.The big round button and quick access area and some other command,such as "help",will remain.


Beyond that, the object model provides ToggleRibbon method, which will cycle between "collapsing" the ribbon to look like an old-style MenuBar and expanding it again.


The third possible solution is trying the Windows API to find the windows handle of the ribbon, and then use API to hide the windows. This solution did could hide the ribbon but another problem is we could not minimize it.

Correct Solution for Word 2007:

When an Office app is OLE hosted, you can toggle on and off the UI using an OLE command. Like this:

   #include "exdispid.h"
   OLECMDF cmd = QueryStatusWB( OLECMDID_HIDETOOLBARS);
   if( !(cmd & OLECMDF_LATCHED))
       ExecWB(OLECMDID_HIDETOOLBARS, OLECMDEXECOPT_PROMPTUSER, NULL, NULL);

 

Wednesday, July 4, 2007

畅想ERP系列故事

看看畅想ERP系列故事吧,很有逻辑性条理性

畅想ERP系列故事之一:黄总的困惑

畅想ERP系列故事之二:独断的决议

畅想ERP系列故事之三:项目经理的选择

畅想ERP系列故事之四:对话ERP误区

畅想ERP系列故事之五:ERP规划报告

畅想ERP系列故事六:一把手工程的重要性

畅想ERP系列故事七:选型前的需求分析

畅想ERP系列故事八:CIO的借鸡生蛋计划

畅想ERP系列故事之九:实施顾问的选择

畅想ERP系列故事之十:企业情况调研

畅想ERP系列故事之十一:"六问"采购部

畅想ERP系列故事之十二:生产需求调研

畅想ERP系列故事之十三:仓库系统调研

畅想ERP系列故事之十四:财务系统调研

畅想ERP系列故事之十七:备品的处理

Integratiion-软件的整合


现在的软件产品都强调"整合",像微软的各种产品都尽量整合在一起,其开发类产品比如Visual studio,Sql server management studio,还有新开发的 Express studio等等通过visual studio来整合,Office 系列更是整合的经典。 Autodesk现在也提了个Autodesk 3.0的概念,其中重要的一点是2D CAD, 3D CAD, PDM\PLM产品全部整合在一起,再结合ERP系统提供给用户的就是一整套Solution。 Dassault在这方面已经走在前面了。Google的g各种产品基本都通过其核心的搜索技术整合起来的。


Saturday, June 30, 2007

业务与技术

软件开发的趋势向可动态重新配置的服务转变。

纯粹的技术人员提升自己的最好办法是:转型微既是技术专家又是业务能手的业务技术
人员。

什么是框架:首先是抽象一些通用的可重用的功能,其次是可扩展。

业务就是一种流程,管理思想。

技术人员应腾出更多时间去贴近业务层面看待信息化,信息系统,致力于向复合型人才
发展。



技术转业务的建议:1.是破除思考技术问题的习惯,开始深入理解自身所在行业的业
务;2.训练自己的分析技能,以便将业务转变为技术,不断考虑怎样才能使业务更成
功。3.培养沟通技能,跳出自己工作的小圈子,设法与客户,供应商,合作伙伴等交
流,学会协作。4.学会快速的了解,响应变化,提高自己的业务敏捷性。

Data Mining

使用数据挖掘解决问题:

消费者将购买什么产品?哪些产品会一起

销售?

标识将流失的消费者

市场状况如何,将会如何发展?

分析网站

确定营销活动是否成功

劣质数据

文本分析

 

常见数据挖掘算法:

贝叶斯Naïve Bayers

决策树Decision Trees

神经网络Neural Networks

关联规则Association Rules

聚类分析 Clustering

时序聚类分析 Sequence Clustering

时序 Time Series

 

使用数据挖掘解决问题

 

定义商务智能

支持平台

多维分析(比如OLAP

数据挖掘

预测

业务分析

查询、报告和图表

知识管理

企业门户

数字仪表板(Digital Dashboard

数据仓库

•……

 

数据挖掘的基本概念

Cube

没有个数限制(仅仅受可创建对象上限限

制)

使用XML进行存储

维(Dimensions

度量(Measures

属性(Attributes

层次(Hierarchies

 

BI基本业务需求的逻辑

计算— 可扩展的度量标准;

分组— 多角度;多层次;定制灵活…

比较— 多选择的可比系列;

排序— 多样化的排序规则;

筛选— 单值筛选、复合条件筛选;

综合运用