[{"content":"시작하며: 양자 컴퓨터가 가져올 \u0026lsquo;계산의 패러다임 시프트\u0026rsquo; 최근 뉴스나 기술 기사에서 \u0026lsquo;양자 컴퓨터\u0026rsquo;라는 단어를 보지 않는 날이 없습니다. \u0026lsquo;현재의 슈퍼컴퓨터로 수천 년 걸릴 계산을 몇 분 만에 끝낸다\u0026rsquo;, \u0026lsquo;현재의 암호 기술이 모두 뚫릴지도 모른다\u0026rsquo;는 등 SF 영화 같은 이야기들이 그럴듯하게 들려옵니다. Google이나 IBM, Microsoft 같은 거대 IT 기업부터 전 세계의 대학과 스타트업까지, 이 꿈의 기술을 상용화하기 위해 치열하게 경쟁하고 있습니다.\n하지만 \u0026lsquo;양자 컴퓨터가 결국 무엇인가?\u0026lsquo;라는 질문을 받으면, 정확하게 대답할 수 있는 사람은 많지 않을 것입니다. 많은 사람들이 \u0026lsquo;모든 조합을 동시에 계산할 수 있는 마법의 상자\u0026rsquo;라는 막연한 이미지를 가지고 있지만, 엄밀히 말해 그것은 정확하지 않습니다.\n본 기사에서는 양자 컴퓨터가 고전 컴퓨터(우리가 평소에 사용하는 PC나 스마트폰)와 근본적으로 어떻게 다른지, 그리고 \u0026lsquo;중첩(Superposition)\u0026rsquo;, \u0026lsquo;양자 얽힘(Entanglement)\u0026rsquo;, \u0026lsquo;양자 게이트(Quantum gates)\u0026lsquo;와 같은 양자역학의 신비한 현상들을 어떻게 계산에 이용하고 있는지를 기초부터 철저하게, 전문적이면서도 알기 쉽게 해설합니다. 이 기사를 다 읽을 즈음에는 양자 컴퓨터의 본질적인 대단함과 현재의 과제를 명확히 이해할 수 있을 것입니다.\n제1장: 고전 컴퓨터와 양자 컴퓨터의 결정적인 차이 양자 컴퓨터의 작동 방식을 이해하려면 먼저 우리가 현재 사용하고 있는 \u0026lsquo;고전 컴퓨터\u0026rsquo;가 어떻게 작동하는지 복습할 필요가 있습니다.\n비교표: 고전 컴퓨터 vs 양자 컴퓨터 항목 고전 컴퓨터 양자 컴퓨터 기본 단위 비트 (0 또는 1) 양자 비트 (0과 1의 중첩) 상태의 표현 확정적 확률적 (관측할 때까지 결정되지 않음) 계산 방식 순차 처리 (병렬화에는 물리 코어 필요) 양자 병렬성 (지수함수적인 상태를 동시에 조작) 잘하는 계산 사칙연산, 일상적인 데이터 처리 소인수분해, 양자 화학 계산 오류 내성 매우 강함 매우 약함 (극저온 환경이나 오류 정정이 필요) 고전 컴퓨터의 세계: 0인가 1인가의 \u0026lsquo;비트(Bit)\u0026rsquo; 고전 컴퓨터는 모든 정보를 \u0026lsquo;0\u0026rsquo; 또는 \u0026lsquo;1\u0026rsquo; 둘 중 하나의 상태로 표현합니다. 이것을 비트(Bit) 라고 부릅니다. 물리적으로는 반도체 칩 위의 트랜지스터 전압이 높냐(1) 낮냐(0)로 표현됩니다. 스마트폰에 있는 고화질 사진도, 지금 읽고 있는 이 글도, 즐겨보는 YouTube 영상도 궁극적으로는 방대한 수의 \u0026lsquo;0과 1의 나열\u0026rsquo;로 환원됩니다. 계산이란 이 0과 1의 나열에 대해 AND(논리곱), OR(논리합), NOT(논리부정)과 같은 기본적인 논리 회로를 조합하여 조작을 가하는 과정에 다름 아닙니다. 이것은 매우 확실하고 결정론적인 세계입니다. 입력이 같으면 반드시 같은 출력을 얻습니다.\n양자 컴퓨터의 세계: 0이면서 1이기도 한 \u0026lsquo;양자 비트(Qubit)\u0026rsquo; 반면, 양자 컴퓨터의 최소 정보 단위는 양자 비트(Qubit: Quantum bit) 라고 불립니다. 양자 비트의 가장 큰 특징은 고전적인 비트처럼 \u0026lsquo;0\u0026rsquo; 또는 \u0026lsquo;1\u0026rsquo; 둘 중 하나의 상태에 있을 뿐만 아니라, \u0026lsquo;0과 1이 특정 확률로 섞인 상태\u0026rsquo;를 취할 수 있다는 점입니다. 이것을 \u0026lsquo;중첩(Superposition)\u0026rsquo; 이라고 부릅니다.\n예를 들어 고전 비트가 \u0026lsquo;앞면\u0026rsquo; 또는 \u0026lsquo;뒷면\u0026rsquo; 중 하나가 위로 놓인 동전이라고 한다면, 양자 비트는 \u0026lsquo;공중에서 계속 회전하고 있는 동전\u0026rsquo;에 자주 비유됩니다. 회전 중인 동전은 앞면이라고도 뒷면이라고도 할 수 없으며 양쪽의 상태가 겹쳐져 있습니다. 그리고 동전이 바닥에 떨어져 움직임을 멈추는 순간(이를 양자역학에서는 \u0026lsquo;관측\u0026rsquo;이라고 부릅니다) 처음으로 \u0026lsquo;앞면\u0026rsquo;인지 \u0026lsquo;뒷면\u0026rsquo;인지가 확정됩니다.\n이 \u0026lsquo;관측할 때까지 상태가 확정되지 않는다\u0026rsquo;는 미시 세계(양자역학) 특유의 성질을 그대로 정보 처리 과정에 통합한 것이 양자 컴퓨터입니다.\n제2장: 계산을 근본부터 바꾸는 3가지 양자역학적 성질 양자 컴퓨터의 경이로운 계산 능력의 원천은 단순히 클럭 주파수가 높다거나 부품이 작다는 것이 아닙니다. 물리 법칙 자체를 계산 리소스로 이용한다는 점에 있습니다. 주로 다음의 3가지 양자역학적 현상이 핵심이 됩니다.\n1. 중첩(Superposition)과 지수함수적인 정보량 앞서 말했듯이, 양자 비트는 0과 1 양쪽의 상태를 동시에 유지할 수 있습니다. 1개의 양자 비트는 \u0026lsquo;0과 1의 중첩\u0026rsquo;인데, 양자 비트의 수를 늘리면 어떻게 될까요?\n1 양자 비트: 2가지 상태(0, 1)의 중첩 2 양자 비트: 4가지 상태(00, 01, 10, 11)의 중첩 3 양자 비트: 8가지 상태의 중첩 N개의 양자 비트: $2^N$개 패턴의 중첩 단 50개의 양자 비트만 있으면 $2^{50}$(약 1100조)개의 상태를 동시에 유지할 수 있습니다. 그리고 불과 300개의 양자 비트가 있으면 $2^{300}$개(우주에 존재하는 모든 원자의 수보다 많은 수!)의 패턴을 한 번에 유지할 수 있는 것입니다. 이 지수함수적인 정보 유지 능력이 양자 컴퓨터의 잠재력의 토대가 됩니다. 고전 컴퓨터에서 우주의 원자 수보다 많은 상태를 메모리에 기억시키는 것은 물리적으로 불가능합니다.\n2. 양자 얽힘(Entanglement): 기이한 원격 작용 양자 얽힘은 아인슈타인이 \u0026lsquo;기이한 원격 작용(Spooky action at a distance)\u0026lsquo;이라고 부르며 평생 받아들이지 못했을 정도로 인간의 직관에 반하는 신비한 현상입니다.\n여러 양자 비트가 \u0026lsquo;양자 얽힘\u0026rsquo; 상태가 되면, 그것들은 서로 강하게 결합하여 \u0026lsquo;한쪽의 상태가 확정되면 아무리 거리가 떨어져 있어도 다른 한쪽의 상태가 즉시 확정된다\u0026rsquo; 는 운명 공동체 같은 관계가 됩니다.\n예를 들어 얽힘 상태에 있는 두 양자 비트 A와 B가 있다고 가정해 봅시다(이들은 각각 0과 1의 중첩 상태에 있습니다). A를 관측해서 \u0026lsquo;0\u0026rsquo;이었을 경우, 정보 전달 속도의 한계인 빛의 속도를 뛰어넘어 즉시 B의 상태도 (예를 들어 반드시 \u0026lsquo;1\u0026rsquo;이 되도록) 확정됩니다. 양자 컴퓨터에서는 이 양자 얽힘을 이용함으로써 여러 양자 비트 간의 복잡한 상관관계를 표현하고, 초병렬적인 정보 처리를 수행합니다. 얽힘이 없다면 양자 컴퓨터의 계산 능력은 고전 컴퓨터와 크게 다르지 않을 것입니다.\n3. 양자 간섭(Quantum Interference): 정답을 떠오르게 하는 마법 \u0026lsquo;모든 패턴을 동시에 유지할 수 있다면 그것을 단번에 병렬 계산해서 순식간에 답이 나오는 것 아닌가?\u0026lsquo;라고 생각할 수도 있습니다. 이것이 양자 컴퓨터에 대해 가장 흔히 하는 오해입니다. 중첩 상태에서 계산을 수행해도 최종적으로 답을 알기 위해서는 \u0026lsquo;관측\u0026rsquo;을 해야 합니다. 하지만 관측하는 순간 상태는 $2^N$개의 패턴 중 어느 하나로 무작위로 수축해 버립니다. 이러면 단순히 엉터리(무작위적인) 답이 나올 뿐입니다.\n여기서 등장하는 것이 \u0026lsquo;양자 간섭(Interference)\u0026rsquo; 입니다. 파도와 파도가 부딪힐 때 파장이 맞는 곳은 서로를 강화하고, 어긋나는 곳은 서로를 상쇄하는 현상을 이용합니다(노이즈 캔슬링 이어폰의 원리와 본질적으로 같습니다).\n우수한 \u0026lsquo;양자 알고리즘\u0026rsquo;은 계산 과정에서 \u0026lsquo;정답으로 이어지는 상태(파동)의 확률 진폭을 강화(증폭)하고\u0026rsquo;, \u0026lsquo;오답으로 이어지는 상태의 확률 진폭을 서로 상쇄\u0026rsquo; 하도록 교묘하게 양자 상태를 조작합니다. 그리고 최종적으로 관측했을 때 한없이 100%에 가까운 확률로 \u0026lsquo;정답\u0026rsquo;이 툭 튀어나오도록 유도하는 것입니다. 이 간섭의 과정을 잘 설계하는 것이야말로 양자 프로그래밍의 정수입니다.\n제3장: 어떻게 계산하는가? \u0026lsquo;양자 게이트\u0026rsquo;와 \u0026lsquo;양자 회로\u0026rsquo; 고전 컴퓨터가 논리 게이트(AND, OR, NOT 등)를 사용하여 계산을 진행하는 것처럼, 양자 컴퓨터도 \u0026lsquo;양자 게이트(Quantum Gates)\u0026rsquo; 라는 조작을 양자 비트에 적용하여 계산을 진행합니다. 여러 양자 게이트를 조합한 것을 ** 양자 회로(Quantum Circuit)** 라고 부릅니다.\n양자 비트의 상태는 \u0026lsquo;블로흐 구면(Bloch sphere)\u0026lsquo;이라는 3차원 구체의 표면 위 점으로 수학적으로 표현됩니다. 북극이 \u0026lsquo;0\u0026rsquo;, 남극이 \u0026lsquo;1\u0026rsquo;, 적도 위가 \u0026lsquo;0과 1이 반반씩 겹쳐진 상태\u0026rsquo;입니다. 양자 게이트란 이 구의 표면에서 상태(벡터)를 회전시키는 조작에 다름 아닙니다.\n대표적인 양자 게이트를 몇 가지 소개해 보겠습니다.\n1. 아다마르 게이트(H 게이트) 고전 컴퓨터에는 존재하지 않는, 양자 컴퓨터만의 가장 기본적인 게이트입니다. 상태가 완전히 \u0026lsquo;0\u0026rsquo;인 양자 비트에 H 게이트를 통과시키면 0과 1이 정확히 반반의 확률로 관측되는 \u0026lsquo;완전한 중첩 상태\u0026rsquo;(블로흐 구면에서 적도 위의 점)를 만들어 냅니다. 양자 계산의 초기화 단계로서 많은 알고리즘이 먼저 이 H 게이트를 모든 양자 비트에 적용하는 것에서 시작합니다.\n2. 파울리 게이트(X, Y, Z 게이트) 고전 컴퓨터의 NOT 게이트(0을 1로, 1을 0으로 반전시키는 것)에 해당하는 조작을 포함하는 게이트입니다. 블로흐 구면에서 X축, Y축, Z축을 중심으로 180도 회전시키는 조작에 해당합니다. 특히 X 게이트는 북극(0)을 남극(1)으로 반전시키기 때문에 고전의 NOT 게이트와 완전히 같은 역할을 합니다. Z 게이트는 중첩의 \u0026lsquo;위상(파동의 타이밍 같은 것)\u0026lsquo;을 반전시키는 역할을 가지며, 양자 간섭을 일으키는 데 극히 중요합니다.\n3. CNOT 게이트(제어 NOT 게이트) 양자 얽힘을 만들어내기 위한 매우 중요한 게이트입니다. 2개의 양자 비트(제어 비트와 타깃 비트)를 사용합니다. \u0026lsquo;만약 제어 비트가 1이라면 타깃 비트의 상태를 반전(X 게이트)시킨다. 제어 비트가 0이라면 아무것도 하지 않는다\u0026rsquo;는 동작을 합니다. 언뜻 보면 단순한 IF 조건 분기 같지만, 제어 비트가 \u0026lsquo;0과 1의 중첩 상태\u0026rsquo;였다면 어떻게 될까요? 타깃 비트는 \u0026lsquo;반전된 것과 반전되지 않은 것이 겹쳐진 상태\u0026rsquo;가 되어 두 비트의 운명이 완전히 연결됩니다. 멋지게 두 양자 비트가 \u0026lsquo;얽히게\u0026rsquo; 되는 것입니다.\n이러한 게이트들을 음악의 악보처럼 왼쪽에서 오른쪽으로 순서대로 배치하고 적용해 나감으로써 복잡한 알고리즘을 실행합니다.\n제4장: 양자 컴퓨터는 무엇을 잘하고, 무엇을 못하는가? 여기서 중요한 사실을 말씀드립니다. 양자 컴퓨터는 만능의 신이 아닙니다. 웹 브라우징, 동영상 렌더링, 엑셀의 매크로 처리, 혹은 일반적인 스마트폰 앱의 동작과 같은 일상적인 작업에서 양자 컴퓨터가 고전 컴퓨터를 능가하는 일은 아마 영원히 없을 것입니다. 이러한 순차적인 처리는 이미 고도로 최적화되어 압도적인 속도와 저렴함을 자랑하는 고전 컴퓨터가 더 적합합니다.\n양자 컴퓨터가 그 진가를 발휘하는 것은 \u0026lsquo;고전 컴퓨터로는 계산 조합이 지수함수적으로 폭발하여 우주의 수명만큼의 시간이 걸려버리는 특정한 문제\u0026rsquo; 에 대해서뿐입니다. 이것을 \u0026lsquo;양자 우월성(Quantum Supremacy)\u0026rsquo; 또는 \u0026lsquo;양자 우위성(Quantum Advantage)\u0026lsquo;이라고 부릅니다.\n양자 컴퓨터가 잘하는 것(킬러 애플리케이션) 1. 소인수분해와 암호 해독(쇼어의 알고리즘) 현재 인터넷상의 안전한 통신(신용카드 결제나 개인정보 전송 등)을 지키고 있는 \u0026lsquo;RSA 암호\u0026rsquo; 등은 \u0026lsquo;거대한 수의 소인수분해는 고전 컴퓨터로는 실질적으로 불가능(방대한 시간이 걸림)하다\u0026rsquo;는 전제에 기반하고 있습니다. 하지만 1994년 수학자 피터 쇼어가 발견한 \u0026lsquo;쇼어의 알고리즘\u0026rsquo;을 사용하면, 양자 컴퓨터는 간섭을 교묘하게 이용하여 이를 극적인 속도(다항 시간)로 풀 수 있습니다. 이로 인해 장래에 현재의 암호 체계가 붕괴할 위험이 있어 전 세계의 중앙은행과 정부 기관이 \u0026lsquo;양자 내성 암호(Post-Quantum Cryptography)\u0026lsquo;로의 전환을 서두르고 있습니다.\n2. 양자 화학 계산과 신소재·신약 개발 자연계의 분자나 원자의 움직임은 애초에 양자역학의 법칙을 따르고 있습니다. 고전 컴퓨터로 복잡한 분자의 움직임을 시뮬레이션하려고 하면 전자 간의 상호작용 조합이 폭발하여 비교적 작은 분자라도 계산량의 한계에 부딪힙니다. 노벨 물리학상 수상자인 리처드 파인만이 \u0026ldquo;자연을 시뮬레이션하고 싶다면 양자역학적으로 만들어야 한다\u0026quot;고 말했듯, 양자 컴퓨터는 물질 시뮬레이션에서 압도적인 네이티브 파워를 발휘합니다. 획기적인 신약 설계, 상온 초전도 물질 발견, 고효율 태양전지 및 배터리 재료 개발, 에너지 효율이 높은 비료 합성 등 인류의 과제를 해결할 돌파구가 기대되고 있습니다.\n3. 조합 최적화 문제와 탐색(그로버의 알고리즘) 방대한 선택지 중에서 최적의 것을 찾아내는 문제(물류의 최적화 경로, 금융 포트폴리오 최적화 등)에 대해서도 양자 알고리즘은 힘을 발휘합니다. \u0026lsquo;그로버의 알고리즘\u0026rsquo;을 사용하면 데이터가 정리되지 않은 데이터베이스에서의 검색에서 고전 컴퓨터의 루트(제곱근) 횟수로 목적하는 데이터를 찾아낼 수 있습니다. 예를 들어 1억 건의 데이터가 있다면 고전에서 최대 1억 번 걸리는 탐색을 불과 1만 번 정도로 완료할 수 있게 됩니다.\n제5장: 앞을 가로막는 하드웨어의 벽 \u0026lsquo;결어어긋남\u0026rsquo;과 \u0026lsquo;양자 오류 정정\u0026rsquo; 이론적으로는 마법처럼 강력한 양자 컴퓨터이지만, 상용화로 가는 길에는 극도로 높고 험난한 물리적인 벽이 가로막고 있습니다. 최대의 적은 \u0026lsquo;노이즈\u0026rsquo; 입니다.\n양자 비트의 \u0026lsquo;중첩\u0026rsquo;이나 \u0026lsquo;양자 얽힘\u0026rsquo;은 극도로 섬세하고 부서지기 쉬운 상태입니다. 주위의 아주 작은 열, 전자기파의 흔들림, 혹은 우주선 등에 닿기만 해도 그 마법의 상태는 순식간에 붕괴하고 그저 고전 비트가 되어 버립니다. 이 현상을 \u0026lsquo;디코히어런스(결어어긋남, 양자 붕괴)\u0026rsquo; 라고 부릅니다.\n물리적인 구현 방식의 치열한 경쟁 현재 이 섬세 양자 비트를 물리적으로 어떻게 만들 것인지에 대해 전 세계에서 다양한 방식이 연구되고 있으며, 패권 다툼이 일어나고 있습니다.\n초전도 방식(Superconducting) : Google, IBM, Amazon 등이 채택. 루프 형태의 초전도 회로를 사용하며, 절대영도(약 -273℃)에 가까운 극저온까지 거대한 냉동기로 냉각시켜 양자 상태를 제어합니다. 현재 가장 앞서 있고 양자 비트 수를 늘리기 쉬운 방식이지만, 냉각 장치가 거대하고 비쌉니다. 이온 트랩 방식(Trapped Ion) : IonQ, Quantinuum 등이 채택. 진공 중에 이온(원자)을 전자기장으로 가두고 정밀한 레이저를 쏘아 제어합니다. 모든 양자 비트가 균일하고 상태를 오래 유지할 수 있는(코히어런스 시간이 긴) 것이 강점이지만, 조작 속도가 초전도에 비해 느리다는 과제가 있습니다. 광양자 방식(Photonic) : PsiQuantum 등이 주력. 빛의 입자(광자)를 사용합니다. 극저온 환경을 필요로 하지 않고 실온에서 동작하는 부분이 많으며, 기존의 실리콘 칩 제조 기술이나 광섬유 통신 기술과 상성이 좋다는 큰 장점이 있습니다. 위상 방식(Topological) : Microsoft가 오랜 기간 연구. 애니온이라 불리는 특수한 입자의 위상기하학적(토폴로지) 성질을 이용하여, 환경 노이즈에 대해 근본적으로 강한(오류가 발생하기 어려운) 양자 비트를 만들려는 야심 찬 접근법입니다. 이론상으로는 최강이지만 물리적인 구현의 장애물이 가장 높다고 알려져 있습니다. 궁극의 목표 \u0026lsquo;결함 허용 양자 컴퓨터(FTQC)\u0026lsquo;로 가는 길 현재 우리가 쓰는 고전 컴퓨터의 세계에도 계산 오류(우주선에 의한 비트 반전 등)는 존재하지만, \u0026lsquo;오류 정정 코드\u0026rsquo;를 통해 완벽하게 수정되고 있기 때문에 우리는 단 한 번도 오류를 의식하지 않고 스마트폰을 사용할 수 있습니다. 양자 컴퓨터에서도 실용적인 대규모 계산을 수행하려면 동일한 \u0026lsquo;양자 오류 정정(Quantum Error Correction: QEC)\u0026rsquo; 이 필수적입니다.\n하지만 양자 상태는 \u0026lsquo;관측하면 깨진다\u0026rsquo;는 성질이 있기 때문에 오류를 확인하기 위해 내용을 직접 볼(관측할) 수 없다는 치명적인 딜레마가 있습니다. 이를 회피하기 위해 다수의 불안정한 \u0026lsquo;물리 양자 비트\u0026rsquo;를 교묘하게 조합하여 오류를 감지하고 수정할 수 있는 1개의 안정된 \u0026lsquo;논리 양자 비트\u0026rsquo;를 구축하는 이론이 확립되어 있습니다(표면 부호 등). 그러나 1개의 논리 양자 비트를 만들기 위해 1000～1만 개의 물리 양자 비트가 필요하다고 합니다. 수천 개의 논리 양자 비트를 사용하여 쇼어의 알고리즘 등을 실행하려면 전체적으로 수백만에서 수천만 개의 물리 양자 비트를 가진 거대한 시스템이 필요해집니다.\n현재 우리가 있는 시기는 NISQ(Noisy Intermediate-Scale Quantum: 노이즈가 있는 중규모 양자) 디바이스의 시대라고 불립니다. 오류 정정을 갖추지 못하고 수십～수백 양자 비트로 작동하는 과도기적인 기계입니다. 궁극의 목표인 완전히 오류 정정이 가능한 \u0026lsquo;결함 허용 양자 컴퓨터(Fault-Tolerant Quantum Computer: FTQC)\u0026rsquo; 의 실현에는 아직 10년～수십 년이라는 장기적인 연구 개발이 필요하다고 전문가들은 예측하고 있습니다.\n제6장: 양자 컴퓨터의 역사와 미래 전망 마지막으로 양자 컴퓨터가 어떻게 탄생했고 앞으로 어디를 향해 갈 것인지 조망해 보겠습니다.\n이론의 탄생부터 \u0026lsquo;양자 우월성\u0026rsquo; 실증까지 1980년대 : 물리학자 폴 베니오프와 리처드 파인만이 양자역학의 원리를 이용한 컴퓨터의 개념을 제창. \u0026ldquo;자연을 시뮬레이션하려면 양자역학을 사용해라\u0026quot;라는 말이 시발점이 되었습니다. 1994년 : 피터 쇼어가 소인수분해의 양자 알고리즘(쇼어의 알고리즘)을 발표. 세계에 충격을 주고 막대한 연구 자금이 흘러 들어가는 계기가 됩니다. 1996년 : 로브 그로버가 데이터 검색을 고속화하는 그로버의 알고리즘을 발표. **2019년 ** : 역사적인 이정표. Google이 53 양자 비트의 초전도 프로세서 \u0026lsquo;Sycamore\u0026rsquo;를 사용하여, 고전 슈퍼컴퓨터로 1만 년이 걸릴(것으로 여겨졌던) 난수 생성의 검증 계산을 약 200초 만에 완료했다고 발표. 세계 최초의 \u0026lsquo;양자 우월성(Quantum Supremacy)\u0026rsquo; 실증 선언으로 큰 화제를 불렀습니다(이후 IBM 등이 고전 슈퍼컴퓨터 측의 알고리즘을 개선하여 며칠 만에 계산 가능하다고 반론하는 등 뜨거운 논쟁이 오갔습니다). 2023년 이후 : IBM이 1000 양자 비트를 넘는 프로세서 \u0026lsquo;Condor\u0026rsquo;를 발표. 또한 하버드 대학 등이 \u0026lsquo;논리 양자 비트\u0026rsquo;의 생성과 조작에 성공하는 등 오류 정정 기술의 초기 실증이 속속 보고되기 시작하고 있습니다. 차세대 테크놀로지를 향하여 양자 컴퓨터는 단순한 \u0026lsquo;클럭 수가 빠른 차세대 CPU\u0026rsquo;가 아닙니다. 계산이라는 행위 자체의 개념을 미시 세계를 지배하는 양자역학의 규칙으로 근본부터 다시 쓰는, 그야말로 정보 과학에서의 패러다임 시프트입니다.\n우리가 살아가는 동안 주머니에 들어가는 \u0026lsquo;퍼스널 양자 스마트폰\u0026rsquo;을 가지게 될 일은 없을 것입니다(그럴 필요도 없습니다). 하지만 AWS나 Azure 같은 클라우드 네트워크 너머에 있는 거대한 양자 데이터 센터가 어느 날 갑자기 불치병의 특효약을 발견하거나, 지구 온난화를 해결할 꿈의 클린 에너지 재료(예를 들어 상온에서 대기 중의 질소로부터 암모니아를 합성하는 촉매 등)를 도출해내는 미래는 확실히 다가오고 있습니다.\n지금은 아직 거대한 진공관의 열로 방 안이 더워지면서 천공 카드로 움직이던 1940년대의 에니악(ENIAC)과 같은 여명기에 해당합니다. 하지만 전 세계 최고 수준의 연구자들과 엔지니어들이 지혜를 짜내며 매일같이 기술적인 돌파구가 보고되고 있습니다. 이 새로운 \u0026lsquo;계산의 여명\u0026rsquo;이 진화하는 과정을 실시간으로 목격할 수 있는 우리는 역사상 매우 흥미진진한 시대를 살고 있다고 할 수 있겠습니다.\n양자의 세계로 향하는 문은 이제 막 열렸을 뿐입니다. 앞으로의 동향에서 눈을 뗄 수 없습니다.\n이 기사는 양자 컴퓨팅의 기본 개념을 비즈니스맨이나 기술에 관심이 있는 일반인을 위해 알기 쉽게 해설하는 것을 목적으로 하고 있습니다. 엄밀한 수학적·물리학적 정의(브라-켓 표기법이나 복소 확률 진폭의 세부 사항 등)에서는 일부 간략화된 부분이 있음을 양해 바랍니다.\n","date":"2026-09-05T22:10:00+09:00","image":"http://kenji.blog/p/quantum-computer-basics/quantum_basics_eyecatch_1788613712487_huf997c6e55368509d0617b56f68899854_1084950_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/ko/p/quantum-computer-basics/","title":"【완전 해부】 양자 컴퓨터란 무엇인가? ~기초부터 아는 궁극의 계산 원리~"},{"content":"들어가며: 양자 컴퓨터가 가져올 암호 기술에 대한 \u0026lsquo;위협\u0026rsquo; 현재 우리가 인터넷상에서 일상적으로 수행하는 통신——온라인 뱅킹 결제, 웹사이트 탐색(HTTPS), 메시지 앱에서의 주고받기, 그리고 블록체인이나 암호화폐 거래에 이르기까지——그 중 많은 것들이 \u0026lsquo;공개키 암호\u0026rsquo;라고 불리는 기술에 의해 보호받고 있습니다. 구체적으로는 RSA 암호나 타원곡선 암호(ECC)와 같은 알고리즘이 현대 디지털 사회의 신뢰성을 지탱하는 근간이 되고 있습니다.\n이러한 암호 방식은 \u0026lsquo;거대한 수의 소인수 분해\u0026rsquo;나 \u0026lsquo;이산 대수 문제\u0026rsquo;와 같이, 현재의 고전적 컴퓨터(슈퍼컴퓨터를 포함한)로는 푸는 데 천문학적인 시간이 걸리는 수학적 난제를 안전성의 근거로 삼고 있습니다. 하지만 최근 눈부신 발전을 거듭하고 있는 \u0026lsquo;양자 컴퓨터\u0026rsquo; 가 실용화되면 이러한 전제가 근본부터 뒤집히게 됩니다.\n1994년 피터 쇼어(Peter Shor)가 발표한 \u0026lsquo;쇼어의 알고리즘\u0026rsquo;은 충분한 성능을 가진 양자 컴퓨터를 이용하면 소인수 분해나 이산 대수 문제를 극히 짧은 시간에 풀 수 있음을 수학적으로 증명했습니다. 이는 곧 현재의 인터넷을 보호하고 있는 암호 통신이 장래에는 모두 해독되어 버릴 위험(Y2Q: Years to Quantum, 또는 Q-Day라고 불리는 문제)을 의미합니다.\n더욱 심각한 것은 \u0026lsquo;Harvest Now, Decrypt Later(지금 데이터를 훔쳐서 축적하고, 장래에 암호를 풀 수 있게 되었을 때 해독한다)\u0026lsquo;라는 공격 수법의 존재입니다. 국가 기밀정보나 기업의 지적 재산, 개인 생체정보 등 수십 년에 걸쳐 기밀성을 유지해야 하는 데이터는 이미 현재, 미래의 해독을 전제로 한 탈취의 대상이 되고 있을 가능성이 있습니다.\n이 미증유의 위기에 대응하기 위해 전 세계의 암호 학자나 연구 기관이 총력을 기울여 개발을 진행하고 있는 것이, 양자 컴퓨터의 공격에 대해서도 안전성을 유지할 수 있는 차세대 암호 기술, 양자 내성 암호(PQC: Post-Quantum Cryptography) 입니다. 본 기사에서는 PQC의 기초부터 주요 알고리즘의 구조, 그리고 미국 국립표준기술연구소(NIST)가 추진하는 세계적인 표준화의 최신 동향까지 자세히 해설합니다.\n양자 내성 암호(PQC)란 무엇인가? 양자 내성 암호(Post-Quantum Cryptography, PQC)란, 기존의 고전적 컴퓨터상에서도 동작하며 장래에 등장할 대규모 양자 컴퓨터에 의한 공격(쇼어의 알고리즘 등)에 대해서도 내성을 갖도록 설계된 암호 알고리즘의 총칭입니다.\n자주 혼동하기 쉬운 기술로 \u0026lsquo;양자 암호(Quantum Cryptography)\u0026lsquo;나 \u0026lsquo;양자 키 분배(QKD)\u0026lsquo;가 있습니다만, 이들은 전혀 다른 접근 방식입니다. 양자 암호(QKD)는 양자 역학의 물리 법칙(관측하면 상태가 변화하는 성질 등)을 이용하여 통신 경로상의 도청을 물리적으로 불가능하게 만드는 하드웨어 기반 기술입니다. 전용 광케이블이나 특수 기기가 필요하며, 도입 비용이나 거리 제한이라는 과제가 있습니다.\n반면, PQC는 어디까지나 \u0026lsquo;수학\u0026rsquo;을 기반으로 한 소프트웨어 기반의 암호 기술 입니다. 따라서 기존의 인터넷 인프라, 서버, 스마트폰, 브라우저 등에 소프트웨어 업데이트로 통합하는 것이 가능하여, 현실 사회로의 적용성이 매우 높은 것이 특징입니다. 전 세계의 IT 기업이나 정부 기관은 현재 사용하고 있는 RSA나 ECC를 이 PQC로 교체(마이그레이션)하는 것을 급선무로 삼고 있습니다.\nPQC를 지탱하는 4가지 주요 수학적 접근 양자 컴퓨터를 사용해도 효율적으로 풀 수 없는 수학적 난제(NP 난해 문제 등)를 기반으로 다양한 PQC 알고리즘이 제안되고 있습니다. 여기에서는 현재 주류가 되고 있는 주요 4가지 카테고리를 소개합니다.\n양자 내성 암호(PQC)의 주요 접근 방식 1 2 3 4 5 6 7 8 9 10 11 12 graph LR PQC[양자 내성 암호 PQC] --\u0026gt; L[격자 기반 암호 Lattice-based] PQC --\u0026gt; H[해시 기반 암호 Hash-based] PQC --\u0026gt; M[다변수 다항식 암호 Multivariate] PQC --\u0026gt; C[부호 기반 암호 Code-based] L --\u0026gt; L1(FIPS 203: ML-KEM) L --\u0026gt; L2(FIPS 204: ML-DSA) H --\u0026gt; H1(FIPS 205: SLH-DSA) style PQC fill:#f9f,stroke:#333,stroke-width:2px 1. 격자 기반 암호(Lattice-based Cryptography) 현재 PQC 분야에서 가장 유망하게 여겨지며 주류가 되고 있는 것이 이 \u0026lsquo;격자 암호\u0026rsquo;입니다. 격자 암호는 다차원 공간에 규칙적으로 배열된 점(격자점)에 관한 문제를 안전성의 근거로 삼고 있습니다. 유명한 문제로는 \u0026lsquo;최단 벡터 문제(SVP: Shortest Vector Problem)\u0026lsquo;나 \u0026lsquo;LWE 문제(Learning With Errors)\u0026rsquo; 등이 있습니다.\n구조 개요: 매우 차원이 높은(수백～수천 차원) 공간 내에 무수히 많은 점이 격자 모양으로 배열되어 있다고 상상해 보십시오. 어느 특정 격자점을 찾는 것은 2차원이나 3차원이라면 간단하지만, 수백 차원이 되면 고전 컴퓨터든 양자 컴퓨터든 효율적으로 찾아내는 알고리즘은 발견되지 않았습니다. 특히 LWE 문제는 \u0026lsquo;연립 일차 방정식에 의도적으로 작은 노이즈(오차)를 더하면, 원래 변수를 추측하는 것이 극적으로 어려워진다\u0026rsquo;는 성질을 이용하고 있습니다.\n장점:\n키 캡슐화(KEM)와 디지털 서명 모두에 적용 가능. 처리 속도가 매우 빠름(RSA나 ECC보다 빠를 수도 있음). 키 크기나 암호문 크기가 비교적 작고 균형이 좋음. 현재 NIST가 표준화하고 있는 알고리즘의 상당수(ML-KEM이나 ML-DSA 등)가 이 격자 기반 암호를 채택하고 있습니다.\n2. 해시 기반 암호(Hash-based Cryptography) 해시 기반 암호는 디지털 서명에 특화된 PQC 알고리즘입니다. 안전성의 근거는 SHA-2나 SHA-3과 같은 안전한 \u0026lsquo;암호학적 해시 함수\u0026rsquo;가 가진 충돌 내성이나 일방향성에만 의존합니다.\n구조 개요: \u0026lsquo;램포트 서명(Lamport Signature)\u0026lsquo;이라고 불리는, 한 번밖에 쓸 수 없는 일회용 서명 방식(원타임 서명)을 출발점으로 삼습니다. 이를 \u0026lsquo;머클 트리(Merkle Tree)\u0026lsquo;라고 불리는 트리 구조의 데이터 형식으로 묶음으로써, 1개의 키 쌍으로 여러 번의 서명을 가능하게 합니다.\n장점:\n보안의 근거가 지극히 견고하며, \u0026lsquo;해시 함수가 안전한 한 안전하다\u0026rsquo;는 강력한 증명이 있음. 수학적 구조에 대한 의존이 적어, 예기치 않은 해독법이 발견될 위험이 낮음. 단점:\n키 캡슐화(KEM)에는 사용할 수 없으며 디지털 서명에만 가능. 서명 크기가 커지는 경향이 있음. \u0026lsquo;상태 저장(Stateful)\u0026lsquo;과 \u0026lsquo;상태 비저장(Stateless)\u0026lsquo;이 있으며, 상태 저장(XMSS 등)은 키 사용 횟수를 엄격히 관리해야 하므로 구현 난이도가 높음. NIST는 상태 비저장 해시 기반 서명으로 \u0026lsquo;SLH-DSA(구 SPHINCS+)\u0026lsquo;를 표준화하고 있습니다.\n3. 다변수 다항식 기반 암호(Multivariate Cryptography) 다변수 다항식 암호는 다수의 변수를 가진 연립 이차 다항식 시스템을 푸는 것의 어려움(MQ 문제: Multivariate Quadratic problem)을 안전성의 근거로 삼는 방식입니다. 이 문제는 NP 난해인 것으로 알려져 있습니다.\n구조 개요: 송신자는 공개키로 전달된 다수의 변수를 가진 복잡한 방정식에 평문(또는 해시값)을 대입하여 암호문(서명)을 작성합니다. 정당한 수신자는 비밀키로서 \u0026lsquo;방정식의 구조를 쉽게 풀 수 있는 형태로 변환하는 숨겨진 정보(트랩도어)\u0026lsquo;를 가지고 있으며, 이를 사용하여 복호화(또는 서명 검증)를 수행합니다.\n장점:\n서명 크기가 매우 작음. 서명 검증 속도가 지극히 빠름. 리소스가 제한된 IoT 디바이스 등에 적합. 단점:\n공개키 크기가 매우 큼(수십 킬로바이트～수백 킬로바이트가 될 수도 있음). 과거에 유력한 알고리즘(Rainbow 등)이 고전적인 공격에 의해 파훼된 사례가 있어, 안전성에 대한 신뢰를 확립하는 것이 다른 방식에 비해 어려운 측면이 있음. 4. 부호 기반 암호(Code-based Cryptography) 부호 기반 암호는 통신 경로상의 오류를 정정하기 위해 사용되는 \u0026lsquo;오류 정정 부호\u0026rsquo; 이론을 암호에 응용한 것입니다. 1978년에 제안된 \u0026lsquo;매켈리스(McEliece) 암호\u0026rsquo;가 가장 유명하며, PQC 중에서도 가장 역사가 깊은 것 중 하나입니다.\n구조 개요: 송신자는 수신자의 공개키(특정 구조를 은폐한 오류 정정 부호의 생성 행렬)를 이용하여 평문을 인코딩하고, 의도적인 오류(노이즈)를 추가하여 전송합니다. 수신자는 비밀키를 사용하여 오류를 제거하고 평문을 꺼냅니다. 암호 해독자는 구조를 모르는 단순한 무작위 부호에서 오류 정정을 해야 하며, 이는 \u0026lsquo;일반적 신드롬 복호 문제\u0026rsquo;로 불리며 NP 난해임이 증명되어 있습니다.\n장점:\n40년 이상의 긴 세월 동안 철저하게 연구되어, 지금까지 유효한 공격이 발견되지 않았으므로 안전성의 신뢰성이 극히 높음. 암호화·복호화 처리가 빠름. 단점:\n공개키 크기가 매우 거대함(수 메가바이트가 될 수도 있음). 따라서 통신 대역이나 메모리에 제한이 있는 환경(TLS 핸드셰이크 등)에서의 이용이 어려움. NIST에 의한 PQC 표준화의 최신 동향 미국 국립표준기술연구소(NIST)는 2016년부터 전 세계를 대상으로 차세대 양자 내성 암호 알고리즘의 공모를 개시하여, 수년간에 걸친 엄격한 평가와 라운드를 거듭해 왔습니다.\n2024년, NIST는 마침내 정식 연방 정보 처리 표준(FIPS)으로서 다음의 3가지 알고리즘을 발표했습니다. 이로써 전 세계의 조직이 프로덕션 환경에서 구현을 시작하기 위한 견고한 토대가 완성된 셈입니다.\n제정된 FIPS 표준 (2024년) FIPS 203: ML-KEM (구 명칭: CRYSTALS-Kyber)\n용도: 키 캡슐화 메커니즘(KEM) / 암호화·키 공유 기반 기술: 격자 암호(Module-LWE) 특징: 키 크기나 속도의 밸런스가 매우 좋아, 웹 통신(TLS)이나 안전한 메시징 앱 등 일반적인 인터넷 용도의 기본 PQC 키 공유로 기능합니다. FIPS 204: ML-DSA (구 명칭: CRYSTALS-Dilithium)\n용도: 디지털 서명 기반 기술: 격자 암호(Module-LWE) 특징: 디지털 서명의 주요 표준. 효율적인 처리가 가능하여, 소프트웨어 서명이나 문서 인증 등 모든 전자 서명 용도의 새로운 표준이 됩니다. FIPS 205: SLH-DSA (구 명칭: SPHINCS+)\n용도: 디지털 서명 기반 기술: 해시 기반 암호(상태 비저장) 특징: 만약 장래에 격자 암호에서 취약성이 발견될 경우의 백업으로 기능하기 때문에 극히 중요한 역할을 담당합니다. 서명 크기는 커지지만, 장기적인 신뢰성이 요구되는 용도에 적합합니다. 더욱 다양한 방식의 추구 NIST는 최초의 표준화 프로세스를 완료한 한편, 더 많은 알고리즘의 탐색을 계속하고 있습니다. 특히 \u0026lsquo;격자 암호\u0026rsquo;에 표준이 편중되어 있기 때문에, 알고리즘의 다양성(Crypto Diversity) 을 확보하는 것이 중요하게 여겨지고 있습니다. 키 공유의 백업 표준으로서 부호 기반 암호 등의 평가가 진행되고 있으며, PQC의 기반은 향후 더욱 견고해질 예정입니다.\nPQC로의 이행 시나리오와 과제: \u0026lsquo;암호 민첩성\u0026rsquo;의 중요성 NIST로부터 정식 표준 규격이 릴리스됨에 따라, 전 세계의 정부 기관, 금융 기관, 테크 기업은 기존의 RSA/ECC에서 PQC로의 이행(마이그레이션)을 본격화할 것입니다. NSA(미국 국가안보국) 등의 가이드라인에서도 조기 이행 완료가 권장되고 있습니다.\n하이브리드 접근법의 채택 PQC 알고리즘은 새롭기 때문에, 고전적인 암호와 비교하면 \u0026lsquo;시간의 시련\u0026rsquo;을 거치지 않았습니다. 구현에 숨어있는 버그나 새로운 공격 수법이 발견될 위험을 고려하여, 과도기에는 \u0026lsquo;하이브리드 방식\u0026rsquo; 이 권장되고 있습니다. 이는 실적이 있는 기존 암호(예: ECDHE)와 새로운 PQC(예: ML-KEM)를 조합하여 키 교환을 수행하는 방법입니다. 현재 주요 브라우저나 클라우드 서비스에서는 이 방식의 시험 도입이 급속히 진행되고 있습니다.\n암호 민첩성(Crypto-Agility)의 실현 기업이나 시스템 개발자가 향후 가장 의식해야 할 것은 \u0026lsquo;암호 민첩성(Crypto-Agility)\u0026rsquo; 의 확보입니다. 장래 알고리즘에 결함이 발견되거나 새로운 표준이 등장했을 때, 시스템을 멈추지 않고 신속하게 암호 알고리즘을 교체·업데이트할 수 있는 유연한 아키텍처 설계가 필수적입니다.\n자사 시스템 내의 \u0026lsquo;어디에서\u0026rsquo; \u0026lsquo;어떤 암호가\u0026rsquo; \u0026lsquo;무슨 목적으로\u0026rsquo; 사용되고 있는지를 정확히 파악하는 암호 인벤토리(CBOM: Cryptography Bill of Materials)의 작성이 PQC 이행을 향한 중요한 첫걸음이 됩니다.\n마무리: 다가올 \u0026lsquo;Q-Day\u0026rsquo;에 대비하여 양자 컴퓨터의 진화는 인류에게 막대한 혜택을 가져다주는 한편, 현재 디지털 사회의 근간인 암호 보안에 대한 최대의 위협이기도 합니다. 양자 내성 암호(PQC)는 더 이상 \u0026lsquo;먼 미래의 연구 주제\u0026rsquo;가 아닙니다. NIST에 의한 FIPS 표준 발행이라는 이정표를 거쳐, PQC는 본격적인 \u0026lsquo;구현과 이행\u0026rsquo; 단계로 돌입했습니다.\n\u0026lsquo;Harvest Now, Decrypt Later\u0026rsquo;의 위협을 고려한다면, 기밀성이 높은 데이터를 다루는 모든 조직에게 있어 PQC로의 이행은 \u0026lsquo;지금 당장\u0026rsquo; 착수해야 할 최우선 과제입니다. 차세대 암호 기술을 깊이 이해하고, 시스템의 암호 민첩성을 높임으로써, 다가올 양자 컴퓨터 시대를 안전하게 극복해 나갑시다.\n","date":"2026-09-05T22:09:22+09:00","image":"http://kenji.blog/p/post-quantum-cryptography/post_quantum_cryptography_1788613735417_hu9d405d830ed3e56e9e703ab601cf6c0a_1143219_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/ko/p/post-quantum-cryptography/","title":"[PQC] 양자 컴퓨터 시대의 차세대 암호 ''양자 내성 암호''의 전모"},{"content":"시작하며: 암호 기술과 양자 컴퓨터의 교차점 현대 인터넷 사회에서 통신의 비밀을 지키기 위한 기반이 되고 있는 것이 \u0026lsquo;공개키 암호\u0026rsquo;입니다. 그 중에서도 대표적인 것이 1977년 Ron Rivest, Adi Shamir, Leonard Adleman 세 사람에 의해 개발된 \u0026lsquo;RSA 암호\u0026rsquo;입니다. 우리가 매일 이용하는 온라인 쇼핑 결제, 웹사이트 열람(HTTPS), 이메일 송수신에 이르기까지 RSA 암호는 인터넷 인프라의 심장부로서 기능하고 있습니다.\n그러나 \u0026lsquo;양자 컴퓨터\u0026rsquo;의 등장으로 인해 이러한 안전성이 근본부터 뒤집힐 가능성이 지적되고 있습니다. 미디어에서는 \u0026ldquo;양자 컴퓨터가 완성되면 전 세계의 비밀번호나 암호가 몇 초 만에 해독되어 버린다\u0026quot;는 등 선정적인 헤드라인이 장식되기도 합니다. 과연 그것은 사실일까요?\n이 글에서는 고전적인 암호 해독 기법인 GNFS(일반 수체 체)와 양자 컴퓨터를 이용한 암호 해독 알고리즘의 결정판인 \u0026lsquo;쇼어의 알고리즘(Shor\u0026rsquo;\u0026rsquo;s Algorithm)\u0026lsquo;의 구조를 깊이 파헤쳐 봅니다. 양자 푸리에 변환이나 주기 발견과 같은 고도의 개념을 알기 쉽게 해설하고, 현재의 NISQ(Noisy Intermediate-Scale Quantum) 시대에 있어서 양자 하드웨어의 현황과, 실제로 RSA-2048을 깨기 위해 필요한 난관들에 대해 상세히 검증해 보겠습니다.\nRSA 암호의 근간: 소인수 분해의 어려움 RSA 암호의 안전성은 수학에서의 매우 단순한 비대칭성에 의존하고 있습니다. 그것은 \u0026ldquo;두 개의 거대한 소수를 곱하는 것은 간단하지만, 그 곱한 결과(합성수)로부터 원래의 두 소수를 찾아내는(소인수 분해하는) 것은 극히 어렵다\u0026quot;는 사실입니다.\n예를 들어, $ p = 61 $, $ q = 53 $ 이라는 두 개의 소수가 있다고 가정해 봅시다. 이 곱셈 $ N = p \\times q = 3233 $ 을 계산하는 것은 순식간입니다. 하지만 \u0026lsquo;3233\u0026rsquo;이라는 숫자만 주어지고 \u0026ldquo;이것은 어느 소수와 어느 소수의 곱셈인가?\u0026ldquo;를 푸는 것은 숫자가 커질수록 계산량이 폭발적으로 증가합니다.\n현재 주류가 되고 있는 RSA-2048에서는 키 길이가 2048비트, 즉 10진수로 약 617자리에 달하는 거대한 합성수 $ N $ 이 사용되고 있습니다. 이 $ N $ 을 소인수 분해할 수 있다면, 암호는 해독된 거나 다름없게 됩니다.\n고전 컴퓨터의 도전: GNFS (일반 수체 체) 소인수 분해 문제를 풀기 위해 수학자나 암호학자들은 오랜 세월에 걸쳐 다양한 알고리즘을 개발해 왔습니다. 그 중에서도 고전 컴퓨터에서 현재 가장 빠르다고 여겨지는 것이 일반 수체 체(GNFS: General Number Field Sieve) 입니다.\nGNFS는 거대한 수 $ N $ 을 소인수 분해하기 위해, 정수환에서의 계산을 더 추상적인 대수체(Number Field)로 확장하여 해석하는 기법입니다. 대략적인 흐름은 다음과 같습니다.\n다항식의 선택 : $ N $ 을 근으로 가지는, 적절한 차수와 계수를 가진 다항식 $ f(x) $ 를 찾습니다. 데이터 수집(체질) : 유리수체 및 대수체 위에서, 작은 소수(매끄러운 수, Smooth numbers)로 분해될 수 있는 수의 쌍을 대량으로 탐색합니다. 이 과정이 \u0026lsquo;체질(Sieving)\u0026lsquo;이라 불리며 가장 많은 시간을 필요로 하는 부분입니다. 행렬의 생성과 축약 : 수집한 관계식을 바탕으로 거대한 희소 행렬(성분의 대부분이 0인 행렬)을 생성하고, 선형대수학적 기법(블록 란초스 방법 등)을 사용하여 해를 구합니다. 제곱근의 계산 : 마지막으로 대수체 위에서 제곱근을 계산하여, $ N $ 의 인수(소인수)를 도출해 냅니다. GNFS의 계산량은 점근적으로 $ O(\\exp((\\sqrt[3]{\\frac{64}{9}} + o(1)) (\\log N)^{\\frac{1}{3}} (\\log \\log N)^{\\frac{2}{3}})) $ 로 평가됩니다. 이는 \u0026lsquo;준지수함수적(Sub-exponential)\u0026rsquo; 시간 계산량이라 불립니다. 지수 시간보다는 빠르지만, 다항 시간(Polynomial time)보다는 훨씬 느린 계산량입니다.\n실제로 2020년에는 국제적인 연구팀이 GNFS를 사용하여 RSA-250(829비트, 250자리 합성수)의 소인수 분해에 성공했습니다. 이 계산에는 전 세계의 컴퓨터 자원을 끌어모아 약 2700 CPU 코어 연도라는 방대한 계산 시간을 소모했습니다. 그러나 이것이 2048비트가 되면, 필요한 계산량은 우주의 수명의 수조 배로 부풀어 오른다고 언급되고 있어, 현재의 슈퍼컴퓨터를 아무리 병렬로 가동시킨다 해도 고전적인 기법으로는 현실적인 시간 내에 해독하는 것이 불가능합니다.\n양자 컴퓨터의 비장의 카드: 쇼어의 알고리즘 여기서 등장하는 것이 1994년 피터 쇼어(Peter Shor)에 의해 발표된 \u0026lsquo;쇼어의 알고리즘\u0026rsquo;입니다. 이 알고리즘은 소인수 분해 문제를 양자 컴퓨터 상에서 다항 시간 ( $ O((\\log N)^3) $ ) 안에 풀 수 있다는 획기적인 것이었습니다. 준지수함수적 시간과 다항 시간의 차이는 결정적인 것이며, 이론상 양자 컴퓨터를 사용하면 RSA 암호는 완전히 파괴됨을 의미합니다.\n쇼어의 알고리즘의 전체 흐름 1 2 3 4 5 6 7 8 9 10 graph TD A[소인수 분해하고 싶은 수 N을 입력] --\u0026gt; B[랜덤한 정수 a를 선택] B --\u0026gt; C{a와 N의\u0026lt;br\u0026gt;최대공약수} C --\u0026gt;|1보다 크다| D[운 좋게 소인수를 발견!] C --\u0026gt;|1 즉, 서로소| E[양자 컴퓨터의 차례] E --\u0026gt; F[함수 f_x = a^x mod N 의\u0026lt;br\u0026gt;주기 r을 양자 푸리에 변환으로 구함] F --\u0026gt; G{주기 r이 짝수 이고\u0026lt;br\u0026gt;a^r/2 ≢ -1 mod N} G --\u0026gt;|Yes| H[최대공약수 gcd_a^r/2 ± 1, N 을 계산] H --\u0026gt; I((소인수 분해 성공!)) G --\u0026gt;|No| B 쇼어의 알고리즘은 소인수 분해라는 문제를 직접 푸는 것이 아니라, 정수론의 정리를 이용하여 \u0026lsquo;주기 발견 문제(Period Finding Problem)\u0026lsquo;라는 별개의 문제로 변환하고, 그것을 양자 컴퓨터의 특성을 살려 고속으로 푸는 접근법을 취합니다.\n단계 1: 소인수 분해에서 주기 발견 문제로의 환원 (고전적 처리) 알고리즘의 첫 단계는 고전 컴퓨터에서 이루어집니다. 소인수 분해하고자 하는 수 $ N $ 에 대해, $ N $ 과 서로소인(최대공약수가 1인) 랜덤한 정수 $ a $ ( $ 1 \u003c a \u003c N $ )를 선택합니다. 만약 우연히도 최대공약수가 1이 아니라면, 그 시점에서 찾은 공약수가 $ N $ 의 소인수이므로 해독 완료이지만 확률은 극히 낮습니다.\n다음으로 이하의 모듈로 방정식 수열을 생각합니다. $ f(x) = a^x \\pmod N $\n이 함수 $ f(x) $ 에 $ x = 1, 2, 3, \\dots $ 를 대입해 가면 값은 무작위인 것처럼 보이지만, 유한한 범위 내에서 계산하고 있기 때문에 반드시 어딘가에서 원래 값으로 돌아오고 같은 수열을 반복합니다. 이 반복의 주기를 $ r $ 이라고 부릅니다. 즉, $ a^r \\equiv 1 \\pmod N $ 이 되는 최소의 양의 정수 $ r $ 을 찾는 문제, 이것이 \u0026lsquo;주기 발견 문제\u0026rsquo;입니다.\n만약 이 주기 $ r $ 이 발견되고 $ r $ 이 짝수라면, $ a^r - 1 \\equiv 0 \\pmod N $ 이 되어 인수 분해 공식을 사용하여 $ (a^{r/2} - 1)(a^{r/2} + 1) \\equiv 0 \\pmod N $ 와 같이 변형할 수 있습니다. 여기서 유클리드 호제법을 사용하여 $ N $ 과 $ a^{r/2} \\pm 1 $ 의 최대공약수를 계산함으로써, $ N $ 의 소인수를 극히 높은 확률로 얻을 수 있습니다.\n고전 컴퓨터로 주기 $ r $ 을 찾기 위해서는 결국 지수 시간적인 단계가 필요해져 고속화할 수 없습니다. 하지만 양자 컴퓨터라면 이 주기 $ r $ 을 순식간에(다항 시간 안에) 찾을 수 있는 것입니다.\n단계 2: 양자 상태의 준비와 중첩 여기서부터 양자 컴퓨터가 나설 차례입니다. 양자 컴퓨터는 \u0026lsquo;0\u0026rsquo;과 \u0026lsquo;1\u0026rsquo;의 상태를 동시에 가질 수 있는 \u0026lsquo;양자 비트(Qubit)\u0026lsquo;를 사용합니다. 쇼어의 알고리즘에서는 입력을 저장하는 레지스터(제1 레지스터)와 계산 결과를 저장하는 레지스터(제2 레지스터) 두 가지를 준비합니다.\n먼저 아다마르 게이트(Hadamard gate)라 불리는 양자 게이트 조작을 제1 레지스터의 모든 양자 비트에 적용합니다. 이로써 제1 레지스터는 생각할 수 있는 모든 $ x $ 의 값( $ 0 $ 부터 $ 2^n-1 $ 까지. $ n $ 은 충분히 큰 비트 수)의 균등한 중첩 상태 가 됩니다.\n즉, 양자 컴퓨터의 내부에는 $ x=0, 1, 2, 3, \\dots $ 이라는 무수한 입력값이 동시에 병행하여 존재하고 있는 상태가 만들어집니다.\n단계 3: 양자 모듈로 거듭제곱 (Quantum Modular Exponentiation) 다음으로 제1 레지스터의 중첩 상태를 입력으로 하여 $ f(x) = a^x \\pmod N $ 을 계산하고, 그 결과를 제2 레지스터에 저장합니다. 이 계산은 양자 회로 상의 유니터리 변환으로서 실행되기 때문에, 중첩이 유지된 채 모든 $ x $ 에 대한 $ f(x) $ 의 계산이 \u0026lsquo;동시 병행적으로(양자 병렬성)\u0026rsquo; 이루어집니다.\n이 시점에서의 양자 시스템 전체의 공간은, $ |x, a^x \\bmod N\\rangle $ 이라는 상태의 방대한 중첩으로 되어 있습니다.\n그러나 여기서 단순히 제2 레지스터를 측정(관측)해 버리면, 랜덤한 $ a^x \\bmod N $ 의 값이 단 하나만 확률적으로 선택되고, 그에 연동되어 제1 레지스터의 $ x $ 도 하나로 확정되어 버립니다. 이래서는 고전 컴퓨터로 한 번 계산한 것과 다를 바 없어, 주기 $ r $ 을 찾을 수 없습니다.\n양자역학의 규칙에서는 중첩 상태의 내용을 직접 들여다보는 것은 불가능합니다. 그렇다면 어떻게 전체의 \u0026lsquo;주기\u0026rsquo;라는 전역적인(global) 정보를 추출하는 것일까요?\n단계 4: 양자 푸리에 변환 (QFT: Quantum Fourier Transform) 이 벽을 돌파하는 쇼어 알고리즘의 진면목이 바로 제1 레지스터에 대한 양자 푸리에 변환(QFT) 의 적용입니다.\n측정을 실시하기 전에, 함수 $ f(x) $ 의 파동적 성질을 해석합니다. 제2 레지스터를 관측했다고 가정해 봅시다. 어떤 값 $ y $ 를 얻었다고 합시다. 그러면 제1 레지스터의 상태는 \u0026ldquo;$ a^x \\pmod N = y $ 가 되는 모든 $ x $ 의 중첩\u0026quot;으로 수축됩니다. 이 $ x $ 의 값은 $ x_0, x_0 + r, x_0 + 2r, x_0 + 3r, \\dots $ 와 같이 주기 $ r $ 의 간격으로 이산적으로 나열된 상태(일종의 빗 모양의 확률 진폭 분포)가 됩니다.\n이 상태에 대해 양자 푸리에 변환(QFT)을 적용합니다. 고전적인 이산 푸리에 변환이 시간 영역의 신호를 주파수 영역으로 변환하듯이, QFT는 양자 상태의 확률 진폭에 간섭을 일으킵니다.\nQFT를 걸면 양자 간섭 효과에 의해 주기 $ r $ 과 공명하지 않는(위상이 맞지 않는) 잘못된 답의 확률은 서로 상쇄되어 0에 가까워지고(상쇄 간섭), 주기 $ r $ 의 정보를 가진 올바른 답의 확률만이 증폭됩니다(보강 간섭).\n단계 5: 측정과 연분수 전개 (고전적 후처리) QFT 적용 후에 제1 레지스터를 측정하면, 매우 높은 확률로 $ c \\approx \\frac{j \\cdot 2^n}{r} $ 이라는 형태에 가까운 정수 $ c $ 를 얻게 됩니다( $ j $ 는 미지의 정수, $ 2^n $ 은 레지스터의 크기).\n이 측정 결과 $ c $ 를 고전 컴퓨터로 가져와서 $ \\frac{c}{2^n} \\approx \\frac{j}{r} $ 이라는 분수를 만듭니다. 그리고 수학적 기법인 \u0026lsquo;연분수 전개(Continued fraction expansion)\u0026lsquo;를 사용하여 근사치를 계산함으로써 분모인 주기 $ r $ 을 멋지게 찾아낼 수 있습니다.\n$ r $ 을 알게 되면, 남은 것은 단계 1의 공식을 사용하여 $ N $ 의 소인수를 계산하기만 하면 되며 RSA 암호는 완전히 해독됩니다.\n현재의 양자 컴퓨터(NISQ)의 실력과 과제 이론적으로는 완벽한 쇼어의 알고리즘이지만, \u0026ldquo;내일이라도 당장 RSA 암호가 깨지는가?\u0026ldquo;라고 묻는다면 답은 명확히 \u0026ldquo;아니오\u0026quot;입니다. 그 이유는 현재의 양자 컴퓨터의 하드웨어 기술의 한계에 있습니다.\nNISQ (Noisy Intermediate-Scale Quantum) 시대 현재 우리가 살고 있는 것은 \u0026lsquo;NISQ\u0026rsquo;라 불리는 시대입니다. NISQ 디바이스는 수십에서 수백 개의 물리 양자 비트를 가지지만, 노이즈에 대해 극히 취약합니다.\n양자 비트는 열이나 전자파 등의 외부 환경의 영향을 받기 쉬워, 양자 상태가 깨져 버리는 \u0026lsquo;결어긋남(Decoherence, 양자 얽힘 상실)\u0026lsquo;이나 게이트 조작 시의 \u0026lsquo;게이트 에러\u0026rsquo;가 빈번하게 발생합니다. 쇼어의 알고리즘과 같이 매우 깊은(연산 단계 수가 방대한) 양자 회로를 실행하려고 하면, 계산 도중에 에러가 축적되어 최종적인 출력은 의미를 가지지 않는 완전한 노이즈가 되어 버립니다.\n물리 양자 비트와 논리 양자 비트 이 에러 문제를 해결하기 위해 필수불가결한 것이 \u0026lsquo;양자 오류 정정(Quantum Error Correction)\u0026lsquo;입니다. 고전 컴퓨터에서도 오류 정정 코드가 사용되고 있지만, 양자 상태의 복제를 금지하는 \u0026lsquo;복제 불가능성 정리(No-cloning theorem)\u0026lsquo;가 있기 때문에 양자 오류 정정은 매우 복잡합니다.\n양자 오류 정정에서는 \u0026lsquo;표면 부호(Surface Code)\u0026rsquo; 등의 기술을 이용하여, 다수의 노이즈투성이인 \u0026lsquo;물리 양자 비트\u0026rsquo;를 조합함으로써 에러가 없는 이상적인 하나의 \u0026lsquo;논리 양자 비트\u0026rsquo;를 만들어 냅니다.\n현재의 에러율을 전제로 하면, 하나의 논리 양자 비트를 만들기 위해서는 약 1,000～10,000개의 물리 양자 비트가 필요해진다고 추산되고 있습니다. 이를 \u0026lsquo;오류 정정의 오버헤드\u0026rsquo;라고 부릅니다.\nRSA-2048을 파괴하기 위해 필요한 자원이란? 그렇다면 실제로 RSA-2048을 해독하기 위해, 쇼어의 알고리즘을 구동시키려면 어느 정도의 자원이 필요할까요?\nCraig Gidney (Google) 와 Martin Ekerå 의 2021년 논문에 따른 획기적인 자원 추정에 의하면, 최적화된 쇼어의 알고리즘을 사용하고 표면 부호에 의한 오류 정정을 수행할 경우 다음과 같은 자원이 필요하다고 합니다.\n논리 양자 비트 수 : 약 4,096 개 물리 양자 비트 수 ** : ** 약 2000만 개 (에러율 $10^{-3}$ 정도를 가정) 계산 시간 : 약 8시간 (물리 게이트 조작이 수백만～수십억 회 필요) 이에 반해, 현재의 양자 하드웨어의 도달점은 어떨까요? 2023년 말에 IBM이 발표한 초전도 양자 프로세서 \u0026lsquo;Condor(콘도르)\u0026lsquo;는 1,121 양자 비트입니다. 또한 논리 양자 비트의 생성과 관련된 획기적인 연구(하버드 대학이나 QuEra사 등에 의한 중성 원자 양자 컴퓨터를 이용한 48개의 논리 양자 비트 생성 등)도 등장하고 있지만, 아직 \u0026ldquo;노이즈 없는 완벽한 연산\u0026quot;을 장시간 연속으로 실행할 수 있는 단계에는 이르지 못했습니다.\n수천 개의 물리 양자 비트에서 2000만 개 의 실용적인 물리 양자 비트(게다가 상호 결선되어 극저온에서 안정적으로 동작하고 초고속으로 제어 신호를 처리할 수 있는 시스템)로의 스케일업은 공학적으로 엄청난 장벽(배선 문제, 냉각 능력의 한계, 제어 전자장치의 비대화)이 존재합니다. 많은 전문가들은 RSA-2048을 해독할 수 있는 \u0026lsquo;결함 허용(Fault-Tolerant) 양자 컴퓨터(FTQC)\u0026lsquo;가 실현되려면 적어도 10년에서 30년, 혹은 그 이상의 세월이 필요하다고 예측하고 있습니다.\n다가오는 \u0026lsquo;Store Now, Decrypt Later\u0026rsquo;의 위협과 PQC의 여명 \u0026ldquo;아직 10년 이상 걸린다면 안심이다\u0026quot;라고 생각하는 것은 시기상조입니다. 현재 국가 기밀정보나 의료 데이터, 장기적인 인프라 설계 등 수십 년 후까지 비밀을 보장해야만 하는 데이터가 존재합니다.\n여기서 우려되고 있는 것이 바로 \u0026lsquo;Store Now, Decrypt Later (지금 저장하고, 나중에 해독한다)\u0026rsquo; 는 공격 기법입니다. 악의가 있는 국가나 조직이 현재의 RSA나 ECC(타원곡선암호)로 암호화된 통신 데이터를 모두 도청하여 스토리지에 저장해 두는 것입니다. 그리고 10년 후, 20년 후에 강력한 양자 컴퓨터가 완성되는 순간에 쇼어의 알고리즘을 사용하여 과거의 데이터를 모두 해독해내어 비밀을 폭로한다는 기법입니다.\n이러한 타임 래그의 위협에 대항하기 위해 NIST(미국 국립표준기술연구소)를 중심으로 \u0026lsquo;양자 내성 암호 (PQC: Post-Quantum Cryptography)\u0026rsquo; 의 표준화 프로세스가 급피치로 진행되어 왔습니다.\nPQC는 양자 컴퓨터를 이용하더라도 해독이 곤란한(즉, 쇼어의 알고리즘을 적용할 수 없는) 수학적 문제를 기반으로 한 새로운 암호 알고리즘입니다. 주요 접근법으로는 다음과 같은 것들이 있습니다.\n격자 암호 (Lattice-based cryptography) : LWE(Learning with Errors) 문제 등을 기초로 합니다. NIST의 표준화에서 주류 (Kyber, Dilithium 등). 부호 기반 암호 (Code-based cryptography) : 오류 정정 부호의 복호 문제의 어려움에 의존합니다. 다변수 다항식 암호 (Multivariate cryptography) : 다변수의 연립 이차방정식을 푸는 어려움에 의존합니다. 해시 기반 서명 (Hash-based signatures) : 해시 함수의 안전성에만 의존하는 디지털 서명입니다. 이미 Google Chrome이나 Apple의 iMessage 등 주요 소프트웨어나 플랫폼에서는 PQC의 도입 테스트나 하이브리드 구현이 시작되었습니다.\n마치며 양자 컴퓨터는 SF 세계의 꿈 같은 이야기에서 현실적인 공학적 도전으로 넘어가고 있습니다. 쇼어의 알고리즘은 수학과 양자역학이 융합된 인류의 위대한 지적 성과이지만, 동시에 우리 디지털 사회의 기반을 뒤흔드는 \u0026lsquo;파괴적인 힘\u0026rsquo;을 간직하고 있습니다.\nRSA 암호가 내일 당장 쓰지 못하게 되는 것은 아닙니다. 하지만 양자 기술의 진화와 \u0026lsquo;Store Now, Decrypt Later\u0026rsquo;의 리스크를 감안한다면, PQC로의 이행이라는 암호 역사에 남을 대규모의 마이그레이션은 이미 시작되었습니다. 우리는 지금 정보 보안의 패러다임 시프트의 최전선을 목격하고 있는 것입니다.\n","date":"2026-09-05T22:09:21+09:00","image":"http://kenji.blog/p/shors-algorithm-and-rsa-breaking/quantum_breaking_rsa_1788613722990_huf997c6e55368509d0617b56f68899854_1017504_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/ko/p/shors-algorithm-and-rsa-breaking/","title":"양자 컴퓨터는 정말 RSA 암호를 파괴할 것인가? ~쇼어의 알고리즘과 현재의 도달점~"},{"content":"【완전 해부】 최강의 암호 해독 알고리즘 「GNFS」를 C++로 구현하여 이해하기 현대 인터넷의 근간을 지탱하는 「RSA 암호」. 그 견고함은 「거대한 합성수를 소인수분해하는 것은 현재의 컴퓨터로는 사실상 불가능하다」는 수학적 신념에 의존하고 있습니다.\n하지만 인류는 결코 포기하지 않았습니다. 현재 고전 컴퓨터(양자 컴퓨터가 아닌 일반 컴퓨터)에서 거대한 소인수분해를 수행하기 위한 **인류 최강·최첨단 알고리즘 ** 이 존재합니다. 그것이 바로 「일반 수체 체(GNFS: General Number Field Sieve)」 입니다.\n본 기사에서는 이 GNFS의 최첨단 계산 로직을 C++(Boost 라이브러리의 다정밀도 정수 boost::multiprecision을 사용)로 엄밀하게 모델화한 구현 코드를 전면 공개하고, 그 이면에 있는 「대수적 정수론」의 심연을 철저히 해설합니다.\n수학의 신비와 그것을 굴복시키는 컴퓨터 사이언스의 힘을 꼭 소스 코드와 함께 만끽하시기 바랍니다.\n1. GNFS 최첨단 로직 프레임워크 (전체 소스 코드) 먼저, 이번에 해설할 GNFS의 C++ 구현의 전모를 싣습니다. 실제 수체 체(CADO-NFS 등)는 수십만 줄에 달하는 초대형 분산 시스템이지만, 본 코드는 GNFS를 구성하는 「5가지 필수 파이프라인(단계)」 을 추출하여 클래스로 설계하고, 수학적인 의미를 잃지 않으면서 최소 구성으로 모델화한 것입니다.\n1 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 #include \u0026lt;iostream\u0026gt; #include \u0026lt;vector\u0026gt; #include \u0026lt;cmath\u0026gt; #include \u0026lt;map\u0026gt; #include \u0026lt;set\u0026gt; #include \u0026lt;chrono\u0026gt; #include \u0026lt;boost/multiprecision/cpp_int.hpp\u0026gt; // Boost.Multiprecision의 다정밀도 정수를 사용 using namespace boost::multiprecision; // ============================================================================ // [SOTA GNFS] General Number Field Sieve (일반 수체 체) 최첨단 로직 프레임워크 // // 본 코드는 CADO-NFS 등에서 사용되는 최첨단 GNFS의 5가지 파이프라인을 // C++ (Boost)의 클래스 설계로서 엄밀하게 모델화한 것입니다. // ============================================================================ struct Relation { int64_t a; int64_t b; std::vector\u0026lt;uint32_t\u0026gt; rational_primes; std::vector\u0026lt;uint32_t\u0026gt; algebraic_primes; }; // ============================================================================ // Phase 1: Polynomial Selection (KleinJung의 알고리즘) // ============================================================================ class PolynomialSelector { public: int degree; std::vector\u0026lt;cpp_int\u0026gt; f; // 대수 측 다항식 f(x) std::vector\u0026lt;cpp_int\u0026gt; g; // 유리 측 다항식 g(x) = x - m cpp_int m; PolynomialSelector(int d) : degree(d) {} // base-m 전개를 기반으로 한 초기 다항식 생성 (실제로는 더 고도화된 격자 기저 축소 LLL을 사용) void select(const cpp_int\u0026amp; N) { std::cout \u0026lt;\u0026lt; \u0026#34;[Phase 1] Polynomial Selection (Degree \u0026#34; \u0026lt;\u0026lt; degree \u0026lt;\u0026lt; \u0026#34;) starting...\u0026#34; \u0026lt;\u0026lt; std::endl; // 간단한 base-m 전개 (d차) // m = N^(1/d) cpp_int N_copy = N; m = 1; // 간단한 m의 근사 (Boost 함수를 사용하지 않는 근사) cpp_int low = 1, high = N; while (low \u0026lt;= high) { cpp_int mid = low + (high - low) / 2; cpp_int p = 1; for(int i=0; i\u0026lt;degree; ++i) p *= mid; if (p \u0026lt;= N) { m = mid; low = mid + 1; } else { high = mid - 1; } } f.resize(degree + 1); cpp_int temp = N; for (int i = 0; i \u0026lt;= degree; ++i) { f[i] = temp % m; temp /= m; } g = {-m, 1}; // g(x) = x - m std::cout \u0026lt;\u0026lt; \u0026#34; -\u0026gt; m = \u0026#34; \u0026lt;\u0026lt; m \u0026lt;\u0026lt; std::endl; std::cout \u0026lt;\u0026lt; \u0026#34; -\u0026gt; f(x) = \u0026#34;; for(int i = degree; i \u0026gt;= 0; --i) { std::cout \u0026lt;\u0026lt; f[i] \u0026lt;\u0026lt; \u0026#34;x^\u0026#34; \u0026lt;\u0026lt; i \u0026lt;\u0026lt; (i \u0026gt; 0 ? \u0026#34; + \u0026#34; : \u0026#34;\u0026#34;); } std::cout \u0026lt;\u0026lt; \u0026#34;\\n[Phase 1] Complete.\u0026#34; \u0026lt;\u0026lt; std::endl; } }; // ============================================================================ // Phase 2: Lattice Sieving (격자 체) // ============================================================================ // 최근의 GNFS는 Line Sieve(직선 체)가 아닌 Franke-Kleinjung 등이 제안한 // 특수 q 격자 체 (Special-q Lattice Sieving)를 사용하는 것이 사실상 표준(de facto standard)입니다. class LatticeSieve { uint32_t rational_bound; uint32_t algebraic_bound; std::vector\u0026lt;uint32_t\u0026gt; rational_fb; std::vector\u0026lt;uint32_t\u0026gt; algebraic_fb; public: LatticeSieve(uint32_t rb, uint32_t ab) : rational_bound(rb), algebraic_bound(ab) {} void generate_factor_bases() { std::cout \u0026lt;\u0026lt; \u0026#34;[Phase 2] Generating Factor Bases (Rational Bound: \u0026#34; \u0026lt;\u0026lt; rational_bound \u0026lt;\u0026lt; \u0026#34;, Algebraic Bound: \u0026#34; \u0026lt;\u0026lt; algebraic_bound \u0026lt;\u0026lt; \u0026#34;)\u0026#34; \u0026lt;\u0026lt; std::endl; // (생략) 실제로는 소수 생성 및 르장드르 기호 등으로 필터링을 수행 } std::vector\u0026lt;Relation\u0026gt; sieve(const PolynomialSelector\u0026amp; poly) { std::cout \u0026lt;\u0026lt; \u0026#34;[Phase 2] Special-q Lattice Sieving active...\u0026#34; \u0026lt;\u0026lt; std::endl; std::vector\u0026lt;Relation\u0026gt; relations; // 모의 구현: 실제 격자 체는 수백 GB의 메모리 공간을 블록 단위로 스캔한다. // (a, b)의 쌍을 특수 소수 q마다의 격자 (a = i*q + j*...) 에 매핑하고, // 캐시 효율을 극한까지 높인 체(Sieve)를 실행한다. // 데모용으로 더미 관계식(relation)을 1개 추가 Relation r; r.a = 17; r.b = 3; r.rational_primes = {2, 5}; r.algebraic_primes = {3, 7}; relations.push_back(r); std::cout \u0026lt;\u0026lt; \u0026#34;[Phase 2] Found \u0026#34; \u0026lt;\u0026lt; relations.size() \u0026lt;\u0026lt; \u0026#34; relations.\u0026#34; \u0026lt;\u0026lt; std::endl; return relations; } }; // ============================================================================ // Phase 3: Filtering (특이점 제거 및 클리크 병합) // ============================================================================ class Filter { public: void reduce_matrix(std::vector\u0026lt;Relation\u0026gt;\u0026amp; relations) { std::cout \u0026lt;\u0026lt; \u0026#34;[Phase 3] Filtering Relations...\u0026#34; \u0026lt;\u0026lt; std::endl; // 1. Singleton removal (1번밖에 출현하지 않는 소수를 가진 관계식 삭제) // 2. Clique merging (희소 행렬을 조밀하게 만들기 위한 관계식 결합) // 실제로는 Union-Find 알고리즘 등으로 수억 행의 행렬을 수백만 행까지 압축한다. std::cout \u0026lt;\u0026lt; \u0026#34;[Phase 3] Matrix size reduced optimally.\u0026#34; \u0026lt;\u0026lt; std::endl; } }; // ============================================================================ // Phase 4: Linear Algebra over GF(2) (Block Wiedemann 법) // ============================================================================ class LinearAlgebraGF2 { public: // 최근의 슈퍼컴퓨터 환경에서는 Block Lanczos 법보다 분산 컴퓨팅에 // 적합한 Block Wiedemann 법(Coppersmith 구현)이 최첨단 기술로 사용된다. std::vector\u0026lt;std::vector\u0026lt;int\u0026gt;\u0026gt; solve_nullspace(const std::vector\u0026lt;Relation\u0026gt;\u0026amp; relations) { std::cout \u0026lt;\u0026lt; \u0026#34;[Phase 4] Block Wiedemann algorithm over GF(2) starting...\u0026#34; \u0026lt;\u0026lt; std::endl; // 스파스(희소) 행렬과 벡터의 곱셈 연산을 반복하여, // M * x = 0 mod 2 가 되는 해 벡터(커널)를 여러 개 찾는다. std::vector\u0026lt;std::vector\u0026lt;int\u0026gt;\u0026gt; dependencies; // 의존 관계 리스트 // 더미 데이터 dependencies.push_back({0}); std::cout \u0026lt;\u0026lt; \u0026#34;[Phase 4] Found \u0026#34; \u0026lt;\u0026lt; dependencies.size() \u0026lt;\u0026lt; \u0026#34; linear dependencies (perfect squares).\u0026#34; \u0026lt;\u0026lt; std::endl; return dependencies; } }; // ============================================================================ // Phase 5: Algebraic Square Root (대수적 제곱근) // ============================================================================ class AlgebraicSquareRoot { public: void compute_and_factor(const std::vector\u0026lt;Relation\u0026gt;\u0026amp; relations, const std::vector\u0026lt;int\u0026gt;\u0026amp; dep, const cpp_int\u0026amp; N) { std::cout \u0026lt;\u0026lt; \u0026#34;[Phase 5] Algebraic Square Root computation...\u0026#34; \u0026lt;\u0026lt; std::endl; // 1. 유리 측 제곱근 V의 계산 (단순 정수 연산) cpp_int V = 1; // V = sqrt( prod(a - bm) ) mod N // 2. 대수 측 제곱근 gamma의 계산 (Montgomery\u0026#39;s method 등) // 거대한 대수체 O_K의 원소 gamma를 구하고, 준동형 사상 phi로 현실 세계에 매핑한다. // Y = phi(gamma) mod N cpp_int Y = 1; // 아이디얼 군과 단수 군의 장애물(Obstruction)을 회피하기 위해, // Phase 2와 4에서 이차 잉여 기호(Quadratic Characters) 열이 추가되어 있다는 전제. std::cout \u0026lt;\u0026lt; \u0026#34; -\u0026gt; Homomorphism map phi applied.\u0026#34; \u0026lt;\u0026lt; std::endl; std::cout \u0026lt;\u0026lt; \u0026#34;[Phase 5] Calculating GCD(V - Y, N)...\u0026#34; \u0026lt;\u0026lt; std::endl; cpp_int factor = gcd(V - Y, N); // GCD(X-Y, N) if (factor \u0026gt; 1 \u0026amp;\u0026amp; factor \u0026lt; N) { std::cout \u0026lt;\u0026lt; \u0026#34;\\n================================================================\u0026#34; \u0026lt;\u0026lt; std::endl; std::cout \u0026lt;\u0026lt; \u0026#34;[SUCCESS] Non-trivial factor found: \u0026#34; \u0026lt;\u0026lt; factor \u0026lt;\u0026lt; std::endl; std::cout \u0026lt;\u0026lt; \u0026#34; Other factor: \u0026#34; \u0026lt;\u0026lt; N / factor \u0026lt;\u0026lt; std::endl; std::cout \u0026lt;\u0026lt; \u0026#34;================================================================\u0026#34; \u0026lt;\u0026lt; std::endl; } else { std::cout \u0026lt;\u0026lt; \u0026#34;[FAILURE] Trivial solution. Trying next dependency...\u0026#34; \u0026lt;\u0026lt; std::endl; } } }; // ============================================================================ // Main Execution Pipeline // ============================================================================ int main() { std::cout \u0026lt;\u0026lt; \u0026#34;================================================================\u0026#34; \u0026lt;\u0026lt; std::endl; std::cout \u0026lt;\u0026lt; \u0026#34; [SOTA GNFS] General Number Field Sieve Engine (Boost C++) \u0026#34; \u0026lt;\u0026lt; std::endl; std::cout \u0026lt;\u0026lt; \u0026#34;================================================================\u0026#34; \u0026lt;\u0026lt; std::endl; // RSA-270 등, 소인수분해하고 싶은 거대한 합성수 N cpp_int N(\u0026#34;233108530344407544527637656910680524145619812480305449042948611968495918245135782867888369318577116418213919268572658314913060672626911354027609793166341626693946596196427744273886601876896313468704059066746903123910748277606548649151920812699309766587514735456594993207\u0026#34;); // 다항식의 차수 (130자리가 넘는 경우는 통상 5~6차를 선택) int degree = 6; // 파이프라인 초기화 PolynomialSelector poly_select(degree); LatticeSieve sieve(10000000, 20000000); // 실제 바운드는 수천만~수억 Filter filter; LinearAlgebraGF2 linalg; AlgebraicSquareRoot sqrt_step; auto start_time = std::chrono::high_resolution_clock::now(); // 1. 다항식 선택 poly_select.select(N); // 2. 체(Sieve) 처리 sieve.generate_factor_bases(); std::vector\u0026lt;Relation\u0026gt; relations = sieve.sieve(poly_select); // 3. 필터링 (행렬 압축) filter.reduce_matrix(relations); // 4. 선형 대수 (GF(2)에서의 널 스페이스 탐색) std::vector\u0026lt;std::vector\u0026lt;int\u0026gt;\u0026gt; dependencies = linalg.solve_nullspace(relations); // 5. 대수적 제곱근 계산 및 GCD for (const auto\u0026amp; dep : dependencies) { sqrt_step.compute_and_factor(relations, dep, N); } auto end_time = std::chrono::high_resolution_clock::now(); std::chrono::duration\u0026lt;double\u0026gt; elapsed = end_time - start_time; std::cout \u0026lt;\u0026lt; \u0026#34;\\n[System] SOTA GNFS Pipeline completed in \u0026#34; \u0026lt;\u0026lt; elapsed.count() \u0026lt;\u0026lt; \u0026#34; seconds.\u0026#34; \u0026lt;\u0026lt; std::endl; return 0; } 그렇다면 이 코드가 어떻게 암호의 장벽을 부숴나가는 것일까요. 5개의 단계별로 그 치밀한 알고리즘과 고도의 수학을 알기 쉽게 해설해 보겠습니다.\n2. GNFS의 최종 목적: $X^2 \\equiv Y^2 \\pmod N$ GNFS뿐만 아니라 현대의 거대 소인수분해 알고리즘 대부분이 목표로 하는 것은 다음 합동식을 만족하는 자명하지 않은 쌍 $(X, Y)$를 찾는 것입니다.\n$$X^2 \\equiv Y^2 \\pmod N$$ 이 식은 「$X^2$과 $Y^2$을 $N$으로 나눈 나머지가 같다」는 것을 의미합니다. 이를 변형하면, $X^2 - Y^2 \\equiv 0 \\pmod N$ 즉, $(X-Y)(X+Y)$가 $N$의 배수가 됩니다.\n만약 $X \\not\\equiv \\pm Y \\pmod N$ (비자명한 해)라면, $(X-Y)$와 $N$ 사이에는 「1보다 크고 $N$보다 작은 공약수」가 존재하게 됩니다. 여기서 유클리드 호제법을 사용하여 $\\gcd(X-Y, N)$ 을 계산하면, $N$의 소인수를 아주 쉽게 구할 수 있습니다.\n하지만 이 $X$와 $Y$를 찾는 것은 사막에서 바늘을 찾는 것과 같습니다. 그래서 GNFS는 「현실의 정수 세계」와 「다항식의 대수체 세계」라는 두 세계 를 만들어내고, 계산을 분산시키는 천재적인 접근법을 취합니다.\n3. Phase 1: 다항식 선택 (Polynomial Selection) 1 2 3 4 5 6 7 8 9 10 11 12 class PolynomialSelector { // ... void select(const cpp_int\u0026amp; N) { // m = N^(1/d) 의 계산 및 base-m 전개 // ... for (int i = 0; i \u0026lt;= degree; ++i) { f[i] = temp % m; temp /= m; } g = {-m, 1}; // g(x) = x - m } }; GNFS의 첫 번째 단계는 두 세계를 이어주는 「마법의 다항식」을 만드는 것입니다. 거대한 수 $N$에 대해, 정수 $m$을 선택합니다. 보통 $m \\approx N^{1/d}$이 되도록 선택합니다(코드에서는 $d=6$차 다항식을 가정).\n그리고 $N$을 $m$진수로 전개하고, 그 계수를 사용하여 다항식 $f(x)$를 구성합니다. $$N = c_d m^d + c_{d-1} m^{d-1} + \\dots + c_1 m + c_0$$ $$f(x) = c_d x^d + c_{d-1} x^{d-1} + \\dots + c_1 x + c_0$$ 이 다항식 $f(x)$에는 「변수 $x$에 $m$을 대입하면 정확히 $N$이 된다 ($f(m) = N$)」 는 매우 중요한 성질이 있습니다. 다시 말해, $f(m) \\equiv 0 \\pmod N$입니다. 유리 측 다항식은 $g(x) = x - m$으로 정의됩니다.\n이로 인해, $f(x)=0$의 근 $\\alpha$가 지배하는 「대수체의 세계 $\\mathbb{Z}[\\alpha]$」 와 일반적인 「유리수(정수)의 세계 $\\mathbb{Z}$」 가 $x \\to m$이라는 「환 준동형 사상(Homomorphism)」에 의해 강력하게 연결됩니다.\n최첨단 CADO-NFS 등에서는 KleinJung의 알고리즘이나 LLL 격자 기저 축소 알고리즘을 사용하여, 다항식의 계수가 극단적으로 커지지 않으면서 후속 단계에서 소수가 쉽게 나타날 수 있는 (매끄러워지기 쉬운) 「가장 적합한 다항식 $f(x)$」를 수개월에 걸쳐 탐색합니다.\n4. Phase 2: 특수 $q$ 격자 체 (Special-q Lattice Sieving) 1 2 3 4 5 6 7 8 9 class LatticeSieve { // ... std::vector\u0026lt;Relation\u0026gt; sieve(const PolynomialSelector\u0026amp; poly) { // ... // (a, b)의 쌍을 특수 소수 q마다의 격자에 매핑하고, // 캐시 효율을 극한까지 높인 체(Sieve)를 실행한다. // ... } }; 두 세계를 준비했다면, 다음은 양쪽 세계 모두에서 「매끄러운 수(작은 소수들로만 이루어진 수)」를 찾는 단계로 들어갑니다. 정수 쌍 $(a, b)$를 무수히 생성하고, 다음 두 값을 계산합니다.\n유리 측의 값: $a - bm$ 대수 측의 노름(Norm): $b^d f(a/b)$ GNFS의 목적은 이 「유리 측과 대수 측의 값이 모두 작은 소인수로만 완전히 분해되는 쌍(Relation: 관계식)」 을 수천만에서 수억 개 모으는 것입니다.\n초기 GNFS에서는 $(a, b)$를 $xy$ 평면에 나열하고 가장자리부터 차례로 소수로 나누어가는 「직선 체(Line Sieve)」가 사용되었습니다. 하지만 이 방식은 메모리의 여기저기를 접근하기 때문에 캐시 미스가 다발하여, 매우 느리다는 약점이 있었습니다.\n그래서 현재의 최첨단 코드에서는 「특수 $q$ 격자 체 (Special-q Lattice Sieve)」 라는 기법이 사용됩니다. 어떤 적당히 큰 소수 $q$를 고정하고, 「대수 측의 값이 반드시 $q$로 나누어떨어지는 $(a, b)$ 쌍」만을 계산 대상으로 삼습니다. 이 조건을 만족하는 $(a, b)$는 평면상에서 「격자(Lattice)」를 형성하므로, 계산할 주소의 점프 폭이 일정해져 CPU의 L1/L2 캐시에 완벽하게 들어맞습니다. 이 격자 체의 도입으로 GNFS의 계산 속도는 비약적으로 향상되었습니다.\n5. Phase 3: 필터링 (Filtering) 1 2 3 4 5 6 7 class Filter { public: void reduce_matrix(std::vector\u0026lt;Relation\u0026gt;\u0026amp; relations) { // 1. Singleton removal (1번밖에 출현하지 않는 소수를 가진 관계식 삭제) // 2. Clique merging (희소 행렬을 조밀하게 만들기 위한 관계식 결합) } }; Phase 2에서 전 세계의 컴퓨터가 수개월에 걸쳐 모은 수억 개의 관계식. 하지만 이를 그대로 다음의 「연립방정식을 푸는 단계(행렬 계산)」에 밀어 넣으면, 슈퍼컴퓨터의 메모리가 펑크나게 됩니다.\n그래서 필터링(Filtering) 이라 불리는, 행렬의 초압축 프로세스가 수행됩니다.\nSingleton removal (특이점 제거) 어떤 거대한 소수 $p$가 수억 개의 관계식 중에서 「단 1번」만 등장했다고 가정해봅시다. 우리가 목표로 하는 것은 「모든 소수의 지수를 짝수(2의 배수)로 만드는 것」이므로, 1번만 등장하는 소수는 절대 짝수로 만들 수 없습니다. 따라서 그 소수를 포함하는 관계식은 「쓸모없는 쓰레기」로 간주되어 즉시 삭제(제거)됩니다. 이것이 연쇄적으로 일어나면서 수억 행이었던 데이터가 점점 줄어듭니다.\nClique merging (클리크 병합) 게다가 특정 소수를 공유하는 관계식끼리 곱하여(더하여) 행의 수를 줄이면서, 스파스한(듬성듬성한) 행렬을 보다 밀집된 상태로 압축합니다(그래프 이론의 클리크 탐색과 유사한 기법 사용).\n이 최적화를 통해 거대한 스파스 행렬은 계산 가능한 크기로 극적으로 압축됩니다.\n6. Phase 4: GF(2) 상의 선형 대수 (Block Wiedemann 법) 1 2 3 4 5 6 7 class LinearAlgebraGF2 { public: std::vector\u0026lt;std::vector\u0026lt;int\u0026gt;\u0026gt; solve_nullspace(const std::vector\u0026lt;Relation\u0026gt;\u0026amp; relations) { // 스파스(희소) 행렬과 벡터의 곱셈 연산을 반복하여, // M * x = 0 mod 2 가 되는 해 벡터(커널)를 여러 개 찾는다. } }; 드디어 퍼즐의 핵심입니다. 수집한 관계식을 곱하여 「소인수의 지수가 모두 짝수승이 되는 조합」 을 찾습니다.\n이는 수학적으로 각 소수 지수의 「짝수·홀수(즉, 0 또는 1)」를 원소로 하는 거대한 행렬 $M$과, 어떤 관계식을 사용할지를 나타내는 벡터 $x$를 사용하여, $M \\cdot x \\equiv 0 \\pmod 2$ 가 되는 해 벡터 $x$(널 스페이스·커널)를 구하는 것과 다름없습니다.\n수백만 행 × 수백만 열이라는 엄청난 크기의 행렬 연립방정식을 풀어야 합니다. 일반적인 가우스 소거법으로는 계산량이 $O(N^3)$이 되어 우주가 끝날 때까지 계산이 끝나지 않습니다.\n그래서 최첨단 구현에서는 「Block Wiedemann (블록 비데만) 법」 이 채택되어 있습니다. 이는 행렬 $M$이 「매우 스파스함(대부분이 0)」을 이용하여, 행렬과 벡터의 곱셈을 반복적으로 수행하여 해를 도출해내는 크릴로프 부분공간법의 일종입니다. 기존의 Block Lanczos 법과 달리 Block Wiedemann 법은 계산 프로세스를 여러 클러스터로 완전히 분할할 수 있기 때문에, 현대의 분산 클라우드 컴퓨팅이나 슈퍼컴퓨터에서의 병렬 계산에서 압도적인 위력을 발휘합니다.\n7. Phase 5: 대수적 제곱근 (Algebraic Square Root)과 암호 붕괴 1 2 3 4 5 6 7 8 9 10 11 12 13 class AlgebraicSquareRoot { public: void compute_and_factor(...) { // 1. 유리 측 제곱근 V의 계산 cpp_int V = 1; // 2. 대수 측 제곱근 gamma의 계산 cpp_int Y = 1; // ... cpp_int factor = gcd(V - Y, N); // GCD(X-Y, N) } }; Phase 4의 행렬 계산으로 인해 우리는 「곱하면 모든 소인수가 짝수승이 되는 관계식의 집합 $S$」를 손에 넣었습니다. 이로써 유리 측과 대수 측, 각각의 세계에서 「제곱」을 구성할 수 있습니다.\n유리 측은 단순한 정수의 곱셈이므로 제곱근 $V$를 계산하는 것은 쉽습니다. $$V^2 = \\prod_{S} (a - bm)$$ 하지만 진짜 지옥은 「대수 측」에 있습니다. 대수체의 세계 $\\mathbb{Z}[\\alpha]$에서는 소인수분해의 유일성이 성립하지 않기 때문에, 아이디얼을 사용하여 계산을 수행해 왔습니다. 행렬 계산으로 보장된 것은 「아이디얼의 제곱」이 되는 것뿐이며, 「원소의 제곱($\\gamma^2$)」이 되는 것은 보장되지 않은 것입니다.\n여기에는 「아이디얼 군의 장애물」과 「단수 군의 장애물」이라는 대수적 정수론의 거대한 벽이 가로막고 있습니다. GNFS에서는 이 벽을 깨뜨리기 위해 「이차 잉여 기호 (Quadratic Characters)」 라는 마법을 사용합니다. Phase 4의 행렬에 미리 수십 개의 특별한 소아이디얼에 대한 이차 잉여(르장드르 기호)의 열을 몰래 추가해 두는 것입니다. 이로 인해 찾아낸 집합 $S$는 압도적인 확률로 장애물을 통과하여 무사히 「진정한 원소의 제곱 $\\gamma^2$」을 형성해 줍니다.\n$\\gamma$를 구하는 작업(대수적 제곱근)은 Montgomery 법 등의 매우 복잡한 알고리즘을 사용하여 계산됩니다.\n그리고 마침내 대수 측의 제곱근 $\\gamma$를, 환 준동형 사상 $\\phi$를 통해 현실 세계로 워프($x$에 $m$ 대입)시켜 $Y$를 얻습니다. 유리 측의 $V$를 그대로 $X$로 두면, 마침내 쫓고 쫓던 절대 등식이 완성됩니다.\n$$X^2 \\equiv Y^2 \\pmod N$$\n남은 것은 $\\gcd(X-Y, N)$을 계산하는 것뿐입니다. 0.001초의 처리가 순식간에 지나가고 비자명한 인수가 화면에 인쇄되는 순간, 난공불락을 자랑하던 RSA 암호는 완전히 붕괴됩니다.\n맺음말 GNFS는 단순한 프로그래밍 테크닉이 아닙니다. 추상대수학, 환론, 아이디얼 군과 같은 「순수 수학의 심연」을 슈퍼컴퓨터의 분산 아키텍처나 캐시 최적화와 같은 「극한의 엔지니어링」으로 굴복시킨 인류 지성의 결정체입니다.\n우리가 무심코 전송하고 있는 채팅이나 신용카드 정보는 이러한 천문학적인 수학의 공방 위에서 지켜지고 있는 것입니다.\n이 C++ 프레임워크를 통해 최첨단 암호 해독 알고리즘의 이면에 있는 「수학과 컴퓨터의 로망」을 느껴보시기 바랍니다.\n","date":"2026-09-05T13:04:59+09:00","image":"http://kenji.blog/p/gnfs-cpp-implementation/gnfs_cpp_blog_eyecatch_1788580949217_hu57b4110ce75cf76414fb819be22bae03_985705_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/ko/p/gnfs-cpp-implementation/","title":"[완전 해부] 최강의 암호 해독 알고리즘 'GNFS'를 C++로 구현하고 이해하기"},{"content":"일반 수체 체법(GNFS)의 진정한 수학적 구조 GNFS의 궁극적인 목적은 $X^2 \\equiv Y^2 \\pmod N$이 되는 $X, Y$를 찾는 것입니다. 이를 달성하기 위해 수학자들은 「현실의 정수 세계」 와 「대수체의 세계」 사이에 다리를 놓았습니다. 그 다리가 바로 「준동형 사상」입니다.\n제1단계: 세계를 연결하는 「준동형 사상(Homomorphism)」 1. 다항식의 선정과 근의 정의 거대한 합성수 $N$에 대해, 어떤 정수 $m$과 다항식 $f(x)$를 선택하여, $f(m) \\equiv 0 \\pmod N$이 되도록 합니다. (예: $N$을 $m$진수로 전개하고, 그 계수로부터 $f(x)$를 만듭니다. 이때 $f(x)$는 유리수체 $\\mathbb{Q}$ 위에서 기약(더 이상 인수분해할 수 없음)이라고 가정합니다).\n다음으로, 방정식 $f(x) = 0$의 「복소수에서의 근」 중 하나를 $\\alpha$로 둡니다. 당연히 $f(\\alpha) = 0$입니다. $\\alpha$는 정수가 아니라, 루트나 허수를 포함하는 복잡한 수(대수적 수)입니다.\n2. 환(Ring)과 준동형 사상의 구축 여기서 두 개의 수학적인 「환(덧셈과 곱셈이 정의된 세계)」을 준비합니다.\n세계A: $\\mathbb{Z}[\\alpha]$ ($\\alpha$를 포함하는 대수적 정수환) $a + b\\alpha + c\\alpha^2 + \\dots$ 형태로 표현되는 수의 세계입니다. 세계B: $\\mathbb{Z}/N\\mathbb{Z}$ ($N$으로 나눈 나머지의 환) $0$부터 $N-1$까지의 정수로만 구성된, 합동식(모듈로)의 세계입니다. 여기서 세계A에서 세계B로, 다음과 같은 매핑(사상) $\\phi$를 정의합니다. $$\\phi : \\mathbb{Z}[\\alpha] \\to \\mathbb{Z}/N\\mathbb{Z}$$ $$\\phi(\\alpha) = m \\pmod N$$\n이 사상 $\\phi$는 세계A의 변수 $\\alpha$를 그대로 세계B의 정수 $m$으로 바꿔치기하는 마법의 조작입니다. 이 $\\phi$는 「환 준동형 사상(Ring Homomorphism)」 이라는 극히 강력한 성질을 가지고 있습니다. 준동형이란 「덧셈이나 곱셈의 구조를 깨뜨리지 않고 다른 세계로 워프시키는」 성질을 의미합니다. 즉, 다음 식이 성립합니다.\n$\\phi(X \\times Y) = \\phi(X) \\times \\phi(Y)$ $\\phi(X^2) = \\phi(X)^2$ 이것이 무엇을 의미할까요? 만약 우리가 「세계A($\\alpha$의 세계)」에서 어떤 복잡한 요소 $\\gamma$의 「제곱($\\gamma^2$)」 을 만들 수 있다면, 그것을 $\\phi$로 「세계B(나머지의 세계)」로 워프시켜도 ** 훌륭하게 제곱의 형태 $\\phi(\\gamma)^2$가 유지된다** 는 것입니다.\n제2단계: 소인수분해의 붕괴와 「아이디얼(Ideal)」의 탄생 우리는 세계A($\\mathbb{Z}[\\alpha]$) 안에서 적당한 요소 $(a - b\\alpha)$를 많이 모아, 그것들을 곱해서 「완전한 제곱(평방원)」을 만들고자 합니다. 보통이라면 모은 $(a - b\\alpha)$를 각각 「소인수분해」해서, 소수의 지수가 모두 짝수가 되도록 조합(행렬로 풂)하면 제곱을 만들 수 있습니다.\n하지만, 여기서 대수학의 절망적인 장벽이 앞을 가로막습니다. $\\mathbb{Z}[\\alpha]$와 같은 대수체의 세계에서는, 중학교 때 배우는 「소인수분해의 유일성(어떤 수도 소수의 곱셈으로 단 한 가지로만 표현할 수 있다)」이 붕괴되어 버리는 것입니다.\n(예: 어떤 대수체의 세계에서는 $6 = 2 \\times 3$ 이며, 동시에 $6 = (1+\\sqrt{-5}) \\times (1-\\sqrt{-5})$ 가 되어버려, 어느 쪽이 진짜 소수인지 알 수 없게 됩니다)\n소인수분해가 한 가지로 정해지지 않으면, 「소수의 개수를 세어 짝수 개로 만든다」는 퍼즐(체법)을 원리적으로 실행할 수 없습니다.\n쿠머와 데데킨트의 구원: 「아이디얼」 이 붕괴를 구원한 것이, 19세기의 수학자들이 만들어낸 「아이디얼(Ideal: 이상수)」 이라는 개념입니다. 요소 자체가 아니라, 그 요소가 생성하는 「배수의 집합(아이디얼)」을 생각함으로써 다시 소인수분해를 가능하게 한 것입니다.\n대수체의 정수환 $\\mathcal{O}_K$($\\mathbb{Z}[\\alpha]$를 포함하는 더 완전한 환)에서, 요소는 유일하게 소인수분해할 수 없어도, 「아이디얼은 반드시 『소 아이디얼($\\mathfrak{p}$)』의 곱으로 단 한 가지로 소인수분해할 수 있다」 는 것이 증명되어 있습니다.\n따라서 GNFS에서는 요소 $(a - b\\alpha)$ 자체를 분해하는 것이 아니라, 그것이 생성하는 단항 아이디얼 $\\langle a - b\\alpha \\rangle$을 소 아이디얼 분해 합니다.\n제3단계: 노름(Norm)과 두 개의 체(Sieve) 그렇다면, 아이디얼 $\\langle a - b\\alpha \\rangle$이 어떤 소 아이디얼로 분해되는지 어떻게 알 수 있을까요? 여기서 「노름(Norm)」 이라는 함수를 사용합니다. 노름이란, 대수체의 복잡한 요소를 「평범한 현실의 정수 $\\mathbb{Z}$」로 변환하는 함수입니다.\n요소 $(a - b\\alpha)$의 노름은 $b^d f(a/b)$라는 간단한 다항식 계산으로 구할 수 있습니다($d$는 $f(x)$의 차수).\n대수학의 정리에 의해, 「어떤 아이디얼의 노름이 작은 소수로 완전히 분해될 수 있다면(매끄럽다면), 그 원래의 아이디얼도 작은 소 아이디얼로 완전히 분해될 수 있다」 는 것이 알려져 있습니다.\n그래서 GNFS는 대량의 정수 쌍 $(a, b)$에 대해 다음 두 가지를 동시에 계산하고, 양쪽 모두가 「매끄러운 수」가 되는 쌍만을 수집합니다.\n유리 체(Rational Sieve): $a - bm$ (현실 세계의 값) 대수 체(Algebraic Sieve): $b^d f(a/b)$ (대수체의 세계에서의 노름) 양쪽 모두 매끄러운 쌍 $(a, b)$를 수천만 개 모아, 아이디얼의 소인수분해 데이터(소 아이디얼이 몇 개 포함되어 있는지)를 거대한 행렬(GF(2) 위에서의 선형대수)로 풀어, 「곱하면 모든 소 아이디얼의 지수가 짝수가 되는」 쌍의 집합 $S$를 찾습니다.\n제4단계: 앞을 가로막는 두 개의 「장애물」과 아이디얼 류군 행렬 계산을 통해 집합 $S$에 속하는 $(a - b\\alpha)$의 아이디얼을 모두 곱하면, 어떤 아이디얼 $I$의 제곱이 된다는 것을 알았습니다. $$\\prod_{S} \\langle a - b\\alpha \\rangle = I^2$$ 하지만 아직 끝나지 않았습니다. GNFS에서 가장 깊고, 가장 어려운 수학의 벽이 여기에 있습니다.\n우리가 마지막으로 원하는 것은 「아이디얼의 제곱」이 아니라, 사상 $\\phi$에 대입하기 위한 「요소의 제곱($\\gamma^2$)」 입니다. 아이디얼의 제곱이 되었다고 해서, 요소 자체가 제곱이 되어 있다는 보장은 없습니다. 여기에는 두 가지 강력한 수학적 장애물(Obstruction) 이 존재합니다.\n장애물①: 아이디얼 류군(Ideal Class Group)의 벽 아이디얼 $I$는 반드시 「하나의 요소로 생성되는 아이디얼(단항 아이디얼)」이라고는 할 수 없습니다. 단항 아이디얼이 아닌 아이디얼에서 구체적인 요소 $\\gamma$를 꺼내는 것은 불가능합니다.\n여기서 「아이디얼 류군(Class Group, $Cl_K$)」 이라는 개념이 등장합니다. 아이디얼 류군이란, 「그 대수체의 세계에 단항 아이디얼이 아닌 아이디얼이 얼마나 존재하는가(소인수분해의 유일성이 얼마나 깨져 있는가)」를 측정하는 군입니다. $\\prod \\langle a - b\\alpha \\rangle$이 $I^2$이 되었다고 해도, $I$가 아이디얼 류군에서 단위원(단항 아이디얼)이 아니라면, 요소의 제곱으로 되돌릴 수 없습니다.\n장애물②: 단수군(Unit Group)의 벽 만약 운 좋게 $I$가 단항 아이디얼 $\\langle \\gamma \\rangle$이었다고 해봅시다. 그러면 $\\prod \\langle a - b\\alpha \\rangle = \\langle \\gamma^2 \\rangle$이 됩니다. 「좋아, 요소도 제곱이다!」라고 생각할지 모르지만, 큰 착각입니다.\n아이디얼(배수의 집합)이 같다는 것이 요소가 완전히 같다는 것을 의미하지는 않습니다. 반드시 「단수(Unit: 역수도 정수가 되는 수. 1이나 -1 등)」 의 차이가 발생합니다. 즉, 실제 요소의 등식은 다음과 같이 됩니다. $$\\prod_{S} (a - b\\alpha) = u \\cdot \\gamma^2$$ ($u$는 단수군 $U_K$의 요소)\n이 단수 $u$ 자체가 무언가의 제곱(평방원)이 아니라면, 좌변은 절대로 「완전한 요소의 제곱」이 될 수 없습니다.\n제5단계: 애들먼의 마법 「이차 잉여 지표(Quadratic Characters)」 아이디얼 류군의 장애물과 단수군의 장애물. 이 두 가지를 어떻게 뛰어넘을 것인가? 여기서 암호학자 레너드 애들먼(RSA의 \u0026ldquo;A\u0026rdquo;) 등이 도입한 천재적인 수법 「이차 잉여 지표(Quadratic Characters)」 가 등장합니다.\n「어떤 요소가 대수체 안에서 완전히 제곱이 되어 있는가?」를 판정하기 위해, 르장드르 기호(이차 잉여)의 대수체 버전을 사용합니다. 아까의 거대한 행렬(소 아이디얼의 개수를 짝수로 만들기 위한 퍼즐)에 「몇 가지 특별한 소 아이디얼 $\\mathfrak{q}$에 대한 이차 잉여 지표도 모두 $1$(짝수)이 된다」는 추가 조건(열)을 수십 개 정도 몰래 덧붙이는 것입니다.\n행렬 계산에 의해 이 추가 조건조차도 만족하는 집합 $S$를 찾았을 때, 대수적 정수론의 깊은 정리에 의해 「아이디얼 류군의 장애물도, 단수군의 장애물도, 압도적인 확률로 자연스럽게 소멸한다」 는 것이 보장됩니다.\n이를 통해 마침내 우리는 진정한 등식을 손에 넣게 됩니다. $$\\prod_{S} (a - b\\alpha) = \\gamma^2$$ 최종 단계: 세계의 융합과 암호 붕괴 드디어 퍼즐의 모든 조각이 맞춰졌습니다.\n【대수체의 세계(세계A)의 요소】 $\\gamma^2 = \\prod (a - b\\alpha)$ (이것을 제곱근 알고리즘을 사용하여 $\\gamma$를 구합니다)\n【현실의 세계(유리수의 세계)의 요소】 $V^2 = \\prod (a - bm)$ (이쪽은 단순한 정수의 곱셈이므로, 평범하게 제곱근 $V$가 구해집니다)\n자, 맨 처음에 만든 마법의 다리, 준동형 사상 $\\phi$ 가 나설 차례입니다. 세계A의 요소 $\\gamma$를, $\\phi$($\\alpha$에 $m$을 대입하는 사상)를 사용하여 세계B($N$의 나머지 세계)로 워프시킵니다. $$Y = \\phi(\\gamma) \\pmod N$$ 한편, 현실 세계에서 만든 $V$를 그대로 나머지 세계로 가져가 $X$로 둡니다. $$X = V \\pmod N$$ 준동형 사상의 「구조를 보존하는」 성질에 의해, 세계A에서 성립하던 제곱의 관계는 세계B(모듈로 $N$의 세계)에서도 완전히 보존되어 있습니다. 게다가 원래의 쌍 $(a, b)$는 $a - b\\alpha$와 $a - bm$이라는 형태로 대응되어 만들어졌기 때문에, 이 $X$와 $Y$는 모듈로 $N$의 세계에서 격돌하며 다음의 절대적인 등식을 낳습니다.\n$$X^2 \\equiv Y^2 \\pmod N$$\n이제 이 $X$와 $Y$가 자명한 해($X \\equiv \\pm Y$)가 아니기를 기도하며, $\\gcd(X - Y, N)$ 을 계산합니다.\n비자명한 해라면, 유클리드 호제법이 0.001초 만에 실행되며 RSA 암호의 심장부인 비밀 소수 $p$와 $q$가 출력 화면에 인쇄됩니다.\n이것이 현대 수학의 정수를 모은 「일반 수체 체법(GNFS)」의 완전한 모습 입니다.\n","date":"2026-09-05T02:26:13+09:00","image":"http://kenji.blog/p/%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%AE%E7%9C%9F%E3%81%AE%E6%95%B0%E5%AD%A6%E7%9A%84%E6%A7%8B%E9%80%A0/rsa_encryption_break_1788542156523_hu57b4110ce75cf76414fb819be22bae03_1010164_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/ko/p/%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%AE%E7%9C%9F%E3%81%AE%E6%95%B0%E5%AD%A6%E7%9A%84%E6%A7%8B%E9%80%A0/","title":"일반 수체 체(GNFS)의 진정한 수학적 구조"},{"content":"인터넷의 암호를 깨는 인류 최강의 수학 「일반 수체 체(GNFS)」란? 우리가 매일 사용하는 인터넷. LINE 메시지나 YouTube, Amazon에서의 쇼핑 등 모든 통신은 \u0026ldquo;암호\u0026quot;에 의해 보호받고 있습니다. 현재 전 세계에서 가장 많이 사용되는 암호의 대표가 \u0026ldquo;RSA 암호\u0026quot;입니다.\nRSA 암호 방어의 핵심은 매우 간단합니다. 그것은 \u0026ldquo;거대한 수의 소인수분해는 컴퓨터로도 풀 수 없다\u0026rdquo; 는 수학적 성질을 이용하고 있다는 것입니다. 예를 들어 \u0026ldquo;15\u0026quot;라면 \u0026ldquo;3 × 5\u0026quot;라고 바로 알 수 있지만, 이것이 \u0026ldquo;270자리 숫자\u0026quot;가 되는 순간 전 세계의 슈퍼컴퓨터를 모두 모아도 푸는 데 수억 년이 걸리고 맙니다.\n하지만 수학자들도 가만히 있지는 않습니다. 이 철벽같은 암호를 깨기 위해 인류는 \u0026ldquo;일반 수체 체(GNFS: General Number Field Sieve)\u0026rdquo; 라는 마법 같은 알고리즘(계산 절차)을 만들어 냈습니다.\n이 글에서는 전문 용어를 전혀 사용하지 않고, 중학교에서 배우는 수학(소인수분해, 문자식, 최대공약수) 지식만으로 이 \u0026ldquo;인류 최강의 알고리즘\u0026quot;이 암호를 깨는 원리를 단계별로 완전 해설합니다!\n제1장: 암호 해독의 목표는 \u0026ldquo;중학교 3학년 공식\u0026rdquo; 거대한 소인수분해에 맞서기 위한 최대의 필살기. 그것은 중학교 3학년 때 배우는 이 공식입니다.\n$X^2 - Y^2 = (X + Y)(X - Y)$\n\u0026ldquo;어, 이런 기초적인 공식으로 암호를 깰 수 있다고?\u0026ldquo;라고 생각할지 모릅니다. 하지만 이것이야말로 모든 것을 밝혀낼 마스터키입니다.\n암호를 깨기 위한 최대의 목표는 거대한 수 $N$에 대해, \u0026quot;$X^2$과 $Y^2$을 $N$으로 나눈 나머지가 같아지는 수($X$와 $Y$)\u0026rdquo; 를 찾는 것입니다.\n왜 \u0026ldquo;나머지가 같으면\u0026rdquo; 암호가 풀리는 걸까? 어떤 두 수 $X^2$과 $Y^2$의 \u0026ldquo;$N$으로 나눈 나머지가 같다\u0026quot;고 가정해 봅시다. 나머지가 같다는 것은 뺄셈을 한 \u0026ldquo;$X^2 - Y^2$\u0026ldquo;는 반드시 $N$으로 딱 나누어떨어진다($N$의 배수가 된다) 는 법칙이 있습니다.\n여기서 암호에 사용되는 거대한 수 $N$은 두 개의 비밀 소수($p$와 $q$)의 곱셈으로 이루어져 있다고 합시다($N = p \\times q$).\n$X^2 - Y^2$를 인수분해하면 $(X - Y)(X + Y)$ 가 됩니다. 이것이 $N$의 배수라는 것은 이 곱셈의 어딘가에 비밀 소수 $p$와 $q$가 숨어 있다는 의미입니다.\n여기서 기적이 일어납니다. 두 소수 $p$와 $q$가 \u0026quot;$p$는 $(X - Y)$의 방으로\u0026rdquo;, \u0026ldquo;$q$는 $(X + Y)$의 방으로\u0026rdquo; 서로 다른 방으로 나뉘어 들어갈 확률이 수학적으로 ** 50%(2분의 1)** 나 되는 것입니다.\n소수 $p$만이 $(X - Y)$의 방에 들어간 상태에서 $(X - Y)$와 $N$의 \u0026ldquo;최대공약수(공통되는 가장 큰 부품)\u0026rdquo; 를 계산해 봅시다.\n$(X - Y)$의 내용물 = $p \\times$ 어떤 수 $N$의 내용물 = $p \\times q$ 공통된 부품은 \u0026quot;$p$\u0026rdquo; 밖에 없죠! 즉, 최대공약수를 계산하는 순간 숨어 있던 소수 $p$가 툭 떨어져 나와 암호가 완전히 해독되어 버리는 것입니다. (※최대공약수는 \u0026ldquo;유클리드 호제법\u0026quot;을 사용하면 스마트폰으로도 순식간에 계산할 수 있습니다)\n【잠깐 칼럼: 왜 제곱일까? 세제곱이나 2배는 안 될까?】\n\u0026ldquo;$2X - 2Y$\u0026ldquo;라면 $2(X - Y)$가 되어 방이 하나밖에 없으므로 소수를 떼어놓을 수 없습니다. \u0026ldquo;$X^3 - Y^3$\u0026ldquo;라면 방의 크기가 불균형해져서 계산이 쓸데없이 무거워집니다. 소수를 두 개로 떼어놓기 위해서는 아름답게 두 개의 방으로 나뉘는 \u0026ldquo;제곱\u0026quot;이 가성비가 가장 좋습니다.\n제2장: X와 Y를 어떻게 찾을까? \u0026ldquo;소수 카드 모으기 퍼즐\u0026rdquo; 목표는 알았습니다. 하지만 \u0026ldquo;나머지가 같아지는 $X^2$과 $Y^2$\u0026ldquo;를 무턱대고 찾아봤자 우주의 수명이 다할 때까지 찾을 수 없습니다. 그래서 수학자들은 \u0026ldquo;소수 카드 모으기 퍼즐\u0026rdquo; 이라는 천재적인 방법을 떠올렸습니다.\nStep 1: 사금(매끄러운 수)만을 체로 걸러 모으기 먼저 적당한 수 $Z$를 준비하고, 제곱해서 $N$으로 나눈 나머지 $W$를 계산합니다. ($Z^2 = W$인 나머지의 세계)\n나온 나머지 $W$를 소인수분해합니다. 여기서 \u0026ldquo;2, 3, 5, 7 등의 작은 소수로만 이루어진 $W$\u0026rdquo; 가 나왔을 때만 그 식을 \u0026ldquo;당첨 카드\u0026quot;로 남기고, 큰 소수가 섞여 있으면 버립니다. 강에서 큰 돌을 체로 걸러 버리고 사금만을 모으는 것과 같은 작업입니다.\nStep 2: 모두 \u0026ldquo;짝수 개\u0026quot;로 만드는 퍼즐 예를 들어, 다음과 같은 3장의 사금 카드가 모였다고 합시다.\n카드 A: $Z_1^2 = 2^3 \\times 3^1$ 카드 B: $Z_2^2 = 2^1 \\times 5^1$ 카드 C: $Z_3^2 = 3^1 \\times 5^1$ 이것을 모두 곱해 봅시다. 오른쪽은 $(2^3 \\times 3^1) \\times (2^1 \\times 5^1) \\times (3^1 \\times 5^1)$이 되고, 한데 묶어 정리하면 \u0026quot;$2^4 \\times 3^2 \\times 5^2$\u0026rdquo; 가 됩니다.\n놀랍게도 소수의 개수가 \u0026ldquo;4개, 2개, 2개\u0026quot;로 모두 짝수 개 가 되었습니다! 모두 짝수 개라는 것은 전체를 절반의 개수로 만들면 \u0026ldquo;어떤 수의 제곱\u0026quot;이 된다는 것입니다. 즉, $(2^2 \\times 3^1 \\times 5^1)^2 = (60)^2$입니다.\n왼쪽은 $(Z_1 \\times Z_2 \\times Z_3)^2$이므로, 이것으로 마침내 $X = (Z_1 \\times Z_2 \\times Z_3)$ $Y = 60$ 이라는 기다리고 기다리던 \u0026ldquo;$X^2 = Y^2$\u0026ldquo;의 쌍이 완성된 것입니다!\n컴퓨터에 있어 소수의 개수를 \u0026ldquo;짝수인가 홀수인가(0인가 1인가)\u0026ldquo;로 계산하는 퍼즐은 매우 능숙하므로, 이 방법이라면 빠르게 $X$와 $Y$를 찾을 수 있습니다.\n제3장: 앞을 가로막는 절망의 벽 이제 어떤 암호라도 깰 수 있다!\u0026hellip; 라고 생각했지만, 큰 문제가 발생합니다. 암호 숫자 $N$이 \u0026ldquo;100자리\u0026rdquo; 정도까지라면 이 방법(이차 체라고 합니다)으로 풀 수 있지만, $N$이 \u0026ldquo;200자리, 300자리\u0026quot;가 되면 계산 도중에 나오는 $W$가 너무 커집니다.\n숫자가 너무 커지면 \u0026ldquo;작은 소수로만 이루어진 수(사금)\u0026ldquo;가 뚝 끊기고 맙니다. 사막에서 콘택트렌즈를 찾는 것보다 어려워져서, 퍼즐을 풀기 위한 카드가 전혀 모이지 않게 되는 것입니다.\n여기서 마침내 인류의 최종 병기 \u0026ldquo;일반 수체 체(GNFS)\u0026rdquo; 가 등장합니다.\n제4장: 인류 최강의 아이디어 \u0026ldquo;두 개의 세계\u0026rdquo; 만들기 GNFS의 천재적인 발상은 \u0026ldquo;현실 세계에서만 계산하니까 숫자가 커진다. 그렇다면 다항식(문자식)을 사용한 \u0026lsquo;이면의 세계\u0026rsquo;를 만들어서 계산의 무게를 둘로 분산시키자\u0026rdquo; 라는 것입니다.\n문자식의 마법 GNFS는 거대한 수 $N$을 베이스가 되는 수 $m$을 사용하여 문자식으로 변환합니다. 예를 들어 $N=100$이라면, $m=4$로 하여 $100 = 4^3 + 2(4^2) + 4$. 이것을 문자 $x$를 사용하여 $f(x) = x^3 + 2x^2 + x$ 라는 식(이면의 세계)으로 만듭니다.\n이 식의 재미있는 점은 \u0026ldquo;문자 $x$에 $m$(위의 예라면 4)을 대입하면 언제든지 현실의 수 $N$으로 워프해서 돌아올 수 있다\u0026rdquo; 는 성질을 가지고 있다는 것입니다.\n두 세계에서 동시에 사금 찾기 GNFS는 적당한 정수 쌍 $(a, b)$를 많이 만들고, 다음 두 가지 계산을 동시에 수행합니다.\n현실 세계: $a - b \\times m$ 문자식 세계: $a - b \\times x$를 문자식의 규칙으로 계산한 값 문제를 두 개의 세계로 나눔으로써 다루는 숫자의 크기가 극적으로 작아집니다(가벼워집니다). 거대한 바위를 둘로 쪼개어 다루기 쉬운 돌멩이로 만든 이미지입니다.\n그리고 \u0026ldquo;현실 세계에서도, 문자식 세계에서도 양쪽 모두 \u0026lsquo;작은 소수로만 이루어져 있는(사금)\u0026rsquo;\u0026rdquo; 기적의 쌍 $(a, b)$만을 체로 걸러내어 모읍니다. 이것이 \u0026ldquo;수체 체\u0026quot;라는 이름의 유래입니다.\n마침내 암호가 깨지는 순간 양쪽 세계에서 수천만 장의 \u0026ldquo;사금 카드\u0026quot;가 모이면 슈퍼컴퓨터의 거대한 행렬 계산을 사용하여, 제2장에서 했던 \u0026ldquo;소수의 개수가 모두 짝수가 되는 조합\u0026quot;을 찾아냅니다.\n조합을 찾으면,\n현실 세계에서 만들어진 제곱 수를 $X^2$ 문자식 세계에서 만들어진 제곱 식을 $Y(x)^2$ 로 둡니다. 마지막으로 문자식의 $Y(x)$의 $x$에 $m$을 대입하여 현실 세계로 워프시켜 합류시킵니다. 그러면 수학의 마법처럼 \u0026quot;$X^2$과 $Y^2$의 나머지가 같아진다\u0026rdquo; 는 상태가 엄밀하게 완성되는 것입니다!\n이제 제1장에서와 같이 $X - Y$와 $N$의 최대공약수를 계산하면, 난공불락의 RSA 암호는 소리를 내며 무너져 내리고 비밀 소수가 모습을 드러냅니다.\n맺음말: 수학은 끝나지 않는다 \u0026ldquo;좋아, GNFS를 사용하면 어떤 암호라도 깰 수 있겠구나!\u0026ldquo;라고 생각했을지도 모릅니다. 하지만 RSA 암호도 만만치 않습니다. 현재 인터넷에서 사용되는 것은 \u0026ldquo;RSA-2048(약 617자리)\u0026ldquo;이라는 괴물 같은 거대 수입니다.\nGNFS가 아무리 인류 최강의 알고리즘이라 하더라도, 270자리(RSA-270)를 푸는 데만도 전 세계의 컴퓨터를 연결해도 수천 년, 수만 년이 걸린다고 합니다. 지금으로서는 우리의 LINE이나 은행 데이터는 안전합니다.\n하지만 만약 \u0026ldquo;어떤 거대한 수라도 순식간에 $X$와 $Y$를 찾는 마법\u0026rdquo; 이 나타난다면 어떻게 될까요? 사실 거기에 가장 가까운 존재가 현재 개발 중인 \u0026ldquo;양자 컴퓨터(쇼어의 알고리즘)\u0026rdquo; 입니다. 양자 역학의 파동 성질을 사용하면 귀찮은 카드 모으기 퍼즐을 무시하고 단번에 답을 뽑아낼 수 있다고 수학적으로 증명되어 있습니다.\n암호를 만드는 사람(방어)과 암호를 깨는 알고리즘을 만드는 사람(공격)의 끝없는 지혜 겨루기. 중학교에서 배우는 \u0026ldquo;소인수분해\u0026quot;나 \u0026ldquo;문자식\u0026quot;이 사실은 세계 보안의 최전선에서 치열하게 싸우고 있는 무기라는 것을 알면 수학 수업이 조금은 더 재미있어 보이지 않나요?\n미래의 최강 알고리즘을 발견하는 것은 이 글을 읽고 있는 당신일지도 모릅니다!\n(※본 기사는 암호 해독의 수학적 매력을 중학생용으로 개념화한 것입니다. 실제 GNFS는 대수체의 이데알 류군이나 준동형 사상 등의 고도화된 대학 수학을 이용하여 엄밀하게 계산됩니다)\n","date":"2026-09-05T02:09:08+09:00","image":"http://kenji.blog/p/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E6%9A%97%E5%8F%B7%E3%82%92%E7%A0%B4%E3%82%8B%E4%BA%BA%E9%A1%9E%E6%9C%80%E5%BC%B7%E3%81%AE%E6%95%B0%E5%AD%A6%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%A8%E3%81%AF/gnfs_two_worlds_1788542142485_huf997c6e55368509d0617b56f68899854_1135822_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/ko/p/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E6%9A%97%E5%8F%B7%E3%82%92%E7%A0%B4%E3%82%8B%E4%BA%BA%E9%A1%9E%E6%9C%80%E5%BC%B7%E3%81%AE%E6%95%B0%E5%AD%A6%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%A8%E3%81%AF/","title":"인터넷 암호를 깨는 인류 최강의 수학 '일반 수체 체(GNFS)'란?"},{"content":"반백신의 공과――\u0026lsquo;선의의 불안\u0026rsquo;이 죽인 5000명의 미래와 우리가 배워야 할 역학의 교훈 코로나 사태가 부각시킨 \u0026lsquo;인과의 착각\u0026rsquo; 2021년 이후, 일본 국내에서 코로나19 백신 접종이 급속히 추진되었습니다. 단기간에 국민의 80% 가까이가 접종한다는, 인류 역사상 보기 드문 공중보건 프로젝트였습니다. 이 과정에서 우리는 SNS나 언론을 통해 수많은 \u0026lsquo;비명\u0026rsquo;을 목격했습니다. \u0026ldquo;백신을 맞은 며칠 뒤에 가족이 세상을 떠났다\u0026rdquo;, \u0026ldquo;접종 후 원인 모를 컨디션 난조가 계속되고 있다\u0026rdquo;――. 이러한 호소는 절실하며, 당사자에게 그 고통은 틀림없는 진실입니다.\n그러나 여기에 역학에 있어서 냉철하지만 극히 중요한 \u0026lsquo;함정\u0026rsquo;이 존재합니다. 일본의 인구 규모로 생각하면, 백신을 맞든 안 맞든 매일 약 3,000명에서 4,000명의 사람들이 어떤 원인(질병, 사고, 수명)으로 사망하고 있습니다. 국민 대다수가 일제히 백신을 접종하면, 확률론적으로 \u0026lsquo;접종한 다음 날에 (백신과는 무관한 원인으로) 사망하는 사람\u0026rsquo;은 반드시 일정 수 발생합니다. 이를 전문용어로 \u0026lsquo;우연의 일치(Coincidence)\u0026rsquo; 라고 부릅니다.\n인간에게는 \u0026lsquo;전후 즉 인과의 오류(Post hoc ergo propter hoc)\u0026lsquo;라는 인지 편향이 갖추어져 있습니다. \u0026lsquo;A(접종) 이후에 B(사망)가 일어났다\u0026rsquo;면 \u0026lsquo;A가 B의 원인이다\u0026rsquo;라고 직관적으로 연결 지어버리는 것입니다. 코로나 사태에서는 이 인지 편향이 SNS라는 증폭 장치에 의해 확산되어, 과학적인 검증을 기다리지 않고 \u0026lsquo;백신=위험\u0026rsquo;이라는 이미지가 정착하는 층을 만들어냈습니다.\n이 광경을 기시감과 함께 바라보던 공중보건 전문가는 적지 않습니다. 왜냐하면 일본은 불과 몇 년 전에 이 \u0026lsquo;과학 없는 불안\u0026rsquo;으로 인해 막을 수 있었던 질병을 예방할 수단을 스스로 포기한 유일한 선진국이기 때문입니다. 그것이 바로 \u0026lsquo;자궁경부암 백신(HPV 백신)\u0026rsquo; 문제입니다.\n2013년, 일본에서 무슨 일이 일어났는가 시곗바늘을 조금 되돌려보겠습니다. 자궁경부암은 연간 약 1만 1000명의 여성이 이환되고, 약 2,900명이 사망하는 질병입니다. 특히 20대에서 40대라는, 육아와 일의 한창때인 세대를 덮치기 때문에 \u0026lsquo;마더 킬러\u0026rsquo;라고도 불립니다. 원인은 인유두종바이러스(HPV) 감염이며, 성관계 경험이 있는 여성의 80%가 일생에 한 번은 감염된다고 여겨지는 흔한 바이러스입니다. 이 바이러스 감염을 막는 HPV 백신은 전 세계적으로 \u0026lsquo;암을 예방할 수 있는 획기적인 백신\u0026rsquo;으로 도입이 진행되어, 일본에서도 2013년 4월에 정기접종화(국가가 강력히 권장하며, 무료로 받을 수 있는 상태)되었습니다.\n그러나 직후에 사태는 암전됩니다. 접종을 받은 소녀들 일부에서 전신 통증, 운동장애, 기억장애 등의 증상이 보고되었고, 언론은 이를 \u0026lsquo;백신의 부작용 의심\u0026rsquo;으로 연일 대서특필했습니다. 경련하는 소녀의 영상은 시청자에게 강렬한 임팩트를 주었고, 여론은 단숨에 \u0026lsquo;백신 위험론\u0026rsquo;으로 기울었습니다.\n이에 따라 후생노동성은 2013년 6월, 정기접종 개시 불과 2개월 만에 \u0026lsquo;적극적인 권장 중단\u0026rsquo;을 결정했습니다. 이는 \u0026lsquo;금지\u0026rsquo;도 \u0026lsquo;중지\u0026rsquo;도 아닌, \u0026lsquo;정기접종의 틀은 남기지만, 국가에서 개별적인 안내 통지를 보내는 것을 그만둔다\u0026rsquo;는 지극히 모호한 정치적 판단이었습니다. 하지만 국민에게는 \u0026lsquo;국가가 위험하다고 인정하고 멈췄다\u0026rsquo;는 메시지로 전달되었습니다. 그 결과 70%를 넘던 접종률은 순식간에 1% 미만으로 폭락했습니다.\n여기서부터 일본에서의 \u0026lsquo;잃어버린 8년(백신 갭)\u0026rsquo; 이 시작됩니다.\n나고야 스터디가 파헤친 \u0026lsquo;진실\u0026rsquo; 언론이 보도한 증상은 정말 백신 때문이었을까요? 이 질문에 과학적으로 답하고자 했던 대규모 조사가 있습니다. 통칭 \u0026lsquo;나고야 스터디\u0026rsquo; 입니다.\n나고야시는 2015년, 약 7만 명의 젊은 여성을 대상으로 대규모 앙케이트 조사를 실시했습니다. 이는 백신을 \u0026lsquo;맞은 사람\u0026rsquo;과 \u0026lsquo;맞지 않은 사람\u0026rsquo; 모두를 포함하여, 각각에게 \u0026lsquo;생리불순\u0026rsquo;, \u0026lsquo;관절 통증\u0026rsquo;, \u0026lsquo;집중력 저하\u0026rsquo; 등 24개 항목에 걸친 증상 유무를 묻는 것이었습니다. 만약 백신이 원인이라면, \u0026lsquo;맞은 사람\u0026rsquo; 그룹에서 이러한 증상이 명백하게 더 많이 나와야 합니다.\n결과는 충격적이었습니다. \u0026lsquo;접종한 군\u0026rsquo;과 \u0026lsquo;접종하지 않은 군\u0026rsquo; 사이에서 증상 발생률에 유의미한 차이는 인정되지 않았던 것입니다.\n이것은 무엇을 의미할까요? 사춘기 소녀는 백신 유무에 관계없이 호르몬 밸런스의 변화나 성장기 특유의 사정으로 인해, 기립성 조절장애나 만성 통증 등의 컨디션 난조를 일으키기 쉬운 시기에 있습니다. 즉, 언론이 보도한 \u0026lsquo;백신을 맞은 후 증상이 나타난 아이\u0026rsquo;와 같은 비율로, \u0026lsquo;백신을 맞지 않았는데도 같은 증상이 나타나는 아이\u0026rsquo;가 존재했던 것입니다. 하지만 맞지 않은 아이의 컨디션 난조는 \u0026lsquo;사춘기의 부조화\u0026rsquo;로 처리되었고, 맞은 아이의 부조화만이 \u0026lsquo;백신의 피해\u0026rsquo;로 클로즈업되었습니다. 이것이 \u0026lsquo;약해(藥害)\u0026lsquo;라고 떠들썩했던 현상의 정체였을 가능성이 극히 높다는 것이 데이터를 통해 나타난 것입니다.\n게다가 \u0026lsquo;노세보 효과(Nocebo effect)\u0026lsquo;의 관여도 지적되고 있습니다. \u0026lsquo;플라세보(위약) 효과\u0026rsquo;의 반대로, \u0026lsquo;이것은 몸에 나쁜 것이다\u0026rsquo;라고 믿고 섭취하면 불안이나 공포심 때문에 정말로 통증이나 부조화가 생겨버리는 현상입니다. 연일 이어지는 부정적인 보도가 소녀들의 섬세한 심신에 영향을 미쳤을 가능성을 부정할 수 없습니다.\n숫자로 보는 \u0026lsquo;부작위의 죄\u0026rsquo; \u0026lsquo;만약을 위해 권장을 멈춘다\u0026rsquo;. 이 판단은 언뜻 보면 \u0026lsquo;신중하고 안전한 선택\u0026rsquo;으로 보입니다. 무슨 일이 생기고 나면 늦는 것이니까, 의심스러운 것은 멈춰야 한다고. 그러나 공중보건에 있어서 \u0026lsquo;아무것도 하지 않는 것(부작위)\u0026lsquo;은 때로는 \u0026lsquo;무언가를 하는 리스크\u0026rsquo;를 훨씬 웃도는 피해를 가져옵니다.\n오사카대학 연구팀은 이 권장 중단이 가져온 영향에 대해 잔혹한 추계를 발표했습니다. 2013년부터 2019년 사이에 접종률이 격감함으로써, 장래에 막을 수 있었던 자궁경부암 환자가 약 2만 5000명 증가하고, 사망자 수가 약 5,000명～5,700명 증가한다 는 것입니다.\n5,000명 이상의 사망자. 이것은 대규모 자연재해에 필적하는 숫자입니다. \u0026lsquo;부작용에 대한 불안\u0026rsquo;이라는, 과학적으로 인과관계가 확실하지 않은 리스크를 회피하려 한 결과, 우리는 \u0026lsquo;암에 의한 사망\u0026rsquo;이라는 확실하고 중대한 리스크를 미래의 여성들에게 짊어지게 한 것입니다.\n세계로 눈을 돌리면 그 차이는 역력합니다. 호주에서는 남녀에 대한 접종 보급으로 2028년경에는 자궁경부암이 \u0026lsquo;근절(희귀암화)\u0026lsquo;될 것으로 예측되고 있습니다. 영국에서도 백신 접종 세대의 자궁경부암 발병이 거의 제로가 되었다는 보고가 있습니다. 세계가 \u0026lsquo;암을 극복하는\u0026rsquo; 미래로 나아가는 가운데, 일본만이 \u0026lsquo;암이 계속 늘어나는\u0026rsquo; 과거에 남겨졌습니다. 2015년, WHO(세계보건기구)의 백신 안전성 자문위원회는 일본의 상황을 지목하여 비판했습니다. \u0026ldquo;과학적 근거에 기반하지 않은 정책 결정이 진정한 해(암에 의한 사망)를 가져오고 있다\u0026quot;고.\n바다를 건너 연쇄하는 \u0026lsquo;백신 기피\u0026rsquo; 일본에서 일어난 HPV 백신의 비극은 결코 \u0026lsquo;일본만의 특수 사정\u0026rsquo;이 아닙니다. 과학보다 \u0026lsquo;직관적인 불안\u0026rsquo;이나 \u0026lsquo;이데올로기\u0026rsquo;가 우선되었을 때, 감염증은 언제 어디서나 이빨을 드러낸다는 것을 보여주는 사례가 지금도 전 세계에서 보고되고 있습니다.\n그 현저한 예가 미국에서의 \u0026lsquo;홍역(마진)\u0026rsquo; 유행 입니다.\n홍역은 매우 감염력이 강한 바이러스이지만, 백신에 의해 거의 완전히 예방 가능한 질병입니다. 미국에서는 과거 철저한 백신 접종 프로그램을 통해 2000년에 \u0026lsquo;퇴치(elimination)\u0026lsquo;가 선언되었습니다. 즉, 국내에서 토착 바이러스는 없어졌다고 여겨졌던 것입니다. 그러나 최근 그 홍역이 다시 유행하기 시작하고 있습니다.\nBBC의 보도(2024년)에 따르면, 미국 보건 당국은 일부 커뮤니티에 뿌리 깊게 남아있는 \u0026lsquo;백신 기피(Vaccine Hesitancy)\u0026lsquo;가 감염 확대의 온상이 되고 있다고 지적하고 있습니다. 종교적인 이유나, \u0026lsquo;자연주의\u0026rsquo;를 표방하는 일부 집단, 혹은 잘못된 정보에 기반한 반백신 사상이 침투한 지역에서 백신 접종률이 저하되었습니다. 거기에 해외에서 바이러스가 유입되면서, 면역을 갖지 않은 사람들 사이에서 폭발적인 감염이 일어나고 있는 것입니다.\n홍역은 단순한 발열이나 발진으로 끝나는 병이 아닙니다. 폐렴이나 뇌염 등의 중증 합병증을 일으켜 선진국이라도 죽음에 이를 가능성이 있습니다. 일찍이 인류가 영지를 결집하여 \u0026lsquo;봉쇄\u0026rsquo;했던 질병이, 사람들의 \u0026lsquo;의심\u0026rsquo;이라는 틈을 찔러 다시 아이들의 생명을 위협하고 있는 것입니다. 미국의 사례는 우리에게 이렇게 경고하고 있습니다. \u0026ldquo;높은 접종률이라는 방파제는 사람들의 신뢰가 흔들리면 순식간에 붕괴한다\u0026quot;고.\n언론과 전문가, 그리고 우리의 패배 왜 이러한 사태가 반복되는 것일까요. 그곳에는 현대 사회 특유의 정보 비대칭성과 우리의 인지 편향이 있습니다.\n일본의 HPV 백신 문제에서 언론은 \u0026lsquo;백신의 부작용 의심\u0026rsquo;을 선정적으로 보도했습니다. \u0026lsquo;불쌍한 피해자\u0026rsquo; 대 \u0026lsquo;냉철한 국가·제약회사\u0026rsquo;라는 구도는 이야기로서 매우 강력했고, 시청자의 감정을 강하게 뒤흔들었습니다. 한편, \u0026ldquo;통계적으로 유의미한 차이가 없다\u0026rdquo;, \u0026ldquo;이익이 위험을 상회한다\u0026quot;와 같은 전문가의 과학적인 설명은 건조하고 차갑게 울렸고, 감정의 격류 앞에서는 너무나도 무력했습니다.\n과학의 세계에서는 99%의 과학자가 지지하는 정설과 1%의 이론이 있을 때, 그것을 \u0026lsquo;동등한 의견\u0026rsquo;으로 취급하지 않습니다. 그러나 언론은 \u0026lsquo;공정성\u0026rsquo;을 중시한 나머지, 혹은 이목을 끌기 위해 수만 명의 목숨을 구하는 데이터와 1명의 감정적인 피해 호소를 \u0026lsquo;대등한 것\u0026rsquo;으로 병렬 보도했습니다. 정치인 또한 여론의 반발을 두려워하여, 과학적 근거보다 \u0026lsquo;그 자리의 분위기\u0026rsquo;를 읽는 것을 우선했습니다. 그 결과 일본에서는 HPV 백신의 적극적 권장이 약 9년간이나 중지되었고, 그 사이에 막을 수 있었던 수많은 암 피해를 낳아버린 것입니다.\n역사는 반복된다――\u0026lsquo;분위기\u0026rsquo;에 저항하는 지성을 2022년, 일본에서 마침내 HPV 백신의 적극적 권장이 재개되었습니다. 그러나 잃어버린 시간과 생명은 돌아오지 않습니다. 그리고 지금 미국에서 홍역이 재유행하고 있듯이, 방심하면 역사는 몇 번이고 반복됩니다.\n반백신 운동이나 의료에 대한 우려를 품는 것 자체를 전면 부정할 수는 없습니다. 자신의 몸에 들어가는 것에 대해 신중해지는 것은 인간의 방어 본능이며, 과거에는 실제로 약해도 일어났습니다. 권력을 감시하고 의심하는 것은 민주주의에 있어 중요합니다.\n그러나 코로나 백신, HPV 백신, 그리고 미국 홍역 유행이라는 일련의 사건이 들이대고 있는 것은, \u0026lsquo;과학을 무시한 선의의 불안\u0026rsquo;이 바이러스 자체보다 더 많은 생명을 앗아갈 수 있다 는 냉엄한 사실입니다.\n\u0026ldquo;위험할지도 모르니, 상황을 지켜보자\u0026rdquo; 그 판단을 했을 때, 우리는 \u0026lsquo;상황을 지켜보는 동안 병으로 죽을 확률\u0026rsquo;을 계산에 넣고 있을까요. \u0026ldquo;자연적인 것이 가장 좋다\u0026rdquo; 그렇게 말할 때, 우리는 \u0026lsquo;자연계에 있는 바이러스야말로 가장 가차 없이 목숨을 앗아왔다\u0026rsquo;는 역사를 잊고 있지는 않습니까.\n앞으로도 새로운 감염증이 나타나고, 새로운 백신이 개발될 것입니다. 그때 우리는 다시 \u0026lsquo;우연의 일치\u0026rsquo; 현상에 현혹되어 감정적인 선동에 휩쓸릴 것입니까. 아니면 냉정하게 데이터를 해독하고, 리스크와 베네핏을 저울질할 수 있을 것입니까.\n역사는 반복된다고 합니다. 그러나 그것을 멈출 수 있는 것은 우리의 이성뿐입니다. 우리는 통계적으로 올바른 데이터를 보고, \u0026lsquo;분위기\u0026rsquo;가 아닌 \u0026lsquo;사실\u0026rsquo;을 선택하는 지성을 가져야 합니다. 그것이 현대를 살아가는 우리의 책임입니다.\n참고문헌·데이터 출처 후생노동성: \u0026ldquo;인유두종바이러스 감염증～자궁경부암과 HPV 백신～\u0026rdquo; 국립암연구센터: 암 정보 서비스 \u0026lsquo;자궁경부암\u0026rsquo; 통계 데이터 BBC News (Japanese): \u0026ldquo;미 CDC, 홍역 유행으로 백신 접종 촉구 세계적으로 감염 증가\u0026rdquo;(2024년) 및 관련 원문 기사 오사카대학 연구팀(Yagi A, et al. Lancet Public Health. 2020): HPV 백신 정기접종의 적극적 권장 중단에 따른 초과 이환 수·사망 수의 추계에 관한 연구 Nagoya Study (Suzuki S, et al. Papillomavirus Res. 2018) ","date":"2026-01-24T15:41:23+09:00","image":"http://kenji.blog/p/%E5%8F%8D%E3%83%AF%E3%82%AF%E3%83%81%E3%83%B3%E3%81%AE%E5%8A%9F%E7%BD%AA/img_hu25fb505b5ce09f8b6e475386b0bbff8f_1013820_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E5%8F%8D%E3%83%AF%E3%82%AF%E3%83%81%E3%83%B3%E3%81%AE%E5%8A%9F%E7%BD%AA/","title":"'반백신의 공과'"},{"content":"「일본인 퍼스트」의 허상과 실상: 2026년의 일본이 직면한 「공존」이라는 이름의 방어책 시작하며: 왜 지금, 이 말이 가슴을 울리는가 2026년. 우리는 지금 전례 없는 시대의 전환점에 서 있습니다. 장기화되는 물가 상승, 실질 임금의 정체, 그리고 눈에 띄게 진행되는 저출산 고령화. 슈퍼마켓 진열대에 놓인 상품의 가격표가 바뀔 때마다 미래에 대한 불안이 우리 마음에 그림자를 드리웁니다.\n이러한 폐색감 속에서 급속히 지지를 넓히고 있는 말이 있습니다. 바로 「일본인 퍼스트」 입니다.\n\u0026ldquo;우선 자국민의 삶을 풍요롭게 해달라\u0026rdquo;, \u0026ldquo;일본의 문화와 치안을 최우선으로 지켜달라\u0026quot;는 바람은 한 명의 주권자로서, 그리고 이 나라에서 살아가는 한 명의 인간으로서 지극히 자연스럽고 절실한 욕구입니다. 하지만 이 말이 내세우는 \u0026lsquo;이상\u0026rsquo;과 통계 데이터가 보여주는 \u0026lsquo;현실\u0026rsquo; 사이에는 우리가 직시해야 할 큰 괴리가 존재합니다.\n이 글에서는 감정론이나 낙인찍기를 배제하고, 객관적인 데이터와 시계열적 변화, 그리고 사회의 각 현장에서 일어나고 있는 사실을 바탕으로 이 문제의 실체에 다가갑니다.\n제1장: 「일본인 퍼스트」의 시계열과 사회적 배경 이 말은 갑자기 나타난 것이 아닙니다. 세계적인 조류와 일본 특유의 사정이 복잡하게 얽혀 형성되었습니다.\n1. 2016년～2017년: 단어의 수입과 정착 2016년, 도널드 트럼프가 내세운 \u0026lsquo;아메리카 퍼스트\u0026rsquo;는 전 세계에 충격을 주었습니다. 국내에서는 2017년 고이케 유리코 도쿄도지사가 이끄는 \u0026lsquo;도민 퍼스트회\u0026rsquo;가 주목을 받았습니다. 이 시점에서는 정책의 우선순위를 명확히 하기 위한 수사적 측면이 강했고, 배외적인 뉘앙스는 아직 제한적이었습니다.\n2. 2023년～2024년: 불안의 가시화 팬데믹 이후의 경제 회복 지연과 급격한 엔저에 따른 인플레이션이 일반 가정을 직격했습니다. 이와 같은 시기에 SNS상에서 \u0026ldquo;외국인에 대한 지원이 너무 후하다\u0026rdquo;, \u0026ldquo;일본인의 혈세가 외국인에게 흘러가고 있다\u0026quot;는 등 단편적인 정보에 기반한 불만이 터져 나오기 시작합니다.\n3. 2025년～2026년: 정치 세력과 SNS의 융합 2025년 국정 선거에서 「일본인 퍼스트」를 공식 슬로건으로 내건 세력이 일정 의석을 확보했습니다. SNS의 알고리즘은 사람들의 불안에 반응하여 과격한 게시물을 우선적으로 표시하고, 특정 가치관만이 강화되는 \u0026lsquo;에코체임버 현상\u0026rsquo;을 가속화했습니다.\n신문사들이 실시한 최신 여론조사(2025년 말)에서는 이 슬로건에 대해 \u0026ldquo;찬성・어느 쪽이든 찬성\u0026quot;이 42%, \u0026ldquo;반대・어느 쪽이든 반대\u0026quot;가 38% 로, 여론이 두 동강 나 있는 현실이 여실히 드러나고 있습니다.\n제2장: 경제와 사회보장의 진실——\u0026lsquo;빼앗는 존재\u0026rsquo;인가 \u0026lsquo;지탱하는 기둥\u0026rsquo;인가 「일본인 퍼스트」를 지지하는 논리의 기둥 중 하나는 \u0026ldquo;외국인에게 일본인의 자원을 빼앗기고 있다\u0026quot;는 이미지입니다. 하지만 관공서의 1차 데이터는 이러한 직관과는 정반대의 현실을 보여줍니다.\n1. 노동력: 일본 경제를 유지하는 \u0026lsquo;필수적인 혈액\u0026rsquo; 후생노동성의 \u0026lsquo;외국인 고용 상황(2024년 10월 말 기준)\u0026lsquo;에 따르면, 외국인 노동자 수는 204만 8,675명 ** 입니다. 2026년 현재 추계로는 이미 ** 230만 명 을 돌파했습니다.\n산업 분야 외국인 노동자 비율・증가율 실태와 역할 건설업 전년 대비 약 22.7% 증가 인프라 유지 및 노후화된 교량・도로 수선에 필수적. 의료・복지 전년 대비 약 28.1% 증가 간병 현장의 최전선을 담당하며 일본인 고령자를 지탱하고 있음. 제조업 전체의 약 26%를 차지 일본 수출 산업의 현장을 지탱하는 대들보. 현재, 일본인이 하고 싶어도 할 수 없는 일이 아니라, \u0026ldquo;일본인을 확보할 수 없게 된 공백\u0026rdquo; 을 그들이 메우고 있습니다. 만약 「일본인 퍼스트」라는 이름 아래 그들을 배제한다면, 우리의 간병 시스템은 즉시 붕괴하고, 주택과 식료품 물가는 다시 몇 할에서 몇 배로 치솟게 될 것입니다.\n2. 사회보장: 생활보호를 둘러싼 유언비어와 실태 SNS에서 가장 확산되기 쉬운 것이 \u0026ldquo;외국인이 생활보호를 우선적으로 받고 있다\u0026quot;는 설입니다. 하지만 후생노동성의 통계를 확인해 보면, 전체 수급 세대 중 외국인이 세대주인 비율은 약 2.8～2.9% 입니다. 과거 10년 이상 이 수치는 거의 제자리걸음입니다.\n반대로 체류 외국인의 연령 구성을 보면 그 대부분이 **20대에서 40대의 현역 세대 ** 입니다. 이들은 후생연금이나 건강보험료를 납부하며, \u0026ldquo;고령의 일본인\u0026quot;이 받는 연금이나 의료비를 지탱하는 \u0026lsquo;제공자\u0026rsquo; 로서의 역할을 담당하고 있습니다. 일본인이 떠난 후의 현역 세대의 공백을 메우고, 일본의 사회보장 시스템을 연명시키고 있는 것은 다름 아닌 그들인 것입니다.\n제3장: 치안과 SNS의 편향——\u0026lsquo;외국인 범죄\u0026rsquo;의 논리적 해체 치안에 대한 불안은 「일본인 퍼스트」의 감정을 가장 강하게 자극합니다. 하지만 경찰청 통계나 법무성의 『범죄백서』를 자세히 분석해 보면, 인터넷상의 \u0026lsquo;흉악한 외국인\u0026rsquo;이라는 이미지가 얼마나 인지 왜곡에 의해 만들어진 것인지 알 수 있습니다.\n1. \u0026lsquo;총수\u0026rsquo;와 \u0026lsquo;범죄율\u0026rsquo;의 냉정한 비교 2024년 발표 통계에 따르면 전체 검거 인원 중 외국인이 차지하는 비율은 약 5.5% 입니다. 나머지 약 95%는 일본인에 의한 범죄입니다.\n인구 10만 명당 검거 인원(범죄율)으로 비교하면 더욱 본질이 보입니다.\n구분 인구 10만 명당 검거 인원(추계) 일본인(전 연령) 약 142.7명 체류 외국인(정주자・거주자) ** 약 120.0명** 중장기적으로 일본에 거주하는 외국인의 범죄율은 일본인 전체 평균보다 낮다 는 것이 통계적인 사실입니다.\n2. \u0026lsquo;세대\u0026rsquo;에 따른 편향의 마술 왜 \u0026ldquo;외국인은 무섭다\u0026quot;는 이미지가 앞서는 것일까요? 그 가장 큰 요인은 범죄학에서의 \u0026lsquo;연령 구성\u0026rsquo; 의 차이입니다.\n일본인: 약 30%가 범죄율이 극히 낮은 고령자입니다. 이 층이 \u0026lsquo;분모\u0026rsquo;를 끌어내리기 때문에 일본 전체의 수치가 낮아 보입니다. 외국인: 노동력으로 일본에 왔기 때문에 80% 이상이 ** 통계적으로 범죄가 발생하기 쉬운 \u0026lsquo;청년～중년층\u0026rsquo;** 입니다. 같은 \u0026lsquo;20대\u0026rsquo;라는 조건으로 일본인과 외국인의 범죄율을 비교하면, 양자 간에 유의미한 차이는 보이지 않습니다. 즉, \u0026ldquo;외국인이 늘어서 치안이 악화되었다\u0026quot;가 아니라, \u0026ldquo;범죄를 저지르기 쉬운 연령대(젊은 층)가 외국인이라는 형태로 일본에 존재하고 있을 뿐\u0026rdquo; 인 것입니다.\n3. SNS가 만들어내는 \u0026lsquo;확증 편향\u0026rsquo; SNS의 알고리즘은 우리의 \u0026lsquo;불안\u0026rsquo;을 연료로 삼습니다. 1건의 외국인 범죄가 발생하면, 그것이 \u0026lsquo;속성(국적)\u0026lsquo;과 결합되어 격렬하게 확산됩니다. 그러면 우리의 뇌리에는 \u0026ldquo;또 외국인이 사건을 일으켰다\u0026quot;는 기억만이 강화됩니다.\n이것을 \u0026lsquo;확증 편향\u0026rsquo; 이라고 부릅니다. 전체의 95%를 차지하는 일본인의 범죄는 \u0026lsquo;일상\u0026rsquo;으로 간과되고, 5%의 외국인 범죄가 \u0026lsquo;모든 외국인\u0026rsquo;의 이미지로 둔갑하는 것입니다.\n제4장: 문화의 계승——\u0026lsquo;파괴자\u0026rsquo;인가 \u0026lsquo;구세주\u0026rsquo;인가 \u0026ldquo;일본의 전통과 문화가 파괴된다\u0026quot;는 우려 또한 현장의 실태와는 다릅니다.\n1. 전통 공예의 \u0026lsquo;마지막 계승자\u0026rsquo; 일본 전통 공예품 제조 종사자는 1970년대 약 30만 명에서 현재는 약 5만 명 정도로 급감했습니다. 이 소멸 위기를 구하고 있는 것은 일본 문화에 깊은 경의를 표하며 일본에 온 외국인들입니다.\n양조장이나 대장간: 일본인이 계승을 포기하려던 공방에 외국인이 제자로 들어가, 해외로의 발신력이나 새로운 감성을 도입함으로써 폐업 직전의 문화를 \u0026lsquo;지속 가능한 산업\u0026rsquo;으로 재생시키고 있습니다. 2. 지역 커뮤니티의 유지 젊은 층이 사라지고 \u0026lsquo;소멸 가능 도시\u0026rsquo;가 된 지방 자치단체에서는 기능실습생이나 특정기능 외국인이 지역 축제의 주역이 되고 농업 기반을 지탱하고 있습니다. 일본인이 떠나고 방치된 휴경지를 일구며 수백 년 이어져 온 행사를 지키고 있는 것은 누구인가. 그 현실에 눈을 돌리면, 그들은 문화의 \u0026lsquo;파괴자\u0026rsquo;가 아니라 \u0026lsquo;최후의 방어선\u0026rsquo; 임을 알 수 있습니다.\n제5장: 교육 현장의 우려와 \u0026lsquo;괴롭힘\u0026rsquo;의 연쇄 「일본인 퍼스트」라는 말이 교육 현장에 도입될 때의 부작용은 심각합니다.\n\u0026lsquo;안과 밖\u0026rsquo;을 나누는 이분법적 대립: 아이들이 \u0026ldquo;일본인은 우선시되어야 할 특권 계급이다\u0026quot;라는 잘못된 선민의식을 내면화하면, 그것은 쉽게 \u0026ldquo;자신들과 다른 자\u0026quot;를 배제하는 괴롭힘으로 이어집니다. 뿌리에 따른 서열화: 일본 국적을 가지고 있어도 외모나 이름이 다른 아이들이 \u0026ldquo;일본인이 아니다\u0026quot;라며 공격받는다. 이것은 교육의 붕괴이며, 미래의 일본을 짊어질 인재를 스스로 상처 입히는 행위입니다. 교육 현장의 전문가들은 \u0026lsquo;퍼스트\u0026rsquo;라는 말이 갖는 배타성이 아이들의 다문화 공생 능력을 약화시키고, 결과적으로 일본을 세계로부터 고립시킬 위험이 있다고 우려하고 있습니다.\n제6장: 세계적인 조류와 포퓰리즘의 물결 이러한 현상은 일본 고유의 것이 아닙니다. 구미 국가들에서도 글로벌화의 혜택을 받지 못한 계층이 \u0026lsquo;자국 제일주의\u0026rsquo;를 내세우는 포퓰리즘으로 흘러가는 현상이 계속되고 있습니다.\n하지만 일본이 구미와 결정적으로 다른 점은 \u0026ldquo;세계에서 가장 빠른 속도로 인구가 감소하고 있다\u0026rdquo; 는 점입니다. 다른 나라에는 \u0026lsquo;제한\u0026rsquo;이라는 선택지가 있더라도, 일본에는 \u0026lsquo;협력\u0026rsquo; 없이는 유지할 수 없는 사회 인프라가 이미 무수히 존재합니다. 감정적인 \u0026lsquo;퍼스트\u0026rsquo;를 고수하는 것은 논리적인 \u0026lsquo;완만한 자살\u0026rsquo;을 의미합니다.\n맺음말을 대신하여: 진정한 「일본인 퍼스트」란 무엇인가 「일본인 퍼스트」라는 말에 담긴, \u0026ldquo;국민의 생활을 최우선으로 생각해 달라\u0026quot;는 바람 그 자체는 한 국가의 정부가 가져야 할 가장 기본적인 책무입니다.\n하지만 그 바람을 이루기 위한 수단이 \u0026lsquo;이웃의 배제\u0026rsquo;여서는 안 됩니다. 객관적인 데이터가 보여주듯, 우리가 지금 누리고 있는 생활의 편리성, 치안, 전통문화, 그리고 사회보장제도 그 자체가 이미 외국인의 존재 없이는 성립하지 않는 \u0026lsquo;의존과 공생\u0026rsquo;의 단계에 있기 때문입니다.\n진정한 「일본인 퍼스트」란, 다음 3가지를 냉정하게 실천하는 것이 아닐까요?\n사실에 기반한 논의: 유언비어나 과장된 정보에 휩쓸리지 않고, 관공서의 1차 통계를 바탕으로 현실을 파악한다. 공정한 룰의 확립: 외국인에게는 일본의 룰을 준수하게 하고, 한편으로 일본 사회는 그들을 공정한 파트너로서 대우한다. 내면의 업데이트: 외국인을 수용하는 것을 \u0026lsquo;일본을 잃는 것\u0026rsquo;으로 여기는 것이 아니라, 그들의 힘을 빌려 \u0026lsquo;일본을 재건하고 유지하는 것\u0026rsquo;이라는 인식의 전환. 2026년, 우리는 큰 기로에 서 있습니다. 분단의 언어를 계속 외치며 스스로 목을 조를 것인가. 아니면 현실을 직시하고 다양한 사람들이 함께 지탱하는 \u0026lsquo;지속 가능한 일본\u0026rsquo;으로의 한 걸음을 내디딜 것인가.\n해답은 한 사람 한 사람의 마음속 \u0026lsquo;지성\u0026rsquo;과 \u0026lsquo;용기\u0026rsquo; 안에 있습니다.\n","date":"2026-01-23T13:43:41+09:00","image":"http://kenji.blog/p/%E6%97%A5%E6%9C%AC%E4%BA%BA%E3%83%95%E3%82%A1%E3%83%BC%E3%82%B9%E3%83%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E6%80%9D%E3%81%86%E3%81%93%E3%81%A8/img_hua12d272c50d3b08d888fe1df256a5051_1332597_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E6%97%A5%E6%9C%AC%E4%BA%BA%E3%83%95%E3%82%A1%E3%83%BC%E3%82%B9%E3%83%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E6%80%9D%E3%81%86%E3%81%93%E3%81%A8/","title":"'「일본인 퍼스트」의 허상과 실상: 2026년 일본이 직면한 「공존」이라는 이름의 방어책'"},{"content":"【주의】Gemini의 무료 체험이 끝나면 청구된다? 해지 방법 정리 Google의 AI 서비스 「Gemini」를 사용해 보려 하면, 가장 먼저 1개월 무료 체험 이 준비되어 있습니다. 「무료라면 일단 시도해 볼까」하고 등록하는 사람도 많을 텐데, 여기서 주의할 점이 있습니다.\n무료 체험이 끝나면 어떻게 되나? 체험 기간이 종료되면, 자동으로 월 2,900엔 이 청구됩니다. 이것은 「Google One 멤버십」이라는 구독에 연결되어 있어서, 특별히 아무것도 하지 않으면 계속 과금으로 넘어가는 구조입니다.\n해지하면 청구되지 않지만… 물론, 체험 중에 해지하면 요금은 발생하지 않습니다. 공식 해설 페이지에도 「Google One 멤버십을 해지하는 방법」이 나와 있습니다.\n👉 Google One 멤버십을 해지하기(공식)\n하지만, 실제로 접속해 보면 「어째선지 해지가 되지 않는」 상황에…. 「어, 어디서 멈춰야 하지?」라고 혼란스러웠습니다.\n올바른 해지 방법은 이쪽! 여러 가지로 조사한 결과, 실제로 해지할 수 있었던 것은 다음 페이지부터였습니다.\n👉 Google 계정 – 서비스 삭제\n여기서 「Google One」을 선택하고 삭제하면, 해지가 완료됩니다.\n정리 Gemini의 무료 체험은 1개월 종료 후에는 자동으로 월 2,900엔 이 과금된다 해지는 공식 설명 페이지에서는 할 수 없는 경우가 있다 실제로 해지할 수 있는 곳은 「서비스의 삭제」 페이지 「무료 체험이니까 괜찮다」고 생각하고 있으면, 눈치채지 못하는 사이에 과금되어 버리므로 주의해 주세요!\n👉 이 기사를 읽고 있는 사람은, 어쩌면 지금 바로 「해지 어디서?」라며 곤란해하고 있을지도 모릅니다. 우선 위의 링크에서 체크해 보세요.\n","date":"2025-09-27T10:02:59+09:00","image":"http://kenji.blog/p/google-one-gemini%E3%81%8C%E8%A7%A3%E7%B4%84%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E6%99%82%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95/img_hue118597de1df33c0e1a19ecde6d4d33f_1730014_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/google-one-gemini%E3%81%8C%E8%A7%A3%E7%B4%84%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E6%99%82%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95/","title":"Google One (Gemini) 해지가 안 될 때의 대처 방법"},{"content":"🎬 YouTube 방송용 대본 (연하장 작성 앱 개발・제1회) 방송 시작 (도입부 2～3분) 가벼운 인사 \u0026ldquo;안녕하세요. 오늘부터 연하장 작성 앱을 C++로 꾸준히 만들어가는 방송을 시작하겠습니다.\u0026rdquo; \u0026ldquo;완성까지 몇 번 방송하게 될지는 모르겠지만, 시리즈로 조금씩 진행해 나가겠습니다.\u0026rdquo; \u0026ldquo;기본적으로는 말없이 작업할 예정이므로, 작업용 BGM으로 봐주시면 감사하겠습니다.\u0026rdquo;\n목표로 하는 앱의 개요 \u0026ldquo;이 앱에서는 연하장의 뒷면을 디자인할 수 있도록 만들고자 합니다.\u0026rdquo; \u0026ldquo;사진 삽입이나 폰트 어레인지, AI를 사용한 이미지 가공이나 일러스트 생성도 도입하여, 최종적으로는 Microsoft Store에 업로드할 예정입니다.\u0026rdquo;\n오늘의 작업 목표 \u0026ldquo;제1회인 오늘은 환경을 정비하고 기반을 만들어 가겠습니다.\u0026rdquo; \u0026ldquo;구체적으로는,\nGIT 리포지토리 생성 메인 윈도우 생성 버전 정보 다이얼로그 표시 메뉴 생성 및 종료 명령 구현 Direct2D의 초기화・해제 처리와 HelloWorld 표시 를 진행하고자 합니다.\u0026rdquo;\n소스 코드 공개에 대하여 \u0026ldquo;소스 코드는 GitHub에 공개하고 있습니다. 관심 있으신 분들은 꼭 한번 들여다봐 주세요.\u0026rdquo; → https://github.com/kenjinote/NengaCardApp/\n작업 파트 (무언) GitHub 리포지토리 생성 → 초기 커밋\n메인 윈도우의 템플릿 생성\n버전 다이얼로그나 메뉴 생성과 종료 명령 구현\nDirect2D의 초기화와 해제 처리 → HelloWorld 표시 확인\n적절히 GitHub에 push\n※기본은 무언, 필요할 때만 짧게 해설을 넣음\n방송 종료 전 (마지막 1～2분) 오늘의 진척 요약 \u0026ldquo;오늘은 GIT 리포지토리를 만들고, 윈도우나 종료 버튼, 버전 다이얼로그를 구현했습니다.\u0026rdquo; \u0026ldquo;Direct2D로 HelloWorld를 표시하는 곳까지 할 수 있었습니다.\u0026rdquo;\n다음 회 예고 \u0026ldquo;다음 회부터는 UI 부분을 다듬거나, 문자열의 객체화 등으로 진행해 나갔으면 합니다.\u0026rdquo;\nGitHub 링크 재안내 → https://github.com/kenjinote/NengaCardApp/\n마무리 \u0026ldquo;시청해 주셔서 감사합니다. 다음 회도 꾸준히 계속해 나갈 테니, 잘 부탁드립니다.\u0026rdquo;\n","date":"2025-08-31T20:24:49+09:00","image":"http://kenji.blog/p/%E5%B9%B4%E8%B3%80%E7%8A%B6%E4%BD%9C%E6%88%90%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E9%85%8D%E4%BF%A1-vol.1/img_hu403d76b87feb7669f72c38243c5cb621_1021075_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E5%B9%B4%E8%B3%80%E7%8A%B6%E4%BD%9C%E6%88%90%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E9%85%8D%E4%BF%A1-vol.1/","title":"'연하장 작성 앱 개발 방송 VOL.1 (대본)'"},{"content":"msix에 자체 서명 인증서를 추가하여 설치할 수 있게 만들기 Windows에서 앱을 배포할 때, MSIX 패키지 를 이용하면 설치나 업데이트 구조가 통일되어 편리합니다. 하지만 MSIX에는 \u0026lsquo;반드시 서명된 인증서\u0026rsquo;가 필요하다는 제약이 있습니다. 기업이나 개인이 개발한 앱을 테스트 배포하고 싶을 때, \u0026ldquo;상용 코드 서명 인증서를 구매하는 것은 너무 과하다\u0026quot;고 생각되는 상황도 있을 것입니다.\n이럴 때 유용한 것이 자체 서명 인증서(Self-Signed Certificate) 입니다. 이 글에서는 MSIX에 자체 서명 인증서를 추가하여 로컬 환경에서 설치할 수 있도록 하는 절차를 정리합니다.\n1. 자체 서명 인증서 생성하기 먼저 PowerShell을 관리자 모드로 실행하고, 아래의 명령어를 실행합니다.\n1 2 // 자체 서명 인증서 생성 New-SelfSignedCertificate -Type CodeSigningCert -Subject \u0026#34;CN=035A9AAC-915B-4CE1-AE39-1A101BED42F5\u0026#34; -CertStoreLocation Cert:\\CurrentUser\\My -NotAfter (Get-Date).AddYears(10) -KeyUsage DigitalSignature -FriendlyName \u0026#34;kenjinote\u0026#34; 여기서 생성되는 것은 \u0026lsquo;코드 서명용\u0026rsquo; 인증서입니다.\n-FriendlyName으로 알기 쉬운 이름을 지정해 두면 나중에 찾기 쉽습니다. -NotAfter로 유효기간을 조정할 수 있습니다. 이번에는 10년으로 설정했습니다. 2. PFX 파일 내보내기 생성한 인증서를 PFX 형식으로 내보내어 signtool에서 이용할 수 있게 합니다.\n1 2 3 4 // pfx 생성 $cert = Get-ChildItem Cert:\\CurrentUser\\My | Where-Object { $_.FriendlyName -eq \u0026#34;kenjinote\u0026#34; } $password = ConvertTo-SecureString -String \u0026#34;password\u0026#34; -Force -AsPlainText Export-PfxCertificate -Cert $cert -FilePath \u0026#34;D:\\pfx\\cert.pfx\u0026#34; -Password $password 이때 설정한 비밀번호(예시에서는 password)는 나중에 서명 작업 시 필요합니다.\n3. 자체 서명 인증서를 신뢰할 수 있는 루트 인증 기관에 설치하기 생성한 인증서는 그대로는 Windows에서 신뢰하지 않습니다. 설치하려면 certmgr.msc에서 [신뢰할 수 있는 루트 인증 기관] → [인증서] 로 가져와야 합니다.\n내보낸 인증서(.cer나 .pfx)를 가져오면, 대상 PC 상에서는 신뢰할 수 있는 인증서로 취급됩니다. 이를 통해 MSIX에 서명해도 \u0026lsquo;신뢰할 수 없는 인증서\u0026rsquo;라는 경고가 나타나지 않게 됩니다.\n4. 인스톨러(MSIX)에 서명 추가하기 마지막으로, 생성한 PFX 인증서를 사용하여 MSIX에 서명합니다. signtool은 Visual Studio나 Windows SDK에 포함되어 있습니다.\n1 2 // 인스톨러에 서명 추가하기 signtool sign /fd SHA256 /f \u0026#34;D:\\pfx\\cert.pfx\u0026#34; /p \u0026#34;password\u0026#34; \u0026#34;C:\\installer\\installer.msix\u0026#34; /fd SHA256은 서명 알고리즘을 지정합니다. /f로 PFX 파일을 지정하고, /p로 비밀번호를 전달합니다. 마지막으로 MSIX 파일의 경로를 지정해 주세요. signtool의 경로가 설정되어 있지 않은 경우에는 전체 경로로 지정해 주세요. 제 환경에서는 아래 위치에 있었습니다. 1 \u0026#34;C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages\\microsoft.windows.sdk.buildtools\\10.0.26100.1742\\bin\\10.0.26100.0\\x64\\signtool.exe\u0026#34; 이로써 서명이 완료되고, 대상 PC에서 설치 가능한 MSIX가 완성됩니다.\n요약 New-SelfSignedCertificate 로 자체 서명 인증서를 생성한다 Export-PfxCertificate 로 PFX를 내보낸다 신뢰할 수 있는 루트 인증 기관 에 인증서를 설치한다 signtool 로 MSIX에 서명한다 이 흐름을 파악해두면, 상용 인증서를 구매하지 않고도 로컬 환경에서 동작 확인이나 테스트 배포가 가능해집니다. 물론 실제 상용 배포에서는 인증 기관에서 발급한 인증서가 필수적이지만, 개발 및 검증 단계에서는 이 방법이 매우 유용합니다.\n👉 이번에는 installer.msix를 예로 들었지만, 같은 절차를 자작 앱에도 적용할 수 있습니다.\n","date":"2025-08-30T04:18:04+09:00","image":"http://kenji.blog/p/msix%E3%81%AB%E8%87%AA%E5%B7%B1%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E3%81%A4%E3%81%91%E3%81%A6%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B/img_hu193aeacbbfca091956fdf9aac7d139a2_495432_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/msix%E3%81%AB%E8%87%AA%E5%B7%B1%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E3%81%A4%E3%81%91%E3%81%A6%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B/","title":"'msix에 자체 서명 인증서를 추가하여 설치할 수 있게 만들기'"},{"content":"「코드 작성은 못하지만 논리는 있는 사람」을 위한 도구. LogicPad를 만든 이유 안녕하세요, kenji입니다. 로우코드 도구 \u0026lsquo;LogicPad\u0026lsquo;를 만든 개발자입니다. 이번에는 제품 소개가 아니라, \u0026ldquo;왜 이것을 만들려고 생각했는가?\u0026ldquo;라는 개발의 이면, 그리고 제 자신의 생각에 대해 조금 개인적인 관점에서 써보려고 합니다.\n솔직히, 이것은 단순한 도구 개발이 아니었습니다. 제 과거, 직장에서의 답답함, 스킬셋, 그리고 계속 가슴속에 품고 있던 \u0026ldquo;언젠가 내 제품을 만들고 싶다\u0026quot;는 마음―― 그 모든 것이 겹쳐진 결과로 탄생한 것이 LogicPad입니다.\n즉, 이것은 저에게 \u0026ldquo;인생의 집대성 프로젝트\u0026rdquo; 이기도 합니다. 그런 배경을 가능한 한 솔직하게, 열정을 담아 써내려가 보겠습니다.\n솔직하게 \u0026ldquo;이것은 내가 만들었다\u0026quot;라고 가슴을 펴고 말할 수 있는 제품이 갖고 싶었다 솔직히 말하자면, 이것이 가장 첫 번째 동기였습니다.\n예전부터 일로나 취미로나 코드 짜는 것을 좋아했습니다. 여러 개발에도 참여해왔습니다. 하지만 어느 날 문득 깨달았습니다. \u0026ldquo;내 이름으로, 내 책임으로 세상에 내놓은 제품이 없다\u0026rdquo; 는 것을요.\n물론 팀으로 만드는 것에는 가치가 있고, 자랑스러운 일도 많이 있었습니다. 하지만 어딘가에서 \u0026ldquo;이대로 누군가의 이름 아래서 커리어를 끝내는 걸까\u0026quot;라는 허무함도 있었습니다.\n한 번이라도 좋습니다. \u0026ldquo;이것은 내가 만들었다\u0026quot;라고 당당하게 말할 수 있는 것을 남기고 싶었습니다. 그렇게 생각해서 LogicPad의 구상을 다듬기 시작했습니다. 지금으로부터 약 6년 전(2019년경)의 일입니다. (원래의 아이디어 자체는 언리얼 엔진의 비주얼 프로그래밍 언어인 블루프린트를 알게 된 2015년쯤 전의 일입니다.)\n코드를 쓸 수 없어서 손을 댈 수 없다. 그거 너무 아깝지 않나요? 제 직장에는 우수한 사람이 많았습니다.\n논리는 짤 수 있습니다. Excel 함수도 자유자재로 다루고, 문제의 본질도 간파할 수 있습니다. 하지만―― \u0026lsquo;코드를 작성한다\u0026rsquo;는 단계에서 손이 멈춰버립니다.\n\u0026ldquo;이 작업, 매번 매뉴얼을 보면서 하고 있는데, 자동화할 수 없을까요?\u0026rdquo; \u0026ldquo;응, 할 수 있어. 하지만\u0026hellip; 그러려면 코드를 써야 해\u0026hellip;\u0026rdquo;\n그런 대화가 여러 번 있었습니다.\n저는 그때마다 생각했습니다. \u0026ldquo;논리는 아는데, 코드라는 장벽에 막혀버리는 것은 정말로 아깝다\u0026quot;고.\n로우코드 에디터라는 선택지 사실 이전 직장에서는 GUI 조작으로 움직이는 2차원 CAD를 개발하고 있었습니다. CAD란 마우스를 사용해 도형을 조립해 나가는 거잖아요. 즉, \u0026ldquo;조작으로 논리를 조립해 나간다\u0026rdquo; 는 세계관입니다.\n\u0026ldquo;이거, 로우코드랑 엄청 궁합이 좋겠다\u0026quot;라고 생각했습니다.\n더 거슬러 올라가면, 학생 시절부터 계속 화상 처리나 수치 처리, Windows 도구, SNS 자동 게시 도구 등, 생각나면 바로 코드를 짜서 작은 프로그램을 양산하고 있었습니다. 600개 이상은 될 거라고 생각합니다. 지금도 GitHub에 남아있습니다.\n당시에는 의미 따위는 생각하지 않았습니다. 그저 \u0026ldquo;만들고 싶으니까 만든다\u0026rdquo;. 그것뿐이었습니다.\n하지만 지금, LogicPad를 만들고 있으니\u0026hellip;\n마치, 점과 점이 선으로 연결된 것 같았습니다.\n사용하기 쉽지만 강력하다. 밸런스의 어려움 개발을 진행하면서 계속 생각했던 것이 \u0026ldquo;직관적으로 사용할 수 있으면서도 제대로 강력한 도구로 만든다\u0026rdquo; 는 것.\n기능을 추가하면 할 수 있는 것은 늘어납니다. 하지만 사용하기 어려워집니다. 단순하게 만들면 누구나 다룰 수 있습니다. 하지만 그러면 부족함을 느끼는 사람도 생깁니다.\n\u0026ldquo;로우코드 도구는 장난감이지?\u0026ldquo;라는 말을 듣지 않도록. 그렇지만 \u0026ldquo;결국 코드를 작성하지 않으면 안 되잖아\u0026quot;라는 말도 듣지 않도록.\n직관과 표현력, 그 아슬아슬한 선에서 계속 싸우고 있었습니다.\n몇 번이나 UI를 다시 만들고, 몇 번이나 버리고, 그리고 마침내 \u0026ldquo;이거라면 괜찮겠다\u0026quot;라고 생각되는 형태에 가까워졌을 때는, 정말 기뻤습니다.\n처음으로 \u0026lsquo;사용자\u0026rsquo;의 한마디에 구원받았다 처음 LogicPad를 건네준 사람은 전 동료였습니다. IT는 서툴고, 코드도 무서워합니다. 하지만 논리는 잘합니다.\n조금 설명하고 만져보게 하고\u0026hellip; 몇 분 뒤에 했던 한마디를 지금도 잊을 수 없습니다.\n\u0026ldquo;이거라면 나라도 할 수 있을 것 같아!\u0026rdquo;\n정말로 눈물이 날 것 같았습니다. 제가 주고 싶었던 것은 바로 이거였다고.\n움직이는 도구가 아니라, \u0026ldquo;스스로 만들 수 있었다!\u0026ldquo;는 감각. 그것이야말로 LogicPad의 진정한 가치라고 확신했습니다.\n만들 수 있는 사람이 늘어나면, 사회는 더욱 재미있어진다 저는 \u0026lsquo;기술의 민주화\u0026rsquo;가 정말로 중요하다고 생각합니다.\n기술에는 세상을 바꿀 힘이 있습니다. 하지만 그것을 다룰 수 있는 사람은 한정되어 있습니다.\n만약 \u0026lsquo;논리를 안다\u0026rsquo;는 것만으로 앱을 만들 수 있다면?\n더 많은 사람이 \u0026lsquo;만드는 쪽\u0026rsquo;으로 넘어올 수 있게 됩니다. 그리고 그곳에서 탄생하는 것은 지금의 상상을 뛰어넘을 것이라고 생각합니다.\nLogicPad가 그 입구가 될 수 있다면. \u0026ldquo;만들어보고 싶다\u0026quot;를 \u0026ldquo;만들 수 있다\u0026quot;로 바꾸는 도구이고 싶습니다.\n그것이 저의 바람입니다.\n마치며 LogicPad는 아직 베타 버전으로 완성되지 않았습니다. 개선점도, 하고 싶은 일도 아직 산더미처럼 있습니다.\n하지만 저는 이 도구에 제 인생의 \u0026ldquo;점\u0026quot;을 전부 쏟아붓고 있습니다. 지금이라면 가슴을 펴고 말할 수 있습니다.\n\u0026ldquo;이것은 내가 만든 제품이다\u0026rdquo; 라고.\n👇 덤: LogicPad로 할 수 있는 일 드래그 앤 드롭으로 처리 구축 조건 분기나 변수 등도 GUI로 다룰 수 있음 다양한 AI 연동 노드 준비 스크립트 삽입으로 상급자용 확장도 가능 고정밀 수학 함수·데이터 처리 (무한 자릿수 정밀도의 수치 연산 등) 상급자를 위한 단축키도 충실 90개국 이상의 언어 지원 앞으로 하고 싶은 일 AI와 연동하여 자연어에서 논리를 생성 사용자가 커스텀 노드를 생성할 수 있는 구조 작성한 노드나 논리를 공유할 수 있는 플랫폼 구축 ✍️ 후기 여기까지 읽어주셔서 정말 감사합니다. 이것은 단순한 도구 개발이 아니라, 제 자신의 경험, 열정, 인생의 파편을 쏟아부은 하나의 도전이었습니다.\n\u0026ldquo;코드는 못 짜지만, 논리는 있다\u0026rdquo; 그런 사람들이 자신의 힘으로 \u0026ldquo;만들 수 있게\u0026rdquo; 되는 미래. 그것을 앞으로도 LogicPad를 통해 지향해 나가고 싶습니다.\n만약 조금이라도 \u0026ldquo;사용해보고 싶다\u0026quot;고 생각해 주셨다면, 그것만으로도 매우 기쁩니다. 흥미가 생기신 분은 꼭 LogicPad를 시험해 보세요.\n그리고 사용해본 소감이나 깨달은 점이 있다면 어떤 사소한 것이라도 좋습니다. 당신의 목소리가 이 제품의 다음 한 걸음을 만드는 큰 힘이 됩니다.\n앞으로도 잘 부탁드립니다.\n","date":"2025-07-30T23:51:35+09:00","image":"http://kenji.blog/p/logicpad-%E9%96%8B%E7%99%BA%E7%A7%98%E8%A9%B1/img_hu2f3df13f20424b87da3515770faf1b1c_1676910_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/logicpad-%E9%96%8B%E7%99%BA%E7%A7%98%E8%A9%B1/","title":"'LogicPad 개발 비화'"},{"content":"PowerShell로 Excel이나 Word 등의 메타데이터(개인 정보)를 일괄 삭제하는 방법 Excel 등의 Office 파일에는 작성자, 최종 수정자, 회사명 등의 \u0026lsquo;메타데이터(개인 정보)\u0026lsquo;가 자동으로 저장됩니다. 사외에 파일을 공유할 때 등, 이러한 정보를 삭제하고 싶은 경우가 많습니다.\n이 글에서는 PowerShell을 사용하여 Excel의 메타데이터를 삭제하는 방법을 중심으로, 폴더 내 일괄 처리 ** 나, ** Word・PowerPoint 등 다른 Office 파일에 대한 응용 까지 자세히 해설합니다.\n1. 하나의 Excel 파일 메타데이터 삭제하기 가장 기본이 되는, 단일 Excel 파일의 개인 정보를 삭제하는 스크립트입니다. Excel의 COM 개체를 호출하여, RemovePersonalInformation 속성을 $true로 설정하고 덮어쓰기 저장합니다.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # Excel 애플리케이션을 숨김 상태로 시작 $excel = New-Object -ComObject Excel.Application $excel.Visible = $false $excel.DisplayAlerts = $false # 파일 열기（※절대 경로 지정） $filePath = \u0026#34;C:\\Path\\To\\Your\\File.xlsx\u0026#34; $wb = $excel.Workbooks.Open($filePath) # 메타데이터(개인 정보)를 삭제하는 설정 활성화 $wb.RemovePersonalInformation = $true # 덮어쓰기 저장하고 닫기 $wb.Save() $wb.Close($false) # Excel을 종료하고 메모리 해제 $excel.Quit() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null 주의점: Workbooks.Open()에 전달하는 경로는 반드시 ** 절대 경로(전체 경로)** 를 지정해 주세요. 상대 경로일 경우 오류가 발생할 수 있습니다.\n2. 폴더 내의 모든 Excel 파일을 일괄로 처리하기 실무에서는 \u0026ldquo;특정 폴더에 들어 있는 수십 개의 Excel 파일 메타데이터를 한 번에 지우고 싶다\u0026quot;는 경우가 많을 것입니다. Get-ChildItem을 조합하여 루프 처리를 수행함으로써 실현할 수 있습니다.\n1 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 $targetFolder = \u0026#34;C:\\Path\\To\\Your\\Folder\u0026#34; # 폴더 내의 .xlsx 및 .xls 파일을 모두 가져오기 $excelFiles = Get-ChildItem -Path $targetFolder -Include \u0026#34;*.xlsx\u0026#34;, \u0026#34;*.xls\u0026#34; -Recurse if ($excelFiles.Count -eq 0) { Write-Host \u0026#34;Excel 파일을 찾을 수 없습니다.\u0026#34; exit } $excel = New-Object -ComObject Excel.Application $excel.Visible = $false $excel.DisplayAlerts = $false foreach ($file in $excelFiles) { Write-Host \u0026#34;$($file.Name) 의 메타데이터를 삭제 중...\u0026#34; # 파일 열기 $wb = $excel.Workbooks.Open($file.FullName) # 메타데이터를 삭제하고 덮어쓰기 저장 $wb.RemovePersonalInformation = $true $wb.Save() $wb.Close($false) } $excel.Quit() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null Write-Host \u0026#34;모든 처리가 완료되었습니다!\u0026#34; 3. 다른 Office 파일 (Word / PowerPoint) 의 메타데이터 삭제하기 Excel 뿐만 아니라, Word나 PowerPoint에서도 완전히 같은 논리로 메타데이터를 삭제할 수 있습니다. 호출하는 COM 개체의 이름이 다를 뿐, RemovePersonalInformation 속성이 준비되어 있는 것은 공통입니다.\nWord의 경우 1 2 3 4 5 6 7 8 9 10 11 $word = New-Object -ComObject Word.Application $word.Visible = $false $word.DisplayAlerts = 0 $doc = $word.Documents.Open(\u0026#34;C:\\Path\\To\\Your\\File.docx\u0026#34;) $doc.RemovePersonalInformation = $true $doc.Save() $doc.Close() $word.Quit() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($word) | Out-Null PowerPoint의 경우 PowerPoint의 경우 RemovePersonalInformation 속성 설정은 동일하지만, 숨김 시작 동작이 조금 다릅니다.\n1 2 3 4 5 6 7 8 9 10 $ppt = New-Object -ComObject PowerPoint.Application # 제2인수〜제4인수에서 숨김 모드(msoFalse) 등을 지정하여 열기 $presentation = $ppt.Presentations.Open(\u0026#34;C:\\Path\\To\\Your\\File.pptx\u0026#34;, $false, $false, $false) $presentation.RemovePersonalInformation = $true $presentation.Save() $presentation.Close() $ppt.Quit() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ppt) | Out-Null 요약 PowerShell과 COM 개체를 활용하면, Office 파일의 메타데이터 삭제를 완전히 자동화할 수 있습니다. 사외비 정보나 개인 이름이 의도치 않게 유출되는 것을 막기 위해서라도, 납품 전 폴더 일괄 처리 스크립트 등을 준비해 두면 매우 편리합니다.\n","date":"2025-07-30T02:42:40+09:00","image":"http://kenji.blog/p/powershell-%E3%81%A7-excel-%E3%81%AE%E3%83%A1%E3%82%BF%E3%83%87%E3%83%BC%E3%82%BF%E5%80%8B%E4%BA%BA%E6%83%85%E5%A0%B1%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/powershell_metadata_eyecatch_1788588033601_hud95a00206aa1dcf32de9cdc0ccb17972_952041_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/ko/p/powershell-%E3%81%A7-excel-%E3%81%AE%E3%83%A1%E3%82%BF%E3%83%87%E3%83%BC%E3%82%BF%E5%80%8B%E4%BA%BA%E6%83%85%E5%A0%B1%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"'PowerShell로 Excel이나 Word 등의 메타데이터(개인 정보)를 일괄 삭제하는 방법'"},{"content":"케플러 추측을 알기 쉽게 해설! ～수박을 가장 꽉 차게 담는 방법～ 안녕하세요, kenji입니다!\n오늘은 \u0026lsquo;케플러 추측\u0026rsquo;이라는 조금 어려워 보이는 이름의 수학 이야기를 가능한 한 알기 쉽게 설명해 보려고 합니다.\n언뜻 보면 엄청 매니악한 이야기지만, \u0026ldquo;수박을 상자에 꽉 차게 담으려면 어떻게 해야 할까?\u0026ldquo;라는 비교적 친숙한 문제이기도 합니다. 편의점 냉장고와도 관계가 있고, 짐을 쌓는 방법과도 관계가 있죠.\n그리고 수학의 세계에서는 이것이 무려 400년 이상 증명되지 못했다 는, 엄청나게 낭만 있는 이야기이기도 합니다.\n그럼 시작해 볼까요!\n애초에 케플러가 누구야? 먼저, \u0026lsquo;케플러 추측\u0026rsquo;의 \u0026lsquo;케플러\u0026rsquo;가 누구야? 하는 이야기인데요.\n이것은 요하네스 케플러(Johannes Kepler) 라는 독일의 천문학자 겸 수학자의 이름입니다.\n이 사람, 엄청나게 대단한 사람이에요. 예를 들어, 행성의 궤도가 타원형이라는 것을 발견한 것도 이 사람입니다. 지금은 당연한 지식이지만, 당시(1600년경)는 지동설조차 제대로 믿어지지 않던 시대였거든요.\n갈릴레오 = 관측의 천재 케플러 = 수식으로 우주를 설명한 천재 뉴턴 = 그 이론을 물리 법칙으로 정리한 초천재 이런 위치로, 케플러는 \u0026lsquo;수식으로 우주를 말하는\u0026rsquo; 선구자였습니다.\n그런 그가 어느 날 이렇게 말합니다.\n케플러 추측이 뭐야? \u0026lsquo;케플러 추측\u0026rsquo;이란 간단히 말해 이런 이야기입니다.\n같은 크기의 구(수박이나 오렌지)를 상자에 담을 때, 어떤 배열이 가장 꽉 차게 담을 수 있을까?\n라는 문제.\n그래서 케플러가 1600년대에 추측한 것이\n채소가게에서 오렌지를 진열하듯이 삼각형 모양으로 쌓는 게 가장 효율적이지 않을까?\n라는 것.\n이것을 수학적으로 말하면 \u0026lsquo;최조밀 충전 문제\u0026lsquo;라고 해서, 구를 공간에 가장 빽빽하게 깔아 채우는 방법을 찾는 문제인 거죠.\n케플러는 \u0026lsquo;면심 입방 구조(FCC)\u0026lsquo;라는 배열(수박을 삼각형으로 쌓는 것 같은 느낌)이 가장 효율이 좋다고 추측했습니다.\n그래서 다들 \u0026ldquo;확실히 그럴싸하네～\u0026ldquo;라고는 생각했지만, 수학적으로 \u0026ldquo;절대적으로 이게 최고다!\u0026ldquo;라고 증명하는 것이 엄청나게 어려웠습니다.\n증명까지 400년!?! 그럼 실제로 그것이 언제 증명되었냐 하면\u0026hellip;\n무려 1998년～2005년경 입니다. 즉, 400년 가까이 아무도 증명하지 못했다 는 것이죠. 너무 대단합니다.\n게다가 증명한 것은 미국의 수학자 토머스 헤일스(Thomas Hales) 라는 사람.\n이 사람은 손계산만으로는 무리라고 판단하여 컴퓨터를 사용해 증명 했습니다. 하지만 그 증명이 너무 복잡해서 인간이 제대로 확인할 수 없다!는 문제가 발생.\n그래서 수학계에서도 \u0026ldquo;그럼 컴퓨터로 증명한 것을 정말 믿을 수 있는 거야?\u0026ldquo;라는 대논쟁이 일어났습니다.\n결국 \u0026ldquo;컴퓨터를 포함해서 엄밀하게 검증했어!\u0026ldquo;라는 증명(정식으로는 \u0026lsquo;정형 증명\u0026rsquo;이라고 합니다)이 완료된 것은 2014년.\n즉, 케플러의 직감이 옳았다고 증명되기까지 400년 이상 걸렸다는 것입니다. 대단한 낭만이죠.\n실생활에서도 엄청 많이 쓰인다 \u0026lsquo;구를 어떻게 배열할까\u0026rsquo;라니, 수학 오타쿠들만의 이야기인가 싶지만, 사실은 엄청 실용적입니다.\n편의점 냉장고에 음료수를 효율적으로 채울 때 통조림을 수송용 팔레트에 쌓을 때 통신(디지털 신호 압축 등)에도 응용되고 있다 3D 프린터나 결정 구조 설계에도 사용된다 등등, 사실은 우리 생활의 이면에서 팍팍 사용되고 있는 이론입니다.\n요약: 인간의 직감은 대단해 그럼 요약하겠습니다.\n케플러 추측 = 구를 가장 꽉 차게 담으려면 어떻게 해?라는 문제 케플러 씨 = 행성의 궤도를 발견한 수학·천문학자 추측된 것은 1600년대! 하지만 증명된 것은 2000년대! 실생활에도 엄청나게 응용되고 있다! 그리고 무엇보다 재미있는 것은, \u0026ldquo;채소가게 아저씨가 감각적으로 하던 쌓기 방식이 수학적으로도 최강이었다\u0026rdquo; 는 점.\n즉, 인간의 직감은 대단하다. 그리고 그것을 증명하는 데 400년이 걸릴 수도 있다 는 것이, 참으로 낭만 있는 이야기죠.\n관심이 생기신 분들은 꼭 \u0026lsquo;토머스 헤일스\u0026rsquo;, \u0026lsquo;정형 증명\u0026rsquo;, \u0026lsquo;Sphere Packing\u0026rsquo; 등으로 검색해 보세요. 깊이 파고들면 엄청나게 재미있습니다.\n그럼 이만!\n[PR]\n지금 바로 구매 ","date":"2025-07-21T22:53:03+09:00","image":"http://kenji.blog/p/%E3%82%B1%E3%83%97%E3%83%A9%E3%83%BC%E4%BA%88%E6%83%B3%E3%82%92%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%8F%E8%A7%A3%E8%AA%AC/img_huc7f0a2c79b029796989bdbbe22e755bc_619919_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%82%B1%E3%83%97%E3%83%A9%E3%83%BC%E4%BA%88%E6%83%B3%E3%82%92%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%8F%E8%A7%A3%E8%AA%AC/","title":"'케플러 추측을 알기 쉽게 해설'"},{"content":"AI 개발의 벽 〜8부 능선까지 왔지만, 거기서부터가 지옥이었던 이야기〜\n안녕하세요, kenji입니다.\n최근 \u0026ldquo;AI에게 부탁했더니 앱을 만들어줬어!\u0026ldquo;라는 이야기를 엄청 자주 듣게 되었습니다. 노코드나 로우코드의 시대를 넘어, \u0026ldquo;바이브 코딩(분위기로 코드를 작성하는 것)\u0026rdquo; 같은 단계에 돌입하고 있습니다.\n예를 들어, \u0026ldquo;이미지를 가공해서 SNS에 게시할 수 있는 앱 만들어줘\u0026quot;라고 하면, AI가 코드와 UI까지 뱉어냅니다. 대단해, 이제 사람은 필요 없는 거 아냐? 하고 생각하게 되잖아요.\n하지만 말이죠, 그건 후지산의 8부 능선에 샌들을 신고 내리는 것과 같은 것 입니다.\n8부 능선까지는 \u0026ldquo;식은 죽 먹기\u0026quot;로 보인다 AI를 통한 개발은 처음에는 정말 편합니다. 파일 IO? 일단 작동함. 네트워크? 뭐 연결됨. 데이터베이스? JSON이면 되겠지. UI? ChatGPT가 React 코드를 뱉어줬고. 결제? Stripe API 정도 복붙하면 됨.\n여기서 \u0026ldquo;나, 이미 엔지니어 아닐까?\u0026ldquo;하고 착각하게 됩니다. 하지만 진짜 지옥은 여기서부터 시작됩니다.\n왜 막히는 걸까? 이유는 간단한데, \u0026ldquo;AI는 그럴싸하게 만들지만, 최종 조정은 사람에게 통째로 맡기기\u0026rdquo; 때문입니다.\n파일 IO에서 데이터가 날아감 DB 정규화가 어설퍼서 검색이 느림 UI가 직관적이지 않음 부하 테스트를 안 해서 접속이 몰리면 크래시 Apple/Google 심사에서 리젝(거절) 당함 법적 요건에 걸려서 염상(비난 쇄도)할 뻔함 즉, AI는 \u0026ldquo;겉보기에는 완성된 것 같은 프로토타입\u0026quot;을 만드는 것은 잘하지만, \u0026ldquo;실제로 세상에 내놓고 통용되는 프로덕트\u0026quot;로 마무리하는 것은, 지금도 여전히 사람의 일 입니다.\n하지만, 역설이 있다 여기서 하나의 역설 을 깨닫게 됩니다.\n장래에 AI가 정말로 전부 다 할 수 있게 된다면? 즉, \u0026ldquo;보안도, 결제도, 설계도 전부 AI가 완벽하게 처리해 주게\u0026rdquo; 된다면?\n그때는, 인류가 앱을 만들 필요 자체가 없어질 지도 모릅니다.\n왜냐하면, 사용자가 AI에게 직접 \u0026ldquo;이런 걸 하고 싶어\u0026quot;라고 말하면, 앱 없이 즉시 작업이 실행될 것이기 때문입니다.\n🌀예를 들어 옛날에는 \u0026ldquo;계산을 하기 위해 계산기 앱을 실행\u0026quot;했었지만, 지금은 \u0026ldquo;Hey Siri, 12×32는?\u0026ldquo;이라고 말하면 끝납니다.\n마찬가지로, \u0026ldquo;AI야, 사진을 가공해서 공유해 줘\u0026quot;라고 말하면, 앱의 UI나 API를 거치지 않고 처리 작업이 끝나 있을지도 모릅니다.\n즉, \u0026ldquo;AI로 앱을 만든다\u0026quot;라는 목표가 실현되었을 때, 앱 자체가 필요 없는 세상이 올 지도 모른다는 것입니다.\n결국, 지금 우리가 할 수 있는 일 그럼, 어떻게 하면 될까요.\n지금은 아직 \u0026ldquo;8부 능선 위\u0026quot;가 사람의 영역이므로, 그곳을 갈고닦는다 본질적인 사용자 이해나 서비스 설계에 집중한다 \u0026ldquo;만들 수 있는 것\u0026quot;보다 \u0026ldquo;가치 있는 것\u0026quot;을 생각한다 오히려, \u0026ldquo;앱이라는 형식에 얽매이지 않는\u0026rdquo; 가치 제공의 방식을 모색한다 AI는 도구이며, 리프트이고, 때로는 경쟁자입니다. 하지만, \u0026ldquo;무엇을 만들 것인가\u0026quot;나 \u0026ldquo;왜 만드는가\u0026quot;는, 아직 우리 인간의 질문으로 남아 있습니다.\n요약： AI 개발의 벽이란, 기술이 아니라 구조의 역설이다\n후지산의 8부 능선까지 누구나 갈 수 있는 시대. 하지만 거기서부터가 진짜 실전.\n그리고, 산 정상에 다 올랐을 무렵에는, \u0026ldquo;산, 오를 필요가 있었나?\u0026ldquo;라고 다시 묻게 되는 미래가 기다리고 있을지도 모릅니다.\n","date":"2025-07-20T21:52:42+09:00","image":"http://kenji.blog/p/ai%E9%96%8B%E7%99%BA%E3%81%AE%E5%A3%81/img_1_hu929f602c53dcc1c0d00e8a53b025b29e_1978511_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/ai%E9%96%8B%E7%99%BA%E3%81%AE%E5%A3%81/","title":"'AI 개발의 벽'"},{"content":"🎯 C++에서 Microsoft.Windows.AI를 호출하는 방법【샘플 코드 포함】 Windows 10 이후, Windows에는 기본적으로 ONNX 형식의 AI 모델을 실행할 수 있는 런타임 ** 이 탑재되어 있습니다. 그것이 바로 ** Windows ML (Windows.AI.MachineLearning) 입니다.\n이 글에서는 C++(Win32 앱 기반) 에서 Microsoft.Windows.AI.MachineLearning을 호출하는 방법을 ** 샘플 코드와 함께 구체적으로 설명** 합니다.\n✅ 준비편 ◾ 필요 환경 Windows 10 (1809+) 또는 Windows 11 Visual Studio 2019 이후 (Community 버전 가능) C++/WinRT 지원 (Microsoft.Windows.CppWinRT) Windows SDK 10.0.17763.0 이상 ✅ 프로젝트 구성 Visual Studio에서 다음과 같은 구성의 프로젝트를 만듭니다.\n유형: C++ Windows 데스크톱 애플리케이션(빈 프로젝트)\n하위 시스템: Windows (WinMain)\nNuGet에서 다음 패키지를 추가\n1 Microsoft.Windows.CppWinRT ✅ 샘플 코드 다음은 WinMain을 사용하여 Win32 API와 Windows.AI.MachineLearning을 조합한 최소 구성의 샘플입니다.\n※ 사용할 ONNX 모델은 model.onnx로 하고, 실행 파일과 같은 폴더에 배치해 주세요.\nmain.cpp 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 31 32 33 34 35 36 37 38 #include \u0026lt;windows.h\u0026gt; #include \u0026lt;winrt/Windows.AI.MachineLearning.h\u0026gt; #include \u0026lt;winrt/Windows.Storage.h\u0026gt; #pragma comment(lib, \u0026#34;windowsapp\u0026#34;) // WinRT 링크용 using namespace winrt; using namespace Windows::AI::MachineLearning; using namespace Windows::Storage; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow) { // WinRT 초기화 (MTA든 STA든 상관없음) winrt::init_apartment(); try { // 모델 파일을 읽어오기 auto modelFile = StorageFile::GetFileFromPathAsync(L\u0026#34;model.onnx\u0026#34;).get(); LearningModel model = LearningModel::LoadFromStorageFileAsync(modelFile).get(); // 세션 생성 LearningModelSession session(model); LearningModelBinding binding(session); // 모델의 입출력 (여기서는 임시로 빈 입력) // 실제로는 TensorFloat 등으로 바인딩이 필요합니다. // 추론 실행 auto result = session.EvaluateAsync(binding, L\u0026#34;\u0026#34;).get(); MessageBox(nullptr, L\u0026#34;추론이 완료되었습니다\u0026#34;, L\u0026#34;Windows ML (C++)\u0026#34;, MB_OK); } catch (winrt::hresult_error const\u0026amp; ex) { MessageBox(nullptr, ex.message().c_str(), L\u0026#34;에러\u0026#34;, MB_ICONERROR); } return 0; } ✅ 보충: 입력 및 출력 Tensor 지정 방법 모델에 따라 추론 전에 Tensor의 생성 및 바인딩 이 필요할 수 있습니다.\n예:\n1 2 3 4 5 6 7 8 // 1차원 float 배열을 Tensor로 변환 std::vector\u0026lt;float\u0026gt; inputData = {0.5f, 0.3f, 0.2f}; std::vector\u0026lt;int64_t\u0026gt; shape = {1, 3}; // 형태: [1, 3] auto tensor = TensorFloat::CreateFromArray(shape, inputData); // 입력 바인딩 (모델의 입력 이름에 맞춤) binding.Bind(L\u0026#34;input_0\u0026#34;, tensor); 출력도 마찬가지로 result.Outputs().Lookup(L\u0026quot;output_0\u0026quot;)으로 얻을 수 있습니다.\n✅ 디버깅 시 주의사항 모델 파일이 실행 폴더에 존재하지 않으면 FileNotFoundException이 발생합니다. 입출력 이름이 일치하지 않으면 invalid_argument 에러가 발생합니다. 모델의 정확한 IO 사양은 Netron 등의 도구로 확인 가능합니다. ✅ 요약 항목 내용 사용 API Windows.AI.MachineLearning (WinRT) 언어 C++ (Win32 기반) 권장 방식 C++/WinRT 헤더 경유 장점 ONNX 모델이 네이티브로 동작, GPU 지원도 가능 주의 모델의 입력 이름과 Tensor 형태에 주의 ✅ 대안: WinRT를 사용하고 싶지 않은 분들을 위해 Microsoft의 ONNX Runtime을 사용하면 WinRT 없이 C++에서 완전히 ONNX 모델을 다룰 수 있습니다. 크로스 플랫폼 지원으로 Windows/Linux에서도 공통 코드를 사용할 수 있습니다. 📌 마무리 Windows ML (Microsoft.Windows.AI)은 C++에서도 확실하게 사용할 수 있는 강력한 AI 추론 엔진입니다. Windows 네이티브에서의 추론이 필요하신 분들은 꼭 시도해 보시길 바랍니다.\nONNX 모델 생성이나 Tensor 바인딩의 구체적인 예시가 필요하신 분들을 위해 후속 기사에서 설명할 예정입니다!\n","date":"2025-07-19T10:03:51+09:00","image":"http://kenji.blog/p/c-%E3%81%8B%E3%82%89microsoft.windows.ai%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99%E6%96%B9%E6%B3%95/img_hub9c7b00735e02a7f33c50dd8006e2228_376811_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/c-%E3%81%8B%E3%82%89microsoft.windows.ai%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99%E6%96%B9%E6%B3%95/","title":"'C++에서 Microsoft.Windows.AI를 호출하는 방법'"},{"content":"✅ TinyLLaMA × C++ 설정 절차(llama.cpp 사용) 🔧 Step 1: llama.cpp 준비하기 1-1. 필요한 환경 (최소한) OS: Windows / Linux / macOS 개발 환경: g++ / clang / MSVC Git / CMake 1-2. llama.cpp 가져오기 및 빌드 1 2 3 4 5 6 git clone https://github.com/ggerganov/llama.cpp cd llama.cpp mkdir build cd build cmake .. cmake --build . --config Release Windows라면 Visual Studio Developer Command Prompt에서 cmake --build . --config Release를 사용하면 편합니다.\n📦 Step 2: TinyLLaMA 모델 다운로드 및 변환 2-1. HuggingFace에서 원본 모델 가져오기 예: TinyLLaMA-1.1B\n1 2 3 4 5 6 7 # 필요에 따라 transformers를 사용하여 다운로드 pip install transformers huggingface_hub python3 -m transformers.models.llama.convert_llama_weights_to_hf \\ --input_dir ./TinyLlama-1.1B-Chat \\ --model_size 1B \\ --output_dir ./hf_model 이는 Hugging Face 형식으로 변환하는 단계입니다.\n2-2. GGUF 형식으로 변환(llama.cpp용) 1 2 cd llama.cpp python3 convert.py ./hf_model --outfile tinyllama.gguf 2-3. 모델 양자화(크기 축소) 1 ./quantize ./tinyllama.gguf ./tinyllama-q4.gguf q4_0 q4_0은 4bit 양자화입니다. 모델 크기가 약 350MB 내외 로 작아집니다.\n🧪 Step 3: C++에서 모델 호출하기(코드 예시) 3-1. 간단한 C++ 코드(추론) 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 31 32 33 34 35 36 37 38 39 40 41 #include \u0026#34;llama.h\u0026#34; #include \u0026lt;iostream\u0026gt; int main() { llama_model_params model_params = llama_model_default_params(); llama_context_params ctx_params = llama_context_default_params(); llama_model *model = llama_load_model_from_file(\u0026#34;tinyllama-q4.gguf\u0026#34;, model_params); llama_context *ctx = llama_new_context_with_model(model, ctx_params); std::string prompt = \u0026#34;사용자가 Excel 데이터를 읽어와 필터링한 후 저장하고 싶다고 합니다. 노드 구성은?\u0026#34;; llama_batch batch = llama_batch_init(512, 0, 1); llama_token BOS = llama_token_bos(model); batch.token[0] = BOS; // 토크나이즈 std::vector\u0026lt;llama_token\u0026gt; tokens(prompt.size() + 8); int n = llama_tokenize(model, prompt.c_str(), tokens.data(), tokens.size(), true); tokens.resize(n); for (size_t i = 0; i \u0026lt; tokens.size(); ++i) { batch.token[i + 1] = tokens[i]; } batch.n_tokens = tokens.size() + 1; llama_decode(ctx, batch); // 추론 결과 가져오기 for (int i = 0; i \u0026lt; 50; ++i) { llama_token next = llama_sample_token(ctx, nullptr); std::cout \u0026lt;\u0026lt; llama_token_to_str(model, next); llama_batch next_batch = llama_batch_init(1, 0, 1); next_batch.token[0] = next; next_batch.n_tokens = 1; llama_decode(ctx, next_batch); } llama_free(ctx); llama_free_model(model); return 0; } 🧱 Step 4: 컴파일 방법(예시) 1 g++ -I./llama.cpp main.cpp ./llama.cpp/build/libllama.a -o tiny_infer -pthread -std=c++11 libllama.a는 빌드 후 build/ 디렉토리에 생성됩니다.\n✅ 결과물 구성 예시(정리) 1 2 3 4 5 6 my_app/ ├── tinyllama-q4.gguf # 양자화된 모델 (~350MB) ├── main.cpp # 위의 C++ 코드 ├── llama.cpp/ # llama.cpp 본체 └── build/ └── libllama.a # 컴파일된 라이브러리 🧠 사용 사례 적용을 위한 보충 출력을 받아 노드 템플릿을 대조 및 선정하는 코드를 C++ 내에 둠 예: \u0026ldquo;Excel\u0026rdquo;, \u0026ldquo;필터\u0026rdquo;, \u0026ldquo;저장\u0026quot;이 포함됨 → 해당 노드 그룹 생성 이 부분은 if 문 + JSON 템플릿 읽기와 같은 간단한 구성으로 충분함 📌 요약 항목 내용 권장 모델 TinyLLaMA-1.1B-Chat v1.0 (GGUF + 양자화) 크기 ~350〜450MB (4bit 양자화) C++ 연동 llama.cpp를 사용하여 가능, 외부 의존성 거의 없음 처리 능력 간단한 의도 파악 및 출력문 생성에 충분 (자연어→구성) 확장성 슬롯 채우기 및 템플릿 호출과 결합하여 노드 생성 AI로 활용 가능 ","date":"2025-07-19T09:40:53+09:00","image":"http://kenji.blog/p/tinyllama-%E3%82%92-c-%E3%81%8B%E3%82%89%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%9B%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86llama.cpp%E4%BD%BF%E7%94%A8/img_huf78e5769214ace33fee09d1baa98793b_1915663_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/tinyllama-%E3%82%92-c-%E3%81%8B%E3%82%89%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%9B%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86llama.cpp%E4%BD%BF%E7%94%A8/","title":"'TinyLLaMA를 C++에서 호출할 수 있게 하는 절차(llama.cpp 사용)'"},{"content":"✅ 액세스 토큰을 사용하는 게시 방법 (Slack Web API) Slack의 \u0026ldquo;OAuth Token(xoxb-～ 등)\u0026ldquo;은 Slack의 Web API를 사용하여 게시하기 위한 키입니다. 이 경우 Webhook과는 달리 Slack API 엔드포인트 에 Authorization: Bearer 헤더와 함께 POST합니다.\n🔑 필요한 전제 조건 Slack 앱에서 OAuth 범위(scope)에 chat:write 를 포함해야 합니다:\n설정 절차 https://api.slack.com/apps에 접속 앱 생성 또는 기존 앱 선택 \u0026ldquo;OAuth \u0026amp; Permissions\u0026rdquo; \u0026gt; Scopes에서 → chat:write 추가 \u0026ldquo;Install to Workspace\u0026rdquo; 또는 \u0026ldquo;Reinstall\u0026quot;하여 Access Token 획득 (예: xoxb-xxxxxxxxxx) 💻 C++ 코드 (WinHTTP로 Slack API에 게시) 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 #include \u0026lt;windows.h\u0026gt; #include \u0026lt;winhttp.h\u0026gt; #include \u0026lt;iostream\u0026gt; #pragma comment(lib, \u0026#34;winhttp.lib\u0026#34;) bool PostSlackMessage(const std::wstring\u0026amp; accessToken, const std::string\u0026amp; channel, const std::string\u0026amp; text) { const wchar_t* host = L\u0026#34;slack.com\u0026#34;; const wchar_t* path = L\u0026#34;/api/chat.postMessage\u0026#34;; HINTERNET hSession = WinHttpOpen(L\u0026#34;SlackPoster/1.0\u0026#34;, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); if (!hSession) return false; HINTERNET hConnect = WinHttpConnect(hSession, host, INTERNET_DEFAULT_HTTPS_PORT, 0); if (!hConnect) return false; HINTERNET hRequest = WinHttpOpenRequest(hConnect, L\u0026#34;POST\u0026#34;, path, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE); // Authorization 헤더 및 Content-Type std::wstring headers = L\u0026#34;Content-Type: application/json\\r\\n\u0026#34;; headers += L\u0026#34;Authorization: Bearer \u0026#34; + accessToken + L\u0026#34;\\r\\n\u0026#34;; // JSON 본문 std::string body = R\u0026#34;({\u0026#34;channel\u0026#34;:\u0026#34;)\u0026#34; + channel + R\u0026#34;(\u0026#34;,\u0026#34;text\u0026#34;:\u0026#34;)\u0026#34; + text + R\u0026#34;(\u0026#34;})\u0026#34;; BOOL result = WinHttpSendRequest(hRequest, headers.c_str(), (DWORD)-1, (LPVOID)body.c_str(), body.length(), body.length(), 0); if (!result || !WinHttpReceiveResponse(hRequest, NULL)) { std::cerr \u0026lt;\u0026lt; \u0026#34;전송 오류\\n\u0026#34;; return false; } // 상태 코드 확인 DWORD statusCode = 0; DWORD size = sizeof(statusCode); WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, WINHTTP_HEADER_NAME_BY_INDEX, \u0026amp;statusCode, \u0026amp;size, WINHTTP_NO_HEADER_INDEX); WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession); return (statusCode == 200); } int main() { std::wstring token = L\u0026#34;xoxb-당신의액세스토큰\u0026#34;; // 액세스 토큰 std::string channel = \u0026#34;채널ID또는#general\u0026#34;; // 예: \u0026#34;#general\u0026#34; 또는 \u0026#34;C0123456789\u0026#34; std::string message = \u0026#34;C++에서 Slack으로 게시해 보았다!\u0026#34;; if (PostSlackMessage(token, channel, message)) { std::cout \u0026lt;\u0026lt; \u0026#34;게시 성공!\\n\u0026#34;; } else { std::cerr \u0026lt;\u0026lt; \u0026#34;게시 실패.\\n\u0026#34;; } return 0; } 📌 채널 ID 확인 방법 채널 이름(예: #general)만으로는 오류가 발생할 수 있습니다. 확실한 방법은 Slack의 채널 페이지 URL에 있는 ID를 사용하는 것입니다.\n1 2 https://app.slack.com/client/Txxxxx/C0123456789 ↑ 이 부분이 채널 ID ✅ 토큰 종류에 대해 (보충) 토큰 형식 용도 예시 xoxb-... Bot Token (권장) 게시·수정·삭제 xoxp-... User Token (비권장) 비 Bot 계열 작업 Refresh Token 장기 토큰 갱신용 보통은 사용 안함 📝 요약 C++에서 Slack에 게시하려면 Slack Web API + Bearer Token 방식이 확실함 chat.postMessage 엔드포인트를 HTTPS POST로 사용 토큰은 Bearer 헤더로 전송할 것 채널은 ID 지정 이 확실함 ","date":"2025-07-16T23:36:27+09:00","image":"http://kenji.blog/p/slack-app--oauth2-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6-slack-%E3%81%AB%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E6%8A%95%E7%A8%BF%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_huc0fc953b24035d17918192b772178b43_75467_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/slack-app--oauth2-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6-slack-%E3%81%AB%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E6%8A%95%E7%A8%BF%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"'Slack App + OAuth2를 사용하여 Slack에 메시지를 게시하는 방법'"},{"content":"C++(Win32 API + WinHTTP)로 Slack에 메시지를 전송하는 방법 【Webhook 지원】 Slack에 C++로 메시지를 전송하고 싶다. Node.js나 Python에서는 자주 볼 수 있지만, 「C++ × Win32 API × WinHTTP」로 구현하는 케이스는 드물죠.\n이 글에서는 Webhook URL을 사용하여 Slack에 C++로 메시지를 전송하는 방법 을 단계별로 알기 쉽게 설명합니다.\n✅ 전체 흐름 Slack에 메시지를 전송하려면 다음 단계를 따릅니다.\nSlack의 Webhook URL(API 키) 얻기 WinHTTP를 사용하여 POST 요청 보내기 JSON 형식으로 메시지 본문 작성하기 결과 확인하고 완료! 🔑 Step1: Slack Webhook URL 얻는 방법 Slack에서는 Incoming Webhooks 기능을 사용하여 외부 서비스에서 간단히 메시지를 전송할 수 있습니다.\n얻는 순서 https://api.slack.com/apps 에 접속 Create New App 클릭 From scratch 를 선택하고 앱 이름과 전송할 워크스페이스를 선택 왼쪽 메뉴에서 「Incoming Webhooks」 를 선택하고 활성화 「Add New Webhook to Workspace」 를 클릭하고 채널을 선택 발행된 URL(예: https://hooks.slack.com/services/xxx/yyy/zzz) 복사 이 URL이 API 키처럼 작동합니다.\n💻 Step2: C++ 코드로 Slack에 메시지 전송 사용하는 기술 Win32 API WinHTTP(표준 라이브러리) JSON 형식의 메시지 샘플 코드(Slack 전송) 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 #include \u0026lt;windows.h\u0026gt; #include \u0026lt;winhttp.h\u0026gt; #include \u0026lt;iostream\u0026gt; #pragma comment(lib, \u0026#34;winhttp.lib\u0026#34;) bool PostToSlack(const std::wstring\u0026amp; webhookUrl, const std::string\u0026amp; messageJson) { // URL 분해 URL_COMPONENTS urlComp{}; wchar_t hostName[256]; wchar_t urlPath[1024]; urlComp.dwStructSize = sizeof(urlComp); urlComp.lpszHostName = hostName; urlComp.dwHostNameLength = _countof(hostName); urlComp.lpszUrlPath = urlPath; urlComp.dwUrlPathLength = _countof(urlPath); if (!WinHttpCrackUrl(webhookUrl.c_str(), 0, 0, \u0026amp;urlComp)) { std::wcerr \u0026lt;\u0026lt; L\u0026#34;URL 분해에 실패했습니다\\n\u0026#34;; return false; } // HTTP 세션 및 연결 HINTERNET hSession = WinHttpOpen(L\u0026#34;SlackPoster/1.0\u0026#34;, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); HINTERNET hConnect = WinHttpConnect(hSession, hostName, urlComp.nPort, 0); HINTERNET hRequest = WinHttpOpenRequest(hConnect, L\u0026#34;POST\u0026#34;, urlPath, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE); std::wstring headers = L\u0026#34;Content-Type: application/json\\r\\n\u0026#34;; BOOL result = WinHttpSendRequest(hRequest, headers.c_str(), -1, (LPVOID)messageJson.c_str(), messageJson.length(), messageJson.length(), 0); if (!result) { std::cerr \u0026lt;\u0026lt; \u0026#34;전송 요청에 실패했습니다\\n\u0026#34;; return false; } WinHttpReceiveResponse(hRequest, NULL); DWORD statusCode = 0; DWORD size = sizeof(statusCode); WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, WINHTTP_HEADER_NAME_BY_INDEX, \u0026amp;statusCode, \u0026amp;size, WINHTTP_NO_HEADER_INDEX); // 리소스 해제 WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession); return (statusCode == 200); } int main() { std::wstring webhookUrl = L\u0026#34;https://hooks.slack.com/services/xxx/yyy/zzz\u0026#34;; // 자신의 Webhook으로 교체해 주세요 std::string message = R\u0026#34;({ \u0026#34;text\u0026#34;: \u0026#34;Hello from C++ :rocket:\u0026#34;, \u0026#34;username\u0026#34;: \u0026#34;C++ Bot\u0026#34;, \u0026#34;icon_emoji\u0026#34;: \u0026#34;:robot_face:\u0026#34; })\u0026#34;; if (PostToSlack(webhookUrl, message)) { std::cout \u0026lt;\u0026lt; \u0026#34;전송에 성공했습니다!\\n\u0026#34;; } else { std::cerr \u0026lt;\u0026lt; \u0026#34;전송에 실패했습니다.\\n\u0026#34;; } return 0; } 🧪 JSON 메시지 커스터마이즈 Slack의 Webhook에서는 다음과 같은 파라미터를 포함할 수 있습니다:\n1 2 3 4 5 6 { \u0026#34;text\u0026#34;: \u0026#34;알림 내용\u0026#34;, \u0026#34;username\u0026#34;: \u0026#34;Bot 이름\u0026#34;, \u0026#34;icon_emoji\u0026#34;: \u0026#34;:rocket:\u0026#34;, \u0026#34;channel\u0026#34;: \u0026#34;#원하는 채널명\u0026#34; } 📌 보충 사항 Content-Type은 반드시 \u0026quot;application/json\u0026quot;을 지정 Webhook URL은 그대로 wstring으로 전달(URL 인코딩 불필요) HTTPS 통신이므로 WINHTTP_FLAG_SECURE를 잊지 마세요 🎉 부록: Slack에서의 전송 확인 예시 Slack에 이처럼 표시됩니다:\n1 2 [C++ Bot] Hello from C++ :rocket: ✍️ 요약 항목 내용 전송 방식 Webhook (Incoming Webhooks) 통신 라이브러리 WinHTTP 데이터 형식 JSON 사용 가능 파라미터 text, username, icon_emoji, channel 등 C++로 Slack 연동이라니\u0026hellip; 라고 생각했던 당신도 오늘부터 알림 Bot을 연동할 수 있습니다!\n🚀 다음 예고? 만약 관심이 있다면 다음에는:\n파일 첨부 버튼이 포함된 UI Slack App + OAuth2에 의한 유연한 API 조작 등 한 걸음 더 나아간 Slack 연동도 소개할 수 있습니다!\n","date":"2025-07-16T19:42:56+09:00","image":"http://kenji.blog/p/c-win32-api--winhttp%E3%81%A7slack%E3%81%AB%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E6%8A%95%E7%A8%BF%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95webhook%E5%AF%BE%E5%BF%9C/img_huc0fc953b24035d17918192b772178b43_75467_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/c-win32-api--winhttp%E3%81%A7slack%E3%81%AB%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E6%8A%95%E7%A8%BF%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95webhook%E5%AF%BE%E5%BF%9C/","title":"'C++(Win32 API + WinHTTP)로 Slack에 메시지를 전송하는 방법 【Webhook 지원】'"},{"content":"마켓 인과 프로덕트 아웃 안녕하세요, kenji입니다.\n가끔 비즈니스 서적이나 기획서 등에서,\n\u0026ldquo;저희는 마켓 인 전략입니다\u0026rdquo; \u0026ldquo;이것은 프로덕트 아웃 형이네요\u0026rdquo;\n같은 말을 하는 것을 보게 되는데요\u0026hellip;\u0026hellip;.\n아니, 마켓 인? 프로덕트 아웃? 어느 쪽이 더 대단한 건데???\n라고 생각하게 되지 않나요?\n그래서 이번에는 이 \u0026lsquo;마켓 인\u0026rsquo;과 \u0026lsquo;프로덕트 아웃\u0026rsquo;이라는 것에 대해, 최대한 알기 쉽게 풀어서, 조금은 신랄하게 살펴보려고 합니다.\n간단히 말하자면… 마켓 인: 시장(마켓)의 소리를 듣고, 그에 맞춰 상품을 만든다 프로덕트 아웃: 자신들이 좋다고 생각하는 것(프로덕트)을 만들어, 세상에 내놓는다 이게 전부입니다. 심플하죠.\n예를 들어 라면 가게로 치면… 마켓 인 방식의 라면 가게는, \u0026ldquo;요즘은 이에케 라면이 유행이네. 좋아, 지방과 마늘 듬뿍 가자!\u0026ldquo;라는 느낌.\n프로덕트 아웃 방식의 라면 가게는, \u0026ldquo;내가 만든 이 두유 바질 소금 라면, 진짜 최고니까 먹어봐\u0026quot;라는 느낌입니다.\n어느 쪽이 정답이냐면… 둘 다 정답입니다 마켓 인은 고객의 니즈에 맞추기 때문에 \u0026lsquo;팔릴 확률이 높지만\u0026rsquo;, 특출난 아이디어나 브레이크스루(돌파구)는 태어나기 어렵습니다.\n프로덕트 아웃은 \u0026lsquo;자신들이 믿는 정의를 형태화\u0026rsquo;하기 때문에 뾰족하고 매력적이지만, 어긋나면 아무에게도 울림을 주지 못합니다.\niPhone은 프로덕트 아웃 느낌 \u0026ldquo;스마트폰 따윈 필요 없어\u0026quot;라고 말하던 시대에, iPhone을 출시한 Apple.\n이것은 그야말로, 완전한 프로덕트 아웃 의 성공 사례입니다.\n사용자의 목소리를 들었다면, \u0026ldquo;키보드 없는 휴대폰? 무리무리\u0026quot;라는 말을 듣고 끝났을 겁니다.\n하지만 프로덕트 아웃은 \u0026lsquo;자기만족\u0026rsquo;이 되기 쉽다 가끔, \u0026ldquo;우리는 프로덕트 아웃 형이니까\u0026quot;라고 말하는 기업이나 사람이 있는데,\n아니, 그건 그냥 사용자 무시 아닌가?\n라고 생각할 때도 있습니다.\n\u0026ldquo;만들고 싶어서 만들었다. 하지만 팔리지 않았다\u0026quot;는, 프로덕트 아웃이 아니라 \u0026lsquo;독단적 아웃\u0026rsquo;인 거죠.\n마켓 인에도 함정은 있다 한편으로, 마켓 인 역시 만능은 아니어서.\n\u0026ldquo;사용자가 원하니까 다 할게요!\u0026ldquo;라고 말하다 보면, 프로덕트의 중심이 흔들려, 결국 아무에게도 꽂히지 않는 경우도 있습니다.\n점점 기능을 추가하다가, 정신 차려보니 카오스 같은 툴이 되어 있는, 그런 거 말이죠.\n정말 대단한 것은, \u0026lsquo;둘 다 하는 사람\u0026rsquo; 대단한 프로덕트는, \u0026lsquo;사용자가 정말로 원했지만, 언어화하지 못했던 것\u0026rsquo;을, 딱 짚어서 제시해 주거든요.\n즉, \u0026lsquo;프로덕트 아웃의 발상으로, 마켓 인적인 공감을 얻는다\u0026rsquo;는 것.\n이거, 쉽게 말하지만 엄청나게 어렵습니다. 하지만, 이것이 가능해지면 단숨에 \u0026lsquo;신급 프로덕트\u0026rsquo;가 됩니다.\n결론: 말보다, 사용자의 반응이 전부 마켓 인인가, 프로덕트 아웃인가. 어느 쪽이 옳은지 같은 건, 별로 의미 없는 질문이라.\n\u0026ldquo;사용자의 마음에 제대로 닿고 있는가?\u0026ldquo;가 전부 라고 생각합니다.\n\u0026ldquo;어느 쪽에 가까운 전략으로 하고 있습니다\u0026rdquo; 같은 건, 나중에 마케팅 자료에 쓸 수 있으면 그걸로 족하지 않나, 정도로 생각하고 있습니다.\n그래서, 마켓 인과 프로덕트 아웃 이야기였습니다!\n이상한 가로쓰기 말(외래어)에 현혹되지 않고, \u0026ldquo;결국 어떻게 하면 사람들이 기뻐할까?\u0026ldquo;를 생각해 나가는 것이, 가장 건전하지 않나 싶습니다.\n그럼 이만～.\n","date":"2025-07-15T20:18:22+09:00","image":"http://kenji.blog/p/%E3%83%9E%E3%83%BC%E3%82%B1%E3%83%83%E3%83%88%E3%82%A4%E3%83%B3%E3%81%A8%E3%83%97%E3%83%AD%E3%83%80%E3%82%AF%E3%83%88%E3%82%A2%E3%82%A6%E3%83%88/img_hu9af708a897f548be4a7980daec441f8f_1946278_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%83%9E%E3%83%BC%E3%82%B1%E3%83%83%E3%83%88%E3%82%A4%E3%83%B3%E3%81%A8%E3%83%97%E3%83%AD%E3%83%80%E3%82%AF%E3%83%88%E3%82%A2%E3%82%A6%E3%83%88/","title":"'마켓 인과 프로덕트 아웃'"},{"content":"\u0026ldquo;어떤 숫자든 마지막엔 1이 된다\u0026quot;는 게 진짜야? ── 콜라츠 추측을 즐겨보자 안녕하세요! kenji입니다.\n갑작스럽지만, \u0026ldquo;어떤 숫자든 최종적으로 1이 되는 규칙\u0026quot;이라고 들으면, 조금 신기하지 않나요?\n예를 들어, 19나, 87이나, 1000000이라도. 적당한 규칙에 따라 숫자를 다루다 보면, 왠지 마지막은 \u0026ldquo;1\u0026quot;로 수렴합니다.\n그런 꿈 같은 이야기가, 콜라츠 추측(Collatz Conjecture) 입니다.\n애초에, 콜라츠 추측이란 게 뭐야? 먼저 규칙을 소개할게요.\n시작: 임의의 양의 정수 를 선택합니다.\n조작:\n짝수라면 → 반으로 나눈다 (n → n / 2) 홀수라면 → 3을 곱하고 1을 더한다 (n → 3n + 1) 이것을 계～속 반복하면, 어떤 숫자도 최종적으로는 1에 도달한다 는 추측인 거죠.\n예를 들어, 6부터 시작하면:\n1 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 제대로 \u0026ldquo;1\u0026quot;이 되었습니다. 어서 오세요!\n코드로 해보자: Python으로 콜라츠 자, 이럴 때는 코드로 시험해보는 게 빠릅니다! Python으로 \u0026ldquo;콜라츠 수열\u0026quot;을 출력해봅시다.\n1 2 3 4 5 6 7 8 9 10 11 12 def collatz(n): steps = [n] while n != 1: if n % 2 == 0: n = n // 2 else: n = 3 * n + 1 steps.append(n) return steps # 예: 19부터 시작해보기 print(collatz(19)) 실행하면:\n1 [19, 58, 29, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1] 멋지게 1에 도달합니다. 꽤 우회하는데도, 마지막은 확실하게 골인!\n참고로 29부터 시작해도, 마찬가지로 1에 도달합니다.\n1 pythonprint(collatz(29)) 실행하면\n1 2 3 4 5 6 7 8 [27, 82, 41, 124, 62, 31, 94, 47, 142, 71, 214, 107, 322, 161, 484, 242, 121, 364, 182, 91, 274, 137, 412, 206, 103, 310, 155, 466, 233, 700, 350, 175, 526, 263, 790, 395, 1186, 593, 1780, 890, 445, 1336, 668, 334, 167, 502, 251, 754, 377, 1132, 566, 283, 850, 425, 1276, 638, 319, 958, 479, 1438, 719, 2158, 1079, 3238, 1619, 4858, 2429, 7288, 3644, 1822, 911, 2734, 1367, 4102, 2051, 6154, 3077, 9232, 4616, 2308, 1154, 577, 1732, 866, 433, 1300, 650, 325, 976, 488, 244, 122, 61, 184, 92, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1] 무려, 111스텝이나 걸립니다!\n게다가, 중간에 9000 이상까지 부풀어 오르는 장면도. 엄청나게 우회하고 나서 골인하는 패턴이네요.\n그래서, 결국 뭐가 대단한 거야? 이 추측의 무엇이 대단하냐면,\n증명되지 않았는데, 어떤 수로 해도 1이 되는 것 같다\n라는 점입니다.\n어? 그럼, 1조나, 1경(경)은\u0026hellip;?\n라고 생각하신 분, 예리합니다. 실제로 컴퓨터를 사용해서 \u0026ldquo;2의 68승\u0026rdquo; 정도까지는 확인되었고, 모두 1에 도달 하고 있습니다. 믿을 수 없어\u0026hellip;\n하지만, \u0026ldquo;전부 그렇게 된다\u0026quot;고 이론적으로 증명된 것은 아닙니다. 이것이 수학 세계에서 말하는 \u0026ldquo;미해결 문제\u0026rdquo;.\n콜라츠 씨가 누구야? 자, 여기까지 읽고 \u0026ldquo;애초에 콜라츠가 누구야?\u0026ldquo;라고 생각하시죠. 제대로 소개할게요!\n이름: 로타르 콜라츠 (Lothar Collatz) 국적: 독일 생년: 1910년 ～ 1990년 직함: 수학자 (함수 해석이나 정수론 분야에서 활약) 1937년에 이 추측을 제안했고, 그 후, 80년 이상에 걸쳐 아무도 증명도 반증도 하지 못하고 있습니다.\n참고로, 이 문제는 너무 심플한데 심오해서, 그 폴 에어디시(초유명 수학자)조차 이렇게 말했다고 하죠.\n\u0026ldquo;수학은 아직 콜라츠를 다루기에 미숙하다\u0026rdquo;\n즉, 인류의 수학이 이 수수께끼를 아직 따라잡지 못했다는 설\u0026hellip;\n\u0026ldquo;어려운 수식\u0026quot;은 필요 없다 콜라츠 추측의 좋은 점은, 누구나 즐길 수 있다 는 것입니다.\n종이와 펜이 있으면 할 수 있습니다. Python으로 코드를 작성하면, 자동으로 시험할 수 있습니다. 그러면서도, 최첨단의 수학자들이 진심으로 도전하고 있다.\n왠지, 두근두근하지 않나요?\n덤: 한 번에 시험하는 코드 여러 숫자를 모아서 시험하는 코드도 실어둘게요.\n1 2 3 for n in range(1, 21): steps = collatz(n) print(f\u0026#34;{n}: {steps}(스텝 수: {len(steps)-1})\u0026#34;) 이것은 \u0026ldquo;1～20\u0026quot;의 콜라츠 수열을 한 번에 출력해 줍니다.\n결론: 이 세계, 역시 신기하다 이런 이유로, 콜라츠 추측.\n엄청 심플한데 아무도 증명하지 못해서 수학계에서는 큰 문제 라는, 불가사의 덩어리 같은 존재였습니다.\n프로그래밍 초보자라도 시도해볼 수 있으니, 꼭 즐겨보세요～!\n추천 링크 (관심 있는 분용) Wikipedia: 콜라츠 추측 Terence Tao 논문 (영문) Python의 시각화 버전을 만들어 보는 것도 재밌어요! (요청이 있으면 만들겠습니다) 더 이런 \u0026ldquo;신기한 수학 × 프로그래밍\u0026rdquo; 소재를 알고 싶은 분은, 편하게 \u0026ldquo;더 알려줘\u0026quot;라고 요청해 보세요. 조만간, 리만 가설이나 소수 이야기 등, 여러 가지 소개할게요!\n📮끝!\n","date":"2025-07-15T18:03:03+09:00","image":"http://kenji.blog/p/%E3%82%B3%E3%83%A9%E3%83%83%E3%83%84%E4%BA%88%E6%83%B3/img_hu1a59efae05835f74694145ebf674f295_4369684_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%82%B3%E3%83%A9%E3%83%83%E3%83%84%E4%BA%88%E6%83%B3/","title":"'콜라츠 추측'"},{"content":"C++에서 Microsoft Teams로 메시지를 게시하는 방법(WinHTTP + Graph API) Microsoft Teams 채팅에 자동으로 게시하고 싶을 때――\n그럴 때 사용할 수 있는 것이 Microsoft Graph API 입니다.\n이 문서에서는 WinHTTP를 사용한 C++ 코드 예제 ** 와 ** 필요한 API 인증 절차 를 단계별로 소개합니다.\n🔧 필요한 준비 (Microsoft Graph API 인증 설정) 1. Azure 포털에서 앱 등록 먼저, Microsoft Graph API를 사용하려면 Azure에 앱을 등록해야 합니다.\nAzure Portal에 접속 「Microsoft Entra ID」 \u0026gt; 「＋추가」 \u0026gt; 「앱 등록」 \u0026gt; 「새 등록」 원하는 앱 이름을 입력하고 「등록」 2. API 권한 추가 왼쪽 메뉴의 「API 권한」으로 이동 「Microsoft Graph」 \u0026gt; 「권한 추가」 에서 아래 스코프를 검색하여 「권한 업데이트」 Chat.ReadWrite User.Read ※ 채널에 게시하고 싶은 경우 ChannelMessage.Send도 필요\n3. 클라이언트 ID와 테넌트 ID 메모 「개요」 탭에 표시되는 다음 두 가지를 기록해 둡니다:\n애플리케이션(클라이언트) ID 디렉터리(테넌트) ID 4. 클라이언트 시크릿 생성 「인증서 및 암호」 탭으로 이동 「새 클라이언트 암호」 \u0026gt; 만료 기한을 설정하고 「추가」 표시된 값(시크릿)을 그 자리에서 반드시 기록 🔐 액세스 토큰 획득 (OAuth2) 획득에는 client_credentials 플로우를 사용합니다.\ncurl로 아래 명령어를 실행하여 액세스 토큰을 획득합니다.\n1 2 3 4 5 6 7 curl -X POST ^ https://login.microsoftonline.com/{테넌트ID}/oauth2/v2.0/token ^ -H \u0026#34;Content-Type: application/x-www-form-urlencoded\u0026#34; ^ -d \u0026#34;client_id={클라이언트ID}\u0026#34; ^ -d \u0026#34;scope=https%3A%2F%2Fgraph.microsoft.com%2F.default\u0026#34; ^ -d \u0026#34;client_secret={클라이언트시크릿}\u0026#34; ^ -d \u0026#34;grant_type=client_credentials\u0026#34; 응답 예시 1 2 3 4 5 6 { \u0026#34;token_type\u0026#34;:\u0026#34;Bearer\u0026#34;, \u0026#34;expires_in\u0026#34;:3599, \u0026#34;ext_expires_in\u0026#34;:3599, \u0026#34;access_token\u0026#34;: \u0026#34;eyJ0eXAiOiJKV1QiLCJub...（생략）\u0026#34; } 이 access_token을 사용하여 Microsoft Graph API를 호출합니다.\n💬 Teams 채팅에 게시하는 C++ 샘플 여기서는 WinHTTP를 사용하여 채팅에 게시하는 C++ 예제를 보여줍니다.\n1 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 #include \u0026lt;windows.h\u0026gt; #include \u0026lt;winhttp.h\u0026gt; #include \u0026lt;iostream\u0026gt; #include \u0026lt;string\u0026gt; #pragma comment(lib, \u0026#34;winhttp.lib\u0026#34;) void PostToTeamsChat(const std::wstring\u0026amp; accessToken, const std::wstring\u0026amp; chatId, const std::wstring\u0026amp; message) { HINTERNET hSession = WinHttpOpen(L\u0026#34;TeamsPoster/1.0\u0026#34;, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); HINTERNET hConnect = WinHttpConnect(hSession, L\u0026#34;graph.microsoft.com\u0026#34;, INTERNET_DEFAULT_HTTPS_PORT, 0); std::wstring endpoint = L\u0026#34;/v1.0/chats/\u0026#34; + chatId + L\u0026#34;/messages\u0026#34;; HINTERNET hRequest = WinHttpOpenRequest(hConnect, L\u0026#34;POST\u0026#34;, endpoint.c_str(), NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE); std::wstring jsonBody = L\u0026#34;{\\\u0026#34;body\\\u0026#34;: {\\\u0026#34;content\\\u0026#34;: \\\u0026#34;\u0026#34; + message + L\u0026#34;\\\u0026#34;}}\u0026#34;; std::wstring headers = L\u0026#34;Authorization: Bearer \u0026#34; + accessToken + L\u0026#34;\\r\\nContent-Type: application/json\\r\\n\u0026#34;; BOOL bResult = WinHttpSendRequest(hRequest, headers.c_str(), (DWORD)-1L, (LPVOID)jsonBody.c_str(), (DWORD)(jsonBody.length() * sizeof(wchar_t)), (DWORD)(jsonBody.length() * sizeof(wchar_t)), 0); if (bResult) WinHttpReceiveResponse(hRequest, NULL); DWORD dwSize = 0; WinHttpQueryDataAvailable(hRequest, \u0026amp;dwSize); if (dwSize \u0026gt; 0) { std::wstring response(dwSize / sizeof(wchar_t), 0); DWORD dwDownloaded = 0; WinHttpReadData(hRequest, \u0026amp;response[0], dwSize, \u0026amp;dwDownloaded); std::wcout \u0026lt;\u0026lt; L\u0026#34;Response: \u0026#34; \u0026lt;\u0026lt; response \u0026lt;\u0026lt; std::endl; } WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession); } int main() { std::wstring access; std::wstring chatId = L\u0026#34;19:\u0026#34;; std::wstring message = L\u0026#34;Hello from C++!\u0026#34;; std::wcout \u0026lt;\u0026lt; L\u0026#34;Enter your access token: \u0026#34;; std::getline(std::wcin, access); std::wcout \u0026lt;\u0026lt; L\u0026#34;Enter chat ID: \u0026#34;; std::getline(std::wcin, chatId); PostToTeamsChat(access, chatId, message); return 0; } 🔍 채팅 ID 획득 방법 채팅 ID는 GET /v1.0/me/chats 에서 확인할 수 있습니다.\n1 2 3 4 curl -X GET ^ https://graph.microsoft.com/v1.0/me/chats ^ -H \u0026#34;Authorization: Bearer {access_token}\u0026#34; ^ -H \u0026#34;Content-Type: application/json\u0026#34; 응답 예시 1 2 3 4 5 6 7 8 9 { \u0026#34;value\u0026#34;: [ { \u0026#34;id\u0026#34;: \u0026#34;19:abc123xyz@thread.v2\u0026#34;, \u0026#34;topic\u0026#34;: null, \u0026#34;chatType\u0026#34;: \u0026#34;oneOnOne\u0026#34; } ] } 📌 주의사항 이 샘플은 최소한의 구현입니다. 실제 환경에서는 다음을 고려하세요: 토큰 만료 처리 HTTPS 인증서 검증 오류 처리 강화 채널에 게시할 때는 teams/{team-id}/channels/{channel-id}/messages 를 사용합니다. 첨부 파일 전송에는 멀티파트 처리나 Graph 드라이브 API가 필요합니다. 요약 📎 요약 기능 개요 Graph API Teams와 통신하는 공식 API 앱 등록 Azure에서 필요한 인증 절차 액세스 토큰 OAuth2로 획득하여 요청에 사용 C++ 구현 WinHTTP를 사용하여 Graph API 호출 🚀 다음 단계 더 발전된 샘플로 다음 사항도 가능합니다:\n팀 채널 게시 (/teams/{team-id}/channels/...) 첨부 파일이 포함된 게시물 봇 계정 및 사용자 계정 전환 토큰 획득을 포함한 완전한 C++ 구현 원하시는 내용이 있다면 언제든지 댓글로 남겨주세요!\n","date":"2025-07-14T23:40:15+09:00","image":"http://kenji.blog/p/c-%E3%81%8B%E3%82%89-microsoft-teams-%E3%81%AB%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E6%8A%95%E7%A8%BF%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95winhttp--graph-api/img_hu9dbe154e21530b21fd6a41dcbc040106_90767_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/c-%E3%81%8B%E3%82%89-microsoft-teams-%E3%81%AB%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E6%8A%95%E7%A8%BF%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95winhttp--graph-api/","title":"'C++에서 Microsoft Teams로 메시지를 게시하는 방법(WinHTTP + Graph API)'"},{"content":"해외의 화면 UI(폼)에서의 「필수」 마크에 대해, UI 가이드라인 자료와 함께 정리했습니다.\n📌 주요 필수 마크와 베스트 프랙티스 애스터리스크 (*) 사용\n일반적으로 가장 널리 보급되어 있으며, 필수 필드에 「*」를 붙입니다. 단, *폼 앞부분에 「 는 필수 항목입니다」 등의 설명이 필수**입니다 (Nielsen Norman Group, 캘리포니아 주립 대학교 노스리지). 색상을 사용하여 강조하는 예도 있습니다(빨간 글씨 등). 레이블에 “Required” 나 “(required)” 명시\n레이블 내에 문자로 「Required」를 붙임으로써 스크린 리더에도 명시할 수 있어, 접근성이 향상됩니다 (Deque). ARIA 속성이나 HTML5의 required 속성 병용\n시각적 표시와 더불어, aria-required=\u0026quot;true\u0026quot;나 \u0026lt;input required\u0026gt;를 사용하여 프로그래밍적으로도 필수임을 전달할 수 있습니다 (Deque). “(optional)”을 사용하여 선택 필드 명시\n필수 필드 대신 선택 필드를 「(optional)」로 명시하는 방법도 있으며, 혼재하는 경우에 유효합니다. 단, Nielsen-Norman은 「필수도 명시하는 편이 판단하기 쉽다」고 지적하고 있습니다 (TPGi). ✅ UI 가이드라인 자료 요약 제공처 내용 NN/g: Marking Required Fields in Forms 애스터리스크 + 설명문 조합이 권장되며, 선택 사항만 표시하는 것은 불친절하다는 평가 (Nielsen Norman Group). Deque (Anatomy of Accessible Forms) ・레이블 내에 「Required」 문자열 또는 이미지를 병용.\n・색상만으로 나타내는 것은 불충분하다고 명언. W3C Techniques (H90) 애스터리스크나 「(required)」를 레이블에 포함시키고, 폼 앞부분에 의미를 정의하는 예가 있음. TPGi (Doing what\u0026rsquo;s required) 접근성을 고려하여 애스터리스크 + ARIA 속성 + 레이블 문자 삽입이 최적이라고 평가. Contensis 폼 UX 가이드 일관된 마크 지정(* 또는 (optional))이 중요하다고 간결하게 정리. ✅ 구현 시 추천 어프로치 폼 앞부분 에 설명문 추가：\nFields marked with * are required. (또는 일괄적으로 \u0026ldquo;All fields are required\u0026rdquo;, 선택 항목이 있는 경우는 \u0026ldquo;unless marked optional\u0026rdquo;)\n레이블 부여：\nFirst Name * 또는 Email (required)와 같이 기술. ARIA 속성・HTML5 속성：\n1 2 \u0026lt;label for=\u0026#34;email\u0026#34;\u0026gt;Email \u0026lt;abbr title=\u0026#34;required\u0026#34;\u0026gt;*\u0026lt;/abbr\u0026gt;\u0026lt;/label\u0026gt; \u0026lt;input id=\u0026#34;email\u0026#34; required aria-required=\u0026#34;true\u0026#34;\u0026gt; 색상에만 의존하지 않기：시각적 및 프로그래밍적 양쪽 모두에 대응.\n🔗 참고 링크 (UI 가이드라인 자료) NN/g: Marking Required Fields in Forms (캘리포니아 주립 대학교 노스리지, Nielsen Norman Group, Deque) Deque: Anatomy of Accessible Forms (Deque) W3C Techniques: H90 Indicating required form controls (W3C) TPGi: Indicating mandatory fields accessibly (TPGi) Contensis: UX Forms Guidelines (Contensis) 필요하시다면, 구체적인 HTML/CSS 코드 예시나 Sketch/Figma용 UI 컴포넌트 디자인 템플릿 등도 전달해 드릴 수 있습니다. 부담 없이 상담해 주세요!\n","date":"2025-07-14T13:47:51+09:00","image":"http://kenji.blog/p/%E5%85%A5%E5%8A%9B%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AE%E5%BF%85%E9%A0%88%E3%83%9E%E3%83%BC%E3%82%AF%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/img_hu551d2409ec5a7ae3c7367fc3f969286e_18058_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E5%85%A5%E5%8A%9B%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AE%E5%BF%85%E9%A0%88%E3%83%9E%E3%83%BC%E3%82%AF%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/","title":"'입력 폼의 필수 마크에 대하여'"},{"content":"【초보자용】 Windows에 Gemini CLI를 설치하는 방법 Google의 생성형 AI \u0026lsquo;Gemini\u0026rsquo;를 커맨드라인에서 사용할 수 있게 해주는 \u0026lsquo;Gemini CLI\u0026rsquo;. 이 글에서는 Windows 환경에 Gemini CLI를 설치하는 과정을 최대한 알기 쉽게 설명합니다.\n1. 사전 준비: Node.js 및 npm 설치 먼저, Gemini CLI는 \u0026lsquo;Node.js\u0026rsquo;라는 환경에서 작동하므로 다음 항목들을 설치해야 합니다.\nNode.js npm (Node.js에 포함된 패키지 관리 도구) npx (npm에 포함된 명령어 실행 도구) 아래의 공식 웹사이트에서 Windows용 Node.js를 다운로드하세요 (LTS 버전을 권장합니다):\n👉 Node.js 공식 웹사이트\n설치가 완료되면 다음 명령어로 제대로 설치되었는지 확인해 봅시다.\n1 2 node -v npm -v 2. PowerShell 실행하기 Windows에서 Gemini CLI를 사용하려면 PowerShell을 이용해 조작하는 것이 일반적입니다. 시작 메뉴에서 \u0026lsquo;PowerShell\u0026rsquo;을 입력하여 실행하세요.\n3. Gemini CLI 설치하기 아래 명령어를 PowerShell에 복사하여 붙여넣고 실행합니다:\n1 npx @google/gemini-cli 이 명령어는 Google이 공개한 Gemini CLI 패키지를 임시로 실행하기 위한 것입니다. 필요에 따라 초기 설정이나 로그인이 요구될 수도 있습니다.\n※ 처음에는 몇 분 정도 걸릴 수 있습니다. 오류가 발생할 경우 Node.js나 네트워크 환경을 다시 확인해 보세요.\n4. 설치 완료! 다음으로 할 일 이것으로 Windows에 Gemini CLI가 설치되었습니다. 앞으로는 커맨드라인에서 Gemini를 사용하여 텍스트 생성이나 코드 완성 등 다양한 작업이 가능해집니다.\n공식 문서나 도움말을 확인하고 싶다면 아래와 같은 명령어도 활용할 수 있습니다.\n1 npx @google/gemini-cli --help 마무리 Windows에 Gemini CLI를 도입하는 과정을 복습해 보겠습니다.\nNode.js 및 npm 설치 PowerShell 실행 npx @google/gemini-cli 실행 이것으로 준비 완료입니다! 생성형 AI를 로컬에서 사용하고 싶은 분은 이 과정을 참고하여 도전해 보세요.\n","date":"2025-07-13T23:49:56+09:00","image":"http://kenji.blog/p/gemini-cli-%E3%82%92-windows-%E7%92%B0%E5%A2%83%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu68d4fe037447f15938887bf6c4d85b87_249642_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/gemini-cli-%E3%82%92-windows-%E7%92%B0%E5%A2%83%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"'Gemini CLI를 Windows 환경에 설치하는 방법'"},{"content":"Microsoft MVP（2025-2026）를 재수상했습니다! 안녕하세요, kenji입니다.\n보고드립니다. 올해도 Microsoft MVP（Most Valuable Professional） 를 수상하게 되었습니다. 이번으로 ** 9번째** 수상이 됩니다.\n항상 응원해주시는 여러분, 진심으로 감사합니다.\nMicrosoft MVP란 무엇인가요? 「MVP」라고 들으면 스포츠의 최우수 선수를 떠올리는 분들도 많을지 모르겠지만, 여기서 말하는 MVP는 Microsoft의 기술 커뮤니티에 기여한 사람에게 주어지는 칭호 입니다.\n구체적으로는,\n기술 블로그나 SNS를 통한 정보 발신 GitHub에 샘플 코드 공개 스터디나 컨퍼런스에서의 발표 Q\u0026amp;A 사이트에서의 답변 해외 개발자와의 기술 교류 및 콜라보레이션 기술자들이 연결되는 커뮤니티 참여 및 게시 등, 「자신의 지식과 경험을 누군가를 위해 공유하는」 활동이 평가되는 제도입니다.\n수상자는 전 세계에 있지만, 매년 선정되는 인원은 한정되어 있고, 재수상 역시 결코 쉽지 않습니다. 그렇기 때문에 이렇게 인정받을 수 있었던 것은 정말 영광스러운 일입니다.\n지난 1년간 집중했던 일 올해는 기술의 「이해하기 쉬움」과 「접근성」 을 의식한 발신에 힘을 쏟았습니다.\nGitHub를 통한 실용적인 샘플 코드 공개 스터디·컨퍼런스 발표 (국내외 불문) 기술 블로그나 SNS를 통한 정기적인 정보 발신 Q\u0026amp;A 사이트에서의 지속적인 답변 활동 기술자 커뮤니티 사이트에서의 지식 공유 해외 엔지니어와의 교류 및 공동 검증 그중에서도 GitHub에 코드를 공개한 것은 \u0026ldquo;같은 문제로 고민했는데 도움이 되었습니다!\u0026ldquo;라는 피드백을 받기도 해서, 제 노력이 다른 분들의 개발에 도움이 되고 있다는 것을 실감할 수 있어서 인상 깊었습니다.\n또한, 이벤트 발표에서는 \u0026ldquo;초보자도 이해하기 쉬웠다\u0026quot;는 피드백을 받기도 해서, \u0026ldquo;전달되는 기술 해설이란 무엇인가?\u0026ldquo;를 생각해보는 좋은 계기가 되었습니다.\n내년을 향해 기술의 발전은 정말 빠르고, 쫓아가는 것만으로도 벅찹니다. 그럼에도 제가 직접 시도해보고 얻은 실질적인 경험이나 헤맸던 부분 등, \u0026ldquo;1차 정보\u0026quot;로서의 리얼한 지식 을 전달하는 것에는 큰 가치가 있다고 생각합니다.\n내년에는 동영상이나 도해 등을 도입한 「시각적으로 이해하기 쉬운 기술 콘텐츠」 발신에도 도전해보고 싶습니다. 누군가의 \u0026ldquo;막혔다!\u0026ldquo;를 조금이라도 해소할 수 있는 아웃풋을 늘려가고 싶습니다.\n마지막으로 MVP라는 타이틀은 어디까지나 통과점 중 하나입니다.\n앞으로도 무리하지 않고, 제 페이스대로. 하지만 분명 누군가에게 도움이 될 수 있도록.\n\u0026ldquo;검색하다가 도움을 받았어요\u0026rdquo; \u0026ldquo;이 샘플 작동했어요!\u0026rdquo; \u0026ldquo;이 이야기, 이해하기 쉬웠어요\u0026rdquo;\n그런 말을 들을 수 있는 기술자로 계속 남고 싶습니다.\n앞으로도 잘 부탁드립니다.\nGitHub: https://github.com/kenjinote 기술 블로그: https://hack.jp X: https://twitter.com/kenjinote ","date":"2025-07-13T22:01:15+09:00","image":"http://kenji.blog/p/microsoft-mvp2025-2026%E3%82%92%E5%86%8D%E5%8F%97%E8%B3%9E%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/img_hu79b11b7d0311d1cf72d88f77ae4d2c9a_139280_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/microsoft-mvp2025-2026%E3%82%92%E5%86%8D%E5%8F%97%E8%B3%9E%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/","title":"Microsoft MVP（2025-2026）를 재수상했습니다"},{"content":"Win32API + C++로 개발하는 매력과 과제 Windows 앱 개발을 끝까지 파고들고 싶은 사람에게, Win32API + C++ 은 여전히 강력한 선택지입니다. OS와 가장 가까운 거리에서 상호 작용할 수 있는 이 조합은 고속성과 유연성을 겸비하고 있습니다.\n반면에 현대의 개발 스타일과는 크게 다르기 때문에 습득에는 각오도 필요합니다.\n이 페이지에서는 현직 Windows 앱 개발자의 관점 에서 그 장점과 단점을 알기 쉽게 해설합니다.\n장점 초고속 네이티브 실행 C++와 Win32API는 OS에 가장 가까운 레이어에서 동작하기 때문에 불필요한 오버헤드가 거의 없습니다. CPU나 메모리 사용 효율이 매우 높아 압도적인 실행 속도 를 자랑합니다.\n높은 유연성과 자유도 창 제어, 비동기 처리, COM 연동, 프로세스 관리 등 앱의 모든 동작을 스스로 세밀하게 제어 할 수 있습니다. 목적에 특화된 도구나 자작 독자 프레임워크 등도 구축 가능합니다.\n런타임이 필요 없어 배포하기 쉬움 .NET이나 Java와 같은 외부 런타임이 필요하지 않으므로 실행 파일 1개만으로 배포 가능 합니다. 재배포 시 트러블이 잘 일어나지 않아 인스톨러 없이도 동작시키기 쉬운 것이 매력입니다.\n가벼운 앱을 만들 수 있음 필요 최소한의 구성으로 끝나기 때문에 메모리 풋프린트가 매우 작다 는 것이 특징입니다. 사양이 낮은 PC나 가상 머신 환경에서도 쾌적하게 동작합니다.\nOS 수준의 고도화된 제어가 가능 마우스 및 키보드의 글로벌 후킹, 윈도우 스타일 미세 조정, 시스템 메뉴 조작 등 일반적인 언어나 라이브러리로는 어려운 제어 도 실현할 수 있습니다.\n단점 개발 효율이 낮음 GUI 구축도 완전히 코드로 수행해야 하며, 버튼 하나 만드는 데 수십 줄의 코드 가 필요한 경우도 있습니다. 설계 변경 시 수정도 번거로워 UI 프레임워크를 사용한 개발에 비해 생산성은 낮은 편입니다.\n유지 보수성이 떨어지기 쉬움 메시지 루프나 윈도우 프로시저 등 특수한 구조의 코드 가 많아 가독성이나 재사용성에 어려움이 있습니다. 팀 개발이나 장기 유지 보수에는 적합하지 않은 측면도 있습니다.\n모던 UI 대응이 번거로움 고DPI 대응, 터치 인터페이스, 접근성, 다크 모드 등 최근 요구되는 UX 대응이 어렵습니다. 하나하나 수작업으로 대응해야 하므로 수고가 듭니다.\n크로스 플랫폼 미지원 완전히 Windows 전용 API이기 때문에 macOS나 Linux로는 이식 불가 합니다. 멀티 플랫폼 전개를 가정할 경우 다른 기술을 선택해야 합니다.\n학습 비용이 매우 높음 핸들, GDI, COM, OLE 등 현대에는 잘 사용되지 않는 개념이나 구조 를 이해해야 합니다. 문서도 오래된 것이 많아 학습에는 시간과 끈기가 요구됩니다.\n적합한 용도 파일 런처나 단축키 지원 등의 가벼운 도구 클립보드 조작이나 IME 제어 등의 시스템 유틸리티 글로벌 훅이나 창 캡처 등의 네이티브 제어계 앱 하드웨어와 밀접하게 연동되는 드라이버 보조 도구 부적합한 용도 모던 UI·UX가 중시되는 일반 소비자용 앱 속도 우선으로 만드는 프로토타이핑이나 MVP 개발 장기 운용 및 팀 개발을 전제로 한 대규모 프로젝트 여러 OS에 대응할 필요가 있는 크로스 플랫폼 제품 평가 요약 관점 평가 실행 속도 ◎ 매우 빠름 메모리 효율 ◎ 뛰어남 개발 속도 × 느림 유지 보수성 × 낮음 크로스 플랫폼 대응 × 미지원 모던 UI 대응 × 약함 OS 제어 자유도 ◎ 압도적으로 높음 결론 Win32API + C++는 \u0026lsquo;OS의 모든 것을 스스로 다루고 싶은\u0026rsquo; 개발자에게 적합한 도구입니다. 그 파워는 매우 크지만 학습과 운용에는 그에 상응하는 각오가 필요합니다.\n\u0026lsquo;굳이 선택할\u0026rsquo; 가치가 있는지는 당신이 목표로 하는 앱의 성격에 달려 있습니다.\nGUI 프레임워크나 최신 언어에 의존하지 않고 #include \u0026lt;windows.h\u0026gt;의 세계로 뛰어드는 것―― 그 선택은 지금도 변함없이 의미가 있습니다.\n","date":"2025-07-12T12:30:35+09:00","image":"http://kenji.blog/p/win32api-c-%E3%81%A7%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E4%BD%9C%E3%82%8B%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88%E3%81%A8%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88/img_1_huda4a374969e448ba98e0798d75e2e435_4729_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/win32api-c-%E3%81%A7%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E4%BD%9C%E3%82%8B%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88%E3%81%A8%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88/","title":"Win32API + C++로 프로그램을 만드는 장점과 단점"},{"content":"Visual Studio에서 libcurl(OpenSSL 지원)을 사용한다면, vcpkg 도입이 쉽고 추천합니다 C++에서 HTTP 통신을 다룰 때 자주 사용되는 것이 libcurl입니다. 하지만 빌드나 의존성 조정은 의외로 번거롭죠.\n그럴 때 유용한 것이 Microsoft에서 만든 C++ 라이브러리 관리 도구인 \u0026lsquo;vcpkg\u0026lsquo;입니다. 이번에는 vcpkg를 사용하여 libcurl(OpenSSL 지원)을 도입하고, Visual Studio에서 원활하게 사용할 수 있도록 하는 절차를 소개합니다.\nvcpkg 설치 (미도입자만) 먼저 vcpkg를 설치합시다. 다음 절차를 PowerShell에서 실행해 주세요.\n1 2 3 git clone https://github.com/microsoft/vcpkg cd vcpkg .\\bootstrap-vcpkg.bat ※Git이 아직 설치되어 있지 않은 경우, Git 공식 사이트에서 설치해 주세요.\nlibcurl(OpenSSL 지원) 설치 이어서 vcpkg를 사용하여 libcurl을 설치합니다. OpenSSL을 지원하는 64bit 버전을 지정하려면 다음 명령을 실행합니다.\n1 vcpkg install curl[ssl] --triplet x64-windows 이 명령을 실행하면 필요한 의존성(OpenSSL 등)도 자동으로 설정됩니다.\nVisual Studio와의 연동 설정 vcpkg로 도입한 라이브러리를 Visual Studio 프로젝트에서 쉽게 사용할 수 있도록 하려면 다음 명령으로 통합 설정을 수행합니다.\n1 vcpkg integrate install 이 설정을 해두면 Visual Studio 프로젝트에서 자동으로 #include \u0026lt;curl/curl.h\u0026gt;를 사용할 수 있게 되며, 라이브러리 경로 및 링커 설정을 수동으로 할 필요가 없어집니다.\n마치며 이것으로 Visual Studio에 libcurl(OpenSSL 지원)을 도입할 준비가 완료되었습니다.\nvcpkg를 사용하면 번거로운 의존성도 일괄적으로 관리할 수 있다 vcpkg install curl[ssl] --triplet x64-windows로 libcurl을 쉽게 도입 vcpkg integrate install로 Visual Studio와 자동 연동 가능 이제 프로젝트 내에서 헤더를 인클루드하고 libcurl의 API를 사용하여 개발을 시작해 봅시다. 편리한 vcpkg를 활용하여 개발 효율을 단번에 높여보세요.\n","date":"2025-07-07T21:46:08+09:00","image":"http://kenji.blog/p/vcpkg-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6-visual-studio-%E3%81%AB-curl-%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/img_hub03488d3cca2b78b7b08dd6d749f5d1e_294355_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/vcpkg-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6-visual-studio-%E3%81%AB-curl-%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/","title":"'【초보자용】vcpkg로 libcurl(OpenSSL 지원)을 Visual Studio에 도입하는 절차'"},{"content":"음모론에 휩쓸리지 않기 위해 필요한 \u0026lsquo;마음의 보안\u0026rsquo; 인터넷을 보다 보면 가끔 \u0026lsquo;음모론\u0026rsquo;적인 이야기를 접하게 됩니다.\n\u0026ldquo;이 사건, 뒤에서 조종하는 누군가가 있는 것 아닐까?\u0026rdquo; \u0026ldquo;진짜 진실은 숨겨져 있는 것이 아닐까?\u0026rdquo; 그런 언설이 그럴듯한 형태로 확산되어 가는 것을 본 적이 있는 사람도 많을 것입니다.\n이러한 정보에 지나치게 휩쓸리지 않으려면 \u0026lsquo;지식\u0026rsquo;이나 \u0026lsquo;사고력\u0026rsquo;뿐만 아니라 마음가짐, 즉 \u0026lsquo;마음의 보안\u0026rsquo;을 갖추는 것이 매우 중요합니다.\n아래에 이를 위해 유효한 6가지 생각의 틀을 소개합니다.\n불안과 \u0026lsquo;해답\u0026rsquo;을 즉시 연결하지 않기 음모론의 큰 특징은 불안이나 의문에 대해 명확하고 이해하기 쉬운 \u0026ldquo;해답\u0026quot;을 제시한다는 점입니다.\n예를 들어,\n\u0026ldquo;왜 이런 사건이 일어나는 걸까?\u0026rdquo; \u0026ldquo;누가 이득을 보고 있는 걸까?\u0026rdquo; 이러한 질문에 \u0026ldquo;사실은 ○○가 뒤에서 조종하고 있다\u0026quot;라는 시나리오가 제시되면 무심코 납득해 버리기 쉽습니다.\n하지만 불안한 마음이 들 때일수록 성급하게 결론을 내리지 않고 보류해 두는 것 이 중요합니다.\n\u0026ldquo;모르는 채로 머물러 있을 수 있는 힘\u0026quot;은 지적 성숙의 증거이기도 합니다.\n정보의 수용구를 의도적으로 넓히기 음모론에 빠져드는 사람들의 대부분은 \u0026lsquo;비슷한 생각의 정보\u0026rsquo;만을 집중적으로 보는 경향이 있습니다.\n이는 \u0026lsquo;확증 편향\u0026rsquo;이라고 불리며, 이미 가지고 있는 생각을 보강하는 정보만 접하게 되는 심리적 편향입니다.\n특히 SNS나 동영상 사이트의 알고리즘은 취향에 맞을 만한 게시물을 계속해서 보여주기 때문에 시야가 자연스럽게 좁아질 수도 있습니다.\n의식적으로,\n다양한 관점의 미디어를 접하기 해외 뉴스나 학술적인 출처를 찾아보기 자신의 생각과 다른 의견에도 귀 기울이기 등 정보원의 다각화 를 도모하는 것이 위험을 피하는 길입니다.\n\u0026ldquo;나는 속지 않는다\u0026quot;고 생각하지 않기 지식이 있는 사람이나 논리적인 사람일수록 사실 음모론에 빠져들기 쉬울 때가 있습니다.\n\u0026ldquo;다른 사람들이 알아채지 못하는 진실을 나는 깨달을 수 있다\u0026quot;고 착각해 버리면, 그것이 판단을 흐리게 하는 요인이 되기 때문입니다.\n아무리 주의하더라도 인간은 실수할 수 있습니다. 그렇기 때문에 나도 속을 수 있다는 전제에 서는 것 이 오히려 이성적인 태도라고 할 수 있습니다.\n\u0026ldquo;의심하면서도 단정 짓지 않는\u0026rdquo; 것이 방어력이 됩니다.\n스토리에 끌려가지 않고 구조를 보기 음모론에는 \u0026lsquo;드라마틱한 이야기\u0026rsquo;가 뒤따르기 마련입니다.\n정의와 악의 대립 구조 지배자와 피지배자 각성한 나 vs 세뇌된 타인 이러한 단순한 이분법적 대립은 이야기로서는 매력적일지 몰라도, 현실을 올바르게 반영하고 있다고는 할 수 없습니다.\n현실의 사건이나 사회의 움직임에는 복잡한 인과관계나 역사적 배경, 제도적인 구조 등 수많은 요소가 얽혀 있습니다.\n스토리에 감정이 지나치게 휩쓸리지 않고, \u0026ldquo;왜 이렇게 되어 있는가?\u0026ldquo;를 구조적으로 이해하는 시각 을 가지는 것이 중요합니다.\n고독을 방치하지 않기 음모론에 강하게 이끌리는 배경에는 \u0026lsquo;고립\u0026rsquo;이나 \u0026lsquo;설 자리 없음\u0026rsquo;이 숨어 있는 경우가 있습니다.\n사람은 고독을 느낄 때 자신을 이해해 주는 사람들이나 집단에 깊이 의존하기 쉽습니다. 음모론 커뮤니티는 그러한 \u0026ldquo;설 자리\u0026quot;로서의 기능을 다해 버리기도 합니다.\n그렇기 때문에 고독해지지 않으려는 노력 또한 마음의 보안으로 이어집니다.\n예를 들어,\n정기적으로 사람들과 대화하기 취미나 관심사를 공유하는 커뮤니티에 참여하기 온라인뿐만 아니라 오프라인에서도 관계를 맺기 와 같은 행동이 정신적인 안정으로 이어집니다.\n부정하기보다 대화를 의식하기 만약 가까운 사람이 음모론에 경도되어 있다 하더라도, 무턱대고 부정하는 것은 역효과 가 날 수 있습니다.\n사람은 자신의 신념을 부정당하면 심리적으로 그것을 지키려는 경향이 강해집니다(이를 \u0026lsquo;방어적 인지\u0026rsquo;라고 부릅니다).\n그 대신에,\n\u0026ldquo;왜 그렇게 생각했어?\u0026ldquo;라고 정중하게 물어보기 \u0026ldquo;이런 생각도 있을 수 있지 않을까?\u0026ldquo;라며 자신의 시각을 온화하게 제시하기 와 같은 대화적인 접근 을 취함으로써 상대방의 시야가 자연스럽게 넓어질 가능성이 생깁니다.\n요약: 음모론과 거리를 두기 위해 할 수 있는 일 불안과 해답을 즉시 연결하지 않고 보류할 수 있는 힘 기르기 정보원을 다각화하여 편향을 알아채기 자신의 판단이 절대적이지 않음을 인식하기 스토리가 아닌 구조와 인과관계로 사물을 보기 고독을 피하고 관계를 유지하기 타인의 음모론에는 부정보다 대화로 마주하기 음모론에 끌리는지 여부는 지식의 양보다 심리적인 상태나 환경의 영향이 더 크다고 알려져 있습니다.\n그렇기 때문에 \u0026lsquo;나는 괜찮다\u0026rsquo;고 단정 짓지 않고, 일상 속에서 조금씩 마음의 보안을 높이는 노력 을 해나가는 것이 앞으로의 정보 사회를 유연하게 살아가는 데 큰 버팀목이 될 것입니다.\n","date":"2025-05-26T22:23:34+09:00","image":"http://kenji.blog/p/%E9%99%B0%E8%AC%80%E8%AB%96%E3%81%AB%E3%81%AF%E3%81%BE%E3%82%89%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81%E3%81%AB%E4%BD%95%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%8B/img_hu51c98705e3e626ac0eb85c430c7c7e5c_195663_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E9%99%B0%E8%AC%80%E8%AB%96%E3%81%AB%E3%81%AF%E3%81%BE%E3%82%89%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81%E3%81%AB%E4%BD%95%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%8B/","title":"'음모론에 빠지지 않기 위해 무엇이 필요한가'"},{"content":"로우코드/노코드 개발의 역사 (1980년대～현재) 로우코드/노코드 개발이란, 프로그래밍에 대한 전문 지식이 없어도 앱이나 웹사이트, 데이터베이스 등을 만들 수 있는 개발 방식입니다. 이 개념은 1980년대부터 시작되어, PC의 보급, 인터넷의 진화, 클라우드 기술의 확대와 함께 다양한 플랫폼으로 발전해 왔습니다. 본 기사에서는 연대별로 대표적인 도구나 서비스를 살펴보고, 그 특징과 가격에 대해 소개합니다.\n1980년대: 초창기 HyperCard (Apple, 1987) Macintosh용 앱 제작 도구. 카드 형태로 화면을 구성하고 GUI를 드래그 앤 드롭으로 제작. 독자적인 스크립트 언어인 \u0026lsquo;HyperTalk\u0026rsquo;를 통해 간단한 동작 제어도 가능. 프로토타이핑 용도로 선호되었습니다. 출시 당시 가격은 49.95달러였으며, 이후 신규 Mac 구매자에게 무료로 제공되었습니다. 최종 버전은 1998년이며, Mac OS X 이후로는 지원되지 않습니다.\nFileMaker (Claris/Apple, 1985) 그래픽 기반의 데이터베이스 소프트웨어. 표 형태의 데이터 표시뿐만 아니라, 자유로운 레이아웃 편집과 스크립트 기능을 갖춘 관계형 DB 도구입니다. 현재는 \u0026lsquo;Claris FileMaker Pro\u0026rsquo;로 제공되며, 풀 라이선스 버전은 594달러(2024년 기준).\n1990년대: GUI 앱과 업무용 개발의 대두 Visual Basic (Microsoft, 1991) Windows 앱 개발에 특화된 IDE. 버튼이나 레이블 등의 GUI 부품을 드래그 앤 드롭으로 배치하여, 이벤트 기반 앱을 쉽게 구축할 수 있었습니다. 1998년 VB6.0을 마지막으로 .NET 시대로 전환되었습니다.\nMicrosoft Access (1992) Windows용 데이터베이스 개발 도구. 관계형 DB 설계와 GUI를 통한 폼 작성이 가능하여, 일반인을 위한 업무용 앱 개발에 널리 사용되었습니다. 현재는 Microsoft 365의 일부로 제공 중입니다.\nPowerBuilder (PowerSoft/Sybase, 1991) 업무용 앱을 위한 4GL 개발 도구. 클라이언트/서버 아키텍처를 지원하며, 데이터베이스 연동에 강점이 있었습니다. 현재는 SAP 산하에서 계속 제공되고 있습니다.\nDreamweaver (Macromedia, 1997) 웹 페이지 제작을 시각적으로 할 수 있는 WYSIWYG 도구. HTML 편집과 디자인 뷰 전환이 가능하며, ASP나 PHP 지원도 갖추고 있었습니다. 현재는 Adobe에서 제공하며, 구독형(월 약 34.49달러)으로 이용 가능합니다.\nFlash (Macromedia, 1996) 원래는 FutureSplash Animator로 개발된 벡터 애니메이션 제작 도구. 이후 웹용 인터랙티브 콘텐츠 제작에 활용되었으나, 보안 우려로 2020년에 지원이 종료되었습니다.\nGameMaker (1999) 초보자를 위한 2D 게임 제작 도구. 오브젝트 배치나 이벤트 제어를 드래그 앤 드롭으로 할 수 있습니다. 이후 스크립트(GML)도 지원하게 되었으며, 현재는 상업용으로 여러 플랜이 제공되고 있습니다.\n2000년대: 웹 기반과 오픈 소스의 확산 WordPress (2003) PHP와 MySQL을 사용한 오픈 소스 CMS. 프로그래밍 지식이 없어도 테마나 플러그인을 사용하여 블로그나 기업 사이트를 구축할 수 있습니다. 무료로 배포되며, 전 세계에서 가장 많이 사용되는 CMS 중 하나입니다.\nWix (2006) 브라우저 상에서 웹사이트를 구축할 수 있는 노코드 서비스. 템플릿을 선택하고 드래그 앤 드롭으로 편집할 수 있습니다. 무료 플랜 외에도 유료 플랜에서는 커스텀 도메인이나 이커머스 기능도 사용할 수 있습니다.\nOutSystems (2001) 엔터프라이즈용 로우코드 플랫폼. 업무 시스템을 빠르게 개발할 수 있어, 대기업이나 행정 기관에서의 도입이 진행되고 있습니다. 클라우드와 온프레미스 모두 지원합니다.\nScratch (MIT, 2007) 어린이를 위해 개발된 프로그래밍 학습 도구. 색깔이 있는 블록을 조합하여 게임이나 애니메이션을 만들 수 있어, 교육 현장에서 널리 이용되고 있습니다. 무료로 제공됩니다.\nAirtable (2013) 스프레드시트와 데이터베이스를 결합한 클라우드형 서비스. 외형은 Excel에 가깝지만, 관계나 칸반 보기, API 연동 등이 가능합니다. 개인부터 법인까지 폭넓게 사용되고 있습니다.\n2010년대～2020년대: 클라우드와 자동화의 시대 최근, 클라우드 기반의 로우코드/노코드 도구가 급속도로 진화하고 있습니다.\nPower Platform (Microsoft) \u0026lsquo;Power Apps\u0026rsquo;, \u0026lsquo;Power Automate\u0026rsquo; 등을 포함한 통합형 업무 앱 개발 및 자동화 플랫폼. 기업의 업무 프로세스를 드래그 앤 드롭으로 시각적으로 구축할 수 있습니다.\nSalesforce Lightning Platform CRM인 Salesforce에서 제공하는 앱 개발 기반. GUI로 업무 앱을 제작할 수 있으며, 다른 Salesforce 서비스와의 통합도 용이합니다.\nZapier / IFTTT 여러 클라우드 서비스 간의 연동을 코딩 없이 구축할 수 있는 자동화 도구. 예를 들어 \u0026ldquo;Google 설문지에 입력되면 Slack으로 알림\u0026quot;과 같은 워크플로우를 쉽게 구현할 수 있습니다.\nNotion (2010년대) 문서 관리, 작업 관리, 위키 등을 통합한 올인원 워크스페이스. 사용자 지정 데이터베이스 기능도 갖추고 있어 노코드를 통한 업무 개선에 유용합니다.\nConstruct 3 / GameSalad 드래그 앤 드롭으로 게임을 만들 수 있는 도구. Construct 3는 HTML5를 지원하여 브라우저 상에서도 동작하며, 교육 현장이나 인디 개발자에게 인기가 있습니다.\n정보 출처 및 보충 설명 이 기사는 각 제품의 공식 사이트, Wikipedia, 신뢰할 수 있는 자료 및 기사(Apple, Microsoft, Adobe 등)를 바탕으로 구성했습니다. 가격 정보는 가능한 한 당시 또는 최신 공식 정보를 참고했습니다(기재된 금액은 주로 미국 달러 기준). 2000년대 이후의 도구 대부분은 구독형이며, 플랜에 따라 요금이 달라집니다.\n","date":"2025-04-26T16:46:11+09:00","image":"http://kenji.blog/p/%E3%83%AD%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8A%E3%82%88%E3%81%B3%E3%83%8E%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%AD%B4%E5%8F%B2/img_hu615c889fe1afb242f7436bdb2a6d534f_388471_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%83%AD%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8A%E3%82%88%E3%81%B3%E3%83%8E%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%AD%B4%E5%8F%B2/","title":"'로컬 환경에서의 노코드의 역사'"},{"content":"FizzBuzz란 결국 무엇인가? 안녕하세요!\n오늘은 \u0026ldquo;FizzBuzz\u0026quot;에 대해 써보려고 합니다.\n\u0026ldquo;아, 그거 알아!\u0026rdquo; 하시는 분들도, \u0026ldquo;뭔가 들어본 적은 있는데 잘 모르겠다\u0026rdquo; 하시는 분들도 조금만 어울려 주세요. 몇 분이면 읽을 수 있고, 어쩌면 \u0026ldquo;그렇구나\u0026rdquo; 하고 고개를 끄덕이게 되실지도 모릅니다.\n\u0026ldquo;FizzBuzz를 작성하지 못하면 프로그래머 실격\u0026quot;이라는 말은 사실일까? FizzBuzz를 대략적으로 설명하자면 이런 식입니다.\n1 2 3 4 5 6 7 8 9 for i in range(1, 101): if i % 15 == 0: print(\u0026#34;FizzBuzz\u0026#34;) elif i % 3 == 0: print(\u0026#34;Fizz\u0026#34;) elif i % 5 == 0: print(\u0026#34;Buzz\u0026#34;) else: print(i) 네, 이것이 바로 유명한 \u0026ldquo;FizzBuzz 문제\u0026quot;입니다.\n1부터 100까지의 숫자를 순서대로 확인하면서,\n3의 배수라면 \u0026ldquo;Fizz\u0026rdquo;, 5의 배수라면 \u0026ldquo;Buzz\u0026rdquo;,\n두 수의 공배수라면 \u0026ldquo;FizzBuzz\u0026quot;를 출력하는 아주 간단한 문제입니다.\n그런데 왜인지 \u0026ldquo;프로그래머로서의 최소한의 시험\u0026rdquo; 같은 취급을 받는 경우가 많습니다. 면접에서도 출제되고, SNS에서는 \u0026ldquo;FizzBuzz도 못 짜는 녀석이\u0026hellip;\u0026rdquo; 같은 우월감 섞인 발언도 심심치 않게 보입니다.\n하지만, 잠깐만 기다려 보세요.\n정말로 \u0026ldquo;FizzBuzz를 작성하지 못했다 = 프로그래밍을 할 수 없다\u0026quot;라고 단언할 수 있을까요?\n할 수 있느냐가 아니라, 할 수 있는 \u0026ldquo;상태\u0026quot;인가 확실히 FizzBuzz는 구문에 대한 이해와 기본적인 논리적 사고를 요구합니다. 그렇기 때문에 \u0026ldquo;기초 확인\u0026rdquo; 용도로 쓰인다는 점은 납득이 갑니다.\n하지만 말입니다.\n환경이 다르면 결과도 달라집니다.\n예를 들어,\n초면인 면접관 앞에서 긴장했을 때 갑자기 화이트보드를 건네받고, 수중에 에디터가 없을 때 \u0026ldquo;어라, modulo가 뭐였지?\u0026rdquo; 하고 갑자기 떠오르지 않을 때 \u0026hellip;그런 적 없으신가요? 사람이니까요. 있을 수 있다고 생각합니다.\n그래서 \u0026ldquo;FizzBuzz를 작성할 수 있는가\u0026quot;보다 \u0026ldquo;FizzBuzz를 작성할 수 있는 상태로 자신을 이끌 수 있는가\u0026quot;가 사실 더 중요하지 않을까 생각합니다.\n흔한 \u0026ldquo;훈련하면 OK\u0026quot;라는 조언의 함정 이런 이야기를 하면 \u0026ldquo;그러니까 매일 연습해라!\u0026ldquo;라는 조언이 나오기 마련입니다.\n물론, 반복 연습을 통해 술술 작성할 수 있게 되는 것은 사실이고, 그 자체는 좋은 일입니다. 하지만 \u0026ldquo;FizzBuzz를 작성하지 못하면 실격\u0026quot;이라는 전제에 서게 되면, 단지 공포로 변해버릴 수도 있습니다.\n즉, \u0026ldquo;실수했다 = 나는 안 되나 보다\u0026quot;라고 느끼게 되는 구조가 되기 쉬운 것이죠.\n예를 들어, 늦잠을 잔 날 \u0026ldquo;나는 게으름뱅이야\u0026hellip;\u0026ldquo;라고 생각하기 쉽지 않나요? 하지만 그건 어쩌다 몸이 피곤했을 뿐일지도 모릅니다.\nFizzBuzz도 마찬가지입니다.\n그렇다 해도, FizzBuzz는 역시 좋은 질문이기도 하다 그렇다 해도, FizzBuzz가 나쁘다는 것은 아닙니다.\n오히려 아주 잘 만들어진 질문이라고 생각합니다. 규칙이 간단하고 확장하기도 쉽습니다. 예를 들어 이렇게 바꿔보면 좀 더 사고가 깊어집니다.\n1 2 3 4 5 6 7 for i in range(1, 101): output = \u0026#34;\u0026#34; if i % 3 == 0: output += \u0026#34;Fizz\u0026#34; if i % 5 == 0: output += \u0026#34;Buzz\u0026#34; print(output or i) 이것은 \u0026ldquo;if-elif-else가 아니더라도 작성할 수 있다\u0026quot;는 예시입니다. 꽤 스마트하죠.\n즉, FizzBuzz는 \u0026ldquo;해냈는가\u0026quot;뿐만 아니라, \u0026ldquo;어떻게 작성하는가\u0026quot;나 \u0026ldquo;어디까지 이해하고 있는가\u0026quot;를 파악하기 위한 진입점도 될 수 있습니다.\n그렇기 때문에 FizzBuzz를 할 수 있는지 여부에 너무 과도한 의미를 부여하지 않아도 된다고 생각합니다.\n작성하지 못했다 하더라도, 그것은 단지 \u0026ldquo;지금 좀 컨디션이 안 좋았다\u0026quot;일 뿐일지도 모르고, 나중에 차분히 생각하면 할 수 있는 경우도 많습니다.\n조급해하지 말고, 천천히 나아가 봅시다.\n코드는 사람이 작성하는 것입니다. 사람이니까 잊어버릴 수도 있고, 긴장할 수도 있습니다. 그런 점을 받아들이면서, 조금씩 나아갈 수 있다면 충분하다고 생각합니다.\n그럼, 오늘도 편안한 마음으로 코드를 작성해 봅시다.\n","date":"2025-04-18T00:58:11+09:00","image":"http://kenji.blog/p/fizzbuzz/img_hu0b23239076c3049a7d4382dec6ccfba6_85967_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/fizzbuzz/","title":"'FizzBuzz'"},{"content":"하노이의 탑 안녕하세요!\n오늘은 \u0026ldquo;하노이의 탑\u0026quot;에 대해 Python 샘플 프로그램을 곁들여 설명해보고자 합니다.\n하노이의 탑이란? 하노이의 탑은 3개의 기둥과 여러 개의 원판을 사용하는 퍼즐입니다. 원판은 크기가 다르며, 처음에는 하나의 기둥에 크기 순서대로 쌓여 있습니다. 규칙은 다음과 같습니다:\n한 번에 옮길 수 있는 원판은 1개뿐입니다. 작은 원판 위에 큰 원판을 놓을 수 없습니다. 이 퍼즐은 재귀적 사고를 배우는 데 최적의 교재로 알려져 있습니다. 재귀란 어떤 문제를 같은 종류의 더 작은 문제로 분해하여 해결하는 방법입니다. 하노이의 탑에서는 n개의 원판을 이동하기 위해 n-1개의 원판을 이동하는 조작을 반복합니다.\nPython으로 하노이의 탑을 풀어보자 아래는 Python으로 하노이의 탑을 풀기 위한 샘플 코드입니다.\n1 2 3 4 5 6 7 8 9 10 def hanoi(n, source, target, auxiliary): if n == 1: print(f\u0026#34;Move disk 1 from {source} to {target}\u0026#34;) return hanoi(n - 1, source, auxiliary, target) print(f\u0026#34;Move disk {n} from {source} to {target}\u0026#34;) hanoi(n - 1, auxiliary, target, source) # 예: 3개의 원판을 A에서 C로 이동 hanoi(3, \u0026#39;A\u0026#39;, \u0026#39;C\u0026#39;, \u0026#39;B\u0026#39;) 이 코드에서는 hanoi 함수가 재귀적으로 호출되어 원판을 이동하는 순서가 출력됩니다. 예를 들어, 3개의 원판의 경우 다음과 같은 출력을 얻을 수 있습니다:\n1 2 3 4 5 6 7 Move disk 1 from A to C Move disk 2 from A to B Move disk 1 from C to B Move disk 3 from A to C Move disk 1 from B to A Move disk 2 from B to C Move disk 1 from A to C 이렇게 재귀적인 접근 방식을 사용하면 복잡한 문제도 간단하게 해결할 수 있습니다.\n64개의 원판을 옮기는 데 시간이 얼마나 걸릴까? 하노이의 탑의 이동 횟수는 최소한 2^n - 1번 필요합니다. 즉, 64개의 원판을 이동하려면 2^64 - 1번, 약 1.84×10^19번의 이동이 필요합니다. 만약 1초에 1번 이동할 수 있다고 하더라도 약 5849억 년이 걸립니다. 이것은 우주 나이(약 137억 년)의 약 42배입니다.\n이렇게 원판의 수가 늘어나면 필요한 이동 횟수가 지수함수적으로 증가합니다. 따라서 실제로 64개의 원판을 이동하는 것은 현실적이지 않습니다.\n정리 하노이의 탑은 재귀적 사고를 배우기에 가장 좋은 퍼즐입니다. Python을 사용하면 그 해법을 간단하게 구현할 수 있습니다. 하지만 원판의 수가 늘어나면 필요한 이동 횟수가 급격히 증가하므로 주의가 필요합니다.\n재귀적 접근 방식을 이해하고 실제로 코드를 작성해 보는 것으로 프로그래밍 스킬을 향상시킬 수 있습니다. 꼭 하노이의 탑에 도전해 보세요.\n","date":"2025-04-17T22:23:14+09:00","image":"http://kenji.blog/p/%E3%83%8F%E3%83%8E%E3%82%A4%E3%81%AE%E5%A1%94/img_hub916bf71b02b2ffc8b3c247adaa061ec_2314383_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%83%8F%E3%83%8E%E3%82%A4%E3%81%AE%E5%A1%94/","title":"'하노이의 탑'"},{"content":"소스 코드의 줄 수 안녕하세요!\n오늘은 조금 색다른 주제로 이야기해 볼까 합니다.\n\u0026ldquo;소스 코드의 줄 수, 예전과 비교하면 얼마나 늘어났을까?\u0026ldquo;라는 이야기입니다.\n예를 들어, 우주왕복선의 소프트웨어는 약 42만 줄의 코드로 구성되어 있었습니다. 이 코드는 NASA의 높은 품질 기준을 충족하기 위해 매우 엄격한 프로세스로 개발되었습니다. 반면, 현대의 대규모 소프트웨어 프로젝트에서는 코드의 줄 수가 수천만 줄을 넘는 일도 드물지 않습니다. 예를 들어, Google의 코드베이스는 약 20억 줄에 달한다고 알려져 있습니다.\n이처럼 소프트웨어의 규모는 시대와 함께 커지고 있습니다.\n하지만 잠시만요.\n코드의 줄 수가 늘어나는 것이 반드시 나쁜 것만은 아닙니다. 새로운 기능을 추가하거나 사용자의 요구에 부응하기 위해 코드가 늘어나는 것은 자연스러운 일입니다. 단, 코드가 늘어나면 버그의 위험도 높아집니다. 실제로 한 조사에서는 오픈 소스 프로젝트가 100만 줄을 넘으면 버그 발생률이 증가하는 경향이 있다는 것이 밝혀졌습니다.\n그렇다고 해서 모든 프로젝트가 똑같이 코드를 늘리고 있는 것은 아닙니다.\n예를 들어, Linux 커널은 1994년 버전 1.0에서는 약 20만 줄이었지만, 2015년 버전 4.2에서는 약 2,000만 줄로 증가했습니다. 이러한 증가는 하드웨어의 발전이나 새로운 기능의 추가에 대응하기 위함입니다.\n이렇듯 소스 코드의 줄 수는 프로젝트의 규모나 목적, 시대적 배경에 따라 크게 다릅니다.\n코드의 줄 수가 늘어나는 것 자체는 문제가 되지 않지만, 품질이나 유지보수성을 유지하기 위해서는 적절한 관리가 필요합니다. 코드 증가에 따른 위험을 이해하고 적절한 대책을 마련하는 것이 중요합니다.\n마지막으로, 코드의 줄 수에 너무 얽매이지 않고 프로젝트의 목적이나 품질을 중시하는 것이 중요하다고 생각합니다.\n그럼, 다음 번에 또 만나요!\n","date":"2025-04-17T10:33:02+09:00","image":"http://kenji.blog/p/%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E8%A1%8C%E6%95%B0/img_1_hu5eec8f3e01b611d6fcced12ecef63fb0_956545_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E8%A1%8C%E6%95%B0/","title":"'소스 코드의 줄 수'"},{"content":"케르크호프스의 원리 안녕하세요!\n오늘은 좀 재밌으면서도 사실 엄청나게 중요한 \u0026lsquo;케르크호프스의 원리\u0026rsquo;라는 이야기를 해보려고 합니다.\n아, 잠깐만요.\n\u0026lsquo;케르크호프스의 원리\u0026rsquo;라니 들어본 적도 없고, 왠지 어렵게 느껴진다고 생각하신 분도 계실지 모르겠습니다. 안심하세요. 이 글은 바로 그런 분들이 읽어주셨으면 하는 내용이거든요.\n\u0026lsquo;안전한 암호\u0026rsquo;란 무슨 뜻일까요? 예를 들어 누군가가 \u0026ldquo;이 금고, 비밀 여는 법을 아는 사람만 열 수 있습니다\u0026quot;라고 말했다고 해보죠.\n그거 얼핏 보면 엄청 안심되는 것 같죠.\n하지만 가만히 생각해보면 조금 불안하지 않나요?\n\u0026ldquo;그 비밀, 들키면 끝나는 거 아냐?\u0026rdquo; 같은 생각이 들잖아요.\n사실 이것이 케르크호프스의 원리가 등장하게 된 계기입니다.\n애초에 \u0026lsquo;케르크호프스의 원리\u0026rsquo;가 뭔가요? 이거, 엄청 간단하게 말하자면,\n\u0026ldquo;암호는 그 구조가 들통나도 안전해야 한다\u0026rdquo; 는 생각입니다.\n더 나아가 \u0026ldquo;안전성은 오직 \u0026lsquo;비밀 키\u0026rsquo;에만 의존해야 하며, 암호화 방식 자체는 공개되어 있어도 OK!\u0026ldquo;라는 뜻이죠.\n반대로 말하면, \u0026ldquo;암호 알고리즘(구조)을 비밀로 하고 있을 뿐인 상태는 신뢰성이 낮다\u0026quot;고 간주되는 겁니다.\n\u0026ldquo;구조가 비밀이니까 안심\u0026quot;이라는 생각은 좀 위험할 수 있습니다 흔히 이런 생각을 하죠.\n\u0026ldquo;이 앱의 내부는 아무에게도 보여주지 않았으니까 보안은 괜찮아\u0026rdquo;\n그 마음 이해합니다.\n하지만 그건 \u0026ldquo;아무도 보지 않으니까 나쁜 점도 발견되지 않을 테고, 괜찮겠지\u0026quot;라고 말하는 것과 같습니다.\n실제로는 그 \u0026ldquo;아무도 보지 않는다\u0026quot;는 것 자체가 리스크가 될 수도 있거든요.\n그런데 왜 그런 원리가 중요한 걸까요? 왜냐하면, 만약 누군가가 구조를 알아내서 간단히 해독해버린다면 그 암호는 끝이기 때문입니다.\n비유하자면, 문 열쇠가 엄청 복잡한 구조로 되어 있는데 사실 100엔샵에서 만든 열쇠로도 열려버리는 것과 같습니다.\n\u0026ldquo;열쇠가 비밀이라서 괜찮아\u0026quot;가 아니라, \u0026ldquo;구조를 전부 보여줘도, 제대로 된 열쇠가 없으면 열 수 없다\u0026quot;가 중요한 거겠죠.\n\u0026ldquo;그래도 왠지 무섭지 않아?\u0026ldquo;라는 마음 여기서 많은 사람들이 느끼는 것이,\n\u0026ldquo;구조를 전부 드러낸다니, 왠지 무섭지 않아?\u0026rdquo;\n라는 불안입니다.\n이해합니다.\n왜냐하면 \u0026ldquo;내부를 전부 보여주면 따라 하거나 악용되지 않을까?\u0026ldquo;라고 생각하게 되니까요.\n하지만 그 점이 바로 케르크호프스 원리의 핵심입니다.\n\u0026ldquo;내부를 보여줘도 무너지지 않는 견고함\u0026quot;이야말로 진짜 보안이라는 것이죠.\n그렇긴 해도 처음엔 약간의 용기가 필요합니다 개발자의 입장이 되어보면 \u0026ldquo;구조를 공개한다 = 약점도 보여준다\u0026quot;는 것 같아서 당연히 조마조마합니다.\n하지만 생각해보세요.\n구조를 제대로 보여준 뒤 \u0026ldquo;누구든 검증해도 좋아\u0026quot;라고 말할 수 있는 쪽이 결과적으로 더 신뢰받습니다.\n그건 인간관계와도 비슷하죠.\n\u0026ldquo;진짜 내 모습을 보여준 뒤에도 친하게 지내주는 사람\u0026quot;이 역시 가장 안심되잖아요.\n그래서 결론은 케르크호프스의 원리라는 게 좀 이론적으로 들릴지도 모르겠지만, 본질은 아주 심플합니다.\n\u0026ldquo;누구에게 보여줘도 망가지지 않는 구조를 만들자\u0026rdquo; 는 이야기일 뿐이죠.\n표면적인 비밀보다 제대로 된 설계.\n누구에게도 보여주고 싶지 않은 코드보다, 보여줘도 부끄럽지 않은 코드.\n그런 \u0026lsquo;견고함\u0026rsquo;이 앞으로의 시대에는 더욱 요구될지도 모르겠습니다.\n읽어주셔서 감사합니다!\n보안 이야기는 좀 어렵지만, 그래도 \u0026lsquo;사람과의 관계\u0026rsquo;나 \u0026lsquo;일상의 안심감\u0026rsquo;과도 이어지는 부분이 있죠.\n부담 갖지 말고, 조금씩 알아가다 보면 분명 좋은 일이 있을 거라 생각합니다.\n","date":"2025-04-16T23:53:08+09:00","image":"http://kenji.blog/p/%E3%82%B1%E3%83%AB%E3%82%AF%E3%83%9B%E3%83%95%E3%82%B9%E3%81%AE%E5%8E%9F%E7%90%86/img_2_hu71b6c82ab9eb0ac0abd797e00918df90_2573611_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%82%B1%E3%83%AB%E3%82%AF%E3%83%9B%E3%83%95%E3%82%B9%E3%81%AE%E5%8E%9F%E7%90%86/","title":"'케르크호프스의 원리'"},{"content":"🎯 C++에서 PowerShell을 C++/CLI DLL을 통해 실행하는 방법 (Visual Studio 2022 / C++) ✅ 전체 구조 🔹 ① CLI 래퍼 DLL (C++/CLI) PowerShell 스크립트를 실행하는 기능을 제공합니다.\n🔹 ② 네이티브 C++ 호출자 CLI DLL을 호출하여 PowerShell 스크립트를 실행합니다.\n🔧 단계 1: CLI 래퍼 DLL 프로젝트 생성 1. 프로젝트 생성 [새로 만들기] → [C++] → CLR 클래스 라이브러리 (.NET Framework) 이름：PowerShellWrapper 💡 이 템플릿이 표시되지 않는 경우, \u0026ldquo;.NET 데스크톱 개발\u0026rdquo; 워크로드를 설치하세요.\n2. NuGet 패키지 추가 프로젝트 우클릭 → [NuGet 패키지 관리] System.Management.Automation 검색 및 설치\n(버전 5.x 또는 7.x) 3. CLI 측 코드 구현 PowerShellWrapper.h 1 2 3 4 5 6 7 8 9 10 #pragma once using namespace System; namespace PowerShellWrapper { public ref class PowerShellExecutor { public: String^ Execute(String^ script); }; } PowerShellWrapper.cpp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include \u0026#34;PowerShellWrapper.h\u0026#34; using namespace System; using namespace System::Management::Automation; using namespace System::Collections::ObjectModel; String^ PowerShellWrapper::PowerShellExecutor::Execute(String^ script) { PowerShell^ ps = PowerShell::Create(); ps-\u0026gt;AddScript(script); Collection\u0026lt;PSObject^\u0026gt;^ results = ps-\u0026gt;Invoke(); System::Text::StringBuilder^ sb = gcnew System::Text::StringBuilder(); for each (PSObject^ result in results) { sb-\u0026gt;AppendLine(result-\u0026gt;ToString()); } return sb-\u0026gt;ToString(); } 🔧 단계 2: 네이티브 C++ 측에서 호출 1. C++ 콘솔 앱 프로젝트 생성 이름：NativeApp 2. 참조 설정 프로젝트 우클릭 → [참조 추가] → [프로젝트] → PowerShellWrapper 추가 [구성 속성] → [C/C++] → [공용 언어 런타임 지원] → /clr 로 변경 3. 실행 코드 (main.cpp) 1 2 3 4 5 6 7 8 9 10 11 12 13 #using \u0026lt;System.dll\u0026gt; #using \u0026#34;..\\\\PowerShellWrapper\\\\Debug\\\\PowerShellWrapper.dll\u0026#34; using namespace System; using namespace PowerShellWrapper; int main() { PowerShellExecutor^ executor = gcnew PowerShellExecutor(); String^ result = executor-\u0026gt;Execute(\u0026#34;Get-Process | Select-Object -First 1\u0026#34;); Console::WriteLine(result); return 0; } 💡 보충 (IDL / TLB / COM 등록) 이 구성은 COM이 아닌 .NET DLL을 직접 참조하는 방식이므로, IDL이나 TLB, COM 등록이 필요하지 않습니다. ✅ 최종 구성 1 2 3 4 5 Solution ├── PowerShellWrapper (C++/CLI DLL) │ └── PowerShellExecutor ├── NativeApp (C++ EXE) └── main.cpp → DLL 호출 ","date":"2025-04-16T01:58:03+09:00","image":"http://kenji.blog/p/c-%E3%81%8B%E3%82%89-powershell-%E3%82%92-c-cli-dll-%E7%B5%8C%E7%94%B1%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86/img_hu7575b218a6ea53bc902a4f89abde2058_17844_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/c-%E3%81%8B%E3%82%89-powershell-%E3%82%92-c-cli-dll-%E7%B5%8C%E7%94%B1%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86/","title":"'C++에서 PowerShell을 C++/CLI DLL을 통해 실행하는 방법'"},{"content":"[Windows] 라이선스 상태를 확인하는 방법 (명령어 하나로 OK) Windows 라이선스가 정상적으로 인증되어 있는지 궁금했던 적이 있으신가요?\n그럴 때 유용한 것이 명령어 한 번으로 라이선스 정보를 확인할 수 있는 방법 입니다. 다음 단계를 실행하는 것만으로 현재 라이선스 상태를 쉽게 체크할 수 있습니다.\n라이선스 상태를 확인하는 명령어 Windows에 기본 탑재된 스크립트 도구를 사용하여 라이선스 정보를 표시할 수 있습니다. 사용하는 명령어는 다음과 같습니다:\n1 slmgr /dli 이 명령어를 실행하면 라이선스의 일부 정보가 창으로 표시됩니다.\n실행 방법 \u0026ldquo;시작 메뉴\u0026quot;에서 \u0026ldquo;cmd\u0026quot;를 입력하고, 명령 프롬프트를 우클릭 → \u0026ldquo;관리자 권한으로 실행\u0026rdquo; 합니다.\n명령 프롬프트에 다음을 입력하고 Enter 키를 누릅니다:\n1 slmgr /dli 몇 초 기다리면 다음과 같은 라이선스 정보가 표시됩니다.\n표시되는 주요 정보 제품 키의 일부 라이선스 종류 (리테일, OEM 등) 라이선스 상태 (유효, 만료, 미인증 등) 더 자세한 정보를 알고 싶다면? 다음과 같은 명령어도 있습니다:\nslmgr /dlv : 더 자세한 라이선스 정보를 표시 slmgr /xpr : 라이선스 만료일(영구 여부 등)을 표시 요약 Windows 라이선스 상태는 명령어 하나로 쉽게 확인할 수 있습니다.\n간단 확인 : slmgr /dli 자세한 확인 : slmgr /dlv 만료일 확인 : slmgr /xpr 라이선스에 문제가 있으면 업데이트나 일부 기능에 제한이 생길 수도 있으므로, 정기적으로 확인해 두면 안심할 수 있습니다.\n","date":"2025-04-14T00:41:45+09:00","image":"http://kenji.blog/p/windows-%E3%81%AE%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9%E3%81%AE%E7%8A%B6%E6%85%8B%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/img_1_hudcf97514836ad006a409bb9b34fbe340_111425_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/windows-%E3%81%AE%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9%E3%81%AE%E7%8A%B6%E6%85%8B%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/","title":"'Windows 라이선스 상태를 확인하는 명령어'"},{"content":"iOS에 최적화된 ffmpeg 변환 파라미터 iOS 기기(iPhone이나 iPad)에서 원활하게 재생할 수 있도록 동영상을 변환하기 위한 ffmpeg 명령어를 소개합니다.\n1 2 3 4 5 6 ffmpeg -i input.mp4 \\ -c:v libx264 -profile:v high -level 4.1 \\ -vf \u0026#34;scale=1920:-2\u0026#34; -r 30 \\ -crf 20 -preset slow \\ -c:a aac -b:a 128k -ar 48000 \\ -movflags +faststart output.mp4 각 옵션의 의미 (간단한 해설) 옵션 설명 -i input.mp4 입력 파일 (변환할 원본 동영상) -c:v libx264 H.264로 영상을 인코딩 (iOS 지원) -profile:v high -level 4.1 iOS에서 널리 호환되는 프로파일과 레벨 -vf \u0026quot;scale=1920:-2\u0026quot; 폭 1920px로 리사이즈, 높이는 종횡비 유지하여 자동 조정 -r 30 프레임 레이트를 30fps로 변환 -crf 20 영상 품질 (수치가 낮을수록 고화질, 권장 18～23) -preset slow 인코딩 속도와 압축률의 균형 (slow는 고압축·고화질) -c:a aac 오디오를 AAC 형식으로 인코딩 -b:a 128k 오디오 비트레이트를 128kbps로 설정 -ar 48000 오디오 샘플링 레이트를 48kHz로 설정 (iOS 권장) -movflags +faststart 동영상 시작 부분에 인덱스를 배치하여, Web이나 iOS에서의 스트리밍 재생을 고속화 이 설정으로 변환된 동영상은 iPhone이나 iPad 등 Apple 기기에서 높은 호환성과 원활한 재생을 기대할 수 있습니다.\n필요에 따라 해상도나 비트레이트를 변경하여 파일 크기나 화질을 조정할 수 있습니다. 고화질이 필요한 경우에는 -crf를 18 전후로, 파일 크기를 줄이고 싶은 경우에는 22～25로 설정해 보세요.\n","date":"2025-03-02T04:16:07+09:00","image":"http://kenji.blog/p/ios-%E5%90%91%E3%81%91%E3%81%AE-ffmpeg-%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF/img_hu6ca6c354dba8425c4a9e54b9842ad89b_30790_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/ios-%E5%90%91%E3%81%91%E3%81%AE-ffmpeg-%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF/","title":"'iOS용 ffmpeg 파라미터'"},{"content":"Android (Google Pixel) 단말기 복원 절차 Google Pixel 단말기가 \u0026lsquo;재부팅을 반복하는(무한 부팅)\u0026rsquo; 경우, \u0026lsquo;로고 화면에서 넘어가지 않는\u0026rsquo; 경우, 또는 \u0026lsquo;동작이 극도로 불안정해진\u0026rsquo; 경우 등 심각한 시스템 문제에 직면했을 때, Google이 제공하는 공식 \u0026lsquo;Pixel Update and Software Repair\u0026rsquo; 도구를 사용하면 브라우저를 통해 안전하게 단말기의 소프트웨어를 복구(복원)할 수 있습니다.\n본 기사에서는 그 구체적인 절차와 주의사항에 대해 자세히 설명합니다.\n1. 복원 도구에 접속하기 먼저 PC(Windows 또는 Mac)의 브라우저(Google Chrome 또는 Microsoft Edge 권장)에서 다음 공식 복구 도구 페이지에 접속합니다.\n🔗 Pixel Update and Software Repair 공식 사이트\n※주의사항※ 복원 처리를 실행하면 단말기 내의 데이터(사진, 앱, 연락처 등)가 모두 삭제(초기화) 될 수 있습니다. 조작이 가능한 상태라면 사전에 반드시 Google 드라이브 등에 백업을 진행해 주세요.\n2. 복원을 위한 사전 준비 원활한 작업을 위해 다음을 준비해 둡니다.\n배터리 충전 도중에 전원이 꺼지면 단말기가 벽돌이 될(완전히 고장 날) 우려가 있습니다. 최소 50% 이상, 가급적이면 충분히 충전해 두세요. 정품 USB 케이블 준비 데이터 전송이 안정적으로 이루어질 수 있도록 단말기에 동봉된 정품 USB-C 케이블을 사용하는 것을 강력히 권장합니다. (필요에 따라) 드라이버 설치 Windows PC를 사용할 경우 디바이스가 제대로 인식되지 않을 수 있습니다. 그런 경우에는 Google USB 드라이버를 설치해 주세요. 3. 구체적인 복원 단계 준비가 완료되면 화면의 지시에 따라 복원을 진행합니다.\nStep 1: 통신사 선택 및 단말기 연결 사이트를 열면 가장 먼저 통신사(이동통신사)를 선택하는 화면이 표시됩니다. 자급제(SIM 프리) 버전이거나 통신사 제한이 없는 경우에는 \u0026lsquo;기타(Other)\u0026rsquo; 등을 선택합니다. 그 후 PC와 Pixel 단말기를 USB 케이블로 연결합니다.\nStep 2: 단말기를 \u0026lsquo;Rescue Mode(Fastboot 모드)\u0026lsquo;로 전환하기 화면의 지시에 따라 단말기의 전원을 끈 상태에서 \u0026lsquo;전원 버튼\u0026rsquo;과 \u0026lsquo;볼륨 작게 버튼\u0026rsquo;을 동시에 길게 눌러, Fastboot 모드(검은 배경에 안드로이드 로봇이 쓰러져 있는 듯한 화면)를 실행합니다.\nStep 3: PC 측에서 디바이스 인식시키기 브라우저에서 \u0026lsquo;디바이스 연결\u0026rsquo; 버튼을 클릭하면 브라우저 팝업이 열리고, 연결된 Pixel 단말기가 목록에 표시됩니다. 대상 단말기를 선택하여 연결을 허용합니다.\nStep 4: 소프트웨어 다운로드 및 설치 단말기가 인식되면 자동으로 최적의 버전인 Android OS(펌웨어)가 선정됩니다. \u0026lsquo;설치\u0026rsquo;를 클릭하면 PC 측에 소프트웨어가 다운로드되고, 이어서 바로 단말기에 쓰기(플래싱)가 시작됩니다.\n⚠️ 경고: 이 과정 중에는 ** 절대로 USB 케이블을 뽑거나 PC의 전원을 끄지 마세요.**\nStep 5: 완료 및 초기 설정 진행률 표시줄이 100%가 되고 \u0026lsquo;완료\u0026rsquo; 메시지가 표시되면 복원 성공입니다. 단말기가 자동으로 재부팅되며, 구입 시와 동일한 초기 설정 화면(\u0026lsquo;안녕하세요\u0026rsquo; 화면)이 표시됩니다.\n요약 Google Pixel의 공식 복구 도구는 특별한 명령어(adb나 fastboot)를 직접 입력하지 않아도, 브라우저 상의 클릭 조작만으로 안전하게 펌웨어를 다시 설치할 수 있는 매우 훌륭한 도구입니다.\n단말기 이상으로 매장에 방문하기 전에, 이 절차를 한 번 시도해 봄으로써 의외로 쉽게 문제가 해결될 수도 있습니다. 꼭 참고해 보세요.\n","date":"2025-02-28T01:20:41+09:00","image":"http://kenji.blog/p/androidgoogle-pixel%E7%AB%AF%E6%9C%AB%E3%81%AE%E5%BE%A9%E5%85%83%E6%89%8B%E9%A0%86/pixel_restore_eyecatch_1788588727945_hu9d405d830ed3e56e9e703ab601cf6c0a_776052_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/ko/p/androidgoogle-pixel%E7%AB%AF%E6%9C%AB%E3%81%AE%E5%BE%A9%E5%85%83%E6%89%8B%E9%A0%86/","title":"'Android (Google Pixel) 단말기 소프트웨어 복원(초기화·복구) 절차'"},{"content":"curl로 Gmail 보내기 1. 앱 비밀번호 얻기 https://myaccount.google.com/apppasswords 위의 링크를 클릭하여 앱 이름을 입력합니다. 생성된 비밀번호를 저장합니다.\n2. curl 명령어로 메일 보내기 아래의 명령어를 실행합니다.\n다음 예제에서는 mail.txt에 메일 내용을 작성합니다.\n1 2 3 4 5 6 From: from@gmail.com To: to@gmail.com Subject: 테스트 메일 Content-Type: text/plain; charset=\u0026#34;UTF-8\u0026#34; 테스트 메일입니다. 위의 파일을 작성하고, 아래의 명령어를 실행합니다.\n1 curl --url \u0026#34;smtps://smtp.gmail.com:465\u0026#34; --ssl-reqd --mail-from \u0026#34;from@gmail.com\u0026#34; --mail-rcpt \u0026#34;to@gmail.com\u0026#34; --user \u0026#34;from@gmail.com:xxxxxxxxxxxxxxxx\u0026#34; --upload-file mail.txt ※ xxxxxxxxxxxxxxxx는 앱 비밀번호로 바꿔주세요.\n","date":"2025-02-27T02:13:31+09:00","image":"http://kenji.blog/p/gmail%E3%82%92curl%E3%81%8B%E3%82%89%E9%80%81%E3%82%8B/img_hua1028a8ea194106f3853f4bdf4e1e991_75790_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/gmail%E3%82%92curl%E3%81%8B%E3%82%89%E9%80%81%E3%82%8B/","title":"'curl로 Gmail 보내기'"},{"content":"표준 라이브러리를 사용한 샘플 코드 소개입니다.\n이미지 다운로드 및 표시하기 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import urllib.request import tempfile import os import webbrowser import time url = \u0026#34;https://www.aomori-ringo.or.jp/kids/wp-content/uploads/2021/11/apple.png\u0026#34; try: with urllib.request.urlopen(url) as response: img_data = response.read() # 임시 파일에 저장하여 표시 with tempfile.NamedTemporaryFile(delete=False, suffix=\u0026#34;.png\u0026#34;) as tmp: tmp.write(img_data) print(f\u0026#34;file://{tmp.name}\u0026#34;) webbrowser.open(f\u0026#34;file://{tmp.name}\u0026#34;) time.sleep(3) except Exception as e: print(f\u0026#34;에러가 발생했습니다: {e}\u0026#34;) finally: if \u0026#39;tmp\u0026#39; in locals(): os.unlink(tmp.name) # 임시 파일 삭제 ","date":"2025-02-24T18:21:14+09:00","image":"http://kenji.blog/p/python%E3%82%B3%E3%83%BC%E3%83%89%E7%89%87/img_hu6807d8c9816a78d77990562cff91e319_70806_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/python%E3%82%B3%E3%83%BC%E3%83%89%E7%89%87/","title":"'Python 코드 조각'"},{"content":"ChatGPT API를 curl로 호출하기 Windows 명령 프롬프트에서 호출하는 것을 전제로 합니다.\n1 2 curl https://api.openai.com/v1/chat/completions -H \u0026#34;Content-Type: application/json\u0026#34; -H \u0026#34;Authorization: Bearer sk-proj-XXXXXXXXXXXXXXXXXXXX\u0026#34; -d \u0026#34;{\u0026#34;\u0026#34;model\u0026#34;\u0026#34;: \u0026#34;\u0026#34;gpt-3.5-turbo\u0026#34;\u0026#34;,\u0026#34;\u0026#34;messages\u0026#34;\u0026#34;: [{\u0026#34;\u0026#34;role\u0026#34;\u0026#34;: \u0026#34;\u0026#34;system\u0026#34;\u0026#34;, \u0026#34;\u0026#34;content\u0026#34;\u0026#34;: \u0026#34;\u0026#34;간사이 사투리로 대답해 주세요.\u0026#34;\u0026#34;}, {\u0026#34;\u0026#34;role\u0026#34;\u0026#34;: \u0026#34;\u0026#34;user\u0026#34;\u0026#34;, \u0026#34;\u0026#34;content\u0026#34;\u0026#34;: \u0026#34;\u0026#34;여기에 보낼 메시지를 입력하세요\u0026#34;\u0026#34;}]}\u0026#34; ","date":"2025-02-01T17:15:34+09:00","image":"http://kenji.blog/p/chatgpt-api%E3%82%92curl%E3%81%8B%E3%82%89%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99/img_huc9cfad0a382aa812189dd7635d7709f2_1078030_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/chatgpt-api%E3%82%92curl%E3%81%8B%E3%82%89%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99/","title":"'ChatGPT API를 curl로 호출하기'"},{"content":"고배당주 요약 미쓰비시UFJ파이낸셜그룹 (8306) 미쓰이스미토모파이낸셜그룹 (8316) 미쓰비시상사 (8058) 이토추상사 (8001) NTT (9432) KDDI (9433) 오키나와 셀룰러 전화 (9436) 도쿄해상홀딩스 (8766) 토요타자동차 (7203) 야마하발동기 (7272) 아사히그룹홀딩스 (2502) 기린홀딩스 (2503) JT (2914) 브리지스톤 (5108) 다이와하우스공업 (1925) 세키스이하우스 (1928) 교세라 (6971) 신에츠화학공업 (4063) 닛토덴코 (6988) 오릭스 (8591) 미쓰비시HC캐피탈 (8593) 휴릭 (3003) ","date":"2024-12-22T00:56:14+09:00","image":"http://kenji.blog/p/%E9%AB%98%E9%85%8D%E5%BD%93%E6%A0%AA%E3%81%BE%E3%81%A8%E3%82%81/img_huf2943e4fc5463d0d6e36ddd1be1ac839_1663544_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E9%AB%98%E9%85%8D%E5%BD%93%E6%A0%AA%E3%81%BE%E3%81%A8%E3%82%81/","title":"'고배당주 요약'"},{"content":"장기적인 목표 1년 후 사업을 시작한다 HP(홈페이지)를 제작하여, 소프트웨어(무료)를 출시한다 2년 후 연 매출 1000만 엔 서적을 출판한다 소프트웨어(유료)를 출시한다 3년 후 연 매출 1억 엔 5년 후 연 매출 10억 엔 10년 후 연 매출 100억 엔 단기적인 목표 1개월 후 사업 계획서를 작성한다 3개월 후 사업을 시작하기 위한 자금을 조달한다 500만 엔 정도 6개월 후 사업을 시작한다 1년 후 사업을 궤도에 올린다 당장의 과제 목표와 비전의 명확화\n목적: 왜 소프트웨어를 개발하는가? 예: 문제를 해결한다, 새로운 가치를 제공한다, 특정 틈새시장을 노린다 등. 비전: 소프트웨어를 통해 어떤 미래를 실현하고 싶은가? 예: 업무 효율화, 일상생활의 편리함, 교육의 질 향상 등. 시장 조사와 니즈 분석\n타깃 사용자: 소프트웨어를 사용하는 사람은 누구인가? 연령대, 직업, 관심사 등을 구체적으로 설정. 경쟁사 조사: 같은 분야에 경쟁사가 있는가? 어떤 강점·약점이 있는지 분석. 니즈 특정: 타깃 사용자의 미해결 과제나 요구를 파악. 소프트웨어 설계와 특징\n기본 기능: 필수 기능을 리스트업. 예: 사용자 인증, 데이터 저장, 분석 기능 등. 차별화 포인트: 타사 제품과 비교하여, 유니크한 점을 명확히 한다. 예: 심플한 UI, AI 활용, 고도의 커스터마이즈성. 기술 사양: 사용할 프로그래밍 언어, 프레임워크, 데이터베이스 등. 개발 계획과 리소스 배분\n개발 일정: 프로젝트의 단계별 타임라인을 설정. 예: 프로토타입 개발, 테스트, 정식 출시. 팀 구성: 필요한 인재와 스킬셋(프로그래머, 디자이너, 마케팅 담당 등). 예산: 개발 비용, 마케팅 비용, 운영 비용을 추산. 마케팅과 수익 모델\n프로모션 방법: SNS, 웹사이트, 광고 등을 활용하여 인지도를 향상. 수익화 전략: 무료판＋유료판, 월간 구독, 광고 수입 등의 선택지를 검토. 사용자 획득 전략: 무료 트라이얼 제공, 입소문 촉진, 사용자 커뮤니티 형성 등. 운영과 스케일링\n출시 후 운영: 사용자로부터의 피드백 수집, 버그 수정, 기능 추가. 성장 전략: 사용자 수를 늘리는 방법, 해외 진출이나 신기능 개발을 계획. 리스크 관리: 법적 문제나 기술적 트러블에 대한 대응책을 준비. ","date":"2024-12-08T03:32:34+09:00","image":"http://kenji.blog/p/%E7%9B%AE%E6%A8%99/img_huc6a3627da74a1082cbdd433fea41830c_4007614_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E7%9B%AE%E6%A8%99/","title":"'목표'"},{"content":"최근 가죽 제품에 관심을 가지게 되어, 다양한 아이템을 구매하고 있습니다. 그러던 중 가죽 제품의 유지 관리에도 관심이 생겨, 관련 아이템을 몇 가지 갖추었기에 소개해 드립니다.\n최근 구매한 가죽 제품 유지 관리 제품 M.MOWBRAY DELICATE CREAM 가격: 1,320엔 정도\n이 크림은 영양 공급, 보습, 유연 효과가 있습니다. 광택은 나지 않지만, 수분이 많아 보습이 필요한 가죽에 적합합니다. 불쾌한 냄새는 아니지만, 냄새가 조금 있습니다. 무색이라 범용성이 높다고 생각합니다. 보송보송한 크림이라서 다른 크림에 비해 다소 넉넉하게 사용하는 것이 좋을지도 모릅니다.\n콜로닐 1909 슈프림 크림 디럭스 가격: 1,777엔 정도\n유명하고 표준적이며 만능인 크림으로, 얼룩이 잘 생기지 않습니다. 가죽의 색을 보수하고 촉촉하게 해주는 크림입니다. 약간의 광택이 납니다. 백색으로 발수 효과도 기대할 수 있는 것 같습니다.\nM.MOWBRAY SHOE CREAM (블랙) 가격: 1,000엔 정도\n구두용 크림. 왁스, 유분, 유기 용제가 포함되어 있습니다. 가죽의 색을 보수하고 광택이 납니다. 검은색이라 검은 가죽에 적용합니다. 저는 정장 구두에 사용하고 있습니다.\nM.MOWBRAY STAIN REMOVER 가격: 700엔 정도\n브러시를 샀을 때 딸려 온 것입니다. 구두용 수성 클리너. 가죽의 오염을 제거합니다. 천에 듬뿍 묻혀서, 가죽에 부드럽게 문지르면 오염이 지워집니다.\n","date":"2024-10-30T00:31:46+09:00","image":"http://kenji.blog/p/%E9%9D%A9%E8%A3%BD%E5%93%81%E3%81%AE%E3%83%A1%E3%83%B3%E3%83%86%E3%83%8A%E3%83%B3%E3%82%B9/img_hu3ddba03af9cef883a82321d0a762e708_211817_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E9%9D%A9%E8%A3%BD%E5%93%81%E3%81%AE%E3%83%A1%E3%83%B3%E3%83%86%E3%83%8A%E3%83%B3%E3%82%B9/","title":"'가죽 제품 유지 관리'"},{"content":"안녕하세요! 오늘은 \u0026lsquo;한론의 면도날\u0026rsquo;에 대한 이야기입니다. 오늘은 \u0026lsquo;한론의 면도날\u0026rsquo;이라는, 조금 특이한 이름의 사고방식에 대해 써보려고 합니다. 이름만 들으면 \u0026lsquo;뭔가 무서운데…?\u0026lsquo;라고 생각할지도 모르지만, 사실은 매우 친숙하고 다정한 관점을 제시해 주는 아이디어입니다.\n\u0026lsquo;저 사람, 나를 싫어할지도 몰라…\u0026lsquo;라고 생각한 적 없나요? 예를 들어, 이런 경험 없으신가요?\n・라인(LINE) 답장이 늦다 ・눈이 마주쳤는데 인사하지 않았다 ・부탁한 일을 무시당했다\n그럴 때 \u0026lsquo;혹시 미움받고 있나?\u0026lsquo;라며 불안해지죠. 저도 자주 그럽니다. 그래서 혼자 우울해지곤 하죠.\n한론의 면도날이란 뭘까? 거기서 등장하는 것이 \u0026lsquo;한론의 면도날\u0026rsquo;입니다.\n이 말은 원래 영어의 \u0026ldquo;Hanlon\u0026rsquo;s Razor\u0026quot;에서 왔습니다. 의미는 대략 이렇습니다.\n\u0026ldquo;악의로 설명할 수 있는 많은 것들은, 단순한 어리석음으로 설명할 수 있다\u0026rdquo;\n…조금 말이 세죠. 조금 더 부드럽게 말하면,\n\u0026ldquo;상대방이 심술궂게 구는 것처럼 보여도, 그저 깜빡했거나 부주의한 것일 뿐일 수도 있다\u0026rdquo;\n라는 사고방식입니다.\n누가 처음 말했을까? 로버트 J. 한론이란? 이 말은 1980년에 출판된 \u0026lsquo;Murphy’s Law Book Two\u0026rsquo;라는 책에 처음 등장한 것으로 알려져 있습니다.\n저자 중 한 명인 로버트 J. 한론 씨가 기고한 아이디어가 그대로 사용되어 \u0026lsquo;한론의 면도날\u0026rsquo;이라는 이름이 붙었습니다.\n참고로 여기서 \u0026lsquo;면도날(Razor)\u0026lsquo;이라는 것은 \u0026lsquo;불필요한 것을 잘라내고 단순하게 생각하자\u0026rsquo;는 철학적 도구 같은 의미로, 오컴의 면도날 등과 함께 사고를 정리할 때 쓰이는 표현입니다.\n\u0026lsquo;악의가 있었다\u0026rsquo;고 생각하면 힘들어집니다 예를 들어, 직장에서 메일을 무시당했을 때.\n\u0026lsquo;왜 답장을 안 주지? 미움받고 있나?\u0026lsquo;라고 생각하면 점점 부정적이게 되죠.\n하지만 잘 생각해 보면, ・우연히 못 봤다 ・답장을 썼는데 안 보냈다 ・스마트폰 알림이 묻혔다\n이런 이유들이 의외로 많습니다. 그리고 우리 자신도 종종 저지르는 실수이기도 하죠.\n내 실수에는 관대하면서, 남에게는 엄격해지는 신기함 예를 들어, 친구의 라인(LINE)에 답장하는 것을 깜빡했을 때.\n\u0026lsquo;아, 미안! 알림을 못 봤어～\u0026lsquo;라며 악의 제로인 상태로 답장하곤 하죠.\n하지만 상대방이 똑같은 행동을 했을 때는 \u0026lsquo;무시당했다\u0026rsquo;고 생각하게 됩니다.\n이건 아주 흔한 일입니다. 사람은 자신의 사정은 아주 잘 이해하지만, 타인의 사정은 잘 보이지 않기 때문이죠.\n\u0026lsquo;악의가 있다\u0026rsquo;고 단정 짓는 것은 사실 손해 상대방이 어떤 행동을 했을 때 \u0026lsquo;악의가 있다\u0026rsquo;고 단정 지으면 마음속으로 그 사람을 적으로 만들게 됩니다.\n하지만 사실은 그저 서툴렀을 뿐이거나, 다른 일로 정신이 없었을 수도 있습니다.\n물론 정말로 무례한 사람도 있고, 기분 나쁜 태도를 겪으면 상처받는 게 당연합니다.\n하지만 \u0026lsquo;분명 악의일 거야\u0026rsquo;라고 단정 짓지 않는 편이 내 마음이 조금 더 편해집니다.\n그렇다고 무조건 참자는 이야기는 아닙니다 여기서 오해하지 않으셨으면 하는 것은 \u0026lsquo;전부 네가 너무 예민한 거야\u0026rsquo;라고 말하려는 게 아닙니다.\n기분 나쁜 일을 겪었을 때 \u0026lsquo;그건 좀 심했지\u0026rsquo;라고 생각해도 괜찮습니다.\n다만, \u0026lsquo;저 사람은 성격이 나빠\u0026rsquo;라거나 \u0026lsquo;일부러 상처 주려고 했어\u0026rsquo;라고 단정 짓기보다는,\n\u0026lsquo;어쩌면 사정이 있었을지도 모르지\u0026rsquo; 정도의 여유를 가져보는 건 어떨까 하는 제안입니다.\n결론: 조금만 더 다정하게 보면 세상이 바뀔지도 모릅니다 한론의 면도날은 \u0026lsquo;사람들에게 다정하게 대하자\u0026rsquo;라기보다는 \u0026lsquo;내 마음을 지키는 방법\u0026rsquo;이라고 생각합니다.\n사람의 행동에서 악의를 느끼면 내 마음도 각박해지니까요.\n하지만 \u0026lsquo;아마 그냥 실수이거나, 여유가 없었던 것뿐일지도 몰라\u0026rsquo;라고 생각할 수 있다면 내 마음이 조금 편안해집니다.\n그렇게 자신을 위해 사용할 수 있는 사고방식입니다.\n마지막으로: 여러분의 경험도 꼭 들려주세요 읽어주셔서 감사합니다.\n혹시 \u0026lsquo;이럴 때 마음이 복잡했던 적이 있어～\u0026rsquo; 하는 에피소드가 있다면 꼭 들려주세요.\n자신의 경험을 말로 표현하는 것만으로도 마음이 조금 후련해지기도 하니까요.\n그럼, 또 만나요!\n","date":"2024-09-24T18:14:34+09:00","image":"http://kenji.blog/p/%E3%83%8F%E3%83%B3%E3%83%AD%E3%83%B3%E3%81%AE%E5%89%83%E5%88%80/img_hu0c32762ee7cb281fb24d789425dae55e_82924_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%83%8F%E3%83%B3%E3%83%AD%E3%83%B3%E3%81%AE%E5%89%83%E5%88%80/","title":"'한론의 면도날'"},{"content":"컴퓨터의 기본 지식 이 페이지에서는 컴퓨터란 무엇인지에 대해 설명합니다.\n컴퓨터의 정의 컴퓨터란, 다음 5가지 장치를 가진 기계입니다.\n입력 장치 출력 장치 기억 장치 제어 장치 연산 장치 간단히 말해서, 어떤 입력에 대해 특정 처리를 수행하고 그 결과를 출력하는 기계가 컴퓨터입니다. 입력된 데이터를 기억하고, 연산하며, 출력할 수 있습니다. 제어는 앞서 언급한 4가지 장치를 제어하는 역할을 가집니다.\n컴퓨터를 작동시키기 위해 필요한 것 컴퓨터를 작동시키기 위해서는 장치(하드웨어) 외에도 프로그램(소프트웨어)이 필요합니다.\n프로그램에서는 컴퓨터에게 어떤 처리를 할지 지시합니다. 프로그램은 컴퓨터가 이해할 수 있는 형식으로 작성됩니다.\n프로그램의 예로는 다음과 같은 것이 있습니다. 1부터 입력된 정수까지의 합을 구하는 프로그램\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #include \u0026lt;iostream\u0026gt; using namespace std; int main() { // 필요한 기억 영역 확보 int n, sum = 0; // 출력 cout \u0026lt;\u0026lt; \u0026#34;정수를 입력해 주세요: \u0026#34;; // 입력 cin \u0026gt;\u0026gt; n; // 연산 for (int i = 1; i \u0026lt;= n; i++) { // 연산 sum += i; } // 출력 cout \u0026lt;\u0026lt; \u0026#34;1부터 \u0026#34; \u0026lt;\u0026lt; n \u0026lt;\u0026lt; \u0026#34;까지의 합은 \u0026#34; \u0026lt;\u0026lt; sum \u0026lt;\u0026lt; \u0026#34;입니다.\u0026#34; \u0026lt;\u0026lt; endl; // 종료 return 0; } 프로그램은 컴파일러에 의해 기계어로 변환되어, 컴퓨터가 실행할 수 있는 형식으로 변환됩니다.\n","date":"2024-09-19T01:10:20+09:00","image":"http://kenji.blog/p/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AE%E5%9F%BA%E6%9C%AC%E7%9F%A5%E8%AD%98/img_hubc9c51905d797e9d57f0ff169cf73b36_367819_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AE%E5%9F%BA%E6%9C%AC%E7%9F%A5%E8%AD%98/","title":"'컴퓨터의 기본 지식'"},{"content":"추천 iOS 앱 X Instagram facebook youtube TikTok Microsoft Edge Firefox Google Chrome ChatGPT LINE Microsoft Teams Notion Goodnotes 6 TeamViewer DropBox GitHub Amazon PayPay WolframAlpha 메루카리 ","date":"2024-09-18T23:31:20+09:00","image":"http://kenji.blog/p/%E3%81%8A%E3%81%99%E3%81%99%E3%82%81ios%E3%82%A2%E3%83%97%E3%83%AA/img_huad2df38b51218b64bee99f031553dd91_79847_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%81%8A%E3%81%99%E3%81%99%E3%82%81ios%E3%82%A2%E3%83%97%E3%83%AA/","title":"'추천 iOS 앱'"},{"content":"노부부와 당나귀, 그리고 우리의 \u0026ldquo;누구의 말을 들을 것인가\u0026rdquo; 문제 안녕하세요!\n오늘은 \u0026ldquo;노부부와 당나귀 이야기\u0026quot;에서 조금 생각해볼 만한 점이 있어서, 그 이야기를 써보려고 합니다.\n아마 들어본 적 있는 분들도 많을 겁니다. 그 유명한 우화죠.\n\u0026ldquo;노부부와 당나귀 이야기\u0026quot;란? 옛날 옛적 어느 곳에 노부부와 당나귀 한 마리가 있었습니다.\n처음에는 할아버지가 당나귀를 타고 있었고, 할머니는 걷고 있었습니다. 그러자 지나가던 사람이 말했습니다.\n\u0026ldquo;저런 몹쓸 남자를 봤나, 나이 든 아내를 걷게 하고 혼자만 타고 가다니!\u0026rdquo;\n그 말을 들은 노부부는 이번에는 할머니가 당나귀를 타기로 했습니다. 그러자 또 다른 사람이 말했습니다.\n\u0026ldquo;여자가 당나귀를 타고 남자를 걷게 하다니, 괘씸하군!\u0026rdquo;\n그렇다면, 하고 이번에는 두 사람 모두 당나귀에 탔습니다. 그러자 또 한 소리 듣습니다.\n\u0026ldquo;불쌍한 당나귀, 두 사람이나 태우니 너무 무겁겠네!\u0026rdquo;\n그렇다면, 하고 두 사람 모두 당나귀에서 내려서 걷기 시작했습니다. 그러자 이번에는……\n\u0026ldquo;당나귀가 있는데 왜 아무도 안 타는 거지?\u0026rdquo;\n결국, 노부부는 어찌할 바를 몰라 망연자실하고 말았습니다.\n\u0026ldquo;모두의 의견을 듣자\u0026quot;는 확실히 옳은 말입니다. 하지만…… 이 이야기는 왠지 \u0026ldquo;아, 남의 시선만 신경 쓰면 끝이 없지\u0026quot;라는 교훈처럼 받아들여지기 쉽습니다.\n하지만 현실이란 그렇게 단순하지 않죠.\n\u0026ldquo;남의 시선 따위는 신경 쓰지 마!\u0026ldquo;라고 말하는 사람, 종종 있습니다.\n하지만, 전부 무시할 수 있느냐 하면 조금 어렵습니다. 예를 들어 SNS에 무언가를 올릴 때. 회사 회식 자리에서 무슨 말을 할지 고민할 때. 누군가의 반응이 아무래도 신경 쓰입니다.\n왜냐하면 \u0026ldquo;남의 의견\u0026quot;이란 때로는 우리의 안전이나 평가와 직결되기 때문입니다.\n그렇다고는 해도, 너무 휘둘리면 괴로워집니다 이 이야기 속의 노부부, 아마 처음에는 그저 \u0026ldquo;어떻게 하는 게 좋을까?\u0026rdquo; 하고 생각했을 뿐일 겁니다.\n하지만 어디까지 가든 \u0026ldquo;누군가\u0026quot;는 불평을 합니다.\n그리고 \u0026ldquo;그럼 다음에는 이렇게 하자\u0026rdquo; \u0026ldquo;역시 이렇게 할까?\u0026rdquo; 하고 빙빙 돌기 시작하다가, 어느새 자신이 하고 싶은 것도 잃어버리게 됩니다.\n이거, 우리 일상에서도 흔히 있는 이야기입니다.\n상사의 기대, 부모님의 말씀, SNS의 \u0026ldquo;좋아요\u0026rdquo; 수. 그것들에 맞추다 보면 자신이 정말 어떻게 하고 싶은 건지 모르게 될 때가 있지 않나요?\n\u0026ldquo;누구의 말을 들을 것인가\u0026quot;를 선택하는 것이 중요합니다 그럼 어떻게 해야 해? 라는 이야기입니다만, 정답이 있는 것은 아닙니다.\n다만, \u0026ldquo;모든 사람의 의견을 따르는 것\u0026quot;은 현실적으로 불가능합니다.\n그렇기 때문에 \u0026ldquo;누구의 말을 들을 것인가\u0026quot;를 스스로 선택하는 것이 중요하다고 생각합니다.\n예를 들어, \u0026ldquo;내가 존경하는 사람의 조언만 듣는다\u0026quot;든가, \u0026ldquo;과거의 내가 납득할 수 있는지를 기준으로 삼는다\u0026quot;든가 하는 식으로요.\n단 하나라도 \u0026ldquo;이것만은 믿고 싶다\u0026quot;고 생각할 수 있는 기준을 가지면, 세상의 노이즈가 조금은 줄어들게 됩니다.\n그러므로, 조금 지쳤을 때에는 \u0026ldquo;노부부와 당나귀\u0026rdquo; 이야기를 떠올려 보는 것도 좋을지도 모릅니다.\n남의 시선이란, 무심코 신경이 쓰이게 마련이죠.\n하지만, 모든 것에 부응하려다 보면 당나귀에서도 내리게 됩니다.\n가끔은 \u0026ldquo;내 마음을 우선해도 괜찮을지도\u0026rdquo; 하고, 그런 생각이 든다면. 아주 조금, 마음이 가벼워질지도 모릅니다.\n","date":"2024-09-18T00:56:59+09:00","image":"http://kenji.blog/p/%E8%80%81%E5%A4%AB%E5%A9%A6%E3%81%A8%E3%83%AD%E3%83%90%E3%81%AE%E8%A9%B1/img_hu4e12b653e0413f37819b2904ce683e39_500631_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E8%80%81%E5%A4%AB%E5%A9%A6%E3%81%A8%E3%83%AD%E3%83%90%E3%81%AE%E8%A9%B1/","title":"'노부부와 당나귀 이야기'"},{"content":"왜 청색 LED를 만드는 것이 거의 불가능했는가 영어 다큐멘터리 프로그램 소개. 매우 흥미롭다. 매우 어려운 문제를 해결한 일본인은, 처음에 일본 국내에서 별로 평가받지 못했다는 인상이 강하다.\n","date":"2024-09-15T00:43:52+09:00","image":"http://kenji.blog/p/%E3%81%AA%E3%81%9C%E9%9D%92%E8%89%B2led%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%BB%E3%81%BC%E4%B8%8D%E5%8F%AF%E8%83%BD%E3%81%A0%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B/img_hu003acf083dbe465265af012766f30af7_1201686_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%81%AA%E3%81%9C%E9%9D%92%E8%89%B2led%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%BB%E3%81%BC%E4%B8%8D%E5%8F%AF%E8%83%BD%E3%81%A0%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B/","title":"'왜 청색 LED를 만드는 것이 거의 불가능했는가'"},{"content":"VSCode에서 Qt 개발 시작하기: Qt Extension Pack 설치 방법 안녕하세요, Kenji입니다. 이번에는 \u0026ldquo;Visual Studio Code(이하 VSCode)에서 Qt 개발 환경을 구축하는 방법\u0026quot;에 대해 소개합니다.\n최근에는 공식 Qt Creator 외에도 가볍고 확장성이 뛰어난 VSCode를 사용하여 Qt 앱을 개발하고 싶다는 목소리도 많아졌습니다. 그런 분들에게 추천하는 것이 \u0026ldquo;Qt Extension Pack\u0026ldquo;입니다. 이 확장 팩을 설치하는 것만으로 Qt와 관련된 주요 확장 기능들이 한 번에 갖춰집니다.\n대상 독자 Qt를 사용한 GUI 앱 개발을 시작하고 싶은 분 Qt Creator가 아닌 VSCode에서 개발하고 싶은 분 확장 기능을 하나씩 찾는 것이 번거로운 분 전제 조건 VSCode가 설치되어 있을 것 (공식 사이트에서 무료로 다운로드할 수 있습니다) Qt 라이브러리 본체가 설치되어 있을 것(Qt 공식 사이트) Qt Extension Pack이란? Qt Extension Pack은 VSCode용 확장 기능 팩입니다. 설치하면 다음과 같은 기능이 자동으로 추가됩니다:\n.ui 파일(Qt Designer) 지원 .pro 파일 및 .qrc 파일 구문 강조 Qt용 C++ 코드 완성, 빌드, 디버깅 지원 Qt Resource Browser(리소스 참조) 설치 순서 1. VSCode 열기 먼저 VSCode를 실행합니다.\n2. 확장 기능 뷰 열기 왼쪽의 액티비티 바(사각형 블록 아이콘)를 클릭하여 \u0026ldquo;확장 기능\u0026quot;을 표시합니다.\n또는 단축키로 Ctrl + Shift + X를 눌러도 됩니다.\n3. \u0026ldquo;Qt Extension Pack\u0026rdquo; 검색 검색 창에 다음 키워드를 입력합니다:\n1 Qt Extension Pack 4. 설치 버튼 클릭 대상 팩이 표시되면 \u0026ldquo;설치\u0026rdquo; 버튼을 클릭합니다. 이것으로 다음과 같은 여러 확장 기능이 한 번에 설치됩니다:\nQt Language Support QML Support Qt Designer Integration CMake Tools(CMake 기반 Qt 개발 시 필수) 프로젝트 설정 보충 (CMake + Qt의 예) 만약 Qt를 CMake 기반으로 사용하는 경우, 다음 확장 기능과의 조합을 추천합니다:\nCMake Tools CMake Language Support 또한 CMakeLists.txt에 다음과 같은 내용을 추가해 두면 Qt와의 연동이 원활합니다:\n1 2 find_package(Qt6 REQUIRED COMPONENTS Widgets) target_link_libraries(MyApp PRIVATE Qt6::Widgets) 부록: .ui 파일은 어떻게 열까? .ui 파일은 Qt Designer에서 편집할 수 있습니다. VSCode 상에서 .ui 파일을 마우스 오른쪽 버튼으로 클릭 → Open with Qt Designer를 선택할 수 있게 됩니다(환경 변수 PATH에 Qt Designer가 포함되어 있어야 함).\n요약 순서 내용 1 VSCode 실행 2 확장 기능 패널 열기 3 \u0026ldquo;Qt Extension Pack\u0026rdquo; 검색 4 설치 버튼 클릭 VSCode에 Qt 환경을 구축하는 것이 이전보다 훨씬 간단해졌습니다. Qt Creator의 대안으로도 충분한 기능이 있으며, 가볍게 작업하고 싶은 분들에게 추천합니다.\n추천 링크 모음 Qt 공식 Qt Extension Pack - Visual Studio Marketplace VSCode 공식 CMake Tools 확장 마무리하며 앞으로는 이 환경에서 Qt의 UI 도구나 QML을 활용한 개발도 진행해 볼 생각입니다. 다음에는 Qt로 Hello World 앱을 VSCode에서 빌드하고 실행하는 방법 에 대해 해설할 예정입니다.\n그럼 다음에 또 만나요!\n","date":"2024-09-13T00:53:53+09:00","image":"http://kenji.blog/p/visual-studio-code-%E3%81%AB-qt-extension-pack-%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6%E3%81%BF%E3%81%9F/img_1_hu3662f535d644da02b1919ea56b7b16c2_319254_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/visual-studio-code-%E3%81%AB-qt-extension-pack-%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6%E3%81%BF%E3%81%9F/","title":"'Visual Studio Code에 Qt Extension Pack을 설치해 보았다'"},{"content":"iPhone에 SIM락이 걸려있는지 확인하는 방법 홈 화면＞설정＞일반＞정보＞SIM락\nSIM락 없음이라고 표시되는지 SIM락 있음이라고 표시되는지 확인한다.\n","date":"2024-09-12T00:32:11+09:00","image":"http://kenji.blog/p/iphone%E3%81%ABsim%E3%83%AD%E3%83%83%E3%82%AF%E3%81%8C%E3%81%8B%E3%81%8B%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_huadfe7e53f677430d2790fc209a2a5361_107562_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/iphone%E3%81%ABsim%E3%83%AD%E3%83%83%E3%82%AF%E3%81%8C%E3%81%8B%E3%81%8B%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"iPhone에 SIM락이 걸려있는지 확인하는 방법"},{"content":"개요 1 클래스 P란, 결정론적 튜링 기계에서 다항 시간에 판정 가능한 문제의 클래스이며, 클래스 NP는 Yes가 되는 증거(Witness라고 함)가 주어졌을 때 다항 시간에 Witness의 정당성 판정(이를 검증이라고 함)이 가능한 문제의 클래스이다. 다항 시간에 판정 가능한 문제는 다항 시간에 검증 가능하므로 P⊆NP인 것은 분명하지만, P가 NP의 진부분집합인지 여부에 대해서는 명확하지 않다. 아직 증명되지는 않았지만, 많은 연구자는 P≠NP라고 믿고 있다. 그리고 이 클래스 P와 클래스 NP가 같지 않다는 예상을 \u0026#39;P≠NP 예상\u0026#39;이라고 한다. 참고 사이트 : https://daigakudenki.com/np-hard/\n","date":"2024-09-11T02:22:39+09:00","permalink":"http://kenji.blog/ko/p/pnp%E4%BA%88%E6%83%B3/","title":"'P≠NP 예상'"},{"content":"Microsoft MVP（2024-2025）를 재수상했습니다 안녕하세요, kenji입니다. 보고 말씀드립니다만, 올해도 Microsoft MVP（Most Valuable Professional） 를 수상했습니다. 이번으로 8번째 수상이 됩니다.\n모처럼이니, MVP란 무엇인가? 라는 것부터, 조금 적어볼까 합니다.\nMicrosoft MVP란? MVP라고 해도, 스포츠의 최우수 선수를 말하는 것은 아닙니다 (가끔 질문받습니다만…). Microsoft MVP（Most Valuable Professional） 는, Microsoft 기술에 관한 지식이나 경험을, 커뮤니티를 향해 적극적으로 발신・공유하고 있는 사람에게 주어지는 칭호입니다.\n기술 블로그를 작성하거나, Q\u0026amp;A 사이트에서 질문에 답변하거나, 샘플 코드를 공개하거나, 이벤트에서 등단하거나. 「자신이 알고 있는 것을, 누군가에게 도움이 되는 형태로 공유한다」――그런 꾸준한 활동이 평가됩니다.\n수상자는 전 세계에 있습니다만, 인원은 매년 한정되어 있어, 재수상도 쉽지 않습니다. 그런 와중에, 또 인정받을 수 있었던 것은 정말로 감사한 일이라고 생각합니다.\n수상 이유에 대하여 이번 수상은, 「Developer Technologies」라는 카테고리에서의 재수상입니다. 최근 1년은, 이런 느낌의 활동을 해왔습니다:\nMicrosoft 관련 기술에 대한 블로그 집필 기술계 Q\u0026amp;A 사이트에서의 답변 게시 GitHub에서의 샘플 코드 공개 스터디나 기술 이벤트에서의 등단 등 어느 것도 특별한 것은 아닙니다만, 「내가 시험해 보고 잘 된 것」이나 「막혔지만 해결할 수 있었던 것」을 조금이라도 도움이 되는 형태로 발신하는 것을 의식하며 해왔습니다.\n그것이 이렇게 형태가 된 것은, 솔직히 기쁩니다.\n앞으로에 대하여 기술의 세계는 어쨌든 속도가 빨라서, 따라가는 것만으로도 힘듭니다. 하지만 그렇기 때문에, 실제로 사용해보고 어땠는지, 어디가 이해하기 어려웠는지, 라는 「생생한 정보」를 공유하는 것에는, 의미가 있다고 느끼고 있습니다.\n앞으로도, 어깨에 힘을 빼고 제 페이스대로 계속해 나갈 수 있었으면 좋겠습니다. 어떤 형태로든, 「아, 그거 도움이 됐어」라고 누군가 생각해 줄 만한 정보를 전달해 갈 수 있다면 좋겠습니다.\n앞으로도, 아무쪼록 잘 부탁드립니다.\n","date":"2024-09-03T21:25:20+09:00","image":"http://kenji.blog/p/microsoft-mvp2024-2025%E3%82%92%E5%86%8D%E5%8F%97%E8%B3%9E%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/img_hu90bf51ced9d60993f005bc037644a192_1013423_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/microsoft-mvp2024-2025%E3%82%92%E5%86%8D%E5%8F%97%E8%B3%9E%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/","title":"'Microsoft MVP（2024-2025）를 재수상했습니다'"},{"content":"yt-dlp란 yt-dlp는 YouTube 동영상을 다운로드하기 위한 명령줄 도구입니다. 동영상을 다운로드할 뿐만 아니라, 음악 파일인 mp3 형식으로 다운로드할 수도 있습니다.\n다운로드 및 설치 yt-dlp 릴리스 페이지에서 최신 yt-dlp.exe를 다운로드합니다. yt-dlp.exe를 원하는 폴더에 배치합니다. yt-dlp.exe의 폴더 경로를 환경 변수 Path에 추가합니다. 사용 방법 yt-dlp.exe를 명령 프롬프트에서 실행하고, YouTube 동영상의 URL을 지정합니다.\n1 yt-dlp.exe \u0026#34;https://www.youtube.com/watch?v=VIDEO_ID\u0026#34; ※인수는 VIDEO_ID 부분만 있어도 괜찮습니다.\n음악 파일 mp3로 다운로드할 경우에는 다음 명령을 실행합니다.\n1 yt-dlp.exe --extract-audio --audio-format mp3 --embed-thumbnail --add-metadata \u0026#34;https://www.youtube.com/watch?v=VIDEO_ID\u0026#34; 이제 명령을 실행한 현재 디렉터리에 동영상이 다운로드됩니다.\n이상.\n","date":"2024-09-03T14:09:26+09:00","image":"http://kenji.blog/p/yt-dlp.exe-%E3%81%AB%E3%82%88%E3%82%8B-youtube-%E5%8B%95%E7%94%BB%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E6%96%B9%E6%B3%95/img_1_hu05024a06b03b28eb7dbfa3d8c8b493fd_22080_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/yt-dlp.exe-%E3%81%AB%E3%82%88%E3%82%8B-youtube-%E5%8B%95%E7%94%BB%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E6%96%B9%E6%B3%95/","title":"'yt-dlp.exe를 이용한 YouTube 동영상 다운로드 방법'"},{"content":" 축구 볼보이 @gg211204 『볼보이가 영웅이 된 날』 이날 팀을 구한 볼보이는 나중에 클럽에 초대되어, 선수들과 식사를 함께 했다. #토트넘 #스퍼스 #무리뉴 #볼보이 ♬ original sound - じょり 스타벅스 ","date":"2024-08-25T16:24:35+09:00","image":"http://kenji.blog/p/%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E5%8B%95%E7%94%BB%E3%83%AA%E3%83%B3%E3%82%AF/img_hu6a40cd72b9cd9a636c4c642d7bc2c778_3354885_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E5%8B%95%E7%94%BB%E3%83%AA%E3%83%B3%E3%82%AF/","title":"'쇼츠 영상 링크'"},{"content":"안녕하세요!\n오늘은 아인슈타인의 명언에 대해 이야기하고자 합니다.\n세상은 당신의 선행을 평가하지 않는다? 1 2 3 4 5 6 세상은 당신이 행하는 백만 번의 선행을 결코 평가하지 않을 것입니다. 하지만 당신이 하는 한 가지 잘못된 행동은 비판할 것입니다... 하지만 낙담하지 마십시오. \u0026#34;항상 모든 비웃음과 비판을 딛고 일어서십시오. 계속 강해지십시오.\u0026#34; - 알베르트 아인슈타인 이것은 아인슈타인이 남겼다고 알려진 말입니다. 우리가 매일 느끼는 사회의 가혹함이나 사람들의 평가가 가진 편향성을 날카롭게 지적하고 있습니다.\n그럼에도, 계속해서 일어선다 \u0026ldquo;항상 모든 비웃음과 비판을 딛고 일어서십시오. 계속 강해지십시오.\u0026rdquo;\n이 이어지는 말은, 앞서 언급한 냉혹한 현실에 대한 아인슈타인의 대답이라고도 할 수 있습니다. 비판이나 조롱에 굴하지 않고, 자기 자신을 믿고 계속 전진하는 것의 소중함을 가르쳐 줍니다.\n일상에 활용하는 아인슈타인의 가르침 이 명언은 우리의 일상 생활과도 깊이 관련되어 있습니다. 예를 들어, 직장에서의 노력이 인정받지 못하고 사소한 실수만 눈에 띄는 경우가 있습니다. 또한 SNS에서의 발언이 일부만 잘려서 비판받는 일도 있을 것입니다.\n그럴 때, 아인슈타인의 이 말을 떠올려 보십시오. 타인의 평가에 일희일비하기보다는 자신의 신념을 유지하는 것이 중요합니다.\n요약 아인슈타인의 이 명언은 우리에게 \u0026ldquo;타인의 평가에 좌우되지 않고 자신을 믿고 살아가는\u0026rdquo; 것의 중요성을 가르쳐 줍니다. 비판이나 조롱에 지지 않고 자신이 믿는 길을 나아갈 용기를 가집시다.\n마지막으로, 아인슈타인의 말을 다시 한 번.\n\u0026ldquo;항상 모든 비웃음과 비판을 딛고 일어서십시오. 계속 강해지십시오.\u0026rdquo;\n이 말이 여러분의 마음에 닿아 긍정적인 한 걸음을 내딛는 계기가 되기를 바랍니다.\n","date":"2024-08-24T18:38:47+09:00","image":"http://kenji.blog/p/%E3%82%A2%E3%82%A4%E3%83%B3%E3%82%B7%E3%83%A5%E3%82%BF%E3%82%A4%E3%83%B3%E3%81%AE%E5%90%8D%E8%A8%80/Solvay_conference_1927_hu5334df7b0e2e62905cb44adbbbde85ad_2671814_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/ko/p/%E3%82%A2%E3%82%A4%E3%83%B3%E3%82%B7%E3%83%A5%E3%82%BF%E3%82%A4%E3%83%B3%E3%81%AE%E5%90%8D%E8%A8%80/","title":"'아인슈타인의 명언'"},{"content":"다음은 지정된 범위 내의 소수를 생성하는 간단한 C 언어 코드입니다. 이 예제에서는 1부터 n까지의 소수를 나열합니다.\n1 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 31 32 #include \u0026lt;stdio.h\u0026gt; #include \u0026lt;stdbool.h\u0026gt; bool isPrime(int num) { if (num \u0026lt;= 1) return false; if (num \u0026lt;= 3) return true; if (num % 2 == 0 || num % 3 == 0) return false; for (int i = 5; i * i \u0026lt;= num; i += 6) { if (num % i == 0 || num % (i + 2) == 0) return false; } return true; } void printPrimes(int n) { printf(\u0026#34;2 \u0026#34;); for (int i = 3; i \u0026lt;= n; i += 2) { if (isPrime(i)) { printf(\u0026#34;%d \u0026#34;, i); } } printf(\u0026#34;\\n\u0026#34;); } int main() { int n; printf(\u0026#34;소수를 생성할 범위의 최댓값을 입력해 주세요: \u0026#34;); scanf(\u0026#34;%d\u0026#34;, \u0026amp;n); printf(\u0026#34;1부터 %d까지의 소수는 다음과 같습니다:\\n\u0026#34;, n); printPrimes(n); return 0; } 이 코드는 다음과 같이 동작합니다:\nisPrime 함수: 주어진 수가 소수인지 판별합니다. 효율성을 고려하여 먼저 2와 3으로 나누어떨어지는지 확인하고, 그 다음 6의 배수로 확인을 진행합니다. printPrimes 함수: 지정된 범위 내의 소수를 출력합니다. 2는 처음에 출력하고, 그 이후에는 홀수만 확인합니다. main 함수: 사용자로부터 범위의 최댓값을 입력받아, 그 범위 내의 소수를 출력합니다. 이 코드를 컴파일하고 실행하면, 지정된 범위 내의 소수가 표시됩니다.\n","date":"2024-08-24T09:38:10+09:00","image":"http://kenji.blog/p/%E7%B4%A0%E6%95%B0%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8Bc%E8%A8%80%E8%AA%9E%E3%82%B3%E3%83%BC%E3%83%89/img_hu31b8bd853d4750e84615619ef286e5d3_22034_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E7%B4%A0%E6%95%B0%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8Bc%E8%A8%80%E8%AA%9E%E3%82%B3%E3%83%BC%E3%83%89/","title":"'소수를 생성하는 C 언어 코드'"},{"content":"\n요사노 아키코 「너는 죽지 말지어다」\n――뤼순항 포위군 속에 있는 동생을 한탄하며\n아아 동생이여, 너를 위해 우노라,\n너는 죽지 말지어다,\n막내로 태어난 너이기에\n부모님의 사랑은 남달랐건만,\n부모님은 칼을 쥐어주며\n사람을 죽이라고 가르치셨던가,\n사람을 죽이고 죽으라고\n스물넷까지 키우셨던가.\n사카이 거리 상인의\n유서 깊은 집안을 자랑하는 주인으로서\n부모님의 이름을 이을 너이기에,\n너는 죽지 말지어다,\n뤼순 성이 멸망하든,\n멸망하지 않든, 무슨 상관이랴,\n너는 모르리라, 상인의\n집안 법도에는 없었느니라.\n너는 죽지 말지어다,\n천황 폐하께서는, 전쟁에\n친히 출진하지 않으시니,\n서로 남의 피를 흘리고,\n짐승의 길에서 죽으라 함은,\n죽는 것을 사람의 명예라 함은,\n크나큰 마음이 깊으시다면\n어찌 생각이나 하시겠는가.\n아아 동생이여, 전쟁에서\n너는 죽지 말지어다,\n지난 가을 아버지를\n여의신 어머니는,\n슬픔 속에서, 애처롭게도\n아들을 징집당하고, 집을 지키며,\n평안하다 들리는 태평성대에도\n어머니의 백발은 늘어만 가네.\n포장막 뒤에 엎드려 우는\n가녀리고 젊은 새색시를,\n너는 잊었느냐, 생각하느냐,\n열 달도 함께하지 못하고 헤어진\n소녀의 마음을 생각해보라,\n이 세상 유일한 너 말고\n아아 또 누구를 의지하리오,\n너는 죽지 말지어다.\n","date":"2024-07-25T13:16:47+09:00","permalink":"http://kenji.blog/ko/p/%E5%90%9B%E6%AD%BB%E3%81%AB%E3%81%9F%E3%81%BE%E3%81%B5%E3%81%93%E3%81%A8%E3%81%AA%E3%81%8B%E3%82%8C/","title":"'너는 죽지 말지어다'"},{"content":"\n🔹 인물 개요 요사노 아키코(与謝野晶子, 1878년～1942년)는 메이지 시대부터 쇼와 초기까지 활약한 일본의 가인(歌人)·작가·사상가입니다. 특히 정열적이고 개성적인 단카(短歌) 작품으로 알려져 있으며, 근대 일본 문학에서 여성의 자립이나 연애 표현의 새로운 지평을 개척한 인물입니다.\n본명: 요사노(옛 성: 호) 쇼(쇼=鳳しょう)\n출신지: 사카이(오사카부 사카이시)\n남편: 요사노 텟칸(가인·시인)\n주요 활동 시기: 메이지 후기～쇼와 초기\n특징:\n여성의 연애 감정을 솔직하게 읊은 단카로 주목받음 페미니즘적 사상을 가지고, 여성의 교육과 자립을 추진 러일전쟁을 비판하는 평화주의적인 자세도 보임 『묘조(明星)』라는 문학 잡지의 중심 멤버 🔹 대표작과 그 줄거리·특징 1. 『미다레가미(みだれ髪)』 (1901년) 개요: 처녀 가집(歌集). 20대 초반에 발표되어 일본 문단에 큰 충격을 주었다. 특징: 연애 감정이나 육체적인 욕망을 여성의 입장에서 솔직하게 표현. 유명한 노래(단카): 부드러운 피부의 뜨거운 피에 닿아보지도 않고 외롭지 않은가 길을 설교하는 그대여\n→ 당시의 윤리관에서는 대담하다고 여겨지는 연애관을 여성 자신의 언어로 표현하여 화제가 되었습니다.\n2. 『너는 죽지 말지어다(君死にたまふことなかれ)』 (1904년) 형식: 시 (단카가 아닌 시문) 내용: 러일전쟁에 출정 중인 남동생에게 보낸 반전 시. 일부 발췌: 너는 죽지 말지어다 막내로 태어난 너이기에 어머님은 눈물 많이 흘리시며 너의 소매를 쥐어짜며……\n의의: 당시 전쟁을 미화하는 풍조가 강한 가운데, 남동생의 죽음을 걱정하는 여성의 입장에서 반전을 호소했다는 점에서 획기적. 🔹 영향과 평가 여성 해방이나 평화주의, 교육의 보급 등 사회적으로도 선진적인 활동을 했다. 말년에는 여성 교육에 진력하여, 여자대학 설립에도 관여했다 (문화학원 등). 전전(戰前) 일본에 있어 가장 중요한 여성 지식인·문학자 중 한 명. 🔹 요약 항목 내용 이름 요사노 아키코 활동 분야 단카, 시, 평론, 교육 주요 작품 『미다레가미』 『너는 죽지 말지어다』 특징 연애의 자유, 여성의 자립, 평화주의의 표현 현대에의 영향 페미니즘 문학, 근대 단카의 혁신, 반전 시의 선구자 ","date":"2024-07-25T13:08:36+09:00","permalink":"http://kenji.blog/ko/p/%E4%B8%8E%E8%AC%9D%E9%87%8E%E6%99%B6%E5%AD%90%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/","title":"'요사노 아키코에 대하여'"},{"content":"Mathematica 입문 방정식 풀기 1 Solve[x^2 - 3 x + 2 == 0, x] 출력\n1 {{x -\u0026gt; 1}, {x -\u0026gt; 2}} 정수 범위에서 방정식의 해 구하기 1 Solve[x^2 - 3 x + 2 == 0 \u0026amp;\u0026amp; 0 \u0026lt;= x \u0026lt;= 2, x, Integers] 출력\n1 {{x -\u0026gt; 1}, {x -\u0026gt; 2}} 연립방정식 풀기 1 Solve[{x + y == 3, x - y == 1}, {x, y}] 출력\n1 {{x -\u0026gt; 2, y -\u0026gt; 1}} 부등식 풀기 1 Reduce[x^2 - 3 x + 2 \u0026gt; 0, x] 출력\n1 x \u0026lt; 1 || x \u0026gt; 2 미분하기 1 D[x^2, x] 출력\n1 2 x 적분하기 1 Integrate[x^2, x] 출력\n1 x^3/3 극한 구하기 1 Limit[1/x, x -\u0026gt; 0] 출력\n1 Infinity 급수 구하기 1 Sum[1/n^2, {n, 1, Infinity}] 출력\n1 π^2/6 행렬 만들기 1 m = {{1, 2}, {3, 4}} 행렬의 곱 구하기 1 m . m 출력\n1 {{7, 10}, {15, 22}} 역행렬 구하기 1 Inverse[m] 출력\n1 {{-2, 1}, {1.5, -0.5}} 고유값과 고유벡터 구하기 1 Eigensystem[m] 출력\n1 {{5, 0}, {{1, 1}, {1, -1}}} 벡터의 내적 구하기 1 {1, 2} . {3, 4} 출력\n1 11 벡터의 외적 구하기 1 Cross[{1, 2, 3}, {4, 5, 6}] 출력\n1 {-3, 6, -3} 벡터의 크기 구하기 1 Norm[{1, 2, 3}] 출력\n1 √14 벡터의 각도 구하기 1 ArcCos[{1, 2} . {3, 4}/(Norm[{1, 2}] Norm[{3, 4}])] 출력\n1 ArcCos[11/(√5 √25)] 벡터의 사영 구하기 1 {1, 2} . {3, 4}/Norm[{3, 4}] {3, 4}/Norm[{3, 4}] 출력\n1 {11/5, 22/5} 벡터의 회전 구하기 1 RotationMatrix[π/2].{1, 0} 출력\n1 {0, 1} 벡터의 평행이동 구하기 1 TranslationTransform[{1, 2}][{3, 4}] 출력\n1 {4, 6} 벡터의 확대 축소 구하기 1 ScalingTransform[{2, 3}][{1, 1}] 출력\n1 {2, 3} 벡터의 반전 구하기 1 ReflectionTransform[{1, 1}][{1, 1}] 출력\n1 {0, 0} 난수 생성하기 1 RandomReal[] 출력\n1 0.123456 난수 생성하기 (정수) 1 RandomInteger[] 출력\n1 123456 난수 생성하기 (범위 지정) 1 RandomReal[{1, 10}] 출력\n1 5.6789 난수 생성하기 (정수, 범위 지정) 1 RandomInteger[{1, 10}] 출력\n1 5 난수 생성하기 (분포 지정) 1 RandomVariate[NormalDistribution[0, 1]] 출력\n1 0.123456 난수 생성하기 (분포 지정, 개수 지정) 1 RandomVariate[NormalDistribution[0, 1], 10] 출력\n1 {0.123456, 0.234567, ..., 0.987654} 난수 생성하기 (분포 지정, 개수 지정, 시드 지정) 1 2 SeedRandom[12345] RandomVariate[NormalDistribution[0, 1], 10] 출력\n1 {0.123456, 0.234567, ..., 0.987654} 배열의 요소에 함수 적용하기 1 2 3 Map[Sqrt, {1, 4, 9}] Sqrt /@ {1, 4, 9} Map[#^(1/2)\u0026amp;, {1, 4, 9}] 출력\n1 {1, 2, 3} 람다식을 사용하여 함수 정의하기 1 2 f = Function[x, x^2] f[3] 출력\n1 9 함수 합성하기 1 2 3 4 f = Function[x, x^2] g = Function[x, x + 1] h = Function[x, f[g[x]]] h[3] 출력\n1 16 직전 계산 결과 참조하기 1 % + 1 출력\n1 17 순수 함수 1 (#+3)\u0026amp;[5] 출력\n1 8 배열 추출하기 1 2 Select[{1, 2, 3, 4, 5}, EvenQ] Select[{1, 2, 3, 4, 5}, Mod[#,2]==0\u0026amp;] 출력\n1 {2, 4} ","date":"2024-07-25T01:36:19+09:00","image":"http://kenji.blog/p/mathematica%E5%85%A5%E9%96%80/img_hucba782cf2f6047b30fd8084b4d887659_22760_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/mathematica%E5%85%A5%E9%96%80/","title":"'Mathematica 입문'"},{"content":"Hugo란 Hugo는 정적 사이트 생성기 중 하나입니다. Markdown 파일을 HTML로 변환하여 웹사이트를 만들 수 있습니다. Hugo는 Go 언어로 작성되어 빠르게 동작합니다.\n이 블로그도 Hugo로 제작되었습니다.\nHugo CLI 설치 Hugo CLI를 설치하려면 다음 명령어를 실행합니다.\n※ macOS의 경우의 예시입니다. 다른 OS의 경우, 공식 문서를 참조하세요.\n1 brew install hugo Homebrew를 사용하여 설치할 수 있습니다.\nHugo 명령어 목록 Hugo에는 다양한 명령어가 준비되어 있습니다. 아래에 자주 사용하는 명령어를 정리했습니다.\n새로운 사이트 만들기 1 hugo new site \u0026lt;사이트명\u0026gt; 새로운 사이트를 생성하는 명령어입니다. \u0026lt;사이트명\u0026gt;에는 사이트의 이름을 지정합니다.\n새로운 글 작성하기 1 hugo new \u0026lt;기사명\u0026gt;.md 새로운 글을 작성하는 명령어입니다. \u0026lt;기사명\u0026gt;에는 글의 이름을 지정합니다.\n서버 실행하기 1 hugo server 로컬 서버를 기동하는 명령어입니다. http://localhost:1313으로 접속할 수 있습니다.\n빌드하기 1 hugo 사이트를 빌드하는 명령어입니다. public 디렉토리에 HTML 파일이 생성됩니다.\n배포하기 1 hugo deploy 사이트를 배포하는 명령어입니다. 배포처 설정은 config.toml 파일에서 합니다.\n글 목록 표시하기 1 hugo list all 작성된 글 목록을 표시하는 명령어입니다.\n설정 확인하기 1 hugo config 설정을 확인하는 명령어입니다.\n도움말 표시하기 1 hugo help 도움말을 표시하는 명령어입니다.\n버전 표시하기 1 hugo version 버전을 표시하는 명령어입니다.\n이상이 Hugo 명령어 목록입니다. 이 외에도 다양한 명령어가 준비되어 있으므로 공식 문서를 참고해 주세요.\n참고 Hugo 공식 문서 ","date":"2024-05-31T01:36:00+09:00","image":"http://kenji.blog/p/hugo%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E4%B8%80%E8%A6%A7/img_hu415dc7e70376ac350673d0366f70ca4b_19909_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/hugo%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E4%B8%80%E8%A6%A7/","title":"'Hugo 명령어 목록'"},{"content":"Visual Studio Code 추천 확장 기능 목록 분류 명칭 제공자 설명 가상·컨테이너 관리 Remote Development Microsoft SSH 접속으로 가상 컨테이너/WSL에 연결하여 원격 개발을 지원한다 가상·컨테이너 관리 Docker Microsoft Docker 컨테이너 관리를 지원한다 코드 관리 GitHub Pull Requests GitHub GitHub의 Pull Request를 VSCode 상에서 관리한다 코드 관리 GitHub Copilot GitHub AI에 의한 코드 자동 완성을 지원한다 코드 관리 Git Graph mhutchie Git의 브랜치나 커밋을 그래픽으로 표시한다 코드 관리 Git History Don Jayamanne Git의 히스토리를 표시한다 브라우저·웹 개발 Debugger for Firefox Firefox DevTools Firefox의 디버거를 VSCode 상에서 이용한다 브라우저·웹 개발 Microsoft Edge Tool For VScode Microsoft Edge의 개발자 도구를 VSCode 상에서 이용한다 브라우저·웹 개발 Vue Language Features(Volar) Vue Vue의 언어 기능을 지원한다 브라우저·웹 개발 JavaScript (ES6) code snippets charalampos karypidis JavaScript 스니펫을 제공한다 브라우저·웹 개발 Tailwind CSS IntelliSense Tailwind Labs Tailwind CSS 스니펫을 제공한다 클라우드 개발 AWS Toolkit Amazon Web Services AWS 개발을 지원한다 클라우드 개발 Azure Tools Microsoft Azure 개발을 지원한다 클라우드 개발 Google Cloud Tools Google Cloud Google Cloud 개발을 지원한다 데이터베이스 MySQL Jun Han MySQL 개발을 지원한다 데이터베이스 SQL Server(mssql) Microsoft SQL Server 개발을 지원한다 데이터베이스 PostgreSQL Chris Kolkman PostgreSQL 개발을 지원한다 임베디드 PlatformIO PlatformIO PlatformIO 개발을 지원한다 임베디드 Arduino Microsoft Arduino 개발을 지원한다 임베디드 WorkBench Particle Particle이 제공하는 개발 환경, 펌웨어, 라이브러리, 클라우드 연동까지 IoT용 개발을 지원한다 C/C++ C/C++ Extension Pack Microsoft C/C++ 개발을 지원한다 C/C++ C/C++ Runner franneck94 C/C++ 코드를 실행한다(gcc, msvc, cuda nvccc 컴파일러 지원) C/C++ Cortex-Debug marus25 Cortex-A/R/M 마이컴 디버깅을 지원한다 Python Python Extension Pack Microsoft Python 개발을 지원한다 Python jupyter Microsoft Jupyter Notebook 개발을 지원한다 유틸리티·UI 확장 Markdown All in One Yu Zhang Markdown 작성을 지원한다 유틸리티·UI 확장 Hex Editor Microsoft 바이너리 파일을 편집한다 유틸리티·UI 확장 vscode-pdf tomoki1207 PDF 파일을 표시한다 유틸리티·UI 확장 Rainbow CSV mechatroner CSV 파일을 컬러풀하게 표시한다 유틸리티·UI 확장 Draw.io Integration Henning Dieterichs Draw.io를 VSCode 상에서 이용한다 유틸리티·UI 확장 Japanese Language Pack for Visual Studio Code Microsoft 일본어화 팩 유틸리티·UI 확장 Live Share Microsoft 실시간 공동 작업을 지원한다 ","date":"2024-05-29T17:20:19+09:00","image":"http://kenji.blog/p/visual-studio-code%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD/img_hu9f3ce3d75e92e9f1ca11d3e7a3c7b710_108332_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/visual-studio-code%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD/","title":"Visual Studio Code 추천 확장 기능"},{"content":"mermaid.js란 mermaid.js는 JavaScript 라이브러리로, 텍스트 기반의 독자적인 구문(Mermaid 표기법)을 작성하여 플로우차트나 다이어그램, 간트 차트 등 복잡한 도표를 그래픽으로 표시할 수 있습니다. GitHub나 Qiita, Notion 등 다양한 서비스에서도 채택되어 있습니다. 이번에는 hugo에서 mermaid.js를 사용할 수 있도록 해보겠습니다.\nhugo에서 mermaid.js를 사용할 수 있게 하기 순서는 다음과 같습니다.\nlayouts/partials/extend_footer.html에 다음을 추가합니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 {{ if or .Params.mermaid .Site.Params.mermaid }} \u0026lt;script src=\u0026#34;https://cdn.jsdelivr.net/npm/mermaid@10.3.0/dist/mermaid.min.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; {{- $loadmermaid := resources.Get \u0026#34;js/load-mermaid.js\u0026#34; }} \u0026lt;script src=\u0026#34;{{ $loadmermaid.RelPermalink }}\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;script\u0026gt; window.initMermaid(); if (isDarkTheme()) { setPrefTheme(\u0026#39;dark\u0026#39;); } else { setPrefTheme(\u0026#39;light\u0026#39;); } \u0026lt;/script\u0026gt; {{ end }} ※if문으로 mermaid: true로 설정한 경우에만 mermaid.min.js를 불러오도록 하고 있습니다. 이 라이브러리는 3MB 정도로 의외로 큽니다.\nassets/js/load-mermaid.js를 생성합니다. 이 처리는 초기화 및 동적으로 테마가 전환되었을 때 다시 그리기 위해 사용됩니다. 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 (function(window){ \u0026#39;use strict\u0026#39; const elementCode = \u0026#39;.mermaid\u0026#39; const loadMermaid = function(theme) { window.mermaid.initialize({theme}) window.mermaid.init({theme}, document.querySelectorAll(elementCode)) } const saveOriginalData = function(){ return new Promise((resolve, reject) =\u0026gt; { try { var els = document.querySelectorAll(elementCode), count = els.length; els.forEach(element =\u0026gt; { element.setAttribute(\u0026#39;data-original-code\u0026#39;, element.innerHTML) count-- if(count == 0){ resolve() } }); } catch (error) { reject(error) } }) } const resetProcessed = function(){ return new Promise((resolve, reject) =\u0026gt; { try { var els = document.querySelectorAll(elementCode), count = els.length; els.forEach(element =\u0026gt; { if(element.getAttribute(\u0026#39;data-original-code\u0026#39;) != null){ element.removeAttribute(\u0026#39;data-processed\u0026#39;) element.innerHTML = element.getAttribute(\u0026#39;data-original-code\u0026#39;) } count-- if(count == 0){ resolve() } }); } catch (error) { reject(error) } }) } const init = ()=\u0026gt;{ saveOriginalData() .catch( console.error ) document.body.addEventListener(\u0026#39;dark-theme-set\u0026#39;, ()=\u0026gt;{ resetProcessed() .then(loadMermaid(\u0026#39;dark\u0026#39;)) .catch(console.error) }) document.body.addEventListener(\u0026#39;light-theme-set\u0026#39;, ()=\u0026gt;{ resetProcessed() .then(loadMermaid(\u0026#39;default\u0026#39;)) .catch(console.error) }) } window.initMermaid = init })(window); 여기 바탕이 되는 코드는 다음을 참고했습니다.\nReinitialize with new theme #1945 header.html의 테마 전환 시의 처리를 수정합니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 function switchTheme(theme) { switch (theme) { case \u0026#39;light\u0026#39;: {{ if or .Params.mermaid .Site.Params.mermaid }} document.body.dispatchEvent(new CustomEvent(\u0026#39;light-theme-set\u0026#39;)); {{ end }} document.body.classList.remove(\u0026#39;dark\u0026#39;); break; case \u0026#39;dark\u0026#39;: {{ if or .Params.mermaid .Site.Params.mermaid }} document.body.dispatchEvent(new CustomEvent(\u0026#39;dark-theme-set\u0026#39;)); {{ end }} document.body.classList.add(\u0026#39;dark\u0026#39;); break; // auto default: if (window.matchMedia(\u0026#39;(prefers-color-scheme: dark)\u0026#39;).matches) { {{ if or .Params.mermaid .Site.Params.mermaid }} document.body.dispatchEvent(new CustomEvent(\u0026#39;dark-theme-set\u0026#39;)); {{ end }} document.body.classList.add(\u0026#39;dark\u0026#39;); } } } layouts/shortcodes/mermaid.html을 생성합니다. 1 2 3 \u0026lt;div class=\u0026#34;mermaid\u0026#34; align=\u0026#34;{{ if .Get \u0026#34;align\u0026#34; }}{{ .Get \u0026#34;align\u0026#34; }}{{ else }}center{{ end }}\u0026#34;\u0026gt; {{ safeHTML .Inner }} \u0026lt;/div\u0026gt; 이상으로 mermaid.js를 사용할 준비가 완료되었습니다.\nmermaid.js 사용해 보기 게시글 정의에 다음을 추가합니다. 1 marmaid: true 게시글 본문에 다음을 추가합니다. 플로우차트\n1 2 3 4 5 6 {{\u0026lt;mermaid align=\u0026#34;center\u0026#34;\u0026gt;}} graph TD A[시작] --\u0026gt;|조건1| B(조건2) B --\u0026gt; C{조건3} C --\u0026gt;|조건4| D[종료] {{\u0026lt;/mermaid\u0026gt;}} 출력 결과\ngraph TD A[시작] --\u003e|조건1| B(조건2) B --\u003e C{조건3} C --\u003e|조건4| D[종료] 간트 차트\n1 2 3 4 5 6 7 8 9 10 11 12 {{\u0026lt;mermaid align=\u0026#34;center\u0026#34;\u0026gt;}} gantt section Project 요구사항 정의 :done, a, 2024-05-25, 5d 기본 설계 :done, b, after a, 5d 상세 설계 :done, c, after b, 5d 구현 :active, d, after c, 10d 단위 테스트 :crit, e, after d, 5d 통합 테스트 : f, after e, 5d 종합 테스트 : g, after f, 5d 릴리스 :milestone, h, after g, 1d {{\u0026lt;/mermaid\u0026gt;}} 출력 결과\ngantt section Project 요구사항 정의 :done, a, 2024-05-25, 5d 기본 설계 :done, b, after a, 5d 상세 설계 :done, c, after b, 5d 구현 :active, d, after c, 10d 단위 테스트 :crit, e, after d, 5d 통합 테스트 : f, after e, 5d 종합 테스트 : g, after f, 5d 릴리스 :milestone, h, after g, 1d 시퀀스 다이어그램\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 {{\u0026lt;mermaid align=\u0026#34;center\u0026#34;\u0026gt;}} sequenceDiagram participant user participant view participant controller participant model participant database user-\u0026gt;\u0026gt;view: ID/PW 입력 view-\u0026gt;\u0026gt;controller: 인증 요청 controller-\u0026gt;\u0026gt;model: 인증 요청 model-\u0026gt;\u0026gt;database: 인증 요청 database--\u0026gt;\u0026gt;model: 인증 결과 반환 model--\u0026gt;\u0026gt;controller: 인증 결과 반환 controller--\u0026gt;\u0026gt;view: 인증 결과 반환 view--\u0026gt;\u0026gt;user: 인증 결과 표시 {{\u0026lt;/mermaid\u0026gt;}} 출력 결과\nsequenceDiagram participant user participant view participant controller participant model participant database user-\u003e\u003eview: ID/PW 입력 view-\u003e\u003econtroller: ajax 문의 controller-\u003e\u003emodel: 인증 요청 model-\u003e\u003edatabase: SQL 실행 database--\u003e\u003emodel: SQL 결과 반환 model--\u003e\u003econtroller: 인증 요청 결과 반환 controller--\u003e\u003eview: ajax 문의 결과 반환 view--\u003e\u003euser: 인증 결과 표시 이상입니다.\n참고 mermaid.js 공식 사이트 mermaid 구문을 미리 볼 수 있는 데모 사이트 ","date":"2024-05-25T02:18:09+09:00","image":"http://kenji.blog/p/mermaid.js%E3%82%92%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/img_2_huc7c099ec3ef9a6ce3efa5818e1489313_12585_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/mermaid.js%E3%82%92%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/","title":"'mermaid.js를 사용해 보기'"},{"content":"git reset을 취소하는 방법 git commit을 수행한 후, 실수로 git reset을 실행해버린 경우, git reset을 취소하는 방법(git commit 시의 상태를 복원하는 방법)을 소개합니다.\ngit reflog로 리셋 전의 커밋 ID를 확인 git reset --hard HEAD@{숫자}로 리셋 전의 상태로 되돌림 이상, git reset을 취소하는 방법이었습니다.\n","date":"2024-05-15T23:32:43+09:00","image":"http://kenji.blog/p/git-reset%E3%82%92%E5%8F%96%E3%82%8A%E6%B6%88%E3%81%99%E6%96%B9%E6%B3%95/img_hu1637c23702d7aac8be6c2641e62ebc1a_73066_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/git-reset%E3%82%92%E5%8F%96%E3%82%8A%E6%B6%88%E3%81%99%E6%96%B9%E6%B3%95/","title":"git reset을 취소하는 방법"},{"content":"MS-DOS 4.0의 오픈소스화 마이크로소프트사는 약 40년 전 출시된 MS-DOS 4.0의 소스 코드를 공개했다. 거의 완전히 8086 어셈블리 코드로 작성되어 있다.\ngithub 리포지토리 https://github.com/microsoft/MS-DOS\n참고 사이트 MS-DOS 4.0의 오픈소스화 ","date":"2024-05-05T16:44:28+09:00","image":"http://kenji.blog/p/ms-dos-4.0-%E3%81%AE%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E5%8C%96/img_hu44e977c98e405f06fee0746ba6885217_23034_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/ms-dos-4.0-%E3%81%AE%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E5%8C%96/","title":"'MS-DOS 4.0의 오픈소스화'"},{"content":" 리더블 코드 프로그래밍의 원리 실용주의 프로그래머 웹을 지탱하는 기술 안전한 웹 애플리케이션을 만드는 방법 네트워크는 왜 연결되는가 달인에게 배우는 SQL 철저 지침서 Docker 실전 가이드 Kubernetes 완전 가이드 CODE COMPLETE 제2판 Clean Code 애자일 소프트웨어 달인의 기술 Clean Architecture 달인에게 배우는 소프트웨어 구조와 설계 게임 프로그래머가 되기 전에 알아두어야 할 기술 Being Geek 객체지향으로 왜 만드는가 ","date":"2024-05-05T16:03:33+09:00","image":"http://kenji.blog/p/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E5%88%9D%E5%AD%A6%E8%80%85%E3%81%AB%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AE%E6%9B%B8%E7%B1%8D/img_huefc28c3d74f521b3206dda9fd272911e_636136_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E5%88%9D%E5%AD%A6%E8%80%85%E3%81%AB%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AE%E6%9B%B8%E7%B1%8D/","title":"'엔지니어 초보자에게 추천하는 도서'"},{"content":"Excel 달력 템플릿 (공휴일 지원 버전)을 만들었습니다! 연도와 월을 입력하면 해당 월 달력의 공휴일이 표시되는 Excel 템플릿을 만들었습니다.\n다운로드하여 사용해 주세요. カレンダー.xlsx\n","date":"2024-05-01T00:15:57+09:00","image":"http://kenji.blog/p/excel%E3%81%AE%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E4%BC%91%E6%97%A5%E5%AF%BE%E5%BF%9C%E7%89%88/img_hu8d7d9eeba53cb2329139f98aded52558_13893_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/excel%E3%81%AE%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E4%BC%91%E6%97%A5%E5%AF%BE%E5%BF%9C%E7%89%88/","title":"Excel 달력 템플릿 (공휴일 지원 버전)"},{"content":"※Windows 11에서의 설정 방법입니다.\n제어판 열기 전원 옵션 선택 \u0026lsquo;전원 단추 작동 설정\u0026rsquo; 클릭 \u0026lsquo;현재 사용할 수 없는 설정 변경\u0026rsquo; 클릭 \u0026lsquo;빠른 시작 켜기(권장)\u0026rsquo; 체크 해제 \u0026lsquo;변경 내용 저장\u0026rsquo; 클릭 참고 \\[Windows 10\\] 빠른 시작을 비활성화하는 방법을 알려주세요.\n","date":"2024-04-29T19:42:20+09:00","image":"http://kenji.blog/p/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%A2%E3%83%8B%E3%82%BF%E3%81%A7%E6%AF%8E%E5%9B%9E%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%ABdpi%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%8C%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%81%95%E3%82%8C%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86%E3%81%A8%E3%81%8D%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95/img_huc496c8f1febcd28bf66466cd5e2648a0_37147_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%A2%E3%83%8B%E3%82%BF%E3%81%A7%E6%AF%8E%E5%9B%9E%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%ABdpi%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%8C%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%81%95%E3%82%8C%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86%E3%81%A8%E3%81%8D%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95/","title":"멀티 모니터에서 매번 부팅 시 DPI 설정이 초기화되는 문제 해결 방법"},{"content":"저장소의 최신 커밋만 가져오기 다음 명령어로 저장소의 최신 커밋만 가져올 수 있습니다. 디스크 용량을 절약하기 위해, 빠르게 저장소를 가져오고 싶을 때 유용합니다.\n1 git clone --depth 1 \u0026lt;저장소 URL\u0026gt; ","date":"2024-04-27T02:54:12+09:00","image":"http://kenji.blog/p/git%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E6%9C%80%E6%96%B0%E3%81%A0%E3%81%91%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B/img_hu2ecde82e40aa31a994850b70302683b4_5304_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/git%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E6%9C%80%E6%96%B0%E3%81%A0%E3%81%91%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B/","title":"git 저장소의 최신 커밋만 가져오기"},{"content":"GitHub Copilot에서 다음과 같은 오류가 표시된 경우의 대처 방법 2024년 4월 19일경부터 GitHub Copilot을 사용할 수 없게 되었습니다. 오류 메시지는 다음과 같습니다.\n1 2 [ERROR] [ghostText] [2024-04-21T04:06:46.900Z] Error on ghost text request: (FetchError) unable to verify the first certificate [ERROR] [certificates] [2024-04-21T04:06:46.901Z] Your current Copilot license doesn\u0026#39;t support proxy connections with custom certificates. Please visit https://gh.io/copilot-network-errors to learn more. Original cause: {\u0026#34;type\u0026#34;:\u0026#34;system\u0026#34;,\u0026#34;_name\u0026#34;:\u0026#34;FetchError\u0026#34;,\u0026#34;code\u0026#34;:\u0026#34;UNABLE_TO_VERIFY_LEAF_SIGNATURE\u0026#34;} 대처 방법 이것은 ESET의 버그인 것 같습니다. ESET의 고급 설정에서 \u0026lsquo;SSL/TLS 활성화\u0026rsquo;를 OFF로 설정합니다. 참고 AWS의 CDK에서도 동일한 오류가 발생하는 것 같습니다.\nAWS CDK bootstrap certificate warning-error ","date":"2024-04-21T18:47:26+09:00","image":"http://kenji.blog/p/%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%A7github-copilot%E3%81%8C%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95/img_hue52485515660c172702881501d13c34d_319675_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%A7github-copilot%E3%81%8C%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95/","title":"인증서 오류로 GitHub Copilot을 사용할 수 없게 된 경우의 대처 방법"},{"content":"\nVim 입문 다운로드와 설치 https://www.vim.org/download.php\n위의 사이트에서, 설치하고 싶은 OS에 맞춰 모듈을 다운로드 및 설치합니다.\nWindows의 경우 gvim_X.X.X_x64_signed.exe를 선택하면 좋을 것입니다.\n시작 방법 Windows의 경우 환경 변수에 vim.exe가 있는 폴더를 Path에 등록해 둘 필요가 있습니다.\n시작 방법\n1 vim 파일명을 지정해서 시작할 경우\n1 vim filename.txt 종료 방법 종료할 경우 :(콜론)을 입력 후, q를 입력하고, Enter를 입력\n1 :q 파일을 업데이트했을 경우 마지막 변경이 저장되지 않았습니다 (!를 추가하여 변경 사항 폐기)라고 표시됩니다. 내용을 폐기하고 강제적으로 종료할 수 있습니다.\n1 :q! 파일을 쓰고 종료할 경우\n1 :wq 다음과 같이 입력해도 같은 의미입니다.\n1 :x 또한, Shift를 누른 채 z를 2번 누르는 것으로도 종료할 수 있습니다. (:wq와 같음)\n모드 Vim에는 명령 모드와 입력 모드가 있습니다. Vim을 시작한 시점에는 명령 모드가 되며, i 키를 누르면 입력 모드로 전환됩니다.\n입력 모드에서는 문자 그대로 입력이 가능해집니다. 입력 모드에서 명령 모드로 전환하려면 ESC 키를 누릅니다.\n이 입력 모드의 전환이 있는 것이 Vim의 특징입니다.\n커서 이동과 스크롤 명령 모드일 때의 커서 이동과 스크롤에 대해 정리합니다.\n키 설명 h (또는 Ctrl+H, BackSpace, ←) 왼쪽으로 이동 j (또는 Ctrl+J・N, ↓) 아래로 이동 k (또는 Ctrl+P, ↑) 위로 이동 l (또는 Space, →) 오른쪽으로 이동 + (또는 Enter) 다음 줄의 첫 문자로 이동 - 이전 줄의 첫 문자로 이동 Ctrl+B (또는 PageUp) 위쪽 방향으로 스크롤 Ctrl+F (또는 PageDown) 아래쪽 방향으로 스크롤 Ctrl+U 위쪽 방향으로 반 스크롤 Ctrl+D 아래쪽 방향으로 반 스크롤 Ctrl+Y 위쪽 방향으로 1줄 스크롤 Ctrl+E 아래쪽 방향으로 1줄 스크롤 z Enter 커서가 있는 줄을 화면 상단으로 스크롤 z . 커서가 있는 줄을 화면 중앙으로 스크롤 z - 커서가 있는 줄을 화면 하단으로 스크롤 0 (또는 |) 커서를 줄의 맨 앞으로 이동 $ 커서를 줄의 맨 뒤로 이동 ^ (또는 _) 커서를 줄의 맨 앞으로 (공백, Tab 제외) 이동 G (또는 :$) 커서를 마지막 줄로 이동 :줄 번호 Enter 지정한 줄로 이동 숫자 뒤에 위의 이동하는 키를 입력하면, 숫자만큼 여러 번 이동할 수 있습니다. (예를 들어, 3j를 입력하면 현재 커서 위치에서 아래로 3줄 이동합니다.)\n기타 명령 키 설명 Ctrl+L 화면을 다시 그림 Ctrl+G 파일 전체의 줄 수, 커서 위치 등을 표시 ","date":"2024-04-19T22:06:34+09:00","image":"http://kenji.blog/p/vim%E5%85%A5%E9%96%80/img_hu70487bce4333a61ad5b3ba8ed7939499_17904_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/vim%E5%85%A5%E9%96%80/","title":"Vim 입문"},{"content":"DestroyIcon을 호출할 필요성에 대하여 DestroyIcon을 호출해야 하는 경우는 다음과 같다.\nCreateIconFromResourceEx (LR_SHARED 플래그 없이 호출된 경우) CreateIconIndirect CopyIcon 위의 함수로 생성된 경우.\nLoadIcon LoadImage (LR_SHARED 플래그를 사용하는 경우) CopyImage (LR_COPYRETURNORG 플래그를 사용하고, hImage 매개변수가 공유 아이콘인 경우) CreateIconFromResource CreateIconFromResourceEx (LR_SHARED 플래그를 사용하는 경우) 위의 경우로 생성 및 로드된 아이콘은 DestroyIcon을 호출해서는 안 된다.\n참고 DestroyIcon 함수 (winuser.h) ","date":"2024-04-19T01:55:17+09:00","permalink":"http://kenji.blog/ko/p/loadicon%E3%81%AFdestroyicon%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99%E5%BF%85%E8%A6%81%E3%81%AF%E3%81%AA%E3%81%84/","title":"LoadIcon은 DestroyIcon을 호출할 필요가 없다"},{"content":"생성형 AI에 대한 강의 영상 「생성형 AI」(1) 나카오 마사유키·도쿄대학 교수　2023.9.8 「생성형 AI」(2) 사카이 쿠니요시·도쿄대학 대학원 교수　2023.10.11 「생성형 AI」(3) 마츠오 유타카·도쿄대학 대학원 교수　2024.3.15 ","date":"2024-04-16T02:13:56+09:00","image":"http://kenji.blog/p/%E7%94%9F%E6%88%90ai%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/img_hu1a8581c4b72be646476cf90db2209d32_686551_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E7%94%9F%E6%88%90ai%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/","title":"생성형 AI에 대하여"},{"content":"curl로 QR 코드 생성 주의: 소개하는 방법은 서버 측에서 QR 코드를 생성하여 반환하기 때문에 로그가 남을 수 있습니다. 개인 정보 등 기밀 정보를 QR 코드로 변환할 때는 주의하세요.\n방법 1 명령 프롬프트에서 QR 코드를 생성하는 방법입니다. qrenco.de는 응답을 텍스트 기반으로 반환합니다.\n1 curl qrenco.de/kenji.blog 출력 결과 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 █████████████████████████████ █████████████████████████████ ████ ▄▄▄▄▄ █ ▄ ▄ █ ▄▄▄▄▄ ████ ████ █ █ █ ▀▀▀██ █ █ ████ ████ █▄▄▄█ █▀▀█▀▄█ █▄▄▄█ ████ ████▄▄▄▄▄▄▄█▄▀ ▀ █▄▄▄▄▄▄▄████ ████▄ █▀▄ ▄▀█▄▀ ▀██▄▀ ▄████ ████▀▀▀█ ▄▄ ▄█▄█▀█▀▄██ ▀████ ████▄▄▄██▄▄█ █▀█ ▄██▀▀█ █████ ████ ▄▄▄▄▄ █▀█ ▀ ▄▀▄▄▄ ▀████ ████ █ █ █▄▄ ▄▀▄▀▄ ██ ▀████ ████ █▄▄▄█ █▀▀█ ▀▄▄▄ ▄▄██████ ████▄▄▄▄▄▄▄█▄▄███▄▄█▄███▄████ █████████████████████████████ █████████████████████████████ 참고 qrenco.de 방법 2 api.qrserver.com은 이미지를 반환합니다.\n1 curl -o qr.png \u0026#34;https://api.qrserver.com/v1/create-qr-code/?size=150x150\u0026amp;data=HelloWorld\u0026#34; 출력 결과 참고 QR Code Generator ","date":"2024-04-16T00:42:27+09:00","image":"http://kenji.blog/p/curl%E3%81%A7qr%E3%82%B3%E3%83%BC%E3%83%89%E7%94%9F%E6%88%90/img_hub03976e78daddb607d3d46f69887db4b_11127_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/curl%E3%81%A7qr%E3%82%B3%E3%83%BC%E3%83%89%E7%94%9F%E6%88%90/","title":"curl로 QR 코드 생성"},{"content":"단축키 목록 단축키 설명 Ctrl + B 굵게 Ctrl + I 기울임꼴 Ctrl + U 밑줄 Ctrl + E 가운데 정렬 Ctrl + L 왼쪽 정렬 Ctrl + R 오른쪽 정렬 Ctrl + ] 글꼴 크기 크게 Ctrl + [ 글꼴 크기 작게 Ctrl + C 복사 Ctrl + V 붙여넣기 Ctrl + X 잘라내기 Ctrl + Z 실행 취소 Ctrl + Y 다시 실행 Ctrl + A 모두 선택 Shift + 방향키 범위 선택 Ctrl + F 텍스트 찾기 Ctrl + H 텍스트 바꾸기 Ctrl + P 인쇄 미리보기 표시 Ctrl + S 문서 저장 F12 다른 이름으로 저장 Ctrl + Home 문서의 시작으로 이동 Ctrl + End 문서의 끝으로 이동 참고 Word의 키보드 단축키 ","date":"2024-04-07T14:18:51+09:00","image":"http://kenji.blog/p/microsoft-word%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E4%B8%80%E8%A6%A7/img_hu52c1b9e3b4195e8df02b1851180b33b3_10388_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/microsoft-word%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E4%B8%80%E8%A6%A7/","title":"Microsoft Word의 단축키 목록"},{"content":"웹 페이지를 자동으로 새로고침하는 Edge 브라우저 확장 기능 \u0026lsquo;탭 자동 새로고침\u0026rsquo;을 소개합니다.\n탭 자동 새로고침 설치 탭 자동 새로고침\n위 사이트에 접속하여 설치를 클릭합니다.\n확장 기능 추가를 클릭합니다.\n사용법 설치가 완료되면 Edge의 우측 상단에 아이콘이 추가됩니다.\n자동으로 새로고침할 웹 페이지를 열고 아이콘을 클릭하면 자동 새로고침이 시작됩니다.\n녹색 테두리 부분이 자동 새로고침되는 간격입니다. 자동 새로고침할 타이밍을 선택해 주세요.\n자동 새로고침을 중지하려면 아이콘을 클릭하고 Stop reloading this tab을 클릭합니다.\n","date":"2024-04-06T15:36:54+09:00","image":"http://kenji.blog/p/web%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AE%E8%87%AA%E5%8B%95%E6%9B%B4%E6%96%B0%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E6%8B%A1%E5%BC%B5edge%E3%82%A2%E3%83%89%E3%82%AA%E3%83%B3/img_hu57eb7510f8ab42d5a8107b2d3db76a45_3448_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/web%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AE%E8%87%AA%E5%8B%95%E6%9B%B4%E6%96%B0%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E6%8B%A1%E5%BC%B5edge%E3%82%A2%E3%83%89%E3%82%AA%E3%83%B3/","title":"웹 페이지 자동 새로고침 브라우저 확장 프로그램 (Edge 애드온)"},{"content":"Visual Studio 단축키 목록 개인적으로 자주 사용하는 Visual Studio 단축키를 목록으로 정리했습니다. Visual Studio의 단축키는 키보드 조작을 익힘으로써 효율적으로 개발 작업을 진행할 수 있습니다. 꼭 활용해 보세요.\n※Visual Studio 2022에서 확인했습니다.\n단축키 설명 F1 선택한 단어의 도움말 표시 F2 북마크로 이동 Ctrl + F2 북마크 등록 Ctrl + Shift + F2 모든 북마크 삭제 F5 빌드 후 실행 (디버그 실행) Ctrl + F5 빌드 후 실행 (디버그 없이) F7 빌드 F9 커서가 있는 줄에 중단점 추가 Ctrl + F9 커서가 있는 줄의 중단점을 비활성화 Shift + Ctrl + F9 모든 중단점 삭제 F10 프로시저 단위 실행 (Step Over) F11 한 단계씩 코드 실행 (Step Into) F12 정의로 이동 Ctrl + D 커서가 있는 줄 복제 Ctrl + X 선택 범위가 없을 때 줄 잘라내기 Ctrl + Shift + ] 커서 부분의 괄호에 대응하는 괄호까지 선택 Alt + 위/아래 방향키 커서가 있는 줄을 위아래로 이동 Alt + Shift + 방향키 멀티 커서 / 사각형 선택 Ctrl + Tab 소스 코드 / 창 표시 전환 Ctrl + Shift + V 클립보드 기록 표시 Ctrl + K 후 Ctrl + C 커서가 있는 줄 주석 처리 Ctrl + K 후 Ctrl + U 커서가 있는 줄 주석 처리 해제 Ctrl + G 줄 번호를 지정하여 이동 Ctrl + F 찾기 Ctrl + Shift + F 전역 찾기 Ctrl + H 바꾸기 Ctrl + Shift + F 전역 바꾸기 Ctrl + Tab 소스 코드 / 창 표시 전환 Ctrl + Space 단어 자동 완성 Ctrl + Alt + L 솔루션 탐색기 창 열기 Ctrl + Shift + E 리소스 뷰 창 열기 Ctrl + 0 후 Ctrl + G Git 커밋 창 열기 참고 Visual Studio의 키보드 단축키 ","date":"2024-04-06T11:27:37+09:00","image":"http://kenji.blog/p/visual-studio-%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E4%B8%80%E8%A6%A7/img_hue1a55f22c15dca7427db7cd2dfd89735_223690_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/visual-studio-%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E4%B8%80%E8%A6%A7/","title":"'Visual Studio 단축키 목록'"},{"content":"Windows 10/11에서 파일 탐색기의 우클릭 메뉴에 히데마루 에디터의 grep을 추가하는 방법을 소개합니다.\n※ 다음 절차는 레지스트리를 변경하므로 본인의 책임 하에 진행해 주십시오.\n절차 아래 링크를 열어 원하는 폴더에 저장합니다. 히데마루 레지스트리 등록.reg\n秀丸レジストリ登録.reg 파일을 더블 클릭하여 레지스트리에 추가합니다. 참고 폴더 우클릭 메뉴에서 히데마루 grep 실행하기 ","date":"2024-04-03T00:00:46+09:00","image":"http://kenji.blog/p/%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%AE%E5%8F%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%81%AB%E7%A7%80%E4%B8%B8%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BFgrep%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B/img_hu1bfa3588f39c8e6af312f48159d52b67_932_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%AE%E5%8F%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%81%AB%E7%A7%80%E4%B8%B8%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BFgrep%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B/","title":"'파일 탐색기 우클릭 메뉴에 히데마루 에디터 grep 추가하기'"},{"content":"생일 역설을 아시나요? 조금 신기한 이야기를 해볼까 합니다. \u0026lsquo;같은 생일인 사람이 있을 확률\u0026rsquo;은 몇 명 정도 모여야 높아질 것이라 생각하시나요?\n예를 들어 1년은 365일이므로, \u0026lsquo;23명이 모여서 누군가와 생일이 겹칠 확률은 50% 이상\u0026rsquo;이라고 한다면… 왠지 직관에 어긋나는 느낌이 드실 겁니다.\n하지만 이것은 정말 50% 이상입니다.\n왜 그런 일이 발생할까요? 이 현상은 \u0026lsquo;생일 역설\u0026rsquo;이라고 불립니다. 이름은 \u0026lsquo;역설(패러독스)\u0026lsquo;이지만, 제대로 된 수학적인 이유가 있습니다.\n인원수를 \u0026rsquo;n\u0026rsquo;이라고 했을 때, 아무도 생일이 겹치지 않을 확률 은 다음 수식으로 구할 수 있습니다:\n1 P(아무도 겹치지 않음) = 365/365 × 364/365 × 363/365 × ... × (365 - n + 1)/365 이 값을 1에서 빼면 \u0026lsquo;누군가와 겹칠 확률\u0026rsquo;이 나옵니다.\n결과를 살펴보면… 인원수 같은 생일인 사람이 있을 확률 10명 약 11.7% 20명 약 41.1% 23명 약 50.7% (여기가 주목!) 30명 약 70.6% 70명 무려 약 99.9%! 즉, 단 23명 만 있으면 절반 이상의 확률로 누군가와 생일이 겹치게 됩니다. 학교 학급이나 직장 회의에서도 꽤 자주 들어맞을 것 같죠.\n요약: 직관과 수학의 차이가 재미있다 \u0026lsquo;생일 역설\u0026rsquo;은 우리의 직관과 실제 수학적인 확률이 어긋나는 재미있는 예입니다. 이런 이야기를 알아두면 가벼운 잡담이나 퀴즈로 분위기를 띄울 수 있을지도 모릅니다!\n참고 링크 생일 역설 (Wikipedia) ","date":"2024-04-02T01:20:50+09:00","image":"http://kenji.blog/p/%E3%83%90%E3%83%BC%E3%82%B9%E3%83%87%E3%82%A4%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9%E3%81%A8%E3%81%AF/img_huf1a218b90023063d558c5c810438e753_117620_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%83%90%E3%83%BC%E3%82%B9%E3%83%87%E3%82%A4%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9%E3%81%A8%E3%81%AF/","title":"'생일 역설이란?'"},{"content":"Snipping Tool이란 Snipping Tool은 Windows에 기본 탑재되어 있는 스크린샷 도구입니다. 화면의 일부를 잘라서 저장하거나, 화면 전체를 캡처하거나, 녹화할 수 있습니다.\nSnipping Tool 실행 방법 주로 다음 3가지 방법으로 실행할 수 있습니다.\nWin키를 누르고, Snipping Tool을 입력한 후 Enter키를 누릅니다. Win키 + Shift + S키를 누릅니다. Win키 + R키를 누르고, snippingtool을 입력한 후 Enter키를 누릅니다. Snipping Tool 사용법 캡처 이미지를 저장하는 방법은 다음과 같습니다. 카메라 마크를 선택합니다. 새로 만들기 버튼을 클릭합니다. 캡처할 영역을 선택합니다. 다른 이름으로 저장 버튼을 클릭합니다. 저장 위치와 파일명을 입력하고 저장합니다. 캡처 동영상을 복사하는 방법은 다음과 같습니다. 비디오 마크를 선택합니다. 새로 만들기 버튼을 클릭합니다. 캡처할 영역을 선택합니다. 시작 버튼을 클릭합니다. 화면 녹화를 합니다. 중지 버튼을 클릭합니다. 다른 이름으로 저장 버튼을 클릭합니다. 저장 위치와 파일명을 입력하고 저장합니다. 참고 Snipping Tool을 사용하여 스크린샷 캡처하기 ","date":"2024-04-01T23:19:45+09:00","image":"http://kenji.blog/p/snipping-tool%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/img_hu405fe4bbcac8bf4b2046262eb8f35d4a_18613_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/snipping-tool%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/","title":"'Snipping Tool 사용법'"},{"content":"컴퓨터를 잠그는 바로 가기를 만드는 방법을 소개합니다.\n만든 바로 가기를 바탕화면 등에 두고 더블클릭하면 컴퓨터를 잠글 수 있어 편리합니다.\n만드는 방법 1. 바탕화면에서 우클릭하여, 새로 만들기＞바로 가기를 선택 2. 바로 가기 만들기 화면이 표시되면 rundll32.exe user32.dll,LockWorkStation을 입력하고 다음을 클릭 3. 바로 가기 이름 컴퓨터 잠금을 입력하고 마침을 클릭 4. 생성된 바로 가기 아이콘 변경하기 생성된 바로 가기를 우클릭하여 속성을 선택\n아이콘 변경을 클릭\n노란색 사각형 아이콘을 선택하고 확인을 클릭, 다시 확인을 클릭하여 속성 창을 닫음\n이상.\n생성된 바로 가기를 더블클릭하면 컴퓨터가 잠깁니다.\nWin키 + L키를 눌러도 똑같이 컴퓨터를 잠글 수 있습니다.\n※주의: 컴퓨터 잠금 확인 대화 상자는 표시되지 않습니다.\n","date":"2024-04-01T01:37:49+09:00","image":"http://kenji.blog/p/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%92%E3%83%AD%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hud14aa91db8f19c318807d0f2f72ee0fc_128434_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%92%E3%83%AD%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"'컴퓨터 잠금 바로 가기를 만드는 방법'"},{"content":"몬티 홀 문제란 몬티 홀 문제란, 미국의 텔레비전 프로그램 「Let\u0026rsquo;s Make a Deal」에서 진행되었던 게임 중 하나로, 다음과 같은 문제입니다.\n전제 조건：3개의 문 중 1개에는 상품이 들어 있고, 나머지 2개에는 꽝이 들어 있다.\n참가자는 3개의 문 중 1개를 선택합니다. 사회자는 참가자가 선택한 문 이외의 2개의 문 중, 꽝인 1개의 문을 엽니다. 참가자에게 선택한 문을 변경할지 여부를 묻습니다. 이때, 참가자는 문을 변경하는 것이 좋은지, 변경하지 않는 것이 좋은지를 생각하는 문제입니다.\n해법 몬티 홀 문제의 해법은 다음과 같습니다.\n참가자가 처음에 선택한 문을 변경하지 않을 경우\n당첨 확률：1/3 꽝일 확률：2/3 사회자가 꽝인 문을 연 후\n변경하지 않을 경우, 당첨 확률：1/3 (1.의 당첨 확률에서 변하지 않음) 변경할 경우, 당첨 확률：2/3 (1.의 당첨 이외의 확률) 따라서, 참가자가 문을 변경하는 편이 당첨 확률이 높아집니다.\n참고 Wikipedia Monty Hall problem ","date":"2024-03-31T23:41:51+09:00","image":"http://kenji.blog/p/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%A3%E3%83%9B%E3%83%BC%E3%83%AB%E5%95%8F%E9%A1%8C/img_1_hu20d98afb87b485a440eb6d6beaf3ac5e_189614_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%A3%E3%83%9B%E3%83%BC%E3%83%AB%E5%95%8F%E9%A1%8C/","title":"'몬티 홀 문제'"},{"content":"micro 다운로드하기 https://github.com/zyedidia/micro/releases\n위 링크를 열고 Show all XX assets(X 부분은 숫자)를 클릭하여 micro-X.X.XX-win64.zip(X 부분은 숫자)을 다운로드합니다. zip 파일의 압축을 풀고, 파일 일체를 임의의 폴더에 배치합니다.\n환경 변수 설정하기 명령 프롬프트에서 micro.exe를 사용하려면 환경 변수를 설정해야 합니다.\nWin키 + R키를 누르고, sysdm.cpl을 입력한 뒤 Enter키를 누릅니다. 시스템 속성의 시스템 속성을 클릭합니다. 환경 변수를 클릭합니다. 시스템 환경 변수의 Path를 선택하고 편집을 클릭합니다. 새로 만들기를 클릭하여, micro.exe가 포함된 폴더의 경로를 추가합니다. 확인을 클릭하여 모든 대화 상자를 닫습니다. 명령 프롬프트를 다시 시작하고, nano라고 입력하여 실행할 수 있는지 확인합니다. micro 사용 방법 명령 프롬프트에서 micro라고 입력하여 실행하면, 다음과 같은 화면이 표시됩니다. 주요 조작 방법과 단축키는 다음과 같습니다.\n단축키 조작 Ctrl+Q 파일 닫기 Ctrl+S 파일 저장 Ctrl+O 파일 열기 Ctrl+A 전체 선택 Ctrl+X 선택 범위 잘라내기 Ctrl+C 선택 범위 복사 Ctrl+V 붙여넣기 Ctrl+Z 실행 취소 Ctrl+Y 다시 실행 Ctrl+E 에디터 명령 실행 참고 micro ","date":"2024-03-31T21:50:39+09:00","image":"http://kenji.blog/p/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BFmicro%E3%82%92windows%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu5c724e25c36dcf3781d5276f98286fd4_13721_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BFmicro%E3%82%92windows%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Windows에 텍스트 에디터 micro를 설치하는 방법"},{"content":"nano.exe 다운로드하기 https://sourceforge.net/projects/nano-for-windows/\n위의 링크를 열고, Download를 클릭하여 GNU-Nano_Win32(static).zip을 다운로드한다. zip 파일을 압축 해제하고, 임의의 폴더에 nano.exe를 배치한다. ※일본어 입력은 지원하지 않는다. (2024/03/31 현재)\n환경 변수 설정하기 명령 프롬프트에서 nano.exe를 사용하려면, 환경 변수를 설정해야 한다.\nWin 키 + R 키를 눌러 sysdm.cpl을 입력하고 Enter 키를 누른다. 시스템 속성의 시스템 속성을 클릭한다. 환경 변수를 클릭한다. 시스템 환경 변수의 Path를 선택하고 편집을 클릭한다. 새로 만들기를 클릭하고, nano.exe의 경로를 추가한다. 확인을 클릭하여 모든 대화 상자를 닫는다. 명령 프롬프트를 재시작하고, nano를 입력하여 실행할 수 있는지 확인한다. nano 사용법 nano를 입력하여 실행하면, 다음과 같은 화면이 표시된다.\n화면 하단에 단축키 설명이 표시되어 있다.\n기호의 의미는 다음과 같다.\n^는 Ctrl 키를 나타낸다. M-은 Alt 키를 나타낸다. 저장하고 닫으려면, Ctrl + S를 누른 후에, Ctrl + X를 누른다.\n참고 GNU nano ","date":"2024-03-31T18:09:32+09:00","image":"http://kenji.blog/p/cli%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BFnano%E3%82%92windows%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_1_hud0bad6678c124835195c96dbf5908709_45668_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/cli%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BFnano%E3%82%92windows%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"CLI 텍스트 에디터 nano를 Windows에 설치하는 방법"},{"content":"wsl에서 「Temporary failure resolving～」라고 표시되는 경우의 대처 방법 1 2 3 4 kenji@MyComputer:~$ sudo apt update [sudo] password for kenji: Err:1 http://archive.ubuntu.com/ubuntu focal InRelease Temporary failure resolving \u0026#39;archive.ubuntu.com\u0026#39; wsl에서 위 오류가 표시될 때는 DNS 서버 설정이 올바르지 않을 가능성이 있습니다. 제 환경에서는 다음 절차로 해결했습니다.\nwsl을 시작합니다. sudo nano /etc/resolv.conf를 실행합니다. nameserver 줄을 다음과 같이 변경합니다. 1 nameserver 8.8.8.8 Ctrl + S로 저장하고, Ctrl + X로 종료합니다. sudo apt update를 실행합니다. 오류가 표시되지 않으면 해결된 것입니다. 위 절차로 해결되지 않는 경우 위 절차로 해결되지 않는 경우도 있는 것 같습니다. 다음 기사를 참고하세요.\nWSL에서 apt update 시의 『Temporary failure resolving ～』를 해결하는 방법 ","date":"2024-03-31T16:57:33+09:00","image":"http://kenji.blog/p/wsl-%E3%81%A7temporary-failure-resolving%E3%81%A8%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95/img_hu6b9065bcca76a2739d7c532080d71efa_118604_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/wsl-%E3%81%A7temporary-failure-resolving%E3%81%A8%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95/","title":"wsl에서 「Temporary failure resolving～」라고 표시되는 경우의 대처 방법"},{"content":"작업 표시줄 우클릭으로 종료하는 방법 이것은 Windows 10에서의 방법입니다. Windows 11에서는 메뉴가 표시되지 않는 것 같습니다. 작업 표시줄에서 Shift 키와 Ctrl 키를 누른 상태에서 우클릭을 하면, 메뉴에 탐색기 종료가 표시됩니다.\n작업 관리자에서 종료하는 방법 Ctrl + Shift + Esc 키를 눌러 작업 관리자를 실행합니다. 세부 정보를 선택합니다. explorer.exe 를 선택하고, Delete 키를 누르면, explorer.exe를 종료하시겠습니까?라고 묻기 때문에, 프로세스 종료를 선택합니다. 명령 프롬프트에서 종료하는 방법 Win + R 키를 눌러서, cmd 라고 입력하고, Enter 키를 누릅니다. taskkill /f /im explorer.exe 라고 입력하고, Enter 키를 누릅니다. 작업 관리자에서 탐색기를 실행하는 방법 Ctrl + Shift + Esc 키를 눌러 작업 관리자를 실행합니다. 파일 메뉴에서, 새 작업 실행을 선택합니다. explorer.exe 라고 입력하고, Enter 키를 누릅니다. ","date":"2024-03-30T15:40:24+09:00","image":"http://kenji.blog/p/%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%AE%E7%B5%82%E4%BA%86%E5%86%8D%E8%B5%B7%E5%8B%95%E6%96%B9%E6%B3%95/img_2_hue735828bd961ff4973e3abea5e21f198_20142_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%AE%E7%B5%82%E4%BA%86%E5%86%8D%E8%B5%B7%E5%8B%95%E6%96%B9%E6%B3%95/","title":"'탐색기 종료 및 재시작 방법'"},{"content":"Windows 11의 오른쪽 클릭 메뉴를 이전 버전으로 되돌리는 방법 Windows 11의 오른쪽 클릭 메뉴를 이전 버전으로 되돌리는 방법을 소개합니다.\n레지스트리 편집기를 엽니다. Win키 + R키를 누르고, regedit를 입력한 후 Enter키를 누릅니다. HKEY_CURRENT_USER\\Software\\Classes\\CLSID\\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}로 이동합니다. 이 키가 없는 경우 새로 만듭니다.\nHKEY_CURRENT_USER\\Software\\Classes\\CLSID\\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\\InprocServer32로 이동합니다. 이 키가 없는 경우 새로 만듭니다.\nInprocServer32의 (기본값)에 데이터가 설정되어 있지 않은지 확인합니다.\n컴퓨터를 다시 시작합니다. 오른쪽 클릭 메뉴가 이전 버전으로 되돌아갔는지 확인합니다. ","date":"2024-03-30T13:13:36+09:00","image":"http://kenji.blog/p/windows-11%E3%81%AE%E5%8F%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%92%E5%BE%93%E6%9D%A5%E7%89%88%E3%81%AB%E6%88%BB%E3%81%99%E6%96%B9%E6%B3%95/img_hub131b7dada89fffcdae45f20639b1ab3_50623_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/windows-11%E3%81%AE%E5%8F%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%92%E5%BE%93%E6%9D%A5%E7%89%88%E3%81%AB%E6%88%BB%E3%81%99%E6%96%B9%E6%B3%95/","title":"'Windows 11의 오른쪽 클릭 메뉴를 이전 버전으로 되돌리는 방법'"},{"content":"JetBrains Mono JetBrains에서 제공하는 오픈 소스 프로그래밍 폰트입니다.\n다운로드: https://www.jetbrains.com/ja-jp/lp/mono/\nHackGen 백원(하쿠겐/HackGen)은 프로그래밍용 영문 폰트 Hack과 본고딕의 파생 폰트인 겐쥬고딕을 합성한 프로그래밍 폰트입니다.\n다운로드: https://github.com/yuru7/HackGen/releases\nRicty Diminished Ricty Diminished(릭티 디미니시드)는 Ricty의 자매 폰트이며, Inconsolata와 Migu 1M이 아닌, Inconsolata와 Circle M+ 1m을 Ricty 생성 스크립트로 합성한 폰트입니다. IPA 고딕의 글리프를 포함하지 않기 때문에 사용할 수 있는 한자 글리프 수가 적은 대신, SIL Open Font License 하에 배포가 가능합니다.\n다운로드: https://rictyfonts.github.io/diminished\nCica 영숫자, 기호류에 Hack + DejaVu Sans Mono. 그 외의 문자에 Rounded Mgen+를 사용한 프로그래밍 폰트입니다.\n다운로드: https://github.com/miiton/Cica/releases\n참고:\nHack DejaVu Sans Mono Rounded Mgen+ Migu M+와 IPA의 합성 폰트입니다.\n다운로드: https://itouhiro.github.io/mixfont-mplus-ipa/migu/\nOsaka Mac OS 기본 폰트인 Osaka를 Windows에서 사용할 수 있게 만든 폰트입니다.\n다운로드: http://ifs.nog.cc/osakattf.hp.infoseek.co.jp/\nPlemolJP IBM사가 릴리스한 오픈 소스 일본어 폰트 IBM Plex Sans JP와 마찬가지로 IBM사의 Plex 시리즈인 IBM Plex Mono를 조합한 프로그래밍 폰트입니다.\n다운로드: https://github.com/yuru7/PlemolJP/releases\n","date":"2024-03-30T02:21:31+09:00","image":"http://kenji.blog/p/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E9%9B%86/img_hu5455a1c7ae52190ddcafb3051b00c15b_52757_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E9%9B%86/","title":"'프로그래밍에서 사용할 수 있는 폰트 모음'"},{"content":"명령어 \u0026lsquo;hide\u0026rsquo;로 Hidemaru 에디터를 실행하는 방법을 소개합니다. 주석: 이 방법은 Windows 10/11에서 동작을 확인했습니다.\n레지스트리 편집기를 엽니다. HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths로 이동합니다. App Paths에 hide.exe라는 키를 생성합니다. ※이 키 이름의 .exe 앞부분이 명령어 이름이 됩니다. hide.exe 키의 (기본값)에 Hidemaru 에디터의 실행 파일 경로를 설정합니다. 제 환경에서는 \u0026quot;C:\\Program Files (x86)\\Hidemaru\\Hidemaru.exe\u0026quot;였습니다. hide.exe 키에 Path라는 문자열 값을 생성합니다. Path의 데이터에 Hidemaru 에디터의 실행 파일이 있는 폴더의 경로를 설정합니다. 제 환경에서는 \u0026quot;C:\\Program Files (x86)\\Hidemaru\u0026quot;였습니다. 이제 Win 키 + R 키로 표시되는 실행 창에서 hide라는 명령어로 Hidemaru 에디터를 실행할 수 있게 됩니다. 또한, 명령 프롬프트에서는 start hide라는 명령어로 Hidemaru 에디터를 실행할 수 있습니다. 1 2 3 4 5 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\hide.exe] @=\u0026#34;\\\u0026#34;C:\\\\Program Files (x86)\\\\Hidemaru\\\\Hidemaru.exe\\\u0026#34;\u0026#34; \u0026#34;Path\u0026#34;=\u0026#34;\\\u0026#34;C:\\\\Program Files (x86)\\\\Hidemaru\\\\\\\u0026#34;\u0026#34; 위의 내용을 .reg 파일로 저장하여 실행하면, 레지스트리에 설정이 추가됩니다.\n","date":"2024-03-29T23:45:37+09:00","image":"http://kenji.blog/p/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89hide%E3%81%A7%E7%A7%80%E4%B8%B8%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%82%92%E7%AB%8B%E3%81%A1%E4%B8%8A%E3%81%92%E3%82%8B%E6%96%B9%E6%B3%95/img_2_hu43898a3aaad9ace099d9a060bc7203e5_68153_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89hide%E3%81%A7%E7%A7%80%E4%B8%B8%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%82%92%E7%AB%8B%E3%81%A1%E4%B8%8A%E3%81%92%E3%82%8B%E6%96%B9%E6%B3%95/","title":"명령어 ''hide''로 Hidemaru 에디터를 실행하는 방법"},{"content":"수학의 미해결 문제 수학의 미해결 문제에 대해 설명합니다. 문제 자체는 단순해도, 증명되지 않은 문제가 아직 많이 있습니다.\n완전수는 무수히 많은가? 완전수란, 자기 자신을 제외한 양의 약수의 합이 자기 자신과 같은 자연수입니다. 예를 들어,\n6은 약수가 1, 2, 3이 되며, 1+2+3=6이므로 완전수입니다. 28은 약수가 1, 2, 4, 7, 14가 되며, 1+2+4+7+14=28이므로 완전수입니다. 현재 51개밖에 발견되지 않았지만, 무수히 많을 것으로 예상되고 있습니다만, 아직 증명되지 않았습니다.\n골드바흐의 추측 골드바흐의 추측은, 2보다 큰 모든 짝수는 두 소수의 합으로 나타낼 수 있다는 추측입니다. (여기서 소수란, 1과 자기 자신 이외의 약수를 가지지 않는 자연수입니다.)\n예를 들어,\n4=2+2 6=3+3 8=3+5 10=3+7=5+5 문제 자체는 매우 단순하지만, 아직까지 증명되지 않았습니다.\n리만 가설 리만 제타 함수의 영점이, 음의 짝수와, 실수부가 1 / 2 인 복소수에 한정된다는 추측이다.\n리만 제타 함수는, $s$를 복소수, $n$을 자연수라고 할 때,\n$$\\zeta(s):=\\sum _{n=1}^{\\infty }{\\frac {1}{n^{s}}}=1+{\\frac {1}{2^{s}}}+{\\frac {1}{3^{s}}}+{\\frac {1}{4^{s}}}+\\cdots$$ 로 정의되는 함수 $\\zeta$를 말한다.\n","date":"2024-03-02T22:57:36+09:00","image":"http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E6%9C%AA%E8%A7%A3%E6%B1%BA%E5%95%8F%E9%A1%8C/img_hub174c33a50b5d9de07ec5dc9c7de1bd4_731181_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E6%9C%AA%E8%A7%A3%E6%B1%BA%E5%95%8F%E9%A1%8C/","title":"수학의 미해결 문제"},{"content":"여러 가지 버전 정보 대화 상자를 모아보았다 Windows 11 우선 지금 사용하고 있는 Windows 11의 버전 정보입니다. IntelliJ IDEA (Community Edition) 이 블로그를 작성하고 있는 환경입니다. Visual Studio Code 이것 또한 자주 사용하는 에디터입니다. 의외로 심플합니다. Visual Studio 이것은 C++에서 사용하고 있는 개발 환경입니다. LINE(Windows) 이것은 LINE의 Windows 버전입니다. Paint.NET 이것은 이미지 편집 소프트웨어입니다. sakura에디터 이것은 텍스트 에디터입니다. Google Chrome 이것은 Google Chrome입니다. Edge 등장 이후에는 잘 사용하지 않게 되었습니다. Firefox 이것은 Firefox입니다. 최근에는 잘 사용하지 않습니다. Microsoft Edge 이것은 Microsoft Edge입니다. 최근에는 이것을 사용하는 경우가 많습니다. OBS Studio 이것은 OBS Studio입니다. 최근에는 잘 사용하지 않습니다. TradingView 이것은 TradingView입니다. 최근에는 달러/엔 차트를 보는데 사용하고 있습니다. Spy++ 이것은 Spy++입니다. Windows SDK에 포함된 툴입니다. depency walker 이것은 depency walker입니다. Windows SDK에 포함된 툴입니다. resource hacker 이것은 resource hacker입니다. 실행 파일의 리소스를 편집·가져오는 툴입니다. Microsoft Excel 이것은 Microsoft Excel입니다. bandy cam 이것은 bandy cam입니다. 동영상 캡처 툴입니다. winmerge 이것은 winmerge입니다. 파일의 차이를 보는 툴입니다. iTunes 이것은 iTunes입니다. 최근에는 잘 사용하지 않습니다. 秀丸에디터 이것은 秀丸에디터입니다. 텍스트 에디터입니다. Adobe Photoshop CS6 이것은 Adobe Photoshop CS6입니다. Adobe Illustrator CS6 이것은 Adobe Illustrator CS6입니다. ESET NOD32 이것은 ESET NOD32입니다. NotePad++ 이것은 NotePad++입니다. 텍스트 에디터입니다. MIFES 이것은 MIFES입니다. 최근에는 잘 사용하지 않습니다. ","date":"2024-03-02T21:32:11+09:00","image":"http://kenji.blog/p/%E3%81%84%E3%82%8D%E3%82%93%E3%81%AA%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E6%83%85%E5%A0%B1%E3%83%80%E3%82%A4%E3%82%A2%E3%83%AD%E3%82%B0%E9%9B%86%E3%82%81%E3%81%A6%E3%81%BF%E3%81%9F/img_hub829fc9858068bdd622cbafca10cd245_20954_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%81%84%E3%82%8D%E3%82%93%E3%81%AA%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E6%83%85%E5%A0%B1%E3%83%80%E3%82%A4%E3%82%A2%E3%83%AD%E3%82%B0%E9%9B%86%E3%82%81%E3%81%A6%E3%81%BF%E3%81%9F/","title":"'여러 가지 버전 정보 대화 상자를 모아보았다'"},{"content":"GIF 애니메이션 화면 녹화 도구 화면을 녹화하여 GIF 애니메이션으로 만드는 도구를 만들었습니다. 이 도구를 사용하면 화면상의 조작 등을 녹화하여 Microsoft Teams 등 커뮤니케이션 도구 등에서 공유할 수 있습니다.\n사용법 도구를 실행합니다. 녹화할 범위를 지정합니다. 지정하지 않을 경우, 화면 전체가 녹화됩니다. 녹화 버튼을 누릅니다. 녹화 종료 버튼을 누릅니다. 실행 파일과 같은 위치에 GIF 애니메이션이 출력됩니다. 다운로드 다운로드\n위의 링크를 열고, GIFScreenRecorder.exe 링크를 클릭하여 실행 파일을 다운로드해 주세요.\n소스 코드 GitHub\n","date":"2024-02-08T01:23:01+09:00","image":"http://kenji.blog/p/gif%E3%82%A2%E3%83%8B%E3%83%A1%E7%94%BB%E9%9D%A2%E9%8C%B2%E7%94%BB%E3%83%84%E3%83%BC%E3%83%AB/img_hua1d1e581d2290ce1c516887dff1e6eb0_11957_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/gif%E3%82%A2%E3%83%8B%E3%83%A1%E7%94%BB%E9%9D%A2%E9%8C%B2%E7%94%BB%E3%83%84%E3%83%BC%E3%83%AB/","title":"'GIF 애니메이션 화면 녹화 도구'"},{"content":"PMP 수험 공부 요약 PMP 수험 공부 요약입니다.\n개요 PMP는 프로젝트 관리 자격증입니다. PMBOK(최신 7판)이라는 가이드북을 기반으로 한 자격증입니다. PMP 시험은 230분 동안 180문제가 출제되지만 5문제는 더미 문제이므로 175문제 중 106문제 이상 정답을 맞히면 합격입니다. 답변은 선택형이며, 대부분은 4지선다형이지만 중에는 5지선다형 혹은 복수 선택형이 있습니다.\n서번트 리더십 위에서 명령하는 것이 아니라 아래에서 지원하는 리더십 스타일.\n서번트 리더십의 10가지 원칙(특징) 경청 공감 치유 인지 설득 개념화 선견지명 청지기 의식 사람들의 성장에 대한 헌신 커뮤니티 형성 애자일 선언 4가지 가치 우리는 소프트웨어 개발을 실천하거나 실천을 돕는 활동을 통해, 더 나은 개발 방법을 찾아내려 하고 있다. 이 활동을 통해, 우리는 다음의 가치에 이르렀다.\n프로세스나 도구보다 개인과 상호작용을, 포괄적인 문서보다 작동하는 소프트웨어를, 계약 협상보다 고객과의 협력을, 계획을 따르기보다 변화에 대응하기를, 가치로 삼는다. 즉, 왼쪽의 항목들에 가치가 있음을 인정하면서도, 우리는 오른쪽 항목들에 더 높은 가치를 둔다.\n애자일 선언\n애자일 애자일 선언 이면의 12가지 원칙 고객 만족을 최우선으로 하고 가치 있는 소프트웨어를 일찍 지속적으로 제공합니다. 요구사항 변경은 비록 개발 후기라 하더라도 환영합니다. 변화를 우군으로 삼아 고객의 경쟁력을 높입니다. 작동하는 소프트웨어를 2-3주에서 2-3개월이라는 가능한 짧은 시간 간격으로 릴리스합니다. 비즈니스 쪽 사람들과 개발자들은 프로젝트 내내 매일 함께 일해야 합니다. 의욕이 넘치는 사람들로 프로젝트를 구성합니다. 환경과 지원을 제공하고 일이 무사히 끝날 때까지 그들을 신뢰합니다. 정보를 전달하는 가장 효율적이고 효과적인 방법은 얼굴을 마주보고 대화하는 것입니다. 작동하는 소프트웨어만이 진척의 가장 중요한 척도입니다. 애자일 프로세스는 지속 가능한 개발을 촉진합니다. 일정한 속도를 지속적으로 유지할 수 있어야 합니다. 기술적 탁월성과 우수한 설계에 대한 끊임없는 주의가 기민성을 높입니다. 단순함(낭비 없이 만들 수 있는 양을 최대화하는 것)이 본질입니다. 최상의 아키텍처, 요구사항, 설계는 자기 조직적인 팀에서 나옵니다. 팀은 어떻게 하면 효율을 높일 수 있을지 정기적으로 회고하고, 그에 따라 자신들의 방식을 최적으로 조정합니다. 애자일 선언 이면의 원칙\n용어 에픽(개략) 사용자 스토리(프로덕트 백로그에 등록하는 단위, 우선순위 지정을 수행하는 단위) 태스크(기술적인 작업 항목, 소요 시간 추정 대상) 프로덕트 백로그 / 프로덕트 백로그 아이템 프로덕트 오너 이해관계자 애자일 실무 가이드(서적) 린 개발 칸반 가치 사슬 (Value Chain) AC (Actual Cost) EV (Earned Value) PV (Planned Value) EVA (Earned Value Analysis) SPI (Schedule Performance Index = EV / PV) CPI (Cost Performance Index = EV / AC) EVM (Earned Value Management) 획득 가치 관리 BAC (완료 시 예산) ETC (Estimate To Complete) EAC (Estimate At Completion) 기능형 매트릭스형 프로젝트형 서번트 리더십 터크먼 모델 (형성기, 격동기, 규범기, 성취기, 해산기) 팀 헌장 플래닝 포커 (피보나치 수열) 레트로스펙티브 (회고 활동) 가상 팀 프로젝트 헌장 갈등 (6가지 대처법: 대면/문제 해결, 협력, 타협, 완화/수용, 강제, 철회/회피) 가치 흐름 매핑 멘토링 코칭 트레이닝 더글라스 맥그리거의 XY 이론 SWOT 분석 Strength(강점), Weakness(약점), Opportunity(기회), Threat(위협) SECI 모델 (Socialization 공동화, Externalization 표출화, Combination 연결화, Internalization 내면화) PDCA, PDSA PESTLE (Political 정치, Economic 경제, Social 사회, Technological 기술, Legal 법, Environmental 환경) VUCA (변동성・불확실성・복잡성・모호성) 몬테카를로 기법 의사결정 트리 분석 기대 금전 가치 (EMV) 순 추천 고객 지수 (NPS) 비용 편익 분석 스프린트 리뷰 릴리스 관리 SOW (Statement of Work) 작업 범위 기술서, 작업 명세서 \u0026ldquo;프로젝트의 범위, 목적, 산출물, 기간, 리소스 등의 상세한 설명을 포함하는 문서\u0026rdquo; P-SOW (조달 작업 범위 기술서) RFI (Request For Information) 정보 제공 요청서 RFP (Request For Proposal) 제안 요청서 정액 계약 (FP: Fixed Price) 시간 자재 계약 (T\u0026amp;M: Time and Material) 실비 정산 계약 (CR: Cost Reimbursable) 고정가 인센티브 부과 계약 (FPIF) 스코프 크리프 카노 모델 분석 자금 배분법 100점법 MSCW (Must, Should, Could, Would) 방식 요구사항 추적 매트릭스 WBS 사전 벨로시티 (각 이터레이션에서 달성한 스토리 포인트 수) 벨로시티 차트 관여도 매트릭스 (무지, 저항, 중립, 지지, 주도) 단계 관문 정보 라디에이터 번다운 차트 번업 차트 누적 흐름도 QCD (Quality, Cost, Delivery) 나선형 모델 크리티컬 체인 피처 이터레이션 / 스프린트 반복적 (Iterative) 점진적 (Incremental) 인크리먼트 (증분 산출물) 회복 탄력성 / 레질리언스 스튜어드십 성실하고 신뢰할 수 있는 태도와 책임감 있는 행동 (의사결정) 에스컬레이션 KPT (Keep, Problem, Try) RACI (Responsible, Accountable, Consulted, Informed) PMO (Project Management Office) 지원형, 통제형, 지휘형 케이던스 테일러링 신경 논리적 수준 (환경, 행동, 능력, 신념・가치관, 정체성) 비즈니스 케이스 (프로젝트의 목적이나 이익, 리스크, 투자 대비 효과 등을 문서화한 것) 추세 분석 (런 차트를 사용하여 실행되며, 그 결과를 바탕으로 미래의 성과를 예측하기 위해 수학적 기법을 사용함) 품질 관리 계획서 (프로젝트 산출물의 품질에 관한 전략과 접근 방식을 정의) 거버넌스 프로세스 프로덕트 오너 (프로덕트의 비전, 프로덕트 백로그 우선순위 지정, 프로덕트 릴리스) 프로젝트 오너 (프로젝트 발주자) 프로젝트 관리자 (프로젝트 전체 관리) 프로젝트 리더 (현장 지휘) 프로젝트 팀원 (프로젝트 추진) 하이브리드 접근법 최소 기능 제품 (MVP) 이터레이션 리뷰 워크숍 프로젝트 편익 관리 계획서 (프로젝트 목표의 편익, 편익을 실현하기 위한 전략적 수단 및 편익을 실현하기 위한 기간) 핵심 성과 지표 (KPI) 온사이트 (현장에서, 현지로) 유사 추정 3점 추정 모수 추정 프로젝트 리뷰 빅뱅 접근법 DSDM (Dynamic Systems Development Method) 브룩스의 법칙 빅뱅 접근법 (모두 동시에 일괄적으로 도입) 리스크 레지스터 (프로젝트 내의 잠재적인 차질을 식별하기 위한 리스크 관리 도구로 사용되는 문서입니다) 리스크 등록부 SL 이론 (상대방의 상황에 맞춘 4가지 행동) 역량 몰입 참고 스크럼 가이드 (Ken Schwaber \u0026amp; Jeff Sutherland) PMI ECO (일본어판) 페이지 애자일 실무 가이드 PMI 윤리 및 직무 규정 교재 ｢PMP® 인증 시험｣에 단번에 합격하기! 효율적인 시험 대비를 위한 전략 코스 (2021) 애자일 대응 ","date":"2024-02-04T18:41:31+09:00","image":"http://kenji.blog/p/pmp%E5%8B%89%E5%BC%B7/img_hu67a0961bf8e284d45690ac9cdb09e5b3_16702_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/pmp%E5%8B%89%E5%BC%B7/","title":"'PMP 공부'"},{"content":"개요 일본에서 발생한 자연재해에 대한 메모\n2024년 1월 1일 노토반도 지진 ","date":"2024-01-07T00:50:09+09:00","image":"http://kenji.blog/p/%E6%97%A5%E6%9C%AC%E3%81%AE%E7%81%BD%E5%AE%B3/img_hue649e8d0b3bd837ea85e155e108b15fd_273208_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E6%97%A5%E6%9C%AC%E3%81%AE%E7%81%BD%E5%AE%B3/","title":"'일본의 재해'"},{"content":"칠초 미나리 냉이 떡쑥 별꽃 광대나물 순무 무 ","date":"2024-01-06T22:22:00+09:00","image":"http://kenji.blog/p/%E4%B8%83%E8%8D%89%E7%B2%A5%E3%81%AE%E3%83%AC%E3%82%B7%E3%83%94/img_hu3e148c57f6499065259203ce3bd1c8c5_295252_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E4%B8%83%E8%8D%89%E7%B2%A5%E3%81%AE%E3%83%AC%E3%82%B7%E3%83%94/","title":"칠초죽 레시피"},{"content":"추천 일본 음악 튤립 - 청춘의 그림자 이루카 - 잔설 카와시마 에이고 - 술과 눈물과 남자와 여자 Orangestar - Surges 타케우치 마리야 - Plastic Love RADWIMPS - 전전전세 BEGIN - 섬사람의 보물 더 블루 하츠 - 정열의 장미 아라이 유미 - 루즈의 전언 Begin - 바다의 소리 아라이 유미 - 비행기 구름 Love is Over - 오우양페이페이 클램본 - 파도가 밀려와 RADWIMPS - 스파클 카리유시58 - 안마 카리유시58 - 끝의 시작 테레사 텡 - 시간의 흐름에 몸을 맡기고 우타다 히카루 『One Last Kiss』 불가사의/wonderboy - Pellicule (Official Music Video) Kamen Rider Black RX - Opening Song 확실한 것 / 오다 카즈마사 - Covered by 박유나 【Japanese healing song】Hana／Kosuke Atari（covered by Leah） 「한밤중의 도어〜stay with me」/ 마츠바라 미키 Official Lyric Video Midnight Pretenders Anri - Last Summer Whisper 1985 - The Blue Hearts BUMP OF CHICKEN - supernova 튤립 마음의 여행 1972 작은 사랑의 노래 ASKA - 시작은 언제나 비 (Official Music Video) 키린지 - 에일리언즈 그 날의 하늘이여 - 미나미 코세츠 ","date":"2024-01-06T04:11:01+09:00","image":"http://kenji.blog/p/%E5%A5%BD%E3%81%8D%E3%81%AA%E9%82%A6%E6%A5%BD/img_hub840e0bd8da1fd2845b1fe157b13d9d8_1067024_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E5%A5%BD%E3%81%8D%E3%81%AA%E9%82%A6%E6%A5%BD/","title":"'좋아하는 일본 음악'"},{"content":"추천 팝송 Keane - Somewhere Only We Know Ben E. King - Stand By Me The Beatles - Hey Jude The Mamas \u0026amp; The Papas - California Dreamin' Ed Sheeran - Shape of You Mark Ronson ft. Bruno Mars – Uptown Funk Sugar - Maroon 5 Bette Midler - The Rose Green Day - Basket Case Coldplay - Viva La VidaViva La Vida Maroon 5 - Memories (Lyrics) Dido - Thank You (Official Video) 밥 딜런 - Blowin\u0026rsquo;The Wind(바람만이 아는 대답) Coldplay - Yellow Eric Clapton - Tears In Heaven B. J. Thomas - Raindrops Keep Fallin\u0026rsquo; on My Head (Stereo / Lyrics) Take Me Home, Country Roads Simon \u0026amp; Garfunkel - Mrs. Robinson (Audio) Taylor Swift - Love Story (Live on Letterman) Wiz Khalifa - See You Again ft. Charlie Puth [Official Video] Furious 7 Soundtrack The Top (Extended Mix) Something Just Like This 필링 Yesterday Once More Carpenters - Top Of The World 청춘의 빛 / I Need To Be In Love [일본어 번역 포함]　카펜터스 Bob Marley \u0026amp; The Wailers \u0026ldquo;Three Little Birds\u0026rdquo; Alan Walker - All Falls Down (feat. Noah Cyrus with Digital Farm Animals) Alan Walker - Darkside (feat. Au/Ra and Tomine Harket) Alan Walker - Alone Alan Walker - Sing Me To Sleep Alan Walker - Faded killing me softly with his song a-ha - Take On Me (Official Video) ","date":"2024-01-05T00:14:22+09:00","image":"http://kenji.blog/p/%E5%A5%BD%E3%81%8D%E3%81%AA%E6%B4%8B%E6%A5%BD/img_hued679cc884753e5576b95c5f8e6f029a_283063_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E5%A5%BD%E3%81%8D%E3%81%AA%E6%B4%8B%E6%A5%BD/","title":"'좋아하는 팝송'"},{"content":"명령 프롬프트에서 PowerToys 설치하기 명령 프롬프트를 사용하여 PowerToys를 설치하는 방법을 소개합니다.\n1 winget install Microsoft.PowerToys --source winget 명령 프롬프트에서 PowerToys 제거하기 1 winget uninstall --name PowerToys ","date":"2023-09-30T21:23:00+09:00","image":"http://kenji.blog/p/powertoys%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/img_hud87e455d0958ca41a83ffdf977dac7c2_37972_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/powertoys%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/","title":"명령 프롬프트에서 PowerToys 설치하기"},{"content":"경의를 표하자 자신이 할 수 없는 일을 하는 사람에게 경의를 표하자\n사회에는 일이나 입장에 우열을 가리며 경의를 표하지 못하는 사람이 의외로 많다\n자신이 할 수 없는 일을 해내는 사람에게는 어떤 일이든 경의를 표하자\n명심하고 싶다\n","date":"2023-08-01T23:42:31+09:00","image":"http://kenji.blog/p/%E8%87%AA%E5%88%86%E3%81%AB%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E4%BA%BA%E3%81%AB%E6%95%AC%E6%84%8F%E3%82%92%E6%89%95%E3%81%8A%E3%81%86/img_hu0ec845f1b3d93c1f1262f8f9c2fb19a8_357395_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E8%87%AA%E5%88%86%E3%81%AB%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E4%BA%BA%E3%81%AB%E6%95%AC%E6%84%8F%E3%82%92%E6%89%95%E3%81%8A%E3%81%86/","title":"'자신이 할 수 없는 일을 하는 사람에게 경의를 표하자'"},{"content":"스플래툰 2 아마 인생에서 가장 오래 플레이하고 있는 게임이 스플래툰 2입니다. 스토리 모드는 거의 플레이하지 않지만, 4대4 온라인 대전의 매칭이 매우 잘 되어 있어서, 저와 비슷한 수준의 사람과 대전할 수 있기 때문에, 질리지 않는 재미가 있습니다. 또한, 상대나 아군의 움직임의 특징을 읽고, 이기기 위한 전략을 생각하는 것도 즐겁습니다.\n무기 자주 사용하는 무기는 순서대로 \u0026lsquo;보틀 가이저 포일\u0026rsquo;, \u0026lsquo;새싹 슈터\u0026rsquo;, \u0026lsquo;스플랫 롤러\u0026rsquo;, \u0026lsquo;베리어블 롤러 포일\u0026rsquo;입니다. \u0026lsquo;새싹 슈터\u0026rsquo;는 초보자용 무기로, 초반에는 이것을 자주 사용했습니다.\n각각의 칠 포인트는 아래와 같습니다.\n무기 칠 포인트 베리어블 롤러 6,636,594p 스플랫 롤러 6,200,629p 새싹 슈터 4,211,759p 보틀 가이저 포일 744,678p 스플랫 슈터 301,238p 레벨에 대해서는 A+～S+ 사이를 오가고 있는 느낌으로, 좀처럼 S+의 상위권으로는 올라가지 못하는 상태가 계속되고 있지만, 상위권으로 올라가기보다는 시합을 즐기면서 플레이하고 있는 느낌입니다. (너무 상위권이 되면 상대도 강해져서 긴장감이 생기기 때문에 즐길 수 없게 되어버립니다)\n플레이 시간 플레이 시간은 2500시간 이상을 넘었습니다.\n향후 목표 게임의 레벨은 유지하면서 즐겁게 플레이하는 것이지만, 돈이나 기어에 대해서는 최대치를 목표로 하고 싶습니다. 스플래툰 3가 나온 이후로 대전 매칭에 시간이 걸리거나 매칭이 안 되는 일이 늘어나고 있어서, 더 이상 사람이 줄어들지 않기를 기도하면서 플레이하고 싶습니다.\n","date":"2023-08-01T00:26:30+09:00","image":"http://kenji.blog/p/%E3%82%B9%E3%83%97%E3%83%A9%E3%83%88%E3%82%A5%E3%83%BC%E3%83%B32/img_hu177387d05aedc7553df9576fd3706d02_192717_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%82%B9%E3%83%97%E3%83%A9%E3%83%88%E3%82%A5%E3%83%BC%E3%83%B32/","title":"스플래툰 2"},{"content":"Microsoft MVP 수상에 대하여 (2023-2024) 이번에 Microsoft MVP(2023-2024)를 수상하게 되었습니다. 2017년부터 7년 연속 수상입니다.\n수상한 카테고리는 Developer Technologies 입니다.\n지금까지의 활동을 돌아보면 다음과 같은 활동을 해왔습니다.\nGitHub에 코드 공개 블로그나 SNS(Twitter 등)에 기술 정보 발신 MSDN 포럼에 게시글 작성 Microsoft 제품에 대한 피드백 앞으로도 더 좋은 글을 쓰며 정보 발신을 해나가고자 합니다.\n잘 부탁드립니다.\n","date":"2023-07-31T19:15:14+09:00","image":"http://kenji.blog/p/microsoft-mvp%E5%8F%97%E8%B3%9E%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A62023-2024/img_hua5cba2ce9936d80b2181232333db0622_19957_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/microsoft-mvp%E5%8F%97%E8%B3%9E%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A62023-2024/","title":"'Microsoft MVP 수상에 대하여(2023-2024)'"},{"content":"고대 그리스의 3대 작도 문제 원이 주어졌을 때, 그 원과 같은 넓이를 가지는 정사각형을 만들기 (원의 정방형화 문제) 임의의 각이 지정되었을 때, 그것을 3등분하기 (각의 3등분 문제) 정육면체가 주어졌을 때, 그 두 배의 부피를 가지는 정육면체를 만들기 (정육면체의 배적 문제) 아르키메데스의 나선 평면 상에서 반직선 OB를 정점 O를 중심으로 일정한 속도로 회전시킵니다. 처음 위치를 OA라고 할 때, OA에서 움직이기 시작함과 동시에 점 P가 O에서 출발하여, OB를 따라 일정한 속도로 움직일 때 점 P가 그리는 선이 아르키메데스의 나선입니다.\n파푸스의 정리 사이클로이드 니코메데스의 콘코이드 디오클레스의 시소이드 페르마의 접선법 데카르트의 법선법 연표 연도 사건 기원전 3400년경 수메르인이 점토로 만든 대용 화폐로 계산을 수행 기원전 3000년경 이집트에서 상형문자의 수학이 등장 기원전 2800년경 인더스 문명에서 10진법에 따른 도량형이 사용됨 기원전 2700년경 이집트인이 밧줄과 피타고라스 수를 사용하여 각도를 확인 기원전 2500년경 계산에 사용하는 도구, 주판이 발견됨 기원전 2500년경 참고 수학의 역사 ","date":"2023-07-22T15:25:10+09:00","image":"http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E6%AD%B4%E5%8F%B2/img_hu67324d5a4a949c1841dc5158adcb7086_428375_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E6%AD%B4%E5%8F%B2/","title":"'수학의 역사'"},{"content":"엘레컴 트랙볼 Deft Pro M-DPT1MRBK에 대하여 엘레컴의 트랙볼 \u0026lsquo;Deft Pro M-DPT1MRBK\u0026rsquo;를 구매한 지 1주일 정도 지나서 사용감 등을 리뷰합니다.\n주요 특징\n버튼 수가 8개로 많음 유선, 무선 리시버, 블루투스 3가지 방식으로 연결 가능 볼 크기가 큼 (중형 직경 44mm) Amazon 구매 가격: ￥7,012 (2021년 5월 2일 기준) 좋은 점 마우스에 비해 손목을 움직일 필요가 없어서, 손목의 부담이 줄어듦 버튼 수가 많아서, 버튼에 다양한 기능을 할당할 수 있음 현재는 위와 같이 할당하고 있습니다. 애플리케이션마다 버튼 할당을 변경할 수도 있습니다. ※ 버튼 할당에는 전용 소프트웨어 설치가 필요합니다. 버튼이 크기 때문에 트랙볼 중에서는 비교적 섬세한 조작도 하기 쉬움 아쉬운 점 트랙볼 주위에 먼지가 쌓이므로 정기적(며칠에 한 번 정도)으로 볼을 분리해서 청소가 필요함 검지, 중지 등으로 커서 이동, 엄지로 마우스 휠 조작 등 마우스와는 다른 조작감이기 때문에, 익숙해지는 데 시간이 걸림 위에서 섬세한 움직임을 하기 쉽다고 적었지만, 트랙볼에서는 역시 1픽셀 단위로 커서를 움직이는 것은 어려움 왼쪽 버튼을 누르면서 휠 조작은 불가능함 (예를 들어 그림판에서 범위 선택 중에 확대/축소를 하고 싶은 경우 등) 이상, 트랙볼 중에서는 비싼 편이라고 생각하지만, 전반적으로는 꽤 조작하기 쉽고, 업무 효율이 올랐다고 생각합니다. 고려 중인 분들께 참고가 되었으면 좋겠습니다.\n","date":"2023-05-02T23:28:33+09:00","image":"http://kenji.blog/p/%E3%83%88%E3%83%A9%E3%83%83%E3%82%AF%E3%83%9C%E3%83%BC%E3%83%ABdeft-prom-dpt1mrbk%E3%81%AE%E3%81%99%E3%81%99%E3%82%81/img_hue224b6b6b3d7da0ebda5f0b37d429b68_231359_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%83%88%E3%83%A9%E3%83%83%E3%82%AF%E3%83%9C%E3%83%BC%E3%83%ABdeft-prom-dpt1mrbk%E3%81%AE%E3%81%99%E3%81%99%E3%82%81/","title":"트랙볼 Deft Pro(M-DPT1MRBK) 추천"},{"content":"wxWidgets란 wxWidgets는 Windows, Mac, Linux, Android, iOS 등의 플랫폼에서 동작하는 C++ GUI 라이브러리입니다.\nwxWidgets 설치 https://www.wxwidgets.org/downloads/ 를 열어 Windows Installer를 다운로드합니다. wxMSW-3.2.2.1-Setup.exe를 실행하여 설치합니다. 설치된 폴더에서 \u0026ldquo;C:\\wxWidgets-3.2.2.1\\build\\msw\\wx_vc17.sln\u0026quot;을 엽니다. wx_vc17.sln을 열고 빌드＞일괄 빌드를 선택합니다. 모두 선택 버튼을 누르고, 리빌드 버튼을 누릅니다. 빌드가 완료되면 일단 Visual Studio를 닫습니다. 샘플 프로젝트 생성 Visual Studio를 엽니다. 파일＞새로 만들기＞프로젝트를 선택합니다. Windows 데스크톱 애플리케이션 (탭이 C++, Windows, 데스크톱)을 선택합니다. 프로젝트 이름에 wxWidgetsSample을 입력합니다. 만들기를 클릭합니다. wxWidgetsSample을 우클릭하고 속성을 선택합니다. 구성 속성＞C/C++＞추가 포함 디렉터리에 C:\\wxWidgets-3.2.2.1\\include와 C:\\wxWidgets-3.2.2.1\\include\\msvc를 추가합니다. 구성 속성＞링커＞추가 라이브러리 디렉터리에 C:\\wxWidgets-3.2.2.1\\lib\\vc_x64_lib를 추가합니다. wxWidgetsSample.cpp를 열고 다음 코드로 교체합니다. 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 #pragma comment(linker,\u0026#34;\\\u0026#34;/manifestdependency:type=\u0026#39;win32\u0026#39; name=\u0026#39;Microsoft.Windows.Common-Controls\u0026#39; version=\u0026#39;6.0.0.0\u0026#39; processorArchitecture=\u0026#39;*\u0026#39; publicKeyToken=\u0026#39;6595b64144ccf1df\u0026#39; language=\u0026#39;*\u0026#39;\\\u0026#34;\u0026#34;) #include \u0026lt;wx/wxprec.h\u0026gt; #ifndef WX_PRECOMP #include \u0026lt;wx/wx.h\u0026gt; #endif class MyApp : public wxApp { public: virtual bool OnInit(); }; class MyFrame : public wxFrame { public: MyFrame(); private: void OnHello(wxCommandEvent\u0026amp; event); void OnExit(wxCommandEvent\u0026amp; event); void OnAbout(wxCommandEvent\u0026amp; event); }; enum { ID_Hello = 1 }; wxIMPLEMENT_APP(MyApp); bool MyApp::OnInit() { MyFrame* frame = new MyFrame(); frame-\u0026gt;Show(true); return true; } MyFrame::MyFrame() : wxFrame(NULL, wxID_ANY, \u0026#34;Hello World\u0026#34;) { wxMenu* menuFile = new wxMenu; menuFile-\u0026gt;Append(ID_Hello, \u0026#34;\u0026amp;Hello...\\tCtrl-H\u0026#34;, \u0026#34;Help string shown in status bar for this menu item\u0026#34;); menuFile-\u0026gt;AppendSeparator(); menuFile-\u0026gt;Append(wxID_EXIT); wxMenu* menuHelp = new wxMenu; menuHelp-\u0026gt;Append(wxID_ABOUT); wxMenuBar* menuBar = new wxMenuBar; menuBar-\u0026gt;Append(menuFile, \u0026#34;\u0026amp;File\u0026#34;); menuBar-\u0026gt;Append(menuHelp, \u0026#34;\u0026amp;Help\u0026#34;); SetMenuBar(menuBar); wxButton* button1 = new wxButton(this, ID_Hello, _(\u0026#34;Hello\u0026#34;), wxPoint(20, 20), wxSize(100, 32)); Connect(ID_Hello, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MyFrame::OnHello)); wxButton* button2 = new wxButton(this, wxID_ABOUT, _(\u0026#34;About\u0026#34;), wxPoint(20, 60), wxSize(100, 32)); Connect(wxID_ABOUT, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MyFrame::OnAbout)); wxButton* button3 = new wxButton(this, wxID_EXIT, _(\u0026#34;Exit\u0026#34;), wxPoint(20, 100), wxSize(100, 32)); Connect(wxID_EXIT, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MyFrame::OnExit)); CreateStatusBar(); SetStatusText(\u0026#34;Welcome to wxWidgets!\u0026#34;); Bind(wxEVT_MENU, \u0026amp;MyFrame::OnHello, this, ID_Hello); Bind(wxEVT_MENU, \u0026amp;MyFrame::OnAbout, this, wxID_ABOUT); Bind(wxEVT_MENU, \u0026amp;MyFrame::OnExit, this, wxID_EXIT); } void MyFrame::OnExit(wxCommandEvent\u0026amp; event) { Close(true); } void MyFrame::OnAbout(wxCommandEvent\u0026amp; event) { wxMessageBox(\u0026#34;This is a wxWidgets\u0026#39; Hello world sample\u0026#34;, \u0026#34;About Hello World\u0026#34;, wxOK | wxICON_INFORMATION); } void MyFrame::OnHello(wxCommandEvent\u0026amp; event) { wxLogMessage(\u0026#34;Hello world from wxWidgets!\u0026#34;); } 빌드하고 실행하면 아래와 같은 창이 열립니다. 참고 샘플 프로젝트를 아래에 올려두었습니다. wxWidgetsSample\n공식 사이트 C++와 wxWidgets를 사용한 게임 이상입니다.\n","date":"2023-04-18T00:18:22+09:00","image":"http://kenji.blog/p/wxwidgets-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB/img_hud707912b3d08e9053ad61da0782a9b23_168133_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/wxwidgets-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB/","title":"'wxWidgets를 사용한 샘플'"},{"content":"보고 싶은 영화 (보면 체크하기) 이별의 아침에 약속의 꽃을 장식하자 박사가 사랑한 수식 썸머 워즈 히든 피겨스 굿 윌 헌팅 뷰티풀 마인드 사랑에 대한 모든 것 무한대를 본 남자 호킹 (베네딕트 컴버배치) 천지명찰 파이 (π) 21 아이큐 프루프 세 얼간이 버팔로 \u0026lsquo;66 시계태엽 오렌지 분노의 역류 아사쿠사 키드 탑건 매트릭스: 리저렉션 나는 전설이다 다빈치 코드 소셜 네트워크 슈타인즈 게이트 플라네테스 그래비티 바이올렛 에버가든 사이코패스 (Psycho-Pass) 귀멸의 칼날 원령공주 위니 (Winny) 제로의 초점 주토피아 너의 이름은. 날씨의 아이 백 투 더 퓨처 (1, 2, 3) 신 고질라 신 울트라맨 신 가면라이더 스즈메의 문단속 더 퍼스트 슬램덩크 ","date":"2023-04-17T00:34:13+09:00","image":"http://kenji.blog/p/%E6%98%A0%E7%94%BBtodo%E3%83%AA%E3%82%B9%E3%83%88/image_hu831a556e644f698f06f7bab476f01bf6_248271_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/ko/p/%E6%98%A0%E7%94%BBtodo%E3%83%AA%E3%82%B9%E3%83%88/","title":"영화 TODO 리스트"},{"content":"멋진 웹 페이지 템플릿\nhtml5up https://html5up.net/ 을 사용해 보고 싶어서 남기는 메모입니다.\n","date":"2023-04-17T00:26:55+09:00","image":"http://kenji.blog/p/%E3%81%8B%E3%81%A3%E3%81%93%E3%81%84%E3%81%84-web-%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88html5up/img_huc021190a6647c74fdf17f0c26cf7f09d_324732_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%81%8B%E3%81%A3%E3%81%93%E3%81%84%E3%81%84-web-%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88html5up/","title":"멋진 웹 페이지 템플릿 (html5up)"},{"content":"전제 조건 ISO C++ 20 표준 (/std:c++20) 코드 1 2 3 4 #include \u0026lt;chrono\u0026gt; #include \u0026lt;format\u0026gt; std::string datetime = std::format(\u0026#34;{:%FT%TZ}\u0026#34;, system_clock::now()); 이상, C++에서 현재 시간을 ISO8601 형식으로 출력하는 방법이었습니다.\n참고 std::format ","date":"2023-04-15T19:35:27+09:00","image":"http://kenji.blog/p/c-%E3%81%A7%E7%8F%BE%E5%9C%A8%E6%99%82%E5%88%BB%E3%82%92iso8601%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%81%A7%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu7d543f2117b8a102814b6a542ff27896_11509_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/c-%E3%81%A7%E7%8F%BE%E5%9C%A8%E6%99%82%E5%88%BB%E3%82%92iso8601%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%81%A7%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"C++에서 현재 시간을 ISO8601 형식으로 출력하는 방법"},{"content":"Windows를 종료하는 바로 가기를 만드는 방법을 소개합니다.\n생성된 바로 가기를 바탕 화면 등에 두고 두 번 클릭하면 종료할 수 있어 편리합니다.\n만드는 방법 1. 바탕 화면을 마우스 오른쪽 버튼으로 클릭하고 새로 만들기 ＞ 바로 가기를 선택 2. 바로 가기 만들기 화면이 표시되면 shutdown.exe -s -f -t 0을 입력하고 다음을 클릭 3. 바로 가기 이름에 시스템 종료를 입력하고 마침을 클릭 4. 생성된 바로 가기의 아이콘 변경하기 생성된 바로 가기를 마우스 오른쪽 버튼으로 클릭하고 속성을 선택\n아이콘 변경을 클릭\n빨간색 사각형 아이콘을 선택하고 확인을 클릭한 후, 다시 확인을 클릭하여 속성을 닫음\n이상입니다.\n생성된 바로 가기를 두 번 클릭하면 Windows가 종료됩니다.\n※주의：시스템 종료 확인 대화 상자가 표시되지 않습니다.\n","date":"2023-04-11T17:03:32+09:00","image":"http://kenji.blog/p/windows-%E3%82%92%E3%82%B7%E3%83%A3%E3%83%83%E3%83%88%E3%83%80%E3%82%A6%E3%83%B3%E3%81%99%E3%82%8B%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu9b7c59b017f6e7ad15ccc41a6e668b14_6147_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/windows-%E3%82%92%E3%82%B7%E3%83%A3%E3%83%83%E3%83%88%E3%83%80%E3%82%A6%E3%83%B3%E3%81%99%E3%82%8B%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Windows를 종료하는 바로 가기 만들기"},{"content":"paint.net에서 이미지의 특정 부분에 모자이크 처리하는 방법을 소개합니다.\n인터넷에 이미지를 업로드할 때, 이미지의 특정 부분에 모자이크를 처리하고 싶은 경우가 있을 텐데요, paint.net을 사용하면 이미지를 금방 가공할 수 있습니다.\n순서 1. 모자이크 처리를 할 이미지를 paint.net에서 열기 2. 선택 도구를 사용하여 모자이크할 부분을 선택하기 (다중 선택 가능) 3. 메뉴 ＞ 효과 ＞ 왜곡 ＞ 모자이크 선택 셀 크기로 모자이크 처리의 거칠기를 설정합니다. 수치가 클수록 은닉성이 높아집니다. [축소]멀티샘플 바이리니어법을 선택 [확대]최근접 이웃법을 선택 OK로 대화 상자를 닫습니다.\n4. 이미지에 모자이크 처리가 되므로, 이미지를 저장합니다. 이상.\n","date":"2023-04-11T16:33:10+09:00","image":"http://kenji.blog/p/paint.net%E3%81%A7%E7%94%BB%E5%83%8F%E3%81%AE%E7%89%B9%E5%AE%9A%E5%80%8B%E6%89%80%E3%81%AB%E3%83%A2%E3%82%B6%E3%82%A4%E3%82%AF%E3%82%92%E3%81%8B%E3%81%91%E3%82%8B%E6%96%B9%E6%B3%95/img_huffa96a6cc9046fae85e7535d0c0f77f3_7385_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/paint.net%E3%81%A7%E7%94%BB%E5%83%8F%E3%81%AE%E7%89%B9%E5%AE%9A%E5%80%8B%E6%89%80%E3%81%AB%E3%83%A2%E3%82%B6%E3%82%A4%E3%82%AF%E3%82%92%E3%81%8B%E3%81%91%E3%82%8B%E6%96%B9%E6%B3%95/","title":"paint.net에서 이미지의 특정 부분에 모자이크 처리하는 방법"},{"content":"paint.net을 사용하여 이미지에 테두리를 넣는 방법을 소개합니다.\n절차 1. 테두리를 넣을 이미지를 paint.net으로 엽니다 2. 보조 색상을 설정합니다 (이것이 테두리 색상이 됩니다) 색상 팔레트가 표시되지 않는 경우, 키보드의 F8 키를 누르세요.\n검은색으로 설정하려면 을 클릭하세요.\n3. 메뉴＞이미지＞캔버스 크기 변경을 선택 너비와 높이를 각각 2픽셀씩 늘립니다. 2픽셀을 늘리면 테두리가 1픽셀이 됩니다. 테두리를 5픽셀로 설정하고 싶은 경우, 너비와 높이를 각각 10픽셀씩 늘립니다.\n앵커는 \u0026lsquo;가운데\u0026rsquo;를 선택하고, OK를 클릭합니다.\n4. 이미지에 테두리가 추가되면, 이미지를 저장합니다. 이상.\n","date":"2023-04-11T14:31:59+09:00","image":"http://kenji.blog/p/paint.net%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E7%94%BB%E5%83%8F%E3%81%AB%E6%9E%A0%E7%B7%9A%E3%82%92%E3%81%A4%E3%81%91%E3%82%8B%E6%96%B9%E6%B3%95/img_3_hu0a2e55b3f220b3e7559f248d1c86ab19_112900_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/paint.net%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E7%94%BB%E5%83%8F%E3%81%AB%E6%9E%A0%E7%B7%9A%E3%82%92%E3%81%A4%E3%81%91%E3%82%8B%E6%96%B9%E6%B3%95/","title":"paint.net을 사용하여 이미지에 테두리를 넣는 방법"},{"content":"시작하며 Ranklet이라는 서비스를 사용하면 Google 애널리틱스에서 인기 페이지 랭킹을 가져와 쉽게 배치할 수 있습니다.\n이 글에서는 HUGO 블로그에 배치하는 방법을 소개합니다.\n동작 이미지 준비 사이트에 Google 애널리틱스가 설정되어 있을 것 절차 Ranklet에 접속합니다. Sign in with Google을 클릭하여 Google 계정으로 로그인합니다 (Google 애널리틱스 계정과 연결되어 있어야 합니다). 허용을 클릭\n기본 정보를 설정합니다. 위와 같이 설정했습니다.\nGoogle Analytics 뷰에서는 랭킹을 가져오고 싶은 뷰를 선택합니다. 텍스트 치환을 설정합니다. 위와 같이 설정했습니다. 페이지 제목의 | kenji.blog를 삭제하기 위해 설정했습니다.\n템플릿을 설정합니다. HTML (랭킹 숫자를 숨겼습니다) 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 31 \u0026lt;div class=\u0026#34;ranklet ranklet-reset\u0026#34;\u0026gt; \u0026lt;table class=\u0026#34;ranklet-table\u0026#34;\u0026gt; \u0026lt;tbody class=\u0026#34;ranklet-pages\u0026#34;\u0026gt; {{#context.pages}} \u0026lt;tr class=\u0026#34;ranklet-page\u0026#34;\u0026gt; \u0026lt;td class=\u0026#34;ranklet-image\u0026#34;\u0026gt; {{#image}} \u0026lt;a href=\u0026#34;{{url}}\u0026#34; class=\u0026#34;ranklet-link\u0026#34;\u0026gt; \u0026lt;img class=\u0026#34;ranklet-img\u0026#34; src=\u0026#34;{{image}}\u0026#34; /\u0026gt; \u0026lt;/a\u0026gt; {{/image}} \u0026lt;/td\u0026gt; \u0026lt;td class=\u0026#34;ranklet-meta\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;ranklet-title\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;{{url}}\u0026#34; class=\u0026#34;ranklet-link\u0026#34;\u0026gt; {{title}} \u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; {{#description}} \u0026lt;div class=\u0026#34;ranklet-description\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;{{url}}\u0026#34; class=\u0026#34;ranklet-link\u0026#34;\u0026gt; {{description}} \u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; {{/description}} \u0026lt;/td\u0026gt; \u0026lt;/tr\u0026gt; {{/context.pages}} \u0026lt;/tbody\u0026gt; \u0026lt;/table\u0026gt; \u0026lt;/div\u0026gt; CSS (폰트 크기를 변경하고, 설명문이 3줄로 표시되도록 했습니다) 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 #ranklet-{{context.id}} { .ranklet-reset { // 리셋 table, tr, td, div, span { margin: 0; padding: 0; border: 0; font-size: 100%; font: inherit; vertical-align: baseline; line-height: 1; box-sizing: border-box; } } .ranklet-table { border-collapse: separate; border-spacing: 8px 24px; width: 100%; word-break: break-all; td { vertical-align: middle; } .ranklet-rank { text-align: center; font-size: 120%; } .ranklet-image { text-align: center; img { max-width: 128px; max-height: 128px; } } .ranklet-meta { .ranklet-title { font-size: 20px; line-height: 125%; } .ranklet-description { font-size: 16px; margin-top: 8px; line-height: 125%; display: -webkit-box; overflow: hidden; -webkit-box-orient: vertical; -webkit-line-clamp: 3; /* 줄 수 */ } } } } JavaScript는 변경 없음 사이트 게재에서 HTML을 복사합니다. 표시된 HTML을 복사합니다.\nHUGO 템플릿에 붙여넣습니다. layouts/partials/ranklet.html을 생성하고, 복사한 HTML을 붙여넣습니다. 1 \u0026lt;div id=\u0026#34;ranklet-11958\u0026#34;\u0026gt;\u0026lt;/div\u0026gt;\u0026lt;script src=\u0026#34;//widget.ranklet.com/v1/ranklet/s3/widgets/11958/widget.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; layouts/_default/single.html의 \u0026lt;/footer\u0026gt; 앞 줄에 아래 코드를 붙여넣습니다. 1 {{- partial \u0026#34;ranklet.html\u0026#34; . }} 이상입니다. 이제 이 페이지 아래와 같이 랭킹이 표시됩니다.\n","date":"2023-04-10T20:26:57+09:00","image":"http://kenji.blog/p/google%E3%82%A2%E3%83%8A%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9%E3%81%8B%E3%82%89%E4%BA%BA%E6%B0%97%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0%E3%82%92%E5%8F%96%E5%BE%97%E3%81%97%E3%81%A6%E9%85%8D%E7%BD%AE%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hue19aa55fc0e6d690cd31b7a50b796054_6753_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/google%E3%82%A2%E3%83%8A%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9%E3%81%8B%E3%82%89%E4%BA%BA%E6%B0%97%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0%E3%82%92%E5%8F%96%E5%BE%97%E3%81%97%E3%81%A6%E9%85%8D%E7%BD%AE%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Google 애널리틱스에서 인기 페이지 랭킹을 가져와 배치하는 방법"},{"content":"Python Google Colaboratory Google Colaboratory(콜라보래토리)란, 온라인상에서 실행 가능한 Python 실행 환경.\nGPU 이용도 가능. Colab 노트북을 사용하면 실행 가능한 코드와 리치 텍스트(이미지, HTML, LaTeX 등도 가능)를 하나의 문서로 작성 가능. Jupyter Notebook을 기반으로 하고 있다.\nRust Rust Playground JavaScript Javascript Playground Java paiza.IO Online Java compiler Haskell Haskell Playground Swift Online Swift Playground C++ C++ 14 기타 AWS Cloud9 Amazon AWS에서 제공하는 온라인 통합 개발 환경. Node.js, JavaScript, Python, PHP, Ruby, Go, C++ 등 40개가 넘는 프로그래밍 언어용 도구가 미리 패키징되어 있습니다.\nVisual Studio Code for the Web Microsoft에서 제공하는 온라인 개발 환경. 단, 컴파일이 필요한 언어는 실행이나 디버깅을 할 수 없다.\npaiza.IO C, C++, Java, Ruby, Python, PHP, Perl 등 주요 24개 언어를 지원하는 온라인 실행 환경.\nCodePen HTML, CSS, JavaScript의 온라인 실행 환경.\ncodeanywhere 온라인 IDE. 코드 공유나 채팅을 할 수 있다.\n","date":"2023-04-09T14:01:00+09:00","image":"http://kenji.blog/p/%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E5%AE%9F%E8%A1%8C%E7%92%B0%E5%A2%83%E3%81%BE%E3%81%A8%E3%82%81/img_hu1a682c657d060df2f584d6c279d355c7_129199_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E5%AE%9F%E8%A1%8C%E7%92%B0%E5%A2%83%E3%81%BE%E3%81%A8%E3%82%81/","title":"【언어별】 온라인 코드 실행 환경 정리"},{"content":"에라토스테네스의 체란 에라토스테네스의 체는 어떤 수 이하의 소수를 나열하는 알고리즘입니다. 알고리즘은 단순하며, 다음 절차로 구현할 수 있습니다.\nN개의 요소를 가진 bool 값 배열을 만들고, 모든 요소를 true로 초기화한다 배열의 0번째와 1번째 요소를 false로 한다(0과 1은 소수가 아니기 때문) 배열의 2번째 요소가 true라면, 2를 소수로 출력한다 배열의 $2^2$ 이상의 2의 배수 번째 요소를 모두 false로 한다※ 배열의 3번째 요소가 true라면, 3을 소수로 출력한다 배열의 $3^2$ 이상의 3의 배수 번째 요소를 모두 false로 한다 4번째, 5번째, \u0026hellip;, N번째 요소에 대해 동일한 처리를 반복한다 ※ 2제곱 이상의 요소를 false의 대상으로 하는 이유는, 2제곱보다 작은 수에 대해서는 이미 처리가 완료되었기(나열이 완료되었기) 때문입니다.\nRust에서의 구현 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 fn main() { let n = 1000; let mut is_prime = vec![true; n+1]; is_prime[0] = false; is_prime[1] = false; for i in 2..=n { if is_prime[i] { println!(\u0026#34;{}\u0026#34;, i); let mut j = i * i; while j \u0026lt;= n { is_prime[j] = false; j += i; } } } } 조금 더 고속화된 버전 다음 사항을 고려하여, 조금 더 고속화된 구현을 수행합니다.\n배열을 true로 초기화하는 것이 아니라, false로 초기화한다 (이 편이 더 고속) 2의 배수는 소수가 아니므로, 2의 배수 요소를 false로 하는 처리를 생략 n까지 루프를 돌 필요 없이, n의 제곱근까지의 소수를 나열하면, n 이하의 소수를 나열할 수 있다 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 fn main() { let n = 1000; let mut is_prime = vec![false; n+1]; is_prime[2] = true; for i in (3..=n).step_by(2) { is_prime[i] = true; } for i in 3..=((n as f64).sqrt() as usize) { if is_prime[i] { let mut j = i * i; while j \u0026lt;= n { is_prime[j] = false; j += i * 2; } } } for i in (2..=n).filter(|\u0026amp;x| is_prime[x]) { println!(\u0026#34;{}\u0026#34;, i); } } 참고 에라토스테네스의 체 ","date":"2023-04-09T12:54:24+09:00","image":"http://kenji.blog/p/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A61000%E4%BB%A5%E4%B8%8B%E3%81%AE%E7%B4%A0%E6%95%B0%E3%82%92%E5%88%97%E6%8C%99%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hud779f88eb17786b23927bc052940ab95_400805_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A61000%E4%BB%A5%E4%B8%8B%E3%81%AE%E7%B4%A0%E6%95%B0%E3%82%92%E5%88%97%E6%8C%99%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"'에라토스테네스의 체를 사용하여 1000 이하의 소수를 나열하는 방법'"},{"content":"터미널에서 설치 터미널 열기 sudo gem install cocoapods 실행 → 어째서인지 아래와 같은 에러 메시지가 나오며 설치에 실패했다. 출력 1 2 3 ERROR: Error installing cocoapods: The last version of activesupport (\u0026gt;= 5.0, \u0026lt; 8) to support your Ruby \u0026amp; RubyGems was 6.1.7.3. Try installing it with `gem install activesupport -v 6.1.7.3` and then running the current command again activesupport requires Ruby version \u0026gt;= 2.7.0. The current ruby version is 2.6.10.210. 그래서 에러 메시지를 웹에서 검색해서 (아래 \u0026lsquo;참고\u0026rsquo;를 참조), 다음 명령어를 실행했다 1 /bin/bash -c \u0026#34;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\u0026#34; 출력 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 ==\u0026gt; Checking for `sudo` access (which may request your password)... ==\u0026gt; This script will install: /usr/local/bin/brew /usr/local/share/doc/homebrew /usr/local/share/man/man1/brew.1 /usr/local/share/zsh/site-functions/_brew /usr/local/etc/bash_completion.d/brew /usr/local/Homebrew ==\u0026gt; The following new directories will be created: /usr/local/bin /usr/local/etc /usr/local/include /usr/local/lib /usr/local/sbin /usr/local/share /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Frameworks ==\u0026gt; The Xcode Command Line Tools will be installed. Press RETURN/ENTER to continue or any other key to abort: ==\u0026gt; /usr/bin/sudo /bin/mkdir -p /usr/local/bin /usr/local/etc /usr/local/include /usr/local/lib /usr/local/sbin /usr/local/share /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Frameworks ==\u0026gt; /usr/bin/sudo /bin/chmod ug=rwx /usr/local/bin /usr/local/etc /usr/local/include /usr/local/lib /usr/local/sbin /usr/local/share /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Frameworks ==\u0026gt; /usr/bin/sudo /bin/chmod go-w /usr/local/share/zsh /usr/local/share/zsh/site-functions ==\u0026gt; /usr/bin/sudo /usr/sbin/chown kenji /usr/local/bin /usr/local/etc /usr/local/include /usr/local/lib /usr/local/sbin /usr/local/share /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Frameworks ==\u0026gt; /usr/bin/sudo /usr/bin/chgrp admin /usr/local/bin /usr/local/etc /usr/local/include /usr/local/lib /usr/local/sbin /usr/local/share /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Frameworks ==\u0026gt; /usr/bin/sudo /bin/mkdir -p /usr/local/Homebrew ==\u0026gt; /usr/bin/sudo /usr/sbin/chown -R kenji:admin /usr/local/Homebrew ==\u0026gt; /usr/bin/sudo /bin/mkdir -p /Users/kenji/Library/Caches/Homebrew ==\u0026gt; /usr/bin/sudo /bin/chmod g+rwx /Users/kenji/Library/Caches/Homebrew ==\u0026gt; /usr/bin/sudo /usr/sbin/chown -R kenji /Users/kenji/Library/Caches/Homebrew ==\u0026gt; Searching online for the Command Line Tools ==\u0026gt; /usr/bin/sudo /usr/bin/touch /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress ==\u0026gt; Installing Command Line Tools for Xcode-14.3 ==\u0026gt; /usr/bin/sudo /usr/sbin/softwareupdate -i Command\\ Line\\ Tools\\ for\\ Xcode-14.3 Software Update Tool Finding available software Downloading Command Line Tools for Xcode Downloaded Command Line Tools for Xcode Installing Command Line Tools for Xcode Done with Command Line Tools for Xcode Done. ==\u0026gt; /usr/bin/sudo /usr/bin/xcode-select --switch /Library/Developer/CommandLineTools ==\u0026gt; /usr/bin/sudo /bin/rm -f /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress ==\u0026gt; Downloading and installing Homebrew... remote: Enumerating objects: 236191, done. remote: Counting objects: 100% (504/504), done. remote: Compressing objects: 100% (327/327), done. remote: Total 236191 (delta 176), reused 468 (delta 158), pack-reused 235687 Receiving objects: 100% (236191/236191), 68.37 MiB | 15.51 MiB/s, done. Resolving deltas: 100% (173058/173058), done. From https://github.com/Homebrew/brew * [new branch] master -\u0026gt; origin/master * [new branch] test-runners -\u0026gt; origin/test-runners * [new tag] 0.1 -\u0026gt; 0.1 * [new tag] 0.2 -\u0026gt; 0.2 * [new tag] 0.3 -\u0026gt; 0.3 * [new tag] 0.4 -\u0026gt; 0.4 * [new tag] 0.5 -\u0026gt; 0.5 * [new tag] 0.6 -\u0026gt; 0.6 * [new tag] 0.7 -\u0026gt; 0.7 * [new tag] 0.7.1 -\u0026gt; 0.7.1 * [new tag] 0.8 -\u0026gt; 0.8 * [new tag] 0.8.1 -\u0026gt; 0.8.1 * [new tag] 0.9 -\u0026gt; 0.9 * [new tag] 0.9.1 -\u0026gt; 0.9.1 * [new tag] 0.9.2 -\u0026gt; 0.9.2 * [new tag] 0.9.3 -\u0026gt; 0.9.3 * [new tag] 0.9.4 -\u0026gt; 0.9.4 * [new tag] 0.9.5 -\u0026gt; 0.9.5 * [new tag] 0.9.8 -\u0026gt; 0.9.8 * [new tag] 0.9.9 -\u0026gt; 0.9.9 * [new tag] 1.0.0 -\u0026gt; 1.0.0 * [new tag] 1.0.1 -\u0026gt; 1.0.1 * [new tag] 1.0.2 -\u0026gt; 1.0.2 * [new tag] 1.0.3 -\u0026gt; 1.0.3 * [new tag] 1.0.4 -\u0026gt; 1.0.4 * [new tag] 1.0.5 -\u0026gt; 1.0.5 * [new tag] 1.0.6 -\u0026gt; 1.0.6 * [new tag] 1.0.7 -\u0026gt; 1.0.7 * [new tag] 1.0.8 -\u0026gt; 1.0.8 * [new tag] 1.0.9 -\u0026gt; 1.0.9 * [new tag] 1.1.0 -\u0026gt; 1.1.0 * [new tag] 1.1.1 -\u0026gt; 1.1.1 * [new tag] 1.1.10 -\u0026gt; 1.1.10 * [new tag] 1.1.11 -\u0026gt; 1.1.11 * [new tag] 1.1.12 -\u0026gt; 1.1.12 * [new tag] 1.1.13 -\u0026gt; 1.1.13 * [new tag] 1.1.2 -\u0026gt; 1.1.2 * [new tag] 1.1.3 -\u0026gt; 1.1.3 * [new tag] 1.1.4 -\u0026gt; 1.1.4 * [new tag] 1.1.5 -\u0026gt; 1.1.5 * [new tag] 1.1.6 -\u0026gt; 1.1.6 * [new tag] 1.1.7 -\u0026gt; 1.1.7 * [new tag] 1.1.8 -\u0026gt; 1.1.8 * [new tag] 1.1.9 -\u0026gt; 1.1.9 * [new tag] 1.2.0 -\u0026gt; 1.2.0 * [new tag] 1.2.1 -\u0026gt; 1.2.1 * [new tag] 1.2.2 -\u0026gt; 1.2.2 * [new tag] 1.2.3 -\u0026gt; 1.2.3 * [new tag] 1.2.4 -\u0026gt; 1.2.4 * [new tag] 1.2.5 -\u0026gt; 1.2.5 * [new tag] 1.2.6 -\u0026gt; 1.2.6 * [new tag] 1.3.0 -\u0026gt; 1.3.0 * [new tag] 1.3.1 -\u0026gt; 1.3.1 * [new tag] 1.3.2 -\u0026gt; 1.3.2 * [new tag] 1.3.3 -\u0026gt; 1.3.3 * [new tag] 1.3.4 -\u0026gt; 1.3.4 * [new tag] 1.3.5 -\u0026gt; 1.3.5 * [new tag] 1.3.6 -\u0026gt; 1.3.6 * [new tag] 1.3.7 -\u0026gt; 1.3.7 * [new tag] 1.3.8 -\u0026gt; 1.3.8 * [new tag] 1.3.9 -\u0026gt; 1.3.9 * [new tag] 1.4.0 -\u0026gt; 1.4.0 * [new tag] 1.4.1 -\u0026gt; 1.4.1 * [new tag] 1.4.2 -\u0026gt; 1.4.2 * [new tag] 1.4.3 -\u0026gt; 1.4.3 * [new tag] 1.5.0 -\u0026gt; 1.5.0 * [new tag] 1.5.1 -\u0026gt; 1.5.1 * [new tag] 1.5.10 -\u0026gt; 1.5.10 * [new tag] 1.5.11 -\u0026gt; 1.5.11 * [new tag] 1.5.12 -\u0026gt; 1.5.12 * [new tag] 1.5.13 -\u0026gt; 1.5.13 * [new tag] 1.5.14 -\u0026gt; 1.5.14 * [new tag] 1.5.2 -\u0026gt; 1.5.2 * [new tag] 1.5.3 -\u0026gt; 1.5.3 * [new tag] 1.5.4 -\u0026gt; 1.5.4 * [new tag] 1.5.5 -\u0026gt; 1.5.5 * [new tag] 1.5.6 -\u0026gt; 1.5.6 * [new tag] 1.5.7 -\u0026gt; 1.5.7 * [new tag] 1.5.8 -\u0026gt; 1.5.8 * [new tag] 1.5.9 -\u0026gt; 1.5.9 * [new tag] 1.6.0 -\u0026gt; 1.6.0 * [new tag] 1.6.1 -\u0026gt; 1.6.1 * [new tag] 1.6.10 -\u0026gt; 1.6.10 * [new tag] 1.6.11 -\u0026gt; 1.6.11 * [new tag] 1.6.12 -\u0026gt; 1.6.12 * [new tag] 1.6.13 -\u0026gt; 1.6.13 * [new tag] 1.6.14 -\u0026gt; 1.6.14 * [new tag] 1.6.15 -\u0026gt; 1.6.15 * [new tag] 1.6.16 -\u0026gt; 1.6.16 * [new tag] 1.6.17 -\u0026gt; 1.6.17 * [new tag] 1.6.2 -\u0026gt; 1.6.2 * [new tag] 1.6.3 -\u0026gt; 1.6.3 * [new tag] 1.6.4 -\u0026gt; 1.6.4 * [new tag] 1.6.5 -\u0026gt; 1.6.5 * [new tag] 1.6.6 -\u0026gt; 1.6.6 * [new tag] 1.6.7 -\u0026gt; 1.6.7 * [new tag] 1.6.8 -\u0026gt; 1.6.8 * [new tag] 1.6.9 -\u0026gt; 1.6.9 * [new tag] 1.7.0 -\u0026gt; 1.7.0 * [new tag] 1.7.1 -\u0026gt; 1.7.1 * [new tag] 1.7.2 -\u0026gt; 1.7.2 * [new tag] 1.7.3 -\u0026gt; 1.7.3 * [new tag] 1.7.4 -\u0026gt; 1.7.4 * [new tag] 1.7.5 -\u0026gt; 1.7.5 * [new tag] 1.7.6 -\u0026gt; 1.7.6 * [new tag] 1.7.7 -\u0026gt; 1.7.7 * [new tag] 1.8.0 -\u0026gt; 1.8.0 * [new tag] 1.8.1 -\u0026gt; 1.8.1 * [new tag] 1.8.2 -\u0026gt; 1.8.2 * [new tag] 1.8.3 -\u0026gt; 1.8.3 * [new tag] 1.8.4 -\u0026gt; 1.8.4 * [new tag] 1.8.5 -\u0026gt; 1.8.5 * [new tag] 1.8.6 -\u0026gt; 1.8.6 * [new tag] 1.9.0 -\u0026gt; 1.9.0 * [new tag] 1.9.1 -\u0026gt; 1.9.1 * [new tag] 1.9.2 -\u0026gt; 1.9.2 * [new tag] 1.9.3 -\u0026gt; 1.9.3 * [new tag] 2.0.0 -\u0026gt; 2.0.0 * [new tag] 2.0.1 -\u0026gt; 2.0.1 * [new tag] 2.0.2 -\u0026gt; 2.0.2 * [new tag] 2.0.3 -\u0026gt; 2.0.3 * [new tag] 2.0.4 -\u0026gt; 2.0.4 * [new tag] 2.0.5 -\u0026gt; 2.0.5 * [new tag] 2.0.6 -\u0026gt; 2.0.6 * [new tag] 2.1.0 -\u0026gt; 2.1.0 * [new tag] 2.1.1 -\u0026gt; 2.1.1 * [new tag] 2.1.10 -\u0026gt; 2.1.10 * [new tag] 2.1.11 -\u0026gt; 2.1.11 * [new tag] 2.1.12 -\u0026gt; 2.1.12 * [new tag] 2.1.13 -\u0026gt; 2.1.13 * [new tag] 2.1.14 -\u0026gt; 2.1.14 * [new tag] 2.1.15 -\u0026gt; 2.1.15 * [new tag] 2.1.16 -\u0026gt; 2.1.16 * [new tag] 2.1.2 -\u0026gt; 2.1.2 * [new tag] 2.1.3 -\u0026gt; 2.1.3 * [new tag] 2.1.4 -\u0026gt; 2.1.4 * [new tag] 2.1.5 -\u0026gt; 2.1.5 * [new tag] 2.1.6 -\u0026gt; 2.1.6 * [new tag] 2.1.7 -\u0026gt; 2.1.7 * [new tag] 2.1.8 -\u0026gt; 2.1.8 * [new tag] 2.1.9 -\u0026gt; 2.1.9 * [new tag] 2.2.0 -\u0026gt; 2.2.0 * [new tag] 2.2.1 -\u0026gt; 2.2.1 * [new tag] 2.2.10 -\u0026gt; 2.2.10 * [new tag] 2.2.11 -\u0026gt; 2.2.11 * [new tag] 2.2.12 -\u0026gt; 2.2.12 * [new tag] 2.2.13 -\u0026gt; 2.2.13 * [new tag] 2.2.14 -\u0026gt; 2.2.14 * [new tag] 2.2.15 -\u0026gt; 2.2.15 * [new tag] 2.2.16 -\u0026gt; 2.2.16 * [new tag] 2.2.17 -\u0026gt; 2.2.17 * [new tag] 2.2.2 -\u0026gt; 2.2.2 * [new tag] 2.2.3 -\u0026gt; 2.2.3 * [new tag] 2.2.4 -\u0026gt; 2.2.4 * [new tag] 2.2.5 -\u0026gt; 2.2.5 * [new tag] 2.2.6 -\u0026gt; 2.2.6 * [new tag] 2.2.7 -\u0026gt; 2.2.7 * [new tag] 2.2.8 -\u0026gt; 2.2.8 * [new tag] 2.2.9 -\u0026gt; 2.2.9 * [new tag] 2.3.0 -\u0026gt; 2.3.0 * [new tag] 2.4.0 -\u0026gt; 2.4.0 * [new tag] 2.4.1 -\u0026gt; 2.4.1 * [new tag] 2.4.10 -\u0026gt; 2.4.10 * [new tag] 2.4.11 -\u0026gt; 2.4.11 * [new tag] 2.4.12 -\u0026gt; 2.4.12 * [new tag] 2.4.13 -\u0026gt; 2.4.13 * [new tag] 2.4.14 -\u0026gt; 2.4.14 * [new tag] 2.4.15 -\u0026gt; 2.4.15 * [new tag] 2.4.16 -\u0026gt; 2.4.16 * [new tag] 2.4.2 -\u0026gt; 2.4.2 * [new tag] 2.4.3 -\u0026gt; 2.4.3 * [new tag] 2.4.4 -\u0026gt; 2.4.4 * [new tag] 2.4.5 -\u0026gt; 2.4.5 * [new tag] 2.4.6 -\u0026gt; 2.4.6 * [new tag] 2.4.7 -\u0026gt; 2.4.7 * [new tag] 2.4.8 -\u0026gt; 2.4.8 * [new tag] 2.4.9 -\u0026gt; 2.4.9 * [new tag] 2.5.0 -\u0026gt; 2.5.0 * [new tag] 2.5.1 -\u0026gt; 2.5.1 * [new tag] 2.5.10 -\u0026gt; 2.5.10 * [new tag] 2.5.11 -\u0026gt; 2.5.11 * [new tag] 2.5.12 -\u0026gt; 2.5.12 * [new tag] 2.5.2 -\u0026gt; 2.5.2 * [new tag] 2.5.3 -\u0026gt; 2.5.3 * [new tag] 2.5.4 -\u0026gt; 2.5.4 * [new tag] 2.5.5 -\u0026gt; 2.5.5 * [new tag] 2.5.6 -\u0026gt; 2.5.6 * [new tag] 2.5.7 -\u0026gt; 2.5.7 * [new tag] 2.5.8 -\u0026gt; 2.5.8 * [new tag] 2.5.9 -\u0026gt; 2.5.9 * [new tag] 2.6.0 -\u0026gt; 2.6.0 * [new tag] 2.6.1 -\u0026gt; 2.6.1 * [new tag] 2.6.2 -\u0026gt; 2.6.2 * [new tag] 2.7.0 -\u0026gt; 2.7.0 * [new tag] 2.7.1 -\u0026gt; 2.7.1 * [new tag] 2.7.2 -\u0026gt; 2.7.2 * [new tag] 2.7.3 -\u0026gt; 2.7.3 * [new tag] 2.7.4 -\u0026gt; 2.7.4 * [new tag] 2.7.5 -\u0026gt; 2.7.5 * [new tag] 2.7.6 -\u0026gt; 2.7.6 * [new tag] 2.7.7 -\u0026gt; 2.7.7 * [new tag] 3.0.0 -\u0026gt; 3.0.0 * [new tag] 3.0.1 -\u0026gt; 3.0.1 * [new tag] 3.0.10 -\u0026gt; 3.0.10 * [new tag] 3.0.11 -\u0026gt; 3.0.11 * [new tag] 3.0.2 -\u0026gt; 3.0.2 * [new tag] 3.0.3 -\u0026gt; 3.0.3 * [new tag] 3.0.4 -\u0026gt; 3.0.4 * [new tag] 3.0.5 -\u0026gt; 3.0.5 * [new tag] 3.0.6 -\u0026gt; 3.0.6 * [new tag] 3.0.7 -\u0026gt; 3.0.7 * [new tag] 3.0.8 -\u0026gt; 3.0.8 * [new tag] 3.0.9 -\u0026gt; 3.0.9 * [new tag] 3.1.0 -\u0026gt; 3.1.0 * [new tag] 3.1.1 -\u0026gt; 3.1.1 * [new tag] 3.1.10 -\u0026gt; 3.1.10 * [new tag] 3.1.11 -\u0026gt; 3.1.11 * [new tag] 3.1.12 -\u0026gt; 3.1.12 * [new tag] 3.1.2 -\u0026gt; 3.1.2 * [new tag] 3.1.3 -\u0026gt; 3.1.3 * [new tag] 3.1.4 -\u0026gt; 3.1.4 * [new tag] 3.1.5 -\u0026gt; 3.1.5 * [new tag] 3.1.6 -\u0026gt; 3.1.6 * [new tag] 3.1.7 -\u0026gt; 3.1.7 * [new tag] 3.1.8 -\u0026gt; 3.1.8 * [new tag] 3.1.9 -\u0026gt; 3.1.9 * [new tag] 3.2.0 -\u0026gt; 3.2.0 * [new tag] 3.2.1 -\u0026gt; 3.2.1 * [new tag] 3.2.10 -\u0026gt; 3.2.10 * [new tag] 3.2.11 -\u0026gt; 3.2.11 * [new tag] 3.2.12 -\u0026gt; 3.2.12 * [new tag] 3.2.13 -\u0026gt; 3.2.13 * [new tag] 3.2.14 -\u0026gt; 3.2.14 * [new tag] 3.2.15 -\u0026gt; 3.2.15 * [new tag] 3.2.16 -\u0026gt; 3.2.16 * [new tag] 3.2.17 -\u0026gt; 3.2.17 * [new tag] 3.2.2 -\u0026gt; 3.2.2 * [new tag] 3.2.3 -\u0026gt; 3.2.3 * [new tag] 3.2.4 -\u0026gt; 3.2.4 * [new tag] 3.2.5 -\u0026gt; 3.2.5 * [new tag] 3.2.6 -\u0026gt; 3.2.6 * [new tag] 3.2.7 -\u0026gt; 3.2.7 * [new tag] 3.2.8 -\u0026gt; 3.2.8 * [new tag] 3.2.9 -\u0026gt; 3.2.9 * [new tag] 3.3.0 -\u0026gt; 3.3.0 * [new tag] 3.3.1 -\u0026gt; 3.3.1 * [new tag] 3.3.10 -\u0026gt; 3.3.10 * [new tag] 3.3.11 -\u0026gt; 3.3.11 * [new tag] 3.3.12 -\u0026gt; 3.3.12 * [new tag] 3.3.13 -\u0026gt; 3.3.13 * [new tag] 3.3.14 -\u0026gt; 3.3.14 * [new tag] 3.3.15 -\u0026gt; 3.3.15 * [new tag] 3.3.16 -\u0026gt; 3.3.16 * [new tag] 3.3.2 -\u0026gt; 3.3.2 * [new tag] 3.3.3 -\u0026gt; 3.3.3 * [new tag] 3.3.4 -\u0026gt; 3.3.4 * [new tag] 3.3.5 -\u0026gt; 3.3.5 * [new tag] 3.3.6 -\u0026gt; 3.3.6 * [new tag] 3.3.7 -\u0026gt; 3.3.7 * [new tag] 3.3.8 -\u0026gt; 3.3.8 * [new tag] 3.3.9 -\u0026gt; 3.3.9 * [new tag] 3.4.0 -\u0026gt; 3.4.0 * [new tag] 3.4.1 -\u0026gt; 3.4.1 * [new tag] 3.4.10 -\u0026gt; 3.4.10 * [new tag] 3.4.11 -\u0026gt; 3.4.11 * [new tag] 3.4.2 -\u0026gt; 3.4.2 * [new tag] 3.4.3 -\u0026gt; 3.4.3 * [new tag] 3.4.4 -\u0026gt; 3.4.4 * [new tag] 3.4.5 -\u0026gt; 3.4.5 * [new tag] 3.4.6 -\u0026gt; 3.4.6 * [new tag] 3.4.7 -\u0026gt; 3.4.7 * [new tag] 3.4.8 -\u0026gt; 3.4.8 * [new tag] 3.4.9 -\u0026gt; 3.4.9 * [new tag] 3.5.0 -\u0026gt; 3.5.0 * [new tag] 3.5.1 -\u0026gt; 3.5.1 * [new tag] 3.5.10 -\u0026gt; 3.5.10 * [new tag] 3.5.2 -\u0026gt; 3.5.2 * [new tag] 3.5.3 -\u0026gt; 3.5.3 * [new tag] 3.5.4 -\u0026gt; 3.5.4 * [new tag] 3.5.5 -\u0026gt; 3.5.5 * [new tag] 3.5.6 -\u0026gt; 3.5.6 * [new tag] 3.5.7 -\u0026gt; 3.5.7 * [new tag] 3.5.8 -\u0026gt; 3.5.8 * [new tag] 3.5.9 -\u0026gt; 3.5.9 * [new tag] 3.6.0 -\u0026gt; 3.6.0 * [new tag] 3.6.1 -\u0026gt; 3.6.1 * [new tag] 3.6.10 -\u0026gt; 3.6.10 * [new tag] 3.6.11 -\u0026gt; 3.6.11 * [new tag] 3.6.12 -\u0026gt; 3.6.12 * [new tag] 3.6.13 -\u0026gt; 3.6.13 * [new tag] 3.6.14 -\u0026gt; 3.6.14 * [new tag] 3.6.15 -\u0026gt; 3.6.15 * [new tag] 3.6.16 -\u0026gt; 3.6.16 * [new tag] 3.6.17 -\u0026gt; 3.6.17 * [new tag] 3.6.18 -\u0026gt; 3.6.18 * [new tag] 3.6.19 -\u0026gt; 3.6.19 * [new tag] 3.6.2 -\u0026gt; 3.6.2 * [new tag] 3.6.20 -\u0026gt; 3.6.20 * [new tag] 3.6.21 -\u0026gt; 3.6.21 * [new tag] 3.6.3 -\u0026gt; 3.6.3 * [new tag] 3.6.4 -\u0026gt; 3.6.4 * [new tag] 3.6.5 -\u0026gt; 3.6.5 * [new tag] 3.6.6 -\u0026gt; 3.6.6 * [new tag] 3.6.7 -\u0026gt; 3.6.7 * [new tag] 3.6.8 -\u0026gt; 3.6.8 * [new tag] 3.6.9 -\u0026gt; 3.6.9 * [new tag] 4.0.0 -\u0026gt; 4.0.0 * [new tag] 4.0.1 -\u0026gt; 4.0.1 * [new tag] 4.0.10 -\u0026gt; 4.0.10 * [new tag] 4.0.11 -\u0026gt; 4.0.11 * [new tag] 4.0.2 -\u0026gt; 4.0.2 * [new tag] 4.0.3 -\u0026gt; 4.0.3 * [new tag] 4.0.4 -\u0026gt; 4.0.4 * [new tag] 4.0.5 -\u0026gt; 4.0.5 * [new tag] 4.0.6 -\u0026gt; 4.0.6 * [new tag] 4.0.7 -\u0026gt; 4.0.7 * [new tag] 4.0.8 -\u0026gt; 4.0.8 * [new tag] 4.0.9 -\u0026gt; 4.0.9 HEAD is now at c51687009 Merge pull request #15168 from reitermarkus/api-ruby-source-path ==\u0026gt; Installation successful! ==\u0026gt; Homebrew has enabled anonymous aggregate formulae and cask analytics. Read the analytics documentation (and how to opt-out) here: https://docs.brew.sh/Analytics No analytics data has been sent yet (nor will any be during this install run). ==\u0026gt; Homebrew is run entirely by unpaid volunteers. Please consider donating: https://github.com/Homebrew/brew#donations ==\u0026gt; Next steps: - Run these two commands in your terminal to add Homebrew to your PATH: (echo; echo \u0026#39;eval \u0026#34;$(/usr/local/bin/brew shellenv)\u0026#34;\u0026#39;) \u0026gt;\u0026gt; /Users/kenji/.zprofile eval \u0026#34;$(/usr/local/bin/brew shellenv)\u0026#34; - Run brew help to get started - Further documentation: https://docs.brew.sh brew install cocoapods 실행 출력 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 Warning: Treating cocoapods as a formula. For the cask, use homebrew/cask/cocoapods ==\u0026gt; Fetching dependencies for cocoapods: libyaml, ca-certificates, openssl@1.1, readline and ruby ==\u0026gt; Fetching libyaml ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/libyaml/manifests/0.2.5 ######################################################################## 100.0% ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/libyaml/blobs/sha256:b49e62f014 ==\u0026gt; Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sh ######################################################################## 100.0% ==\u0026gt; Fetching ca-certificates ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/ca-certificates/manifests/2023- ######################################################################## 100.0% ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/ca-certificates/blobs/sha256:11 ==\u0026gt; Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sh ######################################################################## 100.0% ==\u0026gt; Fetching openssl@1.1 ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/openssl/1.1/manifests/1.1.1t ######################################################################## 100.0% ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/openssl/1.1/blobs/sha256:97676d ==\u0026gt; Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sh ######################################################################## 100.0% ==\u0026gt; Fetching readline ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/readline/manifests/8.2.1 ######################################################################## 100.0% ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/readline/blobs/sha256:abe9d3f3e ==\u0026gt; Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sh ######################################################################## 100.0% ==\u0026gt; Fetching ruby ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/ruby/manifests/3.2.2 ######################################################################## 100.0% ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/ruby/blobs/sha256:a4ac080688e87 ==\u0026gt; Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sh ######################################################################## 100.0% ==\u0026gt; Fetching cocoapods ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/cocoapods/manifests/1.12.0 ######################################################################## 100.0% ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/cocoapods/blobs/sha256:11226288 ==\u0026gt; Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sh ######################################################################## 100.0% ==\u0026gt; Installing dependencies for cocoapods: libyaml, ca-certificates, openssl@1.1, readline and ruby ==\u0026gt; Installing cocoapods dependency: libyaml ==\u0026gt; Pouring libyaml--0.2.5.ventura.bottle.tar.gz 🍺 /usr/local/Cellar/libyaml/0.2.5: 10 files, 330KB ==\u0026gt; Installing cocoapods dependency: ca-certificates ==\u0026gt; Pouring ca-certificates--2023-01-10.all.bottle.tar.gz ==\u0026gt; Regenerating CA certificate bundle from keychain, this may take a while... 🍺 /usr/local/Cellar/ca-certificates/2023-01-10: 3 files, 216.9KB ==\u0026gt; Installing cocoapods dependency: openssl@1.1 ==\u0026gt; Pouring openssl@1.1--1.1.1t.ventura.bottle.tar.gz 🍺 /usr/local/Cellar/openssl@1.1/1.1.1t: 8,101 files, 18.5MB ==\u0026gt; Installing cocoapods dependency: readline ==\u0026gt; Pouring readline--8.2.1.ventura.bottle.tar.gz 🍺 /usr/local/Cellar/readline/8.2.1: 50 files, 1.7MB ==\u0026gt; Installing cocoapods dependency: ruby ==\u0026gt; Pouring ruby--3.2.2.ventura.bottle.tar.gz 🍺 /usr/local/Cellar/ruby/3.2.2: 16,605 files, 46.3MB ==\u0026gt; Installing cocoapods ==\u0026gt; Pouring cocoapods--1.12.0.ventura.bottle.tar.gz 🍺 /usr/local/Cellar/cocoapods/1.12.0: 13,436 files, 27.8MB ==\u0026gt; Running `brew cleanup cocoapods`... Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP. Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`). pod --version 실행 출력 1 1.12.0 일단, 성공적으로 설치된 것 같다.\n참고 Installing \u0026ldquo;CocoaPods\u0026rdquo; ","date":"2023-04-09T03:25:54+09:00","image":"http://kenji.blog/p/mac%E3%81%ABcocoapods%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_1_hu5a3007afd3f7cdc4b526573a36fbeca4_11833_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/mac%E3%81%ABcocoapods%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"mac에 CocoaPods를 설치하는 방법"},{"content":"Salesforce의 SOQL을 이용하여 일별 레코드 생성 수를 가져오는 방법 개발자 콘솔을 엽니다. Query Editor 탭을 엽니다. 아래의 SOQL을 붙여넣고 실행합니다. 1 select day_only(createdDate), count(createdDate) from account group by day_only(createdDate) order by count(createdDate) desc limit 10 account는 가져오고 싶은 임의의 개체 이름으로 변경해서 실행해 주세요.\n참고 Is there a way to group by the date portion of a datetime field in SOQL? ","date":"2023-04-09T02:50:30+09:00","image":"http://kenji.blog/p/salesforce%E3%81%AEsoql%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%A6%E6%97%A5%E5%88%A5%E3%81%AE%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E4%BD%9C%E6%88%90%E6%95%B0%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hub769e11b0a209a1986a31ec50fb9e2d1_10470_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/salesforce%E3%81%AEsoql%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%A6%E6%97%A5%E5%88%A5%E3%81%AE%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E4%BD%9C%E6%88%90%E6%95%B0%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Salesforce의 SOQL을 이용하여 일별 레코드 생성 수를 가져오는 방법"},{"content":"\n필요한 것 Google 계정 순서 https://colab.research.google.com/ 에 접속 \u0026lsquo;파일\u0026rsquo; → \u0026lsquo;새 노트\u0026rsquo; 선택 아래의 코드를 붙여넣고 실행 1 2 3 4 5 6 7 import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 2*np.pi, 500) plt.plot(x, np.sin(x), label=\u0026#34;sin curve\u0026#34;) plt.plot(x, np.cos(x), label=\u0026#34;cos curve\u0026#34;) plt.legend() # 범례 표시 plt.show() 실행 결과 참고 matplotlib.pyplot — Matplotlib 3.5.3 documentation ","date":"2023-04-09T01:02:19+09:00","image":"http://kenji.blog/p/pythonmatplotlib.pyplot%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E6%8F%8F%E7%94%BB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hucdb24ab588d845f9f7a56ef99be2c709_27745_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/pythonmatplotlib.pyplot%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E6%8F%8F%E7%94%BB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Python(matplotlib.pyplot)을 사용하여 그래프를 그리는 방법"},{"content":"필요한 것 Twitter API Twitter API SECRET Twitter ACCESS TOKEN Twitter ACCESS TOKEN SECRET Google 계정 Twitter API 취득 방법은 참고 사이트를 참조해 주세요.\nAPI를 사용하여 트윗하는 순서 https://colab.research.google.com/ 에 접속 「파일」→「새 노트 만들기」를 선택 아래의 코드를 붙여넣고 실행 (실제 각 값은 직접 취득한 것을 사용해 주세요) 1 2 3 4 API_KEY = \u0026#39;9Smu2f2RoLqbVQHQq6n79Z2JW\u0026#39; API_SECRET = \u0026#39;uGVRIkLL2l8sRyPv2Lr4mXxXppnQF1isMoRnvktcXCtFgAK2R8\u0026#39; ACCESS_TOKEN = \u0026#39;0367292979164670705-7hSErDoQbO6fkFtnn5UY0vqpvecy0O\u0026#39; ACCESS_TOKEN_SECRET = \u0026#39;pUv81U9GVzZirz5g4AxZPHAJ4GpSXnBo8GUcZ1egtjw9q\u0026#39; 아래의 코드를 붙여넣고 실행 1 import tweepy 아래의 코드를 붙여넣고 실행 (API v1.1) 1 2 3 4 auth = tweepy.OAuthHandler(API_KEY, API_SECRET) auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET) api = tweepy.API(auth) api.update_status(\u0026#34;hello\u0026#34;) →hello라는 트윗이 게시됨\n아래의 코드를 붙여넣고 실행 (API v2.0) 1 2 client = tweepy.Client(consumer_key=API_KEY, consumer_secret=API_SECRET, access_token=ACCESS_TOKEN, access_token_secret=ACCESS_TOKEN_SECRET) client.create_tweet(text=\u0026#39;hello v2\u0026#39;) →hello v2라는 트윗이 게시됨\n이상\n참고 【2021년 4월 기준】 Twitter API 이용 신청을 사용 용도 예문과 스크린샷으로 철저하게 해설 【번거로운 설정 불필요!】 Twitter API 테스트 환경이라면 Google Colaboratory를 추천 【소스 코드도 공유합니다】 【Tweepy】 Twitter API v2: 트윗, 답글(리플라이), 투표 포함 트윗, 미디어 포함 트윗 (v1.1) [Python] ","date":"2023-04-08T18:48:32+09:00","image":"http://kenji.blog/p/twitter-api%E3%81%A8google-colaboratory%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6tweet%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu92a10d7ea1c17ea4dcc0d2e0b77b6296_75327_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/twitter-api%E3%81%A8google-colaboratory%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6tweet%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"'Twitter API와 Google Colaboratory를 사용하여 트윗하는 방법'"},{"content":"OpenSSL이란 암호화 통신을 수행하는 데 필요한 처리를 제공하는 오픈 소스 라이브러리입니다.\n프로그램에서 사용하려면 C언어 소스 코드가 공개되어 있으므로, 빌드하여 라이브러리를 생성해야 합니다.\n아래에서는 빌드 절차를 소개합니다.\n빌드 환경 준비 Perl\nhttps://strawberryperl.com/에서 strawberry-perl-5.32.1.1-64bit.msi를 다운로드합니다. 버전은 최신 버전이어도 무방합니다.\nNASM\nhttps://www.nasm.us/의 Download에서 2.16.01/nasm-2.16.01-win64.zip을 다운로드합니다. 버전은 rc가 아닌 최신 버전이어도 무방합니다. 설치 후에는 NASM이 설치된 폴더를 환경 변수 PATH에 등록해야 합니다.\nVisual Studio 2022 ** 또는 ** Build Tools for Visual Studio 2022\nhttps://visualstudio.microsoft.com/ja/downloads/에서 Visual Studio 2022 Community 또는 Build Tools for Visual Studio 2022를 설치합니다.\nWindows에서의 OpenSSL 빌드 절차 https://www.openssl.org/source/에서 openssl-3.1.0.tar.gz를 다운로드하여 압축을 풉니다. 압축을 풀 수 없는 경우, 명령 프롬프트에서 tar -xzf openssl-3.1.0.tar.gz를 실행합니다. 관리자 권한으로 명령 프롬프트를 실행합니다. 압축을 푼 폴더를 엽니다. 아래 명령을 실행합니다. ※Community 부분은 설치한 Visual Studio의 버전에 맞게 변경합니다. 1 \u0026#34;C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat\u0026#34; x64 아래 명령을 실행합니다. 1 perl Configure VC-WIN64A 아래 명령을 실행합니다. (시간이 꽤 걸립니다.) 1 nmake 아래 명령을 실행합니다. (시간이 꽤 걸립니다.) 1 nmake test 아래 명령을 실행합니다. 1 nmake install 성공한 경우 C:\\Program Files\\OpenSSL에 OpenSSL이 설치됩니다.\n이상\n참고 https://ja.wikipedia.org/wiki/OpenSSL\n","date":"2023-04-07T21:06:32+09:00","image":"http://kenji.blog/p/windows-%E3%81%A7-openssl-%E3%82%92%E3%83%93%E3%83%AB%E3%83%89%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu856dff3329e4daff79f775d47e5cc35b_35659_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/windows-%E3%81%A7-openssl-%E3%82%92%E3%83%93%E3%83%AB%E3%83%89%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"'Windows에서 OpenSSL 빌드하는 방법'"},{"content":"i18n이란? i18n이란, Internationalization의 약자로, 국제화라는 의미입니다. Internationalization은 너무 길기 때문에, 첫 번째 i와 마지막 n 사이에 18글자가 포함되어 있다는 의미로 i18n이라고 생략해서 표기됩니다.\n소프트웨어에서의 국제화 대응이라는 문맥에서 사용되기도 합니다.\n국제화에서의 주요 대상 항목으로는 다음이 있습니다.1\n문자 집합 (표준 문자 코드 등) 문자의 방향 (왼쪽에서 오른쪽으로, 오른쪽에서 왼쪽으로, 왼쪽을 향해 위에서 아래로, 기타) 문구 폰트 서식 수치 (소수점 문자, 자릿수 구분 문자, 구분하는 자릿수 등) 일시 (연월일 표기 방법, 이슬람력/그레고리력/유대력/일본력 등 사용하는 달력의 차이, 기타) 일시 정보의 시차 통화 정보 국제화와 지역화 - 위키백과\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"2023-04-07T00:42:02+09:00","image":"http://kenji.blog/p/i18n%E3%81%A8%E3%81%AF/img_hu5547e5059a9dab53fb09979c54309752_11855_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/i18n%E3%81%A8%E3%81%AF/","title":"'i18n이란?'"},{"content":"HTML로 프레젠테이션 자료를 만드는 방법 reveal.js는 HTML과 Markdown을 사용한 프레젠테이션 작성 도구로, 다음과 같은 기능이 있습니다.\n수식, 애니메이션, 스와이프 조작 등 다양한 프레젠테이션 기능 테마 및 레이아웃 커스터마이즈 가능 마우스, 키보드, 터치패드 등 여러 디바이스를 지원하는 내비게이션 기능 슬라이드 자동 재생 및 비디오 포함 등 고급 기능 제공 PDF 형식으로 내보내기 가능 이러한 기능을 통해 사용자는 쉽게 인터랙티브하고 매력적인 프레젠테이션을 만들 수 있습니다.\nreveal.js 설치 및 사용법 가장 간단한 사용법은 다음 페이지에서 ZIP 파일을 통째로 다운로드하여 압축을 푸는 것입니다.\nhttps://revealjs.com/installation을 열고, 링크에서 master.zip을 다운로드한다 압축을 푼 폴더 내의 index.html을 브라우저로 연다 index.html을 수정하여 자신의 프레젠테이션 자료를 만든다 ※demo.html에 데모용 HTML 코드가 작성되어 있으므로 참고할 수 있습니다.\n활용 방법 만든 프레젠테이션 자료는 그대로 웹 페이지로 공개하거나, PDF로 내보낼 수 있습니다. 또한, 프레젠테이션 소스가 텍스트이므로 버전 관리 시스템으로 관리하기가 용이합니다.\n마크다운 형식으로 프레젠테이션 자료를 작성하는 것도 가능한 것 같습니다.\n참고 앞으로 프레젠테이션 자료는 reveal.js를 사용하자 Markdown 표기법 샘플 목록 ","date":"2023-04-06T23:23:46+09:00","image":"http://kenji.blog/p/html%E3%81%A7%E3%83%97%E3%83%AC%E3%82%BC%E3%83%B3%E8%B3%87%E6%96%99%E3%82%92%E4%BD%9C%E3%82%8B%E6%96%B9%E6%B3%95reveal.js/img_hu4de64f3f6be8c50037c2a4c6c2d48287_30871_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/html%E3%81%A7%E3%83%97%E3%83%AC%E3%82%BC%E3%83%B3%E8%B3%87%E6%96%99%E3%82%92%E4%BD%9C%E3%82%8B%E6%96%B9%E6%B3%95reveal.js/","title":"HTML로 프레젠테이션 자료를 만드는 방법 (reveal.js)"},{"content":"Stable diffusion이란 Stable diffusion은 독일 뮌헨 대학교의 연구팀이 개발한, 입력된 텍스트 정보로부터 이미지를 생성하는 AI입니다. 다양한 이미지를 학습시킴으로써 실사부터 일러스트까지 다양한 이미지를 생성할 수 있습니다.\n이번에는 Stable diffusion의 학습된 데이터를 사용하여 일러스트 이미지를 생성하는 방법을 소개합니다.\n준비물 Google 계정 이 전부입니다.\n생성 절차 https://colab.research.google.com 을 엽니다. 왼쪽 상단의 파일에서 새 노트 만들기를 선택합니다. 수정에서 노트 설정을 선택합니다. 하드웨어 가속기를 GPU로 변경합니다. 아래의 코드를 붙여넣고 실행합니다. 1 !pip install diffusers==0.8.0 transformers 아래의 코드를 붙여넣고 실행합니다. 1 from diffusers import StableDiffusionPipeline 아래의 코드를 붙여넣고 실행합니다. 1 2 pipe = StableDiffusionPipeline.from_pretrained(\u0026#34;gsdf/Counterfeit-V2.5\u0026#34;) pipe.to(\u0026#34;cuda\u0026#34;) 아래의 코드를 붙여넣고 실행합니다. 1 2 3 4 5 prompt = \u0026#34;((masterpiece,best quality)),1girl, solo, animal ears, rabbit, barefoot, knees up, dress, sitting, rabbit ears, short sleeves, looking at viewer, grass, short hair, smile, white hair, puffy sleeves, outdoors, puffy short sleeves, bangs, on ground, full body, animal, white dress, sunlight, brown eyes, dappled sunlight, day, depth of field\u0026#34; n_prompt = \u0026#34;EasyNegative, extra fingers,fewer fingers\u0026#34; image = pipe(prompt, negative_prompt = n_prompt).images[0] image 여기서 사용한 Prompt는 https://huggingface.co/gsdf/Counterfeit-V2.5의 Prompt를 참고했습니다.\n생성 결과 (일부) 참고 https://huggingface.co/gsdf/Counterfeit-V2.5 인공지능(AI)을 사용한 이미지 생성 프로그램을 15분 만에 만들어 보았다【실황 프로그래밍】 ","date":"2023-04-06T00:43:19+09:00","image":"http://kenji.blog/p/aistablediffusion%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E7%94%BB%E5%83%8F%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu25483e02f36587a64f3cf042db15c245_550570_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/aistablediffusion%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E7%94%BB%E5%83%8F%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"'AI(StableDiffusion)를 사용하여 일러스트 이미지를 생성하는 방법'"},{"content":"실행 파일(exe)이란? Windows상에서 실행 가능한 파일. 기본적으로는 PE 포맷이라고 불리는 형식으로 작성되어 있다. 실행하기 위한 기계어 코드나 아이콘, 이미지 등의 리소스가 포함되어 있다.\n실행 파일을 분석하기 위한 도구가 몇 가지 있으므로 이번에는 그것들을 소개한다.\n7-Zip EXE 파일은 그대로는 크기가 커지기 쉽기 때문에 파일 압축을 해서 생성되는 경우가 있습니다. 이 경우, 파일 압축 및 해제 소프트웨어인 7-Zip을 사용하여 실행 파일을 해제하고 내용을 조사할 수 있습니다. 동일하게 해제할 수 있는 도구로 WinRAR라는 것도 있습니다.\nResource Hacker EXE 파일 내에 있는 리소스(아이콘, 비트맵, 대화 상자, 문자열 등)를 추출할 수 있습니다. 또한, 바이너리 에디터로도 기능하기 때문에 EXE 파일의 내용을 편집하여 다시 작성할 수도 있습니다.\nPE Explorer Windows용 PE 파일(EXE, DLL, OCX, SYS, 드라이버)을 분석할 수 있습니다. PE Explorer는 파일 구조 표시, 파일 헤더 표시, 디렉터리 항목 표시, 내보낸 함수 및 심볼 표시 등 다양한 분석 기능을 제공합니다.\nDependency Walker EXE 파일이 의존하는 DLL 파일을 조사하고, 그것들이 올바르게 로드되어 있는지 여부를 확인할 수 있습니다. 또한, DLL 파일의 함수 호출을 추적할 수도 있습니다.\nGhidra NSA(미국 국가안보국)가 개발하여 오픈소스로 무료 공개하고 있는 강력한 리버스 엔지니어링 도구입니다. EXE 파일의 디스어셈블(어셈블리 언어로의 변환)뿐만 아니라, C 언어에 가까운 형태로의 디컴파일 기능도 갖추고 있어 매우 인기가 있습니다.\nIDA Free / IDA Pro 악성코드 분석이나 리버스 엔지니어링에 있어서 세계적인 업계 표준이 되고 있는 고기능 디스어셈블러 및 디컴파일러입니다. Pro 버전은 매우 비싸지만, 개인이나 비상업적 목적이라면 기능 제한 버전인 「IDA Free」를 무료로 이용할 수 있습니다.\nx64dbg (x32dbg) Windows용 오픈소스 디버거입니다. 실행 파일을 실행하면서 내용이나 메모리의 상태를 단계별로 실행하여 분석하는 「동적 분석」에 특화되어 있으며, 크랙미(분석용 과제 프로그램) 해독이나 악성코드 동작 조사에 자주 사용됩니다.\nILSpy / dotPeek 만약 대상 EXE 파일이 C# 등의 .NET 계열 언어로 만들어져 있다면, 이 도구들을 사용하여 원래의 소스 코드와 거의 동일한 상태로 역컴파일(디컴파일)하여 내용을 완전히 파악할 수 있습니다.\n이러한 도구들은 EXE 파일의 내용을 조사하는 데 유용하지만, 주의가 필요합니다. 파일을 편집하거나 부정당한 용도로 이용하는 것은 저작권법이나 보안상 문제를 일으킬 가능성이 있기 때문에 충분히 이해한 후 사용해 주세요.\n","date":"2023-04-05T23:31:06+09:00","image":"http://kenji.blog/p/%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%ABexe%E3%81%AE%E4%B8%AD%E8%BA%AB%E3%82%92%E8%A7%A3%E6%9E%90%E3%81%99%E3%82%8B%E3%83%84%E3%83%BC%E3%83%AB/img_1_hu9e069acaa7fdaa872d319a8c6d6e1444_1819799_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%EC%8B%A4%ED%96%89-%ED%8C%8C%EC%9D%BCexe%EC%9D%98-%EB%82%B4%EC%9A%A9%EC%9D%84-%EB%B6%84%EC%84%9D%ED%95%98%EB%8A%94-%EB%8F%84%EA%B5%AC/","title":"실행 파일(exe)의 내용을 분석하는 도구"},{"content":"소개 Mac에서 Windows처럼 (Alt+Tab) 애플리케이션을 전환하는 방법을 소개합니다.\n이것은 기본 설정을 변경하는 방법으로는 구현하기 어렵기 때문에 애플리케이션을 설치하는 방법입니다.\n동작 이미지 설정 방법 (macOS Ventura) https://alt-tab-macos.netlify.app을 엽니다. Download the latest release를 클릭합니다. 다운로드된 애플리케이션을 엽니다. 나머지는 절차에 따라 설치합니다. 이제 Windows와 마찬가지로 Alt+Tab을 사용하여 애플리케이션을 전환할 수 있습니다.\n이상\n","date":"2023-04-05T02:20:12+09:00","image":"http://kenji.blog/p/mac%E3%81%A7windows%E3%83%A9%E3%82%A4%E3%82%AFalt-tab%E3%81%AB%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu9e86c898d72728906fc707b47dff25e0_55585_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/mac%E3%81%A7windows%E3%83%A9%E3%82%A4%E3%82%AFalt-tab%E3%81%AB%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Mac에서 Windows처럼 (Alt+Tab) 애플리케이션 전환하는 방법"},{"content":"소개 Windows와 Mac을 번갈아 사용할 경우, 키보드 단축키로 자주 사용하는 복사, 붙여넣기, 실행 취소 등의 키가 다르기 때문에, 이를 맞추는 방법을 소개합니다.\n설정 방법 (macOS Ventura) 시스템 설정을 엽니다. 키보드를 선택합니다. 키보드 단축키를 선택합니다. 보조 키를 선택합니다. Control(^) 키를 「⌘ Command」에 할당합니다. Command(⌘) 키를 「^ Control」에 할당합니다. 완료를 클릭합니다. 이상\n","date":"2023-04-05T00:49:02+09:00","image":"http://kenji.blog/p/mac%E3%81%A7%E3%82%B3%E3%83%94%E3%83%BC%E3%83%9A%E3%83%BC%E3%82%B9%E3%83%88%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC%E3%82%92windows%E3%81%A8%E5%90%88%E3%82%8F%E3%81%9B%E3%82%8B%E6%96%B9%E6%B3%95/img_hu81c2d0d61c05f6ce24b15f479442c3bc_211588_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/mac%E3%81%A7%E3%82%B3%E3%83%94%E3%83%BC%E3%83%9A%E3%83%BC%E3%82%B9%E3%83%88%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC%E3%82%92windows%E3%81%A8%E5%90%88%E3%82%8F%E3%81%9B%E3%82%8B%E6%96%B9%E6%B3%95/","title":"'Mac에서 복사 및 붙여넣기 단축키를 Windows와 맞추는 방법'"},{"content":"시작하며 저는 US 키보드를 사용하고 있어서, Windows에서는 Alt + `로 일본어 입력을 전환하는데 mac에서도 같은 키로 전환하고 싶어서 찾아보니 설정에서 변경할 수 있다는 것을 알았습니다.\n설정 방법 (macOS Ventura) 시스템 설정을 엽니다. 키보드를 선택합니다. 키보드 단축키를 선택합니다. 입력 소스를 선택합니다. \u0026lsquo;입력 메뉴에서 다음 소스 선택\u0026rsquo; 오른쪽의 단축키 표기를 더블 클릭합니다. Alt + `를 입력합니다. 완료를 클릭합니다. 이제 영어 ⇔ 일본어를 Alt + `로 전환할 수 있게 됩니다. 다만, 기본 설정으로는 전환 중에 가타카나가 포함되어 버리므로, 아래 절차에 따라 입력 소스에서 가타카나를 삭제했습니다.\n시스템 설정을 엽니다. 키보드를 선택합니다. 입력 소스 중 \u0026lsquo;일본어 - 로마자 입력\u0026rsquo; 오른쪽의 편집을 클릭합니다. \u0026lsquo;일본어 - 로마자 입력\u0026rsquo;을 클릭합니다. 입력 모드 중 가타카나의 체크를 해제합니다. 완료를 클릭합니다. 이상\n","date":"2023-04-04T23:02:12+09:00","image":"http://kenji.blog/p/mac%E3%81%A7%E6%97%A5%E6%9C%AC%E8%AA%9E%E8%8B%B1%E8%AA%9E%E5%85%A5%E5%8A%9B%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu79c9b62a36c4ad9394525ea6ed769587_198703_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/mac%E3%81%A7%E6%97%A5%E6%9C%AC%E8%AA%9E%E8%8B%B1%E8%AA%9E%E5%85%A5%E5%8A%9B%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Mac에서 일본어⇔영어 입력 전환 단축키 변경하는 방법"},{"content":"Windows에서 환경 변수 경로가 설정된 실행 파일의 위치를 찾는 방법 실행 파일을 지정하여 명령을 실행할 때, 그 실행 파일이 어디에 있는지 알고 싶을 때가 있습니다. 그럴 때는 다음 명령어로 실행 파일의 위치를 확인할 수 있습니다.\n1 where \u0026lt;실행 파일명\u0026gt; 예를 들어, 그림판(mspaint.exe)의 위치를 알고 싶을 때는 다음과 같이 합니다.\n1 where mspaint.exe 참고 How do I find the location of an executable in Windows? ","date":"2023-04-03T00:02:55+09:00","image":"http://kenji.blog/p/windows-%E3%81%A7%E3%83%91%E3%82%B9%E3%81%AE%E9%80%9A%E3%81%A3%E3%81%9F%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%A0%B4%E6%89%80%E3%82%92%E8%A6%8B%E3%81%A4%E3%81%91%E3%82%8B%E6%96%B9%E6%B3%95/img_hub74cf0d67f87eb185fadea6cd8747be8_5455_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/windows-%E3%81%A7%E3%83%91%E3%82%B9%E3%81%AE%E9%80%9A%E3%81%A3%E3%81%9F%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%A0%B4%E6%89%80%E3%82%92%E8%A6%8B%E3%81%A4%E3%81%91%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Windows에서 환경 변수 경로가 설정된 실행 파일의 위치를 찾는 방법"},{"content":"mac mini(2018) 구매 메루카리에서 구형 중고 mac mini(2018)를 구매했다. 스펙은 다음과 같다.\nCPU: 3.2GHz 6코어 Intel Core i7 메모리: 32GB 스토리지: 1TB SSD 가격은 ￥ 77,000\n구매하게 된 이유 회사에서 거의 같은 스펙의 mac mini를 사용하여 스마트폰 앱 개발을 하고 있는데, 집에서도 개발 환경(특히 xcode 실행 환경)을 갖추고 싶었다. macbook pro를 가지고 있지만, 9년 전에 구매한 것이라 동작이 꽤 느려서 거의 사용하지 않고 있다. 개인적으로 iOS 앱 개발을 하고 싶었다. 바로 xcode와 IntelliJ IDEA를 설치 xcode는 버전이 Version 14.3 (14E222b) IntelliJ IDEA는 버전이 2023.1 자! 개발해 보자!\n","date":"2023-04-02T18:05:30+09:00","image":"http://kenji.blog/p/mac-mini2018%E3%82%92%E8%B3%BC%E5%85%A5/img_huc5df0470d74ce7a0046f11abaa7c5815_30469_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/mac-mini2018%E3%82%92%E8%B3%BC%E5%85%A5/","title":"'mac mini(2018) 구매'"},{"content":"\u0026ldquo;Unsplash\u0026quot;에 대하여 https://unsplash.com/ko/\n사진 소재 사이트 \u0026ldquo;Unsplash\u0026quot;를 요약하면 다음과 같습니다.\n모든 이미지를 무료로 사용할 수 있음 상업적 이용 가능 이미지 가공 가능 사용 허가 불필요 출처(크레딧) 표기 불필요 블로그 글을 쓸 때 매우 유용하므로, 꼭 사용해 보시기 바랍니다.\n※ 라이선스에 대해서는 아래의 \u0026ldquo;각주\u0026quot;를 참조해 주세요.1\n이 사이트에서도 적극 활용할 예정입니다.\nUnsplash 라이선스\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"2023-04-02T14:44:17+09:00","image":"http://kenji.blog/p/%E3%83%96%E3%83%AD%E3%82%B0%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E5%86%99%E7%9C%9F%E7%B4%A0%E6%9D%90%E3%82%B5%E3%82%A4%E3%83%88unsplash%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/img_1_hu43cbd10eab78d2e7468dbb36abe8d794_828454_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%83%96%E3%83%AD%E3%82%B0%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E5%86%99%E7%9C%9F%E7%B4%A0%E6%9D%90%E3%82%B5%E3%82%A4%E3%83%88unsplash%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/","title":"블로그에서 사용할 수 있는 사진 소재 사이트 \\\"Unsplash\\\"에 대하여"},{"content":"egui 샘플 가져오기 아래 명령어로 egui 샘플을 실행할 수 있습니다.\n1 2 3 git clone https://github.com/emilk/eframe_template/ egui_test cd egui_test cargo run 일본어 지원 폰트 불러오기 일본어를 표시하려면 일본어 지원 폰트를 불러와야 합니다.\nsrc/app.rs의 pub fn new 메서드 안에 다음 줄을 추가합니다.\n1 2 3 4 5 6 7 8 9 10 11 12 // 일본어 지원 폰트 불러오기 let mut fonts = egui::FontDefinitions::default(); fonts.font_data.insert( \u0026#34;Meiryo\u0026#34;.to_owned(), egui::FontData::from_static(include_bytes!(\u0026#34;C:/Windows/Fonts/Meiryo.ttc\u0026#34;)), ); fonts .families .entry(egui::FontFamily::Proportional) .or_default() .insert(0, \u0026#34;Meiryo\u0026#34;.to_owned()); cc.egui_ctx.set_fonts(fonts); 이제 일본어를 표시할 수 있습니다. ","date":"2023-04-01T03:17:52+09:00","image":"http://kenji.blog/p/egui%E3%81%A7%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu6798dc327f7454fc6cd8b8de1315ab03_5786_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/egui%E3%81%A7%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"'egui에서 일본어를 표시하는 방법'"},{"content":"KaTeX란? KaTeX는 LaTeX 스타일의 수식을 HTML로 표시하기 위한 javascript 라이브러리입니다.\n구체적으로는 아래와 같은 수식을 표시할 수 있습니다.\n$$f(x) = x^2 + x + 41$$ 그 외에도 LaTeX 스타일의 수식 표시 라이브러리도 있는 것 같습니다만, KaTeX는 심플하고 빠르다는 정평이 나 있습니다.\nhugo에 도입하는 방법 hugo의 폴더 계층에서 layouts/partials/math.html을 새로 작성합니다. 내용은 아래와 같이 작성해 주세요.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 \u0026lt;link rel=\u0026#34;stylesheet\u0026#34; href=\u0026#34;https://cdn.jsdelivr.net/npm/katex@0.16.4/dist/katex.min.css\u0026#34; integrity=\u0026#34;sha384-vKruj+a13U8yHIkAyGgK1J3ArTLzrFGBbBc0tDp4ad/EyewESeXE/Iv67Aj8gKZ0\u0026#34; crossorigin=\u0026#34;anonymous\u0026#34;\u0026gt; \u0026lt;script defer src=\u0026#34;https://cdn.jsdelivr.net/npm/katex@0.16.4/dist/katex.min.js\u0026#34; integrity=\u0026#34;sha384-PwRUT/YqbnEjkZO0zZxNqcxACrXe+j766U2amXcgMg5457rve2Y7I6ZJSm2A0mS4\u0026#34; crossorigin=\u0026#34;anonymous\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;script defer src=\u0026#34;https://cdn.jsdelivr.net/npm/katex@0.16.4/dist/contrib/auto-render.min.js\u0026#34; integrity=\u0026#34;sha384-+VBxd3r6XgURycqtZ117nYw44OOcIax56Z4dCRWbxyPt0Koah1uHoK0o4+/RRE05\u0026#34; crossorigin=\u0026#34;anonymous\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;script\u0026gt; document.addEventListener(\u0026#34;DOMContentLoaded\u0026#34;, function() { renderMathInElement( document.body, { delimiters: [ {left: \u0026#34;$$\u0026#34;, right: \u0026#34;$$\u0026#34;, display: true}, {left: \u0026#34;\\\\[\u0026#34;, right: \u0026#34;\\\\]\u0026#34;, display: true}, {left: \u0026#34;$\u0026#34;, right: \u0026#34;$\u0026#34;, display: false}, {left: \u0026#34;\\\\(\u0026#34;, right: \u0026#34;\\\\)\u0026#34;, display: false} ] }); }); \u0026lt;/script\u0026gt; 다음으로 기존 파일 layouts/partials/extend_head.html에 아래의 코드를 추가합니다. 1 2 3 {{ if or .Params.math .Site.Params.math }} {{ partial \u0026#34;math.html\u0026#34; . }} {{ end }} 이것으로 KaTeX를 사용할 준비가 완료되었습니다. 페이지의 front matter에 math: true를 추가함으로써, KaTeX를 활성화할 수 있습니다.\n이제 페이지 본문에 수식을 LaTeX 스타일로 작성하기만 하면 됩니다. 1 $$ e^{i \\pi} = -1 $$ 위와 같이 작성하면, 아래와 같이 표시됩니다.\n$$ e^{i \\pi} = -1 $$ 참고 Math Typesetting | PaperModX KaTex Auto-render Extension KaTeX 도입 | The Strange Storage ","date":"2023-03-31T23:11:26+09:00","image":"http://kenji.blog/p/hugo%E3%81%A7katexlatex%E9%A2%A8%E6%95%B0%E5%BC%8F%E8%A1%A8%E7%A4%BA%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu4b1d83d24aac47c2cd375cc93b995e98_26739_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/hugo%E3%81%A7katexlatex%E9%A2%A8%E6%95%B0%E5%BC%8F%E8%A1%A8%E7%A4%BA%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"'hugo에서 KaTeX(LaTeX 스타일 수식 표시) 활성화하는 방법'"},{"content":"사람을 움직이는 법 https://amzn.to/3YTv0Dr\n미움받을 용기 https://amzn.to/3n3SVCQ\nLIFE SHIFT 100세 시대의 인생 전략 https://amzn.to/3TtKUDf\n7가지 습관 https://amzn.to/3TqfjSO\n","date":"2023-03-19T18:13:14+09:00","image":"http://kenji.blog/p/%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AE%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E6%9B%B8/img_huc9a897f0643b20664d8e252d3dd67b22_2836610_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AE%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E6%9B%B8/","title":"'추천 비즈니스 서적'"},{"content":"추천하는 Chrome 확장 프로그램 현재 사용 중인 Chrome 확장 프로그램을 소개합니다. Chrome이라고는 하지만 Microsoft Edge에서도 사용할 수 있습니다.\n1. simpleGestures 마우스 제스처를 사용할 수 있게 해주는 확장 프로그램입니다. 키보드를 사용하거나 툴바의 버튼에 맞추지 않아도 브라우저를 조작할 수 있습니다.\n예를 들어, 마우스 오른쪽 버튼을 누른 채로 마우스를 왼쪽으로 슬라이드하면 뒤로 가기, 마우스 오른쪽 버튼을 누른 채로 마우스를 오른쪽으로 슬라이드하면 앞으로 가기 등의 조작이 가능합니다.\n이 역시 오픈 소스이기 때문에 신뢰성이 높습니다.\nsimpleGestures github 2. uBlock Origin 광고를 차단하는 확장 프로그램입니다. 오픈 소스이기 때문에 신뢰성이 높습니다. 또한, CPU나 메모리 사용량도 적어 쾌적하게 동작합니다.\nuBlock Origin github 3. DeepL 번역 세계적으로 유명한 번역 서비스 DeepL을 사용하여 페이지 내를 번역할 수 있는 Chrome 확장 프로그램입니다. 브라우저에서 번역하고 싶은 문장을 선택하면 DeepL 아이콘이 표시되며, 클릭하면 자동 번역됩니다.\nDeepL Translator 4. ChatGPT Sidebar ChatGPT를 슬라이드 바에서 사용할 수 있게 해주는 확장 프로그램입니다. Ctrl+P를 눌러 슬라이드 바를 표시할 수 있으며, 바로 AI에게 질문할 수 있습니다. 페이지 내에서 선택된 문자열이 있으면 그대로 질문 문장으로 복사되기 때문에 Ctrl+Enter로 바로 질문할 수 있습니다.\nChatGPT Sidebar 5. Salesforce DevTools Salesforce 개발에 유용한 기능을 추가하는 확장 프로그램입니다. Salesforce를 사용하지 않는 분들에게는 필요 없을 것이라 생각합니다.\nSalesforce DevTools ","date":"2023-03-19T02:54:30+09:00","image":"http://kenji.blog/p/%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AE-chorme-%E6%8B%A1%E5%BC%B5/img_4_hue5f33cff57d8628a1113ed27818b8d04_20776_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AE-chorme-%E6%8B%A1%E5%BC%B5/","title":"'추천하는 Chrome 확장 프로그램'"},{"content":"egui란 Rust에서 사용할 수 있는 GUI 라이브러리입니다.\negui 사용해보기 다음 명령어로 egui 샘플을 실행할 수 있습니다.\n1 2 3 git clone https://github.com/emilk/eframe_template/ egui_test cd egui_test cargo run 이제 샘플 코드를 만지면서 여러 가지를 테스트해 볼 수 있습니다.\n참고 공식 github\n","date":"2023-03-18T10:27:02+09:00","image":"http://kenji.blog/p/egui%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B/demo_hu16f50e8d6a05810ce904e73f9e33bab1_152754_120x120_fill_box_smart1_1.gif","permalink":"http://kenji.blog/ko/p/egui%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B/","title":"'egui 사용해보기'"},{"content":"rustc를 업데이트하는 방법 아래의 한 줄을 명령어로 실행하기만 하면 됩니다.\n1 rustup update 출력 참고 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 31 32 33 34 35 rustup update info: syncing channel updates for \u0026#39;stable-x86_64-pc-windows-msvc\u0026#39; warning: Signature verification failed for \u0026#39;https://static.rust-lang.org/dist/channel-rust-stable.toml\u0026#39; info: latest update on 2023-03-09, rust version 1.68.0 (2c8cc3432 2023-03-06) info: downloading component \u0026#39;rust-src\u0026#39; info: downloading component \u0026#39;cargo\u0026#39; info: downloading component \u0026#39;clippy\u0026#39; info: downloading component \u0026#39;rust-docs\u0026#39; info: downloading component \u0026#39;rust-std\u0026#39; info: downloading component \u0026#39;rustc\u0026#39; 63.9 MiB / 63.9 MiB (100 %) 37.5 MiB/s in 1s ETA: 0s info: downloading component \u0026#39;rustfmt\u0026#39; info: removing previous version of component \u0026#39;rust-src\u0026#39; info: removing previous version of component \u0026#39;cargo\u0026#39; info: removing previous version of component \u0026#39;clippy\u0026#39; info: removing previous version of component \u0026#39;rust-docs\u0026#39; info: removing previous version of component \u0026#39;rust-std\u0026#39; info: removing previous version of component \u0026#39;rustc\u0026#39; info: removing previous version of component \u0026#39;rustfmt\u0026#39; info: installing component \u0026#39;rust-src\u0026#39; info: installing component \u0026#39;cargo\u0026#39; info: installing component \u0026#39;clippy\u0026#39; info: installing component \u0026#39;rust-docs\u0026#39; 19.4 MiB / 19.4 MiB (100 %) 2.4 MiB/s in 6s ETA: 0s info: installing component \u0026#39;rust-std\u0026#39; 27.6 MiB / 27.6 MiB (100 %) 12.7 MiB/s in 2s ETA: 0s info: installing component \u0026#39;rustc\u0026#39; 63.9 MiB / 63.9 MiB (100 %) 13.8 MiB/s in 4s ETA: 0s info: installing component \u0026#39;rustfmt\u0026#39; info: checking for self-updates info: downloading self-update stable-x86_64-pc-windows-msvc updated - rustc 1.68.0 (2c8cc3432 2023-03-06) (from rustc 1.64.0 (a55dd71d5 2022-09-19)) info: cleaning up downloads \u0026amp; tmp directories ","date":"2023-03-18T10:27:02+09:00","image":"http://kenji.blog/p/rustc%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu2f4438039b9bb5f2180f9e10d772e3b3_30692_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/rustc%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"rustc를 업데이트하는 방법"},{"content":"YAMAHA AG03 노이즈 해결 방법 AG03 모니터로 PC 소리를 듣다 보면 정기적으로 (1분에서 3분 정도에 1번) 지직거리는 노이즈가 발생해서, 알아보니 AG03 노이즈 대책으로 다음과 같은 방법이 있는 것 같습니다.\nhttps://jp.yamaha.com/support/updates/yamaha_steinberg_usb_driver_for_win.html\n위 사이트에서 Yamaha Steinberg USB Driver를 다운로드하여 설치하니 노이즈가 해결되었습니다.\n지금 바로 구매 참고 https://web.archive.org/web/20201003230738/http://yamaha.custhelp.com/app/answers/detail/a_id/7202\n","date":"2023-03-18T01:17:10+09:00","image":"http://kenji.blog/p/ag03%E3%83%8E%E3%82%A4%E3%82%BA%E8%A7%A3%E6%B6%88%E6%96%B9%E6%B3%95/img_hu7b60ee71c94898202eca721f7c6778b5_180745_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/ag03%E3%83%8E%E3%82%A4%E3%82%BA%E8%A7%A3%E6%B6%88%E6%96%B9%E6%B3%95/","title":"AG03 노이즈 해결 방법"},{"content":"현역 엔지니어가 추천하는 \u0026amp; 갖고 싶은 PC 주변기기 키보드 뭐니 뭐니 해도 키보드는 고장 나기 어려운 정전용량 무접점 방식을 추천합니다. 저는 거의 10년 이상 RealForce를 가지고 있는데, 아직도 현역으로 잘 사용하고 있습니다. 사용하고 있는 타입은 영어 배열의 저소음 모델입니다.\n다만, 최근에는 Logitech MX Keys라는 키보드도 관심이 갑니다.\n트랙볼 포인팅 디바이스는 마우스보다 피로를 줄일 수 있는 트랙볼을 추천합니다.\n사용하고 있는 것은 Logitech MX Ergo입니다. 이것은 1만 엔 이상하는 고가품이지만, 그 이상의 가치가 있다고 생각합니다.\n볼이 큰 타입으로 집게손가락·가운뎃손가락으로 조작하는 DEFT PRO(M-DPT1MRXBK)도 관심이 갑니다. 디스플레이 어떤 것이든 좋지만, 해상도가 높은 4K 디스플레이를 추천합니다.\n현재는 DELL의 4K 디스플레이를 사용하고 있습니다.\n지금은 와이드 디스플레이인 EIZO의 디스플레이 또는 DELL의 디스플레이를 갖고 싶다고 생각합니다.\n","date":"2023-02-28T00:51:49+09:00","image":"http://kenji.blog/p/%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AEpc%E5%91%A8%E8%BE%BA%E6%A9%9F%E5%99%A8/img_hu9c34821fcae33240cf8bba1055606dc6_434960_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AEpc%E5%91%A8%E8%BE%BA%E6%A9%9F%E5%99%A8/","title":"'추천하는 PC 주변기기'"},{"content":"유료 웹 폰트를 사용하기 위한 서비스 fontplus.jp https://fontplus.jp/\n월 1,100엔으로 모든 폰트를 사용할 수 있으며, 여러 사이트에서의 사용도 지원합니다.\n","date":"2023-02-07T20:59:01+09:00","image":"http://kenji.blog/p/fontplus.jp/img_hu81cfc4bed02bb5cdb36d3ac7fae3e538_91722_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/fontplus.jp/","title":"fontplus.jp에 대하여"},{"content":"HUGO의 기본 설정에서는 게시물 내에 HTML 태그를 사용할 수 없게 되어 있지만, config.toml에 아래와 같이 기재하면 사용할 수 있게 됩니다.\n1 2 [markup.goldmark.renderer] unsafe = true 참고: Configure Markup\n","date":"2023-01-17T19:20:32+09:00","image":"http://kenji.blog/p/hugo%E3%81%A7html%E3%82%BF%E3%82%B0%E3%82%92%E4%BD%BF%E3%81%86/img_hu415dc7e70376ac350673d0366f70ca4b_19909_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/hugo%E3%81%A7html%E3%82%BF%E3%82%B0%E3%82%92%E4%BD%BF%E3%81%86/","title":"HUGO에서 HTML 태그 사용하기"},{"content":"GitHub 스폰서 모집 아래 버튼을 통해 GitHub 스폰서가 되어 주시면 감사하겠습니다.\n도구 개발 등에 유용하게 사용하겠습니다.\n코드 서명 인증서를 발급받을 수 있을 때까지 열심히 하겠습니다!\n","date":"2023-01-17T18:13:56+09:00","image":"http://kenji.blog/p/github%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B5%E3%83%BC%E5%8B%9F%E9%9B%86/img_hueb38a852fa4aae54f384564ce61ae26b_130999_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/github%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B5%E3%83%BC%E5%8B%9F%E9%9B%86/","title":"'GitHub 스폰서 모집'"},{"content":"버튼이란 버튼은 GUI 컨트롤 중 하나로 Windows 표준 API를 통해 구현할 수 있습니다. 화면 상의 영역을 클릭(마우스 왼쪽 버튼 다운, 마우스 왼쪽 버튼 업)하면, 프로그램에서 지정한 처리를 실행할 수 있습니다.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 // 버튼 생성 CreateWindow( TEXT(\u0026#34;BUTTON\u0026#34;), TEXT(\u0026#34;Close\u0026#34;), WS_CHILD|WS_VISIBLE, 10,10,128,30, hWnd, (HMENU)ID_BUTTON1, ((LPCREATESTRUCT)lParam)-\u0026gt;hInstance, 0); ... // 클릭되었을 때 OS에서 윈도우로 WM_COMMAND 메시지가 전송됩니다. case WM_COMMAND: switch(LOWORD(wParam)) { case ID_BUTTON1: SendMessage(hWnd,WM_CLOSE,0,0); break; } break; 샘플 코드는 아래에 게재되어 있습니다. button\n","date":"2023-01-14T20:24:00+09:00","image":"http://kenji.blog/p/%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%A4%E3%81%84%E3%81%A6/img_hu07b471bb746fa184ff8eeb6f561670e7_8164_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%A4%E3%81%84%E3%81%A6/","title":"버튼에 대하여"},{"content":"노트북 ThinkPad(중고)를 샀다 노트북 작업은 거의 원격 데스크톱 연결로 다른 단말기에 들어가서 작업하고 있기 때문에 고사양 PC는 필요 없어서 크롬북이어도 괜찮았지만, 좋은 디자인이나 고해상도 제품이 없어서 ThinkPad를 샀습니다.\n사양은 아래와 같고, 가격은 여러 가지 포인트를 사용하여 5만 5천엔대였습니다.\nThinkPad T470s CPU: Intel Core i7 7600U RAM: 24GB SSD: 512GB OS: Windows 10 Pro 64bit 화면: 14.0형 와이드 (논글레어 패널) 해상도: WQHD 액정 2560×1440 무게: 약 1.32kg 비고: 영문 키보드 중고라서 사용감이나 흠집이 있을까 생각했지만, 전혀 문제없어서 좋았습니다. 배터리도 현재 문제없이 사용하고 있습니다.\n현재 생각나는 불만점 Pause 키와 App 키가 없다. Pause 키는 시스템 설정을 여는 단축키로 사용하고 있었다. 또한, App 키는 팝업 메뉴를 열 때 사용하고 있었으므로 없으면 불편하다. 키보드의 화살표 키 바로 곁에 PageUp 키와 PageDown 키가 있어서 자주 잘못 누른다. 이것은 익숙해지는 것일지도 모른다. 그 밖에 검토했지만 사지 않은 PC ASUS Chromebook Flip C436FA (C436FA-ENG) HP 노트북 HP15s-fq 참고 자료: ThinkPad T470s\n","date":"2023-01-13T19:07:00+09:00","image":"http://kenji.blog/p/thinkpad%E4%B8%AD%E5%8F%A4%E3%82%92%E8%B2%B7%E3%81%A3%E3%81%9F/img_hu1990736b7e8b9be3011f0d8e6938401f_246116_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/thinkpad%E4%B8%AD%E5%8F%A4%E3%82%92%E8%B2%B7%E3%81%A3%E3%81%9F/","title":"'ThinkPad(중고)를 샀다'"},{"content":"TeamViewer로 간단한 원격 연결 TeamViewer를 사용하면 원격 데스크톱 연결을 간단하게 할 수 있습니다.\n원격 대상과 원격 주체에서 TeamViewer를 실행하고, 원격 주체에서 원격 대상의 ID와 비밀번호를 입력하면 원격 연결이 가능합니다.\n명령줄에서 원격 연결을 할 경우에는 다음과 같이 합니다.\n1 %ProgramFiles%\\TeamViewer\\TeamViewer.exe -i \u0026lt;ID\u0026gt; -P \u0026lt;Password\u0026gt; \u0026lt;ID\u0026gt;에는 원격 대상의 ID를, \u0026lt;Password\u0026gt;에는 원격 대상의 비밀번호를 입력합니다.\n위의 명령어로 바로가기 파일을 만들어 두면, ID/PW 입력을 생략할 수 있어 편리합니다.\n참고 사이트: Command line parameters\n","date":"2023-01-13T01:45:00+09:00","image":"http://kenji.blog/p/teamviewer%E3%81%A7%E7%B0%A1%E5%8D%98%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E6%8E%A5%E7%B6%9A/img_hu6a85c6015d61f1656b290295e2fefc2b_15316_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/teamviewer%E3%81%A7%E7%B0%A1%E5%8D%98%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E6%8E%A5%E7%B6%9A/","title":"TeamViewer로 간단한 원격 연결"},{"content":" 어리석은 자는 경험에서 배우고, 현명한 자는 역사에서 배운다 (폰 비스마르크)\n물고기를 주지 말고, 낚시하는 법을 가르쳐라 (노자)\n갈망하라, 우직하게 (스티브 잡스)\n완벽을 목표로 하기보다 일단 해내라 (마크 저커버그)\n단순함을 유지하라 (제임스 고슬링)\n나를 싫어하는 사람들을 신경 쓸 시간이 없다. 나를 사랑하는 사람들을 사랑하기에도 너무 바쁘다. (스누피)\n인간에게 있어 가장 큰 행복은 『자신의 능력을 살릴 수 있는 일을 만나는 것』 (카를 마르크스)\n어설픈 지식이 위험하다고 한들, 그 위험에서 벗어날 만큼 충분한 지식을 가진 사람이 과연 어디 있을까. (토머스 헉슬리 1877)\n트위들디가 덧붙여 말했다. \u0026ldquo;거꾸로 말해서, 만약 그렇다면 그럴지도 모르지. 만약 그랬다면, 그렇게 되었을 거야. 하지만 그렇지 않으니까 그렇지도 않아. 그것이 바로 논리라는 거지.\u0026rdquo; (루이스 캐럴 『거울 나라의 앨리스』 1872)\n클로드 섀넌이 정보화 시대의 아버지이며, 그의 학문적 성과가 20세기 최고 수준이라고 해도 과언이 아니다. (미국 수학회 평가)\n기호 대수 이론의 현 상황을 아는 사람들은, 이 해석 과정의 타당성이 사용된 기호의 해석에 의존하는 것이 아니라, 기호를 조합하는 법칙에만 근거한다는 것을 안다. (조지 불, 저서 『논리학의 수학적 분석』 서두에서 1847)\n","date":"2022-10-15T17:00:43+09:00","image":"http://kenji.blog/p/%E5%90%8D%E8%A8%80%E9%9B%86/img_hu460fc51ec02f7186f7ea8b0f77e830d9_47559_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E5%90%8D%E8%A8%80%E9%9B%86/","title":"'명언집'"},{"content":"그래프 에디터 간단한 그래프를 생성할 수 있는 웹 페이지를 소개합니다.\nhttps://csacademy.com/app/graph_editor/\n숫자를 입력하여 그래프를 생성할 수 있습니다. 또한, 마우스로 요소를 이동하는 것도 가능합니다.\nDirected를 클릭하면 방향 그래프(유향 그래프)도 생성할 수 있습니다.\n생성된 그래프는 Download as PNG를 통해 이미지로 저장할 수 있습니다.\n","date":"2022-10-13T23:31:11+09:00","image":"http://kenji.blog/p/%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF/img_hu784f47a1f9126188b11445cd2c37bf68_13497_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF/","title":"그래프 에디터"},{"content":"Mathematica로 순회 외판원 문제 풀기 문제 電車でこんな広告を見かけました😁📸 pic.twitter.com/iXEgvtXrpL\n\u0026mdash; 早稲田大学 早水桃子研究室 (@hayamizu_lab) October 11, 2022 해법 1 d=SparseArray[{{1,2}-\u0026gt;10,{2,1}-\u0026gt;10,{1,5}-\u0026gt;15,{5,1}-\u0026gt;15,{1,4}-\u0026gt;12,{4,1}-\u0026gt;12,{1,3}-\u0026gt;20,{3,1}-\u0026gt;20,{2,5}-\u0026gt;10,{5,2}-\u0026gt;10,{3,4}-\u0026gt;10,{4,3}-\u0026gt;10,{3,8}-\u0026gt;30,{8,3}-\u0026gt;30,{3,7}-\u0026gt;20,{7,3}-\u0026gt;20,{3,6}-\u0026gt;25,{6,3}-\u0026gt;25,{4,5}-\u0026gt;15,{5,4}-\u0026gt;15,{4,8}-\u0026gt;20,{8,4}-\u0026gt;20,{5,9}-\u0026gt;18,{9,5}-\u0026gt;18,{5,8}-\u0026gt;15,{8,5}-\u0026gt;15,{6,7}-\u0026gt;5,{7,6}-\u0026gt;5,{7,8}-\u0026gt;35,{8,7}-\u0026gt;35,{8,9}-\u0026gt;12,{9,8}-\u0026gt;12},{9,9},Infinity]; SparseArray 함수로 행렬을 만듭니다. 각각의 요소는 그 요소의 행과 열의 도시 간 거리를 나타냅니다. 예를 들어, 첫 번째 요소 {1,2}-\u0026gt;10은 1과 2의 거리가 10이라는 의미입니다. 끝에서 두 번째 요소 {9,9}는 행렬의 크기를 나타내며, 마지막 요소 Infinity는 지정하지 않은 도시 간 길의 길이가 무한, 즉 길이 없음을 의미합니다.\n1 {len,tour}=FindShortestTour[{1,2,3,4,5,6,7,8,9},DistanceFunction-\u0026gt;(d[[#1,#2]]\u0026amp;)] FindShortestTour 함수로 간단하게 순회 외판원 문제를 풀 수 있습니다. {1,2,3,4,5,6,7,8,9}는 도시의 번호를 나타냅니다. DistanceFunction-\u0026gt;(d[[#1,#2]]\u0026amp;)는 도시 간의 거리를 나타내는 행렬 d를 전달하고 있습니다.\n출력 1 {137, {1, 2, 5, 9, 8, 7, 6, 3, 4}} 출력은 최단 거리와 그때의 순회로입니다. 최단 거리는 137, 순회로는 1→2→5→9→8→7→6→3→4→1이 됩니다. ABC 순서로 고치면 A, B, E, I, H, G, F, C, D가 됩니다.\n","date":"2022-10-12T19:05:58+09:00","image":"http://kenji.blog/p/mathematica%E3%81%A7%E5%B7%A1%E5%9B%9E%E3%82%BB%E3%83%BC%E3%83%AB%E3%82%B9%E3%83%9E%E3%83%B3%E5%95%8F%E9%A1%8C%E3%82%92%E8%A7%A3%E3%81%8F/img_hucba782cf2f6047b30fd8084b4d887659_22760_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/mathematica%E3%81%A7%E5%B7%A1%E5%9B%9E%E3%82%BB%E3%83%BC%E3%83%AB%E3%82%B9%E3%83%9E%E3%83%B3%E5%95%8F%E9%A1%8C%E3%82%92%E8%A7%A3%E3%81%8F/","title":"Mathematica로 순회 외판원 문제 풀기"},{"content":"Web페이지 내의 체크박스를 전체 체크하려면, F12로 DevTools를 열고, 콘솔에 다음 코드를 붙여넣어 실행합니다.\n1 2 3 4 5 6 let boxes = document.querySelectorAll(\u0026#39;input[type=\u0026#34;checkbox\u0026#34;]\u0026#39;); for (let i = 0; i \u0026lt; boxes.length; i++) { if (!boxes[i].disabled) { boxes[i].checked = true; } } 또는,\n새로 북마크를 생성하고, 등록할 주소(보통 https://\u0026hellip;라고 입력하는 부분)에 다음 코드를 붙여넣어 등록합니다. 체크하고 싶은 Web페이지를 표시하고, 생성한 북마크를 클릭하면 모든 체크박스가 체크됩니다.\n1 javascript:(function(){let boxes=document.querySelectorAll(\u0026#39;input[type=\u0026#34;checkbox\u0026#34;]\u0026#39;);for(let i=0;i\u0026lt;boxes.length;i++){if(!boxes[i].disabled){boxes[i].checked=true;}}})(); 전체 해제할 경우에는, 위 스크립트의 boxes[i].checked = true; 부분을 boxes[i].checked = false;로 변경해 주세요.\n","date":"2022-10-05T20:07:06+09:00","image":"http://kenji.blog/p/web%E3%83%9A%E3%83%BC%E3%82%B8%E5%86%85%E3%81%AE%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%82%92%E5%85%A8%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B/img_hu556225b69f77e68d5b8659c3dfad5080_9228_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/web%E3%83%9A%E3%83%BC%E3%82%B8%E5%86%85%E3%81%AE%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%82%92%E5%85%A8%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B/","title":"Web페이지 내의 모든 체크박스를 전체 체크하기"},{"content":"윌슨의 정리 $p$ 가 소수일 때, $(p−1)!≡−1 \\pmod p$ 가 성립한다.\n오일러의 공식 $e^{iπ}+1=0$\n페르마의 마지막 정리 $n≥3$ 인 정수 $n$ 에 대해, $x^n+y^n=z^n$ 을 만족하는 양의 정수 쌍 $x, y, z$ 는 존재하지 않는다.\n바젤 문제 $1/1^2+1/2^2+1/3^2+1/4^2+...=π^2/6$\n오일러의 소수 생성식 $n^2+n+41$ 은 $n$ 이 $0$ 이상 $39$ 이하의 정수일 때, 모두 소수가 된다.\n","date":"2022-10-05T13:24:50+09:00","image":"http://kenji.blog/p/%E5%A5%BD%E3%81%8D%E3%81%AA%E6%95%B0%E5%BC%8F/img_huc293f175856c5702bca3e96906ea6e7d_155123_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E5%A5%BD%E3%81%8D%E3%81%AA%E6%95%B0%E5%BC%8F/","title":"좋아하는 수식"},{"content":"전제 조건 Windows 11 일 것\n순서 Microsoft Store에서 앱 인스톨러를 설치한다 https://www.microsoft.com/store/productId/9NBLGGH4NNS1 명령 프롬프트에서 앱을 설치한다 1 winget install Google.Chrome 설치할 수 있는 주요 앱 Google Chrome (명령어 winget install Google.Chrome) Microsoft Edge (명령어 winget install Microsoft.Edge) Microsoft Teams (명령어 winget install Microsoft.Teams) Microsoft Office (명령어 winget install Microsoft.Office) Visual Studio Code (명령어 winget install vscode) Slack (명령어 winget install SlackTechnologies.Slack) Discord (명령어 winget install Discord.Discord) Docker Desktop (명령어 winget install Docker.DockerDesktop) Git (명령어 winget install Git) 7zip (명령어 winget install 7zip) VLC (명령어 winget install VideoLAN.VLC) 참고 winget 도구를 사용한 애플리케이션 설치 및 관리\n여담 Paint.Net도 설치할 수 있을까 생각했는데, 설치할 수 없었다.\nhttps://forums.getpaint.net/topic/118574-please-add-paintnet-to-the-available-packages-for-windows-package-manager-winget/\n","date":"2022-10-05T12:15:20+09:00","image":"http://kenji.blog/p/winget-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B/img_hu0f8970b897eb9ee188b975a06c549111_1216_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/winget-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B/","title":"WinGet을 사용하여 명령어로 앱 설치하기"},{"content":"Rust(러스트)의 특징 Mozilla가 개발하고 있는 비교적 새로운 오픈 소스 프로그래밍 언어 가비지 컬렉션이 없으며, 빠르고 시스템 프로그래밍에 특화된 언어 소유권과 차용이라는 독특한 메커니즘을 언어 사양으로 가지며, 메모리 안전성을 보장한다 크로스 플랫폼에서 동작한다 Cargo라는 우수한 패키지 매니저를 표준으로 갖추고 있다 ","date":"2022-10-03T22:47:20+09:00","image":"http://kenji.blog/p/rust%E3%81%AE%E7%89%B9%E5%BE%B4/img_hu184f8481eb552ab7d9cefed2227c58f9_39839_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/rust%E3%81%AE%E7%89%B9%E5%BE%B4/","title":"'Rust의 특징'"},{"content":"GitHub Actions에서 동적으로 변수를 설정하려면, 아래와 같이 $env:GITHUB_ENV에 추가로 기록하면 됩니다.\n【Windows의 경우】\n1 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 name: Rust on: push: branches: [ \u0026#34;master\u0026#34; ] pull_request: branches: [ \u0026#34;master\u0026#34; ] env: CARGO_TERM_COLOR: always jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Get Environment run: | echo \u0026#39;VERSION=1.0.0\u0026#39; \u0026gt;\u0026gt; $GITHUB_ENV echo \u0026#39;NAME=1.0.0\u0026#39; \u0026gt;\u0026gt; $GITHUB_ENV - name: Display Environment run: | echo $env:VERSION echo $env:NAME - name: Create Release id: create_release uses: actions/create-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tag_name: ${{ env.VERSION }} release_name: ${{ env.VERSION }} draft: false prerelease: false - name: Upload Release Asset id: upload-release-asset uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it\u0026#39;s ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps asset_path: ./target/release/${{ env.NAME }}.exe asset_name: ${{ env.NAME }}.exe asset_content_type: application/octet-stream 【Linux의 경우】\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 name: Rust on: push: branches: [ \u0026#34;main\u0026#34; ] pull_request: branches: [ \u0026#34;main\u0026#34; ] env: CARGO_TERM_COLOR: always jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Get Environment run: | echo \u0026#39;VERSION=1.0.0\u0026#39; \u0026gt;\u0026gt; $GITHUB_ENV echo \u0026#39;NAME=hello\u0026#39; \u0026gt;\u0026gt; $GITHUB_ENV - name: Display Environment run: | echo ${{ env.VERSION }} echo ${{ env.NAME }} ","date":"2022-10-02T02:33:35+09:00","image":"http://kenji.blog/p/github-actions%E3%81%A7%E5%8B%95%E7%9A%84%E3%81%AB%E5%A4%89%E6%95%B0%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B/img_1_hua65fb3c79313ad0762e062df80261603_10981_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/github-actions%E3%81%A7%E5%8B%95%E7%9A%84%E3%81%AB%E5%A4%89%E6%95%B0%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B/","title":"GitHub Actions에서 동적으로 변수 설정하기"},{"content":"로컬 태그 삭제하기 git tag 로 로컬에 존재하는 태그를 확인한다. git tag -d v0.1.0 으로 태그를 삭제한다. (v0.1.0 부분에는 삭제하고 싶은 태그를 지정한다) 원격 태그 삭제하기 git ls-remote --tags 로 원격에 존재하는 태그를 확인한다. git push origin --delete v0.1.0 으로 원격에 존재하는 태그를 삭제한다. (v0.1.0 부분에는 삭제하고 싶은 태그를 지정한다) 참고 git에서 tag를 원격과 로컬에서 삭제하는 방법！\n","date":"2022-10-02T02:18:04+09:00","image":"http://kenji.blog/p/git%E3%81%A7%E3%82%BF%E3%82%B0%E3%82%92%E6%B6%88%E3%81%99/img_hu2ecde82e40aa31a994850b70302683b4_5304_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/git%E3%81%A7%E3%82%BF%E3%82%B0%E3%82%92%E6%B6%88%E3%81%99/","title":"'git에서 태그 삭제하기'"},{"content":"Rust에서 간단한 창 표시하기\n1 2 3 4 5 6 7 8 9 10 [package] name = \u0026#34;win\u0026#34; version = \u0026#34;0.1.0\u0026#34; edition = \u0026#34;2021\u0026#34; # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies.winapi] version = \u0026#34;0.3\u0026#34; features = [\u0026#34;winuser\u0026#34;] 소스는 다음과 같습니다\n1 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 #![windows_subsystem = \u0026#34;windows\u0026#34;] use winapi::{ um::{ winuser::{RegisterClassW, WNDCLASSW, CS_HREDRAW, CS_VREDRAW, LoadIconW, IDI_APPLICATION, LoadCursorW, IDC_ARROW, CreateWindowExW, ShowWindow, SW_NORMAL, UpdateWindow, GetMessageW, TranslateMessage, DispatchMessageW, MSG, WM_DESTROY, PostQuitMessage, DefWindowProcW, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT}, wingdi::{GetStockObject, WHITE_BRUSH}, }, shared::{ windef::{HWND, HBRUSH}, minwindef::{UINT, WPARAM, LPARAM, LRESULT}, }, }; use std::ptr; use std::mem; fn main() { unsafe { let class_name = encode(\u0026#34;my_window_class_name\u0026#34;); if !register_wndclass(\u0026amp;class_name) { return; } let hwnd = create_window(\u0026amp;class_name); if hwnd.is_null() { return; } ShowWindow(hwnd, SW_NORMAL); UpdateWindow(hwnd); let mut msg = mem::uninitialized::\u0026lt;MSG\u0026gt;(); loop { if GetMessageW(\u0026amp;mut msg, ptr::null_mut(), 0, 0) == 0 { return; } TranslateMessage(\u0026amp;mut msg); DispatchMessageW(\u0026amp;mut msg); } } } fn encode(source: \u0026amp;str) -\u0026gt; Vec\u0026lt;u16\u0026gt; { source.encode_utf16().chain(Some(0)).collect() } unsafe fn register_wndclass(class_name: \u0026amp;[u16]) -\u0026gt; bool { let mut winc = mem::zeroed::\u0026lt;WNDCLASSW\u0026gt;(); winc.style = CS_HREDRAW | CS_VREDRAW; winc.lpfnWndProc = Some(win_proc); winc.hIcon = LoadIconW(ptr::null_mut(), IDI_APPLICATION); winc.hCursor = LoadCursorW(ptr::null_mut(), IDC_ARROW); winc.hbrBackground = GetStockObject(WHITE_BRUSH as i32) as HBRUSH; winc.lpszClassName = class_name.as_ptr(); RegisterClassW(\u0026amp;winc) \u0026gt; 0 } unsafe fn create_window(class_name: \u0026amp;[u16]) -\u0026gt; HWND { CreateWindowExW( 0, class_name.as_ptr(), encode(\u0026#34;Hello, World!\u0026#34;).as_ptr(), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, ptr::null_mut(), ptr::null_mut(), ptr::null_mut(), ptr::null_mut(), ) } unsafe extern \u0026#34;system\u0026#34; fn win_proc(hwnd: HWND, msg: UINT, w_param: WPARAM, l_param: LPARAM) -\u0026gt; LRESULT { match msg { WM_DESTROY =\u0026gt; PostQuitMessage(0), _ =\u0026gt; return DefWindowProcW(hwnd, msg, w_param, l_param), }; 0 } 참고 Rust에서 Windows 프로그래밍 - CreateWindow편\n","date":"2022-10-01T19:08:58+09:00","image":"http://kenji.blog/p/rust%E3%81%A7%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B/images/rust_logo_huefc2d075e966b0edc0b7186c50038553_22411_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/rust%E3%81%A7%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B/","title":"'Rust에서 간단한 창 표시하기'"},{"content":"Rust에서 테스트를 작성하려면, 테스트 함수 정의 한 줄 위에 #[test] 속성을 붙여 함수를 생성합니다.\n1 2 3 4 5 6 7 8 fn plus(a:i32,b:i32)-\u0026gt;i32 { a+b } #[test] fn plus_test() { assert_eq!(plus(1, 1), 2); } 테스트 코드는 cargo test로 실행할 수 있습니다. 테스트가 성공하면 ok가 출력됩니다. 실패하면 FAILED가 출력됩니다.\n성공한 경우\n1 2 3 4 5 6 7 8 9 C:\\Users\\admin\\Desktop\\test1\u0026gt;cargo test Compiling test1 v0.1.0 (C:\\Users\\admin\\Desktop\\test1) Finished test [unoptimized + debuginfo] target(s) in 0.35s Running unittests src\\main.rs (target\\debug\\deps\\test1-be5d3118bc52cb3a.exe) running 1 test test plus_test ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s 실패한 경우\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 C:\\Users\\admin\\Desktop\\test1\u0026gt;cargo test Compiling test1 v0.1.0 (C:\\Users\\admin\\Desktop\\test1) Finished test [unoptimized + debuginfo] target(s) in 0.33s Running unittests src\\main.rs (target\\debug\\deps\\test1-be5d3118bc52cb3a.exe) running 1 test test plus_test ... FAILED failures: ---- plus_test stdout ---- thread \u0026#39;plus_test\u0026#39; panicked at \u0026#39;assertion failed: `(left == right)` left: `2`, right: `3`\u0026#39;, src\\main.rs:7:5 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: plus_test test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass \u0026#39;--bin test1\u0026#39; ","date":"2022-10-01T02:00:59+09:00","image":"http://kenji.blog/p/rust%E3%81%A7%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E6%9B%B8%E3%81%8F/images/rust_logo_huefc2d075e966b0edc0b7186c50038553_22411_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/rust%E3%81%A7%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E6%9B%B8%E3%81%8F/","title":"'Rust에서 테스트 작성하기'"},{"content":"다음 절차에 따라 Rust에서 MessageBox를 표시할 수 있습니다.\nRust를 설치합니다. Rust 시작하기 참조 명령 프롬프트에서 cargo new --bin MessageBox를 실행합니다. MessageBox 디렉터리로 이동합니다. Cargo.toml을 열고 다음과 같이 수정합니다. 1 2 3 4 5 6 7 8 9 10 [package] name = \u0026#34;hello_world\u0026#34; version = \u0026#34;0.1.0\u0026#34; edition = \u0026#34;2021\u0026#34; # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] winapi = \u0026#34;0.2.7\u0026#34; user32-sys = \u0026#34;0.2.0\u0026#34; src\\main.rs를 열고 다음과 같이 수정합니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 extern crate user32; extern crate winapi; use std::ffi::CString; use user32::MessageBoxA; use winapi::winuser::{MB_OK, MB_ICONINFORMATION}; fn main() { let lp_text = CString::new(\u0026#34;Hello, world!\u0026#34;).unwrap(); let lp_caption = CString::new(\u0026#34;MessageBox Example\u0026#34;).unwrap(); unsafe { MessageBoxA( std::ptr::null_mut(), lp_text.as_ptr(), lp_caption.as_ptr(), MB_OK | MB_ICONINFORMATION ); } } 명령 프롬프트에서 cargo run을 실행합니다. 릴리스 빌드를 하려면 cargo build --release를 실행합니다.\n참고 Hello World MesssageBox example in Rust\n","date":"2022-09-30T23:54:31+09:00","image":"http://kenji.blog/p/rust%E3%81%A7messagebox%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B/images/rust_logo_huefc2d075e966b0edc0b7186c50038553_22411_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/rust%E3%81%A7messagebox%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B/","title":"'Rust에서 MessageBox 표시하기'"},{"content":"안다는 것은 무엇일까? 안녕하세요!\n오늘은 \u0026ldquo;안다는 것은, 무엇일까?\u0026ldquo;라는 주제에 대해 이야기해 볼까 합니다.\n\u0026ldquo;안다\u0026quot;는 것은 사실 모호하다? 일상생활에서 \u0026ldquo;알았다!\u0026ldquo;라고 느끼는 순간이 있지요. 하지만, 잘 생각해보면 그 \u0026ldquo;안다\u0026quot;는 것이 정말 완전한 이해일까요?\n예를 들어, 자동차 운전. 엑셀을 밟으면 나아가고, 브레이크를 밟으면 멈춥니다. 이것은 \u0026ldquo;알고 있다\u0026quot;고 할 수 있을지도 모릅니다. 하지만, 엔진 내부에서 무슨 일이 일어나고 있는지 자세히 설명할 수 있는 사람은 적지 않을까요?\n완전한 이해가 필요할까? 사실, 모든 것을 완전히 이해하지 못해도 일상생활에는 지장이 없는 경우가 많습니다. 스마트폰의 내부 구조를 몰라도 전화를 걸거나 메시지를 보낼 수 있지요.\n그렇다고 해서, \u0026ldquo;아는\u0026rdquo; 것을 경시해도 좋다는 것은 아닙니다. 이해가 깊어지면 새로운 발견이나 깨달음이 생기기도 합니다.\n모르는 것도 많이 있다 세상에는 아직 해명되지 않은 것들이 많이 있습니다. 예를 들어, 인간의 감정이나 의식의 구조, 우주의 기원 등. 이것들은 과학이 진보했음에도 불구하고 여전히 완전히 \u0026ldquo;알지 못하는\u0026rdquo; 분야입니다.\n수학의 세계에서도 \u0026ldquo;골드바흐의 추측\u0026quot;처럼 단순한 문제이면서도 미해결인 것들이 있습니다.\n\u0026ldquo;아는\u0026rdquo; 것의 가치 \u0026ldquo;아는\u0026rdquo; 것이 늘어나면, 자신 있게 설명할 수 있거나, 타인과 효과적으로 소통할 수 있습니다. 또한, 지식이 있음으로써 잘못된 정보에 현혹되기 어려워진다는 이점도 있습니다.\n겸허한 자세가 중요하다 자신이 \u0026ldquo;알지 못한다\u0026quot;는 것을 인식하는 것은 겸손함으로 이어집니다. 그리고 그 인식이 있기 때문에 계속 배우려는 의욕이 생겨납니다.\n그렇기 때문에, \u0026ldquo;아는\u0026rdquo; 것은 중요하지만, 모든 것을 완전히 이해하는 것은 어려운 일입니다. 중요한 것은, 자신의 이해의 한계를 알고 계속 배우려는 자세를 가지는 것이 아닐까요?\n","date":"2022-09-24T02:38:18+09:00","image":"http://kenji.blog/p/%E3%82%8F%E3%81%8B%E3%82%8B%E3%81%A3%E3%81%A6%E3%81%AA%E3%82%93%E3%81%A0%E3%82%8D%E3%81%86/img_hu70cb8dd6d786a678b22436c932461bee_164867_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%82%8F%E3%81%8B%E3%82%8B%E3%81%A3%E3%81%A6%E3%81%AA%E3%82%93%E3%81%A0%E3%82%8D%E3%81%86/","title":"안다는 것은 무엇일까?"},{"content":"왜 수학이나 컴퓨터를 좋아하는 걸까 생각해보았습니다 모든 사람에게 평등하다 사람이나 입장, 장소를 가리지 않고 같은 인풋에 대해 항상 같은 아웃풋을 반환한다.\n규칙이 명확하다 규칙이 명확하게 정해져 있어서, 부조리나 불의가 없다는 것.\n도출해낸 답이나 이론은 영원히 옳다 한 번 도출해낸 답이 나중에 바뀔 걱정이 없다.\n적당한 어려움이 있다 항상 미해결 문제가 있어서, 언제든지 과제 해결에 도전할 수 있다.\n","date":"2022-09-23T01:56:52+09:00","image":"http://kenji.blog/p/%E3%81%AA%E3%81%9C%E6%95%B0%E5%AD%A6%E3%82%84%E8%A8%88%E7%AE%97%E6%A9%9F%E3%81%8C%E5%A5%BD%E3%81%8D%E3%81%AA%E3%82%93%E3%81%A0%E3%82%8D%E3%81%86/img_hue4a786c476ad4bcc54a52cdbffbd292f_6616634_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%81%AA%E3%81%9C%E6%95%B0%E5%AD%A6%E3%82%84%E8%A8%88%E7%AE%97%E6%A9%9F%E3%81%8C%E5%A5%BD%E3%81%8D%E3%81%AA%E3%82%93%E3%81%A0%E3%82%8D%E3%81%86/","title":"왜 수학이나 컴퓨터를 좋아하는 걸까"},{"content":"커뮤니티에 필요한 것 스크래치의 커뮤니티 가이드라인이 매우 세련되고 좋다고 느꼈습니다. 다음과 같은 내용이 적혀 있었습니다.\n누구에게나 존중하는 마음으로 대할 것.\n안전을 유지할 것: 개인 정보나 연락처를 공개하지 마세요.\n도움이 되는 댓글을 달 것.\n리믹스 문화를 이해할 것.\n성실할 것.\n사이트를 편안한 장소로 만들 것.\n이러한 관점은 어느 커뮤니티에나 통용되는 것이라고 생각합니다.\nhttps://ja.scratch-wiki.info/wiki/%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%E3%83%BC%E3%82%AC%E3%82%A4%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3\n","date":"2022-09-23T01:37:43+09:00","image":"http://kenji.blog/p/%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E3%81%93%E3%81%A8/img_hueeaef9e10f0c1990dbbf990f6784494a_314802_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E3%81%93%E3%81%A8/","title":"커뮤니티에 필요한 것"},{"content":"페르마 (P. de Fermat, 1601-1665) 17세기를 대표하는 프랑스의 수학자. 해석기하, 확률론, 미분법 등의 기초를 다졌다. 또한 정수론의 시조이기도 하다.\n디오판토스 (Diophantus, 207경-291경) 그리스의 수학자. 기호법의 도입, 유리수 해의 연구로 유명하다. 저서 『산술』이 대표작이다. 방정식의 유리수 해를 구하는 분야를 디오판토스 해석이라고 부른다.\n오일러 (L. Euler, 1707-1783) 스위스가 낳은 수학왕. 온갖 수학 분야에서 업적을 남겼다. 논문 700편 이상, 저서 45편이 남아 있다.\n르장드르 (A. M. Legendre, 1752-1833) 프랑스의 수학자. 정수론, 타원적분, 인력 문제 등에서 다수의 업적을 남겼다. \u0026lsquo;정수론\u0026rsquo;이라는 말은 그의 주저 『정수론』에서 유래했다.\n쿠머 (E. E. Kummer, 1810-1893) 독일의 수학자. 원분체의 정수론을 페르마의 마지막 정리에 응용하여 큰 성과를 거두었다.\n데카르트 (R. Descartes, 1596-1650) 프랑스의 독창적인 철학자. 대표적인 저작으로 『방법서설』, 『기하학』, 『우주론』 등이 있다.\n파스칼 (B. Pascal, 1623-1662) 확률론과 유체 연구로 알려진 프랑스의 철학자. 나중에 얀센파에 소속되어 종교 활동에 종사했다. 『팡세』는 그때의 저작이다.\n바셰 (C. G. Bachet, 1581-1638) 프랑스의 귀족으로, 취미로 수 퍼즐을 연구했다. 디오판토스의 『산술』 라틴어 번역을 간행하고, 여기에 자신의 연구를 주석으로 게재했다.\n월리스 (J. Wallis, 1616-1703) 영국의 수학자. 주저 『무한의 산술』에서 극한의 개념에 수학적인 형식을 부여하여, 미적분학의 기초를 다지는 데 공헌했다.\n브룽커 (W. Brouncker, 1620-1684) 아일랜드의 귀족. 왕립학회(영국 학사원)의 초대 회장. 수학 애호가로, 월리스 등과 교류가 있었다.\n라그랑주 (J. L. Lagrange, 1736-1813) 이탈리아 태생의 프랑스 수학자. 오일러의 후임으로 베를린 학사원 수학부장을 지냈다. 정수론, 해석역학 등에서 큰 업적을 남겼다.\n지겔 (C. L. Siegel, 1896-1981) 독일의 정수론 학자. 수의 해석적 이론에서 수많은 공헌을 했다.\n피보나치 (L. Fibonacci, 1175경-1250경) 이탈리아의 수학자. 주저 『산반서』에서 인도-아라비아 숫자를 사용하여 보급에 힘썼다. 또한 『제곱의 서』에서 합동수를 논했다.\n베이커 (A. Baker, 1939-) 영국의 정수론 학자. 초월수론에서의 공헌으로 히로나카 헤이스케와 함께 필즈상을 수상했다.\n푸앵카레 (J. Poincare, 1854-1912) 최후의 만능 수학자라 불린 프랑스의 수학자. 보형함수론, 비유클리드 기하학, 미분방정식, 천체역학, 전기역학 등을 비롯해 과학적 평론에서도 탁월한 저작을 남겼다.\n모델 (L. J. Mordell, 1888-1972) 미국 태생의 수학자. 부모는 리투아니아 출신의 이민자이다. 부정방정식론에서 수많은 논문이 있지만, 타원곡선론에서의 모델의 정리는 특히 유명하다. 베유가 이를 일반 대수곡선의 경우로 확장하여, 산술적 대수기하학은 여기서부터 폭발적인 발전을 이루게 된다.\n베유 (A. Weil, 1906-) 유대계 프랑스 수학자. 젊은 시절 페르마 문제에 관심을 가지고 정수론에 응용할 목적으로 대수기하학을 근본적으로 재검토하여 엄격하게 기초를 다졌다. 수학사 저작으로도 알려져 있다.\n메르센 (M. Mersenne, 1588-1648) 프랑스 미님회의 신부. 각지의 수학자들의 왕복 서한을 중재했다. 메르센 수라는 이름의 수도 실은 페르마가 고안한 수이다.\n로베르발 (G. P. de Roberval, 1602-1675) 프랑스의 수학자. 당시 수학자로서 교수직을 얻고 있던 거의 유일한 사람으로, 사이클로이드 연구 등으로 알려져 있다.\n아벨 (N. H. Abel, 1802-1829) 노르웨이의 수학자. 일반 5차 방정식의 불가해성, 타원함수론, 아벨 적분론 등 뛰어난 업적을 남겼으나 젊은 나이에 세상을 떠났다.\n야코비 (K. G. Jacob, 1804-1851) 유대계 독일 수학자. 타원함수론, 세타함수론, 미분방정식, 변분학 등에서 큰 업적을 남겼다. 아벨의 업적을 세상에 소개했다. 과학의 목적을 \u0026lsquo;인간 정신의 명예\u0026rsquo;를 위한 것이라 하며 실용주의를 배격한 것으로도 알려져 있다.\n가우스 (C. F. Gauss, 1777-1855) 독일이 낳은 수학왕. 정수론, 비유클리드 기하학, 측지학, 초기하급수, 곡면론, 지자기 연구 등으로 알려져 있다. 완벽주의자여서, 발판이 보이지 않을 정도로 완성도가 높지 않으면 성과를 공표하지 않았다고 한다. 주저 『산술연구』 등.\n라메 (G. Lame, 1795-1870) 프랑스의 수학자. 탄성역학, 열전도론 등에 공헌했다.\n리우빌 (J. Liouville, 1809-1882) 프랑스의 수학자. 미분방정식, 초월정수론, 함수론에 공헌했다.\n코시 (A. L. Cauchy, 1789-1857) 프랑스의 수학자. 다작을 했으며 이론물리학, 수학에 업적이 많다. 프랑스에서는 가우스에 필적할 정도로 존경받고 있다고 한다.\n갈루아 (E. Galois, 1811-1832) 프랑스의 수학자. 5차 이상의 방정식은 일반적으로 대수적으로 풀 수 없다는 아벨의 정리를 군이라는 개념을 도입하여 해명했다. 젊은 나이에 결투로 쓰러졌는데, 하찮은 여자 문제가 계기였다는 것이 현재는 알려져 있다.\n헨젤 (K. Hensel, 1861-1941) 독일의 수학자. 크로네커의 제자. 함수론적 수법을 응용하여 정수론에 p진법(p진 해석)이라는 이론을 도입했다.\n하세 (H. Hesse, 1898-1979) 독일의 수학자. 헨젤의 제자로, p진 해석의 기초를 다지고 그 응용에 공헌했다. 유체론의 정비, 타원곡선의 L 함수 연구 등.\n크로네커 (L. Kronecker, 1823-1891) 유대계 독일 수학자. 타원함수론, 정수론 등에 공헌. 수학의 산술적 기초를 제창한 것으로도 알려져 있으나, 주관성이 강한 성격으로 베를린 대학의 동료 바이어슈트라스에 대해 불합리한 비판을 하거나 칸토어의 취직을 방해한 것은 그의 생애에 부정적인 이미지를 주고 있다.\n힐베르트 (D. Hilbert, 1862-1943) 독일의 수학자. 불변식론, 대수적 정수론, 수학기초론을 비롯해 수학의 모든 분야에 거대한 발자취를 남겼다. 파리 국제수학자회의(1900)에서 제창한 23개의 문제는 수학 발전에 큰 영향을 미쳤다.\n리만 (B. Riemann, 1826-1866) 독일의 수학자. 복소함수론에서의 리만 면의 개념, 리만 기하학 등 수학의 근본과 관련된 큰 업적을 남겼다.\n팔팅스 (G. Faltings, 1954-) 독일의 수학자. 1983년에 모델 추측을 해결했다.\n와일즈 (A. Wiles, 1953-) 영국 태생의 수학자. 이와사와 주추측, 버치-스위너턴다이어 추측 등의 연구에서 큰 공헌을 한 이 분야의 1인자이다.\n참고문헌 페르마의 마지막 정리가 풀렸다! 오일러부터 와일즈의 증명까지 고단샤\n","date":"2022-09-22T23:06:37+09:00","image":"http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E5%81%89%E4%BA%BA%E3%81%9F%E3%81%A1/img_hu9ac53943fe4f64bfe30a56c18c498d11_667839_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E5%81%89%E4%BA%BA%E3%81%9F%E3%81%A1/","title":"'수학의 위인들'"},{"content":"윈도우 타이틀 열거 PowerShell을 사용하여 현재 열려 있는 윈도우의 타이틀을 열거하는 방법입니다.\n1 Get-Process|where{$_.mainWindowTItle}|Select-Object MainWindowTitle 출력 샘플\n1 2 3 4 5 6 7 8 9 MainWindowTitle --------------- Windows PowerShell Internet Explorer 제목 없음 - 그림판 제목 없음 - 메모장 작업 관리자 Windows 입력 환경 문서 - 워드패드 ","date":"2022-09-20T17:03:15+09:00","image":"http://kenji.blog/p/%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB%E3%81%AE%E5%88%97%E6%8C%99/img_huc312ccf5dbdb1b6edae5dc06174466bf_18265_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB%E3%81%AE%E5%88%97%E6%8C%99/","title":"'윈도우 타이틀 열거'"},{"content":"큰 폴더를 고속 일괄 삭제 탐색기에서 큰 폴더를 삭제할 경우, 폴더의 내용을 모두 탐색한 후에 삭제가 실행되기 때문에 속도가 느립니다. 아래와 같이 명령어로 삭제하면 탐색과 삭제가 동시에 실행되므로 큰 폴더를 고속으로 삭제할 수 있습니다.\n명령 프롬프트에서 대상 폴더의 경로로 이동합니다. DEL /F /Q /S 폴더명 \u0026gt; NUL을 실행합니다. RMDIR /Q /S 폴더명을 실행합니다. ","date":"2022-09-20T16:04:02+09:00","image":"http://kenji.blog/p/%E5%A4%A7%E3%81%8D%E3%81%AA%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%83%BC%E3%82%92%E9%AB%98%E9%80%9F%E4%B8%80%E6%8B%AC%E5%89%8A%E9%99%A4/img_hu0a77dc7478cd7b69f58fbada7141acfe_6495_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E5%A4%A7%E3%81%8D%E3%81%AA%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%83%BC%E3%82%92%E9%AB%98%E9%80%9F%E4%B8%80%E6%8B%AC%E5%89%8A%E9%99%A4/","title":"'큰 폴더를 고속 일괄 삭제'"},{"content":"Salesforce Chatter 전체 삭제 명령어 Salesforce의 Chatter에서 모든 게시글과 첨부 파일을 전체 삭제하는 명령어입니다. 개발자 콘솔을 열고, Debug 메뉴의 「Open Execute Anonymous Window」를 선택한 후, 아래의 코드를 붙여넣고 실행해 주세요. 개인적으로 조직의 용량이 부족해졌을 때 사용하고 있습니다.\n1 2 3 4 5 6 delete [select id from FeedItem]; delete [select id from FeedAttachment]; delete [select id from ContentDocument]; // 휴지통 삭제 database.emptyRecycleBin([select id from ContentDocument where IsDeleted = true ALL ROWS]); ","date":"2022-09-19T21:59:14+09:00","image":"http://kenji.blog/p/salesforce%E3%83%81%E3%83%A3%E3%83%83%E3%82%BF%E3%83%BC%E5%85%A8%E6%B6%88%E3%81%97%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/img_1_hu1e12ce6e6e64d4f046faca027a6e75ab_14487_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/salesforce%E3%83%81%E3%83%A3%E3%83%83%E3%82%BF%E3%83%BC%E5%85%A8%E6%B6%88%E3%81%97%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/","title":"'Salesforce Chatter 전체 삭제 명령어'"},{"content":"Windows에서 평소 사용하는 소소한 팁 모음입니다. Windows를 처음 사용하시는 분들이 읽어주시면 좋겠습니다. Windows 11을 가정하고 있지만, 대부분 Windows 10에서도 사용할 수 있을 것입니다.\n창 닫기 창이 활성화된 상태에서 Alt + F4 창이 활성화된 상태에서 Ctrl + W. 탭 또는 창을 닫기(지원하는 애플리케이션만) 창의 제목 표시줄 왼쪽 아이콘을 더블 클릭하기 창의 제목 표시줄의 ×를 클릭하기 바탕 화면 표시 Win + D. 2번 누르면 원래 창 상태로 돌아갑니다. 아주 잠깐 바탕 화면을 표시하고 싶을 때 유용합니다. Win + M. 모든 앱 최소화. 2번 눌러도 원래대로 돌아오지 않습니다. 음성 입력 Win + H. 음성 입력을 시작합니다. 음성 입력을 종료하려면 Esc 또는 다시 Win + H를 누릅니다. 파일 탐색기에서 기존 우클릭 메뉴 표시하기 Shift + F10 또는 애플리케이션 키를 누릅니다. 애플리케이션 키는 키보드 우측 하단에 있는 키입니다. 범위를 선택하여 화면 캡처 Win + Shift + S로 범위를 선택하여 화면을 캡처할 수 있습니다. Win + Print Screen 또는 단순히 Print Screen으로 전체 화면을 캡처할 수 있습니다. (Win을 붙인 경우에는 C:\\Users\\사용자이름\\Pictures\\Screenshots에 캡처 이미지가 출력됩니다.) Alt + Print Screen으로 현재 창을 캡처할 수 있습니다. 작업 표시줄에 등록된 앱 실행 Win + 숫자 키로 작업 표시줄에 등록된 앱을 실행할 수 있습니다.\n예를 들어 Win + 1을 누르면 작업 표시줄의 가장 왼쪽 앱이 실행됩니다. Win + T로 작업 표시줄 아이콘으로 포커스를 이동할 수 있으며, 이어서 여러 번 Win + T를 누르거나, ← 또는 →로 선택을 이동시키고 Enter 키로 선택된 앱을 실행할 수 있습니다. 확대/축소 Win + +로 Windows 돋보기가 실행됩니다. 추가로 Win + + or -로 화면을 확대/축소할 수 있습니다. 메모장이나 브라우저 등 Ctrl + + or -로 확대/축소할 수 있습니다. (지원하는 앱만) Windows 잠금 Win + L Ctrl + Alt + Del → Space or Enter Windows 종료(셧다운) Win + M이나 Win + D로 바탕 화면을 표시한 상태 또는 Win + T나 Win + B로 작업 표시줄이 활성화된 상태에서 Alt + F4를 누르면 아래와 같은 대화 상자가 표시되므로 \u0026ldquo;시스템 종료\u0026quot;가 선택된 것을 확인하고 Enter Win + R → Alt + F4 → Alt + F4도 가능. Win + X → U → U로 종료할 수 있습니다. 명령 프롬프트나 Win + R의 \u0026ldquo;실행\u0026quot;에서 shutdown /s /t 0을 입력하면 종료할 수 있습니다. 추가로 /f를 붙이면 강제 종료가 됩니다. Windows 다시 시작 Win + M이나 Win + D로 바탕 화면을 표시한 상태 또는 Win + T나 Win + B로 작업 표시줄이 활성화된 상태에서 Alt + F4를 누르면 아래와 같은 대화 상자가 표시되므로 1번 ↓를 눌러 \u0026ldquo;다시 시작\u0026quot;을 선택하고 Enter Win + R → Alt + F4 → Alt + F4도 가능. Win + X → U → R로 다시 시작할 수 있습니다. shutdown /r /t 0으로 다시 시작할 수 있습니다. 추가로 /f를 붙이면 강제 다시 시작이 됩니다. Windows 절전 모드 Win + M이나 Win + D로 바탕 화면을 표시한 상태 또는 Win + T나 Win + B로 작업 표시줄이 활성화된 상태에서 Alt + F4를 누르면 아래와 같은 대화 상자가 표시되므로 1번 ↑를 눌러 \u0026ldquo;절전\u0026quot;을 선택하고 Enter Win + R → Alt + F4 → Alt + F4도 가능. Win + R → 또는 명령 프롬프트에서 rundll32.exe powrprof.dll,SetSuspendState를 입력하면 최대 절전 모드로 전환할 수 있습니다. Windows 로그아웃 Win + M이나 Win + D로 바탕 화면을 표시한 상태 또는 Win + T나 Win + B로 작업 표시줄이 활성화된 상태에서 Alt + F4를 누르면 아래와 같은 대화 상자가 표시되므로 2번 ↑를 눌러 \u0026ldquo;로그아웃\u0026quot;을 선택하고 Enter Win + R → Alt + F4 → Alt + F4도 가능. Win + X → U → I Ctrl + Alt + Del → 2번 Tab or 2번 ↓ → Enter or Space logoff로 로그아웃할 수 있습니다. 키보드로 창 이동 Win + ← : 왼쪽으로 이동 Win + → : 오른쪽으로 이동 Win + ↑ : 위로 이동/최대화 Win + ↓ : 아래로 이동/최소화 Win + Shift + ← or → : 멀티 모니터 간 이동 Win + Alt + ← or → or ↑ or ↓ : 최대화·최소화하지 않고 창 이동 최소화되지 않은 상태에서 Alt + Space 후에 M 그 후, 화살표 키로 이동.\n※ 마우스 커서에 창이 따라오는 상태가 되므로, 화면 밖으로 창이 표시된 상태에서도 구출할 수 있습니다. 작업 관리자에서 프로세스 종료 Ctrl + Shift + Esc로 작업 관리자를 실행할 수 있습니다. Ctrl + Tab으로 탭을 전환할 수 있습니다. 세부 정보 탭에서 Tab을 누른 후, 키보드 영숫자 입력으로 프로세스를 전방 일치 검색할 수 있습니다. 프로세스 이름이 선택된 상태에서 Delete 키, 이어서 Enter 키를 누르면 프로세스를 종료할 수 있습니다. 명령어로 프로세스 이름을 지정하여 종료 taskkill /f /im 프로세스이름으로 프로세스를 종료할 수 있습니다. 예를 들어, taskkill /f /im explorer.exe로 파일 탐색기를 종료할 수 있습니다. 작업 표시줄의 아이콘에서 같은 프로그램 여러 개 실행 작업 표시줄에서 Shift 키를 누른 채로 마우스 왼쪽 클릭을 하면, 여러 개의 같은 프로그램을 실행할 수 있습니다. (다중 실행을 지원하는 앱만) 관리자 권한으로 프로그램 실행 Ctrl + Shift를 누른 채로 프로그램을 실행하면 관리자 권한으로 프로그램을 실행할 수 있습니다. 파일 탐색기 실행 Win + E로 파일 탐색기를 실행할 수 있습니다. Win + R로 \u0026ldquo;실행\u0026quot;을 표시하고 explorer를 입력한 후 Enter Ctrl + Shift + N으로 새 폴더를 만들 수 있습니다. 파일 탐색기에서 열려 있는 위치에서 명령 프롬프트 열기 Windows 11의 경우 우클릭 메뉴의 \u0026ldquo;터미널\u0026quot;에서 명령 프롬프트를 실행할 수 있습니다. 또한, 주소 표시줄에 cmd라고 입력하고 Enter 키를 누르면 명령 프롬프트를 실행할 수 있습니다. 클립보드 검색 기록 표시 Win + V로 클립보드 검색 기록을 표시할 수 있습니다. 과거에 복사한 텍스트나 이미지를 선택하면 다시 복사할 수 있습니다. 실행 Win + R로 \u0026ldquo;실행\u0026quot;을 열 수 있습니다. 다음은 \u0026ldquo;실행\u0026rdquo; 또는 명령 프롬프트에서 실행할 수 있는 명령어 몇 가지를 소개합니다.\nEdge 열기 msedge를 입력하고 Enter Internet Explorer 11(IE11) 열기 powershell.exe -Command \u0026quot;(New-Object -ComObject InternetExplorer.Application).Visible = $true\u0026quot;를 입력하고 Enter 터미널 열기 wt를 입력하고 Enter 제어판 열기 control을 입력하고 Enter explorer.exe shell:::{26EE0668-A00A-44D7-9371-BEB064C98683} 로도 열 수 있습니다. 메모장 실행 notepad를 입력하고 Enter 계산기 실행 calc를 입력하고 Enter 그림판 실행 mspaint를 입력하고 Enter PowerShell 실행 powershell을 입력하고 Enter Visual Studio Code 실행 code를 입력하고 Enter Excel 실행 excel을 입력하고 Enter\n※ Excel이 설치되어 있는 경우에만. Word 열기 winword를 입력하고 Enter\n※ Word가 설치되어 있는 경우에만. PowerPoint 열기 powerpnt를 입력하고 Enter\n※ PowerPoint가 설치되어 있는 경우에만. 시스템 구성 열기 msconfig를 입력하고 Enter 시스템 속성 열기 sysdm.cpl을 입력하고 Enter Windows 버전 정보 열기 winver를 입력하고 Enter 화상 키보드 열기 osk를 입력하고 Enter 워드패드 열기 wordpad 또는 write를 입력하고 Enter 레지스트리 편집기 열기 regedit을 입력하고 Enter 프로그램 및 기능 열기 explorer.exe shell:::{7b81be6a-ce2b-4676-a29e-eb907a5126c5}를 입력하고 Enter 키보드 속성 열기 explorer.exe shell:::{725BE8F7-668E-4C7B-8F90-46BDB0936430}을 입력하고 Enter 마우스 속성 열기 explorer.exe shell:::{6C8EEC18-8D75-41B2-A177-8831D59D2D50}을 입력하고 Enter 소리 열기 explorer.exe shell:::{F2DDFC82-8F12-4CDD-B7DC-D4FE1425AA4D}를 입력하고 Enter 사용자 계정 열기 explorer.exe shell:::{60632754-c523-4b62-b45c-4172da012619}를 입력하고 Enter 표준 메시지 상자의 문자열 복사 Ctrl + C로 표준 메시지 상자의 문자열을 복사할 수 있습니다. 위의 메시지 상자를 복사하면 아래 내용이 클립보드에 복사됩니다. 1 2 3 4 5 6 7 [Window Title] 워드패드 [Main Instruction] 문서에 대한 변경 내용을 저장하시겠습니까? [저장(S)] [저장 안 함(N)] [취소] 명령 프롬프트의 출력을 클립보드에 저장 echo \u0026quot;hello\u0026quot; | clip 등 명령어 뒤에 | clip(파이프+clip)을 붙이면 표준 출력을 클립보드에 복사할 수 있습니다.\n폴더 계층을 텍스트로 출력 명령 프롬프트에서 tree 명령어로 폴더 계층을 트리 형식으로 출력할 수 있습니다.\n출력 샘플\n1 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 C:. ├─.idea │ └─libraries ├─binaryeditorbz ├─blog │ ├─archetypes │ ├─content │ ├─data │ ├─layouts │ ├─static │ └─themes │ └─PaperMod │ ├─.git │ │ ├─branches │ │ ├─hooks │ │ ├─info │ │ ├─logs │ │ │ └─refs │ │ │ ├─heads │ │ │ └─remotes │ │ │ └─origin │ │ ├─objects │ │ │ ├─info │ │ │ └─pack │ │ └─refs │ │ ├─heads │ │ ├─remotes │ │ │ └─origin │ │ └─tags │ ├─.github │ │ ├─ISSUE_TEMPLATE │ │ └─workflows │ ├─assets │ │ ├─css │ │ │ ├─common │ │ │ ├─core │ │ │ ├─extended │ │ │ ├─hljs │ │ │ └─includes │ │ └─js │ ├─i18n │ ├─images │ └─layouts │ ├─partials │ │ └─templates │ ├─shortcodes │ └─_default │ └─_markup (이하 생략) 참고 Windows 키보드 단축키 ","date":"2022-09-18T23:49:29+09:00","image":"http://kenji.blog/p/windows-%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E5%B0%8F%E6%8A%80%E9%9B%86/img_hu13a9ab529476901cdea6aea124c07798_315814_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/windows-%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E5%B0%8F%E6%8A%80%E9%9B%86/","title":"Windows 단축키・팁 모음"},{"content":"제가 개발 작업을 하면서 자주 사용하는 이미지 편집 프로그램 paint.net을 소개합니다.\nWindows 기본 그림판에서는 불가능한 유용한 점 투명 및 투과율을 다룰 수 있다 복잡한 형태의 범위 자동 선택이 가능하다 레이어를 다룰 수 있다 레벨 보정, 명도, 대비 등의 조정을 할 수 있다 다양한 효과(흐림, 왜곡, 노이즈 등)를 적용할 수 있다 기타 특징 무료로 사용할 수 있다 동작이 비교적 가볍다 직관적으로 사용할 수 있어 다루기 까다롭지 않다 일본어(다국어 지원) 고기능이면서도 사용하기 쉬운 프로그램입니다. 저 자신도 아직 모든 기능을 다루지는 못하고 있습니다.\n설치는 이곳에서 https://www.getpaint.net/download.html\n무료 버전을 선택할 경우에는 링크 대상의 아래 빨간 테두리 부분을 클릭해 주세요.\nMicrosoft Store를 경유하여 설치하면 유료가 되는 대신 자동 업데이트가 가능해지는 것 같습니다. 무료 버전에서도 최신 버전 업데이트 정보를 알려주므로 비교적 원활하게 업데이트할 수 있습니다.\n","date":"2022-09-14T19:33:31+09:00","image":"http://kenji.blog/p/paint.net%E3%81%AE%E9%AD%85%E5%8A%9B/img_hu407db422a0531b2d8a8b6fa0ee25fc6c_64699_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/paint.net%E3%81%AE%E9%AD%85%E5%8A%9B/","title":"paint.net의 매력"},{"content":"Github 리포지토리에 커스텀 도메인을 설정하려면 도메인의 DNS 설정을 변경해야 합니다. 여기서는 お名前.com 에서 도메인을 관리하고 있다고 가정하고 설명합니다. 다른 레지스트라에서도 A 레코드를 수정하여 동일한 설정을 할 수 있습니다.\nお名前.com에서 DNS 설정 변경하기 도메인의 DNS 설정을 변경하려면, お名前.com 의 관리 화면에 로그인합니다. 로그인 후, 도메인 관리 화면으로 이동합니다. 도메인 관리 화면으로 이동했다면 DNS 설정을 변경합니다. DNS 설정을 변경하려면 다음과 같이 설정합니다.\nhttps://www.onamae.com/ 에 접속하여 「お名前.com Navi ログイン (onamae.com Navi 로그인)」을 클릭 「お名前ID（会員ID）(onamae ID (회원 ID))」와 「パスワード (비밀번호)」를 입력하고 로그인 버튼을 클릭 「ネームサーバーの設定 (네임서버 설정)」을 클릭 「ドメインのDNS設定 (도메인 DNS 설정)」을 클릭 설정하려는 도메인을 선택하고 「次へ (다음)」을 클릭 「DNSレコード設定を利用する (DNS 레코드 설정을 이용한다)」 오른쪽의 「設定する (설정하기)」를 클릭 TYPE에 A를 선택하고, TTL에 3600, VALUE에 「185.199.108.153」을 입력한 후 「追加 (추가)」를 클릭 7과 동일하게 「185.199.109.153」, 「185.199.110.153」, 「185.199.111.153」에 대해서도 추가 「DNSレコード設定用ネームサーバー変更確認 (DNS 레코드 설정용 네임서버 변경 확인)」에 체크되어 있는지 확인하고 「設定画面へ進む (설정 화면으로 이동)」을 클릭 「意図しないDNS設定変更を防ぐために (의도하지 않은 DNS 설정 변경을 방지하기 위해)」라는 화면이 나타나면 「設定しない (설정하지 않음)」을 클릭 (필요에 따라 선택하세요) 설정 내용을 확인하고 「設定する (설정하기)」를 클릭 이것으로 DNS 설정이 완료되었습니다. 반영되기까지 최대 72시간 정도 걸릴 수 있습니다. 72시간이 지나도 반영되지 않으면 onamae.com 고객지원에 문의해 보세요. 로컬 환경에서 설정이 반영되었는지 확인하려면 다음 명령어를 실행해 보세요. example.com 부분은 확인하려는 도메인으로 변경해 주세요.\nLinux, Mac의 경우 1 dig example.com +noall +answer -t A 결과가 다음과 같이 나타나면 설정이 반영된 것입니다.\n1 2 3 4 example.com. 0 IN A 185.199.108.153 example.com. 0 IN A 185.199.109.153 example.com. 0 IN A 185.199.110.153 example.com. 0 IN A 185.199.111.153 Windows의 경우 1 nslookup -q=a example.com 8.8.8.8 결과가 다음과 같이 나타나면 설정이 반영된 것입니다.\n1 2 3 4 5 6 7 8 9 서버: dns.google Address: 8.8.8.8 권한 없는 응답: 이름: example.com Addresses: 185.199.108.153 185.199.109.153 185.199.110.153 185.199.111.153 Github 저장소에 커스텀 도메인 설정하기 저장소 페이지를 열고 Settings를 클릭합니다. Pages를 클릭합니다. 저장소 소스를 그대로 공개하려면 Source에서 「Deploy from a branch」를 선택합니다. HUGO 등 소스를 빌드하는 경우에는 「GitHub Actions」를 선택합니다. Branch에서 공개할 브랜치를 선택하고 Save를 클릭합니다. Custom domain에 발급받은 도메인을 입력하고 Save를 클릭합니다. 필요에 따라 「Enforce HTTPS」에 체크하여 HTTPS 통신을 지원하도록 설정합니다. [PR] ","date":"2022-09-13T01:16:40+09:00","image":"http://kenji.blog/p/github%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AB%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/images/octocat_hu8f3e107f91a1c645c9aa316280652835_20372_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/github%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AB%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"'Github 저장소에 커스텀 도메인을 설정하는 방법'"},{"content":"dotnet.exe 명령어를 사용하면 간단한 프로그램의 빌드까지 수행할 수 있으므로 사용할 수 있게 해두면 편리합니다.\n.NET SDK 설치 dotnet.exe는 .NET SDK에 포함되어 있으므로, 먼저 .NET SDK를 설치합니다. 관리자 권한으로 cmd.exe를 실행하고, 다음 명령어를 실행합니다.\n1 winget install Microsoft.DotNet.SDK.6 .gitignore 생성하기 dotnet.exe로 .gitignore를 생성하는 명령어는 다음과 같습니다.\n1 dotnet new gitignore 생성된 .gitignore는 다음과 같습니다.\n1 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. ## ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore # User-specific files *.rsuser *.suo *.user *.userosscache *.sln.docstates # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs # Mono auto generated files mono_crash.* # Build results [Dd]ebug/ [Dd]ebugPublic/ [Rr]elease/ [Rr]eleases/ x64/ x86/ [Ww][Ii][Nn]32/ [Aa][Rr][Mm]/ [Aa][Rr][Mm]64/ bld/ [Bb]in/ [Oo]bj/ [Ll]og/ [Ll]ogs/ # Visual Studio 2015/2017 cache/options directory .vs/ # Uncomment if you have tasks that create the project\u0026#39;s static files in wwwroot #wwwroot/ # Visual Studio 2017 auto generated files Generated\\ Files/ # MSTest test Results [Tt]est[Rr]esult*/ [Bb]uild[Ll]og.* # NUnit *.VisualState.xml TestResult.xml nunit-*.xml # Build Results of an ATL Project [Dd]ebugPS/ [Rr]eleasePS/ dlldata.c # Benchmark Results BenchmarkDotNet.Artifacts/ # .NET project.lock.json project.fragment.lock.json artifacts/ # Tye .tye/ # ASP.NET Scaffolding ScaffoldingReadMe.txt # StyleCop StyleCopReport.xml # Files built by Visual Studio *_i.c *_p.c *_h.h *.ilk *.meta *.obj *.iobj *.pch *.pdb *.ipdb *.pgc *.pgd *.rsp *.sbr *.tlb *.tli *.tlh *.tmp *.tmp_proj *_wpftmp.csproj *.log *.vspscc *.vssscc .builds *.pidb *.svclog *.scc # Chutzpah Test files _Chutzpah* # Visual C++ cache files ipch/ *.aps *.ncb *.opendb *.opensdf *.sdf *.cachefile *.VC.db *.VC.VC.opendb # Visual Studio profiler *.psess *.vsp *.vspx *.sap # Visual Studio Trace Files *.e2e # TFS 2012 Local Workspace $tf/ # Guidance Automation Toolkit *.gpState # ReSharper is a .NET coding add-in _ReSharper*/ *.[Rr]e[Ss]harper *.DotSettings.user # TeamCity is a build add-in _TeamCity* # DotCover is a Code Coverage Tool *.dotCover # AxoCover is a Code Coverage Tool .axoCover/* !.axoCover/settings.json # Coverlet is a free, cross platform Code Coverage Tool coverage*.json coverage*.xml coverage*.info # Visual Studio code coverage results *.coverage *.coveragexml # NCrunch _NCrunch_* .*crunch*.local.xml nCrunchTemp_* # MightyMoose *.mm.* AutoTest.Net/ # Web workbench (sass) .sass-cache/ # Installshield output folder [Ee]xpress/ # DocProject is a documentation generator add-in DocProject/buildhelp/ DocProject/Help/*.HxT DocProject/Help/*.HxC DocProject/Help/*.hhc DocProject/Help/*.hhk DocProject/Help/*.hhp DocProject/Help/Html2 DocProject/Help/html # Click-Once directory publish/ # Publish Web Output *.[Pp]ublish.xml *.azurePubxml # Note: Comment the next line if you want to checkin your web deploy settings, # but database connection strings (with potential passwords) will be unencrypted *.pubxml *.publishproj # Microsoft Azure Web App publish settings. Comment the next line if you want to # checkin your Azure Web App publish settings, but sensitive information contained # in these scripts will be unencrypted PublishScripts/ # NuGet Packages *.nupkg # NuGet Symbol Packages *.snupkg # The packages folder can be ignored because of Package Restore **/[Pp]ackages/* # except build/, which is used as an MSBuild target. !**/[Pp]ackages/build/ # Uncomment if necessary however generally it will be regenerated when needed #!**/[Pp]ackages/repositories.config # NuGet v3\u0026#39;s project.json files produces more ignorable files *.nuget.props *.nuget.targets # Microsoft Azure Build Output csx/ *.build.csdef # Microsoft Azure Emulator ecf/ rcf/ # Windows Store app package directories and files AppPackages/ BundleArtifacts/ Package.StoreAssociation.xml _pkginfo.txt *.appx *.appxbundle *.appxupload # Visual Studio cache files # files ending in .cache can be ignored *.[Cc]ache # but keep track of directories ending in .cache !?*.[Cc]ache/ # Others ClientBin/ ~$* *~ *.dbmdl *.dbproj.schemaview *.jfm *.pfx *.publishsettings orleans.codegen.cs # Including strong name files can present a security risk # (https://github.com/github/gitignore/pull/2483#issue-259490424) #*.snk # Since there are multiple workflows, uncomment next line to ignore bower_components # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) #bower_components/ # RIA/Silverlight projects Generated_Code/ # Backup \u0026amp; report files from converting an old project file # to a newer Visual Studio version. Backup files are not needed, # because we have git ;-) _UpgradeReport_Files/ Backup*/ UpgradeLog*.XML UpgradeLog*.htm ServiceFabricBackup/ *.rptproj.bak # SQL Server files *.mdf *.ldf *.ndf # Business Intelligence projects *.rdl.data *.bim.layout *.bim_*.settings *.rptproj.rsuser *- [Bb]ackup.rdl *- [Bb]ackup ([0-9]).rdl *- [Bb]ackup ([0-9][0-9]).rdl # Microsoft Fakes FakesAssemblies/ # GhostDoc plugin setting file *.GhostDoc.xml # Node.js Tools for Visual Studio .ntvs_analysis.dat node_modules/ # Visual Studio 6 build log *.plg # Visual Studio 6 workspace options file *.opt # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) *.vbw # Visual Studio LightSwitch build output **/*.HTMLClient/GeneratedArtifacts **/*.DesktopClient/GeneratedArtifacts **/*.DesktopClient/ModelManifest.xml **/*.Server/GeneratedArtifacts **/*.Server/ModelManifest.xml _Pvt_Extensions # Paket dependency manager .paket/paket.exe paket-files/ # FAKE - F# Make .fake/ # CodeRush personal settings .cr/personal # Python Tools for Visual Studio (PTVS) __pycache__/ *.pyc # Cake - Uncomment if you are using it # tools/** # !tools/packages.config # Tabs Studio *.tss # Telerik\u0026#39;s JustMock configuration file *.jmconfig # BizTalk build output *.btp.cs *.btm.cs *.odx.cs *.xsd.cs # OpenCover UI analysis results OpenCover/ # Azure Stream Analytics local run output ASALocalRun/ # MSBuild Binary and Structured Log *.binlog # NVidia Nsight GPU debugger configuration file *.nvuser # MFractors (Xamarin productivity tool) working folder .mfractor/ # Local History for Visual Studio .localhistory/ # BeatPulse healthcheck temp database healthchecksdb # Backup folder for Package Reference Convert tool in Visual Studio 2017 MigrationBackup/ # Ionide (cross platform F# VS Code tools) working folder .ionide/ # Fody - auto-generated XML schema FodyWeavers.xsd ## ## Visual studio for Mac ## # globs Makefile.in *.userprefs *.usertasks config.make config.status aclocal.m4 install-sh autom4te.cache/ *.tar.gz tarballs/ test-results/ # Mac bundle stuff *.dmg *.app # content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore # General .DS_Store .AppleDouble .LSOverride # Icon must end with two \\r Icon # Thumbnails ._* # Files that might appear in the root of a volume .DocumentRevisions-V100 .fseventsd .Spotlight-V100 .TemporaryItems .Trashes .VolumeIcon.icns .com.apple.timemachine.donotpresent # Directories potentially created on remote AFP share .AppleDB .AppleDesktop Network Trash Folder Temporary Items .apdisk # content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore # Windows thumbnail cache files Thumbs.db ehthumbs.db ehthumbs_vista.db # Dump file *.stackdump # Folder config file [Dd]esktop.ini # Recycle Bin used on file shares $RECYCLE.BIN/ # Windows Installer files *.cab *.msi *.msix *.msm *.msp # Windows shortcuts *.lnk # JetBrains Rider .idea/ *.sln.iml ## ## Visual Studio Code ## .vscode/* !.vscode/settings.json !.vscode/tasks.json !.vscode/launch.json !.vscode/extensions.json Visual Studio용 파일이 많지만, mac의 \u0026lsquo;.DS_Store\u0026rsquo; 등 일반적으로 git 상에서 관리가 필요 없는 것들도 포함되어 있습니다.\n참고 사이트 Windows에 .NET 설치하기 ","date":"2022-09-13T00:25:12+09:00","image":"http://kenji.blog/p/dotnet%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7.gitignore%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B/img_1_huc51d4f51d02497db3544f94dd1182dc1_19208_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/dotnet%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7.gitignore%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B/","title":"'dotnet 명령어로 .gitignore 생성하기'"},{"content":"좋아하는 게임을 떠올려보니 명예의 전당에 오를 법한 게임들뿐이네요. 오래된 게임이 많으니 아직 해보지 않으셨다면 꼭 한 번 즐겨보시기 바랍니다.\n게임보이 초대 게임보이는 1989년 닌텐도에서 발매한 휴대용 게임기입니다. 이후 게임보이 컬러와 게임보이 어드밴스 등 후속 기종이 발매되었습니다.\n①Sa・Ga2 비보전설 1990년 스퀘어(현 스퀘어 에닉스)에서 발매한 RPG 게임입니다. 다양한 스테이지에서 비보라 불리는 보물을 오로지 모으는 스토리로, 제가 처음으로 플레이한 RPG 게임입니다.\n②별의 커비 1992년 닌텐도에서 발매한 액션 게임입니다. 개발사는 HAL 연구소입니다. 적을 빨아들이거나 공기를 마셔 공중에 떠서 진행하는 게임입니다. 음악과 효과음도 꽤 잘 만들어져 리드미컬하게 즐길 수 있는 작품입니다.\n③포켓몬스터 적·녹 1996년 닌텐도에서 발매한 RPG 게임입니다. 개발사는 닌텐도 정보개발본부, 게임 프리크, 크리처스입니다. 이후 애니메이션으로 제작되고 폭발적인 인기를 끌었지만, 저는 이 1세대밖에 해보지 못했습니다.\n슈퍼 패미컴 1990년 닌텐도에서 발매한 가정용 게임기입니다. 해외에서는 SNES(Super Nintendo Entertainment System)라고도 불립니다.\n④슈퍼 마리오 카트 1992년 닌텐도에서 발매한 슈퍼 패미컴용 소프트입니다. 아이템인 등껍질이나 바나나를 던지는 등 상대를 방해하며 순위를 겨루는 레이싱 게임입니다. 가족이나 친구들과 함께 즐겼던 기억이 납니다.\n⑤드래곤 퀘스트 V 천공의 신부 1992년 에닉스에서 발매한 RPG 게임입니다. 결혼 상대를 선택하는 요소나 쓰러뜨린 몬스터를 동료로 만들 수 있는 요소도 있는 게임입니다. 외톨이 메탈을 여러 마리 동료로 만들 때까지 파고들었습니다.\n⑥파이널 판타지 V 1992년 스퀘어에서 발매한 RPG 게임입니다. 직업을 선택하고 스킬을 마스터하는 파고들기 요소가 있습니다. 드래곤 퀘스트와 마찬가지로 오로지 동굴에서 레벨을 올렸던 기억이 납니다.\n⑦톨네코의 대모험 이상한 던전 1993년 춘소프트에서 발매한 로그라이크 게임입니다. 이상한 던전 시리즈의 전신입니다. 매번 랜덤하게 던전의 형태가 바뀌는 것이 특징입니다. 캐치프레이즈는 \u0026ldquo;1000번 놀 수 있는 RPG\u0026quot;입니다.\n⑧이상한 던전 2 풍래의 시렌 1995년 춘소프트에서 발매한 로그라이크 게임입니다. 이상한 던전 시리즈 \u0026lsquo;톨네코의 대모험\u0026rsquo;의 속편입니다. 던전 내에 상점이 있어 아이템을 구매할 수 있습니다. (구매하지 않고 상점에서 나가면 주인이 쫓아옵니다.)\n⑨MOTHER2 1994년 닌텐도에서 발매한 MOTHER 시리즈 두 번째 작품입니다. 개발사는 에이프와 HAL 연구소입니다. 이후 2006년에 MOTHER3가 발매되었습니다. 이토이 시게사토 씨가 프로듀싱한 작품으로, 독특한 세계관과 철학적인 말들이 곳곳에 박혀 있습니다.\n⑩젤다의 전설 신들의 트라이포스 1991년 닌텐도에서 발매한 액션 어드벤처 게임입니다. 다양한 아이템을 모아 소소한 수수께끼를 풀며 진행하는 게임입니다. 이후 다양한 속편이 발매되었습니다.(참고)\n닌텐도 스위치 2017년 닌텐도에서 발매한 가정용 게임기입니다.\n⑪스플래툰 2 2017년 닌텐도에서 발매한 액션 슈팅 게임입니다. 잉크를 사용해 진영을 확보하거나 상대를 쓰러뜨려 승리를 노리는 게임입니다. 2022년에는 속편인 스플래툰 3가 발매되었습니다.\n","date":"2022-09-12T19:28:50+09:00","image":"http://kenji.blog/p/%E5%A5%BD%E3%81%8D%E3%81%AA%E3%82%B2%E3%83%BC%E3%83%A011%E9%81%B8/img_12_hu03b5dadc912359ffea73dab76258d285_471079_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E5%A5%BD%E3%81%8D%E3%81%AA%E3%82%B2%E3%83%BC%E3%83%A011%E9%81%B8/","title":"'좋아하는 게임 11선'"},{"content":"macOS에서 .DS_Store를 자동 생성하지 않도록 하는 명령어는 다음과 같습니다. 터미널에서 실행해 주세요.\n1 defaults write com.apple.desktopservices DSDontWriteNetworkStores true 명령어를 실행한 후 Finder를 재시작합니다.\n1 killall Finder 설정을 원래대로 되돌리려면 다음 명령어를 실행해 주세요.\n1 defaults delete com.apple.desktopservices DSDontWriteNetworkStores false 위와 마찬가지로 설정을 변경한 후에는 Finder를 재시작합니다.\n1 killall Finder ","date":"2022-09-12T16:03:42+09:00","image":"http://kenji.blog/p/macos%E3%81%A7.ds_store%E3%82%92%E8%87%AA%E5%8B%95%E7%94%9F%E6%88%90%E3%81%97%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/img_hu4b5bbd3b572a7a7eb2cc4ecf633430af_78743_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/macos%E3%81%A7.ds_store%E3%82%92%E8%87%AA%E5%8B%95%E7%94%9F%E6%88%90%E3%81%97%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/","title":"macOS에서 .DS_Store를 자동 생성하지 않도록 하는 명령어"},{"content":"현재 디렉토리를 대상 폴더로 이동한 후, 다음 명령어를 실행하면 하위 폴더를 포함하여 .DS_Store를 일괄 삭제할 수 있습니다.\n1 Get-ChildItem . -include \u0026#39;.DS_Store\u0026#39; -Recurse -Force | Remove-Item -Force ","date":"2022-09-12T10:11:42+09:00","image":"http://kenji.blog/p/powershell%E3%81%A7.ds_store%E3%82%92%E4%B8%80%E6%8B%AC%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B/img_hu95c0724bd9a903eadf46c7f648acb682_8907_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/powershell%E3%81%A7.ds_store%E3%82%92%E4%B8%80%E6%8B%AC%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B/","title":"PowerShell에서 .DS_Store 일괄 삭제하기"},{"content":"HUGO에서 사용할 수 있는 쇼트코드 YouTube {{\u0026lt;youtube 123456abc\u0026gt;}}\nTwitter {{\u0026lt;twitter 123456abc\u0026gt;}}\nInstagram {{\u0026lt;instagram 123456abc\u0026gt;}}\nFlickr {{\u0026lt;flickr 123456abc\u0026gt;}}\nVimeo {{\u0026lt;vimeo 123456abc\u0026gt;}}\n기타 Shortcodes\n여담 사이트 상에서 {{\u0026lt; foo \u0026gt;}}라고 표현하고 싶은 경우에는, {{\u0026lt;/* foo */\u0026gt;}}라고 작성해야 합니다.\n","date":"2022-09-11T22:59:52+09:00","image":"http://kenji.blog/p/hugo%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89/img_hu415dc7e70376ac350673d0366f70ca4b_19909_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/hugo%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89/","title":"'HUGO에서 사용할 수 있는 쇼트코드'"},{"content":"기본 레이아웃은 이미지가 중앙에 가로폭 100%로 배치되어 있지만, 조금 크다고 느껴질 때가 있어서, 이미지를 제목 아래에 둘러싸이게 하고, 가로폭을 150px 정도로 변경해 보았습니다.\n파일의 변경 사항은 다음과 같습니다.\nblank.css 여백이나 이미지 크기, 텍스트 표시 줄 수를 변경하기 위해, blank.css에 다음 내용을 추가합니다.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 .entry-content { -webkit-line-clamp: 4; } .entry-footer { text-align: right; } .entry-cover { margin-bottom: initial; text-align: center; } .entry-cover img { border-radius: 4px; display: inline; max-width: 100%; } .post-meta { display: block; text-align: right; } post-entry.css blank.css 쪽에서 정의를 삭제할 수 없었기 때문에, post-entry.css에서 아래의 1줄을 삭제합니다.\n1 2 3 4 5 6 .entry-cover img { border-radius: var(--radius); pointer-events: none; /* width: 100%; */ ← 이 줄을 삭제 height: auto; } list.html 이미지 배치를 변경하기 위해, list.html의 다음 부분을 변경했습니다.\n1 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 \u0026lt;article class=\u0026#34;{{ $class }}\u0026#34;\u0026gt; \u0026lt;!-- {{- $isHidden := (site.Params.cover.hidden | default site.Params.cover.hiddenInList) }} --\u0026gt;\u0026lt;!-- 아래로 이동 --\u0026gt; \u0026lt;!-- {{- partial \u0026#34;cover.html\u0026#34; (dict \u0026#34;cxt\u0026#34; . \u0026#34;IsHome\u0026#34; true \u0026#34;isHidden\u0026#34; $isHidden) }} --\u0026gt;\u0026lt;!-- 아래로 이동 --\u0026gt; \u0026lt;header class=\u0026#34;entry-header\u0026#34;\u0026gt; \u0026lt;h2\u0026gt; {{- .Title }} {{- if .Draft }}\u0026lt;sup\u0026gt;\u0026lt;span class=\u0026#34;entry-isdraft\u0026#34;\u0026gt;\u0026amp;nbsp;\u0026amp;nbsp;[draft]\u0026lt;/span\u0026gt;\u0026lt;/sup\u0026gt;{{- end }} \u0026lt;/h2\u0026gt; \u0026lt;/header\u0026gt; \u0026lt;div style=\u0026#34;display:flex;\u0026#34;\u0026gt;\u0026lt;!-- 추가 --\u0026gt; \u0026lt;div style=\u0026#34;max-width:150px;margin:11px 15px 0px 0px;\u0026#34;\u0026gt;\u0026lt;!-- 추가 --\u0026gt; {{- $isHidden := (site.Params.cover.hidden | default site.Params.cover.hiddenInList) }}\u0026lt;!-- 위에서 이동 --\u0026gt; {{- partial \u0026#34;cover.html\u0026#34; (dict \u0026#34;cxt\u0026#34; . \u0026#34;IsHome\u0026#34; true \u0026#34;isHidden\u0026#34; $isHidden) }}\u0026lt;!-- 위에서 이동 --\u0026gt; \u0026lt;/div\u0026gt;\u0026lt;!-- 추가 --\u0026gt; \u0026lt;div style=\u0026#34;width:100%;\u0026#34;\u0026gt;\u0026lt;!-- 추가 --\u0026gt; {{- if (ne (.Param \u0026#34;hideSummary\u0026#34;) true) }} \u0026lt;div class=\u0026#34;entry-content\u0026#34;\u0026gt; \u0026lt;p\u0026gt;{{ .Summary | plainify | htmlUnescape }}{{ if .Truncated }}...{{ end }}\u0026lt;/p\u0026gt; \u0026lt;/div\u0026gt; {{- end }} {{- if not (.Param \u0026#34;hideMeta\u0026#34;) }} \u0026lt;footer class=\u0026#34;entry-footer\u0026#34;\u0026gt; {{- partial \u0026#34;post_meta.html\u0026#34; . -}} \u0026lt;/footer\u0026gt; {{- end }} \u0026lt;a class=\u0026#34;entry-link\u0026#34; aria-label=\u0026#34;post link to {{ .Title | plainify }}\u0026#34; href=\u0026#34;{{ .Permalink }}\u0026#34;\u0026gt;\u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt;\u0026lt;!-- 추가 --\u0026gt; \u0026lt;/div\u0026gt;\u0026lt;!-- 추가 --\u0026gt; \u0026lt;/article\u0026gt; 비슷한 요구 사항이 적지 않게 있는 것 같습니다.\nhttps://github.com/adityatelange/hugo-PaperMod/discussions/159#discussioncomment-247844\n본가(공식) 쪽에서도 지원해 주면 좋겠네요.\n","date":"2022-09-11T18:50:40+09:00","image":"http://kenji.blog/p/papermod%E3%81%AE%E7%94%BB%E5%83%8F%E3%81%AE%E9%85%8D%E7%BD%AE%E5%A4%89%E6%9B%B4/images/img_hu42e770ebe6b22298fe9d1751d1191316_24734_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/papermod%E3%81%AE%E7%94%BB%E5%83%8F%E3%81%AE%E9%85%8D%E7%BD%AE%E5%A4%89%E6%9B%B4/","title":"'PaperMod 이미지 배치 변경'"},{"content":"시작하며 PaperMod 테마는 Twitter Card를 지원합니다. 단, Twitter Card 설정은 config.toml 또는 각 게시물의 *.md 헤더 정보에 작성해야 합니다. 각 게시물과 config.toml 양쪽에 설정한 경우에는, 각 게시물의 헤더 정보가 우선됩니다.\n설정 방법 config.toml config.toml에는 [params] 아래에 images라는 항목을 추가합니다. images에는 Twitter Card에 표시할 이미지의 경로를 작성합니다. 이미지를 static 폴더에 배치할 경우에는 파일 이름만 지정하면 됩니다.\n1 2 [params] images = [\u0026#34;twitter_card.jpg\u0026#34;] 폴더 구성\n1 2 3 4 5 6 7 8 9 10 root │ config.toml (여기에 작성) ├─content │ └─posts │ └─게시물 폴더 │ │ index.md (여기에 작성) │ └─images │ cover.png (여기에 배치) └─static twitter_card.jpg (여기에 배치) 각 게시물의 헤더 정보 각 게시물의 헤더 정보에는 cover 아래에 image라는 항목을 추가합니다. relative를 true로 하면, 게시물의 *.md로부터의 상대 경로로 지정할 수 있습니다.\n1 2 3 cover: image: \u0026#34;images/cover.jpg\u0026#34; relative: true 게시물 상단에는 표시하고 싶지 않은 경우 게시물 상단에 커버 이미지를 표시하고 싶지 않은 경우에는 cover 아래에 hidden이라는 항목을 추가하고 true로 설정합니다.\n1 2 3 4 cover: image: \u0026#34;images/cover.jpg\u0026#34; relative: true hidden: true 이미지 크기에 대하여 현재 PaperMod의 사양상 Twitter Card의 크기는 summary_large_image만 지원하는 것 같습니다. summary_large_image의 적절한 크기(해상도)는 여러 의견이 있지만 800 x 418(이미지 비율 1.91:1) 정도가 좋을 것 같습니다.\n참고 사이트1 참고 사이트2\n가능하다면, 이미지 크기를 리사이징하여 게시하는 것을 추천합니다.\n설정 확인 방법 Twitter Card의 설정을 확인하려면 Twitter Card Validator를 이용합니다. 단, 제 환경에서는 미리보기가 잘 표시되지 않았기 때문에, 만약 미리보기가 표시되지 않는다면 비공개 계정 등을 이용해 게시 전에 한번 확인해 보는 것을 추천합니다.\n","date":"2022-09-10T18:41:22+09:00","image":"http://kenji.blog/p/papermod%E3%81%A7twitter-card%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/images/img_hu5e280b2f775d1811bb256626ef7709c6_973665_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/papermod%E3%81%A7twitter-card%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"'PaperMod에서 Twitter Card를 설정하는 방법'"},{"content":"소개 GitHub Copilot은 GitHub가 개발한 AI 기반 코드 자동 완성 도구입니다. 개발 환경인 IntelliJ IDEA에 GitHub Copilot 플러그인을 설치하면 IntelliJ IDEA에서도 GitHub Copilot을 사용할 수 있습니다. 활성화하려면 GitHub 계정이 필요합니다.\n설치 방법 IntelliJ IDEA의 메뉴에서 File을 클릭하고 Settings를 선택합니다. Plugins를 선택하고 검색창에서 \u0026lsquo;GitHub Copilot\u0026rsquo;을 검색합니다. Install 버튼을 눌러 설치합니다. Restart IDE 버튼을 눌러 IntelliJ IDEA를 재시작합니다. IntelliJ IDEA를 재시작하면 설치가 완료됩니다. 활성화 우측 하단의 아이콘을 클릭합니다. Login to Github을 클릭합니다. Copy and Open 버튼을 클릭합니다. 브라우저가 열립니다. GitHub에 로그인되어 있지 않다면 로그인한 후, Ctrl+V로 코드를 붙여넣고 Continue 버튼을 클릭합니다. Authorize GitHub Copilot Plugin 버튼을 클릭합니다. 위 화면이 표시되면 활성화가 완료된 것입니다. 사용해보기 IntelliJ IDEA의 에디터에서 문자 몇 개를 입력하면 GitHub Copilot이 코드의 다음 부분을 제안해 줍니다. 그럼 AI의 강력한 자동 완성 기능을 즐겨보세요!\n","date":"2022-09-10T09:44:55+09:00","image":"http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_hu78c7d99017ff4692861292fedffeefef_291492_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/","title":"IntelliJ IDEA에서 GitHub Copilot 사용하기"},{"content":"시작하며 Go는 Google이 2009년에 공개한 비교적 새로운 프로그래밍 언어입니다. Go의 컴파일러, 도구, 라이브러리는 오픈 소스로 공개되어 있습니다. 또한, Go는 C 언어나 Java와 같은 정적 타입 언어이지만, C 언어와 같은 포인터를 사용하지 않는 언어입니다.\n설치 방법 Go 설치\n위 사이트에서 각 플랫폼용 설치 프로그램이 공개되어 있습니다.\n화면에 따라 설치를 진행합니다. 설치가 완료되었습니다. 간단하죠.\n첫 번째 프로그램 다음 프로그램을 hello.go로 저장합니다.\n1 2 3 4 5 6 7 package main import \u0026#34;fmt\u0026#34; func main() { fmt.Printf(\u0026#34;Hello World\\n\u0026#34;) } 명령 프롬프트나 터미널에서 go run hello.go를 실행하면 Hello, world!가 출력됩니다.\n컴파일할 경우에는 go build hello.go를 실행하면 hello.exe가 생성됩니다. hello.exe를 실행하면 Hello, world!가 출력됩니다.\n웹 페이지에서 코드를 실행할 수도 있습니다 https://go.dev/play/\n일본어 문서 http://go.shibu.jp/\nGo를 배우는 데 필요한 설명은 위 링크(일본어 번역판)에 모여 있습니다. Go와 관련된 기술은 오픈되어 있어서 종이 교재를 구입할 필요가 없을 정도로 충실합니다.\n그럼 즐거운 Go 라이프를!\n","date":"2022-09-10T00:48:17+09:00","image":"http://kenji.blog/p/go%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/images/cover_hu90f0e026fa77d6f7268f9adc11e245d4_5801_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/go%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"'Go를 설치하는 방법'"},{"content":"헤겔의 변증법이란 헤겔은 이성이 빠지는 모순의 적극적인 의의를 포착하여, 일반적으로 유한한 것은 모두 자기에게 내재하는 모순을 동인으로 하여 대립물을 낳고, 그것을 매개로 하여 함께 보다 고차원적인 단계로 지양된다고 주장하고, 이것을 현실 세계의 일체의 운동의 원리로 삼았다. (코토뱅크에서)\n나의 해석은, 현실 세계의 모든 주의 주장이나 생각은, 그저 일변도로 올바르다는 것이 아니라, 내부에 반드시 모순을 내포하고 있어서, 그 대립하는 구조를 이해하거나 받아들이는 가운데, 보다 높은 수준으로 인식이 발전해 나간다는 것.\n이것은, 사람의 사고방식 뿐만이 아니라, 자연계의 모든 현상에도 해당된다고 생각한다.\n모든 물질은 작용이 일어 나면 반작용이 일어 나고, 모든 물건이 움직이면 마찰이 일어나며, 인력은 태양이나 지구뿐만 아니라 모든 물질끼리 서로 영향을 주고받고 있다. 강물의 흐름도 바람의 흐름도, 한 방향으로만 흐르는 것이 아니라, 여러가지 힘을 받아, 찰나에 흐름이 변화해 간다.\n기술적인 이야기로 말하자면, 컴퓨터 프로그램도 내부에 반드시 버그를 내포하고 있고, 그것을 제거함으로써 보다 수준 높은 프로그램이 되어 간다. 버그가 없는 프로그램은 발전하지 않은 재미없는 프로그램이라고 할 수 있을 것이다. 그것은 언젠가 쇠퇴해 갈 것이다.\n주변 환경은 시대와 함께 계속 변화하고 있습니다. 자기모순을 무시하거나 이상하게 정당화하거나, 사고방식을 고정화하는 것이 아니라, 항상 자신의 사고방식, 사물을 파악하는 방식을 항상 재검토하고, 유연하게 사고를 바꾸어 나가고 싶네요.\n","date":"2022-09-09T23:13:19+09:00","image":"http://kenji.blog/p/%E3%83%98%E3%83%BC%E3%82%B2%E3%83%AB%E3%81%AE%E5%BC%81%E8%A8%BC%E6%B3%95/images/img_huf44f6813611a65fb4bf58b8763a4133a_83624_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%83%98%E3%83%BC%E3%82%B2%E3%83%AB%E3%81%AE%E5%BC%81%E8%A8%BC%E6%B3%95/","title":"헤겔의 변증법"},{"content":"몇 년 만에 카무쿠라(라멘)에 다녀왔습니다.\n파김치 라멘\n맛있었습니다. 가끔 먹고 싶어지는 맛이네요.\n","date":"2022-09-09T21:45:19+09:00","image":"http://kenji.blog/p/%E4%BD%95%E5%B9%B4%E3%81%8B%E3%81%B6%E3%82%8A%E3%81%AE%E7%A5%9E%E5%BA%A7%E3%81%8B%E3%82%80%E3%81%8F%E3%82%89%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%B3/images/img2_hu5b1c55ddd3b998ef9e1e7da203dc1109_434676_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/ko/p/%E4%BD%95%E5%B9%B4%E3%81%8B%E3%81%B6%E3%82%8A%E3%81%AE%E7%A5%9E%E5%BA%A7%E3%81%8B%E3%82%80%E3%81%8F%E3%82%89%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%B3/","title":"'몇 년 만의 카무쿠라(라멘)'"},{"content":"Rust로 소수를 나열하는 프로그램을 작성해 보았습니다.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 fn main() { let max = 1000; let mut primes = vec![2]; let mut n = 3; loop { let mut is_prime = true; for p in \u0026amp;primes { if n % p == 0 { is_prime = false; break; } } if is_prime { primes.push(n); } n += 2; if n \u0026gt; max { break; } } for p in \u0026amp;primes { println!(\u0026#34;{}\u0026#34;, p); } } ","date":"2022-09-09T07:08:49+09:00","image":"http://kenji.blog/p/rust%E3%81%A7%E7%B4%A0%E6%95%B0%E3%82%92%E5%88%97%E6%8C%99%E3%81%99%E3%82%8B/images/img_hu5b7e04bd1dc0eefb45fd25ac4219842a_9797_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/rust%E3%81%A7%E7%B4%A0%E6%95%B0%E3%82%92%E5%88%97%E6%8C%99%E3%81%99%E3%82%8B/","title":"Rust에서 소수 나열하기"},{"content":"차분한 재즈 플레이리스트 ","date":"2022-09-08T17:40:26+09:00","image":"http://kenji.blog/p/%E8%90%BD%E3%81%A1%E7%9D%80%E3%81%84%E3%81%9F%E3%82%B8%E3%83%A3%E3%82%BA/images/img_huddf559c95c5d412c9cd6a131d9beecb1_1507891_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E8%90%BD%E3%81%A1%E7%9D%80%E3%81%84%E3%81%9F%E3%82%B8%E3%83%A3%E3%82%BA/","title":"'차분한 재즈'"},{"content":"업템포\nElectro Swing Collection Electro Swing Mix 2019 Vol.3 lofi hip hop radio(Live) LoFi 재즈 이것이 매일 열심히 공부하는 동기입니다 | 5 hour lofi hip hop / study / work / chill beats ","date":"2022-09-08T08:39:03+09:00","image":"http://kenji.blog/p/%E3%82%AB%E3%83%95%E3%82%A7%E9%9F%B3%E6%A5%BD/images/img_huc541091b3f264af05ecf07abbd33454f_519675_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%82%AB%E3%83%95%E3%82%A7%E9%9F%B3%E6%A5%BD/","title":"'카페 음악'"},{"content":"노력이 인정받지 못해도 괜찮잖아 45年の人生で手に入れた。ぐずぐずした時、いつも背中を押してくれる言葉たち。 pic.twitter.com/EQgmujOSpg\n\u0026mdash; いれぶん (@eleven_s_s) September 6, 2022 가치관은 훨씬 더 다양하다 나리타 유스케 「인간이 안고 있는 불행 중」\n자신의 행동이 그대로 반영된다 미야자키 하야오의 사고 ","date":"2022-09-08T02:22:52+09:00","image":"http://kenji.blog/p/%E3%83%A2%E3%83%81%E3%83%99%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%B8%8A%E3%81%92%E3%81%A6%E3%81%8F%E3%82%8C%E3%82%8B%E5%8B%95%E7%94%BB/images/img_hu390d0c8e5d67e265b0c5aa8749ccc95d_193793_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%83%A2%E3%83%81%E3%83%99%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%B8%8A%E3%81%92%E3%81%A6%E3%81%8F%E3%82%8C%E3%82%8B%E5%8B%95%E7%94%BB/","title":"동기 부여를 해주는 동영상"},{"content":"메인 PC의 사양을 적어둡니다.\n항목명 값 프로세서 Intel Core i7-8700K CPU @ 3.70GHz 3.70 GHz 메모리 32.0 GB 시스템 종류 64비트 운영 체제, x64 기반 프로세서 OS Windows 11 Enterprise (버전 21H2, 빌드 22000.856) 제조사 주식회사 마우스컴퓨터 ","date":"2022-09-08T01:55:00+09:00","image":"http://kenji.blog/p/%E4%BB%8A%E3%81%AE%E3%83%A1%E3%82%A4%E3%83%B3pc%E3%82%B9%E3%83%9A%E3%83%83%E3%82%AF/images/img_hu731502385ac0a573daf05287c34d796a_240757_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E4%BB%8A%E3%81%AE%E3%83%A1%E3%82%A4%E3%83%B3pc%E3%82%B9%E3%83%9A%E3%83%83%E3%82%AF/","title":"현재 메인 PC 사양"},{"content":"Google Material Symbols and Icons https://fonts.google.com/icons GitHub Octicons https://primer.style/octicons/ Sargam Icons https://sargamicons.com/ Thousands of free icons https://icon-icons.com/ flaticon https://www.flaticon.com/ ICONFINDER https://www.iconfinder.com/ iconfont https://www.iconfont.cn/ open-iconic https://github.com/iconic/open-iconic ","date":"2022-09-07T16:46:56+09:00","image":"http://kenji.blog/p/%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E3%82%A2%E3%82%A4%E3%82%B3%E3%83%B3%E9%9B%86%E3%82%B5%E3%82%A4%E3%83%88/img_2_hu3b0847646c9f4aefba079615d2db35cd_21041_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E3%82%A2%E3%82%A4%E3%82%B3%E3%83%B3%E9%9B%86%E3%82%B5%E3%82%A4%E3%83%88/","title":"'심플한 아이콘 모음 사이트'"},{"content":"PaperMod 테마의 색상을 변경했습니다. 변경 방법은 아래를 참고했습니다.\nhttps://github.com/adityatelange/hugo-PaperMod/discussions/645\nCSS 경로는 아래와 같습니다.\nthemes/PaperMod/assets/css/extended/blank.css\n1 2 3 4 5 6 7 8 9 10 11 12 13 :root { --entry: #fbf7ef; --primary: rgba(113, 103, 91, 1.00); --secondary: rgba(113, 103, 91, 0.95); --tertiary: rgba(113, 103, 91, 0.50); --content: rgba(113, 103, 91, 0.85); --hljs-bg: #34231B; --code-bg: #ebe4d7; --border: #fdfaf5; --theme: #fbf7ef; } .dark { } 다크 모드는 일단 변경하지 않았습니다.\n","date":"2022-09-07T15:30:21+09:00","image":"http://kenji.blog/p/papermod%E3%81%AE%E9%85%8D%E8%89%B2%E5%A4%89%E6%9B%B4/img_hu74d0722ae4db8273d5e32f97bb10689d_10515_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/papermod%E3%81%AE%E9%85%8D%E8%89%B2%E5%A4%89%E6%9B%B4/","title":"'PaperMod 색상 변경'"},{"content":"엄마가 몸이 안 좋아 누워 계실 때, 저녁 준비나 목욕 준비로 \u0026ldquo;이거, 엄마한테 부탁할까?\u0026ldquo;라고 딸(2살)에게 물어보니 \u0026ldquo;안 돼, 코 자고 있으니까!\u0026ldquo;라고 말해서 아이 나름대로 배려하고 있구나 하고 생각했다.\n남을 배려할 줄 아는 사람으로 자라주고 있는 것 같아서 다행이다.\n","date":"2022-09-07T04:40:52+09:00","image":"http://kenji.blog/p/%E5%AD%90%E4%BE%9B%E3%81%AE%E3%81%9D%E3%82%93%E3%81%9F%E3%81%8F/images/img_hud61af1a628f352ef1641794e80547155_144893_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E5%AD%90%E4%BE%9B%E3%81%AE%E3%81%9D%E3%82%93%E3%81%9F%E3%81%8F/","title":"아이의 배려"},{"content":"유행하기 시작하는 사업 찾기 유행하기 시작하는 사업은 핫페퍼 관계자나 세무사에게 물어본다 강자들이 모여 있어 이미 포화 상태에 있는 사업에는 진출하지 않는다 집객할 수 있다는 확신이 드는 사업에만 진출한다 (특수한 집객 방법(모방할 수 없는 방법)을 사용하는 기존 사업자가 있는 사업에는 진출하지 않는다) 철저하게 모방하기 진출하기 전에 어떤 비즈니스 로직인지 연구한다 철저하게 모방한다 그 바탕 위에서 개량한다 시스템화하기 누구나 노력하지 않아도 할 수 있도록 모든 것을 매뉴얼화한다 매출(고객 수 UP, 고객 단가) 상승, 경비(인건비, 광고비) 절감의 아이디어를 고안하여 시스템화한다 경영자의 이념 경영자의 이념은 「기업의 이익을 최대화하는 것」이며 그 이상도 이하도 아니다 사회 공헌이나 종업원에게 호감을 얻는 것을 경영자의 이념으로 하는 것은 NG (그것들은 나중에 자연스럽게 따라온다고 생각한다) ","date":"2022-09-07T02:36:11+09:00","image":"http://kenji.blog/p/%E7%B5%8C%E5%96%B6%E8%80%85%E3%83%A1%E3%83%A2/images/img_hu8e43d40b92b6a98e30d3360e9f3ab85a_162130_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E7%B5%8C%E5%96%B6%E8%80%85%E3%83%A1%E3%83%A2/","title":"'경영자 메모'"},{"content":"제가 일본 사회에 대해 이상하다고 생각하는 것, 생각하고 있는 것을 정리해 보려고 합니다.\n장학금에 대하여 일본의 장학금이라고 하면, 대부분은 이자가 있어 갚아야 하는 것으로 되어 있습니다. 또한, 대학의 학비는 1950년부터 계속 증가하고 있으며, 수급률도 증가하는 추세에 있습니다.\n한편으로 최근의 평균 차입 총액은 324만 엔에 달하는 것 같습니다.\n일본학생지원기구의 장학금 이용자에 있어서, 평균 차입 총액은 324만 3,000엔. 참고\n대학을 졸업하는 22세의 단계에서 300만 엔이나 되는 빚을 짊어지고 있다면, 당연히 결혼 시기도 늦어질 것이고, 아이도 낳기 어려워지는 것은 당연하며, 일본의 저출산 문제의 한 원인이 되고 있다고 생각합니다.\n만연하는 자기책임론 이것은 감각적인 부분이 되겠지만 \u0026lsquo;남은 남\u0026rsquo;이라는 차가운 세상의 시선이 있다고 생각합니다. 이렇게 수십 년 동안 불경기가 계속되면 그렇게 되는 경향도 어쩔 수 없는 것일지도 모르겠지만, 위의 장학금 문제라고 해도 사회 전체의 문제로 파악하지 않고, 선거에서 표 수가 적은 젊은이나 소수의 목소리는 무시되고 있는 것처럼 느껴집니다. 사실 장기적으로 보면 일본 전체에 있어서 매우 중요한 문제임에도 불구하고 말입니다.\n과당한 경쟁으로 향하는 것이 아니라, 어려움을 겪고 있는 사람이나 세대, 그룹이 있다면 다함께 돕자는 정신이 국가에 있어서는 매우 중요한 일이라고 생각합니다. (단, 국가가 \u0026lsquo;자조・공조\u0026rsquo;라고 주장하는 것에는 위화감이 있습니다. 주체적으로 약자 구제에 나서주었으면 합니다.)\n(이 기사는 수시로 업데이트하겠습니다.)\nAI가 보는 일본인의 특징 네, 일본인의 특징에 대해 설명하겠습니다.\n【좋은 면】\n일본인은 예의가 바르고, 타인에 대한 존경이나 응대에 신경을 쓰는 문화가 있습니다. 시간 엄수가 철저하며, 시간을 지키는 것이 존중받고 있습니다. 집단주의적인 사고방식이 강하여, 팀워크나 협조성이 중시되고 있습니다. 청결을 중요하게 여기며, 공공장소에서의 매너나 청소에 열심인 경향이 있습니다. 선물이나 기념품을 소중히 여기며, 감사를 표하는 문화가 널리 침투해 있습니다. 【나쁜 면】\n개인의 의견을 주장하는 것에 서툰 경우가 있어, 의견 충돌을 피하는 경향이 있습니다. 매우 엄격한 근로 문화로, 잔업이나 과로사가 문제시되는 경우도 있습니다. 외국인에 대한 차별이나 배제 문제가 남아있어, 국제사회와의 조화가 논란이 되는 경우가 있습니다. 권위주의적인 경향이 있어, 상사나 연장자의 의견을 무조건적으로 받아들이는 경우가 많다고 지적받기도 합니다. 폐쇄적인 사회로, 외부의 문화나 가치관을 받아들이기 어려운 경향이 있다고 비판받기도 합니다. ","date":"2022-09-06T02:24:11+09:00","image":"http://kenji.blog/p/%E6%97%A5%E6%9C%AC%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E6%80%9D%E3%81%86%E3%81%93%E3%81%A8/images/img_hu105ea1ef9d38a7cb8901ff6c857b887e_168534_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E6%97%A5%E6%9C%AC%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E6%80%9D%E3%81%86%E3%81%93%E3%81%A8/","title":"'일본에 대해 생각하는 것'"},{"content":"시작하며 Rust는 빠르고 메모리 효율이 높은 모듈을 모던한 표기법으로 작성할 수 있는 비교적 새로운 프로그래밍 언어입니다. 멀티 플랫폼을 지원하며, WebAssembly나 임베디드 환경에서도 사용되고 있습니다. 유명한 곳으로는 Firefox나 DropBox, Cloudflare에서도 채택하고 있습니다.\nC++의 대체 언어로도 주목받고 있습니다.\n설치 방법 Rust 설치\n위 사이트에서 각 플랫폼을 위한 설치 방법을 제공하고 있습니다.\n첫 프로그램 다음 프로그램을 main.rs로 저장합니다.\n1 2 3 fn main() { println!(\u0026#34;Hello, world!\u0026#34;); } 명령 프롬프트 또는 터미널에서 rustc main.rs를 실행하면, 컴파일이 진행되며, ./main(Windows의 경우 main.exe)을 실행하면 Hello, world!가 출력됩니다.\n일본어 문서 The Rust Programming Language 일본어판\nRust를 배우는 데 필요한 설명은 위 링크(일본어 번역판)에 모여 있습니다. Rust 교재를 구입할 필요가 없을 정도로 충실하게 구성되어 있습니다.\nWeb에서 실행해 보고 싶은 경우 컴파일러를 설치하지 않고 Web에서 실행해 보고 싶은 경우에는 The Rust Playground를 사용할 수 있습니다. 코드를 입력하고 「실행 버튼」을 누르면, Web 상에서 컴파일되어 실행됩니다.\n","date":"2022-09-06T00:12:36+09:00","image":"http://kenji.blog/p/rust%E3%81%AE%E3%81%AF%E3%81%98%E3%82%81%E3%81%8B%E3%81%9F/images/rust_logo_huefc2d075e966b0edc0b7186c50038553_22411_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/rust%E3%81%AE%E3%81%AF%E3%81%98%E3%82%81%E3%81%8B%E3%81%9F/","title":"'Rust 시작하기'"},{"content":"자택의 인터넷 환경을 플렛츠 광에서 J:COM으로 변경 지인의 소개도 있어서, 자택의 인터넷 회선을 플렛츠 광에서 J:COM으로 바꿨습니다. 이유는,\n매월 요금이 저렴해진다. 3,619엔→2,180엔 인터넷 속도가 100MBps에서 320MBps로 올라간다 라는 점.\n사용해 본 감상 전환한 지 1주일 정도 지났습니다만, 현재로서는 거의 문제는 없습니다. 아래에 조금 신경 쓰였던 부분을 기재합니다.\n실제로 변경하고 깨달았지만 다운로드 속도에 대해서는 확실히 빨라져서 60MBps였던 것이 320MBps 조금 안되게 나오게 되었습니다. 하지만, 업로드 속도에 대해서는, 플렛츠 광일 때는 40MBps는 나왔던 것이 10MBps 정도로 떨어졌습니다. 이것은 아무래도 J:COM 측의 사양인 것 같습니다. 현재로서는 방송을 하거나 대량의 데이터를 업로드할 일은 없기 때문에, 상태를 지켜보겠습니다.\n그리고, 최근에는 가족도 재택근무가 메인이지만, 오늘 처음으로 수십 분 정도 인터넷이 불통되었습니다. 자동으로 복구되었습니다만, 운이 별로 좋지 않을지도 모릅니다. 아직, 전환한 지 1주일이 지나지 않았지만\u0026hellip;\n여담이지만, J:COM은 P2P 통신을 규제하고 있기도 해서 P2P 앱의 속도는 나오지 않는 것 같습니다. P2P를 사용하시는 분은 주의하는 것이 좋습니다.\n서비스에 대해서 계약 시에, Netflix나 Disney+에 가입하면 4만 엔 분의 QUO 카드를 받을 수 있고, 각각의 서비스 계약료와 상계되어 조금이나마 매월 요금이 평균적으로 저렴해진다고 해서, 계약과 동시에 서비스 계약을 했습니다. Netflix는 1년 계약, Disney+는 반년 계약으로 스스로 해지 수속을 밟을 필요가 있는 것 같습니다.\n아직 전환한 지 얼마 되지 않아서, 사용감이나 감상이 추가로 생기면 다시 기사를 갱신하고자 합니다. 그럼,\n09/06 인터넷 연결이 어려워졌다 2022/09/06 13:13경 3분에서 5분 정도 2022/09/06 13:30경 3분에서 5분 정도 그 후 몇 번인가\u0026hellip; DNS가 문제인 것 같아서, 여기를 참고하여 DNS 서버를 설정했습니다. 이걸로 어떻게 될지\u0026hellip; DNS 설정으로도 접속할 수 없는 상태에 빠져서, 지원팀에 문의를 했더니, 긴급 유지보수를 하고 있다는 것\u0026hellip;. 문의 직후부터 접속 상태가 좋아져서 뭔가 대책을 세워주었다고 생각합니다.\n","date":"2022-09-05T22:48:51+09:00","image":"http://kenji.blog/p/%E3%83%8D%E3%83%83%E3%83%88%E7%92%B0%E5%A2%83%E3%82%92%E3%83%95%E3%83%AC%E3%83%83%E3%83%84%E5%85%89jcom%E3%81%AB%E5%A4%89%E3%81%88%E3%81%9F/jcom_hub0ec31ac66f5927be8b28fe767bbeebb_3349_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E3%83%8D%E3%83%83%E3%83%88%E7%92%B0%E5%A2%83%E3%82%92%E3%83%95%E3%83%AC%E3%83%83%E3%83%84%E5%85%89jcom%E3%81%AB%E5%A4%89%E3%81%88%E3%81%9F/","title":"인터넷 환경을 플렛츠 광→J:COM으로 변경했다"},{"content":"HUGO 설치 다운로드 HUGO 다운로드\n위 사이트에서 환경에 맞는 Windows 모듈을 다운로드하여 압축을 풉니다. 제 경우에는 \u0026ldquo;hugo_0.102.3_Windows-64bit.zip\u0026quot;을 다운로드했습니다.\n압축 풀기 다운로드한 zip 파일의 압축을 풀고 그 안의 hugo.exe를 예를 들어 C:\\bin 등 폴더를 만들어 그곳에 복사합니다.\n환경 변수 등록 아무 위치에서나 hugo.exe를 실행하기 위해 환경 변수에 등록합니다. Windows 11에서의 조작이지만 다음과 같은 절차로 등록할 수 있을 것입니다.\nWin+Pause 버튼을 눌러 버전 정보 열기 시스템 고급 설정 클릭 환경 변수 클릭 Path를 선택하고 편집 클릭 새로 만들기를 클릭하고 새 줄에 \u0026ldquo;C:\\bin\u0026quot;을 입력한 후 확인을 눌러 대화 상자 닫기 블로그 프리뷰하기 명령 프롬프트에서 HUGO 블로그 폴더로 이동하여 아래 명령을 실행합니다.\nhugo server -D\n실행 결과는 아래와 같습니다. (-D는 임시 글을 표시하는 옵션입니다.)\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 C:\\Users\\win11\\IdeaProjects\\kenji.blog\u0026gt;hugo server -D Start building sites … hugo v0.102.3-b76146b129d7caa52417f8e914fc5b9271bf56fc windows/amd64 BuildDate=2022-09-01T10:16:19Z VendorInfo=gohugoio | JA -------------------+----- Pages | 39 Paginator pages | 0 Non-page files | 7 Static files | 0 Processed images | 0 Aliases | 13 Sitemaps | 1 Cleaned | 0 Built in 161 ms Watching for changes in C:\\Users\\win11\\IdeaProjects\\kenji.blog\\{archetypes,content,themes} Watching for config changes in C:\\Users\\win11\\IdeaProjects\\kenji.blog\\config.toml Environment: \u0026#34;development\u0026#34; Serving pages from memory Running in Fast Render Mode. For full rebuilds on change: hugo server --disableFastRender Web Server is available at http://localhost:1313/ (bind address 127.0.0.1) Press Ctrl+C to stop 주소는 실행 시 출력되므로 (위 예에서는 http://localhost:1313/), 브라우저에 주소를 복사합니다. 프리뷰는 파일이 저장될 때마다 자동 업데이트됩니다. 프리뷰를 마치려면 명령 프롬프트에서 Ctrl+C를 입력합니다.\n","date":"2022-09-05T12:28:01+09:00","image":"http://kenji.blog/p/hugo%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%A7%E7%92%B0%E5%A2%83%E3%81%A7%E8%A1%A8%E7%A4%BA%E3%83%97%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC/img_hu415dc7e70376ac350673d0366f70ca4b_19909_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/hugo%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%A7%E7%92%B0%E5%A2%83%E3%81%A7%E8%A1%A8%E7%A4%BA%E3%83%97%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC/","title":"'【HUGO】로컬 환경에서 표시 프리뷰'"},{"content":"수학자 주인공이 등장하는 제가 추천하는 영화 3선입니다.\n뷰티풀 마인드 실존하는 미국의 천재 수학자의 반생을 그린 작품. 마지막에는 놀라운 전개가. 주연인 러셀 크로우가 매력적인 연기를 보여줍니다.\n이니그마 로버트 해리스의 소설 『암호기 이니그마를 향한 도전』을 영화화하여 2001년 개봉한 영화. wikipedia 발췌\n이니그마 암호기라는 독일이 만들어낸 암호를 해독하는 이야기.\n이미테이션 게임 이 작품 역시 이니그마를 다룬 암호 해독 이야기. 당시의 세계관을 좋아합니다.\n기적이 내려준 수식 케임브리지 대학의 수학자 하디와 인도의 수학자 라마누잔의 교류를 그린 작품. 수학의 아름다움을 느낄 수 있습니다.\n박사와 그녀의 이론 호킹 박사의 반생을 그린 작품.\n파티클 피버 ","date":"2022-09-05T10:41:00+09:00","image":"http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E8%80%85%E3%81%8C%E7%99%BB%E5%A0%B4%E3%81%99%E3%82%8B%E6%98%A0%E7%94%BB/images/img_hua361131ea597bbd428e36b721aabc571_406520_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/%E6%95%B0%E5%AD%A6%E8%80%85%E3%81%8C%E7%99%BB%E5%A0%B4%E3%81%99%E3%82%8B%E6%98%A0%E7%94%BB/","title":"'수학자가 등장하는 영화'"},{"content":"아이의 책상 아이가 자는 시간이 작업에 몰두할 수 있는 시간입니다. 낮잠이 끝나면 공원에 놀러 가자. 아이패드에서 라이트닝을 HDMI로 변환하는 어댑터가 있으면 오른쪽 책상에서 작업할 수 있을 텐데～\n","date":"2022-09-04T14:29:09+09:00","image":"http://kenji.blog/p/%E4%BB%8A%E6%97%A5%E3%81%AE%E4%BD%9C%E6%A5%AD%E7%92%B0%E5%A2%83/images/today_workplase_hu1fa3ba50725fc9c80ae774069d99ec20_2258565_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/ko/p/%E4%BB%8A%E6%97%A5%E3%81%AE%E4%BD%9C%E6%A5%AD%E7%92%B0%E5%A2%83/","title":"'오늘의 작업 환경'"},{"content":"머리말 이 블로그를 작성할 때는 IntelliJ IDEA를 사용하고 있습니다. Git과의 호환성도 좋고, 마크다운의 프리뷰를 표시해 주기 때문에 편리합니다. 매번 블로그를 작성할 때 md의 헤더에 date를 작성해야 하는데, 해당 날짜 삽입 단축키가 없는 것 같아 아래 사이트를 참고하여 날짜를 삽입하는 명령을 만들어 보았습니다. 도움이 되었으면 좋겠습니다.\nIs there a shortcut for inserting date/time in IntelliJ IDEA?\n설정 절차 메뉴의 「File」 \u0026gt; 「Settings\u0026hellip;」를 엽니다.\n「Editor」 \u0026gt; 「Live Template」 \u0026gt; 「HTML/XML」을 선택한 상태에서 「+」를 클릭합니다. Live Template을 선택합니다. Abbreviation에 「date」를 입력합니다. Description에 「날짜 및 시간을 삽입하다」를 입력합니다. Template Text에 「$date$」를 입력합니다. Edit Variables 버튼을 클릭합니다.\nName에 「date」를 입력합니다. Expression에 date(\u0026quot;yyyy-MM-dd'T'HH:mm:ss'+09:00'\u0026quot;)라고 입력합니다. OK로 대화상자를 닫습니다. Define 또는 Change를 눌러 「Everywhere」에 체크합니다. OK로 대화상자를 닫습니다. 코드 에디터에서 「date」를 입력하고 Enter를 눌러 「2022-09-04T05:59:04+09:00」 날짜가 삽입되면 설정 완료! 이상입니다.\n맺음말 IntelliJ IDEA의 소소한 팁을 발견하면 또 공개하도록 하겠습니다!\n","date":"2022-09-04T05:59:04+09:00","image":"http://kenji.blog/p/intellij-idea%E3%81%A7%E6%97%A5%E4%BB%98%E3%82%92%E8%B2%BC%E3%82%8A%E4%BB%98%E3%81%91%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B/images/IntelliJ_logo_hu4c2377fba6118d83603ae0bd715d16f4_24441_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/intellij-idea%E3%81%A7%E6%97%A5%E4%BB%98%E3%82%92%E8%B2%BC%E3%82%8A%E4%BB%98%E3%81%91%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B/","title":"IntelliJ IDEA에서 날짜를 삽입하는 명령 추가하기"},{"content":"블로그, 시작해 보았습니다 불꽃놀이 같은 것, 코드는 여기\n안녕하세요. 어쩌다 보니 블로그를 시작해 보게 되었습니다.\n특별히 \u0026ldquo;이걸 발신하고 싶다!\u0026rdquo; 같은 거창한 목적은 없고, 기술에 대한 것이나 일상적인 것, 생각난 것을 그대로 적을 수 있는 장소가 있었으면 좋겠다고 생각해서요.\n너무 무리하지 않고, 메모장 같은 느낌으로 해 나가려고 합니다.\nHugo라는 녀석으로 만들고 있습니다 이 블로그는 \u0026ldquo;Hugo\u0026quot;라는 정적 사이트 생성기로 만들고 있습니다. 괜찮은 테마를 찾아서 기세로 도입해 보았습니다. (테마 고르는 데 2시간 정도 걸린 건 비밀입니다)\n코드에 관한 것이나 관심 있는 도구 등도, 가볍게 메모해 나갈 생각입니다.\n아침 코메다 이야기 참고로 오늘 아침에는 조금 일찍 일어나서, 코메다 커피에 다녀왔습니다. 8시 반에 출발해서, 아침 공기를 마시며 터벅터벅.\n미니 시로느와르와 카페오레 A모닝 세트를 주문. 아마 800엔 정도였나? (기억 안 남)\n아침의 카페, 좋네요. 일하기 전에 잠시 멍 때리는 시간이 있으면, 왠지 하루가 잘 풀릴 것 같은 기분이 듭니다.\n그런 느낌으로, 앞으로 느슨하게 써 나가겠습니다. 기술적인 이야기도, 일상적인 일도, 섞어가며 할 예정입니다.\n잘 부탁드립니다!\n","date":"2022-09-02T07:23:00+09:00","image":"http://kenji.blog/p/%E3%83%96%E3%83%AD%E3%82%B0%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F/images/komeda_hue1f0373fafb96162f461ac594cb3e53e_603414_120x120_fill_q75_box_smart1.jpeg","permalink":"http://kenji.blog/ko/p/%E3%83%96%E3%83%AD%E3%82%B0%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F/","title":"'블로그, 시작해 보았습니다'"},{"content":"Salesforce DevTools 사용자 정의 필드를 검색하거나, 사용자 정의 객체의 필드를 일괄적으로 출력할 수 있습니다.\n그 자리에서 SOQL을 작성할 수 있는 것도 편리합니다.\nSalesforce DevTools\nSalesforce advanced Code searcher Salesforce 코드를 검색할 때 편리합니다.\nSalesforce advanced Code searcher\n","date":"2022-05-02T10:39:36+09:00","image":"http://kenji.blog/p/salesforce%E3%81%8A%E3%81%99%E3%81%99%E3%82%81chrome%E6%8B%A1%E5%BC%B5/img_huc75a5c8c4d45e738551ca5afb26f380b_13227_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/ko/p/salesforce%E3%81%8A%E3%81%99%E3%81%99%E3%82%81chrome%E6%8B%A1%E5%BC%B5/","title":"Salesforce 추천 Chrome 확장 프로그램"},{"content":"현대 인터넷 사회의 정보 보안은 RSA 암호를 비롯한 공개키 암호 방식에 의해 보호받고 있습니다. RSA 암호의 안전성 근거는, \u0026lsquo;거대한 합성수의 소인수분해는 계산량적으로 극히 어렵다\u0026rsquo; 는 사실에 의존하고 있습니다.\n이 글에서는 고전 컴퓨터에서 최강의 소인수분해 알고리즘인 \u0026lsquo;일반 수체 체(General Number Field Sieve, GNFS)\u0026rsquo; 의 수학적 메커니즘을 파헤치고, 그것이 왜 피터 쇼어(Peter Shor)가 발견한 \u0026lsquo;쇼어 알고리즘(Shor\u0026rsquo;s Algorithm)\u0026rsquo; 에 의해 완전히 무너지는지, 그 패러다임 시프트를 수식과 개념도를 이용해 철저히 깊이 있게 다룹니다.\n1. 고전 계산에서의 소인수분해 접근법: 페르마의 소인수분해법으로부터의 발전 소인수분해 문제란, 주어진 합성수 $N$에 대하여 $N = p \\times q$가 되는 소수 $p, q$를 찾는 문제입니다.\n기본적인 아이디어는 다음 합동식을 만족하는 자명하지 않은 $x, y$를 찾는 것으로 귀결됩니다.\n$$ x^2 \\equiv y^2 \\pmod N $$ 이를 변형하면,\n$$ x^2 - y^2 \\equiv 0 \\pmod N $$ $$ (x - y)(x + y) \\equiv 0 \\pmod N $$ 여기서 $x \\not\\equiv \\pm y \\pmod N$ 이라면, $\\gcd(x-y, N)$ 또는 $\\gcd(x+y, N)$을 계산함으로써 $N$의 자명하지 않은 인수를 얻을 수 있습니다. 이 사실이 GNFS 등 근대적인 소인수분해 알고리즘의 기초가 됩니다.\n2. 고전 최강의 알고리즘: \u0026lsquo;일반 수체 체(GNFS)\u0026lsquo;의 심연 \u0026lsquo;GNFS\u0026rsquo; 는 오늘날 알려진 고전 컴퓨터용 소인수분해 알고리즘 중에서 가장 빠른 것입니다. 그 시간 복잡도는 준지수 함수적(Sub-exponential)인 시간을 필요로 합니다.\nGNFS의 계산량 수 $N$의 자릿수를 $b = \\log_2 N$이라고 할 때, GNFS의 계산량은 다음과 같이 표현됩니다.\n$$ O\\left( \\exp \\left( \\left(\\frac{64}{9} b\\right)^{1/3} (\\log b)^{2/3} \\right) \\right) $$ 이 식에서 알 수 있듯이, 계산량은 다항식 시간이 아니라 지수 함수보다는 약간 느린 \u0026lsquo;준지수 시간\u0026rsquo; 이 됩니다. 그럼에도 자릿수가 늘어나면 계산 시간은 천문학적으로 증대합니다.\nGNFS의 수학적 메커니즘 GNFS는 크게 4개의 단계로 구성됩니다.\n다항식 선택 (Polynomial Selection) 체질 (Sieving) 행렬의 간소화 (Matrix Reduction) 제곱근 계산 (Square Root) 2.1. 다항식 선택과 대수체 먼저, 정수를 계수로 하는 기약 다항식 $f(x)$와 $g(x)$를 선택합니다. 이들은 공통의 근 $m$을 modulo $N$으로 가지도록 설정됩니다. 즉,\n$$ f(m) \\equiv 0 \\pmod N $$ $$ g(m) \\equiv 0 \\pmod N $$ 일반적으로 $g(x)$는 일차 다항식 $g(x) = x - m$으로 선택됩니다. $f(x)$의 근을 $\\alpha$라고 두면, $\\mathbb{Q}(\\alpha)$라는 \u0026lsquo;대수체\u0026rsquo;(Number Field)가 구성됩니다. $\\mathbb{Q}(\\alpha)$의 환에서의 연산과 일반적인 정수환 $\\mathbb{Z}$의 연산을 준동형 사상 $\\phi: \\alpha \\mapsto m$을 통해 비교합니다.\n2.2. 체질 (Sieving) 다음으로 서로소인 정수 쌍 $(a, b)$를 대량으로 탐색합니다. 목적은 다음 두 값이 각각 \u0026lsquo;B-smooth\u0026rsquo;(비교적 작은 소인수로만 구성됨)가 되는 쌍을 찾는 것입니다.\n$a - bm$ (정수환 위에서의 값) $b^d f(a/b)$ (대수체 위에서의 노름 $N(a - b\\alpha)$에 대응) 여기서 \u0026lsquo;체\u0026rsquo;(Sieve)라고 불리는 고속 탐색 기법이 사용됩니다. 이를 통해 방대한 후보 중에서 조건을 만족하는 $(a, b)$ 쌍을 효율적으로 추출합니다.\n2.3. 행렬의 간소화 (Linear Algebra over GF(2)) 수집한 쌍 $(a, b)$로부터 지수 벡터를 구성하고, 거대한 희소 행렬의 왼쪽 영공간(Left Null Space)을 $\\mathbb{F}_2$(요소가 0과 1뿐인 체) 위에서 구합니다.\n관계식 $ \\prod (a_i - b_i m) $ 와 $ \\prod (a_i - b_i \\alpha) $ 가 각각 제곱원이 되도록 벡터 $v$를 해로 찾습니다. 이는,\n$$ M \\mathbf{x} \\equiv \\mathbf{0} \\pmod 2 $$ 라는 선형 방정식계를 푸는 것과 다름없습니다. 여기서 블록 란초스 알고리즘(Block Lanczos Algorithm)이나 블록 위데만 알고리즘(Block Wiedemann Algorithm) 등의 고도화된 수치 계산 알고리즘이 활용됩니다.\n2.4. 제곱근 계산 마지막으로 대수체와 정수환 양쪽에서 제곱근을 취하고, $x^2 \\equiv y^2 \\pmod N$이라는 관계식을 도출해 냅니다. 그리고 $\\gcd(x-y, N)$을 계산하여 인수를 얻습니다.\n3. 양자 계산에 의한 혁신: \u0026lsquo;쇼어 알고리즘\u0026rsquo; GNFS가 준지수 함수적인 시간을 필요로 하는 반면, 1994년 피터 쇼어가 발표한 \u0026lsquo;쇼어 알고리즘\u0026rsquo; 은 양자 컴퓨터를 사용하여 이 문제를 \u0026lsquo;다항식 시간\u0026rsquo; 에 풀 수 있습니다.\n쇼어 알고리즘의 계산량 양자 비트 수를 $O(\\log N)$이라고 할 때, 시간 복잡도는 다음과 같습니다.\n$$ O((\\log N)^3) $$ 이는 비트 수에 대해 지수 함수적인 폭발을 일으키지 않음을 의미합니다. \u0026lsquo;고전 계산\u0026rsquo; 의 계산량이 우주의 수명을 초과할 만한 거대한 합성수라도, \u0026lsquo;양자 계산\u0026rsquo; 에서는 몇 시간～며칠 만에 해독 가능해진다는 경이로운 결과입니다.\n쇼어 알고리즘의 전체상: 주기 찾기 문제로의 귀결 쇼어 알고리즘은 소인수분해 문제를 \u0026lsquo;주기 찾기 문제\u0026rsquo; 로 교묘하게 귀결시킵니다.\n$N$과 서로소인 무작위 정수 $a$를 선택합니다 ($1 \u003c a \u003c N$). 함수 $f(x) = a^x \\bmod N$을 정의합니다. $f(x)$의 주기 $r$, 즉 $a^r \\equiv 1 \\pmod N$이 되는 최소의 양의 정수 $r$을 찾습니다. $r$이 짝수이면, $a^{r/2} \\not\\equiv -1 \\pmod N$인지 확인하고, $\\gcd(a^{r/2} \\pm 1, N)$을 계산하여 소인수를 얻습니다. 이 3단계의 \u0026lsquo;주기 $r$의 발견\u0026rsquo; 이야말로 고전 컴퓨터에서는 지수 함수적 시간을 필요로 하는 병목 현상이지만, 양자 컴퓨터는 \u0026lsquo;양자 중첩\u0026rsquo; 과 \u0026lsquo;양자 푸리에 변환\u0026rsquo;(QFT)을 사용하여 이를 순식간에 해결합니다.\n4. 양자 푸리에 변환(QFT)과 주기의 추출 쇼어 알고리즘의 핵심인 양자 상태의 조작에 대해 수식으로 자세히 살펴보겠습니다.\n4.1. 양자 중첩의 생성 먼저 2개의 양자 레지스터를 준비합니다. 레지스터 1은 입력 $x$의 중첩 상태를 유지하고, 레지스터 2는 함수의 계산 결과 $f(x)$를 유지합니다. 초기 상태 $|0\\rangle |0\\rangle$에 아다마르 변환(Hadamard Transform)을 적용하여 가능한 모든 $x$의 중첩을 만들어 냅니다.\n$$ |\\psi_1\\rangle = \\frac{1}{\\sqrt{Q}} \\sum_{x=0}^{Q-1} |x\\rangle |0\\rangle $$ (여기서 $Q$는 $N^2 \\le Q \u003c 2N^2$을 만족하는 2의 거듭제곱)\n다음으로 양자 오라클 $U_f$를 사용하여 $f(x) = a^x \\bmod N$을 계산하고 레지스터 2에 저장합니다.\n$$ |\\psi_2\\rangle = U_f |\\psi_1\\rangle = \\frac{1}{\\sqrt{Q}} \\sum_{x=0}^{Q-1} |x\\rangle |a^x \\bmod N\\rangle $$ 여기서 레지스터 2를 측정했다고 가정해 봅시다 (실제로 측정하지 않아도 수학적 구조는 동일합니다). 어떤 값 $y = a^{x_0} \\bmod N$이 관측되었다고 하면, 레지스터 1의 상태는 $f(x) = y$가 되는 모든 $x$의 중첩으로 수축합니다. 주기를 $r$이라고 하면, 그러한 $x$는 $x_0, x_0 + r, x_0 + 2r, \\dots$가 됩니다.\n$$ |\\psi_3\\rangle = \\frac{1}{\\sqrt{M}} \\sum_{k=0}^{M-1} |x_0 + kr\\rangle $$ (여기서 $M \\approx Q/r$은 항의 수)\n이 상태는 주기 $r$의 정보를 내포하고 있지만, 직접 측정해도 무작위한 $x_0 + kr$이 얻어질 뿐, 주기 $r$은 알 수 없습니다. 여기서 QFT가 등장합니다.\n4.2. 양자 푸리에 변환 (Quantum Fourier Transform) 의 적용 QFT는 양자 상태의 진폭에 대해 이산 푸리에 변환을 수행하는 조작입니다. 상태 $|x\\rangle$에 대한 QFT의 작용은 다음과 같이 정의됩니다.\n$$ \\text{QFT} |x\\rangle = \\frac{1}{\\sqrt{Q}} \\sum_{y=0}^{Q-1} e^{2\\pi i \\frac{xy}{Q}} |y\\rangle $$ 이것을 $|\\psi_3\\rangle$에 적용하면, 위상의 간섭(양자 간섭)이 일어납니다.\n$$ |\\psi_4\\rangle = \\text{QFT} |\\psi_3\\rangle = \\frac{1}{\\sqrt{MQ}} \\sum_{y=0}^{Q-1} \\sum_{k=0}^{M-1} e^{2\\pi i \\frac{(x_0 + kr)y}{Q}} |y\\rangle $$ 이 식의 합을 전개하면,\n$$ \\sum_{k=0}^{M-1} e^{2\\pi i \\frac{kry}{Q}} $$ 라는 부분이 나타납니다. 이 기하급수의 합은 $ry/Q$가 정수에 가까울 때에만 보강 간섭(Constructive Interference)이 일어나고, 그 외의 경우에는 상쇄 간섭(Destructive Interference)이 일어납니다.\n따라서 높은 확률로 측정되는 상태 $|y\\rangle$는,\n$$ \\frac{y}{Q} \\approx \\frac{c}{r} $$ 이라는 조건을 만족하는 정수 $y$가 됩니다 ($c$는 어떤 정수).\n4.3. 연분수 전개에 의한 주기 특정 측정을 통해 $y$를 얻은 후, 고전 컴퓨터를 이용하여 $y/Q$를 \u0026lsquo;연분수 전개\u0026rsquo;(Continued Fraction Expansion)합니다. 이를 통해 $y/Q$의 근사 분수 $c/r$을 계산하고, 분모로부터 주기 $r$의 후보를 고효율로 추출할 수 있습니다.\n5. 개념 모델의 비교와 패러다임 시프트 GNFS와 쇼어 알고리즘의 차이를 직관적으로 이해하기 위해, Mermaid 기법을 사용한 개념도를 제시합니다.\n양자 회로에 의한 쇼어 알고리즘의 개념도 1 2 3 4 5 6 7 8 9 10 11 12 13 graph TD A[초기 상태: 0...0] --\u0026gt; B[아다마르 변환으로 모든 상태의 중첩] B --\u0026gt; C[모듈러 거듭제곱 연산 a^x mod N] C --\u0026gt;|양자 얽힘| D[주기성을 가지는 상태로의 수축] D --\u0026gt; E[양자 푸리에 변환 QFT] E --\u0026gt;|간섭에 의한 확률 증폭| F[측정: y를 얻음] F --\u0026gt; G[고전 처리: 연분수 전개] G --\u0026gt; H[주기 r 발견] H --\u0026gt; I[N의 소인수 산출] style A fill:#f9f,stroke:#333,stroke-width:2px style E fill:#bbf,stroke:#333,stroke-width:2px style I fill:#bfb,stroke:#333,stroke-width:2px 패러다임 시프트의 본질 GNFS는 \u0026lsquo;수학적인 공간(대수체) 안에서 관계식을 탐색한다\u0026rsquo; 라는 접근 방식을 취합니다. 하지만 탐색 공간은 자릿수에 대해 지수 함수적으로 확대되기 때문에, 고전 컴퓨터의 계산 능력(병렬화를 포함하더라도)으로는 키 길이가 2048비트 등을 초과하면 사실상 해독이 불가능해집니다.\n반면, 쇼어 알고리즘은 \u0026lsquo;양자 간섭에 의한 파동의 성질\u0026rsquo; 을 이용합니다. 중첩 상태에 있는 모든 계산 경로를 동시에 평가하고, QFT에 의해 불필요한 답을 상쇄(약화)시키고, 정답이 되는 주기의 확률 진폭만을 증폭(강화)시킵니다. 이를 통해 공간을 탐색하는 것이 아니라, \u0026lsquo;정답 그 자체를 떠오르게 한다\u0026rsquo; 는 전혀 다른 차원의 접근 방식을 실현하고 있는 것입니다.\n6. 요약 이 글에서는 고전 한계의 끝판왕인 \u0026lsquo;GNFS\u0026rsquo; 와 양자 계산의 힘을 보여주는 \u0026lsquo;쇼어 알고리즘\u0026rsquo; 에 대해, 각각의 수학적 배경과 알고리즘의 구조를 깊이 비교했습니다.\nGNFS가 다항식의 선택이나 거대한 행렬의 계산 등 수학적 기교를 부려 준지수 시간으로 계산량을 끌어내린 반면, 쇼어 알고리즘은 양자 역학의 기본 원리인 중첩과 간섭을 수학적 도구(QFT)와 융합시켜 단숨에 다항식 시간으로의 혁신을 이루어냈습니다.\n현재 시점에서는 실용적인 규모(수천 양자 비트)로 쇼어 알고리즘을 실행할 수 있는 결함 허용 양자 컴퓨터(FTQC)는 존재하지 않습니다. 하지만 이 수학적·이론적인 패러다임 시프트의 존재야말로, 현재 전 세계적으로 양자 내성 암호(PQC: Post-Quantum Cryptography)로의 이행이 시급해진 가장 큰 이유입니다.\n","date":"0001-01-01T00:00:00Z","image":"http://kenji.blog/p/gnfs-to-shors-algorithm-math-deepdive/quantum_vs_gnfs_eyecatch_1788616101508_hud95a00206aa1dcf32de9cdc0ccb17972_1096815_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/ko/p/gnfs-to-shors-algorithm-math-deepdive/","title":"[수학적 고찰] 왜 암호 해독 알고리즘 'GNFS'는 양자 컴퓨터 시대의 Shor 알고리즘에 패배하는가?"}]