Electronic Joint Business

Solution for E-Business

.NET

在 .NET 4.5 中使用 Websocket

作为下一代的 Web 标准,HTML5 拥有许多引人注目的新特性,如 Canvas、本地存储、多媒体编程接口、WebSocket 等等。这其中有“Web 的 TCP ”之称的 WebSocket 格外吸引开发人员的注意。WebSocket 的出现使得浏览器提供对 Socket 的支持成为可能,从而在浏览器和服务器之间提供了一个基于 TCP 连接的双向通道。Web 开发人员可以非常方便地使用 WebSocket 构建实时 web 应用,

IETF 的 RFC 6455 对 WebSocket 协议进行了标准化, 在 Wikipedia 和 W3C 站点上提供了更多的介绍和详细资料。

WebSocket 连接是通过在客户端和服务器之间的 HTTP 握手来建立的(前缀是 “ws://” 或者 “wss://”) 。拿 Wikepedia 上例子来说明,客户端会这样发出请求:

GET /mychat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat
Sec-WebSocket-Version: 13
Origin: http://example.com

之后服务器发出响应来接受连接:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat

这里的 “Sec-WebSocket-Key” 和 “Sec-WebSocket-Accept” 用于通过密钥验证算法来确认客户端和服务器之间的连接。

>>> 阅读全文

 

, , , ,

.NET 编译平台 (Roslyn) 概述

文章评价:
一直以来,编译器都按黑盒的方式运作 — 这头放入源代码,中间部分施展魔法,在另一头就会生成目标文件或程序集。当编译器施展魔法时,它建立了对代码的深刻理解,但这些知识除了实现编译器的巫师外,旁人无法掌握。一旦生成编译输出,这些信息就被彻底忘却。几十年来,这种方式一直运作良好,但现在却不能满足需要了。

如今为了提高生产力, 人们越来越依赖于集成开发环境(IDE)所提供的智能感知、重构、智能重命名、 “查找所有引用” 和 “转到定义” 等功能。我们用代码分析工具来改善代码质量,用代码生成器来协助代码构建。想要让这些工具更聪明,就需要它们能更多地访问编译器,同时也需要对编译器中深厚的代码处理知识有更多的了解。

这就是 .NET 编译器平台(“Roslyn”)的核心使命:打开黑盒让工具和用户可以分享编译器处理代码时的大量信息。与 “源代码—目标文件”的直译方式不同,Roslyn 使编译器成为平台,这意味着工具和应用程序可以通过 API 来处理代码相关的任务。

将编译器过渡到平台,这大大降低了构建代码相关(code focused)工具与程序的门槛,在许多方面推动了创新,包括:元编程、代码生成、代码转化、C#\VB 的交互式使用、领域特定语言内嵌 C#\VB 等等。

在 .NET 编译器平台 (“Roslyn”) SDK 预览版中包括了最新的语言对象模型,可用于代码生成、代码分析与重构。我们还包括了一些 API 草稿,以便在后续的版本中实现支持脚本、C#\VB的交互式使用。本文是对 .NET 编译器平台(“Roslyn”)的概念性描述,更多情况可以参考预览版 SDK 中的演示与示例。

>>> 阅读全文

 

, , , , , , , ,

.NET 4.5 的五大最佳特性

.NET 4.5 已经发布了将近一年了,现在有个问题是 .NET 开发者的对于微软最新的发布版,通常只约略知晓一到两个特性,其它则只流于表面,它们最终不过成为 MSDN 上的简单文档说明而已。

如果你问个开发者 .NET 4.5 核心框架中多了哪些新特性,大部分人只会回答 async 和 awaitt。(至少和我打交道的人只提到了上面这些特性。)

确实,要深入了解所有的新特性非常困难。特别是,是否值得去了解这些特性完全取决于你手边的工作。

因此,在这篇文章中,我会介绍我所喜欢的几个 .NET 4.5 核心特性。这只是我个人的偏爱,未必就是你的最爱。不过如果我选的这些话题对不断壮大的 .NET 社区能有所帮助,那我就心满意足了。

注意: 本文只会涉及与 .NET 核心框架相关的新特性,而不讨论诸如 ASP.NET、 WCF、 WPF、 WWF 等等特性。

>>> 阅读全文

 

, ,

通过 C# 使用 ZeroMQ (二) 多段式消息,JSON 和同步发布/订阅模式

文章评价:

这是该系列文章的第二部分。在这部分文章中,我们会讨论 ZeroMQ 所能发送和接收的两大类消息,并且如何用 JSON 来格式化消息。我们还会学习 如何使用轮询 (polling) 机制。在文章的最后,我们举例说明什么是同步发布/订阅模式。

ZeroMQ消息
ZeroMQ 套接字可以发送或者接受单段式消息(single-part)或多段式消息(multi-part)。

单段式消息
所谓单段式消息,就是一个消息只包含一帧。所谓帧是一个字节数组,其长度可以零以上的数值。在 ZeroMQ 参考手册中,帧也被叫做“消息段 message parts”。

举个单段式消息的例子,就比如说上一篇文章中我们发送/接收的所有消息都是单段式消息。在发送和接收的操作中,我们使用的是字符串,而字符串实质也是一个字节数组。

>>> 阅读全文

 

, , , ,

通过 C# 使用 ZeroMQ (一) ZeroMQ 通讯模式

文章评价:
ZeroMQ (也拼写作 ØMQ、 0MQ 或 ZMQ) 是个非常轻量级的开源消息队列软件。它没有独立的服务器,消息直接从一个应用程序被发送到另一个应用程序。ZeroMQ 的学习和应用也非常简单,它只有一个 C++ 编写成的单个库文件 libzmq.dll, 可以链接到任何应用程序中。如果要在 .NET 环境中使用,我们需要用到一个 C# 编写的名为 clrzmq.dll 包装库。

ZeroMQ 可以在 Windows、 OS X 和 Linux 等多种操作系统上运行, C、 C++、 C#、 Java、 Python 等语言都可以编写 ZeroMQ 应用程序…这使得不同平台上的不同应用程序之间可以相互通讯。

ZeroMQ 的核心
ZeroMQ 的主要部分是套接字 Socket,不过它并未直接使用传统的套接字,而是在传统的套接字 API上提供了一个抽象层,这让用户从复杂和重复的编程任务中解脱出来。ZeroMQ 支持多种类型的套接字 (类型被定义为套接字自身的一个属性)。发送端和接收端的套接字类型组合造就了多种不同的通信模式,本文的后面我们会涉及到这一部分。

异步通讯
ZeroMQ 提供了异步通讯方式,这意味着即使在设置或关闭套接字连接、重新连接或进行消息传递的时候,应用程序都不会被阻塞。与程序正常任务处理并行的,这些操作由 ZeroMQ 自身在后台线程中进行管理。在需要时,ZeroMQ 会自动将消息 (无论是发件端或接受端) 放入队列中, 这一过程相当智能,消息会被推送到离接收端尽可能近的队列中。

传输协议
ZeroMQ 支持四类传输协议。每种传输协议由地址字符串来定义,该字符串由两部分组成:transport://endpoint。传输(transport) 部分指定了所使用的底层传输协议,端点(endpoint) 部分的格式则随着使用的协议而有所不同,具体如下:

>>> 阅读全文

 

, , , , ,

LLVM 简介

本文将讨论让 LLVM 成型的一些设计策略。LLVM 是个一揽子项目(a umbrella project),用于支持和开发一系列紧密相关的底层工具组件(例如汇编器、编译器、调试器等等),从设计之初,LLVM 就考虑兼容现在广泛使用的 Unix 系统工具。 起初 “LLVM” 这个名字是个缩写,现在则是这个一揽子项目的品牌。虽然 LLVM 提供了独特的功能,并因其强大的工具而闻名(例如 Clang 编译器, 一个比 GCC 更强大的 C/C++/Objective-C 编译器),但真正让 LLVM 有别于其他编译器的地方是在其内部架构。

从诞生之初(2000年12月),LLVM 就被设计成一组具有定义良好接口的、可重用的库。当时,开源的编程语言的实现通常按专用工具来设计的,一般只能不可分割地运行(monolithic executables)。比方说,很难从类似 GCC 这样的静态编译器中将解析器分离出来用在静态分析或者重构。而脚本语言大多都提供了将运行时或解释器嵌入大型应用的方法,该运行时也是一个完整的、不可分割的可以被嵌入或者单独使用的代码块。不同语言实现项目之间根本无法重用部件,代码也很难共享。

除了编译器本身的组成外,围绕流行语言的社区往往呈现出很强的两极化倾向:有些实现提供了传统的静态编译器(如 GCC, Free Pascal 和 FreeBasic), 而有的实现则以解释器或JIT(Just-In-Time)编译器的形式提供了运行时编译器。但是很少有实现同时提供两者,即使有的话,两者也极少共享代码。

过去十多年中,LLVM 慢慢改变了这种困境。现在,LLVM 被作为一个通用的基础框架实现了很多静态编译或运行时编译的语言(例如,GCC 支持的语言族、Java、.NET、Python、Ruby、Scheme、Haskell、D语言以及许多的知名度稍低的语言)。它也取代了很多专用编译器,像苹果公司 OpenGL 栈中的运行时特化引擎(runtime specialization engine)以及 Adobe 公司 After Effects 产品中的图形处理库。最后,LLVM 也用来创建各种新产品,最出名的应该算是 OpenCL GPU 编程语言和运行时了。

传统编译器设计简介
传统的静态编译器设计(如大多数 C 编译器)中采用的最普遍的方案就是三阶段编译,该设计主要由三个组件组成,分别是前端、优化器和后端(如图1-1所示)。前端负责解析源代码,检查错误,并构建语言相关的抽象语法树(AST)。AST 可根据情况转换为便于优化的新表示方式, 优化器和后端针对这种新表示而运行。

>>> 阅读全文

 

, , , , , ,

.NET 4.5 并行之新特性

原文

随着 .NET 4 和 Visual Studio 2010 的发布,微软为并行提供相当广泛的支持,包括: 任务并行库 (TPL)、 并行 LINQ (PLINQ)、 新的同步和协调原语集合 (如 ConcurrentDictionary),为处理并行工作负荷而改进的线程池、 新的调试器窗口、 新的并发可视化工具,等等。自那时起,微软一直致力于埋头开发新的 .NET 4.5 和 Visual Studio 11。这是对 Visual Studio 11 开发者预览的一瞥。

更好的性能

任务并行库

More and more, TPL is becoming the foundation for all parallelism, concurrency, and asynchrony in the .NET Framework. That means it needs to be fast… really fast. Performance in .NET 4 is already good, but a lot of effort was spent in this release improving the performance of TPL, such that just by upgrading to .NET 4, important workloads will just get faster, with no code changes or even recompilation required. As just one example, consider a long chain of tasks, with one task continuing off another. We want to time how long it takes to set up this chain:

>>> 阅读全文

 

, , ,

Scala语言编程指南 (一)

文章评分:

Scala设计初衷
Java 语言已经是有一定年头的语言了,随着 C#,Ruby 等新的语言的出现,Java 的语法显得臃肿且平庸,和这些新兴语言相比,其开发效率并不十分突出。程序开发者想要一种更精炼和更灵活的语言去提高他们的生产效率。这也是如今所谓的 Ruby, Python 这样的脚本(Script)语言大行其道的原因之一。

当 Java 开始老朽不堪的时候,其虚拟机(JVM)的性能却得到大众的认可,JVM 的性能优化做得较为到位,因此许多程序开发者相信使用基于 JVM 的新语言是正确的前进道路。为此 Sun 雇佣了 JRuby 和 Jython (Ruby 和 Python 在 JVM 上的实现)的主要开发者。而 Scala 的出现对于 Java 开发者来说提供了一门更加新式的语言。

值得一提的是 Scala 开始为针对 JVM 设计的,但是随着 Scala 的发展,它也可以运行在 .NET 的 CLR 虚拟机上。当我们讨论有关 Scala 语法时,它们大致也能应用于 .NET 之上。

Scala 简介
Scala 是一种多范式的语言,因为 Scala 既支持面向对象编程,也支持函数式编程。它在拥有简洁,优雅,灵活的语法的同时,也提供了一个久经考验的静态类型系统和惯用语法,所以从小巧的解释性脚本到大型的复杂系统它都可以胜任。无独有偶,Microsoft 资助的大学项目 Nemerle 也走了同一条道路。

>>> 阅读全文

 

, , , , ,

Nemerle语法指南 之二

在本章中,我们会介绍一些 Nemerle 中如何定义类等等面向对象的元素,它和 C#、Java 或者 C++ 有些类似,但是略有区别。 同时,我们也会关注循环和一些简单的宏。

类的定义
我们不再介绍什么是类,关于这个问题,你可以参考任何一种面向对象的语言。在 Nemerle,关键字class用来定义一个类,基本格式是

class MyClass {
  // something inside
}

在类中可以定义很多实体,这些实体可以用访问修饰符或者其他修饰符来描述。

修饰符Modifiers
Nemerle 中有许多修饰符,最常见莫过于public, static和mutable。

我们将首先看一下访问修饰符。修饰符指定了其他类访问指定实体的方式。访问修饰符可以修饰类中定义的任何一个实体,默认为private。而public和interal则可用以修饰类,默认是internal,这些修饰符的含义如下:

>>> 阅读全文

 

, ,

Nemerle语法指南 之一

Nemerle 是.NET家族中的新丁,是 Microsoft 的研究项目之一,它由Wrocław大学的Kamil Skalski、Michał Moskal、Prof. Leszek Pacholski、Paweł Olszt等人发明。目前最新版本是1.0。

和 C#, VB.NET,F#等现有的.NET家族成员不同,Nemerle 是种多范式的编程语言,之所以称之为多范式语言,是因为它支持以下范式:

  • 面向对象编程 Object-Oriented Programming (OOP)
  • 函数式编程 Functional Programming (FP)
  • 元编程 Metaprogramming (MP)
  • 面向组件编程 Component-Oriented Programming (COP)
  • 面向领域专用语言编程DSL-Oriented Programming (DOP) 或面向语言编程Language Oriented Programming (LOP).
  • Nemerle 中最突出的是其元编程能力,它是基于和Lisp语言类似的宏的机制。

    设置Nemerle编译环境
    最新发布的Nemerle 1.0版本提供了和Visual studio 2010集成的能力,你可以在google code上下载到最新的版本。你需要的是基于.NET 4.0的Nemerle语言包Nemerle VS2010扩展这两个Zip文件。

    安装Nemerle很简单,用7-Zip打开VS 2010扩展文件的压缩包,双击包内后缀为vsix文件,就可以自动安装Visual studio 2010的Nemerle语言的支持。然后再将Nemerle语言包直接解压到”%Program files%\nemerle”目录即可,%program files%视你的操作系统略有不同,在32位Windows上,它指的是C:\Program Files,而在64位Windows系统上,则应该是C:\Program files (x86)目录。

    >>> 阅读全文

     

    , ,

    在Azure中运行MySQL

    由于不同的原因,我手头的许多Azure应用都必须依赖于MySQL。例如,我手头的Joomla开发就完全依赖于MySQL。大部分情况下,这是因为在应用中使用了MySQL的原生驱动,而未不是设计一个数据库独立层,类似.NET中的ADO.NET或者PHP中的PDO,或者裁剪掉那些MySQL特有特性。基于上述的理由,要在Windows Azure中运行这些应用,不得不想方设法让MySQL在Azure中运行。

    这其实没有想象的困难,在此过程中,我可以重用许多二进制可执行文件。

    想法与建议
    在深入让MySQL运行起来的技术细节之前,我想先分享一下个人对于在Azure中运行MySQL的观点,在我告诉你别这么做之前,你可以节约阅读这篇文章的时间,

    现实是即使你能在Windows Azure中运行MySQL,这么做也不太实际。我的建议是把它保留做你最后的法宝或者权宜之计直到Sql Server能够支持你的应用。我这么说是有许多原因的,有些是技术方面的,有些是财务方面的。因此,本文更多是关注在Azure运行和管理MySQL的过程,而不是非要这么做。

    现在,让我们来深入技术问题。在Azure中运行MySQL的方法是创建一个Worker Role,它会作为二进制文件的实际宿主。你只要拷贝出可执行文件,然后编写简单的Windows Azure相关代码来实际执行应用,并传递请求给它。事实上,任何可执行文件只要可以通过xcopy发布而且无休止运行的都可以通过这个方法来实现。这对于进行分布式计算之类的事情是相当棒的。

    >>> 阅读全文

     

    , , , ,

    细谈UI线程的SynchronizationContexts

    [b]为什么需要SynchronizationContexts[/b]
    在图中的演示里,我试图用ironruby或者ironpython去控制一只小乌龟,(就是那个三角箭头),通过ironruby的命令让小乌龟前进、后退、左转、右转。

    这里存在一个线程同步的问题,敲下一个命令之后,屏幕上的UI物件应该要马上按指令运作(体会一下魔兽世界的宏),所以小乌龟工作在一个UI线程里,而命令窗口工作在一个非UI的线程,如果不加任何处理的话,直接在命令窗口里操作UI物件的引用就会导致一个System.InvalidOperationException: “Object is currently in use elsewhere”(.net 2.0),或者得到一个不可知的状态(.net 1.0)。

    [b]应用场景和解决方案[/b]

    上面提出的一个很常见问题:应用程序有两个线程:线程A和线程B,不过线程B比较特殊,它属于UI线程,当这两个线程同时运行的时候,线程A有个需求:”修改UI对象的属性”,这时候如果你是线程A,你会如何去完成需求呢?!可能有几种解决方案。

    第一种方式:

    >>> 阅读全文

     

    , , ,

    在.NET中使用嵌入式Firebird (附驱动更新)

    Firebird 脱胎于 Borland 公司的开源版数据库 Interbas e6.0,是一个完全非商业化的产品, 用 C 和 C++ 开发。由于与 interbase 的血缘关系,大部分 interbase 的开发工具可以直接应用 到 Firebird 开发中。

    Firebird 2.0 项目已于 2005年2月份开发完成,2005年5月发布。下面列举一些 Firdbird 2.0 新增加的功能:

    • 对 SQL 标准支持增强:支持 SQL200X 标准定义的“派生表”(derived tables)、为了和 SQL-99 标准一致,引进了“SEQUENCE”,用来代替“GENERATOR”;
    • 经典结构模式(Classic architecture)支持全部API;
    • 支持 64 位操作系统平台;
    • 内置函数增加;
    • 存储过程语言(PSQL)增强:支持“显式游标”、存储过程支持默认参数、支持“LEAVE标号”语法、将用户自定义函数(UDF)作为存储过程调用等;
    • 索引得到增强:252字节限制取消、支持“表达式索引”等;
    • 改进的优化器;
    • 安全增强:安全数据库结构改变、口令加密更安全、远程不能访问安全数据库、阻止“暴力破解”行为;
    • 在线增量备份。

    单从功能上,Firebird 比 SQLite 要强大许多,并且 FireBird 有多种版本,包括服务器版,单机版以及嵌入式,不管是服务器版还是嵌入式版它都完整支持视图、触发器、存储过程等SQL高级特性。

    部署嵌入式FireBird十分简单,只需要把 fb Embedded Server 的 “fbembed.dll” 拷贝到应用程序目录下。在 .net 的工程项目中则可以包含 fbembed.dll 文件,并将其属性设置为 “copy always” 或者 “copy if newer” 即可。

    在 C# 中使用嵌入式 Firebird 需要 .net provider 1.6以上版本,典型的 ConnectionString 如下:

    >>> 阅读全文

     

    , , , , , ,

    Axum, 一切为了并行 (二)

    [b]代理编程[/b]

    上面的斐波那契数列的例子只是展示了一个微不足道的构建数据流网的例子。这类网络适合那些“数据流入,数据流出”的场景,但它不能指定数据如何在网络中传播,也不允许不同类型的数据流入或者流出网络。

    代理与通道给了我们创建复杂数据流网所需的一切。

    通过通道沟通的两个代理是种弱关系:它不需要知道或关系另一个代理是如何实现的。它们之间的“契约”只由通道指定。借用OOP中的概念,通道扮演了接口的角色,而代理则是实现了该接口的类。

    使用通道时,你向输入端口发送数据,从输出端口接受数据,这里,输入端口扮演了目标,而输出端口扮演了源头。而实现通道时,输入端口则是源头,输出端口则是目标。这有点难以理解,想想家里的水处理机,如果水是数据的话,考虑水的流向,你把水倒入入水口(水相对于你是流出),从出水口接水(水相对于你是流入),而处理机内部而言,水则是从进水口流入,从出水口流出。

    >>> 阅读全文

     

    , , , ,

    Previous Posts