摘要:
两年多的时间里写了一些东西,做个目录方便自己查找。也包含了自己打算写的一些东西。一.网络协议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.多线程之旅——从概念开始 阅读全文
摘要:
6x12了快2个月,累的不行…… 咱就是传说中的会iOS, Android, .NET,JAVA, JAVASCRIPT,SQL SERVER的 Full stack developer (全端工程师)么?据说“Full Stack Developer的核心并非否定团队和协作,而是更多的体现在架构设计,快速原型和TroubleShooting方面。” 阅读全文
摘要:
Lambda表达式可以转换成为代码(委托)或者数据(表达式树)。若将其赋值给委托,则Lambda表达式将转换为IL代码;如果赋值给 Expression,则构造出一颗表达式树。表达式树本质上来说就是一颗抽象语法树(AST),也就是一段代码经过 解析后用树形来表达出这段代码的意思。解释器将在代码优化和代码生成的时候使用到AST。在.NET中,表达式树就是C#编译器解析lambda表达式的 结果。简单来说,转换成表达式树以后,我们可以通过自己的解释器解析表达式树来按需求实现自己的逻辑。
比如想表达加法,用中文写就是 “二大于一” ,用数学来表达就是 "21",我们想表达的抽象概念就是大于,和具体的形式无关。因此表达式树中就有表示GreaterThan的一种Type,表达的就是这么一种 大于的抽象概念。它可以由编译器把lambda表达式 ()= 21 编译成我们所需的表达式树,然后我们再通过解析这个表达式树,把抽象概念翻译成我们所需的“二大于一”这种中文的具体形式。 阅读全文
摘要:
最近在看关于拖延症的一本书《拖拉一点也无妨》,后面得出结论是自己写博客大部分处于两种状态,心情很好和心情很不好的时候。因为正常状态下感觉写博客吧,是件很麻烦的事情,不如去看看电影看看漫画啥的。最近在看漫画《进击的巨人》和《一拳超人》,感觉是两种极端,哈哈。 最近在进行某个项目的重写工作,前后端都要重新构架重写,时间给了一个月。项目的现状大概是后端一个类有一万行左右,包含几十个方法。每个方法从一两百行到上千行不等,大部分方法是没有参数和返回值的,全局的操作几百个成员变量。业务需求不明确,没人能说得清,反正任务就是在不影响现有的功能的情况下重构+重写。现有的功能有啥?也没人能说得清。你说测试... 阅读全文
摘要:
Map 和 Reduce的概念介绍MapReduce的创意和灵感来源于函数式编程。map和reduce是函数式编程中两个常用函数。在函数式编程中,map函数对列表的每个元素执行操作或函数。例如,在列表[1, 2, 3, 4]上执行multiple-by-two函数会产生另一个列表[2, 4, 6, 8]。执行这些函数时,原有列表不会被修改。函数式编程认为应当保持数据不可变,避免在多个进程或线程间共享数据。这意味着刚演示过的map函数虽然很简单,却可以通过两个或更多线程在同一个列表上同时执行,线程之间互不影响,因为列表本身没有改变。与map函数类似,函数式编程中还有一个reduce函数的概念。实 阅读全文
摘要:
死锁是很讨厌的(虽然活锁更讨厌),如何避免死锁呢?
在两个线程间的循环等待是比较容易识别的,但是在死锁的形成中如果包含多个线程,那么就是难以发现的(现实中不少这种情况)。
首先来看看死锁形成的几个必要条件
1、互斥
2、等待
3、不可抢占
4、循环等待
除了完全避免多线程编程之外,如果要避免死锁,那么必须要使得上面这4个条件中有任意一个不满足。 阅读全文
摘要:
SOS这个工具很强大,能帮助我们分析和查询到很多有用的信息。如果配合它的扩展,还能帮我们定位一些死锁问题。拿我上一篇谈谈.NET中常见的内存泄露问题——GC、委托事件和弱引用的代码做例子,我们可以分析一个对象到底有没有被根引用,内存地址是什么,占用了多少内存等。SOS可以在Windbg中加载使用,也可以在Visual Studio中加载使用,为了能更方便的演示,我就说说如何在Visual Studio中加载使用一、要启用SOS,首先要修改项目的属性,如下图二、打开的“即时窗口”中输入“!load sos.dll”来加载SOS.dll在“即时窗口”中输入“!help”可以获得调试命令列表(如下) 阅读全文
摘要:
其实吧,内存泄露一直是个令人头疼的问题,在带有GC的语言中这个情况得到了很大的好转,但是仍然可能会有问题。一、什么是内存泄露(memory leak)?内存泄露不是指内存坏了,也不是值内存没插稳漏出来了,简单来说,内存泄露就是在你期待的时间内你程序所占用的内存没有按照你想象中的那样被释放。因此什么是你期待的时间呢?明白这点很重要。如果一个对象占用内存的时间和包含这个对象的程序一样长,但是你并不期望是这样。那么就可以认为是内存泄露了。用具体例子来说明如下:class Button { public void OnClick(object sender, EventArgs e) { ..... 阅读全文
摘要:
CALayer 在很多方面都与 UIView 非常相似。它拥有位置、大小、变形和内容。你可以用自定义 的代码(通常会用到 Core Graphics)来覆盖绘制方法以绘制定制内容。图层的层级关系与视图的非常 接近。你可能会问:为什么还要有分离的对象?
最重要的答案是 UIView 是一个很重量级的对象,它管理绘制与事件处理(尤其是触摸事件)。 CALayer 完全关乎绘制。事实上,UIView 依靠 CALayer 来管理绘制,这样两者就能协作得很好。
每个 UIView 都有一个 CALayer 用于绘制。而且每个 CALayer 都可以拥有子图层,就像每个 UIView 都可以拥有子视图一样 阅读全文
摘要:
早上无意中看到了async和await关键字,花了十几分钟看了一下msdn,大概明白了是什么一个东西,和大家分享一下。await关键字的中文是期待的意思。在我们编程中想表达“我待会期待这里会有一个值,但我不是现在就要,我先去做其他事情,你完成的时候告诉我”。其实异步模式非常符合现实中场景,现实生活中... 阅读全文
摘要:
使用线程的方式,可以通过GCD。 并发的后台任务,可以通过创建并发列队来实现。全局列队就是一个并发列队。 并发列队,执行的时候是并发的,GCD实现的时候会开启多线程。 串行列队,任务可以异步的放入队列,执行的时候会按照FIFO的顺序执行。因为是串行的,同一个串行列队不会有并发带来的各种问题。如果是主 阅读全文
摘要:
上节讲了一下UIView,这节接着讲它的重要子类,UITableView和UITableViewCell
通常来说,一个UITableView需要通过UITableViewController来指定它的样式。 当一个UITableViewController初始化的时候会创建UITableView的实例然后赋给自身的View属性,同时这个UITableView的两个属性dataSource和delegate都会指向UITableViewController。
滚动表视图时引发性能问题的不是解析 nib 文件,而 是要渲染多个子视图。当 UITableViewCell 拥有多个子视图时,iOS 的渲染机制会拖慢速度。 因此,代码生成的 UI 并不是要将 addSubView:方法放到 initWithStyle:reuseIdentifier 方法那里,而是要重写 drawRect 方法并以直接绘制内容的方式代替使用子视图。减少子视图(尤其是半透明的或下方还混有其他视图的)可以提高性能。 阅读全文
摘要:
在开始前,我想大家应该先读一读 Mac OS X 背后的故事,是一篇非常不错的文章。了解曾经发生的过去,才能对现在为什么会是这样有更深刻的认识。
xib与nib的渊源
Project Builder 在 Mac OS X 10.3 时被重命名为现在大家所熟知的 Xcode。Xcode 3以前,Interface Builder 使用一种名为 nib 格式的二进制文件格式。不过由于 nib 不能用肉眼读,也不方便使用版本管理工具来管理,所以 Xcode 3 开始新加入一种名为 xib 的文本文件格式,最后再在项目编译阶段输出为 nib 格式。和产生静态界面布局代码的工具很不同,nib 是不被转译成相应 Objective-C 代码的。用户程序执行时,nib 文件被读入,解包,所以 nib 文件是在运行时动态加载的。 阅读全文
摘要:
在第一节里,我们了解了ObjectC的语法,在第二节里,在正式动手之前,先要了解一些iOS中的基本约定与模式。
一、iOS中的MVC
先说说 通常大家所见的MVC模式
在MVC的教科书定义中,Model采用的是观察者模式,也就是Model是被观察者,View是观察者,Model有任何改变的情况下,View都会接受到通知。
但是在WEB环境中,View不需要实时的改变,只有客户端发送request时,View才可能需要改变。 阅读全文
摘要:
为什么叫和我一起学呢?因为从开始写这系列博客中我就定了一个方向,不从最基本的讲,而是挑一些如果从其他语言(C#, Java, Javascript等)程序员来看容易出错的地方。
假设你是有几年其他语言的开发经验,对我说的上述基本语言有了不错的了解。
先从语法的异同点开始
一、方法名 阅读全文
摘要:
闭包这东西,说难也难,说不难也不难,下面我就以自己的理解来说一下闭包
一、闭包的解释说明
对于函数式语言来说,函数可以保存内部的数据状态。对于像C#这种编译型命令式语言来说,由于代码总是在代码段中执行,而代码段是只读的,因此函数中的数据只能是静态数据。函数内部的局部变量存放在栈上,在函数执行结束以后,所占用的栈被释放,因此局部变量是不能保存的。 阅读全文
摘要:
今天想谈谈javascript中的prototype.
通常来说,javascript中的对象就是一个指向prototype的指针和一个自身的属性列表。javascript创建对象时采用了写时复制的理念。
只有构造器才具有prototype属性,原型链继承就是创建一个新的指针,指向构造器的prototype属性。
prototype属性之所以特别,是因为javascript时读取属性时的遍历机制决定的。本质上它就是一个普通的指针。 阅读全文
摘要:
使用git也有一段时间了,把自己常用的命令用自己的描述记录起来,方便自己备忘也方便其他人参考。
目录:
最基本的命令:
git clone 拷贝并跟踪远程的master分支。跟踪的好处是以后可以直接通过pull和push命令来提交或者获取远程最新的代码,而不需要指定远程分支名字。
参考示意图
HEAD 指向当前的commit 对象,同时也用来表明我们在哪个branch上工作。 阅读全文
摘要:
基于消息的GUI构架
在过去的日子中,大部分编程语言平台的GUI构架几乎没有发生变化。虽然在细节上存在一些差异,比如在功能和编程风格上,但大部分都是采用了相同的构架来响应用户输入以及重新绘制屏幕。这种构架可以被总结为“单线程且基于消息”。 阅读全文
摘要:
作为模式,只是一种大家认可的经验,模式可以作为大家交流的词汇而存在。下面我们就要介绍几种异步编程模式,AMP、EAP和TAP。当然,法无定法,在我们理解的基础上,我们可以根据具体情况适度修改。下面介绍的只是在通常情况下的两种模式会是以什么样子的形式出现。
一 模型简介
1.APM 异步编程模型
这种模式的特征是一些成对出现的方法,分别以Begin和End作为前缀。 阅读全文
摘要:
联接算法是指在物理上把多个数据源如何联接起来,SQL SERVER支持三种联接算法
1.nested loop 嵌套循环算法
2.merge 合并算法
3.hash 哈希算法 阅读全文
摘要:
有很多人写了聚集索引和非聚集索引的文章,但我觉得在很多文章中表达的概念并不清楚,因此自己也写一篇,能够让自己想清楚。我的最初目的是要写到NO SQL,因此这系列的文章主要是关注在 1.数据库索引结构、2.表联接、3.递归查询这几个点上。 阅读全文
摘要:
有人说毕业五年就是一个分水岭,我不知道是在岭的这一边,还是在那一边? 阅读全文
摘要:
用户态下有两种同步结构的
volatile construct: 在简单数据类型上原子性的读或者写操作
interlocked construct:在简单数据类型上原子性的读和写操作
(在这里还是要再啰嗦一句,记住只有操作系统才有办法阻止一个线程执行,通过无论是I/O中断还是线程阻塞等方式。) 阅读全文
摘要:
内核对象(kernel object):
windows操作系统提供的最近本同步机制,这些对象是构建并发程序和基本并发数据结构的基础。事实上,无论在代码中是否直接使用了这些对象,在软件的某个层次中都肯定会依赖它们。 阅读全文