<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>컴퓨터로 할 수 있는 것</title>
    <link>https://markruler.com/</link>
    <description>Recent content on 컴퓨터로 할 수 있는 것</description>
    <generator>Hugo</generator>
    <language>ko-kr</language>
    <managingEditor>imcxsu@gmail.com (임창수)</managingEditor>
    <webMaster>imcxsu@gmail.com (임창수)</webMaster>
    <lastBuildDate>Wed, 21 Jan 2026 00:00:00 +0900</lastBuildDate>
    <atom:link href="https://markruler.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>웹과 멀티미디어: VOD 트랜스코딩과 다운로드</title>
      <link>https://markruler.com/posts/multimedia/download-vod-in-web/</link>
      <pubDate>Mon, 30 Jun 2025 21:00:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/multimedia/download-vod-in-web/</guid>
      <description>&lt;p&gt;&lt;strong&gt;VOD&lt;/strong&gt;(Video on Demand)는 원하는 동영상을 보고 싶은 시간에 바로 시청할 수 있는 주문형 비디오 서비스를 말합니다.&#xA;넷플릭스나 유튜브처럼 사용자 요청 시 콘텐츠를 제공하는 플랫폼들이 모두 VOD 시스템입니다.&#xA;VOD의 반대 개념은 정해진 방송 시간에 맞춰보는 TV 방송으로, VOD를 통해 이용자는 &amp;lsquo;보고 싶을 때 바로 재생&amp;rsquo;하는 편리함을 얻습니다.&lt;/p&gt;&#xA;&lt;p&gt;보고 싶을 때 바로 재생하기 위해서는 우선 서비스가 제공하는 VOD를 다운로드해야 합니다. 여기서 다운로드는 사용자가 동영상을 &lt;strong&gt;스트리밍&lt;/strong&gt;(실시간 전송)하거나 &lt;strong&gt;파일로 저장&lt;/strong&gt;하여 시청하는 것을 모두 포함합니다.&#xA;초창기 인터넷 동영상은 재생과 동시에 파일을 처음부터 끝까지 순차적으로 &lt;strong&gt;프로그레시브 다운로드&lt;/strong&gt;하는 형태였기 때문에 중간 건너뛰기가 어렵고 버퍼링이 잦았습니다.&#xA;반면 오늘날 VOD는 HLS 등의 스트리밍 기술을 통해 네트워크 상황에 맞춰 동영상을 조각 전송하여 버퍼링 없이 시청이 가능합니다.&#xA;필요에 따라 사용자가 동영상을 &lt;strong&gt;오프라인 환경에서도 재생할 수 있도록 저장&lt;/strong&gt;할 수 있는데, 이 경우 적절한 포맷과 품질로 파일을 내려받아 기기에 보관하게 됩니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>웹과 멀티미디어: VOD 업로드</title>
      <link>https://markruler.com/posts/multimedia/upload-vod-in-web/</link>
      <pubDate>Sat, 31 May 2025 11:45:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/multimedia/upload-vod-in-web/</guid>
      <description>&lt;h1 id=&#34;개요&#34;&gt;개요&lt;/h1&gt;&#xA;&lt;p&gt;&lt;strong&gt;VOD&lt;/strong&gt;(Video on Demand) 업로드란 사용자가 사전에 녹화된 비디오 콘텐츠를 VOD 플랫폼이나 미디어 서버에 &lt;strong&gt;파일 형태로 전송&lt;/strong&gt;하는 과정을 말합니다.&#xA;라이브 스트리밍이 실시간으로 영상을 전송하는 것과 달리, VOD는 영상을 &lt;strong&gt;서버에 먼저 저장&lt;/strong&gt;하고 &lt;strong&gt;처리&lt;/strong&gt;한 후에 사용자들이 원하는 시간에 재생할 수 있도록 제공합니다.&#xA;이 글에서는 라이브 스트리밍이 아닌 VOD 업로드에 초점을 맞추어, 웹에서의 VOD 업로드 프로세스와 관련 기술을 살펴보겠습니다.&lt;/p&gt;&#xA;&lt;h1 id=&#34;vod-업로드-워크플로우&#34;&gt;VOD 업로드 워크플로우&lt;/h1&gt;&#xA;&lt;p&gt;클라이언트는 HTTP를 통해 서버로 파일을 전송할 수 있습니다.&#xA;파일 업로드 API를 통해 업로드하거나 서버로부터 업로드에 필요한 URL(presigned URL)을 요청합니다.&#xA;그럼 서버는 업로드를 식별할 수 있는 고유 ID 혹은 업로드 전용 URL을 반환합니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>웹과 멀티미디어: 오디오</title>
      <link>https://markruler.com/posts/multimedia/audio-in-web/</link>
      <pubDate>Thu, 17 Apr 2025 23:30:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/multimedia/audio-in-web/</guid>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ea%b0%9c%ec%9a%94&#34;&gt;개요&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%98%a4%eb%94%94%ec%98%a4-%ec%8b%a0%ed%98%b8-%ec%b2%98%eb%a6%ac&#34;&gt;오디오 신호 처리&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%a3%bc%ec%9a%94-%ec%98%a4%eb%94%94%ec%98%a4-%ec%bd%94%eb%8d%b1%ea%b3%bc-%ed%8f%ac%eb%a7%b7&#34;&gt;주요 오디오 코덱과 포맷&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%86%90%ec%8b%a4-%ec%95%95%ec%b6%95-%ec%bd%94%eb%8d%b1&#34;&gt;손실 압축 코덱&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%ac%b4%ec%86%90%ec%8b%a4-%ec%95%95%ec%b6%95-%ec%bd%94%eb%8d%b1&#34;&gt;무손실 압축 코덱&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%98%a4%eb%94%94%ec%98%a4-%ec%9e%ac%ec%83%9d-html5-audio-mse-api-web-audio-api&#34;&gt;오디오 재생: HTML5 audio, MSE API, Web Audio API&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%a7%88%ec%9d%b4%ed%81%ac-%ec%9e%85%eb%a0%a5%ea%b3%bc-%eb%85%b9%ec%9d%8c-mediadevices-%eb%b0%8f-mediarecorder&#34;&gt;마이크 입력과 녹음: MediaDevices 및 MediaRecorder&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#mediadevices-%ec%98%a4%eb%94%94%ec%98%a4-%ec%9e%85%eb%a0%a5-%eb%b0%9b%ea%b8%b0&#34;&gt;MediaDevices 오디오 입력 받기&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#web-audio-api%eb%a1%9c-%ec%9e%85%eb%a0%a5-%ec%8a%a4%ed%8a%b8%eb%a6%bc-%ec%b2%98%eb%a6%ac%ed%95%98%ea%b8%b0&#34;&gt;Web Audio API로 입력 스트림 처리하기&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#mediarecorder%eb%a5%bc-%ec%82%ac%ec%9a%a9%ed%95%9c-%ec%98%a4%eb%94%94%ec%98%a4-%eb%85%b9%ec%9d%8c&#34;&gt;MediaRecorder를 사용한 오디오 녹음&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#web-audio%ec%99%80-mediarecorder%ec%9d%98-%ec%a1%b0%ed%95%a9&#34;&gt;Web Audio와 MediaRecorder의 조합&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%b8%8c%eb%9d%bc%ec%9a%b0%ec%a0%80%ec%9d%98-%ec%98%a4%eb%94%94%ec%98%a4-%ec%9e%ac%ec%83%9d-%ec%a0%95%ec%b1%85&#34;&gt;브라우저의 오디오 재생 정책&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%98%a4%eb%94%94%ec%98%a4-%ec%84%b1%eb%8a%a5&#34;&gt;오디오 성능&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ea%b2%b0%eb%a1%a0&#34;&gt;결론&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%8d%94-%ec%9d%bd%ec%9d%84%ea%b1%b0%eb%a6%ac&#34;&gt;더 읽을거리&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;개요&#34;&gt;개요&lt;/h1&gt;&#xA;&lt;p&gt;&lt;strong&gt;물리적으로&lt;/strong&gt; 매질을 통해 전달된 모든 음파를 &lt;strong&gt;사운드(sound)&lt;/strong&gt; 라고 합니다.&#xA;한편 전기적인 신호(아날로그 또는 디지털)로 처리하는 기술 및 그 신호 자체를 &lt;strong&gt;기술적으로&lt;/strong&gt; &lt;strong&gt;오디오(audio)&lt;/strong&gt; 라고 합니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>웹과 멀티미디어: 이미지</title>
      <link>https://markruler.com/posts/multimedia/image-in-web/</link>
      <pubDate>Sun, 13 Apr 2025 22:38:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/multimedia/image-in-web/</guid>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ea%b0%9c%ec%9a%94&#34;&gt;개요&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#image%eb%9d%bc%eb%8a%94-%eb%8b%a8%ec%96%b4&#34;&gt;image라는 단어&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ed%99%94%ec%a7%88-image-quality&#34;&gt;화질 (Image Quality)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%9d%b4%eb%af%b8%ec%a7%80-%ed%8c%8c%ec%9d%b4%ed%94%84%eb%9d%bc%ec%9d%b8-image-pipeline&#34;&gt;이미지 파이프라인 (Image Pipeline)&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%b9%b4%eb%a9%94%eb%9d%bc-%ed%95%84%eb%a6%84-vs-%eb%94%94%ec%a7%80%ed%84%b8-%ec%84%bc%ec%84%9c&#34;&gt;카메라: 필름 vs 디지털 센서&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#isp-%ec%9d%b4%eb%af%b8%ec%a7%80-%ec%8b%a0%ed%98%b8-%ec%b2%98%eb%a6%ac&#34;&gt;ISP: 이미지 신호 처리&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%9d%b4%eb%af%b8%ec%a7%80-%ed%8f%ac%eb%a7%b7&#34;&gt;이미지 포맷&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%9e%98%ec%8a%a4%ed%84%b0-%ec%9d%b4%eb%af%b8%ec%a7%80&#34;&gt;래스터 이미지&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#jpg-%ec%86%90%ec%8b%a4-%ec%95%95%ec%b6%95-%ec%9d%b4%eb%af%b8%ec%a7%80-%ed%8f%ac%eb%a7%b7&#34;&gt;JPG: 손실 압축 이미지 포맷&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#gif-%ed%8c%94%eb%a0%88%ed%8a%b8-%ea%b8%b0%eb%b0%98-%ec%95%a0%eb%8b%88%eb%a9%94%ec%9d%b4%ec%85%98-%ed%8f%ac%eb%a7%b7&#34;&gt;GIF: 팔레트 기반 애니메이션 포맷&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#png-%eb%ac%b4%ec%86%90%ec%8b%a4-%ec%95%95%ec%b6%95-%ec%9d%b4%eb%af%b8%ec%a7%80-%ed%8f%ac%eb%a7%b7&#34;&gt;PNG: 무손실 압축 이미지 포맷&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#webp&#34;&gt;WebP&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#avif-av1-%ea%b8%b0%eb%b0%98-%ec%9d%b4%eb%af%b8%ec%a7%80-%ed%8f%ac%eb%a7%b7&#34;&gt;AVIF: AV1 기반 이미지 포맷&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%b2%a1%ed%84%b0-%ec%9d%b4%eb%af%b8%ec%a7%80&#34;&gt;벡터 이미지&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#svg&#34;&gt;SVG&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%9b%b9-%ed%8e%98%ec%9d%b4%ec%a7%80%ec%97%90%ec%84%9c-%ec%9d%b4%eb%af%b8%ec%a7%80-%ec%b5%9c%ec%a0%81%ed%99%94&#34;&gt;웹 페이지에서 이미지 최적화&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%b0%98%ec%9d%91%ed%98%95-%ec%9d%b4%eb%af%b8%ec%a7%80-responsive-images&#34;&gt;반응형 이미지 (Responsive Images)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%a7%80%ec%97%b0-%eb%a1%9c%eb%94%a9-lazy-loading&#34;&gt;지연 로딩 (Lazy Loading)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%82%ac%ec%a0%84-%eb%a1%9c%eb%94%a9-preload&#34;&gt;사전 로딩 (Preload)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%9d%b4%eb%af%b8%ec%a7%80-%ec%8a%a4%ed%94%84%eb%9d%bc%ec%9d%b4%ed%8a%b8-image-sprite&#34;&gt;이미지 스프라이트 (Image Sprite)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%b8%8c%eb%9d%bc%ec%9a%b0%ec%a0%80-%ec%ba%90%ec%8b%b1&#34;&gt;브라우저 캐싱&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%95%95%ec%b6%95-%ec%95%8c%ea%b3%a0%eb%a6%ac%ec%a6%98-%ec%b5%9c%ec%a0%81%ed%99%94&#34;&gt;압축 알고리즘 최적화&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%8b%a8%ec%88%9c-%ec%9e%a5%ec%8b%9d%ec%9a%a9-%ec%9d%b4%eb%af%b8%ec%a7%80%eb%8a%94-css%eb%a1%9c&#34;&gt;단순 장식용 이미지는 CSS로&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%9b%b9-%ec%a0%91%ea%b7%bc%ec%84%b1-alt-%ec%86%8d%ec%84%b1&#34;&gt;웹 접근성: alt 속성&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%99%9c-alt-%ec%86%8d%ec%84%b1%ec%9d%b4-%ec%a4%91%ec%9a%94%ed%95%9c%ea%b0%80&#34;&gt;왜 &lt;code&gt;alt&lt;/code&gt; 속성이 중요한가&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%a2%8b%ec%9d%80-alt-%ed%85%8d%ec%8a%a4%ed%8a%b8%eb%a5%bc-%ec%9e%91%ec%84%b1%ed%95%98%eb%8a%94-%eb%b0%a9%eb%b2%95&#34;&gt;좋은 &lt;code&gt;alt&lt;/code&gt; 텍스트를 작성하는 방법&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%9d%b4%eb%af%b8%ec%a7%80-%eb%b3%b4%ec%95%88&#34;&gt;이미지 보안&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ea%b2%b0%eb%a1%a0&#34;&gt;결론&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%8d%94-%ec%9d%bd%ec%9d%84%ea%b1%b0%eb%a6%ac&#34;&gt;더 읽을거리&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;개요&#34;&gt;개요&lt;/h1&gt;&#xA;&lt;p&gt;이미지는 인터넷에서 매우 큰 비중을 차지합니다.&#xA;웹페이지 기준으로 이미지가 차지하는 데이터 용량은 전체의 51%에 달하므로&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;,&#xA;이미지의 속도나 크기를 개선하면 웹 성능에 상당한 영향을 미칩니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>웹 페이지 성능 측정과 최적화</title>
      <link>https://markruler.com/posts/web/web-page-performance-optimization/</link>
      <pubDate>Thu, 27 Mar 2025 00:45:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/web/web-page-performance-optimization/</guid>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%84%b1%eb%8a%a5-%ec%a7%80%ed%91%9c&#34;&gt;성능 지표&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%84%b1%eb%8a%a5-%ec%b8%a1%ec%a0%95&#34;&gt;성능 측정&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%84%b1%eb%8a%a5-%ea%b0%9c%ec%84%a0&#34;&gt;성능 개선&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#html-css-js-%ec%b5%9c%ec%a0%81%ed%99%94&#34;&gt;HTML, CSS, JS 최적화&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%a9%80%ed%8b%b0%eb%af%b8%eb%94%94%ec%96%b4-%ec%b5%9c%ec%a0%81%ed%99%94&#34;&gt;멀티미디어 최적화&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%ba%90%ec%8b%9c-%ed%99%9c%ec%9a%a9&#34;&gt;캐시 활용&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#cdn-content-delivery-network&#34;&gt;CDN (Content Delivery Network)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%b8%8c%eb%9d%bc%ec%9a%b0%ec%a0%80-%ec%ba%90%ec%8b%9c&#34;&gt;브라우저 캐시&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%8d%94-%ec%9d%bd%ec%9d%84%ea%b1%b0%eb%a6%ac&#34;&gt;더 읽을거리&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;성능-지표&#34;&gt;성능 지표&lt;/h1&gt;&#xA;&lt;p&gt;먼저 웹 페이지의 성능을 개선하려면 어떤 지표를 기준으로 삼을 것인지 정해야 합니다.&lt;/p&gt;&#xA;&lt;p&gt;Google이 제공하는 &lt;strong&gt;Web Vitals&lt;/strong&gt;는 사용자 경험을 측정하는 지표입니다.&#xA;이 중 가장 중요한 측정 항목 3개를 모아서 Core Web Vitals이라고 합니다.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://web.dev/articles/lcp?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;LCP (Largest Contentful Paint)&lt;/a&gt;&#xA;&#xA;: 가장 큰 콘텐츠가 화면에 표시되는 시간으로 &lt;strong&gt;로드 성능&lt;/strong&gt;을 측정.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://web.dev/articles/inp?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;INP (Interaction to Next Paint)&lt;/a&gt;&#xA;&#xA;: 사용자 입력에 대한 응답 시간으로 &lt;strong&gt;상호작용&lt;/strong&gt;을 측정. (&lt;a href=&#34;https://web.dev/articles/fid?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;FID, First Input Delay&lt;/a&gt;&#xA;&#xA;에서 대체)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://web.dev/articles/cls?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CLS (Cumulative Layout Shift)&lt;/a&gt;&#xA;&#xA;: &lt;strong&gt;시각적 안정성&lt;/strong&gt;을 측정.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;이 외에도 웹 접근성(Web Accessibility)&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, SEO, PWA 등을 고려하여 웹 페이지의 품질을 측정할 수 있습니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTTP 응답 패킷을 압축해서 Outbound 네트워크 비용 절약하기</title>
      <link>https://markruler.com/posts/network/http-response-compression/</link>
      <pubDate>Sun, 23 Mar 2025 00:10:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/network/http-response-compression/</guid>
      <description>&lt;p&gt;클라이언트 로딩 시간을 줄이기 위해 API 하나에 많은 걸 담기 시작했습니다.&#xA;브라우저에서는 HTTP/1.1 연결 시 최대 6개의 커넥션만 허용해주기 때문입니다.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&#xA;그래서 서버 응답 데이터의 사이즈가 점점 커지기 시작했고,&#xA;덩달아 CDN과 IDC 네트워크 트래픽(outbound) 비용이 늘기 시작했습니다.&#xA;그 중에는 변하지 않는 데이터도 포함되어 있고, 변하는 데이터도 포함되어 있습니다.&#xA;변하지 않는 데이터는 중간 레이어에서 캐시를 통해 해결할 수도 있지만,&#xA;이 글에서는 서버에서 응답 데이터를 압축해서 보내는 방법을 소개합니다.&lt;/p&gt;&#xA;&lt;h1 id=&#34;spring-boot-애플리케이션-설정&#34;&gt;Spring Boot 애플리케이션 설정&lt;/h1&gt;&#xA;&lt;p&gt;서버에서 클라이언트에 응답 시 응답 데이터를 압축해서 보낼 수 있습니다.&#xA;Spring Boot 애플리케이션이라면 간단하게 &lt;code&gt;application.yaml&lt;/code&gt; 파일에 아래 설정만 추가하면 됩니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>네트워크 레이어 - OSI 모델</title>
      <link>https://markruler.com/posts/network/network-layer/</link>
      <pubDate>Thu, 20 Mar 2025 23:03:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/network/network-layer/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TCP/IP 모델&lt;/strong&gt;은 1970년대 미국 국방부 연구기관 DARPA에서&#xA;인터넷 초기 설계(ARPANet)에 사용한 모델로 4계층으로 구성되어 있습니다.&#xA;실제 인터넷을 구현하기 위해 실용적 목적으로 개발되었습니다.&lt;/p&gt;&#xA;&lt;p&gt;반면 &lt;strong&gt;OSI 모델&lt;/strong&gt;은 다양한 컴퓨터 시스템이 서로 통신할 수 있도록&#xA;1984년 국제표준화기구(ISO)에서 만든 개념 모델입니다.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;실제 네트워크에서는 TCP/IP 모델이 사용됩니다.&#xA;하지만 개념을 이해하고 설명하기에는 OSI 모델이 더 적합하기 때문에 OSI 모델이 통용됩니다.&lt;/p&gt;&#xA;&lt;p&gt;이 글에서는 각 계층의 주요 기능과 특징을 살펴보기 위해&#xA;일반적으로 사용되는 &lt;strong&gt;OSI 모델을 따르지만 5~7계층은 TCP/IP 모델처럼 합쳐진 5계층 모델&lt;/strong&gt;을 설명합니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>비파괴 스캐너로 스캔한 책 PDF outline 만들기</title>
      <link>https://markruler.com/posts/pdf/pdf-editor/</link>
      <pubDate>Mon, 27 Jan 2025 23:15:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/pdf/pdf-editor/</guid>
      <description>&lt;p&gt;절판된 책이나 집에서 보관하던 두꺼운 책을 스캔해서 소장하고 싶은 경우가 있습니다.&#xA;그래서 저는 비파괴 스캐너를 구입해서 거의 10년 동안 책을 스캔해서 보관하고 있습니다.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&#xA;하지만 펼칠 때마다 목차&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;가 없으면 발췌독하기 불편한데요.&#xA;오픈 소스 OCR 도구인 Tesseract를 이용해 PDF 목차를 만들어보겠습니다.&lt;/p&gt;&#xA;&lt;h1 id=&#34;사적이용을-위한-저작권법&#34;&gt;사적이용을 위한 저작권법&lt;/h1&gt;&#xA;&lt;p&gt;먼저 저작권에 대해 확인해야 할 부분이 있습니다.&#xA;과연 책을 스캔해서 PDF로 만드는 것이 합법일까요?&#xA;인터넷에 검색해보면 도서관에서 빌린 책을 스캔하는 건 불법이라고 하는 경우가 많은 것 같습니다.&#xA;&lt;a href=&#34;https://www.law.go.kr/%eb%b2%95%eb%a0%b9/%ec%a0%80%ec%9e%91%ea%b6%8c%eb%b2%95/%2820240828,20358,20240227%29/%ec%a0%9c30%ec%a1%b0?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;저작권법 제30조&lt;/a&gt;&#xA;&#xA;를 보면 다음과 같이 명시되어 있습니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>네트워크 대역폭과 NFS 지연</title>
      <link>https://markruler.com/posts/network/nfs-network-bandwidth/</link>
      <pubDate>Mon, 13 Jan 2025 19:13:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/network/nfs-network-bandwidth/</guid>
      <description>&lt;p&gt;IDC마다 다르겠지만 일반적으로 Outbound 네트워크 트래픽 양에 따라 비용을 부과합니다.&#xA;제가 속한 팀은 트래픽 비용을 줄이기 위해 기존에 사설망(private network) 없이&#xA;내부 서버 간 통신하던 시스템에 사설망을 추가했습니다.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://markruler.com/images/network/nfs-network-bandwidth/static-file-server.png&#34; alt=&#34;static-file-server.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;DB 백업을 위해 Veeam을 사용하다가 expdp와 RMAN을 사용하기 시작했고,&#xA;NFS 마운트 된 스토리지에 백업본을 저장했습니다.&lt;/p&gt;&#xA;&lt;h1 id=&#34;문제&#34;&gt;문제&lt;/h1&gt;&#xA;&lt;p&gt;NFS 마운트 된 정적 파일들(이미지, 스크립트 파일)을 조회하는 서버에서만 부하가 발생하기 시작했습니다.&lt;/p&gt;&#xA;&lt;p&gt;확인해보니 DB 서버 회선에서 허용되는 네트워크 대역폭(1Gbps)의 100%를 사용하는 경우가 계속 발생했고,&#xA;덩달아 NFS 접근도 느려진 것입니다.&#xA;백업 기능을 변경한 후 발생했습니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>일상에서의 Wireshark</title>
      <link>https://markruler.com/posts/network/wireshark/</link>
      <pubDate>Mon, 30 Dec 2024 18:38:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/network/wireshark/</guid>
      <description>&lt;p&gt;Wireshark란 오픈 소스 네트워크 프로토콜 분석기입니다.&#xA;GUI와 CLI 환경 모두에서 사용할 수 있으며, 네트워크 문제를 분석할 때 많이 사용됩니다.&#xA;플랫폼 또한 Windows, macOS, Linux 등 다양한 운영체제에서 사용할 수 있습니다.&#xA;GUI가 꽤 편하기 때문에 Windows나 macOS에서는&#xA;&lt;a href=&#34;https://www.wireshark.org/docs/man-pages/wireshark.html?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Wireshark&lt;/a&gt;&#xA;&#xA;를 사용하는 경우가 많습니다.&#xA;여기서는 CLI 환경에서도 사용할 수 있는&#xA;&lt;a href=&#34;https://www.wireshark.org/docs/man-pages/tshark.html?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;TShark&lt;/a&gt;&#xA;&#xA;를 소개합니다.&lt;/p&gt;&#xA;&lt;h1 id=&#34;설치&#34;&gt;설치&lt;/h1&gt;&#xA;&lt;p&gt;Ubuntu 22.04에서 설치하는 방법을 소개합니다.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#000;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;display:grid;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0f0&#34;&gt;# CLI&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install tshark&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0f0&#34;&gt;# GUI&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install wireshark&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;wireshark&lt;/code&gt; 그룹 추가 후 컴퓨터를 재부팅해야 합니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>한국어를 지원하지 않는 게임의 비공식 한국어 패치 만들기</title>
      <link>https://markruler.com/posts/reverse-engineering/game-localization/</link>
      <pubDate>Mon, 16 Dec 2024 21:26:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/reverse-engineering/game-localization/</guid>
      <description>&lt;p&gt;스팀(Steam) 게임들은 PC에 파일이 설치되기 때문에 다른 플랫폼보다 게임 모드(Mod)나 패치 도구가 꽤 많습니다.&#xA;그래서 콘솔이나 고전게임보다 한국어 패치 제작 난이도가 쉽습니다.&#xA;한국어 패치 제작에 입문하기 좋은 플랫폼이라고 생각합니다.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ea%b2%8c%ec%9e%84-%ec%a0%80%ec%9e%91%ea%b6%8c%ea%b3%bc-%ed%95%9c%ea%b5%ad%ec%96%b4-%ed%8c%a8%ec%b9%98&#34;&gt;게임 저작권과 한국어 패치&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%8c%80%ed%91%9c%ec%a0%81%ec%9d%b8-%ea%b2%8c%ec%9e%84-%ec%97%94%ec%a7%84%eb%b3%84-%ed%95%9c%ea%b5%ad%ec%96%b4-%ed%8c%a8%ec%b9%98-%ec%a0%9c%ec%9e%91-%eb%b0%a9%eb%b2%95&#34;&gt;대표적인 게임 엔진별 한국어 패치 제작 방법&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%96%b8%ed%8c%a9-%eb%8f%84%ea%b5%ac-%ec%82%ac%ec%9a%a9%ed%95%98%ea%b8%b0&#34;&gt;언팩 도구 사용하기&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%9c%a0%eb%8b%88%ed%8b%b0-unity&#34;&gt;유니티 (Unity)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%96%b8%eb%a6%ac%ec%96%bc-%ec%97%94%ec%a7%84-unreal-engine&#34;&gt;언리얼 엔진 (Unreal Engine)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ea%b2%8c%ec%9e%84%eb%a9%94%ec%9d%b4%ec%bb%a4-gamemaker-studio-2&#34;&gt;게임메이커 (GameMaker Studio 2)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%a0%8c%ed%8c%8c%ec%9d%b4-renpy---pygame&#34;&gt;렌파이 (Ren&amp;rsquo;Py - PyGame)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ea%b3%a0%eb%8f%84-godot&#34;&gt;고도 (Godot)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%a6%ac%eb%b2%84%ec%8a%a4-%ec%97%94%ec%a7%80%eb%8b%88%ec%96%b4%eb%a7%81-reverse-engineering&#34;&gt;리버스 엔지니어링 (Reverse Engineering)&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#love2d&#34;&gt;Love2D&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ea%b3%a0%ec%a0%84-%ea%b2%8c%ec%9e%84&#34;&gt;고전 게임&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%8b%a4%ec%8b%9c%ea%b0%84-%eb%b2%88%ec%97%ad&#34;&gt;실시간 번역&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#xunity-auto-translator&#34;&gt;XUnity Auto Translator&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#mort-monkeyheads-ocr-realtime-translator&#34;&gt;MORT (MonkeyHead&amp;rsquo;s OCR Realtime Translator)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ed%8c%a8%ec%b9%98-%ed%94%84%eb%a1%9c%ea%b7%b8%eb%9e%a8patcher-%ec%a0%9c%ec%9e%91&#34;&gt;패치 프로그램(Patcher) 제작&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%8d%94-%ec%9d%bd%ec%9d%84%ea%b1%b0%eb%a6%ac&#34;&gt;더 읽을거리&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;게임-저작권과-한국어-패치&#34;&gt;게임 저작권과 한국어 패치&lt;/h1&gt;&#xA;&lt;p&gt;먼저 저작권부터 이야기해야 할 것 같습니다.&#xA;엄연히 게임 파일을 수정하고 배포하는 것은 저작권법 위반입니다.&#xA;당연히 배포가 목적이라면 게임 개발사에 허락을 받아야 합니다.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>파일 시그니처와 파일 카빙: 바이너리 데이터가 이상한 문자열로 표현되는 이유</title>
      <link>https://markruler.com/posts/reverse-engineering/file-signature/</link>
      <pubDate>Tue, 10 Dec 2024 22:46:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/reverse-engineering/file-signature/</guid>
      <description>&lt;h1 id=&#34;개요&#34;&gt;개요&lt;/h1&gt;&#xA;&lt;p&gt;이미지를 다운로드하면 응답 데이터로 이상한 문자열이 출력됩니다.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#000;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;display:grid;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0f0&#34;&gt;# Youtube의 빈 썸네일 이미지를 다운로드 받습니다.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -L -o - https://i.ytimg.com/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#000;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;display:grid;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;����JFIF���&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;�      !�&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;!&lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#34;12ARaBqr��U�����������Qbd�������&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#87ceeb&#34;&gt;                                  ?�@��t��2�4�2�4��&amp;amp;`�f�b��*)��6�j�pVZ7՚�ތC:#uf��§���&amp;lt;�Z�W&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#87ceeb&#34;&gt;�oMku�@��&amp;lt;\�O����H����M?^_��n&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#87ceeb&#34;&gt;                             Z��W�:&amp;gt;vW���ҟ˃lr�h�8e�z*ڷ�zw�ie4�&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#87ceeb&#34;&gt;e�C�#:=(���R�&amp;#39;F��0���e�&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#87ceeb&#34;&gt;                       �&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#87ceeb&#34;&gt;                        ���T���9�p�z�n/1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#87ceeb&#34;&gt;                                        �mSV��t�V�&amp;#34;&lt;/span&gt;��U �MI�;w��{O%��q&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                                                     �[&lt;span style=&#34;color:#eedd82&#34;&gt;$x&lt;/span&gt;�7UV��⫫�t����=6�l�&lt;span style=&#34;color:#87ceeb&#34;&gt;`&lt;/span&gt;Si)u7&#x9;u�^z*UW��[���L�˭��a?&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                                                                                                            yn��mN���K��:��Z��&amp;amp;_&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                                                                                                                                ���{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ����j�sj�j-T���U�^m�2&lt;span style=&#34;color:#87ceeb&#34;&gt;\�&lt;/span&gt;O7��M�{�V�v��Vݝz�ԞRe|8��?�4qL5�i��Z��V�2e�ʝ��&amp;#39;����%zV����v�8&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.A.@��F���&amp;gt;�8]�JU��ҕj�z�Vb~��o)*�Ҍ������/�n���{m�Ա��vI��U�qoZ�+U��Z{�&amp;amp;Z��;��B�������k�XЏR�;*t��&#x9;|J�-���ku�Kk5_s�[8�te��d�kĮl��%�{]�i���ɩ{5}%Y���in��sYa��*�ɭ��߯ko&amp;gt;��� f��,[��ٷ�h��?X|Yg�j?��1���s��t��� HJ�&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                             �^�f�4��Vނu-m�շ�����&lt;span style=&#34;color:#87ceeb&#34;&gt;`&lt;/span&gt;l���^���U{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                                                            &amp;amp;H��%&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;�는 유니코드 replacement character(&lt;code&gt;U+FFFD&lt;/code&gt;)로, 해석할 수 없는 문자를 표시하기 위해 사용됩니다.&lt;/p&gt;&#xA;&lt;p&gt;이번엔 hexdump로 만들어주는 &lt;code&gt;xxd&lt;/code&gt; 명령어를 파이프로 이어보겠습니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>웹 페이지 응답 방법과 프레임워크</title>
      <link>https://markruler.com/posts/web/respond-web-page/</link>
      <pubDate>Sun, 24 Nov 2024 23:32:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/web/respond-web-page/</guid>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#cgi-common-gateway-interface&#34;&gt;CGI (Common Gateway Interface)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#ssr-server-side-rendering&#34;&gt;SSR (Server-Side Rendering)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%84%9c%eb%b2%84-%ed%85%9c%ed%94%8c%eb%a6%bf-%ec%97%94%ec%a7%84&#34;&gt;서버 템플릿 엔진&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#csr-client-side-rendering&#34;&gt;CSR (Client-side Rendering)&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#spa-single-page-application&#34;&gt;SPA (Single Page Application)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#web-api-web-component&#34;&gt;Web API: Web Component&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#pwa-progressive-web-apps&#34;&gt;PWA (Progressive Web Apps)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#ssg-static-site-generation&#34;&gt;SSG (Static Site Generation)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#cms-content-management-system&#34;&gt;CMS (Content Management System)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#micro-frontend-architecture-mfa&#34;&gt;Micro Frontend Architecture (MFA)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%95%84%ec%9d%bc%eb%9e%9c%eb%93%9c-%ec%95%84%ed%82%a4%ed%85%8d%ec%b3%90-island-architecture&#34;&gt;아일랜드 아키텍쳐 (Island Architecture)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%9b%b9%eb%b7%b0webview---%eb%aa%a8%eb%b0%94%ec%9d%bc-%ec%95%b1%ec%97%90%ec%84%9c&#34;&gt;웹뷰(WebView) - 모바일 앱에서&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%8d%94-%ec%9d%bd%ec%9d%84%ea%b1%b0%eb%a6%ac&#34;&gt;더 읽을거리&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;cgi-common-gateway-interface&#34;&gt;CGI (Common Gateway Interface)&lt;/h1&gt;&#xA;&lt;p&gt;웹 서버와 외부 프로그램(애플리케이션) 간에 데이터를 주고받기 위한 인터페이스입니다.&#xA;웹 서버가 클라이언트(브라우저)로부터 요청을 받으면, CGI 프로그램을 호출하여 동적으로 콘텐츠를 생성한 뒤, 그 결과를 클라이언트에 반환합니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Facebook은 경쟁사의 암호화된 모바일 앱 트래픽을 어떻게 가로챘을까?</title>
      <link>https://markruler.com/posts/network/onavo-facebook-ssl-mitm-technical-analysis/</link>
      <pubDate>Thu, 12 Sep 2024 00:17:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/network/onavo-facebook-ssl-mitm-technical-analysis/</guid>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://doubleagent.net/onavo-facebook-ssl-mitm-technical-analysis/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;How did Facebook intercept their competitor&amp;rsquo;s encrypted mobile app traffic?&lt;/a&gt;&#xA;&#xA;&#xA;| &lt;a href=&#34;https://x.com/haxrob?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;HaxRob&lt;/a&gt;&#xA;&#xA;, 2024년 4월 14일&lt;/li&gt;&#xA;&lt;li&gt;저자의 허락을 받고 번역했습니다.&lt;/li&gt;&#xA;&lt;li&gt;각주는 역주입니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;이 글은 페이스북(Facebook) 집단 소송에서 밝혀진 정보를 바탕으로 한 기술 조사입니다.&#xA;페이스북은 경쟁사의 정보를 얻기 위해 Onavo Protect 앱이 실행 중인 사용자 기기에서 암호화된 트래픽을 도청했었다는 이유로 재판이 진행 중입니다.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://markruler.com/images/network/onavo-facebook-ssl-mitm-technical-analysis/fbdark-1.webp&#34; alt=&#34;How did Facebook intercept their competitor&amp;rsquo;s encrypted mobile app traffic?&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;2024년 7월 28일 - 👋Hello &lt;a href=&#34;https://news.ycombinator.com/item?id=41090304&amp;amp;utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Hackernews&lt;/a&gt;&#xA;&#xA;!&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>일상에서의 스왑 메모리 (Swap Memory)</title>
      <link>https://markruler.com/posts/os/swap-memory/</link>
      <pubDate>Thu, 05 Sep 2024 21:13:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/os/swap-memory/</guid>
      <description>&lt;p&gt;&lt;strong&gt;스왑 메모리는 물리 메모리 용량이 부족할 때 사용되는 가상 메모리 영역&lt;/strong&gt;입니다.&#xA;고사양 작업 중 메모리가 부족해서 컴퓨터가 자주 멈춘다면 스왑 메모리를 늘려보는 것도 하나의 방법입니다.&#xA;이 글은 &lt;strong&gt;Ubuntu&lt;/strong&gt;에서 &lt;strong&gt;스왑 메모리를 file로 설정&lt;/strong&gt;하고, 나의 환경에 맞게 조정하기 위해 &lt;strong&gt;모니터링 하는 방법&lt;/strong&gt;을 설명합니다.&lt;/p&gt;&#xA;&lt;p&gt;먼저 스왑 메모리 설정을 확인합니다.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#000;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;display:grid;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo swapon --show&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;설정되어 있지 않다면 아무것도 출력되지 않습니다.&#xA;&lt;em&gt;Ubuntu 24.04 기준&lt;/em&gt;으로는 기본적으로 다음과 같이 &lt;code&gt;/swap.img&lt;/code&gt;가 설정되어 있습니다.&#xA;하지만 이 글은 설정되어 있지 않다는 전제로 진행합니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>IP로 지리적 위치(Geolocation) 찾기</title>
      <link>https://markruler.com/posts/network/ip-geolocation/</link>
      <pubDate>Thu, 29 Aug 2024 22:38:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/network/ip-geolocation/</guid>
      <description>&lt;h1 id=&#34;현상&#34;&gt;현상&lt;/h1&gt;&#xA;&lt;p&gt;약 10ms 응답속도가 예상되는 API에 500~700ms의 응답속도가 발생했습니다.&lt;/p&gt;&#xA;&lt;h1 id=&#34;원인&#34;&gt;원인&lt;/h1&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://markruler.com/images/network/ip-geolocation/ipapi-latency.png&#34; alt=&#34;ipapi Latency&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;해당 API에서는 국가별로 다른 정책을 적용하기 위해 IP로 국가 정보&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;를 조회하는 기능이 가장 먼저 수행됩니다.&#xA;국가 정보의 출처는 ipapi라는 유료 API 서비스와 IPInfoDB라는 무료 서비스입니다.&#xA;대략적인 코드는 다음과 같습니다.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#000;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;display:grid;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;@Cacheable(value = CacheName.IPAPI_COUNTRY_CODE, key = &lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#34;#ipAddress&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f00&#34;&gt;public&lt;/span&gt; Geolocation &lt;span style=&#34;color:#ff0&#34;&gt;findIsoCountryCode&lt;/span&gt;(&lt;span style=&#34;color:#f00&#34;&gt;final&lt;/span&gt; String ipAddress) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f00&#34;&gt;if&lt;/span&gt; (isPrivate(ipAddress)) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f00&#34;&gt;return&lt;/span&gt; Geolocation.korea();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f00&#34;&gt;var&lt;/span&gt; ipapi = ipapiFeignClient.findGeolocationByIpAddress(ipAddress, IPAPI_ACCESS_KEY);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f00&#34;&gt;if&lt;/span&gt; (ipapi != &lt;span style=&#34;color:#f00&#34;&gt;null&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f00&#34;&gt;return&lt;/span&gt; Geolocation.from(ipapi);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f00&#34;&gt;var&lt;/span&gt; ipInfoDB = ipInfoDBFeignClient.findGeolocationByIpAddress(ipAddress, IPINFODB_ACCESS_KEY);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f00&#34;&gt;if&lt;/span&gt; (ipInfoDB != &lt;span style=&#34;color:#f00&#34;&gt;null&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f00&#34;&gt;return&lt;/span&gt; Geolocation.from(ipInfoDB);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f00&#34;&gt;return&lt;/span&gt; Geolocation.korea();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;문제는 API가 아무리 빨라도 해당 IP Geolocation 서비스에서 응답받는 데에 평균 약 500ms 정도 소요되었다는 것입니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Traceparent 헤더로 클라이언트부터 서버까지 추적하기</title>
      <link>https://markruler.com/posts/web/traceparent-datadog/</link>
      <pubDate>Thu, 22 Aug 2024 18:00:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/web/traceparent-datadog/</guid>
      <description>&lt;h1 id=&#34;개요&#34;&gt;개요&lt;/h1&gt;&#xA;&lt;p&gt;모니터링 도구를 확인해보니 며칠동안 특정 기능에 에러가 발생하고 있었습니다.&#xA;해당 에러는 알람 임계점(threshold)보다 낮아서 알람이 발생하지 않았고, 이용자는 버그 리포팅을 하지 않았습니다.&#xA;에러 로그를 확인해보니 서버에서는 유효성 검사를 하지 않았고, 클라이언트 앱에서는 유효하지 않은 파라미터를 전달했습니다.&#xA;서버에서 유효성 검사를 추가할 수 있겠지만, 클라이언트 앱에서의 잘못된 요청(bug)은 원인을 알 수 없었습니다.&#xA;클라이언트 이벤트는 연결되어 있지 않았기 때문입니다.&lt;/p&gt;&#xA;&lt;p&gt;또 다른 문제가 있었습니다.&#xA;서버에서는 정상적인 상태 코드와 함께 100ms 정도의 속도로 응답했지만&#xA;클라이언트에서는 4초 이상의 지연이 발생하거나 아래와 같은 Akamai 에러 페이지가 응답되었습니다.&#xA;그리고 모든 요청이 아닌 전체 요청의 5% 정도에서만 발생하고 있었습니다.&#xA;하지만 국가, Edge IP, User Agent, 요청 URL 등을 확인해봐도 특정 패턴을 보이는 것이 없어서 원인을 알 수 없었습니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Docker Compose로 간단하게 Ollama 시작하기</title>
      <link>https://markruler.com/posts/ai/ollama-openwebui-docker-compose/</link>
      <pubDate>Wed, 31 Jul 2024 23:48:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/ai/ollama-openwebui-docker-compose/</guid>
      <description>&lt;h1 id=&#34;대형-언어-모델-llm-large-language-model&#34;&gt;대형 언어 모델 (LLM, Large Language Model)&lt;/h1&gt;&#xA;&lt;p&gt;&lt;strong&gt;LLM은 방대한 양의 데이터로 사전 학습된 초대형 딥 러닝 모델&lt;/strong&gt;&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;입니다.&#xA;이를 활용해 텍스트를 생성하거나 분류, 요약, 번역 등&#xA;다양한 자연어 처리 작업(NLP, Natural Language Processing)을 수행할 수 있습니다.&lt;/p&gt;&#xA;&lt;p&gt;일반적으로 &lt;strong&gt;700억 개(70 Billion) 이상의 파라미터를 갖는 모델을 LLM&lt;/strong&gt;이라고 합니다.&#xA;&lt;strong&gt;70억 개(7 Billion) 수준의 파라미터를 갖는 모델은 SLM&lt;/strong&gt;(Small Language Model)이라고 합니다.&#xA;이 사이에 &lt;strong&gt;중간 규모의 모델은 sLLM&lt;/strong&gt;(smaller Large Language Model)이라고 합니다.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Ollama&lt;/strong&gt;는 오픈소스 LLM을 쉽게 실행할 수 있게 도와주는 도구입니다.&#xA;&lt;strong&gt;Open WebUI&lt;/strong&gt;는 ChatGPT 화면처럼 LLM과 대화 시 웹 UI를 제공하는 오픈소스입니다.&#xA;이 2가지 도구를 간단하게 사용해보겠습니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>유용한 구글 크롬(Google Chrome)의 기능</title>
      <link>https://markruler.com/posts/web/google-chrome/</link>
      <pubDate>Mon, 29 Jul 2024 00:51:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/web/google-chrome/</guid>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#chrome-urls&#34;&gt;Chrome URLs&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%b6%81%eb%a7%88%ed%81%b4%eb%a6%bf-bookmarklet&#34;&gt;북마클릿 Bookmarklet&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%9c%a0%ec%9a%a9%ed%95%9c-%eb%b6%81%eb%a7%88%ed%81%b4%eb%a6%bf&#34;&gt;유용한 북마클릿&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%9e%90%eb%b0%94%ec%8a%a4%ed%81%ac%eb%a6%bd%ed%8a%b8-%ec%8a%a4%eb%8b%88%ed%8e%ab&#34;&gt;자바스크립트 스니펫&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ea%b0%9c%eb%b0%9c%ec%9e%90-%eb%8f%84%ea%b5%ac-devtools&#34;&gt;개발자 도구 DevTools&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#performance-%ed%8c%a8%eb%84%90&#34;&gt;Performance 패널&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#network-%ed%8c%a8%eb%84%90&#34;&gt;Network 패널&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#network-log&#34;&gt;Network Log&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#network-conditions&#34;&gt;Network Conditions&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#html-%eb%ac%b8%ec%84%9c-%ec%83%9d%eb%aa%85%ec%a3%bc%ea%b8%b0&#34;&gt;HTML 문서 생명주기&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#network-%ed%8c%a8%eb%84%90%ec%97%90%ec%84%9c-har-%ea%b0%80%ec%a0%b8%ec%98%a4%ea%b8%b0&#34;&gt;Network 패널에서 HAR 가져오기&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#sources-%ed%8c%a8%eb%84%90&#34;&gt;Sources 패널&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%a1%9c%ec%bb%ac-%ec%9e%ac%ec%a0%95%ec%9d%98-local-overrides&#34;&gt;로컬 재정의 (Local Overrides)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#override-%ed%8c%8c%ec%9d%bc%ec%9d%84-%ec%a0%80%ec%9e%a5%ed%95%a0-%ed%8f%b4%eb%8d%94-%ec%a7%80%ec%a0%95&#34;&gt;Override 파일을 저장할 폴더 지정&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#console&#34;&gt;Console&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%b0%b8%ec%a1%b0&#34;&gt;참조&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;chrome-urls&#34;&gt;Chrome URLs&lt;/h1&gt;&#xA;&lt;p&gt;크롬 URL은 Google Chrome 브라우저에서 설정 페이지나 특정 기능으로 빠르게 접근할 수 있게 해주는 내부 주소입니다.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;chrome://about/&lt;/code&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;크롬 URL 목록&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;chrome://net-internals/#hsts&lt;/code&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;HSTS 조회 및 비활성화&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;chrome://inspect#devices&lt;/code&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;USB로 &lt;strong&gt;모바일 디바이스&lt;/strong&gt;를 연결해서 개발자 도구(DevTools)로 모바일 크롬 앱을 확인할 수 있습니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;북마클릿-bookmarklet&#34;&gt;북마클릿 Bookmarklet&lt;/h1&gt;&#xA;&lt;p&gt;북마클릿은 자바스크립트 코드를 포함하고 있는 북마크로, 사용자가 클릭하면 해당 코드가 실행되어 특정 작업을 수행합니다.&#xA;북마클릿(Bookmarklet)이라는 단어는 북마크(Bookmark)와 애플릿(Applet)의 합성어입니다.&#xA;북마크의 편리함과 애플릿의 실행 기능을 결합한 형태를 잘 나타냅니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>APM만큼 중요한 네트워크 모니터링</title>
      <link>https://markruler.com/posts/web/apm-network-device-troubleshooting-mistakes/</link>
      <pubDate>Thu, 25 Jul 2024 01:22:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/web/apm-network-device-troubleshooting-mistakes/</guid>
      <description>&lt;p&gt;APM은 애플리케이션 성능 모니터링(Application Performance Monitoring)입니다.&#xA;저희 팀이 사용하는 모니터링 서비스 데이터독(Datadog)은 APM에서 많은 것을 확인할 수 있습니다.&#xA;(인프라, 로그, 호스트의 프로세스, JVM 런타임 메트릭, 각 리소스별 레이턴시 등등)&lt;/p&gt;&#xA;&lt;h1 id=&#34;문제&#34;&gt;문제&lt;/h1&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://markruler.com/images/web/apm-network-device-troubleshooting-mistakes/first.png&#34; alt=&#34;First&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;어느날 체감이 될 정도로 서비스의 레이턴시가 높아지고, 정각마다 스파이크 발생했습니다.&#xA;또한 서비스 전체에 영향이 있었습니다.&lt;/p&gt;&#xA;&lt;h1 id=&#34;분석-쉽게-간과했던-문제&#34;&gt;분석: 쉽게 간과했던 문제&lt;/h1&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://markruler.com/posts/db/oracle-dbms-session-diagnosis/&#34;&gt;Oracle Session 히스토리&lt;/a&gt;&#xA;&#xA;를 남겨서 확인했을 때&#xA;DB에 부하를 일으키면서 반복적으로 보이는 느린 쿼리가 없었습니다.&#xA;DB 문제는 아니었습니다.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://markruler.com/images/web/apm-network-device-troubleshooting-mistakes/oracle-session.webp&#34; alt=&#34;Oracle Session 히스토리&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>네트워크 장비 모니터링을 위한 SNMP</title>
      <link>https://markruler.com/posts/network/snmp/</link>
      <pubDate>Tue, 23 Jul 2024 19:08:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/network/snmp/</guid>
      <description>&lt;p&gt;주로 네트워크 장비의 Metric을 확인하는 모니터링 용도로 사용하지만,&#xA;SNMP를 지원하는 컴퓨팅 머신이라면 모두 활용할 수 있습니다.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%a0%84%ec%a0%9c-%ec%a1%b0%ea%b1%b4&#34;&gt;전제 조건&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ea%b5%ac%ec%84%b1-%ec%9a%94%ec%86%8c&#34;&gt;구성 요소&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%a7%a4%eb%8b%88%ec%a0%80-%ec%97%90%ec%9d%b4%ec%a0%84%ed%8a%b8-%ec%97%ad%ed%95%a0&#34;&gt;매니저-에이전트 역할&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%a7%a4%eb%8b%88%ec%a0%80-%ec%97%90%ec%9d%b4%ec%a0%84%ed%8a%b8-%ed%86%b5%ec%8b%a0-%eb%b0%a9%ec%8b%9d&#34;&gt;매니저-에이전트 통신 방식&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%bb%a4%eb%ae%a4%eb%8b%88%ed%8b%b0-%ec%9d%b4%eb%a6%84&#34;&gt;커뮤니티 이름&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%b2%84%ec%a0%84%eb%b3%84-%ec%b0%a8%ec%9d%b4&#34;&gt;버전별 차이&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#v1&#34;&gt;v1&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#v2&#34;&gt;v2&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#v2c&#34;&gt;v2c&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#v3&#34;&gt;v3&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ea%b4%80%eb%a0%a8-%eb%aa%85%eb%a0%b9%ec%96%b4-%eb%8f%84%ea%b5%ac&#34;&gt;관련 명령어 도구&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#snmpget&#34;&gt;snmpget&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#snmpwalk&#34;&gt;snmpwalk&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#mib-2-oid-object-id&#34;&gt;MIB-2 OID (Object ID)&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#ex-136121-%eb%b6%84%ed%95%b4&#34;&gt;ex: 1.3.6.1.2.1 분해&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#1361211-system&#34;&gt;1.3.6.1.2.1.1 system&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#1361212-interfaces&#34;&gt;1.3.6.1.2.1.2 interfaces&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#1361213-at---address-translation&#34;&gt;1.3.6.1.2.1.3 at - Address Translation&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#1361214-ip---internet-protocol&#34;&gt;1.3.6.1.2.1.4 ip - Internet Protocol&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#13612131-ifmib&#34;&gt;1.3.6.1.2.1.31 ifMIB&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%b0%b8%ec%a1%b0&#34;&gt;참조&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;전제-조건&#34;&gt;전제 조건&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;IP 네트워크 환경이 있다.&lt;/li&gt;&#xA;&lt;li&gt;관리용 서버(SNMP 서버)가 있다.&lt;/li&gt;&#xA;&lt;li&gt;SNMP 프로토콜을 지원하는 기기다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;구성-요소&#34;&gt;구성 요소&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;매니저 (SNMP 서버)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;네트워크 감시 장치(서버)에 설치해서 사용하는 소프트웨어&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;에이전트 (네트워크 기기/서버)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;네트워크 기기나 서버가 가진 기기의 상태 정보를 통보하는 기능&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;SNMP 프로토콜 (TCP/IP)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;UDP 패킷에 실어서 주고받으며, 포트 번호는 161(SNMP), 162(TRAP)를 사용합니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;MIB (Management Information Base)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;SNMP로 관리되는 네트워크 기기나 서버가 자신의 상태를 외부에 알리기 위해서 공개하는 관리 정보.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://datatracker.ietf.org/doc/html/rfc1156?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;RFC 1156&lt;/a&gt;&#xA;&#xA;으로 규정된 MIB1,&#xA;&lt;a href=&#34;https://datatracker.ietf.org/doc/html/rfc1213?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;RFC 1213&lt;/a&gt;&#xA;&#xA;으로 규정된 MIB2&lt;/li&gt;&#xA;&lt;li&gt;MIB를 지원하는 기기에 일반적으로 포함된 표준 MIB와 기기 제조사마다 사양이 다른 사설(Private) MIB가 있습니다.&lt;/li&gt;&#xA;&lt;li&gt;MIB의 구조는 트리 구조이며, 트리 구조의 마디(노드)는 번호를 붙여서 나타냅니다. 이 번호열을 OID(Object ID)라고 합니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;매니저-에이전트-역할&#34;&gt;매니저-에이전트 역할&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;정보의 요청과 응답&#xA;&lt;ul&gt;&#xA;&lt;li&gt;매니저가 에이전트에게 대상 기기의 정보를 요청 → 에이전트는 정보를 매니저에게 응답&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;설정의 요청과 응답&#xA;&lt;ul&gt;&#xA;&lt;li&gt;매니저가 에이전트에게 대상 기기의 설정 변경을 요청 → 에이전트는 설정을 변경하며 그 결과를 매니저에게 응답&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;상태 변화의 통보&#xA;&lt;ul&gt;&#xA;&lt;li&gt;에이전트가 매니저에게 대상 기기의 상태 변화를 통보&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;매니저-에이전트-통신-방식&#34;&gt;매니저-에이전트 통신 방식&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;폴링 (Polling)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;매니저가 정기적으로 에이전트로부터 관리 정보를 추출합니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;트랩 (Trap)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;에이전트인 라우터나 스위치가 자신의 상태에 어떤 변화가 발생했을 때(장애 발생 등) 자발적으로 매니저인 SNMP 서버에게 정보를 통보합니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;커뮤니티-이름&#34;&gt;커뮤니티 이름&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;매니저와 에이전트는 커뮤니티 이름으로 그룹화합니다.&lt;/li&gt;&#xA;&lt;li&gt;매니저와 에이전트는 커뮤니티 이름이 같을 때만 통신합니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;버전별-차이&#34;&gt;버전별 차이&lt;/h1&gt;&#xA;&lt;h2 id=&#34;v1&#34;&gt;v1&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;커뮤니티 이름이 포함된 패킷을 평문으로 전달합니다.&lt;/li&gt;&#xA;&lt;li&gt;기본적인 관리 정보 베이스(MIB)와 트랩 메시지를 사용합니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;v2&#34;&gt;v2&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;커뮤니티 이름이 포함된 패킷을 암호화해서 전달합니다.&lt;/li&gt;&#xA;&lt;li&gt;추가된 PDU 타입(예: &lt;a href=&#34;http://www.ktword.co.kr/test/view/view.php?m_temp1=5270&amp;amp;utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;GetBulkRequest&lt;/a&gt;&#xA;&#xA;)을 통해 대량의 데이터를 한 번에 전송할 수 있습니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;v2c&#34;&gt;v2c&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;커뮤니티 값을 암호화하여 전달하는 것이 복잡해서 v1처럼 평문으로 전달할 수 있도록 원복되었습니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;v3&#34;&gt;v3&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;(username, password) 인증 기능이 추가되었습니다.&lt;/li&gt;&#xA;&lt;li&gt;이 외 다양한 보안 기능 추가되었습니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;관련-명령어-도구&#34;&gt;관련 명령어 도구&lt;/h1&gt;&#xA;&lt;h2 id=&#34;snmpget&#34;&gt;snmpget&lt;/h2&gt;&#xA;&lt;p&gt;정확한 OID를 입력해야 합니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>일상에서의 SSH</title>
      <link>https://markruler.com/posts/network/ssh/</link>
      <pubDate>Wed, 17 Jul 2024 22:40:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/network/ssh/</guid>
      <description>&lt;p&gt;원격지의 셸에 접속하기 위해 사용되는 네트워크 프로토콜로&#xA;이 글에서는 업무에서 자주 사용하는 SSH 설정을 정리합니다.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#ssh-key-%ec%83%9d%ec%84%b1&#34;&gt;SSH key 생성&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#ssh-server&#34;&gt;SSH Server&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#authoized_keys&#34;&gt;authoized_keys&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%a3%bc%eb%a1%9c-%ec%82%ac%ec%9a%a9%ed%95%98%eb%8a%94-server-%ec%84%a4%ec%a0%95&#34;&gt;주로 사용하는 Server 설정&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#ssh-client&#34;&gt;SSH Client&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%84%a4%ec%a0%95-%ed%8c%8c%ec%9d%bc-%ec%9a%b0%ec%84%a0-%ec%88%9c%ec%9c%84&#34;&gt;설정 파일 우선 순위&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#known_hosts&#34;&gt;known_hosts&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%a3%bc%eb%a1%9c-%ec%82%ac%ec%9a%a9%ed%95%98%eb%8a%94-host-%ec%84%a4%ec%a0%95&#34;&gt;주로 사용하는 Host 설정&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#git&#34;&gt;Git&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#local-forward&#34;&gt;Local Forward&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#password-%ec%9e%85%eb%a0%a5-%ec%97%86%ec%9d%b4-ssh-key%eb%a1%9c-client%ec%97%90%ec%84%9c-server%eb%a1%9c-%ec%a0%91%ec%86%8d%ed%95%98%ea%b8%b0&#34;&gt;Password 입력 없이 SSH Key로 Client에서 Server로 접속하기&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ed%81%b4%eb%9d%bc%ec%9d%b4%ec%96%b8%ed%8a%b8%ec%97%90%ec%84%9c-%ec%84%a4%ec%a0%95&#34;&gt;클라이언트에서 설정&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%84%9c%eb%b2%84%ec%97%90%ec%84%9c-%ec%84%a4%ec%a0%95&#34;&gt;서버에서 설정&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%b0%b8%ec%a1%b0&#34;&gt;참조&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;ssh-key-생성&#34;&gt;SSH key 생성&lt;/h1&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#000;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;display:grid;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0f0&#34;&gt;# RSA&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh-keygen -t rsa -b &lt;span style=&#34;color:#f60&#34;&gt;4096&lt;/span&gt; -f ~/.ssh/cs.im.rsa -C &lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#34;Changsu Im&amp;#34;&lt;/span&gt; -N &lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#34;password&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#000;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;display:grid;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0f0&#34;&gt;# ED25519&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh-keygen -t ed25519 -f ~/.ssh/cs.im.ed25519 -C &lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#34;Changsu Im&amp;#34;&lt;/span&gt; -N &lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#34;password&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;ssh-server&#34;&gt;SSH Server&lt;/h1&gt;&#xA;&lt;p&gt;SSH 데몬 설정 파일은 &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;이다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>서버 to 서버 요청 시 발생한 DNS 레이턴시</title>
      <link>https://markruler.com/posts/network/server-to-server-dns/</link>
      <pubDate>Thu, 13 Jun 2024 17:40:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/network/server-to-server-dns/</guid>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%b0%b0%ea%b2%bd&#34;&gt;배경&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%b6%84%ec%84%9d-dig-%ec%9c%bc%eb%a1%9c-%ed%85%8c%ec%8a%a4%ed%8a%b8&#34;&gt;분석: dig 으로 테스트&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#nameserver-8888-%eb%a1%9c-%ec%a7%80%ec%a0%95&#34;&gt;nameserver 8.8.8.8 로 지정&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#nameserver%eb%8a%94-resolvconf-%ec%84%a4%ec%a0%95%ec%9d%84-%eb%94%b0%eb%a5%b8%eb%8b%a4&#34;&gt;nameserver는 &lt;code&gt;resolv.conf&lt;/code&gt; 설정을 따른다&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%b9%84%ea%b5%90&#34;&gt;비교&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ed%95%b4%ea%b2%b0-%ed%98%b8%ec%8a%a4%ed%8a%b8-%ed%8c%8c%ec%9d%bc-%ec%88%98%ec%a0%95&#34;&gt;해결: 호스트 파일 수정&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;배경&#34;&gt;배경&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;약 200ms 응답 속도가 예상되는 API가 불규칙적으로 2s까지 스파이크가 발생했습니다.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;해당 API에는 서버 to 서버로 요청하는 기능이 여러 개 포함되어 있습니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;환경: On-Premise(IDC) 환경에 애플리케이션 서버는 컨테이너가 아닌 스탠드얼론 호스트로 실행됩니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;분석-dig-으로-테스트&#34;&gt;분석: dig 으로 테스트&lt;/h1&gt;&#xA;&lt;h2 id=&#34;nameserver-8888-로-지정&#34;&gt;nameserver 8.8.8.8 로 지정&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#000;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;display:grid;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dig @8.8.8.8 api.example.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;첫번째 요청 292 msec&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#000;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;display:grid;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;; Query time: &lt;span style=&#34;color:#f60&#34;&gt;292&lt;/span&gt; msec&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;; SERVER: 8.8.8.8#53(8.8.8.8) (UDP)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;; WHEN: Tue Jun &lt;span style=&#34;color:#f60&#34;&gt;11&lt;/span&gt; 11:00:54 KST &lt;span style=&#34;color:#f60&#34;&gt;2024&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;;; MSG SIZE  rcvd: &lt;span style=&#34;color:#f60&#34;&gt;154&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2번째 요청 36 msec&lt;/p&gt;</description>
    </item>
    <item>
      <title>Playwright를 사용해서 HTML 페이지를 PDF로 만들기</title>
      <link>https://markruler.com/posts/pdf/html-to-pdf/</link>
      <pubDate>Tue, 12 Dec 2023 22:02:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/pdf/html-to-pdf/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;데모 서버는 &lt;a href=&#34;https://github.com/markruler/htmltopdf?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;markruler/htmltopdf&lt;/a&gt;&#xA;&#xA; 저장소를 사용해주세요.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h1 id=&#34;개요&#34;&gt;개요&lt;/h1&gt;&#xA;&lt;p&gt;팀내에서 문서 생성 도구로 &lt;a href=&#34;https://pdfmyurl.com/html-to-pdf-api?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PDFmyURL&lt;/a&gt;&#xA;&#xA;과&#xA;&lt;a href=&#34;https://www.forcs.com/kr/oz-e-form/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;OZ e-Form&lt;/a&gt;&#xA;&#xA;을 사용하고 있습니다.&#xA;보통 이런 외부 솔루션은 테스트 할 때 매우 불편합니다.&lt;/p&gt;&#xA;&lt;p&gt;PDFmyURL은 PDF를 생성하는 2가지 인터페이스가 있습니다.&#xA;하나는 URL을 통해 페이지를 읽어서 PDF를 생성하는 인터페이스고,&#xA;하나는 raw HTML, CSS를 직접 전달해서 PDF를 생성하는 인터페이스입니다.&#xA;URL 방식은 PDFmyURL 측 서버(서비스 외부)에서 페이지를 조회할 수 있어야 합니다.&#xA;그래서 private 환경에서는 테스트 할 수가 없습니다.&#xA;해당 기능들은 운영 환경에서 QA 테스트를 해야 하는 불상사가 생기는 겁니다.&#xA;더 큰 문제는 데이터를 Public 환경에 노출해야 하기 때문에 데이터에 따라 개인 정보 유출 문제가 될 수 있습니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>오라클 DBMS SE2 세션 사후 진단</title>
      <link>https://markruler.com/posts/db/oracle-dbms-session-diagnosis/</link>
      <pubDate>Sun, 30 Apr 2023 23:58:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/db/oracle-dbms-session-diagnosis/</guid>
      <description>&lt;h1 id=&#34;개요&#34;&gt;개요&lt;/h1&gt;&#xA;&lt;p&gt;저희 팀에서 구독 중인 Oracle DBMS의 라이센스는 Standard Edition 2의 Processor 라이센스(이하 SE2)입니다.&#xA;이 라이센스는 &lt;a href=&#34;https://www.cubrid.com/blog/3813513?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;프로세서 최대 2개, CPU Threads 최대 16개&lt;/a&gt;&#xA;&#xA;까지 사용할 수 있습니다.&#xA;만약 트래픽이 많지 않다면 이 정도 사양으로도 충분하겠지만,&#xA;트래픽이 많아지거나 DB를 비효율적으로 사용하게 되면 성능 저하가 발생할 수 있습니다.&#xA;&lt;strong&gt;하지만 우리는 성능 저하가 발생했을 때 이를 진단할 방법이 없었습니다.&lt;/strong&gt;&#xA;SE2의 경우 AWR(Automatic Workload Repository), ASH(Active Session History)와 같은&#xA;&lt;a href=&#34;https://docs.oracle.com/en/database/oracle/oracle-database/19/dblic/Licensing-Information.html?utm_source=markruler.com&amp;amp;utm_medium=blog#GUID-68A4128C-4F52-4441-8BC0-A66F5B3EEC35&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Oracle Diagnostics Pack&lt;/a&gt;&#xA;&#xA;을&#xA;사용할 수 없습니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Too many open files 에러 트러블슈팅</title>
      <link>https://markruler.com/posts/java/too-many-open-files/</link>
      <pubDate>Mon, 20 Mar 2023 21:58:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/java/too-many-open-files/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;커버 이미지 출처: &lt;a href=&#34;https://stablediffusionweb.com/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Stable diffusion&lt;/a&gt;&#xA;&#xA; &amp;ldquo;swimming pool lane pattern&amp;rdquo;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h1 id=&#34;증상&#34;&gt;증상&lt;/h1&gt;&#xA;&lt;p&gt;스프링 프레임워크(Spring framework)로 만든 웹 애플리케이션에서 비동기로 HTTP 요청하는 기능을 개발하고 있었습니다.&#xA;요구 사항을 위해 동시에 1,000개 이상의 요청을 보낼 때가 있는데, &lt;code&gt;Too many open files&lt;/code&gt; 에러가 발생했습니다.&#xA;작업 PC(Ubuntu 22.04)에서 문제 없이 동작하던 프로그램이&#xA;IDC에 위치한 서버(CentOS 7)에서는 &lt;code&gt;OutOfMemoryError&lt;/code&gt;가 발생하면서 동작하지 않았습니다.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#000;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;display:grid;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;java.lang.OutOfMemoryError: unable to create new native thread&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;java.util.concurrent.ExecutionException: com.markruler.RuntimeException: request error&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Caused by: java.net.SocketException: Too many open files&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;SocketException&lt;/code&gt;인데 &lt;code&gt;Too many open files&lt;/code&gt;? &lt;strong&gt;이게 OOM&lt;/strong&gt;?&#xA;이해되지 않았습니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>엘라스틱서치(Elasticsearch)와 데이터 인덱싱 전략</title>
      <link>https://markruler.com/posts/search/elasticsearch-indexing-strategy/</link>
      <pubDate>Wed, 21 Dec 2022 22:20:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/search/elasticsearch-indexing-strategy/</guid>
      <description>&lt;p&gt;엘라스틱서치(Elasticsearch)는 문서 기반 검색 엔진으로 빠른 키워드 검색 속도를 제공합니다.&#xA;엘라스틱서치가 빠른 이유는 문서의 단어(term)들을 역색인(inverted index)하기 때문입니다.&#xA;책에서 특정 단어를 찾는 걸 상상해 보죠.&#xA;&lt;strong&gt;관계형 데이터베이스(RDB, Relational Database)는&lt;/strong&gt; &lt;code&gt;LIKE&lt;/code&gt; 검색을 통해 검색 키워드가 포함된 &lt;strong&gt;모든 페이지를 찾아야 합니다&lt;/strong&gt;.&#xA;&lt;strong&gt;엘라스틱서치는&lt;/strong&gt; 책 뒷부분에 있는 색인(index)을 보고 &lt;strong&gt;필요한 페이지만 찾으면 됩니다&lt;/strong&gt;.&#xA;이 글에서는 e커머스 서비스에서 검색 성능을 개선하기 위해 도입한 엘라스틱서치와 인덱싱 전략에 대해 소개합니다.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%97%98%eb%9d%bc%ec%8a%a4%ed%8b%b1%ec%84%9c%ec%b9%98-%eb%8f%84%ec%9e%85-%eb%b0%b0%ea%b2%bd&#34;&gt;엘라스틱서치 도입 배경&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#rdb-%eb%8d%b0%ec%9d%b4%ed%84%b0%eb%a5%bc-%ec%9d%b8%eb%8d%b1%ec%8b%b1%ed%95%98%eb%8a%94-%ec%a0%84%eb%9e%b5&#34;&gt;RDB 데이터를 인덱싱하는 전략&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#1-%ea%b0%80%ec%9e%a5-%ec%89%ac%ec%9a%b4-%eb%b0%a9%eb%b2%95-batch&#34;&gt;1. 가장 쉬운 방법 Batch&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#2-update-%eb%8d%b0%ec%9d%b4%ed%84%b0&#34;&gt;2. UPDATE 데이터&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#3-hard-delete-%eb%8d%b0%ec%9d%b4%ed%84%b0&#34;&gt;3. HARD DELETE 데이터&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%8d%94-%ea%b0%9c%ec%84%a0%ed%95%a0-%ec%88%98-%ec%9e%88%eb%8a%94-%eb%b6%80%eb%b6%84&#34;&gt;더 개선할 수 있는 부분&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%9d%b4-%ea%b3%a0%eb%af%bc%ec%9d%84-%ec%a0%80%eb%a7%8c-%ed%96%88%eb%8d%98-%ea%b2%8c-%ec%95%84%eb%8b%88%ec%97%88%ec%8a%b5%eb%8b%88%eb%8b%a4&#34;&gt;이 고민을 저만 했던 게 아니었습니다&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;엘라스틱서치-도입-배경&#34;&gt;엘라스틱서치 도입 배경&lt;/h1&gt;&#xA;&lt;p&gt;&lt;strong&gt;매일 새벽에 장애가 발생하기 시작했습니다&lt;/strong&gt;.&#xA;유저 트래픽이 주로 새벽에 몰리는데, 이때 DB 레이턴시가 높아져서 모든 서버에 장애가 발생했습니다.&#xA;왜 DB 레이턴시가 높았을까요?&#xA;현재 서비스에서 트래픽이 가장 많이 발생하는 페이지가 메인, 상품 검색, 상품 상세 페이지입니다.&#xA;이 중 검색 페이지에서 쿼리 대기 시간이 길어지고 있었습니다.&#xA;원인은 크게 다음과 같습니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Jenkins Workspace 동시성 문제</title>
      <link>https://markruler.com/posts/ci/jenkins-workspace-concurrency/</link>
      <pubDate>Mon, 14 Nov 2022 00:38:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/ci/jenkins-workspace-concurrency/</guid>
      <description>&lt;h1 id=&#34;개요&#34;&gt;개요&lt;/h1&gt;&#xA;&lt;p&gt;Jenkins Pipeline을 사용해서 잡 스케줄러를 실행하기 위해&#xA;&lt;a href=&#34;https://www.jenkins.io/doc/book/pipeline/syntax/?utm_source=markruler.com&amp;amp;utm_medium=blog#triggers&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;triggers&lt;/a&gt;&#xA;&#xA; directive를 사용했습니다.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#000;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;display:grid;&#34;&gt;&lt;code class=&#34;language-groovy&#34; data-lang=&#34;groovy&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pipeline {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    agent any&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    triggers {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        cron(&lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#34;* * * * *&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#0f0&#34;&gt;// HERE&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    stages {...}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    post {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        always {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            cleanWs(cleanWhenNotBuilt: &lt;span style=&#34;color:#f00&#34;&gt;false&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    deleteDirs: &lt;span style=&#34;color:#f00&#34;&gt;true&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    disableDeferredWipeout: &lt;span style=&#34;color:#f00&#34;&gt;true&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    notFailBuild: &lt;span style=&#34;color:#f00&#34;&gt;true&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    patterns: [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        [pattern: &lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#39;.git/**&amp;#39;&lt;/span&gt;, type: &lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#39;EXCLUDE&amp;#39;&lt;/span&gt;],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        [pattern: &lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#39;.gitignore&amp;#39;&lt;/span&gt;, type: &lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#39;EXCLUDE&amp;#39;&lt;/span&gt;],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        [pattern: &lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#39;.meta/**&amp;#39;&lt;/span&gt;, type: &lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#39;EXCLUDE&amp;#39;&lt;/span&gt;],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    ]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;해당 Job은 빌드 간 메타데이터(&lt;code&gt;.meta/&lt;/code&gt;)를 공유해야 했기 때문에&#xA;&lt;a href=&#34;https://plugins.jenkins.io/ws-cleanup/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;cleanWs&lt;/a&gt;&#xA;&#xA; 플러그인에서도&#xA;&lt;code&gt;.git&lt;/code&gt; 디렉토리와 함께 삭제되지 않도록 설정했습니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tomcat 이해하기</title>
      <link>https://markruler.com/posts/java/tomcat/</link>
      <pubDate>Tue, 23 Aug 2022 02:45:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/java/tomcat/</guid>
      <description>&lt;p&gt;Java Servlet, JavaServer Pages(JSP), 그리고 WebSocket과 같은&#xA;&lt;strong&gt;Java 웹 애플리케이션을 실행할 수 있도록 지원&lt;/strong&gt;하는&#xA;오픈 소스 &lt;strong&gt;웹 애플리케이션 서버&lt;/strong&gt;(&lt;strong&gt;서블릿 컨테이너&lt;/strong&gt;)입니다.&lt;/p&gt;&#xA;&lt;p&gt;일반적인 웹 서버(Apache HTTP Server, Nginx 등)는&#xA;정적 파일(HTML, CSS, JavaScript 등)을 클라이언트에게 제공하지만,&#xA;Tomcat은 &lt;strong&gt;동적인 Java 웹 애플리케이션&lt;/strong&gt;을 실행할 수 있는 환경을 제공합니다.&lt;/p&gt;&#xA;&lt;h1 id=&#34;역할&#34;&gt;역할&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Servlet 컨테이너&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Java Servlet을 실행하고 클라이언트의 요청을 처리하여 응답을 반환합니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;JSP 엔진&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;JSP(JavaServer Pages)를 컴파일하고 실행합니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;웹 애플리케이션 실행&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;web.xml&lt;/code&gt; 설정 파일을 기반으로 웹 애플리케이션을 관리합니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;HTTP 요청 처리&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;HTTP/HTTPS 프로토콜을 사용하여 클라이언트와 서버 간의 요청-응답을 처리합니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;구조&#34;&gt;구조&lt;/h1&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://markruler.com/images/java/tomcat-architecture.png&#34; alt=&#34;Tomcat Architecture&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>X Desktop Group</title>
      <link>https://markruler.com/posts/gui/x-based-desktop/</link>
      <pubDate>Sun, 21 Aug 2022 23:04:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/gui/x-based-desktop/</guid>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#freedesktoporg&#34;&gt;freedesktop.org&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ea%b4%80%eb%a0%a8-%ec%86%8c%ed%94%84%ed%8a%b8%ec%9b%a8%ec%96%b4&#34;&gt;관련 소프트웨어&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#xdg-user-dirs-xdg-user-directories&#34;&gt;xdg-user-dirs (XDG user directories)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#xdg-open-open&#34;&gt;xdg-open (open)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#x-window-system&#34;&gt;X Window System&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%84%9c%eb%b2%84-%eb%b2%84%ec%a0%84%ec%97%90-x-window-system-%ec%84%a4%ec%b9%98&#34;&gt;서버 버전에 X Window System 설치&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#x-window-system-%ec%82%ad%ec%a0%9c&#34;&gt;X Window System 삭제&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#x11-forwarding&#34;&gt;X11 Forwarding&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#gnome-%eb%8d%b0%ec%8a%a4%ed%81%ac%ed%83%91&#34;&gt;GNOME 데스크탑&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#gui-toolkit&#34;&gt;GUI Toolkit&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#gtk-gimp-toolkit&#34;&gt;GTK: GIMP ToolKit&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#qt&#34;&gt;Qt&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#gui-%eb%8d%b0%ec%8a%a4%ed%81%ac%ed%83%91-%ed%99%98%ea%b2%bd%ea%b3%bc-%ea%b4%80%eb%a0%a8%eb%90%9c-%ec%b6%94%ea%b0%80-%ec%86%8c%ed%94%84%ed%8a%b8%ec%9b%a8%ec%96%b4&#34;&gt;GUI 데스크탑 환경과 관련된 추가 소프트웨어&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#vnc-virtual-network-computing&#34;&gt;VNC: Virtual Network Computing&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#rdp-remote-desktop-protocol&#34;&gt;RDP: Remote Desktop Protocol&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%b0%b8%ec%a1%b0&#34;&gt;참조&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;freedesktoporg&#34;&gt;freedesktop.org&lt;/h1&gt;&#xA;&lt;p&gt;XDG는 &lt;code&gt;X Desktop Group&lt;/code&gt;의 약자로, &lt;a href=&#34;https://freedesktop.org?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;freedesktop.org&lt;/a&gt;&#xA;&#xA;의 옛 이름입니다.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;freedesktop.org hosts the development of free and open source software, focused on interoperability and shared technology for open-source graphical and desktop systems.&#xA;&lt;br&gt;&#xA;&lt;br&gt;&#xA;freedesktop.org는 오픈 소스 그래픽 및 데스크탑 시스템을 위한 상호 운용성과 공유 기술에 중점을 둔 무료 및 오픈 소스 소프트웨어의 개발을 주도합니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Load Balancer를 활용해서 배포 프로세스를 개선해보자</title>
      <link>https://markruler.com/posts/ci/ci-with-lb/</link>
      <pubDate>Wed, 17 Aug 2022 03:44:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/ci/ci-with-lb/</guid>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ea%b0%9c%ec%9a%94&#34;&gt;개요&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ea%b8%b0%ec%a1%b4-%ed%94%84%eb%a1%9c%ec%84%b8%ec%8a%a4&#34;&gt;기존 프로세스&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ea%b0%9c%ec%84%a0-%ed%94%84%eb%a1%9c%ec%84%b8%ec%8a%a4-continuous-delivery&#34;&gt;개선 프로세스 (Continuous Delivery)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%8f%84%ec%9e%85-%ea%b3%bc%ec%a0%95%ec%97%90%ec%84%9c-%eb%b0%9c%ec%83%9d%ed%95%9c-%eb%ac%b8%ec%a0%9c%eb%93%a4&#34;&gt;도입 과정에서 발생한 문제들&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#active-health-check%ea%b0%80-%ed%95%84%ec%9a%94%ed%95%98%eb%8b%a4&#34;&gt;Active Health Check가 필요하다&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#iptables-%ec%84%9c%eb%b9%84%ec%8a%a4%eb%a5%bc-%eb%8b%a4%ec%8b%9c-%ec%8b%9c%ec%9e%91%ed%95%b4%ec%95%bc-%ed%95%a0-%eb%95%8c&#34;&gt;iptables 서비스를 다시 시작해야 할 때&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#httpd%eb%a5%bc-%eb%8b%a4%ec%8b%9c-%ec%8b%a4%ed%96%89%ed%95%b4%ec%95%bc-%ed%95%a0-%eb%95%8c&#34;&gt;httpd를 다시 실행해야 할 때&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ea%b0%9c%ec%84%a0%ec%9d%98-%ec%97%ac%ec%a7%80%ea%b0%80-%ec%9e%88%eb%8b%a4&#34;&gt;개선의 여지가 있다&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#sessionrepositoryfilter-%ec%97%90%eb%9f%ac-%ed%8e%98%ec%9d%b4%ec%a7%80-%ec%9d%91%eb%8b%b5&#34;&gt;&lt;code&gt;SessionRepositoryFilter&lt;/code&gt; 에러 페이지 응답&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#proxy&#34;&gt;Proxy&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#akamai-%ec%97%90%eb%9f%ac-%ed%8e%98%ec%9d%b4%ec%a7%80-%ec%9d%91%eb%8b%b5&#34;&gt;Akamai 에러 페이지 응답&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#haproxy-%ec%a0%84%ed%99%98&#34;&gt;HAProxy 전환&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%84%a0%ec%96%b8%ed%98%95-%eb%b0%b0%ed%8f%ac-gitops&#34;&gt;선언형 배포 (GitOps?)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%8d%94-%ec%9d%bd%ec%9d%84%ea%b1%b0%eb%a6%ac&#34;&gt;더 읽을거리&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ea%b0%81%ec%a3%bc&#34;&gt;각주&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;개요&#34;&gt;개요&lt;/h1&gt;&#xA;&lt;p&gt;현재 팀에서 빌드-배포 도구로 Bamboo를 사용하고 있다.&#xA;놀랍게도 개발자가 커밋한 소스 코드를 운영 환경에 반영하기까지 14단계의 수동 작업이 필요했다.&#xA;그래서 개발팀 모두가 배포 작업에 많은 부담을 갖고 있었다.&#xA;한번 빌드하고 배포하는데 최소 30분에서 길면 1시간까지 걸리는 이 불필요한 시간을 줄이고 싶었다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>JVM 모니터링</title>
      <link>https://markruler.com/posts/java/jvm-monitoring/</link>
      <pubDate>Mon, 23 May 2022 00:09:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/java/jvm-monitoring/</guid>
      <description>&lt;h1 id=&#34;개요&#34;&gt;개요&lt;/h1&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://markruler.com/posts/java/java-timeout-monitoring/&#34;&gt;모니터링과 타임아웃의 중요성&lt;/a&gt;&#xA;&#xA;은 아무리 강조해도 지나치지 않습니다.&#xA;회사에서 아주 느린 API(약 15초)를 발견했는데 분명 매일 요청이 있는 데도 2년 동안 방치되고 있었습니다.&#xA;이런 API는 사용자가 말해주길 기대하는 것보다 모니터링 도구를 통해 파악하는 것이 좋습니다.&#xA;만약 모니터링 설정을 하지 않았다면 API를 수정할 일이 생긴다거나 에러가 발생하지 않는다면 계속 방치되고 있었을 겁니다.&#xA;심지어 굉장히 간단한 문제여서 파악하고 수정하는 데에 1시간도 걸리지 않았습니다.&#xA;결국 15초 걸리던 API를 100ms까지 줄였죠.&lt;/p&gt;&#xA;&lt;p&gt;이 글에서는 JVM 모니터링을 위한 도구와 방법에 대해 알아보겠습니다.&#xA;가장 먼저 JVM 모니터링을 위한 표준 사양인 JMX부터 알아보겠습니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>모니터링과 타임아웃의 중요성</title>
      <link>https://markruler.com/posts/java/java-timeout-monitoring/</link>
      <pubDate>Wed, 11 May 2022 02:19:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/java/java-timeout-monitoring/</guid>
      <description>&lt;h1 id=&#34;상황&#34;&gt;상황&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;현재팀에서 만들고 있는 애플리케이션은 Spring Framework로 작성하고 있다.&lt;/li&gt;&#xA;&lt;li&gt;계속 특정 애플리케이션과 함께 여러 애플리케이션에서 후속 장애가 발생했다.&lt;/li&gt;&#xA;&lt;li&gt;장애가 발생할 때마다 특정 API의 커넥션이 끊기지 않고 오랜 시간 유지되고 있었다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://markruler.com/images/datadog/transaction-deadlock.png&#34; alt=&#34;transaction-deadlock&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;&lt;code&gt;RedisSystemException&lt;/code&gt;은 해당 서버를 죽이면서 Redis와 커넥션이 끊어졌기 때문에 발생한 예외다.&#xA;만약 서버를 죽이지 않았다면 끝까지 물고 있었을 것이다.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;분석&#34;&gt;분석&lt;/h2&gt;&#xA;&lt;p&gt;시간만 보고도 Timeout이 설정되어 있지 않다는 것을 확인할 수 있다.&#xA;설정하지 않으면 &lt;strong&gt;default 값은 -1&lt;/strong&gt; 로 타임아웃이 발생하지 않는다.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#000;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;display:grid;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0f0&#34;&gt;// org.springframework.transaction.support.AbstractPlatformTransactionManager&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TransactionDefinition.TIMEOUT_DEFAULT = -1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;하지만 트랜잭션이 왜 저렇게 오래 유지되는지 알 수 없었다.&#xA;그래도 서버 장애가 발생하는 이유는 알 수 있었다.&#xA;TImeout이 발생하지 않다보니 해당 트랜잭션들 사이에 데드락(Deadlock)이 발생했고&#xA;하나의 서비스 뿐만 아니라 해당 테이블을 사용하는 모든 서비스에 장애가 발생했다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>깃(Git) CLI 환경에서 소스 코드 관리하기</title>
      <link>https://markruler.com/posts/shell/git-commands/</link>
      <pubDate>Wed, 01 Dec 2021 23:28:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/shell/git-commands/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Git의 모든 기능을 지원하는 것은 CLI 뿐이다.&#xA;GUI 프로그램의 대부분은 Git 기능 중 일부만 구현하기 때문에 비교적 단순하다.&#xA;CLI를 사용할 줄 알면 GUI도 사용할 수 있지만 반대는 성립하지 않는다. -&#xA;&amp;lt;&lt;a href=&#34;https://git-scm.com/book/en/v2?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Pro Git&lt;/a&gt;&#xA;&#xA;&amp;gt; Scott Chacon, Ben Straub&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h1 id=&#34;git-internal&#34;&gt;Git Internal&lt;/h1&gt;&#xA;&lt;h2 id=&#34;차이가-아니라-스냅샷&#34;&gt;차이가 아니라 스냅샷&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2020-12-17-commits-are-snapshots-not-diffs/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Commits are snapshots, not diffs&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;CVS, Subversion, Perforce, Bazaar 등의 시스템은 각 파일의 변화를 시간순으로 관리하면서 파일들의 집합을 관리합니다.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://markruler.com/images/shell/git/storing-data-as-changes.png&#34; alt=&#34;Storing data as changes to a base version of each file&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Go 언어로 컨테이너 이미지 빌드하기</title>
      <link>https://markruler.com/posts/container/building-container-images-in-go/</link>
      <pubDate>Sun, 28 Feb 2021 12:49:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/container/building-container-images-in-go/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Ahmet Alp Balkan의 &lt;a href=&#34;https://ahmet.im/blog/building-container-images-in-go/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Building container images in Go&lt;/a&gt;&#xA;&#xA;를 번역한 글입니다.&lt;/li&gt;&#xA;&lt;li&gt;저자의 허락을 받고 번역했습니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;이 글에서는 도커(Docker)를 사용하지 않고 어떻게 OCI 컨테이너 이미지를 만드는지 설명합니다.&#xA;이를 위해 &lt;a href=&#34;https://github.com/google/go-containerregistry?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;go-containerregistry&lt;/a&gt;&#xA;&#xA; 모듈을 이용해&#xA;프로그래밍해서 레이어 및 이미지 매니페스트를 빌드합니다.&#xA;예를 들어 &lt;a href=&#34;https://hub.docker.com/_/nginx?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;nginx&lt;/a&gt;&#xA;&#xA; 이미지 위에&#xA;정적 웹 사이트 콘텐츠를 추가하여 컨테이너 이미지를 빌드하고&#xA;Go 프로그램을 사용하는 &lt;a href=&#34;https://gcr.io?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;code&gt;gcr.io&lt;/code&gt;&lt;/a&gt;&#xA;&#xA; 같은 레지스트리에 푸시하겠습니다.&lt;/p&gt;&#xA;&lt;p&gt;순서는 다음과 같습니다.&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;도커 허브에서 &lt;code&gt;nginx&lt;/code&gt; 이미지를 가져 옵니다(pull).&lt;/li&gt;&#xA;&lt;li&gt;기존 &lt;code&gt;/usr/share/nginx/html&lt;/code&gt; 디렉터리를 삭제하는 새 레이어를 만듭니다.&lt;/li&gt;&#xA;&lt;li&gt;정적 HTML 콘텐츠과 애셋으로 새 레이어를 만듭니다.&lt;/li&gt;&#xA;&lt;li&gt;이미지와 태그에 새 레이어를 추가합니다.&lt;/li&gt;&#xA;&lt;li&gt;새 이미지를 레지스트리로 푸시합니다.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://gist.github.com/ahmetb/430baa4e8bb0b0f78abb1c34934cd0b6?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;이 gist&lt;/a&gt;&#xA;&#xA;에서&#xA;예제 코드를 찾을 수 있습니다.&#xA;그럼 자세히 살펴보겠습니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>책 &#34;컨테이너 보안&#34;</title>
      <link>https://markruler.com/posts/review/container-security/</link>
      <pubDate>Sun, 21 Feb 2021 11:47:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/review/container-security/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;한빛미디어의 지원을 받아 작성되었습니다.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h1 id=&#34;거두절미&#34;&gt;거두절미&lt;/h1&gt;&#xA;&lt;p&gt;컨테이너에 관심 있으신 분이라면 필수 소장 도서입니다.&#xA;저도 컨테이너, 쿠버네티스, 도커, 클라우드 관련 도서를 많이 읽어봤지만&#xA;컨테이너를 이렇게 간명하고 깊게 다루는 책은 없었습니다.&#xA;컨테이너 &amp;lsquo;보안&amp;rsquo;을 설명하기 위해 컨테이너가 어떻게 동작하는지&#xA;설명하는 데에 책의 대부분을 차지합니다.&#xA;다만 200 페이지에 많은 내용을 압축한 만큼 도해는 많지 않습니다.&lt;/p&gt;&#xA;&lt;p&gt;먼저 저자의 &lt;a href=&#34;https://www.katacoda.com/lizrice/courses/containers-and-go?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;katacoda(An Introduction to Containers for Go programmers)&lt;/a&gt;&#xA;&#xA;로&#xA;실습해보시거나 &lt;a href=&#34;https://youtu.be/HPuvDm8IC-4?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;발표(What is a container, really? Let&amp;rsquo;s write one in Go from scratch)&lt;/a&gt;&#xA;&#xA;를 보시길 추천드립니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>컨테이너 톺아보기</title>
      <link>https://markruler.com/posts/container/container-study-guide/</link>
      <pubDate>Wed, 17 Feb 2021 23:47:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/container/container-study-guide/</guid>
      <description>&lt;h1 id=&#34;거두절미&#34;&gt;거두절미&lt;/h1&gt;&#xA;&lt;p&gt;생각보다 컨테이너는 간단한 게 아닙니다.&#xA;컨테이너를 쉽게 생성하고 삭제할 수 있었던 이유는&#xA;도커와 같은 컨테이너 관리 도구가 복잡한 것들을 꽁꽁 감췄기 때문입니다.&#xA;컨테이너를 공부하면 할수록 알아야 할 게 더 늘어나고 있지만&#xA;이쯤에서 유익했던 자료들을 모아 보려 합니다.&lt;/p&gt;&#xA;&lt;h1 id=&#34;참고-자료&#34;&gt;참고 자료&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;👍 필수&#xA;&lt;ul&gt;&#xA;&lt;li&gt;책 - &lt;a href=&#34;https://www.hanbit.co.kr/store/books/look.php?p_code=B8383749156&amp;amp;utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;컨테이너 보안&lt;/a&gt;&#xA;&#xA;, Liz Rice&lt;/li&gt;&#xA;&lt;li&gt;katacoda - &lt;a href=&#34;https://www.katacoda.com/lizrice/courses/containers-and-go?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;An Introduction to Containers for Go programmers&lt;/a&gt;&#xA;&#xA;, Liz Rice&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;컨테이너&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developers.redhat.com/blog/2018/02/22/container-terminology-practical-introduction/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;A Practical Introduction to Container Terminology&lt;/a&gt;&#xA;&#xA;, Scott McCarty&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.infoq.com/articles/build-a-container-golang/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Build Your Own Container Using Less than 100 Lines of Go&lt;/a&gt;&#xA;&#xA;, Julian Friedman&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://iximiuz.com/en/posts/implementing-container-runtime-shim/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Implementing Container Runtime Shim: runc&lt;/a&gt;&#xA;&#xA;, Ivan Velichko&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;컨테이너 런타임&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.44bits.io/ko/keyword/linux-container?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;리눅스 컨테이너란?&lt;/a&gt;&#xA;&#xA;, Daegwon Nacyot Kim&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.samsungsds.com/kr/insights/docker.html?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;흔들리는 도커(Docker)의 위상: OCI와 CRI 중심으로 재편되는 컨테이너 생태계&lt;/a&gt;&#xA;&#xA;, 김준석&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developers.redhat.com/blog/2019/02/21/podman-and-buildah-for-docker-users/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Podman and Buildah for Docker users&lt;/a&gt;&#xA;&#xA;, Red Hat&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://joejulian.name/post/kubernetes-container-engine-comparison/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Selecting a container runtime for use with Kubernetes&lt;/a&gt;&#xA;&#xA;, Joe Julian&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;컨테이너 오케스트레이션&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.redhat.com/ko/topics/containers/what-is-container-orchestration?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;컨테이너 오케스트레이션이란?&lt;/a&gt;&#xA;&#xA;, Red Hat&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;네임스페이스&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.44bits.io/ko/keyword/linux-namespace?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;리눅스 네임스페이스란?&lt;/a&gt;&#xA;&#xA;, Daegwon Nacyot Kim&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://jake.dothome.co.kr/namespace/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;네임스페이스&lt;/a&gt;&#xA;&#xA;, 문영일&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://windsock.io/using-linux-namespaces-to-isolate-processes/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Using Linux Namespaces to Isolate Processes&lt;/a&gt;&#xA;&#xA;, Scott McCarty&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.redhat.com/en/blog/whats-next-containers-user-namespaces?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;What’s Next for Containers? User Namespaces&lt;/a&gt;&#xA;&#xA;, Scott McCarty&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/evolving-container-security-with-linux-user-namespaces-afbe3308c082?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Evolving Container Security With Linux User Namespaces&lt;/a&gt;&#xA;&#xA;, Netflix&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://kinvolk.io/blog/2020/12/improving-kubernetes-and-container-security-with-user-namespaces/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Improving Kubernetes and container security with user namespaces&lt;/a&gt;&#xA;&#xA;, Alban Crequy&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;컨트롤 그룹&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/torvalds/linux/blob/v5.10/Documentation/admin-guide/cgroup-v1/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Cgroup Documentation&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/resource_management_guide/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Red Hat Resource Management Guide&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tech.kakao.com/2020/06/29/cgroup-driver/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Cgroup Driver 선택하기&lt;/a&gt;&#xA;&#xA;, ssup&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://b.luavis.kr/server/missing-800mb?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;사라진 800MB를 찾아서&lt;/a&gt;&#xA;&#xA;, Luavis&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;루트 파일세스템&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Linux Kernel Documentation - ramfs, rootfs and initramfs&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.44bits.io/ko/post/change-root-directory-by-using-chroot?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;chroot를 사용한 프로세스의 루트 디렉터리 격리&lt;/a&gt;&#xA;&#xA;, Daegwon Nacyot Kim&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;유니온 마운트&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://ahmet.im/blog/building-container-images-in-go/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Building container images in Go&lt;/a&gt;&#xA;&#xA;, Ahmet Alp Balkan (번역중)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.44bits.io/ko/post/how-docker-image-work?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;도커 이미지 빌드 원리와 OverlayFS&lt;/a&gt;&#xA;&#xA;, Daegwon Nacyot Kim&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developers.redhat.com/blog/2016/01/13/a-practical-introduction-to-docker-container-terminology/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;A Practical Introduction to Docker Container Terminology&lt;/a&gt;&#xA;&#xA;, Scott McCarty / Joe Brockmeier&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.naver.com/alice_k106/221530340759?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;투명 셀로판지 이론을 통한 Overlay FS 사용 방법과 유니온 마운트 이해하기&lt;/a&gt;&#xA;&#xA;, 최용호&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://ssup2.github.io/theory_analysis/Union_Mount_AUFS_Docker_Image_Layer/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Union Mount, AUFS, Docker Image Layer&lt;/a&gt;&#xA;&#xA;, ssup2&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.docker.com/storage/storagedriver/aufs-driver?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Use the AUFS storage driver&lt;/a&gt;&#xA;&#xA;, Docker&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lwn.net/Articles/312641/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Unifying filesystems with union mounts&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;캐퍼빌리티&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://man7.org/linux/man-pages/man7/capabilities.7.html?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;capabilities(7)&lt;/a&gt;&#xA;&#xA;, Linux manual page&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://archive.is/20130112225523/http://www.eros-os.org/essays/capintro.html?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;What is a Capability, Anyway?&lt;/a&gt;&#xA;&#xA;, Jonathan Shapiro&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.epnc.co.kr/news/articleView.html?idxno=43405&amp;amp;utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;권한을 최소화시키는 리눅스 커널 자격&lt;/a&gt;&#xA;&#xA;, 이혜원&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.container-solutions.com/linux-capabilities-why-they-exist-and-how-they-work?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Linux Capabilities: Why They Exist and How They Work&lt;/a&gt;&#xA;&#xA;, Adrian Mouat&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.container-solutions.com/linux-capabilities-in-practice?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Linux Capabilities In Practice&lt;/a&gt;&#xA;&#xA;, Adrian Mouat&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;컨테이너 네트워크&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.44bits.io/ko/post/container-network-1-uts-namespace?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;UTS 네임스페이스를 사용한 호스트네임 격리 - 컨테이너 네트워크 기초 1편&lt;/a&gt;&#xA;&#xA;, Daegwon Nacyot Kim&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.44bits.io/ko/post/container-network-2-ip-command-and-network-namespace?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;ip로 직접 만들어보는 네트워크 네임스페이스와 브리지 네트워크 - 컨테이너 네트워크 기초 2편&lt;/a&gt;&#xA;&#xA;, Daegwon Nacyot Kim&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;리눅스-컨테이너&#34;&gt;리눅스 컨테이너&lt;/h1&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&amp;ldquo;A Linux container is a set of 1 or more processes that are isolated from the rest of the system.&amp;rdquo;&#xA;&lt;a href=&#34;https://www.redhat.com/en/topics/containers/whats-a-linux-container?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Red Hat&lt;/a&gt;&#xA;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>최소한의 안전한 Bash 스크립트 템플릿</title>
      <link>https://markruler.com/posts/shell/minimal-safe-bash-script-template/</link>
      <pubDate>Sun, 14 Feb 2021 15:22:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/shell/minimal-safe-bash-script-template/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://twitter.com/radzikowski_m?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Maciej Radzikowski&lt;/a&gt;&#xA;&#xA;가 작성한 &lt;a href=&#34;https://betterdev.blog/minimal-safe-bash-script-template/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Minimal safe Bash script template (2020-12-14)&lt;/a&gt;&#xA;&#xA;를 번역한 글입니다.&lt;/li&gt;&#xA;&lt;li&gt;저자의 허락을 받고 번역했습니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Bash 스크립트.&#xA;거의 모든 사람들이 언젠가 작성해야 하는 것입니다.&#xA;하지만 그 중 누구도 &amp;ldquo;맞아요, 저는 Bash 스크립트 작성하는 것을 사랑합니다&amp;quot;라고 말하지 않습니다.&#xA;거의 모든 사람들이 Bash 스크립트를 작성할 때 주의를 기울이지 않는 이유죠.&lt;/p&gt;&#xA;&lt;p&gt;저는 여러분을 Bash 전문가로 만들려는 것이 아닙니다 (저도 전문가는 아닙니다).&#xA;다만 스크립트를 더 안전하게 만들어 줄 최소한의 템플릿을 보여 드리겠습니다.&#xA;저에게 감사해하실 필요는 없어요. 여러분의 미래가 여러분에게 감사해할 것입니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>쿠버네티스 레벨 트리거링 및 조정</title>
      <link>https://markruler.com/posts/kubernetes/level-triggering-and-reconciliation/</link>
      <pubDate>Wed, 13 Jan 2021 23:05:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/kubernetes/level-triggering-and-reconciliation/</guid>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;James Bowes(&lt;a href=&#34;https://twitter.com/jrbowes?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;@jrbowes&lt;/a&gt;&#xA;&#xA;)의&#xA;&lt;a href=&#34;https://hackernoon.com/level-triggering-and-reconciliation-in-kubernetes-1f17fe30333d?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Level Triggering and Reconciliation in Kubernetes&lt;/a&gt;&#xA;&#xA;를&#xA;번역한 글입니다.&lt;/li&gt;&#xA;&lt;li&gt;저자의 허락을 받고 번역했습니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;&#xA;      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/tCht7FvIDdY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;&#xA;    &lt;/div&gt;&#xA;&#xA;&lt;h1 id=&#34;시스템-프로그래밍-개념으로-보는-쿠버네티스가-클러스터를-관리하는-방법&#34;&gt;시스템 프로그래밍 개념으로 보는 쿠버네티스가 클러스터를 관리하는 방법&lt;/h1&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://kubernetes.io/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;쿠버네티스&lt;/a&gt;&#xA;&#xA;는 현재&#xA;&lt;a href=&#34;https://techcrunch.com/2017/12/18/as-kubernetes-surged-in-popularity-in-2017-it-created-a-vibrant-ecosystem/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;가장 있기 있는&lt;/a&gt;&#xA;&#xA;&#xA;컨테이너 오케스트레이터입니다.&#xA;이런 성공의 밑받침은 신뢰성입니다.&#xA;모든 소프트웨어에는 버그가 있죠.&#xA;그러나 컨테이너를 실행하는 데 있어서 쿠버네티스는 다른 소프트웨어보다 버그가 적습니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>CS Visualized: 유용한 깃(Git) 명령어</title>
      <link>https://markruler.com/posts/shell/cs-visualized-useful-git-commands/</link>
      <pubDate>Sat, 09 Jan 2021 08:35:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/shell/cs-visualized-useful-git-commands/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;리디아 할리(Lydia Hallie, &lt;a href=&#34;https://twitter.com/lydiahallie?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;@lydiahallie&lt;/a&gt;&#xA;&#xA;)가 쓴 &lt;a href=&#34;https://dev.to/lydiahallie/cs-visualized-useful-git-commands-37p1?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CS Visualized: Useful Git Commands&lt;/a&gt;&#xA;&#xA;를 번역한 글입니다.&lt;/li&gt;&#xA;&lt;li&gt;저자의 허락을 받고 번역했습니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Git이 정말 강력한 도구이긴 하지만, 대다수의 사람들은 끔찍한 악몽 😐&#xA;같다는 말도 공감할 거에요. 저는 항상 Git으로 작업할 때 어떤 일이 일어날지&#xA;머릿속으로 그려보는 것이 꽤 유용하다는 것을 알았습니다. 특정 명령을 실행할&#xA;때 브랜치는 어떻게 상호작용하고, 그것이 히스토리에 어떤 영향을 미칠까요?&#xA;&lt;code&gt;master&lt;/code&gt;에서 &lt;code&gt;reset --hard&lt;/code&gt; 하고 &lt;code&gt;origin&lt;/code&gt; 리포지터리로 &lt;code&gt;force push&lt;/code&gt;한 후,&#xA;&lt;code&gt;.git&lt;/code&gt; 폴더를 &lt;code&gt;rimraf&lt;/code&gt;하면 왜 저의 팀원은 소리를 지를까요?&lt;/p&gt;</description>
    </item>
    <item>
      <title>CS Visualized: CORS</title>
      <link>https://markruler.com/posts/web/cs-visualized-cors/</link>
      <pubDate>Sat, 02 Jan 2021 08:50:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/web/cs-visualized-cors/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;리디아 할리(Lydia Hallie, &lt;a href=&#34;https://twitter.com/lydiahallie?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;@lydiahallie&lt;/a&gt;&#xA;&#xA;)가 쓴 &lt;a href=&#34;https://dev.to/lydiahallie/cs-visualized-cors-5b8h?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CS Visualized: CORS&lt;/a&gt;&#xA;&#xA;를 번역한 글입니다.&lt;/li&gt;&#xA;&lt;li&gt;저자의 허락을 받고 번역했습니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;어쩌다 콘솔에서 &amp;ldquo;fetch 접근이 CORS 정책에 의해 차단되었습니다&amp;quot;라는&#xA;커다란 빨간색 오류를 보면 모든 개발자가 짜증을 느낍니다! 😬&#xA;임시방편이 몇 가지 있긴 하지만 오늘은 그 어떤 것도 사용하지 않겠습니다!&#xA;대신 CORS가 실제로 무엇을 하고 있는지 왜 우리에게 도움이 되는지&#xA;알아보도록 하겠습니다. 👏🏼&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;❗️ 이 글에서는 HTTP 기본에 대해 설명하지 않겠습니다.&#xA;HTTP 요청과 응답에 대해 더 자세히 알고 싶으시다면 제가 얼마 전에&#xA;작성한 &lt;a href=&#34;https://www.lydiahallie.dev/blog/http11?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;짧은 글&lt;/a&gt;&#xA;&#xA;이&#xA;있습니다. 🙂 제가 사용한 예시에서 HTTP/2 대신 HTTP/1.1을&#xA;사용하지만 CORS에 영향을 미치지는 않습니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Go로 밑바닥부터 만드는 BitTorrent 클라이언트</title>
      <link>https://markruler.com/posts/go/building-bittorrent-client/</link>
      <pubDate>Mon, 28 Dec 2020 14:46:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/go/building-bittorrent-client/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.jse.li/posts/torrent/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Jesse Li의 Building a BitTorrent client from the ground up in Go (2020-01-04)&lt;/a&gt;&#xA;&#xA;를 번역한 글입니다.&lt;/li&gt;&#xA;&lt;li&gt;저자의 허락을 받고 번역했습니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;거두절미(tl;dr):&lt;/strong&gt; The Pirate Bay를 방문하고 mp3 파일이 나타나기까지 무슨 일이 일어나는 것일까요?&#xA;이 글에서는 데비안(Debian)을 다운로드할 수 있을 정도의 비트토렌트 프로토콜을 구현할 것입니다.&#xA;바로 &lt;a href=&#34;https://github.com/veggiedefender/torrent-client/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;소스 코드&lt;/a&gt;&#xA;&#xA;를 보거나 &lt;a href=&#34;#%eb%aa%a8%eb%91%90-%ed%95%a9%ec%b9%98%ea%b8%b0&#34;&gt;마지막 부분&lt;/a&gt;&#xA;&#xA;으로 넘어갈 수 있습니다.&lt;/p&gt;&#xA;&lt;p&gt;비트토렌트(BitTorrent)는 인터넷을 통해 파일을 다운로드하고 배포하기 위한 프로토콜입니다.&#xA;다운로더가 중앙 서버와 연결하는 기존의 클라이언트/서버 관계 (예: 넷플릭스에서&#xA;영화를 보거나 지금 읽고 있는 웹 페이지를 불러 오는 것)와 달리,&#xA;&lt;strong&gt;피어(peer)&lt;/strong&gt; 라고 불리는 비트토렌트 네트워크 참여자들은 &lt;em&gt;서로에게서&lt;/em&gt; 파일 조각을 다운로드합니다.&#xA;이것이 &lt;strong&gt;P2P(peer-to-peer)&lt;/strong&gt; 프로토콜입니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Vim 에디터 명령어 정리</title>
      <link>https://markruler.com/posts/shell/vim-editor-shortcuts/</link>
      <pubDate>Mon, 07 Dec 2020 00:44:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/shell/vim-editor-shortcuts/</guid>
      <description>&lt;p&gt;서버에서 파일을 편집하기 위해 Vim 에디터를 사용할 일이 많은데,&#xA;제가 사용하는 설정과 자주 쓰는 명령어를 정리합니다.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%9e%85%eb%a0%a5-%eb%aa%a8%eb%93%9c-insert-mode&#34;&gt;입력 모드 (Insert Mode)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%a7%88%ec%a7%80%eb%a7%89-%ed%96%89-%eb%aa%a8%eb%93%9c-last-line-mode&#34;&gt;마지막 행 모드 (Last Line Mode)&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#last-line-command-&#34;&gt;Last Line Command (:)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#search-mode--&#34;&gt;Search mode (/, ?)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%aa%85%eb%a0%b9-%eb%aa%a8%eb%93%9c-command-mode&#34;&gt;명령 모드 (Command Mode)&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%9d%b4%eb%8f%99&#34;&gt;이동&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ea%b0%84%eb%8b%a8%ed%95%9c-%ed%8e%b8%ec%a7%91&#34;&gt;간단한 편집&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%82%ad%ec%a0%9c&#34;&gt;삭제&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%b9%84%ec%a3%bc%ec%96%bc-%eb%aa%a8%eb%93%9cvisual-mode&#34;&gt;비주얼 모드(visual mode)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ed%99%94%eb%a9%b4-%eb%b6%84%ed%95%a0&#34;&gt;화면 분할&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ec%84%a4%ec%a0%95-vimrc&#34;&gt;설정 (.vimrc)&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ed%94%8c%eb%9f%ac%ea%b7%b8%ec%9d%b8&#34;&gt;플러그인&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%8d%94-%ec%9d%bd%ec%9d%84%ea%b1%b0%eb%a6%ac&#34;&gt;더 읽을거리&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;입력-모드-insert-mode&#34;&gt;입력 모드 (Insert Mode)&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;i&lt;/code&gt; 현재 커서에서 편집&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;Shift + i&lt;/code&gt; 현재 줄의 처음으로 커서를 옮긴 후 편집&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;s&lt;/code&gt; 현재 커서 한 글자 삭제 후 바로 입력 모드&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;Shift + s&lt;/code&gt; 현재 줄 삭제 후 바로 입력 모드&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;a&lt;/code&gt; 다음 칸으로 커서를 옮긴 후 편집&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;Shift + a&lt;/code&gt; 현재 줄의 끝으로 커서를 옮긴 후 편집&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;o&lt;/code&gt; 다음 줄로 커서를 옮긴 후 편집&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;Shift + o&lt;/code&gt; 이전 줄로 커서를 옮긴 후 편집&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;마지막-행-모드-last-line-mode&#34;&gt;마지막 행 모드 (Last Line Mode)&lt;/h1&gt;&#xA;&lt;h2 id=&#34;last-line-command-&#34;&gt;Last Line Command (:)&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;:q&lt;/code&gt; 종료&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;:q!&lt;/code&gt; 강제 종료&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;:w&lt;/code&gt; 저장&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;:%s/old/new/gi&lt;/code&gt; 문자열 교체 (old -&amp;gt; new)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;g&lt;/code&gt; 옵션을 빼면 해당 줄의 첫 번째 문자열만 교체&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;:!&lt;/code&gt; 명령어 실행&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;:!ls&lt;/code&gt; 현재 디렉토리 파일 목록 출력&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;:!pwd&lt;/code&gt; 현재 디렉토리 경로 출력&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;:!date&lt;/code&gt; 현재 시간 출력&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;:tabnew [file]&lt;/code&gt; 새로운 탭 열기 (file이 없으면 빈 탭)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;실제로는 에디터 밖에서도 사용할 수 있는 tmux나 terminal 자체 기능을 활용하는 편입니다.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;gt&lt;/code&gt; 다음 탭으로 이동하기&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;gT&lt;/code&gt; 이전 탭으로 이동하기&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;search-mode--&#34;&gt;Search mode (/, ?)&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;/regex-pattern&lt;/code&gt; (&lt;code&gt;?regex-pattern&lt;/code&gt;) 검색&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;n&lt;/code&gt; 다음 단어 (?는 반대)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;N&lt;/code&gt; 이전 단어 (?는 반대)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;명령-모드-command-mode&#34;&gt;명령 모드 (Command Mode)&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;u&lt;/code&gt; - undo&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;control + r&lt;/code&gt; - redo&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;.&lt;/code&gt; - 이전 명령 다시 실행&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;이동&#34;&gt;이동&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;hjkl&lt;/code&gt; 좌하상우 이동&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Control + b&lt;/code&gt; 이전 페이지로 이동&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Control + f&lt;/code&gt; 다음 페이지로 이동&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Control + u&lt;/code&gt; 이전 half page로 이동&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Control + d&lt;/code&gt; 다음 half page로 이동&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;gg&lt;/code&gt; 문서 맨 앞으로 이동&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;G&lt;/code&gt; 문서 맨 뒤로 이동&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;^&lt;/code&gt; 현재 줄 앞으로 이동&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;$&lt;/code&gt; 현재 줄 끝으로 이동&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;간단한-편집&#34;&gt;간단한 편집&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;y&lt;/code&gt; 복사 (yank)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;p&lt;/code&gt; 붙여넣기&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;&amp;gt;&lt;/code&gt; 들여쓰기&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;&amp;lt;&lt;/code&gt; 내어쓰기&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Shift + j&lt;/code&gt; 현재 줄의 끝과 다음 줄의 앞부분을 합칩니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;삭제&#34;&gt;삭제&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;r&lt;/code&gt; 현재 커서 한 글자 교체(replace)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;x&lt;/code&gt; 현재 커서 한 글자 삭제 (delete)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Shift + x&lt;/code&gt; 현재 커서 앞에 한 글자 삭제 (backspace)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;:1,.d&lt;/code&gt; 첫 번째 줄부터 현재 커서까지 삭제 (LLM)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;:5,10d&lt;/code&gt; 5번 줄부터 10번 줄까지 삭제 (LLM)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;dd&lt;/code&gt; 현재 줄 삭제 (이후 p를 통해 삭제한 줄을 붙여넣을 수 있습니다)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;이동키와 조합해 삭제할 수도 있다.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;5dd&lt;/code&gt; 현재 줄 포함 아래로 5줄 삭제&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;dgg&lt;/code&gt; 현재 커서에서 첫 줄까지 삭제&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;dG&lt;/code&gt; 현재 커서에서 마지막 줄까지 삭제&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;d$&lt;/code&gt; 현재 커서에서 현재 줄 마지막 단어까지 삭제&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;d^&lt;/code&gt; 현재 커서에서 현재 줄 첫 단어까지 삭제&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;dw&lt;/code&gt; 현재 커서에서 현재 단어까지 삭제&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;비주얼-모드visual-mode&#34;&gt;비주얼 모드(visual mode)&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;v&lt;/code&gt; 비주얼 모드&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;shift + v&lt;/code&gt; 비주얼 라인&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Ctrl + v&lt;/code&gt; 비주얼 블록&#xA;&lt;ul&gt;&#xA;&lt;li&gt;비주얼 블록 모드에서 &lt;code&gt;Shift + i&lt;/code&gt;를 누르면 블록의 첫 줄에 커서가 위치하고, 입력 모드로 전환됩니다.&lt;/li&gt;&#xA;&lt;li&gt;입력을 마치고 &lt;code&gt;ESC&lt;/code&gt;를 누르면 블록의 모든 줄에 입력한 내용이 삽입됩니다. (여러 줄을 주석 처리할 때 유용)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;화면-분할&#34;&gt;화면 분할&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;탭 기능과 동일하게 터미널 자체 기능을 선호하는 편입니다.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Control + w&lt;/code&gt; + &lt;code&gt;s&lt;/code&gt; horizontal split&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;new&lt;/code&gt; horizontal split한 후 새로운 창 생성&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Control + w&lt;/code&gt; + &lt;code&gt;v&lt;/code&gt; vertical split&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;vs&lt;/code&gt; vertical split한 후 현재 창 복제&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Control + w&lt;/code&gt; + &lt;code&gt;방향키&lt;/code&gt; 분할된 창 간 이동&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Control + w&lt;/code&gt; + &lt;code&gt;&amp;gt;&lt;/code&gt; 창 폭 늘리기&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Control + w&lt;/code&gt; + &lt;code&gt;&amp;lt;&lt;/code&gt; 창 폭 줄이기&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Control + w&lt;/code&gt; + &lt;code&gt;+&lt;/code&gt; 창 높이 늘리기&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Control + w&lt;/code&gt; + &lt;code&gt;-&lt;/code&gt; 창 높이 줄이기&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Control + w&lt;/code&gt; + &lt;code&gt;=&lt;/code&gt; 창 폭, 높이 원래 상태로&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Control + w&lt;/code&gt; + &lt;code&gt;o&lt;/code&gt; only one window&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;설정-vimrc&#34;&gt;설정 (.vimrc)&lt;/h1&gt;&#xA;&lt;p&gt;제가 사용하는 설정 파일(&lt;code&gt;~/.vimrc&lt;/code&gt;)입니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>NFV 도커 컨테이너 초심자 가이드</title>
      <link>https://markruler.com/posts/nfv/beginners-guide-docker-container-nfv/</link>
      <pubDate>Mon, 16 Nov 2020 22:40:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/nfv/beginners-guide-docker-container-nfv/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://telcocloudbridge.com/blog/beginners-guide-docker-container-nfv/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Faisal Khan의 A Beginner&amp;rsquo;s Guide to Docker Container in NFV&lt;/a&gt;&#xA;&#xA;를 번역한 글입니다.&lt;/li&gt;&#xA;&lt;li&gt;저자의 허락을 받고 번역했습니다.&lt;/li&gt;&#xA;&lt;li&gt;2016년 3월 3일에 쓰여진 글입니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;떠오르는 도커(Docker) 컨테이너는 NFV를 혁신할 잠재력을 가지고 있습니다.&#xA;무엇보다 도커 컨테이너는 가상 머신에 비해 가볍고, 적은 오버헤드와 리소스만을 요구하며, 동일한 운영체제에서 실행되는 애플리케이션을 격리시킬 수 있습니다.&#xA;즉, NFV에서 VNF(가상 네트워크 기능)이 도커 컨테이너에서 완전히 격리된 상태로 실행될 수 있다면, 가상 머신이 필요 없을 지도 모릅니다.&#xA;하지만 그게 그렇게 쉬울까요?&lt;/p&gt;</description>
    </item>
    <item>
      <title>쿠버네티스 컴포넌트를 로컬에서 직접 빌드 및 디버깅하기</title>
      <link>https://markruler.com/posts/kubernetes/local-build-kube/</link>
      <pubDate>Sun, 11 Oct 2020 14:48:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/kubernetes/local-build-kube/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;직접 빌드해서 사용한다면 쿠버네티스 기능을 확장해서 사용할 수 있다.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;reference&#34;&gt;Reference&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/kubernetes/blob/release-1.19/build/README.md?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;kubernetes/build/README.md&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;사용할-명령어&#34;&gt;사용할 명령어&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#000;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;display:grid;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0f0&#34;&gt;# master 브랜치&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone --depth &lt;span style=&#34;color:#f60&#34;&gt;1&lt;/span&gt; https://github.com/kubernetes/kubernetes.git&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0f0&#34;&gt;# 특정 브랜치&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone --depth &lt;span style=&#34;color:#f60&#34;&gt;1&lt;/span&gt; --single-branch --branch release-1.19 https://github.com/kubernetes/kubernetes.git&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0f0&#34;&gt;# cmd 디렉터리에 있는 다른 컴포넌트도 같은 방식으로 빌드할 수 있다.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0f0&#34;&gt;# cmd/kubeadm, kubectl, kubelet, kube-apiserver, kube-proxy, kube-controller-manager, kube-scheduler, ...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make all &lt;span style=&#34;color:#eedd82&#34;&gt;WHAT&lt;/span&gt;=cmd/kubectl &lt;span style=&#34;color:#eedd82&#34;&gt;GOFLAGS&lt;/span&gt;=-v&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0f0&#34;&gt;# 그냥 간단히 go build 명령도 가능하다.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;go build -o k cmd/kubectl&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;빌드-실행-따라가기&#34;&gt;빌드 실행 따라가기&lt;/h2&gt;&#xA;&lt;h3 id=&#34;makefile&#34;&gt;Makefile&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;make 명령을 내릴 루트 디렉터리 Makefile을 보면 아래와 같이 다른 Makefile을 가리킨다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#000;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;display:grid;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;build/root/Makefile&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;실제로-빌드되는-makefile&#34;&gt;실제로 빌드되는 Makefile&lt;/h3&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/kubernetes/kubernetes/blob/release-1.19/build/root/Makefile?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;build/root/Makefile&lt;/a&gt;&#xA;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>관측 가능성(Observability)</title>
      <link>https://markruler.com/posts/cloud/monitor-trace-log-metric/</link>
      <pubDate>Fri, 02 Oct 2020 16:24:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/cloud/monitor-trace-log-metric/</guid>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ea%b4%80%ec%b8%a1-%ea%b0%80%eb%8a%a5%ec%84%b1-observability&#34;&gt;관측 가능성 (Observability)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%a9%94%ed%8a%b8%eb%a6%admetric-%ec%8b%9c%ec%8a%a4%ed%85%9c-%ec%83%81%ed%83%9c%eb%82%98-%ec%84%b1%eb%8a%a5%ec%9d%b4-%ec%96%b4%eb%96%a4%ec%a7%80&#34;&gt;메트릭(Metric): 시스템 상태나 성능이 어떤지&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%a1%9c%ea%b7%b8event-logging-%eb%ac%b4%ec%8a%a8-%ec%9d%bc%ec%9d%b4-%ec%9e%88%ec%97%88%eb%8a%94%ec%a7%80&#34;&gt;로그(Event Logging): 무슨 일이 있었는지&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ed%8a%b8%eb%a0%88%ec%9d%b4%ec%8a%a4tracing-%ec%9a%94%ec%b2%ad%ec%9d%b4-%ec%96%b4%eb%94%94%ec%84%9c-%ec%a7%80%ec%97%b0%eb%90%98%ea%b1%b0%eb%82%98-%eb%ac%b8%ec%a0%9c%ea%b0%80-%eb%b0%9c%ec%83%9d%ed%96%88%eb%8a%94%ec%a7%80&#34;&gt;트레이스(Tracing): 요청이 어디서 지연되거나 문제가 발생했는지&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%b6%84%ec%82%b0-%ed%8a%b8%eb%a0%88%ec%9d%b4%ec%8b%b1-distributed-tracing&#34;&gt;분산 트레이싱 (Distributed tracing)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%aa%a8%eb%8b%88%ed%84%b0%eb%a7%81-monitoring&#34;&gt;모니터링 (Monitoring)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%ed%94%84%eb%a1%9c%ed%8c%8c%ec%9d%bc%eb%a7%81-profiling&#34;&gt;프로파일링 (Profiling)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%eb%8d%94-%ec%9d%bd%ec%9d%84%ea%b1%b0%eb%a6%ac&#34;&gt;더 읽을거리&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;관측-가능성-observability&#34;&gt;관측 가능성 (Observability)&lt;/h1&gt;&#xA;&lt;p&gt;&lt;strong&gt;제어 이론에서&lt;/strong&gt;&#xA;시스템의 내부 상태 변수와 그에 따른 행동을&#xA;시스템에 대한 입력과 출력만 보고 결정할 수 있다면&#xA;그 시스템이 &lt;strong&gt;관측 가능하다는 것&lt;/strong&gt;을 나타냅니다.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;그렇다면 &lt;strong&gt;관측 가능성&lt;/strong&gt;&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;이란&#xA;시스템의 내부 상태를 외부에서 수집 가능한 데이터(메트릭, 로그, 트레이스 등)를 통해&#xA;얼마나 잘 추론하고 이해할 수 있는지를 나타내는 시스템의 속성입니다.&#xA;즉, 시스템이 자신의 상태를 얼마나 잘 &amp;ldquo;드러내는가&amp;quot;를 의미합니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>NFV의 컴퓨팅 도메인에 대한 오해!</title>
      <link>https://markruler.com/posts/nfv/the-misunderstood-facts-about-compute-domain-in-nfv/</link>
      <pubDate>Thu, 01 Oct 2020 22:23:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/nfv/the-misunderstood-facts-about-compute-domain-in-nfv/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://telcocloudbridge.com/blog/the-misunderstood-facts-about-compute-domain-in-nfv/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Faisal Khan의 The Misunderstood Facts about Compute Domain in NFV!&lt;/a&gt;&#xA;&#xA;를 번역한 글입니다.&lt;/li&gt;&#xA;&lt;li&gt;저자의 허락을 받고 번역했습니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;NFV에 대해 생각해 보세요! 그리고 x86 프로세서를 생각해 보세요&amp;hellip; 둘은 뗄 수 없는 사이입니다. 그렇죠?&lt;/p&gt;&#xA;&lt;p&gt;프로세서(컴퓨팅 파트)가 아무리 단순하게 들리더라도 NFV의 컴퓨팅 도메인(compute domain)이 노드의 컴퓨팅 프로세서(compute processor)가 같지 않다는 사실을 모르는 사람이 많을 것입니다. 사실&amp;hellip; 훨씬 더 많습니다.&lt;/p&gt;&#xA;&lt;p&gt;NFV의 &amp;ldquo;Compute Domain&amp;quot;과 &amp;ldquo;Compute Node&amp;quot;는 ETSI 정의에 따르면 동일한 것을 의미하지 않습니다. 이를 잘 알고 있으면 NFV 기본 아키텍처를 이해하는 데 많은 혼란을 피할 수 있으며, 벤더 및 고객과 이 주제에 대해 소통하는 과정에서 오해를 피할 수 있습니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>NFV MANO 초심자 가이드</title>
      <link>https://markruler.com/posts/nfv/beginners-guide-to-nfv-mano/</link>
      <pubDate>Wed, 23 Sep 2020 00:58:08 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/nfv/beginners-guide-to-nfv-mano/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.telcocloudbridge.com/blog/a-beginners-guide-to-nfv-management-orchestration-mano/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Faisal Khan의 A Beginner&amp;rsquo;s Guide to NFV Management &amp;amp; Orchestration (MANO)&lt;/a&gt;&#xA;&#xA;을 번역한 글입니다.&lt;/li&gt;&#xA;&lt;li&gt;저자의 허락을 받고 번역했습니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#nfv%ec%97%90%ec%84%9c-mano%eb%9e%80&#34;&gt;NFV에서 MANO란?&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#1-virtualized-infrastructure-manager-vim&#34;&gt;1. Virtualized Infrastructure Manager (VIM)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#2-virtual-network-function-manager-vnfm&#34;&gt;2. Virtual Network Function Manager (VNFM)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#3-nfv-orchestrator-nfvo&#34;&gt;3. NFV Orchestrator (NFVO)&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#resource-orchestration&#34;&gt;Resource Orchestration&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#service-orchestration&#34;&gt;Service Orchestration&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#4-repositories&#34;&gt;4. Repositories&lt;/a&gt;&#xA;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#vnf-catalog&#34;&gt;VNF Catalog&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#network-services-ns-catalog&#34;&gt;Network Services (NS) Catalog&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#nfv-instances&#34;&gt;NFV Instances&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#nfvi-resources&#34;&gt;NFVI Resources&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#5-element-management-em&#34;&gt;5. Element Management (EM)&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#6-ossbss&#34;&gt;6. OSS/BSS&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#7-reference-points&#34;&gt;7. Reference Points&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;NFV가 처음이라면 NFV Management &amp;amp; Orchestration (NFV MANO)를 이해하려고 할 때 두 가지 어려운 점이 있습니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>&#34;NFV 아키텍처&#34; 이해를 위한 치트 시트</title>
      <link>https://markruler.com/posts/nfv/cheat-sheet-understanding-nfv-architecture/</link>
      <pubDate>Tue, 22 Sep 2020 21:58:08 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/nfv/cheat-sheet-understanding-nfv-architecture/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.telcocloudbridge.com/blog/a-cheat-sheet-for-understanding-nfv-architecture/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Faisal Khan의 A Cheat Sheet for Understanding &amp;ldquo;NFV Architecture&amp;rdquo;&lt;/a&gt;&#xA;&#xA;를 번역한 글입니다.&lt;/li&gt;&#xA;&lt;li&gt;저자의 허락을 받고 번역했습니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;시간이 없으신가요?&lt;/p&gt;&#xA;&lt;p&gt;쉽게 이해할 수 있는 NFV 용어/아키텍처에 대한 빠른 업데이트가 필요하신가요?&lt;/p&gt;&#xA;&lt;p&gt;그렇다면 NFV 아키텍처를 시작하는 데 필요한 모든 정보를 얻을 수 있는 아래 7가지 주요 블록을 보세요.&#xA;블록 번호 및 정의를 따라가세요.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://markruler.com/images/nfv/nfv-architecture.png&#34; alt=&#34;nfv-architecture&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;1-vnf-virtual-network-function&#34;&gt;1. VNF (Virtual Network Function)&lt;/h2&gt;&#xA;&lt;p&gt;VNF는 가상화된 네트워크 요소로 NFV 아키텍처의 기본 블록입니다.&#xA;예를 들어 라우터를 가상화하면 라우터 VNF라고 부르고, 다른 예는 기지국(base station) VNF도 있습니다.&#xA;네트워크 요소의 한 가지 하위 기능(sub-function)만 가상화해도 VNF라고 합니다.&#xA;예를 들어 라우터의 다양한 하위 기능은 가상 라우터로서 함께 작동하는 별도의 VNF가 될 수 있다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>쿠버네티스 API 접근 제어</title>
      <link>https://markruler.com/posts/kubernetes/controlling-access-api/</link>
      <pubDate>Thu, 17 Sep 2020 06:58:08 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/kubernetes/controlling-access-api/</guid>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://kubernetes.io/docs/reference/access-authn-authz/controlling-access/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;쿠버네티스 공식 문서&lt;/a&gt;&#xA;&#xA;를 번역했습니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;!-- overview --&gt;&#xA;&lt;p&gt;이 페이지는 쿠버네티스 API에 대한 접근 제어의 개요를 제공한다.&lt;/p&gt;&#xA;&lt;!-- body --&gt;&#xA;&lt;p&gt;사용자는&lt;code&gt;kubectl&lt;/code&gt;, 클라이언트 라이브러리&#xA;또는 REST 요청을 통해&#xA;&lt;a href=&#34;https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;API에 접근한다&lt;/a&gt;&#xA;&#xA;.&#xA;사용자와 쿠버네티스 서비스 어카운트 모두 API에 접근할 수 있다.&#xA;요청이 API에 도달하면,&#xA;다음 다이어그램에 설명된 몇 가지 단계를 거친다.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://markruler.com/images/kubernetes/access-control-overview.svg&#34; alt=&#34;Diagram of request handling steps for Kubernetes API request&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;전송-보안&#34;&gt;전송 보안&lt;/h2&gt;&#xA;&lt;p&gt;일반적인 쿠버네티스 클러스터에서 API는 443번 포트에서 서비스한다.&#xA;API 서버는 인증서를 제시한다.&#xA;이 인증서는 종종 자체 서명되기 때문에 일반적으로 사용자 머신의 &lt;code&gt;$USER/.kube/config&lt;/code&gt;은&#xA;API 서버의 인증서에 대한 루트 인증서를 포함하며,&#xA;시스템 기본 루트 인증서 대신 사용된다.&#xA;&lt;code&gt;kube-up.sh&lt;/code&gt;을 사용하여 클러스터를 직접 생성할 때&#xA;이 인증서는 일반적으로 &lt;code&gt;$USER/.kube/config&lt;/code&gt;에 자동으로 기록된다.&#xA;클러스터에 여러 명의 사용자가 있는 경우, 작성자는 인증서를 다른 사용자와 공유해야 한다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>MEC 아키텍처 초심자 가이드</title>
      <link>https://markruler.com/posts/mec/beginners-guide-to-mec-architecture/</link>
      <pubDate>Sun, 13 Sep 2020 20:58:08 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/posts/mec/beginners-guide-to-mec-architecture/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Faisal Khan의 &lt;a href=&#34;https://www.telcocloudbridge.com/blog/beginners-guide-to-mec-architecture-multi-access-edge-computing/?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Beginners Guide to MEC Architecture (Multi-access Edge Computing)&lt;/a&gt;&#xA;&#xA;을 번역한 글입니다.&#xA;저자의 허락을 받아 번역했습니다.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;MEC&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; 아키텍처 가이드에 오신 것을 환영합니다!&lt;/p&gt;&#xA;&lt;p&gt;MEC는 5G의 저지연(low-latency) 서비스를 활용하려는 이동통신사들의 새로운 투자 물결을 가져올 것입니다.&#xA;이는 소비자와 더 가까운 곳, 즉 무선 기지국(radio site)과 가까운 곳에서 서비스를 운영하겠다는 것을 의미합니다.&lt;/p&gt;&#xA;&lt;p&gt;MEC는 서비스 사업자들에게 새로운 서비스 분야와 수익 창출의 수단입니다.&#xA;예를 들어 더 빠른 게임 경험, 증강/가상 현실, 커넥티드 카 등이 있습니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>About</title>
      <link>https://markruler.com/about/</link>
      <pubDate>Thu, 10 Sep 2020 00:00:00 +0900</pubDate><author>imcxsu@gmail.com (임창수)</author>
      <guid>https://markruler.com/about/</guid>
      <description>&lt;h1 id=&#34;저에-대해&#34;&gt;저에 대해&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;소프트웨어 엔지니어&lt;/strong&gt;입니다.&lt;/li&gt;&#xA;&lt;li&gt;컴퓨터로 할 수 있는 것을 좋아합니다.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;기술 자체에도 관심이 많지만, 그 기술을 통해 무엇을 해결할 수 있는지에 더 큰 관심이 있습니다.&lt;/li&gt;&#xA;&lt;li&gt;이 기술(&lt;strong&gt;what&lt;/strong&gt;)이 어떤 문제를 해결하기 위해 만들어졌는지(&lt;strong&gt;why&lt;/strong&gt;), 어떻게 해결하는지(&lt;strong&gt;how&lt;/strong&gt;)에 관심이 많습니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;문제&lt;/strong&gt;를 정의하고 원인을 찾아 컴퓨터로 &lt;strong&gt;해결&lt;/strong&gt;하는 것을 좋아합니다.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;불편한 것을 당연하게 생각하지 않습니다.&lt;/li&gt;&#xA;&lt;li&gt;해결할 수 있는 소프트웨어를 찾거나 만듭니다.&lt;/li&gt;&#xA;&lt;li&gt;(물론 컴퓨터 없이 해결되는 문제도 많습니다.)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;블로그에-대해&#34;&gt;블로그에 대해&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;제가 공부한 내용을 정리한 기술 블로그입니다. 그래서 블로그와 위키가 섞여 있습니다.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://markruler.com/categories/blog/&#34;&gt;Blog&lt;/a&gt;&#xA;&#xA;: 개인적인 생각과 경험을 바탕으로 작성했습니다.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://markruler.com/categories/wiki/&#34;&gt;Wiki&lt;/a&gt;&#xA;&#xA;: 번역물이거나 기술 문서입니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;완벽한 글을 지향하지는 않습니다.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;링크&#34;&gt;링크&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Email: &lt;a href=&#34;mailto:imcxsu@gmail.com&#34;&gt;imcxsu@gmail.com&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;GitHub: &lt;a href=&#34;https://github.com/markruler?utm_source=markruler.com&amp;amp;utm_medium=blog&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;markruler&lt;/a&gt;&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
  </channel>
</rss>
