Blog

Full Blog Posts

341 posts latest post 2026-05-11
Publishing rhythm
Feb 2026 | 6 posts

Chrome Extensions I use

There are many useful chrome extensions out there. I probably have way too many installed, here are four that I am currently using. This post was inspired from Chris over at daily-dev-tips [1] - LastPass [2] - Stylus [3] - Vimium [4] - hypothesis [5] --- LastPass [6] # [7] Love it or hate it passwords are hard to manage. Everyone needs a password manager to avoid the dreaded password reuse, and to be able to quickly rotate them with a service. I use lastpass, thus it’s browser extension is my most used extension. [6] --- Stylus [8] # [9] Stylus is an extension that allows you to add your own CSS to style pages how you want. There seems to be a full community of folks that really use this to the nth degree to style all of their commonly used sites somewhat similarly or add dark mode to sites without it. Personally I mostly use it to add my favorite syntax highlighting theme to jupyter, onedark. I’ve long lost the original author, but have posted the CSS I use in this gi...
2 min read 💬 1

Creating Reusable Bash Scripts

Bash is a language that is quite useful for automation no matter what language you write in. Bash can do so many powerful system-level tasks. Even if you are on windows these days you are likely to come across bash inside a cloud VM, Continuous Integration, or even inside of docker. I have three techniques that help me write more composable bash scripts. - functions [1] - Arguments [2] - positional arguments [3] - All Arguments [4] - Error Handling [5] - main script [6] --- Functions # [1] Break scripts down into reusable components Functions in bash are quite simple. They are something that I wish I would have started using long ago. They make your code much more reusable. I often use them in my aliases as well since they can simplify the process and allow more flexibility. syntax #!/bin/sh # hello_world hello_world () { echo "hello world" } Source the file to load the function and run it from the terminal. run it source hello_world hello_world outputs hello world ...

Three things to Automate with Python using Pandas

Here are three things that I see my non programming counterparts doing every single day. These really sum up so much of what folks do within an office. So many of us dabble in or become power users of spreadsheets without knowing there is an alternative out there that can save us time, automate boring things, and allow us to open up our minds for the part that we add value, Thinking about the data. Focus on Value Add Operations # [1] Lets face it, stitching together spreadsheets is zero value add by itself, but if you can see something in the data and take action on it, this can be huge value add to your company. Learning just a bit of python will help focus more of your attention on “value add operations” and leave the mundane stuff to your computer. Merge a directory full of spreadsheets into one # [2] I see this one all the time. One team gets a spreadsheet from another team once per month and they need to stich all the pieces together. Excel really opens the door for some na...
4 min read

How to Install miniconda on linux (from the command line only)

miniconda is a python distribution from continuum. It’s a slimmed-down version of their very popular anaconda distribution. It comes with its own environment manager and has eased the install process for many that do not have a way to compile c-extensions. It made it much easier to install the data science stack on windows a few years ago. These days windows are much better than it was back then at compiling c-extensions. I still like its environment manager, which installs to a global directory rather than a local directory for your project. Installing miniconda on Linux # [1] Installing miniconda on Linux can be a bit tricky the first time you do it completely from the terminal. The following snippet will create a directory to install miniconda into, download the latest python 3 based install script for Linux 64 bit, run the install script, delete the install script, then add a conda initialize to your bash or zsh shell. After doing this you can restart your shell and conda will...

How to crush amazing posts on DEV

This post was inspired by a comment I left on @dsteenman’s post. {% post dsteenman/how-long-should-a-blogpost-be-2k6n %} Most of the time I prefer short as I am more likely to read the whole thing. If its setup as a series I am more likely to work my way through the whole series in a matter of a few sessions. Just my preference I will say though there are certain articles that fit well to the long format. They are articles that folks tend to come back to often as a reference again and again. Sections # [1] - layout is key [2] - Break it up [3] - Article types [4] - superpost [5] - single post [6] - series [7] - discussion [8] - Post what you want to read [9] layout is key # [2] Either way, you go layout is key. You are not Steven King, no matter how great of a writer you are, you are unlikely to hold attention like he can. Most folks reading blogs scan articles first. I often scan, then read. If the article is really good or pertains well to me I will read everything, ...

Black Tech Pipeline

I was particularly inspired by @chantastic episode 103 of the react podcast with @ParissAthena. They spoke about the black tech pipeline as well as Diversity, Equity, and Inclusion. Pariss is quite an inspiration. She has done so much work to create a better place for POC in tech. I like that not only is she helping them get jobs but acting as a mentor for their first few months on the job to make sure that they are able to find their place and fit in. Based on an episode of react podcast. 🎙 Listen to the full episode [1]. So Inspirational # [2] I was particularly inspired by @chantastic [3] episode 103 of the react podcast with @ParissAthena [4]. They spoke about the black tech pipeline as well as Diversity, Equity, and Inclusion. Pariss is quite an inspiration. She has done so much work to create a better place for POC in tech. I like that not only is she helping them get jobs but acting as a mentor for their first few months on the job to make sure that they are able to find ...

Review of the git-auto-commit-action

It’s a really cool GitHub action that will automatically commit files changed during the action. I was using this to render a new readme based on a template. Check out the repo for git-auto-commit-action [1]. It’s a really cool GitHub action that will automatically commit files changed during the action. I was using this to render a new readme based on a template. This has been by far the easiest way to commit back to a repo that I have seen. Other patterns often require fully setting up the git [2] user and everything. While it’s not all that hard, this action already has all of that covered. You must give it a commit message and thats it. Optionally you can configure a number of things. Its possible to configure the commit_user_name, commit_user_email, and commit_author. I often also scope the file_pattern to a certain subset of files. --- [3] If you’re new to actions check out this article on using actions. [3] If you’re new to actions check out this article on using a...

What's New in Kedro 0.16.4

If we take a look at the release notes [1] I see one major feature improvement on the list, auto-discovery of hooks. ## Major features and improvements * Enabled auto-discovery of hooks implementations coming from installed plugins. This one comes a bit surprising as it was just casually mentioned in #435 [2] [2] Think pytest # [3] As mentioned in #435 [2] this is the model that pytest uses. Not all plugins automatically start doing things right out of the box but require a CLI argument. simplicity # [4] It feels a bit crazy that simply installing a package will change the way that your pipeline gets executed. I do like that it requires just a bit less reaching into the framework stuff for the average user. Most folks will be able to write in the catalog and nodes without much change to the rest of the project. Implementation # [5] Reading through the docs [6], they show us that we can make our hooks automatically register by adding a kedro.hooks endpoint that points to a ...

Integration testing with Python, TestProject.io, and GitHub Actions

Caution None of the testproject.io urls resolve anymore in JAN 2025, I removed all of the broken links. As I continue to build out waylonwalker.com [1] I sometimes run into some errors that are not caught because I do not have good testing implemented. I want to explore some integration testing options using GitHub’s actions. Running integration tests will not prevent bugs from happening completely, but it will allow me to quickly spot them and rollback. --- 🤔 What to test first? # [2] The very first thing that comes to my mind is anything that is loaded or ran client-side. Two things quickly came to mind here. I run gatsby so most of my content is statically rendered, and it yells at me if something isn’t as expected. For performance reasons I lazy load cards on my blogroll, loading all of the header images gets heavy and kills lighthouse (if anyone actually cares). I am also loading some information from the top open-source libraries that I have created. To prevent the need...
8 min read

New Machine for developing Tests with TestProject.io

Today I setup a new machine on Digital Ocean to use with TestProject.io, Here are my installation notes. apt update && apt upgrade -y apt install zsh chsh zsh sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" curl -fsSL https://starship.rs/install.sh | bash echo 'eval "$(starship init zsh)"' >> ~/.zshrc # python sudo apt update sudo apt install python3-pip -y echo 'alias python=python3' >> ~/.zshrc echo 'alias pip=pip3' >> ~/.zshrc # pipx apt install python3-venv pip install pipx pipx install black pipx install shell-functools pip install ipython # docker sudo apt update sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" sudo apt update sudo apt install docker-ce # docker-compose sudo curl -L "https://g...
1 min read

🐍 Practice Python Online

When learning a new skill it’s important to practice along the way. In order for me to show up to practice I need to make it easy to show up. An easy way to show up to practice with python is to use an online repl. With these you can try out something quick. Sometimes I see snippets from blogs or tweets and I need to try the out for myself to really understand. When learning a new skill it’s important to practice along the way. In order for me to show up to practice I need to make it easy to show up. An easy way to show up to practice with python is to use an online repl. With these, you can try out something quick. Sometimes I see snippets from blogs or tweets and I need to try them out for myself to really understand. Three online REPLS # [1] Here are three different options that I have used in the past to try out something at some various levels. I am sure there are plenty more, but these are three that I have tried. I am not covering all of them, because It’s been a while sin...
2 min read

Kedro Catalog

I am exploring a kedro catalog meta data hook, these are some notes about what I am thinking. Process # [1] - metadata will be attached to the dataset object under a .metadata attribute - metadata will be updated after_node_run - metadata will be empty until a pipeline is ran with the hook on - optionally a function to add metadata will be added - metadata will be stored in a file next to the filepath - meta Problems This Hook Should solve # [2] - what datasets have a columns with sales in the name - what datasets were updated after last tuesday - which pipeline node created this dataset - how many rows are in this dataset (without reloading all datasets) implementation details # [3] - metadata will be attached to each dataset as a dictionary - list/dict comprehensions can be used to make queries Metadata to Capture # [4] try pandas method -> try spark -> try dict/list -> none - column names - length - Null count - created_by node name Database? # [5] Is there...

How python tools configure

mypy # [1] Mypy’s config parser seems to be one of the most complex. This is likely in part to it having the largest backwards compatability of all projects that I looked at. mypy/config_parser [2] flake8 # [3] options/config.py [4] black # [5] black [6] portray # [7] - only uses pyproject.toml portray/config.py [8] interrogate # [9] - only uses pyproject.toml References: [1]: #mypy [2]: https://github.com/python/mypy/blob/master/mypy/config_parser.py [3]: #flake8 [4]: https://github.com/PyCQA/flake8/blob/master/src/flake8/options/config.py [5]: #black [6]: https://github.com/psf/black/blob/master/src/black/__init__.py#L277-L331 [7]: #portray [8]: https://github.com/timothycrosley/portray/blob/main/portray/config.py [9]: #interrogate
1 min read

Edit On GitHub

I recently added a button to my blog, and subsequently my posts on DEV.to [1]. It’s the best thing that I have done for it in a while. It makes it so easy to do quick edits. finding errors # [2] I refer back to my old posts quite a bit, sometimes I find errors in them. Honestly most of the time its too much effort to load up my editor make the change and git add and git commit. It’s not much, but when I am referring to my own post generally I am just trying to get something done and don’t have time for that. The slug # [3] The slug that I am getting from gatsby is formatted as /blog/this-post/. Note the trailing slash and missing file extension, thats where the ${slug.slice(0, -1)}.md comes in. The Full Link # [4] GitHub makes it super easy to form a URL that puts you right into edit mode on the exact post you are looking for. This is format for the URL… you can always figure it out easily by clicking edit on one. https://github.com/<user>/<repo>/edit/<branch>/<filepath> The...
2 min read

Why use a cms

When first learning to code its very common to hard code everything right into the code. This happens with most folks in just about any language. Whether its HTML [1] or markdown for front end content, or even hardcoding parameters in our backend languages like python, or node.js. 🤷‍♀️ What’s wrong with hard coding everything? # [2] Hard coding everything right into your code makes it really hard for non-technical collaborators to join. It makes it nearly impossible to hand websites off to clients without needing to come back for routine updates. The cms generally come with a rich content editor that feels more like something most folks are used to. There are buttons for changing the font, font-size, adding images, bold, italics, etc. Sometimes I don’t feel technical # [3] Even when you are developing for a technical audience there is a layer of polish that comes from giving them a nice interface to edit their content in. YouTube doesn’t have you manually inserting records into...

🐍 Parsing RSS feeds with Python

I am looking into a way to replace my google reader experience that I had back in 2013 before google took it from us. I am starting by learning how to parse feeds with python, and without much previous knowledge, it proved to be much easier than anticipated thanks to the feedparser library. This is how I used python to parse rss and setup my own custom feed. Install # [1] Install the feedparser library. conda create -n reader python=3.8 -y source activate reader pip install feedparser Get the content # [2] import feedparser feed = feedparser.parse('https://waylonwalker.com/rss.xml') The feed object # [3] The feed is a feedparser.FeedParserDict. For all intents and purposes this seems to just behave like a dict with the following keys(). feed.keys() ['feed', 'entries', 'bozo', 'headers', 'etag', 'href', 'status', 'encoding', 'version', 'namespaces', 'content']) feed has some general information about the rss feed, but the meat of the feed is in entries. The rest of the keys we...
2 min read

Reader-2020

Inputs # [1] The input will be a yaml file containing a list of Items you want to stay up to date with. Inside each item will be a url, and weight. email: max-entries: 10 recipients: - [email protected] markdown: max-entries: 100 output: - README.md json: max-entries: 1000 output: - feeds/feed.json rss: max-entries: 1000 output: - feeds/feed.xml html: max-entries: 100 output: index.html items: Waylon Walker: weight: 5 url: https://waylonwalker.com/rss.xml @_WaylonWalker: weight: 3 twitter: https://twitter.com/_waylonwalker DEV Waylon Walker: weight: 8 url: https://dev.to/waylonwalker Stack Overflow Kedro: weight: 5 url: https://stackoverflow.com/questions/tagged/kedro Kedro GitHub: weight: 4 url: https://github.com/kedro-org/kedro Kedro Pypi weight: 10 url: https://pypi.org/project/kedro/ Types # [2] - rss feed (primary source) - youtube feed - Stack Overflow tags - GitHub repo activity - pypi release - dev.to post - Twitter Search # ...
1 min read

🤓 What's on your GitHub Profile

I ran this post on dev.to and got a great response of great examples, check it out [1]. [1] The GitHub profile feature just went live for a subset of users. Simply creating a repo named after your username, and clicking share to Profile on the sidebar will create a custom profile that shows up just above your pinned projects. I am still trying to figure out what to put on mine, but this is what I have so far. I feel like mine is a bit big at the moment, I don’t like that my pinned repos end up blow the fold. [2] updated # [3] I tightened mine up and took inspiration from a few others. [2] Share a screenshot and link of yours on dev [1]. updated again # [4] Updated with a list of latest Twitter followers, using GitHub actions. [5] References: [1]: https://dev.to/waylonwalker/what-s-on-your-github-profile-40p3 [2]: https://github.com/waylonwalker [3]: #updated [4]: #updated-again [5]: https://dev-to-uploads.s3.amazonaws.com/i/f8fcm9dvvozj4rzh4376.png
1 min read ↺ 1 💬 6

🙋‍♂️ Can Anyone Explain Twitter Cards to me?

Can someone explain how or why twitter cards render differently from device to device? I do understand that twitter cards a built from meta tags, the full list can be found in their docs [1] Rendered on Mobile # [2] Mobile Looks fine. [3] Not Rendered on Desktop # [4] On Desktop it is not picking up the image. [3] Twitter Card Validator # [5] The Validator renders the card correctly. I tried the official twitter card validator [6], as well as heymeta.com [7], and metatags.io [8]. All look good. [3] Can Cards be updated? # [9] even with a redirect? I tried seting up a pinned tweet that uses a netlify redirect to always keep my latest post up to date. Again this one looks good in the validator, doesnt render the image on desktop, does render the image on mobile, but does not update. I have heard that you need to hit the card validator to update cards? I am not sure if this is true, but for me this is not even upating the card. 👋 Hello, ―――――― I'm Waylon Walker ―――――― ...

How I Built My GitHub Profile

I ran a discussion on dev that collected quite a list of examples in the comment section. So many great calls to action, animations, memes, and weird tricks. [1] My current profile # [2] [3] social icons # [4] Upload all of your icons to the repo in a directory such as icons or assets, then link them with a height attribute like below. I used html [5] for mine, not sure if you can set the height in markdown. <a href="https://dev.to/waylonwalker"><img height="30" src="https://raw.githubusercontent.com/WaylonWalker/WaylonWalker/main/icon/dev.png"></a>&nbsp;&nbsp; note I did add a bit of &nbsp; (non-breaking-whitespace) between my icons. Without adding css this seemed like the simplest way to do it. Center # [6] Aligning things in the center of the readme is super simple. I used this trick to align my social icons in the middle. <p align='center'> ...html </p> right # [7] For my latest post [8] I floated it to the right with a little bit of align='right' action. <p> <a ...