<?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://20h.dev/</link><description>Recent content on 여정기</description><generator>Hugo -- gohugo.io</generator><language>ko</language><lastBuildDate>Thu, 01 Jan 2026 19:34:55 +0900</lastBuildDate><atom:link href="https://20h.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>2025는 어땠는가?</title><link>https://20h.dev/post/retrospect/2025/</link><pubDate>Thu, 01 Jan 2026 19:34:55 +0900</pubDate><guid>https://20h.dev/post/retrospect/2025/</guid><description>&lt;h1 id="2025는-어땠는가"&gt;2025는 어땠는가?&lt;/h1&gt;
&lt;h2 id="생활"&gt;생활&lt;/h2&gt;
&lt;p&gt;2025는 많은 경험들을 하고 배울 수 있었던 한 해라고 표현할 수 있을 것 같다. 그 중 키워드로 나눈다면 이렇게 나눠볼 수 있다.&lt;/p&gt;</description></item><item><title>Kubernetes Log Agent Slab 이슈에 대해서 알아보자</title><link>https://20h.dev/post/kubernetes/log-agent-scrape-issue/</link><pubDate>Thu, 01 Jan 2026 19:08:12 +0900</pubDate><guid>https://20h.dev/post/kubernetes/log-agent-scrape-issue/</guid><description>&lt;p&gt;쿠버네티스 환경에서 로그 수집 에이전트를 운영하다 보면 예상치 못한 메모리 이슈를 겪을 수 있습니다. 이 글에서는 Alloy를 사용하여 &lt;code&gt;/var/log/pods&lt;/code&gt;를 watch하는 과정에서 발생한 slab memory 이슈와 그 해결 과정을 살펴보겠습니다.&lt;/p&gt;</description></item><item><title>Grafana Loki는 왜 TSDB를 선택했을까?</title><link>https://20h.dev/post/loki/tsdb/</link><pubDate>Sun, 29 Jun 2025 15:04:44 +0900</pubDate><guid>https://20h.dev/post/loki/tsdb/</guid><description>&lt;h2 id="tsdb는-어떤-방식으로-문제를-해결했을까"&gt;TSDB는 어떤 방식으로 문제를 해결했을까?&lt;/h2&gt;
&lt;p&gt;Loki가 도입한 TSDB는 단순한 저장 방식의 변경이 아니라, 기존 &lt;code&gt;boltdb-shipper&lt;/code&gt; 구조의 병목을 해결하기 위한 구조적 전환입니다. 특히 인덱스와 로그 청크를 시간 단위 블록 단위로 묶어 저장함으로써 성능과 비용 문제를 동시에 개선했습니다.&lt;/p&gt;</description></item><item><title>Kubernetes Log에 대하여 알아보자</title><link>https://20h.dev/post/kubernetes/kubernetes-log/</link><pubDate>Sun, 11 May 2025 15:02:25 +0900</pubDate><guid>https://20h.dev/post/kubernetes/kubernetes-log/</guid><description>&lt;p&gt;쿠버네티스 환경에서 로그는 컨테이너 런타임에 의해 생성되고 kubelet에 의해 관리됩니다. 이 글에서는 쿠버네티스의 로그 생성부터 관리, 그리고 수집까지의 전체 과정을 살펴보겠습니다.&lt;/p&gt;</description></item><item><title>grafana loki에서 로그를 수집하는 방법에 대해 알아보자</title><link>https://20h.dev/post/loki/write/</link><pubDate>Sat, 19 Apr 2025 20:39:47 +0900</pubDate><guid>https://20h.dev/post/loki/write/</guid><description>&lt;p&gt;Loki v3 기준으로 작성한 로그 수집하는 구조를 정리했습니다. 여기서는 수집기를 제외하고 Loki에서 로그를 수집하는데 쓰이는 컴포넌트들과 아키텍처에 대해서 공부한 바를 정리하고 있습니다.&lt;/p&gt;</description></item><item><title>Loki의 Zone Awareness 기능</title><link>https://20h.dev/post/loki/zone-awareness/</link><pubDate>Sun, 30 Mar 2025 22:15:50 +0900</pubDate><guid>https://20h.dev/post/loki/zone-awareness/</guid><description>&lt;h2 id="zone-awareness란"&gt;Zone Awareness란?&lt;/h2&gt;
&lt;p&gt;Zone Awareness는 Loki가 여러 가용 영역(Availability Zones)에 걸쳐 데이터를 분산하고 복제하는 기능입니다. 이 기능은 단일 가용 영역 장애가 발생해도 서비스를 중단 없이 유지할 수 있도록 설계되었습니다.&lt;/p&gt;</description></item><item><title>Bloom Filter에 대해 알아보자</title><link>https://20h.dev/post/data-structure/bloom-filter/</link><pubDate>Sat, 21 Dec 2024 12:44:46 +0900</pubDate><guid>https://20h.dev/post/data-structure/bloom-filter/</guid><description>&lt;h1 id="bloom-filter란"&gt;Bloom Filter란?&lt;/h1&gt;
&lt;p&gt;Bloom Filter는 요소가 집합에 포함되어 있는지를 효율적으로 검사하기 위한 확률적 자료 구조예요. 이 자료 구조는 메모리 사용을 최소화하면서도 빠른 검색 속도를 제공해요.&lt;/p&gt;</description></item><item><title>Go 100가지 실수 패턴과 솔루션</title><link>https://20h.dev/post/book/100-go-mistakes/</link><pubDate>Sun, 18 Feb 2024 18:29:16 +0900</pubDate><guid>https://20h.dev/post/book/100-go-mistakes/</guid><description>&lt;figure&gt;
&lt;img src="https://github.com/lee20h/blog/assets/59367782/ef347727-82f1-4f33-9351-452f69a0150e" width="300" height="400"/&gt;
&lt;/figure&gt;
&lt;h1 id="서평"&gt;서평&lt;/h1&gt;
&lt;p&gt;이 책은 &lt;code&gt;Effective Java&lt;/code&gt;에 상당하는 Go 책이라고 평가를 받은 책이다. Go 프로젝트에서 가장 많이 저지르는 100가지 실수에 대해 예제와 해결 방법에 대해 정리하고 있다. 원서는 2022년에 제작되어 2023년 12월에 한국어로 번역되어 볼 수 있게 되었는데, 번역 자체가 깔끔하게 되어 읽음에 막힘이 없다고 느꼈다.&lt;/p&gt;</description></item><item><title>Oauth2 Proxy에 대하여</title><link>https://20h.dev/post/network/oauth2-proxy/</link><pubDate>Mon, 11 Dec 2023 22:31:15 +0900</pubDate><guid>https://20h.dev/post/network/oauth2-proxy/</guid><description>&lt;h1 id="oauth2-proxy란"&gt;Oauth2 Proxy란?&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://oauth2-proxy.github.io/oauth2-proxy/"&gt;OAuth2 Proxy&lt;/a&gt;는 OAuth2 서버에 대해 인증을 제공해주는 리버스 프록시 구현체이다. OpenID Connect와 같은 OAuth2에 대해서 인증을 제공하는 애플리케이션의 경우에는 바로 프로바이더를 등록하여 사용할 수 있다. 하지만, 애플리케이션에서 인증을 따로 제공하지 않는다면 따로 작업이 필요하다.&lt;/p&gt;</description></item><item><title>Mockery에 대하여</title><link>https://20h.dev/post/golang/mockery/</link><pubDate>Fri, 10 Nov 2023 19:59:37 +0900</pubDate><guid>https://20h.dev/post/golang/mockery/</guid><description>&lt;h1 id="mockery란"&gt;Mockery란?&lt;/h1&gt;
&lt;p&gt;Go 언어에서 인터페이스를 모킹하기 위한 도구로, 테스트 중에 인터페이스의 구현을 쉽게 대체할 수 있어서 테스트를 더 단순하고 효율적으로 만들 수 있다.&lt;br&gt;
개발자가 수동으로 모킹 코드를 작성할 필요 없이 만들어져있는 인터페이스 기반으로 명령어로 모킹 클래스를 생성할 수 있어서 생산성이 높아진다. 모킹을 통해 외부 시스템이나 데이터베이스, 네트워크 호출과 같은 의존성을 제하고 테스트를 실행할 수 있다.&lt;/p&gt;</description></item><item><title>Kubernetes Concept에 대하여</title><link>https://20h.dev/post/kubernetes/kubernetes-concept/</link><pubDate>Fri, 03 Nov 2023 21:09:36 +0900</pubDate><guid>https://20h.dev/post/kubernetes/kubernetes-concept/</guid><description>&lt;h1 id="kubernetes란"&gt;Kubernetes란?&lt;/h1&gt;
&lt;p&gt;최근 많은 기업들에서 운영하기 위해 채택하여 사용하고 있는 Kubernetes에 대해서 알아보자. 쿠버네티스, K8s라고 불리우며, 공식 웹사이트에서는 다음과 같이 설명하고 있다.&lt;/p&gt;</description></item><item><title>Go Test에 대해 알아보자</title><link>https://20h.dev/post/golang/go-test/</link><pubDate>Mon, 30 Oct 2023 22:55:12 +0900</pubDate><guid>https://20h.dev/post/golang/go-test/</guid><description>&lt;h1 id="golang-test"&gt;Golang Test&lt;/h1&gt;
&lt;p&gt;Go에서는 &lt;strong&gt;go test&lt;/strong&gt;라는 내장 테스트 도구를 제공한다. 이 도구로 Go 코드의 단위 테스트, 벤치마크, 예제 등을 쉽게 작성하고 실행할 수 있다.&lt;br&gt;
그 외에도 여러 테스트 프레임워크가 존재하며, mock을 위한 라이브러리도 많이 존재한다. 이번 포스팅에서는 Go에서의 테스트를 크게 훑어보고, 사용법과 장단점을 비교해보려고 한다.&lt;/p&gt;</description></item><item><title>Go Pipeline 패턴에 대해 알아보자</title><link>https://20h.dev/post/golang/pipeline-pattern/</link><pubDate>Sun, 29 Oct 2023 00:39:31 +0900</pubDate><guid>https://20h.dev/post/golang/pipeline-pattern/</guid><description>&lt;h1 id="go-pipeline-pattern이란"&gt;Go Pipeline Pattern이란?&lt;/h1&gt;
&lt;p&gt;Go 언어에서의 &lt;strong&gt;파이프라인 패턴&lt;/strong&gt;은 동시성 프로그래밍에 있어 중요한 개념으로, 특히 복잡한 데이터 처리와 관련된 작업을 효율적으로 수행하기 위해 사용된다.&lt;br&gt;
이 패턴은 여러 단계의 독립적인 작업 단위로 나누어진 작업의 흐름을 생성한다. 각 단계는 파이프라인의 다음 단계로 데이터를 &lt;strong&gt;전달&lt;/strong&gt;하며, 이러한 방식으로 데이터는 파이프라인을 통해 흐르게 된다.&lt;/p&gt;</description></item><item><title>Go Worker Pool 패턴에 대해 알아보자</title><link>https://20h.dev/post/golang/worker-pool-pattern/</link><pubDate>Sat, 28 Oct 2023 22:37:13 +0900</pubDate><guid>https://20h.dev/post/golang/worker-pool-pattern/</guid><description>&lt;h1 id="go-worker-pool이란"&gt;Go Worker Pool이란?&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Worker Pool&lt;/strong&gt;은 고정된 수의 작업자를 사용하여 큐에 있는 여러 작업을 실행하여 동시성을 구현하는 패턴이다. Go 생태계에서는 고루틴을 사용하여 작업자를 생성하고 채널을 사용하여 큐를 구현한다.&lt;br&gt;
정의된 작업자 수는 큐에서 작업을 가져와 작업을 완료하며, 작업이 완료되면 새 작업을 계속 가져와서 진행한다.&lt;/p&gt;</description></item><item><title>개인정보의 안전성 확보조치에 대하여</title><link>https://20h.dev/post/security/ensuring-the-safety-of-personal-information/</link><pubDate>Sat, 28 Oct 2023 21:24:45 +0900</pubDate><guid>https://20h.dev/post/security/ensuring-the-safety-of-personal-information/</guid><description>&lt;h1 id="개인정보-안정성-확보조치-기준-법령"&gt;개인정보 안정성 확보조치 기준 법령&lt;/h1&gt;
&lt;p&gt;개인정보 보호법에서 정의된 조항에 따라 개인정보 처리자가 안전성을 확보하기 위한 최소한의 기준을 &lt;a href="https://www.law.go.kr/%ED%96%89%EC%A0%95%EA%B7%9C%EC%B9%99/%EA%B0%9C%EC%9D%B8%EC%A0%95%EB%B3%B4%EC%9D%98%EC%95%88%EC%A0%84%EC%84%B1%ED%99%95%EB%B3%B4%EC%A1%B0%EC%B9%98%EA%B8%B0%EC%A4%80/%282023-6,20230922%29"&gt;개인정보의안전성확보조치기준&lt;/a&gt; 법령에서 정의한다.&lt;br&gt;
개인정보 안전성 확보조치 기준 통합 및 개인정보의 기술적.관리적 보호조치 기준 폐지되어 2023. 09. 22에 시행되었다. 따라서 내용이 개정되어 제공하는 해설서와 조금 다를 수 있다.&lt;/p&gt;</description></item><item><title>Go Semaphore 패턴에 대해 알아보자</title><link>https://20h.dev/post/golang/semaphore-pattern/</link><pubDate>Thu, 26 Oct 2023 01:12:25 +0900</pubDate><guid>https://20h.dev/post/golang/semaphore-pattern/</guid><description>&lt;h1 id="go-semaphore-pattern이란"&gt;Go Semaphore Pattern이란?&lt;/h1&gt;
&lt;p&gt;Go 언어에서의 &lt;strong&gt;세마포어&lt;/strong&gt;(Semaphore)는 동시성 제어를 위한 고전적인 방법 중 하나로, 특정 자원에 대한 동시 접근을 제한함으로써 여러 고루틴 사이에서의 동기화를 달성한다.&lt;br&gt;
세마포어는 주로 두 가지 유형이 있으며 다음과 같다.&lt;/p&gt;</description></item><item><title>Kubernetes Operator에 대하여</title><link>https://20h.dev/post/kubernetes/operator/</link><pubDate>Mon, 23 Oct 2023 23:08:47 +0900</pubDate><guid>https://20h.dev/post/kubernetes/operator/</guid><description>&lt;h1 id="operator오퍼레이터-패턴에-대하여"&gt;Operator(오퍼레이터) 패턴에 대하여&lt;/h1&gt;
&lt;p&gt;오퍼레이터 패턴은 Custom Resource를 이용하여 애플리케이션 및 해당 컴포넌트를 관리하는 쿠버네티스 확장이다.&lt;/p&gt;</description></item><item><title>GKE를 위한 GCP Network에 대하여</title><link>https://20h.dev/post/cloud/gcp-network-architecture/</link><pubDate>Tue, 17 Oct 2023 23:03:15 +0900</pubDate><guid>https://20h.dev/post/cloud/gcp-network-architecture/</guid><description>&lt;h1 id="google-cloud-platform-network-for-google-kubernetes-engine"&gt;Google Cloud Platform Network for Google Kubernetes Engine&lt;/h1&gt;
&lt;p&gt;필자가 Google Kubernetes Engine을 사용할 때 처음으로 만든 Load Balancer는 External Passthrough Network Load Balancer이다. 그 이유&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;는 &lt;a href="https://docs.nginx.com/nginx-ingress-controller/"&gt;NGINX Ingress Controller&lt;/a&gt;를 배포하면서 알게 되었는데, Service type을 &lt;code&gt;LoadBalancer&lt;/code&gt;로 구성하게 되면 자동으로 GKE가 서비스 앞에 External Passthrough Network Load Balancer를 프로비저닝하게 된다.&lt;/p&gt;</description></item><item><title>HTTP/2 CVE-2019-[9511~9518]</title><link>https://20h.dev/post/vulnerability/http2-dos-attck/</link><pubDate>Sun, 15 Oct 2023 23:56:24 +0900</pubDate><guid>https://20h.dev/post/vulnerability/http2-dos-attck/</guid><description>&lt;h1 id="http2-denial-of-service-공격"&gt;HTTP/2 Denial of Service 공격&lt;/h1&gt;
&lt;p&gt;8개의 취약점 모두 DoS(Denial of Service) 공격으로, 소수의 낮은 대역폭의 악성 세션을 가지고 일부 요소에게 장애를 일으키는 공격이다.&lt;/p&gt;</description></item><item><title>분산 컴퓨팅에 대해 알아보자</title><link>https://20h.dev/post/cloud/distributed-computing/</link><pubDate>Sun, 15 Oct 2023 22:36:59 +0900</pubDate><guid>https://20h.dev/post/cloud/distributed-computing/</guid><description>&lt;h1 id="분산-컴퓨팅이란"&gt;분산 컴퓨팅이란?&lt;/h1&gt;
&lt;p&gt;다수의 컴퓨터가 공통 문제를 해결하기 위해 협업하도록 만드는 방법으로, 컴퓨터 네트워크는 복잡한 과제를 처리하기 위한 대량의 리소스를 제공하는 하나의 거대한 컴퓨터와 같이 동작한다.
분산 시스템 혹은 분산 데이터베이스라고도 하며, 별도의 노드가 공동의 네트워크를 통해 통신하고 동기화하게 된다. 노드는 일반적으로 별도의 하드웨어 장치를 의미하지만 소프트웨어 프로세스나 캡슐화 시스템을 나타낼 수도 있다.&lt;/p&gt;</description></item><item><title>HTTP/2 Rapid Reset CVE-2023-44487</title><link>https://20h.dev/post/vulnerability/http2-rapid-reset/</link><pubDate>Sat, 14 Oct 2023 22:19:24 +0900</pubDate><guid>https://20h.dev/post/vulnerability/http2-rapid-reset/</guid><description>&lt;h1 id="http2-rapid-reset-공격"&gt;HTTP/2 Rapid Reset 공격&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.cve.org/CVERecord?id=CVE-2023-44487"&gt;CVE-2023-44487&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;HTTP/2 Rapid Reset 공격에 대해서 요약하자면 다음과 같다.&lt;/p&gt;</description></item><item><title>가상화 관련 용어에 대해 알아보자</title><link>https://20h.dev/post/cloud/virtualization-terms/</link><pubDate>Sat, 14 Oct 2023 00:00:00 +0900</pubDate><guid>https://20h.dev/post/cloud/virtualization-terms/</guid><description>&lt;h2 id="on-premise--off-premise"&gt;On-premise / Off-premise&lt;/h2&gt;
&lt;p&gt;On-premise: 사내(자체 데이터센터나 전산실)에 서버를 직접 설치하여 사용하는 환경&lt;br&gt;
Off-premise: 클라우드 서비스 환경을 이용한 방식&lt;/p&gt;</description></item><item><title>카프카에 대해 알아보자</title><link>https://20h.dev/post/kafka/what-is-kafka/</link><pubDate>Wed, 04 Oct 2023 14:34:23 +0900</pubDate><guid>https://20h.dev/post/kafka/what-is-kafka/</guid><description>&lt;h1 id="카프카란"&gt;카프카란?&lt;/h1&gt;
&lt;p&gt;처음 링크드인(LinkedIn)에서 시작한 &lt;strong&gt;데이터 스트리밍 플랫폼&lt;/strong&gt;으로, 링크드인 서비스 내부의 문제를 해결하기 위해서 시작된 프로젝트이다. 그 문제는, 링크드인 고객이 이직하였을 때 지인들에게 그 사실이 업데이트되는 부분과 추천 서비스에 필요한 정보들이 업데이트되는 것이 더디다는 점이였다.&lt;br&gt;
카프카를 통해 문제를 해결할 수 있었고 좋은 사례로 자리잡아, 2011년 아파치 오픈소스로 공개되어 많은 곳에서 채택되어 사용되었다.&lt;/p&gt;</description></item><item><title>가상화에 대해 알아보자</title><link>https://20h.dev/post/cloud/virtualization/</link><pubDate>Mon, 02 Oct 2023 20:59:38 +0900</pubDate><guid>https://20h.dev/post/cloud/virtualization/</guid><description>&lt;h1 id="가상화"&gt;가상화&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;가상화는 서버, 스토리지, 네트워크 및 기타 물리적 시스템에 대한 가상 표현을 생성하는 데 사용할 수 있는 기술입니다. 가상 소프트웨어는 물리적 하드웨어 기능을 모방하여 하나의 물리적 머신에서 여러 가상 시스템을 동시에 실행합니다. - 출처: &lt;a href="https://aws.amazon.com/ko/what-is/virtualization/"&gt;AWS&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Go Concurrency에 대해 알아보자</title><link>https://20h.dev/post/golang/concurrency/</link><pubDate>Sat, 23 Sep 2023 21:10:58 +0900</pubDate><guid>https://20h.dev/post/golang/concurrency/</guid><description>&lt;h2 id="go-concurrency"&gt;Go Concurrency&lt;/h2&gt;
&lt;p&gt;Go에서는 동시성을 해결하기 위해 다음과 같이 두 가지 스타일을 지원한다.&lt;/p&gt;</description></item><item><title>고루틴에 대해 알아보자</title><link>https://20h.dev/post/golang/goroutine/</link><pubDate>Wed, 13 Sep 2023 22:48:47 +0900</pubDate><guid>https://20h.dev/post/golang/goroutine/</guid><description>&lt;h1 id="goroutine-이란"&gt;Goroutine 이란?&lt;/h1&gt;
&lt;p&gt;고루틴(goroutine)에 대해 이야기하기 전에 먼저 스레드(thread)에 대해서 이야기하면 좋을 것 같다.&lt;/p&gt;</description></item><item><title>ArgoCD에 대해 알아보자</title><link>https://20h.dev/post/cicd/argocd/</link><pubDate>Fri, 08 Sep 2023 21:51:16 +0900</pubDate><guid>https://20h.dev/post/cicd/argocd/</guid><description>&lt;h2 id="argo-란"&gt;Argo 란?&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.cncf.io/projects/argo/"&gt;CNCF&lt;/a&gt;의 Graduated Project로, &lt;a href="https://argoproj.github.io/"&gt;Argo&lt;/a&gt; 4가지의 오픈 소스 툴을 관리하는 프로젝트다.
공식 사이트에선 다음과 같이 소개한다.&lt;/p&gt;</description></item><item><title>devops 읽어볼 정보</title><link>https://20h.dev/post/article/infomation/</link><pubDate>Tue, 05 Sep 2023 01:02:14 +0900</pubDate><guid>https://20h.dev/post/article/infomation/</guid><description>&lt;p&gt;The objective is to document findings and recommendations from the review of DevOps processes and artifacts.&lt;/p&gt;</description></item><item><title>About</title><link>https://20h.dev/about/</link><pubDate>Mon, 04 Sep 2023 00:00:00 +0000</pubDate><guid>https://20h.dev/about/</guid><description>&lt;h3 id="interest"&gt;Interest&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Kubernetes&lt;/li&gt;
&lt;li&gt;Observability&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;div
style="
display: flex;
align-items: center;
gap: 10px;
"
&gt;
&lt;a
href="https://www.linkedin.com/in/younghun-lee-745b12201/"
target="_blank"
rel="noopener noreferrer"
&gt;
&lt;img
src="https://img.shields.io/badge/-LinkedIn-blue?style=flat-square&amp;logo=Linkedin&amp;logoColor=white"
alt="LinkedIn"
style="pointer-events: none;"
/&gt;
&lt;/a&gt;
&lt;a
href="mailto:lee0h.0417@gmail.com"
&gt;
&lt;img
src="https://img.shields.io/badge/-Gmail-d14836?style=flat-square&amp;logo=Gmail&amp;logoColor=white"
alt="Gmail"
style="pointer-events: none;"
/&gt;
&lt;/a&gt;
&lt;/div&gt;</description></item><item><title>Certifications</title><link>https://20h.dev/certifications/</link><pubDate>Mon, 04 Sep 2023 00:00:00 +0000</pubDate><guid>https://20h.dev/certifications/</guid><description>&lt;h2 id="certification"&gt;Certification&lt;/h2&gt;</description></item><item><title>bitmask에 대해 알아보자</title><link>https://20h.dev/post/algorithm/bitmask/</link><pubDate>Mon, 13 Jun 2022 23:08:07 +0900</pubDate><guid>https://20h.dev/post/algorithm/bitmask/</guid><description>&lt;h1 id="비트마스크"&gt;비트마스크&lt;/h1&gt;
&lt;p&gt;비트마스크란, 정수의 이진수 표현을 활용한 기법이다. 비트가 가질 수 있는 상태는 0과 1로 이진수로 표현이 된다. 따라서 비트로 알 수 있는 정보는 다음과 같다.&lt;/p&gt;</description></item><item><title>에라토스테네스의 체에 대해 알아보자</title><link>https://20h.dev/post/algorithm/eratosthenes/</link><pubDate>Wed, 04 May 2022 22:18:34 +0900</pubDate><guid>https://20h.dev/post/algorithm/eratosthenes/</guid><description>&lt;h2 id="에라토스테네스의-체란"&gt;에라토스테네스의 체란?&lt;/h2&gt;
&lt;p&gt;많은 수 중 소수를 빠르고 정확하게 판별하는 알고리즘이다.&lt;/p&gt;</description></item><item><title>LIS에 대해 알아보자</title><link>https://20h.dev/post/algorithm/lis/</link><pubDate>Mon, 02 May 2022 21:53:52 +0900</pubDate><guid>https://20h.dev/post/algorithm/lis/</guid><description>&lt;h1 id="lis"&gt;LIS&lt;/h1&gt;
&lt;p&gt;LIS(Longest Increasing Subsequence) : 최장 증가 부분 수열&lt;/p&gt;
&lt;p&gt;수열 하나가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구할 때 3가지 방법이 있다.&lt;/p&gt;</description></item><item><title>LCS에 대해 알아보자</title><link>https://20h.dev/post/algorithm/lcs/</link><pubDate>Thu, 28 Apr 2022 21:53:52 +0900</pubDate><guid>https://20h.dev/post/algorithm/lcs/</guid><description>&lt;h1 id="lcs"&gt;LCS&lt;/h1&gt;
&lt;p&gt;LCS는 두 가지로 나뉘어진다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;최장 공통 부분 문자열(Longest Common Substring)&lt;/code&gt;과 &lt;code&gt;최장 공통 부분 수열(Longest Common Subsequence)&lt;/code&gt; 두 가지로 나뉘는데 비슷하나 차이점이 뚜렷하다. 그 차이점은 해당 부분의 연속 여부이다. 아래 예시를 봐보자.&lt;/p&gt;</description></item><item><title>LCA에 대해 알아보자</title><link>https://20h.dev/post/algorithm/lca/</link><pubDate>Sat, 23 Apr 2022 21:53:52 +0900</pubDate><guid>https://20h.dev/post/algorithm/lca/</guid><description>&lt;h1 id="lca"&gt;LCA&lt;/h1&gt;
&lt;p&gt;Lowest Common Ancestor(LCA) 즉, 최소 공통 조상을 구하는 알고리즘이다. 두 정점 u,v에서 가장 가까운 공통 조상을 찾는 과정이다.&lt;/p&gt;</description></item><item><title>KMP에 대해 알아보자</title><link>https://20h.dev/post/algorithm/kmp/</link><pubDate>Thu, 21 Apr 2022 21:52:32 +0900</pubDate><guid>https://20h.dev/post/algorithm/kmp/</guid><description>&lt;h1 id="kmp"&gt;KMP&lt;/h1&gt;
&lt;p&gt;문자열 검색 알고리즘 중 접두사와 접미사를 구하는 알고리즘으로 naive 문자열 검색과 달리 문자열 전부를 검색하는 것이 아닌 접두사와 접미사가 같은 조건에 의해 만들어진 실패함수로 적절하게 인덱스를 조정하여 검색하는 알고리즘이다.&lt;/p&gt;</description></item><item><title>Rabin Karp에 대해 알아보자</title><link>https://20h.dev/post/algorithm/rabin-karp/</link><pubDate>Tue, 12 Apr 2022 22:04:40 +0900</pubDate><guid>https://20h.dev/post/algorithm/rabin-karp/</guid><description>&lt;h1 id="라빈-카프rabin-karp"&gt;라빈-카프(Rabin-Karp)&lt;/h1&gt;
&lt;p&gt;라빈-카프 알고리즘은 문자열 매칭 알고리즘 중 하나이다. 항상 빠르지는 않지만 일반적인 경우 빠르게 작동하는 간단한 구조의 문자열 매칭 알고리즘이라는 점에서 자주 사용된다.&lt;/p&gt;</description></item><item><title>문자열 검색에 대해 알아보자</title><link>https://20h.dev/post/algorithm/string-search/</link><pubDate>Mon, 21 Mar 2022 22:06:00 +0900</pubDate><guid>https://20h.dev/post/algorithm/string-search/</guid><description>&lt;h1 id="문자열-검색"&gt;문자열 검색&lt;/h1&gt;
&lt;h2 id="naive-matching"&gt;Naive Matching&lt;/h2&gt;
&lt;p&gt;먼저 &lt;code&gt;Naive Matching 알고리즘&lt;/code&gt;은 찾고자하는 문자열과 주어진 문자열을 하나하나 비교하면서 처음부터 끝까지 확인하는 방식이다. 최악의 경우 시간복잡도 O((n-m)m)이 걸린다. 하나하나 일일이 검사하므로 작은 문자열이라면 시도할만 하다. 하지만 대부분이 큰 문자열이 주어지므로 최대한 피하자.&lt;/p&gt;</description></item><item><title>트라이(trie)에 대해 알아보자</title><link>https://20h.dev/post/algorithm/trie/</link><pubDate>Wed, 02 Mar 2022 22:17:06 +0900</pubDate><guid>https://20h.dev/post/algorithm/trie/</guid><description>&lt;h1 id="트라이"&gt;트라이&lt;/h1&gt;
&lt;p&gt;문자열에서 검색을 빠르게 해주는 자료구조이다. 정수형 자료형에서 이진색트리를 이용하면 O(logN), 문자열에서 이진검색트리를 사용하면 문자열의 최대 길이가 M 일때 O(MlogN) 시간복잡도를 갖는다.&lt;/p&gt;</description></item><item><title>Docker에 대해 알아보자</title><link>https://20h.dev/post/cloud/docker/</link><pubDate>Sun, 06 Feb 2022 00:00:00 +0000</pubDate><guid>https://20h.dev/post/cloud/docker/</guid><description>&lt;p&gt;IT 업계에 종사하는 사람들이라면 한번 쯤은 들어보거나 봤을 법한 고래 캐릭터와 Docker를 &lt;a href="https://www.docker.com/"&gt;공식페이지&lt;/a&gt;에서 대문글로 이렇게 표현한다.&lt;/p&gt;</description></item><item><title>이항계수에 대해서 알아보자 (feat. 페르마의 소정리)</title><link>https://20h.dev/post/algorithm/binomial-coefficient/</link><pubDate>Fri, 04 Feb 2022 23:11:48 +0900</pubDate><guid>https://20h.dev/post/algorithm/binomial-coefficient/</guid><description>&lt;h1 id="이항-계수"&gt;이항 계수&lt;/h1&gt;
&lt;h2 id="이항-계수란"&gt;이항 계수란&lt;/h2&gt;
&lt;p&gt;n개의 원소에서 r개의 원소를 뽑아내는 경우의 수&lt;br&gt;
즉, 조합. 수식으로는 n!/(r!(n-r)!)&lt;/p&gt;</description></item><item><title>Jenkins에 대해 알아보자</title><link>https://20h.dev/post/cicd/jenkins/</link><pubDate>Thu, 13 Jan 2022 00:00:00 +0000</pubDate><guid>https://20h.dev/post/cicd/jenkins/</guid><description>&lt;p&gt;&lt;img src="https://github.com/lee20h/blog/assets/59367782/f59af189-0a61-48c9-8b30-25befa85178c" alt="image"&gt;&lt;/p&gt;
&lt;h2 id="jenkins-란"&gt;Jenkins 란?&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://cd.foundation"&gt;CD Foundation&lt;/a&gt;의 프로젝트 중 하나인 Jenkins는 오래 전부터 사랑받아온 CI/CD Tool 중 하나이다.&lt;/p&gt;</description></item><item><title>세그먼트 트리에 대해 알아보자</title><link>https://20h.dev/post/algorithm/segment-tree/</link><pubDate>Wed, 12 Jan 2022 22:10:17 +0900</pubDate><guid>https://20h.dev/post/algorithm/segment-tree/</guid><description>&lt;h1 id="세그먼트-트리"&gt;세그먼트 트리&lt;/h1&gt;
&lt;p&gt;문제를 예로 들어서 세그먼트 트리를 얘기해보자. &lt;a href="https://www.acmicpc.net/blog/view/9"&gt;참고&lt;/a&gt;를 내가 이해한 방향으로 적어보았다.&lt;/p&gt;</description></item><item><title>연속합에 대해 알아보자</title><link>https://20h.dev/post/algorithm/prefix-sum/</link><pubDate>Mon, 03 Jan 2022 22:13:58 +0900</pubDate><guid>https://20h.dev/post/algorithm/prefix-sum/</guid><description>&lt;h1 id="연속합"&gt;연속합&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://cses.fi/problemset/task/1643"&gt;CSES&lt;/a&gt; &lt;a href="https://www.acmicpc.net/problem/1912"&gt;BOJ&lt;/a&gt; &lt;a href="https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXQm2SqdxkDFAUo&amp;amp;categoryId=AWXQm2SqdxkDFAUo&amp;amp;categoryType=CODE&amp;amp;&amp;amp;&amp;amp;"&gt;SWEA&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="초기-생각"&gt;초기 생각&lt;/h2&gt;
&lt;p&gt;기본적으로 비슷한 문제로 처음에 떠올린 방법은 시간 복잡도 O(n)을 가졌다. 하지만 시간초과로 제대로 해결하지 못하였는데 이 부분은 O(1)로 구현해야했다. 그래서 밑과 같은 방식으로 복습하여 구현하였다.&lt;/p&gt;</description></item><item><title>Helm Chart와 Template에 대해 알아보자</title><link>https://20h.dev/post/kubernetes/helm-template/</link><pubDate>Thu, 30 Dec 2021 23:14:17 +0900</pubDate><guid>https://20h.dev/post/kubernetes/helm-template/</guid><description>&lt;p&gt;&lt;img src="https://github.com/lee20h/blog/assets/59367782/71942a7b-e70d-47a2-9ed9-1709ac1a2422" alt="image"&gt;&lt;/p&gt;
&lt;h1 id="helm-chart란"&gt;Helm Chart란?&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://velog.io/@lee20h/Helm%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90"&gt;이전 포스팅&lt;/a&gt;에서 이야기한 Helm를 제대로 사용하려면 Chart에 대해 알아야한다.&lt;/p&gt;</description></item><item><title>Helm에 대해 알아보자</title><link>https://20h.dev/post/kubernetes/helm/</link><pubDate>Wed, 22 Dec 2021 23:06:30 +0900</pubDate><guid>https://20h.dev/post/kubernetes/helm/</guid><description>&lt;p&gt;&lt;img src="https://github.com/lee20h/blog/assets/59367782/38a4aad9-2386-4027-a99f-902e2622faec" alt=""&gt;&lt;/p&gt;
&lt;h1 id="helm이란"&gt;Helm이란?&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://helm.sh/"&gt;Helm 공식사이트&lt;/a&gt;에서는 이렇게 소개한다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Helm is the best way to find, share, and use software built for Kubernetes.&lt;/p&gt;</description></item><item><title>CCW에 대해 알아보자</title><link>https://20h.dev/post/algorithm/ccw/</link><pubDate>Thu, 16 Dec 2021 21:51:07 +0900</pubDate><guid>https://20h.dev/post/algorithm/ccw/</guid><description>&lt;h1 id="ccw"&gt;CCW&lt;/h1&gt;
&lt;p&gt;CCW란, 점 3개가 이차원 평면에 존재하여 점들을 이은 선분이 어떤 방향성을 나타내는지 확인하는 알고리즘이다.&lt;/p&gt;</description></item><item><title>Apache log4j CVE-2021-44228</title><link>https://20h.dev/post/vulnerability/log4j/</link><pubDate>Mon, 13 Dec 2021 22:45:51 +0900</pubDate><guid>https://20h.dev/post/vulnerability/log4j/</guid><description>&lt;h1 id="apache-log4j란"&gt;Apache Log4j란?&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;자바 기반 소프트웨어에서 사용되는 로깅 유틸리티이다.&lt;/li&gt;
&lt;li&gt;Apache Software Foundation에서 개발하여 많은 소프트웨어에 사용되어진다.&lt;/li&gt;
&lt;li&gt;특히 아파치 진형의 오픈소스나, 자바 기반 오픈소스에서 많이 채택되어진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="취약점-요약"&gt;취약점 요약&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Log4j 2에는 로그 메시지 기록 시 JNDI 조회한 값을 포함할 수 있는 기능이 있다.&lt;/p&gt;</description></item><item><title>graph 이론에 대해 알아보자</title><link>https://20h.dev/post/algorithm/graph/</link><pubDate>Mon, 25 Oct 2021 22:02:15 +0900</pubDate><guid>https://20h.dev/post/algorithm/graph/</guid><description>&lt;h1 id="graph"&gt;Graph&lt;/h1&gt;
&lt;h2 id="prim"&gt;Prim&lt;/h2&gt;
&lt;h3 id="구현설명"&gt;구현설명&lt;/h3&gt;
&lt;p&gt;프림 알고리즘은 MST 즉, 최소 신장트리를 만드는 알고리즘 중 하나이며, 그리디 알고리즘의 일종으로 최적해를 보장해준다.&lt;br&gt;
시작 정점을 집합 S에 포함시킨 상태로 시작한다. S에서 V-S를 연결하는 간선 중 최소길이를 찾아서 해당 정점을 S에 포함시킨다.&lt;/p&gt;</description></item><item><title>가상 메모리(virtual memory)에 대해 알아보자</title><link>https://20h.dev/post/operation-system/virtual-memory/</link><pubDate>Mon, 04 Oct 2021 00:00:00 +0000</pubDate><guid>https://20h.dev/post/operation-system/virtual-memory/</guid><description>&lt;h1 id="virtual-memory"&gt;Virtual Memory&lt;/h1&gt;
&lt;p&gt;프로그램에서 필요한 메모리를 논리적 주소 공간에서 물리적 주소 공간으로 접근을 한다. 예전에는 논리적 주소 공간과 물리적 주소 공간의 크기를 같게 해야 프로그램이 꺼지지 않고 실행이 되었다. 가상 메모리가 도입 되고나서는 가상 메모리 공간에 물리 메모리 공간에서 조금만 가지고 유지하며, 논리적 주소 공간에서 요구 할 때 가상 메모리 공간에 없다면 물리 메모리 공간에 접근해서 가져온다.&lt;/p&gt;</description></item><item><title>메인 메모리(main memory)에 대해 알아보자</title><link>https://20h.dev/post/operation-system/main-memory/</link><pubDate>Tue, 28 Sep 2021 00:00:00 +0000</pubDate><guid>https://20h.dev/post/operation-system/main-memory/</guid><description>&lt;h1 id="main-memory"&gt;Main Memory&lt;/h1&gt;
&lt;p&gt;메모리에 프로세스를 할당할 때, 메모리를 관리하는 내용이라고 볼 수 있다.&lt;/p&gt;</description></item><item><title>회문(palindrome)에 대해 알아보자</title><link>https://20h.dev/post/algorithm/palindrome/</link><pubDate>Tue, 21 Sep 2021 22:17:22 +0900</pubDate><guid>https://20h.dev/post/algorithm/palindrome/</guid><description>&lt;h1 id="회문"&gt;회문&lt;/h1&gt;
&lt;p&gt;회문 &lt;a href="https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14QpAaAAwCFAYi&amp;amp;categoryId=AV14QpAaAAwCFAYi&amp;amp;categoryType=CODE"&gt;SWEA&lt;/a&gt; 회문2 &lt;a href="https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14Rq5aABUCFAYi&amp;amp;categoryId=AV14Rq5aABUCFAYi&amp;amp;categoryType=CODE"&gt;SWEA&lt;/a&gt;&lt;br&gt;
회문이란 앞으로 읽어도 뒤로 읽어도 같은 단어이다. 회문1 같은 경우에는 8x8 단어판와 길이가 주어지면 그 단어판에서 길이만큼의 회문 갯수를 세면 된다.&lt;/p&gt;</description></item><item><title>CPU Synchronization에 대해 알아보자</title><link>https://20h.dev/post/operation-system/cpu-synchronization/</link><pubDate>Tue, 21 Sep 2021 00:00:00 +0000</pubDate><guid>https://20h.dev/post/operation-system/cpu-synchronization/</guid><description>&lt;h1 id="cpu-synchronization"&gt;CPU Synchronization&lt;/h1&gt;
&lt;h2 id="race-condition"&gt;Race Condition&lt;/h2&gt;
&lt;p&gt;CPU 동기화하는데에 있어 &lt;strong&gt;Race Condition&lt;/strong&gt; 문제점이 있는데&lt;/p&gt;</description></item><item><title>자연수 분할에 대해 알아보자</title><link>https://20h.dev/post/algorithm/integer-partition/</link><pubDate>Thu, 02 Sep 2021 22:12:27 +0900</pubDate><guid>https://20h.dev/post/algorithm/integer-partition/</guid><description>&lt;h1 id="수분할"&gt;수분할&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;수분할&lt;/strong&gt;은 자연수 n을 순서에 상관 없이 하나 이상의 자연수의 합으로 나타내는 방법이다. 그 중 일반적인 방법으로는 n/m 수분할이다. 이 방법은 n을 m이하의 자연수로만 나타내는 방법이다.&lt;/p&gt;</description></item><item><title>이분탐색(binary search)에 대해 알아보자</title><link>https://20h.dev/post/algorithm/binary-search/</link><pubDate>Sun, 15 Aug 2021 22:17:02 +0900</pubDate><guid>https://20h.dev/post/algorithm/binary-search/</guid><description>&lt;h1 id="이분탐색"&gt;이분탐색&lt;/h1&gt;
&lt;p&gt;이분 탐색은 오름차순으로 정렬된 리스트에서 특정한 값의 위치를 찾는 알고리즘이다. 처음 중간의 값을 임의의 값으로 선택하여, 그 값과 찾고자 하는 값의 크고 작음을 비교하는 방식을 채택하고 있다. 처음 선택한 중앙값이 만약 찾는 값보다 크면 그 값은 새로운 최고값이 되며, 작으면 그 값은 새로운 최하값이 된다. 검색 원리상 정렬된 리스트에만 사용할 수 있다는 단점이 있지만, 검색이 반복될 때마다 목표값을 찾을 확률은 두 배가 되므로 속도가 빠르다는 장점이 있다. 이분 탐색은 분할 정복 알고리즘의 한 예이다.&lt;/p&gt;</description></item><item><title>기본적인 네트워크 보안에 대해 알아보자</title><link>https://20h.dev/post/network/network-security-protocols/</link><pubDate>Mon, 21 Sep 2020 00:00:00 +0000</pubDate><guid>https://20h.dev/post/network/network-security-protocols/</guid><description>&lt;h1 id="network-security-protocols"&gt;Network Security Protocols&lt;/h1&gt;
&lt;h2 id="네트워크-보안-개요"&gt;네트워크 보안 개요&lt;/h2&gt;
&lt;h3 id="인터넷-망구조가-안고-있는-보안-위협"&gt;인터넷 망구조가 안고 있는 보안 위협&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;인터넷 망은 여러 관리 주체가 분산 소유/관리 함&lt;/p&gt;</description></item><item><title>Multimedia에 대해 알아보자</title><link>https://20h.dev/post/network/multimedia/</link><pubDate>Fri, 18 Sep 2020 00:00:00 +0000</pubDate><guid>https://20h.dev/post/network/multimedia/</guid><description>&lt;h1 id="multimedia"&gt;Multimedia&lt;/h1&gt;
&lt;h3 id="기술"&gt;기술&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Video 데이터&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;640x480 (VGA) x RGB (3byte) x 30 fps x 3600s(1 hour) = 약 100GB
&lt;ul&gt;
&lt;li&gt;1990년 초 HDD 1MB 당 1만원 산정시 10억&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;고효율 압축은 선택이 아닌 필수&lt;/li&gt;
&lt;li&gt;B-ISDN 서비스의 경우 초기에 저해상도, 저프레임, CBR 영상 서비스 추진
&lt;ul&gt;
&lt;li&gt;90년대 Video-On-Demand(VOD) 서비스 추진 -&amp;gt; 사업접기 -&amp;gt; 2000년대 다시 추진
&lt;ul&gt;
&lt;li&gt;당시 video data는 HDD, 테이프 등에 저장 후 전송하는 연구&lt;/li&gt;
&lt;li&gt;당시의 인프라, 하드웨어 환경, 사회적 배경을 기준으로 당시 선택을 평가해야 하고, 미래에 대한 안목의 중요성을 알 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;90년대 이후 Video 데이터 압축 표준 진행&lt;/p&gt;</description></item><item><title>HTTP, WWW에 대해 알아보자</title><link>https://20h.dev/post/network/http-and-www/</link><pubDate>Sun, 13 Sep 2020 00:00:00 +0000</pubDate><guid>https://20h.dev/post/network/http-and-www/</guid><description>&lt;h1 id="http-and-www"&gt;HTTP and WWW&lt;/h1&gt;
&lt;h2 id="http"&gt;HTTP&lt;/h2&gt;
&lt;p&gt;HTTP는 TCP port 80번을 이용한다.&lt;/p&gt;
&lt;h3 id="http-transaction"&gt;HTTP Transaction&lt;/h3&gt;
&lt;p&gt;클라이언트가 서버에게 HTTP Request, 서버가 클라어인트에게 HTTP Response 보내는 동작을 Transaction이라고 한다.&lt;/p&gt;</description></item><item><title>SMTP와 FTP에 대해 알아보자</title><link>https://20h.dev/post/network/smtp-and-ftp/</link><pubDate>Wed, 09 Sep 2020 00:00:00 +0000</pubDate><guid>https://20h.dev/post/network/smtp-and-ftp/</guid><description>&lt;h1 id="smtp-and-ftp"&gt;SMTP and FTP&lt;/h1&gt;
&lt;p&gt;SMTP: Simple Mail Transfer Protocol&lt;br&gt;
FTP: File Transfer Protocol&lt;/p&gt;</description></item><item><title>DNS에 대해 알아보자</title><link>https://20h.dev/post/network/dns/</link><pubDate>Sat, 05 Sep 2020 00:00:00 +0000</pubDate><guid>https://20h.dev/post/network/dns/</guid><description>&lt;h1 id="domain-name-system"&gt;Domain Name System&lt;/h1&gt;
&lt;p&gt;DNS는 IP 주소 대신에 이름을 사용해서 IP주소를 매핑하는 시스템이다.&lt;/p&gt;</description></item><item><title>application layer에 대해 알아보자</title><link>https://20h.dev/post/network/application-layer/</link><pubDate>Wed, 02 Sep 2020 00:00:00 +0000</pubDate><guid>https://20h.dev/post/network/application-layer/</guid><description>&lt;h1 id="application-layer"&gt;Application Layer&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Client-server paradigm&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Addressing&lt;/li&gt;
&lt;li&gt;Different servcies&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="client-server-model-socket-interface"&gt;Client-Server Model: Socket Interface&lt;/h2&gt;
&lt;p&gt;Client와 Server가 Internet을 통해서 통신하는 방식을 의미한다. 대부분 여러 Client와 한 Server와 통신을 얘기한다. 가장 흔한 이러한 방식이 Web Server이다.&lt;/p&gt;</description></item><item><title>혼잡제어 (congestion control)에 대해 알아보자</title><link>https://20h.dev/post/network/congestion-control-and-quality-of-service/</link><pubDate>Tue, 25 Aug 2020 00:00:00 +0000</pubDate><guid>https://20h.dev/post/network/congestion-control-and-quality-of-service/</guid><description>&lt;h1 id="congestion-control-and-quality-of-service"&gt;Congestion Control and Quality of Service&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;혼잡제어는 라우터의 버퍼가 넘치는 경우를 제어해서 없도록 하는 것이다.&lt;/li&gt;
&lt;li&gt;QOS는 프로토콜 상에선 존재하지 않지만 라우터가 적용할려고 노력한다. 필요하기 때문이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="data-traffic"&gt;Data Traffic&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;네트워크 혼잡(Congestion)과 품질(QoS)은 사용자로부터 들어오는 데이터 트래픽 양을 조절하거나 서비스 양을 달리하는 것&lt;/li&gt;
&lt;li&gt;양을 조절하려면 얼마나 어떤 식으로 들어오는 지 정량화 필요&lt;/li&gt;
&lt;li&gt;가장 간단한 정량화 방법은 평균을 구하는 것이다.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Average data rate = amount of data / time&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;문제점 : 평균은 단위 시간에 들어오는 양이 일정할 때 유용하지만 실제 인터넷 트래픽은 그렇지 않다.&lt;/li&gt;
&lt;li&gt;인터넷 트래픽은 bursty하다고 할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://user-images.githubusercontent.com/59367782/97305648-bb3b6d00-18a0-11eb-8138-5a18dd263ae9.png" alt="image"&gt;&lt;/p&gt;</description></item><item><title>Transport layer에 대해 알아보자</title><link>https://20h.dev/post/network/transportlayer/</link><pubDate>Sat, 22 Aug 2020 00:00:00 +0000</pubDate><guid>https://20h.dev/post/network/transportlayer/</guid><description>&lt;h1 id="transport-layer"&gt;Transport Layer&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;process-to-process&lt;/strong&gt; 한 컴퓨터의 프로세스와 다른 컴퓨터의 프로세스의 통신을 생각하면 좋다.&lt;/p&gt;</description></item><item><title>unicast and multicast에 대해 알아보자</title><link>https://20h.dev/post/network/unicast-and-multicast/</link><pubDate>Fri, 21 Aug 2020 00:00:00 +0000</pubDate><guid>https://20h.dev/post/network/unicast-and-multicast/</guid><description>&lt;h1 id="unicast-and-multicast-routing"&gt;Unicast and Multicast Routing&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Unicasting : &lt;code&gt;1:1 방식&lt;/code&gt;, Class A,B,C&lt;/li&gt;
&lt;li&gt;Multicasting : &lt;code&gt;1:N 방식&lt;/code&gt;으로, Group 형성 방법이 문제가 된다. 모든 계층에서 구현 가능하다. 여기서 설명할 내용은 Network 계층에서의 multicasting 구현 방법. 최근의 multicasting은 응용계층에서 구현한 것이다. Class D&lt;/li&gt;
&lt;li&gt;Broadcasting : &lt;code&gt;1:All&lt;/code&gt; 방식&lt;/li&gt;
&lt;li&gt;Anycasting : &lt;code&gt;1:anyone of them&lt;/code&gt; 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://github.com/lee20h/blog/assets/59367782/6a5ad4b3-72f2-4b92-ba0b-4dd9c23e0ea8" alt="overlay_network"&gt;&lt;/p&gt;</description></item><item><title>네트워크 레이어 프로토콜 (network layer protocol)에 대해 알아보자</title><link>https://20h.dev/post/network/network-layer-protocol/</link><pubDate>Wed, 19 Aug 2020 00:00:00 +0000</pubDate><guid>https://20h.dev/post/network/network-layer-protocol/</guid><description>&lt;h1 id="network-layer-protocols-arp-ipv4-icmpv4-ipv6-and-icmpv6"&gt;Network Layer Protocols: ARP, IPv4, ICMPv4, IPv6 and ICMPv6&lt;/h1&gt;
&lt;p&gt;Network layer 프로토콜 : IGMP, ICMP, IP, ARP, RARP&lt;/p&gt;</description></item><item><title>네트워크 레이어 (network layer)에 대해 알아보자</title><link>https://20h.dev/post/network/network-layer/</link><pubDate>Sat, 15 Aug 2020 00:00:00 +0000</pubDate><guid>https://20h.dev/post/network/network-layer/</guid><description>&lt;h1 id="network-layer"&gt;Network Layer&lt;/h1&gt;
&lt;p&gt;&lt;img src="https://github.com/lee20h/blog/assets/59367782/292f0704-c847-4a74-b341-7fe1fad11c5d" alt="network_layer"&gt;&lt;/p&gt;
&lt;h1 id="host-to-host-delivery--internetworking-addressing-and-routing"&gt;Host-to-Host Delivery : Internetworking, Addressing and Routing&lt;/h1&gt;
&lt;h2 id="internetworks"&gt;Internetworks&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://github.com/lee20h/blog/assets/59367782/35a788ba-de4e-46d7-a5ea-44d9b12cb195" alt="Internetwork"&gt;&lt;/p&gt;</description></item><item><title>네트워크에 대해 알아보자</title><link>https://20h.dev/post/network/roadmap/</link><pubDate>Thu, 13 Aug 2020 00:00:00 +0000</pubDate><guid>https://20h.dev/post/network/roadmap/</guid><description>&lt;h2 id="인터넷이란-무엇인가"&gt;인터넷이란 무엇인가?&lt;/h2&gt;
&lt;p&gt;Computing devices : hosts, end-system(PC, Workstation, server). 네트워크 앱이 실행된다.&lt;/p&gt;</description></item><item><title>쓰레드(thread)에 대해 알아보자</title><link>https://20h.dev/post/linux/thread/</link><pubDate>Thu, 30 Apr 2020 00:00:00 +0000</pubDate><guid>https://20h.dev/post/linux/thread/</guid><description>&lt;h1 id="thread"&gt;Thread&lt;/h1&gt;
&lt;h2 id="parallel-programming"&gt;Parallel Programming&lt;/h2&gt;
&lt;h3 id="병렬-프로그래밍"&gt;병렬 프로그래밍&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;공동의 목적을 달성하기 위해, 다수의 실행 주체가 동시에 작업을 수행하는 방식
&lt;ul&gt;
&lt;li&gt;실행 주체: Process or Thread&lt;/li&gt;
&lt;li&gt;사실 컴퓨터 시스템에서 프로그램을 실행하는 주체는 CPU (or Core)!!&lt;/li&gt;
&lt;li&gt;프로세스나 쓰레드는 여러 프로그램이 CPU를 공유해서 사용하기 위한 추상적 단위&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;병렬 프로그래밍의 필요성
&lt;ul&gt;
&lt;li&gt;최근 컴퓨터 시스템은 대부분 다수의 CPU 를 탑재하고 있으며,&lt;/li&gt;
&lt;li&gt;여러 CPU를 최대한 활용하여 성능을 높이기 위해서는 병렬 프로그래밍이 필수&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="소켓-프로그래밍에서는"&gt;소켓 프로그래밍에서는?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;일반적으로 서버는 여러 클라이언트에 대해 동시에 서비스를 제공함
&lt;ul&gt;
&lt;li&gt;예) 포털에 여러 사람이 동시에 접근하여 각자 서로 다른 서비스를 이용함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;반복 서버
&lt;ul&gt;
&lt;li&gt;하나의 프로세스가 동작하며 모든 클라이언트의 요청을 순서대로 처리&lt;/li&gt;
&lt;li&gt;클라이언트는 연결 수립을 위해 이전 클라이언트의 요청이 모두 처리될 때까지 대기하여야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;동시 동작 서버 (Parallel or Concurrently running or Multi-user Server)
&lt;ul&gt;
&lt;li&gt;여러 요청을 동시에 처리해 서비스할 수 있는 서버&lt;/li&gt;
&lt;li&gt;서버를 병렬로 동작하도록 구성&lt;/li&gt;
&lt;li&gt;일반적인 서버 역할 분담
&lt;ul&gt;
&lt;li&gt;Door-keeper process: 문지기 역할. 접속을 대기하다, 요청이 오면 연결을 수립함. 그리고 수립된 각각의 연결에 대해 서비스 프로세스를 할당함. 이를 반복함.&lt;/li&gt;
&lt;li&gt;Service thread: 각 연결에 대해 1:1로 실제 서비스를 제공하는 쓰레드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="반복-서버의-예"&gt;반복 서버의 예&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;지난 소켓에서의 서버-클라이언트 예제 동작 방식
&lt;ul&gt;
&lt;li&gt;Server: listen()→ accept() → send() → recv() → close()&lt;/li&gt;
&lt;li&gt;Client: connect() → recv() → send() → close()&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;서버 프로세스 수정: 반복 처리 서버
&lt;ul&gt;
&lt;li&gt;하나의 클라이언트 처리가 종료된 후, 다시 accept()로 돌아와서 대기&lt;/li&gt;
&lt;li&gt;위 동작을 3번 반복하여, 3개의 클라이언트 요청을 처리하게 함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;만약 클라이언트가 send()를 하지 않는다면?
&lt;ul&gt;
&lt;li&gt;서버 프로세스는 recv() 에서 무한 대기하며, 해당 클라이언트로부터 패킷이 전송되길 기다릴 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;그때 만약 다른 클라이언트가 동시에 접속을 요청한다면?
&lt;ul&gt;
&lt;li&gt;서버가 accept()를 대기하고 있기 않기 때문에, 접속 처리를 할 수 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="process-based-parallel-socket-programming"&gt;Process-based Parallel Socket Programming&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;프로세스 기반 동시 동작 서버
&lt;ul&gt;
&lt;li&gt;Door-keeper process
&lt;ul&gt;
&lt;li&gt;기존 서버 코드와 같이 서버 소켓을 열고 bind(), listen() 수행&lt;/li&gt;
&lt;li&gt;새로운 연결이 수립되면, child process를 만들어, 아래 service 동작을 수행하게 함&lt;/li&gt;
&lt;li&gt;서버는 fork() 이후, 즉각 다시 accept()에서 대기. 이를 3회 반복함&lt;/li&gt;
&lt;li&gt;종료 전, 생성된 child 개수만큼 wait()를 수행하여 모든 종료 상태값을 출력 후, 종료&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Service process
&lt;ul&gt;
&lt;li&gt;기존과 같이 send(), recv() 수행하고, 소켓을 닫고, 종료&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="thread-1"&gt;Thread&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;두 가지 종류의 실행 주체(execution unit or entity)&lt;/p&gt;</description></item><item><title>IPC에 대해 알아보자</title><link>https://20h.dev/post/linux/ipc/</link><pubDate>Sat, 25 Apr 2020 00:00:00 +0000</pubDate><guid>https://20h.dev/post/linux/ipc/</guid><description>&lt;h1 id="ipc-signal-and-shared-memory"&gt;IPC: Signal and Shared Memory&lt;/h1&gt;
&lt;h2 id="ipc-inter-process-communication"&gt;IPC: Inter-process communication&lt;/h2&gt;
&lt;h3 id="ipc의-필요성"&gt;IPC의 필요성&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Many processes are co-operating
&lt;ul&gt;
&lt;li&gt;서로 협업하는 프로세스: 한 가지 목적을 위해 여러 프로세스가 함께 동작
&lt;ul&gt;
&lt;li&gt;큰 프로그램의 모듈화, 병렬 작업을 통한 성능 향상, 사용자 편의성 향상 등&lt;/li&gt;
&lt;li&gt;예) Game: video and audio processing, background data loading, chatting, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이를 위해서는 상호 간의 정보 교환이 필수&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;그러나 프로세스들은 가상 메모리 공간 (Virtual Memory Space) 에 갇혀 있음
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;각 프로세스는 자기 자신만의 독립되고, 고립된 (isolated) 메모리 공간을 가짐&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;프로세스들은 서로 다른 프로세스의 space 를 침범할 수 없음! 존재조차 모름.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;함께 일을 해야 하는데, 그럼 어떻게 정보를 주고 받지? → &lt;strong&gt;IPC&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ipc-inter-process-communication-1"&gt;IPC: Inter-Process Communication&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;IPC: 프로세스 간 통신
&lt;ul&gt;
&lt;li&gt;모든 프로세스들의 공간에 접근할 수 있는 OS의 도움을 받아, 프로세스들 간에 서로 정보를 교환하는 것&lt;/li&gt;
&lt;li&gt;예) Message queue, shared memory, signal, pipe, socket 등&lt;/li&gt;
&lt;li&gt;(더 쉬운 예. CTRL+C, V)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;어떤 medium 을 어떤 방식으로 사용해서 정보를 전달하느냐에 따라 서로 다른 통신 특성을 갖게 됨
&lt;ul&gt;
&lt;li&gt;커널 및 유저 메모리 공간, 네트워크 등이 medium 이 될 수 있음&lt;/li&gt;
&lt;li&gt;예) Signal: 커널 메모리 공간을 통해 아주 단순한 정보만 단방향으로 전달&lt;/li&gt;
&lt;li&gt;예) Shared memory: 유저 메모리 공간을 통해 양방향으로 정보 전달 가능
&lt;ul&gt;
&lt;li&gt;그러나 양쪽이 동시에 데이터를 수정할 수 있기 때문에 동기화 문제 발생 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;예) Socket: 네트워크를 통해 원격 시스템에서 동작하는 프로세스와 통신 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;협업 방식 및 상황에 따라 적절한 IPC 를 선택할 수 있어야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="signal"&gt;Signal&lt;/h2&gt;
&lt;h3 id="시그널의-개념"&gt;시그널의 개념&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;시그널
&lt;ul&gt;
&lt;li&gt;프로세스에 무슨 일이 발생했음을 알리는 간단한 메시지를 &lt;strong&gt;비동기적&lt;/strong&gt;으로 보내는 것&lt;/li&gt;
&lt;li&gt;예) 메모: “전화왔음” (누구한테?? 거기까진 알 수 없음. 메모 종류도 한정적)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;발생사유
&lt;ul&gt;
&lt;li&gt;0으로 나누기처럼 프로그램에서 예외적인 상황이 일어나는 경우&lt;/li&gt;
&lt;li&gt;Kill(2) 처럼 시그널을 보내는 시스템콜을 호출해 다른 프로세스에 시그널을 보내는 경우&lt;/li&gt;
&lt;li&gt;사용자가 CTRL+C 와 같이 키를 입력해 인터럽트를 발생시킨 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;시그널 처리방법
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;각 시그널에 지정된 기본 동작 수행. 대부분의 기본 동작은 프로세스 종료&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;무시: 발생한 시그널을 무시하고 진행&lt;/li&gt;
&lt;li&gt;핸들러 호출: 특정 시그널 처리를 위한 함수(핸들러)를 지정해두고, 시그널을 받으면 해당 함수를 호출&lt;/li&gt;
&lt;li&gt;블록: 발생한 시그널을 처리하지 않고 그대로 둠. 블록을 해제하면 그때 전달되어 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="시그널-종류"&gt;시그널 종류&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://user-images.githubusercontent.com/59367782/100050890-d082c780-2e5d-11eb-8d97-38549679d545.png" alt="image"&gt;&lt;/p&gt;</description></item><item><title>프로세스 관리(process management)에 대해 알아보자</title><link>https://20h.dev/post/linux/process-management/</link><pubDate>Sun, 19 Apr 2020 00:00:00 +0000</pubDate><guid>https://20h.dev/post/linux/process-management/</guid><description>&lt;h1 id="process-management"&gt;Process Management&lt;/h1&gt;
&lt;h2 id="process-creation"&gt;Process Creation&lt;/h2&gt;
&lt;h3 id="프로세스-생성-fork2"&gt;프로세스 생성: fork(2)&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/types.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&lt;/span&gt;&lt;span class="kt"&gt;pid_t&lt;/span&gt; &lt;span class="nf"&gt;fork&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;프로세스 생성: fork(2)
&lt;ul&gt;
&lt;li&gt;새로운 프로세스를 생성 : 자식 프로세스&lt;/li&gt;
&lt;li&gt;fork 함수를 호출한 프로세스 : 부모 프로세스&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;자식 프로세스는 부모 프로세스의 메모리 주소 공간을 그대로 복사&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;메모리 공간이 똑같이 복제됨에 따라, 아래 자원들도 그대로 복사됨&lt;/li&gt;
&lt;li&gt;RUID, EUID, RGID, EGID, 환경변수&lt;/li&gt;
&lt;li&gt;열린 파일기술자, 시그널 처리, setuid, setgid&lt;/li&gt;
&lt;li&gt;현재 작업 디렉토리, umask, 사용가능자원 제한&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;부모 프로세스와 다른 점
&lt;ul&gt;
&lt;li&gt;자식 프로세스는 유일한 PID를 갖는다&lt;/li&gt;
&lt;li&gt;자식 프로세스는 유일한 PPID를 갖는다. (Parent PID)&lt;/li&gt;
&lt;li&gt;프로세스 잠금, 파일 잠금, 기타 메모리 잠금은 상속 안함&lt;/li&gt;
&lt;li&gt;자식 프로세스의 tms구조체 값은 0으로 설정 (수행 시간 관련 구조체)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;부모 프로세스와 자식 프로세스는 열린 파일을 공유하므로 읽거나 쓸 때 주의해야 한다. (동기화 문제 발생 가능)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://user-images.githubusercontent.com/59367782/99810371-fa4e9c80-2b86-11eb-8008-80352f9001b7.png" alt="image"&gt;&lt;/p&gt;</description></item><item><title>동적할당(dynamic memory allocation)에 대해 알아보자</title><link>https://20h.dev/post/linux/dynamic-memory-allocation/</link><pubDate>Wed, 15 Apr 2020 00:00:00 +0000</pubDate><guid>https://20h.dev/post/linux/dynamic-memory-allocation/</guid><description>&lt;h1 id="dynamic-memory-allocation"&gt;Dynamic Memory Allocation&lt;/h1&gt;
&lt;h2 id="memory-allocation"&gt;Memory Allocation&lt;/h2&gt;
&lt;h3 id="volatile-and-non-volatile-storage-devices"&gt;Volatile and Non-volatile storage devices&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Primary storage: Main memory&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;주기억장치로 사용하는 DRAM 등의 휘발성 저장 장치&lt;/li&gt;
&lt;li&gt;성능이 높지만, 적은 저장 공간 제공
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;프로그램 내의 변수와 같이 용량은 적지만 자주 접근하는 자료를 저장&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Secondary storage: Storage devices
&lt;ul&gt;
&lt;li&gt;보조기억장치로 사용하는 HDD, SSD 등은 비휘발성 저장 장치&lt;/li&gt;
&lt;li&gt;느리지만, 많은 저장 공간을 제공
&lt;ul&gt;
&lt;li&gt;시스템 종료 시에도 보관하여야 할 데이터를 적재하고, 시스템 재기동 시 다시 로드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;일반적으로 파일(file)의 형태로 데이터를 저장함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="memory"&gt;Memory&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;메모리는 한정된 자원 (예. 8GB, 16GB)
&lt;ul&gt;
&lt;li&gt;OS와 여러 프로세스가 동시에 물리 메모리 공간을 공유하며 실행됨&lt;/li&gt;
&lt;li&gt;OS는 자기 자신과 여러 프로세스에 대해 최대한 효율적으로 메모리를 할당하고자 함
&lt;ul&gt;
&lt;li&gt;이를 위해 OS는 가상 메모리 관리 기법을 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;가상 메모리 공간 (Virtual Memory Space)
&lt;ul&gt;
&lt;li&gt;각 프로세스는 자기 자신만의 독립되고, 고립된 (isolated) 메모리 공간을 가짐
&lt;ul&gt;
&lt;li&gt;프로세스들은 서로 다른 사람의 space 를 건드릴 수 없음!&lt;/li&gt;
&lt;li&gt;공간의 크기는? 일반적으로 32 비트 주소 공간 (각 주소 마다 1B 저장: total 4GB = 2^32)
&lt;ul&gt;
&lt;li&gt;64비트 프로세스의 경우, 48비트 혹은 56 비트만 사용 (256 TB = 2^48 or 64 PB = 2^56)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="memory-allocation-1"&gt;Memory Allocation&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;OS의 메모리 관리&lt;/p&gt;</description></item><item><title>file high-level I/O에 대해 알아보자</title><link>https://20h.dev/post/linux/file2/</link><pubDate>Sat, 04 Apr 2020 00:00:00 +0000</pubDate><guid>https://20h.dev/post/linux/file2/</guid><description>&lt;h1 id="file-high-level-io"&gt;File: High-level I/O&lt;/h1&gt;
&lt;h2 id="io-stream"&gt;I/O Stream&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Stream: 물줄기, 개울, 시내&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I/O stream: 데이터가 흘러가는 것. 데이터의 이동을 표현하는 말
&lt;ul&gt;
&lt;li&gt;예) Media streaming&lt;/li&gt;
&lt;li&gt;Source 에서 Destination 으로 데이터가 이동함&lt;/li&gt;
&lt;li&gt;프로그램은 데이터가 이동하는 통로로, source 이자 destination 일 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Input stream: Source로부터 데이터가 들어오는 경로&lt;/p&gt;</description></item><item><title>file low-level I/O에 대해 알아보자</title><link>https://20h.dev/post/linux/file/</link><pubDate>Fri, 03 Apr 2020 00:00:00 +0000</pubDate><guid>https://20h.dev/post/linux/file/</guid><description>&lt;h1 id="file-low-level-io"&gt;File: Low-level I/O&lt;/h1&gt;
&lt;h2 id="file"&gt;File&lt;/h2&gt;
&lt;h3 id="volatile-and-non-volatile-storage-devices"&gt;Volatile and Non-volatile storage devices&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Primary storage: Main memory
&lt;ul&gt;
&lt;li&gt;주기억장치로 사용하는 DRAM 등의 휘발성 저장 장치&lt;/li&gt;
&lt;li&gt;성능이 높지만, 적은 저장 공간 제공
&lt;ul&gt;
&lt;li&gt;프로그램 내의 변수와 같이 용량은 적지만 자주 접근하는 자료를 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Secondary storage: Storage devices
&lt;ul&gt;
&lt;li&gt;보조기억장치로 사용하는 HDD, SSD 등은 비휘발성 저장 장치&lt;/li&gt;
&lt;li&gt;느리지만, 많은 저장 공간을 제공
&lt;ul&gt;
&lt;li&gt;시스템 종료 시에도 보관하여야 할 데이터를 적재하고, 시스템 재기동 시 다시 로드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;일반적으로 파일(file)의 형태로 데이터를 저장함&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="파일과-파일-속성"&gt;파일과 파일 속성&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;파일: 보조기억장치의 정보저장 단위로 자료의 집합
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Collection of data&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;0부터 시작하는 주소 공간에 1B 단위로 데이터를 저장하고, 접근할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;파일의 속성 (attribute)
&lt;ul&gt;
&lt;li&gt;파일은 Data 와 Metadata 로 구성됨
&lt;ul&gt;
&lt;li&gt;Data: 사용자가 저장하고자 하는 데이터&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Metadata: 데이터의 속성이나 특징 등, 저장된 데이터를 설명하기 위한 추가적인 데이터&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Metadata 를 주로 file attribute 라고 지칭함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;대표적인 Metadata
&lt;ul&gt;
&lt;li&gt;Name, Size, Creation time, Last modified time, Last access time, access control&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;추가적인 Metadata
&lt;ul&gt;
&lt;li&gt;사진: 찍은 날짜, 위치, 포함된 사람들 등등&lt;/li&gt;
&lt;li&gt;영화: Runtime, 제목, 첫 상영 날짜, 출연 배우 등등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;보다 다양한 정보가 요구됨에 따라 파일의 metadata 저장 방식도 발전하고 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="file-operations"&gt;File Operations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;파일에 대해 수행할 수 있는, OS가 제공하는 기본 동작
&lt;ul&gt;
&lt;li&gt;Basic: &lt;strong&gt;open, close, read, write&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;파일을 사용하기 위해서는 우선 열어야 하고, (open)&lt;/li&gt;
&lt;li&gt;사용을 완료한 후에는 닫아야 한다. (close)&lt;/li&gt;
&lt;li&gt;이외의 데이터 접근 방법은 없음!
&lt;ul&gt;
&lt;li&gt;Insert? Modification?&lt;/li&gt;
&lt;li&gt;모두 Read and Write 로 구현하여야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Control
&lt;ul&gt;
&lt;li&gt;Seek: 파일의 현재 위치 설정&lt;/li&gt;
&lt;li&gt;Truncate: 파일의 내용 삭제&lt;/li&gt;
&lt;li&gt;Delete (or remove, unlink, release): 파일 삭제&lt;/li&gt;
&lt;li&gt;Flush (or sync): 파일의 내용을 즉각 저장 장치에 기록&lt;/li&gt;
&lt;li&gt;기타: mmap, poll, lock 등 공유 및 동기화를 위한 제어 방법들&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="low---high-level-file-io-input-and-output"&gt;Low- &amp;amp; High-level File I/O (Input and Output)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Low-level File I/O
&lt;ul&gt;
&lt;li&gt;파일을 다루기 위해 OS에서 제공하는 시스템콜들을 직접 사용&lt;/li&gt;
&lt;li&gt;특수한 파일 (장치 파일 등)을 제어할 때 주로 사용함&lt;/li&gt;
&lt;li&gt;Open(), close(), read(), write(), lseek() 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;High-level File I/O
&lt;ul&gt;
&lt;li&gt;C 라이브러리 등에서 제공하는 보다 편리한 파일 입출력 서비스&lt;/li&gt;
&lt;li&gt;Low-level file I/O 는 시스템콜 그 자체라면,&lt;/li&gt;
&lt;li&gt;High-level 은 시스템콜을 다양한 형태로 가공하여 편의성을 높인 것&lt;/li&gt;
&lt;li&gt;예) fprintf() : 파일에 바로 원하는 형태의 문자열을 출력할 수 있음
&lt;ul&gt;
&lt;li&gt;Low-level 에서는 우선 문자열을 원하는 형태로 가공한 후, write()를 사용해 문자열의 길이 등을 함께 전달하여 기록해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;fopen(), fclose() 등, 이름이 유사하나 앞에 &lt;code&gt;f&lt;/code&gt; 가 붙는 경우가 많음&lt;/li&gt;
&lt;li&gt;라이브러리 내에서 성능 등의 이유로 버퍼를 이용하므로, 버퍼 기반 입출력 이라고 부르기도 함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="low-level-file-io"&gt;Low-level File I/O&lt;/h2&gt;
&lt;h3 id="파일-기술자"&gt;파일 기술자&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;파일 기술자
&lt;ul&gt;
&lt;li&gt;현재 프로세스를 통해 열려 있는 파일을 구분하는 정수값.
&lt;ul&gt;
&lt;li&gt;OS가 해당 프로세스의 열린 파일들을 관리하기 위해 사용하는 테이블의 Index&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;저수준 파일 입출력에서 열린 파일을 참조하는데 사용&lt;/li&gt;
&lt;li&gt;기본으로 지정된 파일 기술자들
&lt;ul&gt;
&lt;li&gt;0번 : 표준 입력, 1번 : 표준 출력, 2번 : 표준 오류&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://user-images.githubusercontent.com/59367782/96454638-1b099680-1257-11eb-940d-b4b760dd64c0.png" alt="image"&gt;&lt;/p&gt;</description></item><item><title>system call에 대해 알아보자</title><link>https://20h.dev/post/linux/system-call/</link><pubDate>Fri, 27 Mar 2020 00:00:00 +0000</pubDate><guid>https://20h.dev/post/linux/system-call/</guid><description>&lt;h1 id="system-call"&gt;System Call&lt;/h1&gt;
&lt;h2 id="시스템-프로그래밍"&gt;시스템 프로그래밍&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;System Call: OS가 제공하는 기능들을 사용하는 것
&lt;ul&gt;
&lt;li&gt;하드웨어를 제어하거나,&lt;/li&gt;
&lt;li&gt;다른 프로세스와의 통신을 수행하거나,&lt;/li&gt;
&lt;li&gt;시스템 정보에 접근, 수정하거나,&lt;/li&gt;
&lt;li&gt;시스템을 제어하는 기능 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;대표적인 시스템 콜
&lt;ul&gt;
&lt;li&gt;화면 출력: printf() &amp;lt;- C 라이브러리. 내부에서 write() system call 사용&lt;/li&gt;
&lt;li&gt;파일 제어: open(), close(), read(), write()&lt;/li&gt;
&lt;li&gt;동적 메모리 할당: malloc() &amp;lt;- C 라이브러리. 내부에서 brk(), mmap() 사용&lt;/li&gt;
&lt;li&gt;네트워크 통신: socket(), send(), receive()&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="system-call-vs-library-function"&gt;System Call vs. Library function&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;시스템 호출
&lt;ul&gt;
&lt;li&gt;OS Kernel이 제공하는 서비스를 이용해 프로그램을 작성할 수 있도록 제공되는 프로그래밍 인터페이스&lt;/li&gt;
&lt;li&gt;기본적인 형태는 C 언어의 함수 형태로 제공
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;리턴값 = 시스템호출명(인자, …);&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;C Library 가 이러한 형태로 편리하게 이용할 수 있게 제공해주는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;라이브러리 함수
&lt;ul&gt;
&lt;li&gt;라이브러리 : 미리 컴파일된 함수들을 묶어서 제공하는 특수한 형태의 파일
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/lib&lt;/code&gt;, &lt;code&gt;/usr/lib&lt;/code&gt;에 위치하며 &lt;code&gt;lib*.a&lt;/code&gt; 또는 &lt;code&gt;lib*.so&lt;/code&gt; (static object) 형태로 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;자주 사용하는 기능을 독립적으로 분리하여 구현해둠으로써 프로그램의 개발과 디버깅을 쉽게하고 컴파일을 좀 더 빠르게 할 수 있다&lt;/li&gt;
&lt;li&gt;OS 커널과 무관하게 단순한 C 코드를 수행
&lt;ul&gt;
&lt;li&gt;예) strcpy() : 문자열 복사를 위한 연산을 수행. 편의를 위한 라이브러리 함수&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;두 가지 시스템 콜 호출 방법
&lt;ul&gt;
&lt;li&gt;직접 시스템콜 호출: 본래 시스템콜은 특수한 방식(trap)을 통해 호출하여야 함
&lt;ul&gt;
&lt;li&gt;이유1: 시스템콜의 코드가 일반 사용자가 접근할 수 없는 OS 커널 영역에 존재하기 때문&lt;/li&gt;
&lt;li&gt;이유2: 시스템콜은 다수 존재하고, 번호로 구분하기 때문에 직관적이지 않음&lt;/li&gt;
&lt;li&gt;굳이 하려면? : syscall() 함수 이용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;라이브러리 함수 사용&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;C 라이브러리는 시스템콜을 간편히 사용할 수 있게 도와주는 여러 함수 제공&lt;/li&gt;
&lt;li&gt;예) printf() : 화면 출력을 위해서는 본래 write() 시스템 콜을 사용해야 함&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;일반적으로 거의 모든 경우에 라이브러리 함수를 통해 시스템콜을 이용함&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://user-images.githubusercontent.com/59367782/96449848-666c7680-1250-11eb-9968-46781fa0c72e.png" alt="image"&gt;&lt;/p&gt;</description></item><item><title>리눅스 내에서 C 프로그래밍에 대해 알아보자</title><link>https://20h.dev/post/linux/c-programming-on-linux/</link><pubDate>Sat, 21 Mar 2020 00:00:00 +0000</pubDate><guid>https://20h.dev/post/linux/c-programming-on-linux/</guid><description>&lt;h1 id="c-programming-on-linux"&gt;C Programming on Linux&lt;/h1&gt;
&lt;h2 id="vi"&gt;Vi&lt;/h2&gt;
&lt;h3 id="라인-복사-및-삭제"&gt;라인 복사 및 삭제&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;모든 명령어는 insert mode 에서 esc 키를 눌러 일반 모드로 나온 후, 수행&lt;/li&gt;
&lt;li&gt;라인 복사 명령 : yy
&lt;ul&gt;
&lt;li&gt;앞에 숫자를 입력하면, 현재 커서가 위치한 라인을 포함한
아래의 다수 라인을 한번에 “레지스터”로 복사함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;라인 삭제 명령 : dd
&lt;ul&gt;
&lt;li&gt;앞에 숫자를 입력하면, 현재 커서가 위치한 라인을 포함한
아래의 다수 라인을 한번에 “레지스터” 로 복사하고, 제거함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;레지스터의 붙여넣기 : p
&lt;ul&gt;
&lt;li&gt;현재 커서가 있는 곳에서부터 레지스터의 내용을 삽입함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;VI Register
&lt;ul&gt;
&lt;li&gt;VI에서 복사한 내용이 임시로 보관되는 공간.&lt;/li&gt;
&lt;li&gt;VI 프로그램 간에 공유됨.
&lt;ul&gt;
&lt;li&gt;따라서 VI가 종료되어도, 다시 VI를 수행하면 레지스터의 내용을 이용할 수 있음&lt;/li&gt;
&lt;li&gt;이 기능은 한 파일의 내용을 복사해서 다른 파일에 붙여넣을 때 유용함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="라인-이동-및-관련-명령"&gt;라인 이동 및 관련 명령&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;라인 이동
&lt;ul&gt;
&lt;li&gt;사용법 1: “:” 입력 후, 이동할 라인 숫자 입력&lt;/li&gt;
&lt;li&gt;사용법 2: 라인 숫자를 입력하고 Shift + g&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;관련 명령
&lt;ul&gt;
&lt;li&gt;라인의 맨 앞으로 이동하기: 0 (숫자 영)&lt;/li&gt;
&lt;li&gt;맨 위로 이동하기: gg&lt;/li&gt;
&lt;li&gt;맨 밑으로 이동하기: “:$” or “(입력없이) shift + g”&lt;/li&gt;
&lt;li&gt;줄 번호 표시 하기 : “: set number”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="문자열-찾기--바꾸기"&gt;문자열 찾기 / 바꾸기&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;문자열 찾기
&lt;ul&gt;
&lt;li&gt;“/”를 입력하고 찾을 문자열 입력&lt;/li&gt;
&lt;li&gt;Enter 입력 후, 다음 단어, 이전 단어 검색
&lt;ul&gt;
&lt;li&gt;소문자 n: 다음 단어&lt;/li&gt;
&lt;li&gt;대문자 N: 이전 단어&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이전에 찾아본 문자열 불러오기
&lt;ul&gt;
&lt;li&gt;“/”를 입력한 상태에서 위 아래 화살표 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;문자열 바꾸기
&lt;ul&gt;
&lt;li&gt;:[범위]s/찾을문자열/바꿀문자열/[option]&lt;/li&gt;
&lt;li&gt;범위: comma 를 이용해 범위 표현. % 는 전체 영역
&lt;ul&gt;
&lt;li&gt;예) 1,10: 첫 번째부터 10번째 라인 내에서 수행.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;찾을 문자열에는 정규 표현식 사용 가능 (regular expression 으로 검색)&lt;/li&gt;
&lt;li&gt;Options
&lt;ul&gt;
&lt;li&gt;g: 범위 내에서 바꾸기 수행&lt;/li&gt;
&lt;li&gt;c: 한 항목씩 물어보면서 수행&lt;/li&gt;
&lt;li&gt;i: 대소문자 무시&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;예) :%s/Protocol/protocol/gc&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="기타"&gt;기타&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Undo/Redo (취소하기, 되돌리기)
&lt;ul&gt;
&lt;li&gt;u: undo&lt;/li&gt;
&lt;li&gt;^r: Redo (CTRL + r)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;세로 및 가로 블록 선택, 편집
&lt;ul&gt;
&lt;li&gt;^v: Visual block mode (CTRL + v)&lt;/li&gt;
&lt;li&gt;모드 진입 후, 화살표로 선택 후, 편집 명령&lt;/li&gt;
&lt;li&gt;예) 여러 라인에 있는 주석을 한번에 제거
&lt;ul&gt;
&lt;li&gt;세로 모드로 여러 주석 문자를 선택 후 delete&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;예) 여러 라인에 주석 한번에 넣기
&lt;ul&gt;
&lt;li&gt;세로 모드로 영역 선택 후, shift + i 로 입력 모드 진입&lt;/li&gt;
&lt;li&gt;텍스트 입력 후, esc 를 두 번 누름&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Read-only 파일의 저장
&lt;ul&gt;
&lt;li&gt;:w 혹은 :wq 뒤에 ! 를 붙임 (force)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;외부 텍스트 붙여넣기 모드
&lt;ul&gt;
&lt;li&gt;:set paste&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="nano"&gt;nano&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;nano - Nano&amp;rsquo;s ANOther editor, inspired by Pico
&lt;ul&gt;
&lt;li&gt;전통적으로 메일 클라이언트에서 사용하던 Pico 라는 편집기를 기반으로,&lt;/li&gt;
&lt;li&gt;Vi와 같이 여러 리눅스 배포판에서 기본 프로그램으로 사용함&lt;/li&gt;
&lt;li&gt;Vi와 비교: “사용하기 쉽다.”
&lt;ul&gt;
&lt;li&gt;대부분 단축키가 아래에 나열되어 있어 모르는 기능도 빠르게 활용할 수 있다.&lt;/li&gt;
&lt;li&gt;“검색하여 교체하기” (replace) 기능이 보다 편리하게 사용 가능 하다.&lt;/li&gt;
&lt;li&gt;자동 들여쓰기 기능이 더 편리하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Comments
&lt;ul&gt;
&lt;li&gt;Vi, nano 모두 기본 에디터이므로 간단한 사용 방법은 익혀두는 것이 좋다.&lt;/li&gt;
&lt;li&gt;Vi, nano 모두 간단한 편집 기능은 큰 차이 없으므로, 익숙한 도구를 쓰면 된다.&lt;/li&gt;
&lt;li&gt;초심자가 처음 배운다면?
&lt;ul&gt;
&lt;li&gt;Nano: 접근성이 높다&lt;/li&gt;
&lt;li&gt;Vi: 처음 배울 때 어려울 수 있지만, 보다 다양하고 강력한 기능들을 제공한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;(!) 결국 다양하고 많은 편집을 필요로 할 때는 윈도우 환경이 훨씬 편리함.
&lt;ul&gt;
&lt;li&gt;실제 파일은 리눅스에, 편집은 윈도우(or Mac)에서 수행하는 환경을 구축하는 것이 일반적&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="gcc-gnu-compiler-collection"&gt;GCC: GNU Compiler Collection&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;GNU&lt;/p&gt;</description></item><item><title>linux 유틸리티에 대해 알아보자</title><link>https://20h.dev/post/linux/utility/</link><pubDate>Sun, 15 Mar 2020 00:00:00 +0000</pubDate><guid>https://20h.dev/post/linux/utility/</guid><description>&lt;h1 id="유틸리티"&gt;유틸리티&lt;/h1&gt;
&lt;h2 id="찾기"&gt;찾기&lt;/h2&gt;
&lt;h3 id="find"&gt;find&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;find 디렉토리 [-옵션]&lt;/code&gt; : 옵션의 검색 조건에 따라 지정된 디렉터리 아래에서 해당되는 파일들을 모두 찾아 출력한다.&lt;/p&gt;</description></item><item><title>process와 redirection에 대해 알아보자</title><link>https://20h.dev/post/linux/process-and-redirection/</link><pubDate>Wed, 11 Mar 2020 00:00:00 +0000</pubDate><guid>https://20h.dev/post/linux/process-and-redirection/</guid><description>&lt;h1 id="process-and-redirection"&gt;Process and Redirection&lt;/h1&gt;
&lt;h2 id="process"&gt;Process&lt;/h2&gt;
&lt;p&gt;프로세스는 실행중인 프로그램이며, 각 프로세스는 유일한 프로세스 번호 PID를 갖게 된다. 또, 각 프로세스는 부모 프로세스에 의해 생성된다.&lt;/p&gt;</description></item><item><title>linux permission에 대해 알아보자</title><link>https://20h.dev/post/linux/permission/</link><pubDate>Fri, 06 Mar 2020 00:00:00 +0000</pubDate><guid>https://20h.dev/post/linux/permission/</guid><description>&lt;h1 id="관리-권한-및-접근-권한"&gt;관리 권한 및 접근 권한&lt;/h1&gt;
&lt;h2 id="시스템-관리자"&gt;시스템 관리자&lt;/h2&gt;
&lt;h3 id="시스템-관리자의-역할"&gt;시스템 관리자의 역할&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;사용자, 그룹 등록 및 삭제&lt;/li&gt;
&lt;li&gt;소프트웨어 설치, 업그레이드, 삭제&lt;/li&gt;
&lt;li&gt;하드웨어 추가 설치&lt;/li&gt;
&lt;li&gt;시스템 보안&lt;/li&gt;
&lt;li&gt;데이터 백업&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Windows의 관리자 계정 : Administrator&lt;br&gt;
Unix의 관리자 계정 : Super user&lt;br&gt;
다른 말로 Privileged user or account &amp;lt;-&amp;gt; non-privieged&lt;/p&gt;</description></item><item><title>linux directory에 대해 알아보자</title><link>https://20h.dev/post/linux/directory/</link><pubDate>Mon, 02 Mar 2020 00:00:00 +0000</pubDate><guid>https://20h.dev/post/linux/directory/</guid><description>&lt;h1 id="디렉토리와-파일"&gt;디렉토리와 파일&lt;/h1&gt;
&lt;h2 id="디렉토리"&gt;디렉토리&lt;/h2&gt;
&lt;p&gt;리눅스의 디렉토리는 계층구조로, 루트로부터 시작하여 트리 형태의 계층구조를 이룬다.&lt;/p&gt;</description></item><item><title/><link>https://20h.dev/archives/</link><pubDate>Tue, 28 May 2019 00:00:00 +0000</pubDate><guid>https://20h.dev/archives/</guid><description/></item></channel></rss>