`
rubynroll
  • 浏览: 205118 次
  • 性别: Icon_minigender_1
  • 来自: Wgt
社区版块
存档分类
最新评论

Ruby/Rails: 不一样的'Web'应用

阅读更多
我不是Web程序员,也从来未开发过用户超过10个人的'web'项目:-),但这并不意味着web技术对我无用,正相反,我开发过许多和web技术有关的程序和库,web架构和思想对我的设计和开发有着很大的帮助。

例如我经常碰到要设计通讯协议以适应不可靠的传输,web的无状态特性正是克服不可靠传输的法宝,屡试不爽:-)

最近一段时间用ruby作了不少东西,也有用rails,但是从来没有对rails内部进行深究.直到最近碰到一个项目,促使我不得不到rails里面去挖掘,以借鉴rails一些优秀的东西。

这个项目非常有趣,是一套用于农场的自动化系统(所以使用者大多是奶牛,哈哈~),包含用于工人们佩戴的移动W设备,到处安装的RFID数据收集设备,闸门控制设备,电子称,显示屏....还有许多名目繁多的设备,这些设备的数据有的通过电缆,有的通过ZigBee无线网络汇集到一台服务器上,这台服务器跑Linux,运行Rails。服务器负责收集所有设备的数据,和发送指令给相关设备,例如控制闸门。

给我不断带来麻烦的是这个W设备。

W设备是这个系统里面除服务器外唯一和人打交道的设备,配有RFID数据收集器,一个小液晶显示屏,数个按钮,通过ZigBee无线网络和服务器通讯---典型的嵌入式移动设备。

客户起初对W设备的操作功能要求不高而对成本敏感,因此W设备配置了很低的硬件资源,基本上就是靠一个集成了无线功能的MCU操作,仅数十k的内存,但对于简单的数据收集和传输,绰绰有余。

然而好景不长,随着项目进行,客户对W设备赋予了更多更重要的角色,功能需求暴涨,且快速变化,更重要的是,要求日后能够定制功能(二次开发)。

Mission Impossible ? 不,这正是一个典型B/S架构的系统最适合做的事情了。当然普通web浏览器无法在W的数十k内存上跑,HTTP/HTML也无法有效的在ZigBee网络上传输,因此我们就新设计了一套通讯协议和标记语言,姑且称之为MML(Mini Markup Language)。

那么服务器端呢?已经有rails在跑用于收集/展示数据,输出报表之类的任务,可以利用rails来作为W的服务端么?

通讯问题,改改Webric,从串口(连接到ZigBee网络控制器)上获取数据并伪装成web请求,或许还可以...路由问题,由于ZigBee带宽极其有限,需要高度精简传输内容,因此传回来的请求串中包含的是非常简短的内容,需要转换到对应的Controller/Action,这个通过添加router映射似乎也可行。MML Render问题就比较头痛了,需要修改的地方不少。

考虑到修改rails可能工作量和分险比较高,于是采用另外一个方案:设计新的W Server,在W Server里面直接利用rails的资源。实际上,最终这个W Server直接放在rails应用程序的scripte目录下(也许vendor目录更合适),在W server里面只要加入:
require File.dirname(__FILE__) + '/../config/boot'

然后就可以使用rails提供的任何资源了,当然对于W Server来说,最有用的是Models。这样W Server就和rails应用程序浑然一体了。

W Server有了rails这样强大的后盾之后,还需要有:Parser, Router,Server,Controller,和MML render.

Parser: 负责解析自定义的通讯协议,获取从W设备传来的请求,并解析参数等。
Router: 扫描并装载Controllers,缓存Controller对象,根据Parser的结果取得相应Controller的对象。Router还负责监控Controller是否已被修改和重新装载Controller.
Server: 总控制,从串口中读取数据,调用Parser解析,把结果传给Router,从Router中获取Controler对象并根据Parser结果调用Controller.Action,以及缓存Controller的输出等等。
Controller: 业务逻辑都在这里实现,调用rails的Models访问数据库。
MML Render: 使用erb作为模板文件,再加上一些辅助的功能,例如render link,menu之类的,和自定义的MML特性密切相关。MML Render作为module最终mixin到Controller里面。

可以看出,W Server模型几乎和rails的一样,在设计W Server碰到问题时经常探究在rails中是怎么解决的,因此倒是对rails的了解增进了不少。当然由于W Server的工作方式,目标和rails不同,因此复杂度就不可同日而语.

这个项目做完之后,我有几个感受:
* Ruby的开发效率真的很高
  除去注释,full stack的W Server的全部代码少于千行,what a surprise!当然,这里沾了rails的光,省却了Models,还有erb拿来就用.然而相比之下,在W上光MML解析和Render部分C代码就超过2000行.

* 复用Rails真的很容易
  在这个案例中,就是增加一行代码而已.

* Web技术,可以无处不在
Ruby/Rails = Make it real!


~文以共勉~
分享到:
评论
13 楼 Readonly 2008-09-04  
文章中提到的Router, Server, Controller, MML Render都和rails有密切关系
其实你就是在这些所有地方把rails换成ASM可以么?全国人民看也成。
12 楼 ray_linn 2008-09-04  
Readonly 写道
ray大叔又来掺和技术贴了?而且还回帖不认真看帖
文中提到的W Client和你的RIFI控制台有任何共同点么?它上面如果能运行Ruby GUI,rubynroll也不需要文章中的这种做法了。


你也不认真看帖。

Parser: 负责解析自定义的通讯协议,获取从W设备传来的请求,并解析参数等。
Router: 扫描并装载Controllers,缓存Controller对象,根据Parser的结果取得相应Controller的对象。Router还负责监控Controller是否已被修改和重新装载Controller.
Server: 总控制,从串口中读取数据,调用Parser解析,把结果传给Router,从Router中获取Controler对象并根据Parser结果调用Controller.Action,以及缓存Controller的输出等等。
------------------------------------------------------------------------------------
Controller: 业务逻辑都在这里实现,调用rails的Models访问数据库。
-------------------------------------------------------------------------------------
MML Render: 使用erb作为模板文件,再加上一些辅助的功能,例如render link,menu之类的,和自定义的MML特性密切相关。MML Render作为module最终mixin到Controller里面。


俺就是觉得,这里rails的作用完全是辅助性的,而不是特别必要的的东西,我在这里把rails换成sms可以么?我看也成。
11 楼 Readonly 2008-09-04  
ray大叔又来掺和技术贴了?而且还回帖不认真看帖
文中提到的W Client和你的RIFI控制台有任何共同点么?它上面如果能运行Ruby GUI,rubynroll也不需要文章中的这种做法了。
10 楼 ray_linn 2008-09-04  
我们公司也用RIFI,每一个托盘上都有,用的是MFC。
看不出这个项目有什么必要用Web,rails不过是画蛇添出足的那只脚。真需要用ruby,直接用ruby GUI来控制不是更方便快捷么?

我们公司的RIFI 控制台上,可以看到公司的布局以及 所有继电器的安装位置和状态,千万上万个托盘(托盘上的产品),在生产车间的流动--都是realtime.。这种需求对web来说太勉为其难了。
9 楼 rubynroll 2008-09-04  
klesh 写道
应该是"屡试不爽",这里的"爽"是"爽约"的爽,是贬义

已改正,谢谢指正!
8 楼 klesh 2008-09-03  
应该是"屡试不爽",这里的"爽"是"爽约"的爽,是贬义
7 楼 lyl0035 2008-08-15  
强~顶了!
6 楼 My_Choice 2008-08-13  
dazuiba 写道
这种方式利用web mvc framework的确很少见。

看来rails的用武之地也不仅仅在B/S结构中呀!

期待楼主有更多相关的文章!

5 楼 rubynroll 2008-08-12  
<div class='quote_title'>universac 写道</div><div class='quote_div'>楼主

你上面说的parser和server部分,主要读串口获取请求那部分也都是ruby写的吧?</div><br/>是的. 用的是ruby-serialport扩展:
http://ruby-serialport.rubyforge.org/

4 楼 universac 2008-08-05  
楼主

你上面说的parser和server部分,主要读串口获取请求那部分也都是ruby写的吧?
3 楼 hozaka 2008-07-28  
其实我个人觉得 B/S 架构理解成为 User Agent - Server 比较合适一点。
可惜由于一直没有接触过其他的嵌入式设备,所以也没有如同楼主这样的开发经验了,不得不说是一种遗憾
2 楼 dazuiba 2008-07-27  
这种方式利用web mvc framework的确很少见。

看来rails的用武之地也不仅仅在B/S结构中呀!

期待楼主有更多相关的文章!
1 楼 liuming 2008-07-27  
不错啊。楼主是不是在国外的

相关推荐

    ruby on rails 101

    引用自Nathan Torkington的话:“使用Ruby on Rails就像观看功夫电影一样,看似弱小的新手框架却能够用各种创造性的方式打败众多强大的对手。”这句话生动地描述了Ruby on Rails的独特之处以及它在Web开发领域的影响...

    ruby on rails api

    Ruby on Rails(简称Rails)是一种基于Ruby编程语言的开源Web应用程序框架,专为敏捷开发而设计,强调简洁的代码和“约定优于配置”的原则。它主要用于构建数据驱动的Web应用,借助于MVC(Model-View-Controller)...

    Web开发敏捷之道-应用Rails进行敏捷Web开发(第3版).pdf

    《Web开发敏捷之道:应用Rails进行敏捷Web开发(第3版)》:Ruby on Rails是一个全套的MVC web框架,它能帮你开发高质量又美观的web应用,而且开发速度快得出乎你想象。你只须集中精力于应用程序本身,Rails就会帮你...

    ruby on rails 2.1 what is new (CN)

    自2004年David Heinemeier Hansson从其项目Basecamp中提取并发布了Ruby on Rails框架以来,这一框架已经成为Web开发领域的重要组成部分。经过多年的迭代和发展,Ruby on Rails 2.0于2007年12月发布,带来了许多重要...

    Pro Active Record. Databases with Ruby and Rails

    - **历史背景**:虽然Active Record的概念并不是Rails所独创,但Rails是第一个将其广泛推广并使其成为Web开发标准的框架之一。 - **优点**:简化了数据库查询操作,提高了代码的可读性和可维护性;同时,它还支持...

    php-rails:不完整和未维护。 Ruby on Rails框架PHP端口

    Ruby on Rails(简称Rails)是一个深受开发者喜爱的Web应用程序框架,它以其“约定优于配置”、“DRY(Don't Repeat Yourself)”和“模型-视图-控制器(MVC)”的设计模式而闻名。然而,对于那些习惯于PHP语言的...

    tracks:Tracks是一个GTD:trade_mark:Web应用程序,使用Ruby on Rails构建

    曲目:使用Ruby on Rails构建的GTD:trade_mark:兼容Web应用程序 关于 项目主页: : 手册: : 来源GitHub: : 托管服务: : 错误报告和功能请求: : 邮件列表: : IRC频道:Freenode上的#tracks,也可在 ...

    Watir的介绍文档:基于RUBY的web UI自动化测试库

    Ruby是一种功能丰富的面向对象脚本语言,因Ruby on Rails(RoR)Web应用框架而广受欢迎。Ruby是解释型而非编译型语言,由Matz(Yukihiro Matsumoto)于1994年创建,用C语言编写,可以在任何拥有C编译器的平台上运行...

    语言后端:Lin-guage应用程序的Ruby on Rails数据库

    Ruby on Rails(简称Rails)是基于Ruby编程语言的开源Web应用框架,专注于简洁、高效的代码,使得开发快速、迭代简单。在"语言后端:Lin-guage应用程序的Ruby on Rails数据库"这一主题中,我们将深入探讨如何使用...

    Ruby-使用Procfile和Systemd像HerokuCLI一样轻松管理生产中的应用程序流程

    在Ruby开发中,高效地管理应用程序流程是至关重要的,特别是在生产环境中。`Procfile` 和 `Systemd` 是两种常用工具,它们可以帮助开发者模仿Heroku CLI的管理模式,确保服务的稳定性和可扩展性。让我们深入了解一下...

    influxdb-rails-源码.rar

    Rails,作为Ruby on Rails框架的核心部分,是开发Web应用的利器。当InfluxDB遇到Rails,便催生了`influxdb-rails`这一优秀的库,它旨在简化在Rails应用中使用InfluxDB的过程。本文将通过对`influxdb-rails`源码的...

    inertia-rails:用于Inertia.js的Rails适配器

    Ruby on Rails 是一个非常流行的全栈Web开发框架,以其约定优于配置的哲学和强大的社区支持而闻名。然而,随着前端技术的发展,许多开发者希望在Rails应用中引入更现代的前端架构。Inertia.js Rails适配器就是为此...

    Ruby-ActionPack的Action缓存在Rails40中从核心移除

    Action Cache是ActionPack的一部分,主要用于提高Web应用的性能,通过缓存Action的输出来避免重复执行相同的数据库查询和计算。然而,在Rails 4.0版本中,Action Cache被从ActionPack的核心中移除,这一变动对开发者...

    Rails recipes

    Ruby on Rails是一种流行的开源Web应用框架,用Ruby语言编写,遵循MVC架构模式。Rails的目的是让开发过程尽可能简洁和高效,因此它内置了许多自动化功能,使得开发者能够迅速地从零开始构建应用程序。Rails Recipes...

    一组超越纯Ruby on Rails架构的良好架构模式。-Ruby开发

    增强的Ruby on Rails体系结构Ruby on Rails是许多人钟爱的出色框架。 但是随着您的应用程序的增长,您很快就会遇到一个问题,将这段代码或那段代码放在哪里。 从某种意义上说,它是Ruby on Rails增强体系结构Ruby on...

    Ruby-Crpe一个轻量级的API框架旨在帮助您编写干净快速web服务在Ruby中

    1. **轻量级**:Crêpe不依赖于大型框架如Rails,而是选择了一个更加精简的基础,只包含构建API所需的基本组件。这使得Crêpe可以在较小的应用场景中运行得更快,占用更少的资源。 2. **基于块的路由**:Crêpe使用...

    ruby学习资料

    Ruby语言的不断发展和优化,加上强大的社区支持和丰富的插件库,让Ruby和Rails成为现代Web开发不可或缺的工具。随着学习和实践的深入,开发者可以更有效地利用Ruby语言的特性来创建高效、可靠的Web应用程序。

    Ruby_RailInstaller.rar

    “Raillinstaller”是RailsInstaller的简写,它是Ruby on Rails开发环境的快捷安装方案,尤其适合不熟悉命令行操作或者希望快速启动开发的新手。 “windows”标签表明这个压缩包是为Windows操作系统设计的。在...

    Ruby Programming

    - **丰富的生态系统**:Ruby拥有强大的框架(如Ruby on Rails),这些框架极大地简化了Web开发过程。 - **跨平台能力**:Ruby可以在多种操作系统上运行,包括Windows、Linux和Mac OS X。 综上所述,《Programming ...

    Python & Ruby 学习

    Python 和 Ruby 都是流行的高级编程语言,广泛应用于Web开发、数据分析、自动化脚本等多个领域。以下是对这两个语言的一些核心知识点的详细说明: **Python** 1. **基础语法**:Python 以其简洁易读的语法著称,如...

Global site tag (gtag.js) - Google Analytics