Read this book:
Think Like a Manager: Everything They Didn't Tell You When They Promoted You (Paperback)
by Roger Fritz
Read this book:
Think Like a Manager: Everything They Didn't Tell You When They Promoted You (Paperback)
by Roger Fritz
我确实没有见过哪一种语言能像C++这样,在代码风格方面表现得如此诡谲和难以捉摸:谁也说不清C++代码究竟能衍生出多少种迥异的风格,但我知道,有许多C++初学者在面对不同风格的C++代码时,经常会误以为自己看到的是好几种完全不同的编程语言??仅此一点就足以提醒我们,研究和廓清C++语言风格的演化和发展规律已是当务之急了。
C++语言风格流变史:
详见:http://vcer.net/1181705404640.html
1. 带类的C――对C语言风格的因袭
2. I/O流――C++的新形象
3. OWL和MFC――窗口环境下的风格变异
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 Runtime和STL为主要工具,使用类和模版,不跨平台毋宁死。
5. Functional流:以模版和STL为主要武器,大量使用函数式语言的设计方法,并号称这才是真正的C++。
6. Win32流:多使用全局函数,偏爱Win32 API,但不排斥C Runtime,通常喜欢轻量级的程序,所以身材也比较苗条。
7. Java流:全面使用Java的风格,不能容许任何全局成员,但允许使用STL的集合类,写很多叫Factory的类。
8. COM流:喜欢AddRef()和Release(),大量使用接口,隐藏一切可以隐藏的东西,诵经的时候要把上帝替换成COM。
9. 戒律流:追求完美的C++程序,计较每一个const和throw(),极力避免不安全的cast,随身一定要带一本ISO C++手册。
10. 混沌流:其程序无常形,无恒道,变幻莫测,吾不知其名。
C++杂思录——风格的选择
公司一同事离职时撰文一篇,太有才了:
锦涛三年,余辞同济以游。其时,群雄外包,海内未平,或曰:汉略者,位处东海,其势壮焉,其薪高焉,不若往而投之,大业可图。余善其言,乃以孤穷身入汉略事之,历今两载有余,其间大小近十项目,或盛或衰,或荣或哀,皆犹在目,不足与外人道矣。今既辞归。乃做文志之。
GetMessage
::PeekMessage
SendMessage
PostMessage
PumpMessage
::TranslateMessage
::DispatchMessage
Pretranslatemessage
消息泵(CWinThread::PumpMessage)
消息循环,(::GetMessage,::PeekMessage),
消息映射
消息路由
消息队列:消息分为队列消息(进入线程的消息队列)和非队列消息(不进入线程的消息队列)。
#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;
}
#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;
}
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
下午参加了部门内Team Lead的管理方面的培训,大家讨论了下理想团队的条件,列举如下:
・ 有共同目标
・ 计划
・ 执行力
・ 良好的制度
・ Open,积极的氛围
・ 公平的激励机制
・ 凝聚力
・ 信任
・ 分工明确
・ 好的领导
・ 畅通的沟通平台
・ 允许多样化
触摸技术
Microsoft Surface:http://www.microsoft.com/surface/
Autodesk touch wall: http://www.youtube.com/watch?v=ArlmuNJ2NBc
内文广告
Contera: http://www.kontera.com/default.aspx
Clickeye: http://www.clickeye.cn/
Web App
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. 个性化
超简洁图片版中德文化比较:
http://msn.bbs.ynet.com/viewthread.php?tid=459060
真的非常形象 :) 毕业后进公司一直跟德国的team一起开发,跟德国人已经打了两年多的交道了,虽然多半是通过mail,AIM,telephone等形式的,但是映像还是非常强烈的。
Engineering Excellence Traning
People, process, Tools
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调试器的设置!与Windbg或VS.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。
Compiler在compile的过程中将每一个函数需要的stack空间算好了,这些信息就存在exe文件中。然后在运行时再分配空间。
对于if else这样的分支,现代编译器都会将这样的block当成一个函数,然后在Active stack中为其分配statck空间。
Stack空间是提前分配好了的,即stack是静态存储空间,在运行时已不可改变。
内存分配的两个原则: 谁new谁释放。构造函数中分配,析构函数中释放。
我们写程序的时候到比较简单,请大家遵守几个原则:
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()...... 当用户改变文件选择的时候,执行回调函数 嗨!哥们,这是我的电话,有事就言语一声。
Overhead task:
Product Support
RRT Support
Trainings
Support for consulting
Other overhead
_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.
・ 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)
| |
| |
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中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢?
相信学习C++的人对class这个关键字都非常明白,class用于定义类,在模板引入c++后,最初定义模板的方法为: template<class T>......
在
这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了typename这个关键字,它的作用同
class一样表明后面的符号为一个类型,这样在定义模板的时候就可以使用下面的方式了: template<typename
T>......
在模板定义语法中关键字class与typename的作用完全一样。
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
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 NextPossible 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);现在的软件产品都强调"整合",像微软的各种产品都尽量整合在一起,其开发类产品比如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各种产品基本都通过其核心的搜索技术整合起来的。
使用数据挖掘解决问题:
• 消费者将购买什么产品?哪些产品会一起
销售?
• 标识将流失的消费者
• 市场状况如何,将会如何发展?
• 分析网站
• 确定营销活动是否成功
• 劣质数据
• 文本分析
常见数据挖掘算法:
• 贝叶斯Naïve Bayers
• 决策树Decision Trees
• 神经网络Neural Networks
• 关联规则Association Rules
• 聚类分析 Clustering
• 时序聚类分析 Sequence Clustering
• 时序 Time Series
使用数据挖掘解决问题
定义商务智能
支持平台
• 多维分析(比如OLAP)
• 数据挖掘
• 预测
• 业务分析
• 查询、报告和图表
• 知识管理
• 企业门户
• 数字仪表板(Digital Dashboard)
• 数据仓库
•……
数据挖掘的基本概念
Cube
• 没有个数限制(仅仅受可创建对象上限限
制)
• 使用XML进行存储
• 维(Dimensions)
• 度量(Measures)
• 属性(Attributes)
• 层次(Hierarchies)
BI基本业务需求的逻辑
• 计算— 可扩展的度量标准;
• 分组— 多角度;多层次;定制灵活…
• 比较— 多选择的可比系列;
• 排序— 多样化的排序规则;
• 筛选— 单值筛选、复合条件筛选;
• 综合运用
· ConfigurationcPramework
· Plug-IncFramework
· CachecFramework
· BusinesscLogiccFramework
· FactorycFramework
· DaracConnectioncFramework
· SettingscFramework
· SerialcFramework
· SecuritycFramework
· ProfilecFramework
· Context Framework
我所关注的:
行业,业务,市场:PDM\PLM,ERP,BI,Search。
经济,财经,股市,基金。
专家的blog,他们是如何观察,思考,表达的。
Job:关注职场需求。
人物: IT,CEO,...