This is part of my Docker Basics series — introductory guides to help you get started with Docker, learn key concepts, and build your skills step by step.
Part 1: Understanding Container Part 2: Basic Commands Part 3: Dockerfile Part 4: Networks Basic Commands A Dockerfile is essentially a text file with a predetermined structure that contains a set of instructions for building a Docker image. The instructions in the Dockerfile specify what base image to start with (for example, Ubuntu 20.
This is part of my Docker Basics series — introductory guides to help you get started with Docker, learn key concepts, and build your skills step by step.
Part 1: Understanding Container Part 2: Basic Commands Part 3: Dockerfile Part 4: Networks Docker Networking Docker offers four built-in network drivers: none, bridge, host, and overlay.
Bridge (default): Creates an isolated, software-defined network. Containers on the same bridge get private IPs and can communicate with each other, while anything outside can’t reach them unless you explicitly publish ports.
Introduction AI has already changed how we interact with technology. The real shift is happening now with agents: AI systems that can reason, make decisions, and take action.
Unlike a chatbot that passively replies, an agent can break down complex tasks, call APIs or databases, use tools, and deliver structured results. This is what makes the idea of Agentic AI so powerful — it’s not just about conversation, it’s about problem-solving with initiative.
📝 Update (2025-08): This post was originally published in April 2024 and has been updated to reflect changes in Pydantic v2, including the new field validator, model validator, and Annotated-based validation patterns. Also, this post now includes a new section on using Pydantic with MongoDB.
Python’s dynamic typing system is indeed convenient, allowing you to create variables without explicitly declaring their types. While this flexibility can streamline development, it can also introduce unexpected behavior, particularly when handling data from external sources like APIs or user input.
A Lesson from a Naive Binary Search I’ve been grinding hard every day, solving coding problems to get better at algorithms. Recently, I came across something interesting—a naive implementation of binary search can actually cause a bug. It’s a small detail, but it matters.
def binary_search(nums, target): left, right = 0, len(nums) - 1 while left <= right: mid = (left + right) // 2 if nums[mid] == target: return mid elif nums[mid] < target: left = mid + 1 else: right = mid - 1 return -1 It works fine in Python—but I recently learned that the way I calculate mid can cause problems in some cases.
A Minimalist’s Guide to pass— the Unix Password Manager Safely wrangle your secrets from the command-line using GPG encryption and a few intuitive commands.
1. Why pass? Single-purpose & transparent – every secret is just a GPG-encrypted file in ~/.password-store/. Leverages tools you already trust – GnuPG for encryption and standard Unix commands for everything else (grep, git, find, etc.). Portable & scriptable – works the same on any POSIX shell and is easy to automate.