??xml version="1.0" encoding="utf-8" standalone="yes"?>日本高清无卡码一区二区久久 ,久久精品这里只有精99品,亚洲中文字幕久久精品无码喷水http://www.shnenglu.com/aqazero/category/2881.htmlzh-cnTue, 20 May 2008 11:57:31 GMTTue, 20 May 2008 11:57:31 GMT60CLASSPATH杂记http://www.shnenglu.com/aqazero/archive/2005/12/19/14209.htmlbrentbrentMon, 19 Dec 2005 01:25:00 GMThttp://www.shnenglu.com/aqazero/archive/2005/12/19/14209.htmlhttp://www.shnenglu.com/aqazero/comments/14209.htmlhttp://www.shnenglu.com/aqazero/archive/2005/12/19/14209.html#Feedback0http://www.shnenglu.com/aqazero/comments/commentRss/14209.htmlhttp://www.shnenglu.com/aqazero/services/trackbacks/14209.html

本来java虚拟机是q么q行?br />D:\java -classpath D:\hibernate-3.0\eg org.hibernate.auction.Main

q个命o行将告诉java虚拟机的c装载器从D:\hibernate-3.0\eg\org\hibernate\auction处装载Main.class?br />如果省略"-classpath D:\hibernate-3.0\eg"Q即D:\java org.hibernate.auction.Main 则类装蝲器将会从pȝ环境变量CLASSPATH指定的位|寻扄合条件的Main.class?/p>


如果CLASSPATH?;D:\jdk150\lib\tools.jar;D:\jdk150\jre\lib\rt.jar;D:\hibernate-3.0\eg
则类装蝲器先查找当前q行目录(.表示当前目录)Q此处ؓD:\Q如果D:\下面有D:\org\hibernate\auction\Main.classQ则装蝲q个文g。如果没有,l箋在D:\jdk150\lib\tools.jar文g中寻找是否有路径为org\hibernate\auction\Main.class的文?如果没有则寻找D:\hibernate-3.0\eg\org\hibernate\auction\Main.class。如果在q些路径中都没找刎ͼ׃提示一个鸟错误。注意D:\hibernate-3.0\eg只表C将在此路径下寻找D:\hibernate-3.0\eg\org\hibernate\auction\Main.class文gQ不会在此\径下?jar文g中l寻找?/p>


据说很多开发环境往往不去ȝl\径,直接java -classpath .....Q这也就是在外面q行的东东挺溜的q了开发环境就死菜的原因喽?/p>

brent 2005-12-19 09:25 发表评论
]]>
关于Hibernate的记?/title><link>http://www.shnenglu.com/aqazero/archive/2005/12/19/14210.html</link><dc:creator>brent</dc:creator><author>brent</author><pubDate>Mon, 19 Dec 2005 01:23:00 GMT</pubDate><guid>http://www.shnenglu.com/aqazero/archive/2005/12/19/14210.html</guid><wfw:comment>http://www.shnenglu.com/aqazero/comments/14210.html</wfw:comment><comments>http://www.shnenglu.com/aqazero/archive/2005/12/19/14210.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/aqazero/comments/commentRss/14210.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/aqazero/services/trackbacks/14210.html</trackback:ping><description><![CDATA[ <strong>我和hibernate的第一ơ亲密:<br /><br /></strong>我用的数据库是mssqlQ用middlegenE里哗啦生成一堆文件。编译运行,hibernate报告一堆异常,大概是说QMSSQL JDBC抗议说他不能d已经读过的字D,所以hibernate不能生成需要的collection。最后icepeak传给我一个JSQLConnectQ终于把q个问题解决了?br /><br /><strong>讄hibernate生成定制的主键ID</strong>Q?br /><p>在和hibernate亲密接触之后,我想按照自己的想法来设计l织机构.对于Organ,Department,Post和Stuff.我希望这栯计主键的ID,cd都是char,格式?<br />Organ0000000001<br />Dept0000000001<br />Post0000000001<br />Stuff0000000002</p><p>修改middlegen产生?hbm.xml文g:</p><p>......<br /><class<br />    name="com.abcdefg.hibernate.Organ"<br />    table="Organ"<br />><br />    <id<br />        name="organId"<br />        type="java.lang.String"<br />        column="OrganId"<br />    ><br />        <generator class="hbtest.PkGenerator"><br />            <param name="table">PKGenerator_table</param><br />            <param name="column">NextOrganId</param><br />            <param name="max_lo">0</param><br /> </generator><br />    </id><br />......<br /></class></p><p>扑ֈ的资料说:"如果需要采用定制的主键产生法Q则在此处配|主键生成器Q主键生成器必须实现net.sf.hibernate.id.IdentifierGenerator 接口".我找了半天都没找到net.sf.hibernate.id.IdentifierGenerator.其实只要从hibernate自n提供的一些主键生成器l承可?从hibernate的源文g可以看到q些主键生成器实现的接口是org.hibernate.id</p><p>我的PkGenerator.java文g:<br />package hbtest;</p><p>import org.hibernate.id.TableHiLoGenerator;<br />import java.io.Serializable;<br />import java.util.Properties;</p><p>import org.apache.commons.logging.Log;<br />import org.apache.commons.logging.LogFactory;<br />import org.hibernate.HibernateException;<br />import org.hibernate.dialect.Dialect;<br />import org.hibernate.engine.SessionImplementor;<br />import org.hibernate.type.Type;<br />import org.hibernate.type.IntegerType;<br />import org.hibernate.util.PropertiesHelper;</p><p>public class PkGenerator<br />    extends TableHiLoGenerator {</p><p>  private String columnName;</p><p>  public void configure(Type type, Properties params, Dialect d) {<br />    super.configure(new IntegerType(), params, d);<br />    this.columnName = PropertiesHelper.getString(COLUMN, params,<br />                                                 DEFAULT_COLUMN_NAME);<br />  }</p><p>  public synchronized Serializable generate(SessionImplementor session,<br />                                            Object obj) throws<br />      HibernateException {<br />    Object result = super.generate(session, obj);<br />    String strNumber = result.toString();<br />    StringBuffer strResult = new StringBuffer("");<br />    if (columnName.compareToIgnoreCase("NextOrganId") == 0) {<br />      strResult.append("Organ");<br />    }<br />    else if(columnName.compareToIgnoreCase("NextDeptId") == 0){<br />      strResult.append("Dept");<br />    }<br />    ......</p><p>    if (strNumber.length() > 10)<br />      throw new HibernateException("The generated " + strResult +<br />                                   "Id is too long!");<br />    else if (strNumber.length() == 10) {<br />      strResult.append(strNumber);<br />    }<br />    else {<br />        int count = 10 - strNumber.length();<br />        while (count > 0) {<br />        strResult.append("0");<br />        count--;<br />      }<br />      strResult.append(strNumber);<br />    }<br />    return strResult.toString();<br />  }<br />}</p><p>实现了以后发现在q些主键前面d"Organ","Dept"之类的ƈ不是特别有用,而且我开始的出发点还是错?也许我应该徏立更多的映射?..?</p><p><a rel="nofollow"><font color="#003399">Hibernate的初U指?br /></font></a><br /><strong>hibernate贴心的地?/strong>Q?br /></p><div>验证了一下,我的担心l于被证实是多余的了Q我担心的是hibernate会ؓ同一条记录生一堆不同的对象?/div><div>我觉得hibernate真正实用的条Ӟ为同一条记录生的多个对象是同一个对象。当然前提是讄了主键?/div><div>hibernate也许是将当前d的对象保存在一个哈希表Q在M个新对象的时候会先从q个哈希表中查找。好像这q不是多困难的事情?/div><div> </div><div>但多U程情况下就有所不同?.</div><div>因ؓHibernate?对于Session)Q?/div><div>It is not intended that implementors be threadsafe. Instead each thread/transaction should obtain its own instance from a SessionFactory</div><div> </div><div>Sessionq没有要求是U程安全的,而通过实验表明记录和对象的一一对应只存在于同一个Session中。这也是hibernate的文档中HibernateUtilcM用ThreadLocal的原因吧?/div><div>所以对于多U程的情况,在不同的U程中,对应同一条记录的对象是不同的?br /><br />(另hibernate有二U缓存,是全局的缓存,可以用来减少数据库负载,二~存的功能需要设|才会启?<br /><br /><strong>Hibernate中修改多对多关系的属性:</strong><br /><p><middlegen>中有如?lt;table>配置:<br />   <table generate="true" name="Post"/><br />   <table generate="true" name="Stuff"/><br />   <many2many><br />      <tablea generate="true" name="Post" /> <br />      <jointable name="PostStuff" generate="true" /> <br />      <tableb generate="true" name="Stuff" /> <br />   </many2many><br />卌Post与Stuff的关pL多对多,而且表PostStuff中一个字D|JoinDate:员工加入部门的时间?/p><p>我现在想加入一条Post记录Q一条Stuff记录Q然后设|Stuff加入Post的时间。经q多ơ尝试,代码如下Q?br />   ...<br />   Dept dept = ....<br />   Post post = new Post("third post1",dept,new HashSet(),new HashSet());<br />   Stuff stuff = new Stuff("third stuff",new HashSet(),new HashSet());<br />   session.save(stuff);<br />   session.save(post);<br />   post.getStuffs().add(stuff);<br />   //stuff.getPosts().add(post);/*不能与上一行ƈ存,会有异常Q因为是一个死循环Q?/<br />   PostStuff postStuff = (PostStuff)session.createQuery("from PostStuff where PostId = '" + post.getPostId() + "' AND StuffId = '" + stuff.getStuffId() + "'").iterate().next();<br />   postStuff.setJoinDate(new java.util.Date());<br />   tx.commit();<br />   HibernateUtil.closeSession();<br />   ...</p><p>post.getStuffs().add(stuff);在两个Save()之后Q而且没有调用session.flush()Q但是createQuery能够得到PostStuff说明HQL是先从内存中查询数据的。不需要调用session.flush()来写入数据库Q因为tx.commit()会自动调用?/p><p>可以用session.persist(stuff)来替换session.save(stuff)Q我晕,明明save有说明会创徏idQ而persist没有说明会创建id?但实际上是创Z)?/p><p>试图用以下替代post.getStuffs().add(stuff):<br />   PostStuff postStuff = new PostStuff();<br />   postStuff.setPost(post);<br />   postStuff.setStuff(stuff);<br />   postStuff.setJoinDate(new java.util.Date());<br />   postStuff.setComp_id(new PostStuffPK(post.getPostId(),stuff.getStuffId()));<br />   post.getPostStuffs().add(postStuff);<br />l果是虽然没有异常,但ƈ不会d一条关pR?/p><p>或?/p><p>   session.flush();<br />   session.refresh(stuff);<br />   ((PostStuff)(stuff.getPostStuffs().iterator().next())).setJoinDate(new java.util.Date());<br />注意q些代码只是用来作试验用?/p></div><img src ="http://www.shnenglu.com/aqazero/aggbug/14210.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/aqazero/" target="_blank">brent</a> 2005-12-19 09:23 <a href="http://www.shnenglu.com/aqazero/archive/2005/12/19/14210.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate启动q慢的问题以及我的批处理http://www.shnenglu.com/aqazero/archive/2005/12/19/14212.htmlbrentbrentMon, 19 Dec 2005 00:43:00 GMThttp://www.shnenglu.com/aqazero/archive/2005/12/19/14212.htmlhttp://www.shnenglu.com/aqazero/comments/14212.htmlhttp://www.shnenglu.com/aqazero/archive/2005/12/19/14212.html#Feedback0http://www.shnenglu.com/aqazero/comments/commentRss/14212.htmlhttp://www.shnenglu.com/aqazero/services/trackbacks/14212.htmlicepeak:
 hibernate肯定没什么问题的
 我也遇到启动很慢的情况,都是我的问题
 你把你的映射文g发给我看?br />icepeak:
 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" " 你用h3Q但是却写h2的配|文Ӟh傻??变成3好
icepeak:
 我想你得不到id也许和映文档有问题也有关系
 什么都不用改,qidentityQ再试试?
 我觉得是映射文g配置错误D了不能读?
 是2.0?.0的错?
 
So...问题解决?

俺用了三个批处理来自动生成hibernate的文件?br /> 
execant.bat:
d:
cd D:\hibernate-3.0\middlegen-2.1\samples\
rem 打开build.xml修改middlegen配置
editplus.exe build.xml
ant
 
myant.bat:
call execant.bat
pause
rem 复制hbm和java文g到工E目?br />xcopy .\build\gen-src\com\glacierbbs\hibernate\*.java E:\eclipse\workspace\JGlacier\src\com\glacierbbs\hibernate\ /Y /D
xcopy .\build\gen-src\com\glacierbbs\hibernate\*.xml E:\eclipse\workspace\JGlacier\src\ /Y /D
rem 替换掉hbm中的字符?br />call E:\eclipse\workspace\JGlacier\cutter.bat
pause
 
cutter.bat:
e:
cd E:\eclipse\workspace\JGlacier\src
dir *.xml /d /b /a-d >hbmfiles.txt
rem 版?.0Ҏ3.0
for /f %%i in (hbmfiles.txt) do strrpc /s:%%i 2.0 3.0 /c
rem hi/lo的max_lo?00Ҏ0...我只需要简单的数字
for /f %%i in (hbmfiles.txt) do strrpc /s:%%i 100 0 /c
del hbmfiles.txt>nul
rem 所有hi/lo法ȝ是同一个表中的不同字段
strrpc /s:Board.hbm.xml next_value next_boardid /c
strrpc /s:Post.hbm.xml next_value next_postid /c
strrpc /s:Topic.hbm.xml next_value next_topicid /c
strrpc /s:UserBasic.hbm.xml next_value next_userid /c
strrpc /s:Vote.hbm.xml next_value next_voteid /c
strrpc /s:VoteOption.hbm.xml next_value next_voteoptionid /c
strrpc /s:VoteParticipant.hbm.xml next_value next_voteparticipantid /c
cd ..
pause
 
然后Qؓ每个hibernate生成的javacd个Adapterc?..从此世界安静了....



brent 2005-12-19 08:43 发表评论
]]>
tomcat jsp errorpage记录http://www.shnenglu.com/aqazero/archive/2005/12/19/14224.htmlbrentbrentMon, 19 Dec 2005 00:39:00 GMThttp://www.shnenglu.com/aqazero/archive/2005/12/19/14224.htmlhttp://www.shnenglu.com/aqazero/comments/14224.htmlhttp://www.shnenglu.com/aqazero/archive/2005/12/19/14224.html#Feedback0http://www.shnenglu.com/aqazero/comments/commentRss/14224.htmlhttp://www.shnenglu.com/aqazero/services/trackbacks/14224.html直接讄Tomcat路径到当前项目\?虚拟路径):
D:\Tomcat55\conf\Catalina\localhost\GlacierBBS.xml:
<Context docBase="E:/eclipse/GlacierBBS/GlacierBBS" path="GlacierBBS"
         privileged="true" antiResourceLocking="false" antiJARLocking="false" reloadable="true">
</Context>

Eclipse + WTP (web tools platform) 很强...
jsp文g和servletcL件的~码方式
和在jsp和servlet中指?response.setCharacterEncoding("UTF-8");)的编码方式的不同?br />一个是文g内部的编码,另一个是把文件内部编码发送到客户端后Q客L以什么编码方式来阅读。jsp和servlet生成客户端html的时候,q不会自动进行编码的转换?/p>

errorpage路径讄错误产生异常:
java.lang.NullPointerException
org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:690)
org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:657)
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:805)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:778)
org.apache.jsp.index_jsp._jspSer...

从文件\径错误到NullPointerException...需要很强的惌?br />
书籍memo:《Tomcat ?Java Web 开发技术详解?/p>

brent 2005-12-19 08:39 发表评论
]]>
菜鸟学用middlegenhttp://www.shnenglu.com/aqazero/archive/2005/09/14/14213.htmlbrentbrentWed, 14 Sep 2005 03:25:00 GMThttp://www.shnenglu.com/aqazero/archive/2005/09/14/14213.htmlhttp://www.shnenglu.com/aqazero/comments/14213.htmlhttp://www.shnenglu.com/aqazero/archive/2005/09/14/14213.html#Feedback0http://www.shnenglu.com/aqazero/comments/commentRss/14213.htmlhttp://www.shnenglu.com/aqazero/services/trackbacks/14213.html俺是java和hibernate和ant的绝对的三料菜鸟。hibernateg很好用,但是写表对应的类?hbm.xml文g实在头大。所以俺x一Ƒ֏以自动生成这些文件的工具?/div>

俺找Cmiddlegen。它的主地址?a >http://boss.bekk.no/boss/middlegen/index.html。我google了一些中文网,提供的地址没有一个不失效的?_-。光有middlegenq不够,因ؓ它用ant来配|它的build。它的一个bulid生成的东西就是一堆的你可以用?java,.hbm.xml,.class,.war文g。真是够贴心的。可是俺觉得它的配置可是一炚w不脓心?/div>

你要是没有antQ请先下载ant。俺一直打不开官方的地址Q所以从pchome下蝲http://dlfjgwbn.pchome.net:8080/development/java/apacheant161.zip。解压文件后可以用了,但等{,你需要安装了jdkQ设|了CLASSPATHQJAVA_HOME。然后把ant的目录下的bin文gҎ加到path环境变量Q设|ANT_HOME?br />我的机器上的讄Q?br />CLASSPATH .;D:\jdk150\lib\tools.jar;D:\jdk150\jre\lib\rt.jar
JAVA_HOME D:\jdk150
Path  D:\apache-ant-1.6.1\bin;
ANT_HOME D:\apache-ant-1.6.1
 
然后下蝲q解压middlegen。我解压CD:\hibernate-3.0\middlegen-2.1。好了,现在可以开始build hibernate需要的文g了,有个D:\hibernate-3.0\middlegen-2.1samples的文件夹Q它存放了一个build的例子,我决定修改这个例子然后用?/div>
 
但是再等{。middlegen需要你提供一些必要的配置。它需要连接到你的数据库,所以你需要给它提供数据库的连接信息和驱动库。各U数据库的配|信息在目录D:\hibernate-3.0\middlegen-2.1\samples\config\database 下面。俺的数据库是mssqlQ所以俺打开了mssql.xml文gQ配|了信息如下Q?/div>
   <property name="database.script.file"           value=""/>
   <property name="database.driver.file"           value="${lib.dir}/mssqlserver.jar"/>
   <property name="database.driver"                value="com.microsoft.jdbc.sqlserver.SQLServerDriver"/>
   <property name="database.url"                   value="jdbc:microsoft:sqlserver://localhost:1433"/>
   <property name="database.userid"                value="sa"/>
   <property name="database.password"              value="haha"/>
   <property name="database.schema"                value="dbo"/>
   <property name="database.catalog"               value="aljoin_info"/>
   <property name="jboss.datasource.mapping"       value="MS SQLSERVER"/>
aljoin_info是俺的数据库名称。ƈ把msbase.jarQmssqlserver.jarQmsutil.jar拯到D:\hibernate-3.0\middlegen-2.1\samples\lib目录?/div>
然后~辑D:\hibernate-3.0\middlegen-2.1\samples\build.xml文gQ将"ENTITY database SYSTEM"的值改?file:./config/database/mssql.xml"
 
更改q个build的其它属性。build.xml中更改project的属?
<project name="Middlegen aljoni_info" default="hbm2java" basedir=".">
 ...
 <property name="name"                           value="com.aljoin.gas"/>

删除D:\hibernate-3.0\middlegen-2.1\samples\build下的所有文件。然后打开命o行,
cd D:\hibernate-3.0\middlegen-2.1\samples
ant
q时候ant会自动读build.xml文gQ找到projectQ运行名?hbm2java"及其依赖的target.因ؓ俺是菜鸟,什么ejb,jbo俺通通用不到.如果你不是菜?可以讄成default="all",而且如果您的pȝ没有安装jboss之类的会出错,但我惛_果您不是菜鸟应该也不会看到这里了hoho :p
 
在蟩出的E序界面上按generate。等待结束,然后关闭E序界面。在命o行窗口看到正在生?java文g的信息?/div>
查看D:\hibernate-3.0\middlegen-2.1\samples\build目录。上帝保佑你会看C些你需要的文g?/div>
 
到写完这烂文,一个早上已l过去,俺又把青春A献给了党-_-||


brent 2005-09-14 11:25 发表评论
]]>LifeApplet 阅读W记http://www.shnenglu.com/aqazero/archive/2005/08/11/14206.htmlbrentbrentThu, 11 Aug 2005 09:32:00 GMThttp://www.shnenglu.com/aqazero/archive/2005/08/11/14206.htmlhttp://www.shnenglu.com/aqazero/comments/14206.htmlhttp://www.shnenglu.com/aqazero/archive/2005/08/11/14206.html#Feedback0http://www.shnenglu.com/aqazero/comments/commentRss/14206.htmlhttp://www.shnenglu.com/aqazero/services/trackbacks/14206.html关于“生命”游?a >由此q?/a>?br />关于LifeApplet由此q?/a>Q源文g下蝲?br />
本来惌qwtl写个CA(l胞自动?E序Q阅MLifeApplet后打消了念头。写q篇W记像初中时一个月语文作业没写最后滥竽充数几交上去Q算是给自己一个交待?/p>

怎么写一个CAE序和想写怎样的一个CAE序有关。刚看完《上帝与新物理学》,我按照书上的规则和图案写了一个世界只?0*20大小的CAQ细胞的q算是一个个计算的,计算一代就h昄一ơ,一个细胞用一个字节来保存Q可以原谅的是我当时q规则都不清楚,目的只是验证一下规则?/p>

看了Alan Hensel的代码后Q可能大部分写过CAE序的h都会觉得汗颜?_-|||。体验过Alan Hensel 的LifeApplet的h׃看到:他的世界真大Q实际上?^20 * 2^20个像素;速度真快Q可以设|fps(每秒hơ数)QGenerations/Frame(每次h间隔生多少?Q如果设|ؓwarpQCPU׃撒开腿跑h...q可以设|规则,CA的规则不止Conway的那个,其它的也很有?/p>

数据l构Q?br />LifeCell:
Alan Hensel世界分成一个个16*16的单元,用LifeCellc表C。每个LifeCell包含两个数组表示 p[]Qq[] = new short[16]Qd16*16 bitsQ表C?6*16个细胞。ƈ且在q个数组中按照一U奇怪的方式来排列,比如LifeCell中坐标ؓ(1,1)的点在数l中的位|是65(见LifeCell文g)Q代表这个点的bit在p[6](和q[6])?strong>左vW?位。ؓ什么要q么表示Q我x作者ؓ了以后unroll法的方ѝ他I竟怎么得出q个Ҏ的,我不知道。?/p>

每个LifeCell需要两个数l是因ؓCA的算法要求的q算必须是ƈ行的。所以只能p生成q,q生成pQ没什么好说的?/p>

每个LifeCell保存了相ȝ东、西、南、北、东南、东北、西南、西北的LifeCell的指针?br />保存了上一个,下一个LifeCell的指针。所有LifeCell保存在一个链表中?br />保存了上一个,下一个需要显C的LifeCell的指针,用于昄?br />保存了一个Down的LifeCell的指针,用于hash查找?br />保存了坐标x,y?br />保存了一些状态,qstate,pstate,flags和优化用的?/p>

LifeHash:
因ؓ所有LifeCell都放|于一个链表。而经常要用LifeCell的坐标来查找LifeCellQ比如修Ҏ个点的状态:Z在某个点攄一个细胞,需要通过点的坐标q算出LifeCell的坐标,再通过LifeCell的坐标找到LifeCell对象?br />在链表中查找一个对象的q算复杂度是o(n)。n在此处最大可?^16 * 2^16(把整个世界都占满Q这也相当不Ҏ)Q所以对于一些超大的CA来说Q查找v来会很浪Ҏ间。。。所以有了LifeHashcR?/p>

LifeHash中保存了一?^HASHSIZE * 2^HASHSIZE的LifeCell对象指针数组Q数l中每个对象l护一个链表,坐标x,y中低HASHSIZE位的gLLifeCell攑֜q个链表中。通过x,y可以快速找到这个链表,然后用上面说到的Down指针Q比?x,y)来找到具体的LifeCell。这LZ来讲减少了查找时?..(我算不出来,?。究竟用多大的HASHSIZE才好Q作者的值是6Q就是占用了2^12 * sizeof(int) = 16k bytes内存?/p>

LifeRulesQ?br />LifeRules的目的在于把用字W串表示的规则{化成一个bool[512]?br />比如"23/3"表示?个或3个相ȝ胞的l胞l箋存活Q如果一个位|旁边刚好有3个细胞,q个位置在下一步就要长Z个细胞?br />׃一个位|有8个相ȝ位置Q加上自wؓ9位。把9个位|排序得C个数Qd512个。比如对?xC8Q表C北、西有细胞,自n有细胞,Ҏ"23/3" bool[0xC8]的值应该ؓtrue?/p>

法Q?br />Z提高效率QAlan Hensel把LifeCell中每?*4的运都unroll了。所以在LifeGen文g中可以看到进一步的setRules(boolean[] Rule)函数Q这个函数设|了了crunch(和munch)= new short[65536]。原理和LifeRules中类|是不知道这个运过E怎么得出的,作者数学肯定非常好。?/p>

因ؓl胞的运是以LifeCell为单元来q算的,一个单元的l胞会媄响到盔R的单元。如果每ơ运的时候都考虑盔R8个LifeCell的话Q会造成CPU的浪贏V所以在LifeGen中可以看到运p状态和q状态时QLifeCell的位|是不一L。从p状态生成q状态时Q检查了东、南、东南方向相ȝLifeCellQ生成的q状态的位置为p状态往东南各偏UM个细胞。所以如果p状态v始坐标ؓ16x,16yQ那么q状态时Qv始坐标是16x+1, 16y+1(注意坐标pLؓMMQx在往东方向ؓ正,y在往南方向ؓ?。在从q状态到p状态时Q检查西、北、西北方向相ȝLifeCellQ回到p状态的位置?/p>

其中具体的运就了吧,反正我没看明白。看明白的地方也不知道ؓ什么。。作者太强悍了?/p>

U程Q?br />q种E序当然臛_要两个线E了Q一个UIU程Q一个WorkU程。UIU程在LifeFrame中,没做什么事Q就是把事g发送给Life对象(见Life.Java)QLife收到事g后ƈ没有马上处理Q而是攑ֈ一个队列中LifeQueue?br />UIU程一启动Q就启动了workU程?br />在Life的run()中,处理l胞的繁衍LifeGen.generate()Q显C,然后处理LifeQueue中的事g?br />在LifeGen.generate()中控制生成繁衍的ơ数和显C的速度?br />Z么两个线E同时对LifeQueue操作却没有声明synchronous呢?对java不熟Q不敢妄a?/p>

有空q可以l研I。先到此为止。反正作业就q么E里糊涂交上去了?/p>

brent 2005-08-11 17:32 发表评论
]]>
About Conway's Game of Life Applet of Alan Henselhttp://www.shnenglu.com/aqazero/archive/2005/07/22/14207.htmlbrentbrentFri, 22 Jul 2005 10:15:00 GMThttp://www.shnenglu.com/aqazero/archive/2005/07/22/14207.htmlhttp://www.shnenglu.com/aqazero/comments/14207.htmlhttp://www.shnenglu.com/aqazero/archive/2005/07/22/14207.html#Feedback0http://www.shnenglu.com/aqazero/comments/commentRss/14207.htmlhttp://www.shnenglu.com/aqazero/services/trackbacks/14207.html [A Life pattern called the puffer train]

原文:http://www.ibiblio.org/lifepatterns/lifeapplet.html

 当前版本0.41dQ更新时?001-1-31Q比0.41c?199-1-22)上提高了些性能。新版本在计划中Q只要我的空余时间允许?br /> 作?Alan Hensel,

介:
认识我的人都知道我ؓ什么写q个E序。不是ؓ了学习JavaQ不是ؓ了提高我的网站的讉K量,原因很简单:
我收集Life patternsQ而且我喜Ƣ展C它?/p>

当然Q这些patterns中的大部分是别h发现的。没人想要从q些Life patterns中获利,所以据我所知这些patterns留l后代ƈ被赏识,p国际象棋一栗?/p>

请不要给我写信说Q我喜欢你的E序Q却忘记提vq些patterns。这听v来会象是恭维集邮爱好者他的邮册如何漂亮,寚w却只字不提。我的程序只是做了它们该做的事情而已?/p>

计算Y件和g只是使用者和他的数据之间的工?/em>?/p>

q些patterns让h赞叹。如果不信,你可以自己去做一个试试?我希望这个挑战能促成一些发现?


l那些写LifeE序的学生:
我没有可以给你的源代码。这里没有你扄东西。我提供了这个程序的源代码,但它们超Z计算E的范围。它们之所以这么复杂是因ؓ速度优化(q样我才能运?Breeder"或者其它更大的patterns)。当Ӟ你可以试着读读源代码,但不要强q自己。你写的作业应该比这个程序简单一癑ր?/p>

l来q里学习Java applets的读?
q是我第一个真正意义上的applet。最好别打算把我的代码拷贝到你的E序中。源代码在q一늚底部Q你可以免费下蝲Q当Ӟ你必Mؓ它付Z东西。若非如此,q将会是一个让人相当有学习动力的appletE序?br />
你怎么做到q么快的Q?/strong>
好的。没有留心的话也怽不会发现我的E序闪电一L快。你也许没看?Warp Speed"按钮Q或者你q没用过它,或者你觉得q无所谓。这L话你可以跌q个部分?br />有h问,你究竟是怎么让它跑得q么快的Q!对于q些好奇者,或者那些打写自己的超U细胞自动机E序的hQ我会解释的?/p>

我們֐于把l胞自动机的优化和数据压~联pv来。这也是一个简单的概念却需要复杂的Ҏ。究竟什么才是最好的Ҏ取决于数据本w。对于康威的LifeQ們֐于出现点状的图案?/p>

对于点状分布的世界,我们应该考虑把它分割成近似大的块。对于Life来说Q?x4?x8都是可取的。我选择?x8Q因?刚好8比特1字节Q我曄考虑q?x4Q但q行h效果不大好?/p>

q且h意:如果pattern长大q超q了块的范围Q需要引入新的块。你可以单的U性搜索,也可折半查找Q或者维护某U映。我的方法是哈希表。这个表只是用来查找一个新块的d。每个已存在的块已经有它的邻居的指针Qƈ且会被多ơ用?/p>

必须有高效的法来处理这些块内部的数据,我选择一ơ处理块中的所有数据。在处理完整个块之前不需要蟩转语句。换句话来说Q所有内部@环都被unroll了,q用了高速的查询表?/p>

注意QCA(l胞自动?E序一般性的包含了两个主要@?加上一个显C@?Q因为CA规则要求对细胞进行ƈ行处理,但微处理器是U性的。这意味着必须有世界的两分拯Q这样创Z一代的时候本w的信息才不会被破坏掉。通常q两个拷贝是不对U的。这Ҏ来说相当ȝQ因为每ơ我从这边取Z东西q行优化Q不得不在另一边加点别的什么!几乎每次Q例外的情况D了最好的优化。特别的,需要在位操作:位移Q屏蔽和重组之间折中来找一个最好的查找表?/p>

有时块中的细胞会出现E_的情况,不需要进一步处理。你可以把块从队列中UdQ把它设|成“冬眠”状态,只有当邻q的块媄响到它。这些块不需要占用处理器的时_象空白的区域一栗?/p>

周期ؓ2的振荡器q把它移出处理队列ƈ不难。这对于LifeE序是值得的,因ؓblinker是最常见的随机的D余物。更复杂的振荡器相对比较见。检ƈ模拟滑翔Z是可能的。这些方面的优化会得到递减的效果,除非你做到极致?如HasLife)?/p>

同样Q死亡状态:I的块不必马上释攑ƈ从哈希表中移走。那样会占用更多的处理器旉Q尤其是当振荡器在一定空间内U进Ud的时候。仅当可用内存已l很的时候,才从M队列中移除最老的M的块?/p>

当程序快C定程度,必须考虑h昄的速度不需要超qh眼可以感知的速度Q或者最不需要超q显C器的刷新频率。特别是在视H环境,昄旉会是效率的瓶颈?/p>


源代?/strong>
以下是我的超U快速的Game of Life applet源代码?br />很抱歉这些不是百分百面向对象的。Game of Lifeq不适合面向对象技术。面向对象适用于你到的大多数问题Q除了那些效率第一而且相当复杂的项目,康威的Game of Life正好属于q种情况?br />
以下?6个源文g:

LifeButton.java
LifeFrame.java
Life.java
LifeGUI.java
LifeGen.java
LifeCell.java
LifeHash.java
LifeCoordinate.java
LifeRules.java
LoadBox.java
RuleBox.java
SpeedBox.java
OptionsBox.java
LifeQueue.java
LifeCallback.java
DescribeBox.java



brent 2005-07-22 18:15 发表评论
]]>
"生命"游戏http://www.shnenglu.com/aqazero/archive/2005/07/13/14208.htmlbrentbrentWed, 13 Jul 2005 02:06:00 GMThttp://www.shnenglu.com/aqazero/archive/2005/07/13/14208.htmlhttp://www.shnenglu.com/aqazero/comments/14208.htmlhttp://www.shnenglu.com/aqazero/archive/2005/07/13/14208.html#Feedback0http://www.shnenglu.com/aqazero/comments/commentRss/14208.htmlhttp://www.shnenglu.com/aqazero/services/trackbacks/14208.html1Q有2个或?个邻子的子在下一?下一?仍然存活
2Q没有或只有1个邻q棋子要?于孤?Q有4个或4个以上的d的棋子要死(于拥挤)
3Q若1个空格正好与3个不I的gؓ邻,那么Q这个空格就要生Z个棋子来
Ҏq些规则Q某些v始的囑Ş能够演化出“各U最令h惊讶的美丽图案”。书上有两个例子?br />我看到这里就想着写个E序来实现这L“游戏”,q一边兴奋的惌着各种各样的图案,我将会是那些二维生物的上帝!
刚好我在学WTLQ昨天就用WTL写了个程序,一开始我对规则的理解q不正确Q达不到书上E序的效果,E序改得很沮丧,哪天把程序写完整了再上传?..
今天早上用google找了一?生命 U翰 康威'....原来人家已经..原来q个游戏?970q就被h无数ơ的写过...甚至都可以找到applet源代?br />http://www.ibiblio.org/lifepatterns/
http://www.radicaleye.com/lifepage/


brent 2005-07-13 10:06 发表评论
]]>
Ʒþþþþ| ɫav˾þô߽ӰԺ| 99þùѸ| ƷѾþþþþþþ| XxŷʸƷþþþþ| þۺۺϾþ97ɫ| ŷպĻþþò| ۺϾþĻӰ| þþѾƷre6| ߳߳þþ91| ݺɫþþۺ| þ99þ99СݾƷӿ| ˼˼þ99ѾƷ6| þþƷav| þۺɫHEZYO| 7777Ʒþþô߽| Ůþþ| þav뾫Ʒ˳| þþùҺ| ޹˾þþƷӰ| þ˾Ʒһ| ܻƺ۵վþmimiɫ| ŷһþ| þùҹƵ| þþƷĻ̾ | ȾþùþƷ| þҹӰԺѹۿ| ?VþþƷ | ŷպƷþ| þþƷavˮ| ĻþòҰav| þоƷƵ| ƷŷþþþӰ| þݺҹҹվ| ƷëٸAVѾþ| ĻƷþþþþ3Dն| ƷȾþav| ƷŮþþ| Ʒþþþþù| 99þó18վ| 99þù޸ۿ2024 |