Richard Hart

Something @ Somewhere • Kent, UK

  • When a business is going nowhere, or even worse, going downhill, the temptation is to blame the idea or to blame customers. Rarely do we have the courage to admit the problem is really with ourselves. Potential sales are lost because people “just don’t get it”. We say that they’re stupid, brain dead and missing the opportunity of a lifetime. When business dries up we blame market conditions. When the lights are turned off for the last time we say the timing just wasn’t right.

    Before we point the finger we should be asking if there is something we did wrong. Businesses are not limited by customers or market conditions, they are limited only by those that run them. Sometimes that can’t be helped, after all, there are only so many hours in a day and the limitations may be that of time or resources. More often than not, the problem is that of realisations. We don’t realise that we’re doing the wrong thing. We believe in the wrong ideals. We hope for X or Y to happen. We wait for feature X or Y to be ready. We blame everyone but ourselves.

    Only when it’s too late, do we look back and see where we went wrong. How if we’d only done this instead of that, we could have made a break through. We’re so caught up in the moment of our business that we can’t see the wood for the trees. Imagine yourself three, six or twelve months from now. Imagine your business has failed from no traction or no revenue (or whatever factor determines your business a success or not). If you could spend that time again to get your business really going, would you do what you’re doing right now? If the urgency of surviving was hanging over your head, would you do what you’re doing right now?

    Don’t limit your business or your life because you’re following the motions of what someone in your position should be doing. Don’t do something because you read it in a book. Don’t do it because someone told you to. Do the right thing. Your opportunity may not last.

  • The hardest part of creating a website isn’t writing the code or setting up the servers, it’s writing exactly the right thing to convince someone to sign up. As the creators of our own sites, it’s nearly impossible to put ourselves into the mind of a new visitor. We come up with great sounding headlines and slogans thinking they describe our products perfectly, when in reality they leave visitors scratching their heads and us with a high bounce rate.

    “It does exactly what it says on the tin” – Ronseal

    When writing your headlines and follow-on text, always ask yourself “How?”, “What?” and “Why?”. Those are the questions users will be asking themselves as they skim your site. Remember that you have only 10-20 seconds to capture their attention, so forget fancy and clever headlines and write concise and practical ones.

    I believe an example of where perhaps things could have been improved was on a previous site I built contraswap.com.

    The copy is perfect, but is it right? At first I would read it and think “Yeah, this describes our product perfectly.” and then after a period of time spent not working on the product, re-reading it made me question what the site actually did and left with questions. Ok, the why is that I’ll gain more readers, but what is an advertising barter exchange and how do I use one. You could argue that the answers are obvious, but I’m playing the role of a naive visitor. I heard a great quote at SeedCamp this year, that it’s not that users are stupid, it’s just that we haven’t earnt the right to their attention yet. Introductory text needs to allow me to not have to think. I even wondered if people even realised that it was an online tool.

    A good example of a landing page is 37signals’ Backpack. The why is a better organised business. The how is by keeping everything in a centralised place. The what is that it’s a web-based tool. The copy is simple and reading-level low so that it doesn’t require much thought process to ingest.

    On the surface this stuff seems easy, but believe me, it’s really hard. Always question the things you write or better yet, get someone else to read it, but make sure they have no prior knowledge of what your product does. Ask yourself “How?”, “What?” and “Why?” every time you write something your users will read.

  • Installing the intermediate certificates on our server gave me the following error while trying to start up nginx again:

      (SSL: error:0906D066:PEM routines:PEM_read_bio:bad end line)

    The end of the file looked fine, but the problem was half way through it. Somehow the concatenation had joined two lines together:

      -----END CERTIFICATE----------BEGIN CERTIFICATE-----

    This just needed a line break to fix:

      -----END CERTIFICATE-----
      -----BEGIN CERTIFICATE-----
  • A current requirement is that assets uploaded to Amazon S3 must be accessed via SSL and use an expiring URL. Using an expiring url with Paperclip is extremely easy.

      my_model.image.expiring_url(5)

    The problem is expiring_url doesn’t let you choose a style and doesn’t use https, which breaks our SSL site. To add the behaviour was an easy “hack”. I added the file /config/initializers/paperclip.rb with the following code:

      module Paperclip
        module Storage
          module S3
           def expiring_url(style = default_style, time = 3600)
              AWS::S3::S3Object.url_for(path(style), 
                                        bucket_name, 
                                        :expires_in => time, 
                                        :use_ssl => true)
           end
          end
        end
      end

    Now calling my expiring image URL with a style and over https is just:

      my_model.image.expiring_url(:original, 5)
  • A lot of people say that procrastination is the bane of their lives. That procrastination is what stops them actually getting anything done. But recently I’ve come to realise that the real enemy isn’t your typical “putting things off” sort of procrastination, it’s the “putting important things off” sort, or what I’ve come to name as “Professional Procrastination”.

    If you really boil things down, this is perhaps one of the biggest business killers. It’s not picking up the phone to talk to customers. It’s not meeting with potential clients to make a sale. It’s moving pixels around on your homepage. It’s writing up marketing plans and creating spreadsheets planning out the next three years.

    It’s doing all the things today, that might make you money tomorrow, when you could be doing things to make you money right now.

    I love the term spinning the wheels, and this is it exactly. You don’t even realise you’re doing it because you feel so busy. I’m working 18+ hours a day, I must be doing some good. But you know what, it’s easy to be busy. I could shuffle around a gym all day and not lose weight, or I could go in bust my ass for 30mins and achieved a million times more. But that’s difficult. It’s difficult to realise results aren’t an outcome of random hours, results are an outcome of precise and definite action. I can’t remember where I read it, but a book said you should constantly ask yourself “Is what I’m doing right now, the most important thing I could be doing?”, and that’s be no means an easy question to answer. That bug may be critical, or that new feature may make all the difference. But are you doing and ignoring that customer who’s waiting for you to connect with them and make a sale? Are adding more features to certain areas of your site while ignoring what really matters most because? We do these things because the good stuff, the stuff that really brings home the bacon is hard. This blog post certainly isn’t the most important thing I could be doing right now though, that’s for sure.

  • Just been trying to install Passenger on a new Ubuntu EC2 instance and passenger is giving me the error:

      * Curl development headers with SSL support... not found

    Took some digging around but turns out I was just missing the libcurl4-openssl-dev package:

      sudo apt-get install libcurl4-openssl-dev
  • First let me state how much I dislike developing for the Facebook platform. It’s just one constant headache. Things are always changing and breaking things. Anyways, I’ve been banging my head against the wall all day trying to get some FBJS running on a canvas application that’s embedded on a Fan Page tab. No matter what I did, I kept getting the error:

     'FBML' [undefined] is not an object.

    Even using Facebook’s own FBJS examples left my tab in a hung state, with the spinner just continuing forever. After hours of playing around, the problem is that I’m trying to use Javascript one page deep into the application (The landing page itself has no FBJS). Once I added an opening and closing script tag to the landing page, my FBJS woes vanished.

     <script> <!-- //--> </script>

  • In both your personal and business life, the goals you set have to be concrete. It’s not enough to say “I want to lose weight” or “I want to make revenues”. You need to say how much and by when, for the goal to mean anything. “I want to lose 5lbs this month” or “I want to make £500 in revenues this month”.

    We are at our best when the goal is clear cut. A real goal makes us strive to achieve it and allows us the opportunity to measure our progress as we head towards it. If my goal is only to “make revenue”, then your brain just shuts off any effort needed to make any more then moment you receive £1. That’s how we’re designed to be. But if our goal is a sure fire £500, and we know we’ve got £499 to go, then we’ll keep moving until we reach that end goal.

  • One of my previous posts showed how to use an SSH Tunnel to connect to a remote MySQL server. Since moving to Postgres I’ve been wanting to do the same thing with pgAdmin, which sadly isn’t as simple. There’s no way of creating the tunnel automatically in the app so we need to resort to the terminal.

    The first step is as before, we create the SSH tunnel to our server:

      ssh -fNg -L 5555:localhost:5432 {your_username}@{yourdomain.com}

    Here I’m mapping the remote Postgres post 5432 to the local post 5555. Now this is where things start to differ. I had been trying to connect as the local ‘postgres’ user but continually received authentication errors. You need to create a user on the server that relates to your machine’s local user. So if your local username is “foo” you need to create a user in Postgres with the same name. First log into the psql console:

      psql template1

    Then issue the commands:

      CREATE USER foo;
      ALTER USER foo WITH PASSWORD 'password';
      ALTER USER foo WITH CREATEUSER CREATEDB;

    Then in pgAdmin, simply connect with user foo and you’re good to go.

    UPDATE: I’ve since discovered this is related to IDENT authentication. Switching to PASSWORD authentication allows you to use any username/password combination.

  • When writing applications to rival existing solutions, quite often a lot of work will go into replicating all the existing functionality provided by those same rivals before moving onto the stuff that makes your product unique. This is just wrong.

    You don’t need to be perfect in the areas that your competition focus on. You need to be perfect in the areas you focus on and the rest can come later. It’s arse about face, to make everything great before moving onto the things that your business is about. People don’t need an application that replicates their existing solution already, they want an application that solves the problems they currently have. If you solve those problems, people will be willing to put up with the lagging parts of the system that perhaps they don’t even really care about.

    You don’t have to worry about being left behind in areas, if you’re ahead in others.

  • Why?


    Successful inventors get to where they are by challenging the status quo. But constantly asking why things are they way they are, they come up with ingenious and clever solutions to problems. Entreprenures are even told to constantly ask why. Why this, why that. And if not, why not!

    The problem is, there is a point when you just have to accept that somethings are they way they are for a reason. Persistantly badgering your development team for features and asking why it can’t be fit into the current schedule isn’t going to win you an award for the most forward thinking manager and isn’t exactly going to make you friends with your team. Why can’t you work more hours? Why do you have to go home? Why hasn’t this work been done?

    Asking the question why should be a positive thing, don’t make it negative.

  • Recently the discussion of code quality has come up with a couple of different people. With the main question:

    “If the app does what it’s supposed to do, why does code quality matter?”

    In one instance an application that was bringing in over a £1m in revenues a month had one of the worst code bases a friend had ever seen. And I totally agree that there is no correlation between code quality and the earnings/growth potential of an application. Then a few days ago I was reading the brilliant Zed Shaw article “Products For People Who Make Products For People” which completely crystalised why code quality is important:

    “… the frontend product is what brings your revenue stream in, but your backend operations quality is what keeps your costs down as you grow. If your backend costs get out of control because of technical debt then you won’t make a profit, or someone who can keep them down will just copy you and wipe you out with less.”

    Perfect! That’s it exactly. Code quality matters as that’s what allows you to grow the system beyond your v1. If you never plan/or want to get past v1, then perhaps you can get away with being a lot more lieniet in your “quality”. I know that’s what I do, if it’s a quick app then normally I have only the most basic of tests and cut corners where I wouldn’t normally. Maybe in a sense, code quality is a reflection of technical debt. The lower the quality, the higher the debt and sooner or later you’re going to have to pay that back (Unless you’re fortunate enough to close up shop before that time comes). I’ve worked on projects where the technical debt is so high that you’re paralysed and just can’t do anything. Simple changes become huge problems as you’ve been painted into a corner, and the fear of breaking something is so huge that new feature requests are shied away from.

    If you want/expect to be able to grow your business then keep the bar high. Code quality matters a hell of a lot.

  • Thailand


    I recently returned from Thailand where I spent two weeks learning Muay Thai. The trip by the numbers:

    Miles Flown: 20,464km

    Kilometres Run: 65km

    Training Sessions Attended: 23

    Kicks/Punches/Knees/Situps: 1000+

    Showers: ~50

    Pizzas: 1 (Birthday Treat!)

    Banana Shakes: ~35

    Packs of Peanut M&Ms: ~40

    Kilometres covered on the moped: 553km

    Films watched on the DVD channel: Too Many

    Mosquito Bites: Too Many

    Hours Slept: Not enough!

    I chronicled the whole ordeal at:

    http://twoweeksinthailand.publisha.com

  • People setting out to build a webapp are often desperate to fill it with as many features as possible. They look at Facebook and see all the things it does, they read about some other hot “start-up” that just got bought and see all the the things they offer and immediately think they have to do the same. To anyone doing this, just stop. Stop right now. You’re going to kill yourself before you’ve even had a chance to get going. It’s like watching an F1 driver and thinking all you need to do is get in an F1 car, practice and you’ll be as good. What you don’t see is the the whole back story. The humble beginnings. The days when there was just one main feature on the site. The days when nothing worked and things hung together by a thread.

    If you want to create a successful webapp, do just one thing. Then when you do that thing well, move on to the next and the next and the next. Don’t do everything at once. You’ll never get anything done.

  • So once again I have fallen off trying to post once every day or so. Sticking to something is one of the things we all struggle with. I can’t stick to my diet. I can’t stick to my workouts. I can’t stick to anything. The only solution is to accept that fact and get right back in the game. So many times I would have a blow out meal and think “What’s the point in even trying to get back on track.” and then have another blow out meal, and another, and another. We all have hiccups now and again. Sometimes life sets us back when we were right on track. When you get knocked down, all you can do is get back up.