Acquisition Thoughts

Lately we’ve seen some aggressive moves by Microsoft to pick up developer mind-share. The purchase of GitHub was the opening salvo, but Microsoft made a number of smaller moves recently as well: private repositories available for free on GitHub (previously you needed a student or paid account to have private repos), the acquisition of NPM (Javascript package manager and registrar), and GitHub Actions: a way to automate developer workflows – similar to a developer focused version of IFTTT/Zapier. Part of the new GitHub Actions makes it easier and faster to deploy code on Microsoft Azure.

Recently GitHub announced a huge drop of new features, the most important of which is Codespaces (an online IDE) and Discussions (a place to host community discussions). It’s clear to everyone that Microsoft is playing the long game in its war against Amazon Web Services: Microsoft is buying up developer mindshare, making it easier and faster to discuss, manage, and deploy applications on Microsoft services.

This leaves Google’s cloud platform in a difficult bind: how to compete against all these offerings? AWS is by far the market leader in the cloud game, with Microsoft in a strong 2nd place position and having strong Enterprise-size deployment credentials, plus increasing ownership of the development process. We’re beginning to see Google’s counter moves: recently they announced the release of a code editor within Cloud Shell. Here’s a screenshot as of today:

Screenshot of Google Cloud Shell’s code editor. Admittedly it’s a bit boring – it’s not as fully featured as AWS’s Cloud9 online IDE.

The bottom line is, Google Cloud needs to start opening up its checkbook if they want to compete with the options Microsoft and Amazon are developing/purchasing. Here’s a couple of companies I think Google should seriously consider purchasing:

  1. GitLab – GitLab is the perfect counter to Microsoft’s purchase of GitHub; GitLab includes the social coding aspect of GitHub, plus automated integration tools to compete with GitHub Actions
  2. An online IDE – There are a number of online IDEs available. I’ve been trying out a number of them and personally, I quite like GitPod.
  3. AI Services – Google needs something to differentiate its cloud platform compared to Microsoft Azure and AWS. An interesting play would be to lead the burgeoning AI industry. There are a number of players in this space, but a good starting acquisition would be Diffbot – it supplies APIs for structured extraction of text from a webpage and understanding context.

Some other acquisitions that I think make sense, especially in light of the current economic troubles driving down valuations:

  1. A note service to enhance GSuite. Google Keep exists, but it’s not as advanced as Evernote.

    With a $1 billion valuation, Evernote may be too expensive to purchase, but there are a number of smaller competitors that still provide a great note-taking experience. A good example would be Notion.
  2. AirTable. I’m surprised that nobody has acquired AirTable yet – it’s a marvelous new take on how spreadsheets and databases can be visualized.
  3. Automation tooling. Services such as IFTTT, Zapier, Integromat, Automate.io are the “glue” that can connect disparate services together. For instance, you can configure a new WordPress post to be saved to Google Drive/Dropbox – or any of hundreds of different web services.

    A purchase of IFTTT or similar service immediately buys integration into many different web services, plus allows a deeper integration into Google products. Imagine making it easier to share your favorite YouTube clip to any social media you have.

For New Engineers, A Reminder…

I find that many new software engineers are nervous when they start a new job – there’s always so much to learn: every software company does things a little differently or possibly radically differently than the “best” practices taught at university. It’s good to take a step back and remember that everybody messes up once in a while.

I was quite amused today when browsing HN and saw this article: I shipped a word processor that formatted the hard drive every 1024 saves. It links to a Twitter thread reproduced below: https://twitter.com/GeePawHill/status/1256342997643526151 (Click image below to expand).

A twitter thread where a programmer discusses a bug wherein a word processor overwrote the hard drive's master boot record with garbage, making the computer unable to boot.

Everyone makes mistakes – the important thing is to be able to learn from them. If you’re a new intern or software engineer, my advice to you is to ask lots of questions: in my experience, people don’t mind asking questions as long as the questions show that you’re growing and learning.

Googlebot Cannot Scroll; Infinite Scroll Doesn’t Help SEO

I saw a fascinating article in today’s Search Engine Journal: Google’s Martin Splitt Explains Why Infinite Scroll Causes SEO Problems. Read it for some background information, but the bottom line is that Googlebot (the Google web crawler/indexer) does not scroll web pages, which means that any content exposed via infinite scroll is not indexed.

Infinite scroll can also cause other problems: some screenshot browser addons and services have difficulties rendering infinite scroll web pages. It’s easy to love infinite scroll as a user since it gives the illusion of infinite content, but it can be a nightmare for automated services.

The fix: Make sure that all content on a web site can be accessed without using the infinite scroll function. Also, send Google a sitemap so it knows where all the valid URLs are: https://support.google.com/webmasters/answer/183668?hl=en .

A Google Credit Card?

TechCrunch is covering an upcoming Google product, a debit card under the umbrella of Google Pay. `

Branded credit cards bring in a surprising amount of money – the Apple credit card is projected to earn Apple $1 billion annually with very little risk. I think it’s notable that this is a debit card and not a credit card – a debit card charges purchases against a checking account (in other words, money is there before you make your purchase) while credit card purchases are essentially a short term loan. By making it a debit card, Google reduces their risk by requiring that consumers already have money in their checking accounts to charge against. Additionally, Google and its partner bank earn interest on that checking account’s balance.

This is another way of diversifying Google’s income stream away from Ads; I wouldn’t be surprised if we see the Google credit link to benefits on other Google properties – for example, free or discounted YouTube premium, discounted Google Home devices, etc.

RSS: YouTube Channel Feeds

I’ve remarked before about how I love Newsblur as a replacement for Google Reader. But Newsblur can also watch for new YouTube videos via YouTube RSS feeds!

RSS support is not always clearly advertised on YouTube, but it’s simple to access. In NewsBlur, right click a folder and select Add A Site To This Folder:

Newsblur screenshot: add a new site to this folder.

Then just insert the YouTube channel URL, and NewsBlur should load the newest YouTube videos!

Add a New Site option in NewsBlur

This is a quick and easy way for me to monitor a lot of YouTube channels at once.

NewsBlur: Iterating Through A Folder’s RSS Feed

After Google Reader was shut down, I moved to NewsBlur to follow my RSS feeds. The great thing about NewsBlur is that you can add RSS feeds to a folder and Newsblur will merge all the stories under that folder into a single RSS feed.

Under NewsBlur, you’ll want to pull the folder RSS feed from the settings option:

NewsBlur settings option - the folder RSS URL is at the bottom.

The following Python code can pull the feed and iterate through it to find article information. At the bottom of this code example, each child represents a possible article, and sub_child represents a property on the article: the URL, the title, etc. I use a variant of this code to help identify important news stories.

import requests
import xml.etree.ElementTree as ET
import logging
import datetime, pytz
import json
import urllib.parse

#tears through the newsblur folder xml searching for <entry> items
def parse_newsblur_xml():
    r = requests.get('NEWSBLUR_FOLDER_RSS')
    if r.status_code != 200:
        print("ERROR: Unable to retrieve address ")
        return "error"
    xml = r.text
    xml_root = ET.fromstring(xml)
    #we search for <entry> tags because each entry tag stores a single article from a RSS feed
    for child in xml_root:
        if not child.tag.endswith("entry"):
            continue
        #if we are down here, the tag is an entry tag and we need to parse out info
        #Grind through the children of the <entry> tag
        for sub_child in child:
            if sub_child.tag.endswith("category"): #article categories
                #call sub_child.get('term') to get categories of this article
            elif sub_child.tag.endswith("title"): #article title
                #call sub_child.text to get article title
            elif sub_child.tag.endswith("summary"): #article summary
                #call sub_child.text to get article summary
            elif sub_child.tag.endswith("link"):
                #call sub_child.get('href') to get article URL

Time Magazine: Google Maps Memory Lane

Quite a few articles are making the rounds this weekend about people finding their deceased loved ones on Google Maps. Here’s one from Time Magazine: Viral Story Is Leading People Down the Sweetest Google Maps Memory Lane. Similar stories are available on CNN and Buzzfeed.

I love these types of articles – finding unexpected uses of technology to connect closer with family and friends. What I think really sells this application of Google Maps is that these are pictures of people in the middle of their everyday lives – they’re not posed, or idealized.

Cloud Build Error – User does not have permission to access app (or it may not exist): The caller does not have permission

Whenever I provision a new Google Cloud project, I always get bitten by this error. I keep forgetting to set up IAM rules to allow Cloud Build access to App Engine.

Screenshot of failed Cloud Build run. Cloud Build does not have permission to access my App Engine instance.
Screenshot of failed Cloud Build run. Cloud Build does not have permission to access my App Engine instance.
Operation completed over 1 objects/8.6 KiB.
BUILD
Already have image (with digest): gcr.io/cloud-builders/gcloud
ERROR: (gcloud.app.deploy) User [[email protected]] does not have permission to access app [APP_ID_REDACTED] (or it may not exist): The caller does not have permission
ERROR
ERROR: build step 0 "gcr.io/cloud-builders/gcloud" failed: exit status 1

To fix this, go into Settings under Cloud Build and enable access to App Engine, and any other cloud service you use in conjunction with Cloud Build. Then wait a moment for the settings to take effect and rerun the build.

Setting up Cloud Build to connect to App Engine.
Setting up Cloud Build to connect to App Engine.

Americans Rank A Google Internship Over A Harvard Degree

I saw this article from Forbes: Americans Rank A Google Internship Over A Harvard Degree and thought it was worth highlighting.

It’s important to do well in school, and having a high undergraduate GPA helps immensely if one decides to go on to graduate school, get a MBA, etc. But an internship or two on a resume helps dramatically in getting that first job – they count as experience, which means you can immediately apply for those jobs that ask for 1 – 3 years of experience. Internships also give you something to talk about during interviews – how you handled difficult situations, how you handle meetings, and all those personality-style questions.

IMO the biggest value of an internship is to understand the corporate environment: learn how to dress, how to interact with colleagues and superiors, and to be able to compare yourself talent-wise and see where you need improvement.

If you’re a Chicago area undergrad looking for an internship, I strongly recommend applying to CME Group and Chase – they pay and treat their interns very well.

SEO Best Practices – Marking Missing Pages With 404

I saw this tweet today that deserved to be highlighted:

Tweet from Google Webmasters Twitter account: Return a 404 code for any pages that are removed.

In short: if you remove a web page, make sure your server is returning 404 to correctly indicate that the page is removed and the URL is invalid.

I see a lot of sites that – for invalid URLs – return a 200 status then an error message in the body of the response. That only serves to confuse crawlers (and there are more crawlers on the web than Google’s).