[CMOE 북코칭] “왜 리더인가” / 박중근 멘토님 CMOE 에서 진행하는 북코칭을 참여했다. 이번에는 4번째 시간이었고 이나모리 가즈오 선생님의 “왜 리더인가” 라는 책으로 세션을 진행했다. ( cmoe 글 ) 북코칭은 참 매력적이다. 단순히 Lecture 와 Listener 가 아니라 상호 소통하는 시간을 가지면서 Coach 는 Followe...
Blog Posts
Thoughts, experiences, and insights in technology and engineering
2023년 3분기 회고
Intro 어느덧 시간이 흘러서 2023년의 3분기가 지나갔습니다. 항상 있었던 일을 기록하고 회고를 해야겠다고 생각만 했었지, 블로그에 글로 남기는 일은 정말 오랜만인 것 같습니다. 링크드인으로 연결 된 안수빈님 블로그의 3분기 회고글을 받고 영감을 얻어 저 또한 굵직한 일들이 많았던 23년 3분기를 회고하고 정리해야겠다는 생각에 이렇게 글을 써...
🏢 첫번째 퇴사, 첫번째 이직
Intro 언제 어디서나 매번 느끼는 것이지만 시간은 정말 빠른 것 같습니다. 벌써 제가 첫번째 회사를 퇴사한지 1달이 지났습니다. 저는 카카오엔터프라이즈라는 회사에 2020년 6월 인턴으로 입사하였으며, 10월부터 정규직으로 근무하였습니다. 음성 시스템 파트, ML 플랫폼 파트, 검색 클라우드 시스템 파트 등의 여러 팀에서 근무를 하였으며 202...
[SRE] Ch18. Software Engineering in SRE
결론 : SRE 는 단순 Operation 을 하는 포지션이 아니라 Software Engineering 에 많은 부분 기여를 하고 있으며, 이러한 역량과 작업은 매우 중요하다. 구글에서는 어떤식으로 SRE 의 Software Engineering 이 이루어지고 있는지 엿볼 수 있는 장 SRE 조직의 소프트웨어 엔지니어링 역량이 중요한 이유 ...
[SRE] Ch17. Testing for Reliability
결론 : 테스트는 엔지니어들이 자신의 제품의 신뢰성을 향상시킬 수 있는 가장 적절한 투자 수단이다. 테스트의 종류는 굉장히 여러가지가 있는데, 신뢰성을 올리기 위해서 대략적으로 테스트의 종류와 중요도에 대해서 설명하고 있다. 테스트는 어떤 변경 사항이 일어났을 때 특정 부분에서 동일한 결과를 기대할 수 있다는 것을 보여주기 위한 메커니즘이다...
[SRE] Ch17. Testing for Reliability
결론 : 테스트는 엔지니어들이 자신의 제품의 신뢰성을 향상시킬 수 있는 가장 적절한 투자 수단이다. 테스트의 종류는 굉장히 여러가지가 있는데, 신뢰성을 올리기 위해서 대략적으로 테스트의 종류와 중요도에 대해서 설명하고 있다. 테스트는 어떤 변경 사항이 일어났을 때 특정 부분에서 동일한 결과를 기대할 수 있다는 것을 보여주기 위한 메커니즘이다...
[SRE] Ch12. Effective TroubleShooting
[SRE] 12. Effective Troubleshooting 굉장히 흥미로웠던 장 중 하나였음. 구글에서는 실제로 Production 환경에서 어떤 식으로 트러블 슈팅을 하는지에 대해서 알 수 있었고, 추후 운영 업무에서 도움이 될 수 있는 부분이 많았음. 처음에 나오듯이 Trouble shooting 이라는 것은 필수적인 기술이지만, 설명...
[SRE] Ch11. Being On-Call
플랫폼을 운영하면서 완전 Hardware 이슈를 제외하고 전반적인 운영업무를 진행했었다. 온콜을 정해서 운영하진 않았지만, 암묵적인 온콜이었다. 조금의 경험을 하고 구글의 SRE 가 어떤식으로 On-Call 에 대응하는지를 읽으니 아주 재미있었다. 이 책을 읽으면서 배워야 하는 부분은, 구글은 이렇게 하는구나 정도로 시야를 넓힐 수 있는 부분에 집...
[SRE] Ch10. Practical Alerting from Time-Series Data
[SRE] Ch10. Practical Alerting from Time-Series Data 구글에서 발전시켜온 보그몬 이라는 모니터링 시스템을 소개하는 챕터. 시계열 데이터를 기반으로 시스템을 모니터링하는 방법과 어떤식으로 발전되어 왔는지에 대한 이야기가 나와있다. 시계열 데이터를 통한 모니터링이 무엇인지 잘 파악하지 못했었는데, 프로메테우스...
[SRE] Ch09. Simplicity
Keep It Simple Stupid 역시 심플한게 근본이고 최고이다. 뭐든지 심플하게 생각하고 심플하게 만들어야 한다. 소프트웨어에서는 이런 철학이 더 더 강조되어야 하고 더욱 중요하게 생각해야한다고 느낄 수 있었던 장이었다. SRE의 임무를 한 문장으로 표현하면, 시스템의 신속함과 안정성 사이의 균형을 유지하는 것 이다. 시스템의 ...
[SRE] Ch08. Release Engineering
릴리즈 엔지니어링이라는 용어와 포지션이 있다는 것이 신기했다. 내가 아주 큰 규모의 프로젝트를 해보지 못해서 그런지는 모르겠지만, 일반적으로 SWE(Software Engineer) 가 SRE 업무는 물론 릴리즈 엔지니어링 까지 함께 해왔던 것 같다. 사실 SRE 업무는 DevOps에 가깝기 때문에 조금 거리가 있겠지만, 릴리즈 정도는 SWE가 했...
[Linux] mmap() 에 대해서
mmap() 에 대해서 Memory Mapped I/O는 마이크로프로세서(CPU)가 입출력 장치를 접근할 때, 입출력과 메모리의 주소 공간을 분리하지 않고 하나의 메모리 공간에 취급하여 배치하는 방식이다. -위키피디아- 회사에서 검색 엔진 공부를 하고 있는데, 엔진 내부에서 데이터 사용을 위하여 Memory Store를 사용함. 여기서 ...
[SRE] Ch07. The Evolution of Automation at Google
흑인 예술에 견줄 수 있는 것은 자동화와 기계화 뿐이다. SRE 는 신뢰성을 관리하는 조직으로서 Human Error 와 불필요함을 요구하는 부분을 제거하는 작업은 필수적으로 보임! 또한 자동화를 통해서 주어진 방향으로 힘을 더할 수 있음 하지만, 정확률을 높여주는 것은 아님. 따라서 자동화도 잘 디자인 해야한다 자동화의 가치...
[SRE] Ch06. Monitoring Distrubuted Systems
모니터링에 대한 정의를 할 수 있어서 좋았음. 어떤 것이 좋은 모니터링이고, 나쁜 것인지 판단할 수 있는 기준이 좀 더 명확해졌고 여러가지 모니터링 종류를 파악할 수 있어서 도움이 되었다. 정의 모니터링 쿼리의 수와 종류, 에러의 수와 종류, 처리 시간 및 서버의 활동 시간 등 시스템에 대한 정량적 실시간 데이터를 보여줌 화이트...
[SRE] Ch05. Eliminating Toil
삽질은 이제 그만! 삽질 정의 부터 단순히 하고 싶지 않은 일만을 의미하는 것은 아님. 그렇다고 허드렛일이나 지저분한 일을 의미하는 것도 아님. 구글에서 정의하는 삽질을 확인해보자 수작업을 필요로 한다 반복적이다 자동화가 가능하다 사후 대처가 필요하다 가치가 지속되지 않...
[SRE] Ch04. Service Level Objectives
서비스 수준 관련 용어 척도 SLI : Service Level Indicator → 서비스 수준을 판단할 수 있는 몇 가지를 정량적으로 측정한 값 예) 응답 속도, 전체 요청 수 대비 에러율, 시스템 처리량 … 가용성 SRE가 중요하게 생각하는 SLI 중 하나 서비스가 ...
[SRE] Ch03. Embracing Risk
[SRE] Ch03. Embracing Risk 일반적으로 구글의 서비스를 많이 사용하는 유저라면, 구글이 100% 신뢰할 수 있으며 장애가 절대로 일어나지 않는 서비스들을 구축했을 것이라 생각할 수 있다! 하지만 신뢰성을 극대화하면 기능 개발 속도나 제품 출시 기간에 제동을 걸게 되며 비용이 상승하여 방해가 된다고 한다. 사용자 경험이란 모바...
[SRE] Ch02. The Production Environment at Google, from the Viewpoint of an SRE
Hardware 구글의 대부분의 컴퓨터 자원은 구글이 전원 공급, 냉각 기능, 네트워크 및 컴퓨터 하드웨어 등을 모두 직접 디자인한 데이터센터에 있음 Machine 하드웨어 (or VM) 을 의미 Server 서비스를 구현하는 소프트웨어를 의미 구글 데이터센...
[데이터 중심 애플리케이션 설계] Ch1. Reliable, Scalable, and Maintainable Applications
오늘날 많은 애플리케이션은 Compute-Intensive 와는 다르게 Data-Intensive 적이다. 즉, CPU 성능보다는 데이터의 양, 데이터의 복잡도, 데이터의 변화 속도가 더 큰 문제이다. 일반적인 데이터 중심 애플리케이션은 아래와 같은 컴포넌트들이 필요하다. Database Cache Search Index St...
[etcd] [Docs Learning] etcd versus other key-value stores
etcd 공식 Docs 의 Learning 문서를 보고 공부 및 해석한 내용을 기록합니다. Docs etcd 는 /etc + distritubed system 에서 유래했으며, configuration 데이터를 저장하기 위해서 만들어졌는데 여기다가 분산시스템을 더해서 etcd가 되었다! network partition 을 절대 허용하지 ...
[K8S] Termination of Pods
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Pod Creation | v Pod Scheduling | v Pod Initialization | --> Init Containers Start | | | | ...
[Data Structure] MySQL Index 자료구조 B-tree
Index 는 우리가 흔히 알고 있듯이, 어떠한 내용을 빠르게 찾기 위한 색인이다. 책을 읽을 때도 Index 를 통해 찾고 싶은 내용을 빠르게 접근할 수 있다. MySQL 과 같은 Database 에서도 이러한 Index 기능을 제공하는데, 이 때 주로 사용되는 자료구조는 B-tree 이다. 단순히 생각했을 때, 빠르게 찾는다면 Hash map...
[K8S] Worker Node의 Kubelet IP 변경하기
GPU 장비 상면 이전을 진행하였는데, 이때 장비의 IP가 변경되었다. 해당 장비는 Kubernetes 클러스터의 Worker 노드로 사용되고 있었고, 노드 삭제 및 추가는 따로 진행하지 않았다. 즉, 상면 이전을 진행하는데 단순 Schedule Disabled 만 해둔 상태. 이때 해당 장비의 IP가 바뀌었다는 것을 Kubelet은 직접 알지 못...
[GPU] NVML Function Not Found Error (ft. pynvml)
Pytorch Serve 를 진행하는 중 아래와 같은 에러 발생 AttributeError: /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1: undefined symbol: nvmlDeviceGetComputeRunningProcesses_v3 pynvml.nvml.NVMLError_FunctionNotFound: ...
[etcd] [Docs Learning] KV API Guarantees
etcd 공식 Docs 의 Learning 문서를 보고 공부 및 해석한 내용을 기록합니다. Docs APIs to consider Read APIs range watch Write APIs put delete Combination (re...
[Leetcode] 69. Sqrt(x) with Binary Search
Problem Link Given a non-negative integer x, return the square root of x rounded down to the nearest integer. The returned integer should be non-negative as well. You must not use any built-in e...
[etcd] [Docs Learning] etcd v3 authentication design
etcd 공식 Docs 의 Learning 문서를 보고 공부 및 해석한 내용을 기록합니다. Docs https://etcd.io/docs/v3.5/learning/design-auth-v3/ 한 줄 정리 : RESTful 한 인증 방식인 v2 를 쓰다가, raft 알고리즘을 적용한 v3를 사용했더니 consistency 보장도 좋고...
[번역] Kubernetes: Flannel Networking
해당 Posting 을 공부하며 번역하는 글입니다. 해당 포스팅은 쿠버네티스 환경에서 flannel 네트워크가 어떻게 동작하는지를 설명하는 글입니다. 쿠버네티스는 규모에 맞게 컨테이너화 된 애플리케이션을 관리하는데 굉장히 유용한 도구입니다. 하지만 여러분도 아시다시피, 쿠버네티스를 학습하는 것은 쉽지만은 않습니다. 특히 네트워크 구현의 백...
[번역] Life of a Packet in Kubernetes— Part 3
해당 Posting 을 공부하며 번역하는 글입니다. 이번 포스팅은 “쿠버네티스에서 패킷의 삶” 이라는 주제의 파트 3입니다. 이제부터 쿠버네티스의 kube-proxy 컴포넌트가 iptables 를 사용하여서 어떻게 트래픽을 컨트롤하는지 알아볼 것입니다. 쿠버네티스 환경에서 kube-proxy 의 역할을 이해하고 iptables를 사용하여...
[CISCO 네트워킹] 12. IPv6 로 떠나는 여행
IPv6 의 필요성 IPv4 주소의 주소공간 부족 IPv6는 IPv4 와 엄청난 양의 주소 차이가 남 NAT Network Address Translation 내부에서는 Private IP 주소, 외부에서는 공인 IP 주소를 사용할 수 있게 하는 것 Subnet 서브넷 마스크를 이용해서...
[etcd] [Docs Learning] Learner Design
etcd 공식 Docs 의 Learning 문서를 보고 공부 및 해석한 내용을 기록합니다. Docs “Mitigating common challenges with membership reconfiguration” etcd Learner Background (Common Challenges) 1. New Cluster memb...
[CISCO 네트워킹] 8. 라우팅 프로토콜과의 한판
RIP 라는 라우팅 프로토콜에 대한 이야기 RIP (Routing Information Protocol) 라우팅 프로토콜 다이내믹 프로토콜 내부용 라우팅 프로토콜(IGP) 디스턴스 백터 알고리즘 라우터가 좋은 길을 경정하는 기준이 되는 요소 → Hop 카운트 디폴트 라우팅 업데이트 주기 → 30초 RIP 장 단점 ...
[etcd] [Docs Learning] Client Design
etcd 공식 Docs 의 Learning 문서를 보고 공부 및 해석한 내용을 기록합니다. Docs Introduction etcd server has proven its robustness with years of failure injection testing Using Data store and etcd server, most...
[etcd] [Docs Learning] Data Model
etcd 공식 Docs 의 Learning 문서를 보고 공부 및 해석한 내용을 기록합니다. Data Model Docs “A persistent, multi-version, concurrency-control data model” (유지되고, Multi version 이면서, 동시성 컨트롤이 되는 데이터 구조) “et...
[Infiniband] NCCL WARN Call to ibv_reg_mr failed 이슈 해결
개요 Infiniband 네트워크를 사용하는 클러스터에서 Multi Node 분산 학습을 실행할 때 NCCL WARN Call to ibv_reg_mr failed 에러가 발생하는 경우가 있음. 아래와 같이 에러가 발생하면서 학습이 중단되는 케이스가 있다. 1 2 3 4 ibvwrap.c: 106 NCCL WARN Call to ibv_reg_m...
[K8S] 5.4.0-132 커널의 epoll 버그로 인한 etcd leader election 이슈
[k8s] 5.4.0-132 커널의 epoll 버그로 인한 etcd leader election 이슈 사용 중인 클러스터의 Control plane 은 Master[1:3] 노드로 구성되어있고 HA 구성이 되어있는 상태. Kubernetes 는 Control plane 노드에서 etcd 라는 Database 를 Kuberne...
[K8S] Kuberntes에서 A100 GPU Node 의 MIG 설정하기
개요 A100 GPU 의 경우 MIG(Multi-Instance GPU) 사용이 가능합니다. 이를 통해서 1장의 GPU 카드를 작은 용량으로 쪼개어서 사용할 수 있습니다. ref. NVIDIA MIG DOCS 예를 들어 A100 40GB GPU 카드 8장이 붙은 Node 를 가정해보겠습니다. nvidia-smi 로 조회 시 아래와 같이 GP...
[K8S] 같은 노드의 CoreDNS 로의 응답이 없는 이슈 (dns resolution failed)
Description coreDNS pod와 다른 pod가 같은 노드에 떠있으면, 간헐적으로 dns query 응답을 받지 못하는 이슈 1 dns resolution failed tcpdump 확인 결과 coreDNS가 같은 노드의 다른 pod에 대해서 ARP reply를 받지 못함. CoreDNS 란? CoreDNS :...
[K8S] Kubespray로 만든 Kubernetes 클러스터의 Master 1번 Node 장애 복구
Description Kubernetes 클러스터의 Master Node에서 Disk 장애가 발생함 1 [HAWKEYE] kernel:: [22329228.540857] blk_update_request: I/O error, dev sda, sector 795030104 op 0x0:(READ) flags 0x0 phys_seg 1 pri...
[GPU] uncorrectable ECC 에러로 인한 GPU 카드 인식 불가 현상
Description 수백장의 GPU 카드를 기반으로 한 Kubernetes on-premise 클러스터를 운영하는 도중, 갑자기 특정 장비에 꽂혀있는 8장의 GPU 중 1장의 카드가 인식이 안되는 현상이 발생 아래와 같이 해당 노드를 kubectl describe node 로 확인하였을 때는, 1장이 누락된 7장만 Allocatable 로...
[K8S] Prometheus 의 Disk Pressure 현상
Description Kuberntes 환경에서 모니터링을 위해서 Prometheus를 사용 중. Prometheus는 kube-prometheus-stack 에서 확인할 수 있듯이 Statefulset을 사용하고 있음 Prometheus 는 수집하고 있는 메트릭을 보존할 필요가 있고, Stable 한 네트워크를 가지고 ...
[K8S] iptables 설정이 80, 443 통신을 막는 이슈
Description Kubernetes 클러스터의 특정 worker node 에서 80 과 443 포트로의 통신이 누락되는 경우가 발생. 해당 이슈를 해결하기 위해서 인프라분들과 팀원분들이 디버깅을 수행해주심 iptables 시스템 관리자가 리눅스 커널 방화벽이 제공하는 테이블들과 그것을 저장하는 체인, 규칙들을 구성할 수 있게...
[K8S] V100 GPU 장비 메모리 Hang 발생 Trouble shooting
Description GPU 장비로 Kubernetes 클러스터를 관리하다가 어느 순간부터 여러개의 GPU 장비에서 Memory Hang 현상이 발생 Cause 해당 메모리 행이 발생하는 장비의 메모리 값을 분석 kodac_tb_memory_total : 512 GB kodac_memorysize :...
[K8S] host 에서 Kubeadm 으로 Kubernetes 환경 제거하기
Description Kubernetes 클러스터 환경에서 특정 노드를 Clear 하고 싶은 경우가 있다. 사실 Node OS 재설치가 제일 깔끔하고 쉽지만, 인프라 쪽의 도움을 받지 못하는 경우는 Kubernetes 의 컴포넌트들을 직접 삭제해주는 작업이 필요하다. Solution kubeadm 으로 reset 후 ipvsadm — ...
[K8S] Node 에서 Domain Resolving(nslookup) 실패 이슈
Description nslookup 이란? nslookup은 리눅스, 맥OS, 윈도우 등에서 사용할 수 있는 커맨드라인 명령어 중 하나로 DNS 레코드를 조회할 때 사용함. 즉, 도메인이나 IP를 파라미터로 넣었을 때 해당 값이 설정되어있는 DNS 레코드의 조회가 가능함. nslookup 의 모든 기능은 ...
[K8S] MongoDB Connection Failed 이슈
Description Kubernetes Cluster의 CPU Worker Node 의 Flavor 를 리사이징(16GB Mem → 32GB Mem) 하면서 Node가 다운되었다가 다시 올라오는 작업이 진행되었음 1. 이때 MongoDB 가 떠 있는 Node가 다운되면서 MongoDB의 인증 문제 발생 1 2 3 4 # MongoDB를...
[NFS] NFS Mount 시 'Unit rpcbind.socket is masked' 에러 발생
Description Kubernetes 의 Pod 명세에서 NFS Mount 를 사용하는데, 해당 Pod가 정상적으로 뜨지 못하고 아래와 같은 에러 발생 1 2 3 4 5 6 Warning FailedMount 5m (x87 over 3h) kubelet MountVolume.SetUp failed for volume "def...
[CISCO 네트워킹] 7. 라우터만 알면 네트워크 도사? (2)
7. 라우터만 알면 네트워크 도사? (2) 라우터 셋업 모드 Set up 방식 라우터에 명령을 입력하는 두 번째 방법 Configuration 모드 configure terminal 라우터의 구성을 콘솔이나 텔넷을 이용해서 할 때 사용하는 모드 라우터의 구성 변경을 위해서는 항상 privil...
[Clean code] Ch17. Smells and Heuristics
Ch17. Smells and Heuristics 코드에서 나는 나쁜 냄새? 나쁜 습관들에 대한 리스트! 클린코드에서 이야기했던 고쳐야하는 부분들을 적어둬서 나중에 참고해도 괜찮을 듯 하다. 인상깊었던 부분 주석 꼭 필요한 부분만 주석으로 남기자. 남긴다면 단어들을 신중하게 선택해서 최대한 멋지게 남기자 (당연한 소리 반복 X, 주절대지...
[Clean code] Ch13. Concurrency
Ch13. Concurrency 동시성과 깔끔한 코드는 양립하기 어렵다! 멀티스레드 코드는 시스템이 부하를 받기 전까지는 멀쩡하게 돌아가지만, 소수의 케이스에서 이슈가 발생함 두개의 스레드 기준으로 잠재적인 경로는 최대 12870개 long일 경우 2704156 멀티스레드 프로그래밍에서 어떻게 하면 코드를...
[CISCO 네트워킹] 7. 라우터만 알면 네트워크 도사? (1)
7. 라우터만 알면 네트워크 도사? (1) 라우터란? 지능을 가진 경로 배정기 라우터는 자신이 가야 할 길을 자동으로 찾아서 갈 수 있는 능력이 있음 라우터의 기능 (가장 좋은 길을 찾는 것) 을 위해서 PC 처럼 CPU, Memory, Interface 등을 가지고 있음 라우터가 하는 일 Path Determination ...
[Clean code] Ch12. Emergence
Ch12. Emergence 테스트 모든 테스트를 실행한다 리팩터링 중복을 없앤다 프로그래머 의도를 표현한다 클래스와 메서드 수를 최소로 줄인다 위의 4가지 규칙을 적용한다면 설계는 단순해진다 테스트 테스트를 철저히 거쳐서 모든 테스트 케이스를 항상 통과하는 시스템은 테스트가 가능한 시스템. 결합도가 높...
[Clean code] Ch11. System
Ch11. System 자바를 사용하지 않아서 그런지 아니면 설계를 잘 몰라서 그런지 쉽게 이해하기 어려운 챕터였음 적절한 추상화와 모듈화 매우 중요 시스템 제작(construction)과 시스템 사용(use)를 분리하라 관심사 분리 Main 분리 생성과 관련된 코드는 모두 ma...
[Clean code] Ch10. Classes
Ch10. Classes 클래스 체계 변수 목록 static public var private var private instance var public 공개 변수가 필요한 경우는 거의 없음 function 클래스는 작아야함! 첫째 규칙도 작은 크기이고, 두번째 규칙도 작은 크기이다. ...
[Clean code] Ch09. Unit Tests
Ch09. Unit Tests 테스트 코드가 중요하다고 듣고 가끔 생각하기만 했지 이렇게 강조되는 부분일 줄은 몰랐다. TDD에 대해서 부정적으로 보는 사람들도 있어서 그렇구나 하고 생각했었는데 클린코드의 철학에서는 TDD가 필수인 것 처럼 보인다! TDD 법칙 실패하는 테스트를 작성할 때까지 코드 작성 X 컴파일은 실패하지 않으면서 실...
[CISCO 네트워킹] 6. 스위치를 켜라
6. 스위치를 켜라! 스위치 허로 만들어진 콜리전 도메인 사이를 반으로 나누고 중간에 다리를 놓아서, CSMA/CD 문제를 해결함 스패닝 트리 스위치나 브리지에서 발생하는 Looping 을 막아주기 위한 프로토콜 출발지부터 목적지까지의 경로가 2개 이상 존재할 때 1개의 경로만을 남겨두고 나머지는 모두 끊어두었다...
[CISCO 네트워킹] 5. IP 주소로의 여행
5. IP 주소로의 여행 IP 주소 원래는 이진수 32자리로 되어 있음. 각 8자리 (십진수로 하면 최대 255) 즉, 옥텟 사이에는 점을 찍음 인터넷에서 사용되는 프로토콜이 바로 TCP/IP 이고, TCP/IP 가 사용하는 주소가 바로 IP 주소이므로 제대로 이해할 필요가 있음 라우터에서의 IP 주소 보통 쓰는 라우터에 배정해...
[CISCO 네트워킹] 4. 네트워크 장비에 관한 이야기
4. 네트워크 장비에 관한 이야기 랜카드 유저의 데이터를 케이블에 실어서 허브나 스위치, 혹은 라우터 등으로 전달해주고 자신에게 온 데이터를 CPU에게 전달해주는 역할 즉, 랜에 접속하기 위한 카드처럼 생긴 것! 선택 시 생각해야하는 것 종류 (네트워킹 방식에 따라 나뉨) 이더넷용...
[CISCO 네트워킹] 2. 네트워크와 케이블, 그리고 친구들
2. 네트워크와 케이블, 그리고 친구들 LAN vs WAN LAN 어느 한정된 공간에서 네트워크를 구성 WAN 멀리 떨어진 지역을 서로 연결하는 경우 Ethernet 이더넷은 네트워킹의 한 방식 이더넷의 가장 큰 특징은 CSMA/CD 라는 프로토콜을 사용...
[K8S] Ingress Nginx 413 http error (payload too large) 이슈 해결
Description HTTP 413 Error 란? Payload Too Large 상태를 의미하는 것으로, 요청 Entity 가 서버에서 정의된 제한 크기보다 크다는 것을 의미 Error Kubernetes 환경에서 nginx ingress controller 를 사용하여 Ingress 를 사용하는 경우 Request의 Paylo...
[Network] DNS는 어떻게 작동할까?
Domain 도메인 관련 작업을 하다가 도메인쪽 내부 시스템을 이해하고 있지 않아서 뭔가 막히는 느낌이 있었다. 이참에 도메인 관련 내용을 쭉 정리해보고자 한다. 우리가 URL을 입력하면 어떻게 해당 IP주소를 받아올까 부터 시작해서, DNS는 어떤식으로 작동하는지에 대해서 알아보자. Domain 접속 과정 브라우저에서 URL을 입력...
[Clean code] Ch07,08. Error Handling
Ch07. Error Handling 오류 코드보다 예외를 사용하라 오류 status 를 하나 하나 지정해서 하기보다는 예외를 사용하는 것이 맞음 try - catch 와 같이 전체적인 맥락에서 오류를 잡을 수 있음 try 문이 하나의 트랜잭션 역할을 한다. catch 블록은 프로그램 상태를 일관성 있게 유지...
[Clean code] Ch05,06. Fomatting & Objects and Data Structures
Ch05. 형식맞추기 목적 코드 형식은 의사소통의 일환임. ‘돌아가는 코드’를 짜는 것이 우리의 목적이 아님. 다음 버전에서 기능은 바뀔 가능성이 매우 높지만, 스타일과 가독성 수준은 계속 영향을 미친다. 행 길이 200 줄 미만 신문 기사 처럼 작성하기 고차원 개념 → 저차원 개념 함수 호출 순...
[Clean code] Ch04. Annotation
Ch03 Annotation 주석은 필요악이다. 순수하게 선하지 못하다. 프로그래밍 언어로 치밀하게 의도를 표현할 수 있다면 주석은 거의 필요하지 않다. 프로그래머들이 주석을 유지하고 보수하기란 현실적으로 불가능하다. 근데 요새 잘 짜여진 거의 대부분의 오픈소스들은 엄청난 양의 주석을 가지고 있음. 근데 이게 코드에 대한 설명이라기 보다...
[Clean code] Ch03. Functions
Ch03 Functions Fitnesse 란 Fitnesse는 입력 값 과 결과 값을 WIKI페이지에 입력하고 검증을 수행하므로 항상 결과에 대한 기대 값은 동일해야 한다는 제약사항이 존재한다. Small! 작아야함 더 작아야함 스크린에 가득차면 안됨. 20줄정도 Blocks and Indenting if, while ...
[Clean code] Ch02. Meaningful Names
Ch02. Meaningful Names Choosing good names takes time but saves more than it takes. 의도를 확실하게 나타내도록 네이밍해야함 네임이 코멘트를 필요로한다면 제대로 네이밍 안된것임 하지만 코멘트에 대해서는 견해차이가 있다. List가 아닐 경...
[Golang] map, slice, list 정리
[Golang] map, slice, list 정리 Array 고정길이 배열 배열 크기를 동적으로 증가시키거나 부분 배열을 잘라내는 기능 없음. 배열의 크기를 데이터 타입 앞에 써줘야 함 1 2 3 4 5 6 7 package main func main() { var a [3] int a...
[번역] Pid 네임스페이스에 대한 궁금증
The Curious Case of Pid Namespaces [원본링크] https://hackernoon.com/the-curious-case-of-pid-namespaces-1ce86b6bc900 Pid 네임스페이스에 대한 궁금증 컨테이너들은 어떻게 pid들을 공유할까? 네임스페이스들은 리눅스 컨테이너들의 가장 중요한 컴포넌트 중 하나...
[Linux System Programming] Ch10 시그널
[Ch10 시그널] Ch10 시그널 리눅스 환경에서 Robustness Test (강건성 테스트) 나 디버깅을 진행하다보면 여러가지 오류로 인해서 프로그램이 종료되는데, 이 때 Core dump가 있으면 디버깅에 유용하지만 로그만 남아 있는 경우도 있음. 이 때 단서가 되는 부분이 시그널임 시그널은 비동기 이벤트 처리를 위한 메커니즘을 제공...
[번역] The Code Review Pyramid
Code review Pyramid에 대한 글 번역 원본 링크 The Code Review Pyramid 코드리뷰에 대해서 이야기할 때 코드 포매팅이나 스타일에 관한 재미없는 논의들이 길고 지루하게 초점을 맞추는 경향이 있는 반면 중요한 측면(코드의 변경이 의도와 맞는지, 성능저하는 없는지, 기존 클라이언트와 호환은 잘 되는지 등)들은 덜 ...
[Code Review] 코드리뷰 참고자료 정리
Code Review 란 소프트웨어를 실행하지 않고 사람이 직접 검토하는 과정을 통해서, 잠재된 결함을 찾아내고 이를 개선해나가면서 전반적인 소프트웨어의 품질을 높이고자 하는 활동 Programmer’s Ego 개발자는 자신의 코드를 자신의 것으로 여기고 비판을 수용하지 않는 경우가 있다. 이를 Programmer's Ego라고 한다. The Ten...
[Movie] Contact (with.스포) (WIP)
[Movie] Contact Ocakham’s Razor All things being equal, the simplest solution tends to be the best one. 전능하고 신비한 신이 우주를 창조하고 자신의 존재를 증명할 여지를 남기지 않은 것 All powerful mysterious god created uni...
[Golang] go module 'connection refuesd' 오류 해결
Go module ‘connection refuesd’ 오류 해결 에러 go mod tidy 로 module 설치 시 connection refused에러 발생 1 2 3 github.in/misc@v0.0.0-20220602070448-f6621fa768b4: verifying go.mod: github.in/misc@v0.0.0-202...
[Linux] User에 Sudo 권한 부여하기 (feat. Jupyter notebook)
User에 Sudo 권한 부여하기 (feat. Jupyter notebook) Su Superuser 라는 뜻 Linux에서 모든 것들을 접근하고 수정할 수 있다. Sudo SuperUser DO 에서 유래하였으나 Substitute User Do (다른 사용자의 권한으로 실행) 의 줄임말로 해석됨. 기본적으로 사용자 비밀번...
[System Design Interview] 14. 유튜브 설계
14. 유튜브 설계 유튜브 시스템은 언뜻 보기에는 간단 (창작자가 비디오를 올리고, 시청자는 재생 버튼을 누름) 하지만 이면에는 매우 복잡함. DAU : 20억 매일 재생되는 비디오 수 : 50억 미국 성인 73% 사용 5천만명의 크리에이터 광고수입은 19년 기준 150억 달러 모바일 인터넷 트래픽 중 3...
[K8S] Pod 스케줄링 에러 scheduler 0/5 nodes are available
Pod 스케줄링 에러 scheduler 0/5 nodes are available 쿠버네티스에서 Pod 배포를 했을 때 Warning FailedScheduling 40s (x5 over 3m50s) default-scheduler 0/5 nodes are available: 1 Too many pods, 1 node(s) had taint {no...
[K8S] Kubectx 사용 시 선택한 kubeconfig 를 제대로 못 불러오는 문제 해결
Kubectx 사용 시 선택한 kubeconfig 를 제대로 못 불러오는 문제 해결 DOCS 여기에 거의 모든 정보가 나와있다. 나는 Kubectx 라는 툴을 사용해서 다중 클러스터를 선택하고 있다. (매우 유용함!!) 근데 클러스터 몇 개를 추가했더니, 선택한 새로운 클러스터 정보를 가져오는 것이 아니라 계속 똑같은 정보만 가져오는 것이...
[Linux System Programming] Ch08 파일과 디렉터리 관리
[Ch08 파일과 디렉터리 관리] File Discripter VS Inode 같은 파일을 open() 으로 두번 열었을 때의 구조 프로세스에서 파일 입출력은 open 함수로 연 작업을 구분하는 것이며, 실제 물리적인 파일이 같은지는 구분하지 않음. 각각의 fd를 부여하고 커널에서도 각각의 파일의 상태와 현재 작...
[Linux System Programming] Ch07 스레딩
[Ch07 스레딩] 스레딩은 단일 프로세스 내에서 실행 유닛을 여러 개 생성하고 관리하는 작업을 뜻한다. 스레딩은 Data-race condition과 Deadlock을 통해 어마어마한 프로그래밍 에러를 발생시키는 원인이다. 7.1 바이너리, 프로세스, 스레드 바이너리 저장장치에 기록되어 있는 프로그램 ...
[미라클모닝][MKYU] 514 프로젝트 7일차
[미라클모닝][mkyu] 514 7일차 4/7 당신의 빅팬은 누구입니까? 내가 나의 빅팬이 되어야 다른 사람을 사랑할 수 있다. 탄생! 나 스스로 평생 내 팬이 되겠다는 약속 → 자녀 교육의 베이스 → 탄생! 너 스스로 평생 너의 팬이 되겠다는 약속을 할 수 있게 해라 내가 나를 응원하는 시스템 구축 경제적 지원, 정서적 지원, 환경적...
[미라클모닝][MKYU] 514 프로젝트 5일차
[미라클모닝][mkyu] 514 5일차 4/5 디지털 에셋을 만드는 법 디지털에셋 돈을 쓰면서 배워야함. 디지털 세상에서 나의 자산을 거래 처음 번 돈의 의미. 1,000배로 돌아온다. 디지털 에셋은 린하게 출시하고 유저의 피드백으로 커가는 것이다. 무료와 유료의 경험차이 내가 돈 내고 배운 것이 유료 경험. ...
[미라클모닝][MKYU] 514 프로젝트 4일차
[미라클모닝][mkyu] 514 4일차 온 동네가 알 때 까지 꾸준해라 경제가 되려면 일정 규모가 되어야함. 내 꾸준함이 남들에게 도움이 되게 해라
[미라클모닝][MKYU] 514 프로젝트 2일차
[미라클모닝][mkyu] 514 2일차 4/2 세상을 사는 3가지 지혜의 말 사랑해 시작할 때 많이 표현하라. 사랑을 표현하면 인간관계의 시작하기 쉬움 미안해 유지할 때 고마워 정리할 때 영어공부 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #3 But not everyo...
[미라클모닝][MKYU] 514 프로젝트 1일차
[미라클모닝][mkyu] 514 1일차 4/1 누군가를 응원하는 법 언제나 한결같이 그의 편이 되라. 내가 결혼을 안해봐서 모르지만,,, 왜 부부는 서로에게 한결같이 상대의 편이 될 수 없을까? 나는 될 수 있다고 생각한다. 부모라는 것은 한결같이 자식의 편이 되어주는 것 대화가 통할 정도로 공부해라 사랑하는 사람을 응원하...
[미라클모닝][MKYU] 514 서약서
[미라클모닝][mkyu] 514 서약서 서약서
[Linux System Programming] Ch06 고급 프로세스 관리
[Ch06 고급 프로세스 관리] 5장에서는 프로세스가 무엇인지, 생성, 제어, 종료에 관한 시스템 콜과 관련된 시스템에 대해 알아봤음. 이번 장에서는 리눅스 프로세스 스케줄러와 스케줄링 알고리즘을 알아본다. 6.1 프로세스 스케줄링 프로세스 스케줄러는 커널의 서브 시스템으로써 유한한 리소스인 프로세서의 시간을 시스템 내의 프로세스...
[Linux System Programming] Ch05 프로세스 관리
[Ch05 프로세스 관리] 유닉스는 새로운 바이너리 이미지를 메모리에 적재하는 과정에서 새로운 프로세스를 생성하는 부분을 분리했다. 5.1 프로그램, 프로세스, 스레드 바이너리는 디스크 같은 저장 장치에 기록되어 있는 컴파일된 실행할 수 있는 코드를 말한다. 흔히 프로그램을 지칭하기도 함. 때로는 애플리...
[Linux System Programming] Ch04 고급 버퍼 입출력
[Ch04 고급 버퍼 입출력] 2장에서는 파일입출력의 근본일 뿐만 아니라, 리눅스에서 일어나는 모든 통신의 토대인 기본 입출력 시스템 콜을 배웠다. 3장에서는 기본 입출력 시스템 콜에 사용자 영역 버퍼링이 필요한 때를 알아보고 해법으로 C언어의 표준 입출력 라이브러리에 대해 공부했다. 4장에서는 리눅스의 고급 입출력 시스템 콜에 대해 알아본다. ...
[Linux System Programming] Ch03 버퍼 입출력
[Ch03 버퍼 입출력] 블록 : 파일 시스템의 최소 저장 단위를 나타내는 추상 개념. 파일 시스템 연산은 블록 단위로 일어난다. (데이터에 필요한 블록이 4.5개라 하더라도 5개를 써야함.) → 블록의 일부분만 다루는 연산이 비효율적임. 3.1 사용자 버퍼 입출력 일반 파일에 대해 잦은 입출력을 처리해야만 하는 프로그램은 종종 사...
[Linux System Programming] Ch02 파일 입출력
Ch02 파일 입출력 2. 파일 입출력 리눅스는 많은 인터페이스를 파일로 구현했음. (유닉스 시스템에서는 거의 모든 것을 파일로 표현) 파일 입출력은 단순한 파일 처리를 넘어서 다양한 작업에 밀접하게 관련되어 있음. 파일은 읽거나 쓰기 전에 반드시 열어야 한다. File Table 커널은 파일 테이블이라고 하는 프로세...
[BlockChain] Blockchain Transaction flow
Blockchain Transaction flow 1. 작동 시작 만약 민지가 철수한테 비트코인을 보내고 싶어한다면, 민지는 비트코인이 저장되어있는 휴대폰이나 컴퓨터의 비트코인 지갑 어플을 열어볼것이다. (지갑 어플은 보통 공짜로 받을 수 있음) (비트코인이나 이더리움은 단순히 블록체인의 특정 기능을 이용한 암호화폐인데, 비트코인은 비트코인만 ...
[Shell] Shell script에서의 특수문자 사용
Shell script에서의 특수문자 사용 Shell 스크립트를 이용해서 Mysql 데이터를 백업하는 mysqldump 작업 로직을 구성하고 싶었다. 가장 간단하게 짜본 스크립트는 아래와 같다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #!/bin/bash ...
[SQLalchemy] NULL 조회
SQLalchemy에서의 NULL 조회 1 2 3 cluster_item = self.db.query(Cluster)\ .filter((Cluster.userid.is_(None)) & (Cluster.domain.is_(None)))\ .order_by(Cluster.id).first() 위와 같이 NULL을 조회했었는데, 정상적으로...
[Kubernetes] Kubernetes 서비스 정리(ClusterIP, Nodeport, Loadbalancer)
Kubernetes Service ClusterIP 말 그대로 클러스터 내부에서 사용하는 IP 클러스터 내부의 노드나 파드에서는 ClusterIP를 이용해서 서비스에 연결된 각 파드들에 접근한다. 하지만 외부에서는 이 IP로 접근 불가능 1 2 3 4 5 6 7 8 9 10 11 apiVersion: v1 kind: Service metad...
[Docker] Centos Image 에서 sudo command not found 에러
Centos Image 에서 sudo command not found centos/python-36-centos7 이미지 사용 도중 Dockerfile 내부에서 커맨드로 파일의 모드를 바꿔야할 일이 생겼다. 1 RUN sudo chmod 755 start.sh 근데 sudo 를 실행했을 떄 1 /bin/sh: sudo: command no...
[Linux] Sudoer 및 sudo 사용하기. sudo passwd 실행 안될 때
Sudoer 및 sudo 사용하기 root 권한 root 는 일반적으로 unix에 존재하는 특권 사용자의 이름을 의미하는데 모든 권한을 가지고 있다고 보면 되겠다. 매우 강력하여 편리하게 보이지만 위험할 수 있기 때문에 모든 계정에 root 권한을 주지는 않는다. 일반 계정이 sudo 명령어로 root 권한을 가진 채 커맨드를 이용하기 위해서는...
[MySQL] == NULL 값 조회 안되는 이슈
[MySQL] == NULL 값 조회 안되는 이슈 MySQL 쿼리문을 작성할 때 필드 값이 NULL인 Row를 조회하고 싶을 때가 있다. 근데 아무 생각 없이 1 SELECT * FROM your_table WHERE your_field = NULL 이라고 썼더니 조회가 안된다. 결론부터 이야기하자면 1 SELECT * FROM your_...
[Crontab] [Tip] Crontab 이슈 해결
[Crontab] [Tip] Crontab 이슈 해결 crontab 을 써보면서 겪었던 몇 가지 이슈를 해결하는 과정을 기록하려 한다. 자주 사용하시는 분들은 당연하게 생각하는 것들을 몰랐던 나는 검색을 통해 해결했는데, trouble shooting 을 하는 다른 분들께도 도움이 되었으면 좋겠다. Permission denied 1 */30 ...
[MongoDB] MongoDB 버전차이 연결 실패 에러
MongoDB 버전차이 연결 실패 에러 서버와 서버 사이 ACL은 telnet으로 확인했을 때 접속이 잘 되었다. 하지만 몽고디비 접속이 안되었다. 접속 커맨드 1 2 3 $ mongo --host db_name/IP01:27017,IP02:27017,IP03:27017 --username name --password --authenticati...
[독서][부의 추월차선] 부의 추월차선은 어떻게 갈 수 있을까
[독서][부의 추월차선] 부의 추월차선은 어떻게 갈 수 있을까 제목부터 상당히 자극적이다. 부의 추월차선 고속도로는 일반적으로 차선의 용도가 정해져있다. 4차선 도로를 예로 든다면 4차선은 화물차량용, 2, 3차선은 서행차선용, 1차선은 추월차선으로 이용된다. 천천히 달리고 싶은 차들은 2, 3차선에서 적정속도로 달린다. 하지만 더 빠르게 가고 ...
[번역] Google Pro Tip: 대략적인 계산방식을 통한 최적의 디자인을 하기
다양한 기술 포스팅들이 올라오는 http://highscalability.com/ 사이트에는 양질의 개발관련 글이 올라온다. 그 중 시스템 설계를 위한 대략적인 계산 법에 대해 좋은 칼럼이 있어서 번역글을 작성해본다. 부족한 번역 실력 양해 부탁한다. 원본 링크 Google Pro Tip: 대략적인 계산방식을 통한 최적의 디자인을 하기 [...
[번역] Stack Overflow는 어떻게 운영되고 있을까?
개발자들의 필수 사이트 Stack Overflow가 어느 정도의 부하를 감당하고 있는지, 어떤 스펙의 하드웨어로 운영하고 있는지에 대한 좋은 칼럼이 있어서 번역글을 작성해본다. 부족한 번역 실력 양해 부탁한다. 원본 링크 Stack Overflow는 어떻게 운영되고 있을까? Stack Overflow 가 규모 있게는 돌아가지만 완전한 규모...
[Audio] ffprobe 설명 및 사용법
ffprobe 설명 및 사용법 ffprobe 이란? 많이 알려져 있는 ffmpeg은 미디어 포맷을 변환하는데 사용하는 도구라면, ffprobe는 쉽게 말해 간단한 멀티미디어 Stream 분석기이다. [공식 문서 : https://ffmpeg.org/ffprobe.html] 사용 나는 서버 상에서 사용을 해야하는데, 설치하지 못하는 환경...
[K8S] Grafana vs Kibana
Grafana vs Kibana 쿠버네티스에서 서비스를 운영하기 위해서 모니터링 툴을 적용해야 했다. 기존 시스템에서는 ELK 스택 중 하나인 Kibana를 써왔지만, 쿠버네티스 시스템에서는 Prometheus + Grafana 스택을 많이들 쓴다고 해서 기존 Kibana와 Grafana의 차이점에 대해서 알아보았다. Kibana 로깅 ...
[K8S] 쿠버네티스 재시작은 어떻게? Rollout restart vs apply
Rollout restart vs apply Deployment 나 Kubernetes의 여러가지 Object들을 생성하기 위해서 Apply 명령어를 많이 쓴다. 그렇다면 deployment 를 재시작하기 위해서는 어떤 명령어를 써야할까? Apply kubectl apply 는 모든 쿠버네티스의 Obejct들 (Pod, Deployment...
[K8S] kubernetes imagepullpolicy 는 무엇이고 언제 적용될까?
kubernetes imagepullpolicy 는 무엇이고 언제 적용될까? imagepullpolicy 해석 그대로 컨테이너를 생성할때 사용하는 Image의 Pull 정책에 대한 설정값이다. IfNotPresent 이미지가 로컬에 없는 경우에만 내려받는다. Always kubelet이 컨테이너를 기동할 때마다, kubelet이 컨테이너 이...
[MLops] [MLops Deployment & Monitoring] Model Monitoring
[ MLops Deployment & Monitoring ] Model Monitoring Train, Test, Deploy. 그래서, 다 끝난거야? 배포 작업 이후에 어떤 것이 문제가 될 수 있을까? </br>그것을 알기 위해서는 Monitoring 작업이 필수적이다. </br> Model Monitoring 는 ...
[Python] Python에서 * 와 ** 의 차이
Python에서 * 와 ** 의 차이 *args 몇개의 파라미터를 받을지 모른다. 이럴 경우 args는 Tuple 형태로 전달된다. 1 2 3 4 5 6 7 8 9 10 11 12 def test(*args): for a in args: print(a) test(1,2,3,4,5,6) >> 1 2 3 4 ...
[K8S] 쿠버네티스(K8S)에서의 Log Aggregator, Logstash vs Fluentd
쿠버네티스(K8S)에서의 Log Aggregator, Logstash vs Fluentd Log Aggregator (로그 수집기) 란? 거의 대부분의 서비스에서는 디버깅을 위한 로그 수집은 필수적이다. ELK 스택으로 로그 수집 및 시각화를 많이 하곤 한다. ELK Elastic Search ...
[Blog] Bucket List
Bucket List 2021.11.22 작성 대도시와 근접한 마당있는 넓은 집에서 아내와 큰 리트리버와 함께 바베큐해먹기 작성중…
[Audio] ffmpeg 사용해서 16k wav 파일로 변환하기
ffmpeg 사용해서 16k wav 파일로 변환하기 Audio Attributes Audio 파일을 사용하기 위해서는 여러가지 값들을 알고 있어야한다. Sample Rate 샘플의 빈도 수 즉, 1초당 추출되는 샘플의 개수. SR이 높으면 높은 밀도의 음성, 낮으면 낮은 밀도의 음성. → 이것을 강제로 낮추면 느린 배속으로 재생...
[Trouble Shooting] [DB] ERROR 2006 (HY000) MySQL server has gone away 에러 해결
ERROR 2006 (HY000) MySQL server has gone away 에러 해결 Flask에서 MySQL을 이용하기 위해 Sqlalchemy 를 사용하던 도중 API 호출 시 ERROR 2006 (HY000) MySQL server has gone away 에러가 자주 발생하였다. 원인 ① MySQL 과 연결에 오류가 있는 경...
[Trouble Shooting] Jekyll chirpy 템플릿으로 Github 블로그 시작하기. (Bundler Install Error)
Jekyll chirpy 템플릿으로 Github 블로그 시작하기. (Bundler Install Error) Github 블로그 with Chirpy Jekyll Theme github 블로그를 시작할 때 Jekyll을 많이 사용한다. 그럼 Jekyll이 무엇일까? Jekyll? 텍스트 변환 엔진으로, Markup 언어로 글을 작성하면 이...
First Post
Welcome Hello world, this is my first Jekyll blog post. I hope you like it!