文章分类

站点统计

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

通过System.Data.SQLite.dll往SQLite数据库中插入Blob数据

KY8 于 2009-01-14 18:23:12 发表.Net

有两种方法可以实现:
①、通过SQLiteParameter

  1. static void TestSqliteBinary() 
  2.     using (SQLiteConnection cnn = new SQLiteConnection("data source=temp.db")) 
  3.     { 
  4.         cnn.Open(); 
  5.         using (SQLiteCommand cmd = cnn.CreateCommand()) 
  6.         { 
  7.             //cmd.CommandText = "Create Table test(data Image)"; 
  8.             //cmd.ExecuteNonQuery(); 
  9.  
  10.             cmd.CommandText = "insert into test values(@data)"
  11.             SQLiteParameter para = new SQLiteParameter("@data",DbType.Binary); 
  12.             string file = @"info.zip"
  13.             FileStream fs = new FileStream(file, FileMode.Open); 
  14.             StreamUtil su = new StreamUtil(); 
  15.  
  16.             byte[] buffer = su.StreamToBytes(fs); 
  17.             fs.Close(); 
  18.  
  19.             para.Value = buffer; 
  20.             cmd.Parameters.Add(para); 
  21.             cmd.ExecuteNonQuery(); 
  22.         } 
  23.     } 


②、通过16进制字符编码:

  1. INSERT INTO Foo (blob) VALUES(X'BADF00D'


In the above example, the binary data is quoted as hex, but inserted into the database as actual binary characters.  Data is retrieved as a byte[] array.

被阅1709次, 1票SQLite Blob 发表评论

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中的接口是为了模拟断电时,核实页中错误恢复机制的。

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

压缩网站的JavaScript文件

KY8 于 2009-01-03 14:55:48 发表JavaScript

通常在一个 Web 2.0 应用中,会有很多业务逻辑相关的 JS 代码,而且很多逻辑从后台搬到了客户端执行,因此这部分客户端代码非常多。为了提供更快的响应速度,典型的做法是压缩所有客户端需要加载的资源包括图 片,HTML 文件,CSS 文件,JS 代码等等,而图片文件已经无法再进行压缩,只有 HTML,CSS,JS 等文本文件有进一步压缩的空间。

进行JavaScript文件压缩的工具比较多:Douglas Crockford的JSMINthe Dojo compressor、Dean Edwards的PackerYUI Compressor

the Dojo compressor shrinksafe 之所以称其“safe”,是因为它在压缩了 JS 文件以后,不会改变其对象内部方法和属性名称,引用到该段代码的地方不需要任何更改,还是可以直接调用其内部方法和属性。在 custom_rhino.jar 所在的目录运行 java –jar custom_rhino.jar –version 100 可以进入 rihno 的命令行状态。

压缩一个 JS 文件的命令如下:

                java -jar custom_rhino.jar -c infile.js > outfile.js
                

经测试,一个 JS 文件经过这样的命令压缩后,可以减小 30% 左右,将压缩后的文件放回系统中,对该 JS 文件的功能调用没有任何影响。

YUI Compressor不但可以压缩JavaScript还可以压缩CSS,用法:

  1. Usage: java -jar yuicompressor-x.y.z.jar [options] [input file] 
  2.  
  3. Global Options 
  4.     -h, --help                      Displays this information 
  5.     --type <js|css>             Specifies the type of the input file 
  6.     --charset <charset> Read the input file using <charset> 
  7.     --line-break <column>   Insert a line break after the specified column number 
  8.     -v, --verbose                       Display informational messages and warnings 
  9.     -o <file>                       Place the output into <file>. Defaults to stdout. 
  10.  
  11. JavaScript Options 
  12.     --nomunge                       Minify only, do not obfuscate 
  13.     --preserve-semi             Preserve all semicolons 
  14.     --disable-optimizations Disable all micro optimizations 

JSMIN可以通过“Javascript精简压缩”进行在线压缩

Packer可以通过“Javascript混淆打包”进行在线压缩

被阅748次, 0票压缩 JavaScript 发表评论

Google Chrome 构建指南

KY8 于 2009-01-03 05:12:48 发表谷歌浏览器

首先,配置开发环境:
   1. 安装VS2005,全部安装,不要只选VC++。
   2. 安装VS2005 SP1,根椐VS的语言选择安装,这里给出的链接是中文版的。
   3. 安装Windows SDK 2008,安装完后,执行:开始|所有程序|microsoft windows SDK v6.1|Visual Studio Registration|Windows SDK Configuration tool 将最新的SDK与VS2005关联起来。

开发环境准备完毕,接下来下载Chrome的源代码:
   1. 下载depot_tools_win.zip,下完解压到一个目录,假设解压后的目录是:C:\depot_tools。
   2. 把depot_tools的路径加入PATH环境变量:我的电脑|属性|高级|环境变量。
   3. 创建一个存放代码的文件夹,假设是:c:\trunk;运行cmd并将当前路径定位到该文件夹: cd c:\trunk。
   4. 在cmd里执行:gclient config http://src.chromium.org/svn/trunk/src。
   5. 执行完后,再执行:gclient sync,此时就开始检出Chrome的代码,需要很长的时间。

经过很长的时间,代码终于取下来了,现在开始构建:
   1. 打开c:\trunk\src\chrome\chrome.sln。
   2. 会看到app目录下有一个chrome_exe工程,构建它就行了。

耐心地等待构建,幸运的话,目标文件会生成在:c:\trunk\src\chrome\debug

被阅752次, 0票Chrome Google 发表评论

JavaScript游戏库及25个网页游戏

Admin 于 2008-12-22 02:40:29 发表JavaScript

JavaScript,随着Ajax的兴起,正成为每一位web设计师/开发者必知的语言。在JavaScript的帮助下,你几乎做任何事。这儿 有许多 容易使用的JavaScript库,如jQuery、MooTools、Prototype等,以及许多适合编写游戏的库如Game JSGameQueryJavaScript GameLib

这篇文章列出了25款JavaScript游戏,包括中国象棋经典的打猎游戏Digg攻击火星入侵者单人纸牌纸牌游戏等等,未来我们肯定会看到更多的JavaScrip游戏。

被阅2053次, 0票网页游戏 发表评论

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 

 

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

AWT、SWING与SWT、JFACE比较

Admin 于 2008-10-19 22:52:59 发表Java

AWT和SWT实现原理不同:AWT控件相当于是一笔一画绣出来的,参加java.awt.Component.paint(Graphics g),性能差;而SWT调用了操作系统后台原生库,org.eclipse.swt.widgets.Control类型中就没有类似的paint方法 了,但是有一个接口org.eclipse.swt.graphics.Drawable。实现原理的不同带来了性能和用户视觉的差异。

SWING是基于AWT提供的MVC不完全实现,JFACE是基于SWT提供的MVC不完全实现。两者的核心作用都是提供了viewer和模型封装的概 念,从设计实现层面看,SWING更加唯美一些,JFACE则更加侧重于实用。SWING和JFACE两者都偏重于行为控制上下文,而对UI数据(例如, 一个文本框控件中的内容)的管理都没有做太多的设计。JFACE中略有改进,提供了setData的概念。JFACE是为了Eclipse而生的,虽然后 来 RCP出来了,又做了其他的包装宣传,典型的体现就是提供了JFace Text Framework和其他一些用户构建Eclipse元素的UI支持,也提供了一些系统资源管理(ImageRegsitry、 ResourceManager等)等附加功能。

SWING框架与代码很优美,但效率低,特别是高级控件如各种选择框超慢,与Windows本身不协调,使用体验差;而且再怎么使用LookAndFeel,还是不美观,总是感觉画的不清晰。

被阅1464次, 0票AWT SWING SWT JFACE 发表评论

JavaScript图形库jsGraphics

Admin 于 2008-10-19 00:30:05 发表JavaScript

此JavaScript图形库可在网页上动态绘制圆、椭圆、斜线、折线、多边形(包括三角形、矩形)。底层通过创建大量1px*1px的DIV实 现,同时对于连续的像素进行了优化,尽量地减少所需的DIV,因此有较好的性能,当然和Java2D、GDI+、OpenGL、DirectX、 Flash、SVG、VML及HTML Canvas是无法相比较的。网站:http://www.walterzorn.com/jsgraphics/jsgraphics_e.htm 。使用LGPL协议发布。
1、效果

2、优化原理

支持的浏览器
Linux: Browsers with Gecko-Engine (Mozilla, Netscape 6+, Galeon), Konqueror, Opera 5, 6 and 7+.
Windows: Gecko-Browsers, IE 4, 5 and 6, Opera 5, 6 and 7+.
Mac: Safari, Gecko-Browsers, Opera, partially IE.

使用方法:
1、下载,并在页面中引入脚本:<script type="text/javascript" src="wz_jsgraphics.js"></script>
2、创建一个Div作为画布:
<div id="myCanvas" style="position:relative;height:250px;width:100%;"></div>
3、在JavaScript中创建对象:

  1. <script type="text/javascript"> 
  2. <!--方法一: 
  3. var jg = new jsGraphics("myCanvas"); 
  4. //--> 
  5. </script> 
  6. <script type="text/javascript"> 
  7. <!--方法二: 
  8. var cnv = document.getElementById("myCanvas"); 
  9. var jg = new jsGraphics(cnv); 
  10. //--> 
  11. </script>  

4、例子:

  1. <script type="text/javascript"
  2. <!-- 
  3. function myDrawFunction() 
  4.   jg_doc.setColor("#00ff00"); // green 
  5.   jg_doc.fillEllipse(100, 200, 100, 180); // co-ordinates related to the document 
  6.   jg_doc.setColor("maroon"); 
  7.   jg_doc.drawPolyline(new Array(50, 10, 120), new Array(10, 50, 70)); 
  8.   jg_doc.paint(); // draws, in this case, directly into the document 
  9.  
  10.   jg.setColor("#ff0000"); // red 
  11.   jg.drawLine(10, 113, 220, 55); // co-ordinates related to "myCanvas" 
  12.   jg.setColor("#0000ff"); // blue 
  13.   jg.fillRect(110, 120, 30, 60); 
  14.   jg.paint(); 
  15.  
  16.   jg2.setColor("#0000ff"); // blue 
  17.   jg2.drawEllipse(10, 50, 30, 100); 
  18.   jg2.drawRect(400, 10, 100, 50); 
  19.   jg2.paint(); 
  20.  
  21. var jg_doc = new jsGraphics(); // draw directly into document 
  22. var jg = new jsGraphics("myCanvas"); 
  23. var jg2 = new jsGraphics("anotherCanvas"); 
  24.  
  25. myDrawFunction(); 
  26.  
  27. //--> 
  28. </script>  

 

被阅4094次, 2票jsGraphics 发表评论
3 / 19 / 145 | « 1 2 3 4 5 6 » |
Powered by MiniBoke v2.0.0.8 Build 0828

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

粤ICP备07500939号