<?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-5410408355342477426</id><updated>2012-02-16T09:29:36.773+01:00</updated><category term='jna'/><category term='scrum'/><category term='softwareproject'/><category term='latex'/><category term='nusmv-tools'/><category term='xtext'/><category term='azmun'/><category term='jnaerator'/><category term='nusmv'/><category term='eclipse'/><category term='rail'/><category term='redmine'/><category term='xpand'/><category term='teaching'/><title type='text'>Siamak's Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://haschemi.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5410408355342477426/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://haschemi.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Siamak Haschemi</name><uri>http://www.blogger.com/profile/18212024603270656270</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-axgVkOA5s6g/ToNuVsMmaDI/AAAAAAAAArE/UHifzIaO5No/s220/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>7</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5410408355342477426.post-5700928394686722633</id><published>2012-02-08T01:43:00.000+01:00</published><updated>2012-02-08T01:43:04.879+01:00</updated><title type='text'>Touch Down</title><content type='html'>The first semester at the Beuth Hochschule für Technik is coming to an end. Today, one of my teams had their first release (after seven 2-week-sprints). They create an online collaboration tool called &lt;a href="https://github.com/Softwareprojekt-BHT-Berlin/lao-Online-Collaboration-Platform" target="_blank"&gt;[lao] "look ahead online"&lt;/a&gt;, which went open-soruce on &lt;a href="https://github.com/" target="_blank"&gt;github&lt;/a&gt; this night. You can try out a running demo &lt;a href="http://qcentral.org:8080/ocp" target="_blank"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To get an better idea of my cource, watch this short project video (german version) created by André Bauscher and Julian Moser:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object width="320" height="266" class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://0.gvt0.com/vi/Tq_203Cl7_Q/0.jpg"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Tq_203Cl7_Q&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/Tq_203Cl7_Q&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;Be happy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5410408355342477426-5700928394686722633?l=haschemi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haschemi.blogspot.com/feeds/5700928394686722633/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5410408355342477426&amp;postID=5700928394686722633&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5410408355342477426/posts/default/5700928394686722633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5410408355342477426/posts/default/5700928394686722633'/><link rel='alternate' type='text/html' href='http://haschemi.blogspot.com/2012/02/touch-down.html' title='Touch Down'/><author><name>Siamak Haschemi</name><uri>http://www.blogger.com/profile/18212024603270656270</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-axgVkOA5s6g/ToNuVsMmaDI/AAAAAAAAArE/UHifzIaO5No/s220/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5410408355342477426.post-6317717846180445660</id><published>2011-11-05T14:46:00.002+01:00</published><updated>2011-11-05T14:50:11.171+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='teaching'/><category scheme='http://www.blogger.com/atom/ns#' term='softwareproject'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>Professional Scrum Training is essential!</title><content type='html'>Some weeks of our Scrum@University adventure are over, and it feels like a good point to share some experiences with you. Since &lt;a href="http://haschemi.blogspot.com/2011/09/as-some-of-you-know-i-started-to-teach.html"&gt;my last Post&lt;/a&gt; we built up the teams, get in touch with our Product Owners, and got an excellent Scurm training by Ralf, one of the coaches at &lt;a href="http://www.agile42.de/de/"&gt;agile42&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Our initial setup was 7 companies offering 7 projects. The students had a first and a second vote for a project. Based on these votes, I formed 5 groups (attention, groups, not teams!). 80% of the students got their first vote accepted, and 20% their second vote. That was a nice result. However, it took about a week to come to this result, and I think I can do better in future. For example, I could present the projects and say: "Hey, I will leave the room for 30 minutes. When I come back, you've found 5 groups with a minimum of 5 members". I am sure there are thousands of possibilities to form groups. &lt;i&gt;Do you have additional ideas for me?&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;OK, so we had our groups. The next thing was to bring the 5 groups together with their 5 Product Owners. BUT WAIT, what is a Product Owner? Yes, before I could present the groups, I need to tell them what Scrum is. Nothing easier than that, because I was aware of Mike's &lt;a href="http://www.mountaingoatsoftware.com/scrum-a-presentation"&gt;Reusable Scrum Presentation&lt;/a&gt;. So I picked the slides, put my name on the first slide, and gave an enthusiastic talk about Scrum to my students.&lt;br /&gt;And guess what, after that talk I had room full of 30 students with BIG question marks over their head.&lt;br /&gt;&amp;nbsp; &lt;br /&gt;What went wrong? Well, I told them what Scrum is (roles, artifacts, meetings), but I didn't told them &lt;i&gt;why I told them&lt;/i&gt;! The question was, how can I do better? And now I was ready to understand the need for a professional Scrum training by Scrum experts. I invited Ralf from &lt;a href="http://www.agile42.de/"&gt;agile42&lt;/a&gt; and he told us (no, he let us live) what Scum is. And he did a fantastic job! Here are some selected photos taken during the training:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-SEsRqgMGP5Y/TrUhOcbca6I/AAAAAAAAA0I/hfw6DID3C7Y/s1600/P1020300.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-tspxPTtK4lw/TrUhrEgNSHI/AAAAAAAAA0s/5MRnYFRNbDQ/s1600/P1020309.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/-tspxPTtK4lw/TrUhrEgNSHI/AAAAAAAAA0s/5MRnYFRNbDQ/s320/P1020309.JPG" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;The &lt;a href="http://consultingblogs.emc.com/marksummers/archive/2009/06/03/ball-point-game-illustrates-why-agile-works.aspx"&gt;Ball Point Game&lt;/a&gt;&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-nmebIvWe2GY/TrUh16D0eMI/AAAAAAAAA1c/NaHB2iRTXEk/s1600/P1020321.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/-nmebIvWe2GY/TrUh16D0eMI/AAAAAAAAA1c/NaHB2iRTXEk/s320/P1020321.JPG" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;The Ball Point Game simulates the whole Scrum Iterations (including estimation, planning, sprinting, reviewing, and restrospecting)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-yBq6FCoPAXM/TrUhPMc5wpI/AAAAAAAAA0M/UCHqQHpIdZo/s1600/P1020301.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-yBq6FCoPAXM/TrUhPMc5wpI/AAAAAAAAA0M/UCHqQHpIdZo/s320/P1020301.JPG" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;One goes inside a circle and tells what he/she thinks is the reason for student projects fail in the past. Everyone who agrees goes inside the circle.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-nmebIvWe2GY/TrUh16D0eMI/AAAAAAAAA1c/NaHB2iRTXEk/s1600/P1020321.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Da1G4aMkXO8/TrUisLdASTI/AAAAAAAAA4A/qgxpLMMPDMw/s1600/P1020362.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/-Da1G4aMkXO8/TrUisLdASTI/AAAAAAAAA4A/qgxpLMMPDMw/s320/P1020362.JPG" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Metaphor for Scrum: Round Table&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-vzvtqf3MHm4/TrUhNUI21RI/AAAAAAAAA0A/BnwoJkavygw/s1600/P1020298.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-iD2esmgi3MU/TrUislD1KNI/AAAAAAAAA4E/9jJRDaDOlA4/s1600/P1020363.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/-iD2esmgi3MU/TrUislD1KNI/AAAAAAAAA4E/9jJRDaDOlA4/s320/P1020363.JPG" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Metaphor for Scrum: Curricle&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-gALC2KRyOMQ/TrUitZrtnYI/AAAAAAAAA4I/gXmAWsTbYAg/s1600/P1020364.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-gALC2KRyOMQ/TrUitZrtnYI/AAAAAAAAA4I/gXmAWsTbYAg/s320/P1020364.JPG" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Metaphor for Scrum: Soccer&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-DqlKhj69at0/TrUit9UksEI/AAAAAAAAA4M/_y17NM3iDW8/s1600/P1020365.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-DqlKhj69at0/TrUit9UksEI/AAAAAAAAA4M/_y17NM3iDW8/s320/P1020365.jpg" width="240" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Metaphor for Scrum: Hill Climbing&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-qT7yodp8K4I/TrUiuboG1yI/AAAAAAAAA4Q/4qzuAr6JGXg/s1600/P1020366.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-qT7yodp8K4I/TrUiuboG1yI/AAAAAAAAA4Q/4qzuAr6JGXg/s320/P1020366.jpg" width="240" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Mataphor for Scum: Voltage Delta&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5410408355342477426-6317717846180445660?l=haschemi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haschemi.blogspot.com/feeds/6317717846180445660/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5410408355342477426&amp;postID=6317717846180445660&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5410408355342477426/posts/default/6317717846180445660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5410408355342477426/posts/default/6317717846180445660'/><link rel='alternate' type='text/html' href='http://haschemi.blogspot.com/2011/11/professional-scrum-training-is.html' title='Professional Scrum Training is essential!'/><author><name>Siamak Haschemi</name><uri>http://www.blogger.com/profile/18212024603270656270</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-axgVkOA5s6g/ToNuVsMmaDI/AAAAAAAAArE/UHifzIaO5No/s220/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-tspxPTtK4lw/TrUhrEgNSHI/AAAAAAAAA0s/5MRnYFRNbDQ/s72-c/P1020309.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5410408355342477426.post-6690438002364887136</id><published>2011-09-29T17:18:00.008+02:00</published><updated>2011-10-02T14:16:53.527+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='teaching'/><category scheme='http://www.blogger.com/atom/ns#' term='softwareproject'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>Building Software Projects Using Scrum At University</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ro0nt3ifDi4/ToSNuTtDs5I/AAAAAAAAArg/jdk85m8XfOk/s1600/Banner_Siamak.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="96" src="http://1.bp.blogspot.com/-ro0nt3ifDi4/ToSNuTtDs5I/AAAAAAAAArg/jdk85m8XfOk/s640/Banner_Siamak.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;As some of you know, I started to teach at the &lt;a href="http://www.beuth-hochschule.de/"&gt;University of Applied Sciences Berlin&lt;/a&gt; this semester. One of my courses is called &lt;i&gt;Softwareproject I &lt;/i&gt;(and will be continued by &lt;i&gt;Softwareproject II&lt;/i&gt; with the same students), in which the students should work in groups and do what they are expected to do later in the in the IT industry: &lt;i&gt;Build Software&lt;/i&gt;.&lt;br /&gt;In the next months, I will try to write down my experiences with this course, because I think that we do something special, since we will try to create large teams of six to nine students (yes, that's a fairly large number at the university) and do &lt;a href="http://en.wikipedia.org/wiki/Scrum_%28development%29"&gt;Scum&lt;/a&gt;, a popular candidate of the agile methodologies. Applying Scrum in an university context exposes many challenges, and I will try to address some of them in future posts. One of that challenges is the lack of &lt;i&gt;real&lt;/i&gt; projects. For me, a real project is a project with a &lt;i&gt;real&lt;/i&gt; customer. And a real customer is someone who is driven by the market. So in a perfect world, I would have enough real projects for all of my students (~30) to work in. And guess what, sometimes the world &lt;i&gt;is&lt;/i&gt; perfect. I started to search for companies with these characteristics:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;have the courage to work with (potentially unexperienced) students&lt;/li&gt;&lt;li&gt;propose a project which fits to the experience level of the students&lt;/li&gt;&lt;li&gt;agree to apply Scrum and provide a &lt;a href="http://en.wikipedia.org/wiki/Scrum_%28development%29#Core_Scrum_roles"&gt;Project Owner&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&amp;nbsp;I found an overwhelming number of seven(!) companies with seven projects who want to work with us:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://ezeep.com/"&gt;ezeep GmbH&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.itemis.de/"&gt;itemis AG&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kreuzwerker.de/"&gt;kreuzwerker GmbH&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.schmidthappens.de/"&gt;look ahead online&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mixd.tv/"&gt;mixd.tv&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://wonderkind.de/"&gt;wonderkind interaktionsmedien GmbH&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gawlittadigitale.com/"&gt;GawlittaDigitale GmbH&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&amp;nbsp;And if this wasn't anough, I also found sponsors and supporters:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.agile42.de/"&gt;agile42&lt;/a&gt; will give us free Scrum lessons, which is really great because of their experiences with introducing Scrum in many companies&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.scrumdo.com/"&gt;ScrumDo&lt;/a&gt;, providing a web-based Scrum tool, supports us with business accounts&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/"&gt;github&lt;/a&gt;, a hosting service for git repositories, supports us with business accounts for private repositories&lt;/li&gt;&lt;li&gt;a friend of mine, Olivera Janackovic, desgined the banner you can see at the top of this posting especially for that course&lt;/li&gt;&lt;/ul&gt;For the start, the world seems perfect. My students can decide which project they want to work in, an after that we will start to build the teams. Next week, I we will try to have the Project Owners of the chosen projects to come to our lessons, so that the teams can start to work on a detailed vision for the project and its architecture.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5410408355342477426-6690438002364887136?l=haschemi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haschemi.blogspot.com/feeds/6690438002364887136/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5410408355342477426&amp;postID=6690438002364887136&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5410408355342477426/posts/default/6690438002364887136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5410408355342477426/posts/default/6690438002364887136'/><link rel='alternate' type='text/html' href='http://haschemi.blogspot.com/2011/09/as-some-of-you-know-i-started-to-teach.html' title='Building Software Projects Using Scrum At University'/><author><name>Siamak Haschemi</name><uri>http://www.blogger.com/profile/18212024603270656270</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-axgVkOA5s6g/ToNuVsMmaDI/AAAAAAAAArE/UHifzIaO5No/s220/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-ro0nt3ifDi4/ToSNuTtDs5I/AAAAAAAAArg/jdk85m8XfOk/s72-c/Banner_Siamak.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5410408355342477426.post-6847060963899774882</id><published>2011-06-14T13:58:00.001+02:00</published><updated>2011-06-15T07:51:32.463+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='latex'/><category scheme='http://www.blogger.com/atom/ns#' term='azmun'/><category scheme='http://www.blogger.com/atom/ns#' term='redmine'/><category scheme='http://www.blogger.com/atom/ns#' term='rail'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Railroad Diagrams in Redmine Wiki</title><content type='html'>I recently needed to show the grammar of our XText based UML guard and action language in the &lt;a href="http://metrikforge.informatik.hu-berlin.de/projects/azmun/wiki/Expressions_In_Test_Models"&gt;Azmun Wiki&lt;/a&gt;. I decided to use &lt;a href="http://en.wikipedia.org/wiki/Syntax_diagram"&gt;railroad diagrams&lt;/a&gt; for that purpose, since I remembered that the &lt;a href="http://www.eclipse.org/Xtext/documentation/1_0_1/xtext.html#MWE2SyntaxReference"&gt;XText documentation&lt;/a&gt; contains such cool diagrams in the MWE2 sub-chapter. For example, here is the railroad diagram for &lt;i&gt;Module&lt;/i&gt; definitions:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.eclipse.org/Xtext/documentation/1_0_1/images/mwe2/module.png"/&gt;&lt;br /&gt;&lt;br /&gt;I don't know how the XText documentation is generated, but I know that the &lt;a href="http://notendur.hi.is/snorri/091263/rail/rail.html"&gt;rail&lt;/a&gt; package for LaTeX is able to generate such diagarams. So I wanted to integrate such diagrams in our wiki using rail.&lt;br /&gt;&lt;br /&gt;We host &lt;a href="http://metrikforge.informatik.hu-berlin.de/projects"&gt;all the projects&lt;/a&gt; of our research training group &lt;a href="http://www.gk-metrik.de"&gt;METRIK&lt;/a&gt; in a &lt;a href="http://www.redmine.org/"&gt;Redmine&lt;/a&gt; instance. One of the Redmine Plug-Ins is the &lt;a href="https://github.com/ndl/wiki_external_filter"&gt;Wiki External Filter&lt;/a&gt;, which &lt;i&gt;allows defining macros that process macro argument using external filter program and render its result in Redmine wiki.&lt;/i&gt; The Plug-In is shipped with support for &lt;a href="http://plantuml.sourceforge.net/"&gt;PlantUML&lt;/a&gt; to draw UML diagrams, &lt;a href="http://www.graphviz.org/"&gt;Graphviz&lt;/a&gt; for abritrary diagrams, &lt;a href="http://ritex.rubyforge.org/"&gt;ritex&lt;/a&gt; for MathML, and &lt;a href="http://ffmpeg.org/"&gt;ffmpeg&lt;/a&gt; to embed videos. &lt;br /&gt;&lt;br /&gt;In order to add a new filter, I extended the &lt;i&gt;redmine/config/wiki_external_filter.yml&lt;/i&gt; file with the following entry: &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: rails"&gt;rail:&lt;br /&gt;    description: "Constructs railroad diagrams for (E)BNF grammars, see http://notendur.hi.is/snorri/091263/rail/rail.html"&lt;br /&gt;    template: image&lt;br /&gt;    outputs:&lt;br /&gt;      - command: "SOME_PATH/rail.sh"&lt;br /&gt;        content_type: "image/png"&lt;br /&gt;        prolog: "\documentclass{article} \n \usepackage{rail} \n \pagestyle{empty} \n \\begin{document} \n \\begin{figure} \n"&lt;br /&gt;        epilog: "\n \\end{figure} \n \\end{document} \n"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Our filter is named &lt;i&gt;rail&lt;/i&gt; and calls the shell script &lt;i&gt;rail.sh&lt;/i&gt;, which I will show in a second. It defines the needed &lt;i&gt;prolog&lt;/i&gt; and &lt;i&gt;epilog&lt;/i&gt; LaTeX commands including the usage of the &lt;i&gt;rail&lt;/i&gt; package and the definition of a &lt;i&gt;figure&lt;/i&gt;, so that the user only needs to specify the rail commands.&lt;br /&gt;&lt;br /&gt;Here now the code of the &lt;i&gt;rail.sh&lt;/i&gt; shell script:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: shell"&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;# pipe STDIN to file&lt;br /&gt;cat - &gt; input.tex&lt;br /&gt;&lt;br /&gt;# run first time with latex&lt;br /&gt;latex input.tex 1&gt; /dev/null 2&gt; /dev/null&lt;br /&gt;&lt;br /&gt;# run rail&lt;br /&gt;rail input 1&gt; /dev/null 2&gt; /dev/null&lt;br /&gt;&lt;br /&gt;# run second time with latex&lt;br /&gt;latex input.tex 1&gt; /dev/null 2&gt; /dev/null&lt;br /&gt;&lt;br /&gt;# convert DVI file to PNG&lt;br /&gt;dvipng -q -Ttight -M -pp1 --noghostscript -D150 -o out.png input.dvi 1&gt; /dev/null 2&gt; /dev/null&lt;br /&gt;&lt;br /&gt;# remove temporary files&lt;br /&gt;rm input.*&lt;br /&gt;&lt;br /&gt;# pipe contents of PNG to STDOUT&lt;br /&gt;cat out.png -&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This script has following prerequesites:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;LaTeX installation&lt;/li&gt;&lt;li&gt;compiled version of the &lt;a href="http://www.ctan.org/tex-archive/support/rail"&gt;rail binary&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://sourceforge.net/projects/dvipng/"&gt;dvipng&lt;/a&gt; Installation&lt;/li&gt;&lt;/ul&gt;(Note that there are precompiled Debian and RPM packages for LaTeX and dvipng available.)&lt;br /&gt;&lt;br /&gt;Having all the pieces together, we now can use rail scripts to create nice railroad diagarams in Redmine. Here is an example taken from Azmun:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: plain"&gt;{{rail(&lt;br /&gt;\railalias{IMPLIES}{-&gt;}&lt;br /&gt;\railalias{EQUIVALENCE}{&lt;&gt;}&lt;br /&gt;\railalias{OR}{||}&lt;br /&gt;\railalias{XOR}{\textasciicircum}&lt;br /&gt;\railalias{AND}{\&amp;\&amp;}&lt;br /&gt;\railalias{EQ}{==}&lt;br /&gt;\railalias{NEQ}{!=}&lt;br /&gt;\railalias{LT}{&lt;}&lt;br /&gt;\railalias{GT}{&gt;}&lt;br /&gt;\railalias{LTE}{&lt;=}&lt;br /&gt;\railalias{GTE}{&gt;=}&lt;br /&gt;\railalias{SHIFTLEFT}{&lt;&lt;}&lt;br /&gt;\railalias{SHIFTRIGHT}{&gt;&gt;}&lt;br /&gt;\railalias{MUL}{*}&lt;br /&gt;\railalias{DIV}{/}&lt;br /&gt;\railalias{MOD}{\%}&lt;br /&gt;\railalias{PLUS}{+}&lt;br /&gt;\railalias{MINUS}{-}&lt;br /&gt;\railalias{NOT}{!}&lt;br /&gt;\railalias{PO}{(}&lt;br /&gt;\railalias{PC}{)}&lt;br /&gt;\railalias{DOT}{.}&lt;br /&gt;\railalias{FALSE}{false}&lt;br /&gt;\railalias{TRUE}{true}&lt;br /&gt;\railalias{INT}{0..9}&lt;br /&gt;&lt;br /&gt;\railterm{IMPLIES,EQUIVALENCE,OR,XOR,AND,EQ,NEQ,LT,GT,LTE,GTE,SHIFTLEFT,SHIFTRIGHT,MUL,DIV,MOD,PLUS,MINUS,NOT,PO,PC,DOT,FALSE,TRUE,INT}&lt;br /&gt;&lt;br /&gt;\begin{rail}  &lt;br /&gt;  BasicExpression :&lt;br /&gt;    [constants] ( BooleanConstant  &lt;br /&gt;        | IntegerConstant )&lt;br /&gt;    | [attribute reference] AttributeReference&lt;br /&gt;    | PO BasicExpression PC&lt;br /&gt;    | [logical NOT] NOT BasicExpression&lt;br /&gt;    | ( [integer multiplication] BasicExpression MUL BasicExpression&lt;br /&gt;        | [integer division] BasicExpression DIV BasicExpression &lt;br /&gt;        | [integer remainder] BasicExpression MOD BasicExpression )&lt;br /&gt;    | ( [integer addition] BasicExpression PLUS BasicExpression&lt;br /&gt;        | [integer substraction] BasicExpression MINUS BasicExpression )&lt;br /&gt;    | ( [bit shift left] BasicExpression SHIFTLEFT BasicExpression&lt;br /&gt;        | [bit shift right] BasicExpression SHIFTRIGHT BasicExpression )&lt;br /&gt;    | ( [equality] BasicExpression EQ BasicExpression&lt;br /&gt;        | [inequality] BasicExpression NEQ BasicExpression&lt;br /&gt;        | [less than] BasicExpression LT BasicExpression&lt;br /&gt;        | [greater than] BasicExpression GT BasicExpression&lt;br /&gt;        | [less than or equal] BasicExpression LTE BasicExpression&lt;br /&gt;        | [greater than or equal] BasicExpression GTE BasicExpression )&lt;br /&gt;    | [logical AND] BasicExpression AND BasicExpression&lt;br /&gt;    | ( [logical OR] BasicExpression OR BasicExpression&lt;br /&gt;        | [logical exclusive OR] BasicExpression XOR BasicExpression )&lt;br /&gt;    | [logical equivalence] BasicExpression EQUIVALENCE BasicExpression&lt;br /&gt;    | [logical implication] BasicExpression IMPLIES BasicExpression&lt;br /&gt;  ;&lt;br /&gt;&lt;br /&gt;  AttributeReference : UMLPropertyReference ( DOT AttributeReference )?;&lt;br /&gt;  BooleanConstant : FALSE | TRUE ;&lt;br /&gt;  IntegerConstant : ( MINUS | PLUS )? (INT+) ;   &lt;br /&gt;\end{rail}  &lt;br /&gt;&lt;br /&gt;)}}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This script results in the following diagram:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://1.bp.blogspot.com/-YXWe64UnNms/Tfc69tuNJ7I/AAAAAAAAAnQ/U-JCKRhqeBY/s1600/rail_example.png" /&gt;&lt;br /&gt;&lt;br /&gt;So, what is missing? Yes, an automatic conversion of Xtext grammars to rail scripts.&lt;br /&gt;I am also looking forward to have the new &lt;a href="http://www.eclipse.org/Xtext/documentation/indigo/images/railroad.png"&gt;Xtext Syntax Graph View&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Happy grammar hacking!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5410408355342477426-6847060963899774882?l=haschemi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haschemi.blogspot.com/feeds/6847060963899774882/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5410408355342477426&amp;postID=6847060963899774882&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5410408355342477426/posts/default/6847060963899774882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5410408355342477426/posts/default/6847060963899774882'/><link rel='alternate' type='text/html' href='http://haschemi.blogspot.com/2011/06/railroad-diagrams-in-redmine-wiki.html' title='Railroad Diagrams in Redmine Wiki'/><author><name>Siamak Haschemi</name><uri>http://www.blogger.com/profile/18212024603270656270</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-axgVkOA5s6g/ToNuVsMmaDI/AAAAAAAAArE/UHifzIaO5No/s220/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-YXWe64UnNms/Tfc69tuNJ7I/AAAAAAAAAnQ/U-JCKRhqeBY/s72-c/rail_example.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5410408355342477426.post-5058235509800881291</id><published>2011-03-29T11:52:00.003+02:00</published><updated>2011-03-30T10:18:01.133+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><category scheme='http://www.blogger.com/atom/ns#' term='nusmv-tools'/><title type='text'>New screencast from nusmv-tools</title><content type='html'>I created a screencast which shows the features of the &lt;a href="http://code.google.com/a/eclipselabs.org/p/nusmv-tools/"&gt;nusmv-tools&lt;/a&gt; Eclipse editor. The editor is build using &lt;a href="http://www.eclipse.org/Xtext/"&gt;Xtext&lt;/a&gt;, so many thanks to the itemis AG team!&lt;br /&gt;&lt;br /&gt;You can watch the video also in &lt;a href="http://www.vimeo.com/21637768"&gt;HD&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://player.vimeo.com/video/21637768" width="690" height="540" frameborder="0"&gt;&lt;/iframe&gt;&lt;p&gt;&lt;a href="http://vimeo.com/21637768"&gt;nusmv-tools Eclipse editor in action&lt;/a&gt; from &lt;a href="http://vimeo.com/user6439951"&gt;Siamak Haschemi&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;Happy model editing!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5410408355342477426-5058235509800881291?l=haschemi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haschemi.blogspot.com/feeds/5058235509800881291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5410408355342477426&amp;postID=5058235509800881291&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5410408355342477426/posts/default/5058235509800881291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5410408355342477426/posts/default/5058235509800881291'/><link rel='alternate' type='text/html' href='http://haschemi.blogspot.com/2011/03/new-screencast-from-nusmv-tools.html' title='New screencast from nusmv-tools'/><author><name>Siamak Haschemi</name><uri>http://www.blogger.com/profile/18212024603270656270</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-axgVkOA5s6g/ToNuVsMmaDI/AAAAAAAAArE/UHifzIaO5No/s220/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5410408355342477426.post-4597156449448368480</id><published>2011-03-22T11:13:00.003+01:00</published><updated>2011-03-22T11:32:36.294+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jna'/><category scheme='http://www.blogger.com/atom/ns#' term='nusmv-tools'/><category scheme='http://www.blogger.com/atom/ns#' term='nusmv'/><category scheme='http://www.blogger.com/atom/ns#' term='jnaerator'/><title type='text'>Access NuSMV from Java</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-pyX-Lt4yLzY/TYhqApNYEcI/AAAAAAAAAkQ/qPrWHMsTWuk/s1600/shapeimage_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh3.googleusercontent.com/-pyX-Lt4yLzY/TYhqApNYEcI/AAAAAAAAAkQ/qPrWHMsTWuk/s1600/shapeimage_1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://nusmv.fbk.eu/NuSMV/index.html"&gt;NuSMV&lt;/a&gt; is a symbolic model checker, which I use as part of my PhD thesis. However, NuSMV is written in C and I could not found any Java API to use the model checker from Java. Luckily, creating Java libraries out from C-headers becomes very easy by using &lt;a href="https://jna.dev.java.net/"&gt;JNA&lt;/a&gt; and &lt;a href="http://code.google.com/p/jnaerator/"&gt;JNAerator&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;JNA stands for Java Native Access and is a alternative to &lt;a href="http://en.wikipedia.org/wiki/Java_Native_Interface"&gt;JNI&lt;/a&gt;, the official way to access shared native libraries. The advantage of JNA is the dynamic binding to shared libraries, whithout writing anything but Java code. Principally, you write a Java Interface with methods machting the corresponding C-header of the library and provide that Java Interface to JNA. More info‘s and examples can be found on the &lt;a href="https://jna.dev.java.net/"&gt;project‘s website&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;While JNA provides the dynamic bridging between calls to the java interface, you still have to write the Java Interface and therefore you also need the knowledge about the conversion conventions from C to Java. Here comes JNAerator into the game. JNAerator is a tool to parse C headers and generate the corresponding JNA Java Interfaces. It comes with a Graphical User Interface, but can also be used on the command-line.&lt;br /&gt;&lt;br /&gt;To create a Java API for NuSMV, first a dynamic library has to be created out of the sources. Unfortunately, this library is not created by the make files. I host some &lt;a href="http://svn.codespot.com/a/eclipselabs.org/nusmv-tools/trunk/nusmv4j/org.eclipselabs.nusmvtools.nusmv4j/src/main/scripts/2.5.2/"&gt;scripts&lt;/a&gt; for the current NuSMV 2.5.2 to help you out with &lt;a href="http://svn.codespot.com/a/eclipselabs.org/nusmv-tools/trunk/nusmv4j/org.eclipselabs.nusmvtools.nusmv4j/src/main/scripts/2.5.2/win/"&gt;windows&lt;/a&gt;, &lt;a href="http://svn.codespot.com/a/eclipselabs.org/nusmv-tools/trunk/nusmv4j/org.eclipselabs.nusmvtools.nusmv4j/src/main/scripts/2.5.2/linux/"&gt;linux&lt;/a&gt;, and &lt;a href="http://svn.codespot.com/a/eclipselabs.org/nusmv-tools/trunk/nusmv4j/org.eclipselabs.nusmvtools.nusmv4j/src/main/scripts/2.5.2/osx/"&gt;osx&lt;/a&gt;.&lt;br /&gt;Having the shared library for NuSMV (nusmv.dll, libnusmv.so, libnusmv.jnilib), we can go an create the Java API using JNAerator (I also host the &lt;a href="http://svn.codespot.com/a/eclipselabs.org/nusmv-tools/trunk/nusmv4j/org.eclipselabs.nusmvtools.nusmv4j/src/main/scripts/2.5.2/jna/"&gt;script&lt;/a&gt; for that). What we get is a java interface which now gives us access to NuSMV.&lt;br /&gt;&lt;br /&gt;Accessing NuSMV becomes now as easy as:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;import static org.eclipselabs.nusmvtools.nusmv4j.NusmvLibraryUtil.toByteBuffer;&lt;br /&gt;&lt;br /&gt;import java.io.File;&lt;br /&gt;import java.io.PrintStream;&lt;br /&gt;&lt;br /&gt;import org.eclipselabs.nusmvtools.nusmv4j.NuSMV4J;&lt;br /&gt;import org.eclipselabs.nusmvtools.nusmv4j.NusmvLibrary;&lt;br /&gt;&lt;br /&gt;public class Main {&lt;br /&gt;  public static void main(final String[] args) throws Exception {&lt;br /&gt;    final File file = new File("testModel.nusmv");&lt;br /&gt;    final PrintStream ps = new PrintStream(file);&lt;br /&gt;    ps.println("MODULE main");&lt;br /&gt;    ps.println("  VAR");&lt;br /&gt;    ps.println("    x : boolean;");&lt;br /&gt;    ps.flush();&lt;br /&gt;    ps.close();&lt;br /&gt;&lt;br /&gt;    final NusmvLibrary nusmvLibrary = NuSMV4J.getNusmvLibrary();&lt;br /&gt;    nusmvLibrary.Cmd_CommandExecute(toByteBuffer("reset"));&lt;br /&gt;    nusmvLibrary.Cmd_CommandExecute(toByteBuffer("set default_trace_plugin 4"));&lt;br /&gt;    nusmvLibrary.Cmd_CommandExecute(toByteBuffer("read_model -i testModel.nusmv"));&lt;br /&gt;    nusmvLibrary.Cmd_CommandExecute(toByteBuffer("go"));&lt;br /&gt;    nusmvLibrary.Cmd_CommandExecute(toByteBuffer("check_ctlspec -p \"!x\""));&lt;br /&gt;    nusmvLibrary.Cmd_CommandExecute(toByteBuffer("show_traces"));&lt;br /&gt;&lt;br /&gt;    file.delete();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;When you run the above class, you get the following line on the console:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;-- specification !x  is false&lt;br /&gt;-- as demonstrated by the following execution sequence&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;counter-example type="0" desc="CTL Counterexample" &amp;gt;&lt;br /&gt;  &amp;lt;node&amp;gt;&lt;br /&gt;    &amp;lt;state id="1"&amp;gt;&lt;br /&gt;      &amp;lt;value variable="x"&amp;gt;TRUE&amp;lt;/value&amp;gt;&lt;br /&gt;    &amp;lt;/state&amp;gt;&lt;br /&gt;  &amp;lt;/node&amp;gt;&lt;br /&gt;  &amp;lt;loops&amp;gt; &amp;lt;/loops&amp;gt;&lt;br /&gt;&amp;lt;/counter-example&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If you don't want to take the above steps on your own, you should take a look at my project &lt;a href="http://code.google.com/a/eclipselabs.org/p/nusmv-tools/"&gt;nusmv-tools&lt;/a&gt;, which contains some Eclipse based tools like an Eclipse editor for NuSMV files (see blow), an API to read the NuSMV counterexamples in java, a model advisor, and the libraries for accessing NuSMV from java, which I presented in this post.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://lh5.googleusercontent.com/-AeIS5b26Cc4/TYhqbmp-N8I/AAAAAAAAAkU/_zROnCs4X4Q/s1600/nusmv-tools-editor.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh5.googleusercontent.com/-AeIS5b26Cc4/TYhqbmp-N8I/AAAAAAAAAkU/_zROnCs4X4Q/s1600/nusmv-tools-editor.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Happy model checking!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5410408355342477426-4597156449448368480?l=haschemi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haschemi.blogspot.com/feeds/4597156449448368480/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5410408355342477426&amp;postID=4597156449448368480&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5410408355342477426/posts/default/4597156449448368480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5410408355342477426/posts/default/4597156449448368480'/><link rel='alternate' type='text/html' href='http://haschemi.blogspot.com/2011/03/access-nusmv-from-java.html' title='Access NuSMV from Java'/><author><name>Siamak Haschemi</name><uri>http://www.blogger.com/profile/18212024603270656270</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-axgVkOA5s6g/ToNuVsMmaDI/AAAAAAAAArE/UHifzIaO5No/s220/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh3.googleusercontent.com/-pyX-Lt4yLzY/TYhqApNYEcI/AAAAAAAAAkQ/qPrWHMsTWuk/s72-c/shapeimage_1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5410408355342477426.post-355378062606996827</id><published>2011-03-21T23:57:00.018+01:00</published><updated>2011-03-30T10:21:33.085+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='azmun'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='xpand'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><category scheme='http://www.blogger.com/atom/ns#' term='nusmv'/><title type='text'>Verify And Beautify Model-2-Text Transformation Output</title><content type='html'>One of the projects which I developed during my PhD thesis is &lt;a href="http://www.azmun.de/"&gt;Azmun&lt;/a&gt;, a &lt;a href="http://en.wikipedia.org/wiki/Model-based_testing"&gt;model based testing&lt;/a&gt; framework based on various MDD technologies. One of the tasks within Azmun is to transform an UML-based test model to a model checking problem in order to &lt;a href="http://www.google.com/search?q=Testing+with+model+checkers%3A+a+survey&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;lr=lang_de#q=Testing+with+model+checkers%3A+a+survey&amp;amp;hl=de&amp;amp;prmd=ivns&amp;amp;tbas=0&amp;amp;source=lnt&amp;amp;sa=X&amp;amp;ei=sMmHTcbeO4zysgaJs6WqDA&amp;amp;ved=0CAYQpwUoAA&amp;amp;fp=659568cd75a3bc7f"&gt;use a model checker for automated test case generation&lt;/a&gt;. Although Azmun does not require a specific model checker, I mostly use &lt;a href="http://nusmv.fbk.eu/"&gt;NuSMV&lt;/a&gt; for my research. NuSMV has an own language to describe a system, and I developed a model-2-text (m2t) transformation from UML to NuSMV using &lt;a href="http://wiki.eclipse.org/Xpand"&gt;Xpand&lt;/a&gt;. And here comes the problem:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;i&gt;Q: How do we ensure that the output of our Xpand transformation is syntactically correct, and how can we format our output? &lt;/i&gt;&lt;/div&gt;&lt;br /&gt;These two questions may seem to be independend, but as you will see in a minute, we can tackle both problems with one approach. As a side project, I created the &lt;a href="http://www.blogger.com/%20http://code.google.com/a/eclipselabs.org/p/nusmv-tools/"&gt;nusmv-tools&lt;/a&gt; Eclipselabs project, which hosts some Eclipse-based tools. One of these tools is a rich text editor based on &lt;a href="http://www.eclipse.org/Xtext/"&gt;Xtext&lt;/a&gt;. And now we have the solution for our problem:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;A: We create a Xpand beautifier based on the Xtext parser and serializer.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;The following lines show how we solve our problem in Azmun:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java;highlight: [29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43]"&gt;public final class NuSMVCodeGenerator extends WorkflowComponentWithModelSlot {&lt;br /&gt;  private Generator m_generator = null;&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public void checkConfiguration(final Issues p_issues) {&lt;br /&gt;    super.checkConfiguration(p_issues);&lt;br /&gt;&lt;br /&gt;    m_generator = new Generator();&lt;br /&gt;    m_generator.addMetaModel(new UML2MetaModel());&lt;br /&gt;    // add other metamodels&lt;br /&gt;&lt;br /&gt;    m_generator.setFileEncoding("utf-8");&lt;br /&gt;    m_generator.setExpand("foo::bar::UML2NuSMV() FOR " + getModelSlot());&lt;br /&gt;&lt;br /&gt;    final Outlet outlet = new Outlet("/some/path");&lt;br /&gt;    outlet.addPostprocessor(new PostProcessor() {&lt;br /&gt;&lt;br /&gt;      @Override&lt;br /&gt;      public void beforeWriteAndClose(final FileHandle p_fileHandle) {&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      @Override&lt;br /&gt;      public void afterClose(final FileHandle p_fileHandle) {&lt;br /&gt;        try {&lt;br /&gt;          if (p_fileHandle.getAbsolutePath() == null &lt;br /&gt;            || !p_fileHandle.getAbsolutePath().endsWith(".nusmv")) {&lt;br /&gt;            return;&lt;br /&gt;          }&lt;br /&gt;          NuSMVStandaloneSetup.doSetup();&lt;br /&gt;          final ResourceSet resourceSet = new ResourceSetImpl();&lt;br /&gt;          final URI fileURI = URI.createFileURI(p_fileHandle.getAbsolutePath());&lt;br /&gt;          final Resource resource = resourceSet.getResource(fileURI, true);&lt;br /&gt;          for (final Diagnostic diagnostic : resource.getWarnings()) {&lt;br /&gt;            p_issues.addWarning(diagnostic.getMessage());&lt;br /&gt;          }&lt;br /&gt;          for (final Diagnostic diagnostic : resource.getErrors()) {&lt;br /&gt;            p_issues.addError(diagnostic.getMessage());&lt;br /&gt;          }&lt;br /&gt;          if (!resource.getErrors().isEmpty()) {&lt;br /&gt;            return;&lt;br /&gt;          }&lt;br /&gt;          final SaveOptions saveOptions = SaveOptions.newBuilder().format().getOptions();&lt;br /&gt;          resource.save(saveOptions.toOptionsMap());&lt;br /&gt;        } catch (final Exception e) {&lt;br /&gt;          throw new RuntimeException(e);&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;    });&lt;br /&gt;    m_generator.addOutlet(outlet);&lt;br /&gt;    m_generator.checkConfiguration(p_issues);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  protected void invokeInternal(final WorkflowContext p_ctx, &lt;br /&gt;      final ProgressMonitor p_monitor, final Issues p_issues) {&lt;br /&gt;    m_generator.invoke(p_ctx, p_monitor, p_issues);&lt;br /&gt;    m_generator = null;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;We configure the Xpand workflow component with a PostProcessor, which is called for every file we create during the m2t transformation. In the afterClose method, we load the generated file using the standard EMF ResourceSet mechanism, and immediately save the resource. The options we add to the Resource.save method specify that we want the output to be &lt;a href="http://www.eclipse.org/Xtext/documentation/1_0_1/xtext.html#formatting"&gt;formatted&lt;/a&gt; by Xtext.&lt;br /&gt;&lt;br /&gt;With this approach, we can be sure that the output we generate in the m2t transformations conforms to the NuSMV language. And as a side-effect we format our output.&lt;br /&gt;&lt;br /&gt;Happy transforming!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5410408355342477426-355378062606996827?l=haschemi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://haschemi.blogspot.com/feeds/355378062606996827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5410408355342477426&amp;postID=355378062606996827&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5410408355342477426/posts/default/355378062606996827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5410408355342477426/posts/default/355378062606996827'/><link rel='alternate' type='text/html' href='http://haschemi.blogspot.com/2011/03/one-of-projects-which-i-developed.html' title='Verify And Beautify Model-2-Text Transformation Output'/><author><name>Siamak Haschemi</name><uri>http://www.blogger.com/profile/18212024603270656270</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-axgVkOA5s6g/ToNuVsMmaDI/AAAAAAAAArE/UHifzIaO5No/s220/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
