<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>lllyq</title>
    <description></description>
    <link>http://lllyq.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>Rlayout，erb定义layout, 支持field tag的主题模板（类似struts2）</title>
        <author>lllyq</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lllyq.javaeye.com">lllyq</a>&nbsp;
          链接：<a href="http://lllyq.javaeye.com/blog/190150" style="color:red;">http://lllyq.javaeye.com/blog/190150</a>&nbsp;
          发表时间: 2008年05月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://rubyforge.org/frs/?group_id=6192&release_id=23306" target="_blank">http://rubyforge.org/frs/?group_id=6192&release_id=23306</a><br /><br />Rails Layout Extension, release 0.3.3 (Jun. 2008)<br /><br />Feature<br />=======<br />1. simplifying content_for usage by extracting key/value pair from content_for data like YAML and setting them as content_for variables<br />   简化content_for的使用，采用类似YAML的key/value方式定义content_for变量<br />2. let erb file can determine layout by changing the default behavior of layout determining, just like java's sitemesh<br />   通过改变默认的layout获取方式，使erb也可以定义layout，类似java的sitemesh<br />3. use controller method if helper method requested from erb not exists<br />   ERB请求helper的方法不存在，则自动调用controller的方法<br />4. support theme template for field tag<br />   支持field tag的主题模板<br /><br />Setup<br />=======<br />1. rlayout as gem<br />put the following line into your rails initializer, or bottom of environment.rb<br />把下列这行代码加到rails的initializer里，或者environment.rb的最后<br />require 'rlayout'<br /><br />2. rlayout as plugin<br />nothing need to do<br />不需要做什么了<br /><br />Usage<br />=======<br /><br />1. simplifying content_for<br /><br />&lt;% content_for :config do %><br />title: This is my title<br />panel: This is my panel<br />&lt;% end %> <br /><br />that will do the same thing as the following:<br /><br />&lt;%- content_for :title do -%><br />This is my title<br />&lt;%- end -%> <br />&lt;%- content_for :panel do -%><br />This is my panel<br />&lt;%- end -%> <br /><br />2. determining layout in erb file<br />&lt;% content_for :config do %><br />#note：key layout won't be transferred to a content_for variable, it is only used to determine a view layout<br />layout: happy<br />&lt;% end %> <br /><br />3. use theme template of field tag<br /><br />class YourController<br />  form_theme :xhtml<br />end<br /><br />and see related code in folder "example/templates", the theme can be defined in tag with :theme, that will override theme definition in controller<br /><br />Copyright (c) 2008 Leon Li, released under the MIT license
          <br/>
          <span style="color:red;">
            <a href="http://lllyq.javaeye.com/blog/190150#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 06 May 2008 13:00:35 +0800</pubDate>
        <link>http://lllyq.javaeye.com/blog/190150</link>
        <guid>http://lllyq.javaeye.com/blog/190150</guid>
      </item>
      <item>
        <title>ruby mixin的硬伤</title>
        <author>lllyq</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lllyq.javaeye.com">lllyq</a>&nbsp;
          链接：<a href="http://lllyq.javaeye.com/blog/187998" style="color:red;">http://lllyq.javaeye.com/blog/187998</a>&nbsp;
          发表时间: 2008年04月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天执行一个页面的的时候发现日志输出了50行的"==> Got Users::User from cache. (0.00000)"，觉得很奇怪，没有请求这么多次user啊，分析到后面发现原来是gettext跟cache_fu着两个插件的冲突引起的<br /><br />他们的方法都是mixin到model中调用，都有一个cache?的方法，gettext的是判断是否cache i18n message，cache_fu的是判断是否cache model，结果gettext的cache?被cache_fu的cache?覆盖了，gettext内部调用了多次cache?就出现了上述的症状，虽然执行结果正常，但背后的行为跟期望的已经是大相径庭了，而且这样的情况还无法通过test来检查，这里要不是默认打开cache_fu的benchmark，根本就不知道问题所在<br /><br />这样用mixin的时候都要小心了，不知道还有多少隐患，估计ruby以后应该会有相应的解决方案，例如在mixin的时候检查同名方法并产生警告<br />也给一个写module的建议，只暴露必要的方法，内部的调用还是用一个专有namespace分开
          <br/>
          <span style="color:red;">
            <a href="http://lllyq.javaeye.com/blog/187998#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 29 Apr 2008 12:11:28 +0800</pubDate>
        <link>http://lllyq.javaeye.com/blog/187998</link>
        <guid>http://lllyq.javaeye.com/blog/187998</guid>
      </item>
      <item>
        <title>Ruby元编程 打破private protected限制</title>
        <author>lllyq</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lllyq.javaeye.com">lllyq</a>&nbsp;
          链接：<a href="http://lllyq.javaeye.com/blog/183473" style="color:red;">http://lllyq.javaeye.com/blog/183473</a>&nbsp;
          发表时间: 2008年04月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          需求源于分离职责, 对一些涉及多个model的业务，专门分出一个service层来负责，一个service的方法就是装配不同model提供的方法，这些model的方法应该只能被service调用，而不能被controller调用，那就将这些方法设置为private或者protected（绝对限制是做不到的，起码跟普通方法有所区别，不能直接调用），外部只能用send来调用，但如果调用多的话，一是难看且麻烦，二是影响性能，那就meta programming一下吧<br /><br />思路是动态产生调用者类的子类，然后委托该子类调用父类的private或protected方法，如果调用者是单件类(metaclass)的话那就到此结束了，但如果是实例，调用private方法还是不行，那就是保存实例到子类对象中，同时打开实例类，生成private方法的一个代理，然后子类调用保存的实例调用代理方法，代码与例子如下<br /><br /><pre name="code" class="ruby">
=begin
Example:

class A
  class &lt;&lt; self
    private
    def t1
    "t1"
    end
  end

  def initialize(a = nil)
    @a = a
  end
  private
  def t1
    @a
  end
end


A.extend(BreakProtect) #or class A; include BreakProtect; end
p A.break_protect.t1
p A.new("leon").break_protect.t1 # or for reuse, a = A.new("leon").break_protect; a.t1
=end

module BreakProtect
  def self.extended(obj)
    set_sub(obj)
  end
  def self.included(obj)
    set_sub(obj)
  end
  def self.set_sub(obj)
    obj.class_eval %{
    class #{obj.to_s}_Sub &lt; #{obj.to_s}
      def initialize(parent)
        @parent = parent
      end
      def self.method_missing(method_id, *args)
        class_eval %\{
                    def self.#\{method_id\}(*args)
                      @parent.nil? ? super : @parent.#\{method_id\}
                    end
                  \}
                  send(method_id, *args)
      end
      def method_missing(method_id, *args)
        if private_methods.include?(method_id.to_s)
          instance_eval %\{
                      class ::#{obj.to_s}
                        def #\{method_id\}_to_protect(*args)
                          #\{method_id\}
                        end
                        protected :#\{method_id\}
                      end
                      def #\{method_id\}(*args)
                        if @parent.nil?
                          super
                        else
                          @parent.#\{method_id\}_to_protect
                        end
                      end
                    \}
        else
          instance_eval %\{
                      def #\{method_id\}(*args)
                        @parent.nil? ? super : @parent.#\{method_id\}
                      end
                    \}
        end
        send(method_id, *args)
      end
    end
    def break_protect
      #{obj.to_s}_Sub.new(self)
    end
    def self.break_protect
      #{obj.to_s}_Sub
    end
  }
  end
end
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://lllyq.javaeye.com/blog/183473#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 16 Apr 2008 17:34:18 +0800</pubDate>
        <link>http://lllyq.javaeye.com/blog/183473</link>
        <guid>http://lllyq.javaeye.com/blog/183473</guid>
      </item>
      <item>
        <title>解决Rcov报告仅能列出被Rspec测试调用过的文件</title>
        <author>lllyq</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lllyq.javaeye.com">lllyq</a>&nbsp;
          链接：<a href="http://lllyq.javaeye.com/blog/174602" style="color:red;">http://lllyq.javaeye.com/blog/174602</a>&nbsp;
          发表时间: 2008年03月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          ruby的框架确实还很不成熟（这点确实不比java爽），不废话，在某个initializer中加入如下代码<br /><pre name="code" class="ruby">
#这里写你要包含的目录
RCOV_APPS_FILES = [/app[\/\\][^\.]+\.rb/]
require 'rcov'
class Rcov::CodeCoverageAnalyzer
  alias_method(:old_dump_coverage_info, :dump_coverage_info) unless method_defined?(:old_dump_coverage_info)
  def dump_coverage_info(formatters)
    all_files = []
    require 'find'

    Find.find(RAILS_ROOT) do |path|
      Find.prune if path.index(".svn") || path.index(".cvs")
      RCOV_APPS_FILES.each do |r|
        if path =~ r
          all_files &lt;&lt; path
          break
        end
      end
    end
    all_files.each do |file|
      formatters.each do |formatter|
        lines = File.read(file).split("\n")
        coverage = lines.collect{|i| false}
        counts = coverage.collect{|i| 0}
        formatter.add_file(file, lines, coverage, counts)
      end
    end
    
    old_dump_coverage_info(formatters)
  end
end
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://lllyq.javaeye.com/blog/174602#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 21 Mar 2008 18:55:48 +0800</pubDate>
        <link>http://lllyq.javaeye.com/blog/174602</link>
        <guid>http://lllyq.javaeye.com/blog/174602</guid>
      </item>
      <item>
        <title>插件rquerypad, 简化查询参数 增强关联查询能力</title>
        <author>lllyq</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lllyq.javaeye.com">lllyq</a>&nbsp;
          链接：<a href="http://lllyq.javaeye.com/blog/173464" style="color:red;">http://lllyq.javaeye.com/blog/173464</a>&nbsp;
          发表时间: 2008年03月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://code.google.com/p/rquerypad/" target="_blank">http://code.google.com/p/rquerypad/</a><br />目前支持rails 2.0， rails 1.2(部分2.0 方式的查询))（谢谢Quake的测试及建议）<br /><br />Simplify query options with association automation and improve inner join for activerecord of rails<br />字段名包含关联信息，不需额外再写include或者joins<br />原来activerecord仅支持inner join在最后，现在没有这个限制<br /><br />不想用svn，直接下载可以到 <a href="https://rubyforge.org/projects/rquerypad/" target="_blank">https://rubyforge.org/projects/rquerypad/</a><br /><br /><strong>Feature</strong><br />=======<br />1. single name string decribe associations<br />2. support to mix inner join and outer join with any order<br />3. auto remove duplicated joins from other association in different depth<br />4. support :conditions, :order, :group<br />5. auto merge to original :include, :joins<br /><br /><strong>Install</strong><br />=======<br />ruby script/plugin install http://rquerypad.googlecode.com/svn/trunk/rquerypad<br /><br /><strong>Example</strong><br />=======<br />suppose the asscociations of User &lt;-> Thread &lt;-> Reply is 1:N:N<br /><br /><pre name="code" class="ruby">
@users = User.find(:all, :group => ["threads.created_at", "name"])
generate:
[:all, {:group=>"threads.created_at, users.name", :include=>[:threads]}]

@users = User.find(:all, :conditions => ["threads_.replies.title = ?",
"rquerypad"])
generate:
[:all, {:inner_joins=>["threads"], :conditions=>["replies.title = ?", "rquerypad"], :include=>[{:threads=>:replies}]}]
#note: the :inner_joints is processed by rquerypad before sending sql to database

@users = User.find(:all, :conditions => ["threads.replies.title = ? and threads.id = ?", "rquerypad", 1])
generate:
[:all, {:conditions=>["replies.title = ? and threads.id = ?", "rquerypad", 1], :include=>[{:threads=>:replies}]}]
#note: single "threads" was removed from includes</pre><br /><br /><strong>Setup</strong><br />=======<br />#to set debug model, in rails initialized script<br />$RQUERYPAD_DEBUG = true<br /><br />#to support rails 1.2.6, in rails initialized script, such as environment.rb<br />#default support rails 2.0<br />$RQUERYPAD_RAILS = "1.2"<br /><br /><br /><strong>Test</strong><br />=======<br />Note: current migrate script works only in rails 2.0<br /><br />1.Prepare<br /><br />the test depends on sqlite3 database, the following code should be add into your database.yml and place rquerypad.rb(copy from test.rb) in config/environment<br /><br />rquerypad:<br />  adapter: sqlite3<br />  database: vendor/plugins/rquerypad/test/db.rquerypad<br />  timeout: 5000<br /><br />2.database migrate<br /><br />execute the following script<br /><br />rake migrate<br /><br />3.start test<br /><br />execute the following script<br />rake
          <br/>
          <span style="color:red;">
            <a href="http://lllyq.javaeye.com/blog/173464#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 18 Mar 2008 17:11:40 +0800</pubDate>
        <link>http://lllyq.javaeye.com/blog/173464</link>
        <guid>http://lllyq.javaeye.com/blog/173464</guid>
      </item>
      <item>
        <title>基于hibernate的开源通用查询框架 －－ bba96介绍</title>
        <author>lllyq</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lllyq.javaeye.com">lllyq</a>&nbsp;
          链接：<a href="http://lllyq.javaeye.com/blog/101285" style="color:red;">http://lllyq.javaeye.com/blog/101285</a>&nbsp;
          发表时间: 2007年07月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-family: Arial;"><strong><span style="font-family: Arial;">新开bba96圈子 <a href="http://bba96.group.javaeye.com/">http://bba96.group.javaeye.com/</a>
</span>
</strong>
</span>
</p>
<p><span style="font-family: Arial;"><strong>bba96</strong>
 框架当前版本 2.2，包含：</span>
</p>
<p><span style="font-family: Arial;"><strong>bba96-core</strong>
 核心框架，封装Hibernate Criteria，提供方便的查询以及分页支持，查询参数</span>
</p>
<p><span style="font-family: Arial;"><strong>bba96-struts</strong>
 基于Struts2的开发框架，依赖core，提供便捷的CRUD以（分页支持），通过设置form的参数就可以实现复杂的分页查询</span>
</p>
<p><span style="font-family: Arial;"><strong>bba96-security</strong>
 安全框架，依赖core，借助core query的简捷实现数据权限（未更新）</span>
</p>
<p><span style="font-family: Arial;">项目主页：<a href="http://bba96.dev.java.net">http://bba96.dev.java.net</a>
<br />
<strong>bba96</strong>
下载：<a href="https://bba96.dev.java.net/servlets/ProjectDocumentList?folderID=7768&amp;expandFolder=7768&amp;folderID=7768">https://bba96.dev.java.net/servlets/ProjectDocumentList?folderID=7768&amp;expandFolder=7768&amp;folderID=7768</a>
</span>
</p>
<p>
<span style="font-family: Arial;">或者在圈子里下载：</span>
<a href="http://bba96.group.javaeye.com/group/share" target="_blank">http://bba96.group.javaeye.com/group/share</a>
</p>
<p><span style="font-family: Arial;"><strong>如何使用bba96</strong>
</span>
</p>
<p><span style="font-family: Arial;"><strong>1. bba96-core查询例子(未完)</strong>
</span>
</p>
<p><span style="font-family: Arial;"><img src="../../../upload/picture/pic/4334/cb8a9ec2-6cb0-4e41-b063-2f7c509ba711.gif" alt="" />
<br />
对象关系如上图 Teacher-Group, Group-Student, Student-Exercise分别是one-to-many关系，Teacher-Student 则是many-to-many的关系</span>
</p>
<p>&nbsp;java代码显示有问题，还是上图吧</p>
<p><img src="../../../upload/picture/pic/4353/7e556e21-17c7-4a37-a24c-12e2bdfa54d0.gif" alt="" />
<br />
<img src="../../../upload/picture/pic/4355/e1015fe6-016a-4594-9dd8-6db2bdcaf799.gif" alt="" />
<br />
<img src="../../../upload/picture/pic/4356/94b7c144-d4e5-4abb-b3a5-7eca17d9de17.gif" alt="" />
<br />
<img src="../../../upload/picture/pic/4357/2918242b-059e-4db2-8415-8ae80742e8a2.gif" alt="" />
<br />
<img src="../../../upload/picture/pic/4358/4918683b-30fd-422a-8792-77f5e0a91e22.gif" alt="" />
<br />
<img src="../../../upload/picture/pic/4359/7497f85c-d3a0-4d3d-aeb1-49f948491e73.gif" alt="" />
<br />
优势在于 <br />
1. 分页信息的支持（自动count相应条件的total count） <br />
2. 查询字段简化，不用关心关联信息，包括Projections中的order, groupby都可以用 <br />
对exercise的查询，伪码如 where student:s.group:g.level = 3 and student:s.teacher:t.name = 'wang' order by stduent:s.name 这里面有很多个关联，跟hql/sql相比，bba96 query 更面向对象，你只需要关心业务逻辑 <br />
3. 统一的查询入口，包括统一的查询参数结构，全面hql/sql的parse还是比较困难的，而bba96的query结构比较简单(复杂的都封装起来了)，你可以运行期重构query，会用aop的同学应该有很多想像空间，例如数据权限</p>
<p>注：2.3.0版本已加入安全框架（2007-10）</p>
          <br/>
          <span style="color:red;">
            <a href="http://lllyq.javaeye.com/blog/101285#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 15 Jul 2007 14:04:32 +0800</pubDate>
        <link>http://lllyq.javaeye.com/blog/101285</link>
        <guid>http://lllyq.javaeye.com/blog/101285</guid>
      </item>
  </channel>
</rss>