Apparently the first AP CS question was about java.util.ArrayList, and the Google Trends chart for ArrayList shows the same bump on Friday (this chart shows the search interest for ArrayList over the last 3 months):
It’s always fun to see how Google’s search volume changes depending on external events. Try looking at Google Trends whenever a major event occurs and watch the keywords people use.
I’ve been spending the last few days wrapping the WP-CLI application – a command line program to automate the administration of WordPress installations – inside a Java app so I can automate some WordPress work. One of the major bottlenecks was fixing up the correct SSH string to connect to the various WordPress providers.
Initially I was having a bit of difficulty because I misread the wp-cli documentation and I thought the –user argument was the SSH username. When I got that fixed, it turns out that some WordPress hosting services, such as BlueHost, require you to contact their support to activate SSH. I had to connect my application to multiple WordPress hosting services, but in this post I’ll use BlueHost as an example since they’re fairly representative of the work I had to go through.
In BlueHost’s case, having support activate SSH support was a surprisingly painless process – it only took a quick 5 minute text chat where I verified my email address. To build out the proper SSH command, I also needed to look at details provided by cPanel:
All the information you need to build the SSH string is in the General Information section in the above screenshot. Your SSH string should look like this:
php wp-cli.phar plugin list --ssh=<CURRENT_USER>@<SHARED_IP_ADDRESS>:2222/<HOME_DIRECTORY>/public_html --debug
The BlueHost account I’m using as an example is a shared WordPress account, so it listed a shared IP. Make sure to double check the port number (2222 in the above code sample) – the usual SSH port is 22, but BlueHost uses 2222 for shared accounts. Note that I’ve listed an additional folder under the user home directory; the home directory path only takes you to the user’s home directory, but wp-cli needs the path to the WordPress installation, which is usually under another folder (in this case /public_html/ ).
Obviously the top-line theme is how GrubHub and DoorDash take a large proportion of the monies from online orders. But there is a lesser theme that I want to emphasize which is easy to lose in the outrage. Quoted from the article:
DoorDash pays Google an advertising fee to steal customers that are searching for our restaurant name “Saddleback BBQ” and they are redirecting them to their own page. From there a customer can purchase from any BBQ restaurant in Lansing…
Here’s the takeaway: While SEO is important, it’s not the end of the line. You could be the top result for your keywords, for your own business name (which was the case for this BBQ restaurant), and competitors will still take business away from you by running ads on your own name. This shows the power of a Google ad, especially an ad within Google’s Knowledge Panel (the side panel that provides contextual information).
That’s why it’s so critical to buy Google Ads on even searches you’re the top result in: to get rid of competitor ads that are trying to redirect business that should be yours. It might sound like a lot of extra money to spend, but as long as you provide a interesting landing page for the user the additional cost should not be too much.
One of the recurring themes I like to touch on with this site is how important ads revenue is to Google. As Google optimizes their search to show more local and “hyperlocal” content, more space will open up to show ads. Businesses will have a choice: buy up those ad slots, or their competitors will.
Speaking of recipes, I’m also pleased to note that Chipotle published their recipe for guacamole. I enjoy eating at Chipotle when I travel: it’s a good, healthy helping of food in an easily portable burrito.
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:
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:
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
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.
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:
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.
AirTable. I’m surprised that nobody has acquired AirTable yet – it’s a marvelous new take on how spreadsheets and databases can be visualized.
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.
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.
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.
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.
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.
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:
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 xml.etree.ElementTree as ET
import datetime, pytz
#tears through the newsblur folder xml searching for <entry> items
r = requests.get('NEWSBLUR_FOLDER_RSS')
if r.status_code != 200:
print("ERROR: Unable to retrieve address ")
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"):
#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
#call sub_child.get('href') to get article URL