<?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>里克的自习室</title>
	<atom:link href="http://railser.cn/feed" rel="self" type="application/rss+xml" />
	<link>http://railser.cn</link>
	<description>关注Ruby和Rails的学习与开发</description>
	<lastBuildDate>Tue, 20 Dec 2011 11:47:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>2012，云</title>
		<link>http://railser.cn/blog/2012-cloud</link>
		<comments>http://railser.cn/blog/2012-cloud#comments</comments>
		<pubDate>Tue, 20 Dec 2011 11:47:47 +0000</pubDate>
		<dc:creator>里克</dc:creator>
				<category><![CDATA[others]]></category>
		<category><![CDATA[cloud]]></category>

		<guid isPermaLink="false">http://railser.cn/?p=657</guid>
		<description><![CDATA[最近研究各种云平台，Amazon AWS，盛大云，阿里云。5月份设计的appflying.com，看来可以移到云平台上继续它的2012旅程了。在云上，还有好多想法可以去实施，而且价格也都不贵，看来，2012从云开始吧。]]></description>
			<content:encoded><![CDATA[<p>最近研究各种云平台，Amazon AWS，盛大云，阿里云。5月份设计的appflying.com，看来可以移到云平台上继续它的2012旅程了。在云上，还有好多想法可以去实施，而且价格也都不贵，看来，2012从云开始吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://railser.cn/blog/2012-cloud/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一个带BOM的utf-8文件引来的麻烦</title>
		<link>http://railser.cn/blog/bom-in-utf8-file</link>
		<comments>http://railser.cn/blog/bom-in-utf8-file#comments</comments>
		<pubDate>Thu, 20 Oct 2011 06:41:35 +0000</pubDate>
		<dc:creator>里克</dc:creator>
				<category><![CDATA[others]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://railser.cn/?p=653</guid>
		<description><![CDATA[很多朋友应该碰到过这句话吧：“Cannot modify header information - headers already sent by...(php文件)”。 今天碰到了，起因是用ftp，在windows环境下，使用ftp的编辑功能，在线编辑了一个配置文件。然后就出现了这个提示。 不论是百度还是google，都会给出一堆解决办法，可是，那个最正中要害呢？毕竟我们不是在做学术研究，而且我们碰到的也都是一些常见问题。 好，找到了最关键的一句话： “如果使用utf-8编码，一定要去掉UTF-8中的BOM，这都是因为utf-8编码文件含有的bom原因，而php4,5都是不支持bom的。去掉bom，可以用Notepad++打开转换一下。” 问题解决了。在此笔记一下。 这里有一篇文章讲了一下原理：http://blog.sina.com.cn/s/blog_570f6d940100h3vk.html 简单的说，utf-8不需要BOM，utf-16才需要它。 &#160; &#160; &#160; &#160;]]></description>
			<content:encoded><![CDATA[<p>很多朋友应该碰到过这句话吧：“Cannot modify header information - headers already sent by...(php文件)”。</p>
<p>今天碰到了，起因是用ftp，在windows环境下，使用ftp的编辑功能，在线编辑了一个配置文件。然后就出现了这个提示。</p>
<p>不论是百度还是google，都会给出一堆解决办法，可是，那个最正中要害呢？毕竟我们不是在做学术研究，而且我们碰到的也都是一些常见问题。</p>
<p>好，找到了最关键的一句话：</p>
<p>“如果使用utf-8编码，一定要去掉UTF-8中的BOM，这都是因为utf-8编码文件含有的bom原因，而php4,5都是不支持bom的。去掉bom，可以用Notepad++打开转换一下。”</p>
<p>问题解决了。在此笔记一下。</p>
<p>这里有一篇文章讲了一下原理：<a href="http://blog.sina.com.cn/s/blog_570f6d940100h3vk.html">http://blog.sina.com.cn/s/blog_570f6d940100h3vk.html</a></p>
<p>简单的说，utf-8不需要BOM，utf-16才需要它。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://railser.cn/blog/bom-in-utf8-file/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>令人反感的discuz7.2论坛无提示音解决办法</title>
		<link>http://railser.cn/blog/discuz72-pm_sound</link>
		<comments>http://railser.cn/blog/discuz72-pm_sound#comments</comments>
		<pubDate>Tue, 23 Aug 2011 08:11:11 +0000</pubDate>
		<dc:creator>里克</dc:creator>
				<category><![CDATA[others]]></category>
		<category><![CDATA[discuz]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://railser.cn/?p=648</guid>
		<description><![CDATA[最近的一个网站单子里，需要给客户用discuz7.2实现一个会员功能，dz是大品牌，何况康盛又被腾讯收购，质量应该可靠。所以反复衡量，dz成为首选了。（跟DZ和康盛的系列产品源渊太多了。） 客户提出的问题还算顺利的一一解决，客户最后提出一个要求，要对最新的消息有一个提示。这个实现很简单，给客户讲解了如何设定声音，可是问题来了，我这里怎么都听不到声音，客户那里也是如此。 怎么会这样，开始我以为是我浏览器的问题，但是几个浏览器测试都无声，这个是绝对不应该的。代码是官网下载的discuz7.2 utf8。什么情况？怎么办？ 网上查了一下竟然很多人反馈了这个问题，可是没有几个提出解决办法的，有两篇的解决办法尝试了一下，没有解决问题。难道是我的特例？？ 外包方式开发最可怕的是耽误进度和过多的向客户解释，为客户选择的产品，如果质量不过关，影响的绝对就是制作方的信誉。 现在问题来了，如何解决。 解决办法： 1、先参考官方提供的一个解决办法，仅做参考，因为它也没解决问题。所以我真不知道官方的维护是干什么吃的。 http://www.discuz.net/forum.php?mod=viewthread&#038;tid=1523437&#038;page=7#pid12811924 2、因为mp3,wav等格式均无效，我让合作的美工把声音文件转成了swf，可以在这里下载。 下载论坛提示音swf格式 3、按照上面那篇提示文章，修改一下对应的文件，引用改成swf，并且简化swf的文件引用，因为那个player已经无用了，直接引用swf声音即可。下面是代码，希望能帮助一些朋友。 templates/default/memcp_profile.htm 499行 $('soundplayerlayer').innerHTML = AC_FL_RunContent('id', 'pmsoundplayer', 'name', 'pmsoundplayer', 'width', '0', 'height', '0', 'src', '{$boardurl}images/sound/pm_'+file+'.swf', 'menu', 'false',  'allowScriptAccess', 'sameDomain', 'swLiveConnect', 'true'); } templates/default/pm_checknew.htm 可以不改动，因为在我的方案里它已经没用了，如果有尝试的朋友，可以对应替换这段代码 &#60;script type="text/javascript" reload="1"&#62;$('pmsound').innerHTML = AC_FL_RunContent('id', 'pmsoundplayer', 'name', 'pmsoundplayer', 'width', '0', 'height', '0', 'src', '{$boardurl}images/sound/pm_$pmsound.swf',  'menu', 'false',  'allowScriptAccess', 'sameDomain', 'swLiveConnect', [...]]]></description>
			<content:encoded><![CDATA[<p>最近的一个网站单子里，需要给客户用discuz7.2实现一个会员功能，dz是大品牌，何况康盛又被腾讯收购，质量应该可靠。所以反复衡量，dz成为首选了。（跟DZ和康盛的系列产品源渊太多了。）</p>
<p>客户提出的问题还算顺利的一一解决，客户最后提出一个要求，要对最新的消息有一个提示。这个实现很简单，给客户讲解了如何设定声音，可是问题来了，我这里怎么都听不到声音，客户那里也是如此。</p>
<p>怎么会这样，开始我以为是我浏览器的问题，但是几个浏览器测试都无声，这个是绝对不应该的。代码是官网下载的discuz7.2 utf8。什么情况？怎么办？</p>
<p>网上查了一下竟然很多人反馈了这个问题，可是没有几个提出解决办法的，有两篇的解决办法尝试了一下，没有解决问题。难道是我的特例？？</p>
<p>外包方式开发最可怕的是耽误进度和过多的向客户解释，为客户选择的产品，如果质量不过关，影响的绝对就是制作方的信誉。</p>
<p>现在问题来了，如何解决。</p>
<p>解决办法：</p>
<p>1、先参考官方提供的一个解决办法，仅做参考，因为它也没解决问题。所以我真不知道官方的维护是干什么吃的。</p>
<p>http://www.discuz.net/forum.php?mod=viewthread&tid=1523437&page=7#pid12811924</p>
<p>2、因为mp3,wav等格式均无效，我让合作的美工把声音文件转成了swf，可以在这里下载。</p>
<p><a href="http://railser.cn/wp-content/uploads/pm_sound.zip" target="_blank">下载论坛提示音swf格式</a></p>
<p>3、按照上面那篇提示文章，修改一下对应的文件，引用改成swf，并且简化swf的文件引用，因为那个player已经无用了，直接引用swf声音即可。下面是代码，希望能帮助一些朋友。</p>
<p>templates/default/memcp_profile.htm 499行</p>
<p>$('soundplayerlayer').innerHTML = AC_FL_RunContent('id', 'pmsoundplayer', 'name', 'pmsoundplayer', 'width', '0', 'height', '0', 'src', '{$boardurl}images/sound/pm_'+file+'.swf', 'menu', 'false',  'allowScriptAccess', 'sameDomain', 'swLiveConnect', 'true');							}</p>
<p>templates/default/pm_checknew.htm 可以不改动，因为在我的方案里它已经没用了，如果有尝试的朋友，可以对应替换这段代码</p>
<p>&lt;script type="text/javascript" reload="1"&gt;$('pmsound').innerHTML = AC_FL_RunContent('id', 'pmsoundplayer', 'name', 'pmsoundplayer', 'width', '0', 'height', '0', 'src', '{$boardurl}images/sound/pm_$pmsound.swf',  'menu', 'false',  'allowScriptAccess', 'sameDomain', 'swLiveConnect', 'true');&lt;/script&gt;</p>
<p>两段代码的含义是一样的，都是直接引用swf声音文件。</p>
<p><span style="color: #ff0000;">templates/default/header.htm 在40行位置，增加</span></p>
<p><span style="color: #0000ff;">&lt;span id="pmsound"&gt;&lt;/span&gt;</span> &lt;!--{if $prompt}--&gt;&lt;script type="text/javascript" reload="1"&gt;$('pmsound').innerHTML = AC_FL_RunContent('id', 'pmsoundplayer', 'name', 'pmsoundplayer', 'width', '0', 'height', '0', 'src', '{$boardurl}images/sound/pm_$pmsound.swf',  'menu', 'false',  'allowScriptAccess', 'sameDomain', 'swLiveConnect', 'true');&lt;/script&gt;&lt;!--{/if}--&gt;</p>
<p><span style="color: #ff0000;">此段是解决问题的关键，注意蓝色的部分，论坛代码里是缺失这个的，经检查，pm_checknew里的执行结果被插入到id="append_parent"的一个 div中，而且，里面的<span style="color: #0000ff;">&lt;!--{if $s}--&gt;是无效的</span>。</span></p>
<p>4、到后台更新缓存，重新测试，声音提示成功。</p>
<p>从发现问题到解决问题经历了几天的时间，这里问题解决不了，终究不能卡住不前的。所以选择好的产品，使用正确的方法，实在太关键。康盛将太多的心思用到了一些花哨的功能上，代码质量一直未见提高，产品硬伤内伤依旧，一个画皮一样的产品，只能靠忽悠来支撑了。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://railser.cn/blog/discuz72-pm_sound/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>rails new 特定版本</title>
		<link>http://railser.cn/blog/rails-new-%e7%89%b9%e5%ae%9a%e7%89%88%e6%9c%ac</link>
		<comments>http://railser.cn/blog/rails-new-%e7%89%b9%e5%ae%9a%e7%89%88%e6%9c%ac#comments</comments>
		<pubDate>Sun, 26 Jun 2011 05:27:30 +0000</pubDate>
		<dc:creator>里克</dc:creator>
				<category><![CDATA[RailsNote]]></category>

		<guid isPermaLink="false">http://railser.cn/?p=643</guid>
		<description><![CDATA[rails _3.0.7_ new railstest 说明：安装多个版本，尤其安装了3.1.0 pre 后，使用Rails 3.0.7这个最新稳定版开发项目。]]></description>
			<content:encoded><![CDATA[<p>rails _3.0.7_ new railstest</p>
<p>说明：安装多个版本，尤其安装了3.1.0 pre 后，使用Rails 3.0.7这个最新稳定版开发项目。</p>
]]></content:encoded>
			<wfw:commentRss>http://railser.cn/blog/rails-new-%e7%89%b9%e5%ae%9a%e7%89%88%e6%9c%ac/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>crontab的写法误解</title>
		<link>http://railser.cn/blog/crontab</link>
		<comments>http://railser.cn/blog/crontab#comments</comments>
		<pubDate>Mon, 20 Jun 2011 12:05:25 +0000</pubDate>
		<dc:creator>里克</dc:creator>
				<category><![CDATA[RailsNote]]></category>
		<category><![CDATA[crontab]]></category>

		<guid isPermaLink="false">http://railser.cn/?p=639</guid>
		<description><![CDATA[crontab的标准写法参照这里，http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-autotasks.html 那么，每阁特定小时运行命令如何写呢？ 每隔30分钟，运行一次命令，可以写 */30 * * * * /sbin/do_something 每隔4小时，可以写成 * */4 * * * /sbin/do 吗？不可以，这样会产生很严重的错误，导致我每分钟运行一次命令，直到某种情况下被中止。想到这我真心疼我的mysql和cpu。 这里正确的写法应该是 0 0,4,8,12,16,20 * * * /sbin/do (whenever 给出的写法) 或者 0 */4 * * * /sbin/do (我认为可行的写法，不过至今未确认，这个写法可以从保存时开始，每隔4小时执行一次) 两个写法，都要在第一个位置，指定执行开始的分钟数。 请各位指正，我也继续验证一下我的写法。 &#160;]]></description>
			<content:encoded><![CDATA[<p>crontab的标准写法参照这里，http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-autotasks.html</p>
<p>那么，每阁特定小时运行命令如何写呢？</p>
<p>每隔30分钟，运行一次命令，可以写</p>
<p>*/30 * * * * /sbin/do_something</p>
<p>每隔4小时，可以写成</p>
<p>* */4 * * * /sbin/do</p>
<p>吗？不可以，这样会产生很严重的错误，导致我每分钟运行一次命令，直到某种情况下被中止。想到这我真心疼我的mysql和cpu。</p>
<p>这里正确的写法应该是</p>
<p>0 0,4,8,12,16,20 * * * /sbin/do (<a href="https://github.com/javan/whenever" target="_blank">whenever</a> 给出的写法)</p>
<p>或者</p>
<p>0 */4 * * * /sbin/do (我认为可行的写法，不过至今未确认，这个写法可以从保存时开始，每隔4小时执行一次)</p>
<p>两个写法，都要在第一个位置，指定执行开始的分钟数。</p>
<p>请各位指正，我也继续验证一下我的写法。</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://railser.cn/blog/crontab/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>readline load error的解决办法</title>
		<link>http://railser.cn/blog/readline-load-error-rails307</link>
		<comments>http://railser.cn/blog/readline-load-error-rails307#comments</comments>
		<pubDate>Mon, 20 Jun 2011 07:55:24 +0000</pubDate>
		<dc:creator>里克</dc:creator>
				<category><![CDATA[RailsNote]]></category>
		<category><![CDATA[readline]]></category>

		<guid isPermaLink="false">http://railser.cn/?p=636</guid>
		<description><![CDATA[服务器总算都调试完了，今天打算看一下一个app的具体信息，发现 rails c提示错误。 这是个常见的错误：`require': no such file to load -- readline (LoadError) 原因：缺少readline 解决办法：进入rvm ruby1.9.7的src，安装readline 具体： &#62;&#62; which ruby /usr/local/rvm/rubies/ruby-1.9.2-p180/bin/ruby &#62;&#62; cd /usr/local/rvm/src/ruby-1.9.2-p180/ext/readline &#62;&#62; ruby extconf.rb &#62;&#62; make &#62;&#62; make install 再次rails c，解决问题了。 笔记太有用了，都省去了回忆的时间。]]></description>
			<content:encoded><![CDATA[<p>服务器总算都调试完了，今天打算看一下一个app的具体信息，发现 rails c提示错误。</p>
<p>这是个常见的错误：`require': no such file to load -- readline (LoadError)</p>
<p>原因：缺少readline</p>
<p>解决办法：进入rvm ruby1.9.7的src，安装readline</p>
<p>具体：</p>
<p>&gt;&gt; which ruby</p>
<p>/usr/local/rvm/rubies/ruby-1.9.2-p180/bin/ruby</p>
<p>&gt;&gt; cd /usr/local/rvm/src/ruby-1.9.2-p180/ext/readline</p>
<p>&gt;&gt; ruby extconf.rb</p>
<p>&gt;&gt; make</p>
<p>&gt;&gt; make install</p>
<p>再次rails c，解决问题了。</p>
<p>笔记太有用了，都省去了回忆的时间。</p>
]]></content:encoded>
			<wfw:commentRss>http://railser.cn/blog/readline-load-error-rails307/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在CentOS5上部署Rails3应用</title>
		<link>http://railser.cn/blog/rails-on-centos-step-by-step</link>
		<comments>http://railser.cn/blog/rails-on-centos-step-by-step#comments</comments>
		<pubDate>Mon, 06 Jun 2011 16:02:41 +0000</pubDate>
		<dc:creator>里克</dc:creator>
				<category><![CDATA[Advanced Rails]]></category>
		<category><![CDATA[RailsNote]]></category>
		<category><![CDATA[capistrano]]></category>
		<category><![CDATA[centos]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[passenger]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[rvm]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[whenever]]></category>

		<guid isPermaLink="false">http://railser.cn/?p=609</guid>
		<description><![CDATA[1、安装rvm 安装rvm前，要先安装git。因为rvm的安装教程就是一个git的小脚本。 &#62;&#62;wget http://kernel.org/pub/software/scm/git/git-1.7.5.3.tar.bz2 Oop！这里有个问题，我tar不常用，这里tar xvfz git-... 是会提出格式错误的，查了一下需要换一个命令：tar -xvjpf git-... 之后， make prefix=/usr/local all make prefix=/usr/local install 看到git 版本后，安装rvm git --version 剩下的，就是按照 https://rvm.beginrescueend.com/rvm/install/ 的讲解一步步安装吧，最后，阿？为什么 type rvm &#124; head -1 会提示错误呢？我也被搞糊涂了，按照提示，我重新打开一个终端窗口，这下正常了。所以再看看文档吧。 接着，安装1.8.7 2、安装ruby 1.8.7和gem rvm install 1.8.7 注：我又将用户切换回了root，而在进行到Load RVM into your shell sessions as a function的时候，我不得不切换回user。 rvm use 1.8.7 显示正常了。 安装gems http://rubygems.org/pages/download 3、安装rails gem install rails -v [...]]]></description>
			<content:encoded><![CDATA[<p>1、安装rvm</p>
<p>安装rvm前，要先安装git。因为rvm的安装教程就是一个git的小脚本。</p>
<p>&gt;&gt;wget http://kernel.org/pub/software/scm/git/git-1.7.5.3.tar.bz2</p>
<p>Oop！这里有个问题，我tar不常用，这里tar xvfz git-... 是会提出格式错误的，查了一下需要换一个命令：tar -xvjpf git-...</p>
<p>之后，</p>
<p>make prefix=/usr/local all</p>
<p>make prefix=/usr/local install</p>
<p>看到git 版本后，安装rvm</p>
<p>git --version</p>
<p>剩下的，就是按照 https://rvm.beginrescueend.com/rvm/install/ 的讲解一步步安装吧，最后，阿？为什么</p>
<pre>type rvm | head -1</pre>
<p>会提示错误呢？我也被搞糊涂了，按照提示，我重新打开一个终端窗口，这下正常了。所以再看看文档吧。</p>
<p>接着，安装1.8.7</p>
<p>2、安装ruby 1.8.7和gem</p>
<p>rvm install 1.8.7</p>
<p>注：我又将用户切换回了root，而在进行到Load RVM into your shell sessions as a function的时候，我不得不切换回user。</p>
<p>rvm use 1.8.7</p>
<p>显示正常了。</p>
<p>安装gems</p>
<p>http://rubygems.org/pages/download</p>
<p>3、安装rails</p>
<p>gem install rails -v 3.0.7 --no-rdoc --no-ri</p>
<p>如果安装rdoc和ri，我出现了问题，具体的情况未明。</p>
<p>问题又来了，&gt;&gt; rails -v 找不到命令</p>
<p>翻看文章的过程中，有一句话很重要，“gem install rails     # 注意不要加sudo，否则会安到系统的ruby下，而不是rvm的ruby下”</p>
<p>这是在百度里查到的，可是不用root，rvm也没安装成功，还是我最开始忘记使用user，而在安装完rvm后，ruby也用了root权限安装。不知道这里的影响会有什么，总之，我犯了一个错误，版本搭配错误。</p>
<p>应该是 ruby1.9.2搭配rails3.0.7。</p>
<p>好吧，还好有rvm，安装ruby1.9.2，再 gem install rails，竟然没有出现第一次时候的 ri 错误。欣慰吧。</p>
<p>这里还有一些细节，不影响整体即可，现在 rails new testrails 成功创建了一个应用。</p>
<p>4、安装svn</p>
<p>曾经熟悉的svn页面，已经转移到 apache 下，地址在这，http://subversion.apache.org/ ，用户手册在 http://svnbook.red-bean.com/ 。</p>
<p>按照一些文章介绍，安装svn实在太复杂了，突然我想起来yum和apt-get。来试一下。</p>
<p>yum install subversion</p>
<p>成功了。</p>
<p>按照<a href="http://www.hostingrails.com/Subversion-Rails-Implement-Your-Own-Version-Control-System" target="_blank">这个文档</a>，我配置过两次，这里不再详述了，又需要的朋友看一下。</p>
<p>我每次都会参照它ignore的操作。</p>
<p>5、<span style="color: #ff0000;">ssh配置</span></p>
<p>在我本地重新生成一个key，其实没必要的，我只是出于练习的目的。</p>
<p>&gt;&gt; ssh-keygen -t rsa</p>
<p>在服务器上</p>
<p>&gt;&gt; mkdir .ssh (其实没太大必要了，因为我的key不打算放到这里了)</p>
<p>然后传输这个key上去</p>
<p>&gt;&gt; scp ~/.ssh/id_rsa.pub loginname@hostdomain:.ssh/authorized_keys</p>
<p>这里把key命名为authorized_keys。按照一些教程的说明，综合起来简单笔记一下。</p>
<p>在/etc/ssh/&lt;username&gt;建立文件夹，将authorized_keys mv进来，并给予权限</p>
<p>&gt;&gt; chmod 755 &lt;username&gt;</p>
<p>&gt;&gt; chmod 644 &lt;username&gt;/authorized_keys</p>
<p>编辑/etc/ssh/sshd_config，改写这一行</p>
<p>AuthorizedKeysFile    /etc/ssh/%u/authorized_keys</p>
<p>并取消注释这两行</p>
<p>RSAAuthentication yes</p>
<p>PubkeyAuthentication yes</p>
<p>保存后，</p>
<p>&gt;&gt; /etc/init.d/sshd restart</p>
<p>启动另一个终端，登录时弹出一个窗口提示输入密码，其实就是刚才生成key时候的passphrase。确认后，就不用输入密码直接登录了。</p>
<p>这里有一个调试经验。</p>
<p>&gt;&gt; ssh -v name@domain</p>
<p>会输出交互信息，这里我发现它先校验key，如果不通过，就校验登录密码了。所以，如果上面的任何一个步骤有问题，比如权限不对或者写错字母，这里就会继续提示需要密码。</p>
<p>如果上面的都正确了，这时就不用再次输入密码直接登录了。</p>
<p>感谢<a href="https://help.ubuntu.com/community/SSH/OpenSSH/Keys" target="_blank">这篇文章</a>，让我节省了如此多的时间。感谢分享的精神。</p>
<p>接着需要提高一些安全性了，常见的有</p>
<p>PermitRootLogin no （禁止用root登录，这是默认的，当然有些时候会被其他的开发人员打开，检查一下是必要的）</p>
<p>StrictModes yes （也是默认的）</p>
<p>PasswordAuthentication no （禁用密码登录，加上这个安全性就足够了，当然还有其他，欢迎各位指点。）</p>
<p>&nbsp;</p>
<p>时间过去了一个星期，这期间我在调试一个Rails程序，打算下面部署到服务器上，而不是随便用个railstest应付了事。这里又温习了很多rails得技巧，不过时间好快，一下子就是8天的时间。</p>
<p>好了，我的Rails程序已经基本完成小样了，开始用capistrano设置。</p>
<p>6、Capistrano</p>
<p>这里稍微特殊一些的地方，是我用的svn+ssh（注意顺序，写反了不行）链接服务器并cap命令。这里没有办法证明一件事情，写出来供大家参考，就是私钥设置完，在服务器上也测试一下，比如</p>
<p>svn checkout -q  -r5 svn+ssh://domain.com/test/trunk tmp</p>
<p>这里会要求输入passphrase，或者添加host到know_host，都可能潜在的影响第一次cap的成功。当然，第一次cap失败可能是必然的，关键是下面分享一下我的deploy.rb给大家参考，减少一些查询的时间，当然很多东西还得看过说明才了解，建议看<a href="http://help.github.com/capistrano/" target="_blank">这篇文章</a>，很有帮助。</p>
<p>下面是我的代码</p>
<p>(略过)</p>
<p>在配置svn的时候，会有不同的权限设置，比如网站目录会放到/var/www/中，我觉得这是安全性的问题，超过这个笔记的范围，就不记述了。不过这其间还是看了一些文章，后面做安全调整的时候会用上的。</p>
<p>补充几个命令</p>
<p>cap -H 查看帮助</p>
<p>cap -T 查看任务，-vT查看更多任务</p>
<p>cap -e deploy:cold 查看deploy:cold 的说明</p>
<p>7、apapche，nginx和passenger</p>
<p>因为CentOS上的apache已经安装好了，所以这里只要安装一下passenger就可以了，安装起来竟然无比简单，缺少的lib按照提示yum一下就可以了。</p>
<p>&nbsp;</p>
<p>8、安装sqlite3-ruby的问题</p>
<p>google了一下发现很多人安装这个出现问题，yum install sqlite3-ruby 也不可以，这里很奇怪，yum竟然找不到这个包。</p>
<p>省去一些步骤，直接 yum search sqlite， 发现给出的包有：</p>
<div>
<div>
<div>mono-data-sqlite.i386 : sqlite database connectivity for Mono</div>
<div>pdns-backend-sqlite.i386 : SQLite backend for pdns</div>
<div>php-pear-Log.noarch : Abstracted logging facility for PHP</div>
<div>python-sqlite.i386 : Python bindings for sqlite.</div>
<div>qt4-sqlite.i386 : SQLite drivers for Qt's SQL classes</div>
<div>sqlite.i386 : Library that implements an embeddable SQL database engine</div>
<div>sqlite-devel.i386 : Development tools for the sqlite3 embeddable SQL database engine.</div>
</div>
</div>
<p>原来是包的名称不对，所以</p>
<p>yum install sqlite.i386</p>
<p>提示已经安装</p>
<p>yum install sqlite-devel.i386</p>
<p>安装成功，再次 gem install sqlite3，提示</p>
<p>sqlite3-ruby only supports sqlite3 versions 3.6.16+, please upgrade!</p>
<p>好，可算有了进展。下载 http://www.sqlite.org/download.html 最新版本的sqlite，安装后，再次 gem install sqlite3，成功了！！</p>
<p>回到rails目录，再次 bundle install。胜利完成。</p>
<p>9、rake任务出错，/lib/rake.rb:32: warning: already initialized constant RAKEVERSION</p>
<p>临时的解决办法，bundle exec rake RAILS_ENV=production  db:migrate</p>
<p>这不是最终解决办法，还在找，刚才心急一下给发布了，其实还没写完呢。。</p>
<p>问题发现了，是rake的问题，卸载之后重新安装rake 0.8.7，问题暂时解决。</p>
<p>10、No such file or directory - /tmp/mysql.sock</p>
<p>CentOS的位置和方法，在此备注，ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock</p>
<p>11、invalid packet: sequence number mismatch(3 != 1(expected))</p>
<p>说是ruby-mysql2.9.4的问题，暂时使用2.9.3。但是问题依旧。</p>
<p>gem 'mysql2', '0.2.7' 和gem 'mysql'的区别</p>
<p>最新版本的mysql2，是0.3.2，这是集成进rails3.1的，不适用于rails3.0.7，所以需要指定版本为0.2.7，环境可以为Raisl 3.0.x和mysql 5.x</p>
<p>gem 'ruby-mysql'和gem 'mysql-ruby'的区别：都不用了，直接用 gem 'mysql'</p>
<p>“invalid packet: sequence number mismatch”的问题已经解决，去掉ruby-mysql的gem，直接使用 gem 'mysql'</p>
<p>在我的版本环境里，gem 'mysql2'也不行，我的环境，rvm, ruby1.9.2p180, rails 3.0.7</p>
<p>12、rake 0.9.2和0.8.7，会被同时安装，也会因为0.9.2产生问题，建议删除0.9.2</p>
<p>&nbsp;</p>
<p>13、自动执行rake任务</p>
<p>看了一些介绍，其实总结起来是三个事情</p>
<p>（1）参照系统默认的crontab任务，这方面资料很多</p>
<p>（2）rails的好处是gem和实现方案很多，建议使用 <a href="https://github.com/javan/whenever" target="_blank">whenever</a> 来实现，它会直接提示代码如何写，粘贴到当前用户的crontab里就可以</p>
<p>（3）具体做法，</p>
<p>&gt;&gt; crontab -e   编辑当前用户的cron任务</p>
<p>&gt;&gt;  */30 * * * * /bin/bash -l -c 'cd /home/liwei/wwwroot/appflying.com &amp;&amp; RAILS_ENV=production rake autorss:work --silent'</p>
<p>其实这个文件就这一行就可以，我完整的代码是</p>
<p>SHELL=/bin/bash</p>
<p>PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/rvm/gems/ruby-1.9.2-p180@global/bin</p>
<p>MAILTO=root</p>
<p>HOME=/home/liwei<br />
*/30 * * * * /bin/bash -l -c 'cd /home/liwei/wwwroot/appflying.com &amp;&amp; RAILS_ENV=production rake autorss:work --silent'</p>
<p>&nbsp;</p>
<p>写在最后：算是大功告成？？其实我没感觉，但是总算把我想写的内容写完了。后面还会有一些笔记。这个笔记到此用了2周时间，留念。</p>
]]></content:encoded>
			<wfw:commentRss>http://railser.cn/blog/rails-on-centos-step-by-step/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>hello, rails3.1 pre 第二部分</title>
		<link>http://railser.cn/blog/hello-rails31-pre-part2</link>
		<comments>http://railser.cn/blog/hello-rails31-pre-part2#comments</comments>
		<pubDate>Sun, 22 May 2011 07:05:51 +0000</pubDate>
		<dc:creator>里克</dc:creator>
				<category><![CDATA[default]]></category>
		<category><![CDATA[RailsNote]]></category>
		<category><![CDATA[rails31]]></category>

		<guid isPermaLink="false">http://railser.cn/?p=605</guid>
		<description><![CDATA[接着上一篇，问题继续。 rake db:migrate &#62;&#62; rake aborted! &#62;&#62; undefined method `task' for #&#60;Rails31test::Application:0x00000100de6a60&#62; 好吧，继续找答案，此处还是省略一些细节，直接看这里吧。 &#62;&#62; bundle exec rake db:migrate 问题暂时解决。 至此，projects已经可以看到了，剩下的还在琢磨。 补充一些链接： CoffeeScript  http://jashkenas.github.com/coffee-script/ RVM(Ruby Version Manager)  https://rvm.beginrescueend.com/ SASS/SCSS  http://sass-lang.com/ Sprockets  http://getsprockets.org/ &#160; &#160; &#160;]]></description>
			<content:encoded><![CDATA[<p>接着上一篇，问题继续。</p>
<p>rake db:migrate</p>
<p>&gt;&gt; rake aborted!</p>
<p>&gt;&gt; undefined method `task' for #&lt;Rails31test::Application:0x00000100de6a60&gt;</p>
<p>好吧，继续找答案，此处还是省略一些细节，<a href="http://community.engineyard.com/discussions/problems/1391-you-have-already-activated-rake-083-but-your-gemfile-requires-rake-087-consider-using-bundle-exec" target="_blank">直接看这里</a>吧。</p>
<p>&gt;&gt; bundle exec rake db:migrate</p>
<p>问题暂时解决。</p>
<p>至此，projects已经可以看到了，剩下的还在琢磨。</p>
<p>补充一些链接：</p>
<p>CoffeeScript  <a href="http://jashkenas.github.com/coffee-script/" target="_blank">http://jashkenas.github.com/coffee-script/</a></p>
<p>RVM(Ruby Version Manager)  <a href="https://rvm.beginrescueend.com/" target="_blank">https://rvm.beginrescueend.com/</a></p>
<p>SASS/SCSS  <a href="http://sass-lang.com/" target="_blank">http://sass-lang.com/</a></p>
<p>Sprockets  <a href="http://getsprockets.org/" target="_blank">http://getsprockets.org/</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://railser.cn/blog/hello-rails31-pre-part2/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hello, Rails3.1 pre</title>
		<link>http://railser.cn/blog/hello-rails31-pre</link>
		<comments>http://railser.cn/blog/hello-rails31-pre#comments</comments>
		<pubDate>Sat, 21 May 2011 07:08:34 +0000</pubDate>
		<dc:creator>里克</dc:creator>
				<category><![CDATA[default]]></category>
		<category><![CDATA[RailsNote]]></category>
		<category><![CDATA[rails31]]></category>

		<guid isPermaLink="false">http://railser.cn/?p=601</guid>
		<description><![CDATA[Rails3.1面世了，赶紧尝鲜吧。可是，第一个问题就出现了，更新失败。此处略过一堆字，直接笔记：安装rvm吧。 https://rvm.beginrescueend.com/rvm/install/ rvm简直是多版本ruby开发环境下的救世主。补充一下笔记： 在安装完rvm后，rails new rails31test 新建了一个测试项目，一切正常，可是bundle的时候出错，就连 gem list都出错。查了一下，原来我们要重新安装gem，也要重新装rails。 ps：各位是不是会觉得，我刚才安装了阿，为什么又要装一次？你是不是也看这个视频了？http://railscasts.com/episodes/265-rails-3-1-overview 一切都没错，只是rvm 1.9.2@railspre --create 是新建了一个gemsets，（此语法为简写）。这样我们还得安装一下bundler rails31test liwei$ gem install bundler rails31test liwei$ bundle rails31test liwei$ rails g scaffold project name:string ... ... /Users/apple/.rvm/gems/ruby-1.9.2-p180/gems/actionpack-3.1.0.beta1/lib/sprockets/railtie.rb:37:in `block (2 levels) in &#60;class:Railtie&#62;': undefined method `context' for #&#60;Sprockets::Environment:0x0000010312c420&#62; (NoMethodError) 查到这个问题的解决办法：https://github.com/rails/rails/issues/453 在Gemfile里写： gem 'sprockets', '2.0.0.beta.2' 原因：beta.2 is required by rails 3.1.0beta1 注意：安装的时候，使用的是 gem [...]]]></description>
			<content:encoded><![CDATA[<p>Rails3.1面世了，赶紧尝鲜吧。可是，第一个问题就出现了，更新失败。此处略过一堆字，直接笔记：安装rvm吧。</p>
<p>https://rvm.beginrescueend.com/rvm/install/</p>
<p>rvm简直是多版本ruby开发环境下的救世主。补充一下笔记：</p>
<p>在安装完rvm后，rails new rails31test 新建了一个测试项目，一切正常，可是bundle的时候出错，就连 gem list都出错。查了一下，原来我们要重新安装gem，也要重新装rails。</p>
<p>ps：各位是不是会觉得，我刚才安装了阿，为什么又要装一次？你是不是也看这个视频了？http://railscasts.com/episodes/265-rails-3-1-overview</p>
<p>一切都没错，只是rvm 1.9.2@railspre --create 是新建了一个gemsets，（此语法为简写）。这样我们还得安装一下bundler</p>
<p>rails31test liwei$ gem install bundler</p>
<p>rails31test liwei$ bundle</p>
<p>rails31test liwei$ rails g scaffold project name:string</p>
<p>... ...</p>
<p>/Users/apple/.rvm/gems/ruby-1.9.2-p180/gems/actionpack-3.1.0.beta1/lib/sprockets/railtie.rb:37:in `block (2 levels) in &lt;class:Railtie&gt;': undefined method `context' for #&lt;Sprockets::Environment:0x0000010312c420&gt; (NoMethodError)</p>
<p>查到这个问题的解决办法：https://github.com/rails/rails/issues/453</p>
<p>在Gemfile里写：</p>
<p>gem 'sprockets', '2.0.0.beta.2'</p>
<p>原因：beta.2 is required by rails 3.1.0beta1</p>
<p><span style="color: #ff0000;">注意：安装的时候，使用的是 gem 'sprockets', '2.0.0.beta.5'，所以还要 bundle update sprockets 降回到beta.2</span></p>
<p>再次</p>
<p>rails31test liwei$ rails g scaffold project name:string</p>
<p>成功</p>
<p>未完待续吧... ...</p>
]]></content:encoded>
			<wfw:commentRss>http://railser.cn/blog/hello-rails31-pre/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>redmine插件开发心得</title>
		<link>http://railser.cn/blog/redmine-plugin-dev-note</link>
		<comments>http://railser.cn/blog/redmine-plugin-dev-note#comments</comments>
		<pubDate>Tue, 29 Mar 2011 06:13:47 +0000</pubDate>
		<dc:creator>里克</dc:creator>
				<category><![CDATA[Advanced Rails]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[redmine]]></category>

		<guid isPermaLink="false">http://railser.cn/?p=591</guid>
		<description><![CDATA[上上周经Q友介绍，接了一个redmine插件开发的小项目。我很感兴趣的是可以借此机会把redmine熟悉一下，所以没太考虑价钱就答应了下来。现在想想，这次开发学到的东西很多，也认识了专业的开发团队，很值得。下面把redmine插件开发的经验笔记一下。 先来截图： 地址：http://www.cocos2d-x.org/projects/cocos2d-x/apps 简单介绍下 cocos2d-x is a multi-platform, light weight &#38; developer-friendly C++ 2D mobile game engine, open source and released under MIT License. It is a child branch of the famous "cocos2d-iphone" project, and will keep the primary features sync with it. 更多细节请访问 http://www.cocos2d-x.org/projects/cocos2d-x/wiki 好了，说下这个插件实现的功能。 一是管理发布平台，比如iOS，Android，WoPhone，Windows，Other，未来它还会有其他的平台。 二是在这些平台分类里，上传app，比如时下最火的iOS app，android app等。当上传iOS app时，可自动采集该信息。 一、让我们开始 插件如何开发呢？下载其他插件的代码来研究是关键的第一步。因为之前对redmine插件开发一无所知，所以下面的笔记有点啰唆。 先看一下官方发布的插件开发文档，http://www.redmine.org/projects/redmine/wiki/Plugin_Tutorial，请大概的了解一下。然后，我们去redmine插件列表，下载两个很有代表性的插件，redmine_polls和redmine_bookmarks，把它们放到 vendor/plugins 里。选择这两个插件的原因是它们都是自主上传，填写内容的。 [...]]]></description>
			<content:encoded><![CDATA[<p>上上周经Q友介绍，接了一个redmine插件开发的小项目。我很感兴趣的是可以借此机会把redmine熟悉一下，所以没太考虑价钱就答应了下来。现在想想，这次开发学到的东西很多，也认识了专业的开发团队，很值得。下面把redmine插件开发的经验笔记一下。</p>
<p>先来截图：</p>
<p><a href="http://railser.cn/wp-content/uploads/屏幕快照-2011-03-20-11.08.28.png"><img class="aligncenter size-medium wp-image-592" title="屏幕快照 2011-03-20 11.08.28" src="http://railser.cn/wp-content/uploads/屏幕快照-2011-03-20-11.08.28-300x193.png" alt="" width="300" height="193" /></a></p>
<p>地址：<a href="http://www.cocos2d-x.org/projects/cocos2d-x/apps" target="_blank">http://www.cocos2d-x.org/projects/cocos2d-x/apps</a></p>
<p>简单介绍下</p>
<p>cocos2d-x is a multi-platform, light weight &amp; developer-friendly C++ 2D mobile game engine, open source and released under MIT License. It is a child branch of the famous "cocos2d-iphone" project, and will keep the primary features sync with it.</p>
<p>更多细节请访问 <a href="http://www.cocos2d-x.org/projects/cocos2d-x/wiki" target="_blank">http://www.cocos2d-x.org/projects/cocos2d-x/wiki</a></p>
<p>好了，说下这个插件实现的功能。</p>
<p>一是管理发布平台，比如iOS，Android，WoPhone，Windows，Other，未来它还会有其他的平台。</p>
<p>二是在这些平台分类里，上传app，比如时下最火的iOS app，android app等。当上传iOS app时，可自动采集该信息。</p>
<h3>一、让我们开始</h3>
<p>插件如何开发呢？下载其他插件的代码来研究是关键的第一步。因为之前对redmine插件开发一无所知，所以下面的笔记有点啰唆。</p>
<p>先看一下官方发布的插件开发文档，<a href="http://www.redmine.org/projects/redmine/wiki/Plugin_Tutorial" target="_blank">http://www.redmine.org/projects/redmine/wiki/Plugin_Tutorial</a>，请大概的了解一下。然后，我们去<a href="http://www.redmine.org/plugins" target="_blank">redmine插件列表</a>，下载两个很有代表性的插件，redmine_polls和redmine_bookmarks，把它们放到 vendor/plugins 里。选择这两个插件的原因是它们都是自主上传，填写内容的。</p>
<p>注意：在最新版本的redmine1.1中，polls会引起个异常。</p>
<h3>二、如何管理插件</h3>
<p><a href="http://railser.cn/wp-content/uploads/屏幕快照-2011-03-29-10.10.25.png"><img class="aligncenter size-medium wp-image-595" title="屏幕快照 2011-03-29 10.10.25" src="http://railser.cn/wp-content/uploads/屏幕快照-2011-03-29-10.10.25-300x105.png" alt="" width="300" height="105" /></a>这是插件管理界面，如果你按照上面插件教程开发的话，你会发现缺少了Configure功能。如何加入这个功能，并且它可以做什么？可以完全的参考上面两个插件中的init.rb 和games插件里的写法。</p>
<p>&nbsp;</p>
<pre class="ruby">settings <span style="color:#ff3333; font-weight:bold;">:default</span> =&amp;gt; <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>,
           <span style="color:#ff3333; font-weight:bold;">:partial</span> =&amp;gt; <span style="color:#996600;">'platforms/manage'</span></pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>这两行代码的作用，使得我们可以编辑一个页面，这个页面里，实现了games的platform管理。当然，你也可以在configure里增加apps的管理，丰富管理员功能。</p>
<p>这里要注意的是，权限如何分配了。</p>
<h3>三、如何分配权限</h3>
<p>按照文档的描述，我们可以很妥善的分配各个角色的权限。public =&gt; true，即可将所指定的action开放给所有人，如果想屏蔽掉未登录的账号访问，:require =&gt; :loggedin 即可。如果想对登录账号做区别，就需要针对每个action做以分别了。</p>
<p>权限设置的文档不够全，建议大家多参考别人的代码，和看源代码分析一些用法。</p>
<h3>四、设置导航菜单</h3>
<p>在插件的init.rb文件里，需要单独写一遍插件所使用的路由规则，为了是插件地址更没关，我们的做一些代码上的牺牲。</p>
<p>&nbsp;</p>
<pre class="ruby"><span style="color:#6666ff; font-weight:bold;">ActionController::Routing::Routes</span>.<span style="color:#9900CC;">draw</span> <span style="color:#9966CC; font-weight:bold;">do</span> |map|
  map.<span style="color:#9900CC;">connect</span> <span style="color:#996600;">'projects/:project_id/apps'</span>, <span style="color:#ff3333; font-weight:bold;">:controller</span> =&amp;gt; <span style="color:#996600;">&quot;apps&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:action</span> =&amp;gt; <span style="color:#996600;">&quot;index&quot;</span>
  map.<span style="color:#9900CC;">connect</span> <span style="color:#996600;">'projects/:project_id/apps/all'</span>, <span style="color:#ff3333; font-weight:bold;">:controller</span> =&amp;gt; <span style="color:#996600;">&quot;apps&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:action</span> =&amp;gt; <span style="color:#996600;">&quot;all&quot;</span>
  map.<span style="color:#9900CC;">connect</span> <span style="color:#996600;">'projects/:project_id/apps/:id'</span>, <span style="color:#ff3333; font-weight:bold;">:controller</span> =&amp;gt; <span style="color:#996600;">&quot;apps&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:action</span> =&amp;gt; <span style="color:#996600;">&quot;show&quot;</span>
  map.<span style="color:#9900CC;">resources</span> <span style="color:#ff3333; font-weight:bold;">:apps</span>,
    <span style="color:#ff3333; font-weight:bold;">:member</span> =&amp;gt; <span style="color:#006600; font-weight:bold;">&#123;</span>:recommend =&amp;gt; <span style="color:#ff3333; font-weight:bold;">:post</span>, <span style="color:#ff3333; font-weight:bold;">:delete_pic</span> =&amp;gt; <span style="color:#ff3333; font-weight:bold;">:post</span>, <span style="color:#ff3333; font-weight:bold;">:snatching</span> =&amp;gt; <span style="color:#ff3333; font-weight:bold;">:get</span>, <span style="color:#ff3333; font-weight:bold;">:doing</span> =&amp;gt; <span style="color:#ff3333; font-weight:bold;">:post</span><span style="color:#006600; font-weight:bold;">&#125;</span>,
    <span style="color:#ff3333; font-weight:bold;">:collection</span> =&amp;gt; <span style="color:#006600; font-weight:bold;">&#123;</span>:all =&amp;gt; <span style="color:#ff3333; font-weight:bold;">:get</span><span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>这是games里的设置，只是将三个方法做了前缀处理，这样可以和其他导航链接类似，都是 /projects/text_proj/apps/9 的形式。否则，按照resource的形式，将会是很难看（客户也不会接受的）/apps/9?project_id=text_proj</p>
<h3>五、开发插件代码</h3>
<p>这是我们最熟悉的部分了，此处省略一万字节。</p>
<h3>六、使用js和css</h3>
<p>这个地方有点麻烦，每次改动都得重启一下服务，因为每次重启才会将js代码和css文件同步到public下，当然我们可以在public下去写，收工前拿回到插件目录下，可是插件用的文件都不大，何况我都是production下开发，改哪个代码都得重启。（development下的执行速度你们是知道的）。</p>
<h3>七、抓取app store</h3>
<p>games插件有一个很重要的功能，就是到app store页面去采集app信息。代码在lib下的app_snatcher.rb，功能比较简单，仅做参考吧。</p>
<h3>八、其他插件和gem</h3>
<p>出于尝试的目的，我使用了will_paginate插件来实现分页，paperclip来保存app采集时候的icon和screenshot，在采集时使用了两个gem，请编辑你的environment.rb，增加</p>
<pre class="ruby">config.<span style="color:#9900CC;">gem</span> <span style="color:#996600;">'hpricot'</span>
config.<span style="color:#9900CC;">gem</span> <span style="color:#996600;">'mechanize'</span></pre>
<p>&nbsp;</p>
<h3>九、总结</h3>
<p>如果你觉得这个代码对你开发redmine插件又帮助，可以在这里下载它：https://github.com/liwei78/redmine-games 。</p>
<p>欢迎和各位交个朋友，我个人的博客：<a href="http://liwei.me" target="_blank">http://liwei.me</a>，目前正在设计新的界面，会把我的介绍，包括工作内容，都整理发布到上面。</p>
<h3>十：广告一下</h3>
<p>目前我还运营这另外两个博客，<a href="http://www.echangchun.net" target="_blank">电子长春</a> 和 <a href="http://top360buy.com" target="_blank">京东购物导航 </a>。</p>
<p>前者关注电子商务动态和IT业内新闻，后者为京东商城点评，购物推介点评。</p>
<p>&nbsp;</p>
<p>Update at 2011-6-15</p>
<p>升级了一下，0.0.1到0.0.2，增加了lightbox显示screenshots</p>
]]></content:encoded>
			<wfw:commentRss>http://railser.cn/blog/redmine-plugin-dev-note/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

