以下是小编为大家整理的SQLite3 API 编程手册,本文共9篇,仅供参考,欢迎大家阅读。本文原稿由网友“好好吃饭”提供。
篇1:SQLite3 API 编程手册
作者: 字体:[增加 减小] 类型:
Sqlite3 的确很好用,小巧、速度快。但是因为非微软的产品,帮助文档总觉得不够。这些天再次研究它,又有一些收获,这里把我对 sqlite3 的研究列出来,以备忘记
前序:... 1
一、版本... 1
二、基本编译... 2
三、SQLITE操作入门... 2
(1) 基本流程... 2
(2) SQL语句操作... 4
(3) 操作二进制... 8
(4) 事务处理... 10
四、给数据库加密... 10
五、后记... 25
前序:
Sqlite3 的确很好用。小巧、速度快。但是因为非微软的产品,帮助文档总觉得不够。这些天再次研究它,又有一些收获,这里把我对 sqlite3 的研究列出来,以备忘记。
这里要注明,我是一个跨平台专注者,并不喜欢只用 windows平台。我以前的工作就是为 unix平台写代码。下面我所写的东西,虽然没有验证,但是我已尽量不使用任何 windows 的东西,只使用标准 C 或标准C++。但是,我没有尝试过在别的系统、别的编译器下编译,因此下面的叙述如果不正确,则留待以后修改。
下面我的代码仍然用 VC 编写,因为我觉得VC是一个很不错的IDE,可以加快代码编写速度(例如配合 Vassist )。下面我所说的编译环境,是VC。如果读者觉得自己习惯于 unix 下用 vi 编写代码速度较快,可以不用管我的说明,只需要符合自己习惯即可,因为我用的是标准 C 或 C++ 。不会给任何人带来不便。
一、版本
从 www.sqlite.org 网站可下载到最新的 sqlite 代码和编译版本。我写此文章时,最新代码是 3.3.17 版本。
很久没有去下载 sqlite 新代码,因此也不知道 sqlite 变化这么大。以前很多文件,现在全部合并成一个 sqlite3.c 文件。如果单独用此文件,是挺好的,省去拷贝一堆文件还担心有没有遗漏。但是也带来一个问题:此文件太大,快接近7万行代码,VC开它整个机器都慢下来了。如果不需要改它代码,也就不需要打开 sqlite3.c 文件,机器不会慢。但是,下面我要写通过修改 sqlite 代码完成加密功能,那时候就比较痛苦了。如果个人水平较高,建议用些简单的编辑器来编辑,例如 UltraEdit 或 Notepad 。速度会快很多。
二、基本编译
这个不想多说了,在 VC 里新建 dos 控制台空白工程,把 sqlite3.c 和 sqlite3.h 添加到工程,再新建一个 main.cpp 文件。在里面写:
代码如下:
extern “C”
{
#include “./sqlite3.h”
};
int main( int , char** )
{
return 0;
}
为什么要 extern “C” ?如果问这个问题,我不想说太多,这是C++的基础。要在 C++ 里使用一段 C 的代码,必须要用 extern “C” 括起来。C++跟 C虽然语法上有重叠,但是它们是两个不同的东西,内存里的布局是完全不同的,在C++编译器里不用extern “C”括起C代码,会导致编译器不知道该如何为 C 代码描述内存布局。
可能在 sqlite3.c 里人家已经把整段代码都 extern “C” 括起来了,但是你遇到一个 .c 文件就自觉的再括一次,也没什么不好。
基本工程就这样建立起来了。编译,可以通过。但是有一堆的 warning。可以不管它。
三、SQLITE操作入门
sqlite提供的是一些C函数接口,你可以用这些函数操作数据库。通过使用这些接口,传递一些标准 sql 语句(以 char * 类型)给 sqlite 函数,sqlite 就会为你操作数据库。
sqlite 跟MS的access一样是文件型数据库,就是说,一个数据库就是一个文件,此数据库里可以建立很多的表,可以建立索引、触发器等等,但是,它实际上得到的就是一个文件。备份这个文件就备份了整个数据库。
sqlite 不需要任何数据库引擎,这意味着如果你需要 sqlite 来保存一些用户数据,甚至都不需要安装数据库(如果你做个小软件还要求人家必须装了sqlserver 才能运行,那也太黑心了)。
下面开始介绍数据库基本操作。
(1) 基本流程
i.1 关键数据结构
sqlite 里最常用到的是 sqlite3 * 类型。从数据库打开开始,sqlite就要为这个类型准备好内存,直到数据库关闭,整个过程都需要用到这个类型。当数据库打开时开始,这个类型的变量就代表了你要操作的数据库。下面再详细介绍。
i.2 打开数据库
int sqlite3_open( 文件名, sqlite3 ** );
用这个函数开始数据库操作。
需要传入两个参数,一是数据库文件名,比如:c://DongChunGuang_Database.db。
文件名不需要一定存在,如果此文件不存在,sqlite 会自动建立它。如果它存在,就尝试把它当数据库文件来打开。
sqlite3 ** 参数即前面提到的关键数据结构。这个结构底层细节如何,你不要关它。
函数返回值表示操作是否正确,如果是 SQLITE_OK 则表示操作正常。相关的返回值sqlite定义了一些宏。具体这些宏的含义可以参考 sqlite3.h 文件。里面有详细定义(顺便说一下,sqlite3 的代码注释率自称是非常高的,实际上也的确很高。只要你会看英文,sqlite 可以让你学到不少东西)。
下面介绍关闭数据库后,再给一段参考代码。
i.3 关闭数据库
int sqlite3_close(sqlite3 *);
前面如果用 sqlite3_open 开启了一个数据库,结尾时不要忘了用这个函数关闭数据库。
下面给段简单的代码:
代码如下:
extern “C”
{
#include “./sqlite3.h”
};
int main( int , char** )
{
sqlite3 * db = NULL; //声明sqlite关键结构指针
int result;
//打开数据库
//需要传入 db 这个指针的指针,因为 sqlite3_open 函数要为这个指针分配内存,还要让db指针指向这个内存区
result = sqlite3_open( “c://Dcg_database.db”, &db );
if( result != SQLITE_OK )
{
//数据库打开失败
return -1;
}
//数据库操作代码
//…
//数据库打开成功
//关闭数据库
sqlite3_close( db );
return 0;
}
这就是一次数据库操作过程。
(2) SQL语句操作
本节介绍如何用sqlite 执行标准 sql 语法。
i.1 执行sql语句
int sqlite3_exec(sqlite3*, const char *sql, sqlite3_callback, void *, char **errmsg );
这就是执行一条 sql 语句的函数。
第1个参数不再说了,是前面open函数得到的指针。说了是关键数据结构。
第2个参数const char *sql 是一条 sql 语句,以/0结尾。
第3个参数sqlite3_callback 是回调,当这条语句执行之后,sqlite3会去调用你提供的这个函数。(什么是回调函数,自己找别的资料学习)
第4个参数void * 是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL。等下我们再看回调函数的写法,以及这个参数的使用。
第5个参数char ** errmsg 是错误信息。注意是指针的指针。sqlite3里面有很多固定的错误信息。执行 sqlite3_exec 之后,执行失败时可以查阅这个指针(直接 printf(“%s/n”,errmsg))得到一串字符串信息,这串信息告诉你错在什么地方。sqlite3_exec函数通过修改你传入的指针的指针,把你提供的指针指向错误提示信息,这样sqlite3_exec函数外面就可以通过这个 char*得到具体错误提示。
说明:通常,sqlite3_callback 和它后面的 void * 这两个位置都可以填 NULL。填NULL表示你不需要回调。比如你做 insert 操作,做 delete 操作,就没有必要使用回调。而当你做 select 时,就要使用回调,因为 sqlite3 把数据查出来,得通过回调告诉你查出了什么数据。
i.2 exec 的回调
typedef int (*sqlite3_callback)(void*,int,char**, char**);
你的回调函数必须定义成上面这个函数的类型。下面给个简单的例子:
代码如下:
//sqlite3的回调函数
// sqlite 每查到一条记录,就调用一次这个回调
int LoadMyInfo( void * para, int n_column, char ** column_value, char ** column_name )
{
//para是你在 sqlite3_exec 里传入的 void * 参数
//通过para参数,你可以传入一些特殊的指针(比如类指针、结构指针),然后在这里面强制转换成对应的类型(这里面是void*类型,必须强制转换成你的类型才可用)。然后操作这些数据
//n_column是这一条记录有多少个字段 (即这条记录有多少列)
// char ** column_value 是个关键值,查出来的数据都保存在这里,它实际上是个1维数组(不要以为是2维数组),每一个元素都是一个 char * 值,是一个字段内容(用字符串来表示,以/0结尾)
//char ** column_name 跟 column_value是对应的,表示这个字段的字段名称
//这里,我不使用 para 参数。忽略它的存在.
int i;
printf( “记录包含 %d 个字段/n”, n_column );
for( i = 0 ; i < n_column; i ++ )
{
printf( “字段名:%s ß>字段值:%s/n”, column_name[i], column_value[i] );
}
printf( “------------------/n“ );
return 0;
}
int main( int , char ** )
{
sqlite3 * db;
int result;
char * errmsg = NULL;
result = sqlite3_open( “c://Dcg_database.db”, &db );
if( result != SQLITE_OK )
{
//数据库打开失败
return -1;
}
//数据库操作代码
//创建一个测试表,表名叫 MyTable_1,有2个字段: ID 和 name。其中ID是一个自动增加的类型,以后insert时可以不去指定这个字段,它会自己从0开始增加
result = sqlite3_exec( db, “create table MyTable_1( ID integer primary key autoincrement, name nvarchar(32) )”, NULL, NULL, errmsg );
if(result != SQLITE_OK )
{
printf( “创建表失败,错误码:%d,错误原因:%s/n”, result, errmsg );
}
//插入一些记录
result = sqlite3_exec( db, “insert into MyTable_1( name ) values ( ‘走路‘ )”, 0, 0, errmsg );
if(result != SQLITE_OK )
{
printf( “插入记录失败,错误码:%d,错误原因:%s/n”, result, errmsg );
}
result = sqlite3_exec( db, “insert into MyTable_1( name ) values ( ‘骑单车‘ )”, 0, 0, errmsg );
if(result != SQLITE_OK )
{
printf( “插入记录失败,错误码:%d,错误原因:%s/n”, result, errmsg );
}
result = sqlite3_exec( db, “insert into MyTable_1( name ) values ( ‘坐汽车‘ )”, 0, 0, errmsg );
if(result != SQLITE_OK )
{
printf( “插入记录失败,错误码:%d,错误原因:%s/n”, result, errmsg );
}
//开始查询数据库
result = sqlite3_exec( db, “select * from MyTable_1”, LoadMyInfo, NULL, errmsg );
//关闭数据库
sqlite3_close( db );
return 0;
}
通过上面的例子,应该可以知道如何打开一个数据库,如何做数据库基本操作。
有这些知识,基本上可以应付很多数据库操作了。
i.3 不使用回调查询数据库
上面介绍的 sqlite3_exec 是使用回调来执行 select 操作。还有一个方法可以直接查询而不需要回调。但是,我个人感觉还是回调好,因为代码可以更加整齐,只不过用回调很麻烦,你得声明一个函数,如果这个函数是类成员函数,你还不得不把它声明成 static 的(要问为什么?这又是C++基础了。C++成员函数实际上隐藏了一个参数:this,C++调用类的成员函数的时候,隐含把类指针当成函数的第一个参数传递进去。结果,这造成跟前面说的 sqlite 回调函数的参数不相符。只有当把成员函数声明成 static 时,它才没有多余的隐含的this参数)。
虽然回调显得代码整齐,但有时候你还是想要非回调的 select 查询。这可以通过 sqlite3_get_table 函数做到。
int sqlite3_get_table(sqlite3*, const char *sql, char ***resultp, int *nrow, int *ncolumn, char **errmsg );
第1个参数不再多说,看前面的例子。
第2个参数是 sql 语句,跟 sqlite3_exec 里的 sql 是一样的。是一个很普通的以/0结尾的char *字符串。
第3个参数是查询结果,它依然一维数组(不要以为是二维数组,更不要以为是三维数组)。它内存布局是:第一行是字段名称,后面是紧接着是每个字段的值。下面用例子来说事。
第4个参数是查询出多少条记录(即查出多少行)。
第5个参数是多少个字段(多少列)。
第6个参数是错误信息,跟前面一样,这里不多说了。
下面给个简单例子:
代码如下:
int main( int , char ** )
{
sqlite3 * db;
int result;
char * errmsg = NULL;
char **dbResult; //是 char ** 类型,两个*号
int nRow, nColumn;
int i , j;
int index;
result = sqlite3_open( “c://Dcg_database.db”, &db );
if( result != SQLITE_OK )
{
//数据库打开失败
return -1;
}
//数据库操作代码
//假设前面已经创建了 MyTable_1 表
//开始查询,传入的 dbResult 已经是 char **,这里又加了一个 & 取地址符,传递进去的就成了 char ***
result = sqlite3_get_table( db, “select * from MyTable_1”, &dbResult, &nRow, &nColumn, &errmsg );
if( SQLITE_OK == result )
{
//查询成功
index = nColumn; //前面说过 dbResult 前面第一行数据是字段名称,从 nColumn 索引开始才是真正的数据
printf( “查到%d条记录/n”, nRow );
for( i = 0; i < nRow ; i++ )
{
printf( “第 %d 条记录/n”, i+1 );
for( j = 0 ; j < nColumn; j++ )
{
printf( “字段名:%s ß>字段值:%s/n”, dbResult[j], dbResult [index] );
++index; // dbResult 的字段值是连续的,从第0索引到第 nColumn - 1索引都是字段名称,从第 nColumn 索引开始,后面都是字段值,它把一个二维的表(传统的行列表示法)用一个扁平的形式来表示
}
printf( “-------/n” );
}
}
//到这里,不论数据库查询是否成功,都释放 char** 查询结果,使用 sqlite 提供的功能来释放
sqlite3_free_table( dbResult );
//关闭数据库
sqlite3_close( db );
return 0;
}
到这个例子为止,sqlite3 的常用用法都介绍完了。
用以上的方法,再配上 sql 语句,完全可以应付绝大多数数据库需求。
但有一种情况,用上面方法是无法实现的:需要insert、select 二进制。当需要处理二进制数据时,上面的方法就没办法做到。下面这一节说明如何插入二进制数据
(2) 操作二进制
sqlite 操作二进制数据需要用一个辅助的数据类型:sqlite3_stmt * 。
这个数据类型记录了一个“sql语句”。为什么我把 “sql语句” 用双引号引起来?因为你可以把 sqlite3_stmt * 所表示的内容看成是 sql语句,但是实际上它不是我们所熟知的sql语句。它是一个已经把sql语句解析了的、用sqlite自己标记记录的内部数据结构。
正因为这个结构已经被解析了,所以你可以往这个语句里插入二进制数据。当然,把二进制数据插到 sqlite3_stmt 结构里可不能直接 memcpy ,也不能像 std::string 那样用 + 号。必须用 sqlite 提供的函数来插入。
i.1 写入二进制
下面说写二进制的步骤。
要插入二进制,前提是这个表的字段的类型是 blob 类型。我假设有这么一张表:
create table Tbl_2( ID integer, file_content blob )
首先声明
sqlite3_stmt * stat;
然后,把一个 sql 语句解析到 stat 结构里去:
sqlite3_prepare( db, “insert into Tbl_2( ID, file_content) values( 10, ? )”, -1, &stat, 0 );
上面的函数完成 sql 语句的解析。第一个参数跟前面一样,是个 sqlite3 * 类型变量,第二个参数是一个 sql 语句。
这个 sql 语句特别之处在于 values 里面有个 ? 号。在sqlite3_prepare函数里,?号表示一个未定的值,它的值等下才插入。
第三个参数我写的是-1,这个参数含义是前面 sql 语句的长度。如果小于0,sqlite会自动计算它的长度(把sql语句当成以/0结尾的字符串)。
第四个参数是 sqlite3_stmt 的指针的指针。解析以后的sql语句就放在这个结构里。
第五个参数我也不知道是干什么的。为0就可以了。
如果这个函数执行成功(返回值是 SQLITE_OK 且 stat 不为NULL ),那么下面就可以开始插入二进制数据。
sqlite3_bind_blob( stat, 1, pdata, (int)(length_of_data_in_bytes), NULL ); // pdata为数据缓冲区,length_of_data_in_bytes为数据大小,以字节为单位
这个函数一共有5个参数。
第1个参数:是前面prepare得到的 sqlite3_stmt * 类型变量。
第2个参数:?号的索引。前面prepare的sql语句里有一个?号,假如有多个?号怎么插入?方法就是改变 bind_blob 函数第2个参数。这个参数我写1,表示这里插入的值要替换 stat 的第一个?号(这里的索引从1开始计数,而非从0开始)。如果你有多个?号,就写多个 bind_blob 语句,并改变它们的第2个参数就替换到不同的?号。如果有?号没有替换,sqlite为它取值null。
第3个参数:二进制数据起始指针。
第4个参数:二进制数据的长度,以字节为单位。
第5个参数:是个析够回调函数,告诉sqlite当把数据处理完后调用此函数来析够你的数据。这个参数我还没有使用过,因此理解也不深刻。但是一般都填NULL,需要释放的内存自己用代码来释放。
bind完了之后,二进制数据就进入了你的“sql语句”里了。你现在可以把它保存到数据库里:
int result = sqlite3_step( stat );
通过这个语句,stat 表示的sql语句就被写到了数据库里。
最后,要把 sqlite3_stmt 结构给释放:
sqlite3_finalize( stat ); //把刚才分配的内容析构掉
i.2 读出二进制
下面说读二进制的步骤。
跟前面一样,先声明 sqlite3_stmt * 类型变量:
sqlite3_stmt * stat;
然后,把一个 sql 语句解析到 stat 结构里去:
sqlite3_prepare( db, “select * from Tbl_2”, -1, &stat, 0 );
当 prepare 成功之后(返回值是 SQLITE_OK ),开始查询数据。
int result = sqlite3_step( stat );
这一句的返回值是 SQLITE_ROW 时表示成功(不是 SQLITE_OK )。
你可以循环执行 sqlite3_step 函数,一次 step 查询出一条记录。直到返回值不为 SQLITE_ROW 时表示查询结束。
然后开始获取第一个字段:ID 的值。ID是个整数,用下面这个语句获取它的值:
int id = sqlite3_column_int( stat, 0 ); //第2个参数表示获取第几个字段内容,从0开始计算,因为我的表的ID字段是第一个字段,因此这里我填0
下面开始获取 file_content 的值,因为 file_content 是二进制,因此我需要得到它的指针,还有它的长度:
const void * pFileContent = sqlite3_column_blob( stat, 1 );
int len = sqlite3_column_bytes( stat, 1 );
这样就得到了二进制的值。
把 pFileContent 的内容保存出来之后,不要忘了释放 sqlite3_stmt 结构:
sqlite3_finalize( stat ); //把刚才分配的内容析构掉
i.3 重复使用 sqlite3_stmt 结构
如果你需要重复使用 sqlite3_prepare 解析好的 sqlite3_stmt 结构,需要用函数: sqlite3_reset。
result = sqlite3_reset(stat);
这样, stat 结构又成为 sqlite3_prepare 完成时的状态,你可以重新为它 bind 内容。
(4) 事务处理
sqlite 是支持事务处理的。如果你知道你要同步删除很多数据,不仿把它们做成一个统一的事务。
通常一次 sqlite3_exec 就是一次事务,如果你要删除1万条数据,sqlite就做了1万次:开始新事务->删除一条数据->提交事务->开始新事务->… 的过程。这个操作是很慢的。因为时间都花在了开始事务、提交事务上。
你可以把这些同类操作做成一个事务,这样如果操作错误,还能够回滚事务。
事务的操作没有特别的接口函数,它就是一个普通的 sql 语句而已:
分别如下:
代码如下:
int result;
result = sqlite3_exec( db, “begin transaction”, 0, 0, &zErrorMsg ); //开始一个事务
result = sqlite3_exec( db, “commit transaction”, 0, 0, &zErrorMsg ); //提交事务
result = sqlite3_exec( db, “rollback transaction”, 0, 0, &zErrorMsg ); //回滚事务
一、给数据库加密
前面所说的内容网上已经有很多资料,虽然比较零散,但是花点时间也还是可以找到的。现在要说的这个――数据库加密,资料就很难找。也可能是我操作水平不够,找不到对应资料。但不管这样,我还是通过网上能找到的很有限的资料,探索出了给sqlite数据库加密的完整步骤。
这里要提一下,虽然 sqlite 很好用,速度快、体积小巧。但是它保存的文件却是明文的。若不信可以用 NotePad 打开数据库文件瞧瞧,里面 insert 的内容几乎一览无余。这样赤裸裸的展现自己,可不是我们的初衷。当然,如果你在嵌入式系统、智能手机上使用 sqlite,最好是不加密,因为这些系统运算能力有限,你做为一个新功能提供者,不能把用户有限的运算能力全部花掉。
Sqlite为了速度而诞生。因此Sqlite本身不对数据库加密,要知道,如果你选择标准AES算法加密,那么一定有接近50%的时间消耗在加解密算法上,甚至更多(性能主要取决于你算法编写水平以及你是否能使用cpu提供的底层运算能力,比如MMX或sse系列指令可以大幅度提升运算速度)。
Sqlite免费版本是不提供加密功能的,当然你也可以选择他们的收费版本,那你得支付块钱,而且是USD。我这里也不是说支付钱不好,如果只为了数据库加密就去支付2000块,我觉得划不来。因为下面我将要告诉你如何为免费的Sqlite扩展出加密模块――自己动手扩展,这是Sqlite允许,也是它提倡的。
那么,就让我们一起开始为 sqlite3.c 文件扩展出加密模块。
i.1 必要的宏
通过阅读 Sqlite 代码(当然没有全部阅读完,6万多行代码,没有一行是我习惯的风格,我可没那么多眼神去看),我搞清楚了两件事:
Sqlite是支持加密扩展的;
需要 #define 一个宏才能使用加密扩展。
这个宏就是
SQLITE_HAS_CODEC。
你在代码最前面(也可以在 sqlite3.h 文件第一行)定义:
#ifndef SQLITE_HAS_CODEC
#define SQLITE_HAS_CODEC
#endif
如果你在代码里定义了此宏,但是还能够正常编译,那么应该是操作没有成功。因为你应该会被编译器提示有一些函数无法链接才对。如果你用的是 VC 2003,你可以在“解决方案”里右键点击你的工程,然后选“属性”,找到“C/C ”,再找到“命令行”,在里面手工添加“/D “SQLITE_HAS_CODEC””。
定义了这个宏,一些被 Sqlite 故意屏蔽掉的代码就被使用了。这些代码就是加解密的接口。
尝试编译,vc会提示你有一些函数无法链接,因为找不到他们的实现。
如果你也用的是VC2003,那么会得到下面的提示:
error LNK: 无法解析的外部符号 _sqlite3CodecGetKey ,该符号在函数 _attachFunc 中被引用
error LNK2019: 无法解析的外部符号 _sqlite3CodecAttach ,该符号在函数 _attachFunc 中被引用
error LNK2019: 无法解析的外部符号 _sqlite3_activate_see,该符号在函数 _sqlite3Pragma 中被引用
error LNK2019: 无法解析的外部符号 _sqlite3_key ,该符号在函数 _sqlite3Pragma 中被引用
fatal error LNK1120: 4 个无法解析的外部命令
这是正常的,因为Sqlite只留了接口而已,并没有给出实现。
下面就让我来实现这些接口。
i.2 自己实现加解密接口函数
如果真要我从一份 www.sqlite.org 网上down下来的 sqlite3.c 文件,直接摸索出这些接口的实现,我认为我还没有这个能力。
好在网上还有一些代码已经实现了这个功能。通过参照他们的代码以及不断编译中vc给出的错误提示,最终我把整个接口整理出来,
实现这些预留接口不是那么容易,要重头说一次怎么回事很困难。我把代码都写好了,直接把他们按我下面的说明拷贝到 sqlite3.c 文件对应地方即可。我在下面也提供了sqlite3.c 文件,可以直接参考或取下来使用。
这里要说一点的是,我另外新建了两个文件:crypt.c和crypt.h。
其中crypt.h如此定义:
#ifndef DCG_SQLITE_CRYPT_FUNC_
#define DCG_SQLITE_CRYPT_FUNC_
***********/
int My_DeEncrypt_Func( unsigned char * pData, unsigned int data_len, const char * key, unsigned int len_of_key );
#endif
其中的 crypt.c 如此定义:
#include “./crypt.h”
#include “memory.h”
int My_Encrypt_Func( unsigned char * pData, unsigned int data_len, const char * key, unsigned int len_of_key )
{
return 0;
}
int My_DeEncrypt_Func( unsigned char * pData, unsigned int data_len, const char * key, unsigned int len_of_key )
{
return 0;
}
这个文件很容易看,就两函数,一个加密一个解密。传进来的参数分别是待处理的数据、数据长度、密钥、密钥长度。
处理时直接把结果作用于 pData 指针指向的内容。
你需要定义自己的加解密过程,就改动这两个函数,其它部分不用动。扩展起来很简单。
这里有个特点,data_len 一般总是 1024 字节。正因为如此,你可以在你的算法里使用一些特定长度的加密算法,比如AES要求被加密数据一定是128位(16字节)长。这个1024不是碰巧,而是 Sqlite 的页定义是1024字节,在sqlite3.c文件里有定义:
# define SQLITE_DEFAULT_PAGE_SIZE 1024
你可以改动这个值,不过还是建议没有必要不要去改它。
上面写了两个扩展函数,如何把扩展函数跟 Sqlite 挂接起来,这个过程说起来比较麻烦。我直接贴代码。
分3个步骤。
首先,在 sqlite3.c 文件顶部,添加下面内容:
#ifdef SQLITE_HAS_CODEC
#include “./crypt.h”
void sqlite3pager_free_codecarg(void *pArg);
#endif
这个函数之所以要在 sqlite3.c 开头声明,是因为下面在 sqlite3.c 里面某些函数里要插入这个函数调用。所以要提前声明。
其次,在sqlite3.c文件里搜索“sqlite3PagerClose”函数,要找到它的实现代码(而不是声明代码)。
实现代码里一开始是:
#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
ThreadData *pTsd = sqlite3ThreadData;
assert( pPager );
assert( pTsd && pTsd->nAlloc );
#endif
需要在这部分后面紧接着插入:
#ifdef SQLITE_HAS_CODEC
sqlite3pager_free_codecarg(pPager->pCodecArg);
#endif
这里要注意,sqlite3PagerClose 函数大概也是 3.3.17版本左右才改名的,以前版本里是叫 “sqlite3pager_close”。因此你在老版本sqlite代码里搜索“sqlite3PagerClose”是搜不到的。
类似的还有“sqlite3pager_get”、“sqlite3pager_unref”、“sqlite3pager_write”、“sqlite3pager_pagecount”等都是老版本函数,它们在 pager.h 文件里定义。新版本对应函数是在 sqlite3.h 里定义(因为都合并到 sqlite3.c和sqlite3.h两文件了)。所以,如果你在使用老版本的sqlite,先看看 pager.h 文件,这些函数不是消失了,也不是新蹦出来的,而是老版本函数改名得到的。
最后,往sqlite3.c 文件下找。找到最后一行:
在这一行后面,接上本文最下面的代码段。
这些代码很长,我不再解释,直接接上去就得了。
唯一要提的是 DeriveKey 函数。这个函数是对密钥的扩展。比如,你要求密钥是128位,即是16字节,但是如果用户只输入 1个字节呢?2个字节呢?或输入50个字节呢?你得对密钥进行扩展,使之符合16字节的要求。
DeriveKey 函数就是做这个扩展的。有人把接收到的密钥求md5,这也是一个办法,因为md5运算结果固定16字节,不论你有多少字符,最后就是16字节。这是md5算法的特点。但是我不想用md5,因为还得为它添加包含一些 md5 的.c或.cpp文件。我不想这么做。我自己写了一个算法来扩展密钥,很简单的算法。当然,你也可以使用你的扩展方法,也而可以使用 md5 算法。只要修改 DeriveKey 函数就可以了。
在 DeriveKey 函数里,只管申请空间构造所需要的密钥,不需要释放,因为在另一个函数里有释放过程,而那个函数会在数据库关闭时被调用。参考我的 DeriveKey 函数来申请内存。
这里我给出我已经修改好的 sqlite3.c 和 sqlite3.h 文件。
如果太懒,就直接使用这两个文件,编译肯定能通过,运行也正常。当然,你必须按我前面提的,新建 crypt.h 和 crypt.c 文件,而且函数要按我前面定义的要求来做。
i.3 加密使用方法:
现在,你代码已经有了加密功能。
你要把加密功能给用上,除了改 sqlite3.c 文件、给你工程添加 SQLITE_HAS_CODEC 宏,还得修改你的数据库调用函数。
前面提到过,要开始一个数据库操作,必须先 sqlite3_open 。
加解密过程就在 sqlite3_open 后面操作。
假设你已经 sqlite3_open 成功了,紧接着写下面的代码:
int i;
//添加、使用密码
i = sqlite3_key( db, “dcg”, 3 );
//修改密码
i = sqlite3_rekey( db, “dcg”, 0 );
用 sqlite3_key 函数来提交密码。
第1个参数是 sqlite3 * 类型变量,代表着用 sqlite3_open 打开的数据库(或新建数据库)。
第2个参数是密钥。
第3个参数是密钥长度。
用 sqlite3_rekey 来修改密码。参数含义同 sqlite3_key。
实际上,你可以在sqlite3_open函数之后,到 sqlite3_close 函数之前任意位置调用 sqlite3_key 来设置密码。
但是如果你没有设置密码,而数据库之前是有密码的,那么你做任何操作都会得到一个返回值:SQLITE_NOTADB,并且得到错误提示:“file is encrypted or is not a database”。
只有当你用 sqlite3_key 设置了正确的密码,数据库才会正常工作。
如果你要修改密码,前提是你必须先 sqlite3_open 打开数据库成功,然后 sqlite3_key 设置密钥成功,之后才能用 sqlite3_rekey 来修改密码。
如果数据库有密码,但你没有用 sqlite3_key 设置密码,那么当你尝试用 sqlite3_rekey 来修改密码时会得到 SQLITE_NOTADB 返回值。
如果你需要清空密码,可以使用:
//修改密码
i = sqlite3_rekey( db, NULL, 0 );
来完成密码清空功能。
i.4 sqlite3.c 最后添加代码段
代码如下:
#ifdef SQLITE_HAS_CODEC
#define CRYPT_OFFSET 8
typedef struct _CryptBlock
{
BYTE* ReadKey; // 读数据库和写入事务的密钥
BYTE* WriteKey; // 写入数据库的密钥
int PageSize; // 页的大小
BYTE* Data;
} CryptBlock, *LPCryptBlock;
#ifndef DB_KEY_LENGTH_BYTE
#define DB_KEY_LENGTH_BYTE 16
#endif
#ifndef DB_KEY_PADDING
#define DB_KEY_PADDING 0x33
#endif
void sqlite3CodecGetKey(sqlite3* db, int nDB, void** Key, int* nKey)
{
return ;
}
int sqlite3CodecAttach(sqlite3 *db, int nDb, const void *pKey, int nKeyLen);
void sqlite3_activate_see(const char* right )
{
return;
}
int sqlite3_key(sqlite3 *db, const void *pKey, int nKey);
int sqlite3_rekey(sqlite3 *db, const void *pKey, int nKey);
// 从用户提供的缓冲区中得到一个加密密钥
// 用户提供的密钥可能位数上满足不了要求,使用这个函数来完成密钥扩展
static unsigned char * DeriveKey(const void *pKey, int nKeyLen);
//创建或更新一个页的加密算法索引.此函数会申请缓冲区.
static LPCryptBlock CreateCryptBlock(unsigned char* hKey, Pager *pager, LPCryptBlock pExisting);
//加密/解密函数, 被pager调用
void * sqlite3Codec(void *pArg, unsigned char *data, Pgno nPageNum, int nMode);
//设置密码函数
int __stdcall sqlite3_key_interop(sqlite3 *db, const void *pKey, int nKeySize);
// 修改密码函数
int __stdcall sqlite3_rekey_interop(sqlite3 *db, const void *pKey, int nKeySize);
//销毁一个加密块及相关的缓冲区,密钥.
static void DestroyCryptBlock(LPCryptBlock pBlock);
static void * sqlite3pager_get_codecarg(Pager *pPager);
void sqlite3pager_set_codec(Pager *pPager,void *(*xCodec)(void*,void*,Pgno,int),void *pCodecArg );
//加密/解密函数, 被pager调用
void * sqlite3Codec(void *pArg, unsigned char *data, Pgno nPageNum, int nMode)
{
LPCryptBlock pBlock = (LPCryptBlock)pArg;
unsigned int dwPageSize = 0;
if (!pBlock) return data;
// 确保pager的页长度和加密块的页长度相等.如果改变,就需要调整.
if (nMode != 2)
{
PgHdr *pageHeader;
pageHeader = DATA_TO_PGHDR(data);
if (pageHeader->pPager->pageSize != pBlock->PageSize)
{
CreateCryptBlock(0, pageHeader->pPager, pBlock);
}
}
switch(nMode)
{
case 0: // Undo a “case 7” journal file encryption
case 2: //重载一个页
case 3: //载入一个页
if (!pBlock->ReadKey) break;
dwPageSize = pBlock->PageSize;
My_DeEncrypt_Func(data, dwPageSize, pBlock->ReadKey, DB_KEY_LENGTH_BYTE );
break;
case 6: //加密一个主数据库文件的页
if (!pBlock->WriteKey) break;
memcpy(pBlock->Data CRYPT_OFFSET, data, pBlock->PageSize);
data = pBlock->Data CRYPT_OFFSET;
dwPageSize = pBlock->PageSize;
My_Encrypt_Func(data , dwPageSize, pBlock->WriteKey, DB_KEY_LENGTH_BYTE );
break;
case 7: //加密事务文件的页
if (!pBlock->ReadKey) break;
memcpy(pBlock->Data CRYPT_OFFSET, data, pBlock->PageSize);
data = pBlock->Data CRYPT_OFFSET;
dwPageSize = pBlock->PageSize;
My_Encrypt_Func( data, dwPageSize, pBlock->ReadKey, DB_KEY_LENGTH_BYTE );
break;
}
return data;
}
//
销毁一个加密块及相关的缓冲区,密钥.
static void DestroyCryptBlock(LPCryptBlock pBlock)
{
//销毁读密钥.
if (pBlock->ReadKey){
sqliteFree(pBlock->ReadKey);
}
//如果写密钥存在并且不等于读密钥,也销毁.
if (pBlock->WriteKey && pBlock->WriteKey != pBlock->ReadKey){
sqliteFree(pBlock->WriteKey);
}
if(pBlock->Data){
sqliteFree(pBlock->Data);
}
//释放加密块.
sqliteFree(pBlock);
}
static void * sqlite3pager_get_codecarg(Pager *pPager)
{
return (pPager->xCodec) ? pPager->pCodecArg: NULL;
}
// 从用户提供的缓冲区中得到一个加密密钥
static unsigned char * DeriveKey(const void *pKey, int nKeyLen)
{
unsigned char * hKey = NULL;
int j;
if( pKey == NULL || nKeyLen == 0 )
{
return NULL;
}
hKey = sqliteMalloc( DB_KEY_LENGTH_BYTE 1 );
if( hKey == NULL )
{
return NULL;
}
hKey[ DB_KEY_LENGTH_BYTE ] = 0;
if( nKeyLen < DB_KEY_LENGTH_BYTE )
{
memcpy( hKey, pKey, nKeyLen ); //先拷贝得到密钥前面的部分
j = DB_KEY_LENGTH_BYTE - nKeyLen;
//补充密钥后面的部分
memset( hKey nKeyLen, DB_KEY_PADDING, j );
}
else
{ //密钥位数已经足够,直接把密钥取过来
memcpy( hKey, pKey, DB_KEY_LENGTH_BYTE );
}
return hKey;
}
//创建或更新一个页的加密算法索引.此函数会申请缓冲区.
static LPCryptBlock CreateCryptBlock(unsigned char* hKey, Pager *pager, LPCryptBlock pExisting)
{
LPCryptBlock pBlock;
if (!pExisting) //创建新加密块
{
pBlock = sqliteMalloc(sizeof(CryptBlock));
memset(pBlock, 0, sizeof(CryptBlock));
pBlock->ReadKey = hKey;
pBlock->WriteKey = hKey;
pBlock->PageSize = pager->pageSize;
pBlock->Data = (unsigned char*)sqliteMalloc(pBlock->PageSize CRYPT_OFFSET);
}
else //更新存在的加密块
{
pBlock = pExisting;
if ( pBlock->PageSize != pager->pageSize && !pBlock->Data){
sqliteFree(pBlock->Data);
pBlock->PageSize = pager->pageSize;
pBlock->Data = (unsigned char*)sqliteMalloc(pBlock->PageSize CRYPT_OFFSET);
}
}
memset(pBlock->Data, 0, pBlock->PageSize CRYPT_OFFSET);
return pBlock;
}
void sqlite3pager_set_codec(
Pager *pPager,
void *(*xCodec)(void*,void*,Pgno,int),
void *pCodecArg
)
{
pPager->xCodec = xCodec;
pPager->pCodecArg = pCodecArg;
}
int sqlite3_key(sqlite3 *db, const void *pKey, int nKey)
{
return sqlite3_key_interop(db, pKey, nKey);
}
int sqlite3_rekey(sqlite3 *db, const void *pKey, int nKey)
{
return sqlite3_rekey_interop(db, pKey, nKey);
}
int sqlite3CodecAttach(sqlite3 *db, int nDb, const void *pKey, int nKeyLen)
{
int rc = SQLITE_ERROR;
unsigned char* hKey = 0;
//如果没有指定密匙,可能标识用了主数据库的加密或没加密.
if (!pKey || !nKeyLen)
{
if (!nDb)
{
return SQLITE_OK; //主数据库, 没有指定密钥所以没有加密.
}
else //附加数据库,使用主数据库的密钥.
{
//获取主数据库的加密块并复制密钥给附加数据库使用
LPCryptBlock pBlock = (LPCryptBlock)sqlite3pager_get_codecarg(sqlite3BtreePager(db->aDb[0].pBt));
if (!pBlock) return SQLITE_OK; //主数据库没有加密
if (!pBlock->ReadKey) return SQLITE_OK; //没有加密
memcpy(pBlock->ReadKey, &hKey, 16);
}
}
else //用户提供了密码,从中创建密钥.
{
hKey = DeriveKey(pKey, nKeyLen);
}
//创建一个新的加密块,并将解码器指向新的附加数据库.
if (hKey)
{
LPCryptBlock pBlock = CreateCryptBlock(hKey, sqlite3BtreePager(db->aDb[nDb].pBt), NULL);
sqlite3pager_set_codec(sqlite3BtreePager(db->aDb[nDb].pBt), sqlite3Codec, pBlock);
rc = SQLITE_OK;
}
return rc;
}
// Changes the encryption key for an existing database.
int __stdcall sqlite3_rekey_interop(sqlite3 *db, const void *pKey, int nKeySize)
{
Btree *pbt = db->aDb[0].pBt;
Pager *p = sqlite3BtreePager(pbt);
LPCryptBlock pBlock = (LPCryptBlock)sqlite3pager_get_codecarg(p);
unsigned char * hKey = DeriveKey(pKey, nKeySize);
int rc = SQLITE_ERROR;
if (!pBlock && !hKey) return SQLITE_OK;
//重新加密一个数据库,改变pager的写密钥, 读密钥依旧保留.
if (!pBlock) //加密一个未加密的数据库
{
pBlock = CreateCryptBlock(hKey, p, NULL);
pBlock->ReadKey = 0; // 原始数据库未加密
sqlite3pager_set_codec(sqlite3BtreePager(pbt), sqlite3Codec, pBlock);
}
else // 改变已加密数据库的写密钥
{
pBlock->WriteKey = hKey;
}
// 开始一个事务
rc = sqlite3BtreeBeginTrans(pbt, 1);
if (!rc)
{
// 用新密钥重写所有的页到数据库。
Pgno nPage = sqlite3PagerPagecount(p);
Pgno nSkip = PAGER_MJ_PGNO(p);
void *pPage;
Pgno n;
for(n = 1; rc == SQLITE_OK && n <= nPage; n )
{
if (n == nSkip) continue;
rc = sqlite3PagerGet(p, n, &pPage);
if(!rc)
{
rc = sqlite3PagerWrite(pPage);
sqlite3PagerUnref(pPage);
}
}
}
// 如果成功,提交事务。
if (!rc)
{
rc = sqlite3BtreeCommit(pbt);
}
// 如果失败,回滚。
if (rc)
{
sqlite3BtreeRollback(pbt);
}
// 如果成功,销毁先前的读密钥。并使读密钥等于当前的写密钥。
if (!rc)
{
if (pBlock->ReadKey)
{
sqliteFree(pBlock->ReadKey);
}
pBlock->ReadKey = pBlock->WriteKey;
}
else// 如果失败,销毁当前的写密钥,并恢复为当前的读密钥。
{
if (pBlock->WriteKey)
{
sqliteFree(pBlock->WriteKey);
}
pBlock->WriteKey = pBlock->ReadKey;
}
// 如果读密钥和写密钥皆为空,就不需要再对页进行编解码。
// 销毁加密块并移除页的编解码器
if (!pBlock->ReadKey && !pBlock->WriteKey)
{
sqlite3pager_set_codec(p, NULL, NULL);
DestroyCryptBlock(pBlock);
}
return rc;
}
int __stdcall sqlite3_key_interop(sqlite3 *db, const void *pKey, int nKeySize)
{
return sqlite3CodecAttach(db, 0, pKey, nKeySize);
}
// 释放与一个页相关的加密块
void sqlite3pager_free_codecarg(void *pArg)
{
if (pArg)
DestroyCryptBlock((LPCryptBlock)pArg);
}
#endif //#ifdef SQLITE_HAS_CODEC
篇2:编程辞职信
尊敬的公司领导、xx:
您们好!我也是带着忐忑的心情写这次致信。由于XXX当初对我的信任与举荐,才使我一名还未毕业的学生获得了进公司工作的宝贵机会,这份感激溢于言表,也使得我在做出离职决定时甚感愧疚。刚出校门的学生就像一张白纸,虽然在公司时间很短,之前的这张白纸已经多了一些色彩,成为了我职业生涯的一笔财富。
公司人性化的管理、健全的制度、丰厚的福利都让我感受到了正规大公司的优越性。由于个人工作经验及编程能力的不足,致使现在还不能很独立的去解决实际问题,面对未处理过的问题时总会措手无策。考虑到个人能力增长情况,一段时间内这种状况都不会明显改善。为了不影响公司业务的'开展,遂决定辞职。望给予批准。
最后,衷心感谢各位领导及同事在生活和工作当中的关照!祝大家新年愉快!同时这段时间我将继续做好本职工作与交接事宜。
此致
敬礼
xx
xx年xx月xx日
篇3:编程年度工作总结
时光匆匆,转眼一年又已经过去。回想进厂来的工作,有收获也有遗憾。在一次又一次的实践中培养着自己的工作能力,同时也暴露自己的不足,从中得到宝贵的经验和教训。现把我这半年的工作做出如下的总结:
一、这是我第一次参加工作,在专业知识及工作经验的方面可以说一片空白。通过厂里和分厂的各种培训,从中我了解到公司、转包分厂的各种工作纪律和工作流程及数控方面的知识。
二、由于刚进厂,我的工作主要是现场实习。学习数控方面的知识、数控编程及机械生产加工技术。我先在NEW SAJO 10000实习。NEW SAJO 10000是一台主轴偏摆式五轴加工中心,采用的西门子系统。跟着几位师父完成了几个零件的试制。其中有SNECMA的六级机匣、七级机匣、八级机匣、九级机匣、七级静子支撑、八级静子支撑。通过这段时间的实习,我了解了NEW SAJO 10000操作面板及基本操作,学习并能了解西门子数控程序。
三、接着跟着师傅在HCMC—15中进行SNECMA的锁盘、GOODRICH环件岐管支撑环162445、1712M64G02的试制。HCMC—15是一台三轴加工中心,采用的是FANUC系统。由于是三轴,在很多方面受到限制,而且在找正等方面也比五轴麻烦。FANUC系统比西门子系统编程简单,不过规范性强。通过我们的努力,解决了锁盘位置问题、改善了岐管支撑环刀具磨损问题。接着和师傅在NEW SAJO10000、MANDELLI M8中完成了风扇轴056—000—474—6,056—000—500—6的铣加工工序试制。
四、最后在师傅的帮助和指导下,我试着编写简单的数控程序及操作指导书的编制。在PV1000中,跟着师傅完成了涡轮定位销、锁紧垫圈等HONEYWELL件号及GE的转接螺母件号的首件试制。这是我第一次在师傅的指导下自己操作机床,从而学习并了解了机械加工中参数及尺寸的保证。
今年是我进转包分厂的第一年,虽然在过去的半年里工作方面有些许的进步,但和合格技术人员的标准还有很大的距离,因此,在以后的工作和学习中,我会更加努力,努力学习数控铣工工艺的编制、数控程序的编制以及机械加工技术,特别是在CAD/CAM软件的应用方面作出更大的努力。为转包的未来做一定的贡献。
篇4:编程年度工作总结
工作四年了,保持着每年写一份总结的习惯。
我很希望总结有一个醒目的名字,比如从XX到XX,或者薪水从XXX到XXXXX这样。可惜什么都没有,我的职位依然是软件开发,薪水依然是那么多。现在经济萧条,估计也没什么希望涨钱了。
对于怀有远大抱负的同学,这份总结应该是份反面教材。
记得去年写总结的时候心情很差,抱怨了很多当时的工作以及领导花生,那个时候的愿望是找一份新工作。没想到刚进入12月我就找到了。
不得不说这一次求职我是认真的把它当作一个工程去做,客观得对自己进行了定位,而且非常重要的是明确我想要的工作到底是什么样的。我需要的是让我每天的8小时能够享受工作的快乐。
投简历面试的过程非常折磨人,尤其是我的处境(每天很大压力,完全是自我打磨的阶段)。
我清楚地记得面试现在这份工作那天是某个周六,我的经理娃娃和技术主管T同意我周末面试。一共4个小时,那绝对是一个互相争取的过程。他们对于工作的热情打动了我,觉得和这样的团队合作一定可以有火花。
真是幸运,当我正视错误,用行动做出改变的时候,找到了一份我要的工作。入职三周已经和团队磨合得很好了,用同事的话说就是觉得我已经加入很久了。
这里不得不说一句我们的团队,一个老中青结合富有战斗力的集体,而且还不乏八卦调节生活。每个人都特别,合作也会有摩擦,但是整体运作非常协调,开发速度和效率都高。从他们身上我看到不同的'工作态度,生活态度。这些对我的都有着潜移默化的影响。领导“娃娃”也非常合适我目前阶段对于领导的需求。如果说几年前我初出茅庐需要的是一个有时间且肯耐心带我的领导的话,现在的我需要的是一个可以给予我充分信任的上司。“娃娃”信任我,从刚进入公司就如此。在熟悉产品阶段我提出的问题和建议他都认真的听了,而且给我时间让我按照自己的想法作出修改。后来我也喜欢把新想法跟他说,当我们带着创意去和老板谈的时候他是我坚强的后盾。
这一年下来我在纯技术上的提高并不多,我们所面向的客户并不要求尖端的技术。经验主要体现在理解需求上面,如果说前两年我还需要领导把需求说得很明白,还会为马后炮而耿耿于怀。那么今年应该算是个分水岭。现在的我不需要领导花很久时间来讲需求,也不用每一步都需要认可再做接下来的工作。总的来说就是技术和业务之间的距离越来越近,而且还可以想到客户将来会需要什么(我曾经的领导应该很欣慰,他培养的人终于达到他说的big picture了)。
也许这也是我一年来少来csdn的缘故吧,不会有什么特别没有头绪的问题需要上来发问。可以把所掌握的技术灵活的运用到实践中去。
其实把需求抽象建模还是很麻烦的,很多时候在最初阶段客户自己都不知道自己要的是什么样的方案。对于需求很明确的客户实在太少了。这个不断修改的阶段耗时耗力,关键是还不一定能争取下来拿到单。我们单位有个很好的传统,当争取到新的客户后。售前和销售都会对我们开发人员作一次演讲,分析客户特点(一般客户都比较有名没啥说的)以及我们的解决方案中哪些部分是最打动客户的,也就是利润点。每一次这样的会议都会伴随着很久的讨论余波,开发者在讨论的时候又会产生新的想法,我是100%享受这样的流程。
实在要说技术点上面,第一个接手的工程是提速,大量数据快速插入数据库开始大面积接触sql server 20xx,写很多存储过程。net写一些winform的东西,不是特别高深。但是很好的对于结构的锻炼vb6跟不同版本的cad及其衍生物结合(这个一直在做,不过越做越高深)
最后就是我每年都会写的细节与规范,现在身边立着几个榜样,我需要时时刻刻鞭策自己。
篇5:编程年度工作总结
XX年度,我在公司领导的大力支持和各部门的团结合作下,在部门员工努力工作下,认真学习编程基本知识及岗位职责,积极完成领导交办的各项工作,顺利完成了年初既定的各项目标及计划。
最近几周一直在弄程序,说实话真的很累,但累中也有成功的快乐。我觉得学到了很多东西,这是只看课本知识所不能学到的。
说实话,以前我一直没学过java虽然我也知道java的重要性,可是即使上课听了,不实践还是掌握不了。因为种种原因,今年我没有买笔记本。没有机器,仅仅靠每周一次的上机练习是绝对不够的。所以我就插空调程序,在舍友们不用的时候自己再接她们的电脑调。
以下是我今年入职公司的编程经验总结:
1、当性能遇到问题时,如果能在应用层进行计算和处理,那就把它从数据库层拿出来。排序和分组就是典型的例子。在应用层做性能提升总是要比在数据库层容易的多。就像对于mysql,sqlite更容易掌控。
2、关于并行计算,如果能避免就尽量避免。如果无法避免,记住,能力越大,责任越大。
如果有可能,尽量避免直接对线程操作。尽可能在更高的抽象层上操作。例如,在ios中,gcd,分发和队列操作是你的好朋友。人类的大脑没有被设计成用来分析那些无穷临时状态——这是我的惨痛教训所得。
3、尽可能简化状态,尽可能局部本地化,适用至上。
4、短小可组合的方法是你的好朋友。
5、代码注释是危险的,因为它们很容易更新不及时或给人误导,但这不能成为不写注释的理由。不要注释鸡毛蒜皮的事情,但如果需要,在某些特殊地方,战略性的长篇注释是需要的。你的记忆会背叛你,也许会在明天早上,也许会在一杯咖啡后。
6、如果你认为一个用例场景也许“不会有问题吧”,它也许就是一个月后让你在发布的产品中遭受惨痛失败的地方。做一个怀疑主义者,测试,验证。
7、有疑问时,和团队中所有相关人交流。
8、做正确的事情——你通常会知道这指的是什么。
9、你的用户并不傻,他们只是没有耐心理解你的捷径。
10、如果一个开发人员没有被安排长期的维护你们开发的系统,对他保持警惕。80%的血、汗、泪水都是在软件发布后的时间里流的——那时你会变成一个厌世者,但也是更聪明的“行家”。
11、任务清单是你的好朋友。
12、主动让你的工作更有乐趣,有时这需要你付出努力。
13、悄无声息的崩溃,我仍然会为此从噩梦中惊醒。监控,日志,警报。清楚各种的假警报和不可避免的感觉钝化。保持你的系统对故障的敏感和及时警报。
14、复杂是大敌。
工作不在朝夕,对于工作在很多时候也会出现一些问题,这一年来部门也出现了这种情况,整体的工作效率还是有所欠缺,这对今后的工作还是会有一定的影响,我想这些都是必然的,我相信在工作上面把这些做好是会有足够的收获的,纠正工作效率底下这个问题没在接下来的工作中一定严格到位。
篇6:编程语言是什么
汇编语言:该语言主要是以缩写英文作为标符进行编写的,运用汇编语言进行编写的一般都是较为简练的小程序,其在执行方面较为便利,但汇编语言在程序方面较为冗长,所以具有较高的出错率。
机器语言:这种语言主要是利用二进制编码进行指令的发送,能够被计算机快速地识别,其灵活性相对较高,且执行速度较为可观,机器语言与汇编语言之间的相似性较高,但由于具有局限性,所以在使用上存在一定的约束性。
高级语言:所谓的高级语言,其实是由多种编程语言结合之后的总称,其可以对多条指令进行整合,将其变为单条指令完成输送,其在操作细节指令以及中间过程等方面都得到了适当的'简化,所以,整个程序更为简便,具有较强的操作性,而这种编码方式的简化,使得计算机编程对于相关工作人员的专业水平要求不断放宽。
篇7:编程词汇
data structures 基本数据结构
dictionaries 字典
priority queues 堆
graph data structures 图
set data structures 集合
kd-trees 线段树
numerical problems 数值问题
solving linear equations 线性方程组
bandwidth reduction 带宽压缩
matrix multiplication 矩阵乘法
determinants and permanents 行列式
constrained and unconstrained optimization 最值问题
linear programming 线性规划
random number generation 随机数生成
factoring and primality testing 因子分解/质数判定
arbitrary precision arithmetic 高精度计算
knapsack problem 背包问题
discrete fourier transform 离散fourier变换
combinatorial problems 组合问题
sorting 排序
searching 查找
median and selection 中位数
generating permutations 排列生成
generating subsets 子集生成
generating partitions 划分生成
generating graphs 图的生成
calendrical calculations 日期
job scheduling 工程安排
satisfiability 可满足性
graph problems -- polynomial 图论-多项式算法
connected components 连通分支
topological sorting 拓扑排序
minimum spanning tree 最小生成树
shortest path 最短路径
transitive closure and reduction 传递闭包
matching 匹配
eulerian cycle / chinese postman euler回路/中国邮路
edge and vertex connectivity 割边/割点
network flow 网络流
drawing graphs nicely 图的描绘
drawing trees 树的描绘
planarity detection and embedding平面性检测和嵌入
graph problems -- hard 图论-np问题
clique 最大团
independent set 独立集
vertex cover 点覆盖
traveling salesman problem 旅行商问题
hamiltonian cycle hamilton回路
graph partition 图的划分
vertex coloring 点染色
edge coloring 边染色
graph isomorphism 同构
steiner tree steiner树
feedback edge/vertex set 最大无环子图
computational geometry 计算几何
convex hull 凸包
triangulation 三角剖分
voronoi diagrams voronoi图
nearest neighbor search 最近点对查询
range search 范围查询
point location 位置查询
intersection detection 碰撞测试
bin packing 装箱问题
medial-axis transformation 中轴变换
polygon partitioning 多边形分割
simplifying polygons 多边形化简
shape similarity 相似多边形
motion planning 运动规划
maintaining line arrangements平面分割
minkowski sum minkowski和
set and string problems 集合与串的问题
set cover 集合覆盖
set packing 集合配置
string matching 模式匹配
approximate string matching 模糊匹配
text compression 压缩
cryptography 密码
finite state machine minimization 有穷自动机简化
longest common substring 最长公共子串
shortest common superstring 最短公共父串
dp——dynamic programming——动态规划
recursion —— 递归
编程词汇
a2a integration a2a整合
abstract 抽象的
abstract base class (abc)抽象基类
abstract class 抽象类
abstraction 抽象、抽象物、抽象性
access 存取、访问
access level访问级别
access function 访问函数
account 账户
action 动作
activate 激活
active 活动的
actual parameter 实参
adapter 适配器
add-in 插件
address 地址
address space 地址空间
address-of operator 取地址操作符
adl (argument-dependent lookup)
ado(activex data object)activex数据对象
advanced 高级的
aggregation 聚合、聚集
algorithm 算法
alias 别名
align 排列、对齐
allocate 分配、配置
allocator分配器、配置器
angle bracket 尖括号
annotation 注解、评注
api (application programming interface) 应用(程序)编程接口
app domain (application domain)应用域
application 应用、应用程序
application framework 应用程序框架
appearance 外观
append 附加
architecture 架构、体系结构
archive file 归档文件、存档文件
argument引数(传给函式的值)。参见parameter
array 数组
arrow operator 箭头操作符
asp(active server page)活动服务器页面
asp.net worker process asp.net工作者进程
assembly 装配件、配件
assembly language 汇编语言
assembly manifest 装配件清单
assert(ion) 断言
assign 赋值
assignment 赋值、分配
assignment operator 赋值操作符
associated 相关的、相关联的
associative container 关联式容器(对应sequential container)
asynchronous 异步的
atomic 原子的
atomic operation 原子操作
attribute 特性、属性
authentication service 验证服务
authorization 授权
audio 音频
a.i. 人工智能
b2b integration b2b整合、b2b集成(business-to-business integration)
background 背景、后台(进程)
backward compatible 向后兼容、向下兼容
backup 备份
backup device备份设备
backup file 备份文件
bandwidth 带宽
base class 基类
base type 基类型
batch 批处理
bcl (base class library)基类库
binary 二进制
binary search 二分查找
binary tree 二叉树
binary function 双参函数
binary large object二进制大对象
binary operator 二元操作符
binding 绑定
bit 位
bitmap 位图
bitwise 按位...
bitwise copy 为单元进行复制;位元逐一复制,按位拷
bitwise operation 按位运算
block 块、区块、语句块
bookkeeping 簿记
boolean 布林值(真假值,true或false)
border 边框
bounds checking 边界检查
boxing 装箱、装箱转换
brace (curly brace) 大括号、花括号
bracket (square brakcet) 中括号、方括号
breakpoint 断点
browser applications 浏览器应用(程序)
browser-accessible application 可经由浏览器访问的应用程序
build 编连(专指编译和连接
built-in 内建、内置
bus 总线
business 业务、商务(看场合)
business logic 业务逻辑
business rules 业务规则
buttons 按钮
bug 臭虫
by/through 通过
byte 位元组(由8 bits组成)
cache 高速缓存
calendar 日历
call 调用
callback 回调
call-level interface (cli)调用级接口(cli)
call operator 调用操作符
candidate key 候选键 (for database)
cascading delete 级联删除 (for database)
cascading update 级联更新 (for database)
casting 转型、造型转换
catalog 目录
chain 链(function calls)
character 字符
character format 字符格式
character set 字符集
check constraints check约束 (for database)
checkpoint 检查点 (for database)
check box 复选框
check button 复选按钮
child class 子类
cil (common intermediate language)通用中间语言、通用中介语言
class 类
class declaration 类声明
class definition 类定义
class derivation list 类继承列表
class factory 类厂
class hierarchy 类层次结构
class library 类库
class loader 类装载器
class template 类模板
class template partial specializations 类模板部分特化
class template specializations 类模板特化
classification 分类
clause 子句
client application 客户端应用程序
client cursor 客户端游标 (for database)
code page 代码页
cleanup 清理、清除
cli (common language infrastructure) 通用语言基础设施
client 客户、客户端
client area 客户区
client-server 客户机/服务器、客户端/服务器
clipboard 剪贴板
clone 克隆
cls (common language specification) 通用语言规范
code access security 代码访问安全
coff (common object file format) 通用对象文件格式
collection 集合
com (component object model) 组件对象模型
combo box 组合框
command line 命令行
comment 注释
commit 提交 (for database)
communication 通讯
compatible 兼容
compile time 编译期、编译时
compiler 编译器
component组件
composite index 复合索引、组合索引 (for database)
composite key 复合键、组合键 (for database)
composition 复合、组合
concept 概念
concrete具体的
concrete class 具体类
concurrency 并发、并发机制
constraint 约束 (for database)
configuration 配置、组态
connection 连接 (for database)
connection pooling 连接池
console 控制台
constant 常量
construct 构件、成分、概念、构造(for language)
constructor (ctor) 构造函数、构造器
container 容器
containment包容
context 环境、上下文
control 控件
cookie (不译)
copy 拷贝
corba 通用对象请求中介架构(common object request broker architecture)
cover 覆盖、涵盖
create/creation 创建、生成
crosstab query 交叉表查询 (for database)
crtp (curiously recurring template pattern)
cts (common type system)通用类型系统
cube 多维数据集 (for database)
cursor 光标
cursor 游标 (for database)
custom 定制、自定义
data 数据
data connection 数据连接 (for database)
data control language (dcl) 数据控制语言(dcl) (for database)
data definition language (ddl) 数据定义语言(ddl) (for database)
data dictionary 数据字典 (for database)
data dictionary view 数据字典视图 (for database)
data file 数据文件 (for database)
data integrity 数据完整性 (for database)
data manipulation language (dml)数据操作语言(dml) (for database)
data mart 数据集市 (for database)
data pump 数据抽取 (for database)
data scrubbing 数据清理 (for database)
data source 数据源 (for database)
data source name (dsn) 数据源名称(dsn) (for database)
data warehouse 数据仓库 (for database)
dataset 数据集 (for database)
database 数据库 (for database)
database catalog 数据库目录 (for database)
database diagram 数据关系图 (for database)
database file 数据库文件 (for database)
database object 数据库对象 (for database)
database owner 数据库所有者 (for database)
database project 数据库工程 (for database)
database role 数据库角色 (for database)
database schema 数据库模式、数据库架构 (for database)
database script 数据库脚本 (for database)
data-bound 数据绑定 (for database)
data-aware control数据感知控件 (for database)
data member 数据成员、成员变量
dataset 数据集 (for database)
data source 数据源 (for database)
data structure数据结构
data table 数据表 (for database)
datagram 数据报文
dbms (database management system)数据库管理系统 (for database)
dcom (distributed com)分布式com
dead lock 死锁 (for database)
deallocate 归还
debug 调试
debugger 调试器
decay 退化
decision support 决策支持
declaration 声明
declarative referential integrity (dri)声明引用完整性(dri) (for database)
deduction 推导
default constraint默认约束 (for database)
default database 默认数据库 (for database)
default instance 默认实例 (for database)
default result set 默认结果集 (for database)
default 缺省、默认值
defer 推迟
definition 定义
delegate 委托
delegation 委托
dependent name
deploy 部署
dereference 解引用
dereference operator (提领)运算子
derived class 派生类
design by contract 契约式设计
design pattern 设计模式
destroy 销毁
destructor(dtor)析构函数、析构器
device 设备
dhtml (dynamic hypertext markup language)动态超文本标记语言
dialog 对话框
digest 摘要
digital 数字的
dime (direct internet message encapsulation)直接internet消息封装
directive (编译)指示符
directory 目录
dirty pages脏页 (for database)
dirty read 脏读 (for database)
disassembler 反汇编器
disco (discovery of web services)web services的查找
disk 盘
dispatch 调度、分派、派发(我喜欢“调度”)
dispid (dispatch identifier)分派标识符
distributed computing 分布式计算
distributed query 分布式查询 (for database)
dna (distributed internet application) 分布式网间应用程序
document 文档
dom (document object model)文档对象模型
dot operator (圆)点操作符
driver 驱动(程序)
dtd (document type definition) 文档类型定义
double-byte character set (dbcs)双字节字符集(dbcs)
dump 转储
dump file 转储文件
dynamic cursor 动态游标 (for database)
dynamic filter 动态筛选 (for database)
dynamic locking 动态锁定 (for database)
dynamic recovery 动态恢复 (for database)
dynamic snapshot 动态快照 (for database)
dynamic sql statements 动态sql语句 (for database)
dynamic assembly 动态装配件、动态配件
dynamic binding 动态绑定
eai (enterprise application integration)企业应用程序集成(整合)
ebco (empty base class optimization) 空基类优化(机制)
e-business 电子商务
edi (dlectronic data interchange)电子数据交换
efficiency 效率
efficient 高效
end-to-end authentication 端对端身份验证
end user 最终用户
engine 引擎
entity 实体
encapsulation 封装
enclosing class 外围类别(与巢状类别 nested class有关)
enum (enumeration) 枚举
enumerators 枚举成员、枚举器
equal 相等
equality 相等性
equality operator 等号操作符
error log 错误日志 (for database)
escape code 转义码
escape character 转义符、转义字符
exclusive lock 排它锁 (for database)
explicit transaction 显式事务 (for database)
evaluate 评估
event 事件
event driven 事件驱动的
event handler 事件处理器
evidence 证据
exception 异常
exception declaration 异常声明
exception handling 异常处理、异常处理机制
exception-safe 异常安全的
exception specification 异常规范
exit 退出
explicit 显式
explicit specialization 显式特化
export 导出
expression 表达式
facility 设施、设备
fat client 胖客户端
feature 特性、特征
fetch 提取
field 字段(java)
field 字段 (for database)
field length 字段长度 (for database)
file 文件
filter 筛选 (for database)
finalization 终结
firewall 防火墙
finalizer 终结器
firmware 固件
flag 标记
flash memory 闪存
flush 刷新
font 字体
foreign key (fk) 外键(fk) (for database)
form 窗体
formal parameter 形参
forward declaration 前置声明
forward-only 只向前的
forward-only cursor 只向前游标 (for database)
fragmentation 碎片 (for database)
framework 框架
full specialization 完全特化
function 函数
function call operator (即operator ) 函数调用操作符
function object 函数对象
function overloaded resolution函数重载决议
functionality 功能
function template函数模板
functor 仿函数
gac (global assembly cache) 全局装配件缓存、全局配件缓存
gc (garbage collection) 垃圾回收(机制)、垃圾收集(机制)
game 游戏
generate 生成
generic 泛化的、一般化的、通用的
generic algorithm通用算法
genericity 泛型
getter (相对于 setter)取值函数
global 全局的
global object 全局对象
global scope resolution operator 全局范围解析操作符
grant 授权 (for database)
granularity 粒度
group 组、群
group box 分组框
gui 图形界面
guid (globally unique identifier) 全球唯一标识符
hand shaking 握手
handle 句柄
handler 处理器
hard-coded 硬编码的
hard-copy 截屏图
hard disk 硬盘
hardware 硬件
hash table 散列表、哈希表
header file头文件
heap 堆
help file 帮助文件
hierarchy 层次结构、继承体系
hierarchical data 阶层式数据、层次式数据
hook 钩子
host (application)宿主(应用程序)
hot key 热键
hyperlink 超链接
html (hypertext markup language) 超文本标记语言
http pipeline http管道
http (hypertext transfer protocol) 超文本传输协议
icon 图标
ide (integrated development environment)集成开发环境
idl (interface definition language) 接口定义语言
identifier 标识符
idle time 空闲时间
if and only if当且仅当
il (intermediate language) 中间语言、中介语言
image 图象
ime 输入法
immediate base 直接基类
immediate derived 直接派生类
immediate updating 即时更新 (for database)
implicit transaction隐式事务 (for database)
incremental update 增量更新 (for database)
index 索引 (for database)
implement 实现
implementation 实现、实现品
implicit 隐式
import 导入
increment operator 增加操作符
infinite loop 无限循环
infinite recursive 无限递归
information 信息
infrastructure 基础设施
inheritance 继承、继承机制
inline 内联
inline expansion 内联展开
initialization 初始化
initialization list 初始化列表、初始值列表
initialize 初始化
inner join 内联接 (for database)
in-place active 现场激活
instance 实例
instantiated 具现化、实体化(常应用于template)
instantiation 具现体、具现化实体(常应用于template)
integrate 集成、整合
integrity 完整性、一致性
integrity constraint完整性约束 (for database)
interprocess communication (ipc)进程间通讯(ipc)
interacts 交互
interface 接口
for gui 界面
interoperability 互操作性、互操作能力
interpreter 解释器
introspection 自省
invariants 不变性
invoke 调用
isolation level 隔离级别 (for database)
iterate 迭代
iterative 反复的、迭代的
iterator 迭代器
iteration 迭代(回圈每次轮回称为一个iteration)
item 项、条款、项目
jit compilation jit编译 即时编译
key 键 (for database)
key column 键列 (for database)
laser 激光
late binding 迟绑定
left outer join 左向外联接 (for database)
level 阶、层例
high level 高阶、高层
library 库
lifetime 生命期、寿命
link 连接、链接
linkage 连接、链接
linker 连接器、链接器
literal constant 字面常数
list 列表、表、链表
list box 列表框
livelock 活锁 (for database)
load 装载、加载
load balancing 负载平衡
loader 装载器、载入器
local 局部的
local object 局部对象
lock 锁
log 日志
login 登录
login security mode登录安全模式 (for database)
lookup table 查找表 (for database)
loop 循环
loose coupling 松散耦合
lvalue 左值
machine code 机器码、机器代码
macro 宏
maintain 维护
managed code 受控代码、托管代码
managed extensions 受控扩充件、托管扩展
managed object 受控对象、托管对象
mangled name
manifest 清单
manipulator 操纵器(iostream预先定义的一种东西)
many-to-many relationship 多对多关系 (for database)
many-to-one relationship 多对一关系 (for database)
marshal 列集
member 成员
member access operator 成员取用运算子(有dot和arrow两种)
member function 成员函数
member initialization list成员初始值列表
memberwise 以member为单元…、members 逐一…
memberwise copy
memory 内存
memory leak 内存泄漏
menu 菜单
message 消息
message based 基于消息的
message loop 消息环
message queuing消息队列
metadata 元数据
metaprogramming元编程
method 方法
micro 微
middleware 中间件
middle tier 中间层
modeling 建模
modeling language 建模语言
modifier 修饰字、修饰符
modem 调制解调器
module 模块
most derived class最底层的派生类
mouse 鼠标
mutable 可变的
mutex 互斥元、互斥体
multidimensional olap (molap) 多维olap(molap) (for database)
multithreaded server application 多线程服务器应用程序
multiuser 多用户
multi-tasking 多任务
multi-thread 多线程
multicast delegate 组播委托、多点委托
named parameter 命名参数
named pipe 命名管道
namespace 名字空间、命名空间
native 原生的、本地的
native code 本地码、本机码
native image generator (ngen)本地映像生成器
nested class 嵌套类
nested query 嵌套查询 (for database)
nested table 嵌套表 (for database)
network 网络
network card 网卡
nondependent name
object 对象
object based 基于对象的
object file 目标文件
object model 对象模型
object oriented 面向对象的
object pooling 对象池化
odbc data source odbc数据源 (for database)
odbc driver odbc驱动程序 (for database)
odr (one-definition rule)
ole automation objects ole自动化对象 (for database)
ole automation server ole自动化服务器 (for database)
ole db consumer ole db使用者 (for database)
ole db for olap 用于olap的ole db (for database)
ole db provider ole db提供者 (for database)
one-to-many relationship 一对多关系 (for database)
one-to-one relationship 一对一关系 (for database)
online analytical processing (olap) 联机分析处理(olap) (for database)
online redo log 联机重做日志 (for database)
online transaction processing (oltp) 联机事务处理(oltp) (for database)
open data services (ods) 开放式数据服务(ods) (for database)
open database connectivity (odbc) 开放式数据库连接(odbc) (for database)
operand 操作数
operating system (os) 操作系统
operation 操作
operator 操作符、运算符
option 选项
optimizer 优化器
outer join 外联接 (for database)
overflow 上限溢位(相对于underflow)
overhead 额外开销
overload 重载
overload resolution 重载决议
overloaded function 重载的函数
overloaded operator 被重载的操作符
override 覆写、重载、重新定义
package 包
packaging 打包
palette 调色板
parallel 并行
parameter 参数、形式参数、形参
parameter list 参数列表
parameterize 参数化
parent class 父类
parentheses 圆括弧、圆括号
parse 解析
parser 解析器
part 零件、部件
partial specialization 局部特化
pass by address 传址(函式引数的传递方式)(非正式用语)
pass by reference 传地址、按引用传递
pass by value 按值传递
pattern 模式
pda (personal digital assistant)个人数字助理
pe (portable executable) file 可移植可执行文件
performance 性能
persistence 持久性
pinvoke (platform invoke service)平台调用服务
pixel 像素
placement delete
placement new
placeholder 占位符
platform 平台
pod (plain old data (type))
poi (point of instantiation)
pointer 指针
poll 轮询
pooling 池化
polymorphism 多态
pop up 弹出式
port 端口
postfix 后缀
precedence 优先序(通常用于运算子的优先执行次序)
prefix 前缀
preprocessor 预处理器
primary key (pk)主键(pk) (for database)
primary table 主表 (for database)
primary template原始模板
primitive type 原始类型
print 打印
printer 打印机
procedure 过程
procedural 过程式的、过程化的
process 进程
profile 评测
profiler 效能(性能)评测器
program 程序
programmer 程序员
programming编程、程序设计
progress bar 进度指示器
project 项目、工程
property 属性
protocol 协议
pseudo code伪码
qualified 经过资格修饰(例如加上scope运算子)
qualified name
qualifier 修饰符
quality 质量
queue 队列
race condition 竞争条件(多线程环境常用语)
radian 弧度
radio button 单选按钮
raise 引发(常用来表示发出一个exception)
random number 随机数
range 范围、区间
rank 等级
raw 未经处理的
readonly只读
record 记录 (for database)
recordset 记录集 (for database
recursive 递归
re-direction 重定向
refactoring 重构
refer 引用、参考
reference 引用、参考
reference counting引用计数
referential integrity (ri)引用完整性(ri) (for database)
register 寄存器
reflection 反射
refresh data 刷新数据 (for database)
regular expression 正则表达式
relational database 关系数据库
remote 远程
remote request 远程请求
represent 表述,表现
resolve 解析、决议
resolution 解析过程
result set 结果集 (for database)
retrieve data 检索数据
return 返回
return type 返回类型
return value 返回值
right outer join 右向外联接 (for database)
revoke 撤销
robust 健壮
robustness 健壮性
roll back 回滚 (for database)
roll forward 前滚 (for database)
routine 例程
row 行 (for database)
row lock 行锁 (for database)
rowset 行集 (for database)
rpc (remote procedure call)rpc(远程过程调用)
runtime 执行期、运行期、执行时、运行时
rvalue 右值
save 保存
savepoint 保存点 (for database)
sax (simple api for xml)
scalable 可伸缩的、可扩展的
schedule 调度
scheduler 调度程序
schema 模式、纲目结构
scroll bar滚动条
scope 作用域、生存空间
scope operator 生存空间操作符
scope resolution operator 生存空间解析操作符
screen 屏幕
sdk (software development kit)软件开发包
sealed class 密封类
search 查找
semantics 语义
semaphore 信号量
sequential container序列式容器
server 服务器、服务端
serial 串行
serialization/serialize 序列化
server cursor服务端游标、服务器游标 (for database)
session 会话 (for database)
setter 设值函数
shared lock 共享锁 (for database)
sibling 同级
side effect 副作用
signature 签名
single-threaded 单线程
slider滑块
slot 槽
smart pointer 智能指针
smtp (simple mail transfer protocol) 简单邮件传输协议
snapshot 截屏图
snapshot 快照 (for database)
specialization 特化
specification 规范、规格
splitter 切分窗口
soap (simple object access protocol) 简单对象访问协议
software 软件
source code 源码、源代码
sql (structured query language) 结构化查询语言 (for database)
stack 栈、堆栈
stack unwinding 叠辗转开解(此词用于exception主题)
standard library 标准库
standard template library 标准模板库
stateless 无状态的
statement 语句、声明
static cursor 静态游标 (for database)
static sql statements 静态sql语句 (for database)
stored procedure 存储过程 (for database)
status bar 状态条
stream 流
string 字符串
stub 存根
subobject子对象
subquery 子查询 (for database)
subroutine 子例程
subscript operator 下标操作符
subset 子集
subtype 子类型
support 支持
suspend 挂起
symbol 记号
syntax 语法
system databases 系统数据库 (for database)
system tables 系统表 (for database)
table 表 (for database)
table lock 表锁 (for database)
table-level constraint 表级约束 (for database)
tape backup 磁带备份 (for database)
target 标的,目标
task switch 工作切换
tcp (transport control protocol) 传输控制协议
template 模板
template-id
template argument deduction 模板参数推导
template explicit specialization 模板显式特化
template parameter 模板参数
template template parameter
temporary object 临时对象
temporary table 临时表 (for database)
text 文本
text file 文本文件
thin client 瘦客户端
third-party 第三方
thread 线程
thread-safe 线程安全的
throw 抛出、引发(常指发出一个exception)
token 符号、标记、令牌(看场合)
trace 跟踪
transaction 事务 (for database)
transaction log 事务日志 (for database)
transaction rollback 事务回滚 (for database)
transactional replication 事务复制 (for database)
translation unit 翻译单元
traverse 遍历
trigger 触发器 (for database)
two-phase commit 两阶段提交 (for database)
tuple
two-phase lookup 两阶段查找
type 类型
uddi(universary description, discovery and integration)统一描述、查询与集成
uml (unified modeling language)统一建模语言
unary function 单参函数
unary operator 一元操作符
unboxing 拆箱、拆箱转换
underflow 下限溢位(相对于overflow)
union query 联合查询 (for database)
unique constraints unique约束 (for database)
unique index 唯一索引 (for database)
unmanaged code 非受控代码、非托管代码
unmarshal 散集
unqualified 未经限定的、未经修饰的
uri (uniform resource identifier) 统一资源标识符
url (uniform resource locator) 统一资源定位器
user 用户
user interface 用户界面
value types 值类型
variable 变量
vector 向量(一种容器,有点类似array)
viable 可行的
video 视频
view 视图
vee (virtual execution engine)虚拟执行引擎
vendor 厂商
view 视图 (for database)
virtual function 虚函数
virtual machine 虚拟机
virtual memory 虚拟内存
vowel 元音字母
web services web服务
where clause where子句 (for database)
wildcard characters 通配符字符 (for database)
wildcard search 通配符搜索 (for database)
window 窗口
window function 窗口函数
window procedure 窗口过程
windows authentication windows身份验证
wizard 向导
word 单词
word processor 字处理器
wrapper 包装、包装器
write enable 写启用 (for database)
write-ahead log 预写日志 (for database)
write-only 只写
wsdl (web service description language)web service描述语言
xml message interface (xmi) xml消息接口
xml (extensible markup language) 可扩展标记语言
xsd (xml schema definition) xml模式定义语言
xsl (extensible stylesheet language) 可扩展样式表语言
xslt (extensible stylesheet language transformation)可扩展样式表语言转换
xxx based 基于xxx的
xxx oriented 面向xxx
篇8:编程学习心得
编程学习心得
编程学习心得-02-11 20:14作为一个不是科班出身、没有正规学习过计算机知识的架构师,想在这里把我这几年学习的经历体验和大家分享一下,谈谈自己对架构师成长之路的一些感想。
奠定扎实的理论基础
千里之行,始于足下!技术不是一蹴而就的事情,而是长时间积累的成果。扎实的基本功是做好所有事情的开始。到现在我还记得对我影响非常大的几本书:
■《C++编程思想》
■《深入浅出MFC》
■《Windows核心编程》
■《数据结构》《编译原理》
我学习计算机正是按照这几本书的顺序,之前学习C的经历就不必说了,而转折点正是《C++编程思想》--它让我感觉到程序和语言竟然这么有意思,至今仍对虚表的.概念记忆犹新,尤其指针的用法,对我以后学习Java语言有很大的帮助,对多态和语言的特性也有了很高的认识。
《深入浅出MFC》这本书,记忆最深刻的还是其中强大无比的宏定义和对象层次设计。然而学习MFC的过程中,我遇到的最大问题就是:很多东西都是黑盒的,这引发了我刨根问底的欲望。所以后来我学习了《Windows核心编程》,这本书给我的最大收获,就是了解了很多操作系统底层的知识,操作系统是如何运行的。不过遗憾的是,如果当时从Linux或者Unix开始学习,应该会了解得更系统一些。
之后我深入学习了《数据结构》和《编译原理》。这是我经过了很多实践以后,又回过头来重新学习。拿《编译原理》来说,以前对这门学科的了解非常有限,后来为了实现一个东西,要用到脚本语言,找来找去找到了Velocity(后来想想使用Groovy应该更好一点),用了以后觉得很好。以前修改程序逻辑,是需要重新编译或者修改配置重新发布才能OK,而现在只需要编辑然后保存一下,就能得到自己想要的结果。这令我着迷,于是想知道它是如何实现的,翻看源代码才晓得原来还有JavaCC这个东西。就这样,我从解释语言入手,逐渐开始了疯狂学习编译原理的过程,越发觉得编程语言非常有意思。
回头想想以前和现在学习的语言,感觉程序语言就是在不断抽象:从汇编、C、C++,再到Java、C#,再到更动态一点的语言如Perl、Python、Ruby等等。不管它再怎么变、再怎么抽象,还是编译原理应用的产物。
讲了这么多,就是想强调理论基础知识的重要性!虽然我们现在使用的框架如此之多,但是如果你有了扎实的基础理论知识,这些东西就跟玩具一样。基础就是一个无招胜有招的杀手工具。
篇9:深入CD-ROM编程
深入CD-ROM编程
在多媒体系统中,CD-ROM是必不可少的。以DOS为例,CD-ROM应用环境的大致结构是:
用户
↓
MSCDEX
↓
厂家提供的驱动程序
↓
CD-ROM
其中,MSCDEX起到了一个转换器的作用,将CD上的文件格式转化为标准的DOS文件格式,使CD-ROM象普通驱动器一样受DOS管理。
但是,在一般应用中,CD-ROM还能用来播放音乐碟,许多应用软件(如Creative Labs的Quick CD)可以模拟一台CD音响,完成出盒、入盒、播放、快速进退和重复等一系列功能。实际上,MSCDEX并未提供这些功能,必须访问CD-ROM的驱动程序,才能达到上述目的.,因为所有CD-ROM的驱动程序与MSCDEX之间的接口都是规范的,这给我们提供了极大的方便。下面将详细阐述如何实现上述功能。
DOS的设备分为字符设备和块设备两种,CD-ROM的驱动程序属于前者,访问它必须遵循DOS的要求:填写设备驱动程序请求头、访问驱动程序的策略(Strategy)过程、访问驱动程序的中断(Interrupt)过程。
设备驱动程序请求头的基本格式如下:
偏移量 类型 含义
00H 字节 请求头长度
01H 字节 驱动程序内的子单元
02H 字节 命令码
03H 单字 返回码
…
以下内容根据命令码进行填写
下面给出几种CD-ROM常用功能使用的命令码和格式:
1.IOCTL INPUT:
偏移量 类型 内容
00H 字节 1AH
01H 字节 00H
02H 字节 03H
03H 字节 11 DUP(?)
0EH 双字 缓冲区地址
12H 单字 缓冲区长度
14H 字节 6 DUP (?)
在缓冲区内按一定的格式填入参数,便可得到CD-ROM的各种状态。
缓冲区的格式:
作用 长度 格式
取CD-ROM状态 5 输入:06 xx xx xx xx
返回:06 SS SS 00 00
说明:SS SS为状态字,关键的有两位
位0:1、开门 0、关门
位B:1、有盘 0、无盘
取CD总扇区数 5 输入:08 xx xx xx xx
返回:08 LL LL LL LL
说明:LL LL LL LL为总扇区数
取音乐CD信息 7 输入:0A xx xx xx xx xx xx
返回:0A xx NN TT SS MM xx
说明: NN为曲目数
MM为分钟数
SS为秒数(0~59)
TT为扇区数(0~74)
CD的一个扇区大小为2048B
播放速度为每秒75扇区即150KB/s
取指定歌曲 7 输入:0B NN xx xx xx xx xx
的起始时间 返回:0B NN TT SS MM xx xx
说明: NN为曲目序号
MM为起始分钟数
SS为起始秒数(0~59)
TT为起始扇区数(0~74)
取播放状态 11 输入:0C xx xx xx xx xx xx xx xx xx xx
返回:0C xx NN xx MM SS TT xx ZM ZS ZT
说明: NN为曲目序号(BCD码)
MM为该曲目分钟数
SS为该曲目秒数(0~59)
TT为扇区数(0~74)
ZM为总分钟数
ZS为总秒数(0~59)
ZT为扇区数(0~74)
2.IOCTL OUTPUT
偏移量 类型 内容
00H 字节 1AH
01H 字节 00H
02H 字节 0CH
03H 字节 11 DUP(?)
0EH 双字 缓冲区地址
12H 单字 缓冲区长度
14H 字节 6 DUP(?)
在缓冲区内按一定的格式填入参数,便可操纵CD-ROM的动作。
缓冲区的格式:
作用 长度 格式
出盒 1 输入:00
解锁出盒键 2 输入:01 00
加锁出盒键 2 输入:01 01
入盒 1 输入:05
3.PLAY AUDIO
偏移量 类型 内容
00H 字节 16H
01H 字节 00H
02H 字节 84H
03H 字节 10 DUP (?)
0DH 字节 01H
0EH 字节 起
[1] [2]