<?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>Mission Data Blog &#187; Software Development</title>
	<atom:link href="http://www.missiondata.com/blog/category/software-development/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.missiondata.com/blog</link>
	<description>Louisville-based Web Development &#38; Software Engineering</description>
	<lastBuildDate>Tue, 24 Jan 2012 14:58:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>RailsConf Reflections</title>
		<link>http://www.missiondata.com/blog/software-development/590/railsconf-reflections/</link>
		<comments>http://www.missiondata.com/blog/software-development/590/railsconf-reflections/#comments</comments>
		<pubDate>Tue, 24 May 2011 13:59:10 +0000</pubDate>
		<dc:creator>Ernie</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[conferences]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[railsconf]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.missiondata.com/blog/?p=590</guid>
		<description><![CDATA[Today, I&#8217;m feeling mostly recovered from my first ever RailsConf, so I thought I would take some time to reflect on what I learned there, and share it with you, my dear reader. So, here we go, in no particular order&#8230; CoffeeScript is happening&#8230; &#8230;whether you like it or not. Personally, I&#8217;m psyched &#8212; it [...]]]></description>
			<content:encoded><![CDATA[<p>Today, I&#8217;m feeling mostly recovered from my first ever RailsConf, so I thought I would take some time to reflect on what I learned there, and share it with you, my dear reader. So, here we go, in no particular order&#8230;</p>
<h3>CoffeeScript is happening&#8230;</h3>
<p>&#8230;whether you like it or not. Personally, I&#8217;m psyched &#8212; it looks like it solves a lot of the annoyances I&#8217;ve had with Javascript syntax, and I got a sweet deal on <a href="http://www.amazon.com/gp/product/1934356786/ref=as_li_ss_tl?ie=UTF8&amp;tag=metautonomous-20&amp;linkCode=as2&amp;camp=217145&amp;creative=399349&amp;creativeASIN=1934356786">CoffeeScript: Accelerated JavaScript Development</a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.com/e/ir?t=&amp;l=as2&amp;o=1&amp;a=1934356786&amp;camp=217145&amp;creative=399349" border="0" alt="" width="1" height="1" /> during the conference, which I hope to put to good use starting this week.</p>
<h3>The Rails Community is Awesome</h3>
<p>My wife&#8217;s response after she read my <a href="http://twitter.com/erniemiller">tweets</a> upon my return:</p>
<blockquote><p>&#8220;Just wondered, who is this guy? Dinner anyone? Share a cab? You became an extrovert on your mothership.&#8221;</p></blockquote>
<p>It&#8217;s true, I did. It&#8217;s weird. I&#8217;ve never been to Baltimore before (save time spent between flights at BWI), but among my fellow Rails coders, I&#8217;ve never felt more &#8220;at home.&#8221;</p>
<p>As I thought about all of the people I finally got to thank in person for all they&#8217;ve done to make my time in the Rails community more enjoyable, it really drove home what an awesome community we have. It&#8217;s easy to lose sight of this while working away in Louisville, my little corner of Kentucky.</p>
<p>Aside from this, getting a chance to put a real face to a name, make and receive thank-yous for all the hard work we put in on Rails patches, plugins, and the like, has the effect of re-energizing a developer. I&#8217;d go on and list all of the awesome people I got to meet in person here, but I think it&#8217;d just make <a href="http://twitter.com/casron">@casron</a> more jealous.</p>
<p>I would like to say, however, that Emilio Tagua (<a href="http://twitter.com/miloops">@miloops</a>) has got to be one of the friendliest guys I&#8217;ve ever met. I&#8217;d hoped to catch up with him to thank him for helping me get commits added to ARel back in the 1.x days that were needed for MetaSearch and MetaWhere. Instead, he ended up two seats over from me at Ignite, noticed I was hacking on a Squeel bug, and introduced himself first. Every time I saw him during the remainder of the conference, he had a smile and a kind word. Just an all-around great guy to have met.</p>
<h3>PostgreSQL is awesome, too!</h3>
<p>Now, I should have known this. I had started out using MySQL many years ago, when it had solid speed advantages over PostgreSQL, but far fewer features. Somewhere along the line, that balance shifted, but I stuck with MySQL due to familiarity. Nick Gauthier&#8217;s <a href="http://knowsql.heroku.com/">KnowSQL</a> presentation has made a believer out of me. I&#8217;ll be using PostgreSQL as my RDBMS of choice from here on, and making sure that Squeel works as well as possible with it, too.</p>
<h3>The Fundamentals are ALWAYS Relevant</h3>
<p>There were tons of talks on design patterns, best practices, and so on, and even as long as I&#8217;ve been doing this whole coding thing, there are plenty of areas in which I can improve. In particular, Avdi Grimm&#8217;s talk, <a href="http://avdi.org/talks/confident-code-railsconf-2011/">Confident Code</a>, José Valim&#8217;s talk about the design principles behind the Rails 3 refactoring, and the talk on <a href="http://assets.en.oreilly.com/1/event/59/Building%20Bulletproof%20Views%20Presentation.pdf">Building Bulletproof Views</a> by John Athayde and Bruce Williams all challenged me to elevate my game in these areas.</p>
<h3>HTML5 is sooooo much more than semantic tags</h3>
<p>LocalStorage, audio, video, canvas drawing, web sockets, web workers &#8212; this stuff is all crazy cool and I can&#8217;t wait until more browsers support it. Mike Subelsky&#8217;s <a href="https://github.com/subelsky/html5tutorial/raw/master/tutorial.html">HTML5 tutorial</a> was a real eye-opener.</p>
<p>That&#8217;s about it, for now. What were some of your takeaways from RailsConf this year?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.missiondata.com/blog/software-development/590/railsconf-reflections/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Have fun with celebt.ag</title>
		<link>http://www.missiondata.com/blog/software-development/519/have-fun-with-celebt-ag/</link>
		<comments>http://www.missiondata.com/blog/software-development/519/have-fun-with-celebt-ag/#comments</comments>
		<pubDate>Sun, 20 Mar 2011 20:45:23 +0000</pubDate>
		<dc:creator>sricks</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Mobile Application]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Utilities]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Louisville community]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[social networking]]></category>

		<guid isPermaLink="false">http://www.missiondata.com/blog/?p=519</guid>
		<description><![CDATA[Most of us have been starstruck at one time or another&#8211;you see a celeb in real life, and you may think, &#8216;Where have I seen this person before?&#8217; Then suddenly, it clicks&#8211;OMG, that&#8217;s so-and-so! Snap a photo on your mobile phone, as modern-day voyeurs do, and share your brush with fame using celebt.ag. What&#8217;s celebt.ag, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://celebt.ag"><img class="aligncenter size-full wp-image-529" title="celebtag screenshot" src="http://www.missiondata.com/blog/wp-content/uploads/2011/03/celebtag1.jpg" alt="celebtag screenshot" width="500" height="334" /></a>Most of us have been starstruck at one time or another&#8211;you see a celeb in real life, and you may think, &#8216;Where have I seen this person before?&#8217; Then suddenly, it clicks&#8211;<em>OMG, that&#8217;s so-and-so!</em> Snap a photo on your mobile phone, as modern-day voyeurs do, and share your brush with fame using <a title="celebt.ag" href="http://celebt.ag" target="_blank">celebt.ag</a>.</p>
<p>What&#8217;s celebt.ag, you ask? It&#8217;s a mobile-friendly website that combs Twitter to collect photos of celebs and let’s you see who’s been seen. We wanted to make it super simple – no commitment, no log in or username to remember – or forget, no hassle. Simple fun in three steps:</p>
<ol>
<li>Snap a photo of a celeb</li>
<li>Upload your photo to <a href="http://twitpic.com">twitpic</a>, <a href="http://yfrog.com">yfrog</a>, <a href="http://tweetphoto.com">tweetphoto</a> or <a href="http://ow.ly">ow.ly</a></li>
<li>Tweet about your pic and use the hashtag #celebtag in your tweet, and see your photo appear on the site.</li>
</ol>
<p>We developed celebt.ag, as a fun, whimsical way to explore and interact with the mobile web. We also explored the use of <a href="http://www.alistapart.com/articles/responsive-web-design/">responsive design</a> to format the layout of the site for use on nearly any browser with one set of code. See who the top celebs are, who the top spotters are and where you fit in the picture.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.missiondata.com/blog/software-development/519/have-fun-with-celebt-ag/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>uncard.me arrives in Austin for SXSWi</title>
		<link>http://www.missiondata.com/blog/software-development/489/uncard-me-arrives-in-austin-for-sxswi/</link>
		<comments>http://www.missiondata.com/blog/software-development/489/uncard-me-arrives-in-austin-for-sxswi/#comments</comments>
		<pubDate>Thu, 10 Mar 2011 03:53:10 +0000</pubDate>
		<dc:creator>Cindi</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Mobile Application]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[SXSW]]></category>
		<category><![CDATA[webkit]]></category>

		<guid isPermaLink="false">http://www.missiondata.com/blog/?p=489</guid>
		<description><![CDATA[uncard.me is a web-based alternative to app-based contact sharing solutions that lets you control how much or how little information to share. Create as many uncards as you want for different purposes and share them with QR code-enabled smartphone users. uncard.me is not another app or social network, it’s simply a fast way for people [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;"><a href="http://uncard.me"><img class="size-full wp-image-508 aligncenter" title="uncard screenshots" src="http://www.missiondata.com/blog/wp-content/uploads/2011/03/uncard-blog.jpg" alt="uncard screenshots" width="500" height="334" /></a>uncard.me is a web-based alternative to app-based contact sharing solutions that lets you control how much or how little information to share. Create as many <strong>uncards </strong>as you want for different purposes and share them with QR code-enabled smartphone users. <a href="http://uncard.me/"><strong>uncard.me</strong></a> is not another app or social network, it’s simply a fast way for people to connect, on the go, from any smartphone.</p>
<p style="text-align: left;">The concept came about as senior architect, <a href="http://twitter.com/#!/erniemiller">Ernie Miller</a> and creative director <a href="http://twitter.com/#!/toddbudnikas">Todd Budnikas</a> were planning for SXSW. “What we need is a way to share just our contact info, and nothing more. Without requiring us to carry stacks of business cards, or make goofy hand gestures with everyone we bump into, like we&#8217;re back in college again,” said Miller, “We looked, but we couldn&#8217;t find that solution. So we decided to build it.”</p>
<p style="text-align: left;">We hope you find this application as useful as we do. If you have any suggestions or comments please reach out to us on <a href="http://twitter.com/uncardme">Twitter</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.missiondata.com/blog/software-development/489/uncard-me-arrives-in-austin-for-sxswi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>DNA is Good</title>
		<link>http://www.missiondata.com/blog/software-development/404/dna-is-good/</link>
		<comments>http://www.missiondata.com/blog/software-development/404/dna-is-good/#comments</comments>
		<pubDate>Tue, 01 Mar 2011 20:48:10 +0000</pubDate>
		<dc:creator>joev</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Site Launch]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[genetic database]]></category>
		<category><![CDATA[genetic research]]></category>
		<category><![CDATA[Intrepid Bioinformatics]]></category>
		<category><![CDATA[SaaS]]></category>

		<guid isPermaLink="false">http://www.missiondata.com/blog/?p=404</guid>
		<description><![CDATA[Ok, bad paraphrasing aside, for one moment, put on your best “Gordon Gekko” suit, and loosely consider this: is it possible to create an investment portfolio with genetic data?]]></description>
			<content:encoded><![CDATA[<div id="attachment_405" class="wp-caption alignnone" style="width: 510px"><a href="http://www.intrepidbio.com"><img class="size-full wp-image-405" title="intrepid-blog" src="http://www.missiondata.com/blog/wp-content/uploads/2011/01/intrepid-blog.jpg" alt="Screen capture of the Intrepid Bioinformatics website." width="500" height="368" /></a><p class="wp-caption-text">Screen capture of the Intrepid Bioinformatics website.</p></div>
<p>Ok, bad paraphrasing aside, for one moment, put on your best “Gordon Gekko” suit, and loosely consider this:</p>
<p>In finance, a portfolio is a collection of investments held by an institution or an individual. Holding a portfolio is a part of an investment and risk-limiting strategy called diversification &#8211; by owning several assets, or “things with value”, certain types of risk can be reduced. In building up an investment portfolio, a financial institution will typically conduct investment analysis, while a private individual may make use of a financial advisor/institution&#8217;s portfolio management services.</p>
<p>Now ask yourself this &#8211; what if there were a way to do this with, oh I don&#8217;t know: your genetic data? Enter <a title="Intrepid Bioinformatics" href="http://www.intrepidbio.com" target="_blank">Intrepid Bioinformatics</a>.</p>
<p>Intrepid&#8217;s founders had a vision, one of a heterogenous genetic data management platform that would allow researchers to store, compare, and contextualize genetic trends, as well as purchase reagents and consumables, all in one place. With a newly-designed identity by <a title="Katie Bush Design, Inc." href="http://www.katiebushdesign.com/" target="_blank">Katie Bush Design, Inc.</a> in hand, Intrepid and their team came to Mission Data looking to take this concept out of the futuristic conversational realm and bring it into the “now”.</p>
<h3>What Does It Do?</h3>
<p>A “software-as-a-service” platform allows genetic researchers to compare similar data sets from thousands of samples side-by-side. With Intrepid, a researcher can begin to quickly identify trends in entire populations which will have the potential to quickly advance discoveries in the medical, pharmaceutical and agricultural biotechnology industries. From free trials to rich-access subscriber plans, users are presented with an impressive load of features right out of the gate &#8211; multiple upload options, data downloading, user tutorials, and active collaboration between other community members of your choice, to name a few.</p>
<h3>Who&#8217;s Using It?</h3>
<p>Intrepid appeals to the genetic research community in two sectors: human genome research and animal (specifically, bovine) research. The markets for these two segments are vastly different, and the audience can be further segmented into researchers working for larger companies/governments/universities vs. researchers in small, relatively unfunded labs.</p>
<p>Take, for example, a cattle farmer. He or she obviously has a vested interest in ensuring that their clients are receiving the best product possible, be it milk, beef, etc. By using Intrepid&#8217;s services, they can access a wealth of genetic data that will help them determine which lines of cattle are best suited for those assorted purposes. And, which lines they might want to avoid because of a predilection for disease.</p>
<p>That&#8217;s not to say those are the only audience contingents that Intrepid is looking to pull into their community. On the contrary, a day on the horizon can be seen in which members of the public can look to utilize Intrepid Bioinformatics&#8217; services like a digital genetic bank, safely and securely storing their data with constant and “at-will” access.</p>
<p>Our team at Mission Data constantly look to push and redefine the boundaries of what is thought possible and conventional in the realm of the web. And, I think I can speak for all of us when I say that if we can <em><strong>eliminate</strong></em> boundaries and make the ideas of the future happen while partnering with great clients, then the ride is made all the better. This was certainly the case here.</p>
<p>To further paraphrase Gordon Gekko: “It&#8217;s all about the &#8216;now&#8217;, kid. The rest is just conversation.”</p>
]]></content:encoded>
			<wfw:commentRss>http://www.missiondata.com/blog/software-development/404/dna-is-good/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programming Languages Are Slow</title>
		<link>http://www.missiondata.com/blog/software-development/252/programming-languages-are-slow/</link>
		<comments>http://www.missiondata.com/blog/software-development/252/programming-languages-are-slow/#comments</comments>
		<pubDate>Fri, 15 Oct 2010 17:02:19 +0000</pubDate>
		<dc:creator>Ernie</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.missiondata.com/blog/?p=252</guid>
		<description><![CDATA[I was chatting with a friend of mine who&#8217;s been working toward getting his company to consider a migration to Ruby on Rails. It&#8217;s interesting to me, because they&#8217;ve been using frameworks that are heavily influenced by Rails, but the developers there are resistant to moving to the real deal. They&#8217;ve started to lean away [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-271" style="float:left; margin:0 15px 15px 0;" title="Moore's Law" src="http://www.missiondata.com/blog/wp-content/uploads/2010/10/moores_law.png" alt="Moore's Law" width="200" height="134" />I was chatting with a friend of mine who&#8217;s been working toward getting his company to consider a migration to Ruby on Rails. It&#8217;s interesting to me, because they&#8217;ve been using frameworks that are heavily influenced by Rails, but the developers there are resistant to moving to the real deal. They&#8217;ve started to lean away from PHP and toward Java lately, so naturally I suggested they take a look at <a href="http://jruby.org/">JRuby</a>, which provides all the awesome of Ruby but runs on the JVM, thereby keeping the suits happy. The  response from one of his co-workers when he passed on my suggestion? &#8220;Ruby was (and is) terribly slow.&#8221; Argh. This, again? I <a href="http://twitter.com/#!/erniemiller/status/27339661019">tweeted</a> my response:</p>
<blockquote><p><em>If your best argument against using Ruby is a perception that it&#8217;s slow, a reminder: Moore&#8217;s Law is on our side. :)</em></p></blockquote>
<p><span id="more-252"></span><br />
Ruby&#8217;s been fighting the &#8220;Ruby is slow&#8221; meme for years now, and not without good reason &#8212; every day, new strides are being made in one Ruby implementation or another that show there is ample opportunity for efficiency improvements.</p>
<p><strong>That being said, do the people making this argument realize how old and tired it is? I don&#8217;t mean, &#8220;bashing Ruby for being slow is so <a href="http://groups.google.com/group/comp.lang.ruby/browse_thread/thread/d624d496b21d5453/95b69bf6605e6cee">2002</a>.&#8221; I mean, &#8220;bashing programming languages for being slow is so <a href="http://books.google.com/books?id=vg_QRDVR7hgC&amp;lpg=PA183&amp;dq=compiler%20inefficient&amp;pg=PA183#v=onepage&amp;q=compiler%20inefficient&amp;f=false">1972</a> (at least).&#8221;</strong></p>
<p>&#8220;Ruby is slow. Java is better.&#8221;<br />
&#8220;Java is slow. C is better.&#8221;<br />
&#8220;Forget about compilers, they&#8217;re inefficient. Program in assembly!&#8221;</p>
<p><strong>Resisting a programming language because it&#8217;s perceived to be &#8220;slow&#8221; is one of the most short-sighted decisions one could ever make.</strong> Over time, VMs get more efficient, compilers produce better machine language, and bandwidth, storage, and compute cycles become cheaper and more abundant. However, I have yet to hear of a single developer who has succeeded in performing more than one hour of work per hour.</p>
<p>Choose the programming language that is &#8220;fast enough&#8221; for your needs, maximizes your source code&#8217;s expressiveness, and increased your developers&#8217; happiness and productivity, because:</p>
<ol>
<li><em>&#8220;Fast enough&#8221; isn&#8217;t nearly as fast as you think it is.</em> The dissenting developer in the story above, who rejected Ruby because it was slower than Java, is writing a web-based document management system that needs to support user concurrency in the tens, not thousands.</li>
<li>A project with a highly expressive codebase will be easier to develop and maintain.</li>
<li>It&#8217;s hard enough to attract and retain strong developers even when you aren&#8217;t hamstringing their productivity.</li>
</ol>
<p>And one last reminder: It&#8217;s easy to write non-performant code in any language. Sometimes it pays to check up on the carpenter before you blame the hammer.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.missiondata.com/blog/software-development/252/programming-languages-are-slow/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>MetaSearch</title>
		<link>http://www.missiondata.com/blog/software-development/244/metasearch/</link>
		<comments>http://www.missiondata.com/blog/software-development/244/metasearch/#comments</comments>
		<pubDate>Fri, 17 Sep 2010 18:18:40 +0000</pubDate>
		<dc:creator>steveny</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Ernie Miller]]></category>
		<category><![CDATA[MetaSearch]]></category>
		<category><![CDATA[Ruby5 podcast]]></category>

		<guid isPermaLink="false">http://www.missiondata.com/blog/?p=244</guid>
		<description><![CDATA[Most people know we churn out a good many Rails-based websites. Now one of our own, Ernie Miller, is starting to make waves with his object-based searching gem, MetaSearch. For his efforts, Ernie received a mention on the Ruby5 podcast. Go listen to the podcast, then go check out MetaSearch!]]></description>
			<content:encoded><![CDATA[<p>Most people know we <a href="http://www.cheapcycleparts.com/">churn</a> <a href="http://www.louisvillerealtors.com/">out</a> <a href="http://www.schlechtycenter.org/">a</a> <a href="http://www.cnpe.org/">good</a> <a href="http://www.cattlefax.com/">many</a> <a href="http://www.streamthatcause.com/">Rails</a>-<a href="http://powerpacknation.optimabatteries.com">based</a> <a href="http://www.ymilive.org/">websites</a>.  Now one of our own, <a href="http://metautonomo.us/">Ernie Miller</a>, is starting to make waves with his object-based searching gem, <a href="http://metautonomo.us/projects/metasearch">MetaSearch</a>.  For his efforts, Ernie received a mention on the <a href="http://ruby5.envylabs.com/episodes/114-episode-112-september-17th-2010">Ruby5 podcast</a>.  Go listen to the <a href="http://ruby5.envylabs.com/episodes/114-episode-112-september-17th-2010">podcast</a>, then go check out MetaSearch!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.missiondata.com/blog/software-development/244/metasearch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Online Vs Offline Applications: Everything old is new again</title>
		<link>http://www.missiondata.com/blog/software-development/51/online-vs-offline-applications-everything-old-is-new-again/</link>
		<comments>http://www.missiondata.com/blog/software-development/51/online-vs-offline-applications-everything-old-is-new-again/#comments</comments>
		<pubDate>Wed, 28 Mar 2007 13:09:30 +0000</pubDate>
		<dc:creator>carsonm</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[online apps]]></category>

		<guid isPermaLink="false">http://www.missiondata.com/blog/software/51/online-vs-offline-applications-everything-old-is-new-again/</guid>
		<description><![CDATA[Everyone has probably noticed this already but the old is new again cycle for &#8220;online&#8221; desktop apps has been shortening at a rapid pace. Everywhere you turn you see people talking about offline and online apps and what should be online vs offline. If you take your time machine back you would see something like [...]]]></description>
			<content:encoded><![CDATA[<p>Everyone has probably noticed this already but the old is new again cycle for &#8220;online&#8221; desktop apps has been shortening at a rapid pace. Everywhere you turn you see people talking about offline and online apps and <a href="http://www.readwriteweb.com/archives/offline_webapps_online_desktop_counterpoint.php">what should be online vs offline</a>. If you take your time machine back you would see something like the following timeline:</p>
<ul>
<li>1970s 3270</li>
<li>1980s X terminal</li>
<li>1990s Java applets</li>
<li>2000 Flash</li>
<li>2005 Ajax</li>
</ul>
<p>Up until about 2000 it was taking 10 years to cycle from &#8220;we want everything on our desktop&#8221; to &#8220;we want everything on the server&#8221;. Now the cycle seems to have sped up to every year and then to constant. A couple recent examples of new faces on this old idea are <a href="http://www.readwriteweb.com/archives/adobe_apollo_collision_course_browsers.php">Adobe&#8217;s Apollo</a> and <a href="http://joyeur.com/2007/03/22/joyent-slingshot">Joyent&#8217;s Slingshot</a>.</p>
<p>Fundamentally not much has changed from the 1970s. The goal is to centralize computing resources into one place (in the simple view of things) and make issues like software deployment easier.The main difference now is that the industry has come to the point where there isn&#8217;t any turning back and everyone has bought on to the need and usefulness of online apps. The main sticking point seems to be finding a way to resolve issues that come up from users being disconnected from time to time. I&#8217;ll bet that one won&#8217;t be fully resolved until you have connectivity anywhere and everywhere you go.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.missiondata.com/blog/software-development/51/online-vs-offline-applications-everything-old-is-new-again/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hibernate and your Getters and Setters</title>
		<link>http://www.missiondata.com/blog/software-development/67/hibernate-and-your-getters-and-setters/</link>
		<comments>http://www.missiondata.com/blog/software-development/67/hibernate-and-your-getters-and-setters/#comments</comments>
		<pubDate>Sun, 11 Mar 2007 18:33:25 +0000</pubDate>
		<dc:creator>darrend</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.missiondata.com/blog/uncategorized/67/hibernate-and-your-getters-and-setters/</guid>
		<description><![CDATA[When you&#8217;re using Hibernate and are mapping to properties, keep your getters and setters as simple and self-contained as possible. The receiver being initialized may not have any other properties set, and the value being passed may not be fully initialized yet, either. If you don&#8217;t respect these two possibilities, then you will get bit [...]]]></description>
			<content:encoded><![CDATA[<p>When you&#8217;re using Hibernate and are mapping to properties, keep your getters and setters as simple and self-contained as possible. The receiver being initialized may not have any other properties set, and the value being passed may not be fully initialized yet, either. </p>
<p>If you don&#8217;t respect these two possibilities, then you will get bit in the butt alot, when you least expect it. To be fair, these situations can happen whether you&#8217;re using Hibernate or not, but when we first started using the framework we made lots of assumptions.</p>
<p>Here is a completely ridiculous example that violates the above restrictions:<br />
<span id="more-67"></span></p>
<pre><code>public class User
{
  private boolean isSurnameLast;
  private Name name;  

  private String fullName;
  private String initials;

  public boolean setSurnameLast(boolean surnameLast)
  {
    this.isSurnameLast=surnameLast;
  }

  public void setName(Name name)
  {
    this.name = name;
    String lastName;
    String firstName;
    initials = new StringBuffer(name.getSurName().substring(0,1)).append(".").append(name.getGivenName().substring(0,1)).toString();
    if(isSurnameLast)
    {
      lastName = name.getSurName();
      firstName = name.getGivenName();
    }
    else
    {
      lastName = name.getGivenName();
      firstName = name.getSurName();
    }
    fullName = new StringBuffer(firstName).append(" ").append(lastName).toString();
  }
  // more getters and setters blah blah blah
}</code></pre>
<p>(Ignore the lame &#8220;business logic&#8221; here&#8230;)</p>
<p>So you look in your database and you see that all the Users database entries have names and properly set surnameLast values, and all the Names database entries have a surName and a givenName. Sure the code is sloppy, but this is gonna work fine! </p>
<p>Nope, this <code>setName</code> is loaded with problems.</p>
<p>First, you&#8217;ll notice as your app runs that somehow <code>setName</code> is being called and passed a null. What?! Why! Durn that Hibernate, it is trying to trick you! No matter, we&#8217;ll catch it with a null check. You&#8217;ll shield your eyes as to when and why Hibernate or cglib or whatever is calling setters on an instance that isn&#8217;t even in the database, but at least it won&#8217;t blow up. This is the first bad smell you&#8217;ve blown through, you sloppy panicky codemonkey:</p>
<pre><code>  public void setName(Name name)
  {
    if(name!=null) // hahah
   {
       this.name = name;
      ....</code></pre>
<p>Then you&#8217;ll start realizing that no matter what the database says, sometimes you are getting the surname first in the full name! &#8220;Smith Joan!&#8221;, you&#8217;ll cry, but &#8220;it&#8217;s true for Joan Smith in the database! Why?&#8221; Well, sometimes Hibernate is calling <code>setName</code> before it calls <code>setSurnameLast</code>. It doesn&#8217;t matter which you have mapped first in the <tt>User.hbm.xml</tt> file, or which field you have first in the code. You can&#8217;t depend on other properties of User being initialized in the Hibernate setters.</p>
<p>Now, you&#8217;re also going to get NullPointerExceptions thrown out of this code, because sometimes that Name instance you&#8217;re being passed hasn&#8217;t had <em>its</em> properties initialized by Hibernate yet. Talk about something that seems sneaky and evil but is totally above board: Hibernate has created the new Name instance and has passed that reference to other instances, but hasn&#8217;t fully populated the Name instance yet.</p>
<p>That means this line will blow sky-high sometimes:</p>
<pre><code>initials = new StringBuffer(name.getSurName().substring(0,1)).append(".").append(name.getGivenName().substring(0,1)).toString();</code></pre>
<p>The sane thing to do here?</p>
<pre><code>  public void setName(Name name)
  {
    this.name = name;
  }</code></pre>
<p>So if you&#8217;re using Hibernate, go take a look at your classes and mappings! You may very well be doing something dangerous.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.missiondata.com/blog/software-development/67/hibernate-and-your-getters-and-setters/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Using the Hibernate API to Inspect Mapped Classes</title>
		<link>http://www.missiondata.com/blog/software-development/60/using-the-hibernate-api-to-inspect-mapped-classes/</link>
		<comments>http://www.missiondata.com/blog/software-development/60/using-the-hibernate-api-to-inspect-mapped-classes/#comments</comments>
		<pubDate>Thu, 03 Aug 2006 02:21:11 +0000</pubDate>
		<dc:creator>Rich Rodriguez</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[Utilities]]></category>

		<guid isPermaLink="false">http://blogs.missiondata.com/?p=60</guid>
		<description><![CDATA[For my current project we needed to audit the property setters Hibernate was using on our objects to make sure that any logic in them was not overly state dependent. More about this issue in Hibernate is available here. We have fairly rich object models, and a lot of methods, including setters, are never used [...]]]></description>
			<content:encoded><![CDATA[<p>For my current project we needed to audit the property setters Hibernate was using on our objects to make sure that any logic in them was not overly state dependent. More about this issue in Hibernate is available <a title="Hibernate Forums" href="http://forum.hibernate.org/viewtopic.php?t=937664">here</a>. We have fairly rich object models, and a lot of methods, including setters, are never used by Hibernate. We wanted a report of the setters actually used by Hibernate to limit the amount of code we had to examine.</p>
<p>The Hibernate API allows you a lot of access to its configuration object model, and this is ideal for finding out how Hibernate is interacting with your code. I wrote a small class to do this inspection. The method below is run after a Hibernate Configuration object named creatively as &#8220;configuration&#8221; has been built with mapping files:</p>
<pre><code>public Map findSetters() throws MappingException
{
  Map classToSetters = new HashMap();
  Iterator classMappingIterator =   configuration.getClassMappings();

  while(classMappingIterator.hasNext())
  {
    PersistentClass persistentClass = (PersistentClass)classMappingIterator.next();
    Class mappedClass = persistentClass.getMappedClass();
    Iterator propertyIt = persistentClass.getPropertyIterator();
    List classSetters = new LinkedList();

    classToSetters.put(mappedClass, classSetters);

    while(propertyIt.hasNext())
    {
      Property property = (Property)propertyIt.next();
      Setter setter = property.getSetter(mappedClass);

      classSetters.add(setter.getMethodName());
    }
  }
  return classToSetters;
}</code></pre>
<p>I have uploaded <a id="p61" onmousedown="selectLink(61);" href="http://blogs.missiondata.com/wp-content/uploads/2006/08/HibernateTools.tar.gz">a Java project</a> that contains the full HibernateInspector class, as well as some sample classes and mappings. Un-tar it, and run</p>
<pre><code class="console">ant -Dhibernate.home="path to hibernate 3" </code></pre>
<p>to build and run the example.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.missiondata.com/blog/software-development/60/using-the-hibernate-api-to-inspect-mapped-classes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Slides for &#8220;You&#8217;ll Be Seeing Ruby&#8221;</title>
		<link>http://www.missiondata.com/blog/software-development/56/slides-for-youll-be-seeing-ruby/</link>
		<comments>http://www.missiondata.com/blog/software-development/56/slides-for-youll-be-seeing-ruby/#comments</comments>
		<pubDate>Thu, 18 May 2006 01:07:59 +0000</pubDate>
		<dc:creator>darrend</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[presentation]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blogs.missiondata.com/?p=56</guid>
		<description><![CDATA[The slides for the presentation are finally available, along with a zipfile, on the Presentation: You’ll Be Seeing Ruby page. It&#8217;s been a month now since our last performance, but it all comes back every time I look at the slides.]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://blogs.missiondata.com/wp-content/uploads/manual/seeing_ruby_20060517/slides/1-index.html">slides for the presentation are finally available</a>, along with a zipfile, on the <a href="http://blogs.missiondata.com/?page_id=30">Presentation: You’ll Be Seeing Ruby</a> page.</p>
<p>It&#8217;s been a month now since our last performance, but it all comes back every time I look at the slides.  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.missiondata.com/blog/software-development/56/slides-for-youll-be-seeing-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

