Deprecated: Function get_magic_quotes_gpc() is deprecated in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 99
Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 619
Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 832
Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 839
Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 839
Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 839
Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 839
Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 839
Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 839
Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 839
Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 839
Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 839
Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 839
Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 839
Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 839
Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 839
Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 839
Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 839
Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 839
Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 839
Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 839
Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 839
Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 839
Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 839
Warning: Cannot modify header information - headers already sent by (output started at /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php:99) in /hermes/walnacweb04/walnacweb04ab/b2791/pow.jasaeld/htdocs/De1337/nothing/index.php on line 839 Matt Laymanhttps://www.mattlayman.com/Recent content on Matt LaymanHugo -- gohugo.ioen-usThu, 14 Aug 2025 00:00:00 +0000Detecting Code Vulnerabilities Using Python with AI and LLMshttps://www.mattlayman.com/videos/detecting-code-vulnerabilities-using-python-with-ai-and-llms/Thu, 14 Aug 2025 00:00:00 +0000https://www.mattlayman.com/videos/detecting-code-vulnerabilities-using-python-with-ai-and-llms/Let’s take a look at how easy detecting vulnerabilities in code can be using the latest and greatest technologies, including scale challenges and costs.Python and AI workflow with LangGraphhttps://www.mattlayman.com/videos/python-and-ai-workflow-with-langgraph/Fri, 01 Aug 2025 00:00:00 +0000https://www.mattlayman.com/videos/python-and-ai-workflow-with-langgraph/In this stream, I worked on a personal AI workflow that I’m building using LangGraph. I discussed human-in-the-loop and how to bring a person into the workflow process.Enhancing Chatbot State Management with LangGraphhttps://www.mattlayman.com/blog/2025/enhancing-chatbot-state-management/Fri, 18 Jul 2025 00:00:00 +0000https://www.mattlayman.com/blog/2025/enhancing-chatbot-state-management/Picture this: it’s late and I’m deep in a coding session, wrestling with a chatbot that’s starting to feel more like a living thing than a few lines of Python. Today’s mission? Supercharge the chatbot’s ability to remember and verify user details like names and birthdays using LangGraph. Let’s unpack the journey, from shell commands to Git commits, and see how this bot got a memory upgrade.
For clarity, this is my adventure running through the LangGraph docs.Python AI Agents: Overview to Generative AI and Intro to Agentshttps://www.mattlayman.com/videos/python-ai-agents-overview-to-generative-ai-and-intro-to-agents/Thu, 12 Jun 2025 00:00:00 +0000https://www.mattlayman.com/videos/python-ai-agents-overview-to-generative-ai-and-intro-to-agents/Glenn will start by providing an overview of Generative AI, a groundbreaking technology that enables machines to produce human-like text, images, and even code. This innovation is transforming various industries by automating tasks, enhancing creativity, and improving efficiency.Love2D Game Devhttps://www.mattlayman.com/videos/love2d-game-dev/Fri, 30 May 2025 00:00:00 +0000https://www.mattlayman.com/videos/love2d-game-dev/In this episode, I worked on the hard mode of my pong clone game. We tried to improve the CPU AI without much success, then found some simple alternatives to make a fun hard mode.Love2D Pong Clonehttps://www.mattlayman.com/videos/love2d-pong-clone/Fri, 23 May 2025 00:00:00 +0000https://www.mattlayman.com/videos/love2d-pong-clone/In this episode, I worked on my pong clone some more. I made the game work in full screen mode (dealing with scaling) and started to add a menu system.Love2D Game Clonehttps://www.mattlayman.com/videos/love2d-game-clone/Fri, 16 May 2025 00:00:00 +0000https://www.mattlayman.com/videos/love2d-game-clone/In this episode, I played more with Love2d. I tried to use Grok to add more features to my pong clone, then played with the particle system in Love2d. Note: my streaming software crashed after the first 12 minutes of streaming, so the start on this recording is a somewhat abrupt.Love2D Vibe Codinghttps://www.mattlayman.com/videos/love2d-vibe-coding/Fri, 09 May 2025 00:00:00 +0000https://www.mattlayman.com/videos/love2d-vibe-coding/In this episode, I worked on some Love2D code and explored how to use AI tools within my Neovim configuration. Ultimately, I found that working with Grok directly proved to be more useful for my scenario than working with the xAI model through the avante plugin.Goodbye JourneyInbox - Building SaaS #218https://www.mattlayman.com/videos/goodbye-journeyinbox-building-saas-218/Fri, 11 Apr 2025 00:00:00 +0000https://www.mattlayman.com/videos/goodbye-journeyinbox-building-saas-218/In this episode, I declared to the stream that I’m done working on JourneyInbox as a SaaS product. I didn’t see any meaningful market adoption, so I’ve decided to pivot the project to serve only my personal needs. I used the stream to do a retrospective on the project and then convert the core logic to use Go to simplify when I need to run on my server.PySpark 101: Introduction to Big Data with Sparkhttps://www.mattlayman.com/videos/pyspark-101-introduction-to-big-data-with-spark/Thu, 10 Apr 2025 00:00:00 +0000https://www.mattlayman.com/videos/pyspark-101-introduction-to-big-data-with-spark/Unlock the PySpark for Big Data. This is a beginner-friendly course designed to introduce you to Apache Spark, a fast and scalable distributed computing framework. This class covers the fundamentals of PySpark, including:Onboarding Form and Template - Building SaaS #217https://www.mattlayman.com/videos/onboarding-form-and-template-building-saas-217/Fri, 21 Mar 2025 00:00:00 +0000https://www.mattlayman.com/videos/onboarding-form-and-template-building-saas-217/In this episode, I updated my new onboarding form on the School Desk app. This form is vital for the first experience of new users, so I spent a lot of time making sure it will do what is needed.C# and .net Core - What They Offer!https://www.mattlayman.com/videos/c-and/Wed, 05 Mar 2025 00:00:00 +0000https://www.mattlayman.com/videos/c-and/If you want to know what C# and .net Core is as of 2025 and how open source it really is, or not. What it gets right, what it gets wrong, and an objective comparison to Java, Go, C++, etc. we will give you a quick overview. C# and .net core offer many things that prior versions of .NET did not offer.Email Reputation and Onboarding - Building SaaS #216https://www.mattlayman.com/videos/email-reputation-and-onboarding-building-saas-216/Fri, 28 Feb 2025 00:00:00 +0000https://www.mattlayman.com/videos/email-reputation-and-onboarding-building-saas-216/In this episode, I did checking on the email reputation of my SaaS apps because I got feedback from a customer that my emails were going to spam. Along the way, we learned about DMARC as a capability to track and report on email compliance. After making some DNS changes to enable DMARC, I worked on some onboarding changes for my homeschool application. We are going to simplify the onboarding flow so that users have a faster path to success with the app.Deployment Snafus and AI - Building SaaS #215https://www.mattlayman.com/videos/deployment-snafus-and-ai-building-saas-215/Fri, 14 Feb 2025 00:00:00 +0000https://www.mattlayman.com/videos/deployment-snafus-and-ai-building-saas-215/In this episode, I finished up the sign in simplification feature for the homeschool app. I planned to do deploy it quickly and move onto the next thing, but we hit a comedy errors and challenges while trying to get Docker Desktop working again on my dev machine. On the stream, we also began to play with Ollama in preparation of doing some agentic AI framework research.Easy Python Parallelism using Rayhttps://www.mattlayman.com/videos/easy-python-parallelism-using-ray/Thu, 13 Feb 2025 00:00:00 +0000https://www.mattlayman.com/videos/easy-python-parallelism-using-ray/In this talk, we explore the Ray library and how it can be used to easily parallelize Python code. We cover the basics of using Ray Core, including installation, spinning up a local Ray cluster, and running remote actors and tasks.Better Onboarding - Building SaaS #214https://www.mattlayman.com/videos/better-onboarding-building-saas-214/Fri, 07 Feb 2025 00:00:00 +0000https://www.mattlayman.com/videos/better-onboarding-building-saas-214/In this episode, I returned to the homeschooling application and started to improve the sign up and onboarding experience. We simplified signup to eliminate passwords and work via email. I talked through the design changes that I plan to make to the first time experience for new users.Learning to Löve game development - Designing games with Luahttps://www.mattlayman.com/videos/learning-to-l%C3%B6ve-game-development-designing-games-with-lua/Thu, 06 Feb 2025 00:00:00 +0000https://www.mattlayman.com/videos/learning-to-l%C3%B6ve-game-development-designing-games-with-lua/Experience the magic of game creation! We delved into the enchanting world of Lua, the language that powers the lightweight, open-source Löve game engine. Here’s what you’ll find:Finishing Simple Signup - Building SaaS #213https://www.mattlayman.com/videos/finishing-simple-signup-building-saas-213/Fri, 31 Jan 2025 00:00:00 +0000https://www.mattlayman.com/videos/finishing-simple-signup-building-saas-213/In this episode, I completed the simplified sign up process for my JourneyInbox app. I finished off the final features that add account verification and initial engagement features to make sign up and nice and functional experience.Building SaaS with Python and Django #212.2https://www.mattlayman.com/videos/building-saas-with-python-and-django-212/Fri, 17 Jan 2025 00:00:00 +0000https://www.mattlayman.com/videos/building-saas-with-python-and-django-212/In this episode, we continued on the sign up workflow simplification. The focus of this stream was on adding the background task that will send the magic link email to allow sign in. This is the second half of the stream because my internet cut out.Signin Email - Building SaaS #212.1https://www.mattlayman.com/videos/signin-email-building-saas-212/Fri, 17 Jan 2025 00:00:00 +0000https://www.mattlayman.com/videos/signin-email-building-saas-212/In this episode, we continued on the sign up workflow simplification. The focus of this stream was on adding the background task that will send the magic link email to allow sign in.Simplified Signup - Building SaaS #211https://www.mattlayman.com/videos/simplified-signup-building-saas-211/Fri, 10 Jan 2025 00:00:00 +0000https://www.mattlayman.com/videos/simplified-signup-building-saas-211/In this episode, we began an update to the signup process to simplify things. I am replacing email and password with just email. Users will receive ‘magic links’ via their email client to sign in. To do this, we are using django-sesame.Optimizing SQLite - Building SaaS #210https://www.mattlayman.com/videos/optimizing-sqlite-building-saas-210/Fri, 27 Dec 2024 00:00:00 +0000https://www.mattlayman.com/videos/optimizing-sqlite-building-saas-210/In this episode, when worked on the newly migrated JourneyInbox site and focused on the database. Since me moved from Postgres to SQLite, I needed to make sure that SQLite was ready for users. We examined common configuration to optimize the database and applied that config to JourneyInbox.Bootstrap Kamal On Droplet - Building SaaS #209.1https://www.mattlayman.com/videos/bootstrap-kamal-on-droplet-building-saas-209/Fri, 20 Dec 2024 00:00:00 +0000https://www.mattlayman.com/videos/bootstrap-kamal-on-droplet-building-saas-209/In this episode, I worked to finish the cloud migration to DigitalOcean for JourneyInbox. We started the stream by bootstrapping Kamal on the server. I hit network issues so this stream is split into multiple parts and is of lower quality than normal.Docker Image For Kamal - Building SaaS #209.2https://www.mattlayman.com/videos/docker-image-for-kamal-building-saas-209/Fri, 20 Dec 2024 00:00:00 +0000https://www.mattlayman.com/videos/docker-image-for-kamal-building-saas-209/In this episode, the second portion of the stream worked on fixing up the Docker image so that we could get the DigitalOcean droplet functional. This is the second stream chunk because I was having network issues and the first stream cut out.Postgres To SQLite - Building SaaS #209.3https://www.mattlayman.com/videos/postgres-to-sqlite-building-saas-209/Fri, 20 Dec 2024 00:00:00 +0000https://www.mattlayman.com/videos/postgres-to-sqlite-building-saas-209/In this episode, the third portion of the stream covers how I migrated my Heroku-backed Postgres database to SQLite. I finished the migration of my app from running on Heroku to running on DigitalOcean.1Password and DigitalOcean Droplet - Building SaaS #208https://www.mattlayman.com/videos/1password-and-digitalocean-droplet-building-saas-208/Fri, 13 Dec 2024 00:00:00 +0000https://www.mattlayman.com/videos/1password-and-digitalocean-droplet-building-saas-208/In this episode, I continued a migration of my JourneyInbox app from Heroku to DigitalOcean. We configured the secrets using 1Password and created the droplet that will host the app.UV and Ruff: Next-gen Python Toolinghttps://www.mattlayman.com/videos/uv-and-ruff-next-gen-python-tooling/Thu, 12 Dec 2024 00:00:00 +0000https://www.mattlayman.com/videos/uv-and-ruff-next-gen-python-tooling/Dive into the dynamic duo of modern Python development – UV and Ruff!Huey Background Worker - Building SaaS #207https://www.mattlayman.com/videos/huey-background-worker-building-saas-207/Fri, 22 Nov 2024 00:00:00 +0000https://www.mattlayman.com/videos/huey-background-worker-building-saas-207/In this episode, I continued a migration of my JourneyInbox app from Heroku to DigitalOcean. I switched how environment configuration is pulled and converted cron jobs to use Huey as a background worker. Then I integrated Kamal configuration and walked through what the config means.Heroku To DigitalOcean - Building SaaS #206https://www.mattlayman.com/videos/heroku-to-digitalocean-building-saas-206/Fri, 15 Nov 2024 00:00:00 +0000https://www.mattlayman.com/videos/heroku-to-digitalocean-building-saas-206/In this episode, I began a migration of my JourneyInbox app from Heroku to DigitalOcean. The first step to this move, since I’m going to use Kamal, is to put the app into a Docker image. We got the whole app into the Docker image, then cleaned up local development and the CI system after making changes that broke those configurations.Deploy Your Own Web App With Kamal 2https://www.mattlayman.com/videos/deploy-your-own-web-app-with-kamal-2/Wed, 06 Nov 2024 00:00:00 +0000https://www.mattlayman.com/videos/deploy-your-own-web-app-with-kamal-2/Kamal offers zero-downtime deploys, rolling restarts, asset bridging, remote builds, accessory service management, and everything else you need to deploy and manage your web app in production with Docker. Originally built for Rails apps, Kamal will work with any type of web app that can be containerized. We dig into Kamal, how it works, and how you could use it on your next project.Epic Debugging, Hilarious Outcome - Building SaaS #205https://www.mattlayman.com/videos/epic-debugging-hilarious-outcome-building-saas-205/Fri, 18 Oct 2024 00:00:00 +0000https://www.mattlayman.com/videos/epic-debugging-hilarious-outcome-building-saas-205/In this episode, I dug into an issue with sign up. What I thought was going to be a minor issue to fix turned into a massively intense debugging session. We ended up going very deep with the django-allauth package to understand what was going on.Postgres to SQLite - Building SaaS #204https://www.mattlayman.com/videos/postgres-to-sqlite-building-saas-204/Fri, 27 Sep 2024 00:00:00 +0000https://www.mattlayman.com/videos/postgres-to-sqlite-building-saas-204/In this episode, we worked on the cloud migration’s data strategy. I focused on how to convert a Postgres database into a SQLite database and planned out the process that I will follow to do the actual migration.Docker Go, JS, Static Files - Building SaaS #203https://www.mattlayman.com/videos/docker-go-js-static-files-building-saas-203/Fri, 20 Sep 2024 00:00:00 +0000https://www.mattlayman.com/videos/docker-go-js-static-files-building-saas-203/In this episode, we continued on the cloud migration path. We need to build a Docker container with all the necessary static files. Some of these come from Go via Hugo for a content blog. Some comes from JavaScript via Tailwind for CSS. Some come from Python via Sphinx for documentation. All need to built into the same image. That’s what we covered on this stream.Cloud Migration Beginning - Building SaaS #202https://www.mattlayman.com/videos/cloud-migration-beginning-building-saas-202/Fri, 13 Sep 2024 00:00:00 +0000https://www.mattlayman.com/videos/cloud-migration-beginning-building-saas-202/In this episode, we started down the path of migrating School Desk off of Heroku and onto Digital Ocean. Most of the effort was on tool changes and beginning to make a Dockerfile for deploying the app to the new setup.Kamal On A Droplet - Building SaaS #201https://www.mattlayman.com/videos/kamal-on-a-droplet-building-saas-201/Fri, 06 Sep 2024 00:00:00 +0000https://www.mattlayman.com/videos/kamal-on-a-droplet-building-saas-201/In this episode, we continued working with the Kamal deploy tool. Last time, we build a demo image. With this session, we created a Digital Ocean Droplet (i.e., VM) and deployed to that. Along the journey, we learned a lot about how Kamal operates.Kamal - Building SaaS #200https://www.mattlayman.com/videos/kamal-building-saas-200/Fri, 30 Aug 2024 00:00:00 +0000https://www.mattlayman.com/videos/kamal-building-saas-200/In this episode, we pulled out a new tool. We spent the session using Kamal, a tool to deploy web apps directly to servers. Kamal offers a complete tool set to get apps running on bare metal or cloud machines. We played with the tool to see how far we go to get an app deployed to a new server.No Frills, Just Go: Standard Library Only Web Appshttps://www.mattlayman.com/videos/no-frills-just-go-standard-library-only-web-apps/Thu, 29 Aug 2024 00:00:00 +0000https://www.mattlayman.com/videos/no-frills-just-go-standard-library-only-web-apps/How much can you build in Go with zero extra packages? What is possible using nothing more than Go’s standard library? In this talk, you’re going to find out!Layman's Guide to Python Built-in Functionshttps://www.mattlayman.com/blog/2024/layman-guide-python-built-in-functions/Mon, 26 Aug 2024 00:00:00 +0000https://www.mattlayman.com/blog/2024/layman-guide-python-built-in-functions/Quick Jump List A: abs, aiter, all, anext, any, ascii, B: bin, bool, breakpoint, bytearray, bytes, C: callable, chr, classmethod, compile, complex, D: delattr, dict, dir, divmod E: enumerate, eval, exec, F: filter, float, format, frozenset, G: getattr, globals, H: hasattr, hash, help, hex, I: id, input, int, isinstance, issubclass, iter, L: len, list, locals, M: map, max, memoryview, min, N: next, O: object, oct, open, ord, P: pow, print, property, R: range, repr, reversed, round, S: set, setattr, slice, sorted, staticmethod, str, sum, super, T: tuple, type, V: vars, Z: zip, _: __import__,Golang Middleware and DBs - Building SaaS #199https://www.mattlayman.com/videos/golang-middleware-and-dbs-building-saas-199/Fri, 23 Aug 2024 00:00:00 +0000https://www.mattlayman.com/videos/golang-middleware-and-dbs-building-saas-199/In this episode, we continued the break from JourneyInbox to look through more of the Go standard library. In this session, we talked about middleware, request context, and using databases.More Go Standard Library - Building SaaS #198https://www.mattlayman.com/videos/more-go-standard-library-building-saas-198/Fri, 16 Aug 2024 00:00:00 +0000https://www.mattlayman.com/videos/more-go-standard-library-building-saas-198/In this episode, we continued the break from JourneyInbox to look through more of the Go standard library. In this session, we explored JSON serialization, Go template support, and embedding of static files for easy access.PDF Text Extraction With Pythonhttps://www.mattlayman.com/videos/pdf-text-extraction-with-python/Thu, 15 Aug 2024 00:00:00 +0000https://www.mattlayman.com/videos/pdf-text-extraction-with-python/Is your data locked up in portable document format (PDFs)? In this talk we’re going to explore methods to extract text and other data from PDFs using readily-available, open-source Python tools (such as pypdf), as well as techniques such as OCR (optical character recognition) and table extraction. We will also discuss the philosophy of text extraction as a whole.Go Standard Library App - Building SaaS #197https://www.mattlayman.com/videos/go-standard-library-app-building-saas-197/Fri, 09 Aug 2024 00:00:00 +0000https://www.mattlayman.com/videos/go-standard-library-app-building-saas-197/In this episode, we are taking a break from JourneyInbox and exploring what kind of Go app we can make by just using the Go standard library.Go Standard Library App - Building SaaS #197.2https://www.mattlayman.com/videos/go-standard-library-app-building-saas-197/Fri, 09 Aug 2024 00:00:00 +0000https://www.mattlayman.com/videos/go-standard-library-app-building-saas-197/In this episode, we are taking a break from JourneyInbox and exploring what kind of Go app we can make by just using the Go standard library. This is a continuation after an internet disconnection.Go Standard Library App - Building SaaS #197.3https://www.mattlayman.com/videos/go-standard-library-app-building-saas-197/Fri, 09 Aug 2024 00:00:00 +0000https://www.mattlayman.com/videos/go-standard-library-app-building-saas-197/In this episode, we are taking a break from JourneyInbox and exploring what kind of Go app we can make by just using the Go standard library. This is another continuation after an internet disconnection.Go Standard Library App - Building SaaS #197.4https://www.mattlayman.com/videos/go-standard-library-app-building-saas-197/Fri, 09 Aug 2024 00:00:00 +0000https://www.mattlayman.com/videos/go-standard-library-app-building-saas-197/In this episode, we are taking a break from JourneyInbox and exploring what kind of Go app we can make by just using the Go standard library. This is the final continuation after an internet disconnection.An Opinionated Introduction to CI/CDhttps://www.mattlayman.com/videos/an-opinionated-introduction-to-ci-cd/Wed, 07 Aug 2024 00:00:00 +0000https://www.mattlayman.com/videos/an-opinionated-introduction-to-ci-cd/Continuous Integration / Continuous Delivery (or Deployment), CI/CD, is a set of practices used by engineering organizations to improve the quality of software they deliver, how fast they deliver that software, and detect issues with that software before they affect end users. Unfortunately, the term can mean a lot of different ideas and approaches. So, in this talk we’re going to try to unravel some of those ideas to give you some ideas on how you too can deliver software better.Activation Email Job - Building SaaS #196https://www.mattlayman.com/videos/activation-email-job-building-saas-196/Fri, 19 Jul 2024 00:00:00 +0000https://www.mattlayman.com/videos/activation-email-job-building-saas-196/In this episode, we chatted about managing dependencies and the cost of maintenance. Then we got into some feature work and began building a job that will send users an email as reminder to activate their account shortly before it expires.Trial Banner Inclusion Tag - Building SaaS #195https://www.mattlayman.com/videos/trial-banner-inclusion-tag-building-saas-195/Fri, 12 Jul 2024 00:00:00 +0000https://www.mattlayman.com/videos/trial-banner-inclusion-tag-building-saas-195/In this episode, we worked on a trial banner that could persist across all pages on the site. Because the banner needed data that was only available on the index page, we had to refactor the banner into an inclusion template tag to make the tag work consistently.Password Resets and Signal Handling - Building SaaS #194https://www.mattlayman.com/videos/password-resets-and-signal-handling-building-saas-194/Thu, 20 Jun 2024 00:00:00 +0000https://www.mattlayman.com/videos/password-resets-and-signal-handling-building-saas-194/In this episode, we hooked up the email confirmation signal to the prompt sending code so that new users can use JourneyInbox immediately. Then we focused on handling all the functionality related to the password reset feature. This meant customizing a bunch of django-allauth forms.Boosting AI with Python: Using Click, Jinja2, and GPT Librarieshttps://www.mattlayman.com/videos/boosting-ai-with-python-using-click-jinja2-and-gpt-libraries/Thu, 13 Jun 2024 00:00:00 +0000https://www.mattlayman.com/videos/boosting-ai-with-python-using-click-jinja2-and-gpt-libraries/n this session, we will explore how to use Python to enhance your AI projects with:Polish, Debug Toolbar, Email Signals - Building SaaS #193https://www.mattlayman.com/videos/polish-debug-toolbar-email-signals-building-saas-with-python-and-django-193/Thu, 06 Jun 2024 00:00:00 +0000https://www.mattlayman.com/videos/polish-debug-toolbar-email-signals-building-saas-with-python-and-django-193/In this episode, we first added the Django debug toolbar to aid future troubleshooting. Then, following some PR cleanup, I added django-denied as the authorization framework for the site. With those two packages integrated, I did some polishing work and began the effort to send prompts immediately following email verification.About, FAQ, and Home Page - Building SaaS #192https://www.mattlayman.com/videos/about-faq-and-home-page-building-saas-with-python-and-django-192/Thu, 30 May 2024 00:00:00 +0000https://www.mattlayman.com/videos/about-faq-and-home-page-building-saas-with-python-and-django-192/In this episode, we worked on some core pages to round out the JourneyInbox user interface. This led us to work updating UI layout, writing copy, and doing other fundamentals for making templated pages.Export Journal Feature - Building SaaS #191https://www.mattlayman.com/videos/export-journal-feature-building-saas-with-python-and-django-191/Thu, 23 May 2024 00:00:00 +0000https://www.mattlayman.com/videos/export-journal-feature-building-saas-with-python-and-django-191/In this episode, I started with cleaning up a few small items. After those warmups, we moved on to building an export feature that will allow users to take their journal entries if they want to leave the service.Settings and Billing Portal - Building SaaS #190https://www.mattlayman.com/videos/settings-and-billing-portal-building-saas-with-python-and-django-190/Thu, 16 May 2024 00:00:00 +0000https://www.mattlayman.com/videos/settings-and-billing-portal-building-saas-with-python-and-django-190/In this episode, I worked on the settings page for the user. This was a vital addition because it allows users to access the Stripe billing portal and close their account if they no longer wish to use JourneyInbox.Importing Content - Building SaaS #189https://www.mattlayman.com/videos/importing-content-building-saas-with-python-and-django-189/Thu, 18 Apr 2024 00:00:00 +0000https://www.mattlayman.com/videos/importing-content-building-saas-with-python-and-django-189/In this episode, I built the import view that is needed to allow users to add their own journal entries to JourneyInbox. After completing that, I handled the pull requests from dependabot, then I worked on some quality of life to do better handling with beta user trials.Why Django and why not Flask?https://www.mattlayman.com/videos/why-django-and-why-not-flask/Thu, 18 Apr 2024 00:00:00 +0000https://www.mattlayman.com/videos/why-django-and-why-not-flask/Why would someone pick Django over Flask? That’s the question that I got on stream and here is my answer.Flash messages and content encodings - Building SaaS #188https://www.mattlayman.com/videos/flash-messages-and-content-encodings-building-saas-with-python-and-django-188/Thu, 04 Apr 2024 00:00:00 +0000https://www.mattlayman.com/videos/flash-messages-and-content-encodings-building-saas-with-python-and-django-188/In this episode, we added flash messages (after a rough start with some networking issues). Then I tracked down a thorny issue. We found that there is a non-breaking space with ’timesince’ that affects the encoding and what links Gmail adds to emails.NATS: Connecting Apps Over a Network Easilyhttps://www.mattlayman.com/videos/nats-connecting-apps-over-a-network-easily/Wed, 03 Apr 2024 00:00:00 +0000https://www.mattlayman.com/videos/nats-connecting-apps-over-a-network-easily/NATS is an awesome open source technology to help connect code together over a network. Whether you’re build a distributed microservice architecture or connecting IoT devices, NATS provides the tools you need to do that easily. In this talk, you’ll learn about NATS via a presentation with plenty of live coding examples.Start Polishing - Building SaaS #187https://www.mattlayman.com/videos/start-polishing-building-saas-with-python-and-django-187/Thu, 28 Mar 2024 00:00:00 +0000https://www.mattlayman.com/videos/start-polishing-building-saas-with-python-and-django-187/In this episode, we attacked the issue list. JourneyInbox is live and serving user and now it’s time to start polishing and building the full set of features. There are so many easy targets to fix that we focused on a few clear improvements to user experience and the user interface.Post-launch Punchlist - Building SaaS #186https://www.mattlayman.com/videos/post-launch-punchlist-building-saas-with-python-and-django-186/Thu, 21 Mar 2024 00:00:00 +0000https://www.mattlayman.com/videos/post-launch-punchlist-building-saas-with-python-and-django-186/In this episode, we had a bunch of issues to resolve post-launch. I set the code that causes trials to expire, made updates to who receives prompt emails, and added some polish to the sign up process and interface to make it clear what will happen in the flow. After those modifications, we worked through a set of smaller changes like setting up Dependabot and adding a missing database index.Do It Live - Building SaaS #185https://www.mattlayman.com/videos/do-it-live-building-saas-with-python-and-django-185/Fri, 08 Mar 2024 00:00:00 +0000https://www.mattlayman.com/videos/do-it-live-building-saas-with-python-and-django-185/In this episode, we deployed all our user setup and Stripe configuration change to the live site and tested the new flows end to end. Along the way, we found a bug in djstripe as well as some final bugs in the JourneyInbox configuration that prevented things from working. This is why you test!Final Pre-live Features - Building SaaS #184https://www.mattlayman.com/videos/final-pre-live-features-building-saas-with-python-and-django-184/Thu, 07 Mar 2024 00:00:00 +0000https://www.mattlayman.com/videos/final-pre-live-features-building-saas-with-python-and-django-184/In this episode, we completed the final features needed to get the site open for others to sign up. This included some dynamic limiting of the number of people allowed to sign up. We also had to add the template styling for the login page.Finish Stripe Integration - Building SaaS #183https://www.mattlayman.com/videos/finish-stripe-integration-building-saas-with-python-and-django-183/Thu, 22 Feb 2024 00:00:00 +0000https://www.mattlayman.com/videos/finish-stripe-integration-building-saas-with-python-and-django-183/In this episode, we completed the Stripe integration. I added all the necessary test code, incorporated the webhook for handling account activation, and wrote the view that Stripe needed to redirect to on successful signup.Algorithmic Art with Pythonhttps://www.mattlayman.com/videos/algorithmic-art-with-python/Thu, 15 Feb 2024 00:00:00 +0000https://www.mattlayman.com/videos/algorithmic-art-with-python/In this talk, we’re going to start from nothing and build out our own tools for making art in Python, no AI needed! We’ll show how Python’s expressiveness allows us to describe graphics elegantly and use that to make some unique art programmatically.Stripe Checkout - Building SaaS #182https://www.mattlayman.com/videos/stripe-checkout-building-saas-with-python-and-django-182/Thu, 08 Feb 2024 00:00:00 +0000https://www.mattlayman.com/videos/stripe-checkout-building-saas-with-python-and-django-182/In this episode, we did work to get the Stripe checkout session going. We set up Stripe Product and Price objects to get the subscription plan ready and got the Stripe checkout session working mostly end-to-endPayments Gateway - Building SaaS #181https://www.mattlayman.com/videos/payments-gateway-building-saas-with-python-and-django181/Thu, 25 Jan 2024 00:00:00 +0000https://www.mattlayman.com/videos/payments-gateway-building-saas-with-python-and-django181/In this episode, we continued on the Stripe integration. I worked on a new payments gateway interface to access the Stripe APIs needed for creating a check out session. We hit some bumps along the way because of djstripe’s new preference for putting the Stripe keys into the database exclusively.Design and Stripe - Building SaaS #180https://www.mattlayman.com/videos/design-and-stripe-building-saas-with-python-and-django-180/Thu, 18 Jan 2024 00:00:00 +0000https://www.mattlayman.com/videos/design-and-stripe-building-saas-with-python-and-django-180/In this episode, I started with a plan to work on Stripe checkout, but realized that I needed to come up with a better plan and also improve the base template of the app. We ended up doing more design work than working with Stripe, but we ended the stream with a solid plan of what to do next.Fun With Scrapy Link Validation on CIhttps://www.mattlayman.com/blog/2024/fun-scrapy-validation-ci/Sat, 06 Jan 2024 00:00:00 +0000https://www.mattlayman.com/blog/2024/fun-scrapy-validation-ci/Here’s my scenario: I have a static site generator that is building HTML pages for a community project that I’m working on. How can I make sure, automatically, that all the links to other internal pages within the site continue to work? In this article, I’ll show you how I managed to do that using Scrapy, a web scraping tool, and GitHub Actions, the project’s Continuous Integration system.
To solve this problem, I decided to use a web scraper.Legal and Stripe - Building SaaS #179https://www.mattlayman.com/videos/legal-and-stripe-building-saas-with-python-and-django-179/Thu, 04 Jan 2024 00:00:00 +0000https://www.mattlayman.com/videos/legal-and-stripe-building-saas-with-python-and-django-179/In this episode, we took care of the legal obligations of the site by setting up Terms of Service and a Privacy Policy page. Then we moved on to the next portion of signup, which is to configure Stripe to create customers and prepare, ultimately, to accept subscription payments.Python, Markdown, and Tailwind: Best Buds!https://www.mattlayman.com/blog/2023/python-markdown-tailwind-best-buds/Sat, 30 Dec 2023 00:00:00 +0000https://www.mattlayman.com/blog/2023/python-markdown-tailwind-best-buds/You are rendering content with Python and want to show some Markdown, but you style your pages with Tailwind. With Tailwind’s built-in reset, how can you style the tags of your rendered HTML that come from Markdown? This article shows how that can be done.
Specifically, I am assuming that you are working with Python’s Markdown package.
I recently worked on a project where I needed to render some Markdown descriptions.Sign Up - Building SaaS #178https://www.mattlayman.com/videos/sign-up-building-saas-with-python-and-django-178/Thu, 21 Dec 2023 00:00:00 +0000https://www.mattlayman.com/videos/sign-up-building-saas-with-python-and-django-178/In this episode, we did some work on the sign up template. In the process, we added some base template styling, talked about branding, and considered the other elements that are required before we can turn on sign up for others. I also cover waffle as a feature flag tool.Tailwind CSS on Python and Heroku - Building SaaShttps://www.mattlayman.com/videos/tailwind-css-on-python-and-heroku-building-saas/Mon, 11 Dec 2023 00:00:00 +0000https://www.mattlayman.com/videos/tailwind-css-on-python-and-heroku-building-saas/Tailwind CSS is a fantastic tool for making CSS easy to use on your webapps. On the video, I added Tailwind CSS to my Django app and showed how to use it and deploy it to Heroku (which required some extra configuration for JavaScript support).WhiteNoise For Static Files - Building SaaShttps://www.mattlayman.com/videos/whitenoise-for-static-files-building-saas/Sat, 09 Dec 2023 00:00:00 +0000https://www.mattlayman.com/videos/whitenoise-for-static-files-building-saas/This video is all about adding the popular WhiteNoise package into my Django app to serve static files (e.g., CSS, JavaScript, and images) directly from the app. I walk through the process from start to finish and deploy it live to show how things work.Operations, WhiteNoise, and Tailwind - Building SaaS #177https://www.mattlayman.com/videos/operations-whitenoise-and-tailwind-building-saas-with-python-and-django-177/Thu, 07 Dec 2023 00:00:00 +0000https://www.mattlayman.com/videos/operations-whitenoise-and-tailwind-building-saas-with-python-and-django-177/In this episode, I worked through a couple of issues discovered after having the site be operational for real use. From there, we moved onto some fundamental technology and integrated WhiteNoise to handle static files for the application. After adding WhiteNoise, we hooked up Tailwind CSS.Saturday stream explorerhttps://www.mattlayman.com/videos/saturday-stream-explorer/Sun, 03 Dec 2023 00:00:00 +0000https://www.mattlayman.com/videos/saturday-stream-explorer/I was looking for new thing to do to improve my stream. This is mostly me goofing off.Switch an Existing Python Project To Ruffhttps://www.mattlayman.com/videos/switch-an-existing-python-project-to-ruff/Fri, 01 Dec 2023 00:00:00 +0000https://www.mattlayman.com/videos/switch-an-existing-python-project-to-ruff/On a recent Building SaaS stream, we switched from using flake8, Black, isort, and bandit completely over to a single tool, Ruff. Watch an experienced Pythonista work through many of the options and do a full conversion to this powerful toolMessage Parsing and Ruff - Building SaaS #176https://www.mattlayman.com/videos/message-parsing-and-ruff-building-saas-with-python-and-django-176/Thu, 30 Nov 2023 00:00:00 +0000https://www.mattlayman.com/videos/message-parsing-and-ruff-building-saas-with-python-and-django-176/In this episode, we finished off the core portion of the application by parsing entries out of the messages sent back by SendGrid. We set up the Heroku Scheduler to start the daily flow of emails to get the system started. After completing that, I set up the project to use Ruff instead of the collection of tools used previously.Parse Inbound Email - Building SaaS #175https://www.mattlayman.com/videos/parse-inbound-email-building-saas-with-python-and-django-175/Thu, 16 Nov 2023 00:00:00 +0000https://www.mattlayman.com/videos/parse-inbound-email-building-saas-with-python-and-django-175/In this episode, we switched to the inbound side and parsed an email to transform it into a journal entry. This caused us to look into the dateutil library and look at Python’s standard email module to use EmailMessage.Idempotent Jobs - Building SaaS #174https://www.mattlayman.com/videos/idempotent-jobs-building-saas-with-python-and-django-174/Thu, 02 Nov 2023 00:00:00 +0000https://www.mattlayman.com/videos/idempotent-jobs-building-saas-with-python-and-django-174/In this episode, we cleaned up the email sending job. I had to make some changes based on some discoveries that I made while researching how to track responses and associate the journal entries back to the user. While doing this clean up, we added a new Prompt model to make the email sending job idempotent for each day.Email Round Trip - Building SaaS #173https://www.mattlayman.com/videos/email-round-trip-building-saas-with-python-and-django-173/Thu, 19 Oct 2023 00:00:00 +0000https://www.mattlayman.com/videos/email-round-trip-building-saas-with-python-and-django-173/In this episode, we took advantage of having all the DNS configuration complete and tried to find the path to connect the outgoing prompt email to the incoming journal entry from a user. We did this with some old-school print debugging and logging on production to see exactly what data is provided to the receiver webhook.Practical AI: HuggingFace Transformers and Diffusers for Beginnershttps://www.mattlayman.com/videos/practical-ai-huggingface-transformers-and-diffusers-for-beginners/Thu, 12 Oct 2023 00:00:00 +0000https://www.mattlayman.com/videos/practical-ai-huggingface-transformers-and-diffusers-for-beginners/This presentation provides a straightforward overview of the HuggingFace Transformers and Diffusers libraries. Aimed at those without a deep understanding of AI or ML, we’ll focus on practical, hands-on applications. We conclude by setting up a Flask app that generates AI images, demonstrating how these tools can be used to create useful applications.DNS Strikes Back - Building SaaS #172https://www.mattlayman.com/videos/dns-strikes-back-building-saas-with-python-and-django-172/Thu, 05 Oct 2023 00:00:00 +0000https://www.mattlayman.com/videos/dns-strikes-back-building-saas-with-python-and-django-172/In this episode, we returned to our DNS configuration from the previous stream and worked on testing email from end to end on the production site. On the stream, we spent a lot of time looking through SendGrid documentation, digging into layers of DNS, and troubleshooting the challenges that can arise when getting a site online.Deploy to Heroku - Building SaaS #171https://www.mattlayman.com/videos/deploy-to-heroku-building-saas-with-python-and-django-171/Thu, 28 Sep 2023 00:00:00 +0000https://www.mattlayman.com/videos/deploy-to-heroku-building-saas-with-python-and-django-171/In this episode, we did the work to deploy the site to Heroku to make the site live. We configured the production site, fixed some missing settings, and connected to the relevant DNS configuration.SendGrid Inbound - Building SaaS #170https://www.mattlayman.com/videos/sendgrid-inbound-building-saas-with-python-and-django-170/Thu, 07 Sep 2023 00:00:00 +0000https://www.mattlayman.com/videos/sendgrid-inbound-building-saas-with-python-and-django-170/In this episode, we worked on the inbound hook to receive email responses from SendGrid using the service’s Inbound Parse feature. We worked through the configuration and addressed the security concerns with opening up a public webhook.SendGrid Outbound - Building SaaS #169https://www.mattlayman.com/videos/sendgrid-outbound-building-saas-with-python-and-django-169/Thu, 24 Aug 2023 00:00:00 +0000https://www.mattlayman.com/videos/sendgrid-outbound-building-saas-with-python-and-django-169/In this episode, we took another step closer to deploying the service online. The primary goal was to make sure that email sending works. I spent a lot of time explaining email configuration and showing exactly how to wire up SendGrid to Cloudflare to do Domain Authentication that permits email sending from the service’s domain (journeyinbox.com).Deployment Checklist - Building SaaS #168https://www.mattlayman.com/videos/deployment-checklist-building-saas-with-python-and-django-168/Thu, 17 Aug 2023 00:00:00 +0000https://www.mattlayman.com/videos/deployment-checklist-building-saas-with-python-and-django-168/In this episode, I added the deployment checklist and improved the security of the app. Then we moved to work to set up the database to use DATABASE_URL and prepare to use Postgres.Practical Business Jinjahttps://www.mattlayman.com/videos/practical-business-jinja/Thu, 10 Aug 2023 00:00:00 +0000https://www.mattlayman.com/videos/practical-business-jinja/Inspired by the Practical Business Python blog this Python Frederick meetup will cover how to automate document creation using Python-docx and Jinja.Launch Preparation - Building SaaS #167https://www.mattlayman.com/videos/launch-preparation-building-saas-with-python-and-django-167/Thu, 03 Aug 2023 00:00:00 +0000https://www.mattlayman.com/videos/launch-preparation-building-saas-with-python-and-django-167/In this episode, I started working through the set of issues that I previously identified as necessary to complete before launching the service on Heroku. We add history tracking, soft deletion for the user model, and integration with SendGrid.Sentry Setup - Building SaaS #166https://www.mattlayman.com/videos/sentry-setup-building-saas-with-python-and-django-166/Thu, 27 Jul 2023 00:00:00 +0000https://www.mattlayman.com/videos/sentry-setup-building-saas-with-python-and-django-166/In this episode, I finished the email sending job, then determined which issues will be needed before launching the product. Once we crafted the short list, I added an integration with Sentry.Email Templates - Building SaaS #165https://www.mattlayman.com/videos/email-templates-building-saas-with-python-and-django-165/Thu, 20 Jul 2023 00:00:00 +0000https://www.mattlayman.com/videos/email-templates-building-saas-with-python-and-django-165/In this episode, we added the prompt email that will be the primary way of connecting to users for our email-based journaling service. I spent a fair amount of time thinking about copy writing to craft a compelling email that will resonate with users. Also, I made a bunch of silly mistakes and to keep correcting myself, so this is a good example of programming humility too.Announcing luatest: A Lua test runner inspired by pytesthttps://www.mattlayman.com/blog/2023/announcing-luatest/Mon, 17 Jul 2023 00:00:00 +0000https://www.mattlayman.com/blog/2023/announcing-luatest/I’m pleased to announce a new test runner for the Lua programming language: luatest. luatest draws deep inspiration from pytest in the Python ecosystem.
Why should you care?
You’re tired of BDD-style test runners in Lua for your projects. You want a fast, no nonsense test runner. The internet loves an unfair benchmark, so here goes. I converted the test suite for my side project, atlas, from busted to luatest. The execution time of the suite’s 109 tests went from an average of 1.Accounts and Email - Building SaaS #164https://www.mattlayman.com/videos/accounts-and-email-building-saas-with-python-and-django-164/Thu, 29 Jun 2023 00:00:00 +0000https://www.mattlayman.com/videos/accounts-and-email-building-saas-with-python-and-django-164/In this episode, I planned to do the work of sending email prompts for the journal to users. Along the path, we realized that the Account model was missing, so I stopped to build that out before we could proceed. By the end of the stream, we had a working background job that would send email and was 100% unit tested.First Major Model - Building SaaS #163https://www.mattlayman.com/videos/first-major-model-building-saas-with-python-and-django-163/Thu, 22 Jun 2023 00:00:00 +0000https://www.mattlayman.com/videos/first-major-model-building-saas-with-python-and-django-163/In this episode, we got to work on the core modeling for the application. I started by adding some visualization tooling to see the models in the system, then got to modeling of the primary Entry model that will be used throughout the app. Along the way, we set up the Django admin and did some automated testing.Python + Upsolver: Simplified Realtime Data Workflowshttps://www.mattlayman.com/videos/python-+-upsolver-simplified-realtime-data-workflows/Sat, 17 Jun 2023 00:00:00 +0000https://www.mattlayman.com/videos/python-+-upsolver-simplified-realtime-data-workflows/One of the powerful things about Python is its ability to connect disparate tools into one common integrated development experience. In this talk, we’ll explore how to create and run a near real-time pipeline where we consume events from a Kafka topic and transform the data before landing them in the lake, using Upsolver through our Python SDK. In this way, we get exactly-once processing, strong ordering and automatic schema evolution out of the box thanks to the powerful Upsolver engine, but without having to switch to a different UI and building in SQL only.Finish Signup and CI - Building SaaS #162https://www.mattlayman.com/videos/finish-signup-and-ci-building-saas-with-python-and-django-162/Thu, 08 Jun 2023 00:00:00 +0000https://www.mattlayman.com/videos/finish-signup-and-ci-building-saas-with-python-and-django-162/In this episode, I continued on the signup flows that started in the previous stream. We configured the email backend and verified that the end to end signup flow worked. Then I set up the templates system and added the initial templates for the confirmation email the index view of the whole site. The stream ended with configuring test coverage and setting up CI with GitHub Actions and pre-commit.ciNew SaaS Signup - Building SaaS #161https://www.mattlayman.com/videos/new-saas-signup-building-saas-with-python-and-django-161/Thu, 01 Jun 2023 00:00:00 +0000https://www.mattlayman.com/videos/new-saas-signup-building-saas-with-python-and-django-161/In this episode, we dug into the first portion of the journey SaaS. I acquired the domain name of journeyinbox.com for this service. That service is not live yet. We started at the beginning to set up users and sign up features.New SaaS From Scratch - Building SaaS #160https://www.mattlayman.com/videos/new-saas-from-scratch-building-saas-with-python-and-django-160/Thu, 18 May 2023 00:00:00 +0000https://www.mattlayman.com/videos/new-saas-from-scratch-building-saas-with-python-and-django-160/In this episode, I started a brand new SaaS project from scratch. This new SaaS, a journal service that will be at journeyinbox.com, will allow users to journal via email and be provided with past posts as a engaging prompt.Python Exercises and Behind the Scenes - Building SaaS #159https://www.mattlayman.com/videos/python-exercises-and-behind-the-scenes-building-saas-with-python-and-django-159/Thu, 27 Apr 2023 00:00:00 +0000https://www.mattlayman.com/videos/python-exercises-and-behind-the-scenes-building-saas-with-python-and-django-159/In this episode, we covered more intro Python exercises from Exercism. Then I did some behind the scenes work to make some improvements to my stream content.Python Exercism Exercises / Template Updates - Building SaaS #158https://www.mattlayman.com/videos/python-exercism-exercises-template-updates-building-saas-with-python-and-django-158/Thu, 20 Apr 2023 00:00:00 +0000https://www.mattlayman.com/videos/python-exercism-exercises-template-updates-building-saas-with-python-and-django-158/In this episode, I went through a few quick exercises on Exercism in the Python track. Then I returned to the features I’m developing that displays course resources connected to tasks in my homeschool app.Web Dev Panel Discussionhttps://www.mattlayman.com/videos/web-dev-panel-discussion/Fri, 14 Apr 2023 00:00:00 +0000https://www.mattlayman.com/videos/web-dev-panel-discussion/What is your burning web development question? That was the request for April’s event in 2023! We had a panel of web developers who were there to discuss web development questions and talk through the future of web development.Ellen's Alien Game / Display Related / Neovim config - Building SaaS #157https://www.mattlayman.com/videos/ellens-alien-game-display-related-neovim-config-building-saas-with-python-and-django-157/Thu, 30 Mar 2023 00:00:00 +0000https://www.mattlayman.com/videos/ellens-alien-game-display-related-neovim-config-building-saas-with-python-and-django-157/In this episode, I did another Exercism problem in Python that focused on Python classes. After the exercise, I deployed my model change from last stream and discussed deployment strategy. Then we worked on some of the display pieces for the new feature. Once the feature was added, I discussed performance testing and showed some performance problems that the new feature created that I then fixed. We ended the stream with some Neovim configuration to correct some LSP formatting problems.Locomotive Engineer / New Model Field - Building SaaS #156https://www.mattlayman.com/videos/locomotive-engineer-new-model-field-building-saas-with-python-and-django-156/Thu, 23 Mar 2023 00:00:00 +0000https://www.mattlayman.com/videos/locomotive-engineer-new-model-field-building-saas-with-python-and-django-156/In this episode, I did another Exercism problem in Python that focused on Python packing and unpacking of arguments. Once the exercise was complete, I started on a new feature with the homeschool app. We added a new model field in preparation for the changes. After that, I removed django-stubs because it wasn’t a good fit for my project.Locking Down Your Users' Secrets: Django Sessions 101https://www.mattlayman.com/blog/2023/django-sessions-secure/Sat, 18 Mar 2023 00:00:00 +0000https://www.mattlayman.com/blog/2023/django-sessions-secure/Django is a powerful and popular web framework that makes it easy to build robust and secure web applications. One of the key features of Django is its ability to manage user sessions, which are essential for many web applications. However, you may be wondering if Django sessions are secure. In this article, we’ll explore the security of Django sessions and see how they can be made even more secure.Cater Waiter, Template Bugs, and Type Fixes - Building SaaS #155https://www.mattlayman.com/videos/cater-waiter-template-bugs-and-type-fixes-building-saas-with-python-and-django-155/Thu, 16 Mar 2023 00:00:00 +0000https://www.mattlayman.com/videos/cater-waiter-template-bugs-and-type-fixes-building-saas-with-python-and-django-155/In this episode, I did another Exercism problem in Python that dug into Python sets. Once the exercise was complete, we went back to the issue list. I debugged and fixed a template error, the spent time improving types with my Django app.Sync or Async? Unpacking the Mysteries of Django Signalshttps://www.mattlayman.com/blog/2023/django-signals-async/Wed, 15 Mar 2023 00:00:00 +0000https://www.mattlayman.com/blog/2023/django-signals-async/Django is a popular web framework for Python developers, known for its robustness, flexibility, and security. One of the features that make Django powerful is its signal system. Signals allow developers to trigger certain actions when specific events occur, such as when a model is saved or deleted. However, there is often confusion about whether Django signals are asynchronous or not. In this article, we will explore this question and discuss the tradeoffs associated with using Django signals.Time Travel with django-simple-historyhttps://www.mattlayman.com/blog/2023/django-simple-history/Tue, 14 Mar 2023 00:00:00 +0000https://www.mattlayman.com/blog/2023/django-simple-history/If you’re interested in Django development, you might have come across the django-simple-history package. It’s a great tool that can help you keep track of changes made to your models over time. In this article, we’ll take a closer look at django-simple-history and how it can benefit your projects.
What is django-simple-history? django-simple-history is a third-party Django package that provides version control for your models. It allows you to keep track of changes made to your models, including who made the change, when it was made, and what the change was.Learn Django or Ruby on Rails?https://www.mattlayman.com/blog/2023/learning-django-or-rails/Sat, 11 Mar 2023 00:00:00 +0000https://www.mattlayman.com/blog/2023/learning-django-or-rails/I got a question from a patron on Patreon. The question is a common one, so I thought I’d share it along with my response.
Was there a reason why you picked the Django for your web development?
Did you consider RoR?
Does it matter which stack I use at the end of the day?
My primary reason for getting into Django was twofold.
First, I’ve been working with Python for a long time and have a lot of comfort with the language.Inventory Management / Custom 404 page / Go gqlgen - Building SaaS #154https://www.mattlayman.com/videos/inventory-management-custom-404-page-go-gqlgen-building-saas-with-python-and-django-154/Thu, 02 Mar 2023 00:00:00 +0000https://www.mattlayman.com/videos/inventory-management-custom-404-page-go-gqlgen-building-saas-with-python-and-django-154/In this episode, I did another Exercism problem in Python which focused on working with dictionaries. Once the exercise was complete, we worked on the homeschool app and created a custom 404 page so that Django would render something beyond a plain page. After working on Django, I did something totally different and worked on some Go code and used gqlgen to create a GraphQL service with generated code produced via a GraphQL schema.Backend Development 101 with Django REST Frameworkhttps://www.mattlayman.com/videos/backend-development-101-with-django-rest-framework/Tue, 14 Feb 2023 00:00:00 +0000https://www.mattlayman.com/videos/backend-development-101-with-django-rest-framework/If you’re familiar with Python, you’ve most certainly heard of Django, but may not know what it is used for and why people like it so much. We will first run through a ‘backend development 101’ crash-course, then talk about Django’s take on backend development and what Django REST Framework provides on top of it. Finally we will add a feature to an example Django app and do some live coding.Neovim setup / Tisbury Treasure Hunt / django-stubs - Building SaaS #153https://www.mattlayman.com/videos/neovim-setup-tisbury-treasure-hunt-django-stubs-building-saas-with-python-and-django-153/Thu, 29 Dec 2022 00:00:00 +0000https://www.mattlayman.com/videos/neovim-setup-tisbury-treasure-hunt-django-stubs-building-saas-with-python-and-django-153/In this episode, I updated and supercharged my editor by switching to Neovim. After that, we did an Exercism excercise that looked at Python tuples. Then I started on a new issues for my SaaS, but pivoted to adding django-stubs to improve the type hinting in the code.Gimme a (Type) Hint in Pythonhttps://www.mattlayman.com/videos/gimme-a-type-hint-in-python/Thu, 15 Dec 2022 00:00:00 +0000https://www.mattlayman.com/videos/gimme-a-type-hint-in-python/Types are a core part of understanding how Python works. This Python Frederick presentation introduces Python types (like str, int, float), explains how Python uses types, shows how to use Python type hints to improve your code, then covers a number of examples of showing types and type hints in action for a number of common scenarios.Colossal Coaster and Stripe CSP - Building SaaS #152https://www.mattlayman.com/videos/colossal-coaster-and-stripe-csp-building-saas-with-python-and-django-152/Thu, 08 Dec 2022 00:00:00 +0000https://www.mattlayman.com/videos/colossal-coaster-and-stripe-csp-building-saas-with-python-and-django-152/In this episode, we did an Exercism excercise that looked at Python list methods. Then we dug into Stripe and got to the bottom of some warnings reported by Firefox about potential Content Security Policy issues. Ultimately, we discovered some interesting additional Firefox cookie protection that were not found in Chrome.Learn Python By Example - Ghost Gobble Arcade Gamehttps://www.mattlayman.com/videos/learn-python-by-example-ghost-gobble-arcade-game/Fri, 02 Dec 2022 00:00:00 +0000https://www.mattlayman.com/videos/learn-python-by-example-ghost-gobble-arcade-game/Learn Python By Example shows a simple Python exercise from Exercism. This problem illustrates booleans in Python.Blackjack and Bugs - Building SaaS #151https://www.mattlayman.com/videos/blackjack-and-bugs-building-saas-with-python-and-django-151/Thu, 01 Dec 2022 00:00:00 +0000https://www.mattlayman.com/videos/blackjack-and-bugs-building-saas-with-python-and-django-151/In this episode, we started with a Python exercise on Exercism that explored Blackjack. We wrote functions that handled some of Blackjack’s core rules. After the Python exercise, we focused on a bug in the Django app that fixed an edge case with some the teacher checklist feature.Learn Python By Example - Currency Exchangehttps://www.mattlayman.com/videos/learn-python-by-example-currency-exchange/Mon, 28 Nov 2022 00:00:00 +0000https://www.mattlayman.com/videos/learn-python-by-example-currency-exchange/Learn Python By Example shows a simple Python exercise from Exercism. This problem illustrates numbers in Python and how to use the built-in math operators. Since this is the first video in this series, I also take a bit of time to show how to use Exercism along the way in case you would like to learn using Exercism as well.Development Cached Templates - Building SaaS #150https://www.mattlayman.com/videos/development-cached-templates-building-saas-with-python-and-django-150/Thu, 17 Nov 2022 00:00:00 +0000https://www.mattlayman.com/videos/development-cached-templates-building-saas-with-python-and-django-150/In this episode, I ran through a Python exercise on Exercism that focused on strings. Then we moved onto the homeschool app and fixed an issue with templates that were cached during development because of changes in Django 4.1.Exercism and PDF Page Numbering - Building SaaS #149https://www.mattlayman.com/videos/exercism-and-pdf-page-numbering-building-saas-with-python-and-django-149/Thu, 03 Nov 2022 00:00:00 +0000https://www.mattlayman.com/videos/exercism-and-pdf-page-numbering-building-saas-with-python-and-django-149/In this episode, we started to work on Python learning problems on Exercism. Then I added page numbers to PDFs on my homeschool app.How To Add Sentry - Building SaaS #148https://www.mattlayman.com/videos/how-to-add-sentry-building-saas-with-python-and-django-148/Thu, 20 Oct 2022 00:00:00 +0000https://www.mattlayman.com/videos/how-to-add-sentry-building-saas-with-python-and-django-148/In this episode, I switched my error management system from Rollbar to Sentry and walked through some of Sentry’s features.Cryptography in Pythonhttps://www.mattlayman.com/videos/cryptography-in-python/Thu, 13 Oct 2022 00:00:00 +0000https://www.mattlayman.com/videos/cryptography-in-python/Cryptography underpins virtually all of modern data security, including everything from safe online shopping to secure password storage. But it’s also famous for being difficult to understand and easy to mess up!
This presentation is from Andrew Sillers at Python Frederick. I’m including it on my site because Andrew did a great job of covering this core crypto concepts.Heroku Stack Upgrade - Building SaaS #147https://www.mattlayman.com/videos/heroku-stack-upgrade-building-saas-with-python-and-django-147/Thu, 06 Oct 2022 00:00:00 +0000https://www.mattlayman.com/videos/heroku-stack-upgrade-building-saas-with-python-and-django-147/In this episode, I did some upgrades. We upgraded the app to the latest Heroku stack, upgraded htmx to the latest version, then worked on a small feature to add an empty state to a page when there is no useful data to display.Episode 17 - Accepting Fileshttps://www.mattlayman.com/django-riffs/accepting-files/Tue, 04 Oct 2022 00:00:00 +0000https://www.mattlayman.com/django-riffs/accepting-files/On this episode, we’re going to dig into file management. Unlike the static files that you create for the app yourself, you may want your app to accept files from your users. Profile pictures are a good example of user files. You’ll see how Django handles those kinds of files and how to deal with them safely.
Listen at Spotify.
Last Episode On the last episode, we looked at how to manage settings on your Django site.JavaScript FormData - Building SaaS #146https://www.mattlayman.com/videos/javascript-formdata-building-saas-with-python-and-django-146/Thu, 29 Sep 2022 00:00:00 +0000https://www.mattlayman.com/videos/javascript-formdata-building-saas-with-python-and-django-146/In this episode, we finished off one of the dynamic features of my homeschool app that required working with some JavaScript. I showed off what I learned about some of my mistakes from the previous week, and we completed the feature and tested things out.Customer Features - Building SaaS #145https://www.mattlayman.com/videos/customer-features-building-saas-with-python-and-django-145/Thu, 22 Sep 2022 00:00:00 +0000https://www.mattlayman.com/videos/customer-features-building-saas-with-python-and-django-145/In this episode, we picked up some customer features to improve the app. I knocked out the first feature pretty quickly. The second feature involved working with FormData in the DOM, which proved to have some interesting challenges.Delete Task UX - Building SaaS #144https://www.mattlayman.com/videos/delete-task-ux-building-saas-with-python-and-django-144/Thu, 08 Sep 2022 00:00:00 +0000https://www.mattlayman.com/videos/delete-task-ux-building-saas-with-python-and-django-144/In this episode, I worked on an issue to improve the user experience when deleting a task. The previous version forgot the user’s position in a task delete, and we updated the view so that the user would be returned to the same portion of a task list in the course.flake8-bugbear - Building SaaS #143https://www.mattlayman.com/videos/flake8-bugbear-building-saas-with-python-and-django-143/Thu, 01 Sep 2022 00:00:00 +0000https://www.mattlayman.com/videos/flake8-bugbear-building-saas-with-python-and-django-143/In this episode, I updated my app to use flake8-bugbear. I fixed the issues that popped up and talked about strategies to manage adding new tools.Finish Teacher Checklist - Building SaaS #142https://www.mattlayman.com/videos/finish-teacher-checklist-building-saas-with-python-and-django-142/Thu, 25 Aug 2022 00:00:00 +0000https://www.mattlayman.com/videos/finish-teacher-checklist-building-saas-with-python-and-django-142/In this episode, we finished off the teacher checklist feature in the homeschool app. I tied together all the loose ends, checked the feature end to end, and wrote the unit tests to complete the whole effort.Teacher Checklist Editing - Building SaaS #141https://www.mattlayman.com/videos/teacher-checklist-editing-building-saas-with-python-and-django-141/Thu, 18 Aug 2022 00:00:00 +0000https://www.mattlayman.com/videos/teacher-checklist-editing-building-saas-with-python-and-django-141/In this episode, I returned to the teacher checklist feature and started work on the edit page that will allow users to customize what they see on the checklist.Distributed System IDshttps://www.mattlayman.com/blog/2022/distributed-system-ids/Wed, 10 Aug 2022 00:00:00 +0000https://www.mattlayman.com/blog/2022/distributed-system-ids/Which one of these is an ID for an account?
acct_UwHaw7hBQAcXKofSdJhhfPlw UwHaw7hBQAcXKofSdJhhfPlw There’s not a right answer to this question. Either of these IDs could be linked to an account in a given system. Between the two, which do you think would be more likely to be an account ID? The first one, with its acct_ prefix, feels a lot more likely to be an account ID.
I’ve been thinking about distributed system identifiers recently and trying to shore up my preferences.Brute Force Developmenthttps://www.mattlayman.com/blog/2022/brute-force-development/Tue, 09 Aug 2022 00:00:00 +0000https://www.mattlayman.com/blog/2022/brute-force-development/Some software development tasks are boring and laborious.
Here are some examples:
Adding a linter and fixing all the issues. Adding type hints to all Python function signatures and fixing all the issues. Upgrading dependencies and packages in a project. Fixing all the deprecation warnings coming from a test suite. The pain of these types of tasks often grows with the size of the software system that you’re operating on. How can you deal with problems like this?Huge Software Systemshttps://www.mattlayman.com/blog/2022/software-system-size/Mon, 08 Aug 2022 00:00:00 +0000https://www.mattlayman.com/blog/2022/software-system-size/My employer is a mid-sized company with a fair number of engineers. We have a big software system with a service oriented architecture and hundreds of code repositories.
The system has multiple monoliths, multiple monorepos, standalone service repositories, internal libraries, data science repositories, and many other kinds of software. How do you manage a system like that?
This is one of the interesting problems that I am faced with daily in my role.Finding Your Audience for Technical Docshttps://www.mattlayman.com/blog/2022/documentation-audience/Sat, 06 Aug 2022 00:00:00 +0000https://www.mattlayman.com/blog/2022/documentation-audience/While on vacation this week, aside from time spent with my family, I did a few things:
Read large chunks of the SQLite docs Wrote an announcement article for a new open source package Edited my upcoming Django book With each of these things, the audience became obvious to me. And that’s important since an undefined audience is bound to lead to writing that wanders. If you want to learn how to write technical documentation with impact, I think my thoughts below will help.Authz dilemmashttps://www.mattlayman.com/blog/2022/authz/Fri, 05 Aug 2022 00:00:00 +0000https://www.mattlayman.com/blog/2022/authz/Authorization. The subject of answering “what is the user allowed to do?”
This is a hard problem in software systems. I recently tried to solve authz issues in my own side project, and I’ve been thinking about this for work.
The problem is that authz is one of those extra layers that I think most people don’t care about. We want our software to be protected appropriately, but I don’t think we want to do the work.Announcing django-deniedhttps://www.mattlayman.com/blog/2022/announcing-django-denied/Mon, 01 Aug 2022 00:00:00 +0000https://www.mattlayman.com/blog/2022/announcing-django-denied/I have paranoia when it comes to my Django app.
I run a homeschool scheduling service called School Desk. My Software as a Service (SaaS) lets families plan their homeschool activities. Since the app deals with data about students (including my kids!), it’s important to me that every user’s data is protected, so that users can only view their own information.
When I designed the system, I picked a shared Postgres schema (i.Extract a New Open Source Package - Building SaaS #140https://www.mattlayman.com/videos/extract-a-new-open-source-package-building-saas-with-python-and-django-140/Thu, 28 Jul 2022 00:00:00 +0000https://www.mattlayman.com/videos/extract-a-new-open-source-package-building-saas-with-python-and-django-140/In this episode, I pulled out code from homeschool application and started a new open source project for a portion that I thought would be useful for others. The new package, which I have called django-denied, is a way of handling authorization in your Django apps.Teacher Checklist Model - Building SaaS #139https://www.mattlayman.com/videos/teacher-checklist-model-building-saas-with-python-and-django-139/Thu, 21 Jul 2022 00:00:00 +0000https://www.mattlayman.com/videos/teacher-checklist-model-building-saas-with-python-and-django-139/In this episode, we created a new model for the teacher checklist feature that I recently added to my homeschool app. This new checklist model will enable users to filter out courses that appear on a teacher’s checklist.Teacher Checklist Template - Building SaaS #138https://www.mattlayman.com/videos/teacher-checklist-template-building-saas-with-python-and-django-138/Thu, 30 Jun 2022 00:00:00 +0000https://www.mattlayman.com/videos/teacher-checklist-template-building-saas-with-python-and-django-138/In this episode, I started by finishing off some refactoring work that I began on the previous stream. Once that was wrapped up, I built the data for the teacher checklist wit the context data that I added in previous streams.Refactoring and New Features - Building SaaS #137https://www.mattlayman.com/videos/refactoring-and-new-features-building-saas-with-python-and-django-137/Thu, 23 Jun 2022 00:00:00 +0000https://www.mattlayman.com/videos/refactoring-and-new-features-building-saas-with-python-and-django-137/In this episode, I continued on the teacher checklist for the homeschooling app. We added data to the context and this required some refactoring to be able to reuse data from other parts of the app.New App In Project - Building SaaS #136https://www.mattlayman.com/videos/new-app-in-project-building-saas-with-python-and-django-136/Thu, 16 Jun 2022 00:00:00 +0000https://www.mattlayman.com/videos/new-app-in-project-building-saas-with-python-and-django-136/In this episode, I broke ground on a brand new feature. The feature will be a task checklist for teachers. Since the checklist is directly for teachers, I created a new Django app named teachers and showed how to hook that into the rest of my Django project.You Don't Need JavaScripthttps://www.mattlayman.com/videos/you-dont-need-javascript/Thu, 09 Jun 2022 00:00:00 +0000https://www.mattlayman.com/videos/you-dont-need-javascript/What If I Told You… You Don’t Need JavaScript.
This talk explores why JavaScript is not good fit for most web apps.
I then show how most web apps can do dynamic things using htmx. htmx is an extension library to make HTML markup better.
I present examples of AJAX fetching and deletion. The presentation includes a dynamic search and how to implement infinite scrolling with a trivial amount of code.Debugging Tips And Techniqueshttps://www.mattlayman.com/understand-django/debugging-tips-techniques/Tue, 31 May 2022 00:00:00 +0000https://www.mattlayman.com/understand-django/debugging-tips-techniques/In the last Understand Django article, we looked at security. How does a Django site stay safe on the big, bad internet? The article explored some core elements for making a Django app more secure.
With this article, we will investigate problem solving techniques for Django apps. The goal is to equip you with tools to fix the real problems that you’ll hit when building your Django site.
From Browser To DjangoURLs Lead The WayViews On ViewsTemplates For User InterfacesUser Interaction With FormsStore Data With ModelsAdminister All The ThingsAnatomy Of An ApplicationUser AuthenticationMiddleware Do You Go?Brew Install The World - Building SaaS #135https://www.mattlayman.com/videos/brew-install-the-world-building-saas-with-python-and-django-135/Thu, 26 May 2022 00:00:00 +0000https://www.mattlayman.com/videos/brew-install-the-world-building-saas-with-python-and-django-135/In this episode, I tried to get started after a long break, but my virtual environment was broken. This entire episode is a journey deep into Python installing world. Did I come out on the other side? Yes, we figured it out. You’ll have to watch (or skip to the end) to figure out what happened. :)User Requests - Building SaaS #134https://www.mattlayman.com/videos/user-requests-building-saas-with-python-and-django-134/Thu, 28 Apr 2022 00:00:00 +0000https://www.mattlayman.com/videos/user-requests-building-saas-with-python-and-django-134/In this episode, we took a break between big projects and worked on some smaller usability features requested by users of the app.S3 FileField - Building SaaS #133https://www.mattlayman.com/videos/s3-filefield-building-saas-with-python-and-django-133/Thu, 21 Apr 2022 00:00:00 +0000https://www.mattlayman.com/videos/s3-filefield-building-saas-with-python-and-django-133/In this episode, we built the UI to allow users to request an end-of-year PDF bundle. Then we hooked the model up to S3 via django-storages and tested everything out.Great Expectations Data Quality Testinghttps://www.mattlayman.com/videos/great-expectations-data-quality-testing/Thu, 14 Apr 2022 00:00:00 +0000https://www.mattlayman.com/videos/great-expectations-data-quality-testing/Great Expectations is a shared, open standard for data quality. It helps data teams eliminate pipeline debt, through data testing, documentation, and profiling https://greatexpectations.io/PDF Courses Report - Building SaaS #132https://www.mattlayman.com/videos/pdf-courses-report-building-saas-with-python-and-django-132/Thu, 31 Mar 2022 00:00:00 +0000https://www.mattlayman.com/videos/pdf-courses-report-building-saas-with-python-and-django-132/In this episode, we added a final PDF report to the PDF bundle. This report was different than the other because there wasn’t a pre-existing HTML report to mimic. I built a report that shows all the completed course tasks for each student.PDF Attendance Report - Building SaaS #131https://www.mattlayman.com/videos/pdf-attendance-report-building-saas-with-python-and-django-131/Thu, 24 Mar 2022 00:00:00 +0000https://www.mattlayman.com/videos/pdf-attendance-report-building-saas-with-python-and-django-131/In this episode, we added a third PDF report to the PDF bundle. The patterns from previous reports made this one go faster, but I hit some small snags with the output of the PDF being crushed together.Lua Log #9: HTTP Parserhttps://www.mattlayman.com/blog/2022/lua-log-9-http-parser/Sat, 19 Mar 2022 00:00:00 +0000https://www.mattlayman.com/blog/2022/lua-log-9-http-parser/As both a web framework and a web server, Atlas needs to parse HTTP requests.
My approach to this project is to build just enough of what I need before I can move onto the next piece of the project. I’m trying to reach a stage where the framework is actually useful for someone, even if there are lots of sharp edges and unhandled corner cases.
What is a “just enough” HTTP parser at such an early stage?PDF Progress Report - Building SaaS #130https://www.mattlayman.com/videos/pdf-progress-report-building-saas-with-python-and-django-130/Thu, 17 Mar 2022 00:00:00 +0000https://www.mattlayman.com/videos/pdf-progress-report-building-saas-with-python-and-django-130/In this episode, we added the next report to the PDF bundle. In the process of adding this report, I cleaned up some of the PDF generation code and refactored to some common patterns.Lua Log #8: HTTP Parsinghttps://www.mattlayman.com/blog/2022/lua-log-8-http-parsing/Sun, 13 Mar 2022 00:00:00 +0000https://www.mattlayman.com/blog/2022/lua-log-8-http-parsing/Since my last entry about Atlas, I built a couple of fundamental abstractions into my framework: a Request object and a Response object.
At this point in the web framework, I’m shooting to keep the number of supporting protocols to a minimum. Even though the ASGI specification discusses a few different protocols like HTTP and websockets, I only intend to focus on HTTP for now.
Because I’m focused exclusively on HTTP, I can think about the core semantics of that protocol.Security And Djangohttps://www.mattlayman.com/understand-django/secure-apps/Thu, 10 Mar 2022 00:00:00 +0000https://www.mattlayman.com/understand-django/secure-apps/In the last Understand Django article, we learned about where apps slow down. We explored techniques that help sites handle the load and provide a fast experience for users.
With this article, we will look at security. How does a Django site stay safe on the big, bad internet? Let’s find out.
From Browser To DjangoURLs Lead The WayViews On ViewsTemplates For User InterfacesUser Interaction With FormsStore Data With ModelsAdminister All The ThingsAnatomy Of An ApplicationUser AuthenticationMiddleware Do You Go?Lua Log #7: Routing Requestshttps://www.mattlayman.com/blog/2022/lua-log-7-routing/Sun, 06 Mar 2022 00:00:00 +0000https://www.mattlayman.com/blog/2022/lua-log-7-routing/Any web framework that wants to be useful needs some kind of mechanism to take HTTP request paths and map those requests to some kind of code that can return a response. That’s the functionality that I added to Atlas this week.
Generally, in my experience with web frameworks, this concept of connecting HTTP requests to the right handling code is called routing.
I’ve seen a couple of big ways to handle routing.PDF Debugging - Building SaaS #129https://www.mattlayman.com/videos/pdf-debugging-building-saas-with-python-and-django-129/Thu, 03 Mar 2022 00:00:00 +0000https://www.mattlayman.com/videos/pdf-debugging-building-saas-with-python-and-django-129/In this episode, I debugged the static file handling that my homeschool application is using when it generates PDF reports. Note: There was some stream trouble. This segment of the stream had no webcam video and was disconnected. Part 2 shows the successful completion of the PDF integration which you can see at https://www.youtube.com/watch?v=F5CBNNZMdxs.Lua Log #6: LASGI - ASGI in Luahttps://www.mattlayman.com/blog/2022/lua-log-6-lasgi/Sun, 27 Feb 2022 00:00:00 +0000https://www.mattlayman.com/blog/2022/lua-log-6-lasgi/In Atlas, I’m implementing a full web framework. I’m also taking on the challenge of building a web server to pair with the web framework and the application that the framework produces.
How I should I connect the web server and the web application? There’s an interface between those two systems. Since I know a lot about the Python web ecosystem, I know that some very smart developers have given considerable thought to the interface layer between servers and applications.Form Features and CSS - Building SaaS #128https://www.mattlayman.com/videos/form-features-and-css-building-saas-with-python-and-django-128/Thu, 24 Feb 2022 00:00:00 +0000https://www.mattlayman.com/videos/form-features-and-css-building-saas-with-python-and-django-128/In this episode, we worked on a user requested feature that improves a workflow for task management in the homeschool app. After completing the feature, I returned to the PDF bundle project to add CSS styling to the PDF report.Upgrade to Tailwind CSS v3 - Building SaaS #127https://www.mattlayman.com/videos/upgrade-to-tailwind-css-v3-building-saas-with-python-and-django-127/Thu, 17 Feb 2022 00:00:00 +0000https://www.mattlayman.com/videos/upgrade-to-tailwind-css-v3-building-saas-with-python-and-django-127/In this episode, I upgraded my app to switch from Tailwind CSS v2 to v3. We worked through the migration guide to make all the needed changes to work with v3. Then I upgraded my development tools to make Tailwind updates as I develop my templates.Lua Log #5: Callbacks to Coroutineshttps://www.mattlayman.com/blog/2022/lua-log-5-callbacks-coroutines/Sat, 12 Feb 2022 00:00:00 +0000https://www.mattlayman.com/blog/2022/lua-log-5-callbacks-coroutines/When I interact with my Atlas project as a user, I don’t want to work with callbacks. Using callbacks is a fairly confusing mechanism compared to synchronous lines of code. Compare:
local function callback() do_stuff_later() end do_stuff_now(some_argument, callback) Versus:
do_stuff_now(some_argument) do_stuff_later() To my eye, the latter version is astoundingly better.
The challenge that I have on my project is that I’m using Lua’s binding library to libuv called luv, and luv makes heavy use of callbacks.Episode 16 - Setting Your Siteshttps://www.mattlayman.com/django-riffs/setting-sites/Sun, 06 Feb 2022 00:00:00 +0000https://www.mattlayman.com/django-riffs/setting-sites/On this episode, we look at how to manage settings on your Django site. What are the common techniques to make this easier to handle? Let’s find out!
Listen at Spotify.
Last Episode On the last episode, we dug into sessions and how Django uses that data storage technique for visitors to your site.
How Is Django Configured? To run properly, Django needs to be configured. We need to understand where this configuration comes from.Lua Log #4: Build a (Terrible) Packagehttps://www.mattlayman.com/blog/2022/lua-log-4-packaging/Sat, 05 Feb 2022 00:00:00 +0000https://www.mattlayman.com/blog/2022/lua-log-4-packaging/I have weird vision that, someday, my Atlas project will be useful to others. This is a particularly weird vision because the project is mostly for me to explore building a web framework. Realistically, I don’t expect any kind of consumer audience for a long time, if ever.
Even if there is no plan on the horizon to have something useful for others, I wanted to learn how to distribute code in the Lua ecosystem.Admin Interface For PDFs - Building SaaS #126https://www.mattlayman.com/videos/admin-interface-for-pdfs-building-saas-with-python-and-django-126/Thu, 03 Feb 2022 00:00:00 +0000https://www.mattlayman.com/videos/admin-interface-for-pdfs-building-saas-with-python-and-django-126/In this episode, I need tools to inspect some PDF reports that I’m building that customers of my homeschool app will use at the end of the school year. I build the admin tools that allow me to see these PDFs quickly.Lua Log #3: Logging Without Logginghttps://www.mattlayman.com/blog/2022/lua-log-3-logging/Sat, 29 Jan 2022 00:00:00 +0000https://www.mattlayman.com/blog/2022/lua-log-3-logging/I suppose this is my meta post about logging in my log of Lua activities. My goal this week was to fix this:
$ busted ++++++++++Listening for requests on http://127.0.0.1:5555 +++++++++++++++++++++++++++++++ 41 successes / 0 failures / 0 errors / 0 pending : 0.535622 seconds If you poke around in the source code of my Atlas project, you’d find a bunch of print function calls. The “Listening for requests…” message above was one of those print calls.Ordering Existing Models - Building SaaS #125https://www.mattlayman.com/videos/ordering-existing-models-building-saas-with-python-and-django-125/Thu, 27 Jan 2022 00:00:00 +0000https://www.mattlayman.com/videos/ordering-existing-models-building-saas-with-python-and-django-125/In this episode, we built out a customer requested feature of adding order of grade levels within the school year of my homeschool app. This will allow users to change the display of crucial pages within the app.Lua Log #2: Yak Shaving the Ecosystemhttps://www.mattlayman.com/blog/2022/lua-log-2-yak-shaving-ecosystem/Sat, 22 Jan 2022 00:00:00 +0000https://www.mattlayman.com/blog/2022/lua-log-2-yak-shaving-ecosystem/I picked Lua for my hobby project deliberately. I chose Lua because it’s a fast and small interpreted language. I also chose the language because it is a smaller ecosystem than the Python ecosystem that I usually work in.
On the Tiobe Index, Python is in the pole position at #1, while Lua is not even in the top 25. Lua sits at 30th rank on the index.
From my point of view, this means that there are more unexplored areas for the Lua ecosystem.Zip Archive HTTP Response - Building SaaS #124https://www.mattlayman.com/videos/zip-archive-http-response-building-saas-with-python-and-django-124/Fri, 21 Jan 2022 00:00:00 +0000https://www.mattlayman.com/videos/zip-archive-http-response-building-saas-with-python-and-django-124/In this episode, we continued to build the PDF reporting feature. The focus on the stream was on building the zip archive file as the HTTP response. This will be the container for future PDF reports. I also started the setup for the weasyprint PDF package.Go Fast With Djangohttps://www.mattlayman.com/understand-django/go-fast/Wed, 19 Jan 2022 00:00:00 +0000https://www.mattlayman.com/understand-django/go-fast/In the last Understand Django article, we learned about commands. Commands are the way to execute scripts that interact with your Django app.
With this article, we’re going to dig into performance. How do you make your Django site faster? Keep reading to find out.
From Browser To DjangoURLs Lead The WayViews On ViewsTemplates For User InterfacesUser Interaction With FormsStore Data With ModelsAdminister All The ThingsAnatomy Of An ApplicationUser AuthenticationMiddleware Do You Go?Lua Log #1: Event Loop Adventureshttps://www.mattlayman.com/blog/2022/lua-log-event-loop-adventures/Sun, 16 Jan 2022 00:00:00 +0000https://www.mattlayman.com/blog/2022/lua-log-event-loop-adventures/Last summer, I went on a beach vacation with my family, and I needed something to do when we weren’t doing family things. My primary software skills are in the Python and Django world, and I decided that I want to something very different to stretch my brain in new ways. On a whim, I thought it might be fun to make a web framework in Lua.
Lua is a very compact, interpretted language that originates from a group of academics at a university in Brazil.Most Abstract Function First Is Betterhttps://www.mattlayman.com/blog/2022/most-abstract-function-first-better/Mon, 10 Jan 2022 00:00:00 +0000https://www.mattlayman.com/blog/2022/most-abstract-function-first-better/Python is one of many languages that will let you define your module’s functions in whatever order you want. If your language of choice allows functions to be order independent, what order should you choose?
Let’s illustrate what I’m talking about so that we’re all on the same page. First, here’s a Python example that puts the helper function first.
def child(): print("hello world") def parent(): child() parent() And here’s a version that does the opposite.PDF Bundle Report - Building SaaS #123https://www.mattlayman.com/videos/pdf-bundle-report-building-saas-with-python-and-django-123/Thu, 06 Jan 2022 00:00:00 +0000https://www.mattlayman.com/videos/pdf-bundle-report-building-saas-with-python-and-django-123/In this episode, we started work on a new feature for the homeschool application. This feature is a report bundle that will add PDFs of all school year activities to a zip archive for a customer’s record keeping purposes.Goals for 2022https://www.mattlayman.com/blog/2022/goals/Sat, 01 Jan 2022 00:00:00 +0000https://www.mattlayman.com/blog/2022/goals/Every year, I set goals for myself as a way to reflect on the previous year and project ahead on what I hope to do.
In past years, I’ve recorded these goals using everything from Evernote to pen and paper to READMEs in a GitHub repository. This year, I’ve decided to post my goal in a more publicly visible way for a couple of reasons.
Accountability - If my goals are public, then it’s harder for me for me to back out of doing them.Customer UX Feature - Building SaaS #122https://www.mattlayman.com/videos/customer-ux-feature-building-saas-with-python-and-django-122/Thu, 23 Dec 2021 00:00:00 +0000https://www.mattlayman.com/videos/customer-ux-feature-building-saas-with-python-and-django-122/In this episode, I added some user experience (UX) polish to my Django app to fill in a gap where users couldn’t quickly jump to their proper school year when their homeschool is between school years. We cleaned up the view, modified a template, and wrote the test to prove that the change works.Threat Modeling Jurassic Park with Pythonhttps://www.mattlayman.com/videos/threat-modeling-jurassic-park-with-python/Thu, 09 Dec 2021 00:00:00 +0000https://www.mattlayman.com/videos/threat-modeling-jurassic-park-with-python/How would John Hammond design the systems on Isla Nublar in 2021? Would he spare no expense to reduce risk of a disaster? We hope that his software engineers would employ the concept of threat modeling, one of the most important security skills in modern software development. Corey will give an overview of what threat modeling is, and how to use it to highlight security concerns early on in the SDLC.Customer Requests - Building SaaS #121https://www.mattlayman.com/videos/customer-requests-building-saas-with-python-and-django-121/Thu, 02 Dec 2021 00:00:00 +0000https://www.mattlayman.com/videos/customer-requests-building-saas-with-python-and-django-121/In this episode, we started by trying to add django-auto-prefetch. Unfortunately, it didn’t work well for my app. I decided to stop trying to add that package and switched to working on a feature request of one of my customers.Scheduling Bugs - Building SaaS #120https://www.mattlayman.com/videos/scheduling-bugs-building-saas-with-python-and-django-120/Thu, 18 Nov 2021 00:00:00 +0000https://www.mattlayman.com/videos/scheduling-bugs-building-saas-with-python-and-django-120/In this episode, I debugged a deep scheduling bug that was tricky to track down and understand.Command Your Apphttps://www.mattlayman.com/understand-django/command-apps/Thu, 04 Nov 2021 00:00:00 +0000https://www.mattlayman.com/understand-django/command-apps/In the last Understand Django article, we dug into file management. We saw how Django handles user uploaded files and how to deal with them safely.
With this article, you’ll learn about commands. Commands are the way to execute scripts that interact with your Django app. We’ll see built-in commands and how to build your own.
From Browser To DjangoURLs Lead The WayViews On ViewsTemplates For User InterfacesUser Interaction With FormsStore Data With ModelsAdminister All The ThingsAnatomy Of An ApplicationUser AuthenticationMiddleware Do You Go?Working With django-htmx - Building SaaS #119https://www.mattlayman.com/videos/working-with-django-htmx-building-saas-with-python-and-django-119/Thu, 04 Nov 2021 00:00:00 +0000https://www.mattlayman.com/videos/working-with-django-htmx-building-saas-with-python-and-django-119/In this episode, I added django-htmx to help finish off a bulk task deletion feature for my homeschool app. We explored the features that are available in django-htmx, and I showed how to add django-htmx to my project and fully integrate the package.Bulk Delete Template - Building SaaS #118https://www.mattlayman.com/videos/bulk-delete-template-building-saas-with-python-and-django-118/Thu, 21 Oct 2021 00:00:00 +0000https://www.mattlayman.com/videos/bulk-delete-template-building-saas-with-python-and-django-118/In this episode, I worked on the bulk delete template that users will see when deleting tasks within the homeschool app.Pandas for Data Analysishttps://www.mattlayman.com/videos/pandas-for-data-analysis/Thu, 14 Oct 2021 00:00:00 +0000https://www.mattlayman.com/videos/pandas-for-data-analysis/#Pandas is a great library for reading and manipulating data. Chris Malec gave an overview of pandas, focusing on how to read in some common data types, create filters to specific table cells, apply functions to your data, merge tables together, and create nice plots as well as summary tables from your data. For an application, Chris used some financial data, and briefly discussed his work at FinRA finding manipulative behavior in the US stock market.Bulk Delete Form - Building SaaS #117https://www.mattlayman.com/videos/bulk-delete-form-building-saas-with-python-and-django-117/Fri, 08 Oct 2021 00:00:00 +0000https://www.mattlayman.com/videos/bulk-delete-form-building-saas-with-python-and-django-117/In this episode, I worked on the bulk delete form that I need so that my customers can delete many tasks in the system at once.Bulk Delete View - Building SaaS #116https://www.mattlayman.com/videos/bulk-delete-view-building-saas-with-python-and-django-116/Thu, 30 Sep 2021 00:00:00 +0000https://www.mattlayman.com/videos/bulk-delete-view-building-saas-with-python-and-django-116/In this episode, I started a bulk delete view to make it possible for customers to delete many course tasks at once.Finish School Break Filtering - Building SaaS #115https://www.mattlayman.com/videos/finish-school-break-filtering-building-saas-with-python-and-django-115/Thu, 23 Sep 2021 00:00:00 +0000https://www.mattlayman.com/videos/finish-school-break-filtering-building-saas-with-python-and-django-115/In this episode, we finished the UI work and wrote the final tests needed to complete the school break filtering by student feature.Student Filtering UI - Building SaaS #114https://www.mattlayman.com/videos/student-filtering-ui-building-saas-with-python-and-django-114/Thu, 16 Sep 2021 00:00:00 +0000https://www.mattlayman.com/videos/student-filtering-ui-building-saas-with-python-and-django-114/In this episode, we worked on UI and form changes to enable the extra many to many filtering that enables school breaks to be applied to individual students.User File Usehttps://www.mattlayman.com/understand-django/media-files/Tue, 14 Sep 2021 00:00:00 +0000https://www.mattlayman.com/understand-django/media-files/In the last Understand Django article, you learned about Django settings and how to manage the configuration of your application. We also looked at tools to help you define settings effectively.
With this article, we’re going to dig into file management. Unlike the static files that you create for the app yourself, you may want your app to accept files from your users. Profile pictures are a good example of user files.Episode 15 - User Session Datahttps://www.mattlayman.com/django-riffs/15-user-session-data/Mon, 13 Sep 2021 00:00:00 +0000https://www.mattlayman.com/django-riffs/15-user-session-data/On this episode, we will dig into a data storage technique that Django makes heavy use of for visitors to your site. This category of data is called session data.
Listen at Spotify.
Last Episode On the last episode episode, we looked at what it takes to go live and how to prepare your Django project for the internet.
What Is A Session? A session is a set of data that is available to users that Django can use over multiple requests.School Break Filters - Building SaaS #113https://www.mattlayman.com/videos/school-break-filters-building-saas-with-python-and-django-113/Thu, 02 Sep 2021 00:00:00 +0000https://www.mattlayman.com/videos/school-break-filters-building-saas-with-python-and-django-113/In this episode, we finished up making changes to the app to support filtering school breaks to students.Team Topologies: a reviewhttps://www.mattlayman.com/blog/2021/team-topologies-review/Mon, 02 Aug 2021 00:00:00 +0000https://www.mattlayman.com/blog/2021/team-topologies-review/As a recommendation from a coworker, I picked up Team Topologies by Matthew Skelton and Manuel Pais. The topic of team organization is on my mind because my employer, Doctor On Demand, recently merged with Grand Rounds Health. Our engineering teams are coming together, and the process is bringing about a lot of questions for merging gracefully.
I’ll share some highlights of what I think about this book.
The core idea with Team Topologies circles around Conway’s Law.Episode 14 - Going Livehttps://www.mattlayman.com/django-riffs/14-go-live-deployment/Mon, 19 Jul 2021 00:00:00 +0000https://www.mattlayman.com/django-riffs/14-go-live-deployment/On this episode, we will look at what it takes to go live and how to prepare your Django project for the internet.
Listen at Spotify.
Last Episode On the last episode, we discussed how you can verify that your site works and continues to work. We dug into automated testing and how to write tests for your Django apps.
Pick A Python Application Server When you begin to learn Django, the documentation will instruct you to use .Making Sense Of Settingshttps://www.mattlayman.com/understand-django/settings/Thu, 15 Jul 2021 00:00:00 +0000https://www.mattlayman.com/understand-django/settings/In the last Understand Django article, we looked at a storage concept in Django called sessions. Sessions provide a solution to problems like “How does Django know when a user is logged in?” or “Where can the framework store data for a visitor on your app?”
With this article, you’ll learn about Django settings and how to manage the configuration of your application. We’ll also look at tools to help you define your settings effectively.Episode 13 - Does My Site Work?https://www.mattlayman.com/django-riffs/13-automated-tests/Tue, 01 Jun 2021 00:00:00 +0000https://www.mattlayman.com/django-riffs/13-automated-tests/On this episode, we will discuss how you can verify that your site works and continues to work. We’re digging into automated testing and how to write tests for your Django apps.
Listen at Spotify.
Last Episode On the last episode, our focus was on static files. Static files are vital to your application, but they have little to do with Python code. We saw what they are and what they do.Per-visitor Data With Sessionshttps://www.mattlayman.com/understand-django/sessions/Fri, 21 May 2021 00:00:00 +0000https://www.mattlayman.com/understand-django/sessions/In the last Understand Django article, we saw what it takes to make your Django project live on the internet. Now, we’ll get back to a more narrow topic and focus on a way Django can store data for visitors to your site. This is the kind of data that doesn’t often fit well into your Django models and is called session data.
From Browser To DjangoURLs Lead The WayViews On ViewsTemplates For User InterfacesUser Interaction With FormsStore Data With ModelsAdminister All The ThingsAnatomy Of An ApplicationUser AuthenticationMiddleware Do You Go?Deploy A Site Livehttps://www.mattlayman.com/understand-django/deploy-site-live/Tue, 23 Mar 2021 00:00:00 +0000https://www.mattlayman.com/understand-django/deploy-site-live/In the previous Understand Django article, we looked at automated testing and how writing tests to check your Django project can be very valuable, saving you time and making sure your site works for your users. Next, we’re going to look into how to share your site on the internet by understanding what it means to deploy a Django project. Deployment is the act of making your application live to your audience, and this article explains the actions you should consider to deploy effectively.Test Your Appshttps://www.mattlayman.com/understand-django/test-your-apps/Mon, 22 Feb 2021 00:00:00 +0000https://www.mattlayman.com/understand-django/test-your-apps/In the previous Understand Django article, we saw how static files like CSS, JavaScript, and images can be incorporated into your site. Now we’re going to focus on how to verify that your website works and continues to work by writing automated tests that check your pages and your code logic.
From Browser To DjangoURLs Lead The WayViews On ViewsTemplates For User InterfacesUser Interaction With FormsStore Data With ModelsAdminister All The ThingsAnatomy Of An ApplicationUser AuthenticationMiddleware Do You Go?Episode 12 - Success With Static Fileshttps://www.mattlayman.com/django-riffs/success-static-files/Mon, 15 Feb 2021 00:00:00 +0000https://www.mattlayman.com/django-riffs/success-static-files/On this episode, our focus will be on static files. Static files are vital to your application, but they have little to do with Python code. We’ll see what they are and what they do.
Listen at Spotify.
Last Episode On the last episode, we looked at Django middleware. We discussed why middleware is useful and how you can work with it.
What Are Static Files? Static files are files that don’t change when your application is running.How To Use Htmx In Djangohttps://www.mattlayman.com/blog/2021/how-to-htmx-django/Sat, 06 Feb 2021 00:00:00 +0000https://www.mattlayman.com/blog/2021/how-to-htmx-django/This article shows you how to use htmx in Django. What is htmx? According to the htmx website:
htmx allows you to access AJAX, CSS Transitions, WebSockets and Server Sent Events directly in HTML, using attributes, so you can build modern user interfaces with the simplicity and power of hypertext.
The example that we’ll craft is an ability to delete a task from a list of tasks without reloading the whole page.UX Polish - Building SaaS #90https://www.mattlayman.com/building-saas/ux-polish/Thu, 04 Feb 2021 00:00:00 +0000https://www.mattlayman.com/building-saas/ux-polish/In this episode, I worked on more customer requests to refine the user interface. We added a new convenient shortcut button and included additional information and links on the course detail view.
I’m continuing on my path to include the changes that my customer wants as she running a school year for the first time.
The first change was to add a new button on the student’s view of a course.Are Django and Flask Similar?https://www.mattlayman.com/blog/2021/are-django-flask-similar/Sat, 30 Jan 2021 00:00:00 +0000https://www.mattlayman.com/blog/2021/are-django-flask-similar/Maybe you’re new to web development in Python, and you’ve encountered the two most popular Python web frameworks, Django and Flask, and have questions about which one you should use. Are Django and Flask similar tools for building web applications?
Yes, Django and Flask share many similarities and can both make great websites, but they have some different development philosophies which will attract different types of developers.
What do I know about this?Customer Feature - Building SaaS #89https://www.mattlayman.com/building-saas/customer-feature/Thu, 28 Jan 2021 00:00:00 +0000https://www.mattlayman.com/building-saas/customer-feature/In this episode, I show you how to take a feature idea from nothing to something. We added new UI, wrote a new view, a new form, and all the associated test code to prove that the feature works.
My customer wants the ability to complete a task on any day she desires. The feature flow looks like:
Click a calendar icon next to a task on a student’s course page.Which Django Version Should I Use?https://www.mattlayman.com/blog/2021/which-django-version/Sat, 23 Jan 2021 00:00:00 +0000https://www.mattlayman.com/blog/2021/which-django-version/Django is a big and popular web framework for Python to help you build a web app. Which Django version should you use?
If you’re starting a Django web app, use the latest version of Django available.
Why listen to me? I’m a software developer with over 7 years of professional Django experience. I work at companies that use Django successfully at the core of their business.
I’ll explain why you should use the latest.Customer Requests - Building SaaS #88https://www.mattlayman.com/building-saas/customer-requests/Thu, 21 Jan 2021 00:00:00 +0000https://www.mattlayman.com/building-saas/customer-requests/In this episode, I worked on some customer requests now that I’ve finished launching the product. These requests improved the usability of the application in a few spots that were lacking.
The first request from the customer was to make it clear on the daily view when tasks are graded or not. Before I could change the template, I need to add a new method to the CourseTask to check if the task is graded.Squashing Bugs - Building SaaS #87https://www.mattlayman.com/building-saas/squashing-bugs/Thu, 14 Jan 2021 00:00:00 +0000https://www.mattlayman.com/building-saas/squashing-bugs/In this episode, I fixed some critical issues that my customer discovered. My customer is putting the app through its real paces for a school year and since this is the first run, there were bound to be some bugs.
We began with an explanation of the issues that my customer encountered. The problems related to scheduling.
First, the daily page skipped a task and showed the task that was meant for two days in the future.Episode 11 - Here, There, Middlewarehttps://www.mattlayman.com/django-riffs/here-there-middleware/Mon, 11 Jan 2021 00:00:00 +0000https://www.mattlayman.com/django-riffs/here-there-middleware/On this episode, we will investigate Django middleware and see where it goes in your project. In the process, you’ll see why middleware is useful and how you can work with it.
Listen at Spotify.
Last Episode On the last episode, we’re going to look at working with users in a Django project. We’ll see Django’s tools for identifying users and checking what those users are permitted to do on your website.Testing Email Designs - Building SaaS #86https://www.mattlayman.com/building-saas/testing-email-designs/Thu, 07 Jan 2021 00:00:00 +0000https://www.mattlayman.com/building-saas/testing-email-designs/In this episode, I worked on the sign up confirmation email design. We customized the template and used MailHog to test the flow and see how the email appeared. After working on the email design, we switched to the landing page of the site to work on the pricing information.
I started the stream by explaining that I’m working through some final tasks before launching the app more publicly. I covered why I am planning to send a sign up email and why I want to customize it.Serving Static Fileshttps://www.mattlayman.com/understand-django/serving-static-files/Wed, 06 Jan 2021 00:00:00 +0000https://www.mattlayman.com/understand-django/serving-static-files/In the previous Understand Django article, I described how Django gives us tools to run code for any request using the middleware system. Our next focus will be on static files. Static files are vital to your application, but they have little to do with Python code. We’ll see what they are and what they do.
From Browser To DjangoURLs Lead The WayViews On ViewsTemplates For User InterfacesUser Interaction With FormsStore Data With ModelsAdminister All The ThingsAnatomy Of An ApplicationUser AuthenticationMiddleware Do You Go?Customer Docs - Building SaaS #85https://www.mattlayman.com/building-saas/customer-docs/Thu, 31 Dec 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/customer-docs/In this episode, I integrated customer documentation into the app. I showed how to build Sphinx documentation into a Django project, then created a help view to link to the docs. Finally, I added documentation building to the deployment process.
I previously created a Sphinx documentation project to hold docs for my app, but I had not hooked the docs into my project yet. Before hooking it in, I explained how Sphinx works and how I customized the documentation to fit with my project.Refactoring Enrollment - Building SaaS #84https://www.mattlayman.com/building-saas/refactoring-enrollment/Wed, 23 Dec 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/refactoring-enrollment/In this episode, I decided to redesign a portion of the application flow. I wasn’t pleased with how users would enroll students for their grades so I refactored the school year page into a flow that worked better.
Note: My internet connection was not good during this stream. Thankfully, the audio is fine and reading code is very possible because the background doesn’t need to change much. My apologies for the low quality.Empty States - Building SaaS #83https://www.mattlayman.com/building-saas/empty-states/Thu, 17 Dec 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/empty-states/In this episode, I returned to the onboarding flow and start to polish some of the extra pages. We filled the pages with special copy and a call to action to each page to help customers be successful.
I started with the pages that displays the school years. We added a chunk of template from the onboarding process that asks the user to create a school year. I modified the template chunk to make it fit in the context of the page.Middleware Do You Go?https://www.mattlayman.com/understand-django/middleware-do-you-go/Wed, 16 Dec 2020 00:00:00 +0000https://www.mattlayman.com/understand-django/middleware-do-you-go/In the previous Understand Django article, we covered the built-in auth system. That article gave you a chance to see the User model, ways to login users with Django’s authentication tools, and the features that make the authorization controls work. In that topic, middleware came up as an integral component. Now we’re going to learn more about middleware and its function within a Django project. From Browser To DjangoURLs Lead The WayViews On ViewsTemplates For User InterfacesUser Interaction With FormsStore Data With ModelsAdminister All The ThingsAnatomy Of An ApplicationUser AuthenticationMiddleware Do You Go?Customer Feedback - Building SaaS #82https://www.mattlayman.com/building-saas/customer-feedback/Thu, 10 Dec 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/customer-feedback/In this episode, I worked on feedback from my primary customer. We fixed a couple of issues that she reported, then moved on to more of the onboarding flow.
Before getting to the code, we chatted about ways to learn to code. I linked to a popular book, Automate the Boring Stuff with Python, and some good web tutorials for learning Django.
The first bit of customer feedback that I worked on was to add a back link from a course details to get a user back to the grade level that holds the course.How To Set Up Tailwind CSS In Django On Herokuhttps://www.mattlayman.com/blog/2020/tailwind-django-heroku/Sun, 06 Dec 2020 00:00:00 +0000https://www.mattlayman.com/blog/2020/tailwind-django-heroku/How can you set up Tailwind CSS for your Django app on Heroku? In this article, we’ll see how I did exactly that recently.
I have a side project that uses Tailwind CSS. To get started quickly, I used the version from a Content Delivery Network (CDN) as Tailwind describes in the documentation. This worked fine initially while I got my project started, but the CDN version is huge (around 3MB).Finishing Onboarding - Building SaaS #81https://www.mattlayman.com/building-saas/finishing-onboarding/Thu, 03 Dec 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/finishing-onboarding/In this episode, I completed the last form that completes the last step on my Django app’s onboarding process. We built up the view, wrote the tests, and worked through the templates changes.
I started with a discussion of what the onboarding flow does and what was left. I needed to make a form that creates a task for a course.
For the first chunk of code, we added some tests to cover all the scenarios that are important for the view.Episode 10 - User Authhttps://www.mattlayman.com/django-riffs/user-auth/Tue, 24 Nov 2020 00:00:00 +0000https://www.mattlayman.com/django-riffs/user-auth/On this episode, we’re going to look at working with users in a Django project. We’ll see Django’s tools for identifying users and checking what those users are permitted to do on your website.
Listen at Spotify.
Last Episode On the last episode, I explained the structure of Django application. We also talked why this structure is significant and how Django apps benefit the Django ecosystem as a tool for sharing code.Reordering Models - Building SaaS #80https://www.mattlayman.com/building-saas/reordering-models/Thu, 19 Nov 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/reordering-models/In this episode, we looked at an UpdateView for the GradeLevel model in the homeschool application. Along the way, I had to display some UI elements on the grade to give users the ability to adjust the ordering of courses within their grade level.
We started by adding the icon link that I wanted to use to give users access to the edit page. Once the link was in place, I created the URL and copied an existing view as a starting point for the UpdateView.Make A Hugo Static Blog Inside A Django Apphttps://www.mattlayman.com/blog/2020/hugo-blog-in-django-app/Mon, 16 Nov 2020 00:00:00 +0000https://www.mattlayman.com/blog/2020/hugo-blog-in-django-app/I have a side project and I’d like to do some content marketing to potential customers to show how my product is useful. To do this, I need a blog for my project.
Maybe you need a blog for your project too. Have you thought about where your blog will exist on the internet? For me, I considered two choices:
Use a subdomain like blog.mysite.com. Use a route style like mysite.WhiteNoise Shenanigans - Building SaaS #79https://www.mattlayman.com/building-saas/whitenoise-shenanigans/Thu, 12 Nov 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/whitenoise-shenanigans/In this episode, I worked on a method of adding static content to a site that didn’t involve the staticfiles directory, a separate domain, or a reverse proxy like Nginx. We had to get clever with Heroku buildpacks and how to configure WhiteNoise.
I want to put a blog on my side project for content marketing purposes.
I want the blog to be statically generated and have content come from Markdown (just like these show notes that you’re currently reading).Create A Form Template - Building SaaS #78https://www.mattlayman.com/building-saas/create-form-template/Thu, 05 Nov 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/create-form-template/In this episode, I created a template for one of my new forms on the new social media app that I’m building. We talked about context data, template styling, and special considerations for forms in templates.
I had an empty template for the invite sending form to begin.
I filled in a first attempt at the template with a header and displaying form errors. While building that, I added some context information that was needed for the display.User Authenticationhttps://www.mattlayman.com/understand-django/user-authentication/Wed, 04 Nov 2020 00:00:00 +0000https://www.mattlayman.com/understand-django/user-authentication/In the previous Understand Django article, we learned about the structure of a Django application and how apps are the core components of a Django project. In this article, we’re going to dig into Django’s built-in user authentication system. We’ll see how Django makes your life easier by giving you tools to help your web application interact with the users of your site.
From Browser To DjangoURLs Lead The WayViews On ViewsTemplates For User InterfacesUser Interaction With FormsStore Data With ModelsAdminister All The ThingsAnatomy Of An ApplicationUser AuthenticationMiddleware Do You Go?Sending Invites - Building SaaS #77https://www.mattlayman.com/building-saas/sending-invites/Thu, 29 Oct 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/sending-invites/In this episode, I worked on the form that will send invites to users for the new social network app that I’m building. We built the view, the form, and the tests and wired a button to the new view.
The first thing that we do was talk through the new changes since the last stream. After discussing the progress, I took some time to cover the expected budget for the application to get it to an MVP.Episode 9 - Application Examinationhttps://www.mattlayman.com/django-riffs/application-examination/Tue, 20 Oct 2020 00:00:00 +0000https://www.mattlayman.com/django-riffs/application-examination/On this episode, we will study the structure of a Django application. Applications are the core components that make up a Django project.
Listen at Spotify.
Last Episode On the last episode, we focused on the built-in Django administrator’s site. We’ll saw what it is, how you can configure it, and how you can customize it to serve your needs.
What Is An Application? In Django parlance, a “web application” is a Django project.Capped Social Network - Building SaaS #76https://www.mattlayman.com/building-saas/capped-social-network/Thu, 15 Oct 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/capped-social-network/In this episode, I started a new project to build a different kind of social network. This social network will contain a max number of connections to encourage thoughtful choice when growing your personal network. We talked MVP features and put in the basics of a Django app.
I had a wild thought to build a social network with a capped number of connection in the hope that users would choose their connections based on people that they really care about.Make A Landing Page - Building SaaS #75https://www.mattlayman.com/building-saas/make-a-landing-page/Thu, 08 Oct 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/make-a-landing-page/In this episode, I added a landing page design to the app that I’m building. By using a Tailwind CSS landing page template, I could fit the design in with my existing CSS tools.
I showed some available templates that I discovered while researching for Tailwind-based landing pages. Once I found a decent template, I copied the source of sample landing page into my index page template.
Since I copy and pasted from the landing page, the initial look was terrible.Hijack To Help Customershttps://www.mattlayman.com/blog/2020/hijack-to-help-customers/Tue, 06 Oct 2020 00:00:00 +0000https://www.mattlayman.com/blog/2020/hijack-to-help-customers/You have an upset customer with a really thorny problem on your Django-powered website. Your customer used your help ticket system and reported their woe. You’ve done your due diligence and have already checked:
The logs from your site show nothing interesting related to the customer’s actions The error tracking system reveals no exceptions from what the customer did The customer’s description doesn’t contain enough info to diagnose the problem fully The experiments in your dev environment have not worked to replicate the problem What can you do?Check Web App Security With Bandit - Building SaaS #74https://www.mattlayman.com/building-saas/check-web-app-security-with-bandit/Thu, 01 Oct 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/check-web-app-security-with-bandit/In this episode, I integrated the bandit static analysis tool to do automated security checking of my code before each commit. We talked about pre-commit and how to add in a new hook. After finishing that tool addition, we got deep into Django while removing some messages inserted by django-allauth on sign up.
We began by talking about what the bandit tool does and how it works. Once I explained bandit, I focused on the bandit documentation to see how to add the tool.Anatomy Of An Applicationhttps://www.mattlayman.com/understand-django/anatomy-of-an-application/Tue, 29 Sep 2020 00:00:00 +0000https://www.mattlayman.com/understand-django/anatomy-of-an-application/In the previous Understand Django article, we got deep into the Django administrators site. We saw what the site was and how to configure and customize it. In this article, we will examine what goes into an application. Applications are core elements of a Django project.
From Browser To DjangoURLs Lead The WayViews On ViewsTemplates For User InterfacesUser Interaction With FormsStore Data With ModelsAdminister All The ThingsAnatomy Of An ApplicationUser AuthenticationMiddleware Do You Go?Dynamically Regrouping QuerySets In Templates - Building SaaS #73https://www.mattlayman.com/building-saas/dynamically-regrouping-querysets/Thu, 24 Sep 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/dynamically-regrouping-querysets/In this episode, we worked on a new view to display course resources. While building out the template, I used some template tags to dynamically regroup a queryset into a more useful data format for rendering.
I started a new view before the stream to display content, but I had not filled it in before the stream started.
We added new data to the context, and did some adjustments to the URL based on the required inputs for the view.From Concept To Live In Two Weeks With Djangohttps://www.mattlayman.com/blog/2020/concept-to-live-with-django/Tue, 15 Sep 2020 00:00:00 +0000https://www.mattlayman.com/blog/2020/concept-to-live-with-django/My team had two weeks to make a viable product. We were a random group of people pulled together with a desire to help our local community in Frederick, Maryland. We were a student, a web designer, a former realtor turned IT support person, and a software developer.
Our mission, which was put forth by the virtual hackathon that brought us together, was to try to make a tool to help the local homeless.Displaying Breaks - Building SaaS #72https://www.mattlayman.com/building-saas/displaying-breaks/Thu, 10 Sep 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/displaying-breaks/In this episode, I worked to add breaks to the display of the week schedule. We had to update context to include the break information into the schedules. I refactored a method out of the calendar display code to make some reusable logic for handling breaks.
The app needs to display breaks on the schedule and adjust what is displayed based on when the breaks are. I started with changing the background color of the break days.Episode 8 - Administering Your Apphttps://www.mattlayman.com/django-riffs/administering-your-app/Thu, 10 Sep 2020 00:00:00 +0000https://www.mattlayman.com/django-riffs/administering-your-app/On this episode, we will focus on the built-in Django administrator’s site. We’ll see what it is, how you can configure it, and how you can customize it to serve your needs.
Listen at Spotify.
Last Episode On the last episode, we explored more about models and how to interact with data in your database.
What Is The Django Admin? Django includes a web administrative interface that can help programmers and non-programmers alike.Custom Form Validation - Building SaaS #71https://www.mattlayman.com/building-saas/custom-form-validation/Thu, 03 Sep 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/custom-form-validation/In this episode, I added some custom checking to ensure that students may only be enrolled in a single grade level for a school year. We talked about form cleaning and wrote a for unit test to prove that the change worked. After that change, we switched to a template and wrote copy for when no progress reports are viewable for users.
With the first issue, I needed to update a form that enrolls students.Predicting The Future - Building SaaS #70https://www.mattlayman.com/building-saas/predicting-the-future/Thu, 27 Aug 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/predicting-the-future/In this episode, we worked on two issues. The first issue was fixing incorrect projected completion dates of tasks. We used test driven development to reveal the bug and work on the fix. The second issue add some extra data to display on a page.
We picked a couple of tasks at random to fix for this stream session.
The first issue related to the course view when paired with what the student’s actions.Administer All The Thingshttps://www.mattlayman.com/understand-django/administer-all-the-things/Wed, 26 Aug 2020 00:00:00 +0000https://www.mattlayman.com/understand-django/administer-all-the-things/In the previous Understand Django article, we used models to see how Django stores data in a relational database. We covered all the tools to bring your data to life in your application. In this article, we will focus on the built-in tools that Django provides to help us manage that data.
From Browser To DjangoURLs Lead The WayViews On ViewsTemplates For User InterfacesUser Interaction With FormsStore Data With ModelsAdminister All The ThingsAnatomy Of An ApplicationUser AuthenticationMiddleware Do You Go?Polishing and Usability - Building SaaS #69https://www.mattlayman.com/building-saas/polishing-usability/Thu, 20 Aug 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/polishing-usability/In this episode, we polished some parts of the application. Now that my first customer is using the app regularly, the feedback is coming in rapidly. We worked to fix some of the issues that she found.
The first issue that I tackled dealt with ambiguity about a course’s relationship to a school year on the course’s detail page. I fixed this issue by displaying the grade level on the course page to provide all the details.Rendering Calendars - Building SaaS #68https://www.mattlayman.com/building-saas/rendering-calendars/Thu, 13 Aug 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/rendering-calendars/In this episode, I worked on rendering a calendar of important events in a school year. We built out the appropriate data structures, and I wrote some new model methods and added tests.
On the last stream, I created a new model to track breaks in the school year. The app now shows the calendar for the school year, and I want to display the breaks on the calendar.
Before digging too far into the code, I provided my thoughts about using Docker for development from a question that came from the chat.Give Me A Break... Day - Building SaaS #67https://www.mattlayman.com/building-saas/give-me-a-break-day/Thu, 06 Aug 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/give-me-a-break-day/In this episode, we did some Django model development. I created a new model to track break days in a school year. This model will be critical to fill in vacations and holidays so that the scheduling functionality works properly. I added the model, the tests, the admin page, and the create view to create break days in the app.
We started by picking a model name and discussing naming in programming.Docs, Bugs, and Reports - Building SaaS #66https://www.mattlayman.com/building-saas/docs-bugs-reports/Thu, 30 Jul 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/docs-bugs-reports/In this episode, I created documentation for anyone interested in trying out the application. After documenting the setup, I moved on to fixing a bug with the scheduling display of courses. In the latter half of the stream, we focused on creating a new reports section to show progress reports for students.
One of my patrons requested some documentation to explain how to get started with the project. We updated the README.Handle Default Values - Building SaaS #65https://www.mattlayman.com/building-saas/handle-default-values/Thu, 23 Jul 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/handle-default-values/In this episode, I updated a model to handle the default duration of new tasks. This default needed to come from the Course model instead of the CourseTask model so we had to determine how best to set that data in various forms. I also fixed some drop down selection bugs that populated a form with the wrong data. We made sure that all the code was well tested.
I created a new default_task_duration field to the Course model.Episode 7 - Models and Managers and Querysets, Oh My!https://www.mattlayman.com/django-riffs/models-managers-querysets/Tue, 21 Jul 2020 00:00:00 +0000https://www.mattlayman.com/django-riffs/models-managers-querysets/On this episode, we will explore more about models and how to interact with data in your database.
Listen at Spotify.
Last Episode On the last episode, we discussed the basics of setting up a database and creating a model to store data.
Working With Models To create new rows in our new database tables, we can use a model’s save method. When you save a model instance, Django will send a message to the database that effectively says “add this new data to this database table.Enrolling Students - Building SaaS #64https://www.mattlayman.com/building-saas/enrolling-students/Thu, 09 Jul 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/enrolling-students/In this episode, we worked on a view to enroll students into a grade level for the school year. I added all the context data and used Tailwind to design the form layout to pick from a list of available grade levels. We added a variety of unit tests to prove the correctness.
The enrollment page needed three pieces of data in the context to complete the form. We added the student, school_year, and grade_levels data to the context and wrote tests to show the data in there.Django Testing Toolboxhttps://www.mattlayman.com/blog/2020/django-testing-toolbox/Tue, 07 Jul 2020 00:00:00 +0000https://www.mattlayman.com/blog/2020/django-testing-toolbox/What are the tools that I use to test a Django app? Let’s find out!
You might say I’m test obsessed. I like having very high automated test coverage. This is especially true when I’m working on solo applications. I want the best test safety net that I can have to protect me from myself.
We’re going to explore the testing packages that I commonly use on Django projects. We’ll also look at a few of the important techniques that I apply to make my testing experience great.The Home Stretch - Building SaaS #63https://www.mattlayman.com/building-saas/home-stretch/Thu, 02 Jul 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/home-stretch/In this episode, we return to the homeschool application that I’m building. I’m in the final stretch of changes that need to happen to make the product minimally viable. We worked on a template, wrote some model methods, and did a bunch of automated testing.
We started by adding students to the context of the students index page. With the students in the context, we updated the index page to display the list of students.Episode 6 - Where Does the Data Go?https://www.mattlayman.com/django-riffs/where-does-data-go/Tue, 30 Jun 2020 00:00:00 +0000https://www.mattlayman.com/django-riffs/where-does-data-go/On this episode, we will learn about storing data and how Django manages data using models.
Listen at Spotify.
Last Episode On the last episode, we saw Django forms and how to interact with users to collect data.
Setting Up A relational database is like a collection of spreadsheets. Each spreadsheet is actually called a table. A table has a set of columns to track different pieces of data. Each row in the table would represent a related group.Hackathon App Part 2 - Building SaaS #62https://www.mattlayman.com/building-saas/hackathon-app-part-2/Fri, 26 Jun 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/hackathon-app-part-2/In this episode, we took a break from the regular app to work on an app for a local hackathon that I’m participating in. This is the second week for the hackathon and in this stream, I apply the final touches to the application. We work on models, a template, and build an RSS feed using Django syndication contrib app.
The final presentation for the app was the next day so it was crunch time to finish everything off.Store Data With Modelshttps://www.mattlayman.com/understand-django/store-data-with-models/Thu, 25 Jun 2020 00:00:00 +0000https://www.mattlayman.com/understand-django/store-data-with-models/In the previous Understand Django article, we encountered forms and how forms allow your application to receive data from users who use your site. In this article, you’ll see how to take that data and store it into a database so that your application can use that data or display it later.
From Browser To DjangoURLs Lead The WayViews On ViewsTemplates For User InterfacesUser Interaction With FormsStore Data With ModelsAdminister All The ThingsAnatomy Of An ApplicationUser AuthenticationMiddleware Do You Go?Hackathon App - Building SaaS #61https://www.mattlayman.com/building-saas/hackathon-app/Thu, 18 Jun 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/hackathon-app/In this episode, we took a break from the regular app to work on an app for a local hackathon that I’m participating in. My team is building a mobile web app for the homeless around Frederick, MD. In this stream, we cranked through some modeling, admin building, a couple of pages, tests, and templates! We got a lot done!
The virtual hackathon running in Frederick is split into multiple teams serving three different community groups around Frederick county.A View From Start To Finish - Building SaaS #60https://www.mattlayman.com/building-saas/view-from-start-to-finish/Thu, 11 Jun 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/view-from-start-to-finish/In this episode, I created a view to add students from beginning to the end. I used Error Driven Development to guide what I needed to do next to make the view, then wrote tests, and finished it all off by writing the template code.
At the start of the episode, I gave a quick overview of the models in my application and which models I planned to focus on for the stream.Designing A View - Building SaaS #59https://www.mattlayman.com/building-saas/designing-a-view/Thu, 04 Jun 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/designing-a-view/In this episode, I focused on a single view for adding a course to a school year. This view is reusing a form class from a different part of the app and sharing a template. We worked through the details of making a clear CreateView.
The stream started with me answering a question about how I design a new feature. I outlined all the things that I think through for the different kinds of features that I need to build.Bread and Butter Django - Building SaaS #58https://www.mattlayman.com/building-saas/bread-and-butter-django/Thu, 28 May 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/bread-and-butter-django/In this episode, I worked on a views and templates. There are a number of core pages that are required to flesh out the minimal interface for the app. We’re building them.
I began by showing the page that we were going to work on. I outlined the changes I planned to make, then we started.
The first thing we added was data about the school year, the main model on display in the page.Switch A Django Project To Use Pytest - Building SaaS #57https://www.mattlayman.com/building-saas/switch-django-app-to-use-pytest/Thu, 21 May 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/switch-django-app-to-use-pytest/In this episode, I replaced the default Django test runner to use pytest. We walked through installation, configuration, how to change tests, and the benefits that come from using pytest.
We started by looking at the current state of the test suite to provide a baseline to compare against. After that, I went to PyPI to find the version of pytest-django that we wanted to install. I added the package to my requirements-dev.How To Fix A Bug - Building SaaS #56https://www.mattlayman.com/building-saas/how-to-fix-a-bug/Thu, 14 May 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/how-to-fix-a-bug/In this episode, we picked an issue from GitHub and worked on it. I explained the flow of using test driven development to show how the bug existed in an automated test. We wrote the test, then fixed the code. After that, we did some test refactoring to clean things up.
We looked at what the issue was and how it is related to the handling of the Course model in a weekly view in the app.Episode 5 - How To Use Formshttps://www.mattlayman.com/django-riffs/how-to-use-forms/Mon, 11 May 2020 00:00:00 +0000https://www.mattlayman.com/django-riffs/how-to-use-forms/On this episode, we will learn about HTML forms and Django’s form system to use when collecting input from users.
Listen at Spotify.
Last Episode On the previous episode, we looked at templates, the primary tool that Django provides to build user interfaces in your Django app.
Web Forms 101 HTML can describe the type of data that you may want your users to send to your site. Collecting this data is done with a handful of tags.Remodeling Data Relationships - Building SaaS #55https://www.mattlayman.com/building-saas/remodeling-data-relationships/Thu, 07 May 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/remodeling-data-relationships/In this episode, we’re remodeling! I changed the model relationship between GradeLevel and Course from a ForeignKey (1 to many) to a ManyToManyField. We talked through the change and started fixing all the tests that broke.
After explaining the change that I wanted to make and why I want to make it, I explained how a foreign key and many to many relationship at the database level.
Once we had the conceptual foundation in place, I started with the documentation.User Interaction With Formshttps://www.mattlayman.com/understand-django/user-interaction-forms/Tue, 05 May 2020 00:00:00 +0000https://www.mattlayman.com/understand-django/user-interaction-forms/In the previous Understand Django article, we saw how Django templates work to produce a user interface. That’s fine if you only need to display a user interface, but what do you do if you need your site to interact with users? You use Django’s form system! In this article, we’ll focus on how to work with web forms using the Django form system.
From Browser To DjangoURLs Lead The WayViews On ViewsTemplates For User InterfacesUser Interaction With FormsStore Data With ModelsAdminister All The ThingsAnatomy Of An ApplicationUser AuthenticationMiddleware Do You Go?Vim 101: Basics of the Vim Text Editorhttps://www.mattlayman.com/blog/2020/vim-101/Mon, 04 May 2020 00:00:00 +0000https://www.mattlayman.com/blog/2020/vim-101/At the Frederick Open Source meetup this month, I talked about the Vim text editor. I covered a lot of the fundamentals, including a mental framework to help demystify why Vim is challenging to so many people. I also covered some tips that people can use to work toward Vim mastery.
The recording from the talk is available on YouTube. Check it out!User Testing Feedback - Building SaaS #54https://www.mattlayman.com/building-saas/user-testing-feedback/Thu, 30 Apr 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/user-testing-feedback/In this episode, we worked on issues found from a round of user testing. I talked about how I did user testing with my customer, then started to tackle the usability issues that she identified.
We’re taking a break from building the onboarding flow so that we can take some time to address feedback from user testing with my customer.
I started the stream by explaining how I set up user testing and what I got out of the experience.More Onboarding Goodness - Building SaaS #53https://www.mattlayman.com/building-saas/more-onboarding-goodness/Thu, 23 Apr 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/more-onboarding-goodness/In this episode, we continued with onboarding. I added unit tests for the new form and explained how foreign keys are wired through in CreateView. Then we marched on to the next template in the flow.
In the last stream, we set all the context data for the view that shows the form to create a grade level for the school. With the context in place, and the form structure set, I added the form class that will create the GradeLevel record.Consistent Onboarding - Building SaaS #52https://www.mattlayman.com/building-saas/consistent-onboarding/Thu, 16 Apr 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/consistent-onboarding/In this episode, we glued together some of the onboarding steps. I added data validation so that future steps depend on data existing from previous steps. Then we added page messaging to direct users to a proper page.
We reviewed the way that the form validates certain data from the form submission so that data is kept safe between users. I showed how I switched from the model and fields attributes of CreateView to a form_class containing the form that does the necessary validation.Onboarding Forms - Building SaaS #51https://www.mattlayman.com/building-saas/onboarding-forms/Thu, 09 Apr 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/onboarding-forms/In this episode, we added the first form to collect data in the onboarding flow. We used a CreateView and defined all the fields that are needed in the HTML form.
I started by filling in the HTML form structure of the page. Once the dummy version was in place, we changed from a TemplateView to a CreateView and began fixing each configuration error that the new view type reported as missing like missing a model field declaration.Episode 4 - Building User Interfaceshttps://www.mattlayman.com/django-riffs/build-user-interfaces/Wed, 08 Apr 2020 00:00:00 +0000https://www.mattlayman.com/django-riffs/build-user-interfaces/On this episode, we look at templates, the primary tool that Django provides to build user interfaces in your Django app.
Listen at Spotify.
Last Episode On the previous episode, we talked about views and how views handle requests to create HTTP responses for users.
Set Up Templates are static files that Django will fill in with data. In order to use those files, we must instruct Django on where to find them.Onboarding Continuity - Building SaaS #50https://www.mattlayman.com/building-saas/onboarding-continuity/Thu, 02 Apr 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/onboarding-continuity/In this episode, we stepped from the welcome onboarding page to the first interactive page in the flow. I extracted the common banner for each of the templates and customized it for each of the steps in the process.
The first thing we did was create a button on the starting page. The button connects the welcome page to the second step in the flow where the app will ask for information about the user’s school year.Templates For User Interfaceshttps://www.mattlayman.com/understand-django/templates-user-interfaces/Thu, 02 Apr 2020 00:00:00 +0000https://www.mattlayman.com/understand-django/templates-user-interfaces/In the previous Understand Django article, we looked at the fundamentals of using views in Django. This article will focus on templates. Templates are your primary tool in a Django project for generating a user interface. With templates, you’ll be able to build the pages that users will see when they visit your web app. Let’s see how templates hook into views and what features Django provides with its template system.Starting the Onboarding Flow - Building SaaS #49https://www.mattlayman.com/building-saas/starting-onboarding-flow/Thu, 26 Mar 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/starting-onboarding-flow/In this episode, we worked on the progress element that will display in every step of the onboarding flow. I added some labels and styled the banner using Tailwind CSS. At the end of the stream, we boxed in the shape of the welcome page with some placeholder elements.
The very first thing I did was insert a top bar that was unstyled to the top of the welcome page. We added some placeholder text for each of the steps in the onboarding flow.Onboarding - Building SaaS #48https://www.mattlayman.com/building-saas/onboarding/Thu, 19 Mar 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/onboarding/In this episode, we did some design work to plan out the onboarding flow for new users. I spoke through my design process, outlined what a new user will need to do to succeed, wrote down the plan in GitHub issues, then started to implement that flow.
I started the stream with a quick fix to the main app view.
After that, we started a new project in the app. I needed to design the starting experience for a user.Episode 3 - Views On Djangohttps://www.mattlayman.com/django-riffs/views-on-django/Fri, 06 Mar 2020 00:00:00 +0000https://www.mattlayman.com/django-riffs/views-on-django/On this episode, we look at views, a major component within Django and a primary place where your code will run.
Listen at Spotify.
Last Episode On the previous episode, we talked about URLs and how they describe the main interface that a browser can use to interact with your application.
What Is A View? A view is a chunk of code that receives an HTTP request and returns an HTTP response.How To Style Sign Up - Building SaaS #47https://www.mattlayman.com/building-saas/how-to-style-sign-up/Wed, 04 Mar 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/how-to-style-sign-up/In this episode, I added styling to the Sign Up page of the site. We chatted about CSS tools and frameworks, the benefit of feature flags to control what UI is displayed to users, and how to use Tailwind CSS to modify a design quickly.
In the first portion of the stream, we focused on CSS frameworks. We compared Bootstrap, Semantic UI, and Tailwind CSS.
After that discussion, I talked about feature flags.Views On Viewshttps://www.mattlayman.com/understand-django/views-on-views/Tue, 03 Mar 2020 00:00:00 +0000https://www.mattlayman.com/understand-django/views-on-views/In the previous Understand Django article, I covered URLs and the variety of tools that Django gives us to describe the outside interface to the internet for your project. In this article, we’ll examine the core building block that makes those URLs work: the Django view.
From Browser To DjangoURLs Lead The WayViews On ViewsTemplates For User InterfacesUser Interaction With FormsStore Data With ModelsAdminister All The ThingsAnatomy Of An ApplicationUser AuthenticationMiddleware Do You Go?A Week At A Time - Building SaaS #46https://www.mattlayman.com/building-saas/week-at-a-time/Wed, 26 Feb 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/week-at-a-time/In this episode, we worked on a weekly view for the Django app. We made navigation that would let users click from one week to the next, then fixed up the view to pull time from that particular week.
The first thing that I did was focus on the UI required to navigate to a new weekly view in the app. We mocked out the UI and talked briefly about the flexbox layout that is available to modern browsers.Templates and Logic - Building SaaS #45https://www.mattlayman.com/building-saas/templates-logic/Thu, 20 Feb 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/templates-logic/In this episode, we added content to a template and talked about the N+1 query bug. I also worked tricky logic involving date handling.
The first change was to update a course page to include a new icon for any course task that should be graded. After adding this, we hit an N+1 query bug, which is a performance bug that happens when code queries a database in a loop. We talked about why this happens and how to fix it.Django Riffs, a podcast for learning Djangohttps://www.mattlayman.com/blog/2020/django-riffs-podcast/Thu, 06 Feb 2020 00:00:00 +0000https://www.mattlayman.com/blog/2020/django-riffs-podcast/I’ve started a podcast! The podcast is called Django Riffs, and my goal is to help beginners learn how to use Django. You can find the show on Spotify or check Apple Podcasts or wherever you get podcasts.
Each episode of the podcast will be a topical exploration of one facet of the Django web framework. With many years of Django under my belt, I believe I have the experience to help beginners on their journey into learning Django.Fast Forms With UpdateView - Building SaaS #44https://www.mattlayman.com/building-saas/fast-forms-updateview/Thu, 06 Feb 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/fast-forms-updateview/In this episode, we worked on an edit view. We used Django’s generic UpdateView to aid the process and test drove the creation of the view to verify things every step of the way.
We worked on a view to make it possible to edit the CourseTask model that are the actions that a student must complete for a course.
To complete the form quickly, I took advantage of Django’s ModelForm views.Episode 2 - Enter With URLshttps://www.mattlayman.com/django-riffs/enter-with-urls/Fri, 31 Jan 2020 00:00:00 +0000https://www.mattlayman.com/django-riffs/enter-with-urls/On this episode, we discuss Django’s front door, URLs. We talk about what URLs are, how to build them in Django, and the functions Django provides to work with URLs.
Listen at Spotify.
What’s a URL? A URL is a Uniform Resource Locator. It is the full address that goes into a browser.
Consider https://www.mattlayman.com/django-riffs/. Here are the parts:
Scheme, https:// Domain name: Top Level Domain (TLD), com Domain, mattlayman Subdomain, www Path or route, /django-riffs/ URLconf Every route for Django to handle goes into a URL configuration, URLconf for short and in the documentation.Episode 1 - Get To Know Djangohttps://www.mattlayman.com/django-riffs/get-to-know-django/Thu, 30 Jan 2020 00:00:00 +0000https://www.mattlayman.com/django-riffs/get-to-know-django/Welcome to the show notes for the first episode of Django Riffs!
Django Riffs is a podcast for learning web application development in Python using the Django web framework.
Listen at Spotify.
Who Is This For? This podcast is for absolute Django beginners. No prior knowledge of Django or web development is expected.
Experienced users may learn something new or get a good refresher from topics they might have missed in the documentation.Use Tailwind On A Template - Building SaaS #43https://www.mattlayman.com/building-saas/tailwind-template/Thu, 23 Jan 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/tailwind-template/In this episode, we worked on the template styles of a tabular view. We also made some context data adjustments to include header rows and column highlighting.
I started by showing the template that I already created. It was rough.
Before changing anything, I took the time to explain the modeling in use for this project and the context passed to the view. The models mostly form a tree in the a hierarchy.Add Styles To Templates - Building SaaS #42https://www.mattlayman.com/building-saas/add-styles/Wed, 22 Jan 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/add-styles/In this episode, I added a CSS framework, Tailwind CSS. After working through some issues with the log out feature, we started to style the base template of the site.
To stay true to my “make the minimum possible thing that will work,” I added Tailwind CSS from a CDN, content delivery network.
<link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet"> I described how Tailwind’s utility-first approach makes designing sites a breeze because of the composition of small CSS classes.URLs Lead The Wayhttps://www.mattlayman.com/understand-django/urls-lead-way/Wed, 22 Jan 2020 00:00:00 +0000https://www.mattlayman.com/understand-django/urls-lead-way/In the last article in the Understand Django series, we saw how a user’s browser request goes from their browser to Django’s “front door.” Now it’s time to look at how Django processes those requests. An HTTP request coming from a browser includes a URL describing which resource Django should produce. Since URLs can come in many forms, we must instruct Django on the kinds of URLs that our web application can handle.User Accounts With django-allauth - Building SaaS #41https://www.mattlayman.com/building-saas/user-accounts-django-allauth/Wed, 15 Jan 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/user-accounts-django-allauth/In this episode, we added django-allauth to create accounts that default to email instead of using usernames. We added the package, configured some templates, and created tests.
We continued to look at Will Vincent’s django-allauth post on creating user accounts with email and passwords.
django-allauth let’s us swap out username and email so that users won’t need to create a username, which is the behavior that I want for this service.Serverless Python And Why You Should Try It Outhttps://www.mattlayman.com/blog/2020/serverless-python/Thu, 09 Jan 2020 00:00:00 +0000https://www.mattlayman.com/blog/2020/serverless-python/At the January 2020 Python Frederick event, Patrick Pierson showed the group how you can use Python in different serverless services on AWS and GCP. He also showed a couple of serverless frameworks like Serverless and Chalice.
The recording from the talk is available on YouTube. Check it out!
Questions? Feel free to mention me on X at @mblayman so I can try to respond to your question.From Browser To Djangohttps://www.mattlayman.com/understand-django/browser-to-django/Wed, 08 Jan 2020 00:00:00 +0000https://www.mattlayman.com/understand-django/browser-to-django/Maybe you have heard about Django and that it can help you build websites. You might be new to Python, new to web development, or new to programming.
This new series, Understand Django, will show you what Django is all about. Throughout this series, I will reveal how Django is a powerful tool that can unlock the potential of anyone interested in making applications on the internet. Django is used by companies like Instagram, Eventbrite, Disqus, and Udemy, and is also a great tool for individuals like you.Make A Custom User Model - Building SaaS #40https://www.mattlayman.com/building-saas/make-custom-user-model/Wed, 01 Jan 2020 00:00:00 +0000https://www.mattlayman.com/building-saas/make-custom-user-model/In this episode, we started a users app and hooked up the custom user model feature of Django to unlock the full extensibility of that model in the future. The stream was cut short this week because of some crashing issues in the OBS streaming software.
The goal of the episode was to add django-allauth so that users can sign into the service with an email and password instead of the default username and password combination.A Failed SaaS Postmortemhttps://www.mattlayman.com/blog/2019/failed-saas-postmortem/Wed, 18 Dec 2019 00:00:00 +0000https://www.mattlayman.com/blog/2019/failed-saas-postmortem/My Software as a Service failed. After three years of running College Conductor, I’m shutting it down. The service failed for a host of reasons, and this article details what I learned from the whole experience. This is a chance for me to reflect, and give you some ideas of what pitfalls can happen if you’re planning to build a SaaS.
The vision Before getting to the lessons, let’s look at my vision for the service so you have some context of what I was building.django-environ and django-debug-toolbar - Building SaaS #39https://www.mattlayman.com/building-saas/django-environ-django-debug-toolbar/Wed, 18 Dec 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/django-environ-django-debug-toolbar/In this episode, we set up a couple of tools that will be at the base of development. The first tool was django-environ to control Django settings from environment variables. The second tool was the django-debug-toolbar to help with debugging pages in future work.
We started the stream with an upgrade to Django 3.0.1 because of a security release that was announced today. For a new project, I don’t recommend upgrading packages all the time, but security releases are my exception to that rule.New Project, Who Dis? - Building SaaS #38https://www.mattlayman.com/building-saas/new-project-who-dis/Fri, 06 Dec 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/new-project-who-dis/In this episode, we started a brand new project! I had some internet troubles so this “stream” is actually a local recording from my computer. We created a new Django project from scratch and set up Heroku to handle deployments.
In spite of the streaming trouble, we were able to get a bunch done. We started the project from scratch so we made a repository on GitHub with some .gitignore settings tailored for Python projects.Python Tears Through Mass Spectrometry Datahttps://www.mattlayman.com/blog/2019/python-mass-spectrometry/Thu, 14 Nov 2019 00:00:00 +0000https://www.mattlayman.com/blog/2019/python-mass-spectrometry/At the November 2019 Python Frederick event, Conor Jenkins showed the group how mass spectrometry works and how Python saves huge amounts of time when processing the large amount of data produced by a mass spec analysis.
The recording from the talk is available on YouTube. Check it out!
Questions? Feel free to mention me on X at @mblayman so I can try to respond to your question.Lessons From A Failed SaaS - Building SaaS #37https://www.mattlayman.com/building-saas/failed-saas-lessons/Wed, 06 Nov 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/failed-saas-lessons/In this episode, we talked about the things I learned from my SaaS project and some of the reasons why it failed to succeed financially. We dug into the technical and marketing challenges that I faced and what went wrong.
I’m shutting down my side project, College Conductor. The SaaS never achieved a sustainable level of success. I started the site to help my wife with her college consulting business. As you can see from what follows, the site didn’t mange to deliver what she (or anyone else) really needed.Godot You Want To Make A Videogamehttps://www.mattlayman.com/blog/2019/godot/Mon, 04 Nov 2019 00:00:00 +0000https://www.mattlayman.com/blog/2019/godot/<p>What is Godot?
It’s an open source game engine for making high quality 2D or 3D videogames!
At this Frederick Linux User Group (KeyLUG) presentation,
I explained how Godot works, compared it with other popular engines,
and showed off some of its features.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/4o63V0AdrHk" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>The recording from the talk is available
on YouTube.
<a href="https://www.youtube.com/watch?v=4o63V0AdrHk" target="_blank">Check it out!</a></p>Configurama - Building SaaS #36https://www.mattlayman.com/building-saas/configurama/Wed, 30 Oct 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/configurama/In this episode, we turned our attention to handling settings and configuration. We discussed different techniques for handling settings, looked at available tools, and started integrating one of the tools into the project.
The initial discussion in the stream focused on different ways of doing settings. I talked about what I view as a difference between configuration (mostly static stuff) and settings (dynamic parts of the app).
I also discussed where to get settings from.Deploying WhiteNoise - Building SaaS #35https://www.mattlayman.com/building-saas/deploying-whitenoise/Wed, 23 Oct 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/deploying-whitenoise/In this episode, we updated Continuous Integration, Nginx, and the Ansible deployment tasks to use WhiteNoise. With all the changes in place, we tested things out to verify that WhiteNoise served up the CSS, JS, and image files.
We started with Circle CI. First, I fixed the JS assets cache because the cache key never changed and Circle did not save fresh assets each build.
After completing the assets cache, I created a new cache that stored all the static files after running collectstatic.Publish to DEV automatically with GitHub Actionshttps://www.mattlayman.com/blog/2019/publish-dev-github-actions/Tue, 15 Oct 2019 00:00:00 +0000https://www.mattlayman.com/blog/2019/publish-dev-github-actions/DEV is a great community for developer content. If you have articles that you don’t want live all at once, how can you publish on a schedule automatically? In this article, let’s use GitHub Actions to get your content online on your timeline.
GitHub Actions is a way to run code on GitHub’s servers. The service is effectively a Continuous Integration (CI) service from GitHub. To use GitHub Actions, we create a workflow in a Git repository.Bring in the WhiteNoise, Bring in Da Funk - Building SaaS #34https://www.mattlayman.com/building-saas/bring-in-the-whitenoise/Wed, 02 Oct 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/bring-in-the-whitenoise/In this episode, we added WhiteNoise to the app as a tool for handling static assets. This lets us move away from depending on Nginx for the task and gives shiny new features like Brotli support.
We installed WhiteNoise into the requirements.in file and used pip-tools to generate a new requirements.txt.
whitenoise[brotli]==4.1.4 Once WhiteNoise was installed, it needed two primary settings changes.
Add a new middleware. Change the STATICFILES_STORAGE. MIDDLEWARE = [ .Get Out, Git! - Building SaaS #33https://www.mattlayman.com/building-saas/get-out-git/Wed, 18 Sep 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/get-out-git/In this episode, I removed the Git clone from the server. This is some of the final cleanup to streamline the deployment process.
Before we could remove the clone completely, we had to decouple the final remaining connections that still depended on the repository clone.
The first thing to clean up was the Let's Encrypt certificate fetching process. The load balancer’s Ansible playbook had this task:
- name: Create cert become: yes command: > /usr/bin/letsencrypt certonly --webroot --email "{{ secrets.Python alternative to Dockerhttps://www.mattlayman.com/blog/2019/python-alternative-docker/Wed, 18 Sep 2019 00:00:00 +0000https://www.mattlayman.com/blog/2019/python-alternative-docker/Deploying a Python app to a server is surprisingly hard. Without blinking, you’ll be dealing with virtual environments and a host of other complications.
The landscape of deployment methods is huge. What if I told you that there is a way to build your app into a single file and it isn’t a Docker container?
In this article, we’re going to look at common ways of deploying Python apps. We’ll explore the touted benefits of Docker containers to understand why containers are so popular for web apps.Python Testing 201 with pytesthttps://www.mattlayman.com/blog/2019/python-testing-201-with-pytest/Thu, 12 Sep 2019 00:00:00 +0000https://www.mattlayman.com/blog/2019/python-testing-201-with-pytest/<p>For Python Frederick’s September presentation,
I presented on Python testing.
In the presentation,
I explained more
of the features
of pytest
that went beyond the basics
that we explored in March.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/fv259R38gqc" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>The recording from the talk is available
on YouTube.
<a href="https://www.youtube.com/watch?v=fv259R38gqc&list=PLFcKEo4b_n1wMFhbiedpMgh2VRT5uICuF&index=2" target="_blank">Check it out!</a></p>wal-e Postgres Backups - Building SaaS #32https://www.mattlayman.com/building-saas/wal-e-postgres-backups/Wed, 04 Sep 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/wal-e-postgres-backups/In this episode, we worked on Postgres database backups and modified the backup tool, wal-e, to use the Shiv app format.
wal-e is Postgres database backup tool that works by managing the Write-Ahead Log (WAL) that a Postgres database produces. The WAL is the log of recent changes that happened in the database. If you have access to a full WAL, then you can conceivably reproduce a Postgres database’s data.Celery In A Shiv App - Building SaaS #31https://www.mattlayman.com/building-saas/celery-in-shiv/Sat, 31 Aug 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/celery-in-shiv/In this episode, we baked the Celery worker and beat scheduler tool into the Shiv app. This is one more step on the path to simplifying the set of tools on the production server.
I started the stream by reviewing the refactoring that I did to conductor/main.py. The main file is used to dispatch to different tools with the Shiv bundle.
The refactored version can pass control to Gunicorn, the Django management tools, or Celery.Quick and dirty mock service with Starlettehttps://www.mattlayman.com/blog/2019/starlette-mock-service/Mon, 26 Aug 2019 00:00:00 +0000https://www.mattlayman.com/blog/2019/starlette-mock-service/I had a challenge at work. The team needed to mock out a third party service in a testing environment. The service was slow and configuring it was painful. If we could mock it out, then the team could avoid those problems.
The challenge with mocking out the service is that part of the flow needs to invoke a webhook that will call back to my company’s system to indicate that all work is done.Ripping Out Node.js - Building SaaS #30https://www.mattlayman.com/building-saas/ripping-out-nodejs/Wed, 07 Aug 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/ripping-out-nodejs/In this episode, we removed Node.js from deployment. We had to finish off an issue with permissions first, but the deployment got simpler. Then we continued on the steps to make deployment do even less.
Last episode, we got the static assets to the staging environment, but we ended the session with a permissions problem. The files extracted from the tarball had the wrong user and group permissions.
I fixed the permissions by running an Ansible task that ran chown to use the www-data user and group.Add Static Assets to Deployment - Building SaaS #29https://www.mattlayman.com/building-saas/static-assets-deployment/Wed, 31 Jul 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/static-assets-deployment/In this episode, we pushed CI built static files to S3, then pulled those files into the Ansible deployment. This is part of the ongoing effort to simplify deployment by moving work to CI.
Last time, we processed static files like JavaScript, CSS, and images using webpack on Circle CI. Once the files were processed, I used the tar command to create a tarball (i.e., a .tar.gz file) that contains all the static assets.On Patreonhttps://www.mattlayman.com/blog/2019/patreon/Mon, 29 Jul 2019 00:00:00 +0000https://www.mattlayman.com/blog/2019/patreon/I like to teach on the internet.
Since 2008, I’ve made content to explain things that I’ve learned, review books that I’ve read, or share my thoughts.
In the last couple of years, I’ve upped my game. Instead of short articles, my content is now long form, and I spend a lot of time producing each one.
Additionally, I record the Building SaaS with Python and Django stream on Twitch. On that stream, I share my collected knowledge from doing web development for the better part of a decade.Webpack and collectstatic in CI - Building SaaS #28https://www.mattlayman.com/building-saas/webpack-collectstatic-ci/Thu, 25 Jul 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/webpack-collectstatic-ci/In this episode, we updated Continuous Integration (CI) to run webpack and the Django collectstatic command. This is part of the ongoing effort to simplify deployment by moving work to CI.Plug the Shiv App Into Nginx - Building SaaS #27https://www.mattlayman.com/building-saas/plug-shiv-app-nginx/Thu, 18 Jul 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/plug-shiv-app-nginx/In this episode, we finally connected the Shiv app into Nginx. This completes the whole process of converting to a Django Shiv and using that to run the site.Using Git and GitHub to safely store your codehttps://www.mattlayman.com/blog/2019/using-git-github-to-store-code/Thu, 11 Jul 2019 00:00:00 +0000https://www.mattlayman.com/blog/2019/using-git-github-to-store-code/<p>For Python Frederick’s July presentation,
I presented on Git and GitHub
for beginners
who have never used either
of those tools before.</p>
<p>In the presentation,
I explained the core concepts
of Git
and demonstrated how to use Git
with Visual Studio Code (VS Code).
We covered why you would use Git
and how you would use it
to work with other people.</p>
<p>The demonstration also used GitHub
to create a repository
for a code project.
We looked at a couple
of methods
of sharing code
between people,
including directly committing
to a shared repository
and working with Pull Requests.</p>
<p>The recording from the talk is available
on YouTube.
<a href="https://www.youtube.com/watch?v=v98_7iHlYWM&list=PLFcKEo4b_n1wMFhbiedpMgh2VRT5uICuF" target="_blank">Check it out!</a></p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/v98_7iHlYWM" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Connecting Shiv Apps with Ansible - Building SaaS #26https://www.mattlayman.com/building-saas/connecting-shiv-apps-with-ansible/Thu, 04 Jul 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/connecting-shiv-apps-with-ansible/In this episode, we finished connecting the Django Shiv app into Ansible. This required messing with file permissions and copying settings files to their proper place.It's Permissions, Dummy! - Building SaaS #25https://www.mattlayman.com/building-saas/its-permissions-dummy/Thu, 27 Jun 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/its-permissions-dummy/In this episode, we got into a static files problem that caused a template to fail to load from the Shiv app.
After some serious spelunking through the Django code and deep debugging, we found the file permission error that was the source of the problem.In the Guts of a Shiv App - Building SaaS #24https://www.mattlayman.com/building-saas/guts-shiv-app/Thu, 20 Jun 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/guts-shiv-app/In this episode, we got our hands dirty with the Django Shiv app that we build to work out issues with finding templates and other settings problems.Supercharging Vim: Blazing fast search and global replacehttps://www.mattlayman.com/blog/2019/supercharging-vim-blazing-fast-search/Wed, 29 May 2019 00:00:00 +0000https://www.mattlayman.com/blog/2019/supercharging-vim-blazing-fast-search/What do you do when you need to search in all the files in your project? Can you do it faster than the default Vim configuration? Yes, absolutely.
In the fourth article of the Supercharging Vim series, we’re going to look at searching and how to be effective and fast using search tools built for a Vim workflow.
If you want to check out other articles in the series, you can follow any of the links below.It's Alive! A Django Shiv app - Building SaaS #23https://www.mattlayman.com/building-saas/its-alive-django-shiv-app/Thu, 23 May 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/its-alive-django-shiv-app/In this episode, we made Ansible pull down the Django Shiv app from S3 during deployment. Then we knocked out some kinks in the process to get the app working.Upload to S3 with CircleCI orbs - Building SaaS #22https://www.mattlayman.com/building-saas/upload-s3-circleci-orbs/Thu, 16 May 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/upload-s3-circleci-orbs/In this episode, we worked on uploading to S3. We took the Shiv app from previous streams that we built on CircleCI and used their new orbs feature to deliver the app to an S3 bucket for later deployments.Strategy for developer weight losshttps://www.mattlayman.com/blog/2019/strategy-developer-weight-loss/Tue, 14 May 2019 00:00:00 +0000https://www.mattlayman.com/blog/2019/strategy-developer-weight-loss/You’re busy.
You’re clocking insane amounts of extra hours before that big product launch or from pressure from your client or boss.
How can you possibly spend the time on your body that you know you should?
The toll of those hours is a body that’s softer than you want it to be.
But you’re smart and know that, just like software projects, there’s No Silver Bullet strategy that will remove that extra weight that you’ve put on.Shiv zipapps and CI - Building SaaS #21https://www.mattlayman.com/building-saas/shiv-zipapps-ci/Thu, 02 May 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/shiv-zipapps-ci/In this episode, I took our new Shiv zipapp and fixed a problem with its dependencies. Then we worked on building the Shiv app in the continuous integration (Circle CI) environment.Teaching a kid to code with Pygame Zerohttps://www.mattlayman.com/blog/2019/teach-kid-code-pygame-zero/Tue, 30 Apr 2019 00:00:00 +0000https://www.mattlayman.com/blog/2019/teach-kid-code-pygame-zero/How can you excite a kid about coding and computers? As a software developer and father of two children, I think about this question often. A person with software skills can have big advantages in our modern world, so I’d like to equip my kids for their future.
In my home, we play video games together. My children (aged six and four) watch me play through many classics like Super Mario World and The Legend of Zelda: A Link to the Past.Making a Shiv App - Building SaaS #20https://www.mattlayman.com/building-saas/making-a-shiv-app/Thu, 25 Apr 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/making-a-shiv-app/In this episode, we took our Python package from the previous episode and bundled it together with the Python dependencies using a tool called Shiv from LinkedIn.Completing Account Deactivation on Building SaaShttps://www.mattlayman.com/blog/2019/completing-account-deactivation/Thu, 18 Apr 2019 00:00:00 +0000https://www.mattlayman.com/blog/2019/completing-account-deactivation/<p>In the latest episode
of Building SaaS with Python and Django,
we completed the account deactivation workflow
of the Django app.</p>
<p>This included:</p>
<ul>
<li>Canceling the subscription with Stripe.</li>
<li>Marking the user as inactive.</li>
<li>Sending the user to a friendly page
to indicate that their account is deactivated.</li>
</ul>
<iframe width="560" height="315" src="https://www.youtube.com/embed/IRq_kJWEWDc" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>The recording is available on YouTube
and the full transcript is below.</p>Pip-tools and App Packaging - Building SaaS #19https://www.mattlayman.com/building-saas/pip-tools-app-packaging/Thu, 18 Apr 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/pip-tools-app-packaging/In this episode, we started by improving our requirements.txt handling with pip-tools. Then we cleaned things up and began turning the app into a Python package.Completing Account Deactivation - Building SaaS #18https://www.mattlayman.com/building-saas/completing-account-deactivation/Thu, 04 Apr 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/completing-account-deactivation/In this episode, we finished the account deactivation flow. We looked at how to log out and mark an account as inactive. The deactivate customer is presented with a nice deactivated page to let them know there subscription was canceled successfully.Canceling Stripe Subscriptions - Building SaaS #17https://www.mattlayman.com/building-saas/canceling-stripe-subscriptions/Thu, 28 Mar 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/canceling-stripe-subscriptions/In this episode, we continued on the deactivation workflow and worked through canceling a subscription with Stripe.Feature Flags in Action - Building SaaS #16https://www.mattlayman.com/building-saas/feature-flags-in-action/Thu, 21 Mar 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/feature-flags-in-action/In this episode, we used the feature flag system covered last time to add a new feature! We saw how feature flags make sure that your users don’t see your feature until you’re ready.Supercharging Vim: Navigate files instantlyhttps://www.mattlayman.com/blog/2019/supercharging-vim-navigate-files-instantly/Wed, 20 Mar 2019 00:00:00 +0000https://www.mattlayman.com/blog/2019/supercharging-vim-navigate-files-instantly/How do you find the right file to work on quickly?
If you’ve worked with an Integrated Development Environment (IDE) in the past, you may be used to using a file tree to explore the files in your project. This can be great if the project is new as you’re learning what files are available to edit.
What if you’ve worked on the project for a long time and know where nearly everything is?Python Testing 101 with pytesthttps://www.mattlayman.com/blog/2019/python-testing-101-with-pytest/Thu, 14 Mar 2019 00:00:00 +0000https://www.mattlayman.com/blog/2019/python-testing-101-with-pytest/<p>For Python Frederick’s March presentation,
I presented on Python testing.
In the presentation,
I used pytest to show how quickly
you can get started
with testing your code.
We covered the what, why, and how
of testing in Python.</p>
<p>The recording from the talk is available
on YouTube.
<a href="https://www.youtube.com/watch?v=etosV2IWBF0&list=PLFcKEo4b_n1wMFhbiedpMgh2VRT5uICuF" target="_blank">Check it out!</a></p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/etosV2IWBF0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Feature Flags with Django Waffle - Building SaaS #15https://www.mattlayman.com/building-saas/feature-flags-with-django-waffle/Thu, 07 Mar 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/feature-flags-with-django-waffle/In this episode, we added a feature flag system to College Conductor to control when users see new features.
We used the excellent Django Waffle project.Ansible Cranked to 11https://www.mattlayman.com/blog/2019/ansible-cranked-to-11/Mon, 04 Mar 2019 00:00:00 +0000https://www.mattlayman.com/blog/2019/ansible-cranked-to-11/<p>On the <a href="https://www.twitch.tv/mblayman" target="_blank">Building SaaS with Python and Django</a> Twitch stream,
I tried out a new tool
to see if it would improve my deploy time.
We configured Ansible to use <a href="https://mitogen.readthedocs.io/en/latest/ansible.html" target="_blank">Mitogen</a>
and it was an incredible success.</p>
<p><strong>With Mitogen, the Ansible deploy was 4.5X faster!</strong>
Check out the YouTube video
to watch how quickly we could get Mitogen going.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/iZy4qC9ToAw" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>Ansible Cranked to 11 - Building SaaS #14https://www.mattlayman.com/building-saas/ansible-cranked-to-11/Thu, 28 Feb 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/ansible-cranked-to-11/In this episode, we super charged the Ansible deployment of College Conductor. We reduced the time it tasks to deploy from 7 minutes down to 1 minute and 30 seconds by using a tool called Mitogen.
Check out how Mitogen can be added to your deployment with little configuration and how it speeds up Ansible.Deploying with Ansible - Building SaaS #13https://www.mattlayman.com/building-saas/deploying-with-ansible/Thu, 07 Feb 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/deploying-with-ansible/In this episode, I walked through the deployment process to put the updated web application onto the live site.
We took a slight detour to discuss Continuous Integration when it seemed like Vagrant was broken, but we got back on track and focused on Ansible and how it’s used to push code onto the internet.Building SaaS in Januaryhttps://www.mattlayman.com/blog/2019/building-saas-january/Wed, 06 Feb 2019 00:00:00 +0000https://www.mattlayman.com/blog/2019/building-saas-january/Here’s a recap of what happened on the Building SaaS with Python and Django stream this past month.
If some of these topics interest you, check them out! If you want to join live in the future, I stream live on Twitch on Wednesdays at 9pm Eastern time in the U.S. at https://www.twitch.tv/mblayman.
Completing a 3rd party integration We spent some weeks in December building a 3rd party integration into College Conductor (the SaaS project that the stream focuses on).The Sleepy Developer: How Sleep Affects Your Codehttps://www.mattlayman.com/blog/2019/how-sleep-affects-your-code/Mon, 04 Feb 2019 00:00:00 +0000https://www.mattlayman.com/blog/2019/how-sleep-affects-your-code/Consider the stereotype of the elite programmer. Maybe you see someone sitting in front of a bank of monitors, staring at full-screen terminals, in a dimly lit bedroom, at 3am, slamming down Mountain Dew from a 7-Eleven Big Gulp while pounding furiously at a keyboard.
What’s reality? Is the caffeine-fueled, elite “hacker” mindset an efficient way to code? How does this person stack against the science of sleep? Let’s talk about sleep.Automation aides - Building SaaS #12https://www.mattlayman.com/building-saas/automation-aides/Thu, 31 Jan 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/automation-aides/In this episode, we completed an automated tool for processing and connecting data quickly. We built an HTML template and walked through how to extract pieces and make connections.Semi-automated tasks - Building SaaS #11https://www.mattlayman.com/building-saas/semi-automated-tasks/Thu, 24 Jan 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/semi-automated-tasks/In this episode, we worked on a tool designed to help with backend manual tasks that would semi-automate the work. By automating some portion of the task, we’re able to make it way faster to complete.Admin dashboards - Building SaaS #10https://www.mattlayman.com/building-saas/admin-dashboards/Wed, 16 Jan 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/admin-dashboards/In this episode, we started on a tools dashboard for admin-level users. We talked about Django’s auth module for handling access and how to protect views from unauthorized users.Local web development vs Vagrant vs Docker: What’s right for you?https://www.mattlayman.com/blog/2019/web-development-environments/Tue, 08 Jan 2019 00:00:00 +0000https://www.mattlayman.com/blog/2019/web-development-environments/What tools do you use to build your web applications? Your choice matters a lot because you’ll spend a lot of time working in that environment.
If you make a poor choice, you’ll be stuck with something suboptimal that can slow you down massively and make your project grind to a halt.
If you make a harmonious choice, your tool will aide you on your development journey and let you crank out features to delight your customers.Finishing third party integration - Building SaaS #9https://www.mattlayman.com/building-saas/finishing-third-party-integration/Thu, 03 Jan 2019 00:00:00 +0000https://www.mattlayman.com/building-saas/finishing-third-party-integration/In this episode, we finished off our integration with Prompt. To finish the integration, we changed the background web scraping task to send an email when changes happen. We also discussed how we’re going to build out an admin dashboard for managing back office processing.Connecting third party services - Building SaaS #8https://www.mattlayman.com/building-saas/connect-third-party-services/Wed, 26 Dec 2018 00:00:00 +0000https://www.mattlayman.com/building-saas/connect-third-party-services/In this episode, we added the background task that does web scraping to collect data from a third party service.
We wrote a Celery task and used requests and Beautiful Soup to handle all the scraping.Displaying third party data - Building SaaS #7https://www.mattlayman.com/building-saas/display-third-party-data/Wed, 19 Dec 2018 00:00:00 +0000https://www.mattlayman.com/building-saas/display-third-party-data/In this stream episode, we added our third party integration (Prompt) to the page where school information is displayed. This involved some Django model changes, view additions, and template development.Django Tutorial Adventure Part 2https://www.mattlayman.com/blog/2018/django-tutorial-adventure-part-2/Thu, 13 Dec 2018 00:00:00 +0000https://www.mattlayman.com/blog/2018/django-tutorial-adventure-part-2/What happens when you take a novice web developer and put him in front of an audience equipped with the Django tutorial only? That’s what we did at Python Frederick. The conversation and learning that resulted was awesome. Check out the video on YouTube to see what you can learn too!
Our presenter was Patrick Pierson. Patrick works for IronNet Cybersecurity as a Senior Software Engineer. He uses Python daily to deploy AWS resources and test the IronNet platform.Third party integration modeling - Building SaaS #6https://www.mattlayman.com/building-saas/third-party-integration-modeling/Wed, 05 Dec 2018 00:00:00 +0000https://www.mattlayman.com/building-saas/third-party-integration-modeling/In this stream episode, we started a new integration with a 3rd party service. We created the database model to store information related to the service and looked at how we’re going to pull all the pieces together.Deciphering Python: How to use Abstract Syntax Trees (AST) to understand codehttps://www.mattlayman.com/blog/2018/decipher-python-ast/Thu, 29 Nov 2018 00:00:00 +0000https://www.mattlayman.com/blog/2018/decipher-python-ast/Let’s get a little “meta” about programming.
How does the Python program (better know as the interpreter) “know” how to run your code? If you’re new to programming, it may seem like magic. In fact, it still seems like magic to me after being a professional for more than a decade.
The Python interpreter is not magic (sorry to disappoint you). It follows a predictable set of steps to translate your code into instructions that a machine can run.Updating data models - Building SaaS #5https://www.mattlayman.com/building-saas/updating-data-models/Thu, 29 Nov 2018 00:00:00 +0000https://www.mattlayman.com/building-saas/updating-data-models/In this stream episode, we took some new data from a new Django database model, and I showed how to add that data to different templates.
Along the way, we wrote automated tests and generated a database migration.Using a background scheduler - Building SaaS #4https://www.mattlayman.com/building-saas/background-scheduler/Thu, 22 Nov 2018 00:00:00 +0000https://www.mattlayman.com/building-saas/background-scheduler/In this episode, we added Celery beat to College Conductor. Celery beat is the scheduler for the Celery worker system.
I walked through how to test new infrastructure, confirmed that Celery beat worked, then showed how to add it to Ansible, the infrastructure deployment tool.Building SaaS with Python on Twitchhttps://www.mattlayman.com/blog/2018/building-saas-on-twitch/Mon, 19 Nov 2018 00:00:00 +0000https://www.mattlayman.com/blog/2018/building-saas-on-twitch/I started streaming on Twitch. The stream covers how to build a Software as a Service (SaaS) with Python using Django.
The stream runs at 9pm Eastern time on Wednesday most weeks.
I show developers how to build a site that is more complex than a tutorial. We look at:
Designing and creating pages for users How to create automated tests for the code Making background jobs that handle business processes Deploying code and infrastructure development During the stream, we’re working on College Conductor.Multiple Stripe plans - Building SaaS #3https://www.mattlayman.com/building-saas/multiple-stripe-plans/Thu, 08 Nov 2018 00:00:00 +0000https://www.mattlayman.com/building-saas/multiple-stripe-plans/In this stream episode, I built a Django model that would allow my SaaS app (College Conductor) to deal with multiple Stripe plans.
After building the model, we updated the landing page to display a different plan based on the database data from the model.Reporting scraped data - Building SaaS #2https://www.mattlayman.com/building-saas/reporting-scraped-data/Wed, 31 Oct 2018 00:00:00 +0000https://www.mattlayman.com/building-saas/reporting-scraped-data/In this episode, I took data that we collected from a web scraping task built in the first stream and created a report email that could be sent to the site admin.Building SaaS with Python and Django #1https://www.mattlayman.com/building-saas/first-stream/Thu, 25 Oct 2018 00:00:00 +0000https://www.mattlayman.com/building-saas/first-stream/This was the first episode and it was an experiment in streaming. In future episodes, I’ve greatly improved audio and video settings. I’d suggest checking those out.Build Native Mobile Apps with Python (BeeWare)https://www.mattlayman.com/blog/2018/build-mobile-python-apps-beeware/Fri, 12 Oct 2018 00:00:00 +0000https://www.mattlayman.com/blog/2018/build-mobile-python-apps-beeware/You can build mobile applications with Python? Absolutely. At Python Frederick’s October 2018 presentation, Bob Marchese showed us how to use BeeWare, a suite of tools for building mobile apps (among other things).
Bob’s presentation material are available on the Python Frederick talks repository on GitHub.Consistent Python code with Blackhttps://www.mattlayman.com/blog/2018/python-code-black/Tue, 02 Oct 2018 00:00:00 +0000https://www.mattlayman.com/blog/2018/python-code-black/Code formatting is the subject of millions of fiery, nerdy debates. Developers love to argue about code style because we read code a lot. The style matters because it affects readability.
We have examples of communities that benefit from a shared code style.
The Go programming language has gofmt (i.e., “go format”) baked in as a core tool in the language. Their core team decided on a set of rules to use and everyone gets the benefit of reading code that looks very similar.A tale of two site generatorshttps://www.mattlayman.com/blog/2018/tale-two-site-generators/Sat, 18 Aug 2018 00:00:00 +0000https://www.mattlayman.com/blog/2018/tale-two-site-generators/I made my website back in 2008 as a way to build an online presence. The site began as a WordPress blog hosted on wordpress.com. After years of living at wordpress.com, I moved to my own server for a short stint. Eventually, I discovered GitHub Pages and started my journey into static site generators to avoid the burden of managing my own hardware. Today, I’ve moved from a custom static site generator to Hugo.New Job: Doctor on Demandhttps://www.mattlayman.com/blog/2018/doctor-on-demand/Tue, 07 Aug 2018 00:00:00 +0000https://www.mattlayman.com/blog/2018/doctor-on-demand/Within the last month, I’ve joined a new company. I’m now a senior software engineer at Doctor on Demand. This is my first foray into a healthcare company so I’m excited about all the new things that I’ll be exposed to.
Doctor on Demand is a leader in telemedicine. The service brings doctors directly to patients via video calls. These doctors are able to diagnose and prescribe treatment for many of the common health problems that primary care providers usually see.Full Health Developer Launchhttps://www.mattlayman.com/blog/2018/full-health-developer-launch/Mon, 18 Jun 2018 00:00:00 +0000https://www.mattlayman.com/blog/2018/full-health-developer-launch/I launched a new website devoted to developer health called Full Health Developer. The site focuses on physical and mental health topics that are relevant to software developers.
Toward the beginning of the year, I surveyed meetups in the Washington D.C. area to find out the issues that developers think about concerning their health.
The survey responses mentioned what you might expect from a health survey:
Unable to get to a gym Hard time maintaining good nutrition Bad sleep habits There were also topics closer to developers:RFNM - Request For New Maintainerhttps://www.mattlayman.com/blog/2018/request-for-new-maintainer/Tue, 15 May 2018 00:00:00 +0000https://www.mattlayman.com/blog/2018/request-for-new-maintainer/The Pull Requests piled up. Each new PR added to the weight reminding me that I was not being a responsive maintainer. I felt guilty.
Guilt: A feeling held by many open source maintainers who can’t (or don’t want to) continue on a project that they manage.
Feeling guilty about contributing to open source is terrible. You feel like you’re letting people down or like you owe them something more. I think I did something good for the open source community so why do I feel this way?Developer Health Surveyhttps://www.mattlayman.com/blog/2018/developer-health-survey/Mon, 05 Feb 2018 00:00:00 +0000https://www.mattlayman.com/blog/2018/developer-health-survey/I’ll cut to the chase on this:
If you are a software developer, can you help me identify our community’s biggest health issues by answering a few questions?
Here is the Google Form with developer health survey questions. As January came around, I spent time reviewing my annual goals. Some of the goals always relate to my health and doing something to stay fit, physically and mentally.
While thinking about this for myself, I wondered what software developers do about this.Doing code reviewhttps://www.mattlayman.com/blog/2017/doing-code-review/Sat, 23 Dec 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/doing-code-review/How do you do code reviews?
This question was recently presented to me from someone considering adding code reviews to his team’s process.
This post lists his questions and my answers (lightly edited) for the benefit of other teams looking for advice about starting code reviews.
How exactly do you review code? When is a reviewer being pedantic vs being helpful? I think this is the best place for automated linting tools for style guides and other static analysis.Data science in Pythonhttps://www.mattlayman.com/blog/2017/data-science-in-python/Tue, 19 Dec 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/data-science-in-python/This month, Python Frederick heard about many of the amazing data science tools available in Python. Christine Lee, one of Python Frederick’s organizers, showed a very interactive presentation that highlighted some amazing features used by scientists all over the world.
Christine’s presentation is available online at Python Frederick's GitHub repo.Supercharging Vim: Instant testinghttps://www.mattlayman.com/blog/2017/supercharging-vim-instant-testing/Sun, 10 Dec 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/supercharging-vim-instant-testing/How do you know that your code works?
That’s a surprisingly deep question if you really dig into the meaning of “works,” but from a practical level, you can trust that code works by verifying its behavior; and a good way to verify is to write test code that will assert that the code behaves as expected.
In the second post of this “Supercharging Vim” series, we’re going to explore how you can run automated tests within Vim.Supercharging Vim: Using pluginshttps://www.mattlayman.com/blog/2017/supercharging-vim-using-plugins/Wed, 22 Nov 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/supercharging-vim-using-plugins/For many years, I worked in private networks for different contracts where having a customized editor for software development was tough. That environment made me feel that customizing my work tools was fruitless. Looking back, I wish I had ignored that feeling.
My main editor is Vim, a tool with a strong reputation. I was very comfortable with the tool’s default settings, but I had not explored how to customize it beyond turning on syntax highlighting.Scraping the web with Scrapyhttps://www.mattlayman.com/blog/2017/web-scraping-with-scrapy/Thu, 09 Nov 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/web-scraping-with-scrapy/This month, Python Frederick learned about Scrapy, a tool used to read web pages and extract information from them. Our speaker was Micah Nordland, and he explained the core components of Scrapy and demoed how to use the tool to get data from website.
Micah’s presentation is available online at http://lucy.rehack.me/slides/scrapy/.Web frameworks shootouthttps://www.mattlayman.com/blog/2017/web-frameworks-shootout/Sat, 21 Oct 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/web-frameworks-shootout/At October’s Python Frederick presentation, I looked at 5 popular Python web frameworks and discussed the benefits and tradeoffs of each of these tools. The video is available on YouTube for you to view.
These were the 5 web frameworks that we compared:
API Star Falcon Flask Django Pyramid The presentation material is available in the Python Frederick talks repository.
Additionally, the sample code for each framework can be downloaded from GitHub in a specific web frameworks repository.A NES for Christmashttps://www.mattlayman.com/blog/2017/a-nes-for-christmas/Tue, 17 Oct 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/a-nes-for-christmas/Have you ever received a gift that fundamentally changes your path in life?
For the Christmas of 1990, I got the best and most influential suprise gift of my life: a Nintendo Entertainment System. Twenty seven years later, I still recall the shock and joy of unwrapping the Nintendo, with its included orange zapper light gun and the Super Mario Bros./Duck Hunt combination cartridge. My grandmother surprised even my parents, who were not super keen on the idea of my owning a video game system at the time.Pipfile and pipenvhttps://www.mattlayman.com/blog/2017/pipfile-pipenv/Thu, 10 Aug 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/pipfile-pipenv/Last month, I wrote in detail about the new Pipfile format and the pipenv tool for managing Python packages. I presented about Pipfiles in depth at Python Frederick this month.
If audio and video is more your speed, we recorded a talk for the first time at Python Frederick, and I posted it to YouTube for your enjoyment.
The presentation material is available in the Python Frederick talks repository.HTTPS made simple with Netlifyhttps://www.mattlayman.com/blog/2017/https-made-simple-with-netlify/Wed, 02 Aug 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/https-made-simple-with-netlify/For an extremely long time, adding encryption to a website was inconvenient and costly. To get that precious green lock in the URL bar (which only appears when a website is served with secure HTTP, a.k.a. HTTPS), a developer had to perform a series of arcane steps. These steps include digital certificates, signing requests, and all manner of terminology that are yet another thing to learn. This procedure was manual and painful.No nitpicking in code reviewshttps://www.mattlayman.com/blog/2017/no-nitpicking-code-reviews/Tue, 18 Jul 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/no-nitpicking-code-reviews/Two hours. I sat in an excruciatingly cold conference room while enduring the code review meeting that would never end. The contract demanded formal code reviews so we had a room full of engineers wearing many hats. A moderator, lead reviewer, other reviewers, scribe and more “interested” parties stared at code on a projector. The code in question was thousands of lines long and was a big subsystem in a major satellite software.Using Pipfile for fun and profithttps://www.mattlayman.com/blog/2017/using-pipfile-for-fun-and-profit/Tue, 04 Jul 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/using-pipfile-for-fun-and-profit/Managing dependencies is deceptively hard. Need proof? Talk to anyone who has to manage a package.json in JavaScript. I’m sure they’ll have stories.
Python is not immune to this hard problem. For years, the community rallied around the requirements.txt file to manage dependencies, but there are some subtle flaws that make dependency handling more confusing than necessary. To fix these issues, the Python Packaging Authority, which is the group responsible for many things including pip and PyPI, proposed a replacement for requirements.Feature flags and waffleshttps://www.mattlayman.com/blog/2017/feature-flags-and-waffles/Tue, 27 Jun 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/feature-flags-and-waffles/You’re on a team that wants to ship a Super Cool New Feature™.
The feature will cause changes all over your web app. Instead of releasing the work in pieces, the marketing team wants to have a big reveal to create a buzz. How do you manage this challenge?
One option is to keep all the work in a separate code branch. When everything is done, merge the code back into your main branch, ship it, and reveal it to the world.Pythonic code: leveraging packageshttps://www.mattlayman.com/blog/2017/pythonic-code-leveraging-packages/Tue, 13 Jun 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/pythonic-code-leveraging-packages/This post concludes a series on “Pythonic” code. Pythonic code is code that fits well with the design of the Python language. In the last post, we looked at Python’s standard library and how the “batteries included” mentality can take a developer very far with minimal extra effort. This sixth and final post will discuss the Python Package Index (PyPI) and ways to make your code richer and more powerful by using the amazing work from the Python community.Aphantasiahttps://www.mattlayman.com/blog/2017/aphantasia/Wed, 24 May 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/aphantasia/Can you picture a small child eating a candy bar? What do you see? For the majority of my life, I assumed that the question of “what do you see?” was a way of asking “can you recall the concepts of what was described?” Then I learned that most people really see something. As in, they can see an image as if their eyes were seeing it directly. Truthfully, I’m still sort of in shock that this ability is possible, and that I don’t have it.Pythonic code: using the standard libraryhttps://www.mattlayman.com/blog/2017/pythonic-code-using-standard-library/Tue, 09 May 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/pythonic-code-using-standard-library/This post continues a series on “Pythonic” code. Pythonic code is code that fits well with the design of the Python language. The previous post explored the possibilities with Python’s built-in functions. This fifth post will peek into the standard library and highlight how many amazing tools are available with no setup.
The list comprehension The with statement The property decorator Built-in functions Using the standard library Leveraging packages Using the standard library To quote from the Python documentation:Pythonic code: built-in functionshttps://www.mattlayman.com/blog/2017/pythonic-code-built-in-functions/Mon, 24 Apr 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/pythonic-code-built-in-functions/This post continues a series on “Pythonic” code. Pythonic code is code that fits well with the design of the Python language. The last post examined the property decorator as a technique to make beautiful classes. This fourth post will dive into Python’s built-in functions.
The list comprehension The with statement The property decorator Built-in functions Using the standard library Leveraging packages Built-in functions A couple of years ago, I made a challenge for myself to read through all of Python’s standard library.Pythonic code: the property decoratorhttps://www.mattlayman.com/blog/2017/pythonic-code-the-property-decorator/Tue, 11 Apr 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/pythonic-code-the-property-decorator/This post continues a series on “Pythonic” code. Pythonic code is code that fits well with the design of the Python language. My previous post looked at the with statement and simplifying setup and tear down code. This third post will examine the property decorator.
The list comprehension The with statement The property decorator Built-in functions Using the standard library Leveraging packages The property decorator If you’ve ever taken a class on object oriented (OO) design, then you’ve likely been taught the value of encapsulation.Pythonic code: the with statementhttps://www.mattlayman.com/blog/2017/pythonic-code-the-with-statement/Tue, 04 Apr 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/pythonic-code-the-with-statement/This post continues a series on “Pythonic” code. Pythonic code is code that fits well with the design of the Python language. Previously, I wrote about list comprehensions as a powerful way to manipulate Python’s list data structure. This post will cover the with statement.
The list comprehension The with statement The property decorator Built-in functions Using the standard library Leveraging packages The with statement One task that you are likely to encounter while programming Python is the need to open a file.Pythonic code: the list comprehensionhttps://www.mattlayman.com/blog/2017/pythonic-code-the-list-comprehension/Tue, 28 Mar 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/pythonic-code-the-list-comprehension/At the next Python Frederick meetup, I’m going to speak about “Pythonic” code. Pythonic code is code that fits well with the design of the Python language. Some people might call this idiomatic Python. These design patterns give Python some of its elegant feeling. Since I’m going to do an entire talk on Pythonic code, I’ve decided to put together a series of posts that will explore some of the patterns in greater depth.Semantic UI in Emberhttps://www.mattlayman.com/blog/2017/semantic-ui-ember/Tue, 21 Mar 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/semantic-ui-ember/For my SaaS app, College Conductor, I made the choice to use Ember to power the frontend web client. I also decided to use Semantic UI as the UI toolkit to build the look and feel of the site. Integrating the two projects into a single product proved to be harder than I anticipated. Let’s look at why that happened.
My first decision when evaluating Semantic UI led me to consider if a viable Ember add-on existed.The Pragmatic Programmer revisitedhttps://www.mattlayman.com/blog/2017/pragmatic-programmer-revisited/Tue, 14 Mar 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/pragmatic-programmer-revisited/The Pragmatic Programmer is an excellent book. Top notch.
The book shaped how I think about writing software and established a mental framework for getting code developed in an effective manner. I recently decided to revisit the book since seven years passed from my initial read-through. Now that I have much stronger feelings about software, forged from my personal experience, I was curious how the advice described in the book jived with my own thoughts.12-factor Django appshttps://www.mattlayman.com/blog/2017/12-factor-django-apps/Tue, 07 Mar 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/12-factor-django-apps/Deployment of web applications has many considerations. Most web applications must handle sensitive data. To handle increased traffic, the app should be scalable. If a crash occurs in the app, no data should be lost. These are only a few things that need to be considered. Twelve-factor applications address a lot of these issues, and I’ll show how to make a Django web application behave as a twelve-factor app.
The twelve-factor application methodology is a pattern popularized by Heroku with an aim to handle many of the biggest considerations in web application deployment.Open Graph, X cards, and plugins... Oh My!https://www.mattlayman.com/blog/2017/open-graph-twitter-plugins/Tue, 28 Feb 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/open-graph-twitter-plugins/Facebook recently reported having 1.86 billion monthly active users. X clocks in at 313 million monthly active users. Like them or not, social media sites are extremely popular channels for people to learn about the world around them. This means that making your content ready for social media is a great way to improve people’s perception of your work.
To make your content social media ready, you need to include some metadata markup in your HTML that these sites can discover when scanning your pages.Cure for Imposter Syndromehttps://www.mattlayman.com/blog/2017/cure-imposter-syndrome/Tue, 21 Feb 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/cure-imposter-syndrome/At every stage of our careers, we are learners. No matter how much an individual accomplishes, there will always be more to learn and do. This truth is bound to leave people with a feeling that they have missing knowledge. My understanding of Imposter Syndrome is that people latch onto these kinds of feelings and can translate that to anxiety and other self-destructive forces. I’m certainly not a psychologist, but I can offer this advice to software developers who are feeling inadequate with their experience (including myself):PostgreSQL text search in Djangohttps://www.mattlayman.com/blog/2017/postgres-search-django/Tue, 14 Feb 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/postgres-search-django/College Conductor gives educational consultants and counselors access to the information of thousands of U.S. colleges and universities. The most natural method to find these schools is through search. Since College Conductor keeps up with the latest versions of Django, I was able to add search by using PostgreSQL’s full text search that is exposed to the Django ORM. The search features are not perfect, but they provide results quickly and avoid bringing in a more targeted tool like Elasticsearch.Rollbar monitoring of Celery in a Django apphttps://www.mattlayman.com/blog/2017/django-celery-rollbar/Tue, 07 Feb 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/django-celery-rollbar/The last Rollbar post that I made covered how to integrate Rollbar into your Ember application. As a reminder, Rollbar is a service that let’s you record your errors wherever they happen. In that original post, I didn’t cover how to include Rollbar in a Django application because the Rollbar team does a great job of that in their own documentation. But what happens when you want to do asynchronous task management with Celery in your Django app?A currentUser service for Ember with JWThttps://www.mattlayman.com/blog/2017/current-user-jwt/Tue, 31 Jan 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/current-user-jwt/Any Software as a Service will likely need the capability to authenticate a user and show information about that user. As an interesting design choice, Ember does not include authentication as a core feature. Instead, Ember developers must turn to the addon ecosystem. After some research, I chose Ember Simple Auth with Ember Simple Auth Token to use JSON Web Tokens (JWT) for College Conductor. JSON Web Tokens are an emerging standard that make secure exchanges (like authentication) possible.The necessity of software abstractionhttps://www.mattlayman.com/blog/2017/necessity-of-software-abstraction/Tue, 24 Jan 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/necessity-of-software-abstraction/Tell me if you’ve heard this one before: unless you understand how a software abstraction works, you will not be able to use it well. I’ve heard variations of this declaration on a number of podcasts and other tech blogs and media. I think this idea is misguided. To the contrary, embracing software abstractions requires you to accept ultimately that you will not understand them all.
Our lives are full of abstractions.2 Critical Python packaging toolshttps://www.mattlayman.com/blog/2017/2-critical-python-packaging-tools/Tue, 17 Jan 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/2-critical-python-packaging-tools/At last week’s Python Frederick meetup, I gave a talk on Python packaging. My aim was to cover how packaging works and how to build a basic package. Over the course of the talk, we used a couple of tools that I think are critical for releasing a Python package to PyPI. I’ll describe these tools and why I think they are critical.
tox tox is a fantastic tool for testing packaging.Sideload JSON API resources in Djangohttps://www.mattlayman.com/blog/2017/sideload-json-api-django/Tue, 10 Jan 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/sideload-json-api-django/I’m a big proponent of using a framework to reduce the time required to make something useful. Occasionally, using a framework means that developers must explore to understand what is possible. This truth is even more evident when there are layers of extensions to achieve a desired result. For instance, College Conductor is driving an EmberJS app with a JSON API powered by Django. The API uses the excellent Django REST Framework and the DRF JSON API extension.Monitor Ember app errors with Rollbarhttps://www.mattlayman.com/blog/2017/ember-rollbar/Tue, 03 Jan 2017 00:00:00 +0000https://www.mattlayman.com/blog/2017/ember-rollbar/One fact that I’ve come to accept as an experienced developer is that errors will happen. Guaranteed. The reasons for this situation are vast. Perhaps there are quirks in a browser you didn’t test. Or perhaps the user did something that you didn’t plan for. You can’t anticipate every situation. Knowing that errors will happen means you have two choices. You can ignore this fact and let your users suffer (at the risk of losing them).handroll, sitemaps, and robots.txthttps://www.mattlayman.com/blog/2016/handroll-sitemaps-robots/Mon, 26 Dec 2016 00:00:00 +0000https://www.mattlayman.com/blog/2016/handroll-sitemaps-robots/Google webmaster tools provide suggestions to improve your site ranking. The suggestions generally involve making it easier for their crawlers to find your content. One such suggestion is adding a sitemap. Adding a sitemap can increase your visibility on the internet.
A sitemap is a listing of pages within your site. Web crawlers often work by starting at the root of your website (like https://example.com/), and then navigating to each of the links on that page.Using Segment with Ember.jshttps://www.mattlayman.com/blog/2016/ember-segment/Tue, 20 Dec 2016 00:00:00 +0000https://www.mattlayman.com/blog/2016/ember-segment/I’ve been working on College Conductor to help serve Independent Educational Consultants (like this one :) and high school guidance counselors. To find product market fit, I’m using Segment which gets the data I need to decide how to improve the service. In this post, I’ll describe how I connected Segment to College Conductor’s Ember.js frontend.
Working with Segment in Ember can be done with ember-cli-segment, an Ember addon that provides an Ember service to communicate with Segment.Using Brunch for JavaScript workhttps://www.mattlayman.com/blog/2016/brunch/Fri, 02 Sep 2016 00:00:00 +0000https://www.mattlayman.com/blog/2016/brunch/If you want to use JavaScript on a website and avoid the minefield of tools out there, Brunch is a great tool to consider.
Recently, I had the chance to start a greenfield project. Because nothing was set, I ran into the bane of the JavaScript ecosystem: the JavaScript ecosystem. Specifically, I had to decide what tools this project would use.
Not so long ago, a simple project could get away with hacking some code into a single .Reading through the Python standard libraryhttps://www.mattlayman.com/blog/2016/readthrough-python-standard-library/Fri, 29 Jul 2016 00:00:00 +0000https://www.mattlayman.com/blog/2016/readthrough-python-standard-library/A couple of years ago I decided to read the entire Python standard library. A few months back, I finished.
What I learned is this: while there is some interesting “hidden” stuff in there, you don’t need to do this to become proficient.
Did you know that nearly all the HTTP status codes are in the standard library? Judging by all the Python packages that defined their own status codes, I assumed that the codes weren’t in there.Ship your requirements.txthttps://www.mattlayman.com/blog/2016/ship-your-requirements/Fri, 01 Jul 2016 00:00:00 +0000https://www.mattlayman.com/blog/2016/ship-your-requirements/Dependencies: they’re always changing.
Software is in such continuous flux. With this stream of change, maintainers can take a helpful step to inform users of dependency versions at the time of a release. By including a requirements.txt in a release, a maintainer can notify users of the state of the world when the package was released.
Python packages (or “distributions” if you want to use the official term) set dependencies in the setup.We're all ambidextroushttps://www.mattlayman.com/blog/2015/ambidextrous/Wed, 30 Dec 2015 00:00:00 +0000https://www.mattlayman.com/blog/2015/ambidextrous/Your brain is far more elastic than you give it credit for.
A few years ago, my dentist told me that I was damaging my gums by brushing too hard. He advised me to switch hands when I brushed my teeth. Valuing my teeth and my health, I began to use my other hand. It was awkward. It was challenging. And it worked to prevent me from trying too hard… for a while.dotfiles: Hone your software toolshttps://www.mattlayman.com/blog/2015/dotfiles/Thu, 22 Oct 2015 00:00:00 +0000https://www.mattlayman.com/blog/2015/dotfiles/My dad taught me that if I took care of my tools, they would serve me well and last a lifetime. Software tools are no different. If you give them attention, they will serve you well.
Our primary tools as software craftspeople are text editors, shells, and version control systems. These tools are refined via dotfiles. dotfiles are those files and directories on your computer that often begin with a .Highlighting new file formats with Pygmentshttps://www.mattlayman.com/blog/2015/pygments-lexer/Thu, 03 Sep 2015 00:00:00 +0000https://www.mattlayman.com/blog/2015/pygments-lexer/I want pretty documentation for my tappy project, and syntax highlighting code samples helps make software documentation pretty. For tappy, code samples can include Python or Test Anything Protocol (TAP) output. Unfortunately, the syntax highlighter for tappy’s documentation, Pygments, did not know how to highlight TAP. That smelled like a fun project to me.
If you read the Pygments documentation, eventually you’ll learn that adding a new filetype means writing a new lexer.Extending handroll for funhttps://www.mattlayman.com/blog/2015/extending-handroll/Thu, 30 Jul 2015 00:00:00 +0000https://www.mattlayman.com/blog/2015/extending-handroll/I released handroll 2.0 with a shiny new extension interface. This post will make a new extension from soup to nuts to demonstrate the ease of such a task. We’ll call it the ObnoxiousExtension. Our extension will make some noise on the console.
Let’s start with the code. Download the extension to play with it yourself.
from handroll.extensions.base import Extension class ObnoxiousExtension(Extension): handle_pre_composition = True handle_frontmatter_loaded = True handle_post_composition = True def on_pre_composition(self, director): print 'Let\'s get this party started!Oh, my shell? Oh My Zshhttps://www.mattlayman.com/blog/2015/oh-my-zsh/Thu, 28 May 2015 00:00:00 +0000https://www.mattlayman.com/blog/2015/oh-my-zsh/Do you ever think about what program is running your terminal? For a long time, I knew the answer for most Linux / OS X systems was bash, a shell program. But what else is available?
Aside from the occasional script, I didn’t pay much attention to bash. bash helped me get around my computer and autocomplete stuff, and that felt like enough. This was profoundly shortsighted.
Heavy command line users should think about their shell.Inject JavaScript with PhantomJS to inspect websiteshttps://www.mattlayman.com/blog/2015/phantomjs/Tue, 24 Mar 2015 00:00:00 +0000https://www.mattlayman.com/blog/2015/phantomjs/How can you inspect the source of a website with a script? You can download the page, parse it with a library like lxml, and extract what you’re looking for. But what if the page is mostly made from JavaScript? There may not be much HTML to parse. Most of the page might be generated on the DOM dynamically. If this is the kind of page that you want to scan, a tool like lxml will not help much.Connect Python objects to blinker signalshttps://www.mattlayman.com/blog/2015/blinker/Wed, 18 Mar 2015 00:00:00 +0000https://www.mattlayman.com/blog/2015/blinker/I started using blinker for handroll. Blinker is a signal generation library for broadcasting events. The library lets signalers send messages to connected receiver functions. I will explain how I convinced Blinker to talk to objects instead of pure Python functions.
The example code is going to handle a “frobnicated” signal. Remember, the signal itself is not very important.
import blinker frobnicated = blinker.signal('frobnicated') frobnicated is a named signal. In a real project, you might put all your signals in a single module.Toying with Statsd and Graphitehttps://www.mattlayman.com/blog/2015/statsd-graphite/Sun, 01 Mar 2015 00:00:00 +0000https://www.mattlayman.com/blog/2015/statsd-graphite/The graphing bug bit me.
I am currently enjoying the backlog of the Giant Robots podcast. One of the subjects that Giant Robots often covers is measuring user behavior. You can only know what your users want if you a) talk to them or b) observe them. There are many services for observing users like New Relic, Google Analytics, or Mixpanel that offer a lot of value, but this post is about going your own way with Statsd and Graphite.A complete guide to i18n in Pythonhttps://www.mattlayman.com/blog/2015/i18n/Mon, 23 Feb 2015 00:00:00 +0000https://www.mattlayman.com/blog/2015/i18n/This is a start to finish guide showing how to do internationalization (i18n) for a Python application. When I added i18n to handroll, I struggled to find clear advice for supporting other languages. This is one opinionated view explaining how I got there.
Table of Contents:
Marking strings Extracting the master list Getting translations for other languages Packaging it together Testing out the package Questions? Leer este articulo en Español. Overview To internationalize code, you have to treat user text strings in a certain way.A "simple" D3.js area charthttps://www.mattlayman.com/blog/2015/d3js-area-chart/Sat, 24 Jan 2015 00:00:00 +0000https://www.mattlayman.com/blog/2015/d3js-area-chart/Let’s take:
XY 010 115 235 320 And make:
D3.js is mindbending, and I find the examples on the D3.js wiki to be too little explanation with too much going on. In this example, I will show you how to make the simplest area chart I could devise. If you want to jump straight to “the answer,” see the complete JavaScript.
D3.js is not a chart library. It is a chart parts library.Laziness is motivatinghttps://www.mattlayman.com/blog/2014/laziness/Tue, 01 Jul 2014 00:00:00 +0000https://www.mattlayman.com/blog/2014/laziness/Laziness: The quality that makes you go to great effort to reduce overall energy expenditure. It makes you write labor-saving programs that other people will find useful and document what you wrote so you don’t have to answer so many questions about it.
Larry Wall, creator of Perl
Aside from rockin’ an awesome ‘stache, I have a good level of respect for Perl’s first author. The language he created is totally pragmatic and probably holds the Internet together.handroll 1.1 releasedhttps://www.mattlayman.com/blog/2014/handroll-1-1-released/Sun, 01 Jun 2014 00:00:00 +0000https://www.mattlayman.com/blog/2014/handroll-1-1-released/I have released the 1.1 version of my static website generator. This version contains quite a few new features which are documented in the release history. Essentially, the 1.1 release adds the level of polish that users should probably expect from a product.
The features included in this releases were driven by what I actually needed for this website. This includes code highlighting, file skipping, and handling for non-ASCII characters (thanks ØMQ book!handroll: a simple website generatorhttps://www.mattlayman.com/blog/2014/handroll-website-generator/Sun, 04 May 2014 00:00:00 +0000https://www.mattlayman.com/blog/2014/handroll-website-generator/Simplicity. That was my goal after studying DHH's personal website. I wanted a simple website that had all the feeling of something handcrafted, but I didn’t want to write all my HTML by hand. I looked at the website generators out there like Pelican (which is pretty great if you want blogging software), but they didn’t fit my use case. I wanted complete control. Is that too much to ask? No.tappity tap TAP tappyhttps://www.mattlayman.com/blog/2014/tappy/Mon, 17 Mar 2014 00:00:00 +0000https://www.mattlayman.com/blog/2014/tappy/I am pleased to announce a new Python project aimed to bridge Python to broader testing areas. The new project is called tappy and its goal is to generate test information in the Test Anything Protocol (TAP).
tappy converts Python unitest.TestCase based results into TAP results with either a TAPTestRunner that behaves just like the standard library TextTestRunner or with a nose plugin.
tappy popped into existence because I work in a very heterogeneous programming environment at work.Advanced Railshttps://www.mattlayman.com/blog/2014/advanced-rails/Sun, 23 Feb 2014 00:00:00 +0000https://www.mattlayman.com/blog/2014/advanced-rails/Technology books are more like milk than wine. They don’t get better with age. Brad Ediger’s Advanced Rails is fairly well written and provides lots of details, but much of the information is outdated. Ruby on Rails has changed. The plugin ecosystem of Ruby gems has changed. Even the underlying Ruby language has changed.
Ediger used detailed examples to explain advanced Ruby on Rails concepts. Oh, did I mention they were detailed?Patterns of Enterprise Application Architecturehttps://www.mattlayman.com/blog/2014/patterns-of-enterprise-application-architecture/Tue, 14 Jan 2014 00:00:00 +0000https://www.mattlayman.com/blog/2014/patterns-of-enterprise-application-architecture/Active Record. Unit of Work. You may have heard of these before. They are software patterns adopted by popular projects like Ruby on Rails or SQLAlchemy. These popular patterns are described in Martin Fowler’s Patterns of Enterprise Application Architecture book.
Two-Step View. Table Module. Transform View. There is a good chance you’ve never heard of these software patterns, but they are also in Fowler’s book.
Good patterns and not-so-good patterns is my theme for this book.Test your packaginghttps://www.mattlayman.com/blog/2013/test-your-packaging/Sun, 15 Dec 2013 00:00:00 +0000https://www.mattlayman.com/blog/2013/test-your-packaging/Software development is a process rife with errors. We generally call them bugs, but that’s so developers don’t feel as bad for messing up. It’s much easier to say “oh, that’s just a bug” instead of “oh, that’s an error.”
I made an error not too long ago. In fact, it was an egregious one. The software that I released for MarkWiki had broken packaging. This means it was completely broken for anyone who attempted to install it.MarkWiki 1.3 releasedhttps://www.mattlayman.com/blog/2013/markwiki-1-3-released/Sun, 08 Dec 2013 00:00:00 +0000https://www.mattlayman.com/blog/2013/markwiki-1-3-released/MarkWiki 1.3 is now packaged and uploaded to PyPI. This release includes two notable features.
MarkWiki now has a built-in search engine. All wiki pages are indexed by the search engine whenever pages are added, modified, or deleted. This should be a big boon to finding relevant information. The new search engine is powered by Whoosh, a pure Python search tool, so there is no need to install search tools from other languages.Ruby on Rails Tutorialhttps://www.mattlayman.com/blog/2013/ruby-on-rails-tutorial/Sat, 07 Dec 2013 00:00:00 +0000https://www.mattlayman.com/blog/2013/ruby-on-rails-tutorial/If you don’t know Ruby on Rails (RoR), this book will help you learn how to develop a Rails web application.
I have read many tutorial books that are just terrible. Those books have massive amounts of useless code with little explanation of what is going on. Those authors aim for high page count so that the dead tree version can be thicker to justify the high cost in a book store.Dreaming in codehttps://www.mattlayman.com/blog/2013/dreaming-in-code/Fri, 08 Nov 2013 00:00:00 +0000https://www.mattlayman.com/blog/2013/dreaming-in-code/Until a couple of months ago, Chandler was just a character from Friends for me. I had never heard of an open source project called Chandler or the type of product that Chandler was trying to be: a Personal Information Manager. But Dreaming in Code exposed me to the world of open source that was happening circa 2002. And now that I know what that world was like, let’s just say I’m glad it’s 2013.MarkWiki 1.2 released... now actually somewhat usefulhttps://www.mattlayman.com/blog/2013/markwiki-1-2-released/Sun, 03 Nov 2013 00:00:00 +0000https://www.mattlayman.com/blog/2013/markwiki-1-2-released/My pet project, MarkWiki, has reached a point of maturity where other people may actually be interested in using it. I started writing MarkWiki back in May as a way to keep my Python skills sharp, but it appears to be a capable tool now.
MarkWiki is a wiki that uses the Markdown plain text formatting language. Markdown let’s you do things in plain text like adding * to a word like *boom* to italicize it.Java: a bad choice for FOSShttps://www.mattlayman.com/blog/2013/java-a-bad-choice-for-foss/Mon, 14 Oct 2013 00:00:00 +0000https://www.mattlayman.com/blog/2013/java-a-bad-choice-for-foss/805MB. That’s how much I had to download before I could even attempt to contribute to an open source Java project.
Here’s what I needed to get started: 197MB for Eclipse, 130MB for the JDK, 6MB for Maven, 259MB for the dependencies (i.e. Maven’s .m2 directory), and 213MB for a bloated Git repo. Then I lost track when I started downloading additional Eclipse plugins.
This. Is. Ridiculous.
I wish this was the only time I’d experienced such nonsense.ØMQ: A dynamic book with surpriseshttps://www.mattlayman.com/blog/2013/zeromq/Thu, 26 Sep 2013 00:00:00 +0000https://www.mattlayman.com/blog/2013/zeromq/Last week I finished reading the ZeroMQ book. I was expecting the usual drill: talk about why technology is awesome, introduce API of technology, show basic examples of technology, and show advanced examples of technology.
The ZeroMQ book does cover all the usual subjects, but it really impressed because it went way beyond that standard expectation. I finished the book and was very satisfied for two reasons:
The ZeroMQ technology is truly awesome.Office Zenhttps://www.mattlayman.com/blog/2013/office-zen/Tue, 17 Sep 2013 00:00:00 +0000https://www.mattlayman.com/blog/2013/office-zen/For developers who need to get things done, the work environment is often a frustrating place. Many workers experience constant interruption from meetings, coworkers, telephone calls, email alerts, IM pop-up windows, etc. These interruptions prevent developers from doing real work. After finishing Peopleware, I feel that I have observed the potential for Zen in office life.
DeMarco and Lister break down in detail why so many office environments suck. From my point of view, the environment encompasses people, relationships, physical space, and culture.When you're feeling all TAPped outhttps://www.mattlayman.com/blog/2013/all-tapped-out/Wed, 04 Sep 2013 00:00:00 +0000https://www.mattlayman.com/blog/2013/all-tapped-out/Good software practices say you should do automated testing, but what do you do when you work in an environment that can’t get good test tools? Use a simple testing protocol like TAP.
TAP is the Test Anything Protocol. The protocol is so simple that you could probably write code to make TAP output in minutes. It is a line based protocol which means that any language that has some sort of print method can generate TAP.A Layman's walk through Codehttps://www.mattlayman.com/blog/2013/a-laymans-walk-through-code/Thu, 29 Aug 2013 00:00:00 +0000https://www.mattlayman.com/blog/2013/a-laymans-walk-through-code/I went to a university for four years to learn how a computer works from power plug to screen. Code: The Hidden Language of Computer Hardware and Software teaches much of what I learned at school.
In Code, Charles Petzold gives readers an excellent history lesson that explains how a computer works. He assumes you know nothing about the internals of a computer and builds you up with the fundamental concepts.Should you cp from copywriters?https://www.mattlayman.com/blog/2013/should-you-cp-from-copywriters/Mon, 19 Aug 2013 00:00:00 +0000https://www.mattlayman.com/blog/2013/should-you-cp-from-copywriters/Spend any time on the Internet looking at software information and you will find bad writing. Many software developers fail to write well. Or interestingly. Or persuasively. What should we do as a software community? Simple. Learn from those who write for a living.
My family gave quite a few puzzled looks when I got my copy of the The Copywriter’s Handbook for Christmas. This was not one of my typical “nerd books” so it was easy to understand the curious expressions.It's fun -> ok!https://www.mattlayman.com/blog/2013/its-fun-ok/Mon, 05 Aug 2013 00:00:00 +0000https://www.mattlayman.com/blog/2013/its-fun-ok/As a programming book junky, I love seeing fun stuff because even my odd taste in literature can be curbed by material that is super dry.
I stumbled upon “learn you some Erlang for great good!” (lysefgg) after doing research on what resources were available for understanding the popular functional language. Even though I’m still in the middle of the book, the author has done a great job so far of explaining Erlang and why Erlang’s features are so cool.New website and serverhttps://www.mattlayman.com/blog/2010/new-website/Mon, 06 Sep 2010 00:00:00 +0000https://www.mattlayman.com/blog/2010/new-website/I just spent a lot of time setting up a website at http://matthewlayman.dyndns.org and, wow, it was a lot of work. If you ever want to learn a lot in a short amount of time, try starting a local webserver on your home network. I learned about Apache, web hosting, DDNS, DMZ, port forwarding, lynx, Planet!, Google Picasa’s data API, jQuery, and DynDNS.
The site is running on an ancient desktop from 2002, but it’s only serving a static HTML page that has some dynamic content to load stuff from elsewhere on the Internet.Java, Eclipse, and Maven altogetherhttps://www.mattlayman.com/blog/2010/java-eclipse-maven/Sun, 07 Feb 2010 00:00:00 +0000https://www.mattlayman.com/blog/2010/java-eclipse-maven/I’ve never really spent time with Java. My experience with the language was limited to examining Java code in books on design patterns. I am now taking a class at Johns Hopkins University that uses Java, so it was time for me to learn how to work with the language. This post describes my initial experience with the Java environment and points a new user to some good tools that are used by “enterprise” Java developers.Pretty Perl and maintainabilityhttps://www.mattlayman.com/blog/2010/pretty-perl/Sat, 30 Jan 2010 00:00:00 +0000https://www.mattlayman.com/blog/2010/pretty-perl/I have a soft spot in my heart for Perl. It was the first language that I made any serious use of as a professional software developer. I’ve learned a lot from Perl and about Perl, and I know that the language has a reputation for being ugly. So how does a developer transform an “ugly” language into something special and possibly even “pretty?”
In the Perl community, the proposed question might be met with reactions of “TIMTOWTDI!JavaScript has “Good Parts”!? Yes, it does.https://www.mattlayman.com/blog/2010/javascript-good-parts/Sat, 16 Jan 2010 00:00:00 +0000https://www.mattlayman.com/blog/2010/javascript-good-parts/I used to loathe JavaScript. It was a language that looked ugly, had no obvious structure, and seemed like a toy that web developers would use. Then I read “JavaScript: The Good Parts” by Douglas Crockford and my viewpoint changed for the better. I’ve now seen that JavaScript can still be the hopeless mess that I just described, but it can also be something “beautiful” if done with care.
Crockford is the JavaScript architect over at Yahoo!Perl Testing: A Developer’s Notebookhttps://www.mattlayman.com/blog/2009/perl-testing/Fri, 16 Jan 2009 00:00:00 +0000https://www.mattlayman.com/blog/2009/perl-testing/I just finished reading Perl Testing: A Developer’s Notebook by Ian Langworth and chromatic (yes, one of the authors identifies himself/herself as “chromatic,” presumably for privacy concerns).
All in all, the book was eye opening in understanding the world of testing in Perl. I develop Perl code at work in a culture that does not focus on unit testing, but, equipped with the things that I learned from this book, I am now even more adamant that I will be creating unit tests for all of my future Perl code.Into the rabbit holehttps://www.mattlayman.com/blog/2008/into-the-rabbit-hole/Wed, 31 Dec 2008 00:00:00 +0000https://www.mattlayman.com/blog/2008/into-the-rabbit-hole/This should be educational:
matt@eden:~$ sudo apt-get install perl-doc matt@eden:~$ perldoc perl (and all associated sub-parts).
Then maybe I’ll start hunting around on the CPAN for modules or at least figure out which Perl modules Ubuntu bundles by default.
(Possible alternate title: Becoming a Better Perl Developer)Code cleanup with Pylinthttps://www.mattlayman.com/blog/2008/code-cleanup-with-pylint/Tue, 27 May 2008 00:00:00 +0000https://www.mattlayman.com/blog/2008/code-cleanup-with-pylint/Entertainer is at a coding crossroads. Lauri has done a great job of showing Entertainer as a viable (and beautiful) media center software. However, a portion of this code is more like prototype code than production code (probably since Lauri is fairly new to python like myself). Eventually, this code would become a big maintenance issue. We can either continue to build upon some weak design areas or break things down and refactor into something better.Test Driven Development woeshttps://www.mattlayman.com/blog/2008/test-driven-development-woes/Tue, 01 Apr 2008 00:00:00 +0000https://www.mattlayman.com/blog/2008/test-driven-development-woes/I just finished reading Kent Beck’s Test-Driven Development: By Example, and, while I enjoyed the examples in the first half of the book, I’m disappointed about the lack of discussion on dealing with “legacy” code.
In my short amount of time using Test-Driven Development (TDD), I have seen that it can be a great, confidence building tool; and it has enabled the Entertainer devs to iron out some major issues in the code base (e.print 'Hello World!'https://www.mattlayman.com/blog/2008/hello-world/Thu, 20 Mar 2008 00:00:00 +0000https://www.mattlayman.com/blog/2008/hello-world/This is my first blog post, and since it’s my first post, I’d like to explain the purpose of my blog.
My great adventure into the blogosphere will probably have a distinctive slant toward all things Python. I intend to journal my experience with my involvement on the Entertainer Media Center project. Entertainer is written in Python, a dynamically typed language that I’ve spent some time with over the last couple of months.Abouthttps://www.mattlayman.com/about/Mon, 01 Jan 0001 00:00:00 +0000https://www.mattlayman.com/about/I’m Matt, a software creator. Here are things I do:
Build apps on YouTube I’m regularly streaming on YouTube. On most Thursday nights at 9pm Eastern time, I’m streaming on YouTube to build a Django application. My primary goal is to teach others how to build complex web projects and all the skills that they’ll need to produce something that’s more than a tutorial app.
Want to check it out? I post the streams on YouTube at the Building SaaS with Python and Django playlist.Book Recommendationshttps://www.mattlayman.com/book-recommendations/Mon, 01 Jan 0001 00:00:00 +0000https://www.mattlayman.com/book-recommendations/What books have been most useful in advancing my career? These books.
These are the books that have taught me the most about how to be a better software developer.
I hope that distilling this down to a short list is useful for people that like to read and want to put some quality material under their belts.
The Pragmatic Programmer by David Thomas and Andrew Hunt - This book is definitely the most influential in improving my thinking about software development.Most Popularhttps://www.mattlayman.com/most-popular/Mon, 01 Jan 0001 00:00:00 +0000https://www.mattlayman.com/most-popular/Over the years, I’ve covered a wide variety of topics on my website. This page is my curated view of some of my more popular articles that I’ve created.
Python Python is the topic I write about most often. Here are some articles that people enjoyed:
Consistent Python code with Black explains how to add the Black code formatter to Python projects and teams. The article covers the benefits of Black and walks you through the setup to add Black to editors and continuous integration.Patreon Superheroeshttps://www.mattlayman.com/superheroes/Mon, 01 Jan 0001 00:00:00 +0000https://www.mattlayman.com/superheroes/This page recognizes Patreon supporters who sign up for the Superheroes tier on my Patreon page.
This group of individuals help me make my work possible. I am grateful for their contributions so I can cover costs to host the podcast and cover some of the time that I invest in creating content for the community.
The superheroes include:
Andrew Dailey Dragos C. Rupert Baker - Rupert is building SharedGoals. Ryan Austin Hall of Fame These are the superheroes who helped me in the past:Privacy Policyhttps://www.mattlayman.com/privacy/Mon, 01 Jan 0001 00:00:00 +0000https://www.mattlayman.com/privacy/I have zero interest in collecting information about you or anyone else in the games I produce. So, I don’t.What I Use as a Developerhttps://www.mattlayman.com/uses/Mon, 01 Jan 0001 00:00:00 +0000https://www.mattlayman.com/uses/As a software developer, I use a lot of computer-related gear. This page lists all of my favorite gear that I think is relevant for me and I personally recommend for you.
Hopefully, you find something awesome on this list that you can incorporate into your own setup!
Computer Gear Let’s get right to it. As a software developer, it would be silly for me to start anywhere but the computer stuff that I use to interface with the tech world.