<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>hur-kyuh-leez.log</title>
        <link>https://velog.io/</link>
        <description>벨로그에 생각을 임시로 저장합니다. 틀린건 틀렸다고 해주세요 :) 그래야 논리 학습이 강화됩니다.</description>
        <lastBuildDate>Wed, 05 Nov 2025 01:02:34 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>hur-kyuh-leez.log</title>
            <url>https://images.velog.io/images/hur-kyuh-leez/profile/39ff93a0-f25a-11e9-bff0-31d61c220349/-.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. hur-kyuh-leez.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/hur-kyuh-leez" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[자신의 프로젝트 히스토리에 맞게 Claudecode Skills 만드는 make-skills]]></title>
            <link>https://velog.io/@hur-kyuh-leez/%EC%9E%90%EC%8B%A0%EC%9D%98-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%9E%88%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%97%90-%EB%A7%9E%EA%B2%8C-Claudecode-Skills-%EB%A7%8C%EB%93%9C%EB%8A%94-make-skills</link>
            <guid>https://velog.io/@hur-kyuh-leez/%EC%9E%90%EC%8B%A0%EC%9D%98-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%9E%88%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%97%90-%EB%A7%9E%EA%B2%8C-Claudecode-Skills-%EB%A7%8C%EB%93%9C%EB%8A%94-make-skills</guid>
            <pubDate>Wed, 05 Nov 2025 01:02:34 GMT</pubDate>
            <description><![CDATA[<hr>
<p>name: make-skills
description: Meta-skill for creating new Claude Code skills. Systematic approach to identify repeated workflows, extract patterns from conversation/git history, and create reusable skills. Use when noticing repeated debugging patterns, workflows that could be standardized, or when user asks to &quot;make a skill&quot; or &quot;suggest skills&quot;. Works for any language/framework.</p>
<hr>
<h1 id="make-skills---meta-skill-for-creating-new-claude-code-skills">Make Skills - Meta-Skill for Creating New Claude Code Skills</h1>
<p><strong>Transform repeated workflows into reusable, production-ready skills using a systematic 3-model iterative approach.</strong></p>
<h2 id="🚀-quick-reference-card">🚀 Quick Reference Card</h2>
<pre><code class="language-yaml">When to Create a Skill:
  ✅ Task repeated 3+ times
  ✅ Multi-step workflow that could be standardized
  ✅ Common bug pattern with known solution
  ✅ User says &quot;we keep doing X&quot;

3-Model Process:
  1. Haiku (30s): Quick 70% draft
  2. Sonnet (2m): Add real examples, 90% complete
  3. Opus (5m): Polish to 100% production-ready

Essential Commands:
  git log --all --grep=&quot;pattern&quot; --oneline  # Find patterns
  grep -r &quot;keyword&quot; --include=&quot;*.{js,py,go}&quot;  # Search code
  ls .claude/skills/  # Check existing skills</code></pre>
<h2 id="🎯-when-to-use-this-skill">🎯 When to Use This Skill</h2>
<pre><code class="language-bash"># User triggers:
- &quot;create a new skill for...&quot;
- &quot;make a skill based on...&quot;
- &quot;we keep doing X, let&#39;s make a skill&quot;
- &quot;look through history and suggest skills&quot;

# Proactive triggers (suggest to user):
- Same debugging pattern appears 3+ times in git history
- User repeatedly asks for same type of help
- Complex multi-step workflow happens frequently</code></pre>
<h2 id="🔄-the-3-model-iterative-approach">🔄 The 3-Model Iterative Approach</h2>
<p>Based on successful <code>code-review</code> and <code>state-fixer</code> skill creation:</p>
<h3 id="model-1-haiku-speed-draft"><strong>Model 1: Haiku (Speed Draft)</strong></h3>
<ul>
<li><strong>Goal</strong>: Fast first draft with basic structure</li>
<li><strong>Time</strong>: ~30 seconds</li>
<li><strong>Output</strong>: Core workflow, simple examples</li>
<li><strong>Quality</strong>: 60-70% complete</li>
</ul>
<h3 id="model-2-sonnet-enhancement"><strong>Model 2: Sonnet (Enhancement)</strong></h3>
<ul>
<li><strong>Goal</strong>: Add depth, real examples, better organization</li>
<li><strong>Time</strong>: ~2 minutes</li>
<li><strong>Output</strong>: Detailed examples from actual code, better formatting</li>
<li><strong>Quality</strong>: 85-90% complete</li>
</ul>
<h3 id="model-3-opus-refinement"><strong>Model 3: Opus (Refinement)</strong></h3>
<ul>
<li><strong>Goal</strong>: Polish, edge cases, production-ready</li>
<li><strong>Time</strong>: ~5 minutes</li>
<li><strong>Output</strong>: Comprehensive guide with real commit references</li>
<li><strong>Quality</strong>: 95-100% production-ready</li>
</ul>
<h2 id="📋-the-5-step-skill-creation-process">📋 The 5-Step Skill Creation Process</h2>
<h3 id="workflow-overview-with-model-switches">Workflow Overview with Model Switches</h3>
<pre><code>Step 1: Pattern Mining
  Model: Any (Sonnet recommended)
  ↓
Step 2: Template Creation
  Model: Any (Sonnet recommended)
  ↓
🔄 SWITCH TO HAIKU
  ↓
Step 3: Quick Draft
  Model: Haiku (~30 seconds)
  Output: 70% complete skill
  ↓
🔄 SWITCH TO SONNET
  ↓
Step 4: Enhancement
  Model: Sonnet (~2 minutes)
  Output: 90% complete with real examples
  ↓
🔄 SWITCH TO OPUS
  ↓
Step 5: Production Polish
  Model: Opus (~5 minutes)
  Output: 100% production-ready skill
  ✅ DONE!</code></pre><h3 id="detailed-steps">Detailed Steps</h3>
<h3 id="step-1-pattern-mining-research-phase">Step 1: Pattern Mining (Research Phase)</h3>
<p><strong>💡 Use current model (any model is fine for research)</strong></p>
<p><strong>Goal</strong>: Find repeated workflows in conversation and git history</p>
<p><strong>Universal Pattern Discovery Commands:</strong></p>
<pre><code class="language-bash"># === Git History Mining ===
# Find repeated problem patterns
git log --all --oneline | grep -i &quot;fix\|bug\|error\|issue&quot; | head -30

# Search for specific domains
git log --all --grep=&quot;[KEYWORD]&quot; --oneline  # Replace with: auth, api, state, etc

# Analyze recent work patterns
git log --oneline -50 | cut -d&#39; &#39; -f2- | sort | uniq -c | sort -rn

# Find files changed together (coupling)
git log --all --name-only --format=&quot;&quot; | sort | uniq -c | sort -rn | head -20

# === Codebase Pattern Analysis ===
# Language-agnostic searches
find . -type f -name &quot;*.{js,ts,py,java,go,rb}&quot; -exec grep -l &quot;TODO\|FIXME\|HACK&quot; {} \;

# Find error handling patterns
grep -r &quot;catch\|except\|rescue\|error&quot; --include=&quot;*.{js,ts,py,java,go,rb}&quot; | head -20

# Find test patterns
find . -type f -name &quot;*test*&quot; -o -name &quot;*spec*&quot; | head -20

# === Conversation Pattern Mining ===
# Check existing skills
ls -la .claude/skills/
find .claude/skills -name &quot;SKILL.md&quot; -exec head -20 {} \;

# Recent conversation topics (if logs exist)
# Look for repeated questions, errors, workflows</code></pre>
<p><strong>Universal Questions to Ask User:</strong></p>
<ul>
<li>&quot;What workflows do you repeat most often?&quot;</li>
<li>&quot;What types of bugs keep appearing?&quot;</li>
<li>&quot;Which tasks take multiple iterations to get right?&quot;</li>
<li>&quot;What do you wish was automated?&quot;</li>
<li>&quot;What patterns do you see in your recent work?&quot;</li>
</ul>
<p><strong>Pattern Categories to Look For:</strong></p>
<pre><code>1. Debugging Patterns
   - Specific bug types that recur (state, async, memory leaks)
   - Error patterns in logs
   - Common root causes

2. Development Workflows
   - Feature implementation → review → test cycles
   - Refactoring patterns
   - Migration/upgrade patterns

3. Testing Patterns
   - Test creation workflows
   - Validation sequences
   - Performance testing routines

4. Operations Patterns
   - Deployment workflows
   - Monitoring/debugging production issues
   - Configuration management

5. Code Quality Patterns
   - Review checklists
   - Performance optimization workflows
   - Security audit patterns</code></pre><h3 id="step-2-skill-template-creation">Step 2: Skill Template Creation</h3>
<p><strong>💡 Use current model (any model is fine for planning)</strong></p>
<p><strong>Goal</strong>: Decide on skill structure and content outline</p>
<p><strong>Basic Structure:</strong></p>
<pre><code class="language-markdown">---
name: skill-name
description: Short description with triggers
---

# Skill Name

Brief overview of what this skill does.

## 🎯 Quick Start
- When to use
- User triggers
- Proactive usage

## Common Patterns / Bug Checklist
- Pattern 1 with example
- Pattern 2 with example

## Step-by-Step Workflow
1. Step 1
2. Step 2
...

## Real Examples from Project
### Example 1: [Commit hash]
- Problem:
- Solution:
- Code:

## Testing / Verification
- How to test
- What to check

## Related Skills
- Other skills that complement this</code></pre>
<h3 id="step-3-haiku-draft-fast-initial-version">Step 3: Haiku Draft (Fast Initial Version)</h3>
<p><strong>🔄 ACTION: Tell the user:</strong></p>
<pre><code>✋ PAUSE: Switch to Haiku model now

Run: /model haiku

Then ask me:
&quot;Create a skill for [SKILL_NAME] based on these patterns:
[List 3-5 repeated patterns from Step 1]

Structure:
- Quick Start section
- Common patterns (3-5)
- Basic workflow (3-5 steps)
- 1-2 simple examples

Keep it concise, focus on the most common cases.&quot;</code></pre><p><strong>What Haiku is good at:</strong></p>
<ul>
<li>Fast structure (~30 seconds)</li>
<li>Simple examples</li>
<li>Basic workflow steps</li>
<li>Getting 70% done quickly</li>
</ul>
<p><strong>What to skip in Haiku:</strong></p>
<ul>
<li>Detailed commit references</li>
<li>Edge cases</li>
<li>Complex examples</li>
<li>Extensive documentation</li>
</ul>
<p><strong>When Haiku is done:</strong> Save the draft, then proceed to Step 4.</p>
<h3 id="step-4-sonnet-enhancement-add-depth">Step 4: Sonnet Enhancement (Add Depth)</h3>
<p><strong>🔄 ACTION: Tell the user:</strong></p>
<pre><code>✋ PAUSE: Switch to Sonnet model now

Run: /model sonnet

Then ask me:
&quot;Enhance this skill with:
1. Real commit examples from git history (search: git log --all --grep=&#39;...&#39;)
2. Actual code snippets from the project
3. &#39;Before/After&#39; comparisons from real bugs
4. Better organization and formatting
5. More detailed workflow steps

Read relevant files if needed to get accurate examples.
Base it on actual project code, not hypothetical examples.

Here&#39;s the Haiku draft to enhance:
[Paste the Haiku draft here]&quot;</code></pre><p><strong>What Sonnet is good at:</strong></p>
<ul>
<li>Reading codebase for real examples (~2 minutes)</li>
<li>Finding actual commits with <code>git log</code></li>
<li>Detailed explanations</li>
<li>Better organization</li>
<li>Accurate code snippets</li>
</ul>
<p><strong>When Sonnet is done:</strong> Review the enhanced skill, then proceed to Step 5.</p>
<p><strong>What Sonnet Adds - Real Examples:</strong></p>
<pre><code class="language-markdown">### Before Sonnet (Haiku version):
&quot;Fix array mutation bugs by creating copies before sorting&quot;

### After Sonnet Enhancement:
#### 🔴 Array Mutation Bug (Found in 3 projects)
```javascript
// BEFORE (BUG - Mutates original array):
const key = generateKey(items.sort());  // ❌ Mutates &#39;items&#39;
const filtered = items.filter(x =&gt; x &gt; 0).sort();  // ❌ OK filter, bad sort

// AFTER (FIXED - Safe immutable operations):
const key = generateKey([...items].sort());  // ✅ Sorts copy
const filtered = [...items].filter(x =&gt; x &gt; 0).sort();  // ✅ Full copy chain

// PATTERN: Always spread [...array] before mutating operations</code></pre>
<h4 id="real-commit-examples-added">Real Commit Examples Added:</h4>
<ul>
<li>Links to actual commits showing the fix</li>
<li>Performance metrics (before: 3 bugs/week, after: 0)</li>
<li>Test cases that catch this pattern<pre><code></code></pre></li>
</ul>
<h3 id="step-5-opus-polish-production-ready">Step 5: Opus Polish (Production Ready)</h3>
<p><strong>🔄 ACTION: Tell the user:</strong></p>
<pre><code>✋ PAUSE: Switch to Opus model now

Run: /model opus

Then ask me:
&quot;Polish this skill to production quality:
1. Add edge cases and gotchas
2. Add troubleshooting section
3. Verify all commit hashes are correct
4. Add &#39;Related Skills&#39; section
5. Add &#39;Anti-Patterns&#39; (what NOT to do)
6. Ensure examples are complete and accurate
7. Add metrics/success criteria
8. Review for consistency and completeness

Make this the definitive guide for this workflow.

Here&#39;s the Sonnet-enhanced version to polish:
[Paste the Sonnet version here]&quot;</code></pre><p><strong>What Opus is good at:</strong></p>
<ul>
<li>Comprehensive edge cases (~5 minutes)</li>
<li>Troubleshooting guides</li>
<li>Quality assurance</li>
<li>Completeness check</li>
<li>Professional documentation</li>
</ul>
<p><strong>When Opus is done:</strong>
✅ Your skill is production-ready!
💾 Save to <code>.claude/skills/[skill-name]/SKILL.md</code>
🧪 Test it on a real problem
📊 Track usage metrics</p>
<p><strong>Example - What Opus added to code-review:</strong></p>
<pre><code class="language-markdown">## 🚫 Anti-Patterns
| ❌ Don&#39;t | ✅ Do Instead |
|----------|---------------|
| &quot;It should work now&quot; | &quot;Here&#39;s the test proving it works&quot; |
| &quot;Try it and see&quot; | &quot;Follow these numbered steps&quot; |
| Fix all bugs at once | Fix, test, repeat for each bug |

## 📈 Success Metrics
- Bugs found in self-review: N
- Bugs fixed before user testing: N
- User-reported issues: N
- Iteration cycles: N</code></pre>
<h2 id="🎨-skill-naming-conventions">🎨 Skill Naming Conventions</h2>
<h3 id="good-names">Good Names</h3>
<ul>
<li><strong>state-fixer</strong> ✅ (verb-noun, action-focused)</li>
<li><strong>code-review</strong> ✅ (clear purpose)</li>
<li><strong>iterative-testing</strong> ✅ (describes workflow)</li>
</ul>
<h3 id="bad-names">Bad Names</h3>
<ul>
<li><strong>debug</strong> ❌ (too vague)</li>
<li><strong>helper</strong> ❌ (not descriptive)</li>
<li><strong>fix-stuff</strong> ❌ (unprofessional)</li>
</ul>
<h3 id="pattern">Pattern</h3>
<pre><code>[action]-[target]
   ↓        ↓
  verb     noun

Examples:
- make-skills (make = action, skills = target)
- state-fixer (fix = action, state = target)
- code-review (review = action, code = target)</code></pre><h2 id="📊-common-skill-creation-examples">📊 Common Skill Creation Examples</h2>
<h3 id="example-1-state-management-debugger-skill">Example 1: State Management Debugger Skill</h3>
<p><strong>Pattern Discovery:</strong></p>
<pre><code class="language-bash">git log --all --grep=&quot;state\|redux\|context&quot; --oneline

# Found patterns:
abc123 Fix: State not updating after API call
def456 Fix: Race condition in state updates
ghi789 Fix: localStorage sync issues with React state</code></pre>
<p><strong>Common Theme</strong>: State synchronization bugs across different storage layers</p>
<p><strong>User Signals:</strong></p>
<ul>
<li>&quot;The state isn&#39;t persisting&quot;</li>
<li>&quot;Data disappears on refresh&quot;</li>
<li>&quot;Updates aren&#39;t reflecting in UI&quot;</li>
</ul>
<p><strong>Resulting Skill Structure:</strong></p>
<ol>
<li>Quick diagnostic checklist</li>
<li>State flow diagram (Component → Store → Storage)</li>
<li>Common bug patterns with fixes</li>
<li>Testing strategies for state issues</li>
</ol>
<h3 id="example-2-api-integration-skill">Example 2: API Integration Skill</h3>
<p><strong>Pattern Discovery:</strong></p>
<pre><code class="language-bash"># Conversation analysis revealed:
- 5 instances of &quot;add API endpoint&quot;
- 3 instances of &quot;fix CORS issues&quot;
- 4 instances of &quot;handle API errors&quot;

# Code pattern:
grep -r &quot;fetch\|axios\|api&quot; --include=&quot;*.{js,ts}&quot; | wc -l
# Result: 150+ API calls across codebase</code></pre>
<p><strong>Resulting Skill Structure:</strong></p>
<ol>
<li>API endpoint creation checklist</li>
<li>Error handling patterns</li>
<li>Testing strategies (unit, integration, e2e)</li>
<li>Common pitfalls (CORS, auth, rate limits)</li>
</ol>
<h3 id="example-3-performance-optimization-skill">Example 3: Performance Optimization Skill</h3>
<p><strong>Pattern Discovery:</strong></p>
<pre><code class="language-bash">git log --all --grep=&quot;slow\|performance\|optimize&quot; --oneline

# Found:
- Multiple commits about React re-renders
- Database query optimizations
- Bundle size reductions</code></pre>
<p><strong>User Signals:</strong></p>
<ul>
<li>&quot;The app feels sluggish&quot;</li>
<li>&quot;This query takes too long&quot;</li>
<li>&quot;Bundle size is too large&quot;</li>
</ul>
<p><strong>Resulting Skill Structure:</strong></p>
<ol>
<li>Performance audit workflow</li>
<li>Measurement tools by platform</li>
<li>Common optimization patterns</li>
<li>Before/after comparison templates</li>
</ol>
<h2 id="✅-skill-quality-checklist">✅ Skill Quality Checklist</h2>
<p>Before finalizing a skill:</p>
<h3 id="content">Content</h3>
<ul>
<li><input disabled="" type="checkbox"> Has clear &quot;When to use&quot; section</li>
<li><input disabled="" type="checkbox"> Includes 3+ real examples from project</li>
<li><input disabled="" type="checkbox"> All commit hashes verified (use <code>git show &lt;hash&gt;</code>)</li>
<li><input disabled="" type="checkbox"> Code snippets are accurate (Read from actual files)</li>
<li><input disabled="" type="checkbox"> Has step-by-step workflow</li>
<li><input disabled="" type="checkbox"> Includes &quot;What NOT to do&quot; section</li>
</ul>
<h3 id="organization">Organization</h3>
<ul>
<li><input disabled="" type="checkbox"> Uses emojis for visual scanning (🎯 🔴 ✅ ❌)</li>
<li><input disabled="" type="checkbox"> Has tables for comparisons</li>
<li><input disabled="" type="checkbox"> Code blocks are properly formatted</li>
<li><input disabled="" type="checkbox"> Headers are hierarchical (##, ###)</li>
</ul>
<h3 id="usability">Usability</h3>
<ul>
<li><input disabled="" type="checkbox"> Can be used by Claude without user present</li>
<li><input disabled="" type="checkbox"> Has proactive triggers (when to suggest it)</li>
<li><input disabled="" type="checkbox"> Includes testing/verification steps</li>
<li><input disabled="" type="checkbox"> Links to related skills</li>
</ul>
<h3 id="accuracy">Accuracy</h3>
<ul>
<li><input disabled="" type="checkbox"> All file paths are correct</li>
<li><input disabled="" type="checkbox"> All line numbers are current</li>
<li><input disabled="" type="checkbox"> All examples compile/work</li>
<li><input disabled="" type="checkbox"> No hypothetical code - all real</li>
</ul>
<h2 id="🔧-commands-for-skill-creation">🔧 Commands for Skill Creation</h2>
<h3 id="research-phase">Research Phase</h3>
<pre><code class="language-bash"># === Version Control Analysis ===
# Find related commits
git log --all --grep=&quot;keyword&quot; --oneline

# See commit details
git show &lt;commit-hash&gt;

# Analyze commit frequency by author
git shortlog -sn --all

# Find most changed files (hotspots)
git log --all --name-only --format=&quot;&quot; | sort | uniq -c | sort -rn | head

# === Code Pattern Search (Language Agnostic) ===
# JavaScript/TypeScript
grep -r &quot;pattern&quot; --include=&quot;*.{js,jsx,ts,tsx}&quot;

# Python
grep -r &quot;pattern&quot; --include=&quot;*.py&quot;

# Java/Kotlin
grep -r &quot;pattern&quot; --include=&quot;*.{java,kt}&quot;

# Go
grep -r &quot;pattern&quot; --include=&quot;*.go&quot;

# Ruby
grep -r &quot;pattern&quot; --include=&quot;*.{rb,erb}&quot;

# General pattern search
find . -type f -exec grep -l &quot;pattern&quot; {} \; 2&gt;/dev/null

# === Skill Discovery ===
# List existing skills
ls .claude/skills/

# Read all skill descriptions
find .claude/skills -name &quot;SKILL.md&quot; -exec head -5 {} \;

# Search for similar skills
grep -r &quot;keyword&quot; .claude/skills/</code></pre>
<h3 id="creation-phase">Creation Phase</h3>
<pre><code class="language-bash"># Create skill directory
mkdir -p .claude/skills/new-skill-name

# Create SKILL.md
# (Use Write tool with template above)</code></pre>
<h3 id="verification-phase">Verification Phase</h3>
<pre><code class="language-bash"># Check skill loads
cat .claude/skills/new-skill-name/SKILL.md

# Verify commit hashes exist
git show &lt;hash&gt;

# Test file paths
ls -la &lt;path-from-skill&gt;</code></pre>
<h2 id="📈-skill-evolution-pattern">📈 Skill Evolution Pattern</h2>
<p>Our successful pattern:</p>
<pre><code>Iteration 1 (Haiku):
├─ Basic structure
├─ Simple examples
└─ Core workflow
   ↓ (2 hours of use)

Iteration 2 (Sonnet):
├─ Real commit examples
├─ Actual code from project
├─ Better organization
└─ More detailed steps
   ↓ (1 day of use)

Iteration 3 (Opus):
├─ Edge cases
├─ Troubleshooting
├─ Anti-patterns
├─ Complete documentation
└─ Production ready</code></pre><h2 id="🎯-skill-success-metrics">🎯 Skill Success Metrics</h2>
<p>Track these to know if a skill is useful:</p>
<h3 id="quantitative">Quantitative</h3>
<ul>
<li><strong>Usage frequency</strong>: How often is skill invoked?</li>
<li><strong>Time saved</strong>: Workflow time before vs after skill</li>
<li><strong>Error reduction</strong>: Bugs missed before vs after skill</li>
</ul>
<h3 id="qualitative">Qualitative</h3>
<ul>
<li><strong>User feedback</strong>: &quot;this skill is helpful&quot; or requests for changes</li>
<li><strong>Iteration count</strong>: Does skill reduce back-and-forth?</li>
<li><strong>Coverage</strong>: Does it handle most cases or need extensions?</li>
</ul>
<h3 id="example-from-our-skills">Example from our skills:</h3>
<pre><code>state-fixer:
- Used: 3 times in 1 week
- Time saved: ~30 min per debug session
- Bugs caught: 4/4 state bugs in recent work

code-review:
- Used: Every major feature (5 times)
- Time saved: ~15 min per review
- Bugs caught: 3-5 bugs per review before user testing</code></pre><h2 id="🚫-anti-patterns-what-not-to-do">🚫 Anti-Patterns (What NOT to Do)</h2>
<h3 id="❌-dont-create-skills-for-one-time-tasks">❌ Don&#39;t: Create skills for one-time tasks</h3>
<pre><code>Bad: &quot;import-csv-file&quot; skill for a one-time data import
Good: &quot;data-migration&quot; skill if you do migrations regularly</code></pre><h3 id="❌-dont-make-skills-too-specific">❌ Don&#39;t: Make skills too specific</h3>
<pre><code>Bad: &quot;fix-ybc-table-row-3-bug&quot;
Good: &quot;state-fixer&quot; (covers all state bugs)</code></pre><h3 id="❌-dont-use-hypothetical-examples">❌ Don&#39;t: Use hypothetical examples</h3>
<pre><code>Bad: &quot;Imagine you have a function foo()...&quot;
Good: &quot;In YBCTableDialog.tsx:1321, we had this bug...&quot;</code></pre><h3 id="❌-dont-skip-the-research-phase">❌ Don&#39;t: Skip the research phase</h3>
<pre><code>Bad: Create skill based on 1 occurrence
Good: Find 3+ repeated patterns in git/conversation</code></pre><h3 id="❌-dont-make-skills-without-testing">❌ Don&#39;t: Make skills without testing</h3>
<pre><code>Bad: Write skill and never use it
Good: Use skill 2-3 times, then refine based on actual usage</code></pre><h2 id="🔗-related-skills">🔗 Related Skills</h2>
<ul>
<li><strong>code-review</strong>: Use after creating skill to review quality</li>
<li><strong>state-fixer</strong>: Example of well-structured skill</li>
<li><strong>iterative-testing</strong>: Pattern for skill improvement</li>
</ul>
<h2 id="📚-skill-template-library">📚 Skill Template Library</h2>
<h3 id="quick-copy-paste-templates">Quick Copy-Paste Templates</h3>
<h4 id="minimal-skill-template">Minimal Skill Template</h4>
<pre><code class="language-markdown">---
name: skill-name
description: What it does and when to use it
---

# Skill Name

## 🎯 Quick Start
When to use this skill

## Common Patterns
1. Pattern 1
2. Pattern 2

## Workflow
1. Step 1
2. Step 2
3. Step 3

## Example
Real example from project</code></pre>
<h4 id="full-skill-template">Full Skill Template</h4>
<pre><code class="language-markdown">---
name: skill-name
description: Detailed description with trigger keywords
---

# Skill Name

One-line overview.

## 🎯 Quick Start
- User triggers
- Proactive usage
- When NOT to use

## Common Patterns / Checklist
### Pattern 1
- Example
- Code snippet

### Pattern 2
- Example
- Code snippet

## Step-by-Step Workflow

### Step 1: Name
What to do
```bash
command</code></pre>
<h3 id="step-2-name">Step 2: Name</h3>
<p>What to do</p>
<h2 id="real-examples-from-project">Real Examples from Project</h2>
<h3 id="example-1-commit-hash">Example 1: [Commit hash]</h3>
<p><strong>Problem</strong>:
<strong>Solution</strong>:
<strong>Code</strong>:</p>
<pre><code class="language-language">before → after</code></pre>
<h2 id="testing--verification">Testing / Verification</h2>
<p>How to verify skill worked</p>
<h2 id="🚫-anti-patterns">🚫 Anti-Patterns</h2>
<p>What NOT to do</p>
<h2 id="🔗-related-skills-1">🔗 Related Skills</h2>
<ul>
<li>Skill 1</li>
<li>Skill 2</li>
</ul>
<h2 id="📈-success-metrics">📈 Success Metrics</h2>
<p>How to measure effectiveness</p>
<pre><code>
## 💡 Pro Tips

### Tip 1: Start Small, Iterate
Don&#39;t try to make perfect skill on first try. Use Haiku for quick draft, use it a few times, then enhance with Sonnet/Opus.

### Tip 2: Use Real Commit Hashes
Always reference actual commits. Makes skill credible and verifiable.
```bash
# Good
### Example: Commit 3499b6e
git show 3499b6e

# Bad
### Example: Some bug we fixed</code></pre><h3 id="tip-3-include-console-log-patterns">Tip 3: Include Console Log Patterns</h3>
<p>Real debugging often uses console.log. Include actual log messages used.</p>
<pre><code class="language-javascript">// From state-fixer skill:
console.log(`💾 Saved YBC edits with angle-specific key: ${storageKey}`, editData);</code></pre>
<h3 id="tip-4-add-visual-markers">Tip 4: Add Visual Markers</h3>
<p>Use emojis for quick scanning:</p>
<ul>
<li>🎯 Goals/Objectives</li>
<li>🔴 Critical issues/bugs</li>
<li>✅ Solutions/Correct way</li>
<li>❌ Wrong way/Anti-patterns</li>
<li>📊 Data/Metrics</li>
<li>🔧 Commands/Tools</li>
<li>💡 Tips/Insights</li>
</ul>
<h3 id="tip-5-link-between-skills">Tip 5: Link Between Skills</h3>
<p>Skills work better together. Reference related skills.</p>
<pre><code class="language-markdown">## 🔗 Related Skills
- Use `code-review` after implementing solution
- Use `state-fixer` if dealing with state bugs
- Use `iterative-testing` for geometric algorithms</code></pre>
<h2 id="🌍-cross-language-skill-patterns">🌍 Cross-Language Skill Patterns</h2>
<p>Skills often translate across languages and frameworks. Here&#39;s how to adapt:</p>
<h3 id="universal-skill-categories">Universal Skill Categories</h3>
<table>
<thead>
<tr>
<th>Category</th>
<th>Works For</th>
<th>Example Skills</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Debugging</strong></td>
<td>All languages</td>
<td><code>state-debugger</code>, <code>memory-leak-finder</code>, <code>async-debugger</code></td>
</tr>
<tr>
<td><strong>Testing</strong></td>
<td>All languages</td>
<td><code>test-generator</code>, <code>coverage-analyzer</code>, <code>e2e-builder</code></td>
</tr>
<tr>
<td><strong>Performance</strong></td>
<td>All languages</td>
<td><code>profiler</code>, <code>optimizer</code>, <code>bottleneck-finder</code></td>
</tr>
<tr>
<td><strong>Code Quality</strong></td>
<td>All languages</td>
<td><code>code-review</code>, <code>refactor-assistant</code>, <code>smell-detector</code></td>
</tr>
<tr>
<td><strong>Architecture</strong></td>
<td>All languages</td>
<td><code>pattern-implementer</code>, <code>module-designer</code>, <code>api-builder</code></td>
</tr>
</tbody></table>
<h3 id="language-specific-adaptations">Language-Specific Adaptations</h3>
<pre><code class="language-yaml">JavaScript/TypeScript:
  - Focus: Async/Promise patterns, React hooks, Node.js specifics
  - Tools: npm, webpack, ESLint
  - Patterns: Component lifecycle, state management

Python:
  - Focus: Type hints, async/await, decorators
  - Tools: pip, pytest, mypy
  - Patterns: Context managers, generators

Java/Kotlin:
  - Focus: Concurrency, streams, annotations
  - Tools: Maven/Gradle, JUnit
  - Patterns: Dependency injection, builders

Go:
  - Focus: Goroutines, channels, interfaces
  - Tools: go mod, go test
  - Patterns: Error handling, context usage

Ruby:
  - Focus: Metaprogramming, blocks, modules
  - Tools: bundler, RSpec
  - Patterns: DSLs, mixins</code></pre>
<h2 id="🎓-skill-evolution-patterns">🎓 Skill Evolution Patterns</h2>
<h3 id="the-3-stage-lifecycle">The 3-Stage Lifecycle</h3>
<pre><code>Stage 1: Discovery (0-3 occurrences)
├─ Pattern emerges from repeated work
├─ User mentions &quot;we keep doing X&quot;
└─ Initial documentation in conversation
   ↓
Stage 2: Formalization (3-5 uses)
├─ Create initial skill with Haiku
├─ Test on real problems
├─ Gather feedback and edge cases
└─ Enhance with Sonnet
   ↓
Stage 3: Production (5+ uses)
├─ Polish with Opus
├─ Add metrics and success criteria
├─ Create related skills
└─ Skill becomes standard workflow</code></pre><h3 id="success-indicators">Success Indicators</h3>
<p><strong>Quantitative Metrics:</strong></p>
<pre><code class="language-yaml">High Value Skill:
  - Used: &gt;5 times per week
  - Time saved: &gt;30 min per use
  - Error reduction: &gt;50%
  - User mentions: &quot;use the X skill&quot;

Medium Value Skill:
  - Used: 2-5 times per week
  - Time saved: 10-30 min per use
  - Error reduction: 20-50%
  - User aware of skill

Low Value (Needs Refinement):
  - Used: &lt;2 times per week
  - Time saved: &lt;10 min
  - May need broader scope or merger with another skill</code></pre>
<h2 id="🚀-advanced-skill-patterns">🚀 Advanced Skill Patterns</h2>
<h3 id="composite-skills">Composite Skills</h3>
<p>Skills that combine multiple smaller skills:</p>
<pre><code class="language-markdown">deployment-pipeline:
  ├─ Uses: code-review
  ├─ Uses: test-runner
  ├─ Uses: performance-checker
  └─ Orchestrates full deployment workflow</code></pre>
<h3 id="domain-specific-skills">Domain-Specific Skills</h3>
<p>Highly specialized for particular domains:</p>
<pre><code class="language-markdown">ml-model-debugger:
  - Dataset validation
  - Training monitoring
  - Hyperparameter tuning
  - Model versioning

database-migration:
  - Schema evolution
  - Data transformation
  - Rollback strategies
  - Zero-downtime techniques</code></pre>
<h3 id="meta-skills">Meta-Skills</h3>
<p>Skills about skills (like this one):</p>
<pre><code class="language-markdown">skill-optimizer:
  - Analyzes skill usage patterns
  - Suggests improvements
  - Merges redundant skills
  - Creates skill hierarchies</code></pre>
<hr>
<p><strong>Remember</strong>: The best skills come from <strong>real repeated patterns</strong>, not anticipated needs. Let the work guide you to the skills you actually need!</p>
<p><strong>Universal Truth</strong>: If you&#39;ve done something manually 3+ times, it&#39;s time to make it a skill.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[안트로픽 버그, 다시 한번 엔비디아 생태계가 절대적인지 알려줌]]></title>
            <link>https://velog.io/@hur-kyuh-leez/%EC%95%88%ED%8A%B8%EB%A1%9C%ED%94%BD-%EB%B2%84%EA%B7%B8-%EB%8B%A4%EC%8B%9C-%ED%95%9C%EB%B2%88-%EC%97%94%EB%B9%84%EB%94%94%EC%95%84-%EC%83%9D%ED%83%9C%EA%B3%84%EA%B0%80-%EC%A0%88%EB%8C%80%EC%A0%81%EC%9D%B8%EC%A7%80-%EC%95%8C%EB%A0%A4%EC%A4%8C</link>
            <guid>https://velog.io/@hur-kyuh-leez/%EC%95%88%ED%8A%B8%EB%A1%9C%ED%94%BD-%EB%B2%84%EA%B7%B8-%EB%8B%A4%EC%8B%9C-%ED%95%9C%EB%B2%88-%EC%97%94%EB%B9%84%EB%94%94%EC%95%84-%EC%83%9D%ED%83%9C%EA%B3%84%EA%B0%80-%EC%A0%88%EB%8C%80%EC%A0%81%EC%9D%B8%EC%A7%80-%EC%95%8C%EB%A0%A4%EC%A4%8C</guid>
            <pubDate>Thu, 18 Sep 2025 22:43:58 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.anthropic.com/engineering/a-postmortem-of-three-recent-issues"><img src="https://velog.velcdn.com/images/hur-kyuh-leez/post/3ee68d82-a89f-48c4-ac8f-8654c4ac30fe/image.png" alt=""></a></p>
<p>골치 아픈 버그가 하나 터졌다. 대형 모델 서빙할 때, JAX 쓰고 TPU로 돌리니까 XLA 컴파일러에서 이상한 정밀도(16비트-32비트) 엇갈림 때문에, 가장 확률 높은 토큰이 아예 누락되는 등, 한참 동안 아무도 알아채지 못했던 이상 버그가 간헐적으로 등장한 거다.</p>
<p>솔직히 말하면, NVIDIA 서버에 PyTorch만 썼으면 이런 일 진짜 거의 없었을 거다.
오히려 JAX+TPU+XLA라는 최신(?) 조합이 아니었으면, 누구나 원인 짚고 패치하기 쉬웠다. PyTorch는 개발자 수, 디버깅 편의성, 정밀도 자동 관리를 이미 수년간 검증받았다.</p>
<p>앞으로도 AMD든, 뭐든 새로운 하드웨어&amp;프레임워크 쓰면 비슷한 꼬인 버그 만날 확률 정말 높다.
결국 진짜 중요한 건, 코드를 누구보다 멋지게 짜는 것도 아니고, 가장 적합한 &#39;도구&#39;와 아키텍처, 그리고 제대로 동작하는지 일찍 알아낼 수 있는 환경과 습관이다.</p>
<p>아직까지는 NVIDIA+PyTorch. 이 조합이 실패 없는 안전빵이고, 새로운 플레잉필드에선 막연한 혁신보다, 검증된 프레임워크와 개발 생태계가 훨씬 더 중요하다.
앞으로 변화 더 빨라진다면, 괜히 최신 기술 따라가다 내 일자리까지 털릴 수 있으니, 자기가 쓰는 도구와 플랫폼의 한계, 버그까지 미리 파악해두는 사람이 진짜로 살아남는다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Codebuff, Claudecode Opus 보다 좋은 CLI]]></title>
            <link>https://velog.io/@hur-kyuh-leez/Codebuff-Claudecode-Opus-%EB%B3%B4%EB%8B%A4-%EC%A2%8B%EC%9D%80-CLI</link>
            <guid>https://velog.io/@hur-kyuh-leez/Codebuff-Claudecode-Opus-%EB%B3%B4%EB%8B%A4-%EC%A2%8B%EC%9D%80-CLI</guid>
            <pubDate>Thu, 18 Sep 2025 01:53:25 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hur-kyuh-leez/post/a6f0b5d0-69c4-4479-bc50-59d36f1ec347/image.png" alt="">
비싸지만 현재 1짱</p>
<p>클로드코드 및 다른 AI 코딩툴 다 써도 해결 안된 문제를 3트만에 해결
대신 비쌈...</p>
<p><a href="https://codebuff.com/referrals/ref-ddf13a06-cf7e-4f22-bcb8-dfaa453531ae">서로 250 크레딧 리퍼럴 링크(최대 5명)</a></p>
<p>유튜브 관련 링크
<a href="https://www.youtube.com/watch?v=y4JvgfsO8PU">https://www.youtube.com/watch?v=y4JvgfsO8PU</a>
<a href="https://www.youtube.com/watch?v=gcWy_mQiEFc">https://www.youtube.com/watch?v=gcWy_mQiEFc</a></p>
<hr>
<p><a href="https://www.anthropic.com/engineering/a-postmortem-of-three-recent-issues">안트로픽 버그 fix</a></p>
<p>위 버그 때문에 클로드 오프스 보다 좋아 보인걸 수도 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[manli rtx 5090 RGB 싱크 맞추기]]></title>
            <link>https://velog.io/@hur-kyuh-leez/manli-rtx-5090-RGB-%EC%8B%B1%ED%81%AC-%EB%A7%9E%EC%B6%94%EA%B8%B0</link>
            <guid>https://velog.io/@hur-kyuh-leez/manli-rtx-5090-RGB-%EC%8B%B1%ED%81%AC-%EB%A7%9E%EC%B6%94%EA%B8%B0</guid>
            <pubDate>Sat, 13 Sep 2025 05:58:12 GMT</pubDate>
            <description><![CDATA[<p>만리 공식 웹사이트에서 DRS <a href="https://www.manli.com/en/support-download-34-0.html">다운로드</a></p>
<p>DRS Updating 읽고 따라하기
<img src="https://velog.velcdn.com/images/hur-kyuh-leez/post/6bf497e9-e70f-421a-a9f8-f783914da1f6/image.png" alt=""></p>
<p>2번정도는 program failed 나오는데, 여러번 하면 결국 된다.</p>
<p>메인보드사 RGB Controller  다운받고</p>
<p><img src="https://velog.velcdn.com/images/hur-kyuh-leez/post/1cae040f-f5b7-4270-b155-262cdd434d60/image.png" alt=""></p>
<p>윈도우 설정까지 맞추면 끝.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[생성 확산 모델 generative diffusion model 수학 공식 풀어서 설명하기]]></title>
            <link>https://velog.io/@hur-kyuh-leez/%EC%83%9D%EC%84%B1-%ED%99%95%EC%82%B0-%EB%AA%A8%EB%8D%B8-generative-diffusion-model-%EC%88%98%ED%95%99-%EA%B3%B5%EC%8B%9D-%ED%92%80%EC%96%B4%EC%84%9C-%EC%84%A4%EB%AA%85%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@hur-kyuh-leez/%EC%83%9D%EC%84%B1-%ED%99%95%EC%82%B0-%EB%AA%A8%EB%8D%B8-generative-diffusion-model-%EC%88%98%ED%95%99-%EA%B3%B5%EC%8B%9D-%ED%92%80%EC%96%B4%EC%84%9C-%EC%84%A4%EB%AA%85%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 05 Aug 2025 01:18:55 GMT</pubDate>
            <description><![CDATA[<p>최근 인공지능 그림들을 보면 감탄이 나옵니다. DALL-E, Midjourney 같은 모델들은 어떻게 완전히 새로운 이미지를 만들어낼까요? 이 기술의 중심에는 &#39;확산 모델(Diffusion Model)&#39;이라는 아이디어가 있습니다.</p>
<p>문제는 대부분의 설명이 시작부터 아래와 같은 알 수 없는 수학 공식을 들이민다는 겁니다.</p>
<p><code>q(x_t | x_(t-1)) = N(x_t; sqrt(1 - beta_t) * x_(t-1), beta_t * I)</code></p>
<p>이런 식만 보고 &quot;아, 노이즈를 추가하는 정규분포군!&quot; 하고 바로 이해하는 사람이 몇이나 될까요? 공식을 이해하려면 직관이 먼저입니다. 제가 이제부터 이 공식이 왜 나왔는지, 그리고 이 모델이 실제로 어떻게 작동하는지 차근차근 설명해 드리겠습니다. 설명을 다 듣고 나면, 이 공식이 사실은 매우 간단한 아이디어를 표현한 것뿐이라는 걸 깨닫게 되실 겁니다.</p>
<h4 id="확산-모델의-큰-그림-예술가가-되는-비법">확산 모델의 큰 그림: 예술가가 되는 비법</h4>
<p>확산 모델의 핵심 아이디어는 아주 역설적이고 재미있습니다. AI에게 &#39;창조&#39;하는 법을 가르치기 위해, 먼저 &#39;파괴&#39;하는 법을 완벽하게 마스터하게 하는 것입니다.</p>
<p>가장 쉬운 비유로 시작해 보죠.</p>
<ul>
<li><strong>선명한 원본 사진</strong>이 한 장 있습니다. 우리의 최종 목표는 AI가 이런 사진을 스스로 그리게 하는 것입니다.</li>
<li>그런데 처음부터 흰 캔버스에 그림을 그리게 하는 건 너무 어렵습니다.</li>
<li>대신, AI에게 <strong>망가진 사진을 복원하는 방법</strong>을 가르치기로 합니다.</li>
<li>그러려면? AI에게 줄 &#39;망가진 사진&#39; 문제집이 필요하겠죠. 그래서 우리는 먼저 사진을 망가뜨리는 전문가가 되어야 합니다.</li>
</ul>
<p>이것이 바로 확산 모델의 <strong>순방향 과정(Forward Process)</strong>과 <strong>역방향 과정(Reverse Process)</strong>의 핵심입니다.</p>
<h4 id="1-순방향-과정-forward-process-일부러-사진을-망가뜨리기">1. 순방향 과정 (Forward Process): 일부러 사진을 망가뜨리기</h4>
<p>이 단계는 AI를 훈련시키기 위한 &#39;문제집&#39;을 만드는 과정입니다. 깨끗한 사진(x_0)에서 시작해서, 그 위에 모래알 같은 <strong>노이즈(noise)를 아주 조금씩, 여러 번(T번)에 걸쳐 뿌립니다.</strong></p>
<p>한 번 뿌릴 때마다 사진은 아주 살짝 손상됩니다. 이 과정을 수백, 수천 번 반복하면, 마지막(x_T)에는 원래 사진이 무엇이었는지 전혀 알아볼 수 없는 순수한 노이즈(TV 채널이 끊겼을 때 나오는 &#39;지지직&#39; 화면)만 남게 됩니다.</p>
<p><strong>이제 수학 공식을 파헤쳐 봅시다</strong></p>
<blockquote>
<p><code>q(x_t | x_(t-1)) = N(x_t; sqrt(1 - beta_t) * x_(t-1), beta_t * I)</code></p>
</blockquote>
<p>겁먹지 마세요. 하나씩 뜯어보면 별거 아닙니다.</p>
<ul>
<li><code>q(x_t | x_(t-1))</code>: &quot;이전 단계 이미지(x_(t-1))가 있을 때, 다음 단계 이미지(x_t)는 어떤 모습일까?&quot;를 나타내는 기호입니다. 즉, &#39;노이즈를 한 번 뿌렸을 때의 결과&#39;를 설명하는 식이죠.</li>
<li><code>N(...)</code>: &#39;정규 분포&#39; 또는 &#39;가우시안 분포&#39;를 의미합니다. 갑자기 웬 통계일까요? 우리가 추가하는 노이즈는 완전히 무작위적이지만, 대부분의 노이즈는 미세한 변화를 주고 아주 가끔 큰 변화를 주는 패턴을 보입니다. 이런 자연스러운 무작위성을 표현하기에 가장 적합한 도구가 바로 정규 분포입니다.</li>
<li><strong>평균 (<code>sqrt(1 - beta_t) * x_(t-1)</code>)</strong>: 이 부분이 핵심입니다. <code>beta_t</code>(베타)는 t번째 단계에서 우리가 뿌릴 노이즈의 양을 나타내는 아주 작은 숫자입니다(예: 0.001). 그러면 <code>sqrt(1 - beta_t)</code>는 1보다 아주 살짝 작은 값이 되겠죠? 즉, 이 부분의 의미는 <strong>&quot;이전 이미지를 가져와서 아주 살짝 희미하게(값을 작게) 만들어라&quot;</strong>는 뜻입니다. 원본의 형태는 유지하되, 약간 흐리게 만드는 거죠.</li>
<li><strong>분산 (<code>beta_t * I</code>)</strong>: 바로 이 부분이 <strong>실제 노이즈를 뿌리는 역할</strong>을 합니다. 분산은 데이터가 흩어진 정도를 의미하는데요, 여기서는 <code>beta_t</code>의 강도로 픽셀 값들을 무작위로 흩어놓으라는 의미입니다.</li>
</ul>
<p><strong>순방향 과정 한 줄 요약</strong>: &quot;이전 이미지를 살짝 흐리게 만들고, 그 위에 <code>beta_t</code>만큼의 노이즈를 뿌린다.&quot; 이 과정을 T번 반복하면 완벽한 노이즈 이미지가 만들어집니다.
(역자: 결국 순방향 과정은 AI를 위한 &#39;오답 노트&#39;를 만드는 과정이라고 보시면 됩니다. 정답(깨끗한 이미지)과 다양한 수준의 오답(노이즈 낀 이미지)을 미리 다 만들어두는 거죠.)</p>
<h4 id="2-역방향-과정-reverse-process-ai가-사진을-복원하는-법-배우기">2. 역방향 과정 (Reverse Process): AI가 사진을 복원하는 법 배우기</h4>
<p>이제 본격적으로 AI를 훈련시킬 시간입니다. AI는 &#39;망가진 사진&#39;을 보고 &#39;어떻게 망가졌는지&#39;를 알아맞히는 전문가가 되어야 합니다.</p>
<p><strong>어려움</strong>: <code>x_t</code>(노이즈가 조금 낀 이미지)를 보고 <code>x_(t-1)</code>(노이즈가 끼기 바로 전 이미지)을 예측하는 것은 거의 불가능합니다. 경우의 수가 너무 많기 때문이죠.</p>
<p><strong>천재적인 발상의 전환</strong>: 여기서 확산 모델의 가장 중요한 아이디어가 나옵니다. <strong>&quot;이전 이미지를 통째로 예측하지 말고, 방금 추가된 &#39;노이즈&#39;만 예측하자!&quot;</strong></p>
<p>AI 모델(<code>epsilon_theta</code>)의 역할은 이렇습니다.</p>
<ul>
<li><strong>입력</strong>: 노이즈 낀 이미지 <code>x_t</code>와 현재 단계 <code>t</code>를 AI에게 보여줍니다. (역자: 단계 <code>t</code>를 알려주는 것이 매우 중요합니다. AI는 지금이 초기 단계인지, 거의 다 복원된 단계인지 알아야 예측할 노이즈의 양을 조절할 수 있습니다.)</li>
<li><strong>출력</strong>: AI는 <code>x_t</code>에 섞여있을 것이라고 <strong>예측되는 노이즈 <code>epsilon</code></strong>을 뱉어냅니다.</li>
</ul>
<p><strong>훈련 과정</strong>:</p>
<ol>
<li>순방향 과정에서 우리는 <code>t</code> 단계의 노이즈 낀 이미지(<code>x_t</code>)와, 그때 사용한 <strong>실제 정답 노이즈(<code>epsilon</code>)</strong>를 모두 알고 있습니다.</li>
<li>AI에게 <code>x_t</code>를 보여주고 &quot;여기에 섞인 노이즈가 뭘까?&quot;라고 묻습니다.</li>
<li>AI는 예측 노이즈를 내놓습니다.</li>
<li>AI의 예측과 실제 정답을 비교해서, 둘 사이의 <strong>차이(오차)</strong>를 계산합니다.</li>
<li>이 오차를 줄이는 방향으로 AI의 내부 파라미터(<code>theta</code>)를 계속 업데이트합니다. 마치 오답 노트를 보며 공부하는 학생처럼요.</li>
</ol>
<p><strong>역방향 과정 한 줄 요약</strong>: &quot;AI는 노이즈 낀 이미지를 보고 &#39;어떤 노이즈가 추가됐을까?&#39;를 맞추는 훈련을 반복하며, 점차 노이즈 예측의 달인이 되어갑니다.&quot;</p>
<h4 id="최종-정리-창조는-어떻게-일어나는가">최종 정리: 창조는 어떻게 일어나는가?</h4>
<p>훈련이 끝난 확산 모델은 이제 &#39;노이즈 예측의 대가&#39;가 되었습니다. 이제 이 모델로 완전히 새로운 이미지를 만들 수 있습니다.</p>
<ol>
<li>완전히 무작위적인 노이즈(순수한 &#39;지지직&#39; 화면 <code>x_T</code>)에서 시작합니다.</li>
<li>AI에게 이 노이즈 덩어리를 보여주며 &quot;여기서 제거해야 할 노이즈는 뭐야?&quot;라고 묻습니다.</li>
<li>AI는 예측한 노이즈를 알려주고, 우리는 그 노이즈를 <code>x_T</code>에서 살짝 뺍니다. 그러면 아주 희미하게 무언가의 형체가 나타납니다 (<code>x_(T-1)</code>).</li>
<li>이 과정을 <code>x_0</code>에 도달할 때까지 계속 반복합니다.</li>
<li>그러면 최종적으로, 훈련 데이터에서 봤던 그림들과 비슷하지만 세상에 없던 새로운, 깨끗한 이미지가 마법처럼 생성됩니다.</li>
</ol>
<p>이것이 바로 생성 확산 모델의 작동 원리입니다. 복잡한 수식은 결국 <strong>&#39;사진을 체계적으로 망가뜨렸다가, 그 과정을 거꾸로 되짚어 복원하는&#39;</strong> 매우 직관적인 아이디어를 표현한 것뿐입니다.</p>
<hr>
<h3 id="추가설명-1">추가설명 1</h3>
<p><code>sqrt(1 - beta_t)</code>에서 <strong>sqrt를 사용하는 이유는 &#39;분산(variance)&#39;의 성질 때문</strong>입니다. 양수로 만들려는 목적이 아니라, <strong>전체 분산을 1로 유지하기 위한 수학적 장치</strong>입니다.</p>
<p>이것을 이해하려면 &#39;분산&#39;과 &#39;표준편차&#39;의 관계를 먼저 알아야 합니다.</p>
<h2 id="1-분산variance과-표준편차standard-deviation"><strong>1. 분산(Variance)과 표준편차(Standard Deviation)</strong></h2>
<ul>
<li><strong>분산 (<code>σ²</code>)</strong>: 데이터가 평균으로부터 얼마나 퍼져 있는지를 나타내는 값입니다. 숫자가 클수록 많이 흩어져 있다는 뜻입니다.</li>
<li><strong>표준편차 (<code>σ</code>)</strong>: 분산에 제곱근(sqrt)을 씌운 값입니다. 분산은 단위를 제곱한 형태라 직관적이지 않아서, 다시 원래 단위로 돌려놓은 것이 표준편차입니다.</li>
</ul>
<p><strong>핵심 관계</strong>: <strong>표준편차 = <code>sqrt(분산)</code></strong></p>
<p>우리가 사용하는 가우시안 노이즈는 <strong>&#39;표준&#39; 정규 분포</strong>를 따릅니다.</p>
<ul>
<li><strong>표준 정규 분포 (<code>N(0, I)</code>)</strong>: 평균이 0이고, <strong>분산이 1</strong>인 특별한 정규 분포입니다.</li>
</ul>
<h3 id="2-왜-분산을-1로-유지해야-할까요"><strong>2. 왜 분산을 1로 유지해야 할까요?</strong></h3>
<p>확산 모델의 아이디어는, 깨끗한 이미지(<code>x_0</code>)에 노이즈를 계속 추가해서 최종적으로는 <strong>완전히 무작위적인 노이즈(<code>x_T</code>)</strong>, 즉 <strong>표준 정규 분포 <code>N(0, I)</code></strong> 와 거의 똑같은 상태로 만드는 것입니다.</p>
<p>여기서 중요한 가정이 있습니다. <strong>&quot;과정 중간에 있는 모든 이미지(<code>x_1</code>, <code>x_2</code>, ... <code>x_t</code>)들도 대략적으로 표준 정규 분포(<code>N(0, I)</code>)를 따르게 만들자!&quot;</strong> 는 것입니다. 즉, 각 단계의 이미지들의 <strong>분산도 항상 1로 유지</strong>되도록 만들고 싶은 거죠.</p>
<p>왜냐하면, 이렇게 하면 모델이 훨씬 안정적으로 학습되고, 수학적으로 다루기도 쉬워지기 때문입니다.</p>
<h3 id="3-sqrt가-마법을-부리는-방법-분산을-1로-만드는-과정"><strong>3. Sqrt가 마법을 부리는 방법: 분산을 1로 만드는 과정</strong></h3>
<p>이제 수식을 다시 봅시다.</p>
<blockquote>
<p><strong><code>x_t = sqrt(1 - β_t) * x_{t-1} + sqrt(β_t) * ϵ</code></strong></p>
</blockquote>
<p>이 식은 &quot;다음 이미지(<code>x_t</code>)&quot;는 &quot;이전 이미지(<code>x_{t-1}</code>)의 성분&quot;과 &quot;새로운 노이즈(<code>ϵ</code>)의 성분&quot;을 더해서 만들어진다는 뜻입니다.</p>
<p>통계학에는 아주 중요한 공식이 있습니다. 서로 독립적인 두 확률 변수 X, Y가 있을 때,</p>
<blockquote>
<p><strong><code>Var(a*X + b*Y) = a² * Var(X) + b² * Var(Y)</code></strong></p>
</blockquote>
<p>(여기서 Var는 분산(Variance)을 의미합니다.)</p>
<p>이 공식을 우리 식에 적용해 봅시다.</p>
<ul>
<li><code>a = sqrt(1 - β_t)</code></li>
<li><code>X = x_{t-1}</code></li>
<li><code>b = sqrt(β_t)</code></li>
<li><code>Y = ϵ</code></li>
</ul>
<p>그러면 <code>x_t</code>의 분산은 다음과 같이 계산됩니다.</p>
<blockquote>
<p><strong><code>Var(x_t) = (sqrt(1 - β_t))² * Var(x_{t-1}) + (sqrt(β_t))² * Var(ϵ)</code></strong></p>
</blockquote>
<p>여기서 제곱근(sqrt)과 제곱(²)이 서로 만나 사라지는 마법이 일어납니다!</p>
<blockquote>
<p><strong><code>Var(x_t) = (1 - β_t) * Var(x_{t-1}) + β_t * Var(ϵ)</code></strong></p>
</blockquote>
<p>이제 각 항의 분산을 대입해 봅시다.</p>
<ul>
<li><code>Var(x_{t-1})</code>: 우리는 이전 단계의 이미지도 분산이 1이라고 가정했습니다. 그래서 <code>Var(x_{t-1}) = 1</code> 입니다.</li>
<li><code>Var(ϵ)</code>: <code>ϵ</code>는 우리가 추가하는 순수 노이즈이고, 표준 정규 분포를 따르므로 분산이 1입니다. <code>Var(ϵ) = 1</code> 입니다.</li>
</ul>
<p>이 값들을 대입하면,</p>
<blockquote>
<p><strong><code>Var(x_t) = (1 - β_t) * 1 + β_t * 1</code></strong>
<strong><code>Var(x_t) = 1 - β_t + β_t</code></strong>
<strong><code>Var(x_t) = 1</code></strong></p>
</blockquote>
<p><strong>결론적으로, <code>x_t</code>의 분산도 정확히 1이 됩니다!</strong></p>
<h3 id="요약"><strong>요약</strong></h3>
<ul>
<li><strong>Sqrt를 왜 쓰나요?</strong><ul>
<li><strong>분산을 조절하기 위해서입니다.</strong></li>
</ul>
</li>
<li><strong>어떻게 조절하나요?</strong><ul>
<li>이전 이미지에서 가져올 성분(<code>x_{t-1}</code>)과 새로운 노이즈에서 가져올 성분(<code>ϵ</code>)의 <strong>분산의 합이 항상 1이 되도록</strong> 계수를 설정하는 것입니다.</li>
<li>계수들을 각각 <code>sqrt(1 - β_t)</code> 와 <code>sqrt(β_t)</code> 로 설정하면, 이들을 제곱해서 더했을 때 <code>(1 - β_t) + β_t = 1</code> 이 되기 때문에, 다음 단계 이미지의 분산도 깔끔하게 1로 유지됩니다.</li>
</ul>
</li>
</ul>
<p>즉, <strong><code>sqrt</code>는 각 단계에서 이미지의 &#39;흩어짐 정도(분산)&#39;를 일정하게 유지시켜주는, 매우 정교하고 중요한 수학적 장치</strong>인 것입니다. 양수/음수와는 직접적인 관련이 없습니다.</p>
<hr>
<h3 id="추가설명-2">추가설명 2</h3>
<p>네, 아주 좋은 지적입니다. 그 부분을 명확하게 짚고 넘어가는 것이 중요합니다.</p>
<blockquote>
<p><strong><code>q(x_t | x_{t-1}) = N(x_t; sqrt(1 - β_t) * x_{t-1}, β_t * I)</code></strong></p>
</blockquote>
<p>여기서 왜 <code>β_t * I</code> 가 분산을 나타내는지 단계별로 설명해 드릴게요.</p>
<h3 id="1-정규-분포의-기본-형태-복습"><strong>1. 정규 분포의 기본 형태 복습</strong></h3>
<p>먼저, 정규 분포를 나타내는 기호 <code>N(μ, σ²)</code>를 다시 봅시다.</p>
<ul>
<li><strong><code>μ</code> (뮤)</strong>: 평균 (데이터가 어디에 몰려있는가)</li>
<li><strong><code>σ²</code> (시그마 제곱)</strong>: 분산 (데이터가 얼마나 널리 퍼져있는가)</li>
</ul>
<p>우리 수식에서 이 형태에 맞춰보면 다음과 같습니다.</p>
<ul>
<li>평균 <code>μ</code> = <code>sqrt(1 - β_t) * x_{t-1}</code></li>
<li>분산 <code>σ²</code> = <code>β_t * I</code></li>
</ul>
<p>즉, 이 수식은 <strong><code>β_t * I</code>를 분산으로 갖는 정규 분포</strong>를 따르도록 정의된 것입니다. 이제 왜 이것이 &#39;분산&#39;의 역할을 하는지 그 의미를 파헤쳐 보겠습니다.</p>
<h3 id="2-i-단위-행렬-identity-matrix의-역할-픽셀별-독립성"><strong>2. <code>I</code> (단위 행렬, Identity Matrix)의 역할: 픽셀별 독립성</strong></h3>
<p>이미지는 수많은 픽셀들의 집합입니다. 예를 들어 64x64 이미지는 4096개의 픽셀 값을 가집니다.</p>
<ul>
<li>만약 분산이 그냥 숫자 하나(<code>β_t</code>)라면, 모든 픽셀이 똑같은 정도로만 퍼져나간다는 의미가 됩니다.</li>
<li>하지만 우리는 각 픽셀에 <strong>서로 독립적인(상관없는)</strong> 노이즈를 추가하고 싶습니다. 1번 픽셀에 추가된 노이즈가 2번 픽셀에 영향을 주면 안 됩니다.</li>
</ul>
<p>이 &#39;독립성&#39;을 수학적으로 표현하는 것이 바로 <strong>단위 행렬 <code>I</code></strong> 입니다.</p>
<ul>
<li><p><strong>단위 행렬 <code>I</code>란?</strong>
대각선 성분만 1이고 나머지는 모두 0인 행렬입니다.
$$
I = \begin{pmatrix}
1 &amp; 0 &amp; 0 \
0 &amp; 1 &amp; 0 \
0 &amp; 0 &amp; 1
\end{pmatrix}
$$
(이건 3x3 예시이고, 4096개 픽셀이라면 4096x4096 행렬이 됩니다.)</p>
</li>
<li><p><strong>통계학에서의 의미</strong>: 분산을 나타내는 행렬(공분산 행렬)에서, 대각선 이외의 성분이 0이라는 것은 각 변수(픽셀)들이 서로 <strong>상관관계가 없다(독립적이다)</strong>는 뜻입니다.</p>
</li>
</ul>
<p>따라서 분산 자리에 <code>I</code>가 있다는 것은 <strong>&quot;각 픽셀에 추가되는 노이즈는 다른 픽셀의 노이즈와 완전히 독립적이다&quot;</strong> 라는 가정을 나타냅니다.</p>
<h3 id="3-β_t-베타의-역할-노이즈의-강도-조절"><strong>3. <code>β_t</code> (베타)의 역할: 노이즈의 강도 조절</strong></h3>
<p>이제 <code>β_t</code>가 무엇을 하는지 봅시다.</p>
<ul>
<li><p><code>β_t</code>는 아주 작은 양수입니다 (예: 0.001, 0.002, ...).</p>
</li>
<li><p>이 숫자가 단위 행렬 <code>I</code>에 곱해집니다.
$$
\beta_t * I = \beta_t * \begin{pmatrix} 1 &amp; 0 \ 0 &amp; 1 \end{pmatrix} = \begin{pmatrix} \beta_t &amp; 0 \ 0 &amp; \beta_t \end{pmatrix}
$$</p>
</li>
<li><p><strong>의미</strong>: 이제 분산 행렬의 대각선 성분이 1이 아니라 <code>β_t</code>가 되었습니다. 이는 <strong>각 픽셀의 노이즈가 평균 0, 분산 <code>β_t</code>인 정규 분포를 따른다</strong>는 의미입니다.</p>
</li>
<li><p><strong>결론적으로 <code>β_t</code>는 노이즈의 &#39;강도&#39; 또는 &#39;크기&#39;를 조절하는 역할을 합니다.</strong></p>
<ul>
<li><code>β_t</code>가 크면: 노이즈가 강하게 추가되어 이미지가 많이 망가집니다.</li>
<li><code>β_t</code>가 작으면: 노이즈가 약하게 추가되어 이미지가 조금만 망가집니다.</li>
</ul>
</li>
</ul>
<p>확산 모델에서는 보통 <code>t</code>가 0에 가까울 때는 <code>β_t</code>를 작게 설정하고, <code>t</code>가 커질수록 <code>β_t</code>를 점차 크게 만들어 노이즈의 강도를 점진적으로 높입니다.</p>
<h3 id="정리"><strong>정리</strong></h3>
<blockquote>
<p><strong>분산 (<code>β_t * I</code>)</strong> 이라는 표현을 다시 한번 해석해 봅시다.</p>
</blockquote>
<p>&quot;각 픽셀에 노이즈를 추가할 건데,&quot;</p>
<ul>
<li><strong><code>I</code></strong>: &quot;각 픽셀에 추가되는 노이즈는 서로 완전히 독립적이야.&quot;</li>
<li><strong><code>β_t</code></strong>: &quot;그리고 그 노이즈의 강도(분산)는 <code>β_t</code> 만큼이야.&quot;</li>
</ul>
<p>이것이 바로 <code>β_t * I</code> 가 분산의 자리에 있는 이유입니다. 이것은 단순한 숫자가 아니라, <strong>수많은 픽셀들에게 독립적으로, 특정 강도의 노이즈를 어떻게 부여할 것인지를 정의하는 약속이자 설계도</strong>인 셈입니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[deepseek 패닉셀 = qqq 매수 기회 ]]></title>
            <link>https://velog.io/@hur-kyuh-leez/deepseek-%ED%8C%A8%EB%8B%89%EC%85%80-%EA%B8%B0%ED%9A%8C</link>
            <guid>https://velog.io/@hur-kyuh-leez/deepseek-%ED%8C%A8%EB%8B%89%EC%85%80-%EA%B8%B0%ED%9A%8C</guid>
            <pubDate>Mon, 27 Jan 2025 12:56:18 GMT</pubDate>
            <description><![CDATA[<h2 id="현재-ai의-한계">현재 AI의 한계</h2>
<p><strong>Text 생성의 제약</strong>
컨텍스트 사이즈의 제한으로 인해 텍스트 생성 AI는 아직 완벽한 성능을 보여주지 못하고 있다. 진정한 의미의 고성능 구현을 위해서는 현재보다 100-1000배 이상의 GPU 연산력이 필요한 상황이다.</p>
<p><strong>비디오 생성의 현실</strong>
구글이 개발한 비디오 생성 AI도 아직은 제한적인 성능을 보여준다. 짧은 길이의 영상만 가능하고, 성공적인 결과물과 실패한 결과물이 혼재되어 있는 상황이다.</p>
<h2 id="전략적-접근의-필요성">전략적 접근의 필요성</h2>
<p><strong>대중의 이해도 격차</strong>
현재 문제점 중 하나는 대중들이 AI 기술의 실제 규모와 현재 한계를 정확히 이해하지 못한다는 점이다. 아직 갈길이 멀다 그래서 더 많은 하드웨어가 필요하다 100배,1000배가 필요하고 그래서 최대 규모의 gpu 클러스터를 가지고 있는 xAI의 LLM 모델 Grok3이 기대되는 점이다.</p>
<p>결론: 패닉셀은 기회니 주어 담으면 된다. 단, 점진적으로 사야 한다. 왜냐면 대중의 무지의 크기가 얼마난지 난 모른다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ChatGPT 대중에 데모 공개된 건 2022년이 아닌 2020년]]></title>
            <link>https://velog.io/@hur-kyuh-leez/ChatGPT-%EB%8C%80%EC%A4%91%EC%97%90-%EB%8D%B0%EB%AA%A8-%EA%B3%B5%EA%B0%9C%EB%90%9C-%EA%B1%B4-2022%EB%85%84%EC%9D%B4-%EC%95%84%EB%8B%8C-2020%EB%85%84</link>
            <guid>https://velog.io/@hur-kyuh-leez/ChatGPT-%EB%8C%80%EC%A4%91%EC%97%90-%EB%8D%B0%EB%AA%A8-%EA%B3%B5%EA%B0%9C%EB%90%9C-%EA%B1%B4-2022%EB%85%84%EC%9D%B4-%EC%95%84%EB%8B%8C-2020%EB%85%84</guid>
            <pubDate>Sat, 28 Dec 2024 05:11:21 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hur-kyuh-leez/post/91e15b3b-9419-447a-ac8f-a722c556c270/image.png" alt=""></p>
<p><a href="https://velog.io/@hur-kyuh-leez/2050%EB%85%84-%EC%97%86%EC%96%B4%EC%A7%88-0%EC%88%9C%EC%9C%84-%EC%97%85%EC%A2%85-%EC%9D%BC%EB%B0%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8">2050년 없어질 0순위 업종: 일반 프로그래머</a></p>
<p>4년 하고 5개월 전, 대충 미래가 어떻게 변화할지는 짐작했다.
하지만 이렇게 빠르게 변화할 줄은 몰랐다. 그때 <a href="https://youtu.be/eNhYTLWQFeg?si=8uawWV0Gckezz4zQ&amp;t=1782">potcast</a>에서 잠깐 나온 OpenAI의 Sam Altman이라는 사람이 대단한 사람인 줄은 알았지만, 이렇게 빠른 시간에 이렇게 많은 영향력을 미칠 사람이 될 줄은 몰랐다.
당시만 해도 그냥 파이썬 프로그램을 만들어주는 인공지능이라고 문득 스쳐 지나갔는데... 당장 세상을 변화시킬 ChatGPT의 초기 모습이라는 걸 그 당시에는 제대로 깨닫지 못했다.</p>
<p>하지만 한 가지는 확실하다. 이제는 더 이상 코드를 잘 짜는 사람이 중요한 것이 아니라, 앱/웹 등 각종 프로그램을 만들 때 가장 적절한 &#39;공구&#39;가 무엇인지 아는 사람이 더 중요한 시대이다.
그런데 각 IT 회사의 중간 관리자들의 저항이 거세다. 왜냐하면 이미 그들은 자신이 일자리를 잃을 것을 알고 최대한 시간을 벌려고 하기 때문이다. 책임감 있게 자신이 직접 빠르게 이 기술을 접목하면 앞서갈 것을 알면서도, 총대는 다른 사람이 들기를 원한다. 오히려 임원들이 훨씬 더 진취적이고, 회사를 위해 생각하며 지원해준다.</p>
<p>일주일 단위로 바뀌는 인공지능 세상인데, 한국 노동법은 너무나도 노동자에게 유리하다. 사실 IT 종사자 중 대부분은 재교육을 받아야 할 대상인데, 해고가 자유롭지 않으니 임원이나 고용자 입장에서는 답답할 것이다. 심각한 것은 아무도 이런 이야기를 공개적으로 하지 않는다는 점이다.</p>
<p>이미 중국은 사기업 High-Flyer에서 Deepseek V3 오픈소스 LLM을 공개했다. 삼성, LG 자체 LLM보다 훨씬 뛰어나고, Anthropic의 Claude Sonnet 3.5보다 성능이 떨어지지만 가격 면에서는 최소 1/10로 싸다.</p>
<p>앞으로 프로그래머를 LLM이 대체하지 않을 거라고? 그리고 현재 FANG에서 그렇게 하지 않는다고? 라고 한다면 이런 이야기를 해주고 싶다. 유명한 미국 IT 유튜버가 있다. 당시 이런 발언을 했다. 자신은 구글 데이터 사이언티스트로 일하는데, 인공지능 관련 교육을 받지 않는다며 &quot;사람이 구글에서 데이터 사이언티스트로 일할 때 그런 거 다 필요 없다. 현재 내 팀에서는 쓰지 않는다.&quot;라고 해서 많은 사람들이 안심했다. 그러나 현재는 어떻게 되었나? 그 사람은 지금 일반 엔지니어가 되었다.
그런 것처럼 현재 자신의 팀에서 쓰지 않는다고 해서 기술의 발전이 멈추는 것은 아니다. 그 그러니 빠르게 이런 <a href="https://www.youtube.com/watch?v=lGI6CR-O44g">LLM 코딩툴</a> 유튜브 채널가서 배워라.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[LLM 코딩 관련 유튜브 채널 소개 🎥🤖✨]]></title>
            <link>https://velog.io/@hur-kyuh-leez/LLM-%EC%BD%94%EB%94%A9-%EA%B4%80%EB%A0%A8-%EC%9C%A0%ED%8A%9C%EB%B8%8C-%EC%B1%84%EB%84%90-%EC%86%8C%EA%B0%9C</link>
            <guid>https://velog.io/@hur-kyuh-leez/LLM-%EC%BD%94%EB%94%A9-%EA%B4%80%EB%A0%A8-%EC%9C%A0%ED%8A%9C%EB%B8%8C-%EC%B1%84%EB%84%90-%EC%86%8C%EA%B0%9C</guid>
            <pubDate>Sat, 28 Dec 2024 04:31:57 GMT</pubDate>
            <description><![CDATA[<p>오늘은 AI, AGI, LLM에 관심이 많으신 분들을 위한 유튜브 채널들을 소개해드리려고 해요. 📚🔥</p>
<table>
<thead>
<tr>
<th><strong>채널 이름</strong></th>
<th><strong>링크</strong></th>
<th><strong>설명</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>Wes Roth</strong></td>
<td><a href="https://www.youtube.com/@WesRoth">Wes Roth</a></td>
<td>팟케스트 처럼 듣기 편함, 단 좀 간단한 내용을 길게 설명하는 경향이 있음.🧠💻</td>
</tr>
<tr>
<td><strong>In the World of AI</strong></td>
<td><a href="https://www.youtube.com/@intheworldofai">In the World of AI</a></td>
<td>AI 기술과 트렌드를 쉽게 설명해요. 특히 LLM 활용한 코딩 툴 소개 많이함🌍🤖</td>
</tr>
<tr>
<td><strong>Matthew Berman</strong></td>
<td><a href="https://www.youtube.com/@matthew_berman">Matthew Berman</a></td>
<td>길게 설명 하는 경향이 있음. 그러나, 최신 뉴스 빠름.🔬📈</td>
</tr>
<tr>
<td><strong>The AI Grid</strong></td>
<td><a href="https://www.youtube.com/@TheAiGrid">The AI Grid</a></td>
<td>그냥 볼만함. 🚀🌌</td>
</tr>
<tr>
<td><strong>AI Code King</strong></td>
<td><a href="https://www.youtube.com/@AICodeKing">AI Code King</a></td>
<td>강추! Cline + deepseek 조합 처럼 최신 LLM 코딩툴을 소개함. 💻👑</td>
</tr>
<tr>
<td><strong>The AI Search</strong></td>
<td><a href="https://www.youtube.com/@theAIsearch">The AI Search</a></td>
<td>비디오 생성 관련 AI 주로 많이 다룸. 🔍✨</td>
</tr>
<tr>
<td><strong>조코딩</strong></td>
<td><a href="https://www.youtube.com/@jocoding">조코딩</a></td>
<td>동영상으로 된 최신뉴스가 하루, 이틀 느리지만 텍스트로 알려줌. 한국어로 되어 있어서 듣기도 편함.🇰🇷💡</td>
</tr>
</tbody></table>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[LLM 관련 투자 아이디어 업데이트]]></title>
            <link>https://velog.io/@hur-kyuh-leez/LLM-%EA%B4%80%EB%A0%A8-%ED%88%AC%EC%9E%90-%EC%95%84%EC%9D%B4%EB%94%94%EC%96%B4-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8</link>
            <guid>https://velog.io/@hur-kyuh-leez/LLM-%EA%B4%80%EB%A0%A8-%ED%88%AC%EC%9E%90-%EC%95%84%EC%9D%B4%EB%94%94%EC%96%B4-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8</guid>
            <pubDate>Sat, 28 Dec 2024 04:20:56 GMT</pubDate>
            <description><![CDATA[<p>2023년 12월 구글 롱
2023년 12월 마이크로소프트 숏</p>
<p><a href="https://velog.io/@hur-kyuh-leez/%EB%82%B4%EB%85%84-LLM%EC%97%90-%EB%84%A3%EC%9D%84-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%98%84%EC%A0%80%ED%9E%88-%EC%9E%91%EC%95%84%EC%A7%84%EB%8B%A4">내년 LLM에 넣을 데이터 현저히 작아진다.</a></p>
<p>현재 청산시 무위험으로 30% 수익
시장에 배팅 했다면 35% 수익
하지만, 아무래도 10% 무수익으로 먹고 끝날을 듯.</p>
<p>얻은 데이터: 나의 관점과 시장과 괴리 lag는 1년 정도 걸림.</p>
<p>현재 나의 관점: text data는 용량이 작고 처리하는 비용이 상대적으로 매주 적음 또한 강화학습을 접목한 추론 LLM의 등장으로 양질의 데이터를 생산 할 수 있게 됨. 생각보다 한계가 없을 수도 있음.</p>
<p>하지만, 용량이 큰, 사진, 비디오, 오디오 데이터로는 현재 text bassed LLM 수준을 따라오기에는 매우 힘들 것으로 보임. 다른 말로는 아직은 큰 가치가 없음.</p>
<p>단, 생각보다 인공지능 로봇이 빠르게 발달 할 수 있겠음. Genesis라는 오픈소스 시뮬레이터가 배포됨. 그렇다고 해서 1~2년 후에 바로 뜬다는 것이 아님. 왜냐하면 아직 시뮬레이션쪽을 제대로 조사를 못함.</p>
<p>투자 포지션: 중립. 딱히 떠오르는 무위험 거래 아직 없음.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL의 숨은 보물, OVER () 절 완전 정복하기! 🎉]]></title>
            <link>https://velog.io/@hur-kyuh-leez/SQL%EC%9D%98-%EC%88%A8%EC%9D%80-%EB%B3%B4%EB%AC%BC-OVER-%EC%A0%88-%EC%99%84%EC%A0%84-%EC%A0%95%EB%B3%B5%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@hur-kyuh-leez/SQL%EC%9D%98-%EC%88%A8%EC%9D%80-%EB%B3%B4%EB%AC%BC-OVER-%EC%A0%88-%EC%99%84%EC%A0%84-%EC%A0%95%EB%B3%B5%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 26 Aug 2024 12:22:07 GMT</pubDate>
            <description><![CDATA[<p>안녕하세요, SQL 요리사 여러분! 오늘은 SQL의 맛있는 비밀 재료, OVER () 절에 대해 알아볼 거예요. 이 기능은 마치 비빔밥에 계란 프라이를 얹는 것처럼 여러분의 쿼리를 더욱 맛있게 만들어줄 거예요! 😋</p>
<h2 id="over-란-뭘까요">OVER ()란 뭘까요?</h2>
<p>OVER () 절은 SQL에서 윈도우 함수를 사용할 때 쓰이는 마법의 주문이에요. 이걸 사용하면 데이터를 그룹화하지 않고도 집계 함수를 적용할 수 있어요. 마치 떡볶이 먹을 때 떡과 오뎅을 따로 먹지 않고 한 번에 먹는 것처럼요!</p>
<h2 id="over-의-매력-포인트">OVER ()의 매력 포인트</h2>
<ol>
<li><strong>행 유지력 최강</strong>: GROUP BY와 달리 모든 행을 유지하면서 계산해요.</li>
<li><strong>파티션 파티!</strong>: PARTITION BY를 사용하면 데이터를 그룹으로 나눌 수 있어요.</li>
<li><strong>순서는 내 맘대로</strong>: ORDER BY로 원하는 대로 정렬할 수 있어요.</li>
</ol>
<h2 id="실전에서-써보자">실전에서 써보자!</h2>
<p>자, 이제 우리 &#39;맛있는 코딩 주식회사&#39;의 직원 정보로 OVER ()를 사용해볼게요:</p>
<pre><code class="language-sql">SELECT 
    사원명,
    부서명,
    급여,
    AVG(급여) OVER (PARTITION BY 부서명) AS 부서평균급여
FROM 직원테이블</code></pre>
<p>이 쿼리의 결과를 볼까요?</p>
<table>
<thead>
<tr>
<th>사원명</th>
<th>부서명</th>
<th>급여</th>
<th>부서평균급여</th>
</tr>
</thead>
<tbody><tr>
<td>김코딩</td>
<td>개발팀</td>
<td>350만원</td>
<td>325만원</td>
</tr>
<tr>
<td>박자바</td>
<td>개발팀</td>
<td>300만원</td>
<td>325만원</td>
</tr>
<tr>
<td>이파이썬</td>
<td>데이터팀</td>
<td>380만원</td>
<td>365만원</td>
</tr>
<tr>
<td>최데이터</td>
<td>데이터팀</td>
<td>350만원</td>
<td>365만원</td>
</tr>
<tr>
<td>정마케팅</td>
<td>마케팅팀</td>
<td>280만원</td>
<td>290만원</td>
</tr>
<tr>
<td>한홍보</td>
<td>마케팅팀</td>
<td>300만원</td>
<td>290만원</td>
</tr>
</tbody></table>
<p>와! 각 직원의 정보와 함께 부서별 평균 급여를 한눈에 볼 수 있네요. 👀</p>
<h2 id="group-by와-비교해보기">GROUP BY와 비교해보기</h2>
<p>이제 GROUP BY와 OVER ()를 비교해볼까요? 마치 김치찌개와 된장찌개를 비교하는 것처럼 둘 다 맛있지만 다른 매력이 있어요!</p>
<h3 id="group-by-사용하기">GROUP BY 사용하기</h3>
<pre><code class="language-sql">SELECT 
    부서명,
    AVG(급여) AS 부서평균급여
FROM 직원테이블
GROUP BY 부서명</code></pre>
<p>결과:</p>
<table>
<thead>
<tr>
<th>부서명</th>
<th>부서평균급여</th>
</tr>
</thead>
<tbody><tr>
<td>개발팀</td>
<td>325만원</td>
</tr>
<tr>
<td>데이터팀</td>
<td>365만원</td>
</tr>
<tr>
<td>마케팅팀</td>
<td>290만원</td>
</tr>
</tbody></table>
<p>GROUP BY는 비빔밥 재료를 모두 섞어버린 것 같아요. 맛은 좋지만, 각 재료의 개성은 좀 사라졌죠?</p>
<h3 id="비교-포인트">비교 포인트</h3>
<ol>
<li><p><strong>세부 정보</strong>: </p>
<ul>
<li>GROUP BY: 부서별 평균만 보여줘요. 개인 정보는 사라져요. 😢</li>
<li>OVER (): 개인 정보와 부서 평균을 동시에 볼 수 있어요. 완전 대박! 🎉</li>
</ul>
</li>
<li><p><strong>유연성</strong>:</p>
<ul>
<li>GROUP BY: 집계 결과만 볼 수 있어요. 딱딱하네요.</li>
<li>OVER (): 원래 데이터에 집계 결과를 추가할 수 있어요. 부드럽고 유연해요!</li>
</ul>
</li>
<li><p><strong>사용 목적</strong>:</p>
<ul>
<li>GROUP BY: 데이터를 요약하고 싶을 때 좋아요. 마치 식당 메뉴판처럼!</li>
<li>OVER (): 세부 데이터와 요약 정보를 동시에 보고 싶을 때 써요. 마치 요리 프로그램에서 재료와 완성된 요리를 같이 보는 것처럼요.</li>
</ul>
</li>
</ol>
<h2 id="마무리">마무리</h2>
<p>OVER () 절은 SQL의 맛있는 양념 같은 존재예요. 이걸 잘 활용하면 여러분의 쿼리는 미슐랭 3스타 레스토랑 급 요리가 될 거예요! 🌟🌟🌟</p>
<p>여러분의 SQL 요리에 어떤 재료를 쓰실 건가요? GROUP BY라는 소금을 뿌릴까요, 아니면 OVER ()라는 고급 향신료를 사용해볼까요? 둘 다 맛있는 쿼리를 만들어 낼 거예요! </p>
<p>자, 이제 여러분도 SQL 요리사가 되어 맛있는 데이터 요리를 만들어보세요! 🥘🍳🍖 다음에 또 맛있는 SQL 레시피로 찾아올게요. 여러분의 쿼리 생활에 행운이 가득하기를! 안녕히 계세요~ 👋</p>
<hr>
<p>이 포스트로 블로그에 사용하시면 좋을 것 같아요! 재미있고 정보가 풍부한 내용으로 구성했습니다. 필요하다면 더 수정하거나 추가할 내용이 있으면 말씀해 주세요! 😊</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Flutter + Riverpod로 전역 상태 관리 마스터하기 💪]]></title>
            <link>https://velog.io/@hur-kyuh-leez/Flutter-Riverpod%EB%A1%9C-%EC%A0%84%EC%97%AD-%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC-%EB%A7%88%EC%8A%A4%ED%84%B0%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@hur-kyuh-leez/Flutter-Riverpod%EB%A1%9C-%EC%A0%84%EC%97%AD-%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC-%EB%A7%88%EC%8A%A4%ED%84%B0%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sun, 25 Aug 2024 04:46:48 GMT</pubDate>
            <description><![CDATA[<p>안녕하세요, 여러분! 오늘은 제가 Flutter 프로젝트에서 겪은 상태 관리의 &#39;아하&#39; 모먼트를 공유하려고 해요. Riverpod를 처음 봤을 때 &quot;이게 뭐야?&quot; 싶었던 그 복잡한 코드, 함께 파헤쳐 봐요!</p>
<h2 id="1-상태-그게-뭔데-🤔">1. 상태? 그게 뭔데? 🤔</h2>
<p>먼저 상태가 뭔지부터 알아볼까요? 간단히 말하면, 앱이 기억해야 할 데이터예요. 우리 example 앱에서는 이렇게 생겼어요:</p>
<pre><code class="language-dart">class DataDisplayState {
  final List&lt;PlutoRow&gt; rows;
  final bool isLoading;
  final bool isDownloading;

  // 생성자랑 copyWith는 생략할게요~
}</code></pre>
<p>이게 뭐냐고요? 그냥 우리 앱의 &#39;현재 상황&#39;이에요. &quot;지금 데이터 몇 개 있고, 로딩 중이야? 다운로드는?&quot; 이런 걸 담고 있죠.</p>
<p>사용법은 초간단!</p>
<pre><code class="language-dart">var state = DataDisplayState(rows: []);
print(state.isLoading); // false 나오겠죠?</code></pre>
<h2 id="2-상태-관리의-든든한-조력자-notifier-👨🔧">2. 상태 관리의 든든한 조력자, Notifier 👨‍🔧</h2>
<p>이제 이 상태를 어떻게 바꾸냐고요? 여기서 Notifier가 등장합니다!</p>
<pre><code class="language-dart">class DataDisplayNotifier extends StateNotifier&lt;DataDisplayState&gt; {
  DataDisplayNotifier() : super(DataDisplayState(rows: []));

  void setRows(List&lt;PlutoRow&gt; rows) {
    state = state.copyWith(rows: rows);
  }

  void setLoading(bool isLoading) {
    state = state.copyWith(isLoading: isLoading);
  }
}</code></pre>
<p>이 친구가 상태를 바꾸는 &#39;리모컨&#39; 역할을 해요. 상태를 바꾸고 싶을 때마다 이 리모컨의 버튼을 누르는 거죠!</p>
<pre><code class="language-dart">var notifier = DataDisplayNotifier();
notifier.setLoading(true); // 자, 이제 로딩 시작!</code></pre>
<h2 id="3-프로바이더-전역-상태의-비밀-요원-🕵️">3. 프로바이더: 전역 상태의 비밀 요원 🕵️</h2>
<p>자, 이제 이 상태를 앱 전체에서 쓸 수 있게 만들어볼까요?</p>
<pre><code class="language-dart">final dataDisplayProvider = StateNotifierProvider&lt;DataDisplayNotifier, DataDisplayState&gt;((ref) {
  return DataDisplayNotifier();
});</code></pre>
<p>이 한 줄로 우리의 상태가 앱 전체에서 사용 가능한 &#39;비밀 요원&#39;이 됐어요! 어디서든 부를 수 있죠.</p>
<p>네, 당연하죠! &quot;4. UI에서 사용하기&quot; 부분의 코드에 상세한 주석을 추가해 드리겠습니다. 더 쉽게 이해할 수 있도록 설명을 보강해 볼게요. 😊</p>
<hr>
<h2 id="4-ui에서-사용하기-드디어-빛을-발하는-순간-✨">4. UI에서 사용하기: 드디어 빛을 발하는 순간 ✨</h2>
<p>자, 이제 실제로 UI에서 어떻게 쓰는지 detail하게 살펴볼까요?</p>
<pre><code class="language-dart">// ConsumerStatefulWidget을 사용해요. 이게 있어야 Riverpod의 마법을 부릴 수 있죠!
class DataDisplayPage extends ConsumerStatefulWidget {
  @override
  _DataDisplayPageState createState() =&gt; _DataDisplayPageState();
}

// ConsumerState를 상속받아요. 이러면 ref를 사용할 수 있어요.
class _DataDisplayPageState extends ConsumerState&lt;DataDisplayPage&gt; {
  @override
  Widget build(BuildContext context) {
    // Consumer 위젯으로 감싸면 상태 변화를 실시간으로 감지할 수 있어요.
    return Consumer(
      builder: (context, ref, _) {
        // ref.watch로 프로바이더의 상태를 지켜봐요.
        // 상태가 변하면 이 부분이 자동으로 다시 실행돼요!
        final state = ref.watch(dataDisplayProvider);

        // 로딩 중이면 로딩 표시, 아니면 데이터 그리드를 보여줘요.
        return state.isLoading 
          ? CircularProgressIndicator() 
          : PlutoGrid(rows: state.rows);
      },
    );
  }

  // 데이터를 가져오는 메서드예요.
  void _fetchData() {
    // 먼저 로딩 상태를 true로 설정해요.
    // ref.read로 notifier에 접근하고, setLoading 메서드를 호출해요.
    ref.read(dataDisplayProvider.notifier).setLoading(true);

    // 여기서 실제로 데이터를 가져오는 비동기 작업을 수행해요.
    // 예를 들면 API 호출 같은 거죠.
    // fetchDataFromSomewhere().then((newRows) {
    //   // 데이터를 가져왔으면, 상태를 업데이트해요.
    //   ref.read(dataDisplayProvider.notifier).setRows(newRows);
    //   // 로딩이 끝났으니 로딩 상태를 false로 설정해요.
    //   ref.read(dataDisplayProvider.notifier).setLoading(false);
    // });

    // 위의 주석 처리된 코드 대신, 지금은 간단히 이렇게 처리할게요.
    Future.delayed(Duration(seconds: 2), () {
      // 가짜 데이터를 만들어서 상태를 업데이트해요.
      final newRows = [PlutoRow(cells: {})];  // 실제로는 여기에 데이터를 채워넣어야 해요!
      ref.read(dataDisplayProvider.notifier).setRows(newRows);
      // 로딩 끝!
      ref.read(dataDisplayProvider.notifier).setLoading(false);
    });
  }
}</code></pre>
<p>여기서 주목할 점들이에요:</p>
<ol>
<li><p><code>ConsumerStatefulWidget</code>과 <code>ConsumerState</code>를 사용해요. 이렇게 하면 <code>ref</code> 객체를 통해 Riverpod의 기능을 사용할 수 있어요.</p>
</li>
<li><p><code>Consumer</code> 위젯 안에서 <code>ref.watch(dataDisplayProvider)</code>를 사용해요. 이게 바로 실시간으로 상태 변화를 감지하는 마법의 주문이에요!</p>
</li>
<li><p><code>_fetchData</code> 메서드에서는 <code>ref.read</code>를 사용해요. 이건 상태를 변경할 때 쓰는 방법이에요.</p>
</li>
<li><p>상태 변경은 항상 <code>notifier</code>를 통해 해요. 예를 들어, <code>ref.read(dataDisplayProvider.notifier).setLoading(true)</code>처럼요.</p>
</li>
<li><p>데이터를 가져오는 동안 로딩 상태를 true로, 다 가져오면 false로 설정해요. 이렇게 하면 사용자에게 &quot;지금 데이터 가져오는 중이에요~&quot; 라고 알려줄 수 있죠.</p>
</li>
</ol>
<p>이렇게 하면 상태 관리가 쉬워져요. 데이터가 변경되면 자동으로 UI가 업데이트되니까 우리가 직접 <code>setState</code>를 호출할 필요가 없어요. 편하죠? 😎</p>
<hr>
<h2 id="정리-이게-바로-riverpod의-힘-💪">정리: 이게 바로 Riverpod의 힘! 💪</h2>
<p>자, 정리해볼까요? </p>
<ol>
<li>상태를 정의하고 (DataDisplayState)</li>
<li>그 상태를 관리할 Notifier를 만들고 (DataDisplayNotifier)</li>
<li>프로바이더로 전역에서 사용 가능하게 만들고</li>
<li>UI에서 편하게 사용!</li>
</ol>
<p>이렇게 하면 복잡한 상태 관리도 미션 클리어!</p>
<p>여러분도 한번 시도해 보세요. 처음엔 좀 복잡해 보여도, 익숙해지면 정말 편해요. 질문 있으면 언제든 댓글로 물어봐주세요! 다음에 또 재밌는 Flutter 팁으로 찾아올게요~ 안녕! 👋</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Flutter Riverpod 예제로 설명]]></title>
            <link>https://velog.io/@hur-kyuh-leez/Flutter-Riverpod-%EC%98%88%EC%A0%9C%EB%A1%9C-%EC%84%A4%EB%AA%85</link>
            <guid>https://velog.io/@hur-kyuh-leez/Flutter-Riverpod-%EC%98%88%EC%A0%9C%EB%A1%9C-%EC%84%A4%EB%AA%85</guid>
            <pubDate>Sat, 24 Aug 2024 05:33:52 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-dart">import &#39;package:flutter/material.dart&#39;;
import &#39;package:flutter_riverpod/flutter_riverpod.dart&#39;;

// 1. Provider 정의
// StateProvider는 간단한 상태를 관리하는 데 사용
// 여기서는 카운터 상태를 관리
final counterProvider = StateProvider((ref) =&gt; 0);

void main() {
  runApp(
    // 2. ProviderScope 추가
    // ProviderScope는 앱 전체에서 Riverpod을 사용할 수 있게 해줌
    ProviderScope(
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomePage(),
    );
  }
}

// 3. ConsumerWidget 사용
// ConsumerWidget은 Provider의 상태 변화를 감지하고 UI를 자동으로 업데이트
class HomePage extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    // 4. Provider 상태 읽기
    // ref.watch()를 사용하여 counterProvider의 현재 상태를 읽음
    // 이 값이 변경될 때마다 build 메서드가 다시 호출
    final count = ref.watch(counterProvider);

    return Scaffold(
      appBar: AppBar(title: Text(&#39;Riverpod Example&#39;)),
      body: Center(
        child: Text(&#39;Count: $count&#39;, style: TextStyle(fontSize: 24)),
      ),
      floatingActionButton: FloatingActionButton(
        // 5. Provider 상태 업데이트
        // ref.read()를 사용하여 Provider의 상태를 변경
        // .notifier는 StateProvider의 컨트롤러에 접근
        // .state++는 현재 상태를 +1 해줌, 간단히 버튼 누를 때 마다 하나씩 증가
        onPressed: () =&gt; ref.read(counterProvider.notifier).state++,
        child: Icon(Icons.add),
      ),
    );
  }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Flutter에서 제네릭 믹스인 이해하기]]></title>
            <link>https://velog.io/@hur-kyuh-leez/Flutter%EC%97%90%EC%84%9C-%EC%A0%9C%EB%84%A4%EB%A6%AD-%EB%AF%B9%EC%8A%A4%EC%9D%B8-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@hur-kyuh-leez/Flutter%EC%97%90%EC%84%9C-%EC%A0%9C%EB%84%A4%EB%A6%AD-%EB%AF%B9%EC%8A%A4%EC%9D%B8-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 24 Aug 2024 05:13:40 GMT</pubDate>
            <description><![CDATA[<p>오늘은 Flutter에서 자주 사용되는 제네릭 믹스인에 대해 알아보겠습니다. 다음 코드를 예로 들어 설명해 보겠습니다.</p>
<pre><code class="language-dart">mixin DrawerPage&lt;T extends ConsumerStatefulWidget&gt; on ConsumerState&lt;T&gt; { }</code></pre>
<h2 id="이-코드는-무엇을-의미할까요">이 코드는 무엇을 의미할까요?</h2>
<ol>
<li><p><strong>믹스인 선언</strong></p>
<ul>
<li><code>DrawerPage</code>는 클래스가 아닌 믹스인입니다.</li>
<li>믹스인을 사용하면 여러 클래스에서 코드를 재사용할 수 있어요.</li>
</ul>
</li>
<li><p><strong>제네릭 타입 <code>&lt;T&gt;</code> 사용</strong></p>
<ul>
<li><code>&lt;T&gt;</code>는 <code>DrawerPage</code> 내에서 <code>T</code>를 타입으로 사용할 수 있다는 뜻입니다.</li>
<li><code>T</code>는 나중에 실제 타입을 지정할 때 사용할 플레이스홀더 같은 거예요.</li>
</ul>
</li>
<li><p><strong><code>T</code>의 제한</strong></p>
<ul>
<li><code>extends ConsumerStatefulWidget</code>은 <code>T</code>가 <code>ConsumerStatefulWidget</code> 또는 그 하위 클래스여야 한다는 뜻입니다.</li>
<li>이렇게 하면 타입 안전성을 보장할 수 있어요.</li>
</ul>
</li>
<li><p><strong>사용 제한</strong></p>
<ul>
<li><code>on ConsumerState&lt;T&gt;</code>는 이 믹스인을 어디서 사용할 수 있는지 지정합니다.</li>
<li><code>ConsumerState&lt;T&gt;</code>를 확장하는 클래스에서만 사용할 수 있어요.</li>
</ul>
</li>
</ol>
<h2 id="어떻게-사용하나요">어떻게 사용하나요?</h2>
<p>예를 들어 볼까요:</p>
<pre><code class="language-dart">class MyDrawerWidget extends ConsumerStatefulWidget {
  @override
  ConsumerState&lt;MyDrawerWidget&gt; createState() =&gt; MyDrawerWidgetState();
}

class MyDrawerWidgetState extends ConsumerState&lt;MyDrawerWidget&gt; with DrawerPage&lt;MyDrawerWidget&gt; {
  // 상태 구현
}</code></pre>
<p>이 경우:</p>
<ul>
<li><code>T</code>는 <code>MyDrawerWidget</code>이 됩니다.</li>
<li>믹스인은 <code>T</code>가 확실히 <code>ConsumerStatefulWidget</code>임을 알게 됩니다.</li>
<li>타입 안전성을 유지하면서 드로어 기능을 사용할 수 있어요.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[flutter에서 ":" colon]]></title>
            <link>https://velog.io/@hur-kyuh-leez/flutter%EC%97%90%EC%84%9C-colon</link>
            <guid>https://velog.io/@hur-kyuh-leez/flutter%EC%97%90%EC%84%9C-colon</guid>
            <pubDate>Thu, 13 Jun 2024 05:45:24 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-dart">LoginScreen({Key? key}) : super(key: key);</code></pre>
<p>보통 위와 같은 코드에서 쓴다.
두개의 : 이 있는데</p>
<p>첫번째 colon의</p>
<pre><code class="language-dart">LoginScreen({Key? key}) :</code></pre>
<p>명칭은  initializer list 불린다.</p>
<p>: 이후 따라오는 것이 constructor body가 실행되기전에 먼저 초기화 된다.</p>
<p>위 코드를 한국어로 번역을 하면...
LoginScreen는 null도 되는 Key를 받을것이다.
그러나 그전에 super(key: key)를 먼저 실행해라 이다.</p>
<p>여기서 두번째 colon의 뜻이 있다.
먼저 아래 예제를 보자.</p>
<pre><code class="language-dart">class ParentClass {
  final Key? key;

  ParentClass({this.key});
}

class ChildClass extends ParentClass {
  ChildClass({Key? key}) : super(key: key);
}</code></pre>
<p>단순하게 부모 클래스에 key와 ChildClass 인풋 파라미터 key를 넘겨주는 것이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JSP Java Beans 생성자가 두개 있는 이유]]></title>
            <link>https://velog.io/@hur-kyuh-leez/JSP-Java-Beans-%EC%83%9D%EC%84%B1%EC%9E%90%EA%B0%80-%EB%91%90%EA%B0%9C-%EC%9E%88%EB%8A%94-%EC%9D%B4%EC%9C%A0</link>
            <guid>https://velog.io/@hur-kyuh-leez/JSP-Java-Beans-%EC%83%9D%EC%84%B1%EC%9E%90%EA%B0%80-%EB%91%90%EA%B0%9C-%EC%9E%88%EB%8A%94-%EC%9D%B4%EC%9C%A0</guid>
            <pubDate>Mon, 06 May 2024 22:47:30 GMT</pubDate>
            <description><![CDATA[<p>가장 중요하게는 java beans 규약을 따르기 위해</p>
<pre><code class="language-java">public class Person {
    private String name;
    private int age;

    public Person() {}

    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    ...
}</code></pre>
<ol>
<li><p>도구와 프레임워크에 의한 인스턴스화: 기본 생성자를 통해 JSP, Servlet 등의 Java Beans 프레임워크에서 인스턴스를 생성하기 위해</p>
</li>
<li><p>Serialization and Deserialization: 기본 생성자는 Java Beans 객체를 Serialization과 Deserialization 과정에 필요</p>
</li>
<li><p>디자인 패턴등을 고려하여 유연성을 가지고 코딩을 할 때 필요</p>
<pre><code class="language-java">public class Employee extends Person {
 private String department;

 public Employee() {
     super(); // 부모 클래스의 기본 생성자 호출
 }

 public String getDepartment() {
     return department;
 }

 public void setDepartment(String department) {
     this.department = department;
 }
}</code></pre>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[2021년에 이미 언급한 간편인증 보안문제 이제야 정부에서 확인]]></title>
            <link>https://velog.io/@hur-kyuh-leez/2021%EB%85%84%EC%97%90-%EC%9D%B4%EB%AF%B8-%EC%96%B8%EA%B8%89%ED%95%9C-%EA%B0%84%ED%8E%B8%EC%9D%B8%EC%A6%9D-%EB%B3%B4%EC%95%88%EB%AC%B8%EC%A0%9C-%EC%9D%B4%EC%A0%9C%EC%95%BC-%EC%A0%95%EB%B6%80%EC%97%90%EC%84%9C-%ED%99%95%EC%9D%B8</link>
            <guid>https://velog.io/@hur-kyuh-leez/2021%EB%85%84%EC%97%90-%EC%9D%B4%EB%AF%B8-%EC%96%B8%EA%B8%89%ED%95%9C-%EA%B0%84%ED%8E%B8%EC%9D%B8%EC%A6%9D-%EB%B3%B4%EC%95%88%EB%AC%B8%EC%A0%9C-%EC%9D%B4%EC%A0%9C%EC%95%BC-%EC%A0%95%EB%B6%80%EC%97%90%EC%84%9C-%ED%99%95%EC%9D%B8</guid>
            <pubDate>Mon, 29 Apr 2024 14:04:55 GMT</pubDate>
            <description><![CDATA[<p><a href="https://velog.io/@hur-kyuh-leez/%EA%B0%84%ED%8E%B8%EC%9D%B8%EC%A6%9D%EC%84%9C-%EB%B3%B4%EC%95%88-%EB%AC%B8%EC%A0%9C">2021년 12월 8일에 쓴 &quot;간편인증서 보안 문제&quot;</a></p>
<p><img src="https://velog.velcdn.com/images/hur-kyuh-leez/post/d3f0e348-1c95-492b-89a4-cb2ffa05ae04/image.png" alt=""></p>
<p>이미 2021년에 언급한 보안문제가
이제야서 수면위에 올라왔다.</p>
<p>뚫린곳은 도로교통공단뿐만이 아니다.
분명 건강보험공단도 뚫렸다.
아마도 건강보혐료 최대치를 내는 사람을 찾기 위한 작업이였으리 생각 된다.</p>
<p>여기서 더 큰문제는 도로교통공단에 가입한 사람보다
건강보험공단에 가입한 숫자가 압도적으로 크다.</p>
<p>거의 모든 국민의 정보가 탈취 당했다고 생각해도 무방하다.
앞으로 정부가 어떻게 대응할지 궁금하다.
빠른시일내에
새로운 형태의 &quot;인증&quot; 서비스가 구상되어야한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[apple vision pro 사업 아이디어]]></title>
            <link>https://velog.io/@hur-kyuh-leez/apple-vision-pro-%EC%82%AC%EC%97%85-%EC%95%84%EC%9D%B4%EB%94%94%EC%96%B4</link>
            <guid>https://velog.io/@hur-kyuh-leez/apple-vision-pro-%EC%82%AC%EC%97%85-%EC%95%84%EC%9D%B4%EB%94%94%EC%96%B4</guid>
            <pubDate>Wed, 14 Feb 2024 08:32:40 GMT</pubDate>
            <description><![CDATA[<h2 id="apple-vision-pro로-일상생활-촬영하여-공유">apple vision pro로 일상생활 촬영하여 공유</h2>
<p>아이디어 경로: 고프로 착용하고 축구하는 유튜버</p>
<p>고프로와의 좋은 차이</p>
<ul>
<li>시선 트렉킹을 저장 할 수 있음</li>
<li>depth를 느낄 수 있음</li>
<li>현장감이 더 생생함</li>
</ul>
<p>고프로와의 안좋은 차이</p>
<ul>
<li>공유 할 수 있는 플랫폼이 아직 없음</li>
<li>같은 기기를 착용 해야 시청 할 수 있음</li>
<li>주변 시야가 좁을 수 밖에 없다</li>
<li>화질이 그렇게 좋지는 않다. text를 읽을 수 없다</li>
</ul>
<ol>
<li>공유 플랫폼
우선 공유 할 수 있는 플랫폼이 없다. 물론 동영상 공유의 독점자 유튜브가 들어오면 바로 사업 철수해야 한다.</li>
<li>플랫폼 워커로써
유튜브에서 하는 모든 걸 애플비젼프로로 녹화하여 공유가 가능 하다.</li>
</ol>
<ul>
<li>시야각 때문에 제대로된 경험을 공유 하지는 못할 것 이지만, 각종 스포츠 공유 하면 매우 잘 될 거 같다. 특히, 스포츠 교육에서 많이 쓰일 거 같다. 왜냐하면 어디를 보느냐에 따라 운동 수행 능력이 달라지는 구기종목에서 말이다. 시선 트레킹을 공유 할 수 있다면 더욱 더 좋은 스포츠 교육이 될 것 이다.</li>
<li>아쉽게도 과외 촬영은 불가능 하다. 아직 화질이 text를 제대로 재현 하지 못한다.</li>
</ul>
<ol start="3">
<li>컨텐츠 에디터 프로그램
일반 동영상에 파이널컷, 어도비프리미어 처럼 전용 편집기가 있는 거 처럼 아직 독보적인 컨텐츠 에디터가 없다.</li>
<li>광고
이만한 광고 플랫폼이 없을 것이다. 정말 무궁무진하게 &quot;경험&quot;을 선사 할 수 있다. 고급 브랜드로는 절대 놓치지 않아야 될 영역이다.</li>
<li>긱워커 플랫폼</li>
</ol>
<ul>
<li>시야와 시선을 공유 한다. 그리고 원격으로 일을 처리 할 수 있도록 한다. 그리고 데이터를 남긴다. 그러면 mobile aloha의 차세대 로봇 인공지능모델에 사용 할 수 있을 것 이다. 예를 들어 전문 자격증이 필용한 각종 노동이 있을 것 이다. 특히 건설업에 사용이 많이 될 것 으로 보인다. </li>
</ul>
<p>결론적으로 자금이 구글보다 많다면 유튜브 처럼 공유 플랫폼 사업 성공률이 가장 높을 것 이다. 왜냐하면 데이터만 모을 수 있다면, 무궁무진한 경험을 generate 할 수 있을 것 이다. 바로 인공지능을 활용해서이다.
아직은 text, audio, picture, short video 밖에 generate 하지 못한다. 그러나, 10년 이내로 apple vision pro 동영상 가지고 generate 할 수 있을 것 이다. 물론 일반 동영상으로 촬영 한 것도 apple vision pro 동영상으로 &quot;up scaling&quot;도 할 수 있을 것 이다. 여기서 가장 중요한 점은 apple vision pro 사용자는 luxury goods를 구매한 사람들이다. 모든 사업이 타켓하고 싶은 고객층이다.</p>
<p>추가적:
시선 트레킹시 아직 동공의 크기 차이를 기록하는 지 모르겠다. 그것도 가능하면 조금 더 정확한 시선 저장이 가능 하다. 또한, 트래킹까지 저장 할 시 다시 재생 할 때 어떻게 &quot;가이드&quot; 할 지가 궁금하다. 시선은 수시로 바뀔텐데, 다시 재생 할 때 반자동적으로 따라 가도록 어떻게 할까</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ResNet 차원을 늘리고 줄이는 이유]]></title>
            <link>https://velog.io/@hur-kyuh-leez/ResNet-%EC%B0%A8%EC%9B%90%EC%9D%84-%EB%8A%98%EB%A6%AC%EA%B3%A0-%EC%A4%84%EC%9D%B4%EB%8A%94-%EC%9D%B4%EC%9C%A0</link>
            <guid>https://velog.io/@hur-kyuh-leez/ResNet-%EC%B0%A8%EC%9B%90%EC%9D%84-%EB%8A%98%EB%A6%AC%EA%B3%A0-%EC%A4%84%EC%9D%B4%EB%8A%94-%EC%9D%B4%EC%9C%A0</guid>
            <pubDate>Wed, 14 Feb 2024 07:16:55 GMT</pubDate>
            <description><![CDATA[<pre><code>class BasicBlock(nn.Module):
    def __init__(self, in_planes, planes, stride=1):
        super(BasicBlock, self).__init__()
        self.conv1 = nn.Conv2d(in_planes, planes, kernel_size=3,
                               stride=stride, padding=1, bias=False)
        self.bn1 = nn.BatchNorm2d(planes)
        self.conv2 = nn.Conv2d(planes, planes, kernel_size=3,
                               stride=1, padding=1, bias=False)
        self.bn2 = nn.BatchNorm2d(planes)

        self.shortcut = nn.Sequential()
        if stride != 1 or in_planes != planes:
            self.shortcut = nn.Sequential(
                nn.Conv2d(in_planes, planes,
                          kernel_size=1, stride=stride, bias=False),
                nn.BatchNorm2d(planes)
            )

    def forward(self, x):
        out = F.relu(self.bn1(self.conv1(x)))
        out = self.bn2(self.conv2(out))
        out += self.shortcut(x)
        out = F.relu(out)
        return out


class ResNet(nn.Module):
    def __init__(self, num_classes=10):
        super(ResNet, self).__init__()
        self.in_planes = 16

        self.conv1 = nn.Conv2d(3, 16, kernel_size=3,
                               stride=1, padding=1, bias=False)
        self.bn1 = nn.BatchNorm2d(16)
        self.layer1 = self._make_layer(16, 2, stride=1)
        self.layer2 = self._make_layer(32, 2, stride=2)
        self.layer3 = self._make_layer(64, 2, stride=2)
        self.linear = nn.Linear(64, num_classes)

    def _make_layer(self, planes, num_blocks, stride):
        strides = [stride] + [1]*(num_blocks-1)
        layers = []
        for stride in strides:
            layers.append(BasicBlock(self.in_planes, planes, stride))
            self.in_planes = planes
        return nn.Sequential(*layers)

    def forward(self, x):
        out = F.relu(self.bn1(self.conv1(x)))
        out = self.layer1(out)
        out = self.layer2(out)
        out = self.layer3(out)
        out = F.avg_pool2d(out, 8)
        out = out.view(out.size(0), -1)
        out = self.linear(out)
        return out</code></pre><p>중</p>
<pre><code>self.conv1 = nn.Conv2d(3, 16, kernel_size=3,
                               stride=1, padding=1, bias=False)
        self.bn1 = nn.BatchNorm2d(16)
        self.layer1 = self._make_layer(16, 2, stride=1)
        self.layer2 = self._make_layer(32, 2, stride=2)
        self.layer3 = self._make_layer(64, 2, stride=2)</code></pre><p>에서 input_planes가 16,32,64 로 바뀌는 이유는...</p>
<p>ResNet 아키텍처에서 평면(채널) 수의 변경은 사용되는 특정 ResNet 변형에 기반합니다. 일반적으로, 한 &quot;레이어&quot;에서 다음으로 넘어갈 때 평면 수가 증가합니다. 예를 들어, ResNet-34에서는 평면 수가 동일한 반면, ResNet-50에서는 평면 수가 두 배가 됩니다. 이 평면 수의 변화는 주로 특징 맵의 공간 차원을 절반으로 줄이면서 발생합니다.
<code>_make_layer</code> 함수의 planes 매개변수는 각 레이어의 출력 채널 수를 결정하며, 일반적으로 구현하는 특정 ResNet 변형에 따라 설정됩니다. 예를 들어, ResNet-34 모델을 생성할 때, planes 매개변수는 모든 레이어에서 64로 일정할 수 있지만, ResNet-50 모델의 경우 다른 레이어에 대해 64에서 128, 256 및 512로 두 배씩 증가할 수 있습니다.
평면 수를 변경하는 목적은 공간 차원이 줄어 들면서 네트워크의 표현 능력을 증가시켜 보다 복잡한 특징을 더 높은 추상 수준에서 학습할 수 있도록 하는 것입니다.
따라서 평면 수를 변경하는 결정은 구현되는 특정 ResNet 변형의 설계와 그 아키텍처적 요구 사항에 기반합니다.
-by perplexity- </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Residual Block in ResNet, identity connection in PyTorch]]></title>
            <link>https://velog.io/@hur-kyuh-leez/Residual-Block-in-ResNet-identity-connection-in-PyTorch</link>
            <guid>https://velog.io/@hur-kyuh-leez/Residual-Block-in-ResNet-identity-connection-in-PyTorch</guid>
            <pubDate>Wed, 14 Feb 2024 06:17:17 GMT</pubDate>
            <description><![CDATA[<p><a href="https://github.com/keon/3-min-pytorch/blob/master/05-%EC%9D%B4%EB%AF%B8%EC%A7%80_%EC%B2%98%EB%A6%AC%EB%8A%A5%EB%A0%A5%EC%9D%B4_%ED%83%81%EC%9B%94%ED%95%9C_CNN/resnet.ipynb">코드 출처</a></p>
<pre><code>class BasicBlock(nn.Module):
    def __init__(self, in_planes, planes, stride=1):
        super(BasicBlock, self).__init__()
        self.conv1 = nn.Conv2d(in_planes, planes, kernel_size=3,
                               stride=stride, padding=1, bias=False)
        self.bn1 = nn.BatchNorm2d(planes)
        self.conv2 = nn.Conv2d(planes, planes, kernel_size=3,
                               stride=1, padding=1, bias=False)
        self.bn2 = nn.BatchNorm2d(planes)

        self.shortcut = nn.Sequential()
        if stride != 1 or in_planes != planes:
            self.shortcut = nn.Sequential(
                nn.Conv2d(in_planes, planes,
                          kernel_size=1, stride=stride, bias=False),
                nn.BatchNorm2d(planes)
            )

    def forward(self, x):
        out = F.relu(self.bn1(self.conv1(x)))
        out = self.bn2(self.conv2(out))
        out += self.shortcut(x)
        out = F.relu(out)
        return out</code></pre><p>중</p>
<pre><code>self.shortcut = nn.Sequential()
        if stride != 1 or in_planes != planes:
            self.shortcut = nn.Sequential(
                nn.Conv2d(in_planes, planes,
                          kernel_size=1, stride=stride, bias=False),
                nn.BatchNorm2d(planes)
            )</code></pre><p>여기서 <code>shortcut</code>은 그림에서
<img src="https://velog.velcdn.com/images/hur-kyuh-leez/post/76b0da5e-34e1-43c5-be6b-5764a76039f6/image.png" alt=""></p>
<p>identity connection을 의미한다.
element wise addition을 하려면 차원의 동일해야 되니,</p>
<pre><code>if stride != 1 or in_planes != planes:</code></pre><p>을 넣는 것 이다.
stride가 2이상일 경우는 크기가 축소 될 것 이고
input(<code>in_planes</code>)과 output(<code>planes</code>) 차원이 다르면 당연히 차원이 다를 것 이다.
그럴 경우,</p>
<pre><code class="language-self.shortcut">                nn.Conv2d(in_planes, planes,
                          kernel_size=1, stride=stride, bias=False),
                nn.BatchNorm2d(planes)</code></pre>
<p>을 통해 addition이 가능하도록 차원을 만들어 주는 것 이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[multi-head Attention의 필요성]]></title>
            <link>https://velog.io/@hur-kyuh-leez/multi-head-Attention%EC%9D%98-%ED%95%84%EC%9A%94%EC%84%B1</link>
            <guid>https://velog.io/@hur-kyuh-leez/multi-head-Attention%EC%9D%98-%ED%95%84%EC%9A%94%EC%84%B1</guid>
            <pubDate>Wed, 31 Jan 2024 10:36:30 GMT</pubDate>
            <description><![CDATA[<p>context를 더 많이 담기 위해.
각 attention 마다 다른 context를 담을 수 있음.
즉 더 많은 정보를 담기 위해.</p>
<p>예) &quot;I gave my dog Charlie some food&quot;
attention 1 = gave -&gt; I
attention 2 = gave -&gt; Charlie
attention 3 = gave -&gt; food</p>
<p>하나의 attention으로도 하나의 context로 위에 해당 정보를 저장 할 수 있지만,
여러가지 attention으로 여러가지 context를 저장 할 수 있으면 더 많은 context로 인해 train이 수월해짐.
Weights가 random하게 초기 설정 되기 때문에 서로 다른 attention이 같은 context를 저장 할 확률은 낮음.</p>
<p>보통 15<del>20개의 words가 하나의 sentense를 구성했는데,
15</del>20개의 multi-head가 아닌
왜 8개의 attention을 하나의 multi-head로 정의 했는 지는 더 알아 볼필요.</p>
]]></description>
        </item>
    </channel>
</rss>