Help
RSS
API
Feed
Maltego
Contact
Domain > www.graymatterdeveloper.com
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2017-10-05
54.75.229.55
(
ClassC
)
2024-07-12
185.199.109.153
(
ClassC
)
Port 80
HTTP/1.1 301 Moved PermanentlyConnection: keep-aliveContent-Length: 162Server: GitHub.comContent-Type: text/htmlLocation: https://www.graymatterdeveloper.com/x-hosts-log-append: pages_hosts_ips:X-GitHub-Request-Id: 61AB:26A47D:2278D5:22EF3C:6691C291Accept-Ranges: bytesAge: 0Date: Fri, 12 Jul 2024 23:56:01 GMTVia: 1.1 varnishX-Served-By: cache-bfi-krnt7300023-BFIX-Cache: MISSX-Cache-Hits: 0X-Timer: S1720828562.754137,VS0,VE62Vary: Accept-EncodingX-Fastly-Request-ID: e64995f99f89d60bbb4d3516a906ff7404491dff html>head>title>301 Moved Permanently/title>/head>body>center>h1>301 Moved Permanently/h1>/center>hr>center>nginx/center>/body>/html>
Port 443
HTTP/1.1 200 OKConnection: keep-aliveContent-Length: 45801Server: GitHub.comContent-Type: text/html; charsetutf-8Last-Modified: Tue, 12 Dec 2023 22:42:44 GMTAccess-Control-Allow-Origin: *ETag: 6578e1e4-b2e9expires: Sat, 13 Jul 2024 00:06:01 GMTCache-Control: max-age600x-hosts-log-append: pages_hosts_ips:x-proxy-cache: MISSX-GitHub-Request-Id: 31D8:66999:218AA6:220177:6691C291Accept-Ranges: bytesAge: 0Date: Fri, 12 Jul 2024 23:56:01 GMTVia: 1.1 varnishX-Served-By: cache-bfi-krnt7300049-BFIX-Cache: MISSX-Cache-Hits: 0X-Timer: S1720828562.869339,VS0,VE65Vary: Accept-EncodingX-Fastly-Request-ID: 2dea2056e5f5b79caa36d1be81faff4041d0c846 !DOCTYPE html>html langen data-themelight>head>meta charsetUTF-8>meta http-equivX-UA-Compatible contentIEedge>meta nameviewport contentwidthdevice-width, initial-scale1.0,viewport-fitcover>title>Graymatter Developer - Hi! My name is Michael. I sometimes write code :)/title>meta nameauthor contentMichael Yarichuk>meta namecopyright contentMichael Yarichuk>meta nameformat-detection contenttelephoneno>meta nametheme-color content#ffffff>meta namedescription contentA place to share steps in my journey to become a better professional>meta propertyog:type contentwebsite>meta propertyog:title contentGraymatter Developer>meta propertyog:url contenthttps://www.graymatterdeveloper.com/index.html>meta propertyog:site_name contentGraymatter Developer>meta propertyog:description contentA place to share steps in my journey to become a better professional>meta propertyog:locale contenten_US>meta propertyog:image contenthttps://avatars.githubusercontent.com/u/1473701>meta propertyarticle:author contentMichael Yarichuk>meta propertyarticle:tag contentC#>meta propertyarticle:tag contentProgramming>meta propertyarticle:tag content.Net>meta propertyarticle:tag content.Net Core>meta propertyarticle:tag contentTech>meta propertyarticle:tag contentSoftware Development>meta propertyarticle:tag contentDebugging>meta propertyarticle:tag contentWinDBG>meta propertyarticle:tag contentGDB>meta propertyarticle:tag contentWindows>meta propertyarticle:tag contentLinux>meta nametwitter:card contentsummary>meta nametwitter:image contenthttps://avatars.githubusercontent.com/u/1473701>link relshortcut icon href/img/favicon.ico>link relcanonical hrefhttps://www.graymatterdeveloper.com/index.html>link relpreconnect href//cdn.jsdelivr.net/>link relpreconnect href//www.google-analytics.com crossorigin/>link relpreconnect href//busuanzi.ibruce.info/>link relstylesheet href/css/index.css>link relstylesheet hrefhttps://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free/css/all.min.css>link relstylesheet hrefhttps://cdn.jsdelivr.net/npm/@fancyapps/ui/dist/fancybox/fancybox.min.css mediaprint onloadthis.mediaall>script asyncasync srchttps://www.googletagmanager.com/gtag/js?idUA-125949801-1>/script>script>window.dataLayer window.dataLayer || ;function gtag(){dataLayer.push(arguments);}gtag(js, new Date());gtag(config, UA-125949801-1);/script>script>const GLOBAL_CONFIG { root: /, algolia: undefined, localSearch: {path:/search.xml,languages:{hits_empty:We didnt find any results for the search: ${query},hits_stats:${hits} results found}}, translate: undefined, noticeOutdate: undefined, highlight: {plugin:highlight.js,highlightCopy:true,highlightLang:true,highlightHeightLimit:false}, copy: { success: Copy Successful, error: Copy Error, noSupport: Browser Not Supported }, relativeDate: { homepage: false, post: false }, runtime: , dateSuffix: { just: Just now, min: minutes ago, hour: hours ago, day: days ago, month: months ago }, copyright: undefined, lightbox: fancybox, Snackbar: undefined, infinitegrid: { js: https://cdn.jsdelivr.net/npm/@egjs/infinitegrid/dist/infinitegrid.min.js, buttonText: Load More }, isPhotoFigcaption: false, islazyload: false, isAnchor: false, percent: { toc: true, rightside: false, }, autoDarkmode: false}/script>script idconfig-diff>var GLOBAL_CONFIG_SITE { title: Graymatter Developer, isPost: false, isHome: true, isHighlightShrink: false, isToc: false, postUpdate: 2023-12-12 22:42:26}/script>script>(win>{ win.saveToLocal { set: (key, value, ttl) > { if (ttl 0) return const now Date.now() const expiry now + ttl * 86400000 const item { value, expiry } localStorage.setItem(key, JSON.stringify(item)) }, get: key > { const itemStr localStorage.getItem(key) if (!itemStr) { return undefined } const item JSON.parse(itemStr) const now Date.now() if (now > item.expiry) { localStorage.removeItem(key) return undefined } return item.value } } win.getScript (url, attr {}) > new Promise((resolve, reject) > { const script document.createElement(script) script.src url script.async true script.onerror reject script.onload script.onreadystatechange function() { const loadState this.readyState if (loadState && loadState ! loaded && loadState ! complete) return script.onload script.onreadystatechange null resolve() } Object.keys(attr).forEach(key > { script.setAttribute(key, attrkey) }) document.head.appendChild(script) }) win.getCSS (url, id false) > new Promise((resolve, reject) > { const link document.createElement(link) link.rel stylesheet link.href url if (id) link.id id link.onerror reject link.onload link.onreadystatechange function() { const loadState this.readyState if (loadState && loadState ! loaded && loadState ! complete) return link.onload link.onreadystatechange null resolve() } document.head.appendChild(link) }) const asideStatus saveToLocal.get(aside-status) if (asideStatus ! undefined) { if (asideStatus hide) { document.documentElement.classList.add(hide-aside) } else { document.documentElement.classList.remove(hide-aside) } } const detectApple () > { if(/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)){ document.documentElement.classList.add(apple) } } detectApple() })(window)/script>meta namegenerator contentHexo 5.4.2>link relalternate href/atom.xml titleGraymatter Developer typeapplication/atom+xml>/head>body>div idloading-box>div classloading-left-bg>/div>div classloading-right-bg>/div>div classspinner-box>div classconfigure-border-1>div classconfigure-core>/div>/div>div classconfigure-border-2>div classconfigure-core>/div>/div>div classloading-word>Loading.../div>/div>/div>script>(()>{ const $loadingBox document.getElementById(loading-box) const $body document.body const preloader { endLoading: () > { $body.style.overflow $loadingBox.classList.add(loaded) }, initLoading: () > { $body.style.overflow hidden $loadingBox.classList.remove(loaded) } } preloader.initLoading() window.addEventListener(load,() > { preloader.endLoading() }) if (false) { document.addEventListener(pjax:send, () > { preloader.initLoading() }) document.addEventListener(pjax:complete, () > { preloader.endLoading() }) }})()/script>div idsidebar>div idmenu-mask>/div>div idsidebar-menus>div classavatar-img is-center>img srchttps://avatars.githubusercontent.com/u/1473701 onerroronerrornull;src/img/friend_404.gif altavatar/>/div>div classsidebar-site-data site-data is-center>a href/archives/>div classheadline>Articles/div>div classlength-num>33/div>/a>a href/tags/>div classheadline>Tags/div>div classlength-num>43/div>/a>a href/categories/>div classheadline>Categories/div>div classlength-num>15/div>/a>/div>hr classcustom-hr/>div classmenus_items>div classmenus_item>a classsite-page href/>i classfa-fw fa fa-home>/i>span> Home/span>/a>/div>div classmenus_item>a classsite-page href/archives/>i classfa-fw fa fa-archive>/i>span> Archives/span>/a>/div>div classmenus_item>a classsite-page href/categories/>i classfa-fw fa fa-folder-open>/i>span> Categories/span>/a>/div>div classmenus_item>a classsite-page href/tags/>i classfa-fw fa fa-tag>/i>span> Tags/span>/a>/div>div classmenus_item>a classsite-page href/contact/>i classfa-fw fa fa-envelope-open>/i>span> Contact/span>/a>/div>div classmenus_item>a classsite-page href/about/>i classfa-fw fa fa-heart>/i>span> About/span>/a>/div>/div>/div>/div>div classpage idbody-wrap>header classfull_page idpage-header stylebackground-image: url(/img/coding-background.jpg)>nav idnav>span idblog-info>a href/ titleGraymatter Developer>span classsite-name>Graymatter Developer/span>/a>/span>div idmenus>div idsearch-button>a classsite-page social-icon search hrefjavascript:void(0);>i classfas fa-search fa-fw>/i>span> Search/span>/a>/div>div classmenus_items>div classmenus_item>a classsite-page href/>i classfa-fw fa fa-home>/i>span> Home/span>/a>/div>div classmenus_item>a classsite-page href/archives/>i classfa-fw fa fa-archive>/i>span> Archives/span>/a>/div>div classmenus_item>a classsite-page href/categories/>i classfa-fw fa fa-folder-open>/i>span> Categories/span>/a>/div>div classmenus_item>a classsite-page href/tags/>i classfa-fw fa fa-tag>/i>span> Tags/span>/a>/div>div classmenus_item>a classsite-page href/contact/>i classfa-fw fa fa-envelope-open>/i>span> Contact/span>/a>/div>div classmenus_item>a classsite-page href/about/>i classfa-fw fa fa-heart>/i>span> About/span>/a>/div>/div>div idtoggle-menu>a classsite-page hrefjavascript:void(0);>i classfas fa-bars fa-fw>/i>/a>/div>/div>/nav>div idsite-info>h1 idsite-title>Graymatter Developer/h1>div idsite-subtitle>span idsubtitle>/span>/div>div idsite_social_icons>a classsocial-icon hrefhttps://github.com/myarichuk target_blank title>i classfa-brands fa-github>/i>/a>a classsocial-icon hrefmailto:michael.yarichuk@gmail.com target_blank title>i classfa fa-envelope>/i>/a>a classsocial-icon hrefhttps://twitter.com/myarichuk target_blank title>i classfa-brands fa-twitter>/i>/a>a classsocial-icon hrefhttps://www.linkedin.com/in/myarichuk/ target_blank title>i classfa-brands fa-linkedin>/i>/a>a classsocial-icon href/atom.xml target_blank title>i classfa fa-rss>/i>/a>/div>/div>div idscroll-down>i classfas fa-angle-down scroll-down-effects>/i>/div>/header>main classlayout idcontent-inner>div classrecent-posts idrecent-posts>div classrecent-post-item>div classpost_cover left>a href/2023/12/12/works-on-my-machine/ titleWorks On My Machine(tm)>img classpost-bg src/2023/12/12/works-on-my-machine/cover.jpg onerrorthis.onerrornull;this.src/img/404.jpg altWorks On My Machine(tm)>/a>/div>div classrecent-post-info>a classarticle-title href/2023/12/12/works-on-my-machine/ titleWorks On My Machine(tm)>Works On My Machine(tm)/a>div classarticle-meta-wrap>span classpost-meta-date>i classfar fa-calendar-alt>/i>span classarticle-meta-label>Created/span>time datetime2023-12-12T20:56:29.000Z titleCreated 2023-12-12 20:56:29>2023-12-12/time>/span>span classarticle-meta>span classarticle-meta-separator>|/span>i classfas fa-inbox>/i>a classarticle-meta__categories href/categories/Programming/>Programming/a>i classfas fa-angle-right article-meta-link>/i>a classarticle-meta__categories href/categories/Programming/Debugging/>Debugging/a>/span>/div>div classcontent>Oh, but it works on my machine! What gives?! Today, I found myself asking the uncaring monitor over and over again, while adding logs and going over existing ones, meditating over code while making sure I didn’t do any silly mistakes and overall being frustrated. It’s these kinds of head-scratchers that remind us why debugging is both an art and a science.The Unseen CulpritPicture this: a seemingly innocuous orchestrator service, working perfectly in the local environment, suddenly throws a tan .../div>/div>/div>div classrecent-post-item>div classpost_cover right>a href/2023/12/09/mocking-http/ titleMocking HttpClient the simple way>img classpost-bg src/2023/12/09/mocking-http/mock-http.jpg onerrorthis.onerrornull;this.src/img/404.jpg altMocking HttpClient the simple way>/a>/div>div classrecent-post-info>a classarticle-title href/2023/12/09/mocking-http/ titleMocking HttpClient the simple way>Mocking HttpClient the simple way/a>div classarticle-meta-wrap>span classpost-meta-date>i classfar fa-calendar-alt>/i>span classarticle-meta-label>Created/span>time datetime2023-12-09T14:06:32.000Z titleCreated 2023-12-09 14:06:32>2023-12-09/time>/span>span classarticle-meta>span classarticle-meta-separator>|/span>i classfas fa-inbox>/i>a classarticle-meta__categories href/categories/Programming/>Programming/a>/span>/div>div classcontent>Ever found yourself deep in unit tests, only to realize you need to mock an HttpClient? Yep, we’ve all been there. There are many ways of doing it, but which way is the best? Let me show you a straightforward yet flexible way to mock HttpClient. It’s simple, effective, and it’s going to make your life a whole lot easier.So, let’s begin with implementing two helpers, which will be useful in setting up our mocks.First, we create a custom HttpMessageHandler to intercept and handle HTTP requests i .../div>/div>/div>div classrecent-post-item>div classpost_cover left>a href/2023/11/18/production-ready-testing/ titleProduction Ready Non-Negotiable: Comprehensive Testing>img classpost-bg src/2023/11/18/production-ready-testing/production-ready-testing.jpg onerrorthis.onerrornull;this.src/img/404.jpg altProduction Ready Non-Negotiable: Comprehensive Testing>/a>/div>div classrecent-post-info>a classarticle-title href/2023/11/18/production-ready-testing/ titleProduction Ready Non-Negotiable: Comprehensive Testing>Production Ready Non-Negotiable: Comprehensive Testing/a>div classarticle-meta-wrap>span classpost-meta-date>i classfar fa-calendar-alt>/i>span classarticle-meta-label>Created/span>time datetime2023-11-18T17:31:25.000Z titleCreated 2023-11-18 17:31:25>2023-11-18/time>/span>span classarticle-meta>span classarticle-meta-separator>|/span>i classfas fa-inbox>/i>a classarticle-meta__categories href/categories/Programming/>Programming/a>i classfas fa-angle-right article-meta-link>/i>a classarticle-meta__categories href/categories/Programming/Best-Practices/>Best Practices/a>/span>/div>div classcontent>Let’s delve into the most crucial, non-negotiable aspect of production-ready systems: Testing.In my experience, opinions on testing vary widely, but unfortunately, some undervalue its importance or worse, take it for granted. I firmly believe that tests are indispensable; they act as a safety net, catching bugs before they can wreak havoc on a production system.It may sound cliché, but this analogy accurately reflects reality.So, let’s begin with some taxonomy. Testing realm is a big one, but b .../div>/div>/div>div classrecent-post-item>div classpost_cover right>a href/2023/11/15/production-ready-memory-dumps/ titleProduction Ready Non-Negotiable: Memory Dump Tooling>img classpost-bg src/2023/11/15/production-ready-memory-dumps/production-ready-memory-dump.jpg onerrorthis.onerrornull;this.src/img/404.jpg altProduction Ready Non-Negotiable: Memory Dump Tooling>/a>/div>div classrecent-post-info>a classarticle-title href/2023/11/15/production-ready-memory-dumps/ titleProduction Ready Non-Negotiable: Memory Dump Tooling>Production Ready Non-Negotiable: Memory Dump Tooling/a>div classarticle-meta-wrap>span classpost-meta-date>i classfar fa-calendar-alt>/i>span classarticle-meta-label>Created/span>time datetime2023-11-15T22:19:28.000Z titleCreated 2023-11-15 22:19:28>2023-11-15/time>/span>span classarticle-meta>span classarticle-meta-separator>|/span>i classfas fa-inbox>/i>a classarticle-meta__categories href/categories/Programming/>Programming/a>i classfas fa-angle-right article-meta-link>/i>a classarticle-meta__categories href/categories/Programming/Best-Practices/>Best Practices/a>/span>/div>div classcontent>Local debugging? That’s easy. You’ve got your breakpoints, variable inspections, and on-the-fly state changes, provided you’ve got the right tools and know-how for your programming language.But here’s a fun question: what if you hit a memory leak or a process crash a week into production? Even worse, in a complex system where recreating the issue is like finding a needle in a haystack. So, what do we do? Enter memory dumps.What Are Memory Dumps?Think of a memory dump like a snapshot of your ap .../div>/div>/div>div classrecent-post-item>div classpost_cover left>a href/2023/11/15/production-ready-performance-metrics/ titleProduction Ready Non-Negotiable: Performance Metrics>img classpost-bg src/2023/11/15/production-ready-performance-metrics/production-ready-performance.jpg onerrorthis.onerrornull;this.src/img/404.jpg altProduction Ready Non-Negotiable: Performance Metrics>/a>/div>div classrecent-post-info>a classarticle-title href/2023/11/15/production-ready-performance-metrics/ titleProduction Ready Non-Negotiable: Performance Metrics>Production Ready Non-Negotiable: Performance Metrics/a>div classarticle-meta-wrap>span classpost-meta-date>i classfar fa-calendar-alt>/i>span classarticle-meta-label>Created/span>time datetime2023-11-15T17:43:55.000Z titleCreated 2023-11-15 17:43:55>2023-11-15/time>/span>span classarticle-meta>span classarticle-meta-separator>|/span>i classfas fa-inbox>/i>a classarticle-meta__categories href/categories/Programming/>Programming/a>i classfas fa-angle-right article-meta-link>/i>a classarticle-meta__categories href/categories/Programming/Best-Practices/>Best Practices/a>/span>/div>div classcontent>Here’s a curious challenge I faced at Hibernating Rhinos, as part of the core team for the NoSQL database - RavenDB. We received a support ticket that was puzzling: why was a query, pulling roughly 100 results, taking several seconds to complete? This was odd, especially given the database’s modest size and the use of a local network.Investigation Kicks OffThis conundrum landed on my desk. Fortunately, I was able to replicate the issue on my system. My first step? Checking the query’s performan .../div>/div>/div>div classrecent-post-item>div classpost_cover right>a href/2023/11/14/production-ready-logging-monitoring/ titleProduction Ready Non-Negotiable: Structured Logging and Monitoring>img classpost-bg src/2023/11/14/production-ready-logging-monitoring/production-ready-2.jpg onerrorthis.onerrornull;this.src/img/404.jpg altProduction Ready Non-Negotiable: Structured Logging and Monitoring>/a>/div>div classrecent-post-info>a classarticle-title href/2023/11/14/production-ready-logging-monitoring/ titleProduction Ready Non-Negotiable: Structured Logging and Monitoring>Production Ready Non-Negotiable: Structured Logging and Monitoring/a>div classarticle-meta-wrap>span classpost-meta-date>i classfar fa-calendar-alt>/i>span classarticle-meta-label>Created/span>time datetime2023-11-14T23:00:00.000Z titleCreated 2023-11-14 23:00:00>2023-11-14/time>/span>span classarticle-meta>span classarticle-meta-separator>|/span>i classfas fa-inbox>/i>a classarticle-meta__categories href/categories/Programming/>Programming/a>i classfas fa-angle-right article-meta-link>/i>a classarticle-meta__categories href/categories/Programming/Best-Practices/>Best Practices/a>/span>/div>div classcontent>Hey there! In the previous post of the series, we introduced the concept of production-ready software and mentioned that there are several non-negotiable elements that must be present in such a system.So, let’s take a look at the first non-negotiable - the unsung heroes of any software system. Structured logging and Monitoring.Oh, but we have logging; it’s just some text that we print when stuff happens. Why complicate things?, you might ask. And monitoring? Why would we need that? We have alr .../div>/div>/div>div classrecent-post-item>div classpost_cover left>a href/2023/11/14/production-ready-intro/ titleProduction-Ready Software: Introduction>img classpost-bg src/2023/11/14/production-ready-intro/production_ready_background.jpg onerrorthis.onerrornull;this.src/img/404.jpg altProduction-Ready Software: Introduction>/a>/div>div classrecent-post-info>a classarticle-title href/2023/11/14/production-ready-intro/ titleProduction-Ready Software: Introduction>Production-Ready Software: Introduction/a>div classarticle-meta-wrap>span classpost-meta-date>i classfar fa-calendar-alt>/i>span classarticle-meta-label>Created/span>time datetime2023-11-14T19:15:48.000Z titleCreated 2023-11-14 19:15:48>2023-11-14/time>/span>span classarticle-meta>span classarticle-meta-separator>|/span>i classfas fa-inbox>/i>a classarticle-meta__categories href/categories/Programming/>Programming/a>i classfas fa-angle-right article-meta-link>/i>a classarticle-meta__categories href/categories/Programming/Best-Practices/>Best Practices/a>/span>/div>div classcontent>In the tech world, the term ‘production-ready’ often gets tossed around, sometimes more like a hot potato than a clear standard. But what does it really mean? It seems like everyone has their own take, often shrouded in personal biases or cloaked in industry jargon.In this post series, I will try to cut through the fluff and the corporate speak, because, let’s be honest, best practices do not have to be complex or hard to understand.The Essence of Production-ReadinessBefore anything else, *pro .../div>/div>/div>div classrecent-post-item>div classpost_cover right>a href/2023/11/10/responsibility-chain/ titleTaming Complexity with Responsibility>img classpost-bg src/2023/11/10/responsibility-chain/cover.jpg onerrorthis.onerrornull;this.src/img/404.jpg altTaming Complexity with Responsibility>/a>/div>div classrecent-post-info>a classarticle-title href/2023/11/10/responsibility-chain/ titleTaming Complexity with Responsibility>Taming Complexity with Responsibility/a>div classarticle-meta-wrap>span classpost-meta-date>i classfar fa-calendar-alt>/i>span classarticle-meta-label>Created/span>time datetime2023-11-10T23:00:00.000Z titleCreated 2023-11-10 23:00:00>2023-11-10/time>/span>span classarticle-meta>span classarticle-meta-separator>|/span>i classfas fa-inbox>/i>a classarticle-meta__categories href/categories/Programming/>Programming/a>i classfas fa-angle-right article-meta-link>/i>a classarticle-meta__categories href/categories/Programming/Design-Patterns/>Design Patterns/a>/span>/div>div classcontent>Imagine, one quiet morning, your boss comes to you and says, “Hey, our web shop is growing and we will be having more than one delivery provider now. Can you implement something that would select the best provider after a client pays for a delivery?”.After some back and forth about the criteria on how a delivery company should be selected - mostly by package size, weight and delivery company area, you set out to write the code. How hard can it be? Just write a few if statements, and that’s it, r .../div>/div>/div>div classrecent-post-item>div classpost_cover left>a href/2023/11/09/ecs-intro/ titleFrom Inheritance Hell to Component Heaven, the ECS Pattern>img classpost-bg srchttps://cdn.jsdelivr.net/gh/jerryc127/CDN@latest/cover/default_bg.png onerrorthis.onerrornull;this.src/img/404.jpg altFrom Inheritance Hell to Component Heaven, the ECS Pattern>/a>/div>div classrecent-post-info>a classarticle-title href/2023/11/09/ecs-intro/ titleFrom Inheritance Hell to Component Heaven, the ECS Pattern>From Inheritance Hell to Component Heaven, the ECS Pattern/a>div classarticle-meta-wrap>span classpost-meta-date>i classfar fa-calendar-alt>/i>span classarticle-meta-label>Created/span>time datetime2023-11-09T23:00:00.000Z titleCreated 2023-11-09 23:00:00>2023-11-09/time>/span>span classarticle-meta>span classarticle-meta-separator>|/span>i classfas fa-inbox>/i>a classarticle-meta__categories href/categories/Programming/>Programming/a>i classfas fa-angle-right article-meta-link>/i>a classarticle-meta__categories href/categories/Programming/Design-Patterns/>Design Patterns/a>/span>/div>div classcontent>All you need is love and Object-Oriented, right? Right?Object-Oriented programming is one of the most widely used programming paradigms. It’s flexible, powerful, and has proven its worth over the years. However, as with any tool, there are situations where it might not be the best fit. In some cases, using an Object-Oriented approach can result in code that’s hard to maintain and overly complex.Let’s say we’re developing a game and we want to add magic weapons. It should be trivial to create a .../div>/div>/div>div classrecent-post-item>div classpost_cover right>a href/2023/11/08/templates-ftw/ titleDisentangling the Spaghetti Monster>img classpost-bg src/2023/11/08/templates-ftw/cover.png onerrorthis.onerrornull;this.src/img/404.jpg altDisentangling the Spaghetti Monster>/a>/div>div classrecent-post-info>a classarticle-title href/2023/11/08/templates-ftw/ titleDisentangling the Spaghetti Monster>Disentangling the Spaghetti Monster/a>div classarticle-meta-wrap>span classpost-meta-date>i classfar fa-calendar-alt>/i>span classarticle-meta-label>Created/span>time datetime2023-11-08T19:15:48.000Z titleCreated 2023-11-08 19:15:48>2023-11-08/time>/span>span classarticle-meta>span classarticle-meta-separator>|/span>i classfas fa-inbox>/i>a classarticle-meta__categories href/categories/Programming/>Programming/a>i classfas fa-angle-right article-meta-link>/i>a classarticle-meta__categories href/categories/Programming/Design-Patterns/>Design Patterns/a>/span>/div>div classcontent>In this blog post, we will explore the practical application of a specific design pattern. To illustrate its usefulness, we will gradually reveal the problem in an “organic” manner, simulating how one might encounter such an issue in their daily programming tasks.The What and WhyPicture this: you’re working on a music streaming platform, and you already implemented live and offline playback, search functionality, and user ratings. The last piece of the puzzle? Playlist suggestions based on user .../div>/div>/div>nav idpagination>div classpagination>span classpage-number current>1/span>a classpage-number href/page/2/#content-inner>2/a>span classspace>…/span>a classpage-number href/page/4/#content-inner>4/a>a classextend next relnext href/page/2/#content-inner>i classfas fa-chevron-right fa-fw>/i>/a>/div>/nav>/div>div classaside-content idaside-content>div classcard-widget card-info>div classis-center>div classavatar-img>img srchttps://avatars.githubusercontent.com/u/1473701 onerrorthis.onerrornull;this.src/img/friend_404.gif altavatar/>/div>div classauthor-info__name>Michael Yarichuk/div>div classauthor-info__description>A place to share steps in my journey to become a better professional/div>/div>div classcard-info-data site-data is-center>a href/archives/>div classheadline>Articles/div>div classlength-num>33/div>/a>a href/tags/>div classheadline>Tags/div>div classlength-num>43/div>/a>a href/categories/>div classheadline>Categories/div>div classlength-num>15/div>/a>/div>a idcard-info-btn target_blank relnoopener hrefhttps://github.com/myarichuk>i classfab fa-github>/i>span>Follow Me/span>/a>div classcard-info-social-icons is-center>a classsocial-icon hrefhttps://github.com/myarichuk target_blank title>i classfa-brands fa-github>/i>/a>a classsocial-icon hrefmailto:michael.yarichuk@gmail.com target_blank title>i classfa fa-envelope>/i>/a>a classsocial-icon hrefhttps://twitter.com/myarichuk target_blank title>i classfa-brands fa-twitter>/i>/a>a classsocial-icon hrefhttps://www.linkedin.com/in/myarichuk/ target_blank title>i classfa-brands fa-linkedin>/i>/a>a classsocial-icon href/atom.xml target_blank title>i classfa fa-rss>/i>/a>/div>/div>div classsticky_layout>div classcard-widget card-recent-post>div classitem-headline>i classfas fa-history>/i>span>Recent Post/span>/div>div classaside-list>div classaside-list-item>a classthumbnail href/2023/12/12/works-on-my-machine/ titleWorks On My Machine(tm)>img src/2023/12/12/works-on-my-machine/cover.jpg onerrorthis.onerrornull;this.src/img/404.jpg altWorks On My Machine(tm)/>/a>div classcontent>a classtitle href/2023/12/12/works-on-my-machine/ titleWorks On My Machine(tm)>Works On My Machine(tm)/a>time datetime2023-12-12T20:56:29.000Z titleCreated 2023-12-12 20:56:29>2023-12-12/time>/div>/div>div classaside-list-item>a classthumbnail href/2023/12/09/mocking-http/ titleMocking HttpClient the simple way>img src/2023/12/09/mocking-http/mock-http.jpg onerrorthis.onerrornull;this.src/img/404.jpg altMocking HttpClient the simple way/>/a>div classcontent>a classtitle href/2023/12/09/mocking-http/ titleMocking HttpClient the simple way>Mocking HttpClient the simple way/a>time datetime2023-12-09T14:06:32.000Z titleCreated 2023-12-09 14:06:32>2023-12-09/time>/div>/div>div classaside-list-item>a classthumbnail href/2023/11/18/production-ready-testing/ titleProduction Ready Non-Negotiable: Comprehensive Testing>img src/2023/11/18/production-ready-testing/production-ready-testing.jpg onerrorthis.onerrornull;this.src/img/404.jpg altProduction Ready Non-Negotiable: Comprehensive Testing/>/a>div classcontent>a classtitle href/2023/11/18/production-ready-testing/ titleProduction Ready Non-Negotiable: Comprehensive Testing>Production Ready Non-Negotiable: Comprehensive Testing/a>time datetime2023-11-18T17:31:25.000Z titleCreated 2023-11-18 17:31:25>2023-11-18/time>/div>/div>div classaside-list-item>a classthumbnail href/2023/11/15/production-ready-memory-dumps/ titleProduction Ready Non-Negotiable: Memory Dump Tooling>img src/2023/11/15/production-ready-memory-dumps/production-ready-memory-dump.jpg onerrorthis.onerrornull;this.src/img/404.jpg altProduction Ready Non-Negotiable: Memory Dump Tooling/>/a>div classcontent>a classtitle href/2023/11/15/production-ready-memory-dumps/ titleProduction Ready Non-Negotiable: Memory Dump Tooling>Production Ready Non-Negotiable: Memory Dump Tooling/a>time datetime2023-11-15T22:19:28.000Z titleCreated 2023-11-15 22:19:28>2023-11-15/time>/div>/div>div classaside-list-item>a classthumbnail href/2023/11/15/production-ready-performance-metrics/ titleProduction Ready Non-Negotiable: Performance Metrics>img src/2023/11/15/production-ready-performance-metrics/production-ready-performance.jpg onerrorthis.onerrornull;this.src/img/404.jpg altProduction Ready Non-Negotiable: Performance Metrics/>/a>div classcontent>a classtitle href/2023/11/15/production-ready-performance-metrics/ titleProduction Ready Non-Negotiable: Performance Metrics>Production Ready Non-Negotiable: Performance Metrics/a>time datetime2023-11-15T17:43:55.000Z titleCreated 2023-11-15 17:43:55>2023-11-15/time>/div>/div>/div>/div>div classcard-widget card-categories>div classitem-headline> i classfas fa-folder-open>/i> span>Categories/span> a classcard-more-btn href/categories/ titleView More> i classfas fa-angle-right>/i>/a> /div> ul classcard-category-list idaside-cat-list> li classcard-category-list-item >a classcard-category-list-link href/categories/Debugging/>span classcard-category-list-name>Debugging/span>span classcard-category-list-count>4/span>/a>ul classcard-category-list child>li classcard-category-list-item >a classcard-category-list-link href/categories/Debugging/Post-mortem/>span classcard-category-list-name>Post-mortem/span>span classcard-category-list-count>3/span>/a>/li>/ul>/li>li classcard-category-list-item >a classcard-category-list-link href/categories/Meta/>span classcard-category-list-name>Meta/span>span classcard-category-list-count>2/span>/a>/li>li classcard-category-list-item >a classcard-category-list-link href/categories/Programming/>span classcard-category-list-name>Programming/span>span classcard-category-list-count>27/span>/a>ul classcard-category-list child>li classcard-category-list-item >a classcard-category-list-link href/categories/Programming/Architecture/>span classcard-category-list-name>Architecture/span>span classcard-category-list-count>1/span>/a>/li>li classcard-category-list-item >a classcard-category-list-link href/categories/Programming/Best-Practices/>span classcard-category-list-name>Best Practices/span>span classcard-category-list-count>5/span>/a>/li>li classcard-category-list-item >a classcard-category-list-link href/categories/Programming/C/>span classcard-category-list-name>C#/span>span classcard-category-list-count>1/span>/a>ul classcard-category-list child>li classcard-category-list-item >a classcard-category-list-link href/categories/Programming/C/ASP-Net/>span classcard-category-list-name>ASP.Net/span>span classcard-category-list-count>1/span>/a>/li>/ul>/li>/ul>/li> /ul>/div>div classcard-widget card-tags>div classitem-headline>i classfas fa-tags>/i>span>Tags/span>/div>div classcard-tag-cloud>a href/tags/Net/ stylefont-size: 1.21em; color: #999ea4>.Net/a> a href/tags/ANTLR/ stylefont-size: 1.16em; color: #999b9e>ANTLR/a> a href/tags/ASP-Net-Core/ stylefont-size: 1.1em; color: #999>ASP.Net Core/a> a href/tags/Architecture/ stylefont-size: 1.27em; color: #99a0a9>Architecture/a> a href/tags/Async/ stylefont-size: 1.1em; color: #999>Async/a> a href/tags/Blog/ stylefont-size: 1.16em; color: #999b9e>Blog/a> a href/tags/C/ stylefont-size: 1.5em; color: #99a9bf>C#/a> a href/tags/C/ stylefont-size: 1.39em; color: #99a4b4>C++/a> a href/tags/C-Templates/ stylefont-size: 1.1em; color: #999>C++ Templates/a> a href/tags/CMake/ stylefont-size: 1.21em; color: #999ea4>CMake/a> a href/tags/Debugging/ stylefont-size: 1.39em; color: #99a4b4>Debugging/a> a href/tags/Design-Patterns/ stylefont-size: 1.21em; color: #999ea4>Design Patterns/a> a href/tags/DevOps/ stylefont-size: 1.33em; color: #99a2af>DevOps/a> a href/tags/Entity-Component-System/ stylefont-size: 1.1em; color: #999>Entity Component System/a> a href/tags/Event-handling/ stylefont-size: 1.1em; color: #999>Event-handling/a> a href/tags/Framework/ stylefont-size: 1.1em; color: #999>Framework/a> a href/tags/Gang-Of-Four/ stylefont-size: 1.16em; color: #999b9e>Gang Of Four/a> a href/tags/Gdb/ stylefont-size: 1.1em; color: #999>Gdb/a> a href/tags/Gotcha/ stylefont-size: 1.16em; color: #999b9e>Gotcha/a> a href/tags/Hexo-io/ stylefont-size: 1.16em; color: #999b9e>Hexo.io/a> a href/tags/IOC-DI/ stylefont-size: 1.1em; color: #999>IOC/DI/a> a href/tags/LLDB/ stylefont-size: 1.1em; color: #999>LLDB/a> a href/tags/Linux/ stylefont-size: 1.16em; color: #999b9e>Linux/a> a href/tags/MassTransit/ stylefont-size: 1.1em; color: #999>MassTransit/a> a href/tags/Microservices/ stylefont-size: 1.1em; color: #999>Microservices/a> a href/tags/Middleware/ stylefont-size: 1.1em; color: #999>Middleware/a> a href/tags/Multithreading/ stylefont-size: 1.1em; color: #999>Multithreading/a> a href/tags/OpenCV/ stylefont-size: 1.16em; color: #999b9e>OpenCV/a> a href/tags/Optimization/ stylefont-size: 1.33em; color: #99a2af>Optimization/a> a href/tags/Package-Management/ stylefont-size: 1.1em; color: #999>Package Management/a> a href/tags/Parsers/ stylefont-size: 1.16em; color: #999b9e>Parsers/a> a href/tags/Performance/ stylefont-size: 1.33em; color: #99a2af>Performance/a> a href/tags/PostgreSQL/ stylefont-size: 1.1em; color: #999>PostgreSQL/a> a href/tags/Production-Ready/ stylefont-size: 1.33em; color: #99a2af>Production-Ready/a> a href/tags/Programming/ stylefont-size: 1.44em; color: #99a7ba>Programming/a> a href/tags/REST/ stylefont-size: 1.1em; color: #999>REST/a> a href/tags/SQL/ stylefont-size: 1.1em; color: #999>SQL/a> a href/tags/Software-Engineering/ stylefont-size: 1.33em; color: #99a2af>Software Engineering/a> a href/tags/TPL/ stylefont-size: 1.1em; color: #999>TPL/a> a href/tags/Testing/ stylefont-size: 1.1em; color: #999>Testing/a>/div>/div>div classcard-widget card-archives>div classitem-headline>i classfas fa-archive>/i>span>Archives/span>/div>ul classcard-archive-list>li classcard-archive-list-item>a classcard-archive-list-link href/archives/2023/12/>span classcard-archive-list-date>December 2023/span>span classcard-archive-list-count>2/span>/a>/li>li classcard-archive-list-item>a classcard-archive-list-link href/archives/2023/11/>span classcard-archive-list-date>November 2023/span>span classcard-archive-list-count>8/span>/a>/li>li classcard-archive-list-item>a classcard-archive-list-link href/archives/2020/04/>span classcard-archive-list-date>April 2020/span>span classcard-archive-list-count>2/span>/a>/li>li classcard-archive-list-item>a classcard-archive-list-link href/archives/2020/03/>span classcard-archive-list-date>March 2020/span>span classcard-archive-list-count>2/span>/a>/li>li classcard-archive-list-item>a classcard-archive-list-link href/archives/2020/02/>span classcard-archive-list-date>February 2020/span>span classcard-archive-list-count>5/span>/a>/li>li classcard-archive-list-item>a classcard-archive-list-link href/archives/2020/01/>span classcard-archive-list-date>January 2020/span>span classcard-archive-list-count>2/span>/a>/li>li classcard-archive-list-item>a classcard-archive-list-link href/archives/2019/12/>span classcard-archive-list-date>December 2019/span>span classcard-archive-list-count>7/span>/a>/li>li classcard-archive-list-item>a classcard-archive-list-link href/archives/2019/11/>span classcard-archive-list-date>November 2019/span>span classcard-archive-list-count>5/span>/a>/li>/ul>/div>div classcard-widget card-webinfo>div classitem-headline>i classfas fa-chart-line>/i>span>Info/span>/div>div classwebinfo>div classwebinfo-item>div classitem-name>Article :/div>div classitem-count>33/div>/div>div classwebinfo-item>div classitem-name>UV :/div>div classitem-count idbusuanzi_value_site_uv>i classfa-solid fa-spinner fa-spin>/i>/div>/div>div classwebinfo-item>div classitem-name>PV :/div>div classitem-count idbusuanzi_value_site_pv>i classfa-solid fa-spinner fa-spin>/i>/div>/div>div classwebinfo-item>div classitem-name>Last Update :/div>div classitem-count idlast-push-date data-lastPushDate2023-12-12T22:42:26.261Z>i classfa-solid fa-spinner fa-spin>/i>/div>/div>/div>/div>/div>/div>/main>footer idfooter>div idfooter-wrap>div classcopyright>©2020 - 2023 By Michael Yarichuk/div>div classframework-info>span>Framework /span>a target_blank relnoopener hrefhttps://hexo.io>Hexo/a>span classfooter-separator>|/span>span>Theme /span>a target_blank relnoopener hrefhttps://github.com/jerryc127/hexo-theme-butterfly>Butterfly/a>/div>/div>/footer>/div>div idrightside>div idrightside-config-hide>button idhide-aside-btn typebutton titleToggle between Single-column and Double-column>i classfas fa-arrows-alt-h>/i>/button>/div>div idrightside-config-show>button idgo-up typebutton titleBack To Top>span classscroll-percent>/span>i classfas fa-arrow-up>/i>/button>/div>/div>div>script src/js/utils.js>/script>script src/js/main.js>/script>script srchttps://cdn.jsdelivr.net/npm/@fancyapps/ui/dist/fancybox/fancybox.umd.min.js>/script>div classjs-pjax>script>window.typedJSFn { init: (str) > { window.typed new Typed(#subtitle, Object.assign({ strings: str, startDelay: 300, typeSpeed: 150, loop: true, backSpeed: 50, }, null)) }, run: (subtitleType) > { if (true) { if (typeof Typed function) { subtitleType() } else { getScript(https://cdn.jsdelivr.net/npm/typed.js/dist/typed.umd.min.js).then(subtitleType) } } else { subtitleType() } }}/script>script>function subtitleType () { if (true) { typedJSFn.init(Hi! My name is Michael. I sometimes write code :)) } else { document.getElementById(subtitle).textContent Hi! My name is Michael. I sometimes write code :) }}typedJSFn.run(subtitleType)/script>script>(() > { const $mermaid document.querySelectorAll(#article-container .mermaid-wrap) if ($mermaid.length 0) return const runMermaid () > { window.loadMermaid true const theme document.documentElement.getAttribute(data-theme) dark ? dark : default Array.from($mermaid).forEach((item, index) > { const mermaidSrc item.firstElementChild const mermaidThemeConfig %%{init:{ \theme\:\ + theme + \}}%%\n const mermaidID mermaid- + index const mermaidDefinition mermaidThemeConfig + mermaidSrc.textContent const renderFn mermaid.render(mermaidID, mermaidDefinition) const renderV10 () > { renderFn.then(({svg}) > { mermaidSrc.insertAdjacentHTML(afterend, svg) }) } const renderV9 svg > { mermaidSrc.insertAdjacentHTML(afterend, svg) } typeof renderFn string ? renderV9(renderFn) : renderV10() }) } const loadMermaid () > { window.loadMermaid ? runMermaid() : getScript(https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js).then(runMermaid) } btf.addGlobalFn(themeChange, runMermaid, mermaid) window.pjax ? loadMermaid() : document.addEventListener(DOMContentLoaded, loadMermaid)})()/script>/div>script async srchttps://www.googletagmanager.com/gtag/js?idG-R5G4WP4QCQ>/script>script> window.dataLayer window.dataLayer || ; function gtag(){dataLayer.push(arguments);} gtag(js, new Date()); gtag(config, G-R5G4WP4QCQ) /script>script async data-pjax src//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js>/script>div idlocal-search>div classsearch-dialog>nav classsearch-nav>span classsearch-dialog-title>Search/span>span idloading-status>/span>button classsearch-close-button>i classfas fa-times>/i>/button>/nav>div classis-center idloading-database>i classfas fa-spinner fa-pulse>/i>span> Loading the Database/span>/div>div classsearch-wrap>div idlocal-search-input>div classlocal-search-box>input classlocal-search-box--input placeholderSearch for Posts typetext/>/div>/div>hr/>div idlocal-search-results>/div>div idlocal-search-stats-wrap>/div>/div>/div>div idsearch-mask>/div>script src/js/search/local-search.js>/script>/div>/div>/body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]