R.I.P. Papa

Yesterday, December 14th, 2012, my grandfather passed away.  He was 76 years old, and was diagnosed with Leukemia just a few weeks ago.  Earlier this month I received the phone call that I should “probably come home”, and I’m extremely glad I did.  Had I not done so, I would have been unable to see him alive and well one last time.

To me he was not Eugene Dowe.  No, he was Papa.  Growing up I would always visit him and Omi (grandma), and there are a few things I distinctly remember.  Their house was an interesting half-ranch/half-split-level, and walking down the stairs into the lower floor was always walking into somewhat of an adventure.  Stacks upon stacks of magazines and children’s VHS tapes stretched on for as far as my little eyes could see.  In the corner of the room near the fireplace was a tiny little elephant sculpture, completely covered with tiny seashells.  Tom & Jerry, as well was Mighty Mouse and Dumbo, were common films to watch as I would try to find the Funnies section within each stack of newspaper.  The basement always had a distinct smell, and while I realize now that it may have just been the smell of dust and magazines, it became “Papa’s smell”, and any time I catch a whiff of an old stack of paper I’m reminded of all those years watching movies with Omi and Papa.

I also remember eating many meals in their kitchen.  When I was little I would get dropped off for the day, and when I got older I started driving myself over to occasionally have dinner.  Papa was usually reading the newspaper, while Omi cooked up something special.  My favorite was spaetzle, though I can’t be too sure if it was Papa’s favorite as he had a stoic face on most of the time.  Above the kitchen sink is a window with one of those semi-transparent stick-on decorations of a mother duck and her ducklings.  Whoever put it on sort of messed it up in the process, and one of the baby ducks is folded completely over the mother duck, creating the illusion that there is a full grown baby duck sitting inside of the mama duck.

Anyone who knew Papa knew he was a collector.  “A collector of what?”, you may ask.  The collector of everything of course!  If he found something that he thought may be of use for someone he knew, he would load it into his truck and drop it off the next time he was at your house.  Board games, books, tshirts, CDs, or even a half working blow drier.  I remember somewhat recently when he brought me a shopping bag full of CDs, and I realized that I didn’t even own a CD player anymore.  I spent a majority of that day importing those CDs into iTunes, but I still have the bag full of CDs sitting in a closet at home.  He always wanted to give things to others, hoping he could find that special something they were missing, or give them a gift they were not expecting.

Every time someone passes, I seem to have one final memory of them burned into my head.  For me, it was just as I was walking out the door to visit a friend, and I was wearing this ridiculous snow cap that looked like a frog with eyeballs on top.  My mom asked Papa, “Dad, what do you think of Joe’s hat?”  He turned, looked confused for a second, and then smiled and laughed.  I will never forget that memory, as he didn’t smile too often.  I’m forever grateful that I was able to get him to smile at least one more time.

Papa wasn’t a man of many words, in fact I don’t recall any profound discussions he and I ever held.  What I do remember is him always asking me how my day was going.  It was the same question, every time without fail.  “What do you know, Joe?”  I think he got a kick out of the fact that it rhymed, and I have to say I always chuckled a little bit when he would ask.  I would always reply with, “Not too much, just going through school/life/work”, and then try to describe a bit of my day.  I always had to make sure to yell a little bit, as his years working for the telephone company had started to make him go deft in his right ear, and his stubbornness kept him from getting a hearing aid for years.  The question became harder and harder to answer as time went on.  Over the years I became more and more involved in computers, going from just a simple computer geek to a full programmer in the span of a few years.  What do I know?  I knew tons of things, but how would I even begin to describe volatile random access memory, or how to increase your front side bus speed?  We both knew I wouldn’t be able to explain most of the things I was involved with on a day to day basis, but he always took the time to ask.  He was my grandfather.  He still cared, and made sure to show that he cared about my day.  Every time he asked I had his full attention, as if I were the only thing that mattered in that moment.  He gave me his full attention and accepted any answer I gave him without judgment.  He was one of the best listeners I have ever known, even if you did need to chirp up so he could actually hear you.

I pray going forward that I can show that same kind of love for my family members and friends.  That I can take a moment out of my day, drop everything I’m doing, and just ask

“What do you know, Joe?”

Building an Android

Before I even get into talking about Android development, I should state that I’m primarily an iOS developer, and because of that am more accustomed to iOS development styles.

I’ve been developing Android apps for a while now, and one thing that I’ve always disliked is Eclipse.  It’s the recommended IDE from Google, so when I first started developing it seemed like an easy choice.  Since then I’ve realized that it is bloated, slow, and the exact opposite of what I’m looking for in an IDE.  For a while I just put up with it, thinking I was as locked in with Eclipse for Android as I was with Xcode for iOS (which turns out to not be as true as I once thought it was).  Then I stumbled across a beautiful thing…….

IntelliJ

My new love affair

At first I was worried, there didn’t seem to be a large amount of Android tutorials using IntelliJ, but I heard good things from Mackenzie Powers and figured I should give it a try.  The thing I had the hardest time with was figuring out how to important 3rd party Android libraries.  Eclipse was easy enough, dropping any libraries I needed into {PROJECT_ROOT}/libs.  IntelliJ required a little more setup configuring each library as a module, and then setting each module as a dependency for my application.

But there was another problem, this module/dependency layout doesn’t seem to compile the same was as Eclipse does.  My existing project that compiled file with Eclipse was giving me all sorts of errors with IntelliJ.  Errors were being thrown around saying I had already compiled the Android-support-v4  library.

Oh noes! Errors!

Weird, why was it trying to compile in the support library a second time??  It took me far too long to discover the problem.  After trying to configure a bunch of settings I gave up and tried deleting the library from my project.

Safe Deleting support-v4

I was then presenting with this error:

I can’t let you do that, Joe.

So that was it! My other 3rd party library was using Android-support-v13, which apparently includes v4 automatically.  The way to get around this in IntelliJ is to just have each module require the same .jar library as a dependency, and then it is smart enough to know to not include the same library twice.  Switching both modules to v13 fixed the issue and I was free to Eclipse!  After resolving all my IDE issues, I only have one other problem…

The Simulator

Hanging between screens

I don’t have any physical Android devices, nor do I really care to own any.  Problem is, the Android simulator SUCKS.  It’s terribly slow, and my mom’s Windows XP Pentium D outperforms this thing by a mile.  For months I dealt with the slowness and just accepted it.  But then I found a 2nd tool that would bring speed to the table: VirtualBox.  I found a guide that walked me through setting up an x86 version of Android and configure it’s network interface to be bridged with mine.

Prepped a VM for Android
The interface NEEDS to be bridged or it doesn’t work

Setting a few screen resolutions available to the VM and restarting left me with an extremely fast Android OS.

I named it 4.0 and installed 2.3 :

The only thing more difficult with this is that is doesn’t automatically connect with ADB.  You can manually connect it by running

./adb connect 192.168.56.101

I consider this mild tradeoff completely worth it, as the speed and benefits far outweigh the costs.  Hopefully others won’t feel stuck with Eclipse and the simulator and can move forward with some tools that are a little more snappy.

Designing for Mobile – Cross Platform and How to do it Right

The past two days I’ve attended MobCon2012, and it’s definitely helped me understand some more things in the mobile realm.  Overall it was a great conference, and I learned a lot while I was there.

A prominent theme that persisted across multiple talks and discussions was cross platform development.  Today development firms have a multitude of cross platform development tools that allow them to write the code once and compile apps for iOS, Android, Windows Mobile, etc.  One that I knew of previously was Appcelerator, and I was introduced to iFactr while at the conference.  Everyone (including the makers of iFactr) agreed that these technologies were best suited for business driven applications where success is not dependent on a rich UI/UX experience.

Many people might ask “why?”  If you’re going to have two native apps, why the need for two different designs when it’s the same application?  The heart of the matter is that Android and iOS have two completely different design paradigms which can be easily briefed by going over their human interface guidelines.  Below I will highlight a few of those subtle but noticeable differences in these platforms, and hope that designers keep these kinds of differences in mind when designing for different mobile platforms.

Searching

At first search fields may seem simple.  Tap in them, type some text, and click search.  These behaviors and how users interact with them are different on Android than on iOS.

It’s typical for a UISearchBar to be set as the header on a UITableView.  It is easily dismissed while scrolling down, and can be quickly pulled up by tapping the magnifying glass in the alpha scroller (list of characters/icons on the right).  Need to search the list you’re in, just scroll up!

Search on Android is a little different.  First there is the matter of accessing it.  Search Dialogs are not shown by default in the UI.  They are brought up on the screen via the use of a hardware or persistent software search button (though with device fragmentation it’s also possible your users will have NO search button).  Next, they are not usually in a scrollable portion of the screen, they become a part of the ActivityBar at the top of the screen, with results shown below.  Finally, it is common for the search itself to be more global.  Where iOS returns results for the view you are on, Android searching often returns results from within any potential part of your application.

Tab Navigation

This is pretty simple, but often overlooked.  iOS has separate UI elements for navigation bars and tab bars.

Android typically merges tabs and navigation bars

Navigation Stack

The mobile terms for the navigation stack are push and pop for adding and removing views respectively.  Selecting elements/buttons are commonly used for pushing views.  The difference lies in how each OS pops back.

iOS shows a back button in the top left of the navigation bar, labeled with the title of the previous view controller.  Android has…. well…. nothing.  They don’t show a back button, they don’t show the title of previous activities.  Apps (should) just pop an activity off the stack each time the hardware/software back button is pressed.

Two exceptional talks at MobCon that discussed these differences (on a higher leve) were done by Mike Bollinger, and Andrew & Jon from the Nerdery.  Mike’s slides can be viewed here, and I’m still waiting for the Nerdery slides to go up.

I hope designers start to take note that mobile apps can be designed similar but different across multiple platforms.  Doing so will bring richer and fuller user experiences to mobile users, and will be beneficial to your applications in the long run.

Threading in iOS

Threading in applications is important, even more so when your main thread is in charge of doing all of your UI updates.  One common area to experience weak iOS code is in an UITableView that loads content from a remote source.  This post will go over a short sample app that displays a list of the five generations of Camaros, with a picture from each generation.

Now available in the App Store for $4.99!

First, let’s take a look at an example of using no threading whatsoever to load UIImages from a URL.

cell.imageView.image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]]];

Since tableView:cellForRowAtIndexPath: is called on the main thread, doing this sort of image load will completely lock up our app until all of the images have been loaded.  iOS only loads UITableViewCells in view though, so our problem gets much worse once we start scrolling.

[kml_flashembed publishmethod="static" fversion="8.0.0" movie="http://blog.pintozzi.com/wp-content/uploads/2012/11/no_threading.swf" width="480" height="873" targetclass="flashmovie"]

Get Adobe Flash player

[/kml_flashembed]

The video is recorded smoothly, it’s the application that causes the jagged scrolling as each image loads for every cell brought into view.

Until recently I always backgrounded tasks with [NSThread detachNewThreadSelector:ToTarget:withObject:].  While this isn’t necessarily a bad solution, it gets really hairy when you start trying to pass multiple arguments.  To background load those images we could use something like this:

NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:urlString, @"urlString", cell, @"cell", nil];
[NSThread detachNewThreadSelector:@selector(loadImage:) toTarget:self withObject:params];
cell.textLabel.text = name;

And then defining the loadImage: method

-(void)loadImage:(NSDictionary*)params{
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[params objectForKey:@"urlString"]]];
    UITableViewCell *cell = [params objectForKey:@"cell"];
    [cell.imageView performSelectorOnMainThread:@selector(setImage:) withObject:[UIImage imageWithData:data] waitUntilDone:NO];
    [cell setNeedsLayout];
}

The result is definitely smoother.

[kml_flashembed publishmethod="static" fversion="8.0.0" movie="http://blog.pintozzi.com/wp-content/uploads/2012/11/detachThread.swf" width="480" height="873" targetclass="flashmovie"]

Get Adobe Flash player

[/kml_flashembed]

Still, the code is somewhat convoluted, and if we start trying to do multiple things in the background it will become very messy very fast. Enter our savior, Grand Central Dispatch.

All aboard the ^()block train!

With the release of iOS 4 us developers have had the wondrous tool that is GCD.  Sadly, I have not realized it’s full potential until iOS 6.  The same background threading can be achieved with much cleaner code.

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
    dispatch_async(queue, ^{
    NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:urlString]];
    dispatch_sync(dispatch_get_main_queue(), ^{
        UIImage *image = [[UIImage alloc] initWithData:imageData];
        [[cell imageView] setImage:image];
        [cell setNeedsLayout];
    });
});

It looks scary because some of it follows closer to a C syntax than Obj-C, but if you read it line by line it’s quite simple.  dispatch_get_global_queue() fetches us a queue that we can dispatch tasks (blocks) onto.  Creating an async call with an execution block allows us to perform code without worrying about blocking the UI.  From there we fetch the image data and then dispatch another call on the main thread/queue (retrieved with dispatch_get_main_queue()).  Within that block we can update the UI and let the cell know it needs to layout.  The best part about this method is that variable pointers are usable in each block.  We don’t need to worry about messy pointing passing, instead we can just reference each object with ease.

I’ve only recently started using Grand Central Dispatch, but it’s already helped me refactor my code to be cleaner and faster.  I’m sure I’ll be using it more heavily as time goes on and I become more comfortable with dispatch queues.

Urban Eatery with a side of Scattered

Erin and I really like to go out and eat, and the Twin Cities have more than plenty of fun places to choose from. It’s nice to have a list of fun places to go, so I’ll be tagging posts with fun places to eat as “TCeats”.

This weekend we had the opportunity to stop by Urban Eatery. I wasn’t expecting much from the name, but was pleasantly surprised by the free valet parking as we arrived. The interior decor was quite fancy, but it still had a sense of fun with chalkboard walls and specials hand written on them. The meal itself was delicious, and most certainly not overpriced. The only thing disappointing was the dessert. I had the hot apple crisp with ice cream, and while it wasn’t bad, it just wasn’t I consider worth getting.

Scattered is simply how my brain feels. Over the past 4 days I’ve been pitched 3 app ideas. I think they all sound cool, but I’ll definitely need to work on focusing on each idea. Two client projects are coming to an end, so that will definitely free up time. Tonight I go to bed with the giant giraffe pillow pet I bought Erin. He’s big and fluffy, and hopefully provides a good night sleep.

20121104-230854.jpg

Saving $50 with a 5 minute phone call

Humans are fallibile.  Programmers are human.  Programmers write automated systems.  So, automated systems are fallibile, and that proved itself this past month when I terminated my two year contract with AT&T.  I left them for Verizon, who provides better coverage and speed where I live, and I knew I would have to pay an early termination fee.

Doing my research in advance, I discovered that their fee was $325 minus $10 per month of your contract that you had completed.  Previously I was on a family plan with my mom and sisters, and one of them had used my “upgrade” to get a replacement iPhone 4S back in December.  At the end of May I migrated my contract off of the family plan and created a new individual account for myself.  A few weeks later I got my final bill for AT&T, but it said my termination fee was $295!!  Far more than three months had passed since December 2011, but apparently they recognized my account as being only “created” at the end of May, so when I cancelled my account in September only three full months had passed.  Needless to say I was a little disappointed.

While on my lunch break today I made a quick phone call to AT&T’s customer support line.  I explained my situation, and verified my existing account info, as well as the information of the account I previously belonged to.  After being on hold for about 60 seconds I was told, “We’re sorry Mr. Pintozzi, your final bill has been adjusted and you now only owe $245.”  Just like that I was able to save $50!

I’ve run into this a few times, if you ever feel like you’re being charged too much, just ask.  Worst case scenario you waste a few minutes, but it can really save you a good amount of money!

Define: Shower Curtain

If I’ve learned anything from moving in with Erin, it’s that communication is key.  It is especially important when it comes to dealings with money, as we don’t have joint accounts but we do split the cost of bills and food.  As we have vastly different interests, our “play money” is spent in vastly different ways.  Something that’s helped immensely in understanding each other is coming up with our own definitions of a few already defined words.  One of those such words (well I guess technically two words) is: “shower curtain”.

The one thing that was hardest to wrap our heads around was the fluff, the extra stuff, the unnecessary.  Even before we moved in together, when out shopping we would occasionally ask each other, “why are you buying that?”.  Answers of, “because I like it” were always greeted with a “but why?”  Never able to formulate an answer that made much sense, I finally settled on, “You know how you have that second shower curtain on the outside of the shower?  It does’t actually do anything, all of the water is held back by the white plain one on the inside, but you like the look of the fancier one on the outside, so even though it’s technically unnecessary, you bought it.”  And with that it all seemed to make sense.  “Why are you putting new brake lights on your motorcycle?”  Shower curtain.  “Why did you pay more Anniversary package on your car?”  Shower curtain.  With those two little words I was able to convey my thoughts more clearly than had I used twenty.

The infamous shower curtain

There are other -isms and words we use, though none are quite as efficient as “shower curtain”.

Engineers Don’t Have Deadlines

“Engineers don’t have deadlines”, or so I overheard this morning while waiting for my breakfast bagel next door to the GoKart Labs office.  There was a small group of young adults, probably college students in their final year, standing around and talking while they waited for their coffee.  Not having much else to do while I waited for my morning treat I couldn’t help but overhear the inaccuracies of what they thought an engineer (and from the sounds of it, a software engineer) does for a job.

“Yea man, all engineers code in C, because that’s what apps are written in these days.”

I’ll say it’s close in that a good amount of desktop applications are written in C, but it’s far from “all engineers”.  iOS apps are written in Objective-C, which IS a superset of C (making it fully compatible with straight C code), but Android and Blackberry apps are both written in Java.  Web apps are written in a myriad of languages including Ruby, Python, and PHP.  Database engineers might spend days at a time simply writing SQL queries.

“If you work as a scientist or engineer, it’s great because you never have deadlines.”

…..what?  Are you crazy?  Maybe you’ve confused “research assistant” with “engineer”, but even then you still have some form of deadlines to adhere to.  App developers have tons of deadlines, whether they be self-imposed or demanded by a client, coding needs to get done by certain dates.  True, I have a number of projects that have no deadline assigned to them, but those are the projects that aren’t making me money right now.  If someone is paying you to work on a project for them, there will most definitely be a deadline.  We don’t just sit around our computers just working at whatever pace we desire.  Well, maybe when it’s a weekend project…

“You’ll get paid tons of money to just work in a factory programming machines!”

Yea, you might, but not everyone does.  Some people do get paid great amounts to code manufacturing machinery, while others don’t, and location is a surprisingly large contributor to that.  Also, generalizing that engineers get paid a lot of money is like saying all lawyers get paid a ton of money.  As with any field, not everyone succeeds.  Personally I enjoy heading over to Salary.com to see what other people in my industry are worth, and seeing how I compare.  I’ve fallen in the bottom 10% before, and I’ve been in the top 25%, because like economics tells us, your pay will correlate to supply and demand.  If there is a greater demand for your skill, and the supply is low, you can demand more for your salary.  That applies to all jobs though, and not just engineering.

I think some people fail to grasp how HARD programming is.  I’ve had a few non-tech friends tell me they want to program a video game, yet they have no prior experience in programming of any kind.  Now I don’t mean to discourage those individuals (shoot for your dreams!!), but many of them really underestimate how complex computers really are. Everything in a computer breaks down to 1′s and 0′s.  For example, in order for your monitor to display a single red pixel, your videocard must send it the color red.  In “computer talk” (binary), that is 11000100 00100010 00010110.  That’s just to display a single dot of color on your screen.  Yes, most code libraries will handle this sort of action for you, I only bring it up to point out that there is a lot more to programming than just sitting at a keyboard and typing out something you think will work.  Just take a look at the following bit of code:

Does that look complex?  To me, not really, but I wrote it, so it all makes sense.  And all that does is merge two arrays of calendar events.  Programming things like games involves thousands upon thousands of lines of code and require much more physics calculations (yay math!).

Still, I love my job.  I love being a software engineer, and it’s nothing I would ever want to change.  Yes I have deadlines, but sometimes I find that a little pressure forces me to get creative with my code, and in turn produces some very interesting results.  I love the environment I work in, the technologies I get to work with, and the people I get to work alongside.

If you’re a software engineer/programmer/developer in the Twin Cities area (or are willing to relocate) and looking for a job, check out the positions we have open here at GoKart.  We’re always looking for talented individuals!

Old Habits Die Hard

I’m no John McClane…

With all of the painting I’ve been doing recently, I’ve been reminded of the habits and things I’ve learned from past jobs.  Every summer after high school  I worked as a painter’s apprentice for my dad.  Some people thought it was easy for me to have a job working for my father, but they couldn’t have been further from the truth.  I was essentially the everyone’s bitch.  Since almost no one had seen me interact with my father, they didn’t know I was related to anyone else in the company, and I was treated the same as any new employee.  Don’t get me wrong, I wasn’t treated poorly, I was just giving the hard “new guy” tasks.  For that though, I am appreciative.  I have never worked a more physically demanding job, and I don’t think I’ll ever be able to complain about the luxury of sitting at a desk job.  I learned plenty of useful skills during those summers though, how to paint, tape (mud), clean up work areas, and many other things I will never forget.

That was certainly not the only job I picked up habits from though.  Working as a bank teller really changed the way I viewed money, and even handled it.  Money in my wallet is always sorted from smallest to largest denomination, and all of the bills are facing the same direction.  From working at the Centegra Hospital I learned the proper amount of time to wash your hands is 14 seconds, which is the amount of time it takes to sign Happy Birthday twice.  Working at The Dogg Haus taught me plenty about dealing with drunk college students (most of whom were my friends), as well as how sometimes you need to do the work available, instead of waiting around for your “dream job”.

I’ve made many friends throughout the different places I’ve worked, and I’m happy to have had the opportunity to meet all of them.  While some of my former jobs may not be relatable to the skill set I show off on my resume, each one has shaped me into the man I am today and been a stepping stone on the path that is my life.

iPad Mini, or iPod Jumbo??

Yet another iDevice has been unleashed upon us.  This time it’s the iPad Mini.  A few people joke that it’s just a large iPod, but that’s hardly true, atleast from a development standpoint.  While it has no retina display, the 7.9″ screen packs the same number of pixels as the iPad 2 (1024×768).

Courtesy of www.apple.com

What does this mean for developers?  Pretty much nothing.  UISplitViewControllers are still used for Master/Detail style views, and there won’t be any changes to the SDK.  One thing designers will definitely have to keep in mind though, is that everything is smaller.  Yes that button you designed will remain 90 x 44 pixels, but with a smaller screen that target will be physically smaller for your end user.  If your users had a hard time with small controls before, get ready for them to fail miserably when those controls are an additional 21% smaller!

It’s an interesting move by Apple.  Steve Jobs seemed to scoff at the idea of a 7″ tablet, but with the recent success of sub-10″ tablets being manufactured by other companies Apple may not have a choice.  I think it will be interesting to see the Mini play out.  It’s been a while since Apple has had a product flop (think Newton), and with the iPad’s overall success I doubt it will do poorly.

I look forward to working on some slightly smaller iPad experiences to add to the GoKart Labs portfolio!