LINQ to XML之生成X-DOM

Posted by & filed under Uncategorized.

不管是何种数据源,使用LINQ来产生X-DOM的策略都是一样的:首先写出产生目标X-DOM的函数式构造表达式,然后针对该表达式创建LINQ查询。 比如,假设我们想从数据库中获取customers并产生如下XML:

我们首先为X-DOM写出函数式构造表达式(这里用简单的字符串值):

然后我们我们把它放入数据转换之中,创建出针对该表达式的LINQ查询:

这里是其结果XML:

通过把上面查询的创建分成两步,我们可以更清楚地理解它的工作方式: 第一步:

第二步:

唯一不同寻常的事情是内容参数sqlQuery,它不是一个简单的XElement,而是IQueryable<XElement>(实现了IEnumerable<XElement>)。还记得X-DOM处理XML内容的过程吗?记住,它会自动遍历实现了IEnumerable的集合。所以,每个XElement都被作为一个子节点被添加到customers元素下。 排除空元素 假如在上面的例子中,我们还想把customer最新的大额purchase包含进来,那么我们可以创建如下查询:

当customer没有大额订单时,上面的查询会产生空的lastBigBuy元素。其实在这种情况下,更好的解决方案是完全忽略lastBigBuy节点。我们可以通过把lastBigBuy元素的构造函数包装在条件运算符中来实现这一目的:

对于没有lastBigBuy的customers,查询会产生null而不是空的XElement。这正是我们想要的,因为null会被X-DOM简单的忽略掉。 Stream类型元素 如果我们仅是为了保存(或调用ToString)的目的来产生X-DOM,那么我们可以通过XStreamingElement来改善内存的使用效率。一个XStreamingElement相当于XElement的简化版本,并且它对子节点应用延迟加载语义。 使用它时,简单的把外层XElements替换成XStreamingElements即可:

直到我们调用Save、ToString或WriteTo方法时,传入XStreamingElement构造函数的查询才会真正被执行。这样就避免了立即把整个X-DOM装载到内存之中。当然另一方面,如果我们多次调用Save,查询也会被重复执行。还有,我们不能遍历XStreamingElement的子节点,它没有提供诸如Elements或Attributes之类的成员。 XStreamingElement不是从XObject(或是其它类)继承而来,它仅有的成员除了Save、ToString和 Read more […]

调试进.NET Framework 4.5源代码内部(适用B/S,C/S)(转)

Posted by & filed under Uncategorized.

I:下载.NET 4.5源代码安装包 .NET 4.5 源代码的下载地址:官方地址 / 百度网盘镜像 官方下载页   或   百度云盘下载 安装过程我就不详细说了,大家都懂的~呵。 II:配置Visual Studio 2012环境 点击vs菜单栏上的 工具 –> 选项 在左侧树形列表中将[调试]节点展开然后选取[符号]子节点 设置为你.NET 4.5源代码安装的目录。 注意:缓存符号哪里应该选择安装包安装完成的路径,不要使用C:\Users\{UserName}\AppData\Local\Temp\SymbolCache否则vs会自动下载源代码pdb包,很慢的。 然后选择同级的[常规]节点配置成如下图所示 至此Visual Studio 2012配置完成,如果你是用vs2010的,那么这些步骤将会相同。唯一的区别是你需要下载.NET Read more […]

模板方法

Posted by & filed under Uncategorized.

介绍 模板方法(TemplateMethod)定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 模板方法是一种代码复用的基本技术,在类库中尤为重要,因为他们提取了类库中的公共行为。模板方法导致一种反向的控制结构,这种结构就是传说中的“好莱坞法则”,即“别找找我们,我们找你”,这指的是父类调用一个类的操作,而不是相反。具体体现是面向对象编程编程语言里的抽象类(以及其中的抽象方法),以及继承该抽象类(和抽象方法)的子类。 正文 举个例子,泡茶和泡咖啡有同样的步骤,比如烧开水(boilWater)、冲泡(brew)、倒在杯子里(pourOnCup),加小料(addCondiments)等等。但每种饮料冲泡的方法以及所加的小料不一样,所以我们可以利用模板方法实现这个主要步骤。 首先先来定义抽象步骤:

该函数在原型上扩展了所有的基础步骤,以及主要步骤,冲泡和加小料步骤没有实现,供具体饮料所对应的函数来实现,另外是否加小料(customerWantsCondiments Read more […]

学习新技术的几条建议

Posted by & filed under Uncategorized.

当开发者们开始一个新项目,或者想转变成一个新的团队,往往需要学习新的语言、工具和框架。 我有一些同事,因不得不用他们不太了解的技术工作而备受煎熬。他们表示这样做很没安全感,也不可能掌握新工具的所有详细信息。经过多年的软件开发,我所了解的重要一点是,你不需要100%的了解所有语言和框架。在小项目中,你可能会用到一些特殊的技术,而这些在你的一生中仅可能用这么一两次,你也不可能因为狂爱该技术而钻研它的全部内容。所以在这种情况下,你只需要了解工作中所必须的那部分技术即可。 我并不是说你不需要深入了解任何技术。我认为你应该精通两、三种语言,对其他语言基本掌握即可,尤其是你工作环境经常变化的情况下。当你不得不学习新的语言,以按时完成工作时,你首先需要打开思维学习“基本的部分”,不要学习该技术的100%。你不需要成为所有技术的专家!而且,通常当你已经很好地掌握两、三种语言后,就可以很容易掌握新语言的基本技术。 有些人曾问我:“有没有快速学习新语言的方法?”。以我看来,并没有万能公式,但我通常会按以下简单步骤来学习任何语言中的基本技术。 基本上,我首先要做得是安装该语言所需的最简单运行环境。例如,在Mac上用Ruby编程,我将下载安装程序,并通过IRB在终端上使用Ruby。这是使用该语言的最简单方法。下一步要做的是,编写一些基本的程序——创建并打印变量、创建并调用函数。该过程上是十分重要,它们可以帮助你熟悉语言的结构。假如你所学的语言遵循面对对象(Object Read more […]

项目估算偏差(转)

Posted by & filed under Uncategorized.

在软件开发过程中,估算是一个非常重要的环节,对于项目计划、进度控制等都具有重要的意义。但是估算也是一个比较难的“技术活”,因为是“估”,所以往往会存在一些偏差,而这些偏差对于一个项目来说,有时可能会导致多花费一些不必要的金钱,还有可能影响公司的声誉和员工的积极性。 而哪些因素会导致估算偏差呢?开发者Alex E. Fish给出了以下提示。 没有充分考虑需求 如果你没有充分考虑到所有的需求,那么估算一个任务将花费多长时间是毫无意义的。更多的需求意味着更复杂的实现,这当然也需要更多的时间来完成。 估算了测试时间,但没有估算修复时间 估算应该考虑到所有的测试时间以及修复bug的时间。单元测试、BDD(Behavior Read more […]

Android、iOS和Windows Phone中的推送技术

Posted by & filed under Uncategorized.

推送并不是什么新技术,这种技术在互联网时代就已经很流行了。只是随着进入移动互联网时代,推送技术显得更加重要。因为在智能手机中,推送从某种程度上,可以取代使用多年的短信,而且与短信相比,还可以向用户展示更多的信息(如图像、表格、声音等)。 推送技术的实现通常会使用服务端向客户端推送消息的方式。也就是说客户端通过用户名、Key等ID注册到服务端后,在服务端就可以将消息向所有活动的客户端发送。 实际上,在很多移动操作系统中,官方都为其提供了推送方案,例如,Google的云推送、IOS、Windows Phone7/8也都提供了类似的推送方案。不过这些推送方案的服务器都在国外,有一些推送服务(如Google的云推送)在国内由于某些原因不太稳定,所以国内近几年涌现出了很多专门为国人打造的推送服务。 本文将从各种流行移动操作系统入手介绍推送技术的各种实现方式。当然,我们的主要目的是讨论Android的推送技术。 一、iOS的推送技术 Apple为IOS提供了很完美的推送方案,其基本原理是Apple提供了自己的推送服务器,叫APNS(Apple Read more […]

Javascript执行效率小结

Posted by & filed under Uncategorized.

Javascript是一门非常灵活的语言,我们可以随心所欲的书写各种风格的代码,不同风格的代码也必然也会导致执行效率的差异,开发过程中零零散散地接触到许多提高代码性能的方法,整理一下平时比较常见并且容易规避的问题 Javascript自身执行效率 Javascript中的作用域链、闭包、原型继承、eval等特性,在提供各种神奇功能的同时也带来了各种效率问题,用之不慎就会导致执行效率低下。 1、全局导入 我们在编码过程中多多少少会使用到一些全局变量(window,document,自定义全局变量等等),了解javascript作用域链的人都知道,在局部作用域中访问全局变量需要一层一层遍历整个作用域链直至顶级作用域,而局部变量的访问效率则会更快更高,因此在局部作用域中高频率使用一些全局对象时可以将其导入到局部作用域中,例如:

2、eval以及类eval问题 我们都知道eval可以将一段字符串当做js代码来执行处理,据说使用eval执行的代码比不使用eval的代码慢100倍以上(具体效率我没有测试,有兴趣同学可以测试一下) JavaScript Read more […]

高效地完成工作(转)

Posted by & filed under Uncategorized.

1、高效地完成工作 深夜才离开办公室的时候,心中却感觉异常失落,可能很大一部分原因是由于现代化的工作环境导致的。由于不断有各种分散注意力和打断你的事情,在很多办公场所,工作效率已经低到不能再低的程序了。噪音、旁边来来往往的同事,信息化办公的实质好像就是下一封等待开启的电子邮件、下一个需要访问的网站,和桌上的PDA的震动带来的下一条消息。任何时刻,你都有太多事情可以做,但究竟选择哪一件,选择本身就是令注意力分散和麻痹的根源。工作中左冲右突,看哪里问题严重就扑过去“救火”的状况已成为常态。     如何命令自己 当需要向待办事项列表中添加任务的时候,参考以下规则 a、仅添加你确实会去做的事项 有些任务你不太可能完成,看得久了反而会觉得恶心,甚至会意识到自己根本已经无能为力,那还不如新建一个任务表叫“未来或将实施计划”,把他们都转移到这个表中。只有当某件事确实要做、不做不行的时候,才有必要通知你的助手。因此只需要把那些能切实完成的事情留在你的待办事项列表上。   b、分解任务 一些子任务越是细小、越是基本,他们就越具有可操作性   c、仅关注下一步要实施的行动   d、安排任务的优先级 尽管你的待办事项列表里可能只有20个项目,但现实是,你每天只能完成为数不多的几个,所以要清楚哪些任务应该安排在最前面。如何操作取决于使用何种工具或者软件来跟踪待办事项列表,但确保只要随便扫一眼就知道马上该做什么了。   e、记录下已经完成的任务 像所以优秀的个人助理一样,你一定希望向老板展示出你全部的工作成功,不过要确定你的工程成果是否已经存放妥当,以便你可以安心地陶醉于自己的高效率,甚至可以把这些成果当做过去工作的总结。 你的“完成”列表很大程度上是待办事项列表的一个反馈。如果两天过去了,还没有一件新完成的事项,那就有必要修改一下你的待办事项列表并且重新开始好好地实施它。     2、早晨就来一次突破 每个工作日的第一个小时里不要去查阅电子邮件。选择一项任务(哪怕是很小的任务)最先把它解决掉。首战告捷的感觉能为这一天其后的工作奠定一个良好的基础,并且能够保证当你打开了电子邮件之后,不管有多少事情要摆平,你依然可以说,至少你已经完成了一件事。当你完全投入到公务中,对各种不断出现的请求保持着注意力,很难不陷入一种疯狂的状态当中。所以,想让一天有一个良好的开端,那就先做好一件事情。     3、在前一天就把需要的都准备好 这条技巧的重点是,抛开所以关于今天要采取的第一项行动的想法和计划,这样才能确保自己在精力充沛时便立即启动,不会被不断出现的请求所干扰。这也意味着,在前一天的晚上,你就要为第二天的晨间突击收集好资料。     4、调整你的冲刺时间周期 10分钟是开始这种计划好时间的冲刺的很好时间单位。实施了几次之后,你会发现有种令人惊喜的感觉,当定时器滴滴叫响的时候,你还想继续工作下去。 当你越来越善于在一定的时间内冲刺的时候,你可以调整工作的时间间隔。根据你的能力、时间以及整个任务的压力程度,延长(或者缩短)冲刺的时间。目标是能够将每次冲刺的时间延长至30分钟,甚至60分钟,但是每个人有不同的工作环境和保持注意力的时间周期。寻找你自己觉得舒服的状况,设定好计时器,然后开始。你自己都会惊叹于在短时间聚精会神的冲刺中,你会完成那么多的工作。     5、设置一个收工提醒 在一天最开始的时候就决定好今天什么时候下班,设置一个收工计时器。如果爱人今晚正在家做饭,你六点钟一定要下班的话,把提醒设置到五点,五点半或者五点四十五,提示你:“嘿!收工回家吧!”。     集中注意力 6、限制访问浪费时间的网站 想象这样一幅景象:你坐在电脑前写一篇第二天要交的报告。你打开浏览器进入公司局域网查找文档。一瞬间,你看见了自己的主页。“哇塞!”你说,“Red Read more […]

【转】Android Binder设计与实现

Posted by & filed under Uncategorized.

Binder Android IPC Linux 内核 驱动 摘要 Binder是Android系统进程间通信(IPC)方式之一。Linux已经拥有管道,system V IPC,socket等IPC手段,却还要倚赖Binder来实现进程间通信,说明Binder具有无可比拟的优势。深入了解Binder并将之与传统IPC做对比有助于我们深入领会进程间通信的实现和性能优化。本文将对Binder的设计细节做一个全面的阐述,首先通过介绍Binder通信模型和Binder通信协议了解Binder的设计需求;然后分别阐述Binder在系统不同部分的表述方式和起的作用;最后还会解释Binder在数据接收端的设计考虑,包括线程池管理,内存映射和等待队列管理等。通过本文对Binder的详细介绍以及与其它IPC通信方式的对比,读者将对Binder的优势和使用Binder作为Android主要IPC方式的原因有深入了解。 1 Read more […]

闭包(Closures)

Posted by & filed under Uncategorized.

介绍 本章我们将介绍在JavaScript里大家经常来讨论的话题 —— 闭包(closure)。闭包其实大家都已经谈烂了。尽管如此,这里还是要试着从理论角度来讨论下闭包,看看ECMAScript中的闭包内部究竟是如何工作的。  

概论 在直接讨论ECMAScript闭包之前,还是有必要来看一下函数式编程中一些基本定义。 众所周知,在函数式语言中(ECMAScript也支持这种风格),函数即是数据。就比方说,函数可以赋值给变量,可以当参数传递给其他函数,还可以从函数里返回等等。这类函数有特殊的名字和结构。 定义

例子:

上述例子中funarg的实际参数其实是传递给exampleFunc的匿名函数。 反过来,接受函数式参数的函数称为高阶函数(high-order Read more […]