One of the more ridiculous aspects of the S-1 Form that WeWork filed during their first attempt at an IPO was the fact that the name “Adam” (WeWork’s founder / personality behind the cult Adam Neumann) gets mentioned in it a ludicrous number of times. It’s not unusual for an S-1 Form to mention the founder’s name a couple dozen times, but nowhere near as many times as WeWork’s original S-1 did.
You could go through WeWork’s S-1 and count the number of times “Adam” appears in its text. You could load WeWork’s S-1 into a text editor and have it give you that number. But what if you had to do that for a dozen, or a hundred, or a thousand companies and create a list of the number of times each company’s founder was mentioned in its S-1? You will write a Python script to do just that in my upcoming course.
I’ll guide you through the process of writing that script and running it on not just the text of WeWork’s S-1, but also for other hot tech companies, such as Zoom, Uber, Lyft, and Slack.
It’s just one of the practical things I’ll cover in the Learn Python online course being offered by Computer Coach. Here are the quick details:
What: An introductory Python course!
Where: Online, via Zoom.
When: Monday and Wednesday evenings, from 6 p.m. to 10 p.m., starting Wednesday, September 7th.
How to enroll or find out more: Contact Computer Coach’s Kasandra Perez at kasandra@computercoach.com or (813)-254-6459 to find out more about the course or register.
I’ll be there, providing yeoman service to two coworkers who’ll be speaking at the event…
Alisa Duncan, Senior Developer Advocate at Okta.
First, there’s Alisa Duncan, Senior Developer Advocate at Okta (Auth0’s parent company), who’ll be presenting There’s Safety in Angular, which is scheduled for Wednesday, August 31 at 10:32 a.m. MDT (that’s not a typo, it’s happening at ten thirty-two). Here’s the brief on her talk:
When you use Angular, you know you’ve got a best-in-class framework with all the bells and whistles at your fingertips. But did you know Angular is also a cozy blanket that keeps you safe and secure? Businesses with a security breach in 2021 average over $8 million in remediation, and it can permanently damage their brand. The 2021 OWASP Top 10 list includes broken access control and web injection exploits in their top 3 security risks. This talk will cover web vulnerabilities, risks posed by exposing sensitive information, and how Angular has your back so you can rest easy.
Sam Julien, Director of Developer Relations at Auth0.
Then, there’s my teammate Sam Julien, Director of Developer Relations at Auth0. He’ll be presenting with Cloudinary’s VP of Developer Experience Kim Maida…
Kim Maida, VP of Developer Experience at Cloudinary.
…and their talk is titled RXWut? and scheduled for Wednesday, August 31 at 2:36 p.m. MDT (again, not a typo; it’s happening at two thirty-six). Here’s the abstract:
You’re working on your Angular application late one night and need to handle some data. That means using RxJS, so you think, “Great! People love RxJS and there are tons of docs. This will be easy!” You remember that someone told you “everything is a stream” and “it’s just an array over time” but in practice, those insights haven’t been as helpful as you’d hoped. You also need to manipulate data in the stream, which means: operators! You head to the docs and you’re looking for just the right operator… Distinct until what? What’s a forkJoin? These examples all have to do with multiplying arrays of numbers, but your data isn’t numerical. Okay, what about these weird diagrams? Wait, what the heck do marbles have to do with programming?!
RxJS is fascinating and powerful, but the learning curve for reactive programming can be challenging (to say the least). In this talk, we’ll take a light-hearted approach to demystifying reactive programming concepts, confusing operator names, and much more. Whether you’re already a reactive wizard or still a fledgling Rx apprentice, you’ll laugh (and maybe cry) while learning some new magic.
If you’re attending ng-conf 2022, drop by the Auth0 booth! I’ll be there, and I’ll be pretty easy to spot…
Yours truly, that rare specimen of accordion-playing developer advocate.
I’ve been programming in Python since 1999, and I’ll be teaching Computer Coach’s upcoming 10-week online Learning Python course!
The “TL;DR:”
What: An introductory Python course!
Where: Online, via Zoom.
When: Monday and Wednesday evenings, from 6 p.m. to 10 p.m., starting Wednesday, September 7th.
How to enroll or find out more: Contact Computer Coach’s Kasandra Perez at kasandra@computercoach.com or (813)-254-6459 to find out more about the course or register.
What will you get out of this course?
The biggest things that you’ll get out of this course are the tools to succeed in a tech career, namely:
An introduction to the most-used and most useful parts of the Python programming language,
a solid basis in programming principles,
and a bag of tricks that you can use in your tech career.
The course will use one of the best books on Python out there: Automate the Boring Stuff with Python by Al Sweigart (whom I had the pleasure of meeting in person earlier this year at PyCon):
…but we won’t just stick to the book. We’ll look at all sorts of programming examples and tricks, based on your suggestions or needs. These include (and aren’t limited to):
CoverTron: My generator for cover letters for job applications. I actually used it in my last job search!
Tampa Bay Tech Events Transmogrifier: Every week, I put together a list of tech events for Tampa Bay, culled from Eventbrite and Meetup. It would take me hours to do it by hand, but it’s so much quicker with the automated help of a couple of Python scripts.
Find out when and where a digital photo was taken: When you take a picture with your phone or a present-day digital camera, that picture has EXIF data embedded in it, with the date, time, and location where the photo was taken. I’ll show you how to extract that info!
Editing photos: If you were assigned the task of shrinking a set of 100 photos by 25% (or any other similar basic photo editing task), you could do it manually, or you could make Python do it.
Creating interactive documents with Jupyter Notebook: It’s more than just a Python tool used by data scientists, Nobel Prize winners, and Netflix, but a useful programming environment and operations platform for everyday tasks!
Writing web applications with Flask: Just a Python makes programming much easier, the Python-powered Flask framework makes programming web applications much easier.
Passing interview coding tests: Learn how to deal with the most dreaded part of the interview for a programming job, and why Python is a key part of my coding interview strategy.
Using databases: Using databases is a key part of programming, and luckily, Python comes with a built-in database!
Data science: This is a giant topic and could easily take up the time to do this course three times, but I’d be happy to go over the basics.
Interactive storytelling and games: Python’s quite good at this, and I can walk you through the PyGame framework and Ren’Py interactive story system.
Mobile app development: Yes, there are ways to do mobile app development in Python.
What happens in the course?
This is not a passive course! This isn’t the kind of course where the instructor lectures over slides while you take notes (or pretend to take notes while surfing the web or checking your social media feeds). In this course, you’ll follow along as I write code on my screen. You’ll actively take part in the learning process, entering code, experimenting, making mistakes, correcting those mistakes, and producing working applications. You will learn by doing. At the end of each session, you’ll have a collection of little Python programs that you wrote, and which you can use as the basis for your own work.
The course will start at the most basic level by walking you through the process of downloading and installing the necessary tools to start Python programming. From there, you’ll learn the building blocks of the Python programming language:
Control structures that determine what your programs do,
Data structures to store the information that your programs act on,
Functions and objects to organize your code, and
Using libraries as building blocks for your applications.
Better still, you’ll learn how to think like a programmer. You’ll learn how to look at a goal and learn how you could write a program to meet it, and how that program could be improved or enhanced. You’ll learn skills that will serve you well as you take up other programming languages, and even learn a little bit about the inner workings of computers, operating systems, and the internet.
Zoom and an internet connection. This is an online course, after all.
How do you sign up for the course or find out more?
Once again, you’ll want to contact Computer Coach’s Kasandra Perez at Contact Kasandra Perez at kasandra@computercoach.com or (813)-254-6459 to find out more about the course or register.
…well, at least as far as work goes, it’s all captured in this screenshot as I figure out what I have to do this week:
Tap to view at full size.
The top row contains windows for Xcode and Android Studio, on which I’m putting together the demo apps for a couple of mobile app authentication tutorials that I’m writing for the Auth0 Developer Blog.
StartupBus Florida 2022! Tap to view at full size.
This article is a work in progress — I’m making it available to readers as I write it!
On Wednesday July 27, 2022, 13 people boarded a bus at The Sail on the Riverwalk in downtown Tampa bound for Austin, Texas to participate in a contest unlike any other: StartupBus 2022. I was one of those 13 people, and this is what happened on (and off) that bus.
StartupBus is the Mother of All Hackathons. The first part of the event is a three-day bus ride where buspreneurs (contestants), with help from conductors (coaches), conceive a technology startup, its software, and marketing and business plans. There are a number of buses that start in different places — in 2022, the buses left from California, Mexico City, Cincinnati, and Tampa — and they spend three days making their toward Austin, where their buspreneurs present their startups at the qualifying, semi-final, and final rounds of judging. It’s a road trip, entrepreneurship crash course, competition, and adventure all in one.
Day 1: On the bus from Tampa to Gainesville and Tallahassee
Boarding the bus
At 6:00 a.m., I arrived at The Sail, the designated pickup loacation. It’s a pavilion located downtown, on the Tampa Riverwalk, just a stone’s throw away from the Tampa Convention Center. The buspreneurs were told that the bus would depart at 7, so I expected to be the first one there. Instead, Mandy was there, and so were a handful of buspreneurs. This was a good sign.
The bus should’ve been there too, but it wasn’t. None of our bus contacts were responding to messages or Mandy’s phone calls.
“Let’s just chalk this up to Murphy’s Law and declare 6:45 as ‘panic o’clock,’” I suggested.
Fortunately, she made contact with the bus people at around panic o’clock, and they told us that they were on their way. That gave us a little more time to chat and get to know each other a little more:
Wednesday, 7:16 a.m.: VJ, Ray, Marley, Chevy, and Justin. In the background: Cary. Tap to view at full size.
The slight delay gave us a chance to load up on coffee and a little breakfast food. We started boarding the bus soon afterward:
Wednesday, 7:22 a.m. The buspreneurs get set to board the bus. Tap to view at full size.
Here’s a shot showing Josh’s photobombing prowess:
Wednesday, 7:22 a.m. Me in the foreground, VJ and Josh in the background. Tap to view at full size.
…and shortly after 7:30, our bus started making its way toward the highway.
The secret route
While the buspreneurs knew that the bus would start in Tampa on Wednesday morning and arrive in Austin sometime on Friday evening, they didn’t know what route we’d take or what stops we’d make.
The simplest route from Tampa to Austin takes I-75 north to I-10, and then takes I-10 west, a route 1,200 miles (a little over 1900 km) long. If you were to drive that distance at a consistent 70 miles an hour with no stops at all, you could make the trip in a little over 17 hours. Add stops for activities (more about these later), meals, sleep (at hotels or Airbnbs — we weren’t going to sleep on the bus), and bio breaks, and the trip easily expands to fill three days. At least one of the buspreneurs did some map consulting and guessed our route and where we might end up stopping.
Here’s a map of the route we took:
The route we took from Tampa to Austin. Tap to view at full size.
Opening ceremonies
Shortly after everyone had settled in on the bus, it was time to get started with the opening ceremonies. The buspreneurs were already familiar with us conductors, so we got on with the task of having the mentors say something to inspire them. First Cary…
Wednesday, 7:42 a.m. Cary addresses the troops. Tap to view at full size.
…then Josh:
Wednesday, 7:43 a.m. Tap to view at full size.
Wednesday, 7:43 a.m. The troops watch the opening address. Tap to view at full size.
With the introductory speeches out of the way, the next step was to have the buspreneurs introduce themselves and propose a startup idea.
Wednesday, 7:47 a.m. Chevy proposes “Tinder for puppy playdates.” Tap to view at full size.
Wednesday, 7:49 a.m. VJ proposes an electronic replacement for a first responder standard operating procedure manual. Tap to view at full size.
The buspreneurs got to refine their startup pitches in an online meetup with one of Tampa Bay’s Toastmasters groups, who listened and provided valuable feedback.
After the meetup, the buspreneurs started talking amongst themselves to figure out which startups they should create. Remember, they had only three days to create them!
Wednesday, 9:06 a.m. Tap to view at full size.
Wednesday, 9:47 a.m. Tap to view at full size.
Wednesday, 9:47 a.m. Tap to view at full size.
In the meantime, I got into an extensive conversation with Cary about his life and work, and we discovered that we had both lived in Toronto. Small world!
Here’s an excerpt from the current version of my resume (yes, my resume’s under version control). Note the highlighted entry:
The entry is for Hyve, the startup and application that my StartupBus team built when I rode in 2019. Hyve was a service that let you create “burner” email addresses that relayed email to and from your real email address, allowing you to safely subscribe to services and avoid getting marketing spam or safely communicate with people whom you might not completely trust.
Team Hyve. From left to right: Tracy Ingram, David Castañeda, me, Rina Bane, Justin Linn.
…but the real wins came a little bit afterward when I was interviewing for developer and developer relations jobs a couple of weeks afterward. StartupBus makes for a good story, and in a job interview, it’s the story that “sells” you.
After all, StartupBus is a hackathon where you’re challenged to come up with:
A startup business
and an application that supports that business
on a bus
in three days.
This intrigued the people who interviewed me, which led me to talk about the decisions that shaped the business, which in turn shaped the software. I detailed the challenges of writing business plans and software on a bus, a rumbling, rolling office space with spotty internet access, unreliable power, and the occasional engine breakdown. I also talked about dealing with the compressed timeframe and a few of the tricks we used to get around the limited time, which included getting help from our professional network, taking advantage of crowdsourcing services, and using our media contacts. My StartupBus story played a key part in convincing prospective employers that they wanted to hire me.
StartupBus Florida will depart Tampa, Florida on Wednesday, July 27 and make a 3-day trip with interesting stops and challenges along the way. It will arrive in Austin, Texas on the evening of Friday, July 29, where it will meet with teams from 6 other buses:
On Saturday, July 30, all the teams will assemble at a venue in Austin for the semifinals. Every team will pitch in front of a set of semifinals judges. By the end of the day, a handful of finalists will emerge (Hyve was one of six finalists in 2019).
Those finalists will then go on to the finals, which will take place on Sunday, July 31. They’ll pitch again (and if they’re smart, they’ll have spent the night before reworking their pitch and application) in front of the finals judges, who will select the winner and runners-up.
If you participate in StartupBus, you will come out of it a different person. You will pitch your startup at least a dozen times (and yes, everyone pitches — not just the marketing people, but the creatives and developers, too). You will work on product design. You will work on marketing. You will work on code. And you’ll do it all under far-from-ideal circumstances. StartupBus is a crash course in guerrilla entrepreneurship, and it’s an experience that will serve you well — especially during these economically upside-down times.
And you’d better believe that you’ll have stories to tell, and they’ll help you stand apart from the crowd.
If you had an application or script that uses Selenium and ChromeDriver to control or automate instances of Chrome or Chromium, it’s probably not working right now. Instead, you’re probably seeing error messages that look like this:
Message: unknown error: cannot determine loading status
from unknown error: unexpected command response
(Session info: chrome=103.0.5060.53)
Stacktrace:
0 chromedriver 0x000000010fb6f079 chromedriver + 4444281
1 chromedriver 0x000000010fafb403 chromedriver + 3970051
2 chromedriver 0x000000010f796038 chromedriver + 409656
...and on it goes...
ChromeDriver 103 — or more accurately, ChromeDriver 103.0.5060.53 — works specifically with Chrome/Chromium 103.0.5060.53. If you regularly update Chrome or Chromium and use ChromeDriverManager to keep ChromeDriver’s version in sync with the browser, you’ve probably updated to ChromeDriver 103.0.5060.53, which has a causes commands to ChromeDriver to sometimes fail.
The fix
Luckily, the bug has been fixed in ChromeDriver 104, which works specifically with Chrome 104. This means that if you update to Chrome and ChromeDriver 104, your Selenium / ChromeDriver / Chrome setup will work again.
The challenge is that Chrome 104 is still in beta. As I’m writing this, the Google Chrome Beta site is hosting an installer for Chrome 104, or more accurately, Chrome 104.0.5112.20. The application has the name Google Chrome Beta and is considered a separate app from Google Chrome. This means that you can have the current release and the beta version installed on your machine at the same time.
Once you’ve installed Chrome Beta, you just need to make your Selenium/ChromeDriver application or script use the appropriate version of ChromeDriver. Here’s how I did it in Transmogrifier, my Python script that helps me assemble the Tampa Bay Tech Events list:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
// 1
option = Options()
option.binary_location='/Applications/Google Chrome Beta.app/Contents/MacOS/Google Chrome Beta'
// 2
driver = webdriver.Chrome(service=Service(ChromeDriverManager(version='104.0.5112.20').install()), options=option)
Here are some explanation that match the number comments in the code above:
These lines create an instance of the Options class, which we’re using to specify the directory where the Chrome beta app can be found. We’ll use the instance, options, when we create driver, the object that controls the Chrome beta app.
This constructor creates a WebDriver.Chrome object which will control the Chrome beta app. The service parameter specifies that the driver should be an instance of ChromeDriver 104, and that it should be installed if it isn’t already present on the system. The options parameter specifies that ChromeDriver should drive the version of Chrome located at the directory path specified in the option object: the Chrome beta app.
Once that’s done, I can proceed with my script. Here’s a simplified version of the start of my Transmogrifier script:
from bs4 import BeautifulSoup
// Load the web page whose URL is `url` into
// the browser under script control
driver.get(url)
// Execute any scripts on the page so that
// we can scrape the final rendered version
html = driver.execute_script('return document.body.innerHTML')
// And now it’s time to scrape!
soup = BeautifulSoup(html, 'html.parser')
// ...the rest of the code goes here...