2012年3月30日
摘要: 不知道是不是我引起的话题,老赵出了个O1的面试题。 // Please write an sequence list implements the interface with the required // time complexity described in the comments. The users can add the same // element as many times as they want, but it doesn't support the null item. // You can use any types in .NET BCL but cannot use any 3rd party libraries. // PS: You don't need to consider the multi-threaded environment. 阅读全文
posted @ 2012-03-30 12:13 一路转圈的雪人 阅读(5607) 评论(20) 推荐(4) 编辑
  2012年3月26日
摘要: 两年多的时间里写了一些东西,做个目录方便自己查找。也包含了自己打算写的一些东西。一.网络协议1.字节和字符,对信息进行编码2.分组报文,协议和Socket的概念3.Socket:流,TCP连接,TCP可靠性概述4.TCP和流5.关于TCP的可靠性6.用TCP/IP实现自己简单的应用程序协议:成帧器部分7.用TCP/IP实现自己简单的应用程序协议:其余部分(包括完整代码)8.用TCP/IP实现自己简单的应用程序协议:最后再返回来看HTTP协议9.由TCP的可靠性实现对比WCF中可靠性的实现(未完成)10.由传输过程中需要面对的问题探讨WCF中的“可靠性”二.多线程之旅1.多线程之旅——从概念开始 阅读全文
posted @ 2012-03-26 10:41 一路转圈的雪人 阅读(757) 评论(0) 推荐(0) 编辑
  2012年3月16日
摘要: DI 是一种理念,DI Container是实现DI这种理念的一种方式。把对象间的关系(Object graphy)集中管理1.可以转移到方法名,字符串,xml中。2.并没有使编程变得更简单,只是把一部分变得更抽象,显得更强壮了而已。3.IOC容器管理了对象的依赖关系,因此要在程序运行前启动。因为没有具体依赖的程序什么都不是。几种依赖注入的方式: 阅读全文
posted @ 2012-03-16 14:11 一路转圈的雪人 阅读(236) 评论(0) 推荐(0) 编辑
摘要: 原文链接首先,介绍几种常见的I/O模型及其区别,如下:blocking I/Ononblocking I/OI/O multiplexing (select and poll)signal driven I/O (SIGIO)asynchronous I/O (the POSIX aio_functions)blocking I/O 这个不用多解释吧,阻塞套接字。下图是它调用过程的图示: 重点解释下上图,下面例子都会讲到。首先application调用 recvfrom()转入kernel,注意kernel有2个过程,wait for data和copy data from kernel to 阅读全文
posted @ 2012-03-16 13:53 一路转圈的雪人 阅读(495) 评论(0) 推荐(0) 编辑
  2012年3月11日
摘要: 把引用对象作为参数传进一个方法,实际上是在栈上新分配了一块内存保存传入的地址。如图所示,把局部变量name传入M2方法后,栈上新开了一块内存S,用来保存"joe"的地址。其实拿string来说明不太合适,因为string类是不可变的。但是为借用CLR VIA C#中现成的图咱们就将就一下了。这时如果能够直接修改s所指向的内容的话(在C#中string是不可变类,无法演示),外部的局部变量name由于和形参s指向的是同一个对象,因此name也会改变。(图1)但是如果把s指向一个新的的string时,比如:void M2(string s){ s = "new str 阅读全文
posted @ 2012-03-11 21:43 一路转圈的雪人 阅读(1852) 评论(2) 推荐(0) 编辑
  2012年2月26日
摘要: 这篇随笔和上篇随笔《从两个数组中查找相同的数字谈Hashtable》都是为了下面分析Dictionary的实现做的铺垫一.两个逻辑上相等的实例对象。两个对象相等,除了指两个不同变量引用了同一个对象外,更多的是指逻辑上的相等。什么是逻辑上相等呢?就是在一定的前提上,这两个对象是相等的。比如说某男生叫刘益红,然后也有另外一个女生叫刘益红,虽然这两个人身高,爱好,甚至性别上都不相同,但是从名字上来说,两者是相同的。Equals方法通常指的就是逻辑上相等。有些东西不可比较,比如说人和树比智力,因为树没有智力,所以不可比较。但是可以知道人和树不相等。二.Object的GetHashcode方法。计算Ha 阅读全文
posted @ 2012-02-26 13:28 一路转圈的雪人 阅读(5579) 评论(2) 推荐(1) 编辑
  2012年2月21日
摘要: private void Insert(TKey key, TValue value, bool add){ if (key == null) { ThrowHelper.ThrowArgumentNullException(ExceptionArgument.key); } if (this.buckets == null) { this.Initialize(0); } int num = this.comparer.GetHashCode(key) & 2147483647; int num2 = num % t... 阅读全文
posted @ 2012-02-21 20:28 一路转圈的雪人 阅读(766) 评论(0) 推荐(0) 编辑
  2012年2月16日
摘要: 提纲:1.在一次比较过程中,我们能确定位置的只有一个元素的位置,在外层循环中体现。比如说在插入排序和选择排序中,外层循环 i 就是已经排好序的元素的个数。那些大于等于 i 的当前的值的的都是等待排序的元素,也就是内层循环 j 需要处理的部分。但是我们能使得数组中的元素“基本有序"基于比较的排序算法,一次只能得出一个结果。最好的情况就是把问题分解成两个1/2的规模,而不是一个1/4,另一个3/4。因为你无法知道你是否处于另一个糟糕的状况之中。因为一次比较只能得出 “大于” 或者 “小于”两个结果,所以底数为log2,而问题的所有解的规模最初是n,当第一轮排序完成后,未排序的元素是n-1 阅读全文
posted @ 2012-02-16 20:37 一路转圈的雪人 阅读(294) 评论(0) 推荐(0) 编辑
摘要: 提纲1.n和n+1的关系结论必须由一个整数n决定结论的定义必须明确,这样我们才可能检验由第n项过渡到下一项也就是n+1的时候,结论是否还能成立。我们期望得到这样一个结果:只要这个结论对n成立,那么对n+1也成立。所以我们要做的有两件事,一是证实结论在取某个值时是正确的,二就是证实取下一个值也是正确的。我们考虑,如果取某个值,那么这个值取什么数好呢?很显然,什么事情我们都希望从最简单的情况出发,因此取1就是我们的选择,也就是n=1。因此n=1时成立,所以n+=1,也就是n=2的时候也成立,同理,n=3的时候也成立。从任意整数过渡到下一个,我们就普遍的证明了这个结论。普遍的证明说明已经遍历了所有情 阅读全文
posted @ 2012-02-16 20:34 一路转圈的雪人 阅读(806) 评论(0) 推荐(0) 编辑
  2012年2月15日
摘要: 我们最直观的就是通过两层for循环来对比每个数组中的数字。因此A数组中的每个元素都会和B数组中的每个元素对比过一次,所以总共要对比的次数是n个n相加(或者是n个m相加),也就是n2(或者为n x m). 阅读全文
posted @ 2012-02-15 23:25 一路转圈的雪人 阅读(9208) 评论(6) 推荐(4) 编辑
  2012年2月5日
摘要: 进程:分配系统资源的一种数据结构。简而言之,就像一个储物箱一样,特点是为了保证安全,一个进程中的指针被设计为不可访问其他进程的地址。就像你的钥匙正常情况下不能随便打开任何一个人的储物箱一样,你只能打开自己的储物箱。如果打开别人的储物箱,不是无意的编码疏忽,就是恶意的攻击其他程序。线程:分配CPU运行周期的一种数据结构。线程其实是任务的抽象概念。创建一个线程,相当于告诉CPU我有一个新任务需要你分配时间来处理。多线程和一个线程执行多个任务的区别就在于创建多个线程就是要求cpu要同时处理一些事情,而不是有先后顺序。在unix下其实就没有线程这种概念,就只有任务的概念。一个任务就相当于只有一个线程的 阅读全文
posted @ 2012-02-05 19:53 一路转圈的雪人 阅读(1272) 评论(0) 推荐(1) 编辑
摘要: 程序执行顺序是按照串行执行的假设: 比如我们读诗词,默认从上到下 1.床 前 明 月 光, 2.疑 是 地 上 霜。 3.举 头 望 明 月, 4.低 头 思 故 乡。 阅读全文
posted @ 2012-02-05 19:45 一路转圈的雪人 阅读(3430) 评论(3) 推荐(4) 编辑
  2012年2月3日
摘要: 基于SOAP消息格式的WCF之所以强大原因之一是因为SOAP消息头的高度扩展性。相应的WS-*协议很多都体现在消息头封装的信息上,包括诸如寻址,需要调用方法名,维护Session的信息等等…… SOAP示例 阅读全文
posted @ 2012-02-03 18:03 一路转圈的雪人 阅读(3463) 评论(1) 推荐(2) 编辑
  2012年2月2日
摘要: 消息可靠性和传输可靠性是WCF区别于WebService的两大特征。在前面谈到TCP的可靠性的一些基本知识,那么它和WCF的可靠性有什么异同点呢? WCF可以基于各种不同的协议,因此WCF的可靠性并不依赖于TCP协议,而是有自己的协议实现,也就是WS-RM。 在了解我们先看下Web环境下,我们所面对的问题: 传输通信可能产生的问题 1.服务器可能宕掉,或者路由器可能忙于处理大量请求而造成的网络阻塞。 阅读全文
posted @ 2012-02-02 15:10 一路转圈的雪人 阅读(1795) 评论(1) 推荐(2) 编辑
  2012年2月1日
摘要: TCP三次握手对比WS-RM的Message Flow• CreateSequence• CreateSequenceResponse• SequenceAcknowledgement• LastMessage• TerminateSequence 阅读全文
posted @ 2012-02-01 21:31 一路转圈的雪人 阅读(361) 评论(0) 推荐(0) 编辑
  2012年1月6日
摘要: 想写点什么东西,但是又有点懒,先放草稿,不然以后又忘记了:1.Address类似于虚拟表的内存地址2.binding对应着CLR类型3.Contract代表接口。C#中没有真正意义上的早绑定。地址无关代码。代理模式。按照严格意义上的早起绑定来说,比如C语言在编译的时候,编译器就可以知道某个方法所对应的物理地址。但是C#中,方法在编译时都是一个IL token,指向的都是CLR中的JIT函数。在运行第一遍的时候,JIT才生成native code,这时才有真正的地址,并把地址返回给相应的引用。因此如果按照这个定义来说,C#中没有真正意义上的早绑定。但是,我们这里采用编译时编译器知道相应的类型来算 阅读全文
posted @ 2012-01-06 09:30 一路转圈的雪人 阅读(507) 评论(0) 推荐(0) 编辑
  2011年12月19日
摘要: You can however sign with the private key and verify the signature with the public key.While the math involve makes sense when the key roles are reversed (and this is how signatures work), encrypting for privacy doesn't make much sense when the decryption key is well know and public.If you want 阅读全文
posted @ 2011-12-19 13:32 一路转圈的雪人 阅读(1595) 评论(0) 推荐(0) 编辑
  2011年8月15日
摘要: 之前我们实现了一个自己的应用层的协议,功能非常简单,只包括了最基本的成帧和解析功能。不过有了这些基础,我们再返回来看看现在在互联网上最通行的http协议,就会容易懂得许多。http具体是做什么的,网上面讲解很多,比如:我们知道,Internet的基本协议是TCP/IP协议,然而在TCP/IP模型最上层的是应用层(Application layer),它包含所有高层的协议。高层协议有:文件传输协议FTP、电子邮件传输协议SMTP、网络新闻传输协议NNTP和HTTP协议等。 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地. 阅读全文
posted @ 2011-08-15 22:49 一路转圈的雪人 阅读(13574) 评论(6) 推荐(7) 编辑
摘要: 接着上次用TCP/IP实现自己简单的应用程序协议:成帧器部分,现在把接下来的部分也说完点击下载完整源码:客户端的调用: public class VoteClientTCP { public static int CANDIDATEID = 888;//随便写了一个 public static void Main(String[] args) { int port = 5555; IPEndPoint ipep = new IPEndPoint(GetLocalhostIPv4Addresses().First(), port); Socket sock = new Socket(Addres 阅读全文
posted @ 2011-08-15 09:29 一路转圈的雪人 阅读(2846) 评论(1) 推荐(1) 编辑
  2011年8月11日
摘要: 在前面《字节和字符,对信息进行编码》,《Socket=>流,TCP连接,TCP可靠性概述》一系列的随笔中我们已经表述了相应的理论知识,现在可以动手实现一个自己的应用程序协议。将数据转换成在线路上传输的字节序列只完成了一半的工作,在接收端还必须将接受到的字节序列还原成原始信息。如果以流作为传输的形式,那么首先面临的问题就是在接收端如何确定这是一条消息,换句话说就是如何定位一条消息的开始和结束。值得注意的是,这个工作应该是在应用程序协议这一层来完成而不是在TCP这一层来完成,应用程序协议必须指定消息的接受者如何确定何时消息已完整接收。TCP协议中没有消息边界的概念,这会让我们在解析信息的时候 阅读全文
posted @ 2011-08-11 23:33 一路转圈的雪人 阅读(3217) 评论(3) 推荐(2) 编辑
  2011年7月27日
摘要: B+树,由二叉树和双向链表引申出来的一种数据结构。通常数据库的索引是通过B+树来实现的。聚集索引和非聚集索引都是B+树的结构。聚集索引不但描述了数据是如何组织的,聚集索引其实就是数据本身。数据存放在“叶页”上,叶页也就是数据页,和下文的索引页需要区分开来。下面是从网上找来的我认为比较通俗易懂的关于B+树的讲解:B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如: B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关 阅读全文
posted @ 2011-07-27 23:38 一路转圈的雪人 阅读(7494) 评论(1) 推荐(5) 编辑
  2011年7月3日
摘要: TCP是一个可靠的协议。有时人们会说:"TCP能够保证它所发送数据的可靠传输。"这种说法尽管很常见,但却非常不恰当。首先,只要稍微想一下就会知道这不可能是对的。比如,假设在数据传输的过程中将一台主机从网络上断开,TCP这侧不管做出何种努力,都无法获取其余 的数据。网络确实会中断,主机确实会崩溃,用户确实会在TCP连接仍然活跃的时候关机。这些事件或其他类似的事件都使得TCP无法将它从应用程序收到的数 据传送出去。但更重要的是,TCP"确保可靠传输"这种说法会对不够谨慎的网络程序员产生微妙的影响。当然,没人真的会相信TCP有某种魔法总是可以将数据安全 地传送 阅读全文
posted @ 2011-07-03 22:55 一路转圈的雪人 阅读(9095) 评论(3) 推荐(4) 编辑
摘要: TCP是一种流协议(stream protocol)。这就意味着数据是以字节流的形式传递给接收者的,没有固有的"报文"或"报文边界"的概念。从这方面来说,读取TCP数据就像从串行端口读取数据一样--无法预先得知在一次指定的读调用中会返回多少字节(也就是说能知道总共要读多少,但是不知道具体某一次读多少... 阅读全文
posted @ 2011-07-03 22:48 一路转圈的雪人 阅读(7811) 评论(0) 推荐(1) 编辑
摘要: 如前文所说,不同类型的Socket与不同类型的底层协议族以及同一协议族中的不同协议相关联。而我想说的主要就是TCP/IP协议族中的内容。现在TCP/IP协议族中的主要socket类型为"流套接字(stream socket)"和"数据报套接字(datagram socket)"。如果类比到现实中 stream socket类似于打电话沟通,datagram socket类似于写信沟通。当然,其他协议族当然也有相应的stream socket和datagram socket。 我学习的时候喜欢把类似的事物的异同点相比较,因此我就先从相同点开始说起。 一.C 阅读全文
posted @ 2011-07-03 10:56 一路转圈的雪人 阅读(4179) 评论(1) 推荐(1) 编辑
  2011年6月30日
摘要: 这篇随笔是我接着上篇《字节和字符,对信息进行编码》继续写的内容,看过上篇随笔能更好的理解这篇内容。我想从基础的开始说起,一直说到Asp.net,WCF为止。 信息是指由程序创建和建设的“字节序列”。在网络环境中,这些字节序列被称作“分组报文”。一组报文包括了网络用来完成工作的控制信息,还包括了数据信 阅读全文
posted @ 2011-06-30 23:17 一路转圈的雪人 阅读(6735) 评论(3) 推荐(5) 编辑