<?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-9682471</id><updated>2011-11-28T00:14:27.299Z</updated><category term='install'/><category term='Python'/><category term='debugging'/><category term='clojure'/><category term='bugs'/><category term='recruiting'/><category term='anarres-cpp'/><category term='development'/><category term='C++ grammar'/><category term='Papyrus'/><category term='github'/><category term='MDR'/><category term='common lisp'/><category term='eeepc'/><category term='michaelfeathers'/><category term='software development'/><category term='C++'/><category term='MDA'/><category term='htmled'/><category term='ANTLR'/><category term='programming praxis'/><category term='darcs'/><category term='C++ Module'/><category term='configuration'/><category term='git'/><category term='shell'/><category term='profiles subsystem'/><category term='functional'/><category term='script'/><category term='debian'/><category term='video'/><category term='parallel'/><category term='List of Limitations'/><category term='code'/><category term='review'/><category term='siscog'/><category term='feature sketch'/><category term='repository'/><category term='ArgoUML GSoC mentor'/><category term='notes'/><category term='linux'/><category term='exercise'/><category term='scheme'/><category term='idea'/><category term='UML profile for C++'/><category term='emacs'/><category term='OSGi'/><category term='java'/><category term='cloud computing'/><category term='refactoring'/><category term='patterns'/><category term='programming'/><category term='tutorial'/><category term='UML'/><category term='monster class'/><category term='UML2'/><category term='XML'/><category term='oop'/><category term='lisp'/><category term='bash'/><category term='book'/><category term='blog'/><category term='links'/><category term='hints'/><category term='libraries'/><category term='slime'/><category term='legacy code'/><category term='ABCL'/><category term='eeebuntu'/><category term='tests'/><category term='blogger'/><category term='quicklisp'/><category term='medeia'/><category term='software'/><category term='ArgoUML'/><category term='europe'/><category term='Singleton'/><category term='design'/><category term='command line'/><category term='ubuntu'/><category term='release'/><category term='automation'/><category term='open source projects'/><category term='mercurial'/><category term='symposium'/><category term='practical common lisp'/><category term='REPL'/><category term='hb2posts'/><category term='profile'/><title type='text'>Argonaut's life</title><subtitle type='html'>As an ArgoUML contributor I'm going to blog my activities here, so that they may draw interest by other developers or help other developers when doing tasks similar to what I've done.
AND(!) the grand vision that makes an Argonaut what he is, TO THRIVE IN THE BIG DANGEROUS WORLD, TAKING THE Argo TO A GOOD SHORE ;-))</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>99</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9682471.post-7210101200747057987</id><published>2011-10-29T00:31:00.001+01:00</published><updated>2011-10-29T00:32:59.231+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><category scheme='http://www.blogger.com/atom/ns#' term='Papyrus'/><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><title type='text'>Papyrus critics idea: what to port from ArgoUML into Papyrus</title><content type='html'>&lt;p&gt;Although I've been involved with the development of &lt;a href="http://www.argouml.org" class="ligacao"&gt;ArgoUML&lt;/a&gt;, currently there is another &lt;a href="http://www.omg.org/spec/UML/" class="ligacao"&gt;UML&lt;/a&gt; editing open source tool which is getting enough track to gain my attention. This is &lt;a href="http://www.eclipse.org/modeling/mdt/papyrus/" class="ligacao"&gt;Papyrus&lt;/a&gt;. It is &lt;a href="http://wiki.eclipse.org/index.php/Rich_Client_Platform" class="ligacao"&gt;RCP&lt;/a&gt; and &lt;a href="http://www.eclipse.org/modeling/emf/" class="ligacao"&gt;EMF&lt;/a&gt; based from its conception, i think.&lt;/p&gt;&lt;p&gt;So, it should be less complex to proceed from it than to proceed from ArgoUML, which must progress in the painful way from an architecture oriented towards &lt;a href="http://en.wikipedia.org/wiki/Swing_%28Java%29" class="ligacao"&gt;Java Swing&lt;/a&gt; and &lt;a href="http://netbeans.org/download/5_5/javadoc/org-netbeans-api-mdr/overview-summary.html" class="ligacao"&gt;NetBeans MDR&lt;/a&gt; (the project was abandoned by &lt;a href="http://netbeans.org" class="ligacao"&gt;NetBeans&lt;/a&gt;). As a user of ArgoUML, which would be the most interesting features to bring from ArgoUML into Papyrus?...&lt;/p&gt;&lt;ul&gt;   &lt;li&gt;&lt;a href="http://argouml.tigris.org/features.html#critics" class="ligacao"&gt;critics&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://seeds.tigris.org/" class="ligacao"&gt;varied module ecosystem&lt;/a&gt;;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://argouml.tigris.org/features.html#codegen" class="ligacao"&gt;plenty of programming languages supported&lt;/a&gt;?&lt;/li&gt;   &lt;li&gt;&lt;a href="http://argouml.tigris.org/features.html#navigation" class="ligacao"&gt;some concrete specific features that users can't live without&lt;/a&gt;;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://argouml.tigris.org/features.html#i18n" class="ligacao"&gt;some well supported translations&lt;/a&gt;;&lt;/li&gt;   &lt;li&gt;(meta '("missed something?"))&lt;/li&gt; &lt;/ul&gt;&lt;p&gt;So, my basic idea is to try to introduce into Papyrus some of the features that ArgoUML has which could add value to Papyrus as a UML editing and visualization tool. At least i could start from there. This blog would continue to be called Argonaut's life, obviously :-)&lt;/p&gt;&lt;p&gt;But you must always &lt;a href="http://argonauts-life.blogspot.com/2005/06/modelerimpl-and-new-mda-ideas.html" class="ligacao"&gt;start by using the tool&lt;/a&gt; and &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=2528" class="ligacao"&gt;fix a simple bug&lt;/a&gt; before delving into some process like this. Guess what - i never used it!?!&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=Sh0o9ObKk_k" class="ligacao"&gt;Listening now kaya project, elixir&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-7210101200747057987?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/7210101200747057987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=7210101200747057987' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/7210101200747057987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/7210101200747057987'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2011/10/papyrus-critics-idea-what-to-port-from.html' title='Papyrus critics idea: what to port from ArgoUML into Papyrus'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-7251473088580038642</id><published>2011-05-17T09:42:00.005+01:00</published><updated>2011-05-18T09:31:10.084+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='common lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='libraries'/><category scheme='http://www.blogger.com/atom/ns#' term='quicklisp'/><title type='text'>Common Lisp libraries: Quicklisp</title><content type='html'>&lt;p&gt;&lt;a href="http://www.quicklisp.org/"&gt;Quicklisp&lt;/a&gt; is the base solution for solving the &lt;a href="http://www.quicklisp.org/"&gt;lisp libraries&lt;/a&gt; problem, which therefore is now solved :-)&lt;/p&gt;&lt;p&gt;Thanks to Zach Beane for writing and maintaining it and to Peter Seibel for his continued effort in advocating Common Lisp as a industrial strength language. I know it is because I work at &lt;a href="http://www.siscog.eu"&gt;SISCOG&lt;/a&gt; which uses Common Lisp extensively.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-7251473088580038642?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/7251473088580038642/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=7251473088580038642' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/7251473088580038642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/7251473088580038642'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2011/05/common-lisp-libraries-quicklisp.html' title='Common Lisp libraries: Quicklisp'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-9075259393949456145</id><published>2011-05-08T23:40:00.001+01:00</published><updated>2011-05-08T23:42:27.115+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='htmled'/><category scheme='http://www.blogger.com/atom/ns#' term='hb2posts'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='github'/><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><category scheme='http://www.blogger.com/atom/ns#' term='open source projects'/><title type='text'>hb2posts (previously htmled) port to Clojure</title><content type='html'>&lt;p&gt;(meta '(idea htmled port clojure github open source learning argonauts-life blog))&lt;/p&gt;&lt;p&gt;[2011-05-06 Fri 22:46]&lt;br&gt; The initial org-meta-mode was bogus. I must learn Clojure instead of messing around with elisp and Common Lisp. The idea I'm having now is to publish htmled in GitHub tonight! Will I be capable of at least one such small hacking and big learning thing?&lt;/p&gt;&lt;p&gt;[2011-05-08 Sun 23:07]&lt;br&gt; Here it is: https://github.com/euluis/hb2posts. Licensed under the EPL because I want to port it to Clojure.&lt;/p&gt;&lt;p&gt;I had to change the name from htmled to hb2posts because htmled was already taken.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-9075259393949456145?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/9075259393949456145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=9075259393949456145' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/9075259393949456145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/9075259393949456145'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2011/05/hb2posts-previously-htmled-port-to.html' title='hb2posts (previously htmled) port to Clojure'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-1947430373317305967</id><published>2010-12-16T23:51:00.000Z</published><updated>2010-12-16T23:52:30.419Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><category scheme='http://www.blogger.com/atom/ns#' term='htmled'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Improve Emacs HTML mode by adding an automatic translator between accented chars and their HTML / Unicode entities</title><content type='html'>&lt;p&gt;I would like to improve Emacs HTML mode so that when I enter an accented character it would replace it with the corresponding HTML Unicode entity. I don't know if this would have to be some kind of hook which captures the entrance of specific characters or if I could implement if as a gigantic search and replace operation. The later option isn't so attractive because it gets into the flow of writing. But the former would also...&lt;/p&gt;&lt;p&gt;Currently Emacs HTML mode provides the &lt;code&gt;sgml-name-char&lt;/code&gt; (C-c C-n) command that almost enables the same thing, but, it gets a bit in the way of my flow of thought. (Actually, writing directly in HTML also gets in my thought process anyway... Maybe I should write first and then edit. But I digress...)&lt;/p&gt;&lt;p&gt;So, how could this be implemented? A way would be a minor mode for HTML for automatic translation which mainly defines a minor mode key map that overrides the global and major mode keymaps for accented characters and invalid HTML characters. Is this an interesting idea?&lt;/p&gt;&lt;p&gt;How to implement an Emacs minor mode? A good example is &lt;code&gt;flyspell-mode&lt;/code&gt;, which source is available just C-h f &lt;code&gt;flyspell-mode&lt;/code&gt; and following the link to the source.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-1947430373317305967?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/1947430373317305967/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=1947430373317305967' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/1947430373317305967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/1947430373317305967'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/12/improve-emacs-html-mode-by-adding.html' title='Improve Emacs HTML mode by adding an automatic translator between accented chars and their HTML / Unicode entities'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-8030062025155618094</id><published>2010-12-14T07:12:00.000Z</published><updated>2010-12-14T07:13:01.087Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='siscog'/><title type='text'>Idea for Git demo: show its power for sweeping changes in SISCOG-UTIL and CREWS</title><content type='html'>&lt;p&gt;At &lt;a href="http://www.siscog.eu" class="ligacao"&gt;SISCOG&lt;/a&gt; we are using &lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt; as a development tool, but, not as the official version control system. I was challenged to make a demo / presentation on what would be the changes to the processes and working methods if SISCOG was going to use Git.&lt;p&gt;One idea I had recently was to show what Git could do if I need to change CREWS in a more automated and integrated way, so that I might have an easily mergeable branch of CREWS and SISCOG-UTIL, how would I proceed? Would Git solve the problems easily? How could I demonstrate this?&lt;/p&gt;&lt;p&gt;Showing off the power with &lt;a href="http://www.franz.com/support/documentation/current/doc/defsystem.htm"&gt;defsystem&lt;/a&gt; to &lt;a href="http://common-lisp.net/project/asdf/"&gt;ASDF&lt;/a&gt; migration? How would that give them the thrill of power? Try, don't be shy to fail and earn time, quality and satisfaction.&lt;/p&gt;&lt;p&gt;Para convencer algu&amp;eacute;m eu tenho de mostrar o que &amp;eacute; poss&amp;iacute;vel&lt;br&gt; e n&amp;atilde;o como l&amp;aacute; chegar!!!&lt;br&gt; Eu tenho de estar mais com as pessoas&lt;br&gt; e s&amp;oacute; assim as poderei motivar.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-8030062025155618094?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/8030062025155618094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=8030062025155618094' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/8030062025155618094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/8030062025155618094'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/12/idea-for-git-demo-show-its-power-for.html' title='Idea for Git demo: show its power for sweeping changes in SISCOG-UTIL and CREWS'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-3652603600698484378</id><published>2010-12-14T00:37:00.000Z</published><updated>2010-12-14T00:39:34.132Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><category scheme='http://www.blogger.com/atom/ns#' term='common lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='practical common lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='parallel'/><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>Idea: make the binary data library of PCL book parallel friendly</title><content type='html'>&lt;p&gt;I'm still reading and learning from the &lt;a href="http://www.gigamonkeys.com/book/" class="ligacao"&gt;Practical Common Lisp book by Peter Seibel&lt;/a&gt;  [it is hard to believe that I started in 2007!]. When reading the chapter &lt;a href="http://www.gigamonkeys.com/book/practical-parsing-binary-files.html" class="ligacao"&gt;24. Practical: Parsing Binary Files&lt;/a&gt;, which describes and provides a library for reading binary files, and upon reaching the variable:&lt;p&gt;&lt;pre&gt;(defvar *in-progress-objects* nil
  "TODO or FIXME, how to make this part of the code more parallel friendly?")&lt;/pre&gt;&lt;p&gt;I stopped reading and started wondering about the TODO or FIXME I just wrote. The following is the resulting ideaware...&lt;/p&gt;&lt;p&gt;His it worth it or will the disk access eat the advantages?&lt;/p&gt;&lt;p&gt;Yes if there is parallel disk access, meaning in disk array architectures and for really big files. For small files the parallel access isn't worth it because the disk array will know how to do it in a parallel way.&lt;/p&gt;&lt;h4&gt;Design&lt;/h4&gt;&lt;p&gt;An additional option to a certain &lt;code&gt;binary-class&lt;/code&gt; would mark that &lt;code&gt;binary-class&lt;/code&gt; as one that would spoon a new process or thread for writing (NOTE to self write and read operations aren't symmetric from a performance point of view) or reading an instance of that &lt;code&gt;binary-class&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Additional bindings of the dynamic variables would have to be created for the symbol that are to be called in parallel, i.e., a new thread based call would mean a new lexical environment is created in which the new binding exists.&lt;/p&gt;&lt;p&gt;It would be fun to port this library to Clojure / JVM languages. I think that this would be allowed because it isn't the original work that would be made available.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-3652603600698484378?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/3652603600698484378/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=3652603600698484378' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/3652603600698484378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/3652603600698484378'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/12/idea-make-binary-data-library-of-pcl.html' title='Idea: make the binary data library of PCL book parallel friendly'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-2414037693566017503</id><published>2010-10-27T23:51:00.002+01:00</published><updated>2010-10-27T23:54:35.391+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='exercise'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='programming praxis'/><title type='text'>Programming Praxis Alien Numbers in Clojure</title><content type='html'>&lt;p&gt;I solved the full &lt;a href="http://programmingpraxis.com/2010/09/24/alien-numbers/" class="ligacao"&gt;Programming Praxis Alien Numbers exercise&lt;/a&gt; in &lt;a href="http://clojure.org" class="ligacao"&gt;Clojure&lt;/a&gt;. This enabled me to learn more about Clojure and to train my algorithmic parts of the brain a bit.&lt;/p&gt;&lt;p&gt;In all this I was a bit disappointed. It took me too much time to reach a full solution and then, in the core part of the exercise I had to resort to one of the other persons to reach a better way to convert a decimal number to an arbitrary radix number given its language.&lt;/p&gt;&lt;p&gt;I was also a bit disappointed in the way that I wasn't able to use Clojure's laziness more in the algorithms, resorting too much for my taste to &lt;code&gt;loop&lt;/code&gt;. From a positive point of view, the Clojure abstractions work as advertised and the only difference from the code bellow and another that would use instead of &lt;code&gt;string&lt;/code&gt;s a &lt;code&gt;vector&lt;/code&gt;s or &lt;code&gt;list&lt;/code&gt;s would be the conversion in the return value of &lt;code&gt;decimal-to-lang&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Follows the core of the exercise solution. Note that &lt;a href="http://lisp.pastebin.com/bkAeTduq" class="ligacao"&gt;the full solution with tests is here&lt;/a&gt;. Still considering the Clojure sweet points, I think I could easily explore its excellent support for concurrency and convert the &lt;code&gt;main&lt;/code&gt; algorithm into a parallel one if there were hundreds of lines to be processed.&lt;/p&gt;&lt;pre&gt;
(defn decimal-to-lang
  "Converts decimal-num to the equivalent number in lang as a string.
  The algorithm was a translation of the algorithm by Rodrigo Menezes
  in C# that he posted in the programming praxis site."
  [decimal-num lang]
  (let [lang-radix (count lang)]
    (loop [decimal-value decimal-num lang-num []]
      (if (&gt;= 0 decimal-value)
 (apply str lang-num)
 (recur (int (/ decimal-value lang-radix))
        (concat [(nth lang (mod decimal-value lang-radix))] lang-num))))))

(defn digit-index
  [digit lang]
  (loop [i 0]
    (if (= digit (nth lang i))
      i
      (recur (inc i)))))

(defn lang-to-decimal
  [alien-num lang]
  (let [radix (count lang)
 ralien-num (reverse alien-num)]
    (loop [i 0 decimal-num 0 product 1]
      (if (= i (count ralien-num))
 decimal-num
 (recur (inc i) (+ decimal-num (* (digit-index (nth ralien-num i) lang) product))
        (* radix product))))))

(defn convert-num
  "Convert alien-num which is in source-lang into the same number in target-lang"
  [alien-num source-lang target-lang]
  (decimal-to-lang (lang-to-decimal alien-num source-lang) target-lang))
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-2414037693566017503?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/2414037693566017503/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=2414037693566017503' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/2414037693566017503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/2414037693566017503'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/10/programming-praxis-alien-numbers-in.html' title='Programming Praxis Alien Numbers in Clojure'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-1949616756292513931</id><published>2010-07-03T07:40:00.000+01:00</published><updated>2010-07-03T07:41:44.334+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><category scheme='http://www.blogger.com/atom/ns#' term='htmled'/><title type='text'>More ideas about htmled</title><content type='html'>&lt;p&gt;&lt;a href="http://argonauts-life.blogspot.com/2006/02/htmled-revisited-handbook-entries-to.html" class="ligacao"&gt;htmled&lt;/a&gt;, my Python hacks to automate conversions of the contents in my handbooks into posts in my blogs received some recent attention, but, I still have plenty of hitches with the overall process. Follow two quick ideas for future improvement.&lt;/p&gt;&lt;p&gt;The handbook editing part (creating the content in HTML) is too hard; solution might be a specific mode in Emacs customized for editing HTML with specific functions to accelerate the creation of structural elements or using a base format that can be processed afterward to generate the proper HTML.&lt;/p&gt;&lt;p&gt;Editing in Emacs is way superior than in the HTML browser. I wonder if it would be possible to embed Emacs as the editing component of multiple lines text fields. Extra bonus if you could put a served Emacs frame as the editing component.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-1949616756292513931?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/1949616756292513931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=1949616756292513931' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/1949616756292513931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/1949616756292513931'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/07/more-ideas-about-htmled.html' title='More ideas about htmled'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-3687162762249629650</id><published>2010-07-03T07:39:00.000+01:00</published><updated>2010-07-03T07:40:34.089+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><category scheme='http://www.blogger.com/atom/ns#' term='tests'/><title type='text'>ArgoUML tests issues</title><content type='html'>&lt;h4&gt;&lt;a name="argouml-junit4-20100703" class="ancora"&gt;Update ArgoUML tests to JUnit 4.x &amp;ndash; issue created&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;a href="http://argonauts-life.blogspot.com/2010/03/updating-argouml-tests-to-junit-4x.html" class="ligacao"&gt;This idea&lt;/a&gt; now has &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=6085" class="ligacao"&gt;ArgoUML issue 6100&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=6085" class="ligacao"&gt;Issue 6085&lt;/a&gt; is also moving forward.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-3687162762249629650?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/3687162762249629650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=3687162762249629650' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/3687162762249629650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/3687162762249629650'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/07/argouml-tests-issues.html' title='ArgoUML tests issues'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-8385911609375681710</id><published>2010-06-26T21:42:00.002+01:00</published><updated>2010-06-26T21:44:39.506+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++ Module'/><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><category scheme='http://www.blogger.com/atom/ns#' term='UML profile for C++'/><title type='text'>ArgoUML C++ – generator and modeling</title><content type='html'>&lt;p&gt;The C++ code generator in the &lt;a href="http://argouml-cpp.tigris.org/" class="ligacao"&gt;ArgoUML C++ module&lt;/a&gt; has been growing in its usage of Taggedvalues and it hasn't grown more because it hasn't received recent contributions. In a &lt;a href="http://www.argouml-users.net/forum/viewtopic.php?f=18&amp;t=226" class="ligacao"&gt;recent thread&lt;/a&gt; in the &lt;a href="http://www.argouml-users.net/forum/viewtopic.php?f=18" class="ligacao"&gt;Using ArgoUML for modeling C++ topic&lt;/a&gt; of the &lt;a href="http://www.argouml-users.net/forum/" class="ligacao"&gt;ArgoUML's users forum&lt;/a&gt;, this started to become more clear for me. Here is my answer to Ulrich Thombansen's on the 24th of June:&lt;/p&gt;&lt;p&gt;Hi Ulrich,&lt;/p&gt;&lt;blockquote&gt;&amp;gt; (...) on the &amp;ldquo;constructor&amp;rdquo;. What about taking this off the documentation at tigris?&lt;/blockquote&gt;&lt;p&gt;I consider that the best solution. Given two ways to make something, I would go for the standard UML way, which even if taking a bit more of work by the user, it is more flexible because you have an actual operation that might be customized, e.g., by adding arguments. By being explicit we may in the future enable specific customization related to C++ constructor specificity.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Note to self:&lt;/em&gt; TODO: place this conclusion in the issue 21. Consider the possibility of some TagDefinitions in the &amp;laquo;cppOperation&amp;raquo; Stereotype being only applicable if the Operation to which the Stereotype is applied also has the &amp;laquo;create&amp;raquo; Stereotype applied.&lt;/p&gt;&lt;blockquote&gt;&amp;gt; cppAttribute&lt;br&gt; &amp;gt; ==========&lt;br&gt; &amp;gt; applying &amp;laquo;cppAttribute&amp;raquo; to a variable &amp;ldquo;myAttrib&amp;rdquo; with the tag &amp;ldquo;pointer&amp;rdquo; set to different values leads to the following results:&lt;br&gt; &amp;gt; no) tag value -&amp;gt; result&lt;br&gt; &amp;gt; ----------------------------&lt;br&gt; &amp;gt; 1) &amp;ldquo;false&amp;rdquo; -&amp;gt; int myAttrib; /*{pointer=false}*/&lt;br&gt; &amp;gt; 2a) &amp;ldquo;true&amp;rdquo; -&amp;gt; int *myAttrib; /*{pointer=true}*/&lt;br&gt; &amp;gt; 2b) &amp;ldquo;xyz&amp;rdquo; -&amp;gt; int *myAttib; /*{pointer=xyz}*/&lt;br&gt; &amp;gt; 3) &amp;ldquo;&amp;rdquo; -&amp;gt; int *myAttib;&lt;br&gt; &amp;gt; &lt;br&gt; &amp;gt; Feature or fault?&lt;br&gt;&lt;/blockquote&gt;&lt;p&gt;IMO feature (I would call it a default behavior due to a present limitation in ArgoUML) and a nicely chosen one, although in the future when ArgoUML supports typed TaggedValues, I would model the &amp;ldquo;pointer&amp;rdquo; TagDefinition as a UML Boolean and therefore you would only have True or False. The rational behind letting the user model any &amp;ldquo;pointer&amp;rdquo; TaggedValue as being true but the actual String &amp;ldquo;false&amp;rdquo; is that if the user added the &amp;ldquo;pointer&amp;rdquo; TaggedValue in an Attribute, it is because he want the pointer to be present.&lt;/p&gt;&lt;blockquote&gt;&amp;gt; cppAttribute&lt;br&gt; &amp;gt; ===========&lt;br&gt; &amp;gt; applying &amp;laquo;cppAttribute&amp;raquo; to a variable &amp;ldquo;myAttrib&amp;rdquo; with the tag &amp;ldquo;get&amp;rdquo; set to public leads to the implementation of the int get_myAttrib(); function.&lt;br&gt; &amp;gt; &lt;br&gt; &amp;gt; Is there a way to make this &amp;ldquo;virtual&amp;rdquo;? GeneratorCpp.java only creates &amp;ldquo;virtual&amp;rdquo; for (!leaf &amp;&amp; !isConstructor &amp;&amp; !static)||abstract. Which rule applies / can be influenced?&lt;/blockquote&gt;&lt;p&gt;This is one of the reasons I dislike TaggedValues being used where the default UML suffices. By adding the &amp;ldquo;get&amp;rdquo; or &amp;ldquo;set&amp;rdquo; TaggedValues to represent an hint for the generator you put yourself in a position where you step out of the proper language for representation of the Operations. If there was a button for generating get and set operations for a given attribute at the model level you would have afterward the liberty to customize it as for any other operation. Since ArgoUML doesn't have this, we added &amp;ldquo;get&amp;rdquo; and &amp;ldquo;set&amp;rdquo; TagDefinitions to the &amp;laquo;cppAttribute&amp;raquo; Stereotype, but, given that these are simply TaggedValues we will be left with the modeling of all the particularities of operations as different values of the &amp;ldquo;get&amp;rdquo; and &amp;ldquo;set&amp;rdquo; TaggedValues. It isn't a fair deal. The overload isn't only for the implementation, but, also for the users...&lt;/p&gt;&lt;p&gt;I would model it the other way around, having a &amp;ldquo;get&amp;rdquo; and &amp;ldquo;set&amp;rdquo; TagDefinitions applicable to Operations to which the &amp;laquo;cppOperation&amp;raquo; is added and the values would have to match the name of the attribute which the operations are related to. A more powerful way would be an association between the Operations and the Attributes, but, I don't know if UML allows that, and I'm almost certain that ArgoUML doesn't.&lt;/p&gt;&lt;p&gt;One of the issues with all this is trying to guarantee symmetry between code generation and reverse engineering. Although it is a bit like utopia, we might be closer to it if we stick as much as possible within the UML proper when possible.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Note to self:&lt;/em&gt; TODO: create an issue of type enhancement proposing the deprecation of get and set TagDefinitions in &amp;laquo;cppAttribute&amp;raquo; and adding the these TagDefinitions to &amp;laquo;cppOperation&amp;raquo;. Model it initially as a String that must match the corresponding Attribute name and afterward as an Association (if and when this is supported).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-8385911609375681710?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/8385911609375681710/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=8385911609375681710' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/8385911609375681710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/8385911609375681710'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/06/argouml-c-generator-and-modeling.html' title='ArgoUML C++ &amp;ndash; generator and modeling'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-8254230819518027607</id><published>2010-06-25T23:26:00.002+01:00</published><updated>2010-06-25T23:30:08.398+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='htmled'/><category scheme='http://www.blogger.com/atom/ns#' term='open source projects'/><title type='text'>Dispersion problem – revisited after 7 months</title><content type='html'>&lt;p&gt;About &lt;a href="http://argonauts-life.blogspot.com/2009/11/dispersion-problem-why-am-i.html" class="ligacao"&gt;7 months ago I wrote about my dispersion problem&lt;/a&gt;. I didn't honored my decision at that time which was to dedicate myself fully to &lt;a href="http://argouml.tigris.org" class="ligacao"&gt;ArgoUML&lt;/a&gt; during about one year. For instance, I recently finished some hacking in &lt;a href="http://argonauts-life.blogspot.com/2007/04/improving-usability-of-htmled.html" class="ligacao"&gt;the friendly user interface for htmled&lt;/a&gt; that allows me to say:&lt;/p&gt;&lt;pre&gt;python hb2post.py --startdate=2010-06-01 &gt; posts-in-programacao-since-june-1st.txt&lt;/pre&gt;&lt;p&gt;Why did I did it? It isn't only dispersion working, it is also a desire to be a better hacker and to know more. But, this takes me away from my dream which is &lt;em&gt;to fulfill one or more remarkable ideas&lt;/em&gt;. So, back to initial plan.&lt;/p&gt;&lt;p&gt;But, to see the glass &lt;em&gt;half full&lt;/em&gt; instead of &lt;em&gt;half empty&lt;/em&gt;, I list all the issues I was involved with in ArgoUML and which are resolved since my decision:&lt;/p&gt;&lt;ul&gt;   &lt;li&gt;&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=5506" class="ligacao"&gt;Issue 5506: ArgoUML fails to start after creating dependency between two user profiles&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=6008" class="ligacao"&gt;Issue 6008: Stereotypes defined in profile dont't stay applied after save and reload&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=6038" class="ligacao"&gt;Issue 6038: multiplicity elements created outside of model at top level&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=5618" class="ligacao"&gt;Issue 5618: C++ module unit tests failing in nightly (headless) build&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=4997" class="ligacao"&gt;Issue 4997: user defined profile that depends from module defined profile fails to load on startup&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=5946" class="ligacao"&gt;Issue 5946: Import AndoMDA Magicdraw XMI file fails (need recursive profile subdirectory search)&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=6077" class="ligacao"&gt;Issue 6077: wrong or missing labels in TagDefinition Property Panel&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=5969" class="ligacao"&gt;Issue 5969: stereotype &amp;laquo;cppClass&amp;raquo; can be assigned twice after load&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=5041" class="ligacao"&gt;Issue 5041: provide core profiles via the website&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;p&gt;Also, looking in retrospective the past months were good for &lt;a href="http://argouml.tigris.org" class="ligacao"&gt;ArgoUML&lt;/a&gt; on several areas:&lt;/p&gt;&lt;ul&gt;   &lt;li&gt;Linus Tolke finally handled the switch of the ArgoUML license from BSD like to the &lt;a href="http://www.eclipse.org/legal/epl-v10.html" class="ligacao"&gt;Eclipse Public License (EPL) 1.0&lt;/a&gt;, which means that ArgoUML and &lt;a href="http://argoeclipse.tigris.org/" class="ligacao"&gt;ArgoEclipse&lt;/a&gt; will move together and that Tom Morris will be more willing to continue to contribute.&lt;/li&gt;   &lt;li&gt;Bob Tarling was the main contributor to &lt;a href="http://argouml-downloads.tigris.org/argouml-0.30.1/" class="ligacao"&gt;ArgoUML 0.30.1&lt;/a&gt; and he was able to achieve the replacement of the old model elements property panels by the new implementation which is based on XML definitions. Originally this was developed by Christian L&amp;oacute;pez Esp&amp;iacute;nola in a &lt;a href="http://argouml.tigris.org/gsoc2008/index.html" class="ligacao"&gt;GSoC 2008 project&lt;/a&gt;, but, never before matured enough to be a full and stable replacement of the old implementation. Kudos to Bob :-)&lt;/li&gt;   &lt;li&gt;Tom Morris returned to active ArgoUML contributions, and although he isn't yet as active as before, his overall understanding and detailed knowledge of UML and plenty of ArgoUML components helps a lot when others need guidance such as I did during 0.30.x bug fixing period. In the last period of 0.30.1 development, he even took issue 6008 on his hands and made some big changes to the reference handling of profile model elements which I would have struggled for months to get right. He achieved it in about one week.&lt;/li&gt;   &lt;li&gt;Linus Tolke managed to stabilize the Hudson continuous integration server where ArgoUML nightly builds are executed and continues to maintain the automated builds, project infrastructure and release tasks.&lt;/li&gt;   &lt;li&gt;Thomas Neustupny and Andreas Rueckert are actively evolving the argouml-core-model-euml implementation of the model subsystem (the result of a &lt;a href="http://argouml.tigris.org/gsoc2007/index.html" class="ligacao"&gt;GSoC 2007 project&lt;/a&gt; by Bogdan Ciprian Pistol) and therefore moving ArgoUML towards UML 2.x.&lt;/li&gt;   &lt;li&gt;I'm happy with the progressive stabilization and polishing of the profile subsystem (yet another result of a &lt;a href="http://argouml.tigris.org/gsoc2007/index.html" class="ligacao"&gt;GSoC 2007 project&lt;/a&gt;, this one by Marcos Aur&amp;eacute;lio).&lt;/li&gt;   &lt;li&gt;&lt;a href="http://www.argouml-users.net/forum/" class="ligacao"&gt;ArgoUML's users forum&lt;/a&gt; is growing in activity with Thomas Neustupny, Tom Morris, me, daybyter and KiwiCoder being active helpers. Kudos to Lukasz Gromanowski for setting this and the users' wiki for the project and for the continued support. Compared with the argouml-users mailing list the forum is rocking!&lt;/li&gt;   &lt;li&gt;Michiel Van der Wulp continued to support the notation subsystem and the state and activity diagrams and although he isn't so actively contributing as he used to he continues to help with his expertise in these areas.&lt;/li&gt;   &lt;li&gt;There was also the return of previously inactive contributors such as Alexander Lepekhine.&lt;/li&gt; &lt;/ul&gt;&lt;p&gt;I may be forgetting some relevant contribution and if so drop me a line to update this post. I think that attributing the kudos to contributors is important for the health of the project. Thank you all for continuing to move forward the project and to our users to keep nagging us about the bugs and annoyances :-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-8254230819518027607?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/8254230819518027607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=8254230819518027607' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/8254230819518027607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/8254230819518027607'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/06/dispersion-problem-revisited-after-7.html' title='Dispersion problem &amp;ndash; revisited after 7 months'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-7955091721161270568</id><published>2010-06-15T23:57:00.001+01:00</published><updated>2010-06-15T23:59:58.918+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='slime'/><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='REPL'/><category scheme='http://www.blogger.com/atom/ns#' term='configuration'/><category scheme='http://www.blogger.com/atom/ns#' term='common lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Learning Clojure – development environment configuration</title><content type='html'>&lt;p&gt;I already started &lt;a href="http://argonauts-life.blogspot.com/2009/11/other-software-ideas.html#learn-clojure" class="ligacao"&gt;learning Clojure&lt;/a&gt; some time ago by following the tutorial &lt;a href="http://java.ociweb.com/mark/clojure/article.html" class="ligacao"&gt;Clojure - Functional Programming for the JVM by R. Mark Volkmann&lt;/a&gt;, a Partner of Object Computing, Inc. (OCI). I also did the &lt;a href="http://www.lisperati.com/clojure-spels/casting.html" class="ligacao"&gt;casting Clojure tutorial&lt;/a&gt;, read a lot of &lt;a href="http://delicious.com/euluis/clojure+blog" class="ligacao"&gt;Clojure blog posts&lt;/a&gt; and saw some &lt;a href="http://delicious.com/euluis/clojure+video" class="ligacao"&gt;videos about Clojure&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;What I was missing was a sane Clojure development environment configuration which could live at peace with my Common Lisp Emacs SLIME development environment. Well, by following the &lt;a href="http://gist.github.com/407543" class="ligacao"&gt;Swank_clojure_setup_for_hardcore_Emacs_users.el&lt;/a&gt; I achieved it. But, first I had to ditch my Debian based SLIME installation and go to the &lt;a href="http://common-lisp.net/project/slime/" class="ligacao"&gt;SLIME CVS version&lt;/a&gt;. That was the base recommendation that hardcore Emacs and Common Lisp hackers give, so, nothing too wild here.&lt;/p&gt;&lt;p&gt;Besides Clojure, I also wanted to have working Common Lisp implementations connected to Emacs. My choice was previously the &lt;a href="http://sbcl.sourceforge.net/" class="ligacao"&gt;SBCL&lt;/a&gt; version available from Debian repositories and &lt;a href="http://common-lisp.net/project/armedbear/" class="ligacao"&gt;ABCL&lt;/a&gt; from the Subversion checkout.&lt;/p&gt;&lt;p&gt;So, enough introduction, follows the objectives and how I did it on a Debian based GNU/Linux distribution and bash.&lt;/p&gt;&lt;ul&gt;   &lt;li&gt;Emacs snapshot from Debian's repositories.&lt;br&gt;   &lt;code&gt;~$ sudo apt-get install emacs-snapshot-gtk emacs-snapshot-el&lt;/code&gt;&lt;br&gt;&amp;nbsp;&lt;/li&gt;   &lt;li&gt;SLIME from CVS.&lt;br&gt;   &lt;code&gt;~$ sudo apt-get install cvs # only if you don't have CVS yet&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~$ cd programacao/lisp # I have all Lisp related programming sources here&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~/programacao/lisp$ cvs -d :pserver:anonymous:anonymous@common-lisp.net:/project/slime/cvsroot co slime&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~/programacao/lisp$ cd slime/doc&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~/programacao/lisp/slime/doc$ sudo apt-get install texlive # because I want to build an up-to-date slime-doc&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~/programacao/lisp/slime/doc$ make&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~/programacao/lisp/slime/doc$ gzip slime.info # TODO: this is available as make install, but, my distribution paths are different...&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~/programacao/lisp/slime/doc$ sudo install-info slime.info # make it available to info&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~/programacao/lisp/slime/doc$ sudo cp slime.info.gz /usr/share/info/&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~/programacao/lisp/slime/doc$ cd ~&lt;/code&gt;&lt;br&gt;&amp;nbsp;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://sbcl.sourceforge.net/" class="ligacao"&gt;SBCL&lt;/a&gt; from &lt;a href="http://downloads.sourceforge.net/project/sbcl/sbcl/1.0.39/sbcl-1.0.39-source.tar.bz2" class="ligacao"&gt;source tarball download&lt;/a&gt;, which I placed in &lt;code&gt;~/programacao/lisp/sbcl&lt;/code&gt;.&lt;br&gt;   &lt;code&gt;~$ cd programacao/lisp/sbcl&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~/programacao/lisp/sbcl$ tar -xvjf sbcl-1.0.39-source.tar.bz2&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~/programacao/lisp/sbcl$ cd sbcl-1.0.39/&lt;/code&gt;&lt;br&gt;   Now, &lt;strong&gt;check the INSTALL&lt;/strong&gt;...&lt;br&gt;   Now, &lt;strong&gt;check the &lt;a href="http://sbcl.sourceforge.net/getting.html" class="ligacao"&gt;Getting started&lt;/a&gt;&lt;/strong&gt;...&lt;br&gt;   I already had the SBCL from Debian, so, this would be my Common Lisp host which would be automatically used by &lt;code&gt;make.sh&lt;/code&gt;.&lt;br&gt;   &lt;code&gt;~/programacao/lisp/sbcl/sbcl-1.0.39$ sh make.sh # and detach with C-a d, using screen -r to check its state from time to time&lt;/code&gt;&lt;br&gt;   An alternative I will try next time is to use a non-GUI terminal by going C-M-F1.&lt;br&gt;   &lt;strong&gt;TODOs&lt;/strong&gt;: install binaries, build and install doc.&lt;/br&gt;   &lt;code&gt;~/programacao/lisp/slime/doc$ cd ~&lt;/code&gt;&lt;br&gt;&amp;nbsp;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://common-lisp.net/project/armedbear/" class="ligacao"&gt;ABCL&lt;/a&gt; from Subversion. I already had Subversion and Ant installed via &lt;code&gt;apt-get install&lt;/code&gt;.&lt;br&gt;   &lt;code&gt;~$ mkdir -p programacao/lisp/abcl/svnco &amp;amp;&amp;amp; cd programacao/lisp/abcl/svnco&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~/programacao/lisp/abcl/svnco$ svn co svn://common-lisp.net/project/armedbear/svn/trunk/abcl &amp;amp;&amp;amp; cd abcl&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~/programacao/lisp/abcl/svnco/abcl$ ant # this creates the abcl executable shell script to launch ABCL&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~/programacao/lisp/abcl/svnco/abcl$ cd ~&lt;/code&gt;&lt;br&gt;&amp;nbsp;&lt;/li&gt;   &lt;li&gt;Ant and Maven binaries downloaded and installed.&lt;br&gt;   &lt;code&gt;~$ sudo apt-get install maven2&lt;/code&gt;&lt;br&gt;&amp;nbsp;&lt;/li&gt;   &lt;li&gt;Clojure and Clojure-contrib from their Git repositories. &lt;a href="http://git-scm.com/" class="ligacao"&gt;Git&lt;/a&gt; was already installed.&lt;br&gt;   &lt;code&gt;~$ cd programacao/clojure&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~/programacao/clojure$ git clone http://github.com/richhickey/clojure.git&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~/programacao/clojure$ git clone http://github.com/richhickey/clojure-contrib.git&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~/programacao/clojure$ cd clojure&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~/programacao/clojure/clojure$ ant jar&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~/programacao/clojure/clojure$ cd ../clojure-contrib&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~/programacao/clojure/clojure-contrib$ mvn package&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~/programacao/clojure/clojure-contrib$ cp target/clojure-contrib-*.jar clojure-contrib.jar&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~/programacao/clojure/clojure-contrib$ cd ~&lt;/code&gt;&lt;br&gt;&amp;nbsp;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://github.com/technomancy/leiningen" class="ligacao"&gt;Leiningen&lt;/a&gt; binary downloaded and installed.&lt;br&gt;   &lt;code&gt;~$ mkdir -p progs/lein &amp;amp;&amp;amp; cd progs/lein/&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~/progs/lein$ wget http://github.com/technomancy/leiningen/raw/stable/bin/lein &amp;amp;&amp;amp; chmod u+x lein&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~/progs/lein$ cat &amp;gt;&amp;gt; ~/.profile&lt;br&gt;   PATH="$PATH:$HOME/progs/lein"&lt;br&gt;   # finish editing with C-d&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~/progs/lein$ lein self-install&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~/progs/lein$ cd ~&lt;/code&gt;&lt;br&gt;&amp;nbsp;&lt;/li&gt;   &lt;li&gt;Clojure-mode and Swank-clojure also from Git repositories.&lt;br&gt;   &lt;code&gt;~/programacao/clojure$ git clone http://github.com/technomancy/clojure-mode.git&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~/programacao/clojure$ git clone http://github.com/technomancy/swank-clojure.git&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~/programacao/clojure$ cd swank-clojure &amp;&amp; lein jar&lt;/code&gt;&lt;br&gt;   &lt;code&gt;~/programacao/clojure/swank-jar$ cd ..&lt;/code&gt;&lt;br&gt;&amp;nbsp;&lt;/li&gt;   &lt;li&gt;Create a shell script to launch Clojure with all the required goodies in the classpath. Note that this script will be used within Emacs and therefore you don't want fancy wrapping and history with &lt;code&gt;rlwrap&lt;/code&gt;. You may create one of those to use in the command line, though.&lt;/br&gt;   &lt;code&gt;~/programacao/clojure$ cat &amp;gt; clj-dev.sh&lt;br&gt;   #!/bin/sh&lt;br&gt;   CLOJURE_JAR=/home/user/programacao/clojure/clojure/clojure.jar&lt;br&gt;   CLOJURE_CONTRIB_JAR=/home/user/programacao/clojure/clojure-contrib/clojure-contrib.jar&lt;br&gt;   SWANK_CLOJURE_JAR=/home/user/programacao/clojure/swank-clojure/swank-clojure.jar&lt;br&gt;   JAVA=$(which java)&lt;br&gt;   CLJ="$JAVA -server -cp $CLOJURE_JAR:$CLOJURE_CONTRIB_JAR:$SWANK_CLOJURE_JAR clojure.main"&lt;br&gt;   exec $CLJ "$@"&lt;br&gt;   # not part of the file, finish with C-d&lt;/code&gt;&lt;br&gt;&amp;nbsp;&lt;/li&gt; &lt;/ul&gt;&lt;p&gt;So, after writing all this in shell language, would it be possible to have it in Clojure, Common Lisp or Emacs Lisp? With Clojure we could get fancy and execute some long lasting tasks in parallel.&lt;/p&gt;&lt;p&gt;Finally, the relevant part of my ~/.emacs file:&lt;/p&gt;&lt;pre&gt;
;;; SLIME and Lisp and Clojure support
(require 'cl)
(add-to-list 'load-path "~/programacao/lisp/slime/")
(setq slime-backend "swank-loader.lisp")
(setq inferior-lisp-program "~/programacao/lisp/sbcl/sbcl-1.0.39/run-sbcl.sh")
(add-to-list 'load-path "~/programacao/clojure/clojure-mode/")
(add-to-list 'load-path "~/programacao/clojure/swank-clojure/")
(pushnew '("\.clj$" . clojure-mode) auto-mode-alist)
(require 'clojure-mode)
(setq slime-lisp-implementations
      '((sbcl ("~/programacao/lisp/sbcl/sbcl-1.0.39/run-sbcl.sh"))
 (abcl ("~/programacao/lisp/abcl/svnco/abcl/abcl") :coding-system iso-latin-1-unix)
 (clojure ("~/programacao/clojure/clj-dev.sh") :init swank-clojure-init)))
(require 'slime-autoloads)
(setf slime-use-autodoc-mode nil) ; swank-clojure doesn't support autodoc-mode
(slime-setup '(slime-banner slime-repl slime-fancy slime-scratch
       slime-editing-commands slime-scratch slime-asdf))
(setf slime-net-coding-system 'utf-8-unix)
(setf swank-clojure-binary "~/programacao/clojure/clj-dev.sh")
(require 'swank-clojure)
(defun run-clojure ()
  "Runs clojure lisp REPL"
  (interactive)
  (slime 'clojure))
(defun run-abcl ()
  "Runs ABCL lisp REPL"
  (interactive)
  (slime 'abcl))
&lt;/pre&gt;&lt;p&gt;I still have &lt;a href="http://www.emacswiki.org/emacs/ParEdit" class="ligacao"&gt;Paredit&lt;/a&gt; configured for the Lisp dialects I use, which is &lt;a href="http://trey-jackson.blogspot.com/2009/09/emacs-tip-33-paredit.html" class="ligacao"&gt;another recommended way to customize Emacs&lt;/a&gt;. Definitely, there are pieces missing, but, I reached a target with enough relevancy for me to be worthy of careful documentation :-) I could have earned extra hacking points if it would be automated, though, so, &lt;em&gt;thou shall not halt here!&lt;/em&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-7955091721161270568?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/7955091721161270568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=7955091721161270568' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/7955091721161270568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/7955091721161270568'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/06/learning-clojure-development.html' title='Learning Clojure &amp;ndash; development environment configuration'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-4367545503683334127</id><published>2010-05-12T20:01:00.001+01:00</published><updated>2010-05-12T20:02:33.385+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='symposium'/><category scheme='http://www.blogger.com/atom/ns#' term='europe'/><category scheme='http://www.blogger.com/atom/ns#' term='common lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='review'/><title type='text'>3rd European Lisp Symposium – a light review</title><content type='html'>&lt;p&gt;The symposium was nice, small enough that you were capable of getting acquainted with a large percentage of persons and individually chatting with the presenters after their talks. There were a majority of persons related to academia, but, due to the large participation of SISCOG, I think that industry was almost half the number of persons. It is funny that by the number of academia persons is clearly larger from the point of view of presentations and involvement in the organization. We need more industry involvement not only for paying the checks, but, also for presenting and participating in the organization.&lt;/p&gt;&lt;p&gt;I would like to have seen some specific content related to Clojure. Alas, I should have proposed a lightning talk, but, I still don't have anything to show yet, so, the solution would be to spend one night preparing things, but, I preferred to enjoy the dinners. There is something that should have been added related to cloud computing and web applications. Note that RavenPack although not being that, it is a real time data service for financial companies, so, it isn't a mainstream application, but it is very interesting on its own and it is novel.&lt;/p&gt;&lt;p&gt;The overall feeling which I get of the Symposium is that of a group of persons who still suffer at the fact that being Lisp such a special thing, the Symposium should have a larger number of persons, the companies that use Lisp should be larger and more profitable, the open source libraries more polished and more in number, etc. I think that we like the persons which are part of the community and the accessibility of our stars, such as Kent Pitman. We don't like the fact that Lisp is still foreign in large swathes of the industry. Nevertheless, we are seeing a resurgence of Lisp and its use both in academia and in the industry. Now we need to get scale and solutions, so, like for other languages, we need some killer applications / frameworks. This might be a multitude of them, since there are several Lisp dialects and each one may pursuit something different.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-4367545503683334127?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/4367545503683334127/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=4367545503683334127' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/4367545503683334127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/4367545503683334127'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/05/3rd-european-lisp-symposium-light.html' title='3rd European Lisp Symposium &amp;ndash; a light review'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-1046151567482955300</id><published>2010-05-07T19:57:00.002+01:00</published><updated>2010-05-12T20:04:15.594+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='symposium'/><category scheme='http://www.blogger.com/atom/ns#' term='europe'/><category scheme='http://www.blogger.com/atom/ns#' term='common lisp'/><title type='text'>3rd European Lisp Symposium, day 2</title><content type='html'>&lt;h4&gt;&lt;a name="3rd-els-day2-parallel-programming-in-cl" class="ancora"&gt;Tutorial: Parallel Programming in Common Lisp by Pascal Costanza&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;09:00 - 10:30&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;Parallel programming is the wave of the future: It becomes harder and harder to increase the speed of single-core processors, therefore chip vendors have turned to multi-core processors to provide more computing power. However, parallel programming is in principle very hard since it introduces the potential for a combinatorial explosion of the program state space. Therefore, we need different programming models to reduce the complexity induced by concurrency.&lt;/p&gt;&lt;p&gt;Common Lisp implementations have started to provide low-level symmetric multi-processing (SMP) facilities for current multi-core processors. In this tutorial, we will learn about important parallel programming concepts, what impact concurrency has on our intuitions about program efficiency, what low-level features are provided by current Common Lisp implementations, how they can be used to build high-level concepts, and what concepts Lispers should watch out for in the near future. The tutorial will cover basic concepts such as task parallelism, data parallelism and pipeline models; synchronization primitives ranging from compare-and-swap, over locks and software transactional memory, to mailboxes and barriers; integration with Lisp-specific concepts, such as special variables; and last but not least some rules of thumb for writing parallel programs.&lt;/p&gt; &lt;/blockquote&gt;&lt;p&gt;QUESTIONS&lt;/p&gt;&lt;p&gt;I questioned Pascal about the portability of parallel code and there is none up-to-now. This smells like an opportunity.&lt;/p&gt;&lt;p&gt;On a question of mine about the need to sync the functional data structures internally - for instance &lt;a href="http://common-lisp.net/project/fset/Site/index.html" class="ligacao"&gt;FSet&lt;/a&gt; is portable - I got a book reference: Purely functional data structures - it was suggested to me that I should read this to understand why there is no need for synchronization. THOUGHT: my lack of an academic background in computer science is to blame for my lack of knowledge about things like this, even after having read about it in respect of the Clojure data structures.&lt;/p&gt;&lt;h4&gt;&lt;a name="3rd-els-day2-session-iii-language" class="ancora"&gt;Session III (The Language)&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;11:00 - 12:45&lt;/p&gt;&lt;h5&gt;&lt;a name="3rd-els-day2-clox" class="ancora"&gt;CLoX: Common Lisp Objects for XEmacs by Didier Verna&lt;/a&gt;&lt;/h5&gt;&lt;p&gt;Debugging CLoX is a living hell.&lt;/p&gt;&lt;p&gt;Didier made an excellent and very dynamic presentation. There should be no problem in moving what he got up-to-now into GNU Emacs. He intends to optimize some parts to C, though, and then it would be a problem, because XEmacs C level is incompatible with GNU Emacs C.&lt;/p&gt;&lt;h5&gt;&lt;a name="3rd-els-day2-clweb" class="ancora"&gt;CLWEB: A literate programming system for Common Lisp by Alexander Plotnick&lt;/a&gt;&lt;/h5&gt;&lt;p&gt;CLWEB is language specific with advantages for Common Lispers. No tracking back to the source file position yet. Complexity due to the different objectives of the CLWEB reader and Common Lisp reader. Common Lisp STREAM libraries and pretty printer are great! Code walker for Common Lisp - based on the one from the &lt;code&gt;macro-expand-all&lt;/code&gt; paper(?). It would be nice if there was more standard ways to interact with the Lisp operators, as to have an easier time creating a walker. Works in SBCL, Allegro and another (Clozure ?).&lt;/p&gt;&lt;h4&gt;&lt;a name="3rd-els-day2-langs-n-types-racket" class="ancora"&gt;Keynote: Lots of Languages, Tons of Types by Matthias Felleisen, Northeastern University&lt;/a&gt;&lt;/h4&gt; &lt;blockquote&gt;&lt;p&gt;Since 1995 my research team (PLT) and I have been working on a language for creating programming languages - small and large. Our code base includes a range of languages, and others contribute additional languages on a regular basis. PLT programmers don't hesitate to pick our lazy dialect to implement one module and to link it to a strict language for another module in the same system. Later they may even migrate one of the modules to the typed variant during some maintenance task.&lt;/p&gt;&lt;p&gt;An expressive macro system is one key to this riches of languages. Starting with the 1986 introduction of hygienic macros, the SCHEME world has worked on turning macros into tools for creating proper abstractions. The first part of my talk will briefly describe this world of modern macros and its key attributes: hygiene, referential transparency, modularity of macros, phase separation, and macro specification.&lt;/p&gt;&lt;p&gt;The second part of my talk will focus on how to equip LISP-like languages with a sound type systems and that will illustrate the second key idea, namely, monitoring the interactions between different languages. Our approach to type systems allows programmers to stick to their favorite LISP idioms. It mostly suffices to annotate functions and structures with type declarations during maintenance work. To ensure the soundness of this information even when higher-order values flow back and forth between typed and untyped modules, module boundaries are automatically equipped with software contracts that enforce type-invariants at all levels.&lt;/p&gt; &lt;/blockquote&gt;&lt;p&gt;PLT Scheme is now &lt;a href="http://www.plt-racket.org/new-name.html" class="ligacao"&gt;Racket&lt;/a&gt;. Types are very important for maintenance work.&lt;/p&gt;&lt;p&gt;Type theory is stupid. Design driven to make typed Lisp programming practical. Combining the macro system and the type system is still an unresolved challenge.&lt;/p&gt;&lt;h4&gt;&lt;a name="3rd-els-day2-panel" class="ancora"&gt;Panel &amp;ndash; does Lisp matters?&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;I'm part of the panel and therefore instead of notes the following is what I prepared to say. Eventually the specifics weren't followed...&lt;/p&gt;&lt;h5&gt;My small intervention notes&lt;/h5&gt;&lt;p&gt;&lt;ol&gt; &lt;li&gt;Name&lt;/li&gt; &lt;li&gt;disclaimer: less Lisp Experience than the majority of the persons in the room. Although I'm a SISCOG employee, what I will say represents my opinions and I don't know if they are aligned with the ones of SISCOG administration or with the ones of the majority of SISCOG employees.&lt;/li&gt; &lt;li&gt;background:&lt;ol&gt;&lt;li&gt;Physics Engineering, some experience in software development both for data processing and analysis and for scientific instruments&lt;/li&gt; &lt;li&gt;then I started working as a software engineer in telecommunications domain, specifically, in the management of telecommunications networks&lt;/li&gt; &lt;li&gt;about 3 years ago I joined SISCOG and started working in the railway planning and management domain and yes, programming in Common Lisp.&lt;/li&gt; &lt;/ol&gt;&lt;/ol&gt;&lt;p&gt;So, SISCOG was founded by 2 professors of the IST - an engineering academical institution. They wanted to use Artificial Intelligence and in the 80s that meant Lisp.&lt;/p&gt;&lt;p&gt;Question: Does Lisp matters?&lt;/p&gt;&lt;p&gt;Yes it does, because of the following three things:&lt;/p&gt;&lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Inspiration&lt;/strong&gt; &amp;ndash; it has been an inspiration to lots of persons and languages. This is nothing new, but, many of the new languages still steal from Lisps. And normally they are still crippled copies. So Lisp matters even if it didn't existed anymore, although with open source, as Kent Pitman said yesterday, it isn't possible to kill it.&lt;/li&gt;   &lt;li&gt;&lt;strong&gt;Edge&lt;/strong&gt; &amp;ndash; it provides an edge for its users. Be it due to its dynamic nature, macros, tools, history, smart people magnet, etc.&lt;/li&gt;   &lt;li&gt;&lt;strong&gt;Research&lt;/strong&gt; &amp;ndash; Lisp is very important due to its flexibility and ease of experimenting with new ideas. I will just refer as an example to the previous keynote by Matthias Felleisen.&lt;/li&gt; &lt;/ul&gt;&lt;p&gt;Quote by Matthias Felleisen:&lt;/p&gt; &lt;blockquote&gt;we are the cockroaches of the world, nobody can kill us!&lt;/blockquote&gt;&lt;h4&gt;&lt;a name="3rd-els-day2-announcements-wrapup" class="ancora"&gt;Announcements, Symposium wrap-up&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Didier Verna announced that the 4th European Lisp Symposium will be next year in Hamburg, Germany, on March 30 and April 1. Deadline to submissions will be around the end of the year. This time around I will try to have something to present. Theme parallelism and ...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-1046151567482955300?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/1046151567482955300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=1046151567482955300' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/1046151567482955300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/1046151567482955300'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/05/3rd-european-lisp-symposium-day-2.html' title='3rd European Lisp Symposium, day 2'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-4083144745890115176</id><published>2010-05-06T19:50:00.002+01:00</published><updated>2010-05-12T19:53:40.071+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='symposium'/><category scheme='http://www.blogger.com/atom/ns#' term='europe'/><category scheme='http://www.blogger.com/atom/ns#' term='common lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='siscog'/><title type='text'>3rd European Lisp Symposium, day 1</title><content type='html'>&lt;p&gt;I'm participating in the &lt;a href="http://www.european-lisp-symposium.org/" class="ligacao"&gt;3rd European Lisp Symposium&lt;/a&gt;. My employer, &lt;a href="http://www.siscog.eu/" class="ligacao"&gt;SISCOG&lt;/a&gt; is sponsoring my participation and of a bunch of others, like &lt;a href="http://kvardek-du.kerno.org/" class="ligacao"&gt;the other Lu&amp;iacute;s Oliveira&lt;/a&gt; of &lt;a href="http://common-lisp.net/project/cffi/" class="ligacao"&gt;CFFI&lt;/a&gt; fame.&lt;/p&gt;&lt;p&gt;What follows are my notes of day one of the 3rd ELS, with an organization which follows the &lt;a href="http://www.european-lisp-symposium.org/content-programme-full.html" class="ligacao"&gt;programme&lt;/a&gt;.&lt;/p&gt;&lt;h4&gt;&lt;a name="3rd-els-day1-welcome" class="ancora"&gt;Welcome&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Wifi not working...&lt;/p&gt;&lt;p&gt;The TI Explorer Lisp Machine. It is possible to submit ideas for lightning talks.&lt;/p&gt;&lt;h4&gt;&lt;a name="3rd-els-day1-reflections-on-lisp" class="ancora"&gt;Keynote: Going Meta: Reflections on Lisp, Past and Future by Kent Pitman, HyperMeta Inc.&lt;/a&gt;&lt;/h4&gt; &lt;blockquote&gt;&lt;p&gt;Over a period of several decades, I have had the good fortune to witness and influence the design, evolution, standardization and use of quite a number of dialects of Lisp, including MACLISP, T, Scheme, Zetalisp, Common Lisp, and ISLISP. I will offer reflections, from a personal point of view, about what enduring lessons I have learned through this long involvement.&lt;/p&gt;&lt;p&gt;Both the programming world and the real world it serves have changed a lot in that time. Some issues that faced Lisp in the past no longer matter, while others matter more than ever. I'll assess the state of Lisp today, what challenges it faces, what pitfalls it needs to avoid, and what Lisp's role might and should be in the future of languages, of programming, and of humanity.&lt;/p&gt; &lt;/blockquote&gt;&lt;p&gt;Maybe Kent would collaborate in data standards and not language standards &amp;ndash; the objective is to have more choice when selecting what programming language and OS you use to do your work...&lt;/p&gt;&lt;p&gt;Interesting, during the AI Winter, due to the risk of Lisp failing altogether (vendors were near to bankruptcy) there was some need to control the news to be more positive about Lisp. Then &lt;a href="http://www.dreamsongs.com/" class="ligacao"&gt;Gabriel&lt;/a&gt; presented &lt;a href="http://www.dreamsongs.com/WorseIsBetter.html" class="ligacao"&gt;Worse is Better&lt;/a&gt; and plenty of persons got mad at him.&lt;/p&gt;&lt;p&gt;Quote of a saying someone had at Symbolics:&lt;/p&gt; &lt;blockquote&gt;At Symbolics, we make hard problems easy and easy problems harder.&lt;/blockquote&gt;&lt;p&gt;Lisp has became the nerd of the programming languages. Lisp became detached. At that time Lisp was different and that was very relevant.&lt;/p&gt;&lt;p&gt;Book references: You Are Not a Gadget by Jaron Lanier; Crossing the Chasm&lt;/p&gt;&lt;p&gt;Some people like to be guided, actually they would pay to be guided. Smart people often don't get this.&lt;/p&gt;&lt;p&gt;The effects of free software: languages can no longer be killed.&lt;/p&gt;&lt;p&gt;The effects of the internet: Lisp being used in the server hidden.&lt;/p&gt;&lt;p&gt;The promise of &lt;a href="http://clojure.org" class="ligacao"&gt;Clojure&lt;/a&gt;: multi-core, it is connected (being in the JVM), vision (Rich Hickey).&lt;/p&gt;&lt;p&gt;QUESTIONS&lt;/p&gt;&lt;p&gt;Why is Lisp the language and a Runtime? Why isn't it just the language? One potential problem is CLOS, maybe we need to drop it and actually try to move in a way that it becomes more attached.&lt;/p&gt;&lt;h4&gt;&lt;a name="3rd-els-day1-math-applications" class="ancora"&gt;Session I (Mathematical Applications)&lt;/a&gt;&lt;/h4&gt;&lt;h5&gt;&lt;a name="3rd-els-day1-monadic-2nd-order-graph-props" class="ancora"&gt;Verifying monadic second order graph properties with tree automata by Bruno Courcelle and Irne Anne Durand&lt;/a&gt;&lt;/h5&gt;&lt;p&gt;Hard to understand and I didn't followed it fully...&lt;/p&gt;&lt;h5&gt;&lt;a name="3rd-els-day1-dsel-computational-category-theory" class="ancora"&gt;A DSEL for Computational Category Theory by Aleksandar Bakic&lt;/a&gt;&lt;/h5&gt;&lt;p&gt;A Software Engineer that worked on this as a hobby. He used CLOS and functions, trying to mix the two to improve the state of the art of the DSL design for this application, based on what was achieved in the other DSLs based in more functional languages. Book reference, the book uses Standard ML.&lt;/p&gt;&lt;h4&gt;&lt;a name="3rd-els-day1-reading-the-news-with-cl" class="ancora"&gt;Keynote: Reading the News with Common Lisp by Jason Cornez, RavenPack&lt;/a&gt;&lt;/h4&gt; &lt;blockquote&gt;&lt;p&gt;The financial industry thrives on data: oceans of historical archives and rivers of low-latency, real-time feeds. If you can know more, know sooner,or know differently, then there is the opportunity to exploit this knowledge and make money. Today's automated trading systems consume this data and make unassisted decisions to do just that. But even though almost every trader will tell you that news is an important input into their trading decisions, most automated systems today are completely unaware of the news - some data is missing. What technology is being used to change all this and make news available as analytic data to meet the aggressive demands of the financial industry?&lt;/p&gt;&lt;p&gt;For around seven years now, RavenPack has been using Common Lisp as the core technology to solve problems and create opportunities for the financial industry. We have a revenue-generating business model where we sell News Analytics - factual and sentiment data extracted from unstructured, textual news. In this talk, I'll describe the RavenPack software architecture with special focus on how Lisp plays a critical role in our technology platform, and hopefully in our success. I hope to touch upon why we at RavenPack love Lisp, some challenges we face when using Lisp, and perhaps even some principles of successful software engineering.&lt;/p&gt; &lt;/blockquote&gt;&lt;p&gt;CTO of &lt;a href="http://www.ravenpack.com/" class="ligacao"&gt;RavenPack&lt;/a&gt;. No Lisp code in the presentation, but, he is passionate about Lisp and software engineering and still writes plenty of code.&lt;/p&gt;&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Quantitative_analyst" class="ligacao"&gt;Quants&lt;/a&gt; traders. The opportunity - News are important, but, the algorithms didn't used it. News metadata is unreliable. 27000 companies tracked. Manage the historical news database - entity detection and time dependent data. &lt;/p&gt;&lt;p&gt;They use Lisp because they like Lisp and not because it was a problem that only Lisp can solve. Their customers don't care about RavenPack using Lisp. They also don't sell software, they sell data. &lt;/p&gt;&lt;p&gt;They worked with Franz to improve the interface to Oracle DB. Although they were acquainted of some solutions like CL-SQL, it didn't supported some things they wanted, like stored procedures. Other tools being used are: Linux, Git, Windows, Jakarta HTTP client, Java for integration, Apache Server, etc.&lt;/p&gt;&lt;p&gt;Common Lisp technologies: CL-XMPP, Jlinker (Franz), Allegro Server (Franz), Lisp Server pages, Salza compression, CL-store, etc.&lt;/p&gt;&lt;p&gt;Techniques:&lt;/p&gt;&lt;ul&gt;   &lt;li&gt;Bayesian filters &amp;ndash; human experts that classify news as Ham or Spam which serves as training data. Accuracy of around 68%.&lt;/li&gt;   &lt;li&gt;Restricted Boltzmann machine &amp;ndash; compresses some complex full representation into its minimal representation. Accuracy around 87%. It isn't enough for quanta trading.&lt;/li&gt;   &lt;li&gt;Processing Headlines, based on templates or patterns. Kind of rule processing.&lt;/li&gt; &lt;/ul&gt;&lt;p&gt;Software architecture: boxes for receiving data, boxes for emitting data, boxes for analysis of historical data. Oracle at the center.&lt;/p&gt;&lt;pre&gt;
Collectors (read news) -&gt; Real-time Analysis -&gt; Event Server -&gt; 
 Lisp                       Lisp + CL-Store        CL-XMPP (chat rooms)
&lt;/pre&gt;&lt;p&gt;Lisp frustrations: GC (Lisp is behind the curve compared with JVM and CLR), handling of out of memory errors, weak library support for HTTP, Lisp as a scripting language it is chatty on *standard-out* and last but not the least a lot of unfinished libraries.&lt;/p&gt;&lt;p&gt;Lisp Joy: patch live systems, optional keyword parameters, tools (debugger, REPL, tracer, inspector), FFI and macros.&lt;/p&gt;&lt;p&gt;Book reference: Coders at Work by Peter Siebel.&lt;/p&gt;&lt;h4&gt;&lt;a name="3rd-els-day1-coffee2" class="ancora"&gt;Coffee&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;15:30 - 16:00&lt;/p&gt;&lt;p&gt;I was indirectly invited via Tiago Maduro Dias to participate in the final panel of 3rd-ELS. After about 1 minute considering if I was the appropriate person to represent SISCOG, I said to myself, yeah, I'll do it, it will be a honor, let me see if I'm capable of it!&lt;/p&gt;&lt;h4&gt;&lt;a name="3rd-els-day1-the-outside-world" class="ancora"&gt;Session II (The Outside World)&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;16:00 - 18:00&lt;/p&gt;&lt;h5&gt;&lt;a name="3rd-els-day1-marrying-commonlisp2java" class="ancora"&gt;Marrying Common Lisp to Java, and Their Offspring by Jerry Boetje and Steven Melcher&lt;/a&gt;&lt;/h5&gt;&lt;p&gt;How Lisp looks in Java. Very detailed explanation on how Common Lisp is implemented in Java in &lt;a href="http://www.clforjava.org/" class="ligacao"&gt;CLforJava&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;THOUGHTS: I would like that there was a similar design overview for &lt;a href="http://common-lisp.net/project/armedbear/" class="ligacao"&gt;ABCL&lt;/a&gt;!...&lt;/p&gt;&lt;h5&gt;&lt;a name="3rd-els-day1-tutorial-computer-vision-with-acl" class="ancora"&gt;Tutorial: Computer Vision with Allegro Common Lisp and the VIGRA Library using VIGRACL Benjamin Seppke and Leonie Dreschler-Fischer&lt;/a&gt;&lt;/h5&gt;&lt;p&gt;Offers filters, morphological operations, feature detectors, segmentation, transformations... All at the comfort of an Allegro REPL near you :-)&lt;/p&gt;&lt;p&gt;&lt;a href="http://hci.iwr.uni-heidelberg.de/vigra/" class="ligacao"&gt;VIGRA&lt;/a&gt; Library - no Google, its not Viagra! C++, template based, unit tested, multi-platform and which is fairly complete in terms of available algorithms.&lt;/p&gt;&lt;p&gt;VIGRACL uses &lt;code&gt;defsystem&lt;/code&gt;. It has a multilayer design with 4 layers. In the bottom, there is the VIGRA library in C++, then a C wrapper, then Allegro Common Lisp FFI and finally an abstraction layer implemented in Common Lisp on the top.&lt;/p&gt;&lt;p&gt;Design: multi-layer, slide.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-4083144745890115176?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/4083144745890115176/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=4083144745890115176' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/4083144745890115176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/4083144745890115176'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/05/3rd-european-lisp-symposium-day-1.html' title='3rd European Lisp Symposium, day 1'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-1765416704034177990</id><published>2010-05-01T22:45:00.003+01:00</published><updated>2010-05-01T22:55:47.608+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recruiting'/><category scheme='http://www.blogger.com/atom/ns#' term='siscog'/><title type='text'>SISCOG is hiring developers</title><content type='html'>&lt;a href="http://www.siscog.eu/subarea.asp?idSubArea=45&amp;idArea=1"&gt;SISCOG is hiring&lt;/a&gt; for our projects department. If you want to program in Common Lisp professionally, are interested in the railway domain (planning and management) and want to be my colleague ;-), apply please.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-1765416704034177990?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/1765416704034177990/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=1765416704034177990' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/1765416704034177990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/1765416704034177990'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/05/siscog-is-hiring-developers.html' title='SISCOG is hiring developers'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-2576575739897218637</id><published>2010-03-20T18:28:00.000Z</published><updated>2010-03-20T18:28:37.281Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><category scheme='http://www.blogger.com/atom/ns#' term='functional'/><category scheme='http://www.blogger.com/atom/ns#' term='oop'/><title type='text'>The Functional Object System idea</title><content type='html'>&lt;p&gt;Functional languages and functional programming techniques are getting into the mainstream of software development these days. Clojure is an example of a recently created language (a Lisp dialect) that although not purely functional, applies the techniques and principles of functional programming very seriously and IMHO with success. Now, how do we combine this in a seamless way with object oriented programming? OOP has been up-to-now very dependent on the objects having mutable states in a destructive way. This isn't compatible with the functional data types which although having state, this is immutable, being the objects' data shared and construction only &amp;ndash; and therefore reusable.&lt;/p&gt;&lt;p&gt;My idea is that we need a new object paradigm, which enables easy definition of immutable objects which have the same nature as the functional data types. I've seen this to some degree in a specific SISCOG library defined as an extension to CLOS and that enables an object state tree &amp;ndash; much more advanced than the typical command pattern stack based undo/redo functionality you commonly see. It could be implemented in Java with aspect oriented programming (i.e., with AspectJ). Alas, this library suffers from its objective not being specifically of providing a &lt;em&gt;Functional Object System&lt;/em&gt; (FOS) and by using the mutable Common Lisp standard types &amp;ndash; once you get hold to one of its fields, you can wreck the state indirectly. It also relies on the common &lt;code&gt;with&lt;/code&gt; wrapper macros to change from state to state, instead of assuming that all state changes shall be construction only and therefore dropping the use of wrapper macros.&lt;/p&gt;&lt;p&gt;So, what specific concepts must a FOS take to heart in order to work?&lt;/p&gt;&lt;ul&gt;   &lt;li&gt;Differentiate between query operations and construction operations.&lt;/li&gt;   &lt;li&gt;Construction operations always return new objects that shall have one or more of their fields with different values than the objects they clone.&lt;/li&gt;   &lt;li&gt;There shall be ways to change the state of the application, pointing some reference to a new root node tree, but, these shall follow concurrency (and maybe distribution) aware protocols, such as the ones defines in Clojure.   These aren't necessarily part of the FOS, but, the FOS must play well with these.&lt;/li&gt;   &lt;li&gt;The FOS shall provide means for its objects to take advantage of non-FOS objects.   E.g., a FOS for Clojure must provide a potentially largely inclusive way for impure mutable Java defined objects to be used with it, even if that means to take advantage of introspection on these objects' operations and expensive quasi-duplication of them without the benefit of reuse.&lt;/li&gt; &lt;/ul&gt;&lt;p&gt;So, now that I had one more crazy idea thrown into the web, lets check prior art...&lt;/p&gt;&lt;p&gt;&lt;a href="http://caml.inria.fr/ocaml/index.en.html" class="ligacao"&gt;OCaml&lt;/a&gt; has objects and contains a basis operation called &lt;em&gt;functional update&lt;/em&gt;. This provides the basis for maintaining that an object is data plus behavior, but, making it side effect free. The convenience it provides is very interesting, it is almost more terse than actually mutating the objects! Even so, you have the possibility to use an imperative style, but, it isn't the default and you must declare the methods that actually change with &lt;code&gt;mutable&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;In Clojure it is all about concurrency, so, you would have to guard against concurrent access to objects that are being mutated. So, there might be additional semantics involved, which weren't obvious in the small part of OCaml that I read.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-2576575739897218637?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/2576575739897218637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=2576575739897218637' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/2576575739897218637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/2576575739897218637'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/03/functional-object-system-idea.html' title='The Functional Object System idea'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-8259847339303197977</id><published>2010-03-20T18:27:00.000Z</published><updated>2010-03-20T18:27:43.278Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><category scheme='http://www.blogger.com/atom/ns#' term='tests'/><title type='text'>Gentoo and automated tests</title><content type='html'>&lt;p&gt;With Gentoo Linux you already have the sources for all the software you install. It would be nice if you could also execute the automated tests that the software packages have. If the practice of having also &lt;a href="http://argonauts-life.blogspot.com/2009/12/deployment-automated-tests.html" class="ligacao"&gt;deployment tests&lt;/a&gt; in software packages was common enough, you could in the end check if the whole stuff was working as expected by the authors of the software and provide very valuable diagnostic information to open source software projects.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-8259847339303197977?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/8259847339303197977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=8259847339303197977' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/8259847339303197977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/8259847339303197977'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/03/gentoo-and-automated-tests.html' title='Gentoo and automated tests'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-3171505320464948632</id><published>2010-03-20T18:26:00.001Z</published><updated>2010-03-20T18:26:59.410Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><category scheme='http://www.blogger.com/atom/ns#' term='tests'/><title type='text'>Deployment automated tests</title><content type='html'>&lt;p&gt;A nice thing I read in an agile book was of being able to execute the automated tests after deploying the software as a means of diagnosing if the installation was alright. I think that such a practice should be common place as a means of diagnosing if a certain deployment is correct.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-3171505320464948632?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/3171505320464948632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=3171505320464948632' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/3171505320464948632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/3171505320464948632'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/03/deployment-automated-tests.html' title='Deployment automated tests'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-5644777513178660696</id><published>2010-03-20T18:26:00.000Z</published><updated>2010-03-20T18:26:06.839Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='UML'/><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><title type='text'>UML representation in Clojure</title><content type='html'>&lt;p&gt;UML representation in Clojure. I.e., create a Clojure domain language for representing UML models and diagrams, which should be serializable to XMI and graphically displayable in several formats, like for instance in ArgoUML format and in SVG. Another idea for ELS 2010...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-5644777513178660696?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/5644777513178660696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=5644777513178660696' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/5644777513178660696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/5644777513178660696'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/03/uml-representation-in-clojure.html' title='UML representation in Clojure'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-8989541204132748203</id><published>2010-03-20T18:25:00.000Z</published><updated>2010-03-20T18:25:17.135Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><title type='text'>Distributing Clojure</title><content type='html'>&lt;p&gt;Make a framework for distributed computing with Clojure. Another idea for ELS 2010...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-8989541204132748203?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/8989541204132748203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=8989541204132748203' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/8989541204132748203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/8989541204132748203'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/03/distributing-clojure.html' title='Distributing Clojure'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-8308447236908483552</id><published>2010-03-20T18:24:00.000Z</published><updated>2010-03-20T18:24:34.346Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud computing'/><title type='text'>Exploring the clouds</title><content type='html'>&lt;p&gt;Parallel system to explore the infrastructure of cloud providers. With Amazon use its web services to deploy clients and listen to the result. With Google AppEngine ping hosted applications. Use Google Web search to search for hosted applications &amp;ndash; &lt;code&gt;site:.appeng.com&lt;/code&gt;. Do this with Clojure. How about Microsoft's cloud? ClojureCLR?!?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-8308447236908483552?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/8308447236908483552/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=8308447236908483552' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/8308447236908483552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/8308447236908483552'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/03/exploring-clouds.html' title='Exploring the clouds'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-1567846782120883245</id><published>2010-03-20T18:23:00.000Z</published><updated>2010-03-20T18:23:42.007Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='patterns'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='common lisp'/><title type='text'>Common Lisp design patterns</title><content type='html'>&lt;p&gt;Actually catalog of common Common Lisp idioms. Some idioms are generalizable for all major Lisp dialects. Another nice idea for ELS 2010. &lt;/p&gt;&lt;pre&gt;
reduce map
with-x
defx or def-x
dox or do-x
&amp;lt;conditional-operator&amp;gt;-let or b&amp;lt;conditional-operator&amp;gt; [b is for binding]
...&lt;/pre&gt;&lt;p&gt;Provide examples from SISCOG code base?&lt;/p&gt;&lt;p&gt;Each pattern should have an associated implementation strategy for being defined with macros.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-1567846782120883245?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/1567846782120883245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=1567846782120883245' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/1567846782120883245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/1567846782120883245'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/03/common-lisp-design-patterns.html' title='Common Lisp design patterns'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-1952074811254354664</id><published>2010-03-20T18:22:00.000Z</published><updated>2010-03-20T18:22:29.442Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><title type='text'>Reverse engineering of XML specifications</title><content type='html'>&lt;p&gt;Make a module to handle reverse engineering of XML specifications. One obvious use would be to model XMI's representation of UML in UML. A specific usage interesting for SISCOG's domain would be to reveng RailML specs.&lt;/p&gt;&lt;p&gt;Make this with NSN BicNet Tnml and bring Tnml into UML world as I was proposing internally some years ago.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-1952074811254354664?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/1952074811254354664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=1952074811254354664' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/1952074811254354664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/1952074811254354664'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/03/reverse-engineering-of-xml.html' title='Reverse engineering of XML specifications'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-1370462191072981464</id><published>2010-03-20T18:20:00.001Z</published><updated>2010-03-20T18:21:01.600Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><category scheme='http://www.blogger.com/atom/ns#' term='OSGi'/><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><title type='text'>Change the ArgoUML plugins technology to be based on OSGi</title><content type='html'>&lt;p&gt;&lt;a href="http://argouml.tigris.org/" class="ligacao"&gt;ArgoUML&lt;/a&gt; has modules (the ArgoUML's terminology for its plugins), as an extension mechanism of the application. The more common use case are the programming language modules, but, you can also have core modules, like for instance the sequence diagram module or the UML property panels module. The problem with the ArgoUML modules as I see it now is that ArgoUML is reinventing the wheel and that &lt;em&gt;this wheel&lt;/em&gt; has it share of limitations. &lt;/p&gt;&lt;ul&gt;   &lt;li&gt;One of the biggest limitations is the problem of not being able to specify a dependency of one module of another.&lt;/li&gt;   &lt;li&gt;Another problem is that it is a bit of work to define a module which only purpose is to integrate a third party library into ArgoUML.&lt;/li&gt;   &lt;li&gt;The final thing I dislike is that for one reason or another, currently the installation of ArgoUML includes all standard modules in the classpath by generating a hard-coded list of the jars (see &lt;code&gt;META-INF/MANIFEST.MF&lt;/code&gt; in &lt;code&gt;argouml.jar&lt;/code&gt; in a installation of ArgoUML).&lt;/li&gt; &lt;/ul&gt;&lt;p&gt;My idea is that we should base our modules or plugins in OSGi. I think that this isn't very hard to achieve because the current scheme doesn't differ very much from what plain OSGi requires. In part this was performed by necessity of the Argoeclipse project &amp;ndash; definition of the Eclipse build system based on the MANIFEST.MF files. But, the other part is simply due to the usage of good object oriented design with the Java language, which is related to the interface involved in the definition of the base module (see &lt;code&gt;&lt;a href="http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/moduleloader/ModuleInterface.java?revision=17824&amp;view=markup" class="ligacao"&gt;&lt;/a&gt;&lt;/code&gt;) and of specific interfaces for functionality oriented modules, like for instance &lt;code&gt;&lt;a href="http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/generator/CodeGenerator.java?revision=17868&amp;view=markup" class="ligacao"&gt;&lt;/a&gt;&lt;/code&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-1370462191072981464?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/1370462191072981464/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=1370462191072981464' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/1370462191072981464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/1370462191072981464'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/03/change-argouml-plugins-technology-to-be.html' title='Change the ArgoUML plugins technology to be based on OSGi'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-904563808656508310</id><published>2010-03-20T18:20:00.000Z</published><updated>2010-03-20T18:20:09.178Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><category scheme='http://www.blogger.com/atom/ns#' term='tests'/><title type='text'>Updating ArgoUML tests to JUnit 4.x</title><content type='html'>&lt;p&gt;We should update ArgoUML tests to JUnit 4.x, is order to take advantage of some of the new features of it. Since ArgoUML now must have compatibility with JSE 5, this should be no problem.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-904563808656508310?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/904563808656508310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=904563808656508310' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/904563808656508310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/904563808656508310'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/03/updating-argouml-tests-to-junit-4x.html' title='Updating ArgoUML tests to JUnit 4.x'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-9017471772649702625</id><published>2010-03-20T18:19:00.000Z</published><updated>2010-03-20T18:19:13.007Z</updated><title type='text'>Updating ArgoUML libraries</title><content type='html'>&lt;p&gt;There are several libraries in ArgoUML that need to be updated: easymock, JUnit, etc.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-9017471772649702625?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/9017471772649702625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=9017471772649702625' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/9017471772649702625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/9017471772649702625'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/03/updating-argouml-libraries.html' title='Updating ArgoUML libraries'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-7699426442294971063</id><published>2010-03-20T18:18:00.000Z</published><updated>2010-03-20T18:18:24.377Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><category scheme='http://www.blogger.com/atom/ns#' term='tests'/><title type='text'>Organizing ArgoUML's automated tests</title><content type='html'>&lt;p&gt;ArgoUML has all the automated tests mixed in a single directory tree for each of the sub-projects of which it is composed. I think that as a project we should differentiate the levels of testing according to the nature of those tests: unit, module, integration, acceptance [non-existing as of now] and deployment. This would enable the TDD cycle, by having unit tests execution in seconds instead of minutes. It would also be very educative for the testing practices in ArgoUML.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-7699426442294971063?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/7699426442294971063/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=7699426442294971063' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/7699426442294971063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/7699426442294971063'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/03/organizing-argoumls-automated-tests.html' title='Organizing ArgoUML&apos;s automated tests'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-2542827995267734567</id><published>2010-03-20T18:17:00.000Z</published><updated>2010-03-20T18:17:25.844Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='UML'/><category scheme='http://www.blogger.com/atom/ns#' term='profile'/><category scheme='http://www.blogger.com/atom/ns#' term='common lisp'/><title type='text'>UML profile for Lisp</title><content type='html'>&lt;p&gt;Creating a UML profile for Lisp should be very interesting. It would be an excellent exercise for a lightning talk in the ELS 2010. It would be an excellent opportunity to test in depth the ArgoUML profile support. It would be a learning opportunity for me into the depths of the extensibility aspects of UML.&lt;/p&gt;&lt;p&gt;My idea is that it should have some common patterns amongst the several dialects and that those patterns should in principle be modeled in a reusable way in a common profile, maybe a PIM.&lt;/p&gt;&lt;p&gt;Then, each Lisp has a specific namespace system, macro system and library. This must be derived with a PIM to PSM transformation and then developed on its own.&lt;/p&gt;&lt;p&gt;A REPL for each would also be required.&lt;/p&gt;&lt;p&gt;A connector to connect to live Lisps to enable reverse engineering is also interesting. This is something that could take advantage of some sharing of a common base project, but, would naturally diverge for each Lisp dialect.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-2542827995267734567?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/2542827995267734567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=2542827995267734567' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/2542827995267734567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/2542827995267734567'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/03/uml-profile-for-lisp.html' title='UML profile for Lisp'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-5398574584737759741</id><published>2010-03-20T18:15:00.000Z</published><updated>2010-03-20T18:15:50.753Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><category scheme='http://www.blogger.com/atom/ns#' term='REPL'/><title type='text'>A multiple languages REPL in ArgoUML</title><content type='html'>&lt;p&gt;Sub-project of ArgoUML that provides a base REPL infrastructure to enable and easy development of multiple language REPLs for ArgoUML. I would make one for each of the dynamic languages modules that exist. Even for the C++ module or other non-dynamic languages modules a special purpose and convenient REPL could be interesting if it contained the interesting imports for interaction with the model. Modeling at the REPL with Common Lisp (ABCL), Clojure or Jython, what a dream!&lt;/p&gt;&lt;p&gt;I'm trying to embed ABCL in ArgoUML, opening a REPL in Emacs, but, because my SLIME setup for ABCL is broken, I'm having difficulties. The idea is to try to develop interactively a ETL from a UML1.4 model into a UML2.2 model to make it easy to update the profiles from UML1.4 XMI into UML2.2 XMI.&lt;/p&gt;&lt;p&gt;One possible solution would be not to use Emacs and SLIME. For instance, I could reuse Netbeans REPL. Since Netbeans already has Jython and JRuby support, I could try to port those easily into ArgoUML.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-5398574584737759741?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/5398574584737759741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=5398574584737759741' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/5398574584737759741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/5398574584737759741'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/03/multiple-languages-repl-in-argouml.html' title='A multiple languages REPL in ArgoUML'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-7272870151558660006</id><published>2010-03-20T18:14:00.000Z</published><updated>2010-03-20T18:14:39.111Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><title type='text'>Auto coordinated traffic</title><content type='html'>&lt;p&gt;System or platform that signals drivers' intent from cars to cars, so that the cars could be smart enough to warn the drivers about what other persons intend to do or even take appropriate measures to avoid accidents.&lt;/p&gt;&lt;p&gt;TODO: elaborate on this.&lt;/p&gt;&lt;p&gt;TODO: develop the idea of developing computational models/simulations where the platform modules could be tested and developed. Do it in Clojure, visualization in Google Maps with site in Google AppEngine. Do this in the programacao handbook.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-7272870151558660006?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/7272870151558660006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=7272870151558660006' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/7272870151558660006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/7272870151558660006'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/03/auto-coordinated-traffic.html' title='Auto coordinated traffic'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-2901370854571773074</id><published>2010-03-09T22:43:00.002Z</published><updated>2010-03-09T22:47:06.498Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><category scheme='http://www.blogger.com/atom/ns#' term='release'/><title type='text'>ArgoUML 0.30 is out</title><content type='html'>&lt;p&gt;&lt;a href="http://argouml.tigris.org/"&gt;ArgoUML&lt;/a&gt; &lt;a href="http://argouml-downloads.tigris.org/argouml-0.30/"&gt;0.30&lt;/a&gt; is out.&lt;/p&gt;
&lt;p&gt;Happy modeling :-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-2901370854571773074?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/2901370854571773074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=2901370854571773074' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/2901370854571773074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/2901370854571773074'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/03/argouml-030-is-out.html' title='ArgoUML 0.30 is out'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-847722231184965672</id><published>2009-12-30T18:00:00.000Z</published><updated>2010-03-20T20:03:32.517Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='UML2'/><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><category scheme='http://www.blogger.com/atom/ns#' term='UML profile for C++'/><title type='text'>First experiments with ArgoUML's UML2 implementation</title><content type='html'>&lt;p&gt;To answer &lt;a href="http://argouml.tigris.org/ds/viewMessage.do?dsForumId=450&amp;dsMessageId=2426215&amp;orderBy=createDate&amp;orderType=desc" class="ligacao"&gt;Thomas' question regarding ditching *.profile file in ArgoUML persisted projects&lt;/a&gt;, I started experimenting with the UML2 implementation that is currently being worked on. The problem is that I don't know it well enough to understand if it is possible to do without the file, so, I thought, well, I should experiment with the implementation and start baby stepping the ArgoUML UML Profile for C++ and the C++ module in the path to be UML2 capable.&lt;/p&gt;&lt;p&gt;But, here comes the pain of experimenting with a not production ready implementation &amp;ndash; the persistence of the introduced profile projects isn't working correctly for me. Basically, it isn't loading correctly profiles which were persisted. Not so basically, when you load a *.zargo file which model (*.xmi file contained) is a profile, the case is handled exceptionally, but, correctly in &lt;code&gt;org.argouml.persistence.UmlFilePersister.doLoad(File, File, ProgressMgr)&lt;/code&gt; (see &lt;a href="http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/persistence/UmlFilePersister.java?view=markup" class="ligacao"&gt;UmlFilePersister.java:388&lt;/a&gt;). But, then, contrary to what I would expect, the &lt;code&gt;org.argouml.persistence.ModelMemberFilePersister.readModels(InputSource)&lt;/code&gt; (see &lt;a href="http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/persistence/ModelMemberFilePersister.java?view=markup" class="ligacao"&gt;ModelMemberFilePersister.java:258&lt;/a&gt;), fails to get hold of a list of UML elements with some contents.&lt;/p&gt;&lt;pre&gt;
XMI format error : org.argouml.model.UmlException: java.io.IOException: Tag uml:Profile not found
If this file was produced by a tool other than ArgoUML, please
check to make sure that the file is in a supported format, including
both UML and XMI versions.

If you believe that the file is legal UML/XMI and should have loaded
or if it was produced by any version of ArgoUML, please report
the problem as a bug by going to http://argouml.tigris.org/project_bugs.html.
 System Info:
ArgoUML version : PRE-0.29.4
Java Version : 1.6.0_16
Java Vendor : Sun Microsystems Inc.
Java Vendor URL : http://java.sun.com/
Java Home Directory : /usr/lib/jvm/java-6-sun-1.6.0.16/jre
Java Classpath : /home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-app/build-eclipse-tests:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-app/build-eclipse:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-core-infra/lib/log4j-1.2.6.jar:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-core-model/build-eclipse:/home/luis/programas/eclipse-ganymede/plugins/org.junit_3.8.2.v20080602-1318/junit.jar:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-app/lib/commons-logging-1.0.2.jar:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-app/lib/gef-0.13.1M3.jar:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-app/lib/ocl-argo-1.1.jar:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-app/lib/swidgets-0.1.4.jar:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-app/lib/toolbar-1.4.1-20071227.jar:/home/luis/programacao/ArgoUML/svnco/argouml/tools/lib/easymock12.jar:/home/luis/programacao/ArgoUML/svnco/argouml/tools/jdepend-2.9/lib/jdepend-2.9.jar:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-core-model-mdr/lib/jmi.jar:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-core-model-mdr/lib/jmiutils.jar:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-core-model-mdr/lib/mdrapi.jar:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-core-model-mdr/lib/mof.jar:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-core-model-mdr/lib/nbmdr.jar:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-core-model-mdr/lib/openide-util.jar:/argouml-core-tools/build-eclipse:/home/luis/programacao/ArgoUML/svnco/argouml/tools/junit-3.8.2/junit.jar:/home/luis/programacao/ArgoUML/svnco/argouml/tools/apache-ant-1.7.0/lib/ant.jar:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-app/lib/antlr-2.7.7.jar:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-core-model-euml/lib/emf/org.eclipse.emf.common_2.5.0.v200906151043.jar:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-core-model-euml/lib/emf/org.eclipse.emf.ecore_2.5.0.v200906151043.jar:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-core-model-euml/lib/emf/org.eclipse.emf.ecore.change_2.5.0.v200906151043.jar:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-core-model-euml/lib/emf/org.eclipse.emf.ecore.change.edit_2.5.0.v200906151043.jar:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-core-model-euml/lib/emf/org.eclipse.emf.ecore.edit_2.5.0.v200906151043.jar:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-core-model-euml/lib/emf/org.eclipse.emf.ecore.xmi_2.5.0.v200906151043.jar:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-core-model-euml/lib/emf/org.eclipse.emf.edit_2.5.0.v200906151043.jar:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-core-model-euml/lib/emf/org.eclipse.emf.mapping_2.5.0.v200906151043.jar:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-core-model-euml/lib/uml2/org.eclipse.uml2.common_1.5.0.v200905041045.jar:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-core-model-euml/lib/uml2/org.eclipse.uml2.common.edit_1.5.0.v200905041045.jar:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-core-model-euml/lib/uml2/org.eclipse.uml2.uml_3.0.1.v200908281330.jar:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-core-model-euml/lib/uml2/org.eclipse.uml2.uml.edit_3.0.0.v200905041045.jar:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-core-model-euml/lib/uml2/org.eclipse.uml2.uml.resources_3.0.0.v200906011111.jar:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-core-model-euml/lib/emf/org.eclipse.emf.mapping.ecore2xml_2.5.0.v200906151043.jar:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-core-model-euml/build-eclipse:/argouml-core-infra/bin:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-core-diagrams-sequence2/build-eclipse:/home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-core-umlpropertypanels/build-eclipse
Operation System : Linux, Version 2.6.29-1-netbook
Architecture : i386
User Name : luis
User Home Directory : /home/luis
Current Directory : /home/luis/programacao/ArgoUML/svnco/argouml/src/argouml-app
JVM Total Memory : 23228416
JVM Free Memory : 5806928


 Error occurred at : Wed Dec 30 08:05:01 WET 2009
Cause : org.argouml.model.UmlException: java.io.IOException: Tag uml:Profile not found
at org.argouml.model.euml.XmiReaderEUMLImpl.parse(XmiReaderEUMLImpl.java:162)
at org.argouml.persistence.ModelMemberFilePersister.readModels(ModelMemberFilePersister.java:258)
at org.argouml.persistence.ModelMemberFilePersister.load(ModelMemberFilePersister.java:112)
at org.argouml.persistence.UmlFilePersister.doLoad(UmlFilePersister.java:389)
at org.argouml.persistence.ZargoFilePersister.doLoad(ZargoFilePersister.java:240)
at org.argouml.ui.ProjectBrowser.loadProject(ProjectBrowser.java:1577)
at org.argouml.ui.LoadSwingWorker.construct(LoadSwingWorker.java:75)
at org.argouml.ui.SwingWorker.doConstruct(SwingWorker.java:139)
at org.argouml.ui.SwingWorker$2.run(SwingWorker.java:267)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.io.IOException: Tag uml:Profile not found
at org.argouml.persistence.XmlInputStream.realRead(XmlInputStream.java:378)
at org.argouml.persistence.XmlInputStream.skipToTag(XmlInputStream.java:226)
at org.argouml.persistence.XmlInputStream.read(XmlInputStream.java:136)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager$RewindableInputStream.read(XMLEntityManager.java:2933)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:739)
at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:186)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:771)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:395)
at org.eclipse.emf.ecore.xmi.impl.XMLLoadImpl.load(XMLLoadImpl.java:181)
at org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl.doLoad(XMLResourceImpl.java:180)
at org.eclipse.emf.ecore.resource.impl.ResourceImpl.load(ResourceImpl.java:1494)
at org.argouml.model.euml.XmiReaderEUMLImpl.parse(XmiReaderEUMLImpl.java:160)
... 9 more
-------
Full exception : org.argouml.persistence.XmiFormatException: org.argouml.model.UmlException: java.io.IOException: Tag uml:Profile not found
at org.argouml.persistence.ModelMemberFilePersister.readModels(ModelMemberFilePersister.java:287)
at org.argouml.persistence.ModelMemberFilePersister.load(ModelMemberFilePersister.java:112)
at org.argouml.persistence.UmlFilePersister.doLoad(UmlFilePersister.java:389)
at org.argouml.persistence.ZargoFilePersister.doLoad(ZargoFilePersister.java:240)
at org.argouml.ui.ProjectBrowser.loadProject(ProjectBrowser.java:1577)
at org.argouml.ui.LoadSwingWorker.construct(LoadSwingWorker.java:75)
at org.argouml.ui.SwingWorker.doConstruct(SwingWorker.java:139)
at org.argouml.ui.SwingWorker$2.run(SwingWorker.java:267)
at java.lang.Thread.run(Thread.java:619)
Caused by: org.argouml.model.UmlException: java.io.IOException: Tag uml:Profile not found
at org.argouml.model.euml.XmiReaderEUMLImpl.parse(XmiReaderEUMLImpl.java:162)
at org.argouml.persistence.ModelMemberFilePersister.readModels(ModelMemberFilePersister.java:258)
... 8 more
Caused by: java.io.IOException: Tag uml:Profile not found
at org.argouml.persistence.XmlInputStream.realRead(XmlInputStream.java:378)
at org.argouml.persistence.XmlInputStream.skipToTag(XmlInputStream.java:226)
at org.argouml.persistence.XmlInputStream.read(XmlInputStream.java:136)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager$RewindableInputStream.read(XMLEntityManager.java:2933)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:739)
at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:186)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:771)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:395)
at org.eclipse.emf.ecore.xmi.impl.XMLLoadImpl.load(XMLLoadImpl.java:181)
at org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl.doLoad(XMLResourceImpl.java:180)
at org.eclipse.emf.ecore.resource.impl.ResourceImpl.load(ResourceImpl.java:1494)
at org.argouml.model.euml.XmiReaderEUMLImpl.parse(XmiReaderEUMLImpl.java:160)
... 9 more
&lt;/pre&gt;&lt;p&gt;I wanted to prepare a UML2 compatible UML profile for C++ to test that we may live without the *.profile files. But, to make this I can't create it from scratch, I need something like a UML1.4 profile to UML2.x profile conversion. Lets try to do it manually...&lt;/p&gt;&lt;p&gt;Using Emacs, I opened my test profile made with ArgoUML UML2 (&lt;code&gt;MyUML2Profile.xmi&lt;/code&gt;), the base UML2.2 profile of ArgoUML (&lt;a href="http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/profile/profiles/uml22/default-uml22.xmi?revision=17457&amp;view=markup" class="ligacao"&gt;&lt;code&gt;default-uml22.xmi&lt;/code&gt;&lt;/a&gt;), and the UML1.4 profile for C++ (&lt;a href="http://argouml-cpp.tigris.org/source/browse/argouml-cpp/trunk/src/org/argouml/language/cpp/profile/CppUmlProfile.xmi?revision=274&amp;view=markup" class="ligacao"&gt;&lt;code&gt;CppUmlProfile.xmi&lt;/code&gt;&lt;/a&gt;). One thing I noticed is that the XMI format changed very much. Specifically, in the begin of the file, it is much more noisy. If you don't believe my word, check the following in &lt;code&gt;default-uml22.xmi&lt;/code&gt;:&lt;/p&gt;&lt;ul&gt;   &lt;li&gt;What the heck is the &lt;em&gt;metaclassReference&lt;/em&gt; attribute and why does   it have so much noise?&lt;/li&gt;   &lt;li&gt;It is importing element by element many of the standard UML2.2 metamodel   elements.   It even does this in duplicate:   &lt;pre&gt;
  &amp;lt;elementImport xmi:type="uml:ElementImport" xmi:id="_pGIiAMosEd6otN4YcPG1_w" importingNamespace="_PB5O8MoqEd6otN4YcPG1_w"&amp;gt;
    &amp;lt;importedElement xmi:type="uml:Class" href="http://schema.omg.org/spec/UML/2.2/uml.xml#Abstraction"/&amp;gt;
  &amp;lt;/elementImport&amp;gt;
  (...)
  &amp;lt;elementImport xmi:type="uml:ElementImport" xmi:id="_wcazEMosEd6otN4YcPG1_w" importingNamespace="_PB5O8MoqEd6otN4YcPG1_w"&amp;gt;
    &amp;lt;importedElement xmi:type="uml:Class" href="http://schema.omg.org/spec/UML/2.2/uml.xml#Abstraction"/&amp;gt;
  &amp;lt;/elementImport&amp;gt;
  &lt;/pre&gt;  Does this mean that you have to make this dance twice for it to work?!?&lt;/li&gt; &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-847722231184965672?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/847722231184965672/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=847722231184965672' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/847722231184965672'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/847722231184965672'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2010/03/first-experiments-with-argoumls-uml2.html' title='First experiments with ArgoUML&apos;s UML2 implementation'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-5897214266776858833</id><published>2009-12-05T17:21:00.004Z</published><updated>2009-12-05T17:35:01.843Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><category scheme='http://www.blogger.com/atom/ns#' term='profiles subsystem'/><category scheme='http://www.blogger.com/atom/ns#' term='UML'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>Design of the ArgoUML's projects recovery tool</title><content type='html'>&lt;p&gt;I was starting to try to hack my way to implement the ArgoUML's projects recovery tool which I proposed in &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=5862" class="ligacao"&gt;issue 5862: Support for moved/renamed/merged profiles&lt;/a&gt; when I started to hesitate on what to do. So, I did the right thing, went to &lt;a href="" class="ligacao"&gt;ArgoUML 0.28.1&lt;/a&gt; and started a lightweight design session.&lt;/p&gt;&lt;p&gt;I decided that the tool should exist as a sub-project of ArgoUML core. For now its use case(s) is very simple:&lt;/p&gt;&lt;p class="figura"&gt;&lt;img src="http://www.fileden.com/files/2008/4/5/1853347/picture-9-recovery-use-cases.png" width="683" height="249" alt="ArgoUML's projects recovery tool use cases."&gt;&lt;/p&gt;&lt;p class="legendaFigura"&gt;&lt;a name="picture-9-recovery-use-cases"&gt;&lt;em&gt;Picture 9&lt;/em&gt;&lt;/a&gt; &amp;ndash; ArgoUML's projects recovery tool use cases.&lt;/p&gt;&lt;p&gt;This is a high level view of the static structure I arrived:&lt;/p&gt;&lt;p class="figura"&gt;&lt;img src="http://www.fileden.com/files/2008/4/5/1853347/picture-10-recovery-core-static-structure.png" width="775" height="324" alt="ArgoUML's projects recovery tool core high level static structure."&gt;&lt;/p&gt;&lt;p class="legendaFigura"&gt;&lt;a name="picture-10-recovery-core-static-structure"&gt;&lt;em&gt;Picture 10&lt;/em&gt;&lt;/a&gt; &amp;ndash; ArgoUML's projects recovery tool core high level static structure.&lt;/p&gt;&lt;p&gt;This is the activity diagram for it:&lt;/p&gt;&lt;p class="figura"&gt;&lt;img src="http://www.fileden.com/files/2008/4/5/1853347/picture-11-recovery-happy-path-activity-diagram.png" width="452" height="809" alt="ArgoUML's projects recovery tool core happy path activity diagram."&gt;&lt;/p&gt;&lt;p class="legendaFigura"&gt;&lt;a name="picture-11-recovery-happy-path-activity-diagram"&gt;&lt;em&gt;Picture 11&lt;/em&gt;&lt;/a&gt; &amp;ndash; ArgoUML's projects recovery tool happy path activity diagram.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-5897214266776858833?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/5897214266776858833/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=5897214266776858833' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/5897214266776858833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/5897214266776858833'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2009/12/design-of-argoumls-projects-recovery.html' title='Design of the ArgoUML&apos;s projects recovery tool'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-3321740868874311196</id><published>2009-12-05T17:03:00.002Z</published><updated>2009-12-05T17:37:00.712Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='notes'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='michaelfeathers'/><title type='text'>Design sence – deep lessons in software design by Michael Feathers</title><content type='html'>&lt;p&gt;I watched &lt;a href="http://michaelfeathers.typepad.com/" class="ligacao"&gt;Michael Feathers&lt;/a&gt;' &lt;a href="http://www.viddler.com/explore/RoyOsherove/videos/9/" class="ligacao"&gt;talk Design sence &amp;ndash; deep lessons in software design&lt;/a&gt;, and I what follows are my notes for future reference.&lt;/p&gt;&lt;ul&gt;   &lt;li&gt;Software normally has a characteristc of being driven by power laws.   &lt;ul&gt;     &lt;li&gt;The shape of java &amp;ndash; research project that studies the source of     both open source proprietary projects in Java.&lt;/li&gt;   &lt;/ul&gt;&lt;/li&gt;&lt;br&gt;   &lt;li&gt;Everything is an object or may be considered as such.   &lt;ul&gt;     &lt;li&gt;Smaltalk &amp;ndash; everything is actually and object.&lt;/li&gt;     &lt;li&gt;Ruby &amp;ndash; it goes a long way into almost everything being objects.&lt;/li&gt;     &lt;li&gt;C and other procedural languages may be considered as object oriented if     you consider the whole program as an object.&lt;/li&gt;   &lt;/ul&gt;&lt;/li&gt;&lt;br&gt;   &lt;li&gt;A type is a set of values. Covariance and contravariance.&lt;/li&gt;   &lt;li&gt;You can't make software more correct with redundancy.&lt;/li&gt;   &lt;li&gt;Protection is a social problem and not a technical problem.&lt;/li&gt;   &lt;li&gt;There are no requirements. There is only design.&lt;/li&gt;     &lt;li&gt;Design by laundry list.&lt;/li&gt;   &lt;li&gt;Names are provisional.&lt;/li&gt;   &lt;li&gt;Physical architecture shapes logical architecture.&lt;/li&gt;   &lt;li&gt;Physical architecture can influence the kind of problems we are able to   solve.&lt;/li&gt;   &lt;li&gt;Conway's law.&lt;/li&gt;   &lt;li&gt;You can finess error handling with good design.&lt;/li&gt;   &lt;li&gt;Error policy is as important as the main line.&lt;/li&gt;   &lt;ul&gt;     &lt;li&gt;Keep errors at the boundaries or handle errors at the boundaries of the     system.&lt;/li&gt;     &lt;li&gt;Null object pattern.&lt;/li&gt;   &lt;/ul&gt;&lt;/li&gt;   &lt;li&gt;Logging is a first class design consideration.&lt;/li&gt;   &lt;li&gt;Databases are good for more than storing data.&lt;/li&gt;   &lt;li&gt;Objects want to be asynchronous.&lt;/li&gt; &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-3321740868874311196?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/3321740868874311196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=3321740868874311196' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/3321740868874311196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/3321740868874311196'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2009/12/design-sence-deep-lessons-in-software.html' title='Design sence &amp;ndash; deep lessons in software design by Michael Feathers'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-1496092190605851310</id><published>2009-11-20T23:12:00.001Z</published><updated>2009-11-20T23:15:13.349Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><category scheme='http://www.blogger.com/atom/ns#' term='profiles subsystem'/><category scheme='http://www.blogger.com/atom/ns#' term='UML profile for C++'/><title type='text'>UML profiles management issues</title><content type='html'>&lt;p&gt;I'm currently handling two issues related to ArgoUML management of profiles:&lt;/p&gt;&lt;ul&gt;   &lt;li&gt;&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=5041" class="ligacao"&gt;Issue   5041: provide core profiles via the website&lt;/a&gt;   &amp;ndash; finished this today, by verifying that ArgoUML 0.28.1 was working as   expected in that it correctly retrieves the profiles from the URL when it   can't resolve them locally, and by placing the C++ UML profile available in   the ArgoUML C++ module web site.&lt;/li&gt;   &lt;li&gt;&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=5862" class="ligacao"&gt;Issue   5862: Support for moved/renamed/merged profiles&lt;/a&gt;   &amp;ndash; This issue contains a large body of work and I expect that it will   keep me entertained for a while.&lt;/li&gt; &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-1496092190605851310?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/1496092190605851310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=1496092190605851310' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/1496092190605851310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/1496092190605851310'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2009/11/uml-profiles-management-issues.html' title='UML profiles management issues'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-2452765111813614023</id><published>2009-11-16T23:50:00.000Z</published><updated>2009-11-16T23:52:13.893Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='common lisp'/><title type='text'>Other software ideas</title><content type='html'>&lt;p&gt;These aren't related to ArgoUML, but, since they are strongly related to software, they'll be registered here.&lt;/p&gt;&lt;h4&gt;&lt;a name="emacs-list-unit" class="ancora"&gt;Emacs Lisp Unit&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Build a unit test framework for Emacs Lisp and with that learn more about Emacs Lisp. Upsss, there is already &lt;a href="http://www.emacswiki.org/emacs/ElUnit" class="ligacao"&gt;ElUnit&lt;/a&gt; and &lt;a href="http://dev.technomancy.us/Behave.el" class="ligacao"&gt;behave.el&lt;/a&gt;.&lt;/p&gt;&lt;h4&gt;&lt;a name="jnil-contrib" class="ancora"&gt;Contribute to jnil&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;a href="http://common-lisp.net/project/jnil/" class="ligacao"&gt;jnil&lt;/a&gt; is an open source project by a colleague from SISCOG, &lt;a href="http://cl-user.net/asp/persons/tiago-maduro-dias"&gt;Tiago Maduro Dias&lt;/a&gt;. Initially I wanted to join some open source Common Lisp project and the prospect of being able to pair program an open source project with a more experienced Common Lisp developer was very interesting. Unfortunately, I didn't want to leave ArgoUML without reaching a feeling of closure, so, I never joined. It is still an interesting idea...&lt;/p&gt;&lt;h4&gt;&lt;a name="genetic-programming-based-cl-condition-system-00" class="ancora"&gt;Genetic programming based in the Common Lisp Condition System&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Since I read about the idea of evolving software with &lt;a href="http://en.wikipedia.org/wiki/Genetic_algorithm"&gt;genetic algorithms&lt;/a&gt;, I was fascinated by it. When I really learned about the &lt;a href="http://gigamonkeys.com/book/beyond-exception-handling-conditions-and-restarts.html"&gt;Common Lisp Condition System&lt;/a&gt; and its capability to offer restarts I wandered if it would be possible to combine the two to provide a way to avoid the need to have mutations to generate correct Common Lisp. It might be a good way to make safe boundaries between mutated code and stable code, to avoid infinite loops, deadlocks, etc.&lt;/p&gt;&lt;h4&gt;&lt;a name="fitness-cl" class="ancora"&gt;FitNess Common Lisp adapter&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Create an adapter for Common Lisp for &lt;a href="http://fitnesse.org/" class="ligacao"&gt;FitNess&lt;/a&gt;, to enable using this acceptance test framework in Common Lisp projects. With &lt;a href="http://common-lisp.net/project/armedbear/" class="ligacao"&gt;ABCL&lt;/a&gt; maturing very fast and being well supported, I wonder if this would be difficult at all.&lt;/p&gt;&lt;h4&gt;&lt;a name="learn-clojure" class="ancora"&gt;Learn Clojure&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Give myself some time to learn &lt;a href="http://clojure.org" class="ligacao"&gt;Clojure&lt;/a&gt;.&lt;/p&gt;&lt;h4&gt;&lt;a name="develop-absences-planer-in-gae" class="ancora"&gt;Develop organization absences planer in Google App Engine&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;The process(es) that organizations normally use to plan their collaborators vacations and absences are usually document driven and the verifications and checks of accordance with the rules and legislation manual. I suffer from this at SISCOG and in SIEMENS, although it wasn't document based, it lacked considering the organization needs, like to have a minimum number of persons in a certain development team available at all times in a year. It didn't considered previous history, like a certain person always not getting his vacations in the Christmas season while others always get them.&lt;/p&gt;&lt;p&gt;It would be a perfect opportunity to learn web development techniques in a restrained platform such as &lt;a href="http://code.google.com/appengine/" class="ligacao"&gt;Google App Engine&lt;/a&gt;, but, possibly using a JVM based language, such as &lt;a href="http://clojure.org" class="ligacao"&gt;Clojure&lt;/a&gt; or &lt;a href="http://www.jython.org" class="ligacao"&gt;Jython&lt;/a&gt;. I wanted also to show this at SISCOG, to have a demo-able example of a Cloud based application, which someday SISCOG may want to try with more commercial purposes...&lt;/p&gt;&lt;h4&gt;&lt;a name="online-git-repos" class="ancora"&gt;Online git repositories&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;I started using &lt;a href="http://en.wikipedia.org/wiki/Revision_control#Distributed_revision_control" class="ligacao"&gt;distributed revision control systems (DRCS)&lt;/a&gt; a while ago, first with &lt;a href="http://www.selenic.com/mercurial/wiki/" class="ligacao"&gt;mercurial (hg)&lt;/a&gt;, then with &lt;a href="http://git-scm.com/" class="ligacao"&gt;Git&lt;/a&gt;, when my ex-colleague &lt;a href="http://www.linkedin.com/in/tomweissmann" class="ligacao"&gt;Tom Schutzer-Weissmann&lt;/a&gt; created a system to import the SISCOG repositories from the in-house defined format (CRM/CRI) into Git. Currently the Git repositories are being used by several persons in SISCOG, but, I still haven't been able to proceed with the work enough to consider the proposal of a switch or a pilot.&lt;/p&gt;&lt;p&gt;Currently I'm more familiar with Git, but, my problem is that I'm not cooperating online using one of these DRCSs. So, I wanted to setup a &lt;a href="http://github.com/" class="ligacao"&gt;GitHub&lt;/a&gt; account and move in there some of my repositories and potentially host there a fork of ArgoUML. By having a Git based ArgoUML fork, I would have a much easier life in working offline with contributions and a much nicer sandbox to experiment ideas and patches. This I know for sure, because I have been using the branching features of Git in SISCOG for some time with a huge success and satisfaction.&lt;/p&gt;&lt;h4&gt;&lt;a name="finish-reading-pcl" class="ancora"&gt;Finish reading Practical Common Lisp&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;I stopped reading &lt;a href="http://gigamonkeys.com/book/" class="ligacao"&gt;Practical Common Lisp&lt;/a&gt; in the &lt;a href="http://gigamonkeys.com/book/practical-a-spam-filter.html" class="ligacao"&gt;chapter 23. Practical: A Spam Filter&lt;/a&gt;. I should give myself some time to finish reading and exercising the book. While at it, I should buy a copy of it, since it is excellent and I would have something physical to borrow to newcomers at SISCOG.&lt;/p&gt;&lt;p&gt;Proceeding with ideas on books to read, &lt;a href="http://www.paulgraham.com/onlisp.html" class="ligacao"&gt;On Lisp, by Paul Graham&lt;/a&gt; is high on my Lisp related books and several others I placed in &lt;a href="http://www.amazon.co.uk/wishlist/T3XI6X99904B" class="ligacao"&gt;my Amazon wish lists&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-2452765111813614023?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/2452765111813614023/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=2452765111813614023' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/2452765111813614023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/2452765111813614023'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2009/11/other-software-ideas.html' title='Other software ideas'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-139280368294505024</id><published>2009-11-16T23:47:00.001Z</published><updated>2009-11-16T23:50:03.514Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><category scheme='http://www.blogger.com/atom/ns#' term='common lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><title type='text'>Two ideas related to ArgoUML</title><content type='html'>&lt;p&gt;Following with my write-up of ideas to avoid neurological garbage collection before delving into ArgoUML for some time, follows a list of ideas related to &lt;a href="http://argouml.tigris.org" class="ligacao"&gt;ArgoUML&lt;/a&gt;, in which I won't elaborate as much as in the &lt;a href="http://argonauts-life.blogspot.com/2009/11/medeia.html" class="ligacao"&gt;entry about medeia&lt;/a&gt;.&lt;/p&gt;&lt;h4&gt;&lt;a name="abstracter-00" class="ancora"&gt;abstracter&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;The idea is to register in the background decisions that the ArgoUML modeler does, so that we may deduce from his actions a set of steps that might be used to solve similar problems. This is similar to a refactoring system that my colleague Rui Patroc&amp;iacute;nio explained to me. This system, takes a set of programmer actions and may apply them to a similar problem upon a  programmer request.&lt;/p&gt;&lt;p&gt;This is called abstracter, because the goal would be to give such a tool the reverse engineering information from a software project and let it abstract away the details, creating easy to use diagrams and perspectives about the software. Kind-of something like pointing it to the &lt;a href="http://wiki.services.openoffice.org/wiki/Getting_It" class="ligacao"&gt;OpenOffice.org source&lt;/a&gt; and letting it create some meaningful abstractions of it. The part where it is learning or being corrected by a developer is interesting, because it would allow experimentation with machine learning principles...&lt;/p&gt;&lt;h4&gt;&lt;a name="argouml-lisp-00" class="ancora"&gt;ArgoUML Lisp module&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Implement a Lisp language module for ArgoUML. Probably this could have dialect specializations (Common Lisp, Scheme, Clojure, etc), but, have a reusable base. My idea is that this should be implemented in the specific languages and not in Java, in order to more easily receive contributions from developers that are primarily interested in the module.&lt;/p&gt;&lt;p&gt;Note: Rui Patroc&amp;iacute;nio referred a related project he was considering to do which is a static analyzer for Common Lisp so that it would be possible to support code browsing and refactoring.&lt;/p&gt;&lt;p&gt;The reverse engineering of Common Lisp, Scheme and Clojure should be based in the same communication protocol as the one used by SLIME, which allows things like running &lt;code&gt;APROPOS&lt;/code&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-139280368294505024?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/139280368294505024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=139280368294505024' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/139280368294505024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/139280368294505024'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2009/11/two-ideas-related-to-argouml.html' title='Two ideas related to ArgoUML'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-2182410509448416125</id><published>2009-11-15T21:44:00.002Z</published><updated>2009-11-15T21:55:48.890Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><category scheme='http://www.blogger.com/atom/ns#' term='medeia'/><title type='text'>medeia</title><content type='html'>&lt;p&gt;From all the ideas my idiot's head has had in the past few years, one has been buzzing very strongly and that is &lt;strong&gt;medeia&lt;/strong&gt;. The name &lt;a href="http://en.wikipedia.org/wiki/Medea" class="ligacao"&gt;Medea&lt;/a&gt; comes from the &lt;a href="http://en.wikipedia.org/wiki/Argonautica" class="ligacao"&gt;Argonautica book&lt;/a&gt;, so, it is related to ArgoUML and it is the name of a woman that helps the &lt;a href="http://en.wikipedia.org/wiki/Argonauts" class="ligacao"&gt;Argonauts&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Jason" class="ligacao"&gt;Jason&lt;/a&gt; in particular to get the &lt;a href="http://en.wikipedia.org/wiki/Golden_Fleece" class="ligacao"&gt;Golden Fleece&lt;/a&gt;. She knows one thing or two about magic and uses it. &lt;em&gt;&lt;a href="http://pt.wikipedia.org/wiki/Medeia" class="ligacao"&gt;Medeia&lt;/a&gt;&lt;/em&gt; is Medea in Portuguese related to mediate. Well, the name points a bit to what the idea is about...&lt;/p&gt;&lt;p&gt;medeia is a good name because it is similar to idea in Portuguese, which is written ideia.&lt;/p&gt;&lt;p&gt;As the responsible and main contributor to the &lt;a href="http://argouml-cpp.tigris.org/" class="ligacao"&gt;ArgoUML C++ module&lt;/a&gt;, in the past 5 years, I've seen that this &amp;ndash; making a language module &amp;ndash; is a hard task. There is a lot that must be considered to provide production ready code generator, reverse engineering, notation and round the horn language module(s). Normally the effort is single handed and when you reach the end, there will always be loopholes and needs to extend it. But the worst part is how much of reinventing the wheel goes into it. Lets put the things in a clear way, by enumerating each part of a typical language support module:&lt;/p&gt;&lt;ul&gt;   &lt;li&gt;&lt;a name="uml-profile-4-lang" class="ancora"&gt;UML Profile for the language&lt;/a&gt;:   &lt;ul&gt;     &lt;li&gt;You need a core language profile with stereotypes that may be used for     tagging UML model elements, in order to apply tagged values to the model     elements.&lt;/li&gt;     &lt;li&gt;To use the profile in a programmatic way you need some wrapping classes,     such as the class     &lt;code&gt;&lt;a href="http://argouml-cpp.tigris.org/source/browse/argouml-cpp/trunk/src/org/argouml/language/cpp/profile/ProfileCpp.java?view=markup" class="ligacao"&gt;ProfileCpp&lt;/a&gt;&lt;/code&gt;     in the C++ module.&lt;/li&gt;     &lt;li&gt;Potentially you would also want to place in the module UML profiles for     libraries that are used in plenty of projects that use the language &amp;ndash;     in the case of C++ we may have     &lt;a href="http://www.boost.org/" class="ligacao"&gt;boost&lt;/a&gt;.&lt;/li&gt;&lt;br&gt;   &lt;/ul&gt;&lt;/li&gt;     &lt;li&gt;&lt;a name="generator-4-lang" class="ancora"&gt;Language generator&lt;/a&gt;:   &lt;ul&gt;     &lt;li&gt;Use of a template engine for formatting the generated code.     (For an example see     &lt;a href="http://www.stringtemplate.org/" class="ligacao"&gt;StringTemplate&lt;/a&gt;.)&lt;/li&gt;     &lt;li&gt;A code generator, which maps the UML model into an     &lt;a href="http://en.wikipedia.org/wiki/Abstract_syntax_tree" class="ligacao"&gt;Abstract     Syntax Tree (AST)&lt;/a&gt;     which would be handed over to the template engine.&lt;/li&gt;     &lt;li&gt;A way not to trash the code that already exist, like the     &lt;a href="http://argouml-cpp.tigris.org/source/browse/argouml-cpp/trunk/src/org/argouml/language/cpp/generator/Section.java?view=markup" class="ligacao"&gt;current protected sections&lt;/a&gt;     in the C++ generator.&lt;/li&gt;     &lt;li&gt;Some form of mapping the documentation in the UML model into the     language standard(s) format(s).     And you need this to be customizable because projects typically develop     specific variants of the documentation standards or there is some company     standard that they must use.     I would say that this fits more or less in the same problem/solution as the code     generator being made by two parts &amp;ndash; a mapping from UML to an AST and     a template engine which is fed by the AST &amp;ndash; but, I think that here     there might be more needs for giving customization options for enhancing     the AST generator.&lt;/li&gt;     &lt;li&gt;Potentially there is the need to create code from specific UML diagrams     or the model elements beneath specific diagrams.     For instance, generating the classes that implement the     &lt;a href="http://en.wikipedia.org/wiki/State_pattern" class="ligacao"&gt;state     design pattern&lt;/a&gt; for a     &lt;a href="http://en.wikipedia.org/wiki/Finite-state_machine" class="ligacao"&gt;state     machine&lt;/a&gt;     (check also     &lt;a href="http://www.objectmentor.com/resources/articles/umlfsm.pdf" class="ligacao"&gt;this     nice article by Robert C. Martin (aka Uncle Bob) on finite state machines     and UML&lt;/a&gt;.&lt;br&gt;     As a side note, you may not need to do this if you use the     &lt;a href="http://argouml-pattern-wizard.tigris.org/" class="ligacao"&gt;ArgoUML     Pattern-Wizard module&lt;/a&gt;.&lt;/li&gt;&lt;br&gt;   &lt;/ul&gt;&lt;/li&gt;     &lt;li&gt;&lt;a name="reveng-4-lang" class="ancora"&gt;Language reverse engineering&lt;/a&gt;:   &lt;ul&gt;     &lt;li&gt;There must be a     &lt;a href="http://en.wikipedia.org/wiki/Formal_grammar" class="ligacao"&gt;language     grammar&lt;/a&gt;,     typically, in ArgoUML, this is based in     &lt;a href="http://www.antlr.org/" class="ligacao"&gt;ANTLR&lt;/a&gt;     and it is common that there     &lt;a href="http://www.antlr.org/grammar/list" class="ligacao"&gt;is something     for your target language&lt;/a&gt;.&lt;/li&gt;     &lt;li&gt;With the language grammar you can generate a     Parser,     it might even be possible that an     AST walker is generated for you, but, your mileage may vary and the     available Parser and AST walker might not be fully customized to your needs.     For instance, I was capable of     &lt;a href="http://argonauts-life.blogspot.com/2005/01/c-reveng-exploring-and-analyzing.html" class="ligacao"&gt;getting a ANTLR C++     grammar ported to Java&lt;/a&gt;,     but,     &lt;a href="http://argonauts-life.blogspot.com/2005/03/half-way-to-drop-1.html" class="ligacao"&gt;this wasn't prepared to     make an AST&lt;/a&gt;     and I failed to change it into one.     &lt;a href="http://argonauts-life.blogspot.com/2005/04/fixing-grammar-ii.html" class="ligacao"&gt;It has some bugs&lt;/a&gt;     which up-to-now     &lt;a href="http://argouml-cpp.tigris.org/source/browse/argouml-cpp/trunk/tests/org/argouml/language/cpp/reveng/TestCppGrammar.java?view=markup" class="ligacao"&gt;I didn't solve&lt;/a&gt;.     Finally, I'm the one that must keep it evolving with the original grammar     which was made for C++.     Even the original grammar is now unsupported, which is problematic with the     evolution of the C++ standard to C++ 0x.&lt;/li&gt;     &lt;li&gt;Even with the AST walker there is the need to perform the mapping from     language constructs to UML model elements.     This mapping must be performed in a way that doesn't create duplicated     model elements when the same source files are imported multiple times.&lt;/li&gt;     &lt;li&gt;The grammars are normally created for blue sky situations where you have     all the information, the source code is well formed, etc, etc.     The reality is that the reverse engineering modules must be designed to     handle malformed sources and work with incomplete information &amp;ndash; i.e.,     partial imports.&lt;/li&gt;     &lt;li&gt;In C++ you need a     &lt;a href="http://en.wikipedia.org/wiki/C_preprocessor" class="ligacao"&gt;C preprocessor&lt;/a&gt;.     Fortunately there is     &lt;a href="http://www.anarres.org/projects/jcpp/" class="ligacao"&gt;one open     source C preprocessor implemented in Java&lt;/a&gt;     which the C++ module now uses.&lt;/li&gt;     &lt;li&gt;Users normally aren't satisfied by simple import and they normally want     that the reverse engineering creates some simple UML diagrams from code.     The Java module has this.&lt;/li&gt;     &lt;li&gt;Finally, the killer feature of a UML reverse engineering module is for     a user to point it to a build definition file &amp;ndash; for instance a     &lt;a href="http://en.wikipedia.org/wiki/Make_(software)" class="ligacao"&gt;make&lt;/a&gt;     file for C++ or an     &lt;a href="http://ant.apache.org/" class="ligacao"&gt;Ant&lt;/a&gt;     &lt;code&gt;build.xml&lt;/code&gt; file &amp;ndash; and the reverse engineering module would     interpret it and import the underlying project fully into a UML model.&lt;/li&gt;&lt;br&gt;   &lt;/ul&gt;&lt;/li&gt;     &lt;li&gt;&lt;a name="notations-4-lang" class="ancora"&gt;Language notation&lt;/a&gt; &amp;ndash;   this enables the user to edit UML with the language notation.   &lt;ul&gt;     &lt;li&gt;There is a simple way to create a read-only notation for the language,     which is basically to use the code generator in a partial way.     That is what the C++ module does in     &lt;a href="http://argouml-cpp.tigris.org/source/browse/argouml-cpp/trunk/src/org/argouml/language/cpp/notation/" class="ligacao"&gt;the notation package&lt;/a&gt;.&lt;/li&gt;     &lt;li&gt;The complex part is to create a parser for the notation.     The best example is to check     &lt;a href="http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/notation/providers/uml/" class="ligacao"&gt;the parser that Michiel van der Wulp developed for UML notation&lt;/a&gt;.     Neither C++ nor Java have a notation parser.     If there is such a parser for the language notation it would enable fully     editable UML models in the programming language.&lt;/li&gt;&lt;br&gt;   &lt;/ul&gt;&lt;/li&gt;     &lt;li&gt;&lt;a name="round-the-horn-engineering-4-lang" class="ancora"&gt;Round the horn   engineering for the language&lt;/a&gt;.   &lt;ul&gt;     &lt;li&gt;This is the &lt;em&gt;Lucy in the sky with diamonds&lt;/em&gt; scenario.     You edit the model and say update code and the code is magically updated     without trashing the existing code and potentially adapting the dependent     code to the changes you made.     Even better, it would understand enough of the build definition to add new     files to it or remove unused ones.&lt;br&gt;     My knowledge about tools that support this is that     &lt;a href="http://www.borland.com/us/products/together/index.html" class="ligacao"&gt;Together&lt;/a&gt;     did a good job and that     &lt;a href="http://www.ibm.com/software/awdtools/developer/rose/" class="ligacao"&gt;Rational     Rose for M$ VC++&lt;/a&gt;     did a bad job at it.     It is a long time since I tried tools such as these in a professional     setting.&lt;/li&gt;&lt;br&gt;   &lt;/ul&gt;&lt;/li&gt;     &lt;li&gt;&lt;a name="settings-ui-4-lang" class="ancora"&gt;Language module settings user   interface&lt;/a&gt; &amp;ndash; finally, for each of these things you need to consider how the   user is going to interact with it and configure it to his needs.   &lt;ul&gt;     &lt;li&gt;A nice GUI for some things, like the generator options concerning the     mapping from UML model elements into the language constructs (e.g., see     &lt;code&gt;&lt;a href="http://argouml-cpp.tigris.org/source/browse/argouml-cpp/trunk/src/org/argouml/language/cpp/ui/SettingsTabCpp.java?view=markup" class="ligacao"&gt;SettingsTabCpp&lt;/a&gt;&lt;/code&gt;,     but, this has some mixture of several parts of the generator).&lt;/li&gt;     &lt;li&gt;The reverse engineering also has a GUI which is placed in the dialog     that is shown to the user when importing code.     Currently the C++ reverse engineering module has no such GUI, but, you can     see an example in the Java module &amp;ndash;     &lt;code&gt;&lt;a href="http://argouml-java.tigris.org/source/browse/argouml-java/trunk/src/org/argouml/language/java/reveng/JavaImportSettings.java?view=markup" class="ligacao"&gt;JavaImportSettings&lt;/a&gt;&lt;/code&gt;.&lt;/li&gt;     &lt;li&gt;Then there are parts of the UI that may have the form of a template     file, but, this is UI and, as such, the template engine must deal with     the potential errors introduced by changes the users did.&lt;/li&gt;     &lt;li&gt;All of this and more must somehow be documented in the user manual,     which potentially is translated into other languages...&lt;/li&gt;   &lt;/ul&gt;&lt;/li&gt; &lt;/ul&gt;&lt;h4&gt;&lt;a name="medeia-00-description" class="ancora"&gt;Description of medeia&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;So, enough of complaining myself about the fun, but, hard and difficult to finish work of developing language support for ArgoUML in the classic way. Lets now delve into what medeia is!&lt;/p&gt;&lt;p&gt;The medeia idea came to me a long time ago, but, in a gradual way. First I thought about a different solution to develop the reveng C++ module, which was to base it in the &lt;a href="http://argonauts-life.blogspot.com/2005/01/analysis-of-solution-continued.html#different_alternative_4_cpp_parsing_n_more" class="ligacao"&gt;reuse of libraries made by the Eclipse CDT project&lt;/a&gt;. Then, the obvious stroke my mind and I thought of this as a potential solution for several other language modules, just as the Eclipse guys add support for more and more languages, the ArgoUML could grab it and reuse it. Recently, with the evolution of polyglot software development and the dynamic language boom, both &lt;a href="http://eclipse.org/" class="ligacao"&gt;Eclipse&lt;/a&gt; and &lt;a href="http://netbeans.org/" class="ligacao"&gt;NetBeans&lt;/a&gt; are adding support for multiple and interesting languages.&lt;/p&gt;&lt;p&gt;Then, with the &lt;a href="http://argoeclipse.tigris.org/" class="ligacao"&gt;Argoeclipse project&lt;/a&gt;, I thought that this would be a perfect opportunity to revisit this, but, instead of reusing libraries by placing them in the ArgoUML modules, we could just mediate the things that the existing Eclipse environment knows about the projects the  user has in his Eclipse workspace and map those into ArgoUML and back, reusing for this the whole infrastructure that Eclipse has. Note that this is also  possible for an eventual Argonetbeans.&lt;/p&gt;&lt;p&gt;Finally, while working at SISCOG and understanding the way &lt;a href="http://www.gnu.org/software/emacs/" class="ligacao"&gt;Emacs&lt;/a&gt; connects via &lt;a href="http://common-lisp.net/project/slime/" class="ligacao"&gt;SLIME&lt;/a&gt; or &lt;a href="http://www.franz.com/support/documentation/current/doc/eli.htm" class="ligacao"&gt;ELI&lt;/a&gt; to a live &lt;a href="http://en.wikipedia.org/wiki/Lisp_(programming_language)" class="ligacao"&gt;Lisp&lt;/a&gt; and how that enables you to discover on a live and fully consistent software program about its static structure, I came to the conclusion that medeia could be a bit different for languages that have reflexion built-in (Java included)! You just need to place a little piece of software within the program you want to know about and inquire it from the ArgoUML side. No need to parse source files, understand build systems, etc, etc. Well, you still have some work for generating code and to provide a language notation, but, the medeia idea solves a large part of the problem of reverse engineering modules for a language. It creates some new, though...&lt;/p&gt;&lt;table border="3" cellpadding="2" cellspacing="2" width="80%"&gt;   &lt;tr&gt;     &lt;th&gt;Classical reveng module&lt;/th&gt;     &lt;th&gt;medeia reveng module&lt;/th&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;Language grammar, AST walker, parser, etc&lt;/td&gt;     &lt;td&gt;Interface with the IDE (for languages that don't have powerful enough reflexion facilities, such as C++, C, Fortran and etc) or with the live program (for languages that do have such reflexion facilities), that communicates with the ArgoUML module or with Argoeclipse or with Argonetbeans or with Argowhatever.&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;Mapping from language to UML.&lt;/td&gt;     &lt;td&gt;Ditto, also needed here.&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;Robust software to deal with incomplete information or malformed source     code.&lt;/td&gt;     &lt;td&gt;Software that must support some way to filter the information that     matters, maybe by allowing the user to specify that the import must be from     specific packages or / and by allowing to get the information by specifying     incomplete names &amp;ndash; similar to IDEs' find type.&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;C preprocessor or similar things, largely dependent on language quirks.&lt;/td&gt;     &lt;td&gt;Nothing like that needed on this side, thanks :-)&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;UML diagrams auto-magically created by the import sources process.&lt;/td&gt;     &lt;td&gt;Ditto in here too, but, with the difference that probably the user might     need to ask for diagram creation and update or offer some settings and try     to do the correct action for different user actions.&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td&gt;Understanding build definitions to import full projects with the minimum     work by the user.&lt;/td&gt;     &lt;td&gt;No need for this just for reverse engineering, but, in complex     multiple-project scenarios, maybe the users want that the correct UML     elements go into the correct UML models...     The filtering described above might be a good way for certain languages, but,     for languages that simply support namespaces or that are used in a flat     package way, like Lisp, this wouldn't work so nicely.&lt;/td&gt;   &lt;/tr&gt; &lt;/table&gt;&lt;p&gt;Do you like this idea? Have you seen it applied to other UML tools or to solve similar problems? I recall that this is already used in the context of Emacs and Lisp / Scheme / &lt;a href="http://clojure.org/" class="ligacao"&gt;Clojure&lt;/a&gt;, with the SLIME project or others similar to it. But for a UML tool you normally go the way of the classical reverse engineering design described above. Well, maybe Together worked this way when integrated within Eclipse...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-2182410509448416125?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/2182410509448416125/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=2182410509448416125' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/2182410509448416125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/2182410509448416125'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2009/11/medeia.html' title='medeia'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-5484559635623996860</id><published>2009-11-04T22:58:00.003Z</published><updated>2009-11-04T23:31:06.296Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><title type='text'>Dispersion problem – why am I contributing so little to ArgoUML?...</title><content type='html'>&lt;p&gt;At &lt;a href="http://www.siscog.pt/" class="ligacao"&gt;SISCOG&lt;/a&gt; some of the employees – I included – attended a leadership workshop that lasted 3 days and was distributed by February, March and April of 2009. It was very interesting and useful for the development of my soft skills, which I need as part of my role as a team leader. The person giving the workshop was Teresa Roseta of MQI, whom I strongly recommend. SISCOG developed the leadership principles and values in the workshop.&lt;/p&gt;&lt;p&gt;One of the things that was referred there was the need for a person to know himself better. This because it seams that normally good, natural leaders do know themselves very well. One exercise we did for each of us was our professional &lt;a href="http://en.wikipedia.org/wiki/Coat_of_Arms" class="ligacao"&gt;coat of arms&lt;/a&gt;. It is a bit like a personal &lt;a href="http://en.wikipedia.org/wiki/SWOT_analysis" class="ligacao"&gt;SWOT analysis&lt;/a&gt;, but, the idea was to minimize the number of things that go into each quadrant and to have a middle row with your motto. The things that go into the quadrants are different too. To make a long story short here is my professional coat of arms (the words in &lt;em&gt;[emphasis]&lt;/em&gt; are just legends for the contents):&lt;/p&gt;&lt;table border="3" cellpadding="2" cellspacing="2" width="50%"&gt;  &lt;tbody&gt;    &lt;tr align="center"&gt;      &lt;td&gt;&lt;em&gt;[Strength]&lt;/em&gt; easy learning and appreciation for knowledge&lt;/td&gt;      &lt;td&gt;&lt;em&gt;[Dream]&lt;/em&gt; to fulfill one or more remarkable ideas (hint: MEDEIA)&lt;/td&gt;    &lt;/tr&gt;    &lt;tr align="center"&gt;      &lt;td colspan="2" rowspan="1"&gt;&lt;em&gt;[Motto]&lt;/em&gt; do things right (i.e., well/correctly)&lt;/td&gt;    &lt;/tr&gt;    &lt;tr align="center"&gt;      &lt;td&gt;&lt;em&gt;[Vulnerability]&lt;/em&gt; dispersion&lt;/td&gt;      &lt;td&gt;&lt;em&gt;[Facilitator]&lt;/em&gt; persistence&lt;/td&gt;    &lt;/tr&gt;  &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;My vulnerability is dispersion. This causes some problems for my average rate of contributions for anything that isn't my primary activity and currently for my contributions to ArgoUML, which are too few and too slow. &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=5864" class="ligacao"&gt;Issue 5864&lt;/a&gt; illustrates this. I was given a patch, so, I looked into it and thought, OK, lets help this person scratch his hitch and maybe ArgoUML can get a new developer aboard. Then a difficulty came and I feared that it was something that was related to a part of the code that I never delved into and I placed it on hold until I had enough energy for it. But, in the meantime I had enough energy to do a &lt;a href="http://argonauts-life.blogspot.com/2009/10/solution-for-programming-praxis.html" class="ligacao"&gt;Programming Praxis problem&lt;/a&gt;, to start developing a &lt;a href="http://argonauts-life.blogspot.com/2007/04/improving-usability-of-htmled.html" class="ligacao"&gt;friendly user interface for htmled&lt;/a&gt;, to start a crazy attempt to update all the software in my old Windows XP laptop and to investigate the possibility to move some personal &lt;a href="http://subversion.tigris.org/" class="ligacao"&gt;Subversion&lt;/a&gt; repositories into &lt;a href="http://git-scm.com/" class="ligacao"&gt;Git&lt;/a&gt;! At least these are the significant things I remember about between 7th and 30th of October. Why didn't I finished the thing I started in the first place? Dispersion!&lt;/p&gt;&lt;p&gt;I disperse because I'm the kind of person that loves to learn and I have lots of ideas. These ideas are all very interesting for me, but, they take some time to look into, develop and document. They are mostly related to software development, but, they don't intersect as much as possible for them to be developed together or in order for some parts to add to the others. So, these things start conflicting with each other and I don't get much done of anything unless at my work, where I managed to finish some significant things.&lt;/p&gt;&lt;p&gt;I like ArgoUML. The developers there aren't the greatest community ever, but, they are nice persons who care most about making ArgoUML incrementally better and some are pretty decent software developers with high commitment level. I think that I contributed some important work for the C++ module and did some nice work in the UML profile support. But, I'm involved in ArgoUML since 2004 and the pace of my contributions has been very snail like or even slower. Even worst, both the C++ module and the profile support seam a bit of an half-finished business. I think I know where the problem lies – dispersion!&lt;/p&gt;&lt;p&gt;So, I do I fight this? I do it by setting up a challenge for myself – spend one year focused at contributing to ArgoUML. Forget about the software blogs, software books and exercises. Blog about ideas I have, take some notes, so that they don't get neurologically garbage collected, but, then go back to work. In the end, take some ArgoUML vacations for some undetermined time, look at one of these ideas and pick it up if I want to give it a try. (Probably I will want to do something related to my work at SISCOG and if so, it may take one year or more to finish, but, I don't know and for now don't care what that will be.)&lt;/p&gt;&lt;p&gt;So, my aim is mainly to move profile support in ArgoUML up into something that looks a lot like finished business and try to do the same thing for the C++ module (this one is harder, though).&lt;/p&gt;&lt;p&gt;But first, as a last bit of devilish concession to my dispersion I'll spend some time writing and publishing some of the significant ideas in either &lt;a href="http://argonauts-life.blogspot.com/" class=""&gt;Argonaut's life&lt;/a&gt; if they are ArgoUML or software development related, or in &lt;a href="http://as-minhas-ideias.blogspot.com/" class=""&gt;Idiota&lt;/a&gt; if they aren't.&lt;/p&gt;&lt;p&gt;Oh, and  I have an idea for a trick that will help me not to get distracted. I'm going to get myself an ArgoUML bracelet, just like &lt;a href="http://blog.objectmentor.com/articles/category/uncle-bobs-blatherings" class="ligacao"&gt;Uncle Bob&lt;/a&gt; has &lt;a href="http://butunclebob.com/ArticleS.UncleBob.GreenWristBand" class="ligacao"&gt;his green wrist band&lt;/a&gt; to remember himself that code must be clean and tests green. Maybe I should get a green ArgoUML wrist band!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-5484559635623996860?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/5484559635623996860/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=5484559635623996860' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/5484559635623996860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/5484559635623996860'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2009/11/dispersion-problem-why-am-i.html' title='Dispersion problem &amp;ndash; why am I contributing so little to ArgoUML?...'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-4375706794699643104</id><published>2009-10-22T23:21:00.002+01:00</published><updated>2009-10-22T23:26:09.388+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='common lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='programming praxis'/><title type='text'>Solution for Programming Praxis' Beautiful Code</title><content type='html'>&lt;p&gt;The following is &lt;a class="ligacao" href="http://www.fileden.com/files/2008/4/5/1853347/simple-re-match.lisp"&gt;my solution&lt;/a&gt; to the &lt;a class="ligacao" href="http://programmingpraxis.com/2009/09/11/beautiful-code/"&gt;Programming Praxis' Beautiful Code problem&lt;/a&gt; in Common Lisp. (The &lt;a href="http://lisp.pastebin.com/f22abddc2" class="ligacao"&gt;final code is also in pastebin.com&lt;/a&gt;.)&lt;/p&gt;&lt;p&gt;I started from a solution in which I ported the code from C to Common Lisp as directly as possible. For instance, the code for the &lt;code&gt;matchhere&lt;/code&gt; function was this mess:&lt;/p&gt;&lt;pre&gt;
;;; matchhere: search for re at beginning of text
(defun matchhere (re text)
  (if (= 0 (length re))
      1
      (if (and (&lt; 1 (length re)) (char= #\* (elt re 1)))
   (matchstar (elt re 0) (subseq re 2) text)
   (if (and (char= #\$ (elt re 0)) (= 1 (length re)))
       (= 0 (length text))
       (when (and (&lt; 0 (length text))
    (or (char= #\. (elt re 0)) (char= (elt re 0) (elt text 0))))
  (matchhere (subseq re 1) (subseq text 1)))))))
&lt;/pre&gt;&lt;p&gt;Then I changed the above to use &lt;code&gt;cond&lt;/code&gt; and abstracted &lt;code&gt;(= 0 (length seq))&lt;/code&gt; to &lt;code&gt;empty&lt;/code&gt;, which resulted in this:&lt;/p&gt;&lt;pre&gt;
(defun matchhere (re text)
  "search for re at beginning of text"
  (cond ((empty re))
 ((and (&lt; 1 (length re)) (char= #\* (elt re 1)))
  (matchstar (elt re 0) (subseq re 2) text))
 ((and (char= #\$ (elt re 0)) (= 1 (length re)))
  (empty text))
 ((and (not (empty text))
       (or (char= #\. (elt re 0)) (char= (elt re 0) (elt text 0))))
  (matchhere (subseq re 1) (subseq text 1)))))
&lt;/pre&gt;&lt;p&gt;Finally, I turned the &lt;code&gt;loop&lt;/code&gt; based &lt;code&gt;match&lt;/code&gt; and &lt;code&gt;matchstar&lt;/code&gt; into tail call form. For illustration, this is what &lt;code&gt;matchstar&lt;/code&gt; initially was:&lt;/p&gt;&lt;pre&gt;
;;; matchstar: search for c*re at beginning of text
(defun matchstar (c re text)
  (loop when (matchhere re text) do (return 1)
       while (and (not (equal 0 (length text)))
    (or (char= c (elt text 0)) (char= #\. c)))
       when (not (= 0 (length text))) do (setf text (subseq text 1))))
&lt;/pre&gt;&lt;p&gt;And this is how it is after the refactoring:&lt;/p&gt;&lt;pre&gt;
(defun matchstar (c re text)
  "search for c*re at beginning of text"
  (cond ((matchhere re text))
 ((and (not (empty text))
       (or (char= c (elt text 0)) (char= #\. c)))
  (matchstar c re (subseq text 1)))))
&lt;/pre&gt;&lt;p&gt;All done, I'm pretty happy with the result I have now. It is very similar to the Scheme solution by the Programming Praxis author and it certainly is very Lispy.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-4375706794699643104?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/4375706794699643104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=4375706794699643104' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/4375706794699643104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/4375706794699643104'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2009/10/solution-for-programming-praxis.html' title='Solution for Programming Praxis&apos; Beautiful Code'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-1305764970368554060</id><published>2009-09-21T23:55:00.006+01:00</published><updated>2009-09-22T01:54:45.851+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='command line'/><category scheme='http://www.blogger.com/atom/ns#' term='ABCL'/><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><category scheme='http://www.blogger.com/atom/ns#' term='eeepc'/><category scheme='http://www.blogger.com/atom/ns#' term='automation'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='common lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><category scheme='http://www.blogger.com/atom/ns#' term='eeebuntu'/><title type='text'>Customizing Eeebuntu GNU/Linux 3.0 Standard into a development environment</title><content type='html'>&lt;p&gt;I documented previously the &lt;a href="http://argonauts-life.blogspot.com/2009/09/installing-eeebuntu-gnulinux30-standard.html" class="ligacao"&gt;Eeebuntu GNU/Linux 3.0 Standard installation&lt;/a&gt;. My intent now is to document the process to make this into a development environment. Since this is an ongoing process, it is possible that I will make new entries that supplement this one, but, for now I hope that this will make the process repeatable and potentially automated.&lt;/p&gt;&lt;p&gt;An important note is that I used the &lt;a href="http://www.nongnu.org/synaptic/" class="ligacao"&gt;Synaptic Package Manager&lt;/a&gt; instead of the command line &lt;a href="http://packages.qa.debian.org/a/apt.html" class="ligacao"&gt;apt-get&lt;/a&gt; package handling utility, so, the commands I'll place bellow maybe won't lead to the result I currently have. This is nevertheless an attempt to automate the process and for this a command line is always better than a list of steps to be performed in some GUI tool.&lt;/p&gt;&lt;p&gt;Install latest Emacs, which is the basis for the majority of text editing and Lisp development.&lt;/p&gt;&lt;pre&gt; sudo apt-get install emacs-snapshot-gtk emacs-snapshot-el&lt;/pre&gt;&lt;p&gt;Several version control systems:&lt;/p&gt;&lt;pre&gt; sudo apt-get install git-core git-doc git-gui git-svn subversion&lt;/pre&gt;&lt;p&gt;Common Lisp implementations and support for its development:&lt;/p&gt;&lt;pre&gt; sudo apt-get install cl-swank cl-asdf common-lisp-controller sbcl sbcl-doc sbcl-source slime&lt;/pre&gt;&lt;p&gt;Standard C++ development support (maybe I should install boost also).&lt;/p&gt;&lt;pre&gt; sudo apt-get install g++ g++-multilib gdb gdb-doc&lt;/pre&gt;&lt;p&gt;Python 2.6 development environment (in the future I will probably install the latest Python 3.x also):&lt;/p&gt;&lt;pre&gt; sudo apt-get install idle-python2.6 python2.6-doc python2.6-examples&lt;/pre&gt;&lt;p&gt;For future reference I leave here the log of the day when I picked and installed the tools for software development environment.&lt;/p&gt;&lt;pre&gt;Commit Log for Fri Sep 18 00:25:50 2009

Installed the following packages: 
blt (2.4z-4.1) 
cl-asdf (1.111-1) 
cl-swank (1:20080223-2) 
common-lisp-controller (6.17) 
emacs-snapshot (1:20090320-1ubuntu1) 
emacs-snapshot-bin-common (1:20090320-1ubuntu1) 
emacs-snapshot-el (1:20090320-1ubuntu1) 
emacs-snapshot-gtk (1:20090320-1ubuntu1) 
g++ (4:4.3.3-1ubuntu1) 
g++-4.3 (4.3.3-5ubuntu4) 
g++-4.3-multilib (4.3.3-5ubuntu4) 
g++-multilib (4:4.3.3-1ubuntu1) 
gcc-4.3-multilib (4.3.3-5ubuntu4) 
gcc-multilib (4:4.3.3-1ubuntu1) 
gdb-doc (6.8-1) 
git-core (1:1.6.0.4-1ubuntu2) 
git-doc (1:1.6.0.4-1ubuntu2) 
git-gui (1:1.6.0.4-1ubuntu2) 
git-svn (1:1.6.0.4-1ubuntu2) 
gitk (1:1.6.0.4-1ubuntu2) 
glibc-doc (2.9-4ubuntu6) 
glibc-source (2.9-4ubuntu6) 
idle-python2.6 (2.6.2-0ubuntu1) 
lib64gcc1 (1:4.3.3-5ubuntu4) 
lib64gomp1 (4.3.3-5ubuntu4) 
lib64stdc++6 (4.3.3-5ubuntu4) 
libapr1 (1.2.12-5ubuntu0.1) 
libaprutil1 (1.2.12+dfsg-8ubuntu0.3) 
libc6-amd64 (2.9-4ubuntu6) 
libc6-dev-amd64 (2.9-4ubuntu6) 
libdigest-sha1-perl (2.11-2build2) 
liberror-perl (0.17-1) 
libpq5 (8.3.7-1) 
libstdc++6-4.3-dev (4.3.3-5ubuntu4) 
libsvn-perl (1.5.4dfsg1-1ubuntu2.1) 
libsvn1 (1.5.4dfsg1-1ubuntu2.1) 
python-tk (2.6.2-0ubuntu1) 
python2.6-doc (2.6.2-0ubuntu1) 
python2.6-examples (2.6.2-0ubuntu1) 
realpath (1.12) 
sbcl (1:1.0.18.0-2) 
sbcl-doc (1:1.0.18.0-2) 
sbcl-source (1:1.0.18.0-2) 
slime (1:20080223-2) 
subversion (1.5.4dfsg1-1ubuntu2.1) 
tcl (8.4.16-2) 
tcl8.4 (8.4.19-2) 
tcl8.5 (8.5.6-3) 
tk (8.4.16-2) 
tk8.4 (8.4.19-2) 
tk8.5 (8.5.6-3)&lt;/pre&gt;&lt;p&gt;I have also some more software that currently is installed in my&lt;code&gt;$HOME&lt;/code&gt;:&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;&lt;a href="http://java.sun.com/javase/6/" class="ligacao"&gt;Sun JDK 1.6&lt;/a&gt;  &amp;ndash; for Java development and building from source,  which I currently use mainly for  &lt;a href="http://www.argouml.org" class="ligacao"&gt;ArgoUML&lt;/a&gt;  and  &lt;a href="http://common-lisp.net/project/armedbear/" class="ligacao"&gt;Armed Bear  Common Lisp (ABCL)&lt;/a&gt;;&lt;/li&gt;  &lt;li&gt;&lt;a href="http://www.eclipse.org/ganymede/" class="ligacao"&gt;Eclipse  Ganymede&lt;/a&gt; (Eclipse 3.4, TODO, update to  &lt;a href="http://www.eclipse.org/galileo/" class="ligacao"&gt;Eclipse Galileo&lt;/a&gt;  which is 3.5) &amp;ndash; which I use for  &lt;a href="http://www.argouml.org" class="ligacao"&gt;ArgoUML&lt;/a&gt;  development;&lt;/li&gt;  &lt;li&gt;&lt;a href="http://www.plt-scheme.org/" class="ligacao"&gt;PLT Scheme&lt;/a&gt;  &amp;ndash; to try out Scheme;&lt;/li&gt;  &lt;li&gt;&lt;a href="http://sisc-scheme.org/" class="ligacao"&gt;Second Interpreter of  Scheme Code (SISC)&lt;/a&gt;  &amp;ndash; ditto;&lt;/li&gt;  &lt;li&gt;&lt;a href="http://www.argouml.org" class="ligacao"&gt;ArgoUML&lt;/a&gt; &amp;ndash;  this is both installed and checked out from Subversion;&lt;/li&gt;  &lt;li&gt;&lt;a href="http://common-lisp.net/project/armedbear/" class="ligacao"&gt;Armed  Bear Common Lisp (ABCL)&lt;/a&gt;  &amp;ndash; a Common Lisp implementation for the JVM checked out from Subversion  repository.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-1305764970368554060?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/1305764970368554060/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=1305764970368554060' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/1305764970368554060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/1305764970368554060'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2009/09/customizing-eeebuntu-gnulinux-30.html' title='Customizing Eeebuntu GNU/Linux 3.0 Standard into a development environment'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-6496792180982597915</id><published>2009-09-21T10:00:00.004+01:00</published><updated>2009-09-22T01:51:35.086+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='install'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='links'/><category scheme='http://www.blogger.com/atom/ns#' term='eeepc'/><category scheme='http://www.blogger.com/atom/ns#' term='eeebuntu'/><title type='text'>Installing Eeebuntu GNU/Linux 3.0 Standard on my Asus Eee PC 901</title><content type='html'>&lt;p&gt;I bought an &lt;a href="http://www.asus.com/product.aspx?P_ID=1sRO7tW9B0OdR9yz" class="ligacao"&gt;Asus Eee PC 901&lt;/a&gt; with an &lt;a href="http://www.xandros.com/products/oem/index.html" class="ligacao"&gt;Asus customized xandros GNU/Linux distribution&lt;/a&gt; back in December 2008. I meant to switch to a more &amp;ldquo;normal&amp;rdquo; &lt;a href="http://www.debian.org" class="ligacao"&gt;Debian&lt;/a&gt; based &lt;a href="http://www.gnu.org" class="ligacao"&gt;GNU&lt;/a&gt;/&lt;a href="http://www.linux.org" class="ligacao"&gt;Linux&lt;/a&gt; distribution right from the start, but, my initial strategy was to use only the &lt;a href="http://www.asus.com/product.aspx?P_ID=1sRO7tW9B0OdR9yz" class="ligacao"&gt;Asus Eee PC 901&lt;/a&gt; to make the switch and I started having difficulties, so, this effort stalled for a couple of months. Now, I successfully made the switch to &lt;a href="http://eeebuntu.org/index.php?page=standard" class="ligacao"&gt;Eeebuntu GNU/Linux 3.0 Standard&lt;/a&gt; (which is based on &lt;a href="http://www.ubuntulinux.org/products/whatisubuntu/904features/" class="ligacao"&gt;Ubuntu GNU/Linux 9.04 Jaunty Jackalope&lt;/a&gt;, being Ubuntu GNU/Linux based on Debian GNU/Linux), and what follows is the successful recipe I used.&lt;/p&gt;&lt;ol&gt;  &lt;li&gt;I bought a 4GB Kingston DataTraveler USB stick to place there the  &lt;a href="http://eeebuntu.org/index.php?page=standard" class="ligacao"&gt;Eeebuntu  GNU/Linux 3.0 Standard&lt;/a&gt;  for installation.&lt;/li&gt;  &lt;li&gt;In an old Compaq Presario 2500 laptop I used  &lt;a href="http://www.knopper.net/knoppix/knoppix60-en.html" class="ligacao"&gt;KNOPPIX  6.0 / ADRIANE 1.1 - Live CD&lt;/a&gt;  (another  &lt;a href="http://www.debian.org" class="ligacao"&gt;Debian&lt;/a&gt;  based GNU/Linux distribution)  to:  &lt;ol&gt;p    &lt;li&gt;rewrite the partition table of the USB stick as a single primary partition,    using the bundled    &lt;a href="http://gparted.sourceforge.net" class="ligacao"&gt;gParted&lt;/a&gt;;&lt;/li&gt;    &lt;li&gt;format the USB stick as a FAT16 partition by issuing the command&lt;br&gt;    &lt;code&gt;sudo mkfs.vfat -F 16 /dev/sda1&lt;/code&gt;&lt;br&gt;    (note that my USB stick was identified as &lt;strong&gt;sda&lt;/strong&gt;, in another    situation it may be different).&lt;/li&gt;  &lt;/ol&gt;  &lt;/li&gt;  &lt;li&gt;In the same notebook, using  &lt;a href="http://unetbootin.sourceforge.net" class="ligacao"&gt;UNetbootin&lt;/a&gt;  in Windows, I created a boot-able USB stick from the  &lt;a href="http://eeebuntu.org/index.php?page=standard" class="ligacao"&gt;Eeebuntu  GNU/Linux 3.0 Standard&lt;/a&gt;  ISO image.  &lt;/li&gt;  &lt;li&gt;Finally, start-up the Eee PC 901, pressing Esc key to get into the boot  device selection menu and choose the USB stick as the boot device.  (Note that I changed the BIOS settings, disabling the fast boot and changing  the boot priority order, although in retrospect I suspect this wasn't needed.)  &lt;/li&gt;  &lt;li&gt;Select the default option in the UNetbootin boot menu (still before Linux  image in the USB stick starts or wait some seconds.  &lt;/li&gt;  &lt;li&gt;After the  &lt;a href="http://eeebuntu.org/index.php?page=standard" class="ligacao"&gt;Eeebuntu  GNU/Linux 3.0 Standard&lt;/a&gt;  ISO image starts, double click the &lt;strong&gt;Install&lt;/strong&gt; shortcut in the  desktop.  &lt;/li&gt;  &lt;li&gt;The installation procedure is very simple, and I only made some complex  decisions in the manual partitioning, having the following:  &lt;ul&gt;    &lt;li&gt;&lt;strong&gt;/dev/sda&lt;/strong&gt; &amp;ndash; this is the master SDD disk with    3.75 GB of memory and it is faster than the secondary SDD disk.    I partitioned it in two as follows:    &lt;ul&gt;      &lt;li&gt;&lt;strong&gt;/dev/sda1&lt;/strong&gt; &amp;ndash; with a size of 2.88 GB contains all      top folders (&lt;code&gt;/&lt;/code&gt; mount point),      except &lt;code&gt;linux-swap&lt;/code&gt;, &lt;code&gt;/usr&lt;/code&gt; and &lt;code&gt;/home&lt;/code&gt;;      &lt;/li&gt;      &lt;li&gt;&lt;strong&gt;/dev/sda2&lt;/strong&gt; &amp;ndash; ~ 900 MB for      &lt;code&gt;linux-swap&lt;/code&gt;.      &lt;/li&gt;    &lt;/ul&gt;    &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;/dev/sdb&lt;/strong&gt; &amp;ndash; this is the slave SDD disk with 15 GB    of memory.    I partitioned it in two as follows:    &lt;ul&gt;      &lt;li&gt;&lt;strong&gt;/dev/sdb1&lt;/strong&gt; &amp;ndash; with a size of 6.22 GB, contains      &lt;code&gt;/usr&lt;/code&gt;;      &lt;/li&gt;      &lt;li&gt;&lt;strong&gt;/dev/sdb2&lt;/strong&gt; &amp;ndash; with a size of 8.81 GB, contains      &lt;code&gt;/home&lt;/code&gt;.&lt;/li&gt;    &lt;/ul&gt;    &lt;/li&gt;  &lt;/ul&gt;  I used ext4 file system for all the partitions (except  &lt;code&gt;linux-swap&lt;/code&gt;).  &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;In retrospect I think that I would be able to do all the steps in the original Eee PC 901 with xandros, but, originally, in December 2008 I had an 8 GB USB stick for which a FAT16 file system isn't possible. Also, the xandros with which the Asus Eee PC 901 comes is based in an old Debian distribution and I wasn't able to execute UNetbootin in it.&lt;/p&gt;&lt;p&gt;I already made some customizations, like removing some programs and installing additional ones (I'm writing this in emacs-snapshot-gtk) and development libraries, but, I'll document this in a &lt;a href="http://argonauts-life.blogspot.com/2009/09/customizing-eeebuntu-gnulinux-30.html" class="ligacao"&gt;different post&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-6496792180982597915?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/6496792180982597915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=6496792180982597915' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/6496792180982597915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/6496792180982597915'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2009/09/installing-eeebuntu-gnulinux30-standard.html' title='Installing Eeebuntu GNU/Linux 3.0 Standard on my Asus Eee PC 901'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-1801984395809180899</id><published>2009-09-04T23:00:00.002+01:00</published><updated>2009-09-05T00:23:32.466+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='hints'/><category scheme='http://www.blogger.com/atom/ns#' term='shell'/><title type='text'>bash hints – for loops</title><content type='html'>&lt;p&gt;Today I had to process some files in a similar way in a bash shell. After trying using pipes, I reverted to for loops. First iterating for all files in a directory and extracting its contents (they were *.tar.bz2):&lt;/p&gt;&lt;pre&gt;(...)/pcl-book/c23-spam/sa-pub-corpus&gt; ls 
20030228_easy_ham_2.tar.bz2  20030228_hard_ham.tar.bz2  20030228_spam.tar.bz2 
20030228_easy_ham.tar.bz2    20030228_spam_2.tar.bz2
(...)/pcl-book/c23-spam/sa-pub-corpus&gt; for f in *; do tar -xjf $f; done&lt;/pre&gt;&lt;p&gt;Then, I discovered that the archives contained a file which I didn't wanted, so, I removed the files (the files were named &amp;ldquo;cmds&amp;rdquo;):&lt;/p&gt;&lt;pre&gt;(...)/pcl-book/c23-spam/sa-pub-corpus&gt; ls 
20030228_easy_ham_2.tar.bz2  20030228_hard_ham.tar.bz2  20030228_spam.tar.bz2  easy_ham_2/  spam/ 
20030228_easy_ham.tar.bz2    20030228_spam_2.tar.bz2    easy_ham/              hard_ham/    spam_2/
(...)/pcl-book/c23-spam/sa-pub-corpus&gt; for f in `ls --ignore=2003*`; do `rm $f\cmds`; done&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-1801984395809180899?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/1801984395809180899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=1801984395809180899' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/1801984395809180899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/1801984395809180899'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2009/09/bash-hints-for-loops.html' title='bash hints &amp;ndash; for loops'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-987742171264888746</id><published>2009-08-30T23:00:00.000+01:00</published><updated>2009-09-05T00:16:11.628+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UML'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='links'/><title type='text'>Some sw dev links</title><content type='html'>&lt;ul&gt;  &lt;li&gt;&lt;a class="ligacao" href="http://www.jot.fm/issues/issue_2009_05/column5/"&gt;C&amp;eacute;dric Bouhours, Herv&amp;eacute; Leblanc, Christian Percebois: &amp;quot;Bad smells in design and design   patterns&amp;quot;, in Journal of Object Technology, vol. 8, no. 3, May-June 2009,   pp. 43-63&lt;/a&gt; &amp;ndash;   Interesting paper regarding automated detection in UML models of opportunities   for using design patterns.&lt;/li&gt;  &lt;li&gt;&lt;a class="ligacao" href="http://www.indiangeek.net/wp-content/uploads/Programmer%20competency%20matrix.htm"&gt;Programmer   Competency Matrix&lt;/a&gt;  &amp;ndash; A very complete and interesting list of competencies that a programmer   must have with concrete ways to check in what level someone fits for each   competency.&lt;/li&gt;  &lt;li&gt;&lt;a class="ligacao" href="http://www.jot.fm/issues/issue_2009_05/column2/"&gt;Douglas A. Lyon:   &amp;quot;The Discrete Fourier Transform, Part 1&amp;quot;, in Journal of Object   Technology, vol. 8. no. 3, May-June 2009 pp. 17-26&lt;/a&gt;  &amp;ndash; After reading this I was refreshed in the basic ideas behind the  Fourier Transform.  Previously I thought of solving the  &lt;a class="ligacao" href="#programming-praxis-rail-fence-cipher-00"&gt;Rail-Fence   Cipher problem&lt;/a&gt; based on a Fourier transform, but, now I think that what  is needed is something different.&lt;/li&gt;  &lt;li&gt;&lt;a class="ligacao" href="http://www.jot.fm/issues/issue_2009_05/article1/"&gt;Debasish Kundu,   Debasis Samanta: &amp;quot;A Novel Approach to Generating Test Cases from UML   Activity Diagrams&amp;quot;, in Journal of Object Technology, vol. 8, no. 3,   May-June 2009, pp. 65-83&lt;/a&gt;  &amp;ndash; Presentation of an approach to generate test cases from UML 2.x  activity diagrams.  It is mainly theoretical and considers coverage of loops and concurrency,  providing an algorithm to generate paths in the generated activity graphs  from the activity diagrams.  This is somewhat related to my   &lt;a class="ligacao" href="http://argonauts-life.blogspot.com/2005/11/starting-with-parameterized-classes.html#umlunit_1"&gt;UML Unit idea&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-987742171264888746?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/987742171264888746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=987742171264888746' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/987742171264888746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/987742171264888746'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2009/08/some-sw-dev-links.html' title='Some sw dev links'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-4481176637478710540</id><published>2009-05-07T08:00:00.003+01:00</published><updated>2009-05-08T00:10:25.240+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='common lisp'/><title type='text'>Common Lisp dynamic variables</title><content type='html'>&lt;p&gt;One thing that Common Lisp has which is very powerfull is its &lt;a class="ligacao" href="http://www.gigamonkeys.com/book/variables.html"&gt;dynamic variables&lt;/a&gt;. The following code ilustrates the concept:&lt;/p&gt;
&lt;pre&gt;CL-USER(124): (defvar *x* "Hello") ; *x* is a dynamic variable*X* 
CL-USER(125): (progn
                (let ((*x* "Ola")) ; establishes a dynamic environment for *x*
                  (format t "~a~%" *x*)
                  (setf *x* "Ciao")
                  (format t "~a~%" *x*)) ; end of the dynamic environment
                (format t "~a~%" *x*)) ; back to the initial dynamic environment
                                       ; *x* assumes its original binding 
Ola 
Ciao 
Hello 
NIL 
CL-USER(126): &lt;/pre&gt;&lt;p&gt;Now if this is used with multiple processing and/or closures you get very powerful ways to separate things and a great amount of flexibility almost for nothing.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-4481176637478710540?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/4481176637478710540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=4481176637478710540' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/4481176637478710540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/4481176637478710540'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2009/05/common-lisp-dynamic-variables.html' title='Common Lisp dynamic variables'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-8011981483804153700</id><published>2009-05-06T23:52:00.001+01:00</published><updated>2009-05-08T00:06:04.480+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><category scheme='http://www.blogger.com/atom/ns#' term='release'/><title type='text'>ArgoUML 0.28</title><content type='html'>&lt;p&gt;Some time ago  &lt;a class ="ligacao" href="http://argouml-downloads.tigris.org/argouml-0.28"&gt;ArgoUML 0.28&lt;/a&gt; was released. This is a release that contains some new features and plenty of bug fixes. Please come aboard if you're still on land and give us some feedback via &lt;a class ="ligacao" href="http://argouml.tigris.org/ds/viewForums.do"&gt;ArgoUML mailing lists&lt;/a&gt;, &lt;a class ="ligacao" href="http://www.argouml-users.net"&gt;ArgoUML users' wiki band forums&lt;/a&gt; or via a &lt;a class ="ligacao" href="http://argouml.tigris.org/project_bugs.html"&gt;bug or enhancement report&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-8011981483804153700?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/8011981483804153700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=8011981483804153700' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/8011981483804153700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/8011981483804153700'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2009/05/argouml-028.html' title='ArgoUML 0.28'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-8033563453435341138</id><published>2009-05-06T23:51:00.004+01:00</published><updated>2009-05-08T00:04:14.055+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><category scheme='http://www.blogger.com/atom/ns#' term='common lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='ABCL'/><title type='text'>Common Lisp hacking with ABCL</title><content type='html'>&lt;p&gt;I'm riding on a Linux Eee PC 901. For now I haven't installed a different distribution than the customized Xandros that comes with it... The freaking thing isn't booting from a FAT32 USB that I have...&lt;/p&gt;&lt;p&gt;So, and because the main flash drive is almost full, I don't have GCC to build a more mature Lisp. I'm therefore using &lt;a class="ligacao" href="http://common-lisp.net/project/armedbear/"&gt;Armed Bear Common Lisp (ABCL)&lt;/a&gt; for some entertainment hacking like &lt;a class="ligacao" href="http://argonauts-life.blogspot.com/2009/05/solution-for-programming-praxis-rail.html"&gt;solving Programming Praxis problems&lt;/a&gt; and reading &lt;a class="ligacao" href="http://www.gigamonkeys.com/book/"&gt;Peter Seibel's Practical Common Lisp&lt;/a&gt; for a second time. ABCL has some quirkcs, like when I tried to build an SVN ccheckout with Sun's JDK 1.6, it had some compilation errors. Nothing serious, and, after some minutes, I was at the REPL in Emacs. For now I tested it with a basic subset of imperative and functional Lisp and it stood well. I wonder if someday I try to setup a Lisp REPL for ArgoUML with ABCL (check &lt;a class="ligacao" href="http://argouml.tigris.org/issues/show_bug?id=3802"&gt;issue 3082: evaluating GEF support for template notation spike&lt;/a&gt;)...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-8033563453435341138?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/8033563453435341138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=8033563453435341138' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/8033563453435341138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/8033563453435341138'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2009/05/common-lisp-hacking-with-abcl.html' title='Common Lisp hacking with ABCL'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-5606125807587300593</id><published>2009-05-06T23:51:00.002+01:00</published><updated>2009-05-07T23:59:15.078+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='common lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='programming praxis'/><title type='text'>Solution for Programming Praxis' Rail-Fence Cipher</title><content type='html'>&lt;p&gt;I found &lt;a class="ligacao" href="http://programmingpraxis.wordpress.com"&gt;Programming Praxis&lt;/a&gt; via &lt;a class="ligacao" href="http://scheme.dk/planet/"&gt;Planet Scheme&lt;/a&gt;. The following is &lt;a class="ligacao" href="http://www.fileden.com/files/2008/4/5/1853347/rail-fence-cipher.lisp"&gt;my solution&lt;/a&gt; to the &lt;a class="ligacao" href="http://programmingpraxis.wordpress.com/2009/03/31/rail-fence-cipher/"&gt;Rail-Fence Cipher problem&lt;/a&gt; in Common Lisp [check out the &lt;a class="ligacao" href="http://www.gigamonkeys.com/book/"&gt;excelente Common Lisp tutorial&lt;/a&gt; by Peter Seibel for learning the language].&lt;/p&gt;&lt;p&gt;My solution doesn't follow the &lt;a class="ligacao" href="http://programmingpraxis.wordpress.com/2009/03/31/rail-fence-cipher/2/"&gt;solution proposed in Programming Praxis&lt;/a&gt;, because, after looking at the proposal, I think there might be a way to express it more mathematical. With this I mean that what we have is a transformation via a discrete wave pattern. That sounded a bit familiar to fourier transformation. If so, if it can be expressed as such, maybe it would be the cleanest way to do it...&lt;/p&gt;&lt;p&gt;So, for now, the solution I present here is based in the straight-forward non-functional algorithm that one gets if analysing the problem as manipulating a string based on a ciclic list of indexes.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-5606125807587300593?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/5606125807587300593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=5606125807587300593' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/5606125807587300593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/5606125807587300593'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2009/05/solution-for-programming-praxis-rail.html' title='Solution for Programming Praxis&apos; Rail-Fence Cipher'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-2734626145403919948</id><published>2008-06-28T23:41:00.002+01:00</published><updated>2009-05-07T23:50:56.419+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><category scheme='http://www.blogger.com/atom/ns#' term='profiles subsystem'/><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='anarres-cpp'/><title type='text'>ArgoUML 0.26 enters alpha</title><content type='html'>&lt;p&gt;Recently &lt;a href="http://argouml-downloads.tigris.org/argouml-0.26.ALPHA_1"&gt;ArgoUML 0.26.alpha1&lt;/a&gt; was released. This is another step forward to a much anticipated ArgoUML 0.26. It contains some new things and one of these is the profile subsystem, to which I made a modest contribution.&lt;/p&gt;&lt;p&gt;I'm now working in priority 2 issues of the profile subsystem, which block the stable release. I'm also working in documenting this subsystem, first in the cookbook and then I'll do updates to the user manual. I hope I can still give a bit of of attention to the C++ module...&lt;/p&gt;&lt;p&gt;So, here is a list of things I would like to try to fix before 0.26:&lt;/p&gt;&lt;ol&gt;  &lt;li&gt;    &lt;p&gt;&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=4994"&gt;issue      #4994: Editing loaded profile should be prevented&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;code&gt;ExplorerPopup.isRelatedToProfiles(Project, Object)&lt;/code&gt; is       used to detect if a element is related to the profiles configured in the      current project.      In the same package is the support for drag-n-drop, class      &lt;code&gt;DnDExplorerTree&lt;/code&gt;, which method      &lt;code&gt;isValidDrag(TreePath destinationPath, Transferable tf)&lt;/code&gt;      contains the validation of valid and invalid drags.      We may make impossible for profile model elements to be dragged by      checking if the &lt;code&gt;Transferable&lt;/code&gt; contents contain profile      model elements.      On the other hand, this would make it impossible to add a profile      contained model element to a diagram and this would limit the      usefulness of the profiles.      &lt;code&gt;FigNodeModelElement&lt;/code&gt; is the base class of many of the model      element figures in the diagrams.      Here the are two things needed: disable the menus that can modify the       model element and disable the editability of the model element in-place.       Such as the editing of names.    &lt;/p&gt;  &lt;/li&gt;  &lt;li&gt;&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=5017"&gt;issue      #5017: profile model elements are absent from diagrams on reload&lt;/a&gt;  &lt;/li&gt;  &lt;li&gt;&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=4991"&gt;issue      #4991: Profiles subsystem missing in the cookbook&lt;/a&gt;  &lt;/li&gt;  &lt;li&gt;&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=4992"&gt;issue      #4992&lt;/a&gt;    &amp;ndash; this is the one related to the update of the user manual for    inclusion of the profile related functionality  &lt;/li&gt;  &lt;li&gt;&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=3771"&gt;issue      #3771: Add tag definitions for tags used by the cpp generator&lt;/a&gt;    &amp;ndash; for this it is only needed to update the user manual to reflect    the usage of the UML profile for C++ instead of the previous way of    copying into the model the model elements of the included profile.  &lt;/li&gt;  &lt;li&gt;&lt;a href="http://argouml-cpp.tigris.org/issues/show_bug.cgi?id=27"&gt; issue      #27 of argouml-cpp: anarres-cpp: dependencies caused ArgoUML loading      failure&lt;/a&gt;    &amp;ndash; I thought I had fixed this, but, in 0.26.alpha1 there is still    the following warning:    &lt;pre&gt; 2008-06-27 19:17:48,526 ERROR: Unable to find required class while
      loading org.anarres.cpp.Main$Option - may indicate an obsolete
      extension module or an unresolved dependency (ModuleLoader2.java:719) 
java.lang.NoClassDefFoundError: gnu/getopt/LongOpt at 
java.lang.ClassLoader.defineClass1(Native Method) at 
java.lang.ClassLoader.defineClass(Unknown Source) at 
java.security.SecureClassLoader.defineClass(Unknown Source) at 
java.net.URLClassLoader.defineClass(Unknown Source) at 
java.net.URLClassLoader.access$000(Unknown Source) at 
java.net.URLClassLoader$1.run(Unknown Source) at 
java.security.AccessController.doPrivileged(Native Method) at 
java.net.URLClassLoader.findClass(Unknown Source) at 
java.lang.ClassLoader.loadClass(Unknown Source) at 
sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at 
java.lang.ClassLoader.loadClass(Unknown Source) at 
java.lang.ClassLoader.loadClass(Unknown Source) at 
org.argouml.moduleloader.ModuleLoader2.addClass(ModuleLoader2.java:714) at 
org.argouml.moduleloader.ModuleLoader2.processEntry(ModuleLoader2.java:680) at 
org.argouml.moduleloader.ModuleLoader2.processJarFile(ModuleLoader2.java:614) at 
org.argouml.moduleloader.ModuleLoader2.huntModulesFromNamedDirectory(ModuleLoader2.java:554) at 
org.argouml.moduleloader.ModuleLoader2.huntForModulesFromExtensionDir(ModuleLoader2.java:512) at 
org.argouml.moduleloader.ModuleLoader2.huntForModules(ModuleLoader2.java:435) at 
org.argouml.moduleloader.ModuleLoader2.doInternal(ModuleLoader2.java:311) at 
org.argouml.moduleloader.ModuleLoader2.doLoad(ModuleLoader2.java:164) at 
org.argouml.moduleloader.InitModuleLoader.init(InitModuleLoader.java:55) at 
org.argouml.application.SubsystemUtility.initSubsystem(SubsystemUtility.java:49) at
org.argouml.application.Main.initializeSubsystems(Main.java:430) at 
org.argouml.application.Main.main(Main.java:169) Caused by: 
java.lang.ClassNotFoundException: gnu.getopt.LongOpt at 
java.net.URLClassLoader$1.run(Unknown Source) at 
java.security.AccessController.doPrivileged(Native Method) at 
java.net.URLClassLoader.findClass(Unknown Source) at 
java.lang.ClassLoader.loadClass(Unknown Source) at 
sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at 
java.lang.ClassLoader.loadClass(Unknown Source) at 
java.lang.ClassLoader.loadClassInternal(Unknown Source) ... 24 more 2008-06-27 
19:17:48,546 ERROR: Failed to find any loadable ArgoUML modules in      jar 
X:\ArgoUML\0.26.ALPHA_1\ext\anarres-cpp-no-dependencies-1.2.3.jar     (ModuleLoader2.java:627)&lt;/pre&gt;  &lt;/li&gt;  &lt;li&gt;There is a problem in    &lt;a href="http://www.anarres.org/projects/jcpp/"&gt;JCPP&lt;/a&gt; from anarres    that it doesn't close the files when the contained CppReader is told to    close itself.    This is causing 5 tests in argouml-cpp to fail with an error, when the    &lt;code&gt;tearDown()&lt;/code&gt; is trying to delete the files.  &lt;/li&gt;  &lt;li&gt;There are some more argouml-cpp issues I would like to solve, but,    this is a fair cry...  &lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-2734626145403919948?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/2734626145403919948/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=2734626145403919948' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/2734626145403919948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/2734626145403919948'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2008/06/argouml-026-enters-alpha.html' title='ArgoUML 0.26 enters alpha'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-5754190345667583678</id><published>2008-06-28T23:38:00.002+01:00</published><updated>2009-05-08T00:00:45.182+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML GSoC mentor'/><title type='text'>Google Summer of Code 2008</title><content type='html'>&lt;p&gt;I'm a &lt;a href="http://code.google.com/opensource/gsoc/2008" class="ligacao"&gt;Google Summer of Code 2008&lt;/a&gt; mentor for &lt;a href="http://argouml.tigris.org" class=""&gt;ArgoUML&lt;/a&gt;. It is fun and, as stated over and over, one learns a lot by teaching and in my case mentoring.&lt;/p&gt;&lt;p&gt;The student I'm mentoring is Bogdan Szanto and he is working in fixing diagram usability issues. This includes fixing some existing problems and adding new features, that hopefully will make ArgoUML users happier.&lt;/p&gt;&lt;p&gt;Bogdan already helped fix some problems found in the new sequence diagrams implementation &amp;ndash; argouml-core-diagrams-sequence2. I was a bit late in this game, because he started working in this during the community bonding period and we both wanted him to &amp;ldquo;bond&amp;rdquo; with other developers than me. But, now it is long finished and I started supporting his work directly by reviewing patches and testing code and learning about the specifics of the implementation. So, while I was debugging I found the following issues that must go into the DB:&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;    &lt;p&gt;&lt;em&gt;Summary:&lt;/em&gt; Broom causes ClassCastException when used in a seq2      diagram that contains a Note &amp;ldquo;connected&amp;rdquo; to a      &lt;code&gt;ClassifierRole&lt;/code&gt;&lt;/p&gt;    &lt;p&gt;ModeBroomMessages thinks that all edges in the diagram are messages,      but, there can be connections between Notes and ClassifierRoles.      The following exception happens when the Broom is used in a seq2 diagram      that contains a Note &amp;ldquo;connected&amp;rdquo; to a classifier role:&lt;/p&gt;    &lt;pre&gt; java.lang.ClassCastException: org.argouml.uml.diagram.static_structure.ui.FigEdgeNote
 at org.argouml.uml.diagram.sequence2.ui.ModeBroomMessages.getAllFigMessages(ModeBroomMessages.java:198)
 at org.argouml.uml.diagram.sequence2.ui.ModeBroomMessages.getAllFigMessagesDownward(ModeBroomMessages.java:177)&lt;/pre&gt;  &lt;/li&gt;  &lt;li&gt;    &lt;p&gt;&lt;em&gt;Summary:&lt;/em&gt; destroy action cleans the lifeline of the caller&lt;/p&gt;    &lt;p&gt;When a destroy action is created between two classifier roles, the      lifeline of the caller becomes fully dashed.      I think that the opposite shouldn't also occur, but, that the lifeline      of the callee either should become dashed from the point where the      message arrives onward or that it should finish there (preferable).&lt;/p&gt;    &lt;p&gt;See the attached figure      &amp;ldquo;destroy-action-clears-lifeline-of-caller.png&amp;rdquo;.&lt;/p&gt;  &lt;/li&gt;  &lt;li&gt;    &lt;p&gt;&lt;em&gt;Summary:&lt;/em&gt; selected create Action + &amp;ldquo;Alt&amp;rdquo; key cause      repositioning of created CR&lt;/p&gt;    &lt;p&gt;When you draw a create Action between two classifier roles, leaving it      selected, and, afterwards press the &amp;ldquo;Alt&amp;rdquo; key, the created      CR is repositioned in the top position.      If the create Action isn't selected this problem doesn't occur.&lt;/p&gt;  &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-5754190345667583678?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/5754190345667583678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=5754190345667583678' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/5754190345667583678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/5754190345667583678'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2008/06/google-summer-of-code-2008.html' title='Google Summer of Code 2008'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-6922959010453881050</id><published>2008-04-05T15:08:00.000+01:00</published><updated>2008-04-06T15:19:36.624+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><category scheme='http://www.blogger.com/atom/ns#' term='UML profile for C++'/><title type='text'>Resolving and persisting profile references</title><content type='html'>&lt;p&gt;In the context of &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=4946"&gt;issue 4946 (Loading project which references non-default profile doesn't work)&lt;/a&gt; I needed to make some design changes to the profile sub-system and to the MDR implementation of the model sub-system of ArgoUML. At first I used what I now see as a brute force approach, banging the existing code to try to make the problem go away. I'm glad it didn't worked and I started thinking and designing my way out of this priority 1 bug.&lt;/p&gt;&lt;p&gt;Basically the problem aroused when we tried to finish the profile sub-system to have a developer release of ArgoUML, the release 0.25.5. Originally the UML profile for C++ was contained in the ArgoUML core. There were two types of profiles:&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;ArgoUML core profiles &amp;ndash; these are XMI files contained in ArgoUML,     being physically part of the argouml.jar.&lt;/li&gt;  &lt;li&gt;User defined profiles &amp;ndash; these are XMI files saved by the user,    which he intends to use as his own profiles, normally for reusing in    several models.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;It was agreed that part of the work would be to enable the language modules to contain the corresponding profiles, and as such I tried to put the C++ profile in the ArgoUML C++ module. So, ArgoUML would now have three types of profiles:&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;code profiles;&lt;/li&gt;  &lt;li&gt;module profiles;&lt;/li&gt;  &lt;li&gt;user defined profiles.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Now I need to explain the idea of resolving references when loading XMI files...&lt;/p&gt;&lt;p&gt;A XMI file is a XML file. Being so, it is possible to make a reference from one XMI file to another and this is how in the future ArgoUML you can have a model and several profiles referenced from this model. But, the references take the form of URL#ID, being the URL the reference to a different XMI file where there must exist a definition of a model element with the identifier ID.&lt;/p&gt;&lt;p&gt;To enable offline work in the case of core and module profiles and flexible user defined profile directories locations in the case of user defined profiles, you need to add a midle man resolving these beautiful URLs to system paths - enter the &lt;code&gt;XmiReferenceResolverImpl&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;The &lt;code&gt;XmiReferenceResolverImpl&lt;/code&gt; was based on the &lt;a href="http://www.andromda.org"&gt;AndroMDA&lt;/a&gt; code that did the same thing. It has some complex code that is able to resolve a reference from the net, local disk or even in the classpath. But, the resolving of a reference to a profile was hard coded, being the base URL and the base system path constants of &lt;code&gt;XmiReferenceResolverImpl&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;So, when the C++ profile was moved, the reference resolving didn't worked any longer for it since its &lt;em&gt;system reference&lt;/em&gt; was now different. It broke the initial solution of having the reference resolving somehow hard coded in the MDR model implementation.&lt;/p&gt;&lt;p&gt;I tried very much to make it work again, doing some more hard coding in the profile loading side and in the MDR implementation side:&lt;ol&gt;  &lt;li&gt;[2008-01-28 to 2008-02-05]     Hack, hack, debug, debug, and I made the C++ profile module work :-)&lt;/li&gt;  &lt;li&gt;[2008-02-26 to 2008-03-04]     Hack, hack, debug, debug, hack, hack and the user profiles work too     :-))&lt;/li&gt;  &lt;li&gt;[2008-03-??]    But wait, my automated test for the C++ profile persistency is now     failing :-(&lt;/li&gt;  &lt;li&gt;[2008-03-?? to 2008-03-23]    Debug, debuug, hack, haaack...&lt;/li&gt;  &lt;li&gt;[2008-03-24]    Stop! Think a bit, and think a bit more and... This design for resolving    references is broken.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;So, I went back to the drawing board and started thinking a bit on what is required to enable the reference resolving that we needed. There were some lessons learned:&lt;/p&gt;&lt;ol&gt;  &lt;li&gt;the &lt;code&gt;XmiReferenceResolverImpl&lt;/code&gt; must not have hard coded base     URLs and base system paths to resolve the profiles references;&lt;/li&gt;  &lt;li&gt;when the XMI for a profile is read, the     &lt;code&gt;XmiReferenceResolverImpl&lt;/code&gt; must replace the given system     reference with a public reference which is handed to it;&lt;/li&gt;  &lt;li&gt;the best place to know about what are the system and public references     for a given XMI is the place where the call to load the XMI is done.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Enter the &lt;a href="#profile-reference-class-diagram"&gt;&lt;code&gt;ProfileReference&lt;/code&gt;&lt;/a&gt;, although, as &lt;a href="http://www.marcosaurelio.com/"&gt;Marcos Aurélio&lt;/a&gt; commented, it would better to be called &lt;code&gt;ModelReference&lt;/code&gt;.&lt;/p&gt;&lt;p class="figura"&gt;&lt;img src="http://www.fileden.com/files/2008/4/5/1853347/profile-reference-class-diagram.png" width="713" height="431" alt="ProfileReference class diagram."&gt;&lt;/p&gt;&lt;p class="legendaFigura"&gt;&lt;a name="profile-reference-class-diagram"&gt;&lt;em&gt;Picture 7&lt;/em&gt;&lt;/a&gt; &amp;ndash; &lt;code&gt;ProfileReference&lt;/code&gt; class diagram.&lt;/p&gt;&lt;p&gt;As seen, to enable DRY, I added the &lt;code&gt;CoreProfileReference&lt;/code&gt; and the &lt;code&gt;UserProfileReference&lt;/code&gt;, but, the language modules will in principle use directly the &lt;code&gt;ProfileReference&lt;/code&gt;, or define their own &lt;code&gt;XxxProfileReference&lt;/code&gt;. The &lt;code&gt;ProfileModelLoader.loadModel(String path)&lt;/code&gt; method is deprecated and the &lt;code&gt;ProfileModelLoader.loadModel(ProfileReference reference)&lt;/code&gt; replaces it.&lt;/p&gt;&lt;p&gt;But, now, how do I get all these neat references into the realm of &lt;code&gt;XmiReferenceResolverImpl&lt;/code&gt;? Well, some more design and I hope the ArgoUML powered &lt;a href="#profile-loading-sequence-diagram"&gt;sequence diagram of the interesting part of loading a profile XMI&lt;/a&gt; explains it.&lt;/p&gt;&lt;p class="figura"&gt;&lt;img src="http://www.fileden.com/files/2008/4/5/1853347/profile-loading-sequence-diagram.png" width="995" height="450" alt="Profile loading sequence diagram."&gt;&lt;/p&gt;&lt;p class="legendaFigura"&gt;&lt;a name="profile-loading-sequence-diagram"&gt;&lt;em&gt;Picture 7&lt;/em&gt;&lt;/a&gt; &amp;ndash; profile loading sequence diagram.&lt;/p&gt;&lt;p&gt;As with many sequence diagrams, I only kept the important steps, but, one significant is that there is a map of public to system references involved, which is kept at the &lt;code&gt;MDRModelImplementation&lt;/code&gt; level. And this is important, since the &lt;code&gt;XmiReferenceResolverImpl&lt;/code&gt; and its creator, the &lt;code&gt;XmiReaderImpl&lt;/code&gt; are short lived - they are only kept around while the XMI is being loaded.&lt;/p&gt;&lt;p&gt;So, when I find myself working very hard at the debugger and hacking cycle I will try to stop and think. I recall already having stated this to myself some time ago, but, sometimes I forget this kind of things for which there is nothing like a bump with the head (or several as in this case) for one to remember the basics again ;-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-6922959010453881050?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/6922959010453881050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=6922959010453881050' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/6922959010453881050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/6922959010453881050'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2008/04/resolving-and-persisting-profile.html' title='Resolving and persisting profile references'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-5705429347722184617</id><published>2008-03-08T15:21:00.000Z</published><updated>2008-03-08T15:22:38.470Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><category scheme='http://www.blogger.com/atom/ns#' term='repository'/><title type='text'>ArgoUML's repository restructuring</title><content type='html'>&lt;p&gt;ArgoUML core is undertaking a repository restructuring and I'm working in adapting the argouml-cpp build to the new structure.&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=4625"&gt;Issue 4625&lt;/a&gt; is where the requirements for the changes are documented and there has been some dev mailing list activity on this. Linus Tolke is heading the effort.&lt;/p&gt;&lt;p&gt;We want to keep two build mechanisms:&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;Plain Ant build via command line and without eclipse.&lt;/li&gt;  &lt;li&gt;eclipse based build, being the idea for this to make easier for new   contributors to start.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I have been adapting the Ant build file to the new structure, but, I had some problems with making it work for both purposes. The big issue is to generate the source files from the ANTLR grammar. In the end we figured out a good way to do it and it is now documented in the &lt;a href="http://argouml-stats.tigris.org/documentation/defaulthtml/cookbook/"&gt;ArgoUML cookbook&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-5705429347722184617?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/5705429347722184617/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=5705429347722184617' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/5705429347722184617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/5705429347722184617'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2008/03/argoumls-repository-restructuring.html' title='ArgoUML&apos;s repository restructuring'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-6424497752395526144</id><published>2008-03-08T15:19:00.000Z</published><updated>2008-03-08T15:20:16.940Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><category scheme='http://www.blogger.com/atom/ns#' term='darcs'/><title type='text'>Distributed version control systems</title><content type='html'>&lt;p&gt;Recently I had to use &lt;a href="http://www.selenic.com/mercurial/wiki/"&gt;Mercurial&lt;/a&gt; to checkout the &lt;a href="http://www.netbeans.org"&gt;NetBeans&lt;/a&gt; sources. Well, since the &lt;a href="http://wiki.netbeans.org/HgHowTos"&gt;instructions were for the whole NetBeans repository&lt;/a&gt;, I followed them and I have a local checkout of it. Now NetBeans is big, so, you could think it would take me some hours to get the whole thing, even more, if you consider that it clones the whole repository with the full history. No, it was surprisingly fast and its command line interface is very easy to use.&lt;/p&gt;&lt;p&gt;Alas, I have currently no project where this or other distributed SCMs are used, but, when I get a break from ArgoUML and start experimenting with open source projects from &lt;a href="http://common-lisp.net/"&gt;common-lisp.net&lt;/a&gt; I'll have a good change that they'll be &lt;a href="http://darcs.net/"&gt;darcs&lt;/a&gt; based.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-6424497752395526144?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/6424497752395526144/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=6424497752395526144' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/6424497752395526144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/6424497752395526144'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2008/03/distributed-version-control-systems.html' title='Distributed version control systems'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-6942472034987532948</id><published>2008-03-08T15:14:00.000Z</published><updated>2008-03-08T15:17:33.343Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><category scheme='http://www.blogger.com/atom/ns#' term='MDR'/><category scheme='http://www.blogger.com/atom/ns#' term='debugging'/><title type='text'>Debugging model-mdr</title><content type='html'>&lt;p&gt;In the past 2 months I have been in and out working with other persons to fix the problems in the ArgoUML's subsystem model-mdr (see &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=4946"&gt;issue #4946&lt;/a&gt;). This is a core part of the ArgoUML implementation and it basically wraps &lt;a href="http://mdr.netbeans.org/"&gt;NetBeans MDR&lt;/a&gt; into an implementation of the ArgoUML model subsystem.&lt;/p&gt;&lt;p&gt;MDR is based in &lt;a href="http://java.sun.com/products/jmi/index.jsp"&gt;JMI&lt;/a&gt; (a standard from the Java Community Process), which is itself based in &lt;a href="http://www.omg.org/mof/"&gt;MOF&lt;/a&gt; (a standard from OMG). I was more or less familiar with the ideas behind MOF, but, as always, the devil is in the details and I'm now reading the standard so that I'm not bumping so much on problems.&lt;/p&gt;&lt;p&gt;My lack of knowledge about MOF was made worse by the sources of the several jars from MDR not being included in the ArgoUML repository. Also, unusual for open source projects MDR doesn't make it available as a download - you must checkout the sources with Mercurial (&lt;a href="http://argonauts-life.blogspot.com/2008/03/distributed-version-control-systems.html"&gt;more on this latter&lt;/a&gt;) or CVS. Even so, it doesn't contain the sources for jmi.jar and mof.jar. The MOF and JMI standards don't have a zipped javadoc to help when you bump into unexpected problems in the debugger. All this is making the whole exercise harder than needed!&lt;/p&gt;&lt;p&gt;TODO: get my hands on the jmi.jar and mof.jar sources!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-6942472034987532948?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/6942472034987532948/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=6942472034987532948' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/6942472034987532948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/6942472034987532948'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2008/03/debugging-model-mdr.html' title='Debugging model-mdr'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-2968916772408354530</id><published>2007-12-05T01:22:00.000Z</published><updated>2007-12-19T23:09:07.726Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><title type='text'>2007-12-05</title><content type='html'>&lt;p&gt;I'm working now on &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=4923"&gt;issue #4923&lt;/a&gt; and this requires some measurements of the time the automated headless tests take to run. Thanks to &lt;a href="http://argouml.tigris.org/bios/linus.html"&gt;Linus&lt;/a&gt;' efforts in setting up a continuous integration server this isn't very difficult, I will simply take the latests 10 results from the revisions of the JUnit reports summary and compare them with the next 10 results after making my change in the model-mdr implementation.&lt;/p&gt;&lt;p&gt;So, here are the values and the total average before the change:&lt;/p&gt;&lt;table border="1"&gt;&lt;caption&gt;Before changes, Java 5 tests.&lt;/caption&gt;&lt;tr&gt;&lt;th&gt;revision&lt;/th&gt;&lt;th&gt;Tests&lt;/th&gt;&lt;th&gt;Failures&lt;/th&gt;&lt;th&gt;Errors&lt;/th&gt;&lt;th&gt;Success rate&lt;/th&gt;&lt;th&gt;Time (s)&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java5/junit/overview-summary.html?rev=4456&amp;view=markup"&gt;rev=4456&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1115&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;99.91%&lt;/td&gt;&lt;td&gt;3065.731&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java5/junit/overview-summary.html?rev=4443&amp;view=markup"&gt;rev=4443&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1115&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;99.91%&lt;/td&gt;&lt;td&gt;2921.652&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java5/junit/overview-summary.html?rev=4431&amp;view=markup"&gt;rev=4431&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1115&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;99.91%&lt;/td&gt;&lt;td&gt;2899.956&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java5/junit/overview-summary.html?rev=4408&amp;view=markup"&gt;rev=4408&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1117&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;99.82%&lt;/td&gt;&lt;td&gt;2792.906&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java5/junit/overview-summary.html?rev=4392&amp;view=markup"&gt;rev=4392&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1116&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;99.73%&lt;/td&gt;&lt;td&gt;2789.595&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java5/junit/overview-summary.html?rev=4378&amp;view=markup"&gt;rev=4378&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1116&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2866.223&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java5/junit/overview-summary.html?rev=4367&amp;view=markup"&gt;rev=4367&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1116&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2842.319&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java5/junit/overview-summary.html?rev=4355&amp;view=markup"&gt;rev=4355&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1117&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2861.930&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java5/junit/overview-summary.html?rev=4345&amp;view=markup"&gt;rev=4345&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1117&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2887.080&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java5/junit/overview-summary.html?rev=4340&amp;view=markup"&gt;rev=4340&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1101&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2787.845&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="5" align="center"&gt;&lt;strong&gt;Average time:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;2871.524&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;table border="1"&gt;&lt;caption&gt;Before changes, Java 6 tests.&lt;/caption&gt;&lt;tr&gt;&lt;th&gt;revision&lt;/th&gt;&lt;th&gt;Tests&lt;/th&gt;&lt;th&gt;Failures&lt;/th&gt;&lt;th&gt;Errors&lt;/th&gt;&lt;th&gt;Success rate&lt;/th&gt;&lt;th&gt;Time (s)&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java6/junit/overview-summary.html?rev=4462&amp;view=markup"&gt;4462&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1115&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;99.91%&lt;/td&gt;&lt;td&gt;2715.539&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java6/junit/overview-summary.html?rev=4448&amp;view=markup"&gt;4448&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1115&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;99.91%&lt;/td&gt;&lt;td&gt;2665.635&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java6/junit/overview-summary.html?rev=4437&amp;view=markup"&gt;4437&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1115&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;99.91%&lt;/td&gt;&lt;td&gt;2665.288&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java6/junit/overview-summary.html?rev=4400&amp;view=markup"&gt;4400&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1116&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;99.73%&lt;/td&gt;&lt;td&gt;2526.352&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java6/junit/overview-summary.html?rev=4383&amp;view=markup"&gt;4383&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1116&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2627.562&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java6/junit/overview-summary.html?rev=4372&amp;view=markup"&gt;4372&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1116&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2596.418&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java6/junit/overview-summary.html?rev=4360&amp;view=markup"&gt;4360&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1117&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2651.676&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java6/junit/overview-summary.html?rev=4350&amp;view=markup"&gt;4350&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1117&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2654.227&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java6/junit/overview-summary.html?rev=4332&amp;view=markup"&gt;4332&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1101&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2514.612&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java6/junit/overview-summary.html?rev=4318&amp;view=markup"&gt;4318&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1101&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2509.551&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="5" align="center"&gt;&lt;strong&gt;Average time:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;2612.686&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Tomorrow I'll make tests with ArgoUML running to check if the &lt;code&gt;MDRModelImplementation&lt;/code&gt; constructor is called during its execution and if not I'll commit my changes to MDR. Then, it is a matter of waiting 10 days for the veredict of the performance hit.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Update on 2007-12-19: added averages and results after changes.&lt;/strong&gt;&lt;/p&gt;&lt;table border="1"&gt;&lt;caption&gt;Afer changes, Java 5 tests.&lt;/caption&gt;&lt;tr&gt;&lt;th&gt;revision&lt;/th&gt;&lt;th&gt;Tests&lt;/th&gt;&lt;th&gt;Failures&lt;/th&gt;&lt;th&gt;Errors&lt;/th&gt;&lt;th&gt;Success rate&lt;/th&gt;&lt;th&gt;Time (s)&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java5/junit/overview-summary.html?rev=4611&amp;view=markup"&gt;4611&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1116&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2910.440&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java5/junit/overview-summary.html?rev=4594&amp;view=markup"&gt;4594&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1116&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2917.587&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java5/junit/overview-summary.html?rev=4581&amp;view=markup"&gt;4581&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1116&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2905.284&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java5/junit/overview-summary.html?rev=4570&amp;view=markup"&gt;4570&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1116&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2903.603&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java5/junit/overview-summary.html?rev=4559&amp;view=markup"&gt;4559&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1116&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2898.110&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java5/junit/overview-summary.html?rev=4546&amp;view=markup"&gt;4546&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1116&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2909.500&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java5/junit/overview-summary.html?rev=4533&amp;view=markup"&gt;4533&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1115&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2906.624&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java5/junit/overview-summary.html?rev=4521&amp;view=markup"&gt;4521&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1115&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2904.351&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java5/junit/overview-summary.html?rev=4508&amp;view=markup"&gt;4508&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1115&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2939.427&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java5/junit/overview-summary.html?rev=4496&amp;view=markup"&gt;4496&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1115&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2903.854&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="5" align="center"&gt;&lt;strong&gt;Average time:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;2909.88&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;table border="1"&gt;&lt;caption&gt;Afer changes, Java 6 tests.&lt;/caption&gt;&lt;tr&gt;&lt;th&gt;revision&lt;/th&gt;&lt;th&gt;Tests&lt;/th&gt;&lt;th&gt;Failures&lt;/th&gt;&lt;th&gt;Errors&lt;/th&gt;&lt;th&gt;Success rate&lt;/th&gt;&lt;th&gt;Time (s)&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java6/junit/overview-summary.html?rev=4586&amp;view=markup"&gt;4586&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1116&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2665.922&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java6/junit/overview-summary.html?rev=4575&amp;view=markup"&gt;4575&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1116&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2665.115&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java6/junit/overview-summary.html?rev=4564&amp;view=markup"&gt;4564&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1116&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2660.793&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java6/junit/overview-summary.html?rev=4552&amp;view=markup"&gt;4552&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1116&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2677.356&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java6/junit/overview-summary.html?rev=4538&amp;view=markup"&gt;4538&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1115&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2668.918&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java6/junit/overview-summary.html?rev=4526&amp;view=markup"&gt;4526&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1115&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2677.958&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java6/junit/overview-summary.html?rev=4514&amp;view=markup"&gt;4514&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1115&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2699.183&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java6/junit/overview-summary.html?rev=4501&amp;view=markup"&gt;4501&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1115&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2687.672&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java6/junit/overview-summary.html?rev=4488&amp;view=markup"&gt;4488&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1115&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;100.00%&lt;/td&gt;&lt;td&gt;2630.221&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://argouml-stats.tigris.org/source/browse/argouml-stats/trunk/www/reports-java6/junit/overview-summary.html?rev=4474&amp;view=markup"&gt;4474&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1115&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;99.91%&lt;/td&gt;&lt;td&gt;2757.297&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="5" align="center"&gt;&lt;strong&gt;Average time:&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;2679.04&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;So, a ~2.5% performance hit in Java 6 and a ~1.3% hit under Java 5.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-2968916772408354530?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/2968916772408354530/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=2968916772408354530' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/2968916772408354530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/2968916772408354530'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2007/12/2007-12-05.html' title='2007-12-05'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-8275754426096419957</id><published>2007-11-19T08:00:00.000Z</published><updated>2007-12-05T01:25:00.923Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><title type='text'>2007-11-19</title><content type='html'>&lt;p&gt;While I was testing a &lt;a href="http://argouml-cpp.tigris.org/servlets/ReadMsg?list=dev&amp;msgNo=61"&gt;patch by Lukasz Gromanowski&lt;/a&gt;, &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=4916"&gt;found a bug&lt;/a&gt; in &lt;code&gt;org.argouml.ui.SettingsDialog&lt;/code&gt;. This one is interesting. The contract established by &lt;code&gt;GUISettingsTabInterface&lt;/code&gt; is that implementers will be called when the user saves the configurations. But, that wasn't happening for &lt;code&gt;SettingsTabCpp&lt;/code&gt;. After some debugging and seeing the bug in my front several times I finally understood.&lt;code&gt;SettingsTabCpp&lt;/code&gt; does not extend &lt;code&gt;JPanel&lt;/code&gt; and the &lt;code&gt;SettingsDialog&lt;/code&gt; was only invoking the callback methods of tabs contained by its component &lt;code&gt;tabs&lt;/code&gt; (an object of type &lt;code&gt;JTabbedPane&lt;/code&gt;), which were of type &lt;code&gt;GUISettingsTabInterface&lt;/code&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-8275754426096419957?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/8275754426096419957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=8275754426096419957' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/8275754426096419957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/8275754426096419957'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2007/11/2007-11-19.html' title='2007-11-19'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-8402433690845770776</id><published>2007-11-12T23:50:00.000Z</published><updated>2007-11-13T01:02:38.199Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><title type='text'>My promotion to core developer</title><content type='html'>&lt;p&gt;I was promoted to core developer by &lt;a href="http://argouml.tigris.org/bios/linus.html"&gt;Linus Tolke&lt;/a&gt; and I believe in agreement with the other active core developers &amp;ndash; Bob Tarling, Michiel van der Wulp and Tom Morris. I'm very happy about this and it will be motivating to start working more often in the core of ArgoUML.&lt;/p&gt;&lt;p&gt;Tom sent a very &lt;a href="http://argouml.tigris.org/servlets/ReadMsg?list=dev&amp;msgNo=21384"&gt;warm welcome message&lt;/a&gt; to the developers mailing list. Specifically for my part he refers two features I'm keen to get involved into, the profiles and the support for parameterized classes and UML templates in general. Well, I was already involved, but, now I'm much more motivated to work directly in the core to advance these two features. These are central for ArgoUML to be a good basis for C++ model driven development, which will continue to be my main focus for the future.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-8402433690845770776?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/8402433690845770776/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=8402433690845770776' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/8402433690845770776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/8402433690845770776'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2007/11/my-promotion-to-core-developer.html' title='My promotion to core developer'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-1208550132841572135</id><published>2007-11-12T23:45:00.000Z</published><updated>2007-11-13T01:00:41.709Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><category scheme='http://www.blogger.com/atom/ns#' term='refactoring'/><category scheme='http://www.blogger.com/atom/ns#' term='Singleton'/><title type='text'>Refactoring org.argouml.uml.profile</title><content type='html'>&lt;p&gt;As stated in &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=4885"&gt;issue #4885&lt;/a&gt; and in the &lt;a href="http://argouml.tigris.org/servlets/BrowseList?list=dev&amp;by=thread&amp;from=614778"&gt;dev mailing list thread "org.argouml.uml.profile - success in working from models and improvement proposals"&lt;/a&gt;, I'm working in refactoring the profile sub-subsystem of &lt;a href="http://argouml.tigris.org"&gt;ArgoUML&lt;/a&gt; so that it is possible for modules to define their own profiles. The main problem to get rid of is that there are singletons in it, such as the &lt;a href="http://argouml.tigris.org/source/browse/argouml/trunk/src_new/org/argouml/uml/profile/ProfileManagerImpl.java?rev=13614&amp;view=markup"&gt;&lt;code&gt;ProfileManagerImpl&lt;/code&gt;&lt;/a&gt;. This class is a singleton and besides some very few exceptions singletons are an abused design pattern. More so in Java projects, since Java doesn't support global variables and, guess what, a singleton is a replacement of the humble global variable, even if it is very clumsy and pernicious.&lt;/p&gt;&lt;p&gt;Before proceeding with my rambling about singletons being bad, let me say that I'm very happy with the work contributed by &lt;a href="http://www.marcosaurelio.com/"&gt;Marcos Aurélio&lt;/a&gt;, one of the developers that joined in the Google Summer of Code 2007. The package &lt;a href="http://argouml.tigris.org/source/browse/argouml/trunk/src_new/org/argouml/uml/profile/?rev=13764"&gt;org.argouml.uml.profile&lt;/a&gt; is congruent, being absent of monster classes and methods, with a nice balance between abstractness and implementation classes and with a very pleasant distribution of responsibilities amongst the classes. Furthermore, so far I haven't found a single defect!&lt;/p&gt;&lt;p&gt;The refactoring will be much more easy than what I will have to do to &lt;a href="http://argonauts-life.blogspot.com/2007/10/uff-i-finished-generatorcpp-feature.html"&gt;improve the GeneratorCpp&lt;/a&gt; &amp;ndash; which is a singleton :-( ... and that bring us back to my rambling...&lt;/p&gt;&lt;p&gt;Singletons are clumsy, because instead of one line of code declaring a variable at global scope&lt;a href="#refactoring_argouml_uml_profile_footnote01"&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt;, one line initializing it in some appropriate place of your code and a direct reference from where you want to access it, you now have to define a private constructor, a static accessor method and then, call this method from wherever you need to access it from. It is pernicious because if you wanted to abstract the implementation of the global variable, it won't be possible &amp;ndash; every single user object will now refer to the singleton class directly, even if they don't need to, because one of their owners or more closely related objects could have provided it themselves. Another bad effect is that when eventually the application evolves and you would like to have more than one of those objects, or to have a fresh one for another piece of work or for unit testing, you'll have the singleton and the singleton accessing code stopping you from doing it.&lt;/p&gt;&lt;p&gt;Today I found yet another pernicious effect &amp;ndash; loss of control of initialization order. In my checked out copy I have made a &lt;a href="http://www.extremeprogramming.org/rules/spike.html"&gt;spike&lt;/a&gt; to check if the plan of having the C++ module providing the UML profile for C++ would work based on the recently contributed support provided by &lt;a href="http://www.marcosaurelio.com/"&gt;Marcos Aurélio&lt;/a&gt;. So, in C++ module I have defined a new &lt;a href="http://argouml.tigris.org/source/browse/argouml/trunk/src_new/org/argouml/moduleloader/ModuleInterface.java?rev=11498&amp;view=markup"&gt;&lt;code&gt;ModuleInterface&lt;/code&gt;&lt;/a&gt; implementation that registers a &lt;a href="http://argouml-cpp.tigris.org/source/browse/argouml-cpp/trunk/src/org/argouml/language/cpp/profile/ProfileCpp.java?rev=138&amp;view=markup"&gt;&lt;code&gt;ProfileCpp&lt;/code&gt;&lt;/a&gt; object in the &lt;a href="http://argouml.tigris.org/source/browse/argouml/trunk/src_new/org/argouml/uml/profile/ProfileManagerImpl.java?rev=13614&amp;view=markup"&gt;&lt;code&gt;ProfileManagerImpl&lt;/code&gt;&lt;/a&gt; instance. Now, guess who is now instantiating indirectly both &lt;a href="http://argouml.tigris.org/source/browse/argouml/trunk/src_new/org/argouml/kernel/ProjectManager.java?rev=13559&amp;view=markup"&gt;&lt;code&gt;ProjectManager&lt;/code&gt;&lt;/a&gt; and &lt;a href="http://argouml.tigris.org/source/browse/argouml/trunk/src_new/org/argouml/uml/profile/ProfileManagerImpl.java?rev=13614&amp;view=markup"&gt;&lt;code&gt;ProfileManagerImpl&lt;/code&gt;&lt;/a&gt;? Yeah, the humble C++ module or better indirectly the &lt;a href="http://argouml.tigris.org/source/browse/argouml/trunk/src_new/org/argouml/moduleloader/ModuleLoader2.java?rev=12890&amp;view=markup"&gt;&lt;code&gt;ModuleLoader2&lt;/code&gt;&lt;/a&gt; is doing it! Worst, while at it, I noticed that the order of initialization of modules by &lt;a href="http://argouml.tigris.org/source/browse/argouml/trunk/src_new/org/argouml/moduleloader/ModuleLoader2.java?rev=12890&amp;view=markup"&gt;&lt;code&gt;ModuleLoader2&lt;/code&gt;&lt;/a&gt; seams to be arbitrary. Because &lt;a href="http://argouml-cpp.tigris.org/source/browse/argouml-cpp/trunk/src/org/argouml/language/cpp/ui/SettingsTabCpp.java?rev=137&amp;view=markup"&gt;&lt;code&gt;SettingsCpp&lt;/code&gt;&lt;/a&gt; is also loaded as a module, and it accesses the &lt;a href="http://argouml.tigris.org/source/browse/argouml/trunk/src_new/org/argouml/ui/GUI.java?rev=13614&amp;view=markup"&gt;&lt;code&gt;GUI&lt;/code&gt;&lt;/a&gt; instance, this will also be initialized not by the &lt;a href="http://argouml.tigris.org/source/browse/argouml/trunk/src_new/org/argouml/application/Main.java?rev=13614&amp;view=markup"&gt;&lt;code&gt;Main.main&lt;/code&gt;&lt;/a&gt; in an explicit way, but, indirectly by the &lt;a href="http://argouml-cpp.tigris.org/source/browse/argouml-cpp/trunk/src/org/argouml/language/cpp/ui/SettingsTabCpp.java?rev=137&amp;view=markup"&gt;&lt;code&gt;SettingsCpp&lt;/code&gt;&lt;/a&gt; module.&lt;/p&gt;&lt;p&gt;Isn't this bad?!?&lt;/p&gt;&lt;p&gt;The way to solve this is via explicit initialization of subsystems and subsystems which keep the details for themselves. The best example is the &lt;a href="http://argouml.tigris.org/source/browse/argouml/trunk/src/model/src/org/argouml/model/?rev=13764"&gt;org.argouml.model&lt;/a&gt; subsystem. It provides means for explicit initialization and access to it is via static functions of the &lt;a href="http://argouml.tigris.org/source/browse/argouml/trunk/src/model/src/org/argouml/model/Model.java?rev=13530&amp;view=markup"&gt;&lt;code&gt;Model&lt;/code&gt;&lt;/a&gt; class.&lt;/p&gt;&lt;p&gt;Alas, the Profile subsystem may not need to have several implementations as required from the Model subsystem, so, I won't restrict its implementation so much, such as having only interfaces available for clients, but, I think it will be easier to use and maintain if it looses some of its singletonitis. Check the ideas in &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=4885"&gt;issue #4885&lt;/a&gt; and please send some feedback if you have ideas on how to deal with this differently.&lt;/p&gt;&lt;p&gt;&lt;a name="refactoring_argouml_uml_profile_footnote01"&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; In modern programming languages, &amp;quot;global variables&amp;quot; aren't normally global anymore, since normally they are contained in a specific package or namespace. A pair of good examples is the &lt;code&gt;java.lang.System&lt;/code&gt; in Java and &lt;code&gt;std::cout&lt;/code&gt; in C++. These &amp;quot;globals&amp;quot; aren't frown at and the libraries were design by developers above the average for sure, so, why is an accessible variable so bad?!?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-1208550132841572135?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/1208550132841572135/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=1208550132841572135' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/1208550132841572135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/1208550132841572135'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2007/11/refactoring-orgargoumlumlprofile.html' title='Refactoring org.argouml.uml.profile'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-3269697008716148384</id><published>2007-10-03T22:43:00.001+01:00</published><updated>2008-10-16T21:45:57.666+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++ Module'/><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><category scheme='http://www.blogger.com/atom/ns#' term='monster class'/><category scheme='http://www.blogger.com/atom/ns#' term='refactoring'/><category scheme='http://www.blogger.com/atom/ns#' term='feature sketch'/><category scheme='http://www.blogger.com/atom/ns#' term='legacy code'/><title type='text'>Uff! I finished the GeneratorCpp feature sketch</title><content type='html'>&lt;p&gt;&lt;a href="http://argonauts-life.blogspot.com/2007/09/refactoring-generatorcpp.html"&gt;Previously&lt;/a&gt; I stated that I wanted to refactor the &lt;a href="http://argouml-cpp.tigris.org/source/browse/argouml-cpp/trunk/src/org/argouml/language/cpp/generator/GeneratorCpp.java?rev=133&amp;view=markup"&gt;GeneratorCpp&lt;/a&gt; class. A good way would be to use some techniques I learned from &lt;a href="http://www.objectmentor.com/resources/books.html"&gt;Working Effectively with Legacy Code&lt;/a&gt; by Michael Feathers (2004), particularly, his &lt;a href="http://www.typepad.com/t/trackback/1065164/16231472"&gt;feature sketches&lt;/a&gt;. Well, I worked hard to put the whole class under scrutiny and the result is very depressing (&lt;a href="#generator_cpp_feature_sketch_picture"&gt;see bellow&lt;/a&gt;). Very different from the ones Michael has in &lt;a href="http://michaelfeathers.typepad.com/michael_feathers_blog/2007/02/feature_diagram.html"&gt;his blog post&lt;/a&gt;.&lt;p&gt;Note that I used rectangles for functions and ellipses for variables. This is exactly the opposite from the convention Michael uses in his feature diagrams. My diagram is made in &lt;a href="http://www.openoffice.org/product/draw.html"&gt;OpenOffice.org Draw&lt;/a&gt; and I had to use a A2 page so that everything could fit in a single one. I like this approach because, although it is harder to draw in the first place, when you have it you may drag things, group and ungroup, etc. This is important to identify and make clear the clusters that may be extracted from the monster with less pain. I put it in argouml-cpp doc directory, so, if you get curious, &lt;a href="http://argouml-cpp.tigris.org/source/browse/*checkout*/argouml-cpp/trunk/doc/GeneratorCpp_feature_sketch_association_extract.odg?rev=135"&gt;try it out&lt;/a&gt;.&lt;/p&gt;&lt;p class="figura"&gt;&lt;img src="http://www.fileden.com/files/2008/4/5/1853347/GeneratorCpp_feature_sketch_whole_mess.JPG" width="741" height="525" alt="GeneratorCpp feature sketch."&gt;&lt;/p&gt;&lt;p class="legendaFigura"&gt;&lt;a name="generator_cpp_feature_sketch_picture"&gt;&lt;em&gt;Picture 6&lt;/em&gt;&lt;/a&gt; &amp;ndash; Feature sketch of GeneratorCpp. Rectangles are for methods, ellipses for variables, blue for non-static and red for static. The yellow rectangle to the left denotes a cluster of methods that could easily be extracted, the yellow rectangle in the bottom center contains the methods I wanted to extract related to Associations, but, which are hard to extract from the class.&lt;/p&gt;&lt;p&gt;Don't misunderstand me, feature sketches are one more good thing that I will add to my tool box, but, they must be complemented with other things Michael talks about in his book, such as identifying responsibilities. This is more important if you are dealing with a monster class such as this. Nevertheless, the feature sketch enabled me to see the clusters in the class. Even more important, while I was doing it I reviewed the code in a way I never did before &amp;ndash; actually this was the first time I looked at it from start to end. There are variables that keep pure processing state or context (&lt;code&gt;generatorPass&lt;/code&gt; and &lt;code&gt;actualNamespace&lt;/code&gt;), others that are mostly read and that keep configuration editable by users (e.g., &lt;code&gt;indent&lt;/code&gt;, &lt;code&gt;lfBeforeCurly&lt;/code&gt;, &lt;code&gt;verboseDocs&lt;/code&gt;) and others that store processing results, which are used to generate code that deals with dependencies (e.g., &lt;code&gt;includeCls&lt;/code&gt;, &lt;code&gt;predeclCls&lt;/code&gt;, &lt;code&gt;systemInc&lt;/code&gt;, &lt;code&gt;extInc&lt;/code&gt; and &lt;code&gt;localInc&lt;/code&gt;).&lt;/p&gt;&lt;p&gt;As a bonus I discovered some non-documented features of the generator that might come handy to solve some issues that are mounting up in the issues list. For instance, &lt;a href="http://argouml-cpp.tigris.org/issues/show_bug.cgi?id=22"&gt;issue #22: provide a tagged value for user includes with angle brackets&lt;/a&gt; is handled by method &lt;code&gt;addUserHeaders&lt;/code&gt; if the user places either in source_incl or header_incl tagged values the header name within angle brackets.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-3269697008716148384?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/3269697008716148384/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=3269697008716148384' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/3269697008716148384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/3269697008716148384'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2007/10/uff-i-finished-generatorcpp-feature.html' title='Uff! I finished the GeneratorCpp feature sketch'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-7046999451831185982</id><published>2007-09-17T23:43:00.000+01:00</published><updated>2007-09-17T23:48:54.814+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++ Module'/><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><category scheme='http://www.blogger.com/atom/ns#' term='monster class'/><category scheme='http://www.blogger.com/atom/ns#' term='refactoring'/><category scheme='http://www.blogger.com/atom/ns#' term='feature sketch'/><category scheme='http://www.blogger.com/atom/ns#' term='legacy code'/><title type='text'>Refactoring GeneratorCpp</title><content type='html'>&lt;p&gt;The &lt;a href="http://argouml-cpp.tigris.org/source/browse/argouml-cpp/trunk/src/org/argouml/language/cpp/generator/GeneratorCpp.java?rev=133&amp;view=markup"&gt;GeneratorCpp&lt;/a&gt; class contains almost all the code that is used to provide C++ code generation in the C++ module. The file is over 2900 lines! It will start to get even worst since the support for C++ notation will reuse it, so, we might need to add even more code to it.&lt;/p&gt;&lt;p&gt;It is a &lt;em&gt;monster class&lt;/em&gt;. I know that the responsibility of that class is generating C++ code from a UML model. So, a distant observer could say that this respects the &lt;a href="http://www.objectmentor.com/resources/articles/srp.pdf"&gt;Single Responsibility Principle (SRP)&lt;/a&gt;. But that would be like saying that &lt;a href="http://logging.apache.org/log4j/"&gt;log4j&lt;/a&gt; could be implemented in a single class because it is software that has the responsibility to support logging.&lt;/p&gt;&lt;p&gt;I read the book &lt;a href="http://www.objectmentor.com/resources/books.html"&gt;Working Effectively with Legacy Code&lt;/a&gt; by Michael Feathers (2004) and there he describes very useful techniques on how to refactor such code. I'll apply the feature sketch in my current task, where I have to fix &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=4541"&gt;a bug related to the way the generator deals with associations&lt;/a&gt;, in order to extract some of the methods into a separate class. Then, I'm planning to test if the result is friendly from the perspective of client code from the notation package.&lt;/p&gt;&lt;p&gt;But, before starting to apply a specific technique, I must reason about the responsibilities of the C++ generator. Follows a &amp;ndash; probably incomplete &amp;ndash; list:&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;conversion of the UML constructs into C++ equivalent code  &lt;ul&gt;    &lt;li&gt;operations and methods&lt;/li&gt;    &lt;li&gt;attributes&lt;/li&gt;    &lt;li&gt;packages&lt;/li&gt;    &lt;li&gt;associations &amp;ndash; includes aggregations, compositions,      generalizations&lt;/li&gt;  &lt;/ul&gt;  &lt;li&gt;documentation&lt;/li&gt;  &lt;li&gt;tagged values&lt;/li&gt;  &lt;li&gt;coordination of the code generation for a class&lt;/li&gt;  &lt;li&gt;C++ notation support&lt;/li&gt;  &lt;li&gt;indentation&lt;/li&gt;  &lt;li&gt;generation of header files&lt;/li&gt;  &lt;li&gt;generation of source files&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Many of these responsibilities interact and depend on each other. Because it is all contained in one class, all is getting mangled into a huge mess, although I can understand that it seams easier this way, I also think that this is simply at the surface.&lt;/p&gt;&lt;p&gt;My idea for now is too separate the aggregation and composition parts from the rest. But, it is difficult because there are parts in the methods that deal with these two things that also deal with indentation and documentation. This is messy because when I'm generating code I want it to use the indentation options selected by the user, but, when I'm providing C++ notation support I want them not to indent things and not to insert C++ headers into the required headers list. So, I'll look at the methods that support these things and use the feature sketch technique to understand how to isolate some parts.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-7046999451831185982?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/7046999451831185982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=7046999451831185982' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/7046999451831185982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/7046999451831185982'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2007/09/refactoring-generatorcpp.html' title='Refactoring GeneratorCpp'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-7757140996852731206</id><published>2007-05-12T23:47:00.000+01:00</published><updated>2007-09-14T00:53:39.642+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='common lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='siscog'/><category scheme='http://www.blogger.com/atom/ns#' term='open source projects'/><title type='text'>New job and Common Lisp</title><content type='html'>&lt;p&gt;I recently started in a new job where we use &lt;a href="http://en.wikipedia.org/wiki/Common_Lisp"&gt;Common Lisp&lt;/a&gt; as the programming language for all the core work. The company is &lt;a href="http://www.siscog.pt"&gt;SISCOG&lt;/a&gt; and it sells software for planning the Human Resources of train companies. In SISCOG they provided an intense 3 weeks course on Common Lisp, but, due to legal and project schedule constraints in my previous work at &lt;a href="http://www.nokiasiemensnetworks.com/"&gt;Nokia Siemens Networks&lt;/a&gt;, I only participated in the last day of the course. So, now, I'm learning on the job and by my own in my free time. I'm reading &lt;a href="http://www.gigamonkeys.com/book/"&gt;Practical Common Lisp&lt;/a&gt;, using &lt;a href="http://common-lisp.net/project/lispbox/"&gt;Lisp in a box&lt;/a&gt;, and &lt;a href="http://www.franz.com/products/allegrocl/"&gt;Franz's Allegro CL&lt;/a&gt; and it is going alright. &lt;/p&gt;&lt;p&gt;Because I was used to developing in &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; I'm not finding so hard to get used to Common Lisp, even with the very different syntax. The main thing is being used to working in a dynamic language. Ah, and the Lisp prompt &amp;ndash; or REPL in Lisp terms &amp;ndash; is very good.&lt;/p&gt;&lt;p&gt;The hard thing is to get used to the libraries and toolset to the point where I'm so productive as I was in my previous environment (Java and Eclipse). Now I'm using &lt;a href="http://www.gnu.org/software/emacs/"&gt;emacs&lt;/a&gt; as the editor and Allegro/emacs as the IDE. Besides the GUI framework that comes with Allegro, everything is internal to SISCOG, so, I have a lot to learn. And from my previous experience, the best way to do it effectivelly is by participation in an open source project. There you normally get into contact to the best software engineering practices and best user / developers relationship that is possible. So, I already looked around and my two candidates for now are:&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;&lt;a href="http://maxima.sourceforge.net/index.shtml"&gt;Maxima&lt;/a&gt;   &amp;ndash; a computer algebra system.  &lt;/li&gt;  &lt;li&gt;&lt;a href="http://common-lisp.net/project/closer/index.html"&gt;Closer&lt;/a&gt;   &amp;ndash; contains a framework for Aspect Oriented Programming in Common   Lisp.  &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-7757140996852731206?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/7757140996852731206/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=7757140996852731206' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/7757140996852731206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/7757140996852731206'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2007/05/new-job-and-common-lisp.html' title='New job and Common Lisp'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-7821159090914262161</id><published>2007-04-29T23:00:00.000+01:00</published><updated>2007-06-16T01:19:56.445+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++ Module'/><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><category scheme='http://www.blogger.com/atom/ns#' term='UML profile for C++'/><title type='text'>Past and near future development  activities in the C++ module</title><content type='html'>&lt;p&gt;I didn't progressed much in the development of the C++ module during 2006. It was a fire fighting year in terms of my day to day job and I invested a lot of time and energy in getting the fire down and (IMHO) trying to get a rightfully deserved raise in salary. Alas, I'm now in a different job, but, lets talk about the progresses (humble, but, nevertheless some) in the C++ module...&lt;/p&gt;&lt;p&gt;The main problem I worked on was the fact that the C++ notation was gone by mid of the previous year. I think that in &lt;a href="http://argouml-downloads.tigris.org/argouml-0.22/"&gt;ArgoUML 0.22&lt;/a&gt; it wasn't available. So, I worked on fixing it for &lt;a href="http://argouml-downloads.tigris.org/argouml-0.24/"&gt;ArgoUML 0.24&lt;/a&gt; because &lt;em&gt;I hate regressions&lt;/em&gt;!&lt;/p&gt;&lt;p&gt;Some minor bugs were found (&lt;a href="http://argouml-cpp.tigris.org/issues/show_bug.cgi?id=4"&gt;4&lt;/a&gt;, &lt;a href="http://argouml-cpp.tigris.org/issues/show_bug.cgi?id=5"&gt;5&lt;/a&gt;, &lt;a href="http://argouml-cpp.tigris.org/issues/show_bug.cgi?id=6"&gt;6&lt;/a&gt;, &lt;a href="http://argouml-cpp.tigris.org/issues/show_bug.cgi?id=7"&gt;7&lt;/a&gt;, &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=4541"&gt;4541&lt;/a&gt;), some of them were fixed (&lt;a href="http://argouml-cpp.tigris.org/issues/show_bug.cgi?id=5"&gt;5&lt;/a&gt;, &lt;a href="http://argouml-cpp.tigris.org/issues/show_bug.cgi?id=6"&gt;6&lt;/a&gt;), there is a &lt;a href="http://argouml-cpp.tigris.org/issues/show_bug.cgi?id=3"&gt;request for enumeration support&lt;/a&gt; (not yet done), etc.&lt;/p&gt;&lt;p&gt;Now, my main focus is in getting an &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=3771"&gt;old issue&lt;/a&gt; fixed and unify the handling of special &lt;code&gt;TaggedValues&lt;/code&gt; in the &lt;code&gt;generator&lt;/code&gt; and &lt;code&gt;reveng&lt;/code&gt; modules into the &lt;a href="http://argonauts-life.blogspot.com/2005/08/drop-1-updated-plan-version-5.html#uml_profile_4_cpp_v5"&gt;UML profile for C++&lt;/a&gt;. This is turning out to be easier than I expected due to the improvements introduced during the last year into the &lt;code&gt;model&lt;/code&gt; sub-system. I'll simply put the UML profile for C++ (UMLprof4C++) into the C++ module jar, load it into a separate model and use its services from the &lt;code&gt;generator&lt;/code&gt;, &lt;code&gt;reveng&lt;/code&gt; and &lt;code&gt;ui&lt;/code&gt; modules.&lt;/p&gt;&lt;p&gt;Many hard coded values for &lt;code&gt;TaggedValue&lt;/code&gt; names are going away, the code of &lt;code&gt;generator&lt;/code&gt; and &lt;code&gt;reveng&lt;/code&gt; modules will deal with similar problems by using common services and the users will have an easy way to import the full UMLprof4C++ &lt;code&gt;Stereotypes&lt;/code&gt; from the C++ Settings. And I think that now that I have more energy to devote to ArgoUML this will be available for 0.26.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-7821159090914262161?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/7821159090914262161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=7821159090914262161' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/7821159090914262161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/7821159090914262161'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2007/04/past-and-near-future-development.html' title='Past and near future development  activities in the C++ module'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-8795330124827384722</id><published>2007-04-29T22:46:00.000+01:00</published><updated>2007-04-29T23:27:46.297+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogger'/><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><category scheme='http://www.blogger.com/atom/ns#' term='htmled'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Improving the usability of htmled</title><content type='html'>&lt;p&gt;I have to improve the usability of my &lt;a href="http://argonauts-life.blogspot.com/2006/02/htmled-revisited-handbook-entries-to.html"&gt;htmled&lt;/a&gt; &lt;a href="http://www.python.org"&gt;Python&lt;/a&gt; module! Currently I have to do something like this:&lt;/p&gt;&lt;pre&gt;&amp;gt;&amp;gt;&amp;gt; from htmled import *&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; hbf = HbFile(open("c:/luis/documentos/cadernos/programacao/ficheiro04.html"))&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; pe = PostExtractor(hbf)&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; from datetime import date&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; posts = pe.getPosts(date(2006, 12, 1), date(2007, 5, 1))&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; print posts[0]&lt;br&gt;### here a pretty print of post 0, easy to copy paste into Blogger will be available&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; print posts[1]&lt;br&gt;### ditto for post 1&lt;/pre&gt;&lt;p&gt;I'm not very put off by having the python shell as UI. It is comfortable for me and I like its feeling as much as other more normal persons like their GUI applications such as ArgoUML. But, there are some things which I could easily optimize such as not having to write the name of the Handbook File, just select which Handbook I want to make blog posts from. Another thing is to have the posts immediately available for selection with an easier way to specify.&lt;/p&gt;&lt;p&gt;In addition there is a nasty bug in the parser, which includes the original Handbook File footer into the last post. These are sufficient reasons for an additional iteration on &lt;a href="http://argonauts-life.blogspot.com/2006/02/htmled-revisited-handbook-entries-to.html"&gt;htmled&lt;/a&gt;. I'll plan for it as soon as I finish &lt;a href="http://argonauts-life.blogspot.com/2007/04/past-and-near-future-development.html"&gt;some stuff in the ArgoUML C++ module&lt;/a&gt; I've been working on in the past weeks.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-8795330124827384722?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/8795330124827384722/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=8795330124827384722' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/8795330124827384722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/8795330124827384722'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2007/04/improving-usability-of-htmled.html' title='Improving the usability of htmled'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-4067302122987931800</id><published>2007-04-26T23:45:00.000+01:00</published><updated>2007-04-27T06:22:54.558+01:00</updated><title type='text'>Argonaut's life lost its   images</title><content type='html'>&lt;p&gt;My previous e-mail and static web hosting provider (&lt;a href="http://www.zmail.pt/"&gt;zmail&lt;/a&gt;) was discontinued by its &lt;a href="http://www.zsystems.pt/"&gt;parent company Zsystems&lt;/a&gt;.It was a pitty because at the time it actually worked, they were ahead of Google in what concerns advanced functionality &amp;ndash; 10 GB of space for shared services such as e-mail, static web hosting, XFTP (important in Portugal because the internet service providers have international traffic ceilings).It seamed to me that they even had some non-portuguese customers paying 12 euros per year.&lt;/p&gt;&lt;p&gt;It is a common lack of vision and courage over here not to invest in such a popular and front runner service.They probably were a bit scared when Google started to be a no-cost competitor, but, for a person like me their service offering isn't yet equaled by Google or by any other service provider...&lt;p&gt;Alas, now the Argonaut's life blog has no pictures. I'm considering my options for placement of this kind of content, but, I would like to improve my online presence a bit, like having a CV online as well as references to this blog.&lt;/p&gt;&lt;p&gt;So, if you were wondering why these pages have no carefully crafted diagrams from ArgoUML, here, you now know why!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-4067302122987931800?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/4067302122987931800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=4067302122987931800' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/4067302122987931800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/4067302122987931800'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2007/04/argonauts-life-lost-its-images.html' title='Argonaut&apos;s life lost its   images'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-464385969935445155</id><published>2007-04-26T23:30:00.000+01:00</published><updated>2007-04-27T06:22:10.094+01:00</updated><title type='text'>Making icons for ArgoUML</title><content type='html'>&lt;p&gt;This entry comes a lot after the fact, but, nevertheless, it contains important details on how to get good icons for the ArgoUML GUI.Thanks to Michiel van der Wulp for supporting me on this work with icons in specific and implementing the C++ Notation in general.By mid of 2006 I detected that the C++ notation wasn't working no more in the ArgoUML diagrams and created &lt;a href="http://argouml-cpp.tigris.org/issues/show_bug.cgi?id=2"&gt;issue #2 in the C++ module issues DB&lt;/a&gt;.The whole Notation sub-system was refactored by Michiel and the C++ module had to adapt.So, to make a long story short, I needed to create an icon for the C++ notation as part of the work and what follows is a recipe on how to do it:&lt;/p&gt;&lt;p&gt;Note: these instructions are for Windows. If you're on Linux, you'll have to look elsewhere.&lt;/p&gt;&lt;ol&gt;  &lt;li&gt;Start from one of   &lt;a href="http://argouml.tigris.org/source/browse/argouml/trunk/src_new/org/argouml/Images/"&gt;the icons stored in the Images directory&lt;/a&gt;   of the source code.&lt;/li&gt;  &lt;li&gt;Using MS Paint, you'll draw the icon according to your artistic   capabilities.   For this you'll have easier time by using gigantic zoom like 800%.&lt;/li&gt;  &lt;li&gt;Then, use &lt;a href="http://www.irfanview.com/"&gt;IrfanView&lt;/a&gt; to reduce   the color depth to 4 colors and to set the transparent colour.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;But, if you want to see the whole story of having Notation icons working from ArgoUML modules, you'll have to use the a different loading code than what is used in core argouml code. Please check the code in &lt;a href="http://argouml-cpp.tigris.org/source/browse/argouml-cpp/trunk/src/org/argouml/language/cpp/notation/NotationModuleCpp.java?view=markup"&gt;NotationModuleCpp.java&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I hope this tiny cookbook helps others and avoids core developers having to answer to trivial questions again. And once more, all credit besides writing this tutorial goes to Michiel, who helped me a lot while I was doing this.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-464385969935445155?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/464385969935445155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=464385969935445155' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/464385969935445155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/464385969935445155'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2007/04/making-icons-for-argouml.html' title='Making icons for ArgoUML'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-116302900833970783</id><published>2006-11-06T23:32:00.000Z</published><updated>2006-11-08T23:36:48.343Z</updated><title type='text'>ArgoUML and OpenUsability</title><content type='html'>&lt;p&gt;I found out about the &lt;a href="http://www.openusability.org"&gt;OpenUsability&lt;/a&gt; initiative in one of the &lt;a href="http://blogs.thoughtworks.com"&gt;ThoughtWorks blogs&lt;/a&gt; &amp;ndash; &lt;a href="http://josh.ev9.org/weblog/archives/408"&gt;Josh Evnin's&lt;/a&gt;&amp;ndash; and immediately proposed it for ArgoUML. Linus finds this a good idea and I'm going to act now as a proxy between ArgoUML and OpenUsability.This is somewhat more work, but, due to one reason and another I'm getting much more sensitive to this whole usability issue and it is growing in importance in my internal priority queue.&lt;/p&gt;&lt;p&gt;One reason is due to my current work, where I'm working in the development of a planning tool for WDM networks. For historical reasons the usability wasn't a concern in the beginning and it continued to be so for a while (years) until the negative feedback from the users started hitting the development project. One of the issues is the lack of Undo\Redo capability, which is also a problem in ArgoUML.&lt;/p&gt;&lt;p&gt;Another reason is that I'm reaching a time in my professional life where I've been sufficiently exposed to good and nice to use user interfaces and bad ones to give this usability issue the importance it deserves. I now see and understand that usability isn't only about GUIs. Quite the contrary, usability may reveal itself in a command line interface, a library API and whatever is the interface to the users of some given software deliverable.&lt;/p&gt;&lt;p&gt;An example was shown to me just some minutes ago, when I tried to &lt;a href="http://argonauts-life.blogspot.com/2006/11/automating-svn-update-and-build.html"&gt;automate the build steps in the Windows shell&lt;/a&gt;. I have a batch file which fails to do what I ask and simply doesn't provide any help! That's a bad user interface and I just got hit... I tried to fix it by trial and error to quit and switch to the cygwin environment, where AFAIK these things work better.This is what usability is all about, helping our users to solve their problems in using our software.It is THAT important!&lt;/p&gt;&lt;p&gt;The root cause for some software to be bad to its users is lack of a user oriented attitude of the development project.I've found some of the signals of this to be:&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;The management doesn't use the software and its attitude is more oriented   to fulfilling the contract and process than to actually help the users to   fulfill their objectives.&lt;/li&gt;  &lt;li&gt;The developers don't have a global concern for the usability of the   application, being more preoccupied with their little small component than to   the emerging consistency of the user interface of the application.   [Frederick P. Brooks in his "The Mythical Man-Month" book, chapter 9,   page 100 of the 20th anniversary edition,    says &lt;q&gt;Fostering a total-system, user-oriented attitude may well be the   most important function of the programming manager.&lt;/q&gt;]   You may check it by the way the application provides error information and   the differences in behavior from one functional area to another.&lt;/li&gt;  &lt;li&gt;The development process doesn't include steps where feedback is gathered   from the users. They only get access to the software when the development   project thinks it is finished or they get it sooner, but, with a whole list of   disclaimers basically stating that if it gets out of the box and bites your   head off bad luck for you. It doesn't include a polite message asking   for feedback from users and how they can do it.&lt;/li&gt;  &lt;li&gt;Direct contact between the development team and users of the software is   discouraged, unless explicitly organized and carefully controlled by the   management.&lt;/li&gt;  &lt;li&gt;There is no access (or it is relatively hard to get it) to the bug and   issues list.   There are no users forums and no FAQ.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I think that one of the positive things of the agile manifesto is the focus on providing value to the users and fostering conversation and collaboration. I contrast this with the typical silo approach of the majority of the development projects in the industry, where there are a bunch of persons who are allowed to interact with the users. These screen out direct communication, not because it affects negatively the productivity of the persons developing the work, but, because it enables "better" control of the user/client interaction.&lt;/p&gt;&lt;p&gt;It isn't something that only the development side must work out, also it is common that the user side has the tendency to get inside info from informal communication channels and use it for finger pointing and contract revoking, so, this &lt;em&gt;new old way of working&lt;/em&gt; requires maturity and good common sense from both sides.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-116302900833970783?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/116302900833970783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=116302900833970783' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/116302900833970783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/116302900833970783'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2006/11/argouml-and-openusability.html' title='ArgoUML and OpenUsability'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-116302862339961477</id><published>2006-11-06T08:28:00.000Z</published><updated>2006-11-08T23:30:23.413Z</updated><title type='text'>Automating the svn update and build process of ArgoUML</title><content type='html'>&lt;p&gt;As for the majority of persons working in open source projects I get to work only some 2 or 3 hours in ArgoUML at a time. When I start working I like to get up-to-date with the current trunk of ArgoUML and its projects. This is a process that takes normally about 20 minutes and includes:&lt;/p&gt;&lt;ol&gt;  &lt;li&gt;svn update of all checked out projects of ArgoUML&lt;/li&gt;  &lt;li&gt;build and run the tests of all relevant (for me) projects&lt;/li&gt;  &lt;li&gt;check the results and fix problems (this isn't needed normally :-))&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The first and second steps are easy to automate, just create shell scripts that contains the individual updates and build commands.&lt;/p&gt;&lt;p&gt;&lt;code&gt;&amp;lt;dir_for_co&amp;gt;\svnupdt.bat&lt;/code&gt;:&lt;/p&gt;&lt;p&gt;&lt;code&gt;svn update argoeclipse&lt;/code&gt;&lt;br&gt;&lt;code&gt;svn update argouml&lt;/code&gt;&lt;br&gt;&lt;code&gt;svn update argouml-andromda&lt;/code&gt;&lt;br&gt;&lt;code&gt;svn update argouml-classfile&lt;/code&gt;&lt;br&gt;&lt;code&gt;svn update argouml-cpp&lt;/code&gt;&lt;br&gt;&lt;code&gt;svn update argouml-csharp&lt;/code&gt;&lt;br&gt;&lt;code&gt;svn update argouml-gen&lt;/code&gt;&lt;br&gt;&lt;code&gt;svn update argouml-idl&lt;/code&gt;&lt;br&gt;&lt;code&gt;svn update argouml-python&lt;/code&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;&amp;lt;dir_for_co&amp;gt;\build.bat&lt;/code&gt; [&lt;strong&gt;Note that this isn't working yet, help would be appreciated!&lt;/strong&gt;]:&lt;/p&gt;&lt;p&gt;&lt;code&gt;cd argouml\src_new&lt;/code&gt;&lt;br&gt;&lt;code&gt;build package alltests&lt;/code&gt;&lt;br&gt;&lt;code&gt;cd ..\..\argouml-cpp&lt;/code&gt; [fails here, this step isn't executed]&lt;br&gt;&lt;code&gt;build tests&lt;/code&gt;&lt;br&gt;&lt;code&gt;cd ..&lt;/code&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/9682471-116302862339961477?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/116302862339961477/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=116302862339961477' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/116302862339961477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/116302862339961477'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2006/11/automating-svn-update-and-build.html' title='Automating the svn update and build process of ArgoUML'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-116268687862240104</id><published>2006-11-02T23:32:00.000Z</published><updated>2006-11-05T00:34:38.633Z</updated><title type='text'>2006-11-02</title><content type='html'>&lt;p&gt;I've finally been able to restart working in &lt;a href="http://argouml.tigris.org"&gt;ArgoUML&lt;/a&gt;! The module is in the new &lt;a href="http://subversion.tigris.org"&gt;Subversion&lt;/a&gt; repository, and I tried to follow the instructions to checkout with eclipse. It was after several failures that I got back to the good old command line and in 1:30 hours it was checkout (argouml and &lt;a href="http://argouml-cpp.tigris.org"&gt;argouml-cpp&lt;/a&gt;) with my tigris user, built and unit tested.Here follows the steps:&lt;/p&gt;&lt;p&gt;&lt;code&gt;&amp;lt;dir_for_co&amp;gt;&amp;gt;svn co --username USER --password PASS http://argouml.tigris.org/svn/argouml/trunk argouml&lt;/code&gt;&lt;br&gt;&lt;code&gt;&amp;lt;dir_for_co&amp;gt;&amp;gt;svn co --username USER --password PASS http://argouml-cpp.tigris.org/svn/argouml-cpp/trunk argouml-cpp&lt;/code&gt;&lt;br&gt;&lt;code&gt;&amp;lt;dir_for_co&amp;gt;&amp;gt;cd argouml\src_new&lt;/code&gt;&lt;br&gt;&lt;code&gt;&amp;lt;dir_for_co&amp;gt;argouml\src_new&amp;gt;build package&lt;/code&gt;&lt;br&gt;&lt;code&gt;&amp;lt;dir_for_co&amp;gt;argouml\src_new&amp;gt;cd ..\..\argouml-cpp&lt;/code&gt;&lt;br&gt;&lt;code&gt;&amp;lt;dir_for_co&amp;gt;argouml-cpp\&amp;gt;ant tests&lt;/code&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Then point your browser to &lt;code&gt;file:///&amp;lt;dir_for_co&amp;gt;/argouml-cpp/build/tests/reports/html/index.html&lt;/code&gt; and check if all is well. Note that I had to use &lt;a href="http://ant.apache.org"&gt;Ant&lt;/a&gt; directly, because there is something wrong for me in the way the BAT files are working.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-116268687862240104?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/116268687862240104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=116268687862240104' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/116268687862240104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/116268687862240104'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2006/11/2006-11-02.html' title='2006-11-02'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-116017886244668641</id><published>2006-10-06T23:51:00.000+01:00</published><updated>2006-10-08T22:43:51.080+01:00</updated><title type='text'>On Algorithms</title><content type='html'>&lt;p&gt;Almost after 4 months of silence its time to get back at taking notes about &lt;a href="http://www.argouml.org"&gt;ArgoUML&lt;/a&gt; and my adventures in software development. I'll do a retrospective on what I've been doing another time. Currently I want to document one very interesting thing that is common knowledge, but, that have reveal to me again today. Don't optimize without having measurements before. Or stated in its full glory: &lt;a href="http://en.wikipedia.org/wiki/Software_optimization"&gt;Premature optimization is the root of all evil.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I was working in solving one of the &lt;a href="http://www.google.com/codejam/"&gt;Google Code Jam 2006&lt;/a&gt; excercises. &amp;ndash;If you are curious I was very unsuccessful in my attempt to solve this in the one hour they give you to solve. &amp;ndash; It is the SquareCounting problem and I tried to solve it in Java, in a Test Driven Development way. After my failure to provide anything near a solution to the problem, I kept trying to solve it and I think that now I have a solution and I was making some simple efficiency measures to check what was the performance of my solution according to the &lt;a href="http://en.wikipedia.org/wiki/Big_O_notation"&gt;Big O notation&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;After having this setup and with 10 different measures, I started making a very simple change that I thought would bring immediate improvements. Alas, it made it worst by a factor of 3 for some cases! I'm very happy to have started measuring before any changes. So, now have a personal experience backing the idea that premature optimization is evil.&lt;/p&gt;&lt;p&gt;My solution doesn't use any linear algebra ideas, but, I think it should. The thing is, now I have the possibility to decide on the best based on actual measurements and detailed test cases. This kind of problem solving is proving to be fun.&lt;/p&gt; &lt;p&gt;Oh, forgot to show you the measurements. N is the number of elements in the square. Sol is the number of squares and the time in miliseconds for executing the tests 100.000 times. The results before the change:&lt;/p&gt; &lt;table border="1" cellpadding="3"&gt;  &lt;tr&gt;&lt;th&gt;N&lt;/th&gt;&lt;th&gt;Sol&lt;/th&gt;&lt;th&gt;Time (ms)&lt;/th&gt;&lt;/tr&gt;  &lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;391&lt;/td&gt;&lt;/tr&gt;  &lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;593&lt;/td&gt;&lt;/tr&gt;  &lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;360&lt;/td&gt;&lt;/tr&gt;  &lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;422&lt;/td&gt;&lt;/tr&gt;  &lt;tr&gt;&lt;td&gt;100&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;3843&lt;/td&gt;&lt;/tr&gt;  &lt;tr&gt;&lt;td&gt;90&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;5672&lt;/td&gt;&lt;/tr&gt;  &lt;tr&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;1297&lt;/td&gt;&lt;/tr&gt;  &lt;tr&gt;&lt;td&gt;25&lt;/td&gt;&lt;td&gt;25&lt;/td&gt;&lt;td&gt;1766&lt;/td&gt;&lt;/tr&gt;  &lt;tr&gt;&lt;td&gt;36&lt;/td&gt;&lt;td&gt;30&lt;/td&gt;&lt;td&gt;3156&lt;/td&gt;&lt;/tr&gt;  &lt;tr&gt;&lt;td&gt;42&lt;/td&gt;&lt;td&gt;35&lt;/td&gt;&lt;td&gt;3625&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;And after the "improvements":&lt;/p&gt;&lt;table border="1" cellpadding="3"&gt;  &lt;tr&gt;&lt;th&gt;N&lt;/th&gt;&lt;th&gt;Sol&lt;/th&gt;&lt;th&gt;Time (ms)&lt;/th&gt;&lt;/tr&gt;  &lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;265&lt;/td&gt;&lt;/tr&gt;  &lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;438&lt;/td&gt;&lt;/tr&gt;  &lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;281&lt;/td&gt;&lt;/tr&gt;  &lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;297&lt;/td&gt;&lt;/tr&gt;  &lt;tr&gt;&lt;td&gt;100&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;2656&lt;/td&gt;&lt;/tr&gt;  &lt;tr&gt;&lt;td&gt;90&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;7047&lt;/td&gt;&lt;/tr&gt;  &lt;tr&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;1610&lt;/td&gt;&lt;/tr&gt;  &lt;tr&gt;&lt;td&gt;25&lt;/td&gt;&lt;td&gt;25&lt;/td&gt;&lt;td&gt;3859&lt;/td&gt;&lt;/tr&gt;  &lt;tr&gt;&lt;td&gt;36&lt;/td&gt;&lt;td&gt;30&lt;/td&gt;&lt;td&gt;6594&lt;/td&gt;&lt;/tr&gt;  &lt;tr&gt;&lt;td&gt;42&lt;/td&gt;&lt;td&gt;35&lt;/td&gt;&lt;td&gt;8625&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-116017886244668641?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/116017886244668641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=116017886244668641' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/116017886244668641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/116017886244668641'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2006/10/on-algorithms.html' title='On Algorithms'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-115021548475488870</id><published>2006-06-13T17:11:00.001+01:00</published><updated>2008-10-16T21:54:26.464+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><category scheme='http://www.blogger.com/atom/ns#' term='htmled'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Design of htmled and improvement opportunities</title><content type='html'>&lt;p&gt;So, how complicated do you think htmled might be? This simple 1000 liner program does very simple content extraction and transformation (see &lt;a href="http://argonauts-life.blogspot.com/2005_05_01_argonauts-life_archive.html#htmled_06"&gt;htmled, the handbook editor blog and publisher&lt;/a&gt; and &lt;a href="http://argonauts-life.blogspot.com/2006/02/htmled-revisited-handbook-entries-to.html"&gt;htmled revisited &amp;ndash; Handbook entries to blog posts automated&lt;/a&gt;). It doesn't leave the HTML format, no concurrency, no database and no distribution. So, if you're a &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; developer you might simply look at the &lt;a href="http://www.fileden.com/files/2008/4/5/1853347/htmled.py"&gt;code&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;But, as an ArgoUML developer and user, prior to start doing TDD on htmled, I made some simple diagrams which I kept up-to-date for documentation purposes. The following UML class diagram shows the basic data structure, with correspoding classes existing in &lt;a href="http://www.fileden.com/files/2008/4/5/1853347/htmled.py"&gt;htmled.py&lt;/a&gt;. The &lt;code&gt;HbFile&lt;/code&gt; represents a Handbook file, using &lt;code&gt;HbFileParser&lt;/code&gt; to parse the file into &lt;code&gt;HbDailyEntries&lt;/code&gt; which by thenselves are composed of &lt;code&gt;HbSubjectEntries&lt;/code&gt;. I normally load &lt;code&gt;htmled&lt;/code&gt; in the Python shell, create &lt;code&gt;HbFile&lt;/code&gt;(s) and then use a &lt;code&gt;PostExtractor&lt;/code&gt; to extract &lt;code&gt;Posts&lt;/code&gt; from the handbook files.&lt;/p&gt;&lt;p class="figura"&gt;&lt;img src="http://www.fileden.com/files/2008/4/5/1853347/htmled_11_design_classes.png" width="589" height="295" alt="htmled classes"&gt;&lt;/p&gt;&lt;p class="legendaFigura"&gt;&lt;em&gt;Picture 4&lt;/em&gt; &amp;ndash; htmled main classes diagram.&lt;/p&gt;&lt;p&gt;The complexity lies a bit in the &lt;code&gt;PostExtractor&lt;/code&gt; and very much in the &lt;code&gt;HbFileParser&lt;/code&gt; and its associated classes. Specifically, for parsing a handbook file I used the &lt;code&gt;HTMLParser&lt;/code&gt; module contained in the Python standard library and the State design pattern I read about in &lt;a href="http://www.objectmentor.com/resources/books.html"&gt;Robert C. Martin's Agile Software Development book&lt;/a&gt;. For this you may check the UML state diagram I draw when trying to model the Finite State Machine for handbook file parsing &amp;ndash; check the &lt;code&gt;HbFileParsing&lt;/code&gt; class in &lt;a href="http://www.fileden.com/files/2008/4/5/1853347/htmled.py"&gt;htmled&lt;/a&gt;.&lt;/p&gt;&lt;p class="figura"&gt;&lt;img src="http://www.fileden.com/files/2008/4/5/1853347/htmled_11_HbParsingFSM.png" width="492" height="334" alt="htmled Handbook File Parsing Finite State Machine"&gt;&lt;/p&gt;&lt;p class="legendaFigura"&gt;&lt;em&gt;Picture 5&lt;/em&gt; &amp;ndash; htmled Handbook File Parsing Finite State Machine.&lt;/p&gt;&lt;p&gt;The use of the state pattern and &lt;code&gt;HTMLParser&lt;/code&gt; for parsing the handbook files is definitelly better than a &amp;quot;reinvent the wheel&amp;quot; approach, but, I think it isn't the most appropriate way of solving this problem. I think that I should have tried to use &lt;a href="http://www.antlr.org/"&gt;ANTLR&lt;/a&gt; for parsing, creating an AST and then extracting the required info from there, e.g., &lt;code&gt;DailyEntries&lt;/code&gt;. If I revisit this project again due to ambitions related to imroving its functionalities I might very well do just this as a warm-up!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-115021548475488870?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/115021548475488870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=115021548475488870' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/115021548475488870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/115021548475488870'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2006/06/design-of-htmled-and-improvement.html' title='Design of htmled and improvement opportunities'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-115021497296363749</id><published>2006-05-03T17:07:00.000+01:00</published><updated>2006-06-13T17:09:32.983+01:00</updated><title type='text'>Postmorten of   htmled</title><content type='html'>&lt;p&gt;I measured the recent work on htmled with &lt;a href="http://processdash.sourceforge.net/index.html" class="ligacao"&gt;Process Dashboard&lt;/a&gt;'s PSP0. Since I want to continue evolving the project, I think I'll have a good opportunity to try to improve the effort estimations and the planning.&lt;/p&gt;&lt;p&gt;So, lets resume the results:&lt;/p&gt;&lt;h4&gt;Time&lt;/h4&gt;&lt;table border="1" cellpadding="3"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;br&gt;&lt;/td&gt;&lt;td align="center" valign="bottom"&gt;&lt;b&gt;Plan&lt;/b&gt;&lt;/td&gt;&lt;td align="center" valign="bottom"&gt;&lt;b&gt;Actual&lt;/b&gt;&lt;/td&gt;&lt;td align="center" valign="bottom"&gt;&lt;b&gt;Actual %&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;Planning&lt;/td&gt;&lt;td&gt;24&lt;br&gt;&lt;/td&gt;&lt;td&gt;93&lt;br&gt;&lt;/td&gt;&lt;td&gt;9.35%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;High-level Design&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;High-level Design Review&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;Detailed Design&lt;/td&gt;&lt;td&gt;120&lt;br&gt;&lt;/td&gt;&lt;td&gt;46&lt;br&gt;&lt;/td&gt;&lt;td&gt;4.62%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;Detailed Design Review&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;Code&lt;/td&gt;&lt;td&gt;240&lt;br&gt;&lt;/td&gt;&lt;td&gt;546&lt;br&gt;&lt;/td&gt;&lt;td&gt;54.9%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;Code Review&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;Compile&lt;/td&gt;&lt;td&gt;24&lt;br&gt;&lt;/td&gt;&lt;td&gt;8&lt;br&gt;&lt;/td&gt;&lt;td&gt;0.8%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;Test&lt;/td&gt;&lt;td&gt;48&lt;br&gt;&lt;/td&gt;&lt;td&gt;275&lt;br&gt;&lt;/td&gt;&lt;td&gt;27.6%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;Postmortem&lt;/td&gt;&lt;td&gt;24&lt;br&gt;&lt;/td&gt;&lt;td&gt;27&lt;br&gt;&lt;/td&gt;&lt;td&gt;2.71%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Total&lt;/td&gt;&lt;td&gt;660&lt;br&gt;&lt;/td&gt;&lt;td&gt;995&lt;br&gt;&lt;/td&gt;&lt;td&gt;------- &lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h4&gt;Defects Injected&lt;/h4&gt;&lt;table border="1" cellpadding="3"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;br&gt;&lt;/td&gt;&lt;td align="center" valign="bottom"&gt;&lt;b&gt;Plan&lt;/b&gt;&lt;/td&gt;&lt;td align="center" valign="bottom"&gt;&lt;b&gt;Actual&lt;/b&gt;&lt;/td&gt;&lt;td align="center" valign="bottom"&gt;&lt;b&gt;Actual %&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;Planning&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;1&lt;br&gt;&lt;/td&gt;&lt;td&gt;5%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;High-level Design&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;High-level Design Review&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;Detailed Design&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;5&lt;br&gt;&lt;/td&gt;&lt;td&gt;25%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;Detailed Design Review&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;Code&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;9&lt;br&gt;&lt;/td&gt;&lt;td&gt;45%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;Code Review&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;Compile&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;Test&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;5&lt;br&gt;&lt;/td&gt;&lt;td&gt;25%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;Postmortem&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Total&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;20&lt;br&gt;&lt;/td&gt;&lt;td&gt;------- &lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h4&gt;Defects Removed&lt;/h4&gt;&lt;table border="1" cellpadding="3"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;br&gt;&lt;/td&gt;&lt;td align="center" valign="bottom"&gt;&lt;b&gt;Plan&lt;/b&gt;&lt;/td&gt;&lt;td align="center" valign="bottom"&gt;&lt;b&gt;Actual&lt;/b&gt;&lt;/td&gt;&lt;td align="center" valign="bottom"&gt;&lt;b&gt;Actual %&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;Planning&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;High-level Design&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;High-level Design Review&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;Detailed Design&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;1&lt;br&gt;&lt;/td&gt;&lt;td&gt;5.26%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;Detailed Design Review&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;Code&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;7&lt;br&gt;&lt;/td&gt;&lt;td&gt;36.8%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;Code Review&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;Compile&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;1&lt;br&gt;&lt;/td&gt;&lt;td&gt;5.26%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;Test&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;10&lt;br&gt;&lt;/td&gt;&lt;td&gt;52.6%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;Postmortem&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;0%&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Total&lt;/td&gt;&lt;td&gt;0&lt;br&gt;&lt;/td&gt;&lt;td&gt;19&lt;br&gt;&lt;/td&gt;&lt;td&gt;------- &lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;More time and defects than I would expect and I knew the code basis and the requirements very well. I think that it is OK if I take into account the fact that I'm not very experienced with Python and that I had plenty of interruptions.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-115021497296363749?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/115021497296363749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=115021497296363749' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/115021497296363749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/115021497296363749'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2006/05/postmorten-of-htmled.html' title='Postmorten of   htmled'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-114661816477956711</id><published>2006-05-02T23:52:00.000+01:00</published><updated>2006-05-03T02:02:44.780+01:00</updated><title type='text'>htmled ready for production use!</title><content type='html'>&lt;p&gt;After a while working on this I think I will be able to make my blog update based on the current status of htmled. It processes correctly this Handbook file, being that I even found and corrected some errors in the HTML with it. As stated previously I'm using &lt;a href="http://www.testdriven.com"&gt;Test Driven Development&lt;/a&gt; (TDD) and using the &lt;a href="http://processdash.sourceforge.net/index.html" class="ligacao"&gt;Process Dashboard&lt;/a&gt; to track time and defects. It was fun, mainly because I used Python, TDD and knew very well the requirements ;-).&lt;/p&gt;&lt;p&gt;Mainly I hope it improves dramatically the readability of my blogging. I'm not following full commercial blogging rules, but, heck, I don't intend to earn money with this, just publicize properly my playground.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-114661816477956711?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/114661816477956711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=114661816477956711' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/114661816477956711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/114661816477956711'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2006/05/htmled-ready-for-production-use.html' title='htmled ready for production use!'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-114661737542415157</id><published>2006-04-10T01:48:00.000+01:00</published><updated>2006-05-03T01:49:35.426+01:00</updated><title type='text'>htmled – the work done up until now</title><content type='html'>&lt;p&gt;In my very limited free time I've been working in htmled. It is a &lt;a href="http://www.python.org/" class="ligacao"&gt;Python&lt;/a&gt; program that is being developed using test driven development (TDD), which currently is capable of parsing my Handbook files and fill HbDailyEntry and HbSubjectEntry objects. I have created also a PostExtractor which creates blogger posts out of a list of HbDailyEntries. It still doesn't convert the links correctly, but, that is the last step missing for it to be working.&lt;/p&gt;&lt;p&gt;To manage versions of htmled I'm using &lt;a href="http://subversion.tigris.org/" class="ligacao"&gt;Subversion&lt;/a&gt;, which seams very versatile and simple to use. I'm also using the &lt;a href="http://processdash.sourceforge.net/index.html" class="ligacao"&gt;Process Dashboard&lt;/a&gt; scripts, to try to get a feeling on what this tool can make for me besides helping me track the time I use for my hobbies and work.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-114661737542415157?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/114661737542415157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=114661737542415157' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/114661737542415157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/114661737542415157'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2006/04/htmled-work-done-up-until-now.html' title='htmled &amp;ndash; the work done up until now'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-114661697936008746</id><published>2006-02-06T01:38:00.000Z</published><updated>2006-05-03T01:42:59.363+01:00</updated><title type='text'>htmled revisited – Handbook entries to blog posts automated</title><content type='html'>&lt;p&gt;I'm again revisiting my idea of &lt;a href="http://argonauts-life.blogspot.com/2005/05/pluggableimport-implementation-and-4th.html#htmled_06"&gt;developing automation for transforming content developed in my handbook&lt;/a&gt; into &lt;a href="http://argonauts-life.blogspot.com/"&gt;Argonaut's-life blog&lt;/a&gt; posts. The way I blog until now is seriously flawed, in that it does not follow the feeling that these entries are actualy made in the moment. This is the truth, with the catch that I will only put them in the blog when I'm online and in a batch way. It gives the wrong feeling to persons reading it and I must change this.&lt;/p&gt;&lt;p&gt;But, alas, to change it I must automate a bit and it is here that the problem begins. The high level requirements are identified &lt;a href="http://argonauts-life.blogspot.com/2005/05/pluggableimport-implementation-and-4th.html#htmled_06"&gt;here&lt;/a&gt;, although I'm now less ambitious and just want to automate the transformation of the content of my programmer's handbook entries into Argonaut's life posts.&lt;/p&gt;&lt;p&gt;Details of my handbook entries:&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;I write in a daily oriented way, always starting with &lt;code&gt;H2&lt;/code&gt;   tag and with standard european date format &amp;ndash; &lt;em&gt;yyyy-mm-dd&lt;/em&gt;.&lt;/li&gt;  &lt;li&gt;As stated previously the entries are written in a last in goes to the   end manner.&lt;/li&gt;  &lt;li&gt;The handbook is made of several HTML files, all in the same   directory.&lt;/li&gt;  &lt;li&gt;I also include several pictures that are stored in the handbook   directory.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I would be happy if in a first step, the converter simply creates single posts out of the handbook entries. The end result could be a group of posts, structured around a directory tree of dates/posts. I may put the content by hand in the blog and the pictures in my website. One problem is the post title. Here I would choose to use &lt;code&gt;H3&lt;/code&gt; level tags. These are the normal heading level within the daily entries.&lt;/p&gt;&lt;p&gt;The automation makes also some formating that satisfies &lt;a href="http://www.blogger.com"&gt;blogger&lt;/a&gt; requirements, such as one HTML post must be all within one line. It must fix my handbook intra-links into links that work in the blog, etc.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-114661697936008746?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/114661697936008746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=114661697936008746' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/114661697936008746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/114661697936008746'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2006/02/htmled-revisited-handbook-entries-to.html' title='htmled revisited &amp;ndash; Handbook entries to blog posts automated'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-114661641608769402</id><published>2006-02-03T01:30:00.001Z</published><updated>2008-10-16T22:07:53.290+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++ Module'/><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><category scheme='http://www.blogger.com/atom/ns#' term='List of Limitations'/><title type='text'>Executable List of Limitations</title><content type='html'>&lt;p&gt;Another idea I had today is to put the List of Limitations of a program into the program. This would warn the user about some specific limitation only when he uses functionality that contains a limitation. I have done this with the C++ module reverse engineering part.&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.fileden.com/files/2008/4/5/1853347/cpp_mod_lol.PNG" alt="C++ module List of Limitations"&gt;&lt;/p&gt;&lt;p&gt;I did this because it was a module I wanted to integrate, but, it has so many limitations that providing this possibility with warning users of the limitations would be too frustating for anyone than myself. But, it is a rather interesting way of explicitly warning users about something that could annoy them. Today I had the idea of inserting this for all limitations! It is something for the user like TODO and FIXME markups are for developer. With the advantage that he may turn off the LoL warnings after seeing them for the first time. This could be easy with the new technologies such as Aspect Oriented Programming and Attribute Oriented Programming (e.g., Java 5 Annotations).&lt;/p&gt;&lt;p&gt;The kind of user warning depends on the type of program, e.g., ArgoUML would present a warning message while a server application adds a warning sentence in the log. This is also a much better way to manage limitations than using LoL list within the change management tool or a document sent to the user / customer.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-114661641608769402?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/114661641608769402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=114661641608769402' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/114661641608769402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/114661641608769402'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2006/02/executable-list-of-limitations.html' title='Executable List of Limitations'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-114661621204407993</id><published>2006-02-03T01:28:00.000Z</published><updated>2006-05-03T01:30:12.046+01:00</updated><title type='text'>2006-02-03</title><content type='html'>&lt;p&gt;I helped finding and fixing &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=3917"&gt;[Issue 3917]  unit tests failing - default model not initialized&lt;/a&gt;. It is very good that ArgoUML has unit tests. Without them I think that release problems would increase a lot. Near release almost everyone who cares will be a bit stressed and the possibility for errors will increase. For this we have the automated unit tests, acting as a safety net.&lt;/p&gt;&lt;p&gt;I should state that ArgoUML developers don't do as much as they should test driven development and test driven bug fixing. This is a practice that isn't enforced by the leader and by the commit rules. But, given time it might be...&lt;/p&gt;&lt;p&gt;Now, imagine that it was. Imagine that commiting a change in the production code should be done with a companion test or at least should be covered by tests. How difficult it would be to verify and automate this? We would need to mark commits to repository as atomic, make a complete build with unit tests executed with coverage and check that the commit is according to the coverage criteria. The commit is rolled back if it is sub-standard, being the commiter warned about this by email.&lt;/p&gt;&lt;p&gt;This requires atomic commits, something &lt;a href="http://www.cvshome.org/"&gt;CVS&lt;/a&gt; does not have, but, &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; does. It requires integration between the tools used in this scenario: version control system and build tool; build tool and coverage tool; build tool and coverage tool results details related to a set of specific changes; build tool and email system; mapping between version control system user IDs and users details (i.e. email).&lt;/p&gt;&lt;p&gt;Looking into the above requirements, I think that almost everything is possible with open source tools. It would require heavy build knowledge and a dedicated server with rollback rights, but, it is certainly possible.&lt;/p&gt;&lt;p&gt;One problem is the dependencies between one commit and the following. One much more important problem is the total lack of human review in all this!&lt;/p&gt;&lt;p&gt;No, in the end I think this is a bad idea. We should educate persons to follow good practices and then measure. Not put a machine enforcing this!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-114661621204407993?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/114661621204407993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=114661621204407993' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/114661621204407993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/114661621204407993'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2006/02/2006-02-03.html' title='2006-02-03'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-113878136599290334</id><published>2006-02-01T07:45:00.000Z</published><updated>2006-02-01T08:12:00.610Z</updated><title type='text'>Am I a Software Engineer?</title><content type='html'>&lt;p&gt;About two years ago I decided to change my job title to Software Engineer. I did this because I think that what is missing in the Software Development field is the application of Engineering practices.&lt;/p&gt;&lt;p&gt;Now I found out &lt;a href="http://www.cs.utexas.edu/users/sahilt/research/SEMyths.html"&gt;this paper about Software Engineering Myths&lt;/a&gt;. The author certainly has a point and I am indeed one person that according to him is abusing of the Software Engineer title. But, you can only say this if you agree with his central point that you only are doing Software Engineering if your work is derived from some formal basis. This is a rather biased view! What I've seen in other Engineering fields is that what more establishes their common ground is the set of practices they follow. I would even say that they aren't close to science, but they use recipes derived from this formal basis. Them they mix and match according to experience to do their work.&lt;/p&gt;&lt;p&gt;What are the practices that we are using today that would conceed a person the Software Engineering title? I think these are things like &lt;/p&gt;&lt;ul&gt;&lt;li&gt;requirements management&lt;/li&gt;&lt;li&gt;modeling&lt;/li&gt;&lt;li&gt;testing&lt;/li&gt;simulations&lt;li&gt;metrics&lt;/li&gt;&lt;li&gt;use of a software development process&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Some of these have indeed a formal and theoretical basis. Some don't. But, they are accepted practices by the whole field. They categorize the Software Engineer.&lt;/p&gt;&lt;p&gt;So, although I agree with some of the observations of Sahil Thaker, I will continue to use this title, since I belive what I do is Engineering and not plain development.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-113878136599290334?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/113878136599290334/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=113878136599290334' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/113878136599290334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/113878136599290334'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2006/02/am-i-software-engineer.html' title='Am I a Software Engineer?'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-113877585388282854</id><published>2006-02-01T06:28:00.000Z</published><updated>2006-02-01T06:37:33.900Z</updated><title type='text'>ArgoUML next release</title><content type='html'>&lt;p&gt;ArgoUML is arriving the &lt;a href="http://argouml.tigris.org/servlets/NewsItemView?newsItemID=1437"&gt;next stable release&lt;/a&gt;. Its a very interesting time since this is the first version that we have support of UML 1.4 and XMI 1.2 with the &lt;a href="http://argouml-mdr.tigris.org/"&gt;MDR library&lt;/a&gt;. The active core developers base has grown now with Ludo and Tom (kudos to them), which makes a big difference. We have development in installers and the new &lt;a href="http://argouml-andromda.tigris.org/"&gt;ArgoUML AndroMDA module&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I wouldn't say that our sail is fully inflated by a good steady wind, but, we're certainly going in that direction :-))&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-113877585388282854?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/113877585388282854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=113877585388282854' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/113877585388282854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/113877585388282854'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2006/02/argouml-next-release.html' title='ArgoUML next release'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-114661605484897567</id><published>2006-01-23T01:25:00.000Z</published><updated>2006-05-04T00:07:24.673+01:00</updated><title type='text'>The C++ UML profile</title><content type='html'>&lt;p&gt;The problem above was included in &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=3829"&gt;issue #3829&lt;/a&gt;  and I already provided patches and tests for this to Tom Morris (the developer to whom the issue is assigned). &amp;ndash; Well, there is an exception which is Parameter model elements, that I'll try to fix in the context of 3829. I also think that we have other problems related to namespace, ownership and undocumented behavior of my proposed solution...&lt;/p&gt;&lt;p&gt;With this in place I am already capable of using tag definitions owned by stereotypes in the C++ UML profile in the model elements to which the stereotypes are applied. This should satisfy &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=3771"&gt;issue #3771&lt;/a&gt; and the &lt;a href="http://argonauts-life.blogspot.com/2005/08/drop-1-updated-plan-version-5.html#uml_profile_4_cpp_v5"&gt;planned objective for C++ reveng&lt;/a&gt;, but, it falls short in the context to my previous ambitions: &lt;a href="http://argonauts-life.blogspot.com/2005/08/drop-1-updated-plan-version-5.html#2005-08-16"&gt;2005-08-16&lt;/a&gt; and&lt;a href="http://argonauts-life.blogspot.com/2005/05/pluggableimport-implementation-and-4th.html#common_community_guidelines_4_modeling_cpp_in_UML"&gt;Model C++ in UML according to guidelines accepted in common by the community&lt;/a&gt;. I also think that we are buying lots of manual synchronization work to be done in the near future, which should be avoided!!! Currently we have the readme file in the C++ module source, the ArgoUML manual and the source code. With &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=3771"&gt;issue #3771&lt;/a&gt; I'm adding the UML profile for C++ which is an additional place where these things go into. So, this means that whenever something changes I have to update four places &amp;ndash; to be more correct its more than four since the source code for generator and reveng should be counted as two at least.&lt;/p&gt;&lt;p&gt;Another thing that worries me is the fact that we could be moving into a island and a not invented here syndrome. The UML profile for C++ should be something developed outside of the ArgoUML umbrella, so that it is shared with other communities, creating more reuse opportunities and improving reviews. After &lt;a href="http://argonauts-life.blogspot.com/2005/05/modelerimpl-analysis-of.html#common_community_guidelines_4_modeling_cpp_in_UML"&gt;finding that there is no effort in the world going into this direction&lt;/a&gt;, I will not start with this before having other things like &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=1446"&gt;1446&lt;/a&gt; ready, but, it is indeed important for the overall vision realization... A possible way to start with this is to make it a kickoff step in adding support to C++ to one of the existing open source MDA tools.&lt;/p&gt;&lt;h4&gt;&lt;a name="todos_related_2_uml_profile_4_cpp_01"&gt;TODOs&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;I must update the C++ reveng code to use the profile. The &lt;a href="http://argonauts-life.blogspot.com/2005/08/drop-1-updated-plan-version-5.html"&gt;C++ reveng plan&lt;/a&gt; also needs an update.&lt;/li&gt;&lt;li&gt;The C++ module documentation must be updated to include this notion of using the UML profile for C++.&lt;/li&gt;&lt;li&gt;Make a review of non-working tags in the C++ generator, create an issue to handle this and coordinate things with Daniele.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-114661605484897567?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/114661605484897567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=114661605484897567' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/114661605484897567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/114661605484897567'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2006/01/c-uml-profile.html' title='The C++ UML profile'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-114661591204870795</id><published>2006-01-09T01:24:00.000Z</published><updated>2006-05-03T01:25:12.050+01:00</updated><title type='text'>2006-01-09</title><content type='html'>&lt;p&gt;I'm working on &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=3771"&gt;issue #3771: Add tag definitions for tags used by the cpp generator&lt;/a&gt;. The way to go for solving this is by defining a C++ profile that could be imported automatically by projects for which C++ code generation is intended. This C++ UML profile will be stored within the module jar and support for importing it will be added to the C++ module preferences dialog.&lt;/p&gt;&lt;p&gt;Now, there are some problems with ArgoUML support of tag definitions (TDs). It is not possible define the &lt;code&gt;tagType&lt;/code&gt; of a tag definition. This is relevant for the C++ UML profile, where I want to restrict to &lt;code&gt;Boolean&lt;/code&gt; the range of values accepted by some tag definitions.&lt;/p&gt;&lt;p&gt;Another problem I'm having is that if I define tag definitions associated with a stereotype (their &lt;em&gt;owner&lt;/em&gt;), these don't show as options to be applied to model elements that have the stereotype. Lets say &lt;code&gt;cppClass&lt;/code&gt; stereotype has TDs &lt;code&gt;constructor&lt;/code&gt;, &lt;code&gt;header_incl&lt;/code&gt; and &lt;code&gt;source_incl&lt;/code&gt;. When I create a class and apply the &lt;code&gt;cppClass&lt;/code&gt; stereotype to it, the tagged values defined in &lt;code&gt;cppClass&lt;/code&gt; aren't available to be applied to the class. Well, this takes the value out of associating the TDs to stereotypes, but, this is also an obvious bug that I may easily fix...&lt;/p&gt;&lt;p&gt;To enable users not to polute their models with stereotypes, the C++ UML Profile will have TDs both nicely associated with stereotypes and at top level. This might cause problems when I fix the error I identified above, but, we should try to please the users. It is no problem if the stereotypes aren't applied to model elements, since this way only the tag definitions defined at top level are available. When the user applies the stereotypes he will get one defined at model level and the ones that come from the stereotype. We could define here some type of rule, so that ArgoUML filters the top level values...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-114661591204870795?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/114661591204870795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=114661591204870795' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/114661591204870795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/114661591204870795'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2006/01/2006-01-09.html' title='2006-01-09'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-114661582687014058</id><published>2005-12-15T01:22:00.000Z</published><updated>2006-05-03T01:23:46.870+01:00</updated><title type='text'>2005-12-15</title><content type='html'>&lt;p&gt;The template notation spike is documented in a &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=3802"&gt;issuezila task (#3802)&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Today I contributed my eclipse project files to ArgoUML list, in a reply to a discussion about shared eclipse projects.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-114661582687014058?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/114661582687014058/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=114661582687014058' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/114661582687014058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/114661582687014058'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2005/12/2005-12-15.html' title='2005-12-15'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-114661561794282694</id><published>2005-12-12T01:16:00.000Z</published><updated>2006-05-03T01:22:07.203+01:00</updated><title type='text'>Reorganization of ArgoUML eclipse projects</title><content type='html'>&lt;p&gt;While working in the &lt;a href="http://argonauts-life.blogspot.com/2005/11/starting-with-parameterized-classes.html#2005-11-05"&gt;template notation spike&lt;/a&gt; I had to advance some work in the model support for parameterized classes. This implied in making some changes to the ArgoUML model sub-system interfaces and in the &lt;a href="http://mdr.netbeans.org"&gt;NetBeans MDR&lt;/a&gt; implementation of the model sub-system. With my previous organization of the eclipse projects this became very cumbersome. I have one eclipse project for ArgoUML, which contained everything bellow &lt;code&gt;cvs/argouml&lt;/code&gt; and another with argouml-mdr. The later depended on the former, in order to have the model interface in the class-path - localted in &lt;code&gt;cvs/argouml/src/model&lt;/code&gt;. To have the MDR implementation accessible I put argouml-mdr.jar and the other jars from which it depends into the main ArgoUML eclipse project. It was a way to fool eclipse's circular dependency detection. The problem was that I had to do external builds of the MDR jars everytime I made a change in the MDR implementation!&lt;/p&gt;&lt;p&gt;So, after bumping my head against this problem some times I decided that I could benefit from a re-organization of the ArgoUML eclipse projects. Considering the CVS organization of the ArgoUML projects I have defined the folowing eclipse projects:&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;&lt;strong&gt;argouml-lib&lt;/strong&gt; &amp;ndash; contains the ArgoUML libraries from   &lt;code&gt;cvs/argouml/lib&lt;/code&gt;&lt;/li&gt;  &lt;li&gt;&lt;strong&gt;argouml-model-api&lt;/strong&gt; &amp;ndash; contains the ArgoUML model   sub-system API, from &lt;code&gt;cvs/argouml/src/model&lt;/code&gt;; depends on   argouml-lib&lt;/li&gt;  &lt;li&gt;&lt;strong&gt;argouml-mdr&lt;/strong&gt; &amp;ndash; contains the MDR implementation of   the model sub-system, from &lt;code&gt;cvs/argouml-mdr/&lt;/code&gt;;   depends on argouml-lib and argouml-model-api&lt;/li&gt;  &lt;li&gt;&lt;strong&gt;argouml-src_new&lt;/strong&gt; &amp;ndash; contains the core ArgoUML   application, from &lt;code&gt;cvs/argouml/src_new&lt;/code&gt;;   depends on argouml-lib, argouml-model-api and argouml-mdr&lt;/li&gt;  &lt;li&gt;&lt;strong&gt;argouml-tools&lt;/strong&gt; &amp;ndash; contains the tools used in   ArgoUML, from &lt;code&gt;cvs/argouml/tools&lt;/code&gt;&lt;/li&gt;  &lt;li&gt;&lt;strong&gt;argouml-tests&lt;/strong&gt; &amp;ndash; contains the unit tests of   ArgoUML, from &lt;code&gt;cvs/argouml/tests&lt;/code&gt;;   depends on argouml-lib, argouml-model-api, argouml-mdr, argouml-src_new and   argouml-tools&lt;/li&gt;  &lt;li&gt;&lt;strong&gt;argouml-cpp-module&lt;/strong&gt; &amp;ndash; contains the C++ module,   from &lt;code&gt;cvs/argouml/modules/cpp&lt;/code&gt;;   depends on argouml-lib, argouml-model-api, argouml-mdr and argouml-src_new;   the other modules within &lt;code&gt;cvs/argouml/modules&lt;/code&gt; are loaded in   projects similar to this&lt;/li&gt;  &lt;!--  &lt;li&gt;&lt;strong&gt;argouml-&lt;/strong&gt; &amp;ndash; , from &lt;code&gt;cvs/argouml/&lt;/code&gt;;   depends on argouml-&lt;/li&gt;  --&gt;&lt;/ul&gt;&lt;p&gt;One thing that I needed was to filter out the NSUML implementation from argouml-src_new. Shouldn't this be removed alredy?!&lt;p&gt;&lt;p&gt;I think I'll propose this organization in the argouml-dev list, as a possible way to have shared eclipse projects in CVS. I think that this way we will have a much simpler setup for newcomers.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-114661561794282694?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/114661561794282694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=114661561794282694' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/114661561794282694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/114661561794282694'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2005/12/reorganization-of-argouml-eclipse.html' title='Reorganization of ArgoUML eclipse projects'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-113287424252642618</id><published>2005-11-24T22:30:00.000Z</published><updated>2005-11-24T23:39:41.570Z</updated><title type='text'>starting with parameterized classes and UmlUnit</title><content type='html'>&lt;h2&gt;&lt;a name="2005-11-05" class="ancora"&gt;2005-11-05&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I think I need a spike in what concerns working with GEF. It is certainly possible to make the composition of two figures &amp;ndash; the class rectangle and the dashed rectangle with the template parameters. But, I never worked with GEF and graphical programming isn't my game. So, just for fun, lets make this spike.&lt;/p&gt;&lt;h2&gt;&lt;a name="2005-11-04" class="ancora"&gt;2005-11-04&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;&lt;a name="1446_user_stories_01"&gt;1446 User stories&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;I'll start now with the &lt;a href="#1446_writing_the_user_stories"&gt;user stories for 1446&lt;/a&gt;. The rules for writing are &lt;a href="#1446_xp_practices_2_be_used"&gt;stated above&lt;/a&gt;.&lt;/p&gt;&lt;h4&gt;&lt;a name="1446_user_story_create_param_class"&gt;Create parameterized class&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Provide a UI action to create a parameterized class. This should be similar to what is currently used to create a normal class. After creation, the parameterizable class properties shall be editable, as usually ocurs for the rest of the model elements. The user may immediatly enter the parameterized class name.&lt;/p&gt;&lt;h4&gt;&lt;a name="1446_user_story_create_template_parameter"&gt;Create template parameter&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;It is possible to create a parameter for a template. This should work in a similar way as creating / adding attributes to a class. By default the template parameter type is a Classifier, its name is PARAM and it has no default value.&lt;/p&gt;&lt;h4&gt;&lt;a name="1446_user_story_edit_template_parameter_properties"&gt;Edit template parameter properties&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;The properties of a template parameter are visible and editable in similar ways as properties of other model elements.&lt;/p&gt;&lt;h4&gt;&lt;a name="1446_user_story_param_class_constrains"&gt;Parameterized class constrains&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Parameterized classes are constrained to have associations only with classes, being uni-directional from the template to the class. An exception is that a bound class is associated through a bind association to the template, being this directed from the bound class to the template.&lt;br&gt;NOTE: this is too restrictive for common use with programming languages that support templates and maybe we should relax the specified constrains.&lt;/p&gt;&lt;h4&gt;&lt;a name="1446_user_story_param_class_graphical_presentation"&gt;Parameterized class graphical presentation&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;The parameterized class is represented graphically as specified in the UML spec. It is possible to add parameterized classes in class diagrams. The template parameters are editable, but, must respect the rules of the UML spec. It is possible to hide the list of parameters, but, the dashed rectangle remains visible [I'm not totally sure if the spec realy means this].&lt;/p&gt;&lt;h4&gt;&lt;a name="1446_user_story_create_bound_class"&gt;Create bound class&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;In the context of a parameterized class it is possible to create a bound class. The parameters must be bound to actual values according to their types. ArgoUML must enforce this either by using default values or by rejecting the creation of the bound class.&lt;/p&gt;&lt;h4&gt;&lt;a name="1446_user_story_bound_class_props"&gt;Bound class properties&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;The bound class is similar to a class with the added properties of the template parameters values and the bind association to the template. All the properties are visible and editable, with the exception of the bind association, the attributes and operations of the template which are read only.&lt;/p&gt;&lt;h4&gt;&lt;a name="1446_user_story_bound_class_explicit_naming"&gt;Bound class presentation based on name&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;The UML spec allows to have a bound class with the name explicitly showing its nature, e.g., &lt;code&gt;ParameterizedClassName&amp;lt;Param1Value, Param2Value&amp;gt;&lt;/code&gt;. With this presentation it is possible to edit the parameter values in a very simple way. So, it is not needed to have a non-explicit name.&lt;/p&gt;&lt;h4&gt;&lt;a name="1446_user_story_bound_class_bind_presentation"&gt;Presentation of a bind association&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;The bind association may show explicitly the parameter values in brackets, as exemplified in the UML spec.&lt;/p&gt;&lt;h4&gt;&lt;a name="1446_user_story_param_class_params_4_opers_attrs_etc"&gt;Use of template parameters within parameterized class&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;The parameterized class template parameters are usable within the parameterized class for parameterizing its attributes and operations. This means, for instance, that the type of an attribute may be a template parameter.&lt;/p&gt;&lt;h4&gt;&lt;a name="1446_user_story_delete_param_class"&gt;Delete parameterized class from model&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;It is possible to delete a parameterized class from the model. The usual model element deletion rules apply, which means, all bound classes are also deleted. A warning is shown to the user stating this, but he may silent it permanently.&lt;/p&gt;&lt;h4&gt;&lt;a name="1446_user_story_delete_template_parameter"&gt;Delete template parameter from model&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;It is possible to remove a template parameter from the model. The usual model element deletion rules apply, which means, all depending attributes, operations and operation parameters are also removed.&lt;/p&gt;&lt;h2&gt;&lt;a name="2005-10-27" class="ancora"&gt;2005-10-27&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I'm now &lt;a href="#1446_review_uml_support_4_parameterized_classes"&gt;reviewing the UML support for Parameterized Classes&lt;/a&gt;. I'll simply take some notes here about my findings before starting to write User Stories. First a disclaimer, I used UML 1.5 spec since I don't have 1.4 available now. When I get the chance I'll look at that to see if there are changes in this area.&lt;/p&gt;&lt;p&gt;UML defines the &lt;code&gt;Template&lt;/code&gt; concept as a &amp;quot;parameterized model element&amp;quot;. Strangely a restriction to this is that it &amp;quot;cannot be used directly in a model&amp;quot;. Does this means that I cannot say that a &lt;code&gt;Parameterized Class&lt;/code&gt; specializes a normal Class? No, the spec explicitly allows two exceptions: &amp;quot;a template may be a subclass of an ordinary class&amp;quot; [ufff!] and one way associations from &lt;code&gt;Templates&lt;/code&gt; to other classes.&lt;/p&gt;&lt;p&gt;More strangely, the &amp;quot;&amp;laquo;bind&amp;raquo;&amp;quot; association is what is used in UML to create a normal class from a &lt;code&gt;Template&lt;/code&gt;, by specifying the parameters. Guess what, the association is from the resulting class &amp;ndash; the &lt;code&gt;Bound Element&lt;/code&gt; to the &lt;code&gt;Template&lt;/code&gt;, thus violating the rule expressed just above. Well, I guess this should be the third exception: &lt;em&gt;one way association with stereotype bind from Bound Elements to Templates&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;All model elements may be Templates, but normally, in addition to Classes, the model elements that are &lt;em&gt;parameterized&lt;/em&gt; are &lt;code&gt;Colaborations&lt;/code&gt; and &lt;code&gt;Packages&lt;/code&gt;. I think that adding support for these two isn't much more effort since the semantics and notation are very similar.&lt;/p&gt;&lt;p&gt;While considering this I had the idea of a simple refactoring that is usualy done in programming languages that support templates and which may be supported by ArgoUML: creating a &lt;code&gt;Parameterized Class&lt;/code&gt; from a &lt;code&gt;Class&lt;/code&gt;. This is something interesting because UML does not allow it since the class normally has associations. So, it must be something specific to the tool.&lt;/p&gt;&lt;h3&gt;&lt;a name="modeler_impl_03"&gt;&lt;code&gt;ModelerImpl&lt;/code&gt; until now was just a huge Spike!&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Now that &lt;a href="#1446_xp_practices_2_be_used"&gt;I've studied a bit XP&lt;/a&gt; and learned about the concept of &lt;em&gt;Spike&lt;/em&gt;, I must consider the work up to now on &lt;code&gt;ModelerImpl&lt;/code&gt; as a huge Spike. The proof is &lt;a href="#2005-06-20"&gt;my note when it was started&lt;/a&gt; after a big analysis effort that resulted just in some inconsistent ideas. The Spike, resulted in some very strong ideas:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;ModelerImpl&lt;/code&gt; must delegate its reverse work to a tree of objects, each specialized in its own constructs, acting on a current context.&lt;/li&gt;&lt;li&gt;&lt;code&gt;ModelerImpl&lt;/code&gt; must reverse to something else than the actual user model. Preferably it should do it to a new empty model that is in a subsequent step reconciled with the user model. Note that this should not preclude future optimization paths like simply checking if some file was already imported and comparing the previous taken MD5 signature with the current.&lt;/li&gt;&lt;li&gt;Importing &lt;em&gt;Context&lt;/em&gt; smells more and more like an aspect of the way I've implemented the importing, being based on callbacks from the parser. I wonder if I was using a built AST of the code, if I would recur to this...&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;&lt;a name="2005-10-26" class="ancora"&gt;2005-10-26&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;&lt;a name="1446_xp_practices_2_be_used" class="ancora"&gt;XP Practices to be used in the development of support for parameterized classes&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;I've reviewed the high level information on XP (the &lt;a href="#1446_review_xp_practices_2_be_used" class="ligacao"&gt;2nd step of the plan&lt;/a&gt;) in &lt;a href="http://www.extremeprogramming.org" class="ligacao"&gt;www.extremeprogramming.org&lt;/a&gt; and chose the following limited set of practices:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.extremeprogramming.org/rules/userstories.html"&gt;User Stories&lt;/a&gt; &amp;ndash; I'll be the writer and creator, instead of being the result of input from a customer. The User Stories will be included each in the issue to enable gathering feedback early in the development for modifications and prioritization. It is possible that some will be grouped and handled in separate issues, with &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=1446" class="ligacao"&gt;#1446&lt;/a&gt; depending on those. I'll develop acceptance tests only when these are possible in a small ammount of time. The acceptance tests will be stored in ArgoUML as Unit Tests. Apart from these details I'll try to keep then as described in XP.&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.extremeprogramming.org/rules/spike.html"&gt;Spike Solution&lt;/a&gt; &amp;ndash; Support for parameterized classes implies changes in almost all the most important ArgoUML sub-systems. Due to the fact that I'm not acquainted with many of them I'll need to make quick and dirty attempts to know if some devised solution works. These will be my Spike Solutions; I'll record then in a minimum with small notes, the time spent on this will be accounted as part of the story implementation, the planning or whatever, and in the end their results will never be incorporated in the code directly.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.extremeprogramming.org/rules/testfirst.html"&gt;Test Driven Development (TDD)&lt;/a&gt; &amp;ndash; This will be followed fully. I don't know how I'll do it for GUI (JFCUnit isn't used in ArgoUML), but, this must be done without exceptions.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.extremeprogramming.org/rules/refactor.html"&gt;Refactor Mercilessly&lt;/a&gt; &amp;ndash; Refactoring will be followed fully. The problem is code without tests that exists in ArgoUML and that committers may feel insecure to patch with my refactorings. So, this will probably be difficult, but, I'll try to make it happen!&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Its a pity to leave out &lt;a href="http://www.extremeprogramming.org/rules/integrateoften.html"&gt;Continuous Integration&lt;/a&gt;, &lt;a href="http://www.extremeprogramming.org/rules/functionaltests.html"&gt;Acceptance Tests&lt;/a&gt; and other practices, but, some reasons lead me to this:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;I don't have commit rights to ArgoUML, so, I can't enforce the integrate often rule because someone must commit my future patches;&lt;/li&gt;&lt;li&gt;my time availability is variable and scarce, so, some times I leave unfinished parts during week time spans;&lt;/li&gt;&lt;li&gt;state of the art support for both acceptance tests and continuous integration requires infrastructure that I don't have and that possibly would take very much time to set up with others' help, since I'm being pragmatic I won't try this for now.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Last but not least, the methodology taken as a whole seams to be more appropriate to teams than it is to individuals, even if working for an open source project with a good community. I would like to see examples of XP applied to open source projects by hobbyists. Probably these would not take the whole thing, even if all team members follow XP.&lt;/p&gt;&lt;p&gt;That's why I will continue to use the Process Dashboard and be inspired by its functionalities and underlying process. I must read the book one of these days!&lt;/p&gt;&lt;p&gt;Now I remember that I know of an open source project that follows XP, its the &lt;a href="http://jydt.sourceforge.net"&gt;JyDT&lt;/a&gt;. I wonder if Red Robin would provide some feedback on his experience... It was XP before going open source, so, I wonder how he is doing it now...&lt;/p&gt;&lt;h2&gt;&lt;a name="2005-10-24" class="ancora"&gt;2005-10-24&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I'll start now with &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=1446"&gt;issue #1446 &amp;ndash; Lack of support for Parameterized Class (Template)&lt;/a&gt;. This is a complex issue and so, I must handle it as such, by having a plan where I must define iterations for partial deliveries. I think I'll follow some of the eXtreme Programming (XP) practices in this development, such as Test Driven Development (TDD), small iterations for delivering complete user stories, Refactoring and simplicity.&lt;/p&gt;&lt;h3&gt;&lt;a name="1446_plan4parameterized_classes_support_v1"&gt;Plan for Parameterized Classes support&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;a name="1446_planning" class="ancora"&gt;Planning the development of 1446.&lt;/a&gt; For this activity I'll use the &lt;a href="http://processdash.sourceforge.net/index.html"&gt;Process Dashboard&lt;/a&gt; tool to measure the time I spend in each of the tasks and a scheme similar to what I've developed in the previous work for C++ reveng support. The main difference is that I'll use user stories to drive the development, being the iterations necessarily more formal and regular. This step must be revisited as often as possible (in the end / start of a user story development cycle should be the norm), being sub-sequent updates to the plan documented here.&lt;br&gt;EE 25 Mh; SN &amp;ndash; Planning&lt;em&gt;&lt;/em&gt;&lt;/p&gt;&lt;li&gt;&lt;p&gt;&lt;a name="1446_review_xp_practices_2_be_used" class="ancora"&gt;Review the XP practices that I'll use in this development&lt;/a&gt; &amp;ndash; TDD, Refactoring, User Stories, automated builds and possibly more if applicable. The selection of practices will follow the pragmatic objective of choosing the ones that are possible with a minimum effort. For example, I've left out the continuous integration and acceptance tests since I don't have infrastructure for this. Some of the practices will be adapted to be practical, like the definition of user stories might be defined by me. This isn't subverting the practice totally since I'm also a user of ArgoUML ;-). In the end of this task I must have a list of the chosen XP practices, with descriptions of how some of these will be applied, where I can't follow closely the practice as defined elsewhere.&lt;br&gt;EE 8 Mh; SN &amp;ndash; &lt;em&gt;Review XP practices&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a name="1446_review_uml_support_4_parameterized_classes" class="ancora"&gt;Review the UML support for parameterization&lt;/a&gt; using the UML 1.4 specification. I must check also other UML elements where parameterization is possible, so that I'm able to develop a good set of user stories that is representative of the work. My objective is just to develop an overview, so, writing one paragraph with the conclusions is enough.&lt;br&gt;EE 4 Mh; SN &amp;ndash; &lt;em&gt;UML support for parameterization&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a name="1446_writing_the_user_stories" class="ancora"&gt;Writing the set of user stories&lt;/a&gt; for guiding the development of support for parameterized classes in UML. I don't know very well what will be the result of this activity, since I'm not acquainted with user stories, but, after this step I must have a decent set of them written. It is likely that the first set of user stories won't be complete or correct. Any additional writing will be done here, unless it occurs just for the correction of one user story while developing it. In that case the time spent with this is accounted in the step of the given user story.&lt;br&gt;EE 10 Mh; SN &amp;ndash; &lt;em&gt;Writing user stories&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;&lt;a name="umlunit_1" class="ancora"&gt;UML Unit - Enabling Test Driven Modeling&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This idea is buzzing inside my head for some months. Why not specifying test cases in UML? We may use the object representation to specify the instances involved in a test case. Then, a collaboration or sequence diagram may represent a test case. Also, test cases might be grouped in classes that have the &lt;code&gt;TestCase&lt;/code&gt; stereotype.&lt;/p&gt;&lt;p&gt;In my view we can support this by defining a UML profile called UML Unit and adding mapping for code generation and reverse engineering to &lt;a href="http://argouml.tigris.org"&gt;ArgoUML&lt;/a&gt; to the existing unit testing frameworks: &lt;a href="http://www.junit.org"&gt;JUnit&lt;/a&gt;, &lt;a href="http://cppunit.sourceforge.net"&gt;CppUnit&lt;/a&gt;, &lt;a href="http://www.nunit.org"&gt;NUnit&lt;/a&gt;, &lt;a href="http://pyunit.sourceforge.net"&gt;PyUnit&lt;/a&gt;, etc. It would be interesting to add support to this idea to &lt;a href="http://www.andromda.org"&gt;AndroMDA&lt;/a&gt; also, since an obvious target is to enable Test Driven Modeling (TDM) at the PIM level. I know that the Executable UML supports this for years, but, this isn't available in open source tools. So, by having a simple mapping to POJO like PSM that could even be the source code, we could have the same thing without the need to have a UML virtual machine.&lt;/p&gt;&lt;p&gt;The assertion and verification may be modeled as OCL statements. But, this implies code generation support for OCL statements. This is something that isn't yet supported in &lt;a href="http://argouml.tigris.org"&gt;ArgoUML&lt;/a&gt;, although OCL is supported for some years.&lt;/p&gt;&lt;h2&gt;&lt;a name="2005-10-14" class="ancora"&gt;2005-10-14&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;So, after verifying that &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=3552"&gt;issue #3552&lt;/a&gt; isn't correct I'll change it to the documentation and fix the docs. Its name will be &amp;quot;header_incl warning in manual's C++ appendix is wrong and solving TODOs&amp;quot;.&lt;/p&gt;&lt;h2&gt;&lt;a name="2005-10-10" class="ancora"&gt;2005-10-10&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Michiel van der Wulp commited my patch to the documentation which includes the C++ generator documentation. Daniele Tamino created two of the above issues, but, I must check the problems I had with duplicate tagged values. In the ArgoUML GUI the duplicated values are shown and reloaded correctly. Maybe this is only replicable when the tagged values are queried like when the C++ module tries to find it... No, it works correctly, so, the warning and TODO will be replaced with a hint to use multiple times the tag.&lt;/p&gt;&lt;p&gt;The issues are:&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=3552"&gt;3552&lt;/a&gt; &amp;ndash; header_incl allows to include only one header&lt;/li&gt;&lt;li&gt;&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=3553"&gt;3553&lt;/a&gt; &amp;ndash; handle multple return parameters&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-113287424252642618?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/113287424252642618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=113287424252642618' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/113287424252642618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/113287424252642618'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2005/11/starting-with-parameterized-classes.html' title='starting with parameterized classes and UmlUnit'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-112924503623104451</id><published>2005-10-14T00:10:00.000+01:00</published><updated>2005-10-14T00:25:21.353+01:00</updated><title type='text'>C++ module documentation</title><content type='html'>&lt;h2&gt;&lt;a name="2005-10-10" class="ancora"&gt;2005-10-10&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Michiel van der Wulp commited my patch to the documentation which includes the C++ generator documentation. Daniele Tamino created two of the above issues, but, I must check the problems I had with duplicate tagged values. In the ArgoUML GUI the duplicated values are shown and reloaded correctly. Maybe this is only replicable when the tagged values are queried like when the C++ module tries to find it... No, it works correctly, so, the warning and TODO will be replaced with a hint to use multiple times the tag.&lt;/p&gt;&lt;p&gt;The issues are:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=3552"&gt;3552&lt;/a&gt; &amp;ndash; header_incl allows to include only one header&lt;/li&gt;&lt;li&gt;&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=3553"&gt;3553&lt;/a&gt; &amp;ndash; handle multple return parameters&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;&lt;a name="2005-09-23" class="ancora"&gt;2005-09-23&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I have already successfully created the appendix. &lt;a href="http://www.oasis-open.org/docbook/"&gt;DocBook&lt;/a&gt; is very verbose and for an unexperienced person like me it is awkward to have a slow iteraction to see what errors exist in the file &amp;ndash; I'm generating the documentation and this takes very long because the manual is the last to be processed; it also bails on the first error, so, each error cost me a lot! I know that some nice &lt;a href="http://www.eclipse.org"&gt;eclipse&lt;/a&gt; plugin exists, but, I would like to have the functionality of verifying the syntax in &lt;a href="http://www.vim.org"&gt;Vim&lt;/a&gt;. I guess I must look for this...&lt;/p&gt;&lt;p&gt;Another option is to use a separate validator, like the &lt;a href="http://www.netbeans.org"&gt;NetBeans&lt;/a&gt; XML module, but, that seams 
to be a bit overkill! There must be something in the Vim plugin universe ;-) On second thought, I'll give a chance to Netbeans... Yeah, it works like a charm! Just open the &lt;code&gt;argomanual.xml&lt;/code&gt; file and validate :-))&lt;/p&gt;&lt;h2&gt;&lt;a name="2005-09-16" class="ancora"&gt;2005-09-16&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;&lt;a name="new_issues_cpp_gen_limit_duplicated_tags_doc_readme"&gt;New issues: C++ generator limitation, duplicated tags in ArgoUML and inaccuracies in the documentation readme&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;While working in the documentation of the C++ module I found that there exists a serious limitation in the way some tagged values are used. The problem is with tagged values for things that the modeler might want to introduce  multiple times. An example is the &lt;code&gt;header_incl&lt;/code&gt; tag which value is set to a file name that will be included in the header. Well, this is something that is typically done several times.&lt;/p&gt;&lt;p&gt;Although ArgoUML allows entering the same tag more than once with different values, its internals get confused and every tag disappears. I think that this qualifies as a bug and I'll try to fix it.&lt;/p&gt;&lt;p&gt;So, without the option to repeat the same tag several times with different values, one as the possibility to either use tag prefixes or assume some separation character in the tagged value value. I think the latest is better and will propose it in a possible fix.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;TODO&lt;/strong&gt;: create issue for ArgoUML allowing creation of duplicated tagged values.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;TODO&lt;/strong&gt;: create issue for C++ module use of some tagged values so that it allows multiple values to be specified.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;TODO&lt;/strong&gt;: submit the documentation readme corrections.&lt;/p&gt;&lt;h2&gt;&lt;a name="2005-09-10" class="ancora"&gt;2005-09-10&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I finished the test for &lt;code&gt;DerivedFromAbstract.cxx&lt;/code&gt; translation unit and made a new test that looks for duplicates when reverse is repeated. The &lt;code&gt;ModelerImpl&lt;/code&gt; now passes the tests defined in &lt;code&gt;TestCppImport&lt;/code&gt;. I will now take some time off from implementing reverse engineering for C++ in ArgoUML and write the C++ module appendix of the ArgoUML user manual (&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=2857"&gt;issue #2857&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;The ArgoUML documentation is written in the &lt;a href="http://www.oasis-open.org/docbook/"&gt;DocBook format&lt;/a&gt;. It takes the form of a group of XML files according to the DocBook XML. The &lt;a href="http://argouml.tigris.org/documentation/defaulthtml/cookbook"&gt;cookbook&lt;/a&gt; explains very well this and I will try to follow those instructions. As stated above, the C++ module will be documented as an appendix, so, this means that I'll create a new XML file in &lt;code&gt;/cvs/argouml/documentation/manual&lt;/code&gt;, which I'll name &lt;code&gt;app_cppmod.xml&lt;/code&gt;. I'll try to keep the appendix simple, and mainly put in there the information for the code generation users. Latter I might ask collaboration from Daniele to review and add details regarding his new developments.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-112924503623104451?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/112924503623104451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=112924503623104451' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/112924503623104451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/112924503623104451'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2005/10/c-module-documentation.html' title='C++ module documentation'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-112440565755642556</id><published>2005-08-18T23:41:00.000+01:00</published><updated>2005-08-18T23:55:31.556+01:00</updated><title type='text'>Drop 1 updated plan - Version 5</title><content type='html'>&lt;h2&gt;&lt;a name="2005-08-16" class="ancora"&gt;2005-08-16&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Much time went by without any news noted here. I've been working in the reverse engineering, having added a new translation unit (&lt;code&gt;DerivedFromAbstract.cxx&lt;/code&gt;) that has more constructs to be reverse engineered to UML.&lt;/p&gt;&lt;p&gt;While at it, I've followed the work in the MDR implementation of the Model sub-system of ArgoUML. The developer who is more actively contributing is Ludo (Ludovic Maitre), who, among other things, proposed a GUI extensions model to enable ArgoUML to work with several UML versions. This is very interesting, as it would make ArgoUML more flexible, customizable and modular. The proposed approach to do it is &lt;a href="http://argouml.tigris.org/servlets/ReadMsg?list=dev&amp;msgNo=18239" class="ligacao"&gt;documented in his post&lt;/a&gt;. I have sent a different proposal, MDA based, which I think would fit better to ArgoUML (&lt;a href="http://argouml.tigris.org/servlets/ReadMsg?list=dev&amp;msgNo=18284" class="ligacao"&gt;see my post here&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;These days ArgoUML development is more active than usual, with work progressing in several fronts. I hope that the interoperability provided by a MDR based implementation of the Model sub-system will attract even more newcomers and previous developers so that this community is boosted to a higher level!&lt;/p&gt;&lt;p&gt;That said, I must complete the &lt;code&gt;TestCppImport.testParseFileDerivedFromAbstract()&lt;/code&gt; test case to start working with Daniele in a common UML profile for C++ that will be used in the module. Maybe if this is developed outside of the ArgoUML project, it might provide a great opportunity for experimentation - Maven instead of Ant - and for reuse outside of ArgoUML. The definition of this profile and its use in both the &lt;code&gt;GeneratorCpp&lt;/code&gt; and the &lt;code&gt;CppImport&lt;/code&gt; is very important for the &lt;a href="#cpp_module_in_user_manual"&gt;documentation of the C++ module in the cookbook&lt;/a&gt;. It could be described as "the C++ generator uses the conventions defined in the UML profile for C++ for generating C++ specific constructs, such as pointers and references".&lt;/p&gt;&lt;h2&gt;&lt;a name="2005-07-03" class="ancora"&gt;2005-07-03&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I delivered yesterday the first version that actualy includes reverse engineering. It reverses the &lt;code&gt;SimpleClass.cpp&lt;/code&gt; file which is in the &lt;code&gt;argouml/modules/cpp/tests/org/argouml/language/cpp/reveng&lt;/code&gt; directory. Sure, it is just a very limited part (even less than the tip of the iceberg), but, it shows that the reverse engineering work is progressing and that the full concept works! So, now I must re-plan, introducing what I already know about the future work. This is an update to the &lt;a href="#cpp_reveng_drop1_plan_v4"&gt;previous version of the plan&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;&lt;a name="cpp_reveng_drop1_plan_v5" class="ancora"&gt;5th version of the plan for C++ reveng drop 1&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Learn how to make the ANTLR parser for debugging and build one.&lt;br&gt;Estimated Effort (EE) = 4 Mh; Short Name (SN) &amp;ndash; &lt;em&gt;ANTLR parser 4 debugging&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2005-02-25 DONE&lt;/strong&gt; &amp;ndash; Although not actually a fully debug enabled parser, but, using the trace capabilities of the ANTLR generator. Note that this makes the parsing much slower and is only usable with small files!&lt;br&gt;Actual Effort (AE) = 2:36&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a name="fix_cpp_grammar_v5" class="ancora"&gt;Debug the C++ grammar and make it pass the tests.&lt;/a&gt;&lt;br&gt;&lt;span style="{text-decoration: line-through}"&gt;EE = 20 Mh&lt;/span&gt; (see bellow); SN &amp;ndash; &lt;em&gt;Fix the C++ grammar&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2005-03-07 PARTIAL&lt;/strong&gt; &amp;ndash; It parses cleanly a simple class and a code snippet with which I was attempting to reproduce the current error in parsing of &lt;code&gt;quadratic.i&lt;/code&gt;.&lt;br&gt;AE = 2:51&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2005-05-13 PARTIAL&lt;/strong&gt; &amp;ndash; I've postponed fixing the parsing of &lt;code&gt;quadratic.i&lt;/code&gt;, since it &lt;a href="ficheiro02.html#2005-04-19"&gt;seams to be complex to solve&lt;/a&gt;. Instead, I've started to fix the grammar in order to provide the parsed information to the &lt;code&gt;Modeler&lt;/code&gt;. The test case &lt;code&gt;TestCppGrammar.testGrammarCallbacks2Modeler()&lt;/code&gt; shows the partial fix. This problem makes the effort estimation for this to change in a dramatic way, since it introduces a huge amount of work that must be done.&lt;br&gt;&lt;strong&gt;New EE = 140 Mh&lt;/strong&gt;&lt;br&gt;AE = 15:54 Mh&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Commit the result of this work and send it to Yolanda. Update the &lt;a href='http://argouml.tigris.org/issues/show_bug.cgi?id=2947'  class='ancora'&gt;issue&lt;/a&gt;.&lt;br&gt;EE 3 Mh; SN &amp;ndash; &lt;em&gt;Commit, Yolanda and issue&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2005-03-09 DONE&lt;/strong&gt; &amp;ndash; I committed the work in progress and updated the issue. Due to the release of a stable version of ArgoUML the work was committed in branch &lt;code&gt;cpp_reveng_work_while_0_18_release&lt;/code&gt;. I only sent to Yolanda an e-mail of thanks. I'll send her the version that will be sent to the ANTLR list.&lt;br&gt;AE = 1:36&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;2nd re-planning of C++ reveng drop 1&lt;br&gt; EE 2 Mh; SN &amp;ndash; &lt;em&gt;2nd re-planning of C++ reveng drop 1&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2005-03-12 DONE&lt;/strong&gt; &amp;ndash; Re-planned and updated the ProcessDashboard phases.&lt;br&gt;AE = 1:39&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a name="update_model_new_pack_n_grammar_v5" class="ancora"&gt;Update the model to reflect the new package and the grammar use.&lt;/a&gt;&lt;br&gt;EE = 2 Mh; SN  &amp;ndash;&lt;em&gt;Module model update for the C++ grammar&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2005-03-16 DONE&lt;/strong&gt; &amp;ndash; Updated and committed.&lt;br&gt;AE = 2:14&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a name="parsed_info_useful_4_reveng_v5" class="ancora"&gt;Make tests that show how the parsed information may be used for reveng.&lt;/a&gt; If some issue exist, analyze how it is done in java reveng and fix the grammar as needed. This includes creating, or improving the current, test cases, which prove how the parsed information may be used for reveng.&lt;br&gt; EE 5 Mh; SN &amp;ndash; &lt;em&gt;Prove that parsed information is useful for reveng&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2005-03-18 DONE&lt;/strong&gt; &amp;ndash; a big issue exists, as documented in the &lt;a href="#fix_cpp_grammar"&gt;above step&lt;/a&gt;.&lt;br&gt;AE = 1:47 Mh&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a name="planning_cpp_reveng_drop1_v5"&gt;Planning of C++ reveng drop 1&lt;/a&gt;. This task includes all the subsequent plan updates of drop 1, instead of having the planning tasks spread throughout the plan. I estimate I'll have 3 more plan updates, including the final, in the end of drop 1.&lt;br&gt; EE 6:00 Mh; SN &amp;ndash; &lt;em&gt;Planning of C++ reveng drop 1&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2005-05-13 PARTIAL&lt;/strong&gt; &amp;ndash; 4th version (3rd update) of the plan.&lt;br&gt;AE = 1:25&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2005-07-03 PARTIAL&lt;/strong&gt; &amp;ndash; 4th update of the plan (5th version).&lt;br&gt;AE = 3:15&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a name="model_impl_PluggableImport_v5" class="ancora"&gt;Model the implementation of &lt;code&gt;org.argouml.application.api.PluggableImport&lt;/code&gt; interface in the C++ reveng module.&lt;/a&gt; Generate the realization of the designed classes. If there are issues in the generation, report them in issuezilla.&lt;br&gt; EE 5 Mh; SN &amp;ndash; &lt;em&gt;Model and generate the realization of the &lt;code&gt;PluggableImport&lt;/code&gt; interface&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2005-05-20 PARTIAL&lt;/strong&gt; &amp;ndash; the model contains this and ArgoUML was used to generate the implementation skeleton. I found issues in the generation, but, didn't report them, so, this isn't finished.&lt;br&gt;AE = 3:22&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a name="support_reveng_prepro_cpp_v5"&gt;Close the circle, by making the module support reveng of preprocessed C++ files.&lt;/a&gt;&lt;br&gt; EE 15 Mh; SN &amp;ndash; &lt;em&gt;Module support of reveng of preprocessed C++&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2005-07-02 DONE&lt;/strong&gt; &amp;ndash; The module now reverses the &lt;code&gt;argouml/modules/cpp/tests/org/argouml/language/cpp/reveng/SimpleClass.cpp&lt;/code&gt; file. I consider this a proof that the circle is closed. The work is far from finished though, so, we need to add more steps, related to what I learned while  making this part of the work...&lt;br&gt;AE = 9:45&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a name="warning_popup_about_cpp_reveng_limits_v5"&gt;A warning popup box must be shown to the user, warning him about the limitations of the C++ reveng module.&lt;/a&gt; This happens when the user selects C++ in the drop down box of the "Import Sources..." dialog. (If this turns out to be difficult, the popup may be shown just before doing the import, when the &lt;code&gt;CppImport.parseFile(xxx)&lt;/code&gt; method is called.) It provides an option for the warning to be shut down forever. Even if the user doesn't select it, the CppImport instance will remember that the warning was shown and will not repeat it as long as it &amp;quot;lives&amp;quot;.The warning should be self explainable, but, may also direct the user to the manual section that describes the C++ modules functionality (&lt;a href="#cpp_module_in_user_manual"&gt;see bellow related issue&lt;/a&gt;).&lt;br&gt; EE 6 Mh; SN &amp;ndash; &lt;em&gt;Warning pop-up about the C++ reveng limitations&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a name="files_with_basic_cpp_subset_v5"&gt;Extend the C++ translation unit files used in the tests to contain a representative C++ sub-set.&lt;/a&gt; These files must contain a basic subset of C++ that is the one used by a person the learning C++. They aren't fancy examples of the powerful language C++ is! All should be compilable with gcc &amp;gt; 2.9x and VC++ 6. All are translation units.&lt;br&gt; EE 8 Mh; SN &amp;ndash; &lt;em&gt;Extend C++ translation unit test files&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a name="clean_reveng_of_test_cpp_translation_units_v5"&gt;Support clean reveng of the test C++ translation units.&lt;/a&gt; This will obviously be the driver task that will require the &lt;a href="#uml_profile_4_cpp_v5"&gt;UML profile for C++&lt;/a&gt; and the &lt;a href="#fix_cpp_grammar_v5"&gt;Fix the C++ Grammar&lt;/a&gt; steps to move forward. I'll consider that as soon as this is finished, the other two will also. This step is dependent of the &lt;a href="#support_for_templates_in_ArgoUML"&gt;template support in ArgoUML issue&lt;/a&gt;.&lt;br&gt;EE 30 Mh; SN &amp;ndash; &lt;em&gt;Support reveng of test C++ translation units&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a name="uml_profile_4_cpp_v5"&gt;Develop a UML profile for C++.&lt;/a&gt; It should be as much as needed, but, contains everything that is needed to model the elements that are contained in the C++ subset that will mark the capabilities of the module (&lt;a href="#files_with_basic_cpp_subset_v5"&gt;see above&lt;/a&gt;). [Check my &lt;a href="#common_community_guidelines_4_modeling_cpp_in_UML"&gt;note above&lt;/a&gt; regarding this step.]&lt;br&gt;EE 20 Mh; SN &amp;ndash; &lt;em&gt;Develop a UML profile for C++&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a name="send_grammar_2_ANTLR_list_v5" class="ancora"&gt;Send a working vanilla version of the grammar to the ANTLR list and announce its use within the ArgoUML project.&lt;/a&gt; Provide feedback as appropriate. Automate the adaption of the files in the module build script.&lt;br&gt;EE 5 Mh; SN &amp;ndash; &lt;em&gt;Send grammar 2 ANTLR list&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Enjoy and celebrate the achievement! Go back to planning next drops. &lt;br&gt;EE 4 Mh; SN &amp;ndash; &lt;em&gt;Plan next drops&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Some of the above steps depend of two of the following issues. These, obviously must be tackled on their own.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;a name="cpp_module_in_user_manual"&gt;make available to users the module documentation&lt;/a&gt;&lt;/strong&gt; (&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=2857"&gt;issue #2857&lt;/a&gt;) &amp;ndash; I'll use this to also document a bit the reveng part. This will be a great exercise, since it defines the functional requirements of the C++ reveng module.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a name="cpp_module_in_cookbook"&gt;Create a section in the cookbook about the C++ module. [TODO: create the issue!]&lt;/a&gt;&lt;/strong&gt; (issue #????) &amp;ndash; This should be done at the same time that I'll work in the manual. I'll contribute also to the modules part.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a name="support_for_templates_in_ArgoUML"&gt;Lack of support for Parameterized Class (Template)&lt;/a&gt;&lt;/strong&gt; (&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=1446"&gt;issue #1446&lt;/a&gt;) &amp;ndash; &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-112440565755642556?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/112440565755642556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=112440565755642556' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/112440565755642556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/112440565755642556'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2005/08/drop-1-updated-plan-version-5.html' title='Drop 1 updated plan - Version 5'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-111930704499397648</id><published>2005-06-20T23:29:00.001+01:00</published><updated>2008-10-16T22:16:25.759+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++ Module'/><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><category scheme='http://www.blogger.com/atom/ns#' term='MDA'/><title type='text'>ModelerImpl and new MDA ideas</title><content type='html'>&lt;h2&gt;&lt;a name="2005-06-20" class="ancora"&gt;2005-06-20&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Now, getting back to the work in reverse engineering module for C++, I'm working in the part that will make the information parsed from the C++ translation unit go into the UML model. &lt;a href="#modeler_impl_01"&gt;Previously&lt;/a&gt; I worked in 
the analysis of this problem. Several design solutions were proposed, but, I don't see them with a clear vision... So, instead of falling into an &lt;em&gt;analysis paralysis&lt;/em&gt; situation, I'll start working in the problem in the pragmatic test driven development way! I'll remember my ideas that spawn from the previous analysis excercise, though, so that if I see some pattern to arise I'll easily map it to these ideas.&lt;/p&gt;&lt;h2&gt;&lt;a name="2005-06-17" class="ancora"&gt;2005-06-17&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I'm working in yet another 
(&lt;a href="#mda-based-programming-lang-specs-n-dev_00"&gt;see here the other two&lt;/a&gt;) proposal for the a future C++ module(s) development according to MDA. Now, what I'm 
considering is to have the C++ module developed according to its own medicine. With this I mean, have the C++ module implemented in C++! For this, and to enable the investment in the java not to be thrown away, I'm considering to have the module developed according to MDA, with two alternate, platform specific implementations and one common abstract model which would be a PIM.&lt;/p&gt;&lt;p class="figura"&gt;&lt;img src="http://www.fileden.com/files/2008/4/5/1853347/MDA_dev_of_cpp_modules.png" width="565" height="417" alt="Proposal for the development of a C++ implementation of the C++ module according to MDA."&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Picture 3&lt;/em&gt; &amp;ndash; Proposal for the development of a C++ implementation of the C++ module according to MDA.&lt;/p&gt;&lt;p&gt;The above picture is very self-explainable. For persons less familiar with MDA, I would say that the PIM and PSM stereotypes stand for Platform Independent Model and Platform Specific Model, respectively. So, we'll have a common PIM of the C++ module, and two implementations. One is the current, or an evolved one already supporting some scriptable capabilities to enable easy customization (I've put &lt;a href="http://www.jython.org"&gt;Jython&lt;/a&gt;, but, with &lt;a href="http://jcp.org/en/jsr/detail?id=223"&gt;JSR 223&lt;/a&gt; out, we could have any compliant java based dynamic language). The other is an alternate implementation, based in C++ and uses some of the C++ libraries like &lt;a href="http://www.boost.org/libs/python"&gt;Boost.Python&lt;/a&gt; (to enable the customization of the code generation) and &lt;a href="http://www.boost.org/libs/spirit"&gt;Boost.Spirit&lt;/a&gt; (a C++ mean parsing machine). The use of &lt;a href="http://www.swig.org"&gt;SWIG&lt;/a&gt; would make the integration between the C++ code and the rest of the java powered ArgoUML easier than using plain JNI.&lt;/p&gt;&lt;p&gt;So, what do you think? Is this utopic enough for you to jump along and help me prove there are no impossibles?! This will enable the C++ fans to work in the C++ module tasting their own medicine ;-)... Herrr, of course it must be the MDA way!&lt;/p&gt;&lt;h3&gt;&lt;a name="non_top_level_stereotypes_not_available_4_selection_01"&gt;3295 crushed!&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=3295"&gt;Michiel commited my patch proposal.&lt;/a&gt; I synchronized with the repository &amp;ndash; update overwrite &amp;ndash; and it is working fine. Now, I remember that I forgot to run the checkstyle tests on top of my code before sending the patch!!! Big mistake, when the bug was reported and the patch attached to the issue I was in the end of a big 19 h day. This was a missed opportunity to hold on the horses a bit and wait to have a fresher mind...&lt;/p&gt;&lt;p&gt;The issue is now marked as FIXED and I'm happy to have my &lt;a href="#non_top_level_stereotypes_not_available_4_selection"&gt;initial itch&lt;/a&gt; gone from ArgoUML ;-))&lt;/p&gt;&lt;h2&gt;&lt;a name="2005-06-16" class="ancora"&gt;2005-06-16&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I created the 
&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=3295"&gt;# 3295 issue&lt;/a&gt; which is the &lt;a href="#non_top_level_stereotypes_not_available_4_selection"&gt;Stereotypes contained in packages aren't available for selection&lt;/a&gt; problem.&lt;/p&gt;&lt;h2&gt;&lt;a name="2005-06-14" class="ancora"&gt;2005-06-14&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;One of the things that are limiting my use of ArgoUML for modeling is its UML version support. Argo is at UML 1.3 and this has some annoyancies. One that I dislike very much is the fact that you can only apply one stereotype in a model element. In UML 1.5 I may apply several stereotypes to a model element. This, for MDA work is very important, I think...&lt;/p&gt;&lt;h2&gt;&lt;a name="2005-06-09" class="ancora"&gt;2005-06-09&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;There are more problems with stereotypes than I thought of. While testing my fix I have the following:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a name="create_stereo_in_pack_not_shown"&gt;Stereotype created from a package properties panel isn't shown in the package's figure&lt;/a&gt; &amp;ndash; it happens when you create a 
  stereotype from the package properties panel, after creating the stereotype, it isn't shown in the package figure. As a work around you have to select the model element in the diagram, right click it, then "Show" / "Hide Stereotype", then do the same thing, but, "Show Stereotype". The correct behavior is what happens for classes.&lt;/li&gt;&lt;li&gt;&lt;a name="duplicate_builtin_stereotype_shown_4_selection"&gt;Duplicate built-in stereotypes are shown in list for selection&lt;/a&gt; &amp;ndash; this occurs after choosing one of the built-in stereotypes for a first time, it seams that it is added to the model and them it is shown twice in the stereotype drop down box of the model element's properties panel.&lt;/li&gt;&lt;li&gt;&lt;a name="created_nontoplevel_stereotype_not_applied"&gt;Created non-top level stereotype from a model element properties isn't applied &lt;/a&gt; &amp;ndash; this occurs when you are creating a stereotype in the properties of a model element and it isn't in a top level package. The stereotype isn't applied to the model element. &lt;strong&gt;DONE&lt;/strong&gt; This went away after my fix to the non-top level stereotype problem.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I had a problem with my working setup in ArgoUML. The 
&lt;a href="http://www.wincvs.org"&gt;WinCVS&lt;/a&gt;, after an update of the &lt;a href="http://www.python.org"&gt;Python&lt;/a&gt; installation, didn't worked anymore. It crashes almost immediatly and just leaves a small core dump file (I think because I'm driving a windows box). Because of this I attempted uninstalling and installing, but, no can do! I wonder if the WinCVS crew would like to receive my trouble 
report?!?&lt;/p&gt;&lt;p&gt;So, I made a clean checkout directly in 
&lt;a href="http://www.eclipse.org"&gt;Eclipse&lt;/a&gt; and this worked very well. Now, the catch(!) only after a painful process of reconfiguring my all environment I discovered this nice feature of eclipse &amp;ndash; select a project, right click, 
then choose "Team" / "Shared Project...", and, if the project contains some CVS directories it asks if you want to configure CVS for it! Great! So, I re-discovered the following maxima: &lt;strong&gt;know your tools!&lt;/strong&gt;&lt;/p&gt;&lt;h2&gt;&lt;a name="2005-06-06" class="ancora"&gt;2005-06-06&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I'm still fighting against the &lt;a href="#non_top_level_stereotypes_not_available_4_selection"&gt;Stereotypes contained in packages aren't available for selection&lt;/a&gt; bug. The test case I'm developing for testing the problem is the &lt;code&gt;TestExtensionMechanismsHelper.testGetAllPossibleStereotypesStereotypeAndMEContainedInSubPackage()&lt;/code&gt;. It tests exactly what was previously done for the &lt;code&gt;TestUMLModelElementStereotypeComboBoxModel.testStereotypesContainedInPackagesAreAvailable4Selection()&lt;/code&gt;, but, this one puts the emphasis in being an &lt;code&gt;ExtensionMechanismsHelper&lt;/code&gt; test.  Since it doesn't use NSUML classes I put it in the &lt;code&gt;org.argouml.model&lt;/code&gt; package. It is really a test to the &lt;code&gt;org.argouml.model.ExtensionMechanismsHelper&lt;/code&gt; interface and not to a specific implementation, like the previously existing &lt;code&gt;org.argouml.model.uml.TestExtensionMechanismsHelper&lt;/code&gt; test is.&lt;/p&gt;&lt;p&gt;Now, all tests are running and it should be OK to make the changes to the model according to what I was trying to do in the C++ module, in the first place. I'm modeling some ideas about the architectural organization for future C++ module development. Some ideas, like the &lt;a href="#mda-based-programming-lang-specs-n-dev_00"&gt;MDA specification of programming languages&lt;/a&gt;, are much wider than the C++ 
module, but, could be a bit utopic...&lt;/p&gt;&lt;h2&gt;&lt;a name="2005-06-03" class="ancora"&gt;2005-06-03&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;&lt;a name="non_top_level_stereotypes_not_available_4_selection"&gt;Stereotypes contained in packages aren't available for selection&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;I found a new bug in ArgoUML! If you create a stereotype in a package, it won't be available for selection and assigning it to a model element. This occurs in ArgoUML 0.18.1. I'm going to try to reproduce with HEAD and maybe fix it!&lt;/p&gt;&lt;p&gt;I have an example of the problem. Loading it with Argo HEAD... Yeah, it is still present. So, lets see if this is fixable...&lt;/p&gt;&lt;p&gt;Alright, I have a suspect! The &lt;code&gt;org.argouml.uml.ui.foundation.core.UMLModelElementStereotypeComboBoxModel&lt;/code&gt;class is used in &lt;code&gt;org.argouml.uml.ui.foundation.core.PropPanelModelElement&lt;/code&gt; and should be responsible for the drop down combo box contents for the stereotypes. It does use an &lt;code&gt;org.argouml.model.ExtensionMechanismsHelper&lt;/code&gt;. Now, the only implementor is the &lt;code&gt;org.argouml.model.uml.ExtensionMechanismsHelperImpl&lt;/code&gt;. Let us check if this guy has some tests... Nope! So, no test driven debugging available 
here.&lt;/p&gt;&lt;p&gt;Let's check if the user &lt;code&gt;UMLModelElementStereotypeComboBoxModel&lt;/code&gt; has tests... Jackpot! It is the 
&lt;code&gt;TestUMLModelElementStereotypeComboBoxModel&lt;/code&gt; Now I have something to start with... Lets write a unit test to reproduce the problem.&lt;/p&gt;&lt;p&gt;Upsss, found a dependency from a NSUML class (&lt;code&gt;ru.novosoft.uml.foundation.extension_mechanisms.MStereotype&lt;/code&gt;)! This must also go away! &lt;strong&gt;DONE&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Alright, after some time I already have a failing test, it is &lt;code&gt;testStereotypesContainedInPackagesAreAvailable4Selection()&lt;/code&gt;. Now, lets debug and check what is going wrong...&lt;/p&gt;&lt;p&gt;The function where all interesting action is happening is &lt;code&gt;UMLModelElementStereotypeComboBoxModel.buildModelList()&lt;/code&gt;. This is triggered by the &lt;code&gt;UMLComboBoxModel2.targetSet(TargetEvent e)&lt;/code&gt; function, which I call in my test. Now, the model list building has the error I'm trying to fix and something I might call &lt;em&gt;hand crafted code obfuscation&lt;/em&gt;! It contains code which looks suspiciously useless, but, rather complicated... I've marked it with background red color.&lt;/p&gt;&lt;pre&gt;
    protected void buildModelList() {
        Object elem = /*(MModelElement)*/ getTarget();&lt;/pre&gt;&lt;div style="background-color: red"&gt;&lt;pre&gt;        Set paths = new HashSet();
        Set elements = new TreeSet(new Comparator() {
            public int compare(Object o1, Object o2) {
                try {
                    String name1 = o1 instanceof String
                        ? (String) o1 : Model.getFacade().getName(o1);
                    String name2 = o2 instanceof String
                        ? (String) o2 : Model.getFacade().getName(o2);
                    name1 = (name1 != null ? name1 : "");
                    name2 = (name2 != null ? name2 : "");

                    return name1.compareTo(name2);
                } catch (Exception e) {
                    throw new ClassCastException(e.getMessage());
                }
           }
        });&lt;/pre&gt;&lt;/div&gt;&lt;pre&gt;        Collection models =
            ProjectManager.getManager().getCurrentProject().getModels();&lt;/pre&gt;
&lt;div style="background-color: red"&gt;&lt;pre&gt;
        addAllUniqueModelElementsFrom(
           elements,
           paths,
           Model.getExtensionMechanismsHelper()
                .getAllPossibleStereotypes(models, elem));&lt;/pre&gt;&lt;/div&gt;&lt;pre&gt;
        setElements(Model.getExtensionMechanismsHelper()
           .getAllPossibleStereotypes(models, elem));
    }
&lt;/pre&gt;&lt;p&gt;Then it calls the method &lt;code&gt;ExtensionMechanismsHelper.getAllPossibleStereotypes(models, elem)&lt;/code&gt; which seams to be the origin of the bug. So, I'll remove the useless code (if it proves as such) and make another test on the failing function that should retrieve all stereotypes applicable to the model element within the specified models.&lt;/p&gt;&lt;h3&gt;&lt;a name="argo_processor_hog"&gt;Argo is a processor hog&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Hell! Today I can't work with Argo! It is dragging! After some changes in a middle sized project - the C++ module model, &lt;code&gt;argouml/modules/cpp/doc/ArgoUML.zargo&lt;/code&gt; - it started to toggle high processor cycles. When I found the previous bug and wanted to save the model and close ArgoUML 0.18.1, it went full load on the processor and I had to kill 
it the dirty way. So, yesterday I did two things, update the JRE to 1.5.0_02, 
and downloaded ArgoUML 0.18.1 so that I would work in the model with the 
stable version(!). Clearly something went wrong! Here is the &lt;em&gt;System Information&lt;/em&gt;:&lt;/p&gt;&lt;pre&gt;
Java Version  : 1.5.0_02
Java Vendor  : Sun Microsystems Inc.
Java Vendor URL : http://java.sun.com/
Java Home Directory : C:\Programas\Java\jre1.5.0_02
Java Classpath  : C:\luis\programas\ArgoUML\0.18.1\argouml.jar
Operation System : Windows XP, Version 5.1
Architecture  : x86
User Name  : luis
User Home Directory : C:\Documents and Settings\luis
Current Directory : C:\luis\programas\ArgoUML\0.18.1
JVM Total Memory : 7729152
JVM Free Memory : 3209392
&lt;/pre&gt;&lt;p&gt;I'll try to work a bit with a new model to see if the same thing 
happens...&lt;/p&gt;&lt;p&gt;Nothing, no peek processor loads! Well, at least I have my example for &lt;a href="#non_top_level_stereotypes_not_available_4_selection"&gt;the other problem&lt;/a&gt;. The final test, lets try to save the example... No problem!&lt;/p&gt;&lt;h2&gt;&lt;a name="2005-06-01" class="ancora"&gt;2005-06-01&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href="#check_spelling_in_vim"&gt;I previously considered about spell 
checking in Vim&lt;/a&gt; and I've found about the &lt;a href="http://www.vim.org/scripts/script.php?script_id=465"&gt;vimspell&lt;/a&gt; plugin for &lt;a href="http://www.vim.org"&gt;Vim&lt;/a&gt;. The plugin isn't working with my Vim version (6.3). There are some errors in the plugin installation, maybe related to this script not being up-to-date with Vim... All the other plugins for spell checking don't seam to be better. So I'm giving up on this for now :-(&lt;/p&gt;&lt;p&gt;As a better replacement for my current spell checking approach, I use aspell directly with the command: &lt;/p&gt;&lt;pre&gt;aspell -c file.html&lt;/pre&gt;&lt;h2&gt;&lt;a name="2005-05-31" class="ancora"&gt;2005-05-31&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;&lt;a name="modeler_impl_02"&gt;&lt;code&gt;ModelerImpl&lt;/code&gt;: the Java's &lt;code&gt;Modeller&lt;/code&gt; design and recall of discussion with Andreas Rueckert&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Andreas Rueckert is the author of the ArgoUML reverse engineering for java and classfile. I previously discussed with him my plans for the C++ reveng work. He warned that reusing the java &lt;code&gt;Modeller&lt;/code&gt; would not work since it is specific for the java semantics. This &lt;code&gt;Modeller&lt;/code&gt; was originally made by Marcus Andersson, in the context of &lt;a href="http://sourceforge.net/projects/javare/"&gt;his java reveng project&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;It refers to the JSR 26, which should be the Java language mapping to UML. [I'm currently traveling by train and offline, so, I can't confirm this.] The current state of the &lt;code&gt;Modeller&lt;/code&gt; is very little configurability. This isn't totally bad, since the user might post-process the reversed model with some MDA tool to get a more abstract model. This would be interesting if you are working with an enterprise application, where, e.g., you want some group of files to be associated with an EJB. I will browse a bit in the original &lt;a href="http://sourceforge.net/projects/javare/"&gt;javare&lt;/a&gt; project, to see if it is still going.&lt;/p&gt;&lt;p&gt;It is stopped, since it achieved its goal of providing a reveng implementation according to the JSR 26 spec for ArgoUML. Now, maintenance continues in the ArgoUML project.&lt;/p&gt;&lt;p&gt;The java &lt;code&gt;Modeller&lt;/code&gt; uses the notion of &lt;code&gt;Context&lt;/code&gt; to store information about the parsing context. It is designed as a class hierarchy of contexts, with a &lt;code&gt;ClassifierContext&lt;/code&gt; and a &lt;code&gt;PackageContext&lt;/code&gt;. These context classes are tied to ArgoUML reveng, being dependent of &lt;code&gt;org.argouml.model&lt;/code&gt; package. The &lt;code&gt;Modeller&lt;/code&gt; stores a stack of parsing states (&lt;code&gt;ParseState&lt;/code&gt;) which have context information. I think that even if I can't reuse directly the classes, I might reuse the idea, implementing it in a more general and decoupled way and them make it available for reuse to other reveng modules.&lt;/p&gt;&lt;h2&gt;&lt;a name="2005-05-25" class="ancora"&gt;2005-05-25&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I &lt;a href="#modeler_impl"&gt;previously started analyzing the requirements of &lt;code&gt;ModelerImpl&lt;/code&gt;&lt;/a&gt;, but, left it incomplete. Now I'm going to continue with this here.&lt;/p&gt;&lt;h3&gt;&lt;a name="modeler_impl_01"&gt;&lt;code&gt;ModelerImpl&lt;/code&gt;: analysis of responsibilities&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A &lt;code&gt;Modeler&lt;/code&gt; implementation must:&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;&lt;p&gt;&lt;strong&gt;Understand very well the C++ syntax and semantics.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The syntax is in its method names and arguments, although without the clear order in which calls might be made. This could be improved by adding a clear contract to the interface, but, for now I'll leave it as it is and just state that complete syntax information should be looked up in the grammar.&lt;/p&gt;&lt;p&gt;The semantics is something that will be built within, as part of the implementation. I would say that knowing about semantics is, for instance, to know that a method of some class which has the &lt;code&gt;virtual&lt;/code&gt; modifier is polymorphical and that if some derived class (direct or indirect) has the same method (name and args) even if it does not have the &lt;code&gt;virtual&lt;/code&gt; keyword, it is polymorphical. This knowledge is important since this semantics has representation in UML and therefore it should be created in the model.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Keep the state of the parsing in a way that when it is called about some parsed construct it models it according to the context.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Understand very well UML and the specific ArgoUML representation of it (this is available in the &lt;code&gt;org.argouml.model&lt;/code&gt; package).&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Model C++ in UML according to guidelines accepted in common by the community.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Maybe there exist already some UML profile, maybe even a standard one defined by OMG... I googled a bit on &lt;em&gt;"UML profile for C++"&lt;/em&gt; and couldn't find one, apart from the UML tool vendors. &lt;a href="http://www.objecteering.com"&gt;Objecteering&lt;/a&gt; has defined one, but, this certainly comes associated with some copyright. It is also proprietary, due to their notion of a UML profile as a MDA component. I prefer to see a UML profile as a model that one may import into our model. ArgoUML should have a UML profile for C++!&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Be flexible, i.e., it should be possible to configure it according to the user's preferences.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;One could have default configurations on the module that might be overridden by the user's preferences. Things that should be possible to configure are: model pure virtual class as interface or as abstract class, array or STL container modeled as DataTypes or as association with multiplicity, model references and pointers as associations or as DataTypes, etc.&lt;/p&gt;&lt;p&gt;More, it would be interesting to configure the reverse engineering to use different options for different packages and / or classes. This would be kept persistently in the model, so that in a future import the user would not need to specify it again.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This seams to be too much responsibility to put on top of just one class! I could start already developing and deal with a functionally overloaded and crowded class when it gives problems, but, I think I may start decomposing the problem into smaller parts, just looking at the above list of responsibilities.&lt;/p&gt;&lt;p&gt;Clearly the understanding about C++ syntax and semantics should be close to the &lt;code&gt;Modeler&lt;/code&gt; implementation, since its interface is already loaded with these details. Now, about keeping state of the parsing, maybe this should be abstracted from the part of the code that actually makes the translation, since, in a future evolution I might add AST functionality to the grammar, therefore, the Modeler might be capable of navigating back and forth 
as it models the parsed code. So, maybe I should have something like a component that records the parsed information and is able to provide the context on demand of the actual modeler. I see this as a need when the modeler has full data to model an attribute of a class, and it has to add details regarding the containment and visibility of the attribute.&lt;/p&gt;&lt;p&gt;Now a use case, what if parsing of a given translation unit fails? Should the Modeler undo the import? I think I would like that in this case the parsing just warns about not being able to parse and to issue a clear message about the place where it is failing, with no changes being made to the 
model. Better it should be configurable! In this case, I think this responsibility should be moved to the &lt;code&gt;CppImport&lt;/code&gt; class.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-111930704499397648?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/111930704499397648/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=111930704499397648' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/111930704499397648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/111930704499397648'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2005/06/modelerimpl-and-new-mda-ideas.html' title='ModelerImpl and new MDA ideas'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-111697505142708206</id><published>2005-05-24T23:46:00.001+01:00</published><updated>2008-10-16T22:20:32.049+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++ Module'/><category scheme='http://www.blogger.com/atom/ns#' term='ArgoUML'/><category scheme='http://www.blogger.com/atom/ns#' term='MDA'/><title type='text'>PluggableImport implementation and 4th plan update of reveng drop 1 (also some new ideas)</title><content type='html'>&lt;h2&gt;&lt;a name="2005-05-23" class="ancora"&gt;2005-05-23&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I finished reading the book &lt;a href="http://www.research.att.com/~bs/3rd.html"&gt;The C++ Programming Language&lt;/a&gt; 3rd edition, by Bjarne Stroustrup, the creator of C++. This was one important step to master this language. Previously I read introductory books by Bruce Eckel, which put me on track, but, having read Stroustrup's book was needed in order to have a definite understanding of the language. One thing I may regret was not having solved the exercises. At least I should have solved a selection of three or four per chapter.&lt;/p&gt;&lt;p&gt;So, next steps? I think that continuing with the work in the C++ module is a nice complement to the book. After reverse engineering is working satisfactorily, working in a C++ profile, which makes the standard library available to be used in models, is something that would naturally make my knowledge improve. I could also get involved in an open source project where C++ is the language of implementation. Another possibility is to work in the &lt;em&gt;Doer&lt;/em&gt; enterprise pattern. We'll see...&lt;/p&gt;&lt;h2&gt;&lt;a name="2005-05-20" class="ancora"&gt;2005-05-20&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;&lt;a name="htmled_06"&gt;htmled, the handbook editor blog and publisher&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;I take notes in my personal programming handbook. This handbook is digital and written in HTML. It is from the handbook notes that I create the &lt;a href="http://argonauts-life.blogspot.com/"&gt;Argonaut's life blog&lt;/a&gt;. It isn't something that takes much effort, but, this is the kind of repetitive task that I, as a Software Engineer, should consider for automation. Doing it manually is boring and error prone.&lt;/p&gt;&lt;p&gt;Previously I considered automating the edition of my handbook. My idea is to write a plugin for eclipse or a module for Netbeans, where all the things I make manually while adding content in the handbook automated. Also automated is the task of copying and adapting content from the handbook to the blog.&lt;/p&gt;&lt;p&gt;The handbook as a different structure from the blog, since I normally write top down and it is usually offline. The storage is as HTML files, and I try to keep these files under 100 KB. In the blog the last entry is made in the top of the page. It contains some automation that archives previous entries by month or year. Pictures and files aren't allowed and so I store them in &lt;a href="http://webspace.zmail.pt/euluis/"&gt;my website&lt;/a&gt;. Also, I must take care to change the links I make internally and also to censor some parts of the handbook that I don't want to publish.&lt;/p&gt;&lt;p&gt;In a perfect solution, I would edit my handbook, creating entries and changing others within the IDE, while I work in ArgoUML or some other thing. I have support for automating some specific tasks, such as entering portuguese accentuation. It enables easy adding linking of content, distinguishing internal (within the handbook), local (within my PC) and external links. It must provide many of the basic functionalities of Web editors, but this isn't very important, since I'm comfortable with working in HTML source.&lt;/p&gt;&lt;p&gt;When I go online (yes, I'm not always connected!) and want to put some content in the blog, it will connect to the blog, discover what is changed and update it. The parts in my handbook I've marked as censored would not go online. A nice to have is for the plugin to warn me about some new comments and bring, as in a inbox scheme, show the headers and a small preview and allow me to see what people have been saying.&lt;/p&gt;&lt;p&gt;So, as with everything, I'm lazy and I should look for something that already exists, so that I may get back to my C++ module. Since I'm right now in the train, it will have to wait for some future opportunity.&lt;/p&gt;&lt;h3&gt;&lt;a name="model_impl_PluggableImport_02"&gt;&lt;code&gt;CppImport&lt;/code&gt;: some notes on the current state of the implementation&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;I previously wrote that this is done. It is just &lt;em&gt;partially&lt;/em&gt; done. There are issues which I documented in the source file as &lt;code&gt;TODO&lt;/code&gt;s. These are easily detect by the IDE and I will remember about them, but, I shouldn't write things that aren't true, hiding future work.&lt;/p&gt;&lt;h3&gt;&lt;a name="check_spelling_in_vim"&gt;Check spelling in Vim&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;I use &lt;a href="http://www.vim.org/"&gt;Vim&lt;/a&gt; for many things. Most importantly to write these words. Since English isn't my mother language I have to check spelling after writing. This I do in the &lt;a href="http://www.mozilla.org/"&gt;Mozilla&lt;/a&gt; Composer. This isn't very productive, so, is it possible to do it in Vim?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;TODO&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Another possibility would be to tweak the Mozilla Composer until it makes the editing as it should be: configurable, respectful of source code formating, support for automation, etc. The main reason I always rejected using these WYSIWYG editors since they make such a bad HTML source! Maybe its the time for me to make them the way I want!&lt;/p&gt;&lt;h3&gt;&lt;a name="modeler_impl"&gt;&lt;code&gt;ModelerImpl&lt;/code&gt;: starting-up&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Now I'm going to start to put the parsed information into the model. After the grammar, this will be the hardest part of &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=2947"&gt;this issue&lt;/a&gt;. A &lt;code&gt;Modeler&lt;/code&gt; implementation must:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;understand very well the C++ syntax and semantics&lt;/li&gt;&lt;li&gt;keep the state of the parsing in a way that when it is called about some parsed construct it models it according to the context&lt;/li&gt;&lt;li&gt;understand very well UML&lt;/li&gt;&lt;li&gt;model C++ in UML according to guidelines accepted in common by the community –&lt;/li&gt;&lt;li&gt;be flexible, i.e., it should be possible to configure it according to the user's preferences&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;&lt;a name="2005-05-16" class="ancora"&gt;2005-05-16&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;&lt;a name="model_impl_PluggableImport_01"&gt;Starting with &lt;code&gt;PluggableImport&lt;/code&gt; implementation&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;So, going ahead with this... I already found some problems with the java generator:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The java generator doesn't generate the standard javadocs correctly. I will try to fix this, but, first I must report it in an issue.&lt;/li&gt;&lt;li&gt;I must find a way to use the generator with a template, or make it more customizable. If there exist the chance for this I must know about it. The manual doesn't contain description of this possibility. Alas, it doesn't have anything describing specifically the java code generation... I'm going to look in the &lt;code&gt;GeneratorJava&lt;/code&gt; source for possible hints... At least from what I see in the &lt;code&gt;generateHeader&lt;/code&gt; method, this is marked as a TODO. It seams I have an opportunity to do work both in the java generator and in the C++ generator, which from the &lt;code&gt;readme.txt&lt;/code&gt;file seams to be ahead.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Now, I have the &lt;code&gt;CppImport&lt;/code&gt; implementation, but, the module only publicizes the &lt;code&gt;GeneratorCpp&lt;/code&gt; class and therefore the &lt;code&gt;org.argouml.application.modules.ModuleLoader&lt;/code&gt; doesn't find it. One question remains to be answered: is it possible to have two modules in one jar file? If so, then I may just make the needed adjustments in the manifest file of the C++ module. If not I may have to implement a facade that implements both modules and delegates according to the appropriate methods, but, this will be messy. By adding a new entry group with
&lt;code&gt;Name: org/argouml/language/cpp/reveng/CppImport.class&lt;/code&gt;
to the manifest it already works. Nice :-))&lt;/p&gt;&lt;p&gt;OK, apart from reporting the issues above (and probably working in fixing them), this is finished. So, proceeding with &lt;a href="#support_reveng_prepro_cpp"&gt;the next step&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;&lt;a name="2005-05-13" class="ancora"&gt;2005-05-13&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I finished today a initial part of fixing the grammar – to provide information from parsing to the &lt;code&gt;Modeler&lt;/code&gt;. Instead of proceeding right now with a complete fix I'll address another area of the drop 1 plan, &lt;a href="#model_impl_PluggableImport"&gt;start the implementation of &lt;code&gt;PluggableImport&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;But before I'll update the plan according to the execution evolution.&lt;/p&gt;&lt;h3&gt;&lt;a name="cpp_reveng_drop1_plan_v4" class="ancora"&gt;4th version of the plan for C++ reveng drop 1&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This is a plan update that is less radical than the &lt;a href="#cpp_reveng_drop1_plan3" class="ligacao"&gt;previous one&lt;/a&gt;, but, reflects the improved knowledge I have on the scope of the problem. I'll update the efforts, both the estimated and the actual until now.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Learn how to make the ANTLR parser for debugging and build one.
Estimated Effort (EE) = 4 Mh; Short Name (SN) – &lt;em&gt;ANTLR parser 4 debugging&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2005-02-25 DONE&lt;/strong&gt; – Although not actually a fully debug enabled parser, but, using the trace capabilities of the ANTLR generator. Note that this makes the parsing much slower and is only usable with small files!
Actual Effort (AE) = 2:36&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a name="fix_cpp_grammar" class="ancora"&gt;Debug the C++ grammar and make it pass the tests.&lt;/a&gt;
&lt;span style="text-decoration: line-through;"&gt;EE = 20 Mh&lt;/span&gt; (see bellow); SN – &lt;em&gt;Fix the C++ grammar&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2005-03-07 PARTIAL&lt;/strong&gt; – It parses cleanly a simple class and a code snippet with which I was attempting to reproduce the current error in parsing of &lt;code&gt;quadratic.i&lt;/code&gt;.
AE = 2:51&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2005-05-13 PARTIAL&lt;/strong&gt; – I've postponed fixing the parsing of &lt;code&gt;quadratic.i&lt;/code&gt;, since it &lt;a href="#2005-04-19"&gt;seams to be complex to solve&lt;/a&gt;. Instead, I've started to fix the grammar in order to provide the parsed information to the &lt;code&gt;Modeler&lt;/code&gt;. The test case &lt;code&gt;TestCppGrammar.testGrammarCallbacks2Modeler()&lt;/code&gt; shows the partial fix. This problem makes the effort estimation for this to change in a dramatic way, since it introduces a huge amount of work that must be done.
&lt;strong&gt;New EE = 140 Mh&lt;/strong&gt;
AE = 15:54 Mh&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Commit the result of this work and send it to Yolanda. Update the &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=2947" class="ancora"&gt;issue&lt;/a&gt;.
EE 3 Mh; SN – &lt;em&gt;Commit, Yolanda and issue&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2005-03-09 DONE&lt;/strong&gt; – I committed the work in progress and updated the issue. Due to the release of a stable version of ArgoUML the work was committed in branch &lt;code&gt;cpp_reveng_work_while_0_18_release&lt;/code&gt;. I only sent to Yolanda an e-mail of thanks. I'll send her the version that will be sent to the ANTLR list.
AE = 1:36&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;2nd re-planning of C++ reveng drop 1
EE 2 Mh; SN – &lt;em&gt;2nd re-planning of C++ reveng drop 1&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2005-03-12 DONE&lt;/strong&gt; – Re-planned and updated the ProcessDashboard phases.
AE = 1:39&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a name="update_model_new_pack_n_grammar" class="ancora"&gt;Update the model to reflect the new package and the grammar use.&lt;/a&gt;
EE = 2 Mh; SN  –&lt;em&gt;Module model update for the C++ grammar&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2005-03-16 DONE&lt;/strong&gt; – Updated and committed.
AE = 2:14&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a name="parsed_info_useful_4_reveng" class="ancora"&gt;Make tests that show how the parsed information may be used for reveng.&lt;/a&gt; If some issue exist, analyze how it is done in java reveng and fix the grammar as needed. This includes creating, or improving the current, test cases, which prove how the parsed information may be used for reveng.
EE 5 Mh; SN – &lt;em&gt;Prove that parsed information is useful for reveng&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2005-03-18 DONE&lt;/strong&gt; – a big issue exists, as documented in the &lt;a href="#fix_cpp_grammar"&gt;above step&lt;/a&gt;.
AE = 1:47 Mh&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a name="planning_cpp_reveng_drop1"&gt;Planning of C++ reveng drop 1&lt;/a&gt;. This task includes all the subsequent plan updates of drop 1, instead of having the planning tasks spread throughout the plan. I estimate I'll have 3 more plan updates, including the final, in the end of drop 1.
EE 6:00 Mh; SN – &lt;em&gt;Planning of C++ reveng drop 1&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2005-05-13 PARTIAL&lt;/strong&gt; – 4th version (3rd update) of the plan.
AE = 1:25&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a name="model_impl_PluggableImport" class="ancora"&gt;Model the implementation of &lt;code&gt;org.argouml.application.api.PluggableImport&lt;/code&gt; interface in the C++ reveng module.&lt;/a&gt; Generate the realization of the designed classes. If there are issues in the generation, report them in issuezilla.
EE 5 Mh; SN – &lt;em&gt;Model and generate the realization of the &lt;code&gt;PluggableImport&lt;/code&gt; interface&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a name="support_reveng_prepro_cpp"&gt;Close the circle, by making the module support reveng of preprocessed C++ files.&lt;/a&gt;
EE 15 Mh; SN – &lt;em&gt;Module support of reveng of preprocessed C++&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a name="send_grammar_2_ANTLR_list" class="ancora"&gt;Send a working vanilla version of the grammar to the ANTLR list and announce its use within the ArgoUML project.&lt;/a&gt; Provide feedback as appropriate. Automate the adaption of the files in the module build script.
EE 5 Mh; SN – &lt;em&gt;Send grammar 2 ANTLR list&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Enjoy and celebrate the achievement! Go back to planning next drops.
EE 4 Mh; SN – &lt;em&gt;Plan next drops&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;&lt;a name="2005-05-10" class="ancora"&gt;2005-05-10&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I have some strange errors when parsing the &lt;code&gt;SimpleClass::newAttr&lt;/code&gt; declaration. For some reason it isn't reported from the parser as was the &lt;code&gt;SimpleClass::newOperation&lt;/code&gt; declaration...&lt;/p&gt;&lt;h2&gt;&lt;a name="2005-05-04" class="ancora"&gt;2005-05-04&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;&lt;a name="mda-based-programming-lang-specs-n-dev_00"&gt;MDA based programming languages specification and development&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;While developing the C++ module for ArgoUML I started to think about how many repetitive and low level work I would have to make the yet-to-start Python module. How about the amount of work that would go to maintain the java and classfile modules? This is something that should be better supported within ArgoUML than to just provide a template, e.g., the &lt;em&gt;dummylanguage&lt;/em&gt; and existing implementations. We could provide some MDA support for this kind of work, such as the possibility of specifying a PIM of the language support module, with &lt;em&gt;Generator&lt;/em&gt;, &lt;em&gt;Importer&lt;/em&gt; – for reverse engineering – and &lt;em&gt;Synchronizer&lt;/em&gt; – for Round Trip Engineering (RTE) (this one is dependent of the other two being available) – as components. This Platform Independent Model (PIM) would then be transformed into the PSM that would target ANTLR based reverse engineering, a StringTemplate based code generator and a common generic GUI based synchronization. This would make life a lot easier for the development of language support modules and would also, hopefully, provide more reuse opportunities out of this development!&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.fileden.com/files/2008/4/5/1853347/MDA_dev_of_language_modules.png"&gt;&lt;/p&gt;&lt;p&gt;This idea led me to yet another bigger, which is, how about taking a Model Driven Architecture (MDA) approach to the specification and development of programming languages? This would imply having reverse engineering of programming language grammars into a UML profile for language grammars. Then we could define a MDA transformation between the Computation Independent Model (CIM) which is the MOF based grammar model for a given programming language into PIMs that would be based in a UML profile for doing something with the specified language. We could define a PIM for compilers, another for RTE of the language in the context of a Model Driven Design (MDD) tool like ArgoUML, and another for Integrated Development Environment (IDE) support of the tool. These PIMs could then be transformed into PSMs for specific targets, e.g, respectively the Jython compiler, the ArgoUML python module, and the eclipse plugin for python or Jython support within eclipse.&lt;/p&gt;&lt;p&gt;For this idea to work a MOF based domain language must be specified to enable the specification of programming language grammars in a MOF repository. We would also need the support for including semantics of the language constructs to the CIMs. For this we could use a ontology that would be used to enrich the CIMs. This ontology may be based on something existing or something based in the UML spec.&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.fileden.com/files/2008/4/5/1853347/MDA_spec_n_dev_of_programming_languages.png"&gt;&lt;/p&gt;&lt;h2&gt;&lt;a name="2005-05-03" class="ancora"&gt;2005-05-03&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I'm now delving deep into changing the grammar to make the needed info available to the &lt;code&gt;Modeler&lt;/code&gt;. The header and implementation files aren't available since the parser works with the &lt;em&gt;translation units&lt;/em&gt; therefore the modeling of source file components will be left out for now.&lt;/p&gt;&lt;h2&gt;&lt;a name="2005-05-02" class="ancora"&gt;2005-05-02&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Updated &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=2947"&gt;issue #2947 – support for C++ reverse engineering&lt;/a&gt; to include the details of the merge and about the option taken retrieve information from the parsing of files.&lt;/p&gt;&lt;h2&gt;&lt;a name="2005-05-01" class="ancora"&gt;2005-05-01&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I have created the following issues for &lt;a href="#2005-03-14"&gt;problems I found previously&lt;/a&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=3201"&gt;#3201 – non-console log4j configurations should include date&lt;/a&gt;. This is the previously referred problem I found with the non-console log4j configurations.&lt;/li&gt;&lt;li&gt;&lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=3202"&gt;#3202 – Support of UML foundation types&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I'm going to commit the work in progress to the branch &lt;code&gt;cpp_reveng_work_while_0_18_release&lt;/code&gt; and, since the 0.18 release is done, merge the branch into the HEAD. After that I'll continue development in the HEAD.&lt;/p&gt;&lt;h2&gt;&lt;a name="2005-04-20" class="ancora"&gt;2005-04-20&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The interface will be defined outside of the grammar. This will provide a compile time verification between the grammar and what is expected. It will also enable future independence if the current grammar and parser design is replaced. So, lets use ArgoUML a bit to model...&lt;/p&gt;&lt;h2&gt;&lt;a name="2005-04-19" class="ancora"&gt;2005-04-19&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The successful test &lt;code&gt;org.argouml.language.cpp.reveng.TestCppGrammar.testCastExpressions&lt;/code&gt; proves that something is wrong in the grammar, but, that this isn't obvious. I can't reproduce the error with a small example of what is failing to be parsed – the &lt;code&gt;CastExpressions.cpp&lt;/code&gt; file. Being so, I'll proceed to the next part of the fixing the grammar task, to create a generic modeler interface that is called from the grammar.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-111697505142708206?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/111697505142708206/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=111697505142708206' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/111697505142708206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/111697505142708206'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2005/05/pluggableimport-implementation-and-4th.html' title='PluggableImport implementation and 4th plan update of reveng drop 1 (also some new ideas)'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-111386556023739865</id><published>2005-04-19T00:01:00.000+01:00</published><updated>2005-04-19T23:37:37.536+01:00</updated><title type='text'>fixing the grammar II</title><content type='html'>&lt;h2&gt;&lt;a name="2005-04-18" class="ancora"&gt;2005-04-18&lt;/a&gt;&lt;/h2&gt;     &lt;p&gt;I'm going to give a try with ANTLR 2.7.5 again. Maybe the error wasn't related to 2.7.5 and due to the state ArgoUML was when I attempted revenging of commons logging. When testing with 2.7.2 it was in the initial state... &lt;/p&gt;    &lt;p&gt;Nope, it is there... Here is a piece of the stack trace:&lt;/p&gt;     &lt;pre&gt;  [argouml] Exception in org/apache/commons/logging/Log.class : null
[argouml] java.lang.NullPointerException
[argouml]     at org.argouml.uml.reveng.classfile.ClassfileParser.u4(ClassfileParser.java:490)
[argouml]     at org.argouml.uml.reveng.classfile.ClassfileParser.magic_number(ClassfileParser.java:287)
[argouml]     at org.argouml.uml.reveng.classfile.ClassfileParser.classfile(ClassfileParser.java:258)
[argouml]     at org.argouml.uml.reveng.classfile.ClassfileImport.parseFile(ClassfileImport.java:358)
[argouml]     at org.argouml.uml.reveng.classfile.ClassfileImport.processJarFile(ClassfileImport.java:276)
[argouml]     at org.argouml.uml.reveng.classfile.ClassfileImport.processFile(ClassfileImport.java:228)
[argouml]     at org.argouml.uml.reveng.classfile.ClassfileImport.startImport(ClassfileImport.java:113)
[argouml]     at org.argouml.uml.reveng.classfile.ClassfileImport.parseFile(ClassfileImport.java:95)
[argouml]     at org.argouml.uml.reveng.Import.parseFile(Import.java:431)
[argouml]     at org.argouml.uml.reveng.Import$ImportRun.run(Import.java:582)
[argouml]     at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:178)
[argouml]     at java.awt.EventQueue.dispatchEvent(EventQueue.java:454)
[argouml]     at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
[argouml]     at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
[argouml]     at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:141)
[argouml]     at java.awt.Dialog$1.run(Dialog.java:540)
[argouml]     at java.awt.Dialog.show(Dialog.java:561)
[argouml]     at org.argouml.uml.reveng.Import.doFile(Import.java:399)
[argouml]     at org.argouml.uml.reveng.ImportClasspathDialog.doFiles(Import.java:935)
[argouml]     at org.argouml.uml.reveng.ImportClasspathDialog.access$200(Import.java:855)
[argouml]     at org.argouml.uml.reveng.ImportClasspathDialog$OkListener.actionPerformed(Import.java:968)
[argouml]     at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1786)
[argouml]     at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButton.java:1839)
[argouml]     at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
[argouml]     at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
[argouml]     at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:245)
[argouml]     at java.awt.Component.processMouseEvent(Component.java:5100)
[argouml]     at java.awt.Component.processEvent(Component.java:4897)
[argouml]     at java.awt.Container.processEvent(Container.java:1569)
[argouml]     at java.awt.Component.dispatchEventImpl(Component.java:3615)
[argouml]     at java.awt.Container.dispatchEventImpl(Container.java:1627)
[argouml]     at java.awt.Component.dispatchEvent(Component.java:3477)
[argouml]     at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483)
[argouml]     at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3198)
[argouml]     at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128)
[argouml]     at java.awt.Container.dispatchEventImpl(Container.java:1613)
[argouml]     at java.awt.Window.dispatchEventImpl(Window.java:1606)
[argouml]     at java.awt.Component.dispatchEvent(Component.java:3477)
[argouml]     at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
[argouml] Exception in org/apache/commons/logging/LogConfigurationException.class : null
[argouml]     at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
[argouml]     at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
[argouml]     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
[argouml]     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
[argouml]     at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
&lt;/pre&gt;      &lt;p&gt;So, to fix the C++ grammar, the first thing to do is to show what the error  is:&lt;/p&gt;     &lt;pre&gt;testParseQuadratic Error unexpected token: (

line 5960:25: unexpected token: (
at org.argouml.language.cpp.reveng.CPPParser.unary_expression(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.cast_expression(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.pm_expression(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.multiplicative_expression(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.additive_expression(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.shift_expression(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.relational_expression(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.equality_expression(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.and_expression(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.exclusive_or_expression(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.inclusive_or_expression(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.logical_and_expression(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.logical_or_expression(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.conditional_expression(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.assignment_expression(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.expression(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.jump_statement(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.statement(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.statement_list(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.compound_statement(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.function_definition(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.member_declaration(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.class_specifier(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.type_specifier(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.declaration_specifiers(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.declaration(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.external_declaration(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.decl_namespace(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.external_declaration(Unknown Source)
at org.argouml.language.cpp.reveng.CPPParser.translation_unit(Unknown Source)
at org.argouml.language.cpp.reveng.TestCppGrammar.parseFile(TestCppGrammar.java:116)
at org.argouml.language.cpp.reveng.TestCppGrammar.testParseQuadratic(TestCppGrammar.java:92)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at junit.framework.TestCase.runTest(TestCase.java:166)
at junit.framework.TestCase.runBare(TestCase.java:140)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:131)
at junit.framework.TestSuite.runTest(TestSuite.java:173)
at junit.framework.TestSuite.run(TestSuite.java:168)
at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:231)
at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:409)
1.23
&lt;/pre&gt;     &lt;p&gt;The parser complains about the line 5960, column 25 of  &lt;code&gt;quadratic.i&lt;/code&gt;. Which is (marked in red):&lt;/p&gt;     &lt;pre&gt;                {return &lt;span style="color:red;"&gt;(&lt;/span&gt;(char)_Narrow((_E)(_C))); }
&lt;/pre&gt;     &lt;p&gt;Well, this is perfectly legal C++. So, lets try to fix it!&lt;/p&gt; &lt;h2&gt;&lt;a name="2005-04-14" class="ancora"&gt;2005-04-14&lt;/a&gt;&lt;/h2&gt;     &lt;h3&gt;&lt;a name="log4j_conf_with_date_01" class="ancora"&gt;Log4j configurations  should have date&lt;/a&gt;&lt;/h3&gt;     &lt;p&gt;I &lt;a href="#log4j_conf_with_date_00" class="ligacao"&gt;previously solved  this problem&lt;/a&gt;. The original text might be used to create an issue.  I'll have to make a diff to apply the patch.&lt;/p&gt;      &lt;h3&gt;&lt;a name="fix_cpp_grammar_02" class="ancora"&gt;Fixing the C++ grammar&lt;/a&gt;&lt;/h3&gt;     &lt;p&gt;Upgrading to ANTLR 2.7.5 didn't fixed the problem as I expected. It also doesn't seam to have broken anything, even for the java and classfile modules. I must now make some manual tests to make sure.&lt;/p&gt;     &lt;p&gt;The java reveng works fine with ANTLR 2.7.5, but, the classfile reveng failed when parsing the commons logging jar. I must check if the same happens with ANTLR 2.7.2... So, I must get back to the &lt;code&gt;default.properties&lt;/code&gt;  and revert the change to &lt;code&gt;antlrall.jar.path&lt;/code&gt; to use the 2.7.2  jar. Then
&lt;code&gt;argouml/src_new/$ ./build.sh clean package&lt;/code&gt;
&lt;code&gt;argouml/modules/classfile/$ ant clean install&lt;/code&gt;
&lt;code&gt;argouml/src_new/$ ./build.sh run&lt;/code&gt;
and test reverse engineering again &lt;code&gt;commons-logging.jar&lt;/code&gt;.&lt;/p&gt;     &lt;p&gt;And it works! So, something is going wrong when the ANTLR 2.7.5 is used... Since it didn't fixed the problem with C++ parser, I'll stick with version 2.7.2 and maybe create an issue for upgrading with the information that it breaks the classfile reveng.&lt;/p&gt; &lt;h2&gt;&lt;a name="2005-04-12" class="ancora"&gt;2005-04-12&lt;/a&gt;&lt;/h2&gt;   &lt;p&gt;After discovering that I had to make some work on the grammar to enable reveng, I been off of development for some time. Now its time to get back and grab this issue!&lt;/p&gt;    &lt;h3&gt;&lt;a name="fix_cpp_grammar_01" class="ancora"&gt;Fixing the C++ grammar&lt;/a&gt;&lt;/h3&gt;   &lt;p&gt;I think that before starting to change the grammar by adding callbacks to the grammar, to support reverse engineering as the original C++ and java grammars do, I must fix the grammar. Mainly because I think the problems it has to parse the &lt;code&gt;quadratic.i&lt;/code&gt; file are related to ArgoUML using an old version of ANTLR. So, to try to fix this I must use the current version of ANTLR to generate the parsers. I may try to replace the global ANTLR instead of adding the newer version to the C++ module.&lt;/p&gt;    &lt;p&gt;[&lt;em&gt;It would be nice, though, to try to check if ArgoUML module runtime model handles several versions of the same libraries. But, I think I should not open this new front of work!...&lt;/em&gt;]&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-111386556023739865?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/111386556023739865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=111386556023739865' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/111386556023739865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/111386556023739865'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2005/04/fixing-grammar-ii.html' title='fixing the grammar II'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-111213794234100609</id><published>2005-03-30T00:04:00.000+01:00</published><updated>2005-05-17T21:24:29.356+01:00</updated><title type='text'>half way to drop 1</title><content type='html'>&lt;h2&gt;&lt;a name="2005-03-18"&gt;2005-03-18&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;After looking a bit into the grammar I realized that it is only parsing the information! It doesn't store it in a AST for later processing. So, this means that currently there &lt;strong&gt;isn't&lt;/strong&gt; parsed information! It isn't this that would make me throw away the current grammar. The main problem is parsing the information and that is being done in a very good way, as is shown in the current working tests!&lt;/p&gt;    &lt;p&gt;Just for curiosity I'll look at the original C++ grammar by David Wigg et all... It uses the a similar scheme to the one used in the java grammar. The parser makes calls at specific places in the grammar, in order to have the information processed along with the parsing. The C++ grammar defines abstract methods which are implemented in some specialized parser class. For java reveng, the &lt;code&gt;Modeller&lt;/code&gt; class gets called by the parser.&lt;/p&gt;    &lt;p&gt;It is interesting to see that neither uses the AST functionalities of ANTLR. I wonder why? Maybe its because these grammars were implemented in a pre-AST time...&lt;/p&gt;    &lt;p&gt;After looking into the grammar I now understand that I don't need to remove  the pre-processor directives in &lt;code&gt;quadratic.i&lt;/code&gt;. So, I'm going to use  the original version that comes with the "official" C++ grammar.&lt;/p&gt;    &lt;p&gt;I should consider ways to have the official C++ grammar reused instead of having a specific version that will be very difficult to integrate improvements when they are introduced in the David Wigg's grammar. A possible way, if they are interested would be to have some special tags that would be pre-processed previous to the grammar being handed over to the ANTLR for code generation. Maybe even ANTLR makes this task easy! It would be nice to have a unique grammar that would be used with C++, java and python programs! I must consider this when I &lt;a href="#send_grammar_2_ANTLR_list" class="ligacao"&gt;send the  grammar to the ANTLR list&lt;/a&gt;.
&lt;/p&gt; &lt;p&gt;It is nice to see that the ANTLR project also makes a big effort to be  multi-language. The examples provided in the distribution show that the type  of multi-language  support buit-in in one grammar is possible. In the future I must check how  this is being done and try to have the C++ grammar this way!&lt;/p&gt;   &lt;h3&gt;&lt;a name="fix_cpp_grammar_00" class="ancora"&gt;Fixing the C++ grammar&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;I think I know why the &lt;code&gt;quadratic.i&lt;/code&gt; parsing fails! The version  of ANTLR being used in ArgoUML is 2.7.2, while the version that David Wigg was  using when he commited the last version of the grammar was 2.7.3. Current  version is 2.7.5. So, the way to go would be to at least try the ported  grammar with 2.7.3 and check if that is the problem...&lt;/p&gt;  &lt;p&gt;Some very interesting news! There exists a grammar for C pre-processor for  java programs in ANTLR 2.7.5 distribution. This fits perfectly my needs!  :-))&lt;/p&gt;  &lt;h2&gt;&lt;a name="2005-03-16" class="ancora"&gt;2005-03-16&lt;/a&gt;&lt;/h2&gt;    &lt;p&gt;The &lt;a href="#update_model_new_pack_n_grammar" class="ligacao"&gt;module model  is now updated&lt;/a&gt; to show the use of the ANTLR C++ grammar and  commited. I'll proceed to  &lt;a href="#parsed_info_useful_4_reveng" class="ligacao"&gt;the next step&lt;/a&gt;.&lt;/p&gt; &lt;h2&gt;&lt;a name="2005-03-14" class="ancora"&gt;2005-03-14&lt;/a&gt;&lt;/h2&gt;   &lt;p&gt;I've been bitten by the infamous zargo corruption bug while editing the C++ module model. Fortunately, I committed the previous version of the model in CVS, and this way I may revert to that version. The ArgoUML version I was using was 0.17.2, which is not advisable for production, as you may see in this report of mine...&lt;/p&gt;    &lt;p&gt;Since I'm a developer for ArgoUML, I thought I could look into the log and try to figure out what was the relevant part to report the problem back to ArgoUML. Unfortunately, the log isn't configured to save the date as part of the traces... This I think qualifies as a bug and therefore is a possible fix for me to contribute.&lt;/p&gt;    &lt;p&gt;So, I have these two identified problems in ArgoUML, which I must obviously help in being solved. I'll create issues and try to fix them.&lt;/p&gt;   &lt;ul&gt; &lt;li&gt;&lt;a name="log4j_conf_with_date_00"&gt;log4j configurations should have time with traces&lt;/a&gt; – This is very    simple, I just need to add "%d" to the pattern in the &lt;a href="http://jakarta.apache.org/log4j"&gt;log4j&lt;/a&gt; configuration files, which    are in &lt;code&gt;/argouml/src_new/org/argouml/resource&lt;/code&gt;. For configurations that are for &lt;code&gt;ConsoleAppender&lt;/code&gt;, the date isn't relevant, since the user will see the output in the console and don't need to distinguish between several working sessions in a log file. The main changes are in &lt;code&gt;default.lcf&lt;/code&gt; and &lt;code&gt;full.lcf&lt;/code&gt;.&lt;/li&gt; &lt;li&gt;ArgoUML must support by default UML foundation types&lt;/li&gt;&lt;/ul&gt;
&lt;h2&gt;&lt;a name="2005-03-12" class="ancora"&gt;2005-03-12&lt;/a&gt;&lt;/h2&gt;  &lt;p&gt;The &lt;a href="#cpp_reveng_drop1_plan2"&gt;plan&lt;/a&gt; must be updated to be more flexible. I already know that I have a parser that is capable of parsing simple files. This is a very important first step and I don't want to loose momentum by attempting to have a perfect parser that correctly parses more complex files, like &lt;code&gt;quadratic.i&lt;/code&gt;. So, instead of spending all effort in Fixing the C++ grammar, I'll move forward into using the information parsed for some useful thing. To enable this I'm going to make some analysis and design on how can I do this. This is still part of the &lt;em&gt;Fix the C++ grammar&lt;/em&gt; step  of the plan, although the name won't indicate this. I would call it now as a  different step called &lt;em&gt;analysis of how to use the parsed  information&lt;/em&gt;.&lt;/p&gt;   &lt;p&gt;For this I may check again what the java reveng does and maybe model it a bit in the C++ model... After that I'll make a new test case that explores the information contained in a parsed file. When this is done I may make the model of the C++ grammar and parser.&lt;/p&gt;   &lt;h3&gt;&lt;a name="cpp_reveng_drop1_plan3"&gt;3rd plan for C++ reveng drop  1&lt;/a&gt;&lt;/h3&gt;   &lt;ol&gt; &lt;li&gt;&lt;p&gt;Learn how to make the ANTLR parser for debugging and build one.
Estimated Effort (EE) = 4 Mh; Short Name (SN) – &lt;em&gt;ANTLR parser 4 debugging&lt;/em&gt;&lt;/p&gt;   &lt;p&gt;&lt;strong&gt;2005-02-25 DONE&lt;/strong&gt; – Although not actually a fully debug enabled parser, but, using the trace capabilities of the ANTLR generator. Note that this makes the parsing much slower and is only useable with small files!
Actual Effort (AE) = 2:36&lt;/p&gt;&lt;/li&gt; &lt;li&gt;&lt;p&gt;Debug the C++ grammar and make it pass the tests.
EE = 20 Mh; SN – &lt;em&gt;Fix the C++ grammar&lt;/em&gt;&lt;/p&gt;   &lt;p&gt;&lt;strong&gt;2005-03-07 PARTIAL&lt;/strong&gt; – It parses cleanly a simple class and a code snippet with which I was attempting to reproduce the current error in parsing of &lt;code&gt;quadratic.i&lt;/code&gt;.
AE = 2:51&lt;/p&gt;&lt;/li&gt; &lt;li&gt;&lt;p&gt;Commit the result of this work and send it to Yolanda. Update the    &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=2947"&gt;issue&lt;/a&gt;.
EE 3 Mh; SN – &lt;em&gt;Commit, Yolanda and    issue&lt;/em&gt;&lt;/p&gt;   &lt;p&gt;&lt;strong&gt;2005-03-09 DONE&lt;/strong&gt; – I commited the work in progress and updated the issue. Due to the release of a stable version of ArgoUML the work was commited in branch &lt;code&gt;cpp_reveng_work_while_0_18_release&lt;/code&gt;. I only sent to Yolanda an    e-mail of thanks. I'll send her the version that will be sent to the ANTLR    list.
AE = 1:36&lt;/p&gt;&lt;/li&gt; &lt;li&gt;&lt;p&gt;2nd re-planning of C++ reveng drop 1
EE 2 Mh; SN – &lt;em&gt;2nd    re-planning of C++ reveng drop 1&lt;/em&gt;&lt;/p&gt;   &lt;p&gt;&lt;strong&gt;2005-03-12 DONE&lt;/strong&gt; – Re-planned, updated the    ProcessDashboard phases and documented it all here ;-).
AE = 1:39&lt;/p&gt;&lt;/li&gt; &lt;li&gt;&lt;p&gt;&lt;a name="update_model_new_pack_n_grammar" class="ancora"&gt;Update the model to reflect the new package and the grammar use.&lt;/a&gt;
 EE = 2 Mh; SN – &lt;em&gt;Module model update for the C++ grammar&lt;/em&gt;&lt;/p&gt;   &lt;p&gt;&lt;strong&gt;2005-03-16 DONE&lt;/strong&gt; – Updated and commited.
AE = 2:14&lt;/p&gt;&lt;/li&gt; &lt;li&gt;&lt;p&gt;&lt;a name="parsed_info_useful_4_reveng" class="ancora"&gt;Make tests that    show how the parsed information may be used for reveng.&lt;/a&gt; If some issue exist, analyse how it is done in java reveng and fix the grammar as needed. This includes creating, or improving the current, test cases, which prove how the parsed information may be used for reveng.
EE 5 Mh;    SN – &lt;em&gt;Prove that parsed information is useful for reveng&lt;/em&gt;&lt;/p&gt;&lt;/li&gt; &lt;li&gt;&lt;p&gt;Model the implementation of    &lt;code&gt;org.argouml.application.api.PluggableImport&lt;/code&gt; interface in the C++ reveng module. Generate the realization of the designed classes. If there are issues in the generation, report them in issuezilla.
EE 5 Mh; SN – &lt;em&gt;Model and generate the    realization of the &lt;code&gt;PluggableImport&lt;/code&gt; interface&lt;/em&gt;&lt;/p&gt;&lt;/li&gt; &lt;li&gt;&lt;p&gt;Close the circle, by making the module support reveng of preprocessed    C++ files.
EE 15 Mh; SN – &lt;em&gt;Module support of reveng of pre-processed C++&lt;/em&gt;&lt;/p&gt;&lt;/li&gt; &lt;li&gt;&lt;p&gt;&lt;a name="send_grammar_2_ANTLR_list" class="ancora"&gt;Send a working vanilla version of the grammar to the ANTLR list and announce its use within the ArgoUML project.&lt;/a&gt; Provide feedback as appropriate. Automate the adaption of the files in the module build script.
EE 5 Mh; SN – &lt;em&gt;Send grammar 2 ANTLR list&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Enjoy and celebrate the achievement! Go back to planning next drops. 
EE 4 Mh; SN – &lt;em&gt;Plan next drops&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;   &lt;p&gt;Why do I spend so much time planning? Why do I measure with such care the time I spend in my hobby? Why do I document the whole stuff so meticulously?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-111213794234100609?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/111213794234100609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=111213794234100609' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/111213794234100609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/111213794234100609'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2005/03/half-way-to-drop-1.html' title='half way to drop 1'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-111050005319577574</id><published>2005-03-11T00:06:00.000Z</published><updated>2005-03-11T00:14:13.200Z</updated><title type='text'>First C++ parser commit and type bug</title><content type='html'>&lt;h2&gt;   &lt;/h2&gt; &lt;h2&gt;&lt;a name="2005-03-08" class="ancora"&gt;2005-03-08&lt;/a&gt;&lt;/h2&gt;   &lt;p&gt;With the upcoming 0.18 release of ArgoUML, I looked into the issues reported and fixed by Daniele Tamino, in order to verify the fixes. It is all working fine and therefore many of the issues are now verified.&lt;/p&gt;   &lt;p&gt;I think that I will check tomorrow a way to commit my current work for reveng  in a branch... &lt;em&gt;DONE&lt;/em&gt; Sent also an e-mail of thanks to Yolanda.
&lt;/p&gt; &lt;h2&gt;&lt;a name="2005-03-04" class="ancora"&gt;2005-03-04&lt;/a&gt;&lt;/h2&gt;   &lt;p&gt;The &lt;code&gt;quadratic.i&lt;/code&gt; test file can't be taken as made available from the original ANTLR C++ grammar (the one for C++ output). It contains pre-processor lines, which in the &lt;code&gt;TestCppGrammar&lt;/code&gt; test case aren't removed before handing it to the lexer. It isn't a problem. I removed these lines with a simple python script and I'm now debugging the grammar with this modified file. It contains some problems, which I think I will handle by debugging the grammar in additional test cases with just the needed code snippets to make it fail.&lt;/p&gt; &lt;h2&gt;&lt;a name="2005-02-25" class="ancora"&gt;2005-02-25&lt;/a&gt;&lt;/h2&gt;  &lt;p&gt;The parser must really be built for debug to enable debugging! This parser  isn't just my class, it is the &lt;code&gt;antlr.Parser&lt;/code&gt; class! So, I'm going to  use just the ANTLR generation options for tracing: &lt;code&gt;-traceParser&lt;/code&gt;  and &lt;code&gt;-traceLexer&lt;/code&gt;. It is working, but, I'm going to start with the  SimpleClass.cpp test first because the &lt;code&gt;quadratic.i&lt;/code&gt; example from  the ANTLR C++ grammar is way too complicated to start with.&lt;/p&gt;   &lt;p&gt;The grammar works! :-)) It parsed SimpleClass.cpp as soon as I fixed it  (&lt;a href="file:///C:/luis/documentos/cadernos/programacao/ficheiro02.html#cpp_generates_with_java_types"&gt;removed the &lt;code&gt;boolean&lt;/code&gt;&lt;/a&gt;)!  I must test with &lt;code&gt;quadratic.i&lt;/code&gt;,  since previously the Ant target was failing because I wasn't copying the  files to the build dir 8-!&lt;/p&gt;   &lt;h3&gt;&lt;a name="cpp_generates_with_java_types"&gt;New Bug: C++ generator is  generating code with java types.&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;I've noticed a new bug in the C++ generator. ArgoUML enables selection of some built-in types according to the java language. One of these is the &lt;code&gt;boolean&lt;/code&gt;, which is generated as &lt;code&gt;boolean&lt;/code&gt; instead of  &lt;code&gt;bool&lt;/code&gt;. I bet this is happening for other types as well...&lt;/p&gt;  &lt;p&gt;What should be happening is that ArgoUML enables selection of the standard  UML types:&lt;/p&gt;  &lt;ul&gt; &lt;li&gt;&lt;code&gt;Boolean&lt;/code&gt;  it does enable the    &lt;code&gt;java.lang.Boolean&lt;/code&gt;, but, this still is java specific.&lt;/li&gt;&lt;li&gt;&lt;code&gt;Integer&lt;/code&gt;  same as for Boolean, i.e.,    &lt;code&gt;java.lang.Integer&lt;/code&gt;&lt;/li&gt;&lt;li&gt;... all the types are java!!! No UML types?!&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I must create an issue for this... Actually two, one for the global ArgoUML to enable UML types by default and another for the C++ module to give warnings when java specific types are used and to translate these types to C++ types. It should also enable the use of specific C++ types, adding them, just as java does. This might be done with a XMI file made available to users for importing or by some option, which make available the use of either UML types, java types, C++ types or some other...&lt;/p&gt;  &lt;p&gt;Another possible addition is to have a critic that warns users about the possibility of using java types in non-java specific models. Maybe having a &lt;em&gt;model nature&lt;/em&gt; as a tag would be a nice thing that would disable such critic to be turned on. This model nature could later be extended so that only generic rules and specific language rules to be turned on. This might be applied also to packages etc.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-111050005319577574?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/111050005319577574/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9682471&amp;postID=111050005319577574' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/111050005319577574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9682471/posts/default/111050005319577574'/><link rel='alternate' type='text/html' href='http://argonauts-life.blogspot.com/2005/03/first-c-parser-commit-and-type-bug.html' title='First C++ parser commit and type bug'/><author><name>euluis</name><uri>http://www.blogger.com/profile/06430232253954990845</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_Kt2t3FIrzaw/SPe1q61E_SI/AAAAAAAAAAs/hGjAOnhijto/s1600-R/euluis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9682471.post-110920526926544675</id><published>2005-02-24T00:32:00.000Z</published><updated>2005-02-24T00:35:59.040Z</updated><title type='text'>C++ reveng drop 1 replanning</title><content type='html'>&lt;p&gt;The grammar has problems. To be able to debug it I need to build ANTLR for debugging. How will I do this? Well, it isn't obvious from the docs...&lt;/p&gt;  &lt;p&gt;One thing is obvious, this wrecked &lt;a href="#2005-02-10"&gt;my initial  plan&lt;/a&gt;... Now I must re-plan taking this new challenge into account.&lt;/p&gt;   &lt;h3&gt;&lt;a name="cpp_reveng_drop1_plan2" class="ancora"&gt;2nd plan for C++ reveng drop  1&lt;/a&gt;&lt;/h3&gt;   &lt;ol&gt; &lt;li&gt;Learn how to make the ANTLR parser for debugging and build one. – Estimated Effort (EE) 4 Mh; Short Name (SN) ANTLR parser 4 debugging&lt;/li&gt;&lt;li&gt;Debug the C++ grammar and make it pass the tests. – EE 20 Mh; SN    Fix the C++ grammar&lt;/li&gt;&lt;li&gt;Commit the result of this work and send it to Yolanda. Update the    &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=2947" class="ancora"&gt;issue&lt;/a&gt;. – EE 3 Mh; SN Commit, Yolanda and issue&lt;/li&gt;&lt;li&gt;Send a working vanilla version of the grammar to the ANTLR list and announce its use within the ArgoUML project. Provide feedback as appropriate. Automate the adaption of the files in the module build script. – EE 5 Mh; SN Send grammar 2 ANTLR list&lt;/li&gt;&lt;li&gt;Update the model to reflect the new package and the grammar use and design a bit on the C++ reveng module. Generate the realization of the designed classes. – EE 8 Mh; SN Module model update and realization of interface&lt;/li&gt;&lt;li&gt;Close the circle, by making the module support reveng of preprocessed C++ files. – EE 5 Mh; SN Finish module support of reveng&lt;/li&gt;&lt;li&gt;Enjoy and celebrate the achievement! Go back to planning next steps.    – EE 4 Mh; SN Plan next steps&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The drop 1 plan is now inserted into  &lt;a href="http://processdash.sourceforge.net/index.html" class="ligacao"&gt;Process  Dashboard&lt;/a&gt;, as a sub-task of the issue work.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9682471-110920526926544675?l=argonauts-life.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://argonauts-life.blogspot.com/feeds/110
