D语言的协程——Fiber

假期里,我草草地啃了一遍《D程序设计语言》这本书,基本掌握了D的语法,期间也发现了一点问题,这里就当是废话简单提及一下。

首先是这本书,它绝对是本入门的好书,但总感觉比较啰嗦,可能是由于没有再版,有部分内容是有问题的,比如NVI,或许这也从侧面说明了D语法变动过于频繁。其次,关于标准库的介绍不足,并且对于GC语法也没有介绍,尤其是nogc,根本没有提及,或许作者就是希望我们用GC吧。

相比于C++的语法,D的语法中有更多的语法糖,尤其是数组部分,操作符重载部分。Actor并发模型的加入,也使并发编程变得更加令人心旷神怡,似乎有种Erlang的感觉。我个人认为D是一门“更像Java的C++”语言。

阅读剩余部分

XML类型定义之DTD

这几天在重写Luit(一个java web框架)的配置解析部分,和servlet一样,luit支持且仅支持XML配置文件。为什么选择XML,而不是JSON,甚至是自己定义一种格式?理由如下:

  1. 我懒
  2. 大家都用xml
  3. xml的伸缩性满足要求

在正常情况下,我会按照如下方式解析配置:

  • 格式检查 -> 元素合法性检查 -> 解析DOM -> 必要值的提取

阅读剩余部分

Linux epoll 详解

最近,异想天开,想用D实现一个web服务器(似乎已经想这件事好久了,只不过之前是C++),自然而然得开始研究epoll。早就听说过epoll的大名,只不过网上的教程似乎没多少,并且感觉也没怎么把用法给讲完整。好在,通过几天的学习,也算是有所积累,因此想通过这篇post记录下,尽量把细节给讲清楚,希望它对各位有所价值。

Linux平台也有异步IO,比较通用的是POSIX AIO,只不过这货就是新开个线程来处理IO罢了,比较适合用来处理相对耗时的磁盘IO。

同属IO复用,除了epoll,我们也能选择select和poll,之间的性能比较需要视场景而定,通常对于Web服务这种场景,epoll会更加适合,若想深究,请大家阅读一下源码,自然明了,也就2~3KLoC。

阅读剩余部分

Linux namespace 简介 part 6 - USER

此篇post为译者续写,非原作者文章翻译,特此声明。

继上一篇 关于NET namespace的文章(网络的隔离),此篇post,我们将为大家介绍这个系列的最后一个namespace——USER,通过这个namespace,我们将能够使得例子中的那个bash(如果你愿意称其为VM)更加透明。如果你尚未阅读过之前的post,我强烈建议你先阅读一遍这个系列的第一篇post,了解下linux namespace隔离机制。

首先,有一点需要特别说明,USER namespace是在Kernel-3.8才被(大部分)实现的,当然并不是说如果你的内核版本高于3.8就一定支持,很多发行版因为安全问题,在编译内核的时候并未开启USER_NS,比如Archlinux。因此,阅读此篇post之前,请确定你的系统支持USER_NS。下文所有的example都是在ubuntu14.04中运行的。

阅读剩余部分

HTTP方法详解

先废话几句。

目前,我正在写一个web框架(没办法,作为毕业设计),因此持续关注这个领域。在很多框架的介绍页面,我都看到了“RESTful Supported”字眼,之前一直被搞得云里雾里,网页也能这么麻烦?好在最近正在拜读《RESTful Web Services Cookbook》这本书,没想到这方面的细节还挺多,所以想尽可能通过一个系列的blog向大家介绍REST。

REST是由Roy Fielding在其博士论文中提出来的,简单地说,它是一种架构风格,或者说是对web应用开发的一种架构风格的约束。经常用servlet的开发这一定对doGet和doPost相当熟悉,这两个函数对应HTTP中的GET和POST方法。仅仅使用这两个方法,其实就能开发比较复杂的网站了。这就让我们潜意识中认为“开发web,是如此的随心所欲,只要实现get和post就万事大吉了”。那么如果我们按照REST开发web(称之为RESTful),正常情况下,能够改善可扩展性(scalability)和可维护性,不过与此同时,它也要求开发者对HTTP方法有更加深入的理解和认识。

阅读剩余部分