Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 26 additions & 1 deletion .eleventy.js
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,14 @@ module.exports = function(eleventyConfig) {
eleventyConfig.addFilter('rewriteIntegrationLinks', (str, integration) => {
if (!str) return str;

// First pass: collect all actual anchor IDs from the HTML
const anchorIds = new Set();
const anchorIdRegex = /id="([^"]+)"/g;
let anchorMatch;
while ((anchorMatch = anchorIdRegex.exec(str)) !== null) {
anchorIds.add(anchorMatch[1]);
}

// Convert relative links in README to absolute links
const matcher = /((href|src)="([^"]*))"/g;
let match;
Expand All @@ -250,8 +258,24 @@ module.exports = function(eleventyConfig) {
return fullMatch;
}

// Skip pure anchors (same-page links)
// Handle same-page anchor links - try to fix broken anchors
if (url.startsWith('#')) {
const targetAnchor = url.substring(1);

// If the anchor doesn't exist, try to find a close match
if (!anchorIds.has(targetAnchor)) {
// Try to find anchors that match if we add periods back
// e.g., "migration-from-012-or-earlier" -> "migration-from-0.1.2-or-earlier"
for (const existingAnchor of anchorIds) {
// Remove all periods from existing anchor and compare
const normalizedExisting = existingAnchor.replace(/\./g, '');
if (normalizedExisting === targetAnchor) {
// Found a match! Use the correct anchor
return `${attr}="#${existingAnchor}"`;
}
}
}

return fullMatch;
}

Expand Down Expand Up @@ -282,6 +306,7 @@ module.exports = function(eleventyConfig) {
return result;
});


eleventyConfig.addFilter('duration', mins => {
if (mins > 60) {
const hrs = Math.floor(mins/60)
Expand Down
3 changes: 2 additions & 1 deletion src/blog/2026/01/opcua-vs-mqtt.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
title: "MQTT vs OPC UA: Why This Question Never Has a Straight Answer"
subtitle: "Why comparing MQTT and OPC UA is a category error, and how to choose based on requirements rather than marketing"
description: "MQTT vs OPC UA isn't a real choice; they solve different problems. Learn when to use each protocol based on your actual requirements, not vendor marketing."
lastUpdated: 2026-01-24
date: 2026-01-21
authors: ["sumit-shinde"]
image: /blog/2026/01/images/opcua-vs-mqtt.png
Expand Down Expand Up @@ -62,7 +63,7 @@ MQTT is deliberately minimal. This simplicity at the transport layer enables its

OPC UA (Unified Architecture) isn't primarily about moving data; it's about describing what data means, how it relates to other data, and what operations are valid.

Released in 2008, OPC UA replaced a fragmented collection of Windows-only industrial protocols with a platform-independent standard. Where MQTT is minimal, OPC UA is comprehensive. The specification spans 14 parts covering everything from information modeling to historical data access to alarm conditions.
Released in 2008, OPC UA replaced a fragmented collection of Windows-only industrial protocols with a platform-independent standard. Where MQTT is minimal, OPC UA is comprehensive. The specification spans 37 parts in the core specification covering everything from information modeling to historical data access to alarm conditions

**At its core is the address space, a hierarchical graph of nodes:**

Expand Down