<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>Highgroove Studios - Blog - Pit-side with Highgroove</title>
 
 <link href="http://highgroove.com/" />
 <updated>2012-05-16T10:16:07-04:00</updated>
 <id>http://highgroove.com/</id>
 <author>
   <name>Highgroove Studios</name>
   <email>hello@highgroove.com</email>
 </author>

 
   <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/highgroove" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="highgroove" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
     <title>Don't not learn how to code</title>
     <link href="http://highgroove.com/articles/2012/05/16/don%27t-not-learn-how-to-code.html" />
     <updated>2012-05-16T00:00:00-04:00</updated>
     <id>http://highgroove.com/articles/2012/05/16/don%27t-not-learn-how-to-code.html</id>
     <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/nayukim/4039885305"&gt;
&lt;img src="http://farm3.staticflickr.com/2491/4039885305_2e7b20c9af_m.jpg" style="float:right"&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is a new drama in the software development community, and it's about
whether you should &lt;a href="http://learncodethehardway.org/blog/MAY_15_2012.html"&gt;learn to
code&lt;/a&gt; or
&lt;a href="http://www.codinghorror.com/blog/2012/05/please-dont-learn-to-code.html"&gt;not&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I think the best ideas are somewhere in the middle of all the extreme statements
and blog post titles that get upvoted on &lt;a href="http://news.ycombinator.com/"&gt;Hacker
News&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I think &lt;strong&gt;you should learn to "code," but not because it might make you a
"coder"&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;More after the break.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;Learning to create software has been empowering in my life, and is why I'm
currently employed at Highgroove. Almost every day, I deliver some amount of
code as a part of keeping my customers happy.&lt;/p&gt;

&lt;p&gt;That said, as Jeff points out, I'm not delivering code just for the sake of
delivering code: I'm solving a problem.&lt;/p&gt;

&lt;p&gt;Solving problems is what makes customers happy and business commence. Solving
problems is more important than the fact that I usually use software to do it.
I agree with Jeff that there are cases where software is &lt;em&gt;not&lt;/em&gt; the best way to
solve a problem.&lt;/p&gt;

&lt;p&gt;That said, learning to build software taught me how to break down problems into
smaller parts, think about the solutions in terms of algorithms with discrete
steps, and often--though not always--to convert those algorithms into code that
a computer understands and can run through more efficently than any human brain.&lt;/p&gt;

&lt;p&gt;Software forces me to know exactly how to solve a problem, because a &lt;a href="http://en.wikipedia.org/wiki/Garbage_in,_garbage_out"&gt;computer
will only do exactly what I tell it to
do&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Do I always use software to solve problems? &lt;strong&gt;Definitely not&lt;/strong&gt;. But do I often
use the same problem solving techniques that learning to code taught me in
order to solve other problems in my life and work situations? &lt;strong&gt;Definitely
yes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Can folks be taught to solve problems without using computer code? &lt;strong&gt;Definitely
yes&lt;/strong&gt;. But is learning how to "teach" a computer how to solve problems via code
one of the best ways? &lt;strong&gt;I think yes as well&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Even if someone who learned how to "code" never ends up as a "coder"
professionally, they will be much better for having learned to think
algorithmically and in the abstract. However, I bet that knowing how to write a
quick script here and there will make them much more valuable in whatever
profession they choose.&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>How to recruit developers away from Highgroove</title>
     <link href="http://highgroove.com/articles/2012/05/10/how-to-recruit-developers-away-from-highgroove.html" />
     <updated>2012-05-10T00:00:00-04:00</updated>
     <id>http://highgroove.com/articles/2012/05/10/how-to-recruit-developers-away-from-highgroove.html</id>
     <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/dvids/5436644741/"&gt;&lt;img
src="http://farm6.staticflickr.com/5298/5436644741_f52ef64089_m.jpg" style="float:right"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You've read &lt;a href="/blog.html"&gt;our blog&lt;/a&gt;, had Highgroove do &lt;a href="/work/index.html"&gt;work for
you&lt;/a&gt;, watched our &lt;a href="/tech_talks.html"&gt;Tech Talks&lt;/a&gt;, attended the &lt;a
href="http://atlruby.org/"&gt;Atlanta Ruby User Group&lt;/a&gt; which we host, and all around think we're great.&lt;/p&gt;

&lt;p&gt;Now, you've decided that what you really want to do is hire one of our developers full time to work for
you. Maybe you're a recruiter looking to fill an 'awesome position at a big company in the Atlanta area',
or maybe your startup is ready to take the next step and hire an in-house developer.&lt;/p&gt;

&lt;p&gt;We get a &lt;em&gt;lot&lt;/em&gt; of e-mails and calls from recruiters, and to be honest, most of them are absolutely
terrible. Read on for some tips on how to recruit Highgroovers to come work for you instead. Seriously.
&lt;em&gt;Please&lt;/em&gt;. We're not telling you to not try and recruit our developers, but please stop wasting your
time and ours.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;First up, it's Highgroove's job to make our developers happy and to be the place that all developers want
to work. We have a great culture, great benefits, and a bias towards making awesome anything which is not
yet awesome.&lt;/p&gt;

&lt;p&gt;Everyone's motivations for choosing to work at Highgroove are different and our turnover rate is extremely
low, but there is always a chance your 'opportunity' is the one that someone has been waiting for. When
people do choose to leave and go somewhere awesome, we all give them high-fives on the way out. We've had
people leave for Twitter, GitHub, startup incubators, and even a law firm.&lt;/p&gt;

&lt;p&gt;Before you get in touch with anyone, do your homework. Everyone at Highgroove has different skill sets, so
read their profiles on &lt;a href="/about.html"&gt;our About page&lt;/a&gt;, click through to their Twitter accounts,
GitHub accounts, blogs, etc, and find out what their technical skills are and what they are interested in.
One developer might be a good fit for LAMP development in Antarctica, while someone else would be much
better for Erlang in Brooklyn. Your chances of hiring one of us become greater than 0% if you have a
perfect fit for someone. Hint: If you contact several people at once here, you're probably doing it wrong.&lt;/p&gt;

&lt;p&gt;When you've narrowed it down to the perfect fit, don't pick up the phone. Developers are trying to get work
done, don't like being interrupted, and universally hate these kind of phone calls. Send an e-mail, and
make it good. If you want a response, your e-mail must be personal (not a form letter) and include the
following:&lt;/p&gt;

&lt;ul&gt; &lt;li&gt;&lt;em&gt;Company:&lt;/em&gt; If we don't know who we're working for, we're not interested.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Location:&lt;/em&gt; Do we have to move or does remote work? Where?&lt;/li&gt; &lt;li&gt;&lt;em&gt;Salary:&lt;/em&gt; "Based on
experience" doesn't cut it. You're e-mailing us. Give us a range.&lt;/li&gt; &lt;li&gt;&lt;em&gt;Office:&lt;/em&gt; Photos/Video
online of the office somewhere is ideal. A cube farm with the lights off is only appealing to a small set
of people.&lt;/li&gt; &lt;li&gt;&lt;em&gt;Answer: What would I have done?&lt;/em&gt; For our list, head over to &lt;a
href="/jobs.html"&gt;our Jobs page&lt;/a&gt; and read the "If you were with us already, you would have"
section.&lt;/li&gt; &lt;li&gt;&lt;em&gt;Answer: What would I be doing?&lt;/em&gt; 'Rails' isn't enough. What does the job actually
entail?&lt;/li&gt; &lt;li&gt;&lt;em&gt;Answer: Why would I be a good cultural fit?&lt;/em&gt; Coffee? Beer? Bicycles? Boats?&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;This gives someone enough information to find out if they're a good fit. Hopefully, you'll know before you
send the e-mail (or get all the way through this list of requirements) if someone will be a good fit and
your response rate will end up being pretty high.&lt;/p&gt;

&lt;p&gt;Don't ask a developer if they 'have any friends that might fit this position'. That screams "I didn't do my
homework and am just grabbing anyone I can find."&lt;/p&gt;

&lt;p&gt;Do you really really want someone to work for you? Have someone important contact them instead of a
recruiter or someone in HR. All of these are good choices: the person that wrote a programming language
that is on your team, someone who is a popular speaker at conferences, someone that wrote "the book" on
something.&lt;/p&gt;

&lt;p&gt;And that's it! It doesn't seem too hard, but of the 36 e-mails I've personally gotten from recruiters this
year, only one of them has met most of the criteria above. The phone calls (which, by the way, all get
automatically sent to the voicemail box on Google Voice) all get ignored.&lt;/p&gt;

&lt;p&gt;Most of this applies to other tech companies, but if they're not as awesome a place to work as Highgroove,
you might have an easier time recruiting. So good luck! We look forward to your e-mails.&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Debugging Remote Processes With Pry-Remote</title>
     <link href="http://highgroove.com/articles/2012/05/09/remote-pry.html" />
     <updated>2012-05-09T00:00:00-04:00</updated>
     <id>http://highgroove.com/articles/2012/05/09/remote-pry.html</id>
     <content type="html">&lt;p&gt;&lt;img src="https://a248.e.akamai.net/camo.github.com/5770593f71326755ee331f2c9057c2fb8de83fff/687474703a2f2f646c2e64726f70626f782e636f6d2f752f32363532313837352f7072795f6c6f676f5f3335302e706e67" style="float: right;" alt="Pry Logo" width="200" height="142"/&gt;&lt;/p&gt;

&lt;p&gt;Highgroove &lt;em&gt;really&lt;/em&gt; likes &lt;a href="http://pry.github.com/"&gt;Pry&lt;/a&gt;. It's a great tool for digging into your code and seeing what's going on with &lt;a href="http://jonathan-jackson.net/give-it-a-pry"&gt;tons&lt;/a&gt; of great &lt;a href="http://jonathan-jackson.net/2012/05/03/pry-session-102"&gt;features&lt;/a&gt;. However, there are situations where using a standard &lt;code&gt;binding.pry&lt;/code&gt; breakpoint will not block your program and allow you to inspect it. I recently ran into this situation when trying to debug an application that used &lt;a href="https://github.com/ddollar/foreman"&gt;Foreman&lt;/a&gt; to manage it's processes. Luckily, the &lt;a href="https://github.com/Mon-Ouie/pry-remote"&gt;pry-remote&lt;/a&gt; project turned out to be a great solution.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;When a process being run by Foreman hits a regular Pry breakpoint the process will halt, but you will never be able to interact with the Pry session. This effectively freezes the app, forcing you to kill the Foreman process.&lt;/p&gt;

&lt;p&gt;To work around this using pry-remote you must first set it up in your project. First install the gem:&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/2645524.js?file='&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;# Install the gem manually
gem install pry-remote

# or in a Bundler managed application 
# add the following to your test and 
# development groups
gem 'pry-remote'

# Then run bundler
bundle install
&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;Once the gem is installed, you can now add a breakpoint in your application with &lt;code&gt;binding.remote_pry&lt;/code&gt;. When the breakpoint is hit, pry-remote will block your app and open up a DRb endpoint that a client can connect to. Running &lt;code&gt;pry-remote&lt;/code&gt; in a shell will then connect to the session and you'll be able to interact with Pry as you normally would. Simply call &lt;code&gt;exit&lt;/code&gt; in the Pry session to unblock the application.&lt;/p&gt;

&lt;p&gt;Have you picked up any other tips or tricks while using Pry? Leave a comment below!&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>So you thought ROWE would be easy?</title>
     <link href="http://highgroove.com/articles/2012/05/08/so-you-thought-rowe-would-be-easy%3F.html" />
     <updated>2012-05-08T00:00:00-04:00</updated>
     <id>http://highgroove.com/articles/2012/05/08/so-you-thought-rowe-would-be-easy%3F.html</id>
     <content type="html">&lt;p&gt;&lt;img src="http://farm4.staticflickr.com/3515/3463493706_1a3012273c_n.jpg" style="float: right" /&gt;&lt;/p&gt;

&lt;p&gt;I'm just a week into my first &lt;em&gt;real&lt;/em&gt; job and I feel like the luckiest person in the world.  Many people fresh out of graduate school still have to "pay their dues" at a company that values being in your cube by 8:00 am even if you were up until 1 last night getting another report finished.  While graduate school is essentially a ROWE, there are still expectations to be in a chair from 9:00 - 5:30 (at least in my lab there were).  While having the freedom to work when you want and how you want is amazing, it doesn't come without growing pains.  After a couple of years of getting judged based on time in the lab, it's hard to remember that it's what I get done that matters and not when I do it.  Read through to see how I managed to commit what would be a serious faux pas in any workplace other than a ROWE: I took a day off in my first week.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;Only in a results environment is it ok for a new employee to go to a wedding in their first week.  While I didn't actually take the day off since I was still responsible for my tasks, it's refreshing to be able to work on a plane, hotel, airport or anywhere else I can get work done.  It tells me that my employer hired me because they trust me to do my job.  In a traditional workplace, I may have not been able to get a day off for 6 weeks, but in a ROWE where time doesn't matter it was business as usual.&lt;/p&gt;

&lt;p&gt;But enough about ROWE.  This first week has been occupied mostly with pairings, which is a perfect method for introducing the new-guy to all of the projects and techniques used by others in the office.  I've learned about the tools that other developers use (&lt;a href="http://not-so-secret-sauce.highgroove.com/topics/software-for-developers.html"&gt;some software we recommend&lt;/a&gt;) and was even able to get my hands a little dirty adding a feature to one of our non-profit projects (&lt;a href="http://www.beltlinebikeshop.org/bike-spot-app/"&gt;Bike Spot&lt;/a&gt;).  In between pairings I've been hacking on our chatbot "Groovebot" (really, it's &lt;a href="http://hubot.github.com/"&gt;Hubot&lt;/a&gt;) so it can give us a radar image to help us better time our bike commutes home and &lt;a href="https://github.com/github/hubot-scripts/commit/f1925bd0c4bea2710520b5ace6da293c2a806bad"&gt;it can even tell you a little about that beer you just heard about&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Everyone here has been amazingly helpful to me and have made my first job as a software developer a dream.  This is a fantastic group of smart people and I look forward to all of the projects I get to work on with them in the future.&lt;/p&gt;

&lt;p&gt;Image from Flickr user &lt;a href="http://www.flickr.com/photos/acf_windy/3463493706/"&gt;windy_&lt;/a&gt;&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Why we Turn Down over 89 Percent of Developers Who Apply</title>
     <link href="http://highgroove.com/articles/2012/05/07/why-we-turn-down-over-89-percent-of-developers-who-apply.html" />
     <updated>2012-05-07T00:00:00-04:00</updated>
     <id>http://highgroove.com/articles/2012/05/07/why-we-turn-down-over-89-percent-of-developers-who-apply.html</id>
     <content type="html">&lt;p&gt;&lt;img src="http://highgroove.com/images/rock_and_roll_rockstar_ninja.png" style="float: right" /&gt;&lt;/p&gt;

&lt;p&gt;It's true.  We're hiring.  Like a lot of technology companies.  But, did you know that we are turning down many qualified applicants?  Since we started tracking, only 11% of applicants who go through our hiring process become "Hired Full Time" employees of Highgroove.  That means about 1 in 10 who apply receive an offer letter.  Why is it we can -- or rather why we &lt;em&gt;have&lt;/em&gt; to be so picky in who we hire?&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;Hiring is hard.  Ask any growing company or entrepreneur (or a team of entrepreneuring developers) what's their hardest challenge and they'll tell you -- it's hiring the right people.&lt;/p&gt;

&lt;p&gt;As President of Highgroove, my entire function is to put the right people on the bus, and that means both developers and clients.  Many of our clients (and soon-to-be-clients) recognize that our secret sauce (the parts that we haven't published on our &lt;a href="http://not-so-secret-sauce.highgroove.com"&gt;not-so-secret-sauce site for software companies&lt;/a&gt;) is what makes us awesome.  It's what makes us a tremendous value for smart CTOs looking to gain an edge in building ruby and rails backed web applications.  So with all this demand for development, why are we turning folk down?&lt;/p&gt;

&lt;p&gt;It really comes down to culture.  Highgroove has a unique company culture that cannot be bent or compromised by bringing unqualified people on the team.  It's one of our competitive advantages, and to quote David Cummings:&lt;/p&gt;

&lt;blockquote&gt;Corporate culture is the only sustainable competitive advantage that is completely within the control of the entrepreneur. Develop a strong corporate culture first and foremost.&lt;/blockquote&gt;


&lt;p&gt;-- &lt;a href="http://davidcummings.org/2011/12/07/the-top-3-things-every-entrepreneur-needs-to-know/"&gt;The Top 3 Things Every Entrepreneur Needs to Know&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This culture is impossible to summarize in a sentence or blurb, but is quantified in numerous ways from our "Bias Towards Action" mantra, to our values we reiterate consistently in our &lt;a href="http://highgroove.com/faq.html#the-award"&gt;Highgroove Award&lt;/a&gt;, to even how we structure the company.&lt;/p&gt;

&lt;p&gt;"Having a great company culture" isn't even new in the management world.  It's not unique to technology companies, either.  This is why we promote competitive events like a &lt;a href="https://www.facebook.com/events/299830086760223/"&gt;Latte Art Competition&lt;/a&gt;, &lt;a href="http://highgroove.com/articles/2012/02/21/why-highgroove-has-a-personal-trainer.html"&gt;hiring a personal trainer on-staff&lt;/a&gt;, and &lt;a href="http://fastermustache.org/node/7678"&gt;sponsoring a bicycle race/club team&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To make sure we're a good fit, we use a variety of tools including a hiring process centered around Topgrading (&lt;a href="http://www.amazon.com/Topgrading-Leading-Companies-Coaching-Keeping/dp/1591840813"&gt;Topgrading: The Secret to Hiring A Players&lt;/a&gt;), and hyper-focused on the culture fit equation.  No, we don't have any silly programming challenges that don't mean anything to anyone except the interviewee trying to prove how smart they are.&lt;/p&gt;

&lt;p&gt;So, it's not enough for a potential candidate to be a programming "expert" -- in fact, it's not even mandatory that a candidate be a Ruby/Rails guru.  We're not hiring for that.  We're hiring professionals who fit our culture.  If a candidate aligns with our company culture (and they'll find out quickly in our extensive, in-depth hiring process), interviews with us, and makes it on-board, they'll be doing Ruby and Rails their first day.  And in our bootcamp, once on-board, they'll learn more of the Right Way to do development, and be doing client work and internal work soon there after.&lt;/p&gt;

&lt;p&gt;Are you curious if you would be a good fit at Highgroove?  &lt;a href="http://highgroove.com/contact.html"&gt;Send us&lt;/a&gt; your github username, and we'll point you to &lt;a href="http://highgroove.com/jobs.html"&gt;the next step&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Image Credit: balloo from f0nq.com &lt;a href="http://www.f0nq.com/8/rock-and-roll-surf-ninja"&gt;http://www.f0nq.com/8/rock-and-roll-surf-ninja&lt;/a&gt;&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Use Ruby to Generate Formatted Excel Documents</title>
     <link href="http://highgroove.com/articles/2012/05/01/use-ruby-to-generate-formatted-excel-documents.html" />
     <updated>2012-05-01T00:00:00-04:00</updated>
     <id>http://highgroove.com/articles/2012/05/01/use-ruby-to-generate-formatted-excel-documents.html</id>
     <content type="html">&lt;p&gt;&lt;img src="https://img.skitch.com/20120502-cia8454635sdcq5unykceb52fd.png" style="float: right" /&gt;&lt;/p&gt;

&lt;p&gt;The latest version of Ruby comes standard now with Comma Separated Value support built right in via the &lt;a href="http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV.html"&gt;CSV
library&lt;/a&gt; written by one of our very own alumni, &lt;a href="http://highgroove.com/about/james.html"&gt;James Edward Gray II&lt;/a&gt;.  You might know CSV as the extremely portable format file used for everything from Excel Documents, to Numbers Spreadsheets, to lists of emails, to even generic data files.  The CSV library is quite generic and useful by itself, but sometimes, you really need the expanded capabilities that only an Excel or Numbers document can support.  Read on to find out how to generate Excel and Numbers compatible .xlsx files with Ruby.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;Another Highgroove alumnus, &lt;a href="http://highgroove.com/about/emily.html"&gt;Emily Price&lt;/a&gt;,
recently introduced me to &lt;a href="https://github.com/randym/axlsx"&gt;axlsx&lt;/a&gt;, a Ruby gem
which generates "Office Open XML Spreadsheet documents."
&lt;a href="https://github.com/randym/axlsx"&gt;axlsx&lt;/a&gt; provides support for charts, images
(with links), automated and fixed column widths, customized styles, functions,
merged cells, and more.&lt;/p&gt;

&lt;p&gt;It is super simple to get started.  Let's check out a few of the features.&lt;/p&gt;

&lt;p&gt;First, if you plan to use the generated file with Numbers, make sure to set
"use_shared_strings" to true.&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/2573219.js?file='&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;require 'axlsx'
p = Axlsx::Package.new

# Required for use with numbers
p.use_shared_strings = true&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;Next, after creating a workbook via a block, we'll set up some styles to use
later.&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/2573223.js?file='&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;p.workbook do |wb|
  # define your regular styles
  styles = wb.styles
  title = styles.add_style :sz =&amp;gt; 15, :b =&amp;gt; true, :u =&amp;gt; true
  default = styles.add_style :border =&amp;gt; Axlsx::STYLE_THIN_BORDER
  pascal_colors = { :bg_color =&amp;gt; '567DCC', :fg_color =&amp;gt; 'FFFF00' }
  pascal = styles.add_style pascal_colors.merge({ :border =&amp;gt; Axlsx::STYLE_THIN_BORDER, :b =&amp;gt; true })
  header = styles.add_style :bg_color =&amp;gt; '00', :fg_color =&amp;gt; 'FF', :b =&amp;gt; true
  money = styles.add_style :format_code =&amp;gt; '#,###,##0', :border =&amp;gt; Axlsx::STYLE_THIN_BORDER
  money_pascal = styles.add_style pascal_colors.merge({ :format_code =&amp;gt; '#,###,##0', :border =&amp;gt; Axlsx::STYLE_THIN_BORDER })
  percent = styles.add_style :num_fmt =&amp;gt; Axlsx::NUM_FMT_PERCENT, :border =&amp;gt; Axlsx::STYLE_THIN_BORDER
  percent_pascal = styles.add_style pascal_colors.merge({ :num_fmt =&amp;gt; Axlsx::NUM_FMT_PERCENT, :border =&amp;gt; Axlsx::STYLE_THIN_BORDER })
&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;Next, we'll create a worksheet for and add a few rows.  Note that the worksheet
name is limited to 31 characters.&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/2573225.js?file='&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;  wb.add_worksheet(:name =&amp;gt; 'Data Bar Conditional Formatting') do  |ws|
    ws.add_row ['A$$le Q1 Revenue Historical Analysis (USD)'], :style =&amp;gt; title
    ws.add_row
    ws.add_row ['Quarter', 'Profit', '% of Total'], :style =&amp;gt; header
    # Passing one style applies the style to all columns
    ws.add_row ['Q1-2010', '15680000000', '=B4/SUM(B4:B7)'], :style =&amp;gt; pascal
&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;Finally, we add a few rows using custom styles for each column, merge some of
the title cells, and then serialize the file out to disk!&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/2573241.js?file='&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;    # Otherwise you can specify a style for each column.
    ws.add_row ['Q1-2011', '26740000000', '=B5/SUM(B4:B7)'], :style =&amp;gt; [pascal, money_pascal, percent_pascal]
    ws.add_row ['Q1-2012', '46330000000', '=B6/SUM(B4:B7)'], :style =&amp;gt; [default, money, percent]
    ws.add_row ['Q1-2013(est)', '72230000000', '=B7/SUM(B4:B7)'], :style =&amp;gt; [default, money, percent]

    # You can merge cells!
    ws.merge_cells 'A1:C1'

  end
end
p.serialize 'getting_barred.xlsx'
&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;Here's the completed example.&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/2572993.js?file='&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;# adapted from http://axlsx.blogspot.com/, https://gist.github.com/2484520
require 'axlsx'
p = Axlsx::Package.new

# Required for use with numbers
p.use_shared_strings = true

p.workbook do |wb|
  # define your regular styles
  styles = wb.styles
  title = styles.add_style :sz =&amp;gt; 15, :b =&amp;gt; true, :u =&amp;gt; true
  default = styles.add_style :border =&amp;gt; Axlsx::STYLE_THIN_BORDER
  pascal_colors = { :bg_color =&amp;gt; '567DCC', :fg_color =&amp;gt; 'FFFF00' }
  pascal = styles.add_style pascal_colors.merge({ :border =&amp;gt; Axlsx::STYLE_THIN_BORDER, :b =&amp;gt; true })
  header = styles.add_style :bg_color =&amp;gt; '00', :fg_color =&amp;gt; 'FF', :b =&amp;gt; true
  money = styles.add_style :format_code =&amp;gt; '#,###,##0', :border =&amp;gt; Axlsx::STYLE_THIN_BORDER
  money_pascal = styles.add_style pascal_colors.merge({ :format_code =&amp;gt; '#,###,##0', :border =&amp;gt; Axlsx::STYLE_THIN_BORDER })
  percent = styles.add_style :num_fmt =&amp;gt; Axlsx::NUM_FMT_PERCENT, :border =&amp;gt; Axlsx::STYLE_THIN_BORDER
  percent_pascal = styles.add_style pascal_colors.merge({ :num_fmt =&amp;gt; Axlsx::NUM_FMT_PERCENT, :border =&amp;gt; Axlsx::STYLE_THIN_BORDER })

  wb.add_worksheet(:name =&amp;gt; 'Data Bar Conditional Formatting') do  |ws|
    ws.add_row ['A$$le Q1 Revenue Historical Analysis (USD)'], :style =&amp;gt; title
    ws.add_row
    ws.add_row ['Quarter', 'Profit', '% of Total'], :style =&amp;gt; header
    # Passing one style applies the style to all columns
    ws.add_row ['Q1-2010', '15680000000', '=B4/SUM(B4:B7)'], :style =&amp;gt; pascal

    # Otherwise you can specify a style for each column.
    ws.add_row ['Q1-2011', '26740000000', '=B5/SUM(B4:B7)'], :style =&amp;gt; [pascal, money_pascal, percent_pascal]
    ws.add_row ['Q1-2012', '46330000000', '=B6/SUM(B4:B7)'], :style =&amp;gt; [default, money, percent]
    ws.add_row ['Q1-2013(est)', '72230000000', '=B7/SUM(B4:B7)'], :style =&amp;gt; [default, money, percent]

    # You can merge cells!
    ws.merge_cells 'A1:C1'

  end
end
p.serialize 'getting_barred.xlsx'
&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;If you're an auditory learner, you can check out my &lt;a href="http://vimeo.com/41167729"&gt;tech-talk on
axlsx&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To learn more, check out the &lt;a href="http://axlsx.blogspot.com/"&gt;axlsx blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What are some other Ruby gems you love to use?&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Finish Weekend ATL</title>
     <link href="http://highgroove.com/articles/2012/04/30/finish-weekend-atl.html" />
     <updated>2012-04-30T00:00:00-04:00</updated>
     <id>http://highgroove.com/articles/2012/04/30/finish-weekend-atl.html</id>
     <content type="html">&lt;p&gt;&lt;img src="https://img.skitch.com/20120430-qj63t41x3hnaiw56dsagwtw9ae.jpg"&gt;&lt;/p&gt;

&lt;p&gt;Highgroove Studios is proud to be helping Collective Idea bring Finish Weekend to Atlanta this June:&lt;/p&gt;

&lt;blockquote&gt;We've all heard of startup weekends. Many of us have participated in one. Coming up with a new idea is easy, so is getting started. Finishing is hard. Finish Weekend helps you get it done. Come finish those projects you've put off to the side. Maybe you just need a bit of web help, a logo, or some code written. We'll help you finish.&lt;/blockquote&gt;


&lt;p&gt;Head on over to &lt;a href="https://www.finishweekend.com/#"&gt;finishweekend.com&lt;/a&gt; to register, and then come join us the first weekend of June to get your project launched.&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Rails Needs to Make JSON Serialization Easier</title>
     <link href="http://highgroove.com/articles/2012/04/26/rails-needs-to-make-json-serialization-easier.html" />
     <updated>2012-04-26T00:00:00-04:00</updated>
     <id>http://highgroove.com/articles/2012/04/26/rails-needs-to-make-json-serialization-easier.html</id>
     <content type="html">&lt;p&gt;&lt;img
src="https://img.skitch.com/20120427-8qkq4mqbje5h76cp68aaw8p1q1.jpg"
style="float: right" /&gt;&lt;/p&gt;

&lt;p&gt;As the web continues to mature, JSON APIs (and XML if you're into that)
have become increasingly important. But if you've tried to use Rails to
write an API recently, you know there are a handful of competing
methods and gems focused on making this better. I'm all for
interchangable libraries, but, as &lt;a href="https://github.com/wycats"&gt;Yehuda Katz&lt;/a&gt; pointed out in his recent
talk at RailsConf, Rails needs a "convention over configuration" approach
to solving the JSON serialization problem once and for all. So I was
pretty excited when I heard about &lt;a href="https://github.com/josevalim"&gt; Jose Valim's&lt;/a&gt; &lt;a href="https://github.com/josevalim/active_model_serializers/"&gt;ActiveModel::Serializer&lt;/a&gt;.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;Instead of dealing with JSON views or presenters,
ActiveModel::Serializer adds a new layer between rendering JSON in a
controller and defining a custom to_json method. Now when rendering JSON
in a controller Rails will look for a Serializer for the matching model
and defer to that for generating the payload. Here are some examples to
get you up and running.&lt;/p&gt;

&lt;p&gt;We can start with a really simple Cat model.&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/2512254.js?file='&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;class Cat &amp;lt; ActiveRecord::Base
  attr_accessible :name, :mood, :owner_id

  has_one :owner
end&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;Now lets write a controller action. Not really anything exciting yet.&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/2512267.js?file='&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;class CatsController &amp;lt; ApplicationController
  respond_to :json

  def index
    respond_with Cat.all
  end
end&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;OK so here's where the magic happens. Let's say we want to change up the
JSON a little bit. For example we want to include the owner's attributes as well. Well that's super
easy. Just make a CatSerializer in app/serializers like this.&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/2512356.js?file='&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;class CatSerializer &amp;lt; ApplicationSerializer
  attributes :id, :name, :mood

  has_one :owner
end&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;Now look how our JSON response has changed!&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/2512944.js?file='&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;/* Standard */

[
  {
    &amp;quot;id&amp;quot;: 1,
    &amp;quot;name&amp;quot;: &amp;quot;Felix&amp;quot;,
    &amp;quot;mood&amp;quot;: &amp;quot;crazy&amp;quot;
  },
  {
    &amp;quot;id&amp;quot;: 2,
    &amp;quot;name&amp;quot;: &amp;quot;Gorbachev&amp;quot;,
    &amp;quot;mood&amp;quot;: &amp;quot;awesome&amp;quot;
  }
]

/* With a Custom Serializer */

{
  &amp;quot;cats&amp;quot;: [
    {
      &amp;quot;id&amp;quot;: 1,
      &amp;quot;name&amp;quot;: &amp;quot;Felix&amp;quot;,
      &amp;quot;mood&amp;quot;: &amp;quot;crazy&amp;quot;,
      &amp;quot;owner&amp;quot;: { &amp;quot;id&amp;quot;: 5, &amp;quot;name&amp;quot;: &amp;quot;Pat Sullivan&amp;quot; }
    },
    {
      &amp;quot;id&amp;quot;: 2,
      &amp;quot;name&amp;quot;: &amp;quot;Gorbachev&amp;quot;,
      &amp;quot;mood&amp;quot;: &amp;quot;awesome&amp;quot;,
      &amp;quot;owner&amp;quot;: { &amp;quot;id&amp;quot;: 6, &amp;quot;name&amp;quot;: &amp;quot;Aaron Patterson&amp;quot; }
    }
  ]
}&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;This isn't a very radical change in how some of the other decorator gems
work, but I think it does a really good job at making serialization a
first class citizen. Also the fact that it was built by 2 Rails core
members probably gives it the best chance for some day being included
in all Rails apps be default. Now they just need to convince DHH that
it's a better approach than using JSON views with &lt;a href="https://github.com/rails/jbuilder"&gt;Jbuilder&lt;/a&gt;. :P&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>RailsConf 2012</title>
     <link href="http://highgroove.com/articles/2012/04/24/railsconf-2012.html" />
     <updated>2012-04-24T00:00:00-04:00</updated>
     <id>http://highgroove.com/articles/2012/04/24/railsconf-2012.html</id>
     <content type="html">&lt;p&gt;&lt;img src="https://img.skitch.com/20120423-qxti8jrspfq7pkxs6p81ic8tei.png" alt="RailsConf 2012" width="400px" height="115px" /&gt;&lt;/p&gt;

&lt;p&gt;Highgroove sent me, &lt;a href="http://highgroove.com/about/jonathan.html" title="Jonathan Wallace"&gt;Jonathan&lt;/a&gt;, and &lt;a href="http://highgroove.com/about/patrick.html" title="Patrick Van Stee"&gt;Patrick&lt;/a&gt; to &lt;a href="http://railsconf2012.com/" title="RailsConf"&gt;RailsConf
2012&lt;/a&gt;. I've been learning a lot by going to some great talks and
enjoying talking to my fellow Rails developers. If you see any of us, feel free
to say hello!&lt;/p&gt;

&lt;p&gt;There's a big push to make this the most public RailsConf ever, so all talks are
being recorded. On top of that, I have also been trying to take notes and make
them public.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;I've looked around on where to best put my efforts of note taking, and I found
the repository of notes started by &lt;a href="http://newhavenrb.org/" title="New Haven RB"&gt;newhaven.rb&lt;/a&gt;. After a good pull
request, they've given me push/pull access, which is awesome! You can check the
notes out on &lt;a href="https://github.com/newhavenrb/railsconf2012/wiki" title="Collaborative Notes"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So what kinds of awesome talks have I attended so far?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keynote by &lt;a href="https://twitter.com/dhh" title="@dhh"&gt;DHH&lt;/a&gt; about not being scared of progress&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/steveklabnik" title="@steveklabnik"&gt;Steve Klabnik's&lt;/a&gt; talk on Designing Hypermedia APIs&lt;/li&gt;
&lt;li&gt;Practical Machine Learning &amp;amp; Rails&lt;/li&gt;
&lt;li&gt;Ruby on Rails on YOUR ROOMBA!&lt;/li&gt;
&lt;li&gt;Scaling &lt;a href="http://stillalive.com/" title="Still Alive"&gt;StillAlive&lt;/a&gt; from a RailsRumble project to 50,000+ users&lt;/li&gt;
&lt;li&gt;Building realtime web apps with streaming REST&lt;/li&gt;
&lt;li&gt;Keynote by &lt;a href="https://twitter.com/richhickey" title="@richhickey"&gt;Rich Hickey&lt;/a&gt; (developer of Clojure) on simplicity&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;It's been fantastic RailsConf so far, and I'm looking forward to the rest of it.&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Live from Startup Weekend Atlanta</title>
     <link href="http://highgroove.com/articles/2012/04/21/live-from-startup-weekend-atlanta.html" />
     <updated>2012-04-21T00:00:00-04:00</updated>
     <id>http://highgroove.com/articles/2012/04/21/live-from-startup-weekend-atlanta.html</id>
     <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/highgroove/7098962491/" title="Startup Weekend Atlanta by highgroove, on Flickr"&gt;&lt;img src="http://farm8.staticflickr.com/7260/7098962491_4077dec0e4_m.jpg" width="240" height="180" alt="Startup Weekend Atlanta" align="right"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://atlanta.startupweekend.org/"&gt;Startup Weekend in Atlanta&lt;/a&gt; kicked off last night with over 116 participants, and 48 pitches, eventually forming into 18 teams.  The concept behind Startup Weekend is to start something up -- a concept, business, or idea, over the weekend.  It's centered around technology, with people dividing themselves into categories like: "business folk", "designers", "developers", and other niches.  Yup, there was a technology lawyer, there too.&lt;/p&gt;

&lt;p&gt;What kinds of ideas are being worked on right now?&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;&lt;a href="http://www.flickr.com/photos/highgroove/7098962283/" title="Startup Weekend Atlanta by highgroove, on Flickr"&gt;&lt;img src="http://farm8.staticflickr.com/7076/7098962283_e1dcca1e9a_m.jpg" width="240" height="180" alt="Startup Weekend Atlanta" align="right"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I took quick notes on all the pitches, and here are some trends:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Crowdsourcing&lt;/em&gt; - ideas pitched on crowd-sourced recipes, carpooling, ticket/event booking, and educational ideas&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Gamification&lt;/em&gt; - making a game out of education, fantasy sports (fantasy daily sports),&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Photo sharing&lt;/em&gt; - and even photo manipulation around faces (think: a light version of photoshop to make you look sexy)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Jobs and finding talent&lt;/em&gt; - ideas were pitched on eliminating recruiting&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Online Dating&lt;/em&gt; - and to an extent, verifying who is who, and finding folk through your social network&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;The micro trend of the night (in my opinion) was: "making something sexy" -- be it "sexy discounted cash flows" (best pitch of the night), your own photo of yourself, and even one team wanting help making their Ruby on Rails app sexy!&lt;/p&gt;

&lt;p&gt;We're happy to be a part of this event, as sponsors, along with friends &lt;a href="http://www.mailchimp.com"&gt;Mailchimp&lt;/a&gt;, &lt;a href="http://www.pardot.com"&gt;Pardot&lt;/a&gt;, &lt;a href="http://www.appcelerator.com"&gt;Appcelerator&lt;/a&gt;, &lt;a href="http://www.peer1.com/"&gt;Peer1 Hosting&lt;/a&gt;, and even &lt;a href="http://www.microsoft.com"&gt;Microsoft&lt;/a&gt; to name a few!&lt;/p&gt;

&lt;p&gt;Stop by our table and say hello, if you're around!&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>The Beltline Bike Shop 'Bike Rack Locator' App</title>
     <link href="http://highgroove.com/articles/2012/04/21/beltline-bikeshop-app.html" />
     <updated>2012-04-21T00:00:00-04:00</updated>
     <id>http://highgroove.com/articles/2012/04/21/beltline-bikeshop-app.html</id>
     <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/twotone666/7103728299/" title="The Beltline Bikeshop App! by twotoneatl, on Flickr"&gt;&lt;/a&gt;&lt;img src="http://farm8.staticflickr.com/7050/7103728299_7ba7bd0602_m.jpg" width="240" height="240" alt="The Beltline Bikeshop App!"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Beltline Bikeshop App, &lt;a href="http://www.beltlinebikeshop.org/bike-spot-app/"&gt;Bike Spot&lt;/a&gt;, is LIVE and available to install on your iOS device!&lt;/p&gt;

&lt;p&gt;If you know us, you know we love bikes here at Highgroove.  Any cyclist in Atlanta has encountered the 'parking' headache of looking for a spot, much less a rack to lock to while getting around on two wheels. Bike Spot is a bike rack locator designed to track, record, and locate bike racks around town.&lt;/p&gt;

&lt;p&gt;Sounds awesome, right? "But how can I use it?" you ask.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;&lt;a href="http://www.flickr.com/photos/twotone666/7049689515/" title="RT @Beltline_Bike: Thank you @highgroove for your help with the Bike rack locator app. http://t.co/FVUv0IwH // Shop looks great! by twotoneatl, on Flickr"&gt;&lt;/a&gt;&lt;img src="http://farm6.staticflickr.com/5279/7049689515_cbc139dbd3_m.jpg" width="240" height="240" alt="RT @Beltline_Bike: Thank you @highgroove for your help with the Bike rack locator app. http://t.co/FVUv0IwH // Shop looks great!"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So imagine you're about to embark on a bike ride, and wondering where the nearest bike rack will be. Here's how the Bike Spot app works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Look for the nearest bike rack at your destination&lt;/em&gt; -  Simply open the app and allow it to pinpoint your location&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Zoom in/out to find the for the closest rack&lt;/em&gt; - More are being added regularly but maybe your favorite rack isn't included yet. Add it!&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Find a new rack, photograph it&lt;/em&gt; - The app makes it easy snap a photo of any bike parking&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Promote the app!&lt;/em&gt; - This app isn't only for Atlanta.  Its merits apply in any city, any town, anywhere!&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;a href="saportareport.com/blog/2012/02/bicycle-commuting-in-atlanta-on-the-rise/"&gt;Bicycle commuting in Atlanta grew faster than anywhere else in the United States&lt;/a&gt; and its no secret that cycling is a positive, healthy way to get from point A to point B!&lt;/p&gt;

&lt;p&gt;We're honored to have had the opportunity to contribute to this collaborative On The House project between with &lt;a href="http://www.hybr-id.com/"&gt;Hybrid Design&lt;/a&gt;, &lt;a href="http://highgroove.com/"&gt;several Highgroovers, namely Daniel &amp;amp; Andy&lt;/a&gt;, &lt;a href="http://matchstic.com"&gt;Matchstic&lt;/a&gt; and the Beltline Bikeshop! A few weeks ago, we swung by the &lt;a href="http://www.beltlinebikeshop.org/"&gt;Beltline Bikeshop&lt;/a&gt; to celebrate the app's completion and to check out the shop.  The Beltline Bike Shop is a tremendous asset for Atlanta and Highroove was excited to lend a hand to such a great cause. At the shop, the take donated bikes and invite kids in Southwest Atlanta to earn a bike of their own through community service. More info &lt;a href="http://www.beltlinebikeshop.org/about/#power-of-a-bike"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Visit their &lt;a href="http://www.beltlinebikeshop.org/bike-spot-app/"&gt;website&lt;/a&gt; to learn more about the app, or download it from the &lt;a href="http://itunes.apple.com/us/app/bike-spot/id516923703?ls=1&amp;amp;mt=8"&gt;app store&lt;/a&gt;!
Download the here or in the app store.&lt;/p&gt;

&lt;p&gt;Do your favorite businesses have bike racks? Are they listed in the Bike Spot app yet?&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Edge Sunspot: Native Geospatial Searches</title>
     <link href="http://highgroove.com/articles/2012/04/17/edge-sunspot%3A-native-geospatial-searches.html" />
     <updated>2012-04-17T00:00:00-04:00</updated>
     <id>http://highgroove.com/articles/2012/04/17/edge-sunspot%3A-native-geospatial-searches.html</id>
     <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/gsfc/5510488494/"&gt;
  &lt;img src="http://farm6.staticflickr.com/5297/5510488494_03cefcb27a_m.jpg" alt="Sunspot" style="float: right"/&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/sunspot/sunspot"&gt;Sunspot&lt;/a&gt;, a Ruby interface for Solr
usually backed by ActiveRecord objects, recently introduced native geospatial
searching capability in the &lt;code&gt;master&lt;/code&gt; branch (currently a 2.0.0 prerelease).&lt;/p&gt;

&lt;p&gt;While the functionality has not been released as a stable version yet, I felt
that a blog post introducing the features is appropriate with the hope that
folks will try it out and give feedback!&lt;/p&gt;

&lt;p&gt;Read on for a short example.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;Imagine a Rails application has an &lt;code&gt;Office&lt;/code&gt; model that, among other things,
describes the location of a company's office. Through some other means (maybe
&lt;a href="http://en.wikipedia.org/wiki/Geocoding"&gt;geocoding&lt;/a&gt;), the application
determines and stores the latitude and longitude of each office as &lt;code&gt;#latitude&lt;/code&gt;
and &lt;code&gt;#longitude&lt;/code&gt;, respectively.&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/2410743.js?file=office1.rb'&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;class Office &amp;lt; ActiveRecord::Base
end

# .. for example ..
o = Office.create(latitude: 32, longitude: -86)
&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;Setting up the Rails application to use Sunspot and Solr is easy, &lt;a href="https://github.com/sunspot/sunspot/blob/master/README.md"&gt;as described
in the README&lt;/a&gt;, so
this post won't explictly cover it. To get these new features, though, make
sure to use a 2.0.0 prerelease (e.g., &lt;code&gt;gem 'sunspot_rails', '~&amp;gt;2.0.0.pre'&lt;/code&gt;).
After setup, the &lt;code&gt;Office&lt;/code&gt; model can be made searchable with:&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/2410743.js?file=office2.rb'&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;class Office &amp;lt; ActiveRecord::Base
  searchable do
    latlon(:location) { Sunspot::Util::Coordinates.new(latitude, longitude) }
  end
end&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;When new offices are created and saved, they are also indexed in Solr. The
&lt;code&gt;#latitude&lt;/code&gt; and &lt;code&gt;#longitude&lt;/code&gt; attributes are combined into a &lt;code&gt;latlon&lt;/code&gt; typed
field. &lt;code&gt;latlon&lt;/code&gt; fields are specially indexed in Solr to respond efficiently to
geospatial queries.&lt;/p&gt;

&lt;p&gt;Now, it's easy to search for offices within a specified area:&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/2410743.js?file=office3.rb'&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;# Offices within 100 kilometers of (32, -68)
Office.search { with(:location).in_radius(32, -68, 100) }

# Offices within a bounding box of 100 kilometers from (32, -68)
# A bounding box may include areas beyond 100 kilometers of
# (32, -68) so offices may be returned that are outside the
# desired region; however, the search may be more performant.
Office.search { with(:location).in_radius(32, -68, 100, bbox: true) }&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;It's also easy to sort results by closeness to a point:&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/2410743.js?file=office4.rb'&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;Office.search { order_by_geodist(:location, 32, -68) }&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;There are a few more details in the
&lt;a href="https://github.com/sunspot/sunspot/blob/master/README.md"&gt;README&lt;/a&gt;. To
reiterate, these features are only in a prerelease version at this point
(&lt;code&gt;~&amp;gt;2.0.0.pre&lt;/code&gt;) and require Solr &gt;= 3.1.&lt;/p&gt;

&lt;p&gt;If you have any feedback, please &lt;a href="https://github.com/sunspot/sunspot/issues"&gt;file an
issue&lt;/a&gt;.&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Essential Developer Tools</title>
     <link href="http://highgroove.com/articles/2012/04/12/essential-developer-tools.html" />
     <updated>2012-04-12T00:00:00-04:00</updated>
     <id>http://highgroove.com/articles/2012/04/12/essential-developer-tools.html</id>
     <content type="html">&lt;p&gt;Read on for why you should be using a combination of Sublime Text 2 and Vim instead of Textmate…&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.flickr.com/photos/arpy/3440289156/"&gt;&lt;img src="http://farm4.staticflickr.com/3628/3440289156_f6e1a56e3a_n.jpg" style="float: right;" alt="Sharks with Lasers"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;LOLJK.  The tool you should use is the tool which is best suited for &lt;em&gt;you&lt;/em&gt; to solve the problem at hand.  There is no one right tool that everyone should be using.  We could go on and on about different editors as that is something that developers are very passionate about but the fact is that each developer at Highgroove has a different set of software that they use to get their job done.  We have a recommended list of &lt;a href="http://not-so-secret-sauce.highgroove.com/topics/software-for-developers.html"&gt;Software for Developers&lt;/a&gt; that can be pretty useful, but to each their own! Part of everyone's job description is:&lt;/p&gt;

&lt;blockquote&gt;Buy any tool that you think might be useful, Highgroove will reimburse you, and you must present to the team how your experiment works out and if the tool makes you more productive.&lt;/blockquote&gt;


&lt;p&gt;Software aside, Highgroove has a policy of buying the best tools available for developers, and there is a short list of things that we think are absolutely crucial for keeping developers happy and cranking out high-quality software.  Some people argue that you should penny-pinch in every aspect of your business, but with our goal of developer happiness, we disagree.&lt;/p&gt;

&lt;p&gt;Physical comfort comes first!  While our &lt;a href="http://highgroove.com/articles/2012/02/21/why-highgroove-has-a-personal-trainer.html"&gt;personal trainer&lt;/a&gt; goes a long way,  we have an office full of Aeron chairs and adjustable height desks.  An ergonomic evaluation is happening in a few weeks, and we'll be figuring out how to make our sitting and standing desks more comfortable. Every desk has a laptop stand and a big external monitor (Currently 24" Dell 1920x1200 displays, but we have one Apple Thunderbolt 27" display that everyone is trying out), and everyone gets an external keyboard and mouse or trackpad of their choosing.&lt;/p&gt;

&lt;p&gt;Also very important to productivity and happiness is a top-of-the-line laptop.  SSDs and maxing out RAM are both great for running huge test suites and working with Big Data,  and while it seems most of us end up with 15" MacBook Pros, we'd let someone scoop up something else if it works better for them.  Laptops enable working from anywhere,  and we're all pretty used to seeing photos from people 'ROWEing' it from decks, patios, the beach, etc.  Just yesterday I was on a Skype call with someone that was working from their bathtub at home.  If WiFi doesn't reach, we have a Clear Spot 4G and pay for iPhone tethering as needed.&lt;/p&gt;

&lt;p&gt;We know we can't think of everything, so when someone at Highgroove wants something to help them work, we make it happen.  Legos get added to the grocery list and show up the next day,  hundreds of tiny buckyball magnets are stuck all over the place, and we have some super-nice condenser microphones for clearer conference calls and podcast recordings. And the sharks with lasers attached to their heads? We're not supposed to talk about those.&lt;/p&gt;

&lt;p&gt;Did we leave anything out?  What non-software tools help your software business be awesome?&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Cast aside that debugger and use your test-suite</title>
     <link href="http://highgroove.com/articles/2012/04/10/cast-aside-that-debugger-and-use-your-test-suite.html" />
     <updated>2012-04-10T00:00:00-04:00</updated>
     <id>http://highgroove.com/articles/2012/04/10/cast-aside-that-debugger-and-use-your-test-suite.html</id>
     <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/nottinghack/6900338008/" title="Tools on pegboard 2012-04-03 09.26.50 by Nottinghack, on Flickr"&gt;
&lt;img src="http://farm8.staticflickr.com/7230/6900338008_ed3e865848_n.jpg" width="320" height="193" style="float: right;" alt="Tools on pegboard 2012-04-03 09.26.50"&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At Highgroove we  &lt;em&gt;really&lt;/em&gt; like testing and are constantly looking for ways to
improve our testing process, how &lt;a href="http://highgroove.com/articles/2012/04/06/sane-rspec-config-for-clean%2C-and-slightly-faster%2C-specs.html"&gt;quickly our tests run&lt;/a&gt;,
and how exactly we execute our tests.  How often during your Test Driven
Development (TDD) cycle do your tests fail "mysteriously"?  You've written your
tests, written your code, and most of them pass but one or two stubbornly fail
even though you are fairly certain they should pass given the testing setup
you've provided?  At Highgroove we bias towards action so we are likely to
launch a debugger session or a &lt;a href="https://github.com/pry/pry"&gt;pry&lt;/a&gt; session to get
to the bottom of this.  Another approach, which won't break your existing TDD
workflow, is to use your test-suite in place of a more traditional debugger.
After the jump we'll talk about how we've been using this strategy to dig into
code quickly and easily.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;Often the above situation comes about during testing of complicated objects
where a given assertion relies on several elements of state being correct.  For
this discussion the examples will be in &lt;a href="https://www.relishapp.com/rspec"&gt;RSpec 2&lt;/a&gt;
though any test-suite should be able to perform the same assertions with a
simple change of syntax.&lt;/p&gt;

&lt;p&gt;Assume you start with a simple example such as&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/2343099.js?file='&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;class RailsyObject &amp;lt; ActiveRecord::Base
  def compound?
    #  These properties could be attributes or computed attributes
    (self.simple? &amp;amp;&amp;amp; self.clean?) || self.complicated?
  end

  def complicated?
    # ... snip ...
  end
end
&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;If the &lt;code&gt;#compound?&lt;/code&gt; example above fails then clearly one of the three
properties being checked is not in the expected state.  You could do something
like launch the debugger, launch the rails console, or bind a pry session and
dig into the objects.  All of these would work so lets examine the rails console
version:&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/2343105.js?file='&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;Loading development environment (Rails 3.2.3)
1.9.3-p125 :001 &amp;gt; FactoryGirl.create :railsy_object
   (0.0ms)  begin transaction
  SQL (2.8ms)  INSERT INTO &amp;quot;railsy_objects&amp;quot; (&amp;quot;clean&amp;quot;, &amp;quot;created_at&amp;quot;, &amp;quot;simple&amp;quot;, &amp;quot;updated_at&amp;quot;) VALUES (?, ?, ?, ?)  [[&amp;quot;clean&amp;quot;, nil], [&amp;quot;created_at&amp;quot;, Mon, 09 Apr 2012 11:39:38 UTC +00:00], [&amp;quot;simple&amp;quot;, nil], [&amp;quot;updated_at&amp;quot;, Mon, 09 Apr 2012 11:39:38 UTC +00:00]]
   (1.2ms)  commit transaction
 =&amp;gt; #&amp;lt;RailsyObject id: 4, created_at: &amp;quot;2012-04-09 11:39:38&amp;quot;, updated_at: &amp;quot;2012-04-09 11:39:38&amp;quot;, simple: nil, clean: nil&amp;gt; 
1.9.3-p125 :002 &amp;gt; ro = _
 =&amp;gt; #&amp;lt;RailsyObject id: 4, created_at: &amp;quot;2012-04-09 11:39:38&amp;quot;, updated_at: &amp;quot;2012-04-09 11:39:38&amp;quot;, simple: nil, clean: nil&amp;gt; 
1.9.3-p125 :003 &amp;gt; ro.simple?
 =&amp;gt; false 
1.9.3-p125 :004 &amp;gt; ro.clean?
 =&amp;gt; false 
1.9.3-p125 :005 &amp;gt; ro.complicated?
 =&amp;gt; false &lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;If we had used pry, ruby-debug, or even &lt;a href="https://github.com/michaeldv/awesome_print"&gt;awesome_print&lt;/a&gt;
and examined the object manually, we would have almost certainly done exactly
those queries of our object to determine state.  Since we doing proper TDD  we
probably have both our tests and our code open simultaneously, and some way of
quickly running our test-suite such as &lt;a href="http://highgroove.com/articles/2012/04/03/vim-vroom.html"&gt;vim-vroom&lt;/a&gt;
or &lt;a href="https://github.com/guard/guard-rspec"&gt;guard-rspec&lt;/a&gt; or some other custom set
of bindings or tool, so why then do we context switch into yet another tool to
debug object state when RSpec is essentially a DSL for doing just that?!?&lt;/p&gt;

&lt;p&gt;Thus we can change our spec to do our custom querying as follows:&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/2343114.js?file=railsy_object_spec.rb'&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;describe RailsyObject do
  describe &amp;quot;predicates&amp;quot; do
    before do
      @railsy_obj = FactoryGirl.create(:railsy_object)
    end

    describe &amp;quot;#compound?&amp;quot; do
      it &amp;quot;should pass for the default object from FactoryGirl&amp;quot; do
        @railsy_obj.should be_simple
        @railsy_obj.should be_clean
        @railsy_obj.should be_complicated

        @railsy_obj.should be_compound
      end
    end
  end
end
&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;which produces:&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/2343114.js?file=rspec_output.txt'&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;$ bundle exec rspec spec                                                                                          
F

Failures:

  1) RailsyObject predicates#compound? should pass for the default object from FactoryGirl
     Failure/Error: @railsy_obj.should be_simple
       expected simple? to return true, got false
     # ./spec/models/railsy_object_spec.rb:12:in `block (4 levels) in &amp;lt;top (required)&amp;gt;'

Finished in 0.01648 seconds
1 example, 1 failure

Failed examples:

rspec ./spec/models/railsy_object_spec.rb:11 # RailsyObject predicates#compound? should pass for the default object from FactoryGirl&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;In all likelihood we want to change our object creation step in FactoryGirl for
this test of the predicate.  We can make that deterination and change in one
place without context switching, and decide to leave or remove those predicate
checks before moving onto the next story or
&lt;a href="http://highgroove.com/articles/2012/02/07/red%2C-green%2C-refactor---the-tools-for-success.html"&gt;riding bikes&lt;/a&gt;.
What do you do to debug or otherwise investigate the state of your objects
without breaking your flow?&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Sane Rspec config for clean, and slightly faster, specs</title>
     <link href="http://highgroove.com/articles/2012/04/06/sane-rspec-config-for-clean%2C-and-slightly-faster%2C-specs.html" />
     <updated>2012-04-06T00:00:00-04:00</updated>
     <id>http://highgroove.com/articles/2012/04/06/sane-rspec-config-for-clean%2C-and-slightly-faster%2C-specs.html</id>
     <content type="html">&lt;p&gt;&lt;img src="http://images.memegenerator.net/instances/17990767.jpg"
alt="I don't always write database-bound tests, but when I do, I prefer them
to be idempotent." style="float: right;" width="200" /&gt;&lt;/p&gt;

&lt;p&gt;Database-bound tests are a drag. Inconsistent tests are a pain.
Database-bound, inconsistently failing tests are &lt;strong&gt;the worst&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;The following commit message is from a real code base:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Run in transactions by default.&lt;/p&gt;

&lt;p&gt;When we added controller specs they weren't being run w/any kind of DB
cleaner b/c there was no default strategy and they weren't explicitly included
in a group. Now, we use :transactions be default, setting request specs to
use :truncation&lt;/p&gt;

&lt;p&gt;Also, I saw a 2 second speed up from this change!&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Let's look at what we changed in this commit to turn our inconsistently
failing database-bound tests into slightly faster, consistent, database-bound
tests.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;h2&gt;Prefer isolated tests&lt;/h2&gt;

&lt;p&gt;Whenever possible I strive to write isolated tests, stubbing out
collaborators where necessary, while driving from the outside of the system
downward, one layer at time. However, there are occasions where you must hit
the database.&lt;/p&gt;

&lt;p&gt;Testing ActiveRecord scopes and higher-order acceptance tests are two cases
where I believe it is okay to have tests that cross layers, and may even hit a
database.&lt;/p&gt;

&lt;h2&gt;Ensuring idempotent tests&lt;/h2&gt;

&lt;p&gt;When you are going to hit a database, your tests should be good citizens and
clean up after themselves.&lt;/p&gt;

&lt;p&gt;If you're using &lt;a href="https://github.com/rspec/rspec"&gt;Rspec&lt;/a&gt; with Rails your tests run within a transaction
by default. &lt;em&gt;Yay!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Unfortunately, test tooling like &lt;a href="https://github.com/jnicklas/capybara"&gt;Capybara&lt;/a&gt; won't work with
transactions and you'll be forced to resort to techniques like database
truncation to ensure proper data clean up. I really like &lt;a href="https://github.com/bmabey/database_cleaner"&gt;Database
Cleaner&lt;/a&gt; for that job.&lt;/p&gt;

&lt;h2&gt;An example Rspec configuration&lt;/h2&gt;

&lt;p&gt;What follows is the Rspec configuration we ended up with after the previously
mentioned commit. &lt;em&gt;Or at least a very close approximation of it&lt;/em&gt;&lt;/p&gt;

&lt;script src="https://gist.github.com/2321262.js?file=02_spec_helper.rb"&gt;&lt;/script&gt;


&lt;p&gt;A few key take aways:&lt;/p&gt;

&lt;p&gt;To start, turn off Rspec's built-in transaction support as we'll handle
that with &lt;code&gt;database_cleaner&lt;/code&gt;.&lt;/p&gt;

&lt;script src="https://gist.github.com/2321262.js?file=03_turn_off_rspec_transactions.rb"&gt;&lt;/script&gt;


&lt;p&gt;Next we configure a default clean-up strategy for every Rspec suite. We'll use
transactions by default, being sure to clean up any thing that might have been
left behind with a truncation.&lt;/p&gt;

&lt;script src="https://gist.github.com/2321262.js?file=04_set_default_strategy.rb"&gt;&lt;/script&gt;


&lt;p&gt;We make a special exception for request specs, which are often driven by
Capybara, and switch them over to truncation.&lt;/p&gt;

&lt;script src="https://gist.github.com/2321262.js?file=05_set_request_spec_strategy.rb"&gt;&lt;/script&gt;


&lt;p&gt;Then, before every test runs start Database Cleaner&lt;/p&gt;

&lt;script src="https://gist.github.com/2321262.js?file=06_start_before_each_test.rb"&gt;&lt;/script&gt;


&lt;p&gt;And finally, after every test runs, tell Database cleaner to clean up using
whatever strategy it is currently configured with.&lt;/p&gt;

&lt;script src="https://gist.github.com/2321262.js?file=07_clean_after_each_test.rb"&gt;&lt;/script&gt;


&lt;p&gt;For posterity's sake, you can see a full &lt;a href="https://gist.github.com/2321262"&gt;before and after&lt;/a&gt; of
this particular &lt;code&gt;spec_helper&lt;/code&gt; on &lt;a href="https://github.com"&gt;The GitHubs&lt;/a&gt;.&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>vim-vroom</title>
     <link href="http://highgroove.com/articles/2012/04/03/vim-vroom.html" />
     <updated>2012-04-03T00:00:00-04:00</updated>
     <id>http://highgroove.com/articles/2012/04/03/vim-vroom.html</id>
     <content type="html">&lt;p&gt;&lt;img src="http://images.wikia.com/vim/images/6/68/Vim-editor_logo.png" alt="Vim logo" style="float: right;" width="200" height="200" /&gt;&lt;/p&gt;

&lt;p&gt;I started watching Gary Bernhardt's &lt;a href="http://destroyallsoftware.com/" title="Destroy All Software"&gt;Destroy All Software&lt;/a&gt; screencasts
recently and after watching &lt;a href="https://www.destroyallsoftware.com/screencasts/catalog/file-navigation-in-vim" title="Destroy All Software #13"&gt;a specific episode&lt;/a&gt;, I had to have his Ruby
testing setup. After sitting in &lt;a href="http://github.com/skalnik/vim_config" title="Skalnik's Vim Config"&gt;Vim config&lt;/a&gt; for a while, with some
improvements I made, I started feeling like I should somehow contribute my
changes back. After I started adding a few more changes suggested by fellow
Taconaut &lt;a href="http://highgroove.com/about/steven.html" title="About Steven Harman"&gt;Steven Harman&lt;/a&gt;, I decided it really needed to be a Vim Plugin.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;Announcing &lt;a href="https://github.com/skalnik/vim-vroom" title="vim-vroom"&gt;vim-vroom&lt;/a&gt;! An easy way to run your Ruby tests without
leaving Vim. If you're hackin' away at some Ruby code, you can open up your test
file and hit &lt;Leader&gt;r (mapped to :VroomRunTestFile) to have it run that file.
Now you can bounce around anywhere in your application code and just be a
&lt;Leader&gt;r away from running your last test file. If your testing framework
supports it, you can also use &lt;Leader&gt;R (mapped to :VroomRunNearestTest) to run
the nearest test in the file as well.&lt;/p&gt;

&lt;p&gt;Currently, MiniTest/Test::Unit, Cucumber, and RSpec are all supported. I've
tried to ensure everything is easily customizable for whatever workflow you may
have, and whatever preferences you may have. Things such as clearing the screen
before running tests, color usage, key mappings, and more, are all optional and
can easily be toggled on or off with just 1 line in your Vim config.  Everything
is &lt;a href="http://vim-doc.heroku.com/view?https://raw.github.com/skalnik/vim-vroom/master/doc/vroom.txt" title="vim-vroom Documentation"&gt;documented&lt;/a&gt; for easy access in or outside of Vim. There aren't
any known issues at the moment, but if you run into one, please file a &lt;a href="https://github.com/skalnik/vim-vroom/issues" title="vim-vroom issues"&gt;GitHub
issue&lt;/a&gt;, or, if you're particularly vimscript savvy, fork the
project and send me a pull request!&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Weekend Update: Open Source Software Contributions</title>
     <link href="http://highgroove.com/articles/2012/04/02/weekend-update%3A-open-source-software-contributions.html" />
     <updated>2012-04-02T00:00:00-04:00</updated>
     <id>http://highgroove.com/articles/2012/04/02/weekend-update%3A-open-source-software-contributions.html</id>
     <content type="html">&lt;p&gt;&lt;img src="https://img.skitch.com/20120403-e7ede1h3sxbj6hp4y43t99jjqe.png"
alt="Weekend Update" style="float: right;" width="200" /&gt;&lt;/p&gt;

&lt;p&gt;This weekend we &lt;a href="http://highgroove.com/about" title="Meet the Taconauts"&gt;Highgroovers&lt;/a&gt; (a.k.a. Taconauts) took some time to do one
of the things we really love: create and release Open Source Software. In
fact, we released not one, but &lt;strong&gt;three&lt;/strong&gt; new tools into the world:
&lt;em&gt;grocer&lt;/em&gt;, &lt;em&gt;git_tracker&lt;/em&gt;, and &lt;em&gt;puppet-osx_defaults&lt;/em&gt;.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;h2&gt;Announcing: &lt;a href="https://github.com/highgroove/grocer" title="grocer on The GitHubs"&gt;grocer&lt;/a&gt;&lt;/h2&gt;

&lt;blockquote&gt;&lt;p&gt;Grocer interfaces with the Apple Push Notification Service to send push
notifications to iOS devices and collect notification feedback via the
Feedback Service. There are other gems out there to do this, but Grocer
plans to be the cleanest, most extensible, and friendliest.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="http://highgroove.com/about/andy" title="About Andy Lindeman"&gt;Andy&lt;/a&gt;, &lt;a href="http://highgroove.com/about/patrick" title="About Patrick Van Stee"&gt;Patrick&lt;/a&gt;, and I built the grocer in the course of just two
days. Andy and I started it with a morning-long &lt;a href="http://c2.com/cgi/wiki?PairProgrammingPingPongPattern" title="Pair Programming Ping Pong Pattern"&gt;ping pong-pairing&lt;/a&gt;
session on Thursday, the three of us hacked on it through the afternoon and
most of Friday, and pushed it out Friday night.&lt;/p&gt;

&lt;h2&gt;Announcing: &lt;a href="https://github.com/highgroove/git_tracker" title="git_tracker on The GitHubs"&gt;git_tracker&lt;/a&gt;&lt;/h2&gt;

&lt;blockquote&gt;&lt;p&gt;Some simple tricks that make working with Pivotal Tracker even better... and
easier... um, besier!&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;I technically pushed the first version (0.0.1) of &lt;em&gt;git_tracker&lt;/em&gt; a week ago, but
it went v1.0 Saturday afternoon. Please give it a shot, and feel free to open
issues and send pull-requests.&lt;/p&gt;

&lt;h2&gt;Announcing: &lt;a href="https://github.com/wfarr/puppet-osx_defaults" title="puppet-osx_defaults on The GitHubs"&gt;puppet-osx_defaults&lt;/a&gt;&lt;/h2&gt;

&lt;blockquote&gt;&lt;p&gt;This is a simple puppet module for managing the defaults system in OS X. It
currently has support for defaults domain keys whose values are boolean,
integer, or string types.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="http://highgroove.com/about/will" title="About Will Farrington"&gt;Will&lt;/a&gt;, a lover of all things automated, whipped together a
&lt;a href="http://puppetlabs.com/"&gt;Puppet&lt;/a&gt; script for sane OS X defaults.&lt;/p&gt;

&lt;p&gt;Image credit: &lt;a href="http://timmyclunkers.tumblr.com/post/18047375947"&gt;http://timmyclunkers.tumblr.com/&lt;/a&gt;&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Staying in the Groove at Highgroove!</title>
     <link href="http://highgroove.com/articles/2012/04/02/keeping-culture-unique.html" />
     <updated>2012-04-02T00:00:00-04:00</updated>
     <id>http://highgroove.com/articles/2012/04/02/keeping-culture-unique.html</id>
     <content type="html">&lt;p&gt;&lt;img src="http://distilleryimage5.instagram.com/bdbaf34679eb11e1a87612313804ec91_7.jpg" alt="Aping the FitDesk courtesy: @twotoneatl" style="float: right;" width="200" height="200" /&gt;&lt;/p&gt;

&lt;p&gt;Anyone that knows anyone at Highgroove knows we're not your run of the mill rapidly growing Ruby development shop. We're a unique team of creative individuals bent on productivity hacking and iterating on client needs until the app is awesome. Sure we've got some great perks and compelling reasons to make the commute into the office despite being a &lt;a href="http://www.gorowe.com/"&gt;ROWE&lt;/a&gt;.  What do we do at Highgroove as a group to intentionally keep our culture cool/unique as we continue to grow?  Read more to learn about we stay keep our groove at Highgroove.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;Most everyone at Highgroove &lt;a href="http://not-so-secret-sauce.highgroove.com/topics/blog-post-guidelines.html"&gt;pens an entry&lt;/a&gt; here on the blog describing their initial days and weeks.  Like Will put it, &lt;a href="http://highgroove.com/articles/2012/01/16/getting-in-the-groove.html"&gt;getting into the groove&lt;/a&gt; involves getting accustomed to working in a ROWE, following all 12 agile principles and getting on the iterative schedule we use for client facing and internal work. Plus we have &lt;a href="http://not-so-secret-sauce.highgroove.com/topics/tech-talks.html"&gt;Tech Talks&lt;/a&gt;, Team Dinners, unlimited vacation and even unorthodox approaches to office life like &lt;a href="http://highgroove.com/articles/2012/01/27/the-great-office-rearrangement%3A-sit-where-you-want.html"&gt;unassigned seating&lt;/a&gt; and having a &lt;a href="http://highgroove.com/articles/2012/02/21/why-highgroove-has-a-personal-trainer.html"&gt;personal trainer&lt;/a&gt;. These are all integral components to what makes the culture at Highgroove awesome!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://highgroove.com/about/andy.html"&gt;Andy&lt;/a&gt; gave me the idea for this post after reading Karen Rubin's Harvard Business Review article entitled "&lt;a href="http://blogs.hbr.org/cs/2012/03/how_start-ups_can_maintain_com.html"&gt;How Start-Ups Can Maintain Company Culture While Growing&lt;/a&gt;" Karen focused on two of the &lt;a href="http://bostinno.com/2010/12/17/hubspots-culture-12-things-you-might-not-know/"&gt;12 Things You Might Not Know&lt;/a&gt; about company culture at the second fastest growing SaaS company in history: &lt;a href="http://www.hubspot.com/"&gt;Hubspot&lt;/a&gt;. According to her, (and we agree!) the two approaches to keeping Hubspot's culture vibrant and true to the original vision of the company are communication and measurement.&lt;/p&gt;

&lt;p&gt;Here are three examples of what that means to us at Highgroove:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The Highgroove Award | Our award exists on the
&lt;a href="http://highgroove.com/about.html"&gt;website&lt;/a&gt; and as a &lt;a href="http://www.flickr.com/photos/highgroove/6797358049/in/photostream"&gt;physical
trophy&lt;/a&gt;  &lt;a href="http://highgroove.com/faq.html#the-award"&gt;The Highgroove Award&lt;/a&gt; even ultimately &lt;a href="http://highgroove.com/articles/2012/01/31/kumbaya-my-award.html"&gt;became an app&lt;/a&gt;! To us the Highgroove Award is about communication &lt;em&gt;and&lt;/em&gt; measurement. It encourages compliments and is a gauge for how we as a team are embodying the Highgroove Values of being Personable, Optimistic, and Trusting, while exercising Craftsmanship in all that we do. At Highgroove, well-deserved compliments foster teamwork, increase morale, and make us better as a team than we could be on our own.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Weekly Iterations | Everything revolves around single, double or 4 week iterations.  If something doesn't work, scrap it. As as our friends at &lt;a href="http://matchstic.com/blog/2012/03/lessons-from-the-new-guy/"&gt;Matchstic&lt;/a&gt; said last week: "The best idea wins, no matter where it comes from." Iterative development relies on this level playing field of communication to stay agile as well as providing the framework for the collaboration we promote in everything that we do. For Highgroove this means, as &lt;a href="http://highgroove.com/articles/2011/03/21/iterations-are-dead-long-live-iterations.html"&gt;Chris put it&lt;/a&gt; "Iterations hurt [a] developers self esteem. Iterations are great for developer self esteem." Lastly, we end our iterations on Tuesdays putting any potential crunch time then and not on a Friday or the weekend. Cool, right?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Surveys &amp;amp; more! | At Highgroove we're constantly looking for ways to gauge employee (and client) happiness. This focus on morale measurement facilitates identifying issues and obstacles as well as determining when and if if we've moved beyond them. in fact, we're working on releasing a public version of some of the things that make Highgroove work smoothly. A internal tool that we use as a "How's it going?" for projects and organizations that we hope to release soon.  Stay tuned!&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;In the same way we endeavor to participate in and contribute to the Ruby and &lt;a href="http://highgroove.com/articles/2012/03/20/open-source-hack-night.html"&gt;open source community&lt;/a&gt;.  In this way we share our approaches to keeping our culture cool and unique, and may help to improve the company culture for other companies around us.&lt;/p&gt;

&lt;p&gt;Does your company have a unique culture? How do you keep it that way?&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Highgroove Made Me Super Efficient And All I Got Was This Lousy Free Time???</title>
     <link href="http://highgroove.com/articles/2012/03/27/highgroove-made-super-efficient-so-now-what.html" />
     <updated>2012-03-27T00:00:00-04:00</updated>
     <id>http://highgroove.com/articles/2012/03/27/highgroove-made-super-efficient-so-now-what.html</id>
     <content type="html">&lt;p&gt;&lt;a href="http://1.bp.blogspot.com/-qFugFHKCyRA/TuPd5e06qTI/AAAAAAAAAOc/XJDJvNEhLms/s1600/time+warp.jpg"&gt;
  &lt;img src="http://1.bp.blogspot.com/-qFugFHKCyRA/TuPd5e06qTI/AAAAAAAAAOc/XJDJvNEhLms/s1600/time+warp.jpg" width="250" height="167" alt="Time Warp" style="float: right;"&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At Highgroove, I've become a stronger developer, consultant, and mentor every day.  This didn't happen on accident!  On one hand, Highgroove's philosophy to provide the best tools possible in the software development industry saves me time because I spent less of it waiting for tests to run and more time analyzing hard problems.
On the other hand, I have a Results Only Work Environment (ROWE) where I can leave when my work is finished, &lt;a href="http://highgroove.com/articles/2011/08/09/taking-a-break-makes-you-a-better-coder.html"&gt;take a mental break&lt;/a&gt; whenever I need to, and work when where and how I please.&lt;/p&gt;

&lt;p&gt;Despite these things that set Highgroove apart from most employers, I have found the dark side to all of this productivity: &lt;strong&gt;What do I do with all of the free time I have now?&lt;/strong&gt;  When you don't have to stay at the office for 10 hours a day just to save face, impress your bosses, and hopefully not get passed up by someone else who is better at sucking up than you are, this becomes a real problem!!!  In this blog post I'll address this problem and show some creative ways to help unwind after a long day (or night!) of programming.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;So what are some ways to enjoy hyper-productivity?  For starters, I highly advise doing something that you are passionate about.  You will be motivated to do whatever it is that you chose to do, you will enjoy doing it, and you will want to continue! Secondly, I advise slowing down and not worrying about being productive while you're off the grid.  Why do you want to rush through your free time?  Enjoy it!&lt;/p&gt;

&lt;p&gt;At Highgroove, several folks already have hobbies outside of the office and have no problems making use of their free time!  For example, several Highgroovers meet at a local cycling track and run circles around each other.  Some volunteer for local charities like Habitat For Humanity or the Georgia Aquarium.&lt;/p&gt;

&lt;p&gt;For some readers though, picking up a brand new hobby is easier said than done.  What if I don't like going outside?  What if I get hit by a bus riding my bike in Atlanta traffic?  What if I fail?  For those of you who are concerned about starting new, I recommend taking a deep breath and a thinking about what the main goal really is: that you are doing something new and exciting and that the outcome doesn't matter.  With a new attitude in place, pick a new hobby!  To help with this process, here are some examples to help pick out your new found free-time killer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Running and being active outdoors&lt;/li&gt;
&lt;li&gt;Take time off and Travel to somewhere you've always wanted to visit&lt;/li&gt;
&lt;li&gt;Learn a new language (Human languages only!)&lt;/li&gt;
&lt;li&gt;Cook and take the time to go to a farmers market, prep everything, and make it all from scratch.  Frozen meals absolutely do not count!&lt;/li&gt;
&lt;li&gt;Volunteer at a local non-profit. &lt;a href="http://charity.lovetoknow.com/List_of_Nonprofit_Organizations"&gt;Here's a list of a bunch of them&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Invite a friend you haven't seen in a while to hang out at a local hotspot.  Work is not a topic to be discussed!&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;The only goal now is to keep yourself accountable regarding your new hobby.  Highgroove has plenty of experience getting things done, so if you need some organization help, check out &lt;a href="http://highgroove.com/articles/2011/11/28/tech-demo-on-getting-things-done-with-things.app.html"&gt;Chris' tech talk on Things&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Highgroove strives to support a positive life-work balance by providing the best tools possible and a ROWE.  Does your workplace encourage you to get away from the office?&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>The anti-meetings - The Weekly Huddles</title>
     <link href="http://highgroove.com/articles/2012/03/26/the-anti-meetings%3A-the-weekly-huddles.html" />
     <updated>2012-03-26T00:00:00-04:00</updated>
     <id>http://highgroove.com/articles/2012/03/26/the-anti-meetings%3A-the-weekly-huddles.html</id>
     <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/jepoirrier/6489494111/" title="Meeting room by jepoirrier, on Flickr"&gt;
&lt;img src="http://farm8.staticflickr.com/7143/6489494111_66c8a94c06.jpg" width="250" height="167" alt="Empty Meeting room" style="float: right;"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Meetings.  Quick chats with our customers, daily if possible, don't count as
meetings.  They keep everyone on the same page to make sure good progress is
being made for them, to address any questions or concerns they may have, and
possibly to plan the next steps to take in developing their app.  By "meetings"
we mean that word that brings dread to the heart of anyone who has ever looked
at their schedule and seen only two hours of their daily schedule available for
actual work, and in fifteen minute blocks no less.&lt;/p&gt;

&lt;p&gt;At Highgroove we have a few tactics for avoiding just that.  Firstly, we don't
have many.  Moreover, all meetings are optional, and you can come and go as you
like.  A quick glance at my calendar shows vastly more pairings, personal
trainer sessions, hack nights, team dinners, and other informal team outings
than it does meetings.  We consider this a win.  Like all companies we still
need some variety of status updates, the kind of subject matter that would
usually go into a weekly company or organization meeting.  To address that need
we "bring it in" for the weekly huddle emails.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;From our own documentation on one such huddle "This is a quick huddle-style
meeting - not a working meeting.  Just a high-level, decision-making quick
meeting focussed on removing impediments and moving forward."  To facilitate
those goals only the absolutely necessary parties are involved.  Anyone is
welcome but very often developers are not involved in the sales process and
would rather get tacos than talk sales and marketing numbers.&lt;/p&gt;

&lt;p&gt;On the business side of the house our huddles have a fairly strict script.  The
list of bullet points that make up the script can be answered effectively with
little analysis, and decisions can be made.  This eliminates that weekly
PowerPoint snooze fest many are familiar with.  To keep the rest of the team in
the loop during their taco or
&lt;a href="http://highgroove.com/about/cherri.html"&gt;Cherri&lt;/a&gt;-induced coma, an email is sent
out with details from the huddle.  Again, in the interests of brevity and focus,
the script is copy/pasted into the email with any salient details on each one
quickly described.&lt;/p&gt;

&lt;p&gt;On the developer side of the house the process is almost identical but with
slightly more developer-centric information.  The content is entirely collected
by email or our tracking tools like
&lt;a href="https://www.pivotaltracker.com/"&gt;PivotalTracker&lt;/a&gt;,
&lt;a href="http://www.reflecticle.com/"&gt;Reflecticle&lt;/a&gt;, and
&lt;a href="http://www.letsfreckle.com/"&gt;LetsFreckle&lt;/a&gt;, and allows everyone to have a
feeling for what's going on around them.  After reading the huddle email we know
who's blogging and giving &lt;a href="http://highgroove.com/tech_talks.html"&gt;tech-talks&lt;/a&gt;
this week, and on what subjects, who is on vacation, what clients are saying on
other projects, and what special events are coming up.  All-in-all it may take
some time to compile, in small time slices, but it takes just a few minutes to
read at your leisure without ruining your workflow, the one you always get into
just before that big meeting...&lt;/p&gt;

&lt;p&gt;What do you do to eliminate meetings and make sure you can be more productive to
&lt;a href="http://www.strava.com/clubs/highgroove-studios-2559"&gt;ride bikes&lt;/a&gt; and eat tacos?&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Open Source Hack Night</title>
     <link href="http://highgroove.com/articles/2012/03/20/open-source-hack-night.html" />
     <updated>2012-03-20T00:00:00-04:00</updated>
     <id>http://highgroove.com/articles/2012/03/20/open-source-hack-night.html</id>
     <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/highgroove/6997923489/in/photostream"&gt;&lt;img src="http://farm7.staticflickr.com/6036/6997923489_3a3557f8f0_n.jpg" alt="Highgroove Open Source Hack Night" style="float: right; width:280px" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Last night at the Highgroove Studios office, we held the March edition of Hack Night, our monthly social coding gathering. We focused on starting, polishing, and/or discussing &lt;a href="http://not-so-secret-sauce.highgroove.com/topics/open-source-contribution-guide.html"&gt;open source projects&lt;/a&gt; ranging from the super useful to the super silly (beer &lt;em&gt;is&lt;/em&gt; always provided at our hack nights...)&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;While &lt;a href="http://highgroove.com/about/charles.html"&gt;CBQ&lt;/a&gt; hacked away at some Rails &lt;a href="http://weblog.rubyonrails.org/2012/3/7/what-is-docrails/"&gt;documentation&lt;/a&gt; using &lt;a href="https://github.com/lifo/docrails"&gt;docrails&lt;/a&gt;, others were busy building and even releasing other tools.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Roughly an hour into hacking, &lt;a href="http://highgroove.com/about/andy.html"&gt;Andy&lt;/a&gt; announced a new release of the &lt;a href="https://github.com/highgroove/zonebie"&gt;zonebie gem&lt;/a&gt;, written by him and &lt;a href="http://highgroove.com/about/patrick.html"&gt;Patrick&lt;/a&gt;, which is a gem that runs Rails/ActiveSupport tests in a random timezone to spot pesky bugs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://highgroove.com/about/steven.html"&gt;Steven&lt;/a&gt; and Andy, seeing the need for a lighter-weight delegator than what is found in Ruby's standard library, hatched the idea for and released the first iteration of &lt;a href="https://github.com/highgroove/dumb_delegator"&gt;DumbDelegator&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://highgroove.com/about/will.html"&gt;Will&lt;/a&gt; released &lt;a href="https://github.com/highgroove/bootlace"&gt;Bootlace&lt;/a&gt;, a gem for bootstrapping Ruby applications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://highgroove.com/about/jonathan.html"&gt;Jonathan&lt;/a&gt; released &lt;a href="https://github.com/wallace/yamldiff"&gt;Yamldiff&lt;/a&gt;, a gem that prints out a list of missing keys for two yaml files.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;a href="http://www.flickr.com/photos/highgroove/7000307833/in/photostream"&gt;&lt;img src="http://farm7.staticflickr.com/6212/7000307833_49521a3ea6.jpg" alt="Highgroovers and Guests Hacking" style="float: right; width:280px" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These are all works in progress, and we keep an active public &lt;a href="https://www.pivotaltracker.com/projects/493477"&gt;Pivotal Tracker project&lt;/a&gt; for our open source ideas in order to track our progress and encourage conversation. We want to continue honing our own skills while bettering the development community through continual projects. Some of the results of our efforts are, we feel, &lt;a href="http://highgroove.com/badger_works.html"&gt;pretty sweet&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;All-in-all, we had a pretty productive open source hack night. We were super excited to have &lt;a href="https://github.com/jonyet"&gt;Jonathan&lt;/a&gt;, &lt;a href="https://github.com/greggroth"&gt;Greggory&lt;/a&gt;, and Ben (along with other Hack Night guests) join in the fun, set up some github accounts, and eat some pizza with us.&lt;/p&gt;

&lt;p&gt;Are there any of our open source projects that you can fork and improve? What other projects should Highgroovers consider next? &lt;a href="https://github.com/highgroove"&gt;Jump in and get fork'n!&lt;/a&gt;&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Spree Conference 2012</title>
     <link href="http://highgroove.com/articles/2012/03/15/spree-conference-2012.html" />
     <updated>2012-03-15T00:00:00-04:00</updated>
     <id>http://highgroove.com/articles/2012/03/15/spree-conference-2012.html</id>
     <content type="html">&lt;p&gt;&lt;a href="https://twitter.com/#!/ryanbigg/status/169790346274942976/photo/1/large"&gt;&lt;img src="https://p.twimg.com/Als3a5wCMAEvRaE.jpg:large" alt="Spree Conference 2012" style="float: right; width:280px" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Last month I had the privilege of attending the very first SpreeConf in New York City. If you aren't familiar with &lt;a href="http://spreecommerce.com/"&gt;Spree&lt;/a&gt;, it is an awesome Rails e-commerce engine you can use to build a full-featured online store. The conference was held over two days; the first day featured several training sessions. The sessions covered a range of topics including theming, configuring, and testing Spree. The second day was filled not only with talks related to Spree, but to e-commerce and Open Source in general.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;The conference coincided with the 1.0 release of Spree. Throughout the training talks and into the second day, presenters were quick to point out some of the awesome new features now available with Spree. One of the most exciting is the inclusion of the &lt;a href="http://getskeleton.com/"&gt;Skeleton&lt;/a&gt; CSS framework, which helps Spree provide a great shopping experience no matter what device your customer is using. The admin backend and default front-end theme have also been revamped to be easier to use and customize.&lt;/p&gt;

&lt;p&gt;Highlights of the conference for me included &lt;a href="https://github.com/BDQ"&gt;Brian Quinn&lt;/a&gt;'s talks on &lt;a href="http://speakerdeck.com/u/bdq/p/spreeconf-2012-spree-themes-with-deface"&gt;Deface&lt;/a&gt; and &lt;a href="http://speakerdeck.com/u/bdq/p/spreeconf-2012-sprees-hidden-gems"&gt;Spree's hidden gems&lt;/a&gt;. &lt;a href="http://ryanbigg.com/"&gt;Ryan Bigg&lt;/a&gt; navigated to a meme-filled slide deck to talk about his experiences working with engines for Spree and for Rails in general. He concluded his talk by pushing a Rails Guide on engines to Github. After his talk the Spree team gave everyone a copy of his book &lt;a href="http://manning.com/katz/"&gt;Rails 3 in Action&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://ryan.mcgeary.org/"&gt;Ryan McGeary&lt;/a&gt; gave a very inspiring &lt;a href="http://speakerdeck.com/u/rmm5t/p/just-in-time-inventory-with-spree"&gt;talk&lt;/a&gt; about Open Source. He told a story about his quest to create a Spree store that connected to a Makerbot to offer just in time inventory. While in the end the result wasn't practical for running a business, his point that he was able to do so with very few lines of code by modifying existing Open Source code to suit his needs. He is then able to share that code for others to improve on - "Standing on the Shoulders of Giants."&lt;/p&gt;

&lt;p&gt;While the conference was aimed at Spree developers and store owners, it was clear from the start that this conference was mostly about celebrating Open Source, and not just software. The keynote speaker for the event was Bre Pettis, founder of &lt;a href="http://www.makerbot.com/"&gt;Makerbot Industries&lt;/a&gt;. Bre shared an example of how the Makerbot community works together to solve problems. Collaborators from around the world had been working on printing a working clock derived from a clock mechanism one person posted on &lt;a href="http://www.thingiverse.com/thing:7976"&gt;Thingiverse&lt;/a&gt; (Thingiverse is sort of the 3D-Printing version of Github), but no one was successfully able to get it work alone. So Bre organized several &lt;a href="http://www.makerbot.com/blog/2012/01/02/makerbot-clock-project/"&gt;Hackathons&lt;/a&gt; where Makerbot provided space and food for everyone to come together and work. Eventually the team was able to build a &lt;a href="http://www.youtube.com/watch?v=XPbUiVH44mA&amp;amp;feature=youtu.be"&gt;working clock&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Bre's point was that electronic collaboration can get you really far; however, there is no substitute for face to face interaction, and that most of the important work is done over food anyway.&lt;/p&gt;

&lt;p&gt;Overall the conference was huge success. Not only did I learn a lot about Spree, and Ruby in general, but I also met some awesome developers from around the world who are truly passionate about Open Source. Every now and then, we as developers need something like a conference or meet-up to remind us how exciting our jobs are, and how lucky we are to be part of such an great community.&lt;/p&gt;

&lt;p&gt;What is something that has gotten you excited about Ruby and/or Open Source recently?&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>ROWE, ROWE, ROWE your boat: Work can be a dream!</title>
     <link href="http://highgroove.com/articles/2012/03/13/rowe-rowe-rowe-your-boat-work-can-be-a-dream.html" />
     <updated>2012-03-13T00:00:00-04:00</updated>
     <id>http://highgroove.com/articles/2012/03/13/rowe-rowe-rowe-your-boat-work-can-be-a-dream.html</id>
     <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/revstan/4049295350/"&gt;&lt;img src="http://farm3.staticflickr.com/2551/4049295350_b1820a32bf_m.jpg" alt="Rowe your boat" style="float: right"/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Imagine you are a recent graduate eagerly awaiting the next chapter in your promising future. From a very early age you were always told that "the world is your oyster" from your parents, peers, and teachers -- a thought so established in your mind, that you are anxious for what lies ahead. Within weeks you are confidently striding through the doors of your first real job in the so-called "real world." Armed with the knowledge and work ethic instilled by the demanding four years previously spent at university, you feel almost unstoppable. You quickly make eye contact with your manager, and before you can greet him with your million-dollar smile, he informs you in his monotonous lack-of-coffee voice: "You’re late." Suddenly the feeling of inadequacy takes over and reality sets in -- you're five minutes late. The expectation of the future becomes grim and you’re convinced that work is anything but a dream... or is it?&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;For many, the scenario above is commonly associated with what a typical 9-to-5 job feels like. You come in at 8:55 (if you are running late, swing by the local donut shop to distract and disarm), pour yourself a cup of coffee, and proceed to chain yourself to your cubicle until lunch rolls around. You repeat a similar process in the afternoon.&lt;/p&gt;

&lt;p&gt;Even if your work place is somewhat "progressive", and it's not a big deal when someone rolls in late, comes in early, stays late, or simply needs to "leave early" for a doctor's appointment, there's a moment of guilt or shame -- "do I need to ask permission?" or "should I get credit for staying later than everyone else?"&lt;/p&gt;

&lt;p&gt;At Highgroove, we operate just a tiny bit differently.  We are hyper-specialists in the web development world, and that means we strive to deliver results. We are a Results Only Work Environment (&lt;a href="http://highgroove.com/tags/rowe/"&gt;ROWE&lt;/a&gt;) which simply means that our talent can work whenever from wherever, as long as the results are met.&lt;/p&gt;

&lt;p&gt;When I was first introduced to ROWE, I had a difficult time understanding what I had to do -- results are one thing (they're actually clearly defined), but when do I come in to the office? When is an ideal time to leave? Heck, do I have to come in at all?! After a few days, I realized all I really "had to do" was to deliver the results for the iteration, that's it. Armed with tools to enable development and communication where ever and when ever (I choose), and a team to help me out, I set to it.&lt;/p&gt;

&lt;p&gt;You're probably wondering why anyone in a ROWE would want to come into the office at all. The office doesn’t have to be a scary place. In fact, we tend to come into the office because it helps us accomplish our results faster than if we were working from somewhere else. Our office has everything from Herman Miller chairs to generous 24” displays, along with a plethora of knowledge willing to be shared by other Highgroovers. For many, transitioning from a typical 9-to-5 job to a ROWE can be really difficult because the typical metric of hours worked doesn’t matter anymore. As a fresh graduate, I was afraid of managing my own time, but then it became apparent to me -- I’ve been practicing ROWE for more than four years across the street at Georgia Tech!&lt;/p&gt;

&lt;p&gt;Attending university has offered some of the best experiences of my life, and ROWE enables us at Highgroove to continue living our lives while working in complete freedom. Everyday feels like a Saturday and while I haven’t been at Highgroove that long, working here has been unreal! Now excuse me, the weather is sunny and 72F out, so I’m going to take off and go for a drive, since I just finished my result of a blog post, and some work for a client!&lt;/p&gt;

&lt;p&gt;Image Credit: &lt;a href="http://www.flickr.com/photos/revstan/4049295350/"&gt;revstan on flickr&lt;/a&gt;&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>The Highgroove Test</title>
     <link href="http://highgroove.com/articles/2012/03/12/highgroove-test.html" />
     <updated>2012-03-12T00:00:00-04:00</updated>
     <id>http://highgroove.com/articles/2012/03/12/highgroove-test.html</id>
     <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/highgroove/"&gt;&lt;img src="http://farm3.staticflickr.com/2425/5819253542_f6f22bb03d.jpg" alt="Highgroove"/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Prior to working at Highgroove, I worked for a number of softare product companies. One of the best metrics
I've found for measuring how great a company is to work for as a developer is the
&lt;a href="http://www.joelonsoftware.com/articles/fog0000000043.html"&gt;Joel Test&lt;/a&gt;, which is a list of 12 simple
questions. I've worked at companies that have scored high and companies that have scored low, and
please believe me when I can tell you that the issues on that list really do make a difference.&lt;/p&gt;

&lt;p&gt;My only issue with the Joel Test is that it is really geared toward software product companies. While a lot
of the ideals translate to a software consulting company, the specific questions don't always apply when
you are working on a lot of projects for a number of clients. So, in an effort the help measure what
makes great software consulting teams so great I present...&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;h1&gt;The Highgroove Test&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;Do you give your customers access to their source code?&lt;/li&gt;
&lt;li&gt;Do you document projects expecting that your developers will eventually be "hit by a bus" (no longer be on the project)?&lt;/li&gt;
&lt;li&gt;Do you track results instead of tracking time?&lt;/li&gt;
&lt;li&gt;Do you promote Test Driven Development?&lt;/li&gt;
&lt;li&gt;Do you use and contribute to open source?&lt;/li&gt;
&lt;li&gt;Do you use code reviews?&lt;/li&gt;
&lt;li&gt;Do you use the best tools?&lt;/li&gt;
&lt;li&gt;Do you only hire the best developers?&lt;/li&gt;
&lt;li&gt;Do you require constant learning from your developers?&lt;/li&gt;
&lt;li&gt;Do you favor simple solutions?&lt;/li&gt;
&lt;li&gt;Are your developers your project managers?&lt;/li&gt;
&lt;li&gt;Do your developers deliver code to customers at least daily?&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Like the Joel Test, this isn't meant to be the be-all-end-all list of what software consulting teams should do,
but we at Highgroove believe that a team that can answer yes to these 12 questions consistently is
a great team to be a part of.&lt;/p&gt;

&lt;h2&gt;1. Do you give your customers access to their source code?&lt;/h2&gt;

&lt;p&gt;A developer should never have to feel that their customer doesn't have access to the work that's being
done. The source code is the client's property and it's important to be as transparent as possible.&lt;/p&gt;

&lt;h2&gt;2. Do you document projects expecting that your developers will eventually be "hit by a bus"?&lt;/h2&gt;

&lt;p&gt;With many of the developers at Highgroove biking to work though Atlanta's busy streets this issue is almost more
literal than figurative. Each project should have a README with all the steps needed to get the development
environment up and running with no outside input. The issue tracker should have all the information on what has
been done and what will be done in the project. To achieve this at Highgroove, we make our Pivotal Tracker projects
the authoritative source for all information about the project. Nothing should live solely in a developers head.&lt;/p&gt;

&lt;h2&gt;3. Do you track results instead of tracking time?&lt;/h2&gt;

&lt;p&gt;Tracking time gives developers the wrong incentives. A software consulting team should push to work as efficiently
as possible. Tracking hours pushes developers to stretch work to take an allotted amount of time, and forces
them to focus on the clock instead of focusing on cranking out functionality. It's inefficient and lowers the
morale of the team. Your work place shouldn't just be results only, so should your projects!&lt;/p&gt;

&lt;h2&gt;4. Do you promote Test Driven Development?&lt;/h2&gt;

&lt;p&gt;Consultants need to deliver well designed and bug resistant code efficiently and consistently. The best way to do
this is having automated testing as a key part of your development workflow. This should be part of the team's
culture. If you are not worried about catching guff for not including tests in that last commit, then your team
is not as serious about testing as it should be.&lt;/p&gt;

&lt;h2&gt;5. Do you use and contribute to open source?&lt;/h2&gt;

&lt;p&gt;If your team falls victim to the &lt;a href="http://en.wikipedia.org/wiki/Not_invented_here"&gt;Not Invented Here Syndrome&lt;/a&gt;
you are wasting your time and your client's money. Period. Making use of existing, open software allows you to
leapfrog ahead and crank out value for your clients. Contributing back to the community can get you great karma,
but more importantly better code, great marketing, and the ability for developers to scratch an itch for projects
they love to work on.&lt;/p&gt;

&lt;h2&gt;6. Do you use code reviews?&lt;/h2&gt;

&lt;p&gt;Code quality should be consistent across all members of the team. One of the best ways to ensure this is to have
regularly scheduled code reviews from all different members of the team. As a developer you get yet another pair
of eyes to guard against issues with your code and designs; As a reviewer you get to learn from all of the work your
colleagues are doing. This is one of the best ways to foster growth in the team as a whole.&lt;/p&gt;

&lt;h2&gt;7. Do you use the best tools?&lt;/h2&gt;

&lt;p&gt;This is the only hold over from the Joel Test. This is amended a little because as a developer who uses VIM and Unix
for my development environment it felt odd to say "Do you use the best tools money can buy?" A simple idea is encapsulated
in this question. If you are a software development team and there is something out there to make your developers
more awesome, why are you not using it?&lt;/p&gt;

&lt;h2&gt;8. Do you only hire the best developers?&lt;/h2&gt;

&lt;p&gt;I do not want to be the best developer in my team. To clarify, I definitely strive to be the best developer on my team,
but I do not want to be surrounded by developers aiming straight for the middle. If a team is great and getting better, you as
a developer have room to grow and get pushed to improve every day. Mediocre developers are a liability and can drag a great team
down.&lt;/p&gt;

&lt;p&gt;One key point about this question is that ability should not be confused with experience. A fast learning developer who is committed
to improvement is often a much better addition to a team than someone who has been doing a less than stellar job for a few years.&lt;/p&gt;

&lt;h2&gt;9. Do you require constant learning from your developers?&lt;/h2&gt;

&lt;p&gt;Learning should be part of the culture of a great software consulting team. Your clients expect their developers to be up on the latest
and greatest. Moreover, encouraging learning helps to keep developers engaged as they get the chance to tinker with new technologies
and best practices. Learning is a huge part of what we do here at Highgroove, from our weekly tech talks to our new company book club.&lt;/p&gt;

&lt;h2&gt;10. Do you favor simple solutions?&lt;/h2&gt;

&lt;p&gt;While, as a developer, it is always tempting to engineer a bomb proof stats engine that can generate beautiful graphs of everything you
could ever possibly want to know, sometimes all you really need is a CSV file that can be opened in Excel. Consultants should focus on
giving the client what they really need, instead of what they are asking for on a specific day and give suggestions accordingly. Moreover,
there are few bigger drags on morale as a developer than pouring hours into a solution that you know in your heart is superfluous.&lt;/p&gt;

&lt;h2&gt;11. Are your developers your project managers?&lt;/h2&gt;

&lt;p&gt;At certain scales having a separate project manager is unavoidable and can be very helpful. However, at Highgroove we've found that when
we are able to break up projects very granularly and empower developers to manage their own projects, they are much more efficient. With
developers interfacing directly with clients, there is much less overhead in communicating issues back and forth. This is more rewarding for
the developer and creates more value for the clients.&lt;/p&gt;

&lt;h2&gt;12. Do your developers deliver code to customers at least daily?&lt;/h2&gt;

&lt;p&gt;There no longer any reason for a developer to collect requirements, go into seclusion for three months and then deliver code to the client
only to have something to be a little off. Tools like &lt;a href="http://www.github.com"&gt;Github&lt;/a&gt; and &lt;a href="http://www.heroku.com"&gt;Heroku&lt;/a&gt; greatly reduce the
friction associated with releases so that they can be done multiple times throughout the day. This allows clients to catch issues or change
their minds very quickly with a minimum of rework on the developers part. The tighter the feedback loops is, the happier everyone involved with
the project will be.&lt;/p&gt;

&lt;p&gt;Here at Highgroove, we are very proud to be able to answer yes to all 12 of these questions. We believe that the way we work is a major part
of how we do a great job for our clients and what makes us such a great place to work.&lt;/p&gt;

&lt;p&gt;What else? Can you think of a better way to test for great software consulting teams?&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Refactoring: where to draw the line?</title>
     <link href="http://highgroove.com/articles/2012/03/06/refactoring-where-to-draw-the-line.html" />
     <updated>2012-03-06T00:00:00-05:00</updated>
     <id>http://highgroove.com/articles/2012/03/06/refactoring-where-to-draw-the-line.html</id>
     <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/telstar/6215633362/"&gt;&lt;img src="http://farm7.staticflickr.com/6098/6215633362_65062d6093.jpg" alt="refactoring" style="float: right"/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Refactoring"&gt;Refactoring&lt;/a&gt; is a something we spend a bit of time on at Highgroove, so much that &lt;a href="http://highgroove.com/about/david.html"&gt;David&lt;/a&gt; recently wrote about refactoring and related tools in &lt;a href="http://highgroove.com/articles/2012/02/07/red,-green,-refactor---the-tools-for-success.html"&gt;Red, Green, Refactor&lt;/a&gt; and I'm writing with even more on refactoring and the 'Refactoring Rabbithole'.&lt;/p&gt;

&lt;blockquote&gt;
"When refactoring, it's easy to see 10 other things that probably should/could be refactored"
&lt;/blockquote&gt;


&lt;p&gt;Spending time on refactoring is a tough sell to clients: by definition, the 'backend' can be completely re-done without any visible changes in an application. As the complexity and size of a project grows, refactoring can be necessary to keep things as simple as possible, keep the code quality high, and keep the number of bugs low.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;Refactoring should be done to address needs, but due to the huge number of patterns, developer habits, and differing intentions, it's easy for developers to get carried away. In the worst possible case, you end up with 'the rewrite' where part or all of the backend of an application is rewritten from scratch. This is typically not cost-effective, but is actually needed occasionally.&lt;/p&gt;

&lt;p&gt;More frequently, a developer will be implementing a small feature and see 'one small thing' to fix. Then they see a related method that could be more readable, some inconsistent naming, and before you know it they've spent the entire afternoon going down the rabbit hole and touching every file in the project.&lt;/p&gt;

&lt;p&gt;A recent project that Highgroove took on to get in 'launchable' shape looked like it was going to just require a little bit of polishing and a 'new sign-up flow', but ended up not having any test coverage and had a lot of code from it's previous development team that was overly complex (some of which was intentionally obfuscated to make it harder for 'hackers').  Our customer wanted to launch their product ASAP, but there were some features they needed that weren't yet built.&lt;/p&gt;

&lt;p&gt;We explained their current situation, testing, and refactoring, to the customer and outlined several options:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The "Nuclear" option - Redoing the application from scratch, and doing it in the Right Way following industry standard best practices.&lt;/li&gt;
  &lt;li&gt;The "Cross Our Fingers" option - Building the new sign-up flow, but sticking with the pattern of the rest of the system and not writing tests because we couldn't adequately test new features independently without touching the rest of the system.&lt;/li&gt;
  &lt;li&gt;The "Refactoring" option - Identifying parts of the system that we would need to interact with, writing tests for them, and refactoring them as needed to enable clean integration with the new features we'd be developing.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Hopefully you can guess: they chose the last option.  We spent several iterations adding tests, improving code quality, and once we got the point where we could start adding the new functionality, we stopped.  There were still random abbreviations, huge swaths of untested code, and things that we didn't understand, but our client had a time budget that we needed to stick to.
This was hard! As developers, we like doing things the Right Way which means shipping high-quality, well-tested applications. In this case, we had to settle for something much less than perfect.&lt;/p&gt;

&lt;p&gt;For every major issue we identified, we updated the README with suggestions for future development, and for every issue regardless of size we created stories in pivotal tracker, anywhere from "Refactor the Foo model to replace all occurrences of SOS with SaveOurShipMessage or save_our_ship_message" to "Figure out what the baz method does, give it an appropriate name, write tests, and refactor for readability."  Some of these things got done as we wrote code that interacted with them, and many more are still in their backlog, hoping to be eventually done.&lt;/p&gt;

&lt;p&gt;Just like any new functionality, for any refactoring ideas we make stories for each one.  We keep these stories as descriptive and simple as possible, and they get prioritized by the client like any other stories. Seeing these stories pile up in the backlog and knowing that the issue won't be forgotten is usually enough to keep me from taking refactoring further than I need to.&lt;/p&gt;

&lt;p&gt;How do you control your insatiable urge to rewrite everything? How do you sell refactoring to customers?&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Startup Riot Sponsorship Worth It</title>
     <link href="http://highgroove.com/articles/2012/03/01/startup-riot-sponsorship-worth-it.html" />
     <updated>2012-03-01T00:00:00-05:00</updated>
     <id>http://highgroove.com/articles/2012/03/01/startup-riot-sponsorship-worth-it.html</id>
     <content type="html">&lt;p&gt;&lt;img src="http://distilleryimage11.s3.amazonaws.com/4a3e30a65d6a11e1a87612313804ec91_7.jpg" alt="Startup Riot Sponsors and Startups courtesy: @eyelovelife" style="float: right;" width="200" height="200" /&gt;&lt;/p&gt;

&lt;p&gt;Last Wednesday &lt;a href="http://highgroove.com/about/charles.html"&gt;CBQ&lt;/a&gt; and I attended &lt;a href="http://startupriot.com/"&gt;Startup Riot&lt;/a&gt; on behalf of Highgroove. We heard 3 minute pitches (and 3 minutes of questions from an expert panel) from 25 startups. This is easily the biggest event in the Atlanta startup community; missing it is not an option and sponsoring was a no brainer for us.  We love working with startups, since we used to be one.  Read more to learn about how we sponsored this event, and what we got out of it.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;First of all: &lt;a href="http://startupriot.com/faq"&gt;What is Startup Riot SHOW?&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;"Startup Riot SHOW is an all-day event which highlights 25 startups through three minute, four slide presentations given by the startups. The startups subsequently answer questions from a judging panel for three minutes. There are a few important aspects that make Startup Riot SHOW different than any other startup conference you've heard about or been to."&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Pitching an idea in three minutes &lt;a href="http://www.fastcompany.com/magazine/162/how-to-pitch-a-startup"&gt;isn't easy&lt;/a&gt;. It's the perfect amount of time for each presenter to not only convey what problem they intend to solve but also how. At Startup Riot, our involvement was not confined to three minutes but rather three events.&lt;/p&gt;

&lt;p&gt;Highgroove achieved three goals with our sponsorship:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://startupriot.com/make/"&gt;MAKE&lt;/a&gt; | Collaborating: At the MAKE event we &lt;a href="http://startupriot.com/make/"&gt;blogged live&lt;/a&gt; about how we lent a hand to developers there by offering help in the form of knowledge and programming chops. This environment is an extension of how we operate internally: collaborate, iterate and ship it, quick! We love building great web apps and the MAKE event allowed us to share our expertise. In addition to helping establish us as experts at building back-end web applications, we made some great connections and saw some of our open-source libraries for Rails in action, in the wild.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://startupriot.com/join/"&gt;JOIN&lt;/a&gt; | Recruiting: At the JOIN event we &lt;a href="https://twitter.com/#!/highgroove/statuses/172071381238947842"&gt;manned a table&lt;/a&gt; to present the allure of what brings the &lt;a href="http://highgroove.com/about.html"&gt;best Ruby developers&lt;/a&gt; to work here. A recruiting event is a long-term investment. The people you meet are looking for a great job, but they also know people who are looking for an great job, too. Even if they're not a good fit for your company, you might have a connection for them, and they might have a connection for you. It's networking 101, and Startup Riot's JOIN event has netted us one fantastic hire, and we've got a few more in our queue (in our hiring process right now).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://startupriot.com/make/"&gt;SHOW&lt;/a&gt; | Networking: And lastly, at the SHOW event we mingled with some Atlanta's most passionate and capable entrepreneurs.  It was personally exciting as a rookie in the startup scene. By the end of the day networking and note taking had paid off.  I had signed up for numerous Betas, exchanged cards, and handed out lots of &lt;a href="http://yourdailyinstagram.com/test/?hashtag=wolfbrain"&gt;wolfbrains&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Congratulations to &lt;a href="http://www.viacycle.com/"&gt;viaCycle&lt;/a&gt; on winning 1st place! We, of course, couldn't be happier about more bikes on the streets here in Atlanta. More photos from the event are &lt;a href="https://secure.flickr.com/photos/sanjayparekh/sets/72157629430264063/"&gt;here&lt;/a&gt;.  We're already looking forward to next year, &lt;a href="http://sanjayparekh.com/"&gt;Sanjay&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For more on Startup Riot itself, check out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://davidcummings.org/2012/02/22/startup-riot-2012-atlanta/"&gt;David Cummings Startup Riot 2012 Recap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://smileysteve.net/2012/03/01/startup-riot-2012/"&gt;Smiley Steve on Startup Riot 2012&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;How does your company give back to the community that supports you?&lt;/p&gt;

&lt;p&gt;Image credit: &lt;a href="http://instagr.am/p/HUCRqMt9Wj/"&gt;eyelovelife&lt;/a&gt;&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Writing Readable Ruby</title>
     <link href="http://highgroove.com/articles/2012/02/28/writing-readable-ruby.html" />
     <updated>2012-02-28T00:00:00-05:00</updated>
     <id>http://highgroove.com/articles/2012/02/28/writing-readable-ruby.html</id>
     <content type="html">&lt;p&gt;&lt;img src="http://i.imgur.com/LArF7.jpg" alt="See below for how to avoid this" style="float: right;" width="200" height="200" /&gt;&lt;/p&gt;

&lt;p&gt;Ruby inherits the philosophy of "there's more than one way to do it," or &lt;a href="http://en.wikipedia.org/wiki/There's_more_than_one_way_to_do_it"&gt;TMTOWTDI&lt;/a&gt;, from Perl. Of course, TMTOWTDI is worthless unless at least a handful of those ways can be written clearly not just for the author, but (perhaps more importantly) for future readers and editors. So, how do you make the best use of the many ways Ruby and Rails allow you to do things?&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;Before Ruby, the experience I had in dynamic, interpreted languages was with Python – a language with a totally opposite motto, "There should be one, and preferably only one, obvious way to do it." As such, Ruby and Rails were somewhat of a shock. The first thing that comes to mind about loose dynamically-typed languages like Perl and Ruby is usually, "But it'll be so easy to write bad code!"&lt;/p&gt;

&lt;p&gt;And it is! As the author of &lt;em&gt;&lt;a href="http://www.amazon.com/Eloquent-Ruby-Addison-Wesley-Professional/dp/0321584104"&gt;Eloquent Ruby&lt;/a&gt;&lt;/em&gt; says, Ruby is a "language for grownups," meaning that writing ugly, hard-to-maintain code is certainly possible, but this freedom allows for beautifully expressive, concise, and readable code.&lt;/p&gt;

&lt;p&gt;Here are some guidelines that I and other Highgroovers use to make sure we achieve the latter whenever we can:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Write functional.&lt;/strong&gt; Why write code that looks imperative when it doesn't really change any state? Enumerable methods like &lt;code&gt;sort_by&lt;/code&gt; and &lt;code&gt;reduce&lt;/code&gt; go a long way towards making code understandable in less time, as does the ubiquitous &lt;code&gt;Symbol#to_proc&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use method synonyms&lt;/strong&gt; that make sense. It seems like many newcomers to Ruby are wary of using more than one name for the same method. For example, you can retrieve the number of elements in an array with &lt;code&gt;#count&lt;/code&gt;, &lt;code&gt;#length&lt;/code&gt;, or &lt;code&gt;#size&lt;/code&gt;. Which one you use depends on why the number of elements is needed, and what "sounds right" in the given section of code. Synonyms also make it easier to&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Make syntax English-like&lt;/strong&gt; when reasonable. Readers of &lt;a href="http://mislav.uniqpath.com/poignant-guide/"&gt;_why's poignant guide&lt;/a&gt; know this already, and know how it can make reading code more like a game than a chore. This includes using the right synonyms for a method as above, as well as choosing your own variable and method names cleverly. Why name a method that returns a list of primes less than &lt;code&gt;n&lt;/code&gt; like &lt;code&gt;primes(n)&lt;/code&gt; when it could just be &lt;code&gt;primes_less_than n&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Review!&lt;/strong&gt; Of course, it isn't always possible to stick with these guidelines. Business logic can get messy and working with legacy code can make English-like syntax a pipe dream. But having your code reviewed can reveal which bits can be fixed easily, as well as which bits are completely opaque to a newcomer.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;As an example of putting these into action, let's write a method that turns a hypothetical Rails model into a hash of its reports; we need to convert every report to a hash, combine them, and return it. Here's the straight imperative way:&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/1938258.js?file=gistfile1.rb'&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;def to_hash
  hash = {}
  @reports.each do |report|
    hash.merge! report.to_hash
  end
  hash
end&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;It gets the job done, but it ain't pretty; again, the &lt;code&gt;#merge!&lt;/code&gt; method seems out of place, since it implies a change in state and the only thing really changing is the return value, which should be expected.&lt;/p&gt;

&lt;p&gt;Here's a more functional way:&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/1938271.js?file=gistfile1.rb'&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;def to_hash
  @reports.inject({}) do |report_hash, report|
    report_hash.merge report.to_hash
  end
end&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;This is a bit shorter, and the fact that &lt;code&gt;@reports&lt;/code&gt; is the "subject" being method chained and then returned makes it clearer that the return value is just some transformation of the model's reports. But let's try to make it almost readable English:&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/1938282.js?file=gistfile1.rb'&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;def to_hash
  @reports.map(&amp;amp;:to_hash).reduce({}, :merge)
end&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;This is much shorter, and translates easily to its purpose: Take this instance's reports, map them to hashes, and reduce them by merging them together. It's also nearly &lt;a href="http://en.wikipedia.org/wiki/Tacit_programming"&gt;point-free&lt;/a&gt; since the &lt;code&gt;map&lt;/code&gt; and &lt;code&gt;reduce&lt;/code&gt; blocks just take method symbols.&lt;/p&gt;

&lt;p&gt;Of course, personal tastes will vary on whether this is the ideal way of representing this or that method. But for me, the guidelines above have led to generally clearer, more comprehensible code during review.&lt;/p&gt;

&lt;p&gt;How do you make sure your code is clear and concise?&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Salesforce on Rails with the Databasedotcom Gem</title>
     <link href="http://highgroove.com/articles/2012/02/28/salesforce-on-rails.html" />
     <updated>2012-02-28T00:00:00-05:00</updated>
     <id>http://highgroove.com/articles/2012/02/28/salesforce-on-rails.html</id>
     <content type="html">&lt;p&gt;&lt;a href="https://img.skitch.com/20120228-frha4y3ah4fhbmpa778i7x9dtd.jpg"&gt;&lt;img src="https://img.skitch.com/20120228-frha4y3ah4fhbmpa778i7x9dtd.jpg" style="float: right" height="200" width="200"/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At Highgroove, we're always looking for new ruby gems to help speed up development and keep the code DRY.  The gem I found this time was Heroku's very own &lt;a href="https://github.com/heroku/databasedotcom"&gt;Databasedotcom&lt;/a&gt; gem, a fantastic Salesforce.com API wrapper for Ruby!  I must admit, I wasn't very surprised to find a gem since &lt;a href="http://techcrunch.com/2010/12/08/breaking-salesforce-buys-heroku-for-212-million-in-cash/"&gt;Salesforce owns Heroku&lt;/a&gt;, but I did not expect it to be so fantastic and easy to use.  Here's how!&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;There are only a few steps involved in getting the Databasedotcom gem connected to your salesforce instance and working:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a new Databasedotcom::Client instance - &lt;code&gt;client = Databasedotcom::Client.new(:client_id =&amp;gt; ENV['SALESFORCE_KEY'], :client_secret =&amp;gt; ENV['SALESFORCE_SECRET'])&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Authenticate with Salesforce - &lt;code&gt;client.authenticate :token =&amp;gt; SALESFORCE_OAUTH2_TOKEN, :instance_url =&amp;gt; INSTANCE_URL, :refresh_token =&amp;gt; SALESFORCE_REFRESH_TOKEN&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Create a Ruby Class from a Salesforce Object - &lt;code&gt;client.materialize("Contact")&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Use the newly available Ruby class named 'Contact' and use ActiveRecord::Base methods on it.  The gem will translate the ActiveRecord syntax into SOQL and API calls for you just like you're used to in Rails with any other database adapter!&lt;/li&gt;
&lt;li&gt;For example: &lt;code&gt;Contact.find_or_create_by_FirstName_and_LastName(:FirstName =&amp;gt; 'Daniel', :LastName =&amp;gt; 'Rice')&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;There are many other ways to use this gem, and its possible to interface with custom objects and custom fields, but I wanted to mainly illustrate how few lines of code it takes to make a Salesforce integration thanks to the awesome job by the Heroku team.&lt;/p&gt;

&lt;p&gt;To see more use cases, features, and general information about this gem, please check out the &lt;a href="https://github.com/heroku/databasedotcom"&gt;Databasedotcom gem's README&lt;/a&gt; on Github.&lt;/p&gt;

&lt;p&gt;Image Credit: &lt;a href="http://www.salesforce.com"&gt;Salesforce.com&lt;/a&gt; *No Software logo is a registered trademark of Salesforce.com&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Rails and CanCan: Authorization for Specific Fields</title>
     <link href="http://highgroove.com/articles/2012/02/24/rails-and-cancan%3A-authorization-for-specific-fields.html" />
     <updated>2012-02-24T00:00:00-05:00</updated>
     <id>http://highgroove.com/articles/2012/02/24/rails-and-cancan%3A-authorization-for-specific-fields.html</id>
     <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/new_and_used_tires/6549497793/"&gt;&lt;img src="http://farm8.static.flickr.com/7165/6549497793_ab696cbc17_m.jpg" style="float: right"/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A recent project we worked on at Highgroove involved scheduling events
on a calendar. These events had a lifecycle of "statuses," such as
"pending approval" and "approved."&lt;/p&gt;

&lt;p&gt;All users were able to set the "status" to values such as "pending
approval," but only certain privileged users could move them to states
such as "approved."&lt;/p&gt;

&lt;p&gt;We were already using &lt;a href="https://github.com/ryanb/cancan"&gt;CanCan&lt;/a&gt; for
authorization, but there was no built-in facility for authorizing
field-level changes. There were workarounds in certain cases, such as
using &lt;a href="https://github.com/ryanb/cancan/wiki/Custom-Actions"&gt;custom
actions&lt;/a&gt;, but none
of these fit with our specific use case.&lt;/p&gt;

&lt;p&gt;Read on for how we modeled the problem and used a Plain Old Ruby Object
(PORO) to keep things clean.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;We wanted to route edits to an event, including status changes, through
the &lt;code&gt;EventsController#update&lt;/code&gt; action because users could edit both the
status and other attributes from the same &lt;code&gt;#edit&lt;/code&gt; view.&lt;/p&gt;

&lt;p&gt;We really wanted to avoid code that looked like below:&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/1903397.js?file=events_controller.rb'&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;class EventsController &amp;lt; ActionController::Base
  load_and_authorize_resource

  def update
    # UGH!
    if @event.status != params[:event][:status]
      unless current_user.admin? || [&amp;quot;pending approval&amp;quot;].include?(params[:event][:status])
        render status: :unauthorized and return
      end
    end

    # ...
  end
end&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;It might make sense for the controller to &lt;em&gt;enforce&lt;/em&gt; the authorization,
but it did not make sense to us for the code to &lt;em&gt;perform&lt;/em&gt; the
authorization to appear in-line within the controller.&lt;/p&gt;

&lt;p&gt;At some point we realized that we could create a Plain Old Ruby Object
(PORO) to model the "event status change" and then use the facilities
that CanCan already provided to authorize the change.&lt;/p&gt;

&lt;p&gt;First, we created an &lt;code&gt;EventStatusChange&lt;/code&gt; class in
&lt;code&gt;lib/event_status_change.rb&lt;/code&gt;; note that this class has no Rails dependencies.&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/1903397.js?file=event_status_change.rb'&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;class EventStatusChange
  attr_reader :event, :new_status

  def initialize(event, new_status)
    @event      = event
    @new_status = new_status
  end
end&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;(Astute readers may have noticed that &lt;code&gt;EventStatusChange&lt;/code&gt; could be
implemented as a one-liner using &lt;code&gt;Struct&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;Next, we added code to the &lt;code&gt;Ability&lt;/code&gt; class where CanCan authorization
code normally lives:&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/1903397.js?file=ability.rb'&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;class Ability
  include CanCan::Ability

  def initialize(user)
    # ...

    can :perform, EventStatusChange do |status_change|
      user.admin? || [&amp;quot;pending approval&amp;quot;].include?(status_change.new_status)
    end

    # ...
  end
end&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;Finally, we did have to keep some code in the controller, but it looks
much cleaner:&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/1903397.js?file=events_controller_with_can_can.rb'&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;class EventsController &amp;lt; ActionController::Base
  load_and_authorize_resource

  def update
    if @event.status != params[:event][:status]
      authorize! :perform, EventStatusChange.new(@event, params[:event][:status])
    end

    # ...
  end
end&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;We are not completely sure this is the &lt;em&gt;best&lt;/em&gt; way to approach the
problem, but it seemed pretty reasonable to us at the time. While not
shown here, many of the pieces can be tested in isolation with external
objects as stubs; we also found that ability to be a big win.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Have you ever tried to authorize changes to specific fields in Rails?
If so, how did you approach it?&lt;/strong&gt;&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Why Highgroove has a Personal Trainer</title>
     <link href="http://highgroove.com/articles/2012/02/21/why-highgroove-has-a-personal-trainer.html" />
     <updated>2012-02-21T00:00:00-05:00</updated>
     <id>http://highgroove.com/articles/2012/02/21/why-highgroove-has-a-personal-trainer.html</id>
     <content type="html">&lt;p&gt;&lt;img src="http://i.imgur.com/fxgnx.png" alt="Brule" style="float: right;" width="200" height="200" /&gt;&lt;/p&gt;

&lt;p&gt;At Highgroove, we have a personal trainer, &lt;a href="http://highgroove.com/about/cherri.html"&gt;Cherri&lt;/a&gt;, on-staff and on-site, available twice a week to us, scheduled via Appointment Slots using Google Calendar.  Our personal trainer has been with us since December of last year, and we just added more sessions.  We have been delighted at the opportunity to get in shape (although, perhaps, temporarily less thrilled when "core day" came around). Personally, having someone motivate us to exercise -- someone who thoroughly knows what they are doing was exactly the motivation I needed to start working out again. But we've also realized getting a gym session in during the afternoon has benefits for developing software (along with developing sweet abs).&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;The sessions are personally catered to each of us, last just thirty intense minutes, and with the gym just downstairs, it's a quick walk over to start working out. It's an even quicker walk when Cherri sends you an email, reminding you that your session starts in 1 minute.  With such a short work out session, and scheduled in the middle of the work day (almost all sessions are after lunch), you would think it would cause a break in productivity, but the opposite actually happens.&lt;/p&gt;

&lt;p&gt;In fact, Lifehacker has posted about the &lt;a href="http://lifehacker.com/5885948/try-exercising-during-the-middle-of-the-day-for-an-energy-and-productivity-boost"&gt;benefits of a workday workout&lt;/a&gt;, explaining that it improves energy and alertness as well as productivity. The article fits my and other Highgroover's experiences perfectly: working out gives an energy boost that used to be gained by an extra double-shot of espresso, and also gives us time to mentally work out the programming problems wracking our brains. We can return to work refreshed (if a little sweatier) and ready to tackle things from a new perspective. It almost seems counter-intuitive, but after a work out, we have all remarked on the productivity increase.  It's real!&lt;/p&gt;

&lt;p&gt;What healthy habits give you a productivity boost?&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Working Hard or Working Efficiently?</title>
     <link href="http://highgroove.com/articles/2012/02/21/efficiency-over-effort.html" />
     <updated>2012-02-21T00:00:00-05:00</updated>
     <id>http://highgroove.com/articles/2012/02/21/efficiency-over-effort.html</id>
     <content type="html">&lt;p&gt;&lt;img src="http://mimg.ugo.com/201006/48328/cuts/a-pharaoh-to-remember_288x288.jpg" alt="Bender" style="float: right;" width="200" height="200" /&gt;&lt;/p&gt;

&lt;p&gt;Companies often feel that they are getting the most out of their employees if everyone is working as hard as possible for as long as possible.  However, this can be exhausting on the employees and can lead to diminishing returns.  We feel that the better approach is to emphasize efficiency over effort, and our level of productivity speaks for itself.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;Working in a ROWE gives us an advantage in working efficiently because we can better handle common productivity pitfalls.  Stress rears its ugly head in many projects.  In a typical 9-to-5 (or even later) the employee is chained to their chair and must work until the end of the day, or until a moment of escape presents itself.  How much work is actually done in those last few hours as stress goes up and morale goes down?  Because we have the freedom to work when we want we are able to step away from our projects for a few hours, do something that relaxes us, and try to tackle the problem in a better mindset.  Given the break time we may work fewer hours in the day overall, but those fewer hours produced more than the stressed employee.  The resulting code is also likely of a higher quality due to the more focused employee making fewer careless mistakes.&lt;/p&gt;

&lt;p&gt;We are also able to avoid burnout by taking advantage of productivity bursts.  Every developer has been on a programming tear, where they are able to crank out code at a blistering pace and don't want to stop for fear of losing momentum.  When they are done they may have completed a day's work in a few hours.  What to do next?  Whatever you want, as long as you're meeting your client's needs.&lt;/p&gt;

&lt;p&gt;Emphasizing efficiency over effort leads to happier employees, fewer errors, a higher quality product, and happy clients.  Everyone wins.  What other strategies can you use to maximize efficiency?&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Another Reason To Use Github</title>
     <link href="http://highgroove.com/articles/2012/02/20/github-support.html" />
     <updated>2012-02-20T00:00:00-05:00</updated>
     <id>http://highgroove.com/articles/2012/02/20/github-support.html</id>
     <content type="html">&lt;p&gt;&lt;img src="http://octodex.github.com/images/okal-eltocat.jpg" alt="Super Octocat" style="float: right;" width="200" height="200" /&gt;&lt;/p&gt;

&lt;p&gt;While getting to know the very sweet &lt;a href="http://developer.github.com/"&gt;Github Api v3&lt;/a&gt;, I ran into a little bug when trying to page though results coming back from the service. While it was frustrating at the time, Github's support and resolution blew me out of the water.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;For a new in-house project, we would like to be able to grab the commit messages for a number of our repositories that live in Github. Using the &lt;a href="https://github.com/pengwynn/octokit"&gt;octokit gem&lt;/a&gt; with the &lt;code&gt;auto_traversal&lt;/code&gt; option turned on, this is trivially easy. Because of a bug in the Github api, when the gem tried to page though the results, the link it got for the next page was always the same. This caused an infinite loops of http requests, and me to try to pull all of my hair out.&lt;/p&gt;

&lt;p&gt;Once I threw a few &lt;a href="https://github.com/pry/pry"&gt;pry&lt;/a&gt; bindings into the project and was able to track the issue, I was able to easily hunt down Github's support for issues with the API (it was right on the docs page for the API). All that was required to get a fix deployed for the issue was a quick email with steps to reproduce the bugs and less than 24 hours of patience!&lt;/p&gt;

&lt;p&gt;The fact that the Github crew was able to submit a fix to their live service before I could submit a pull request to octokit with a workaround reminds me why they stand out in my mind as a great web app. Not only is their site feature rich and easy to use, but they've got a great team backing the technology up. That's why we at Highgroove trust them with our code and why we recommend them to clients.&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Live from StartupRiot MAKE</title>
     <link href="http://highgroove.com/articles/2012/02/18/live-from-startupriot-make.html" />
     <updated>2012-02-18T00:00:00-05:00</updated>
     <id>http://highgroove.com/articles/2012/02/18/live-from-startupriot-make.html</id>
     <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/highgroove/6897427255/" title="Lots of MAKEing going on. Building companies, products, games at @startupriot MAKE by highgroove, on Flickr"&gt;&lt;img src="http://farm8.staticflickr.com/7039/6897427255_eb657a522c_m.jpg" width="240" height="180" alt="Lots of MAKEing going on. Building companies, products, games at @startupriot MAKE" align="right"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://startupriot.com/"&gt;StartupRiot MAKE&lt;/a&gt; event kicked off last night at ATDC with the help of &lt;a href="http://sanjayparekh.com/"&gt;Sanjay Parekh&lt;/a&gt; and some very awesome sponsors and teams.&lt;/p&gt;

&lt;p&gt;We're happy to be a part of this awesome event.  At 5 pm on Friday, teams started trickling in and sponsors started setting up displays.  The food arrived and many people began networking and planning already.&lt;/p&gt;

&lt;p&gt;At 6 pm, Sanjay announced the teams, and each team got up and spoke about what they were building, and what they needed -- be it a designer, some mobile development help, or back-end development.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;There are some awesome prizes, but I am pretty sure the teams that are here, while they are happy to win, are actually here because they enjoy making and building things using technology.  You can actually tell, because in addition to building products (we've already seen a few working demos), they're helping each other, offering encouragement, and feedback.&lt;/p&gt;

&lt;p&gt;A few of us from Highgroove are here this weekend offering help in the form of knowledge and programming chops.  Since we've built products and services for companies both big and soon-to-be-big, we're pretty opinionated about what we've seen that works and doesn't work in a modern web application.  Our actual real service, though, that we're offering is something that comes natural to us:  "Just Keeping it Simple" and saying "No" to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;complicated features (keep it simple!)&lt;/li&gt;
&lt;li&gt;overly generic solutions (hyper-specialize instead)&lt;/li&gt;
&lt;li&gt;building it yourself (instead of leveraging open source)&lt;/li&gt;
&lt;li&gt;scaling too soon (start small, scale later)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Good luck teams!&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Tech Talk on Visualizing Scaling</title>
     <link href="http://highgroove.com/articles/2012/02/17/tech-talk-on-visualizing-scaling.html" />
     <updated>2012-02-17T00:00:00-05:00</updated>
     <id>http://highgroove.com/articles/2012/02/17/tech-talk-on-visualizing-scaling.html</id>
     <content type="html">&lt;p&gt;&lt;img src="/images/blog/distributed-data-animations.png" align="right"&gt;&lt;/p&gt;

&lt;p&gt;This week's Tech Talk was on Visualizing Scaling, and Consistent Hashing techniques for scaling data.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://highgroove.com/about/patrick.html"&gt;Patrick&lt;/a&gt; talked through several visualizations he created in HTML5 to visually explain many common scaling techniques.&lt;/p&gt;

&lt;p&gt;If you've heard of the techniques and algorithms: "sharding" or "master-slave", or even "consistent hashing" for distributing data across servers, but never really known how they work, this talk goes through the basics and shows visually how data can be scaled out across multiple servers.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;"I never really understood some of these techniques until I saw them visually", says Patrick, who has implemented many of these techniques for Highgroove's many clients.  He details the pros and cons and even how and when to start considering these techniques for scaling.&lt;/p&gt;

&lt;p&gt;Check out the animations here on Github:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/vanstee/distributed-data"&gt;https://github.com/vanstee/distributed-data&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And, be sure to check out the video on Vimeo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://vimeo.com/36985167"&gt;Consistent Hashing Tech Talk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Interested in attending (or even presenting) at our weekly Tech Talks?  Check out our upcoming &lt;a href="https://www.facebook.com/highgroove/events"&gt;Highgroove Events on Facebook&lt;/a&gt;.&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>If the Shoe Fits, Ship it!</title>
     <link href="http://highgroove.com/articles/2012/02/17/if-the-shoe-fits-ship-it.html" />
     <updated>2012-02-17T00:00:00-05:00</updated>
     <id>http://highgroove.com/articles/2012/02/17/if-the-shoe-fits-ship-it.html</id>
     <content type="html">&lt;p&gt;&lt;a href="http://r.ebay.com/t38iSW"&gt;&lt;img src="http://twotoneatl.com/wp-content/uploads/2012/02/Screen-Shot-2012-02-17-at-1.17.51-AM.jpg" width="240", height="207" alt="Squirrel Shipping Sweet Cycling Shoes" align="right"/&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In January of 2012, after spending the holidays 'funemployed' (OK, just on vacation) down in sunny Florida logging some &lt;a href="http://twotoneatl.com/tag/rapha500/"&gt;EPIC miles&lt;/a&gt;, I very excitedly boarded the Highgroove &lt;a href="http://highgroove.com/articles/2011/12/15/tracking-time-the-rowe-way.html"&gt;ROWE&lt;/a&gt;-boat as our first Account Director.&lt;/p&gt;

&lt;p&gt;The month of January left me dazed but not confused. Working in a ROWE environment means results are expected immediately (and that results are all that matter). I hit the ground running and quickly found that everyone here is equally vested each project's success. That is to say, pardon the pun: "the rising tide lifts all boats" here at Highgroove.  By leveraging constant communication, the best tools, pair programming, code audits, and project retrospectives -- we truly are an &lt;a href="http://highgroove.com/articles/2010/10/29/agile-development-agile-product.html"&gt;agile&lt;/a&gt; shop.&lt;/p&gt;

&lt;p&gt;Read on to find out how I learned about what we do best, what makes us different, and what that means to me as our Account Director.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;After only having been on the job not even two months, I am still new but no longer the new guy.  Reading &lt;a href="http://highgroove.com/articles/2011/04/05/month-two-at-highgroove.html"&gt;Andy's Post 2 Months in at Highgroove&lt;/a&gt;, I feel humbled to be &lt;a href="http://highgroove.com/about.html"&gt;listed alongside&lt;/a&gt; some pretty amazing colleagues here. Similar to &lt;a href="http://highgroove.com/articles/2012/01/16/getting-in-the-groove.html"&gt;Will's First Reactions at Highgroove&lt;/a&gt;, I've been good friends with several Highgroovers for years. Plus, I knew Highgroove worked on amazing projects with even more amazing clients.&lt;/p&gt;

&lt;h2&gt;What we do Best&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;We know that our clients benefit from constant communication with developers.&lt;/em&gt; Small issues are consistently caught before they become large problems. Our collaborative environment is filled with brilliant people producing refined, simple solutions in Ruby and Ruby on Rails to complicated and challenging backend software application projects. Not to mention, those brilliant people don’t have to freak out if they're running "late" into the office because of the &lt;a href="http://www.nytimes.com/2011/01/21/us/21atlanta.html?_r=1_"&gt;worst traffic in the country&lt;/a&gt;. As Daniel points out: &lt;a href="http://highgroove.com/articles/2011/06/08/first-month-down.html"&gt;There is no late to the office&lt;/a&gt;, since work can be done (and is done) when and where it makes sense. Highgroove uses collaborative, agile tools because they lead to extremely high quality code at every stage of a project. My long time friend and resident Methodologist, Chris Kelly, emphasized this in a &lt;a href="http://highgroove.com/articles/2011/03/21/iterations-are-dead-long-live-iterations.html"&gt;great post on iterations&lt;/a&gt; last year. Let's review:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We're Project-Manager-less. We offer clients direct Contact with developers who actually do the work. No watered down communication or confusion.&lt;/li&gt;
&lt;li&gt;We're hyper-specialists. We're experts in backend web development in Ruby and Ruby on Rails. We know what we're good at, and stick to it.&lt;/li&gt;
&lt;li&gt;We're ROWE. We don't care when or where work happens, all that matters is that the work gets done.&lt;/li&gt;
&lt;li&gt;We're Agile. Highgroove walks the walk and follows all &lt;a href="http://agilemanifesto.org/principles.html"&gt;12 Principles&lt;/a&gt; on ALL projects.&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;What makes us Different&lt;/h2&gt;

&lt;p&gt;Ok, those are neat characteristics but what REALLY makes us different? Our friends at &lt;a href="http://matchstic.com"&gt;Matchstic&lt;/a&gt; helped us uncover our Core Values (Attributes) at their &lt;a href="http://matchstic.com/blog/2011/03/brand-camp-may/"&gt;Brand Camp&lt;/a&gt;. Hear it straight from the horse's mouth, as &lt;a href="http://highgroove.com/about/charles.html"&gt;CBQ&lt;/a&gt; &lt;a href="http://vimeo.com/27440068"&gt;shares the camp's impact on our business.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our Core Values are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Personable&lt;/li&gt;
&lt;li&gt;Optimistic&lt;/li&gt;
&lt;li&gt;Trusting&lt;/li&gt;
&lt;li&gt;Craftsmanship&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Knowing our core values helps us not only know what shoes fit in the client department, but also how to hire, how to communicate and what firms we should partner with. I have found (like all Highgroovers) that I identified with each attribute, which is how I knew I was at the right place.&lt;/p&gt;

&lt;h2&gt;What that Means to me as our Account Director&lt;/h2&gt;

&lt;p&gt;Now back to the 'shipping'. Since we're an agile shop, one of my favorite parts about working at Highgroove is our 'Bias Towards Action'. We just &lt;em&gt;Ship it!&lt;/em&gt; and then we iterate and ship it again until it's the best it can be. As Account Director this all means one thing:  The value we offer resides in our proven process and unique brand. Our office manager &lt;a href="http://highgroove.com/about/megan.html"&gt;Megan&lt;/a&gt; underscored the importance of this this process &lt;a href="http://highgroove.com/articles/2011/01/20/a-day-in-the-life-of-agile-hands-on-workshop.html"&gt;at an Agile Workshop she attended&lt;/a&gt;, because it supports client needs at the highest level, encourages focused development, and fundamentally promotes efficiency. And there's where the rubber meets the road and why &lt;a href="http://highgroove.com/faq.html"&gt;being in the 'Highgroove'&lt;/a&gt; truly sets us apart. We know what shoe fits whether it means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the right client fit for a project,&lt;/li&gt;
&lt;li&gt;the right tools and&lt;/li&gt;
&lt;li&gt;the right team&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;I am now a bona-fide member of the just 'Ship It' club, in my both my personal and work life. At Highgroove we know what fits best, we know what sets us apart, and we just 'ship it!'&lt;/p&gt;

&lt;p&gt;Have you ever thought about what makes your company really unique?&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>You Must Teach To Be Taught</title>
     <link href="http://highgroove.com/articles/2012/02/14/you-must-teach-to-be-taught.html" />
     <updated>2012-02-14T00:00:00-05:00</updated>
     <id>http://highgroove.com/articles/2012/02/14/you-must-teach-to-be-taught.html</id>
     <content type="html">&lt;div style="width:260px;float:right;"&gt;
  &lt;a title="Athens Code Retreat" href="https://img.skitch.com/20120215-bs3cr5ewana1mbgqxrfbkbxn7p.png"&gt;
    &lt;img src="https://img.skitch.com/20120215-bs3cr5ewana1mbgqxrfbkbxn7p.png" width="240", height="207" alt="Athens Code Retreat"/&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Waaaayyy back in December, I had the pleasure of &lt;a href="http://highgroove.com/articles/2011/12/13/lessons-learned-at-global-day-of-coderetreat.html"&gt;attending a code
retreat&lt;/a&gt;.
In that post, I discussed what I learned.&lt;/p&gt;

&lt;p&gt;This month, I had the pleasure of facilitating a &lt;a href="http://coderetreat.org"&gt;code
retreat&lt;/a&gt; &lt;a href="http://www.eventbrite.com/event/2604969534"&gt;a few weeks
ago&lt;/a&gt;.  Thanks to
&lt;a href="http://highgroove.com"&gt;Highgroove&lt;/a&gt;, &lt;a href="https://www.tapjoy.com/"&gt;TapJoy&lt;/a&gt;,
&lt;a href="http://www.fourathens.com/"&gt;FourAthens&lt;/a&gt;, and my co-coordinator &lt;a href="https://twitter.com/#!/travisdouce"&gt;Travis
Douce&lt;/a&gt;, the Athens Code Retreat was a resounding
success.&lt;/p&gt;

&lt;p&gt;Also, a special shout out to our &lt;a href="http://coderetreat.org/events/coderetreat-rubyfuza-cape-town"&gt;Code Retreat homies in South
Africa&lt;/a&gt; led by
&lt;a href="http://coreyhaines.com/"&gt;Corey Haines&lt;/a&gt;, who handed off the baton to us late in
their day but early in ours.&lt;/p&gt;

&lt;p&gt;Read on to find out how lessons learned from facilitating compares to attending,
how the general "You" actually means "I" in the blog title, and how many times
it takes (me) to learn the four rules of simple design.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;The purpose of a Code Retreat is to get better, to practice one's craft in
a setting without the pressure of "getting it done, yesterday(tm)."  Throughout
the Code Retreat, we emphasize the &lt;a href="http://c2.com/cgi/wiki?XpSimplicityRules"&gt;4 rules of simple
design&lt;/a&gt;.  Another way to paraphrase
them:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tests pass.&lt;/li&gt;
&lt;li&gt;Good naming.&lt;/li&gt;
&lt;li&gt;No duplication / Don't repeat yourself (DRY).&lt;/li&gt;
&lt;li&gt;Small.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;To facilitate self-improvement, we dedicate the last session of the day to the
closing circle.  In the closing circle, three questions are asked of every
participant.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What did you learn?&lt;/li&gt;
&lt;li&gt;What most surprised you?&lt;/li&gt;
&lt;li&gt;What are you going to do differently going forward?&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;In my original &lt;a href="(http://highgroove.com/articles/2011/12/13/lessons-learned-at-global-day-of-coderetreat.html"&gt;blog
post&lt;/a&gt;),
I boldly claimed that one could code the Game of Life in 45 minutes if and only
if they practice four or five times and skimp on tests.  Oh, how wrong I was!&lt;/p&gt;

&lt;p&gt;One pair, which included &lt;a href="http://highgroove.com/about/andy.html"&gt;Andy&lt;/a&gt;, managed
to write a completely functional version in 30 minutes.  They even had time to
invent their own spaceship.  How is this even possible?  Other groups took the
fast and loose approach.  "We know the problem domain.  We have the technology.
Tests?  Where we're going, we don't need no stinkin' tests!"&lt;/p&gt;

&lt;p&gt;What was the first pair's secret sauce?  TESTS! GOOD NAMES! DRY! SMALL METHODS!
SMALL CODE BASE!  Amazing!&lt;/p&gt;

&lt;p&gt;I learned magnitudes more facilitating than I did attending. I saw novel
approaches that impressed and stretched my understanding of the problem domain.
I saw good coding practices win out over the quick and dirty style again and
again.&lt;/p&gt;

&lt;p&gt;What have you learned when teaching that you didn't learn as the student?&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Mailcatcher: Making email testing a breeze</title>
     <link href="http://highgroove.com/articles/2012/02/09/mailcatcher%3A-making-email-testing-a-breeze.html" />
     <updated>2012-02-09T00:00:00-05:00</updated>
     <id>http://highgroove.com/articles/2012/02/09/mailcatcher%3A-making-email-testing-a-breeze.html</id>
     <content type="html">&lt;p&gt;&lt;a href="http://mailcatcher.me" title="Mailcatcher is really awesome!!!"&gt;&lt;img src="http://mailcatcher.me/logo.png" alt="Mailcatcher Logo" style="float:right;"&gt;&lt;/a&gt;
One of my least favorite chores as a developer is dealing with email. I’m not talking about my inbox. That is a post for another day ;). I’m talking about emails sent by web applications. Whether it is a sign up confirmation email, a receipt from a purchase, or reminder for your dog’s birthday. Chances are, if you have a web application, it sends email.&lt;/p&gt;

&lt;p&gt;Traditionally, my workflow for testing these emails has not been very elegant or even efficient. It would either involve creating a bunch of users with different emails accounts I own, or telling the back-end to send all emails to my email address. While both of these work to some extent, the former is very time consuming and the later isn’t really testing the system the way it is meant to be used.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://mailcatcher.me/"&gt;Mailcatcher&lt;/a&gt; one-ups both of these methods big time. Mailcatcher provides you with a local SMTP server for you to send your emails to in your development environment. Mailcatcher also provides you with a webmail interface to view all the emails your system has sent.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;Mailcatcher is written in ruby and is available as a &lt;a href="https://rubygems.org/gems/mailcatcher/"&gt;gem&lt;/a&gt;. The gem's site offers detailed instructions on how to use Mailcatcher with a Rails app or even a PHP app. Without going into the details here, after you have installed Mailcatcher, you basically just set whatever is sending mail to use Mailcatcher's SMTP server. Then any emails sent by your site will be collected in Mailcatcher's webmail interface. Check it out:&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.skitch.com/20120209-fxny14wci2nf1y8gqa2i6635sx.jpg" width="520" style="float:none" alt="Mailcatcher UI"&gt;&lt;/p&gt;

&lt;p&gt;Mailcatcher has really eased the pain of dealing with emails in web application development. What are some tools you have found or made that have made development more fun for you?&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Red, Green, Refactor - The Tools For Success</title>
     <link href="http://highgroove.com/articles/2012/02/07/red%2C-green%2C-refactor---the-tools-for-success.html" />
     <updated>2012-02-07T00:00:00-05:00</updated>
     <id>http://highgroove.com/articles/2012/02/07/red%2C-green%2C-refactor---the-tools-for-success.html</id>
     <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/andyarmstrong/89444201/" title="Tools by AndyArmstrong, on Flickr"&gt;&lt;img src="http://farm1.staticflickr.com/16/89444201_874ccb4d88.jpg" width="375" height="500" alt="Tools"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's easy to say "We're agile" and "We use Behavior/Test Driven Development" and
thus "we use the right tools to empower our developers!" but what are those
tools?  For me that discussion is entirely about the tool stack you choose, how
that stack empowers you as a developer to do things right the first time.
Luckily thanks to the ruby community as a whole we have a large number of
high-quality choice to choose between.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;Generally when we talk about TDD and being agile, beyond the process of choosing
features to deliver the maximum customer facing value, we refer back to the simplest
possible workflow of "Red/Green/Refactor." Within that workflow you write tests
that fail, make them pass (with the focus on getting that done without
polishing), then refactoring, to polish where necessary.  The subject of testing
is a huge one with a large body of prose already written on the subject.
&lt;a href="http://railsrx.com/"&gt;Rails Test Prescriptions&lt;/a&gt; and
&lt;a href="http://pragprog.com/book/achbd/the-rspec-book"&gt;The RSpec Book&lt;/a&gt;
are fine examples of such, along with a huge menagerie of
&lt;a href="http://avdi.org/devblog/2011/09/06/making-a-mockery-of-tdd/"&gt;blog posts&lt;/a&gt;,
&lt;a href="http://rubyrogues.com/what-not-to-test/"&gt;podcasts&lt;/a&gt;, and
&lt;a href="http://railscasts.com/episodes/275-how-i-test"&gt;screencasts&lt;/a&gt; to choose from.&lt;/p&gt;

&lt;p&gt;I propose a slightly different day-to-day workflow that I see used to great success.&lt;/p&gt;

&lt;ol start="0"&gt;
&lt;li&gt; Hack around and choose your course &lt;/li&gt;
&lt;li&gt; Red - write some tests that fail but will pass when your code meets your needs&lt;/li&gt;
&lt;li&gt; Green - the code is written, the tests pass, life is good. &lt;/li&gt;
&lt;li&gt; Refactor - Don't Repeat Yourself (DRY your code out).  Or don't, if Ya Ain't Gonna Need It (YAGNI). &lt;/li&gt;
&lt;li&gt; Continuous Integration &lt;/li&gt;
&lt;li&gt; PANIC OVER SECURITY &lt;/li&gt;
&lt;li&gt; Ride Bikes &lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;This isn't the "pure" TDD process, but one that just adds a couple of unspoken
facets of the process that are already used widely, just don't fall into the
pithy "Red/Green/Refactor" process.&lt;/p&gt;

&lt;p&gt;Ruby has a functional programming feeling with its composition of methods,
distinction of methods with side-effects from those that do not (via the !
suffix), and it comes with some variety of REPL via IRB (or the new awesomeness
in Pry).  This allows us as developers to spend some time touching code and
experimenting before we decide exactly how we might like a function to operate,
and thus before getting into the main development workflow for a given feature.&lt;/p&gt;

&lt;p&gt;Tools to support step 0:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.ruby-lang.org/en/documentation/quickstart/"&gt;Irb&lt;/a&gt; - you already
know about this but it's easy to overlook.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pry.github.com/"&gt;Pry&lt;/a&gt; - the new slickness that is 1-part Irb
replacement, 1-part debugger, and a pinch (or three) of awesome.  Watch the
screencast to get a feel for it!&lt;/li&gt;
&lt;li&gt;good-ole-pencil-and-paper, a whiteboard, some origami paper&lt;/li&gt;
&lt;li&gt;whatever tool gives you a feeling for the right way to proceed without being
trapped in analysis-paralysis.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Once you're ready to write some tests that will fail, you likely already have a
test framework of choice, and even a workflow for running those tests.  You may
run them from within your editor, have a terminal window ready, willing, and able
to run them with a single command (and a shortcut into your history like
ctrl-R), or you may let something else automagically run them for you and report
back.&lt;/p&gt;

&lt;p&gt;At Highgroove many of us find a combination of running tests manually and
automatic test running and reporting to be most useful.  To accomplish this I
use the testing framework selected for the project along with Spork and Guard.
Spork is a test server that constantly keeps your rails code loaded and ready to
be tested rather than loading each time in a rake task.  Spork should be your
first step to speeding up slow-running test-suites.  Guard is Spork's right hand
man.  It watches code for changes on disk and automagically runs the correct
associated tests.  Guard will even notify you via Growl, Libnotify, or your
other notification framework of choice that you've broken things, or that
everything is still hunky-dorey and you should keep hacking away and/or ship!&lt;/p&gt;

&lt;p&gt;When I run tests manually I often want to run a single test, or set of tests
manually.  Using Rspec2 you can accomplish this with
&lt;a href="https://www.relishapp.com/rspec/rspec-core/docs/command-line/tag-option"&gt;tags&lt;/a&gt;
or calling the specific spec by line number via &lt;code&gt;bundle exec rspec &amp;lt;path to spec&amp;gt;:&amp;lt;line no. of spec to run&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Testing is not only a matter of making your tests all turn green.  Poorly
written tests can certainly be green and still not indicate that your code is
working as intended.  Perhaps you simply forgot to include any assertions  (I've
certainly never done that)  or you're testing your factories rather than your
models (never ever once again).  Code quality tools can help you with that as
well, and it's not entirely certain as to whether they fit in the "Red/Green"
phase of development, or in the "Refactor" phase.  I like to split the playing
field and say that code-coverage tools belong in the red/green phase as they
allow you to check the quality of your tests which firmly live in "red/green"
while other code quality tools (such as static analysis tools for cyclomatic
complexity) belong in the "Refactor" phase.  We've discussed code-coverage in Ruby
&lt;a href="http://highgroove.com/articles/2011/03/01/code-coverage-and-ruby-1-9.html"&gt;before&lt;/a&gt;
so have a look there for a refresher, but if you're not using one of these
tools it may be time to roll it into your workflow.  Cover-me even has a nice
post-test HTML coverage report to show you how well you've done.  This allows a
very tight development loop to make sure the tests are covering the right things
the first time.&lt;/p&gt;

&lt;p&gt;Tools to support steps 1 and 2:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Testing frameworks: &lt;a href="http://guides.rubyonrails.org/testing.html"&gt;MiniTest&lt;/a&gt;, &lt;a href="http://ruby-doc.org/stdlib-1.9.3/libdoc/test/unit/rdoc/Test/Unit.html"&gt;Test::Unit&lt;/a&gt;, &lt;a href="https://github.com/rspec/rspec-rails"&gt;Rspec&lt;/a&gt;, &lt;a href="http://cukes.info/"&gt;Cucumber&lt;/a&gt;, etc.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sporkrb/spork"&gt;Spork&lt;/a&gt; and &lt;a href="https://github.com/guard/guard"&gt;Guard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Coverage tools: &lt;a href="https://github.com/markbates/cover_me"&gt;cover_me&lt;/a&gt;, &lt;a href="https://github.com/colszowka/simplecov"&gt;SimpleCov&lt;/a&gt;, &lt;a href="https://github.com/relevance/rcov"&gt;rcov&lt;/a&gt; (for Ruby 1.8 apps)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;So you've got good tests, good test coverage, everything is green, and you're
ready to refactor.  If you are struggling to start your refactoring process then
either it's good enough as it is or maybe you need some inspiration.  Sometimes
your code just doesn't need to be refactored.  It is easy to fall into the
premature optimization problem and abstract/refactor/clean your way into a
corner that you will undoubtedly undo later when the customer asks for more or
different flexibility.  So maybe just delay refactoring if there isn't an
obvious need.  In the case of needing some hints as to where to refactor the
&lt;a href="http://rails-bestpractices.com/"&gt;Rails Best Practices&lt;/a&gt; site has you covered.&lt;/p&gt;

&lt;p&gt;There is no replacement for a good set of eyes on the code and intuition as to
where you can refactor.  To this end Highgroove's internal code reviews go a
long way to getting our code refactored quickly and elegantly.&lt;/p&gt;

&lt;p&gt;Since we are not constantly reviewing or pairing there are some tools to help us
along including the excellent Flog and Flay, a pair of tools to find complex
code and duplicate code, along with an interestingly macabre theme.  Another
tool is Excellent which produces warnings about "smelly code" via static
analysis.  Finally we have the big kahuna: Rails Code QA.  This package wraps up
other code quality packages (including Flog and Flay) to make a single rake task
that does it all.&lt;/p&gt;

&lt;p&gt;Tools to support step 3:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://ruby.sadi.st/Flog.html"&gt;Flog&lt;/a&gt; and
&lt;a href="http://ruby.sadi.st/Flay.html"&gt;Flay&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://simplabs.github.com/excellent/"&gt;Excellent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nathanhumbert/rails_code_qa"&gt;Rails Code QA&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;At this point you have your local code automatically being tested, you've run
the tests you need to focus on, you've refactored with the help of tools, the
rest of your development team, and the community's collective knowledge.  If you
are working on a feature branch, that branch needs to be merged into a staging
or production branch, and hopefully tested before being pushed to client or
customer facing environments.  This is where Continuous Integration (CI) comes
in.&lt;/p&gt;

&lt;p&gt;A CI environment is constantly running all of your tests on whatever branches it
needs to in order to make sure that any merge artifacts don't make their way into
production.  You may choose to run your own CI environment via Jenkins or
Goldberg, both of which are lightweight and well supported, or you may choose to
"outsource" your CI to a service.  Travis-CI has gotten a large following in the
Ruby community thanks to its super simple setup, integration with Github, and
quality service.  I was recently introduced to Tddium by a co-worker while
struggling to setup an internal CI system for a customer.  It looks very well
backed and supports pretty much all of the services we employ day to day.  If
you don't want to do operations to make sure your CI is up and running then
looking to one of the latter services is a great route.&lt;/p&gt;

&lt;p&gt;Tools to support step 4:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local CI tools: &lt;a href="http://jenkins-ci.org/"&gt;Jenkins&lt;/a&gt;, &lt;a href="https://github.com/c42/goldberg"&gt;Goldberg&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hosted services: &lt;a href="http://travis-ci.org/"&gt;Travis-CI&lt;/a&gt;, &lt;a href="https://www.tddium.com/"&gt;Tddium&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Great! Your code is tested locally and in CI, everything looks solid in terms of
functionality, and Rails automagically does everything right for security.  It's
time to go ride bikes right?  Well maybe not.  There is a comprehensive and
excellent &lt;a href="http://guides.rubyonrails.org/security.html"&gt;Rails Security Guide&lt;/a&gt;
because it's not so simple.  This isn't to say that Rails security is as hard as
it could be, but as with everything getting it right requires knowing and
following the best practices created by the community.&lt;/p&gt;

&lt;p&gt;Luckily for us the Brakeman Scanner project integrates beautifully with the
tight testing workflow described above.  Brakeman is a static-analysis based
security-focussed scanner aimed at Rails applications.  It is under active
development and the progress has been phenomenal.  We did a brief
&lt;a href="http://highgroove.com/articles/2012/01/27/tech-talk-on-brakeman.html"&gt;tech-talk&lt;/a&gt;
about it recently and to say we are enamoured of it may be an understatement.
Even a couple of the bugs described in the tech-talk have been fixed since then!
Combining Brakeman's fantastic scanner and our automated testing tools works out
of the box in two ways.  Firstly there's Brakeman's reporting which is excellent
and could certainly be wrapped in a rake task to create a cover_me style report
after each test run.  Secondly there is guard-brakeman for local-scanning and
testing as well as notifications via your system notifier when new security
issues are introduced, just as if a test failed.  For CI environments Brakeman
works with Jenkins out of the box and adding support to other CI environments
should be a fairly simple operation.&lt;/p&gt;

&lt;p&gt;Tools to support step 5:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://brakemanscanner.org/"&gt;Brakeman&lt;/a&gt;, &lt;a href="https://github.com/oreoshake/guard-brakeman"&gt;Guard-Brakeman&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Making your development and testing loop as tight as possible allows you to have
confidence that your code has been written in a process that promotes testing,
coverage, and automated quality tests so that you can focus on what's important:
shipping code and riding bikes.&lt;/p&gt;

&lt;p&gt;Tools to support step 6:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.flickr.com/photos/highgroove/6059353268/" title="The @highgroove bike rack! by highgroove, on Flickr"&gt;&lt;img src="http://farm7.staticflickr.com/6072/6059353268_edaeefbf6c.jpg" width="500" height="374" alt="The @highgroove bike rack!"&gt;&lt;/a&gt;&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Kumbaya, My Award</title>
     <link href="http://highgroove.com/articles/2012/01/31/kumbaya-my-award.html" />
     <updated>2012-01-31T00:00:00-05:00</updated>
     <id>http://highgroove.com/articles/2012/01/31/kumbaya-my-award.html</id>
     <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/highgroove/6797358049"&gt;&lt;img
src="http://farm8.staticflickr.com/7002/6797358049_a788f6fb57_m.jpg"
style="float: right"/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At Highgroove, we love giving each other compliments. In fact, since
everyone at Highgroove kicks ass in some way, compliments are constantly
flying around (actually, I think that in and of itself was a compliment).&lt;/p&gt;

&lt;p&gt;Well-deserved compliments foster teamwork, increase morale, and make
us better as a team than we could be on our own.&lt;/p&gt;

&lt;p&gt;One specific way we compliment one another is by giving the &lt;a href="http://highgroove.com/faq.html#the-award"&gt;Highgroove
Award&lt;/a&gt;. The award can be given
by anyone to anyone; the recipient is recognized on the
&lt;a href="http://highgroove.com/about.html"&gt;website&lt;/a&gt; and with a &lt;a href="http://www.flickr.com/photos/highgroove/6797358049/in/photostream"&gt;physical
trophy&lt;/a&gt;
(it's a bit over the top on purpose!).&lt;/p&gt;

&lt;p&gt;Read on for how we added a technical twist to giving the award.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;




&lt;div style="float: right"&gt;
  &lt;a href="http://www.flickr.com/photos/highgroove/6797422435"&gt;&lt;img
  src="http://farm8.staticflickr.com/7170/6797422435_156cf93224_m.jpg"/&gt;
  &lt;/a&gt;

  &lt;div style="clear: both; height: 10px"&gt;&lt;/div&gt;

  &lt;a href="http://www.flickr.com/photos/highgroove/6797438193"&gt;&lt;img
  src="http://farm8.staticflickr.com/7161/6797438193_b6dd739a48_m.jpg"/&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Highgroove specializes in backend web application development, and while
some of the backends we develop actually drive mobile applications on iPhone, iPad, Android, and other mobile devices, we don't generally develop the frontends of these mobile applications in-house.&lt;/p&gt;

&lt;p&gt;Even so, a few of us are curious and wanted to learn more about how to
develop all aspects of mobile apps.  It helps us understand how to build better backends.&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://www.flickr.com/photos/highgroove/6797422435/"&gt;Highgroove Award iPhone
App&lt;/a&gt; was born as a
recent weekend hack project.... And refined on a recent &lt;a href="http://highgroove.com/articles/2012/01/26/hack-night-at-highgroove.html"&gt;hack
night&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The app allows any Highgroover to give the award via his or her iPhone.
A recipient is selected and the reasoning typed in; the backend portion
of the app redeploys the website with the new awardee!&lt;/p&gt;

&lt;p&gt;Now anyone can give the Highgroove Award ... even when we are
&lt;a href="http://www.flickr.com/photos/highgroove/6550928091/in/photostream"&gt;on-the-go&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The Highgroove Award is a bit silly, but it helps us give each other
serious praise in a light-hearted way. &lt;strong&gt;How does your workplace
encourage compliments?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Aside: For a more detailed explanation of what goes into the backend and frontend of a mobile application, check out &lt;a href="http://kentnguyen.com/ios/what-does-it-take-to-make-an-ios-app/"&gt;Dear business people, an iOS app actually takes a lot of work!&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Great Office Rearrangement: Sit where you want</title>
     <link href="http://highgroove.com/articles/2012/01/27/the-great-office-rearrangement%3A-sit-where-you-want.html" />
     <updated>2012-01-27T00:00:00-05:00</updated>
     <id>http://highgroove.com/articles/2012/01/27/the-great-office-rearrangement%3A-sit-where-you-want.html</id>
     <content type="html">&lt;p&gt;&lt;a href="https://twitter.com/#!/highgroove/status/134351062198009856/photo/1"&gt;&lt;img src="https://p.twimg.com/Ad1PlEoCQAAcU57.jpg:small" height="341" width="261" style="float: right"/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At Highgroove we are are always trying out new ways to improve our process and environment. One of my favorite experiments has been doing away with assigned seats. Our &lt;a href="http://www.gorowe.com"&gt;Results Only Work Environment&lt;/a&gt; allows each person to decide when and where they do their work. While it is true no one is required to come into the office, the reality is many people prefer to be in the office. It is not hard to see why. Every member of the team gets a massive monitor, a super comfy Aeron chair, and all the espresso and snacks anyone could ever need. Although most people come into the office regularly, each team member's hours can vary wildly. When we had assigned seats you could come in the office and be isolated just because your neighbors on a different schedule. Conversely, you could come in and be surrounded by a couple developers talking out a difficult problem when you really need to get something else done. In short, assigned seats just aren't very ROWE.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;h2&gt;The Setup&lt;/h2&gt;

&lt;p&gt;The fact that we hyper-specialize in back-end Ruby development means that everyone uses the same equipment and has basically the same needs. While this made doing away with assigned seats much easier than it would have been for a firm where there are many different types of specialized workers, we still had some issues to work out. First we had to deal with everyone's "desk stuff". If you have worked at a place with assigned seats you have probably noticed that you and your co-workers tend to "nest", building up a collection of trinkets, tools, and other things that may or may not be needed to get the job done. The amount of "desk stuff" has always been limited at Highgroove by small desks. Our work is done in the cloud using tools like Google Apps, &lt;a href="http://www.pivotaltracker.com"&gt;Pivotal Tracker&lt;/a&gt; and &lt;a href="http://www.github.com"&gt;Github&lt;/a&gt;. We generally don't need desk space for much more than a keyboard, mouse, snacks and maybe a latte. If the desk is holding much else, chances are that stuff is in the wrong place. If the "desk stuff" is information you or your team members need and exist nowhere else, you are working in a silo. That is bad. If the "desk stuff" is something not related your current tasks, it is clutter: a distraction at best, it should be elsewhere. Where do we put all this stuff? We have a cubby section where each developer can safely store their stuff like bike clothes, business cards, notebooks, and other things we use but don't need constantly to do our work. We also use cubbies to store our keyboards and mice when we leave, so that others can use the vacant desks.&lt;/p&gt;

&lt;p&gt;Cubbies were about the only addition we needed to make this work. We provide everyone on the team with the best equipment available, so there is no inequality; no good desk or chairs to fight over. If you were implement this policy in an office where there were several different types of desks and chairs you would want to make sure there are enough setups of each type to make everyone happy.&lt;/p&gt;

&lt;h2&gt;The Results&lt;/h2&gt;

&lt;p&gt;We've been running this experiment for several months now. The no assigned seats policy allows everyone the chance to switch things up and get to know each other better. The policy also allows team members to have more control over their environment. When there are a lot of people in the office, desk selection can be slim, but so far no one has been without a desk, or has vocally complained about having to sit at a desk they don't want to. Some people still sit in the same desk everyday. Other people sit at a different desk every time they come into the office. The point of ROWE is that we are all responsible adults, perfectly capable of making our own decisions. We decide when it is time to work and time to play. The next logical step was to remove assigned seating for those who decide to work in our office. Doing so has given each member of our team the more control over their work environment, and has also made for a more open and collaborative workplace. What steps have your team taken to make your office more awesome for everyone?&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Tech Talk on Brakeman</title>
     <link href="http://highgroove.com/articles/2012/01/27/tech-talk-on-brakeman.html" />
     <updated>2012-01-27T00:00:00-05:00</updated>
     <id>http://highgroove.com/articles/2012/01/27/tech-talk-on-brakeman.html</id>
     <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/fishywang/231641679/" title="Bicycle locks by Yuxuan.fishy.Wang, on Flickr"&gt;&lt;img src="http://farm1.staticflickr.com/80/231641679_316877d9b6_m.jpg" width="240" height="180" alt="Bicycle locks" align="right"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dave's Tech Talk this week is on security on web applications, focusing on Ruby on Rails applications, and using the static analysis security scanner called &lt;a href="http://brakemanscanner.org/"&gt;Brakeman&lt;/a&gt; (&lt;a href="https://github.com/presidentbeef/brakeman"&gt;brakeman on github&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;In this talk, Dave looks at how static security analyzers work, and how we used it to find some very tiny (already fixed within a few minutes of finding) possible security weak-points in an application we built for a client.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;Static analysis looks at your source code and looks for known vulnerabilities.  As opposed to dynamic scanners, or intrusion "detection" scanners that scan a live site from the outside -- these are run on the code itself.&lt;/p&gt;

&lt;p&gt;In Ruby this is hard because it's a dynamic language.  Because of this, Brakeman (and any static analysis scanners) will identify "false positives" (code that isn't necessarily a vulnerability) but they're easy to track down, and safely ignore.&lt;/p&gt;

&lt;p&gt;Dave notes, that because of Ruby's dynamic-ness, if you are doing a lot of method_missing meta-programming, it won't be able to analyze your code.  The practices and places it does identify are easy to see, and you can apply Brakeman's other recommendations in your meta-programming code, to secure your web application.&lt;/p&gt;

&lt;p&gt;Check out the talk on Vimeo: &lt;a href="http://vimeo.com/35766582"&gt;Tech Talk on Brakeman&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Image Credit: &lt;a href="http://www.flickr.com/photos/fishywang/231641679/"&gt;fishywang on Flickr&lt;/a&gt;&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Hack Night at Highgroove</title>
     <link href="http://highgroove.com/articles/2012/01/26/hack-night-at-highgroove.html" />
     <updated>2012-01-26T00:00:00-05:00</updated>
     <id>http://highgroove.com/articles/2012/01/26/hack-night-at-highgroove.html</id>
     <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/highgroove/6768143749/" title="Hack Night! Twitter bots, io language, iPad apps, gaming in c#.... by highgroove, on Flickr"&gt;&lt;img src="http://farm8.staticflickr.com/7017/6768143749_1615ae7e03_m.jpg" width="240" height="180" alt="Hack Night! Twitter bots, io language, iPad apps, gaming in c#...."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Highgroove hosted our monthly Hack Night, and with 20 attendees, this was our largest yet.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;To program a computer in a clever, virtuosic, and wizardly manner. Ordinary computer jockeys merely write programs; hacking is the domain of digital poets. Hacking is a subtle and arguably mystical art, equal parts wit and technical ability, that is rarely appreciated by non-hackers. See hacker. -- &lt;a href="http://www.urbandictionary.com/define.php?term=hack"&gt;Urban Dictionary: hack&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Hack Nights are a chance for Highgroovers to simply "hack" which means: to experiment, learn, and play with technologies we might not get to during our day-to-day.  So, what did we hack on?&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;ul&gt;
&lt;li&gt;the &lt;a href="http://iolanguage.com/"&gt;io language&lt;/a&gt; using Day 1 of the io chapter in the &lt;a href="http://pragprog.com/book/btlang/seven-languages-in-seven-weeks"&gt;Seven Languages in Seven Weeks&lt;/a&gt; book&lt;/li&gt;
&lt;li&gt;game programming (the wolfbrain) on the &lt;a href="https://www.sifteo.com/"&gt;Sifteo Game Cubes&lt;/a&gt; in C#&lt;/li&gt;
&lt;li&gt;a remote music playing server with voting and control from our chat room for the office&lt;/li&gt;
&lt;li&gt;adding functionality to some of our favorite ruby gems and libraries including &lt;a href="https://github.com/presidentbeef/brakeman"&gt;brakeman&lt;/a&gt;, and a yet-unreleased crazy-math backend algorithm solver&lt;/li&gt;
&lt;li&gt;an iOS app for awarding Highgroovers the coveted &lt;a href="http://highgroove.com/faq.html#the-award"&gt;Highgroove Award&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;a search-across-the-company app using some new search technologies powered by Ruby&lt;/li&gt;
&lt;li&gt;and much, much more....&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Thanks to all who came out. Stay tuned for our next Hack Night in February by liking us on &lt;a href="http://facebook.com/highgroove"&gt;Facebook&lt;/a&gt; and &lt;a href="http://twitter.com/highgroove"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Maintaining Clients (keeping everyone happy)</title>
     <link href="http://highgroove.com/articles/2012/01/24/maintaining-clients-%28keeping-everyone-happy%29.html" />
     <updated>2012-01-24T00:00:00-05:00</updated>
     <id>http://highgroove.com/articles/2012/01/24/maintaining-clients-%28keeping-everyone-happy%29.html</id>
     <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/madlyinlovewithlife/6030999896/lightbox/"&gt;&lt;img src="http://farm7.staticflickr.com/6206/6030999896_25c3a9ac18.jpg" align="right"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Far too often there exists a chasm between the client paying for and the developer working on a particular project.  One party has a longterm vision; a vision that will ultimately impact his/her financial future.  The other party has a much closer view of the project, which creates the risk of getting tunnel visioned. The client worries about when the project will be completed; the developer worries about how the project will be completed.  When this happens, communication becomes difficult and frustration builds. How can this be avoided?&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;At Highgroove, we know that there is no replacement for good communication. This perhaps requires a bit more work from our clients than they might initially anticipate, but by maintaining frequent contact, we prevent frustration and confusion from creeping into the process. By keeping our clients actively involved (i.e. forcing them to accept/reject stories in Pivotal Tracker), they know exactly where the project stands and what work remains. This helps the project stay on track and gives us, the developers, quick feedback about whether or not the work being done is acceptable.&lt;/p&gt;

&lt;p&gt;When we are able to maintain this level of communication with our clients, we can develop a comfortable working relationship that allows us to honestly question features or approaches that would complicate projects and potentially delay launching. At Highgroove, we earnestly want our clients' projects to succeed. We hope that our clients choose us not for only our technical skill, but our dedication to giving them the best version of their vision.  By striving to cultivate a successful working relationship, we go beyond maintaining happy clients: we promote successful enterprises.&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Tech Talk on Riak</title>
     <link href="http://highgroove.com/articles/2012/01/20/tech-talk-on-riak.html" />
     <updated>2012-01-20T00:00:00-05:00</updated>
     <id>http://highgroove.com/articles/2012/01/20/tech-talk-on-riak.html</id>
     <content type="html">&lt;p&gt;&lt;a href="http://instagr.am/p/i50I-/"&gt;&lt;img src="http://distilleryimage6.instagram.com/96403754439a11e1abb01231381b65e3_7.jpg" align="right" height="200" width="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Will's Tech Talk this week is on Riak.  "Riak is an open source, highly scalable, fault-tolerant distributed database." -- &lt;a href="http://basho.com/products/riak-overview/"&gt;Riak Overview on Basho.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The main use-case is to use in web applications that have heavy requirements for data, where lots of data must be "written" or "read" in a distributed fashion, but needs to be high-availability.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;Will also went over one of the main Ruby libraries named &lt;a href="https://github.com/seancribbs/ripple"&gt;ripple&lt;/a&gt; that is a rich Ruby modeling layer for Riak, Basho's distributed database that contains an ActiveModel-based document abstraction.&lt;/p&gt;

&lt;p&gt;Riak works great when your database gets painful.  If you have an application that just has tons of writes, or tons of reads happening, and the database is just dragging, Riak is a great choice for storing and reading data quickly.  Adding Riak along-side your database to alleviate performance is a great way to scale out and make your web application more performant.&lt;/p&gt;

&lt;p&gt;Check out the video on our Tech Talks page:  &lt;a href="http://vimeo.com/highgroove/videos"&gt;http://vimeo.com/highgroove/videos&lt;/a&gt;&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Git Treeishes Considered Awesome</title>
     <link href="http://highgroove.com/articles/2012/01/19/git-treeishes-considered-awesome.html" />
     <updated>2012-01-19T00:00:00-05:00</updated>
     <id>http://highgroove.com/articles/2012/01/19/git-treeishes-considered-awesome.html</id>
     <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/moonlightbulb/3338852116/" title="A Street Called Awesome by moonlightbulb, on Flickr"&gt;&lt;img src="http://farm4.staticflickr.com/3574/3338852116_e06a7a111f.jpg" width="500" height="375" style="float: right;" alt="A Street Called Awesome"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As developers, we love having quality tools like &lt;a href="http://git-scm.com/"&gt;git&lt;/a&gt;, available to us.&lt;/p&gt;

&lt;p&gt;Using git, we can easily navigate through all the code ever "committed" or added to a project throughout its history. We do this via git  &lt;a href="http://book.git-scm.com/4_git_treeishes.html"&gt;treeishes&lt;/a&gt;.
Treeishes are git's way of referencing commits and relations between commits.
Treeishes can improve your workflow immensely if you're a frequent git user.&lt;/p&gt;

&lt;p&gt;In this post, we'll cover some of the more basic treeishes and then
work into the advanced ones, with some real-world examples.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;




&lt;h2&gt;The Basics&lt;/h2&gt;


&lt;p&gt;You'll probably be familiar
with the types of treeishes in this first section if you've ever used git
before. The following section will cover some more advanced uses of
treeishes that even long-time git users may not know about.&lt;/p&gt;

&lt;h3&gt;SHAs&lt;/h3&gt;


&lt;p&gt;Every commit in git is identified by its SHA — a unique hash. These hashes
are pretty long (40 characters in fact), but git also allows you to
reference any commit with &lt;em&gt;any&lt;/em&gt; truncated version of its hash so long
as the truncated portion is unique (generally, this means at least 5
characters long).&lt;/p&gt;

&lt;h3&gt;Branches, Remotes, and Tags&lt;/h3&gt;


&lt;p&gt;Branches, remotes, and tags are another kind of treeish. Each of these
is actually just a pointer to a git commit.&lt;/p&gt;

&lt;h2&gt;Advanced Treeishes&lt;/h2&gt;


&lt;p&gt;Now we're getting to the really good stuff!&lt;/p&gt;

&lt;p&gt;It's important to have a good understand of the git reference log
(reflog for short) which enables most of the more advanced treeishes.&lt;/p&gt;

&lt;p&gt;The git reflog is a running log of recent changes to tips of branches.
In practice, this means that every time you commit to a branch, pull
commits down from a remote repository, or checkout a new branch, your
reflog will update. It's important to recall that reflogs are specific
to individual checkouts of a repository so the reflogs for the same
project can differ across machines.&lt;/p&gt;

&lt;p&gt;Here's an example reflog from one of my personal projects:&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/1609626.js?file=git%20reflog'&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;› git reflog
0a4faaa HEAD@{0}: checkout: moving from 0a4faaaf0081e2a5e439e79f48e236cdfbcb687b to i-herd-u-liek-chef
0a4faaa HEAD@{1}: commit: Remove unnecessary comment.
d4fdbdb HEAD@{2}: commit: Real namespaces in the app code now.
fc16081 HEAD@{3}: commit: Suddenly, NAMESPACES
b36e3a8 HEAD@{4}: clone: from git@github.com:wfarr/censored.git&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;This reflog shows that some of the more recent changes to this project include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloning the project from the remote repository&lt;/li&gt;
&lt;li&gt;Making a few commits&lt;/li&gt;
&lt;li&gt;Checking out a new branch from the tree at &lt;code&gt;0a4faaa&lt;/code&gt; (which just happens to be &lt;code&gt;master&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Using the reflog, git can infer some interesting relative context for commits
that will allow us some more flexibility in what we can get at with treeishes.&lt;/p&gt;

&lt;h3&gt;Date Specs&lt;/h3&gt;


&lt;p&gt;We use the date spec here at Highgroove as part of our weekly code reviews.
With the date spec, I can easily look at the activity on a feature branch over
the course of the last week:&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/1609626.js?file=git%20date%20spec'&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;git diff master@{1 week ago}&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;




&lt;h3&gt;Tilde Spec&lt;/h3&gt;


&lt;p&gt;Similar to the ordinal spec, the tilde spec allows you to reference
the Nth grandparent of a commit.&lt;/p&gt;

&lt;p&gt;This is useful just to go back 2 or more commits in time in one command.&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/1609626.js?file=git%20tilde%20spec'&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;master~2&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;




&lt;h3&gt;Caret Parent Spec&lt;/h3&gt;


&lt;p&gt;Unlike the tilde spec, the caret parent spec allows you to
reference the Nth parent of a commit. The distinction here
is important as the caret parent spec can walk backwards
through commits that have more than one parent (merge commits),
while the ordinal spec cannot.&lt;/p&gt;

&lt;p&gt;The caret parent spec looks like:&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/1609626.js?file=git%20caret%20parent%20spec'&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;master^2&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;The caret parent spec and the tilde spec can also be chained together,
so &lt;code&gt;master^^&lt;/code&gt; would actually point to the same commit as &lt;code&gt;master~2&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;Range Spec&lt;/h3&gt;


&lt;p&gt;The range spec allows you to express a range of commits as a first-class
object in git. These are frequently used for things like diffs where
you may want to view the changes across a number of commits.&lt;/p&gt;

&lt;p&gt;For example, the following command would show a diff of all commits
between master and my current feature branch:&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/1609626.js?file=git%20range%20spec'&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;git diff master..i-herd-u-liek-chef&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;You can also refer to the range from the current commit through
all commits after it by just leaving off the other ref after
the "..".&lt;/p&gt;

&lt;p&gt;All of these treeishes are available from the git command line
interface -- though if you're using a GUI to interact with git your
particular application it may support some or all of these.
I know that Github's &lt;a href="https://github.com/blog/612-introducing-github-compare-view"&gt;compare view&lt;/a&gt;
can be used with treeishes as well. Hopefully if you're not
already using treeishes you'll find that they're as useful
to you as they are to us.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How are you using git treeishes to improve your workflow?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Image credit: &lt;a href="http://www.flickr.com/photos/moonlightbulb/3338852116/"&gt;@moonlightbulb&lt;/a&gt;&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Simple Design, the Highgroove Way</title>
     <link href="http://highgroove.com/articles/2012/01/16/simple-design%2C-the-highgroove-way.html" />
     <updated>2012-01-16T00:00:00-05:00</updated>
     <id>http://highgroove.com/articles/2012/01/16/simple-design%2C-the-highgroove-way.html</id>
     <content type="html">&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/File:Mondrian_Composition_II_in_Red,_Blue,_and_Yellow.jpg"&gt;&lt;img src="http://upload.wikimedia.org/wikipedia/en/f/fe/Mondrian_Composition_II_in_Red%2C_Blue%2C_and_Yellow.jpg" style="float: right" height="200" width="200"/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Highgroove Studios has taught me a lot about Software Development, Consulting, and building new web applications.  Apart from the myriad of technical skills I've added since I came on board, Highgroove is a fantastic company to learn how to build your own web apps, how to design them, and how to remain focused on the most business critical aspects of the system.  Highgroove taught me these things by adhering to a process which manages Agile development, responds to changing software requirements and business needs, and encourages constant communication.  While these are all noticed by clients, there is one part of the Highgroove process that goes largely unseen; however, it is just as integral as the former three.  That behind-the-scenes aspect of the Highgroove development process is keeping the software as simple as possible to meet current demands.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;Keeping software systems simple is fundamental to the development style at Highgroove.  What I've seen a lot of developers do (not the Highgroove developers of course!) is create an application that is too complex for the current applications scope, which wastes precious time in the process.  The unfortunate side effect of creating apps that are too complex for what is actually needed is ultimately an app that performs poorly under load, is prone to errors, and is very difficult to change.  All of those things affect a projects budget and could have been avoided.  At Highgroove, we leverage the Open Source community and Ruby on Rails to build scalable web applications.  This web application development framework comes with a core set of plugins but also enjoys a host of plugins and libraries all available for free.  We don't write custom loggers.  We don't write google apps or Facebook authentication from scratch.  We hardly even have to write SQL.  We leverage the network of freely available, well tested and trusted plugin library to accomplish these basic tasks for us.  Once the common system functions are handled, that allows Highgroove to focus solely on business logic and building the app.  That really means we get more done, in less time, and on budget too!&lt;/p&gt;

&lt;p&gt;At Highgroove, we do not believe in creating &lt;a href="http://en.wikipedia.org/wiki/Rube_Goldberg_machine"&gt;Rube Goldberg machines&lt;/a&gt;…we just want to build the best possible app with the least amount of complexity that does exactly what you need.  Its because of this ethos that Highgroove's customers succeed (and I grow as a developer and a consultant too!).&lt;/p&gt;

&lt;p&gt;How do you build apps?&lt;/p&gt;

&lt;p&gt;Image Credit: &lt;a href="http://en.wikipedia.org/wiki/File:Mondrian_Composition_II_in_Red,_Blue,_and_Yellow.jpg"&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Getting into the Groove</title>
     <link href="http://highgroove.com/articles/2012/01/16/getting-in-the-groove.html" />
     <updated>2012-01-16T00:00:00-05:00</updated>
     <id>http://highgroove.com/articles/2012/01/16/getting-in-the-groove.html</id>
     <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/navart/4691826742/" title="Comando Groovy @ 2º Aniversario Radio Mexiquense 91.7 FM by navart, on Flickr"&gt;&lt;img src="http://farm5.staticflickr.com/4007/4691826742_cd8097b3f6.jpg" width="500" height="375" alt="Comando Groovy @ 2º Aniversario Radio Mexiquense 91.7 FM" style="float: right;"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Going in to my third week here at Highgroove, I already feel like my
first couple weeks have been some of my best in any work environment,
both in terms of my personal productivity and my happiness at work.&lt;/p&gt;

&lt;p&gt;I'm still completing my undergraduate degree at &lt;a href="http://www.gatech.edu/"&gt;Georgia Tech&lt;/a&gt;.
As any student at Tech will be quick to tell you, the school is often
very demanding of its students. This can often make a good balance
between work and school difficult, and juggling the two over the past
couple years of school has been challening.&lt;/p&gt;

&lt;p&gt;Enter Highgroove, a ROWE (Results-Only Work Environment).&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;I've been lucky enough to call a good portion of the Highgroove staff
friends for a while, and I'd known that Highgroove works on amazing
projects with even more amazing clients. This was more than enough
to get me excited to work with Highgroove. But hearing more about
how Highgroove is a ROWE during my interview process really interested me.&lt;/p&gt;

&lt;p&gt;A ROWE sounds pretty self-explanatory — it's all about results. Focusing
on results rather than time spent "working" (who hasn't checked on Reddit
at work before?), allows us to work in a fashion that's all about personal
responsibility and trust. I can take a day to study for a big exam if I know
I'll have some time later on in the iteration to make sure I'm hitting my
results. Reading the &lt;a href="http://www.amazon.com/Why-Work-Sucks-How-Fix/dp/1591842921/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1292244800&amp;amp;sr=1-1"&gt;ROWE book&lt;/a&gt;
(ironically, the one requirement we have at Highgroove besides meeting results)
and working in a ROWE has already taught me a lot: mostly I don't think
I could go back to working any other way.&lt;/p&gt;

&lt;p&gt;Highgroove gives me control over my time and allows me to focus on getting
things done — whether for work, school, or me — in a completely guilt-free
environment. And I'm loving every minute of it.&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Using MySQL Spatial Extensions for Range Queries</title>
     <link href="http://highgroove.com/articles/2012/01/10/using-mysql-spatial-extensions-for-range-queries.html" />
     <updated>2012-01-10T00:00:00-05:00</updated>
     <id>http://highgroove.com/articles/2012/01/10/using-mysql-spatial-extensions-for-range-queries.html</id>
     <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/nnova/3399904953/sizes/s/in/photostream/"&gt;&lt;img src="http://farm4.staticflickr.com/3603/3399904953_3f2c06c943_m.jpg" style="float: right"/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We help one of our clients operate a high traffic API that, among other
things, returns data that is associated with an IP address range. It's
similar to querying for information from &lt;a href="http://en.wikipedia.org/wiki/WHOIS"&gt;WHOIS&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The IP address ranges are specified in a MySQL database with &lt;strong&gt;ip_start&lt;/strong&gt; and
&lt;strong&gt;ip_end&lt;/strong&gt; columns. The IP addresses are first converted to their
representation as 32-bit integers.&lt;/p&gt;

&lt;p&gt;For instance, the range 1.1.1.1 to 1.1.3.3 would look like:&lt;/p&gt;

&lt;table&gt;
  &lt;tr&gt;
    &lt;th&gt;ip_start&lt;/th&gt;
    &lt;th&gt;ip_end&lt;/th&gt;
    &lt;th&gt;...&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;16843009&lt;/td&gt;
    &lt;td&gt;16843523&lt;/td&gt;
    &lt;td&gt;...&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;


&lt;p&gt;Read on for more about how we helped optimize the queries that search
for an IP within these ranges.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;Loading new information into the API required that we test whether a new
IP range overlapped with a current range in the database.&lt;/p&gt;

&lt;p&gt;It is relatively easy to &lt;a href="http://c2.com/cgi/wiki?TestIfDateRangesOverlap"&gt;write a query that tests whether one range
intersects another in SQL&lt;/a&gt;:&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/1593170.js?file=range.sql'&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;SELECT * FROM ip_ranges
  WHERE ip_start &amp;lt;= @new_ip_end AND
        @new_ip_start &amp;lt;= ip_end;&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;Unfortunately, even with indexes, this query requires a full table scan
in MySQL. On a large table, the query took around 0.25 seconds. While
insignificant for one-off queries, loading thousands of new ranges made
the time really add up.&lt;/p&gt;

&lt;p&gt;We scoped out various solutions, but the one that ended up working best
was modeling the problem using &lt;a href="http://dev.mysql.com/doc/refman/5.1/en/spatial-extensions.html"&gt;MySQL Spatial
Extensions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;While IP ranges are not a typical use case for spatial extensions, they
can be modeled as 1-dimensional lines. And given that spatial indexes
are very efficient at doing queries like
&lt;a href="http://dev.mysql.com/doc/refman/5.1/en/functions-for-testing-spatial-relations-between-geometric-objects.html#function_intersects"&gt;Intersects()&lt;/a&gt;,
we found the solution to be really performant.&lt;/p&gt;

&lt;p&gt;The following SQL snippet creates a column called &lt;strong&gt;ip_range&lt;/strong&gt; on the
table that is then populated with rectangles in 2-dimensions that
represent the IP ranges. We only care about 1-dimension, so the height
of the rectangles is unimportant:&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/1593170.js?file=create_geometry.sql'&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;ALTER TABLE ip_ranges add ip_range POLYGON NULL;
UPDATE ip_ranges
  SET ip_range=Polygon(
    LineString(
      Point(ip_start, 1),
      Point(ip_start, 0),
      Point(ip_end, 0),
      Point(ip_end, 1),
      Point(ip_start, 1)
    )
  );

ALTER TABLE ip_ranges MODIFY ip_range POLYGON NOT NULL;
CREATE SPATIAL INDEX index_ip_ranges_on_ip_range on ip_ranges (ip_range);&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;With that column and the spatial index, queries to test for range
intersection can be written as:&lt;/p&gt;

&lt;div&gt;&lt;script src='https://gist.github.com/1593170.js?file=range_spatial.sql'&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;pre&gt;&lt;code&gt;SELECT * FROM ip_ranges
  WHERE Intersects(ip_range,
    Polygon(
      LineString(
        Point(@new_ip_start, 1),
        Point(@new_ip_start, 0),
        Point(@new_ip_end, 0),
        Point(@new_ip_end, 1),
        Point(@new_ip_start, 1)
      )
    )
  );&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;&lt;/div&gt;


&lt;p&gt;This query achieves the same thing as the earlier query, but runs much
faster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Have you modeled a problem with the geospatial features of a database?&lt;/strong&gt;&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Hadoop Across Availability Zones</title>
     <link href="http://highgroove.com/articles/2012/01/10/hadoop-across-availability-zones.html" />
     <updated>2012-01-10T00:00:00-05:00</updated>
     <id>http://highgroove.com/articles/2012/01/10/hadoop-across-availability-zones.html</id>
     <content type="html">&lt;p&gt;&lt;img src="https://img.skitch.com/20120111-dwgtmswx5nx8yax1tmy22a74yw.jpg" alt="" /&gt;&lt;/p&gt;

&lt;p&gt;Hadoop is a great solution to the big data problem and with the instant access to servers and storage in the cloud, it's easier than ever to spin up and manage your own cluster. If you haven't heard too much about it yet, &lt;a href="http://wiki.apache.org/hadoop/"&gt;hadoop&lt;/a&gt; provides access to a distributed file system along with a framework for running map reduce jobs over the data. It takes care of replicating chunks of data to each node and running jobs in parallel for you. However, when you want to expand your hadoop cluster across availability zones you can run into some unexpected problems. So lets dig into the ideas we tried and the final solution that worked the best for our configuration.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;Communicating across data centers is a pretty old problem with a lot of different solutions so we wanted to start out with the simplest thing we could think of. First, we decided to allow access by adding an elastic ip to each node and adding those addresses in the security group of the opposite availability zone. So this would basically just allow open communication from certain public addresses on the internet, which isn't a bad solution. But if you ever need to replace or spin up a new node, it requires a decent bit of manual intervention to reassign the elastic ip or to create a new one and add it back to the security groups. Another downside is that, due to hadoop's fancy hostname resolution, we can only utilize tasktrackers within the same availability zone as the namenode.&lt;/p&gt;

&lt;p&gt;So next we tried using OpenVPN to create a bridge across the two networks, but there was one small problem. Because we didn't have full control over what ip address our servers were assigned, there was the potential for two machines with the same ip on separate networks which would cause all kinds of weird problems. &lt;a href="http://aws.amazon.com/vpc/"&gt;Amazon's VPC&lt;/a&gt; can help solve this problem by giving you more control over the network but we decided to go a different route.&lt;/p&gt;

&lt;p&gt;Instead of using a classic VPN solution, we gave &lt;a href="http://tinc-vpn.org"&gt;tinc&lt;/a&gt; a try. Tinc is still considered a vpn daemon but instead of using it for a point to point connection, because it is so lightweight, you can install it on all of your servers and expose a new network interface to route traffic over. This allowed us to easily configure the vpn on the production system and then just switch the interface hadoop was listening on once everything was up and running. So here's how we set it up.&lt;/p&gt;

&lt;p&gt;Three files make up the basic configuration. The tinc-up script is responsible for creating the new network interface. The tinc.conf names the local node and keeps track of all the other nodes it needs to talk to. We also need a hosts file which is named after the local node we set in the tinc.conf. This file includes attributes for setting up the connection to the vpn like the external ip, vpn ip, vpn subnet and public key. Since we have everything already set up in chef we just set up a cookbook that ran a few searches across our servers and generated all the configuration files we needed. We also took advantage of hadoop's rack awareness feature to make sure data is always streamed from the closest node and also makes sure replicas are spread across different data centers. There was only 1 problem that we came across which again involved hadoop's hostname resolution. Map reduce jobs were periodically failing because the tasktracker would sometimes use the ec2 hostname and resolve the ip of a datanode incorrectly. So, we had to setup a tiny dns server to make sure that hostnames always pointed to correct tinc address. After fixing that everything worked great. We also had the added benefit of being able to connect through the vpn and access the files from hdfs directly using &lt;a href="http://cloudera.github.com/hue/"&gt;hue&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Since we quickly covered a lot of new technology, here are some useful resources for when you want to try this out yourself:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://wiki.apache.org/hadoop/"&gt;Hadoop Wiki&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/opscode/cookbooks/tree/master/hadoop"&gt;Hadoop Chef Cookbook&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://tinc-vpn.org/documentation/tinc_toc"&gt;Offical Tinc Manual&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.vanheusden.com/Linux/tinc_mini_howto.html"&gt;Quick Tinc Setup&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://reiddraper.com/first-chef-recipe/"&gt;Writing Your First Chef Recipe&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://hadoop.apache.org/common/docs/stable/cluster_setup.html#Hadoop+Rack+Awareness"&gt;Hadoop Rack Awareness&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://thekelleys.org.uk/dnsmasq/doc.html"&gt;Dnsmasq&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;What other tips do you have on breaking the single availability zone barrier?&lt;/p&gt;
</content>
   </entry>
 
   <entry>
     <title>Tech Talk on RescueTime</title>
     <link href="http://highgroove.com/articles/2012/01/06/tech-demo-on-rescuetime.html" />
     <updated>2012-01-06T00:00:00-05:00</updated>
     <id>http://highgroove.com/articles/2012/01/06/tech-demo-on-rescuetime.html</id>
     <content type="html">&lt;p&gt;&lt;a href="http://www.flickr.com/photos/highgroove/6648460323/" title="Tech Talk on @rescuetime - personal analytics on your productivity. by highgroove, on Flickr"&gt;&lt;img src="http://farm8.staticflickr.com/7018/6648460323_f78e7fab17_m.jpg" width="240" height="180" alt="Tech Talk on @rescuetime - personal analytics on your productivity." align="right"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://highgroove.com/stafford.html"&gt;Stafford&lt;/a&gt; is talking about productivity hacking with &lt;a href="https://www.rescuetime.com/"&gt;RescueTime&lt;/a&gt;.  "It's like server analytics for you and your time," says Stafford.&lt;/p&gt;

&lt;p&gt;We all like to think of ourselves as productive, but we can all use some help being more efficient.  One tool Stafford likes using is RescueTime that tracks where you're spending your time while using your computer.&lt;/p&gt;

&lt;!-- -**-END-**- --&gt;


&lt;p&gt;RescueTime runs in the background, and tracks applications that are open.  It then tries to help you classify which applications are productive and which are non-productive.  It can show you how much time you're spending browsing Facebook, versus writing code.  You can even help it learn which tasks for you are more productive -- for some people, email is productive, for others, maybe not.&lt;/p&gt;

&lt;p&gt;There are some very cool charts that show where time is spent, in your browser, in your code editor, in your email client, etc.  It can show you when you're most productive, just by knowing.  It also has a competition aspect, you can see how your productivity numbers stack against others, and even yourself each week.&lt;/p&gt;

&lt;p&gt;Stafford goes in once a day to clean up his RescueTime and reclassify events like: "Chatting" which may be with a client, or with a friend.&lt;/p&gt;

&lt;p&gt;Stafford also showed off the project view, which helps him realize what tasks he's worked on for a client/project.&lt;/p&gt;

&lt;p&gt;Stafford ended saying: "It's a good gauge of when I'm being productive.  If I'm not being productive, it's time to leave and get away, go do something else, and come back when I'm productive to work."&lt;/p&gt;

&lt;p&gt;Check out the video on our &lt;a href="http://vimeo.com/highgroove"&gt;Vimeo&lt;/a&gt; channel, in our Tech Talks.&lt;/p&gt;
</content>
   </entry>
 

</feed>

