摘要:
本文与您探讨为什么Sql Server有完整备份、差异备份和事务日志备份三种备份方式,以及为什么数据库又有简单模式、完整模式和大容量日志模式这三种恢复模式。本文内容适用于2005以上所有版本的Sql Server数据库 。单就操作过程而言,Sql Server中数据库备份和恢复过程是相当简单的,可以通过Management Studio的图形界面进行操作,也可以使用几句T-SQL语句完成。但要明白备份恢复的整个过程,定制符合系统需求数据库备份方案,却需要知晓数据库的实现原理。备份和恢复是数据库的核心功能。1 数据库原理本节简要讨论了Sql Server数据库的存储的物理和逻辑结构,这是备份恢复 阅读全文
摘要:
同Java、.NET实现的应用程序类似,Javascript编写的应用程序也面临一个同样的问题:源代码的保护。尽管对大多数Javascript应用公开源代码不算是很严重的问题,但是对于某些开发者来说,特别是HTML5、WebGL和其它纯Javascript实现的项目,知识产权保护是不能忽视的,保护好源代码至少可以增加竞争对手山寨你的应用的成本。通过混淆Javascript代码的方法,可以降低代码的可读性,在一定程度上保护源代码;同时,混淆算法多数都会用非常短的变量名,因此混淆后的代码往往体积更小,网络传输效率和加载运行的效率更高一些。Javascript代码混淆工具目前各种开源的或商业的Jav 阅读全文
摘要:
C#中引入匿名函数,多少都是受到Javascript的闭包语法和面向函数编程语言的影响。人们发现,在表达式中直接编写函数代码是一种普遍存在的需求,这种语法将比那种必须在某个特定地方定义函数的方式灵活和高效很多,比如回调和事件处理都特别适合使用表达式中直接编写函数的形式,因此C#的匿名函数也就应运而生。初识C#中的匿名函数,多多少少并不是那么直观,在匿名函数中,可以直接使用该匿名函数所在的函数中的局部变量,这和Javascript闭包函数在语法形式和运行结果上非常相似,但两者在实现原理上却完全不同,后者是语言内在特性,而前者(C#匿名函数)只是一个编译器功能,也称语法糖。1. Javascrip 阅读全文
摘要:
在上一篇文章《Javascript本质第一篇:核心概念》中,对Javascript执行上下文做了解释,但是这些都是基于Javascript标准中对执行上下文的定义,也就是说理论上的东西,本文将在Google Chrome中通过实际代码来展示Javascript的执行上下文。1. Javascritp运行时内存监控Google Chrome的开发人员工具包含了Javascript性能监控工具,通过这个工具可以查看Javascript运行时内存占用情况、监控CPU消耗、查找内存泄漏等。F12打开Chrome的开发人员工具,点击“Profiles”选项卡,选择“Take Heap Snapshot” 阅读全文
摘要:
很多人在使用Javascript之前都至少使用过C++、C#或Java,面向对象的编程思想已经根深蒂固,恰好Javascript在语法上借鉴了Java,虽然方便了Javascript的入门,但要深入理解Javascript的时候,长期使用这些编程语言造成的思维定势却给使用Javascript带来误导。作者在学习Javascript的时候曾陷入了这个误区,希望通过这篇文章让新学者避免走这个弯路,迅速正确地掌握Javascript。1. 要点在面对Javascript时,要牢记以下几点:1.1 Javascript不是面向对象的编程语言如果非要把Javascript归到面向什么的话,Javascr 阅读全文
摘要:
前面写过两篇文章Async和Await异步编程的原理和.NET中STAThread和MTAThread。一个关于.NET异步编程,一个关于COM公寓模型,在这两篇文章中都涉及到了一个线程让另一个线程执行指定代码的问题,而这个问题其实是.NET异步编程和COM运行中非常核心的问题,因此有必要进一步讨论。对于一个线程让另一个线程执行指定代码这个过程是否有标准的名称或叫法,我确实不知道(请大家多多指教),为了方便,我将其称为跨线程委托执行。1. 什么是跨线程委托执行为了给出一个更一般的定义,我们假设有一个程序,该程序有一个函数F,该程序运行时有两个处于运行状态的线程T1和T2。T1执行到某一位置,需 阅读全文
摘要:
本文讨论在.NET中使用进程内COM组件时的公寓模型,以一个示例直观演示STAThread和MTAThread的作用和区别。1. COM中的公寓1.1 基本规则公寓是COM组件的运行环境,日常生活中公寓是用来住人的,COM中的公寓是用来住COM组件的对象的,每个COM对象必须且只能位于一个公寓中:单线程公寓(STA)或多线程公寓(MTA)。每个进程可以有0或多个STA。每个进程可以有0或1个MTA。一个线程只能关联到一个公寓。因此所有关联到MTA的线程都是关联到进程唯一的一个MTA。本线程访问与本线程关联的STA中的COM对象不需要列集,直接访问。其他线程对STA中的COM对象的访问需要列集( 阅读全文
摘要:
1. 简介前一篇文章提到了如何将输出流转换为输入流,用同样的方法可以实现流的分支,就是将一个输出流的内容同时发送给两或多个输入流。2. 应用场景当需要将数据处理过程中一个中间结果以流的形式传递个两个或者多个处理程序时候,就需要对流进行分支,如果中间结果是以输入流的形式出现,那处理方法就很直观很简单了,但是多数情况下,中间结果是以输出流的形式出现的,这个时候还是输出流转输入流的问题,只是更进一步,可以将一个输出流转换为两个或多个输入流,这样就实现了流的分支。3. 实现代码 1 [TestMethod] 2 public void OutputStream2Mult... 阅读全文
摘要:
本文不是关于Async和Await异步编程的入门,是对Async和Await异步编程实现原理的深入研究。本文通过对包含Async和Await关键字的代码的反编译,来揭示Async和Await异步编程的背后实现。 阅读全文
摘要:
最近在写一段代码,将本地文件压缩加密后发送到服务器,发送到服务器的类用一个输入流作为参数获取要上传的数据,而压缩类和加密类都是输出流。如何将输出流转换为输入流,最直观的方法是缓存输出流的全部内容到内存或文件中,但是当数据变大的时候,这两种方法显然都不太合适。通过使用管道,可以将一个输出流转换为输入流。管道是一个操作系统功能,由一个循环缓存区构成,用于进程间通信,将一个进程的输出做为另一个进程的输入,Linux命令行脚本大量的用到管道通信,Windows同样也支持管道。.net对管道有封装的类,使用管道,在两个线程间通信,将一个进程的输出传递到另一个进程作为输入,.net中管道类继承自Strea 阅读全文