Home | Random | Downloads | About | Hikes | WebCam | Search | Sitemap | Email | Feed

Get an email if your site stops being mobile friendly

Get an email if your site stops being mobile friendly

Google just released an API for the mobile friendly test and so I've whipped up a script to send an alert if a web page violates their guidelines. This will run the test as often as you like and send you an email if it detects a problem. Alternatively if you're not mobile friendly it will keep emailing you until you fix any problems which might be a good motivational tool.

First start a new apps script project in drive and paste in the code below:

var urlToMonitor = '';
var alertEmail = '';
var runTestKey = '';

var runTestUrl = 'https://searchconsole.googleapis.com/v1/urlTestingTools/mobileFriendlyTest:run?key=';

function mobileFriendlyMonitor() {
  try {
    
    var postBody = {
      'url' : urlToMonitor
    };
      
    var options = {
      'method' : 'post',
      'contentType': 'application/json',
      'payload' : JSON.stringify(postBody)
    };
    
    var response = UrlFetchApp.fetch(runTestUrl + runTestKey, options);
    var json = response.getContentText();
    var mobileFriendlyResult = JSON.parse(json);
    
    if (mobileFriendlyResult.mobileFriendliness != 'MOBILE_FRIENDLY') {
      sendEmail('Mobile friendly test failed for ' + urlToMonitor + ', check https://search.google.com/search-console/mobile-friendly for details');
    }
      
  } catch (e) {
    sendEmail('mobileFriendlyMonitor failed for: ' + urlToMonitor + ' with error: ' + e.message);
  }
}

function sendEmail(msg) {
  MailApp.sendEmail(alertEmail, 'Mobile Friendly Monitor Alert on ' + Utilities.formatDate(new Date(), "GMT""yyyy-MM-dd'T'HH:mm:ss'Z'"), msg);
}

There are three variables you need to set, urlToMonitor is the full URL of the page to test, alertEmail is your email address (or whoever needs to be pestered) and runTestKey is the API key for the service. To get this go to the Google API Console, click Enable API, search for 'Google Search Console URL Testing Tools API' and click enable. Then click the Credentials option and generate a browser key.

Once you've configured the script choose 'Current project's triggers' from the Resources menu in apps script and set up a schedule for the mobileFriendlyMonitor() function.

Share:

If You Give a Browser a Cookie

If You Give a Browser a Cookie

If you give a browser a cookie, it’s going to ask for local storage.

When you give it the local storage, it’ll probably ask you for a list of system fonts. When it’s finished, it’ll ask you for your screen resolution.

Then it’ll want to look to see if Flash cookies are supported. It’ll probably create a local shared object.

When it’s finished with the local shared object it’ll want more things to hash. It will hash your timezone and language. It might get carried away and hash every supported plugin. It may even end up hashing the platform and user agent.

When it’s done it’ll probably want to check out your WebGL. You’ll have to tell it your WebGL vendor and renderer. It’ll probably ask you to open a HTML5 canvas.

When it looks at the HTML5 canvas, it’ll get so excited it’ll want to draw it’s own hidden image. Then it’ll want to hash the image as well.

Looking at the image will remind it that it should store the hash somewhere. So it’ll ask for local storage.

And chances are if it asks you for local storage, it’s going to want a cookie to go with it.

(With apologies to Laura Numeroff, and you may be a snowflake yourself).

Share:

Subscription Economics

Subscribe to The Economist today and receive a FREE portable phone charger - ad seen on Facebook

I think I'd be more likely to subscribe if you'd take a charger away. Most right thinking gadget vendors don't even include them anymore.

Even better than threatening to send me e-waste: skip the news bit (it's already stale) and send my Kindle a monthly compendium of analysis.

Share:

Routers to defend against rogue IoT devices

Routers to defend against rogue IoT devices

A few months ago I wrote about my cunning plan to stop Internet of Things botnets: stop them at the router.

It's just possible that these were in the works before that post but Symantec, BitDefender and Intel unveiled router level IoT security at CES this year. Not as hard core as my plan, but looks like a useful start.

(Image from Norton Core website).

Share:

Securing the Internet of Things

Securing the Internet of Things

We can’t trust manufactures to build secure connected devices and so routers need to be updated to solve this problem once per network.

The distributed denial of service (DDOS) attack on Friday, October 21 was apparently caused by dodgy webcams. But next time it will be Nest or Alexa or Hue - not picking on Google, Amazon or Philips specifically here, those just happen to be the IOT devices currently plugged into my home network. My washing machine and drier would be as well but fortunately LG’s dismal app has saved me from myself by not working for toffee. Oh, I have some DropCams too. And my car is connected. The next attack will probably just come from me.

My fix: update routers to sandbox these devices. A Nest thermostat can only talk to nest.com. If it wants to DDOS Reddit too bad, no connection allowed no matter how badly the device is compromised.

When a new device is connected the router looks it up (MAC address registry?) and then puts it in the appropriate sandbox.

If Nest needs to connect to weather.gov to check the forecast then Google would need to proxy this via nest.com. If the device goes bad it’s only got one domain to attack (so there’s a pretty good incentive for the manufacturer to make sure it doesn’t).

The only downside is new routers or new router firmware. Given the current state of IOT I’d buy one.

As usual if any of my billionaire investor readers are interested get in touch.

Share:

Google I/O 2016

An Echo knockoff and rapturous applause for variable font size in a messaging app. Not much innovation so far this year.

The horrific trend in Inbox and now Allo is machine learning auto reply so you can send something canned and inauthentic instead of actually speaking with people. Zombie Robs might approve but I'm far from convinced.

Updated 2016-05-18 14:12:

Android N looks super cool and I can't wait. The #1 productivity enhancement I'd like to see though is copy and paste icons that look like copy and paste. I do not have a clue currently.

Updated 2016-05-18 14:24:

No headset.

Updated 2016-05-18 14:40:

Android Studio is very nice. Eclipse was painful. I actually like Android Studio more than Xamarin which is saying a lot for a C# leaning person.

Share:

Chromecast won't connect to wifi - finally found the fix

Chromecast won't connect to wifi - finally found the fix

I've struggled for a while with Chromecast. The idea is great. I love using my phone rather than a remote. I like the idea of being able to cast any screen or browser tab in principle (in practice I think I've only done this once). I like the nice curated background pictures and that I could get round to using my own photos one day.

But here is how it works in practice. Fire up app. Select Chromecast icon and watch it go through the motions of connecting. Nothing streams. Reboot Chromecast, phone and router. Hard reset Chromecast and configure from scratch again. Reboot everything some more. Disconnect house from grid for ten minutes and switch off gas mains as well to be on the safe side. Finally, streaming! Repeat.

It's miserable. With both a Chromecast and a Chromecast 2 (which I really hoped might fix the problem). I've been through two different routers and I've tried a bunch of different settings but nothing seems to make the thing work. I even renamed the device to remove spaces.

For a while I considered buying an OnHub. Maybe Google's router would work with Chromecast? But it can't be bothered with Ethernet ports for some reason and so I'd need a new switch and then I'd probably need another power port and how important is John Oliver right now anyway (very)?

As much as I want Chromecast to work I've binned the wretched thing and bought an Amazon Fire TV Stick. Same basic principle but with apps on the device rather than your phone and a remote control.

I'd rather not have another remote, but it works instantly and without risking an aneurysm. It's also available with voice control which lets you both search for programs and trigger Alexa (my typical morning is asking Alexa for a flash briefing and then sobbing quietly when a daughter yells 'Alexa, stop... Alexa, play Gangnam Style').

My only gripe so far is that the voice search doesn't search inside non-Amazon apps (Netflix, HBO, etc).

Share:

Get ITHCWY By Email

I'm over social media - the Facebook page for this blog is a hopeless way to reach people and I removed the slow horrible sharing widgets a while ago. But I have this nagging suspicion that RSS is a super-niche activity for techno-libertarians harking back to the good old days of the Internet with open protocols and wall-free gardens and isn't entirely up to snuff either. So I'm going to experiment for a monthly email list for people who vaguely follow the blog or use Catfood Software products but don't quite manage to come back here every day to check for updates. Sign up here.

Why? Excellent question. The rules for blogs are to pick a narrow topic of interest, know your audience and do keyword research and drop SEO honeypot bombs to draw that audience in. I did that for Catfood Software but this isn't that kind of blog. It's a random collection of my hobbies and interests. So if you're not sure read through the Featured section in the side bar to get a preview.

I write a lot of code so what you'll get for sure is updates from Catfood Software and other occasional side projects. When I struggle with the process or discover something I write about that as well - these posts are more interesting to other developers and less exciting if you just want your desktop wallpaper (or Android phone) to look awesome. I love to make videos that don't have me in as well, mainly complicated time-lapses so you'll find a lot of those too. Also hikes in and around the San Francisco Bay Area. Occasionally politics.

If that works for you and you're not an RSS type then please join and let me know how I'm doing.

Share:

Got It

Got It irritating me on Facebook

When I run an app or launch a website it's generally because I've got some task to complete and a few free minutes to try and complete it.

Let's take Facebook for example. I want to quickly scan through to see which of my friends are sharing anodyne inspirational quotes superimposed over stock photography and silently judge them.

Facebook picks this moment to let me know about a new feature that will display previously unshared photos and videos to try and get me to share them. I'm instantly pissed off because of the unwelcome cognitive load and then I realize that the whole app has frozen. In fact every time I load Facebook at the moment it just hangs until I give up and do something else.

This is probably because one of my daughters has the endearing habit of shooting hour long 4K videos of the floor. The poor app is probably innocently trying to grab a couple of thumbnails and instead getting an object lesson in the halting problem. I'm sure this will eventually get fixed and it's not even the root cause of my current fury.

Got It irritating me on the Londonist

Got It

My only option is to click Got It. This chirpy little phrase is slowly infesting every corner of interaction design. It seems relatively innocuous at first but let's unpick it a little.

Generally Got It signals that something has been added to an app or site that the designer feels is important enough that they need to let me know about it.

This is almost always going to be bad news. Probably the way I complete my task has changed and I'm going to have to learn the new way. Maybe there has been a complete redesign and the use I had for the app was considered an edge case and has been removed. It could be that for legal reasons I need to be told that some new previously unpillaged corner of my privacy needs to be violated.

I'm immediately in a bad frame of mind when I see Got It.

Also there is rarely a Don't Got It or  Don't Want It link. Got It is a sign that something is being forced on you and the happy language is an implicit forced value judgement that you've both fully comprehended the change and that you wholeheartedly agree with it.

It probably feels cute to designers that come up with this. After all, a whole team has probably toiled for weeks if not months to come up with a new way to cause my phone to hang. They really want me to use it. But you're not putting yourself in my shoes. I rarely care and usually you're making my day fractionally less enjoyable and the design should be about me and not you.

Got It irritating me on YouTube

I miss OK. It's less loaded. I'm OK with dealing with whatever you're inflicting on me. It's not as good as OK / Cancel but sometimes OK is about the best you can expect.

I just don't Got It.

(Previously)

Share:

Commentary

I started with Blogger many years ago. It worked well for a while and then it didn't. I forget why but I wrote a tool to migrate from Blogger to BlogEngine.net.

BlogEngine.net was good for a while, but I never loved the commenting system. I switched to Disqus and I wrote a tool for that as well.

Then Disqus decided to monetize more aggressively than I liked, and I moved on to Facebook comments. Having used these for a while I have come to the conclusion that most people just hate Facebook comments. They're convenient but not many people use them. Also, pages just load much faster without all the Facebook JavaScript. So today I'm switching to home grown manually moderated comments. Just about every comment ever left on this blog has made it from Blogger to BlogEngine.net to Disqus and finally the new system, even the nasty ones. I'll moderate to cut out spam but never dissent. Enjoy!

Share:

Updates were installed...

Microsoft you are literally killing me. Please tell me there is a reason.

Windows 10 has had a reorg of notifications. People in Redmond have spent quality time thinking about how and when to bother me. User experiences have been imagined, focus grouped, re-imagined, tested, pushed out to beta, revised, polished and finally shipped in a heaping turd of time wasting.

After one of the never ending reboots following some critical update or other I get a nice popup to let me know that updates were installed:

Updates were installed...

I'm not sure this is the most important news I'll read all day but fine, thank you and I click the little x to dismiss.

Windows at this point knows that it's told me about the updates, and it knows that I've seen the message because I took the time to actively dismiss it.

So why is this now in the Action Center:

Updates were installed...

I have to acknowledge my latest helping of updates all over again. It's the sort of double confirmation I'd really value before inadvertently nuking Belgium but for pretty much anything I've ever seen in Action Center it's overkill. It's causing the most anger I've had with an Operating System since I had to Google how to shut down Windows 8.

Windows 10 is on 110 million devices. Assuming a reboot a week and three seconds per device spent dismissing the extra message we're looking at a cost of $28 million a year (at US GDP). Microsoft has said it expects a billion Windows 10 devices in 2-3 years. Even at global average GDP that's $64 million down the drain.

It's not a quirky design decision, it's a class action lawsuit waiting to happen.

Smart people must have spent time on this. Please tell me why?

Share:

Hope for Hulu?

Hope for Hulu?

Probably not.

I tore into Hulu last year for the miserable user experience, dreary ads and vanishing content.

Back then I estimated that Hulu could ditch the ads for another $6 a month. TechCrunch is reporting today (via the Wall Street Journal) that Hulu is considering an ad free tier for $12-$14 a month. $14 would be a $6 bump over current pricing. If they can fix the UX as well I'll be back in. And I still want my OTT TiVo.

(Previously)

Share:

Leaving Chrome

Leaving Chrome

My Chromebook was stolen over the weekend. The good news is that I didn't lose anything given the cloud only nature of the device. The bad news was that I didn't really want to get a new one.

I loved the cost and the boot speed and being able to do nearly everything I needed to with a browser-in-a-box.

But the nearly was a deal breaker. I sometimes need to VPN and the Chromebook wouldn't. It just wasn't compatible with our flavor of VPN and I didn't want to buy another Chromebook on the off chance that Google would eventually fix this. I also have to use Skype (I'd rather not) and this isn't really possible on the Chromebook either. Imo.im was good while it lasted. IM+ is horrible.

I've abandoned the Chrome dream and picked up a Surface Pro 3.

(Read the full Chromebook adventure: Part 1: Going Chrome, Part 2: Staying Chrome? and Part 3: Leaving Chrome)

Share:

Cisco's insane securedoc HTML attachment

Cisco's insane securedoc HTML attachment

I last got one of these in 2010 and assumed it must have died by now, but no, otherwise sensible organisations are still training their customers to fall victim to phishing attacks by asking them to open dodgy email attachments.

The product in question is Cisco Registered Envelope and it deals with the lack of security in email by sending you an encrypted HTML file. Opening this file sends you off to register on some website and then runs a Java app to decrypt the message. This is insane. The HTML attachment in insane and the Java applet is insane.

The latest email I got in this format was an appointment reminder from UCSF. I'm sure there is some HIPPA requirement that they can't just send medical information in a plain text email. But they could send an email that lets you know you should login to your account to see the appointment. It's not like the securedoc.html method is magic, you still have to create an account on a website to use it so it buys you literally nothing.

UCSF, shame on you. Look after your patients digital health as well as their physical health. Out of self interest if nothing else, nobody can pay you if their bank accounts have been emptied after falling victim to a real phishing attack.

Cisco, shame on you. This product is so wrong headed it's impossible to believe that you're doing anything right.

​(previously)

Share:

LEGO Management

LEGO Management

Good HBR article on LEGO and girls: LEGO’s Girl Problem Starts with Management, depressing conclusion:

"Don’t hold your breath, though. Despite its first-day sold-out success, LEGO has decided not to continue the Research Institute line. It was only a “limited edition.” So girls, back to the pool. The guys in this boardroom don’t seem to want to give you any ideas… let alone seats at the table."

(previously, previously)

Share:

Book reviews for March 2014

Growth Hacker Marketing: A Primer on the Future of PR, Marketing, and Advertising by Ryan Holiday

Growth Hacker Marketing: A Primer on the Future of PR, Marketing, and Advertising by Ryan Holiday

2/5

Very short. Not as grubby as I was expecting. You'd be better off just reading The Lean Startup.

 

Waiting for Sunrise by William Boyd

Waiting for Sunrise by William Boyd

5/5

Outstanding WW1 spy/psychological literary thriller.

 

Constellation Games by Leonard Richardson

Constellation Games by Leonard Richardson

3/5

Engaging romp of an alien first contact mission to Earth as experienced by a video game developer.

 

Share:

Skype for Android - Getting Closer

Skype for Android - Getting Closer

Skype for Android is finally getting there. Push support means that it is now useful for more than conditioning your battery. Conversation read status is mostly synced between different client instances which is a big time saver. I'm actually starting to use it.

There is one horrible usability crime. When you open the app you get a list of unread conversations. Your set your finger in flight to the first one and then notice an ad sliding down from the top of the screen. With horror you realize it's too late to change course and you hit the ad instead of the conversation.

I'm not complaining about Skype being ad supported here, but if you were going to try and design a UI to trick people into clicking ads you really couldn't do better than this. I expect better from Microsoft.

Other than this the only real complaint is that new posts to group messages sometimes make it through to the notification bar and sometimes don't. You have to run the app periodically to see if there is something new.

(previously, previously)

Share:

Don't show this to me again

Don't show this to me again

HTC deserves to go bust for greying out the option to not use their sharing tool.

Share:

How does Hulu manage to suck so badly and the missing app for cord cutting

How does Hulu manage to suck so badly and the missing app for cord cutting

Hulu Plus has turned out to be a bit of a disaster.

The app (I use it on a TiVo) is ugly and clumsy. I checked last night and it took 15 clicks to watch the next episode of a series I'd watched the previous night. You'd think this would be about the most basic use case and it's something that everyone else gets right.

And then it plays a couple of ads flawlessly before complaining that there is a problem with the connection. You're then bombed out to the menu and sit through the pre-roll ads again before the show starts.

I'm not stoked about being forced to watch ads on a paid service at all. If you believe the CPM estimates on Quora Hulu could charge me another $6 per month for an ad-free service that doesn't suck. Hulu ads are particularly awful because they're not embedded in the stream. This means when it's ad time everything grinds to a halt while the app switches from program mode to ad mode and then back again. You could make a cup of tea in the time it takes Hulu to figure this out. Adding insult to injury only three companies appear to have bought ads so you're stuck watching the same ones repeatedly.

All this is if the program you added to your queue still exists. Different shows seem to have different windows of availability so when you sit down to watch something you've been saving up you might find that half the episodes have been yanked away.

There is an opportunity here for a brave entrepreneur (or at least one operating somewhere with no extradition treaty with the US). What we need is an app (or service) that is the TiVo equivalent for the brave streaming cord-cutting future. You feed in the credentials for all the services you subscribe to and the programs you want to watch. The app records everything and spits out video files you can watch (and fast forward through) at your leisure.

Share:

Finally Gmail

Gmail is taking the compose window out of the corner of your window.

Previously

Share:

NatureBox

NatureBox Healthy Snacks

You know what's healthy? Leaving your house to get a snack.

Share:

The Economics of Digital Rights Management

Cory Doctorow wrote an article criticizing SiDiM in Publishers Weekly last week:

"But the fact that the basis behind this security measure was countered 25 years ago by employing a simple tool that’s getting into its 40s is not the silliest part of this supposed new DRM breakthrough."

This misses the point about how DRM really works.

Most people are fundamentally honest but reading a book or watching a TV show or installing one more copy of a software program doesn't feel like you're doing anything wrong. If you throw up a small roadblock then this is generally enough to gently remind people that they need to cough up.

If I can install another copy of Photoshop from the shared drive to get my job done then I will. If it asks for a license I'm going to ask my boss for one rather than hunting down a cracked copy. DRM works even if it doesn't do very much.

In fact it works best when it doesn't do much. A more sophisticated DRM is more likely to go wrong and is harder to operate. Highly effective DRM starts to hurt you with support and maintenance costs. When it fails to work or to be fair it can backfire spectacularly and cause a consumer backlash.

I spent a lot of time earlier in my career developing and selling DRM and copy protection. Deals were won on security but successful relationships were built from helping publishers balance the technical possibilities with ensuring that legitimate customers had a good experience.

"The idea that copyright owners might convince a judge, or, worse, a jury that because they found a copy of an e-book on the Pirate Bay originally sold to me they can then hold me responsible or civilly liable is almost certainly wrong, as a matter of law."

This doesn't sound right either. We've had enough experience of the record labels and movie studios suing individual copyright infringers, most of whom can't afford to risk a court case even if they have a plausible 'left my laptop unlocked' defense. This wasn't a smart move before, but it doesn't mean that book publishers can't deploy the same flawed strategy.

Chart plotting DRM effectiveness against revenue

Share:

How to get SEO credit for Facebook Comments (the missing manual)

How to get SEO credit for Facebook Comments (the missing manual)

I've been using the Facebook Comments Box on this blog since I parted ways with Disqus. One issue with the Facebook system is that you won't get SEO credit for comments displayed in an iframe. They have an API to retrieve comments but the documentation is pretty light and so here are three critical tips to get it working.

The first thing to know is that comments can be nested. Once you've got a list of comments to enumerate through you need to check each comment to see if it has it's own list of comments and so on. This is pretty easy to handle.

The second thing is that the first page of JSON returned from the API is totally different from the other pages. This is crazy and can bite you if you don't test it thoroughly. For https://developers.facebook.com/docs/reference/plugins/comments/ the first page is https://graph.facebook.com/comments/?ids=https://developers.facebook.com/docs/reference/plugins/comments/. The second page is embedded at the bottom of the first page and is currently https://graph.facebook.com/10150360250580608/comments?limit=25&offset=25&__after_id=10150360250580608_28167854 (if that link is broken check the first page for a new one). The path to the comment list is "https://developers.facebook.com/docs/reference/plugins/comments/" -> "comments" -> "data" on the first page and just "data" on the second. So you need to handle both formats as well as the URL being included as the root object on the first page. Don't know why this would be the case, just need to handle it.

Last but not least you want to include the comments in a way that can be indexed by search engines but not visible to regular site visitors. I've found that including the SEO list in the tag does the trick, i.e.

<fb:comments href="..." width="630" num_posts="10">*Include SEO comment list here*</fb:comments>

I've included the source code for an ASP.NET user control below - this is the code I'm using on the blog. You can see an example of the output on any page with Facebook comments. The code uses Json.net.

FacebookComments.ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="FacebookComments.ascx.cs" 
  Inherits="LocalControls_FacebookComments" %>

FacebookComments.ascx.cs

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Net;
using System.Text;
using System.Web;
using System.Web.Caching;
using Newtonsoft.Json.Linq;

// ReSharper disable CheckNamespace
public partial class LocalControls_FacebookComments : System.Web.UI.UserControl
// ReSharper restore CheckNamespace
{
    private const string CommentApiTemplate = "https://graph.facebook.com/comments/?ids={0}";
    private const string CacheTemplate = "localfacebookcomments_{0}";
    private const int CacheHours = 3;

    public string PostUrl { get; set; }

    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            if (!string.IsNullOrWhiteSpace(PostUrl))
            {
                string cacheKey = string.Format(CultureInfo.InvariantCulture, 
                    CacheTemplate, PostUrl);

                if (HttpRuntime.Cache[cacheKey] == null)
                {
                    StringBuilder commentBuilder = new StringBuilder();

                    string url = string.Format(CultureInfo.InvariantCulture,
                                               CommentApiTemplate,
                                               PostUrl);

                    while (!string.IsNullOrWhiteSpace(url))
                    {
                        string json;
                        using (WebClient webClient = new WebClient())
                        {
                            json = webClient.DownloadString(url);
                        }

                        // parse comments
                        JObject o = JObject.Parse(json);
                        if ((o[PostUrl] != null) &&
                            (o[PostUrl]["comments"] != null) &&
                            (o[PostUrl]["comments"]["data"] != null))
                        {
                            // first page
                            AppendComments(o[PostUrl]["comments"]["data"], commentBuilder);
                        }
                        else if (o["data"] != null)
                        {
                            // other pages
                            AppendComments(o["data"], commentBuilder);
                        }
                        else
                        {
                            break;
                        }

                        // next page URL
                        if ((o[PostUrl] != null) &&
                            (o[PostUrl]["comments"] != null) &&
                            (o[PostUrl]["comments"]["paging"] != null) &&
                            (o[PostUrl]["comments"]["paging"]["next"] != null))
                        {
                            // on first page
                            url = (string) o[PostUrl]["comments"]["paging"]["next"];
                        }
                        else if ((o["paging"] != null) &&
                                 (o["paging"]["next"] != null))
                        {
                            // on subsequent pages
                            url = (string) o["paging"]["next"];
                        }
                        else
                        {
                            url = null;
                        }
                    }

                    string comments = commentBuilder.ToString();

                    HttpRuntime.Cache.Insert(cacheKey,
                        comments,
                        null,
                        DateTime.UtcNow.AddHours(CacheHours),
                        Cache.NoSlidingExpiration);

                    LiteralFacebookComments.Text = comments;
                }
                else
                {
                    LiteralFacebookComments.Text = (string)HttpRuntime.Cache[cacheKey];
                }
            }
        }
        catch (Exception)
        {
            LiteralFacebookComments.Text = string.Empty;
        }
    }

    private static void AppendComments(IEnumerable comments, 
        StringBuilder commentBuilder)
    {
        foreach (JObject comment in comments)
        {
            // write comment
            commentBuilder.AppendFormat(CultureInfo.InvariantCulture,
                                        "
{0} ({1})

\r\n"
,
                                        comment["message"],
                                        comment["from"]["name"]);

            // also write any nested comments
            if ((comment["comments"] != null) && (comment["comments"]["data"] != null))
            {
                AppendComments(comment["comments"]["data"], commentBuilder);
            }
        }
    }
}
Share:

Skype for Android 4 - Better but Useless

Skype just released a completely rewritten version of their Android client.

It's a nice streamlined UI and for the first time on Android it actually loads the 15,422 chats I'm required to participate in work and is usable and responsive. I've used it for a few days and really want to like it.

But.

Even though it's faster and prettier it still destroys battery life. Imo.im ad Plus.im manage to handle multiple networks all day without putting a noticeable dent int the battery. With Skype up and running my phone is dead by the early evening. It's useless.

They also haven't fixed syncing the read state of messages which is the worst deficiency of Skype on both mobile and the desktop. Imo.im did this wonderfully until Skype cut them off at the kneecaps.

Back to Plus.im for now...

Share:

Isle of Skype

Isle of Skype

There are things I still sort of like about Skype. I use it a lot for video calls (although for work and muti-party video it's pretty much all about Google Hangouts these days). I have a Philips phone that integrates with Skype for international calls (they seem to have discontinued it, and while the calls are cheap the UI is baroque). But the IM is horrible. It can't remember which messages you've seen between devices and so you're constantly trying to figure out what you have and haven't read.

And the IM on the desktop is nothing compared to the horror of the Skype Android app. This slowly spins up and by the time it's loaded previous messages your battery is dead.

Imo.im made Skype IM tolerable on Android and possible on a Chromebook. In the last week it seems that Skype has kneecapped them and blocked their servers from signing in. I'm limping by with IM+ Pro at the moment, but it's slow and buggy and frustrating.

I sympathize with Imo.im. I've been stiffed by Skype before as an officially sanctioned partner so it's no shock that they'd take out this kind of tool.

It would be nice if they could fix mobile and web access to the network first though.

Share:

Really BA?

Really BA?

Not to pick on British Airways but yes, that screenshot is real. It's a marketing email opt out that has not only been pre-populated in favor of spam but has then also been disabled.

Previously.

Share:

Thank you Feedly

Thank you Feedly

It has been brought to my attention that I've been whinging too much recently

So I'd like to take a break from that and say how much I'm enjoying feedly. It's a wonderfully well designed RSS reader. I use the Chrome Extension version and the Android app. It preserves the Google Reader keyboard shortcuts so I can sail through my subscriptions and it brings back social sharing. 

I looked at feedly once before and didn't really get it. I thought it was just one of those algorithmic recommendation news manglers that tries to guess what you want to read. It might do that on the home page but the 'All' view is a perfect replacement for Google Reader. 

I love it. I want to pay for it to make sure it stays around. Thank you feedly. 

Share:

Disqust

Disqust

I just discovered that Disqus started running adverts on my blog without permission. It's probably been going on for a little while and I should have paid more attention, sorry.

By 'without permission' I mean that I'm sure I clicked though and didn't read a terms of service document that said they could do what the fuck they like to my site. And reading other accounts of this issue I'm sure I filed without reading the email they sent out that mentioned this new 'feature' in passing. So in a legal sense they probably had all the permission they needed. In a moral sense they're switch-and-bait scum of the highest order. 

They should have made this feature opt-in and then sent out an email explaining it in detail. Some sites don't want to run ads. You could have non-commercial Creative Commons content on a site that is suddenly a commercial concern. 

It's a free service and at some point they need to make money, fine. If this had been presented as an option I might have considered it. If they wanted to charge for the service I'd probably have paid for it.

Instead I've disabled Disqus and hastily hacked in Facebook Comments which should be coming online as I write this post. 

A side effect of this is that all the existing comments are currently unavailable. I have an archive and will try to get them resurrected soon.

Share:

Earthquake Supply Co.

Earthquake Supply Co.

The last time we refreshed our earthquake supply kit was because of a smell. It turned out a water container had burst. This rusted most of the cans, and then the became a domestic Superfund Site. 

Given the current subscription commerce trend - get a new belt shipped by FedEx every four hours - I think there's a small business or a very interesting nonprofit here. 

Deliver a 10-day disaster survival kit every couple of years. Pick up the old one a few months before the food expires and donate it to a homeless shelter. Repeat until the next big one strikes and the kit is actually needed. Different levels for different family sizes, pets, special needs, etc. 

As usual any of my billionaire readers who are interested in funding this should drop me a line

Share:

Installation: Early and Often

Jiri Novotny at Dextronet wrote a great post this week on improving installers for micro-ISVs.

One essential that I'd add is writing your installer early and including it as part of the build process. It's the first thing that potential customers see and leaving the installer to the last minute is a huge mistake. You should be testing with a complete installer as pretty much the first milestone in any new project.

For Windows products I'd recommend WiX. It's easy to learn, and easy to include in your build. The latest beta includes Burn, a bootstrapper to install dependencies before the main MSI runs. I'm sick of having to do this part myself and I can't wait for Burn to become a stable part of WiX.

Share:

Shiti

Citi - Reasons we can share your personal information

Citigroup sent me a nice notice saying they are going to share my information in about four thousand different ways, most of which can’t be limited. For the few that can limit you can’t update preferences on the web site, you apparently need to call them and beg to not be spammed. As I’m writing that number makes you type in your account number and then says ‘I’m sorry, our records are unavailable.’ Most likely they’re in the Citigroup basement behind the Beware of the Leopard sign.

Citi - To limit our sharing...

If you decide to just cancel Citi then say that they will continue to share when you are no longer their customer. It reads like even if you take the time to phone in to opt out they’ll revert to happily sharing promiscuously once you leave. But you can contact them again anytime although it’s not clear what can be limited once you leave. Dear customer, we hate you.

Presumably there is some well meaning legislation to require that Citi sends clear information about their marketing policy and opt outs. Only you can’t opt out and I can’t for the life of me understand what happens if I close my account. How about requiring opt out of everything from the web site and no marketing to ex-customers instead?

Share:

The startup costs are too damned high

Startup Legal and Technology Costs

The Startup Genome people have launched a complicated tool to benchmark your Startup against others.

I’ve developed a simpler model. It used to be you spent too much money on Sun and Oracle. Now it’s fighting off patent trolls.

Share:

Download.com goes nuclear

CNET download.com Download Manager

CNET stopped being a useful source of downloads for me ages ago. Over the lifetime of my account I’ve had nearly 100,000 downloads through CNET, but these days it’s one or two a week. I left my products up there anyway, but I’ve just asked them to remove everything they have listed for Catfood Software.

The reason is that CNET has rolled out a download manager that wraps every single download. Instead of the customer getting the product they thought they were downloading they are dumped into a CNET experience that tries to install a toolbar and push Bing / MSN into your browser defaults. Yuck.

It’s one thing for a vendor to partner this way. It’s quite another to roll it out site wide with little notification and no opt out, let alone a revenue share. CNET sell this as being about analytics. Of course it’s all about referral dollars. This isn’t the experience I want for my customers and so I’m pulling the plug on download.com.

Share:

If you can’t see my mirrors, I can’t see you

Bolts of Fabric

I used to work in Woodley, a small town on the outskirts of Reading in the UK. The town center has a pub, a café, a newsagent, etc. It also had something truly remarkable – two shops that combined fabric and general haberdashery with pet supplies.

I never found out exactly how this came to be. I imagine that there was a fabric shop and a pet shop. The fabric shop was struggling and decided to start selling some dog food. The pet shop responded in kind. Both businesses ended up with no real focus, chasing the competition instead of doing one thing really, really well.

Either that or there was a really messy divorce…

Share:

Twitter: Put some status in status updates

Paragraph Symbol

Give me an extra character for every year that I’ve been with Twitter.

Another extra character for every tweet that gets retweeted more than a couple of hops outside my social circle.

Ten more characters if I #AskObama and he answers.

Etc.

Share:

CAPTCHA advertising

Norton 360 CAPTCHA ad

It’s kind of clever because not only do you have to read the ad but you also have to type part of it in so their catch phrase is more likely to stick.

It’s mostly throw up in your mouth, because it takes a while to even figure out that this is a CAPTCHA and because you know that you could be digitizing books instead.

Spotted on boxbe, although some light Googling suggests that this has been around for a few years.

Share:

Is PAD dead?

I’ve been a member of the Association of Software Professionals (née Shareware Professionals) for nearly ten years and I publish PAD files for most Catfood products. The idea is that PAD provides a standardized XML format for syndicating product information out to download sites. I used the ASPs PAD directory back in 2009 to analyze product information available in this format.

It used to be that download sites were a significant source of traffic and downloads, especially cnet’s Download.com. This just isn’t the case for me any more. I need to really massage Google Analytics to find any referral traffic from download sites. While I have PAD files available I no longer make any effort to promote them. Given a spare minute or two it’s far more effective to write a blog post.

Historically Download.com did a great job surfacing new products. They’ve shifted to emphasizing paid placements and the most popular so unless you’re a category killer (in a pre-defined category) it’s much harder to get traction. Lower tier download sites used to offer some SEO benefit but I really don’t see this any more as the sites have got wise to preserving their limited link juice.

Other than inbound marketing efforts my best source of traffic is creating Google Gadget versions of my products where appropriate. These provide independent value and link to the downloadable version for people who want more (a fusion of freemium and shareware).

Having got to the point of giving up on PAD I’m excited to see Ryan Smyth’s rallying cry in the introduction to a series on this topic on cynic.me:

“I’m going to once and for all shut up the many nay-sayers that are constantly poo-pooing on PAD, Robosoft, and download sites.”

Maybe I’m just doing it wrong. I hope so and I’ll be happy to learn something if this is the case.

Share:

Reviews and links for September 2010

NurtureShock: New Thinking About Children by Po Bronson

NurtureShock: New Thinking About Children by Po Bronson

4/5

I'm a big fan of Bronson and I became a father last Thursday, finishing this book the day after. NurtureShock is packed full of the latest research on child development from infants (I can't believe how happy I am that Baby Einstein doesn't work) to teenagers. If you're unwilling to vaccinate you can probably skip this, otherwise I'd say a must read for parents. But do check back - will update this review in eighteen years or so...

 

WAR by Sebastian Junger

WAR by Sebastian Junger

3/5

WAR consists of Junger embedding with infantry trying to hold a valley in Afghanistan. He visits several times over the course of their deployment and gets caught up in a frightening amount of action. It's as much a book about dealing with this personally as it is about the soldiers he's there to cover. There's very little context about why the valley might be important, or about the war in general, just an account of the hard pointy end of warfare and the psychology of the troops before, during and after.

 

The New Rules of Marketing and PR: How to Use News Releases, Blogs, Podcasting, Viral Marketing and Online Media to Reach Buyers Directly by David Meerman Scott

The New Rules of Marketing and PR: How to Use News Releases, Blogs, Podcasting, Viral Marketing and Online Media to Reach Buyers Directly by David Meerman Scott

3/5

It's a passionate manifesto for focusing on new media for marketing and PR, and a reasonable guide as to how to go about it. I found repeated chapters on the same topic to be a bit grating but if you're completely new to blogging I guess it could be helpful. Readers would be better served by including more on SEO basics and less on Second Life. Worth a read if you're not even blogging yet, probably a pass otherwise.

 

Links

- Star Trek pizza cutter from Boing Boing (Need this!).

- The coming BlackBerry row from BBC - American Frei (Those who don't remember the Clipper Chip are doomed to repeat it...).

- David Miliband: This is Ed's day from BBC News - Home (And it will probably make for a really crappy Miliband Christmas.).

- Timelapse Footage of San Francisco and its Fog at Night from Spots Unknown (Often the fog here looks like a time lapse.).

- Ewan McGregor in a Spitfire from BBC News - Home (A Spitfire 'jet', really?).

- Pope aide in 'Third World' jibe from BBC News - Home (Criticizing Heathrow and BA is hardly the same as criticizing the UK. Also, he's right.).

- Clinton endorses Jerry Brown for Calif. governor from SFGate: Top News Stories (Wow. Probably says more about Meg than Brown.).

- Young 'exposed to unsuitable TV' from BBC News - Home (Right, so send them to bed early so they can watch porn on their laptops...).

- Turtles Eating Things from Boing Boing (Except... they're tortoises! One might expect Blade Runner savvy BB to spot the difference. Sigh.).

- Why patent lawsuits and hot tubs don't mix from All Salon (From the headlines you never thought you'd read department...).

- WTF stamp from Boing Boing (Want).

- Top Gear's 'The Stig': Revealed? from BBC News - Home (It's all a decoy to prevent the real identity from leaking out (Julian Assange)).

Share:

Reviews and links for July 2010

Imperial Bedrooms by Bret Easton Ellis

Imperial Bedrooms by Bret Easton Ellis

4/5

Returns to the characters of Less Than Zero twenty five years later. I don't think it's a plot spoiler to say that they're not happy and well adjusted people. I found Glamorama to be pretty tedious and Lunar Park only marginally better. It was a huge relief that Imperial Bedrooms just flows. It's a welcome return to his earlier narrative style. Dread and paranoia are visceral presences from the start and then layers of fear and horror build until it can't get any worse and then somehow does. Brilliant.

 

Blue Ocean Strategy: How to Create Uncontested Market Space and Make Competition Irrelevant by W. Chan Kim

Blue Ocean Strategy: How to Create Uncontested Market Space and Make Competition Irrelevant by W. Chan Kim

2/5

Given its pedigree it's missing two segments - the yellow ocean (no competition, no customers) and the purple ocean (high competition, no customers). They must be saving those for a sequel. I read this because a few people had recommended it and if you think the ideal market to play in is one with no differentiation and high competition then it's a must read. Otherwise the only real value is being conversant with the buzz word. Evaluating past successes with 20/20 hindsight and talking about their 'blue ocean strategy' is a classic business book selection bias. If you learn anything from the case studies it should be that breakout innovation doesn't come from your ocean, hedgehog principle or current cheese location.

 

61 Hours (Jack Reacher Series, #14) by Lee Child

61 Hours (Jack Reacher Series, #14) by Lee Child

3/5

Well constructed if average plot. This is the Empire Strikes Back of Reacher novels and ends on a bit of a cliffhanger - the next in the series is out later this year and hopefully picks up the pace a bit.

 

Professional C# 4 and .NET 4 by Christian Nagel

Professional C# 4 and .NET 4 by Christian Nagel

4/5

I own the 2005 and 2008 flavors of this book as well. It's the best overall C# reference I've found and this 2010 version is a welcome update. As with the 2008 book it could use a better guide to new features, but still very highly recommended.

 

Ina May's Guide to Childbirth by Ina May Gaskin

Ina May's Guide to Childbirth by Ina May Gaskin

3/5

It's a somewhat troublesome mix of advice and propaganda. The advice seems mostly solid, practical and grounded in a great deal of experience. The book ends with the most important - don't think that your body is a lemon, pregnancy isn't a disease, you can do it. Ina May's statistics from "The Farm" are compelling as well, but the birth stories are a bit far out. They typically sound like: 'Sunflower, hanging from the birthing gallows while member of the Farm suck her nipples and I bring her to repeated orgasm, didn't even notice that her baby had been born'. For most people there's probably a middle ground between technocratic doctors and hippie midwives. When the book veers into propaganda it seems there's no anecdotal story too weird to make the case for natural childbirth and no study rigorous enough to suggest that there might be nothing to this modern medicine fad. Some suggestions - like that obstetricians don't believe that nutrition has a role in healthy pregnancy - are just so ridiculous that they case doubt on the rest of the book. And yet, her statistics are so very good while US hospitals force you into a caesarean section to prevent lawsuits and not miss happy hour. I guess the only conclusion to reach is to give birth in The Netherlands and then move to Sweden to take advantage of their twenty year maternity leave...

 

Links

- Frogger from xkcd.com (don't miss the alt text).

- Say fat not obese, urges minister from BBC News - Home (also 'a bit poorly' rather than 'cancerous').

- MoD 'must not live beyond means' from BBC News - Home (Easy fix... bring troops home and send National Audit Office to scold Iraq and Afghanistan into submission.).

- Vatican mulls sex abuse of impaired adults from All Salon (Hint: if you don't know the number for your local police department 112 will work on most mobile phones.).

- Call for school rugby scrum ban from BBC News | News Front Page | World Edition (Where was Professor Pollock when I was at school?).

- Grandmothers link orcas to humans from BBC News | News Front Page | World Edition (Could it be that the mothers also have mothers? Like necessarily?).

Share:

Email marketing - don't shoot yourself in the foot

If you send email to customers it's important that you let them know where the email will come from and then use then use this address consistently. Using different email addresses is a recipe for getting trapped in spam filters. This is equally important for marketing and other messaging like bills and canceled flights.

I bring up flights because I'm flying to the UK later today and was planning to return on Sunday. British Airways' Cabin Crew is going on strike this weekend and my return flight has been canceled. Instead of sending a text message BA tried to notify me by email. This would have been fine if they used the address they've used for years, but instead they used a new address and a new domain. In fact in the process of canceling and re-booking I (eventually) got email from britishairways.com, my.ba.com, email.ba.com and pop3.amadeus.net.

Since I've had the same email address for twelve years now I get a fair amount of spam. I use SpamArrest to keep myself sane:

94.9% of my email is spam. Since I started using the service SpamArrest has eaten 482,494 messages for me. I'm far from alone in using white list based email filtering so if you want your message to get through transparency and consistency are the way to go.

Share:

I Thought He Came With You

Robert Ellison's Blog

7,250,102,861 people still need to read this blog.

GGB

GGB