博文
Web日志转成.mdb格式的Access数据文件(2009-02-27 11:11:00)
摘要: 对于做Web数据挖掘的人来说,日志分析是一个比较重要的部分。根据一个网站或者服务器的日志文件,可以分析出一些很有用的信息,供网站开发人员或者服务器管理人员进行工作的进一步改进与管理。比如可以通过网站的访问日志分析得出该网站的哪部分是用户比较喜欢的,哪部分是用户很少访问的,一般用户访问了某一部分内容后,接着希望访问一些什么内容等等。这些都可以通过Web日志分析来得到。
对于日志分析来说,数据的前端处理非常重要,一般来说,我们拿到的日志文件是如下图所示,加入命名为Weblog.log。每一行代表一条记录。第一步要做的就是去除其中无用的信息,然后将其转换成数据库形式,这里,我主要介绍如何将文本形式的日志文件转成Access的.mdb数据文件以及sql的.mdf数据文件。并且介绍一下关于SQL 2005的一个问题。
一 SQL 2000和SQL 2005介绍
在SQL2000中,有一个DTS(数据转换工具),该工具可以实现各种数据文件之间的转换。但是该工具在SQL2005中就没有单独的放出来,而是被包含在了其他的工具里面了。
Web日志文件虽然是文本文件,但是它的后缀是.log,如果想将其导入数据库必须首先将其后缀改称.txt。然后打运行SQL Server2000的服务管理器,然后打开企业管理器。
一般安装的时候都是选择服务器是Local形式的,所以非Local形式的企业管理器是不能连接到Local服务器的。解决方法:新建一个SQL Server组,然后对该新建的组进行“新建SQL Server注册”,服务器选择Local服务器就可以了。如果你新建的SQL Server组能够正常运行了,这进行下一步。建立新的数据库Weblog,然后利用工具DTS进行操作,DTS即数据转换服务。操作为“工具—〉数据转换服务—〉导入数据”,出现如下对话框如图2所示。
图2
点击下一步得到如图3所示的对话框。
图3
在图3对话框中的数据源选择文本文件,对话框变成图4所示界面。点击文件名处右边的浏览按钮可以选择所要读取的文本文件形式的日志。这里只能读取.txt文件,所以前面一定要将Web日志的后缀.log改成后缀.txt。
图4
单击下一步进入图5所示界面
图5
这里,我们要注意,如果不正确的选择“行分......
傅立叶变换的物理意义(转)(2009-02-02 11:10:00)
摘要:
傅立叶变换的物理意义(转)
1、为什么要进行傅里叶变换,其物理意义是什么?
傅立叶变换是数字信号处理领域一种很重要的算法。要知道傅立叶变换算法的意义,首先要了解傅立叶原理的意义。傅立叶原理表明:任何连续测量的时序或信号,都可以表示为不同频率的正弦波信号的无限叠加。而根据该原理创立的傅立叶变换算法利用直接测量到的原始信号,以累加方式来计算该信号中不同正弦波信号的频率、振幅和相位。
和傅立叶变换算法对应的是反傅立叶变换算法。该反变换从本质上说也是一种累加处理,这样就可以将单独改变的正弦波信号转换成一个信号。
因此,可以说,傅立叶变换将原来难以处理的时域信号转换成了易于分析的频域信号(信号的频谱),可以利用一些工具对这些频域信号进行处理、加工。最后还可以利用傅立叶反变换将这些频域信号转换成时域信号。
从现代数学的眼光来看,傅里叶变换是一种特殊的积分变换。它能将满足一定条件的某个函数表示成正弦基函数的线性组合或者积分。在不同的研究领域,傅里叶变换具有多种不同的变体形式,如连续傅里叶变换和离散傅里叶变换。
在数学领域,尽管最初傅立叶分析是作为热过程的解析分析的工具,但是其思想方法仍然具有典型的还原论和分析主义的特征。"任意"的函数通过一定的分解,都能够表示为正弦函数的线性组合的形式,而正弦函数在物理上是被充分研究而相对简单的函数类:1. 傅立叶变换是线性算子,若赋予适当的范数,它还是酉算子;2. 傅立叶变换的逆变换容易求出,而且形式与正变换非常类似;3. 正弦基函数是微分运算的本征函数,从而使得线性微分方程的求解可以转化为常系数的代数方程的求解.在线性时不变杂的卷积运算为简单的乘积运算,从而提供了计算卷积的一种简单手段;5. 离散形式的傅立叶的物理系统内,频率是个不变的性质,从而系统对于复杂激励的响应可以通过组合其对不同频率正弦信号的响应来获取;4. 著名的卷积定理指出:傅立叶变换可以化复变换可以利用数字计算机快速的算出(其算法称为快速傅立叶变换算法(FFT))。
正是由于上述的良好性质,傅里叶变换在物理学、数论、组合数学、信号处理、概率、统计、密码学、声学、光学等领域都有着广泛的应用。
2、图像傅立叶变换的物理意义
图像的频率是表征图像中灰度变化剧烈程度的指标,是灰度在平面空间上的梯度。如:大面积的沙漠在图像中是一片灰度变化缓慢......
巧用VC工程下的rc文件(续)(2009-01-13 17:24:00)
摘要: 又快下班了,趁这会有点时间,赶紧写一点。接着上一次的关于资源文件(rc文件)继续说,这里主要说两个内容。
一 利用rc文件进行界面的布局
打开一个资源文件,如FHRDemo.rc,右键选择查看代码,可以看到文本描述的资源文件,这里截取其中的一段。
// Dialog
//
IDD_ABOUTBOX DIALOGEX 0, 0, 235, 55
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "About FHRDemo"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
ICON IDR_MAINFRAME,IDC_STATIC,11,17,20,20
LTEXT "FHRDemo Version 2.0",IDC_STATIC,40,10,119,8,SS_NOPREFIX
LTEXT "Copyright (C) 2007",IDC_STATIC,40,25,119,8
DEFPUSHBUTTON "OK",IDOK,178,7,50,16,WS_GROUP
END
IDD_FHRDEMO_FORM DIALOGEX 0, 0, 286, 211
STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
 ......
巧用VC工程下的rc文件(2008-12-30 17:20:00)
摘要: 纵观真个的VC工程,这里指那些包含界面的VC工程。主要由三方面构成,算法,资源,以及对资源的调用。算法是整个程序的核心,资源包含一些在算法中可能会用到的数据(二进制)和一些UI方面的显示效果资源。而对资源的调用则是利用开发工具提供的一套标准API(如Win32 API) 对你资源的调用来完成对资源的操作。
今天在这里,我主要是想结合自己对资源这一块的一些体会与大家交流交流。不足之处请高手指出,以便改正。
所谓资源,我们首先应该想到的是程序中的rc文件,按说对资源的操作应该是操作这个文件的事情,可惜的是,自从微软提供了开发向导以后,大家都偏向于使用程序向导来完成一些资源的添加,修改,尺寸设置以及layout的工作,包括我自己,应该这实在是太方便了。但是万物有其利的一面,必然有其害的一面,这导致了大家对资源本身的了解较少,造成了除了向导外就不知所以然的结果。我周边就有人常问我同一个问题,问什么我在资源中点击右键添加一个Dialog后,总是默认的名字IDD_DIALOG1,我说这不就是个资源ID吗,你在ID属性中将它的名字改该就是。好的,Dialog的问题搞定了。接着,他在工程中添加了一个自定义的资源(费了好一翻劲),同样他加了一个资源,同样点右键,这时,没有属性选项了,傻眼了。其实,这些问题都可以通过在rc文件中操作,既然它们都是资源,那么这些定义都是在rc文件中定义的,你利用向导做的这些工作,只是微软帮你把它写进了rc文件之中了。那么你要是碰到了问题,自己进入rc文件中看看究竟不是很好吗。因为那才是资源的源头。
好像今天时间不够了,马上下班。下次接着写关于利用rc文件实现控件大小的调整和layout以及如何在rc中添加系统资源和自定义资源,而完全可以脱离向导,就像平时写文档一样。......
C++中构造函数中调用虚函数的问题(2008-12-11 10:29:00)
摘要:注: 这里是参考参考stroustrup的回答吧(http://www.research.att.com/~bs/bs_faq2.html#vcall), 个人觉得对ATL中关于ATL_NO_VATBLE的理解非常有用,同时也可以对C++的规范有一次深入的理解。
在构造函数中调用虚成员函数,虽然这是个不很常用的技术,但研究一下可以加深对虚函数机制及对象构造过程的理解。这个问题也和一般直观上的认识有所差异。先看看下面的两个类定义。
struct C180
{
C180() {
foo();
this->foo();
}
virtual foo() {
cout << "<< C180.foo this: " << this << " vtadr: " << *(void**)this << endl;
}
};
struct C190 : public C180
{
C190() {}
virtual foo() {
cout << "<< C190.foo this: " << this << " vtadr: " << *(void**)this << endl;
}
};
父类中有一个虚函数,并且父类在它的构造函数中调用了这个虚函数,调用时它采用了两种方法一种是直接调用,一种是通过this指针调用。同时子类又重写了这个虚函数。
我们可以来预测一下如果构造一个C190的对象会发生什么情况。
我们知道,在构造一个对象时,过程是这样的:
1) 首先会按对象的大小得到一块内存(在heap上或在stack上),
2) 把指向这块内存的指针做为this指针来调用类的构造函数,对这块内存进行初始化。
 ......
令人费解的MFC客户区(2008-11-11 14:39:00)
摘要: 估计很多人都会遇到这么一个问题,平时我们用单文档/视图结构时,很容易就在客户区画个图,画根线什么的,然而,要在对话框的某个控件中画这些东西,刚一上来,还真有点搞吧。
下面,我就把在对话框中对某个控件画图的程序先列出来,然后再看看微软的一些搞的地方。
初始化:
m_IsDrawing=false;
CWnd*pCanvas=GetDlgItem(IDC_CANVAS);
pCanvas->GetWindowRect(&m_Canvas);
ScreenToClient(&m_Canvas);
void CPaintORamaDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
/////////////////////////////////////////
//Add code
//---------------------------------------
if(m_Canvas.PtInRect(point))
{
m_IsDrawing=true;
m_LineStart=point;
SetCapture();
}
}
void CPaintORamaDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
//////////////////////////////////////////////
//Add Code
//---------------------......
MFC下自绘ListBox或者ListCtrl中的内容(2008-11-06 17:03:00)
摘要: 最近在做一个UI时,需要将一些笔画非常多的字显示在一个ListBox列表中,供别人参考,高高兴兴做完了以后,运行一看,糟糕,由于笔画太多,字太
小,眼睛根本看不清楚,不过当时并不在意,不就是用SetFont就搞定的事吗!!然后在获得该ListBox的DC后,用SetFont一把,结果出乎
所料,里面的字体居然没变化。后来查阅相关资料,才发现微软居然将这些控件的字体和颜色等属性都是设置为默认的,普通的属性设置函数根本没用。真是气死人
呀,哪有这么不人性化的软件,所以人家说VC难学,特别是MFC,我看微软负有不可推卸的责任。好了,不扯远了,继续主题。
要想在ListBox或者ListCtrl等控件中绘制你想要的图形或者设置你想要的属性,那么必须采用自绘的方式。大致步骤如下:
1、添加一个LISTBOX控件,将其Owner
Draw属性改为“FIXED”或者“VARIABLE”,前者是指每个Item的高度一样,后者可以单独对每一个Item的高度设置,并可以为不同的
Item设置不同的属性。此外,还需要将Has Strings的属性设置为TRUE。
2、建立一个断承CListBox的类COwnerListBox,重载(Override)它的几个函数。主要是DrawItem和
MeasureItem两个函数。其他的函数可以参见MSDN。
3、MeasureItem中主要是设置这个ListBox的属性。而DrawItem主要是自己画每一个Item.
4、如果LISTBOX控件选择了“FIXED”属性后不做任何修改,那么用AddString等函数添加的子项将不会被系统自动显示,原因是用户选
择了自绘属性。这个属性由COwnerListBox里的DrawItem和MesureItem函数完成。DrawItem用来绘制子项
目,MesureItem用来修改项目的一些属性(一般不用更改)。
完成上述步骤后,即可看见更改后的LISTBOX,另外按钮等其他控件步骤与思想是大同小异的。
下面是我做的一个......
关于虚拟内存和物理内存及它们之间的映射(2008-10-17 17:33:00)
摘要:Windows 2000 使用基于分页机制的虚拟内存。每个进程有4GB的虚拟地址空间。基于分页机制,这4GB地址空间的一些部分被映射了物理内存,一些部分映射硬盘上的交换文件,一些部分什么也没有映射。程序中使用的都是4GB地址空间中的虚拟地址。而访问物理内存,需要使用物理地址。
下面我们看看什么是物理地址,什么是虚拟地址。
物理地址 (physical address): 放在寻址总线上的地址。放在寻址总线上,如果是读,电路根据这个地址每位的值就将相应地址的物理内存中的数据放到数据总线中传输。如果是写,电路根据这个地址每位的值就将相应地址的物理内存中放入数据总线上的内容。物理内存是以字节(8位)为单位编址的。
虚拟地址 (virtual address): 4G虚拟地址空间中的地址,程序中使用的都是虚拟地址。
如果CPU寄存器中的分页标志位被设置,那么执行内存操作的机器指令时,CPU会自动根据页目录和页表中的信息,把虚拟地址转换成物理地址,完成该指令。比如 mov eax,004227b8h ,这是把地址004227b8h处的值赋给寄存器的汇编代码,004227b8这个地址就是虚拟址。CPU在执行这行代码时,发现寄存器中的分页标志位已经被设定,就自动完成虚拟地址到物理地址的转换,使用物理地址取出值,完成指令。对于Intel CPU 来说,分页标志位是寄存器CR0的第31位,为1表示使用分页,为0表示不使用分页。对于初始化之后的 Win2k 我们观察 CR0 ,发现第31位为1。表明Win2k是使用分页的。
使用了分页机制之后,4G的地址空间被分成了固定大小的页,每一页或者被映射到物理内存,或者被映射到硬盘上的交换文件中,或者没有映射任何东西。对于一般程序来说,4G的地址空间,只有一小部分映射了物理内存,大片大片的部分是没有映射任何东西。物理内存也被分页,来映射地址空间。对于32bit的Win2k,页的大小是4K字节。CPU用来把虚拟地址转换成物理地址的信息存放在叫做页目录和页表的结构里。
物理内存分页,一个物理页的大小为4K字节,第0个物理页从物理地址 0x00000000 处开始。由于页的大小为4KB,就是0x1000字节,所以第1页从物理地址 0x00001000 处开始。第2页从物理地址 0x00002000 处开始。可以看到......
MFC工具栏介绍(续)(2008-10-10 17:31:00)
摘要: 步骤1:添加一个CDialogBar派生类
在资源中添加一个对话框,再采用类向导来添加类,找不到CDialogBar作为基类吧,可以先用CDialog作为基类产生一个,然后把所以的“CDialog”替换为“CDialogBar”,替换完成了。编译一下,^_^有错误吧!!请看步骤2。
步骤2:解决编译错误并完善该类
其实错误就是构着函数调用基类时有问题,: CDialogBar(/*CDlgBar::IDD, pParent*/)象这样注释掉就可以了,添加一个类似OnInitDialog的函数,在CDialogBar中是不存在OnInitDialog的消息的,至少我还不知道,因为初始化是在创建后调用的所以我们就重写virtual BOOL Create(CWnd* pParentWnd,UINT nIDTemplate,UINT nStyle,UINT nID);这个函数。注意哦用向导添加的Create函数的参数是不对的喔,看上面。下面是实现代码(很简单的)
BOOL CDlgXXX::Create(CWnd* pParentWnd,UINT nIDTemplate,UINT nStyle,UINT nID)
{
// TODO: Add your specialized code here and/or call the base class
BOOL bRes= CDialogBar::Create(pParentWnd,nIDTemplate,nStyle,nID );
InitDialogBar();//在类中添加一个成员函数就可以了
return bRes;
}
BOOL CDlgXXX::InitDialogBar()
{
UpdateData(FALSE);//这个一定要啊,这样就会有和CDialog一样的数据交换效果了
return TRUE;
}
步骤3:创建和使用
if (!m_barAttrib.Create(this,IDD_DLG_COM_ATTRIB, CBRS_RIGHT|CBRS_GRIPPER, XXX))
{
TRACE0("Failed to create dialogbar\n");
return -1;
}
......
MFC关于工具栏介绍(2008-10-10 17:14:00)
摘要: 一个好的软件,界面非常重要,其中的功能要让客户一目了然。而这些可以借助于工具栏,如在Microsoft Word中的工具栏,相关的操作基本上都可以借助工具栏来完成。下面,我就将我知道的关于VC中关于工具栏的一些东西写写,与大家共享,不对的地方请大家帮忙纠正。
下面我以Visual Studio.net 2003下的单文档/视图的程序为例说明。
在VS中,实现工具栏的类是CToolBar, 在新建一个单文档/视图程序的时候,在框架类的OnCreate中,系统会自动创建一个工具条。如下:
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("未能创建工具栏\n");
return -1; // 未能创建
}
方法一:
想要修改或者增加工具栏中的内容,一种方法是进入“资源视图”,然后选择"ToolBar",然后对工具栏中的内容进行修改或者添加,并为它们添加响应消息。这是最简单,有时候也是最直接有效的方法。
方法二:
如果你想创建一个更加符合自己要求的工具条,而不想被资源视图中的ToolBar所限制的话,那么你可以自己写程序来Create ToolBar. 这样的话,你只需要将上面工程自动生成的那段代码注释掉,然后自己写一个函数,这里取名为CreateExToolBar(); 然后用这个函数代替上面这段代码。
然后加入自己特色的工具条代码,当然,先还是要创建一个工具条,如下:
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CH......