<?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-8462912557665679659</id><updated>2011-04-21T20:20:34.687-04:00</updated><category term='ruby'/><category term='eh'/><category term='bpm'/><category term='ugly'/><category term='cramming GUI bran'/><category term='Rice'/><category term='no fries'/><category term='pretend'/><category term='Pipes'/><category term='drag hippie curve'/><category term='petri'/><category term='ZOOM'/><category term='your Aunt Janie'/><category term='happy meats'/><category term='jquery taco salad'/><category term='Canvas'/><category term='jquery'/><category term='badass'/><category term='breeze'/><category term='curves'/><category term='nodes'/><category term='rails'/><category term='smikey'/><category term='windily beans'/><category term='token'/><category term='JSON'/><category term='Jim Nabors'/><title type='text'>3weeks2build</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://3weeks2build.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://3weeks2build.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Loren Davie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8462912557665679659.post-7758402877769063355</id><published>2008-01-21T01:10:00.000-05:00</published><updated>2008-01-21T01:43:06.303-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cramming GUI bran'/><title type='text'>Time's up, put down your pastry bags!</title><content type='html'>I'm having high school flashbacks right now.  The sabbatical ends tomorrow morning, and I'm up at quarter past 1 "cramming".  So much for "coming back refreshed".&lt;br /&gt;&lt;br /&gt;So I've got things mostly done.   Some small functional holes still exist, but I really need some sleep.  I imagine I'll be sneaking in the remaining features when i have pockets of time. &lt;br /&gt;&lt;br /&gt;There was a lot to this GUI - and the things I'd pegged as being easy were the things that bit me the hardest.   I have so much appreciation for the Information Architects (or Information Architecters) of the world.  &lt;br /&gt;&lt;br /&gt;No longer making sense. . must get sleep.&lt;br /&gt;&lt;br /&gt;I had Raisin Bran for dinner.  Not even real Raisin Bran,  I had&lt;br /&gt;the Malt-O-Meal knock off.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8462912557665679659-7758402877769063355?l=3weeks2build.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3weeks2build.blogspot.com/feeds/7758402877769063355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8462912557665679659&amp;postID=7758402877769063355' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/7758402877769063355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/7758402877769063355'/><link rel='alternate' type='text/html' href='http://3weeks2build.blogspot.com/2008/01/times-up-put-down-your-pastry-bags.html' title='Time&apos;s up, put down your pastry bags!'/><author><name>Divad Natilopan</name><uri>http://www.blogger.com/profile/08815927778355063244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8462912557665679659.post-6731051236389062833</id><published>2008-01-18T01:27:00.000-05:00</published><updated>2008-01-18T01:50:12.206-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='drag hippie curve'/><category scheme='http://www.blogger.com/atom/ns#' term='no fries'/><category scheme='http://www.blogger.com/atom/ns#' term='windily beans'/><title type='text'>Duty Calls. . .</title><content type='html'>As it turns out, the Process Designer thing I'm building is missing an important feature.  That feature is what we in "the biz" call "Save".     Its used to take important data that's teetering on the edge of existence, sustained only by the good fortune that electricity has managed to flow constantly through the millions of circuits that compose a stick of RAM - and securely deliver it to a much safer place, like a hard drive, whose promise of data integrity can only be defeated by bumps, magnets, static electricity, liquid, dust, above-normal temperatures or any other condition that will probably happen soon.&lt;br /&gt;&lt;br /&gt;So anyway - Nitram's been waiting for me to get this feature finished so that he can use the tool to help him test and exercise the engine.  Dragging and dropping sure beats hand-editing XML, right?  Fair enough.  So, like a good partner, I fired up Photoshop and worked on the UI.&lt;br /&gt;&lt;br /&gt;I cut some new graphics for the different node types,  tweaked some CSS, and upgraded the look a bit, and added some bells and whistles.  I also discovered that my home-brewed method for detecting the center of a Bezier curve wasn't always working.  If you remember, I'm adding a button to the middle of each of the connecting lines - well, in some cases, the button was rendering nowhere near the line.  So, i had to roll up the sleeves and do this right.  I found &lt;a href="http://en.wikipedia.org/wiki/De_Casteljau%27s_algorithm"&gt;de Casteljau's algorithm&lt;/a&gt;  which is perfect for doing just this. I'm not a heavy math guy, but i was able to come up with a cheap implementation in js:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;Transition.midpoint = function(e1,cp1,cp2,e2){&lt;br /&gt;   var top = [_mp_line(e1,cp1),_mp_line(cp1,cp2),_mp_line(cp2,e2)];&lt;br /&gt;   var mid = [_mp_line(top[0],top[1]),_mp_line(top[1],top[2])];&lt;br /&gt;   return _mp_line(mid[0],mid[1]);&lt;br /&gt; &lt;br /&gt;   function _mp_line(p1,p2){&lt;br /&gt;       return {&lt;br /&gt;       x: (Math.abs(p1.x-p2.x)/2) +Math.min(p1.x,p2.x),&lt;br /&gt;       y: (Math.abs(p1.y-p2.y)/2) +Math.min(p1.y,p2.y)}&lt;br /&gt;   };&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;All this really does is take the end points and control points that define a curve, and find the midpoints between each adjacent pair.  Then it finds the midpoints between each of those midpoints, then again, until there is only one point left.  Thats our guy.   I think this could've been implemented more slickly using recursion, but i think it would actually make it a longer piece of code.   Any way &lt;a href="http://screencast.com/t/yNAxxQ3gwTe"&gt;here's the jing&lt;/a&gt; of the algorithm, and some of the new UI in action. (Please don't mind the pimpley-looking drag circles and the misplaced text)&lt;br /&gt;&lt;br /&gt;In all honesty, I spent a good bit of time today working out the details of the "save" feature.  There actually are some interesting challenges in it.  Since I've decided not to auto-save or make calls to the server at each event in the gui,  There are potentially many changes that will need to be carried out by the time the user saves their work.  Within one save request there may be tens of actions to perform, some nodes may get updated, others deleted, others created - some will have new Actions associated with them, some Transitions will be deleted, created, or moved.  So, to get ready for this I wrote it out in pseudo-code to make sure that i'll be doing things in the correct order.  I'm really almost done, Nitram, I swear.  Maybe if I didn't blog so windily, I'd be done with it.&lt;br /&gt;&lt;br /&gt;Oh yeah, I had Chix (hippie chicken) patty burgers, sauteed kale and baked beans for dinner whoooooo hoooo!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8462912557665679659-6731051236389062833?l=3weeks2build.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3weeks2build.blogspot.com/feeds/6731051236389062833/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8462912557665679659&amp;postID=6731051236389062833' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/6731051236389062833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/6731051236389062833'/><link rel='alternate' type='text/html' href='http://3weeks2build.blogspot.com/2008/01/duty-calls.html' title='Duty Calls. . .'/><author><name>Divad Natilopan</name><uri>http://www.blogger.com/profile/08815927778355063244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8462912557665679659.post-6002511604456530880</id><published>2008-01-18T00:23:00.000-05:00</published><updated>2008-01-18T01:05:58.964-05:00</updated><title type='text'>Rails forms...not so hot</title><content type='html'>Before running through the activities from the last two days, a word on rails forms.  While this is not my first time using rails, I still fall into a state of confusion and bewilderment whenever using the forms on anything more complicated than the ideal one-object-to-one-form mapping.  So far I am really displeased with form handling in the rails template language, it just doesn't seem to scale well to more complex objects.&lt;br /&gt;&lt;br /&gt;That said, over the course of this project I've developed a pretty good approach for myself to keep my sanity.  It basically amounts to two guidelines: keep it simple by not overusing helpers, think of everything as it will exist when passed into the params hash.  In retrospect, these rules are fairly obvious, but they still work well as a mantra.   I love the params hash, when used in conjunction the model helpers it is a very clean, JSON-like, solution.  It feels intuitive to me.  The rendered html, with its bracket notation (...input name="sibling[126067293][take]"...) is also very intuitive, you can "see" how it translates into the params hash.  It's just the code that generates this html that sucks...hey, maybe I could just code straight html?  Or make my own helpers?  Need to think more about this.  I wish I had more of an argument, but it's more of a feeling than anything else right now.  More to come on this topic...&lt;br /&gt;&lt;br /&gt;Yesterday and today:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Solved JSON issue (from_json was not robust enough) with dave&lt;/li&gt;&lt;li&gt;Played some foos!&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Process engine now passes first 8 of 20 workflow patterns&lt;/li&gt;&lt;li&gt;Fixed process definition XML serialization bug&lt;/li&gt;&lt;li&gt;Process engine now defaults all spawned tokens to wait-state on any fork, event code must "continue" the tokens, helper method created to facilitate this&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Controller integration&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Added wait_for_user_input helper method to process_engine&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Now supports custom view callbacks for controller interaction&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Default view handlers are in place for forks and end-of-process&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Created routing to handle process engine requests seamlessly and globally&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8462912557665679659-6002511604456530880?l=3weeks2build.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3weeks2build.blogspot.com/feeds/6002511604456530880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8462912557665679659&amp;postID=6002511604456530880' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/6002511604456530880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/6002511604456530880'/><link rel='alternate' type='text/html' href='http://3weeks2build.blogspot.com/2008/01/yesterday-and-today-solved-json-issue.html' title='Rails forms...not so hot'/><author><name>Martin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8462912557665679659.post-8170212973172043421</id><published>2008-01-16T00:53:00.000-05:00</published><updated>2008-01-16T01:13:49.123-05:00</updated><title type='text'>Hey, JSON, WTF?</title><content type='html'>Ok, figured out the annoying JSON bug I was having yesterday. . . thanks to my use of virtual properties to traverse the model relationships and produce the json - my sub-arrays were getting double-JSON encoded.  So instead of:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;{name:'test node',&lt;br /&gt;id: 234323,&lt;br /&gt;type: 'decision'&lt;br /&gt;transitions: [&lt;br /&gt;   {to_id: 432343, arrival:"top", departure:"left"},&lt;br /&gt;   {to_id: 343233, arrival:"right", departure:"bottom"}&lt;br /&gt;   ]&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;I was getting:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;{name:'test node',&lt;br /&gt;id: 234323,&lt;br /&gt;type: 'decision'&lt;br /&gt;transitions: [&lt;br /&gt;   "{to_id: 432343, arrival:\"top\", departure:\"left\"},"&lt;br /&gt;   "{to_id: 343233, arrival:\"right\", departure:\"bottom\"}"&lt;br /&gt;   ]&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Notice the difference?   Neither did I.&lt;br /&gt;&lt;br /&gt;I actually got a number of items off of my list today. One of them, "Multiple hotspot/dragpoints per node"  means that creating a transition between two nodes is more than defining a "from" and a "to". . . You might want to connect the bottom of one node to the left side of the other.  Of course there's no functional difference, but users would become annoyed and diagrams messy without this kind of control.   jQuery and my caveman-level CSS knowledge made it pretty trivial to dynamically add to each node, North, South, East, and West drag zones and drop zones.  Now why am i calling them top, bottom, left, and right in the code?  North, South, East and West sounds so much cooler.  I wish i had thought of this earlier.  Perhaps we can save these changes and promote version 2.0 with "Improved Variable Names! Upgrade Now!"  or "Code base features even more consistent indentation!"&lt;br /&gt;&lt;br /&gt;It hit me (while taking a power drill to my laptop (in order to justify an upgrade to the MacBook Air (Thanks Jared!) ) )  that users of our system will need to be able to select transitions.  Up to this point, transitions have been a purely visual thing, simply reacting to the location and size of their related nodes.  Selecting could be complex being that 1) nobody wants to try to click on a line that's curvy and only 2 pixels wide.  While it is possible to detect whether or not the click was along the curve, this type of user experience is likely to make all the Davie recipients weep.   2) these Canvas elements (1 per curve, remember) overlap each other like the f'endas on a waitress - so the highest z-index canvas steals all the clicks. I quickly IM'ed Nitram to see if he had any ideas.  He said, "how about a circle in the middle of each transition? -And you click it" &lt;br /&gt;"Well Mr. Smarty-Pants, How's it feel to always have things like 'Answers' and 'Ideas'?  I hope that works out for you!"    So, i took his weak stump of an idea and reworked it tirelessly and I came up with this:   Each transition will have a circle in the middle of it.  And you can click it.   This action will bring up the properties for that transition.  This didn't solve the overlapping canvas problem - so what i've done is this: Mid-points for all transitions are determined and mapped to absolute page coordinates.  Clickable DIVs are placed at these locations at the highest z-index.  Seems to work so far.  I can't wait to put a real skin on this thing.  I hope i have time for that.&lt;br /&gt;&lt;br /&gt;Unfortunately, each line I strike off, has me adding a line or two.  My list currently looks like this.  it may not make sense to you but, i mean, its MY list.&lt;br /&gt;&lt;br /&gt;build/integrate graphics&lt;br /&gt;finish: make transitions selectable/visually selected&lt;br /&gt;finish: building property editing&lt;br /&gt;finish: saving nodes.&lt;br /&gt;panning / zoom&lt;br /&gt;add more quality&lt;br /&gt;self-transitioning nodes.&lt;br /&gt;stop scratching it&lt;br /&gt;&lt;br /&gt;Ok. I've gotta go, my laptop still works.&lt;br /&gt;&lt;br /&gt;PS - I inadvertently got "fancy" tonight and ate a green curry w/ chicken out of a real coconut @ a local restaurant tonight.  It wasn't what I ordered, but its what they brought me and what i had to pay for.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8462912557665679659-8170212973172043421?l=3weeks2build.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3weeks2build.blogspot.com/feeds/8170212973172043421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8462912557665679659&amp;postID=8170212973172043421' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/8170212973172043421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/8170212973172043421'/><link rel='alternate' type='text/html' href='http://3weeks2build.blogspot.com/2008/01/hey-json-wtf.html' title='Hey, JSON, WTF?'/><author><name>Divad Natilopan</name><uri>http://www.blogger.com/profile/08815927778355063244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8462912557665679659.post-2857704189933958015</id><published>2008-01-15T20:17:00.000-05:00</published><updated>2008-01-16T11:53:35.268-05:00</updated><title type='text'>Another day...</title><content type='html'>Today was mostly research along with several disturbances.  I looked through the rails controller api, messed with routes.rb, and learned more about the ruby language, which was great.  I was sidetracked by watching the Macworld 2008 keynote.  Then, I saw this &lt;a href="http://www.nytimes.com/2008/01/15/science/15brain.html?em&amp;amp;ex=1200546000&amp;amp;en=3d0d451cc8672382&amp;amp;ei=5087%0A"&gt;article&lt;/a&gt; in the nytimes which led to this &lt;a href="http://arxiv.org/abs/hep-th/0208013"&gt;paper&lt;/a&gt; which led to me wondering who in physics is actually performing scientific experimentation anymore...and on and on until I came to the fundamental meta-conclusion that the chief danger of our information saturated culture is tangential thought...and that I probably have severe ADD.&lt;br /&gt;&lt;br /&gt;Update:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Shaved nascent sabbatical beard this weekend.  Fiancee Melissa gave it a thumbs down for our anniversary date.  Not that I blame her, it was looking pretty bad and was itchy as hell.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Cleaned up the model by adding a few polymorphic associations.&lt;/li&gt;&lt;li&gt;Started work on process-engine + controller interaction.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8462912557665679659-2857704189933958015?l=3weeks2build.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3weeks2build.blogspot.com/feeds/2857704189933958015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8462912557665679659&amp;postID=2857704189933958015' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/2857704189933958015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/2857704189933958015'/><link rel='alternate' type='text/html' href='http://3weeks2build.blogspot.com/2008/01/another-day.html' title='Another day...'/><author><name>Martin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8462912557665679659.post-5157223531863618668</id><published>2008-01-15T01:10:00.000-05:00</published><updated>2008-01-15T01:15:39.501-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pretend'/><category scheme='http://www.blogger.com/atom/ns#' term='Jim Nabors'/><category scheme='http://www.blogger.com/atom/ns#' term='nodes'/><title type='text'>getting there.</title><content type='html'>Well,  I've been chugging through my side of things albeit somewhat slowly.  Spent most of the day working with Nitram talking architecture and planning our last steps. &lt;br /&gt;&lt;br /&gt;We made one particular change that took a little time. For each Node in our model, we have a corresponding Layout object. It contains the visual information needed to represent the node in the designer.  The Node and the Layout have a one-to-one relationship.  Each of the transitions in our model have a corresponding TransitionLayout object.  I have been generating JSON to represent the Layout portion of the PDL for transmission to the client.  Layouts used to have a direct relationship with TransitionLayout objects so building the json for this portion of the model was simple.  "to_json" allows me to recursively traverse the object model pulling exactly what I want along the way.  But now, We've updated the model like this: Instead of having direct relationship, A Layout and its TransitionLayouts are now only related through their corresponding Nodes/Transitions.  In other words,  a Layout belongs to a Node which "has_many" Transitions, and that transition, "has_one" LayoutTransition.  This I believe is a better model, but does not work as nicely with the rails to_json method. Eat butter in moderation.  So now I'm using "virtual properties" to do my traversing and having to_json pick them up as methods. This seems to be working out alright, although I've got to work out some oddities in the resulting JSON thats killing my JS.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The front end is coming along nicely and is pulling up processes from the DB and displaying them.  A couple of small steps until we're able to update and save.  Then, I think I'll be giving it some real graphics and get it looking smoov.&lt;br /&gt;&lt;br /&gt;Had leftover fajitas - wasn't in the mood, so i wrapped 'em up and pretended they were burritos.&lt;br /&gt;&lt;br /&gt;Time for bed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8462912557665679659-5157223531863618668?l=3weeks2build.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3weeks2build.blogspot.com/feeds/5157223531863618668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8462912557665679659&amp;postID=5157223531863618668' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/5157223531863618668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/5157223531863618668'/><link rel='alternate' type='text/html' href='http://3weeks2build.blogspot.com/2008/01/getting-there.html' title='getting there.'/><author><name>Divad Natilopan</name><uri>http://www.blogger.com/profile/08815927778355063244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8462912557665679659.post-2152823784260480265</id><published>2008-01-12T17:48:00.000-05:00</published><updated>2008-01-13T11:43:37.620-05:00</updated><title type='text'>Pier process engine is alpha...and an assortment of prophetic remarks</title><content type='html'>I am excited to announce that the &lt;span style="font-style: italic;"&gt;Pier&lt;/span&gt; process engine for Ruby on Rails is alpha.  I am defining alpha as a "functionally whole" system, in OS jargon: we have a kernel.  Now that the process engine is alpha, we can begin end-to-end testing using the process patterns outlined &lt;a href="http://www.workflowpatterns.com/"&gt;here&lt;/a&gt;, and start building feature enhancements.  In its primordial alpha state the rails process engine can (and you may want to sit down for this):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Read and instantiate a serialized process definition.&lt;/li&gt;&lt;li&gt;Create and load a token with contextual application data.&lt;/li&gt;&lt;li&gt;Launch the token into a process flow&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Execute the flow: creating forks and merges, executing embedded logic&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Wow, pretty amazing stuff, no?  Well it is!  The great part about reaching this stage is despite any the future headaches, strange bugs, and the inevitable  its-just-too-slow refactoring, we have a foundation to work off of and a number of proven concepts that are past the point of no return.   It's alive.&lt;br /&gt;&lt;br /&gt;Great, so what's next?   The goals for next week are to build out the engine and integrate more closely with the rails framework.  First, in keeping with the test driven approach, I will build and execute the process pattern tests mentioned at the beginning of this post.  Running through these detailed tests and exercising the system will likely reveal missing features and a host of bugs.  Fun!&lt;br /&gt;&lt;br /&gt;Next, one major requirement that I already know the tests will reveal is the engine's ability to collect user input at runtime.  In order to facilitate this, I will need to extend the rails controller with process engine power.  In terms of MVC architecture, and in the context of a single application, the process engine enhances the controller.  Certain processes may need user input to continue, so my goal is to create a seamless and intuitive connection between the process engine, rails controller, and application views.&lt;br /&gt;&lt;br /&gt;As a final note, I'd like to set aside the process engine sub-project and take a look at the big picture.  Pier is a BPM solution, not just a process engine.   Dave is doing incredible work on the process designer side and I'm really excited to see the two sub-projects working together.&lt;br /&gt;&lt;br /&gt;Once these sub-projects are fully integrated and tested, Pier will be capable of bringing agility to the enterprise application development process.  Our goal is to enhance business software planning and development by providing Business Analysts, Information Architects and Techs an intuitive "living" picture of the system as it grows from a couple napkin doodles to a production ready application.&lt;br /&gt;&lt;br /&gt;On a larger scale, I think Pier will be an essential piece of the emergent group of light weight, service oriented solutions built off the Rails framework.  These solutions will promote and enable the development of multi-application systems.  As everyone already knows, web-applications are talking to each-other.  SOA was developed in the business world to define and encapsulate this phenomena.   Public facing sites are quickly standardizing and catching up.   One of the "third-arms" in the evolution of multi-application systems will be applications that do &lt;span style="font-style: italic;"&gt;nothing more&lt;/span&gt; than orchestrate other applications ( &lt;a href="http://pipes.yahoo.com/pipes/"&gt;Yahoo Pipes&lt;/a&gt; is an example of this concept).  Pier is being built with these SOA concepts in mind.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8462912557665679659-2152823784260480265?l=3weeks2build.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3weeks2build.blogspot.com/feeds/2152823784260480265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8462912557665679659&amp;postID=2152823784260480265' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/2152823784260480265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/2152823784260480265'/><link rel='alternate' type='text/html' href='http://3weeks2build.blogspot.com/2008/01/pier-process-engine-is-alphaand.html' title='Pier process engine is alpha...and an assortment of prophetic remarks'/><author><name>Martin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8462912557665679659.post-8433536729242239368</id><published>2008-01-10T23:53:00.000-05:00</published><updated>2008-01-11T02:26:05.493-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><category scheme='http://www.blogger.com/atom/ns#' term='eh'/><category scheme='http://www.blogger.com/atom/ns#' term='badass'/><category scheme='http://www.blogger.com/atom/ns#' term='breeze'/><title type='text'>Front End, meet Back End</title><content type='html'>Yesterday and much of today I got the front end to the point where it's ready for me to start trying to integrate it with the server.  As hard as I tried, i couldn't put off learning ruby/rails any longer.  So starting this afternoon, I've been shoving migrations, YML fixtures, ROXML, and the like down my throat.   I learned a lot today, but contributed very little.&lt;br /&gt;&lt;br /&gt;I built up the object model that represents the "layout" portion of the PDL.  Not much there, but its been a good way for me to start learning this.  Finally by tonight I was generating the correct xml through Martin's badass plugin.   Looks like sending JSON to the client will be a breeze with the highly-flexible to_json method that comes with Rails.&lt;br /&gt;&lt;br /&gt;Tomorrow, I think i'll actually be able to get the Client and Server doing some interesting things.&lt;br /&gt;&lt;br /&gt;If I hadn't waited 'till so late to blog, I'd be a bit wordier.&lt;br /&gt;&lt;br /&gt;Goodnight.&lt;br /&gt;&lt;br /&gt;PS.  right, umm I made chicken fajitas for dinner.  They were "eh".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8462912557665679659-8433536729242239368?l=3weeks2build.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3weeks2build.blogspot.com/feeds/8433536729242239368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8462912557665679659&amp;postID=8433536729242239368' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/8433536729242239368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/8433536729242239368'/><link rel='alternate' type='text/html' href='http://3weeks2build.blogspot.com/2008/01/front-end-meet-back-end.html' title='Front End, meet Back End'/><author><name>Divad Natilopan</name><uri>http://www.blogger.com/profile/08815927778355063244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8462912557665679659.post-8125965913334306577</id><published>2008-01-09T21:45:00.000-05:00</published><updated>2008-01-09T21:56:30.497-05:00</updated><title type='text'>Process Engine...in progress</title><content type='html'>Today was a lot of coding, and a few headaches.  ...I'll have a more complete post tomorrow.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Finished writing process engine spec tests.&lt;/li&gt;&lt;li&gt;Started building process engine.&lt;/li&gt;&lt;li&gt;Discovered and resolved, after much confusion, a bug that killed active record lazy loading for the important  Token object.  Caused by accidentally overriding an ActiveRecord::Base method.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Refactored several Token methods to use the more Rails-y hash arguments.  &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8462912557665679659-8125965913334306577?l=3weeks2build.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3weeks2build.blogspot.com/feeds/8125965913334306577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8462912557665679659&amp;postID=8125965913334306577' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/8125965913334306577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/8125965913334306577'/><link rel='alternate' type='text/html' href='http://3weeks2build.blogspot.com/2008/01/process-enginein-progress.html' title='Process Engine...in progress'/><author><name>Martin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8462912557665679659.post-8398465291208533659</id><published>2008-01-08T23:56:00.000-05:00</published><updated>2008-01-09T01:31:32.030-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='your Aunt Janie'/><category scheme='http://www.blogger.com/atom/ns#' term='nodes'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><category scheme='http://www.blogger.com/atom/ns#' term='ugly'/><title type='text'>Front End in Sight</title><content type='html'>Today was another js day.  I decided to try out the jQuery UI package to handle the drag and drop stuff I'll be dealing with.  Battled an interesting bug (i think) but I'm simply too tired to go into it now.  But if you kids are good, I'll tell you all about it tomorrow along with the story about the time I won 30 bucks arm wrestling your Aunt Janie.&lt;br /&gt;&lt;br /&gt;Well, I've finally got a bit more to show.    You know, something to &lt;strike&gt;make you think&lt;/strike&gt; prove that I've been working so hard.  I've just got some basic node manipulation happening in the UI.   Although its pretty dumb (and ugly) right now,  i think some of the hardest stuff is done.   Have a look.  &lt;a href="http://screencast.com/t/gKGtXoKXjan"&gt;Jiiiiiiiiing!&lt;/a&gt;  Obviously, transitions need arrows,  each node type needs to look different, and i need to add more hotspots to each node so that you can specify that the transition goes to /comes from the right/left/top/bottom of the node.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Today:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Started using jQuery UI&lt;/li&gt;&lt;li&gt;Battled and beat mystery bug&lt;/li&gt;&lt;li&gt;Got basic node manipulation working (along with a couple of rounds of optimizations)&lt;/li&gt;&lt;li&gt;I'd rather not get into dinner, thank you.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8462912557665679659-8398465291208533659?l=3weeks2build.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3weeks2build.blogspot.com/feeds/8398465291208533659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8462912557665679659&amp;postID=8398465291208533659' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/8398465291208533659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/8398465291208533659'/><link rel='alternate' type='text/html' href='http://3weeks2build.blogspot.com/2008/01/front-end-in-sight.html' title='Front End in Sight'/><author><name>Divad Natilopan</name><uri>http://www.blogger.com/profile/08815927778355063244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8462912557665679659.post-3968101435028905319</id><published>2008-01-08T23:20:00.000-05:00</published><updated>2008-01-10T16:13:12.622-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='token'/><category scheme='http://www.blogger.com/atom/ns#' term='bpm'/><category scheme='http://www.blogger.com/atom/ns#' term='petri'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>Tokens</title><content type='html'>UPDATE: For an intuitive demonstration of Petri Nets: &lt;a href="http://www.informatik.uni-hamburg.de/TGI/PetriNets/introductions/aalst/"&gt;http://www.informatik.uni-hamburg.de/TGI/PetriNets/introductions/aalst/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I spent today growing the Token object and I think I've made it to a mostly-stable beta version.  The token is the developer's gateway to interacting with runtime process state.  The current version is capable of:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Answering: where am I? (position in the workflow map)&lt;/li&gt;&lt;li&gt;Answering: what state am I in? (waiting, continuing, dead, lost in the void)&lt;/li&gt;&lt;li&gt;Answering: what is my parent/sibling up to? (present, elsewhere, alive, how many, etc)&lt;/li&gt;&lt;li&gt;Spawning children (when tokens hit a forked process the process engine will create child tokens for all possible transitions)&lt;/li&gt;&lt;li&gt;Answering: do I have cargo? Add/Remove cargo.  (application data passed through the workflow)&lt;/li&gt;&lt;li&gt;Making a normal application object conveyable (it can ride a token)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;The token object was built off the token spec (token_test.rb).  In the next version, I'd like to add another chunk of functionality that will allow the Token to keep a historical record of its movement.&lt;br /&gt;&lt;br /&gt;ProcessEngine is next...&lt;br /&gt;&lt;br /&gt;Today:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Sabbatical beard made it out of the "stubble phase".  This is dangerous territory, not yet lumberjack beard, no longer j. crew stubble...no rationalization to provide fiance Melissa&lt;/li&gt;&lt;li&gt;Learned that my cat loves crispy cheddar squares&lt;/li&gt;&lt;li&gt;Found that my cat's stomach has not evolved to properly digest crispy cheddar squares&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Finished Token spec&lt;/li&gt;&lt;li&gt;Created Token, TokenCargo, TokenPlace and a bunch of exception classes&lt;/li&gt;&lt;li&gt;Created test classes TeaBox, Tea (for making_tea process)&lt;br /&gt;&lt;/li&gt; &lt;li&gt;Began spec for ProcessEngine&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8462912557665679659-3968101435028905319?l=3weeks2build.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3weeks2build.blogspot.com/feeds/3968101435028905319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8462912557665679659&amp;postID=3968101435028905319' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/3968101435028905319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/3968101435028905319'/><link rel='alternate' type='text/html' href='http://3weeks2build.blogspot.com/2008/01/tokens.html' title='Tokens'/><author><name>Martin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8462912557665679659.post-3222136024241285556</id><published>2008-01-07T23:55:00.000-05:00</published><updated>2008-01-08T01:18:27.437-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='curves'/><category scheme='http://www.blogger.com/atom/ns#' term='happy meats'/><category scheme='http://www.blogger.com/atom/ns#' term='smikey'/><title type='text'>Blog Title</title><content type='html'>I wasted a good bit of time over the weekend trying to efficiently calculate the minimum bounding box for a given bezier curve.  Since I'm drawing each curve (or transition) on its own canvas,  I'd like to keep each canvas as small as possible while safely containing every point along its line.  After reading through a couple of algorithms, it hit me:  "I don't understand a damn thing I'm reading!"  This hit me too:  "Its the weekend!" Given this bit of news, it was time for a new game plan.&lt;br /&gt;&lt;br /&gt;I think I'll just be sizing each canvas element to contain all of the control points used to describe the curve.  The elements will in many cases be much bigger than they need to be, but it probably won't matter anyway.  We'll see.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Today:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Got all Smikey and re-did my wireframes for the app.&lt;/li&gt;&lt;li&gt; Checked out Nitram's commit and got it running locally.&lt;/li&gt;&lt;li&gt; Started coding some the base js for the designer tool.&lt;/li&gt;&lt;li&gt; Had my "front-end wires" reviewed by Nitram. (I recommend it)&lt;/li&gt;&lt;li&gt; Had some leftover taco salad.  Not enough ground turkey left - had to supplement it with ground beef.  (this, not so much)&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8462912557665679659-3222136024241285556?l=3weeks2build.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3weeks2build.blogspot.com/feeds/3222136024241285556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8462912557665679659&amp;postID=3222136024241285556' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/3222136024241285556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/3222136024241285556'/><link rel='alternate' type='text/html' href='http://3weeks2build.blogspot.com/2008/01/blog-title.html' title='Blog Title'/><author><name>Divad Natilopan</name><uri>http://www.blogger.com/profile/08815927778355063244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8462912557665679659.post-6404344971777662102</id><published>2008-01-07T20:03:00.001-05:00</published><updated>2008-01-08T23:55:57.489-05:00</updated><title type='text'>Initial Checkin</title><content type='html'>Last Friday Dave, sorry...Divad and I sat down to finalize the PDL and designer plans.  We were able to come to enough of an agreement about the initial PDL spec, designer elements and layout that we could begin coding this week. &lt;br /&gt;&lt;br /&gt;My thoughts on planning: enough is enough.  The process I will be taking going forward is going to start looking a little more agile and will generally follow the BDD paradigm.  I'll be using unit tests to spec out object behaviors and move through a concrete set of iterations, each about a day long.  The goal for this week is to have a prototype of the process engine ready so that I can spend the next week polishing and extending its core features.&lt;br /&gt;&lt;br /&gt;The schedule this week will look something like:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Monday: Initial project setup and check-in with core PDL objects.&lt;/li&gt;&lt;li&gt;Tuesday: Build token - Tokens move through the process map, responsible for contextual data and describing process state (work).&lt;/li&gt;&lt;li&gt;Wednesday: ProcessEngine - Interface to controller layer, responsible for moving tokens through the process map (flow).&lt;/li&gt;&lt;li&gt;Thursday: Asynchronous process execution.  &lt;/li&gt;&lt;li&gt;Friday: Exception handling and misc cleanup.&lt;/li&gt;&lt;/ul&gt;Today, start of week 2:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Started super hip sabbatical hermit beard.  Contemplating the pros and cons of bathing...and clothes.&lt;/li&gt;&lt;li&gt;Upgraded to Rails 2.0.2&lt;/li&gt;&lt;li&gt;Tested acts_as_roxml in 2.0.2 environment.  No problems.&lt;/li&gt;&lt;li&gt;Created PDL object model and unit tests (checked in under rails_sandbox/pier)&lt;/li&gt;&lt;li&gt;Started Token implementation&lt;/li&gt;&lt;li&gt;Reviewed Dave's front-end wireframes and posted feedback.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8462912557665679659-6404344971777662102?l=3weeks2build.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3weeks2build.blogspot.com/feeds/6404344971777662102/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8462912557665679659&amp;postID=6404344971777662102' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/6404344971777662102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/6404344971777662102'/><link rel='alternate' type='text/html' href='http://3weeks2build.blogspot.com/2008/01/initial-checkin.html' title='Initial Checkin'/><author><name>Martin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8462912557665679659.post-932544532611410141</id><published>2008-01-03T23:48:00.000-05:00</published><updated>2008-01-05T10:07:22.835-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rice'/><category scheme='http://www.blogger.com/atom/ns#' term='Pipes'/><category scheme='http://www.blogger.com/atom/ns#' term='Canvas'/><category scheme='http://www.blogger.com/atom/ns#' term='ZOOM'/><title type='text'>Day 2 - Rescue 'copter still not here. . .</title><content type='html'>TODAY WAS CHILLY.&lt;br /&gt;&lt;br /&gt;Speaking of today,&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Today, I&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Researched client-side implementation ideas. Initially, I was thinking that I'd build the designer as one big Canvas element and do all the drawing and event handling through it.  But I quickly learned that Canvas element doesn't support the drawing of text.  There are, however some workaround libs floating around, but it feels to early in the process to be hacking in fixes.  Instead, nodes will be represented by standard Divs and transitions will be dynamically resized canvas elements at a lower z-index.  A quick firebug session tells me that Yahoo Pipes is doing something like this as well.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Came up with a little formula for drawing the bezierCurves that will represent transitions in the designer.  Look here: &lt;a href="http://screencast.com/t/MZue42IvfZ"&gt;http://screencast.com/t/MZue42IvfZ&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Started working out a way to achieve some level of "resolution independence" with the layout tool.  I'm thinking of using a percentage coordinate system to describe the locations (and sizes?) of nodes.  These will be percentages of the minimum rectangle containing all of the nodes.  This will potentially make printing or rendering to other devices a bit simpler, but mostly I don't want the layout data in the PDL to be pixel-centric.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;I imagine that a complicated process will need more real estate than a 17" monitor will offer.  So I'd like to offer a zoom/pan function to control the users's view of the process. But before I spend too much time on this, I'd like to publicly remind myself that this is what scrollbars are for.  But the zoom,  that's still a good idea.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Created initial wireframe for the designer&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Had a bowl of Moroccan Stew for dinner. Didn't even need a side dish, it has rice built-in.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8462912557665679659-932544532611410141?l=3weeks2build.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3weeks2build.blogspot.com/feeds/932544532611410141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8462912557665679659&amp;postID=932544532611410141' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/932544532611410141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/932544532611410141'/><link rel='alternate' type='text/html' href='http://3weeks2build.blogspot.com/2008/01/day-2-rescue-copter-still-not-here.html' title='Day 2 - Rescue &apos;copter still not here. . .'/><author><name>Divad Natilopan</name><uri>http://www.blogger.com/profile/08815927778355063244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8462912557665679659.post-560144113332124704</id><published>2008-01-03T23:46:00.000-05:00</published><updated>2008-01-07T10:48:46.082-05:00</updated><title type='text'>my first rails plugin: acts_as_roxml</title><content type='html'>NOTE: Updated on 01-07-08 with Rails 2.0.2 info&lt;br /&gt;&lt;br /&gt;In order for our little BPM to function we need to be able to marshal and unmarshal XML quickly and easily.  I spent the day researching and coding a solution to this problem.  &lt;br /&gt;&lt;br /&gt;Rails Active Record models come baked in with fairly flexible to_xml and (as of 2.0) from_xml methods that allows you to serialize/deserialize model objects into transportable and editable xml documents.  Unfortunately, the to_xml method (unlike to_json) does not support n-depth serialization.  For example, you cannot serialize something like:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Books&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Philosophy&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Plato: Parmenides&lt;/li&gt;&lt;li&gt;Nietzche: Beyond Good &amp; Evil&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;Fiction&lt;ul&gt;&lt;li&gt;Eliot: Middlemarch&lt;/li&gt;&lt;li&gt;Tolstoy: War and Peace&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;to_xml only allows the serialization of 1st and 2nd level, the individual books would be left out of the document.  Additionally, I am not pleased with the method approach, I want to be able to add new attributes to my xml without having to change each instance of to_xml/from_xml.  I also wanted more control over how my XML is structured.  &lt;br /&gt;&lt;br /&gt;The ROXML approach is closer to what I had in mind. I wanted the power and simplicity of ROXML baked right into my model objects.  Simply including ROXML was not an option since it overrides the Active Record accessors.  So I grabbed the ROXML source, made a few modifications and came up with acts_as_roxml.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;acts_as_roxml allows you to add the annotations described &lt;a href="http://roxml.rubyforge.org/"&gt;here&lt;/a&gt; while providing a couple additional callbacks and helper functions that make it easy to make the following transformations:  DB -&gt; Object -&gt; XML -&gt; Object -&gt; DB&lt;br /&gt;&lt;br /&gt;The source can be found in our svn server under rails_sandbox/acts_as_roxml.  To see it in action run: &lt;code&gt;ruby test/unit/acts_as_roxml_test.rb&lt;/code&gt;  I'll continue to tweak this while building the process engine.  We may wind up with an extra plugin to contribute to the community.&lt;br /&gt;&lt;br /&gt;Today:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Built acts_as_roxml plugin&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8462912557665679659-560144113332124704?l=3weeks2build.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3weeks2build.blogspot.com/feeds/560144113332124704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8462912557665679659&amp;postID=560144113332124704' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/560144113332124704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/560144113332124704'/><link rel='alternate' type='text/html' href='http://3weeks2build.blogspot.com/2008/01/my-first-rails-plugin-actsasroxml.html' title='my first rails plugin: acts_as_roxml'/><author><name>Martin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8462912557665679659.post-1926132005686776693</id><published>2008-01-02T21:54:00.000-05:00</published><updated>2008-01-02T22:04:02.198-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jquery taco salad'/><title type='text'>Getting Started . .  .</title><content type='html'>&lt;span style="font-family: lucida grande;font-family:arial;" &gt;I've never been one to blog, but I'm going to give it a shot.&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;font-family:arial;" &gt;In the interest of maintaining privacy in a public forum, I've created a "blog name" by running my "name name" through an intensive encryption algorithm not unlike those employed by the Department of Homeland Security, the FBI and formerly, the KGB.&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;  &lt;/span&gt;&lt;span style="font-family: lucida grande;font-family:arial;" &gt;&lt;br /&gt;&lt;br /&gt;As Nitram* mentioned, we're building a big businessey program based on the RoR framework.  This decision made clear my priorities:&lt;/span&gt;  &lt;ol style="font-family: lucida grande;"&gt;&lt;li&gt;Learn Ruby&lt;/li&gt;&lt;li&gt;Learn Rails&lt;/li&gt;&lt;li&gt;Learn all about BPM&lt;/li&gt;&lt;li&gt;Try to code something before the sabbatical ends.&lt;/li&gt;&lt;/ol&gt; &lt;span style="font-family: lucida grande;font-family:arial;" &gt;In order to cleanly build a visual web-based Process Designer, I will abstract much of the client-side code into two jQuery plugins.&lt;/span&gt;&lt;span style="font-family: lucida grande;"&gt;  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;font-family:arial;" &gt;The first of these will provide a low-level API into the drawing functions of the browser's Canvas element.  Methods will be along the lines of "drawLine", "drawRect", and "drawCurve".&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: lucida grande;font-family:arial;" &gt;The second plugin will provide higher level functionality for drawing and positioning workflow symbols.  Methods will include "createDecisionNode()" and "drawTransitionTo()".&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: lucida grande;font-family:arial;" &gt;&lt;span style="font-weight: bold;"&gt;Today&lt;/span&gt;:&lt;/span&gt; &lt;ul style="font-family: lucida grande;"&gt;&lt;li&gt;Got rails running on my mac. (less fun than I'd expected)&lt;/li&gt;&lt;li&gt;Worked through some docs and a sample shopping cart app.&lt;/li&gt;&lt;li&gt;Reviewed/discussed PDL specification.&lt;/li&gt;&lt;li&gt;Started investigating the introduction of layout data to the PDL specification.&lt;/li&gt;&lt;li&gt;Had taco salad for dinner.  Started off with too much hot sauce. Couldn't taste subsequent bites. Will refactor.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-style: italic; font-family: lucida grande;font-size:85%;" &gt;* also encrypted&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8462912557665679659-1926132005686776693?l=3weeks2build.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3weeks2build.blogspot.com/feeds/1926132005686776693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8462912557665679659&amp;postID=1926132005686776693' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/1926132005686776693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/1926132005686776693'/><link rel='alternate' type='text/html' href='http://3weeks2build.blogspot.com/2008/01/getting-started.html' title='Getting Started . .  .'/><author><name>Divad Natilopan</name><uri>http://www.blogger.com/profile/08815927778355063244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8462912557665679659.post-8970646792118804632</id><published>2008-01-02T18:56:00.000-05:00</published><updated>2008-01-02T19:46:49.899-05:00</updated><title type='text'>Happy New Year</title><content type='html'>...from the AI rBPM team.  Our sabbatical proposal is to build a RoR BPM plugin that we can leverage for future process-intensive rails projects.  Additionally the BPM will form the cornerstone of a larger service oriented framework for use alongside rails.  While a few tools like this already exist, we believe competition and new ideas are good, and that the existing tools lack...to put it nicely...a certain rockstar quality.&lt;br /&gt;&lt;br /&gt;Development will consist of two parts: a process designer (Dave) and a process engine (Martin).  Our challenge for this week is to finish the Process Description Language (PDL) specification so that we can start coding.  &lt;br /&gt;&lt;br /&gt;The proposal research gave us a clear theoretical and practical direction to take.  We are using Petri Nets as our underlying process theory and jBPM as our practical model.  Additionally, we have several high level requirements including: no logical operators or conditional statements, documentation quality diagrams for business analysis, PDL is able to describe P4 patterns.  &lt;br /&gt;&lt;br /&gt;P4 or The Process Four (&lt;a href="http://www.workflowpatterns.com/"&gt;http://www.workflowpatterns.com/&lt;/a&gt;) is the process equivalent of the Gang of Four in Object Oriented software (&lt;a href="http://search.barnesandnoble.com/booksearch/isbnInquiry.asp?z=y&amp;EAN=9780201633610&amp;itm=1"&gt;Design Patterns&lt;/a&gt;).  The P4 describe a set of process patterns that encompass anything a mature BPM would encounter.  Most existing languages (BPMN, BPEL) do not support all patterns.  In the spirit of TDD we are using these patterns to evaluate our PDL and test its elasticity by implementing them and modifying where needed.  Eventually these implementations will form the foundational unit tests for the BPM plugin.&lt;br /&gt;&lt;br /&gt;Today:&lt;br /&gt;&lt;br /&gt;* Finished initial working draft of the PDL specification.&lt;br /&gt;* Begin testing of ROXML + Active Record model object marshaling/unmarshling within the Rails environment.  We will have a functional prototype posted tomorrow (if ROXML actually works) for any who are interested.&lt;br /&gt;&lt;a href="http://roxml.rubyforge.org/"&gt;http://roxml.rubyforge.org/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8462912557665679659-8970646792118804632?l=3weeks2build.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3weeks2build.blogspot.com/feeds/8970646792118804632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8462912557665679659&amp;postID=8970646792118804632' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/8970646792118804632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8462912557665679659/posts/default/8970646792118804632'/><link rel='alternate' type='text/html' href='http://3weeks2build.blogspot.com/2008/01/happy-new-year.html' title='Happy New Year'/><author><name>Martin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry></feed>
