Docker Tutorial #4: Docker Volumes and Networking

In the previous tutorial, we used Docker Compose to run an app with a database. We briefly mentioned volumes and networking. Now let’s understand them properly. These two topics answer two important questions: Volumes: How do I keep data when a container is removed? Networking: How do containers talk to each other? Why Containers Lose Data Containers are designed to be temporary. You can create them, destroy them, and replace them. This is a feature, not a bug — it makes containers predictable and easy to deploy. ...

June 13, 2026 · 9 min

Docker Tutorial #3: Docker Compose — Running Multiple Containers

In the previous tutorial, we learned how to build a Docker image for a single application. But most real applications need more than one service. A web app might need a database. An API might need a cache. A backend might need a message queue. Running each service with docker run and connecting them manually is tedious. Docker Compose solves this. It lets you define all your services in one file and start everything with a single command. ...

June 13, 2026 · 9 min

Docker Tutorial #2: Dockerfile — Building Your Own Images

In the previous tutorial, we ran containers from pre-built images like ubuntu and nginx. That is useful, but in real projects you need to package your own application into an image. That is what a Dockerfile does. A Dockerfile is a text file with instructions that tell Docker how to build an image. Think of it as a recipe — each line is a step. Your First Dockerfile Let’s create a simple Node.js application and package it with Docker. ...

June 13, 2026 · 9 min

Docker Tutorial #1: What is Docker — Containers Explained Simply

You write an app. It works on your computer. You send it to a friend. It does not work on their computer. They have a different operating system, a different version of Python, or missing libraries. This is the classic “it works on my machine” problem. Docker solves it. What Is Docker? Docker is a tool that packages your application and everything it needs into a container. A container includes your code, libraries, system tools, and settings. It runs the same way everywhere — on your laptop, your colleague’s laptop, or a server in the cloud. ...

June 12, 2026 · 9 min

Git Tutorial #5: Advanced Git — Undo Mistakes and Power Features

In the previous tutorial, we learned to work with GitHub and set up CI/CD. Now it is time for the advanced tools. Every developer makes mistakes. You commit the wrong file. You break something and need to find out which commit caused it. You need to grab a single commit from another branch. Git has tools for all of this. In this tutorial, you will learn to undo mistakes, recover lost work, and use power features that save hours of debugging. ...

June 12, 2026 · 9 min

Git Tutorial #4: GitHub Workflow — Collaborating with Others

In the previous tutorial, we learned to merge and rebase branches. But everything happened on your local computer. Real projects involve multiple people working together. This is where GitHub comes in. GitHub is a platform that hosts Git repositories online. It lets you share code, review changes, and automate testing. In this tutorial, you will learn to push code to GitHub, create pull requests, and set up basic CI/CD with GitHub Actions. ...

June 12, 2026 · 9 min

Git Tutorial #3: Merging and Rebasing — Combining Work

In the previous tutorial, we learned to create branches and work on them. But branches are only useful if you can bring the work back together. Git gives you two ways to combine branches: merge and rebase. In this tutorial, you will learn both, understand the difference, and know when to use each one. We will also cover merge conflicts and git stash. What Is Merging? Merging takes two branches and combines them. You switch to the branch you want to update, then merge the other branch into it. ...

June 11, 2026 · 8 min

Git Tutorial #2: Branching — Work on Multiple Things at Once

In the previous tutorial, we learned to create a repository, stage files, and make commits. All our work happened on one branch — main. But what if you want to add a new feature without breaking your working code? What if two people need to work on different things at the same time? This is why branches exist. A branch is a separate line of development. You can make changes on a branch without affecting other branches. When you are done, you merge the changes back. ...

June 11, 2026 · 9 min

Git Tutorial #1: Git Basics — Your First Repository

Every developer uses Git. It does not matter if you write Python, JavaScript, Rust, or Kotlin. Git tracks your code changes, lets you go back to any previous version, and helps you work with other developers. In this tutorial, you will install Git, create your first repository, and make your first commit. By the end, you will understand how Git tracks changes. What Is Git? Git is a version control system. It saves snapshots of your project over time. Each snapshot is called a commit. ...

June 11, 2026 · 9 min

SQL Cheat Sheet 2026 — Queries, JOINs, and Performance

Bookmark this page. Use Ctrl+F (or Cmd+F on Mac) to find what you need. This cheat sheet covers SQL from basic queries to window functions and performance. Try examples at db-fiddle.com. Last updated: March 2026 SELECT Basics SELECT * FROM users; -- all columns SELECT name, email FROM users; -- specific columns SELECT DISTINCT city FROM users; -- unique values SELECT name AS full_name FROM users; -- column alias SELECT * FROM users LIMIT 10; -- first 10 rows SELECT * FROM users LIMIT 10 OFFSET 20; -- rows 21-30 (pagination) WHERE — Filtering Rows SELECT * FROM users WHERE age > 18; SELECT * FROM users WHERE city = 'Berlin'; SELECT * FROM users WHERE age BETWEEN 18 AND 30; SELECT * FROM users WHERE city IN ('Berlin', 'Munich', 'Hamburg'); SELECT * FROM users WHERE name LIKE 'A%'; -- starts with A SELECT * FROM users WHERE name LIKE '%son'; -- ends with son SELECT * FROM users WHERE name LIKE '%alex%'; -- contains alex SELECT * FROM users WHERE email IS NULL; -- null check SELECT * FROM users WHERE email IS NOT NULL; SELECT * FROM users WHERE age > 18 AND city = 'Berlin'; SELECT * FROM users WHERE age > 65 OR age < 18; SELECT * FROM users WHERE NOT city = 'Berlin'; ORDER BY and LIMIT SELECT * FROM users ORDER BY name; -- ascending (default) SELECT * FROM users ORDER BY age DESC; -- descending SELECT * FROM users ORDER BY city, name; -- multiple columns SELECT * FROM users ORDER BY age DESC LIMIT 5; -- top 5 oldest INSERT, UPDATE, DELETE -- Insert one row INSERT INTO users (name, email, age) VALUES ('Alex', 'alex@example.com', 25); -- Insert multiple rows INSERT INTO users (name, email, age) VALUES ('Sam', 'sam@example.com', 30), ('Jordan', 'jordan@example.com', 22); -- Update UPDATE users SET age = 26 WHERE name = 'Alex'; -- Update multiple columns UPDATE users SET city = 'Munich', age = 27 WHERE id = 1; -- Delete DELETE FROM users WHERE id = 5; -- Delete all rows (use with caution!) DELETE FROM users; -- Faster delete all (resets table) TRUNCATE TABLE users; -- UPSERT — insert or update if exists (PostgreSQL) INSERT INTO users (email, name) VALUES ('alex@example.com', 'Alex') ON CONFLICT (email) DO UPDATE SET name = EXCLUDED.name; -- MySQL equivalent INSERT INTO users (email, name) VALUES ('alex@example.com', 'Alex') ON DUPLICATE KEY UPDATE name = VALUES(name); Warning: Always use WHERE with UPDATE and DELETE. Without it, every row is affected. ...

March 21, 2026 · 8 min