<!doctype html><html lang=en><head><meta name=generator content="Hugo 0.123.7"><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="Personal blog about technology, photography, and writing"><title>within specifications</title>
<meta property="og:title" content="within specifications"><meta property="og:description" content="Personal blog about technology, photography, and writing"><meta property="og:type" content="website"><meta property="og:url" content="https://www.andmarios.com/"><meta property="og:site_name" content="within specifications"><meta name=twitter:card content="summary"><meta name=twitter:title content="within specifications"><meta name=twitter:description content="Personal blog about technology, photography, and writing"><link rel=canonical href=https://www.andmarios.com/><link rel=alternate hreflang=el href=https://www.andmarios.com/el/><link rel=alternate type=application/rss+xml href=https://www.andmarios.com/index.xml title="within specifications"><link rel=preconnect href=https://fonts.googleapis.com><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link href="https://fonts.googleapis.com/css2?family=Spectral:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500&family=Literata:ital,opsz,wght@0,7..72,200..900;1,7..72,200..900&family=IBM+Plex+Mono:ital,wght@0,400;0,500;1,400&display=swap" rel=stylesheet><link rel=icon type=image/svg+xml href=/logo/favicon.svg><link rel=stylesheet href=/css/main.min.b110e472dd7e3ed96b8b29a215fb5c3ccf1a477c18de37ff567733854ec8efb1.css integrity="sha256-sRDkct1+PtlriymiFftcPM8aR3wY3jf/VnczhU7I77E="><script defer src=https://metrics.andmarios.com/metrics.js data-website-id=23dbd66a-59fe-4fde-a9ce-686e13aecf1e data-performance=true></script></head><body><a href=#main-content class=skip-to-content>Skip to content</a><div class=panic-badge aria-hidden=true>DO NOT PANIC</div><header class=site-header><div class=container><div class=site-header__inner><div class=site-title><a href=/ aria-label="within specifications"><svg class="site-logo site-logo--full" viewBox="0 0 380 120" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><rect x="10" y="10" width="360" height="100" fill="none" stroke="currentcolor" stroke-width="3" rx="4"/><rect x="16" y="16" width="348" height="88" fill="none" stroke="currentcolor" stroke-width="1" rx="2"/><text x="175" y="52" text-anchor="middle" font-family="'IBM Plex Mono', monospace" font-size="20" font-weight="600" fill="currentcolor">WITHIN SPECIFICATIONS</text><circle cx="332" cy="45" r="14" fill="none" stroke="currentcolor" stroke-width="2"/><path d="M324 45l6 6 18-18" fill="none" stroke="currentcolor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/><line x1="30" y1="68" x2="350" y2="68" stroke="currentcolor" stroke-width="1" stroke-dasharray="4,2"/><text x="190" y="90" text-anchor="middle" font-family="'IBM Plex Mono', monospace" font-size="12" fill="currentcolor" opacity=".8">andmarios.com</text></svg><svg class="site-logo site-logo--compact" viewBox="0 0 340 70" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><rect x="8" y="8" width="324" height="54" fill="none" stroke="currentcolor" stroke-width="3" rx="4"/><rect x="13" y="13" width="314" height="44" fill="none" stroke="currentcolor" stroke-width="1" rx="2"/><text x="155" y="43" text-anchor="middle" font-family="'IBM Plex Mono', monospace" font-size="18" font-weight="600" fill="currentcolor">WITHIN SPECIFICATIONS</text><circle cx="297" cy="35" r="12" fill="none" stroke="currentcolor" stroke-width="2"/><path d="M290 35l5 5 15-15" fill="none" stroke="currentcolor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/></svg></a></div><nav class=site-nav aria-label="Main navigation"><a href=/blog/>Blog
</a><a href=/about/>About
</a><a href=https://github.com/andmarios target=_blank rel=noopener class=hide-mobile>GitHub</a>
<button class=theme-toggle aria-label="Toggle dark mode" onclick=toggleTheme()><svg class="sun-icon" viewBox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2"><circle cx="12" cy="12" r="5"/><path d="M12 1v2m0 18v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2m18 0h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"/></svg><svg class="moon-icon" viewBox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2"><path d="M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z"/></svg></button></nav></div></div></header><main id=main-content class=container><div class=typo-home><section class=typo-hero><div class=hero-stack><span class=stack-label>This is the blog of</span><h1 class=stack-name>Marios</h1><div class=stack-title><span class=title-bracket>[</span>
<span class=title-rotator><span class="title-text active">Software Engineer</span>
<span class=title-text>Dad</span>
<span class=title-text>Janitor</span>
<span class=title-text>Drunken Cook</span>
<span class=title-text>Optimist</span>
</span><span class=title-bracket>]</span></div></div><p class=hero-desc>Writing about technology, photography, and whatever else sparks my curiosity.</p><nav class=hero-nav><a href=https://github.com/andmarios target=_blank rel=noopener class=nav-link><span class=nav-icon>></span>
<span class=nav-label>github</span>
</a><a href=/blog/ class=nav-link><span class=nav-icon>></span>
<span class=nav-label>archive</span>
</a><a href=/faq/ class=nav-link><span class=nav-icon>></span>
<span class=nav-label>faq</span>
</a><a href=https://30ohm.com target=_blank rel=noopener class=nav-link><span class=nav-icon>></span>
<span class=nav-label>30ohm</span></a></nav></section><section class=typo-posts><h2 class=section-head><span class=head-num>001</span>
Recent Entries</h2><div class=post-table><article class=post-row><span class=row-index>01</span>
<time class=row-date datetime=2026-02-27>2026.02.27</time><h3 class=row-title><a href=/blog/broadcasting-again/>Broadcasting again</a></h3></article><article class=post-row><span class=row-index>02</span>
<time class=row-date datetime=2014-07-11>2014.07.11</time><h3 class=row-title><a href=/blog/the-cost-of-cheap-components/>The cost of cheap components</a></h3></article><article class=post-row><span class=row-index>03</span>
<time class=row-date datetime=2014-03-23>2014.03.23</time><h3 class=row-title><a href=/blog/new-blog-as-one-wasnt-enough/>within specifications —as one blog wasn’t enough</a></h3></article><article class=post-row><span class=row-index>04</span>
<time class=row-date datetime=2014-03-09>2014.03.09</time><h3 class=row-title><a href=/blog/fast-pwm-and-electromagnetic-interference/>Fast PWM and Electromagnetic Interference</a></h3></article><article class=post-row><span class=row-index>05</span>
<time class=row-date datetime=2014-02-20>2014.02.20</time><h3 class=row-title><a href=/blog/fast-pwm-on-atmega328/>Fast PWM on ATmega328, up to 8MHz</a></h3></article></div><a href=/blog/ class=view-more><span class=more-prompt>$</span>
<span class=more-cmd>ls -la /posts</span>
<span class=more-cursor>█</span></a></section><div class=typo-footer-deco aria-hidden=true><span class=deco-char>*</span>
<span class=deco-char>*</span>
<span class=deco-char>*</span></div></div></main><footer class=site-footer><div class=container><div class=site-footer__inner><nav class=footer-nav><a href=/about/>About</a>
<span class=footer-sep>/</span>
<a href=/contact/>Contact</a>
<span class=footer-sep>/</span>
<a href=/faq/>FAQ</a>
<span class=footer-sep>/</span>
<a href=https://github.com/andmarios target=_blank rel=noopener>GitHub</a>
<span class=footer-sep>/</span>
<a href=https://www.30ohm.com target=_blank rel=noopener>30ohm</a></nav><p>&copy; 2009–2026 Marios Andreopoulos</p></div></div></footer><script>(function(){const e=localStorage.getItem("theme");e==="dark"&&document.documentElement.setAttribute("data-theme","dark")})();function toggleTheme(){const t=document.documentElement.getAttribute("data-theme")==="dark",e=t?"light":"dark";document.documentElement.setAttribute("data-theme",e),localStorage.setItem("theme",e)}(function(){const o=document.querySelector(".title-rotator");if(!o)return;const t=o.querySelectorAll(".title-text"),a=document.querySelectorAll(".title-bracket");if(t.length<=1)return;const n=document.createElement("span");n.className="title-measure",document.body.appendChild(n);const i=[];t.forEach(e=>{n.textContent=e.textContent,i.push(n.offsetWidth)}),n.remove();let s=0;o.style.width=i[s]+"px";const r=5e3,d=150,u=400;let e=null;function c(){const n=t[s],l=(s+1)%t.length,h=t[l];a.forEach(e=>e.classList.add("squeeze")),n.classList.add("exit"),n.classList.remove("active"),setTimeout(()=>{o.style.width=i[l]+"px",a.forEach(e=>e.classList.remove("squeeze")),setTimeout(()=>{h.classList.add("active","entering"),setTimeout(()=>{h.classList.remove("entering")},500)},100),setTimeout(()=>{n.classList.remove("exit")},u)},d+100),s=l,e=setTimeout(c,r)}function l(){e||(e=setTimeout(c,r))}function h(){clearTimeout(e),e=null}document.addEventListener("visibilitychange",()=>{document.hidden?h():l()}),l()})(),function(){const t=document.querySelector(".site-header"),o=100,i=40,a=150;let n=0,e=!1;function s(){const s=Date.now();if(s-n<a){e=!1;return}const r=t.classList.contains("scrolled"),c=window.scrollY;!r&&c>o?(t.classList.add("scrolled"),n=s):r&&c<i&&(t.classList.remove("scrolled"),n=s),e=!1}function r(){e||(requestAnimationFrame(s),e=!0)}window.addEventListener("scroll",r,{passive:!0}),s()}(),function(){function n(e){const t=e.split(`
`);function n(e){return e.replace(/<[^>]*>/g,"")}for(;t.length>0&&n(t[t.length-1]).trim()==="";)t.pop();return t}function e(e){const i=e.innerHTML,a=e.textContent,r=n(i),t=document.createElement("div");t.className="code-block-inner";const s=document.createElement("div");s.className="code-line-numbers",s.setAttribute("aria-hidden","true");const o=document.createElement("div");return o.className="code-content",r.forEach(function(e,t){const i=document.createElement("span");i.textContent=t+1,s.appendChild(i);const n=document.createElement("div");n.className="code-line",n.innerHTML=e||" ",o.appendChild(n)}),t.appendChild(s),t.appendChild(o),{container:t,originalText:a}}function s(e,t){const n=e.querySelector(".code-line-numbers"),o=e.querySelectorAll(".code-line"),s=n.querySelectorAll("span:not(.wrap-indicator)");if(n.querySelectorAll(".wrap-indicator").forEach(function(e){e.remove()}),s.forEach(function(e){e.style.height=""}),!t)return;requestAnimationFrame(function(){o.forEach(function(e,t){const o=s[t];if(!o)return;const r=e.offsetHeight,i=parseFloat(getComputedStyle(e).lineHeight)||24,a=Math.round(r/i);if(a>1){o.style.height=i+"px",o.style.display="flex",o.style.alignItems="center",o.style.justifyContent="flex-end";for(let t=1;t<a;t++){const e=document.createElement("span");e.className="wrap-indicator",e.textContent="↳",e.style.height=i+"px",o.nextSibling?n.insertBefore(e,o.nextSibling):n.appendChild(e)}}})})}function t(e,t){const i=document.createElement("div");i.className="code-toolbar";const o=document.createElement("button");o.className="code-wrap-btn",o.textContent="Wrap",o.setAttribute("aria-label","Toggle line wrapping"),o.addEventListener("click",function(){const t=e.classList.toggle("wrapped");o.classList.toggle("active"),s(e,t)}),i.appendChild(o);const n=document.createElement("button");n.className="code-copy-btn",n.textContent="Copy",n.setAttribute("aria-label","Copy code to clipboard"),n.addEventListener("click",function(){navigator.clipboard.writeText(t).then(function(){n.textContent="Copied!",n.classList.add("copied"),setTimeout(function(){n.textContent="Copy",n.classList.remove("copied")},2e3)}).catch(function(){const e=document.createElement("textarea");e.value=t,e.style.position="fixed",e.style.opacity="0",document.body.appendChild(e),e.select(),document.execCommand("copy"),document.body.removeChild(e),n.textContent="Copied!",n.classList.add("copied"),setTimeout(function(){n.textContent="Copy",n.classList.remove("copied")},2e3)})}),i.appendChild(n),e.appendChild(i)}document.querySelectorAll("div.highlight").forEach(function(n){const o=n.querySelector("pre"),i=o?o.querySelector("code"):null;if(!i)return;const s=document.createElement("div");s.className="code-wrapper";const{container:a,originalText:r}=e(i);n.parentNode.insertBefore(s,n),n.remove(),s.appendChild(a),t(s,r)}),document.querySelectorAll("pre > code").forEach(function(n){const s=n.parentElement;if(s.closest(".code-wrapper"))return;const o=document.createElement("div");o.className="code-wrapper";const{container:i,originalText:a}=e(n);s.parentNode.insertBefore(o,s),s.remove(),o.appendChild(i),t(o,a)}),document.querySelectorAll("p > code:only-child").forEach(function(n){const s=n.parentElement;if(s.closest(".code-wrapper"))return;const o=document.createElement("div");o.className="code-wrapper";const{container:i,originalText:a}=e(n);s.parentNode.insertBefore(o,s),s.remove(),o.appendChild(i),t(o,a)})}(),function(){var e,n=document.querySelector(".reading-progress"),t=document.querySelector(".post-content");if(!n||!t)return;e=!1;function s(){var i=t.getBoundingClientRect(),a=t.offsetHeight,r=-i.top,o=a-window.innerHeight,s=o>0?r/o:1,s=Math.max(0,Math.min(1,s));n.style.width=s*100+"%",e=!1}window.addEventListener("scroll",function(){e||(requestAnimationFrame(s),e=!0)},{passive:!0}),s()}(),function(){var t,n,s,e=document.querySelectorAll(".post-row, .view-more");if(!e.length)return;s=0;function o(e){e.forEach(function(e,t){setTimeout(function(){e.classList.add("revealed")},t*100)})}if(t=document.querySelector(".post-table")||document.querySelector(".typo-posts"),!t){e.forEach(function(e){e.classList.add("revealed")});return}n=new IntersectionObserver(function(t){t.forEach(function(t){t.isIntersecting&&(o(e),n.unobserve(t.target))})},{threshold:.05,rootMargin:"0px 0px -80px 0px"}),n.observe(t)}(),function(){let t=null,e=null,s=null,n=!1;function a(){return document.querySelectorAll(".post-content img, .post img, article img")}function r(a){if(n||t)return;n=!0,s=a;const r=a.getBoundingClientRect();t=document.createElement("div"),t.className="image-zoom-overlay",e=document.createElement("img"),e.src=a.src,e.alt=a.alt||"",e.style.left=r.left+"px",e.style.top=r.top+"px",e.style.width=r.width+"px",e.style.height=r.height+"px",t.appendChild(e),document.body.appendChild(t),a.classList.add("image-zooming"),requestAnimationFrame(()=>{t.classList.add("active");const c=window.innerWidth,i=window.innerHeight,l=a.naturalWidth||r.width,u=a.naturalHeight||r.height,d=l/u;let o=Math.min(l,c*.9),s=o/d;s>i*.9&&(s=i*.9,o=s*d);const h=(c-o)/2,m=(i-s)/2;e.style.left=h+"px",e.style.top=m+"px",e.style.width=o+"px",e.style.height=s+"px",setTimeout(()=>{n=!1},300)}),t.addEventListener("click",o),document.addEventListener("keydown",i),window.addEventListener("scroll",o,{once:!0})}function o(){if(n||!t)return;n=!0;const o=s.getBoundingClientRect();t.classList.remove("active"),e.style.left=o.left+"px",e.style.top=o.top+"px",e.style.width=o.width+"px",e.style.height=o.height+"px",setTimeout(()=>{s.classList.remove("image-zooming"),t.remove(),t=null,e=null,s=null,n=!1},300),document.removeEventListener("keydown",i)}function i(e){e.key==="Escape"&&o()}a().forEach(e=>{e.addEventListener("click",()=>r(e))})}()</script></body></html>