<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>星星之火 可以燎原</title>
    <description></description>
    <link>http://liuqiang.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>用restful_authentication和role_requirement搭建验证授权系统</title>
        <author>liuqiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://liuqiang.javaeye.com">liuqiang</a>&nbsp;
                    链接：<a href="http://liuqiang.javaeye.com/blog/248272" style="color:red;">http://liuqiang.javaeye.com/blog/248272</a>&nbsp;
          发表时间: 2008年09月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="blog_content">转自 <a href="http://fanix.javaeye.com/blog/177508">http://fanix.javaeye.com/blog/177508</a></div>
<div class="blog_content">用rails做验证和授权系统并不复杂，但通过安装插件的方式可以减少重复劳动。 <br /><span style="color: #ffa500;"><strong><span class="hilite1"><span style="background-color: #ffff00;">restful_authentication</span></span></strong></span>是一个验证系统，支持rails2.0，提供了简单的用户注册登录注销、简单的验证等功能。 <br /><span style="color: #d2691e;"><strong>role_requirement</strong></span>是授权系统，能和<span class="hilite1"><span style="background-color: #ffff00;">restful_authentication</span></span>很好的结合，该插件提供了授权的基本实现。 <br /><br /><strong>安装和配置：</strong> <br />步骤1：安装<span class="hilite1"><span style="background-color: #ffff00;">restful_authentication</span></span> <br />命令行下： <br /><br />ruby script/plugin install http://svn.techno-weenie.net/projects/plugins/<span class="hilite1"><span style="background-color: #ffff00;">restful_authentication</span></span>/ <br />ruby script/generate authenticated user sessions <br /><br />第一步是安装插件。第二步生成文件，里面的user代表生成的模型的名称，可选&ndash;include-activation参数决定是否生成向新注册用户发送激活码的代码。 <br /><br />步骤2：安装role_requirement <br /><br />ruby script/plugin install http://rolerequirement.googlecode.com/svn/tags/role_requirement/ <br />ruby script/generate roles Role User <br /><br />第一步安装插件，第二步是生成文件结构并设置角色和用户之间的多对多关系。 <br /><br />这样，两个插件就基本安装配置完了，还需要修改一些东西： <br /><br />1、由于一开始生成的<span class="hilite1"><span style="background-color: #ffff00;">restful_authentication</span></span>的模型是user，在user.rb模型文件里，注释掉&ldquo;attr_protected :roles&rdquo;，因为会和&ldquo;attr_accessible&rdquo;发生冲突（这两个方法是黑名单和白名单的作用，只能用一个）。 <br /><br />2、可以在路由配置里加入： <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a href="http://fanix.javaeye.com/blog/177508" title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"><img src="http://fanix.javaeye.com/images/icon_copy.gif" alt="复制代码" /></a></div>
</div>
<ol class="dp-j">
<li><span><span>map.signup&nbsp;</span><span class="string"><span style="color: #0000ff;">'/signup'</span></span><span>,&nbsp;:controller&nbsp;=&gt;&nbsp;</span><span class="string"><span style="color: #0000ff;">'users'</span></span><span>,&nbsp;:action&nbsp;=&gt;&nbsp;</span><span class="string"><span style="color: #0000ff;">'new'</span></span><span>&nbsp;&nbsp;</span></span></li>
<li><span>map.login&nbsp;</span><span class="string"><span style="color: #0000ff;">'/login'</span></span><span>,&nbsp;:controller&nbsp;=&gt;&nbsp;</span><span class="string"><span style="color: #0000ff;">'sessions'</span></span><span>,&nbsp;:action&nbsp;=&gt;&nbsp;</span><span class="string"><span style="color: #0000ff;">'new'</span></span><span>&nbsp;&nbsp;</span></li>
<li><span>map.logout&nbsp;</span><span class="string"><span style="color: #0000ff;">'/logout'</span></span><span>,&nbsp;:controller&nbsp;=&gt;&nbsp;</span><span class="string"><span style="color: #0000ff;">'sessions'</span></span><span>,&nbsp;:action&nbsp;=&gt;&nbsp;</span><span class="string"><span style="color: #0000ff;">'destroy'</span></span><span>&nbsp;&nbsp;</span></li>
</ol></div>
<pre name="code" class="java">map.signup '/signup', :controller =&gt; 'users', :action =&gt; 'new'
map.login '/login', :controller =&gt; 'sessions', :action =&gt; 'new'
map.logout '/logout', :controller =&gt; 'sessions', :action =&gt; 'destroy'</pre>
<br />然后在模板里加入： <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a href="http://fanix.javaeye.com/blog/177508" title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"><img src="http://fanix.javaeye.com/images/icon_copy.gif" alt="复制代码" /></a></div>
</div>
<ol class="dp-j">
<li><span><span>&lt;%&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055;">if</span></strong></span><span>&nbsp;logged_in?&nbsp;%&gt;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&lt;p&gt;&lt;strong&gt;你以&lt;%=h&nbsp;current_user.login&nbsp;%&gt;的身份登录&lt;/strong&gt;&lt;/p&gt; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&lt;p&gt;&lt;%=&nbsp;link_to&nbsp;</span><span class="string"><span style="color: #0000ff;">'注销'</span></span><span>,&nbsp;logout_path&nbsp;%&gt;&lt;/p&gt; &nbsp;&nbsp;</span></li>
<li><span>&lt;%&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055;">else</span></strong></span><span>&nbsp;%&gt; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&lt;p&gt;&lt;strong&gt;你还没有登录。&lt;/strong&gt;&lt;/p&gt; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&lt;p&gt; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;%=&nbsp;link_to&nbsp;</span><span class="string"><span style="color: #0000ff;">'登录'</span></span><span>,&nbsp;login_path&nbsp;%&gt;&nbsp;or &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;%=&nbsp;link_to&nbsp;</span><span class="string"><span style="color: #0000ff;">'注册'</span></span><span>,&nbsp;signup_path&nbsp;%&gt; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&lt;/p&gt; &nbsp;&nbsp;</span></li>
<li><span>&lt;%&nbsp;end&nbsp;%&gt;&nbsp;&nbsp;</span></li>
</ol></div>
<pre name="code" class="java">&lt;% if logged_in? %&gt;   
  &lt;p&gt;&lt;strong&gt;你以&lt;%=h current_user.login %&gt;的身份登录&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;&lt;%= link_to '注销', logout_path %&gt;&lt;/p&gt;
&lt;% else %&gt;
  &lt;p&gt;&lt;strong&gt;你还没有登录。&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;
    &lt;%= link_to '登录', login_path %&gt; or
    &lt;%= link_to '注册', signup_path %&gt;
  &lt;/p&gt;
&lt;% end %&gt;</pre>
<br />看，我们的验证插件已经很好工作了。 <br /><br />注：如果需要更强大验证功能，可查看：http://www.rubyplus.org/episodes/20-Extended-RESTful-Authentication-Rails-2-App.html，这个增强版的插件包含了邮件激活、修改密码、忘记密码等功能。但是修改密码和忘记密码存在安全隐患，请修改后使用。 <br /><br />3、由于role_requirement插件生成的文件不全，可以用scaffold命令重新生成role的缺失文件。在role.rb里加上了has_and_belongs_to_many :users。scaffold好后，添加一个新的角色&ldquo;admin&rdquo;，然后通过调用&ldquo;role.users&rdquo;来给&ldquo;admin&rdquo;添加成员。这样我们就可以来使用require_role方法来授权，这个方法比较强大。 <br /><br />如在控制器前添加： <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a href="http://fanix.javaeye.com/blog/177508" title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"><img src="http://fanix.javaeye.com/images/icon_copy.gif" alt="复制代码" /></a></div>
</div>
<ol class="dp-j">
<li><span><span>require_role&nbsp;</span><span class="string"><span style="color: #0000ff;">"admin"</span></span><span>&nbsp;&nbsp;</span></span></li>
</ol></div>
<pre name="code" class="java">require_role "admin"</pre>
<br /><br />注意：如果需要在Role和User的连接表添加更详细的内容，则不适合使用roles_users连接表，可新建模型并通过through方法连接User和Role。 </div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://liuqiang.javaeye.com/blog/248272#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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, 30 Sep 2008 21:20:38 +0800</pubDate>
        <link>http://liuqiang.javaeye.com/blog/248272</link>
        <guid>http://liuqiang.javaeye.com/blog/248272</guid>
      </item>
          <item>
        <title>Rails中html_escape和sanitize</title>
        <author>liuqiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://liuqiang.javaeye.com">liuqiang</a>&nbsp;
                    链接：<a href="http://liuqiang.javaeye.com/blog/247040" style="color:red;">http://liuqiang.javaeye.com/blog/247040</a>&nbsp;
          发表时间: 2008年09月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div>转自：<a href="http://blackanger.blog.51cto.com/140924/29018">http://blackanger.blog.51cto.com/140924/29018</a></div>
<div><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一般来说，通常使用input的field都会做一些filter的动作，避免被不怀好意之徒塞一些危险的 HTML code（script等）进去搞破坏。在ROR中，我们在前面加一个h()（一般不用括号？不容易看到？）即可，h在ROR中起什么作用呢？它是 html_escape的alias（别名）,它会将所有的"&lt;xx&gt;"变成&amp;lt；,&amp;gt，比如:<br />js 代码<span><span>&lt;script&gt;alert('a');&lt;/script&gt;</span></span>会变成：&nbsp;&nbsp;&nbsp; &amp;lt;script&amp;gt;alert('a');&amp;lt;/script&amp;gt;<br />这样就完全做不了乱了。因为所有的tag都被搞掉了。这样太严格了，有时候我们需要开放一些字体，颜色等tag给用户使用，用h()就不行了，正好ROR中还有个方法，sanitize()这个方法可以帮你实现这个愿望。ROR API中：</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sanitizes the given HTML by making form and script tags into regular text, and removing all "onxxx" attributes (so that arbitrary Javascript cannot be executed). Also removes href attributes that start with "javascript:".<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 它会砍掉script这个tag，以及onXxxx之类的attribut，你没有机会执行javascript，但是你还可以塞一些div或iframe之类的tag让你的版面烂掉。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所以我们需要自定义一个html filter，可以自由的指定我们放行的那些tag。网上发现了这个sanitize.rb，完美的帮我们实现愿望。如何使用：</div>
<div>第一行：</div>
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter"><ol class="dp-rb">
<li class="alt"><span><span class="keyword">def</span><span> sanitize( html, okTags='a href, b, br, i, p' )&nbsp;&nbsp;</span></span> </li>
</ol></div>
<div>okTags代表就是允许的tag，目前有a,b,br,i,p之类的tag，如果输入&lt;iframe&gt;xxx&lt;/iframe&gt;之类的不允许的code，就会出现</div>
<div>xxx.不允许的结果都将被砍掉。如果想增加span,或font这样的tag，则可以：</div>
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter"><ol class="dp-rb">
<li class="alt"><span><span class="keyword">def</span><span> sanitize( html, okTags='a href, b, br, i, p, span, font' )&nbsp;&nbsp;</span></span> </li>
</ol></div>
<div><br />a href之间没有用逗号隔开，是代表sanitize允许a这个tag使用href这个attribute，比如：</div>
<div>&lt;a href="<a href="http://blackanger.javaeye.com/" target="_blank">http://blackanger.javaeye.com</a>" _fcksavedurl="http://lightyror.blogspot.com" target="_blank"&gt;Haha&lt;/a&gt;</div>
<div>只会出现： &lt;a href=<a href="http://blackanger.javaeye.com/" target="_blank">http://blackanger.javaeye.com</a>&gt;Haha&lt;/a&gt;，只有href这个属性可以保留，其他的被无情的砍掉。当我们输入这样的代码：</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;a href=<a href="http://blackanger.javaeye.com/" target="_blank">http://blackanger.javaeye.com</a>&gt;Haha</div>
<div>会自动帮你补齐tag：</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;a href=<a href="http://blackanger.javaeye.com/" target="_blank">http://blackanger.javaeye.com</a>&gt;Haha&lt;/a&gt;<br /><br />Put the following code in your helper:<br />#<br /># $Id: sanitize.rb 3 2005-04-05 12:51:14Z dwight $<br />#<br /># Copyright (c) 2005 Dwight Shih<br /># A derived work of the Perl version:<br /># Copyright (c) 2002 Brad Choate, bradchoate.com<br /># <br /># Permission is hereby granted, free of charge, to<br /># any person obtaining a copy of this software and<br /># associated documentation files (the "Software"), to<br /># deal in the Software without restriction, including<br /># without limitation the rights to use, copy, modify,<br /># merge, publish, distribute, sublicense, and/or sell<br /># copies of the Software, and to permit persons to<br /># whom the Software is furnished to do so, subject to<br /># the following conditions:<br /># <br /># The above copyright notice and this permission<br /># notice shall be included in all copies or<br /># substantial portions of the Software.<br /># <br /># THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY<br /># OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT<br /># LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br /># FITNESS FOR A PARTICULAR PURPOSE AND<br /># NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR<br /># COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES<br /># OR OTHER LIABILITY, WHETHER IN AN ACTION OF<br /># CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF<br /># OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR<br /># OTHER DEALINGS IN THE SOFTWARE.<br />#<br /><br />def sanitize( html, okTags='a href, b, br, i, p' )<br /># no closing tag necessary for these<br />soloTags = ["br","hr"]<br /><br /># Build hash of allowed tags with allowed attributes<br />tags = okTags.downcase().split(',').collect!{ |s| s.split(' ') }<br />allowed = Hash.new<br />tags.each do |s|<br />&nbsp;&nbsp;&nbsp; key = s.shift<br />&nbsp;&nbsp;&nbsp; allowed[key] = s<br />end<br /><br /># Analyze all &lt;&gt; elements<br />stack = Array.new<br />result = html.gsub( /(&lt;.*?&gt;)/m ) do | element |<br />&nbsp;&nbsp;&nbsp; if element =~ /\A&lt;\/(\w+)/ then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # &lt;/tag&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tag = $1.downcase<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if allowed.include?(tag) &amp;&amp; stack.include?(tag) then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # If allowed and on the stack<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Then pop down the stack<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = stack.pop<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out = "&lt;/#{top}&gt;"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; until top == tag do<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top = stack.pop<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out &lt;&lt; "&lt;/#{top}&gt;"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<br />&nbsp;&nbsp;&nbsp; elsif element =~ /\A&lt;(\w+)\s*\/&gt;/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # &lt;tag /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tag = $1.downcase<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if allowed.include?(tag) then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "&lt;#{tag} /&gt;"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<br />&nbsp;&nbsp;&nbsp; elsif element =~ /\A&lt;(\w+)/ then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # &lt;tag ...&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tag = $1.downcase<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if allowed.include?(tag) then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ! soloTags.include?(tag) then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stack.push(tag)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if allowed[tag].length == 0 then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # no allowed attributes<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "&lt;#{tag}&gt;"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # allowed attributes?<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out = "&lt;#{tag}"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ( $' =~ /(\w+)=("[^"]+")/ )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attr = $1.downcase<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; valu = $2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if allowed[tag].include?(attr) then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out &lt;&lt; " #{attr}=#{valu}"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out &lt;&lt; "&gt;"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<br />&nbsp;&nbsp;&nbsp; end<br />end<br /><br /># eat up unmatched leading &gt;<br />while result.sub!(/\A([^&lt;]*)&gt;/m) { $1 } do end<br /><br /># eat up unmatched trailing &lt;<br />while result.sub!(/&lt;([^&gt;]*)\Z/m) { $1 } do end<br /><br /># clean up the stack<br />if stack.length &gt; 0 then<br />&nbsp;&nbsp;&nbsp; result &lt;&lt; "&lt;/#{stack.reverse.join('&gt;&lt;/')}&gt;"<br />end<br /><br />result<br />end</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://liuqiang.javaeye.com/blog/247040#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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>Fri, 26 Sep 2008 13:33:02 +0800</pubDate>
        <link>http://liuqiang.javaeye.com/blog/247040</link>
        <guid>http://liuqiang.javaeye.com/blog/247040</guid>
      </item>
          <item>
        <title>对WebGame行业的一点看法</title>
        <author>liuqiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://liuqiang.javaeye.com">liuqiang</a>&nbsp;
                    链接：<a href="http://liuqiang.javaeye.com/blog/245284" style="color:red;">http://liuqiang.javaeye.com/blog/245284</a>&nbsp;
          发表时间: 2008年09月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 之前不怎么上校内，但最近很多同事喜欢泡校内，我好奇的去看了下他们在干嘛？难道是写博客？最后发现主要是玩抢车位之类的游戏，当然还有很多类似的WebGame，给我的感觉是WebGame现在已无处不在。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 记得前几年以博客、视频、社区为代表的WEB2.0风潮逐渐席卷整个中国互联网行业以来，&ldquo;创新&rdquo;和&ldquo;互动&rdquo;这两个概念已经成为互联网发展必不可少的因素。无数新型社区网站也开始风潮涌动。但是缺少成熟的商业模式、缺乏直接的赢利点，这让许多社区类的互联网企业面临生死的考验。WebGame犹如一支强心剂，让互联网企业继网络游戏、无线增值、电子商务、网络营销之后又看到了一种新的盈利希望，特别是为有着高粘着度、商业模式却不明朗的SNS社区带来了盈利新模式。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在大型的客户端网游兴起之前，正真意义上的WebGame从文字MUD的废墟上开始发芽，当年在网络泡沫经济的推动下，国内涌现了不少规模较大的WebGame.例如《第九城市》、《逸飞岭》等，以及活跃在各信息港的不同版本的《笑傲江湖》。它们是国内第一批基于Web浏览器而产生的WebGame。对于这些WebGame，玩家不需要投入大量时间与精力，不需要每天重复着枯燥打怪练级，很快就在玩家群体得到了很大反响。《天空左岸》等早一批上线的WebGame得到空前成功，也为后来者成功开辟整体市场环境和道路。于是很多研发商以及运营商都开始涉足WebGame市场，试图在早期时候能迅速占领市场，并且能快速盈利或者满足其他条件。但是新市场里除了充满了机遇之外，同样也潜藏着更多挑战。 </p>
<p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于产品研发，WebGame不同于网络游戏或者大型的单机游戏，研发周期相对短的多，而且其他方面的成本也比较小，几个人的小团队基本上几个月就能开发出一款游戏。这是WebGame优势，也可以说是WebGame劣势。门槛的降低，使得很多人都能参与到行业竞争中，对于扩大行业市场有很大帮助，但是也很容易造成行业内产品质量参差不齐，恶性竞争等问题。当然新兴行业总是会有这样或那样问题，只有经过实践与失败积累，行业才能得到更为长足发展。如果在很长时间内，不能解决这些问题，带来可能是整个行业崩溃。</p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://liuqiang.javaeye.com/blog/245284#comments" style="color:red;">已有 <strong>3</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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>Mon, 22 Sep 2008 10:20:21 +0800</pubDate>
        <link>http://liuqiang.javaeye.com/blog/245284</link>
        <guid>http://liuqiang.javaeye.com/blog/245284</guid>
      </item>
          <item>
        <title>集合类 List/Set/Map 的区别和联系</title>
        <author>liuqiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://liuqiang.javaeye.com">liuqiang</a>&nbsp;
                    链接：<a href="http://liuqiang.javaeye.com/blog/245157" style="color:red;">http://liuqiang.javaeye.com/blog/245157</a>&nbsp;
          发表时间: 2008年09月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>Map</strong>：HashMap、HashTable <br />　　如何在它们之间选择 <br />　　<strong>一、Array ， Arrays</strong> <br />　　Java所有&ldquo;存储及随机访问一连串对象&rdquo;的做法，array是最有效率的一种。 <br />　　1、 <br />　　效率高，但容量固定且无法动态改变。 <br />　　array还有一个缺点是，无法判断其中实际存有多少元素，length只是告诉我们array的容量。 <br />　　2、Java中有一个<strong>Arrays类，专门用来操作array</strong>。 <br />　　arrays中拥有一组static函数， <br />　　equals()：比较两个array是否相等。array拥有相同元素个数，且所有对应元素两两相等。 <br />　　fill()：将值填入array中。 <br />　　sort()：用来对array进行排序。 <br />　　binarySearch()：在排好序的array中寻找元素。 <br />　　System.arraycopy()：array的复制。 <br />　　<strong>二、Collection ， Map</strong> <br />　　若撰写程序时不知道究竟需要多少对象，需要在空间不足时自动扩增容量，则需要使用容器类库，array不适用。 <br />　　<strong>1、Collection 和 Map 的区别</strong> <br />　　容器内每个为之所存储的元素个数不同。 <br />　　Collection类型者，每个位置只有一个元素。 <br />　　Map类型者，持有 key-value pair，像个小型数据库。 <br />　　<strong>2、各自旗下的子类关系</strong> <br />　　<strong>Collection</strong> <br />　　--List：将以特定次序存储元素。所以取出来的顺序可能和放入顺序不同。 <br />　　--ArrayList / LinkedList / Vector <br />　　--Set： 不能含有重复的元素 <br />　　--HashSet / TreeSet <br />　　<strong>Map</strong> <br />　　--HashMap <br />　　--HashTable <br />　　--TreeMap <br />　　<strong>3、其他特征</strong> <br />　　* List，Set，Map将持有对象一律视为Object型别。 <br />　　* Collection、List、Set、Map都是接口，不能实例化。 <br />　　继承自它们的 ArrayList, Vector, HashTable, HashMap是具象class，这些才可被实例化。 <br />　　* vector容器确切知道它所持有的对象隶属什么型别。vector不进行边界检查。 <br />　　<strong>三、Collections</strong> <br />　　<strong>Collections是针对集合类的一个帮助类。</strong>提供了一系列静态方法实现对各种集合的搜索、排序、线程完全化等操作。 <br />　　相当于对Array进行类似操作的类&mdash;&mdash;Arrays。 <br />　　如，Collections.max(Collection coll); 取coll中最大的元素。 <br />　　Collections.sort(List list); 对list中元素排序 <br />　　<strong>四、如何选择？</strong> <br />　　<strong>1、容器类和Array的区别、择取</strong> <br />　　* 容器类仅能持有对象引用（指向对象的指针），而不是将对象信息copy一份至数列某位置。 <br />　　* 一旦将对象置入容器内，便损失了该对象的型别信息。 <br />　　<strong>2、</strong> <br />　　* 在各种Lists中，最好的做法是以ArrayList作为缺省选择。当插入、删除频繁时，使用LinkedList()； <br />　　Vector总是比ArrayList慢，所以要尽量避免使用。 <br />　　* 在各种Sets中，HashSet通常优于HashTree（插入、查找）。只有当需要产生一个经过排序的序列，才用TreeSet。 <br />　　HashTree存在的唯一理由：能够维护其内元素的排序状态。 <br />　　* 在各种Maps中 <br />　　HashMap用于快速查找。 <br />　　* 当元素个数固定，用Array，因为Array效率是最高的。 <br />　　<strong>结论：最常用的是ArrayList，HashSet，HashMap，Array。</strong> <br />　　<strong>注意：</strong> <br />　　1、Collection没有get()方法来取得某个元素。只能通过iterator()遍历元素。 <br />　　2、Set和Collection拥有一模一样的接口。 <br />　　3、List，可以通过get()方法来一次取出一个元素。使用数字来选择一堆对象中的一个，get(0)...。(add/get) <br />　　4、一般使用ArrayList。用LinkedList构造堆栈stack、队列queue。 <br />　　5、Map用 put(k,v) / get(k)，还可以使用containsKey()/containsValue()来检查其中是否含有某个key/value。 <br />　　HashMap会利用对象的hashCode来快速找到key。 <br />　　<strong>* hashing</strong> <br />　　哈希码就是将对象的信息经过一些转变形成一个独一无二的int值，这个值存储在一个array中。 <br />　　我们都知道所有存储结构中，array查找速度是最快的。所以，可以加速查找。 <br />　　 <br />　　发生碰撞时，让array指向多个values。即，数组每个位置上又生成一个梿表。 <br />　　<strong>6、Map中元素，可以将key序列、value序列单独抽取出来。</strong> <br />　　使用keySet()抽取key序列，将map中的所有keys生成一个Set。 <br />　　使用values()抽取value序列，将map中的所有values生成一个Collection。 <br />　　为什么一个生成Set，一个生成Collection？那是因为，key总是独一无二的，value允许重复。 <br />　　这些都代表了Java中的集合，这里主要从其元素是否有序，是否可重复来进行区别记忆，以便恰当地使用，当然还存在同步方面的差异，见上一篇相关文章。 <br />　　有序否 允许元素重复否 <br />　　Collection 否 是 <br />　　List 是 是 <br />　　Set AbstractSet 否 否 <br />　　HashSet <br />　　TreeSet 是（用二叉树排序） <br />　　Map AbstractMap 否 使用 key-value 来映射和存储数据， Key 必须惟一， value 可以重复 <br />　　HashMap <br />　　TreeMap 是（用二叉树排序） <br />　　List 接口对Collection进行了简单的扩充，它的具体实现类常用的有ArrayList和LinkedList。你可以将任何东西放到一个List容器 中，并在需要时从中取出。ArrayList从其命名中可以看出它是一种类似数组的形式进行存储，因此它的随机访问速度极快，而LinkedList的内 部实现是链表，它适合于在链表中间需要频繁进行插入和删除操作。在具体应用时可以根据需要自由选择。前面说的Iterator只能对容器进行向前遍历，而 ListIterator则继承了Iterator的思想，并提供了对List进行双向遍历的方法。 <br />　　Set接口也是 Collection的一种扩展，而与List不同的时，在Set中的对象元素不能重复，也就是说你不能把同样的东西两次放入同一个Set容器中。它的常 用具体实现有HashSet和TreeSet类。HashSet能快速定位一个元素，但是你放到HashSet中的对象需要实现hashCode()方 法，它使用了前面说过的哈希码的算法。而TreeSet则将放入其中的元素按序存放，这就要求你放入其中的对象是可排序的，这就用到了集合框架提供的另外 两个实用类Comparable和Comparator。一个类是可排序的，它就应该实现Comparable接口。有时多个类具有相同的排序算法，那就 不需要在每分别重复定义相同的排序算法，只要实现Comparator接口即可。集合框架中还有两个很实用的公用类：Collections和 Arrays。Collections提供了对一个Collection容器进行诸如排序、复制、查找和填充等一些非常有用的方法，Arrays则是对一 个数组进行类似的操作。 <br />　　Map是一种把键对象和值对象进行关联的容器，而一个值对象又可以是一个Map，依次类推，这样就可 形成一个多级映射。对于键对象来说，像Set一样，一个Map容器中的键对象不允许重复，这是为了保持查找结果的一致性;如果有两个键对象一样，那你想得 到那个键对象所对应的值对象时就有问题了，可能你得到的并不是你想的那个值对象，结果会造成混乱，所以键的唯一性很重要，也是符合集合的性质的。当然在使 用过程中，某个键所对应的值对象可能会发生变化，这时会按照最后一次修改的值对象与键对应。对于值对象则没有唯一性的要求。你可以将任意多个键都映射到一 个值对象上，这不会发生任何问题（不过对你的使用却可能会造成不便，你不知道你得到的到底是那一个键所对应的值对象）。Map有两种比较常用的实现： HashMap和TreeMap。HashMap也用到了哈希码的算法，以便快速查找一个键，TreeMap则是对键按序存放，因此它便有一些扩展的方 法，比如firstKey(),lastKey()等，你还可以从TreeMap中指定一个范围以取得其子Map。键和值的关联很简单，用pub (Object key,Object value)方法即可将一个键与一个值对象相关联。用get(Object key)可得到与此key对象所对应的值对象。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://liuqiang.javaeye.com/blog/245157#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 21 Sep 2008 17:53:49 +0800</pubDate>
        <link>http://liuqiang.javaeye.com/blog/245157</link>
        <guid>http://liuqiang.javaeye.com/blog/245157</guid>
      </item>
          <item>
        <title>Chrome浏览器出来后，大家对AIR的走向有什么新看法吗？</title>
        <author>liuqiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://liuqiang.javaeye.com">liuqiang</a>&nbsp;
                    链接：<a href="http://liuqiang.javaeye.com/blog/241614" style="color:red;">http://liuqiang.javaeye.com/blog/241614</a>&nbsp;
          发表时间: 2008年09月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 好吧，我先承认，我一直在flex和ajax做富客户端之间犹豫不决，之前我的看法是，在做互联网的web2.0应用中，考虑到搜索引擎的友好以及带宽问题，我肯定首选js。但是在做webgis应用和做界面贼复杂的企业应用，我比较倾向于用Flex，但这种倾向不彻底，在这里Flex主要有2个亮点吸引我，严谨规范的语法和强大的展现机制，但让我一直没有找到很好的性能测试和功能测试的办法。最近受到广泛关注的Chrome浏览器发布后，说实话，让我有种扔掉Flex，痛痛快快的使用JS搞定一切的冲动。以下是找到的一些资料： <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 全球知名咨询公司凯捷(Cap Gemini)高级顾问琼那斯&middot;弗莱索(Jonas Folleso)认为，随着今后JavaScript运行速度加快，谷歌Chrome整体速度肯定也会大幅提高，&ldquo;谷歌在Chrome中采用了JavaScript和JavaVM技术，从而使浏览器具备高速运行能力。 据悉：&ldquo;今后18个月内，谷歌和Mozilla技术开发人员将加大研发力度，从而使JavaScript运行速度比当前增长100倍甚至1000倍。此举将对微软Silverlight技术构成重大威胁。&rdquo; <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以看出javascript在Chrome浏览器中的发挥的威力是惊人的，个人认为用JS搞定Flex所作的事情在未来也不是很难，这个我先不发表议论，还是先有请各位同仁就Chrome浏览器出来后，对未来AIR的走向做个解读：）</p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://liuqiang.javaeye.com/blog/241614#comments" style="color:red;">已有 <strong>41</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 14 Sep 2008 21:29:35 +0800</pubDate>
        <link>http://liuqiang.javaeye.com/blog/241614</link>
        <guid>http://liuqiang.javaeye.com/blog/241614</guid>
      </item>
          <item>
        <title>Rails简洁的模板系统Malline</title>
        <author>liuqiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://liuqiang.javaeye.com">liuqiang</a>&nbsp;
                    链接：<a href="http://liuqiang.javaeye.com/blog/241590" style="color:red;">http://liuqiang.javaeye.com/blog/241590</a>&nbsp;
          发表时间: 2008年09月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 前段时间听说rails的模板系统不如django好用，其实rails也有一个比较简洁且好用的模板系统Malline <a href="http://www.malline.org/">http://www.malline.org/</a> 。Malline 是专门为Rails框架而设计的模板系统，它从模板系统 <a href="http://markaby.rubyforge.org/" target="_blank">Makeaby</a> 获取的灵感，Malline不是嵌入式模板系统，也不是新的语言模板系统，而是使用纯Ruby语言编写模板代码。接触伊始就觉得这个模版真的很棒，下面是根据它的doc做的一个step by step过程。</p>
<p>&nbsp;</p>
<p>首先把Malline作为插件进行安装：</p>
<p>ruby script/plugin install <a href="http://svn.malline.org/stable/malline">http://svn.malline.org/stable/malline</a></p>
<p>&nbsp;</p>
<p>最后在&nbsp;<strong>config/environment.rb中加入 </strong>require 'malline/rails' ， 这就算安装完毕了。</p>
<p>&nbsp;</p>
<p>根据doc测试了2个例子，注意直接把.rhtml文件换为.mn文件即可，rails会直接渲染.mn文件，首先是Malline大大简化了html标签的写法，而且支持嵌套，比如：</p>
<p>&nbsp;</p>
<pre name="code" class="ruby">div do
    span 'text'
    div 'foo' do
        span 'bar', :style =&gt; 'color: red'
    end
end

编译成：
 &lt;div&gt;
    &lt;span&gt;text&lt;/span&gt;
    &lt;div&gt;
        foo&lt;span style="color: red"&gt;bar&lt;/span&gt;
    &lt;/div&gt;
&lt;/div&gt;
 
</pre>
<p>&nbsp;</p>
<p><br />&nbsp;你可以像erb模板那样向block里面输入一个变量，并在以后使用它，比如：</p>
<p>&nbsp;</p>
<pre name="code" class="ruby">@foo = capture do
    div do
        img :src =&gt; '/images/image.png', :alt =&gt; 'nice image'
        br
        span.caption 'Taken at the location of the event'
    end
end
编译成：
&lt;div&gt;
    &lt;img src="/images/image.png" alt="nice image"/&gt;&lt;br/&gt;
    &lt;span class="caption"&gt;Taken at the location of the event&lt;/span&gt;
&lt;/div&gt;
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上是我试验的两个例子，更多可以参见 <a href="http://www.malline.org/features">http://www.malline.org/features</a>&nbsp;，绝对让你爽个够，而且在下载下来的插件里面包含了大量的测试例子。另外想说明的是，你可以在一个系统里面混用erb模板和malline模板，甚至可以在malline模板里面引用erb模板，比如你已经有一个_one.rhtml的模板，那么在.mn中加入<span title="Inline" class="il"><span title="Inline" class="dl">&lt;%=</span><span title="Inline" class="NO_HIGHLIGHT"> </span><span title="Inline" class="NO_HIGHLIGHT">render</span><span title="Inline" class="NO_HIGHLIGHT"> </span><span title="Inline" class="sy">:partial</span><span title="Inline" class="NO_HIGHLIGHT"> </span><span title="Inline" class="NO_HIGHLIGHT">=</span><span title="Inline" class="NO_HIGHLIGHT">&gt;</span><span title="Inline" class="NO_HIGHLIGHT"> 'one' </span><span title="Inline" class="dl">%&gt;也是可行的。</span></span></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://liuqiang.javaeye.com/blog/241590#comments" style="color:red;">已有 <strong>21</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 14 Sep 2008 15:25:11 +0800</pubDate>
        <link>http://liuqiang.javaeye.com/blog/241590</link>
        <guid>http://liuqiang.javaeye.com/blog/241590</guid>
      </item>
          <item>
        <title>用ConfigObj读写配置文件</title>
        <author>liuqiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://liuqiang.javaeye.com">liuqiang</a>&nbsp;
                    链接：<a href="http://liuqiang.javaeye.com/blog/241219" style="color:red;">http://liuqiang.javaeye.com/blog/241219</a>&nbsp;
          发表时间: 2008年09月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>python优秀的库资源确实很多，最近发现了一个简单而又强大的读写配置文件的lib，地址在这里 <a href="http://www.voidspace.org.uk/python/configobj.html">http://www.voidspace.org.uk/python/configobj.html</a> ，我觉得最大的亮点在于自带的格式校验功能，并且支持复杂的嵌套格式，而且使用起来也相当的简便，按教程来如下： <br /><br />读文件</p>
<pre name="code" class="python">from configobj import ConfigObj
config = ConfigObj(filename)
#
value1 = config['keyword1']
value2 = config['keyword2']
#
section1 = config['section1']
value3 = section1['keyword3']
value4 = section1['keyword4']
#
# you could also write
value3 = config['section1']['keyword3']
value4 = config['section1']['keyword4']</pre>
<p>&nbsp;</p>
<p>写文件</p>
<pre name="code" class="python">from configobj import ConfigObj
config = ConfigObj()
config.filename = filename
#
config['keyword1'] = value1
config['keyword2'] = value2
#
config['section1'] = {}
config['section1']['keyword3'] = value3
config['section1']['keyword4'] = value4
#
section2 = {
    'keyword5': value5,
    'keyword6': value6,
    'sub-section': {
        'keyword7': value7
        }
}
config['section2'] = section2
#
config['section3'] = {}
config['section3']['keyword 8'] = [value8, value9, value10]
config['section3']['keyword 9'] = [value11, value12, value13]
#
config.write()</pre>
<p>&nbsp;<br />更详细的信息可以参阅下doc，蛮详尽的</p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://liuqiang.javaeye.com/blog/241219#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 12 Sep 2008 15:19:26 +0800</pubDate>
        <link>http://liuqiang.javaeye.com/blog/241219</link>
        <guid>http://liuqiang.javaeye.com/blog/241219</guid>
      </item>
          <item>
        <title>Django也可以Restful</title>
        <author>liuqiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://liuqiang.javaeye.com">liuqiang</a>&nbsp;
                    链接：<a href="http://liuqiang.javaeye.com/blog/239928" style="color:red;">http://liuqiang.javaeye.com/blog/239928</a>&nbsp;
          发表时间: 2008年09月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; mso-char-indent-count: 2.0;"><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">REST</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">按我的理解，简单的说就是一种面向资源的架构方式，无论是对于</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">Web</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">服务的生产者还是消费者，</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">Web</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">都是简单的，</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">Web</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">更是可编程的，</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">REST</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">利用简单的</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;"> HTTP</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">、</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">URI</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">标准和</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">XML</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">语言构建起轻量级的</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">Web</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">服务，从而大幅度地提升了开发效率和程序性能，为我们构建下一代高性能、高可伸缩性、简单性、可移植性、可靠性的</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">Web</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">程序提供了一个架构风格上的准则。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; mso-char-indent-count: 2.0;"><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">由于</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">REST</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">设计哲学变得越来越流行，许多</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">RESTful</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">框架如雨后春笋般涌现出来。而</span><span lang="EN-US" style="font-size: 12pt;"><a href="http://www.djangoproject.com/"><span style="font-size: 10.5pt; color: windowtext; text-decoration: none; mso-bidi-font-size: 12.0pt; text-underline: none;"><span style="font-family: Times New Roman;">Django</span></span></a></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">是一个高级</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;"> Python web framework</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，它鼓励快速开发和干净的MVC设计。它包括一个模板系统，对象相关的映射和用于动态创建管理界面的框架。它的设计与</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">Rails</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">十分类似，只不过简化和封装稍少一些。</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">ahuaxuan </span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">在这篇文章里</span><span style="font-size: 12pt;"><span style="font-family: Times New Roman;"> <span lang="EN-US"><a href="../../../topic/238540"><span style="font-size: 10.5pt; color: windowtext; text-decoration: none; mso-bidi-font-size: 12.0pt; text-underline: none;">http://www.javaeye.com/topic/238540</span></a></span></span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">&nbsp;较为详尽的介绍了</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">django</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">框架。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; mso-char-indent-count: 2.0;"><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">django -rest-interface</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">是</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">Google Code</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">上的一个开源项目，它给</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">Django</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">REST</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">开发接口提供了简便的封装。最重要的是</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">Collection</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">类和</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">XMLResponder</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">类，在</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">urls.py</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">文件里使用</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">Collection</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">定义资源集合以及使用</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">XMLResponder</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">定义</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">responder</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，并在</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">urlpatterns</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">中将该资源集合映射到某一</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">url</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，则该资源就以</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">REST</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">方式发布了</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">Web</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">服务，对该</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">Web</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">服务的实现细节如</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">HTTP</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">动词等都隐藏在</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">Collection</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">里。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; mso-char-indent-count: 2.0;"><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">在这里 </span><span lang="EN-US" style="font-size: 12pt;"><a href="http://code.google.com/p/django-rest-interface/"><span style="font-size: 10.5pt; color: windowtext; text-decoration: none; mso-bidi-font-size: 12.0pt; text-underline: none;"><span style="font-family: Times New Roman;">http://code.google.com/p/django-rest-interface/</span></span></a><span style="font-family: Times New Roman;">&nbsp; </span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">有</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">django -rest-interface</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">较为详尽的使用指南，这里我只把简单的使用过程摘抄过来，使用起来感觉蛮简洁的，更详细的过程大家可以讨论。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24.1pt; mso-char-indent-count: 2.0;"><span style="font-family: Times New Roman;"><strong><span lang="EN-US" style="font-size: 12pt;">Step 1:</span></strong><span lang="EN-US" style="font-size: 12pt;"> </span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">从</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">SVN</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">中下载下载</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">django-rest-interface </span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; mso-char-indent-count: 2.0;"><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">svn checkout &nbsp;<a href="http://django-rest-interface.googlecode.com/svn/trunk/django_restapi/" target="_blank"><span style="font-size: x-small; color: #006699;">http://django-rest-interface.googlecode.com/svn/trunk/django_restapi/</span></a></span></span>&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24.1pt; mso-char-indent-count: 2.0;"><span style="font-family: Times New Roman;"><strong><span lang="EN-US" style="font-size: 12pt;">Step 2:</span></strong><span lang="EN-US" style="font-size: 12pt;"> </span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">在</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">PYTHONPATH</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">中添加</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">django-rest-interface</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">安装目录</span><span style="font-size: 12pt;"><span style="font-family: Times New Roman;"> </span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24.1pt; mso-char-indent-count: 2.0;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24.1pt; mso-char-indent-count: 2.0;"><span style="font-family: Times New Roman;"><strong><span lang="EN-US" style="font-size: 12pt;">Step 3:</span></strong><span lang="EN-US" style="font-size: 12pt;"> </span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">在</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">urls.py</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">中添加如下</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">2</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">行</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">:</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; mso-char-indent-count: 2.0;"><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">from django_restapi.model_resorce import Collection</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; mso-char-indent-count: 2.0;"><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">from django_restapi.responder import XMLResponder</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; mso-char-indent-count: 2.0;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24.1pt; mso-char-indent-count: 2.0;"><span style="font-family: Times New Roman;"><strong><span lang="EN-US" style="font-size: 12pt;">Step 4:</span></strong><span lang="EN-US" style="font-size: 12pt;"> </span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">在</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">urls.py</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">中创建需要用到</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">API</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的实例集合</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;"> (</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">见</span><span style="font-size: 12pt;"><span style="font-family: Times New Roman;"> <span lang="EN-US"><a href="http://django-rest-interface.googlecode.com/svn/trunk/django_restapi_tests/examples/"><span style="color: windowtext; text-decoration: none; text-underline: none;">more elaborate examples</span></a>): </span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; mso-char-indent-count: 2.0;"><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">mymodel_resource = Collection(</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; mso-char-indent-count: 2.0;"><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp; </span>queryset = MyModel.objects.all(),</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; mso-char-indent-count: 2.0;"><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp; </span>responder = XMLResponder()</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; mso-char-indent-count: 2.0;"><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">)</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; mso-char-indent-count: 2.0;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24.1pt; mso-char-indent-count: 2.0;"><span style="font-family: Times New Roman;"><strong><span lang="EN-US" style="font-size: 12pt;">Step 5:</span></strong><span lang="EN-US" style="font-size: 12pt;"> </span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">向</span><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">URL patterns</span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">中添加资源</span><span style="font-size: 12pt;"><span style="font-family: Times New Roman;"> </span></span><span style="font-size: 12pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：</span><span style="font-size: 12pt;"><span style="font-family: Times New Roman;"> </span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; mso-char-indent-count: 2.0;"><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;">urlpatterns = patterns('',</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; mso-char-indent-count: 2.0;"><span lang="EN-US" style="font-size: 12pt;"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp;</span><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>url(r'^xml/mymodel/(.*?)/?$', mymodel_resource)</span></span></p>
<p><span style="font-family: 宋体;"><span lang="EN-US" style="font-size: 10.5pt;">)</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; mso-char-indent-count: 2.0;"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt;"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://liuqiang.javaeye.com/blog/239928#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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, 09 Sep 2008 21:36:05 +0800</pubDate>
        <link>http://liuqiang.javaeye.com/blog/239928</link>
        <guid>http://liuqiang.javaeye.com/blog/239928</guid>
      </item>
          <item>
        <title>如何进行项目跟踪 </title>
        <author>liuqiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://liuqiang.javaeye.com">liuqiang</a>&nbsp;
                    链接：<a href="http://liuqiang.javaeye.com/blog/239436" style="color:red;">http://liuqiang.javaeye.com/blog/239436</a>&nbsp;
          发表时间: 2008年09月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-size: small;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 项目跟踪主要针对计划，是为了了解项目的实际进展情况而采取的活动。如了解成员工作完成情况，了解整个项目计划完成情况等内容。跟踪主要是为了及时了解项目中的问题，并及时解决，不使问题淤积而酿成严重后果。<br />　　 个人认为项目跟踪还是必要的，因为它可以证明计划是否可实施，同时可以证明计划是否可以被完成。详细的计划可以提高跟踪的准确性，提高跟踪的效率和效果。粗糙的计划则会加大跟踪的工作量，并降低跟踪的效果。</span></p>
<p><span style="font-size: small;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但现在问题是项目计划往往会由于很多其他的原因出现变动，我所经常碰到的变动情况是是人员调动、员工士气低下、由于估算不准造成的工期调整等等。并且在实际的做法中，一般项目计划做的比较粗，那么项目跟踪就很难对计划的细节进行跟踪，目前我倒是没有找到一个科学的做法，还是靠经验凭感觉来来跟踪项目的进展，不知诸位有何高见　　<br /></span></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://liuqiang.javaeye.com/blog/239436#comments" style="color:red;">已有 <strong>16</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 08 Sep 2008 19:52:20 +0800</pubDate>
        <link>http://liuqiang.javaeye.com/blog/239436</link>
        <guid>http://liuqiang.javaeye.com/blog/239436</guid>
      </item>
          <item>
        <title>在rails中优雅的进行模型校验</title>
        <author>liuqiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://liuqiang.javaeye.com">liuqiang</a>&nbsp;
                    链接：<a href="http://liuqiang.javaeye.com/blog/238160" style="color:red;">http://liuqiang.javaeye.com/blog/238160</a>&nbsp;
          发表时间: 2008年09月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在用rails进行开发时，最常见的操作的是前台提交表单，后台保存相关的模型对象，对于一个复杂的表单，可能需要保存的模型对象不止一个，但这些对象在保存之前都是要经过合法性检验的，请看如下的场景，一个表单提交了订单信息、用户基本资料、用户所在地，那么后台需要对用户、订单、地点这3个对象进行校验并做相关处理，通常会用到error_messages_for做错误信息输出， 具体有以下3种做法:</p>
<p>&nbsp;</p>
<p>1 </p>
<p><code class="ruby"><span class="keywords">
<pre name="code" class="ruby">if @user.save &amp;&amp; @order.save &amp;&amp; @city.save
  #跳转到成功页面
  else
  #返回原来页面
end</pre>
<p>&nbsp;</p>
</span></code></p>
<p>&nbsp;&nbsp;&nbsp;这里存在的问题是，加入前两个模型合法性校验通过，但最后一个模型出现问题，那么原本3个对象都不该被保存，但前两个对象已经被保存，所以存在严重的脏数据问题</p>
<p>&nbsp;</p>
<p>2 </p>
<p>&nbsp;</p>
<pre name="code" class="ruby">if @user.valid? &amp;&amp; @order.valid? &amp;&amp; @city.valid?
  @user.save
  @order.save
  @city.save
  #跳转到成功页面
else
  #返回原页面
end</pre>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法倒是不存在脏数据问题，但是如果第一个模型对象出现合法性问题，那么程序将停止之后的合法性校验，所以显示返回页面的错误提示将不完整，严重影响了系统的用户体验。</p>
<p>&nbsp;</p>
<p>3 利用事务，基于第一种方法之上，如果任何一个模型合法性出现合法性问题，将采取数据库回滚操作，个人认为这种方法不仅复杂，性能也不高。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>那么以下有个比较简洁的方法解决这样的问题</p>
<p>&nbsp;</p>
<pre name="code" class="ruby">  def new
    @users = User.new
    @city = City.new
    @order = Order.new
  end
  
  def create
    @city = City.new params[:city]
    
    @user = User.new params[:user]
    @user.city = @city
    
    @order = Order.new params[:order]
    @order.user = @user

    unless [@user, @city, @order].map(&amp;:valid?).include?(false)
      @user.save
      @city.save
      @order.save
      redirect_to "/main/new"
    else
      render :action =&gt; "new"
    end
  end</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;关键在于这句：</p>
<p>&nbsp;</p>
<pre><code class="ruby"><span class="keywords"><span style="font-family: Verdana;"> unless [@user, @city, @order].map(&amp;:valid?).include?(false)</span></span></code> </pre>
<p>&nbsp;</p>
<p>在保存之前就遍历各个模型，并运行valid?方法，之后判断结果列表中是否包括false，以此作为判断合法性的依据，并且不会造成脏数据的问题。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>相关的view如下所示，关于错误汉化这里不做讨论</p>
<p>&nbsp;</p>
<pre name="code" class="ruby">&lt;%= error_messages_for :user %&gt; 
&lt;%= error_messages_for :city %&gt; 
&lt;%= error_messages_for :order %&gt; 

&lt;% form_for :user, :url =&gt; "/main/create" do |f| %&gt; 
  &lt;fieldset&gt;     
    &lt;legend&gt;用户信息&lt;/legend&gt;     
    &lt;ol&gt;       
      &lt;li&gt;        
        &lt;%= f.label :name %&gt;        
        &lt;%= f.text_field :name %&gt;      
      &lt;/li&gt;     
    &lt;/ol&gt;  
  &lt;/fieldset&gt;   
  &lt;% fields_for :city do |city| %&gt;     
    &lt;fieldset&gt;       
      &lt;legend&gt;地点信息&lt;/legend&gt;      
      &lt;ol&gt;     
        &lt;li&gt;      
          &lt;%= city.label :code %&gt;   
          &lt;%= city.text_field :code %&gt;       
        &lt;/li&gt;       
      &lt;/ol&gt;     
    &lt;/fieldset&gt;   
  &lt;% end %&gt; 

  &lt;% fields_for :order do |order| %&gt;  
    &lt;fieldset&gt;       
      &lt;legend&gt;订单信息&lt;/legend&gt;     
      &lt;ol&gt;      
        &lt;li&gt;           
          &lt;%= order.label :price %&gt;          
          &lt;%= order.text_field :price %&gt;        
        &lt;/li&gt;    
      &lt;/ol&gt;     
    &lt;/fieldset&gt;
  &lt;% end %&gt;
  &lt;%= f.submit '提交' %&gt; 
&lt;% end %&gt;


</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://liuqiang.javaeye.com/blog/238160#comments" style="color:red;">已有 <strong>36</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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, 07 Sep 2008 20:53:11 +0800</pubDate>
        <link>http://liuqiang.javaeye.com/blog/238160</link>
        <guid>http://liuqiang.javaeye.com/blog/238160</guid>
      </item>
          <item>
        <title>CMMI 名词辨析：检查点 里程碑 基线</title>
        <author>liuqiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://liuqiang.javaeye.com">liuqiang</a>&nbsp;
                    链接：<a href="http://liuqiang.javaeye.com/blog/237835" style="color:red;">http://liuqiang.javaeye.com/blog/237835</a>&nbsp;
          发表时间: 2008年09月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我实施CMMI的过程中，我遇到了在项目生命周期中有三个与时间相关的重要概念，分别是检查点 里程碑 和基线，他们一起描述了在什么时候对项目进行什么样控制。 <br /><br />　　检查点<br /><br />　　指在规定的时间间隔内对项目进行检查，比较实际与计划之间的差异，并根据差异进行调整。可将检查点看作是一个 固定 &amp;ldquo 采样 &amp;rdquo 时点，而时间间隔根据项目周期长短不同而不同，频度过小会失去意义，频度过大会增加管理成本。常见 的间隔是每周一次，项目经理需要召开例会并上交周报。 <br /><br />　　里程碑<br /><br />　　完成阶段性工作的标志，不同类型的项目里程碑不同。里程碑在项目管理中具有重要意义，我们用一个例子说明：<br /><br />　　情况一：你让一个程序员一周内编写一个模块，前 3 天你们可能都挺悠闲，可后 2 天就得拼命加班编程序了，而到周末时 又发现系统有错误和遗漏，必须修改和返工，于是周末又得加班了。 <br /><br />　　情况二：实际上你有另一种选择，即周一与程序员一起列出所有需求，并请业务人员评审，这时就可能发现遗漏并即 时修改；周二要求程序员完成模块设计并由你确认，如果没有大问题，周三、周四就可让程序员编程。同时自己准备 测试案例，周五完成测试；一般经过需求、设计确认，如果程序员合格则不会有太大问题，周末可以休息了。 第二种方式增加了 &amp;ldquo 需求 &amp;rdquo 和 &amp;ldquo 设计 &amp;rdquo 两个里程碑，这看似增加了额外工作，但其实有很大意义：首先，对一些复杂的项 目，需要逐步逼近目标，里程碑产出的中间 &amp;ldquo 交付物 &amp;rdquo 是每一步逼近的结果，也是控制的对象。如果没有里程碑，中间 想知道 &amp;ldquo 他们做的怎么样了 &amp;rdquo 是很困难的。其次，可以降低项目风险。通过早期评审可以提前发现需求和设计中的问 题，降低后期修改和返工的可能性。另外，还可根据每个阶段产出结果分期确认收入，避免血本无归。第三，一般人 在工作时都有 &amp;ldquo 前松后紧 &amp;rdquo 的习惯，而里程碑强制规定在某段时间做什么，从而合理分配工作，细化管理 &amp;ldquo 粒度 &amp;rdquo 。 <br /><br />　　基线 <br /><br />　　指一个（或一组）配置项在项目生命周期的不同时间点上通过正式评审而进入正式受控的一种状态。基线其实是一些 重要的里程碑，但相关交付物要通过正式评审并作为后续工作的基准和出发点。基线一旦建立后变化需要受控制。<br /><br />　　重要的检查点是里程碑，重要的需要客户确认的里程碑，就是基线。在我们实际的项目中，周例会是检查点的表现形式，高层的阶段汇报会是基线的表现形式。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://liuqiang.javaeye.com/blog/237835#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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>Sat, 06 Sep 2008 10:02:32 +0800</pubDate>
        <link>http://liuqiang.javaeye.com/blog/237835</link>
        <guid>http://liuqiang.javaeye.com/blog/237835</guid>
      </item>
          <item>
        <title>互联网创业与软件开发</title>
        <author>liuqiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://liuqiang.javaeye.com">liuqiang</a>&nbsp;
                    链接：<a href="http://liuqiang.javaeye.com/blog/237211" style="color:red;">http://liuqiang.javaeye.com/blog/237211</a>&nbsp;
          发表时间: 2008年09月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="Section0" style="layout-grid: 15.6pt none;">
<p class="0" style="margin-top: 5pt; text-align: justify;"><span style="font-size: 12pt; color: #000000; font-family: '宋体'; mso-spacerun: 'yes';">&nbsp;&nbsp;&nbsp; 最近与一位创业公司的朋友私下交流了一些项目管理和软件开发的心得，是互联网创业型公司，通过几次的交流，加深了我对互联网创业的一些感悟，本来不太想拿到桌面上说，但实在忍不住，还是想拿出来和希望创业的朋友讨论下。</span></p>
<p class="0" style="margin-top: 5pt; margin-bottom: 5pt;"><span style="font-size: 12pt; color: #000000; font-family: '宋体'; mso-spacerun: 'yes';">那么我对互联网公司的比较感兴趣的地方主要体现在软件质量和技术管理方面，以下2点可以作为讨论的提纲：</span></p>
<p class="0" style="margin-top: 5pt; margin-bottom: 5pt;"><span style="font-size: 12pt; color: #000000; font-family: '宋体'; mso-spacerun: 'yes';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;软件质量，尽管质量是我们嘴边经常挂念的一个词，但不少创业型公司的投机心理太重，在与这些负责人的交流中发现，谈论的更多的是新想法、新概念，有非常重的商业气息，当然这没什么不好，但我看了他们的一些产品后发现，他们所做的产品用户体验非常糟糕，就拿界面来说，非常的粗糙，由于有家公司做的产品和易趣类似，我特意打开2个窗口对比一下，总觉得易趣的看起来比较舒服，他们整体布局倒模仿易趣倒挺像，但问题就体现在细节上，图片失真严重、字体风格不一致、细节处理的不到位。好了，那就凑合着看吧，发现该产品的功能非常的多，但让人郁闷的是，很多功能是有问题的，比如明明提示我系统给偶发了个邮件，但就是找不到，有时候提交表单是可以的，有时候见到一堆java异常错误。所以我觉得这就是典型的追求功能的庞大而导致质量的缩水。</span></p>
<p class="0" style="margin-top: 5pt; margin-bottom: 5pt;"><span style="font-size: 12pt; color: #000000; font-family: '宋体'; mso-spacerun: 'yes';">&nbsp;&nbsp;&nbsp;&nbsp;其实自从豆瓣开始流行后，大家都意识到功能做的简洁原来是有好处的，有不少创业者声称自己要向豆瓣看齐，鄙视csdn，坚决走简洁之路，但让我纳闷的是，很少有人真正的坚持下去，我有个同学06年底曾在一家创业公司玩过python，准备做一个很有趣的网站，叫做抱怨网，其实是蛮有创意的，不久前JE不是有个哥们在四处发帖说我爱我家黑中介的事，其实本来这个网站就是干这个事的，专门揭不良企业底的，但做着做着，成了巨无霸，开始是把大众点评网的功能加进去，接着又开始融进赶集网的分类信息功能，最后有把智联招聘的招聘功能加上了，结局就是1年不到，网站不出意料的死掉了，原因就是用户体验差，根本不感兴趣！最后我替他们老板做了下反思，其实说实话，我还是很理解创业人的心，看到好东西都想要，而且之前几年在互联网圈钱谁都眼红。另外，他们的功能尽管是抄袭别人的，但还是有一定的特色与盈利模式，并且各个功能分的也蛮清的。&nbsp;所以我觉得失败的原因不能简单的归结为功能太多，而是质量，小公司也就那几号人，作为开发人员，面对这么多的需求，只有拼命的赶进度，丫还有时间考虑质量或者用户体验吗？所以没有一定的资本与一批强有力的管理和开发人员，切勿贪大求全，否则很可能就是在生产垃圾。其实质量这个东西从高的层面上说就是用户体验的好坏，bug少不见得质量高，但用户体验差的东西绝对就是垃圾。</span></p>
<p class="0" style="margin-top: 5pt; margin-bottom: 5pt;"><span style="font-size: 12pt; color: #000000; font-family: '宋体'; mso-spacerun: 'yes';">&nbsp;&nbsp;&nbsp;&nbsp;最近市面上有个说法有个说法是30w足以模仿个淘宝，我认为就是扯淡，误导了很多创业者，认为花点银子，雇几个人，就可以轻松抄袭淘宝了，咱先不说市场投资，只谈技术，表面上看淘宝，丫就是一个破网站，但背后的技术你看的见吗？稳定性、性能、维护、可扩展性，这些都和软件质量息息相关，直接影响着用户的满意度，你确定真的做到了吗？淘宝的架构师一年的薪水也30w了。所以我觉得创业者要领悟毛泽东思想，采用各个击破的战术，在有限的资源下约束的自己产品的功能，做到小而美。</span></p>
<p class="0" style="margin-top: 5pt; margin-bottom: 5pt;"><span style="font-size: 12pt; color: #000000; font-family: '宋体'; mso-spacerun: 'yes';">&nbsp;&nbsp;&nbsp;&nbsp; 这里举个正面的例子，有家位于芝加哥、名为37&nbsp;Signals的小公司，正是这种拥抱限制的方式之代表者。37&nbsp;Signals最初是一家网页设计资讯公司，后来为了满足自身需求而将业务扩展到软件开发领域。他们编写了一些用于项目管理的内部工具。为了和客户沟通，&nbsp;就向客户开放了部分系统。公司创始人和总裁杰森&bull;弗瑞德（Jason&nbsp;Fried）解释说，在他们自己意识到之前，已经做出了一套基于网页的应用。又做了4个月，他们把软件转换为称作Basecamp的服务。&nbsp;Basecamp发布于2004年2月，很快在类似Flickr和Google的Gmail等新Web富应用天堂中名列前茅。</span></p>
<p class="0" style="margin-top: 5pt; margin-bottom: 5pt;"><span style="font-size: 12pt; color: #000000; font-family: '宋体'; mso-spacerun: 'yes';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Basecamp只是这家公司花一年多时间投入少量程序员做出来的一系列值得注意的小而精的产品之一。Basecamp之后是Ta-da&nbsp;List，用于保存和共享待办事项（及类似事项）列表。几个月后推出了Backpack，它允许用户保存和共享便签及文件。每种产品都可靠并易于使用，而&nbsp;且都是精心设计的。每种产品通常也都只包括少量新特性。例如，Basecamp就有一些精巧的电子邮件功能：和其他服务和程序一样，也可以设置邮件到达提醒&mdash;&mdash;还可以从另外的计算机或手机等移动设备向Backpack网页发送邮件，邮件文本就会在页面上显示出来。</span></p>
<p class="0" style="margin-top: 5pt; margin-bottom: 5pt;"><span style="font-size: 12pt; color: #000000; font-family: '宋体'; mso-spacerun: 'yes';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;技术管理，你会发现很多公司的负责人不是很懂技术，但却是负责技术的，丫今天听到SOA是个好东西，号令纷纷SOA，反正大家都不理解这个含糊不清的东西，做呗，看谁能忽悠的过谁，一般来讲，创业型公司为了节约成本，不会预留专门的QA，有专门的测试人员就不错了，所以缺乏一个质量保证的环节，遇到问题怎么办？谁做的谁改，改成什么样没人关心，只要负责人看到问题解决了就可以了，但，我想问的是，不良代码背后的隐患你知道吗？结果就是你咬牙给开发人员开工资，开发人员假装帮你实现梦想，或者说造就一批划水的人。其实很多东西不是钱的问题，也不要以为多开点薪水就可以留住人心。另外我觉得很多技术负责人喜欢把东西模糊化，比如把软件即服务的理念挂在嘴边，但做起来是另一码子事，我觉得作为一个技术负责人自己就要身先士卒，至少在创业公司是这样，这样才更有说服力，遇到问题自己应当第一个冲上去，拿出具体的解决方案，对代码应当做到精细管理，做到心中有数。说到底，创业公司得有一个技术核心，一个真正能实现你的想法的人，一个可以让大家凝聚起来的人，不至于让大家划水的人。</span></p>
<p class="0" style="margin-top: 5pt; margin-bottom: 5pt;"><span style="font-size: 12pt; color: #000000; font-family: '宋体'; mso-spacerun: 'yes';">好了，先说那么多，希望各位准备创业的同仁能真正的树立精品意识，打造精品，实现梦想</span></p>
<p class="0" style="margin-top: 5pt; margin-bottom: 5pt;"><span style="font-size: 12pt; color: #000000; font-family: '宋体'; mso-spacerun: 'yes';">&nbsp;</span></p>
</div>
<!--EndFragment-->
          <br/><br/>
          <span style="color:red;">
            <a href="http://liuqiang.javaeye.com/blog/237211#comments" style="color:red;">已有 <strong>41</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 04 Sep 2008 22:57:54 +0800</pubDate>
        <link>http://liuqiang.javaeye.com/blog/237211</link>
        <guid>http://liuqiang.javaeye.com/blog/237211</guid>
      </item>
          <item>
        <title>在Flex中使用Yahoo! Maps</title>
        <author>liuqiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://liuqiang.javaeye.com">liuqiang</a>&nbsp;
                    链接：<a href="http://liuqiang.javaeye.com/blog/235473" style="color:red;">http://liuqiang.javaeye.com/blog/235473</a>&nbsp;
          发表时间: 2008年09月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>首先你需要做的是从这里<a href="http://developer.yahoo.com/wsregapp/"><span style="color: #006699;">获取Yahoo! Maps API key</span></a></p>
<p>然后<a href="http://developer.yahoo.com/flash/maps/getLatest.php"><span style="color: #006699;">从这里下载Yahoo! Maps ActionScript 3.0 component</span></a></p>
<p>接下去将zip压缩包内的东西复制到工程的/libs/中就可以了。</p>
<p>&nbsp;</p>
<ol title="Double click to hide line number." class="hl-main ln-show" ondblclick="linenumber(this)">
<li class="hl-firstline"><span style="color: olive;">&lt;?</span><span style="color: green;">xml</span><span style="color: gray;"> </span><span style="color: #00008b;">version</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">1.0</span><span style="color: #8b0000;">"</span><span style="color: gray;"> </span><span style="color: #00008b;">encoding</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">utf-8</span><span style="color: #8b0000;">"</span><span style="color: olive;">?&gt;</span> </li>
<li><span style="color: olive;">&lt;</span><span style="color: green;">mx:Application</span><span style="color: gray;">&nbsp;</span><span style="color: #00008b;">xmlns:mx</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">http://www.adobe.com/2006/mxml</span><span style="color: #8b0000;">"</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">layout</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">vertical</span><span style="color: #8b0000;">"</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">verticalAlign</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">middle</span><span style="color: #8b0000;">"</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">backgroundColor</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">white</span><span style="color: #8b0000;">"</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">creationComplete</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">init();</span><span style="color: #8b0000;">"</span><span style="color: olive;">&gt;</span> </li>
<li><span style="color: gray;">&nbsp;</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; </span><span style="color: olive;">&lt;</span><span style="color: green;">mx:Script</span><span style="color: olive;">&gt;</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">&lt;![CDATA[</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; import mx.events.ResizeEvent;</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; import mx.controls.Alert;</span> </li>
<li><span style="color: #ffa500;">&nbsp;</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; import com.yahoo.maps.api.YahooMap;</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; import com.yahoo.maps.api.YahooMapEvent;</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; import com.yahoo.maps.api.core.location.Address;</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; import com.yahoo.maps.webservices.geocoder.GeocoderResult;</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; import com.yahoo.maps.webservices.geocoder.events.GeocoderEvent;</span> </li>
<li><span style="color: #ffa500;">&nbsp;</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private var yahooMap:YahooMap;</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private var address:Address;</span> </li>
<li><span style="color: #ffa500;">&nbsp;</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private function init():void {</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; yahooMap = new YahooMap();</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; yahooMap.init(APP_ID, mapContainer.width, mapContainer.height);</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; yahooMap.addPanControl();</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; yahooMap.addZoomWidget();</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; yahooMap.addTypeWidget();</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mapContainer.addChild(yahooMap);</span> </li>
<li><span style="color: #ffa500;">&nbsp;</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; geocodeAddress(textInput.text);</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span> </li>
<li><span style="color: #ffa500;">&nbsp;</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private function geocodeAddress(value:String):void {</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; address = new Address(value);</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; address.addEventListener(GeocoderEvent.GEOCODER_SUCCESS, address_geocoderSuccess);</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; address.addEventListener(GeocoderEvent.GEOCODER_FAILURE, address_geocoderFailure);</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; address.geocode();</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span> </li>
<li><span style="color: #ffa500;">&nbsp;</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private function address_geocoderSuccess(evt:GeocoderEvent):void {</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var result:GeocoderResult = Address(evt.target).geocoderResultSet.firstResult;</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; yahooMap.centerLatLon = result.latlon;</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; yahooMap.zoomLevel = result.zoomLevel;</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span> </li>
<li><span style="color: #ffa500;">&nbsp;</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private function address_geocoderFailure(evt:GeocoderEvent):void {</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Alert.show("Unable to geocode address: " + address.address);</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span> </li>
<li><span style="color: #ffa500;">&nbsp;</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private function mapContainer_resize(evt:ResizeEvent):void {</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (yahooMap) {</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; yahooMap.setSize(mapContainer.width, mapContainer.height);</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span> </li>
<li><span style="color: #ffa500;">&nbsp;</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private function button_click(evt:MouseEvent):void {</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; geocodeAddress(textInput.text);</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; ]]&gt;</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; </span><span style="color: olive;">&lt;/</span><span style="color: green;">mx:Script</span><span style="color: olive;">&gt;</span> </li>
<li><span style="color: gray;">&nbsp;</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; </span><span style="color: olive;">&lt;</span><span style="color: green;">mx:String</span><span style="color: gray;">&nbsp;</span><span style="color: #00008b;">id</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">APP_ID</span><span style="color: #8b0000;">"</span><span style="color: gray;"> </span><span style="color: #00008b;">source</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">appid.txt</span><span style="color: #8b0000;">"</span><span style="color: gray;"> </span><span style="color: olive;">/&gt;</span> </li>
<li><span style="color: gray;">&nbsp;</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; </span><span style="color: olive;">&lt;</span><span style="color: green;">mx:ApplicationControlBar</span><span style="color: gray;">&nbsp;</span><span style="color: #00008b;">dock</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">true</span><span style="color: #8b0000;">"</span><span style="color: olive;">&gt;</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: olive;">&lt;</span><span style="color: green;">mx:Form</span><span style="color: gray;">&nbsp;</span><span style="color: #00008b;">styleName</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">plain</span><span style="color: #8b0000;">"</span><span style="color: olive;">&gt;</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: olive;">&lt;</span><span style="color: green;">mx:FormItem</span><span style="color: gray;">&nbsp;</span><span style="color: #00008b;">label</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">Address:</span><span style="color: #8b0000;">"</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">direction</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">horizontal</span><span style="color: #8b0000;">"</span><span style="color: olive;">&gt;</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: olive;">&lt;</span><span style="color: green;">mx:TextInput</span><span style="color: gray;">&nbsp;</span><span style="color: #00008b;">id</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">textInput</span><span style="color: #8b0000;">"</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">text</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">601 Townsend St, San Francisco, CA 94103</span><span style="color: #8b0000;">"</span><span style="color: gray;">&nbsp;</span><span style="color: olive;">/&gt;</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: olive;">&lt;</span><span style="color: green;">mx:Button</span><span style="color: gray;">&nbsp;</span><span style="color: #00008b;">id</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">button</span><span style="color: #8b0000;">"</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">label</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">Submit</span><span style="color: #8b0000;">"</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">click</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">button_click(event);</span><span style="color: #8b0000;">"</span><span style="color: gray;">&nbsp;</span><span style="color: olive;">/&gt;</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: olive;">&lt;/</span><span style="color: green;">mx:FormItem</span><span style="color: olive;">&gt;</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: olive;">&lt;/</span><span style="color: green;">mx:Form</span><span style="color: olive;">&gt;</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; </span><span style="color: olive;">&lt;/</span><span style="color: green;">mx:ApplicationControlBar</span><span style="color: olive;">&gt;</span> </li>
<li><span style="color: gray;">&nbsp;</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; </span><span style="color: olive;">&lt;</span><span style="color: green;">mx:UIComponent</span><span style="color: gray;">&nbsp;</span><span style="color: #00008b;">id</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">mapContainer</span><span style="color: #8b0000;">"</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">width</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">100%</span><span style="color: #8b0000;">"</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">height</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">100%</span><span style="color: #8b0000;">"</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">resize</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">mapContainer_resize(event);</span><span style="color: #8b0000;">"</span><span style="color: olive;">/&gt;</span> </li>
<li><span style="color: gray;">&nbsp;</span> </li>
<li><span style="color: olive;">&lt;/</span><span style="color: green;">mx:Application</span><span style="color: olive;">&gt;</span></li>
</ol>
          <br/><br/>
          <span style="color:red;">
            <a href="http://liuqiang.javaeye.com/blog/235473#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 01 Sep 2008 21:16:38 +0800</pubDate>
        <link>http://liuqiang.javaeye.com/blog/235473</link>
        <guid>http://liuqiang.javaeye.com/blog/235473</guid>
      </item>
          <item>
        <title>SVN分支与合并</title>
        <author>liuqiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://liuqiang.javaeye.com">liuqiang</a>&nbsp;
                    链接：<a href="http://liuqiang.javaeye.com/blog/235466" style="color:red;">http://liuqiang.javaeye.com/blog/235466</a>&nbsp;
          发表时间: 2008年09月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>分支的基本概念就正如它的名字,开发的一条线独立于另一条线,如果回顾历史,可以发现两条线分享共同的历史,一个分支总是从一个备份开始的,从那里开始,发展自己独有的历史(如下图所示) <br /><br /><img src="http://chaxinyi.javaeye.com/upload/picture/pic/10345/a5f7da85-6e2c-3c41-b9e1-57c1e4874747.jpg" alt="" /> <br /><br />⑴创建分支 <br />假设目前我们版本库中的项目的布局如下图： <br /><br /><img src="http://chaxinyi.javaeye.com/upload/picture/pic/10347/3e3b403f-7684-3eca-b47e-efc191928a90.jpg" alt="" /> <br /><br />如图所示，我们的项目放在了trunk（主线）目录，另外还有branch(分支)和tags(标签)目录，这样的布局是为了更清晰的区别主线、分支和标签三者的位置。 <br />subversion对分支和标签是通过复制一份最新的版本库的快照来实现的。 <br /><br />开始创建分支： <br />在我们CheckOut的主线目录(trunk)上，右键点击然后选择&ldquo;Branch/tag&hellip;&rdquo; <br /><br /><img src="http://chaxinyi.javaeye.com/upload/picture/pic/10349/0e66b0bf-118b-3b96-a5c9-0f16df426773.jpg" alt="" /> <br /><br />在弹出的窗口中，将To Url 指向branch目录并输入分支的具体目录名，这里是mybranch1.0，我们即将创建的分支便存放于此处，点击OK。 <br /><br /><img src="http://chaxinyi.javaeye.com/upload/picture/pic/10351/d40acf2e-1133-3380-b183-fcc8aedc14cd.jpg" alt="" /> <br /><br />Update一下本地的branch目录，你就可以看到你刚刚创建的分支&ldquo;mybranch1.0&rdquo;，这样一来我们的分支就创建完成了。 <br /><br /><img src="http://chaxinyi.javaeye.com/upload/picture/pic/10353/d8552794-297c-39c2-ae11-fe62ae22a9f3.jpg" alt="" /> <br /><br /><br />创建分支的最大的目的就是跟主线进行并行开发的时候不影响主线的开发。 <br />因为你在分支上所做的提交都只存于分支上，主线上的Update是看不到分支的修改的。如下图所示，trunk只能看到r344的版本，并看不到r343的版本。 <br /><br /><img src="http://chaxinyi.javaeye.com/upload/picture/pic/10355/3888d86d-c616-38d0-9306-6adb75b52a76.jpg" alt="" /> <br /><br />（什么时候应该使用分支呢？例如你接到了一个任务，完成这个任务需要三四个人的合作，你们之间需要共享资源，那们就可以创建一个专为这次任务的分支，参与此次任务的人员则在分支上做开发，等完成之后再合并到主线上，才不会出现将实现了一半的不完成功能也提交到主线上，影响主线的正常工作。又或者自己需要一个较长的开发周期来完成任务，这么长的时间内如果一直没有将资源进行提交，万一丢失了就前功尽弃了。当然分支不是只用于此类情况，还有其它很多种情况也能使用分支来达到目的。） <br />使用分支需要注意,由于长期的独立开发，可能会在合并回主线时出现较多的冲突。所以在支线上开发间期如果发现主干有更新，而且这个更新有可能将来跟你产生冲突，那你可以先将主线的内容合并到分支上。已免等到做了大量修改再来更新。(其实此过程跟分支合并到主线上是一样的操作，只是目的地不同。) <br /><br />例如我们在主线上的版本为3，我们如何将此版本的信息合并到分支上呢？ <br /><img src="http://chaxinyi.javaeye.com/upload/picture/pic/10357/bf1c755b-689b-3989-9a30-087905177164.jpg" alt="" /> <br /><br />在分支的根目录上右键点击，选择&ldquo;TortoiseSVNMerge&hellip;&rdquo;。 <br /><br /><img src="http://chaxinyi.javaeye.com/upload/picture/pic/10359/c5181bd0-cba5-3cfd-8b3c-b87f7b67bc41.jpg" alt="" /> <br /><br /><br />在这里我们必需先弄明白一个合并背后的关健概念 <br />合并的过程中发生的所有事:首先两个版本库树的比较，然后将区别应用到本地拷贝. <br />这个命令是包括三个参数的: <br />1. 初始的版本树 2.最终的版本树 3一个接收区别的工作拷贝。 <br />弄明白这些概念之后我们继续往下操作。 <br />在弹出的窗口中，选择主线目录和其版本号(初始的版本树)，再选择主线目录和最新的版本号（最终的版本树），这里也可以是某一个版本号但应该比初始的版本树的版本号要高，接收区默认为你右键所指的目录，这里是mybranch1.0。 <br /><br />在合并之前我们可以通过点击&ldquo;Unified diff&rdquo;，查看两版本树之间所有文件的内容的变化，&ldquo;diff&rdquo;显示出有发生变化的文件列表，&ldquo;dry run&rdquo;能显示真正合并时的状态信息，但并没有做任何的合并操作。 <br />我们点击&ldquo;Merge&rdquo;。 <br /><br /><img src="http://chaxinyi.javaeye.com/upload/picture/pic/10361/79cca1ca-b738-30c4-8ec6-0c5ba2bbe842.jpg" alt="" /> <br /><br />在点击&ldquo;Merge&rdquo;，合并后的文件（即对分支上的文件补上了主线上修改的内容），如无冲突则可以在分支上像其它文件一样使用了，如果合并后的内容不满意，可以通过撤销来取消这次的合并操作，前提是未对合并后的文件做提交操作。 <br /><br />分支合并到主线跟从主线上合并内容到分支上类似 <br />不同的是 <br />1、开始的版本库是分支创建的版本 <br />2、结束的版本库是完成所以开发工作之后的版本 <br />3、应用的目的是主线目录 <br /><br />关于转换工作拷贝、标签（标签在Subversion中跟分支是相同原理的，一个不去做任何的修改的分支就是版本库某一时刻的一个快照，相当于为某一个版本做了一个标签） </p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://liuqiang.javaeye.com/blog/235466#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 01 Sep 2008 20:20:57 +0800</pubDate>
        <link>http://liuqiang.javaeye.com/blog/235466</link>
        <guid>http://liuqiang.javaeye.com/blog/235466</guid>
      </item>
          <item>
        <title>Flex Shared Object 简介</title>
        <author>liuqiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://liuqiang.javaeye.com">liuqiang</a>&nbsp;
                    链接：<a href="http://liuqiang.javaeye.com/blog/235465" style="color:red;">http://liuqiang.javaeye.com/blog/235465</a>&nbsp;
          发表时间: 2008年09月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Flex Shared Object是一个类似于Cookies的东西，同来存储一些数据到用户本机。但它与Cookies又有些不同。</p>
<div>&nbsp; 第一，Cookies过一段时间会过期，而它不会，除非你执行清除命令。</div>
<div>&nbsp; 第二，存储的数据大小不能超过100KB，超过了，FlashPlayer会提示用户是否允许该存储操作。</div>
<div>&nbsp; 第三，存储数据的位置和程序本身有关。</div>
<div>&nbsp; 第四，它不会像Cookies那样在客户端和服务器端之间传递。</div>
<div>&nbsp; SharedObject类有以下几个方法：</div>
<div>&nbsp; 1.clear()，&nbsp;清除共享数据和文件。</div>
<div>&nbsp; 2.flush()，立即写入共享文件到客户端。</div>
<div>&nbsp; 3.getLocal()，获得共享数据文件，如果为空系统会自动新建一个共享文件到客户端。</div>
<div>&nbsp; 4.getSize()，获得共享数据文件的大小，单位是bytes。</div>
<p>&nbsp;</p>
<div>&nbsp; 有两个属性：</div>
<div>&nbsp; 1.data，代表着共享数据的数据集合。</div>
<div>&nbsp; 2.onStatus，当共享数据发出警告、错误或其他信息时的事件。</div>
<p>&nbsp;</p>
<div>&nbsp; <strong>创建共享文件</strong></div>
<div><strong>&nbsp; </strong>public var mySO:SharedObject;<br />&nbsp; mySO = SharedObject.getLocal("preferences");</div>
<div>&nbsp; 创建一个自定义路径的共享文件。</div>
<div>&nbsp; mySO = SharedObject.getLocal("preferences","/");</div>
<div>&nbsp; 如果你希望让多个Flex程序共享此文件，可以用到此功能。</div>
<div>&nbsp; </div>
<div>&nbsp; <strong>写共享数据到本地</strong></div>
<div><strong>&nbsp; </strong>public var currentUserName:String = "Reiner";<br />&nbsp; public var itemsArray:Array = new Array(101,346,483);<br />&nbsp; public var currentUserIsAdmin:Boolean = true;<br />&nbsp; mySO.data.userName = currentUserName;<br />&nbsp; mySO.data.itemNumbers = itemsArray;<br />&nbsp; mySO.data.adminPrivileges = currentUserIsAdmin;</div>
<div>&nbsp; mySO.flush();</div>
<div>&nbsp; 注意：共享数据只支持简单数据类型，例如：int,uint,string,array等。</div>
<div>&nbsp; <strong>读出</strong></div>
<div><strong>&nbsp; </strong>trace(mySO.data.userName,mySO.data.itemNumbers,mySO.data.adminPrivileges)</div>
<div>&nbsp; <strong>清除</strong></div>
<div><strong>&nbsp; </strong>mySO.clear();</div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://liuqiang.javaeye.com/blog/235465#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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>Mon, 01 Sep 2008 20:16:02 +0800</pubDate>
        <link>http://liuqiang.javaeye.com/blog/235465</link>
        <guid>http://liuqiang.javaeye.com/blog/235465</guid>
      </item>
          <item>
        <title>加快Flex应用启动速度的5种方式 </title>
        <author>liuqiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://liuqiang.javaeye.com">liuqiang</a>&nbsp;
                    链接：<a href="http://liuqiang.javaeye.com/blog/235464" style="color:red;">http://liuqiang.javaeye.com/blog/235464</a>&nbsp;
          发表时间: 2008年09月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Jun Heider在O&rsquo;Reilly的InsideRIA站点上发表了一篇精彩的文章，该文章就如何加快Flex应用的启动速度提出了很多建议，以帮助用户减少看见讨厌的&ldquo;Loading&rdquo;对话框的出现时间。他深入探讨了问题的不同方面，并对每种技术的优势和劣势进行了评判。</p>
<p><br />从外部加载媒体（Media）<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Heider提到了一个常用的Flex最佳实践&mdash;&mdash;限制嵌入到应用/SWF文件中的媒体的数量，如图像、影片及mp3等资源都可</p>
<p>&nbsp;</p>
<p>以从外部的SWF文件加载。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Flex框架可以直接将图片、mp3及字体等资源编译到SWF中。当你想让最终用户获得全部资源时，这种方式确实能派上用场，但是这会导致你的应用长时间停留在&ldquo;Loading&rdquo;阶段。 </p>
<p>&nbsp;</p>
<p>在嵌入式字体中限制字符集<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Heider建议在嵌入式字体中限制字符集以降低SWF文件的总下载时间： <br />当你在Flex中嵌入一种字体时，你就会获得该字体的全部字符的支持。尽管这可能是你想要的，但你确信你需要全部字符么？例如，在一个只面向英文的应用中，你确信你真的想花时间下载中文字符数据么？</p>
<p><br />缓存框架 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Heider回顾了Flex 3 support for runtime-shared-libraries （RSL）这篇文章：</p>
<p>从Flex 3开始，你可以将Adobe签名的框架&mdash;&mdash;RSLs缓存到Flash Player的cache中。这有两个好处。首先，缓存在Flash Player cache中的签名的框架RSLs可由所有配置好的Flex应用共享。换句话说，如果某人的应用已经下载了500k的签名的框架RSL，并且该RSL仍旧 在Flash Player cache中，那么你的应用就可以使用缓存下来的RSL。其次，即使某人清空了其浏览器缓存，对Flash Player cache也没有任何影响。<br />考虑模块化 Heider谈到了将Flex应用划分成模块的好处： <br />减少字体加载时间的另一种方式就是将你的Flex应用划分成模块。使用模块的一个好处在于当加载和卸载模块时你能完全操控它。</p>
<p>&nbsp;</p>
<p>考虑模块化 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 之所以要划分成模块的最后一个原因是他们更快，而且我能即时加载它们。换句话说，在启动时唯一需要加载的模块就是 Step1.swf模块。因此，在使用模块的情况下，最终用户节省了启动时间，但是当他从一个模块切换到另一个模块时却需要花更多时间，因为每个模块都需 要以JIT形式加载。在我的应用中，只有当用户首次在steps 1-5之间切换时需要花更多时间。 </p>
<p><br />推迟实例化 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Heider围绕着Flex组件的&ldquo;creationPolicy&rdquo;属性及何时实例化应用的不同部分给出了很多建议。</p>
<p>如果你想减少从数据下载到用户真正可以使用的总时间，当务之急就是推迟实例化。这项技术背后的理念就是直到应用真正使用的时候才在内存中创建对象。</p>
<p>尽管推迟实例化技术会在应用的整个使用过程中导致少许&mdash;&mdash;通常不那么明显&mdash;&mdash;的延迟，但与长时间的启动延迟相比，它还是可接受的。推迟实例化的另一个好处在于内存使用的优化。 </p>
<p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Heider还谈到了一个&ldquo;实验性&rdquo;的条款&mdash;&mdash;&ldquo;使用流&rdquo;，这是他在讨论Dirk Eismann的帖子（Building monolithic Flex SWFs that still startup quickly.&rdquo;）时谈及的。Eismann提出一项技术以利用Flash Player中的多个frames以在部分应用中达到流的目的。查看所有的帖子以更多地了解该技术及关于加快Flex启动速度的建议。</p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://liuqiang.javaeye.com/blog/235464#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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>Mon, 01 Sep 2008 20:10:46 +0800</pubDate>
        <link>http://liuqiang.javaeye.com/blog/235464</link>
        <guid>http://liuqiang.javaeye.com/blog/235464</guid>
      </item>
          <item>
        <title>在flex中创建简单的模块(module)</title>
        <author>liuqiang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://liuqiang.javaeye.com">liuqiang</a>&nbsp;
                    链接：<a href="http://liuqiang.javaeye.com/blog/235463" style="color:red;">http://liuqiang.javaeye.com/blog/235463</a>&nbsp;
          发表时间: 2008年09月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="hl-surround"><ol title="Double click to hide line number." class="hl-main ln-show" ondblclick="linenumber(this)">
<li class="hl-firstline"><span style="color: olive;">&lt;?</span><span style="color: green;">xml</span><span style="color: gray;"> </span><span style="color: #00008b;">version</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">1.0</span><span style="color: #8b0000;">"</span><span style="color: gray;"> </span><span style="color: #00008b;">encoding</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">utf-8</span><span style="color: #8b0000;">"</span><span style="color: olive;">?&gt;</span> </li>
<li><span style="color: olive;">&lt;</span><span style="color: green;">mx:Application</span><span style="color: gray;">&nbsp;</span><span style="color: #00008b;">xmlns:mx</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">http://www.adobe.com/2006/mxml</span><span style="color: #8b0000;">"</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">layout</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">vertical</span><span style="color: #8b0000;">"</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">verticalAlign</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">middle</span><span style="color: #8b0000;">"</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">backgroundColor</span><span style="color: gray;">=</span><span style="color: #8b0000;">"</span><span style="color: red;">white</span><span style="color: #8b0000;">"</span><span style="color: olive;">&gt;</span> </li>
<li><span style="color: gray;">&nbsp;</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; </span><span style="color: olive;">&lt;</span><span style="color: green;">mx:Script</span><span style="color: olive;">&gt;</span> </li>
<li><span style="color: gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">&lt;![CDATA[</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; import mx.events.VideoEvent;</span> </li>
<li><span style="color: #ffa500;">&nbsp;</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [Bindable]</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private var moduleTitle:String;</span> </li>
<li><span style="color: #ffa500;">&nbsp;</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private var vm:VideoModule;</span> </li>
<li><span style="color: #ffa500;">&nbsp;</span> </li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private function init():void {</span> </li>
