mcminton-blog-blog
mcminton-blog-blog
The Mint
45 posts
1984, you’re right man! That’s a typo.
Don't wanna be here? Send us removal request.
mcminton-blog-blog · 11 years ago
Text
Why War Rooms Don't Work
A few years ago when my employer was moving to a new office I was championing the concept of an open layout war room for the developers. Several companies I admired were spreading the gospel of the war room: a single block of desks arranged into a rectangle with team members sitting side-by-side and directly across from each other. The war room was to foster instant communication and to encourage collaboration. Yeah, not so much.
Tumblr media
Two years in
My time working in an open-concept over the past few years has shaped my very clean opinion on war rooms: for teams with more than two developers they simply don't work for software development. At all. Ever.
But what about
But war rooms promise instant communication and rainbow colored unicorns how can they be bad? The war room suffers from the single biggest killer of productivity: constant interruptions.
But they said
But insert trendy company here say war rooms are critical to their culture and it appears to work for them! Maybe there are few companies that have managed to succeed despite the interruptions of a war room but I assure you they are the exception and you won't likely be so lucky. It's a simple fact your productivity will be impacted by the constant noise of coworkers who share your desk.
But what about pair programming
Even if you're doing pair-programming you'll find individual pairs interrupt the larger team all the same. Perhaps the only real exception to this would be mob programming but that craziness is a topic for another post.
The rundown
Here's a brief list (in no particular order) of negatives I've personally encountered during my time in a war room environment:
The Nosey Neighbor: "hey dude watcha working on?"
The Jokester: always ready to break your concentration with a cheesy joke to which you can't ignore without being rude.
The Drummer: coworkers love to drum on their desk (sometimes subconsciously), tap their feet, type rhythmically and/or aggressively to their music.
Body functions: burping, flatulence, old-fashioned BO
Nail biting and of course spitting (yes this actually happens)
Tendency of coworkers to bother you with poorly thought out questions because you know you're right there
Visitors to your coworker will distract you, sometimes pulling you into a conversation
Smacking of bubble gum
Eating of food (smells and smacking, etc)
Greetings when coming or going (coworkers leaves for lunch and says I'll be back so as not to be rude yet breaks your concentration. Coworker returns from lunch and says hey hows it going so as not to be rude but this also breaks your concentration)
Standing (via standing desk or not): there is something awkward about sitting while someone is standing right next to you
Annoying static noise that comes out of your coworkers earbuds that she uses at 100% max volume and occasionally leaves on while she's away from her desk
Constant alerts, texts & beeps of coworkers phones
What shall we do then
A few years ago I read a blog post by Joel Spolsky titled, A Field Guide to Developers and laughed at the idea of a private office for each developer. I imagined a nice quiet place where my coworkers could go play their favorite MMO or take a nap. I assumed, incorrectly, that people would abuse the privacy and waste company time if not kept under a watchful eye. That's a horrible thing to think about my coworkers. If you feel you have to "keep an eye" on your programmers then you've either not hired correctly or are a bad manager.
With that out of the way, let's admit there is enough decent evidence (see Google) to conclude that private offices are a major productivity gain for programmers. If it is at all within your means you should strive to give each programmer a nice, quiet place to get work done free of the constant interruptions of their coworkers.
Suggested reading: Peopleware: Productive Projects and Teams (3rd Edition)
Update
Feedback from various sources has made me realize it's important to clarify that the traits on this list are not attributes of a bad coworker but attributes of a human coworker. Common social courtesy and human interactions are a very important part of the office experience and this post was not meant to find fault in any of that. Instead this article was intended to list attributes of a work environment that is prone to interruptions.
0 notes
mcminton-blog-blog · 11 years ago
Text
Announcing rhubot for Hubot
Tumblr media
ro͞oˌbät,ˈro͞obət/
What is rhubot?
rhubot allows you to call arbitrary, long-running ruby scripts from campfire via hubot. Once the script is finished executing it will post its result back into the campfire room where it was called.
rhubot makes Hubot play nice with Ruby.
Why not just write a coffeescript?
I have an existing library of ruby scripts that automate many things around the office that I'd like to utilize more directly from Hubot.
I dig coffeescript but I dig ruby more.
What do I use it for?
I use rhubot to automate a ton of tasks such as gathering release notes from JIRA and deploying them to our website.
Where do I get it?
https://github.com/minton/rhubot
How do I install?
You'll need a working installation of Hubot connected to Campfire. See Setup instructions.
0 notes
mcminton-blog-blog · 11 years ago
Text
Announcing DataButler
What
Tumblr media
How
Double-click a .bak file and DataButler will greet you with a suggested name for your new restore. Press enter and you're new database will quickly be restored. Be mindful that it will restore over any existing database with the same name. After the restore complete a GREEN window indicates success while a RED means something went sour.
Tumblr media
Where
Find the latest release version of DataButler here: Latest Release. If you're looking for the source you can find it here: DataButler.
0 notes
mcminton-blog-blog · 11 years ago
Text
Getting JIRA to Talk to GitHub
The Situation
You have a private repository owned by an organization and you're tasked with getting your JIRA instance talking with GitHub. Fear not for this post contains the secret sauce for making this work.
GitHub Setup
Head to Account Settings -> Applications -> Register New Application
Application name: JIRA DVCS
Homepage URL: Your JIRA URL
Authorization callback URL: Your JIRA URL
Click Register application
Leave this page open so you can later copy the Client ID and Client Secret.
JIRA Setup
Administration -> Add-Ons
Click DVCS Accounts under SOURCE CONTROL
Click Link Bitbucket or GitHub account
Select GitHub
Enter your GitHub account instead of your org or team name
Copy your Client ID into the OAuth Key
Copy your Client Secret into the OAuth Secret
Click Add
Secret Sauce
The authorize GitHub application page appears
Go up to the address bar.
Find the part of the URL that looks like "organization%3DYOUR-NAME" and change it to "organization%3DORGANIZATION-NAME".
Visit the modified URL
Click Authorize
Ignore the error from JIRA about "Bad Verification code".
Go back to Administration -> Add-Ons -> SOURCE CONTROL -> DVCS Accounts.
You should now see all your repositories.
0 notes
mcminton-blog-blog · 11 years ago
Link
Super quick introduction to the five basic principles of object-oriented design known by the acronymn SOLID. Slide from the 2nd florida coders user group meeting. 2014/01/08
0 notes
mcminton-blog-blog · 11 years ago
Text
Muscle Memory VM Killer
The Problem
I live in OS X but use Windows for work via VMWare Fusion. I find myself constantly trying and failing to use OS X keyboard shortcuts in Windows. Usually it's harmless but occasionally it can hinder productivity dramatically. Case in point the VM Killer: Command-W (⌘W).
The Fix
OS X's flexibility makes fixing this super simple.
Tumblr media
Open System Preferences and click Keyboard.
Tumblr media
Click the Shortcuts tab, select App Shortcuts in the list on the left and click the + button to add a new shortcut.
Tumblr media
In the box that pops up select VMware Fusion from the Application drop down. Now type the word Close exactly into Menu Title. Click in the Keyboard Shortcut box and press Shift + Command + W (⇧⌘W). Finally click the Add button.
You've just rewired the Close command shortcut from ⌘W to ⇧⌘W and saved yourself from closing your VM with pure muscle memory and habit.
0 notes
mcminton-blog-blog · 12 years ago
Text
Announcing git-author-fix
What
git-author-fix is a simple Windows tool for cleaning up and consolidating multiple commits with slightly diff author info. e.g. (Michael, mike)
How
Simply point the tool to a valid git repository. It will scan your repo and present a list of all author/committers it found. Place a check next to the ones you wish to replace with your new Name and Email and it will churn through your repo fixing the commits for you.
Screen Shot
Tumblr media
Where
You download the latest release of git-author-fix here.
0 notes
mcminton-blog-blog · 12 years ago
Text
Five Tips For Being a Happier (.NET) Developer
#1. Stop Copying and Pasting
Tumblr media
Seriously the time you think you're saving is not worth the risk of introducing a hard-to-spot bug because you forgot to change part of what you copied. Worse yet is if you're just copying and pasting without editing.
#2. Stop Abusing Search and Replace
Tumblr media
This goes along the same lines as #1. If you find yourself constantly reaching for Search and Replace then chances are you're doing something wrong.
#3. Use Resharper
Tumblr media
I'm an advocate against using so many add ons, extensions and plugins that you can no longer work on Vanilla Visual Studio. With that said, Resharper is a must-have tool that will actually make your IDE experience pleasant at times.
#4. Use NCrunch
Tumblr media
Continuous Testing. You're welcome.
#5. Turn It Down a Notch
Tumblr media
Take a moment and adjust the brightness on your display down a few ticks. Your eyes will thank you.
0 notes
mcminton-blog-blog · 12 years ago
Text
First Look: MailBox App
Tumblr media
A couple weeks ago on a whim I downloaded the much-hyped Mailbox App on my iPhone 5. I was pretty interested in what this app could do to help make my inbox more productive. I was quickly slapped in the face by a screen indicating I had to wait in line and there were nearly 500,000 people in front of me! Mein Gott!
Tumblr media
The Wait Is Over
Fast forward through a weeks of disappointedly checking my place in line and finally Sunday night my phone lights up with a message telling me my Mailbox is ready. Dig!
As I opened the app I was greeted by a nice tutorial that showed me the ins and outs of Mailbox. It sports a simple, intuitive GUI. I'm not overly impressed with the swipe-to-do-everything interface since it's hardly innovative at this point. However, I absolutely love the idea of converting my inbox into a to-do list.
Email The New Medium
I've been using Mailbox for nearly a week now and I have to say it is more useful than I expected. So far I have been able to keep my inbox at zero using this app. Important emails that are no imediately actionable can be moved out of my inbox and deferred to a time when I can take action. No more inbox clutter.
Using the app has been a pleasant experience. I can just focus on my email. The fact that I never have to think about Mailbox itself is a testament to it's solid design. I totally understand why Dropbox picked up the Mailbox team.
The Unknown
What scares me about Mailbox is the price. It is a free app. A free app with obviously heavy infrastructure costs to handle all the push notifications and communication with Gmail. These problems are only going to get worse as more people board the train.
I wish they would have released it as a $4.99 app with a minimal monthly subscription but they opted for the "build a user base then monetize somehow" strategy. At some point they'll have to do something to attempt to monetize. I'm hoping that when that happens it doesn't destroy the app I've come to love.
Checkout some screens here: Mailbox Screens
1 note · View note
mcminton-blog-blog · 12 years ago
Text
Open-sourcing Spot
#Music at Work Music is an important part of my daily office experience. My co-workers and I tend to rock out as we tackle our day. It helps tune out the world and allows us to focus on the code. This has been more or less accurate for many of the devs I've met over the years. What's unique about my current environment is the lack of cubicles and earbuds. We use an open concept with developers sitting in what amounts to a square round table of desks. Everyone is within earshot for instant communication and you only plug earbuds in if your after some private time. So without earbuds pumping music we had to figure out how to get tunes playing in the office. #iTunes For my first attempt I dumped all our music into iTunes and used the DJ feature to have a continuous playlist. This worked OK and could be controlled via the Apple remotes. I even installed @holman's Play which allowed us to control iTunes via Campfire. It was all pretty sweet at first. After the first couple of hours we knew we had a problem. Even combining our iTunes libraries it wasn't enough music to make it through a work day without hearing the same song over and over again. You may think this only a minor annoyance but you'd be wrong. #Spotify We realize our iTunes libraries were so weak because we all used services like Spotify, Pandora and Rdio. Duh! Using a music service seemed like an obvious choice. I opted for Spotify since I had already built huge playlists. Things were excellent now. We had unlimited tunes BUT we lost our ability to control it via Campfire. #Spot So taking quite a bit of "inspiration" from @homan's Play I set to work on a similar way to control Spotify. After a day of hacking I had a working solution. A couple days of refactoring and Spot was born. ##Spot is simple Spotify-powered tunes for your office controlled via Campfire. Spot exposes a simple API to control the common functions of the Spotify player. It comes with a Hubot script that allows you to control it via Campfire. ![](https://github.com/minton/Spot/raw/master/resources/Diagram.gif) #FOSS FTW Today I decided to make Spot available as open source. Hopefully bringing some Spotify-powered goodness into offices whose iTunes library were as pathetic as ours. #How do I get it? First, click [this link](https://twitter.com/intent/follow?screen_name=mcminton) to follow me. The universe will reward your efforts. 🔮 Next, go find Spot on [Github](https://github.com/minton/Spot). Enjoy!
0 notes
mcminton-blog-blog · 13 years ago
Text
VMware Fusion Performance Tips
I'm an Apple fan and love their hardware and OS X. You won't find a non-Apple computer in my house. This wouldn't be unusual except that I make my living creating software for the Windows platform. Weird or not I'm sold on Apple (for now) and given a choice it's what I'll be using. Of course this leaves the little problem of running Windows on my Mac so I can actually do my job. Thankfully there are plenty of options these days. My preferred method is VMware Fusion 5 for MAC OS X. Using Fusion I can stay on my beloved OS X while firing up Windows any time I need. It's truly the perfect solution. Perhaps the only downside to using Fusion over Apple's [Bootcamp](http://www.apple.com/support/bootcamp/) is speed. Running an operating system as a virtualized guest within another operating system will always be slower than running directly on the bare metal. Fortunately, there are a few things you can do to squeeze every drop of performance out of your virtualized Windows box. These are a few tips I've picked up from heavy use of Fusion during my day job. #VMware Fusion Tweaks * Use less than 50% of available cores.† * Use between 35-40% of available RAM. * Make sure the Bus Type is set to SCSI. * Pre-allocate disk space. * Turn off automatic defrag in Windows * Turn off System Restore in Windows * Put the Virtual Hard Disk on an SSD * Occasionally reclaim space using 'Clean Up Virtual Machine'. * Avoid Unity mode. * Turn off Encryption unless absolutely necessary. #My Settings ![](http://media.tumblr.com/41e691c3c94c00fc670e5d195a2da5e1/tumblr_inline_mfestkJyIL1r2m718.png) #My System Specs ![](http://media.tumblr.com/c2f12fcc674a437b35539c7540190fe3/tumblr_inline_mfet4qExHT1r2m718.png) These settings have served me well but don't be afraid to play around and find what works best on your system. Happy VM'ing! † The screen shot shows the VM configured to use 4 cores but the system specs show I have a quad-core i7 making it appear I'm using 100% of the available cores. However, the i7 has hyper-threading with each core is capable of processing two threads: thus 4 cores in the VM is actually 2 physical cores.
1 note · View note
mcminton-blog-blog · 13 years ago
Text
AT&T Courtesy Upgrade Fee
#Buying a new iPhone from Apple? Prepare to get nailed with a $36 upgrade fee from AT&T (assuming your still painfully locked into a contract). I'm not opposed to the idea itself. Perhaps they do have some "cost" associated with allowing my new device on their network and that's fine. What I do have a problem with is their lame excuse for the fee. #AT&T's Official Explanation The upgrade fee is a one-time fee that allows us to assist customers by recommending new equipment, offering special offers and discounts, providing assistance with the upgrade process if needed, and supporting the returns process within 14 days. These specialized processes help us to ensure you are satisfied with your new equipment and are ready to use it the day you receive it. The upgrade fee allows us to defray some of these additional service costs. #Reality The truth is if I have an issue with my iPhone I'm taking it to Apple (where I bought it) not to AT&T. Also, it takes a sick and twisted individual to call AT&T to get help with how to use an iPhone. It all boils down to money. AT&T is a giant corporation that's simply too big to notice why this is wrong. It's just another example of them trying to squeeze every last drop of profit out of their customers.
0 notes
mcminton-blog-blog · 13 years ago
Text
Git 1.8 on Windows via PowerShell
This morning I [heard](http://news.ycombinator.com/item?id=4681748) about [Git 1.8](https://raw.github.com/git/git/master/Documentation/RelNotes/1.8.0.txt) being available. I headed over to http://git-scm.com/ on my MacBook Pro and clicked [Download](http://git-scm.com/download/mac) and was all set in under a minute. I came into work this morning thinking I'd have a similar experience on my Windows VM. I went to the site and saw Latest stable release `1.8.0` but when I hit Download I was greeted with this screen telling me I'm downloading a 3 month old release of Git 1.7.11. ![](http://media.tumblr.com/tumblr_mcax73rmAP1r2m718.jpg) Three months old? No, I decided to pull the source and build the latest version of Git locally. Here's how I did it. #Install You'll need to download and install msysgit from [code.google.com/p/msysgit](http://code.google.com/p/msysgit/downloads/detail?name=Git-1.7.11-preview20120710.exe&can=2&q=). Be sure to install to C:\msysgit. This will also download and compile an older version of Git. After the install completes you'll be sitting at a MINGW32 command prompt. Type `exit` to close this window. #Setup Powershell On your desktop (or anywhere) create a shortcut with the following target:
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe "C:/msysgit/bin/sh.exe" --login -i
Like this: ![](http://media.tumblr.com/tumblr_mcaxoxzoOQ1r2m718.jpg) Double-click this shortcut and you should see a PowerShell prompt that looks something like this: ![](http://media.tumblr.com/tumblr_mcaxusQakA1r2m718.jpg) #Git 1.8 Download and compile the latest version of Git. $ cd /c/msysgit $ rm -rf git $ git clone git://github.com/git/git.git $ cd git $ make $ make install $ git --version You should see the following result: ![](http://media.tumblr.com/tumblr_mcay6f5CDn1r2m718.jpg) #Setup Aliases (Optional) I spend all day typing and anything that can cut the amount of typing I do is a plus for me. I create an alias to call git by typing just a g. It's a small saving but it really adds up. notepad ~/.profile When Notepad opens type the following alias and save and exit: alias g='git' ![](http://media.tumblr.com/tumblr_mcaytmEjEB1r2m718.jpg) You should now have the latest version of Git running on Windows via PowerShell with a spiffy alias that allows you to access git with a single character: ![](http://media.tumblr.com/tumblr_mcayofmHCr1r2m718.jpg)
1 note · View note
mcminton-blog-blog · 13 years ago
Text
First Look: Faker
With the awesome tools of today you can have a decent prototype up and running in a matter of hours. Getting a proof-of-concept up and running fast so you can get start gathering feedback quickly is incredibly useful. An idea or design can sound great on paper but look awful once implemented. The faster you can find this out the faster you can move on to a better design. An important aspect to this is having realistic looking demo data. Until recently you would enter this data by hand or turn to a generation site such as [lipsum.com](http://www.lipsum.com/). Today we have tools that can intelligently generate data to meet various formats. Today we'll focus on a great tool built in Ruby called [Faker](https://github.com/stympy/faker). #What is Faker? Straight from the source Faker is... >"Faker, a port of Data::Faker from Perl, is used to easily generate fake data: names, addresses, phone numbers, etc." Faker was created by [Benjamin Curtis](http://www.bencurtis.com/), aka [stympy](https://github.com/stympy), the creator of [RailsKits](http://railskits.com/) and is released under the MIT License. #How do I use it? Here is how I fit Faker into my work flow. I created a rake task called `populate` that I use during development and testing to setup my database to a default initial state with dummy data. The task looks something like this:
namespace :db do desc "Populate db to initial state" task :populate => :environment do Rake::Task['db:reset'].invoke Type.create!(:name => "Tech") Type.create!(:name => "Business") 50.times do |p| type_id = rand(1..2) type = Type.find(type_id) name = Faker::Company.name + ' Conference' url = Faker::Internet.domain_name details = Faker::Lorem.paragraphs(rand(2..9)).join("\r\n\r\n") address = Faker::Address.street_address city = Faker::Address.city zip = Faker::Address.zip year = rand(2012..2019) month = rand(1..12) day = rand(1..28) hour = rand(1..12) minutes = rand(1..59) date = DateTime.new(year, month, day, hour, minutes) Conference.create!(:name => name, :date => date, :url => url, :details => details, :address => address, :city => city, :zip => zip, :type_id => type_id) end end end
You can call this task the same as any other rake task: rake db:populate Notice that this task first calls rake db:reset before populating the dummy data. #Links Faker is super easy and kind of self-explanatory but saves a ton of time in getting your database populated with realistic data. For more detailed usage and documentation check out the following links. The official site is on [rubyforge.org](http://faker.rubyforge.org/). The source code is available on [GitHub](https://github.com/stympy/faker).
0 notes
mcminton-blog-blog · 13 years ago
Audio
#Remember Steve Jobs ##February 24, 1955 - October 5, 2011 Take a moment today to remember Steve Jobs and all that he was. His touch on the planet will be missed.
0 notes
mcminton-blog-blog · 13 years ago
Text
Big, Bulky and Epic
So it's that time of year again. No not that time but new computer time. I recently moved to a new [MacBook Air](http://amzn.to/UqJvcq) which is absolutely awesome. Problem is it doesn't quite have the horsepower I need for my extracurricular activities \*mumbles\* [warcraft](http://worldofwarcraft.com/)....right so anyway moving on. The Air would overheat just watching lengthy flash videos or running [minecraft](http://minecraft.net) for longer than 15 minutes. World of Warcraft was out of the question. Also, and this is perhaps more embarrassing to admit, I couldn't run Windows via [Fusion](http://amzn.to/NLe9hX). These perfectly valid excuses led me to buying the new 15" [MacBook Pro Retina](http://amzn.to/RJdA32). This is by far the most powerful laptop I've ever owned. Sporting a 2.6Ghz i7 with 16GB of RAM and a 768GB SSD, this thing makes the Air look like a joke. I used to carry a 19" Sony Vaio around. However, I have been spoiled and will totally miss the ultra-portability of the Air. It was so easy to carry I didn't even have a laptop bag. I carried it solo in a [neoprene case](http://amzn.to/RJ59F1). The new beast "feels" huge compared to the Air. Too big to just carry around so I looked for the best backpack for the MacBook Pro and found the [Sling Pack](http://amzn.to/Q41IOq) which is a slim bag with room for your laptop and a few accessories. I dig this bag's compactness, lightness and it's single strap with a fastener that allows me to put it on without sliding it over my head. I'm still a little shocked at how big it is but so far I'm impressed with the speed of this thing. Now comes the hard part of getting it setup for development and gaming. That'll likely be my next post. Check out some pics: [![](http://media.tumblr.com/tumblr_m9uywqQO3h1r2m718.jpg)](http://mintphoto.tumblr.com/post/30916258798/2-6ghz-i7-16gb-ram-768gb-ssd)
0 notes
mcminton-blog-blog · 13 years ago
Text
Announcing Binda
Perhaps inspired by my previous post, I've taken a new project I've started and released it as an open source project. This project solves a very specific problem for a very specific market. Thus I don't expect it to be well-known or popular. However, the process of preparing a personal project to be released as an open source project was an great learning experience. I highly recommend you do it. #What is Binda? [Binda](http://minton.github.com/Binda/) is a dead-simple, convention-based data binding tool for WinForms. It will take an Plain Old CLR Object and map its' properties to controls on a Form. It does this by looking for controls that have a name and data type that match the property on the object. If a successful match is found the value is populated. Binda also supports going the reverse direction and populating an object from a Form. #Example Time... Before Binda I mapped my objects to controls on the form manually like so: txtFirstName.Text = person.FirstName; txtLastName.Text = person.LastName; txtCity.Text = person.City; txtState.Text = person.State; txtZip.Text = person.Zip; ..... txtSSN.Text = person.SSN As you can imagine this is very tedious code that doesn't provide any real business value. After applying Binda I can do the same thing like this: var binda = new Binder(); binda.Bind(person, frmPerson); When you combine this with an ORM like [Dapper](https://github.com/SamSaffron/dapper-dot-net) working with WinForms isn't so painful. #Isn't WinForms Dead? No I work with WinForms every day doing new development. I certainly wouldn't recommend WinForms for any new projects but if you're like me and you get paid to work on a legacy system then you'll appreciate any new library that makes working with WinForms less tedious. #How do I use it? The complete source is available online at [GitHub](https://github.com/minton/Binda). I've also published a [NuGet package](http://nuget.org/packages/Binda) if you'd rather not build it yourself. For details and examples on how to use Binda go here: [http://minton.github.com/Binda/](http://minton.github.com/Binda/).
1 note · View note