每周源代码33-Google浏览器中的微软开放源

[原文发表地址]  The Weekly Source Code 33 – Microsoft Open Source inside Google Chrome [原文发表时间]  2008-09-11 11:56 AM “首先,我要提醒大家,请大家看看我正在进行的最新的请求阅读源代码以成为更杰出的开发人员博客。亲爱的读者,我现在向你们展示"每周源代码."一系列帖子中的第33篇。 里面提到过,微软代码怎样处理Google最新的浏览器——Google Chrome?请大家看看Google 代码上的"Chromium"的条款和条件。Chrome的运行涉及到24个不同位制的第三方软件,其中之一就是2004年发布的开放源WTL,即Windows模板库。 Chrome使用开放源Windows模板库 WTL在 MS-PL(即微软公众授权协议)下发布。这是个非常轻松的协议,基本上说,“非常有趣,如果有麻烦就不会调用。”在开放源的王国里,这样的协议铁定能取悦大家。 WTL是 一套开发Win32的C++库,类似于MFC(微软基础类),但它较之更轻便。它最初是由Nenad Stefanovic在微软内部发布的一个框架,但却未获得微软的官方支持。直到现在,Nenad也一直位于旧的源代码开发项目的名单之列。 WTL接受ATL(活动模板库),ATL是一系列C++模板类,它使COM的开发变得更简单。它多少都效仿了STL(标准模板库)。 您可能还记得, Chris Sells是开发ATL的核心。Chris和Chris Tavares一致力于ATL Internals 这本书。 早在2002年,WTL就深受大家喜爱。下面是Simon Steele在当年就WTL的乐趣写的一篇帖子。 Simon写道: WTL是基于MFC的加强版模板库-经过瘦身提速的成功阶段,WTL为我们提供了一种在不采取庞大的MFC或复杂的纯粹Win32API 编程的情况下编写合适GUI应用程序的用户界面框架。许多MFC中的“must-have”类也可作为WTL的实用工具类。热烈欢迎你的老朋友CPoint, CSize, Crect以及最终要的CString归队!WTL创造了无需MFC淤泥新内阁库的可执行小文本-事实上,只要你不使用Visual C++运行库函数(strcpy和朋友),你也可以省去msvcrt.dll-这样就能得到运行速度更快的小程序。 4年前,Windows模板库作为开放源码发布,正如28年的互联网一样。2004年的5月似乎特别漫长。我以为微软不会花很多精力开发开放源的,但看起来他们真的这样做了。实际上,2003年4月,Pranish Kumar和Visual C++开发团队都相继在WTL Yahoo Group上发表讲话,都声称要将WTL永久地放到社区上。 历史:WTL是怎样变成开放源的? 我今天和Pranish Kumar在即时聊天软件上谈到了WTL是怎样成为2004微软开放源项目的。建议你可以去查看MSFT上的共享源页面和开放源页面, 和最重要的端口25. 下面是我和Pranish 关于WTL发布的聊天内容: WTL就算不是微软的第一个OSS开源软件,最起码也是其中之一。和Boss们开会的时候也展示了3款有潜力的OSS软件。我估计WTL是首个参与到联合MS/社区的“真正意义上的OSS”,跟以往仅仅在外部发布信息相反。WTL是唯一通过的项目。 我:启动“共享源代码计划吗?…

1

每周源代码32– Atom, AtomPub和BlogSvc(WCF中的AtomPub服务器)

[原文发表地址]  The Weekly Source Code 32- Atom, AtomPub and BlogSvc, an AtomPub Server in WCF [原文发表时间]  2008-08-20 10:21 AM 亲爱的读者,在我的新的请求阅读源代码以成为更杰出的开发人员中,现在我在"每周源代码”一系列帖子中向您展示每周源代码32。   更新:BlogSvc.NET 代码已经被大范围地重构了,可以考虑查看最近的CheckIns,看看到底有哪些变化。 BlogSvc.NET—WCF和.NET的AtomPub服务器 非常敬佩那些不仅发布了Open Source Software,还特意花时间为BlogSvc.NET方案设计了一个非常漂亮又整洁的logo的人。这个代码是Jarrett Vance编写的,此代码发布在CodePlex了。详细文档和具体细节请参见BlogSvc.NET主网站。 http://www.blogsvc.net网站似乎是BlogSvc自己的演示网站。其实,如果你下载该资源,那么完整的实现BlogSvc.net的网站也同时会被下载。Booyachaka. 非常令人敬佩。 因为该方案用到了Atom和AtomPub,针对这一情况,他用到了Windows Live Writer. 你可以通过阅读Joe Cheng的一系列帖子来了解WLW中意Atom的原因。Joe Cheng是Live Writer团队的精英人才。他们在帖子上告诉了大家是怎样完全实现这些的。 已经做到这一步了,但是Atom究竟是什么呢?这一次,我们可以参考Wikipedia给出的大致精准的定义。 Atom这个名字适用于相关的标准。Atom Syndication Forma是一种用于Web种子的XML语言。但Atom Publishing Protocol(简称AtomPub或APP)是一种简单的为创建和更新Web资源,基于HTTP的协议。 从一个方面来看,RSS作为一种联合格式,类似于XML,但它打心底里并不尊重XML.但Atom却是尊重XML的。对于发布博客或内容网站,Blogger/MetaWeblog APIs基于XML/RPC(一个协议,它要么让你喜欢的不得了,要么让你感到十分头疼。或者两种情况兼之)。而AtomPub则基于RESTmodel和Atom,并经过了一个更标准的采纳过程。但根本上来说,使用Atom和/或AtomPub是安全的选择。大家都非常安全了。今年的早些时候,微软就采用了这两种格式。我的偶像Pablo Castro(他是ADO Data Services的首席设计师)在他的项目中支持AtomPub。 据说,BlogSvc是: “…Atom Publishing Protocol的一个开放的源代码实现。它创建于提供程序模型的顶端。也有文件系统和数据库的提供程序。该服务和Live Writer是兼容的。” 先介绍到这了。我们再来看看一些代码。虽然是0.3,但它一直在进步发展。当Jarrett开始使用NET 3.5…

0

每周源代码24-扩展版-.NET插件、提供商、属性、加载项和模块

[原文发表地址]The Weekly Source Code 24 – Extensibility Edition – PlugIns, Providers, Attributes, AddIns and Modules in .NET [原文发表时间]2008-04-18 01:43 我对开发人员们怎么运用插件和其他方法来扩展应用程序越来越感兴趣了。亲爱的读者,请大家看看我正在进行的最新的通过阅读源代码使自己成为一个更好的开发者的博客。亲爱的读者,我现在向你们展示“每周源代码”系列中的第24篇。 “扩展”一个应用程序或framework有很多方法。或许有许多种模式。你可以参见Gang of Four Patterns using C# over here.来了解运用C#D的四种模式。 我这周一直在查看可扩展的或已经扩展的三大块代码。首先是xUnit.NET,代码块上的新单元测试框架(直到最后我尝试了文件/新建项目,然后蹦出了"HanselTest2000"),第二个是2008年3月份,Miguel Castro在一个题为Sexy Extensibility Patterns的CINNUG会议上发布的源码。Miguel用该模式创建了名为CodeBreeze的代码生成/数据映射工具。前不久在DNRTV上展示过。第三个是Windows Live Writer和WLW SDK的插件设计。 本博客并非试图给出一张完整的列表,只是里面有很多很酷的代码,这让我对扩展一些东西很感兴趣。我很喜欢这三个范例,因为每个范例都有一个以上的扩展方法。 扩展软件其实就是添加一些未启动的功能。有很多方法可以做到。例如,添加一个类似VBA或者PowerShell或托管脚本的脚本引擎将是途径之一。如要创建一个公共脚本-API将是对这个主题的转折点。主机通过基类派、实现借口或源代码事件添加加载项或插件。使用System.AddIn,也是个办法。使用依赖注入容器,是扩展应用程序的一个更先进更有效的途径。 xUnit.NET xUnit.NET是Brad Wilson和Jim Newkirk(以前以NUnit闻名)创建的单位测试框架。开发人员们对其框架的初步反应是一个大大的疑问:“说真的,我们真的需要另一个测试框架么?”但他们还是迎难而上,正如小模型框架一样,他们开始获得应得的尊重。它有一个MSBuild任务,Resharper和TestDriven.NET测试试验支持,更重要的是,该框架有些有趣的扩展点。 xUnit.NET源代码是非常整洁的。这真的是句恭维话。就像你到别人家做客,你在问:“装饰设计师是谁?“的同时意识到该房间如此干净,井井有条。 顺便说一句:在Visual Studio中使用“解决方案文件夹”的人并不多。说真的,伙计们,只需单击右键,然后“添加/新的解决方案文件夹,”,开始拖动周围的文件,立马就整洁了。 他们将一些有争议的地静态扩展方法分成单独的项目,包括NET 3.5-特定功能的xunitext和xunitext35。所以,对于框架“下行”的开发人员来说,该扩展方法无疑是一个粗糙的扩展点。 他们将属性作为扩展框架的主要途径。例如,如果你想知道测试前后的情况。 从BeforeAfterTest属性上导出一个新属性,然后对其进行测试。[Fact]属性是标准属性。他们用它来取代[Test]: 现在,Before()和After()的代码将执行此次测试。 如果你有自己的测试框架,但你想使用xUnit.NET。这是你可以看到[RunWith]属性,你可以自行测试,例如,你可以下指令如"run this test with nUnit."。可以通过两种方法来使用,可以输入[RunWith(typeof(MyRunner)]或者使用自定义属性,如: nUnitCommand实现了一个非常清晰的ITestCommand接口,“描述了在测试类中执行所有测试的能力。”…

0

每周源代码39 – Silverlight3中的Commodore 64 仿真器

[原文发表地址]   The Weekly Source Code 39 – Commodore 64 Emulator in Silverlight 3 [原文发表时间]   2009-03-27 04:26 我很高兴在上周采访了Pete Brown,和他讨论他正在研发的Silverlight 3 Commodore 64 仿真器。他几分钟前刚在CodePlex上发布,但我已经拿着代码玩了好一会儿了。你可以看看Tim Heuer的博文,详细了解怎样着手Silverlight 3 Beta,以及你需要的一些工具,或者你也可以看一些仿真器的相关视频。 记住Pete正在做的是一项完全出于热爱的工作,所有的代码都是在“做出来”模式下写出来的,所以在美学概念上没什么突出的。许多代码都是直接从Frodo或Sharp C64仿真器中的开放资源C++中直接移植过来的。 其中的确有些非常棒的想法,所以我想在这次的每周源代码中重点关注一下(我承诺我会做更多”每周的”,就从现在开始)。 自动生成视频流 Pete想让屏幕绘制越快越好,最好是50赫兹(一秒50次)。他最初创建PNG和BMP并以尽可能快的速度将其置于屏幕上,然后Silverlight团队中的一个成员提议“做一个视频”。他说的“做个视频”是什么意思呢?他建议用Silverlight MediaElement(“视频播放”控制),以DataSource的形式控制视频。他要动态地生成一个不会结束的影片。 这意味着UI XAML将主要是: 1: <MediaElement x:Name="VideoDisplay" 2: Grid.Row="0" 3: Grid.Column="0" 4: VerticalAlignment="Top" 5: Stretch="Uniform" 6: IsHitTestVisible="False" 7: Margin="4" /> 在背后的代码中,他创建了从MediaStreamSource继承的VideoMediaStreamSource,并在博客中发布: _ 1: _video = new…

0

每周源代码38: ModelState.IsValid的属性为False,源于ModelBinder从RouteData获取值

[原文发表地址]   The Weekly Source Code 38 – ASP.NET MVC Beta Obscurity – ModelState.IsValid is False because ModelBinder pulls values from RouteData [原文发表时间]  2008-12-04  06:41 AM 我在我正做的应用程序里发现了一个错误。我不知道那是ASP.NET MVC Framework里的一个错误还是一个新特征。不过我知道,他们的代码和我的都精准地按照编写的在运行。 首先是我看到的状态,然后是一大堆没有必要的技术背景(因为我喜欢听我自己讲解),最后则是我的总结。不管怎样,很有趣! 更新:我彻底被MVC团队愚弄/打败了,他们尖锐地指出和15年前Ayende提出的完全一样。它是促使修复/变更了,新的状态把顺序调整为3,1,2,我是这么理解的。我表示惭愧。它在Release Candidate中被彻底修复,所以此篇博文仅为我个人的CSI:ASPNETMVC。 状态 我的应用在Dinners中是做CRUD的(创建,读取,更新和删除)。你进入一个新的Dinner目标时,你要填个表格并公布你的HTML。 我们在Dinner中读取并储存(我移除了goo 这样看起来比较清楚): 1: [AcceptVerbs(HttpVerbs.Post)] 2: [Authorize] 3: public ActionResult New([Bind(Prefix = “”)]Dinner item) 4: { 5: if (ModelState.IsValid) 6: { 7: item.UserName…

0

每周源代码37:轻松实现地理定位(反向查找IP地址)

[原文发表地址]  The Weekly Source Code 37 – Geolocation/Geotargeting (Reverse IP Address Lookup) in ASP.NET MVC made easy [原文发表时间]   2008-11-27  07:30 AM 首先我想说,我不断追求并奉信通过阅读源代码使自己成为一个更好的开发者,亲爱的读者,我给大家呈现第37篇“每周源代码”,之后还会有无尽的续篇。 我正和Rob Conery、Dave Ward以及其他人一起做一个边缘项目。鉴于用户们源源不断地来页面访问,他们的位置源于其IP地址,我希望可以马上着手一项调研。我想用“地理定位”或反向IP地址查询获取IP,如127.0.0.1并转换成“纽约,NY。” 你能买到很多种服务和数据库,用来帮你实现web服务器调用指令,获取位置信息。有的会涵盖经纬,有的则显示城市名称。这些服务中有的相当昂贵,要花费500美元甚至更多。 我找到了两种解决方案,一个是服务方,那就是社区计划,而另一个则是客户方,就是从Google获取。 利用hostip.info实现基于社区的地理定位 如果你在浏览器中点击进入http://www.hostip.info,它会推测你的位置,并且显示它所估计的你所处位置及周边50到100公里范围的地图。这一项基于社区的项目使用免费可得的数据库作技术支持。在他们的数据库里,已经有超过860万的信息条。 更有趣的是,他们还为已定位的IP地址查询设定了清晰的API。 比如: http://api.hostip.info/get_html.php?ip=12.215.42.19&position=true   Country: UNITED STATES (US)  City: Sugar Grove, IL  Latitude: 41.7696  Longitude: -88.4588 如果你想添加信息,只要点击: http://api.hostip.info/?ip=12.215.42.19 你会收到一个包含很多有用信息的XML文档。 所以,我为这个服务编写了一项便捷的.NET包装。注意注释中的XML文件样本。我还为调试设置了一个默认位置。这个代码看上去虽然不是最清楚的,但XML的LINQ让它变得简单易懂。 1: public class LocationInfo 2: {…

0

每周源代码34- F#的兴起

[原文发表地址]  The Weekly Source Code 34 – The Rise of F# [原文发表时间]  2008-09-25 08:49 AM 首先,我要提醒大家,请大家看看我正在进行的最新的要求阅读源代码以编出更好的程序。亲爱的读者,我为大家呈上” 每周源代码.”的第34篇,之后还将继续。 F#,大家都急于了解F#和它的功能,F#2008年九月的CTP是在几周前出来的。和我讨论的同事也正在努力发掘它。下面是我们的目标: “为了研究编程语言而开发的F#将炙手可热的类型安全、简洁、性能、表达性脚本和高质量,获得良好支持的现代运行库系统相结合。” 它看起来更像一种研究语言,因为它内置于Visual Studio中,而且在语法突出显示、智能感知等方面都看起来很不错。亲爱的读者,这些信息对你来说可能是昨日黄花了,但是F#已经优化到更高的水平。这款发布将F#推向了和C# ,VB同等位置。它还有了自己的在MSDN上的F# 研发中心。似乎还蛮有模有样的。 Vertigo’s Rick Taylor在下面的图示中解释了F#的内容,意义以及方法: “除非你特别制定,否则F#是不可改变的,在一定程度上有点像C#的构造字符串。它会拓展到一些你未曾预期的地方。例如,一旦你在一些特定值中设置了int,你就不能改变了,除非你将其标记为可以改变。出现这一情况的原因是语言是主要的功能之一。函数式语言的编程中包含函数的返回值-但是每个值或每个集合的值都是自己的实体,如果在一个方法中改变它,将产生副作用,即在功能语言中让人不快的因素严格意义上,函数返回值,但不会改变参数或外面的部分(这就附带的产生了前面提到的单子模式)。F#虽遵循函数编程的规则,但也允许使用可变关键字来打破这一规则。 学习F#的最佳途径是什么呢?这里倒有几个不错的办法。首先,有点高调的自我推销下吧,我和几个优秀的F#的开发人士合做了两个关于F#的博客,还做了几个不错的关于.NET Rocks和Herding Code episodes的博客。 Starting Small with F# with Dustin Campbell F# with Robert Pickering .NET Rocks had Ted Neward and Amanda Laucher talking F# recently F# on…

0

每周源代码29 – Ruby,Shoes和第一个Ruby病毒

[原文发表地址]  The Weekly Source Code 29 – Ruby and Shoes and the First Ruby Virus [原文发表时间]  2008-06-24  07:47 上周我在挪威参加挪威开发者会议,所以恐怕这个月的每周源代码要变成双周源代码了。一次国外旅行能让人放松下来,感觉太棒了。这次旅行让我完全沉浸其中。不过我还是在慢慢地回归到现实的生活中来。 我最近对运用插件和其他工具扩展应用程序这类越来越有兴趣了。秉持着我一贯的信念——勤读代码,有助于成为更高水准的程序开发者——亲爱的读者们,这里我为你们奉上第29篇“每周源代码”,之后也会不断继续。 本周的源是为Ruby设计的“一点”式外挂。这非常酷,因为它集结了许多技术,形成了十分清晰的终极用户体验。其目的是使Ruby的GUI应用程序轻松运行,这的确有效可行,而且在各个层面的表现都非常突出。感谢Sam Saffron告诉我这个! 最开始,是名叫“为什么是幸运的僵硬”(或者简称"_why")的黑客提到的,所以这起源很早,而且有错误。你可以在GitHub上查看代码:http://github.com/why/shoes/tree/master 或通过“git clone git://github.com/why/shoes.git”克隆整个结构。 Shoes 在我看来,Ruby是一种非常美观,赏心悦目而且灵活的语言。Shoes则是使用Ruby制作窗口应用程序的GUI工具包。我在每周源代码12中曾提及过。Shoes是一个传奇,原因有很多,不过最重要的是因为它具有在所有软件文档历史上最伟大的API文档。在Shoes开发中最主要的著作叫做《没人知道Shoes》,这本书非常棒,连Chris Sells都对它爱不释手。 这是用Ruby和Shoes写成的通讯录程序样本的一部分: 1: Shoes.app :width => 320, :height => 350 do 2:  3: stack :margin => 40 do 4: stack :margin => 10 do 5: para "Name"…

0

返璞归真:If,For,Switch语句之后的生活,比如Data Structures Reminder

[原文发表地址]  Back to Basics – Life After If, For and Switch – Like, a Data Structures Reminder [原文发表时间]  2008-06-13 22:40 我在午餐时刚和我的一个好朋友一起进行了一对一编码学习。他正试着要让自己的编码技巧提升到另一个层次。就像我们通过锻炼可以提升一样,我觉得通过不断地编码和解决问题我们也可以提升。这也是为什么我提倡阅读尽可能多的代码以成为一个更优秀的开发者。同样这也是我开设“每周源代码”的原因之一。他说把这些写出来不要紧,因为也许其他人可以从中受益。代码和问题做了适当的更改以保护不那么单纯的人。 我们谈论的问题之一是有些编程人员/代码人/开发者的工具箱里只有一点点工具,比如if、for和switch。 我并不是在评判初级开发者和高级开发者。我在说的是成语和“词汇”。我觉得只会用if、for和switch的电脑编程人员就等同于在每句句子里都用“好像”一样。好像,你知道的,好像,他就是全部,好像,随便什么,我好像,亲爱的,而他,好像,唔,我就像我,你知道对吧? 说到英语,我怎么都不可能拥有像William F Buckley、Jr.-sized这样的词汇量,我也不相信要为了冗长而冗长。但是我坚信在对的场合选择正确的词是有百利而无一害的。我常常佩服那些能把一段冗长的段落精简为一句话却不失任何信息的人。 重构代码经常会给我一样光辉的感觉。这里有些实例,是我和我的朋友在午餐时间改的一些他程序中的代码,把冗长的段落变为简洁的句子。也许这不能算是一种罗列,不过倒是可以对我和其他人起到提示的作用,时刻考虑提前准备解决问题,就像,if,for,就像,switch,你懂? 大量的If有时就是Maps 他有一些代码,用来解析Web服务器转回的搞笑的XML文件。当然,XML的格式疯狂不是他的错。我们有时候不得不解析一些垃圾。他要确认一些特定值是否存在,然后要将其变为Enum。 1: if (xmlNode.Attributes[“someAttr”].Value.ToLower().IndexOf(“fog”) >= 0) 2: { 3: wt = MyEnum.Fog; 4: } 5: if (xmlNode.Attributes[“someAttr”].Value.ToLower().IndexOf(“haze”) >= 0) 6: { 7: wt = MyEnum.Haze; 8: }…

0

每周源代码18 – Deep Zoom(SeaDragon)Silverlight 2 MultiScaleImage鼠标滚轮缩放及平移

[原文发表地址]  The Weekly Source Code 18 – Deep Zoom (Seadragon) Silverlight 2 MultiScaleImage Mouse Wheel Zooming and Panning Edition [原文发表时间]  2008-03-08 04:14 亲爱的读者,请阅读我的系列博文《每周源代码》的第十八篇。以下是我本周在Mix阅读及编写的代码。 我在研究Silverlight 2中的Deep Zoom,却发现居然没有支持鼠标滑轮框外的平移,缩放功能的“Hello DeepZoom World!”的样本这简直太令人讨厌了。而Vertigo的样本示例则和我想要的效果一样。你可以在这里查看我做的Deep Zoom示例样本,或者点击右边的图片。 我们可以通过好几种方法让Silverlight支持鼠标滑轮。鼠标滑轮事件源于浏览器而非Silverlight本身(在我看来,这正如同你希望的那样,因为Silverlight内置于浏览器,它不能取代其特性)。 所以,你可以使用Adomas的Javascript代码,辅以Jeff Prosise编写好的代码进入Silverlight,调用方法。事件会在JavaScript中处理,Zoom函数也通过JavaScript的桥调用,转换成Silverlight的托管代码。 当然,你也可以调用内部托管代码,为DOM(JavaScript事件)设置管理处理,就像Pete Blois使用鼠标滑轮帮助器类进行操作那样。我直接从Pete的博客上下载了这个类并将其添加到了我的项目中。这非常棒,无需任何外部JavaScript文件。所有的事件都是由托管代码处理的。 1: if (HtmlPage.IsEnabled) { 2: HtmlPage.Window.AttachEvent("DOMMouseScroll", this.HandleMouseWheel); 3: HtmlPage.Window.AttachEvent("onmousewheel", this.HandleMouseWheel); 4: HtmlPage.Document.AttachEvent("onmousewheel", this.HandleMouseWheel); 5: } 此外,我还在Yasser博客中Yasser Makram和John的评论里截取了我最需要的代码段。 我看过很多用鼠标点击或者用键盘下键来实现缩放效果的示例,但我还想支持鼠标滑轮事件,就像在Mix中显示的那样。 这个更完整的样本将提供你: • 拖动以平移…

0