<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Arduino中国 &#187; Blogroll</title>
	<atom:link href="http://blog.flamingoeda.com/category/blogroll/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.flamingoeda.com</link>
	<description>Flamingo EDA</description>
	<lastBuildDate>Sat, 13 Aug 2011 11:41:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Rails应用的中文化</title>
		<link>http://blog.flamingoeda.com/2007/03/14/rails%e5%ba%94%e7%94%a8%e7%9a%84%e4%b8%ad%e6%96%87%e5%8c%96/</link>
		<comments>http://blog.flamingoeda.com/2007/03/14/rails%e5%ba%94%e7%94%a8%e7%9a%84%e4%b8%ad%e6%96%87%e5%8c%96/#comments</comments>
		<pubDate>Wed, 14 Mar 2007 13:25:03 +0000</pubDate>
		<dc:creator>developer</dc:creator>
				<category><![CDATA[Blogroll]]></category>
		<category><![CDATA[RoR]]></category>

		<guid isPermaLink="false">http://blog.booksforce.com/2007/03/14/rails%e5%ba%94%e7%94%a8%e7%9a%84%e4%b8%ad%e6%96%87%e5%8c%96/</guid>
		<description><![CDATA[在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"] = [...]]]></description>
			<content:encoded><![CDATA[<p>在RoR中可以借助gettext来实现应用的本地化（localization），首先确保系统已经安装了<a href="http://www.gnu.org/software/gettext/">gettext</a>（这里使用的是0.16.1版本），然后通过gem安装Ruby-GetText 1.8.0版本：<br />
<code><br />
#gem install gettext<br />
</code><br />
修改RoR工程根目录下的Rakefile文件，加入updatepo和makemo两个任务：</p>
<pre>
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
</pre>
<p>其中updatepo任务的作用是从app和lib目录下的*.rb和*.rhtml文件中提取出以_()标记的字符串，而makemo任务的作用则是根据给定的*.po文件来生成*.mo文件，后者是gettext用来进行中文化处理时所需要的资源文件。<br />
修改app/controllers/application.rb，为RoR应用指定其所使用的语言，它必须和所用的的.po文件名相同。</p>
<pre>
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
</pre>
<p>在RoR工程的根目录下创建po/zh目录，然后执行updatepo任务，将应用中所有需要翻译的内容更新到po/i18n_gettext.pot文件中：<br />
<code><br />
# mkdir po/zh -p<br />
# rake updatepo<br />
</code><br />
使用<a href="http://sourceforge.net/projects/poedit/">poEdit</a>打开生成的i18n_gettext.pot文件，将其中相应的字符串进行翻译，然后再存为po/zh/i18n_gettext.po。<br />
最后再执行makemo任务 ，将.po文件变成gettext可以理解的.mo文件：<br />
<code><br />
# rake makemo<br />
</code><br />
运行RoR应用，此时就可以在浏览器里看到翻译后的效果了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flamingoeda.com/2007/03/14/rails%e5%ba%94%e7%94%a8%e7%9a%84%e4%b8%ad%e6%96%87%e5%8c%96/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>用FileColumn实现图片上传</title>
		<link>http://blog.flamingoeda.com/2007/03/11/%e5%9b%be%e7%89%87%e4%b8%8a%e4%bc%a0%e5%92%8c%e7%bc%a9%e7%95%a5%e5%9b%be%e7%9a%84%e5%ae%9e%e7%8e%b0/</link>
		<comments>http://blog.flamingoeda.com/2007/03/11/%e5%9b%be%e7%89%87%e4%b8%8a%e4%bc%a0%e5%92%8c%e7%bc%a9%e7%95%a5%e5%9b%be%e7%9a%84%e5%ae%9e%e7%8e%b0/#comments</comments>
		<pubDate>Sun, 11 Mar 2007 15:34:45 +0000</pubDate>
		<dc:creator>developer</dc:creator>
				<category><![CDATA[Blogroll]]></category>
		<category><![CDATA[RoR]]></category>

		<guid isPermaLink="false">http://blog.booksforce.com/2007/03/11/%e5%9b%be%e7%89%87%e4%b8%8a%e4%bc%a0%e5%92%8c%e7%bc%a9%e7%95%a5%e5%9b%be%e7%9a%84%e5%ae%9e%e7%8e%b0/</guid>
		<description><![CDATA[在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 &#60; ActiveRecord::Base file_column :image, :web_root =&#62; "upload/", :root_path =&#62; File.join(RAILS_ROOT, "public", "upload") end 在与之对应的数据库表books中，要添加名为image的项，相应的MySQL语句为： DROP TABLE IF EXISTS `books`; CREATE [...]]]></description>
			<content:encoded><![CDATA[<p>在RoR应用中可以使用<a href="http://www.kanthak.net/opensource/file_column/index.html">FileColumn</a>和<a href="http://rmagick.rubyforge.org">RMagick</a>来实现带有缩略图功能的图片上传功能。<br />
RMagick是对<a href="http://www.imagemagick.org">ImageMagick</a>的Ruby封装，所有我们需要先安装最新版本的ImageMagic，此处用的是6.3.3：<br />
<code><br />
# ./configure --prefix=/path/to/local/root/usr --without-perl<br />
# make<br />
# make install<br />
</code><br />
接下来再通过gem安装RMagick：<br />
<code><br />
# gem install rmagick<br />
</code><br />
安装FileColumn也可以使用引入SVN外部资源的做法，即在RoR工程的根目录下执行下面的命令：<br />
<code><br />
# svn propset svn:externals "file_column http://opensvn.csie.org/rails_file_column/plugins/file_column/tags/rel_0-3-1/" vendor/plugins<br />
# svn update<br />
</code><br />
假设我们的应用中有一个名为Book的对象，用户可以为每个Book对象上传一张图片。首先用scaffold创建相应的框架：<br />
<code><br />
# ./script/generate scaffold Admin::Book</code><br />
然后在app/models/book.rb中为模型对象加上file_column属性：<br />
<code><br />
class Book &lt; ActiveRecord::Base<br />
file_column :image, :web_root =&gt; "upload/", :root_path =&gt; File.join(RAILS_ROOT, "public", "upload")<br />
end<br />
</code><br />
在与之对应的数据库表books中，要添加名为image的项，相应的MySQL语句为：<br />
<code><br />
DROP TABLE IF EXISTS `books`;<br />
CREATE TABLE `books` (<br />
`id` int NOT NULL auto_increment,<br />
`title` varchar(255) NOT NULL default '',<br />
`author` varchar(100) NOT NULL default '',<br />
`publisher` varchar(100) NOT NULL default '',<br />
`isbn` varchar(32) NOT NULL default '',<br />
`description` varchar(255) default NULL,<br />
`image` varchar(200) default NULL,<br />
PRIMARY KEY  (`id`)<br />
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;</code><br />
接着再在app/views/admin/books/_form.rhtml中用file_column_field为表单添加相应的项。<br />
<code><br />
&lt;label for="book_image"%&amp;gtImage&lt;/label%&gt;<br />
&lt;%= file_column_field 'book', 'public'  %&gt;<br />
</code><br />
在创建表单的app/views/admin/books/new.rhtml中，要为其设置multipart属性：<br />
<code><br />
&lt;%= start_form_tag({:action =&gt; 'create'}, :multipart =&gt; true) %&gt;<br />
</code><br />
需要注意的是，下面这种写法是不可以的：<br />
<code><br />
&lt;%= start_form_tag :action =&gt; 'create', multipart =&gt; true %&gt;<br />
</code><br />
在需要显示图片的位置，如app/views/admin/books/show.rhtml里，只要加上如下的语句就可以了，其余的事情都交由FileColumn插件来完成：<br />
<code><br />
&lt;%= image_tag( url_for_file_column("book", "image") ) %&gt;<br />
</code><br />
实际使用的时候发现用FileColumn上传的图片其读写属性都是0600，这样启动HTTP服务的用户可能就无法访问该文件，最简单的解决办法是修改vendor/plugins/file-column/lib/file_column.rb中TempUploadedFile类的store_upload方法，在调用FileUtils.mv方法移动文件之前将其属性修改为0644：<br />
<code><br />
FileUtils.chmod 0644, local_file_path<br />
</code><br />
这也许不是最好的办法，比如考虑是否可以在environment.rb中用alias_method的办法重写相应的store_upload方法，类似于<a href="http://textsnippets.com/posts/show/666">该文</a>所采用的办法。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flamingoeda.com/2007/03/11/%e5%9b%be%e7%89%87%e4%b8%8a%e4%bc%a0%e5%92%8c%e7%bc%a9%e7%95%a5%e5%9b%be%e7%9a%84%e5%ae%9e%e7%8e%b0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用engines和login_engine实现用户登录</title>
		<link>http://blog.flamingoeda.com/2007/03/11/%e7%94%a8engines%e5%92%8clogin_engine%e7%ae%80%e5%8c%96%e7%99%bb%e5%bd%95/</link>
		<comments>http://blog.flamingoeda.com/2007/03/11/%e7%94%a8engines%e5%92%8clogin_engine%e7%ae%80%e5%8c%96%e7%99%bb%e5%bd%95/#comments</comments>
		<pubDate>Sun, 11 Mar 2007 05:48:27 +0000</pubDate>
		<dc:creator>developer</dc:creator>
				<category><![CDATA[Blogroll]]></category>
		<category><![CDATA[RoR]]></category>

		<guid isPermaLink="false">http://blog.booksforce.com/?p=3</guid>
		<description><![CDATA[目前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 &#60; ActionController::Base include [...]]]></description>
			<content:encoded><![CDATA[<p>目前RoR的最新版本是1.2.2，但engines和login_engine对其该版本的支持似乎还有些问题，booksforce.com在实际开发时使用的是engines 1.1.4和login_engine 1.0.4，而相应的RoR版本则为1.1.6：<br />
<code><br />
# gem install rails -v 1.1.6 --include-dependencies<br />
</code><br />
接下来创建RoR工程：<br />
<code><br />
# rails booksforce<br />
</code><br />
engines和login_enginej是以RoR插件形式存在的，做为RoR工程外部引入的资源，最好的办法是借助SVN管理外部资源的办法。只需要在工程的根目录下依次执行下述命令即可：<br />
<code><br />
# svn propset svn:externals "engines http://svn.rails-engines.org/engines/tags/rel_1.1.4" vendor/plugins<br />
# svn propset svn:externals "login_engine http://svn.rails-engines.org/login_engine/tags/rel_1.0.4/" vendor/plugins<br />
</code><br />
在RoR工程的根目录下执行update命令下载相应的插件：<br />
<code><br />
# svn update<br />
</code><br />
在config/database.yml文件中设置好数据库参数之后，将LoginEngine的配置和启动代码加入到config/environment.rb文件中：<br />
<code><br />
module LoginEngine<br />
config :salt, "your-passwd-salt"<br />
config :user_table, "users"<br />
config :use_email_notification, false<br />
end</code></p>
<p>Engines.start :login</p>
<p>参数use_email_notification表示不启动自动邮件提示的功能，我们可以今后需要的时候再配置该功能。<br />
接下去修改app/controllers/application.rb文件，通过before_filter来过滤未经授权的用户请求：<br />
<code><br />
class ApplicationController &lt; ActionController::Base<br />
include LoginEngine<br />
helper :user<br />
model :user</code></p>
<p>before_filter :login_required<br />
end</p>
<p>现在可以在数据库中创建login_engine所需要的用户表（users）了，相应的MySQL 语句为：<br />
<code>DROP TABLE IF EXISTS `users`;<br />
CREATE TABLE `users` (<br />
`id` int(11) NOT NULL auto_increment,<br />
`login` varchar(80) NOT NULL default '',<br />
`salted_password` varchar(40) NOT NULL default '',<br />
`email` varchar(60) NOT NULL default '',<br />
`firstname` varchar(40) default NULL,<br />
`lastname` varchar(40) default NULL,<br />
`salt` varchar(40) NOT NULL default '',<br />
`verified` int(11) default '0',<br />
`role` varchar(40) default NULL,<br />
`security_token` varchar(40) default NULL,<br />
`token_expiry` datetime default NULL,<br />
`created_at` datetime default NULL,<br />
`updated_at` datetime default NULL,<br />
`logged_in_at` datetime default NULL,<br />
`deleted` int(11) default '0',<br />
`delete_after` datetime default NULL,<br />
PRIMARY KEY  (`id`)<br />
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;<br />
</code><br />
最后，不要忘了在RoR工程根目录下执行rake db:migrate:engines命令，完成数据库的迁移，在这个过程中login_engine会在数据库中创建password_history表。<br />
<code><br />
# rake db:migrate:engines ENGINE=login<br />
</code><br />
RoR工程启动之后，可以通过/user/login来验证用户登录功能是否正常，就这么简单:-)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flamingoeda.com/2007/03/11/%e7%94%a8engines%e5%92%8clogin_engine%e7%ae%80%e5%8c%96%e7%99%bb%e5%bd%95/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

