…because this could happen:
Getting my (rubber) ducks in a row
In programming, there’s a term called rubber duck debugging. It’s a problem-solving technique where you describe the problem you’re facing in as simple a way as possible to an inanimate object, such as a rubber duck.
It’s turned out to be a good way to solve many programming problems. When you describe how something should work and then look at the system and see how it isn’t working, it often becomes easy to spot where the issue is.
You could perform the exact same thing with a person — in fact, it’s one of the things that pair programmers are supposed to do — but when another person isn’t available, a rubber duck can come in pretty handy. So I’ve started a collection.
The newest addition is the Einstein duck, located below the big monitor on the left. I supposed I could’ve ordered it from Amazon, but I bought it at the gift shop the History of Science Museum when I visited Oxford last month.
See also…
The linked list exercises continue! In case you missed them, be sure to check out part 1 and part 2 of this linked list series before moving forward…
Adding an item to the start of a linked list
In this article, the first new feature we’ll implement is the ability to add new items to the start of the list. It’s similar to adding an item to the end of a list, which is why I reviewed it above.
The diagram below shows the first two nodes of a linked list. Recall that a linked list’s head
points to its first node and that every node points to the next one:
Here’s how you add a new node to the start of the list. The new node becomes the first node, and the former first node becomes the second node:
Here are the steps:
- Create a new node. In our implementation, newly-created nodes have a next property that points to
null
,nil
, orNone
by default. - If the list is empty (i.e. head points to
null
,nil
, orNone
), adding it to the list is the same thing as adding it to the start of the list. Pointhead
to the new node and you’re done. - If the list is not empty, you need to do just a little more work.
- Point the new node’s
next
property tohead
. This makes the current first node the one that comes after the new node. - Point
head
at the new node. This makes the new node the first one in the list.
- Point the new node’s
Here’s how I implemented this in Python…
# Python
def add_first(self, value):
new_node = Node(value)
# If the list is empty,
# point `head` to the newly-added node
# and exit.
if self.head is None:
self.head = new_node
return
# If the list isn’t empty,
# make the current first node the second node
# and make the new node the first node.
new_node.next = self.head
self.head = new_node
…and here’s my JavaScript implementation:
# JavaScript
addFirst(value) {
let newNode = new Node(value)
// If the list is empty,
// point `head` to the newly-added node
// and exit.
if (this.head === null) {
this.head = newNode
return
}
// If the list isn’t empty,
// make the current first node the second node
// and make the new node the first node.
newNode = this.head
this.head = newNode
}
Inserting a new item at a specified position in the list
So far, we’ve implemented methods to:
- Add a new item to the start of the list, and
- Add a new item to the end of the list.
Let’s do something a little more complicated: adding a new item at a specified position in the list. The position is specified using a number, where 0 denotes the first position in the list.
Here’s how you add a new node at a specified position in the list.
Here are the steps:
- The function has two parameters:
index
: The index where a new node should be inserted into the list, with0
denoting the first item.value
: The value that should be stored in the new node.
- Create a new node,
new_node
, and putvalue
into it. - Use a variable,
current_index
, to keep track of the index of the node we’re currently looking at as we traverse the list. It should initially be set to0
. - Use another variable,
current_node
, which will hold a reference to the node we’re currently looking at. It should initially be set tohead
, which means that we’ll start at the first item in the list. - Repeat the following as long as
current_node
is not referencingnull
,nil
, orNone
:- We’re looking for the node in the position immediately before the position where we want to insert the new node. If
current_index
is one less thanindex
:- Point the new node at the current node’s next node.
- Point the current node at the new node.
- Return
true
, meaning that we successfully inserted a new item into the list
- If we’re here, it means that we haven’t yet reached the node immediately before the insertion point. Move to the next node and increment
current_index
.
- We’re looking for the node in the position immediately before the position where we want to insert the new node. If
- If we’re here, it means that we’ve gone past the last item in the list.
false
, meaning we didn’t insert a new item into the list.
Here’s how I implemented this in Python…
# Python
def insert_element_at(self, index, value):
new_node = Node(value)
current_index = 0
current_node = self.head
# Traverse the list, keeping count of
# the nodes that you visit,
# until you’ve reached the specified node.
while current_node:
if current_index == index - 1:
# We’re at the node before the insertion point!
# Make the new node point to the next node
# and the current node point to the new node.
new_node.next = current_node.next
current_node.next = new_node
return True
# We’re not there yet...
current_node = current_node.next
current_index += 1
# If you’re here, the given index is larger
# than the number of elements in the list.
return False
…and here’s my JavaScript implementation:
// JavaScript
insertElementAt(index, value) {
let newNode = new Node(value)
let currentIndex = 0
let currentNode = this.head
// Traverse the list, keeping count of
// the nodes that you visit,
// until you’ve reached the specified node.
while (currentNode) {
if (currentIndex === index - 1) {
// We’re at the node before the insertion point!
// Make the new node point to the next node
// and the current node point to the new node.
newNode.next = currentNode.next
currentNode.next = newNode
return true
}
// We’re not there yet...
currentNode = currentNode.next
currentIndex++
}
// If you’re here, the given index is larger
// than the number of elements in the list.
return false
}
Deleting an item from a specified position in the list
Now that we can add a new item at a specified position in the list, let’s implement its opposite: deleting an item from a specified position in the list. Once again, the position is specified using a number, where 0 denotes the first position in the list.
Here’s how you delete a new node from a specified position in the list:
Here are the steps:
- The function has a single parameter,
index
: the index of the node to be deleted, with0
denoting the first item in the list. - Use a variable,
current_index
, to keep track of the index of the node we’re currently looking at as we traverse the list. It should initially be set to0
. - Use another variable,
current_node
, which will hold a reference to the node we’re currently looking at. It should initially be set tohead
, which means that we’ll start at the first item in the list. - Repeat the following as long as
current_node
is not referencingnull
,nil
, orNone
:- We’re looking for the node in the position immediately before the position of the node we want to delete. If
current_index
is one less thanindex
:- Point the current node to the next node’s next node, which removes the next node from the list.
- Set both the next node’s
data
andnext
properties tonull
,nil
, orNone
. At this point, this node is no longer in the list and is an “island” — no object points to it, and it doesn’t point to any objects. It will eventually be garbage collected. - Return
true
, meaning that we successfully deleted the item from the list
- If we’re here, it means that we haven’t yet reached the node immediately before the deletion point. Move to the next node and increment
current_index
.
- We’re looking for the node in the position immediately before the position of the node we want to delete. If
- If we’re here, it means that we’ve gone past the last item in the list.
false
, meaning we didn’t delete the item from the list.
Here’s how I implemented this in Python…
# Python
def delete_element_at(self, index):
current_index = 0
current_node = self.head
# Traverse the list, keeping count of
# the nodes that you visit,
# until you’ve reached the specified node.
while current_node:
if current_index == index - 1:
# We’re at the node before the node to be deleted!
# Make the current node point to the next node’s next node
# and set the next node’s `data` and `next` properties
# to `None`.
delete_node = current_node.next
current_node.next = delete_node.next
delete_node.data = None
delete_node.next = None
return True
# We’re not there yet...
current_node = current_node.next
current_index += 1
# If you’re here, the given index is larger
# than the number of elements in the list.
return False
…and here’s my JavaScript implementation:
// JavaScript
deleteElementAt(index) {
let currentIndex = 0
let currentNode = this.head
// Traverse the list, keeping count of
// the nodes that you visit,
// until you’ve reached the specified node.
while (currentNode) {
if (currentIndex === index - 1) {
// We’re at the node before the node to be deleted!
// Make the current node point to the next node’s next node
// and set the next node’s `data` and `next` properties
// to `null`.
const deleteNode = currentNode.next
currentNode.next = deleteNode.next
deleteNode.data = null
deleteNode.next = null
return true
}
// We’re not there yet...
currentNode = currentNode.next
currentIndex++
}
// If you’re here, the given index is larger
// than the number of elements in the list.
return false
}
The classes so far
Let’s take a look at the complete Node
and LinkedList
classes so far, in both Python and JavaScript.
Python
# Python
class Node:
def __init__(self, data):
self.data = data
self.next = None
def __str__(self):
return f"{self.data}"
class LinkedList:
def __init__(self):
self.head = None
def __str__(self):
if self.head is None:
return('Empty list.')
result = ""
current_node = self.head
while current_node:
result += f'{current_node}\n'
current_node = current_node.next
return result.strip()
def add_last(self, value):
new_node = Node(value)
# If the list is empty,
# point `head` to the newly-added node
# and exit.
if self.head is None:
self.head = new_node
return
# If the list isn’t empty,
# traverse the list by going to each node’s
# `next` node until there isn’t a `next` node...
current_node = self.head
while current_node.next:
current_node = current_node.next
# If you’re here, `current_node` is
# the last node in the list.
# Point `current_node` at
# the newly-added node.
current_node.next = new_node
def __len__(self):
count = 0
current_node = self.head
# Traverse the list, keeping count of
# the nodes that you visit,
# until you’ve gone past the last node.
while current_node:
current_node = current_node.next
count += 1
return count
def get_element_at(self, index):
current_index = 0
current_node = self.head
# Traverse the list, keeping count of
# the nodes that you visit,
# until you’ve reached the specified node.
while current_node:
if current_index == index:
# We’re at the node at the given index!
return current_node.data
# We’re not there yet...
current_node = current_node.next
current_index += 1
# If you’re here, the given index is larger
# than the number of elements in the list.
return None
def set_element_at(self, index, value):
current_index = 0
current_node = self.head
# Traverse the list, keeping count of
# the nodes that you visit,
# until you’ve reached the specified node.
while current_node:
if current_index == index:
# We’re at the node at the given index!
current_node.data = value
return True
# We’re not there yet...
current_node = current_node.next
current_index += 1
# If you’re here, the given index is larger
# than the number of elements in the list.
return False
def add_first(self, value):
new_node = Node(value)
# If the list is empty,
# point `head` to the newly-added node
# and exit.
if self.head is None:
self.head = new_node
return
# If the list isn’t empty,
# make the current first node the second node
# and make the new node the first node.
new_node.next = self.head
self.head = new_node
def insert_element_at(self, index, value):
new_node = Node(value)
current_index = 0
current_node = self.head
# Traverse the list, keeping count of
# the nodes that you visit,
# until you’ve reached the specified node.
while current_node:
if current_index == index - 1:
# We’re at the node before the insertion point!
# Make the new node point to the next node
# and the current node point to the new node.
new_node.next = current_node.next
current_node.next = new_node
return True
# We’re not there yet...
current_node = current_node.next
current_index += 1
# If you’re here, the given index is larger
# than the number of elements in the list.
return False
def delete_element_at(self, index):
current_index = 0
current_node = self.head
# Traverse the list, keeping count of
# the nodes that you visit,
# until you’ve reached the specified node.
while current_node:
if current_index == index - 1:
# We’re at the node before the node to be deleted!
# Make the current node point to the next node’s next node
# and set the next node’s `data` and `next` properties
# to `None`.
delete_node = current_node.next
current_node.next = delete_node.next
delete_node.data = None
delete_node.next = None
return True
# We’re not there yet...
current_node = current_node.next
current_index += 1
# If you’re here, the given index is larger
# than the number of elements in the list.
return False
JavaScript
// JavaScript
class Node {
constructor(data) {
this.data = data
this.next = null
}
toString() {
return this.data.toString()
}
}
class LinkedList {
constructor() {
this.head = null
}
toString() {
if (!this.head) {
return('Empty list.')
}
let output = ""
let currentNode = this.head
while (currentNode) {
output += `${currentNode.data.toString()}\n`
currentNode = currentNode.next
}
return output.trim()
}
addLast(value) {
let newNode = new Node(value)
// If the list is empty,
// point `head` to the newly-added node
// and exit.
if (this.head === null) {
this.head = newNode
return
}
// If the list isn’t empty,
// traverse the list by going to each node’s
// `next` node until there isn’t a `next` node...
let currentNode = this.head
while (currentNode.next) {
currentNode = currentNode.next
}
// If you’re here, `currentNode` is
// the last node in the list.
// Point `currentNode` at
// the newly-added node.
currentNode.next = newNode
}
getCount() {
let count = 0
let currentNode = this.head
// Traverse the list, keeping count of
// the nodes that you visit,
// until you’ve gone past the last node.
while (currentNode) {
currentNode = currentNode.next
count++
}
return count
}
getElementAt(index) {
let currentIndex = 0
let currentNode = this.head
// Traverse the list, keeping count of
// the nodes that you visit,
// until you’ve reached the specified node.
while (currentNode) {
if (currentIndex === index) {
// We’re at the node at the given index!
return currentNode.data
}
// We’re not there yet...
currentNode = currentNode.next
currentIndex++
}
// If you’re here, the given index is larger
// than the number of elements in the list.
return null
}
setElementAt(index, value) {
let currentIndex = 0
let currentNode = this.head
// Traverse the list, keeping count of
// the nodes that you visit,
// until you’ve reached the specified node.
while (currentNode) {
if (currentIndex === index) {
// We’re at the node at the given index!
currentNode.data = value
return true
}
// We’re not there yet...
currentNode = currentNode.next
currentIndex++
}
// If you’re here, the given index is larger
// than the number of elements in the list.
return false
}
addFirst(value) {
let newNode = new Node(value)
// If the list is empty,
// point `head` to the newly-added node
// and exit.
if (this.head === null) {
this.head = newNode
return
}
// If the list isn’t empty,
// make the current first node the second node
// and make the new node the first node.
newNode = this.head
this.head = newNode
}
insertElementAt(index, value) {
let newNode = new Node(value)
let currentIndex = 0
let currentNode = this.head
// Traverse the list, keeping count of
// the nodes that you visit,
// until you’ve reached the specified node.
while (currentNode) {
if (currentIndex === index - 1) {
// We’re at the node before the insertion point!
// Make the new node point to the next node
// and the current node point to the new node.
newNode.next = currentNode.next
currentNode.next = newNode
return true
}
// We’re not there yet...
currentNode = currentNode.next
currentIndex++
}
// If you’re here, the given index is larger
// than the number of elements in the list.
return false
}
deleteElementAt(index) {
let currentIndex = 0
let currentNode = this.head
// Traverse the list, keeping count of
// the nodes that you visit,
// until you’ve reached the specified node.
while (currentNode) {
if (currentIndex === index - 1) {
// We’re at the node before the node to be deleted!
// Make the current node point to the next node’s next node
// and set the next node’s `data` and `next` properties
// to `null`.
const deleteNode = currentNode.next
currentNode.next = deleteNode.next
deleteNode.data = null
deleteNode.next = null
return true
}
// We’re not there yet...
currentNode = currentNode.next
currentIndex++
}
// If you’re here, the given index is larger
// than the number of elements in the list.
return false
}
}
Coming up next
It’s time to reverse that list!
Previously in this series
- How to solve coding interview questions: Linked lists, part 2
- How to solve coding interview questions: Linked lists, part 1
- How to solve coding interview questions: Finding the first NON-recurring character in a string in Swift
- How to solve coding interview questions: Looking deeper into finding the first NON-recurring character in a string
- How to solve coding interview questions: The first NON-recurring character in a string
- Coding interview questions: “First recurring character” in Swift
- How to solve coding interview questions: The first recurring character in a string
- I Has the Dumb (or: How I Embarrassed Myself in My Interview with Google) — from way back in 2013
Here’s the list of tech, entrepreneur, and nerd events for Tampa Bay and surrounding areas for the week of Monday, July 25 through Sunday, July 31, 2022.
Every week, with the assistance of a couple of Jupyter Notebooks that I put together, I compile this list for the Tampa Bay tech community.
As far as event types go, this list casts a rather wide net. It includes events that would be of interest to techies, nerds, and entrepreneurs. It includes (but isn’t limited to) events that fall under the category of:
- Programming, DevOps, systems administration, and testing
- Tech project management / agile processes
- Video, board, and role-playing games
- Book, philosophy, and discussion clubs
- Tech, business, and entrepreneur networking events
- Toastmasters (because nerds really need to up their presentation game)
- Sci-fi, fantasy, and other genre fandoms
- Anything I deem geeky
By “Tampa Bay and surrounding areas”, this list covers events that originate or are aimed at the area within 100 miles of the Port of Tampa. At the very least, that includes the cities of Tampa, St. Petersburg, and Clearwater, but as far north as Ocala, as far south as Fort Myers, and includes Orlando and its surrounding cities.
This week’s events
Monday, July 25
Join us in a big get-together at The Sail (located on the Riverwalk and right by the Convention Center) on Monday, July 25th at 6:30 p.m. as we celebrate the return of StartupBus and give the coders, entrepreneurs, creatives, and coaches of StartupBus Florida a grand send-off!
Group | Event Name | Time |
---|---|---|
Rafael Stuchiner | Blockchain, Bitcoin, Crypto! What’s all the Fuss?~~~Tampa, FL | See event page |
RGANetwork.net | Downtown St Pete Professionals Networking Lunch~ Fords Garage | See event page |
Rafael Stuchiner | Blockchain, Bitcoin, Crypto! What’s all the Fuss?~~~St. Petersburg, FL | See event page |
Young Professionals Networking JOIN in and Connect! | In person at Fords Garage St Pete | 11:00 AM |
JobFairX | Tampa Job Fair – Tampa Career Fair | 11:00 AM – 2:00 PM EDT |
Professional Business Networking with RGAnetwork.net | Virtual Networking Lunch | 11:30 AM |
Entrepreneurs & Business Owners of Sarasota & Bradenton | Virtual Networking Lunch Monday | 11:30 AM |
Christian Professionals Network Tampa Bay | Live Online Connection Meeting- Monday | 11:30 AM |
Professional Business Networking with RGAnetwork.net | St. Pete Networking Lunch! Fords Garage! Monday’s | 11:30 AM |
Thinkful Tampa | Thinkful Webinar || Data Science vs. Data Analytics | 12:00 PM – 1:30 PM EDT |
Work From Home -Online Business Opportunities and Networking | Learn How You Can Create A Crazy Side Income Through LinkedIn | 3:00 PM |
Tampa Financial Freedom Meetup Group | HOW TO CREATE A EASY INCOME ON LINKEDIN | 3:00 PM |
Tampa St Pete Stocks and Options Trading Group | Success in Stagflation: Learn to Protect Your Wealth | 4:00 PM |
SCIPS, a 50+ Tampa Bay Singles Club | EUCHRE, Rummy Q and other Board Games for ENTHUSIASTIC GAME PLAYERS | 4:00 PM |
High Tech Connect | July Tech Fest | 5:00 PM |
High Tech Connect | July Tech Fest | 5:00 PM – 8:00 PM EDT |
Thinkful Tampa | Thinkful Webinar || Intro To Data Analytics: Tableau Basics | 6:00 PM – 7:30 PM EDT |
Brews N Board Games | Board Game Night at Persimmon Hollow Flamingo Crossings | 6:00 PM |
Tampa Bay Tabletoppers | Monday Feast & Game Night | 6:00 PM |
Beginning Web Development | Weekly Learning Session | 6:00 PM |
Board Game Meetup: Board Game Boxcar | Monday Weekly Board Game Night! (Lazy Moon Colonial Location) | 6:00 PM |
BerLagmark – Sarasota Amtgard | Monday Night Fighter Practice! | 6:00 PM |
Critical Hit Games | MTG: Commander Night | 6:00 PM |
Toastmasters District 48 | Wesley Chapel Speaks Toastmasters | 6:30 PM |
Coders, Creatives, and Craft Beer | StartupBus Send-Off at the Sail Pavilion — Monday, July 25th! | 6:30 PM |
Toastmasters District 48 | North Port Toastmasters Meets Online!! | 6:30 PM |
Startup Bus | StartupBus Send-Off at the Sail Pavilion — Monday, July 25th! | 6:30 PM – 9:30 PM EDT |
Bradenton Photo Group | Camera Menus and Photography Tutorial | 6:30 PM |
Tampa Bay Gaming: RPG’s, Board Games & more! | Board Game Night at Armada Games | 7:00 PM |
Tampa Hackerspace | InkStitch 101 (THS Members Only) | 7:00 PM |
Tampa – Sarasota – Venice Trivia & Quiz Meetup | Trivia Night – Motorworks Brewing Smartphone Trivia Game Show | 7:00 PM |
Learn-To-Trade Crypto – Online (As Seen on Orlando Sentinel) | Learn-To-Trade Q&A (0NLINE) | 7:00 PM |
Learn-To-Trade Forex – Online (As Seen on Orlando Sentinel) | Learn-To-Trade Q&A (ONLINE) | 7:00 PM |
Light Study PRO – A Photography Workshop for Emerging Pros | Members as far back as 2008 can access their photos | 7:00 PM |
Central Florida AD&D (1st ed.) Grognards Guild | World of Greyhawk: 1E One-Shots | 7:30 PM |
Tampa / St Pete Business Connections | Monday Virtual Business Introductions | 11:30 PM |
Tuesday, July 26
Wednesday, July 27
Thursday, July 28
Group | Event Name | Time |
---|---|---|
Pasco County Young Entrepreneurs/Business Owners All Welcome | Happy Hangar Early Bird Professionals Networking | 7:30 AM |
Wesley Chapel, Trinity, New Tampa, Business Professionals | Business Over Breakfast ~ Happy Hangar IN PERSON JOIN US! | 7:30 AM |
Young Professionals Networking JOIN in and Connect! | Tampa Young Professionals Virtual Networking Thursday Morning All WElCOME | 7:30 AM |
Professional Business Networking with RGAnetwork.net | Virtual Networking Breakfast Thursday’s | 7:30 AM |
Business Networking Weekly Meeting for Local Professionals | Business Networking for Local Professionals | 8:00 AM |
Orlando Melrose Makers | In-Person: Makerspace Open Lab | 10:30 AM |
Block Co-op – Bitcoin Crypto Blockchain Orlando | Crypto Set-up Class -Limited to 5 Seats Only | 11:00 AM |
Young Professionals Networking JOIN in and Connect! | The Founders Meeting where it all Began! JOIN us! Bring a guest and get a gift | 11:00 AM |
Florida Startup: Idea to IPO | How to Cut Product Development Costs by up to 50%! | 11:00 AM |
EmpireToday Networking Brunch | EmpireToday Commercial Partners Brunch | 11:00 AM |
Tampa / St Pete Business Connections | Clearwater/Central Pinellas Networking Lunch | 11:00 AM |
Tampa Bay Business Networking Happy Hour/Meetings/Meet Up | Pinellas County’s Largest Networking Lunch and your invited! | 11:00 AM |
Business Game Changers Group | Clearwater Professional Networking Lunch | 11:00 AM |
Network Professionals Inc. of South Pinellas (NPI) | NPI Power Lunch – Exchange Qualified Business Referrals | 11:30 AM |
Pasco County Young Entrepreneurs/Business Owners All Welcome | Wesley Chapel Professional Networking Lunch at Chuck Lager America’s Tavern | 11:30 AM |
Tampa Bay Business Networking Meetings & Mixers | Brandon Networking Professionals Networking Lunch | 11:30 AM |
Tampa Cybersecurity Training | Lunch & Learn: How to Beat the ATS | 12:00 PM |
“Learn and Earn” Millionaire Mind Secrets & Networking | Online Zoom! Millionaire Mind Lunch; Book Club and Networking! | 12:00 PM |
Tampa Bay Tech Career Advice Forum | Lunch & Learn: How to Beat the ATS | 12:00 PM |
Thinkful Tampa | Thinkful Webinar || What is UX/UI Design? | 12:00 PM – 1:30 PM EDT |
StartUp Xchange | Startup Strategy Office Hours | 2:30 PM |
Tampa Bay Amazon Sellers E-commerce Meetup | Amazon Sellers, How to Rank Higher & Get More Traffic using SmartScout (Webinar) | 3:00 PM |
Free Video Production Classes – TV/Internet | YouTube Basics (ONLINE CLASS) – FREE for Hillsborough County Residents | 3:00 PM |
Explorations in Philosophy | Introduction to Philosophy Ch.8 | 5:00 PM |
Tampa – Sarasota – Venice Trivia & Quiz Meetup | Trivia Night – Bunkers Bar of Sun City Center Smartphone Trivia Game Show | 5:00 PM |
Network After Work Tampa – Networking Events | Tampa at Hooch & Hive | 6:00 PM |
Magic the Gathering Tampa/Brandon/St Pete | Nerdy Needs (Casual Thursday Commander Night) | 6:00 PM |
St Pete Business Club | St. Pete Beach Rooftop Networking After-Hours Event | 6:00 PM |
Tampa Bay Gaming: RPG’s, Board Games & more! | D&D Adventurers League at Critical Hit Games | 6:00 PM |
Network After Work | Network After Work Tampa at Hooch & Hive | 6:00 PM – 8:00 PM EDT |
Tampa Hackerspace | Phoenix Board Game Night | 6:00 PM |
Tampa JPMorgan Chase & Co. Technology Events | JPMC Tampa Tech Diversity Networking Event (in person) | 6:00 PM |
Orlando Board Gaming Weekly Meetup | Central Florida Board Gaming at The Collective | 6:00 PM |
Tampa Bay Data Engineering Group | TBDEG – Architecture of Apache Iceberg with Alex Merced! | 6:00 PM |
Brandon and Seffner area AD&D and Rifts (Palladium) Group | 1st ed AD&D Campaign. | 6:00 PM |
Critical Hit Games | Warhammer Night | 6:00 PM |
Tampa Business Club/Networking After Hours | St Pete Rooftop Networking After-Hours social | 6:00 PM |
Black Orlando Tech (BOT) | Intro to Web 3 | 6:00 PM |
Tampa Bay Data Science Group | PyLadies/TBDSG: Customer Lifetime Value | 6:00 PM |
TampaBay PyLadies | Customer Lifetime Value with Python | 6:00 PM |
Seasoned Entrepreneurs 40+ | Introductory Networking Event | 6:00 PM |
Toastmasters District 48 | St Pete Beach Toastmasters In Person + Zoom Group: Improve Your Public Speaking! | 6:30 PM |
Tampa Writers Alliance | Tampa Writers Alliance Poetry Group | 6:30 PM |
Bradenton Photo Group | Light Basics – Working with Flash | 6:30 PM |
Tampa Ybor Free Writing Group | Writing Meetup | 6:30 PM |
Tampa Bay Technology Center | WordPress | 7:00 PM |
3D Printing Orlando | Intermediate TinkerCAD 3D Design | 7:00 PM |
Live streaming production and talent | Live streaming production and talent | 7:00 PM |
Tampa Hackerspace | 3D Printing Guild | 7:00 PM |
Tampa Bay Bitcoin | Bitcoin Social | 7:30 PM |
Orlando Lady Developers Meetup | Coding Challenges with Vanessa | 8:00 PM |
Thinkful Tampa | Thinkful Webinar || UX/UI Design: Wireframes and Prototypes | 9:00 PM – 10:30 PM EDT |
Friday, July 29
Group | Event Name | Time |
---|---|---|
RGAnetwork.net | International Professional Networking JOIN us to grow your business | See event page |
Winter Park Toastmasters – Learn while having FUN! | Improve your communication, listening, and leadership skills | 7:15 AM |
Agile Orlando | Agile in the Morning | 7:30 AM |
Toastmasters District 48 | Trinity Odessa Toastmasters | 8:00 AM |
Laid Back Leads Group | Laid Back Leads Group | 8:00 AM |
Brandon Biz Pros | Build your Business with Brandon Biz Pros | 8:30 AM |
Toastmasters District 48 | Real Talkers #7306 | 9:15 AM |
Christian Professionals Network Tampa Bay | Improve Speaking Skills & Build Confidence | 9:25 AM |
Tampa / St Pete Business Connections | International Professionals Networking Meeting | 11:30 AM |
Professional Business Networking with RGAnetwork.net | Friday International Business Introductions at McAllisters Westshore | 11:30 AM |
Professional Business Networking with RGAnetwork.net | In PERSON Networking Lunch Sabal Park/Brandon Reserve your seat | 11:30 AM |
Tampa / St Pete Business Connections | International Professionals Networking Meeting | 11:30 AM |
Young Professionals Networking JOIN in and Connect! | Friday Business Introductions JOIN us at Cafe Delanie All Welcome | 11:30 AM |
Tampa Bay Business Networking Meetings & Mixers | Friday Business Introductions! | 11:30 AM |
Tampa Bay Business Networking Happy Hour/Meetings/Meet Up | International Networking Westshore McAlisters Deli | 11:30 AM |
Tampa Otaku | Tampa Bay Comic Con 2022 | 12:00 PM |
Thinkful Tampa | Thinkful Webinar || Data Analytics: Tools of the Trade | 12:00 PM – 1:30 PM EDT |
Traction REIA Tampa & Sarasota | IN-PERSON * Traction Sarasota Networking Luncheon | 12:00 PM |
United Way /Neighborhood Centers for Families | TECHquity: Coding With Disney STEMinar | 1:00 PM – 4:00 PM EDT |
Learn-To-Trade Stocks – Online (As Seen on Orlando Sentinel) | Monster Learn-To-Trade Stocks | 5:00 PM |
Clermont Nerd Games | Board Game Night! | 5:00 PM |
Meeple Movers Gaming Group | Let’s Play Games ONLINE on Fridays! | 5:30 PM |
Tampa Gaming Guild | Friday Board Game Night | 5:30 PM |
Toastmasters District 48 | MESSAGE CRAFTERS | 5:30 PM |
Thoughtful Writing | Philosophy in Writing | 6:00 PM |
Thinkful Tampa | Thinkful Webinar || UX/UI Design: Creating A Design System | 6:00 PM – 7:30 PM EDT |
Tampa Bay Gaming: RPG’s, Board Games & more! | Board Game night at The Strange Realms in Carrollwood Friday, 6 PM | 6:00 PM |
Critical Hit Games | MTG: Commander FNM | 6:00 PM |
Orlando Adventurer’s Guild | Canon’s Custom Campaign Moonsea Tour – DM Canon (Tier 3) | 7:00 PM |
Learn-To-Trade Crypto – Online (As Seen on Orlando Sentinel) | Learn-To-Trade Advanced Strategies (ONLINE & OFFICE) | 7:00 PM |
Saturday, July 30
Group | Event Name | Time |
---|---|---|
VIP*NCCC | Career Event for University of South Florida Students | See event page |
Doris Muller for NPI Westchase Chapter | Business Networking Event for Local Professionals | See event page |
Central Florida Philosophy Meetup | Wake Up and Think Clearly Saturday morning share and discuss. | 7:00 AM |
Toastmasters Division G | Early Bird Ocala | 8:00 AM |
Cryptocurrency/Blockchain Education – Palm Harbor | Crypto over Coffee | 8:45 AM |
Florida Center for Creative Photography | FREE – Learn Your Camera Series, part 3 — ISO & Exposure | 9:00 AM |
Tampa Hackerspace | Steel TIG Welding Safety and Basic Usage (Members Only) | 9:00 AM |
Gen Geek | Bubble Run Scheduled ( same venue new date) | 9:00 AM |
Saint Petersburg Introverts Socializing (Ages 25-40) | Tampa Bay Comic Con | 9:30 AM |
Gen Geek | Tampa Comic Convention | 9:30 AM |
Chess Republic | Coffee & Chess: Tampa Midtown | 9:30 AM |
Critical Hit Games | Flames of War Christmas in July Tournament | 10:00 AM |
Orlando Lady Developers Meetup | Code with me – learning sessions weekly on Saturdays | 10:00 AM |
Toastmasters Division E | Keynotes and More Advanced Toastmasters Fifth Saturday Meeting | 10:30 AM |
Orlando Melrose Makers | In-Person: Makerspace Open Lab | 10:30 AM |
Geekocracy! | Tampa Comic Con | 10:30 AM |
Oviedo Middle Aged Gamers (OMAG) | Bravo Group Campaign Continues | 11:00 AM |
Thinkful Tampa | Thinkful Webinar || Learn Data Analytics With Thinkful | 12:00 PM – 1:30 PM EDT |
Lithia Chess Meetup Group | (Chess in the Park) Chess at Park Square Plaza | 12:00 PM |
Dungeons and Dragons 5e – Beginners Meetup Group | The Lost Mines Campaign-Limited Space | 12:00 PM |
The Maker Team – Plant City | Regular Monthly Meetup | 1:00 PM |
Suncoast Makers | FREE Fab Lab Orientation | 1:00 PM |
Casual Scrabble Play | Anyone up for Scrabble? | 2:00 PM |
Socrates Cafe – “The unexamined life is not worth living” | ONLINE: “Adam Smith & The Wealth of Nations” Part 3 | 3:00 PM |
Tampa Bay Gaming: RPG’s, Board Games & more! | Saturday MTG Draft at Hammerfall Games and Collectibles | 3:00 PM |
Tampa Bay Tabletoppers | Game Day! | 4:00 PM |
Lithia Dungeons & Dragons And Gaming Guild | RIFTs (Palladium Games) | 6:00 PM |
Thinkful Tampa | Thinkful Webinar || Data Science vs. Data Analytics | 6:00 PM – 7:30 PM EDT |
Brandon and Seffner area AD&D and Rifts (Palladium) Group | Rifts | 6:00 PM |
Nerdbrew Events | Community Hang-out Night | 7:00 PM |
Nerd Night Out | NB Community Hang-out Night! | 7:00 PM |
Florida Gulf Coast Chapter of Sisters in Crime | “Who Killed the Circus Queen?” Murder Mystery Trolley Tour FLGC Special Event | 7:30 PM |
Central Florida AD&D (1st ed.) Grognards Guild | THE ONE-SHOT GUILD | 8:00 PM |
Thinkful Tampa | Thinkful Webinar || Intro To Data Analytics: Tableau Basics | 9:00 PM – 10:30 PM EDT |
Sunday, July 31
Do you have any events or announcements that you’d like to see on this list?
Let me know at joey@joeydevilla.com!
Join the mailing list!
If you’d like to get this list in your email inbox every week, enter your email address below. You’ll only be emailed once a week, and the email will contain this list, plus links to any interesting news, upcoming events, and tech articles. Join the Tampa Bay Tech Events list and always be informed of what’s coming up in Tampa Bay!
StartupBus 2022 happens in less than a week! For the benefit of the people who’ll be participating in this mobile hackathon — as well as those who are still thinking about signing up (it’s not too late!), here are some protips that you might find handy.
Nick Singh’s Win Hackathons in 2022: A Step-by-Step Guide
Nick Singh, a developer on Facebook’s Growth team, author of Ace the Data Science Interview and Ace the Data Job Hunt, and creator of a monthly tech career newsletter, recently wrote a decent-size guide on winning hackathons — Win Hackathons in 2022: A Step-by-Step Guide — and it’s good.
If you read only one guide for winning hackathons, read this one. Among his tips:
- The demo should be the center of your project. Your pitch should revolve around the demo, and the demo should be captivating.
- Don’t do “design by committee.” As Nick puts it: “You want to tackle an idea when—and only when—at least one person is a true believer. Going with everybody’s second favorite idea is disheartening and ultimately dangerous.”
- Stick with tools you know well and can rely on. You’re under a lot of time pressure on StartupBus, and there are a number of “unknown unknowns” you’ll have to contend with. These challenges will be much worse if you’re using StartupBus as an opportunity to try out new tools — you’ll be climbing up a learning curve while trying to get an application running under tricky conditions.
- Ship the MVP. “MVP” in this case means “Minimum Viable Product,” a product that does just enough for customers to be willing to pay for it. Stick to the main functionality, avoid adding unnecessary features, run it locally on your computer if you can, skip or use smiulate login if you can do that, and so on.
How to win $60,000 in a Web 3.0 Hackathon
StartupBus Florida will provide some utilities and other goodies for anyone who wants to work on a Web 3.0 project. I personally think that Web 3.0 is still a lot of snake oil and NFTs are basically FourSquare mayorships for JPEGs, but others on the team think that it’s the hottest thing of the moment, and I’m here to support StartupBus projects. I leave it to the buspreneurs and readers to make their own call.
With that in mind, the YouTube channel Dapp University has a video covering strategies for getting the most out of a Web 3.0 hackathon, a good number of which are applicable to hackathons in general.
How to Win ANY Hackathon — Everything You Need to Know
Need a “how to win a hackathon” video that’s a little less crypto-bro-y? Maria Sikovets’ video is for you.
How to win a hackathon? 12-step recipe from Apptension
Apptension, a software development consultancy based in Poland, has a 12-step recipe for winning hackathons, both virtual and in-person.
Among their tips:
- Map out your project. “Before you start coding, gather your team and walk them through the product you’re making so that everyone gets it 100%.”
- Think like a judge. Remember, the winner is determined by a panel of judges, who”ll judge startups based on the pitches.
- Get some sleep. Sleep deprivation ruins your judgement, and a lot of hackathon activity is making judgement calls.
9 Ways to Win a Hackathon… Without Coming in First Place
I was a buspreneur on StartupBus Florida 2019, and our team made it all the way to the finals and was the first runner-up. We didn’t come in first place, but we won in different ways. For me, doing well in StartupBus gave me a great resume item that most people didn’t have, and that helped me land my last two jobs.
There are all sorts of ways to win StartupBus, even if you don’t come in first place, and even if you don’t make it to the finals or even the seminfinals. This article points out different ways of viewing success at StatupBus. Check it out!
Everything you need to know to win StartupBus is in this podcast
Gimlet Media’s Startup podcast sent a reporter to join the New York City StartupBus for the 2017 event, and the result was a five-part series that tells the story of the buspreneurs on that bus.
Before going on StartupBus 2019, I listened to this podcast in its entirety — twice — to get a better feel for what the experience would be like and to try to glean insights into what would give me and my team better odds of winning.
I wrote a five-part series called Everything you need to know to win StartupBus is in this podcast, where I share notes on every episode of the podcast series. Check it out, and learn!
We’ve all been there.
“To sustain the United States’ technology leadership in the face of China’s formidable economic and military challenge,” write Graham Allison, a professor of government at the Harvard Kennedy School and Eric Schmidt, former CEO and executive chairman of Google in Foreign Policy, “U.S. President Joe Biden should launch an urgent drive to recruit and retain 1 million tech superstars from around the world by the end of his first term in office.”
For the want of a green card (or: How the 5G story could’ve been very different)
Their article, The U.S. Needs a Million Talents Program to Retain Technology Leadership, starts with a story about one key player we lost in our failure to take in new people.
In 2009, Erdal Arikan, a Turkish graduate of the California Institute of Technology and MIT published a paper that solved a big information theory problem. He could’ve continued his work in the U.S., but he had to leave because he couldn’t get an academic appointment or sponsorship to stay. He returned to Turkey, turned to China, and Huawei — yes, that Huawei — used his work to create 5G solutions.
The article sums us the situation like so:
And while Huawei has produced one-third of the 5G infrastructure now operating around the world, the United States does not have a single major company competing in this race. Had the United States been able to retain Arikan—simply by allowing him to stay in the country instead of making his visa contingent on immediately finding a sponsor for his work—this history might well have been different.
And with the recent discovery that Huawei equipment installed as part of U.S. communications infrastructure could have a secondary purpose disrupting nuclear arsenal communications, the magnitude of our failure to let Arikan stay in the country has become even more apparent.
It’s the space race all over again
China’s leader Xi Jinping said it himself: “technological innovation has become the main battleground of the global playing field, and competition for tech dominance will grow unprecedentedly fierce.”
In 2001, China was still behind technologically. But in the space of only a couple of decades, they’ve leapfrogged the West in communications, facial and voice recognition, other aspects of AI, and green technology, and their education system is producing four times the STEM bachelor’s degrees and twice as many graduate degrees.
Their insularity remains their Achilles’ heel. They naturalize fewer than 100 citizens a year, while the U.S. does so with 1 million a year. That’s a difference of four orders of magnitude.
And what a difference it makes! Half of all U.S. unicorns were founded or co-founded by immigrants, and there are so many big-ass, big-deal companies founded or run by people born outside the U.S.:
Big-ass company | Founder or leader | Where they were born |
Auth0 | Eugenio Pace, founder | Argentina |
Cloudflare | Michelle Zatlyn, founder | Canada |
Credit Karma | Kenneth Lin, founder | China |
Crowdstrike | Dmitri Alperovitch, founder | Russia |
Databricks | Ali Ghodsi, founder | Iran |
Discord | Stanislav Vishnevsky, founder | Ukraine |
Eventbrite | Renaud Visage, founder | France |
Evernote | Stepan Pachikov, founder | Azerbaijan |
Sergei Brin, founder | Russia | |
Sundar Pinchai, CEO | India | |
Instacart | Apoorva Mehta, founder | India |
Instacart | Fidji Simo, CEO | France |
Microsoft | Satya Nadella, CEO | India |
Nvidia | Jensen Huang, founder | Taiwan |
Palantir | Peter Thiel, founder | Germany |
Peloton | Yony Feng | China |
Robinhood | Vlad Tenev, founder | Bulgaria |
Slack | Stewart Butterfield, cofounder | Canada |
SpaceX, Tesla | Elon Musk, CEO | South Africa |
Sprinklr | Ragy Thomas, founder | India |
Stripe | Patrick and John Collison, founders | Ireland |
Uber | Garrett Camp, founder | Canada |
Warby Parker | David Gilboa | Sweden |
Zoom | Eric Yuan | China |
Zscaler | Jay Caudhry | India |
I deliberately included German-born Peter Thiel in the list particularly because he spends a lot of time canoodling with the anti-immigrant crowd. He’s one of those people who says “Ever since my family came to this country, we’ve had nothing but trouble from the immigrants.”
Let’s also not forget that Apple founder Steve Jobs was the son of a Syrian immigrant, and that there are many children of immigrants who’ve contributed so much.
“It’s time for the United States to poach with purpose.”
That’s what Allison and Schmidt write, and what they mean is that the U.S. should:
- Grant an additional quarter million green cards every year.
- Eliminate the rule that limits the percentage of green cards issued to citizens of any single country to 7%.
- Move the immigration system from its current paper forms-based process to a digital one, which has caused more than 300,000 green cards to be lost.
- Grant 100,000 additional visas to extraordinary tech talents. You know, like the one Melania Trump got, but give them to people who actually merit them.
- Adjust the criteria for visas so that people qualify based on their technological expertise.
- Direct the Labor Department to make recruiting STEM talent a top priority.
…and most importantly:
- Dismantle the Trump administration rules whose goal was to reduce legal immigration to the U.S.
There’s more in the article, and I strongly encourage you to read it.
And hey, if you’re in Tampa Bay and looking for an example of a highly-skilled green card holder who’s making a difference, let me point you to the handsome well-dressed gentleman in the photo below:
Don’t let my accent, grasp of the culture, or accordion skill fool you — I’m a first-generation green card holder from the Philippines, and I’m here to make a difference in the tech world, locally and nationally.
(If you’re really curious, check out my article about my green card interview, which took place a week after the Trump inauguration.)