CAT | RoR
DS18B20是DALLAS公司推出的单线数字温度传感器,测量温度范围为 -55°C~+125°C,在-10~+85°C范围内的精度为±0.5°C,由于其优越的性价比,因此在实际项目中被大量采用。同基于热敏电阻的温度传感器不同,使用数字温度传感器避免了复杂的换算,可以直接从传感中读出温度的数值。
由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,这对硬件上并不支持单总线协议的单片机来讲可是一个不小的麻烦,因为只能采用软件的方法来模拟单总线的协议时序,从而完成对DS18B20芯片的访问。听起来有点复杂,好在Arduino上已经有了相应的实现,并封装好了相应的库来让我们直接读出DS18B20的数据。
我们提供了DS18B20的电子积木模块,以方便在Arduino上的使用:

连接上依然使用的是通用传感器连接线和Arduino专用传感器扩展板V4,此处我们将数字温度传感器连接到了数字I/O第12号引脚上了:

硬件准备好之后,首先从作者网站下载最新的软件包(或者下载我们使用的这个版本),并将其解压缩到Arduino安装目录下的hardware\libraries目录下:
重新启动Arduino之后,就可以在代码中使用这一为DS18B20量身打造的库了,下面是我测试时所使用的代码:
#include <DallasTemperature.h> DallasTemperature tempSensor; void setup(void) { Serial.begin(9600); tempSensor.begin(12); // DS18B20接在数字I/O第12号引脚上 } void loop(void) { // 检查温度传感器是否正常工作 switch(tempSensor.isValid()) { case 1: Serial.println("Invalid CRC"); tempSensor.reset(); // 重置温度传感器 return; case 2: Serial.println("Not a valid device"); tempSensor.reset(); // 重置温度传感器 return; } // 从DS18B20读取温度值 Serial.print(tempSensor.getTemperature()); Serial.print("C"); Serial.println(); }
在将代码下载到Arduino中并运行起来之后,打开Arduino的串口监视工具,我们就可以看到从数字温度传感器DS18B20中读出来的温度值了:

在RoR中可以借助gettext来实现应用的本地化(localization),首先确保系统已经安装了gettext(这里使用的是0.16.1版本),然后通过gem安装Ruby-GetText 1.8.0版本:
#gem install gettext
修改RoR工程根目录下的Rakefile文件,加入updatepo和makemo两个任务:
require 'gettext/utils'
desc "Create mo files for L10n"
task :makemo do
GetText.create_mofiles(true, "po", "locale")
end
desc "Update po files"
task :updatepo do
MY_APP_TEXT_DOMAIN = "i18n_gettext"
MY_APP_VERSION = "i18n_gettext 1.0"
GetText.update_pofiles(MY_APP_TEXT_DOMAIN,
Dir.glob("{app,lib}/**/*.{rb,rhtml}"),
MY_APP_VERSION)
end
其中updatepo任务的作用是从app和lib目录下的*.rb和*.rhtml文件中提取出以_()标记的字符串,而makemo任务的作用则是根据给定的*.po文件来生成*.mo文件,后者是gettext用来进行中文化处理时所需要的资源文件。
修改app/controllers/application.rb,为RoR应用指定其所使用的语言,它必须和所用的的.po文件名相同。
require 'gettext/rails'
class ApplicationController < ActionController::Base
init_gettext "i18n_gettext"
include LoginEngine
def cookie_lang(lang)
cookies["lang"] = lang
end
before_filter { |controller|
controller.cookie_lang("zh")
}
end
在RoR工程的根目录下创建po/zh目录,然后执行updatepo任务,将应用中所有需要翻译的内容更新到po/i18n_gettext.pot文件中:
# mkdir po/zh -p
# rake updatepo
使用poEdit打开生成的i18n_gettext.pot文件,将其中相应的字符串进行翻译,然后再存为po/zh/i18n_gettext.po。
最后再执行makemo任务 ,将.po文件变成gettext可以理解的.mo文件:
# rake makemo
运行RoR应用,此时就可以在浏览器里看到翻译后的效果了。
No tags
在RoR应用中可以使用FileColumn和RMagick来实现带有缩略图功能的图片上传功能。
RMagick是对ImageMagick的Ruby封装,所有我们需要先安装最新版本的ImageMagic,此处用的是6.3.3:
# ./configure --prefix=/path/to/local/root/usr --without-perl
# make
# make install
接下来再通过gem安装RMagick:
# gem install rmagick
安装FileColumn也可以使用引入SVN外部资源的做法,即在RoR工程的根目录下执行下面的命令:
# svn propset svn:externals "file_column http://opensvn.csie.org/rails_file_column/plugins/file_column/tags/rel_0-3-1/" vendor/plugins
# svn update
假设我们的应用中有一个名为Book的对象,用户可以为每个Book对象上传一张图片。首先用scaffold创建相应的框架:
# ./script/generate scaffold Admin::Book
然后在app/models/book.rb中为模型对象加上file_column属性:
class Book < ActiveRecord::Base
file_column :image, :web_root => "upload/", :root_path => File.join(RAILS_ROOT, "public", "upload")
end
在与之对应的数据库表books中,要添加名为image的项,相应的MySQL语句为:
DROP TABLE IF EXISTS `books`;
CREATE TABLE `books` (
`id` int NOT NULL auto_increment,
`title` varchar(255) NOT NULL default '',
`author` varchar(100) NOT NULL default '',
`publisher` varchar(100) NOT NULL default '',
`isbn` varchar(32) NOT NULL default '',
`description` varchar(255) default NULL,
`image` varchar(200) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
接着再在app/views/admin/books/_form.rhtml中用file_column_field为表单添加相应的项。
<label for="book_image"%>Image</label%>
<%= file_column_field 'book', 'public' %>
在创建表单的app/views/admin/books/new.rhtml中,要为其设置multipart属性:
<%= start_form_tag({:action => 'create'}, :multipart => true) %>
需要注意的是,下面这种写法是不可以的:
<%= start_form_tag :action => 'create', multipart => true %>
在需要显示图片的位置,如app/views/admin/books/show.rhtml里,只要加上如下的语句就可以了,其余的事情都交由FileColumn插件来完成:
<%= image_tag( url_for_file_column("book", "image") ) %>
实际使用的时候发现用FileColumn上传的图片其读写属性都是0600,这样启动HTTP服务的用户可能就无法访问该文件,最简单的解决办法是修改vendor/plugins/file-column/lib/file_column.rb中TempUploadedFile类的store_upload方法,在调用FileUtils.mv方法移动文件之前将其属性修改为0644:
FileUtils.chmod 0644, local_file_path
这也许不是最好的办法,比如考虑是否可以在environment.rb中用alias_method的办法重写相应的store_upload方法,类似于该文所采用的办法。
No tags
目前RoR的最新版本是1.2.2,但engines和login_engine对其该版本的支持似乎还有些问题,booksforce.com在实际开发时使用的是engines 1.1.4和login_engine 1.0.4,而相应的RoR版本则为1.1.6:
# gem install rails -v 1.1.6 --include-dependencies
接下来创建RoR工程:
# rails booksforce
engines和login_enginej是以RoR插件形式存在的,做为RoR工程外部引入的资源,最好的办法是借助SVN管理外部资源的办法。只需要在工程的根目录下依次执行下述命令即可:
# svn propset svn:externals "engines http://svn.rails-engines.org/engines/tags/rel_1.1.4" vendor/plugins
# svn propset svn:externals "login_engine http://svn.rails-engines.org/login_engine/tags/rel_1.0.4/" vendor/plugins
在RoR工程的根目录下执行update命令下载相应的插件:
# svn update
在config/database.yml文件中设置好数据库参数之后,将LoginEngine的配置和启动代码加入到config/environment.rb文件中:
module LoginEngine
config :salt, "your-passwd-salt"
config :user_table, "users"
config :use_email_notification, false
end
Engines.start :login
参数use_email_notification表示不启动自动邮件提示的功能,我们可以今后需要的时候再配置该功能。
接下去修改app/controllers/application.rb文件,通过before_filter来过滤未经授权的用户请求:
class ApplicationController < ActionController::Base
include LoginEngine
helper :user
model :user
before_filter :login_required
end
现在可以在数据库中创建login_engine所需要的用户表(users)了,相应的MySQL 语句为:
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` int(11) NOT NULL auto_increment,
`login` varchar(80) NOT NULL default '',
`salted_password` varchar(40) NOT NULL default '',
`email` varchar(60) NOT NULL default '',
`firstname` varchar(40) default NULL,
`lastname` varchar(40) default NULL,
`salt` varchar(40) NOT NULL default '',
`verified` int(11) default '0',
`role` varchar(40) default NULL,
`security_token` varchar(40) default NULL,
`token_expiry` datetime default NULL,
`created_at` datetime default NULL,
`updated_at` datetime default NULL,
`logged_in_at` datetime default NULL,
`deleted` int(11) default '0',
`delete_after` datetime default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
最后,不要忘了在RoR工程根目录下执行rake db:migrate:engines命令,完成数据库的迁移,在这个过程中login_engine会在数据库中创建password_history表。
# rake db:migrate:engines ENGINE=login
RoR工程启动之后,可以通过/user/login来验证用户登录功能是否正常,就这么简单:-)
No tags

