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基本业务需求的逻辑
• 计算— 可扩展的度量标准;
• 分组— 多角度;多层次;定制灵活…
• 比较— 多选择的可比系列;
• 排序— 多样化的排序规则;
• 筛选— 单值筛选、复合条件筛选;
• 综合运用
Friday, June 29, 2007
常见Framework架构风格
· ConfigurationcPramework
· Plug-IncFramework
· CachecFramework
· BusinesscLogiccFramework
· FactorycFramework
· DaracConnectioncFramework
· SettingscFramework
· SerialcFramework
· SecuritycFramework
· ProfilecFramework
· Context Framework
Tuesday, June 26, 2007
Friday, June 22, 2007
Thursday, June 21, 2007
const
pointer
T const * p ó const T * p;
T * const p;
T const * const p ó const T * const p;
Character array literal.
Char* p = "kaven";
P[1] = 'A'; //no compile time error! But will got runtime error!!
Const char* cp = "kaven";
Cp[1] = 'A'; //compile error!!
Char ap[] = "kaven";
Ap[1] = 'A'; //ok!
・ Character array literals "kaven" is created by the compiler as a constant character array .
・ So suggest that use const char* if you don't want it to be changed.
・ If you want to be able to modify the string ,put it in array: char ap[];
Assignment and type cheching
Int d = 1;
Const int e = 2;
Int* pd = &d; //ok!
Int* pe = &e; //error! Can not assign the address of a const object to a non-const pointer.
//because you are saying you might change the object via the pointer.
Int const *cp = &e; //ok now.
Int * const cp = &e; //error too.
Int* pe = (int*)&e; //illegal but bad practice.
・ You can assign the address of a non-const object to a const pointer.
・ But you can't assign the address of a const object to a non-const pointer!
Function
Const T func( const T& a) const;
让函数返回一个常量值经常可以在不降低安全性和效率的情况下减少用户出错的几率,防止对返回值进行赋值或修改.
const T& a) const;
const成员函数的目的当然是为了指明哪个成员函数可以在const对象上被调用。
个成员函数为const的确切含义是什么?
bitwise constness的坚持者认为,当且仅当成员函数不修改对象的任何数据成员(静态数据成员除外)时,即不修改对象中任何一个比特(bit)时,这个成员函数才是const的。
尽量用"传引用"而不用"传值"
消除一些对拷贝构造函数的调用
避免了所谓的"切割问题(slicing problem)"。
引用几乎都是通过指针来实现的,所以通过引用传递对象实际上是传递指针。因此,如果是一个很小的对象――例如int――传值实际上会比传引用更高效。
C++ ADO Database
2 ADO对象模型组成
与微软的其它数据访问模型DAO和RDO相比,ADO对象模型非常精炼,仅由三个主要对象Connection、Command、Recordset和几个辅助对象组成,其相互关系如图所示。Connection对象提供OLE DB数据源和对话对象之间的关联,它通过用户名称和口令来处理用户身份的鉴别,并提供事务处理的支持;它还提供执行方法,从而简化数据源的连接和数据检索的进程。Command对象封装了数据源可以解释的命令,该命令可以是SQL命令、存储过程或底层数据源可以理解的任何内容。Record set用于表示从数据源中返回的表格数据,它封装了记录集合的导航、记录更新、记录删除和新记录的添加等方法,还提供了批量更新记录的能力。其它辅助对象则分别提供封装ADO错误、封装命令参数和封装记录集合的列。
3 VC 调用ADO基本方法
1、 用import导入ADO 的 COM 文件msado15.dll
例如:
#import "C:\Program Files\Common Files\System\ADO\msado15.dll"\no_namespace |
2、COM 使用时初始化
HRESULT ComInit() |
3、建立数据库连接
HRESULT ConnectToDB( LPSTR pUserId , // 用户名 |
关闭一个库连接 如果连接状态有效,则用Close方法关闭它并赋于它空值。代码如下所示:
if(m_pConnection->State) |
4.执行一个SQL 查询,得到数据集(recordset)
_RecordsetPtr GetRecordSet(LPSTR strSql, _ConnectionPtr ptrConn) |
5.通过数据集(recordset)得到列的名称
HRESULT GetColumnNames( |
6.通过数据集(recordset)得到当前行记录
HRESULT getOneRecord( |
7.出错情况下错误信息的取得
void ErrorFunc(_com_error &pComError, _ConnectionPtr ptrConn); |
插入记录 可以先用AddNew()方法新增一个空记录,再用PutCollect(字段名,值)输入每个字段的值,最后再Update()更新到库中数据既可。其中变量m_Name和m_Age分别为姓名及年龄编辑框的成员变量名。代码所下所示:
try |
移动记录指针 移动记录指针可以通过MoveFirst()方法移动到第一条记录、MoveLast()方法移动到最后一条记录、MovePrevious()方法移动到当前记录的前一条记录、MoveNext()方法移动到当前记录的下一条记录。但我们有时经常需要随意移动记录指针到任意记录位置时,可以使用Move(记录号)方法来实现,注意: Move()方法是相对于当前记录来移动指针位置的,正值向后移动、负值向前移动,如:Move(3),当前记录是3时,它将从记录3开始往后再移动3条记录位置。代码如下所示:
try |
改记录中字段值 可以将记录指针移动到要修改记录的位置处,直接用PutCollect(字段名,值)将新值写入并Update()更新数据库既可。可以用上面方法移动记录指针,修改字段值代码如下所示:
try |
删除记录 删除记录和上面修改记录的操作类似,先将记录指针移动到要修改记录的位置,直接用Delete()方法删除它并用Update()来更新数据库既可。代码如下所示:
try |
关闭记录集 直接用Close方法关闭记录集并赋于其空值。代码如下所示:
m_pRecordset->Close(); |
3. CommandPtr智能指针,可以使用_ConnectionPtr或_RecordsetPtr来执行任务,定义输出参数,执行存储过程或SQL语句。
执行SQL语句 先创建一个_CommandPtr实例指针,再将库连接和SQL语句做为参数,执行Execute()方法既可。代码如下所示:
_CommandPtr m_pCommand; |
执行存储过程 执行存储过程的操作和上面执行SQL语句类似,不同点仅是CommandText参数中不再是SQL语句,而是存储过程的名字,如Demo。另一个不同点就是在Execute()中参数由adCmdText(执行SQL语句),改为adCmdStoredProc来执行存储过程。如果存储过程中存在输入、输出参数的话,需要使用到另一个智能指针_ParameterPtr来逐次设置要输入、输出的参数信息,并将其赋于_CommandPtr中Parameters参数来传递信息,有兴趣的读者可以自行查找相关书籍或MSDN。执行存储过程的代码如下所示:
_CommandPtr m_pCommand; |
Tuesday, June 19, 2007
湖北人没什么可牛的
今天端午节 , 转文赏一下
湖北人没什么可牛B的,只是出了2个国家主席而已.
湖北人没什么可牛B的,只是共和国十大元帅中有3个而已。
湖北人没什么可牛B的,只是很能吃吃香喝辣而已。
湖北人没什么可牛B的,只是N次火车的终点站而已。
湖北人没什么可牛B的,只是省会在武汉3个城市组成而已。
湖北人没什么可牛B的,只是有时候会被人说9头鸟而已。
湖北人没什么可牛B的,只是古代4大美女王昭君故乡而已
湖北人没什么可牛B的,只是长江三峡世界闻名而已
湖北人没什么可牛B的,只是光谷新区让中央和建设部的那帮人吓得乱开会而已。
湖北人没什么可牛B的,只是武汉大学和华中科技进了前十而已。
湖北人没什么可牛B的,只是悉尼奥运会上拿了中国金牌总数的四分之三而已。
湖北人没什么可牛B的,只是一个湖北人在跳了河,全国人为他过节而已!
------预祝端午愉快......
Thursday, June 14, 2007
How to install and debug windows NT Services.
Support you have a Windows NT Service named YourServices.exe
How to install Windows NT Services?
C++: yourService.exe �I [Parameter]
.Net: InstallUtil yourService.exe
Notice: when the Windows services is installed, it will registry here:
HHEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
How to uninstall Windows NT Services?
C++: yourService.exe �u
.Net: InstallUtil /u yourService.exe
How to start Windows NT Services?
Net start "Your Service"
Notice:
.Net: "Your Service"是ProjectInstaller类里 System.ServiceProcess.ServiceInstaller.ServiceName的值,它是你在Service管理器里可以看到的Service名称。
C++:
How to Debug Windows NT Services?
大致步骤:
1. 建立windows服务程序,不管你是用win32 API,还是ATL,还是.NET,都可以实现的。
2.将代码写好,编译,保证没有错误。
3.现在到了调试的过程了,首先,在IDE中,找到你要调试的地方,加上断点,然后安装好服务。
服务的安装,其实就是设计到注册表的操作。在.NET平台下,我一般习惯用installutil这个程序来安装服务。安装好之后,我们打开控制面板的"Administrator Tools",找到"Services"选项,双击打开。在服务列表中,我们能找到我们安装的服务。然后运行这个服务。
4.现在到了关键的地方,在服务开始的时候,就会执行你的代码。为了调试的方便,在服务的代码开始处(i.e: CMyService::OnInit()) 让程序先Sleep20秒,这样的好处看后面你就知道了。
5.切换回我们的IDE,在Debug菜单,里面有个Process(进程)选项。点击打开,在对话框的进程列表中,选择我们的服务相对应的进程,然后点击旁边的Attach(附加)按钮。这样,IDE就开始加载我们要调试的进程了。加载完毕之后,程序会停顿一下。(为什么?因为我们在服务的开始代码处,Sleep了20秒,喝口水等一下吧)。之后,黄色的光标,跳动到你的断点处,现在就可以像以往一样,来调试这个windows服务了。
之所以在程序开始的地方Sleep20秒,是为我们在IDE附加这个Service进程的时候,留下一段缓冲的时间,不然当你的服务开始运行的时候,你的断点处的代码早就被执行过了,你断点自然不起作用了。明白了吧?呵呵。
还有一些调试windows服务小的窍门,就是写日志文件。这也是调试windows service的一个比较好的方法,虽然比较笨,但是通过阅读你自己留下的日志,也能起到不小的作用的。所以在编写程序的时候,要在关键的地方,记录日志,也是为以后程序的维护提供方便。
总结如下:
1. 可以用Attach Process的方式调试windows service程序。
2. 对于初始化部分的代码(如Init()),应为在Attach process前就已经执行了,所以可以用延时的方法Sleep()调试。
3. 如果想debug安装部分的代码,可以在Property /Debuging/Command Argument 里输入i ,再将windows services 工程设置为启动工程即可。
4. 最后就是写log的方法调试。