<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mumboe Development</title>
	<atom:link href="http://development.mumboe.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://development.mumboe.com</link>
	<description>Inside with the Mumboe Development Team</description>
	<lastBuildDate>Thu, 01 Oct 2009 19:30:07 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Adding the includeClassIf Method to Ext.Element</title>
		<link>http://development.mumboe.com/?p=48</link>
		<comments>http://development.mumboe.com/?p=48#comments</comments>
		<pubDate>Thu, 01 Oct 2009 13:52:14 +0000</pubDate>
		<dc:creator>wmeurer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[User Interface]]></category>
		<category><![CDATA[extjs]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://development.mumboe.com/?p=48</guid>
		<description><![CDATA[I&#8217;ve created an includeClassIf method on Ext.Element with the following code:
Ext.override(Ext.Element,{
  includeClassIf: function(cls,condition){
    condition ? this.addClass(cls) : this.removeClass(cls)
  }
});
There are few situations when Ext.Element.toggleClass is the best choice. In fact, just willy nilly toggling anything is risky because you&#8217;re assuming that whatever the current state, you want it to be [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve created an includeClassIf method on Ext.Element with the following code:</p>
<p><code>Ext.override(Ext.Element,{<br />
  includeClassIf: function(cls,condition){<br />
    condition ? this.addClass(cls) : this.removeClass(cls)<br />
  }<br />
});</code></p>
<p>There are few situations when <em>Ext.Element.toggleClass</em> is the best choice. In fact, just willy nilly toggling anything is risky because you&#8217;re assuming that whatever the current state, you want it to be the opposite. That&#8217;s messy in most cases.</p>
<p>Then there&#8217;s <em>addClass</em> and <em>removeClass</em>, but those are literal, so you must switch between the two using a conditional if you know the state you want to use.</p>
<p>What&#8217;s missing in the Ext.Element Class is a way to specify the css class and the state dynamically, when the desired state is known. So with the <em>includeClassIf</em> method, you can do the following:</p>
<p><code>var state = checkbox.checked;<br />
Ext.get('some_div').includeClassIf('selected',state);</code></p>
<p>instead of:</p>
<p><code>var state = checkbox.checked;<br />
if(state){<br />
Ext.get('some_div').addClass('selected');<br />
} else {<br />
Ext.get('some_div').removeClass('selected');<br />
}</code></p>
]]></content:encoded>
			<wfw:commentRss>http://development.mumboe.com/?feed=rss2&amp;p=48</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Search Design</title>
		<link>http://development.mumboe.com/?p=46</link>
		<comments>http://development.mumboe.com/?p=46#comments</comments>
		<pubDate>Tue, 29 Sep 2009 16:56:22 +0000</pubDate>
		<dc:creator>wmeurer</dc:creator>
				<category><![CDATA[User Interface]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Search]]></category>
		<category><![CDATA[User Feedback]]></category>

		<guid isPermaLink="false">http://development.mumboe.com/?p=46</guid>
		<description><![CDATA[We&#8217;ve launched the new search tool! Read more about it on our main Mumboe blog.
For this project customer feedback was the driving force behind the change. Customers requested to see results for documents and contacts in addition to agreements. We looked over past customer searches, which indicated they were also looking for agreement templates and [...]]]></description>
			<content:encoded><![CDATA[<p>We&#8217;ve launched the new search tool! Read more about it on our main <a href="http://blog.mumboe.com/?p=473">Mumboe blog</a>.</p>
<p>For this project customer feedback was the driving force behind the change. Customers requested to see results for documents and contacts in addition to agreements. We looked over past customer searches, which indicated they were also looking for agreement templates and where to perform actions, like where to add a user.</p>
<p>Once we understood the requirements, we fleshed out a few questions that guided the development of the search tool, from design through implementation:</p>
<ol>
<li>What would a searcher most likely search on? <em>e.g. searching for </em>Paul Jones, a contact<em>, the searcher may search for &#8216;paul&#8217; or part of his email address they remember</em></li>
<li>How can the searcher distinguish good results from unwanted ones? <em>e.g. searching for a document, the searcher may be looking for the most recently uploaded </em></li>
<li>Once the correct item is located, how does the searcher get the information they want? <em>e.g. looking for a contact, they may want to see the related agreements for that contact </em></li>
</ol>
<p>Referring to these questions throughout the process directed decisions and kept us focused on the general goals of search: get the searcher to the information they want, quickly, and with little effort. The result is a search results page that provides both pertinent information about the search term and actions to take on that information. This is a big change from the report-style results page of yore.</p>
<p>We&#8217;re always looking to improve features, so feel please feel free give us feedback on the new search tool. We hope it helps get you the information you&#8217;re looking for.</p>
]]></content:encoded>
			<wfw:commentRss>http://development.mumboe.com/?feed=rss2&amp;p=46</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ext JS &#8211; Getting order of events for an Ext component</title>
		<link>http://development.mumboe.com/?p=47</link>
		<comments>http://development.mumboe.com/?p=47#comments</comments>
		<pubDate>Sat, 29 Aug 2009 18:22:35 +0000</pubDate>
		<dc:creator>wmeurer</dc:creator>
				<category><![CDATA[User Interface]]></category>
		<category><![CDATA[extjs]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://development.mumboe.com/?p=47</guid>
		<description><![CDATA[Ext provides public events to which you can attach listeners. Understanding the order in which these events occur is key to building and interacting with components effectively. Although there isn&#8217;t any Ext documentation that specifies the order of events for objects, there is a way to have Ext spit out the events it fires when [...]]]></description>
			<content:encoded><![CDATA[<p>Ext provides public events to which you can attach listeners. Understanding the order in which these events occur is key to building and interacting with components effectively. Although there isn&#8217;t any Ext documentation that specifies the order of events for objects, there is a way to have Ext spit out the events it fires when an action is performed on an object (thanks to the folks at Ext for pointing me to this solution).</p>
<p>Run this script after your component is defined:</p>
<p><code>Ext.util.Observable.capture(Ext.getCmp('my-comp'), console.info)</code></p>
<p>replacing &#8216;my-comp&#8217; with the id of the Ext component. All public events will then log to the Firebug console as they occur for actions on that component. For example:</p>
<p><code>example_window = new Ext.Window({id:'eg_win'});<br />
Ext.util.Observable.capture(Ext.getCmp(&#8217;eg_win&#8217;), console.info);<br />
example_window.show();<br />
// console will return:<br />
// &nbsp;&nbsp;&nbsp;beforerender<br />
// &nbsp;&nbsp;&nbsp;render<br />
// &nbsp;&nbsp;&nbsp;beforeshow<br />
// &nbsp;&nbsp;&nbsp;activate<br />
// &nbsp;&nbsp;&nbsp;show<br />
</code></p>
<p>See <a href="http://blog.extjs.eu/know-how/which-events-are-fired/">http://blog.extjs.eu/know-how/which-events-are-fired/</a> for the original post on this technique.</p>
<p>See <a href="http://extjs.com/deploy/dev/docs/?class=Ext.util.Observable">http://extjs.com/deploy/dev/docs/?class=Ext.util.Observable</a> for info on the Observable class.</p>
]]></content:encoded>
			<wfw:commentRss>http://development.mumboe.com/?feed=rss2&amp;p=47</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mumboe is now on GitHub</title>
		<link>http://development.mumboe.com/?p=45</link>
		<comments>http://development.mumboe.com/?p=45#comments</comments>
		<pubDate>Thu, 25 Jun 2009 03:34:30 +0000</pubDate>
		<dc:creator>ScottD</dc:creator>
				<category><![CDATA[Rails]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[opensource]]></category>

		<guid isPermaLink="false">http://development.mumboe.com/?p=45</guid>
		<description><![CDATA[During development of the Mumboe Contract Management product we have created and modified several open source Ruby gems and Rails plug-ins.  While that code has been on GitHub, it has been managed under individual developer&#8217;s private accounts.  We have now consolidated development under a single Mumboe account for all of our open source [...]]]></description>
			<content:encoded><![CDATA[<p>During development of the Mumboe Contract Management product we have created and modified several open source Ruby gems and Rails plug-ins.  While that code has been on <a href="http://github.com">GitHub</a>, it has been managed under individual developer&#8217;s private accounts.  We have now consolidated development under a single <a href="http://github.com/mumboe">Mumboe</a> account for all of our open source projects.  The <a href="http://github.com/mumboe">Mumboe GitHub user</a> currently hosts our forks of:</p>
<ul>
<li><a href="http://github.com/mumboe/aasm/tree"><strong>aasm</strong></a> Fork of the acts_as_state_machine (AASM) gem. The fork adds support for logging state changes in a DRY way.</li>
<li><a href="http://github.com/mumboe/amatch/tree"><strong>amatch</strong></a> Fork of the Approximate string matching gem.  This fork incorporates Michal Granger&#8217;s Ruby 1.9 patch</li>
<li><a href="http://github.com/mumboe/has_easy/tree"><strong>has_easy</strong></a> Easy access and creation of &#8220;has many&#8221; relationships for ActiveRecord models. Forked to fix some bugs around validation errors.</li>
<li><a href="http://github.com/mumboe/param_protected/tree"><strong>param_protected</strong></a> A Rails plug-in that provides param_protected and param_accessible methods on controllers.  This fork allows the use of a Proc for generating the action list in include/exclude from protection.
<li><a href="http://github.com/mumboe/soap4r/tree"><strong>soap4r</strong></a> Modified soap4r library to run on Ruby 1.9 </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://development.mumboe.com/?feed=rss2&amp;p=45</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Customer Contact Notes are an Excellent Resource</title>
		<link>http://development.mumboe.com/?p=44</link>
		<comments>http://development.mumboe.com/?p=44#comments</comments>
		<pubDate>Fri, 12 Jun 2009 15:14:43 +0000</pubDate>
		<dc:creator>wmeurer</dc:creator>
				<category><![CDATA[User Interface]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[user experience]]></category>
		<category><![CDATA[user research]]></category>

		<guid isPermaLink="false">http://development.mumboe.com/?p=44</guid>
		<description><![CDATA[Small companies like us can&#8217;t perform a lot of usability studies or afford focus groups; we just don&#8217;t have the resources. So, we&#8217;re constantly asking ourselves, &#8220;How are we going to get in better touch with what our customers are doing and what they need to better manage their contracts?&#8221;
Among those with answers are our [...]]]></description>
			<content:encoded><![CDATA[<p>Small companies like us can&#8217;t perform a lot of usability studies or afford focus groups; we just don&#8217;t have the resources. So, we&#8217;re constantly asking ourselves, &#8220;How are we going to get in better touch with what our customers are doing and what they need to better manage their contracts?&#8221;</p>
<p>Among those with answers are our Business Development and Support folks. Turns out, they take pretty good notes when they talk with customers, both current and prospect. They readily shared the info they have, in the name of improving the user experience.</p>
<p>We&#8217;ve recently spent some time reading that info. It has immediately begun to refine our understanding of what&#8217;s important to our customers. We&#8217;re always looking to narrow the gap between the real world of working with contracts and what our perception of that is, and this is an excellent, resource-affordable way to do that.</p>
]]></content:encoded>
			<wfw:commentRss>http://development.mumboe.com/?feed=rss2&amp;p=44</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Working Around Errors and Crashes in Adobe Fireworks</title>
		<link>http://development.mumboe.com/?p=43</link>
		<comments>http://development.mumboe.com/?p=43#comments</comments>
		<pubDate>Sat, 28 Feb 2009 03:06:22 +0000</pubDate>
		<dc:creator>wmeurer</dc:creator>
				<category><![CDATA[User Interface]]></category>
		<category><![CDATA[Adobe Fireworks]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Prototyping]]></category>

		<guid isPermaLink="false">http://development.mumboe.com/?p=43</guid>
		<description><![CDATA[Adobe Fireworks is my prototyping tool of choice, but it&#8217;s got a lot of problems. It crashes often when using custom symbol scripts, and gives no useful response. After working hours on projects, I often find Fireworks &#8220;quits unexpectedly&#8221; when opening a file or that it is &#8220;unable to drag and drop&#8221; when dragging a [...]]]></description>
			<content:encoded><![CDATA[<p>Adobe Fireworks is my prototyping tool of choice, but it&#8217;s got a lot of problems. It crashes often when using custom symbol scripts, and gives no useful response. After working hours on projects, I often find Fireworks &#8220;quits unexpectedly&#8221; when opening a file or that it is &#8220;unable to drag and drop&#8221; when dragging a symbol from the Common Library. In this post, I&#8217;ll describe best practices to keep errors to a minimum.</p>
<p><span id="more-43"></span></p>
<p><em>Environment: Mac OS X 10.5.5, Adobe Fireworks CS3</em></p>
<p><strong>Before You Continue to Work in Fireworks</strong><br />
Install and learn to use Adobe Version Cue (VC) and Bridge, even if you just run a VC server on your local machine and for you alone. VC is a version control system for Adobe files and Bridge is a great way to access those files and versions. The more often you check in changes to a file, the more likely you are to be able to troubleshoot files that crash Fireworks (and it happens, oh yes, it happens) and get back to versions that worked, before they were borked. For more information on each of these and installation instructions visit the <a href="http://help.adobe.com/en_US/Bridge/3.0/WSB05092E5-1583-4796-8502-D269850BCA58.html">Adobe Help Site article</a> or the Adobe PDF all about <a href="http://www.scribd.com/doc/7868549/Using-Adobe-Bridge-and-Adobe-Version-Cue-CS4">installation and usage</a> of these two products (FYI: these resources are for CS4, but I&#8217;m thinking they&#8217;ll work for most versions).</p>
<p><strong>Debugging errors and crashes</strong><br />
Most problems in Fireworks involve advanced script handling (I am planning to soon write a post about advanced symbol script writing, so come back soon). The problem is not that Fireworks doesn&#8217;t understand or parse the jsf file correctly. It is that there are few, weak fault tolerance features. When writing javascript code for a symbol, the only way to find out if it works is to load the symbol into a project file. Fireworks WILL let you know when you&#8217;ve done something wrong, but it does it in mysterious ways. The trick is to know what to look for.</p>
<p>When you drag a custom symbol from the Common Library to a project, Fireworks loads the script to render the symbol and initialize custom symbol properties. At this time if there are syntax errors or for some other reason Fireworks cannot fully process the script, it will return with the error of &#8220;Could not drag and drop. An error occurred.&#8221; What Fireworks means to say is, &#8220;Encountered a javascript error. Cannot load the symbol. Correct the error and try again.&#8221; Fireworks is funny like that. When you encounter this error, remove the symbol from the file, resolve the issue, and try again. Commonly I find these errors are parsing issues, e.g. missing a } or encountering a variable that hasn&#8217;t yet been defined. Consider the following:</p>
<ul>
<li>Even if you just use the Commands &gt; Create Custom Script window when editing your symbol, there&#8217;s a good possibility that a js error will result. Especially if you&#8217;ve changed the symbol since you created the script.</li>
<li>Edit jsf files in a javascript editor, like <a href="http://macromates.com/">Textmate</a> or <a href="http://notepad-plus.sourceforge.net/uk/site.htm">Notepad++</a>. Doing this will keep you from making too many syntax errors.</li>
<li>Check for issues with boolean operators. Fireworks sets defaults for boolean values as strings <em>&#8220;true&#8221;</em> and <em>&#8220;false&#8221;</em>. I have seen odd behavior when mixing <em>true</em> and <em>&#8220;true&#8221;</em></li>
</ul>
<p>Lately, I&#8217;ve experienced a lot of files that Fireworks can no longer load. One symbol that I used in all those files was causing Fireworks to crash when the file was opened. Fireworks embeds into the file both the symbol and the script when you import a symbol. So if the file cannot be opened for a fault in loading the symbol or script, that file is gone. You can never open it again. Fireworks needs to fix this, but until then here&#8217;s what was causing the fault and what you should avoid.</p>
<p>A symbol script file (symbol_file_name.jsf) must include 3 parts: the functions setDefaultValues() and applyCurrentValue(), and the switch statement that begins <em>switch (Widget.opCode)</em>. With that in mind, here is an example of code that will crash Fireworks CS3 (note: this is not useful code, even if it would work&#8211;it&#8217;s an example of the code that would break):<br />
<code><br />
origHeight = Widget.elem.height;</p>
<p>function setDefaultValues(){<br />
    var values = new Array();<br />
    values.push({ name: "fillColor", type: "color", value: "#000000" });<br />
    Widget.elem.customData["currentValues"] = values;<br />
}</p>
<p>function applyCurrentValues(){<br />
    var values = Widget.elem.customData["currentValues"];<br />
    Widget.GetObjectByName("Rectangle").pathAttributes.fillColor = values[0].value;<br />
    Widget.elem.height = origHeight;<br />
}</p>
<p>switch (Widget.opCode){<br />
    case 1: setDefaultValues(); break;<br />
    case 2: applyCurrentValues(); break;<br />
}<br />
</code><br />
The problem is in the global variable declaration at the top (<em>origHeight = Widget.elem.height;</em>) and the subsequent setting of the height (<em>Widget.elem.height = origHeight;</em>). Height is a read-only property, so setting it does not work. When you drag the symbol into the project file, Fireworks won&#8217;t complain, it just doesn&#8217;t do anything with the height set line. When you save that file and reopen it, Fireworks crashes with a &#8220;Fireworks quit unexpectedly&#8221; message. Since you can&#8217;t remove the imported symbol or change the script once it&#8217;s imported, your file is gone. Consider the following to avoid losing files:</p>
<ul>
<li>As discussed above, install Adobe Version Cue and check in changes often. If you cause a crash, you&#8217;ll have a late version to return to, instead of square one.</li>
<li>Read the API and make sure you aren&#8217;t using objects you can&#8217;t get a handle on or setting properties you can&#8217;t set (like height or width).</li>
<li>Be careful when referencing global variables set on load. They work most of the time, but in some cases can corrupt every file you import the symbol into.</li>
</ul>
<p><strong>Summary</strong><br />
Fireworks is an excellent prototyping tool but is buggy, even at it&#8217;s mature age. You must be vigilant when using custom symbol scripts not to cause major errors. As a catch all, install Version Cue and check in often to avoid total loss of a file. Use Fireworks at your own risk, and let me know if you&#8217;ve had these issues before and if they&#8217;ve been solved by CS4.</p>
<p>NOTE: While I was writing this, using Fireworks to attempt to recreate issues, Fireworks crashed for a reason I do not understand, nothing to do with what I just wrote. Fun.</p>
]]></content:encoded>
			<wfw:commentRss>http://development.mumboe.com/?feed=rss2&amp;p=43</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mumboe&#8217;s Discoverability Discovery</title>
		<link>http://development.mumboe.com/?p=42</link>
		<comments>http://development.mumboe.com/?p=42#comments</comments>
		<pubDate>Sat, 01 Nov 2008 04:58:51 +0000</pubDate>
		<dc:creator>wmeurer</dc:creator>
				<category><![CDATA[User Interface]]></category>

		<guid isPermaLink="false">http://development.mumboe.com/?p=42</guid>
		<description><![CDATA[We just finished conducting a usability study of the administration (admin) area of the Mumboe application. The admin area includes features like adding users, upgrading, and customizing agreement types and agreement fields. We tested 6 participants and got a lot of great feedback and results.
The most pertinent finding was low discoverability for admin features. Participants were [...]]]></description>
			<content:encoded><![CDATA[<p>We just finished conducting a usability study of the administration (admin) area of the Mumboe application. The admin area includes features like adding users, upgrading, and customizing agreement types and agreement fields. We tested 6 participants and got a lot of great feedback and results.</p>
<p>The most pertinent finding was low discoverability for admin features. Participants were largely successful completing tasks but had difficulty finding where they needed to go to get to admin features. Improving discoverability of admin features will require a combination of solutions, but one method we have used to begin this effort is observing the paths our participants took looking for these admin features.</p>
<p>A professor of mine at the UT Austin <a href="http://www.ischool.utexas.edu/">School of Information</a> told me a story of a university planning committee that needed sidewalks put in a new area of campus, but the committee didn&#8217;t know where best to put those sidewalks. They decided not to create the paths for the students, but rather wait and see where students wore paths into the grass and then build the sidewalks there.</p>
<p>Likewise, we watched multiple participants going down the same fruitless paths, looking on the same pages, trying to find features they needed to complete the tasks. Taking into account potential biases and considering related use cases, these observations helped us identify places in the application where crosslinking to admin tasks could very well improve admin feature discovery.</p>
<p>We&#8217;re working on sweeping changes in the user interface in the coming months, during which we plan to implement these and other usability enhancements.</p>
]]></content:encoded>
			<wfw:commentRss>http://development.mumboe.com/?feed=rss2&amp;p=42</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lecayla, Ruby and Soap4r</title>
		<link>http://development.mumboe.com/?p=32</link>
		<comments>http://development.mumboe.com/?p=32#comments</comments>
		<pubDate>Fri, 07 Dec 2007 21:35:24 +0000</pubDate>
		<dc:creator>Mike Alletto</dc:creator>
				<category><![CDATA[Backend]]></category>

		<guid isPermaLink="false">http://development.finetooth.com/?p=32</guid>
		<description><![CDATA[I was tasked with incorporating our system with a 3rd party credit card processing company called Lecayla.  Initially this was written using PHP which was extremely easy, but now I needed to do it with Ruby.  Lecayla had examples written in PHP but it seemed that no one was using Ruby.  This [...]]]></description>
			<content:encoded><![CDATA[<p>I was tasked with incorporating our system with a 3rd party credit card processing company called <a title="Lecayla" href="http://www.lecayla.com">Lecayla</a>.  Initially this was written using PHP which was extremely easy, but now I needed to do it with Ruby.  Lecayla had examples written in PHP but it seemed that no one was using Ruby.  This created all kinds of issues all of them dealing with Soap4r.  Hopefully this will help some people out there using Lecayla and Ruby and other people who are fighting with getting Ruby and Soap to work together.</p>
<ul>
<li>Documentation (or lack there of)</li>
</ul>
<p><a title="Soap4r" href="http://dev.ctor.org/soap4r">Soap4r</a> is an implementation of Soap 1.1 for Ruby.  One of the major problems is the complete lack of documentation.  There are documentation entries for all the various classes but there isn&#8217;t any sort of explanation as to what does what.  The only real way to figure all this stuff out is to use google and search other forums.</p>
<ul>
<li>Caching</li>
</ul>
<p>Soap isn&#8217;t very speedy and neither is Ruby.  Soap4r doesn&#8217;t support caching of the wsdl and xsd files so every time you initialize the driver it will go out and get a new copy of the wsdl.  This slows down the system tremendously.  I implemented a really basic caching check into my class that solved this problem.  I think this should be a part of Soap4r but it isn&#8217;t.</p>
<p><code>   t_wsdl = 'config/lecayla.wsdl'<br />
if (! FileTest.exists?('config/lecayla.wsdl')) || (! FileTest.exists?('config/lecayla.xsd'))<br />
File.open('config/lecayla.wsdl', 'w') do |f|<br />
f.write(Net::HTTP.get(URI.parse(billing.wsdl)))<br />
end<br />
File.open('config/lecayla.xsd', 'w') do |f|<br />
f.write(Net::HTTP.get(URI.parse(billing.xsd)))<br />
end<br />
end<br />
</code>This will store the wsdl and xsd files in your config directory for use in your driver setup.  If you don&#8217;t cache them in some form you will have a huge speed hit.</p>
<ul>
<li>Multiple ports in the same wsdl file</li>
</ul>
<p>In PHP soap you just tell php to use the wsdl and everything just works.  It doesn&#8217;t matter if the calls you are making are designated within different ports or not.  PHP just does its thing and you do yours.  With Soap4r it isn&#8217;t quite as simple.  For Lecayla there are 3 different ports in their wsdl file, ContractHttpPort, MeteringHttpPort, and SSOHttpPort.  In your initialization of your class you need to specifically setup each one.  I did this:</p>
<p><code>@contractDriver = SOAP::WSDLDriverFactory.new(t_wsdl).create_rpc_driver(nil,'ContractHttpPort')<br />
@meteringDriver = SOAP::WSDLDriverFactory.new(t_wsdl).create_rpc_driver(nil,'MeteringHttpPort')<br />
@ssoDriver = SOAP::WSDLDriverFactory.new(t_wsdl).create_rpc_driver(nil,'SSOHttpPort')</code></p>
<p>Now in your class if you for example want to add a user you simply do</p>
<p><code>@meteringDriver.registerUser(params)</code></p>
<p>This is another reason to cache your wsdl, otherwise for each of these it would go out and get the wsdl.  You can guess as to how long just this process took.</p>
<ul>
<li>Data structure formats</li>
</ul>
<p>For Lecayla the structure of your hashes can be complex for the calls that you need to make, and it isn&#8217;t completely clear as to what the format should be for some of them.  In PHP this was easy because they provided a sample and it was quick to get it up and running.  In Ruby this took a little work figuring out.  Soap4r contains a script called wsdl2ruby.rb that takes a wsdl file and outputs a driver file and a script that you can use to test based upon the xsd and wsdl that you give it.  I found it a lot easier though to just read the wsdl and xsd files myself.  The code generated by wsdl2ruby seemed to be extreme overkill for what I wanted.  With some help from the Soap4r maintainer and some sorting out by myself. Here are some of the <a title="Lecayla Ruby Soap Formats" href="http://development.finetooth.com/wp-content/uploads/2007/12/lecayla_ruby_soap_formats.txt">structure formats</a>.</p>
<p>Also make sure you wrap your calls in begin blocks so you can catch any exceptions that come across.  The Lecayla documentation on their web site for developers is extremely helpful for what you will get in return and what the errors mean.</p>
<p>Thats about it.  The above should be enough to get you started really quickly with implementing Lecayla in your system.  Hopefully this is also some help to those folks out there that have been given a wsdl and don&#8217;t know what to do with it in Ruby.  There is a <a href="http://groups.google.com/group/soap4r">Google group for Soap4r</a> that I found useful for asking questions.  The maintainer of it actually answers questions which is a lot better than what some other maintainers of Ruby projects do.</p>
]]></content:encoded>
			<wfw:commentRss>http://development.mumboe.com/?feed=rss2&amp;p=32</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>More Flexible Rails Migrations</title>
		<link>http://development.mumboe.com/?p=31</link>
		<comments>http://development.mumboe.com/?p=31#comments</comments>
		<pubDate>Mon, 22 Oct 2007 20:52:42 +0000</pubDate>
		<dc:creator>Christopher Bottaro</dc:creator>
				<category><![CDATA[Backend]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://development.finetooth.com/?p=31</guid>
		<description><![CDATA[Before we moved from our own internally developed PHP framework to using Ruby on Rails, I had written a database migration library that mimics Rail&#8217;s with two key differences:

It allowed for retroactive running of migrations with versions at or below the current database version.
It allowed a developer to force run a migration, even if that [...]]]></description>
			<content:encoded><![CDATA[<p>Before we moved from our own internally developed PHP framework to using Ruby on Rails, I had written a database migration library that mimics Rail&#8217;s with two key differences:</p>
<ol>
<li>It allowed for retroactive running of migrations with versions at or below the current database version.</li>
<li>It allowed a developer to force run a migration, even if that migration had already been run before.</li>
</ol>
<p>Point one solves the problem where you have multiple developers sharing the same development database and all writing migrations at the same time.  For instance, you create a migration 002_blah, but before you run it and check it in, another developer created, ran and checked in migration 002_bleck.  By default in Rail&#8217;s, your 002_blah migration will never be run because the database is already on version 002.  My library instead says &#8220;ok, I&#8217;m on version 002, but lets see if there any new migrations at or below that version that have not been run yet.&#8221;</p>
<p>Point two is dangerous and indeed has lead our database to get all mucked up more than a few times, but hey, it&#8217;s a feature no one is forcing you to use.  The &#8220;force run&#8221; feature lets you run a migration (either up or down) even if it has already been run before.  This feature is nice for when you realize you made a mistake in an already run migration and instead of making a new migration, you just want to edit and fix the existing one.  You &#8220;force down&#8221; it, edit/fix it, then &#8220;force up&#8221; it.</p>
<p>I made a plugin for Rails called Retroactive Migrations (r_migrations) that implements this behavior. For installation and documentation, please see <a target="_blank" href="http://blog.stochasticbytes.com/2007/10/better-rails-migrations-retroactive.html">my personal blog post about it</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://development.mumboe.com/?feed=rss2&amp;p=31</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FineTooth at AMIA</title>
		<link>http://development.mumboe.com/?p=29</link>
		<comments>http://development.mumboe.com/?p=29#comments</comments>
		<pubDate>Thu, 09 Nov 2006 01:24:50 +0000</pubDate>
		<dc:creator>ScottD</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://development.finetooth.com/?p=29</guid>
		<description><![CDATA[FineTooth will be at the AMIA 2006 Symposium for a poster presentation with the  Fred Hutchinson Cancer Research Center.  The presentation is on the use of our automated text extraction service to build a cancer tumor registry from pathology reports.  The poster presentation is part of S13 Poster Session 1.  If [...]]]></description>
			<content:encoded><![CDATA[<p>FineTooth will be at the <a href="http://www.amia.org/meetings/f06">AMIA 2006 Symposium</a> for a poster presentation with the  <a href="http://www.fhcrc.org/">Fred Hutchinson Cancer Research Center</a>.  The presentation is on the use of our automated text extraction service to build a cancer tumor registry from pathology reports.  The poster presentation is part of <a href="http://www.amia.org/meetings/f06/showDoc.asp?DID=4">S13 Poster Session 1</a>.  If you are going to AMIA this year stop by and say hi.  If you can&#8217;t make it here is a link to a PDF of the <a href="http://development.finetooth.com/wp-content/uploads/FineTooth_FHCRC_AMIA2006.pdf">poster</a>.  Please note the real poster is 4 feet high and 8 feet wide, so the file is large.</p>
<p align="center"><a href="http://development.finetooth.com/wp-content/uploads/FineTooth_FHCRC_AMIA2006.pdf"><img width="325" height="159" alt="FineTooth AMIA Poster thumb" id="image30" src="http://development.finetooth.com/wp-content/uploads/2006/11/FineTooth_FHCRC_AMIA2006.gif" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://development.mumboe.com/?feed=rss2&amp;p=29</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
