Electronic Joint Business

Solution for E-Business

Ruby

用 PostgreSQL Schemas 创建多租户 Rails 应用

许多 Rails 应用有多租户的需求。为此可以采取多种不同的策略,而每种策略都各有利弊。Guy Naor 曾对每一策略的利弊都进行了详细论述,具体可以参考他的 2009 Acts As Conference talk(必看)。1

这些多租户策略之一运用了 Postgresql 特有的称为 “Schemas” 的特性。不过 Guy 只是在技术层面泛泛带过,并未深入到实现细节。要如何运用这一策略来实际完成多租户应用,你可以从网上搜到几篇博客、StackOverflow 的讨论以及一些半成品,但诸多细节还要自己推敲,这里我将之记录下来,以飨读者。

为什么使用 PostgreSQL Schemas
Guy 列举了多租户 Rails 应用的三种基本策略:2

  • 每个租户使用独立数据库
  • 单一数据库,用记录维护着租户关系的范围
  • 单一数据库,每个租户使用不同的 Schemas (只适用 PostgreSQL)

选择哪一种策略需要诸多考量,这里不一一列举,我想说的是,对于第 3 种策略,应用应有以下特征:

  • 租户的数据是私有的,不能泄露给其他租户
  • 几乎不进行跨租户数据聚合的查询
  • 租户数量很多,无法承担过高管理开销

由于应用间存在千差万别,所以个人建议你最好认真看完该演讲,然后自己阿里做决定。如果你最终还是选择了 PostgreSQL Schema ,你再回来继续读完这篇文章。

>>> 阅读全文

 

, , ,

初识 Sinatra (四)

文章评价:

这是本系列文章的最后一部分。本教程的目标是带领从未用过 Sinatra 的用户从头开始创建一个应用,并将之最后发布。

到前三部分结束时,我们已经完成了 To Do List 应用的大部分功能。在本系列的最后一部分,我们将先看看如何用 Sass 来编写 CSS ,之后将本应用发布到 Heroku 云服务上。

Logo
每个上点档次的应用都应有一个 logo,所以我创建了一个简单的“tick” logo,你可以在 Github 上找到。我们用它来作为本应用的头条的背景图片。打开 Styles.css 并添加下列 CSS:

h1.logo{
  font-family: helvetica,arial,sans-serif;
  font-size: 24px;
  color: white;
  padding: 64px 0 0;
  margin: 0 auto;
  text-transform: uppercase;
  text-align: center;
  font-weight: normal;
  letter-spacing: 0.3em;
  background: transparent url(/logo.png) 50% 0 no-repeat;
  }

(注意 – 也许你还发现,你需要为 layout.slim 的 h1 元素添加一个 ‘logo’ 类,这段 CSS 才会起作用。)

>>> 阅读全文

 

, , , , , , , ,

SASS 使用介绍

简单地说: Sass 就是程序化的 CSS。 Sass (即 Syntactically Awesome StyleSheets 的缩写,意思是“相当迷人的样式表”) 是一种动态样式语言,它受到 Haml 的简洁精炼的语法的启发,提供了 变量、操作、嵌套选择器(selector)和 Mixin 等等功能来增强样式表,因此和单纯使用 CSS 语法相比,Sass 更容易编写,也更容易阅读。现在 Sass 是 Ruby 上的 Haml 插件的组件之一,我们可以用 Haml 来处理 HTML 标记,而用 Sass 来处理 CSS 标记。 其作者是这样介绍 Sass 的优点的:

“ Sass 是 CSS 之上的一种元语言 (meta-language),用于简洁、结构化地描述文档的样式,和普通 CSS 相比功能更强大。Sass 提供的更简洁、更优雅的 CSS 语法,同时还实现了许多特性,可以帮助创建更易于管理的样式表。”

Sass 的发展有两种语法规则( syntaxes )。。原先 Sass 采用了 Haml 的缩排语法,没有括号,分号,它使用行缩进的方式来指定 CSS 块,这对于习惯了 CSS 语法的页面设计师来说很不习惯,同时也不能兼容既有的 CSS,因此 Sass 3 就演变成了 Scss (Sassy CSS),它是 CSS3 语法的的拓展升级,摒弃了原来的缩进语法,而采用了 CSS 设计师的惯用的花括号 {}。 Scss 100% 兼容了CSS3, 因此在一个有效的 CSS3 文件同时可以被 Scss 所识别。除此之外,它还支持我们能够找到的所有扩展,甚至包括一些非标准语法,例如微软的 expression() 函数和 filter 属性。

为了加以区别, 使用缩进语法的文件以 .sass 为扩展名,而采用 Scss 语法的文件则以 .scss 作为扩展名

参考:
http://sass-lang.com/tutorial.html

 

, , ,

Rails3 技术手册 (一) 概述

英文原文
Ruby on Rails 是用于快速简洁地开发 Web 应用框架。它被 37signal 公司的项目管理工具 Basecamp 中剥离出来,其作者 David Heinemeier Hansson 率先用 Rails 着手解决手边的现实问题。 我们会发现用 Rails 进行开发时充满乐趣, Rails 负担起了开发中那些无聊的琐事,因此开发者能专注于所要解决的问题本身。

你如果不理解这些开发中的琐事,可以看一下下面的例子:编写过 Web 应用的开发者都不可避免地会用到字典结构、缓存、数据持久化、模板系统、测试框架、路由等等组件。Rails 自身就带了这堆让应用上线运行所必需的组件,而且作者在编写它们时充分考虑了彼此的适配问题。以往希望模板语言能和复杂的 ORM 层能在一起工作的麻烦现在再也没有了。一切将是如此简单。

现在开发者无需再为数据库等的组件编写大量繁琐的 XML 配置。Rails 基于约定而非配置,配置因而精简到最少。假如 Animal 类就是关联到数据库的 animals 数据表,为什么还要让开发者花时间写配置文件来链接它们? 这一切就让 Rails 来帮你吧。

简而言之,Rails 让 Web 开发充满乐趣。

架构
Rails 应用开发是基于模型-视图-控制器模式的 (MVC) 的。想了解 Rails 是如何使用 MVC 的, 最简单的办法是透过了解 Rails 请求的生命周期。如图1-1所示:

>>> 阅读全文

 

, , , , , , ,

初识 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 并显示了几个页面。现在是真正有趣的部分,在本节中,我们将演示如何用数据库来保存任务。

这里我们会使用 SQLite 作为本地数据库,正如它的名字说表述的,这是一个轻量级的文件数据库,无需任何配置。如果你没有安装过这个数据库,可以参考本页的一些简单介绍。

为了和数据库交互,我们会使用 DataMapper。这个 ORM 的工作方式和 Active Record 类似,但在方法和语法上略有不同。

为了配合 SQLite 使用 DataMapper,下面的 Gem包需要被安装:

gem install data_mapper dm-sqlite-adapter sqlite3

我们需在 main.rb 文件的头部添加 DataMapper的请求:

>>> 阅读全文

 

, , , , ,

初识 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 任务,你可以自己动手测试来查看结果。

>>> 阅读全文

 

, , ,

利用MKMF编写Ruby扩展

文章评价:
MKMF 可以帮你自动成 Ruby 扩展库的 Makefile,这样生成的.so或.dll链接库,可以直接在 ruby 程序中被引用,鉴于 Ruby 的 Win32API 写得极其糟糕,强烈建议在需要与 Windows API 打交道的时候,直接放弃 Ruby 的 Win32API,而采用 MKMF 来扩展 ruby。

这里,我会着重谈 Windows 平台,因为 Windows 平台提供了大量的 SDK 和详细的文档,可以很快地为 Ruby 扩展出丰富的功能。

MKMF 通常以一个名为extconf.rb的ruby脚本开始,运行该脚本会自动生成编译所需的 Makefile. 简单的看一下extconf.rb的内容,十分简单明了

require ‘mkmf’
# Give it a name
extension_name = ‘bootextract’
# The destination
dir_config(extension_name)
dir_config(extension_name,‘C:/work/Include’,‘C:/work/lib’)
# Do the work
create_makefile(extension_name)

这里着重说一下

dir_config(extension_name,‘C:/work/Include’,‘C:/work/lib’)

第二个参数用来添加编译所需include路径,第三个则是 library 的路径。MKMF 编写的 makefile,不能接受路径中有空格,建议和例子一样,将所需的SDK的头文件和库文件拷贝到不带空格的路径中。

>>> 阅读全文

 

, ,

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 框架带了许多新的变化,这些在后面会详述。

>>> 阅读全文

 

, , , , , , ,