第一篇:git使用小结
git使用小结
1.git-config 配置git,一般需要配置的是user.name,user.email,有时sendemail.smtpserver也要配置,比如,我使用msmtp:
git-config –global sendemail.smtpserver /usr/local/bin/msmtp 如果你仅仅是想给这一个项目配置,把–global选项去掉。查看配置的选项是–list。2.git-pull git-pull没必要带后面那长长的url(-_-b 我那么用了好多次,不过我用的是!git-pull)。如果你在给Linux内核这样的项目工作,记得git-pull之前检查是不是在master分支。3.git-format-patch 如果发送多于一个补丁,最好用[PATCH n/m]的形式,加上-n。加signed-off-by那行是-s。指定为几次commit生成补丁,直接加数字,比如,$ git-format-patch-3 检查补丁是–check,最好加上这个。4.git-send-email 如果一次提交补丁比较多,最好用–no-chain-reply-to,因为如果不用的话,在thread嵌套会太深,不利于别人阅读。这个也可以通过选项sendemail.chainreplyto来控制。–signed-off-by-cc,要加上,可以省去手工处理的麻烦。–compose用来编辑[PATCH 0/m],这个一般是对整个patchset的描述。–smtp-server,如果你不想用git-config指定的话,用它也行。–cc和–to就不用说了。5.git-commit 在git-commit之前最好git-add。git-commit几个常用的选项有:-s 会增加Signed-off-by行,-e编辑commit message,-a表示all,-m是指定commit信息。同样,删除文件是先git-rm。查看commit列表用git-rev-list,查看某个commit用git-show,查看commit的日志用git-log,-p是以补丁的形式查看。6.其它 git-diff也可以比较不同版本之间的差异,某个版本的某个文件的差异,如: $ git-diff v2.6.22 $ git diff v2.6.20 init/main.c $ git-diff v2.6.23 v2.6.24-rc1 init/main.c git-whatchanged也差不多: $ git-whatchanged-p init/main.c 7.错误提交了commit怎么办? a)git-revert 这个本身就会产生一个commit,如果用得多了会让你的log看起来不那么干净。;-)b)git-reset 用这个要当心,它会把那个commit之后的commit全部删除。一个好的办法是:先建立一个临时的分支,然后再git-reset,再git-rebase,最后再删除临时的分支。详细可以看这里。
第二篇:sqlldr使用小结
sqlldr使用小结
sqlldr userid=lgone/tiger control=a.ctl
LOAD DATA
INFILE ’t.dat’ // 要导入的文件
// INFILE ’tt.date’ // 导入多个文件
// INFILE * // 要导入的内容就在control文件里 下面的BEGINDATA后面就是导入的内容
INTO TABLE table_name // 指定装入的表
BADFILE ’c:\bad.txt’ // 指定坏文件地址
************* 以下是4种装入表的方式
APPEND // 原先的表有数据 就加在后面
// INSERT // 装载空表 如果原先的表有数据 sqlloader会停止 默认值
// REPLACE // 原先的表有数据 原先的数据会全部删除
// TRUNCATE // 指定的内容和replace的相同 会用truncate语句删除现存数据
************* 指定的TERMINATED可以在表的开头 也可在表的内部字段部分
FIELDS TERMINATED BY ’,’ OPTIONALLY ENCLOSED BY ’“’
// 装载这种数据: 10,lg,”“"lg”“",”lg,lg“
// 在表中结果: 10 lg ”lg“ lg,lg
// TERMINATED BY X ’0Array’ // 以十六进制格式 ’0Array’ 表示的// TERMINATED BY WRITESPACE // 装载这种数据: 10 lg lg
TRAILING NULLCOLS ************* 表的字段没有对应的值时允许为空
************* 下面是表的字段
(col_1 , col_2 ,col_filler FILLER // FILLER 关键字 此列的数值不会被装载
// 如: lg,lg,not 结果 lg lg)
// 当没声明FIELDS TERMINATED BY ’,’ 时
//(// col_1 [interger external] TERMINATED BY ’,’ ,// col_2 [date ”dd-mon-yyy“] TERMINATED BY ’,’ , // col_3 [char] TERMINATED BY ’,’ OPTIONALLY ENCLOSED BY ’lg’
//)
// 当没声明FIELDS TERMINATED BY ’,’用位置告诉字段装载数据
//(// col_1 position(1:2),// col_2 position(3:10),// col_3 position(*:16), // 这个字段的开始位置在前一字段的结束位置
// col_4 position(1:16),// col_5 position(3:10)char(8)// 指定字段的类型
//)
BEGINDATA // 对应开始的 INFILE * 要导入的内容就在control文件里
10,Sql,what
20,lg,show
=======================================
//////////// 注意begindata后的数值前面不能有空格***** 普通装载
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ’,’ OPTIONALLY ENCLOSED BY ’”’
(DEPTNO,DNAME,LOC)
BEGINDATA
10,Sales,“"”USA“"”
20,Accounting,“Virginia,USA”
30,Consulting,Virginia
40,Finance,Virginia
50,“Finance”,“",Virginia // loc 列将为空
60,”Finance“,Virginia // loc 列将为空***** FIELDS TERMINATED BY WHITESPACE 和 FIELDS TERMINATED BY x’0Array’ 的情况
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY WHITESPACE
--FIELDS TERMINATED BY x’0Array’
(DEPTNO,DNAME,LOC)
BEGINDATA Sales Virginia ***** 指定不装载那一列
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ’,’ OPTIONALLY ENCLOSED BY ’”’
(DEPTNO,FILLER_1 FILLER, // 下面的 “Something Not To Be Loaded” 将不会被装载
DNAME,LOC)
BEGINDATA
20,Something Not To Be Loaded,Accounting,“Virginia,USA” ***** position的列子
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
(DEPTNO position(1:2),DNAME position(*:16), // 这个字段的开始位置在前一字段的结束位置
LOC position(*:2Array),ENTIRE_LINE position(1:2Array))
BEGINDATA
10Accounting Virginia,USA
***** 使用函数 日期的一种表达 TRAILING NULLCOLS的使用
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ’,’
TRAILING NULLCOLS // 其实下面的ENTIRE_LINE在BEGINDATA后面的数据中是没有直接对应
// 的列的值的 如果第一行改为
10,Sales,Virginia,1/5/2000, 就不用TRAILING NULLCOLS了
(DEPTNO,DNAME “upper(:dname)”, // 使用函数
LOC “upper(:loc)”,LAST_UPDATED date ’dd/mm/yyyy’, // 日期的一种表达方式 还有’dd-mon-yyyy’ 等
ENTIRE_LINE “:deptno||:dname||:loc||:last_updated”)
BEGINDATA
10,Sales,Virginia,1/5/2000
20,Accounting,Virginia,21/6/1ArrayArrayArray 30,Consulting,Virginia,5/1/2000
40,Finance,Virginia,15/3/2001 ***** 使用自定义的函数 // 解决的时间问题
create or replace
function my_to_date(p_string in varchar2)return date
as
type fmtArray is table of varchar2(25);
l_fmts fmtArray := fmtArray(’dd-mon-yyyy’, ’dd-month-yyyy’,’dd/mm/yyyy’,’dd/mm/yyyy hh24:mi:ss’);
l_return date;
begin
for i in 1..l_fmts.count
loop
begin
l_return := to_date(p_string, l_fmts(i));
exception
when others then null;
end;EXIT when l_return is not null;
end loop;
if(l_return is null)
then
l_return :=
new_time(to_date(’01011Array70’,’ddmmyyyy’)+ 1/24/60/60 *
p_string, ’GMT’, ’EST’);
end if;
return l_return;
end;
/
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ’,’
TRAILING NULLCOLS
(DEPTNO, DNAME “upper(:dname)”,LOC “upper(:loc)”,LAST_UPDATED “my_to_date(:last_updated)” // 使用自定义的函数)
BEGINDATA
10,Sales,Virginia,01-april-2001
20,Accounting,Virginia,13/04/2001
30,Consulting,Virginia,14/04/2001 12:02:02
40,Finance,Virginia,Array872682Array7
50,Finance,Virginia,02-apr-2001
60,Finance,Virginia,Not a date ***** 合并多行记录为一行记录
LOAD DATA
INFILE *
concatenate 3 // 通过关键字concatenate 把几行的记录看成一行记录
INTO TABLE DEPT
replace
FIELDS TERMINATED BY ’,’
(DEPTNO, DNAME “upper(:dname)”,LOC “upper(:loc)”,LAST_UPDATED date ’dd/mm/yyyy’)
BEGINDATA
10,Sales, // 其实这3行看成一行 10,Sales,Virginia,1/5/2000
Virginia,1/5/2000
// 这列子用 continueif list=“,” 也可以
告诉sqlldr在每行的末尾找逗号 找到逗号就把下一行附加到上一行
LOAD DATA
INFILE *
continueif this(1:1)= ’-’ // 找每行的开始是否有连接字符-有就把下一行连接为一行
// 如-10,Sales,Virginia,// 1/5/2000 就是一行 10,Sales,Virginia,1/5/2000
// 其中1:1 表示从第一行开始 并在第一行结束 还有continueif next 但continueif list最理想
INTO TABLE DEPT replace
FIELDS TERMINATED BY ’,’
(DEPTNO,DNAME “upper(:dname)”,LOC “upper(:loc)”,LAST_UPDATED date ’dd/mm/yyyy’)
BEGINDATA // 但是好象不能象右面的那样使用
-10,Sales,Virginia,-10,Sales,Virginia,1/5/2000 1/5/2000
-40, 40,Finance,Virginia,13/04/2001
Finance,Virginia,13/04/2001 ***** 载入每行的行号
load data
infile *
into table t
replace
(seqno RECNUM //载入每行的行号
text Position(1:1024))
BEGINDATA fsdfasj //自动分配一行号给载入 表t 的seqno字段 此行为 1
fasdjfasdfl // 此行为 2...Array ***** 载入有换行符的数据
注意: unix 和 windows 不同 \\n & /n
< 1 > 使用一个非换行符的字符
LOAD DATA
INFILE *
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ’,’
TRAILING NULLCOLS
(DEPTNO,DNAME “upper(:dname)”,LOC “upper(:loc)”,LAST_UPDATED “my_to_date(:last_updated)”,COMMENTS “replace(:comments,’\n’,chr(10))” // replace 的使用帮助转换换行符)
BEGINDATA
10,Sales,Virginia,01-april-2001,This is the Sales\nOffice in Virginia
20,Accounting,Virginia,13/04/2001,This is the Accounting\nOffice in Virginia
30,Consulting,Virginia,14/04/2001 12:02:02,This is the Consulting\nOffice in Virginia
40,Finance,Virginia,Array872682Array7,This is the Finance\nOffice in Virginia
< 2 > 使用fix属性
LOAD DATA
INFILE demo17.dat “fix 101”
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ’,’
TRAILING NULLCOLS
(DEPTNO,DNAME “upper(:dname)”,LOC “upper(:loc)”,LAST_UPDATED “my_to_date(:last_updated)”,COMMENTS)
demo17.dat 10,Sales,Virginia,01-april-2001,This is the Sales
Office in Virginia
20,Accounting,Virginia,13/04/2001,This is the Accounting
Office in Virginia
30,Consulting,Virginia,14/04/2001 12:02:02,This is the Consulting
Office in Virginia
40,Finance,Virginia,Array872682Array7,This is the Finance
Office in Virginia
// 这样装载会把换行符装入数据库 下面的方法就不会 但要求数据的格式不同
LOAD DATA
INFILE demo18.dat “fix 101”
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ’,’ OPTIONALLY ENCLOSED BY ’“’
TRAILING NULLCOLS
(DEPTNO, DNAME ”upper(:dname)“,LOC ”upper(:loc)“,LAST_UPDATED ”my_to_date(:last_updated)“,COMMENTS)
demo18.dat
10,Sales,Virginia,01-april-2001,”This is the Sales
Office in Virginia“
20,Accounting,Virginia,13/04/2001,”This is the Accounting
Office in Virginia“
30,Consulting,Virginia,14/04/2001 12:02:02,”This is the Consulting
Office in Virginia“
40,Finance,Virginia,Array872682Array7,”This is the Finance
Office in Virginia“
< 3 > 使用var属性
LOAD DATA
INFILE demo1Array.dat ”var 3“
// 3 告诉每个记录的前3个字节表示记录的长度 如第一个记录的 071 表示此记录有 71 个字节
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ’,’
TRAILING NULLCOLS
(DEPTNO,DNAME ”upper(:dname)“,LOC ”upper(:loc)“,LAST_UPDATED ”my_to_date(:last_updated)“,COMMENTS)
demo1Array.dat
07110,Sales,Virginia,01-april-2001,This is the Sales
Office in Virginia
07820,Accounting,Virginia,13/04/2001,This is the Accounting
Office in Virginia
08730,Consulting,Virginia,14/04/2001 12:02:02,This is the Consulting
Office in Virginia
07140,Finance,Virginia,Array872682Array7,This is the Finance
Office in Virginia
< 4 > 使用str属性
// 最灵活的一中 可定义一个新的行结尾符 win 回车换行 : chr(13)||chr(10)
此列中记录是以 a|\r\n 结束的select utl_raw.cast_to_raw(’|’||chr(13)||chr(10))from dual;
结果 7C0D0A
LOAD DATA
INFILE demo20.dat ”str X’7C0D0A’“
INTO TABLE DEPT
REPLACE
FIELDS TERMINATED BY ’,’
TRAILING NULLCOLS
(DEPTNO,DNAME ”upper(:dname)“,LOC ”upper(:loc)“,LAST_UPDATED ”my_to_date(:last_updated)",COMMENTS)
demo20.dat 10,Sales,Virginia,01-april-2001,This is the Sales
Office in Virginia|
20,Accounting,Virginia,13/04/2001,This is the Accounting
Office in Virginia|
30,Consulting,Virginia,14/04/2001 12:02:02,This is the Consulting
Office in Virginia|
40,Finance,Virginia,Array872682Array7,This is the Finance
Office in Virginia|
================================
象这样的数据 用 nullif 子句
10-jan-200002350Flipper seemed unusually hungry today.10510-jan-20000ArrayArray45Spread over three meals.id position(1:3)nullif id=blanks // 这里可以是blanks 或者别的表达式
// 下面是另一个列子 第一行的 1 在数据库中将成为 null
LOAD DATA INFILE *
INTO TABLE T
REPLACE
(n position(1:2)integer external nullif n=’1’,v position(3:8))
BEGINDATA 10
20lg
-----------------------------
第三篇:GridCtrl使用小结
http://www.xiexiebang.com/
GridCtrl使用详解
CGridCtrl类主要是通过grid样式显示数据 在单文档中的使用方法
步骤一 初始化 在CView类的.h头文件中包含文件:
#include “Gridctrl.h” 并且手写加入如下的成员函数:
CGridCtrl * m_pGridCtrl;步骤二 构造与析构 构造函数中:
m_pGridCtrl = NULL;析构函数中:
if(m_pGridCtrl)
delete m_pGridCtrl;步骤三 如果需要打印功能的话添加同名打印函数代码 在CView类的OnBeginPrinting()函数中添加如下代码: if(m_pGridCtrl)
m_pGridCtrl->OnBeginPrinting(pDC,pInfo);//简单吧,这就是类的好处其它两个打印函数也一样的做法.步骤四 在OnInitaUpdate()函数中或者你自己添加的要显示Grid的消息函数中如下初始化: //创建非模式对话框 CDlg *dlg;dlg=new CDlg();dlg->Create(IDD_Dlg,this);
//初始化GridCtrl控件 if(m_pGridCtrl!=NULL){ deletem_pGridCtrl;m_pGridCtrl=NULL;} if(m_pGridCtrl == NULL){ // Create the Gridctrl object m_pGridCtrl = new CGridCtrl;if(!m_pGridCtrl)return 0;// Create the Gridctrl window CRectrect;GetClientRect(rect);m_pGridCtrl->Create(rect, this, 100);// fill it up with stuff m_pGridCtrl->SetEditable(false);m_pGridCtrl->SetTextBkColor(RGB(0xFF, 0xFF, 0xE0));//黄色背景 m_pGridCtrl->EnableDragAndDrop(false);try { m_pGridCtrl->SetRowCount(k);//设置行数为k行 m_pGridCtrl->SetColumnCount(4);//k列
m_pGridCtrl->SetFixedRowCount(1);//标题行为一行
http://www.xiexiebang.com/
m_pGridCtrl->SetFixedColumnCount(1);//同上 } catch(CMemoryException* e){ e->ReportError();e->Delete();return 0;} //填充列标题 int row=0;for(int col=0;col<4;col++){ GV_ITEM Item;Item.mask = GVIF_TEXT|GVIF_FORMAT;Item.row = row;Item.col = col;if(col==0){ Item.nFormat = DT_CENTER|DT_WORDBREAK;Item.strText.Format(_T(“【类别】”),col);} else if(col==1){ Item.nFormat = DT_LEFT|DT_WORDBREAK;Item.strText.Format(_T(“第一列”),col);} else if(col==2){ Item.nFormat = DT_LEFT|DT_WORDBREAK;Item.strText.Format(_T(“第二列”),col);} m_pGridCtrl->SetItem(&Item);} // fill rows/cols with text for(row = 1;row < k;row++)for(col = 0;col < h;col++){ GV_ITEM Item;Item.mask = GVIF_TEXT|GVIF_FORMAT;Item.row = row;Item.col = col;if(col < 1){ //行标题头
Item.nFormat = DT_CENTER|DT_VCENTER |DT_SINGLELINE|DT_END_ELLIPSIS |DT_NOPREFIX;Item.strText.Format(_T(“%d”),row);
http://www.xiexiebang.com/
} else if(col==1){ //第一列的值 Item.nFormat = DT_CENTER|DT_VCENTER |DT_SINGLELINE|DT_END_ELLIPSIS |DT_NOPREFIX;str=“aa”;Item.strText.Format(_T(“%s”),str);}else if(col==2){ //第二列第值 Item.nFormat = DT_CENTER|DT_VCENTER |DT_SINGLELINE|DT_END_ELLIPSIS |DT_NOPREFIX;CStringstr;str=“bb”;Item.strText.Format(_T(“%s”),str);} m_pGridCtrl->SetItem(&Item);} m_pGridCtrl->AutoSize();
//--------------设置行列距------------------for(int a=1;a
步骤五: 添加WM_SIZE消息,调整控件的界面占屏幕大小
if(m_pGridCtrl->GetSafeHWnd())
{
CRectrect;
GetClientRect(rect);
m_pGridCtrl->MoveWindow(rect);
}
在对话框中的使用方法 步骤一 创建数据显示表格对话框
在资源管理器中新创建一个对话框,假设为CDlgTestReportBox。从工具箱中加入Custom Control,就是人头像的那个,将其区域拉伸至要显示数据表格的大小,充满整个对话框。
在CDlgTestReportBox类的头文件中: #include “GridCtrl.h”
http://www.xiexiebang.com/
再定义成员变量: CGridCtrl* m_pGrid;添加OnShowWindow()消息处理函数如下:
voidCDlgTestReportBox::OnShowWindow(BOOL bShow, UINT nStatus){ CDialog::OnShowWindow(bShow, nStatus);// TODO: Add your message handler code here if(m_pGrid!=NULL){ deletem_pGrid;m_pGrid=NULL;} if(m_pGrid==NULL){ m_pGrid=new CGridCtrl;CRectrect;GetDlgItem(IDC_ReportAera)->GetWindowRect(rect);//得到显示区域 ScreenToClient(&rect);m_pGrid->Create(rect,this,100);m_pGrid->SetEditable(false);m_pGrid->SetTextBkColor(RGB(0xFF, 0xFF, 0xE0));//黄色背景 try { m_pGrid->SetRowCount(10);//初始为10行
m_pGrid->SetColumnCount(11);//初始化为11列 m_pGrid->SetFixedRowCount(1);//表头为一行 m_pGrid->SetFixedColumnCount(1);//表头为一列 } catch(CMemoryException* e){ e->ReportError();e->Delete();// return FALSE;} for(int row = 0;row
http://www.xiexiebang.com/
{ Item.nFormat = DT_CENTER|DT_WORDBREAK;Item.szText.Format(_T(“报表显示”),col);} else if(row < 1)//设置0行表头显示 { Item.nFormat = DT_CENTER|DT_WORDBREAK;Item.szText.Format(_T(“ 项目%d”),col);} else if(col < 1)//设置0列表头显示 { if(row
步骤二 嵌入上面的对话框 显示数据
在你需要显示数据的对话框上的头文件中,假设为CDlgTest,加入 #include ”GridCtrl.h“ CDlgTestReportBox* m_pTestReportBox;将数据显示对话框放入你的对话框相应位置上,在CDlgTest::OnInitDialog()中:
if(!m_pTestReportBox){
m_pTestReportBox=new CDlgTestReportBox(this);} m_pTestReportBox->Create(IDD_DlgTestReportBox,this);
http://www.xiexiebang.com/
//定义区域变量 CRectrectDraw;GetDlgItem(IDC_AeraReport)->GetWindowRect(rectDraw);ScreenToClient(&rectDraw);//动态测试数据显示区域rectDraw //将对应的对话框放到指定区域 m_pTestReportBox->MoveWindow(rectDraw);m_pTestReportBox->ShowWindow(SW_SHOW);自定义填充数据的函数:CDlgTest::FillGrid()如下: CGridCtrl* pGrid=m_pTestReportBox->m_pGrid;for(int row = pGrid->GetRowCount()-1;row >= pGrid->GetRowCount()-3;row--){ for(int col = 1;col <= pGrid->GetColumnCount();col++){ GV_ITEM Item;Item.mask = GVIF_TEXT|GVIF_FORMAT;Item.row = row;Item.col = col;if(row==pGrid->GetRowCount()-3&&col>0)//平均值 { if(col==10){ Item.nFormat = DT_CENTER|DT_WORDBREAK;Item.szText.Format(_T(” %6.2f “),avjch);} else{ Item.nFormat = DT_CENTER|DT_WORDBREAK;Item.szText.Format(_T(” %6.2f “),av[col-1]);} } pGrid->SetItem(&Item);//提交数据 if(row==0||col==0){ COLORREF clr = RGB(0, 0, 0);pGrid->SetItemBkColour(row, col, clr);pGrid->SetItemFgColour(row, col, RGB(255,0,0));} }//循环结束
pGrid->Invalidate();} CGRIFCTRL原理:
DBGRID和一般的GRID的不同之处在于,一般的GRID并不适合显示大的数据量,如果一个表中有上万条记录都要插入到GRID中,这将是一个很慢的过程,并且在GRID中移动滚动条时,它的记录的滚动也是很慢。而DBGRID并不会真正把这些记录的数据全部插入到控件中,当DBGRID的滚动条滚动时,它会根据DBGRID的显示面积的大小和查询得到的总记录数计算出当前应该显示哪些行,然后插入
http://www.xiexiebang.com/
到表格中,这样一来,速度肯定快,而且没有数据量多少的限制。幸运的是,CGridCtrl类已经为我们提供了这种机制,它是采用虚模式实现的。使用这种方式,即使你向这个该控件插入一百万条数据,它并不会真的生成一百万行,而是随着你的滚动条的滚动,计算出在屏幕上要显示的行和列,然后会向你提供一个接口,通过这个接口,你可以在这儿设置你要显示的数据。下面给出使用CGridCtrl控件的虚模式的步骤: 步骤一 初始化
在视图的初始化函数里添加如下代码:
void SetVirtualMode(TRUE)
设为虚模式
BOOL SetRowCount(intnRows)
设置总的行数。
BOOL SetFixedRowCount(intnFixedRows = 1)
设置固定的行数据 BOOL SetColumnCount(intnCols)
设置列数 BOOL SetFixedColumnCount(intnFixedCols = 1)设置固定的列数 步骤二 响应消息 显示数据
我们假设CGridCtrl是放在单文档视图中,而且它关联的变量是m_GridCtrl,利用ClassWizard添加视图的OnNotify响应函数。这个响应函数的写法是固定的,类似下面的代码:
BOOL CGridCtrlTestView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult){ if(wParam ==(WPARAM)m_Grid.GetDlgCtrlID()){ *pResult = 1;GV_DISPINFO *pDispInfo =(GV_DISPINFO*)lParam;if(GVN_GETDISPINFO == pDispInfo->hdr.code){ //这是添加的函数,在这个函数里设置当前要显示的数据 SetGridItem(pDispInfo);return TRUE;} } returnCGridCtrlTestView::OnNotify(wParam, lParam, pResult);} 在上面的代码中,SetGridItem(pDispInfo)是添加的函数,在这个函数里我们设置当前要显示的数据。pDispInfo是一个GV_DISPINFO的结构体对象,它包含了每个单元格的信息,如行号,列号,有没有位图,背景色,前景色等。CGRIDCTRL会把当前要显示那个单元格行号,列号传递给我们,我们只要设置里面显示的数据就可以了。如下面是一个显示数据的例子。
voidCGridCtrlTestView::SetGridItem(GV_DISPINFO *pDispInfo){
pDispInfo->item.strText.Format(”row%d,col%d",pDispInfo->it
http://www.xiexiebang.com/
em.row, pDispInfo->item.col);}
第四篇:ICC使用小结
ICC使用小结
(1)ICC的输入文件
MilkyWay(physical library),TLUPlus文件(interconnect文件),lib文件(logical library),netlist,constraints(sdc),floorplan文件(.fp或.def)
由于ICC会使用MilkyWay数据格式,因此有必要先熟悉MilkyWay格式的产生。
(2)ICC的步骤流程
ICC的流程如下:(1)import design(netlist/sdc/database)——(2)create_floorplan或adjust floorplan——(3)placement ——(4)cts——(5)route——(6)final signoff(3)具体每一步过程及注意点(操作点)(4)Import design具体操作:
set_link_library xxx set_target_library xxx create_mu_lib design_library –technology xxx.tf –mw_reference_library ref_library open set_tlu_plus_file –max_tluplus max_file –min_tluplus min_file –tech2itf_map map_file read_verilog xxx.v current_design xxx link read_def xxx.def derive_pg_connection –power_net xxx_power_net –power_pin xxx_power_pin –ground_net xxx_ground_net –ground_pin xxx_ground_pin derive_pg_connection –power_net xxx_power_net –power_pin xxx_power_pin –ground_net xxx_ground_net –ground_pin xxx_ground_pin-tie read_floorplan xxx.fp或新创建一个floorplan接下来的任务了。
(5)Create_floorplan具体操作:
Create_floorplan针对读入的设计以及def,开始进行floorplan的规划,包括IO以及macro的摆放,电源规划等。
首先要创建一个floorplan,创建floorplan之前需要读入IO的约束信息,3101项目将IO视作macro对待。具体的io constraint信号可以使用set_pad_physical_constraints来设置。
Create_floorplan –control_type width_and_height –core_width xxx –core_height xxx Remove_terminal *-keep_macro_place –keep_std_cell_place,只有设置了keep之后,才能create_fp_place完成,否则会报utility超出。
设置好floorplan之后就需要对macro和standcell进行place了。Macro的place可以使用脚本set_obj*和set_attribute来设置,而standcell可以使用create_fP_placement来完成。这个过程中先需要设置placement以及route的blockage。create_place_blockage和create_route_guide来完成blockage的设置。
接着设置在Design Planning的task任务下,进行place macros和standcells。或者使用create_fp_placement –timing_driven –no_hierarchy_gravity 设置完macro和standcell之后,就可以进行电源规划了,可以通过产生power_ring或power_strap来进行。create_power_strap –direction horizontal –net {VDD12 VSS_PAD} –layer M5 –configure step_end_stop –start_at 1290 –stop 2170 –step 50 –width 5 –start_low_ends coordinate –start_low_ends_coordinate 583 –start_high_ends coordinate –start_high_ends_coordinate 1710 –extend_low_ends off –extend_high_ends off –keep_floating_wire_pieces –ignore_parallel_targets –define_parallel_targets_by_wire_directions 下面对上面这个strap的创建进行解释说明下,上面的power_strap表示要在位置区域为{{1290 583} {2170 1710}}的方形区域创建间距为50,线宽为5的水平方向power_strap。
(6)placement的具体操作
place_opt进行之前需要先查看report_constraints –all看看主要的violation是哪些,同时也应该查看congestion情况以选择合适的place_opt策略。也需要检查设计及物理信息,check_physical_design –for_placement以及check_design –physical,设置set_ignore_layers –max/-min,接着create_placement –timing_driven/-congestion等,若有congestion,可以设置set_congestion_options来设置合理的值,设置好placement的一些参数后,可以进行place_opt了。
(7)cts的具体操作
cts可以通过GUI—>New Clock Tree Synthesis Window/New Interactive CTS Window查看时钟树的直观形状,可以设置clock_routing_rule来合理安排时钟树的线宽(NDR,Non-Default Rule)。设置OCV和bc_wc的工作条件。
(8)route的具体操作
需要先check_physical_design –for_routing检查布线的物理设计,以及check_routeability。Set_route_options可以设置route设置相关的选项,route_opt包括route clock nets,route signal nets,set_route_opt_strategy可以设置route相关的策略。分析route的结果可以使用verify_route和verify_drc(使用hercules),postroute delay calculation using Arnoldi algorithm。考虑si的route需要设置set_si_options。Spread_eco_cells/insert_spare_cells,place_freezen_silicon/route_eco
第五篇:Heritrix使用小结
Heritrix使用小结
1.Heritrix 简介
Heritrix是一个专门为互联网上的网页进行存档而开发的网页检索器。它使用Java编写并且完全开源。它主要的用户界面可以通过一个web流量器来访问并通过它来控制检索器的行为,另外,它还有一个命令行工具来供用户选择调用。
Heritrix是由互联网档案馆和北欧国家图书馆联合规范化编写于2003年初。第一次正式发布是在2004年1月,并不断的被互联网档案馆和其他感兴趣的第三方改进着。到现在已经成为一个成熟的开源爬虫,并被广泛使用。
Heritrix的操作模型:
从模型中可以看到,利用Heritrix我们可以轻松从互联网上获取信息并将它们全部存储下来,然后可以任意的访问获取到的网页信息并可以查看报告。
Heritrix的整体结构简图如下: 它的工作流程是一个循环,具体流程是:
在预定的URI中选择一个。
从选择的URI的网址下载远程文件
分析,归档下载到的内容 从分析到的内容里面选择感兴趣的URI。加入预定队列。
标记已经处理过的URI
在大概的了解了Heritrix及它的工作机制之后,我们就可以开始Heritrix的使用了。
2.Heritrix 的配置与使用
1)安装与配置 从官方网站http://crawler.archive.org/下载最新版本的Heritrix运行包,解压到一个文件夹内。其中,Heritrix所用到的工具类库都存于lib下,另外,在Heritrix目录下有一个conf目录,其中包含了一个很重要的文件:heritrix.properties 在 heritrix.properties中配置了大量与Heritrix运行息息相关的参数,这些参数主要是配置了Heritrix运行时的一些默认工具类、WebUI的启动参数,以及Heritrix的日志格式等。当第一次运行Heritrix时,只需要修改该文件,为其加入WebUI的登录名和密码。在“heritrix.cmdline.admin=”后面增加账户和密码,比如heritrix.cmdline.admin=admin:admin。其中,用户名和密码是以一个冒号进行分隔,使用者可以指定任何的字符串做为用户名密码。
新建一个文件Heritrix.cmd 作为启动Heritrix的命令文件,在文件内写入:
(假设文件夹路径为D:heritrix)
运行上述脚本,在浏览器输入http://localhost:8080/,输入之前设置的用户名密码,即可进入Heritrix管理页面。
2)新建抓取任务(1)单击菜单栏上的“Jobs”标签,就可以进入任务创建页面。如下图所示:
(2)在任务创建页面中,有4种创建任务的方式,具体含义如下:
Based on existing job:以一个已经有的抓取任务为模板,创建所有抓取属性和抓取起始URL的列表
Based on a recovery:在以前的某个任务中,可能设置过一些状态点,新的任务将从这个设置的状态点开始。
Based on a profile:专门为不同的任务设置了一些模板,新建的任务将按照模板来生成。
With defaults:这个最简单,表示按默认的配置来生成一个任务。
(3)单击With defaults链接,创建一个新的抓取任务。
(4)在新建任务的名称上,填入任务名称。在Description中随意填入字符,然后再在seeds框中,填入待抓取的起始网址。如下图所示:
(5)单击“Modules”按钮,就进入了配置抓取时的处理链的页面。
在倒数第三项 “Select Writers ”内删除默认的“org.archive.crawler.writer.ARCWriterProcess”,加
”org.archive.crawler.writer.MirrorWriterProcessor",这样执行任务的时候抓取到的页面会以镜像的方式放在本地的目录结构中,而不是生成ARC存档文件。如下图:
(6)单击“Settings” 按钮,进入了属性设置的页面。
在属性设置页面上有非常多的输入域,Heritrix在抓取网页时,这些域是用来对的各个组件的值进行预设。由于页面上的内容非常多,使用者可能无法全部了解它们的作用。所以Heritrix提供了一个辅助功能,来在最大程度上让使用者了解每个参数的含义。在每个属性的右侧都有一个小问号,当单击问号时,就会弹出一个Javascript的Alert提示框,上面介绍了当前属性的作用。
当在第一次使用Heritrix时,所需要设置的参数并不多,以默认设置为主。但有一些参数是必须在第一次使用时就设置好的,就是HTTP-Header这个属性域。
如下图所示,红色框内是修改前后对照。其中“user-agent”中的“PROJECT_URL_HERE”对应自己的完整URL地址,“from”中设置自己的合法email地址,这两项设置其实可随便设置,只要格式规则合法即可。图中的@VERSION@设置为1.12.1,即1.12.1版本的。
(7)设置完成后,点击“Submit job”,即完成全部任务的建立工作。这时就可以在Console页面中点击start启动任务。
抓取到的所有文件在” %Heritrix_HOME%/jobs/任务名-任务时间/mirror”这个路径下,按照域名分开存放。
3.Heritrix 的扩展开发
1)Heritrix 结构分析
从上图可以看出,Heritrix总体上是一个平台结构,内部的组件都具有松耦合的特点。任何一个部分都可以进行拆卸并替换,这就给我们进行基于Heritrix的自定义开发提供了条件。
下面简单介绍一下每个组件的作用: 1.CrawlController
CrawlController(中央控制器)是抓取任务的核心组件,它控制着整个抓取的流程。
2.CrawlOrder
CrawlOrder(抓取任务)是整个抓取工作的起点,它记录了任务的所有属性,即在创建任务时的一系列设置。
3.Frontier
Frontier(链接制造工厂)负责所有链接的处理。将已经爬过的URI做标记,并将未处理的链接放入待处理队列。
4.ToeThread
ToeThread(处理线程)Heritrix是多线程的,每个 URL 被一个线程处理,这个线程就叫做 ToeThread,每个线程都会包括一条处理链,如下图所示。
5.Processor
Processor(处理器)代表着单个的处理器,所有的处理器都是它的子类。它包括以下几种:PreProcessor(预处理器)、Fetcher(获取器)、Extractor(抽取器)、Writer(存储器)、PostProcessor(后处理器)。
2)Heritrix 的组件开发
在使用Heritrix的过程中,可能会需要一些特定功能,比如说只想抓取一个域名下的网页等。这时就需要扩展原有的Heritrix,自己写一些组件来满足这些要求。
(1)扩展FrontierScheduler
首先在Heritrix工程中创建类包my.processor.,之后新建类MyFrontierScheduler。代码如下:
之后打开Heritrix目录下的module文件夹,里面是所有模块的配置文件。打开Processor.options,在里面加入一行my.processor.MyFrontierScheduler|MyFrontierScheduler。然后保存退出,之后你就可以在新建任务的时候选择使用自己扩展的FrontierScheduler了。
(2)扩展MirrorWriterProcessor
有的时候我们需要在网页下载之前将网页进行分析并提取有效内容存储起来,这时我们可以扩展MirrorWriterProcessor这个模块。利用一个开源的包htmlparser分析网页结构,并将结果存储起来。htmlparser可以在http://htmlparser.sourceforge.net 获得。将下载的包添加到项目的引用列表中。
新建MyMirrorWriterProcessor,将之前MirrorWriterProcessor的代码复制过来,改掉类名及构造函数的名称。添加新的引用:
新建一个方法AnalysisFile(),在writeToPath这个函数中调用它:
之后就可以在AnalysisFile()中处理dest这个文件,将其进行分析并保存为想要的格式。以下例子将其去掉Html标签之后封装进一个XML文件: 4.Heritrix 的常用技巧 1)只保存html类型的文件
对于大多数的搜索引擎,我们所要做的只是对于纯文本的搜索。因此只需要保存html类型的内容。Heritrix的官方文档”Heritrix User Manual”中给出了一个解决方案
在新建任务时点击”submodules”,如下图:
添加一个新的规则,类型为NotMatchesFilePatternDecideRule,并将其放置在PrerequisiteAccept-DecideRule之前,不然dns将不会被正确解析。之后在设置面板中如下设置:
这样设置之后,爬虫就会只抓取html类型的文件,而将其它类型的文件都忽略掉。
2)Queue-assignment-policy的设置。
当我们设置了在特定的域名下爬行的时候,经常会碰到永远只有一个线程在运行的情况,导致爬行十分缓慢。这是因为在默认的情况下,Heritrix使用HostnameQueueAssignmentPolicy来产生key值,从这个策略的名字,我们也可以很容易的看出,key跟hostname是有关系的。而事实上,这个策略正是用hostname作为key值的。因此一个域名下的所有链接都会放到同一个线程中去。为解决这个问题,我们新建一个策略:
这样用ELF hash算法把url尽量平均分部到各个队列中去,采集的速度大大的加快了。