<?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-1520361354921664172</id><updated>2011-11-13T18:21:24.549-08:00</updated><category term='ruby'/><category term='file finder'/><category term='firefox'/><category term='jquery'/><category term='rspec'/><category term='academia'/><category term='about:config'/><category term='research'/><category term='javascript'/><category term='agile'/><category term='observe'/><category term='recursive'/><category term='forms'/><category term='rails-2.3.2'/><category term='finder'/><category term='rails-1.2.6'/><category term='rails_env'/><category term='dirty'/><category term='file'/><category term='google'/><category term='form'/><title type='text'>puts post</title><subtitle type='html'>A blog consisting of code excerpts, thoughts, links and anything else that might seem fit to print.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://putspost.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1520361354921664172/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://putspost.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Asa</name><uri>http://www.blogger.com/profile/10055524279714290122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_JRZWbDqTYvc/SWd8_f2DmFI/AAAAAAAAAQg/VwP6n_i7pCc/S220/Photo+33.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1520361354921664172.post-3709261495934157627</id><published>2009-05-21T06:45:00.000-07:00</published><updated>2009-05-21T06:47:37.899-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='about:config'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Keywords in the Location Bar: I'm Feeling Lucky</title><content type='html'>So, I use Firefox whenever possible on whatever machine I happen to be on.  Most of the time that's on my laptop and I have several plugins that enhance my Firefox experience.  I'm a big fan of the delicious and evernote plugins.&lt;br /&gt;&lt;br /&gt;What I wanted was the ability to do an "I'm feeling lucky" search from the browser bar somewhere.  What I found was there's a setting for that.&lt;br /&gt;&lt;br /&gt;Go to the keyword.URL setting in about:config on your Firefox 3 browser.  Don't worry there wasn't a warranty in the first place, but do be careful when you're playing around in here.  &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_JRZWbDqTYvc/ShVZJ-xftpI/AAAAAAAAASc/XTzBD_hFaOQ/s1600-h/Picture+3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 102px;" src="http://2.bp.blogspot.com/_JRZWbDqTYvc/ShVZJ-xftpI/AAAAAAAAASc/XTzBD_hFaOQ/s320/Picture+3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5338270961321883282" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That is the url you hit when the jibberish you type into the location bar of the browser doesn't look like a website.  So this is the setting to change.  The url I use is:&lt;br /&gt;&lt;br /&gt;http://www.google.com/search?btnI=I%27m+Feeling+Lucky&amp;ie=UTF-8&amp;oe=UTF-8&amp;q=&lt;br /&gt;&lt;br /&gt;Make sure the keyword.enabled is true.  It should be by default but just make sure.&lt;br /&gt;&lt;br /&gt;Now you can type in:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_JRZWbDqTYvc/ShVaaHnI1pI/AAAAAAAAASk/LREmOrO0nSk/s1600-h/Picture+4.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 212px; height: 41px;" src="http://4.bp.blogspot.com/_JRZWbDqTYvc/ShVaaHnI1pI/AAAAAAAAASk/LREmOrO0nSk/s320/Picture+4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5338272338083894930" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And be directed straight to the rdocs on paperclip.. If you're as lucky as you feel of course.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_JRZWbDqTYvc/ShVaaYfxQ7I/AAAAAAAAASs/xfgXg3EoveY/s1600-h/Picture+5.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 148px;" src="http://2.bp.blogspot.com/_JRZWbDqTYvc/ShVaaYfxQ7I/AAAAAAAAASs/xfgXg3EoveY/s320/Picture+5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5338272342616392626" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1520361354921664172-3709261495934157627?l=putspost.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://putspost.blogspot.com/feeds/3709261495934157627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://putspost.blogspot.com/2009/05/keywords-in-location-bar-im-feeling.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1520361354921664172/posts/default/3709261495934157627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1520361354921664172/posts/default/3709261495934157627'/><link rel='alternate' type='text/html' href='http://putspost.blogspot.com/2009/05/keywords-in-location-bar-im-feeling.html' title='Keywords in the Location Bar: I&apos;m Feeling Lucky'/><author><name>Asa</name><uri>http://www.blogger.com/profile/10055524279714290122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_JRZWbDqTYvc/SWd8_f2DmFI/AAAAAAAAAQg/VwP6n_i7pCc/S220/Photo+33.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_JRZWbDqTYvc/ShVZJ-xftpI/AAAAAAAAASc/XTzBD_hFaOQ/s72-c/Picture+3.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1520361354921664172.post-3391322355823381139</id><published>2009-05-15T11:18:00.001-07:00</published><updated>2009-05-21T06:48:52.008-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rspec'/><category scheme='http://www.blogger.com/atom/ns#' term='rails-1.2.6'/><category scheme='http://www.blogger.com/atom/ns#' term='rails_env'/><category scheme='http://www.blogger.com/atom/ns#' term='rails-2.3.2'/><title type='text'>Quick Heads up: Upgrading from Rails 1.2.6 to 2.3.2</title><content type='html'>I was just upgrading one of our apps into the new age from 1.2.6 to 2.3.2 and found an interesting issue.  With the corresponding upgrade of Rspec.  The new rspec generates a spec_helper.rb file with this line at the top:&lt;br /&gt;&lt;br /&gt;&lt;pre class='prettyprint'&gt;&lt;br /&gt;ENV["RAILS_ENV"] ||= 'test'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;For some reason this plays funny with our environment in that all of our dev machines were running the tests in development mode.  Obviously somewhat less than ideal.  Just take out the 'or' from the 'or equals' and we're set.&lt;br /&gt;&lt;br /&gt;&lt;pre class='prettyprint'&gt;&lt;br /&gt;ENV["RAILS_ENV"] = 'test'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;There is probably more to this story but just in case this could help someone wanted to jot it down real quickly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1520361354921664172-3391322355823381139?l=putspost.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://putspost.blogspot.com/feeds/3391322355823381139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://putspost.blogspot.com/2009/05/quick-heads-up-upgrading-from-rails-126.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1520361354921664172/posts/default/3391322355823381139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1520361354921664172/posts/default/3391322355823381139'/><link rel='alternate' type='text/html' href='http://putspost.blogspot.com/2009/05/quick-heads-up-upgrading-from-rails-126.html' title='Quick Heads up: Upgrading from Rails 1.2.6 to 2.3.2'/><author><name>Asa</name><uri>http://www.blogger.com/profile/10055524279714290122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_JRZWbDqTYvc/SWd8_f2DmFI/AAAAAAAAAQg/VwP6n_i7pCc/S220/Photo+33.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1520361354921664172.post-4959465117284072804</id><published>2009-03-13T05:23:00.000-07:00</published><updated>2009-03-13T05:40:55.454-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='recursive'/><category scheme='http://www.blogger.com/atom/ns#' term='file'/><category scheme='http://www.blogger.com/atom/ns#' term='finder'/><category scheme='http://www.blogger.com/atom/ns#' term='file finder'/><title type='text'>Recursive File Finder</title><content type='html'>When looking for a bunch of files somewhere in directory structure I usually pull my hear out. But I found this cool ruby code called 'Find'.  It pretty much does all the dirty work for us and its packed with ruby core.  It has two methods. Find.find which takes a block and will basically recursively look through every child directory of the one you pass in.  Find.prune which only makes sense in the context of a find block, and just says stop looking in here.  You want to make sure you use this when you hit a file or a directory you don't want to look in.&lt;br /&gt;&lt;br /&gt;Below is a little snippet of code I wrote to recursively find files that matched some substring.  It's used like this: &lt;br /&gt;&lt;br /&gt;&lt;pre class='prettyprint'&gt;&lt;br /&gt; File.recursive_find('/root/search/path', 'invoice')&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This will find all of the files that match the string 'invoice' somewhere in their name and return an array of these files. Here's the code:&lt;br /&gt;&lt;br /&gt;&lt;pre class='prettyprint'&gt;&lt;br /&gt;require 'find'&lt;br /&gt;class File&lt;br /&gt;  def self.recursive_find(dir, match_string)&lt;br /&gt;    results = []&lt;br /&gt;    Find.find(dir) do |path|&lt;br /&gt;      unless FileTest.directory?(path)&lt;br /&gt;        unless File.basename(path) =~ /#{match_string}/&lt;br /&gt;          Find.prune&lt;br /&gt;        else&lt;br /&gt;          results &lt;&lt; path&lt;br /&gt;        end&lt;br /&gt;      else&lt;br /&gt;        next&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;    results&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1520361354921664172-4959465117284072804?l=putspost.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://putspost.blogspot.com/feeds/4959465117284072804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://putspost.blogspot.com/2009/03/recursive-file-finder.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1520361354921664172/posts/default/4959465117284072804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1520361354921664172/posts/default/4959465117284072804'/><link rel='alternate' type='text/html' href='http://putspost.blogspot.com/2009/03/recursive-file-finder.html' title='Recursive File Finder'/><author><name>Asa</name><uri>http://www.blogger.com/profile/10055524279714290122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_JRZWbDqTYvc/SWd8_f2DmFI/AAAAAAAAAQg/VwP6n_i7pCc/S220/Photo+33.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1520361354921664172.post-5963890624798708571</id><published>2009-01-22T12:20:00.000-08:00</published><updated>2009-01-22T12:51:35.536-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='academia'/><category scheme='http://www.blogger.com/atom/ns#' term='research'/><title type='text'>Agile Research</title><content type='html'>...is it possible?&lt;br /&gt;&lt;br /&gt;I was looking at trying to manage tasks/projects in the field biology realm.&lt;br /&gt;&lt;br /&gt;Strikes I'm considering thus far:&lt;br /&gt;- hard and fast deadlines that you can't miss that are all or nothing.&lt;br /&gt;- projects change frequently so estimation is tough to get down&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Deadlines...&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;In my experience with agile thus far, it works fine when you know you want to launch a new software project by a certain time with whatever features you can develop by then.  Or if you know you need a certain feature set but don't really care when it gets done.  When you have both criterion that makes it much more difficult.&lt;br /&gt;&lt;br /&gt;Just like you can't guarantee to a business owner that there site will be done with all their features in exactly one month and guarantee the developers a sustainable pace, neither can you do that in research.  So is there a way to adapt to these criterion?  The benefit is that the deadlines usually pop-up far enough ahead of time that you wouldn't be able to spend all the time between now and then on that project even if you wanted to.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Project Turnover...&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;For agile projects I've been a part of we generally do a pretty bad job of estimating stories at the beginning and a much better job towards the end.  Takes a sprint or two to get the hang of it.  If projects were turning over frequently, this could be a nightmare.&lt;br /&gt;&lt;br /&gt;In the academic world, there are constantly many things pressing on your time.  Teaching responsibilities, data gathering, data analysis, and synthesis/publication.  For any particular research project, a researcher has to start in the data gathering stage often using new tools and new methods are these estimable?  Then as they move on to the data analysis, they again are often using new tools, and new methods.  The writing at last is fairly familiar.  The number of graphs and the length of the article may change but writing is always familiar ground.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Thoughts?&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;So how does one estimate such things?  Ideas for agile in the research world?  Am I just trying to force it?&lt;br /&gt;&lt;br /&gt;I appreciate your suggestions, comments, feedback!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1520361354921664172-5963890624798708571?l=putspost.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://putspost.blogspot.com/feeds/5963890624798708571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://putspost.blogspot.com/2009/01/agile-research.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1520361354921664172/posts/default/5963890624798708571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1520361354921664172/posts/default/5963890624798708571'/><link rel='alternate' type='text/html' href='http://putspost.blogspot.com/2009/01/agile-research.html' title='Agile Research'/><author><name>Asa</name><uri>http://www.blogger.com/profile/10055524279714290122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_JRZWbDqTYvc/SWd8_f2DmFI/AAAAAAAAAQg/VwP6n_i7pCc/S220/Photo+33.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1520361354921664172.post-3866893826205620685</id><published>2009-01-15T19:35:00.000-08:00</published><updated>2009-01-15T20:05:41.983-08:00</updated><title type='text'>Cross Browser Consistency</title><content type='html'>http://dowebsitesneedtolookexactlythesameineverybrowser.com/&lt;br /&gt;&lt;br /&gt;For those that don't want to parse this url.. Do websites need to look exactly the same in ever browser?&lt;br /&gt;&lt;br /&gt;When I first saw this url I thought to myself, "Self, the simple answer is 'Yes'."  I mean who wants to go to their banks website and see a different layout when they get on with Firefox and another when they are checking their account on the road from some hotel's computer.  No one!  You lose all confidence in the site authors if it looks different every time you visit.&lt;br /&gt;&lt;br /&gt;Also being a web developer I feel the pains of cross browser support all the time so I wanted to go on and commiserate with the other developers.  You know why do we have to have a specific stylesheet for IE7 that is full of hacks to make it work like the standards ask, and why does IE6 even exist still and so on.&lt;br /&gt;&lt;br /&gt;When I hit the site all I was greated with was a fancy looking 'No!'.  I chuckled a bit to myself and said, "yeah right".  Then, being the nerd that I am, I immediately opened up every browser I have to see what the differences were for this site.  Of course lucky me launching parallels brought the gray screen of death down upon my poor tired little MacBook.  But after I recovered from that I took a look at all the browsers.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_JRZWbDqTYvc/SXAHWw8z28I/AAAAAAAAAQ4/Y2XJ9_r0Rdk/s1600-h/Picture+1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 106px;" src="http://1.bp.blogspot.com/_JRZWbDqTYvc/SXAHWw8z28I/AAAAAAAAAQ4/Y2XJ9_r0Rdk/s320/Picture+1.png" alt="" id="BLOGGER_PHOTO_ID_5291737649838808002" border="0" /&gt;&lt;/a&gt;Turns out the 'No!' that looked so fancy in OSX's Firefox, even fancier looking on OSX's Safari, pretty plain on XP in Firefox, Chrome and IE7, and slightly PC's Safari was a little fancier (Check it out for yourself).  So when this site poses the question exactly the same I guess I have to agree.  No, there is no reason to go through the effort of making sure your fonts are rendered the same way on every browser by rendering them with vectors or making sure you restyle all buttons with your own custom styles.&lt;br /&gt;&lt;br /&gt;As long as the layout is the same and I can click a button in the same place on each browser labeled the same way and no text is falling out of divs or something like that I am pretty satisfied.  I realize I'm a developer and am probably pretty utilitarian that way, but then again how many users of the web are really using more than one browser anyway.&lt;br /&gt;&lt;br /&gt;All this said, I gotta mention.. I like the 'No!' on OSX's Safari the best. ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1520361354921664172-3866893826205620685?l=putspost.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://putspost.blogspot.com/feeds/3866893826205620685/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://putspost.blogspot.com/2009/01/cross-browser-consistency.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1520361354921664172/posts/default/3866893826205620685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1520361354921664172/posts/default/3866893826205620685'/><link rel='alternate' type='text/html' href='http://putspost.blogspot.com/2009/01/cross-browser-consistency.html' title='Cross Browser Consistency'/><author><name>Asa</name><uri>http://www.blogger.com/profile/10055524279714290122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_JRZWbDqTYvc/SWd8_f2DmFI/AAAAAAAAAQg/VwP6n_i7pCc/S220/Photo+33.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_JRZWbDqTYvc/SXAHWw8z28I/AAAAAAAAAQ4/Y2XJ9_r0Rdk/s72-c/Picture+1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1520361354921664172.post-7170607713874507669</id><published>2009-01-14T15:22:00.000-08:00</published><updated>2009-01-14T15:32:52.297-08:00</updated><title type='text'>So you've got 100% Test Coverage</title><content type='html'>I stumbled across a quote at some point today.  It wasn't the first time I heard it but it resonated with me today for whatever reason.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;"Testing can only prove the presence of bugs, not their absence." --Edsger Dijkstra&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Yep.  It's so true.  Hopefully, all of you have 100% or close test coverage on any app you develop but don't forget.  All that test coverage is just a good sign, not a 100% working guarantee.&lt;br /&gt;&lt;br /&gt;A good developer will try to test any edge cases that come to mind, but there are always more out there.  Very sneaky, those wild combinations that users come up with, are (Just watched Star Wars last night, Yoda on the brain..).&lt;br /&gt;&lt;br /&gt;This isn't a reason to not cover everything with tests.  Just a reminder, that there is still work to be done, and as you are adding on to the code you've got, you may still find a bug or two.. Keep your eyes peeled!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1520361354921664172-7170607713874507669?l=putspost.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://putspost.blogspot.com/feeds/7170607713874507669/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://putspost.blogspot.com/2009/01/so-youve-got-100-test-coverage.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1520361354921664172/posts/default/7170607713874507669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1520361354921664172/posts/default/7170607713874507669'/><link rel='alternate' type='text/html' href='http://putspost.blogspot.com/2009/01/so-youve-got-100-test-coverage.html' title='So you&apos;ve got 100% Test Coverage'/><author><name>Asa</name><uri>http://www.blogger.com/profile/10055524279714290122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_JRZWbDqTYvc/SWd8_f2DmFI/AAAAAAAAAQg/VwP6n_i7pCc/S220/Photo+33.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1520361354921664172.post-1400047916473188435</id><published>2009-01-13T15:23:00.000-08:00</published><updated>2009-01-13T15:31:09.956-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='forms'/><category scheme='http://www.blogger.com/atom/ns#' term='dirty'/><category scheme='http://www.blogger.com/atom/ns#' term='observe'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><category scheme='http://www.blogger.com/atom/ns#' term='form'/><title type='text'>DirtyForm: Watching for form changes with jQuery</title><content type='html'>Last time I mentioned that I had just finished the first steps of a jQuery plugin that would watch your forms and notify you before you left the page so your users don't lose that input they just took the time to type out but forgot to save. Well now its a little more robust and flexible.&lt;br /&gt;&lt;h2&gt;What's new?&lt;/h2&gt;&lt;br /&gt;Lots of stuff has been updated.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Dirty and Clean events are fired off when a form has unsaved changes, and again when the form is cleaned again.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;It works with jQuery tabs now (they are tricky and don't work like normal links).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Not limited to forms.  Any container of inputs will work just fine.&lt;/li&gt;  &lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h3&gt;Dirty/Clean Events&lt;/h3&gt;&lt;br /&gt;Forms can observe the "dirty" event for customized behavior. So you could set up the dirty form and then bind a function to the dirty event like so:&lt;br /&gt;&lt;pre class='prettyprint'&gt;&lt;br /&gt;$(function(){&lt;br /&gt;  $("form")&lt;br /&gt;    .dirty_form()&lt;br /&gt;    .dirty(function(event, data){&lt;br /&gt;      var label = $(event.target).parents("li").find("label");&lt;br /&gt;      $("body").append("&lt;p&gt;" + label.text() + "Changed from " + data.from + " to: " + data.to+ "&lt;/p&gt;")&lt;br /&gt;    })&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Dirty Forms + jQuery-UI tabs&lt;/h3&gt;&lt;br /&gt;You can use tabs with DirtyForm easily.  Just be sure that you make the tabs into stopper links after they are set up as tabs so they can be recognized as such and set up properly.  They need a lot of special casing.&lt;br /&gt;&lt;pre class='prettyprint'&gt;&lt;br /&gt;$(function(){&lt;br /&gt;  $("#nav").tabs();&lt;br /&gt;  $("#nav a").dirty_stopper();&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If you've already set up all the links for the app as stoppers don't worry this will still work as the other events will be unbound. No penalty for making any links into a stopper twice!&lt;br /&gt;&lt;h3&gt;Not just for forms!&lt;/h3&gt;&lt;br /&gt;If you like throwing inputs in your table rows DirtyForm can handle it. Just tell it where you want it to look.&lt;br /&gt;&lt;pre class='prettyprint'&gt;&lt;br /&gt;$(function(){&lt;br /&gt;  $('tr').dirty_form();&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The plugin is available for download from github: &lt;a href="http://github.com/acvwilson/dirty_form/tree/master" target="_blank"&gt;DirtyForm&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1520361354921664172-1400047916473188435?l=putspost.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://putspost.blogspot.com/feeds/1400047916473188435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://putspost.blogspot.com/2009/01/dirtyform-watching-for-form-changes.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1520361354921664172/posts/default/1400047916473188435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1520361354921664172/posts/default/1400047916473188435'/><link rel='alternate' type='text/html' href='http://putspost.blogspot.com/2009/01/dirtyform-watching-for-form-changes.html' title='DirtyForm: Watching for form changes with jQuery'/><author><name>Asa</name><uri>http://www.blogger.com/profile/10055524279714290122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_JRZWbDqTYvc/SWd8_f2DmFI/AAAAAAAAAQg/VwP6n_i7pCc/S220/Photo+33.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1520361354921664172.post-259152209172211213</id><published>2009-01-08T18:15:00.000-08:00</published><updated>2009-01-09T08:55:12.818-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='dirty'/><category scheme='http://www.blogger.com/atom/ns#' term='observe'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><category scheme='http://www.blogger.com/atom/ns#' term='form'/><title type='text'>DirtyForm</title><content type='html'>Let the fun begin!&lt;br /&gt;&lt;br /&gt;Have you ever made changes and then clicked the wrong button or switched to another tab before you submitted the form and then realized that all your changes are gone.  Wouldn't it be nice if you were given a notification before you left so you would know what was about to happen.  I thought so.  So I wrote a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;jQuery&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;plugin&lt;/span&gt; that does just that.&lt;br /&gt;&lt;br /&gt;It's very easy to integrate with your app as long as you're using &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;jQuery&lt;/span&gt; (If you're not you should be).&lt;br /&gt;&lt;br /&gt;Just specify whatever forms you want to be watched as follows.&lt;br /&gt;&lt;br /&gt;$(document).ready(function($){&lt;br /&gt; $('form').dirty_form();&lt;br /&gt; ...&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;And then specify the links that should stop progress when a form has unsaved changes.&lt;br /&gt;&lt;br /&gt;$(document).ready(function($){&lt;br /&gt; ...&lt;br /&gt; $('a').dirty_stopper();&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;And that's all there is to it.  Then when you change an input on the form and try to click one of those links a pop-up will display asking if you would like to proceed or go back and save your changes.  This can save your users a lot of frustration and wasted time.&lt;br /&gt;&lt;br /&gt;If you have the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;livequery&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;jQuery&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;plugin&lt;/span&gt; installed &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;DirtyForm&lt;/span&gt; will also work for form elements added at any point after the page loads.&lt;br /&gt;&lt;br /&gt;In the near future I'm going to try to make this &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;plugin&lt;/span&gt; work with the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;jQuery&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;UI&lt;/span&gt; tabs function.  It can be downloaded from github here : &lt;a href="http://github.com/acvwilson/dirty_form/tree/master"&gt;DirtyForm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Also posted on ELCTech's blog: &lt;a href="http://www.elctech.com/projects/dirtyform"&gt;DirtyForm&lt;/a&gt;&lt;a href="http://www.elctech.com/projects/dirtyform"&gt; post&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1520361354921664172-259152209172211213?l=putspost.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://putspost.blogspot.com/feeds/259152209172211213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://putspost.blogspot.com/2009/01/dirtyform.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1520361354921664172/posts/default/259152209172211213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1520361354921664172/posts/default/259152209172211213'/><link rel='alternate' type='text/html' href='http://putspost.blogspot.com/2009/01/dirtyform.html' title='DirtyForm'/><author><name>Asa</name><uri>http://www.blogger.com/profile/10055524279714290122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_JRZWbDqTYvc/SWd8_f2DmFI/AAAAAAAAAQg/VwP6n_i7pCc/S220/Photo+33.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1520361354921664172.post-7497129299385109598</id><published>2009-01-08T17:59:00.000-08:00</published><updated>2009-01-08T18:15:10.913-08:00</updated><title type='text'>Borrowing the Beginning</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://markmalazarte.com/jarmuschquote.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 412px; height: 482px;" src="http://markmalazarte.com/jarmuschquote.jpg" alt="" border="0" /&gt;&lt;/a&gt;This is a quote I found recently and I thought it would be a fitting thing to start out the blog. &lt;br /&gt;&lt;br /&gt;Maybe you're different, but for me anything 'original' I create is just combining things which already exist.  Making something from nothing just can't be done.  So in that spirit I thought I would start with stealing the presentation of this quote and throw it on my blog.&lt;br /&gt;&lt;br /&gt;Hopefully, I'll be taking things from all over the place and offer them back in a new and useful way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1520361354921664172-7497129299385109598?l=putspost.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://putspost.blogspot.com/feeds/7497129299385109598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://putspost.blogspot.com/2009/01/borrowing-beginning.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1520361354921664172/posts/default/7497129299385109598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1520361354921664172/posts/default/7497129299385109598'/><link rel='alternate' type='text/html' href='http://putspost.blogspot.com/2009/01/borrowing-beginning.html' title='Borrowing the Beginning'/><author><name>Asa</name><uri>http://www.blogger.com/profile/10055524279714290122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_JRZWbDqTYvc/SWd8_f2DmFI/AAAAAAAAAQg/VwP6n_i7pCc/S220/Photo+33.jpg'/></author><thr:total>0</thr:total></entry></feed>
