2026-01-21 11:49:19
At first, Docker feels like a magic fix.
Wrap your app in a container, run a few commands, and suddenly everything works.
But as you gain experience, you realize something important:
Docker is not just a tool.
It’s a way of thinking about software.
This article is not a Docker tutorial.
It’s a practical playbook — the kind of lessons you learn only after using Docker in real projects.
The Real Problem Docker Solves
Docker doesn’t exist to impress us with containers and images.
It exists to solve one simple problem:
Consistency.
Same app
Same dependencies
Same behavior
→ everywhere
Laptop.
CI pipeline.
Production server.
When environments behave differently, teams slow down.
Docker removes that friction.
Images vs Containers (Explained Simply)
This confuses almost everyone at the beginning.
Think of it like this:
Docker Image → A packaged recipe
Docker Container → The running dish
You build the image once.
You can run it many times.
Nothing magical — just disciplined packaging.
Docker Is Not About Complexity
One mistake I often see is treating Docker as a reason to over-engineer.
You don’t need:
20 services
Complex networking
Heavy tooling
on day one.
A senior approach is different:
Start simple. Let complexity earn its place.
If a single container works, use one.
If you need multiple services later, Docker makes that transition smoother.
The Hidden Power: Team Productivity
Docker’s biggest win is not technical.
It’s human.
New developer joins → setup in minutes
CI failures reduce
Fewer “works on my machine” discussions
Docker creates a shared contract between developers, QA, and operations.
Everyone runs the same thing.
Docker in Real Projects (What Actually Matters)
After the basics, these things start to matter more:
2026-01-21 11:46:54
How memory leaks happen and how the Mark-and-Sweep algorithm works.
Timothy was staring at the dashboard he was building. It was getting slow. Sluggish.
"I don't understand," he said. "I am just creating objects. I'm not running heavy calculations. Why is the browser freezing?"
Margaret walked to the chalkboard and drew a large rectangle.
"Because you are running out of space, Timothy. This is the Heap."
"The Heap is where JavaScript stores objects, arrays, and functions," Margaret explained. "It is large, but it is not infinite. If you keep allocating memory without freeing it, you exhaust the available space. The browser freezes."
"But I don't free anything," Timothy said. "I just move to the next function."
"You don't have to free memory manually," Margaret corrected. "The Garbage Collector (GC) does it for you. But it follows very strict rules."
Margaret drew a small circle at the top of the board and labeled it Root (Window).
"How does the GC know which objects to keep and which to destroy?" she asked.
"It checks if I'm using them?"
"No," Margaret said. "It checks if they are Reachable."
She drew arrows connecting the Root to various objects.
"This is the Mark-and-Sweep algorithm," she said.
window object and the current Call Stack).Margaret erased a line on the board.
let user = { name: "Timothy" };
// 1. The 'user' variable is a Reference from the Root to the object.
user = null;
// 2. The Reference is broken.
"When you set user = null," Margaret explained, "you didn't delete the object. You just broke the Reference."
"So the object is stranded?" Timothy asked.
"Exactly. The next time the GC runs, it will start at the Root, try to find that object, and fail. Since it is unreachable, the space is reclaimed."
Timothy looked at his slow code. "So if my app is slow, it means I am holding onto objects I don't need?"
"Yes," Margaret said. "You have a Memory Leak. You are accidentally keeping a Reference alive."
She wrote a common trap on the board:
function startDashboard() {
const hugeData = new Array(100000).fill("Data");
// The Trap:
window.addEventListener('resize', () => {
console.log(hugeData.length);
});
}
"Trace the References," Margaret commanded.
Timothy looked at the diagram.
resize).hugeData.hugeData."I see it," Timothy realized. "The Window holds the Listener. The Listener holds the Data."
"Correct," Margaret said. "Even if startDashboard finishes running, that connection remains. The GC sees a clear path from the Root to your massive array. It cannot delete it."
"How do I fix it?" Timothy asked.
"You must break the reference," Margaret said.
She added the cleanup code:
window.removeEventListener('resize', myListener);
"Remove the listener," she said. "The connection breaks. The huge data becomes unreachable. The Garbage Collector sweeps it away, and your browser breathes again."
"Memory management isn't about micromanaging every object," Margaret concluded, wiping the chalk dust from her hands. "It's about understanding the invisible connections that keep data alive. Break the connections you don't need, and let the garbage collector do its job."
Aaron Rose is a software engineer and technology writer at tech-reader.blog and the author of Think Like a Genius.
2026-01-21 11:39:56
I’m currently learning HTML and decided to learn in public by documenting my journey.
This blog is part of my HTML-101 series, where I’m learning HTML step by step from scratch.
This series is not written by an expert — it’s a beginner learning out loud, sharing:
The goal is to build consistency, clarity, and invite discussion.
In this post, I’ll cover:
<a>) and anatomy
target, rel, download, title
All my notes, examples, and practice code live here:
👉 GitHub Repo:
https://github.com/dmz-v-x/html-101
This repo is updated as I continue learning.
A path tells the browser where to find a file (image, page, script, stylesheet).
Examples:
<img src="images/logo.png">
<a href="pages/about.html">About</a>
<link rel="stylesheet" href="css/style.css">
src, href and rel| Attribute | What it means | Loads file? | Used for |
|---|---|---|---|
src |
Source of content | ✅ Yes | Images, JS, media |
href |
Link/reference | ⚠️ Sometimes | Pages, CSS |
rel |
Relationship | ❌ No | Explains purpose |
<a>?
<a> (anchor) creates clickable links.
Basic example:
<a href="https://example.com">Visit Example</a>
href = destination (required for a real link)
If href is missing, <a> is not treated as a link by browsers and assistive tech.
href values
Full web address with protocol:
<a href="https://youtube.com">YouTube</a>
Use when linking to another website or CDN.
Starts from the site root (/):
<a href="/about">About</a>
<img src="/assets/images/logo.png">
Works reliably when the site is hosted at domain root.
Relative to the current file’s folder:
<!-- current file: /project/index.html -->
<a href="pages/about.html">About</a>
<img src="images/logo.png">
Use for files inside the same project.
Jump to an element with a matching id:
<h2 id="projects">Projects</h2>
<a href="#projects">Go to Projects</a>
mailto: (email) and tel: (phone)
Special schemes that launch apps:
<a href="mailto:[email protected]">Email me</a>
<a href="tel:+911234567890">Call me</a>
<a href="URL" target="_blank" rel="noopener noreferrer" title="Tooltip">
Link Text
</a>
href — destination (URL, path, mailto, tel, or fragment)
target — where to open (_self, _blank, _parent, _top)
rel — relationship / security (important with _blank)
noopener prevents the new page from getting window.opener
noreferrer prevents sending the referrer URL
download — suggests downloading the resource instead of navigating
title — tooltip (use sparingly; not always helpful for accessibility)| Attribute | Value(s) | What it does (plain English) | When it comes into play | When to use it | Example |
|---|---|---|---|---|---|
target |
_self |
Opens link in same tab | When link is clicked | Default behavior | <a href="page.html" target="_self"> |
target |
_blank |
Opens link in new tab | When link is clicked | External sites | <a href="https://google.com" target="_blank"> |
target |
_parent |
Opens link in parent frame | Inside iframe | When using iframes | <a href="x.html" target="_parent"> |
target |
_top |
Opens link in full window | Inside nested iframes | Break out of frames | <a href="x.html" target="_top"> |
rel |
noopener |
Blocks access to window.opener
|
With target="_blank"
|
Security | <a target="_blank" rel="noopener"> |
rel |
noreferrer |
Hides referrer info | With external links | Privacy | <a rel="noreferrer"> |
download |
filename (optional) | Forces file download | On click | Download files | <a download> |
title |
text | Shows tooltip on hover | On mouse hover | Extra hint text | <a title="Info"> |
Safe new-tab pattern (always do this):
<a href="https://example.com" target="_blank" rel="noopener noreferrer">
External site
</a>
Browsers provide pseudo-classes for link states:
a:link — unvisited link
a:visited — visited link
a:hover — mouse over
a:active — pressed/clicking
a:focus — focused via keyboard (Tab)Order in CSS: :link, :visited, :hover, :active, :focus (LVHAF).
Basic styling example:
a {
color: #1e90ff;
text-decoration: none; /* remove underline */
}
a:hover {
text-decoration: underline;
}
a:focus {
outline: 3px solid #f59e0b;
outline-offset: 2px;
}
Usability tip: If you remove underline, show a clear hover or focus indicator so users know it’s a link.
Good vs bad:
<!-- Bad -->
<a href="mailto:[email protected]">Click here</a>
<!-- Good -->
<a href="mailto:[email protected]">Email Support</a>
<a> for navigation (go to a new page, external link, fragment).
<button> for actions on the current page (open modal, submit form, toggle UI).Bad pattern:
<a href="#" onclick="submitForm()">Submit</a> <!-- ❌ -->
Better:
<button type="button" onclick="submitForm()">Submit</button> <!-- ✅ -->
download attribute (force download suggestion)
<a href="/files/resume.pdf" download>Download Resume</a>
<a href="/files/resume.pdf" download="Himanshu-Bhatt-Resume.pdf">Download</a>
Browser may still open the file depending on type & user settings, but download suggests saving.
Basic mailto:
<a href="mailto:[email protected]">Email me</a>
Multiple recipients:
<a href="mailto:[email protected],[email protected]">Email both</a>
Add subject and body (URL-encoded):
<a href="mailto:[email protected]?subject=Hello%20from%20site&body=Hi%20there%2C%0A%0AI%20found%20your%20site.">
Email with subject
</a>
%20
%0A or %0D%0A
? for first param, & for othersNote: mailto opens the user’s email client. Not all desktop users have a configured client.
Basic:
<a href="tel:+911234567890">+91 12345 67890</a>
+ + country code) in href.
tel: opens dialer on mobile; desktop behavior varies.Good examples:
<!-- Display friendly, href machine-friendly -->
<a href="tel:+14155552671">+1 (415) 555-2671</a>
<a href="tel:+911234567890">+91 12345 67890</a>
Email Support or Call Support.
aria-label for clarity:
<a href="tel:+911234567890" aria-label="Call support at +91 12345 67890">
+91 12345 67890
</a>
mailto: for forms that require structured data — prefer actual contact forms for reliability and spam protection.rel="noopener noreferrer" with target="_blank".
href="#" — this is an anti-pattern (it changes the URL or scrolls).
mailto: / tel: behavior on mobile vs desktop.When I started, I used links for things that should be buttons and I often forgot rel="noopener noreferrer" for target="_blank".
I also learned that mailto: and tel: work great on mobile but may behave differently on desktop.
If you faced any issues or have questions, feel free to let me know in the comments 🙂
💡 I’d love your feedback!
If you notice:
please comment below. I’m happy to learn and correct mistakes.
If you find these notes useful:
⭐ Consider giving the GitHub repo a star —
it really motivates me to keep learning and sharing publicly.
I share learning updates, notes, and progress regularly.
👉 Follow me on Twitter/X:
In the next post, I’ll be covering:
👉 Internal Page Navigation
I’ll also continue updating the GitHub repo as I progress.
Thanks for reading!
If you’re also learning HTML, feel free to:
📘 Learning in public
📂 Repo: https://github.com/dmz-v-x/html-101
🐦 Twitter/X: https://x.com/_himanshubhatt1
💬 Feedback welcome — please comment if anything feels off
⭐ Star the repo if you find it useful
2026-01-21 11:20:39
The Nautilus DevOps team is strategizing the migration of a portion of their infrastructure to the AWS cloud. Recognizing the scale of this undertaking, they have opted to approach the migration in incremental steps rather than as a single massive transition. To achieve this, they have segmented large tasks into smaller, more manageable units. This granular approach enables the team to execute the migration in gradual phases, ensuring smoother implementation and minimizing disruption to ongoing operations. By breaking down the migration into smaller tasks, the Nautilus DevOps team can systematically progress through each stage, allowing for better control, risk mitigation, and optimization of resources throughout the migration process.
For this task, create an AWS EBS volume using Terraform with the following requirements:
Name of the volume should be nautilus-volume.
Volume type must be gp3.
Volume size must be 2 GiB.
Ensure the volume is created in us-east-1.
The Terraform working directory is /home/bob/terraform. Create the main.tf file (do not create a different .tf file) to accomplish this task.
Note: Right-click under the EXPLORER section in VS Code and select Open in Integrated Terminal to launch the terminal.
Create main.tf
# main.tf
# Get the default VPC in us-east-1
data "aws_vpc" "default" {
default = true
}
# Get availability zones in us-east-1
data "aws_availability_zones" "available" {
state = "available"
}
# Create EBS volume
resource "aws_ebs_volume" "nautilus_volume" {
availability_zone = data.aws_availability_zones.available.names[0]
size = 2
type = "gp3"
tags = {
Name = "nautilus-volume"
}
}
To deploy this configuration:
Navigate to the Terraform directory:
cd /home/bob/terraform
Initialize Terraform:
terraform init
Output
bob@iac-server ~/terraform via 💠 default ➜ terraform init
Initializing the backend...
Initializing provider plugins...
- Finding hashicorp/aws versions matching "5.91.0"...
- Installing hashicorp/aws v5.91.0...
- Installed hashicorp/aws v5.91.0 (signed by HashiCorp)
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
Plan the deployment to verify the configuration:
terraform plan
Output
bob@iac-server ~/terraform via 💠 default ➜ terraform plan
data.aws_vpc.default: Reading...
data.aws_availability_zones.available: Reading...
data.aws_availability_zones.available: Read complete after 2s [id=us-east-1]
data.aws_vpc.default: Read complete after 2s [id=vpc-cef5c033f2482a228]
Terraform used the selected providers to generate the following execution plan. Resource
actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# aws_ebs_volume.nautilus_volume will be created
+ resource "aws_ebs_volume" "nautilus_volume" {
+ arn = (known after apply)
+ availability_zone = "us-east-1a"
+ encrypted = (known after apply)
+ final_snapshot = false
+ id = (known after apply)
+ iops = (known after apply)
+ kms_key_id = (known after apply)
+ size = 2
+ snapshot_id = (known after apply)
+ tags = {
+ "Name" = "nautilus-volume"
}
+ tags_all = {
+ "Name" = "nautilus-volume"
}
+ throughput = (known after apply)
+ type = "gp3"
}
Plan: 1 to add, 0 to change, 0 to destroy.
─────────────────────────────────────────────────────────────────────────────────────────
Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to
take exactly these actions if you run "terraform apply" now.
Apply the configuration:
terraform apply
Then type yes when prompted to confirm the creation of the EBS volume.
Output
bob@iac-server ~/terraform via 💠 default ➜ terraform apply
data.aws_availability_zones.available: Reading...
data.aws_vpc.default: Reading...
data.aws_availability_zones.available: Read complete after 0s [id=us-east-1]
data.aws_vpc.default: Read complete after 0s [id=vpc-cef5c033f2482a228]
Terraform used the selected providers to generate the following execution plan. Resource
actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# aws_ebs_volume.nautilus_volume will be created
+ resource "aws_ebs_volume" "nautilus_volume" {
+ arn = (known after apply)
+ availability_zone = "us-east-1a"
+ encrypted = (known after apply)
+ final_snapshot = false
+ id = (known after apply)
+ iops = (known after apply)
+ kms_key_id = (known after apply)
+ size = 2
+ snapshot_id = (known after apply)
+ tags = {
+ "Name" = "nautilus-volume"
}
+ tags_all = {
+ "Name" = "nautilus-volume"
}
+ throughput = (known after apply)
+ type = "gp3"
}
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
aws_ebs_volume.nautilus_volume: Creating...
aws_ebs_volume.nautilus_volume: Still creating... [10s elapsed]
aws_ebs_volume.nautilus_volume: Creation complete after 10s [id=vol-3e6e15fb552e10e08]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
2026-01-21 11:14:39
Let me guess.
Last week, you finally understood something.
It clicked.
You felt smart. Dangerous, even.
Then this week… you opened your editor and thought:
“Wait. Why does none of this look familiar?”
Congratulations. You’re not broken.
You’re officially learning to code.
Somewhere along the way, we’re made to believe that learning to code works like this:
Learn something → remember it forever → move on.
That might work for memorizing song lyrics.
It does not work for programming.
If forgetting code was a sign you’re bad at it, there would be approximately zero developers left on Earth.
This was a hard pill for me to swallow.
I used to think:
“If I forget this, it means I didn’t really learn it.”
No. It means your brain is doing what brains do.
Code isn’t facts.
It’s patterns, logic, and decisions.
If you don’t use it, your brain quietly says:
“Wow. Not important. Deleting.”
Ruthless. Efficient. Slightly rude.
Tutorials are great… until they aren’t.
When you follow along:
Your brain is basically on passenger mode.
So when the tutorial ends and you try to build something alone, your brain panics:
“Wait, we were just watching. Why are we driving now?”
That’s why everything disappears.
This part changed how I see learning.
Forgetting usually means:
The things you remember best are the ones that:
Pain = memory.
Sadly.
I remember opening a project and realizing I couldn’t remember how I did something I literally wrote.
Past me had betrayed present me.
Instead of panicking, I tried something new:
I reread my own code.
And suddenly it came back.
Not because I memorized it, but because I understood why it existed.
That’s when I realized:
The goal isn’t to remember code.
The goal is to remember how to figure it out again.
Here’s a secret.
Good developers don’t remember:
They remember:
They Google. Constantly. Confidently. Shamelessly.
Here’s what actually helps:
1. Build Something Small After Learning
Even a tiny thing.
Especially a tiny thing.
Your brain remembers decisions, not explanations.
2. Revisit Old Code (Yes, It’s Ugly)
Reading your past code feels like reading old diary entries.
Cringe.
But powerful.
3. Explain It to an Imaginary Person
If you can explain it without code, you understand it.
If you can’t, that’s okay! Now you know what to revisit.
Now, when I forget something, I don’t think:
“I’m bad at this.”
I think:
“Okay. I’ve seen this before. Let’s reconnect the dots.”
Learning to code is not about building a perfect memory.
It’s about building familiarity.
And familiarity comes back faster every time.
Final Thought
If you’re forgetting code you learned last week, you’re not behind.
You’re not stupid.
You’re not failing.
You’re just doing something hard, and doing it honestly.
And that’s exactly how real developers are made.
If this article felt a little too real, you’re my people.
What’s the last thing you forgot that made you question everything? 😄
2026-01-21 11:03:12
A new version of YAKMESH - the post-quantum secure P2P mesh network - has been published!
YAKMESH is a high-resiliency, decentralized networking layer with:
npm install [email protected]
Built with quantum principles. Secured by math.