Afternoon Apps: Notemark

NoteMarkLogoI had an idea for an app the other day when I was trying to sort through the notes on my iPhone. I realized that I was using a few of the notes really often, while others just seemed to be throwaway. For example, I have a note that is a list of karaoke songs that I want to try and another note that is a list of places to eat.

I thought it would be neat if I could take a note and put it on the home screen as a separate app icon. I’ve done some work with home screen bookmarks before and thought I might be able to get it done with a simple web app.

The result is Notemark lets you type out a note and saves it using HTML5 localStorage APIs. Not only does it use localStorage, but it also uses app caching. This allows Notemark to run even without an Internet connection.

So, in typical Afternoon App fashion, I hacked something together that’s somewhere between a proof of concept and an actual working product. Use it all you can, but just be aware that there are probably some bugs. If you notice something wrong, feel free to open an issue on Github or send me a message, but just be warned that I might not get around to fixing the problem.

I’m not a web developer by trade so the code is messy with plenty of inefficiencies. You can critique my code all you want though!

Posted in Afternoon Apps | Tagged , , , , , | Leave a comment

If Facebook is dying, why can’t I seem to stop using it?

I’ve been reading a lot of articles about how Facebook is dying. I see studies about how engagement is down. I see people talking about how deleting their Facebook was the greatest thing ever.

Then why am I using it more than ever?

This summer I trained for a Tough Mudder race with a group of my friends. For those of you that don’t know, it’s a 10-12 mile obstacle course designed by British special forces. It is true to its name and very difficult. Before the race, we could barely finish a 5k. We definitely couldn’t do a half marathon with obstacles. So, we all needed to train.

We formed a Facebook group to coordinate the training. We had weekly Tough Mudder Boot Camp sessions and planned events like a spaghetti dinner before the race. We posted motivational pictures and teased each other when we missed workouts. We used the social network to be social in real life. After the race, we used it to share pictures of us from that day.

Is there any other tool that could have done all of this? We weren’t going to group message each other on WhatsApp (all of us have unlimited texting anyway). We weren’t going to share goofy training photos on Instagram (we’re the only ones that we want to see it.) I guess we could have figured out some shared calendar thing through a Google calendar.

My point is that we couldn’t have done everything without a lot of friction.

So, while this is just an anecdote, I think it proves that Facebook is more than just a newsfeed. It shows that Facebook is useful for real people and real things. Snapchat might be fun (I use it regularly) but it doesn’t get anything real done. Instagram is a great way to share quick moments, but it’s not a place to catalog your photos.

The Tough Mudder group is just one of many ways that Facebook has become nearly irreplaceable in my life. I’m not saying that nothing can replace it, I just don’t understand all the people saying that something already is.

Posted in Uncategorized | Leave a comment

It’s been a little while, here’s why (hint: got hacked)

So I haven’t written a post in awhile. A big reason is that I’ve been busy having fun since moving to Seattle. Lots of new friends and lots of new things to do. There’s another reason though. My webhost was hacked.

A few months ago, I tried to log in to my WordPress blog to look at my site stats. I was greeted with a PHP error about headers being sent. I kind of thought it was some sort of integration that was causing the issue and I ignored it. I checked again awhile later and still saw the problem. After Googling around a bit, I saw some useful looking posts about what to do with that error.

Basically, the problem was some malformed PHP on the page. I wondered how this could have happened, since I never update any of the WordPress files myself. Then I went to the file that was throwing the error. There was some PHP code inserted that wrote out some wonderful advertising code. I never put it in there. My account must have been hacked somehow. I try to keep my WordPress install up to date to prevent these things from happening so I was a little surprised that it happened.

So I started looking around at other files and noticed that index.html had some shenanigans going on in it. Since this isn’t a part of my WordPress install, it led me to believe that maybe it was my GoDaddy hosting account (yeah, yeah, I know). So I searched found lots of complaints of a GoDaddy WordPress hack in January of this year.

So that’s what happened.


Posted in Uncategorized | Leave a comment

Afternoon Apps: Captionator

A couple weeks ago, a friend of mine showed me the app I’d Cap That. After making some hilarious pictures, and after a few drinks, I made the claim that I could probably clone the app in a couple of hours.

So the other day, that’s what I tried to do. The app is very simple. It takes a randomly generated caption and burns it on to an image. You can pick an image from your camera or your library.

When I wrote the BD’s Mongolian BBQ app, I took stamps and burned them onto an image to create funny mustache pictures. The way I did that was to position UIImageViews inside of a UIView and then render the view to an image. That strategy works fine, but it also drops the image resolution down quite a bit. (It will be whatever the size of the view is)

So this time, I decided to render the text directly onto the image by hand. This involves getting a graphics context, drawing the image into it, then drawing the text into it, and finally getting the resulting UIImage from the graphics context.

My first approach was to use a UILabel to render the text onto the image. That would take care of all the font sizing issues and save some code. This worked great, until I had white text on a light image. There’s a couple ways to solve this problem like putting a stroke around the text or adding a shadow to the text. I’d Cap That uses a shadow. I decided to go for a more meme style look and stroke the text.

Unfortunately, UILabel doesn’t support adding a stroke around the text. So I looked for some classes online that might get the job done. I found a couple, but they didn’t work like I wanted. Luckily, CoreGraphics lets you draw stroked text, you just have to handle more by yourself.

-(UIImage*)getImage:(UIImage*)image withCaption:(NSString*)captionString
   UIGraphicsBeginImageContext([image size]);
   [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];

   CGFloat captionFontSize = 300;
   CGSize captionSize = [captionString sizeWithFont:[UIFont boldSystemFontOfSize:captionFontSize]];

   while( captionSize.width > image.size.width )
      captionFontSize -= 5;
      captionSize = [captionString sizeWithFont:[UIFont boldSystemFontOfSize:captionFontSize]];

   CGRect captionRect = CGRectMake((image.size.width - captionSize.width)/2.0, (image.size.height * .95)-captionSize.height, captionSize.width, captionSize.height);

   CGContextRef context = UIGraphicsGetCurrentContext();
   CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
   CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor);
   CGContextSetLineWidth(context, 3.0f);
   CGContextSetTextDrawingMode(context, kCGTextFillStroke);

   [captionString drawInRect:captionRect withFont:[UIFont boldSystemFontOfSize:captionFontSize]];

   UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();

   return outputImage;

The problem with rendering the text yourself is that you need to size the font yourself. The way I’m doing it is picking a large font size (300 in this case) then measuring it and adjusting the font size until it fits on the image. There’s likely a better way, but this works and is fast enough.

I haven’t decided if I’m gonna release this app or not, like I did with my other Afternoon Apps. I have the source code up on GitHub though, so feel free to take a look and use whatever you want from it.

There’s some issues with it. The camera view doesn’t work quite right. There aren’t any icons. One little feature in there is you can add to the list of captions. Of course the real secret sauce of I’d Cap That isn’t the app, it’s the hilarious captions.

Posted in Afternoon Apps | Tagged , , , | Leave a comment

Your developers use your app more than anyone in the world

“You’re a power user.” “Most people don’t use computers like you do.”

How many times have you heard someone say this? If you’re a developer, probably a lot. I usually heard it when I was giving feedback on the design or UX of an app. It’s easy to dismiss the feedback of a developer. We’re weird people. Lots of us spend our time fighting to use computers like they did in the 1980s. Should that make our feedback any less valuable?


If you want to find the pain points of an app, ask the team developing it. The developers and testers use the app more than any other person on the planet. They know what parts of the app are slow and they know which parts of the app they’re afraid to use because they just don’t know how something will behave.

I’m not trying to say that developers are all UX experts. We’re not. I’m just trying to get people to stop immediately dismissing our feedback and really listen to what we’re saying. I’m also not saying that you shouldn’t get other people to look at your app. A fresh  set of eyes is absolutely crucial to making something usable.

So stop telling us we don’t know what we’re talking about. Stop telling us we’re so different. Listen to us.

If your managers or designers aren’t so enlightened, there are still ways to give good feedback. It’s all about context. Give your feedback from the point of view of your “regular” users. You should try and develop personas for your team. Personas are basically an abstract person that represents the different kinds of users of your app. It’s a GREAT way to have a common language for giving feedback. So instead of saying “I think this would be better because it solves this problem I have” say “Susan the soccer mom would learn this faster if something catered to her needs better.”


Posted in Uncategorized | Tagged , | Leave a comment

Why I’m working for the man and not doing a startup

After finding out I was going to work for Microsoft,  friend of mine asked “Why are you working for the man? Aren’t you into startups?”  My response was mostly “I like getting a paycheck every two weeks” but there’s more to it than that.

Sure, stability is a huge benefit of a regular full time job. I get health insurance, time off, and the pay is pretty good too. That’s not the biggest reason I don’t want to do a startup (right now). The biggest reason is that there isn’t an idea I’m passionate enough about that I’m willing to devote my life to.

I know that if I just join up with someone else’s idea, I’m not going to be passionate enough to deal with all the stupid stuff that startup founders have to deal with. If I founded a company, I could be left dealing with things like payroll, bills, and legal issues. I don’t want to deal with that right now. I want to focus on making cool shit.

But what about all the stupid stuff you have to deal with when you work for the man? That stuff just isn’t that important. If I forget to log my task estimation hours my manager might send me an email. If I forgot to pay my companies electric bill the consequences are a little more severe.

I don’t have to found a company though. I could join up as a developer and have a HUGE impact on the company. That definitely has some appeal and maybe someday that’s what I’ll do. Right now, I’m enjoying working for “the man” and am happy that the software I work on will be used by millions of people.

Posted in Uncategorized | Tagged , | 17 Comments

It’s not a talent shortage, it’s a hiring problem

I just started a new job at Microsoft and the hiring process has been on my mind a lot lately. I read articles on the Internet and hear people talking about how hard it is to find good development talent. They say there are plenty of people looking for jobs, but hardly any worth hiring. I don’t think that’s necessarily true.

I just went through the interview process with a bunch of big software companies in the Seattle area and I only received one job offer. I’m generalizing here, but I think that if I’m qualified to work for Microsoft, I’m probably qualified to work just about anywhere. For all but 2 companies, I didn’t make it past the phone screens. (Edit: What I’m doing here is making an assumption that most big software companies have similar technical requirements of their employees. So if I’m smart enough that Microsoft wanted to hire me, I’m likely smart enough that Google or Amazon might want to hire me as well. I am not saying that any Microsoft employee can get a job wherever they want simply because they worked at Microsoft. Also, for those of you that brought up culture as a reason, I am talking about being rejected before a culture fit could be determined.)

To me, this says that something is wrong with the interview process. Companies shouldn’t be turning qualified candidates. I understand why they do, but to me it seems like a waste, and pretty unfair for lots of people trying to get a job. Getting turned down for a job you aren’t qualified for is one thing, but getting turned down because it was snowing the day of your interview is pretty crushing.

So what can be done about it? There are constantly great articles about different interviewing/hiring techniques. My personal favorite is contracting someone to do a small job for the company. That way they’re really invested in it (because you’re paying them) and you get to see how the person works first hand. A novel technique like that doesn’t necessarily scale too well though. How can a company like Microsoft that hires hundreds of people a week do better? (They hired me, so clearly they can’t</sarcasm>)

I think the number one thing companies can do is calm down a bit and let the interviewee impress you. So many of the interviews I had were strictly technical. There was a little room for questions at the end, but never a time where I felt I could really show off the things I’m good at. They seemed to care more about whether I could come up with complex algorithms on the spot instead of things that I’ve actually done.

I didn’t get to talk about the iPhone app I built for the national restaurant chain, or the website I helped build with over 30,000 signups, or the developer blog I helped start at my old company. Sure, they saw it on my resume, but they never got to hear the details that made each of those things great. I feel like there are so many reasons to hire me, and it was hard to bring many of them up in a lot of the interviews that I had. The job I got? That was the one where I talked about my experience the most with the interviewer.

Hopefully I’m not coming off as bitter about not getting more job offers. I’m really not. I understand that I made mistakes and they can’t hire everyone. I just want companies to stop thinking that the talent isn’t out there, because it is. They just need to work a little bit differently to find it.

Posted in Uncategorized | 45 Comments

Why GroupMe kills the battery on your iPhone

I was really excited after I read about Path sending address book data to their servers. Not because of anything with privacy, but because the post showed me how to snoop traffic on the iPhone. I could finally figure out what GroupMe was doing to absolutely destroy my battery when I left it running.

GroupMe is an excellent service. It makes it very easy to create groups and communicate with them. My team at work actually ditched Campfire to use it because of how much we were talking on our phones outside of work. There’s one big problem though, it absolutely destroys your iPhone battery.

The Internet tells you to turn off location services for the app to solve the problem. That might have helped if I was using location in the app, but I wasn’t. My battery still would drain like crazy, even when my phone was asleep. It feels like my phone is going to overheat and explode.

So what the heck is GroupMe doing? I hooked up mitmproxy and opened up GroupMe. I saw all the expected traffic when I was loading messages and sending them.  When I closed the app though, the requests didn’t stop. I noticed lots of requests that look like this happening over and over again. GroupMe is polling for new messages, constantly, in the background.

Luckily, the iPhone kills the app after about 10 minutes, but 10 minutes of constant network activity is still going to do plenty to drain the battery. What I don’t understand is why they’re doing this. All it gains them is not sending a push notification to that phone for the next 10 minutes.

Posted in Uncategorized | Tagged , , , | 8 Comments

How to preview your icon on the iPhone

There are very few screens that can match that of the iPhone. Because of this, it’s hard to get an idea of what things will look like on it, without actually putting it on the device.

So how do you put the icon on the device? Well, you could set up a developer account and deal with certificates and provisioning profiles, then build and deploy your app to your phone. If you’re already an iPhone developer, this isn’t too big of a deal. What if you’re a designer? What if you’ve never set up an iPhone app before? There is an easier way.

iOS lets you add website bookmarks to your home screen so it looks like an installed app. To do this, you just have to add a link tag to your html that specifies the icon you want to use. Then you visit the site, add it to your home screen and you can see what it will look like.

Doing this by hand is definitely easier than building and deploying a full iPhone app, but it still is a time consuming multi-step process. I built something to make it a little bit easier.

With my iOS Icon Preview generator, all you need to do is upload an image and type in your phone number. It will generate the html necessary and text a link to your phone so you can add the page to your home screen and preview your icon.

I’m using Twilio to send text messages, which costs me a bit of money. It’s not expensive, but if the service took off, it could be. So I’m going to charge a bit of money for it. The way it will work is that you’ll get 10 icon previews for free. After that, you’ll have to pay $1 to recharge the generator and you’ll get 10 more previews.

Let me know what you think of the service, and the revenue model.

iOS Icon Preview Generator

Posted in Uncategorized | 2 Comments

Working at Foxconn sounds a lot like working at an amusement park

I spent two summers in college working at the amusement park. I had a lot of fun and met a lot of great people. Some articles about Apple have brought Foxconn back into the news recently. One thing that struck me as surprising was how similar it sounded to my amusement park job.

A production line in Foxconn City in Shenzhen, China. The iPhone is assembled in this vast facility, which has 230,000 employees, many at the plant up to 12 hours a day, six days a week.

The park where I worked may not have had 230,000 employees, but a 12 hour shift, six days a week was NOT an unheard of thing. In fact it was pretty common. An open to close shift could be more than 13 hours. Some of the less popular departments, the people who picked up trash for example, were often understaffed and their employees would have to work all day every day. Days off? We got 1 a week.

What about housing? Picture this, a 15×10 room that was filled with 2 bunk beds, 3 lockers, a dresser, and a single desk built into the wall. There are spotty wifi hotspots in a few places throughout the dorms, but the cinderblock walls prevent the signal from making it very far. You have community bathrooms that are almost never cleaned and you’re pretty sure that you can see mold growing on the ceiling above the showers. The entire complex is surrounded by a barbed wire topped fence and your bags are searched whenever you enter the complex at night. At the end of every week, a bit of money is then deducted from your paycheck for the privilege of living there. Can you guess where that is? (hint: it’s not China) That was where I lived for 2 summers as an amusement park employee. I’m not saying that the free Foxconn dorms are nicer, but from the pictures I’ve seen they sure look like they are.

This is all superficial you say? The real evil is in the work they do? Foxconn has people doing sweatshop labor, you got to work on roller coasters! The novelty of working in amusement park wears off quickly and it becomes like most other jobs, only louder. I was lucky enough to have a good job at the park (I worked on one of these) but I had a roommate who cleaned toilets. One day, I was lucky enough to work as a “sweep.” That meant I walked around all day with a broom and a dustpan sweeping up litter. More than one person asked me if I was okay because the look on my face made them think something was wrong with me. That was after ONE day of working that job. Next time you’re at an amusement park, look for those people sweeping the sidewalks. They all look just like this Foxconn employee.

But what about fair wages? Foxconn employees only make 17 dollars a day. I made $7.35 an hour. This is a pretty huge difference, but I don’t think it’s really that big when you take into account the difference in cost of living between the United States and China. (I’m not saying they’re even close, just that they’re not as far apart as the numbers say)

The United States has labor laws that prevent wages like in China though right? Sure they do, but guess who is exempt from some of them? Amusement parks! They don’t have to pay minimum wage or pay overtime. Just like amusement park employees, Foxconn employees can also be seasonal.

Now don’t get me wrong, I’m not trying to say that Foxconn is some great place to work, or the amusement park where I worked was that terrible (I did go back after all). I just wanted to give people a little bit different perspective and show them that things might not be as bad as they seem.

Posted in Uncategorized | Tagged , | Leave a comment