时间很长;现在很短;距离很长;相遇很短
Posts tagged ruby
Java Scripting in JDK6
Jul 21st
对动态语言的爱啊,少年啊,前进~~
无聊的开场,简单的说,就是Java Scripting其实很容易,比你想象的要容易的多,特别是在JDK6的时候。
JavaScript的例子
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine jsEngine = mgr.getEngineByName("JavaScript");
try {
jsEngine.eval("print('Hello, world!')");
} catch (ScriptException ex) {
ex.printStackTrace();
}
无需过多解释,只要用了JDK6的环境以上代码就可以运行,默认使用Mozilla Rhino (1.6 release 2)脚本引擎,支持JavaScript 1.6
Ruby的例子
Ruby的例子要麻烦一点,因为要手工添加支持。但是其实也非常简单,只要把JRuby的实现和JRuby Scripting Engine加入就行了。
下载:
- jruby.jar – download jruby-bin-1.0.tar.gz file from JRuby website and extract the files
jruby.jar, asm-2.2.3.jar, asm-commons-2.2.3.jar, backport-util-concurrent.jarfrom directoryjruby-1.0/lib/. You don’t need the other files. - jruby-engine.jar – download jsr223-engines.tar.gz file from scripting.dev.java.net and extract the file
jruby/build/jruby-engine.jar
使用Maven添加相关依赖:
- jruby – groupId=org.jruby artifactId=jruby version=1.1.2
- jruby-engine – groupId=javax.scripting artifactId=jruby-engine version=20080611
jruby-engine需要添加附加的repository,例如http://shibboleth.internet2.edu/downloads/maven2
之后的使用和JavaScript的例子一样,当然,语法不一样。
使用下面的代码可以打印支持的脚本信息
ScriptEngineManager mgr = new ScriptEngineManager();
for (ScriptEngineFactory factory : mgr.getEngineFactories()) {
System.out.println("ScriptEngineFactory Info");
System.out.printf("\tScript Engine: %s (%s)\n", factory
.getEngineName(), factory.getEngineVersion());
System.out.printf("\tLanguage: %s (%s)\n", factory
.getLanguageName(), factory.getLanguageVersion());
for (String name : factory.getNames()) {
System.out.printf("\tEngine Alias: %s\n", name);
}
}
本地输出示例
ScriptEngineFactory Info
Script Engine: Mozilla Rhino (1.6 release 2)
Language: ECMAScript (1.6)
Engine Alias: js
Engine Alias: rhino
Engine Alias: JavaScript
Engine Alias: javascript
Engine Alias: ECMAScript
Engine Alias: ecmascript
ScriptEngineFactory Info
Script Engine: JRuby Engine (1.1.4)
Language: ruby (1.8.6)
Engine Alias: jruby
Engine Alias: ruby
JRuby Note: 简单就是美
Apr 25th
恩,我是一个Java中毒症患者,而且还是写了些传统程序,被传染了些OO顽疾的患者,对于Ruby这种太轻巧的东西接受起来还是有个过程的。
然而,我仍旧是个年轻人,早已坚定的支持Ruby代表的“小快灵”俱乐部,受够了传统软件工艺的铺张浪费,心存着的一点点幻想仍然让我被种种传说诱惑。
趁着一周唯二的两天不加班,研究了些JRuby 1.1.1——好吧,我就是纯粹的Java中毒症。顺便还关注了下ROX荡气回肠的季后赛第三场——然后浅浅的发现了JRuby的点点好处。
出色的SCM基础支持,小巧便捷的扩展,标准化的实现
SCM基础支持
GEM真的是非常有用的工具。Ruby毕竟晚生了几年,许多新的思路得以应用的更加完善。GEM类似于Maven的Resp,配合Rake就构成了非常好用的构建工具,连版本都被模糊化了,“我只要最新的就可以了”,是这样么?我只研究了两个小时,还只能猜猜。至于之前就听过的Raven,对于不懂Ruby的人来讲,简直比Maven还难用(我是新人,我不懂上个世纪的构建方法)。SCM早晚会成为一种标准化的事情,就像之前的Java Module被接受成为标准,每种语言形成产品都需要重视这一点。
不得不说的是ROR的DB扩展,数据迁移,在我看来,这就是很棒的数据库重构工具。重构在较小的时间段上对于软件的意义,有赶超迭代开发的趋势。而数据库重构,是其中最难最复杂的主题。虽然这不是Ruby天生的特性,但随着ROR的流行,也一定会慢慢深入人心。
模块化的扩展
Java是模块化的么,你真的确定jar和package是模块化的表现么?
动态语言天生就有这种优势,耦合和约束在非常低的水平,模块的互操作也就简单的多。加上良好的SCM,全球化的组件工厂,模块化对于Ruby,简直就是天生的完美排档。
标准化
这是一个不怎么显而易见的优点。正如标题所说,简单就是美。那么,如何简单,怎样简单?用大家都接受的概念。
用BlueCloth,HTML标签前开后闭,不用大大咧咧的程序员操心。
Wiki式的标记方法,写模板就像写文档。
学术上我们说Closure,我Ruby就实现个Closure。理论与实际尽量靠拢。“小快灵”你想要的,我最快实现。说Ajax,无非就是Autocomplete,DnD,一个单词搞定。什么,你要GoogleDoc?
前两天见了徐昊一面,于是现在对于“语言”更特质的东西很有兴趣,而所谓标准,就是直接到大多数人都觉得应该是这个样子,把一些不显而易见的东西挑明了,固定下来。当然,我说的是与钱无关的情况,虽然这种情况不存在。
完工
怨念的说,公司发调查问卷,征求个人发展计划。网上搜了搜IT认证,中国的IT培训环境糟糕的要死。高校没有软件理论,社会没有工业协作,我们的软件行业,还弱小的很呢。
Dynamic Language and DSL
Nov 29th
这是一篇技术评论,呃,请自行掠过
早上拜读了Martin Fowler老人家的BLOG Groovy or Ruby ,兴致勃勃的看这个时尚的家伙对动态语言的高谈阔论。下午就在InfoQ看到了对其新书的点评——Martin Fowler unveils details of his upcoming DSL book. 两样东西放到一起很有意思。动态语言与领域语言(Domain-Specific Language)。
MF的书中是这样介绍的。
如果我们把XSLT看成是专门格式化XML的语言,那么XSLT就是XML的DSL。
那么DSL有什么用呢?
根据MF的论述 Domain-Specific Language
DSL与通用语言相区别,是为特定目的而生的语言,它并不是什么新东西,历史几乎和计算机的历史一样长。
比如Windows的批处理文件,再比如HTML(某种意义上)。处理它们的程序和普通的应用程序不一样,这些程序并不知道这些语言具体描述了什么,却知道他们到最后大概是什么样子。但我们也不能把这些应用程序归结为系统程序,毕竟,你不能用这些动态语言写成任何一个通常意义上的程序。这些语言轻巧灵活,惹人喜爱,却长期处于没人在乎的地位。几乎没有任何一个大学开设JavaScript或者BAT的课程。然而,用它们开发的程序铺天盖地,甚至有些开发者都没有意识到他们在写程序。
我们到底有多少DSL,没有人说的清楚,甚至怎么界定都没有标准。然而这种工具的确越来越受重视。大型的软件通常都有自己的工具语言,比如SAP,比如PepleSoft,比如MathLib,比如SAS,掌握这些工具通常意味着熟练应用这些语言与相关的领域知识。而由于他们之间毫无联系,同种软件之间有着高昂的替换成本。变相垄断使得DSL由最初的简化用户操作变成了对抗新来者的武器。
标准化是由混乱走向秩序的利器。工业化也是软件行业一直追求的目标。让我们看看工业界是怎么做的,他们拥有流水线,有很好的设计,生产,销售流程。我们常常抱怨软件的变化,生产没有变化吗?现在工业可以高效的适应变化,依靠的就是对领域的深切理解,对规则的灵活掌握。
对标准的无尽追寻是业界走向成熟的重要标志。不妨设想,今后的某天,所有的财务软件都有统一的口径标准,统一的数据格式处理流程。集团化,高质量的软件生产和部署使我们更加有序的获取所需的功能。然而这一切,依靠的就是对DSL领域的入侵。Ruby的流行正式反映了这种入侵,当其追逐者不断的在各种平台上实现这门语言的时候,我们也看到了传统语言正积极的调整。Java向.net学习多语言支持。.net努力的靠近开源社区的标准。
我们说GOP,说AOP,无非就是想把领域问题(Domain Problem)从应用问题里面解离,我们需要成熟的软件产品,需要的是真正模块化的组件,而不是某个既成事实。被巨头们忽悠着团团转的我们,也只能等到他们被迫合作的时候,才能轻松一点。