<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[曹小华的博客]]></title>
  <link href="http://www.mangege.com/atom.xml" rel="self"/>
  <link href="http://www.mangege.com/"/>
  <updated>2012-05-08T22:32:23+08:00</updated>
  <id>http://www.mangege.com/</id>
  <author>
    <name><![CDATA[曹小华]]></name>
  </author>

  
  <entry>
    <title type="html"><![CDATA[密云之行]]></title>
    <link href="http://www.mangege.com//2012/05/08/mi-yun-zhi-xing.html"/>
    <updated>2012-05-08T22:01:00+08:00</updated>
    <id>http://www.mangege.com//2012/05/08/mi-yun-zhi-xing</id>
    <content type="html"><![CDATA[<p>上周日从四元桥骑行密云水库,地图计算出单程81KM,码表显示全程167KM.共花13个小时,中间就吃了次午饭.</p>

<p>这是买勇士560的第二次长途骑行,第一次是在网上认识了两朋友,五一小长假的第一天跑了一趟潭柘寺.<br/>
潭柘寺的G108路线还是比较有感觉,6公里的长坡,下坡的感觉太爽了.不过此路线车貌似比较多,路上还是得注意安全.</p>

<p>此次去密云水库是一个人,本来有一朋友在群里发起,但他在顺义,没有约到碰头的地方,后来想想就算了.<br/>
路线是直走G101,也就是京密路.路非常好走,没有一个坡.导致骑行都没有啥感觉.到时密云找水库时,才有点山路.<br/>
路上碰到一车队,有四五十岁的骑行去怀柔,有的骑的还是普通的通勤车.</p>

<p>好不容易到了终点,可以水库只能到山顶远远看望.景色还不错.</p>

<p>骑行达到人车合一的境界还差太远了.码表显示的平均时速是15KM/H,用的是前2后3的齿.骑行起来大腿不痛,但因为踏频还没有适合,第二天骑行时微微的感觉关节有点痛.<br/>
长距离的骑行感觉货架和骑行裤是很有必要的.背着背包肩膀痛.穿普通的裤子屁股痛,而且汗都湿了裤子,很不舒服.</p>

<p>高强度的运动对减肥还是很有效的,一次骑行下来,肚子上的脂肪都消耗的差不多了.</p>

<p>计划以后每周末都出行一次,为1000+公里的长途旅行做准备.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Ruby的Block与控制结构变量作用域小差别]]></title>
    <link href="http://www.mangege.com//2012/02/29/rubyde-blockyu-kong-zhi-jie-gou-bian-liang-zuo-yong-yu-xiao-chai-bie.html"/>
    <updated>2012-02-29T23:04:00+08:00</updated>
    <id>http://www.mangege.com//2012/02/29/rubyde-blockyu-kong-zhi-jie-gou-bian-liang-zuo-yong-yu-xiao-chai-bie</id>
    <content type="html"><![CDATA[<p>在方法中,Block是新作用域,而控制结构还是方法的作用域.</p>

<div class="highlight"><pre><code class="ruby"><span class="k">def</span> <span class="nf">foo</span>
  <span class="k">while</span> <span class="kp">true</span> <span class="c1">#控制结构</span>
    <span class="n">i</span> <span class="o">=</span> <span class="mi">10</span>
    <span class="k">break</span>
  <span class="k">end</span>
  <span class="nb">puts</span> <span class="n">i</span> <span class="c1">#正常输出10</span>

  <span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="n">map</span><span class="p">{</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">100</span> <span class="p">}</span>
  <span class="nb">puts</span> <span class="n">j</span> <span class="c1">#undefined local variable 错误 </span>
<span class="k">end</span>

<span class="n">foo</span>
</code></pre>
</div>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Rails学习笔记之Typo登陆认证与授权]]></title>
    <link href="http://www.mangege.com//2012/02/14/railsxue-xi-bi-ji-zhi-typodeng-lu-ren-zheng-yu-shou-quan.html"/>
    <updated>2012-02-14T20:06:00+08:00</updated>
    <id>http://www.mangege.com//2012/02/14/railsxue-xi-bi-ji-zhi-typodeng-lu-ren-zheng-yu-shou-quan</id>
    <content type="html"><![CDATA[<p>只是写出自己觉得不错的看点,供新手参考.
由ApplicationController统一include LoginSystem module.
代码放在目录vendor/plugins/typo_login_system</p>

<p>小技巧一:
vendor/plugins/typo_login_system/lib/login_system.rb</p>

<div class="highlight"><pre><code class="ruby">  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">included</span><span class="p">(</span><span class="n">base</span><span class="p">)</span>
  <span class="n">base</span><span class="o">.</span><span class="n">send</span> <span class="ss">:helper_method</span><span class="p">,</span> <span class="ss">:current_user</span><span class="p">,</span> <span class="ss">:logged_in?</span>
  <span class="k">end</span>
</code></pre>
</div>


<p>利用include module的回调方法included,把current_user, logged_in?添加到helper,这样在view也可以调用这两个方法
另外它的login_form_系列方法的实现也很值得看.</p>

<p>小技巧二:</p>

<div class="highlight"><pre><code class="ruby">  <span class="k">def</span> <span class="nf">current_user</span>
    <span class="vi">@current_user</span> <span class="o">||=</span> <span class="p">(</span><span class="n">login_from_session</span> <span class="o">||</span> <span class="n">login_from_basic_auth</span> <span class="o">||</span> <span class="n">login_from_cookie</span> <span class="o">||</span> <span class="ss">:false</span><span class="p">)</span>
  <span class="k">end</span>
</code></pre>
</div>


<p>利用 ||= ,把当前用户保存到实例变量@current_user中,这样控制器实例第二次调用的时候,就不需要再运行后面的代码.</p>

<p>Typo::AccessControl的实现有点复杂,它是yield的常用手法的一个实现<br/>
授权基本角色,权限控制细粒度到controller,无法控制到action<br/>
从vendor/plugins/typo_login_system/lib/access_control.rb 文件的注释示例进行简单的分析.<br/>
类方法map需要传一个Hash,:require的值可以是数组或字符串,这里写角色名,每调用一次类方法,会生成一个Mapper实例,yield后,再把Mapper实例保存到@mappers<br/>
而@mappers运行时是唯一的,所以当你多次调用类方法map,把它其生成的所有Mapper实例都保存到@mappers这个数组里.</p>

<p>Mapper数据结构::<br/>
Mapper<br/>
&nbsp;&nbsp;--roles<br/>
&nbsp;&nbsp;--controllers<br/>
&nbsp;&nbsp;--project_modules<br/>
&nbsp;&nbsp;&nbsp;&nbsp;--controllers</p>

<p>验证是否可以有权限<br/>
通过@mappers拿到包含指定role name的所有Mapper实例,把mapper的controllers和其拥有的所有project_modules的controllers合并成一个数组,判断访问的控制器名是否在此数组里</p>

<p>Typo的角色权限定义可以看config/initializers/access_rules.rb</p>

<p>功能不是很强大,但满意一般的小应用场合.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Rails学习笔记之Typo安装]]></title>
    <link href="http://www.mangege.com//2012/02/09/railsxue-xi-zhi-typoan-zhuang.html"/>
    <updated>2012-02-09T15:53:00+08:00</updated>
    <id>http://www.mangege.com//2012/02/09/railsxue-xi-zhi-typoan-zhuang</id>
    <content type="html"><![CDATA[<p>选择Typo作为学习目标.原因有三点:</p>

<ol>
<li>更像我们平常开发的Rails应用,对Rails动刀的地方不多,容易看懂.</li>
<li>博客项目,复杂度相对来说比较简单,功能也不少.</li>
<li>有测试,分析起来很轻松.</li>
</ol>


<p>从安装分析起.我也是半吊子,写的不好,请多多指教.<br/>
安装路径是/setup,Controller是Setup,从此Controller的RSpec可以看出,进行setup操作,数据库里需要有一条Blog数据,不然会报错的.</p>

<p>GET setup时,会调用ApplicationController的this_blog方法. this_blog方法默认拿到Blog的第一条记录<br/>
POST setup用的是同一个方法,用http method来区分,提交表单用post. 成功后会重定向到 /setup/confirm<br/>
此操作应该会生成一个用户,和初始化博客设置.</p>

<p>汗,貌似我在翻译Typo的RSpec.Stop,看到觉得不错的再分享.</p>

<p>text_field的placeholder属性挺不错的,输入提示用的,获取到光标时自动隐藏.不过是HTML5特性</p>

<p>generate_password方法用的upto,其实times实现更优美.</p>

<div class="highlight"><pre><code class="ruby"><span class="mi">1</span><span class="o">.</span><span class="n">upto</span><span class="p">(</span><span class="mi">7</span><span class="p">)</span> <span class="p">{</span> <span class="o">|</span><span class="n">i</span><span class="o">|</span> <span class="n">newpass</span> <span class="o">&lt;&lt;</span> <span class="n">chars</span><span class="o">[</span><span class="nb">rand</span><span class="p">(</span><span class="n">chars</span><span class="o">.</span><span class="n">size</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">]</span> <span class="p">}</span> 
</code></pre>
</div>


<p>新</p>

<div class="highlight"><pre><code class="ruby"><span class="mi">7</span><span class="o">.</span><span class="n">times</span> <span class="p">{</span> <span class="n">newpass</span> <span class="o">&lt;&lt;</span> <span class="n">chars</span><span class="o">[</span><span class="nb">rand</span><span class="p">(</span><span class="n">chars</span><span class="o">.</span><span class="n">size</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">]</span> <span class="p">}</span> 
</code></pre>
</div>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[博客有新家了]]></title>
    <link href="http://www.mangege.com//2012/01/01/bo-ke-you-xin-jia-liao.html"/>
    <updated>2012-01-01T22:52:00+08:00</updated>
    <id>http://www.mangege.com//2012/01/01/bo-ke-you-xin-jia-liao</id>
    <content type="html"><![CDATA[<p>重新为自己的博客启用独立域名,其实一两年前用WordPress写过博客,但由于换空间以当时的技术觉得迁移数据麻烦,就转到iteye.</p>

<p>经朋友介绍了解了Jekyll,觉得挺不错的.有以下几点好处:</p>

<ol>
<li>不需要数据库,数据直接保存为文件,管理可以用版本软件,存到免费的代码托管. 如githu, google code.</li>
<li>可以直接把页面托管到git pages,不需要自己维护主机,还支持绑定域名. 我的博客现在就托管要github pages,你可以用ping命令验证一下.</li>
<li>够简单,写文章的时候直接用vim,还支持markdown等标识语言.</li>
</ol>


<p>对我来说主要有这三个优点,缺点也是有的.</p>

<ol>
<li>熟悉Jekyll的功能需要一定时间,以前用的都是基于界面录入的,换成生成页面的有些思维还真没有转换过来.</li>
<li>模板写起来有点麻烦,用的是 Liquid 模板引擎,需要熟悉.</li>
<li>很多功能都要写插件, 比如文章摘要,分类列表页生成. 不过这些功能 octopress 都已经实现了,可以直接参考.</li>
<li>搜索只能依赖第三方搜索,用google的site参数.</li>
</ol>


<p>这些缺点随着时间的推移和个人学习进步,有些反而会变成优点.<br/>
这一次,不管什么原因,都不需要再搬家了.</p>
]]></content>
  </entry>
  
</feed>

