<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1257611996578624646</id><updated>2012-01-21T02:21:14.894+01:00</updated><category term='ruby'/><category term='IronRuby'/><category term='ProMesh'/><category term='.net'/><category term='hibernate'/><category term='DDD'/><category term='jruby'/><category term='activehibernate'/><category term='javapolis'/><category term='nhibernate'/><category term='rails'/><category term='ASP.NET'/><title type='text'>Rubymatic</title><subtitle type='html'>Ruby and Things Less Dynamic</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rubymatic.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1257611996578624646/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://rubymatic.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>johan andries</name><uri>http://www.blogger.com/profile/07948066441740885991</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://bp0.blogger.com/_0c58_Ms8fiE/R1hUN5_vNYI/AAAAAAAAAAM/pTNkPM1zbf4/S220/jandries.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1257611996578624646.post-8733162457187541119</id><published>2010-05-26T09:59:00.000+02:00</published><updated>2010-05-26T10:00:19.205+02:00</updated><title type='text'>New Blog at AE</title><content type='html'>Please follow this &lt;a href="http://www.ae.be/blogs?field_blog_owner_uid=12"&gt;link&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257611996578624646-8733162457187541119?l=rubymatic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubymatic.blogspot.com/feeds/8733162457187541119/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1257611996578624646&amp;postID=8733162457187541119' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1257611996578624646/posts/default/8733162457187541119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1257611996578624646/posts/default/8733162457187541119'/><link rel='alternate' type='text/html' href='http://rubymatic.blogspot.com/2010/05/new-blog-at-ae.html' title='New Blog at AE'/><author><name>johan andries</name><uri>http://www.blogger.com/profile/07948066441740885991</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://bp0.blogger.com/_0c58_Ms8fiE/R1hUN5_vNYI/AAAAAAAAAAM/pTNkPM1zbf4/S220/jandries.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1257611996578624646.post-6688861674233374021</id><published>2007-11-23T11:15:00.000+01:00</published><updated>2007-11-24T08:59:10.951+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='activehibernate'/><title type='text'>JRuby (and ActiveHibernate) at JavaPolis</title><content type='html'>It's nice to see that &lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt; is getting the attention it deserves at &lt;a href="http://www.javapolis.com/confluence/display/JP07/Home"&gt;JavaPolis&lt;/a&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.javapolis.com/confluence/display/JP07/Introduction+to+JRuby"&gt;Introduction to JRuby&lt;/a&gt; at the university,&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.javapolis.com/confluence/display/JP07/Practical+JRuby+on+Rails"&gt;JRuby on Rails&lt;/a&gt; at the conference,&lt;/li&gt;&lt;li&gt;Birds-of-a-Feather (BOF) session on &lt;a href="http://www.javapolis.com/confluence/display/JP07/JRuby+BOF"&gt;JRuby&lt;/a&gt;,&lt;/li&gt;&lt;li&gt;A &lt;a href="http://www.javapolis.com/confluence/display/JP07/A+First+Look+at+ActiveHibernate"&gt;quicky&lt;/a&gt; on ActiveHibernate.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;And, while on the topic of ActiveHibernate, I have added support for lazy loading of entities and support for Hibernate &lt;a href="http://www.hibernate.org/hib_docs/v3/reference/en/html_single/#components"&gt;components&lt;/a&gt; (aka aggregation in Rails):&lt;BR/&gt;&lt;pre&gt;class Address&lt;br /&gt;  attr_accessor :street&lt;br /&gt;  attr_accessor :city&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class Person&lt;br /&gt;  include Hibernate&lt;br /&gt;  primary_key_accessor :id, :long&lt;br /&gt;  h_component :address,[[:street,:string],[:city,:string]]&lt;br /&gt;end&lt;/pre&gt;&lt;BR/&gt; I'll use the time that's left before JavaPolis to polish (i.e., clean up and extend the tests) the functionality that is in there today.&lt;/p&gt;&lt;p&gt;Anyway, I'm looking forward to meeting the JRuby team in Antwerp.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257611996578624646-6688861674233374021?l=rubymatic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubymatic.blogspot.com/feeds/6688861674233374021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1257611996578624646&amp;postID=6688861674233374021' title='26 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1257611996578624646/posts/default/6688861674233374021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1257611996578624646/posts/default/6688861674233374021'/><link rel='alternate' type='text/html' href='http://rubymatic.blogspot.com/2007/11/jruby-and-activehibernate-at-javapolis.html' title='JRuby (and ActiveHibernate) at JavaPolis'/><author><name>johan andries</name><uri>http://www.blogger.com/profile/07948066441740885991</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://bp0.blogger.com/_0c58_Ms8fiE/R1hUN5_vNYI/AAAAAAAAAAM/pTNkPM1zbf4/S220/jandries.JPG'/></author><thr:total>26</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1257611996578624646.post-4383669227829300144</id><published>2007-11-04T13:58:00.000+01:00</published><updated>2007-11-04T14:21:42.662+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ProMesh'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>.NET Web development without ASP.NET</title><content type='html'>A couple of weeks ago, &lt;a href="http://weblogs.asp.net/scottgu/"&gt;Scott Guthrie&lt;/a&gt; and &lt;a href="http://www.hanselman.com/blog/"&gt;Scott Hanselman&lt;/a&gt; showed the &lt;a href="http://weblogs.asp.net/scottgu/archive/2007/10/14/asp-net-mvc-framework.aspx"&gt;first bits&lt;/a&gt; of Microsoft's upcoming MVC framework for web development at the &lt;a href="http://www.altnetconf.com/home/closed"&gt;ALT.NET conference&lt;/a&gt;. It is amazing to see how much of ASP.NET they actually ditched to come up with a real MVC framework. Their work seems very nice (fully plugable, dependency injection, ...), and it actually looks remarkably well like &lt;a href="http://www.castleproject.org/monorail/index.html"&gt;MonoRail&lt;/a&gt; or &lt;a href="http://www.codeplex.com/ProMesh"&gt;ProMesh.NET&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;My current project switched from ASP.NET to ProMesh some time ago (which was not an easy decision given ASP.NET's omnipresence),  but this evolution proves it was the right thing to do.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257611996578624646-4383669227829300144?l=rubymatic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubymatic.blogspot.com/feeds/4383669227829300144/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1257611996578624646&amp;postID=4383669227829300144' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1257611996578624646/posts/default/4383669227829300144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1257611996578624646/posts/default/4383669227829300144'/><link rel='alternate' type='text/html' href='http://rubymatic.blogspot.com/2007/11/net-web-development-without-aspnet.html' title='.NET Web development without ASP.NET'/><author><name>johan andries</name><uri>http://www.blogger.com/profile/07948066441740885991</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://bp0.blogger.com/_0c58_Ms8fiE/R1hUN5_vNYI/AAAAAAAAAAM/pTNkPM1zbf4/S220/jandries.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1257611996578624646.post-5251744280634635160</id><published>2007-10-30T12:36:00.000+01:00</published><updated>2007-11-04T13:54:30.317+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='javapolis'/><category scheme='http://www.blogger.com/atom/ns#' term='activehibernate'/><title type='text'>ActiveHibernate update</title><content type='html'>Just added basic many-to-one support in the mapping DSL. I still hope to have a JRuby on Rails application running with ActiveHibernate before &lt;a href="http://www.javapolis.com/confluence/display/JP07/Home"&gt;Javapolis&lt;/a&gt;.&lt;br /&gt;&lt;P&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt;I'll be doing a Javapolis &lt;a href="http://www.javapolis.com/confluence/display/JP07/A+First+Look+at+ActiveHibernate"&gt;Quicky&lt;/a&gt; on ActiveHibernate. In the meanwhile one-to-many (has-many in ActiveRecord speak) has been added to the mapping DSL example.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257611996578624646-5251744280634635160?l=rubymatic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubymatic.blogspot.com/feeds/5251744280634635160/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1257611996578624646&amp;postID=5251744280634635160' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1257611996578624646/posts/default/5251744280634635160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1257611996578624646/posts/default/5251744280634635160'/><link rel='alternate' type='text/html' href='http://rubymatic.blogspot.com/2007/10/activehibernate-update.html' title='ActiveHibernate update'/><author><name>johan andries</name><uri>http://www.blogger.com/profile/07948066441740885991</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://bp0.blogger.com/_0c58_Ms8fiE/R1hUN5_vNYI/AAAAAAAAAAM/pTNkPM1zbf4/S220/jandries.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1257611996578624646.post-4585878825751712494</id><published>2007-09-25T20:01:00.000+02:00</published><updated>2007-09-25T20:10:49.776+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DDD'/><title type='text'>To DDD or not to DDD</title><content type='html'>Imagine the application you're currently working on. Imagine your users were happy with a primitive text based UI in a console, and imagine persistence was not an issue because you have an obscene amount of RAM (a billion terrabyte) and your server never crashes (so no DBMS needed).&lt;br /&gt;&lt;br /&gt;Would there be any complexity left to deal with in your software? If the answer is no, you're lucky (in a way). If the answer to this highly hypothetical question is still yes, then &lt;a href="http://www.domaindrivendesign.org/"&gt;domain driven design&lt;/a&gt; (DDD) might be the thing for you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257611996578624646-4585878825751712494?l=rubymatic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubymatic.blogspot.com/feeds/4585878825751712494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1257611996578624646&amp;postID=4585878825751712494' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1257611996578624646/posts/default/4585878825751712494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1257611996578624646/posts/default/4585878825751712494'/><link rel='alternate' type='text/html' href='http://rubymatic.blogspot.com/2007/09/to-ddd-or-not-to-ddd.html' title='To DDD or not to DDD'/><author><name>johan andries</name><uri>http://www.blogger.com/profile/07948066441740885991</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://bp0.blogger.com/_0c58_Ms8fiE/R1hUN5_vNYI/AAAAAAAAAAM/pTNkPM1zbf4/S220/jandries.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1257611996578624646.post-5160159702997383610</id><published>2007-09-25T15:34:00.000+02:00</published><updated>2007-09-27T08:12:21.716+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jruby'/><category scheme='http://www.blogger.com/atom/ns#' term='activehibernate'/><title type='text'>Subclasses with ActiveHibernate</title><content type='html'>Finally I resumed my work on ActiveHibernate. It now uses a XmlMarkup Builder and the visitor pattern to sort out the relationships between different persistent classes and to generate the mapping XML internally. This might sound like overkill, but even to get inheritance up and running it seemed like the only way to keep things maintainable. Anyway, the Ruby code&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class Payment&lt;br /&gt;  include Hibernate&lt;br /&gt;  hattr_accessor :amount,:double&lt;br /&gt;  ...&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class CreditCardPayment &amp;lt; Payment&lt;br /&gt;  join_with_table do&lt;br /&gt;    hattr_accessor :creditCardType,:string&lt;br /&gt;    ...&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class ChequePayment &amp;lt; Payment&lt;br /&gt;  hattr_accessor :chequeNumber,:string&lt;br /&gt;  ..&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;generates the mapping&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;class name="Payment" table="PAYMENT"&amp;gt;&lt;br /&gt;  &amp;lt;id name="id" type="long" column="PAYMENT_ID"&amp;gt;&lt;br /&gt;      &amp;lt;generator class="native"/&amp;gt;&lt;br /&gt;  &amp;lt;/id&amp;gt;&lt;br /&gt;  &amp;lt;discriminator column="PAYMENT_TYPE" type="string"/&amp;gt;&lt;br /&gt;  &amp;lt;property name="amount" type="double"/&amp;gt;&lt;br /&gt;  ...&lt;br /&gt;  &amp;lt;subclass name="CreditCardPayment" &amp;gt;&lt;br /&gt;      &amp;lt;join table="CREDIT_CARD_PAYMENT"&amp;gt;&lt;br /&gt;          &amp;lt;key column="PAYMENT_ID"/&amp;gt;&lt;br /&gt;          &amp;lt;property name="creditCardType" type="string" /&amp;gt;&lt;br /&gt;          ...&lt;br /&gt;      &amp;lt;/join&amp;gt;&lt;br /&gt;  &amp;lt;/subclass&amp;gt;&lt;br /&gt;  &amp;lt;subclass name="ChequePayment" &amp;gt;&lt;br /&gt;          &amp;lt;property name="chequeNumber" type="string" /&amp;gt;&lt;br /&gt;          ...&lt;br /&gt;  &amp;lt;/subclass&amp;gt;&lt;br /&gt;&amp;lt;/class&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;The &amp;lt;join/&amp;gt; construct in the CreditCardPayment mapping allows to &lt;a href="http://www.hibernate.org/hib_docs/v3/reference/en/html/inheritance.html#inheritance-tablepersubclass-discriminator"&gt;combine the table-per-class-hierarchy and the table-per-subclass mapping strategies&lt;/a&gt; in one inheritance hierarchy. In the Ruby mapping DSL it can be nicely expressed with a class method (table name and key are optional arguments) and a block. The fact that a Ruby class definition is just ordinary Ruby code (with self referring to a Class object) opens a whole new world to the simple Java developer that I am.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;In Subversion soon.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257611996578624646-5160159702997383610?l=rubymatic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubymatic.blogspot.com/feeds/5160159702997383610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1257611996578624646&amp;postID=5160159702997383610' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1257611996578624646/posts/default/5160159702997383610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1257611996578624646/posts/default/5160159702997383610'/><link rel='alternate' type='text/html' href='http://rubymatic.blogspot.com/2007/09/subclasses-with-activehibernate.html' title='Subclasses with ActiveHibernate'/><author><name>johan andries</name><uri>http://www.blogger.com/profile/07948066441740885991</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://bp0.blogger.com/_0c58_Ms8fiE/R1hUN5_vNYI/AAAAAAAAAAM/pTNkPM1zbf4/S220/jandries.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1257611996578624646.post-2505715026423376289</id><published>2007-09-11T07:52:00.000+02:00</published><updated>2007-09-11T08:49:43.949+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='nhibernate'/><title type='text'>Deep Cloning an Object Graph in .NET</title><content type='html'>The other day I was looking at the really nice &lt;a href="http://ralinx.wordpress.com/2007/07/15/nhibernate-mapping-examples/"&gt;NHibernate mapping examples&lt;/a&gt; by Davy Brion. His entity base class looks like this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;public abstract class Entity&lt;t&gt;&lt;br /&gt;{&lt;br /&gt;   private long _id = -1;&lt;br /&gt;&lt;br /&gt;   public virtual long Id&lt;br /&gt;   {&lt;br /&gt;      get { return _id; }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public virtual T Clone()&lt;br /&gt;   {&lt;br /&gt;      MemoryStream memoryStream = new MemoryStream();&lt;br /&gt;      BinaryFormatter binaryFormatter = new BinaryFormatter();&lt;br /&gt;      binaryFormatter.Serialize(memoryStream, this);&lt;br /&gt;      memoryStream.Position = 0;&lt;br /&gt;      return (T)binaryFormatter.Deserialize(memoryStream);&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;It is used like so:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;public class Order : Entity&amp;lt;Order&amp;gt;&lt;br /&gt;{&lt;br /&gt;   //...&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The Order class derives from a template class that uses the Order class itself as parameter. I had never seen this before, and, for example, it gives all your entities a Clone() method that returns the proper type.&lt;br /&gt;&lt;br /&gt;What's even more interesting is the way the Clone() method has been implemented by just serializing to a memory stream, immediately followed by a deserialization. It gives you a deep clone of your entity, together with all child entities it references. This technique is robust, simple, clean and generic (requiring no extra development effort).&lt;br /&gt;&lt;br /&gt;I can imagine some people will object to this because of performance, but that only makes me think of all the crimes that are committed daily in the name of performance and (premature) optimization.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257611996578624646-2505715026423376289?l=rubymatic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubymatic.blogspot.com/feeds/2505715026423376289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1257611996578624646&amp;postID=2505715026423376289' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1257611996578624646/posts/default/2505715026423376289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1257611996578624646/posts/default/2505715026423376289'/><link rel='alternate' type='text/html' href='http://rubymatic.blogspot.com/2007/09/deep-cloning-object-graph-in-net.html' title='Deep Cloning an Object Graph in .NET'/><author><name>johan andries</name><uri>http://www.blogger.com/profile/07948066441740885991</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://bp0.blogger.com/_0c58_Ms8fiE/R1hUN5_vNYI/AAAAAAAAAAM/pTNkPM1zbf4/S220/jandries.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1257611996578624646.post-3613043176695033050</id><published>2007-08-27T00:13:00.000+02:00</published><updated>2007-08-27T00:18:02.789+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='activehibernate'/><title type='text'>ActiveHibernate follow-up</title><content type='html'>Not much happened the last couple of weeks because it was our summer vacation (which summer?). I have cleaned up the existing code a bit, and now I'm working on a Ruby way for Hibernate inheritance mapping.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257611996578624646-3613043176695033050?l=rubymatic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubymatic.blogspot.com/feeds/3613043176695033050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1257611996578624646&amp;postID=3613043176695033050' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1257611996578624646/posts/default/3613043176695033050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1257611996578624646/posts/default/3613043176695033050'/><link rel='alternate' type='text/html' href='http://rubymatic.blogspot.com/2007/08/activehibernate-follow-up.html' title='ActiveHibernate follow-up'/><author><name>johan andries</name><uri>http://www.blogger.com/profile/07948066441740885991</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://bp0.blogger.com/_0c58_Ms8fiE/R1hUN5_vNYI/AAAAAAAAAAM/pTNkPM1zbf4/S220/jandries.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1257611996578624646.post-5195067180656735157</id><published>2007-08-15T21:43:00.000+02:00</published><updated>2007-08-15T22:06:02.203+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jruby'/><category scheme='http://www.blogger.com/atom/ns#' term='activehibernate'/><title type='text'>Towards a mapping DSL for AH</title><content type='html'>Last week Ola Bini sent me a patch that showed a Hibernate mapping written inside the Ruby class definition, instead of relying on hand-written XML files (the horror!), like so:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;class Project&lt;br /&gt;    include Hibernate&lt;br /&gt;&lt;br /&gt;    with_table_name "PROJECTS" #optional&lt;br /&gt;&lt;br /&gt;    primary_key_accessor :id,:long,:PROJECT_ID&lt;br /&gt;    hattr_accessor       :date,:timestamp,:START_DATE&lt;br /&gt;    #column name is optional&lt;br /&gt;    hattr_accessor       :name,:string&lt;br /&gt;    hattr_accessor       :complexity,:double&lt;br /&gt;    hattr_accessor       :size,:long&lt;br /&gt;    hattr_accessor       :on_time,:boolean&lt;br /&gt;end&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;By including the Hibernate module (as opposed to inheriting from a framework base class), the Hibernate mapping is generated and configured automatically. Utility class methods (like "save" and"find") and accessor methods for the mapped properties are also added.&lt;br /&gt;&lt;br /&gt;It's all in the file dsl_test.rb (see the link in the top right corner for the code repository). It is far from complete, but thanks to Ola I can start filling the gaps (like inheritance, relations, components, ...). Let me know what you think!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257611996578624646-5195067180656735157?l=rubymatic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubymatic.blogspot.com/feeds/5195067180656735157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1257611996578624646&amp;postID=5195067180656735157' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1257611996578624646/posts/default/5195067180656735157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1257611996578624646/posts/default/5195067180656735157'/><link rel='alternate' type='text/html' href='http://rubymatic.blogspot.com/2007/08/towards-mapping-dsl-for-ah.html' title='Towards a mapping DSL for AH'/><author><name>johan andries</name><uri>http://www.blogger.com/profile/07948066441740885991</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://bp0.blogger.com/_0c58_Ms8fiE/R1hUN5_vNYI/AAAAAAAAAAM/pTNkPM1zbf4/S220/jandries.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1257611996578624646.post-763516646800719043</id><published>2007-08-06T12:58:00.000+02:00</published><updated>2007-08-06T13:02:23.517+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='jruby'/><category scheme='http://www.blogger.com/atom/ns#' term='activehibernate'/><title type='text'>First ActiveHibernate code on Google Code</title><content type='html'>Because &lt;em&gt;it's all talk until the code runs&lt;/em&gt;, I have finally imported my code into a Google Code project (&lt;a href="http://code.google.com/p/activehibernate"&gt;http://code.google.com/p/activehibernate&lt;/a&gt;). There is no formal release yet, so you'll have to use a Subversion client to get it (or just browse the repository online). There's a readme file that explains how to get the tests running.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;All feedback is more than welcome, as I'm new to (J)Ruby. I'm also very interested in ideas for a Ruby-like interface to Hibernate. The first thing that should be done is replacing the hbm.xml mapping files by a kind of annotations or a DSL (inspired by Rails or GORM, the OR/M in Grails).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257611996578624646-763516646800719043?l=rubymatic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubymatic.blogspot.com/feeds/763516646800719043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1257611996578624646&amp;postID=763516646800719043' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1257611996578624646/posts/default/763516646800719043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1257611996578624646/posts/default/763516646800719043'/><link rel='alternate' type='text/html' href='http://rubymatic.blogspot.com/2007/08/first-activehibernate-code-on-google.html' title='First ActiveHibernate code on Google Code'/><author><name>johan andries</name><uri>http://www.blogger.com/profile/07948066441740885991</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://bp0.blogger.com/_0c58_Ms8fiE/R1hUN5_vNYI/AAAAAAAAAAM/pTNkPM1zbf4/S220/jandries.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1257611996578624646.post-1090271139952883065</id><published>2007-07-27T11:19:00.000+02:00</published><updated>2007-07-27T12:36:58.809+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='jruby'/><category scheme='http://www.blogger.com/atom/ns#' term='activehibernate'/><title type='text'>ActiveHibernate: time to package</title><content type='html'>&lt;p&gt;Good news. Hibernate collection mapping is up and running. Well, one example that is: Hibernate's bag type now works with Ruby Array's, lazy loading included. To get started I've done a shameless copy/paste of the Hibernate code for the bag collection type. That went fairly easy because the Java class RubyArray implements the java.util.List interface. So now the mapping files look like&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;hibernate-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;class table="BLOGS" lazy="false" entity-name="Blog"&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;tuplizer entity-mode="dynamic-map"&lt;br /&gt;            class="activehibernate.RubyTuplizer"/&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;id name="id" column="BLOG_ID" type="long"&amp;gt;&lt;br /&gt;            &amp;lt;generator class="identity"/&amp;gt;&lt;br /&gt;        &amp;lt;/id&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;property name="title" type="string" /&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;bag name="items"&lt;br /&gt;             collection-type="activehibernate.RubyArrayType"&amp;gt;&lt;br /&gt;            &amp;lt;key column="blog_id" /&amp;gt;&lt;br /&gt;            &amp;lt;one-to-many entity-name="Item"/&amp;gt;&lt;br /&gt;        &amp;lt;/bag&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;/class&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/hibernate-mapping&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;where Blog and Item are genuine Ruby classes. The nice part is that I haven't touched any existing Hibernate or JRuby code.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The plan is to package the things I already have (still need to write more tests to show what is working) and put it on SourceForge or Google Code to get some feedback from JRuby and/or Hibernate people. (I can very well imagine I've made things to complex where simpler solutions exist out-of-the-box.) After that it's time to start looking at ways to get rid of the XML mapping files by writing a friendly Ruby interface around the Hibernate details.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I hope that after some time this project will be stable/useful enough to be part of JRuby Extras at RubyForge.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257611996578624646-1090271139952883065?l=rubymatic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubymatic.blogspot.com/feeds/1090271139952883065/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1257611996578624646&amp;postID=1090271139952883065' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1257611996578624646/posts/default/1090271139952883065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1257611996578624646/posts/default/1090271139952883065'/><link rel='alternate' type='text/html' href='http://rubymatic.blogspot.com/2007/07/activehibernate-time-to-package.html' title='ActiveHibernate: time to package'/><author><name>johan andries</name><uri>http://www.blogger.com/profile/07948066441740885991</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://bp0.blogger.com/_0c58_Ms8fiE/R1hUN5_vNYI/AAAAAAAAAAM/pTNkPM1zbf4/S220/jandries.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1257611996578624646.post-6099126342618108612</id><published>2007-07-23T12:35:00.000+02:00</published><updated>2007-07-23T12:44:19.195+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='jruby'/><category scheme='http://www.blogger.com/atom/ns#' term='activehibernate'/><title type='text'>ActiveHibernate: First Steps</title><content type='html'>Things are going smoother than I expected. Hibernate 3 already supports the use of dynamic maps and XML documents (these are alternative entity-mode's in Hibernate lingo) through the tuplizer mechanism. By extending Hibernate's AbstractEntityTuplizer class it is remarkably simple to let Hibernate work directly with instances of IRubyObject. Features like inheritance and many-to-one relations seem to work fine. (Haven't tried components and proxies yet.)&lt;br /&gt;&lt;br /&gt;Now I'm trying to get collection mapping working (one-to-many). Hibernate wraps the user's collection (which would be a Ruby Array in our case) by its own implementation (of some java.util collection interface like java.util.List when dealing with POJOs) to track additions/removals and to support lazy collection loading. Customizing this is also nicely supported by Hibernate through user collection types. For this we need a wrapper that looks (walks, swims and quacks) like an Array to the Ruby code, and implements org.hibernate.collection.PersistentCollection to keep Hibernate happy on the Java side. I haven't found any other solution than to write a JRuby Java extension (by implementing JRuby's BasicLibraryService interface) to create a RubyObject subclass named PersistentRubyArray (to stay in line with the Hibernate naming convention) that wraps a RubyArray instance.&lt;br /&gt;&lt;br /&gt;Anyway, it's fun to manipulate Ruby objects from within Java like puppets on a string, and to see how it all fits naturally with Hibernate.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257611996578624646-6099126342618108612?l=rubymatic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubymatic.blogspot.com/feeds/6099126342618108612/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1257611996578624646&amp;postID=6099126342618108612' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1257611996578624646/posts/default/6099126342618108612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1257611996578624646/posts/default/6099126342618108612'/><link rel='alternate' type='text/html' href='http://rubymatic.blogspot.com/2007/07/activehibernate-first-steps.html' title='ActiveHibernate: First Steps'/><author><name>johan andries</name><uri>http://www.blogger.com/profile/07948066441740885991</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://bp0.blogger.com/_0c58_Ms8fiE/R1hUN5_vNYI/AAAAAAAAAAM/pTNkPM1zbf4/S220/jandries.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1257611996578624646.post-5681998304422319861</id><published>2007-07-18T20:54:00.000+02:00</published><updated>2007-07-18T21:51:36.294+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='jruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='IronRuby'/><category scheme='http://www.blogger.com/atom/ns#' term='activehibernate'/><title type='text'>JRuby + Hibernate = ActiveHibernate?</title><content type='html'>&lt;div&gt;&lt;/div&gt;A &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;couple&lt;/span&gt; of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;months&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;ago&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Ola&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Bini&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;coined&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;the&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;idea&lt;/span&gt; of &lt;a href="http://ola-bini.blogspot.com/2007/04/activehibernate-any-takers.html"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;ActiveHibernate&lt;/span&gt;&lt;/a&gt; as &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;an&lt;/span&gt; extra &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;option&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;when&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;running&lt;/span&gt; Rails on  &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;JRuby&lt;/span&gt; (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;complementary&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;to&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;ActiveRecord-JDBC&lt;/span&gt;). &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;After&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;some&lt;/span&gt; debug &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;sessions&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;through&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;the&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;Hibernate&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;and&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;JRuby&lt;/span&gt; code I have &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;convinced&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;myself&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;that&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;this&lt;/span&gt; is &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;indeed&lt;/span&gt; a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;nice&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;and&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;feasable&lt;/span&gt; project &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;to&lt;/span&gt; start (or try to, at least). As &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_35"&gt;Ola&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_36"&gt;mentioned&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_37"&gt;there&lt;/span&gt; are &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_38"&gt;two&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_39"&gt;parts&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_40"&gt;to&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_41"&gt;this&lt;/span&gt;:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Configure/tweak Hibernate to let it work directly with the org.jruby.RubyObject class. I'm already impressed by the clean internal design of the Hibernate code, and the possibility to plug in custom implementations of Hibernate interfaces through the hbm.xml mapping files.&lt;/li&gt;&lt;li&gt;Provide a Rubyish interface to the Hibernate configuration and functionality, following the fine Ruby on Rails tradition.&lt;/li&gt;&lt;/ol&gt;Point one seems the hardest to me, as I would like to keep the number of changes to org.hibernate (and org.jruby) code very low. None if possible (?). For the second point, ActiveRecord, Grails' O/R mapper (GORM) and Hibernate Annotations can serve as examples to learn from. I'm also looking forward to IronRuby to see if it could be married to NHibernate in a similar way.&lt;br /&gt;&lt;br /&gt;As soon as I have something up and running I'll post the code to SourceForge, or RubyForge, or ... What would be the most appropriate hosting site for this kind of project?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1257611996578624646-5681998304422319861?l=rubymatic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubymatic.blogspot.com/feeds/5681998304422319861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1257611996578624646&amp;postID=5681998304422319861' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1257611996578624646/posts/default/5681998304422319861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1257611996578624646/posts/default/5681998304422319861'/><link rel='alternate' type='text/html' href='http://rubymatic.blogspot.com/2007/07/jruby-hibernate-activehibernate.html' title='JRuby + Hibernate = ActiveHibernate?'/><author><name>johan andries</name><uri>http://www.blogger.com/profile/07948066441740885991</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://bp0.blogger.com/_0c58_Ms8fiE/R1hUN5_vNYI/AAAAAAAAAAM/pTNkPM1zbf4/S220/jandries.JPG'/></author><thr:total>1</thr:total></entry></feed>
