<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>English - Benji Vesterby (Author) Feed</title><link>https://codepros.org/people/benji-vesterby/</link><description>Recent content</description><generator>Hugo 0.147.1</generator><language>en</language><lastBuildDate>Sat, 18 Apr 2026 12:58:00 +0000</lastBuildDate><atom:link href="https://codepros.org/people/benji-vesterby/index.xml" rel="self" type="application/rss+xml"/><category>Benji Vesterby</category><item><title>Introduction to Application Security (AppSec)</title><link>https://codepros.org/blog/application-security-overview/</link><pubDate>Wed, 30 Nov 2022 07:00:00 -0500</pubDate><guid>https://codepros.org/blog/application-security-overview/</guid><category>security</category><category>remediation</category><category>risk</category><category>threat-actors</category><category>exploitation</category><category>remediation</category><category>ddos</category><description>&lt;p>Cybersecurity (a.k.a. Information Security) is an overly generalized term for
a field securing digital infrastructure, applications, or services.
The goal of a cybersecurity program is to identify, categorize, and prioritize
&lt;a
href="https://codepros.org/tags/risk"
>risk&lt;/a>
within an organization. These risks are then
&lt;a
href="https://codepros.org/tags/remediation"
>remediated&lt;/a>
in an effort to reduce the likelihood of a
successful attack by a &lt;a
href="https://codepros.org/tags/threat-actors"
>bad actor&lt;/a>
.&lt;/p>
&lt;p>Application Security is a sub-category of cybersecurity that focuses on
identifying and correcting insecure code or vulnerabilities in software
developed &lt;em>within&lt;/em> an organization. Unlike applications purchased through
vendors or open source software, the security of a custom application is the
responsibility of the creator.&lt;/p></description></item><item><title>Intro to Generics in Go: Type Parameters, Type Inference and Constraints</title><link>https://codepros.org/blog/golang-generics-introduction/</link><pubDate>Sun, 23 Jan 2022 21:10:00 -0500</pubDate><guid>https://codepros.org/blog/golang-generics-introduction/</guid><category>generic-programming</category><category>go</category><category>triangle-go</category><category>interface</category><category>reflection</category><description>&lt;p>Generic programming for statically typed languages is a tool for building
maintainable software. Generics have a lot of advantages and can create
infinitely reusable code, they do however, have a history of being overused and
misunderstood leading to anti-patterns&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>. Due to the regularity of misuse the
Go team has been reluctant to add generics to the language.&lt;/p>
&lt;p>Beginning in February 2022, Go will introduce generics support in its 1.18
release&lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup>. The Go team spent many years researching and experimenting with
different implementations of generics and their implications for Go. The Go team
believes they have found an implementation that is both effective and, more
importantly, maintains the simplicity of the language.&lt;sup id="fnref:3">&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref">3&lt;/a>&lt;/sup>&lt;/p></description></item><item><title>An Overview of Generic Programming: Writing Code with Arbitrary Types</title><link>https://codepros.org/blog/generic-programming-in-software-engineering/</link><pubDate>Sat, 22 Jan 2022 20:10:00 -0500</pubDate><guid>https://codepros.org/blog/generic-programming-in-software-engineering/</guid><category>computing-basics</category><category>generic-programming</category><category>abstraction</category><category>interface</category><category>reflection</category><description>&lt;p>Generic Programming is a specialized form of programming in some languages
(primarily statically typed languages) where code is written to process objects
of &lt;strong>&lt;em>any&lt;/em>&lt;/strong> arbitrary type. The distinction between generic programming and&lt;picture>
&lt;source type="image/webp"
srcset="https://codepros.org/blog/generic-programming-in-software-engineering/images/generic-meme_hu_f44e63704aa27600.webp 1x"
sizes="(max-width: 768px) 100vw, 768px">
&lt;img class="img-fluid float-end me-3 mb-3"
src="https://codepros.org/blog/generic-programming-in-software-engineering/images/generic-meme_hu_e616330fdc0b64fc.png"
srcset="https://codepros.org/blog/generic-programming-in-software-engineering/images/generic-meme_hu_e616330fdc0b64fc.png 1x"
sizes="(max-width: 768px) 100vw, 768px"
width="200"
height="137"
alt="A
meme with a black background and text reading &amp;amp;ldquo;generic
meme&amp;amp;rdquo;"
loading="eager"
decoding="async"
style="max-width: 200px" />
&lt;/picture>normal
programming is when writing generic code the &amp;ldquo;type&amp;rdquo; (often denoted &lt;code>T&lt;/code>) of the
data is not explicitly stated. The generic programming paradigm is challenging
to master because it requires a high level of abstraction (ignoring the type of
data in its entirety).&lt;/p></description></item><item><title>Building a Go Version Manager (GVM)</title><link>https://codepros.org/blog/building-a-go-version-manager/</link><pubDate>Sun, 09 Jan 2022 19:55:00 -0500</pubDate><guid>https://codepros.org/blog/building-a-go-version-manager/</guid><category>go</category><category>scripting</category><category>github-actions</category><category>version-manager</category><category>gvm</category><category>first-time-use</category><description>&lt;p>&lt;a
href="https://gopherize.me"
aria-label=" – Opens in a new window"
target="_blank" rel="noopener noreferrer"
>&lt;picture>
&lt;source type="image/webp"
srcset="https://codepros.org/blog/building-a-go-version-manager/images/cover_hu_724ddaef80ae104c.webp 1x"
sizes="(max-width: 768px) 100vw, 768px">
&lt;img class="img-fluid mx-auto d-block"
src="https://codepros.org/blog/building-a-go-version-manager/images/cover_hu_c93738ce47a8bcc9.png"
srcset="https://codepros.org/blog/building-a-go-version-manager/images/cover_hu_c93738ce47a8bcc9.png 1x"
sizes="(max-width: 768px) 100vw, 768px"
width="600"
height="240"
alt="A group of diverse gophers courtesy of gopherize.me"
loading="eager"
decoding="async"
style="max-width: 600px" />
&lt;/picture>
&lt;span aria-hidden="true" class="external-icon">↗&lt;/span>
&lt;/a>
&lt;/p>
&lt;p>I have been using Go since early 2017 and have only grown to love the language
and the community more and more over time. There is one thing I have always
found frustrating about Go, however, which is the very manual process of
installing a new version.&lt;/p></description></item><item><title>Beginning Concurrency Patterns</title><link>https://codepros.org/blog/beginning-concurrency-patterns/</link><pubDate>Thu, 30 Dec 2021 06:00:00 -0500</pubDate><guid>https://codepros.org/blog/beginning-concurrency-patterns/</guid><category>triangle-go</category><category>go</category><category>intermediate</category><category>parallel-programming</category><category>concurrency</category><category>concurrent-design</category><category>best-practices</category><description>&lt;p>In this post I will cover some best practices for building concurrent
applications in Go using basic concurrency patterns and native primitives. The
patterns themselves are applicable to any language, but for these examples we
will use Go.&lt;/p>
&lt;p>Clone the repository for this post to follow along&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">git clone https://github.com/benjivesterby/may2021-triangle-meetup.git
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 id="pipeline-pattern" class="position-relative">
Pipeline Pattern
&lt;a class="h-anchor ms-2 text-decoration-none link-secondary"
href="#pipeline-pattern"
aria-label="Link to this section: Pipeline Pattern">
&lt;i class="fa-sharp-duotone fa-solid fa-link" aria-hidden="true">&lt;/i>
&lt;/a>
&lt;a class="h-top ms-1 text-decoration-none link-secondary"
href="#top"
aria-label="Back to top">
&lt;i class="fa-sharp-duotone fa-regular fa-arrow-up" aria-hidden="true">&lt;/i>
&lt;/a>
&lt;button type="button"
class="h-share ms-1 btn btn-link p-0 text-decoration-none link-secondary"
data-share-target="pipeline-pattern"
aria-haspopup="dialog"
aria-label="Share link: Pipeline Pattern">
&lt;i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true">&lt;/i>
&lt;span class="visually-hidden">Share link&lt;/span>
&lt;/button>
&lt;/h3>&lt;div id="headingShareModal" class="heading-share-modal" role="dialog" aria-modal="true" aria-labelledby="headingShareTitle" hidden>
&lt;div class="hsm-dialog border rounded shadow-sm p-3" role="document">
&lt;div class="d-flex justify-content-between align-items-center border-bottom pb-2">
&lt;h2 id="headingShareTitle" class="h6 mb-0">Share this section&lt;/h2>
&lt;button type="button" class="hsm-close btn btn-sm btn-outline-secondary" aria-label="Close">×&lt;/button>
&lt;/div>
&lt;div class="hsm-body mt-3">
&lt;div class="input-group mb-3 hsm-url-group">
&lt;input id="headingShareInput" type="text" class="form-control" readonly aria-readonly="true" />
&lt;button class="btn btn-primary hsm-copy" type="button" aria-label="Copy" title="Copy">
&lt;i class="fa-duotone fa-clipboard" aria-hidden="true">&lt;/i>
&lt;/button>
&lt;/div>
&lt;div class="small mb-2 fw-semibold">Share link:&lt;/div>
&lt;ul class="list-inline mb-0 hsm-share-links">
&lt;li class="list-inline-item mb-2">
&lt;a id="share-twitter" class="btn btn-sm btn-outline-primary" target="_blank" rel="noopener noreferrer">Twitter Profile&lt;/a>
&lt;/li>
&lt;li class="list-inline-item mb-2">
&lt;a id="share-linkedin" class="btn btn-sm btn-outline-primary" target="_blank" rel="noopener noreferrer">LinkedIn Profile&lt;/a>
&lt;/li>
&lt;li class="list-inline-item mb-2">
&lt;a id="share-facebook" class="btn btn-sm btn-outline-primary" target="_blank" rel="noopener noreferrer">Facebook Profile&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;style>
.heading-share-modal { position: fixed; inset: 0; display:flex; justify-content:center; align-items:center; background:rgba(0,0,0,.45); z-index:1050; padding:1rem; }
.heading-share-modal[hidden]{ display:none !important; }
.hsm-dialog { max-width:420px; width:100%; background: var(--bs-body-bg,#fff); color: var(--bs-body-color,#212529); border:1px solid var(--bs-border-color,rgba(0,0,0,.125)); border-radius: var(--bs-border-radius,.5rem); box-shadow:0 .5rem 1rem rgba(0,0,0,.25),0 0 0 1px rgba(255,255,255,.03); }
[data-bs-theme="dark"] .hsm-dialog { background: var(--bs-dark-bg-subtle,#21262c); color: var(--bs-light,#f8f9fa); border-color: rgba(255,255,255,.15); }
.hsm-header .hsm-close { line-height:1; font-weight:600; }
.hsm-share-links .btn { min-width:90px; }
.hsm-url-group { display:flex; }
.hsm-url-group .form-control { border-top-right-radius:0; border-bottom-right-radius:0; font-size:.875rem; align-items:center; margin-top: .4rem; }
.hsm-url-group .hsm-copy { border-top-left-radius:0; border-bottom-left-radius:0; display:flex; align-items:center; }
.hsm-url-group .hsm-copy i { font-size:.9rem; line-height:1; }
@media (min-width:768px){ .hsm-url-group .form-control { font-size:.9rem; } }
@media (max-width:420px){ .hsm-url-group .form-control { font-size:.84rem; } }
.hsm-url-group .form-control { background: var(--bs-secondary-bg,#f1f3f5); border-color: var(--bs-border-color,#ced4da); color: var(--bs-body-color,#212529); }
.hsm-url-group .form-control:focus { box-shadow:0 0 0 .15rem rgba(var(--bs-primary-rgb,13,110,253), .25); }
[data-bs-theme="dark"] .hsm-url-group .form-control { background:#2a3035; border-color: rgba(255,255,255,.15); color:#fff; }
[data-bs-theme="dark"] .hsm-url-group .form-control:focus { box-shadow:0 0 0 .15rem rgba(var(--bs-primary-rgb,49,132,253), .4); }
.heading-share-modal a.btn-outline-primary { --bs-btn-color: var(--bs-primary); --bs-btn-border-color: var(--bs-primary); }
[data-bs-theme="dark"] .heading-share-modal { background:rgba(0,0,0,.7); }
&lt;/style>
&lt;script>
(function(){
const modal = document.getElementById('headingShareModal');
if(!modal) return;
const input = modal.querySelector('#headingShareInput');
const copyBtn = modal.querySelector('.hsm-copy');
const twitter = modal.querySelector('#share-twitter');
const linkedin = modal.querySelector('#share-linkedin');
const facebook = modal.querySelector('#share-facebook');
const closeBtn = modal.querySelector('.hsm-close');
let lastFocus=null;
let trapBound=false;
function buildUrl(id){ return window.location.origin + window.location.pathname + '#' + id; }
function isOpen(){ return !modal.hasAttribute('hidden'); }
function hydrate(id){
const url=buildUrl(id);
input.value=url;
const enc=encodeURIComponent(url);
const text=encodeURIComponent(document.title);
if(twitter) twitter.href=`https://twitter.com/intent/tweet?url=${enc}&amp;text=${text}`;
if(linkedin) linkedin.href=`https://www.linkedin.com/sharing/share-offsite/?url=${enc}`;
if(facebook) facebook.href=`https://www.facebook.com/sharer/sharer.php?u=${enc}`;
}
function openModal(id){
lastFocus=document.activeElement;
hydrate(id);
if(!isOpen()){
modal.removeAttribute('hidden');
}
requestAnimationFrame(()=>{ input.focus(); });
trapFocus();
}
function closeModal(){
if(!isOpen()) return;
modal.setAttribute('hidden','');
if(lastFocus &amp;&amp; typeof lastFocus.focus==='function') lastFocus.focus();
}
function copyCurrent(){
try{ navigator.clipboard.writeText(input.value).then(()=>feedback(true),()=>fallback()); }
catch(e){ fallback(); }
}
function fallback(){ input.select(); try{ document.execCommand('copy'); feedback(true);}catch(e){ feedback(false);} }
function feedback(ok){ if(!copyBtn) return; const icon=copyBtn.querySelector('i'); if(!icon) return; const prev=copyBtn.getAttribute('data-prev')||icon.className; if(!copyBtn.getAttribute('data-prev')) copyBtn.setAttribute('data-prev',prev); icon.className= ok ? 'fa-duotone fa-clipboard-check':'fa-duotone fa-circle-exclamation'; setTimeout(()=>{ icon.className=prev; },1800); }
function handleShareClick(e){ e.preventDefault(); const btn=e.currentTarget; const id=btn.getAttribute('data-share-target'); if(id) openModal(id); }
function bindShareButtons(){
document.querySelectorAll('.h-share').forEach(btn=>{
if(!btn.dataset.hShareBound){ btn.addEventListener('click', handleShareClick); btn.dataset.hShareBound='1'; }
});
}
bindShareButtons();
if(document.readyState==='loading'){
document.addEventListener('DOMContentLoaded', bindShareButtons);
} else {
requestAnimationFrame(bindShareButtons);
}
document.addEventListener('click', function(e){
const shareBtn=e.target.closest &amp;&amp; e.target.closest('.h-share');
if(shareBtn &amp;&amp; !shareBtn.dataset.hShareBound){ handleShareClick.call(shareBtn, e); }
}, true);
document.addEventListener('click', e=>{
if(e.target===modal) closeModal();
if(e.target.closest &amp;&amp; e.target.closest('.hsm-close')){ e.preventDefault(); closeModal(); }
if(copyBtn &amp;&amp; (e.target===copyBtn || (e.target.closest &amp;&amp; e.target.closest('.hsm-copy')))) { e.preventDefault(); copyCurrent(); }
});
document.addEventListener('keydown', e=>{ if(e.key==='Escape' &amp;&amp; isOpen()) closeModal(); });
function trapFocus(){
if(trapBound) return;
trapBound=true;
modal.addEventListener('keydown', f=>{ if(f.key==='Tab' &amp;&amp; isOpen()){ const focusable=[...modal.querySelectorAll('a[href],button,input,textarea,select,[tabindex]:not([tabindex="-1"])')].filter(el=>!el.hasAttribute('disabled')); if(!focusable.length) return; const first=focusable[0]; const last=focusable[focusable.length-1]; if(f.shiftKey &amp;&amp; document.activeElement===first){ f.preventDefault(); last.focus(); } else if(!f.shiftKey &amp;&amp; document.activeElement===last){ f.preventDefault(); first.focus(); } } });
}
if(closeBtn) closeBtn.addEventListener('click', e=>{ e.preventDefault(); closeModal(); });
})();
&lt;/script>&lt;p>A pipeline pattern&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup> &lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup> consists of a number of stages that are connected
by a series of channels. The first stage is the source of the data, the last
stage is the sink of the data. A good example of this would be a data pipeline
where the first step mines the data, the subsequent steps cleans the data, and
the final step stores the sanitized data in a database.&lt;/p></description></item><item><title>Go Native Concurrency Primitives &amp; Best Practices</title><link>https://codepros.org/blog/go-native-concurrency-primitives/</link><pubDate>Thu, 30 Dec 2021 06:00:00 -0500</pubDate><guid>https://codepros.org/blog/go-native-concurrency-primitives/</guid><category>triangle-go</category><category>go</category><category>intermediate</category><category>parallel-programming</category><category>concurrency</category><category>concurrent-design</category><category>best-practices</category><description>&lt;p>&lt;picture>
&lt;source type="image/webp"
srcset="https://codepros.org/blog/go-native-concurrency-primitives/images/sospecial_hu_8338207a0fec45a5.webp 1x"
sizes="(max-width: 768px) 100vw, 768px">
&lt;img class="img-fluid float-end me-3 mb-3"
src="https://codepros.org/blog/go-native-concurrency-primitives/images/sospecial_hu_6cee7c709e74391b.png"
srcset="https://codepros.org/blog/go-native-concurrency-primitives/images/sospecial_hu_6cee7c709e74391b.png 1x"
sizes="(max-width: 768px) 100vw, 768px"
width="200"
height="150"
alt="A meme with the &amp;amp;ldquo;overly attached girlfriend&amp;amp;rdquo; image and text that reads &amp;amp;ldquo;You are so special!&amp;amp;rdquo;"
loading="lazy"
decoding="async"
style="max-width: 200px" />
&lt;/picture>&lt;/p>
&lt;p>The Go programming language was created with concurrency as a first class
citizen. It is a language that allows you to write programs that are highly
parallel with ease by abstracting away the details of parallelism behind
concurrency primitives&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup> within the language.&lt;/p></description></item><item><title>Parallelism and Concurrency; What's the Difference?</title><link>https://codepros.org/blog/parallelism-vs-concurrency/</link><pubDate>Wed, 29 Dec 2021 06:00:00 -0500</pubDate><guid>https://codepros.org/blog/parallelism-vs-concurrency/</guid><category>triangle-go</category><category>go</category><category>computing-basics</category><category>intermediate</category><category>parallel-programming</category><category>concurrency</category><category>concurrent-design</category><description>&lt;p>&lt;picture>
&lt;source type="image/webp"
srcset="https://codepros.org/blog/parallelism-vs-concurrency/images/captain_hu_44d84a42c125837a.webp 1x"
sizes="(max-width: 768px) 100vw, 768px">
&lt;img class="img-fluid float-end me-3 mb-3"
src="https://codepros.org/blog/parallelism-vs-concurrency/images/captain_hu_2e2887d02def7b62.png"
srcset="https://codepros.org/blog/parallelism-vs-concurrency/images/captain_hu_2e2887d02def7b62.png 1x"
sizes="(max-width: 768px) 100vw, 768px"
width="300"
height="150"
alt="A photo of Captain America choking himself out in Avengers
Endgame"
loading="lazy"
decoding="async"
style="max-width: 300px" />
&lt;/picture>&lt;/p>
&lt;p>Parallelism in software is the execution of instructions simultaneously. Each
programming language either implements their own libraries, or provide native
support as part of the language, like Go. Parallelism allows software engineers
to side-step the physical limitations of the hardware by executing tasks in
parallel on multiple processors.&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>&lt;/p></description></item><item><title>Go 1.16 Release Overview</title><link>https://codepros.org/blog/triangle-golang-meetup-march-2021/</link><pubDate>Wed, 24 Mar 2021 17:28:00 -0500</pubDate><guid>https://codepros.org/blog/triangle-golang-meetup-march-2021/</guid><category>triangle-go</category><category>go</category><category>git</category><category>parallel-programming</category><category>go-releases</category><description>&lt;h3 id="go-116--embed--iofs--retract--apple-m1-support" class="position-relative">
Go 1.16 – embed | io/fs | retract | Apple M1 support
&lt;a class="h-anchor ms-2 text-decoration-none link-secondary"
href="#go-116--embed--iofs--retract--apple-m1-support"
aria-label="Link to this section: Go 1.16 – embed | io/fs | retract | Apple M1 support">
&lt;i class="fa-sharp-duotone fa-solid fa-link" aria-hidden="true">&lt;/i>
&lt;/a>
&lt;a class="h-top ms-1 text-decoration-none link-secondary"
href="#top"
aria-label="Back to top">
&lt;i class="fa-sharp-duotone fa-regular fa-arrow-up" aria-hidden="true">&lt;/i>
&lt;/a>
&lt;button type="button"
class="h-share ms-1 btn btn-link p-0 text-decoration-none link-secondary"
data-share-target="go-116--embed--iofs--retract--apple-m1-support"
aria-haspopup="dialog"
aria-label="Share link: Go 1.16 – embed | io/fs | retract | Apple M1 support">
&lt;i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true">&lt;/i>
&lt;span class="visually-hidden">Share link&lt;/span>
&lt;/button>
&lt;/h3>&lt;div id="headingShareModal" class="heading-share-modal" role="dialog" aria-modal="true" aria-labelledby="headingShareTitle" hidden>
&lt;div class="hsm-dialog border rounded shadow-sm p-3" role="document">
&lt;div class="d-flex justify-content-between align-items-center border-bottom pb-2">
&lt;h2 id="headingShareTitle" class="h6 mb-0">Share this section&lt;/h2>
&lt;button type="button" class="hsm-close btn btn-sm btn-outline-secondary" aria-label="Close">×&lt;/button>
&lt;/div>
&lt;div class="hsm-body mt-3">
&lt;div class="input-group mb-3 hsm-url-group">
&lt;input id="headingShareInput" type="text" class="form-control" readonly aria-readonly="true" />
&lt;button class="btn btn-primary hsm-copy" type="button" aria-label="Copy" title="Copy">
&lt;i class="fa-duotone fa-clipboard" aria-hidden="true">&lt;/i>
&lt;/button>
&lt;/div>
&lt;div class="small mb-2 fw-semibold">Share link:&lt;/div>
&lt;ul class="list-inline mb-0 hsm-share-links">
&lt;li class="list-inline-item mb-2">
&lt;a id="share-twitter" class="btn btn-sm btn-outline-primary" target="_blank" rel="noopener noreferrer">Twitter Profile&lt;/a>
&lt;/li>
&lt;li class="list-inline-item mb-2">
&lt;a id="share-linkedin" class="btn btn-sm btn-outline-primary" target="_blank" rel="noopener noreferrer">LinkedIn Profile&lt;/a>
&lt;/li>
&lt;li class="list-inline-item mb-2">
&lt;a id="share-facebook" class="btn btn-sm btn-outline-primary" target="_blank" rel="noopener noreferrer">Facebook Profile&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;style>
.heading-share-modal { position: fixed; inset: 0; display:flex; justify-content:center; align-items:center; background:rgba(0,0,0,.45); z-index:1050; padding:1rem; }
.heading-share-modal[hidden]{ display:none !important; }
.hsm-dialog { max-width:420px; width:100%; background: var(--bs-body-bg,#fff); color: var(--bs-body-color,#212529); border:1px solid var(--bs-border-color,rgba(0,0,0,.125)); border-radius: var(--bs-border-radius,.5rem); box-shadow:0 .5rem 1rem rgba(0,0,0,.25),0 0 0 1px rgba(255,255,255,.03); }
[data-bs-theme="dark"] .hsm-dialog { background: var(--bs-dark-bg-subtle,#21262c); color: var(--bs-light,#f8f9fa); border-color: rgba(255,255,255,.15); }
.hsm-header .hsm-close { line-height:1; font-weight:600; }
.hsm-share-links .btn { min-width:90px; }
.hsm-url-group { display:flex; }
.hsm-url-group .form-control { border-top-right-radius:0; border-bottom-right-radius:0; font-size:.875rem; align-items:center; margin-top: .4rem; }
.hsm-url-group .hsm-copy { border-top-left-radius:0; border-bottom-left-radius:0; display:flex; align-items:center; }
.hsm-url-group .hsm-copy i { font-size:.9rem; line-height:1; }
@media (min-width:768px){ .hsm-url-group .form-control { font-size:.9rem; } }
@media (max-width:420px){ .hsm-url-group .form-control { font-size:.84rem; } }
.hsm-url-group .form-control { background: var(--bs-secondary-bg,#f1f3f5); border-color: var(--bs-border-color,#ced4da); color: var(--bs-body-color,#212529); }
.hsm-url-group .form-control:focus { box-shadow:0 0 0 .15rem rgba(var(--bs-primary-rgb,13,110,253), .25); }
[data-bs-theme="dark"] .hsm-url-group .form-control { background:#2a3035; border-color: rgba(255,255,255,.15); color:#fff; }
[data-bs-theme="dark"] .hsm-url-group .form-control:focus { box-shadow:0 0 0 .15rem rgba(var(--bs-primary-rgb,49,132,253), .4); }
.heading-share-modal a.btn-outline-primary { --bs-btn-color: var(--bs-primary); --bs-btn-border-color: var(--bs-primary); }
[data-bs-theme="dark"] .heading-share-modal { background:rgba(0,0,0,.7); }
&lt;/style>
&lt;script>
(function(){
const modal = document.getElementById('headingShareModal');
if(!modal) return;
const input = modal.querySelector('#headingShareInput');
const copyBtn = modal.querySelector('.hsm-copy');
const twitter = modal.querySelector('#share-twitter');
const linkedin = modal.querySelector('#share-linkedin');
const facebook = modal.querySelector('#share-facebook');
const closeBtn = modal.querySelector('.hsm-close');
let lastFocus=null;
let trapBound=false;
function buildUrl(id){ return window.location.origin + window.location.pathname + '#' + id; }
function isOpen(){ return !modal.hasAttribute('hidden'); }
function hydrate(id){
const url=buildUrl(id);
input.value=url;
const enc=encodeURIComponent(url);
const text=encodeURIComponent(document.title);
if(twitter) twitter.href=`https://twitter.com/intent/tweet?url=${enc}&amp;text=${text}`;
if(linkedin) linkedin.href=`https://www.linkedin.com/sharing/share-offsite/?url=${enc}`;
if(facebook) facebook.href=`https://www.facebook.com/sharer/sharer.php?u=${enc}`;
}
function openModal(id){
lastFocus=document.activeElement;
hydrate(id);
if(!isOpen()){
modal.removeAttribute('hidden');
}
requestAnimationFrame(()=>{ input.focus(); });
trapFocus();
}
function closeModal(){
if(!isOpen()) return;
modal.setAttribute('hidden','');
if(lastFocus &amp;&amp; typeof lastFocus.focus==='function') lastFocus.focus();
}
function copyCurrent(){
try{ navigator.clipboard.writeText(input.value).then(()=>feedback(true),()=>fallback()); }
catch(e){ fallback(); }
}
function fallback(){ input.select(); try{ document.execCommand('copy'); feedback(true);}catch(e){ feedback(false);} }
function feedback(ok){ if(!copyBtn) return; const icon=copyBtn.querySelector('i'); if(!icon) return; const prev=copyBtn.getAttribute('data-prev')||icon.className; if(!copyBtn.getAttribute('data-prev')) copyBtn.setAttribute('data-prev',prev); icon.className= ok ? 'fa-duotone fa-clipboard-check':'fa-duotone fa-circle-exclamation'; setTimeout(()=>{ icon.className=prev; },1800); }
function handleShareClick(e){ e.preventDefault(); const btn=e.currentTarget; const id=btn.getAttribute('data-share-target'); if(id) openModal(id); }
function bindShareButtons(){
document.querySelectorAll('.h-share').forEach(btn=>{
if(!btn.dataset.hShareBound){ btn.addEventListener('click', handleShareClick); btn.dataset.hShareBound='1'; }
});
}
bindShareButtons();
if(document.readyState==='loading'){
document.addEventListener('DOMContentLoaded', bindShareButtons);
} else {
requestAnimationFrame(bindShareButtons);
}
document.addEventListener('click', function(e){
const shareBtn=e.target.closest &amp;&amp; e.target.closest('.h-share');
if(shareBtn &amp;&amp; !shareBtn.dataset.hShareBound){ handleShareClick.call(shareBtn, e); }
}, true);
document.addEventListener('click', e=>{
if(e.target===modal) closeModal();
if(e.target.closest &amp;&amp; e.target.closest('.hsm-close')){ e.preventDefault(); closeModal(); }
if(copyBtn &amp;&amp; (e.target===copyBtn || (e.target.closest &amp;&amp; e.target.closest('.hsm-copy')))) { e.preventDefault(); copyCurrent(); }
});
document.addEventListener('keydown', e=>{ if(e.key==='Escape' &amp;&amp; isOpen()) closeModal(); });
function trapFocus(){
if(trapBound) return;
trapBound=true;
modal.addEventListener('keydown', f=>{ if(f.key==='Tab' &amp;&amp; isOpen()){ const focusable=[...modal.querySelectorAll('a[href],button,input,textarea,select,[tabindex]:not([tabindex="-1"])')].filter(el=>!el.hasAttribute('disabled')); if(!focusable.length) return; const first=focusable[0]; const last=focusable[focusable.length-1]; if(f.shiftKey &amp;&amp; document.activeElement===first){ f.preventDefault(); last.focus(); } else if(!f.shiftKey &amp;&amp; document.activeElement===last){ f.preventDefault(); first.focus(); } } });
}
if(closeBtn) closeBtn.addEventListener('click', e=>{ e.preventDefault(); closeModal(); });
})();
&lt;/script>&lt;p>&lt;a
href="https://docs.google.com/presentation/d/e/2PACX-1vSo9Z79dS0ZlbC3mocF1m6eiDRhYnvtsXWPtA-Mm6gv7-6zHyR6R8LDIzbxkusPH9f_5I1QNbhdb5TK/pub?start=false&amp;amp;loop=false&amp;amp;delayms=3000"
aria-label="Click Here to View the Presentation Slides – Opens in a new window"
target="_blank" rel="noopener noreferrer"
>Click Here to View the Presentation Slides
&lt;span aria-hidden="true" class="external-icon">↗&lt;/span>
&lt;/a>
&lt;/p></description></item><item><title>It's a 2021 PI (π) Day Special! Try Your Very Own Monte Carlo PI (π) Simulation!</title><link>https://codepros.org/blog/pi-day-special-2021/</link><pubDate>Mon, 15 Mar 2021 09:07:00 -0500</pubDate><guid>https://codepros.org/blog/pi-day-special-2021/</guid><description>&lt;p>So, if you have read my &lt;a
href="https://codepros.org/applied-artificial-intelligence-what-could-be-better"
>intro
post&lt;/a>
when I started this
blog like forever ago (Feb 7, 2021 to be exact), then you know that I’m super
excited about a project called &lt;a
href="https://github.com/devnw/atomizer"
aria-label="Atomizer – Opens in a new window"
target="_blank" rel="noopener noreferrer"
>Atomizer
&lt;span aria-hidden="true" class="external-icon">↗&lt;/span>
&lt;/a>
.
I’ve been slowly stringing you (my readers) along for the last few posts to
build up some background so that I can reference it when I start talking about
MPDC (Massively Parallel Distributed Computing).&lt;/p></description></item><item><title>Understanding Monolithic Architectures: Benefits, Scaling, and Pain Points</title><link>https://codepros.org/blog/understanding-monolithic-architecture/</link><pubDate>Wed, 10 Mar 2021 06:00:00 -0500</pubDate><guid>https://codepros.org/blog/understanding-monolithic-architecture/</guid><description>&lt;p>So, we discussed different ways to &lt;a
href="https://codepros.org/architecture-scaling-vertical-vs-horizontal"
>scale your
application&lt;/a>
.
Now, let’s look at monolithic architectures and applications.&lt;/p>
&lt;p>A monolithic application is one in which all of the functions of the application
are part of the same artifact / application. This does not mean that the
application itself is &lt;a
href="https://codepros.org/tags/coupling/"
>tightly coupled&lt;/a>
, but
that the application generally runs as a whole on the same system.&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>&lt;/p>
&lt;p>&lt;img class="img-fluid"
src="images/utahmonolith.webp#floatright"
sizes="(max-width: 768px) 100vw, 768px"
alt="A photo of the monolith that appeared in Utah in 2020"
loading="lazy"
decoding="async"
/>&lt;/p></description></item><item><title>How to Scale Your Application Architecture: Vertical vs. Horizontal</title><link>https://codepros.org/blog/architecture-scaling-vertical-vs-horizontal/</link><pubDate>Wed, 24 Feb 2021 06:00:00 -0500</pubDate><guid>https://codepros.org/blog/architecture-scaling-vertical-vs-horizontal/</guid><description>&lt;p>&lt;picture>
&lt;source type="image/webp"
srcset="https://codepros.org/blog/architecture-scaling-vertical-vs-horizontal/images/troll_hu_8eef4f766fc96812.webp 1x"
sizes="(max-width: 768px) 100vw, 768px">
&lt;img class="img-fluid float-end me-3 mb-3"
src="https://codepros.org/blog/architecture-scaling-vertical-vs-horizontal/images/troll_hu_13abc19e22a4320c.png"
srcset="https://codepros.org/blog/architecture-scaling-vertical-vs-horizontal/images/troll_hu_13abc19e22a4320c.png 1x"
sizes="(max-width: 768px) 100vw, 768px"
width="254"
height="228"
alt="Image of an internet troll banging a
cymbal"
loading="lazy"
decoding="async"
style="max-width: 254px" />
&lt;/picture>&lt;/p>
&lt;p>Scaling can be a &lt;em>weighty&lt;/em> subject…&lt;/p>
&lt;p>It’s important to keep your AWS bill at a healthy &lt;em>weight&lt;/em>.&lt;/p>
&lt;p>You should probably consider reducing your &lt;em>mass&lt;/em>-ive infrastructure. (yeah
yeah, mass isn’t weight, I get it… geez)&lt;/p>
&lt;p>Wow… How many scale puns can this guy come up with?&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>“A pun is the lowest form of humor—when you don’t think of it first.”&lt;/strong> ―
Oscar Levant&lt;/p></description></item><item><title>A Quick Recap of Single-Core vs Multi-Core Processing</title><link>https://codepros.org/blog/quick-recap-single-multi-core/</link><pubDate>Tue, 16 Feb 2021 18:11:00 -0500</pubDate><guid>https://codepros.org/blog/quick-recap-single-multi-core/</guid><category>Parallelism</category><category>Concurrency</category><category>computing-basics</category><category>beginner</category><category>parallel-programming</category><category>multi-core processing</category><category>mpdc</category><description>&lt;p>Wow, did this guy run out of material already? I thought he was going to talk
about AI, cybersecurity, and distributed computing. I had such high hopes.&lt;/p>
&lt;p>&lt;img class="img-fluid"
src="images/deadinside.webp#center"
sizes="(max-width: 768px) 100vw, 768px"
alt="Michael Scott from the office saying &amp;amp;ldquo;I&amp;amp;rsquo;m Dead Inside&amp;amp;rdquo;"
loading="lazy"
decoding="async"
/>&lt;/p>
&lt;p>I’m going to run through a quick recap of the evolution from single- to
multi-core processing. This recap will likely be review for some of you, but the
concepts here are going to be very important when we talk about
&lt;a
href="https://codepros.org/tags/mpdc/"
>mpdc&lt;/a>
.&lt;/p></description></item><item><title>Applied Artificial Intelligence &amp; Cybersecurity Research; What Could Be Better?</title><link>https://codepros.org/blog/applied-artificial-intelligence-what-could-be-better/</link><pubDate>Sun, 07 Feb 2021 10:36:07 -0500</pubDate><guid>https://codepros.org/blog/applied-artificial-intelligence-what-could-be-better/</guid><category>artificial-intelligence</category><category>cybersecurity</category><category>blog</category><category>google-go</category><category>mpdc</category><description>&lt;p>&lt;picture>
&lt;source type="image/webp"
srcset="https://codepros.org/blog/applied-artificial-intelligence-what-could-be-better/images/troll_hu_24882c86b856a21c.webp 1x"
sizes="(max-width: 768px) 100vw, 768px">
&lt;img class="img-fluid float-end me-3 mb-3"
src="https://codepros.org/blog/applied-artificial-intelligence-what-could-be-better/images/troll_hu_38310c3a5584e546.png"
srcset="https://codepros.org/blog/applied-artificial-intelligence-what-could-be-better/images/troll_hu_38310c3a5584e546.png 1x"
sizes="(max-width: 768px) 100vw, 768px"
width="150"
height="121"
alt="artistic representation of an internet troll grinning"
loading="lazy"
decoding="async"
style="max-width: 150px" />
&lt;/picture>
Most of you are likely going to ask: are &lt;em>you&lt;/em> seriously staring a blog in 2021?
Surely, being in tech, you know there are new social platforms that are less
boring, right?
Absolutely, I plan on making full use of those, too. This way, though, you’re
able to copy and paste my code, just like you do with stack overflow.&lt;/p></description></item></channel></rss>