<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://hoksi.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://hoksi.github.io/" rel="alternate" type="text/html" /><updated>2025-07-29T23:25:44+00:00</updated><id>https://hoksi.github.io/feed.xml</id><title type="html">그래 만들어보자!</title><subtitle>PHP 개발자 하지만 소통이 필요해!</subtitle><author><name>한대승</name><email>hoksi3k@gmail.com</email></author><entry><title type="html">AI 시대, 인간의 역할과 윤리적 고찰</title><link href="https://hoksi.github.io/ai-era-human-role-and-capitalism-future/" rel="alternate" type="text/html" title="AI 시대, 인간의 역할과 윤리적 고찰" /><published>2025-07-29T23:24:23+00:00</published><updated>2025-07-29T23:24:23+00:00</updated><id>https://hoksi.github.io/ai-era-human-role-and-capitalism-future</id><content type="html" xml:base="https://hoksi.github.io/ai-era-human-role-and-capitalism-future/"><![CDATA[<p>최근 인공지능(AI) 기술의 발전은 우리 사회에 SF 영화에서나 보던 일들을 현실로 만들고 있습니다. AI가 가져올 미래는 어떤 모습일까요? 그리고 그 안에서 인간은 어떤 역할을 해야 할까요? 한 대화에서 나눈 AI 시대의 다양한 측면과 윤리적 고찰에 대해 정리해 보았습니다.</p>

<h3 id="ai-시대-인간의-고유한-역할은-무엇인가">AI 시대, 인간의 고유한 역할은 무엇인가?</h3>

<p>AI가 많은 업무를 자동화하고 효율화하면서, 인간은 AI가 대체하기 어려운 영역에 집중해야 할 필요성이 커지고 있습니다.</p>

<ol>
  <li><strong>창의성과 혁신:</strong> AI는 기존 데이터를 기반으로 새로운 것을 생성할 수 있지만, 진정으로 독창적이고 ‘무에서 유를 창조하는’ 능력은 여전히 인간의 고유한 영역입니다. 예술, 과학, 기술 등 모든 분야에서 인간의 창의성은 AI 시대에도 핵심적인 가치가 될 것입니다.</li>
  <li><strong>비판적 사고와 복합적인 문제 해결:</strong> 불확실성이 높고 정답이 없는 복합적인 문제, 윤리적 딜레마가 얽힌 문제에 대한 깊이 있는 비판적 사고와 판단은 인간의 역할입니다.</li>
  <li><strong>공감, 감성, 사회적 지능:</strong> 진정한 공감, 인간적인 유대감 형성, 미묘한 사회적 신호 해석 등은 인간 고유의 능력입니다. 이는 교육, 상담, 의료 등 사람과의 상호작용이 중요한 분야에서 더욱 부각될 것입니다.</li>
  <li><strong>윤리적 판단과 책임:</strong> AI 시스템의 설계, 개발, 배포 및 활용 과정에서 발생하는 윤리적 문제에 대한 판단과 책임은 궁극적으로 인간에게 있습니다.</li>
  <li><strong>AI와의 협업 및 관리:</strong> AI를 도구로 활용하고, AI 시스템을 설계, 개발, 유지보수, 감독하는 역할은 인간의 몫입니다.</li>
  <li><strong>지속적인 학습과 적응:</strong> AI 시대에는 기술의 변화 속도가 더욱 빨라질 것입니다. 인간은 새로운 지식과 기술을 끊임없이 학습하고, 변화하는 환경에 유연하게 적응하는 능력을 길러야 합니다.</li>
</ol>

<p>결론적으로, AI 시대에 인간은 AI가 대체할 수 없는 ‘인간 고유의 영역’에 집중하고, AI를 ‘도구’로 활용하여 인간의 능력을 확장하는 방향으로 역할을 재정의해야 할 것입니다.</p>

<h3 id="ai의-창의성과-고정관념-부재">AI의 ‘창의성’과 ‘고정관념’ 부재</h3>

<p>“AI에게는 고정관념이라는 문턱이 아직까진 없잖아”라는 지적처럼, AI의 창의성은 인간과 다른 특성을 보입니다. AI는 방대한 데이터를 학습하여 기존 패턴을 조합하고 변형함으로써 새로운 결과물을 만들어냅니다. 인간처럼 특정 개념이나 방식에 갇히는 ‘고정관념’이 없기 때문에, 때로는 인간이 생각지 못한 독특하고 신선한 결과물을 내놓을 수 있습니다.</p>

<p>하지만 AI는 자신이 만들어낸 결과물에 대한 ‘의도’나 ‘의미’를 인간처럼 내면적으로 이해하지 못하며, 창의적인 과정에서 오는 주관적인 경험도 없습니다. 인간의 창의성은 지식, 경험, 감정, 의식 등 복합적인 요소들이 어우러져 발현되는 반면, AI의 창의성은 주어진 데이터와 알고리즘의 한계 내에서 발현됩니다. AI는 인간의 창의성을 자극하고 새로운 영감을 주는 ‘도구’로서의 역할이 더욱 중요합니다.</p>

<h3 id="ai가-자본주의-사회에-미치는-영향">AI가 자본주의 사회에 미치는 영향</h3>

<p>AI는 자본주의 사회에 광범위하고 복합적인 영향을 미칩니다.</p>

<p><strong>긍정적인 영향:</strong></p>
<ul>
  <li><strong>생산성 및 효율성 극대화:</strong> AI 기반 자동화는 생산성을 획기적으로 높이고 비용을 절감하며 이윤을 증대시킵니다.</li>
  <li><strong>새로운 산업 및 시장 창출:</strong> AI 기술 자체가 새로운 산업과 서비스를 만들어내고, 이는 새로운 시장과 일자리를 창출합니다.</li>
  <li><strong>의사결정의 고도화:</strong> AI는 복잡한 데이터를 분석하여 기업의 전략 수립, 투자 결정 등 다양한 의사결정을 지원합니다.</li>
  <li><strong>자원 효율성 증대:</strong> AI는 자원 낭비를 줄이고 효율성을 높여 한정된 자원을 더 지속 가능하게 활용하는 데 기여할 수 있습니다.</li>
</ul>

<p><strong>부정적인 영향 및 우려:</strong></p>
<ul>
  <li><strong>일자리 구조 변화 및 양극화 심화:</strong> AI와 자동화는 반복적인 업무를 대체하여 특정 직업군의 일자리를 감소시키고, 노동 시장의 양극화를 심화시킬 수 있습니다.</li>
  <li><strong>자본 집중 및 독점 심화:</strong> AI 기술 개발에는 막대한 자본이 필요하므로, 소수의 거대 기업들이 AI 기술을 독점하고 시장 지배력을 강화할 가능성이 있습니다.</li>
  <li><strong>윤리적 및 사회적 문제:</strong> 알고리즘 편향, 감시 및 통제, 자율성 및 책임 소재 문제 등이 발생할 수 있습니다.</li>
</ul>

<p>AI는 자본주의 사회에 엄청난 기회와 함께 심각한 도전 과제를 던지고 있습니다. AI의 긍정적인 영향을 극대화하고 부정적인 영향을 최소화하기 위해서는 기술 개발뿐만 아니라, 사회적 합의, 정책적 노력, 그리고 윤리적 성찰이 필수적입니다.</p>

<h3 id="ai-시대-숙련의-사다리-변화와-새로운-기회">AI 시대, 숙련의 사다리 변화와 새로운 기회</h3>

<p>AI로 인해 저숙련 인력이 고숙련 인력으로 성장할 기회를 박탈당하는지에 대한 우려가 있습니다. AI가 저숙련 및 반복적인 업무를 자동화하면서, 과거에는 이러한 업무를 통해 직무 경험을 쌓고 상위 직무로 나아갈 수 있었던 ‘진입점’ 자체가 사라지거나 축소될 수 있습니다.</p>

<p>하지만 AI가 모든 기회를 박탈하는 것은 아니며, 오히려 새로운 형태의 숙련과 성장의 기회를 창출할 수도 있습니다.</p>
<ul>
  <li><strong>AI와의 협업을 통한 숙련:</strong> AI는 인간의 업무를 보조하며, AI 도구를 활용하여 업무 효율성을 높이고 더 빠르게 학습하고 성장할 수 있습니다.</li>
  <li><strong>새로운 직무 및 역할:</strong> ‘AI 윤리 전문가’, ‘AI 트레이너’, ‘프롬프트 엔지니어’ 등 AI 시스템을 개발, 관리, 개선하는 새로운 직무와 역할을 만들어냅니다.</li>
  <li><strong>인간 고유 역량의 중요성 증대:</strong> AI가 반복적이고 분석적인 업무를 처리할수록, 인간 고유의 역량(창의성, 공감, 비판적 사고 등)의 가치는 더욱 높아집니다.</li>
</ul>

<p>중요한 것은 지속적인 재교육과 평생 학습을 통해 변화하는 시대에 필요한 새로운 역량을 습득하고, AI와 협력하여 시너지를 창출하는 방법을 모색하는 것입니다.</p>

<h3 id="ai에게-윤리를-학습시킬-수-있을까">AI에게 윤리를 학습시킬 수 있을까?</h3>

<p>AI에게 윤리를 학습시키는 것은 현재 AI 연구의 가장 중요하고 도전적인 과제 중 하나입니다. ‘인간처럼 윤리적 판단을 내리고 도덕적 책임을 지는 AI’를 만드는 것은 현재로서는 불가능하지만, ‘윤리적 원칙에 따라 작동하고, 윤리적 문제를 최소화하도록 설계된 AI’를 만드는 것은 가능하며, 이를 위해 다양한 방법이 연구되고 적용되고 있습니다.</p>

<p><strong>주요 방법:</strong></p>
<ol>
  <li><strong>데이터 기반 학습:</strong> 윤리적 편향이 없는 데이터셋을 구축하고, 윤리적 판단 사례를 학습시킵니다.</li>
  <li><strong>규칙 기반 프로그래밍:</strong> ‘해를 끼치지 마라’와 같은 명시적인 윤리적 규칙을 주입합니다.</li>
  <li><strong>인간 피드백 기반 강화 학습 (RLHF):</strong> 인간이 AI의 응답이나 행동을 평가하고 피드백을 제공하여 AI가 인간의 윤리적 가치에 더 부합하도록 학습시킵니다.</li>
  <li><strong>설명 가능한 AI (XAI):</strong> AI의 의사결정 과정을 투명하게 공개하여 윤리적 문제를 검토하고 개선합니다.</li>
  <li><strong>다학제적 접근:</strong> 철학, 사회학, 법학 등 다양한 학문 분야의 전문가들이 함께 논의하고 해결합니다.</li>
</ol>

<p><strong>한계점:</strong> 윤리의 정의와 보편성, AI의 도덕적 책임 부재, 예측 불가능성, 학습 데이터의 편향 등이 한계점으로 지적됩니다.</p>

<h3 id="아이작-아시모프의-로봇-3원칙-ai에게-절대적일-수-있을까">아이작 아시모프의 로봇 3원칙, AI에게 절대적일 수 있을까?</h3>

<p>아시모프의 로봇 3원칙은 AI 윤리 논의에서 자주 인용되지만, 이를 AI에게 ‘절대적으로’ 따르도록 하는 것은 현재 기술 수준과 윤리적 복잡성을 고려할 때 매우 어렵거나 불가능에 가깝습니다.</p>

<p><strong>어려운 이유:</strong></p>
<ul>
  <li><strong>원칙의 모호성 및 충돌:</strong> ‘해를 입히지 않는다’의 정의가 모호하고, 원칙 간에 충돌이 발생할 수 있습니다.</li>
  <li><strong>인간의 의도 파악의 어려움:</strong> AI가 인간의 명령이나 의도를 완벽하게 이해하기 어렵습니다.</li>
  <li><strong>예측 불가능성 (블랙박스 문제):</strong> 최신 AI 모델의 작동 방식은 복잡하여 예측하기 어렵습니다.</li>
  <li><strong>학습 데이터의 편향:</strong> 학습 데이터에 인간 사회의 편향이 포함될 경우, AI가 원칙을 왜곡된 방식으로 적용할 수 있습니다.</li>
  <li><strong>기술적 구현의 난이도:</strong> 추상적인 윤리 원칙을 코드로 완벽하게 구현하는 것은 현실적으로 불가능합니다.</li>
</ul>

<p>대신, 현실에서는 AI 윤리 가이드라인 수립, 설명 가능한 AI, 인간 중심의 AI 설계, 지속적인 모니터링 및 개선 등의 접근 방식을 통해 AI의 윤리적 작동을 지향하고 있습니다.</p>

<h3 id="결론">결론</h3>

<p>우리는 정말 SF 시대에 살고 있습니다. AI는 우리에게 엄청난 기회를 제공하지만, 동시에 사회적, 경제적, 윤리적으로 심각한 도전 과제를 던지고 있습니다. AI의 긍정적인 잠재력을 최대한 발휘하고 부정적인 영향을 최소화하기 위해서는 기술 개발뿐만 아니라, 인간의 역할에 대한 깊은 성찰, 사회적 합의, 그리고 지속적인 윤리적 논의가 필수적입니다. AI와 인간이 함께 더 나은 미래를 만들어가는 과정이 될 것입니다.</p>]]></content><author><name>한대승</name><email>hoksi3k@gmail.com</email></author><category term="AI," /><category term="미래," /><category term="윤리," /><category term="자본주의," /><category term="인간의역할" /><summary type="html"><![CDATA[최근 인공지능(AI) 기술의 발전은 우리 사회에 SF 영화에서나 보던 일들을 현실로 만들고 있습니다. AI가 가져올 미래는 어떤 모습일까요? 그리고 그 안에서 인간은 어떤 역할을 해야 할까요? 한 대화에서 나눈 AI 시대의 다양한 측면과 윤리적 고찰에 대해 정리해 보았습니다.]]></summary></entry><entry><title type="html">GitHub Pages (Jekyll) 테마 수정 및 Google Analytics 연동 가이드</title><link href="https://hoksi.github.io/web%20development/github-pages-jekyll-theme-ga4/" rel="alternate" type="text/html" title="GitHub Pages (Jekyll) 테마 수정 및 Google Analytics 연동 가이드" /><published>2025-07-29T20:45:24+00:00</published><updated>2025-07-29T20:45:24+00:00</updated><id>https://hoksi.github.io/web%20development/github-pages-jekyll-theme-ga4</id><content type="html" xml:base="https://hoksi.github.io/web%20development/github-pages-jekyll-theme-ga4/"><![CDATA[<p>Jekyll을 사용하여 GitHub Pages를 운영하면서 Google Analytics 연동을 위해 <code class="language-plaintext highlighter-rouge">_config.yml</code> 파일에 코드를 추가했지만, 실제 연동이 되지 않는 문제가 있었습니다. 이는 GA4 코드를 발급받았음에도 불구하고 Jekyll에서 지원하는 스크립트가 이를 제대로 지원하지 않았기 때문입니다. 이 가이드는 Minimal Mistakes 테마를 기준으로 Jekyll 테마 수정 및 GA4 연동 방법을 다룹니다.</p>

<h2 id="1-jekyll-테마-수정-방법">1. Jekyll 테마 수정 방법</h2>

<p>Jekyll 테마를 수정하는 가장 일반적이고 안전한 방법은 <strong>테마 파일 오버라이드(Overriding Theme Files)</strong>와 <strong>커스텀 CSS/SCSS 추가</strong>입니다.</p>

<h3 id="11-테마-파일-오버라이드">1.1. 테마 파일 오버라이드</h3>

<p>Minimal Mistakes와 같은 Jekyll 테마는 <code class="language-plaintext highlighter-rouge">_layouts</code>, <code class="language-plaintext highlighter-rouge">_includes</code>, <code class="language-plaintext highlighter-rouge">_sass</code> 등의 디렉토리에 핵심 파일을 가지고 있습니다. 이 파일들을 직접 수정하는 대신, <strong>자신의 저장소에 동일한 경로로 파일을 생성하여 테마의 파일을 덮어쓰는(override) 방식</strong>으로 수정할 수 있습니다. Jekyll은 빌드 시 자신의 저장소에 있는 파일을 테마의 파일보다 우선적으로 사용합니다.</p>

<p><strong>예시:</strong> 테마의 <code class="language-plaintext highlighter-rouge">_includes/head/custom.html</code> 파일을 수정하고 싶다면, 자신의 GitHub Pages 저장소에 <code class="language-plaintext highlighter-rouge">_includes/head/custom.html</code> 파일을 만들고 그 안에 원하는 내용을 작성하면 됩니다.</p>

<h3 id="12-커스텀-cssscss-추가">1.2. 커스텀 CSS/SCSS 추가</h3>

<p>가장 흔하고 안전한 방법 중 하나는 사용자 정의 CSS/SCSS 파일을 추가하여 기존 테마의 스타일을 덮어쓰는 것입니다.</p>

<ol>
  <li>자신의 저장소 루트에 <code class="language-plaintext highlighter-rouge">_sass</code> 디렉토리가 없다면 생성합니다.</li>
  <li><code class="language-plaintext highlighter-rouge">_sass</code> 디렉토리 안에 <code class="language-plaintext highlighter-rouge">_custom.scss</code>와 같은 파일을 생성합니다.</li>
  <li>이 파일 안에 원하는 CSS 코드를 작성합니다.
    <div class="language-scss highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// _sass/_custom.scss</span>
<span class="nc">.page__title</span> <span class="p">{</span>
  <span class="nl">color</span><span class="p">:</span> <span class="mh">#007bff</span><span class="p">;</span> <span class="c1">// 페이지 제목 색상 변경</span>
  <span class="nl">font-size</span><span class="p">:</span> <span class="m">2</span><span class="mi">.5em</span><span class="p">;</span> <span class="c1">// 페이지 제목 글자 크기 변경</span>
<span class="p">}</span>

<span class="nc">.page__content</span> <span class="p">{</span>
  <span class="nt">a</span> <span class="p">{</span>
    <span class="nl">color</span><span class="p">:</span> <span class="mh">#28a745</span><span class="p">;</span> <span class="c1">// 링크 색상 변경</span>
    <span class="k">&amp;</span><span class="nd">:hover</span> <span class="p">{</span>
      <span class="nl">text-decoration</span><span class="p">:</span> <span class="nb">underline</span><span class="p">;</span>
    <span class="p">}</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div>    </div>
    <p>Minimal Mistakes 테마는 <code class="language-plaintext highlighter-rouge">_sass/minimal-mistakes/_custom.scss</code> 파일을 생성하고 여기에 CSS를 추가하면 자동으로 불러와집니다.</p>
  </li>
</ol>

<h3 id="13-_configyml-파일-수정">1.3. <code class="language-plaintext highlighter-rouge">_config.yml</code> 파일 수정</h3>

<p><code class="language-plaintext highlighter-rouge">_config.yml</code> 파일은 Jekyll 사이트의 전역 설정을 담당합니다. 테마에서 제공하는 다양한 옵션(예: 내비게이션 메뉴, 소셜 링크, 저자 정보, 플러그인 설정 등)을 이 파일에서 변경할 수 있습니다. Minimal Mistakes 테마는 <code class="language-plaintext highlighter-rouge">_config.yml</code>을 통해 매우 많은 부분을 설정할 수 있도록 되어 있습니다.</p>

<p><strong>예시:</strong></p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># _config.yml</span>
<span class="na">title</span><span class="pi">:</span> <span class="s2">"</span><span class="s">나의</span><span class="nv"> </span><span class="s">멋진</span><span class="nv"> </span><span class="s">블로그"</span>
<span class="na">description</span><span class="pi">:</span> <span class="s2">"</span><span class="s">이것은</span><span class="nv"> </span><span class="s">나의</span><span class="nv"> </span><span class="s">개인</span><span class="nv"> </span><span class="s">블로그입니다."</span>
<span class="na">minimal_mistakes_skin</span><span class="pi">:</span> <span class="s2">"</span><span class="s">default"</span> <span class="c1"># 테마 스킨 변경 (예: "dark", "light", "mint" 등)</span>
</code></pre></div></div>

<h2 id="2-google-analytics-4-ga4-연동-방법">2. Google Analytics 4 (GA4) 연동 방법</h2>

<p>GA4 측정을 위해서는 올바른 GA4 추적 코드를 삽입해야 합니다.</p>

<h3 id="21-올바른-ga4-추적-코드">2.1. 올바른 GA4 추적 코드</h3>

<p><code class="language-plaintext highlighter-rouge">G-XXXXXXXXXX</code> 측정 ID를 위한 올바른 GA4 추적 코드(글로벌 사이트 태그, <code class="language-plaintext highlighter-rouge">gtag.js</code>)는 다음과 같습니다.</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">&lt;!-- Google tag (gtag.js) --&gt;</span>
<span class="nt">&lt;script </span><span class="na">async</span> <span class="na">src=</span><span class="s">"https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"</span><span class="nt">&gt;&lt;/script&gt;</span>
<span class="nt">&lt;script&gt;</span>
  <span class="nb">window</span><span class="p">.</span><span class="nx">dataLayer</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">dataLayer</span> <span class="o">||</span> <span class="p">[];</span>
  <span class="kd">function</span> <span class="nx">gtag</span><span class="p">(){</span><span class="nx">dataLayer</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">arguments</span><span class="p">);}</span>
  <span class="nx">gtag</span><span class="p">(</span><span class="dl">'</span><span class="s1">js</span><span class="dl">'</span><span class="p">,</span> <span class="k">new</span> <span class="nb">Date</span><span class="p">());</span>

  <span class="nx">gtag</span><span class="p">(</span><span class="dl">'</span><span class="s1">config</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">G-XXXXXXXXXX</span><span class="dl">'</span><span class="p">);</span>
<span class="nt">&lt;/script&gt;</span>
</code></pre></div></div>

<h3 id="22-ga4-코드-삽입-위치">2.2. GA4 코드 삽입 위치</h3>

<p>Minimal Mistakes 테마에서 GA4 추적 코드를 삽입하는 가장 좋은 위치는 <code class="language-plaintext highlighter-rouge">_includes/head/custom.html</code> 파일입니다.</p>

<ol>
  <li>자신의 GitHub Pages 저장소에 <code class="language-plaintext highlighter-rouge">_includes</code> 디렉토리가 없다면 생성합니다.</li>
  <li><code class="language-plaintext highlighter-rouge">_includes</code> 디렉토리 안에 <code class="language-plaintext highlighter-rouge">head</code> 디렉토리가 없다면 생성합니다.</li>
  <li><code class="language-plaintext highlighter-rouge">_includes/head</code> 디렉토리 안에 <code class="language-plaintext highlighter-rouge">custom.html</code> 파일을 생성합니다.</li>
  <li>
    <p>이 <code class="language-plaintext highlighter-rouge">custom.html</code> 파일 안에 위의 GA4 추적 코드를 붙여넣습니다.</p>

    <p><strong><code class="language-plaintext highlighter-rouge">_includes/head/custom.html</code> 내용:</strong></p>
    <div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">&lt;!-- Google tag (gtag.js) --&gt;</span>
<span class="nt">&lt;script </span><span class="na">async</span> <span class="na">src=</span><span class="s">"https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"</span><span class="nt">&gt;&lt;/script&gt;</span>
<span class="nt">&lt;script&gt;</span>
  <span class="nb">window</span><span class="p">.</span><span class="nx">dataLayer</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">dataLayer</span> <span class="o">||</span> <span class="p">[];</span>
  <span class="kd">function</span> <span class="nx">gtag</span><span class="p">(){</span><span class="nx">dataLayer</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">arguments</span><span class="p">);}</span>
  <span class="nx">gtag</span><span class="p">(</span><span class="dl">'</span><span class="s1">js</span><span class="dl">'</span><span class="p">,</span> <span class="k">new</span> <span class="nb">Date</span><span class="p">());</span>

  <span class="nx">gtag</span><span class="p">(</span><span class="dl">'</span><span class="s1">config</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">G-XXXXXXXXXX</span><span class="dl">'</span><span class="p">);</span>
<span class="nt">&lt;/script&gt;</span>
</code></pre></div>    </div>
  </li>
</ol>

<h2 id="3-작업-순서-요약">3. 작업 순서 요약</h2>

<ol>
  <li><strong>자신의 GitHub Pages 저장소를 로컬로 클론합니다.</strong>
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git clone https://github.com/[자신의 GitHub Pages 저장소 주소].git
<span class="nb">cd</span> <span class="o">[</span>자신의 GitHub Pages 저장소 디렉토리명]
</code></pre></div>    </div>
  </li>
  <li><strong>기존 Google Analytics 코드 삭제:</strong>
현재 웹사이트에 삽입되어 있는 Universal Analytics 코드(이전 대화에서 보여주신 코드)를 찾아서 <strong>삭제</strong>합니다. (예: <code class="language-plaintext highlighter-rouge">_includes/head.html</code> 또는 <code class="language-plaintext highlighter-rouge">_layouts/default.html</code> 등)</li>
  <li><strong>새로운 GA4 코드 삽입:</strong>
<code class="language-plaintext highlighter-rouge">_includes/head/custom.html</code> 파일을 생성하고 위에 제시된 GA4 코드를 붙여넣습니다.</li>
  <li><strong>원하는 테마 수정 (선택 사항):</strong>
<code class="language-plaintext highlighter-rouge">_config.yml</code>을 수정하거나, <code class="language-plaintext highlighter-rouge">_sass/_custom.scss</code> 파일을 만들어 CSS를 추가하는 방식으로 테마를 수정합니다.</li>
  <li><strong>변경 사항 커밋 및 푸시:</strong>
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git add <span class="nb">.</span>
git commit <span class="nt">-m</span> <span class="s2">"Update Google Analytics to GA4 and apply theme customizations"</span>
git push origin main <span class="c"># 또는 master 브랜치</span>
</code></pre></div>    </div>
  </li>
</ol>

<p>이렇게 변경 사항을 GitHub 저장소에 푸시하면, GitHub Pages가 자동으로 사이트를 다시 빌드하여 적용합니다. 변경 사항이 적용되는 데 몇 분 정도 소요될 수 있습니다. 적용 후 Google Analytics 실시간 보고서에서 본인의 접속이 카운트되는지 확인해 보세요.</p>]]></content><author><name>한대승</name><email>hoksi3k@gmail.com</email></author><category term="Web Development" /><category term="GitHub Pages" /><category term="Jekyll" /><category term="Minimal Mistakes" /><category term="Google Analytics" /><category term="GA4" /><summary type="html"><![CDATA[Jekyll을 사용하여 GitHub Pages를 운영하면서 Google Analytics 연동을 위해 _config.yml 파일에 코드를 추가했지만, 실제 연동이 되지 않는 문제가 있었습니다. 이는 GA4 코드를 발급받았음에도 불구하고 Jekyll에서 지원하는 스크립트가 이를 제대로 지원하지 않았기 때문입니다. 이 가이드는 Minimal Mistakes 테마를 기준으로 Jekyll 테마 수정 및 GA4 연동 방법을 다룹니다.]]></summary></entry><entry><title type="html">프롬프트를 활용한 AI 이미지 생성 스크립트</title><link href="https://hoksi.github.io/ai/image%20generation/python/ai-img/" rel="alternate" type="text/html" title="프롬프트를 활용한 AI 이미지 생성 스크립트" /><published>2025-07-25T13:02:21+00:00</published><updated>2025-07-25T13:02:21+00:00</updated><id>https://hoksi.github.io/ai/image%20generation/python/ai-img</id><content type="html" xml:base="https://hoksi.github.io/ai/image%20generation/python/ai-img/"><![CDATA[<p>텍스트만으로 이미지를 만들어내는 마법 같은 기술, AI 이미지 생성에 대해 궁금하신가요? 이번 포스팅에서는 텍스트 프롬프트를 활용하여 이미지를 생성하는 AI 스크립트의 기본 개념과 간단한 예시를 다룹니다. 최근 AI 기술의 발전으로 텍스트 설명만으로도 놀라운 이미지를 만들어낼 수 있게 되었습니다.</p>

<h2 id="ai-이미지-생성의-이해">AI 이미지 생성의 이해</h2>

<p>AI 이미지 생성은 주로 <strong>확산 모델(Diffusion Models)</strong>을 기반으로 합니다. 이 모델들은 노이즈에서 시작하여 점진적으로 노이즈를 제거하면서 텍스트 프롬프트에 맞는 이미지를 생성합니다. 대표적인 서비스로는 DALL-E, Midjourney, Stable Diffusion 등이 있습니다.</p>

<h3 id="스크립트-구현을-위한-고려사항">스크립트 구현을 위한 고려사항</h3>

<p>AI 이미지 생성 스크립트를 구현하려면 다음과 같은 방법들을 고려할 수 있습니다:</p>

<ol>
  <li><strong>클라우드 기반 API 사용</strong>: DALL-E (OpenAI), Stable Diffusion (Stability AI) 등은 API를 제공하여 쉽게 이미지 생성 기능을 애플리케이션에 통합할 수 있습니다. 이 방법은 별도의 GPU 자원이 필요 없다는 장점이 있습니다.</li>
  <li><strong>오픈소스 라이브러리 사용</strong>: <code class="language-plaintext highlighter-rouge">Hugging Face Diffusers</code>와 같은 Python 라이브러리를 사용하면 로컬 환경에서 Stable Diffusion과 같은 모델을 직접 실행할 수 있습니다. 이 방법은 더 많은 제어권을 제공하지만, 강력한 GPU가 필요합니다.</li>
</ol>

<p>이 포스팅에서는 이해를 돕기 위해 <strong>클라우드 기반 API를 사용하는 가상의 Python 스크립트</strong>를 예시로 들어 설명하겠습니다. 실제 API 사용법은 각 서비스의 공식 문서를 참조해야 합니다.</p>

<h2 id="ai-이미지-생성-스크립트-예시-가상-api">AI 이미지 생성 스크립트 예시 (가상 API)</h2>

<p>아래는 텍스트 프롬프트를 받아 이미지를 생성하고 저장하는 간단한 Python 스크립트의 개념적인 예시입니다.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">requests</span>
<span class="kn">import</span> <span class="nn">os</span>

<span class="k">def</span> <span class="nf">generate_image_from_prompt</span><span class="p">(</span><span class="n">prompt</span><span class="p">,</span> <span class="n">api_key</span><span class="p">,</span> <span class="n">output_dir</span><span class="o">=</span><span class="s">"generated_images"</span><span class="p">,</span> <span class="n">image_name</span><span class="o">=</span><span class="s">"output_image.png"</span><span class="p">):</span>
    <span class="c1"># 가상의 AI 이미지 생성 API 엔드포인트
</span>    <span class="c1"># 실제 사용 시에는 DALL-E, Stable Diffusion 등의 공식 API 엔드포인트를 사용해야 합니다.
</span>    <span class="n">api_url</span> <span class="o">=</span> <span class="s">"https://api.example.com/generate_image"</span>

    <span class="n">headers</span> <span class="o">=</span> <span class="p">{</span>
        <span class="s">"Authorization"</span><span class="p">:</span> <span class="sa">f</span><span class="s">"Bearer </span><span class="si">{</span><span class="n">api_key</span><span class="si">}</span><span class="s">"</span><span class="p">,</span>
        <span class="s">"Content-Type"</span><span class="p">:</span> <span class="s">"application/json"</span>
    <span class="p">}</span>

    <span class="n">data</span> <span class="o">=</span> <span class="p">{</span>
        <span class="s">"prompt"</span><span class="p">:</span> <span class="n">prompt</span><span class="p">,</span>
        <span class="s">"model"</span><span class="p">:</span> <span class="s">"standard"</span><span class="p">,</span> <span class="c1"># 또는 "dall-e-3", "stable-diffusion-xl" 등
</span>        <span class="s">"size"</span><span class="p">:</span> <span class="s">"1024x1024"</span><span class="p">,</span>
        <span class="s">"num_images"</span><span class="p">:</span> <span class="mi">1</span>
    <span class="p">}</span>

    <span class="k">try</span><span class="p">:</span>
        <span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="p">.</span><span class="n">post</span><span class="p">(</span><span class="n">api_url</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">,</span> <span class="n">json</span><span class="o">=</span><span class="n">data</span><span class="p">)</span>
        <span class="n">response</span><span class="p">.</span><span class="n">raise_for_status</span><span class="p">()</span> <span class="c1"># HTTP 오류 발생 시 예외 발생
</span>
        <span class="n">result</span> <span class="o">=</span> <span class="n">response</span><span class="p">.</span><span class="n">json</span><span class="p">()</span>
        <span class="n">image_url</span> <span class="o">=</span> <span class="n">result</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">"image_url"</span><span class="p">)</span> <span class="c1"># 가상 API 응답에서 이미지 URL 추출
</span>
        <span class="k">if</span> <span class="n">image_url</span><span class="p">:</span>
            <span class="c1"># 이미지 다운로드
</span>            <span class="n">image_response</span> <span class="o">=</span> <span class="n">requests</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">image_url</span><span class="p">)</span>
            <span class="n">image_response</span><span class="p">.</span><span class="n">raise_for_status</span><span class="p">()</span>

            <span class="n">os</span><span class="p">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">output_dir</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
            <span class="n">image_path</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">output_dir</span><span class="p">,</span> <span class="n">image_name</span><span class="p">)</span>

            <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">image_path</span><span class="p">,</span> <span class="s">"wb"</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
                <span class="n">f</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="n">image_response</span><span class="p">.</span><span class="n">content</span><span class="p">)</span>
            <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"이미지가 성공적으로 저장되었습니다: </span><span class="si">{</span><span class="n">image_path</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">print</span><span class="p">(</span><span class="s">"이미지 URL을 찾을 수 없습니다."</span><span class="p">)</span>

    <span class="k">except</span> <span class="n">requests</span><span class="p">.</span><span class="n">exceptions</span><span class="p">.</span><span class="n">RequestException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
        <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"API 요청 중 오류 발생: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
    <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
        <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"이미지 생성 또는 저장 중 오류 발생: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>

<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">"__main__"</span><span class="p">:</span>
    <span class="c1"># 실제 API 키로 대체해야 합니다.
</span>    <span class="n">YOUR_API_KEY</span> <span class="o">=</span> <span class="s">"YOUR_ACTUAL_API_KEY"</span>
    <span class="n">user_prompt</span> <span class="o">=</span> <span class="s">"A futuristic city at sunset, with flying cars and neon lights, highly detailed, cinematic lighting"</span>

    <span class="k">if</span> <span class="n">YOUR_API_KEY</span> <span class="o">==</span> <span class="s">"YOUR_ACTUAL_API_KEY"</span><span class="p">:</span>
        <span class="k">print</span><span class="p">(</span><span class="s">"경고: YOUR_ACTUAL_API_KEY를 실제 API 키로 교체해주세요."</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">generate_image_from_prompt</span><span class="p">(</span><span class="n">user_prompt</span><span class="p">,</span> <span class="n">YOUR_API_KEY</span><span class="p">,</span> <span class="n">image_name</span><span class="o">=</span><span class="s">"futuristic_city.png"</span><span class="p">)</span>

</code></pre></div></div>

<h3 id="스크립트-설명">스크립트 설명</h3>

<ol>
  <li><strong><code class="language-plaintext highlighter-rouge">requests</code> 라이브러리</strong>: 웹 API와 통신하기 위해 사용됩니다. 설치되어 있지 않다면 <code class="language-plaintext highlighter-rouge">pip install requests</code>로 설치할 수 있습니다.</li>
  <li><strong><code class="language-plaintext highlighter-rouge">generate_image_from_prompt</code> 함수</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">prompt</code>: 이미지를 생성할 텍스트 설명입니다.</li>
      <li><code class="language-plaintext highlighter-rouge">api_key</code>: AI 이미지 생성 서비스에서 발급받은 API 키입니다.</li>
      <li><code class="language-plaintext highlighter-rouge">output_dir</code>: 생성된 이미지를 저장할 디렉토리입니다.</li>
      <li><code class="language-plaintext highlighter-rouge">image_name</code>: 저장될 이미지 파일의 이름입니다.</li>
    </ul>
  </li>
  <li><strong>API 요청</strong>: 지정된 <code class="language-plaintext highlighter-rouge">api_url</code>로 <code class="language-plaintext highlighter-rouge">prompt</code>와 기타 설정(크기, 모델 등)을 포함한 JSON 데이터를 POST 요청으로 보냅니다.</li>
  <li><strong>이미지 다운로드 및 저장</strong>: API 응답에서 이미지 URL을 받아와 해당 URL에서 이미지를 다운로드하고 로컬 파일로 저장합니다.</li>
  <li><strong>오류 처리</strong>: <code class="language-plaintext highlighter-rouge">try-except</code> 블록을 사용하여 네트워크 요청 및 파일 저장 중 발생할 수 있는 오류를 처리합니다.</li>
</ol>

<h3 id="스크립트-사용-방법">스크립트 사용 방법</h3>

<ol>
  <li><strong>API 키 발급</strong>: 사용하고자 하는 AI 이미지 생성 서비스(예: OpenAI DALL-E, Stability AI)에 가입하여 API 키를 발급받습니다.</li>
  <li><strong>라이브러리 설치</strong>: <code class="language-plaintext highlighter-rouge">pip install requests</code> 명령어를 사용하여 필요한 라이브러리를 설치합니다.</li>
  <li><strong>코드 수정</strong>: 위 스크립트에서 <code class="language-plaintext highlighter-rouge">YOUR_ACTUAL_API_KEY</code> 부분을 발급받은 실제 API 키로 교체합니다.</li>
  <li><strong>프롬프트 변경</strong>: <code class="language-plaintext highlighter-rouge">user_prompt</code> 변수의 값을 원하는 이미지 설명으로 변경합니다.</li>
  <li><strong>스크립트 실행</strong>: 터미널에서 <code class="language-plaintext highlighter-rouge">python your_script_name.py</code> 명령어를 실행합니다.</li>
</ol>

<h3 id="추가-고려사항">추가 고려사항</h3>

<ul>
  <li><strong>프롬프트 엔지니어링</strong>: 좋은 이미지를 얻기 위해서는 명확하고 구체적인 프롬프트 작성이 중요합니다. 원하는 스타일, 분위기, 포함될 요소 등을 상세하게 기술할수록 좋습니다.</li>
  <li><strong>모델 선택</strong>: 각 AI 서비스는 다양한 모델을 제공하며, 모델마다 생성되는 이미지의 스타일과 품질이 다를 수 있습니다.</li>
  <li><strong>비용</strong>: 대부분의 AI 이미지 생성 API는 사용량에 따라 비용이 발생하므로, API 사용량을 모니터링하는 것이 중요합니다.</li>
</ul>

<p>이 스크립트는 AI 이미지 생성의 첫걸음을 떼는 데 도움이 될 것입니다. 실제 서비스를 연동하여 자신만의 멋진 이미지를 만들어보세요!</p>]]></content><author><name>한대승</name><email>hoksi3k@gmail.com</email></author><category term="AI" /><category term="Image Generation" /><category term="Python" /><category term="AI" /><category term="Stable Diffusion" /><category term="DALL-E" /><category term="Python" /><category term="Script" /><summary type="html"><![CDATA[텍스트만으로 이미지를 만들어내는 마법 같은 기술, AI 이미지 생성에 대해 궁금하신가요? 이번 포스팅에서는 텍스트 프롬프트를 활용하여 이미지를 생성하는 AI 스크립트의 기본 개념과 간단한 예시를 다룹니다. 최근 AI 기술의 발전으로 텍스트 설명만으로도 놀라운 이미지를 만들어낼 수 있게 되었습니다.]]></summary></entry><entry><title type="html">Python을 이용한 최신 뉴스 수집 스크립트</title><link href="https://hoksi.github.io/python/script/python-trending-news-script/" rel="alternate" type="text/html" title="Python을 이용한 최신 뉴스 수집 스크립트" /><published>2025-07-25T12:40:41+00:00</published><updated>2025-07-25T12:40:41+00:00</updated><id>https://hoksi.github.io/python/script/python-trending-news-script</id><content type="html" xml:base="https://hoksi.github.io/python/script/python-trending-news-script/"><![CDATA[<p>매일 쏟아지는 뉴스 속에서 핵심만 쏙쏙 뽑아보고 싶으신가요? 광고 없이 깔끔하게 최신 뉴스를 받아볼 수 있는 방법을 찾고 있다면, Python을 활용한 구글 뉴스 수집 스크립트가 좋은 해결책이 될 수 있습니다. <code class="language-plaintext highlighter-rouge">feedparser</code> 라이브러리를 이용하면 RSS 피드를 파싱하여 원하는 뉴스를 손쉽게 정리할 수 있습니다.</p>

<h2 id="fetch_trending_newspy-스크립트-소개"><code class="language-plaintext highlighter-rouge">fetch_trending_news.py</code> 스크립트 소개</h2>

<p><code class="language-plaintext highlighter-rouge">fetch_trending_news.py</code> 스크립트는 구글 뉴스 RSS 피드를 읽어와 가장 이슈가 되는 뉴스 기사들의 제목과 링크를 추출합니다. 추출된 정보는 <code class="language-plaintext highlighter-rouge">news.md</code>라는 Markdown 파일로 저장되어, 언제든지 쉽게 뉴스를 확인할 수 있도록 합니다.</p>

<h3 id="스크립트-코드">스크립트 코드</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">feedparser</span>

<span class="k">def</span> <span class="nf">get_trending_news</span><span class="p">(</span><span class="n">num_articles</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">output_file</span><span class="o">=</span><span class="s">"news.md"</span><span class="p">):</span>
    <span class="c1"># Google News RSS 피드 URL (가장 이슈가 되는 뉴스를 가져오기 위해 'top stories' 키워드 사용)
</span>    <span class="n">url</span> <span class="o">=</span> <span class="s">"https://news.google.com/rss/search?q=top+stories+when:1d&amp;hl=ko&amp;gl=KR&amp;ceid=KR:ko"</span>

    <span class="k">try</span><span class="p">:</span>
        <span class="n">feed</span> <span class="o">=</span> <span class="n">feedparser</span><span class="p">.</span><span class="n">parse</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>

        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">output_file</span><span class="p">,</span> <span class="s">"w"</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s">"utf-8"</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
            <span class="n">f</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="s">"# 최근 가장 이슈가 되는 뉴스</span><span class="se">\n\n</span><span class="s">"</span><span class="p">)</span>
            <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"최근 가장 이슈이 되는 뉴스 </span><span class="si">{</span><span class="n">num_articles</span><span class="si">}</span><span class="s">개를 </span><span class="si">{</span><span class="n">output_file</span><span class="si">}</span><span class="s">에 저장합니다."</span><span class="p">)</span>

            <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">entry</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">feed</span><span class="p">.</span><span class="n">entries</span><span class="p">):</span>
                <span class="k">if</span> <span class="n">i</span> <span class="o">&gt;=</span> <span class="n">num_articles</span><span class="p">:</span>
                    <span class="k">break</span>
                <span class="n">title</span> <span class="o">=</span> <span class="n">entry</span><span class="p">.</span><span class="n">title</span>
                <span class="n">link</span> <span class="o">=</span> <span class="n">entry</span><span class="p">.</span><span class="n">link</span>
                
                <span class="c1"># Markdown 형식으로 파일에 쓰기
</span>                <span class="n">f</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s">"</span><span class="si">{</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="si">}</span><span class="s">. [</span><span class="si">{</span><span class="n">title</span><span class="si">}</span><span class="s">](</span><span class="si">{</span><span class="n">link</span><span class="si">}</span><span class="s">)</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>
                <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"</span><span class="si">{</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="si">}</span><span class="s">. </span><span class="si">{</span><span class="n">title</span><span class="si">}</span><span class="s"> (</span><span class="si">{</span><span class="n">link</span><span class="si">}</span><span class="s">)"</span><span class="p">)</span>

    <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
        <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"뉴스 정보를 가져오거나 파일에 쓰는 중 오류 발생: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>

<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">"__main__"</span><span class="p">:</span>
    <span class="n">get_trending_news</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span>
</code></pre></div></div>

<h3 id="스크립트-설명">스크립트 설명</h3>

<ol>
  <li><strong><code class="language-plaintext highlighter-rouge">feedparser</code> 라이브러리</strong>: 이 스크립트의 핵심은 <code class="language-plaintext highlighter-rouge">feedparser</code> 라이브러리입니다. 이 라이브러리는 RSS 및 Atom 피드를 파싱하는 데 사용됩니다. 설치되어 있지 않다면 다음 명령어로 설치할 수 있습니다:
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip <span class="nb">install </span>feedparser
</code></pre></div>    </div>
  </li>
  <li><strong><code class="language-plaintext highlighter-rouge">get_trending_news</code> 함수</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">num_articles</code>: 가져올 기사의 최대 개수를 지정합니다. 기본값은 10개입니다.</li>
      <li><code class="language-plaintext highlighter-rouge">output_file</code>: 뉴스가 저장될 Markdown 파일의 이름을 지정합니다. 기본값은 <code class="language-plaintext highlighter-rouge">news.md</code>입니다.</li>
      <li><code class="language-plaintext highlighter-rouge">url</code>: 구글 뉴스 RSS 피드 URL입니다. <code class="language-plaintext highlighter-rouge">q=top+stories+when:1d</code> 파라미터를 통해 지난 24시간 동안의 ‘top stories’를 검색하도록 설정되어 있습니다.</li>
    </ul>
  </li>
  <li><strong>RSS 피드 파싱</strong>: <code class="language-plaintext highlighter-rouge">feedparser.parse(url)</code>을 사용하여 지정된 URL에서 RSS 피드를 가져와 파싱합니다.</li>
  <li><strong>파일 저장</strong>: <code class="language-plaintext highlighter-rouge">news.md</code> 파일을 쓰기 모드(<code class="language-plaintext highlighter-rouge">"w"</code>)로 열고, 각 뉴스 기사의 제목과 링크를 Markdown 형식으로 작성합니다.</li>
  <li><strong>오류 처리</strong>: <code class="language-plaintext highlighter-rouge">try-except</code> 블록을 사용하여 뉴스 정보를 가져오거나 파일에 쓰는 도중 발생할 수 있는 오류를 처리합니다.</li>
</ol>

<h3 id="스크립트-실행-방법">스크립트 실행 방법</h3>

<ol>
  <li>위 코드를 <code class="language-plaintext highlighter-rouge">fetch_trending_news.py</code> 파일로 저장합니다.</li>
  <li>터미널에서 다음 명령어를 실행하여 필요한 라이브러리를 설치합니다:
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip <span class="nb">install </span>feedparser
</code></pre></div>    </div>
  </li>
  <li>스크립트를 실행합니다:
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python fetch_trending_news.py
</code></pre></div>    </div>
  </li>
</ol>

<h3 id="결과-확인">결과 확인</h3>

<p>스크립트 실행이 완료되면, 스크립트가 실행된 디렉토리에 <code class="language-plaintext highlighter-rouge">news.md</code> 파일이 생성됩니다. 이 파일을 열어보면 다음과 같이 최신 뉴스 목록을 확인할 수 있습니다:</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gh"># 최근 가장 이슈가 되는 뉴스</span>
<span class="p">
1.</span> <span class="p">[</span><span class="nv">뉴스 기사 제목 1</span><span class="p">](</span><span class="sx">뉴스</span> 기사 링크 1)
<span class="p">2.</span> <span class="p">[</span><span class="nv">뉴스 기사 제목 2</span><span class="p">](</span><span class="sx">뉴스</span> 기사 링크 2)
...
</code></pre></div></div>

<p>이 스크립트를 활용하면 매일 아침 최신 뉴스를 자동으로 받아보고, 중요한 소식을 놓치지 않을 수 있습니다. 필요에 따라 <code class="language-plaintext highlighter-rouge">num_articles</code> 값을 조절하여 더 많은 뉴스를 가져오거나, <code class="language-plaintext highlighter-rouge">url</code>을 변경하여 특정 주제의 뉴스를 수집할 수도 있습니다.</p>]]></content><author><name>한대승</name><email>hoksi3k@gmail.com</email></author><category term="Python" /><category term="Script" /><category term="Python" /><category term="News" /><category term="RSS" /><category term="feedparser" /><summary type="html"><![CDATA[매일 쏟아지는 뉴스 속에서 핵심만 쏙쏙 뽑아보고 싶으신가요? 광고 없이 깔끔하게 최신 뉴스를 받아볼 수 있는 방법을 찾고 있다면, Python을 활용한 구글 뉴스 수집 스크립트가 좋은 해결책이 될 수 있습니다. feedparser 라이브러리를 이용하면 RSS 피드를 파싱하여 원하는 뉴스를 손쉽게 정리할 수 있습니다.]]></summary></entry><entry><title type="html">Termux와 Tasker 연동: 안드로이드 자동화의 끝판왕</title><link href="https://hoksi.github.io/android/termux/%EC%9E%90%EB%8F%99%ED%99%94/termux-tasker-automation/" rel="alternate" type="text/html" title="Termux와 Tasker 연동: 안드로이드 자동화의 끝판왕" /><published>2025-07-25T11:07:39+00:00</published><updated>2025-07-25T11:07:39+00:00</updated><id>https://hoksi.github.io/android/termux/%EC%9E%90%EB%8F%99%ED%99%94/termux-tasker-automation</id><content type="html" xml:base="https://hoksi.github.io/android/termux/%EC%9E%90%EB%8F%99%ED%99%94/termux-tasker-automation/"><![CDATA[<p>안드로이드 스마트폰을 단순한 통신 기기 이상으로 활용하고 싶으신가요? <strong>Termux</strong>와 <strong>Tasker</strong>의 강력한 조합으로 안드로이드 자동화의 새로운 지평을 열어보세요. 이 두 앱이 만나면 복잡한 작업도 손쉽게 자동화할 수 있는 무궁무진한 가능성이 펼쳐집니다.</p>

<h2 id="termux와-tasker는-무엇인가요">Termux와 Tasker는 무엇인가요?</h2>

<ul>
  <li>
    <p><strong>Termux</strong>: 안드로이드 기기에서 리눅스 명령줄 환경을 제공하는 강력한 터미널 에뮬레이터입니다. <code class="language-plaintext highlighter-rouge">apt</code> 패키지 관리자를 통해 다양한 리눅스 도구와 프로그래밍 언어를 설치하고 실행할 수 있습니다. 모바일 기기에서 개발, 시스템 관리, 스크립트 실행 등 다양한 작업을 수행할 수 있게 해줍니다.</p>
  </li>
  <li>
    <p><strong>Tasker</strong>: 안드로이드 기기에서 가장 강력하고 유연한 자동화 앱 중 하나입니다. 특정 조건(시간, 위치, 앱 실행, Wi-Fi 연결 등)이 충족될 때 미리 정의된 작업(앱 실행, 설정 변경, 알림 보내기 등)을 자동으로 수행하도록 설정할 수 있습니다.</p>
  </li>
</ul>

<p>이 둘의 조합은 Termux의 리눅스 명령 실행 능력과 Tasker의 강력한 자동화 트리거 및 시스템 제어 능력이 결합되어, 상상할 수 있는 거의 모든 안드로이드 자동화를 구현할 수 있게 합니다.</p>

<h2 id="termuxtasker-플러그인의-역할">Termux:Tasker 플러그인의 역할</h2>

<p>Termux와 Tasker를 연동하기 위해서는 <strong>Termux:Tasker</strong> 플러그인이 필요합니다. 이 플러그인은 Tasker가 Termux 내의 스크립트나 명령어를 실행할 수 있도록 다리 역할을 해줍니다. 즉, Tasker에서 특정 조건이 발생했을 때 Termux에게 “이 스크립트를 실행해줘!”라고 지시할 수 있게 되는 것입니다.</p>

<p><strong>중요</strong>: Termux와 모든 플러그인(Termux:Tasker 포함)은 <strong>동일한 소스</strong>에서 설치하는 것이 중요합니다. 호환성 문제를 피하기 위해 <strong>F-Droid</strong>에서 설치하는 것을 강력히 권장합니다. Google Play 스토어와 F-Droid에서 혼합하여 설치할 경우 서명 키 불일치로 인해 문제가 발생할 수 있습니다.</p>

<h2 id="설치-방법">설치 방법</h2>

<ol>
  <li><strong>Termux 설치</strong>: <a href="https://f-droid.org/packages/com.termux/">F-Droid</a>에서 Termux 앱을 설치합니다.</li>
  <li><strong>Tasker 설치</strong>: Tasker는 유료 앱이며, Google Play 스토어 또는 Tasker 공식 웹사이트에서 구매하여 설치할 수 있습니다.</li>
  <li><strong>Termux:Tasker 플러그인 설치</strong>: <a href="https://f-droid.org/packages/com.termux.tasker/">F-Droid</a>에서 Termux:Tasker 앱을 설치합니다.</li>
</ol>

<p>설치 후, Termux 앱 내에서 <code class="language-plaintext highlighter-rouge">termux-setup-storage</code> 명령어를 실행하여 저장소 접근 권한을 부여하는 것이 좋습니다. 이는 Tasker에서 실행할 스크립트가 외부 저장소에 접근해야 할 경우 필요합니다.</p>

<h2 id="실용적인-사용-예시">실용적인 사용 예시</h2>

<p>이제 Termux와 Tasker를 연동하여 몇 가지 자동화 시나리오를 구현해 보겠습니다.</p>

<h3 id="예시-1-특정-wi-fi-연결-시-termux-스크립트-자동-실행">예시 1: 특정 Wi-Fi 연결 시 Termux 스크립트 자동 실행</h3>

<p>집 Wi-Fi에 연결될 때마다 특정 서버에 SSH로 접속하여 상태를 확인하는 스크립트를 자동으로 실행하고 싶을 때 유용합니다.</p>

<ol>
  <li><strong>Termux 스크립트 작성</strong>: Termux에서 실행할 스크립트를 작성합니다. 예를 들어, <code class="language-plaintext highlighter-rouge">~/scripts/check_server.sh</code> 파일을 생성하고 다음 내용을 추가합니다.
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/data/data/com.termux/files/usr/bin/bash</span>
    
<span class="c"># 서버 상태를 확인하고 결과를 알림으로 보냅니다.</span>
<span class="c"># 실제 사용 시에는 SSH 접속 정보 등을 여기에 추가하세요.</span>
<span class="nb">echo</span> <span class="s2">"서버 상태 확인 중..."</span>
<span class="c"># 예시: ping google.com</span>
ping <span class="nt">-c</span> 3 google.com <span class="o">&gt;</span> /dev/null 2&gt;&amp;1
<span class="k">if</span> <span class="o">[</span> <span class="nv">$?</span> <span class="nt">-eq</span> 0 <span class="o">]</span><span class="p">;</span> <span class="k">then
  </span>termux-toast <span class="s2">"Google.com 핑 성공!"</span>
<span class="k">else
  </span>termux-toast <span class="s2">"Google.com 핑 실패!"</span>
<span class="k">fi</span>
</code></pre></div>    </div>
  </li>
  <li><strong>스크립트 실행 권한 부여</strong>: 스크립트 파일에 실행 권한을 부여합니다.
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">chmod</span> +x ~/scripts/check_server.sh
</code></pre></div>    </div>
  </li>
  <li><strong>Tasker 프로필 설정</strong>: Tasker 앱을 엽니다.
    <ul>
      <li><strong>Profile 생성</strong>: <code class="language-plaintext highlighter-rouge">+</code> 버튼을 눌러 새 Profile을 생성하고 <code class="language-plaintext highlighter-rouge">State</code> -&gt; <code class="language-plaintext highlighter-rouge">Net</code> -&gt; <code class="language-plaintext highlighter-rouge">Wi-Fi Connected</code>를 선택합니다. <code class="language-plaintext highlighter-rouge">SSID</code>에 집 Wi-Fi 이름을 입력합니다.</li>
      <li><strong>Task 생성</strong>: Profile에 연결할 새 Task를 생성합니다.</li>
      <li><strong>Action 추가</strong>: <code class="language-plaintext highlighter-rouge">+</code> 버튼을 눌러 <code class="language-plaintext highlighter-rouge">Plugin</code> -&gt; <code class="language-plaintext highlighter-rouge">Termux:Tasker</code>를 선택합니다.</li>
      <li><strong>Configuration 설정</strong>: 연필 아이콘을 눌러 <code class="language-plaintext highlighter-rouge">Executable</code> 필드에 <code class="language-plaintext highlighter-rouge">~/scripts/check_server.sh</code>를 입력합니다. <code class="language-plaintext highlighter-rouge">Run in background</code> 옵션을 체크하는 것이 좋습니다.</li>
      <li>Task를 저장하고 Tasker를 활성화합니다.</li>
    </ul>
  </li>
</ol>

<p>이제 집 Wi-Fi에 연결될 때마다 Termux 스크립트가 자동으로 실행되고, 결과가 알림으로 표시될 것입니다.</p>

<h3 id="예시-2-특정-시간마다-termux-패키지-업데이트-확인">예시 2: 특정 시간마다 Termux 패키지 업데이트 확인</h3>

<p>매일 새벽에 Termux 패키지 업데이트를 확인하고, 업데이트가 있다면 알림을 받는 자동화입니다.</p>

<ol>
  <li><strong>Termux 스크립트 작성</strong>: <code class="language-plaintext highlighter-rouge">~/scripts/update_check.sh</code> 파일을 생성하고 다음 내용을 추가합니다.
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/data/data/com.termux/files/usr/bin/bash</span>
    
termux-toast <span class="s2">"Termux 업데이트 확인 중..."</span>
    
<span class="c"># 업데이트 가능한 패키지 목록을 가져옵니다.</span>
<span class="nv">UPDATES</span><span class="o">=</span><span class="si">$(</span>pkg update <span class="nt">-n</span> | <span class="nb">grep</span> <span class="s2">"^The following packages will be upgraded:"</span> <span class="nt">-A</span> 100 | <span class="nb">grep</span> <span class="nt">-v</span> <span class="s2">"^The following packages will be upgraded:"</span> | <span class="nb">grep</span> <span class="nt">-v</span> <span class="s2">"^$"</span><span class="si">)</span>
    
<span class="k">if</span> <span class="o">[</span> <span class="nt">-z</span> <span class="s2">"</span><span class="nv">$UPDATES</span><span class="s2">"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
  </span>termux-toast <span class="s2">"Termux: 업데이트할 패키지가 없습니다."</span>
<span class="k">else
  </span>termux-toast <span class="s2">"Termux: 업데이트 가능한 패키지가 있습니다!"</span> <span class="nt">-b</span> <span class="s2">"</span><span class="nv">$UPDATES</span><span class="s2">"</span>
<span class="k">fi</span>
</code></pre></div>    </div>
  </li>
  <li><strong>스크립트 실행 권한 부여</strong>: <code class="language-plaintext highlighter-rouge">chmod +x ~/scripts/update_check.sh</code></li>
  <li><strong>Tasker 프로필 설정</strong>:
    <ul>
      <li><strong>Profile 생성</strong>: <code class="language-plaintext highlighter-rouge">+</code> 버튼을 눌러 새 Profile을 생성하고 <code class="language-plaintext highlighter-rouge">Time</code>을 선택합니다. 원하는 시간(예: <code class="language-plaintext highlighter-rouge">From 03:00 To 03:01</code>)을 설정합니다.</li>
      <li><strong>Task 생성 및 Action 추가</strong>: 예시 1과 동일하게 <code class="language-plaintext highlighter-rouge">Plugin</code> -&gt; <code class="language-plaintext highlighter-rouge">Termux:Tasker</code>를 선택하고 <code class="language-plaintext highlighter-rouge">Executable</code>에 <code class="language-plaintext highlighter-rouge">~/scripts/update_check.sh</code>를 입력합니다.</li>
    </ul>
  </li>
</ol>

<p>이제 매일 설정된 시간에 Termux 업데이트를 확인하고, 결과에 따라 알림을 받을 수 있습니다.</p>

<h3 id="예시-3-특정-앱-실행-시-termux에서-vpn-연결">예시 3: 특정 앱 실행 시 Termux에서 VPN 연결</h3>

<p>특정 앱(예: 특정 게임 또는 스트리밍 앱)을 실행할 때 자동으로 Termux에서 VPN을 연결하고, 앱 종료 시 VPN을 해제하는 자동화입니다.</p>

<ol>
  <li><strong>Termux VPN 스크립트 작성</strong>: (이 예시는 OpenVPN을 사용한다고 가정합니다. 실제 VPN 설정에 따라 스크립트가 달라질 수 있습니다.)
    <ul>
      <li><code class="language-plaintext highlighter-rouge">~/scripts/vpn_connect.sh</code>:
        <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/data/data/com.termux/files/usr/bin/bash</span>
termux-toast <span class="s2">"VPN 연결 중..."</span>
<span class="c"># OpenVPN 설정 파일 경로에 맞게 수정하세요.</span>
openvpn <span class="nt">--config</span> ~/vpn/my_vpn.ovpn <span class="o">&gt;</span> /dev/null 2&gt;&amp;1 &amp;
<span class="nb">echo</span> <span class="nv">$!</span> <span class="o">&gt;</span> ~/vpn/vpn_pid.txt <span class="c"># VPN 프로세스 ID 저장</span>
termux-toast <span class="s2">"VPN 연결 완료!"</span>
</code></pre></div>        </div>
      </li>
      <li><code class="language-plaintext highlighter-rouge">~/scripts/vpn_disconnect.sh</code>:
        <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/data/data/com.termux/files/usr/bin/bash</span>
termux-toast <span class="s2">"VPN 연결 해제 중..."</span>
<span class="k">if</span> <span class="o">[</span> <span class="nt">-f</span> ~/vpn/vpn_pid.txt <span class="o">]</span><span class="p">;</span> <span class="k">then
  </span><span class="nb">kill</span> <span class="si">$(</span><span class="nb">cat</span> ~/vpn/vpn_pid.txt<span class="si">)</span>
  <span class="nb">rm</span> ~/vpn/vpn_pid.txt
<span class="k">fi
</span>termux-toast <span class="s2">"VPN 연결 해제 완료!"</span>
</code></pre></div>        </div>
      </li>
    </ul>
  </li>
  <li><strong>스크립트 실행 권한 부여</strong>: <code class="language-plaintext highlighter-rouge">chmod +x ~/scripts/vpn_connect.sh ~/scripts/vpn_disconnect.sh</code></li>
  <li><strong>Tasker 프로필 설정</strong>:
    <ul>
      <li><strong>Profile 생성</strong>: <code class="language-plaintext highlighter-rouge">+</code> 버튼을 눌러 새 Profile을 생성하고 <code class="language-plaintext highlighter-rouge">Application</code>을 선택합니다. VPN 연결이 필요한 앱을 선택합니다.</li>
      <li><strong>Enter Task (앱 실행 시)</strong>:
        <ul>
          <li>새 Task를 생성하고 <code class="language-plaintext highlighter-rouge">Plugin</code> -&gt; <code class="language-plaintext highlighter-rouge">Termux:Tasker</code>를 선택합니다.</li>
          <li><code class="language-plaintext highlighter-rouge">Executable</code>에 <code class="language-plaintext highlighter-rouge">~/scripts/vpn_connect.sh</code>를 입력합니다.</li>
        </ul>
      </li>
      <li><strong>Exit Task (앱 종료 시)</strong>:
        <ul>
          <li>Profile을 길게 누른 후 <code class="language-plaintext highlighter-rouge">Add Exit Task</code>를 선택합니다.</li>
          <li>새 Task를 생성하고 <code class="language-plaintext highlighter-rouge">Plugin</code> -&gt; <code class="language-plaintext highlighter-rouge">Termux:Tasker</code>를 선택합니다.</li>
          <li><code class="language-plaintext highlighter-rouge">Executable</code>에 <code class="language-plaintext highlighter-rouge">~/scripts/vpn_disconnect.sh</code>를 입력합니다.</li>
        </ul>
      </li>
    </ul>
  </li>
</ol>

<p>이제 특정 앱을 실행하면 자동으로 VPN이 연결되고, 앱을 종료하면 VPN이 해제될 것입니다.</p>

<h2 id="결론">결론</h2>

<p>Termux와 Tasker의 연동은 안드로이드 기기에서 상상 이상의 자동화 기능을 구현할 수 있게 해줍니다. 간단한 시스템 관리부터 복잡한 워크플로우 자동화까지, 이 강력한 조합을 통해 여러분의 스마트폰을 진정한 개인 서버이자 자동화 허브로 변모시킬 수 있습니다. 다양한 스크립트와 Tasker 프로필을 조합하여 여러분만의 ‘끝판왕’ 자동화를 만들어 보세요!</p>]]></content><author><name>한대승</name><email>hoksi3k@gmail.com</email></author><category term="Android" /><category term="Termux" /><category term="자동화" /><category term="Termux" /><category term="Tasker" /><category term="자동화" /><category term="Android" /><category term="스크립트" /><category term="플러그인" /><summary type="html"><![CDATA[안드로이드 스마트폰을 단순한 통신 기기 이상으로 활용하고 싶으신가요? Termux와 Tasker의 강력한 조합으로 안드로이드 자동화의 새로운 지평을 열어보세요. 이 두 앱이 만나면 복잡한 작업도 손쉽게 자동화할 수 있는 무궁무진한 가능성이 펼쳐집니다.]]></summary></entry><entry><title type="html">Termux를 이용한 안드로이드폰에서 Gemini CLI 사용하기</title><link href="https://hoksi.github.io/android/termux/gemini/cli/termux-gemini-cli/" rel="alternate" type="text/html" title="Termux를 이용한 안드로이드폰에서 Gemini CLI 사용하기" /><published>2025-07-25T06:30:00+00:00</published><updated>2025-07-25T06:30:00+00:00</updated><id>https://hoksi.github.io/android/termux/gemini/cli/termux-gemini-cli</id><content type="html" xml:base="https://hoksi.github.io/android/termux/gemini/cli/termux-gemini-cli/"><![CDATA[<p>안드로이드폰에서 개발 환경을 구축하고 AI 작업을 수행하고 싶으신가요? Termux와 Gemini CLI의 조합이라면 모바일 환경에서도 강력한 개발 및 자동화 작업을 수행할 수 있습니다. 이 포스팅에서 그 방법을 자세히 알아보겠습니다.</p>

<h2 id="1-termux-설치">1. Termux 설치</h2>

<p>Termux는 Google Play 스토어보다는 <a href="https://f-droid.org/packages/com.termux/">F-Droid</a>를 통해 설치하는 것을 권장합니다. F-Droid 버전이 더 최신이며 안정적인 업데이트를 제공합니다.</p>

<ol>
  <li><strong>F-Droid 설치</strong>: F-Droid 웹사이트에서 F-Droid 클라이언트 앱을 다운로드하여 설치합니다.</li>
  <li><strong>Termux 설치</strong>: F-Droid 앱을 실행한 후, ‘Termux’를 검색하여 설치합니다.</li>
</ol>

<h2 id="2-termux-초기-설정-및-필수-패키지-설치">2. Termux 초기 설정 및 필수 패키지 설치</h2>

<p>Termux를 처음 실행하면 기본 시스템이 설치됩니다. 이후 필요한 패키지들을 설치합니다.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pkg update <span class="o">&amp;&amp;</span> pkg upgrade
pkg <span class="nb">install </span>nodejs git openssh <span class="nt">-y</span>
</code></pre></div></div>

<ul>
  <li><code class="language-plaintext highlighter-rouge">nodejs</code>: Gemini CLI 실행에 필요한 Node.js 런타임입니다.</li>
  <li><code class="language-plaintext highlighter-rouge">git</code>: 저장소를 클론하는 데 필요합니다.</li>
  <li><code class="language-plaintext highlighter-rouge">openssh</code>: 원격 서버 접속 등 추가적인 작업을 위해 유용합니다.</li>
</ul>

<h2 id="3-gemini-cli-설치">3. Gemini CLI 설치</h2>

<p>Gemini CLI는 npm(Node Package Manager)을 통해 설치하는 것이 가장 일반적입니다.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>npm <span class="nb">install</span> <span class="nt">-g</span> @google/gemini-cli
</code></pre></div></div>

<ul>
  <li><code class="language-plaintext highlighter-rouge">-g</code> 옵션은 Gemini CLI를 전역으로 설치하여 어느 디렉토리에서든 <code class="language-plaintext highlighter-rouge">gemini</code> 명령어를 사용할 수 있게 합니다.</li>
</ul>

<h2 id="4-google-ai-api-키-설정">4. Google AI API 키 설정</h2>

<p>Gemini CLI를 사용하려면 Google AI Studio에서 발급받은 API 키가 필요합니다. API 키는 <a href="https://aistudio.google.com/app/apikey">aistudio.google.com/app/apikey</a>에서 생성할 수 있습니다.</p>

<p>API 키는 <code class="language-plaintext highlighter-rouge">GEMINI_API_KEY</code> 환경 변수로 설정하는 것이 권장됩니다.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">export </span><span class="nv">GEMINI_API_KEY</span><span class="o">=</span><span class="s2">"YOUR_API_KEY_HERE"</span>
</code></pre></div></div>

<p>이 설정은 현재 터미널 세션에서만 유효합니다. Termux를 다시 시작해도 유지되도록 하려면, 다음 줄을 <code class="language-plaintext highlighter-rouge">~/.bashrc</code> 또는 <code class="language-plaintext highlighter-rouge">~/.zshrc</code> 파일에 추가하세요.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">echo</span> <span class="s1">'export GEMINI_API_KEY="YOUR_API_KEY_HERE"'</span> <span class="o">&gt;&gt;</span> ~/.bashrc <span class="c"># 또는 ~/.zshrc</span>
<span class="nb">source</span> ~/.bashrc <span class="c"># 변경사항 적용</span>
</code></pre></div></div>

<h2 id="5-gemini-cli-실행">5. Gemini CLI 실행</h2>

<p>이제 Gemini CLI를 실행할 준비가 되었습니다.</p>

<ul>
  <li><strong>대화형 모드 (REPL)</strong>:
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gemini
</code></pre></div>    </div>
    <p>이 명령어를 실행하면 대화형 세션이 시작되어 프롬프트를 직접 입력할 수 있습니다.</p>
  </li>
  <li><strong>비대화형 모드</strong>:
프롬프트를 직접 전달하여 단일 응답을 받을 수 있습니다.
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gemini <span class="nt">-p</span> <span class="s2">"안녕, Gemini!"</span>
</code></pre></div>    </div>
  </li>
</ul>

<h2 id="6-추가-팁">6. 추가 팁</h2>

<ul>
  <li><strong>백그라운드 실행</strong>: 장시간 실행해야 하는 작업의 경우 <code class="language-plaintext highlighter-rouge">nohup</code>이나 <code class="language-plaintext highlighter-rouge">tmux</code>를 사용하여 세션이 끊겨도 작업이 계속되도록 할 수 있습니다.
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pkg <span class="nb">install </span>tmux <span class="c"># tmux 설치</span>
tmux new <span class="nt">-s</span> gemini_session <span class="c"># 새 tmux 세션 시작</span>
<span class="c"># 여기서 Gemini CLI 명령어 실행</span>
<span class="c"># Ctrl+b d 를 눌러 세션에서 나옴 (백그라운드 실행)</span>
<span class="c"># tmux attach -t gemini_session 로 다시 접속</span>
</code></pre></div>    </div>
  </li>
  <li><strong>파일 접근</strong>: Termux는 안드로이드 파일 시스템의 특정 경로에만 접근할 수 있습니다. <code class="language-plaintext highlighter-rouge">termux-setup-storage</code> 명령어를 실행하여 외부 저장소 접근 권한을 부여할 수 있습니다.</li>
</ul>

<p>이 가이드가 안드로이드폰에서 Gemini CLI를 성공적으로 사용하는 데 도움이 되기를 바랍니다!</p>]]></content><author><name>한대승</name><email>hoksi3k@gmail.com</email></author><category term="Android" /><category term="Termux" /><category term="Gemini" /><category term="CLI" /><category term="Termux" /><category term="Android" /><category term="Gemini CLI" /><category term="모바일 개발 환경" /><category term="터미널" /><summary type="html"><![CDATA[안드로이드폰에서 개발 환경을 구축하고 AI 작업을 수행하고 싶으신가요? Termux와 Gemini CLI의 조합이라면 모바일 환경에서도 강력한 개발 및 자동화 작업을 수행할 수 있습니다. 이 포스팅에서 그 방법을 자세히 알아보겠습니다.]]></summary></entry><entry><title type="html">Termux 플러그인: 설치 및 활용 가이드</title><link href="https://hoksi.github.io/android/termux/termux-plugins-guide/" rel="alternate" type="text/html" title="Termux 플러그인: 설치 및 활용 가이드" /><published>2025-07-25T01:00:00+00:00</published><updated>2025-07-25T01:00:00+00:00</updated><id>https://hoksi.github.io/android/termux/termux-plugins-guide</id><content type="html" xml:base="https://hoksi.github.io/android/termux/termux-plugins-guide/"><![CDATA[<p>안드로이드 기기에서 Termux를 사용하고 계신가요? Termux의 잠재력을 최대한 끌어올리고 싶다면, 다양한 플러그인(애드온)을 활용하는 것이 필수입니다. 이 포스팅에서는 Termux의 기능을 확장하고 안드로이드 시스템과 더욱 긴밀하게 통합할 수 있는 주요 플러그인들의 설치 방법과 실용적인 사용 예시를 소개합니다.</p>

<h2 id="termux-플러그인이란">Termux 플러그인이란?</h2>

<p>Termux 플러그인은 Termux 앱의 기능을 확장하여 안드로이드 기기의 하드웨어 및 소프트웨어 기능에 접근하거나, Termux 환경을 더욱 편리하게 사용할 수 있도록 돕는 별도의 안드로이드 애플리케이션입니다.</p>

<p><strong>중요</strong>: Termux와 모든 플러그인은 <strong>동일한 소스</strong>에서 설치하는 것이 중요합니다. 호환성 문제를 피하기 위해 <strong>F-Droid</strong>에서 설치하는 것을 강력히 권장합니다. Google Play 스토어와 F-Droid에서 혼합하여 설치할 경우 서명 키 불일치로 인해 문제가 발생할 수 있습니다.</p>

<h2 id="주요-termux-플러그인">주요 Termux 플러그인</h2>

<p>다음은 일반적으로 사용되는 Termux 플러그인 목록입니다:</p>

<ul>
  <li><strong>Termux:API</strong>: 안드로이드 기기의 하드웨어(배터리, 카메라, GPS 등) 및 소프트웨어 기능에 접근할 수 있도록 합니다.</li>
  <li><strong>Termux:Boot</strong>: 기기 부팅 시 특정 스크립트를 자동으로 실행할 수 있게 합니다.</li>
  <li><strong>Termux:Float</strong>: 플로팅(떠다니는) Termux 창을 제공하여 다른 앱을 사용하면서 Termux를 동시에 사용할 수 있습니다.</li>
  <li><strong>Termux:Styling</strong>: Termux 터미널의 색상 스키마와 폰트를 커스터마이징할 수 있습니다.</li>
  <li><strong>Termux:Tasker</strong>: Tasker와 같은 자동화 앱과 연동하여 Termux 명령을 실행할 수 있도록 합니다.</li>
  <li><strong>Termux:Widget</strong>: 안드로이드 홈 화면에 위젯을 추가하여 Termux 스크립트를 빠르게 실행할 수 있습니다.</li>
  <li><strong>Termux:GUI</strong>: 명령줄 프로그램이 네이티브 안드로이드 GUI 구성 요소를 사용할 수 있도록 합니다. (현재 개발 중)</li>
</ul>

<h2 id="플러그인-설치-및-사용-예시">플러그인 설치 및 사용 예시</h2>

<p>대부분의 Termux 플러그인은 일반 안드로이드 앱처럼 설치합니다. F-Droid 앱 스토어에서 <code class="language-plaintext highlighter-rouge">Termux:</code> 접두사가 붙은 앱들을 검색하여 설치할 수 있습니다.</p>

<h3 id="1-termuxapi">1. Termux:API</h3>

<p>Termux:API는 안드로이드 기기의 다양한 센서 및 기능에 접근할 수 있게 해주는 핵심 플러그인입니다.</p>

<p><strong>설치</strong>:</p>
<ol>
  <li>F-Droid에서 “Termux:API” 앱을 설치합니다.</li>
  <li>Termux 앱 내에서 <code class="language-plaintext highlighter-rouge">pkg install termux-api</code> 명령어를 실행하여 API 도구를 설치합니다.</li>
</ol>

<p><strong>사용 예시</strong>:</p>
<ul>
  <li><strong>배터리 상태 확인</strong>:
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>termux-battery-status
</code></pre></div>    </div>
  </li>
  <li><strong>기기 진동</strong>:
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>termux-vibrate <span class="nt">-d</span> 1000 <span class="c"># 1000밀리초(1초) 동안 진동</span>
</code></pre></div>    </div>
  </li>
  <li><strong>카메라 사진 촬영</strong>:
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>termux-camera-photo <span class="nt">-c</span> 0 ~/camera_photo.jpg <span class="c"># 후면 카메라(0)로 사진 촬영</span>
</code></pre></div>    </div>
  </li>
</ul>

<h3 id="2-termuxtasker">2. Termux:Tasker</h3>

<p>Tasker와 같은 자동화 앱을 사용하여 Termux 명령을 실행하고 자동화할 수 있습니다.</p>

<p><strong>설치</strong>:</p>
<ol>
  <li>F-Droid에서 “Termux:Tasker” 앱을 설치합니다.</li>
</ol>

<p><strong>사용 예시</strong>:
Tasker 앱에서 Termux 스크립트를 실행하는 예시입니다. (Tasker 앱 설치 및 기본 사용법은 별도로 숙지해야 합니다.)</p>

<ol>
  <li>Termux에서 실행할 스크립트를 작성합니다. 예: <code class="language-plaintext highlighter-rouge">~/my_script.sh</code>
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/data/data/com.termux/files/usr/bin/bash</span>
<span class="nb">echo</span> <span class="s2">"Hello from Tasker!"</span> <span class="o">&gt;</span> ~/tasker_output.txt
termux-toast <span class="s2">"Tasker script executed!"</span>
</code></pre></div>    </div>
  </li>
  <li>스크립트에 실행 권한을 부여합니다: <code class="language-plaintext highlighter-rouge">chmod +x ~/my_script.sh</code></li>
  <li>Tasker 앱을 엽니다.</li>
  <li>새로운 <code class="language-plaintext highlighter-rouge">Task</code>를 생성합니다.</li>
  <li><code class="language-plaintext highlighter-rouge">Action</code>으로 <code class="language-plaintext highlighter-rouge">Plugin</code> -&gt; <code class="language-plaintext highlighter-rouge">Termux:Tasker</code>를 선택합니다.</li>
  <li><code class="language-plaintext highlighter-rouge">Configuration</code>에서 <code class="language-plaintext highlighter-rouge">Executable</code> 필드에 <code class="language-plaintext highlighter-rouge">~/my_script.sh</code>를 입력합니다.</li>
  <li>이 Task를 특정 <code class="language-plaintext highlighter-rouge">Profile</code>(예: 특정 Wi-Fi 연결 시, 특정 시간)에 연결하여 자동화합니다.</li>
</ol>

<h3 id="3-termuxwidget">3. Termux:Widget</h3>

<p>홈 화면 위젯을 통해 Termux 스크립트를 빠르게 실행할 수 있습니다.</p>

<p><strong>설치</strong>:</p>
<ol>
  <li>F-Droid에서 “Termux:Widget” 앱을 설치합니다.</li>
</ol>

<p><strong>사용 예시</strong>:
Termux 패키지를 업데이트하는 위젯을 만드는 예시입니다.</p>

<ol>
  <li>위젯용 스크립트를 저장할 디렉토리를 생성합니다:
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">mkdir</span> <span class="nt">-p</span> ~/.shortcuts
</code></pre></div>    </div>
  </li>
  <li>업데이트 스크립트 파일을 생성합니다. 예: <code class="language-plaintext highlighter-rouge">~/.shortcuts/update_termux.sh</code>
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/data/data/com.termux/files/usr/bin/bash</span>
termux-toast <span class="s2">"Updating Termux packages..."</span>
pkg update <span class="o">&amp;&amp;</span> pkg upgrade <span class="nt">-y</span>
termux-toast <span class="s2">"Termux update complete!"</span>
</code></pre></div>    </div>
  </li>
  <li>스크립트에 실행 권한을 부여합니다:
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">chmod</span> +x ~/.shortcuts/update_termux.sh
</code></pre></div>    </div>
  </li>
  <li>안드로이드 홈 화면에서 위젯 추가 기능을 통해 “Termux:Widget”을 선택합니다.</li>
  <li>위젯을 추가하면 <code class="language-plaintext highlighter-rouge">~/.shortcuts</code> 디렉토리 내의 스크립트 목록이 표시되며, <code class="language-plaintext highlighter-rouge">update_termux.sh</code>를 선택하여 위젯으로 추가할 수 있습니다. 이제 이 위젯을 탭하면 스크립트가 실행됩니다.</li>
</ol>

<h2 id="zsh-플러그인-선택-사항">ZSH 플러그인 (선택 사항)</h2>

<p>Termux 자체 플러그인은 아니지만, ZSH 쉘을 사용하는 경우 <code class="language-plaintext highlighter-rouge">oh-my-zsh</code>와 같은 프레임워크를 통해 다양한 ZSH 플러그인을 설치하여 터미널 환경을 크게 개선할 수 있습니다.</p>

<p><strong>예시: ZSH Syntax Highlighting 설치</strong></p>

<ol>
  <li>ZSH 및 <code class="language-plaintext highlighter-rouge">git</code> 설치:
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pkg <span class="nb">install </span>zsh git
</code></pre></div>    </div>
  </li>
  <li>ZSH Syntax Highlighting 플러그인 클론:
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git clone https://github.com/zsh-users/zsh-syntax-highlighting.git <span class="k">${</span><span class="nv">ZSH_CUSTOM</span><span class="k">:-</span><span class="p">~/.oh-my-zsh/custom</span><span class="k">}</span>/plugins/zsh-syntax-highlighting
</code></pre></div>    </div>
  </li>
  <li><code class="language-plaintext highlighter-rouge">~/.zshrc</code> 파일을 편집하여 <code class="language-plaintext highlighter-rouge">plugins</code> 배열에 <code class="language-plaintext highlighter-rouge">zsh-syntax-highlighting</code>을 추가합니다.
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># .zshrc 파일 내용 중</span>
<span class="nv">plugins</span><span class="o">=(</span>
    git
    zsh-syntax-highlighting <span class="c"># 이 줄 추가</span>
<span class="o">)</span>
</code></pre></div>    </div>
  </li>
  <li>변경 사항 적용:
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">source</span> ~/.zshrc
</code></pre></div>    </div>
  </li>
</ol>

<p>이제 명령어를 입력할 때 구문 강조가 적용되어 가독성이 향상됩니다.</p>

<p>Termux 플러그인을 활용하면 안드로이드 기기에서 더욱 강력하고 편리한 리눅스 환경을 구축할 수 있습니다. 필요에 따라 적절한 플러그인을 설치하고 활용하여 생산성을 높여보세요!</p>]]></content><author><name>한대승</name><email>hoksi3k@gmail.com</email></author><category term="Android" /><category term="Termux" /><category term="Termux" /><category term="Plugin" /><category term="Android" /><category term="CLI" /><summary type="html"><![CDATA[안드로이드 기기에서 Termux를 사용하고 계신가요? Termux의 잠재력을 최대한 끌어올리고 싶다면, 다양한 플러그인(애드온)을 활용하는 것이 필수입니다. 이 포스팅에서는 Termux의 기능을 확장하고 안드로이드 시스템과 더욱 긴밀하게 통합할 수 있는 주요 플러그인들의 설치 방법과 실용적인 사용 예시를 소개합니다.]]></summary></entry><entry><title type="html">GitHub CLI (gh) 개요</title><link href="https://hoksi.github.io/github/cli/github-cli-overview/" rel="alternate" type="text/html" title="GitHub CLI (gh) 개요" /><published>2025-07-25T00:54:00+00:00</published><updated>2025-07-25T00:54:00+00:00</updated><id>https://hoksi.github.io/github/cli/github-cli-overview</id><content type="html" xml:base="https://hoksi.github.io/github/cli/github-cli-overview/"><![CDATA[<p>개발 워크플로우를 터미널에서 직접 관리하고 싶으신가요? GitHub CLI(<code class="language-plaintext highlighter-rouge">gh</code>)는 터미널에서 GitHub의 모든 기능을 손쉽게 사용할 수 있도록 돕는 강력한 도구입니다. 풀 리퀘스트, 이슈, GitHub Actions 등 다양한 작업을 명령줄에서 바로 처리하여 생산성을 극대화할 수 있습니다.</p>

<h2 id="주요-기능-및-특징">주요 기능 및 특징</h2>

<ul>
  <li><strong>저장소 관리</strong>: 터미널에서 직접 저장소를 생성, 복제, 조회, 포크할 수 있습니다. 예를 들어, <code class="language-plaintext highlighter-rouge">gh repo create</code> 명령어를 사용하여 새 저장소를 만들 수 있습니다.</li>
  <li><strong>풀 리퀘스트 및 이슈 관리</strong>: 터미널을 벗어나지 않고도 풀 리퀘스트와 이슈를 생성, 조회, 나열, 편집, 닫기, 검토, 비교, 병합할 수 있습니다. <code class="language-plaintext highlighter-rouge">gh issue list</code> 및 <code class="language-plaintext highlighter-rouge">gh pr create</code>와 같은 명령어를 사용할 수 있습니다.</li>
  <li><strong>GitHub Actions 상호작용</strong>: 워크플로우를 실행, 조회, 나열할 수 있습니다.</li>
  <li><strong>Gist 관리</strong>: Gist를 생성, 나열, 조회, 편집, 삭제할 수 있습니다.</li>
  <li><strong>인증</strong>: SSH 키, 토큰, OAuth를 지원하여 GitHub 계정으로 안전하게 인증할 수 있습니다. 여러 계정을 관리하고 전환할 수도 있습니다.</li>
  <li><strong>사용자 지정 스크립팅</strong>: GitHub CLI는 GitHub 작업을 자동화하는 스크립트를 더 쉽게 만들 수 있도록 하며, 명령에 대한 사용자 지정 별칭을 허용합니다.</li>
  <li><strong>API 접근</strong>: GitHub API에서 정보를 검색할 수 있습니다.</li>
</ul>

<h2 id="git-cli-git와의-차이점-및-사용-예시">Git CLI (<code class="language-plaintext highlighter-rouge">git</code>)와의 차이점 및 사용 예시</h2>

<p>GitHub CLI (<code class="language-plaintext highlighter-rouge">gh</code>)는 Git의 명령줄 인터페이스 (<code class="language-plaintext highlighter-rouge">git</code>)와는 다릅니다. <code class="language-plaintext highlighter-rouge">git</code>은 로컬 또는 원격 Git 저장소 (어디에서든 호스팅될 수 있음)와 작업하는 데 사용되는 반면, <code class="language-plaintext highlighter-rouge">gh</code>는 GitHub 및 해당 기능과 상호작용하도록 특별히 설계되었습니다.</p>

<p>두 도구는 목적이 다르지만, GitHub에서 프로젝트를 관리할 때는 상호 보완적으로 사용됩니다.</p>

<h3 id="git-명령어-로컬-저장소-및-일반적인-git-작업"><code class="language-plaintext highlighter-rouge">git</code> 명령어 (로컬 저장소 및 일반적인 Git 작업)</h3>

<p><code class="language-plaintext highlighter-rouge">git</code> 명령어는 주로 로컬 저장소의 변경 사항을 추적하고, 커밋하며, 브랜치를 관리하고, 원격 저장소와 동기화하는 데 사용됩니다.</p>

<ul>
  <li><strong>저장소 초기화</strong>:
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git init
</code></pre></div>    </div>
  </li>
  <li><strong>파일 변경사항 스테이징</strong>:
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git add <span class="nb">.</span>
</code></pre></div>    </div>
  </li>
  <li><strong>변경사항 커밋</strong>:
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git commit <span class="nt">-m</span> <span class="s2">"feat: 새로운 기능 추가"</span>
</code></pre></div>    </div>
  </li>
  <li><strong>원격 저장소에서 변경사항 가져오기</strong>:
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git pull origin main
</code></pre></div>    </div>
  </li>
  <li><strong>원격 저장소로 변경사항 푸시</strong>:
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git push origin main
</code></pre></div>    </div>
  </li>
  <li><strong>브랜치 생성 및 전환</strong>:
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git checkout <span class="nt">-b</span> feature/new-feature
</code></pre></div>    </div>
  </li>
</ul>

<h3 id="gh-명령어-github-특정-기능-및-워크플로우"><code class="language-plaintext highlighter-rouge">gh</code> 명령어 (GitHub 특정 기능 및 워크플로우)</h3>

<p><code class="language-plaintext highlighter-rouge">gh</code> 명령어는 GitHub 플랫폼의 기능을 터미널에서 직접 활용하여 개발 워크플로우를 간소화하는 데 중점을 둡니다.</p>

<ul>
  <li><strong>GitHub 저장소 생성</strong>:
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gh repo create my-new-repo <span class="nt">--public</span>
</code></pre></div>    </div>
    <p>(이는 <code class="language-plaintext highlighter-rouge">git init</code> 후 원격 저장소를 추가하고 첫 푸시하는 과정을 대체할 수 있습니다.)</p>
  </li>
  <li><strong>이슈 목록 조회</strong>:
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gh issue list
</code></pre></div>    </div>
  </li>
  <li><strong>새로운 풀 리퀘스트 생성</strong>:
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gh <span class="nb">pr </span>create <span class="nt">--title</span> <span class="s2">"feat: Add user authentication"</span> <span class="nt">--body</span> <span class="s2">"사용자 인증 기능 추가"</span>
</code></pre></div>    </div>
    <p>(이는 <code class="language-plaintext highlighter-rouge">git push</code> 후 웹에서 PR을 생성하는 과정을 대체합니다.)</p>
  </li>
  <li><strong>풀 리퀘스트 확인 및 병합</strong>:
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gh <span class="nb">pr </span>checkout 123 <span class="c"># 123번 PR 브랜치로 전환</span>
gh <span class="nb">pr </span>merge 123 <span class="nt">--merge</span> <span class="c"># 123번 PR 병합</span>
</code></pre></div>    </div>
  </li>
  <li><strong>GitHub Actions 워크플로우 실행</strong>:
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gh run watch
</code></pre></div>    </div>
  </li>
</ul>

<h3 id="결론">결론</h3>

<p><code class="language-plaintext highlighter-rouge">git</code>은 코드 버전 관리에 필수적인 도구이며, <code class="language-plaintext highlighter-rouge">gh</code>는 GitHub 플랫폼의 강력한 기능을 터미널에서 편리하게 사용할 수 있도록 돕는 보조 도구입니다. 두 도구를 함께 사용하면 로컬 개발 환경과 GitHub 원격 저장소 간의 상호작용을 훨씬 효율적으로 관리할 수 있습니다.</p>

<h2 id="지원-운영체제">지원 운영체제</h2>

<p>GitHub CLI는 Windows, macOS, Linux 운영 체제에서 사용할 수 있습니다.</p>]]></content><author><name>한대승</name><email>hoksi3k@gmail.com</email></author><category term="GitHub" /><category term="CLI" /><category term="gh" /><category term="GitHub CLI" /><category term="터미널" /><category term="개발도구" /><summary type="html"><![CDATA[개발 워크플로우를 터미널에서 직접 관리하고 싶으신가요? GitHub CLI(gh)는 터미널에서 GitHub의 모든 기능을 손쉽게 사용할 수 있도록 돕는 강력한 도구입니다. 풀 리퀘스트, 이슈, GitHub Actions 등 다양한 작업을 명령줄에서 바로 처리하여 생산성을 극대화할 수 있습니다.]]></summary></entry><entry><title type="html">바이브 코딩: AI 시대의 새로운 코딩 패러다임과 개발자의 역할 변화</title><link href="https://hoksi.github.io/%EA%B0%9C%EB%B0%9C/ai/%ED%8A%B8%EB%A0%8C%EB%93%9C/vibe-coding/" rel="alternate" type="text/html" title="바이브 코딩: AI 시대의 새로운 코딩 패러다임과 개발자의 역할 변화" /><published>2025-07-24T03:05:00+00:00</published><updated>2025-07-24T03:05:00+00:00</updated><id>https://hoksi.github.io/%EA%B0%9C%EB%B0%9C/ai/%ED%8A%B8%EB%A0%8C%EB%93%9C/vibe-coding</id><content type="html" xml:base="https://hoksi.github.io/%EA%B0%9C%EB%B0%9C/ai/%ED%8A%B8%EB%A0%8C%EB%93%9C/vibe-coding/"><![CDATA[<p>코딩, 이제는 ‘바이브’로 통한다? 최근 소프트웨어 개발 분야에서 <strong>“바이브 코딩(Vibe Coding)”</strong>이라는 새로운 용어가 주목받고 있습니다. OpenAI의 공동 창립자이자 전 테슬라 AI 책임자인 <strong>안드레이 카파시(Andrej Karpathy)</strong>가 2025년 2월에 처음 제시한 이 개념은, 생성형 인공지능(Generative AI), 특히 대규모 언어 모델(LLM)의 도움을 받아 자연어 프롬프트로부터 코드를 직관적으로 생성하는 방식을 의미합니다.</p>

<h2 id="바이브-코딩이란">바이브 코딩이란?</h2>

<p>바이브 코딩은 개발자가 복잡한 프로그래밍 언어의 문법이나 세부 구현 로직에 깊이 몰두하기보다는, 일상적인 언어로 원하는 기능이나 아이디어를 AI에게 설명하고 AI가 생성한 코드를 검토하고 수정하는 방식으로 개발을 진행하는 패러다임입니다. 이는 마치 음악의 ‘바이브’를 느끼듯 직관적으로 코드를 완성해 나가는 과정에 비유됩니다. 또한, AI를 단순한 도구가 아닌 ‘아르바이트생’처럼 업무를 위임하고, 효과적인 활용을 위해 체계적인 업무 지시와 검토가 중요합니다.</p>

<h3 id="주요-특징">주요 특징</h3>

<ul>
  <li><strong>자연어 기반 코딩</strong>: 개발자가 자연어로 요구사항을 제시하면 AI가 코드를 생성합니다.</li>
  <li><strong>AI와의 협업</strong>: AI가 코드 작성의 상당 부분을 담당하며, 개발자는 아이디어 구상, 프롬프트 설계, 생성된 코드 검토 및 수정에 집중합니다.</li>
  <li><strong>생산성 향상</strong>: AI가 반복적이거나 낮은 수준의 코드를 자동으로 생성하여 개발 속도를 높이고 프로토타이핑에 특히 효과적입니다.</li>
  <li><strong>진입 장벽 완화</strong>: 프로그래밍 지식이 부족한 비전문가도 아이디어만으로 소프트웨어를 개발할 수 있는 가능성을 열어줍니다.</li>
</ul>

<h2 id="바이브-코딩의-장점">바이브 코딩의 장점</h2>

<ol>
  <li><strong>생산성 극대화</strong>: AI가 boilerplate 코드나 일반적인 패턴을 자동으로 생성해주므로, 개발자는 핵심 비즈니스 로직과 창의적인 문제 해결에 더 집중할 수 있습니다.</li>
  <li><strong>개발 속도 단축</strong>: AI의 빠른 코드 생성 능력 덕분에 전체 개발 주기가 단축되어 더 빠른 프로토타이핑 및 제품 출시가 가능해집니다.</li>
  <li><strong>새로운 기술 학습 지원</strong>: 익숙하지 않은 언어나 프레임워크를 사용할 때 AI의 코드 제안을 통해 빠르게 학습하고 적용할 수 있습니다.</li>
  <li><strong>오류 감소</strong>: AI가 문법적 오류나 일반적인 버그를 줄이는 데 도움을 줄 수 있습니다.</li>
</ol>

<h2 id="바이브-코딩-관련-주요-상품-및-서비스">바이브 코딩 관련 주요 상품 및 서비스</h2>

<p>바이브 코딩을 가능하게 하는 핵심 도구는 AI 기반 코드 생성 및 자동 완성 서비스입니다. 대표적인 서비스는 다음과 같습니다.</p>

<h3 id="1-github-copilot">1. GitHub Copilot</h3>

<p>GitHub, OpenAI, Microsoft가 협력하여 개발한 AI 페어 프로그래머입니다. IDE(통합 개발 환경)에 확장 프로그램 형태로 통합되어 작동하며, 실시간 코드 제안, 코드 완성, 채팅 인터페이스를 통한 질의응답 등의 기능을 제공합니다.</p>

<ul>
  <li><strong>주요 기능</strong>: 실시간 코드 제안 및 완성, Copilot Chat (IDE 내 대화형 AI), Copilot Edits (자연어 명령으로 코드 변경), Agent 모드 (자율적인 작업 수행), CLI 통합.</li>
  <li><strong>지원 IDE</strong>: Visual Studio Code, Visual Studio, Vim, Neovim, JetBrains IDEs 등 다양한 환경을 지원합니다.</li>
</ul>

<h3 id="2-cursor">2. Cursor</h3>

<p>Anysphere Inc.에서 개발한 독점적인 AI 기반 IDE입니다. Visual Studio Code를 포크하여 AI 기능을 직접 통합한 것이 특징입니다.</p>

<ul>
  <li><strong>주요 기능</strong>: AI 기반 코드 생성 및 수정, 코드베이스 쿼리 (자연어로 코드베이스 검색), 스마트 리라이트 (여러 줄 코드 동시 업데이트), 에이전트 모드, 통합 채팅, 터미널 명령 생성, 오류 감지 및 수정.</li>
  <li><strong>특징</strong>: GPT-4, Claude, Gemini 등 다양한 대규모 언어 모델(LLM)을 지원합니다.</li>
</ul>

<h3 id="3-claude-code">3. Claude Code</h3>

<p>Anthropic이 개발한 AI 어시스턴트인 Claude의 코딩 관련 기능입니다. 코드 생성, 디버깅, 복잡한 프로그래밍 개념 설명, 작동하는 프로토타입 생성 등 다양한 코딩 작업을 수행할 수 있습니다.</p>

<ul>
  <li><strong>주요 기능</strong>: 코드 생성 및 디버깅, 자율 코딩 (복잡한 코드베이스 이해 및 자율 코딩), 에이전트형 명령줄 도구 (터미널 내 코딩 작업 위임), 코드베이스 이해, IDE 통합.</li>
  <li><strong>특징</strong>: Claude Opus 4, Claude Sonnet 4, Claude Haiku 3.5 등 다양한 Claude 모델과 함께 작동합니다.</li>
</ul>

<h3 id="4-gemini-cli">4. Gemini CLI</h3>

<p>Google에서 개발한 대규모 언어 모델 Gemini를 기반으로 하는 CLI(Command Line Interface) 에이전트입니다. 소프트웨어 엔지니어링 작업을 돕기 위해 설계되었으며, 코드 읽기, 수정, 파일 시스템 조작, 쉘 명령 실행 등 다양한 작업을 수행할 수 있습니다.</p>

<ul>
  <li><strong>주요 기능</strong>: 코드 분석 및 수정, 파일 시스템 조작 (읽기, 쓰기, 삭제), 쉘 명령 실행, 웹 검색, 라이브러리 문서 검색.</li>
  <li><strong>특징</strong>: 사용자 요청에 따라 코드를 분석하고, 계획을 수립하며, 직접 코드를 수정하거나 파일을 생성/삭제하는 등 자율적인 작업 수행이 가능합니다.</li>
</ul>

<p><strong>GitHub Copilot과 Cursor의 차이점</strong>: GitHub Copilot은 기존 IDE에 AI 기능을 추가하는 확장 프로그램인 반면, Cursor는 AI 기능을 핵심으로 하는 독립적인 IDE입니다. Copilot은 코드 완성 및 채팅 기능에 중점을 두며 다양한 IDE에서 유연하게 사용할 수 있습니다. 반면 Cursor는 VS Code를 기반으로 더 깊은 AI 통합과 코드베이스 전체에 대한 이해를 제공하며, 복잡한 프로젝트와 고급 AI 기능에 더 적합합니다.</p>

<h2 id="비판과-한계점">비판과 한계점</h2>

<p>바이브 코딩은 혁신적인 잠재력에도 불구하고 여러 비판과 한계점을 가지고 있습니다.</p>

<ol>
  <li><strong>비판적 사고 저해</strong>: 개발자가 코드의 내부 동작 원리나 최적화 방안을 깊이 고민하지 않고 AI의 제안을 맹목적으로 수용하게 될 수 있습니다. 이는 문제 해결 능력과 디버깅 능력 저하로 이어질 수 있습니다.</li>
  <li><strong>기술 부채 유발</strong>: AI가 생성한 코드가 항상 최적화되거나 프로젝트의 아키텍처에 완벽하게 부합하지 않을 수 있습니다. 이로 인해 장기적으로 유지보수가 어렵거나 성능 문제가 발생하는 ‘기술 부채’가 쌓일 수 있습니다.</li>
  <li><strong>초보 개발자의 성장 저해</strong>: 코딩의 기초를 다지는 과정에서 AI에 과도하게 의존할 경우, 근본적인 프로그래밍 개념과 문제 해결 능력을 스스로 습득할 기회를 잃을 수 있습니다.</li>
  <li><strong>품질 및 보안 문제</strong>: AI가 생성한 코드의 품질이 항상 보장되지 않을 수 있으며, 학습 데이터에 따라 보안 취약점이 있는 코드를 제안하거나 저작권 문제가 있는 코드를 생성할 가능성도 있습니다.</li>
  <li><strong>AI 추론의 한계</strong>: AI 모델이 문제를 오래 ‘생각’한다고 해서 반드시 더 나은 답을 내놓는 것은 아니며, 오히려 성능이 저하되는 ‘역스케일링’ 현상이 관찰될 수 있습니다. 또한, 관련 없는 정보가 섞이면 AI가 혼란스러워하며 잘못된 결과를 도출할 수 있습니다.</li>
</ol>

<h2 id="개발자의-역할-변화">개발자의 역할 변화</h2>

<p>바이브 코딩의 등장은 개발자의 역할 변화를 요구합니다. 이제 개발자는 단순히 코드를 타이핑하는 것을 넘어, AI와 효과적으로 소통하고, AI가 생성한 코드를 비판적으로 검토하며, 전체 시스템의 아키텍처와 품질을 책임지는 역할로 진화해야 합니다.</p>

<ul>
  <li><strong>프롬프트 엔지니어링</strong>: AI에게 명확하고 구체적인 지시를 내려 원하는 품질의 코드를 얻어내는 능력이 중요해지며, 미래에는 프롬프트 활용 능력을 갖춘 주니어 개발자의 가치가 높아질 것입니다.</li>
  <li><strong>코드 검토 및 리팩토링</strong>: AI가 생성한 코드를 그대로 사용하기보다는, 프로젝트의 구조와 스타일에 맞게 모듈화하고 리팩토링하는 과정을 거쳐야 합니다.</li>
  <li><strong>시스템 설계 및 아키텍처</strong>: AI는 코드 조각을 생성하지만, 전체 시스템을 설계하고 아키텍처를 구성하는 능력은 여전히 개발자의 몫이며, 미래에는 시스템 설계 능력을 가진 시니어 아키텍트의 가치가 높아질 것입니다.</li>
</ul>

<h2 id="결론">결론</h2>

<p>바이브 코딩은 AI 시대에 개발 생산성을 혁신할 수 있는 강력한 도구입니다. 하지만 그 이면에는 개발자의 역량 저하와 기술 부채 증가라는 위험도 존재합니다. AI를 단순한 코드 생성기가 아닌, 개발자의 역량을 보완하고 확장하는 강력한 도구로 인식하고 현명하게 활용하는 것이 중요합니다. 결국, AI 시대의 개발자는 ‘바이브’뿐만 아니라 ‘이해’와 ‘비판적 사고’를 겸비하여 AI와 협력하는 새로운 개발 패러다임을 이끌어 나가야 할 것입니다.</p>]]></content><author><name>한대승</name><email>hoksi3k@gmail.com</email></author><category term="개발" /><category term="AI" /><category term="트렌드" /><category term="바이브코딩" /><category term="AI코딩" /><category term="AndrejKarpathy" /><category term="LLM" /><category term="개발생산성" /><category term="기술부채" /><category term="개발자역할" /><category term="GitHubCopilot" /><category term="Cursor" /><summary type="html"><![CDATA[코딩, 이제는 ‘바이브’로 통한다? 최근 소프트웨어 개발 분야에서 “바이브 코딩(Vibe Coding)”이라는 새로운 용어가 주목받고 있습니다. OpenAI의 공동 창립자이자 전 테슬라 AI 책임자인 안드레이 카파시(Andrej Karpathy)가 2025년 2월에 처음 제시한 이 개념은, 생성형 인공지능(Generative AI), 특히 대규모 언어 모델(LLM)의 도움을 받아 자연어 프롬프트로부터 코드를 직관적으로 생성하는 방식을 의미합니다.]]></summary></entry><entry><title type="html">Flutter 게임 엔진 Flame: 크로스 플랫폼 2D 게임 개발의 시작</title><link href="https://hoksi.github.io/%EA%B2%8C%EC%9E%84/%EA%B0%9C%EB%B0%9C/flutter/flutter-game-engine-flame/" rel="alternate" type="text/html" title="Flutter 게임 엔진 Flame: 크로스 플랫폼 2D 게임 개발의 시작" /><published>2025-07-24T02:45:00+00:00</published><updated>2025-07-24T02:45:00+00:00</updated><id>https://hoksi.github.io/%EA%B2%8C%EC%9E%84/%EA%B0%9C%EB%B0%9C/flutter/flutter-game-engine-flame</id><content type="html" xml:base="https://hoksi.github.io/%EA%B2%8C%EC%9E%84/%EA%B0%9C%EB%B0%9C/flutter/flutter-game-engine-flame/"><![CDATA[<p>모바일, 웹, 데스크톱 등 다양한 플랫폼에서 2D 게임을 개발하고 싶으신가요? 그렇다면 <strong>Flutter 게임 엔진 Flame</strong>이 훌륭한 선택지가 될 수 있습니다. Flame은 Google의 UI 툴킷인 Flutter를 기반으로 하여, Flutter의 강력한 크로스 플랫폼 기능을 게임 개발에 그대로 활용할 수 있도록 돕습니다.</p>

<h2 id="flame-엔진이란">Flame 엔진이란?</h2>

<p>Flame은 Flutter 위에 구축된 경량의 2D 게임 엔진입니다. Dart 언어를 사용하여 게임 로직을 작성하며, Flutter의 위젯 시스템과 통합되어 유연하고 효율적인 게임 개발 환경을 제공합니다. 단일 코드베이스로 iOS, Android, 웹, 데스크톱 등 다양한 플랫폼에 게임을 배포할 수 있다는 점이 가장 큰 장점입니다.</p>

<h2 id="flame의-주요-특징-및-기능">Flame의 주요 특징 및 기능</h2>

<ul>
  <li><strong>크로스 플랫폼 개발</strong>: Flutter의 강점을 그대로 이어받아, 한 번의 코딩으로 여러 플랫폼에서 게임을 실행할 수 있습니다.</li>
  <li><strong>모듈식 설계</strong>: Flame은 핵심 게임 루프, 컴포넌트 시스템, 렌더링, 입력 처리 등 독립적인 모듈로 구성되어 있어 필요한 기능만 선택적으로 사용할 수 있습니다.</li>
  <li><strong>컴포넌트 시스템 (FCS)</strong>: 게임 객체를 컴포넌트 기반으로 구성하고 관리할 수 있어 코드의 재사용성과 유지보수성을 높입니다.</li>
  <li><strong>애니메이션 및 스프라이트</strong>: 스프라이트, 스프라이트 시트, 애니메이션을 쉽게 구현할 수 있는 기능을 제공하여 캐릭터와 오브젝트의 움직임을 생동감 있게 표현할 수 있습니다.</li>
  <li><strong>충돌 감지</strong>: 게임 내 객체 간의 상호작용을 위한 효율적인 충돌 감지 시스템을 내장하고 있습니다.</li>
  <li><strong>물리 엔진 통합</strong>: Forge2D와 같은 물리 엔진과의 통합을 지원하여 사실적인 움직임과 물리적 상호작용을 구현할 수 있습니다.</li>
  <li><strong>입력 처리</strong>: 터치, 키보드, 마우스 등 다양한 입력 방식을 유연하게 처리할 수 있습니다.</li>
  <li><strong>오디오 관리</strong>: 게임 내 배경 음악 및 효과음을 쉽게 관리하고 재생할 수 있습니다.</li>
  <li><strong>파티클 시스템</strong>: 다양한 시각 효과를 위한 파티클 시스템을 지원합니다.</li>
</ul>

<h2 id="flame의-장점">Flame의 장점</h2>

<ul>
  <li><strong>Flutter 개발자와의 시너지</strong>: 이미 Flutter 개발 경험이 있다면 Flame을 빠르게 학습하고 게임 개발에 적용할 수 있습니다.</li>
  <li><strong>간단한 시작</strong>: 복잡한 설정 없이 Flutter 프로젝트에 Flame을 추가하여 바로 게임 개발을 시작할 수 있습니다.</li>
  <li><strong>경량성 및 성능</strong>: 다른 대규모 게임 엔진에 비해 가볍고, Flutter의 성능 최적화 덕분에 부드러운 게임 플레이를 제공합니다.</li>
  <li><strong>활발한 커뮤니티</strong>: 지속적인 업데이트와 활발한 커뮤니티 지원을 통해 문제 해결 및 정보 공유가 용이합니다.</li>
</ul>

<h2 id="flame으로-만들-수-있는-게임">Flame으로 만들 수 있는 게임</h2>

<p>Flame은 주로 2D 게임 개발에 특화되어 있으며, 다음과 같은 유형의 게임에 적합합니다:</p>

<ul>
  <li>캐주얼 게임</li>
  <li>아케이드 게임</li>
  <li>플랫폼 게임</li>
  <li>슈팅 게임</li>
  <li>퍼즐 게임</li>
  <li>비주얼 노벨 (간단한 2D 애니메이션과 함께)</li>
</ul>

<p>Flame은 Flutter의 강력한 생태계와 크로스 플랫폼 개발의 이점을 활용하여 2D 게임 개발을 시작하려는 개발자들에게 매우 매력적인 선택입니다. Unity나 Godot와 같은 3D 게임 엔진과는 목적이 다르므로, 2D 게임 개발에 집중하고자 할 때 그 진가를 발휘합니다.</p>]]></content><author><name>한대승</name><email>hoksi3k@gmail.com</email></author><category term="게임" /><category term="개발" /><category term="Flutter" /><category term="Flutter" /><category term="Flame" /><category term="GameEngine" /><category term="2DGame" /><category term="CrossPlatform" /><summary type="html"><![CDATA[모바일, 웹, 데스크톱 등 다양한 플랫폼에서 2D 게임을 개발하고 싶으신가요? 그렇다면 Flutter 게임 엔진 Flame이 훌륭한 선택지가 될 수 있습니다. Flame은 Google의 UI 툴킷인 Flutter를 기반으로 하여, Flutter의 강력한 크로스 플랫폼 기능을 게임 개발에 그대로 활용할 수 있도록 돕습니다.]]></summary></entry></feed>