Kotlin Tutorial #8: Collections — List, Set, Map, and Operations

In the previous tutorial, you learned about classes. Now let’s learn about collections — one of the most important topics in Kotlin. You will use collections in almost every program you write. Kotlin’s collections are powerful and expressive. You can filter, transform, group, and combine data with just a few lines of code. In this tutorial, you will learn: List, MutableList, Set, and Map filter, map, flatMap groupBy, sortedBy reduce and fold zip and associate Chaining operations together List A List is an ordered collection. listOf creates a read-only list. mutableListOf creates a list you can change. ...

March 22, 2026 · 8 min

Multi-Agent AI Systems: How Teams of AI Agents Build Software Together

One AI agent is powerful. But what if you had a team of AI agents — each specialized in a different job — working together on the same project? That is what multi-agent AI systems do. And they are changing how software gets built in 2026. What is a Multi-Agent System? Instead of one AI assistant that does everything, a multi-agent system splits the work between specialized agents: ┌──────────────┐ │ Architect │ Plans the solution, defines the structure └──────┬───────┘ ↓ ┌──────────────┐ ┌──────────────┐ │ Backend Dev │ │ Frontend Dev │ Build code in parallel └──────┬───────┘ └──────┬───────┘ ↓ ↓ ┌──────────────────────────────────┐ │ QA / Testing │ Runs tests, reports bugs └──────────────────────────────────┘ Each agent has: ...

March 21, 2026 · 8 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

Jetpack Compose Tutorial #8: Navigation — Moving Between Screens

Welcome to Part 2 of the series. You can now build beautiful single-screen apps. But real apps have many screens — a home screen, a detail screen, a settings screen, a profile screen. Navigation is how you move between them. In this tutorial, you will learn everything about Compose navigation: Setting up navigation Creating screens and routes Type-safe navigation with Kotlin Serialization Passing data between screens Bottom navigation bar Nested navigation graphs Back stack management Best practices This is a long tutorial. Take your time. ...

March 20, 2026 · 11 min

MCP Explained: What is Model Context Protocol and Why Every Developer Should Know It

Every AI coding tool has the same problem: it can read your code, but it can’t access your database. It can’t check your Jira tickets. It can’t read your Slack messages. It can’t query your production logs. Until now. MCP (Model Context Protocol) is a new standard that lets AI tools connect to anything — databases, APIs, file systems, project management tools, and more. It is like a USB-C port for AI. One standard connection that works with everything. ...

March 20, 2026 · 7 min

Docker Cheat Sheet 2026 — Commands, Dockerfile, and Compose

Bookmark this page. Use Ctrl+F (or Cmd+F on Mac) to find what you need. This cheat sheet covers Docker CLI commands, Dockerfile instructions, Docker Compose, volumes, networking, and production tips. Last updated: March 2026 How Docker Works ┌──────────────┐ docker build ┌──────────┐ docker run ┌────────────┐ │ Dockerfile │ ───────────────► │ Image │ ─────────────► │ Container │ │ (recipe) │ │ (template)│ │ (running) │ └──────────────┘ └──────────┘ └────────────┘ │ docker push │ ┌────▼───────┐ │ Registry │ │ (Docker Hub)│ └────────────┘ Container Commands Command Description docker run <image> Create and start a container docker run -d <image> Run in background (detached) docker run -it <image> bash Run interactively with shell (sh for Alpine) docker run -p 8080:80 <image> Map host port 8080 to container port 80 docker run --name myapp <image> Run with a custom name docker run --rm <image> Automatically remove container when it stops docker run -e KEY=value <image> Set environment variable docker run -v /host:/container <image> Mount a volume docker ps List running containers docker ps -a List all containers (including stopped) docker stop <container> Stop a running container docker start <container> Start a stopped container docker restart <container> Restart a container docker rm <container> Remove a stopped container docker rm -f <container> Force remove (even if running) docker exec -it <container> bash Open a shell inside a running container docker logs <container> View container logs docker logs -f <container> Follow logs in real-time docker inspect <container> Show detailed container info (JSON) docker stats Live resource usage for all containers docker cp <container>:/path ./local Copy file from container to host docker cp ./local <container>:/path Copy file from host to container docker container prune Remove all stopped containers docker kill <container> Force stop a container (SIGKILL) Image Commands Command Description docker images List all local images docker pull <image> Download an image from registry docker push <image> Upload an image to registry docker build -t myapp . Build image from Dockerfile in current dir docker build -t myapp:v1 . Build with a tag/version docker tag <image> <new-tag> Add a tag to an image docker rmi <image> Remove an image docker image prune Remove unused (dangling) images docker system prune -a Remove all unused images, containers, networks (not volumes) docker system prune -a --volumes Remove everything including volumes docker history <image> Show image layers and sizes docker login Log in to Docker Hub (required before push) docker logout Log out from registry docker save -o image.tar <image> Export image to tar file docker load -i image.tar Import image from tar file Dockerfile Reference # Base image FROM node:20-alpine # Set working directory WORKDIR /app # Copy dependency files first (for caching) COPY package.json package-lock.json ./ # Install dependencies RUN npm ci --production # Copy application code COPY . . # Expose a port (documentation only) EXPOSE 3000 # Default command when container starts CMD ["node", "server.js"] Dockerfile Instructions Instruction Description FROM <image> Base image (required, must be first) WORKDIR /app Set working directory for subsequent commands COPY <src> <dest> Copy files from host to image ADD <src> <dest> Like COPY but can extract tar and fetch URLs RUN <command> Execute command during build (creates a layer) ENV KEY=value Set environment variable ARG KEY=value Build-time variable (not available at runtime) EXPOSE <port> Document which port the app listens on CMD ["executable", "arg"] Default command (can be overridden) ENTRYPOINT ["executable"] Fixed command (CMD becomes arguments) VOLUME /data Create a mount point for persistent data USER <username> Switch to non-root user `HEALTHCHECK CMD curl -f http://localhost/ CMD vs ENTRYPOINT # CMD — default command, can be overridden CMD ["python", "app.py"] # docker run myapp → runs python app.py # docker run myapp bash → runs bash (overrides CMD) # ENTRYPOINT — fixed command, CMD becomes arguments ENTRYPOINT ["python"] CMD ["app.py"] # docker run myapp → runs python app.py # docker run myapp test.py → runs python test.py Multi-Stage Build # Stage 1: Build FROM node:20-alpine AS builder WORKDIR /app COPY package.json ./ RUN npm ci COPY . . RUN npm run build # Stage 2: Production (smaller image) FROM nginx:alpine COPY --from=builder /app/dist /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] Multi-stage builds produce smaller images — the final image only contains the production output, not the build tools. ...

March 19, 2026 · 6 min

Jetpack Compose Tutorial #7: Material 3 Theming — Colors, Typography, and Dark Mode

Your app works. But it looks like every other default Compose app — same purple, same fonts, same everything. Theming is how you make your app look like YOUR app. Custom colors, custom fonts, dark mode support — all in one system that applies everywhere automatically. Material 3 (also called Material You) is the design system Google built for modern Android apps. Compose uses it by default. In this tutorial, you will learn how to customize it. ...

March 19, 2026 · 8 min

Kotlin Tutorial #1: What is Kotlin? A Simple Guide for Developers

Kotlin is a modern programming language that runs on the Java Virtual Machine (JVM). Google made it the official language for Android development in 2019. But Kotlin is not just for Android. You can use it for backend servers, desktop apps, and even web development. In this tutorial, you will learn what Kotlin is, where it is used, and why so many developers prefer it over Java. You will also write your first Kotlin code. ...

March 19, 2026 · 7 min

Kotlin Tutorial #11: Scope Functions — let, run, with, apply, also

In the previous tutorial, you learned about extension functions. Now let’s learn about scope functions. Kotlin has five scope functions: let, run, with, apply, and also. They execute a block of code on an object and differ in how they refer to the object and what they return. These functions are used everywhere in Kotlin code. Understanding them will make your code cleaner and more readable. ...

March 19, 2026 · 9 min

Kotlin Tutorial #17: Coroutines — launch, async, and Structured Concurrency

In the previous tutorial, you learned about sequences. Now let’s learn about coroutines. Coroutines are Kotlin’s way of writing asynchronous code. They let you write code that looks synchronous but runs without blocking threads. In this tutorial, you will learn: Suspend functions launch — fire and forget async/await — get a result Dispatchers coroutineScope Structured concurrency Jobs and cancellation Timeouts Practical examples What Are Coroutines? A coroutine is a lightweight thread. You can run thousands of coroutines on a single thread. Unlike threads, coroutines are cheap to create and do not block the operating system thread they run on. ...

March 19, 2026 · 9 min