<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title>Hyun 블로그</title>
		<description>Hyun 블로그</description>		
		<link>http://corecode.pe.kr/</link>
		
			<item>
				<title>주간 테크/개발 뉴스 #2026 3/1 ~ 3/7</title>
				        
        <description>&lt;h2 id=&quot;ai&quot;&gt;AI&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=27280&quot;&gt;Claude Code에 가장 적합한 프로그래밍 언어는?&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=27277&quot;&gt;Show GN: 바이브코딩 자율주행 FSD&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=27276&quot;&gt;AI가 일자리를 빼앗고 있을까? 데이터가 말하는 진짜는&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=27274&quot;&gt;Anthropic, 새로운 Slack을 만들어 주세요&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=27273&quot;&gt;OpenAI, Codex를 오픈소스 개발자에게 지원&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=27272&quot;&gt;파이어폭스 보안을 강화하기 위한 Anthropic–Mozilla 협력&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=27268&quot;&gt;Anthropic, 미 전쟁부와의 관계 현황&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3644&quot;&gt;[릴리즈 노트] AI가 직접 컴퓨터 조작, 오픈AI GPT-5.4 출시&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3640&quot;&gt;앤트로픽이 공식 오픈한 무료 강의 플랫폼 — Anthropic Courses&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3638&quot;&gt;VLM, 눈 달린 LLM을 만나보자!&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207663&quot;&gt;앤트로픽, ‘클로드’ 기반 소프트웨어 마켓플레이스 공개&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207662&quot;&gt;오픈AI, 에이전트 보안 도구 ‘코덱스 시큐리티’ 출시&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207623&quot;&gt;오픈AI, 사용자 말 끊는 문제 해결할 ‘양방향’ 오디오 모델 개발 중&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207631&quot;&gt;오픈AI, ‘챗GPT’ 쇼핑 결제 계획 축소…여행사 주가는 ‘껑충’&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4141538/ai%ec%97%90-%ec%8b%9c%eb%8b%ac%eb%a6%b0%eb%8b%a4-%ec%a6%9d%ed%9b%84%ea%b5%b0-%ec%96%91%ec%82%b0%ed%95%98%eb%8a%94-%ec%83%88%eb%a1%9c%ec%9a%b4-%eb%b6%88%ec%95%88%ec%9d%98-%ec%8b%9c.html&quot;&gt;“AI에 시달린다” 증후군 양산하는 새로운 불안의 시대&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4141454/%ec%97%90%ec%9d%b4%ec%a0%84%ed%8a%b8%eb%a5%bc-%ec%9c%84%ed%95%9c-%ed%95%80%ec%98%b5%ec%8a%a4-%eb%a3%a8%ed%94%84-%ec%a0%9c%ed%95%9c-%ed%88%b4-%ed%98%b8%ec%b6%9c-%ec%83%81%ed%95%9c-%ec%97%90.html&quot;&gt;에이전트를 위한 핀옵스 : 루프 제한, 툴 호출 상한, 에이전틱 SaaS의 새로운 단위 경제&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4141450/%eb%a7%88%eb%a6%ac%ec%95%84db%ec%97%90%ec%84%9c-%ec%a3%bc%eb%aa%a9%ed%95%a0-%eb%a7%8c%ed%95%9c-%ec%83%88-%ea%b8%b0%eb%8a%a5-5%ea%b0%80%ec%a7%80.html&quot;&gt;마리아DB에서 주목할 만한 새 기능 5가지&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4141444/%ed%83%90%ec%a7%80-%ed%9a%8c%ed%94%bc%ec%97%90-%ec%a7%91%ec%a4%91%ed%95%98%eb%8a%94-%ea%b3%b5%ea%b2%a9%ec%9e%90%eb%93%a4ai%ec%99%80-%ea%b3%b5%ea%b8%89%eb%a7%9d-%ea%b3%b5%ea%b2%a9-%ea%b2%b0.html&quot;&gt;탐지 회피에 집중하는 공격자들…AI와 공급망 공격 결합&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4140859/%ec%98%a4%ed%94%88ai-%ec%9c%88%eb%8f%84%ec%9a%b0%ec%9a%a9-ai-%ec%bd%94%eb%94%a9-%ec%95%b1-%ec%b6%9c%ec%8b%9c.html&quot;&gt;오픈AI, 윈도우용 AI 코딩 앱 출시&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4140216/%eb%84%a4%ec%9d%b4%ec%b2%98-%eb%a9%94%eb%94%94%ec%8b%a0-%ea%b2%8c%ec%9e%ac-%ec%97%b0%ea%b5%ac-%ec%b1%97gpt-%ec%8b%a0%ea%b7%9c-%ea%b1%b4%ea%b0%95-%ec%84%9c%eb%b9%84%ec%8a%a4%ec%97%90-%ea%b2%bd.html&quot;&gt;네이처 메디신 게재 연구, 챗GPT 신규 건강 서비스에 경고&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4140175/%ec%b1%97gpt%c2%b7%ec%a0%9c%eb%af%b8%eb%82%98%ec%9d%b4%ec%9d%98-%ea%b8%b0%ec%96%b5-%ec%b0%bd%ea%b3%a0-%ec%a7%81%ec%a0%91-%ec%97%b4%ec%96%b4%eb%b3%b4%eb%8a%94-%ed%94%84%eb%a1%ac%ed%94%84%ed%8a%b8.html&quot;&gt;챗GPT·제미나이의 기억 창고, 직접 열어보는 프롬프트&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;backend&quot;&gt;Backend&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=27281&quot;&gt;Show GN: [Marklas] Markdown &amp;lt;-&amp;gt; Atlassian Document Format(ADF) 양방향 변환기&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=27264&quot;&gt;PigeonPod - 어디서나 YouTube를 청취할 수 있는 팟캐스트형 스트리밍 도구&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3632&quot;&gt;JavaScript 날짜 버그, Temporal API로 정리합니다&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4140335/%eb%8b%a4%ec%8b%9c-%eb%ac%b8%ec%a0%9c%eb%8a%94-%eb%84%a4%ed%8a%b8%ec%9b%8c%ed%82%b9-ai-%ec%8b%9c%eb%8c%80-%ea%b0%9c%eb%b0%9c%ec%9e%90%ea%b0%80-%ec%9d%b8%ed%94%84%eb%9d%bc%ec%97%90.html&quot;&gt;“다시 문제는 네트워킹” AI 시대 개발자가 인프라에 신경 써야 하는 이유&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;infracloud&quot;&gt;Infra/Cloud&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207669&quot;&gt;이란, 아마존 데이터센터 공격…“AI 시대 새로운 군사적 타깃 부각”&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207666&quot;&gt;MS 이어 아마존·구글도 “국방 비관련 분야는 앤트로픽 모델 계속 지원”&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207633&quot;&gt;베슬AI, ‘GTC’서 차세대 GPU 클라우드 서비스 기술 공개&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;tools&quot;&gt;Tools&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=27282&quot;&gt;Show GN: SlideNav - Google Slides 슬라이드 링크 이동 후 뒤로가기 문제를 해결하는 Chrome extension&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3641&quot;&gt;Vercel react-best-practices 스킬로 코드 리뷰 자동화하기&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3630&quot;&gt;클로드코드 사용량 세계 1위 개발자의 AI 코딩 워크플로우&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207665&quot;&gt;“지메일부터 시트까지 명령어 하나로”… 구글, 인간-에이전트 겸용 ‘워크스페이스 CLI’ 공개&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/3550449/%ed%95%98%ec%9d%b4%eb%b8%8c%eb%a6%ac%eb%93%9c-%ec%97%85%eb%ac%b4%ed%99%98%ea%b2%bd%ea%b3%bc-%eb%8c%80%ed%87%b4%ec%a7%81-%ec%8b%9c%eb%8c%80%ec%9d%98-%ed%95%b4%ea%b2%b0-%eb%b0%a9%ec%95%88-%eb%94%94.html&quot;&gt;디지털 직원 경험의 재정의…AI 시대 IT 운영의 중심으로&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;github-trending&quot;&gt;GitHub Trending&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/ruvnet/RuView&quot;&gt;ruvnet/RuView&lt;/a&gt;&lt;br /&gt;Star ruvnet / RuView π RuView: WiFi DensePose turns commodity WiFi signals into real-time human pose estimation, vital sign monitoring, and presence detection — all without a single pixel of video.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/moeru-ai/airi&quot;&gt;moeru-ai/airi&lt;/a&gt;&lt;br /&gt;Star moeru-ai / airi 💖🧸 Self hosted, you-owned Grok Companion, a container of souls of waifu, cyber livings to bring them into our worlds, wishing to achieve Neuro-sama’s altitude. Capable of realtime voice chat…&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/alibaba/OpenSandbox&quot;&gt;alibaba/OpenSandbox&lt;/a&gt;&lt;br /&gt;Star alibaba / OpenSandbox OpenSandbox is a general-purpose sandbox platform for AI applications, offering multi-language SDKs, unified sandbox APIs, and Docker/Kubernetes runtimes for scenarios like Coding Agents, GUI…&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/bytedance/deer-flow&quot;&gt;bytedance/deer-flow&lt;/a&gt;&lt;br /&gt;Star bytedance / deer-flow An open-source SuperAgent harness that researches, codes, and creates. With the help of sandboxes, memories, tools, skills and subagents, it handles different levels of tasks that could take…&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/abhigyanpatwari/GitNexus&quot;&gt;abhigyanpatwari/GitNexus&lt;/a&gt;&lt;br /&gt;Sponsor Star abhigyanpatwari / GitNexus GitNexus: The Zero-Server Code Intelligence Engine - GitNexus is a client-side knowledge graph creator that runs entirely in your browser. Drop in a GitHub repo or ZIP file, and…&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/shareAI-lab/learn-claude-code&quot;&gt;shareAI-lab/learn-claude-code&lt;/a&gt;&lt;br /&gt;Star shareAI-lab / learn-claude-code Bash is all you need - A nano Claude Code–like agent, built from 0 to 1&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/superset-sh/superset&quot;&gt;superset-sh/superset&lt;/a&gt;&lt;br /&gt;Star superset-sh / superset IDE for the AI Agents Era - Run an army of Claude Code, Codex, etc. on your machine&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/D4Vinci/Scrapling&quot;&gt;D4Vinci/Scrapling&lt;/a&gt;&lt;br /&gt;Sponsor Star D4Vinci / Scrapling 🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/CodebuffAI/codebuff&quot;&gt;CodebuffAI/codebuff&lt;/a&gt;&lt;br /&gt;Star CodebuffAI / codebuff Generate code from the terminal!&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/anthropics/prompt-eng-interactive-tutorial&quot;&gt;anthropics/prompt-eng-interactive-tutorial&lt;/a&gt;&lt;br /&gt;Star anthropics / prompt-eng-interactive-tutorial Anthropic’s Interactive Prompt Engineering Tutorial&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/ruvnet&quot;&gt;GitHub Developer: rUv (@ruvnet)&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/njbrake&quot;&gt;GitHub Developer: Nathan Brake (@njbrake)&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/kim-em&quot;&gt;GitHub Developer: Kim Morrison (@kim-em)&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/teng-lin&quot;&gt;GitHub Developer: Teng Lin (@teng-lin)&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/mxsm&quot;&gt;GitHub Developer: mxsm (@mxsm)&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/andimarafioti&quot;&gt;GitHub Developer: Andrés Marafioti (@andimarafioti)&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/Klocman&quot;&gt;GitHub Developer: Marcin Szeniak (@Klocman)&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/bradygaster&quot;&gt;GitHub Developer: Brady Gaster (@bradygaster)&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/mostlygeek&quot;&gt;GitHub Developer: Benson Wong (@mostlygeek)&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/zhayujie&quot;&gt;GitHub Developer: zhayujie (@zhayujie)&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;etc&quot;&gt;Etc&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3645&quot;&gt;IT 지식으로 지금 당장 “부업”을 시작하는 3가지 방법&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207673&quot;&gt;아모데이, 트럼프 비난 보도에 사과…“하지만 법적 대응은 불가피”&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207672&quot;&gt;[AI 이슈트렌드] 2NE1 마약 논란·중동 전쟁 등에 관심 집중&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4141469/%eb%a7%88%ec%9d%b4%ed%81%ac%eb%a1%9c%ec%86%8c%ed%94%84%ed%8a%b8%ea%b0%80-m5-%eb%a7%a5%eb%b6%81%ec%9d%84-%ea%b2%bd%ea%b3%84%ed%95%b4%ec%95%bc-%ed%95%98%eb%8a%94-%ec%9d%b4%ec%9c%a0.html&quot;&gt;마이크로소프트가 M5 맥북을 경계해야 하는 이유&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

</description>
				<pubDate>Sat, 07 Mar 2026 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2026/03/07/weekly-dev-links-2026w10_v2/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2026/03/07/weekly-dev-links-2026w10_v2/</guid>
			</item>
		
			<item>
				<title>주간 테크/개발 뉴스 #2026 2/22 ~ 2/28</title>
				        
        <description>&lt;h2 id=&quot;ai&quot;&gt;AI&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=27079&quot;&gt;OpenAI, 미 국방부와 비공개 네트워크 내 모델 배포에 합의&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=27078&quot;&gt;OpenAI, 사상 최대 규모 중 하나인 1,100억 달러 민간 자금 조달 완료&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=27074&quot;&gt;Anthropic, 국방부 장관 Pete Hegseth의 공급망 위험 지정에 대한 공식 성명 발표&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=27073&quot;&gt;보조 에이전트 최적화(AAO): SEO의 다음 진화 단계&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=27071&quot;&gt;Anthropic, 오픈소스 유지관리자에게 무료 Claude Max 20x 제공&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3629&quot;&gt;렌트어휴먼(RentAHuman), AI한테 고용당하겠다는 50만 명이 모였다&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3628&quot;&gt;덕질하다 만든 웹사이트에 49만 명이 방문했다&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3620&quot;&gt;3개월간 AI에 2,348만 원 쓰고도 10배 더 늘리려는 이유&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207389&quot;&gt;[2월27일] GPT-5.2·클로드·제미나이, 워게임서 핵무기 사용 확률 95%&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207354&quot;&gt;‘나노 바나나 2’ 매개변수 18억개…모바일에서 500밀리초 미만 지연 시간&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207369&quot;&gt;코딩 에이전트 실패 이유로 지나치게 상세한 ‘AGENTS.md’ 파일 지목&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4137712/%ea%b3%a7-%ec%b6%94%ea%b0%80%eb%90%a0-%ec%95%88%eb%93%9c%eb%a1%9c%ec%9d%b4%eb%93%9c-%ec%8b%a0%ea%b8%b0%eb%8a%a5-%ec%a7%80%ea%b8%88-%eb%af%b8%eb%a6%ac-%ec%93%b0%eb%8a%94-%eb%b2%95-3%ea%b0%80%ec%a7%80.html&quot;&gt;곧 추가될 안드로이드 신기능, 지금 미리 쓰는 법 3가지&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4137681/ai-%ec%8a%a4%eb%a7%88%ed%8a%b8-%ea%b8%80%eb%9e%98%ec%8a%a4%ec%97%90-%ec%8f%a0%eb%a6%ac%eb%8a%94-%ec%8b%9c%ec%84%a0vr-%eb%8b%a4%ec%8b%9c-%ec%a0%90%ea%b2%80%eb%8c%80%ec%97%90-%ec%98%a4.html&quot;&gt;AI 스마트 글래스에 쏠리는 시선…VR, 다시 점검대에 오르다&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4137660/13%ea%b0%80%ec%a7%80-%ec%83%9d%ec%84%b1%ed%98%95-ai-%ea%b3%b5%ea%b2%a9-%ec%88%98%eb%b2%95-%ea%b8%b0%ec%97%85-%ec%8b%9c%ec%8a%a4%ed%85%9c%ec%9d%84-%eb%85%b8%eb%a6%ac%eb%8a%94-%ec%83%88%eb%a1%9c.html&quot;&gt;’13가지 생성형 AI 공격 수법’ 기업 시스템을 노리는 새로운 위협&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4137002/%ed%81%b4%eb%9d%bc%ec%9a%b0%eb%93%9c-%ec%9a%b4%ec%98%81%ec%9d%98-%ec%83%88-%ec%9d%b8%ed%84%b0%ed%8e%98%ec%9d%b4%ec%8a%a4-mcp-%ec%84%9c%eb%b2%84%eb%a5%bc-%ec%9d%b4%ed%95%b4%ed%95%98%eb%8b%a4.html&quot;&gt;클라우드 운영의 새 인터페이스, MCP 서버를 이해하다&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4136313/ai-%ec%97%90%ec%9d%b4%ec%a0%84%ed%8a%b8%ec%99%80-%ec%9e%98%eb%aa%bb%eb%90%9c-%ec%83%9d%ec%82%b0%ec%84%b1-%ec%a7%80%ed%91%9c.html&quot;&gt;AI 에이전트와 잘못된 생산성 지표&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;backend&quot;&gt;Backend&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=27080&quot;&gt;JavaScript를 위한 더 나은 Streams API가 필요합니다&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4138189/%ec%95%a4%ed%8a%b8%eb%a1%9c%ed%94%bd-%eb%b2%84%ec%85%89%ed%8a%b8-%ec%9d%b8%ec%88%98ai-%ec%97%85%eb%ac%b4-%ec%9e%90%eb%8f%99%ed%99%94-%ea%b0%95%ed%99%94.html&quot;&gt;앤트로픽, 버셉트 인수…AI 업무 자동화 강화&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4138184/%eb%b8%8c%eb%9d%bc%ec%9a%b0%ec%a0%80%ea%b0%80-%ea%b3%a7-%eb%8d%b0%ec%9d%b4%ed%84%b0%eb%b2%a0%ec%9d%b4%ec%8a%a4%eb%a1%9c%ec%bb%ac-%ed%8d%bc%ec%8a%a4%ed%8a%b8%ec%9d%98-%ec%84%b1%ec%88%99.html&quot;&gt;브라우저가 곧 데이터베이스…로컬 퍼스트의 성숙&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4138175/%eb%a7%81%ed%81%ac%eb%93%9c%ec%9d%b8-ai-%ec%8b%9c%eb%8c%80-%eb%a7%9e%ec%b6%b0-%ea%b2%80%ec%a6%9d%eb%90%9c-ai-%ec%97%ad%eb%9f%89-%ec%9d%b8%ec%a6%9d-%eb%8f%84%ec%9e%85.html&quot;&gt;링크드인, AI 시대 맞춰 ‘검증된 AI 역량’ 인증 도입&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4136978/%eb%a9%80%ed%8b%b0%ed%81%b4%eb%9d%bc%ec%9a%b0%eb%93%9c-%eb%b3%b5%ec%9e%a1%ec%84%b1-%ec%83%9d%ec%84%b1%ed%98%95-ai%eb%a1%9c-%eb%8f%8c%ed%8c%8c%ed%95%98%eb%8a%94-7%ea%b0%80%ec%a7%80-%eb%b0%a9%eb%b2%95.html&quot;&gt;멀티클라우드 복잡성, 생성형 AI로 돌파하는 7가지 방법&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;infracloud&quot;&gt;Infra/Cloud&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://news.hada.io/topic?id=27081&quot;&gt;TREX - Rust로 만든 PDF 테이블 추출 엔진 (딥러닝으로 정확도 개선)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;tools&quot;&gt;Tools&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=27076&quot;&gt;Obsidian Headless sync 오픈베타 시작&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=27066&quot;&gt;prek - Rust로 재개발한 더 나은 pre-commit&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3630&quot;&gt;클로드코드 사용량 세계 1위 개발자의 AI 코딩 워크플로우&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4137690/%ec%98%a8%ec%88%98%eb%a1%9c-%eb%83%89%ea%b0%81-%eb%8d%b0%ec%9d%b4%ed%84%b0%ec%84%bc%ed%84%b0-%eb%83%89%ea%b0%81%ea%b8%b0-%ec%97%86%eb%8a%94-%ec%88%98%eb%9e%ad-%ec%8b%9c%eb%8c%80.html&quot;&gt;“온수로 냉각?” 데이터센터, 냉각기 없는 수랭 시대 열리나&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;etc&quot;&gt;Etc&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3631&quot;&gt;내 머릿속을 통째로 백업할 때 쓰는 3가지 도구&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3627&quot;&gt;분노 주도 개발(RDD)로 시작하는 사이드 프로젝트&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3626&quot;&gt;Supabase는 요즘 왜 그렇게 인기가 많을까?&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3625&quot;&gt;AI로 빨리 만드는 팀보다 ‘덜 흔들리는’ 팀이 이기는 이유&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3624&quot;&gt;AI 시대의 디자이너를 위한 글쓰기&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3623&quot;&gt;AI 없으면 결정 못 하는 리더십, 주도권은 어디로?&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207408&quot;&gt;오픈AI, 캐나다 총기 사건에 ‘시스템 결함’ 시인… “신고 체계 전면 강화”&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207407&quot;&gt;“미 국방부, 정부 기관 경고 무시하고 머스크의 ‘그록’ 기밀 작전에 도입”&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207409&quot;&gt;“AI 도입으로 직원 절반 감원”…트위터 창립자의 강수에 논쟁 본격화&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207414&quot;&gt;오픈AI, 앤트로픽 퇴출 직후 미 국방부와 계약…“안전 방침은 고수”&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207388&quot;&gt;구글, 비엔지니어까지 AI 사용 의무화…인사평가에도 반영&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207406&quot;&gt;오픈AI, 195조 투자 유치로 몸값 1053조 달성…아마존과 대형 파트너십&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

</description>
				<pubDate>Sat, 28 Feb 2026 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2026/02/28/weekly-dev-links-2026w09/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2026/02/28/weekly-dev-links-2026w09/</guid>
			</item>
		
			<item>
				<title>주간 테크/개발 뉴스 #2026 2/15 ~ 2/21</title>
				        
        <description>&lt;h2 id=&quot;ai&quot;&gt;AI&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=26871&quot;&gt;Claude Code 해커톤 수상자 명단에 개발자가 한 명도 없습니다.&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=26868&quot;&gt;Anthropic, Claude Code에 보안 취약점 스캔 기능 출시 (리서치 프리뷰)&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=26865&quot;&gt;클로드 코드, 사이버보안 기능 추가&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=26856&quot;&gt;FreeFlow - 음성 받아쓰기 앱 오픈소스&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=26846&quot;&gt;Show GN: 한국 뉴스로 매일 ‘집단 무의식’을 기록하는 프로젝트를 만들었습니다&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3619&quot;&gt;[릴리즈 노트] 업무용 에이전트 최적화, 구글 제미나이 3.1 프로(Gemini 3.1 Pro) 출시&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3618&quot;&gt;구글 14년차 엔지니어가 공유한, 직군 불문 교훈 14가지&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3615&quot;&gt;[릴리즈 노트] 사람만큼 컴퓨터를 다루는 LLM, Claude Sonnet 4.6&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207033&quot;&gt;앤트로픽, ‘클로드 코드 시큐리티’ 공개…사이버보안 주가 급락 유발&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207039&quot;&gt;“너는 신의 대리인”…‘챗GPT’ 대화 후 정신병 진단 대학생, 오픈AI 고소&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207018&quot;&gt;‘오픈클로’ 확산으로 토큰 사용량 두배로 증가…‘H100’ 임대료도 반등&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4134990/r%ea%b3%bc-%eb%b0%94%ec%9d%b4%ed%83%88vitals%eb%a1%9c-%ec%b5%9c%ec%a0%81%ec%9d%98-llm%ec%9d%84-%ec%84%a0%ed%83%9d%ed%95%98%eb%8a%94-%eb%b0%a9%eb%b2%95.html&quot;&gt;R과 바이탈(vitals)로 최적의 LLM을 선택하는 방법&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4134973/24%ec%8b%9c%ea%b0%84-%ec%9e%91%eb%8f%99%ed%95%98%eb%8a%94-%ec%9e%90%ec%9c%a8-ai%ec%98%a4%ed%94%88%ed%81%b4%eb%a1%9c-%ec%84%a4%ec%b9%98%eb%8a%94-%ec%8b%a0%ec%a4%91%ed%95%b4%ec%95%bc.html&quot;&gt;24시간 작동하는 자율 AI…오픈클로 설치는 신중해야&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4134928/%ec%98%a4%ed%94%88%ed%81%b4%eb%a1%9c%ec%84%9c-ssrf%c2%b7%ec%9d%b8%ec%a6%9d-%ec%9a%b0%ed%9a%8c-%eb%93%b1-%ec%a4%91%c2%b7%ea%b3%a0%ec%9c%84%ed%97%98-%ec%b7%a8%ec%95%bd%ec%a0%90-6%ea%b1%b4-%ed%99%95.html&quot;&gt;오픈클로서 SSRF·인증 우회 등 중·고위험 취약점 6건 확인&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4134239/ai-%ec%8b%9c%ec%8a%a4%ed%85%9c%ec%9d%98-%ec%84%b1%ed%8c%a8%eb%a5%bc-%ea%b0%80%eb%a5%b4%eb%8a%94-%ec%bb%a8%ed%85%8d%ec%8a%a4%ed%8a%b8-%ec%84%a4%ea%b3%84-%ec%a0%84%eb%9e%b5.html&quot;&gt;AI 시스템의 성패를 가르는 컨텍스트 설계 전략&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;backend&quot;&gt;Backend&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=26854&quot;&gt;ISBN의 함정&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3616&quot;&gt;바이브 코딩 초보자가 꼭 알아야 할 API 개념 정리&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;infracloud&quot;&gt;Infra/Cloud&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4133983/%ed%81%b4%eb%9d%bc%ec%9a%b0%eb%93%9c-%ec%9e%a5%ec%95%a0%ea%b0%80-%ec%9d%bc%ec%83%81%ec%9c%bc%eb%a1%9c-%ea%b5%b3%ec%96%b4%ec%a7%80%eb%8a%94-%ec%9d%b4%ec%9c%a0.html&quot;&gt;클라우드 장애는 왜 일상이 될까&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;tools&quot;&gt;Tools&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=26873&quot;&gt;Dependabot을 끄자&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=26863&quot;&gt;CIA 유출 문서에서 찾은 Git 브랜치 정리 한 줄 명령어&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;etc&quot;&gt;Etc&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=26872&quot;&gt;Opus 4.6, 사람 기준 14.5시간짜리 문제를 푼다는 것의 의미 (METR Time Horizon)&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=26869&quot;&gt;Show GN: 카카오톡 업데이트 되돌리기 게임&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3614&quot;&gt;잔디·슬랙·팀즈·네이버웍스·플로우, AI 기능 어디까지 왔나&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3613&quot;&gt;육아하며 바이브 코딩으로 만든 앱, 앱스토어 1위까지&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3612&quot;&gt;꿈의 AI ‘OpenClaw’, 네이버·카카오는 왜 금지했을까?&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3611&quot;&gt;최근 3개월 흐름으로 읽는 2026 바이브 코딩 로드맵&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3600&quot;&gt;AI로 코드는 빨리 나오는데, 왜 출시는 그대로일까?&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3598&quot;&gt;우리가 기능이 아닌 문제에 집중해야 하는 이유&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207041&quot;&gt;“AI 못 쓰면 2~3년 내 하위 계층 전락”…‘AI 양극화’ 주장에 찬반 엇갈려&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207040&quot;&gt;메타·앤트로픽도 ‘재귀적 자기 개선’ 언급…“AI가 AI 만드는 시대 도래”&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207036&quot;&gt;구글, TPU 확대 위해 ‘네오 클라우드’ 스타트업에 1400억 투자 논의&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207030&quot;&gt;엔비디아, 오픈AI 1000억달러 파트너십을 300억달러 투자로 대체&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207032&quot;&gt;메타, AI 비용 부담으로 직원 주식 보상 2년 연속 삭감&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207035&quot;&gt;﻿[AI 이슈트렌드] 충주맨 사직·윤석열 무기징역 등 파장 확산&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=207031&quot;&gt;“오픈AI의 첫번째 장치는 스마트 스피커…스마트 안경·램프도 개발 중”&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4134981/%eb%b3%b4%ec%a6%9d-%ec%88%98%eb%a6%ac-%ec%83%81%eb%8b%b4%eb%8f%84-ai-%ec%9d%91%eb%8c%80%ec%9d%b8%ed%85%94-%ec%a7%80%ec%9b%90-%ec%b2%b4%ea%b3%84-%ec%a0%84%ed%99%98.html&quot;&gt;보증 수리 상담도 AI 응대…인텔 지원 체계 전환&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4134969/ai-%ea%b0%9c%eb%b0%9c-%ec%8b%9c%eb%8c%80-%eb%b3%b4%ec%95%88-%ec%86%8c%ed%94%84%ed%8a%b8%ec%9b%a8%ec%96%b4-%ec%97%94%ec%a7%80%eb%8b%88%ec%96%b4%eb%a5%bc-%ed%82%a4%ec%9a%b0%eb%8a%94-%ec%83%88%eb%a1%9c.html&quot;&gt;AI 개발 시대, 보안 소프트웨어 엔지니어를 키우는 새로운 패러다임&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4134953/%eb%8d%b0%ec%9d%b4%ed%84%b0%eb%a5%bc-1%eb%a7%8c-%eb%85%84-%eb%b3%b4%ec%a1%b4%ed%95%98%eb%8a%94-%ec%9c%a0%eb%a6%ac-%ec%a0%80%ec%9e%a5-%ea%b8%b0%ec%88%a0-%eb%93%b1%ec%9e%a5.html&quot;&gt;데이터를 1만 년 보존하는 유리 저장 기술 등장&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4134883/%ec%9c%88%eb%8f%84%ec%9a%b0-11-%ec%9d%b8%ed%84%b0%eb%84%b7-%ec%86%8d%eb%8f%84-%ed%85%8c%ec%8a%a4%ed%8a%b8-%ea%b8%b0%eb%8a%a5-%eb%8f%84%ec%9e%85.html&quot;&gt;윈도우 11, 인터넷 속도 테스트 기능 도입&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4134246/%ea%b3%b5%ec%9e%a5%ea%b3%bc-%eb%a7%a4%ec%9e%a5%ec%9c%bc%eb%a1%9c-%ed%99%95%ec%82%b0%eb%90%98%eb%8a%94-%ed%94%bc%ec%a7%80%ec%bb%ac-ai-%ec%a4%80%eb%b9%84-%ec%97%86%eb%8a%94-%eb%8f%84%ec%9e%85%ec%9d%80.html&quot;&gt;공장과 매장으로 확산되는 피지컬 AI, 준비 없는 도입은 위험&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;
</description>
				<pubDate>Sat, 21 Feb 2026 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2026/02/21/weekly-dev-links-2026w08/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2026/02/21/weekly-dev-links-2026w08/</guid>
			</item>
		
			<item>
				<title>주간 테크/개발 뉴스 #2026 2/8 ~ 2/14</title>
				        
        <description>&lt;h2 id=&quot;ai&quot;&gt;AI&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=26684&quot;&gt;GPT-5.2가 이론물리학에서 새로운 결과를 도출&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=26682&quot;&gt;OpenAI가 미션에서 ‘안전하게(safely)’라는 단어를 삭제함&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=26679&quot;&gt;Spotify, &quot;AI 덕분에 최고 개발자들이 12월 이후 코드 한 줄도 작성하지 않았다&quot;고 발표&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=26668&quot;&gt;Cloudrouter - Claude Code/Codex가 클라우드 VM·GPU를 띄우게 만드는 스킬&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=26665&quot;&gt;Anthropic, 시리즈 G 투자 라운드에서 300억 달러 조달하며 포스트밸류 3,800억 달러 달성&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=26661&quot;&gt;Show GN: HAMPTER : LLM에 MCP로 연결되는 하드웨어를 위한 프레임워크&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=26656&quot;&gt;16일간 AI와 함께 만든 AI 모니터링 도구 이야기&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3608&quot;&gt;로버트 마틴: AI 시대, LLM이 개발자를 대체할 수 없는 이유&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3606&quot;&gt;닌텐도 못 하게 했더니 직접 게임 만든 10살 아들(개발자 아빠의 관찰기)&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3605&quot;&gt;Cursor로 설계부터 마무리까지, 레거시 마이그레이션 해봤습니다&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3604&quot;&gt;검색 말고 ‘리서치’ 잘하는 사람이 쓰는 도구 7가지&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3603&quot;&gt;AI가 선을 넘기 시작할 때, 기업은 뭘 해야 할까?&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3601&quot;&gt;프로그래머로서 이렇게 뒤처진 느낌은 처음입니다&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=206715&quot;&gt;[2월11일] 바이브 코딩 1년째, 서서히 드러나는 ‘AI 피로’&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=206846&quot;&gt;[2월13일] 설 연휴 앞둔 중국 AI의 물량 공세…남은 것은 딥시크와 ‘GPT-5.3’&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=206868&quot;&gt;엔비디아, 추론 메모리 사용 8배까지 줄이는 기술 공개&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=206857&quot;&gt;“2.9만원으로 챗GPT 프로 사용” 화제….’챗GPT 포 카카오’ 유의 사항은&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=206855&quot;&gt;베슬AI, 연 매출 3.4배 성장…”AI 인프라 솔루션 수요 확대”&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4131823/ai-%ec%86%8d%eb%8f%84%eb%a1%9c-%ec%9e%ac%ed%8e%b8%eb%90%98%eb%8a%94-%ec%86%8c%ed%94%84%ed%8a%b8%ec%9b%a8%ec%96%b4-%ec%82%b0%ec%97%85-%ea%b0%9c%eb%b0%9c%ec%9e%90%ec%9d%98-%eb%af%b8%eb%9e%98%eb%8a%94.html&quot;&gt;AI 속도로 재편되는 소프트웨어 산업, 개발자의 미래는 어디로&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4131782/llm-%ec%97%85%eb%8d%b0%ec%9d%b4%ed%8a%b8%ec%9d%98-%ea%b3%a0%ec%a7%88%eb%b3%91-%ec%b9%98%eb%aa%85%ec%a0%81-%eb%a7%9d%ea%b0%81-sdft%eb%a1%9c-%eb%8f%8c%ed%8c%8c-%ec%8b%9c%eb%8f%84.html&quot;&gt;LLM 업데이트의 고질병 ‘치명적 망각’, SDFT로 돌파 시도&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4131184/%ec%84%b8%ec%9d%bc%ec%a6%88%ed%8f%ac%ec%8a%a4-%ed%81%b4%eb%a1%9c%eb%93%9c%ec%99%80-%ec%96%91%eb%b0%a9%ed%96%a5-%ed%99%95%ec%9e%a5-%ea%b8%b0%eb%8a%a5-%ea%b3%b5%ea%b0%9c-%ec%8a%ac.html&quot;&gt;세일즈포스, 클로드와 양방향 확장 기능 공개 “슬랙·에이전트포스360 연동 지원”&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4131110/lm-%ec%8a%a4%ed%8a%9c%eb%94%94%ec%98%a4-%ec%b2%ab%ec%9d%b8%ec%83%81%eb%a1%9c%ec%bb%ac-pc%ec%97%90%ec%84%9c-llm-%ec%8b%a4%ed%96%89%ed%95%b4-%eb%b3%b4%eb%8b%88.html&quot;&gt;LM 스튜디오 첫인상…로컬 PC에서 LLM 실행해 보니&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4130537/ms-ai-%eb%b3%b4%ec%95%88-%eb%b3%b4%ea%b3%a0%ec%84%9c-%eb%b0%9c%ed%91%9c%c2%b7%c2%b7%c2%b7%ec%97%90%ec%9d%b4%ec%a0%84%ed%8a%b8-%eb%8f%84%ec%9e%85%ec%9d%84-%ec%9c%84%ed%95%9c-%eb%b3%b4%ec%95%88.html&quot;&gt;MS, AI 보안 보고서 발표···에이전트 도입을 위한 보안 원칙 제시&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4130520/%ec%8b%a0%ea%b8%b0%eb%8a%a5-%ec%83%9d%ea%b2%bc%eb%8b%a4%eb%8a%94%eb%8d%b0-%ec%9e%91%eb%8f%99%ec%9d%80-%ec%95%88-%eb%90%98%ea%b3%a0%ec%bd%94%ed%8c%8c%ec%9d%bc%eb%9f%bf%ec%97%90-%ec%a7%80.html&quot;&gt;신기능 생겼다는데 작동은 안 되고…코파일럿에 지친 이유&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=26655&quot;&gt;65줄 텍스트가 AI 코딩을 바꿨다? 하루 400 스타 받은 파일의 정체&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=26654&quot;&gt;OpenAI의 사내 데이터 에이전트 들여다 보기&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;backend&quot;&gt;Backend&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=26686&quot;&gt;Show GN: 일주일만에 새로운 엑셀 라이브러리를 만들다&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=26672&quot;&gt;Rari - Rust-Powered React 프레임워크&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=26671&quot;&gt;디스코드가 익명성을 죽여버렸다&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4131083/%eb%b0%98%ec%9d%91%ed%98%95-it%ec%9d%98-%ec%a2%85%eb%a7%90-10%eb%85%84-%ed%9b%84-%ed%81%b4%eb%9d%bc%ec%9a%b0%eb%93%9c-%ec%84%b1%eb%8a%a5%ec%9d%84-%ec%9e%ac%ec%a0%95%ec%9d%98%ed%95%98%eb%8a%94.html&quot;&gt;“반응형 IT의 종말” 10년 후 클라우드 성능을 재정의하는 예측 엔지니어링&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4131084/%eb%a7%88%ec%9d%b4%ed%81%ac%eb%a1%9c%ec%86%8c%ed%94%84%ed%8a%b8-%ec%9c%88%eb%8f%84%ec%9a%b0-%eb%b3%b4%ec%95%88-%ea%b8%b0%eb%b3%b8%ea%b0%92-%eb%b0%94%ea%be%bc%eb%8b%a4%ec%95%b1-%ea%b6%8c.html&quot;&gt;마이크로소프트, 윈도우 보안 기본값 바꾼다…앱 권한 ‘동의 우선’ 전환&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;infracloud&quot;&gt;Infra/Cloud&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=26674&quot;&gt;aws-doctor - AWS 비용 진단, 유휴 리소스 탐지 및 클라우드 지출 최적화&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://news.hada.io/topic?id=26669&quot;&gt;Zed 에디터, 그래픽스 라이브러리를 Blade에서 wgpu로 전환&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;tools&quot;&gt;Tools&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3609&quot;&gt;OpenClaw 창시자, “나는 내가 읽지 않은 코드를 배포합니다.”&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3602&quot;&gt;비개발자지만 5일 만에 크롬 확장 프로그램 출시했습니다 (with Cursor)&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4130461/ram-%eb%8c%80%eb%9e%80-%ec%86%8d-%ec%82%b4%ec%95%84%eb%82%a8%ea%b8%b0-%ec%a7%80%ea%b8%88-%ec%82%ac%eb%8f%84-%ea%b4%9c%ec%b0%ae%ec%9d%80-pc-%eb%b6%80%ed%92%88%ec%9d%80-%eb%94%b0%eb%a1%9c-%ec%9e%88.html&quot;&gt;RAM 대란 속 살아남기 “지금 사도 괜찮은 PC 부품은 따로 있다”&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;etc&quot;&gt;Etc&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3610&quot;&gt;개발자 6인, 비개발자 4인의 클로드 코드 실전 사례집&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=206890&quot;&gt;‘8000만 뷰’ 화제의 글 “AI 변곡점 맞아…거대한 변화 다가와”&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=206889&quot;&gt;xAI 대규모 인원 이탈 원인은…“압박·논란·스페이스X 통합 결합”&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=206877&quot;&gt;”창작자 고유 스킬로 수익 창출”…데이븐AI, 생성 AI ‘연출 로직’ 코드화&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=206866&quot;&gt;엔비디아 “블랙웰로 추론 비용 최대 10배까지 절감”&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=206883&quot;&gt;오픈AI, 미 국방부 ‘음성 기반 드론 군집’ 개발 참여…“번역 역할로 제한”&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=206888&quot;&gt;앤트로픽, 미국 대학 코딩 교육에 합류…‘실전 AI 역량이 취업 경쟁력’”&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=206884&quot;&gt;바이두, 설 연휴 앞두고 7억 사용자 검색 앱에 ‘오픈클로’ 추가&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=206882&quot;&gt;[AI 이슈트렌드] 동계올림픽 화제 속 정은우 사망·황희찬 갑질 등 눈길&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4131901/%ea%b8%b0%ec%bb%b4-a8-%eb%a6%ac%eb%b7%b0-%ec%bd%a4%ed%8c%a9%ed%8a%b8-%eb%94%94%ec%9e%90%ec%9d%b8%ec%97%90-%eb%8b%b4%ec%9d%80-%eb%9d%bc%ec%9d%b4%ec%a0%a0-7-%eb%af%b8%eb%8b%88-pc%ec%9d%98-%ec%a0%80.html&quot;&gt;기컴 A8 리뷰 / 콤팩트 디자인에 담은 라이젠 7 미니 PC의 저력&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4131771/ai%eb%a1%9c-%ec%9a%94%ec%95%bd-%eb%b2%84%ed%8a%bc%ec%97%90-%ec%88%a8%ec%9d%80-ai-%ec%b6%94%ec%b2%9c-%ec%98%a4%ec%97%bc-%eb%a7%88%ec%9d%b4%ed%81%ac%eb%a1%9c%ec%86%8c%ed%94%84.html&quot;&gt;‘AI로 요약’ 버튼에 숨은 AI 추천 오염…마이크로소프트, AI 편향 주입 경고&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4131751/%ec%83%88-pc%eb%a5%bc-%ec%bc%9c%ec%9e%90%eb%a7%88%ec%9e%90-%eb%b0%98%eb%93%9c%ec%8b%9c-%ed%99%95%ec%9d%b8%ed%95%98%eb%8a%94-%ed%95%b5%ec%8b%ac-%eb%b3%b4%ec%95%88-%ec%84%a4%ec%a0%95-4%ea%b0%80%ec%a7%80.html&quot;&gt;새 PC를 켜자마자 반드시 확인하는 핵심 보안 설정 4가지&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

</description>
				<pubDate>Sat, 14 Feb 2026 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2026/02/14/weekly-dev-links-2026w07/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2026/02/14/weekly-dev-links-2026w07/</guid>
			</item>
		
			<item>
				<title>주간 테크/개발 뉴스 #2026 2/1 ~ 2/7</title>
				        
        <description>&lt;h2 id=&quot;ai&quot;&gt;AI&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://haskellforall.com/2026/02/beyond-agentic-coding&quot;&gt;Beyond agentic coding&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3595&quot;&gt;[릴리즈 노트] Opus 4.6에 대한 오픈AI의 대답, GPT-5.3-Codex&lt;/a&gt;
&lt;br /&gt;Codex의 가능성을 한층 더 넓혀 줄 새로운 모델 GPT-5.3-Codex를 소개합니다. 이는 지금까지 나온 것중 가장 뛰어난 자율 코딩 모델입니다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3594&quot;&gt;[릴리즈 노트] 코딩 더 잘 하는 Claude Opus 4.6 등장&lt;/a&gt;
&lt;br /&gt;새로운 Claude Opus 4.6은 이전 모델보다 코딩 능력이 향상되었습니다. 더 신중하게 계획을 세우고, 자율적으로 수행하는 작업을 더 오래 이어갈 수 있으며, 큰 코드 기반에서도 더 안정적으로 동작합니다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3591&quot;&gt;“절대 추천하지 않는다”는 Moltbook, 무슨 일 있었나&lt;/a&gt;
&lt;br /&gt;역할별로 AI를 세팅해주는 Anthropic의 플러그인 11종이 오픈소스로 공개됐습니다. AI 에이전트 160만 개가 모여 종교를 만들고 비밀 대화를 논의하는 소셜 네트워크 Moltbook도 화제고요.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.blog/ai-and-ml/generative-ai/continuous-ai-in-practice-what-developers-can-automate-today-with-agentic-ci&quot;&gt;Continuous AI in practice: What developers can automate today with agentic CI&lt;/a&gt;
&lt;br /&gt;Continuous AI를 추론이 필요한 작업을 위해 저장소에서 작동하는 백그라운드 에이전트로 생각하십시오. 실제로 지속적인 AI 게시물: 에이전트 CI를 사용하여 오늘날 개발자가 자동화할 수 있는 것 GitHub 블로그에 처음 게재되었습니다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.blog/news-insights/company-news/pick-your-agent-use-claude-and-codex-on-agent-hq&quot;&gt;Pick your agent: Use Claude and Codex on Agent HQ&lt;/a&gt;
&lt;br /&gt;Claude by Anthropic 및 OpenAI Codex는 이제 Copilot Pro+ 또는 Copilot Enterprise 구독을 통해 GitHub 및 VS Code에서 공개 미리 보기로 제공됩니다. 오늘 알아야 할 사항과 시작하는 방법은 다음과 같습니다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://developers.googleblog.com/introducing-the-developer-knowledge-api-and-mcp-server&quot;&gt;Introducing the Developer Knowledge API and MCP Server&lt;/a&gt;
&lt;br /&gt;Google은 Developer Knowledge API 및 MCP 서버를 공개 미리보기로 출시합니다. 이 새로운 도구 세트는 AI 보조자 및 에이전트 플랫폼이 Firebase, Google Cloud, Android 등에서 최신 문서를 검색하고 가져올 수 있는 표준적이고 기계가 읽을 수 있는 방법을 제공합니다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://developers.googleblog.com/beyond-the-chatbot-a-blueprint-for-trustable-ai&quot;&gt;Beyond the Chatbot: A Blueprint for Trustable AI&lt;/a&gt;
&lt;br /&gt;Thunderhill Raceway Park에서는 Google 개발자 전문가(GDE) 팀이 새로운 ‘신뢰할 수 있는 AI 프레임워크’를 테스트했습니다. GCP, Gemini, Antigravity를 사용하여 고속 경주를 에이전트 아키텍처의 마스터 클래스로 전환한 방법은 다음과 같습니다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://developers.googleblog.com/tailor-gemini-cli-to-your-workflow-with-hooks&quot;&gt;Tailor Gemini CLI to your workflow with hooks&lt;/a&gt;
&lt;br /&gt;새로운 Gemini CLI 후크(v0.26.0+)를 사용하면 에이전트 루프를 맞춤 설정할 수 있습니다. 워크플로우의 사전 정의된 지점에서 실행되는 사용자 정의 스크립트를 사용하여 컨텍스트를 추가하고, 정책을 시행하고, 비밀을 차단하세요.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.infoq.com/news/2026/02/cloudflare-moltworker&quot;&gt;Cloudflare Demonstrates Moltworker, Bringing Self-Hosted AI Agents to the Edge&lt;/a&gt;
&lt;br /&gt;Cloudflare는 개발자 플랫폼에서 자체 호스팅 개인 AI 에이전트인 Moltbot을 실행하기 위한 오픈 소스 솔루션인 Moltworker를 도입하여 Mac mini와 같은 로컬 하드웨어가 필요하지 않게 되었습니다. Clawdbot에서 브랜드가 변경된 Moltbot은 사용자 제어를 유지하면서 AI 모델, 브라우저 및 타사 도구를 통합하여 채팅 애플리케이션에서 개인 비서 역할을 합니다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.infoq.com/news/2026/02/google-gemini-agentic-vision&quot;&gt;Google Supercharges Gemini 3 Flash with Agentic Vision&lt;/a&gt;
&lt;br /&gt;Google은 시각적 추론과 코드 실행을 결합하여 “시각적 증거에 대한 답변”을 제공하는 Gemini 3 Flash에 에이전트 비전을 추가했습니다. Google에 따르면 이는 정확성을 향상시킬 뿐만 아니라 더 중요하게는 완전히 새로운 AI 기반 행동을 열어줍니다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.infoq.com/news/2026/02/datadog-google-llm-observability&quot;&gt;Datadog Integrates Google Agent Development Kit into LLM Observability Tools&lt;/a&gt;
&lt;br /&gt;Datadog은 최근 자사의 LLM Observability 플랫폼이 Google의 ADK(에이전트 개발 키트)로 구축된 애플리케이션에 대한 자동 계측을 제공하여 AI 기반 에이전트 시스템의 동작, 성능, 비용 및 안전성에 대한 심층적인 가시성을 제공한다고 발표했습니다. 크레이그 리시&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://techcrunch.com/2026/02/06/super-bowl-60-ai-ads-svedka-anthropic-brands-commercials&quot;&gt;From Svedka to Anthropic, brands make bold plays with AI in Super Bowl ads&lt;/a&gt;
&lt;br /&gt;Svedka가 제공한 최초의 AI 생성 빅 게임 광고부터 OpenAI를 사용한 Anthropic의 쇠고기까지 Super Bowl LX의 가장 큰 광고는 다음과 같습니다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://techcrunch.com/2026/02/06/it-just-got-easier-for-claude-to-check-in-on-your-wordpress-site&quot;&gt;It just got easier for Claude to check in on your WordPress site&lt;/a&gt;
&lt;br /&gt;WordPress 사용자는 이제 Claude를 활용하여 웹 트래픽을 분석하거나 기타 내부 사이트 지표에 대한 정보를 찾을 수 있습니다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://techcrunch.com/2026/02/06/maybe-ai-agents-can-be-lawyers-after-all&quot;&gt;Maybe AI agents can be lawyers after all&lt;/a&gt;
&lt;br /&gt;이번 주 Opus 4.6 출시로 에이전트 AI 순위표가 뒤흔들렸습니다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.reddit.com/r/ClaudeCode/comments/1qxu7qp/im_printing_paper_receipts_after_every_claude&quot;&gt;I’m printing paper receipts after every Claude Code session, and you can too&lt;/a&gt;
&lt;br /&gt;이것은 제가 가장 좋아하는 창의적인 사이드 프로젝트 중 하나였습니다(그리고 Opus 4.6에 딱 맞춰서). 나는 중고 영수증 프린터를 집어 Claude Code의 ‘SessionEnd’ 후크에 연결했습니다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.reddit.com/r/ClaudeCode/comments/1qxvobt/ive_used_ai_to_write_100_of_my_code_for_1_year_as&quot;&gt;I’ve used AI to write 100% of my code for 1+ year as an engineer. 13 no-bs lessons&lt;/a&gt;
&lt;br /&gt;1년 전 저는 “100% AI 생성 코드로 얻은 12가지 강의”를 게시하여 조회수 100만 회 이상을 기록했습니다. 이러한 포인트 중 일부는 Agent.md, claude.md, 계획 모드 및 context7 MCP로 발전했습니다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.reddit.com/r/ClaudeCode/comments/1qxazv9/codex_53_is_better_than_46_opus&quot;&gt;Codex 5.3 is better than 4.6 Opus&lt;/a&gt;
&lt;br /&gt;나는 $200 Max 요금제를 가지고 있어요. 나는 그것을 몇 달 동안 즐겼습니다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.reddit.com/r/ClaudeCode/comments/1qwcg0g/my_personal_cc_setup_not_a_joke&quot;&gt;My personal CC setup [not a joke]&lt;/a&gt;
&lt;br /&gt;옵시디언 + 클로드 코드 + 가스 타운 + 위스퍼 플로우를 합치면 어떻게 될까요? 오픈 소스 @ github.com/voicetreelab/voicetree입니다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.reddit.com/r/ClaudeCode/comments/1qwrz01/opus_46_lobotomized&quot;&gt;Opus 4.6 lobotomized&lt;/a&gt;
&lt;br /&gt;Opus 4.6은 오늘날 더 나쁘게 느껴집니다. Anthropic이 이를 양자화했습니까?&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.blog/ai-and-ml/github-copilot/how-to-maximize-github-copilots-agentic-capabilities&quot;&gt;How to maximize GitHub Copilot’s agentic capabilities&lt;/a&gt;
&lt;br /&gt;Copilot의 실제 애플리케이션을 설계하고 확장하기 위한 수석 엔지니어 가이드입니다. GitHub Copilot의 에이전트 기능을 최대화하는 방법 게시물이 GitHub 블로그에 처음 게재되었습니다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=206547&quot;&gt;엔비디아, ‘블랙웰’ 기술 문제 최근 해결…‘GPT-5.3-코덱스’가 증거&lt;/a&gt;
&lt;br /&gt;엔비디아의 ‘블랙웰(Blackwell)’이 기술적인 복잡성 때문에 초기 도입 과정에서 주요 고객사들의 골칫거리였던 것으로 알려졌다. 이러한 기술적 난제는 최근 개선판 공급으로 해결 국면에 접어든 것으로 보이는데, 그 증거가 오픈AI의 최신 코딩 모델 ‘GPT-5.3-코덱스’라는 설명이다.디 인포메이션은 5일(현지시간) 엔비디아와 메타 직원 등을 인용, 오픈AI와 메타 등 엔비디아의 고객들이…&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4127778/2026%eb%85%84-%ec%a3%bc%eb%aa%a9%ed%95%b4%ec%95%bc-%ed%95%a0-%eb%84%a4%ed%8a%b8%ec%9b%8c%ed%82%b9-%ed%8a%b8%eb%a0%8c%eb%93%9c-8%ea%b0%80%ec%a7%80.html&quot;&gt;2026년 주목해야 할 네트워킹 트렌드 8가지&lt;/a&gt;
&lt;br /&gt;AI가 네트워킹 산업에 미치는 영향은 이제 외면하기 어려울 정도로 커졌다. 상상하기 힘들 만큼 빠른 속도로 AI는 전문 데이터 과학자만 다루던 백엔드 데이터 처리 기술에서 시작해, 이제는 LLM을 기반으로 한 생성형 AI를 통해 거의 모든 사용자와 네트워크 전문가가 직접 활용할 수 있는 수준으로 발전했다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://alperenkeles.com/posts/llms-could-be-but-shouldnt-be-compilers&quot;&gt;LLMs could be, but shouldn’t be compilers&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;backend&quot;&gt;Backend&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://techcrunch.com/2026/02/06/benchmark-raises-225m-in-special-funds-to-double-down-on-cerebras&quot;&gt;Benchmark raises $225M in special funds to double down on Cerebras&lt;/a&gt;
&lt;br /&gt;Benchmark Capital은 2016년부터 Nvidia 경쟁사에 투자자로 참여해 왔습니다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.blog/news-insights/octoverse/what-the-fastest-growing-tools-reveal-about-how-software-is-being-built&quot;&gt;What the fastest-growing tools reveal about how software is being built&lt;/a&gt;
&lt;br /&gt;가장 빠르게 성장하고 있는 언어는 무엇이며 그 이유는 무엇입니까? 사람들이 가장 관심을 갖는 프로젝트는 무엇일까요?&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4128468/%ec%8a%88%ed%8d%bc%eb%b3%bc%ea%b8%89-%ed%8a%b8%eb%9e%98%ed%94%bd%ec%9d%84-%ea%b2%ac%eb%94%94%eb%8a%94-nbc%ec%9c%a0%eb%8b%88%eb%b2%84%ec%84%a4%ec%9d%98-%eb%b6%84%ec%82%b0-%ec%8b%9c%ec%8a%a4%ed%85%9c.html&quot;&gt;슈퍼볼급 트래픽을 견디는 NBC유니버설의 분산 시스템 설계 원칙&lt;/a&gt;
&lt;br /&gt;올림픽이나 프리미어리그 경기, 시즌 피날레 등 대형 이벤트의 인프라를 운영할 때면 대부분 시스템이 좀처럼 겪지 않는 썬더링 허드(thundering herd) 문제에 직면한다. 수백만 명의 사용자가 단 3분이라는 짧은 시간 안에 동시에 로그인하고, 콘텐츠를 탐색한 뒤 재생 버튼을 누르기 때문이다.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;infracloud&quot;&gt;Infra/Cloud&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.infoq.com/news/2026/02/cname-rfc-cloudflare-outage&quot;&gt;How CNAME Ordering in RFC Specs Caused Cloudflare 1.1.1.1 Outage&lt;/a&gt;
&lt;br /&gt;“CNAME 또는 A 레코드 중 무엇이 먼저였습니까?”라는 제목의 최근 기사에서 Cloudflare는 불분명한 RFC 사양으로 인해 인기 있는 Cloudflare의 1.1.1.1 서비스가 어떻게 중단되었는지 설명합니다. Cloudflare는 레코드 순서에 관한 이전 DNS 표준의 파손 및 모호성을 식별한 후 명확한 사양을 제안합니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;tools&quot;&gt;Tools&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.infoq.com/news/2026/02/linkedin-redesigns-sast-pipeline&quot;&gt;LinkedIn Leverages GitHub Actions, CodeQL, and Semgrep for Code Scanning&lt;/a&gt;
&lt;br /&gt;LinkedIn은 GitHub Actions 및 사용자 지정 워크플로를 사용하여 정적 애플리케이션 보안 테스트(SAST) 파이프라인을 재구축하여 수천 개의 저장소에서 일관되고 시행 가능한 코드 검색을 가능하게 했습니다. 재설계는 회사의 Shift-Left 전략을 지원하는 동시에 보안 적용 범위, 개발자 워크플로 및 관찰 가능성을 향상시킵니다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://techcrunch.com/2026/02/07/new-york-lawmakers-propose-a-three-year-pause-on-new-data-centers&quot;&gt;New York lawmakers propose a three-year pause on new data centers&lt;/a&gt;
&lt;br /&gt;법안의 전망은 불확실하지만, 뉴욕은 적어도 새로운 데이터 센터 건설 중단을 고려하는 여섯 번째 주입니다.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;etc&quot;&gt;Etc&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://susam.net/twenty-five-years-of-computing.html&quot;&gt;Stories From 25 Years of Software Development&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://bsky.app/profile/fullmoon.id/post/3meadfaulhk2s&quot;&gt;(Bsky thread) “This turns the maintainer into an unwitting vibe coder”&lt;/a&gt;
&lt;br /&gt;(이와 같이 Bluesky 스레드를 표시/게시하는 더 좋은 방법이 있거나 Lobsters에 올리면 안 되는 경우 Lmk) 댓글&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://font.subf.dev/en&quot;&gt;Maple Mono: Open source monospace font&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://addisoncrump.info/research/a-horrible-conclusion&quot;&gt;A Horrible Conclusion&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3596&quot;&gt;이제 더는 PPT 만들기 싫은 사람들을 위한 6가지 툴&lt;/a&gt;
&lt;br /&gt;슬라이드는 시키는 사람들이 으레 하는 말마따나 “거 장표 몇 장 만드는 일”이 아닙니다. 조사부터 스토리 기획, 디자인까지 이어지는 긴 작업이죠.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/3590&quot;&gt;한 달 만에 20만 다운로드, 전 세계 홀린 한국 개발자&lt;/a&gt;
&lt;br /&gt;공개 한 달 만에 깃허브 스타 2만 개를 돌파하며 글로벌 빅테크의 주목을 받은 ‘오 마이 오픈코드(OMO)’ 개발자 김연규 님의 인터뷰입니다. 6개월간의 독학 실험을 통해 탄생한 이 도구는 ‘시지프스’라 불리는 멀티 에이전트 시스템을 활용해 사람이 짠 것 같은 자연스러운 코드를 구현합니다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://developers.googleblog.com/easy-functiongemma-finetuning-with-tunix-on-google-tpus&quot;&gt;Easy FunctionGemma finetuning with Tunix on Google TPUs&lt;/a&gt;
&lt;br /&gt;FunctionGemma 모델의 미세 조정은 Google TPU의 경량 JAX 기반 Tunix 라이브러리를 사용하여 빠르고 쉽게 이루어집니다. 여기서는 감독된 미세 조정을 위해 LoRA를 사용하여 설명하는 프로세스입니다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://developers.googleblog.com/litert-the-universal-framework-for-on-device-ai&quot;&gt;LiteRT: The Universal Framework for On-Device AI&lt;/a&gt;
&lt;br /&gt;TFLite의 진화인 LiteRT는 이제 온디바이스 AI를 위한 범용 프레임워크입니다. Gemma와 같은 모델을 위해 최대 1.4배 더 빠른 GPU, 새로운 NPU 지원 및 간소화된 GenAI 배포를 제공합니다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=206548&quot;&gt;알트먼 “우리는 스타트업에 불과…지나친 공격에 당혹스러워”&lt;/a&gt;
&lt;br /&gt;샘 알트먼 CEO가 최근 오픈AI에 쏟아지는 비평과 비관적인 전망에 대해 불편한 심경을 드러냈다. 그는 오픈AI가 “세상에서 가장 많은 현미경 조사를 받는 스타트업”이라고 묘사했다.알트먼 CEO는 5일(현지시간) AI 동료 ‘프론티어(Frontier)’ 홍보를 위해 TBPN의 데일리 라이브 테크 토크쇼에 출연, 35분간 인터뷰를 진행했다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=206537&quot;&gt;이승준 트웰브랩스 CTO “글로벌한 영상 분석 기술로 ‘소버린 AI’ 실현”&lt;/a&gt;
&lt;br /&gt;“진정한 소버린 AI란 기술을 수출해 세계적으로 인정받는 수준까지 올라가는 것입니다. 트웰브랩스는 해외에서 더 인정받는 기술을 갖췄습니다.”2021년 설립된 트웰브랩스(대표 이재성)는 ‘멀티모달’이나 ‘영상 분석’이 일반에 널리 알려지기 전부터 관련 기술을 연구해 왔다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=206544&quot;&gt;“토네이도·코끼리 등장해도 피할 수 있어”…웨이모, 자율주행용 ‘월드 모델’ 공개&lt;/a&gt;
&lt;br /&gt;구글의 자율주행 자회사 웨이모가 딥마인드의 월드 모델 ‘지니 3(Genie 3)’를 활용해 극단적 돌발 상황까지 재현하는 가상 주행 세계를 구축했다. 실제 도로 데이터의 한계를 넘어 희귀 사고와 예외적 환경을 학습·검증하려는 시도로, 자율주행 서비스의 안전성과 도시 확장 속도를 동시에 끌어올리겠다는 의도에 따른 것이다.웨이모는 6일(현지시간) 초현실적 자율주행 시뮬레이션을 구현하는 차세대…&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.aitimes.com/news/articleView.html?idxno=206541&quot;&gt;“머스크, 스페이스X·xAI 초대형 합병으로 부채·법적 리스크 피해”&lt;/a&gt;
&lt;br /&gt;스페이스X가 xAI를 인수하며 기업 가치 1조2500억달러(약 1829조원)에 달하는 초대형 기업을 탄생시킨 데에 대해, 단순한 합병을 넘어 수조원대 부채 상환 부담과 법적 리스크를 동시에 피해 가는 정교한 구조로 계획됐다는 분석이 나왔다.로이터는 5일(현지시간) 일론 머스크 CEO가 스페이스X와 xAI를 완전히 통합하지 않고, xAI를 스페이스X의 100% 자회사로 두는 ‘삼각…&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4128438/fbi%eb%8f%84-%eb%9a%ab%ec%a7%80-%eb%aa%bb%ed%95%9c-%ec%95%84%ec%9d%b4%ed%8f%b0%ec%95%a0%ed%94%8c-%ec%b0%a8%eb%8b%a8-%eb%aa%a8%eb%93%9c-%eb%b3%b4%ec%95%88%ec%84%b1-%ec%9e%85.html&quot;&gt;FBI도 뚫지 못한 아이폰…애플 ‘차단 모드’ 보안성 입증&lt;/a&gt;
&lt;br /&gt;미 연방수사국(FBI)이 애플의 차단 모드(Lockdown Mode)가 어느 정도 수준의 보안을 제공하는지를 몸소 증명했다. 언론인과 기업 경영진, 공직자 등 기밀 정보를 다뤄야 하는 이들에게는 긍정적인 사례로 받아들여질 만한 내용이다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4128409/ai-%ec%97%ac%ed%8c%8c%eb%a1%9c-%eb%8a%a6%ec%96%b4%ec%a7%80%ea%b3%a0-%eb%b9%84%ec%8b%b8%ec%a7%84-%ec%8a%a4%ed%8c%80-%eb%a8%b8%ec%8b%a0%eb%b0%b8%eb%b8%8c%eb%8f%84-%ea%b0%80%ea%b2%a9-%eb%b6%80.html&quot;&gt;AI 여파로 늦어지고 비싸진 스팀 머신…밸브도 가격 부담 직면&lt;/a&gt;
&lt;br /&gt;밸브의 스팀 머신이 예정보다 늦게 출시되고 가격도 오를 전망이다. AI 인프라 확산으로 촉발된 RAM 가격 급등이 직접적인 원인이다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.itworld.co.kr/article/4128387/ai-%ec%9d%b8%ed%94%84%eb%9d%bc-%ed%88%ac%ec%9e%90-%ed%99%95%eb%8c%80%eb%a1%9c-2026%eb%85%84-%ea%b8%b0%ec%97%85-it-%ec%a7%80%ec%b6%9c-6%ec%a1%b0-%eb%8b%ac%eb%9f%ac-%eb%8f%8c%ed%8c%8c-%ec%a0%84%eb%a7%9d.html&quot;&gt;AI 인프라 투자 확대로 2026년 기업 IT 지출 6조 달러 돌파 전망&lt;/a&gt;
&lt;br /&gt;가트너가 2026년 글로벌 IT 지출이 10.8% 성장해 6조 1,500억 달러에 이를 것으로 예상했으며, AI 인프라가 해당 성장의 대부분을 차지할 것이라고 밝혔다. 이번 전망은 AI 거품 현상에 대한 우려가 커지는 상황에서도 지출 확대가 둔화될 기미를 보이지 않고 있음을 보여준다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://gekkio.fi/blog/2026/game-boy-advance-d-pad-capacitor-measurements&quot;&gt;Game Boy Advance d-pad capacitor measurements&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/mitchellh/vouch&quot;&gt;vouch: a contributor trust management system based on explicit vouches to participate&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://blog.buenzli.dev/flirt-native-backend&quot;&gt;Flirt: The Native Backend&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://nemin.hu/guix-packaging.html&quot;&gt;Adventures in Guix Packaging&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://eljojo.github.io/rememory&quot;&gt;ReMemory - Split a recovery key among friends&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

</description>
				<pubDate>Sat, 07 Feb 2026 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2026/02/07/weekly-dev-links-2026w06/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2026/02/07/weekly-dev-links-2026w06/</guid>
			</item>
		
			<item>
				<title>n8n으로 RSS 피드 자동 수집하고 요약하기</title>
				        
        <description>&lt;p&gt;n8n으로 rss 피드를 수집하고 LLM으로 요약해서 노션 데이터베이스에 등록하는 과정을 정리했다.
흐름은 아래와 같다.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://gist.github.com/surinkim/c23706081b1ab524e356d0dca1f39014&quot;&gt;&lt;img src=&quot;/img/2025_06_30/img1.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;노드 수가 많지도 않은데 이런 저런 시행착오로 하루가 걸렸다..&lt;br /&gt;
RSS Read 노드를 매번 쓰지 않고 code와 http requst 노드를 쓰면 여러 개의 피드를 쉽게 가져올 수 있을 것 같다.
LLM 요약은 로컬 LM 스튜디오에서 돌고있는 exaone을 사용했는데 토큰 수를 조정하면 속도도 괜찮다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/2025_06_30/img3.png&quot; alt=&quot;워크플로우&quot; /&gt;&lt;/p&gt;

&lt;p&gt;전체 workflow.json는 아래 gist에서 볼 수 있다.  &lt;br /&gt;
&lt;a href=&quot;https://gist.github.com/surinkim/3bede642d1c70341554f99298d08016c&quot;&gt;workflow.json&lt;/a&gt;&lt;br /&gt;
코드에서 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;your-&lt;/code&gt;로 시작하는 부분을 실제 노션 시크릿 키나 로컬 LM 스튜디오 url로 변경하면 된다.&lt;/p&gt;

&lt;p&gt;노션 데이터베이스는 아래처럼 저장된다. 이제보니 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Source&lt;/code&gt; 필터링이 제대로 안됐네;;&lt;br /&gt;
&lt;img src=&quot;/img/2025_06_30/img4.png&quot; alt=&quot;노션 데이터베이스&quot; /&gt;&lt;/p&gt;

&lt;p&gt;그리고 마지막 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Append a block&lt;/code&gt;으로 노션 페이지에 링크 목록도 md 형식으로 저장된다.&lt;br /&gt;
&lt;img src=&quot;/img/2025_06_30/img5.png&quot; alt=&quot;md 형식 링크 목록&quot; /&gt;&lt;/p&gt;

&lt;p&gt;마지막으로 아래 깃허브 저장소에서 다양한 n8n 워크플로를 참고할 수 있다.&lt;br /&gt;
&lt;a href=&quot;https://github.com/Zie619/n8n-workflows&quot;&gt;github workflow collection&lt;/a&gt;&lt;/p&gt;
</description>
				<pubDate>Mon, 30 Jun 2025 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2025/06/30/n8n-llm/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2025/06/30/n8n-llm/</guid>
			</item>
		
			<item>
				<title>Cursor에서 로컬 LLM 사용하기</title>
				        
        <description>&lt;p&gt;cursor는 어떤 LLM을 사용할 지 설정이 가능하다. 그래서 LM studio, ngrok을 활용하면 무료로 로컬 LLM을 사용할 수 있다.
대략 이런 식이다.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://gist.github.com/surinkim/627706fa97d6f3fcb1dbc54b7aec0790&quot;&gt;&lt;img src=&quot;/img/2025_03_02/img1.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;먼저, LM Studio에서 사용할 모델을 로딩하고 설정한다. 그리고 ngrok을 통해 cursor에서 접속할 수 있도록 한다.
cursor에서는 앞서 LM Studio에서 로딩한 모델과 ngrok의 서버 주소를 입력한다.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;LM Studio에서 모델 로딩 &amp;amp; 설정&lt;br /&gt;
&lt;img src=&quot;/img/2025_03_02/img2.png&quot; alt=&quot;LM Studio 설정&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;ngrok 설치 &amp;amp; 실행 &lt;br /&gt;
ngrok을 설치하고 실행한다. 포트 번호는 LM Studio에서 설정한 포트 번호를 입력한다.
    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ngrok http 1234
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;p&gt;그러면 아래 화면처럼 나오는데, 여기서 서비스 되는 url을 확인하고 복사한다.
&lt;img src=&quot;/img/2025_03_02/img3.png&quot; alt=&quot;ngrok&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;cursor 설정&lt;br /&gt;
&lt;img src=&quot;/img/2025_03_02/img4.png&quot; alt=&quot;cursor 설정&quot; /&gt;
OpenAI API KEY에는 아무 키나 입력하고 OpenAI Base URL에 위 2번의 서비스 url + /v1을 입력하고 save &amp;amp; verify 한다.
verify할 때 에러가 없어야 한다.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;무료로 LLM을 사용하고 코드 유출 위험을 줄이는 장점은 있지만, 깃허브 코파일럿이나 claude 같은 유료 모델에 비하면 성능은 아쉬울 수 밖에 없다.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;참고: &lt;a href=&quot;https://medium.com/@hyperfox_/run-cursor-ai-for-free-with-open-source-llm-55396c1411b1&quot;&gt;Run Cursor AI for Free with Open-Source LLM&lt;/a&gt;&lt;/p&gt;
</description>
				<pubDate>Sun, 02 Mar 2025 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2025/03/02/cursor_with_local_llm/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2025/03/02/cursor_with_local_llm/</guid>
			</item>
		
			<item>
				<title>(리뷰)삼체</title>
				        
        <description>&lt;h2 id=&quot;삼체&quot;&gt;삼체&lt;/h2&gt;
&lt;h4 id=&quot;ebook-총-3권-류츠신-저-이현아허유영-역&quot;&gt;ebook 총 3권, 류츠신 저, 이현아/허유영 역&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://www.yes24.com/Product/Goods/121149264&quot;&gt;&lt;img src=&quot;/img/2023_12_23/three-body.png&quot; alt=&quot;01.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;​&lt;br /&gt;
상상력의 한계를 느끼게 한다.&lt;/p&gt;

&lt;p&gt;중국 문화대혁명을 시작으로 한 소설은 끝에 가서는 짐작하기도 어려운 18,906,416년의 시간까지 흘러간다.
공간 역시 마찬가지다. 태양계는 우습게 벗어나 우리 은하를 거쳐 외우주까지 나간다.
2차원과 4차원은 또 어떤가
(장담하는데 3권을 읽고나면 2차원으로 표현된 그림들이 한동안 새롭게 느껴질 것이다!) &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;도대체 마무리를 어떻게 하려고 이러나 하는 궁금증은 총 3권의 마지막 페이지까지 가서 또 하나의 우주를 만나면서 해소 된다. &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;올 여름부터 읽기 시작해서 지금이 12월이니 꽤 오랜시간 동안 출,퇴근길을 지루하지 않게 해줬지만,
때로는 더 졸립게도 만들고 지친 머리를 더 아프게도 했다.
게다가 공간이나 시간 모두 엄청난 스케일을 다루다 보니 안 그래도 평범한 하루가 너무 보잘것 없이 느껴지는 부작용도 있다..&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;하드 SF라는 장르는 처음 읽었는데 복잡한 이론만 나열하는 게 아니라 극적인 사건도 잘 배분되어 읽는 재미가 있었다.
다음에는 테드 창의 소설도 읽어보려고 한다.
그렇지만 바로 읽을 엄두는 안나고 당분간은 지구 안에서 부대끼며 살아가는 사람들의 평범한 얘기를 다룬 책을 읽으면서 마음을 가라앉혀야겠다.&lt;br /&gt;&lt;/p&gt;
</description>
				<pubDate>Sat, 23 Dec 2023 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2023/12/23/three_body/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2023/12/23/three_body/</guid>
			</item>
		
			<item>
				<title>Telegraf에서 Kafka로 지표 전송</title>
				        
        <description>&lt;p&gt;시스템의 CPU, 메모리, 네트워크 상태 등을 Telegraf로 수집하여 Kafka로 보낸다.&lt;br /&gt;
전송된 메시지나 브로커 상태는 Kafka UI로 볼 수 있다. 구성은 대략 아래와 같다.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://gist.github.com/surinkim/7880b825b70febceba7017be32364b72&quot;&gt;&lt;img src=&quot;/img/2023_08_27/img1.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
아래는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker-compose.yml&lt;/code&gt; 구성이다.&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;3.6&apos;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;

  &lt;span class=&quot;na&quot;&gt;zookeeper-1&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;confluentinc/cp-zookeeper:7.4.0&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;32181:32181&quot;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;ZOOKEEPER_CLIENT_PORT&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;32181&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;ZOOKEEPER_TICK_TIME&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;2000&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;zookeeper_data:/var/lib/zookeeper/data&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;zookeeper_logs:/var/lib/zookeeper/logs&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;networks&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;kafka-backend&lt;/span&gt;
 
  &lt;span class=&quot;na&quot;&gt;kafka-1&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;confluentinc/cp-kafka:7.4.0&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;9092:9092&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;depends_on&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;zookeeper-1&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;KAFKA_BROKER_ID&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;KAFKA_ZOOKEEPER_CONNECT&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;zookeeper-1:32181&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;KAFKA_LISTENER_SECURITY_PROTOCOL_MAP&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;KAFKA_INTER_BROKER_LISTENER_NAME&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;INTERNAL&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;KAFKA_ADVERTISED_LISTENERS&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;INTERNAL://kafka-1:29092,EXTERNAL://localhost:9092&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;KAFKA_DEFAULT_REPLICATION_FACTOR&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;3&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;KAFKA_NUM_PARTITIONS&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;3&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;networks&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;kafka-backend&lt;/span&gt;
 
 
  &lt;span class=&quot;na&quot;&gt;kafka-2&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;confluentinc/cp-kafka:7.4.0&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;9093:9093&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;depends_on&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;zookeeper-1&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;KAFKA_BROKER_ID&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;KAFKA_ZOOKEEPER_CONNECT&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;zookeeper-1:32181&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;KAFKA_LISTENER_SECURITY_PROTOCOL_MAP&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;KAFKA_INTER_BROKER_LISTENER_NAME&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;INTERNAL&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;KAFKA_ADVERTISED_LISTENERS&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;INTERNAL://kafka-2:29093,EXTERNAL://localhost:9093&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;KAFKA_DEFAULT_REPLICATION_FACTOR&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;3&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;KAFKA_NUM_PARTITIONS&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;3&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;networks&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;kafka-backend&lt;/span&gt;
 
  &lt;span class=&quot;na&quot;&gt;kafka-3&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;confluentinc/cp-kafka:7.4.0&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;9094:9094&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;depends_on&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;zookeeper-1&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;KAFKA_BROKER_ID&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;3&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;KAFKA_ZOOKEEPER_CONNECT&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;zookeeper-1:32181&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;KAFKA_LISTENER_SECURITY_PROTOCOL_MAP&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;KAFKA_INTER_BROKER_LISTENER_NAME&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;INTERNAL&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;KAFKA_ADVERTISED_LISTENERS&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;INTERNAL://kafka-3:29094,EXTERNAL://localhost:9094&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;KAFKA_DEFAULT_REPLICATION_FACTOR&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;3&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;KAFKA_NUM_PARTITIONS&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;3&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;networks&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;kafka-backend&lt;/span&gt;
 
  &lt;span class=&quot;na&quot;&gt;kafka-ui&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;provectuslabs/kafka-ui&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;container_name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;kafka-ui&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;8989:8080&quot;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;restart&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;always&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;depends_on&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;zookeeper-1&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;kafka-1&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;kafka-2&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;kafka-3&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;KAFKA_CLUSTERS_0_NAME=local&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=kafka-1:29092,kafka-2:29093,kafka-3:29094&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;KAFKA_CLUSTERS_0_ZOOKEEPER=zookeeper-1:22181&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;networks&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;kafka-backend&lt;/span&gt;
 
  &lt;span class=&quot;na&quot;&gt;telegraf&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;telegraf&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;container_name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;telegraf&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;restart&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;always&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;./telegraf.conf:/etc/telegraf/telegraf.conf:ro&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;networks&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;kafka-backend&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;zookeeper_data&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;zookeeper_logs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;networks&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;kafka-backend&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;driver&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;bridge&lt;/span&gt;



&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;다음은 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;telegraf.conf&lt;/code&gt; 구성이다.&lt;br /&gt;
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;brokers&lt;/code&gt; 호스트 이름으로 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kafka-1&lt;/code&gt; 서비스 이름을 써준다.&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;global_tags&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;agent&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;interval = &quot;5s&quot;&lt;/span&gt;

&lt;span class=&quot;pi&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;outputs.kafka&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]]&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;brokers = [&quot;kafka-1:29092&quot;]&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;topic = &quot;foo&quot;&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;data_format = &quot;json&quot;&lt;/span&gt;

&lt;span class=&quot;pi&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;inputs.cpu&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]]&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;percpu = &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;true&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;totalcpu = &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;true&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;collect_cpu_time = &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;false&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;report_active = &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;false&lt;/span&gt;

&lt;span class=&quot;pi&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;inputs.netstat&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]]&lt;/span&gt;

&lt;span class=&quot;pi&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;inputs.mem&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]]&lt;/span&gt;

&lt;span class=&quot;pi&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;inputs.processes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;doker-compose up&lt;/code&gt;으로 실행한 후에 kafka-ui(http://127.0.0.1:8989)에 접속하면 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;telegraf.conf&lt;/code&gt;에 설정한 topic과 메시지 내용을 볼 수 있다.
&lt;img src=&quot;/img/2023_08_27/img2.png&quot; alt=&quot;02.png&quot; /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker-compose down&lt;/code&gt;으로 종료한다.
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

</description>
				<pubDate>Sun, 27 Aug 2023 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2023/08/27/telegraf_kafka/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2023/08/27/telegraf_kafka/</guid>
			</item>
		
			<item>
				<title>오픈메트릭스(OpenMetrics)</title>
				        
        <description>&lt;p&gt;오픈메트릭스(OpenMetrics)는 클라우드 네이티브 앱의 메트릭 노출 표준화를 목표로 하는 CNCF 프로젝트다.&lt;br /&gt;
오픈메트릭스의 사양은 아래에 공개되어 있다.&lt;br /&gt;
https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md&lt;/p&gt;

&lt;p&gt;오픈메트릭스는 프로메테우스(Prometheus) 메트릭 형식을 기반으로 한다. 프로메테우스 메트릭 형식은 간단한 텍스트 기반의 사람이 읽을 수 있는 데이터 형식이다.&lt;br /&gt;
InfluxDB, OpenTSDB, Graphite를 비롯한 다른 모니터링 시스템에서도 채택하고 있다. 많은 CNCF 프로젝트가 프로메테우스 메트릭 형식을 사용하여 메트릭을 노출한다. 또한 API 서버, etcd, CoreDNS 등과 같은 핵심 쿠버네티스 구성 요소에서도 찾을 수 있다.&lt;br /&gt;
프로메테우스 메트릭 형식이 많이 채용되면서 독립적인 프로젝트가 되었고, 이 메트릭 형식을 업계 표준으로 만들기 위한 프로젝트가 바로 오픈메트릭스다.&lt;/p&gt;

&lt;h3 id=&quot;데이터-모델&quot;&gt;데이터 모델&lt;/h3&gt;
&lt;p&gt;아래는 오픈메트릭스의 메트릭 데이터 예시다.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# TYPE acme_http_router_request_seconds summary&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# UNIT acme_http_router_request_seconds seconds&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# HELP acme_http_router_request_seconds Latency though all of ACME&apos;s HTTP request router.&lt;/span&gt;
acme_http_router_request_seconds_sum&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/api/v1&quot;&lt;/span&gt;,method&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;GET&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; 9036.32
acme_http_router_request_seconds_count&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/api/v1&quot;&lt;/span&gt;,method&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;GET&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; 807283.0
acme_http_router_request_seconds_created&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/api/v1&quot;&lt;/span&gt;,method&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;GET&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; 1605281325.0
acme_http_router_request_seconds_sum&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/api/v2&quot;&lt;/span&gt;,method&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;POST&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; 479.3
acme_http_router_request_seconds_count&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/api/v2&quot;&lt;/span&gt;,method&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;POST&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; 34.0
acme_http_router_request_seconds_created&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/api/v2&quot;&lt;/span&gt;,method&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;POST&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; 1605281325.0
&lt;span class=&quot;c&quot;&gt;# TYPE go_goroutines gauge&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# HELP go_goroutines Number of goroutines that currently exist.&lt;/span&gt;
go_goroutines 69
&lt;span class=&quot;c&quot;&gt;# TYPE process_cpu_seconds counter&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# UNIT process_cpu_seconds seconds&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# HELP process_cpu_seconds Total user and system CPU time spent in seconds.&lt;/span&gt;
process_cpu_seconds_total 4.20072246e+06
&lt;span class=&quot;c&quot;&gt;# EOF&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;메트릭스-엔드포인트&quot;&gt;메트릭스 엔드포인트&lt;/h3&gt;
&lt;p&gt;이 표준을 구현하려면 문서화된 엔드포인트에 대한 HTTP Get 요청의 응답으로 오픈메트릭스 형식의 메트릭을 노출한다. 엔드포인트의 이름은 /metrics다.&lt;/p&gt;

&lt;p&gt;sysdig에서 제공하는 샘플 앱으로 실제 메트릭 형식을 살펴보자.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git clone https://github.com/sysdiglabs/custom-metrics-examples
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;docker build custom-metrics-examples/prometheus/golang &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; prometheus-golang
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;docker run &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--rm&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt; prometheus-golang &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; 8080:8080 prometheus-golang
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;브라우저에서 localhost:8080/metrics로 이동한다.&lt;/p&gt;

&lt;h3 id=&quot;클라이언트-라이브러리&quot;&gt;클라이언트 라이브러리&lt;/h3&gt;
&lt;p&gt;프로메테우스 메트릭 형식을 구현한 클라이언트 라이브러러 목록은 아래에서 볼 수 있다.
이 클라이언트를 사용해서 오픈메트릭스의 매트릭 형식도 노출 가능한지는 더 확인해봐야겠다.&lt;br /&gt;
https://prometheus.io/docs/instrumenting/clientlibs/&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;참고 1: &lt;a href=&quot;https://baris.io/blog/prometheus-exposition-format-openmetrics&quot;&gt;OpenMetrics and Prometheus Exposition Format&lt;/a&gt;&lt;br /&gt;
참고 2: &lt;a href=&quot;https://sysdig.com/blog/prometheus-metrics/&quot;&gt;Prometheus metrics / OpenMetrics code instrumentation&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

</description>
				<pubDate>Sun, 30 Jul 2023 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2023/07/30/openmetrics_review/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2023/07/30/openmetrics_review/</guid>
			</item>
		
			<item>
				<title>(리뷰)리프트오프</title>
				        
        <description>&lt;h2 id=&quot;리프트오프&quot;&gt;리프트오프&lt;/h2&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;h4 id=&quot;에릭-버거-저-정현창-역&quot;&gt;에릭 버거 저, 정현창 역&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://www.yes24.com/Product/Goods/108017136&quot;&gt;&lt;img src=&quot;/img/2023_07_16/img.jpg&quot; alt=&quot;01.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;​&lt;br /&gt;
우주에 진입한 로켓에서 추진체가 분리된다. 그런데… 추진체가 낙하하지 않는다! 다시 연소하더니.. 출발한 곳을 찾아 되돌아와서 수직으로 착륙해 버린다!?&lt;br /&gt;
유트브에서 봤던 이 영상은 처음엔 조작이라고 생각할 정도로 그야말로 영화 같았다. &lt;br /&gt;
로켓 발사 비용을 줄이기 위한 이 시도를 비롯해 스타십, 스타링크 등은 화성에 인류를 보내 정착하기 위한 스페이스X의 여러 프로젝트 중 하나다.&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;이 책은 2002년 스페이스X의 설립 초창기부터 2008년 팰컨1의 4차 발사까지의 이야기를 다루며 머스크뿐만 아니라 지금의 스페이스X를 있게한 여러 인물들에 대해서도 자세히 소개한다. 목표 성공을 위해 달려가지만 끊임없이 발생하는 문제들과 그 해결 과정, 실패에 대한 두려움을 극복하는 과정이 드라마틱하게 전개된다.&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;록히드마틴이나 보잉 등 이미 항공 우주 산업에 뿌리를 단단히 내린 기존 기업들에 맞서기 위해 초창기 스페이스X는새로운 기술로 빨리 만들고 시험해서 잘못된 걸 수정해가는 lean 방식을 사용한다. lean 방식은 소프트웨어 개발 방법론으로도 사용되는데 낭비, 즉 결함에 집중하여 이를 줄이는 개발 방법이다.&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;스페이스X는 책에서 소개하는 팰컨 발사외에도 드래곤, 스타십, 스타링크 등의 사업을 이어가고 있다. 머스크는 또한 두뇌에 직접 연결하는 기계를 만드는 뉴럴링크나 도시 아래 터널을 뚫어 초고속으로 이동하는 시스템을 개발하는 회사도 만들었다. 머스크는 돈을 모으는 이유로, 인류를 다행성(Multi-Planetary) 종족으로 만들기 위해서라고 한다.&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;그 꿈이 실현될지, 그 순간을 볼 수 있을지 알 수 없지만, 당면한 문제가 아니라 인류의 미래를 위한 꿈을 꾸고 엄청난 열정으로 그 길을 나아가는 괴짜 사업가에게 열렬한 응원의 박수를 보낸다.&lt;br /&gt;&lt;/p&gt;

</description>
				<pubDate>Sun, 16 Jul 2023 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2023/07/16/review_liftoff/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2023/07/16/review_liftoff/</guid>
			</item>
		
			<item>
				<title>go의 낯선 특징들</title>
				        
        <description>&lt;p&gt;처음 golang을 배울때 어색한 특징들…&lt;/p&gt;

&lt;h3 id=&quot;1-단축-할당문short-assignment-statement&quot;&gt;1. 단축 할당문(Short Assignment Statement)&lt;/h3&gt;
&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;areYouAString&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;yes, i am string!!&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;함수 내에서는 위와 같이 var를 생략하고 변수 선언과 값 할당을 동시에 할 수 있다.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&quot;2-가져온-패키지는-반드시-사용해야-함&quot;&gt;2. 가져온 패키지는 반드시 사용해야 함.&lt;/h3&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
	&lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;
	&lt;span class=&quot;s&quot;&gt;&quot;os&quot;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// 사용하지 않는 패키지&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
 
&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(){&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hello&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;os 패키지를 사용하지 않았기 때문에 컴파일 에러가 발생한다.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;imported and not used: &quot;os&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&quot;3-컬렉션-반복에-사용하는-range-함수의-반환-값은-2개&quot;&gt;3. 컬렉션 반복에 사용하는 range 함수의 반환 값은 2개&lt;/h3&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(){&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;a&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;b&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;c&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;d&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;range&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Printf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;%d -&amp;gt; %s&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;위 코드에서 i에 index, value에 값이 반환된다. i를 사용할 일이 없다면 대신 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_&lt;/code&gt;를 쓴다.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;0 -&amp;gt; a
1 -&amp;gt; b
2 -&amp;gt; c
3 -&amp;gt; d
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&quot;4-변수명-첫-글자가-대문자면-public-아니면-private&quot;&gt;4. 변수명 첫 글자가 대문자면 public, 아니면 private&lt;/h3&gt;
&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Message&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
 &lt;span class=&quot;n&quot;&gt;Text&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// public&lt;/span&gt;
 &lt;span class=&quot;n&quot;&gt;text&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// private&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Text는 현재 패키지 밖에서도 사용할 수 있다.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&quot;5-함수의-반환값-위치&quot;&gt;5. 함수의 반환값 위치&lt;/h3&gt;
&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SumAndDiff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// int형 리턴값이 두 개인 함수 정의&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;위 함수의 반환값은 2개의 int로, 함수 이름 앞에 쓰지 않고 맨 뒤에 적는다.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&quot;6-리시버&quot;&gt;6. 리시버&lt;/h3&gt;
&lt;p&gt;go는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;class&lt;/code&gt;가 없으므로 메서드 정의를 할때 Receiver Parameter를 명시해서 별도로 선언하고, 메서드를 호출할 때 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;리시버.메서드 이름()&lt;/code&gt; 형태를 사용한다.&lt;/p&gt;
&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MyType&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// 리시버 매개변수 m MyType이 있기 때문에 &lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;// sayHi는 MyType에 대한 메서드다.&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MyType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sayHi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hi&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&quot;7-타입-단언&quot;&gt;7. 타입 단언&lt;/h3&gt;
&lt;p&gt;인터페이스 타입에서 실제(concrete) 타입을 가져온다. 
다른 언어의 캐스팅 연산과 같은데 go에서는 타입을 맨 뒤에 표시하다보니 타입 단언 표기 역시 낯설다.&lt;/p&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;hello&quot;&lt;/span&gt;

	&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// 타입 단언 - 성공&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

	&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ok&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// 타입 단언 - 성공&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ok&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

	&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ok&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;float64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// 타입 단언 - 실패&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ok&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

	&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;float64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// // 타입 단언 - 실패(panic)&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;출력 결과&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;hello
hello &lt;span class=&quot;nb&quot;&gt;true
&lt;/span&gt;0 &lt;span class=&quot;nb&quot;&gt;false
&lt;/span&gt;panic: interface conversion: interface &lt;span class=&quot;o&quot;&gt;{}&lt;/span&gt; is string, not float64

goroutine 1 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;running]:
main.main&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
	/tmp/sandbox2825551196/prog.go:17 +0x14a

Program exited.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;참고 1: &lt;a href=&quot;https://betterprogramming.pub/7-golang-features-newbies-and-not-so-newbies-may-find-weird-e0542d079097&quot;&gt;7 Golang Features You Might Find Weird&lt;/a&gt;&lt;br /&gt;
참고 2: &lt;a href=&quot;https://go.dev/tour/methods/15&quot;&gt;Type assertions&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
				<pubDate>Sun, 09 Jul 2023 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2023/07/09/weird_golang_features/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2023/07/09/weird_golang_features/</guid>
			</item>
		
			<item>
				<title>(리뷰)리더의 생각</title>
				        
        <description>&lt;h2 id=&quot;리더의-생각&quot;&gt;리더의 생각&lt;/h2&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;h4 id=&quot;유석문-저-로드북&quot;&gt;유석문 저, 로드북&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://www.yes24.com/Product/Goods/116922949&quot;&gt;&lt;img src=&quot;/img/2023_07_08/image.png&quot; alt=&quot;01.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;​&lt;br /&gt;
‘프로그래머 철학을 만나다.’라는 책으로 처음 저자를 알게됐다. 철학 사상을 기반으로 개발 과정에서 만나는 문제와 고민을 풀어내는 방법이 인상적이었고, 지금도 답답하고 이해하기 어려운 상황을 만나면 찾아보게 되는 책이다. 당시에도 자존감은 가장 중요한 주제였지만 이번 책에서도 그렇다.&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;개발자로 경력을 쌓아가다 관리자로 성공적인 경력을 계속 이어가는 경우도 있는 반면, 맞지 않는 옷을 입은 것처럼 어색해하고 어려워하다 원래의 자리로 돌아가거나 경력을 마치는 경우도 흔하다. 전자와 후자의 길을 가르는 여러 요소가 있겠지만 인간 관계의 어려움을 얼마나 견뎌내고 해결하는가도 큰 지분이 있을 것이다.&lt;br /&gt;&lt;br /&gt;
​
이 직업을 선택한 건 복잡한 인간 관계를 조금은 피할 수 있을 것이라는 얄팍한 생각이 컸는데 그 생각이 너무나 순진하고 어리석었다는 걸 깨닫는 데는 직장 생활을 시작하고 채 몇달이 걸리지 않았다.
관계를 떠나서 살 수 없는 것이 인간이고, 인간이 비합리적인 존재라면 사람 사이의 모든 인과 관계를 이해한다는 것은 애초에 불가능하고 그로 인해 상처 받는 것도 어리석은 일이다.&lt;br /&gt;
하지만, 머리로 이렇게 생각하더라도 내일 당장 일상에서 이해하기 어려운 일을 겪을 것이고 또 상처를 받을 것이다.
자존감은 이러한 고민들이 쌓여 방황하고 실패를 만나 쓰러지더라도 시간이 지나면 다시 털고 일어날 수 있게 해주는 힘이다.&lt;br /&gt;&lt;br /&gt;
​
CTO라고 하면 그 회사의 기술을 책임지고 개발자에게 비전을 제시하는 자리인데 평소에 이런 분들과 얘기 나눌 수 있는 기회는 흔치 않다. 그 자리에서 느께게 되는 고민, 생각 등이 궁금했는데 그런 아쉬움을 이 책을 통해 조금 달래볼 수 있다.​&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;개발 관련 전문 지식이 필요한 책은 아니어서 대부분의 직장인들이 선배의 고민과 경험을 들어본다는 생각으로 읽어도 좋겠다.&lt;/p&gt;
</description>
				<pubDate>Sat, 08 Jul 2023 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2023/07/08/review_thought_of-leader/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2023/07/08/review_thought_of-leader/</guid>
			</item>
		
			<item>
				<title>(번역서)크로스 플랫폼 개발을 위한 C# 10과 닷넷 6</title>
				        
        <description>&lt;h4 id=&quot;--책소개&quot;&gt;- 책소개&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;C# 10의 새로운 기능과 닷넷 6의 전반적인 내용을 다룬다. 설명을 최소한으로 하고 예제 코드를 직접 타이핑해보면서 흥미 있게 익힐 수 있도록 구성되어 있다. C#의 기본 문법부터 고급 기능, 닷넷을 활용한 콘솔, 데이터베이스, 웹 프로그래밍까지의 과정을 비주얼 스튜디오 2022, 비주얼 스튜디오 코드를 사용해가면서 배운다. 닷넷과 C#을 처음 접하는 개발자를 비롯해, 새로운 기능을 살펴보고 싶어하는 기존 개발자들이 짧은 시간에 전체 구성을 이해하고 활용할 수 있게 도와준다.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.yes24.com/Product/Goods/119948664&quot;&gt;&lt;img src=&quot;/img/2023_07_01/image.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;--에이콘-2023년-7월&quot;&gt;- 에이콘, 2023년 7월&lt;/h4&gt;

&lt;h4 id=&quot;---구매--예스24--알라딘&quot;&gt;-  구매 : &lt;a href=&quot;https://www.yes24.com/Product/Goods/119948664&quot; target=&quot;_blank&quot;&gt;예스24 &lt;/a&gt;, &lt;a href=&quot;https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=319986526&quot; target=&quot;_blank&quot;&gt;알라딘&lt;/a&gt;&lt;/h4&gt;

&lt;h4 id=&quot;--책-내용-중-잘못됐거나-궁금한-점-있으면-아래에-남겨주세요-nnhopehotmailcom으로-보내주셔도-됩니다&quot;&gt;- 책 내용 중, 잘못됐거나 궁금한 점 있으면 아래에 남겨주세요. nnhope@hotmail.com으로 보내주셔도 됩니다.&lt;/h4&gt;
</description>
				<pubDate>Sat, 01 Jul 2023 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/books/2023/07/01/book_993_c10_net6/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/books/2023/07/01/book_993_c10_net6/</guid>
			</item>
		
			<item>
				<title>(번역서)266가지 문제로 정복하는 코딩 인터뷰 in C++, 262가지 문제로 정복하는 코딩 인터뷰 in Java</title>
				        
        <description>&lt;h4 id=&quot;--책소개&quot;&gt;- 책소개&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;스타트업에서 빅테크 기업까지, 실리콘밸리 면접관이 전하는 코딩 인터뷰 노하우&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;코딩 인터뷰는 어색한 공간, 낯선 면접관 앞에서 이루어진다. 후회 없이 인터뷰를 마치려면 평소에 난이도와 주제별로 다양한 문제를 풀며 철저히 준비해 두어야 한다. 이 책은 면접관으로 수많은 인터뷰를 해 온 저자들이 집필한 소프트웨어 개발 인터뷰의 종합 안내서다.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;자료구조, 탐색, 정렬, 알고리즘 설계 원칙 및 동시성 등에 관련된 문제를 장별로 제시한다. 각 장은 먼저, 문제를 풀기 위해 꼭 알고 있어야 할 내용, 중요한 라이브러리 함수 등을 설명한다. 그 후 실전처럼 문제를 분석하고 답을 내고 코드를 보여 준다. 해당 문제에 대한 설명이 끝나면 비슷한 응용 문제를 제시해 배운 내용을 한 번 더 단단히 할 수 있다. 책의 후반부에는 난이도가 표기된 고난도 문제가 많이 실려 있다. 제대로 풀 경우 면접관에게 강한 인상을 줄 수도 있고, 많은 생각을 하게 해 알고리즘 트레이닝에도 도움이 된다.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/book_cpp_java_coding_interview/cpp.jpg&quot; alt=&quot;&quot; /&gt; &lt;img src=&quot;/img/book_cpp_java_coding_interview/java.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;--인사이트-2021년-10월&quot;&gt;- 인사이트, 2021년 10월&lt;/h4&gt;

&lt;h4 id=&quot;---구매--예스24--알라딘&quot;&gt;-  구매 : &lt;a href=&quot;https://www.yes24.com/Product/Goods/103768603&quot; target=&quot;_blank&quot;&gt;예스24 &lt;/a&gt;, &lt;a href=&quot;https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=279822924&amp;amp;start=slayer&quot; target=&quot;_blank&quot;&gt;알라딘&lt;/a&gt;&lt;/h4&gt;

&lt;h4 id=&quot;--책-내용-중-잘못됐거나-궁금한-점-있으면-아래에-남겨주세요-nnhopehotmailcom으로-보내주셔도-됩니다&quot;&gt;- 책 내용 중, 잘못됐거나 궁금한 점 있으면 아래에 남겨주세요. nnhope@hotmail.com으로 보내주셔도 됩니다.&lt;/h4&gt;

</description>
				<pubDate>Fri, 01 Oct 2021 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/books/2021/10/01/book_994_cpp_java_coding_interview/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/books/2021/10/01/book_994_cpp_java_coding_interview/</guid>
			</item>
		
			<item>
				<title>windows proxy</title>
				        
        <description>&lt;p&gt;일반적으로 윈도우 애플리케이션은 아래 3가지 방법으로 프록시 서버를 사용한다.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;WinInet 사용&lt;br /&gt;
WinInet 라이브러리를 사용하는 애플리케이션은 Internet Explorer에서 구성한 것과 동일한 프록시 설정을 사용한다.&lt;br /&gt;
다른 애플리케이션에서도 WinInet으로 이 설정을 구해서 사용할 수 있다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;WinHttp 사용&lt;br /&gt;
WinHttp는 윈도우 서비스처럼, 백그라운드에서 사용자 개입이 필요 없는 애플리케이션에 적합하며, WinInet에 비해 속도면에서 빠르다.&lt;br /&gt;
WinHttp의 프록시 설정과 WinInet의 프록시 설정은 서로 다르며, WinHttp는 default로 WinInet의 프록시 설정을 사용하지 않는다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;애플리케이션 자체에 프록시 셋팅을 포함&lt;br /&gt;
애플리케이션 자체에서 Winsock 라이브러리를 사용해서 직접 프록시 설정을 구성한다.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;따라서, 아래와 같이 WinHttp를 사용한 프록시 설정은, WinInet의 프록시 설정(=Internet Explorer)과 서로 무관&lt;/code&gt;하다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/2020_10_18/proxy_show.png&quot; alt=&quot;01.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;한편, &lt;a href=&quot;https://docs.microsoft.com/en-us/windows/win32/api/winhttp/nf-winhttp-winhttpgetieproxyconfigforcurrentuser&quot;&gt;WinHttpGetIEProxyConfigForCurrentUser&lt;/a&gt;를 이용하면 IE의 프록시 설정을 얻어 올 수 있다.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://chromium.googlesource.com/external/libjingle/chrome-sandbox/+/60598307c80be80da28e5ae7921352bd874fb05b/talk/base/proxydetect.cc#675&quot;&gt;예시 코드&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;만약, IE 설정에서 ‘자동으로 설정 검색’이 켜져 있다면 &lt;a href=&quot;https://docs.microsoft.com/en-us/windows/win32/api/winhttp/nf-winhttp-winhttpgetproxyforurl&quot;&gt;WinHttpGetProxyForUrl&lt;/a&gt;을 추가로 사용해야 한다.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;img src=&quot;/img/2020_10_18/IE_OPT_01.png&quot; alt=&quot;02.png&quot; /&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://chromium.googlesource.com/external/libjingle/chrome-sandbox/+/60598307c80be80da28e5ae7921352bd874fb05b/talk/base/proxydetect.cc#1246&quot;&gt;예시 코드 1&lt;/a&gt;: WinHttpGetProxyForUrl을 호출해야 할 지 판단&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://chromium.googlesource.com/external/libjingle/chrome-sandbox/+/60598307c80be80da28e5ae7921352bd874fb05b/talk/base/proxydetect.cc#712&quot;&gt;예시 코드 2&lt;/a&gt;: WinHttpGetProxyForUrl 사용&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;참고로, Fiddler는 IE 프록시 설정을 통해 WinInet 세션을 캡처한다. Fiddler를 실행하고 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Capture Traffic&lt;/code&gt;을 켰다면 아래처럼 IE 프록시가 설정된다.&lt;br /&gt;
 &lt;img src=&quot;/img/2020_10_18/IE_OPT_02.png&quot; alt=&quot;03.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;WinInet이 아닌 WinHttp, cURL을 사용하는 애플리케이션은, 위 IE 설정을 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WinHttpGetIEProxyConfigForCurrentUser&lt;/code&gt; 등으로 구해서 프록시 설정을 해줘야 Fiddler에서 트래픽을 캡처할 수 있다.&lt;br /&gt;
 그렇지 않은 애플리케이션이라면, WinHttp는 수동으로 아래 명령을,&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; netsh winhttp &lt;span class=&quot;nb&quot;&gt;set &lt;/span&gt;proxy 127.0.0.1:8888
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;cURL은 아래 명령을 수동으로 실행하면 Fiddler에서 트래픽 캡처가 가능하다.&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;curl &lt;span class=&quot;nt&quot;&gt;--proxy&lt;/span&gt; 127.0.0.1:8888
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;참고 1: &lt;a href=&quot;https://securelink.net/en-be/insights/windows-proxy-settings-explained/&quot;&gt;Windows proxy settings explained&lt;/a&gt;&lt;br /&gt;
참고 2: &lt;a href=&quot;https://docs.ansible.com/ansible/latest/collections/community/windows/win_http_proxy_module.html&quot;&gt;Manages proxy settings for WinHTTP&lt;/a&gt;&lt;br /&gt;
참고 3: &lt;a href=&quot;https://docs.telerik.com/fiddler/configure-fiddler/tasks/ConfigureWinHTTPApp&quot;&gt;Configure a WinHTTP Application to Use Fiddler&lt;/a&gt;&lt;br /&gt;
참고 4: &lt;a href=&quot;https://docs.telerik.com/fiddler/configure-fiddler/tasks/ConfigurePHPcURL&quot;&gt;Configure a PHP/cURL Application to Use Fiddler&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
				<pubDate>Sun, 18 Oct 2020 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2020/10/18/windows_proxy/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2020/10/18/windows_proxy/</guid>
			</item>
		
			<item>
				<title>aws ses(simple email service)를 이용한 파일 첨부 메일 전송</title>
				        
        <description>&lt;p&gt;제목과 내용만 채워 이메일을 보낸다면 aws ses의 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;send-email&lt;/code&gt; 명령으로 아래처럼 보낼 수 있다.&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;aws ses send-email &lt;span class=&quot;nt&quot;&gt;--region&lt;/span&gt; us-west-2 &lt;span class=&quot;nt&quot;&gt;--from&lt;/span&gt; abc@abc.com &lt;span class=&quot;nt&quot;&gt;--to&lt;/span&gt; abc@abc.com &lt;span class=&quot;nt&quot;&gt;--subject&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Hello&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--html&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Hello, there&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;메일에 파일을 첨부하려면 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;send-raw-email&lt;/code&gt; 명령을 사용한다.&lt;br /&gt;
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;send-raw-email&lt;/code&gt;은 CLI에서 처리하기 까다롭다. 파이썬을 쓸 수 있는 환경이라면 파이썬 AWS SDK인 &lt;a href=&quot;https://aws.amazon.com/ko/sdk-for-python/&quot;&gt;boto3&lt;/a&gt;를 써서 쉽게 처리할 수 있다.&lt;/p&gt;

&lt;p&gt;아래 코드 snippet은 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;send-raw-email&lt;/code&gt;을 사용하는 &lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/ses/latest/DeveloperGuide/send-using-sdk-python.html&quot;&gt;boto3 샘플 코드&lt;/a&gt;에서 ‘제목’을 실행 parameter로 전달할 수 있게 하고, ‘여러 수신인’을 설정할 수 있도록 조금 손 댄 코드다.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/surinkim/5190f14bc8724179550c7e337b21d759.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;젠킨스 파이프라인에 적용한다면 아래처럼 쓸 수 있다.&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pipeline&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    agent any
    stages &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        stage&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;01-Send an email with attachment&apos;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;){&lt;/span&gt;
            steps&lt;span class=&quot;o&quot;&gt;(){&lt;/span&gt;
                script &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                    def subject &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;Build failed in Jenkins : &apos;&lt;/span&gt; + env.JOB_NAME +  &lt;span class=&quot;s1&quot;&gt;&apos;#&apos;&lt;/span&gt; + env.BUILD_NUMBER
                    bat &lt;span class=&quot;s1&quot;&gt;&apos;E:\\Python37-32\\python .\\send.py &apos;&lt;/span&gt; +  &lt;span class=&quot;s1&quot;&gt;&apos;&quot;&apos;&lt;/span&gt; + subject + &lt;span class=&quot;s1&quot;&gt;&apos;&quot;&apos;&lt;/span&gt;
                &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;참고 1)&lt;br /&gt;
보내는 메일 주소와 받는 메일 주소는 모두 aws ses 콘솔에서 ‘인증’된 주소여야 한다.
&lt;img src=&quot;/img/2020_10_17/aws_ses_console.png&quot; alt=&quot;01.png&quot; /&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;참고 2)&lt;br /&gt;
샘플 코드의 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CONFIGURATION_SET&lt;/code&gt;을 사용하려면 aws ses 콘솔에서 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ConfigSet&lt;/code&gt;을 만들어줘야 한다. 사용하지 않으려면 주석 설명처럼, 샘플 코드의 20, 97 line 두 군데를 주석 처리해 준다.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
				<pubDate>Sat, 17 Oct 2020 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2020/10/17/aws_ses_file_attach/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2020/10/17/aws_ses_file_attach/</guid>
			</item>
		
			<item>
				<title>vs2015에서 cpprestsdk 2.10.6 사용하기(Static/MD)</title>
				        
        <description>&lt;p&gt;vs2015를 지원하는 cpprestsdk의 마지막 버전은 2.10.6이다.&lt;br /&gt;
이후 버전은 release 파일에 솔루션 파일이 없기 때문에 cmake로 직접 빌드해야 하며, 최소 vs2017 이상이 필요하다. 그런데, vs2017을 쓸 수 있는 환경이라면 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Nuget&lt;/code&gt;이나 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vcpkg&lt;/code&gt;로 설치하는 게 낫다.
(vcpkg에서 &lt;a href=&quot;http://corecode.pe.kr/2020/03/26/vcpkg/&quot;&gt;의존성 기술에 대한 문제점&lt;/a&gt;도 참고하자.)&lt;/p&gt;

&lt;p&gt;2.10.6 release 파일은 &lt;a href=&quot;https://github.com/microsoft/cpprestsdk/releases/tag/v2.10.16&quot;&gt;cpprestsdk github 페이지&lt;/a&gt;에서 내려 받을 수 있다.&lt;/p&gt;

&lt;p&gt;여기서 하려는 건, static 빌드, 그러니까 lib으로 빌드하되, 런타임 라이브러리는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/MD&lt;/code&gt;로 설정하는 경우다.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;cpprestsdk-2.10.6.zip 압축을 푼 후, 런타임 라이브러리를 조정한다.
&lt;img src=&quot;/img/2020_09_13/01.png&quot; alt=&quot;01.png&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;전처리기 정의&lt;/code&gt;에 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_NO_ASYNCRTIMP&lt;/code&gt;를 추가해준다.
&lt;img src=&quot;/img/2020_09_13/02.png&quot; alt=&quot;02.png&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;cpprestsdk를 사용할 target dll의 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;전처리기 정의&lt;/code&gt;에도 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_NO_ASYNCRTIMP&lt;/code&gt;를 추가한다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;다음으로, target dll의 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;추가 종속성&lt;/code&gt;에 다음 라이브러리들을 입력한다.
    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; zlibstatic.lib&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;ssleay32.lib&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;libeay32.lib&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;bcrypt.lib&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;crypt32.lib&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;winhttp.lib&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;libcpprest140_2_10.lib
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cpprestsdk&lt;/code&gt; 하위의 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pacakges&lt;/code&gt;폴더에서, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;추가 종속성&lt;/code&gt;에 입력한 라이브러리들을 가져와 필요한 위치에 복사한다. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;packages&lt;/code&gt; 폴더 하위에는, 아래와 같이 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cpprestsdk&lt;/code&gt;의 의존성 모듈에 대한 빌드 바이너리가 포함되어 있다.
&lt;img src=&quot;/img/2020_09_13/03.png&quot; alt=&quot;03.png&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;빌드가 끝나면 target dll을 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Dependency Viewer&lt;/code&gt;에서 봤을 때, cpprest140_2_10.dll이 표시되지 않는지 확인한다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;참고&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/56097412/how-to-statically-link-cpprest-without-dll-files-in-vs-project/57177759&quot;&gt;How to statically link cpprest without dll files in VS project?&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
				<pubDate>Sun, 13 Sep 2020 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2020/09/13/cpprestsdk_2_10_6_in_vs2015/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2020/09/13/cpprestsdk_2_10_6_in_vs2015/</guid>
			</item>
		
			<item>
				<title>cocos2dx 설치 및 프로젝트 생성하기</title>
				        
        <description>&lt;p&gt;Cocos2d-x 설치 및 프로젝트 생성 절차를 정리한다.&lt;/p&gt;

&lt;h3 id=&quot;1-파이썬-27x-버전-설치&quot;&gt;1. 파이썬 2.7.X 버전 설치&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;cocos2dx는 현재도, 앞으로도 &lt;a href=&quot;https://github.com/cocos2d/cocos2d-x/issues/11210&quot;&gt;파이썬 3.X 버전의 지원 계획이 없다.&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;따라서, 다른 파이썬 버전이 이미 설치돼 있더라도, 2.7.X 버전을 반드시 설치해야 한다.&lt;/li&gt;
  &lt;li&gt;path에 파이썬 2.7.X와 다른 버전이 이미 설정돼 있다면, 아래 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2. cocos2dx 설치&lt;/code&gt; 하기 전에 2.7 경로로 잠깐 바꾸고, 프로젝트 생성한 뒤에 원래 버전으로 원복하는 건 괜찮다.
&lt;img src=&quot;/img/2020_08_24/01.png&quot; alt=&quot;01.png&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;2-cocos2d-x-설치&quot;&gt;2. Cocos2d-x 설치&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;https://cocos2d-x.org/download 에서 3.17.2 다운로드(4.0 버전도 있지만, 참고할 레퍼런스는 대부분 ver 3.X 기준이라 제외함.)&lt;/li&gt;
  &lt;li&gt;가능한 드라이브 루트 경로에 압축 해제&lt;/li&gt;
  &lt;li&gt;압축 해제 후에, 폴더 내의 setup.py를 cmd 창에서 실행한다.
    &lt;blockquote&gt;
      &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;setup.py&lt;/code&gt;는 cocos2d-x에서 사용하는 환경 변수를 자동으로 등록해 준다.&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;환경 변수 등록시에 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NDK_ROOT, ANDROID_SDK_ROOT, ANT_ROOT&lt;/code&gt; 등은 windows 개발할 때 필요없으므로 Enter 쳐서 skip해도 된다.&lt;/li&gt;
  &lt;li&gt;등록이 끝나고, cmd 창에서 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cocos&lt;/code&gt; 명령을 실행했을 때 아래와 같이 나오면 정상이다.     &lt;br /&gt;
&lt;img src=&quot;/img/2020_08_24/02.png&quot; alt=&quot;02.png&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;3-cocos2dx-샘플-프로젝트-생성&quot;&gt;3. cocos2dx 샘플 프로젝트 생성&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;cocos 명령으로 프로젝트 생성&lt;/li&gt;
  &lt;li&gt;cocos new [프로젝트명] –p [패키지명] –l [사용할 언어] –d [생성할 경로]
    &lt;blockquote&gt;
      &lt;p&gt;ex )cocos new hello -p com.cocos2dx.hello -l cpp -d e:\cocos2d-x-3.17.2\projects&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;프로젝트 생성이 완료되면, 아래 경로에 비주얼 스튜디오 솔루션 파일이 생성된다.
&lt;img src=&quot;/img/2020_08_24/02.png&quot; alt=&quot;03.png&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;기타&quot;&gt;기타&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Windows에서는 기본으로 x86 플랫폼만 지원한다. Cocos2d-x의 종속성 라이브러리들을 x64로 빌드해주는 별도의 프로젝트가 있으니, x64 플랫폼이 필요하면 이걸 쓰라는 답변이 있다.&lt;/li&gt;
  &lt;li&gt;StackOverflow에서, &lt;a href=&quot;https://stackoverflow.com/questions/24859556/is-cocos2d-x-always-uses-opengl&quot;&gt;Cocos2d-x는 모든 플랫폼에서 OpenGL을 사용한다&lt;/a&gt;, &lt;a href=&quot;https://github.com/cocos2d/cocos2d-x/pull/5924&quot;&gt;WP8은 OpenGL을 지원하지 않으므로 Angle을 사용한다&lt;/a&gt;‘는 글이 보이는데, 워낙 옛날 글이고 3.0 업데이트 이전 글이라 지금은 어떻게 달라졌는지 모르겠다.
    &lt;blockquote&gt;
      &lt;p&gt;&lt;a href=&quot;https://docs.cocos2d-x.org/cocos2d-x/v4/en/upgradeGuide/&quot;&gt;4.0 버전부터 애플 플랫폼에서는 Metal을 렌더링 엔진으로 사용한다.&lt;/a&gt;&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
&lt;/ul&gt;

</description>
				<pubDate>Mon, 24 Aug 2020 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2020/08/24/cocos2dx_install_and_sample/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2020/08/24/cocos2dx_install_and_sample/</guid>
			</item>
		
			<item>
				<title>루비/jekyll 설치, bundle update</title>
				        
        <description>&lt;p&gt;새 PC에서 jekyll로 만든 이 사이트(&lt;a href=&quot;https://github.com/surinkim/surinkim.github.io&quot;&gt;surinkim.github.io&lt;/a&gt;)를 clone하고 로컬에서 띄울 때 필요한 절차를 기록했다.&lt;/p&gt;

&lt;h3 id=&quot;1ruby-설치&quot;&gt;1.ruby 설치&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://rubyinstaller.org/downloads/&quot;&gt;RubyInstaller&lt;/a&gt;를 내려받아 설치한다. 오른쪽에 추천하는 버전이 소개돼있다. Ruby+Devkit 2.6.X(x64)를 설치했다.&lt;/p&gt;

&lt;h3 id=&quot;2jekyll-설치&quot;&gt;2.jekyll 설치&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://jekyllrb-ko.github.io/&quot;&gt;여기를&lt;/a&gt; 참고해서 jekyll을 설치한다.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;bundler jekyll
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;해당 페이지에 따로 나오지 않았지만, jekyll 설치 후에는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle update&lt;/code&gt;를 실행해줘야 아래 2-2) 패키지 버전 문제가 발생하지 않는다.&lt;/p&gt;

&lt;h4 id=&quot;2-1-패키지-수동-설치&quot;&gt;2-1) 패키지 수동 설치&lt;/h4&gt;
&lt;p&gt;아래처럼 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GemNotFound&lt;/code&gt;에러가 나면 해당 패키지를 수동 설치해 준다.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;PS D:&lt;span class=&quot;se&quot;&gt;\w&lt;/span&gt;ork&lt;span class=&quot;se&quot;&gt;\g&lt;/span&gt;ithub_surinkim&lt;span class=&quot;se&quot;&gt;\s&lt;/span&gt;urinkim.github.io&amp;gt; jekyll serve &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
Traceback &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;most recent call last&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;:
        12: from d:/Ruby26-x64/bin/jekyll:23:in &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&amp;lt;main&amp;gt;&lt;span class=&quot;s1&quot;&gt;&apos;
        11: from d:/Ruby26-x64/bin/jekyll:23:in `load&apos;&lt;/span&gt;
        ...
         2: from D:/Ruby26-x64/lib/ruby/2.6.0/bundler/spec_set.rb:85:in &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;materialize&lt;span class=&quot;s1&quot;&gt;&apos;
         1: from D:/Ruby26-x64/lib/ruby/2.6.0/bundler/spec_set.rb:85:in `map!&apos;&lt;/span&gt;
D:/Ruby26-x64/lib/ruby/2.6.0/bundler/spec_set.rb:91:in &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;block &lt;span class=&quot;k&quot;&gt;in &lt;/span&gt;materialize&lt;span class=&quot;s1&quot;&gt;&apos;: Could not find public_suffix-3.0.1 in any of the sources (Bundler::GemNotFound)

PS D:\work\github_surinkim\surinkim.github.io&amp;gt; gem install public_suffix -v 3.0.1
Fetching public_suffix-3.0.1.gem
Successfully installed public_suffix-3.0.1
Parsing documentation for public_suffix-3.0.1
Done installing documentation for public_suffix after 0 seconds
1 gem installed
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h4 id=&quot;2-2-패키지-버전-문제&quot;&gt;2-2) 패키지 버전 문제&lt;/h4&gt;
&lt;p&gt;다른 패키지들은 위처럼 수동 설치로 해결됐는데, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ffi&lt;/code&gt; 같은 경우는 필요한 패키지 버전을, 로컬에 설치된 루비 버전에는 설치할 수 없다고 나온다.  이런;;&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;PS D:&lt;span class=&quot;se&quot;&gt;\w&lt;/span&gt;ork&lt;span class=&quot;se&quot;&gt;\g&lt;/span&gt;ithub_surinkim&lt;span class=&quot;se&quot;&gt;\s&lt;/span&gt;urinkim.github.io&amp;gt; jekyll serve &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
        12: from d:/Ruby26-x64/bin/jekyll:23:in &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&amp;lt;main&amp;gt;&lt;span class=&quot;s1&quot;&gt;&apos;
        ...
         1: from D:/Ruby26-x64/lib/ruby/2.6.0/bundler/spec_set.rb:85:in `map!&apos;&lt;/span&gt;
D:/Ruby26-x64/lib/ruby/2.6.0/bundler/spec_set.rb:91:in &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;block &lt;span class=&quot;k&quot;&gt;in &lt;/span&gt;materialize&lt;span class=&quot;s1&quot;&gt;&apos;: Could not find ffi-1.9.18-x64-mingw32 in any of the sources (Bundler::GemNotFound)
PS D:\work\github_surinkim\surinkim.github.io&amp;gt; gem install ffi -v 1.9.18
Fetching ffi-1.9.18-x64-mingw32.gem
ERROR:  Error installing ffi:
        The last version of ffi (= 1.9.18) to support your Ruby &amp;amp; RubyGems was 1.9.18. Try installing it with `gem install ffi -v 1.9.18`
        ffi requires Ruby version &amp;gt;= 2.0, &amp;lt; 2.5. The current ruby version is 2.6.6.146.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;다행히 &lt;a href=&quot;https://stackoverflow.com/questions/49485905/jekyll-install-with-ruby-2-5&quot;&gt;bundle update&lt;/a&gt;로 해결할 수 있다는 글을 보고 실행했더니,&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;PS D:&lt;span class=&quot;se&quot;&gt;\w&lt;/span&gt;ork&lt;span class=&quot;se&quot;&gt;\g&lt;/span&gt;ithub_surinkim&lt;span class=&quot;se&quot;&gt;\s&lt;/span&gt;urinkim.github.io&amp;gt; bundle update
Fetching gem metadata from https://rubygems.org/..........
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies...
Using public_suffix 4.0.5 &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;was 3.0.1&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
Using addressable 2.7.0 &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;was 2.5.2&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
...
Using ffi 1.13.1 &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;x64-mingw32&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;was 1.9.18&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;패키지들이 모두 업데이트 되면서 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ffi&lt;/code&gt;도, 로컬에 설치된 루비 버전에 맞는 1.13.1로 업데이트가 됐다.&lt;/p&gt;

&lt;p&gt;헌데, 지금까지는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jekyll serve .&lt;/code&gt; 명령만으로 실행이 됐는데, 이번에는 아래 에러가 뜬다.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;PS D:&lt;span class=&quot;se&quot;&gt;\w&lt;/span&gt;ork&lt;span class=&quot;se&quot;&gt;\g&lt;/span&gt;ithub_surinkim&lt;span class=&quot;se&quot;&gt;\s&lt;/span&gt;urinkim.github.io&amp;gt; jekyll serve &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
Traceback &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;most recent call last&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;:
        10: from d:/Ruby26-x64/bin/jekyll:23:in &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&amp;lt;main&amp;gt;&lt;span class=&quot;s1&quot;&gt;&apos;
		...
         1: from D:/Ruby26-x64/lib/ruby/2.6.0/bundler/runtime.rb:31:in `block in setup&apos;&lt;/span&gt;
D:/Ruby26-x64/lib/ruby/2.6.0/bundler/runtime.rb:319:in &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;check_for_activated_spec!&lt;span class=&quot;s1&quot;&gt;&apos;: You have already activated jekyll-sass-converter 2.1.0, but your Gemfile requires jekyll-sass-converter 1.5.2. Prepending `bundle exec` to your command may solve this. (Gem::LoadError)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;에러 메시지에 나와있는 대로 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle exec jekyll serve .&lt;/code&gt;으로 실행하니 사이트가 잘 뜬다.  Gemfile을 수정하는 등의 방법으로 1.5.2를 명시해서 쓰면 해결이 되지 않을까 하는데.. 뭐, 단어 2개 더 타이핑하는 게 힘든 일도 아니고.. 이 정도면 됐다.&lt;/p&gt;
</description>
				<pubDate>Fri, 21 Aug 2020 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2020/08/21/ruby_jekyll_install/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2020/08/21/ruby_jekyll_install/</guid>
			</item>
		
			<item>
				<title>fork한 저장소 업데이트(in git bash)</title>
				        
        <description>&lt;p&gt;자주 쓰지 않다보니 매번 까먹는 명령..&lt;/p&gt;

&lt;p&gt;fork한 저장소에서 아래 명령으로 remote 저장소를 확인한다.&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git remote &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt;
origin  https://github.com/surinkim/libsourcey.git &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;fetch&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
origin  https://github.com/surinkim/libsourcey.git &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;push&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
upstream        https://github.com/sourcey/libsourcey.git &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;fetch&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
upstream        https://github.com/sourcey/libsourcey.git &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;push&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;지금은 upstream에, fork한 원본 repo가 이미 추가돼있는데, 만약 아직 추가하지 않았다면 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git add&lt;/code&gt;로 추가한다.&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git remote &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt;
origin  https://github.com/surinkim/libsourcey.git &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;fetch&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
origin  https://github.com/surinkim/libsourcey.git &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;push&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git remote add upstream https://github.com/sourcey/libsourcey.git

&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git remote &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt;
origin  https://github.com/surinkim/libsourcey.git &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;fetch&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
origin  https://github.com/surinkim/libsourcey.git &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;push&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
upstream        https://github.com/sourcey/libsourcey.git &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;fetch&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
upstream        https://github.com/sourcey/libsourcey.git &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;push&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fetch&lt;/code&gt;로 upstream repo의 최신 내용을 가져온다.&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;hyun@hyun-PC MINGW64 /d/Code/libsourcey &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;master&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git fetch upstream
remote: Enumerating objects: 158, &lt;span class=&quot;k&quot;&gt;done&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
remote: Counting objects: 100% &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;158/158&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;, &lt;span class=&quot;k&quot;&gt;done&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
remote: Compressing objects: 100% &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;3/3&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;, &lt;span class=&quot;k&quot;&gt;done&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
remote: Total 306 &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;delta 155&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;, reused 158 &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;delta 155&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;, pack-reused 148
Receiving objects: 100% &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;306/306&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;, 112.74 KiB | 378.00 KiB/s, &lt;span class=&quot;k&quot;&gt;done&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
Resolving deltas: 100% &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;188/188&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;, completed with 111 &lt;span class=&quot;nb&quot;&gt;local &lt;/span&gt;objects.
From https://github.com/sourcey/libsourcey
 &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;new branch]        bugfix/libuv -&amp;gt; upstream/bugfix/libuv
 ... 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;upstream의 master branch를 로컬 master branch에 merge한다.&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;hyun@hyun-PC MINGW64 /d/Code/libsourcey &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;master&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git merge upstream/master
Updating 48b06a1c..98df3c31
Fast-forward
 .gitattributes                                     |    16 +
 BUILD.md                                           |     9 +-
 Dockerfile                                         |    11 +-
 LibSourcey.cmake                                   |   804 +-
 Makefile                                           |    24 +
 README.md                                          |    30 +-
 ...

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;이제, origin에도 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;push&lt;/code&gt;해주면 끝이다.&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git push origin master
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;다음으로, &lt;a href=&quot;https://danielkummer.github.io/git-flow-cheatsheet/&quot;&gt;gitflow&lt;/a&gt;에서 release할 때인데,&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git flow releae start 1.2.0
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git flow release publish 1.2.0
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git flow release finish 1.2.0
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git push origin master
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git push origin develop
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git push origin &lt;span class=&quot;nt&quot;&gt;--tags&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;이건.. &lt;a href=&quot;https://gist.github.com/surinkim/66242959c18ce9b63836e04dc9679ef7&quot;&gt;fork한 gist&lt;/a&gt;를 보는 게 나을거 같고, 요즘은 리눅스 쓸 일도 거의 없으니까, 계속 CLI 고집하지 말고 &lt;a href=&quot;https://git-fork.com/&quot;&gt;Fork&lt;/a&gt;나 &lt;a href=&quot;https://www.syntevo.com/smartgit/&quot;&gt;SmartGit&lt;/a&gt;, &lt;a href=&quot;https://desktop.github.com/&quot;&gt;GitHub Desktop&lt;/a&gt; 같은 GUI 툴도 써보고 익숙해져야겠다.&lt;/p&gt;

</description>
				<pubDate>Sun, 09 Aug 2020 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2020/08/09/forked_repo_update/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2020/08/09/forked_repo_update/</guid>
			</item>
		
			<item>
				<title>vcpkg</title>
				        
        <description>&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vcpkg&lt;/code&gt;는 &lt;strong&gt;리눅스도 지원하는 c++ 전용 패키지 매니저&lt;/strong&gt;라는 큰 의의가 있고, 편리한 점도 많다. 하지만, NuGet처럼 비주얼 스튜디오에 통합되지 않았고, 특정 버전을 지정해서 설치하기 어렵다는 몇 가지 약점도 있다. 개인적으로, 실무에서 vcpkg 쓰는 걸 주저했던 큰 이유는 ‘의존성 설명의 어려움’ 때문이었다.&lt;/p&gt;

&lt;p&gt;예로, 파이썬은 &lt;a href=&quot;https://docs.python.org/ko/3/tutorial/venv.html&quot;&gt;venv&lt;/a&gt;로 프로젝트별 독립 환경을 구성하고, 필요한 패키지를 설치한 다음,&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pip freeze &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;위 명령으로 이 프로젝트에 필요한 의존성만 뽑아낼 수 있다.&lt;br /&gt;
이제 이 파일만 git에 올려두면, 빌드 pc나 동료 자리에서는&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pip &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-r&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;이렇게 필요한 의존성을 설치할 수 있다.&lt;/p&gt;

&lt;p&gt;vcpkg로는 마땅한 방법을 찾지 못했다.
&lt;a href=&quot;https://github.com/microsoft/vcpkg/issues/4935&quot;&gt;작년 7월에 해당 feature에 대한 요청&lt;/a&gt;이 올라왔는데, 마지막 댓글을 봐서는 금방 추가될 것 같진 않다.&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;We have Plans for this, but we need to do quite a bit of design and engineering work, so it’s unlikely to come soon.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;그렇다고, 대안이 아주 없는 건 아닌데…&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;vcpkg integrate project
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;위 명령을 쓰면 현재 설치되어 있는 패키지 정보를 아래와 같이 NuGet 참조 파일로 만들어 주기는 한다.&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;C:&lt;span class=&quot;se&quot;&gt;\U&lt;/span&gt;sers&lt;span class=&quot;se&quot;&gt;\h&lt;/span&gt;ukim
&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; vcpkg integrate project
Created nupkg: E:&lt;span class=&quot;se&quot;&gt;\v&lt;/span&gt;cpkg&lt;span class=&quot;se&quot;&gt;\s&lt;/span&gt;cripts&lt;span class=&quot;se&quot;&gt;\b&lt;/span&gt;uildsystems&lt;span class=&quot;se&quot;&gt;\v&lt;/span&gt;cpkg.E.vcpkg.1.0.0.nupkg

With a project open, go to Tools-&amp;gt;NuGet Package Manager-&amp;gt;Package Manager Console and &lt;span class=&quot;nb&quot;&gt;paste&lt;/span&gt;:
    Install-Package vcpkg.E.vcpkg &lt;span class=&quot;nt&quot;&gt;-Source&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;E:&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\v&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;cpkg&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\s&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;cripts&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\b&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;uildsystems&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;그렇지만, 이건 특정 프로젝트의 의존성이 아니라 로컬에 설치된 모든 패키지 정보이므로, 수정하지 않으면, 프로젝트에 불필요한 패키지마저 설치할 수 있다.&lt;/p&gt;

&lt;p&gt;그래서, &lt;a href=&quot;https://docs.microsoft.com/ko-kr/cpp/build/vcpkg?view=vs-2019&quot;&gt;vcpkg 문서&lt;/a&gt;에 아래와 같이 설명한다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;h3 id=&quot;프로젝트-단위&quot;&gt;프로젝트 단위&lt;/h3&gt;
  &lt;p&gt;활성 vcpkg 인스턴스에서 버전과 다른 라이브러리의 특정 버전을 사용해야 하는 경우 다음 단계를 따르세요.&lt;/p&gt;
  &lt;ol&gt;
    &lt;li&gt;vcpkg의 새 클론을 생성합니다.&lt;/li&gt;
    &lt;li&gt;필요한 버전을 가져오도록 라이브러리의 프로필을 수정합니다.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;vcpkg install [library]&lt;/strong&gt;를 실행합니다.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;vcpkg integrate project&lt;/strong&gt;를 사용하여 프로젝트 단위로 해당 라이브러리를 참조하는 NuGet 패키지를 만듭니다.&lt;/li&gt;
  &lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;결국, 패키지의 특정 버전이나 프로젝트에 필요한 패키지만 기술하려면, vcpkg를 하나 더 클론하고 기존 vcpkg의 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;portfile&lt;/code&gt;(한글 문서를 보면 ‘프로필’이라고 되어 있는데, &lt;a href=&quot;https://docs.microsoft.com/en-us/cpp/build/vcpkg?view=vs-2019&quot;&gt;원문&lt;/a&gt;은 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;portfile&lt;/code&gt;이다.)을 수정해서 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vcpkg integrate project&lt;/code&gt; 명령으로 NuGet 패키지를 뽑아내야 한다. 이게 잘되더라도 다른 위치의 pc와 공유하려면 어딘가에 NuGet 패키지도 올려둬야 한다;;&lt;/p&gt;

&lt;p&gt;이쯤되면, &lt;em&gt;‘난 vcpkg 아니면 안 할래’&lt;/em&gt; 같은 아집이 아니라면, 그리고 사용하려는 라이브러리가 &lt;a href=&quot;https://www.nuget.org/&quot;&gt;NuGet 갤러리&lt;/a&gt;에 이미 올라가 있다면(설사 없더라도, 직접 빌드가 가능하다면 private Nuget 저장소를 운영해도 된다.), 당분간은 고민 없이 NuGet을 쓰는 게 몸과 마음이 편할 것 같다.&lt;/p&gt;

</description>
				<pubDate>Thu, 26 Mar 2020 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2020/03/26/vcpkg/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2020/03/26/vcpkg/</guid>
			</item>
		
			<item>
				<title>git describe로, git 소스 버전을 VC++에서 빌드한 파일 버전으로 자동 연동하기</title>
				        
        <description>&lt;p&gt;&lt;a href=&quot;https://git-scm.com/docs/git-describe&quot;&gt;git describe&lt;/a&gt;는  태그와  커밋  횟수, 축약된  커밋  이름으로  사람이  읽고  구분할  수  있는  버전  정보를  알려준다.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git describe
v1.0.9-8-gbab53f6
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;v1.0.9-8-gbab53f6&lt;/code&gt;에서 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;v1.0.9&lt;/code&gt;은 현재 태그, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;8-gbab53f6&lt;/code&gt;은 해당 태그부터 8번째 commit이며, 축약된 commit 이름이 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bab53f6&lt;/code&gt;이라는 뜻이다. 접두사 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;g&lt;/code&gt;는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git&lt;/code&gt;을 뜻하며 어떤 SCM을 사용하느냐에 따라 다르다. 이 명령을 이용하면 git 저장소의 소스 버전을 VC++ 프로젝트에서 빌드한 파일 버전으로 자동 연동할 수 있다.&lt;/p&gt;

&lt;p&gt;이렇게 하려면, git describe 결과를 얻고 적당한 파일에 버전 정보를 써주는 과정이 필요하다. 이런 역할을 해주는 스크립트는 쉽게 구할 수 있는데 여기서는 &lt;a href=&quot;https://github.com/Thell/git-vs-versioninfo-gen/blob/master/GIT-VS-VERSION-GEN.bat&quot;&gt;이곳의 배치 파일&lt;/a&gt;을 사용한다.&lt;/p&gt;

&lt;p&gt;로컬의 git 저장소 폴더에서 아래와 같이 실행하면&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;.&lt;span class=&quot;se&quot;&gt;\g&lt;/span&gt;it-vs-version-get.bat .&lt;span class=&quot;se&quot;&gt;\v&lt;/span&gt;ersioninfo.h
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;versioninfo.h&lt;/code&gt; 파일을 생성해 준다.&lt;/p&gt;
&lt;div class=&quot;language-c++ highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;//GIT-VS-VERSION-GEN.bat generated resource header.&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#define  GEN_VER_VERSION_STRING  &quot;1.0.9.8.gbab53\0&quot;
#define  GEN_VER_DIGITAL_VERSION  1,0,9,8
#define  GEN_VER_VERSION_HEX  0x0001000000090008
#define  GEN_VER_COMMENT_STRING  &quot;Major Version Release\0&quot;
#define  GEN_VER_PRIVATE_FLAG VS_FF_PRIVATEBUILD
#define  GEN_VER_PRIVATE_STRING  &quot;\0&quot;
#define  GEN_VER_PATCHED_FLAG VS_FF_PATCHED
#define  GEN_VER_PRERELEASE_FLAG  0
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;VC++ 프로젝트에서 이 파일을 사용하도록 설정한다.
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.rc&lt;/code&gt;파일에 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;versioninfo.h&lt;/code&gt;를 include하고, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;FILEVERSION&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PRODUCTION&lt;/code&gt;의 값을 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GEN_VER_DIGITAL_VERSION&lt;/code&gt; 매크로 변수로 대체한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-rc&quot;&gt;/////////////////////////////////////////////////////////////////////////////
//
// Version
//

VS_VERSION_INFO VERSIONINFO
 FILEVERSION GEN_VER_DIGITAL_VERSION
 PRODUCTVERSION GEN_VER_DIGITAL_VERSION
..
..
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;문자열 값이 필요한 곳은 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GEN_VER_VERSION_STRING&lt;/code&gt;을 사용한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-rc&quot;&gt;BEGIN
    BLOCK &quot;StringFileInfo&quot;
    BEGIN
        BLOCK &quot;041204b0&quot;
        BEGIN
            ...
            VALUE &quot;FileVersion&quot;, GEN_VER_VERSION_STRING
            ...
            VALUE &quot;ProductVersion&quot;, GEN_VER_VERSION_STRING
        END
...
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이제 VC++의 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;빌드 전 이벤트&lt;/code&gt;에, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git-vs-version-get.bat&lt;/code&gt;으로 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;versioninfo.h&lt;/code&gt;를 생성하는 과정을 추가해주면, git 저장소의 소스 버전이 VC++ 빌드 파일 버전에 자동 연동된다.&lt;/p&gt;

</description>
				<pubDate>Thu, 13 Feb 2020 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2020/02/13/git_describe_vc_file_sync/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2020/02/13/git_describe_vc_file_sync/</guid>
			</item>
		
			<item>
				<title>(번역서)데이터를 다루며 배우는 파이썬</title>
				        
        <description>&lt;p&gt;&lt;img src=&quot;/img/book_python_data/cover.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;--책소개&quot;&gt;- 책소개&lt;/h4&gt;
&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;프로그래밍 경험이 없는 사람들에게 프로그래밍을 가르치기 위해 만들어졌다. 파이썬은 문법이 간결하여 프로그래밍을 처음 배우는 사람도 무리 없이 시작할 수 있다. 특히 데이터 문제를 효과적으로 해결할 수 있어 관련 분야에서 파이썬을 활용하는 경우가 많기에, 저자는 비전공자인 학생들을 대상으로 각자의 분야에서 데이터를 다루는 기술을 적용할 수 있도록 데이터 탐색에 초점을 맞추어 파이썬 교과서를 구성했다.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id=&quot;--인사이트-2019년-8월-22일&quot;&gt;- 인사이트, 2019년 8월 22일&lt;/h4&gt;

&lt;h4 id=&quot;---구매--예스24--알라딘&quot;&gt;-  구매 : &lt;a href=&quot;http://www.yes24.com/Product/Goods/77401048&quot; target=&quot;_blank&quot;&gt;예스24 &lt;/a&gt;, &lt;a href=&quot;https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=202488085&quot; target=&quot;_blank&quot;&gt;알라딘&lt;/a&gt;&lt;/h4&gt;

&lt;h4 id=&quot;--책-내용-중-잘못됐거나-궁금한-점-있으면-아래에-남겨주세요-nnhopehotmailcom으로-보내주셔도-됩니다&quot;&gt;- 책 내용 중, 잘못됐거나 궁금한 점 있으면 아래에 남겨주세요. nnhope@hotmail.com으로 보내주셔도 됩니다.&lt;/h4&gt;

</description>
				<pubDate>Thu, 22 Aug 2019 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/books/2019/08/22/book_995_python_data/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/books/2019/08/22/book_995_python_data/</guid>
			</item>
		
			<item>
				<title>paho mqtt c/cpp 빌드</title>
				        
        <description>&lt;h3 id=&quot;paho-mqtt-c&quot;&gt;paho mqtt c&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;저장소: https://github.com/eclipse/paho.mqtt.c&lt;/li&gt;
  &lt;li&gt;빌드 방법&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-cpp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;# SSL=TRUE
# STATIC=TRUE
# paho.mqtt.c와 동일 레벨에 openssl 폴더가 있다고 가정한다.
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;build&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;build&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cmake&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;G&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Visual Studio 14 2015&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DOPENSSL_INCLUDE_DIR&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;openssl&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DOPENSSL_LIB&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;openssl&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lib&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DOPENSSLCRYPTO_LIB&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;openssl&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lib&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DPAHO_BUILD_STATIC&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TRUE&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DPAHO_WINDOWS_BUILD_BIT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;x86&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DPAHO_WITH_SSL&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TRUE&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;..&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cmake&lt;/code&gt; 빌드를 통해 생성된 솔루션 파일을 열고, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;common_ssl_obj&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pah-mqtt3as-static&lt;/code&gt; 프로젝트를 차례대로 빌드하면 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;paho-mqtt3as-static.lib&lt;/code&gt;가 생성된다.&lt;/p&gt;

&lt;h3 id=&quot;paho-mqtt-cpp&quot;&gt;paho mqtt cpp&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;저장소: https://github.com/eclipse/paho.mqtt.cpp&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;빌드 방법&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-cpp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;# SSL=TRUE
# STATIC=TRUE
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;build&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;build&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cmake&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;G&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Visual Studio 14 2015&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DPAHO_MQTT_C_INCLUDE_DIRS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;paho&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mqtt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;src&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DPAHO_MQTT_C_LIBRARIES&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;paho&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mqtt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Debug&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;paho&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mqtt3as&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lib&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DPATH_WITH_SSL&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TRUE&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;..&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cmake&lt;/code&gt; 빌드를 통해 생성된 솔루션 파일을 열고, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;paho-cpp-objs&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;paho-mqttpp3-static&lt;/code&gt; 프로젝트를 차례대로 빌드하면 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;paho-mqttp3-static.lib&lt;/code&gt;가 생성된다. 이제 필요한 곳에서 링크하고 사용하면 된다.&lt;/p&gt;

&lt;h4 id=&quot;참고&quot;&gt;참고&lt;/h4&gt;
&lt;blockquote&gt;
  &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;openssl&lt;/code&gt;은 1.0.X 버전대와 1.1.X 버전대의 바이너리 이름이 다르다.&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;1.0.X: libeay32XX.dll, ssleay32XX.dll&lt;/li&gt;
    &lt;li&gt;1.1.X: libcryptoXX.dll, libsslXX.dll&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href=&quot;[https://www.npcglib.org/~stathis/blog/precompiled-openssl/](https://www.npcglib.org/~stathis/blog/precompiled-openssl/)&quot;&gt;여기서&lt;/a&gt; openssl pre built 바이너리를 받을 수 있다.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
				<pubDate>Tue, 23 Jul 2019 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2019/07/23/how_to_build_paho_mqtt/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2019/07/23/how_to_build_paho_mqtt/</guid>
			</item>
		
			<item>
				<title>code sign 인증서 만료</title>
				        
        <description>&lt;p&gt;아래처럼 -t 옵션을 주고 code sign을 했다면, 인증서 만료 시간이 도래한다고 해서, 이미 배포한 바이너리를 새로 sign하고 다시 배포할 필요는 없다.&lt;br /&gt;
그러니까, code sign했던 시점에 유효한 인증서였다면, 인증서 기간이 만료되어도 계속 유효한 게시자로 표시된다.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; http://timestamp.verisign.com/scripts/timstamp.dl
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;참고&quot;&gt;참고:&lt;/h4&gt;

&lt;blockquote&gt;
  &lt;p&gt;VeriSign Code Signing Certificates include an optional timestamp to extend the life of your digital signatures.
Your code will remain valid even if your code signing certificate expires, because the validity of the code signing certificate at the time of the digital signature can be verified
http://www.symantec.com/theme.jsp?themeid=code-signing-information-center&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Timestamping ensures that code will not expire when certificate expires.
If your code is timestamped the digital signature is valid even though the certificate has expired.
A new certificate is only necessary if you want to sign additional code. If you did not use the timestamping option during the signing, you must re-sign your code and re-send it out to your customers.
http://www.instantssl.com/code-signing/code-signing-faq.html&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Timestamping ensures that code will not expire when the certificate expires because the browser validates the timestamp.
The timestamping service is provided courtesy of VeriSign. If you use the timestamping service when signing code, a hash of your code is sent to VeriSign’s server to record a timestamp for your code.&lt;br /&gt;
https://search.thawte.com/support/ssl-digital-certificates/index?page=content&amp;amp;id=AR1119&lt;/p&gt;
&lt;/blockquote&gt;
</description>
				<pubDate>Fri, 12 Jul 2019 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2019/07/12/code_sign_certificate_expired/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2019/07/12/code_sign_certificate_expired/</guid>
			</item>
		
			<item>
				<title>정적 파일 Hosting(Node.js + Windows 서비스)</title>
				        
        <description>&lt;h2 id=&quot;connect-serverstatic&quot;&gt;Connect, ServerStatic&lt;/h2&gt;

&lt;p&gt;html 문서 몇 개를 간단히 호스팅 하고 싶을 때는 &lt;a href=&quot;https://www.npmjs.com/package/serve&quot;&gt;serve&lt;/a&gt;나,
&lt;a href=&quot;https://www.npmjs.com/package/connect&quot;&gt;connect&lt;/a&gt;/&lt;a href=&quot;https://www.npmjs.com/package/serve-static&quot;&gt;serve-static&lt;/a&gt;을 쓰면 편하다.&lt;/p&gt;

&lt;p&gt;여기서는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;connect + serve-static&lt;/code&gt; 조합을 윈도우 서비스로 등록해서 사용하는 방법을 정리한다.&lt;/p&gt;

&lt;h3 id=&quot;http_serverjs&quot;&gt;http_server.js&lt;/h3&gt;

&lt;p&gt;호스팅 하려는 폴더가 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;D:\work\public&lt;/code&gt;이라고 하면, 해당 폴더에 아래와 같이 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http_server.js&lt;/code&gt; 파일을 만든다.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;finalhandler&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;finalhandler&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;http&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;serveStatic&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;serve-static&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Serve up public folder&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;serve&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;serveStatic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;D:&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;work&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;index.html&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;index.html&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]})&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Create server&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;server&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;createServer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;onRequest&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;serve&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;finalhandler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Listen&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;server&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;listen&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Server running on 3000 ...&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;node-windows&quot;&gt;node-windows&lt;/h3&gt;
&lt;p&gt;다음으로 node.js를 윈도우 서비스로 등록해 주는 &lt;a href=&quot;https://github.com/coreybutler/node-windows&quot;&gt;node-windows&lt;/a&gt;를 설치한다.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;g&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;windows&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;link&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;windows&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;setup_win_servicejs&quot;&gt;setup_win_service.js&lt;/h3&gt;

&lt;p&gt;윈도우 서비스로 등록하기 위해 아래 스크립트를 만든다.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Service&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;node-windows&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Service&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Create a new service object&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;svc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Service&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;YourServiceName&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;YourServiceDesc&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;D:&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;work&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;http_server.js&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Listen for the &quot;install&quot; event, which indicates the&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// process is available as a service.&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;svc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;install&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;svc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;svc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;install&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;실행한다.&lt;/p&gt;
&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;setup_win_service&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;js&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;윈도우 서비스 관리자에 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;YourServiceName&lt;/code&gt; 서비스가 등록되고 자동 실행된다.
브라우저에서 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://localhost:3000/your.html&lt;/code&gt;로 열 수 있다.&lt;/p&gt;

&lt;h4 id=&quot;참고&quot;&gt;참고:&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/10547974/how-to-install-node-js-as-windows-service&quot;&gt;StackOverFlow 1&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://stackoverflow.com/questions/6084360/using-node-js-as-a-simple-web-server&quot;&gt;StackOverFlow 2&lt;/a&gt;&lt;/p&gt;

</description>
				<pubDate>Wed, 29 May 2019 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2019/05/29/hosting_static_files_with_winservice/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2019/05/29/hosting_static_files_with_winservice/</guid>
			</item>
		
			<item>
				<title>(번역서)파이썬 마이크로서비스</title>
				        
        <description>&lt;p&gt;&lt;img src=&quot;/img/book_python_msd/cover.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;--책소개&quot;&gt;- 책소개&lt;/h4&gt;
&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;파이썬을 사용해서 마이크로서비스의 설계부터 코딩, 테스트, 배포까지 전반적인 과정을 다룬다. 모질라(Mozilla)에서 파이썬 개발자로 활동하는 저자의 풍부한 경험과 샘플 프로젝트 개발 과정을 따라가면서, 모범 사례와 주의 사항을 배울 수 있다. 또한 파이썬 생태계의 다양한 라이브러리 활용법도 살펴본다.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id=&quot;--에이콘출판사-2019년-5월-17일&quot;&gt;- 에이콘출판사, 2019년 5월 17일&lt;/h4&gt;

&lt;h4 id=&quot;--예제-코드-github-&quot;&gt;- &lt;a href=&quot;https://github.com/surinkim/python_msd_kor&quot; target=&quot;_blank&quot;&gt;예제 코드 github &lt;/a&gt;&lt;/h4&gt;

&lt;h4 id=&quot;---구매--예스24--알라딘&quot;&gt;-  구매 : &lt;a href=&quot;http://www.yes24.com/Product/Goods/73161840&quot; target=&quot;_blank&quot;&gt;예스24 &lt;/a&gt;, &lt;a href=&quot;https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=191830482&quot; target=&quot;_blank&quot;&gt;알라딘&lt;/a&gt;&lt;/h4&gt;

&lt;h4 id=&quot;--책-내용-중-잘못됐거나-궁금한-점-있으면-아래에-남겨주세요-nnhopehotmail로-보내주셔도-됩니다&quot;&gt;- 책 내용 중, 잘못됐거나 궁금한 점 있으면 아래에 남겨주세요. nnhope@hotmail로 보내주셔도 됩니다.&lt;/h4&gt;

</description>
				<pubDate>Fri, 17 May 2019 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/books/2019/05/17/book_996_python_mcs_development/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/books/2019/05/17/book_996_python_mcs_development/</guid>
			</item>
		
			<item>
				<title>QLatin1String vs QStringLiteral</title>
				        
        <description>&lt;h2 id=&quot;qlatin1string&quot;&gt;QLatin1String&lt;/h2&gt;
&lt;p&gt;Qt 함수가 매개 변수로, QString 이외에  QLatin1String도 받는다면, QLatin1String을 사용하는 것이 빠르다.&lt;/p&gt;

&lt;div class=&quot;language-c++ highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;startsWith&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Now&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;                  &lt;span class=&quot;c1&quot;&gt;// 1)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;startsWith&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;QLatin1String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Now&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;   &lt;span class=&quot;c1&quot;&gt;// 2) better&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;QString의 &lt;a href=&quot;https://doc.qt.io/qt-5/qstring.html#startsWith-3&quot;&gt;startsWith 함수&lt;/a&gt;는 const QString&amp;amp;, &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;QLatin1String&lt;/code&gt;&lt;/strong&gt; 등의 형식을 매개 변수로 받도록 오버로딩 되어있다. const char*를 받는 오버로딩은 없다.&lt;/p&gt;

&lt;p&gt;따라서, 1)번 코드에서는 const char* 에서 QString 으로 암시적 변환이 발생한다. QString의 내부 데이터 멤버인 QStringData가, &lt;em&gt;“Now”&lt;/em&gt; 문자열을 담을 수 있을 만큼 충분한 크기로, malloc으로 할당되고 문자열 리터럴이 복사된다. 그리고, Qt에서 char*는 UTF-8, QString은 UTF-16으로 저장되므로, UTF-8에서 UTF-16 으로 변환도 발생한다.&lt;/p&gt;

&lt;p&gt;2)번에서는 &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;QLatin1String&lt;/code&gt;&lt;/strong&gt; 형식을 인수로 넘긴다. 위에서 말했듯이, Qt에서 char* 는 UTF-8로 저장되는데, 대부분의 알고리즘은 UTF-8보다, ASCII나 latin1에서 훨씬 빠르다. &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;QLatin1String&lt;/code&gt;&lt;/strong&gt; 은 char*를 감싸면서 인코딩 형식만 지정된 얇은 래퍼다. 그래서, startsWith 처럼,  &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;QLatin1String&lt;/code&gt;&lt;/strong&gt;을 매개변수로 받는 함수에서는 변환 과정 없이, 원래 latin1 데이터 그대로 빠르게 처리가 가능하다.&lt;/p&gt;

&lt;h2 id=&quot;qstringliteral&quot;&gt;QStringLiteral&lt;/h2&gt;
&lt;p&gt;그런데, &lt;a href=&quot;https://doc.qt.io/qt-5/qobject.html#objectName-prop&quot;&gt;setObjectName 함수&lt;/a&gt;나 &lt;a href=&quot;https://doc.qt.io/qt-5/qurl.html#QUrl-2&quot;&gt;QUrl 클래스 생성자&lt;/a&gt;는 QString만 받는다.&lt;br /&gt;
이럴 때는, &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;QStringLiteral&lt;/code&gt;&lt;/strong&gt; 을 사용할 수 있다. &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;QStringLiteral&lt;/code&gt;&lt;/strong&gt;을 사용하면 런타임이 아닌, 컴파일 타임에 QString을 생성한다. 따라서, 런타임 성능을 향상 시킬 수 있지만, 반대로 바이너리 크기와 메모리 오버헤드가 증가한다.&lt;/p&gt;

&lt;p&gt;이런 이유로, 함수에 과부하가 있는 경우, QString만 받는 함수에 &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;QStringLiteral&lt;/code&gt;&lt;/strong&gt; 대신, &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;QLatin1String&lt;/code&gt;&lt;/strong&gt; 타입을 넘겨서, 컴파일 타임이 아니라 런타임에 &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;QLatin1String&lt;/code&gt;&lt;/strong&gt;에서 QString의 암시적 변환이 발생하도록 하는 경우도 있다.&lt;/p&gt;

&lt;h3 id=&quot;결론은&quot;&gt;결론은,&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;QLatin1String&lt;/code&gt;&lt;/strong&gt; 을 먼저 떠올리자. &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;QLatin1String&lt;/code&gt;&lt;/strong&gt;을 쓰면 QString 객체 생성 및 문자열 복사/인코딩 변환 과정을 피할 수 있다.&lt;/li&gt;
  &lt;li&gt;QString 타입만 허용하는 함수라면, 런타임 오버헤드가 없는 &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;QStringLiteral&lt;/code&gt;&lt;/strong&gt;을 생각하자.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;참고&quot;&gt;참고:&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.qt.io/blog/2014/06/13/qt-weekly-13-qstringliteral/&quot;&gt;Qt Weekly #13: QStringLiteral&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://woboq.com/blog/qstringliteral.html&quot;&gt;QStringLiteral explained - woboq&lt;/a&gt;&lt;/p&gt;

</description>
				<pubDate>Sat, 23 Mar 2019 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2019/03/23/qlatin1string_qstringliteral/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2019/03/23/qlatin1string_qstringliteral/</guid>
			</item>
		
			<item>
				<title>gen-cef-vsproj, gen-grpc-vsproj</title>
				        
        <description>&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cef&lt;/code&gt;를 한 번 빌드하려면, &lt;a href=&quot;http://opensource.spotify.com/cefbuilds/index.html&quot;&gt;CEF Prebuilt&lt;/a&gt; 사이트에서 다운로드, 압축 해제, CMake 빌드, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;libcef_dll_wrapper&lt;/code&gt; 빌드까지 손이 많이 간다.&lt;br /&gt;
그래서, 가져올 Standard Distribution 버전 파일 링크만 입력해주면, 위의 동작을 자동으로 처리하는 배치 파일을 만들었다.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/surinkim/gen-cef-vsproj&quot;&gt;https://github.com/surinkim/gen-cef-vsproj&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;아래처럼 쓰면 된다.&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;.&lt;span class=&quot;se&quot;&gt;\S&lt;/span&gt;tart.bat http://opensource.spotify.com/cefbuilds/cef_binary_3.3626.1882.g8926126_windows32.tar.bz2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;grpc&lt;/code&gt;도 복잡하다. 아래 배치 파일은 gen-cef-vsproj와 비슷하게 동작한다.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/surinkim/gen-grpc-vsproj&quot;&gt;https://github.com/surinkim/gen-grpc-vsproj&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/grpc/grpc/tags&quot;&gt;grpc Tags&lt;/a&gt;에서 가져올 태그 번호를 확인한 후, 아래와 같이 입력한다.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;.&lt;span class=&quot;se&quot;&gt;\A&lt;/span&gt;llInOne.bat v1.17.2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;grpc는 &lt;a href=&quot;https://github.com/Microsoft/vcpkg/tree/master/ports&quot;&gt;vcpkg&lt;/a&gt;에서 지원하지만, cef는 아직 포함돼있지 않다. 그래서 이렇게 아까운 시간을…&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;02/19 추가: NuGet package로 지원하는 &lt;a href=&quot;https://github.com/cefsharp/cef-binary&quot;&gt;cef-binary&lt;/a&gt;는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;libcef_dll_wrapper.lib&lt;/code&gt;를 별도로 빌드해야 하고, include 폴더도 직접 가져와야 하는 것 같다.&lt;/p&gt;
&lt;/blockquote&gt;
</description>
				<pubDate>Mon, 18 Feb 2019 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2019/02/18/automatic_build_for_cef_grpc/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2019/02/18/automatic_build_for_cef_grpc/</guid>
			</item>
		
			<item>
				<title>(번역서)실전 스케일링 파이썬 프로그래밍</title>
				        
        <description>&lt;p&gt;&lt;img src=&quot;/img/book_python_scaling/cover.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;--책소개&quot;&gt;- 책소개&lt;/h4&gt;
&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;고성능 파이썬 애플리케이션을 만들기 위한 지침, 팁, 모범 사례뿐 아니라 관련 주제에 관한 전문가들의 인터뷰를 제공한다. CPU 확장, 큐를 사용한 분산, 예외 처리, 잠금 관리, PaaS 배포, 분산 시스템 테스트, 캐싱, 성능 등을 다룬다.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id=&quot;--인사이트-2018년-8월-21일&quot;&gt;- 인사이트, 2018년 8월 21일&lt;/h4&gt;

&lt;h4 id=&quot;--예제-코드-github-&quot;&gt;- &lt;a href=&quot;https://github.com/surinkim/scaling_python_kor&quot; target=&quot;_blank&quot;&gt;예제 코드 github &lt;/a&gt;&lt;/h4&gt;

&lt;h4 id=&quot;---구매--예스24--알라딘&quot;&gt;-  구매 : &lt;a href=&quot;http://www.yes24.com/24/goods/63747074?scode=032&amp;amp;OzSrank=1&quot; target=&quot;_blank&quot;&gt;예스24 &lt;/a&gt;, &lt;a href=&quot;http://www.aladin.co.kr/shop/wproduct.aspx?ItemId=163437128&quot; target=&quot;_blank&quot;&gt;알라딘&lt;/a&gt;&lt;/h4&gt;

&lt;h4 id=&quot;--책-내용-중-잘못됐거나-궁금한-점-있으면-아래에-남겨주세요-nnhopehotmailcom으로-보내주셔도-됩니다&quot;&gt;- 책 내용 중, 잘못됐거나 궁금한 점 있으면 아래에 남겨주세요. nnhope@hotmail.com으로 보내주셔도 됩니다.&lt;/h4&gt;

</description>
				<pubDate>Tue, 21 Aug 2018 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/books/2018/08/21/book_997_python_scaling/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/books/2018/08/21/book_997_python_scaling/</guid>
			</item>
		
			<item>
				<title>로그스태시 date, fingerprint 필터</title>
				        
        <description>&lt;p&gt;로그스태시로 수집한 데이터가 앨라스틱서치에 쌓일 때, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@timestamp&lt;/code&gt; 값에는 로그가 수집되는 현재 시간이 디폴트로 설정된다.
실시간으로 수집되는 로그라면 별 문제가 없겠지만, 이런 저런 이유로 로그에 포함돼 있는 시간과 실제로 로그스태시가 
수집하는 시간의 차이가 크다면, &lt;strong&gt;date&lt;/strong&gt; 필터를 활용해서 현재 시간 대신, 로그에 포함돼 있는 타임스탬프 값이 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@timestamp&lt;/code&gt;에 설정되도록 할 수 있다.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-logstash&quot;&gt;## case 1)로그 형식이 아래와 같을 때(json)
## {&quot;log_time&quot;:&quot;2018-07-25 12:22:02&quot;}

filter {
  json {
    source =&amp;gt; &quot;message&quot;
  }
  
  date {
    match =&amp;gt; [&quot;log_time&quot;, &quot;YYYY-MM-dd HH:mm:ss&quot;]
  }

}


## case 2)로그 형식이 아래와 같을 때
## 2016-12-19 00:00:05.908 [error] &amp;lt;127.0.0.1&amp;gt; sample data 

filter {

    ## grok 패턴에서 로그 시간을 time 필드로 매칭 시킨다.
    grok {
        match =&amp;gt; { &quot;message&quot; =&amp;gt; &quot;%{TIMESTAMP_ISO8601:time} \[%{LOGLEVEL:level}\] \&amp;lt;%{IP:ip}\&amp;gt; %{GREEDYDATA:contents}&quot; }
    }
    
    ## date 필터를 사용해서 @timestamp 값에 time 필드 값이 설정되도록 한다.
    date {
        
        match =&amp;gt; [&quot;time&quot;, &quot;ISO8601&quot;]     
        
        ## time 필드를 더 이상 사용하지 않는다면 제거한다.
        remove_field =&amp;gt; [&quot;time&quot;]
    }

}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;한편, 여러 복잡한 상황상, 동일 데이터가 여러 로그 파일에 들어가 있다면…엘라스틱서치에도 중복해서 들어가게 된다.
이때는 &lt;strong&gt;fingerprint&lt;/strong&gt; 필터를 사용해서 동일 데이터의 중복 적재를 막을 수 있다. 해시값을 생성하기 때문에 사용하지 않을 때보다 수집 시간은 길어진다.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-logstash&quot;&gt;
filter {

  ...

 # for remove that duplicate log
    fingerprint {
        method =&amp;gt; &quot;SHA1&quot;
        key =&amp;gt; &quot;KEY&quot;
    }
}


output {
    elasticsearch {
        hosts =&amp;gt; [&quot;localhost:9200&quot;]
        index =&amp;gt; &quot;demo_log&quot;
        document_id =&amp;gt; &quot;%{fingerprint}&quot;
        
    }
    stdout { codec =&amp;gt; rubydebug }
}


&lt;/code&gt;&lt;/pre&gt;
</description>
				<pubDate>Thu, 26 Jul 2018 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2018/07/26/logstash_filter/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2018/07/26/logstash_filter/</guid>
			</item>
		
			<item>
				<title>CEF sub process 샘플</title>
				        
        <description>&lt;p&gt;cef는 chrome과 동일하게 멀티 프로세스로 동작한다. 만약, all.exe를 만들어 실행하더라도, 보통 3개의 all.exe 프로세스가 생성되며 각각 browser(&lt;strong&gt;main&lt;/strong&gt;), renderer/gpu(&lt;strong&gt;sub&lt;/strong&gt;) 프로세스 역할을 담당한다. &lt;br /&gt;
배틀넷 런처, LOL 클라이언트 등 대부분의 cef 애플리케이션은 main 프로세스 전용의 exe(예를 들어, host.exe)와 renderer/gpu 전용의 exe(예를 들어, sub.exe)를 만들어 사용한다. &lt;br /&gt;
이렇게 하면, host에 주요 로직을 두고, sub에 메시지 라우터 같은, 자바스크립트와의 연동 처리를 둬서 코드를 분리할 수 있다.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://bitbucket.org/chromiumembedded/cef/wiki/GeneralUsage#markdown-header-entry-point-function&quot;&gt;이 페이지&lt;/a&gt;를 참고해서 간단히 샘플을 만들었는데, &lt;a href=&quot;https://github.com/surinkim/cef_sub_process&quot;&gt;여기서&lt;/a&gt; 확인할 수 있다. vs2015 솔루션이 들어있고 빌드 환경은 x64/debug만 설정했다.&lt;/p&gt;

&lt;p&gt;디버그 버전 libcef.dll 크기가 100M가 넘기 때문에 clone 할 때, 조금 기다려야 한다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;github에는 50M가 넘어가는 파일은 올릴 수 없는데, &lt;a href=&quot;https://git-lfs.github.com/&quot;&gt;Git LFS&lt;/a&gt;를 사용하면 소스 코드처럼 빈번하게 변경되는 파일들과 구분해서, 덩치 큰 바이너리 파일도 올릴 수 있다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;sub.exe 빌드 후, post build event로 manifest를 추가하는 과정이 있는데, 이 과정을 skip 하면 윈도우 10에서는 웹 페이지가 보이지 않는다. 윈도우 7에서는 제대로 보인다.&lt;/p&gt;
&lt;/blockquote&gt;
</description>
				<pubDate>Fri, 29 Jun 2018 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2018/06/29/cef_sub_process_sample/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2018/06/29/cef_sub_process_sample/</guid>
			</item>
		
			<item>
				<title>Telegram desktop 빌드</title>
				        
        <description>&lt;p&gt;Telegram은 pc 및 모바일 버전 클라이언트 소스를 github에 공개하고 있다.
Telegram 역시 Qt를 사용하고 있기 때문에 참고할 내용이 많겠다 싶어 pc 버전을 받아서 빌드해봤다.&lt;/p&gt;

&lt;p&gt;대부분은 &lt;a href=&quot;https://github.com/telegramdesktop/tdesktop/blob/dev/docs/building-msvc.md&quot;&gt;Build instructions for Visual Studio 2017&lt;/a&gt;을 따라하고,
다음 몇 가지만 주의하면 된다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;VS2017 설치할 때, ‘개별 구성 요소’에서 ‘UWP용 Windows 10 SDK(10.0.16299.0):C++’도 설치한다. 이때, C#, VB, JS 버전도 같이 설치된다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;cmake의 현재 버전은 3.11.X다. 그런데, 이 버전을 설치하면 openal 빌드가 실패한다. 이미 &lt;a href=&quot;https://github.com/kcat/openal-soft/commit/cae4b1a062b53dd25eba7caa41622be730106749&quot;&gt;패치&lt;/a&gt;는 됐지만, 아직 릴리즈가 안됐다. 그래서, cmake를 3.10.3으로 설치했다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;nasm 경로도 path에 추가해줘야 ffmpeg 빌드가 성공한다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;솔루션 생성을 하고 vs2017로 빌드하면 3개의 에러가 발생한다. 그런데, C2220(모든 경고를 오류로 처리)에러로 인해 연달아 발생하는 오류들이므로, 이 에러만 잡으면 된다. 제대로 하려면 모든 경고를 잡아야 하지만, 우선은 &lt;strong&gt;빌드 성공이 목적&lt;/strong&gt;이므로 옵션에서 ‘경고를 오류로 처리 안함.(WX-)’으로 다시 빌드했다. 그런데…여전히 동일한 에러가 발생한다. ‘명령줄 - 모든 옵션’에서도 WX- 플래그가 제대로 설정된 것을 확인했는데 여전히 동일하다. 잠깐 고민하다가..지금은 &lt;strong&gt;빌드 성공이 목적&lt;/strong&gt;이므로 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#pragma warning(disable:4566)&lt;/code&gt;으로 처리했다.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Telegram.exe&lt;/code&gt; 파일은 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$tdesktop\out\debug\&lt;/code&gt; 폴더에 생성된다. 속성-디버깅-명령에 exe를 연결하면 디버깅 모드로 돌려볼 수 있다.&lt;/p&gt;
</description>
				<pubDate>Mon, 28 May 2018 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2018/05/28/build_telegram_desktop/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2018/05/28/build_telegram_desktop/</guid>
			</item>
		
			<item>
				<title>정규표현식</title>
				        
        <description>&lt;h3 id=&quot;정규-표현식으로-c-클래스-이름-표현하기&quot;&gt;정규 표현식으로 C++ 클래스 이름 표현하기&lt;/h3&gt;

&lt;p&gt;유효한 C++ 클래스 이름을 정규 표현식으로 나타내자면 아래처럼 쓸 수 있다.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;^[A-Za-z_][A-za-z0-9]*
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;^&lt;/strong&gt;(caret): string 시작이 일치해야 함을 뜻한다. 여기서는 대, 소문자 구분없이 a에서 z 사이의 문자 혹은 _(under-score)로 시작하는 것을 매칭한다.
    &lt;blockquote&gt;
      &lt;p&gt;[^abc] :  caret이 대괄호 안에 쓰이는 경우는 a, b, c를 제외한 문자를 매칭한다.&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;E&lt;/strong&gt;*: 검색시에 사용하는 wild-card와 같은 의미로 쓴다. 0번 또는 여러번 매칭되는 것을 의미한다. 자주 오용되는 경우로, ‘1개 이상의 white-space로 끝나는 문자열’을 매칭시킬 때, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\s*$&lt;/code&gt;를 사용하는데, 이는 결국 ‘0개 또는 여러 개의 white-space로 끝나는 문자열’을 의미하므로, 모든 문자열이 매칭된다. 올바르게 사용하려면 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\s+$&lt;/code&gt; 처럼 사용해야 한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;c-sample-code&quot;&gt;c++ sample code&lt;/h4&gt;
&lt;div class=&quot;language-c++ highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;regex&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;pattern&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;^[A-Za-z_][A-Za-z0-9]*&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Is Match : &quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;regex_match&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;12&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;pattern&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;//Is Match : 0&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Is Match : &quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;regex_match&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;_12&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pattern&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;//Is Match : 1&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Is Match : &quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;regex_match&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;*A&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;pattern&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;//Is Match : 0&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Is Match : &quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;regex_match&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;AB&amp;amp;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pattern&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;//Is Match : 0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;0부터-99까지의-수로-시작하고-끝나는-문자열&quot;&gt;0부터 99까지의 수로 시작하고 끝나는 문자열&lt;/h3&gt;

&lt;p&gt;아래 4개의 정규 표현식은 모두 동일하게 0부터 99까지의 수로 시작해서 끝나는 문자열을 나타낸다.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;//method 1
^[0-9]{1,2}

//method 2
^\d{1,2}$

//method 3
^\d\d{0,1}$

//method 4
^\d\d?$
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;method 1&lt;/p&gt;

    &lt;p&gt;&lt;strong&gt;{}&lt;/strong&gt;: quantifier, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x{1,2}&lt;/code&gt;는 x가 1번 이상, 2번 이하로 나타나야 매칭되는 것을 의미.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;method 2&lt;/p&gt;

    &lt;p&gt;&lt;strong&gt;\d&lt;/strong&gt;: [0-9]와 동일 의미.
  &lt;strong&gt;E$&lt;/strong&gt;: 문자열의 끝이 E로 끝나야 함을 의미.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;method 3&lt;/p&gt;

    &lt;p&gt;시작은 숫자 1개, 끝은 숫자가 없거나 1개.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;method 4&lt;/p&gt;

    &lt;p&gt;&lt;strong&gt;?&lt;/strong&gt;: {0,1}과 같은 의미. 
  문자열 시작은 숫자로 시작하며, 이어서 숫자가 0번 혹은 1번 나오고 종료하는 문자열을 의미한다.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;특정-문자열-찾기&quot;&gt;특정 문자열 찾기&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;letter|mail&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;|&lt;/code&gt;은 or를 의미. 따라서 mail 이나 letter를 포함하는 문자열이 매칭됨.&lt;/p&gt;

&lt;div class=&quot;language-c++ highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;//qt&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;QRegularExpression&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;re&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;letter|mail&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;qDebug&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;re&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;email&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hasMatch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;       &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;qDebug&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;re&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;mailbox&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hasMatch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;     &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;qDebug&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;re&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;mail&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hasMatch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;qDebug&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;re&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;letters&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hasMatch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;     &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;//c++11&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;regex&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;pattern&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;letter|mail&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;regex_search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;email&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pattern&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;endl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;// 1&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;regex_search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;mailbox&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pattern&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;endl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;// 1&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;regex_search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;mail&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pattern&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;endl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;     &lt;span class=&quot;c1&quot;&gt;// 1&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;regex_search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;letters&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pattern&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;endl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;// 1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;std::regex_match&lt;/code&gt;는 전체 입력이 모두 매칭될 때만 true를 반환한다. 
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;std::regex_search&lt;/code&gt;는 입력의 일부분만 매칭되도 true를 반환한다.
따라서, 위 코드에서 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;std::regex_match&lt;/code&gt;를 사용했다면 “mail”과 비교한 경우만 true고, 나머지는 false다.  &lt;a href=&quot;http://stackoverflow.com/questions/26696250/difference-between-stdregex-match-stdregex-search&quot;&gt;StackOverFlow&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\b(letter|mail)\b&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;()&lt;/code&gt;은 capture하려고 하는 부분을 명시.  소괄호로 묶음으로써 더 복잡한 정규 표현식을 사용할 수 있다.
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\b&lt;/code&gt;는 단어의 시작과 끝을 매칭하는 word boundary를 뜻함.&lt;/p&gt;
&lt;div class=&quot;language-c++ highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;//qt&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;QRegularExpression&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;re&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;b(letter|mail)&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;b&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;qDebug&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;re&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;email&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hasMatch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;       &lt;span class=&quot;c1&quot;&gt;// false&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;qDebug&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;re&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;mailbox&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hasMatch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;     &lt;span class=&quot;c1&quot;&gt;// false&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;qDebug&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;re&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;mail&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hasMatch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;qDebug&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;re&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;letters&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hasMatch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;     &lt;span class=&quot;c1&quot;&gt;// false&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;qDebug&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;re&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;letter&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hasMatch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;      &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;//c++11&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;regex&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;pattern&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;b(letter|mail)&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;b&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;regex_search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;email&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pattern&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;endl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;// 0&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;regex_search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;mailbox&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pattern&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;endl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;// 0&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;regex_search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;mail&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pattern&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;endl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;     &lt;span class=&quot;c1&quot;&gt;// 1&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;regex_search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;letters&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pattern&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;endl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;// 0&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;regex_search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;letter&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pattern&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;endl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;   &lt;span class=&quot;c1&quot;&gt;// 1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;amp;(?!amp;)&lt;/code&gt;&lt;/p&gt;

    &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(?!XX)&lt;/code&gt; :  negative lookahead. XX를 제외한 패턴을 매칭함. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;amp;(?!amp;)&lt;/code&gt;는 &amp;amp;를 찾되, 뒤에 amp;가 없는 패턴을 매칭한다는 의미.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Eric과 Eirik을 찾는 경우&lt;/p&gt;

    &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\b(Eric|Eirik)\b&lt;/code&gt; : Ericsson 같은 문자열을 제외하기 위해서 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\b&lt;/code&gt;(word boundary) 필요.&lt;/p&gt;

    &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\bEi?ri[ck]\b&lt;/code&gt; : Eric과 Eirik이 매칭되지만, Erik, Eiric 같은 문자열도 매칭된다.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href=&quot;http://doc.qt.io/qt-4.8/qregexp.html&quot;&gt;참고 1) QT QRegExp&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://regex101.com/&quot;&gt;참고 2) regex101.com/&lt;/a&gt;&lt;/p&gt;
</description>
				<pubDate>Mon, 30 Apr 2018 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2018/04/30/regular-expression/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2018/04/30/regular-expression/</guid>
			</item>
		
			<item>
				<title>Cowboy, Rebar3, Travis CI</title>
				        
        <description>&lt;p&gt;얼랭 Cowboy, Rebar3(+ hex)로 간단한 웹 서버를 만들어 Travis CI를 연동했다.&lt;/p&gt;

&lt;p&gt;Rebar3를 사용하면, 얼랭 프로젝트의 의존성 관리, 구성, 배포 파일 생성 등을 쉽게 할 수 있다. &lt;a href=&quot;https://hex.pm&quot;&gt;hex&lt;/a&gt;은 파이썬의 PyPI와 같은, 얼랭 패키지 관리자다.&lt;/p&gt;

&lt;p&gt;Rebar3 설치와 실행 및 hex 사용법은 아래 글을 참고하면 어려울 건 없다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://medium.com/erlang-central/building-your-first-erlang-app-using-rebar3-25f40b109aad&quot;&gt;Building Your First Erlang App Using Rebar3&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://davekuhlman.org/rebar3-cowboy-rest-template.html&quot;&gt;A rebar3 Cowboy REST app and a template&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;몇 가지 문제가 있었는데, 우선&lt;/p&gt;

&lt;h4 id=&quot;hex-사용을-위해-rebarconfig에-아래-설정을-추가하면&quot;&gt;hex 사용을 위해 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rebar.config&lt;/code&gt;에 아래 설정을 추가하면,&lt;/h4&gt;
&lt;div class=&quot;language-config highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;{&lt;span class=&quot;n&quot;&gt;plugins&lt;/span&gt;, [&lt;span class=&quot;n&quot;&gt;rebar3_hex&lt;/span&gt;]}.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;아래 에러가 발생했다.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;rebar3 update
&lt;span class=&quot;o&quot;&gt;===&amp;gt;&lt;/span&gt; Fetching rebar3_hex &lt;span class=&quot;o&quot;&gt;({&lt;/span&gt;pkg,&lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;rebar3_hex&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&amp;gt;&amp;gt;,&amp;lt;&amp;lt;&quot;4.1.0&quot;&amp;gt;&amp;gt;})
===&amp;gt; Downloaded package, caching at /home/hyun/.cache/rebar3/hex/default/packages/rebar3_hex-4.1.0.tar
===&amp;gt; Compiling rebar3_hex
===&amp;gt; Compiling _build/default/plugins/rebar3_hex/src/rebar3_hex_http.erl failed
_build/default/plugins/rebar3_hex/src/rebar3_hex_http.erl:14: can&apos;t find include lib &quot;public_key/include/OTP-PUB-KEY.hrl&quot;

===&amp;gt; Plugin rebar3_hex not available. It will not be used.

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/edgurgel/httpoison/issues/46&quot;&gt;이때는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;erlang-dev&lt;/code&gt; 패키지를 추가로 설치해줘야 한다.&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;다음-문제는-hex로-cowboy를-설치하고-컴파일-했을-때다&quot;&gt;다음 문제는 hex로 cowboy를 설치하고 컴파일 했을 때다.&lt;/h4&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;rebar3 compile
&lt;span class=&quot;o&quot;&gt;===&amp;gt;&lt;/span&gt; Verifying dependencies...
&lt;span class=&quot;o&quot;&gt;===&amp;gt;&lt;/span&gt; Fetching cowboy &lt;span class=&quot;o&quot;&gt;({&lt;/span&gt;pkg,&lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;cowboy&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&amp;gt;&amp;gt;,&amp;lt;&amp;lt;&quot;2.2.2&quot;&amp;gt;&amp;gt;})
===&amp;gt; Downloaded package, caching at /home/hyun/.cache/rebar3/hex/default/packages/cowboy-2.2.2.tar
===&amp;gt; Fetching meck ({pkg,&amp;lt;&amp;lt;&quot;meck&quot;&amp;gt;&amp;gt;,&amp;lt;&amp;lt;&quot;0.8.9&quot;&amp;gt;&amp;gt;})
===&amp;gt; Downloaded package, caching at /home/hyun/.cache/rebar3/hex/default/packages/meck-0.8.9.tar
===&amp;gt; Fetching cowlib ({pkg,&amp;lt;&amp;lt;&quot;cowlib&quot;&amp;gt;&amp;gt;,&amp;lt;&amp;lt;&quot;2.1.0&quot;&amp;gt;&amp;gt;})
===&amp;gt; Downloaded package, caching at /home/hyun/.cache/rebar3/hex/default/packages/cowlib-2.1.0.tar
===&amp;gt; Fetching ranch ({pkg,&amp;lt;&amp;lt;&quot;ranch&quot;&amp;gt;&amp;gt;,&amp;lt;&amp;lt;&quot;1.4.0&quot;&amp;gt;&amp;gt;})
===&amp;gt; Downloaded package, caching at /home/hyun/.cache/rebar3/hex/default/packages/ranch-1.4.0.tar
===&amp;gt; Compiling cowlib
===&amp;gt; Compiling _build/default/lib/cowlib/src/cow_sse.erl failed
_build/default/lib/cowlib/src/cow_sse.erl:32: syntax error before: &apos;:=&apos;

_build/default/lib/cowlib/src/cow_sse.erl:44: type event() undefined
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;hex로 cowboy 최신 버전인 2.2.2를 설치했는데, 2.0 부터는 Erlang/OTP 19 이상만 지원한다.
그래서, 시스템에 설치된 얼랭을 업그레이드 해야 한다.
&lt;a href=&quot;https://www.erlang-solutions.com/resources/download.html&quot;&gt;Erlang Solutions 저장소를 시스템에 추가해서 설치하면 쉽게 할 수 있다.&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;마지막으로-애플리케이션을-시작할-때-cowboy도-실행되도록-해야-한다&quot;&gt;마지막으로, 애플리케이션을 시작할 때 cowboy도 실행되도록 해야 한다.&lt;/h4&gt;
&lt;p&gt;자동으로 추가되지 않기 때문에, 런타임 에러가 발생한다.
프로젝트명.app.src 파일에 cowboy를 추가한다.&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;application, cowboy_rebar_travis,
 &lt;span class=&quot;o&quot;&gt;[{&lt;/span&gt;description, &lt;span class=&quot;s2&quot;&gt;&quot;An OTP application&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;,
  &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;vsn, &lt;span class=&quot;s2&quot;&gt;&quot;0.1.0&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;,
  &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;registered, &lt;span class=&quot;o&quot;&gt;[]}&lt;/span&gt;,
  &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;mod, &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; cowboy_rebar_travis_app, &lt;span class=&quot;o&quot;&gt;[]}}&lt;/span&gt;,
  &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;applications,
   &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;kernel,
    stdlib,
    cowboy
   &lt;span class=&quot;o&quot;&gt;]}&lt;/span&gt;,
  &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;env&lt;/span&gt;,[]&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;,
  &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;modules, &lt;span class=&quot;o&quot;&gt;[]}&lt;/span&gt;,

  &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;maintainers, &lt;span class=&quot;o&quot;&gt;[]}&lt;/span&gt;,
  &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;licenses, &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Apache 2.0&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]}&lt;/span&gt;,
  &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;links, &lt;span class=&quot;o&quot;&gt;[]}&lt;/span&gt;
 &lt;span class=&quot;o&quot;&gt;]}&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Travis-CI 실행은 별다를 게 없다.
유닛테스트 들어가고, 빌드 옵션 등도 포함되면 얘기가 다르겠지만,
지금 예제 정도는 아래 몇 줄로 끝이다.&lt;/p&gt;
&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;language&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;erlang&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;otp_release&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;20.0&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;19.2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/surinkim/cowboy_rebar_travis&quot;&gt;완성된 예제는 여기서 확인.&lt;/a&gt;&lt;/p&gt;

</description>
				<pubDate>Fri, 30 Mar 2018 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2018/03/30/Cowboy_Rebar3_Travisci/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2018/03/30/Cowboy_Rebar3_Travisci/</guid>
			</item>
		
			<item>
				<title>(번역서)모던 C++로 배우는 함수형 프로그래밍</title>
				        
        <description>&lt;p&gt;&lt;img src=&quot;/img/book_c++_fp/cover.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;--책소개&quot;&gt;- 책소개&lt;/h4&gt;
&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;모던 C++의 새로운 기능과 함수형 프로그래밍을 다룬다. 기능이나 개념별로 예제 코드를 작성하고 실행하며 공부할 수 있도록 구성했다. 기본 문법은 자세히 설명하지 않으므로 C++ 사용 경험이 있는 독자를 대상으로 한다. C++ 11 이후의 새로운 기능을 요약해서 배우고, 함수형 프로그래밍에 적용해 보는 과정을 흥미 있게 따라갈 수 있다.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id=&quot;--에이콘출판사-2018년-3월-30일&quot;&gt;- 에이콘출판사, 2018년 3월 30일&lt;/h4&gt;

&lt;h4 id=&quot;--예제-코드-github-&quot;&gt;- &lt;a href=&quot;https://github.com/surinkim/learning_cpp_functional_programming_kor&quot; target=&quot;_blank&quot;&gt;예제 코드 github &lt;/a&gt;&lt;/h4&gt;

&lt;h4 id=&quot;---구매--예스24--알라딘&quot;&gt;-  구매 : &lt;a href=&quot;http://www.yes24.com/24/goods/59384637&quot; target=&quot;_blank&quot;&gt;예스24 &lt;/a&gt;, &lt;a href=&quot;http://www.aladin.co.kr/shop/wproduct.aspx?ItemId=138158223&quot; target=&quot;_blank&quot;&gt;알라딘&lt;/a&gt;&lt;/h4&gt;

&lt;h4 id=&quot;--책-내용-중-잘못됐거나-궁금한-점-있으면-아래에-남겨주세요-nnhopehotmail로-보내주셔도-됩니다&quot;&gt;- 책 내용 중, 잘못됐거나 궁금한 점 있으면 아래에 남겨주세요. nnhope@hotmail로 보내주셔도 됩니다.&lt;/h4&gt;

</description>
				<pubDate>Fri, 30 Mar 2018 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/books/2018/03/30/book_998_cpp_functional/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/books/2018/03/30/book_998_cpp_functional/</guid>
			</item>
		
			<item>
				<title>RabbitMQ 기초</title>
				        
        <description>&lt;p&gt;RabbitMQ는 메시지 브로커의 한 종류로, 얼랭으로 만들었다.&lt;br /&gt;
또 다른 메시지 브로커인 Kafka와 자주 비교되는데, &lt;strong&gt;AMQP 등의 표준 프로토콜 지원, ZooKeeper 같은 코디네이터가 필요없다는 점, 메시지 priority 설정, 웹 콘솔 지원&lt;/strong&gt; 등이 장점으로 꼽힌다.&lt;/p&gt;

&lt;p&gt;여기서는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rabbitmqadmin&lt;/code&gt; 명령으로 콘솔에서 메시지를 보내고(publish) 가져오고(consume), 동일한 작업을 파이썬 코드로도 실행해 본다.&lt;/p&gt;

&lt;h3 id=&quot;exchange-binding-queue&quot;&gt;Exchange, Binding, Queue&lt;/h3&gt;

&lt;p&gt;먼저, RabbitMQ의 핵심 구성 요소인 Exchange, Binding, Queue에 대해 짚고 넘어가자. 아래 그림은 RabbitMQ 호스팅 서비스인 CloudAMQP에서 가져왔다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/2018_02_04/image0.png&quot; alt=&quot;image1.jpg&quot; width=&quot;380px&quot; height=&quot;417px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;프로듀서 ①이 RabbitMQ의 익스체인지에 메시지를 전송한다.&lt;br /&gt;
RabbitMQ 메시지 처리 모델의 중요 원칙은 프로듀서가 어떤 메시지도 큐에 직접 보낼 수 없도록 하는 것이다. 프로듀서는 오직 익스체인지에만 메시지를 보낼 수 있다.&lt;/p&gt;

&lt;p&gt;익스체인지 ②가 수신한 메시지는 바인딩 ③을 통해 큐 ④로 들어간다.&lt;br /&gt;
바인딩은 익스체인지와 큐의 관계를 정의한 것으로 라우팅과 같은 개념이다.&lt;br /&gt;
큐는 메시지가 저장되는 버퍼다.&lt;/p&gt;

&lt;p&gt;마지막으로, 컨슈머 ⑤가 메시지를 가져와 처리한다.&lt;/p&gt;

&lt;h3 id=&quot;rabbitmqadmin&quot;&gt;rabbitmqadmin&lt;/h3&gt;

&lt;p&gt;RabbitMQ를 설치한 후에, 추가로 해야 될 작업은 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rabbitmqadmin&lt;/code&gt; 명령행 설치다.&lt;br /&gt;
웹 콘솔을 통해 설치하면 되는데 찾기가 힘들 뿐, 설치는 간단하므로 아래 링크를 참고하자.&lt;/p&gt;

&lt;blockquote&gt;

  &lt;p&gt;&lt;a href=&quot;https://nixmash.com/post/installing-rabbitmqadmin-command-line-tool-in-ubuntu&quot;&gt;Installing the RabbitMQAdmin Command Line Tool in Linux&lt;/a&gt;&lt;/p&gt;

&lt;/blockquote&gt;

&lt;p&gt;예제로 사용할 메시징 처리 흐름은 아래와 같다.&lt;br /&gt;
news라는 익스체인지에 메시지를 보내면, 메시지 id prefix를 기준으로 하는 바인딩을 통해, tech와 book 큐로 각각 전달된다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/2018_02_04/image1.png&quot; alt=&quot;image1.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;익스체인지를 생성한다.&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;rabbitmqadmin &lt;span class=&quot;nb&quot;&gt;declare &lt;/span&gt;exchange &lt;span class=&quot;nv&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;news &lt;span class=&quot;nb&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;topic
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;큐를 생성한다.&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;rabbitmqadmin &lt;span class=&quot;nb&quot;&gt;declare &lt;/span&gt;queue &lt;span class=&quot;nv&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;tech
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;rabbitmqadmin &lt;span class=&quot;nb&quot;&gt;declare &lt;/span&gt;queue &lt;span class=&quot;nv&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;book
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;생성한 큐 목록을 확인한다.&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;hyun@hyun-VirtualBox:~&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;rabbitmqadmin list queues
+------+----------+
| name | messages |
+------+----------+
| book | 0        |
| tech | 0        |
+------+----------+
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;바인딩을 생성한다.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;rabbitmqadmin &lt;span class=&quot;nb&quot;&gt;declare &lt;/span&gt;binding &lt;span class=&quot;nb&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;news&quot;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;destination_type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;queue&quot;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;destination&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;tech&quot;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;routing_key&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;tech.*&quot;&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;rabbitmqadmin &lt;span class=&quot;nb&quot;&gt;declare &lt;/span&gt;binding &lt;span class=&quot;nb&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;news&quot;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;destination_type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;queue&quot;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;destination&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;book&quot;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;routing_key&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;book.*&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;바인딩 생성 후, 목록을 확인하자.&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;hyun@hyun-VirtualBox:~&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;rabbitmqadmin list bindings
+--------+-------------+-------------+
| &lt;span class=&quot;nb&quot;&gt;source&lt;/span&gt; | destination | routing_key |
+--------+-------------+-------------+
| news   | book        | book.&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;      |
| news   | tech        | tech.&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;      |
+--------+-------------+-------------+

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;이제, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;news&lt;/code&gt; 익스체인지에 전송된 메시지 중, 메시지 id가 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;book.*&lt;/code&gt;에 매칭되면 book 큐에 저장되고, 메시지 id가 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tech.*&lt;/code&gt;에 매칭되면 tech 큐에 저장된다.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;콘솔에서 메시지를 전송해 보자.&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;hyun@hyun-VirtualBox:~&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;rabbitmqadmin publish &lt;span class=&quot;nv&quot;&gt;exchange&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;news &lt;span class=&quot;nv&quot;&gt;routing_key&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;tech.12&quot;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;12번째 뉴스 - 러스트&quot;&lt;/span&gt;
Message published
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;news&lt;/code&gt;익스체인지에 메시지 id를 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tech.12&lt;/code&gt;로 설정해서 보냈으므로, tech 큐에 저장됐을 것이다. 확인해 보자.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;hyun@hyun-VirtualBox:~&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;rabbitmqadmin list queues
+------+----------+
| name | messages |
+------+----------+
| book | 0        |
| tech | 1        |
+------+----------+

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;이번에는 tech 큐에 저장된 메시지를 가져온다.&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;hyun@hyun-VirtualBox:~&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;rabbitmqadmin get &lt;span class=&quot;nv&quot;&gt;queue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;tech &lt;span class=&quot;nv&quot;&gt;requeue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;끝의 requeue 옵션은 메시지를 큐에서 꺼내 온 다음, 다시 큐에 저장할 것인지를 지정하는 옵션이다.&lt;br /&gt;
&lt;strong&gt;디폴트 동작은 requeue=true&lt;/strong&gt;로, 메시지를 꺼내와도 삭제되지 않고, 큐에 메시지가 다시 저장된다.&lt;br /&gt;
여기서는 requeue=false로 가져왔으므로, 이 명령이 실행되면 큐에서 메시지가 사라져야 한다.
확인해 보자.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;hyun@hyun-VirtualBox:~&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;rabbitmqadmin list queues
+------+----------+
| name | messages |
+------+----------+
| book | 0        |
| tech | 0        |
+------+----------+

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;파이썬-스크립트&quot;&gt;파이썬 스크립트&lt;/h3&gt;
&lt;p&gt;이번에는 rabbitmqadmin 대신, 파이썬 코드로 메시지를 게시하고 가져와 본다.&lt;br /&gt;
파이썬에 pika를 설치해줘야 한다. pika는 RabbitMQ가 사용하는 AMQP 라이브러리다.&lt;/p&gt;

&lt;p&gt;먼저, tech 메시지를 수신하는 consumer.py 코드다.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c1&quot;&gt;# consumer.py
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;pika&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;pika&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BlockingConnection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BasicProperties&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;on_message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;channel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;method_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;header_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;tech_id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;method_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;routing_key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;.&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;---새 메시지---&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;tech id : &apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tech_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;body : &apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;decode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;utf-8&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    
    &lt;span class=&quot;n&quot;&gt;channel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;basic_ack&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delivery_tag&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;method_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delivery_tag&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;tech 메시지 수신 대기 중...&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;connection&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pika&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BlockingConnection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;channel&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;connection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;channel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;channel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;basic_consume&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;on_message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;queue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;tech&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;channel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;start_consuming&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;except&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;KeyboardInterrupt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;channel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stop_consuming&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;connection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;로컬 rabbitmq에서 동기식 연결을 맺고 tech.* 메시지가 수신되면 가져온다. 
메시지를 가져 온 다음, ack를 보내서 큐에서 메시지가 제거되도록 한다.&lt;/p&gt;

&lt;p&gt;다음으로, 메시지를 보내는 publisher.py 코드다.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c1&quot;&gt;# publisher.py
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;pika&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BlockingConnection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BasicProperties&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;topic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;connection&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BlockingConnection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;channel&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;connection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;channel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;props&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BasicProperties&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;content_type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;text/plain&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;delivery_mode&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;channel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;basic_publish&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;news&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;topic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;finally&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;connection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;tech.17&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;ejabberd 버전업&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;consumer.py를 실행시켜 두고, 다른 쉘에서 publisher.py를 실행했을 때 출력은 다음과 같다.&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;work&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; hyun@hyun-VirtualBox:~/work/python&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;python consumer.py
tech 메시지 수신 대기 중...

&lt;span class=&quot;nt&quot;&gt;---&lt;/span&gt;새 메시지---
tech &lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt; :  17
body :  ejabberd 버전업
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

</description>
				<pubDate>Sun, 04 Feb 2018 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2018/02/04/RabbitMQ_usage/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2018/02/04/RabbitMQ_usage/</guid>
			</item>
		
			<item>
				<title>파이썬 Tox</title>
				        
        <description>&lt;p&gt;Tox는 파이썬의 테스트 자동화, 표준화를 위한 도구다.  Tox를 사용하면,&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;다양한 파이썬 버전에서 패키지가 제대로 설치되는지 확인&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;선택한 테스트 툴과 설정을 사용해서 자동으로 테스트 실행&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;CI와 통합&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;이런 것들을 할 수 있다.&lt;/p&gt;

&lt;p&gt;여기서는 Tox에서 pytest 실행 방법을 정리한다.
pytest 확장인 pytest-cov, pytest-flake8도 사용해본다.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;hello_flaskpy&quot;&gt;hello_flask.py&lt;/h3&gt;
&lt;p&gt;먼저, virtualenv로 dev_tox 환경을 만들고, hello_flask.py 플라스크 소스를 추가했다.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c1&quot;&gt;# hello_flask.py
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;flask&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Flask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;jsonify&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Flask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;__name__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;route&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;/api&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;my_microservice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;jsonify&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;Hello&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;World!&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;__name__&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;__main__&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;/api 엔드포인트를 호출하면, json으로 Hello World를 반환하는 심플한 서버다.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;curl localhost:5000/api 
&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;                         
  &lt;span class=&quot;s2&quot;&gt;&quot;Hello&quot;&lt;/span&gt;: &lt;span class=&quot;s2&quot;&gt;&quot;World!&quot;&lt;/span&gt;       
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;                         
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;test_hello_flaskpy&quot;&gt;test_hello_flask.py&lt;/h3&gt;
&lt;p&gt;이제, hello_flask를 테스트 하기 위한 모듈, test_hello_flask.py를 만든다.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c1&quot;&gt;# -*- coding: utf-8 -*-
# test_hello_flask.py
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;unittest&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;json&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;sys&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;hello_flask&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;app&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_app&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;TestApp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;unittest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TestCase&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;test_help&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;app&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_app&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;test_client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;hello&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;/api&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;version_info&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)):&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;loads&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hello&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;utf8&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;loads&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hello&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;encode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;utf8&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;assertEqual&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;Hello&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;World!&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;__name__&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;__main__&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;unittest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;15 ~ 열여덟 라인은 2.X과 3.X 버전의 str() 함수 원형이 다르기 때문에 추가했다.
(아래에서 Tox로 테스트할 때, 2.7과 3.6 버전을 사용한다.)&lt;/p&gt;

&lt;p&gt;pytest로 테스트가 성공하는지 먼저 확인해 보자.&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;dev_tox&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;pytest
&lt;span class=&quot;o&quot;&gt;=============================&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;test &lt;/span&gt;session starts &lt;span class=&quot;o&quot;&gt;=============================&lt;/span&gt;
platform win32 &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt; Python 3.6.3, pytest-3.3.2, py-1.5.2, pluggy-0.6.0
rootdir: D:&lt;span class=&quot;se&quot;&gt;\C&lt;/span&gt;ode&lt;span class=&quot;se&quot;&gt;\p&lt;/span&gt;ython_dev&lt;span class=&quot;se&quot;&gt;\d&lt;/span&gt;ev_tox&lt;span class=&quot;se&quot;&gt;\f&lt;/span&gt;lask, inifile:
plugins: flake8-0.9.1, cov-2.5.1
collected 1 item

test_functional_01.py &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;                                                  &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;100%]

&lt;span class=&quot;o&quot;&gt;==========================&lt;/span&gt; 1 passed &lt;span class=&quot;k&quot;&gt;in &lt;/span&gt;0.22 seconds &lt;span class=&quot;o&quot;&gt;===========================&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;tox&quot;&gt;Tox&lt;/h3&gt;
&lt;p&gt;이제 Tox를 사용할 차례다. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pip install tox&lt;/code&gt;로 패키지를 설치하자.&lt;br /&gt;
Tox를 실행하려면, tox.ini와 setup.py가 필요하다. setup.py의 내용은, 여기서 중요하지 않으므로, 아래처럼 최소한으로 했다.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;setuptools&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;setup&lt;/span&gt;


&lt;span class=&quot;n&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;hello_flask&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;0.1&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;tox.ini에는 테스트를 실행할 파이썬 버전, 의존성, 테스트 명령 등을 적어둔다.&lt;/p&gt;

&lt;div class=&quot;language-ini highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nn&quot;&gt;[tox]&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;envlist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;py27,py36&lt;/span&gt;
&lt;span class=&quot;nn&quot;&gt;[testenv]&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;deps&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;flask&lt;/span&gt;
     &lt;span class=&quot;err&quot;&gt;pytest&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;commands&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;pytest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;위와 같이, envlist에 파이썬 버전, deps에 의존성, commands에 테스트 명령을 적어준다. envlist에 기술한 파이썬 버전 2.7과 3.6은 시스템에 미리 설치해둬야 한다.&lt;/p&gt;

&lt;p&gt;작성이 완료됐으면 tox 명령으로 실행한다.&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;(dev_tox) $&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;tox
&lt;span class=&quot;go&quot;&gt;GLOB sdist-make: D:\Code\python_dev\dev_tox\flask\setup.py
py27 recreate: D:\Code\python_dev\dev_tox\flask\.tox\py27
py27 installdeps: flask, pytest
py27 inst: D:\Code\python_dev\dev_tox\flask\.tox\dist\hello_flask-0.1.zip
py27 installed: attrs==17.4.0,click==6.7,colorama==0.3.9,Flask==0.12.2,funcsigs==1.0.2,hello-flask==0.1,
itsdangerous==0.24,Jinja2==2.10,MarkupSafe==1.0,pluggy==0.6.0,py==1.5.2,pytest==3.3.2,six==1.11.0,Werkze
ug==0.14.1
py27 runtests: PYTHONHASHSEED=&apos;435&apos;
py27 runtests: commands[0] | pytest
============================= test session starts =============================
platform win32 -- Python 2.7.14, pytest-3.3.2, py-1.5.2, pluggy-0.6.0
rootdir: D:\Code\python_dev\dev_tox\flask, inifile:
collected 1 item

test_functional_01.py .                                                  [100%]

========================== 1 passed in 0.16 seconds ===========================
py36 recreate: D:\Code\python_dev\dev_tox\flask\.tox\py36
py36 installdeps: flask, pytest
py36 inst: D:\Code\python_dev\dev_tox\flask\.tox\dist\hello_flask-0.1.zip
py36 installed: attrs==17.4.0,click==6.7,colorama==0.3.9,Flask==0.12.2,hello-flask==0.1,itsdangerous==0.
24,Jinja2==2.10,MarkupSafe==1.0,pluggy==0.6.0,py==1.5.2,pytest==3.3.2,six==1.11.0,Werkzeug==0.14.1
py36 runtests: PYTHONHASHSEED=&apos;435&apos;
py36 runtests: commands[0] | pytest
============================= test session starts =============================
platform win32 -- Python 3.6.3, pytest-3.3.2, py-1.5.2, pluggy-0.6.0
rootdir: D:\Code\python_dev\dev_tox\flask, inifile:
collected 1 item

test_functional_01.py .                                                  [100%]

========================== 1 passed in 0.24 seconds ===========================
___________________________________ summary ___________________________________
  py27: commands succeeded
  py36: commands succeeded
  congratulations :)

D:\Code\python_dev\dev_tox\flask
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;(dev_tox) $&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;결과와 같이, 각 파이썬 버전 별 환경에 의존성을 설치하고 배포 파일을 생성한 다음, 테스트를 실행해준다.&lt;/p&gt;

&lt;h3 id=&quot;pytest-cov-pytest-flake8&quot;&gt;pytest-cov, pytest-flake8&lt;/h3&gt;
&lt;p&gt;이번에는 테스트에 pytest-cov, pytest-flake8도 추가해 보자.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;pytest-cov&lt;/strong&gt;: pytest의 coverage 플러그인. 코드 커버리지 검사.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;pytest-flake8&lt;/strong&gt;: pytest의 flake8 플러그인. 컨벤션이 PEP8을 준수하는지 검사.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;tox.ini의 의존성과 명령에 해당 도구를 추가한다.&lt;/p&gt;
&lt;div class=&quot;language-ini highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nn&quot;&gt;[tox]&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;envlist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;py27,py36&lt;/span&gt;
&lt;span class=&quot;nn&quot;&gt;[testenv]&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;deps&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;flask&lt;/span&gt;
    &lt;span class=&quot;err&quot;&gt;pytest&lt;/span&gt;
    &lt;span class=&quot;err&quot;&gt;pytest-cov&lt;/span&gt;
    &lt;span class=&quot;err&quot;&gt;pytest-flake8&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;commands&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;pytest -v --cov --flake8&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;커버리지 측정과 컨벤션 검사가 추가된 테스트 결과를 볼 수 있다.&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;(dev_tox) $&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;tox
&lt;span class=&quot;c&quot;&gt;...
&lt;/span&gt;&lt;span class=&quot;go&quot;&gt;hello_flask.py SKIPPED                                                   [ 25%]
setup.py SKIPPED                                                         [ 50%]
test_hello_flask.py PASSED                                               [ 75%]
test_hello_flask.py::TestApp::test_help PASSED                           [100%]

---------- coverage: platform win32, python 2.7.14-final-0 -----------
Name                  Stmts   Miss  Cover
-----------------------------------------
hello_flask.py            6      1    83%
test_hello_flask.py      15      3    80%
-----------------------------------------
TOTAL                    21      4    81%


===================== 2 passed, 2 skipped in 0.32 seconds =====================
&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;...
&lt;/span&gt;&lt;span class=&quot;go&quot;&gt;
hello_flask.py SKIPPED                                                   [ 25%]
setup.py SKIPPED                                                         [ 50%]
test_hello_flask.py SKIPPED                                              [ 75%]
test_hello_flask.py::TestApp::test_help PASSED                           [100%]

----------- coverage: platform win32, python 3.6.3-final-0 -----------
Name                  Stmts   Miss  Cover
-----------------------------------------
hello_flask.py            6      1    83%
test_hello_flask.py      15      2    87%
-----------------------------------------
TOTAL                    21      3    86%


===================== 1 passed, 3 skipped in 0.33 seconds =====================
___________________________________ summary ___________________________________
  py27: commands succeeded
  py36: commands succeeded
  congratulations :)

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;참고&lt;/strong&gt;&lt;br /&gt;
pytest-flake8은 디폴트 로그 레벨이 DEBUG라서 warning 하나만 발생해도 어마무시한 로그가 출력된다. 뭔가 이상하다 싶으면, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;flake8&lt;/code&gt; 명령만 실행해서 warning을 먼저 해결한 다음,pytest-flake8을 실행하는게 좋다. &lt;a href=&quot;https://github.com/tholo/pytest-flake8/pull/43/files&quot;&gt;디폴트 로그 레벨을 WARN으로 설정한 PR&lt;/a&gt;이 5일전에 올라왔으니 조만간 해결되지 싶다.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
				<pubDate>Thu, 18 Jan 2018 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2018/01/18/python_tox/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2018/01/18/python_tox/</guid>
			</item>
		
			<item>
				<title>(번역서)크로스 플랫폼 개발을 위한 C# 7과 닷넷 코어 2.0</title>
				        
        <description>&lt;p&gt;&lt;img src=&quot;/img/book_c7_netcore/cover.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;--책소개&quot;&gt;- 책소개&lt;/h4&gt;
&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;C# 7의 새로운 기능과 닷넷 코어의 전반적인 내용을 다룬다. 설명을 최소한으로 하고 예제를 따라 해보면서 빠르게 익힐 수 있도록 구성돼 있다. C#의 기본 문법부터 고급 기능, 닷넷 코어를 활용한 콘솔, 데이터베이스, 웹 프로그래밍까지의 과정을 비주얼 스튜디오 2017, 비주얼 스튜디오 코드를 모두 사용해가면서 배운다. 닷넷 코어와 C#을 처음 접하는 개발자를 비롯해, 닷넷 프레임워크에는 익숙하지만 닷넷 코어에 대해 더 알고 싶은 개발자들이 짧은 시간에 전체 구성을 이해하고 활용할 수 있게 도와 준다.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id=&quot;--에이콘출판사-2018년-1월-18일&quot;&gt;- 에이콘출판사, 2018년 1월 18일&lt;/h4&gt;

&lt;h4 id=&quot;--예제-코드-github-&quot;&gt;- &lt;a href=&quot;https://github.com/surinkim/cs7dotnetcore_kor&quot; target=&quot;_blank&quot;&gt;예제 코드 github &lt;/a&gt;&lt;/h4&gt;

&lt;h4 id=&quot;---구매--예스24--알라딘&quot;&gt;-  구매 : &lt;a href=&quot;http://www.yes24.com/24/goods/57905587&quot; target=&quot;_blank&quot;&gt;예스24 &lt;/a&gt;, &lt;a href=&quot;http://www.aladin.co.kr/shop/wproduct.aspx?ItemId=128563714&quot; target=&quot;_blank&quot;&gt;알라딘&lt;/a&gt;&lt;/h4&gt;

&lt;h4 id=&quot;--책-내용-중-잘못됐거나-궁금한-점-있으면-아래에-남겨주세요-nnhopehotmail로-보내주셔도-됩니다&quot;&gt;- 책 내용 중, 잘못됐거나 궁금한 점 있으면 아래에 남겨주세요. nnhope@hotmail로 보내주셔도 됩니다.&lt;/h4&gt;

</description>
				<pubDate>Thu, 18 Jan 2018 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/books/2018/01/18/book_999_c7_netcore/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/books/2018/01/18/book_999_c7_netcore/</guid>
			</item>
		
			<item>
				<title>플라스크 abort 변경 내용</title>
				        
        <description>&lt;p&gt;Flask 0.12 이전에는 flask.abort.mapping 딕셔너리를 사용할 수 있었다.&lt;/p&gt;

&lt;p&gt;사실 &lt;strong&gt;abort&lt;/strong&gt;는 werkzeug의 Aborter 클래스 인스턴스다. 그런데, werkzeug 0.12에 abort()함수가 추가되면서, Aborter 클래스의 인스턴스 이름이 &lt;strong&gt;_aborter&lt;/strong&gt;가 돼버렸다..(&lt;a href=&quot;https://github.com/pallets/werkzeug/commit/9ab649fdc225037162a9d29be08648249c4588ab#diff-43a63db82587e91732eda181306d76c7&quot; target=&quot;_blank&quot;&gt;compare 링크 &lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;또, 새로 추가된 abort() 함수는 고정 인수로 status를 사용한다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;abort&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;kwargs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;그래서, 아래처럼 사용한 기존 코드도 수정이 필요한데, 이미 문서에서 status를 사용하는 것으로 명시한 상황이라 어쩔 수 없었던 것 같다.(&lt;a href=&quot;https://github.com/pallets/werkzeug/pull/1003/files#diff-43a63db82587e91732eda181306d76c7R668&quot; target=&quot;_blank&quot;&gt;merge 링크 &lt;/a&gt;)&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;abort&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;code&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;400&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Invalid destination name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;어쨌든, description을 얻거나 custom 핸들러 등을 등록하기 위해 &lt;strong&gt;mapping&lt;/strong&gt; 딕셔너리가 필요하다면 이제 &lt;strong&gt;_aborter&lt;/strong&gt;를 써야 한다.&lt;/p&gt;

&lt;p&gt;다음은 /api 엔드 포인트를 호출하면 고의로 TypeError를 발생시키고, 커스텀 핸들러에서 500 에러를 json 형식으로 반환한다.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/surinkim/b9ffb01a395405ea601cc927085d7e4c.js&quot;&gt;&lt;/script&gt;

</description>
				<pubDate>Sat, 13 Jan 2018 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2018/01/13/flask_abort/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2018/01/13/flask_abort/</guid>
			</item>
		
			<item>
				<title>윈도우에 MinGW 64bit/Code::Blocks 설치</title>
				        
        <description>&lt;h2 id=&quot;mingw-64bit-설치&quot;&gt;MinGW 64bit 설치&lt;/h2&gt;

&lt;p&gt;1.&lt;a href=&quot;https://sourceforge.net/projects/mingw-w64/?source=typ_redirect&quot;&gt;MinGW 64bit 셋업 파일&lt;/a&gt;을 다운로드하고 설치를 시작합니다.&lt;/p&gt;

&lt;p&gt;2.아래 그림처럼 Architecture 항목을 &lt;strong&gt;x86_64&lt;/strong&gt;로 설정합니다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://surinkim.github.io/img/2017_10_16/MinGW_1.jpg&quot; alt=&quot;MinGW64_1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;3.나머지는 그대로 두고 Next를 눌러 설치를 완료합니다.&lt;/p&gt;

&lt;h2 id=&quot;codeblocks-설치&quot;&gt;Code::Blocks 설치&lt;/h2&gt;

&lt;p&gt;1.&lt;a href=&quot;http://www.codeblocks.org/downloads/26&quot;&gt;Code::Blocks 다운로드 페이지&lt;/a&gt;에서 셋업 파일을 다운로드 합니다.&lt;/p&gt;

&lt;p&gt;–  위에서 MinGW 64bit 버전을 설치했으므로 Code::Blocks만 설치하는 &lt;strong&gt;codeblocks-16.01-setup.exe&lt;/strong&gt;를 다운로드 합니다.&lt;/p&gt;

&lt;p&gt;–  이 글을 쓰는 현재 Code::Blocks의 최신 버전은 16.01입니다.&lt;/p&gt;

&lt;p&gt;2.기본 설정을 그대로 두고 설치를 완료합니다.&lt;/p&gt;

&lt;p&gt;3.설치가 완료되면  Code::Blocks를 실행하고 Settings -&amp;gt; Compiler -&amp;gt; Toolchain executables를 차례로 클릭합니다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://surinkim.github.io/img/2017_10_16/codeblocks_1.jpg&quot; alt=&quot;CodeBlocks 1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://surinkim.github.io/img/2017_10_16/codeblocks_2.jpg&quot; alt=&quot;CodeBlocks 2&quot; /&gt;&lt;/p&gt;

&lt;p&gt;4.아래 그림처럼 컴파일러를 설정합니다. 컴파일러 설치 디렉토리 경로에 bin 폴더가 들어가지 않도록 주의하세요.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ex)C:\Program Files\mingw-w64\x86_64-7.1.0-posix-seh-rt_v5-rev2\mingw64\
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;https://surinkim.github.io/img/2017_10_16/codeblocks_3.jpg&quot; alt=&quot;CodeBlocks 3&quot; /&gt;&lt;/p&gt;
</description>
				<pubDate>Mon, 16 Oct 2017 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2017/10/16/how_win_codeblocks_install/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2017/10/16/how_win_codeblocks_install/</guid>
			</item>
		
			<item>
				<title>도커 요약</title>
				        
        <description>&lt;h2 id=&quot;docker-basic&quot;&gt;docker basic&lt;/h2&gt;

&lt;p&gt;docker search&lt;/p&gt;

&lt;p&gt;docker pull&lt;/p&gt;

&lt;p&gt;docker run&lt;/p&gt;

&lt;p&gt;https://asciinema.org/a/8541tbmjqi69fe6ssw8oqpr67&lt;/p&gt;

&lt;h2 id=&quot;machine--compose--swarm&quot;&gt;machine / compose / swarm&lt;/h2&gt;

&lt;p&gt;https://blog.codeship.com/docker-machine-compose-and-swarm-how-they-work-together/&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;docker machine&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;https://docs.docker.com/machine/overview/#/whats-the-difference-between-docker-engine-and-docker-machine&lt;/p&gt;

&lt;p&gt;https://docs.docker.com/machine/drivers/&lt;/p&gt;

&lt;p&gt;https://docs.docker.com/machine/concepts/&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;docker compose&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;swarm&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finally, let’s look at the most interesting tool in the current Docker Toolbox, Docker Swarm. What you’ve done so far is work with one container host and run a container or two, which is great for testing or local development. With Docker Swarm we’re now going to turn that small test environment into a larger setup of clustered container hosts that can be used to scale your operations into something even more useful.&lt;/p&gt;

&lt;p&gt;https://platform9.com/blog/compare-kubernetes-vs-docker-swarm/&lt;/p&gt;

&lt;p&gt;http://www.slideshare.net/GuillermoLucero/docker-machine-docker-swarm&lt;/p&gt;

&lt;p&gt;https://blog.abevoelker.com/why-i-dont-use-docker-much-anymore/&lt;/p&gt;

&lt;h2 id=&quot;volume&quot;&gt;volume&lt;/h2&gt;

&lt;p&gt;ref 1 : http://container-solutions.com/understanding-volumes-docker/&lt;/p&gt;

&lt;p&gt;ref 2 : http://pepa.holla.cz/wp-content/uploads/2016/10/Docker-in-Action.pdf&lt;/p&gt;

&lt;h3 id=&quot;-union-file-system&quot;&gt;* union file system&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;/img/2017_03_30/docker1.png&quot; alt=&quot;image_layers-1-300x295.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docker images are stored as series of read-only layers. When we start a container, Docker takes the read-only image and adds a read-write layer on top. If the running container modifies an existing file, the file is copied out of the underlying read-only layer and into the top-most read-write layer where the changes are applied.&lt;/strong&gt; The version in the read-write layer hides the underlying file, but does not destroy it — it still exists in the underlying layer. When a Docker container is deleted, relaunching the image will start a fresh container without any of the changes made in the previously running container — those changes are lost. &lt;strong&gt;Docker calls this combination of read-only layers with a read-write layer on top a Union File System.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/2017_03_30/docker2.jpg&quot; alt=&quot;04fig01_alt.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In order to be able to save (persist) data and also to share data between containers, &lt;strong&gt;Docker came up with the concept of volumes. Quite simply, volumes are directories (or files) that are outside of the default Union File System&lt;/strong&gt; and exist as normal directories and files on the host filesystem.&lt;/p&gt;

&lt;h3 id=&quot;-volume-type&quot;&gt;* volume type&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/img/2017_03_30/docker3.jpg&quot; alt=&quot;04fig03_alt.jpg&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Docker-managed volume&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker run &lt;span class=&quot;nt&quot;&gt;-it&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt; vol-test &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; /data centos /bin/bash

docker inspect &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt; vol-test | jq &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;Bind mount volume&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker run &lt;span class=&quot;nt&quot;&gt;-it&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt; vol-test &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; /src/sample:/data centos /bin/bash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Mounting a host directory can be useful for testing. For example, you can mount source code inside a container. Then, change the source code and see its effect on the application in real time.&lt;/p&gt;

&lt;h3 id=&quot;-sharing-volume&quot;&gt;* Sharing Volume&lt;/h3&gt;

&lt;p&gt;https://docs.docker.com/compose/wordpress/&lt;/p&gt;

&lt;p&gt;https://docs.docker.com/compose/compose-file/#volume-configuration-reference&lt;/p&gt;

&lt;h2 id=&quot;docker-registry&quot;&gt;Docker registry&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;docker image 저장 서버 : 서버에 저장하거나 s3에 저장&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;docker registry도 하나의 docker image이고 docker hub에 공개되어 있음.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker tag&lt;/code&gt; 명령으로 태그 먼저 생성 후, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker push&lt;/code&gt;로 registry 서버에 업로드.&lt;/p&gt;
    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker tag hello:0.1 localhost:5000/hello:0.1
docker push localhost:5000/hello:0.1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/img/2017_03_30/docker4.png&quot; alt=&quot;docker-stages.png&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;docker-usecase&quot;&gt;Docker usecase&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;image included source = docker managed volume&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;#!Dockerfile

# Base this docker container off the official golang docker image.
# Docker containers inherit everything from their base.
FROM golang:1.6.2

# Create a directory inside the container to store all our application and then make it the working directory.
RUN mkdir -p /src/
RUN cd /go/src/ &amp;amp;&amp;amp; git clone https://github.com/surinkim/gosample.git
WORKDIR /go/src/gosample

# Copy the example-app directory (where the Dockerfile lives) into the container.
#COPY . /go/src/example-app

# Download and install any required third party dependencies into the container.
RUN go get github.com/codegangsta/gin
RUN go-wrapper download
RUN go-wrapper install


# Set the PORT environment variable inside the container
ENV PORT 8080

# Expose port 8080 to the host so we can access our application
EXPOSE 3000

# Now tell Docker what command to run when the container starts
CMD gin run
#CMD /bin/bash

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;image excluded source = host bind volume&lt;/li&gt;
&lt;/ul&gt;
</description>
				<pubDate>Thu, 30 Mar 2017 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2017/03/30/docker_summary/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2017/03/30/docker_summary/</guid>
			</item>
		
			<item>
				<title>ELK 요약</title>
				        
        <description>&lt;h1 id=&quot;1-elk-summary&quot;&gt;1. ELK summary&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;What&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/img/2017_03_01/ELK1.png&quot; alt=&quot;Will-Migrating-to-the-Cloud-Save-Money-5.png&quot; /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;The ELK Stack is “made up for it”, ie specialized. Our role becomes customize: &lt;strong&gt;Collect the data in the best way&lt;/strong&gt;, &lt;strong&gt;automate demand&lt;/strong&gt; (or do batch collection) and &lt;strong&gt;creating good reports&lt;/strong&gt; for presentation of results or evidence to meet our need.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img src=&quot;/img/2017_03_01/ELK2.png&quot; alt=&quot;General-ELK-Stack.png&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;2-logstash&quot;&gt;2. Logstash&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;/img/2017_03_01/ELK3.png&quot; alt=&quot;스크린샷_2015-09-26_오후_9.31.47.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;https://www.elastic.co/kr/products/logstash&lt;/p&gt;

&lt;h2 id=&quot;logstash-democonsole-inputoutput-grok-filter&quot;&gt;logstash demo(console input/output, grok filter)&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;기본 예제&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code class=&quot;language-logstash&quot;&gt;## 아래 콘솔 입력을 필터링해서 콘솔로 출력할 때의 예제
## 2016-12-19 00:00:05.908 [error] &amp;lt;127.0.0.1&amp;gt; sample data

input {
  
    stdin {}

}

filter {

    grok {
        match =&amp;gt; { &quot;message&quot; =&amp;gt; &quot;%{TIMESTAMP_ISO8601:time} \[%{LOGLEVEL:level}\] \&amp;lt;%{IP:ip}\&amp;gt; %{GREEDYDATA:contents}&quot; }
    }
}

output {

    stdout { codec =&amp;gt; rubydebug }

}

&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;다른 예제&lt;/li&gt;
&lt;/ul&gt;

&lt;script src=&quot;https://gist.github.com/surinkim/afea0d01e7583a5229c45bb73d62e163.js&quot;&gt;&lt;/script&gt;

&lt;ul&gt;
  &lt;li&gt;Demo : https://asciinema.org/a/4ubbukjn4x5qpu44t7zhg1s7j&lt;/li&gt;
  &lt;li&gt;Grok Debugger : https://grokdebug.herokuapp.com/&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;3-beats&quot;&gt;3. Beats&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;https://github.com/elastic/beats&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.elastic.co/guide/en/beats/filebeat/1.1/diff-logstash-beats.html&quot;&gt;What is the difference between Logstash and Beats?&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Demo (FileBeat, HttpBeat)&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;4-elasticsearch&quot;&gt;4. Elasticsearch&lt;/h1&gt;
&lt;p&gt;https://www.elastic.co/kr/products/elasticsearch&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;SQL plugin&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;https://github.com/NLPchina/elasticsearch-sql&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;shard &amp;amp; replica&lt;/p&gt;

    &lt;p&gt;http://guruble.com/?p=85&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;5-kibana&quot;&gt;5. Kibana&lt;/h1&gt;
&lt;p&gt;https://www.elastic.co/kr/products/kibana&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Demo : http://demo.elastic.co/beats/app/kibana&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;6-demo&quot;&gt;6. Demo&lt;/h1&gt;
</description>
				<pubDate>Wed, 01 Mar 2017 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2017/03/01/ELK_summary/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2017/03/01/ELK_summary/</guid>
			</item>
		
			<item>
				<title>github에서 repository fork후, 업데이트</title>
				        
        <description>&lt;p&gt;fork 저장소가 아닌 원래의 프로젝트 저장소를 upstream으로 등록.&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git remote add &lt;span class=&quot;nt&quot;&gt;--track&lt;/span&gt; master upstream git://&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;git_repository_url&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;원래의 프로젝트 저장소로부터 최신 내용을 받음.&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git fetch upstream
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;master 브랜치&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git checkout master
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Rebase&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git rebase upstream/master
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;fork 저장소에 push&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git push origin master
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

</description>
				<pubDate>Fri, 22 Jul 2016 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2016/07/22/update_fork/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2016/07/22/update_fork/</guid>
			</item>
		
			<item>
				<title>QT 5.5 static source build</title>
				        
        <description>&lt;h2 id=&quot;qt-55-소스-빌드-옵션&quot;&gt;QT 5.5 소스 빌드 옵션&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;default OpenGL
    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;configure &lt;span class=&quot;nt&quot;&gt;-release&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-static&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtxmlpatterns &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtdeclarative &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtquickcontrols &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtmultimedia &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtactiveqt &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtlocation &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtsensors &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtconnectivity &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtwebkit &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtwebkit-examples &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtimageformats &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtgraphicaleffects &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtscript &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtquick1 &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtserialport &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtenginio &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtwebsockets &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtwebchannel &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtwebengine &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtdoc &lt;span class=&quot;nt&quot;&gt;-qt-sql-sqlite&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-qt-zlib&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-qt-libpng&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-qt-libjpeg&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-openssl&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-I&lt;/span&gt; D:/dev/int/src/messenger/mumble/00_src/OpenSSL/include &lt;span class=&quot;nt&quot;&gt;-L&lt;/span&gt; D:/dev/int/src/messenger/mumble/00_src/OpenSSL/lib &lt;span class=&quot;nt&quot;&gt;-platform&lt;/span&gt; win32-msvc2010 &lt;span class=&quot;nt&quot;&gt;-no-dbus&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-nomake&lt;/span&gt; examples &lt;span class=&quot;nt&quot;&gt;-nomake&lt;/span&gt; tests &lt;span class=&quot;nt&quot;&gt;-ltcg&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-mp&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-opensource&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-confirm-license&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;without OpenGL
    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;configure &lt;span class=&quot;nt&quot;&gt;-release&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-static&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtxmlpatterns &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtdeclarative &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtquickcontrols &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtmultimedia &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtactiveqt &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtlocation &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtsensors &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtconnectivity &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtwebkit &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtwebkit-examples &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtimageformats &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtgraphicaleffects &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtscript &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtquick1 &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtserialport &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtenginio &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtwebsockets &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtwebchannel &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtwebengine &lt;span class=&quot;nt&quot;&gt;-skip&lt;/span&gt; qtdoc &lt;span class=&quot;nt&quot;&gt;-qt-sql-sqlite&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-qt-zlib&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-qt-libpng&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-qt-libjpeg&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-openssl&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-I&lt;/span&gt; D:/dev/int/src/messenger/mumble/00_src/OpenSSL/include &lt;span class=&quot;nt&quot;&gt;-L&lt;/span&gt; D:/dev/int/src/messenger/mumble/00_src/OpenSSL/lib &lt;span class=&quot;nt&quot;&gt;-platform&lt;/span&gt; win32-msvc2010 &lt;span class=&quot;nt&quot;&gt;-no-opengl&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-no-angle&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-no-dbus&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-nomake&lt;/span&gt; examples &lt;span class=&quot;nt&quot;&gt;-nomake&lt;/span&gt; tests &lt;span class=&quot;nt&quot;&gt;-ltcg&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-mp&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-opensource&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-confirm-license&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;Ref: &lt;a href=&quot;http://doc.qt.io/qt-5/windows-requirements.html&quot;&gt;Qt for Windows - Requirements&lt;/a&gt;, &lt;a href=&quot;http://stackoverflow.com/questions/27759754/qt-5-4-static-build-produces-unresolved-external-symbol-link-error-in-visual-s&quot;&gt;StackoverFlow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
				<pubDate>Sat, 02 Apr 2016 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2016/04/02/qt5_build_option/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2016/04/02/qt5_build_option/</guid>
			</item>
		
			<item>
				<title>CSnapDialog</title>
				        
        <description>&lt;p&gt;A simple template class which implements &lt;strong&gt;snap-to-edge&lt;/strong&gt; functionality for some &lt;strong&gt;QWidgets&lt;/strong&gt;.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/surinkim/7d01fe3260ae221dc887.js&quot;&gt;&lt;/script&gt;

</description>
				<pubDate>Sun, 02 Aug 2015 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2015/08/02/snap_dialog/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2015/08/02/snap_dialog/</guid>
			</item>
		
			<item>
				<title>Random in C++ 11</title>
				        
        <description>&lt;p&gt;random값을 뽑을 때, 기존 c 런타임의 srand()와 rand()를 이용했는데 c++ 11에서는 아래처럼 사용할 수 있다.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-c--&quot; data-lang=&quot;c++&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c1&quot;&gt;//c runtime&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;srand&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rand&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
 
&lt;span class=&quot;c1&quot;&gt;//c++ 11&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;default_random_engine&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;//or&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;default_random_engine&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random_device&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{}());&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;srand()는 인자로 받아온 seed값으로 의사 난수(pseudo random number)기를 초기화 한다. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;std::default_random_engine&lt;/code&gt;은 의사 난수를 생성하는 클래스다.&lt;/p&gt;

&lt;p&gt;위 둘은 난수 발생기의 위치가 어디에 있느냐에 그 차이가 있다.&lt;br /&gt;
rand()는 내부에 의사 난수기의 상태를 static data로 가지고 있기 때문에 멀티 스레드에 안전하도록 내부적인 장치가 있다.&lt;br /&gt;
이에 반해, default_random_engine은 우리가 직접 다룰 수 있다. 스택에 생성했다면 동기화 처리도 필요없다. 그래서 동기화할 필요가 없는 상황이라면 default_random_engine이 rand()보다 더 빠르다고 한다.&lt;/p&gt;

&lt;p&gt;게임에서 특정 정보 등을 랜덤하게 가져와 사용한다고 하면, 아래처럼 쓸 수 있겠다.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-c--&quot; data-lang=&quot;c++&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;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
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SkillInfo&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;id_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
 
&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;vector&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SkillInfo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;skill_Info&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; 
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3001&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;섬멸&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3013&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;중독&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3018&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;소환&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3035&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;투명&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3073&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;질주&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
 
    &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;default_random_engine&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;engine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random_device&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{}());&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;auto&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GetRanomSkillInfo&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shuffle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;skill_Info&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;skill_Info&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;engine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
 
    &lt;span class=&quot;k&quot;&gt;auto&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PrintSkillInfo&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;skill_Info&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;for_each&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;skill_Info&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;skill_Info&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SkillInfo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;id = &quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id_&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;, name = &quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name_&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;endl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
 
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;==========&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;endl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;GetRanomSkillInfo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;PrintSkillInfo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
     
    &lt;span class=&quot;n&quot;&gt;getchar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
 
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;아래 링크에, C++ 11에서 random number 사용에 관한 12 page짜리(!) guide 문서가 있다.&lt;br /&gt;
&lt;a href=&quot;http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3551.pdf&quot;&gt;Random Number Generation in C++ 11&lt;/a&gt;&lt;/p&gt;
</description>
				<pubDate>Wed, 03 Dec 2014 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2014/12/03/random_in_c++11/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2014/12/03/random_in_c++11/</guid>
			</item>
		
			<item>
				<title>std::tuple</title>
				        
        <description>&lt;p&gt;c++11에 포함된 std::tuple은 개념상으로는 POD(Plain old data) 를 가지는 struct와 유사하지만, struct가 이름으로 멤버에 접근하는 대신 tuple의 멤버들은 tuple내의 순서로 접근한다.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-c--&quot; data-lang=&quot;c++&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c1&quot;&gt;//struct exmaple&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ExampleST&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;id_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;string&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;name_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
 
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;example_st&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;john&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
 
&lt;span class=&quot;n&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;id = &quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;example_st&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id_&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;endl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;name = &quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;example_st&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name_&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;endl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
 
&lt;span class=&quot;c1&quot;&gt;//tuple example&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;enum&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;NAME&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tuple&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;example_tu&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;suzi&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;id = &quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;example_tu&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;endl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;name = &quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;example_tu&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;endl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;std::tie는 tuple object를 unpacking 할 때 사용된다. 그러니까 tie의 인자로 받는 변수에 tuple 오브젝트 내의 데이터를 순서대로 ‘묶어준다.’ 이때, tuple내의 특정 데이터를 묶을 필요가 없다면 std::ignore 상수를 사용한다.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-c--&quot; data-lang=&quot;c++&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tie&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ignore&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;example_tu&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;tied id = &quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;endl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;std::tie를 쓰면 아래처럼 swap처리를 간단히 할 수 있다.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-c--&quot; data-lang=&quot;c++&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c1&quot;&gt;//보통의 swap 처리&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;z&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;temp&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;z&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;temp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
 
&lt;span class=&quot;c1&quot;&gt;//std::tie를 사용한 swap 처리&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;z&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tie&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;make_tuple&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;그리고, sort의 기준이 여러 개일때, tuple의 진가가 발휘된다. 아래와 같은 배열을 정렬하는데, 첫번째 값이 동일하면 두번째 값을, 두번째 값이 동일하면 세번째 값을 비교하는 식으로 정렬한다고 해보자. 보통은 operator &amp;gt;나 operater &amp;lt;를 정의하고, 내부에서는 if else를 써야 할 것이다. 아래 코드는 이것을 간결하게 처리한다.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-c--&quot; data-lang=&quot;c++&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;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
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ArrayNums&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array_nums&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1001&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2002&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3003&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1001&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2001&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3001&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1001&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2002&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3002&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
 
&lt;span class=&quot;n&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&amp;lt;before sorting&amp;gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;endl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;for_each&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array_nums&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array_nums&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ArrayNums&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;, &quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;, &quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;endl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
 
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
 
&lt;span class=&quot;c1&quot;&gt;//오름차순 sorting에 사용할 lambda func&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;auto&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;array_less&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[](&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ArrayNums&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ArrayNums&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tie&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tie&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]));&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
 
&lt;span class=&quot;c1&quot;&gt;//sorting&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sort&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array_nums&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array_nums&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;array_less&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
 
&lt;span class=&quot;n&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;endl&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&amp;lt;after sorting&amp;gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;endl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;for_each&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array_nums&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array_nums&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ArrayNums&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;cout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;, &quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;, &quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;endl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
 
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

</description>
				<pubDate>Sun, 21 Sep 2014 00:00:00 +0000</pubDate>
				<link>https://corecode.pe.kr/normal/2014/09/21/std_tuple_usage/</link>
				<guid isPermaLink="true">https://corecode.pe.kr/normal/2014/09/21/std_tuple_usage/</guid>
			</item>
		
	</channel>
</rss>