Electronic Joint Business

Solution for E-Business

ironruby

初识 Sinatra (三)

文章评分:
在本教程的第二部分,我们利用 DataMapper 将任务保存到后台数据库,同时我们还用 Sinatra 创建了 web 前端以便显示、添加、删除和结束任务。现在这个 Just do it 应用功能齐备,但是样子还有点丑陋。

在本章中,我们继续对这个应用做些美化修饰,并增加一些功能,让你能够创建多个任务列表。

添加样式
现在我们用样式表来对应用进行美化修饰。在你的 “layout.slim” 中添加下面这行代码:

<link rel="stylesheet" media="screen, projection" href="/styles.css">

现在创建一个名为” styles.css”的文件,并保存在”public”文件夹中,将下面 CSS 内容添加到该文件中:

.completed{
  text-decoration: line-through;
  }
.tasks{
  padding:0;
  list-style:none;
  width:400px;
  }
.task{
  position:relative;
  padding:2px 0 2px 28px;
  border-bottom: dotted 1px #ccc;
}
form.update{
  position:absolute;
  bottom:2px;
  left:0;
  }
form.update input{
  background:white;
  color:white;
  padding:0 2px;
  border:solid 1px gray;
  cursor:pointer;
}
.tasks li.completed form.update input{
  color:#47FD6B;
  }
form.delete{
  display:inline;
  }
form.delete input{
  background:none;
  cursor:pointer;
  border:none;
  }

刷新页面,现在页面是不是看起来好多了,也更像一个真正的任务列表了。你也许注意到,该样式表中有个 ‘completed’ 类。 到目前为止,我们显示已完成的任务的方法是为它添加完成的时间,这样看起来不怎么样。我们来修改一下 task 视图,添加 ‘completed’ 类。这样利用样式表,已完成的任务看起来就是完全不同的风格。打开 “task.slim” 做如下修改:

>>> 阅读全文

 

, , , , , ,

初识 Sinatra (一)

文章评价:

Sinatra 是一个基于 Ruby 语言,以最小精力为代价快速创建 web 应用为目的的 DSL。如果您对日渐庞大的 Rails,感到厌倦,不如通过本教程来学习一下轻盈的 Sinatra。本系列教程有四个部分,它将带着你一步一步用 Sinatra 和 DataMap 创建一个功能齐备的线上代办事项的应用,我们称它为“Just Do It”。希望读者能通过本文了解到利用 Sinatra 创建应用是多么的简单而快速。

首先我们先进行开发 Sinatra 应用的准备工作。

安装 Sinatra
要让 Sinatra 能工作,你首先必须安装 Ruby。这里我建议您使用 RVM 来安装。( 你可以参考 Glenn Goodrich 的教程)。一旦你安装好了 Ruby 和 Rubygems,你就可以安装 Sinatra 了。用 Rubygems 来安装 Sinatra 不过是小菜一碟,你只需要打开命令行并输入:

gem install sinatra

如此简单,你就可以做好一切准备工作了。

>>> 阅读全文

 

, , , ,

Ruby Slim 模板语言

Slim 是一个快速的轻量级的模板引擎,其设计目的是通过精简视图端语法,让开发者更专注于内容的本质。Slim 支持 Rails3,在 Ruby 1.9.2和 Ruby/REE 1.8.7 上都能正常工作。

Slim 的语法的设计思想是,“够用即可- What’s the minimum required to make this work” 。 在后面的例子中,我们将会看到 Slim 的语法是多么简洁。随着越来越多的人参与到 Slim 项目里,现在 Slim 也可以支持 Haml 和 Jade 的语法附加。 Slim 团队很欢迎这些扩展,因为对编程语言的审美观是因人而异的。

Slim 使用 Temple 来进行解析/编译,它也被集成到 Tilt,因此 Slim 可以很好地和 Sinatra 或者单纯的 Rack 一起工作。

为什么需要 Slim?
在 Rails 社区,Erb 和 Haml 无疑是两大最流行的模板引擎,但是 Erb 的语法相当累赘而 Haml 的语法则含糊不清难以接受。 Slim 采用的是非常简化且高效的语法,就执行效率而言,用户是无需顾虑的。

没错,Slim 非常之快。在本文的最后你可以找到基准测试的结果,如果你对测试结果持保留意见,那我们也提供了进行基准测试的 rake 任务,你可以自己动手测试来查看结果。

>>> 阅读全文

 

, , ,

细谈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,你会如何去完成需求呢?!可能有几种解决方案。

第一种方式:

>>> 阅读全文

 

, , ,

Ironruby与CLR语言的互操作性 (二)

引用 .NET 的 Assembly
除了我们前面提到的 require <PartialName> 和 require <Strongname> 外,Ironruby 1.0发布的时候,还提供了一个新的函数 load_assembly,这个函数的参数为 Assembly 的名称,在内部,load_assembly 会先调用 Assembly.Load,如果找不到这个 Assembly,那就再调用 Assembly.LoadWithPartialName。它也支持 require 的两种调用方法。除此之外,load_assembly 还可以接受第二个参数,指明只引用该 Assembly 下的某个名称空间,比如:

load_assembly ‘IronRuby.Libraries’, ‘IronRuby.StandardLibrary.StringIO’

名称空间
当装配件被加载之后,它的顶层名称空间和类在 ironruby 内是可见的。比如下面这个例子

namespace Models {  
  public class Person {  
    private string name;  
    public Person(string name) {  
      this.name = name;  
    }  
    public string Name {    
      get {  
        return name;  
      }  
    }  
  }

上面C#代码的名称空间“Models”与普通的ruby模块一样可被存取:

>>> require ‘models’  
=> true  
>>> Models  
=> Models  
>>> Models.class  
=> Module

需要注意几点:

  • 1.不可用小写的名称空间:Ruby 常量要求使用大写开头的名字,所以名称空间必须遵循 Ironruby 的要求。
  • 2.不可用“空”的名称空间: 对 IronRuby 来说,名称空间不能为空。而且由于 CLR 的名称空间只在有可访问的子类时才存在,因此假如名称空间的所有子类都是私有的,IronRuby 将无法访问该名称空间。所以名称空间内至少要有一个公共的可访问类。

因为名称空间被视为 Ironruby 的普通模块,所以它和其他 ruby 模块一样,可以被 mixin.

>>> 阅读全文

 

, , , , ,

Ironruby与CLR语言的互操作 (一)

ironruby 是 .Net 平台下的一个 ruby 实现,众所周知,ruby 吸取了 Perl,python 等脚本语言的灵活性,带有实体对象模型,是一门动态/解释语言。从进入 ironruby 0.9.1 之后,ironruby 日趋稳定,之后发布的 Ironruby 1.0,兼容于 ruby 1.8.6,1.1 版本则增加了了对 .NET 扩展方法的支持,可以完美的运行 LINQ,目前开发中的 Ironruby 1.1.1 则是第一个兼容 ruby 1.9.2 的版本。

由于 IronRuby 是基于 .NET DLR,因此你可以在 IronRuby 中调用任何已有的 .NET 代码。这意味着可以在 IrongRuby 中使用任何框架,比如 Windows Forms、WPF 或者 GTK(#),因为.NET 和 Mono(分)拥有对这些框架的 CLI 绑定。Mono 甚至有一个使用GTK 实现的 Windows Forms,这样应用程序无须修改就可以运行在两个实现上。

Ironruby与CLR语言的互操作
IronRuby 带来的改变:
1. 与静态语言的互操作:IronRuby 与 .NET 框架集成的非常紧密,在 IronRuby 中调用 C#/VB 代码不会感觉是在使用“互操作”。C# 也可以通过 DLR Hosting API 调用 IronRuby 代码。而在 .NET 4.0 中,动态方法分配已经成为了 C# 的一部分,因此在 C# 中调用 IronRuby 代码和调用 C# 方法差不多。由于 IronRuby 基于 DLR,因此也可以方便的与其它 DLR 语言进行交互,如今 Python 和 Ruby 可以很好的合作,未来的 DLR 语言也一样可以。

2. 更稳定且丰富的支持,你可以抛弃 rubyforge 上许多质量不高的无人维护的 gems,改用 .Net 自身丰富的资源,你可以放弃ruby 中频繁变更的 win32api,而使用 .net 的 p/invoke,你可以放弃无人维护的 fireruby,而简单用 .net firebird provider 为自己添加 firebird 的 activerecord 支持而不用再担心找不到数据库的 activerecord 支持。

3. 为 .Net 带来 Rails,基于 Ironruby 0.9.2 你只需要对 rails 2.3.4 做一些小小的修改,就可以在 CLR/DLR 上运行最新的Rails,同时使用 Ironruby 也可以为.Net 的 MVC 框架带了许多新的变化,这些在后面会详述。

>>> 阅读全文

 

, , , , , , ,