https://snowmerak.pages.dev/

ID de l'analyse :
d5275028-3e82-4b28-bfcb-b509361adf29Terminée
URL soumise :
https://snowmerak.pages.dev/
Fin du rapport :

Liens : 2 trouvé(s)

Lientexte
https://gohugo.io/Hugo
https://git.io/hugopapermodPaperMod

Variables JavaScript : 12 trouvée(s)

NomType
onbeforetoggleobject
documentPictureInPictureobject
onscrollendobject
doNotTrackboolean
gtagfunction
dataLayerobject
mybuttonobject
__cfBeaconobject
google_tag_managerobject
google_tag_dataobject

Messages de journal de console : 3 trouvé(s)

TypeCatégorieEnregistrement
errornetwork
URL
https://snowmerak.pages.dev/favicon.ico
texte
Failed to load resource: the server responded with a status of 404 ()
errornetwork
URL
https://snowmerak.pages.dev/favicon-32x32.png
texte
Failed to load resource: the server responded with a status of 404 ()
errornetwork
URL
https://snowmerak.pages.dev/favicon-16x16.png
texte
Failed to load resource: the server responded with a status of 404 ()

HTML

<!DOCTYPE html><html lang="en" dir="auto"><head><meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="robots" content="index, follow">
<title>snowmerak</title>

<meta name="description" content="">
<meta name="author" content="snowmerak">
<link rel="canonical" href="/">
<link crossorigin="anonymous" href="/assets/css/stylesheet.min.c88963fe2d79462000fd0fb1b3737783c32855d340583e4523343f8735c787f0.css" integrity="sha256-yIlj/i15RiAA/Q+xs3N3g8MoVdNAWD5FIzQ/hzXHh/A=" rel="preload stylesheet" as="style">
<link rel="icon" href="favicon.ico">
<link rel="icon" type="image/png" sizes="16x16" href="favicon-16x16.png">
<link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.png">
<link rel="apple-touch-icon" href="apple-touch-icon.png">
<link rel="mask-icon" href="safari-pinned-tab.svg">
<meta name="theme-color" content="#2e2e33">
<meta name="msapplication-TileColor" content="#2e2e33">
<meta name="generator" content="Hugo 0.92.2">
<link rel="alternate" type="application/rss+xml" href="/index.xml">
<noscript>
    <style>
        #theme-toggle,
        .top-link {
            display: none;
        }

    </style>
    <style>
        @media (prefers-color-scheme: dark) {
            :root {
                --theme: rgb(29, 30, 32);
                --entry: rgb(46, 46, 51);
                --primary: rgb(218, 218, 219);
                --secondary: rgb(155, 156, 157);
                --tertiary: rgb(65, 66, 68);
                --content: rgb(196, 196, 197);
                --hljs-bg: rgb(46, 46, 51);
                --code-bg: rgb(55, 56, 62);
                --border: rgb(51, 51, 51);
            }

            .list {
                background: var(--theme);
            }

            .list:not(.dark)::-webkit-scrollbar-track {
                background: 0 0;
            }

            .list:not(.dark)::-webkit-scrollbar-thumb {
                border-color: var(--theme);
            }
        }

    </style>
</noscript>
<script async="" src="https://www.googletagmanager.com/gtag/js?id=G-1MV53Q3MRL"></script>
<script>
var doNotTrack = false;
if (!doNotTrack) {
	window.dataLayer = window.dataLayer || [];
	function gtag(){dataLayer.push(arguments);}
	gtag('js', new Date());
	gtag('config', 'G-1MV53Q3MRL', { 'anonymize_ip': false });
}
</script>
<meta property="og:title" content="snowmerak">
<meta property="og:description" content="">
<meta property="og:type" content="website">
<meta property="og:url" content="/">

<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="snowmerak">
<meta name="twitter:description" content="">

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "snowmerak",
  "url": "",
  "description": "",
  "thumbnailUrl": "favicon.ico",
  "sameAs": [
      
  ]
}
</script>
</head>

<body class="list" id="top">
<script>
    if (localStorage.getItem("pref-theme") === "dark") {
        document.body.classList.add('dark');
    } else if (localStorage.getItem("pref-theme") === "light") {
        document.body.classList.remove('dark')
    } else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
        document.body.classList.add('dark');
    }

</script>

<header class="header">
    <nav class="nav">
        <div class="logo">
            <a href="" accesskey="h" title="snowmerak (Alt + H)">snowmerak</a>
            <span class="logo-switches">
                <button id="theme-toggle" accesskey="t" title="(Alt + T)">
                    <svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
                        <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
                    </svg>
                    <svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
                        <circle cx="12" cy="12" r="5"></circle>
                        <line x1="12" y1="1" x2="12" y2="3"></line>
                        <line x1="12" y1="21" x2="12" y2="23"></line>
                        <line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
                        <line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
                        <line x1="1" y1="12" x2="3" y2="12"></line>
                        <line x1="21" y1="12" x2="23" y2="12"></line>
                        <line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
                        <line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
                    </svg>
                </button>
            </span>
        </div>
        <ul id="menu">
            <li>
                <a href="/posts/" title="Posts">
                    <span>Posts</span>
                </a>
            </li>
            <li>
                <a href="/tags/" title="Tags">
                    <span>Tags</span>
                </a>
            </li>
        </ul>
    </nav>
</header>
<main class="main"> 

<article class="first-entry"> 
  <header class="entry-header">
    <h2>PGO를 쉽게 하는 방법이 있을까?
    </h2>
  </header>
  <section class="entry-content">
    <p>개요  왜 사람들은 PGO(Profile Guided Optimization)을 적극적으로 사용하지 않을까?
 저는 이 의문을 예전부터 품고 있었습니다. 생각해보니 프로파일을 저장하고, 가져오는 어떠한 표준화된 프로토콜이 없다는 게 이유로 보였습니다. 사실 쓸 사람들은 어떻게든 쓰고 있겠지만, 저도 처음 PGO를 적용할 때에 어떻게 저장하고 가져와야 할지 고민을 좀 했었습니다. 그래서 이번 글에선 해당 내용에 대한 공유를 하겠습니다.
설계 및 구현 전형적인 읽는 사람 따로, 쓰는 사람 따로인 구조 PGO 특성 상, 프로파일을 주기적으로 생성하고 업로드하는 실제 서비스로 올라간 어플리케이션과, 해당 프로파일들을 받아서 하나로 합치고 빌드할 때 적용하는 빌드 어플리케이션이 있습니다....</p>
  </section>
  <footer class="entry-footer"><span title="2024-10-12 16:16:46 +0900 +0900">October 12, 2024</span>&nbsp;·&nbsp;snowmerak</footer>
  <a class="entry-link" aria-label="post link to PGO를 쉽게 하는 방법이 있을까?" href="/posts/040_auto_pgo/"></a>
</article>

<article class="post-entry"> 
  <header class="entry-header">
    <h2>대는 소를 포함한다
    </h2>
  </header>
  <section class="entry-content">
    <p>? 대는 소를 포함한다는 말은 법률상으로 상위 개념과 하위 개념이 존재할 경우, 상위 개념에 대한 법을 하위 개념에도 적용하는 것입니다. 쉽게 이야기하면, 법률적으로는 자전거가 자동차의 하위 개념이니 자동차에 적용하는 다양한 법을 자전거에도 같이 적용하는 것입니다. 하지만 제가 법률 전문가도 아니고, 법과 관련된 이야기를 하고 싶은 건 아닙니다.
소프트웨어 설계에서 범용은 전용을 포함한다 저희는 때때로 범용으로 무언가를 만들고, 전용으로 사용하는 방법을 취합니다. 대표적인 예로 postgres는 많은 데이터를 저장하고 쿼리할 수 있지만, 저희는 스키마를 한정해서 한정적인 데이터 형태를 저장하고 활용합니다....</p>
  </section>
  <footer class="entry-footer"><span title="2024-10-03 21:40:46 +0900 +0900">October 3, 2024</span>&nbsp;·&nbsp;snowmerak</footer>
  <a class="entry-link" aria-label="post link to 대는 소를 포함한다" href="/posts/038_genus_et_species/"></a>
</article>

<article class="post-entry"> 
  <header class="entry-header">
    <h2>빠르게 메시지를 전파하고 싶어
    </h2>
  </header>
  <section class="entry-content">
    <p>배경 NATS는 정말 아름다워 NATS는 Go 언어로 작성된 메시지큐입니다. 그리고 제가 개인적으로 좋아하는 오픈소스 프로젝트이기도 합니다. 한때 NATS에서 서브스크립션이 메시지를 받는 방식이 단순 채널이 아닌 독특한 자료구조가 따로 있는 걸 봤었던 적이 있습니다. 이 자료구조는 연결리스트를 통해 특정 서브스크립션에 전달될 메시지를 저장합니다. 그리고 sync.Cond를 이용하여 별도의 대기 중인 서브스크립션을 위한 고루틴에게 알려줍니다.
 서브스크립션은 생성될 때, 별도 고루틴에서 sync.Cond의 Wait() 메서드를 통해 메시지가 추가되길 대기합니다. 커넥션은 외부 연결을 통해 서브스크립션에 대한 메시지를 받아옵니다....</p>
  </section>
  <footer class="entry-footer"><span title="2024-09-27 23:20:37 +0900 +0900">September 27, 2024</span>&nbsp;·&nbsp;snowmerak</footer>
  <a class="entry-link" aria-label="post link to 빠르게 메시지를 전파하고 싶어" href="/posts/037_fan_out/"></a>
</article>

<article class="post-entry"> 
  <header class="entry-header">
    <h2>소..솔직히 유지보수는 아키텍트의 책임이라고 생각해요...
    </h2>
  </header>
  <section class="entry-content">
    <p>메락아, 그게 무슨 소리니? 아니 일단 들어봐 서비스가 되었든, 소프트웨어가 되었든, 어떤 프로젝트에 대해 보통 기업은 신기술에 밝거나, 손이 빠르거나, 임원의 말을 잘 듣는 사람에게 첫 스타트를 시키는 경우가 많습니다. 하지만 단순히 그렇게 되어서는 서비스나 소프트웨어의 수명이 줄어들어서, 유지보수 비용의 증가 뿐만 아니라 해당 프로젝트를 대체할 새로운 프로젝트를 해야할 수 있어, 큰 지출로 다시 돌아올 수 있습니다.
그래서? 만약 아키텍트가 시작할 때, 어떠한 철학이나 체계 없이 주먹구구로 프로젝트를 진행하면 어떤 일이 벌어질까요?...</p>
  </section>
  <footer class="entry-footer"><span title="2024-08-12 00:08:12 +0900 +0900">August 12, 2024</span>&nbsp;·&nbsp;snowmerak</footer>
  <a class="entry-link" aria-label="post link to 소..솔직히 유지보수는 아키텍트의 책임이라고 생각해요..." href="/posts/035_service_planner/"></a>
</article>

<article class="post-entry"> 
  <header class="entry-header">
    <h2>분산 서비스에서의 R&amp;R에 대한 고찰
    </h2>
  </header>
  <section class="entry-content">
    <p>이것 또한 최근 포스트와 마찬가지로, 최근에 진행했던 프로젝트의 회고입니다.
 개요 해당 프로젝트에는 개인적으로 몇가지 이해가 어려운 부분들이 좀 있었습니다. 그 중 R&amp;R에 대해 제가 품은 의문과 그에 대한 제 나름의 해결 방법을 서술하고자 합니다.
본문 어떤 부분이?  API GW와 서비스만 책임 분리 API GW와 인증 및 인가 책임 각 서비스 간의 역할과 책임 분리  API GW와 서비스간의 책임 분리에 대해 설계 당시부터 지금까지 모든 서비스는 k8s에 pod로써 운영되고 있습니다....</p>
  </section>
  <footer class="entry-footer"><span title="2024-08-01 21:37:19 +0900 +0900">August 1, 2024</span>&nbsp;·&nbsp;snowmerak</footer>
  <a class="entry-link" aria-label="post link to 분산 서비스에서의 R&amp;R에 대한 고찰" href="/posts/034_rnr/"></a>
</article>

<article class="post-entry"> 
  <header class="entry-header">
    <h2>라이프타임에 대한 고찰
    </h2>
  </header>
  <section class="entry-content">
    <p>개요 이전 포스팅과 동일한 프로젝트에 대한 회고를 내용으로 합니다. 이 포스트에선 비교적 안일하게 생각했던 라이프타임에 대해 생각했던 걸 적어보려합니다. 여기서 말하는 라이프타임은 객체의 라이프사이클, 캐시 수명, 요청의 타임아웃 등을 포함하는 어떤 것의 발생과 소멸까지의 시간을 의미합니다.
뭐가 문제였지? 대부분의 라이프타임 관리는 괜찮게 했습니다. 하지만 몇몇 경우에 대해서 시스템을 맹신한 나머지 안일하게 관리를 했고, 관련 부분에 대한 내용이 주가 될 것같습니다.
본문 해당 프로젝트가 Go로 구현된 만큼 context 패키지를 주로 활용하였고, context 패키지에 대해 처음 보신다면, 제가 이전에 작성한 포스트를 같이 읽으시면 좋아 보입니다....</p>
  </section>
  <footer class="entry-footer"><span title="2024-07-27 23:59:19 +0900 +0900">July 27, 2024</span>&nbsp;·&nbsp;snowmerak</footer>
  <a class="entry-link" aria-label="post link to 라이프타임에 대한 고찰" href="/posts/033_work_timeout/"></a>
</article>

<article class="post-entry"> 
  <header class="entry-header">
    <h2>로그 정책에 대한 고찰
    </h2>
  </header>
  <section class="entry-content">
    <p>개요 최근 그래도 규모가 조금 있는 프로젝트를 처음부터 설계하고, 구현 및 운영한 경험이 생겼습니다. 상당히 많은 부분에서 하고 싶은 걸 했고, 부족한 점을 느끼기고 했고, 발전했다고 생각합니다. 하지만 안타깝게도, 기반 시스템(혹은 라이브러리)에 대해서 조직 내에서도 명확히 어떻게 해왔다는 게 없었어서 상당히 아쉬운 결과를 낳게 되었습니다. 지금에 와서 매우 많은 부분에 스며들어 있어서 일일이 교체하기에도 비용이 큰 작업이 되었구요. 그 중 하나가 로그입니다.
뭐가 문제? 해당 프로젝트의 로그 라이브러리는 zerolog를 사용하고 있습니다....</p>
  </section>
  <footer class="entry-footer"><span title="2024-07-26 18:24:08 +0900 +0900">July 26, 2024</span>&nbsp;·&nbsp;snowmerak</footer>
  <a class="entry-link" aria-label="post link to 로그 정책에 대한 고찰" href="/posts/032_error_policy/"></a>
</article>

<article class="post-entry"> 
  <header class="entry-header">
    <h2>리스코프 치환 법칙에 대한 고찰
    </h2>
  </header>
  <section class="entry-content">
    <p>Liskov Substitution Principle with inheritance 리스코프 치환 법칙은 객체지향 프로그래밍에서 중요한 법칙 중 하나입니다.
 서브 타입은 언제나 슈퍼 타입으로 대체될 수 있어야 한다.
 개인적으로는 살짝 헷갈린 적이 있는 표현이지만, 코드 내의 인스턴스 타입을 교체하는 케이스로 이해하면 쉽습니다.
상속을 활용한 케이스 이 법칙은 일반적인 상속이 존재하는 객체지향 지향 언어에서 쉽게 설명되는 법칙입니다.
예를 들어 보통 자바에선 이런 식으로 많이 예제를 작성합니다.
class Shape { int width; int height; } class Rectangle extends Shape { void setWidth(int width) { this....</p>
  </section>
  <footer class="entry-footer"><span title="2024-07-23 18:54:27 +0900 +0900">July 23, 2024</span>&nbsp;·&nbsp;snowmerak</footer>
  <a class="entry-link" aria-label="post link to 리스코프 치환 법칙에 대한 고찰" href="/posts/031_liskov_substitution_principle/"></a>
</article>

<article class="post-entry"> 
  <header class="entry-header">
    <h2>프로젝트 설계에 대해
    </h2>
  </header>
  <section class="entry-content">
    <p>개요 코드를 구조화하는 건 생각보다 어렵지 않다고 생각합니다. 하지만 생각보다 어렵기도 하죠. 그래서 사실 이걸 어떻게 표현해야할 지는 모르겠는데, 그냥 편하게 아키텍처를 만드는 것에서 프로젝트 구조를 짜는 것, 코드를 작성하는 것까지의 제 나름대로의 룰을 정리해보려고 합니다.
룰 모듈 혹은 서비스를 분리하세요.  모듈을 서비스와 동치해서 서술합니다.
 아키텍처나 프로젝트 전반에서 한번에 거대한 문제를 해결하려고 하지 않습니다.
흔히 말하는 분할-정복 방식을 적용합니다. 각 문제를 분할하여 모듈화하고, 각 모듈을 독립적으로 개발 후 통합합니다....</p>
  </section>
  <footer class="entry-footer"><span title="2024-06-19 16:45:37 +0900 +0900">June 19, 2024</span>&nbsp;·&nbsp;snowmerak</footer>
  <a class="entry-link" aria-label="post link to 프로젝트 설계에 대해" href="/posts/030_architect/"></a>
</article>

<article class="post-entry"> 
  <header class="entry-header">
    <h2>HTTP API 에러 쓰는 법
    </h2>
  </header>
  <section class="entry-content">
    <p>왜? HTTP API에 에러 쓰는 건 개인 취향 혹은 조직에서 정한 룰 아닌가요? 저도 그렇게 생각하고 있습니다.
모름지기 학사 과정을 수료했든, 학원을 수료했든, 부트캠프를 수료했든, 백엔드 개발자라면 알아서 잘 남길 수 있을 것입니다.
그럼 왜 이 글이 있는 거죠? RFC에 HTTP API의 에러에 관한 내용이 있더라구요. 흥미로워서 가져왔습니다.
RFC7807 RFC7807은 Problem Details for HTTP APIs라는 이름의 문서입니다.
이름 그대로 HTTP API에서 발생하는 오류 응답 형식을 적어놓은 문서죠.
이 문서에서는 application/problem+json MIME 타입을 소개합니다....</p>
  </section>
  <footer class="entry-footer"><span title="2024-05-21 18:21:32 +0900 +0900">May 21, 2024</span>&nbsp;·&nbsp;snowmerak</footer>
  <a class="entry-link" aria-label="post link to HTTP API 에러 쓰는 법" href="/posts/029_rfc_7807/"></a>
</article>
<footer class="page-footer">
  <nav class="pagination">
    <a class="next" href="/page/2/">Next Page »</a>
  </nav>
</footer>
    </main>
    
<footer class="footer">
    <span>© 2024 <a href="">snowmerak</a></span>
    <span>
        Powered by
        <a href="https://gohugo.io/" rel="noopener noreferrer" target="_blank">Hugo</a> &amp;
        <a href="https://git.io/hugopapermod" rel="noopener" target="_blank">PaperMod</a>
    </span>
</footer>
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
        <path d="M12 6H0l6-6z"></path>
    </svg>
</a>

<script>
    let menu = document.getElementById('menu')
    if (menu) {
        menu.scrollLeft = localStorage.getItem("menu-scroll-position");
        menu.onscroll = function () {
            localStorage.setItem("menu-scroll-position", menu.scrollLeft);
        }
    }

    document.querySelectorAll('a[href^="#"]').forEach(anchor => {
        anchor.addEventListener("click", function (e) {
            e.preventDefault();
            var id = this.getAttribute("href").substr(1);
            if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
                document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
                    behavior: "smooth"
                });
            } else {
                document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
            }
            if (id === "top") {
                history.replaceState(null, null, " ");
            } else {
                history.pushState(null, null, `#${id}`);
            }
        });
    });

</script>
<script>
    var mybutton = document.getElementById("top-link");
    window.onscroll = function () {
        if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
            mybutton.style.visibility = "visible";
            mybutton.style.opacity = "1";
        } else {
            mybutton.style.visibility = "hidden";
            mybutton.style.opacity = "0";
        }
    };

</script>
<script>
    document.getElementById("theme-toggle").addEventListener("click", () => {
        if (document.body.className.includes("dark")) {
            document.body.classList.remove('dark');
            localStorage.setItem("pref-theme", 'light');
        } else {
            document.body.classList.add('dark');
            localStorage.setItem("pref-theme", 'dark');
        }
    })

</script>
<!-- Cloudflare Pages Analytics --><script defer="" src="https://static.cloudflareinsights.com/beacon.min.js" data-cf-beacon="{&quot;token&quot;: &quot;86fa17a82d7d40779460ee427f9c088c&quot;}"></script><!-- Cloudflare Pages Analytics -->


</body></html>