博文
SQL Server开发人员应聘常被问的问题汇总(2007-09-18 12:30:00)
摘要:
摘要
IT人
下面这些问题是我觉得能够真正有助于淘汰不合格应聘者的问题。它们按照从易到难的顺序排列。当您问到关于主键和外键的问题时,后面的问题都十分有难度,因为答案可能会更难解释和说明,尤其是在面试的情形下。
目前在职场中很难找到非常合格的数据库开发人员。我的一个同事曾经说过:“SQL开发是一门语言,它很容易学,但是很难掌握。”
在面试应聘的SQL Server数据库开发人员时,我运用了一套标准的基准技术问题。下面这些问题是我觉得能够真正有助于淘汰不合格应聘者的问题。它们按照从易到难的顺序排列。当您问到关于主键和外键的问题时,后面的问题都十分有难度,因为答案可能会更难解释和说明,尤其是在面试的情形下。
您能向我简要叙述一下SQL Server 2000中使用的一些数据库对象吗?
您希望听到的答案包括这样一些对象:表格、视图、用户定义的函数,以及存储过程;如果他们还能够提到像触发器这样的对象就更好了。如果应聘者不能回答这个基本的问题,那么这不是一个好兆头。
什么是索引?SQL Server 2000里有什么类型的索引?
任何有经验的数据库开发人员都应该能够很轻易地回答这个问题。一些经验不太多的开发人员能够回答这个问题,但是有些地方会说不清楚。
简单地说,索引是一个数据结构,用来快速访问数据库表格或者视图里的数据。在SQL Server里,它们有两种形式:聚集索引和非聚集索引。聚集索引在索引的叶级保存数据。这意味着不论聚集索引里有表格的哪个(或哪些)字段,这些字段都会按顺序被保存在表格。由于存在这种排序,所以每个表格只会有一个聚集索引。非聚集索引在索引的叶级有一个行标识符。这个行标识符是一个指向磁盘上数据的指针。它允许每个表格有多个非聚集索引。
NULL是什么意思?
NULL(空)这个值是数据库世界里一个非常难缠的东西,所以有不少应聘者会在这个问题上跌跟头您也不要觉得意外。
NULL这个值表示UNKNOWN(未知):它不表示“”(空字符串)。假设您的SQL Server数据库里有ANSI_NULLS,当然在默认情况下会有,对NULL这个值的任何比较都会生产一个NULL值。您不能把任何值与一个 UNKNOWN值进行比较,并在逻辑上希望获得一个答案。您必须使用IS NULL操作符。
......
Linux 下ACE的构建[转](2007-09-18 12:02:00)
摘要:Linux 下ACE的构建
1. 设置环境变量ACE_ROOT,命令如下:
“vi /etc/profile” ,在“export PATH USER….”后加入4行
ACE_ROOT=/opt/ACE
export ACE_ROOT
LD_LIBRARY_PATH=$ACE_ROOT/aceLD_LIBRARY_PATH
export LD_LIBRARY_PATH
完 成后将/etc/profile执行一次,命令:“chmod 555 /etc/profile”,“/etc/profile”。这样我们的ACE_ROOT就设置好了,可以用如下命令查看ACE_ROOT是否设置好了: “echo $ACE_ROOT” ,这个时候最好reboot启动一次linux。
2. 解压ACE.tar.gz包:
不 要自己手工将ACE.tar.gz包完全解开,特别强调不要完全解开,后面可以看到安装脚本会给我们解开它的;如果你手工解开全部,安装脚本将会将你的解 压缩目录删除的!我们要做的事就只是将ACE.tar.gz包中的ACE-install.sh安装脚本单独解出来,并对其修改。我们只要这一个文件就可 以。用mkdir建目录,如/home/my/ACE,然后将你的ACE.tar.gz放在此目录下(用cp命令拷贝或mv命令移动到此目录)。注意这个 目录将是你的一个存放ACE.tar.gz的目录,安装脚本会来这个目录找这个文件的,这个目录和ACE_ROOT是不一样的,且ACE- install.sh也提示不要将这两个目录设置成同一个目录。ACE_ROOT将是我们的安装目标目录。
3. 从ACE.tar.gz解压出单个文件ACE-install.sh,命令如下:
“tar –zxvf ACE+TAO+CIAO.tar.gz ACE_wrappers/ACE-install.sh”
解 好后,会出来一个新的子目录“ACE_wrappers”。此时可以先将ACE-install.sh移到外面的目录来:“mv /ACE_wrappers/ACE-install.sh .” “.”代表当前目录。当然ACE-install.sh在什么路径下是没什么影......
ACE的构建(VC++6.0环境)[转](2007-09-18 11:58:00)
摘要:ACE的构建(VC++6.0环境)
Windows下ACE的构建
1. 将ACE-5.5.zip解压到所需的安装目录,此处以E:\为例,解压后形成ACE_wrappers文件夹,因此ACE将会存在于ACE_wrappers\ace目录中。ACE_ROOT=E:\ACE_wrappers。
2. 在系统中新建ACE_ROOT环境变量,值设为 E:\ACE_wrappers。具体设置为:我的电脑->属性->高级->环境变量->新建
3. 在E:\ACE_wrappers\ace目录中创建一个头文件,命名为config.h,其内容为:
#include "ace/config-win32.h"(必选项)
#define ACE_HAS_STANDARD_CPP_LIBRARY 1 (MSVC自带的标准C++头文件)
#define ACE_HAS_MFC 1(与MFC一起使用)
#define ACE_NO_INLINE(取消函数内联从而减小静态库和运行码的大小)
#define ACE_AS_STATIC_LIBS(构建ACE的静态版本)
#define ACE_HAS_WINNT4 0(在Windows 9x/me上构建所需,在ACE中移掉一些WinNT/Win2K中特有的代码)
以上只需要添加前两项就可以了。
4. 在VC++中加载ACE的工程文件(ACE_ROOT \ace\ace.dsw),在release和debug两种编译方式下进行编译,得到相应的库文件(ACE.dll、ACE.lib 和 ACEd.dll、ACEd.lib),其中ACE.dll 、ACE.lib是由release版生成的,ACEd.dll、ACEd.lib是由debug版生成的。具体操作方法:运行VC++,选择Build ->Batch Build…,将ACE-Win32 Debug和ACE-Win32 Release全部选中,Rebuild All即可。如下图所示:
按照上面的方法可能只编译出ACE.dll 、ACE.lib库文件,具体原因还不详。按照下面的操作方法进行编译可以成功生成全部库文件。具体操作方法:Build->Set Active Configurati......
消息分流器、子控件宏、API宏(2007-09-08 19:36:00)
摘要:在本书中,通过使用带消息分流器C/C++编写示例代码,下面向大家介绍这种不大为大家所知但很有用的宏。
消息分流器定义在VC++中提供的WindowsX.h文件里/通常在Windows.h文件之后紧接着包含这个文件。WindowsX.h文件就是一组#define指令,建立了一组供我们使用的宏。WindowsX.h的宏实际上分为三组:消息分流器、子控件宏和API宏。这些宏以下述的方式为我们提供帮助:
1、利用这些宏可以减少程序中要做的转换(casting)的数量,并可使所要求的转换上无错误的。使用C/C++的Windows编程中一个大的问题是所要求的转换数量。你很难看到一个不要求某种转换的Windows函数调用。但应该尽量避免使用转换,因为转换阻碍编译器发现代码中的潜在错误。一个转换是在告诉编译程序:“我知道我在这里传递了错误的转换,但就要这么做。我知道我在干什么。”当你做了许多转换时,就很容易出错。编译程序应该尽可能对此提供帮助。
2、使代码的可读性更好
3、可简化16位Windows、32位Windows和64位Windows之间的代码移植工作
4、易于理解(只是一些宏)
5、这些宏容易结合到已有的代码中。可以不管老的代码而立即在新的代码中使用这些宏。不必修改整个程序
6、在C/C++代码中都可以使用这些宏,尽管当使用C++类时他们不是必需的
7、如果需要某一个特性,而这些宏不直接支持这个特性,可以根据这个头文件中的宏,很容易地编写自己的宏
8、不需要参照或记住费解的Windows构造。例如,许多Windows中的函数,要求一个long型参数,其中这个长参数的高字(high-word)的值代表一个东西,而低字(long-wrod)又代表另一个东西。在调用这个函数之前,你必须用两个单独的值构造一个long 型值。通常利用Windef.h中MAKELONG宏来完成。我简直记不清有多少次把两个值的次序弄反了,造成对函数传递了一个错误的值。而WindowsX.h中的宏可以帮助我们。
消息分流器
消息分流器(message cracker)使窗口过程的编写更加容易。通常,窗口过程是用一个大的switch语句实现的。在我的经验中,我见过有的窗口过程的switch语句包含了5百多行的代码。我们都知道......
内存漏洞检查方法(2007-09-08 19:15:00)
摘要:具体地讲检查内存漏洞需要以下几个步骤:
在你所检测的程序段的开始处建立一个CmemoryState对象,调用其成员函数Checkpoint,以取得当前内存使用情况的快照;
在你所检测的程序段的末尾处再建立一个CmemoryState 对象,调用其成员函数Checkpoint ,以取得当前内存使用情况的快照;
再建立第三个CmemoryState 对象,调用其成员函数Difference,把第一个CmemoryState对象和第二个CmemeoryState对象作为其参数.,如果两次内存快照不相同,则该函数返回非零,说明此程序 段中有内存漏洞。下面我们来看一个典型的例子:
// Declare the variables needed
#ifdef _DEBUG
CMemoryState oldMemState, newMemState, diffMemState;
OldMemState.Checkpoint();
#endif
// do your memory allocations and deallocations...
CString s = "This is a frame variable";
// the next object is a heap object
CPerson* p = new CPerson( "Smith", "Alan", "581_0215" );
#ifdef _DEBUG
newMemState.Checkpoint();
if( diffMemState.Difference( oldMemState, newMemState ) )
{
TRACE( "Memory leaked!\n" );
}
#endif
......
C++--MFC的SDI程序的用户命令的处理顺序[转] (2007-09-04 20:29:00)
摘要:C++--MFC的SDI程序的用户命令的处理顺序
1.用户命令处理顺序图
2.OnCmdMsg的代码
BOOL CFrameWnd::OnCmdMsg(...)
{
CView* pView = GetActiveView();
if(pView != NULL && pView->OnCmdMsg(...))
return TRUE;
if (CWnd::OnCmdMsg(...))
return TRUE;
CWinApp* pApp = AfxGetApp();
if(pApp != NULL && pApp->OnCmdMsg(...))
return TRUE;
return FALSE; // call ::DefWindowProc
}
2.用户命令默认处理的对象:
Application:
File-New
File-Open
File-Exit
Document:
File-Save
File-Save As
CFrameWnd
tool bars
status
resize
注意:只有用户命令消息和U......
Windows多线程多任务设计初步[转](2007-08-27 19:12:00)
摘要:[前言:]当前流行的Windows操作系统,它能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力。用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义。现在的应用软件无一不是多线程多任务处理,单线城的软件是不可想象的。因此掌握多线程多任务设计方法对每个程序员都是必需要掌握的。本文针对多线程技术在应用中经常遇到的问题,如线程间的通信、同步等,对它们分别进行探讨。
一、 理解线程
要讲解线程,不得不说一下进程,进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它系统资源组成。进程在运行时创建的资源随着进程的终止而死亡。线程的基本思想很简单,它是一个独立的执行流,是进程内部的一个独立的执行单元,相当于一个子程序,它对应Visual C++中的CwinThread类的对象。单独一个执行程序运行时,缺省的运行包含的一个主线程,主线程以函数地址的形式,如main或WinMain函数,提供程序的启动点,当主线程终止时,进程也随之终止,但根据需要,应用程序又可以分解成许多独立执行的线程,每个线程并行的运行在同一进程中。
一个进程中的所有线程都在该进程的虚拟地址空间中,使用该进程的全局变量和系统资源。操作系统给每个线程分配不同的CPU时间片,在某一个时刻,CPU只执行一个时间片内的线程,多个时间片中的相应线程在CPU内轮流执行,由于每个时间片时间很短,所以对用户来说,仿佛各个线程在计算机中是并行处理的。操作系统是根据线程的优先级来安排CPU的时间,优先级高的线程优先运行,优先级低的线程则继续等待。
线程被分为两种:用户界面线程和工作线程(又称为后台线程)。用户界面线程通常用来处理用户的输入并响应各种事件和消息,其实,应用程序的主执行线程CWinAPP对象就是一个用户界面线程,当应用程序启动时自动创建和启动,同样它的终止也意味着该程序的结束,进城终止。工作者线程用来执行程序的后台处理任务,比如计算、调度、对串口的读写操作等,它和用户界面线程的区别是它不用从CwinThread类派生来创建,对它来说最重要的是如何实现工作线程任务的运行控制函数。工作线程和用户界面线程启动时要调用同一个函数的不同版本;......
.NET3.0:Windows表现层基础类库WPF揭密{转}(2007-08-23 11:01:00)
摘要:一 WPF会带来什么?
Windows表现层基础类库(WPF) ,曾以Avalon为代号,是.Net 框架3.0(曾使用代号WinFX)的图形子系统,与XAML密切相关。在微软下一代WINDOWS操作系统 VISTA 中会预装WPF。WPF也可安装在Windows XP SP2 和 Windows Server 2003操作系统。WPF为构建应用系统提供了一致的编程模型,对用户界面和商业逻辑给予清晰地划分。基于WPF的应用程序可以部署在本地系统或者浏览器平台。WPF为windows应用程序的视觉效果提供了更丰富的控制、设计和开发等方面支持。WPF整合了一系列的应用服务:用户界面、二维和三维绘图、固定和适应性文档、矢量图形、光栅图形、动画、数据绑定、音频和视频。
WPF/E是WPF的子集,代表“Windows表现层基础类库无处不在的意思”。WPF/E基于XAML和Javascript技术,构成了WPF移动版本的核心。WPF/E不提供3D特性,但是包括了XPS(XML文档规范)、矢量绘图和硬件加速等功能。
二 WPF的主要特性
以下是WPF的主要特性:
图形服务
所有的图形(包括桌面的窗口等对象)都将通过Direct3D渲染,旨在提供统一的图形显示通道,以实现高级的图形表现效果。
凭借Direct3D渲染图形的好处是,操作系统可以将图形处理任务委托给计算机显示卡上的图形处理芯片,以减轻CPU的负担。
WPF支持任意比例无损缩放的矢量化图形,支持在2D应用程序中进行3D模型的渲染和交互操作。
WPF除了构建传统的独立运行桌面应用程序,也支持基于XAML技术的浏览器应用(XBAP)。两种类型应用的编程模型很相似。桌面应用程序是可信度最高,采用ClickOnce或MSI等软件安装在本地计算机的应用程序,对计算机资源拥有完全的访问权限。为了保护计算机免受恶意软件的攻击,XBAP应用只能在一块由系统专门划分的部分信任沙箱内运行,不能访问计算机的全部资源,也不能使用WPF的全部功能。 用户从网页内XBAP类型应用没有安全或安装方面的提示),反之亦然。XBAP应......
Win32常用的 类型和宏(2007-07-15 10:58:00)
摘要:Win32常用的 类型和宏
COLORREF
1、结构定义
一个COLORREF 型颜色值是定义了一种颜色的长整数。要求一个颜色参数的GDI函数(比如CreatePen和FloodFill)接受COLORREF值作为参数。
2、结构说明
根据应用程序对COLORREF类型值的不同使用方式,该类型值具有三种不同的形式。它可以定义为下列三种方式之一:
(1)直接定义RGB值
其中低位字节包含了定义红色的相对强度值:第二个字节包含了定义绿色的相对强度值,第三个字节包含了定义蓝色的值,高字节必须为零,单字节的最大值的最大值为FF(十六进制)。下表说明了某些颜色的十六进制值:
----0x000000FF 纯红色
----0x0000FF00 纯绿色
----0x00FF0000 纯蓝色
----0x00000000 黑 色
----0x00FFFFFF 白 色
----0x00808080 淡灰色
RGB宏指令接受红、绿、蓝三种颜色的值,返回一个显示的RGB_COLORREF值。
(2)调色板索引
当指定逻辑调色板的索引时,COLORREF值有如下的16进制形式:0x0100iiii
低位上的两个字节组成了一个16位的整数,它定义了一个逻辑调色板的索引。第三个字节不用,并且必须设置为0,第四个字节(即高位上的字节)必须设置为1。
例如,16进制值0x10000定义了一个索引为0的调色板所代表的颜色;0x010000C定义了一个索引为12的元素所代表的颜色,以此类推。
PALETTEINDEX宏指令接收一个表示逻辑调色板的整数,并返回一个定义为调色板索引的COL......
Visual Studio 2003/Visual Studio 2005常用快(2007-06-29 10:33:00)
摘要:Visual Studio 2003/Visual Studio 2005常用快捷键
调试快捷键
F6: 生成解决方案
Ctrl+F6: 生成当前项目
F7: 查看代码
Shift+F7: 查看窗体设计器
F5: 启动调试
Ctrl+F5: 开始执行(不调试)
Shift+F5: 停止调试
Ctrl+Shift+F5: 重启调试
F9: 切换断点
Ctrl+F9: 启用/停止断点
Ctrl+Shift+F9: 删除全部断点
F10: 逐过程
Ctrl+F10: 运行到光标处
F11: 逐语句
编辑快捷键
Shift+Alt+Enter: 切换全屏编辑
Ctrl+B,T / Ctrl+K,K: 切换书签开关
Ctrl+B,N / Ctrl+K,N: 移动到下一书签
Ctrl+B,P: 移动到上一书签
Ctrl+B,C: 清除全部标签
Ctrl+I: 渐进式搜索
Ctrl+Shift+I: 反向渐进式搜索
Ctrl+F: 查找
Ctrl+Shift+F: 在文件中查找
F3: 查找下一个
Shift+F3: 查找上一个
Ctrl+H: 替换
Ctrl+Shift+H: 在文件中替换
Alt+F12: 查找符号(列出所有查找结果)
Ctrl+Shift+V: 剪贴板循环
Ctrl+左右箭头键: 一次可以移动一个单词
Ctrl+上下箭头键: 滚动代码屏幕,但不移动光标位置。
Ctrl+Shift+L: 删除当前行
Ctrl+M,M: 隐藏或展开当前嵌套的折叠状态
Ctrl+M,L: 将所有过程设置为相同的隐藏或展开状态
Ctrl+M,P: 停止大纲显示
Ctrl+E,S: 查看空白
Ctrl+E,W: 自动换行
Ctrl+G: 转到指定行
Shift+Alt+箭头键: 选择矩形文本
Alt+鼠标左按钮: 选择矩形文本
Ctrl+Shift+U: 全部变为大写
Ctrl+U: 全部变为小写
代码快捷键
Ctrl+J / Ctrl+K,L: 列出成员
Ctrl+Shift+空格键 / Ctrl+K,P: 参数信息
Ctrl+K......