Nick Harris

School of Visual Communication

leave a comment »

The debate about whether a software engineer should go to college seems to come up from time to time. Some of the best developers I know didn’t graduate from college as well as some of the worst. To me its really just a personal choice. But if you have the means and the drive to get the most out of a college experience, my advice would be to take it. You’ll be surrounded by thousands of people who are all there to teach and learn. That can produce some pretty unique opportunities that can have a major impact on your career later on.

At Ohio University I had one of those opportunities. Being a fulltime student while finding meaningful work that can kick start your career can be a challenge. With that in mind, the university setup a program where students could apply for on-campus internships. You had to interview in order to get hired for any position, so you would have a few real world interviews under your belt. If you found a good job you could pick up some great professional experience while also broadening your skills and talents.

My senior year (1999-2000) I applied and got a job building and maintaining the website for the School of Visual Communication. I spent most of my days in the Mathematics and Engineering buildings working on Sun/Unix workstations writing code. This job meant that I got to spend a least a couple hours a day in a school that (straight from their current website):

“…offers an interdisciplinary visual communication degree with four specialized sequences: informational graphics and publication design, interactive design; documentary photojournalism for newspapers, magazines and the Internet; and commercial photography.”

The work was great. I was able to create a JavaScript slideshow for the homepage showcasing student projects throughout the year. I also had to learn how to do all of it on a Mac, which at the time were Power Mac G4’s.

After a few months I had become friends with the administrators and professors. They liked me enough that they allowed me to audit any class I wanted. I took them up and sat through an entire quarter learning how to use Photoshop and other tools to design and create web sites. It was fantastic to learn along side people who were creating the layouts, color schemes and graphics that I would then put together with my code to build cool webpages (as cool as webpages could be in 2000).

I look back on that experience as the time I discovered the importance of design in technology. Its also the first time I realized that as much as I love Photoshop, I suck at it compared to professional designers.

I’m thankful I had that opportunity. I wouldn’t have had it if I hadn’t gone to college, and I don’t think I would be the software engineer I am today without it.

Written by Nick Harris

January 5, 2015 at 2:41 am

Posted in Uncategorized

Experimenting – Node.js and MySQL

leave a comment »

I’ve been playing around with a prototype web service idea using Node.js and MySQL. I wanted to learn a new server side stack and decided on Node.js. Way back in 2003 I wrote a web service API that used classic ASP pages embedded with JavaScript/XMLHTTP to route traffic between a Java Applet UI and a backend that controlled a farm of teleconferencing bridges. I wanted to see how far JavaScript had come.

JavaScript has a lot of flaws. I’ve spent more time moving around JavaScript alerts to debug code then I would like to admit. When I had the opportunity to move to C# and .Net in 2005 I swore I would never write JavaScript again.

Working with Node has been different though and npm is the biggest reason. Third party code dependency is a balancing act. Typically I avoid them, opting to use them as examples instead of forcing a peg into a square. But the idea of this was to get a prototype up with the least amount of effort, so I gave npm a shot and grabbed two frameworks…

I was up and running with my Express server in under 10 minutes. I would have expected much more effort.

My alpha prototype just needed a SQL backend. I’ve done enough with SQLite on mobile devices so I used it for my first go.

My initial prototype surprised me. I had network calls flowing from the iOS simulator to my Node layer and down into SQL in about a days work. A great proof of concept, but the amount of SQL written in quotes within my JavaScript code was setting red flags on fire for me.


Once I downloaded MySQL Workbench, it was an easy decision to build on MySQL instead of SQLite.

I love stored procedures. Mixing SQL statements into other language code files has always made me cringe. Let the separation of layers work for you.

SQL is so powerful and database engines like SQLServer and MySQL use of Store Procedures allow you to encapsulate the syntax to exploit that power away from your C based algorithmic code.


I’m definitely moving forward with this stack for a production version of this prototype. Node.js is incredibly lightweight. I have 372 lines of my own JavaScript code which in turn uses 10 stored procedures to support 3 web service endpoints that can handle whatever pseudo traffic I’ve been able to throw at it.

I’m sure I’ll hit pitfalls, but this feels like a pretty solid technology stack.

Written by Nick Harris

November 20, 2014 at 4:35 am

Posted in Uncategorized

Apple Quality

with 2 comments

Yesterday was my first full day of work with Yosemite. One of the first things I noticed was the plethora of notifications. I was getting notifications for every message on Skype as well as every incoming email with Gmail running in Safari. Being a savvy user I went to Notification Center in the Settings app and made the changes I wanted.

Today was my second full day of work with Yosemite. One of the first things I noticed was the plethora of notifications. I was getting notifications for every message on Skype as well as every incoming email with Gmail running in Safari.


I went back to Settings and made my changes again. I also made a note to make sure I wasn’t crazy at the end of the day.

This evening I logged out of my work account, then logged back in. All of my Notification Settings were back to their defaults.

Its hard for me to articulate in writing just how flabbergasted I am at this bug.

Saving user preferences is beginner stuff. How a bug like that could make it past any type of real world testing is beyond me. Add this to the growing examples of other “how did this make it into the wild” bugs – like iOS 8.0.1 – and I’m left seriously questioning Apple.

One of the biggest draws for me to make the jump from Windows to Mac was the simplicity and genuine quality of Apple products. Though the developer tools were downright terrible compared to .Net development, I trusted the OS and its frameworks to be superior to Windows and all of its flaws. But over the last two years, my trust in Apple has taken a serious hit.

I hold out hope that these problems are transient. But the more they pile on, the more I think that there’s a much bigger issue.

Written by Nick Harris

October 23, 2014 at 3:00 am

Posted in Uncategorized


leave a comment »

A tweet from Onyx Mueller caught my attention this afternoon. I thought I had spotted a TI-85. It turned out to be a TI-83 Plus (which took me a while to get the joke) but it reminded me of my old TI-85 and TI-92.

College was a challenge for me. Math is not my strong suit and I had to get through 4 courses of calculus. Luckily I found classes that allowed you to use a TI-85 or TI-92 (this was 1997). If you could program your calculator to solve the equations, you passed. I passed… then wrote a bunch of other programs on my TI-92 that summer.

I suppose I should count them as the first mobile computing devices I programmed for.

I found my TI-85 and TI-92 in excellent condition this afternoon:

IMG 9193

and for fun, here’s a photo taken with my iPhone 5 of my iPhone 4, iPhone 6, TI-85 and TI-92:

IMG 8932

Written by Nick Harris

October 16, 2014 at 4:41 am

Posted in Uncategorized

Differentiating on Privacy

leave a comment »

When Apple announced their new privacy policy site and the fact that data on iOS 8 devices will no longer be accessible to police even with a warrant, the first thing I did was share the link with some of my former Glassboard teammates (on our shared Glassboard of course). I was pretty excited, and a little bit astounded by the move. It’s a bold statement that I believe only a company with Apple’s clout can successfully make.

Glassboard was created with privacy as its core principle. Our respect for our users meant that every piece of Glassboard – from cloud storage and API design all the way down to other users being able to see the email address you signed up with (they cannot) – was designed and implemented with privacy foremost in the decisions.

When we put our first privacy policy together we even had a discussion about the part allowing law enforcement access with a lawful warrant. I can’t speak to the why the final decision was made to include it, but I don’t believe we could have left it out or say out right that we would not honor a warrant without running into costly legal issues.

Apple’s decision to make it impossible to decrypt data on the device without the users password is the real reason they can say no to warrants. This was another idea we had tossed around. It would have been a paid feature where the board would be encrypted from end to end with only the chairperson having the keys. I had a plan for this and pushed it but didn’t win over the team on getting it built.

But what really made me happy about the announcement was that Apple validated our belief that privacy is a major differentiator in today’s world. We knew Glassboard was ahead of the curve, and I’m very hopeful that more companies and software developers will use privacy to set themselves apart from their competitors. My privacy is important to me, and I’ll gladly support those who make it important to them.

Written by Nick Harris

September 19, 2014 at 3:14 am

Posted in Uncategorized

NetNewsWire – Time to Breakup

with 3 comments

When I started at NewsGator there was one client side RSS feed reader in house called NewsGator “Outlook Edition”. My job was to take over development of it as the company moved to a backend sync system that kept everything you read in sync. It was 2005 and I was just learning about blogs and this new medium of RSS. Reading blog posts in NewsGator “Outlook Edition” or on the NewsGator “Web Edition” and having their read states sync was cutting edge to me. Writing the very first app to sync with the new backend platform was an incredible challenge.

My second week at NewsGator I went to lunch with Greg Reinacker, Lane Mohler and Nick Bradbury. Nick, of course, had written FeedDemon which I had never heard of at the time. I had spent a year at my old job using TopStyle so I did know his name. It was the first time I met someone who single handily wrote software I used. It was cool, though I didn’t make much of it. We all just wrote software.

Further down my timeline at NewsGator, we had a guest in the office. My co-worker Gordon Weakliem recognized him as Brent Simmons, the creator of NetNewsWire. I knew that NewsGator was actively pushing the new sync platform to current RSS reader developers. I’m not sure if it was before or after that day when Gordon and I were in Redmond, WA with Gordon trying to pitch Dare Obasanjo (RSS Bandit creator) on it, but I was there and knew the pitch.

I believe it was about 1 month for NickB to join, then 5-6 months after I had started that Brent actually came onboard. I was part of the new team of RSS client devs – Nick, Nick and Brent. Affectionately called “The Nicks” for sometime since no one at NewsGator had a Mac nor really cared about Mac development.

I was completely concentrated on RSS for Outlook, but NickB, Brent and myself often tossed ideas off of each other for improving user experience. It was around this time that I wrote a series of blog posts about user experience and how I had improved NewsGator Inbox (its new name by then) based on all the wonderful discussions NickB, Brent and I had and code I had actually shipped. Unfortunately that was on a company blog that has since been retired.

As NewsGator pivoted to a more Enterprise focus it was decided to shutdown the RSS sync system. The backend of polling RSS feeds and delivering data was still going well, but the market for RSS client apps was coming to a close. With the release of native support for RSS in Outlook it was decided to shutter NewsGator Inbox while transitioning NetNewsWire and FeedDemon to a Google Reader backend. In addition, I was moved to the NewsGator platform team. It made sense. I was already informally in charge of the the API at that point so formally making the switch was a natural transition.

Around this time I had also taken it apon myself to learn how to write apps for iOS. I believe Pocket Euchre (my first iOS app) had been out for a bit and was doing rather well. With the release of the iPad coming up fast, I was invited by Brent to help with NetNewsWire iPad. It was an amazing experience. I worked on all the cool animations and UX that Brad Ellis designed while Brent worked on stability. It launched on day one. A very proud achievement of mine that I never talk about.

This also marked the time when I moved from Windows to Mac fulltime. NewsGator recognized my iOS skills and put me to work building the first mobile apps for Social Sites. Later on I was invited to be part of Sepia Labs using both my platform skills and iOS skills to build Glassboard.

All that time I continued to use NetNewsWire. Even with the demise of Google Reader, and its purchase by Black Pixel, I’m still using NetNewsWire as my desktop reader. But that time has unfortunately come to an end.

I need read state sync and a multiple device experience. I want to be able to click links to blog posts I see on twitter and have them marked read in my RSS app. Really I want to spend less time dealing with read state – something I was spoiled with at NewsGator.

Its not easy. Its an incredibly difficult problem to solve. But it is solvable. The problem is if the solution is profitable. I love Black Pixel and have many dear friends that work there, but its not their bread and butter. A problem like this needs focus and daily attention.

As Brent stated recently, blogs are incredibly important and will outlive any social network. I completely agree.

So I’m looking for suggestions.

Where can I spend some time/money either literally helping someone write code or just supporting efforts that do this well? I wish I had the solution, but after 7+ years working on the problem I came up short.

Written by Nick Harris

September 2, 2014 at 3:54 am

Posted in Uncategorized

UICollectionViewCell Flip and Move

with one comment

In my previous post I asked how to both flip and move a UIView. My co-worker Jason Hanson found that adding a “container” view and moving that while flipping the child view worked great. So the example code now looks like this:





                   self.containerView.frame = CGRectOffset(self.containerView.frame, 0, –250);

                   self.flipView.backgroundColor = [UIColor redColor];

               } completion:^(BOOL finished) {

                   self.isFlipViewUp = NO;



With that solved, I could move on to implementing the bigger picture effect I was working on – flipping a UICollectionViewCell, centering it in the window with a modal type background, then flipping it back.

I love this effect, and I’m proud of my code. But I’m wondering if there is a better way to do it.

To demonstrate I created a little sample project that flips a playing card:


The initial flip needs to:

1. Flip the card from its back to its face
2. Add a gray overlay to the rest of the visible screen
3. Center the card on the screen

Here’s the code:

– (void)flipCard


    // grap the screen size and create a view with the same frame

    // set its background to clear so it can be animated

    UIWindow *mainWindow = [[[UIApplicationsharedApplication] delegate] window];

    self.modalView = [[UIView alloc] initWithFrame:mainWindow.frame];

    self.modalView.backgroundColor = [UIColorclearColor];

    [mainWindow addSubview:self.modalView];


    // remove the tapToPresentCardGesture

    // then add the tapToHideCardGesture both to the cell and the modal view

    [self.contentView removeGestureRecognizer:self.tapToPresentCardGesture];

    [self.contentView addGestureRecognizer:self.tapToHideCardGesture];

    [self.modalView addGestureRecognizer:self.tapToHideCardGesture];


    // translate the frame of the cell to the main window

    self.originalFrame = self.frame;

    CGPoint translatedOrigin = [self convertPoint:self.bounds.origin toView:self.modalView];

    self.translatedFrame = CGRectMake(translatedOrigin.x, translatedOrigin.y, self.frame.size.width, self.frame.size.height);

    self.frame = self.translatedFrame;


    // add the cell to the modalView

    [self.modalView addSubview:self];


    // flip the contentView while repositioning the actual cell view







                        // animate the backgroundColor of the modalView to a semi-transparent black

                        self.modalView.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.75];


                        // move the cell to the center of the screen



                        // change the imageView to the card image

                        [self.cardImageView setImage:[UIImage imageNamed:@”AC”]];


                    } completion:nil];



When it flips back it needs to:

1. Flip the card from its face to its back
2. Remove the gray overlay
3. Replace the card back into the UICollectionView

Here’s that code:

– (void)hideCard


    // flip the contentView back from right to left







                        // animate the backgroundColor of the modalView to clear

                        self.modalView.backgroundColor = [UIColor clearColor];


                        // animate the cell back to its original spot

                        self.frame = self.translatedFrame;


                        // set its image back to “Back”

                        [self.cardImageView setImage:[UIImage imageNamed:@”Back”]];


                    } completion:^(BOOL finished) {


                        // remove the modalView along with its tapGesture and set it to nil

                        [self.modalView removeFromSuperview];

                        [self.modalView removeGestureRecognizer:self.tapToHideCardGesture];

                        self.modalView = nil;


                        // reset the tap on the contentView to show the card

                        [self.contentView removeGestureRecognizer:self.tapToHideCardGesture];

                        [self.contentView addGestureRecognizer:self.tapToPresentCardGesture];


                        // tell the delegate that the cell is back

                        [self.delegate cardDidHide];




Notice that it calls a delegate. The delegate is the UICollectionView which simply calls reloadData to get the cell back:

– (void)cardDidHide


    // when the cell comes back it needs to be added back to this view

    // calling reloadData will do this correctly

    [self.collectionView reloadData];



Is this the simplest way of doing this? Could I do this better?

Written by Nick Harris

July 23, 2014 at 4:18 am

Posted in Uncategorized


Get every new post delivered to your Inbox.