Hello World
Spiga

分类:实践优化

使用Node.js编写Shell脚本,暨Jscex 0.6.5版本发布

2012-06-19 00:12 by 老赵, 5777 visits
摘要:昨天不得不花时间做了点保护博客阅读体验的事情,但其实这篇才是我真正想写的。上个星期在香港出差,晚上的活动大都是喝酒,回到酒店便借着些许酒劲改进Jscex。如今虽然Jscex的开发工作并没有详细的时间计划,但我正在使用GitHub的Issues页面记录需要制作的任务点,因此每天都是朝着目标逐步前进的。按照计划,Jscex的0.6.5的主要目标是对Jscex的模块机制进行改进,统一辅助方法,并使用Node.js重新编写发布脚本。这些工作的目的都是为接下来的0.7.0版本作准备,它将会是Jscex在项目功能与质量,以及专业性上有重大突破的版本。 阅读全文

Jscex单元测试:喝着咖啡品着茶

2012-06-13 00:47 by 老赵, 8495 visits
摘要:这段时间在香港出差,跟高帅富们一起工作。高帅富的办公室免费供应咖啡,放在壶里随你倒。茶叶也一样,立顿普洱茉莉自取。于是乎我每天也会喝一两杯提提神,尤其是午饭后,感觉还不错。技术人员似乎都挺热衷于这些饮料,也喜欢拿饮料来为项目取名,这方面最让人想到的例子估计就是Java了。这几天我为Jscex整理代码,准备发布其0.6.5版本,并为0.7.0做准备。这方面的主要工作之一便是为Jscex补充尽可能完整的单元测试。写完单元测试之后,我会感到自己是一个非常专业的程序员,突然就有了强烈的码农自豪感和自尊心。 阅读全文

Jscex预编译器及其DocPad插件

2012-06-04 22:34 by 老赵, 2661 visits
摘要:需求本身会是最好的动力。上个周末除了忙于构建Jscex主站以外,我还重新整理了Jscex的预编译器——或者说是AOT编译器。Jscex自带一个JIT编译器,配合eval可以在开发时避免额外的编译过程,这也可以说是Jscex的亮点之一。不过对于线上环境,一般都还是建议进行预编译,也就是将Jscex方法定义直接替换为目标代码。这么做的好处主要是为了降低部署时的脚本体积(摆脱对编译器的依赖所有代码加起来不到4KB),或是让异常情况下的错误定位变得容易(主要面向Node.js生产环境)。此外,为了便于编写文档,我还为DocPad开发了一个插件,用于对Jscex脚本进行预编译。 阅读全文

Jscex疯狂周末

2012-06-03 23:39 by 老赵, 4244 visits
摘要:这是个Jscex疯狂周末。从周五下班开始直到现在,我可谓一心扑在Jscex上——当然,早茶还是要的,健身房还是去的,买菜做饭拖地也是必不可少,但剩余时间基本都贡献给Jscex了。这段时间里,我研究了一些静态站点生成机制,并最后决定使用DocPad编写Jscex的文档站。然后便是捣鼓各种页面,重新编写快速入门示例等等。自然,还要它部署到GitHub Pages上,并启用jscex.info域名,还因为GoDaddy的域名服务器总是被墙,又把DNS解析交给了DNSPod。现在Jscex主站看上去是不是像样多了? 阅读全文

C#的设计缺陷(2):不能以void作为泛型参数

2012-05-28 12:27 by 老赵, 7888 visits
摘要:上一篇文章里我谈了C#中“显示实现接口事件”的限制(不过似乎有点打歪了),这一篇我们换个话题,再来谈泛型方面的限制。相对于Java的假泛型(编译型泛型,类型擦除)来说,真泛型是.NET的一个亮点。Anders Heisenberg多次提到.NET的真泛型有利于编程语言的进一步发展,可以带来更丰富的编程模型。不过.NET支持的泛型是一方面,具体到语言本身则又涉及到编译器的实现,而编译器的实现又收到运行时的限制等等,所以要谈语言的设计缺陷的“原因”就会变得很复杂。不过这里我们就把C#作为一个“成品”来对待,谈下它不允许以void作为泛型参数的“后果”,“原因”则略为一提,不做深究。 阅读全文

C#的设计缺陷(1):显式实现接口内的事件

2012-05-20 21:07 by 老赵, 8087 visits
摘要:其实使用C#这么多年,我时不时会遇到一些令人不爽的设计缺陷。这些缺陷大都是些限制,虽说无伤大雅,也很容易避免,但一旦遇到这些情况,总会令人心生不快,毕竟都是些无谓的限制。而且令人遗憾的是,虽说去除这些限制也不会带来什么问题,但我认为C#设计团队也基本不会去修复这些问题了,毕竟它们大都是些细枝末节。作为一名用C#的纯种码农,我突然一时兴起也要把这些设计缺陷记录下,也方便和大伙一起讨论下。那么这次就先从实现接口内的事件说起,当我们需要显式实现一个接口内的事件时,会发现我们必须提供add和remove访问器,这还会稍许影响到事件常用的使用模式。 阅读全文

编写一个“绑定友好”的WPF控件

2012-05-13 23:35 by 老赵, 11128 visits
摘要:最近在搞WPF开发,这对我来说是个陌生的领域。话说回来,可能是缺少耐心的缘故,我现在学习新事物的方式主要是“看一些入门文档”,“看一些示例”,然后“猜测”其实现并摸索着使用。在很多时候这种做法问题不大,但一旦有地方猜错了,但在一段时间里似乎和实践还挺吻合的,则一旦遇到问题就会卡死。上周五我就被一个WPF绑定的问题搞得焦头烂额,虽说基本搞定,但还是想验证下是否会有更好的做法,特此记录一下,欢迎大家指正。 阅读全文

使用Jscex改进Node Club(4):改写首页

2012-03-10 14:11 by 老赵, 3621 visits
摘要:上次我们分析了Node Club的首页实现,了解了它的功能以及目前的实现方式。这次我们便来使用尝试使用Jscex来改进首页的逻辑。作为一个面向开发人员的工具,Jscex除了隐藏必要的复杂度之外,还要让目标程序“可控”,无论是串行、并发还是逻辑表达——Jscex使用JavaScript语法,保证了程序逻辑的灵活与可控,尽可能地避免出现Leaky Abstraction。EventProxy的确提供了一种“完全并发”的抽象,但是对于需要“可控并发”,或是“串行执行”的逻辑和场景便显得无能为力了。 阅读全文

使用Jscex改进Node Club(3):分析首页实现

2012-02-29 23:44 by 老赵, 3105 visits
摘要:上次我们已经将Jscex成功地引入项目,现在便可以正式开始关注Node Club的实现了。Node Club中存在大量基于回调的JavaScript代码,颇有无从下手的感觉。既然如此,我们便随便挑一个,从首页入手吧!首页的目标其实很简单,加载几部分数据组成一个对象,再交给模板引擎生成HTML代码并输出。Node Club使用EventProxy类库来尝试解决大量异步函数的嵌套问题,但是在我看来,在这里使用EventProxy并没有带来太多的益处,从简化编程的角度来说,效果十分有限。 阅读全文

使用Jscex改进Node Club(2):引入Jscex类库

2012-02-20 21:57 by 老赵, 3290 visits
摘要:之前我们已经将Node Club在本地运行起来了,接着我们便来引入Jscex类库,为常用异步方法扩展出Jscex版本,并试着编写一些最简单的Jscex代码。在编写Jscex方法中,我们无需操作回调函数,只要在异步点上使用$await进行“等待”即可。我们也无需显式地处理错误,因为一旦出现错误便会抛出异常,异常如果没有被某个try…catch捕获到,则会顺着调用路径一路向上传递,直到被我们的代码或是系统捕获为止。Jscex将简单易用的传统编程模式与实践重新带回异步编程中,做到“同步编写,异步执行”的效果。这就是Jscex诞生的意义。 阅读全文

使用Jscex改进Node Club(1):运行Node Club网站

2012-02-20 14:24 by 老赵, 6133 visits
摘要:一直想做个相对完整的项目来演示下Jscex的使用,可惜缺少创意和精力,一直没能实现。前几天看到Node Club将其网站开源了,不禁让我十分欢喜。Node Club网站是个真实案例,复杂度适中,既是Jscex的典型使用场景,又能避开我不擅长的网页样式设计和制作,简直是一个再合适不过的基础样板了。周末我大致看了下代码,也试着将几个部分使用Jscex改进了一下,效果也十分显著,于是打算写作一个系列指引,希望可以对Jscex类库的推广有所帮助。在此第一篇,自然是最基本的环境建设开始说起。 阅读全文

一份用于学习单元测试的案例需求(实现)

2012-02-03 18:44 by 老赵, 6716 visits
摘要:终于把这份实现写完了,比想象中要花时间,尤其是为了可测试性而增加的代码结构。我并没有使用TDD来开发这个类库,依然是先写代码,再写单元测试,测试代码也只关注了代码主体,没有刻意去测试边界情况。一部分原因是其中都是内部实现,可以把握住输入,令一部分原因是这段实现主要是各种交互,而没有复杂的业务逻辑。我个人满足于单元测试而不是测试驱动开发,但如果您是使用测试驱动开发(TDD)甚至传说中的BDD来实现这个方案,那就更好不过了。 阅读全文

使用Mono.Cecil解决无法Mock非虚方法和密闭类的问题

2012-01-12 22:50 by 老赵, 4765 visits
摘要:之前我在微博上抱怨单元测试会让代码中的接口数量激增,有些同学回复说,这是因为在C#里只能Mock接口,如果是Java的话便可以Mock普通类。不过其实在Mock实现方面,C#和Java没有任何区别,只不过C#的成员默认“非虚”而已,因此无法使用继承后重载的方式实现Mock行为。我不喜欢默认的虚方法,但我也十分不愿意为了“单元测试”这个与具体功能无关的角度而破坏设计本意。幸好,我们可以用Mono.Cecil在单元测试执行之前,将目标程序集里的所有方法修改为虚方法,并去除所有密闭标记,这样遍可以轻而易举的解决无法Mock的问题了。 阅读全文

求助:一份用于学习单元测试的案例需求

2012-01-07 15:23 by 老赵, 5331 visits
摘要:一直熟知单元测试的重要性,也算是了看了几本这方面的经典书籍,但是真开始上手的时候总会遇到各种各样的坎。例如,为什么总感觉自己的单元测试之间有较多的重合,为什么每个单元测试都要准备那么多依赖?有的说法是,这意味着代码设计不够好,单元测试也有问题,或者说没有使用TDD的缘故,等等。但是,现实开发过程中在这方面也颇感无力。前段时间在微博上咨询了几个问题,感觉收获不大,这次干脆整理一份需求,仔细认真向高手学习一下代码设计,单元测试,甚至测试驱动开发的方式吧。我也会准备一些礼物来感谢一部分同学的帮助。 阅读全文

使用Mono.Cecil辅助ASP.NET MVC使用dynamic类型Model

2011-09-06 00:21 by 老赵, 11225 visits
摘要:这也是之前在珠三角技术沙龙上的示例之一,解决的是在ASP.NET MVC使用dynamic类型Model时遇到的一个真实问题。C# 4编译器支持dynamic类型,因此在编写页面模板的时候自然就可以把它作为视图的Model类型。表现层的需求很容易改变,因此dynamic类型的Model可以减少我们反复修改强类型Model的麻烦,再配合匿名类型的使用,可谓是动静相宜,如鱼得水。不过,如果把一个匿名类型直接作为Model交给视图去使用,在默认情况下会抛出异常。我们可以用Mono.Cecil来改变这一情况。 阅读全文

在.NET平台下使用C#交互式控制台(上):简介

2011-09-01 00:25 by 老赵, 8514 visits
摘要:上周日在广州的珠三角技术沙龙上,我的演讲题目是“Mono之于.NET程序员”。Mono一直是我十分喜爱的产品,我也一直关注它的发展,总有很多人用各种方式对它进行FUD,甚至是.NET程序员自己。这其实跟程序员使用盗版一样,自掘坟墓,是种无比愚蠢的行为。在演讲中,我提到.NET程序员可以如何从Mono项目中得到帮助,现在便以C#交互式控制台为例,演示下在.NET平台下使用Mono项目的常见方式。 阅读全文

谈谈年度最佳代码“不管你们信不信,反正我信了”

2011-08-05 23:15 by 老赵, 21239 visits
摘要:最近有段十分流行的代码,是从江湖传闻“身怀八蛋”的铁道部发言人王勇平同志的一句名言:“不管你们信不信,反正我信了……这是生命的奇迹……它就是发生了”所引申出来的。这段代码虽然只是在调侃,但是围绕这段代码也产生了一些讨论(如代码风格,编程规范等等),在此顺手记录一下,就当无聊罢。 阅读全文

IBM面试记

2011-07-02 23:29 by 老赵, 35070 visits
摘要:话说其实我很久没有被正经面试过了。一开始去微软实习自然经过了经典的笔试和几轮面试,然后去了朋友的创业公司并立即被激动集团收编——没有面试,接着从激动集团去合伙创业——没有面试,然后被朋友推荐去盛大创新院——面试更像是讨论及聊天。由于长久缺乏职场磨练,我虽然对自己能力有一定能力,但也怀疑自己如果通过“正经渠道”去面试的话能有多少机会成功。这次面试IBM终于算是过足了面试瘾,记录一下。 阅读全文

Jscex项目现状:UglifyJS解析器及AOT编译器

2011-04-15 02:04 by 老赵, 3929 visits
摘要:Jscex项目是我为了简化JavaScript异步的一个类库,支持任意JavaScript(ECMASCript 3)引擎。Jscex小巧而强大,可以极大地改善前端的AJAX及动画等场景的编程体验,同样也可以用在node.js进行服务器开发。从产生Jscex的想法到现在也有几个月的时间了,也一直想设法进行推广。在思考过程也发现了它在实际生产中可能会遇到的问题,于是前两个星期的主要工作,便是针对这些问题进行优化。首先我将Jscex的JavaScript分析器从Narcissus换成了UglifyJS,并基于node.js开发了一个简单的AOT编译器。接下来我也打算写个稍微详细一点的介绍,然后在国外社区看看反响如何。 阅读全文

通过定义常量控制Closure Compiler的行为

2011-04-11 01:12 by 老赵, 2797 visits
摘要:上一篇文章里我提到,在进行Closure Compiler压缩之前可以对代码进行一些预处理,这样可以得到更好的效果。在回复中有朋友提到可以使用一些Annotation(标记),例如加上@export,然后使用--generate_export,便可以保留需要的那些变量名。不过经过实验还是没有得到预期的效果,所以使用标记来“指导”高级压缩行为依旧是一个不太可行的做法。不过有个标记与我的设想一直,那就是使用@define来“定义一个常量”,然后在编译(压缩)时对其进行覆盖。这为一些压缩需求提供一种更直接的控制方式。 阅读全文
< Prev 1 2 3 4 5 6 7 8 9 ... 11 Next >
使用Live Messenger联系我