<?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-8846192348938095935</id><updated>2012-02-16T19:47:47.620-08:00</updated><category term='rhok yerbus'/><title type='text'>Behind This Code...</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://behindthiscode.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8846192348938095935/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://behindthiscode.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Julian Gutierrez Oschmann</name><uri>http://www.blogger.com/profile/12519804603155056873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8846192348938095935.post-65543924251447059</id><published>2010-12-08T17:37:00.000-08:00</published><updated>2010-12-21T05:31:47.135-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rhok yerbus'/><title type='text'>YerBUS at RHOK</title><content type='html'>Last week we have won the RHOK!&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Our system: YerBUS, can be accessed at &lt;a href="http://wiki.rhok.org/YerBus_-_Building_Trust"&gt;http://wiki.rhok.org/YerBus_-_Building_Trust&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Thanks to all for the excellent organization and such a nice weekend.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8846192348938095935-65543924251447059?l=behindthiscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://behindthiscode.blogspot.com/feeds/65543924251447059/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8846192348938095935&amp;postID=65543924251447059' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8846192348938095935/posts/default/65543924251447059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8846192348938095935/posts/default/65543924251447059'/><link rel='alternate' type='text/html' href='http://behindthiscode.blogspot.com/2010/12/yerbus-at-rhok.html' title='YerBUS at RHOK'/><author><name>Julian Gutierrez Oschmann</name><uri>http://www.blogger.com/profile/12519804603155056873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8846192348938095935.post-4662260690848695913</id><published>2010-07-24T12:36:00.000-07:00</published><updated>2010-07-25T16:43:50.362-07:00</updated><title type='text'>Distributed OSGI and remote services</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_anAxX-0QnEQ/TEywSyIBluI/AAAAAAAAAGo/0AL3x6ctAuI/s1600/Telefono+de+Latas.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 231px; height: 280px;" src="http://3.bp.blogspot.com/_anAxX-0QnEQ/TEywSyIBluI/AAAAAAAAAGo/0AL3x6ctAuI/s320/Telefono+de+Latas.jpg" alt="" id="BLOGGER_PHOTO_ID_5497963081852098274" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;OSGI 4.2 specifies a standard for expose remote services. The idea behind the standard is provide the platform with a standard way for publishing and subscribing to services not running in the same JVM.&lt;br /&gt;&lt;br /&gt;If you never heard about OSGI, services are like plain old Java interfaces with a managed life cycle (and optionally, some properties).&lt;br /&gt;&lt;br /&gt;The standard is very technology agnostic and doesn't made any assumptions about the provider protocols and communication models.&lt;br /&gt;&lt;br /&gt;The service management is a good example of the&lt;a href="http://www.osgi.org/wiki/uploads/Links/whiteboard.pdf"&gt; white-board pattern&lt;/a&gt;.&lt;br /&gt;At a glance, it provides a decoupled mechanism with very late binding between services and protocol providers.&lt;br /&gt;&lt;br /&gt;Its very important to take some considerations at the design time, when you are working with potentials remote services. The most important one is, don't assume call-by-reference semantic. Other consideration are: what types can handle the underlying protocol. There is no technology-agnostic golden rule here.&lt;br /&gt;&lt;br /&gt;Implementations and providers&lt;br /&gt;&lt;br /&gt;While the reference implementation for remote services is &lt;a href="http://cxf.apache.org/distributed-osgi.html"&gt;Apache CXF&lt;/a&gt;, there is a very interesting and promising provider: &lt;a href="http://wiki.eclipse.org/OSGi_4.2_Remote_Services_and_ECF"&gt;ECF&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The Eclipse Communication Framework is an effort of the Eclipse community with the aim of a common API for IPC (Actually, inter-OSGI environments communication).&lt;br /&gt;&lt;br /&gt;ECF works upon the Container abstraction. ECF containers represent access to         a protocol-specific communications context and can represent both point-to-point communications (e.g. client/server) and         publish-and-subscribe (group) communications.&lt;br /&gt;&lt;br /&gt;ECF (like almost all Eclipse RCP components) does heavy use of adapters. Client can adapt the Container interface for custom protocol functionality access.&lt;br /&gt;&lt;br /&gt;There are a lot of adapters under the Container's umbrella for common communication patterns.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Datashare API&lt;br /&gt;&lt;/li&gt;&lt;li&gt;File Transfer API&lt;/li&gt;&lt;li&gt;Remote Services API&lt;/li&gt;&lt;li&gt;Discovery API&lt;/li&gt;&lt;li&gt;Telephony API&lt;/li&gt;&lt;li&gt;IPC API (real IPC, not IPC between OSGI JVMs)    &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;There is container implementations for common protocols like BitTorrent, IRC, Jabber, MSN and XMPP. Also there is a generic one with support for Datashare API and Remote Services API.&lt;br /&gt;&lt;br /&gt;The integration between OSGI R4.2 remote services and ECF seems to be very natural and seamless.&lt;br /&gt;&lt;br /&gt;Additionally, ECF provides asynchronous service invocation ("callback style" and  "Future style") by only writing an asynchronous interface. ECF at proxy creation time, and by name convention, creates the appropriate plumbing code for the async invocation.&lt;br /&gt;&lt;br /&gt;In my next post, I will write some examples using remote services and declarative services using Spring DM.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8846192348938095935-4662260690848695913?l=behindthiscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://behindthiscode.blogspot.com/feeds/4662260690848695913/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8846192348938095935&amp;postID=4662260690848695913' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8846192348938095935/posts/default/4662260690848695913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8846192348938095935/posts/default/4662260690848695913'/><link rel='alternate' type='text/html' href='http://behindthiscode.blogspot.com/2010/07/distributed-osgi-and-remote-services.html' title='Distributed OSGI and remote services'/><author><name>Julian Gutierrez Oschmann</name><uri>http://www.blogger.com/profile/12519804603155056873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_anAxX-0QnEQ/TEywSyIBluI/AAAAAAAAAGo/0AL3x6ctAuI/s72-c/Telefono+de+Latas.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8846192348938095935.post-1184883608264974291</id><published>2010-06-26T14:20:00.001-07:00</published><updated>2010-06-27T18:41:02.114-07:00</updated><title type='text'>Buckets Puzzle</title><content type='html'>Some days ago, a friend of mine give me a little puzzle to solve. The puzzle is about fill two buckets A and B of sizes 5 litres and 3 litres : starting with two empty buckets (with unlimited water), can you finish with exactly 4 litres in bucket A?&lt;br /&gt;&lt;br /&gt;The problem can be solved building a graph (actually, a digraph) with all possibles states of both buckets and all possible transitions between states. Later the solution is very simple: just find a path between the initial state (both buckets empties) and the final state (bucket A with 4 litres of water)&lt;br /&gt;&lt;br /&gt;Lets be a node a pair of values (a,b) representing the current quantity of water in bucket "A" and "B" respectively.&lt;br /&gt;&lt;br /&gt;There is a edge in graph G between vertex S and T iff (S,T) e R, with R:&lt;br /&gt;&lt;br /&gt;Rule 1) For all state (a,b) , a &gt; 0, ((a,b),(0,b)) e R (Empty A)&lt;br /&gt;&lt;br /&gt;Rule 2) For all state (a,b) , b &gt; 0, ((a,b),(a,0)) e R (Empty B)&lt;br /&gt;&lt;br /&gt;Rule 3) For all state (a,b) , a &lt; 5, ((a,b),(5,b)) e R (Fill out A)&lt;br /&gt;&lt;br /&gt;Rule 4) For all state (a,b) , b &lt; 3, ((a,b),(a,3)) e R (Fill out B)&lt;br /&gt;&lt;br /&gt;Rule 5) For all state (a,b) , b &gt; 0, ((a,b),(min(5,a+b),0)) e R (From B to A)&lt;br /&gt;&lt;br /&gt;Rule 6) For all state (a,b) , a &gt; 0, ((a,b),(0,min(3,a+b))) e R (From A to B)&lt;br /&gt;&lt;br /&gt;Rule 7) For all state (a,b) , a + b &gt;= 5 , b &gt; 0, ((a,b),(5,b-(5-a))) e R (From B to A until A is full)&lt;br /&gt;&lt;br /&gt;Rule 8) For all state (a,b) , a + b &gt;= 3 , a &gt; 0, ((a,b),(a-(3-b),3)) e R (From A to B until B is full)&lt;br /&gt;&lt;br /&gt;Now, the solution is the shortest path between state (0,0) and (4,0).&lt;br /&gt;This can be done with Dijkstra shortest path algorithm.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/juliangutierrezo/behindthiscode/buckets.tar.gz"&gt;This is the Java&lt;/a&gt; program with the problem solved for buckets of any sizes. A Dot file is generated for the graph with the solution.&lt;br /&gt;&lt;br /&gt;This is the Dot graphic for the solution.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_anAxX-0QnEQ/TCZv1tCSakI/AAAAAAAAAGc/vErUSSLcXNM/s1600/stateGraph.gif"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 119px;" src="http://1.bp.blogspot.com/_anAxX-0QnEQ/TCZv1tCSakI/AAAAAAAAAGc/vErUSSLcXNM/s320/stateGraph.gif" alt="" id="BLOGGER_PHOTO_ID_5487196164410468930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;br /&gt;&lt;br /&gt;J.-&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8846192348938095935-1184883608264974291?l=behindthiscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://behindthiscode.blogspot.com/feeds/1184883608264974291/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8846192348938095935&amp;postID=1184883608264974291' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8846192348938095935/posts/default/1184883608264974291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8846192348938095935/posts/default/1184883608264974291'/><link rel='alternate' type='text/html' href='http://behindthiscode.blogspot.com/2010/06/buckets-puzzle.html' title='Buckets Puzzle'/><author><name>Julian Gutierrez Oschmann</name><uri>http://www.blogger.com/profile/12519804603155056873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_anAxX-0QnEQ/TCZv1tCSakI/AAAAAAAAAGc/vErUSSLcXNM/s72-c/stateGraph.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8846192348938095935.post-3360994940628713477</id><published>2008-09-13T15:55:00.000-07:00</published><updated>2008-09-13T16:04:05.939-07:00</updated><title type='text'>Software Architecture</title><content type='html'>Some very interesting thoughts about layer/tier concepts...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pranshujain.wordpress.com/2006/09/15/layers-and-tiers/"&gt;Pranshu Jain&lt;/a&gt; &lt;span style="font-family:verdana;"&gt;- Software Architecture and Content Management Blog&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8846192348938095935-3360994940628713477?l=behindthiscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://behindthiscode.blogspot.com/feeds/3360994940628713477/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8846192348938095935&amp;postID=3360994940628713477' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8846192348938095935/posts/default/3360994940628713477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8846192348938095935/posts/default/3360994940628713477'/><link rel='alternate' type='text/html' href='http://behindthiscode.blogspot.com/2008/09/software-architecture.html' title='Software Architecture'/><author><name>Julian Gutierrez Oschmann</name><uri>http://www.blogger.com/profile/12519804603155056873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8846192348938095935.post-8603572398887810732</id><published>2008-05-06T11:08:00.000-07:00</published><updated>2008-05-06T11:16:21.197-07:00</updated><title type='text'>Circular Program Calculation</title><content type='html'>Yesterday, I took a dissertation of Alberto Pardo about Circular program&lt;br /&gt;Calculation. Here the abstract:&lt;br /&gt;&lt;br /&gt;Circular programs are a powerful technique to express multiple traversal algorithms as a single traversal function in a lazy setting. In this paper, we present a shortcut deforestation technique to calculate circular programs. The technique we propose takes as input the composition of two functions, such that the first builds an intermediate structure and some additional context information which are then processed by the second one, to produce the final result. Our transformation into circular programs achieves intermediate structure deforestation and multiple traversal elimination. Furthermore, the calculated programs preserve the termination properties of the original ones.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fing.edu.uy/%7Epardo/papers/hw07.pdf"&gt;full paper&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8846192348938095935-8603572398887810732?l=behindthiscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://behindthiscode.blogspot.com/feeds/8603572398887810732/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8846192348938095935&amp;postID=8603572398887810732' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8846192348938095935/posts/default/8603572398887810732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8846192348938095935/posts/default/8603572398887810732'/><link rel='alternate' type='text/html' href='http://behindthiscode.blogspot.com/2008/05/circular-program-calculation.html' title='Circular Program Calculation'/><author><name>Julian Gutierrez Oschmann</name><uri>http://www.blogger.com/profile/12519804603155056873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8846192348938095935.post-8763605095337663229</id><published>2008-02-06T04:03:00.000-08:00</published><updated>2008-02-06T04:51:21.182-08:00</updated><title type='text'>Model checking - One step forward</title><content type='html'>Edmund M. Clarke, E. Allen Emerson, and Joseph Sifakis are the recipients of the  &lt;span style="font-weight: bold;"&gt;2007 A.M.Turing Award&lt;/span&gt; for their work on an automated method for finding design errors in computer hardware and software.&lt;br /&gt;&lt;br /&gt;The &lt;span style="font-weight: bold;"&gt;Turing Award&lt;/span&gt;, presented annually by the Association for Computing Machinery, is considered to be the most prestigious award in computing. Often referred to as "the Nobel Prize of computing," it is named for British mathematician Alan M. Turing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8846192348938095935-8763605095337663229?l=behindthiscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://behindthiscode.blogspot.com/feeds/8763605095337663229/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8846192348938095935&amp;postID=8763605095337663229' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8846192348938095935/posts/default/8763605095337663229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8846192348938095935/posts/default/8763605095337663229'/><link rel='alternate' type='text/html' href='http://behindthiscode.blogspot.com/2008/02/model-checking-one-step-forward.html' title='Model checking - One step forward'/><author><name>Julian Gutierrez Oschmann</name><uri>http://www.blogger.com/profile/12519804603155056873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8846192348938095935.post-1792991935116878556</id><published>2008-01-28T05:02:00.000-08:00</published><updated>2008-01-28T05:08:10.456-08:00</updated><title type='text'>Objects have not failed</title><content type='html'>Objects have clearly succeeded.   &lt;p&gt;Here is some practical evidence: According to the most recent 2002 North American Developer Survey by Evans Data Corporation, over half the developers surveyed are using Java. About 1/7 of developers surveyed are using C#. Roughly half of those also use Java, so the fraction of surveyed developers using one or both is about 3/5. The numbers for both languages are expected to increase next year. Over 1/5 of developers surveyed are using Enterprise Java Beans; almost 2/5 are using COM+; and nearly 2/3 are using JavaScript (which at least &lt;em&gt;tries&lt;/em&gt; to be object-oriented).&lt;/p&gt;    &lt;p&gt;The main strengths of object-oriented programming are that it encourages the abstraction and encapsulation of state, and that objects are a good model for most entities in the real world.&lt;/p&gt;    &lt;p&gt;Thirty years ago, most programming was procedural in nature. The unit of programming was the procedure, the subroutine, the function, the algorithm. Data declarations tended to be strewn about and were not abstracted. An array of integers might be any of several conceptual data structures, and it was not always apparent which of the many procedures accepting an integer array argument were actually intended to apply to that particular array. So it was necessary to document data structures fairly carefully, outside the programming language–in comments, for example.&lt;/p&gt;    &lt;p&gt;Object-oriented programming clusters data with code that is appropriate and relevant to that data. The trade-off is that sometimes it is difficult to grasp and to envision entire algorithms, because the fragments of an algorithm are spread out among the many methods associated with various object types. So in object-oriented programming it is necessary to document &lt;em&gt;methods&lt;/em&gt; fairly carefully, in comments, perhaps, but also in interface declarations.&lt;/p&gt;    &lt;p&gt;Fred Brooks, in Chapter 9 of &lt;em&gt;The Mythical Man-Month&lt;/em&gt;, said this:&lt;/p&gt;    &lt;blockquote&gt;Show me your flowchart and conceal your tables, and I shall continue to be mystified. Show me your tables, and I won't usually need your flowchart; it'll be obvious.&lt;/blockquote&gt;    &lt;p&gt;That was in 1975.&lt;/p&gt;    &lt;p&gt;Eric Raymond, in &lt;em&gt;The Cathedral and the Bazaar&lt;/em&gt;, paraphrased Brooks' remark into more modern language:&lt;/p&gt;    &lt;blockquote&gt;Show me your code and conceal your data structures, and I shall continue to be mystified. Show me your data structures, and I won't usually need your code; it'll be obvious.&lt;/blockquote&gt;    &lt;p&gt;That was in 1997, and Raymond was discussing a project coded in C, a procedural language. But for an object-oriented language, I think this aphorism should be reversed, with a twist:&lt;/p&gt;    &lt;blockquote&gt;Show me your interfaces, the contracts for your methods, and I won't usually need your field declarations and class hierarchy; they'll be &lt;em&gt;&lt;i&gt;&lt;b&gt;irrelevant&lt;/b&gt;&lt;/i&gt;&lt;/em&gt;.&lt;/blockquote&gt;    &lt;p&gt;I think, however, that practitioners of both procedural and object-oriented languages can agree on Raymond's related point:&lt;/p&gt;    &lt;blockquote&gt;Smart data structures and dumb code works a lot better than the other way around.&lt;/blockquote&gt;    &lt;p&gt;This is especially true for object-oriented languages, where data structures can be smart by virtue of the fact that they can encapsulate the relevant snippets of "dumb code." Big classes with little methods–that's the way to go!&lt;/p&gt;    &lt;p&gt;The Scheme programming language was born from an attempt in 1975 to explicate object-oriented programming in terms that Gerry Sussman and I could understand. In particular, we wanted to restate Carl Hewitt's theory of actors in words of one syllable, so to speak. One of the conclusions that we reached was that "object" need not be a primitive notion in a programming language; one can build objects and their behavior from little more than assignable value cells and good old lambda expressions. Moreover, most of the objects in Hewitt's theory were stateless and unchanging once created; for those, lambda expressions alone were sufficient.&lt;/p&gt;    &lt;p&gt;That was a useful theoretical observation–and not original with us, though Scheme did help to spread the word–but it was not a good guide to designing practical programming languages. Soon both Scheme and Common Lisp felt the pressure to graft on facilities to make it &lt;em&gt;easy&lt;/em&gt;, not merely &lt;em&gt;possible&lt;/em&gt;, to program in an object-oriented style. A major source of this pressure was the displacement of character streams by windows as a model of terminal-screen interaction–this was made practical and desirable by the advent of high-resolution bit-mapped displays–but programmers quickly grasped the value of object-oriented programming for other purposes.&lt;/p&gt;    &lt;p&gt;As I observed 20-odd years ago in my paper &lt;em&gt;Lambda: The Ultimate Declarative&lt;/em&gt;, part of the value of object-oriented programming is that while it may be difficult to add a new method interface to a mature set of classes–at least, using an ordinary text editor, as was common practice then and still is today–because many individual method declarations must typically be coded, inheritance notwithstanding, and inserted into each relevant class, whereas it is comparatively easy to create a new class of object, a new data type. Procedural programming is just the opposite, the dual; it's easy to add a new procedure, but it can be difficult and time-consuming to introduce a new data type into a mature set of procedures because code must be inserted into each relevant procedure.&lt;/p&gt;    &lt;p&gt;The question is, then in today's practice, is it more common to introduce new universal methods or new universal data types as a system is maintained? (I say "universal" to mean something that is widely used throughout a system. A universal method, such as &lt;code&gt;equal&lt;/code&gt; or &lt;code&gt;toString&lt;/code&gt;, is supported by many types of object, and a universal data type, such as &lt;code&gt;String&lt;/code&gt; or &lt;code&gt;Vector&lt;/code&gt;, must support most universal methods.) I assert that new universal object types arise more frequently than new universal methods–this is a consequence of Raymond's "smart data, dumb code" principle–and this is one reason that object-oriented programming has proved to be so successful: It reduces the effort of program maintenance when working with inadequate program development tools.&lt;/p&gt;    &lt;p&gt;Another weakness of procedural and functional programming is that their viewpoint assumes a process by which "inputs" are transformed into "outputs"; there is equal concern for correctness and for termination (and proofs thereof). But as we have connected millions of computers to form the Internet and the World Wide Web, as we have caused large independent sets of state to interact–I am speaking of databases, automated sensors, mobile devices, and (most of all) &lt;em&gt;people&lt;/em&gt;–in this highly interactive, distributed setting, the procedural and functional models &lt;em&gt;have&lt;/em&gt; failed, another reason why objects have become the dominant model. Ongoing behavior, not completion, is now of primary interest. Indeed, object-oriented programming had its origins in efforts to simulate the ongoing behavior of interacting real-world entities–thus the programming language SIMULA was born.&lt;/p&gt;    &lt;p&gt;Now, objects don't solve all the problems of programming. For example, they don't provide polymorphic type abstraction (that is, generic types). They don't provide syntactic abstraction (that is, macros). Procedural programming still has its place in the coding of methods. But to say that objects have failed because they don't solve &lt;em&gt;all&lt;/em&gt; possible problems is like saying carbohydrates have failed because you can't live on pure sugar. Object-oriented programming is like money, as the old joke has it: It's not everything, but it's way ahead of whatever's in second place.&lt;/p&gt;    &lt;p&gt;If you are an idealist, you may be disappointed with the current state of the object-oriented programming art. The ongoing evolution of object-oriented programming has not reached completion and perhaps never will. I do not claim that Java or C# is the apotheosis of object-oriented programming languages.&lt;/p&gt;    &lt;p&gt;As for C++–well, it reminds me of the Soviet-era labor joke: "They pretend to pay us, and we pretend to work." C++ pretends to provide an object-oriented data model, C++ programmers pretend to respect it, and everyone pretends that the code will work. The actual data model of C++ is exactly that of C, a single two-dimensional array of bits, eight by four billion, and all the syntactic sugar of C++ fundamentally cannot mask the gaping holes in its object model left by the cast operator and unconstrained address arithmetic.&lt;/p&gt;    &lt;p&gt;If, several years ago, with C++ at its most popular, with Smalltalk in decline and Squeak yet to appear, you had come to me, O worthy opponents, and proclaimed that objects had failed, I might well have agreed. But now that Java has become mainstream, popularizing not only object-oriented programming but related technologies such as garbage collection and remote method invocation, and now that the utility of object-oriented programming has been seconded by the sincere flattery of C#, we may now confidently assert that objects most certainly have not failed.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;i&gt;Copyright 2002 by Guy L. Steele Jr.. All rights reserved.&lt;/i&gt;    &lt;/p&gt;&lt;p&gt;&lt;i&gt;(Opening remarks by Guy L. Steele Jr., November 6, 2002)&lt;/i&gt;&lt;/p&gt;     &lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8846192348938095935-1792991935116878556?l=behindthiscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://behindthiscode.blogspot.com/feeds/1792991935116878556/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8846192348938095935&amp;postID=1792991935116878556' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8846192348938095935/posts/default/1792991935116878556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8846192348938095935/posts/default/1792991935116878556'/><link rel='alternate' type='text/html' href='http://behindthiscode.blogspot.com/2008/01/objects-have-not-failed.html' title='Objects have not failed'/><author><name>Julian Gutierrez Oschmann</name><uri>http://www.blogger.com/profile/12519804603155056873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8846192348938095935.post-1607915827767289944</id><published>2007-08-01T12:06:00.000-07:00</published><updated>2007-08-02T13:36:07.414-07:00</updated><title type='text'>L-systems: beauty math, beauty code</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.math.okstate.edu/mathdept/dynamics/lecnotes/img129.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 201px; height: 306px;" src="http://www.math.okstate.edu/mathdept/dynamics/lecnotes/img129.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;An &lt;b&gt;L-system&lt;/b&gt; or &lt;b&gt;Lindenmayer system&lt;/b&gt; is a &lt;a href="http://en.wikipedia.org/wiki/Formal_grammar" title="Formal grammar"&gt;formal grammar&lt;/a&gt; (a set of rules and symbols) most famously used to model the growth processes of &lt;a href="http://en.wikipedia.org/wiki/Plant" title="Plant"&gt;plant&lt;/a&gt; development, but also able to model the morphology of a variety of organisms. L-systems can also be used to generate self-similar fractals such as &lt;a href="http://en.wikipedia.org/wiki/Iterated_function_system" title="Iterated function system"&gt;iterated function systems&lt;/a&gt;. L-systems were introduced and developed in &lt;a href="http://en.wikipedia.org/wiki/1968" title="1968"&gt;1968&lt;/a&gt; by the Hungarian theoretical &lt;a href="http://en.wikipedia.org/wiki/Biologist" title="Biologist"&gt;biologist&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Botanist" title="Botanist"&gt;botanist&lt;/a&gt; from the &lt;a href="http://en.wikipedia.org/wiki/Utrecht_University" title="Utrecht University"&gt;University of Utrecht&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Aristid_Lindenmayer" title="Aristid Lindenmayer"&gt;Aristid Lindenmayer&lt;/a&gt; (&lt;a href="http://en.wikipedia.org/wiki/1925" title="1925"&gt;1925&lt;/a&gt;–&lt;a href="http://en.wikipedia.org/wiki/1989" title="1989"&gt;1989&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;An Example: Fibonacci numbers&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Variables: A B&lt;/li&gt;&lt;li&gt;Start symbol: A&lt;/li&gt;&lt;li&gt;Rules: A -&gt; B | B -&gt; AB&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;In Haskell we encode the rules with a function:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;type Var = Char&lt;/span&gt; &lt;span style="font-style: italic;font-family:courier new;" &gt;&lt;br /&gt;type Term = [Var]&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;type Rules = (Var -&gt; Term)&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-style: italic;"&gt;fib_initial = "A"&lt;/span&gt; &lt;span style="font-style: italic;"&gt;&lt;br /&gt;fib 'A' = "B"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;fib 'B' = "AB"&lt;/span&gt; &lt;span style="font-style: italic;"&gt;&lt;br /&gt;fib x = return x&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;  Using the list monad, the evolution seems to be the iteration on the start symbol of the section &lt;span style="font-style: italic;font-family:courier new;" &gt;(&gt;&gt;= fib)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Then:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;iter :: Monad a =&gt; Int -&gt; (b -&gt; a b) -&gt; a b -&gt; a b&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;iter n p = foldr (.) id (replicate n (&gt;&gt;= p))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In pointfree notation :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;iter = (foldr (.) id .) . (. (=&lt;&lt;)) . replicate  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;Main&gt; iter 5 fib fib_initial&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;"BABABBAB"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Semantic interpretation of literal symbols lead us to geometric curves. An example: Koch curves&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Variables: F&lt;/li&gt;&lt;li&gt;Constants: + , -&lt;/li&gt;&lt;li&gt;Start symbol: F&lt;/li&gt;&lt;li&gt;Rules: F -&gt;  F+F−F−F+F&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;koch_initial = "F"&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;koch 'F' = "F+F-F-F+F"&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;        koch x = return x&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In Hugs:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;Main&gt; iter 2 koch koc&lt;/span&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;h_initial&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;"F+F-F-F+F+F+F-F-F+F-F+F-F-F+F-F+F-F-F+F+F+F-F-F+F"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We give semantic to the symbols. F means "draw forward"  &lt;i&gt;+ &lt;/i&gt; means "turn left 90°", and &lt;i&gt;-&lt;/i&gt; means "turn right 90°". With n=3:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/wikipedia/commons/7/7d/Square_koch_3.png"&gt;&lt;img style="cursor: pointer; width: 320px;" src="http://upload.wikimedia.org/wikipedia/commons/7/7d/Square_koch_3.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;We can generalize this semantics and generate SVG graphics for the L-systems:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;type Pos = (Double,Double,Double)&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;type Ac = Var -&gt; Maybe (Pos -&gt; Pos)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;&lt;br /&gt;printLine (x1,y1,_) (x2,y2,_) =&lt;br /&gt;"&amp;lt;line style=\"&amp;st1;\" x1=\"" ++ (show x1)  ++&lt;br /&gt;                        "\" y1=\"" ++ (show y1) ++   "\" x2=\"" ++ (show x2) ++&lt;br /&gt;                        "\" y2=\"" ++ (show y2)  ++ "\"/&amp;gt;\n"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;paint :: Ac -&gt; Term -&gt; Pos -&gt; String -&gt; String&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;paint s [] p m = m&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;paint s (x:xs) p m = case s x of&lt;/span&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;&lt;br /&gt;Just f -&gt; paint s xs (f p) (printLine p (f p) ++ m)&lt;/span&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;&lt;br /&gt;Nothing -&gt; paint s xs p m&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-style: italic;"&gt;forward t = (\(x,y,angle) -&gt; (x+t*(cos angle),y+t*(sin angle),angle))&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new; font-style: italic;"&gt;turn t = (\(x,y,angle) -&gt; (x,y,angle + t))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-style: italic;"&gt;kochAc :: Ac&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new; font-style: italic;"&gt;kochAc 'F' = Just $ forward 3&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new; font-style: italic;"&gt;kochAc '-' = Just $ turn (pi/2)&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new; font-style: italic;"&gt;kochAc '+' = Just $ turn (negate (pi/2))&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new; font-style: italic;"&gt;kochAc _ = Nothing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And then, the SVG:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;getSVG m = "&amp;lt;?xml version=\"1.0\" encoding=\"utf-8\"?&amp;gt;\n" ++&lt;/span&gt; &lt;span style="font-style: italic;font-family:courier new;" &gt;  "&amp;lt;!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\" [\n"++&lt;/span&gt; &lt;span style="font-style: italic;font-family:courier new;" &gt;  "&amp;lt;!ENTITY ns_svg \"http://www.w3.org/2000/svg\"&amp;gt;\n" ++&lt;/span&gt; &lt;span style="font-style: italic;font-family:courier new;" &gt;  "&amp;lt;!ENTITY ns_xlink \"http://www.w3.org/1999/xlink\"&amp;gt;\n" ++&lt;/span&gt; &lt;span style="font-style: italic;font-family:courier new;" &gt;  "&amp;lt;!ENTITY st0 \"fill:url(#XMLID_1_);\"&amp;gt;\n" ++&lt;/span&gt; &lt;span style="font-style: italic;font-family:courier new;" &gt;  "&amp;lt;!ENTITY st1 \"fill:none;stroke:#96A632;stroke-linecap:round;stroke-linejoin:round;\"&amp;gt;\n" ++&lt;/span&gt; &lt;span style="font-style: italic;font-family:courier new;" &gt;  "]&amp;gt;\n" ++&lt;/span&gt; &lt;span style="font-style: italic;font-family:courier new;" &gt;  "&amp;lt;svg version=\"1.1\" xmlns=\"&amp;ns_svg;\"&lt;/span&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt; xmlns:xlink=\"&amp;ns_xlink;\" width=\"400\" height=\"400\" viewBox=\"0 0 400 400\"\n" ++&lt;/span&gt; &lt;span style="font-style: italic;font-family:courier new;" &gt;  "style=\"overflow:visible;enable-background:new 0 0 400 400;\" xml:space=\"preserve\"&amp;gt;\n" ++&lt;/span&gt; &lt;span style="font-style: italic;font-family:courier new;" &gt;  "&amp;lt;g id=\"Layer_1\"&amp;gt;\n" ++ m ++ "\n" ++&lt;/span&gt; &lt;span style="font-style: italic;font-family:courier new;" &gt;  "&amp;lt;/g&amp;gt;\n" ++&lt;/span&gt; &lt;span style="font-style: italic;font-family:courier new;" &gt;  "&amp;lt;/svg&amp;gt;\n"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;Main&gt; = (putStr . getSVG)  (paint kochAc (iter 5 koch koch_initial) (0,400,0) "")&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;and the SVG generated:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_anAxX-0QnEQ/RrIfefC7gXI/AAAAAAAAAAM/0MSu-hJ1V_U/s1600-h/koch.png"&gt;&lt;img style="cursor: pointer; width: 259px; height: 259px;" src="http://1.bp.blogspot.com/_anAxX-0QnEQ/RrIfefC7gXI/AAAAAAAAAAM/0MSu-hJ1V_U/s320/koch.png" alt="" id="BLOGGER_PHOTO_ID_5094168737099776370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Other L-Systems:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;sierpinski_initial = "A"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;sierpinski 'A' = "B-A-B"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;             sierpinski 'B' = "A+B+A"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;             sierpinski x = return x&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-style: italic;font-family:courier new;" &gt;&lt;/span&gt;&lt;span style="font-family: courier new; font-style: italic;"&gt;sierpAc :: Ac&lt;br /&gt;sierpAc 'A' = Just $ forward 3&lt;br /&gt;sierpAc 'B' = Just $ forward 3&lt;br /&gt;sierpAc '-' = Just $ turn (negate (pi/3))&lt;br /&gt;sierpAc '+' = Just $ turn (pi/3)&lt;br /&gt;sierpAc _ = Nothing&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;dragon_initial = "FX"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;dragon 'X' = "X+YF+"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;         dragon 'Y' = "-FX-Y"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;         dragon x = return x&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;dragonAc :: Ac&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;dragonAc = kochAc&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Enjoy!!!&lt;br /&gt;&lt;br /&gt;J.-&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8846192348938095935-1607915827767289944?l=behindthiscode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://behindthiscode.blogspot.com/feeds/1607915827767289944/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8846192348938095935&amp;postID=1607915827767289944' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8846192348938095935/posts/default/1607915827767289944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8846192348938095935/posts/default/1607915827767289944'/><link rel='alternate' type='text/html' href='http://behindthiscode.blogspot.com/2007/08/l-systems-beauty-math-beauty-code.html' title='L-systems: beauty math, beauty code'/><author><name>Julian Gutierrez Oschmann</name><uri>http://www.blogger.com/profile/12519804603155056873</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_anAxX-0QnEQ/RrIfefC7gXI/AAAAAAAAAAM/0MSu-hJ1V_U/s72-c/koch.png' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
