ITHCWY: Robert Ellison's Blog

I didn't think I'd ever fall for fake news of Facebook

I seriously considered giving up Facebook as a New Year's resolution when it became clear that fake news was one of the many things that cost Hillary the election.

Not because of what other people might believe. The problem is me. I get my news primarily from the BBC and NPR. I cruise through RSS feeds and podcasts. I'm a savvy media consumer with a well honed bullshit filter. And then I fell for this:

I didn't think I'd ever fall for fake news of Facebook

It just continued to show up in my Facebook feed reposted from various friends and it wormed its way in as something totally Trumpian and plausible and, well, truthy. Which it isn't. I felt like I'd got as far as filling in the wire transfer form before stopping to think that the Nigerian Prince probably didn't need my personal help with expatriating his fortune. I didn't share it or quote it thankfully but it's like that study where everyone thinks they are a better than average driver. I'm vulnerable to this shit.

I keep reading articles about being a better Facebook user and always checking that the site hosting a story is reputable and written by people who have a footprint outside the site and reverse-searching any images to see if they've been used out of context etc etc etc. Which is implausible if you have more than one friend and comes across as victim blaming.

The horrible danger is that if you don't fact check every stupid quote on image meme the power of repetition lodges them somewhere in your subconscious where they become that thing that you read somewhere. Which is OK if you only read quality news but deadly if you want to catch up on old friends quickly.

What I really want is the friend part without the democracy ending bullshit part.

I tried Diaspora and App.net but they make Google Plus look lively. Facebook, I would pay you for an ad-free, brand-free experience. Also a ban on text on images.

I've been trying to block all the fake news sites that show up in my feed but for some reason that option isn't always available. Also that's probably an impossible task unless Facebook decides to offer shared block lists. Which is probably against their best interest.

I wrote this post to talk myself out of not using Facebook but I don't think I've managed to convince myself yet...

(Meme image grabbed from CNN).

(*on*)

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)

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!

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);
            }
        }
    }
}

Comments Restored

I've restored all the comments that vanished after I removed Disqus last weekend. This is after a considerable effort to get everything out of BlogML and into WXR a couple of years ago. At some point I'll just have to give up and decide it's faster to write my own blogging and commenting system but for now Facebook Comments are enabled for all posts.

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.

I can't post a single photo

I can't post a single photo

You'd think Facebook or Twitter could scrape together a semi-functional Android client but apparently not.

Twitter has some size limit for photo uploads. In a sane world the client would resize a photo that was too large and just get on with it. Table stakes would be an error message. But no, it pretends everything is just peachy and then fails to upload. To post a photo to Twitter I have to remember to go into the camera settings and ratchet down the megapixels which I remember to do about never. 

Facebook used to work occasionally but now just dumps an ugly immobile progress bar that won't go away until I reboot the phone. 

Google+ probably works fine technically but if a photo is uploaded to a forest and there is nobody there to see it is that still in any sense counted as success?

Fight Facebook with Email

I was a little saddened to read today that Diaspora is transitioning over to some form of community manged slow death. I joined a pod a while back and was pretty impressed with the design. It was very similar to Google+: clean, nice features, nobody home. 

I've also joined app.net. The concept here is a social network that you pay for, so the owners are aligned with the interests of the users and developers rather than advertisers and lame brands. I wish app.net well, but it's not the future. Best case (and it's not a bad one) it could be the new WELL - a community that people care enough about to pay for (I was on the WELL in the early 90's, splitting the tab with a friend so our handle was abft, account built for two). If that is the direction it goes in then simply having a slightly longer post limit than Twitter isn't really going to cut it. And cool as it might be most people aren't going to pay for a social network. 

Any attempt to displace Facebook has to solve the problem that anyone interested in sharing anything with anyone else is already using Facebook. The only platform that is in any sense comparable is email. So someone needs to make email into a social network.

This could be an interesting startup. Create some account - [email protected] - anything you send directly to that address is a post. Anyone you copy is a mention. Reply to a thread with this email address included and you're replying on the social network as well. Anyone copied on such an email gets invited to the network if they're not already.

You've got a killer viral component and an instant social network that is supported on every platform with no investment needed. Everyone has email, and everyone is a member as soon as they claim their email address or get included in a post. 

Maybe someone has tried this already and I just haven't seen it. I'm half tempted to have a crack at it myself. 

What would be more interesting would be layering a social protocol over email, and implementing that protocol by proxy on top of email providers that don't or won't support it. This creates a core social service practically out of thin air. Facebook and Twitter are the new AOL and CompuServe. There has to be a way to leverage email into a free and open alternative.

Share a picture in MonoDroid

Here’s how to share a picture to Facebook, Twitter and so forth from MonoDroid:

Java.IO.File cache = ExternalCacheDir;
if ((cache == null) || (!cache.CanWrite()))
{
    // no external cache
    cache = CacheDir;
}

Java.IO.File tempFile = new Java.IO.File(cache, "temp.jpg");
using (FileStream fileStream = File.OpenWrite(tempFile.AbsolutePath))
{
    _currentBitmap.Compress(Bitmap.CompressFormat.Jpeg, 85, fileStream);
}

Intent shareIntent = new Intent(Intent.ActionSend);
shareIntent.PutExtra(Intent.ExtraStream, Android.Net.Uri.FromFile(tempFile));
shareIntent.PutExtra(Intent.ExtraText, "Some text - appears in tweets, not on facebook"));
shareIntent.SetType("image/jpeg");

StartActivity(Intent.CreateChooser(shareIntent, "Share Image");

A fun mix of Java and C#. The directory got me to start with so check to see if the ExternalCacheDir is available and if not fall back to the internal CacheDir. Frustratingly Facebook doesn’t pick up on the text associated with an image regardless of the intent ExtraWhatever specified.

Reviews and Links for June 2012

The Marriage Plot by Jeffrey Eugenides

3/5

A love triangle set in the turmoil of post-graduation. Well written but left me a little cold, I just didn't care for the characters or the sudden resolution.

 

Links

An important update from the International Earth Rotation Service http://t.co/n5VcLNH3 <- warning, subculture

Seeing Beyond the Human Eye: Video of beautiful scientific and artistic photography http://t.co/aZsFEfh1

ITHCWY: Mission:Explore Food - Get It Now: I posted a few months ago about my brother's crowd funded book, Mission… http://t.co/1A2FEkHN

Kate's #MEF151 looks hard! http://t.co/Qo4N4weY #fb

Pyura Chilensis, the living rock http://t.co/54moGgML

Ghosts With Shit Jobs: http://t.co/CjDH5mz6 #fb

Google's Nexus 7 tablet image leaks onto the Web http://t.co/nuLji4zz via @CNET - holy crap that's a big bezel #io12

Robot Hand beats you at Rock-Paper-Scissors every time. http://t.co/W4K1zAeq (Robot hand crushes rock, robot hand crushes scissors...)

Moon Landing http://t.co/oHFSCowO

Patent 'trolls cost $29bn a year' http://t.co/VQRiKFtb

Facebook Just Changed Your Email Without Asking http://t.co/z9QRi3qP

#Bernal now has a Solar Pump http://t.co/e40lcNLY

House of Lords reform: Nick Clegg's crazy plan is a pay day for has-beens and never-wozzers via @Telegraph http://t.co/kDjbqTFh

Future of ATA = more dishes. Not that expensive. What about it @NancyPelosi ? #SETIcon http://t.co/uobbZ065

Meeting moons at #SETIcon http://t.co/MXykt1QK

RT @erinbiba: http://t.co/Ahh0IhXq - a directory of ways for YOU to participate in space exploration. (Build a rover, get your name on a ...

Is Jupiter helpful to life on Earth? In some ways yes, in some ways no. #SETIcon http://t.co/pG1U3mf3

http://t.co/mZWx5FIr Turing Suicide in doubt?

Gaia corollary: http://t.co/9lPllPbT #SETIcon (re global organism)

Intelligent life: it's all about the unknown unknowns #SETIcon http://t.co/Goo7ngUq

Gorgeous start to the second full day of #SETIcon 2. http://t.co/f0bbwW4V

Was God required for the Big Bang panel rather unfairly stacked 100% against God #SETIcon http://t.co/Keg164Vo

How to find aliens: advice from NASA, SETI and the EMH. #SETIcon http://t.co/HAHZrbv6

ITHCWY: SETIcon 2: I'm at SETIcon 2 this weekend. It's a mix of science, sci-fi, religion and general speculation… http://t.co/jifR8Ang

http://t.co/FZo6GzxJ #todo #SETIcon @myEN Kepler archives opening in October

Success of Kepler Mission is staggering. Discovering water worlds, planets everywhere. #SETIcon http://t.co/4EytfDks

On the cusp of routine spaceflight - at #SETIcon http://t.co/iUU6GgEz

I'm reading Mission:Explore Food on @graphicly! http://t.co/z0iqfQKJ

Far-Fetched Scams Separate the Gullible from Everyone Else http://t.co/M8SyoAvH

Scout: get notified every time Congress proposes legislation with keywords you care about http://t.co/OlU04P45

Exoplanets http://t.co/CAu4C9v9 #fb

Falsehoods programmers believe about time - riff on the malleability of computer time http://t.co/sznLoFlH

JustAnswer Becomes http://t.co/U0xZtr5Z, Raises $25 Million Series A http://t.co/r5IQzmFZ via @techcrunch #PearldotcomLaunch

VatorNews - JustAnswer rebrands as Pearl, raises $25M http://t.co/MTveL1qB via @po_st #PearldotcomLaunch

http://t.co/U0xZtr5Z Has Professional Advice, for a Price http://t.co/RnyqID2G via @mashable #PearldotcomLaunch

Andy Kurtzig Raises $25M To Take Expert Services Online With http://t.co/U0xZtr5Z - http://t.co/PPFhu3q8 #PearldotcomLaunch

JustAnswer Becomes Pearl, Comes Out From Under the Radar http://t.co/5l3UTZ1M #PearldotcomLaunch

A Pearl (.com) Comes Out of http://t.co/LZa65dD3 http://t.co/tUhBuEhe via @HuffPostTech #PearldotcomLaunch

Customer Story - Dr. David Helps Nick Recover from Brain Hemorrhage: http://t.co/HK59IUw2 via @pearl.com #PearldotcomLaunch

RT @Pearldotcom: http://t.co/x1sGSaBc is now in beta, come check us out at http://t.co/ePbqZPiU! #PearldotcomLaunch

RT @MissionExplore: Mission:Explore Food – Video yourself doing one of the missions from the book and get a free copy http://t.co/TpkoBOaY

ITHCWY: Near-plurality of idiocy: "In the 30 years since Gallup started asking people whether they believe humans… http://t.co/9f5FoX9Z

BBC News - Alan Turing: why the tech world's hero should be a household name http://t.co/5eqmNyXY

ITHCWY: Petrol & Marks & Spencer: I recently got back from a trip back to the UK. Every time I go back these days… http://t.co/cV0N8tY7

+1 Error Code 451: an HTTP error for censorship http://t.co/OoA942o8

#todo @myEN Mobile-Friendly Pet Locator PetHub Closes $1.3 Million Seed Round http://t.co/DtkMMSoj

Bridge birthday thing... http://t.co/bBEc7TiC

Brrrr-earnal http://t.co/dD4FiXrv

Defensive Patent License: judo for patent-trolls http://t.co/h6Eq82kr

3 of 5 stars to The Marriage Plot by Jeffrey Eugenides http://t.co/aJwE7cIz

Check out this presentation : How to stop sucking and be awesome instead http://t.co/fqW1ZTG5 via @slideshare

Transit of Venus AND Sutro Tower Serendipitously Photographed from Bernal Hill http://t.co/bZAogCf8

Office has laid on EURO 2012 coverage. http://t.co/8dDStstW

Ridiculously nice walk with Rudy. http://t.co/u6E9H1Gg

ITHCWY: Playmobil http://t.co/bIuMirqh