<?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-15399929</id><updated>2011-12-12T12:38:06.553Z</updated><title type='text'>//BLOG: naked programmer</title><subtitle type='html'>the occasional public streak of a bloke called it</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://nakedprogrammer.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://nakedprogrammer.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Gabriel Malherbe</name><uri>http://www.blogger.com/profile/09059099557873806691</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/_z1zOP5aXenA/TGv0huFKzYI/AAAAAAAAAFM/GCtDa01JOrk/S220/260b92d.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-15399929.post-696013407003752757</id><published>2011-11-16T21:24:00.001Z</published><updated>2011-12-12T12:38:06.559Z</updated><title type='text'>Now also on Making Flow Work</title><content type='html'>A collaborative Dynamyx effort now features world class and experienced workflow bloggers at: &lt;a href="http://www.makingflowwork.com/"&gt;http://www.makingflowwork.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15399929-696013407003752757?l=nakedprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nakedprogrammer.blogspot.com/feeds/696013407003752757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15399929&amp;postID=696013407003752757' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/696013407003752757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/696013407003752757'/><link rel='alternate' type='text/html' href='http://nakedprogrammer.blogspot.com/2011/11/now-also-on-making-flow-work.html' title='Now also on Making Flow Work'/><author><name>Gabriel Malherbe</name><uri>http://www.blogger.com/profile/09059099557873806691</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/_z1zOP5aXenA/TGv0huFKzYI/AAAAAAAAAFM/GCtDa01JOrk/S220/260b92d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15399929.post-2232054483511577853</id><published>2010-08-18T15:48:00.003+01:00</published><updated>2010-08-18T16:34:28.824+01:00</updated><title type='text'>My next talk - ECM and Instance Management</title><content type='html'>16/09/2010 09h00 - Book at &lt;a href="http://www.dynamyx.com/"&gt;http://www.dynamyx.com/&lt;/a&gt;&lt;br /&gt;Microsoft Cardinal Place, Victoria, London&lt;br /&gt;&lt;br /&gt;Morning brief about &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;SharePiont&lt;/span&gt; as an &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;ECM&lt;/span&gt; and instance/case management platform where we will discuss the ability of using &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;SharePoint&lt;/span&gt; for case management and document imaging. We explore our reliance on paper as a token for driving a business process and how that keeps us well away from moving toward a paperless office.&lt;br /&gt;&lt;br /&gt;Live demonstrations will include an overview of the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;KnowledgeLake&lt;/span&gt; and K2 software platforms for &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;SharePoint&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15399929-2232054483511577853?l=nakedprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nakedprogrammer.blogspot.com/feeds/2232054483511577853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15399929&amp;postID=2232054483511577853' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/2232054483511577853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/2232054483511577853'/><link rel='alternate' type='text/html' href='http://nakedprogrammer.blogspot.com/2010/08/my-next-talk-ecm-and-instance.html' title='My next talk - ECM and Instance Management'/><author><name>Gabriel Malherbe</name><uri>http://www.blogger.com/profile/09059099557873806691</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/_z1zOP5aXenA/TGv0huFKzYI/AAAAAAAAAFM/GCtDa01JOrk/S220/260b92d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15399929.post-1835354800244638145</id><published>2009-10-04T19:34:00.000+01:00</published><updated>2009-10-04T19:35:25.447+01:00</updated><title type='text'>BizTalk Messagebox Viewer</title><content type='html'>13th Oct 2009 8pm&lt;br /&gt;&lt;br /&gt;Jean-Pierre Auconie, Technical Lead and Engineer from the EMEA BizTalk Team is going to join us for this session where he will talk us through the use of the Messagebox Viewer and Terminator tools which he has developed.  Jean-Pierre will also discuss where this fits compared to some of the other community tools for BizTalk.&lt;br /&gt;&lt;br /&gt;Jean-Pierre will also discuss some of the problems he has faced in the field where these tools have been useful and we will close with a Q&amp;amp;A session where people can draw from his experiences.&lt;br /&gt;&lt;br /&gt;Registration: &lt;a href="http://sbugminimessageboxviewer.eventbrite.com/"&gt;http://sbugminimessageboxviewer.eventbrite.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15399929-1835354800244638145?l=nakedprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nakedprogrammer.blogspot.com/feeds/1835354800244638145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15399929&amp;postID=1835354800244638145' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/1835354800244638145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/1835354800244638145'/><link rel='alternate' type='text/html' href='http://nakedprogrammer.blogspot.com/2009/10/biztalk-messagebox-viewer.html' title='BizTalk Messagebox Viewer'/><author><name>Gabriel Malherbe</name><uri>http://www.blogger.com/profile/09059099557873806691</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/_z1zOP5aXenA/TGv0huFKzYI/AAAAAAAAAFM/GCtDa01JOrk/S220/260b92d.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15399929.post-5966224395969529154</id><published>2009-01-30T13:46:00.002Z</published><updated>2009-01-30T13:50:40.192Z</updated><title type='text'>Professional K2 blackpearl</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_z1zOP5aXenA/SYMFiUyRjUI/AAAAAAAAADw/-KLsoVz-6z0/s1600-h/k2book.jpg"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 240px; FLOAT: left; HEIGHT: 240px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5297083673971100994" border="0" alt="" src="http://4.bp.blogspot.com/_z1zOP5aXenA/SYMFiUyRjUI/AAAAAAAAADw/-KLsoVz-6z0/s400/k2book.jpg" /&gt;&lt;/a&gt; Our book is out! And an excelent overview of what BPM realy means all the way through to deep under the hood of K2 blackpearl.&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Since this is the first book on K2 blackpearl, you will find a broad range of topics in this book, from the market in which K2 blackpearl is aimed to the architecture of the platform, from how to approach process design to developing your own custom user manager. &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://www.amazon.co.uk/Professional-K2-blackpearl-Holly-Anderson/dp/0470293055/"&gt;Get is here!&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15399929-5966224395969529154?l=nakedprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nakedprogrammer.blogspot.com/feeds/5966224395969529154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15399929&amp;postID=5966224395969529154' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/5966224395969529154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/5966224395969529154'/><link rel='alternate' type='text/html' href='http://nakedprogrammer.blogspot.com/2009/01/professional-k2-blackpearl.html' title='Professional K2 blackpearl'/><author><name>Gabriel Malherbe</name><uri>http://www.blogger.com/profile/09059099557873806691</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/_z1zOP5aXenA/TGv0huFKzYI/AAAAAAAAAFM/GCtDa01JOrk/S220/260b92d.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_z1zOP5aXenA/SYMFiUyRjUI/AAAAAAAAADw/-KLsoVz-6z0/s72-c/k2book.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15399929.post-4967424643174689298</id><published>2008-11-21T16:00:00.001Z</published><updated>2008-11-21T16:00:53.403Z</updated><title type='text'>Learn from Microsoft and K2 how Nissan drive more productivity from SAP</title><content type='html'>Learn from Microsoft and K2 how Nissan drive more productivity from SAP&lt;br /&gt;&lt;br /&gt;Microsoft and K2 would like to invite you to an afternoon session of presentations and networking to help you further your SAP investment. After refreshments and a welcome from your hosts you will gain an insight into how Microsoft works closely with SAP and their future strategy as partners. Also learn how one of our customers, Nissan, enhanced their productivity with workflow and SAP linking to enable updates, amends and automatic postings with limited user intervention. This session will be hosted by the Dynamyx Business analyst, who will explain the business drivers and processes involved, the project manager sharing experiences gained in delivering the solution across the region, and the systems architect who will present details on how to achieve scalability when linking workflow to SAP.&lt;br /&gt;&lt;br /&gt;The event will end with networking and drinks to wish you all the best of the season with the backdrop of the night time city view.&lt;br /&gt;&lt;br /&gt;Date: 10 December 2008&lt;br /&gt;Time: 14:00 – 17:30&lt;br /&gt;Venue: &lt;a href="http://www.radissonedwardian.com/londonuk_hampshire"&gt;Radisson Edwardian Hampshire&lt;/a&gt;&lt;br /&gt;To register call 0870 166 6628 or click here to register &lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032396296&amp;amp;Culture=en-GB"&gt;online&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15399929-4967424643174689298?l=nakedprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nakedprogrammer.blogspot.com/feeds/4967424643174689298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15399929&amp;postID=4967424643174689298' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/4967424643174689298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/4967424643174689298'/><link rel='alternate' type='text/html' href='http://nakedprogrammer.blogspot.com/2008/11/learn-from-microsoft-and-k2-how-nissan.html' title='Learn from Microsoft and K2 how Nissan drive more productivity from SAP'/><author><name>Gabriel Malherbe</name><uri>http://www.blogger.com/profile/09059099557873806691</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/_z1zOP5aXenA/TGv0huFKzYI/AAAAAAAAAFM/GCtDa01JOrk/S220/260b92d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15399929.post-8818448265846059851</id><published>2008-10-29T10:28:00.001Z</published><updated>2008-10-29T10:31:04.251Z</updated><title type='text'>Breakfast Briefing: Microsoft based Business Process Management</title><content type='html'>Discover the benefits of embracing Business Process Management using Microsoft based technologies.&lt;br /&gt;&lt;br /&gt;We will be presenting Microsoft® BizTalk® Server and K2 blackpearl focused around business-process automation and application-to-application integration. Dynamyx in Partnership with K2 and Microsoft invites you to join us for a breakfast seminar in London, UK. Breakfast will be available from 8:30.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;30 October 2008&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Arrival (8:00 - 8:30)&lt;br /&gt;Light Breakfast (8:30 - 9:00)&lt;br /&gt;Welcome from Microsoft Mr Harsha Karunaratne, SOA and Process Platform Technical Specialist  (9:00 - 9:30)&lt;br /&gt;Business Benefits of BPM Mr Ruan Scott, K2 VP EMEA  (9:30 - 10:00)&lt;br /&gt;Scenario Demonstration Mr Gabriel Malherbe, Dynamyx Technical Director  (10:00 - 10:45) Q&amp;amp;A (10:45 - 11:00)&lt;br /&gt;A technical workshop will be held from 11:00 to 12:00.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dynamyx.net/resources_EventsReg.aspx?EventID=74950"&gt;http://www.dynamyx.net/resources_EventsReg.aspx?EventID=74950&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15399929-8818448265846059851?l=nakedprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nakedprogrammer.blogspot.com/feeds/8818448265846059851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15399929&amp;postID=8818448265846059851' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/8818448265846059851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/8818448265846059851'/><link rel='alternate' type='text/html' href='http://nakedprogrammer.blogspot.com/2008/10/breakfast-briefing-microsoft-based.html' title='Breakfast Briefing: Microsoft based Business Process Management'/><author><name>Gabriel Malherbe</name><uri>http://www.blogger.com/profile/09059099557873806691</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/_z1zOP5aXenA/TGv0huFKzYI/AAAAAAAAAFM/GCtDa01JOrk/S220/260b92d.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15399929.post-4100986772135837197</id><published>2008-05-28T18:12:00.010+01:00</published><updated>2008-05-29T08:22:32.487+01:00</updated><title type='text'>Writing custom code in a K2 blackpearl client event</title><content type='html'>Long time no blog...&lt;br /&gt;&lt;br /&gt;Topic that’s had some recent airtime in Dynamyx. How to, or more specific, what’s the most correct way to write custom code behind a K2 blackpearl client event. This specific use case came about when we had to send an email from the client event that needed a high level of customization.&lt;br /&gt;&lt;br /&gt;Firstly, looking back at the K2.net 2003 days, this was a simple right click on the client event and hacking away at the generated code. The drawback was that you bought a one way ticket... you could never run the wizard again and retain your custom code. The new K2 blackpearl authoring model allow us to customize the underlying code of an event but maintain the integrity and ability to re-run the event's wizard.&lt;br /&gt;&lt;br /&gt;The question is, where do you put your code then?&lt;br /&gt;&lt;br /&gt;Let’s start by looking at the code behind a client event. Right click on the client event and select the View Code Event Item option:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;img id="BLOGGER_PHOTO_ID_5205479114948555330" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp0.blogger.com/_z1zOP5aXenA/SD2TrNw5MkI/AAAAAAAAACE/lBNGY8Pzq_o/s400/1+right+click+edit+event+item.JPG" border="0" /&gt;&lt;br /&gt;&lt;div&gt;You'll be presented with the XOML schedule that makes ups the client event:&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;img id="BLOGGER_PHOTO_ID_5205479368351625810" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp3.blogger.com/_z1zOP5aXenA/SD2T59w5MlI/AAAAAAAAACM/6nwFRYpP5qE/s400/2+xoml+schedule.JPG" border="0" /&gt;The idea is to add you own WF code activity either before or after the core client event code (depending on what you want to do). In my example I dragged a simple WF code activity from the Visual Studio toolbox and dropped it at the end of the schedule. To get to the event handler of the code activity, right click on it and select Generate Handlers:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5205479978236981858" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp1.blogger.com/_z1zOP5aXenA/SD2Uddw5MmI/AAAAAAAAACU/azNr8dkGNsI/s400/3+add+code+and+generate+handlers.JPG" border="0" /&gt;&lt;br /&gt;And write you own custom code:&lt;br /&gt;&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5205480201575281266" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp1.blogger.com/_z1zOP5aXenA/SD2Uqdw5MnI/AAAAAAAAACc/yvs9ybIjuc8/s400/4+own+code+sample.JPG" border="0" /&gt;&lt;/p&gt;&lt;em&gt;Thanks to Colin Murphy and &lt;a href="http://www.jeylabs.com/"&gt;Jey Srikantha &lt;/a&gt;(fellow K2 insiders) for their input in this solution.&lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15399929-4100986772135837197?l=nakedprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nakedprogrammer.blogspot.com/feeds/4100986772135837197/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15399929&amp;postID=4100986772135837197' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/4100986772135837197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/4100986772135837197'/><link rel='alternate' type='text/html' href='http://nakedprogrammer.blogspot.com/2008/05/writing-custom-code-in-k2-blackpearl.html' title='Writing custom code in a K2 blackpearl client event'/><author><name>Gabriel Malherbe</name><uri>http://www.blogger.com/profile/09059099557873806691</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/_z1zOP5aXenA/TGv0huFKzYI/AAAAAAAAAFM/GCtDa01JOrk/S220/260b92d.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_z1zOP5aXenA/SD2TrNw5MkI/AAAAAAAAACE/lBNGY8Pzq_o/s72-c/1+right+click+edit+event+item.JPG' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15399929.post-6222877194923969335</id><published>2007-12-20T16:08:00.000Z</published><updated>2007-12-20T16:54:45.717Z</updated><title type='text'>Actions leads to Outcomes</title><content type='html'>In enterprise solutions it’s impossible to keep logic in one place. We are faced with BPM rules engines, line of business applications with their own schemas, input and output limitations, business rules, UI rules, drinking rules and speed cameras! Although it would be great to have them all in one place, as with red tape in governing organs we cope with adapting our senses to read and adhere to this logic in an easy way. K2 blackpearl makes a few effective attempts at centralizing logic and offering us tools to use logic from elsewhere.&lt;br /&gt;&lt;br /&gt;In K2 2003 a user task was a good example where we often had routing logic in the workflow that had to be duplicated in the UI. For workflow routing our UI has to know what options the user had when auctioning a task and then the succeeding rule and all line rules out of the activity had to know about this as well. Maintenance was a nightmare.&lt;br /&gt;&lt;br /&gt;In order to centralize routing logic, my team built a complete framework on K2.net 2003 that allowed us to automatically render the user interface for a workflow client event by looking at the available lines out of an activity that hosted the client event (if you are not bothered about the battles we had in 2003 or are a K2 blackpearl only client, skip to ‘In K2 blackpearl” sections).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;color:#333333;"&gt;In K2 2003&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Here is the sample of the framework in action:&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5146088088009921490" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp0.blogger.com/_z1zOP5aXenA/R2qT2dSzU9I/AAAAAAAAABk/1i4QAlWrhsk/s400/Capture+1.JPG" border="0" /&gt;&lt;br /&gt;Logic of the workflow is automatically available in our business entities by purely inheriting from a specific base class (Customer in this example with an associated Customer Approval workflow instance) so accessing the logic defined in the workflow via client UI code looks like this:&lt;br /&gt;&lt;br /&gt;&lt;test()&gt;&lt;test()&gt;&lt;span style="color:#3366ff;"&gt;Public Sub&lt;/span&gt; LookAtCustomerActionsAvailable()&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#33cc00;"&gt;' load a biz entity&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;Dim&lt;/span&gt; cust &lt;span style="color:#3366ff;"&gt;As&lt;/span&gt; Customer = _&lt;br /&gt;RemoteServer.GeneralManager.Load(Of Model.Customer)(1)&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#33cc00;"&gt;' get the workflow context using the framework&lt;br /&gt;&lt;/span&gt;RemoteServer.WorkflowManager.PopulateContext(cust)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#33cc00;"&gt;' get the list of actions from the biz entity&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;For Each &lt;/span&gt;action &lt;span style="color:#3366ff;"&gt;As&lt;/span&gt; Action &lt;span style="color:#3366ff;"&gt;In&lt;/span&gt; cust.ActionsAvailable&lt;br /&gt;Assert.IsNotNull(action, "bollocks test")&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;Next&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#33cc00;"&gt;' take the first action&lt;/span&gt;&lt;br /&gt;cust.ActionToBeTaken = cust.ActionsAvailable(0)&lt;br /&gt;&lt;span style="color:#33cc00;"&gt;&lt;br /&gt;' save the entity and action the workflow using framework&lt;/span&gt;&lt;br /&gt;RemoteServerHelper.GeneralManager.SaveEntityObject(cust);&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;End Sub&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Powerful feature, but because it is our own framework extensions on top of K2 2003, it is hard to maintain. For example, all our client events, lines, succeeding rules and line rules have to adhere to our framework requirements, i.e. “what action will lead to what line and what line represents a specific outcome”. We have to add and maintain XML stubs on all these entities, i.e. here is a line telling the framework what action will lead to its outcome:&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5146090265558340578" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp3.blogger.com/_z1zOP5aXenA/R2qV1NSzU-I/AAAAAAAAABs/X7oFJN37NY8/s400/Capture+2.JPG" border="0" /&gt;&lt;br /&gt;Now that K2 blackpearl is available with the concept of being able to take a client action that leads to an outcome build into the product, life is much easier.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;color:#333333;"&gt;&lt;strong&gt;In K2 blackpearl&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Blackpearl defines the concept of a client event in the workflow being aware of what actions can be taken on it. This is defined when creating the client even in the process designer. The wizard will also allow you to define outcomes and link the action that a user can take with a specific outcome based on your own rule set. Once the client receives the task at run-time, the task contains the available actions and the UI can automatically render this.&lt;br /&gt;&lt;br /&gt;Here is a sample process:&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5146091055832323058" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp3.blogger.com/_z1zOP5aXenA/R2qWjNSzU_I/AAAAAAAAAB0/8MLS05PTigE/s400/Capture+3.JPG" border="0" /&gt;&lt;br /&gt;When I added the client event, I automatically added two actions with two outcomes, North and South. I also asked the client event wizard to create a line for each outcome… not a single line of code needed for this.&lt;br /&gt;&lt;br /&gt;Once I’ve started a new process instance and look at the allocated client task, I can see the two actions available: - this picture from the Workspace work list:&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5146091240515916802" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp2.blogger.com/_z1zOP5aXenA/R2qWt9SzVAI/AAAAAAAAAB8/SGySxDRvpnM/s400/Capture+4.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;Job done! I can link these outcomes to my UI using either the various UI integration events available (InfoPath Client Event and Form Generation Client Event) – zero code required.&lt;br /&gt;&lt;br /&gt;Alternatively I could render my own UI using the Client API. This sample code opens a connection to the K2 server, opens a task based on its serial number and then loops the available actions. It then takes the first action on the task in order to complete the client event:&lt;br /&gt;&lt;br /&gt;static void LoadActions() {&lt;br /&gt;&lt;span style="color:#33cc00;"&gt;// SourceCode.Workflow.Client.Connection now implements&lt;br /&gt;// IDisposable...&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;using &lt;/span&gt;(Connection con = &lt;span style="color:#3366ff;"&gt;new&lt;/span&gt; Connection()) {&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;try&lt;/span&gt; {&lt;br /&gt;&lt;span style="color:#33cc00;"&gt;// open connection and load task&lt;br /&gt;&lt;/span&gt;con.Open("localhost");&lt;br /&gt;WorklistItem task = con.OpenWorklistItem("SERIALNUMBER");&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#33cc00;"&gt;// loop the actions&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;foreach&lt;/span&gt; (Action action &lt;span style="color:#3366ff;"&gt;in&lt;/span&gt; task.Actions) {&lt;br /&gt;Console.WriteLine(action.Name);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#33cc00;"&gt;// action task (assume there is at least one)&lt;br /&gt;&lt;/span&gt;task.Actions[0].Execute();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;catch&lt;/span&gt; (Exception exception) { &lt;span style="color:#3366ff;"&gt;throw&lt;/span&gt; exception; }&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;finally&lt;/span&gt; { con.Close(); }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Thanks to the ambitions of the development team at Dynamyx that inspired the creation of the Dynamyx K2 framework that’s made life so much easier for us and our clients. I dedicate this blog entry to them. Rob, Ian, Trent, Kenny, Carlos and JT. &lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15399929-6222877194923969335?l=nakedprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nakedprogrammer.blogspot.com/feeds/6222877194923969335/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15399929&amp;postID=6222877194923969335' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/6222877194923969335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/6222877194923969335'/><link rel='alternate' type='text/html' href='http://nakedprogrammer.blogspot.com/2007/12/actions-leads-to-outcomes.html' title='Actions leads to Outcomes'/><author><name>Gabriel Malherbe</name><uri>http://www.blogger.com/profile/09059099557873806691</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/_z1zOP5aXenA/TGv0huFKzYI/AAAAAAAAAFM/GCtDa01JOrk/S220/260b92d.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_z1zOP5aXenA/R2qT2dSzU9I/AAAAAAAAABk/1i4QAlWrhsk/s72-c/Capture+1.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15399929.post-7840168030618599556</id><published>2007-12-18T07:50:00.000Z</published><updated>2007-12-18T08:23:51.369Z</updated><title type='text'>K2 blackpearl SP1 features realtime viewflow</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;I've had access to some beta's of K2 blackpearl SP1. I could not wait for it to hit the streets and now that it’s been unleashed, I'll highlight one of the features included.&lt;br /&gt;&lt;br /&gt;One of the most powerful reasons for adoption of K2 is its ability to visualise a process at run-time. Although I've heard varied opinions about this in the industry, everything from 'please don't show that to the user, it will confuse the hell out of them' to 'that’s why we bought K2', the viewflow has always been a hit. And now it’s just been given a dose of concentrated Brazilian guarana... real time capability!&lt;br /&gt;&lt;br /&gt;Here is a simple process I created in the K2 blackpearl Visual Studio designer:&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5145220491731227538" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp2.blogger.com/_z1zOP5aXenA/R2d-xtSzU5I/AAAAAAAAABE/ybFG_XoxTe0/s320/Immagine+1.jpg" border="0" /&gt;&lt;br /&gt;I exported it to the K2 server and started a new instance. The first activity will generate a client task, so I head straight for the Workspace, and click on the dropdown of my task.&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5145221672847233954" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp1.blogger.com/_z1zOP5aXenA/R2d_2dSzU6I/AAAAAAAAABM/SiAD69yYsgA/s320/Immagine+2.jpg" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;From there I can open the viewflow of the process. Look at this:&lt;/p&gt;&lt;img id="BLOGGER_PHOTO_ID_5145222046509388722" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp0.blogger.com/_z1zOP5aXenA/R2eAMNSzU7I/AAAAAAAAABU/2TgWLcog7Jc/s400/Immagine+3.jpg" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;There is also the option to view the viewflow in realtime, so I enable it, go back to my worklist and complete my pending task. Within a few seconds the viewflow automatically updates the state:&lt;/p&gt;&lt;img id="BLOGGER_PHOTO_ID_5145223352179446722" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp0.blogger.com/_z1zOP5aXenA/R2eBYNSzU8I/AAAAAAAAABc/y76-i7dmUQs/s400/Immagine+4.jpg" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15399929-7840168030618599556?l=nakedprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nakedprogrammer.blogspot.com/feeds/7840168030618599556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15399929&amp;postID=7840168030618599556' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/7840168030618599556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/7840168030618599556'/><link rel='alternate' type='text/html' href='http://nakedprogrammer.blogspot.com/2007/12/k2-blackpearl-sp1-features-realtime.html' title='K2 blackpearl SP1 features realtime viewflow'/><author><name>Gabriel Malherbe</name><uri>http://www.blogger.com/profile/09059099557873806691</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/_z1zOP5aXenA/TGv0huFKzYI/AAAAAAAAAFM/GCtDa01JOrk/S220/260b92d.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_z1zOP5aXenA/R2d-xtSzU5I/AAAAAAAAABE/ybFG_XoxTe0/s72-c/Immagine+1.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15399929.post-835632086911021498</id><published>2007-12-17T09:18:00.000Z</published><updated>2007-12-17T10:01:02.623Z</updated><title type='text'>K2 blackpearl SP1 released</title><content type='html'>From Technical Bulletin #7:&lt;br /&gt;&lt;br /&gt;K2 blackpearl™, the centerpiece of the new K2 platform, was released in August, and Service Pack 1 is now available.&lt;br /&gt; &lt;br /&gt;More than 300 customers and partners have already downloaded K2 blackpearl, and a US-based oil and gas company was the first organization to go live with an enterprise implementation for the management of wells.  More than a dozen additional companies expect to deploy K2 blackpearl to production in the coming months.&lt;br /&gt; &lt;br /&gt;K2 blackpearl SP1 includes many fixes and enhancements to K2 blackpearl, based on extensive customer and internal feedback.  Some of the key enhancements include:&lt;br /&gt; &lt;br /&gt;•   Out-of-box reports have been enhanced.&lt;br /&gt;•   A Web-based ViewFlow has been included with auto-refresh and click-through for additional details and steps.&lt;br /&gt;•   Users can now access the task lists of people that report to them.&lt;br /&gt;•   Roles are now resolved in real-time.&lt;br /&gt;•   AD groups can now serve as destinations and are resolved at runtime.&lt;br /&gt;•   Memory and performance fixes have reduced the memory footprint and increased the stability and  &lt;br /&gt;     responsiveness of K2 Designer for Visual Studio and the K2 Web Designer for SharePoint.&lt;br /&gt;•   A Server Logging Framework and Server Performance Monitoring, with Windows Performance Monitor &lt;br /&gt;     integration, have been added.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15399929-835632086911021498?l=nakedprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nakedprogrammer.blogspot.com/feeds/835632086911021498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15399929&amp;postID=835632086911021498' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/835632086911021498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/835632086911021498'/><link rel='alternate' type='text/html' href='http://nakedprogrammer.blogspot.com/2007/12/k2-blackpearl-sp1-released.html' title='K2 blackpearl SP1 released'/><author><name>Gabriel Malherbe</name><uri>http://www.blogger.com/profile/09059099557873806691</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/_z1zOP5aXenA/TGv0huFKzYI/AAAAAAAAAFM/GCtDa01JOrk/S220/260b92d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15399929.post-9159539461958010883</id><published>2007-07-09T08:41:00.001+01:00</published><updated>2007-07-09T08:45:14.355+01:00</updated><title type='text'>K2 Underground</title><content type='html'>Dear Blog-surfer,&lt;br /&gt;&lt;br /&gt;Most of my blog has always been dedicated to articles and write-ups on K2.net. As I recently joined the K2 Insider community, my K2.net efforts will be directed to the new K2.net community portal, &lt;a href="http://www.k2underground.com"&gt;www.k2underground.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'll keep this blog up to date with other articles and stories.&lt;br /&gt;&lt;br /&gt;The Naked Programmer&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15399929-9159539461958010883?l=nakedprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nakedprogrammer.blogspot.com/feeds/9159539461958010883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15399929&amp;postID=9159539461958010883' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/9159539461958010883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/9159539461958010883'/><link rel='alternate' type='text/html' href='http://nakedprogrammer.blogspot.com/2007/07/k2-underground.html' title='K2 Underground'/><author><name>Gabriel Malherbe</name><uri>http://www.blogger.com/profile/09059099557873806691</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/_z1zOP5aXenA/TGv0huFKzYI/AAAAAAAAAFM/GCtDa01JOrk/S220/260b92d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15399929.post-8236203125290440500</id><published>2007-05-07T10:47:00.000+01:00</published><updated>2007-05-07T11:25:00.126+01:00</updated><title type='text'>Using a K2.net 2003 process as a 'function call'</title><content type='html'>&lt;p&gt;Although this kind of thing will be much easier in K2.net [BlackPearl] using SmartFunctions, sometime we would like to run a K2.net 2003 process to determine the outcome of a set of rules only. Normally this process will not have any client interaction as it mearly takes some input, apply a set of rules using the K2.net line rules, and output some result. Doing this we get the K2.net visual representation of our business rules and the outcome of it.&lt;/p&gt;&lt;p&gt;The calling code treat the K2.net process instance as a method call, creating a new process instance, passing the initial data into the process via datafields and then wait for the process instance to reach an 'answer point', then read the answer from the process instance.&lt;/p&gt;&lt;p&gt;The assumption is that there is alway only &lt;strong&gt;one &lt;/strong&gt;outcome from the business rules.&lt;/p&gt;&lt;p&gt;Firstly, our process. This is a very simple process that will set some datafield called Result to true.&lt;/p&gt;&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5061756068571473618" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp0.blogger.com/_z1zOP5aXenA/Rj74U3bhZtI/AAAAAAAAAA0/VfAxSrbDUJ4/s320/Process+Example.JPG" border="0" /&gt;&lt;/p&gt;&lt;p&gt;The code inside the True server event looks like this:&lt;/p&gt;&lt;p&gt;Sub Main(ByVal K2 As ServerEventContext)&lt;br /&gt;&lt;span style="color:#009900;"&gt;&amp;nbsp;' make this server event wait&lt;br /&gt;&lt;/span&gt;&amp;nbsp;K2.Synchronous = &lt;span style="color:#3333ff;"&gt;&lt;strong&gt;False&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;nbsp;' store the server event's serial in a process level datafield&lt;br /&gt;&lt;/span&gt;&amp;nbsp;K2.ProcessInstance.DataFields("WaitingServerEventSerial").Value = K2.&lt;strong&gt;&lt;span style="color:#3333ff;"&gt;SerialNumber&lt;/span&gt;&lt;br /&gt;&lt;/strong&gt;&lt;span style="color:#009900;"&gt;&amp;nbsp;' set the result of this process, i.e. the business rule&lt;br /&gt;&lt;/span&gt;&amp;nbsp;K2.ProcessInstance.DataFields("Result").Value = True&lt;br /&gt;End Sub&lt;/p&gt;&lt;p&gt;Note that we set the Synchronous property to False. This will make this server event wait until we instruct it to complete. We need to do this so that we can grab the outcome of the business rules (True in this example, stored in the datafield called Result). For the calling code to get to this server event to complete it, the server event store its serial number in a process level datafield called WaitingServerEventSerial.&lt;/p&gt;&lt;p&gt;The calling code looks this this:&lt;/p&gt;&lt;p&gt;Sub Main()&lt;br /&gt;&amp;nbsp;Dim myConn As SourceCode.K2ROM.Connection = Nothing&lt;br /&gt;&amp;nbsp;Try&lt;br /&gt;&lt;span style="color:#009900;"&gt;&amp;nbsp;' this opens a connection to the K2 server&lt;br /&gt;&lt;/span&gt;&amp;nbsp;myConn = New SourceCode.K2ROM.Connection&lt;br /&gt;myConn.Open("localhost")&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;&amp;nbsp;' this is the rules based process&lt;br /&gt;&lt;/span&gt;&amp;nbsp;Dim myProc As SourceCode.K2ROM.ProcessInstance&lt;br /&gt;&amp;nbsp;Dim piString As String = "Async\Rules"&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;&amp;nbsp;' this creates the process instance&lt;/span&gt;&lt;br /&gt;&amp;nbsp;myProc = myConn.CreateProcessInstance(piString)&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;&amp;nbsp;' this starts the process instance but does not return control to this code&lt;br /&gt;&amp;nbsp;' until the process hits a waiting point. in this case the server event thats&lt;br /&gt;&amp;nbsp;' been marked to be K2.Synchronous = False&lt;/span&gt;&lt;br /&gt;&amp;nbsp;myConn.StartProcessInstance(myProc, &lt;strong&gt;&lt;span style="color:#3333ff;"&gt;True&lt;/span&gt;&lt;/strong&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;&amp;nbsp;' save the process instance ID and use it to open the process again&lt;br /&gt;&lt;/span&gt;&amp;nbsp;Dim myProcID = myProc.ID&lt;br /&gt;&amp;nbsp;myProc = myConn.OpenProcessInstance(myProcID)&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;&amp;nbsp;' get the result&lt;/span&gt;&lt;br /&gt;&amp;nbsp;Dim result As Boolean = CType(myProc.DataFields("Result").Value, Boolean)&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;&amp;nbsp;' and very important, tell the server event to complete (by getting the waiting server&lt;br /&gt;&amp;nbsp;' event's serial number from the process instance datafield. if we don't do this then the&lt;br /&gt;&amp;nbsp;' process instance will stay active&lt;/span&gt;&lt;br /&gt;&amp;nbsp;Dim waitingServerEventSerial As String = myProc.DataFields("&lt;strong&gt;&lt;span style="color:#3333ff;"&gt;WaitingServerEventSerial&lt;/span&gt;&lt;/strong&gt;").Value.ToString()&lt;br /&gt;&amp;nbsp;Dim waitingServerEvent As SourceCode.K2ROM.ServerItem = myConn.OpenServerItem(waitingServerEventSerial)&lt;br /&gt;waitingServerEvent.&lt;strong&gt;&lt;span style="color:#3333ff;"&gt;Finish()&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;Console.WriteLine("Result is " &amp;amp; result.ToString())&lt;br /&gt;&lt;br /&gt;Catch ex As Exception&lt;br /&gt;&amp;nbsp;Console.WriteLine(ex.ToString)&lt;br /&gt;Finally&lt;br /&gt;&amp;nbsp;If Not myConn Is Nothing Then&lt;br /&gt;&amp;nbsp;myConn.Close()&lt;br /&gt;&amp;nbsp;End If&lt;br /&gt;End Try&lt;br /&gt;Console.ReadLine()&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;The client code creates and starts a process instance. Note the Sync property is set to True when starting the process instance. This will make sure that the StartProcessInstance method will &lt;u&gt;not return control to the calling code until the process hits a client event for Async server event&lt;/u&gt;. In our example this Async server event is the outcome of the business logic that we are waiting for.&lt;/p&gt;&lt;p&gt;Once this point is reached and control is passed back to our client code we reload the process instance, get the outcome of the business rules via the Result datafield and then instruct the waiting server event to finish by picking its serial number up from the datafield &lt;strong&gt;WaitingServerEventSerial&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;&lt;em&gt;PS. Thanks Richard Neal and Mark Jones who's questions prompted me to do this article.&lt;br /&gt;&lt;br /&gt;PSS. Often clients ask me to code in the language they use, so I've decided to at last also post a sample in VB.NET. Also note that I always use a simple pattern where I always make sure that the connection to the K2.net server is closed.&lt;br /&gt;&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/15399929-8236203125290440500?l=nakedprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nakedprogrammer.blogspot.com/feeds/8236203125290440500/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15399929&amp;postID=8236203125290440500' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/8236203125290440500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/8236203125290440500'/><link rel='alternate' type='text/html' href='http://nakedprogrammer.blogspot.com/2007/05/using-k2net-2003-process-as-function.html' title='Using a K2.net 2003 process as a &apos;function call&apos;'/><author><name>Gabriel Malherbe</name><uri>http://www.blogger.com/profile/09059099557873806691</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/_z1zOP5aXenA/TGv0huFKzYI/AAAAAAAAAFM/GCtDa01JOrk/S220/260b92d.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_z1zOP5aXenA/Rj74U3bhZtI/AAAAAAAAAA0/VfAxSrbDUJ4/s72-c/Process+Example.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15399929.post-1931111909827609978</id><published>2007-04-11T09:58:00.000+01:00</published><updated>2007-04-11T10:00:59.855+01:00</updated><title type='text'>Microsoft Virtual PC 2007 and me Dell Inspiron 6000</title><content type='html'>What a battle... took me days to find a solution to this; installed &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;VPC&lt;/span&gt; 2007 on my Dell &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Inspiron&lt;/span&gt; (its got the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Centrino&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;chipset&lt;/span&gt;). The virtual machine would keep on being jittery, slow, and unresponsive. Poor &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_4"&gt;performance&lt;/span&gt; all over.&lt;br /&gt;&lt;br /&gt;This solved it:&lt;br /&gt;&lt;a href="http://codebetter.com/blogs/jeff.lynch/archive/2006/11/28/VPC-2007-Beta_3A00_-Centrino-915-Chipset-Issues.aspx"&gt;http://codebetter.com/blogs/jeff.lynch/archive/2006/11/28/VPC-2007-Beta_3A00_-Centrino-915-Chipset-Issues.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Like noted, not the perfect fix and eats away nicely at the battery, but it works.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15399929-1931111909827609978?l=nakedprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nakedprogrammer.blogspot.com/feeds/1931111909827609978/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15399929&amp;postID=1931111909827609978' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/1931111909827609978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/1931111909827609978'/><link rel='alternate' type='text/html' href='http://nakedprogrammer.blogspot.com/2007/04/microsoft-virtual-pc-2007-and-me-dell.html' title='Microsoft Virtual PC 2007 and me Dell Inspiron 6000'/><author><name>Gabriel Malherbe</name><uri>http://www.blogger.com/profile/09059099557873806691</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/_z1zOP5aXenA/TGv0huFKzYI/AAAAAAAAAFM/GCtDa01JOrk/S220/260b92d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15399929.post-8052540001128486053</id><published>2007-01-15T16:27:00.000Z</published><updated>2007-01-15T16:40:18.220Z</updated><title type='text'>This version or that version?</title><content type='html'>It might be required to create an instance of a specific version of a process. Some reasons:&lt;br /&gt;&lt;br /&gt;0. When exporting a new version of a process, the K2 server makes it the default version automatically. This is a bit of a pain as new instances of the new exported process will be automatically created by clients that don't spesify a spesific version.&lt;br /&gt;&lt;br /&gt;1. Export process that's passed QA in development to production and run final pre-production testing before making the process live. In this scenario your user interface will always specify the version of the process when creating an instance.&lt;br /&gt;&lt;br /&gt;2. Sometimes changes to a process require changes to the user and/or system interfaces. In this scenario the user interface can create a process on a specific version but should also render itself correctly for a specific version of the process (more about that in the next blog).&lt;br /&gt;Using the K2ROM.dll library one can specify what version of the process to create using the overloaded &lt;span style="font-family:courier new;"&gt;.CreateProcessinstance&lt;/span&gt; method.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SourceCode.K2ROM.Connection con = new SourceCode.K2ROM.Connection();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;con.Open("127.0.0.1");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SourceCode.K2ROM.ProcessInstance pi;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;pi = con.CreateProcessInstance(@"Project\Process", 2);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This will create an instance of the Process process using version 2.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15399929-8052540001128486053?l=nakedprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nakedprogrammer.blogspot.com/feeds/8052540001128486053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15399929&amp;postID=8052540001128486053' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/8052540001128486053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/8052540001128486053'/><link rel='alternate' type='text/html' href='http://nakedprogrammer.blogspot.com/2007/01/this-version-or-that-version.html' title='This version or that version?'/><author><name>Gabriel Malherbe</name><uri>http://www.blogger.com/profile/09059099557873806691</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/_z1zOP5aXenA/TGv0huFKzYI/AAAAAAAAAFM/GCtDa01JOrk/S220/260b92d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15399929.post-116371541177703160</id><published>2006-11-16T21:43:00.000Z</published><updated>2006-11-16T22:18:27.920Z</updated><title type='text'>Repair Error, this instance or a whole lot more?</title><content type='html'>&lt;p&gt;K2.net 2003 have the great feature of fixing errors on the fly. When any code component in K2 (line rule, start or preceding rule, event, etc.) generates an unhandled exception, the process instance goes into an Error state. These process instances in Error state can be viewed form the K2.net Service Manager by creating a Error Profile and then viewing the errors in that profile.&lt;br&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://photos1.blogger.com/blogger/3941/1425/320/Error%20Profile.0.png" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;From here the Service Manager allows you to open the details of the error and various details of the error can be viewed including:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Process Name&lt;/li&gt;&lt;li&gt;Error Type&lt;/li&gt;&lt;li&gt;Error Location&lt;/li&gt;&lt;li&gt;Error Details&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;The really nice feature is being able to see the code that generated the error. From this view you can edit the code and repair the error on the fly.&lt;br&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://photos1.blogger.com/blogger/3941/1425/320/Repair%20Error.png" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;But... what is the effect of doing this? The K2 server stores only ONE copy of this code. Its stored in the _Code table in the transaction DB (normally called K2). By modifying the code in this error details window and hitting the Repair button, the Service Manager updates the code in the _Code table and re-executes the object (in my example an error was created in an Server Event, so the event is re-executed with the new code).&lt;br /&gt;&lt;br /&gt;Because there is only one copy of the code, the change made is reflected for ALL process instances and all new process instances. So be careful what you do in your code change as its going to affect way more than just the current process instance! As a matter of fact, even previous version of the process having the same code is updated.&lt;br /&gt;&lt;br /&gt;Something else to note is that the original process definition will still contain the un-edited bad code and will also need to be looked at before you re-export the process.&lt;br /&gt;&lt;br /&gt;I must apologise to my ex students as I've probably not been explaining the behaviour correctly in the past. We burn and learn. Comments (including possible moans at me) welcome!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15399929-116371541177703160?l=nakedprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nakedprogrammer.blogspot.com/feeds/116371541177703160/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15399929&amp;postID=116371541177703160' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/116371541177703160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/116371541177703160'/><link rel='alternate' type='text/html' href='http://nakedprogrammer.blogspot.com/2006/11/repair-error-this-instance-or-whole.html' title='Repair Error, this instance or a whole lot more?'/><author><name>Gabriel Malherbe</name><uri>http://www.blogger.com/profile/09059099557873806691</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/_z1zOP5aXenA/TGv0huFKzYI/AAAAAAAAAFM/GCtDa01JOrk/S220/260b92d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15399929.post-115879530858801227</id><published>2006-09-21T00:28:00.000+01:00</published><updated>2006-09-21T00:40:04.393+01:00</updated><title type='text'>K2.net 2003 development best practices...</title><content type='html'>I've spent some time with some of the top K2.net UK consultants recently. The topic of K2.net 2003 workflow development best practices came up (again) and I thought I'll share some here. Best practices are subjective, so feel free to share your own opinions.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Datafields:&lt;/strong&gt; You'll by now have noticed the three check boxes at the bottom of the screen when creating a datafield in the K2.net Studio. Don't ignore them! 'Keep Audit Trail' will result in the K2 server making a copy of the datafield every time its value change. This option should not be checked by default. Only enable this for datafields that needs to be audited (for tracking or compliance reasons). 'Data On Demand' means that the value of the datafield is only loaded when its accessed and not when the process instance is created. A ProcessInstance object is created (and all the non-data on demand datafields are loaded) whenever a worklist item or server item is loaded. Only leave this option unchecked for datafields that you will access often to make sure they are readily available. For datafields that are large or datafields that are not often accessed, ticking this option will create a small delay when accessing them, but will greatly improve the performance of loading a worklist item or server item.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Worklist performance:&lt;/strong&gt; This is where most clients experience bottlenecks in performance and its very often due to a bad design. Consider the best practise for datafields to improve access to a worklist. Secondly, don't load a users full worklist if its not required. Use the WorklistCriteria object when loading the worklist in order to paginate and optimally filter the result.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Connections:&lt;/strong&gt; The rule of 'acquire late, release early' for any resources that your application use applies to the K2.net Connection object as well. In plain English this means, open the connection to the K2 server as late as possible and close it as soon as you are done (except if you need to keep holding onto the connection to improve multiple transactions that follow each other). When you are done, close the connection, don't be lazy and just conveniently forget about it. The Connection object itself might be a managed object in .NET but the resource you are consuming, the actual connection to the K2 server, is not. Same goes for SQL connections, files handles, etc. Because the K2 Connection object does not implement IDisposable (and even if it did, (repeat after me) you must still close the connection), I normally use this simple pattern to ensure that my connection is closed:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;K2ROM.Connection con;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;try&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;con = new K2ROM.Connection();&lt;br /&gt;con.Open();&lt;br /&gt;&lt;span style="color:#33cc00;"&gt;// use it here&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;catch&lt;/span&gt; (Exception ex)&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#33cc00;"&gt;// handle exception here&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;finally&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;if&lt;/span&gt; (con != &lt;span style="color:#3366ff;"&gt;null&lt;/span&gt;) con.Close();&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Error Handling:&lt;/strong&gt; Things go wrong, bottom line. You must build exception handling into your process. Exception handling can be added as low as event and line rule level, up to a general exception handler for the process. Build exception handling that can work around the error in line with the business process. As a last resort, allow the exception to be bubbled up to the K2 server.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Code location:&lt;/strong&gt; Although there has been massive improvements in the code editor in K2.net Studio, consider a better, re-usable and more maintainable architecture by writing your code in VS.NET and building a referenced assembly. You can pass any event sensitive context object from your process into your assembly by setting a reference to the K2ROM and KO libraries in your assembly.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Log file performance:&lt;/strong&gt; Once your solution has been tested and rolled out, disable the log file output of the K2.net server in the Service Manager - if its not needed. Depending on the amount of activity on your server, writing a log file can impact on the server's performance.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Process data v.s. external data:&lt;/strong&gt; K2.net 2003 is a great workflow engine, its a bad data store. You don't store your MP3 files in your email client, so don't store your application data in your process. Store only in the process data that's related to the workflow. If your workflow processes a document, keep the document in its own store (network share, SharePoint, etc.) and work with a reference to the document in your process. If your workflow processes a customer, store the customer record in a database and work with the id in the process. Ask yourself the question, 'who is the owner of this data'. If its not K2, don't store it in K2.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Large destination rules:&lt;/strong&gt; Few developers realise that the K2 server creates an instance of an Activity for each destination in the destination rule. This means that an Activity with a hundred destinations will result in the K2 server creating a 100 instances of the Activity in the transaction database. A service pack 3 feature allows you to limit this to one instance and should be considered where performance is important and multiple Activity instances (i.e. Activity datafields) are not required.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Debugging:&lt;/strong&gt; By running the K2 server in interactive mode, you can view the real time log output of the server. Write plenty of trace information in your process - this does not only help tracking development bugs, but will help to assist finding the audit and source of an issue that surface during production.&lt;br /&gt;&lt;br /&gt;I'll keep building this list as I stumble across issues.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15399929-115879530858801227?l=nakedprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nakedprogrammer.blogspot.com/feeds/115879530858801227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15399929&amp;postID=115879530858801227' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/115879530858801227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/115879530858801227'/><link rel='alternate' type='text/html' href='http://nakedprogrammer.blogspot.com/2006/09/k2net-2003-development-best-practices.html' title='K2.net 2003 development best practices...'/><author><name>Gabriel Malherbe</name><uri>http://www.blogger.com/profile/09059099557873806691</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/_z1zOP5aXenA/TGv0huFKzYI/AAAAAAAAAFM/GCtDa01JOrk/S220/260b92d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15399929.post-113865680807615225</id><published>2006-01-30T21:23:00.000Z</published><updated>2006-02-06T14:03:30.053Z</updated><title type='text'>K2.net client event serial numbers and emails</title><content type='html'>Long time no blog.&lt;br /&gt;&lt;br /&gt;Interesting one I picked up the other day. I was putting a URL in an email notification for a user (destination) to complete a worklist item. The user kept on reporting that under some conditions, he would hit the link, but the page would not open correctly because the serial number that was past of the URL query string, got cut off at a comma.&lt;br /&gt;&lt;br /&gt;K2.net builds serial numbers for client events in order to correctly identify a specific client event for a given activity instance:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;How does k2 generate the serial number?&lt;/strong&gt;&lt;br /&gt;&lt;/em&gt;&lt;a href="http://forum.k2workflow.com/viewtopic.php?t=2&amp;sid=6b1b93ac90bad66f0c700a8bef7d910e"&gt;&lt;em&gt;http://forum.k2workflow.com/viewtopic.php?t=2&amp;amp;sid=6b1b93ac90bad66f0c700a8bef7d910e&lt;/em&gt;&lt;/a&gt;&lt;br /&gt;&lt;em&gt;&lt;br /&gt;The Serial Number is unique for each event instance within the process instance. This means that if you have an activity that contains 2 events (for example a server and client event), then during the execution of the process, each of these will have their own unique serial number. The serial number is basically the most granular unique identifier within the process. It identifies a single step, within a specific activity instance, within a specific process instance, and if it is a client event, the serial number also uniquely identifies which user it is allocated to. Therefore, if an activity is set to have 3 users in it's destination rule, then for the client event, there will be 3 different serial numbers for each user that the client event is sent to.&lt;/em&gt; &lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;The format of the serial number is something like SERVER,xx,yy. When I included the URL of the client page in the email notification to the destination, his email client would sometimes (if the line needs to be line wrapped) cut the URL into two lines in the email. It would do this at one of the commas.&lt;br /&gt;&lt;br /&gt;To avoid this, I had to UrlEncode the serial number part in the URL. This will avoid that the URL gets cut in two pieces (even if the line gets line wrapped) when included in an text email.&lt;br /&gt;&lt;br /&gt;The code looks like this:&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;sn = System.Web.HttpUtility.UrlEncode(K2.SerialNumber);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;URL before using HttpUtility.UrlEncode:&lt;br /&gt;&lt;span style="font-family:courier new;color:#3366ff;"&gt;&lt;strong&gt;http://server/sites/page.aspx?sn=SRV,12,13&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;URL after using HttpUtility.UrlEncode:&lt;br /&gt;&lt;span style="font-family:courier new;color:#3366ff;"&gt;&lt;strong&gt;http://server/sites/page.aspx?sn=SRV%2c12%2c13&lt;/strong&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15399929-113865680807615225?l=nakedprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nakedprogrammer.blogspot.com/feeds/113865680807615225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15399929&amp;postID=113865680807615225' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/113865680807615225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/113865680807615225'/><link rel='alternate' type='text/html' href='http://nakedprogrammer.blogspot.com/2006/01/k2net-client-event-serial-numbers-and.html' title='K2.net client event serial numbers and emails'/><author><name>Gabriel Malherbe</name><uri>http://www.blogger.com/profile/09059099557873806691</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/_z1zOP5aXenA/TGv0huFKzYI/AAAAAAAAAFM/GCtDa01JOrk/S220/260b92d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15399929.post-113096596271898162</id><published>2005-11-02T21:12:00.000Z</published><updated>2005-11-10T22:39:07.036Z</updated><title type='text'>The Solo Accountant Reporter</title><content type='html'>IT Professionals and Sarbanes-Oxley Section 404&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jemoore.blogspot.com/"&gt;The Solo Accountant Reporter&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15399929-113096596271898162?l=nakedprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nakedprogrammer.blogspot.com/feeds/113096596271898162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15399929&amp;postID=113096596271898162' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/113096596271898162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/113096596271898162'/><link rel='alternate' type='text/html' href='http://nakedprogrammer.blogspot.com/2005/11/solo-accountant-reporter.html' title='The Solo Accountant Reporter'/><author><name>Gabriel Malherbe</name><uri>http://www.blogger.com/profile/09059099557873806691</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/_z1zOP5aXenA/TGv0huFKzYI/AAAAAAAAAFM/GCtDa01JOrk/S220/260b92d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15399929.post-113084415169080451</id><published>2005-11-01T10:46:00.000Z</published><updated>2005-12-19T12:10:41.606Z</updated><title type='text'>WSS SP2 event handler changes</title><content type='html'>&lt;em&gt;Updated 19/12/2005&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;Windows SharePoint Services SP2 Event Handler changes - incompatible with K2.net SP2a&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Microsoft recently &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=b922b28d-806a-427b-a4c5-ab0f1aa0f7f9&amp;displaylang=en"&gt;released&lt;/a&gt; WSS SP2 that contains some nice enhancements to the core WSS engine, new site and list templates and much better integration capabilities with Microsoft InfoPath 2003.&lt;br /&gt;&lt;br /&gt;Some much needed updates to the way SharePoint event handlers impersonate users at last took place in this service pack.&lt;br /&gt;&lt;br /&gt;Unfortunately, this influences the way current event handlers that run on the non-SP2 object model. For this reason, the event handlers from SharePoint that invokes K2.net processes does not work after upgrading your SharePoint to Service Pack 2. K2 current recommends avoiding upgrading SharePoint until a hot fix for K2.net 2003 is available.&lt;br /&gt;&lt;br /&gt;Added: K2.net 2003 SP2a hot fix released - see comments.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15399929-113084415169080451?l=nakedprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nakedprogrammer.blogspot.com/feeds/113084415169080451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15399929&amp;postID=113084415169080451' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/113084415169080451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/113084415169080451'/><link rel='alternate' type='text/html' href='http://nakedprogrammer.blogspot.com/2005/11/wss-sp2-event-handler-changes.html' title='WSS SP2 event handler changes'/><author><name>Gabriel Malherbe</name><uri>http://www.blogger.com/profile/09059099557873806691</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/_z1zOP5aXenA/TGv0huFKzYI/AAAAAAAAAFM/GCtDa01JOrk/S220/260b92d.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15399929.post-113050990290943855</id><published>2005-10-28T15:18:00.000+01:00</published><updated>2005-10-30T22:30:49.910Z</updated><title type='text'>A K2.net 2003 Looping Pattern</title><content type='html'>&lt;em&gt;Its about time...&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Ever so often a student ask me about some K2.net 2003 best practices. Mostly there's a hidden question behind the obvious... how to solve a specific business problem using this great workflow engine's process mapper.&lt;br /&gt;&lt;br /&gt;I've decided to document a view of my own experiences. This month I'll overview a solution a client requested regarding scheduled document checking in a SharePoint document library. Since the rest of the solution was all done in SharePoint 2003 and K2.net 2003, I was eager to implement this solution of checking a bunch of documents using the exact same technologies.&lt;br /&gt;&lt;br /&gt;As with all best pratices and patterns, note:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Its a recommended, repeatable &lt;em&gt;suggestion &lt;/em&gt;for solving a common, repeated problem. Its &lt;strong&gt;not&lt;/strong&gt; a &lt;em&gt;rule&lt;/em&gt; or the &lt;em&gt;only way&lt;/em&gt; to solve the problem.&lt;/li&gt;&lt;/ul&gt;&lt;em&gt;Problem:&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;My client's got a document library with hundreds of documents. The document library contains various document properties (meta data) - one being the date that a document is valid until. Once a document's &lt;em&gt;valid until date&lt;/em&gt; is reached, certain actions need to take place. These actions already exist in another K2 process.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Solution:&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Its a simple problem, and writing some kind of process that will (1) start periodically, (2) load some configuration, (3) load all the documents from the document library that's about to &lt;em&gt;expire&lt;/em&gt;, (4) loop them and, for each, call a process that will take some actions on them using the K2.net IPC event. This process is then scheduled to run periodically (using the standard Windows task scheduler I gave my client the control).&lt;br /&gt;&lt;br /&gt;Lets look at the K2.net process I've mapped out for this:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/3941/1425/1600/mainloopprocess.0.gif"&gt;&lt;img style="CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/3941/1425/400/mainloopprocess.0.gif" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The first activity merely loads some configuration settings. The only configuration I load here is the &lt;em&gt;DayOffset&lt;/em&gt; used for determining when a document is expired.&lt;br /&gt;&lt;br /&gt;The second activity connects to the SharePoint document library and loads all the documents that is about to expire based on the configuration settings from the first activity.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;To enable my client to control the process (and other processes part of this solution) I've build a simple key/value custom list in SharePoint that allows them to control processes related settings. This is a great way to hide the actual process from the user but give them the power to control the process without knowing how to configure, build and export K2.net processes when they want to make changes.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The list of documents that should be processed are loaded into a K2.net XML datafield by the &lt;em&gt;Get Expired Documents&lt;/em&gt; activity. The XML data field, &lt;em&gt;ExpiredDocuments,&lt;/em&gt; will be the iteration that will be looped in the K2.net process. It contains a list of document URLs of the expired documents based on my criteria loaded in the first activity.&lt;/p&gt;&lt;p&gt;&lt;a href="http://photos1.blogger.com/blogger/3941/1425/1600/itteration.1.gif"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://photos1.blogger.com/blogger/3941/1425/1600/itteration.3.gif"&gt;&lt;img style="CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/3941/1425/320/itteration.3.gif" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The other important K2.net datafield it the &lt;em&gt;DocumentCounter &lt;/em&gt;datafield. Its the &lt;em&gt;iterator&lt;/em&gt; of the loop.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://photos1.blogger.com/blogger/3941/1425/1600/itterator.0.gif"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://photos1.blogger.com/blogger/3941/1425/1600/itterator.1.gif"&gt;&lt;img style="CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/3941/1425/320/itterator.1.gif" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The third activity is the most important part of this pattern. It is the looping structure. Using a combination of a process datafield as the iterator, a XML process datafield as the iteration and line rules as looping conditions, you can build pretty much any looping structure in K2.net.&lt;/p&gt;&lt;p&gt;This activity will loop the list of document URLs - every time selecting the next document from the XML process datafield and making it the current document. The &lt;em&gt;DocumentCounter&lt;/em&gt; is updated and the &lt;em&gt;MustLoop&lt;/em&gt; datafield indicates if the loop should terminate. This is all done within a single server event in the main looping control activity.&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;public void Main(ServerEventContext K2)&lt;br /&gt;{&lt;br /&gt;K2.Synchronous = true;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#33cc00;"&gt;// get the list of expired&lt;br /&gt;documents from the xml datafield string DocsField;&lt;br /&gt;&lt;/span&gt;DocsField =&lt;br /&gt;K2.ProcessInstance.XmlFields["&lt;strong&gt;ExpiredDocuments&lt;/strong&gt;"].Value;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#33cc00;"&gt;// create a xml document and load the xml datafield&lt;br /&gt;&lt;/span&gt;System.Xml.XmlDocument oXmlDoc = new System.Xml.XmlDocument();&lt;br /&gt;oXmlDoc.LoadXml(DocsField);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#33cc00;"&gt;// select the&lt;br /&gt;document element at the current position&lt;/span&gt;&lt;br /&gt;int DocumentCounter =&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;(int)K2.ProcessInstance.DataFields["&lt;strong&gt;DocumentCounter&lt;/strong&gt;"].Value;&lt;br /&gt;&lt;br /&gt;System.Xml.XmlNode oXmlDocument =&lt;br /&gt;oXmlDoc.SelectSingleNode("Documents/Document[position() = " +&lt;br /&gt;DocumentCounter.ToString() + "]");&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#33cc00;"&gt;// if there's a document in this position set the 'CurrentDocumentURL' datafield,&lt;br /&gt;// set the 'MustLoop' datafield to true to enter the loop and&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#33cc00;"&gt;// increment the 'DocumentCounter' datafield&lt;br /&gt;// ELSE&lt;br /&gt;// exit the loop by setting 'MustLoop' to false&lt;br /&gt;&lt;/span&gt;if (oXmlDocument != null)&lt;br /&gt;{&lt;br /&gt;K2.ProcessInstance.DataFields["&lt;strong&gt;CurrentDocumentURL&lt;/strong&gt;"].Value =&lt;br /&gt;oXmlDocument.SelectSingleNode("&lt;strong&gt;DocumentURL&lt;/strong&gt;").InnerText;&lt;br /&gt;&lt;br /&gt;((int)K2.ProcessInstance.DataFields["&lt;strong&gt;DocumentCounter&lt;/strong&gt;"].Value)++;&lt;br /&gt;&lt;br /&gt;K2.ProcessInstance.DataFields["&lt;strong&gt;MustLoop&lt;/strong&gt;"].Value = &lt;strong&gt;&lt;span style="color:#3366ff;"&gt;true&lt;/span&gt;&lt;/strong&gt;;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;K2.ProcessInstance.DataFields["&lt;strong&gt;MustLoop&lt;/strong&gt;"].Value = &lt;strong&gt;&lt;span style="color:#3366ff;"&gt;false&lt;/span&gt;&lt;/strong&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="font-family:Georgia;font-size:100%;"&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="font-family:Georgia;font-size:100%;"&gt;Since the architecture of K2.net does not allow me to create a code block that will span multiple events (never mind multiple activities), I need to build a loop over activities by using a combination of lines and a iterator to keep track of the current document being processed. I will use the &lt;em&gt;DocumentCounter&lt;/em&gt; process datafield that will keep the value of the current position within the &lt;span style="font-family:courier new;"&gt;&lt;documents&gt;&lt;/span&gt;element in the &lt;em&gt;ExpiredDocuments&lt;/em&gt; XML datafield. Everytime the Loop activity runs, I select the next document from the XML list using a simple XPath query:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;Documents/Document[position() = &lt;em&gt;'1 based index'&lt;/em&gt;]&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This query will return &lt;span style="font-family:courier new;"&gt;null&lt;/span&gt; into the XmlNode object if there is not a element at the given position (in my solution this indicates that I've iterated all the &lt;span style="font-family:courier new;"&gt;&lt;document&gt;&lt;/span&gt;nodes in the &lt;span style="font-family:courier new;"&gt;&lt;documents&gt;&lt;/span&gt;element and that the loop should terminate).&lt;/p&gt;&lt;p&gt;From here the process will either flow into the loop if there's another document to be processed or the loop with terminate if all documents was processed by using the &lt;em&gt;MustLoop&lt;/em&gt; process datafield based on the line rules leaving the &lt;em&gt;Loop&lt;/em&gt; activity.&lt;/p&gt;&lt;p&gt;By using XML process datafields in K2.net, you can build and loop lists of items with ease. And don't be scrared to dive into the code level of K2.net - its THE most powerfull feature of K2.net - having the .NET class libraries right there for you to write realy powerful workflow.&lt;/p&gt;&lt;p&gt;If you have to allow a mortal, um, non-developer to configure the process, just take your code and hide it in an assembly. Have the non-developer call your code using the Assembly Wizard event thats part of K2.net 2003 SP2a.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15399929-113050990290943855?l=nakedprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nakedprogrammer.blogspot.com/feeds/113050990290943855/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15399929&amp;postID=113050990290943855' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/113050990290943855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/113050990290943855'/><link rel='alternate' type='text/html' href='http://nakedprogrammer.blogspot.com/2005/10/k2net-2003-looping-pattern.html' title='A K2.net 2003 Looping Pattern'/><author><name>Gabriel Malherbe</name><uri>http://www.blogger.com/profile/09059099557873806691</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/_z1zOP5aXenA/TGv0huFKzYI/AAAAAAAAAFM/GCtDa01JOrk/S220/260b92d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15399929.post-113172732970012960</id><published>2005-09-16T16:40:00.000+01:00</published><updated>2005-11-11T16:42:31.360Z</updated><title type='text'>Next Generation of K2.net(R) to be Built on Windows Workflow</title><content type='html'>SourceCode Technology Holdings, Inc. (SCTH), a global leader for enterprise business process management software built on the .NET platform, today at the Microsoft's Professional Developers Conference in L.A., announced that, following on a year of extensive research and development and work with the Microsoft product teams, it will deliver the next version of their K2.net(R) product (code name "BlackPearl") on the Windows Workflow Foundation. BlackPearl is scheduled for general availability by late 2006.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.prnewswire.co.uk/cgi/news/release?id=153695"&gt;http://www.prnewswire.co.uk/cgi/news/release?id=153695&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15399929-113172732970012960?l=nakedprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nakedprogrammer.blogspot.com/feeds/113172732970012960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15399929&amp;postID=113172732970012960' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/113172732970012960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15399929/posts/default/113172732970012960'/><link rel='alternate' type='text/html' href='http://nakedprogrammer.blogspot.com/2005/09/next-generation-of-k2netr-to-be-built.html' title='Next Generation of K2.net(R) to be Built on Windows Workflow'/><author><name>Gabriel Malherbe</name><uri>http://www.blogger.com/profile/09059099557873806691</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/_z1zOP5aXenA/TGv0huFKzYI/AAAAAAAAAFM/GCtDa01JOrk/S220/260b92d.jpg'/></author><thr:total>0</thr:total></entry></feed>
