文章分类

站点统计

  • 分类总数: 13 个
  • 文章总数: 145 篇
  • 评论总数: 35 条
  • 附件总数: 59 个
  • 建站日期: 2008-08-18
  • 访问总数: 387354 人次
  • RSS订阅: 文章|评论

ibatis中$与#的区别

KY8 于 2009-10-07 15:35:03 发表其它

在ibatis中,#Property#将会根据实际情况进行类型的转换,
$Property$直接替换为属性的值,不进行类型的处理。
例如:person.name="llz"
$name$=llz
#name#='llz'

被阅128次, 0票 发表评论

7个汇编开发环境

KY8 于 2009-01-17 16:07:01 发表其它

1、radasm
http://www.radasm.com/
2、masm32
http://www.masm32au.com/masm32/m32v10r.zip
3、masmplus
http://www.aogosoft.com/masmplus/idesetup.exe
4、nasm
http://sourceforge.net/projects/nasm
5、TASM 5.0
http://www.programfan.com/download/down.asp?id=214&url=1
6、WINASM
http://www.winasm.net/
7、Visual ASM 6.0
http://blog.ednchina.com/visualasm/80011/message.aspx

被阅898次, 0票ASM 发表评论

SQLite体系结构

KY8 于 2009-01-14 09:34:59 发表其它

这份文档描述了sqlite数据库的体系结构,这些信息对想理解或者修改内部工作原理的朋友们会很有用。
上图中包含了sqlite的主要的模块以及它们是怎么关联的。下面就简要介绍一下每个模块。
  (这份文档描述的是sqlite 3.0版本的,2.8以及以前的大体相似只是细节上有点不同)

接口
     大部分sqlite的接口在main.c,legacy.c,vdbeapi.c源文件中实现,但是有些常规性的分散在其他的文件中,因为它们可以在文件 作用域内访问一些数据结构。比如,sqlite3_get_table() 在table.c中实现,sqlite3_mprintf() 在printf.c中实现,sqlite3_complete()在tokenizer.c中实现,tcl接口在tclsqlite.c中实现,更多关于 sqlite的c接口可以访问
     为了避免与其他的软件产生命名冲突,所有的对外符号都以sqlite3作为前缀。(也就是说,这些符号构成了sqlite的api)

分词器
     当一个包含sql语句的字符串执行的时候,接口把字符串传递给分词器。分词器的工作就是把原始的字符串分割成标记,然后一个一个的传给语法分析器。这个分词器在tokenizer.c中用c实现。

     注意在这个设计里面,分词器调用语法分析器。那些熟悉YACC或者BISON的朋友们习惯用另一种方式设计-----用语法分析器调用分词器。sqlite的作者分别用这两种方法实现过,最后发现第一种方法工作效率比较高。YACC有很多局限性。

语法分析器
     语法分析器是一个根据环境给符号赋予意义的模块。这个分析器用了lemo的LALR(1)分析器生成。lemon跟YACC/BISON差不多,但是它用 了一种很少产生错误的输入句法(syntax),而且lemon可以产生一个可重入(reentrant)和线程安全(thread-safe)的分析 器。lemon可以定义无端点的破坏(non-terminal destructor)的概念,所以当出现错误句法时不会出现内存泄露。
     由于lemon是一个一般不会经常使用的程序,lemon完整的源文件(就一个c文件)在sqlite发布版本的tool文件夹下。关于lemon的文档在doc文件夹下。

代码生成器
      在分析器把符号翻译(assemble)成完整的sql语句的后,它会调用代码生成器产生sql语句需要执行的虚拟机代码。代码生成器包含很多文 件,attach.c,auth.c,build.c,delete.c,expr.c,insert.c,pragma.c,select.c,trigger.c update.c,vacuum.c和where.c。这些文件是大部分古怪魔法(serious magic)发生的地方。expr.c处理表达式的代码生成,where.c 处理select,update,delete语句中where子句的代码生成,attach.c,delete.c insert.c select.c trigger.c update.c 和 vacuum.c 处理跟它们名字有关语句的代码生成(当有必要时,这些文件调用expr.c和where.c中常用的函数)。其余的sql 语句在build.c中生成。auth.c文件实现sqlite3_set_authorizer()接口.
 
虚拟机
   由代码生成器生成的代码被虚拟机执行。更多的关于虚拟的的信息可以访问————。摘要而言,虚拟机实现了一个专门处理数据库文件的抽象的计算引擎 (abstract computing engine)。这个虚拟机包含了一个作为中间存储器的栈,每条指令包含一个操作码和多达3个的操作数。
    这个虚拟机完全在vdbe.c中实现,它有自己的头文件vdbe.h,里面定义了虚拟机和其他的模块的接口。vdbeInt.h里面定义了虚拟机里面私有 的数据结构,vdbeaux.c里面包含了虚拟机常用的工具,也包含了其余为构造虚拟机程序的库的接口模块。vdbeapi.c 包含了虚拟机对外的接口比如sqlite3_bind_... 的函数族。数据类型(individual values)(strings,integer,floating point numbers,和BLOBs)存储在一个内部的叫做“mem”对象当中,在vdbemen.c中。
    sqlite用回调c语言函数(c-language routines)的方法实现sql 函数。甚至内建的sql函数都是用这种方式实现的。很多内建的sql函数(比如coalesce(),count(),substr(),还有很多),在 func.c中实现,数据和时间的转换函数在date.c中实现。

B-Tree
   sqlite数据库在硬盘上用B-tree实现,具体代码在btree.c中。在数据库中的每个表和索引都使用单独的b-tree。所有的b-tree存 储在用一个文件中。文件格式的细节在btree.c开头的一大段注释中记录。b-tree的接口在btree.h头文件中记录。

页缓存
  B-tree模块需要以一个固定大小的块从硬盘读取数据。默认的块大小是1024个字节,可以在512和65536个字节间变化。页缓存的任务是读,写, 缓存块。页缓存提供回滚,原子委托抽象(atomic commit abstraction),处理数据文件的锁。b-tree需要从页缓存请求特殊的页,当修改页,委托,回滚时通知页缓存,页缓存处理所以的细节以确定快 速,安全,高效的处理请求。

  实现页缓存的代码在pager.c中,页缓存子系统的接口在pager.h头文件中定义。

操作系统接口
   为了在POSIX和win32操作系统之间移植,sqlite用了一个抽象的层作为与操作系统间的接口。实现OS抽象层的接口在os.h中定义,每一种支 持的系统有它们自己的实现方式,os_unix.c为unix,os_win.c为windows,当然也有自己相应的头文件os_unix.h和 os_win.h,等等。

工具
  内存配置和字符串比较的功能在util.c中,语法分析器用到的符号表用hash 表实现,具体代码在hash.c中。utf.c包含了Unicode转换子程序。sqlite有它自己printf()实现(增加了很多功能),在 printf.c中。也有自己的随机数生成的实现,在random.c中。
 
测试代码
    如果你依赖测试脚本,一多半sqlite的代码是为了测试用的。很多assert()语句在主代码文件中。另外,从test1.c到test5.c和md5.c只是为测试实现的,os_test.c中的接口是为了模拟断电时,核实页中错误恢复机制的。

被阅584次, 0票SQLite 发表评论

ASP中实现C#的String.Format函数与C语言的printf函数

Admin 于 2008-12-03 14:17:20 发表其它

①、StringFormat

代码:

  1. Function StringFormat(sVal, aArgs) 
  2.  Dim i 
  3.  For i=0 To UBound(aArgs) 
  4.   sVal = Replace(sVal,"{" & CStr(i) & "}",aArgs(i)) 
  5.  Next 
  6.  StringFormat = sVal 
  7. End Function 

使用方法:

  1. StringFormat("this {0} a tes{1} string containing {2} values", Array("is","t","some")) 

②、printf函数

http://www.codeproject.com/KB/vbscript/fmt.aspx

  1. '============================================================================ 
  2. ' takes a string with format characters and an array 
  3. ' to expand. 
  4. ' 
  5. ' the format characters are always "%x", independ of the 
  6. ' type. 
  7. ' 
  8. ' Use double percent (%%) to denote an actual percent 
  9. ' 
  10. ' usage example: 
  11. ' dim str 
  12. ' str = fmt( "hello, Mr. %x, today's date is %x.", Array("Miller",Date) ) 
  13. ' response.Write str 
  14. ' 
  15. ' additionally the support was added to allow for fixed field widths 
  16. ' adding a number between the % and x will set the field width to at least that size 
  17. ' example: 
  18. ' str = fmt( "%10x %10x %10x", Array("Jason", "Steve", "Smith") ) 
  19. ' response.write str 
  20. ' output: 
  21. ' 'Jason Steve Smith ' 
  22. '============================================================================ 
  23. Function fmt(ByVal str, ByVal args) 
  24.     Dim res ' the result string. 
  25.     res = "" 
  26.  
  27.     Dim oRE 'the RegEx 
  28.     oRE = New regexp 
  29.     Dim fieldLen ' length of the field 
  30.     Dim strOffset 
  31.     Dim argLen ' length of array string 
  32.     Dim strSearchOn ' string to perform RegEx on 
  33.     strSearchOn = "" 
  34.  
  35.     Dim pos ' the current position in the args array. 
  36.     pos = 0 
  37.  
  38.     Dim i 
  39.     For i = 1 To Len(str) 
  40.         ' found a fmt char. 
  41.         If Mid(str, i, 1) = "%" Then 
  42.             'make sure we are not at the end of the string 
  43.             If i Then 
  44.                 ' normal percent. 
  45.                 If Mid(str, i + 1, 1) = "%" Then 
  46.                     res = res & "%" 
  47.                     i = i + 1 
  48.                 Else 
  49.                     ' determine if there is a field length 
  50.                     oRE.Pattern = "%(\d*)x.*{Article.Explain}quot; 
  51.                     oRE.Global = False 
  52.                     oRE.IgnoreCase = False 
  53.                     strSearchOn = Mid(str, i) ' the rest of the string 
  54.                     fieldLen = oRE.Replace(strSearchOn, "$1"
  55.                     If fieldLen = "" Then 
  56.                         ' no length specified, expand from array. 
  57.                         res = res & CStr(args(pos)) 
  58.                         strOffset = 0 
  59.                     Else 
  60.                         ' field is specified, expand from array then pad 
  61.                         res = res & CStr(args(pos)) 
  62.                         argLen = Len(CStr(args(pos))) ' this is how large the token was 
  63.                         If argLen < fieldLen Then ' determine if we need more padding 
  64.                             res = res & Space(fieldLen - argLen) ' add the padding to the string 
  65.                         End If 
  66.                         strOffset = Len(fieldLen) 
  67.                     End If 
  68.  
  69.                     pos = pos + 1 
  70.                     i = i + strOffset + 1 
  71.                 End If 
  72.             End If 
  73.  
  74.             ' found a normal char. 
  75.         Else 
  76.             res = res & Mid(str, i, 1) 
  77.         End If 
  78.     Next 
  79.  
  80.     fmt = res 
  81.  
  82.     ' clean-up 
  83.     oRE = Nothing 
  84. End Function 

 

被阅667次, 0票ASP 发表评论

介绍Tokyo Cabinet、Tokyo Tyrant和Tokyo Dystopia

Admin 于 2008-10-15 23:36:04 发表其它

Tokyo Cabinet [東京収納棚] 是日本人平林幹雄开发的一款 DBM 数据库,该数据库读写非常快,哈希模式写入100万条数据只需0.643秒,读取100万条数据只需0.773秒,是 Berkeley DB 等 DBM 的几倍。这里的数据库由一系列key-value对的记录构成。key和value都可以是任意长度的字节序列,既可以是二进制也可以是字符串。这里没有 数据类型和数据表的概念。

当做为Hash表数据库使用时,每个key必须是不同的,因此无法存储两个key相同的值。提供了以下访问方法:提供key,value参数来存 储,按 key删除记录,按key来读取记录,另外,遍历key也被支持,虽然顺序是任意的不能被保证。这些方法跟Unix标准的DBM,例如GDBM,NDBM 等等是相同的,但是比它们的性能要好得多(因此可以替代它们)

当按B+树来存储时,拥用相同key的记录也能被存储。像hash表一样的读取,存储,删除函数也都有提供。记录按照用户提供的比较函数来存储。 可以采用顺序或倒序的游标来读取每一条记录。依照这个原理,向前的字符串匹配搜索和整数区间搜索也实现了。另外,B+树的事务也是可用的。 对于定长的数组,记录按自然数来标记存储。不能存储key相同的两条或更多记录。另外,每条记录的长度受到限 制。读取方法和hash表的一样。

Tokyo Cabinet是用C写的,同时提供Lua,Perl,Ruby,Java的API。Tokyo Cabinet在提供了POSIX和C99的平台上都可用,它以GNU Lesser Public License协议发布。


  Tokyo Tyrant 是由同一作者开发的 Tokyo Cabinet 数据库网络接口。它拥有Memcached兼容协议,也可以通过HTTP协议进行数据交换。
      Tokyo Tyrant基于Tokyo Cabinet实现,提供了HTTP协议和memcache 协议的读取/写入等接口。这不仅仅是贴上了分布式的标签而已:有了http协议,在大公司复杂网络中部署时很多事情简单多了,因为http端口一般不需要 专门申请路由了,而其他端口上部署应用时,要走一堆流程。而memcache协议则解决了很多人尝试用memcache来存储东西时无法持久存储的问题。 有了这两个接口,应用Tokyo Tyrant时,你都不需要调API,php中用来连Memcached的代码直接使用就行。

  Tokyo Tyrant 加上 Tokyo Cabinet,构成了一款支持高并发的分布式持久存储系统,对任何原有Memcached客户端来讲,可以将Tokyo Tyrant看成是一个Memcached,但是,它的数据是可以持久存储的。这一点,跟新浪的Memcachedb性质一样。


Tokyo Dystopia 是一个全文索引系统,可以通过多种模式对索引记录进行检索。主要功能:

  • 高性能搜索。
  • 目标文档高度可配置。
  • 完善的召回率字符N元方法(Perfect recall ratio by character N-gram method)。
  • 词组匹配,前缀匹配,后缀匹配,及Token匹配(Phrase matching, prefix matching, suffix matching, and token matching)。
  • 通过Unicode实现多语言支持。
  • API架构使用分层设计。

Tokyo Dystopia 在提供了POSIX和C99的平台上都可用,它以GNU Lesser Public License协议发布。


参考资料:

http://blog.s135.com/read.php/362.htm

http://tokyocabinet.sourceforge.net/index.html

被阅1782次, 0票DBM 发表评论

五款小巧的Web Server[C语言]

Admin 于 2008-10-15 03:08:15 发表其它

1、micro_httpd - really small HTTP server
特点:
    支持安全的 .. 上级目录过滤
    支持通用的MIME类型
    支持简单的目录
    支持目录列表
    支持使用 index.html 作为首页
    Trailing-slash redirection
    程序总共代码才200多行
这个httpd适合学习简单的Web Server编写学习,因为它只有一个简单的框架,只能够处理简单的静态页,可以考虑用来放静态页。
官方地址:http://www.acme.com/software/micro_httpd/
下载地址:http://www.acme.com/software/micro_httpd/micro_httpd_12dec2005.tar.gz

2、mini_httpd - small HTTP server
特点:
    支持GET、HEAD、POST方法
    支持CGI功能
    支持基本的验证功能
    支持安全 .. 上级目录功能
    支持通用的MIME类型
    支持目录列表功能
    支持使用 index.html, index.htm, index.cgi 作为首页
    支持多个根目录的虚拟主机
    支持标准日志记录
    支持自定义错误页
    Trailing-slash redirection
mini_httpd 也是相对比较适合学习使用,大体实现了一个Web Server的功能,支持静态页和CGI,能够用来放置一些个人简单的东西,不适宜投入生产使用。
官方地址:http://www.acme.com/software/thttpd/
下载地址:http://www.acme.com/software/mini_httpd/mini_httpd-1.19.tar.gz

3、thttpd - tiny/turbo/throttling HTTP server
thttpd中是一个简单,小型,轻便,快速和安全的http服务器:
简单:它能够支持HTTP/1.1协议标准,或者超过了最低水平
小巧:它具有非常少的运行时间,因为它不fork子进程来接受新请求,并且非常谨慎的分配内存(性能对比表:http://www.acme.com/software/thttpd/benchmarks.html)
便携:它能够在大部分的类Unix系统上运行,包括FreeBSD, SunOS 4, Solaris 2, BSD/OS, Linux, OSF等等
快速:它的速度要超过主流的Web服务器(Apache, NCSA, Netscape),在高负载情况下,它要快的多
安全:它努力的保护主机不受到攻击,不中断服务器

thttpd 类似于lighttpd,对于并发请求不使用fork()来派生子进程处理,而是采用多路复用(Multiplex)技术来实现。因此效能很好。同时它还 有一个特点就是基于URL的文件流量限制,这对于下载的流量控制而言是非常方便的。象Apache就必须使用插件实现,效率较thttpd低。
thttpd跟lighttpd类似,适合静态资源类的服务,比如图片、资源文件、静态HTML等等的应用,性能应该比较好,同时也适合简单的CGI应用的场合。
官方地址:http://www.acme.com/software/thttpd/
下载地址:http://www.acme.com/software/thttpd/thttpd-2.25b.tar.gz

4、lighttpd - light footprint + httpd = LightTPD
Lighttpd是一个德国人领导的开源软件,其根本的目的是提供一个专门针对高性能网站,安全、快速、兼容性好并且灵活的web server环境。具有非常低的内存开销,cpu占用率低,效能好,以及丰富的模块等特点。
lighttpd 是众多OpenSource轻量级的web server中较为优秀的一个。支持FastCGI, CGI, Auth, 输出压缩(output compress), URL重写, Alias等重要功能,而Apache之所以流行,很大程度也是因为功能丰富,在lighttpd上很多功能都有相应的实现了,这点对于apache的用 户是非常重要的,因为迁移到lighttpd就必须面对这些问题。
实用起来lighttpd确实非常不错,apache主要的问题是密集并发下,不断的fork()和切换,以及较高(相对于 lighttpd而言)的内存占用,使系统的资源几尽枯竭。而lighttpd采用了Multiplex技术,代码经过优化,体积非常小,资源占用很低, 而且反应速度相当快。
利用apache的rewrite技术,将繁重的cgi/fastcgi任务交给lighttpd来完成,充分利用两者的优点,现在那台服务器的负载下降了一个数量级,而且反应速度也提高了一个甚至是2个数量级!
lighttpd 适合静态资源类的服务,比如图片、资源文件、静态HTML等等的应用,性能应该比较好,同时也适合简单的CGI应用的场合。

官方地址:http://www.lighttpd.net/
下载地址:http://www.lighttpd.net/download/lighttpd-1.4.16.tar.gz

5、SHTTPD - Simple HTTPD
Shttpd是另一个轻量级的web server,具有比thttpd更丰富的功能特性,支持CGI, SSL, cookie, MD5认证, 还能嵌入(embedded)到现有的软件里。最有意思的是不需要配置文件!由于shttpd可以嵌入其他软件,因此可以非常容易的开发嵌入式系统的 web server,官方网站上称shttpd如果使用uclibc/dielibc(libc的简化子集)则开销将非常非常低。

特点:
    小巧、快速、不膨胀、无需安装、简单的40KB的exe文件,随意运行
    支持GET, POST, HEAD, PUT, DELETE 等方法
    支持CGI, SSL, SSI, MD5验证, resumed download, aliases, inetd模式运行
    标准日志格式
    非常简单整洁的嵌入式API
    dietlibc friendly. NOT that friendly to the uClibc (*)
    容易定制运行在任意平台:Windows, QNX, RTEMS, UNIX (*BSD, Solaris, Linux)
由于shttpd可以轻松嵌入其他程序里,因此shttpd是较为理想的web server开发原形,开发人员可以基于shttpd开发出自己的webserver!
官方网站:http://shttpd.sourceforge.net/
下载地址:http://jaist.dl.sourceforge.net/sourceforge/shttpd/shttpd-1.38.tar.gz

被阅2559次, 0票 发表评论

轻量级 Web 服务器

Admin 于 2008-10-15 02:04:37 发表其它

最近几年,市场上出现了很多有趣的 Web 服务器实现,包括 lighthttpd、litespeed 和 mongrel 等。这些 Web 服务器都宣称结合了性能、易管理性、可移植性、安全性和其他相关价值。下面的工程研究将调查轻量级 Web 服务器,以帮助您选择最可能满足下一个项目的技术需求的 Web 服务器。

被阅1006次, 1票 发表评论

Access、HSQLDB、Firebird、Sybase、Derby、SQLite、MySQL及DB4O客户端Embedded数据库比较

Admin 于 2008-10-12 16:30:23 发表其它

一、Access
    数据类型有些另类,而且密码太容易被攻破,性能不高,只能用在Windows程序上。
二、HSQLDB
    支持csv,配置分发容易,大数据量情况下性能不佳,这和sql执行效率无关,性能瓶颈在硬盘文件上,毕竟由于hsqldb没有在数据文件存储上花时间,只是挂个csv。只能用于Java程序中。
三、firebird
    数据文件是单一,部署、分发相对简单;用embedded方式,只需要把icudt30.dll、icuin30.dll、icuuc30.dll、 jaybird21.dll、fbembed.dll五个文件和目录intl(里面有两个文件,是处理字符集的)放在程序启动目录就行了;中文支持的不错,但是要在建库的时候使用GB_2312字符集。有.NET、C++、Java多个Binding。
四、Sybase asa
    数据能加密,性能不错,需要付费。
五、derby
    性能和易用性都不错,但embedded版本完全没有数据认证,导致谁都可以打开数据库执行sql语句,而且数据库是以一个目录存储的。只能用于Java程序中。
六、sqllite
    官方发行版本不支持数据加密,另外,对中文,尤其是用中文order by的时候时常错误;还有就是完全没有用户认证;不过执行效率不错。几乎稍微流行点的编程语言都有相应的Binding。
七、mysql
    虽然mysql也可以不通过安装,直接拷贝就能使用,但是距离embedded还差一块。
八、DB4O
    面向对象的数据库,使用DB4O无需ORM工具就可以直接进行对象存储。支持Java和.Net平台。可以自定义数据加密算法,性能优良,单文件。虽然也支持Server模式,但最适合用于Embedded。

    此外还有VistaDB、BerkeleyDB之类可以选择。

1 / 2 / 14 | « 1 2 » |
Powered by MiniBoke v2.0.0.8 Build 0828

Copyright © 2008 开源吧!. All rights reserved.

粤ICP备07500939号