WCF读书笔记(2)

信道形状(Channel Shape)  用来表述不同的消息交换模式对消息交换双方信道(信息交换的管道)的不同要求,有什么IOutputChannel IReplyChannel IDuplexChannel之类的。。  对于IReplyChannel,服务器返回一个RequestContext类型,作为请求和回复之间的一道桥梁,可以获取也可以返回消息。 会话信道(Session Channel)  从状态保持的角度,信道可以分为两种类型,Datagram Channel和Session Channel,前者不和客户端绑定,后者可以识别客户端。  对于WCF的信道层来说,信道管理器在客户端和服务端扮演不同的角色。服务端的信道管理器用于监听来自客户端的请求,而客户端的信道仅仅是单纯创建用于请求发送和回复接收的信道,因此服务端的消息管理器又称为信道监听器(Channel Listener),客户端的信道管理器则称之为信道工厂(Channel Factory) 绑定元素(Binding Element)  构成一个绑定对象的元素,绑定实现了通信的所有细节,通过创建信道栈实现对消息的交换,系统绑定是指服务于某种类型场景的绑定元素的有序集合。 包括什么BaseHttpBinding之类的。  一个程序集包括元数据,中间语言代码,和资源。程序集已经加载,将一直保存在内存中,直到应用程序域卸载。最好摒弃添加服务引用的服务调用方式,而是直接将包含服务契约的程序集部署到客户端。客户端以直接创建代理的方式进行调用。  WCF可以看成是适配器,是CLR类型和XML两个不同世界的纽带。  依赖倒置原则:即抽象不应该依赖细节,细节应该依赖于抽象;即要针对接口编程,不要对实现编程。高层模块不应该依赖低层模块。两个都应该依赖抽象。  契约关心的是我能做到。而不在于我如何做到。 封送(Marshaling)  解决跨应用程序域对象访问的问题,需要采用一种特别的机制,那就是封送。分为按值封送和按引用封送  按值封送实现了跨应用程序域的数据共享  按引用封送则实现了跨应用程序域的远程调用。  如果一个程序员频繁的使用复制粘贴编程。那就意味着设计需要重构

WCF读书笔记(1)

信道的分类:Transport Channel 信道  1.Message Encording Channel 2.Protocol Channel 信道管理器(Channel Manager),信道管理器用于信道栈的创建和生命周期的管理  1.ChannelListener 2.ChannelFactory WCF服务调用的两种典型方式  1.是借助代码生成工具svcUtil.exe导入元数据生成客户端代码和配置,添加服务引用采用的就是这种方式,工具会创建一个继承自Client的服务代理类型。  2.是通过ChannelFactory直接创建服务代理对象进行服务调用。  如果客户端已经进行了终结点的配置  那么通过信道工厂进行调用的代码大致如下:  WCF处理的是跨应用程序域,跨机器,跨网络的通信,所以WCF大多数时间进行网络传俗这样的IO操作,IO绑定的操作是采用异步编程(APM【Asynchronous Programming Model】) 消息交换模式MEP(Message Exchange Pattern)  MEP定义了参与者进行消息交换的模板,代表一系列的模板,他们定了消息的发送者和接收者,相互进行消息传递的次序,比较典型的三种  1.Datagram 数据包模式,嘴尖的SEND/FORGET模式也叫One-Way模式,基于从一个源到另一个或多个目的地的单向消息传输,并不期待回复  消息报的发送可以分成三个模式,分别是单目的地模式,多投模式,广播模式。 依次接受方更强大。。  2.Request/Reply模式  使用最多的一种模式,请求期待回复。采用同步通信方式,但也可用于异步通信  3.Duplex 双工模式  双方可以互发消息,实现服务器回调客户端。订阅/发布是其中一种典型的实例,TCP可以提供原生的双工通信,WCF通过WSDualHttpBinding实现了基于Http的双工通信,实际上是采用两个HTTP通道实现

使用Microsoft Web Deploy技术自动部署

在前段时间使用WCF的时候。部署到服务器上一直不得要领。出现各种问题。最终搞定。原文图很多,我给个摘要,大家还是原文看。因为原文写于2010年。自动部署工具已经更新至第3版。所以有些按钮得好好找找。不过相信对大家都不是难事。  本篇文章将提供一个循序渐进的教程,教你如何在一台Web服务期上安装和启用Web Deploy。接着我们演示如何使用Visual Studio通过Web Deploy直接(将文件)发布到服务器上,以及如何使用Visual Studio创建自动部署你的应用程序的安装包。  Web Deploy—为什么你会喜欢它  部署一个Web应用程序或站点包含好几个步骤。您通常需要:  1. 拷贝文件和文件夹;  2. 提供数据库结构,或许还要生成一些数据库数据;  3. 在文件和文件夹上设置相应的读写和安全访问控制列表;  4. 安装和配置SSL认证;  5. 部署其它杂七杂八的依赖项(事件日志,GAC库,COM对象等等)。  手工执行上面的步骤又累又慢又危险(因为手工部署总是容易出错)。使用自动化流程,可以让你在一台服务器上快速维护和部署应用程序,减少出错的几率,并极大加快你在应用程序上的改动放到作业服务器上的周期。  去原文看看吧。使用Microsoft Web Deploy技术自动部署

超时时间已到,但是尚未从池中获取连接

前段时间数据库的时候,出现这个问题。一般是读到20多万条的时候。会出现这个问题。  找了一下。主要是这两个问题:  一、看所有open的连接是否都close了。  二、如果访问量很大,加上Max Pool Size=512这一句,当然这是要以损失系统性能为代价的!  我查了一下。数据库连接所有的open都关闭了。 max pool size也确实加上了。但是。问题依旧。。  哦,还有的说在数据库连接字串中添加Connect Timeout=500,也就是设置连接超时更长一些。问题依旧。。  后来看到一篇文章中说:  DataReader是独占连接 的,每个DataReader都要占用一个连接。当然这个情况是偶尔出现的,所以会很长时间出现一次,因为只有同时有超过连接池最大连接数量的并发操作才 会发生。而且你加大并发数量只能暂时缓解问题。  文中建议用使用dataset来读取。然后我就把读取数据中使用DataReader的地方全部用DataAdapter和DataSet来获取数据库数据,因为DataSet非独占。会将数据保存在内存中,一次连接后释放,问题解决。  记录一下。

面试时,如何向公司提问?

原文来自阮一峰的网络日志 以前,我写过一篇《如何面试程序员》,探讨公司如何向应聘者提问。  今天,我看到硅谷招聘经理Steve Buckley的一篇文章,正好探讨了同一件事的另一面:应聘者如何向公司提问。  很多人将面试看作一种单向选择,事实上,面试是一种双向选择:不仅是公司挑选你,也是你挑选公司。面试就是为双方提供互相了解的机会,公司在评估你,你也在评估公司。  面试官也知道这一点,所以他们有心理准备,期待你提出问题,并且会做出回答。所以,面试时不要浪费向公司提问的机会。而且,你主动提问,表明你比较重视这个职位,会加深面试官对你的印象,可能会提高面试的成功率。  有一些注意点,你需要知道:  1. 面试之前,一定要做准备,多了解公司的情况。 2. 你提出的问题,应该围绕"这份工作是否合适我"这个中心点,其他与应聘关系不大的问题,不宜多问。 3. 提问的时候,要自然放松,不要害羞,就把它当作普通的聊天。你要表现出对公司的真诚兴趣。 4. 提问要直接了当,不要绕圈子。提出问题之后,你要保持安静,让面试官多说话。 5. 面试官回答的时候,你可以做笔记,或者事先询问能不能做。笔记必须简短,你的大部分时间,要用来全神贯注倾听面试官的回答,并与其有眼神的交流。 6. 面试结束后一周内,最好打一个电话或发一封邮件,了解公司对你的反馈意见。即使面试失败,你不妨也问一下原因,这会有助于你以后的面试。  下面是一些你可以问的典型问题。 问题一:你们为什么要招聘这个职位?  Q1: Why are you currently recruiting for this position?  这个问题会使得面试官开始谈论当前的项目,或者谈论前一位离职人员。无论哪种情况,都会让你了解,一些与你最密切相关的公司情况。 问题二:你们的新员工多吗?  Q2: Do you have many new staffs?  这个问题起一个过渡作用,使得谈话导向公司内部的情况。但是,它本身也能说明一些问题。如果公司成立已经超过四年,又没有新项目,但是新员工却很多,这往往说明公司文化不是很健康。 问题三:你们公司(团队)目前面临的最大挑战是什么?  Q3: What are the biggest challenges your team are facing right now?  如果面试官开始谈论一些具体的技术问题,这很好;如果他的回答是项目时间紧迫,或者需要更多的资金,那你就要小心一点了,公司管理上面可能有问题。 问题四:什么新技术(编程语言)是你们未来希望采用的?  Q4: What technologies/languages would you like to see your team adapt to that aren’t currently being utilised?  如果你申请的是技术职位,面试官恰巧又是技术负责人,那么这个问题将会非常合适。你会对公司的技术路线有所了解和准备,一旦入职,就能更好地适应公司的需要。 问题五:在业务方面,有没有什么地方是你们不满意的,未来想要改进的?  Q5: Few companies, if any, are 100% satisfied with the way their business is operating. If you could simply flick a switch to fix it, what one thing would you change?  很少有公司,会百分之百满意自身的现状,即使那些状况很良好的公司也是如此。这个问题可以让你对公司管理层的关注重点和担忧之处,有所了解。 问题六:我申请的这个职位,对公司的业务有何影响?  Q6: If you struggle to fill the position I have applied for, what impact would that have on the business?

SqlServer 2008开启远程连接

对于需要外部访问数据库的操作,需要开启sql server的远程连接。没经验的我等Google之。。大部分操作按照SQL Server 2008 R2如何开启数据库的远程连接来操作  但是。有一些很小的细节需要注意。我的数据库是Sql Server 2008 Express版。这个是VS自带的。为了管理方便,可以安装SQL Server® 2008 Management Studio Express 安装过程不多说。安装完成后,直接打开    服务器名称默认是空的。。“.”好像是不行的,这时候点击右边箭头。更多,本地和远程服务器。在远程服务器里可以找到。点击就可以了。  我按照文章改完。sa还是登不上。。然后又试了一些    如上图右键sa,属性,常规里设置sa密码。不要太简单。状态里的登录选项设为启用。ok。。我碰上的问题就这几个。

未能从程序集“System.ServiceModel 错误

今天在把wcf发布到远程服务器后。出现了这个错误。  确运行报告“未能从程序集“System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中加载类型“System.ServiceModel.Activation.HttpModule”。”。  因为远程服务器是临时装的。肯定是少装了什么东西。。果断Google。直接输入下面的命令。安装注册一下asp.net4就可以了。  c:\windows\microsoft.net\framework64\v4.0.30319\aspnet_regiis.exe -iru 中间的版本号应该是自己去目录看一看。  哦。我的是win server 2008的服务器。如果你也遇到了同样的问题。试试吧。

活出爱-史铁生

我曾经写过:人与猪的自然差别是一个定数,人与人的心理差别却无穷大。所以,人与人的交往多半肤浅。或者说,只有在比较肤浅的层面上,交往是容易的。一旦走向复杂,人与人就是相互的迷宫。这大概又是人的根本处境。  我常常感到这样的矛盾:睁开白天的眼睛,看很多人很多事都可憎恶;睁开夜的眼睛,才发现其实人人都在苦弱地挣扎,惟当互爱。当然,白天的眼睛并非多余,我是说,夜的眼睛是多么重要。  人们就象在呆板的实际生活中渴望虚构的艺术那样,在这无奈的现实中梦想一片净土、一段完美的时间。这就是宗教精神吧。在这样的境界中,在沉思默想着向着神皈 依的时间里,尘世的一切标准才被扫荡,于是看见众生都是苦弱的,歧视与隔离惟使这苦弱加重。那一刻,人摆脱了尘世附加的一切高低贵贱,重新成为赤裸的亚当、夏娃。生命中必须有这样一段时间、一块净土,尽管它常会被嘲笑为“不现实”。但“不现实”未必不是一种好品质。比如艺术,我想应该是脱离实际的。模仿 实际不会有好艺术,好的艺术都难免是实际之外的追寻。  当然,在强大的现实面前,这理想只能是一出非现实的戏剧,不管人们多么渴望它,为它感动,为它流泪,为它呼唤,人们仍要回到现实中去,并且不可能消灭这惩罚之地的规则。  我可能是幸运的。我知道满意的爱情并不很多,需要种种机遇。我只是想,不应该因为现实的不满意就迁怒于那的梦想,说它本来没有。人若无梦,夜的眼睛就要瞎 了。说“没有爱情”,是因为必求其现实,而不大看重爱情更是需要信奉的。不单爱情如此,一切需要信奉的东西都是这样,美满了还有什么好说的?不美满,才是 需要智慧和信念的时候。  上帝把一个危险性最小的机会给了恋人,期待他们“打开窗户”。上帝大约是在暗示:如果这样你们还不能相互敞开心扉,你们就毫无希望了;如果这样你们还相互隔离或防范,你们就只配受永恒的惩罚。所以爱情本身也具有理想意义。艺术又何尝不是 如此?它不因现实的强大而放弃热情,相反却乐此不疲地点燃梦想。  我越来越相信,人生是苦海,是惩罚,是原罪。对惩罚之地的最恰当的态度,是把它看成锤炼之地。既是锤炼之地,便有一种猜想——灵魂曾经不在这里,灵魂也不止于这里,我们是途径这里!宇宙的信息被分割进肉体,成为一个个有限或残缺,从而体会爱的必要。

面试体验:Google 篇

尝试在自己的博客上搜索点东西,结果发现 4 年多以前还在博客上写过一系列的 recruiting events,把大四时候参加过的各种笔试面试都记录下来了。我从去年准备离开百度开始,到现在总过面试过 4 家公司:Google、Microsoft、Yahoo、Facebook,原本去年也想把面试经验写一写的,结果一拖就拖到现在。我不想写面试经验,因为我个人不喜欢漏题和背题的做法。我自己作为面试官,知道要设计出来一道好用的题目有多难,所以我希望面试者都是如实表现自己解题能力的。我更喜欢写面试体验,就是在整个面试过程中一家公司给人的印象是怎样的,HR 和面试官是否专业,能否让人信服这是一家值得长期工作的公司。  我想写的第一家公司是 Google,因为它是我在想要离开百度时第一家联系到我的公司。2010 年 12 月底的某一天早上,我突然感觉到我应该离开百度,因为如果这个时候已经没有勇气离开这家公司了,很可能就不会再想要离开了。当天中午在百度大厦西餐厅吃午饭,接到一个 Google 上海 HR 的电话,问我有没有兴趣去面试,我想既然你打电话来的时机那么好,我就答应你去面试吧。(在那一天之前,我对猎头的标准回复是「有美国或者香港的职位吗?」)她问我将来希望在北京还是上海工作,当时我对北京的厌恶程度还没有现在那么高,同时觉得搬家到上海又比较麻烦,于是就说在北京,接着我就变成跟北京 HR 沟通了。  Google 的 HR 会负责做两件简单得不需要面试官做的事情,这能够很好的提高招聘流程的效率。第一件是确认你能够适应工作环境中的英语,为此 HR 要我用英语跟她对话两三分钟,主要就是让我说说工作经验和其中的亮点。习惯在私企工作的人不要以为外企对英语的要求很高,其实大多数长期在中国工作的人说话或者发邮件都会很 Chinglish 啦,所以关键是要敢于用英语进行沟通。  然后 HR 发了一个 Codility 的地址给我,让我有空抽时间去做题。一个小时 3 道难度相当于 OI 基础题的题目,平均 20 分钟一道。最简单的题目一看就知道是 O(n) 能解决的,最复杂的题目看上去是 O(n^2) 但想一下就能优化为 O(n log n)。对于有算法训练背景的人来说,这样的题目会让人感觉到很有把握。对于没有经受过算法训练的人来说,掉进陷阱里是很容易的。很可能没有把 O(n^2) 优化为 O(n log n),结果超时;可能没仔细看题目说明的数值取值范围,某些变量选错了数值类型,结果溢出。考虑到 Google 重视算法的程度,再加上 Google 中国面试的额外难度,算法训练还是很必要的。  在我通过 Codility 测试后,HR 问我了对题目难度的反馈,然后约了一轮电话面试,并且告知面试主要围绕算法、数据结构、系统设计、编码来进行。Google 面试的格式都很固定,45 分钟内期望你能做出 3 道题来。这 3 道题最起码要能把人人都能想出来的「笨办法」用代码写出来,否则会让面试官感到不满意。如果有些题目能够比较快地做出来,面试官就会让你优化。就算你第一次给出的答案已经是业界已知最优解,面试官都还是会让你优化,因为谁也不知道有没有人能在面试过程中突然爆发,想出一些过去没人想到过的解法。如果面试官心中已有优化的方案,在你想不出优化方案时他可能会给你提供一些提示。  一轮电话面试后,HR 就开始约到 Google 办公室的面试了。第一次约了下午 3 轮面试,还是那个很固定的格式:每轮面试 45 分钟,两轮间隔 15 分钟。整个面试流程让人感觉到很人性化:在 Google 签到后,HR 会先带你去 kitchen 拿点吃的喝的,然后把你带到面试所用的会议室。多轮面试的话,HR 中间还会来问一下你要不要去洗手间,或者多拿两瓶水。面试完毕后 HR 会来问你感觉如何,同时也会让你知道面试官的初步反馈是否跟你的感觉一致。我在 3 轮面试中有一轮感觉不太好,因为面试官只给了 2 道题,并且我最终都没办法解出来,HR 也确认了就是这一轮的反馈不好。  此外,Google 的招聘流程还让人感觉到很有效率。作为面试官,我也知道自己写面试反馈有多喜欢拖延,而且公司填写面试反馈的系统越不人性化我就越想要拖延,然而公司内部系统做得人性化的又实在罕见。Google 的面试基本上隔天就有结果,然后 HR 就会约下一轮的面试。因为我在百度的时候每周哪个时间没有会议是很确定的,所以我总是选择下周同一个时间段来面试。在经过总共 4 轮面试后,HR 说因为前面有一轮的面试官反馈不好,所以希望再加一轮面试。因为前面反馈不好的面试官比较 senior,所以这次找了一位同样 senior 的面试官来面试,于是我又去了一次 Google 办公室。  完成 5 轮面试后,HR 把材料提交给 Google 的北京招聘委员会,结果没有通过。HR 说,因为 Google 都是按照后端工程师的标准来招聘,看重算法和数据结构,前端工程师要通过不容易。因为 Google 没有专门的前端工程师,只有一个软件工程师职位,所以所有人还是必须按照一个标准来衡量。她问我如果找到专门需要前端工程师的团队,并且需要额外再面试的话,我是否感兴趣。当时 Google 是我的第一选择,我当然说感兴趣啦。  后来 HR 跟我说,她帮忙问过 Google Maps,可惜对方说不要专才只要通才。又过了几个星期,HR 发现 IME 需要专门做前端的人,于是帮我再约了一轮面试。这轮面试是在 Google 办公室做的,但实际上是视频会议,因为面试官在美国。(不确定面试官是在美国出差,还是美籍华人。)面试过程跟电话面试类似,用 Google Docs 写代码,比电话面试要好的是说话时能够见到人。  这一轮面试结束后,我的材料再次进入 Google 的北京招聘委员会。HR 说这次专门找了对前端有经验的人来审阅我的材料,结果顺利通过了。接着 HR 问我要了一大堆的补充材料,包括高考成绩和 GPA(连同成绩单),还包括当前薪酬和竞争对手的 offer(我当时有 Yahoo 的 offer),甚至包括过去的获奖和晋升经历。所有这些材料都会发往 Google 美国总部审阅,具体流程 HR 没有细说,但看 Don Dodge 的文章可以了解一些。最后我被 Google 美国总部给拒绝了,然后 HR 还是一如既往地及时沟通,并且安慰了我几句。

C#调用Matlab引擎

最近在使用matlab的时候。求多元函数取得最小值的时候。变量的值。于是就用到了sym符号。结果在C#中调用时总是出错。后来Google了N久发现是符号工具箱是无法编译的。。后来找到了替代方法。就是调用matlab 引擎。当然要稍微麻烦一点。因为调用引擎这种方法参数传递比较麻烦。我只想到了通过C#把需要计算的值保存到文本中。然后matlab中load进来。计算完成后 save出去。。  调用matlab引擎类似于在C#中新开了一个进程。然后执行一些命令。之前需要引用Matlab Application Type Library。这是个com组件 然后在程序里使用 using语句 然后就可以正常使用了。使用我试过的有两种方法 很简单。Visible设置可见性。。command表示要执行的命令。 另一种是 不知什么原因,第一种方法我没有调用成功。第二种调用成功。欢迎讨论。