<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>::: newtype의 지식창고 :::</title>
    <link>https://newtype.tistory.com/</link>
    <description>지극히 개인적인 지식의 창고</description>
    <language>ko</language>
    <pubDate>Sun, 24 May 2026 13:18:05 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>newtype</managingEditor>
    <item>
      <title>Mac&amp;nbsp;mini 에 openclaw 설치기.</title>
      <link>https://newtype.tistory.com/entry/Mac-mini-%EC%97%90-openclaw-%EC%84%A4%EC%B9%98%EA%B8%B0</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;내 봇이 멍청하다.&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;처음에 설치하고 원인 모를 오동작, 멍청한 답변 토해냈다.&lt;/li&gt;
&lt;li&gt;mac mini 기본형에 ollama를 올려서 local LLM을 사용한 것이 잘못된 선택이었다.&lt;/li&gt;
&lt;li&gt;무조건 LLM api키를 받아서 연동해야하며 비싼 모델일수록 똑똑해진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;openclaw-bundled 스킬들이 제대로 동작하지 않는다&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최초 설치를 npm으로 했는데, 뭔가 경로가 꼬였는지, summarize 등을 실행하지 못해서 유튜브 요약등이 동작하지 않았다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;curl -fsSL https://openclaw.ai/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위 명령으로 해결했다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;토큰 불일치 오류&lt;/h2&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;% openclaw gateway status
 gateway connect failed: Error: unauthorized: device token mismatch (rotate/reissue device token)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;몇 번 재설치를 하다보니, gateway 상태를 보면 토큰 불일치 오류가 발생했다.&lt;/li&gt;
&lt;li&gt;이 상태에선 cron 등록등 여러 가지 기능이 동작하지 않는다.&lt;/li&gt;
&lt;li&gt;설치하면 gateway 토큰이 openclaw.json 에도 저장되는데, osx의 launchctl(linux의 systemd)의 plist 파일에도 저장된다. - 이걸 몰라서 한참 고생함.&lt;/li&gt;
&lt;li&gt;openclaw.json의 token을 복사해서, launchctl plist파일에도 수정해줘야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;gauss&quot;&gt;&lt;code&gt;% grep token ~/.openclaw/openclaw.json
      &quot;token&quot;: &quot;토큰 문자열&quot;

% grep -A 1 TOKEN ~/Library/LaunchAgents/ai.openclaw.gateway.plist
    &amp;lt;key&amp;gt;OPENCLAW_GATEWAY_TOKEN&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;토큰 문자열&amp;lt;/string&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;web_search가 동작하지 않는다.&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;번들은 web_search는 brave_api_key를 필요로 하는데, api 발급을 받으려 해도 무료 플랜이 사라졌다.&lt;/li&gt;
&lt;li&gt;&lt;a title=&quot;https://clawhub.ai&quot; href=&quot;https://clawhub.ai&quot;&gt;clawhub.ai&lt;/a&gt; 에서 설치해도 되는데, 왠지 꺼림직해서 직접 만들었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;% cat ~/.openclaw/workspace/skills/ddg-search/SKILL.md
---
name: ddg-search
description: |
  DuckDuckGo-based web search without requiring API keys. Use this skill whenever the user asks to search the web, find information online, look up current events, or needs any information that might be on the internet. Triggers include: &quot;검색해줘&quot;, &quot;찾아봐&quot;, &quot;search for&quot;, &quot;look up&quot;, &quot;find information about&quot;, or any request for web/online information. This skill is ALWAYS preferred over web_search (which requires Brave API key). Use it liberally - if there's any chance the answer is online, use this skill.
compatibility:
  tools_required:
    - Bash
  dependencies:
    - duckduckgo-search (Python package)
---

# DuckDuckGo Search Skill

Fast, API-key-free web search using DuckDuckGo.

## When to Use

- User asks to search the web (&quot;검색해줘&quot;, &quot;찾아봐&quot;, &quot;search for X&quot;)
- Looking up current information, news, or facts
- Finding websites, documentation, or resources
- Any query that might benefit from web search

## Usage

```bash
python3 ~/.openclaw/workspace/skills/ddg-search/scripts/search.py &quot;검색어&quot; --max-results 5
```

## Output Format

Returns JSON:
```json
{
  &quot;query&quot;: &quot;search query&quot;,
  &quot;results&quot;: [
    {
      &quot;title&quot;: &quot;Result title&quot;,
      &quot;url&quot;: &quot;https://example.com&quot;,
      &quot;snippet&quot;: &quot;Description of the result&quot;
    }
  ],
  &quot;count&quot;: 5
}
```

## Examples

### Search for Python latest version
```bash
python3 scripts/search.py &quot;Python latest version&quot; --max-results 5
```

### Search in Korean
```bash
python3 scripts/search.py &quot;파이썬 최신 버전&quot; --max-results 5
```

## Installation

```bash
pip install ddgs --break-system-packages
```

## Notes

- No API key required
- Returns up to specified max results (default: 5)
- Works with any language
- Safe for frequent use (no rate limits with API keys)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;% cat ~/.openclaw/workspace/skills/ddg-search/scripts/search.py
#!/usr/bin/env python3
&quot;&quot;&quot;
DuckDuckGo Search Script for OpenClaw
No API key required - uses ddgs package
&quot;&quot;&quot;

import sys
import json
import argparse
from typing import List, Dict

try:
    from ddgs import DDGS
except ImportError:
    print(json.dumps({
        &quot;error&quot;: &quot;ddgs 패키지가 설치되지 않았습니다&quot;,
        &quot;install&quot;: &quot;pip install ddgs --break-system-packages&quot;,
        &quot;results&quot;: []
    }), file=sys.stderr)
    sys.exit(1)

def search_ddg(query: str, max_results: int = 5) -&amp;gt; List[Dict[str, str]]:
    &quot;&quot;&quot;
    Search DuckDuckGo and return results

    Args:
        query: Search query string
        max_results: Maximum number of results to return

    Returns:
        List of dictionaries with title, url, and snippet
    &quot;&quot;&quot;
    results = []

    try:
        with DDGS() as ddgs:
            search_results = ddgs.text(query, max_results=max_results)

            for result in search_results:
                results.append({
                    &quot;title&quot;: result.get(&quot;title&quot;, &quot;&quot;),
                    &quot;url&quot;: result.get(&quot;href&quot;, &quot;&quot;),
                    &quot;snippet&quot;: result.get(&quot;body&quot;, &quot;&quot;)
                })

    except Exception as e:
        error_msg = {
            &quot;error&quot;: str(e),
            &quot;query&quot;: query,
            &quot;results&quot;: []
        }
        print(json.dumps(error_msg, ensure_ascii=False, indent=2), file=sys.stderr)
        return []

    return results

def main():
    parser = argparse.ArgumentParser(
        description='Search DuckDuckGo without API keys'
    )
    parser.add_argument(
        'query',
        type=str,
        help='Search query'
    )
    parser.add_argument(
        '--max-results',
        type=int,
        default=5,
        help='Maximum number of results (default: 5)'
    )

    args = parser.parse_args()

    # Perform search
    results = search_ddg(args.query, args.max_results)

    # Output JSON
    output = {
        &quot;query&quot;: args.query,
        &quot;results&quot;: results,
        &quot;count&quot;: len(results)
    }

    print(json.dumps(output, ensure_ascii=False, indent=2))

if __name__ == &quot;__main__&quot;:
    main()
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Dev/AI</category>
      <category>openclaw</category>
      <author>newtype</author>
      <guid isPermaLink="true">https://newtype.tistory.com/491</guid>
      <comments>https://newtype.tistory.com/entry/Mac-mini-%EC%97%90-openclaw-%EC%84%A4%EC%B9%98%EA%B8%B0#entry491comment</comments>
      <pubDate>Tue, 17 Feb 2026 21:24:34 +0900</pubDate>
    </item>
    <item>
      <title>이미지 세로 병합기</title>
      <link>https://newtype.tistory.com/entry/%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%84%B8%EB%A1%9C-%EB%B3%91%ED%95%A9%EA%B8%B0</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;원본: &lt;a href=&quot;https://github.com/lmk/appendImges&quot;&gt;https://github.com/lmk/appendImges&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h1&gt;이미지 세로 병합기&lt;/h1&gt;
&lt;p&gt;여러 이미지를 세로로 병합하여 하나의 긴 이미지로 만들어주는 웹 애플리케이션입니다.&lt;/p&gt;
&lt;h2&gt;기능&lt;/h2&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;: 파일명의 숫자를 인식하여 자연스럽게 정렬 (예: 1, 2, 10, 20)&lt;/li&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;미리보기&lt;/strong&gt;: 병합 전 각 이미지의 썸네일과 순서를 확인&lt;/li&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;다운로드&lt;/strong&gt;: 병합된 이미지를 PNG 형식으로 다운로드&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;사용 방법&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;appendImges.html&lt;/code&gt; 파일을 웹 브라우저에서 엽니다&lt;/li&gt;
&lt;li&gt;드롭 영역을 클릭하거나 이미지 파일들을 드래그하여 업로드합니다&lt;/li&gt;
&lt;li&gt;필요한 경우 이미지를 드래그하여 순서를 변경합니다&lt;/li&gt;
&lt;li&gt;불필요한 이미지는 &amp;#39;삭제&amp;#39; 버튼으로 제거합니다&lt;/li&gt;
&lt;li&gt;&amp;#39;이미지 병합하기&amp;#39; 버튼을 클릭합니다&lt;/li&gt;
&lt;li&gt;병합된 이미지를 확인하고 &amp;#39;다운로드&amp;#39; 버튼으로 저장합니다&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;기술 스택&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;HTML5&lt;/li&gt;
&lt;li&gt;CSS3&lt;/li&gt;
&lt;li&gt;JavaScript (Vanilla)&lt;/li&gt;
&lt;li&gt;Canvas API&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;특징&lt;/h2&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;개인정보 보호&lt;/strong&gt;: 이미지가 서버로 전송되지 않고 로컬에서만 처리됨&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;반응형 UI&lt;/strong&gt;: 직관적이고 사용하기 쉬운 인터페이스&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;브라우저 호환성&lt;/h2&gt;
&lt;p&gt;HTML5 Canvas API를 지원하는 모든 최신 브라우저에서 작동합니다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chrome&lt;/li&gt;
&lt;li&gt;Firefox&lt;/li&gt;
&lt;li&gt;Safari&lt;/li&gt;
&lt;li&gt;Edge&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Dev/Web</category>
      <category>이미지병합</category>
      <author>newtype</author>
      <guid isPermaLink="true">https://newtype.tistory.com/490</guid>
      <comments>https://newtype.tistory.com/entry/%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%84%B8%EB%A1%9C-%EB%B3%91%ED%95%A9%EA%B8%B0#entry490comment</comments>
      <pubDate>Mon, 5 Jan 2026 14:30:18 +0900</pubDate>
    </item>
    <item>
      <title>goCapture - Windows 화면 캡처 도구</title>
      <link>https://newtype.tistory.com/entry/goCapture-Windows-%ED%99%94%EB%A9%B4-%EC%BA%A1%EC%B2%98-%EB%8F%84%EA%B5%AC</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원본: &lt;a href=&quot;https://github.com/lmk/goCapture&quot;&gt;https://github.com/lmk/goCapture&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;goCapture - Windows 화면 캡처 도구&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Go 언어로 작성된 간단하고 효율적인 Windows 화면 캡처 도구입니다. 한 번 영역을 선택한 후, 다른 애플리케이션과 상호작용하면서 키 하나로 스크린샷을 캡처할 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주요 기능&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;영역 선택&lt;/b&gt;: &lt;code&gt;Ctrl&lt;/code&gt; 키를 누른 상태로 드래그하여 캡처 영역 선택/업데이트&lt;/li&gt;
&lt;li&gt;&lt;b&gt;백그라운드 통과&lt;/b&gt;: 오버레이는 클릭이 통과되어 애플리케이션과 정상적으로 상호작용 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;순차 번호&lt;/b&gt;: &lt;code&gt;capture_001.png&lt;/code&gt;, &lt;code&gt;capture_002.png&lt;/code&gt; 등으로 자동 저장&lt;/li&gt;
&lt;li&gt;&lt;b&gt;간단한 조작&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;Ctrl + 드래그&lt;/code&gt; - 캡처 영역 선택 또는 업데이트&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SPACE&lt;/code&gt; - 스크린샷 캡처&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ESC&lt;/code&gt; - 프로그램 종료&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;시스템 요구사항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Windows OS&lt;/li&gt;
&lt;li&gt;Go 1.21 이상&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 방법&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;이 저장소를 클론하거나 다운로드합니다&lt;/li&gt;
&lt;li&gt;의존성을 설치합니다:&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-bash&quot;&gt;go mod download&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;실행 파일을 빌드합니다:&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-bash&quot;&gt;go build -o goCapture.exe&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;사용 방법&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;프로그램을 실행합니다:&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-bash&quot;&gt;./goCapture.exe&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;반투명 오버레이가 화면에 나타납니다:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;Ctrl&lt;/code&gt; 키를 누른 상태로 마우스 왼쪽 버튼을 드래그하여 캡처할 영역을 선택합니다&lt;/li&gt;
&lt;li&gt;선택된 영역은 빨간색 테두리로 표시됩니다&lt;/li&gt;
&lt;li&gt;언제든지 &lt;code&gt;Ctrl + 드래그&lt;/code&gt;로 영역을 다시 선택할 수 있습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;영역이 선택된 상태에서:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;SPACE&lt;/code&gt; 키를 눌러 선택한 영역의 스크린샷을 캡처합니다&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ESC&lt;/code&gt; 키를 눌러 프로그램을 종료합니다&lt;/li&gt;
&lt;li&gt;다른 모든 마우스 클릭과 키보드 입력은 백그라운드 애플리케이션으로 전달됩니다&lt;/li&gt;
&lt;li&gt;창 전환, 스크롤, 버튼 클릭 등 모든 작업이 정상적으로 동작합니다!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;스크린샷은 현재 디렉토리에 다음과 같이 저장됩니다:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;capture_001.png&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;capture_002.png&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;capture_003.png&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;등등...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;사용 예시&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프레젠테이션이나 비디오에서 프레임 캡처&lt;/li&gt;
&lt;li&gt;문서를 읽으면서 여러 스크린샷 촬영&lt;/li&gt;
&lt;li&gt;단계별 튜토리얼용 화면 녹화 대안&lt;/li&gt;
&lt;li&gt;특정 UI 요소를 반복적으로 캡처&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기술 세부사항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Windows API를 사용한 키보드 훅 (저수준 키보드 훅)&lt;/li&gt;
&lt;li&gt;Windows API 마우스 훅을 사용하여 Ctrl+드래그 감지&lt;/li&gt;
&lt;li&gt;클릭 통과 오버레이를 위한 &lt;code&gt;WS_EX_TRANSPARENT&lt;/code&gt; 레이어드 윈도우 활용&lt;/li&gt;
&lt;li&gt;스크린샷 라이브러리: &lt;code&gt;github.com/kbinani/screenshot&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Space와 ESC를 제외한 모든 키와 마우스 이벤트는 시스템으로 전달되어 정상적인 상호작용 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;소스에서 빌드하기&lt;/h2&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# 의존성 설치
go mod download

# Windows용 빌드 (콘솔 창 없음)
go build -ldflags=&quot;-H windowsgui&quot; -o goCapture.exe

# 콘솔 창 포함 빌드 (디버깅용)
go build -o goCapture.exe&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 해결&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로그램이 시작되지 않음:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Windows에서 실행 중인지 확인하세요&lt;/li&gt;
&lt;li&gt;권한 문제가 있는 경우 관리자 권한으로 실행해보세요&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;스크린샷이 검은색으로 나옴:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일부 애플리케이션은 하드웨어 오버레이를 사용하여 캡처할 수 없습니다&lt;/li&gt;
&lt;li&gt;전체 화면 대신 창 모드로 대상 애플리케이션을 실행해보세요&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Ctrl+드래그가 작동하지 않음:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;관리자 권한으로 프로그램을 실행해보세요&lt;/li&gt;
&lt;li&gt;일부 보안 소프트웨어가 키보드/마우스 훅을 차단할 수 있습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;키가 통과되지 않음:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Space와 ESC만 프로그램에서 캡처합니다&lt;/li&gt;
&lt;li&gt;다른 모든 키는 정상적으로 통과되어야 합니다&lt;/li&gt;
&lt;li&gt;문제가 지속되면 관리자 권한으로 실행해보세요&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Dev/Go</category>
      <category>Capture</category>
      <category>go</category>
      <category>goCapture</category>
      <category>캡쳐</category>
      <author>newtype</author>
      <guid isPermaLink="true">https://newtype.tistory.com/489</guid>
      <comments>https://newtype.tistory.com/entry/goCapture-Windows-%ED%99%94%EB%A9%B4-%EC%BA%A1%EC%B2%98-%EB%8F%84%EA%B5%AC#entry489comment</comments>
      <pubDate>Mon, 5 Jan 2026 14:28:40 +0900</pubDate>
    </item>
    <item>
      <title>Git Worktree로 작업 효율성 높이기</title>
      <link>https://newtype.tistory.com/entry/Git-Worktree%EB%A1%9C-%EC%9E%91%EC%97%85-%ED%9A%A8%EC%9C%A8%EC%84%B1-%EB%86%92%EC%9D%B4%EA%B8%B0</link>
      <description>&lt;h1&gt;Git Worktree로 작업 효율성 높이기&lt;/h1&gt;
&lt;h2&gt;Git Worktree란?&lt;/h2&gt;
&lt;p&gt;Git Worktree는 하나의 저장소에서 여러 브랜치를 동시에 체크아웃할 수 있게 해주는 Git의 강력한 기능입니다. 일반적으로 Git 저장소는 한 번에 하나의 브랜치만 체크아웃할 수 있지만, worktree를 사용하면 여러 작업 디렉토리를 만들어 각각 다른 브랜치에서 작업할 수 있습니다.&lt;/p&gt;
&lt;p&gt;모든 worktree는 동일한 &lt;code&gt;.git&lt;/code&gt; 디렉토리를 공유하므로, 저장소를 여러 번 클론할 필요 없이 효율적으로 여러 작업을 병렬로 진행할 수 있습니다.&lt;/p&gt;
&lt;h2&gt;기존 방식의 한계와 불편함&lt;/h2&gt;
&lt;p&gt;Worktree를 사용하지 않을 때 여러 작업을 전환하려면 &lt;code&gt;stash&lt;/code&gt;, &lt;code&gt;checkout&lt;/code&gt; 등의 명령어를 반복적으로 사용해야 합니다. 실제 시나리오를 통해 이런 불편함을 살펴보겠습니다.&lt;/p&gt;
&lt;h3&gt;시나리오: 기능 개발 중 긴급 수정 요청 발생&lt;/h3&gt;
&lt;p&gt;새로운 기능을 개발하는 &lt;code&gt;feature/user-service&lt;/code&gt; 브랜치에서 작업 중이라고 가정해봅시다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# feature/user-service 브랜치에서 작업 중
$ git checkout feature/user-service
$ vim user_handler.go  # 코드 수정 중...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이때 갑자기 운영팀에서 긴급 버그 수정 요청이 들어왔습니다. 기존 방식으로는 다음과 같은 절차를 거쳐야 합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 1. 현재 작업 내용을 stash에 임시 저장
$ git stash save &amp;quot;WIP: user service refactoring&amp;quot;
Saved working directory and index state On feature/user-service: WIP: user service refactoring

# 2. main 브랜치로 이동
$ git checkout main
Switched to branch &amp;#39;main&amp;#39;

# 3. 긴급 수정을 위한 새 브랜치 생성
$ git checkout -b hotfix/auth-panic
Switched to a new branch &amp;#39;hotfix/auth-panic&amp;#39;

# 4. 버그 수정 작업
$ vim auth.go
$ git add auth.go
$ git commit -m &amp;quot;Fix nil pointer panic in auth middleware&amp;quot;

# 5. main에 머지
$ git checkout main
$ git merge hotfix/auth-panic

# 6. 다시 원래 작업으로 돌아가기
$ git checkout feature/user-service

# 7. stash했던 작업 내용 복원
$ git stash pop
# 충돌이 발생할 수 있음!&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;문제점&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;컨텍스트 스위칭 오버헤드&lt;/strong&gt;: 브랜치를 전환할 때마다 작업 디렉토리의 파일들이 변경되어 IDE나 빌드 시스템이 재로딩되어야 합니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stash 관리의 복잡성&lt;/strong&gt;: stash가 쌓이면 어떤 stash가 어떤 작업인지 추적하기 어렵습니다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git stash list
   stash@{0}: On feature/user-service: WIP: user service refactoring
   stash@{1}: On feature/api-v2: WIP: API v2 migration
   stash@{2}: On feature/monitoring: WIP: add prometheus metrics&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stash 충돌 가능성&lt;/strong&gt;: &lt;code&gt;git stash pop&lt;/code&gt;을 할 때 다른 변경사항과 충돌이 발생할 수 있습니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;빌드 아티팩트 문제&lt;/strong&gt;: 브랜치를 전환하면 빌드된 바이너리나 캐시 파일들이 불일치할 수 있어 클린 빌드가 필요합니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;테스트 실행의 어려움&lt;/strong&gt;: 두 브랜치의 코드를 동시에 비교하거나 테스트하려면 여러 번 브랜치를 오가야 합니다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Git Worktree로 개선하기&lt;/h2&gt;
&lt;p&gt;같은 시나리오를 worktree로 처리해봅시다.&lt;/p&gt;
&lt;h3&gt;초기 설정&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 메인 저장소
$ cd ~/projects/myapp

# 현재 feature/user-service에서 작업 중
$ git branch
* feature/user-service
  main&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Worktree를 사용한 긴급 수정&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 1. 긴급 수정을 위한 별도 worktree 생성
$ git worktree add ../myapp-hotfix main
Preparing worktree (checking out &amp;#39;main&amp;#39;)
HEAD is now at a1b2c3d Latest stable release

# 2. 새로운 디렉토리로 이동하여 작업
$ cd ../myapp-hotfix
$ git checkout -b hotfix/auth-panic
$ vim auth.go
$ git add auth.go
$ git commit -m &amp;quot;Fix nil pointer panic in auth middleware&amp;quot;
$ git push origin hotfix/auth-panic

# 3. 원래 작업 디렉토리로 돌아가기
$ cd ../myapp
# 작업 내용이 그대로 유지됨! stash 불필요
$ vim user_handler.go  # 바로 작업 재개 가능&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;동시에 여러 작업 진행&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 프로젝트 루트
$ cd ~/projects/myapp

# 현재 worktree 목록 확인
$ git worktree list
/home/user/projects/myapp              a1b2c3d [feature/user-service]
/home/user/projects/myapp-hotfix       a1b2c3d [hotfix/auth-panic]

# 코드 리뷰를 위한 또 다른 worktree 추가
$ git worktree add ../myapp-review feature/api-v2
$ cd ../myapp-review
# 코드 리뷰 진행...

# 메인 작업 디렉토리
$ cd ~/projects
$ ls -la
drwxr-xr-x  myapp/           # feature/user-service
drwxr-xr-x  myapp-hotfix/    # hotfix/auth-panic
drwxr-xr-x  myapp-review/    # feature/api-v2&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Worktree vs 기존 방식 비교&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;측면&lt;/th&gt;
&lt;th&gt;기존 방식 (stash/checkout)&lt;/th&gt;
&lt;th&gt;Worktree&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;브랜치 전환&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;파일 시스템 변경 발생&lt;/td&gt;
&lt;td&gt;디렉토리 이동만 하면 됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;작업 보존&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;stash 필요&lt;/td&gt;
&lt;td&gt;자동으로 보존됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;동시 작업&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;불가능 (순차적)&lt;/td&gt;
&lt;td&gt;여러 브랜치 동시 작업 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IDE 로딩&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;브랜치마다 재로딩&lt;/td&gt;
&lt;td&gt;각 디렉토리별 독립 세션&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;빌드 상태&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;브랜치 전환 시 재빌드 필요&lt;/td&gt;
&lt;td&gt;각 worktree가 독립적인 빌드 상태 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;테스트/비교&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;브랜치 전환 반복 필요&lt;/td&gt;
&lt;td&gt;동시에 열어서 비교 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;디스크 사용량&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;적음&lt;/td&gt;
&lt;td&gt;각 worktree마다 작업 디렉토리 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;실전 활용 팁&lt;/h2&gt;
&lt;h3&gt;1. Worktree 명명 규칙&lt;/h3&gt;
&lt;p&gt;일관된 명명 규칙을 사용하면 관리가 쉬워집니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 브랜치 이름을 반영한 명명
$ git worktree add ../myapp-feature-user feature/user-service

# 또는 작업 타입별로 구분
$ git worktree add ../myapp-hotfix hotfix/critical-bug
$ git worktree add ../myapp-review feature/code-review&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 임시 작업용 Worktree&lt;/h3&gt;
&lt;p&gt;빠른 테스트나 확인이 필요할 때 임시 worktree를 만들 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 특정 커밋 체크아웃
$ git worktree add --detach ../myapp-temp a1b2c3d

# 작업 완료 후 삭제
$ git worktree remove ../myapp-temp&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. Worktree 정리&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 현재 worktree 목록 확인
$ git worktree list

# 특정 worktree 제거
$ git worktree remove ../myapp-hotfix

# 또는 디렉토리를 직접 삭제한 후 정리
$ rm -rf ../myapp-hotfix
$ git worktree prune  # 참조 정리&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. 각 Worktree에서 독립적인 환경 설정&lt;/h3&gt;
&lt;p&gt;각 worktree는 독립적인 작업 디렉토리이므로 서로 다른 설정을 가질 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 메인 worktree: 개발 환경
$ cd ~/projects/myapp
$ export ENV=development
$ go run main.go

# hotfix worktree: 프로덕션 유사 환경
$ cd ~/projects/myapp-hotfix
$ export ENV=production
$ go build -o app
$ ./app&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;주의사항&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;브랜치 중복 체크아웃 불가&lt;/strong&gt;: 같은 브랜치를 여러 worktree에 동시에 체크아웃할 수 없습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;   $ git worktree add ../myapp-test main
   fatal: &amp;#39;main&amp;#39; is already checked out at &amp;#39;/home/user/projects/myapp-hotfix&amp;#39;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;디스크 공간&lt;/strong&gt;: 각 worktree는 전체 작업 디렉토리를 가지므로 대용량 프로젝트에서는 디스크 공간을 고려해야 합니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Worktree 삭제 시 주의&lt;/strong&gt;: worktree를 삭제하기 전에 커밋하지 않은 변경사항이 없는지 확인하세요.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;실제 개발 워크플로우 예시&lt;/h2&gt;
&lt;p&gt;Go 애플리케이션 개발에서 worktree를 활용하는 실제 시나리오입니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 프로젝트 구조
~/projects/
├── myapp/                    # main 브랜치 (안정 버전)
├── myapp-feature-user/       # 사용자 서비스 개발
├── myapp-feature-api/        # API 리팩토링
└── myapp-hotfix/             # 긴급 수정용

# 1. 메인 개발 작업
$ cd ~/projects/myapp-feature-user
$ vim internal/user/handler.go
$ go test ./...

# 2. 동시에 다른 터미널에서 API 작업
$ cd ~/projects/myapp-feature-api
$ vim api/v2/router.go
$ go test -v ./api/...

# 3. 긴급 버그 발생 시
$ cd ~/projects/myapp-hotfix
$ git pull origin main
$ git checkout -b hotfix/urgent-fix
$ vim middleware/auth.go
$ go test ./middleware
$ git commit -am &amp;quot;Fix authentication middleware panic&amp;quot;
$ git push origin hotfix/urgent-fix

# 4. 다시 원래 작업으로 즉시 복귀
$ cd ~/projects/myapp-feature-user
# 모든 작업 내용이 그대로 유지됨&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Go 모듈 캐시 공유&lt;/h3&gt;
&lt;p&gt;Go는 모듈 캐시를 &lt;code&gt;$GOPATH/pkg/mod&lt;/code&gt;에 저장하므로, 모든 worktree가 자동으로 같은 캐시를 공유합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 각 worktree에서 의존성을 다시 다운로드할 필요 없음
$ cd ~/projects/myapp-feature-user
$ go mod download  # 한 번만 실행하면 됨

$ cd ~/projects/myapp-hotfix
# 이미 캐시된 모듈 사용
$ go build  # 빠른 빌드&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;독립적인 바이너리 빌드&lt;/h3&gt;
&lt;p&gt;각 worktree에서 독립적으로 바이너리를 빌드하고 실행할 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# feature 브랜치: 개발 중인 새 기능 테스트
$ cd ~/projects/myapp-feature-user
$ go build -o myapp-dev
$ ./myapp-dev &amp;amp;

# hotfix 브랜치: 수정된 버전 테스트
$ cd ~/projects/myapp-hotfix
$ go build -o myapp-hotfix
$ ./myapp-hotfix &amp;amp;

# 두 버전을 동시에 실행하여 비교 테스트 가능&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;결론&lt;/h2&gt;
&lt;p&gt;Git Worktree는 특히 다음과 같은 상황에서 매우 유용합니다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;긴급 수정과 기능 개발을 병행해야 할 때&lt;/li&gt;
&lt;li&gt;여러 버전의 코드를 동시에 테스트하거나 비교해야 할 때&lt;/li&gt;
&lt;li&gt;코드 리뷰를 위해 다른 브랜치를 확인하면서 현재 작업을 유지하고 싶을 때&lt;/li&gt;
&lt;li&gt;대규모 리팩토링 작업과 일반 개발을 분리하고 싶을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;stash와 checkout을 반복하는 기존 방식에서 벗어나 worktree를 활용하면 작업 효율성을 크게 높일 수 있습니다. 각 작업을 독립적으로 유지하면서도 빠르게 전환할 수 있는 worktree의 장점을 활용해보세요.&lt;/p&gt;</description>
      <category>Dev/기타</category>
      <category>git</category>
      <category>worktree</category>
      <author>newtype</author>
      <guid isPermaLink="true">https://newtype.tistory.com/488</guid>
      <comments>https://newtype.tistory.com/entry/Git-Worktree%EB%A1%9C-%EC%9E%91%EC%97%85-%ED%9A%A8%EC%9C%A8%EC%84%B1-%EB%86%92%EC%9D%B4%EA%B8%B0#entry488comment</comments>
      <pubDate>Mon, 5 Jan 2026 10:22:50 +0900</pubDate>
    </item>
    <item>
      <title>빠른 localtime</title>
      <link>https://newtype.tistory.com/entry/%EB%B9%A0%EB%A5%B8-localtime</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;원본: &lt;a href=&quot;https://github.com/lmk/fast_localtime&quot;&gt;https://github.com/lmk/fast_localtime&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h1&gt;fastkst_localtime&lt;/h1&gt;
&lt;p&gt;고성능 KST(한국 표준시, UTC+9) 전용 localtime 구현&lt;/p&gt;
&lt;h2&gt;개요&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;fastkst_localtime&lt;/code&gt;은 한국 표준시(KST, UTC+9) 변환에 최적화된 고성능 시간 변환 라이브러리입니다. 표준 &lt;code&gt;localtime()&lt;/code&gt; 함수가 가진 성능 오버헤드를 제거하고, 64-bit 시간 값을 안전하게 처리할 수 있도록 설계되었습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;glibc/time 소스를 참조하여 구현되었습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;주요 특징&lt;/h2&gt;
&lt;h3&gt;1. 고성능&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;KST 타임존 변환에 특화되어 표준 &lt;code&gt;localtime()&lt;/code&gt; 함수보다 빠른 성능 제공&lt;/li&gt;
&lt;li&gt;Linux 커널에서 발생하는 시스템 콜, timezone 조회, mutex 락 등의 오버헤드 제거&lt;/li&gt;
&lt;li&gt;직접적인 시간 계산으로 최소한의 연산만 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 64-bit 안전성&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2038년 문제 해결 (32-bit time_t 제약 극복)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;time_t 값 지원 범위&lt;/strong&gt;: 약 -2920년 ~ +2920년&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;struct tm의 tm_year 필드 제한&lt;/strong&gt;: 약 -21만년 ~ +21만년 (int 타입 제한)&lt;/li&gt;
&lt;li&gt;64-bit time_t를 안전하게 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. Thread-Safe&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fastkst_localtime_safe()&lt;/code&gt; 함수로 멀티스레드 환경 지원&lt;/li&gt;
&lt;li&gt;재진입 가능한 설계&lt;/li&gt;
&lt;li&gt;경쟁 상태(race condition) 없이 안전한 동시 호출&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. 고정 타임존&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;시스템 타임존 설정과 무관하게 항상 KST(UTC+9) 반환&lt;/li&gt;
&lt;li&gt;타임존 조회 오버헤드 제거&lt;/li&gt;
&lt;li&gt;예측 가능하고 일관된 동작&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;API 함수&lt;/h2&gt;
&lt;h3&gt;fastkst_localtime()&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;int fastkst_localtime(time_t t, struct tm *tp)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;주요 시간 변환 함수입니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;매개변수:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;t&lt;/code&gt;: 변환할 Unix timestamp (time_t)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tp&lt;/code&gt;: 결과를 저장할 struct tm 포인터&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;반환값:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;1&lt;/code&gt;: 성공&lt;/li&gt;
&lt;li&gt;&lt;code&gt;0&lt;/code&gt;: 실패 (errno 설정됨)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;지원 범위:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;32-bit time_t: 1901-12-13 ~ 2038-01-19 (KST)&lt;/li&gt;
&lt;li&gt;64-bit time_t: 약 -2920년 ~ +2920년&lt;/li&gt;
&lt;li&gt;실제 제한: struct tm의 tm_year(int) 범위로 약 -21만년 ~ +21만년&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;fastkst_localtime_safe()&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;int fastkst_localtime_safe(time_t t, struct tm *tp, int *err_code)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;추가 검증 및 에러 처리 기능이 있는 Thread-safe 래퍼 함수입니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;매개변수:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;t&lt;/code&gt;: 변환할 Unix timestamp (time_t)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tp&lt;/code&gt;: 결과를 저장할 struct tm 포인터&lt;/li&gt;
&lt;li&gt;&lt;code&gt;err_code&lt;/code&gt;: 에러 코드를 저장할 포인터 (NULL 가능)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;반환값:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;1&lt;/code&gt;: 성공&lt;/li&gt;
&lt;li&gt;&lt;code&gt;0&lt;/code&gt;: 실패 (err_code에 에러 코드 저장)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;특징:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;struct tm 자동 초기화&lt;/li&gt;
&lt;li&gt;명시적인 에러 코드 반환&lt;/li&gt;
&lt;li&gt;NULL 포인터 안전성 검증&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;사용 예제&lt;/h2&gt;
&lt;h3&gt;기본 사용법&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;time.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;

// fastkst_localtime() 함수 선언
int fastkst_localtime(time_t t, struct tm *tp);

int main() {
    time_t now = time(NULL);
    struct tm kst_time;

    if (fastkst_localtime(now, &amp;amp;kst_time) == 1) {
        printf(&amp;quot;현재 KST 시간: %04d-%02d-%02d %02d:%02d:%02d\n&amp;quot;,
               kst_time.tm_year + 1900,
               kst_time.tm_mon + 1,
               kst_time.tm_mday,
               kst_time.tm_hour,
               kst_time.tm_min,
               kst_time.tm_sec);
    }

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Thread-Safe 사용법&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;time.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;

int fastkst_localtime_safe(time_t t, struct tm *tp, int *err_code);

int main() {
    time_t now = time(NULL);
    struct tm kst_time;
    int error_code;

    if (fastkst_localtime_safe(now, &amp;amp;kst_time, &amp;amp;error_code) == 1) {
        printf(&amp;quot;KST: %04d-%02d-%02d %02d:%02d:%02d %s\n&amp;quot;,
               kst_time.tm_year + 1900,
               kst_time.tm_mon + 1,
               kst_time.tm_mday,
               kst_time.tm_hour,
               kst_time.tm_min,
               kst_time.tm_sec,
               kst_time.tm_zone);
    } else {
        fprintf(stderr, &amp;quot;Error: %d\n&amp;quot;, error_code);
    }

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;빌드 및 테스트&lt;/h2&gt;
&lt;h3&gt;라이브러리로 사용&lt;/h3&gt;
&lt;p&gt;프로젝트에 &lt;code&gt;fastkst_localtime.c&lt;/code&gt;를 포함하여 컴파일합니다:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;gcc -c fastkst_localtime.c -o fastkst_localtime.o
gcc your_program.c fastkst_localtime.o -o your_program&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;테스트 프로그램 빌드&lt;/h3&gt;
&lt;p&gt;테스트 코드를 포함하여 빌드하려면:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;gcc -DTEST_FASTKST_LOCALTIME -o fastkst_localtime fastkst_localtime.c -lpthread
./fastkst_localtime&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;테스트 내용&lt;/h3&gt;
&lt;p&gt;테스트 프로그램은 다음을 검증합니다:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;기본 기능 테스트&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unix Epoch (1970-01-01)&lt;/li&gt;
&lt;li&gt;2038년 문제 (INT32_MAX)&lt;/li&gt;
&lt;li&gt;미래 시간 (2100년, 3000년)&lt;/li&gt;
&lt;li&gt;과거 시간 (1900년, 1969년)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;성능 벤치마크&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;localtime()&lt;/code&gt; vs &lt;code&gt;fastkst_localtime()&lt;/code&gt; 성능 비교&lt;/li&gt;
&lt;li&gt;100만회 반복 호출 측정&lt;/li&gt;
&lt;li&gt;속도 향상률 계산 및 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Thread Safety 테스트&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;10개 스레드 동시 실행&lt;/li&gt;
&lt;li&gt;스레드당 1000회 반복&lt;/li&gt;
&lt;li&gt;총 10,000회 동시 호출 검증&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;NULL 포인터 테스트&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NULL 입력 처리 검증&lt;/li&gt;
&lt;li&gt;적절한 에러 코드 반환 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;성능&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;fastkst_localtime()&lt;/code&gt;은 표준 &lt;code&gt;localtime()&lt;/code&gt; 함수보다 일반적으로 빠른 성능을 보여줍니다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;타임존 조회 오버헤드 제거&lt;/li&gt;
&lt;li&gt;시스템 콜 최소화&lt;/li&gt;
&lt;li&gt;mutex 락 제거&lt;/li&gt;
&lt;li&gt;캐시 친화적인 메모리 접근 패턴&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;실제 성능은 시스템 환경에 따라 다를 수 있으며, 테스트 프로그램을 통해 확인할 수 있습니다.&lt;/p&gt;
&lt;h2&gt;제한 사항&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;KST 전용&lt;/strong&gt;: 이 라이브러리는 오직 KST(UTC+9) 타임존만 지원합니다. 다른 타임존이 필요한 경우 표준 &lt;code&gt;localtime()&lt;/code&gt; 함수를 사용하세요.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;환경 검증&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ date
2025. 12. 31. (수) 12:52:45 KST
$ timedatectl
               Local time: 수 2025-12-31 12:52:54 KST
           Universal time: 수 2025-12-31 03:52:54 UTC
                 RTC time: 수 2025-12-31 03:52:54
                Time zone: Asia/Seoul (KST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
$ ls -l /etc/localtime
lrwxrwxrwx. 1 root root 32  8월 25  2023 /etc/localtime -&amp;gt; ../usr/share/zoneinfo/Asia/Seoul
$ echo $TZ
$&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DST 미지원&lt;/strong&gt;: 일광 절약 시간제(Daylight Saving Time)를 지원하지 않습니다. &lt;code&gt;tm_isdst&lt;/code&gt;는 항상 0입니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;tm_year 범위&lt;/strong&gt;: struct tm의 &lt;code&gt;tm_year&lt;/code&gt; 필드가 int 타입이므로, 표현 가능한 연도 범위는 약 -21만년 ~ +21만년입니다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;에러 처리&lt;/h2&gt;
&lt;p&gt;함수 실패 시 다음 에러 코드가 설정됩니다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;EINVAL&lt;/code&gt;: 잘못된 인자 (NULL 포인터)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;EOVERFLOW&lt;/code&gt;: 연도가 struct tm의 범위를 초과&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Dev/C, C++</category>
      <category>localtime</category>
      <author>newtype</author>
      <guid isPermaLink="true">https://newtype.tistory.com/487</guid>
      <comments>https://newtype.tistory.com/entry/%EB%B9%A0%EB%A5%B8-localtime#entry487comment</comments>
      <pubDate>Wed, 31 Dec 2025 15:58:24 +0900</pubDate>
    </item>
    <item>
      <title>아이폰에서 구글캘린더에서 연동.</title>
      <link>https://newtype.tistory.com/entry/%EC%95%84%EC%9D%B4%ED%8F%B0%EC%97%90%EC%84%9C-%EA%B5%AC%EA%B8%80%EC%BA%98%EB%A6%B0%EB%8D%94%EC%97%90%EC%84%9C-%EC%97%B0%EB%8F%99</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;아이폰에서 구글캘린더를 연동하면 내 캘린더는 연동이 되지만, 구독한 다른 캘린더는 연동이 안되는 경우가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹브라우져에서 구글에 로긴하고, 아래 링크를 열어서 설정하면 연동이된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://calendar.google.com/calendar/u/0/syncselect&quot;&gt;https://calendar.google.com/calendar/u/0/syncselect&lt;/a&gt;&lt;/p&gt;</description>
      <category>Dev/Web</category>
      <category>구글캘린더</category>
      <category>아이폰</category>
      <author>newtype</author>
      <guid isPermaLink="true">https://newtype.tistory.com/486</guid>
      <comments>https://newtype.tistory.com/entry/%EC%95%84%EC%9D%B4%ED%8F%B0%EC%97%90%EC%84%9C-%EA%B5%AC%EA%B8%80%EC%BA%98%EB%A6%B0%EB%8D%94%EC%97%90%EC%84%9C-%EC%97%B0%EB%8F%99#entry486comment</comments>
      <pubDate>Wed, 9 Jul 2025 08:41:34 +0900</pubDate>
    </item>
    <item>
      <title>Amazon Q로 지렁이 게임 만들기: AI 코딩 어시스턴트의 실전 활용기</title>
      <link>https://newtype.tistory.com/entry/Amazon-Q%EB%A1%9C-%EC%A7%80%EB%A0%81%EC%9D%B4-%EA%B2%8C%EC%9E%84-%EB%A7%8C%EB%93%A4%EA%B8%B0-AI-%EC%BD%94%EB%94%A9-%EC%96%B4%EC%8B%9C%EC%8A%A4%ED%84%B4%ED%8A%B8%EC%9D%98-%EC%8B%A4%EC%A0%84-%ED%99%9C%EC%9A%A9%EA%B8%B0</link>
      <description>&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;이 글은 aws의 이벤트 참가를 위해 작성되었습니다.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://community.aws/content/2xIoduO0xhkhUApQpVUIqBFGmAc/build-games-with-amazon-q-cli-and-score-a-t-shirt&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://community.aws/content/2xIoduO0xhkhUApQpVUIqBFGmAc/build-games-with-amazon-q-cli-and-score-a-t-shirt&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;%F0%9F%8E%AE-%EC%84%A0%ED%83%9D%ED%95%9C-%EA%B2%8C%EC%9E%84%EA%B3%BC-%EC%84%A0%ED%83%9D-%EC%9D%B4%EC%9C%A0&quot; style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;2&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;  선택한 게임과 선택 이유&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;**지렁이 게임(Snake Game)**을 선택한 이유:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #d4d4d4; text-align: start;&quot; data-line=&quot;6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-line=&quot;6&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;고전적이면서 완성도 높은 게임&lt;/b&gt;: 누구나 알고 있는 간단한 룰이지만 구현에는 여러 프로그래밍 개념이 필요&lt;/span&gt;&lt;/li&gt;
&lt;li data-line=&quot;7&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;적절한 복잡도&lt;/b&gt;: 한 번의 대화로 완성 가능하면서도 AI의 코딩 능력을 평가하기에 충분한 복잡도&lt;/span&gt;&lt;/li&gt;
&lt;li data-line=&quot;8&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;시각적 결과물&lt;/b&gt;: 즉시 실행하고 테스트할 수 있어 AI의 결과물을 바로 확인 가능&lt;/span&gt;&lt;/li&gt;
&lt;li data-line=&quot;9&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;확장 가능성&lt;/b&gt;: 기본 게임 완성 후 다양한 기능 추가를 통해 AI의 반복 개발 능력 테스트 가능&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;%F0%9F%92%A1-%EB%B0%9C%EA%B2%AC%ED%95%9C-%ED%9A%A8%EA%B3%BC%EC%A0%81%EC%9D%B8-%ED%94%84%EB%A1%AC%ED%94%84%ED%8A%B8-%EA%B8%B0%EC%88%A0&quot; style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;11&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;  발견한 효과적인 프롬프트 기술&lt;/span&gt;&lt;/h2&gt;
&lt;h3 id=&quot;1-%EB%8B%A8%EA%B3%84%EC%A0%81-%EC%9A%94%EC%B2%AD-%EB%B0%A9%EC%8B%9D&quot; style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;13&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. 단계적 요청 방식&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;1c&quot; style=&quot;background-color: #000000; color: #d4d4d4; text-align: start;&quot;&gt;&lt;code&gt;&quot;html로 지렁이 게임을 만들어줘&quot; &amp;rarr; 기본 게임 완성
&quot;플레이 화면이 너무 작은데 좀 크게 해줘&quot; &amp;rarr; 화면 크기 조정
&quot;소스 코드에 주석을 달아줘&quot; &amp;rarr; 코드 문서화
&quot;게임 속도가 일정한데, 처음엔 더 느리고 꼬리가 길어질 수록 속도가 빨라지게 수정해줘&quot; &amp;rarr; 게임플레이 개선
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;2-%EA%B5%AC%EC%B2%B4%EC%A0%81%EC%9D%B8-%EC%9A%94%EA%B5%AC%EC%82%AC%ED%95%AD-%EB%AA%85%EC%8B%9C&quot; style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;21&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. 구체적인 요구사항 명시&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; color: #d4d4d4; text-align: start;&quot; data-line=&quot;22&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-line=&quot;22&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;❌ &quot;게임을 빠르게 해줘&quot;&lt;/span&gt;&lt;/li&gt;
&lt;li data-line=&quot;23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;✅ &quot;처음엔 더 느리고 꼬리가 길어질 수록 속도가 빨라지게 수정해줘&quot;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-%EC%BD%94%EB%93%9C-%EC%84%A4%EB%AA%85-%EC%9A%94%EC%B2%AD&quot; style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;25&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3. 코드 설명 요청&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;26&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;특정 코드 블록을 선택하고 &quot;이 부분 코드 설명좀 해줘&quot;라고 요청하면 상세한 설명을 받을 수 있었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;%F0%9F%A4%96-ai%EA%B0%80-%EA%B3%A0%EC%A0%84%EC%A0%81%EC%9D%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EB%AC%B8%EC%A0%9C%EB%A5%BC-%EC%B2%98%EB%A6%AC%ED%95%9C-%EB%B0%A9%EB%B2%95&quot; style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;28&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;  AI가 고전적인 프로그래밍 문제를 처리한 방법&lt;/span&gt;&lt;/h2&gt;
&lt;h3 id=&quot;1-%EA%B2%8C%EC%9E%84-%EB%A3%A8%ED%94%84-%EA%B5%AC%ED%98%84&quot; style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;30&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. 게임 루프 구현&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;31&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;AI는&amp;nbsp;setInterval()을 사용한 전통적인 게임 루프 패턴을 정확히 구현했습니다:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #000000; color: #d4d4d4; text-align: start;&quot;&gt;&lt;code&gt;function drawGame() {
    clearCanvas();    // 화면 지우기
    moveSnake();      // 게임 로직
    drawSnake();      // 렌더링
    drawFood();
    checkCollision(); // 충돌 검사
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;2-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B5%AC%EC%A1%B0-%EC%84%A0%ED%83%9D&quot; style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;43&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. 데이터 구조 선택&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;44&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;지렁이의 몸체를 배열로 관리하는 효율적인 방법을 선택:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #000000; color: #d4d4d4; text-align: start;&quot;&gt;&lt;code&gt;let snake = [{x: 10, y: 10}]; // 배열의 각 요소가 몸체 부분
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;3-%EC%B6%A9%EB%8F%8C-%EA%B2%80%EC%82%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98&quot; style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;49&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3. 충돌 검사 알고리즘&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;50&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;벽 충돌과 자기 몸체 충돌을 분리하여 명확하게 구현했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;%E2%9A%A1-%EC%8B%9C%EA%B0%84%EC%9D%84-%EC%A0%88%EC%95%BD%ED%95%9C-%EA%B0%9C%EB%B0%9C-%EC%9E%90%EB%8F%99%ED%99%94%EC%9D%98-%EC%98%88&quot; style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;52&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;⚡ 시간을 절약한 개발 자동화의 예&lt;/span&gt;&lt;/h2&gt;
&lt;h3 id=&quot;%EC%A0%84%ED%86%B5%EC%A0%81%EC%9D%B8-%EA%B0%9C%EB%B0%9C-%EA%B3%BC%EC%A0%95-vs-ai-%ED%99%9C%EC%9A%A9&quot; style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;54&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;전통적인 개발 과정 vs AI 활용&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;55&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;전통적 방법 (예상 시간: 2-3시간)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #d4d4d4; text-align: start;&quot; data-line=&quot;56&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-line=&quot;56&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;게임 설계 및 구조 계획 (30분)&lt;/span&gt;&lt;/li&gt;
&lt;li data-line=&quot;57&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;HTML/CSS 레이아웃 작성 (30분)&lt;/span&gt;&lt;/li&gt;
&lt;li data-line=&quot;58&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;게임 로직 구현 (60분)&lt;/span&gt;&lt;/li&gt;
&lt;li data-line=&quot;59&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;버그 수정 및 테스트 (30분)&lt;/span&gt;&lt;/li&gt;
&lt;li data-line=&quot;60&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;코드 정리 및 주석 (30분)&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;62&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;AI 활용 방법 (실제 시간: 15분)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #d4d4d4; text-align: start;&quot; data-line=&quot;63&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-line=&quot;63&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;기본 게임 생성 (1분)&lt;/span&gt;&lt;/li&gt;
&lt;li data-line=&quot;64&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;화면 크기 조정 (1분)&lt;/span&gt;&lt;/li&gt;
&lt;li data-line=&quot;65&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;주석 추가 (2분)&lt;/span&gt;&lt;/li&gt;
&lt;li data-line=&quot;66&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;게임 속도 개선 (3분)&lt;/span&gt;&lt;/li&gt;
&lt;li data-line=&quot;67&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;코드 설명 및 이해 (8분)&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;69&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;시간 절약: 약 90% (165분 &amp;rarr; 15분)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;%F0%9F%8E%AF-%ED%9D%A5%EB%AF%B8%EB%A1%9C%EC%9A%B4-ai-%EC%83%9D%EC%84%B1-%EC%86%94%EB%A3%A8%EC%85%98%EC%9D%98-%EC%BD%94%EB%93%9C-%EC%98%88%EC%A0%9C&quot; style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;71&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;  흥미로운 AI 생성 솔루션의 코드 예제&lt;/span&gt;&lt;/h2&gt;
&lt;h3 id=&quot;1-%EB%8F%99%EC%A0%81-%EA%B2%8C%EC%9E%84-%EC%86%8D%EB%8F%84-%EC%A1%B0%EC%A0%88-%EC%8B%9C%EC%8A%A4%ED%85%9C&quot; style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;73&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. 동적 게임 속도 조절 시스템&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;74&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;AI가 제안한 가장 인상적인 솔루션은 지렁이 길이에 따른 동적 속도 조절이었습니다:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #000000; color: #d4d4d4; text-align: start;&quot;&gt;&lt;code&gt;// 게임 속도 업데이트
function updateGameSpeed() {
    clearInterval(gameInterval); // 기존 인터벌 제거
    // 지렁이 길이에 따라 속도 증가 (최소 50ms, 최대 200ms)
    const speed = Math.max(50, 200 - (snake.length - 1) * 10);
    gameInterval = setInterval(drawGame, speed);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;86&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;특징:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #d4d4d4; text-align: start;&quot; data-line=&quot;87&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-line=&quot;87&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;수학적 공식을 사용한 속도 계산&lt;/span&gt;&lt;/li&gt;
&lt;li data-line=&quot;88&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;최소/최대 속도 제한으로 게임 밸런스 유지&lt;/span&gt;&lt;/li&gt;
&lt;li data-line=&quot;89&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;인터벌 재설정을 통한 실시간 속도 변경&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-%EC%A7%80%EB%A0%81%EC%9D%B4-%EC%9D%B4%EB%8F%99-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98&quot; style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;91&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. 지렁이 이동 알고리즘&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;gml&quot; style=&quot;background-color: #000000; color: #d4d4d4; text-align: start;&quot;&gt;&lt;code&gt;function moveSnake() {
    // 새로운 머리 위치 계산
    const head = {x: snake[0].x + dx, y: snake[0].y + dy};
    snake.unshift(head); // 머리 추가

    if (head.x === food.x &amp;amp;&amp;amp; head.y === food.y) {
        // 음식을 먹으면 꼬리 유지 (길이 증가)
        score += 10;
        generateFood();
        updateGameSpeed();
    } else {
        snake.pop(); // 꼬리 제거 (길이 유지)
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;109&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;AI의 창의적 접근:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #d4d4d4; text-align: start;&quot; data-line=&quot;110&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-line=&quot;110&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;unshift()와&amp;nbsp;pop()을 조합한 효율적인 배열 조작&lt;/span&gt;&lt;/li&gt;
&lt;li data-line=&quot;111&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;조건부 꼬리 제거로 길이 증가 구현&lt;/span&gt;&lt;/li&gt;
&lt;li data-line=&quot;112&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;음식 섭취와 속도 업데이트를 연결한 게임플레이 설계&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;%F0%9F%8E%AE-%EA%B2%8C%EC%9E%84-%EC%8B%A4%ED%96%89-%EB%B0%A9%EB%B2%95&quot; style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;114&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;  게임 실행 방법&lt;/span&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #d4d4d4; text-align: start;&quot; data-line=&quot;116&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-line=&quot;116&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;snake_game.html&amp;nbsp;파일을 브라우저에서 열기&lt;/span&gt;&lt;/li&gt;
&lt;li data-line=&quot;117&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;방향키(&amp;uarr;&amp;darr;&amp;larr;&amp;rarr;)로 지렁이 조작&lt;/span&gt;&lt;/li&gt;
&lt;li data-line=&quot;118&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;빨간 음식을 먹어서 점수 획득&lt;/span&gt;&lt;/li&gt;
&lt;li data-line=&quot;119&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;벽이나 자신의 몸에 부딪히면 게임 리셋&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;%F0%9F%8E%AF-%EA%B2%8C%EC%9E%84-%ED%8A%B9%EC%A7%95&quot; style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;121&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;  게임 특징&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #d4d4d4; text-align: start;&quot; data-line=&quot;123&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-line=&quot;123&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;화면 크기&lt;/b&gt;: 600x600 픽셀의 넓은 게임 영역&lt;/span&gt;&lt;/li&gt;
&lt;li data-line=&quot;124&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;점수 시스템&lt;/b&gt;: 음식 1개당 10점&lt;/span&gt;&lt;/li&gt;
&lt;li data-line=&quot;125&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;동적 속도&lt;/b&gt;: 지렁이가 길어질수록 게임 속도 증가&lt;/span&gt;&lt;/li&gt;
&lt;li data-line=&quot;126&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;자동 리셋&lt;/b&gt;: 충돌 시 게임 자동 재시작&lt;/span&gt;&lt;/li&gt;
&lt;li data-line=&quot;127&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;방향 제한&lt;/b&gt;: 반대 방향으로 이동 불가&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;%F0%9F%8E%AF-%EA%B2%8C%EC%9E%84-%ED%8A%B9%EC%A7%95&quot; style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;121&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;  게임 스크린샷&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;1142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QYI11/btsOG50t6XD/SWJlkshgzTHRYJVijS3sM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QYI11/btsOG50t6XD/SWJlkshgzTHRYJVijS3sM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QYI11/btsOG50t6XD/SWJlkshgzTHRYJVijS3sM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQYI11%2FbtsOG50t6XD%2FSWJlkshgzTHRYJVijS3sM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;508&quot; height=&quot;568&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;1142&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id=&quot;%F0%9F%8E%AF-%EA%B2%B0%EB%A1%A0&quot; style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;129&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;  결론&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;131&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Amazon Q를 활용한 게임 개발 경험을 통해 다음을 확인할 수 있었습니다:&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;133&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;장점:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #d4d4d4; text-align: start;&quot; data-line=&quot;134&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-line=&quot;134&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;빠른 프로토타이핑과 즉시 실행 가능한 결과물&lt;/span&gt;&lt;/li&gt;
&lt;li data-line=&quot;135&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;단계적 개선을 통한 점진적 개발&lt;/span&gt;&lt;/li&gt;
&lt;li data-line=&quot;136&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;코드 설명과 학습을 동시에 진행 가능&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;138&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;효과적인 활용법:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #d4d4d4; text-align: start;&quot; data-line=&quot;139&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-line=&quot;139&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;구체적이고 명확한 요구사항 제시&lt;/span&gt;&lt;/li&gt;
&lt;li data-line=&quot;140&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;단계별 기능 추가 방식&lt;/span&gt;&lt;/li&gt;
&lt;li data-line=&quot;141&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;코드 이해를 위한 적극적인 질문&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;143&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;AI 코딩 어시스턴트는 단순한 코드 생성을 넘어서&amp;nbsp;&lt;b&gt;개발 파트너&lt;/b&gt;로서의 역할을 충분히 수행할 수 있음을 확인했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-line=&quot;145&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;147&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이 프로젝트는 Amazon Q CLI를 사용하여 약 15분 만에 완성되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;%EA%B8%80-%EC%9E%91%EC%84%B1%EC%97%90-%EC%82%AC%EC%9A%A9%ED%95%9C-%EC%82%AC%EC%9A%A9%ED%95%9C-%ED%94%84%EB%A1%AC%ED%94%84%ED%8A%B8&quot; style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;149&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;글 작성에 사용한 사용한 프롬프트&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #d4d4d4; text-align: start;&quot; data-line=&quot;151&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이 글 역시 Amazon Q CLI를 사용하여 작성되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;haml&quot; style=&quot;background-color: #000000; color: #d4d4d4; text-align: start;&quot;&gt;&lt;code&gt;이 게임은 amazon Q를 이용해서 만들었잖아? 블로그에 글을 올릴건데, 이런 내용을 추가해서 README.md 파일에 글을 작성해줘 
  -선택한 게임과 선택한 이유
  -발견한효과적인 프롬프트 기술
  -AI가 고전적인 프로그래밍 문제를 처리한 방법
  -시간을 절약한 개발 자동화의 예
  -흥미로운 AI 생성 솔루션의 코드 예제
  -최종 창작물의 스크린샷&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Dev/Web</category>
      <category>amazonqcli</category>
      <author>newtype</author>
      <guid isPermaLink="true">https://newtype.tistory.com/485</guid>
      <comments>https://newtype.tistory.com/entry/Amazon-Q%EB%A1%9C-%EC%A7%80%EB%A0%81%EC%9D%B4-%EA%B2%8C%EC%9E%84-%EB%A7%8C%EB%93%A4%EA%B8%B0-AI-%EC%BD%94%EB%94%A9-%EC%96%B4%EC%8B%9C%EC%8A%A4%ED%84%B4%ED%8A%B8%EC%9D%98-%EC%8B%A4%EC%A0%84-%ED%99%9C%EC%9A%A9%EA%B8%B0#entry485comment</comments>
      <pubDate>Thu, 19 Jun 2025 17:18:39 +0900</pubDate>
    </item>
    <item>
      <title>이모지(Emoji) 지원을 위한 MariaDB 설정</title>
      <link>https://newtype.tistory.com/entry/%EC%9D%B4%EB%AA%A8%EC%A7%80Emoji-%EC%A7%80%EC%9B%90%EC%9D%84-%EC%9C%84%ED%95%9C-MariaDB-%EC%84%A4%EC%A0%95</link>
      <description>&lt;p&gt;결론 부터 이야기 하면, 서버 설정을 이모지 지원을 위한 4 byte utf8로 설정하면 된다.&lt;br&gt;( utf8mb4 / utf8mb4_unicode_ci )&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;설치&lt;ul&gt;
&lt;li&gt;docker를 사용해서 간단히 설치 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;$ docker pull mariadb:10.6.14

$ docker run --name mariadb-10.6.14 -d -p 3333:3306 --restart=always -e MYSQL_ROOT_PASSWORD=&amp;#39;root123&amp;#39; -e TZ=Asia/Seoul mariadb:10.6.14 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --lower_case_table_names=1

$ docker exec -ti mariadb-10.6.14 mysql -u root -p&amp;#39;root123&amp;#39;

create database test;  
create user &amp;#39;tester&amp;#39;@&amp;#39;%&amp;#39; identified by &amp;#39;tester123&amp;#39;;  
grant all privileges on test.* to &amp;#39;tester&amp;#39;@&amp;#39;%&amp;#39;;  
flush privileges;

use test;  
create table test (  
`str` varchar(64) not null,  
`rmk` varchar(128) not null,  
primary key (`str`)  
) ENGINE=InnoDB&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;lower_case_table_names은 테이블 대소문자 구분을 안하기 위한 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;테스트&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;$ mysql --default-character-set=utf8mb4 -h127.0.0.1 -P3333 -utester -p&amp;#39;tester123&amp;#39; test

MariaDB [test]&amp;gt; insert into test values (&amp;#39;  568&amp;#39;, &amp;#39;숫자 이모지&amp;#39;);  
Query OK, 1 row affected (0.008 sec)

MariaDB [test]&amp;gt; select * from test;  
+-------------------------------------------+----------------+  
| STR                                       | RMK            |  
+-------------------------------------------+----------------+  
|   568                                  | 숫자 이모지    |  
+-------------------------------------------+----------------+  
1 row in set (0.001 sec)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Dev/DBMS</category>
      <category>Emoji</category>
      <category>mariadb</category>
      <category>이모지</category>
      <author>newtype</author>
      <guid isPermaLink="true">https://newtype.tistory.com/484</guid>
      <comments>https://newtype.tistory.com/entry/%EC%9D%B4%EB%AA%A8%EC%A7%80Emoji-%EC%A7%80%EC%9B%90%EC%9D%84-%EC%9C%84%ED%95%9C-MariaDB-%EC%84%A4%EC%A0%95#entry484comment</comments>
      <pubDate>Fri, 28 Jul 2023 16:37:31 +0900</pubDate>
    </item>
    <item>
      <title>websocket과 ssl 사용을 위한 nginx 설정</title>
      <link>https://newtype.tistory.com/entry/websocket%EA%B3%BC-ssl-%EC%82%AC%EC%9A%A9%EC%9D%84-%EC%9C%84%ED%95%9C-nginx-%EC%84%A4%EC%A0%95</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;개인프로젝트로 간단한 멀티 테트리스를 만들고 있는데, https + websocket 조합이다 보니 서버 설정이 필요했습니다. 구글링을 통해 해결했고, 방법을 공유 합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;html&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;html 파일에 메타 테그를 추가합니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;&amp;lt;meta http-equiv=&quot;Content-Security-Policy&quot; content=&quot;upgrade-insecure-requests&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; start=&quot;2&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;javascript&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;javascript에서 websocket을 연동을 위한 URI를 지정합니다.&lt;br /&gt;( mydomain은 서비스할 도메인명을 넣어줍니다 )&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;ws = new WebSocket(&quot;ws://mydomain/ws&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; start=&quot;3&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;https&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nginx 에 ssl 설정을 추가합니다.&lt;br /&gt;&lt;code&gt;mydomain/ws&lt;/code&gt;로 연결요청이 들어오면, 8090 포트의 /ws 로 포워딩합니다.&lt;/p&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;server {
    server_name  mydomain;
    listen 443 ssl;

    location /ws {
        proxy_pass   http://127.0.0.1:8090/ws;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection &quot;Upgrade&quot;;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Dev/Web</category>
      <category>nginx</category>
      <category>ssl</category>
      <category>Websocket</category>
      <author>newtype</author>
      <guid isPermaLink="true">https://newtype.tistory.com/483</guid>
      <comments>https://newtype.tistory.com/entry/websocket%EA%B3%BC-ssl-%EC%82%AC%EC%9A%A9%EC%9D%84-%EC%9C%84%ED%95%9C-nginx-%EC%84%A4%EC%A0%95#entry483comment</comments>
      <pubDate>Tue, 25 Apr 2023 08:47:48 +0900</pubDate>
    </item>
    <item>
      <title>lightsail 의 disk 공간 줄이기</title>
      <link>https://newtype.tistory.com/entry/lightsail-%EC%9D%98-disk-%EA%B3%B5%EA%B0%84-%EC%A4%84%EC%9D%B4%EA%B8%B0</link>
      <description>&lt;p&gt;lightsail에 올라가 있는것이 많지 않은데, 디스크 사용량이 70% 넘는 것을 발견했습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$  df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1       20G   14G  5.7G  71% /&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;확인 해보니, &lt;code&gt;/usr/src&lt;/code&gt;가 4G 정도를 사용하고 있네요.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/usr$ sudo du -sh *
3.8G    src
/usr/src$ sudo du -sh *
106M    linux-aws-headers-4.4.0-1063
106M    linux-aws-headers-4.4.0-1081
106M    linux-aws-headers-4.4.0-1084
106M    linux-aws-headers-4.4.0-1085
~~~~~~
106M    linux-aws-headers-4.4.0-1126
106M    linux-aws-headers-4.4.0-1127
106M    linux-aws-headers-4.4.0-1128&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;linux-aws-headers 들이 버전별도 있는데, 자동 update를 하면서 생길 수 있다고 합니다.&lt;br&gt;그냥 삭제하면 안되고, 의존성이 없는 것들만 삭제 해야한다고 합니다.&lt;br&gt;아래 명령으로 정리 했습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo apt-get autoremove&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;용량이 54%로 줄었습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1       20G   11G  9.1G  54% /&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;crontab에 넣어 두었습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo crontab -l
0 0 2 * * sudo apt-get autoremove -y 2&amp;gt; /dev/null&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Dev/기타</category>
      <category>apt-get</category>
      <category>autoremove</category>
      <category>crontab</category>
      <category>DISK</category>
      <category>lightsail</category>
      <author>newtype</author>
      <guid isPermaLink="true">https://newtype.tistory.com/482</guid>
      <comments>https://newtype.tistory.com/entry/lightsail-%EC%9D%98-disk-%EA%B3%B5%EA%B0%84-%EC%A4%84%EC%9D%B4%EA%B8%B0#entry482comment</comments>
      <pubDate>Fri, 10 Mar 2023 15:38:47 +0900</pubDate>
    </item>
  </channel>
</rss>