﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-byterat</title><link>http://www.blogjava.net/byterat/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 28 Apr 2026 19:02:50 GMT</lastBuildDate><pubDate>Tue, 28 Apr 2026 19:02:50 GMT</pubDate><ttl>60</ttl><item><title>dom4j  从文件中装载XML  之 性能比较 ！</title><link>http://www.blogjava.net/byterat/archive/2007/05/19/118483.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Fri, 18 May 2007 16:39:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2007/05/19/118483.html</guid><wfw:comment>http://www.blogjava.net/byterat/comments/118483.html</wfw:comment><comments>http://www.blogjava.net/byterat/archive/2007/05/19/118483.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byterat/comments/commentRss/118483.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byterat/services/trackbacks/118483.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier"><span style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">众所周知， Java在从XML文件中装载内容到内存过程中，不论用何种方式，IO操作的开销都无可避免。本文尝试比较dom4j中的XPP3和SAX两种方式装载XML文件的性能，以便将IO操作的开销降到最小！</span><br><br>package gz.lwm;<br><br>import java.io.File;<br>import org.apache.log4j.Logger;<br>import org.dom4j.Document;<br>import org.dom4j.DocumentHelper;<br>import org.dom4j.io.SAXReader;<br>import org.dom4j.io.XPP3Reader;<br><br>public class TestDom4j { <br>&nbsp;private static final Logger log = Logger.getLogger(TestDom4j.class);<br>&nbsp;private static long bt;&nbsp; <br>&nbsp;<br>&nbsp;public static void main(String[] args) {<br>&nbsp;&nbsp;<span style="COLOR: #ff0000">Document doc = DocumentHelper.createDocument();</span>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;//先运行getXmlSAX()<br>&nbsp;&nbsp;bt = System.currentTimeMillis();<br>&nbsp;&nbsp;String strXml = getXmlSAX("xml/test.xml");<br>&nbsp;&nbsp;if(log.isDebugEnabled()){<br>&nbsp;&nbsp;&nbsp;log.debug("\ngetXmlSAX() use time: " + (System.currentTimeMillis() - bt) + " millis\n");<br>&nbsp;&nbsp;}</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">&nbsp;&nbsp;//再运行getXmlXPP3()<br>&nbsp;&nbsp;bt = System.currentTimeMillis();<br>&nbsp;&nbsp;String s1 =getXmlXPP3("xml/test.xml");<br>&nbsp;&nbsp;if(log.isDebugEnabled()){<br>&nbsp;&nbsp;&nbsp;log.debug("\ngetXmlXPP3() use time: " + (System.currentTimeMillis() - bt) + " millis\n");<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;<br>&nbsp;}<br>&nbsp;<br>&nbsp;public static String getXmlSAX(String xmlFile){<br>&nbsp;&nbsp;String result = "";<br>&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;SAXReader reader = new SAXReader();<br>&nbsp;&nbsp;&nbsp;Document document = reader.read(new File(xmlFile));<br>&nbsp;&nbsp;&nbsp;result = document.asXML();<br>&nbsp;&nbsp;} catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;return result;<br>&nbsp;}<br>&nbsp;<br>&nbsp;public static String getXmlXPP3(String xmlFile){<br>&nbsp;&nbsp;String result = "";<br>&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;XPP3Reader reader = new XPP3Reader();<br>&nbsp;&nbsp;&nbsp;Document document = reader.read(new File(xmlFile));<br>&nbsp;&nbsp;&nbsp;result = document.asXML();<br>&nbsp;&nbsp;} catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;return result;<br>&nbsp;}</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier"><br>&nbsp;<br>}<br><br><font color=#ff0000><span style="COLOR: #000000">有没有这一句"<font color=#ff0000>Document doc = DocumentHelper.createDocument()</font>",对性能的影响很大,特别是对大xml文件(尽管并没有使用doc)</span></font><br><br>另外， getXmlXSAX()和getXmlXPP3()运行的先后次序对性能的影响也很大！<br><br>测试：<br>&nbsp;&nbsp;&nbsp; 在我的机器上，对一个100k左右的XML文件进行多次测试后的均值结果为：<br><br>&nbsp;&nbsp;&nbsp; getXmlXPP3() use time: 265 millis<br>&nbsp;&nbsp;&nbsp;&nbsp;...<br>&nbsp;&nbsp;&nbsp; getXmlXSAX() use time: 359 millis<br>&nbsp;&nbsp;&nbsp;&nbsp;...<br><br>结论：<br>&nbsp;&nbsp;&nbsp; 通过比较，在读取XML文件上，XPP3略为优于SAX！<br><br><br>注意：<br><br>要运行例子，classpath需包含：<br>dom4j-1.6.1.jar<br>jaxen-1.1-beta-10.jar<br>log4j-1.2.9.jar<br>pull-parser-2.1.10.jar<br>xpp3-1.1.4c.jar<br><br><br>参考：<br>dom4j :&nbsp; <a href="http://www.dom4j.org/">http://www.dom4j.org/</a><br>XPP&nbsp;&nbsp;&nbsp;:&nbsp; <a href="http://www.extreme.indiana.edu/xgws/xsoap/xpp/">http://www.extreme.indiana.edu/xgws/xsoap/xpp/</a><br></p>
<img src ="http://www.blogjava.net/byterat/aggbug/118483.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2007-05-19 00:39 <a href="http://www.blogjava.net/byterat/archive/2007/05/19/118483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ruby 基础学习</title><link>http://www.blogjava.net/byterat/archive/2006/11/22/82209.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Wed, 22 Nov 2006 03:26:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2006/11/22/82209.html</guid><wfw:comment>http://www.blogjava.net/byterat/comments/82209.html</wfw:comment><comments>http://www.blogjava.net/byterat/archive/2006/11/22/82209.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byterat/comments/commentRss/82209.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byterat/services/trackbacks/82209.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Courier New" size="2">最近一直在看Programming Ruby - 2nd, 先记录下一些不熟悉的Ruby的基本语法和操作(熟悉的就不再记啦...)<br /><br /><strong><font color="#ff0000">Ruby的命名:</font></strong><br /><br />      局部变量         全局变量      实例变量      类变量             常量和类名<br />==============================================================================<br />      name            $debug       @name        @@total           PI<br />      fish_and_chips  $CUSTOMER    @point_1     @@symtab          FeetPerMile<br />      x_axis          $_           @X           @@N               String      <br />      thx1138         $plan9       @_           @@x_pos           MyClass<br />      _26             $Global      @plan9       @@SINGLE          JazzSong<br />==============================================================================<br /><br /><br /><strong><font color="#ff0000">数组:</font></strong><br /><br />数组下标从0开始, 下标可以为负整数, 此时代表数组从最末端开始, 最末端索引从-1开始<br />数组的元素可以是任何类型的对象实例,包括nil实例<br /><br />数组的初始化:<br />a = [ 'ant', 'bee', 'cat', 'dog', 'elk' ]<br />或者<br />a = %w{ ant bee cat dog elk }<br /><br />访问:<br />a[0]    #返回"ant"<br />a[1]    #返回"bee" <br />a[-1]   #返回"elk"<br />a[-2]   #返回"dog"<br /><br />赋值:<br />a = [ 1, 3, 5, 7, 9 ] <br />a[1] = 'bat'       #a = [1, "bat", 5, 7, 9]<br />a[3]= 'cat'        #a = [1, "bat", "cat", 7, 9]<br />a[3] = [ 9, 8 ]    #a = [1, "bat", "cat", [9, 8], 9]<br />a[6] = 99          #a = [1, "bat", "cat", [9, 8], 9, nil, 99]<br /><br />a = [ 1, 3, 5, 7, 9 ] <br />a[2, 2] = 'cat'           #a = [1, 3, "cat", 9]<br />a[2, 0] = 'dog'           #a = [1, 3, "dog", "cat", 9]<br />a[1, 1] = [ 9, 8, 7 ]     #a = [1, 9, 8, 7, "dog", "cat", 9]<br />a[0..3] = [ ]             #a = ["dog", "cat", 9]<br />a[5..6] = 99, 98          #a = ["dog", "cat", 9, nil, nil, 99, 98]<br /><br /><br /><strong><font color="#ff0000">哈希表:</font></strong><br />相当于Java中的Map<br />具有"键值对"特性, key和value都可以是任何类型的实例<br /><br />哈希的初始化:<br />h = Hash["a", 100, "b", 200]     # {"a"=&gt;100, "b"=&gt;200}<br />h = Hash["a" =&gt; 100, "b" =&gt; 200] # {"a"=&gt;100, "b"=&gt;200}<br />h = { "a" =&gt; 100, "b" =&gt; 200 }   # {"a"=&gt;100, "b"=&gt;200}<br /><br />访问:<br />h.length = 2<br /><br />赋值:<br />h = { 'dog' =&gt; 'canine', 'cat' =&gt; 'feline', 'donkey' =&gt; 'asinine' }<br />h.length    # 3<br />h['dog']    # "canine"<br />h['cow']    # 'bovine'<br />h[12]       # 'dodecine'<br />h['cat'] = 99<br />h           # {"cow"=&gt;"bovine", "cat"=&gt;99, 12=&gt;"dodecine","donkey"=&gt;"asinine", "dog"=&gt;"canine"}<br /><br /><br /></font>
				<font face="Courier New">
						<font size="2">
								<font color="#ff0000">
										<strong>代码块:<br /></strong>
								</font>
								<font color="#000000">代码块在ruby 中是</font>以{} 和do end 来包围起来的。通常如果是单行使用{} ，如果是多行使用do..end<br />代码块可以接受参数, 参数用两个竖线"|"符号来包含, 参数间用逗号","来分隔<br />代码块被作为一个对象传入method体中执行(如果代码块对象有参数, 则method体在执行代码块中的代码前,需要对代码块对象的参数赋值)<br /><br />例如:<br /><br /></font>
				</font>
				<font face="Courier New">
						<font size="2">
								<font color="#000080">def test(max)<br />   i1, i2 = 1, 1          # parallel assignment (i1 = 1 and i2 = 1)<br />   while i1 &lt;= max<br />      <strong>yield</strong> i1            # 也可以写成yield(i1), yield指令代表了代码块执行的位置, i1是method体中对代码块f进行了赋值<br />      i1, i2 = i2, i1+i2<br />   end<br />end<br /><br />test(1000) {|f| print f, " " }<br /><br />输出: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987</font>
								<br />
								<br />
								<br />
								<font color="#000080">又例如:<br />[1,3,5,7].inject(0) {|sum, element| sum+element} # 输出:16</font>
								<br />
								<br />
								<br />
								<font color="#ff0000">
										<strong>Method的声明:<br /></strong>
								</font>
								<br />一般格式是:<br />   def my_new_method(arg1, arg2, arg3)    # 3 arguments<br />      # Code for the method would go here<br />   end<br /><br />方法名initialize是特殊的method, 它在类的new操作时被执行, 用于对类实例进行初始化操作:<br />   def <font color="#ffa500"><strong>initialize</strong></font>(name, &amp;block)<br />      @name, @block = name, block<br />   end<br /><br />如果需要方法返回一个值, 可以显式使用return关键字, 也可以使用"默认最后一行返回值"形式:<br />   def meth_one<br />      "one"    # 相当于 return "one"<br />   end<br /><br />如果method的声明中最后的参数带有"&amp;"前缀(例如下例的&amp;action), 则表示该参数接受的是代码块, 并且该代码块将被转换为Proc对象, 最后被赋值给一个类实例变量,如:<br />   class JukeboxButton &lt; Button<br />      def <strong><font color="#ffa500">initialize</font></strong>(label, &amp;action)<br />         super(label)<br />         @action = action #代码块对象被赋值给一个类实例变量(即@action)<br />      end<br />      def button_pressed<br />         @action.call(self)<br />      end<br />   end<br />   start_button = JukeboxButton.new("Start") { songlist.start }<br /><br />如果method的声明中最后的参数带有"*"前缀, 表示该参数接受的是0个或多个参数(即:可变长参数), 例如:<br />   def varargs(arg1, *rest)<br />      "Got #{arg1} and #{rest.join(', ')}"<br />   end<br />   varargs("one")                # "Got one and "<br />   varargs("one", "two")         # "Got one and two"<br />   varargs "one", "two", "three" # "Got one and two, three"<br /><br />如果method的方法名最后为字符"=", 表示该方法可为类实例变量赋值, 相当于Java中的setXXXX方法<br />   class Song<br />      def duration=(new_duration)   # 整个方法名为"duration="<br />         @duration = new_duration   # @duration为类实例变量<br />      end<br />   end<br />   song = Song.new("Bicylops", "Fleck", 260)<br />   song.duration       # 260<br />   song.duration = 257 # set attribute with updated value<br />   song.duration       # 257<br /><br /><br />   上例中的"duration="方法 相当于下面的: attr_writer :duration<br />   class Song<br />      attr_writer :duration<br />   end<br />   song = Song.new("Bicylops", "Fleck", 260)<br />   song.duration = 257<br /><br /><br /><font color="#ff0000"><strong>区间:</strong></font><br /><br />两个点创建一个"包含"区间<br />1..10    #包含1和10<br />'a'..'z'<br /><br />三个点创建一个除最后一个元素外的区间<br />my_array = [ 1, 2, 3 ]<br />0...my_array.length  # 相当于0..2<br /><br />区间可以通过to_a函数来转换为数组<br />a = (1..3).to_a   # a = [1, 2, 3]</font>
				</font>
				<br />
				<br />
				<font size="2">
						<font face="Courier New">区间的一些方法:<br />digits = 0..9<br />digits.include?(5)                   # true<br />digits === 5                         # true<br />digits.min                           # 0<br />digits.max                           # 9<br />digits.reject {|i| i &lt; 5 }           # [5, 6, 7, 8, 9]<br />digits.each {|digit| dial(digit)}    #  0..9</font>
						<br />
						<br />
				</font>
				<font face="Courier New" size="2">待续...<br /><br /><br /></font>
		</p>
<img src ="http://www.blogjava.net/byterat/aggbug/82209.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2006-11-22 11:26 <a href="http://www.blogjava.net/byterat/archive/2006/11/22/82209.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用WPT 1.5.x 时的一些配置</title><link>http://www.blogjava.net/byterat/archive/2006/11/08/79761.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Wed, 08 Nov 2006 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2006/11/08/79761.html</guid><wfw:comment>http://www.blogjava.net/byterat/comments/79761.html</wfw:comment><comments>http://www.blogjava.net/byterat/archive/2006/11/08/79761.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byterat/comments/commentRss/79761.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byterat/services/trackbacks/79761.html</trackback:ping><description><![CDATA[
		<font face="Courier New" size="2">1. window -- Preferences<br />      1.1 Content Types <br />          设置相关的文件为"UTF-8", 如果在列表中没有文件后缀, 则增加相应的文件后缀.<br /><br />      1.2 Workspace<br />          设置"Text file encoding" 为 "UTF-8".<br /><br /><br />2. Validation<br />      将Validator中, 除了Application client validator外的所有validator的"Manual"和"Build", 全部置空(即取消打勾)</font>
<img src ="http://www.blogjava.net/byterat/aggbug/79761.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2006-11-08 09:44 <a href="http://www.blogjava.net/byterat/archive/2006/11/08/79761.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ruby中3 种通过字符串类名来产生类实例</title><link>http://www.blogjava.net/byterat/archive/2006/10/24/76940.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Tue, 24 Oct 2006 04:35:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2006/10/24/76940.html</guid><wfw:comment>http://www.blogjava.net/byterat/comments/76940.html</wfw:comment><comments>http://www.blogjava.net/byterat/archive/2006/10/24/76940.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byterat/comments/commentRss/76940.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byterat/services/trackbacks/76940.html</trackback:ping><description><![CDATA[
		<font face="Courier New" size="2">
				<strong>
						<font style="BACKGROUND-COLOR: #ffffff" color="#000080">1. 标准用法</font>
				</strong>
				<br />
		</font>
		<span class="postbody">
				<font face="Courier New" size="2">c = Object.const_get("Array") <br />s = c.new <br /><br /><strong><font color="#000080">2. 使用Ruby Extension</font></strong><br />c = Class.by_name("Array") <br />参见: <a href="http://extensions.rubyforge.org/rdoc/index.html">http://extensions.rubyforge.org/rdoc/index.html</a><br /><br /><strong><font color="#000080">3. 通过eval</font></strong> <br />c = eval("Array").new</font>
		</span>
<img src ="http://www.blogjava.net/byterat/aggbug/76940.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2006-10-24 12:35 <a href="http://www.blogjava.net/byterat/archive/2006/10/24/76940.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ruby on Rails的国际化，本地化问题的解决(转载)</title><link>http://www.blogjava.net/byterat/archive/2006/10/24/76888.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Tue, 24 Oct 2006 01:53:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2006/10/24/76888.html</guid><wfw:comment>http://www.blogjava.net/byterat/comments/76888.html</wfw:comment><comments>http://www.blogjava.net/byterat/archive/2006/10/24/76888.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/byterat/comments/commentRss/76888.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byterat/services/trackbacks/76888.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<font face="Courier New" size="2">原文出自: </font>
				<a href="http://my.donews.com/woodstudio/">
						<font face="Courier New" size="2">http://my.donews.com/woodstudio/</font>
				</a>
				<a href="http://my.donews.com/woodstudio/2006/04/27/ruby-on-railsçå½éåï¼æ¬å°åé®é¢çè§£å³/" rel="bookmark">
				</a>
		</div>
		<div class="postText">
				<!-- Content Start -->
				<p>
						<font face="Courier New" size="2">Ruby on Rails是一个很不错的web开发框架，不过由于目前其本身对国际化的支持较差，所以需要一些辅助的东西来解决国际化问题。</font>
				</p>
				<p>
						<font face="Courier New" size="2">我最先使用的是一个叫localization的插件，这个插件的使用说明在Ruby on Rails官方的wiki上面有，这个插件使用比较简单，不过功能比较弱。</font>
				</p>
				<p>
						<font face="Courier New" size="2">目前使用的是Ruby-GetText，这个插件功能强大，基于GNU的gettext，详细的使用说明在</font>
						<a href="http://manuals.rubyonrails.com/read/chapter/105">
								<font face="Courier New" size="2">http://manuals.rubyonrails.com/read/chapter/105</font>
						</a>
						<font face="Courier New" size="2">上面有写，我大概提一下要点：</font>
				</p>
				<p>
						<font face="Courier New" size="2">首先要是Ruby on Rails支持UTF-8，通过将如下代码添加到environment.rb中：</font>
				</p>
				<p>
						<font face="Courier New" size="2">$KCODE = ‘u’<br />require ‘jcode’</font>
				</p>
				<p>
						<font face="Courier New" size="2">接着是安装Ruby-GetText，运行gem install gettext就可以了，如果是Windows平台就选2，否则选1。接着就是在项目根目录下面创建po目录，里面添加你需要Locale的名字作为子目录，比如en, zh_CN等。需要国际化的字符串都以_(”")来书写，比如想国际化“编辑”这个标签，就可以在视图的rhtml中使用_(”Edit”)，这样在显示的时候会自动根据Locale来替换成相应的值。</font>
				</p>
				<p>
						<font face="Courier New" size="2">接着在项目的rakefile里面如下内容：</font>
				</p>
				<p>
						<font face="Courier New" size="2">desc “Create mo-files for L10n”<br />task :makemo do<br />  GetText.create_mofiles(true, “po”, “locale”)<br />end</font>
				</p>
				<p>
						<font face="Courier New" size="2">需要注意的是在上面给出的链接的那篇文章里面，还需要添加updatepo这样一个目标，不过这个目标在我这不起作用，总是出错，我的办法是下载那篇文章附带的代码：</font>
						<a href="http://www.digitale-wertschoepfung.de/artikel/gettext/using-gettext-with-rails.tgz">
								<font face="Courier New" size="2">http://www.digitale-wertschoepfung.de/artikel/gettext/using-gettext-with-rails.tgz</font>
						</a>
						<font face="Courier New" size="2">。在里面的script目录下面有一个localize文件，把它拷贝到你的项目的script目录下面，然后运行ruby ./script/localize {文本域的名字}就可以从controllers, views中更新po数据，用Unicode编辑器（比如UltraEdit）修改各个po文件，然后运行rake makemo就可以了。关于如果修改application.rb及其他controller的代码，查看给出的链接。此时重新启动server，就可以查看效果了。</font>
				</p>
		</div>
<img src ="http://www.blogjava.net/byterat/aggbug/76888.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2006-10-24 09:53 <a href="http://www.blogjava.net/byterat/archive/2006/10/24/76888.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于Ruby的元编程技术(转载)</title><link>http://www.blogjava.net/byterat/archive/2006/10/24/76886.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Tue, 24 Oct 2006 01:52:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2006/10/24/76886.html</guid><wfw:comment>http://www.blogjava.net/byterat/comments/76886.html</wfw:comment><comments>http://www.blogjava.net/byterat/archive/2006/10/24/76886.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byterat/comments/commentRss/76886.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byterat/services/trackbacks/76886.html</trackback:ping><description><![CDATA[
		<font face="Courier New" size="2">原文出处: </font>
		<a href="http://www.rubychina.org/viewthread.php?tid=124&amp;extra=page%3D1">
				<font face="Courier New" size="2">http://www.rubychina.org/viewthread.php?tid=124&amp;extra=page%3D1</font>
		</a>
		<br />
		<br />
		<div style="FONT-SIZE: 12px">
				<p align="left">
						<font color="black">
								<font face="Courier New" size="2">    元编程并不是一个很新的概念，通常元编程被认为是通过程序来生成程序，如果从这种意义上来考虑，那么lex和yacc以及JavaCC应该都可以算是具有了元编程的概念，在Java中，元编程得到了广泛的应用。但在Ruby中，元编程的使用变得相当的简单和容易实现，使用Ruby语言本身来产生Ruby代码，不需要借助外部的工具，著名的RoR框架就是建立的Ruby元编程的基础上的。可能你你对元编程还没什么概念，但是Ruby已经内建了元编程这种机制，所以很有可能，你在不知不觉中就已经使用了Ruby元编程技术为你带来的方便之处。如下面这段代码：</font>
						</font>
				</p>
				<font face="Courier New" size="2">class Person<br />   attr_reader :name<br />end<br />你肯定知道 :name 是和 @name 相关联的，但是你不一定清楚它到底是怎么实现的，其实attr_reader方法的实现就是采用了元编程技术，如下面的这段代码：<br /><br />class Module<br />    def attr_reader(*syms)<br />        syms.each do |sym|<br />            class_eval %{def #{sym}   <br />                             @#{sym}<br />                         end<br />        end   <br />    end<br />end<br /><br />    看了这段代码，你应该大概了解元编程的机制了吧，如果你现在还不了解，那么我建议你先认真的学习一下Ruby的反射机制，然后再接下去看这篇帖子，因为下面介绍的内容并不是一杯婴儿奶粉。<br /></font>
				<p align="left">
				</p>
				<p align="left">
						<font color="black">
								<font face="Courier New" size="2">    在Ruby On Rails中，有一个OR映射层，就是动态的从一张关系表映射到一个对象，这主要由ActiveRecord类来实现。在OR映射模型中，将关系数据库中的关系表表映射到对象模型时，将关系表的表名映射到类名，表中的每一个元组映射到对应于这个类的一个对象，元组的一个字段对应于对象的一个属性。</font>
						</font>
				</p>
				<p align="left">
						<font color="black">
								<font face="Courier New" size="2">假如我们有一个保存职员基本信息的文件，文件的格式是这样的：第一行是文件内容的每个字段的名称，从第二行开始，则是每个职员的基本信息。现在我们有一个文件名为“employee.txt”的文件，其内容如下所示：</font>
						</font>
				</p>
				<br />
				<p align="left">
						<font face="Courier New" size="2">name,age,gender<br /></font>
				</p>
				<p align="left">
						<font face="Courier New" size="2">"John", 23, "male"<br /></font>
				</p>
				<p align="left">
						<font face="Courier New" size="2">"Linclon", 25, "male"</font>
				</p>
				<br />
				<p align="left">
						<font color="black">
								<font face="Courier New" size="2">假设我们就要从这个文本文件中读取数据，并进行一定的处理。如果是使用C++编程，你首先一定会想到应该定义一个Employee类，然后这个类中有name, age, gender这些成员变量。但是是采用这种方法的话，可以发现，如果想在职员信息中加入一个字段，比如部门（department），就不得不修改Employee类的代码，在Employee类中增加一个“department”成员变量，所以我们的代码是高度依赖于文件的具体格式，这当然不是一个好的现象。我们希望有一种更简单和优雅的方案，还有，Ruby动态性提高给我们一个解决方案，但是，我们应该从和下手呢，这就需要Ruby的元编程能力。</font>
						</font>
				</p>
				<br />
				<p align="left">
						<font color="black">
								<font face="Courier New" size="2">    首先，我们想应该有一个职员类，在Rails中，每个关系表的名称会成为类的名称，在这里，采用类似的方法，将文本文件的名称作为类的名称，在Ruby中，类名同时也是一个常量名，所以第一个字母必须为大写，我们使用如下的代码来生成类名。</font>
						</font>
				</p>
				<font color="black">
						<br />
						<p align="left">
								<font face="Courier New" size="2">class_name = File.basename(file_name, ".txt").capitalize<br /># "employee.txt" =&gt; "Employee"<br />klass = Object.const_set(class_name, Class.new)</font>
						</p>
						<br />
						<p align="left">
								<font face="Courier New" size="2">
								</font>
						</p>
						<br />
						<p align="left">
								<font color="black">
										<font size="2">
												<font face="Courier New">Class.new生成一个新的类，这个类的名称是匿名的，所以采用const_set操作来绑定一个类名，<font color="black">变量klass是新类型的引用。</font></font>
										</font>
								</font>
						</p>
						<font color="black">
								<br />
								<p align="left">
										<font color="black">
												<font face="Courier New" size="2">生成了这个类以后，需要想这个类添加姓名，年龄和性别这些属性，这些属性的名称是在文本文件的的第一行中给出的。<br /></font>
										</font>
								</p>
								<p align="left">
										<font color="black">
												<font face="Courier New" size="2">
												</font>
										</font>
								</p>
								<br />
								<p align="left">
										<font color="black">
												<font color="black">
														<font color="black">
																<font face="Courier New" size="2">data = File.new(file_name)<br /></font>
																<font color="black">
																		<font face="Courier New" size="2">header = data.gets.chomp<br /></font>
																</font>
														</font>
												</font>
										</font>
								</p>
								<p align="left">
										<font color="black">
												<font face="Courier New" size="2">data.close<br /></font>
										</font>
								</p>
								<p align="left">
										<font color="black">
												<font face="Courier New" size="2">names = header.split(",")<br /></font>
										</font>
								</p>
								<p align="left">
										<font face="Courier New" color="black" size="2">
										</font>
								</p>
								<br />
								<font color="black">
										<p align="left">
												<font color="black">
														<font face="Courier New" size="2">下面的代码给出了如何生成这些属性，以及初始化这些属性值。<br /></font>
												</font>
										</p>
										<p align="left">
												<font face="Courier New" size="2">
												</font>
										</p>
										<br />
										<font color="black">
												<font face="Courier New" size="2">klass.class_eval do<br /></font>
												<font color="black">
														<font face="Courier New" size="2">    attr_accessor *names<br /></font>
														<font color="black">
																<font face="Courier New" size="2">            <br /></font>
																<font color="black">
																		<font face="Courier New" size="2">    define_method(:initialize) do |*values|<br /></font>
																		<font color="black">
																				<font face="Courier New" size="2">        names.each_with_index do |name, i|<br /></font>
																				<font color="black">
																						<font face="Courier New" size="2">            instance_variable_set("@" + name, values</font>
																						<font face="Courier New" size="2">)<br /></font>
																						<font color="black">
																								<font face="Courier New" size="2">        end<br /></font>
																								<font color="black">
																										<font face="Courier New" size="2">    end<br /></font>
																										<font color="black">
																												<font size="2">
																														<font face="Courier New">
																																<i>  </i>  #...    <br /></font>
																												</font>
																												<font color="black">
																														<font face="Courier New" size="2">end   <br /></font>
																														<font color="black">
																																<br />
																																<font color="black">
																																		<p align="left">
																																				<font color="black">
																																						<font face="Courier New" size="2">现在，有了一系列的访问子（可读和可写），通过instance_variable_set方法，又给每个属性做了初始化。<br /></font>
																																				</font>
																																		</p>
																																		<p align="left">
																																				<font color="black">
																																						<font face="Courier New" size="2">变量names是在块外部定义的，由于块的闭合性，所以变量names在块中也是有效的。当然，为了程序的演示，又定义的了一个to_s方法，代码如下所示：</font>
																																				</font>
																																		</p>
																																		<font color="black">
																																				<br />
																																				<font color="black">
																																						<font face="Courier New" size="2">    define_method(:to_s) do<br /></font>
																																						<font color="black">
																																								<font face="Courier New" size="2">        str = "&lt;#{self.class}: " <br /></font>
																																								<font color="black">
																																										<font face="Courier New" size="2">        names.each {|name| str &lt;&lt; "#{name}=#{self.send(name)} "}<br /></font>
																																										<font color="black">
																																												<font face="Courier New" size="2">        str + "&gt;"<br /></font>
																																												<font color="black">
																																														<font face="Courier New" size="2">    end<br /></font>
																																														<font color="black">
																																																<font face="Courier New" size="2">    alias_method :inspect, :to_s</font>
																																																<font color="black">
																																																		<br />
																																																		<p align="left">
																																																				<font face="Courier New" color="black" size="2">
																																																				</font>
																																																		</p>
																																																		<br />
																																																		<p align="left">
																																																				<font color="black">
																																																						<font face="Courier New" size="2">    完成了这些以后，对于类的构造已经基本结束了，现在就需要真正的从文本文件中读取数据了。从文本文件读数据应该是一个类方法，而不是一个实例的方法，其实现代码如下：<br /></font>
																																																				</font>
																																																		</p>
																																																		<p align="left">
																																																				<font face="Courier New" color="black" size="2">
																																																				</font>
																																																		</p>
																																																		<br />
																																																		<font color="black">
																																																				<font face="Courier New" size="2">    def klass.read<br /></font>
																																																				<font color="black">
																																																						<font face="Courier New" size="2">        array = []<br /></font>
																																																						<font color="black">
																																																								<font face="Courier New" size="2">        data = File.new(self.to_s.downcase + ".txt")<br /></font>
																																																								<font color="black">
																																																										<font face="Courier New" size="2">        data.gets #throw away header<br /></font>
																																																										<font color="black">
																																																												<font face="Courier New" size="2">        data.each do |line|<br /></font>
																																																												<font color="black">
																																																														<font face="Courier New" size="2">            line.chomp!<br /></font>
																																																														<font color="black">
																																																																<font face="Courier New" size="2">            values = eval("[#{line}]")<br /></font>
																																																																<font color="black">
																																																																		<font face="Courier New" size="2">            array &lt;&lt; self.new(*values)<br /></font>
																																																																		<font color="black">
																																																																				<font face="Courier New" size="2">        end<br /></font>
																																																																				<font color="black">
																																																																						<font face="Courier New" size="2">        data.close<br /></font>
																																																																						<font color="black">
																																																																								<font face="Courier New" size="2">        return array<br /></font>
																																																																								<font color="black">
																																																																										<font face="Courier New" size="2">    end<br /></font>
																																																																										<p align="left">
																																																																												<font color="black">
																																																																												</font>
																																																																										</p>
																																																																										<br />
																																																																										<p align="left">
																																																																												<font color="black">
																																																																														<font face="Courier New" size="2">在这个方法中，使用字的类名来匹配相关的文件，比如将Employee类映射到“employee。txt”。<br /></font>
																																																																												</font>
																																																																										</p>
																																																																										<p align="left">
																																																																												<font color="black">
																																																																														<font size="2">
																																																																																<font face="Courier New">然后，从文件中读取职员信息，由于第一行是字段定义，所以要舍弃第一行数据。从第二行开始读取数据，每读取一行数据，则构造一个Employee实例。<font color="black">通过上面这个简单的例子，我们可以看出元编程的功能是相当之强大的，使用元编程技术，可以构造相当简单，优雅的解决方案。</font></font>
																																																																														</font>
																																																																												</font>
																																																																										</p>
																																																																								</font>
																																																																						</font>
																																																																				</font>
																																																																		</font>
																																																																</font>
																																																														</font>
																																																												</font>
																																																										</font>
																																																								</font>
																																																						</font>
																																																				</font>
																																																		</font>
																																																</font>
																																														</font>
																																												</font>
																																										</font>
																																								</font>
																																						</font>
																																				</font>
																																		</font>
																																</font>
																														</font>
																												</font>
																										</font>
																								</font>
																						</font>
																				</font>
																		</font>
																</font>
														</font>
												</font>
										</font>
								</font>
						</font>
				</font>
		</div>
<img src ="http://www.blogjava.net/byterat/aggbug/76886.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2006-10-24 09:52 <a href="http://www.blogjava.net/byterat/archive/2006/10/24/76886.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Rails Installing on Windows</title><link>http://www.blogjava.net/byterat/archive/2006/10/23/76680.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Mon, 23 Oct 2006 00:48:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2006/10/23/76680.html</guid><wfw:comment>http://www.blogjava.net/byterat/comments/76680.html</wfw:comment><comments>http://www.blogjava.net/byterat/archive/2006/10/23/76680.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byterat/comments/commentRss/76680.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byterat/services/trackbacks/76680.html</trackback:ping><description><![CDATA[
		<font face="Courier New" size="2">通常在Windows上安装Ruby on Rails都采用以下步骤:<br /></font>
		<p>
				<font face="Courier New" color="#000080" size="2">
						<strong>1.安装Ruby</strong>
				</font>
		</p>
		<p>
				<a href="http://rubyforge.org/frs/?group_id=167">
						<font face="Courier New" size="2">http://rubyforge.org/frs/?group_id=167</font>
				</a>
		</p>
		<p>
				<font face="Courier New" size="2">这里有windows一键安装版本</font>
		</p>
		<p>
				<font face="Courier New" color="#000080" size="2">
						<strong>2.在线安装Rails</strong>
				</font>
		</p>
		<p>
				<font size="2">
						<font face="Courier New">C:\&gt; <span style="COLOR: #000000">gem install rails </span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">include</span><span>-dependencies</span></font>
				</font>
		</p>
		<p>
				<span>
						<br />
						<br />
						<font face="Courier New" size="2">以上方法在一般情况下都是可行的, 但如果不行的话, 还可参照以下方法:<br /><br /></font>
						<font size="2">
								<font face="Courier New">
										<strong>
												<font style="BACKGROUND-COLOR: #ffffff" color="#000080">1. 访问:http://instantrails.rubyforge.org/wiki/wiki.pl<br />   <br />   下载最新版本的InstantRails<br /><br />2. 解压到你指定的目录下, 注意, 目录名(包括路径名)不能有空格<br /><br />3. 访问其中的readme.txt, 里面详细说明了如何配置和运行InstantRails</font>
										</strong>
										<br />
										<br />
								</font>
						</font>
				</span>
		</p>
<img src ="http://www.blogjava.net/byterat/aggbug/76680.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2006-10-23 08:48 <a href="http://www.blogjava.net/byterat/archive/2006/10/23/76680.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网友自做的婚礼利是红包, 看后不禁莞尔! </title><link>http://www.blogjava.net/byterat/archive/2006/10/20/76363.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Fri, 20 Oct 2006 04:37:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2006/10/20/76363.html</guid><wfw:comment>http://www.blogjava.net/byterat/comments/76363.html</wfw:comment><comments>http://www.blogjava.net/byterat/archive/2006/10/20/76363.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byterat/comments/commentRss/76363.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byterat/services/trackbacks/76363.html</trackback:ping><description><![CDATA[
		<img height="394" alt="1.jpg" src="http://www.blogjava.net/images/blogjava_net/byterat/1.jpg" width="390" border="0" />
		<br />
		<br />
		<img height="312" alt="2.jpg" src="http://www.blogjava.net/images/blogjava_net/byterat/2.jpg" width="394" border="0" />
		<br />
		<br />
		<img height="394" alt="3.jpg" src="http://www.blogjava.net/images/blogjava_net/byterat/3.jpg" width="525" border="0" />
		<br />
		<br />
		<img height="465" alt="4.jpg" src="http://www.blogjava.net/images/blogjava_net/byterat/4.jpg" width="394" border="0" />
<img src ="http://www.blogjava.net/byterat/aggbug/76363.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2006-10-20 12:37 <a href="http://www.blogjava.net/byterat/archive/2006/10/20/76363.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DHTML: 在已定义事件之前或之后执行你自己的代码!</title><link>http://www.blogjava.net/byterat/archive/2006/10/20/76291.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Fri, 20 Oct 2006 00:51:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2006/10/20/76291.html</guid><wfw:comment>http://www.blogjava.net/byterat/comments/76291.html</wfw:comment><comments>http://www.blogjava.net/byterat/archive/2006/10/20/76291.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byterat/comments/commentRss/76291.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byterat/services/trackbacks/76291.html</trackback:ping><description><![CDATA[
		<p>
				<font style="BACKGROUND-COLOR: #fffeff">
						<font face="Courier New" size="2">常常会遇到这样的情况, 即你自己写的一段Javascript代码需要在某DHTML事件中执行, 可这个DHTML事件已经被别的Javascript代码占用了!<br /><br />怎么办呢? <br /><br />参照以下Javascript代码片段:<br /><br /></font>
				</font>
		</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<font size="2">
						<font face="Courier New">
								<span style="COLOR: #008080">1</span>
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
								<span style="COLOR: #0000ff">var</span>
								<span style="COLOR: #000000"> e_onLoad </span>
								<span style="COLOR: #000000">=</span>
						</font>
				</font>
				<font size="2">
						<font face="Courier New">
								<span style="COLOR: #000000"> window.onload;<br /></span>
								<span style="COLOR: #008080">2</span>
								<span style="COLOR: #000000">
										<img id="Codehighlighter1_56_110_Open_Image" onclick="this.style.display='none'; Codehighlighter1_56_110_Open_Text.style.display='none'; Codehighlighter1_56_110_Closed_Image.style.display='inline'; Codehighlighter1_56_110_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
										<img id="Codehighlighter1_56_110_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_56_110_Closed_Text.style.display='none'; Codehighlighter1_56_110_Open_Image.style.display='inline'; Codehighlighter1_56_110_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />window.onload </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">function</span>
								<span style="COLOR: #000000">()</span>
								<span id="Codehighlighter1_56_110_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
						</font>
				</font>
				<span id="Codehighlighter1_56_110_Open_Text">
						<font size="2">
								<font face="Courier New">
										<span style="COLOR: #000000">{<br /></span>
										<span style="COLOR: #008080">3</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">your code</span>
								</font>
						</font>
						<span style="COLOR: #008000">
								<br />
						</span>
						<font size="2">
								<font face="Courier New">
										<span style="COLOR: #008080">4</span>
										<span style="COLOR: #008000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #000000">    </span>
										<span style="COLOR: #0000ff">if</span>
								</font>
						</font>
						<font size="2">
								<font face="Courier New">
										<span style="COLOR: #000000">(e_onLoad) e_onLoad();<br /></span>
										<span style="COLOR: #008080">5</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">your code</span>
								</font>
						</font>
						<span style="COLOR: #008000">
								<br />
						</span>
						<font size="2">
								<font face="Courier New">
										<span style="COLOR: #008080">6</span>
										<span style="COLOR: #008000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />
										</span>
										<span style="COLOR: #000000">}</span>
								</font>
						</font>
				</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<font size="2">
						<font face="Courier New">
								<span style="COLOR: #008080">7</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
								</span>
						</font>
				</font>
		</div>
		<p>
				<font face="Courier New" size="2">以上代码即可根据需要在别人的onLoad()事件之前或之后执行自己的代码!<br /></font>
		</p>
<img src ="http://www.blogjava.net/byterat/aggbug/76291.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2006-10-20 08:51 <a href="http://www.blogjava.net/byterat/archive/2006/10/20/76291.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>