<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>Hi, I’m Andy. I’m an entrepreneur, a techie,  a founder, a CEO/CTO, a music addict. I’m working on my startup GroupSpaces - solving the pains of membership and group management. I created Selective Tweets (the #fb hashtag). I live and work in London.</description><title>Insomanic: Andy Young's Blog</title><generator>Tumblr (3.0; @apexa)</generator><link>http://insomanic.me.uk/</link><item><title>"Success is the ability to go from one failure to another with no loss of enthusiasm”. This is my..."</title><description>““Success is the ability to go from one failure to another with no loss of enthusiasm”. This is my favourite quote by Winston Churchill. As an entrepreneur you should expect to fail repeatedly. And especially with technical innovation you have to fail, to perfect your product or service.&lt;br/&gt;
The last thing you need, then, while surrounding yourself with the inevitable problems you will encounter while attempting something new and different, is for a known issue to be the one that becomes a major problem in your business.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;p&gt;Notwithstanding the fact that by far the biggest risk when starting a new company are that either the idea sucks or your execution of it sucks (with the result that &lt;a href="http://paulgraham.com/startupmistakes.html" target="_blank"&gt;nobody wants what you create&lt;/a&gt;), &lt;a href="http://www.kernelmag.com/features/building-a-company/1455/get-off-the-ground-in-forty-easy-steps/" target="_blank"&gt;this to-the-point article&lt;/a&gt; by multiple-time entrepreneur &lt;a href="http://twitter.com/andrewjscott" target="_blank"&gt;Andrew Scott&lt;/a&gt; provides a great guide to the nitty-gritty due process that should be followed to ensure you’ve covered the legals and give yourself the best possible framework under which to build your new startup.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.kernelmag.com/features/building-a-company/1455/get-off-the-ground-in-forty-easy-steps/" target="_blank"&gt;http://www.kernelmag.com/features/building-a-company/1455/get-off-the-ground-in-forty-easy-steps/&lt;/a&gt;&lt;/p&gt;&lt;/em&gt;</description><link>http://insomanic.me.uk/post/18686953960</link><guid>http://insomanic.me.uk/post/18686953960</guid><pubDate>Sat, 03 Mar 2012 22:25:12 +0000</pubDate></item><item><title>I've written for The Kernel on why we should teach all our kids to code</title><description>&lt;a href="http://www.kernelmag.com/comment/column/1264/coding-for-success/"&gt;I've written for The Kernel on why we should teach all our kids to code&lt;/a&gt;: &lt;p&gt;&lt;a href="http://www.kernelmag.com" target="_blank"&gt;The Kernel&lt;/a&gt; has just published a &lt;a href="http://www.kernelmag.com/comment/column/1264/coding-for-success/" target="_blank"&gt;column piece by yours truly&lt;/a&gt; taking a look at the state of computer science education in the UK and making a case that we should be teaching all our kids to code. This is an issue I’m very passionate about, please do check it out and share your thoughts.&lt;/p&gt;</description><link>http://insomanic.me.uk/post/16351381623</link><guid>http://insomanic.me.uk/post/16351381623</guid><pubDate>Mon, 23 Jan 2012 15:58:35 +0000</pubDate></item><item><title>"This deception happens nearly every day and is especially rampant in Silicon Valley where new..."</title><description>“&lt;p&gt;This deception happens nearly every day and is especially rampant in Silicon Valley where new business models are created and standard metrics aren’t always available. It also reflects the optimistic nature of the Valley. We want to see exponential growth. We see hockey sticks everywhere. Even worse, these statistics get thrown around in the echo chamber and presented as fact. And as they get reblogged and retweeted, they lose the disclaimers that made them technically true in the first place.&lt;/p&gt;

&lt;p&gt;Every time I see a statistic, I try to figure out how much it was tortured. I want to know what it really means as opposed to what the person who is telling me the stat wants me to think it means.&lt;/p&gt;”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;p&gt;&lt;a href="http://twitter.com/rakeshlobster" target="_blank"&gt;Rocky Agrwal&lt;/a&gt; has a &lt;a href="http://venturebeat.com/2012/01/20/google-skews-google-plus-statistics/" target="_blank"&gt;great post on VentureBeat&lt;/a&gt; calling out Larry Page’s sloppy use of statistics this week while commenting on the growth and engagement of Google+ users. A &lt;a href="http://thenextweb.com/google/2012/01/19/larry-page-google-now-has-90-million-users/" target="_blank"&gt;whole&lt;/a&gt; &lt;a href="http://articles.businessinsider.com/2012-01-19/tech/30642180_1_google-ceo-vic-gundotra-larry-page" target="_blank"&gt;bunch&lt;/a&gt; of &lt;a href="http://arstechnica.com/gadgets/news/2012/01/google-claims-90-million-google-users-60-active-daily.ars" target="_blank"&gt;overzealous&lt;/a&gt; &lt;a href="http://mashable.com/2012/01/19/google-plus-90-million/" target="_blank"&gt;bloggers&lt;/a&gt; and &lt;a href="http://www.telegraph.co.uk/technology/google/9027429/Google-hits-90-million-users.html" target="_blank"&gt;news sources&lt;/a&gt; fell into the trap, misinterpreted his comments and reported Google+ to have grown much faster than in reality, drawing flawed comparisons with Facebook’s daily engagement (credit to Jeff Bercovici at Forbes for &lt;a href="http://www.forbes.com/sites/jeffbercovici/2012/01/19/whoa-google-plus-has-54m-daily-users-not-quite/" target="_blank"&gt;calling out&lt;/a&gt; the rest of the media with the correct interpretation).&lt;/p&gt;
&lt;p&gt;This misuse of statistics and accompanying obsession with vanity metrics is a pet hate of mine. Rocky calls it “intellectual fraud” - but as an entrepreneur you’re fooling yourself just as much. When you start to thrive off other people’s celebration of your vanity metrics you begin to live and breathe your own spin. Just as with &lt;a href="http://sivers.org/zipit" target="_blank"&gt;announcing your plans in advance&lt;/a&gt;, celebrating success based on vanity metrics is likely to give you a &lt;a href="http://sloanreview.mit.edu/improvisations/2012/01/19/announcing-plans-may-kill-motivation-productivity/" target="_blank"&gt;premature sense of achievement or completeness&lt;/a&gt;, reducing your drive to succeed where it really matters. Worse, you’re likely to be driven to maximise the vanity metrics - actually deviating from your core path.&lt;/p&gt;
&lt;p&gt;Just as with all our projects and ventures, ultimately whether Google+ succeeds or fails won’t be down to the press reaction or people’s perception of how big it is. PR is not a sustainable marketing strategy, and the perception of popularity does not make users more likely to enjoy and gain value from your product. On the flip-side, setting overly generous expectations only sets you up for a fall when investors or stakeholders discover the hard truths.&lt;/p&gt;
&lt;p&gt;Focus on what matters, and be proud of that.&lt;/p&gt;&lt;/em&gt;</description><link>http://insomanic.me.uk/post/16288387090</link><guid>http://insomanic.me.uk/post/16288387090</guid><pubDate>Sun, 22 Jan 2012 14:44:31 +0000</pubDate></item><item><title>"If you are really interested in the challenge of making a big, inefficient market more efficient or..."</title><description>“&lt;p&gt;If you are really interested in the challenge of making a big, inefficient market more efficient or if you have spent time digging in and identified a multi-billion dollar market where capturing some small percentage of the consumers leads to a big opportunity, keep your day job. If you believe that starting a company is the shortest path to making a lot of money or if you feel good about the business because natural acquirers in the industry limit the downside, keep punching the clock.&lt;/p&gt;

&lt;p&gt;…&lt;/p&gt;

&lt;p&gt;If you are overwhelmed by a medical grade compulsion to solve a problem or build a product, and it is easier to start up than to overcome the compulsion, start up. If the idea keeps you from going to bed, wakes you up in the middle of the night and gets you up in the morning and starting up is the only way to cure the insomnia, start up. If all your friends are sick of hearing about how you are going to change the world by starting up and you keep preaching into the doubt, start up.&lt;/p&gt;”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;p&gt;&lt;a href="http://www.sneakerheadvc.com/page/12/" target="_blank"&gt;If you think you want to start up, please don’t - Sneakerhead VC&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;He’s right. Startups are hard. If you take the plunge, you better know it’s the deep end - and you can’t see the pool edge.&lt;/p&gt;
&lt;p&gt;If there’s doubt, there’s no doubt. But if you decide you’re sufficiently insane, welcome to the club!&lt;/p&gt;&lt;/em&gt;</description><link>http://insomanic.me.uk/post/16047473856</link><guid>http://insomanic.me.uk/post/16047473856</guid><pubDate>Wed, 18 Jan 2012 04:21:39 +0000</pubDate><category>startups</category></item><item><title>I'll be contributing to The Kernel</title><description>&lt;p&gt;&lt;img align="right" height="236" src="http://f.cl.ly/items/072u1c1r3x2m300P0z17/andyyoung.png" width="209"/&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ll be contributing monthly posts to newly launched online magazine &lt;a href="http://www.kernelmag.com" target="_blank"&gt;The Kernel&lt;/a&gt;, generally with a tech slant, providing insights, opinion and reporting from a technical entrepreneur&amp;#8217;s perspective.&lt;/p&gt;
&lt;p&gt;My first post was published during the pre-launch beta last month - &lt;a href="http://www.kernelmag.com/scene/533/desperately-seeking-sysadmins/" target="_blank"&gt;Nailing That Elusive Technical Co-founder&lt;/a&gt;. Feedback and suggestions welcome..&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://www.kernelmag.com/editors-blog/631/the-kernel-welcomes-its-latest-columnists/" target="_blank"&gt;The Kernel welcomes its latest columnists&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The Kernel’s managing editor introduces our second wave of columnists: correspondents from America, Spain, France and eastern Europe, a developer specialist and writers on social media and science.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://insomanic.me.uk/post/16049217986</link><guid>http://insomanic.me.uk/post/16049217986</guid><pubDate>Thu, 12 Jan 2012 00:00:00 +0000</pubDate></item><item><title>Selective Tweets: 3 years, zero marketing and nearly 1M users later - now open source!</title><description>&lt;p&gt;After 3 years, nearly 1 million registered users and zero marketing, I’ve just released the code that powers &lt;a href="http://apps.facebook.com/selectivetwitter/" target="_blank"&gt;Selective Tweets&lt;/a&gt; as an open-source project - you can &lt;a href="http://github.com/andyyoung/Selective-Tweets" target="_blank"&gt;check it out on GitHub&lt;/a&gt; (it’s PHP). I hope this will release a new swathe of value to interested developers and the app’s future. Is Selective Tweets most popular Facebook app ever to be open sourced? If anyone knows of other examples please do share!&lt;/p&gt;
&lt;p&gt;I created Selective Tweets back at the beginning of 2009 to allow Twitter users to cross-post only selected tweets to their Facebook pages. I had the idea while listening to a rant in the pub by my &lt;a href="http://groupspaces.com/" target="_blank"&gt;GroupSpaces&lt;/a&gt; business partner &lt;a href="http://twitter.com/langer" target="_blank"&gt;@langer&lt;/a&gt; how he didn’t want his Facebook stream polluted by people “oversharing” via use of Twitter’s default Facebook app that simply cross-posted all tweets. It occurred to me that many people used Facebook and Twitter to share in fundamentally different ways – in general I saw “Facebook-worthy” updates as a subset of “Twitter-worthy” ones. Immediately came the idea for selective cross-posting using the hashtag, and Selective Tweets was born.&lt;/p&gt;
&lt;p&gt;The initial app took about 6 hours to build and I told about 5 people – back then Twitter was far from mainstream and that was roughly everyone I knew who actually used it. That was essentially the only “marketing” I ever did – from the outset the concept worked and a small number of people started using it. Seemingly there was enough desire (or peer pressure) for Twitter users not to continuinally post all their minor updates to Facebook, not just a desire from the rest of their non-Twitter-using friends to preserve their Facebook experience.&lt;/p&gt;
&lt;h3&gt;Learning about growth&lt;/h3&gt;
&lt;p&gt;That was pretty much it for the first couple of weeks - about 14 people heard about it and signed up in total. Things got a bit interesting in early Feb, when suddenly ~35 people signed up over two days - I think from a tweet or two. However things quieted off. Then on 10th Feb nearly 150 people arrived:&lt;/p&gt;
&lt;p&gt;&lt;img height="353" src="http://f.cl.ly/items/3Q071q3j271u25021e0p/Screen%20Shot%202012-01-08%20at%2015.05.53.png" width="584"/&gt;&lt;/p&gt;
&lt;p&gt;As it turned out, this influx of 150 users was finally sufficient seeding to get the word going - without any major changes to the app the rest of February looked like this: &lt;/p&gt;
&lt;p&gt;&lt;img height="351" src="http://f.cl.ly/items/1u3g113k2U3T13003n0m/Screen%20Shot%202012-01-08%20at%2015.06.39.png" width="591"/&gt;&lt;/p&gt;
&lt;p&gt;February accelerated into March and April as the total number of users grew to ~25k within 3 months:&lt;/p&gt;
&lt;p&gt;&lt;img height="355" src="http://f.cl.ly/items/1I3o2M053N2K1W0U0h3e/Screen%20Shot%202012-01-08%20at%2015.06.56.png" width="590"/&gt;&lt;/p&gt;
&lt;p&gt;And that was basically it - the app had achieved a self-sustaining loop and sufficient seeding that the next 2.5 years looked like this:&lt;/p&gt;
&lt;p&gt;&lt;img height="353" src="http://f.cl.ly/items/0g413y091m1V12280V1O/Screen%20Shot%202012-01-08%20at%2015.07.21.png" width="608"/&gt;&lt;/p&gt;
&lt;p&gt;Finally, a we get a different view by looking at how many people visited the app to sign up or configure it over time - in this view you can see a couple of peaks followed by stabilising at a higher level than before the peak:&lt;/p&gt;
&lt;p&gt;&lt;img height="362" src="http://f.cl.ly/items/1m253m173D2k3q003f3i/Screen%20Shot%202012-01-08%20at%2013.47.51.png" width="890"/&gt;&lt;/p&gt;
&lt;p&gt;The app has been a great source of learning for me personally, certainly providing great first-hand insights into the realities of viral/word-of-mouth growth. Another day, in another post I&amp;#8217;ll come back to the growth and my interpretations and takeaways in some more detail.&lt;/p&gt;
&lt;h3&gt;A business case?&lt;/h3&gt;
&lt;p&gt;Once usage took off, the challenge that appealed to me was to see how big it could get and learn what affected the growth. With this in mind I didn&amp;#8217;t want to introduce barriers to entry in the form of charging. Separately I didn&amp;#8217;t want to distract focus from my day (and night) job - my main startup &lt;a href="http://groupspaces.com/" target="_blank"&gt;GroupSpaces&lt;/a&gt;. I did take the opportunity to use the app as an experiment in &lt;a href="http://en.wikipedia.org/wiki/Donationware" target="_blank"&gt;donationware&lt;/a&gt;, adding a PayPal button and in 2009 experimenting with YCombinator social payments startup TipJoy.&lt;/p&gt;
&lt;p&gt;Sadly TipJoy brought in almost nothing in pledges and precisely zero in hard $ before it - perhaps unsurprisingly - &lt;a href="http://techcrunch.com/2009/08/20/tipjoy-heads-to-the-deadpool/" target="_blank"&gt;shut down later that year&lt;/a&gt;. On a brighter note the PayPal link continues to bring in $10-20/month, which tends to sit in my account until I get those emails about friends running marathons, climbing mountains and undertaking other insane acts in the name of charity.&lt;/p&gt;
&lt;p&gt;Those who are business-inclined will calculate my Average Revenue Per User comes in around a cool $0.0005 – unlikely to win me any VC money based on revenue projections. A damning take on microdonation models? To be fair I could have tried to push monetisation a whole lot more – I’ve not tried &lt;a href="http://flattr.com/" target="_blank"&gt;Flattr&lt;/a&gt; and they seem to have survived the TipJoy fate. Not that I’ve ever needed to worry about monitising the app – nowadays it runs on a single Amazon EC2 Micro instance on the free tier, costing me a grand total of ~$4.50/month (due to over-quota I/O requests). A pretty convincing example of just how much the overhead costs of web apps have plummeted, methinks.&lt;/p&gt;
&lt;p&gt;As the app nears 1m registered users it’s currently used by 150k unique users each month to send more than 2.6m updates from Twitter to Facebook – on average someone tweets using the hashtag &lt;a href="http://twitterfall.com/#fb" target="_blank"&gt;#fb once every second&lt;/a&gt;. The hashtag has evolved a legacy of it’s own, inspiring similar use in subsequent years by the official apps from LinkedIn (&lt;a href="http://twitterfall.com/#in" target="_blank"&gt;#in&lt;/a&gt;/&lt;a href="http://twitterfall.com/#li" target="_blank"&gt;#li&lt;/a&gt;) and Yammer (&lt;a href="http://twitterfall.com/#yam" target="_blank"&gt;#yam&lt;/a&gt;). Now the &lt;a href="http://tagdef.com/" target="_blank"&gt;5th most-used hashtag of all time&lt;/a&gt;, while it’s unlikely to overthrow #ff (for “follow friday”) anytime soon - #justinbieber is just a passing fad, right? ;)&lt;/p&gt;
&lt;h3&gt;The next step: open source&lt;/h3&gt;
&lt;p&gt;So what’s in it for me – why open source? To be honest, I&amp;#8217;m going to discover in time – like many things this is a punt-and-see experiment. The code could be educational as a case study for those new to building apps on social APIs. I think it’s an interesting example of the success of simplistic product design and word-of-mouth spread (I’ll analyse this further in another post). In true open-source fashion the field is open for others to develop their own improvements and fixes and contribute back and/or host their own apps.&lt;/p&gt;
&lt;p&gt;At this point I don’t feel particular “risk” in releasing the source – I don’t expect another app to gain significant traction in the same area anytime soon. I’ve purposefully kept Selective Tweets simple for mass appeal – now it’s achieved a significant established userbase and brand awareness. Things could get interesting if someone manages to tap a new viral channel - in which case we will all benefit from the learning. The MIT licence I’ve released the codebase under permits all forms of use/reuse so long as my original copyright and credit is left in place – at the end of the day it’s uncomplicated code, if anyone can make something else from it then that’ll be another win in my book.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m looking forward to see what comes in the next chapter for Selective Tweets, now it&amp;#8217;s not (necessarily) just down to me!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;If you enjoyed this post please feel free to engage in the comments below or find me on Twitter: &lt;a href="http://twitter.com/andyy" target="_blank"&gt;@andyy&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</description><link>http://insomanic.me.uk/post/15507274276</link><guid>http://insomanic.me.uk/post/15507274276</guid><pubDate>Sun, 08 Jan 2012 13:18:00 +0000</pubDate></item><item><title>Nailing that elusive technical co-founder</title><description>&lt;p&gt;&lt;em&gt;This post was originally published on &lt;a href="http://www.kernelmag.com/scene/2011/12/desperately-seeking-sysadmins/" target="_blank"&gt;The Kernel&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It’s long been observed that the barriers to creating a technology start-up have been falling over the past decade or so. Smart people with a lot more experience than me have been observing how the amount of capital required to start a tech company &lt;a href="http://www.paulgraham.com/webstartups.html" target="_blank"&gt;has reduced dramatically&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But it’s not only cheaper. Recently, my friend Harjeet Taggar, partner at US seed fund YCombinator, &lt;a href="https://twitter.com/#!/Harjeet/status/147019520396107776" target="_blank"&gt;tweeted&lt;/a&gt; that, increasingly, the problems faced by start-ups they fund are being addressed by other start-ups.&lt;/p&gt;
&lt;p&gt;What does this mean in practice? Well, a few months ago, I migrated the hosting for my Selective Tweets app to Amazon’s AWS cloud hosting platform. Since then, I’ve had to pay a grand total of $4.88 in hosting costs for an app with nearly a million registered users that serves several million requests a month. This should be a great example for anyone struggling to understand the concept of cloud computing.&lt;/p&gt;
&lt;p&gt;In another example, at GroupSpaces we use services from Recurly to power our subscription billing engine and Assistly to power our helpdesk, which helped us to get up and running within a day.&lt;/p&gt;
&lt;p&gt;Others leading the pack of “start-ups serving start-ups” are companies such as Twilio and London’s Pusher – each providing a service that would otherwise take many man-months to construct from scratch. The upshot of all of this is that today’s startups can concentrate maximum time and resources addressing the problems they set out to solve.&lt;/p&gt;
&lt;h2&gt;The Talent Squeeze&lt;/h2&gt;
&lt;p&gt;But if tools are plentiful and costs resemble rounding errors, what stands in the way of the would-be entrepreneur of 2012? In short, talent. Just last week, start-up supremo Naval Ravikant of AngelList wrote how the “oversupply” of founders starting companies is making it &lt;a href="http://startupboy.com/2011/12/13/why-you-cant-hire/" target="_blank"&gt;harder to hire&lt;/a&gt; for the average startup. Certainly few would argue that hiring is easy, however in my experience the most significant startup talent shortage – certainly in London – comes at the earliest stage: the number of technically-minded founders.&lt;/p&gt;
&lt;p&gt;Here’s a selection of entreaties from my inbox:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;“Hi Andy, I was wondering whether on the off-chance you know any programmers…”&lt;/li&gt;
&lt;li&gt;“I’ve been sent a random email from someone who is “founding” a business, who needs a technical co-founder.”&lt;/li&gt;
&lt;li&gt;“Are there any ‘Founders Dating’ events coming up?”&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Sometimes it feels like I can measure the state of the economy by simply counting how many times in a given week I’m asked whether I know anyone willing to be someone’s technical co-founder. I’ve had countless meetings over lunch and drinks where I’ve heard the same tales and recounted the same advice. I can confirm first-hand the challenge plagues many different backgrounds, ages and experiences and hinders many of those with great ideas.&lt;/p&gt;
&lt;p&gt;It’s important to point out exactly who we’re looking for here. There are certainly many talented technical people out there. But there are equally as many – if not more – extremely well-paid technical roles with interesting challenges, good perks and relatively good job security.&lt;/p&gt;
&lt;p&gt;You see, a technical cofounder needs to be a founder too: someone with entrepreneurial drive, an appetite for risk and limited desire to be a slave to someone else’s whims. That’s if they’re driven by money at all.&lt;/p&gt;
&lt;p&gt;We need a fix at the earliest stage of the ecosystem: education. Does anyone recall which prominent technology executive was described earlier this year as “&lt;a href="http://www.bbc.co.uk/news/uk-14683133" target="_blank"&gt;flabbergasted&lt;/a&gt;” that computer science was not taught as standard in UK schools?&lt;/p&gt;
&lt;p&gt;An increase in tech talent wouldn’t be a bad thing when hiring for established companies either, but we need minds to be both technical and entrepreneurial. Organisations such as NACUE and EntrepreneurFirst are doing a great job in promoting entrepreneurship as a career path within universities, but they need to focus on fostering those with technical abilities, not the ones that need funding to employ agencies to make their costly first mistakes.&lt;/p&gt;
&lt;p&gt;Until then, most first-time – and many experienced – entrepreneurs will still struggle to find someone with the necessary technical skills to get their bright ideas off the ground.&lt;/p&gt;
&lt;h2&gt;How-to&lt;/h2&gt;
&lt;p&gt;Something you need to know first. People waiting to be someone else’s technical co-founders don’t exist, and they’re certainly not on “founder dating” sites or hanging out at networking events. Not to say anything against those with great ideas, but it works like this: the best geeks are also the ones full of ideas. They tend to have a multitude of side projects, Github portfolios and hacking workshops on the go at once. Plus, any entrepreneurially-minded techie’s starting point is to build something themselves, not sit waiting for an “ideas person” to instruct or inspire them.&lt;/p&gt;
&lt;p&gt;Before I continue, you should have read the following three posts.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Jason Freedman: &lt;a href="http://www.humbledmba.com/please-please-please-stop-asking-how-to-find" target="_blank"&gt;Please, please, please stop asking how to find a technical co-founder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Derek Sivers: &lt;a href="http://sivers.org/how2hire" target="_blank"&gt;How to hire a programmer to make your ideas happen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://27bslash6.com/p2p2.html" target="_blank"&gt;Please design a logo for me.&lt;/a&gt; With pie charts. For free.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;OK, just kidding about that last one. (Though it is definitely required reading.) To summarise the above:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Start anyway by teaching yourself what you need to know&lt;/li&gt;
&lt;li&gt;Prototype, earn respect for yourself and your idea&lt;/li&gt;
&lt;li&gt;Earn yourself a technical co-founder when you can convince them your way is a better option than theirs and you’re not just some fool with a pet idea, wanting a logo and some pie charts&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;A good shortcut to that last accomplishment might be someone you know personally, perhaps who you’ve worked with before. Is there a junior or senior developer from a previous gig who will respect you for a previous role and be ready to build their own baby with you?&lt;/p&gt;
&lt;p&gt;For good passports to the prototype, it comes down to old-fashioned hard work. Start your own &lt;a href="http://venturehacks.com/articles/customer-development" target="_blank"&gt;marketing research and customer development&lt;/a&gt;, get backing if you can leverage your own network, create mock-ups or wireframes and nail down a realistic description of your &lt;a href="http://venturehacks.com/articles/minimum-viable-product" target="_blank"&gt;minimum viable product&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Finally, a top technical dating tip: you’ve no idea how much more motivating it is to someone technical to look at the shitty prototype you had built for $500 on Rent-a-coder, or painfully clubbed together yourself, and say, “Obviously I can help you build that much better,” than it is for them to listen to a shitty pitch.&lt;/p&gt;
&lt;p&gt;Remember, the best startups don’t die, &lt;a href="http://techcrunch.com/2011/06/27/startups-don%E2%80%99t-die-they-commit-suicide/" target="_blank"&gt;they commit suicide&lt;/a&gt;. Perseverance is key, as much when you’re just getting started as it is along the way. So, while you’re slaving away on your customer development while keeping an eye out for your technical match, you could do worse than read Paul Graham’s 2007 essay, &lt;a href="http://www.paulgraham.com/die.html" target="_blank"&gt;How not to die&lt;/a&gt;. Good luck!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;If you enjoyed this post please feel free to engage in the comments below or find me on Twitter: &lt;a href="http://twitter.com/andyy" target="_blank"&gt;@andyy&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</description><link>http://insomanic.me.uk/post/15507197807</link><guid>http://insomanic.me.uk/post/15507197807</guid><pubDate>Wed, 21 Dec 2011 00:00:00 +0000</pubDate></item><item><title>The London List – London startups exceeding $10m in annual revenues</title><description>&lt;a href="http://eu.techcrunch.com/2011/01/10/the-london-list-london-startups-exceeding-10m-in-annual-revenues/"&gt;The London List – London startups exceeding $10m in annual revenues&lt;/a&gt;: &lt;p&gt;Nice to see Saul list us as one of the “emerging leaders” on the London tech scene - look forward to exceeding $10m in annual revenue ourselves..&lt;/p&gt;</description><link>http://insomanic.me.uk/post/2699840077</link><guid>http://insomanic.me.uk/post/2699840077</guid><pubDate>Tue, 11 Jan 2011 17:44:39 +0000</pubDate></item><item><title>Problems with Twitter's new Retweet - and a tip/fix</title><description>&lt;p style="text-align: center; font-size: 1.1em; font-weight: bold;"&gt;&lt;strong&gt;&amp;#8220;If someone retweets you (new-style), you won&amp;#8217;t see it (it&amp;#8217;s not in your @-replies &lt;em&gt;or&lt;/em&gt; main feed) - even if you follow them!&amp;#8221;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update (3 Mar): I was just chatting with my mate &lt;a href="http://twitter.com/lostplan" target="_blank"&gt;Sol from Tweetdeck&lt;/a&gt; and we realised the fix I described here doesn&amp;#8217;t work any more.&lt;/strong&gt; Ah well, it was nice while it lasted..&lt;/p&gt;

&lt;p&gt;&lt;a href="http://twitter.com/andyy" target="_blank"&gt;My twitter feed&lt;/a&gt; is a bit of a mess right now after I discovered a bunch of things in quick succession and typed something wrong initially - so here&amp;#8217;s what&amp;#8217;s annoying me about &lt;a href="http://blog.twitter.com/2009/11/retweet-limited-rollout.html" target="_blank"&gt;Twitter&amp;#8217;s new (built-in) retweet function&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;When someone retweets you (new-style), it doesn&amp;#8217;t show up in your @-replies list.&lt;/strong&gt; This also means it doesn&amp;#8217;t show up in your list of mentions on clients that use Twitter&amp;#8217;s mentions feed e.g. Tweetdeck.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;When someone &lt;em&gt;that you follow&lt;/em&gt; retweets you (new-style), it doesn&amp;#8217;t even show up &lt;em&gt;in your own feed&lt;/em&gt;&lt;/strong&gt; i.e on the Twitter.com homepage when you&amp;#8217;re logged in, or in your list of &amp;#8220;all friends&amp;#8221; in clients like Tweetdeck. For example, I follow &lt;a href="http://twitter.com/jake" target="_blank"&gt;Jake&lt;/a&gt; and he &lt;a href="http://search.twitter.com/search?q=jake+andyy" target="_blank"&gt;retweeted me earlier&lt;/a&gt; (another annoyance - I can&amp;#8217;t link directly to his retweet of mine, instead the links now point back to my original tweet). However Jake&amp;#8217;s RT of mine didn&amp;#8217;t appear in my feed, so I didn&amp;#8217;t notice until later, by chance.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;The combination of 1 &amp;amp; 2 mean that &lt;strong&gt;it&amp;#8217;s pretty difficult to find out when people retweet you&lt;/strong&gt;, unless you&amp;#8217;re really keen to keep checking manually (see below). This means you can&amp;#8217;t judge when people are in agreement with you or interested in things you post, even if you&amp;#8217;re friends and you follow them. You also can&amp;#8217;t discover new people who retweet you - so much for discovering new connections!&lt;/p&gt;

&lt;p&gt;The flip side of this is that &lt;strong&gt;when you retweet people, they&amp;#8217;ll likely not get to know about it&lt;/strong&gt;. So much for subtly attracting someone&amp;#8217;s attention..! ;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There is a &amp;#8220;workaround&amp;#8221; however - do a search for your Twitter username and all retweets will show up&lt;/strong&gt; (well, almost - see below). I use Tweetdeck so it was pretty simple just to add a new column with a &lt;a href="http://search.twitter.com/search?q=@andyy" target="_blank"&gt;search for andyy&lt;/a&gt;. The problem with this is that it works &lt;em&gt;most of the time&lt;/em&gt; - but &lt;em&gt;a lot&lt;/em&gt; of people&amp;#8217;s tweets are blocked from showing up in twitter search (as I&amp;#8217;ve come to discover from the number of people that having problems trying to use my &lt;a href="http://apps.facebook.com/selectivetwitter/" target="_blank"&gt;Selective Twitter Status&lt;/a&gt; app - Twitter seems to have a big problem being overzealous in it&amp;#8217;s detection of spam-like activity or something. The end result is that this still doesn&amp;#8217;t guarantee to show 100% of retweets.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m actually a big fan of the potential for the new retweet functionality - there&amp;#8217;s already some cool stuff if you click on &amp;#8220;Retweets&amp;#8221; in the right-hand menu on twitter.com - &lt;a href="http://twitter.com/#retweeted_of_mine" target="_blank"&gt;&amp;#8220;Your tweets, retweeted&amp;#8221;&lt;/a&gt; shows when people retweet you, although it doesn&amp;#8217;t show cases where you&amp;#8217;ve been the &amp;#8220;influencer&amp;#8221; - where you retweeted someone else and that was subsequently noticed by people that follow you and retweeted by them. The &amp;#8220;&lt;a href="http://twitter.com/#retweets_by_others" target="_blank"&gt;Retweets by others&lt;/a&gt;&amp;#8221; that shows tweets that people you follow have retweeted seems a particularly cool way to discover stuff that your friends find interesting. Here&amp;#8217;s hoping Twitter manage to get this all worked out soon!&lt;/p&gt;</description><link>http://insomanic.me.uk/post/249361310</link><guid>http://insomanic.me.uk/post/249361310</guid><pubDate>Thu, 19 Nov 2009 06:22:00 +0000</pubDate></item><item><title>PHP Trick: Catching fatal errors (E_ERROR) with a custom error handler</title><description>&lt;p&gt;Implementing a custom error handler using &lt;a href="http://php.net/set_error_handler" target="_blank"&gt;set_error_handler()&lt;/a&gt; in PHP can be a useful technique (&lt;a href="http://www.google.co.uk/search?q=php+custom+error+handler" target="_blank"&gt;Google search for more info/examples&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Unfortunately, set_error_handler() doesn&amp;#8217;t catch fatal errors - as the PHP docs say:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The following error types cannot be handled with a user defined function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and most of E_STRICT raised in the file where set_error_handler() is called.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Handily, I just discovered it&amp;#8217;s possible to catch fatal E_ERROR errors and direct them to your custom error handler using a combination of &lt;a href="http://php.net/register_shutdown_function" target="_blank"&gt;register_shutdown_function()&lt;/a&gt; and &lt;a href="http://php.net/error_get_last" target="_blank"&gt;error_get_last()&lt;/a&gt;:&lt;/p&gt;

&lt;pre class="brush:php"&gt;
set_error_handler('myErrorHandler');
register_shutdown_function('fatalErrorShutdownHandler');

function myErrorHandler($code, $message, $file, $line) {
  ...
}

function fatalErrorShutdownHandler()
{
  $last_error = error_get_last();
  if ($last_error['type'] === E_ERROR) {
    // fatal error
    myErrorHandler(E_ERROR, $last_error['message'], $last_error['file'], $last_error['line']);
  }
}
&lt;/pre&gt;

&lt;p&gt;The key is that functions registered with register_shutdown_function() are called even on a fatal error - including out of memory errors. error_get_last() can then be used to detect whether we&amp;#8217;re ending the script because of a fatal error, and pass the error info to your custom error handler if so.&lt;/p&gt;</description><link>http://insomanic.me.uk/post/229851073</link><guid>http://insomanic.me.uk/post/229851073</guid><pubDate>Sun, 01 Nov 2009 16:50:00 +0000</pubDate><category>Dev</category><category>php</category></item><item><title>Stickyness and success: Techcrunch has it backwards</title><description>&lt;p&gt;Just read the guest post &lt;a href="http://www.techcrunch.com/2009/10/29/how-to-measure-the-true-stickiness-and-success-of-a-facebook-app/" target="_blank"&gt;How to measure the true stickiness (and success) of a Facebook app&lt;/a&gt; by Nabeel Hyatt from &lt;a href="http://www.conduitlabs.com/" target="_blank"&gt;Conduit Labs&lt;/a&gt; over at Techcrunch.&lt;/p&gt;

&lt;p&gt;Interesting data, but the conclusion is backwards.&lt;/p&gt;

&lt;p&gt;&amp;#8220;You would expect stickiness to go down as you get huge&amp;#8221;. yes, the table he gives shows this to be TRUE:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://cache0.techcrunch.com/wp-content/uploads/2009/10/conduit1.jpg" alt="" width="500"/&gt;&lt;/p&gt;

&lt;p&gt;An &lt;em&gt;increase&lt;/em&gt; in MAUs between 9/22 and 10/22 (col 4 &amp;gt; col 5) corresponds with a &lt;em&gt;decrease&lt;/em&gt; in DAU/MAU ratio (col 2 &amp;lt; col 3) - and with one exception (RockYou Pets) the opposite is also true - where MAUs went down, stickiness went up.&lt;/p&gt;

&lt;p&gt;In other words, all the apps that got MORE users (grew in size) in the last month became LESS sticky. the last row (Cafe World) is the extreme example - it grew MAUs 15x in the month but went from 92% to 33% stickness.&lt;/p&gt;

&lt;p&gt;The other point - that stickiness and success are correlated - is surely obvious. if you have a stickier app, your users will visit more often, and assuming it is even the smallest bit viral, this means that your users are spending more time being exposed to that virality and so will invite more friends, so over time you&amp;#8217;ll get more total MAUs too.&lt;/p&gt;

&lt;p&gt;Put these together and it suggests a different model:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;stickiness depends on the individual characteristics of each specific app&lt;/li&gt;
&lt;li&gt;stickiness decreases slowly as apps grow&lt;/li&gt;
&lt;li&gt;apps with more stickiness are more likely to be successful&amp;#8230;&lt;/li&gt;
&lt;/ol&gt;</description><link>http://insomanic.me.uk/post/227587734</link><guid>http://insomanic.me.uk/post/227587734</guid><pubDate>Fri, 30 Oct 2009 03:46:00 +0000</pubDate><category>web</category><category>entrepreneurship</category><category>virality</category></item><item><title>1st month as a Spotify premium user</title><description>&lt;p&gt;&lt;img src="http://4.media.tumblr.com/tumblr_krb4blW7Po1qz5fkgo1_100.jpg" alt="" class="left" align="left"/&gt;Spotify founder &lt;a href="http://twitter.com/eldsjal" target="_blank"&gt;Daniel Ek&lt;/a&gt; has just written &lt;a href="http://www.spotify.com/blog/archives/2009/10/08/overnight-success-takes-a-long-time%E2%80%A6/" target="_blank"&gt;a very interesting blog post&lt;/a&gt; to mark the first anniversary of Spotify, giving his views on Spotify&amp;#8217;s progress, the music industry, where they&amp;#8217;re heading and what the journey will be like.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s now a month since I took the plunge and gave Spotify my credit card details. The tipping point for me was the release of their iPhone app allowing me to stream to my phone, in particular to download entire albums for offline play.&lt;/p&gt;

&lt;p&gt;In the last month I&amp;#8217;ve &amp;#8220;borrowed&amp;#8221; the following albums:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="http://open.spotify.com/album/4A1QN1R8CY6WlMVsxrrR0I" target="_blank"&gt;Tiga - Sexor collector&amp;#8217;s edition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://open.spotify.com/album/3fcawGlUwJs3MAQuLaKZOf" target="_blank"&gt;Tiga - Ciao!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://open.spotify.com/album/0cLZaahA8kJdfQHwD21hME" target="_blank"&gt;Simian Mobile Disco - Temporary Pleasure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://open.spotify.com/album/4DIWqOzwfX74Tj2a8MAKma" target="_blank"&gt;Justice - A Cross The Universe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://open.spotify.com/album/31U37xLoG3l8JuOGIoBaBL" target="_blank"&gt;2raumwohnung - Kommt Zusammen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://open.spotify.com/album/2Oijur4pE7MmCfrHzxYJEZ" target="_blank"&gt;Soulwax - Most of the Remixes&amp;#8230;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://open.spotify.com/album/3Dp4KWyl2t8KppfFz5tE1E" target="_blank"&gt;DJ Kicks - The Exclusives&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://open.spotify.com/album/6b26yqVf321OxkkplWjJUY" target="_blank"&gt;Pulp - Different Class (2 CD edition)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://open.spotify.com/album/0eFHYz8NmK75zSplL5qlfM" target="_blank"&gt;Muse - The Resistance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://open.spotify.com/album/0UH5Q1tgffnQfqj5ZlNeBv" target="_blank"&gt;Snow Patrol - Final Straw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://open.spotify.com/album/0vG5hopWlaAp8xus0DuuW0" target="_blank"&gt;Snow Patrol - Eyes Open&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://open.spotify.com/album/0nCmFbB1Flri8SwaQXvwmx" target="_blank"&gt;Daft Punk - Alive 2007&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://open.spotify.com/album/6NrLpQCPYrNS3kVWxDgIlg" target="_blank"&gt;Jet - Get Born&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;..as well as a couple of singles, and listed to a bunch of other stuff without saving it for offline play.&lt;/p&gt;

&lt;p&gt;The verdict - in the first month certainly I&amp;#8217;ve had fantastic value for money. My £10 has given me repeat listening to a whole bunch of music,  mostly albums I hadn&amp;#8217;t heard before and including 2 brand new releases (Muse &amp;amp; Simian Mobile Disco). Sure, this isn&amp;#8217;t exactly the same as actually buying a CD or having an MP3, but I&amp;#8217;ve not experienced any practical difference.&lt;/p&gt;

&lt;p&gt;We&amp;#8217;ll see how it develops, but right now I have to say it comes recommended, at least if you listen to music as much as I do, and particularly since you can cancel at any time..&lt;/p&gt;</description><link>http://insomanic.me.uk/post/209341380</link><guid>http://insomanic.me.uk/post/209341380</guid><pubDate>Sat, 10 Oct 2009 17:24:00 +0100</pubDate></item><item><title>The Alpha Course "Does God exist?" and online poll ethics</title><description>&lt;p&gt;&lt;img src="http://12.media.tumblr.com/tumblr_kr3r7lOJ7u1qz5fkgo1_250.gif" alt="" align="right" class="right"/&gt;The Alpha Course in the UK are running a marketing campaign at the moment with posters asking the question &amp;#8220;Does God exist?&amp;#8221; followed by empty tick boxes for Yes/No/Probably. They&amp;#8217;ve got the same thing on their homepage at &lt;a href="http://uk.alpha.org/" target="_blank"&gt;http://uk.alpha.org/&lt;/a&gt; set up as an online poll, complete with &amp;#8220;see results so far&amp;#8221; link.&lt;/p&gt;

&lt;p&gt;Problem is..&lt;/p&gt;

&lt;p&gt;Clicking yes always returns 36-34-30.
Clicking no always returns 35-34-30.
Clicking probably always returns 35-34-31.&lt;/p&gt;

&lt;p&gt;The votes are being posted to and the &amp;#8220;results&amp;#8221; returned by &lt;a href="http://uk.alpha.org/?q=/alpha09/poll&amp;amp;vote=" target="_blank"&gt;http://uk.alpha.org/?q=/alpha09/poll&amp;amp;vote=&lt;/a&gt;[yes|no|probably] - view source to see the html returned with the &amp;#8220;results&amp;#8221;.&lt;/p&gt;

&lt;p&gt;Amusingly you can get the stats as high as 40% &amp;#8220;no&amp;#8221; by adding lots of votes at once e.g. &lt;a href="http://uk.alpha.org/?q=/alpha09/poll&amp;amp;vote=no&amp;amp;vote=no&amp;amp;vote=no&amp;amp;vote=no&amp;amp;vote=no" target="_blank"&gt;http://uk.alpha.org/?q=/alpha09/poll&amp;amp;vote=no&amp;amp;vote=no&amp;amp;vote=no&amp;amp;vote=no&amp;amp;vote=no&lt;/a&gt; etc. see here: &lt;a href="http://bit.ly/somethingfishygoingon" target="_blank"&gt;http://bit.ly/somethingfishygoingon&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of course as soon as you vote anything else the numbers return to normal.&lt;/p&gt;

&lt;p&gt;Regardless of your religious beliefs, surely this is pushing the line a bit far in terms of presenting it as a real poll when the results are fixed?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I don&amp;#8217;t mean this to be focused on religion&lt;/strong&gt;. The interesting question to me is &amp;#8220;&lt;strong&gt;is it legit to host an online poll backed by a significant ad campaign and present fake results?&lt;/strong&gt;&amp;#8221; If it helps, try imagining that this is a poll by some other brand asking &amp;#8220;Do you think our product is the best?&amp;#8221; and presenting you with what they make out to be what other people think.&lt;/p&gt;

&lt;p&gt;Seems to me like this is deceiving the public. How do poll results (or not) relate to advertising standards laws? Is this legal?&lt;/p&gt;

&lt;p&gt;Say e.g. Apple hosted an online &amp;#8220;poll&amp;#8221; asking &amp;#8220;Are our laptops the best? Yes/No/Probably&amp;#8221; with a &amp;#8220;see results so far&amp;#8221; link. Would that be &amp;#8220;just publicity material&amp;#8221;? Where would they stand legally?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Unlike me, &lt;a href="http://twitter.com/jamesremuscat" target="_blank"&gt;James&lt;/a&gt; wasn&amp;#8217;t too lazy to actually e-mail the webmaster - apparently &lt;a href="http://twitter.com/jamesremuscat/statuses/4736923613" target="_blank"&gt;&amp;#8220;the result were being cached - [they] didn&amp;#8217;t notice as caching is disabled for registered users.&amp;#8221;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The site currently shows a large percentage of noes - hopefully as well as fixing the caching they also ensured that multiple votes in the style of &lt;a href="http://bit.ly/somethingfishygoingon" target="_blank"&gt;http://bit.ly/somethingfishygoingon&lt;/a&gt; are not added to the total!&lt;/p&gt;</description><link>http://insomanic.me.uk/post/205969066</link><guid>http://insomanic.me.uk/post/205969066</guid><pubDate>Tue, 06 Oct 2009 17:51:00 +0100</pubDate></item><item><title>PHP htmlspecialchars()/htmlentities() invalid multibyte/UTF-8 gotcha with display_errors=true</title><description>&lt;p&gt;Here&amp;#8217;s a seemingly nonsensical gotcha I just discovered with error handling for htmlspecialchars() and htmlentities() in PHP. &lt;a href="http://www.php.net/releases/5_2_5.php" target="_blank"&gt;Since PHP 5.2.5&lt;/a&gt;, if either of those functions are passed invalid multibyte strings (invalid UTF-8, perhaps containing a truncated multi-byte character after improper use of substr() intead of mb_substr()) then PHP triggers the following error and returns an empty string:&lt;/p&gt;

&lt;p&gt;&lt;code class="brush:php"&gt;
PHP Warning: htmlspecialchars(): Invalid multibyte sequence in argument
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now, in general the php ini setting display_errors can be used to control whether errors are output to the browser, the ini setting log_errors can be &lt;em&gt;independently&lt;/em&gt; used to control whether errors are written to logfile, and if a custom error handler has been set with set_error_handler() then this is always called for all errors and can then read the values of display_errors and log_errors along with the value of error_reporting() and take the appropriate course of action, right?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrong!&lt;/strong&gt; In this case, htmlspecialchars() and htmlentities() only trigger the error if the value of display_errors is false. If the value of display_errors is true then no error is triggered at all! This seemingly nonsensical behaviour makes it impossible to detect these errors during debugging with display_errors on.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s the &lt;a href="http://bugs.php.net/bug.php?id=47494" target="_blank"&gt;bug report, marked as closed - bogus&lt;/a&gt;, &lt;a href="http://cvs.php.net/viewvc.cgi/php-src/ext/standard/html.c?r1=1.125&amp;amp;r2=1.126" target="_blank"&gt;original modification to the PHP source that added this behaviour&lt;/a&gt;, &lt;a href="http://cvs.php.net/viewvc.cgi/php-src/ext/standard/html.c?r1=1.126&amp;amp;r2=1.127" target="_blank"&gt;initial fix for this behaviour&lt;/a&gt; and &lt;a href="http://cvs.php.net/viewvc.cgi/php-src/ext/standard/html.c?r1=1.127&amp;amp;r2=1.128" target="_blank"&gt;subsequent revert of that fix&lt;/a&gt; that I believe was incorrect.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve contacted the core PHP developers involved but in the meantime this may help anyone searching Google..&lt;/p&gt;</description><link>http://insomanic.me.uk/post/191397106</link><guid>http://insomanic.me.uk/post/191397106</guid><pubDate>Sat, 19 Sep 2009 02:25:20 +0100</pubDate><category>Dev</category></item><item><title>Design by Contract - for efficient coding</title><description>&lt;p&gt;Yesterday I picked up &lt;a href="http://twitter.com/joelg87/status/3769344175" target="_blank"&gt;this tweet&lt;/a&gt; from &lt;a href="http://twitter.com/joelg87" target="_blank"&gt;Joel&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Getting into PHP Exceptions. Very useful :) Example - userExists() function should raise exception when no user passed, not return false!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hang on, should it? While exceptions in programming languages are without doubt a useful tool, his example reminded me of a problematic style of coding I&amp;#8217;ve experienced - something I consider an &lt;a href="http://www.c2.com/cgi/wiki?AntiPattern" target="_blank"&gt;Antipattern&lt;/a&gt;. The style I have in mind is when each function starts with code validating the input parameters before the main work of the function is executed. Here&amp;#8217;s an example:&lt;/p&gt;

&lt;pre class="brush:php"&gt;function addUserToGroup($user, $group, $done_by) {
  if (!($user instanceof User)) { throw new Exception(..); }
  if (!($group instanceof Group)) { throw new Exception(..); }
  if (!($done_by instanceof User)) { throw new Exception(..); }
  // ok, we're (finally) good to go:
  $ref = new UserGroupRef();
  $ref-&amp;gt;setUser($user);
  $ref-&amp;gt;setGroup($group);
  $ref-&amp;gt;setDoneBy($done_by);
  $ref-&amp;gt;save();
}
&lt;/pre&gt;

&lt;p&gt;If you&amp;#8217;d never dream of writing code like this, move along - nothing of interest to see below! If you&amp;#8217;re wondering why I think this is a bad approach, though - what&amp;#8217;s the problem here?&lt;/p&gt;

&lt;p&gt;The code is verbose - 50% is performing &amp;#8220;meta&amp;#8221; tasks. This takes time to write and makes it harder to maintain and interpret in the future. (I&amp;#8217;m a big believer in &lt;a href="http://c2.com/cgi/wiki?SelfDocumentingCode" target="_blank"&gt;self-documenting code&lt;/a&gt; - key to this is keeping code short and &lt;a href="http://c2.com/cgi/wiki?ReduceUnimportantInformation" target="_blank"&gt;reducing the amount of unimportant information&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;The issue gets stronger if we go on to include similar checks in the implementations of UserGroupRef-&amp;gt;setUser(), setGroup() and setDoneBy(). The complete system is now &amp;#8220;nice and robust&amp;#8221; but has doubled in terms of lines of code, and you can imagine how when the code is executed the same checks are called repeatedly at different levels of the call stack. If those other functions are only ever called by code that has already ensured the parameters passed will be valid, surely all the time and effort to write and maintain the additional checks isn&amp;#8217;t strictly necessary..&lt;/p&gt;

&lt;h3&gt;Design By Contract&lt;/h3&gt;

&lt;p&gt;So how do we tell when we need to do this validation? Enter the concept of &amp;#8220;&lt;a href="http://en.wikipedia.org/wiki/Design_by_contract" target="_blank"&gt;Design by Contract&lt;/a&gt;&amp;#8221; - a &amp;#8220;technique to reduce the programming effort for large projects&amp;#8221; (&lt;a href="http://www.digitalmars.com/d/2.0/dbc.html" target="_blank"&gt;source&lt;/a&gt;). The basic idea is that each function comes with a &amp;#8220;contract&amp;#8221; that should be agreed to when calling it, in the same way that two people may have a contract when agreeing to work together in the real world.&lt;/p&gt;

&lt;p&gt;The key elements of Design by Contract are:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;a &lt;strong&gt;Precondition&lt;/strong&gt; - what must be true before the function is called - i.e. the responsibilities of the calling scope. For example, the $user parameter will contain a User object.&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;Postcondition&lt;/strong&gt; - what will be true after the function has executed - i.e. the responsibilities of the function itself. For example. $user will be a member of $group.&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;Class Invariant&lt;/strong&gt; - what the function guarantees to leave unchanged (for completeness - so we don&amp;#8217;t get unexpected side-effects).&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;The part I want to focus on is the precondition - specifically what parameters the function will be given - values, datatypes etc. &lt;strong&gt;Design by Contract places the responsibility on the calling code to provide valid parameters, not on the called code to validate them&lt;/strong&gt;. The core idea is &amp;#8220;fail hard&amp;#8221; - if any part of the contract is broken the entire thing is void - and there&amp;#8217;s no guarantee what will happen(!)&lt;/p&gt;

&lt;p&gt;That obviously sounds quite scary - I think this interpretation of DBC is a relevant approach only for internal functions within a module or self-contained system. DBC is not a good model for dealing with user input at run-time(!) - and for open-source code or APIs that will be used by other teams or released publicly the extra code to check for and report violation of the contract is probably worth the saving in confusion and support questions.&lt;/p&gt;

&lt;h3&gt;Using Design By Contract for efficient coding&lt;/h3&gt;

&lt;p&gt;So the point is to use DBC as the justification for not filling your classes and methods with code validating input parameters, resulting in lengthy code that&amp;#8217;s harder to understand and takes longer to maintain. You just need to ensure that every member of the team writing code that uses a particular module works on the principle that it is the calling code&amp;#8217;s responsibility to provide valid parameters, something that is often possible with small teams and bespoke modules. DBC also simplifies debugging and unit testing since the intended behaviour of each routine is clearly specified.&lt;/p&gt;

&lt;p&gt;Back to Joel&amp;#8217;s example - should userExists() throw an exception if passed invalid input? The answer really depends on how it will be used, and what the &amp;#8220;contract&amp;#8221; for function is understood to be. The contract could be written that userExists() &lt;em&gt;will&lt;/em&gt; take responsibility for validating it&amp;#8217;s input. However it&amp;#8217;s often the case that the calling code will &lt;em&gt;also&lt;/em&gt; need to know if it&amp;#8217;s not working with valid data, which indicates that validation is best done at the earliest point in the call stack than repeatedly throughout.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s also important to keep in mind what real-world effect invalid input may have - for some functions it could result in critical data corruption. However the chances are that when testing for the existence of an invalid user, simply returning false will cause the system to function fine as expected. This leads us to one of my favourite concepts of coding - &lt;a href="http://c2.com/cgi/wiki?YouArentGonnaNeedIt" target="_blank"&gt;YAGNI&lt;/a&gt; ;)&lt;/p&gt;

&lt;p&gt;Comments welcome.&lt;/p&gt;</description><link>http://insomanic.me.uk/post/180549381</link><guid>http://insomanic.me.uk/post/180549381</guid><pubDate>Sat, 05 Sep 2009 19:40:00 +0100</pubDate><category>dev</category></item><item><title>Reliability Bug in Facebook PHP API Batching Support</title><description>&lt;p&gt;I recently discovered a bug in the current Facebook API PHP Client library that affects the &lt;a href="http://wiki.developers.facebook.com/index.php/Using_Batching_API" target="_blank"&gt;support for batching calls&lt;/a&gt; which I&amp;#8217;ve used for the &lt;a href="http://apps.facebook.com/selectivetwitter/" target="_blank"&gt;Selective Twitter Status&lt;/a&gt; application.&lt;/p&gt;

&lt;p&gt;The bottom line is, sometimes the call to &lt;a href="http://wiki.developers.facebook.com/index.php/Batch.run" target="_blank"&gt;batch.run&lt;/a&gt; within execute_server_side_batch() as called by end_batch() returns an empty string instead of the expected array of results from each of the batched calls. The code has the following test for an exception but this isn&amp;#8217;t triggered in it&amp;#8217;s current state since no specific FB exception is being returned, just the empty result:&lt;/p&gt;

&lt;pre class="brush: php"&gt;    if (is_array($result) &amp;amp;&amp;amp; isset($result['error_code'])) {
      throw new FacebookRestClientException($result['error_msg'],
                                            $result['error_code']);
    }
&lt;/pre&gt;

&lt;p&gt;The symptom is a bunch of PHP warnings similar to the following as the code attempts to iterate over the empty string as if it was the expected array of results:&lt;/p&gt;

&lt;pre class="brush:php"&gt;PHP Notice:  Uninitialized string offset:  0 in [...]/facebook/facebookapi_php5_restlib.php on line 210
PHP Notice:  Uninitialized string offset:  1 in [...]/facebook/facebookapi_php5_restlib.php on line 210
&lt;/pre&gt;

&lt;p&gt;etc&lt;/p&gt;

&lt;p&gt;In my experience the empty result has been in situations where the requested batch operations haven&amp;#8217;t been performed, so the fix is to add a test for the empty result and to treat this as an exception. This was my hack:&lt;/p&gt;

&lt;pre class="brush:php"&gt; if (!isset($result[0])) {
            throw new FacebookRestClientException('Batch call returned invalid result: ' . var_export($result, true) . '; ' . var_export($xml, true), 9999);
    }
&lt;/pre&gt;

&lt;p&gt;As a side note, the batching support as implemented in the current PHP API client is rather limited since if one of the batched functions returns an exception it is thrown immediately, with the result that the return values of subsequent calls are not populated and it&amp;#8217;s impossible to know whether they executed successfully. I&amp;#8217;ve changed the line that threw the exception to instead set the FacebookRestClientException object as the return value for the relevant call as follows:&lt;/p&gt;

&lt;pre class="brush:php highlight:[6,7]"&gt;    for($i = 0; $i batch_queue[$i];
      $batch_item_result_xml = $result[$i];
      $batch_item_result = $this-&amp;gt;convert_xml_to_result($batch_item_result_xml, $batch_item['m'], $batch_item['p']);
      if (is_array($batch_item_result) &amp;amp;&amp;amp;
          isset($batch_item_result['error_code'])) {
        // PATCH: modify to return the Exception object as the result for this call so we can process all results/exceptions
        $batch_item_result = new FacebookRestClientException($batch_item_result['error_msg'], $batch_item_result['error_code']);
      }
      $batch_item['r'] = $batch_item_result;
    }
&lt;/pre&gt;

&lt;p&gt;Hopefully this  helps anyone searching Google..&lt;/p&gt;</description><link>http://insomanic.me.uk/post/177576827</link><guid>http://insomanic.me.uk/post/177576827</guid><pubDate>Wed, 02 Sep 2009 03:00:00 +0100</pubDate><category>facebookapi</category><category>dev</category></item><item><title>If you can't find yourself in Twitter Search..</title><description>&lt;p&gt;I just came across a &lt;a href="http://help.twitter.com/forums/10713/entries/42646" target="_blank"&gt;recent help page from Twitter&lt;/a&gt; (from June) about what to do if your tweets are not showing up in the twitter search. As it already says on the &lt;a href="http://apps.facebook.com/selectivetwitter/help" target="_blank"&gt;Selective Twitter Status help page&lt;/a&gt;, your tweets not showing in Twitter search is one of the most common reasons for the app not working for you, particularly if it used to work but suddenly stopped.&lt;/p&gt;

&lt;p&gt;To check if your tweets are coming up in Twitter search go to &lt;a href="http://search.twitter.com/" target="_blank"&gt;&lt;a href="http://search.twitter.com/" target="_blank"&gt;http://search.twitter.com/&lt;/a&gt;&lt;/a&gt; and type in your twitter username. For example, my tweets should show up at &lt;a href="http://search.twitter.com/search?q=andyy" target="_blank"&gt;&lt;a href="http://search.twitter.com/search?q=andyy" target="_blank"&gt;http://search.twitter.com/search?q=andyy&lt;/a&gt;&lt;/a&gt;. If your tweets don&amp;#8217;t appear, Twitter basically say to check Twitter isn&amp;#8217;t having any problems at the moment, and if everything is otherwise fine (and your account is public, of course) then your tweets &amp;#8220;have most likely been filtered out of our search index for quality reasons&amp;#8221; which sadly isn&amp;#8217;t much help (unless you really have been spamming, in which case you just gotta live with it.. ;)&lt;/p&gt;

&lt;p&gt;As I mention on the &lt;a href="http://apps.facebook.com/selectivetwitter/help" target="_blank"&gt;help page&lt;/a&gt;, the last thing to try is to protect your Twitter account and then make it public again. You&amp;#8217;ll need to post a new tweet after doing this to check if it worked.&lt;/p&gt;</description><link>http://insomanic.me.uk/post/177557169</link><guid>http://insomanic.me.uk/post/177557169</guid><pubDate>Wed, 02 Sep 2009 02:35:00 +0100</pubDate><category>selective twitter status</category></item><item><title>New website..Tumblr it is</title><description>&lt;p&gt;So, I finally got around to setting up a personal website that I&amp;#8217;m not ashamed to show people..&lt;/p&gt;

&lt;p&gt;I don&amp;#8217;t really blog, but I wanted a home to stick links to my &lt;a href="http://twitter.com/andyy" target="_blank"&gt;Twitter&lt;/a&gt;, &lt;a href="http://www.facebook.com/andyjy" target="_blank"&gt;FB&lt;/a&gt;, &lt;a href="http://www.linkedin.com/in/andrewyoung" target="_blank"&gt;LinkedIn &lt;/a&gt; profiles etc for people that discover me online, collect links to show off when my projects receive press coverage etc as well as post interesting links and other notes from time to time.&lt;/p&gt;

&lt;p&gt;Features I wanted:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Easy setup, hosted solution, no coding required - I&amp;#8217;m lazy, didn&amp;#8217;t want to spend time on the technical side of a full Wordpress install etc. &lt;/li&gt;
&lt;li&gt;A service with lots of themes so I could find one I liked and do minimal customisations&lt;/li&gt;
&lt;li&gt;The ability to post stuff with tags, so in future I can set up separate index pages for stuff related to &lt;a href="http://insomanic.me.uk/tagged/GroupSpaces" target="_blank"&gt;GroupSpaces&lt;/a&gt;, &lt;a href="http://insomanic.me.uk/tagged/Selective_Twitter_Status" target="_blank"&gt;Selective Twitter Status&lt;/a&gt;, &lt;a href="http://insomanic.me.uk/tagged/entrepreneurship" target="_blank"&gt;entrepreneurship &lt;/a&gt; etc&lt;/li&gt;
&lt;li&gt;My own domain name&lt;/li&gt;
&lt;li&gt;Suitable cool post-from-email/iphone/etc support&lt;/li&gt;
&lt;li&gt;All the above for free!&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;I looked at &lt;a href="http://www.posterous.com" target="_blank"&gt;Posterous&lt;/a&gt; first but it doesn&amp;#8217;t support all of the above right now. The winner is &lt;a href="http://www.tumblr.com" target="_blank"&gt;Tumblr&lt;/a&gt; which was quick to set up, does all the above plus the following bonus features:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Designed for minimal blogging (posting short snippets, links and videos rather than extended blog posts) that suits the way I want to post&lt;/li&gt;
&lt;li&gt;Handy powerful iPhone app for posting&lt;/li&gt;
&lt;li&gt;Supports &lt;a href="http://daringfireball.net/projects/markdown/" target="_blank"&gt;Markdown&lt;/a&gt; - a handy way of entering formatting quickly as you type&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;I&amp;#8217;ve also integrated commenting powered by &lt;a href="http://www.disqus.com" target="_blank"&gt;Disqus&lt;/a&gt;, which took only a couple of minutes and has a bunch of powerful features (sign in with Facebook etc). I think the default Disqus interface confuses visitors with too many features and wordy instructions so I&amp;#8217;ve hidden some parts of the comments interface and tweaked some other stuff out of the way using custom CSS.&lt;/p&gt;

&lt;p&gt;Let&amp;#8217;s see how it goes..&lt;/p&gt;</description><link>http://insomanic.me.uk/post/175076071</link><guid>http://insomanic.me.uk/post/175076071</guid><pubDate>Sun, 30 Aug 2009 01:54:00 +0100</pubDate><category>blog</category></item><item><title>new FB iPhone app fixes Selective Twitter Status issue</title><description>&lt;p&gt;&lt;img src="http://9.media.tumblr.com/tumblr_kp5nq0FG9R1qz5fkgo1_400.jpg" align="right"/&gt;&lt;/p&gt;

&lt;p&gt;The new 3.0 version of the Facebook iPhone app now displays all posts by Selective Twitter Status correctly, even if you have the “show follow link” option turned on in the &lt;a href="http://apps.facebook.com/selectivetwitter/settings" target="_blank"&gt;settings&lt;/a&gt; :)&lt;/p&gt;</description><link>http://insomanic.me.uk/post/174930644</link><guid>http://insomanic.me.uk/post/174930644</guid><pubDate>Sat, 29 Aug 2009 21:44:00 +0100</pubDate><category>Selective Twitter Status</category></item><item><title>European Entrepreneurs Come to Life with their Latest Creations</title><description>&lt;a href="http://www.weblogtheworld.com/united-kingdom/european-entrepreneurs-come-to-life-with-their-latest-creations/"&gt;European Entrepreneurs Come to Life with their Latest Creations&lt;/a&gt;: &lt;p&gt;Features an interview with David about GroupSpaces&lt;/p&gt;</description><link>http://insomanic.me.uk/post/174782662</link><guid>http://insomanic.me.uk/post/174782662</guid><pubDate>Sat, 01 Aug 2009 00:00:00 +0100</pubDate><category>GroupSpaces</category></item></channel></rss>

