Showing posts with label Autopilot Consulting. Show all posts
Showing posts with label Autopilot Consulting. Show all posts

Monday, October 12, 2015

Size Matters: Improve Productivity with Cheap Screen Real Estate

Common Screen Sizes

It's hard to hire developers, and technical resources are expensive. Everyone is trying to figure out how to attract top talent, reduce turnover, and increase productivity of existing staff without reducing their work/life balance.

Early on, I decided that if you're going to spend 8 hours a day 5 days a week for almost 50 weeks a year doing something, everything about it should be as pleasant as it could be. I bought a new Macbook pro and two thunderbolt displays. Those investments very quickly paid off.

Until recently, the benefits of large technology investments were just intuition. Last week, I realized how much more productive I was working remotely than when I'm onsite with the client. One reason is that when I'm remote I get a lot more flow, but another reason is that when I'm remote, I have a lot more screen real estate so I can see a lot more information at once.

I decided it was time to be more productive onsite too. This time, I wanted to have more concrete justification.

Screen Selection

A friend of mine and I did a fair amount of research picking out monitors that gave us the best bang for our bucks. I'm really happy with my Thunderbolt Displays. They're IPS and they're quite high PPI. This time, I wanted to try something a little cheaper and a little larger and I wanted to try a VA panel so I ended up getting a BenQ BL3200PT. This monitor, I think, has the same panel as the Samsung S32D850T, which has a slightly smaller price tag.

Screen Real Estate

When I talk about screen real estate, I'm not talking about the diagonal size of the screen; I'm talking about the resolution of the screen. Having a larger screen doesn't do anything for you (at least not in the sense of a computer monitor) with regard to how much information you can fit on the screen at one time. The difference between an HD 1080 screen at 27" vs. 32" is just stretching. Resolution, however, is how many pixels the screen has. The more pixels there are, the more options the computer has to present data (provided you have the visual acuity to perceive the data without scaling).

These displays are 2560 x 1440 or WQHD and are the same resolution as my thunderbolt displays, albeit over a larger surface area. Thus the resolution is not quite as crisp as my thunderbolts, but still these are very high quality screens. If you're into lower pixel pitch and higher PPI, I don't blame you. Higher pixel density screens are much more pleasant to look at, but they do come at a cost.

Comparing Resolutions

There are two very common resolutions in offices these days. An older WSXVGA+ which is an 8:5 aspect display at 1680 x 1050 pixels. HD 1080 is also quiet popular which is the 16:9 display at 1920 x 1080. The HD 1080 has about 17.6% more pixels than the WSXVGA+. By comparison, the WQHD, also 16:9, has 2560 x 1440 pixels (sometimes called 1440P). It has about 77.8% more pixels than HD 1080 and about 110% more pixels than WSXGA+. That is to say that if you have 1 WQHD display, you have more pixels than a dual screen WSXGA+ setup.

Benefits of Screen Real Estate

The benefits of additional screen real estate, unfortunately, are easier to experience than they are to describe. Having additional real estate may mean that you will sense more data at the same time, but does not necessarily mean you will perceive these data. Similarly, having the ability see multiple windows does not mean that you won't just continue editing one file at a time in a full screen editor. On the other hand, not having the ability to optimize your workflow guarantees that you will not.

Anecdotes

I do have a few anecdotes that buttress my belief that having more screen real estate is inherently valuable. One time when I'm particularly keen to the benefits of higher resolutions is when I'm developing responsive designs. I'll often dock my browser's DOM inspector on the side and I'll slide the split pane to different responsive breakpoints watching the HTML/CSS changes flash in the inspector. The additional real estate means I can see meaningful data in the DOM inspector and the responsive design at the desktop breakpoint at the same time.

Another time I notice the benefits of having additional screen real estate is when working on native mobile applications. Native development often involves simulators and emulators. Scaling during emulation isn't always well supported. Thus, the additional pixels allows you to see the entire simulator at once.

Another example that I found particularly fascinating happened shortly after I took over a new project. I had been working on the project for a few weeks from the client site. One day, I was working remotely and I had my terminal window off to the left and I had the application in a browser to the right. This is a usual screen configuration for my workflow on my cinema displays. I had changed some code and the application reloaded. When it did, I noticed dozens of queries pop up in the log. None of the ORM queries had been optimized to prevent N + 1 queries. I spent a few hours fixing those, but may never have noticed them had I not had enough room on my screen to comfortably view the browser and the terminal at the same time.

Summary of Benefits

Typically on HD 1080 and especially on WSXGA+, I have only one window visible at a time. That's why I didn't notice the N + 1 queries until I was remote. There may be myriad other benefits of the additional screen real estate when considering looking at code in multiple panes, test driven development, debugging, guard and live reload, etc.

Costs

High quality screens can be expensive! The thunderbolt displays are almost $1,000 each. The BenQ was $550. The Samsung is $500. It's hard to imagine pulling out all of your existing displays and replacing them with displays that cost several hundred dollars. Heck, I spent hours justifying buying only one.

That's why it clicked. At some point I realized, it doesn't take much before the investment in display technology pays off. According to several job posting / salary research sites, the average developer in Atlanta makes about $120K per year. To keep the math easy, I'll call it $100K (also because I like lowballing estimates like this). Normally, overhead on a W-2 employee is roughly 25% - 50% of annual salary. If you have a very modest benefits package (and not a lot of PTO), then an average developer in Atlanta will cost about $125K per year.

Even if your organization buys these screens the same way I did (i.e., no sales tax and no bulk discount), then it'll cost about $550, or about 0.4% of the cost of an average developer. That means that if you bought 100 of them, it would cost less than half of the annual salary of your average developer for a year. Thus, if you have 100 developers and you get 100 screens and each developer is 0.5% more productive for the year, then you actually make money on the investment.

If the cost still seems too high, you don't have to get VA panels. In fact, 32 inch screens are pretty big (they take up a lot of desk real estate too). These 25" Dell U2515H IPS panels were only $350 at the time of writing. 100 of these would be less than 1/3 of the underestimated developer annual cost.

Recuperating Costs

The average American works 1,780 hours per year. To recuperate 0.28% of a developer's cost, the developer only needs to produce about 5 hours more per year. That could be working an additional 5 hours per year because work is more fun. It could be 5 hours saved by not having to tab between windows and the cost of brief context switches. It could be 5 hours not spent tracking down performance issues in production because some N + 1 queries sneaked through.

It could be 5 fewer hours spent recruiting great job candidates because the technology makes the company a better place to work. Developers with neat technology are more inclined to passively as well as actively recruit for you. This can bolster your recruiting efforts, also saving money. Similarly, developers with a satisfying work environment are less likely to leave their jobs reducing the high cost of turnover.

Studies on worker productivity show that American workers tend to have about 6 (and some studies show as few as 3) productive hours in an 8 hour workday. Better screens may improve ideal hours per day. That means if all of your developers show up Monday morning and find their brand new screens, and in their excitement they're productive for 8 hours on Monday and Tuesday (rather than 6) and 7 hours on Wednesday, then in the first 3 days, the screens have paid for themselves. I could be completely wrong about everything else and your net could still be more valuable somewhat liquid (they have good resale values) assets for free.

Remember, you only need 5 additional productive hours per year to cover the cost of 1 high resolution display … and that's if you buy new screens every year. If you plan on keeping the displays for 5 years, it's just 1 hour per year.

Incredulous?

Let's consider a more pessimistic case. Let's say your staff, on average is pretty junior (and you're using technologies that aren't particularly backend heavy. If that's the case, your developers may cost you an average of $80K salary and per year and $20K in benefits, taxes, recruiting efforts, etc. Let's say they also take no vacation or sick leave and thus work a full 2,080 hours per year. Further, your staff is productive 100% of working hours.

In this case, you're paying an average of $48 per productive work hour. If you buy very nice displays at say, $960 each, then you need 20 additional productive hours to cover the cost of one display. Even in this very unlikely case, that's less than 1% per developer. And they don't need to work 2,100 hours in a year per se. They can be 1% more efficient. That means if they're writing 100 lines of perfect code per day, then to cover the cost of a new display, they only need to write 100 lines of perfect code per day (and on the tenth day, perhaps they write 10 extra perfect line of code . . . or better yet, they delete a line or two).

More likely your average developer is closer to $125K per year, they work 1,780 hours per year, and they are productive fewer than 6 of every 8 hours. Thus, their cost is $94 per productive hour. Also, it's very reasonable to get smaller IPS WQHD panels for $350 each (especially if you have a large team and get a bulk or corporate discount). So, you need fewer than 4 hours per developer or 0.3% more productivity. An average developer contributes 10 lines per day to the codebase (Mythical Man Month) so to break even on your investment, your average developer only needs to net an additional 3 lines of code every quarter.

n.b., I don't support using lines of code as a measure of productivity. It's merely illustrative of the relative scale of the cost of a display to the cost of a developer. Try your own calculations using bugs sent to production, mean time to defect resolution, etc.

Recommendation

I recommend making an investment to replace low resolution displays for developers and pairing stations (and I would consider broadening the reach really to non-technical employees as well) with high resolution displays. I think that the cost of the hardware would be recovered very quickly by improved developer efficiency and performance. The investment is low risk because the cost is relatively low and the displays are a moderately liquid asset.

If you have 100 developers on your team, it may be hard to get approval for the capital to buy $35,000 worth of displays. In that case, you can always hire another developer (well, you can try at least) for $35,000 per quarter.

Display Options

Dell P2416D 24 Monitor with QHD 23.8-Inch Screen, Black
Dell UltraSharp U2515H 25-Inch Screen LED-Lit Monitor
Dell UltraSharp U2715H 27-Inch Screen LED-Lit Monitor
BenQ BL3200PT 32-inch WQHD 10-bit USBx4 HDMI Monitor built for Creative Class
Samsung 32" WQHD LED Monitor (S32D850T)

Wednesday, June 10, 2015

Project Nostalgia: Warehouse Management

All Work and No Play

Early in my development career, I got a job at an entertainment company that rented party supplies like inflatable bounce houses, inflatable slides, human gyroscopes, etc. On my first day, I was introduced to my new boss, the owner of the company, on his way out the door headed to China for 2 weeks.

I introduced myself, thanked him for the opportunity, and asked what he wanted me to work on while he was gone. "You'll figure it out," he said, "make us some money." And out the door he headed.

Once I found my office and tracked down a computer, I sat down and thought, "what the heck am I going to do here?" Having just gotten my MBA, I decided I'd take a page from my business consulting class and just "see what my lantern shows me." I walked around asking my new coworkers what the company does, what they do, and what could make their lives easier.

There were the usual gripes, manual processes, duplicate paperwork, etc. One problem in particular, however, I found particularly intriguing. It turns out that the company had an uncomfortably high refund rate because they'd show up at parties and equipment would be missing. They also would only schedule a few parties a day, despite having plenty of equipment to spare, because it took so long to prepare for an event. Similarly, they required reservations be made a week in advance.

Shopping in Your Own Warehouse

If you're like me, when you make a grocery list, you write items down in the order you think of them. Then, when you go to the store, you walk up and down the items, grabbing things from the list and crossing them off as you go. Also, if you're like me, sometimes you pass an item and you have to go back. Or, you don't notice an item that you missed and you go home without it.

If you want to try an experiment (actual or thought), commit to going to the grocery store and getting everything on your list in the order it appears on your list. You'll probably find you forget less stuff, but you do a lot more walking around the store. It's not a particularly efficient way to organize a shopping trip. If you implement this in, say, a warehouse you may issue fewer refunds but you can't increase the number of events you can service in a day.

I'm sure by now, you're imagining myriad ways to organize a list of grocery items so that, if nothing else, at least you have some consistency. You could organize them alphabetically. That way, your items on your list will follow more or less the same pattern visit to visit. That may or may not be better than in the order you thought of them (assuming you remember grocery needs that are grouped together).

Imagine, however, that you can't sort your grocery list in the order you think of it. Imagine you can't even sort the list alphabetically. In fact, your only option is to sort the items on the list in the order the item first appeared in your grocer's inventory. Imagine how nonsensical it would be trying to track down where all of your groceries were. How much you'd forget (or perhaps even leave deliberately). That's what we had.

A Guided Tour

I printed our inventory list and I walked around the warehouse writing down the exact coordinates of every product and every component we had. I also estimated the volume, weight, and stack-ability (if you will) of the item.

Hoping to get a cheap win and to prove that it could make a difference (some of the guys in the warehouse weren't interested in their inventory lists being optimized), I got a few of the guys to agree to try it out for 1 day. I entered my data into the inventory table and sorted the inventory list by aisle, bin, then level. That was it. Only took a few minutes, was easy to revert if it failed, and I could switch it based on the user.

When I got back from lunch, one of my coworkers who sat outside my office said, "hey, warehouse really wants to talk to you … they've been in and out of here constantly since you left." I thought, "oh no . . . I probably broke something and they can't print inventory lists at all now."

I headed out to the warehouse preparing my apology. I had barely walked through the door when someone said, "hey Patrick, check this out?" There were several palates stacked with boxes and party equipment distributed along the loading dock. "What's up?" I asked.

Turns out my first sorted list was such a hit that they decided to start racing each other to see who could fulfill the inventory list faster. They had not only prepared the next days events, but several days after. I know it doesn't sound like it should take that long, but this warehouse typically had 4 or 5 people preparing 10 or 15 parties a day give or take.

A Deliberate Solution

Feeling I'd created some real value, I went back to my sorting. I updated the logic so that bins were in reverse order on odd number aisles (they started at the end of aisle 1, went to 2, the back up 3, and so forth). I sorted the items so that, given close proximity, the larger or heavier items would appear in the list first so they'd be on the bottom of the cart.

In the display, I grouped the items by aisle. Once I did this, I realized I should start at the end of the first aisle that had equipment on the list, then continue on the beginning of the next aisle with equipment (rather than just naively going up and down each aisle). With the help of the warehouse team and some statistics I pulled from the historical invoice data, we also started physically grouping items based on how frequently they were pulled on the same list.

Some of them were obvious. If you ordered an inflatable, you'd likely also get a blower. People who rent tents also rent chairs. Some were less obvious. People who rented dance floors typically didn't rent inflatables but did rent a bar and concessions. Once we established that not only could we control our own inventory but that we can control our own reports, it became a game to optimize the process.

In the end, it only really took 1 person to run the entire warehouse, though we staffed 2 because people liked working together. The rest of the warehouse team got promoted. It was actually something of a coveted job to get to deliver the equipment, spend some time outside, visit with the people having the party (partying people are usually pretty happy people).

We also started booking more parties. We even booked parties same day if we had the equipment and the people available. I'm sure there are COTS products that are really good at solving this very problem, but solving a real business problem with feedback from the people who were most impacted by it and seeing measurable gains in revenue was well worth the effort. It also help build some relationships and establish a collaboration they'd never had before (I was the first developer who worked onsite).

Sunday, May 24, 2015

Remote Interview Pairing Challenge with Cloud9

Cloud9 IDE

My interview process typically involves just trying to get to know someone to see if we're a good match culturally. After all, if you have a good mind for development, I know you'll be great if we can put you in the right environment with the right culture. As a result, I tend to spend a lot more time talking about what kinds of problems a developer finds interesting, what sorts of roadblocks she finds frustrating, and what technologies we have in common.

There is, however, still the necessary evil of seeing how far along the candidate is on the programming journey. To that end, I usually try to do a very basic code challenge. Normally it's something simple enough that we can still have a healthy conversation while we solve it together as a pair, and it's not so academic as to be useless in real life. Mostly, I just want to pair together to solve a problem.

I give the candidate the opportunity to select the language of her choosing and typically I'll know it well enough that we can pair to solve the problem. I explain the challenge, we set up unit tests, write a failing test, and make it pass. Sometimes, if I don't feel like I know enough, I'll change it a little and we'll try to adapt to the changes together.

This has been such a positive experience for me (and for the candidates I've talked with after their interviews), that I've spent a fair amount of time practicing the process. As I recently discovered, it's such a fundamental part of my interview, that I was completely unprepared when a client asked me, at the last minute, to step into an interview to do a pairing challenge with a candidate . . . who was remote!

Remote Pairing Interview

We tried to come up with a few options for doing the code challenge. After all, our shop pairs pretty much all the time and we try to be supportive of remote work. I mean, we've solved this problem before; however, it's seldom without hiccups. I know that candidates are usually nervous in an interview and I feel a lot of responsibility to help set their minds at ease. To that end, I like to appear calm, collected, and organized.

We considered using tmate and vim. We talked about screen sharing with TeamViewer. We also thought about just letting this candidate work on a harder challenge, maybe something from Hacker Rank or Project Euler, and email us the solution.

Shortcomings

Each of these had a downside. Tmate would give the dev access to my machine and I wanted to let them do whatever they wanted without putting my machine in his hands. Alternatively, his machine could host but I wanted to be able to get to the solution later. Screen sharing with TeamViewer isn't as responsive as I like when pairing, especially if I want to be able to help out rapidly. Also, I type in Dvorak and sometimes that's an issue (turns out he does too . . . by the way). The async challenges, while good, don't let us know if we'll enjoy pairing together.

Enter Cloud9

I remembered, a while back, running across Cloud9 and playing with it a little bit. I thought, "hey, what if we just try this?" Cloud9 would give us a sandbox that we can work in with a full ubuntu virtual machine. The candidate can do whatever he wants to it, we can code, install tools, whatever. I said, "hey, give me a second . . . I'm going to try this Cloud9 thing . . . go ahead and get your account set up and I'll invite you to a project."

In about 5 minutes, the candidate, my co-worker, and I were pairing and running tests on our Cloud9 workspace. There were no security concerns, communication was simple, we still installed and used tmux and vim, we had a sandbox, I was able to save the code. It was a really great experience. Not only did we offer a position to the candidate, but the candidate has been happy on our team ever since. I consider it a sign of a good interview when a candidate takes a position and I think that Cloud9 had a lot to do with this one.

Next Steps

I've not used Cloud9 (or any web based IDEs for that matter) on day to day work. Unfortunately, I'm not really in a position to try it out on the free tier. At some point, I want to go ahead and get a subscription and see how well it works out for me. I certainly see the value of cloud based IDE services and I like the idea that the most expensive development hardware you need is a Chromebook.

Okay, so maybe that's a little hyperbolic, but not for long. We have pairing stations that we treat like cattle rather than pets. We can wipe it completely clean and have it up and running again ready to go in just a few minutes. The hardware isn't commodity, but it could be. In fact, it could just be a web interface to a virtualized instance and why couldn't that be accessed from a Chromebook, pairing station, laptop, tablet, or . . . maybe in a pinch . . . a phone? Personally, I like it and hopefully I'll get a chance to push Cloud9 beyond "hello world."

Wednesday, December 31, 2014

Our 2014 Charity Picks

Charitable Giving

We feel lucky every day. Our community has provided us with a great place to live and work. Our kids can grow and learn in safety and comfort. We're surrounded by opportunities personally and professionally.

For that, we are eternally grateful, and we like to give a little bit back to our community. We work hard to research the charities we choose to support and to make sure they're doing the greatest good with their contributions.

Here are the charities we selected for 2014

Episcopal Relief and Development

Episcopal Relief & Development works to save lives and transform communities worldwide. They rebuild after disasters and empower people to create lasting solutions that fight poverty, hunger, and disease. They working in 40 countries impacting the lives of nearly 3 million people around the world.

ERD has a high rating on Charity Navigator. While we typically seek a higher rating, it's very close to the highest it can be and we have close personal ties with the organization.

One thing we love about this program is you get to donate specific needs to the communities you're supporting. This is certainly the first time we've donated a cow and chickens. We also funded farming tools and community gardens, prenatal and postnatal maternity care, and 1 year of education for 5 girls.

Tiger Flight Foundation

A little closer to home, the Tiger Flight Foundation, base in Rome, Georgia inspires kids to be "Pilot in Command" of their own lives. All donations go toward the motivational and character development programs.

My relationship began with Tiger Flight as a volunteer pilot. I had a young man in my plane and as we taxied out, he said, "I've never been in a plane before." I asked him what was his favorite place to visit. He told me he'd never been out of Rome, GA. He was nervously excited as we started rolling down the runway.

We had barely left the ground when he could no longer contain his excitement and he looked at me almost teary-eyed and said, "I feel like I can see the whole world from here!" I thought, "from here kid, the whole world is in front of you . . . and I think you'll see it."

Friday, February 7, 2014

Sending Java Stack Traces to Loggly

Logs

Recently at my new Autopilot contract, I was tasked with configuring some of our applications to send log entries to Loggly. We're using log4j, rsyslog, and syslog4j.

The Loggly service produces nice data which are easily accessible through a pleasant interface. The configuration was simple, logging works from anything that can log with syslog, and Loggly support was generally responsive (it definitely helps to have a corporate relationship).

Once we had the environment configured, we configured log4j following Loggly's Log4j Setup instructions. We were getting log messages into loggly in no time. The only problem was that we weren't getting stack traces.

This was a little bit confusing because the setup document reads:

You can send your Java logs using Log4j. The method shown supports multi-line events such as a Java stacktraces over Syslog.

I dug through the my usual channels looking for someone else who had the same experience. All I was able to find really was this one Stack Overflow question.

Not really being a Java guy, I assumed I was just missing something. In fact, the folks at Loggly told me I was missing something too. :) I first started looking into the rsyslog documentation regarding multi-line log entries (like stack traces). I noticed that the file input module supports a ReadMode attribute, but the udp input module does not.

I added a rolling file appender to my log4j.properties file, I configured the imfile in our rsyslog config file, and we were off to the races. Good looking easy to read stack traces. It's worth noting I'm using the paragraph ReadMode because not all lines in a Java stack trace are indented. Thus, I needed a full blank line between log entries. This is more or less our log4j.properties configuration for the rolling file appender:

  log4j.appender.ROLLING=org.apache.log4j.rolling.RollingFileAppender
  log4j.appender.ROLLING.File=/tmp/log4j.log
  log4j.appender.ROLLING.rollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
  log4j.appender.ROLLING.rollingPolicy.FileNamePattern=/tmp/log4j.log.%d{yyyy-MM}.gz
  log4j.appender.ROLLING.layout=org.apache.log4j.PatternLayout
  log4j.appender.ROLLING.layout.ConversionPattern=%n%d{yyMMdd.HHmmss,SSS} %t %C{1}.%M %p: %m%n

This was well and good but I wanted to make sure I wasn't missing a simpler alternative. The docs said it would work via rsyslog udp and I wanted to know why I was having such trouble. I looked at the network traffic coming from my dev instances. I noticed that my messages didn't include any stack trace information at all. It wasn't just a multiline issue really. It was that stack traces were never being logged by syslog4j. I looked into the ConsoleAppender and found that it gets its append behavior from WriterAppender.subAppend. That method is how the console gets stack traces after the message has been written using the layout.

if(layout.ignoresThrowable()) {
    String[] s = event.getThrowableStrRep();
    if (s != null) {
        int len = s.length;
        for(int i = 0; i < len; i++) {
            this.qw.write(s[i]);
            this.qw.write(Layout.LINE_SEP);
        }
    }
}

I started looking at the Syslog4jAppenderSkeleton.append method. I noticed that this appender never logs stack traces at all.

protected void append(LoggingEvent event) {
 if (!this.initialized) {
  _initialize();
 }
  
 if (this.initialized) {
  int level = event.getLevel().getSyslogEquivalent();
   
  if (this.layout != null) {
   String message = this.layout.format(event);
   
   this.syslog.log(level,message);
   
  } else {
   String message = event.getRenderedMessage();
   
   this.syslog.log(level,message);
  }
 }
}

It was no wonder I wasn't getting stack traces into loggly. I looked back at the ConsoleAppender and wondered what the layout.ignoresThrowable was. I looked at the docs and found that the PatternLayout.ignoresThrowable method always returns true because it can't handle throwables. In fact, the same page reads:

A flexible layout configurable with pattern string. This code is known to have synchronization and other issues which are not present in org.apache.log4j.EnhancedPatternLayout. EnhancedPatternLayout should be used in preference to PatternLayout. EnhancedPatternLayout is distributed in the log4j extras companion.

Easily convinced, I switched to the EnhancedPatternLayout. I configured the ConsoleAppender to use the enhanced pattern layout and I added the %throwable configuration item to it. Viola! Stack traces . . . by my own doing. I copied the configuration to the Syslog4jAppender section, started the long deployment process, and watched in disappointment as I still had no stack traces.

I started messing with the layout on my Syslog4j appender and noticed nothing I did changed the resulting log message. That seemed a little odd, so I dug into that a little. I dug back into the Syslog4jAppenderSkeleton.append again. I set a breakpoint on this.layout.format(event); and attached the debugger. My breakpoint was never hit. The layout was always null!

I set out in search of where that field was getting set. We're using the log4j.properties file so our configuration is parsed by the PropertyConfigurator parseAppender method. This is a pretty big method but here's what I noticed:

if(appender.requiresLayout()) {
    Layout layout = (Layout) OptionConverter.instantiateByKey(props, layoutPrefix, Layout.class, null);
    if(layout != null) {
        appender.setLayout(layout);
        LogLog.debug("Parsing layout options for \"" + appenderName +"\".");
        //configureOptionHandler(layout, layoutPrefix + ".", props);
        PropertySetter.setProperties(layout, props, layoutPrefix + ".");
        LogLog.debug("End of parsing for \"" + appenderName +"\".");
    }
}

So again I looked at the implementation of Syslog4JAppenderSkeleton and found that requiresLayout always returns false!

public boolean requiresLayout() {
    return false;
}

This struck me as odd and it made me wonder how anyone ever was able to use the layout property with syslog4j. It turns out that DOMConfigurator.parseAppender ignores requiresLayout and sets the layout any time there's a layout tag in the log4j.xml configuration file.

// Set appender layout
else if (currentElement.getTagName().equals(LAYOUT_TAG)) {
    appender.setLayout(parseLayout(currentElement));
}

Having a fundamental opposition to switching to XML, I needed another way to get the Syslog4jAppender to respect my layout desires. To my chagrin, the best approach I could come up with was to subclass the Syslog4jAppender and override the requiresLayout method:

public class Syslog4jLayoutAppender extends Syslog4jAppender {
   @Override
   public boolean requiresLayout() {
      return true;
   }
}

I switched my configuration to use this appender, redeployed, and my stack traces started to appear in loggly. Unfortunately, they were all on one line with character codes in place of linefeeds. Preferring easy to read stack traces, I flipped the rolling file appender back on and considered this the best alternative. In short, here's how I get stack traces into loggly:

  1. Configure a RollingFileAppender
  2. Configure rsyslog to use the imfile module to monitor the file with paragraph read mode
  3. Profit

Wednesday, March 21, 2012

First Small Business, Big Difference for the NBCF a Success!

National Breast Cancer Foundation Banner

If you followed our Small Business, Big Difference program, you know that our first Small Business, Big Difference to support the National Breast Cancer Foundation ended Februrary 18th, 2012.

Thus, there are two pressing topics:

First, I'd like to apologize for taking this long to get these results out there. I know it's been a while, but I've been a little busy. On February 17th, 2012 my wife delivered our first child and we've been enjoying some family time.

Second, when we set out to start the Small Business, Big Difference program, we knew it'd take a few tries for it to catch on. We figured our first attempt would produce modest results; however, we were so excited that we were able to generate such interest in the program that we rounded our donation up to $100.00.

We'd like to thank everyone who donated or participated in the program and we'd like to thank the NBCF for letting us raise funds for them with the Small Business, Big Difference program. We're looking forward to working with them again in a future promotion.

Wednesday, February 8, 2012

Small Business, Big Difference - NBCF Approved

National Breast Cancer Foundation Banner

Last week I wrote a blog post introducing our Small Business, Big Difference program to raise money for the National Breast Cancer Foundation. This week, I got in touch with them and they gave us the go-ahead to run the fundraiser. We're very excited about the news!

So, we want to make sure you know how you can help! There are three ways that you can help us raise money to give to the NBCF.

Spread the Word


Get the App

  • Download the Jane Austen Quote of the Day Widget application.
  • Enjoy the application! We'll donate all ad revenue from the Jane Austen widget during the promotion period of Sunday, February 12th, 2012 and ending Saturday, February 18th, 2012.
  • If you love the app, buy the Jane Austen Widget Upgrade for less than a buck and we'll donate that too!

Want to Give More?

You're more than welcome to give as much as you want! You can visit the Mobile Magic Developer's Small Business, Big Difference for NBCF fundraising site powered by StayClassy.

If you have any questions at all, please feel free to contact us through our facebook page or twitter account. We'd love to address any concerns you may have.

Saturday, February 4, 2012

National Breast Cancer Foundation - Small Business, Big Difference

National Breast Cancer Foundation Banner

James and I recognize that we get a great deal of benefit out of writing mobile applications with Mobile Magic Developers. We enjoy the time together, the camaraderie, the learning experiences, and the opportunity to bring a little joy to a much larger audience. Along the way we've had a lot of support from friends, family, and the numerous customers who've downloaded our apps.

We wanted to find a way to give something back as an enthusiastic "Thank You" from the Mobile Magic Developers team to you. We've decided we're going to try something we call Small Business, Big Difference. Periodically, we're going to choose one of our applications and for a period of time, all proceeds from that application will be donated to a charitable organization. That includes sales and ad revenue.

For our inaugural Small Business, Big Difference attempt, we've decided that we'll donate all revenue generated by our Jane Austen Quote of the Day Widget available on the Android market to the National Breast Cancer Foundation. We've even added a new background for your widget just for this occasion!

Why the National Breast Cancer Foundation

We reviewed dozens of charitable organizations dedicated to promoting breast cancer research, helping breast cancer survivors, and comforting those fighting with breast cancer today. We considered each organization's rating on Charity Navigator and the NBCF scores on Charity Navigator were remarkable including a maximum score for accountability and transparency, 83.1% of revenue dedicated to program expenses, and a solid plan for growth.

We also felt strongly for the foundation's mission to save lives through early detection by providing education and mammography, particularly to women in need. The NBCF works with almost 100 clinics in all 50 states to provide free mammograms and diagnostic services to underserved women. Each sponsored facility is required to have the capacity to provide continued treatment to women after an abnormality is found or breast cancer is diagnosed.

How You Can Help

Your role is easy. Download the Jane Austen Widget from the Android market, use the "Share" buttons to share your quotes on Twitter and Facebook, encourage your friends to get the app. If you really like it, purchase the Jane Austen Widget Upgrade, the ads will go away and we'll donate the proceeds from your upgrade too.

The program will run for 1 week starting Sunday, February 12th, 2012 and ending Saturday, February 18th, 2012. Download the free application today and help us spread the word about the application and the promotion. The more people who have the free app, the more ad revenue we'll be able to donate. Don't buy the upgrade though until the week of Valentines Day so we can donate your upgrade too.

We hope to make this program a huge success because we're already looking into our next charity (hopefully promoting children's literacy with proceeds from our educational apps for kids). We're excited about this opportunity and with your help we can prove what a big difference a small business can make.

Saturday, November 26, 2011

Mobile Magic Developers Co-founded by Autopilot Founder

Mobile Magic Developers

Autopilot Consulting, LLC founder Patrick Caldwell has joined forces with long time friend and coworker James Brechtel to found Mobile Magic Developers, LLC.

James and I worked together for a few years several years ago and have been close friends ever since. It was an easy decision to get together and start developing mobile applications.

Mobile Magic Developers focuses on developing fun and exciting mobile products like educational mobile applications for kids, amusing home screen widgets, and mobile utilities. Autopilot Consulting focuses on … well consulting.

When your company is ready for your own custom mobile application, come talk to Autopilot about how we can help you wow your customers and outshine your competitors with a mobile application of your own. We'll apply our mobile experience as well as the talents of Mobile Magic to make sure you get the biggest mobile bang for your buck.

Mobile applications come in several varieties. Whether you're interested in native mobile applications or mobile skins for your web applications, we have the experience to get you there, save you money, and help you make the best decisions for your business, your customer, and your future.

Saturday, November 12, 2011

Elon University has #1 MBA Program

Elon University Logo

Elon University's part-time MBA program deserves a lot of credit for the success of Autopilot Consulting. Bloomberg Businessweek recently gave the Martha and Spencer Love School of Business (LSB) much deserved recognition.

In The Best Business Schools of 2011, Elon's MBA program was ranked first among competitors like UCLA, Carnegie Mellon, UC-Berkley, and Rice.

When I was looking for an MBA program to attend, I compared Elon's program with Duke University's and UNC's programs and was blown away by the comparative quality of the LSB program; the experience, friendliness, and helpfulness of the staff and faculty; and the extraordinarily low price tag.

Congratulations to the Elon LSB Faculty, Staff, Students, and Alum on a job well done.

Wednesday, September 21, 2011

Cow Says Moo for Android - Teach Your Kids Farm Animal Sounds

Cow Says Moo Feature Image

James, my partner in Mobile Magic Developers, and I have a handful of Android applications under our belts now. We loved working on Chinese Whispers, an idea my wife gave me for a new twist on The Telephone Game. James wrote an immensely handy application for getting your WiFi Passwords from your phone.

I wrote the Chuck Norris Fact of the Day Widget and the Jane Austen Fact of the Day Widget, and James wrote a really nice widget that shows you your last few installed applications called Latest Apps.

But… Then we Wrote Cow Says Moo

Cow Says Moo is definitely my favorite so far. Many of my friends and family are having babies now and my wife and I have one on the way. I noticed that kids are growing more and more interested in technology and are remarkably capable with it. My niece loved playing with my Motorola Xoom and I loved the way her face lights up when she touches the screen and something happens. That's where we got the idea for Cow Says Moo.

Cow Says Moo is an educational game to teach young kids and toddlers about farm animals and the sounds they make. Each picture is hand illustrated by Emily Upchurch Robinson and when pressed plays farm animal sounds. You can use the front facing camera on your device (or the rear camera if you prefer) to record video and sound while your child interacts with your mobile device or while you simply delight him or her with the sounds. You can use the built in media gallery to share your videos with friends and family. You'll be surprised how much fun you'll have playing Cow Says Moo with your kids and you'll get a lot of cute video footage like I did "User Acceptance Testing", i.e., playing Cow Says Moo with my godson AJ.

Check out Cow Says Moo, and as always, feel free to contact us with any comments or bugs.

Thursday, June 16, 2011

Autopilot Consulting has a Logo!

Autopilot Consulting Logo
At long last, Autopilot Consulting has an official logo! It's exciting to see this dream of mine coming together and now there's a face to the name.

I know it seems slow going. After all, I posted the announcement of Autopilot at the end of May and here we are in the middle of June and I'm just getting my logo together.

Well, it's true. I'm trying to get all of my ducks in a row in my spare time while most of my efforts are still spent trying to do a great job here at the Centers for Disease Control. We're not doing the same mainframe migration project anymore (but I still intend to finish that series someday). We've actually started doing some pretty interesting asp.net projects. I usually prefer mvc.net, but they focus on very rich user experience which is a good experience for a nuts-and-bolts kind of guy like me.

I noticed that not only are my blog posts becoming fewer and further between, they're also pretty non-technical. I promise to spend a little more time writing about the things I'm learning out there in the thick of it (and maybe I'll have a little advice from time to time for those who are thinking about going independent).

Friday, May 27, 2011

The Beginning of Autopilot Consulting, LLC

If you follow my blog, there are a few things I'd imagine you know about me:
  1. I love writing software!
  2. I love feeling like I'm improving the lives of my customers.
  3. I love feeling like I'm doing my job well.
  4. I love flying airplanes.

I Love Writing Software!

This is the very reason I got into the software industry in the first place. I get such a thrill out of a good days work programming. I love the challenge of solving problems as quickly, creatively, and efficiently as possible. A software engineer not only thinks about solving problems, but thinks about thinking about solving problems. Our craft is always changing and growing and it's great to be a part of this community.

Improving the Lives of my Customers

Whether I'm your employee, I'm a contractor for you, or you purchase my commercially available software, my goal is to find some way to improve your life. I've worked in paperless onboarding, business process automation, data warehousing, entertainment, e-commerce, insurance, pharmaceutical research, and academia.

There's one thing I've found in common no matter what kind of software I've been writing. That is that I find the most joy in my work when I can change peoples lives for the better. I like to think that some of the work I have done has bettered the human condition, and I am hopeful that my work will continue to do so.

Doing my Job Well

If I'm not doing my job well, I shouldn't be doing it. If I know I'm not doing a good job, I'm not satisfied with my work. If I'm not satisfied with my work, my customers can't be satisfied with my work. Sometimes you find yourself in a position where you can't meet your full potential. Other times, you don't know what your full potential is.

It is for this reason that I've decided to strike out on my own and form my own software company. I've been developing software for a long time working for various companies. I've decided that starting my company will allow me to touch the lives of more people.

I hope to continue consulting in the software industry while I build my library of commercial products including web based services and mobile applications.

Flying Airplanes

About the same time I got my first job with the word "programmer" in the title, I started flying airplanes. Since then I've flown tailwheel, multi-engine, upside down, through the clouds, and I can't get enough. One thing I've learned is that sometimes an airplane has so much going on, that you just can't do everything by yourself. That's why some planes require 2 pilots.

That's also why a lot of airplanes have autopilots. An autopilot is there to take care of going where you tell it to so you can focus on the important things. That's why Autopilot Consulting is here. We want you to focus on what's important &emdash; your business; we will handle the technology.

Together, we'll grow your business and improve the lives of your customers.

Do more. Work less. Put your business on autopilot.

Wednesday, January 26, 2011

Telephone Game for Android

Chinese Whispers Promo ImageYou may know it as Grapevine, Gossip, or the Telephone Game; we call it Chinese Whispers. No matter what you call it, this is a new take on the classic game and we hope you enjoy playing it as much as we enjoyed making it for you.

You start the game with a short story and pass it to a friend. The next player illustrates the story with our built in finger painting canvas and passes it to the next player who will provide a new caption. Several rounds later, hilarity ensues!

We hope you'll check the Android Market for the free Telephone Game for Android by Mobile Magic Developers.

Tuesday, June 22, 2010

Mainframe Migrations: Tips, Tricks, and How-To's

MainframeYesterday, I wrote a blog post about mainframe migrations. The top brass in my company took a look at it and told me that the world is just not ready for my thoughts on mainframe migrations yet.

I unpublished that post and will republish it at the end of this series. Leading up to my thesis I will post a series of articles detailing the things I've learned leading my last few mainframe migrations.


Be on the lookout for more updates. As I write these posts, each item will become a link to the article.