<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://blog.update.sh/</id>
    <title>$ sh blog.update.sh</title>
    <updated>2026-03-08T23:02:02.340Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <author>
        <name>Nesswit</name>
        <email>rishubil+blog@gmail.com</email>
        <uri>https://blog.update.sh/about</uri>
    </author>
    <link rel="alternate" href="https://blog.update.sh"/>
    <link rel="self" href="https://blog.update.sh/feed"/>
    <subtitle>All post-like contents</subtitle>
    <logo>https://blog.update.sh/favicon.png</logo>
    <icon>https://blog.update.sh/favicon.png</icon>
    <rights>All rights reserved 2013, Nesswit</rights>
    <entry>
        <title type="html"><![CDATA[2026-03-09 주간 URL 모음]]></title>
        <id>https://blog.update.sh/weekly-urls/2026-03-09</id>
        <link href="https://blog.update.sh/weekly-urls/2026-03-09"/>
        <updated>2026-03-08T23:00:00.000Z</updated>
        <content type="html"><![CDATA[<div class="mdx-content leading-[1.6]" style="--v2806f315:0.875rem,[object Object],0.875rem,[object Object];--v67bf8b50:#6b7280;--v67bf83ce:#d1d5db;--v67bf878f:#9ca3af;--v67bf92d2:#374151;" data-v-ec58c90e><ul class="my-2 list-outside list-disc" data-v-ec58c90e>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://redis.antirez.com/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Redis Patterns for Coding Agents</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260301203049/https://redis.antirez.com/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=47205646&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>이 사이트는 Redis 전용 디자인 패턴, 모범 사례, 커맨드 레퍼런스를 제공하며, 인간 개발자와 LLM 코딩 에이전트 모두를 위해 최적화되어 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">중요:</strong> 본 문서는 Redis(<a href="https://redis.io/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">redis.io</a>) 전용이며, Valkey, KeyDB, Dragonfly 등 Redis 호환 대안과는 호환성이 다를 수 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>LLM 코딩 에이전트는 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">llms.txt</code>(머신 리더블 인덱스)를 먼저 가져온 후, 필요한 개별 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">.md</code> 파일을 순차적으로 조회하는 방식으로 활용할 수 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">커맨드 레퍼런스</strong>는 카테고리별 인덱스(<code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">commands-index.md</code>)와 개별 커맨드 문서(<code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">commands/content/commands/</code>)로 구성되며, <a href="https://github.com/redis/docs?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">github.com/redis/docs</a>의 미러임</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">핵심 디자인 패턴(Fundamental)</strong>으로는 원자적 업데이트, Cache-Aside, 캐시 스탬피드 방지, 분산 락(Redlock 포함), Rate Limiting, Redis Streams, Vector Sets 등 20개 패턴이 제공됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">커뮤니티 패턴</strong>으로는 비트맵, 지리공간, 리더보드, Pub/Sub, 세션 관리, 벡터 검색/AI 등 실용적인 6개 패턴이 포함됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">프로덕션 패턴</strong>으로 Pinterest(기능별 파티셔닝, 큐), Twitter/X(커스텀 자료구조), Uber(탄력성 및 샤딩) 등 대형 기술 기업의 실제 적용 사례를 다룸</li>
<li class="ms-6 text-pretty" data-v-09555c0e>분산 환경에서의 일관성을 위해 <strong class="font-bold dark:font-extrabold">Redlock 알고리즘</strong>(N개 인스턴스 중 과반수 락 획득)과 <strong class="font-bold dark:font-extrabold">Cross-Shard Consistency 패턴</strong>이 별도로 제공됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Redis 8의 <strong class="font-bold dark:font-extrabold">Vector Sets</strong>를 활용한 시맨틱 검색, RAG 파이프라인, 추천 시스템 등 AI 관련 패턴이 포함되어 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>모든 패턴 문서는 HTML과 Markdown 형식으로 동시 제공되어 접근성과 자동화 활용이 용이함</li>
</ul>
</li>
</ul>
</li>
</ul></div>]]></content>
        <author>
            <name>Nesswit</name>
            <email>rishubil+blog@gmail.com</email>
            <uri>https://blog.update.sh/about</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[2026-03-02 주간 URL 모음]]></title>
        <id>https://blog.update.sh/weekly-urls/2026-03-02</id>
        <link href="https://blog.update.sh/weekly-urls/2026-03-02"/>
        <updated>2026-03-01T23:00:00.000Z</updated>
        <content type="html"><![CDATA[<div class="mdx-content leading-[1.6]" style="--v2806f315:0.875rem,[object Object],0.875rem,[object Object];--v67bf8b50:#6b7280;--v67bf83ce:#d1d5db;--v67bf878f:#9ca3af;--v67bf92d2:#374151;" data-v-ec58c90e><ul class="my-2 list-outside list-disc" data-v-ec58c90e>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://rogerwelin.github.io/2026/02/11/postgresql-bloat-is-a-feature-not-a-bug/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">PostgreSQL Bloat Is a Feature, Not a Bug</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://news.ycombinator.com/item?id=47083510&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>PostgreSQL의 <strong class="font-bold dark:font-extrabold">블로트(Bloat)</strong> 현상은 버그가 아니라 MVCC 설계에 내재된 특성으로, 행 수가 동일해도 디스크 사용량이 증가하고 쿼리 성능이 저하되는 원인임</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Postgres는 데이터를 8KB 고정 크기 <strong class="font-bold dark:font-extrabold">페이지(Page)</strong> 단위로 저장하며, 페이지는 한번 할당되면 삭제해도 파일시스템에 반환되지 않아 테이블 파일은 오직 커지거나 유지될 뿐임</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">MVCC(Multi-Version Concurrency Control)</strong> 방식에서 UPDATE는 기존 튜플을 수정하지 않고 새 튜플을 추가하며, DELETE도 실제로 데이터를 지우지 않고 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">xmax</code> 값만 설정해 <strong class="font-bold dark:font-extrabold">데드 튜플(Dead Tuple)</strong> 이 누적됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>데드 튜플은 쿼리 결과에 보이지 않지만 디스크 공간을 차지하고, Postgres가 페이지를 읽을 때 이를 스캔해야 하므로 <strong class="font-bold dark:font-extrabold">디스크 공간 낭비뿐 아니라 성능 저하</strong>도 유발함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>테이블 블로트는 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">pgstattuple</code> 익스텐션의 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">dead_tuple_percent</code>로 측정할 수 있으며, 인덱스도 데드 튜플을 가리키는 항목이 남아 <strong class="font-bold dark:font-extrabold">인덱스 블로트</strong>가 별도로 발생함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>인덱스 블로트는 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">REINDEX INDEX CONCURRENTLY</code>로 해결할 수 있으며, 일반 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">REINDEX</code>는 테이블을 완전히 잠그므로 운영 중에는 CONCURRENTLY 옵션 사용을 권장함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">VACUUM</strong>은 데드 튜플의 공간을 재사용 가능하도록 표시하지만 테이블 파일 크기 자체를 줄이지는 않으며, <strong class="font-bold dark:font-extrabold">VACUUM FULL</strong>은 테이블을 완전히 재작성해 공간을 반환하지만 테이블을 독점 잠금함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Postgres의 <strong class="font-bold dark:font-extrabold">Autovacuum</strong>은 기본적으로 데드 튜플이 전체의 20% + 50행을 초과할 때 자동 실행되며, 대용량 테이블이나 고트래픽 환경에서는 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">autovacuum_vacuum_scale_factor</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">autovacuum_vacuum_threshold</code> 등을 개별 튜닝해야 함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">장기 실행 트랜잭션</strong>은 VACUUM이 해당 트랜잭션이 필요로 할 수 있는 모든 튜플을 정리하지 못하게 막아 데이터베이스 전체 블로트를 유발할 수 있으므로 주의가 필요함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>블로트 허용 기준으로 소규모 DB는 30~50%, 대규모 DB(50GB+)는 20% 이하를 유지하는 것을 권장하며, 과도한 블로트 시 Autovacuum을 더 적극적으로 조정하거나 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">pg_repack</code>을 활용할 수 있음</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://lalitm.com/post/why-senior-engineers-let-bad-projects-fail/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Why Senior Engineers Let Bad Projects Fail</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260223034735/https://lalitm.com/post/why-senior-engineers-let-bad-projects-fail/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46640366&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://news.hada.io/topic?id=25884&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GeekNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>시니어 엔지니어는 &quot;나쁜 프로젝트&quot;를 발견해도 항상 개입하지 않는데, <strong class="font-bold dark:font-extrabold">옳다는 것과 효과적이라는 것은 다르기 때문</strong>이다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>&quot;나쁜 프로젝트&quot;는 UX, 기술적 설계, 정치적 동기(승진용, 유행 추종 등) 측면에서 다양하게 정의되며, 그 판단은 초기엔 주관적이지만 시니어일수록 직관적으로 감지할 수 있다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>소프트웨어 회사는 속도와 실행을 중시하기 때문에 우려 제기는 무시되기 쉽고, 너무 자주 반대하면 &quot;부정적인 사람&quot;으로 낙인찍힐 위험이 있다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">영향력을 은행 계좌처럼 관리해야 한다</strong>: 코드 리뷰 소소한 지적($5), 아키텍처 도전($500), VP의 프로젝트 반대($50,000)처럼 소비 규모가 다르며, 잔고가 바닥나면 정치적 파산 상태가 된다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>개입 여부를 결정하는 세 가지 핵심 기준은 <strong class="font-bold dark:font-extrabold">① 프로젝트와의 근접성, ② 실패 시 내 팀에 미치는 영향, ③ 실패 시 회사 전체의 피해 규모</strong>이다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>개입 방식은 스펙트럼이 존재한다: 직접 프로젝트 중단 요청(핵옵션) → 팀에 우려 직접 전달 → 방향 살짝 조정(넛지) 순으로 강도가 다르다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>개입하지 않을 때는 의존성을 줄이거나 추상화 레이어를 만드는 <strong class="font-bold dark:font-extrabold">조용한 대비책</strong>을 마련하거나, 나쁜 프로젝트의 핵심 아이디어를 자신의 프로젝트에 더 나은 방식으로 흡수하는 전략을 쓸 수 있다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>팀원들에게는 나쁜 프로젝트를 좋은 척 포장하지 말고, <strong class="font-bold dark:font-extrabold">정치적 세부사항 없이 사실에 기반해 솔직하게 소통</strong>해야 신뢰를 유지할 수 있다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>결론적으로, 모든 것을 고치려 하기보다 <strong class="font-bold dark:font-extrabold">실제로 결과를 바꿀 수 있는 싸움을 전략적으로 선택</strong>하는 것이 시니어 엔지니어의 핵심 역량이다.</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://opper.ai/blog/car-wash-test?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Car Wash Test on 53 leading AI models: &quot;I want to wash my car. The car wash is 50 meters away. Should I walk or drive?&quot;</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260225034524/https://opper.ai/blog/car-wash-test?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=47128138&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://news.hada.io/topic?id=26975&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GeekNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>&quot;Car Wash Test&quot;는 53개의 주요 AI 모델에 &quot;50미터 거리의 세차장에 가려면 걷는 게 나을까, 운전하는 게 나을까?&quot;라는 단순한 논리 질문을 던지는 벤치마크로, 정답은 <strong class="font-bold dark:font-extrabold">반드시 운전</strong>해야 함(차가 세차장에 있어야 하므로)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>단 1회 테스트에서 53개 모델 중 <strong class="font-bold dark:font-extrabold">11개만 정답(drive)</strong>을 선택했으며, 42개 모델은 &quot;50미터는 짧으니 걷는 게 효율적&quot;이라는 잘못된 휴리스틱에 따라 오답을 선택함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>10회 반복 일관성 테스트(총 530회 API 호출) 결과, <strong class="font-bold dark:font-extrabold">매번 정답을 맞힌 모델은 단 5개</strong>(Claude Opus 4.6, Gemini 2.0 Flash Lite, Gemini 3 Flash, Gemini 3 Pro, Grok-4)에 불과함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>GPT-5는 단일 테스트에서 정답을 맞혔지만 10회 중 7회(70%)만 성공했으며, Sonar는 1회 테스트에서 정답이었으나 10회 반복에서 <strong class="font-bold dark:font-extrabold">0/10</strong>으로 완전히 실패함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>전체 모델 중 33개는 10회 반복에서 <strong class="font-bold dark:font-extrabold">한 번도 정답을 맞히지 못했으며</strong>, Llama, Mistral, DeepSeek 전 모델과 대부분의 Claude/GPT 하위 모델이 포함됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Rapidata를 통한 인간 기준선 테스트(1만 명)에서 <strong class="font-bold dark:font-extrabold">71.5%가 정답(drive)</strong>을 선택, 53개 모델 중 48개는 평균적인 인간보다도 낮은 정답률을 기록함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>AI 모델의 실패는 크게 3가지 유형으로 분류됨: ① 항상 틀리는 모델(33개), ② 가끔 맞히지만 예측 불가한 모델(15개, <strong class="font-bold dark:font-extrabold">프로덕션 환경에서 가장 위험</strong>), ③ 항상 맞히는 모델(5개)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 테스트는 AI가 단순한 맥락적 추론보다 학습된 휴리스틱(&quot;짧은 거리 = 걷기&quot;)을 우선시하는 <strong class="font-bold dark:font-extrabold">신뢰성 문제</strong>를 드러내며, 복잡한 실제 비즈니스 로직에서의 위험성을 시사함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>구조화된 예시와 도메인 컨텍스트를 제공하는 <strong class="font-bold dark:font-extrabold">컨텍스트 엔지니어링</strong>이 휴리스틱을 억제하고 추론 품질을 높이는 방법 중 하나로 제시됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>모든 테스트는 Opper의 LLM 게이트웨이를 통해 동일한 프롬프트·포맷으로 진행됐으며, 전체 데이터는 JSON 형식으로 공개됨</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://ykss.netlify.app/translation/2026/explicit-resource-management-in-js/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">(번역) 자바스크립트의 명시적 리소스 관리</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260226015009/https://ykss.netlify.app/translation/2026/explicit-resource-management-in-js/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>자바스크립트는 전통적으로 리소스 정리(cleanup)를 개발자의 책임으로 남겨두어 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">try / finally</code> 패턴에 의존했으며, 이는 장황하고 실수하기 쉬운 코드를 만들어 왔음</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">명시적 리소스 관리(Explicit Resource Management)</strong> 는 리소스 정리를 언어 수준에서 보장하는 1급(first-class) 기능으로, 관례나 패턴이 아닌 언어 자체의 일부로 제공됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">using</code> 키워드를 사용하면 스코프를 벗어날 때 리소스가 자동으로 정리되며, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">try / finally</code> 없이도 누락 없는 정리가 보장됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>리소스 정리 방식은 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">Symbol.dispose</code>(동기)와 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">Symbol.asyncDispose</code>(비동기) 심볼을 구현하는 방식으로 활성화(opt-in)되며, 각 라이브러리의 정리 방식을 표준화함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>비동기 정리가 필요한 경우 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">await using</code>을 사용하며, 스코프 종료 시 정리 완료까지 대기한 후 다음 코드로 진행함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>여러 리소스를 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">using</code>으로 선언하면 정리가 <strong class="font-bold dark:font-extrabold">역순(스택 방식)</strong> 으로 자동 수행되어, 기존의 수동 정리 순서 관리 부담이 사라짐</li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">using</code>이 적합하지 않은 유연한 상황에서는 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">DisposableStack</code> / <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">AsyncDisposableStack</code>을 사용하여 동일한 안전성을 확보할 수 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 기능은 서버 사이드에만 국한되지 않고, Web Streams, 옵저버, IndexedDB 트랜잭션 등 <strong class="font-bold dark:font-extrabold">프런트엔드 환경에도 동일하게 적용</strong> 가능함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>2026년 초 기준 Chrome 123+, Firefox 119+, Node.js 20.9+에서 지원되며, <strong class="font-bold dark:font-extrabold">Safari는 미지원이지만 로드맵에 포함</strong>되어 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 기능은 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">try / finally</code>를 완전히 대체하는 것이 아니라 <strong class="font-bold dark:font-extrabold">더 나은 기본값</strong>을 제공하며, 보일러플레이트 감소, 리소스 누수 방지, 코드 가독성 향상에 기여함</li>
</ul>
</li>
</ul>
</li>
</ul></div>]]></content>
        <author>
            <name>Nesswit</name>
            <email>rishubil+blog@gmail.com</email>
            <uri>https://blog.update.sh/about</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[2026-02-23 주간 URL 모음]]></title>
        <id>https://blog.update.sh/weekly-urls/2026-02-23</id>
        <link href="https://blog.update.sh/weekly-urls/2026-02-23"/>
        <updated>2026-02-22T23:00:00.000Z</updated>
        <content type="html"><![CDATA[<div class="mdx-content leading-[1.6]" style="--v2806f315:0.875rem,[object Object],0.875rem,[object Object];--v67bf8b50:#6b7280;--v67bf83ce:#d1d5db;--v67bf878f:#9ca3af;--v67bf92d2:#374151;" data-v-ec58c90e><ul class="my-2 list-outside list-disc" data-v-ec58c90e>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://modern-css.com/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Modern CSS Code Snippets | modern.css</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260219034850/https://modern-css.com/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=47025851&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>현대적인 CSS 코드 스니펫과 이를 대체하는 오래된 핵(hack)들을 나란히 비교하여 보여줌</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://www.smashingmagazine.com/2026/02/designing-streak-system-ux-psychology/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Designing A Streak System: The UX And Psychology Of Streaks — Smashing Magazine</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>스트릭(Streak)은 사용자가 특정 행동을 연속으로 완료한 일수를 나타내며, 단순한 지표를 넘어 행동 심리학과 깊이 연결된 강력한 UX 패턴임</li>
<li class="ms-6 text-pretty" data-v-09555c0e>스트릭의 심리적 기반은 세 가지 원리로 설명됨: <strong class="font-bold dark:font-extrabold">손실 회피(Loss Aversion)</strong>(잃는 고통이 얻는 기쁨보다 2배 강함), <strong class="font-bold dark:font-extrabold">Fogg 행동 모델 B=MAP</strong>(동기·능력·촉발 요소가 동시에 존재해야 행동 발생), <strong class="font-bold dark:font-extrabold">자이가르닉 효과</strong>(미완성 과제가 완료된 것보다 더 오래 기억에 남음)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>스트릭은 습관 형성에 긍정적이지만, 목표보다 스트릭 자체를 지키는 것에 집착하는 <strong class="font-bold dark:font-extrabold">강박(Compulsion)</strong> 으로 변질될 수 있어 윤리적 설계가 중요함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>좋은 스트릭 UX 설계의 핵심 원칙
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">행동을 최대한 작고 쉽게</strong> 만들어 진입 장벽을 낮출 것 (예: 명상 앱의 30초 세션)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">시각적 피드백</strong>을 통해 노력을 실감 나게 표현할 것 (예: GitHub 기여 그래프, 애플 피트니스 링)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">타이밍에 맞는 알림</strong>을 활용하되, 과도한 알림으로 인한 피로감을 주의할 것</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">마일스톤 축하</strong>로 감정적 보상을 제공해 지속 동기를 유지할 것</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">그레이스 메커니즘</strong>(스트릭 프리즈, 유예 시간, 점감 모델 등)으로 불가피한 중단에 유연하게 대처할 것</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e>타임존 처리와 치팅 방지를 위해 <strong class="font-bold dark:font-extrabold">서버를 단일 진실의 원천(Single Source of Truth)</strong> 으로 삼고, 사용자 로컬 타임존 기준으로 날짜를 비교하며, 모든 이벤트를 UTC 타임스탬프와 메타데이터로 서버 측에서 검증해야 함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>스트릭 시스템의 핵심 로직은 사용자의 행동 이벤트를 서버가 수신 후 로컬 타임존으로 변환하여 날짜를 비교하고, 같은 날·다음 날·하루 이상 공백 등 각 경우에 따라 스트릭을 유지·연장·리셋하는 방식으로 동작함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>서버 다운타임이나 버그로 인한 스트릭 손실에 대비해 <strong class="font-bold dark:font-extrabold">유예 윈도우 제공 및 관리자 수동 복구 기능</strong>을 구축해야 하며, 모든 제품이 스트릭 시스템을 필요로 하는 것은 아님을 설계 전에 반드시 고려해야 함</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://taalas.com/the-path-to-ubiquitous-ai/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">The path to ubiquitous AI</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://news.ycombinator.com/item?id=47086181&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://news.hada.io/topic?id=26860&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GeekNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>AI의 광범위한 채택을 가로막는 두 가지 핵심 장벽은 <strong class="font-bold dark:font-extrabold">높은 지연 시간(latency)과 천문학적인 비용</strong>이며, Taalas는 이를 해결하기 위해 설립된 AI 추론 하드웨어 스타트업임</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Taalas는 <strong class="font-bold dark:font-extrabold">임의의 AI 모델을 커스텀 실리콘(칩)으로 변환하는 플랫폼</strong>을 개발하며, 새로운 모델 수령 후 단 2개월 만에 하드웨어로 구현 가능함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Taalas의 핵심 기술 철학은 세 가지로 구성됨:
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">완전 특화(Total Specialization)</strong>: 각 모델에 최적화된 실리콘 생산</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">저장과 연산의 통합(Merging Storage and Computation)</strong>: 단일 칩에서 메모리와 컴퓨팅을 DRAM 수준 밀도로 통합하여 기존 한계 극복</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">근본적 단순화(Radical Simplification)</strong>: HBM, 고급 패키징, 액체 냉각 등 복잡한 기술 없이 시스템 총비용을 10배 절감</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e>첫 번째 제품인 <strong class="font-bold dark:font-extrabold">HC1(Llama 3.1 8B 하드와이어드 모델)</strong>은 사용자당 초당 17,000 토큰을 처리하며, 이는 현재 최고 수준 대비 <strong class="font-bold dark:font-extrabold">약 10배 빠르고, 구축 비용은 20배 저렴하며, 전력 소비는 10배 적음</strong></li>
<li class="ms-6 text-pretty" data-v-09555c0e>HC1 기반 Llama는 현재 <strong class="font-bold dark:font-extrabold">챗봇 데모 및 추론 API 서비스</strong>로 제공되고 있으며, 컨텍스트 윈도우 크기 조정 및 LoRA를 통한 파인튜닝을 지원함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>HC1은 커스텀 3비트 기반 데이터 타입을 사용해 일부 품질 저하가 있으나, <strong class="font-bold dark:font-extrabold">2세대 플랫폼(HC2)은 표준 4비트 부동소수점 형식을 채택</strong>하여 이를 개선할 예정임</li>
<li class="ms-6 text-pretty" data-v-09555c0e>향후 제품 로드맵으로는 <strong class="font-bold dark:font-extrabold">HC1 기반 중형 추론 LLM(봄 출시 예정)</strong>과 <strong class="font-bold dark:font-extrabold">HC2 기반 프론티어 LLM(겨울 배포 예정)</strong>이 계획되어 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Taalas는 <strong class="font-bold dark:font-extrabold">24명의 팀원과 3,000만 달러(조달액 2억 달러 이상 중)</strong>만으로 첫 제품을 출시하며, 소규모 정예 팀과 집중된 목표로 대규모 자본 투입 없이 성과를 달성함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Taalas의 궁극적 목표는 <strong class="font-bold dark:font-extrabold">지연 시간과 비용이라는 AI 보급의 핵심 장벽을 제거</strong>하여, 즉각적이고 초저비용의 AI 추론을 개발자들에게 제공하는 것임</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://kciter.so/posts/how-to-design-animation/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">애니메이션을 설계하는 방법 | kciter.so</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260222112614/https://kciter.so/posts/how-to-design-animation/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.hada.io/topic?id=26840&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GeekNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>애니메이션도 <strong class="font-bold dark:font-extrabold">설계</strong>할 수 있으며, 복잡한 움직임은 단순한 상태 변화의 조합으로 분해되고 수학적으로 표현 가능함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>모든 애니메이션은 <strong class="font-bold dark:font-extrabold">그래프</strong>로 표현할 수 있으며, 그래프의 모양이 움직임의 느낌을 결정함 (가로축: 시간 또는 스크롤 등 입력값, 세로축: 변하는 속성값)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">이징(Easing)과 큐빅 베지어 커브</strong>: 선형 보간의 재귀적 적용으로 두 제어점만으로 다양한 가감속 움직임을 표현하며, 이징 선택은 &quot;목적&quot;에 따라 결정됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">지수적 접근</strong>: <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">value += (target - value) * factor</code> 수식을 매 프레임 적용해 목표값이 실시간으로 바뀌는 상황에서도 자연스러운 감속 곡선을 만들 수 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">스프링 애니메이션</strong>: 복원력과 감쇠력 기반의 물리 시뮬레이션으로, 고정된 duration 없이 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">stiffness</code>와 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">damping</code> 두 파라미터만으로 탄성 있는 다양한 움직임을 구현함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">물리 시뮬레이션</strong>: 중력·마찰·충돌 등의 규칙만 정의하면 복잡한 움직임이 자동으로 생성되며, 다수 오브젝트 상호작용이나 인터랙티브 요소에 적합함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">삼각함수(sin/cos)</strong>: 진폭·주파수·위상 세 파라미터로 주기적 움직임을 표현하며, 여러 요소에 위상 차이를 주면 파동·플로팅 같은 효과를 만들 수 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">톱니파</strong>: <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">(t % period) / period</code>로 0→1 단방향 반복을 구현하며, 펄스·핑 등 &quot;시작→끝→즉시 리셋&quot; 패턴에 활용됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>복잡한 애니메이션 설계 원칙으로 <strong class="font-bold dark:font-extrabold">그래프 구간 분리, 의존성 파악, 파이프라이닝, 상태 전환 설계, 속성 분리, 랜덤성, 양방향성 고려</strong> 등을 제시함</li>
</ul>
</li>
</ul>
</li>
</ul></div>]]></content>
        <author>
            <name>Nesswit</name>
            <email>rishubil+blog@gmail.com</email>
            <uri>https://blog.update.sh/about</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[2026-02-16 주간 URL 모음]]></title>
        <id>https://blog.update.sh/weekly-urls/2026-02-16</id>
        <link href="https://blog.update.sh/weekly-urls/2026-02-16"/>
        <updated>2026-02-15T23:00:00.000Z</updated>
        <content type="html"><![CDATA[<div class="mdx-content leading-[1.6]" style="--v2806f315:0.875rem,[object Object],0.875rem,[object Object];--v67bf8b50:#6b7280;--v67bf83ce:#d1d5db;--v67bf878f:#9ca3af;--v67bf92d2:#374151;" data-v-ec58c90e><ul class="my-2 list-outside list-disc" data-v-ec58c90e>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://www.figma.com/blog/introducing-vectorize?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">For the Love of Craft: Vectorize Images in Figma Design and Draw | Figma Blog</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260209004113/https://www.figma.com/blog/introducing-vectorize/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Figma가 새로운 AI 이미지 편집 도구인 <strong class="font-bold dark:font-extrabold">Vectorize</strong>를 출시하여 래스터 이미지를 편집 가능한 벡터로 변환할 수 있게 함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Vectorize는 Remove background, erase object, Expand image에 이어 Figma의 AI 이미지 편집 툴킷에 추가된 최신 기능임</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Figma Design과 Figma Draw</strong>에서 사용 가능하며, 한 번의 클릭으로 이미지를 캔버스에 가져와 편집 가능한 벡터로 변환함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>주요 활용 사례 1: <strong class="font-bold dark:font-extrabold">래스터 드로잉을 벡터로 변환</strong>하여 스케치를 유연한 벡터 일러스트레이션으로 만들고, 색상 변수를 사용해 브랜드 일관성 유지 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e>주요 활용 사례 2: <strong class="font-bold dark:font-extrabold">손글씨 레터링을 편집 가능하게 변환</strong>하여 캘리그래피나 종이 스케치를 수정 가능한 로고로 만들고, 배경 제거 및 개별 문자 조정 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e>주요 활용 사례 3: <strong class="font-bold dark:font-extrabold">재사용 가능한 텍스처 오버레이 생성</strong>으로 그레인이나 노이즈 텍스처를 벡터로 변환하여 UI나 랜딩 페이지에 깊이감 추가</li>
<li class="ms-6 text-pretty" data-v-09555c0e>실제 세계의 영감을 워크플로우에 쉽게 통합하여 불필요한 우회 없이 더 표현력 있는 디자인 작업 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Professional, Organization, Enterprise 플랜의 Full-seat 사용자</strong>에게 제공되며, AI 기능이 활성화되어야 함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>AI 작업은 크레딧을 사용하며, 상세한 사용 가이드와 모범 사례가 제공됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>디자이너가 도구와 씨름하는 시간을 줄이고 창작에 더 집중할 수 있도록 craft, capability, style을 강화하는 것이 목표</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://www.theverge.com/tech/875309/discord-age-verification-global-roll-out?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Discord will require a face scan or ID for full access next month</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260209203405/https://www.theverge.com/tech/875309/discord-age-verification-global-roll-out?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46945663&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://news.hada.io/topic?id=26550&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GeekNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Discord는 3월부터 전 세계적으로 연령 인증 시스템을 도입하며, <strong class="font-bold dark:font-extrabold">모든 계정을 기본적으로 &quot;청소년 적합 환경&quot;으로 설정</strong>함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>성인 인증을 받지 않은 사용자는 <strong class="font-bold dark:font-extrabold">연령 제한 서버/채널 접근 불가, 스테이지 채널 발언 제한, 민감한 콘텐츠 필터링 적용</strong> 등의 제약을 받게 됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Discord는 <strong class="font-bold dark:font-extrabold">계정 정보 기반 연령 추론 모델</strong>을 사용하며, 계정 보유 기간, 디바이스 및 활동 데이터, 커뮤니티 패턴 등을 활용 (개인 메시지나 메시지 내용은 사용하지 않음)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>연령 추론으로 확인되지 않은 경우, 사용자는 <strong class="font-bold dark:font-extrabold">AI 기반 얼굴 연령 추정(비디오 셀카)</strong> 또는 <strong class="font-bold dark:font-extrabold">신분증 제출</strong>을 통해 성인 인증 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e>얼굴 연령 추정은 <strong class="font-bold dark:font-extrabold">사용자 기기를 벗어나지 않으며</strong>, 신분증 이미지는 제3자 업체를 통해 확인 후 <strong class="font-bold dark:font-extrabold">대부분 즉시 삭제</strong>됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Discord는 작년 영국과 호주에서 연령 인증을 시범 도입했으며, 일부 사용자가 <em class="italic">Death Stranding</em> 포토 모드로 우회했으나 <strong class="font-bold dark:font-extrabold">1주일 만에 수정</strong>함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>2024년 10월 Discord의 제3자 업체가 <strong class="font-bold dark:font-extrabold">데이터 유출 사고</strong>를 겪어 사용자 연령 인증 데이터(정부 발급 ID 이미지 포함)가 노출됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>데이터 유출 후 Discord는 해당 업체와의 협력을 즉시 중단하고 <strong class="font-bold dark:font-extrabold">다른 제3자 업체로 전환</strong>했으며, 생체 인식이나 얼굴 인식이 아닌 <strong class="font-bold dark:font-extrabold">얼굴 추정만 수행</strong>한다고 강조</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Badalich는 &quot;<strong class="font-bold dark:font-extrabold">대다수 사용자는 경험의 변화를 느끼지 못할 것</strong>&quot;이라고 설명하며, 주로 성인 콘텐츠에 영향을 미칠 것이라고 언급</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Discord는 연령 인증 도입으로 인한 <strong class="font-bold dark:font-extrabold">사용자 이탈 가능성을 인지</strong>하고 있으며, 이를 계획에 반영하고 다른 방법으로 사용자를 다시 유치할 방안을 모색 중</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://kroki.io/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Creates diagrams from textual descriptions!</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260210041020/https://kroki.io/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=19486801&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Kroki는 <strong class="font-bold dark:font-extrabold">다양한 다이어그램 도구를 위한 통합 API</strong>를 제공하는 서비스로, BlockDiag, BPMN, Mermaid, PlantUML, GraphViz, Excalidraw 등 <strong class="font-bold dark:font-extrabold">20개 이상의 다이어그램 타입</strong>을 지원함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">무료 서비스</strong>(Exoscale 후원으로 서버 제공)와 <strong class="font-bold dark:font-extrabold">Self-Managed 인스턴스</strong>(자체 인프라 설치) 두 가지 형태로 제공됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>HTTP API를 통해 텍스트 기반 다이어그램 설명을 이미지로 변환하며, <strong class="font-bold dark:font-extrabold">GET과 POST 요청 모두 지원</strong>함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>GET 요청 시에는 다이어그램을 <strong class="font-bold dark:font-extrabold">deflate + base64로 인코딩</strong>하여 URL에 포함해야 하며, Python 원라이너로 쉽게 인코딩/디코딩 가능함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>POST 요청 시에는 <strong class="font-bold dark:font-extrabold">인코딩 없이 평문(plain text) 또는 JSON 형식</strong>으로 다이어그램을 전송할 수 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>출력 포맷은 다이어그램 타입에 따라 <strong class="font-bold dark:font-extrabold">png, svg, jpeg, txt, base64</strong> 등을 지원하며, 타입별 지원 형식은 상이함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">Content-Type</code> 및 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">Accept</code> 헤더를 사용하거나 URL에 출력 형식을 명시하여 다양한 방식으로 API 호출 가능함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">MIT 라이선스 기반의 오픈 소스 프로젝트</strong>로, 누구나 최소한의 리소스로 서비스를 호스팅할 수 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Yuzu tech가 개발 및 유지보수하며 Exoscale이 지원하고 있으나, <strong class="font-bold dark:font-extrabold">인프라 비용 충당을 위해 추가 스폰서를 모집</strong> 중임</li>
<li class="ms-6 text-pretty" data-v-09555c0e>사용자 피드백을 위한 설문조사를 진행 중이며, 지원하지 않는 다이어그램 도구에 대한 제안을 환영함</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://blog.maximeheckel.com/posts/shades-of-halftone/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Shades of Halftone - The Blog of Maxime Heckel</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260212041600/https://blog.maximeheckel.com/posts/shades-of-halftone/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46959531&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>하프톤(halftone)은 <strong class="font-bold dark:font-extrabold">서로 다른 크기의 점들을 격자로 배치하여 색상 그라데이션의 착시 효과</strong>를 만드는 클래식한 패턴 기법으로, 원래는 제한된 잉크 색상으로 이미지를 인쇄하기 위한 기술이었으나 현재는 다양한 미디어와 웹에서 텍스처나 그레인 효과를 주는 예술적 도구로 활용됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>하프톤은 본질적으로 <strong class="font-bold dark:font-extrabold">광학적 착시 효과</strong>로, 높은 주파수의 점 격자를 제공하여 연속적/부드러운 톤의 인상을 생성함. 점의 반경이 <strong class="font-bold dark:font-extrabold">눈의 공간 해상도보다 작아지면</strong> 뇌가 패턴의 공간 평균을 수행하여 개별 점 대신 <strong class="font-bold dark:font-extrabold">&#39;잉크&#39;와 &#39;빈 공간&#39;의 비율</strong>을 부드러운 톤으로 인식함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">GLSL을 사용한 기본 하프톤 구현</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>원/점 렌더링: UV 좌표의 중심점까지의 거리 필드(distance field)와 마스크(threshold) 활용</li>
<li class="ms-6 text-pretty" data-v-09555c0e>격자 생성: <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">fract()</code> 함수로 UV 좌표를 타일링하여 각 셀이 자체 원을 그리도록 구현</li>
<li class="ms-6 text-pretty" data-v-09555c0e>픽셀화(pixelation)와 루마(luma) 기반 점 크기 조절을 통해 실제 하프톤 필터 효과 적용</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">하프톤 변형들</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Grid offset</strong>: 점들을 엇갈리게 배치하여 더 높은 밀도와 적은 여백 확보</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">&quot;Dot adjacent&quot; 패턴</strong>: 원뿐만 아니라 정사각형, 링(ring) 등 다양한 형태로 확장</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Dots and squares 조합</strong>: 어두운 픽셀은 흰 점이 있는 정사각형, 밝은 픽셀은 표준 점으로 렌더링하여 원본 텍스처를 더 잘 보존</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">모아레 패턴(Moiré Pattern)</strong>은 두 개의 거의 동일한 반복 패턴이 겹쳐질 때 발생하는 간섭 현상으로, 멀티채널 하프톤 구현 시 불가피하게 발생함. 각 레이어에 <strong class="font-bold dark:font-extrabold">특정 회전 각도를 적용</strong>하여 간섭을 최소화할 수 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">디지털 vs 물리적 색상 블렌딩</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">RGB(가산 혼합)</strong>: 검은 디스플레이에서 빛의 추가로 작동하며, 색상 채널이 더해져 흰색으로 수렴 (<code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">ColorOut = (Ir, 0, 0) + (0, Ig, 0) + (0, 0, Ib)</code>)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">CMYK(감산 혼합)</strong>: 흰 종이에서 빛의 흡수로 작동하며, 잉크가 빛을 필터링하여 검은색으로 수렴 (<code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">ColorOut = White * (1.0 - C) * (1.0 - M) * (1.0 - Y)</code>)</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">CMYK 하프톤 구현</strong>: RGB를 CMYK로 변환한 후 각 채널(Cyan 15°, Magenta 75°, Yellow 0°, Key 45°)마다 특정 각도로 회전된 점 격자를 생성하고, 각 점의 크기를 해당 채널의 강도에 맞춰 조절하여 모아레 아티팩트를 최소화하면서 인쇄물과 유사한 색상 출력을 구현</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">격자 제약 깨기 - Cell wall 문제 해결</strong>: 현재 픽셀 주변의 <strong class="font-bold dark:font-extrabold">3x3 이웃 셀을 샘플링</strong>하여 점들이 셀 경계를 넘어 확장되거나 겹치도록 허용함으로써 클리핑 제거. 이를 통해 워터컬러 같은 효과나 잉크 방울 같은 유기적인 &quot;gooey&quot; 하프톤 구현 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">애니메이션 하프톤 - Displaced dots</strong>: Frame Buffer Objects(FBO)와 핑퐁 렌더링으로 마우스 커서의 궤적을 텍스처로 렌더링하고, 이를 하프톤 셰이더에 전달하여 커서의 움직임 방향과 강도에 따라 점/링의 위치를 동적으로 변위시켜 생동감 있는 효과 생성</li>
<li class="ms-6 text-pretty" data-v-09555c0e>간단한 원 형태에서 시작하여 다양하고 흥미로운 효과 세트로 빠르게 확장 가능하며, 모듈식 셰이더 코드를 유지하여 간단한 효과부터 복잡한 효과까지 동일한 함수를 재사용할 수 있음. 이 기법은 향후 <strong class="font-bold dark:font-extrabold">실시간 셰이더 기반 페인팅</strong>(인상주의, 점묘법, 수채화 스타일 에뮬레이션)에도 활용 가능한 기초를 제공함</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://github.com/PeonPing/peon-ping?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GitHub - PeonPing/peon-ping: Warcraft III Peon voice notifications (+ more!) for Claude Code, Codex, and other IDEs. Stop babysitting your terminal.</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260213102803/https://github.com/PeonPing/peon-ping?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46999852&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">peon-ping</strong>은 AI 코딩 에이전트(Claude Code, Codex, Cursor, OpenCode, Kiro, Google Antigravity 등)가 작업을 완료하거나 사용자 입력이 필요할 때 게임 캐릭터 음성으로 알림을 제공하는 도구</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Warcraft, StarCraft, Portal, Zelda, Dota 2 등 43개 이상의 게임 캐릭터 음성 팩을 지원하며, 기본 설치 시 10개의 큐레이션된 영어 팩 포함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">CESP(Coding Event Sound Pack Specification)</strong> 오픈 표준을 구현하여 세션 시작, 작업 완료, 권한 요청, 빠른 연속 프롬프트 등의 이벤트를 표준화된 카테고리로 매핑</li>
<li class="ms-6 text-pretty" data-v-09555c0e>macOS와 Linux에서 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">brew install</code> 또는 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">curl</code> 스크립트로 설치 가능하며, 전역 또는 프로젝트 로컬 설치 모드 지원</li>
<li class="ms-6 text-pretty" data-v-09555c0e>CLI 명령어 제공
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">peon toggle/pause/resume</code>: 음성 알림 일시 정지/재개</li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">peon packs use/next/list</code>: 음성 팩 전환 및 목록 조회</li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">peon notifications on/off</code>: 데스크톱 알림 토글</li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">peon preview</code>: 특정 카테고리 또는 전체 사운드 미리듣기</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">원격 작업 지원</strong>: SSH 세션, devcontainer, Codespaces에서 자동 감지 후 로컬 머신의 릴레이 서버(<code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">peon relay --daemon</code>)를 통해 오디오와 알림을 전송</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">모바일 알림</strong>: ntfy, Pushover, Telegram을 통해 휴대폰 푸시 알림 지원 (<code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">peon mobile ntfy &lt;topic&gt;</code>)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>설정 파일(<code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">config.json</code>)을 통해 볼륨, 카테고리별 활성화, 팩 로테이션, 짧은 작업 무음 기간 등 세부 조정 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e>터미널 탭 제목 업데이트(<code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">● project: done</code>), 데스크톱 알림(터미널이 포커스되지 않을 때만), 반복 방지 로직, 스팸 감지(10초 내 3회 이상 프롬프트 시 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">user.spam</code> 음성 재생) 등 부가 기능 제공</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Claude Code에서 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">/peon-ping-toggle</code> 슬래시 명령 또는 자연어로 설정 변경 가능(&quot;enable round-robin pack rotation&quot;, &quot;set volume to 0.3&quot; 등)</li>
</ul>
</li>
</ul>
</li>
</ul></div>]]></content>
        <author>
            <name>Nesswit</name>
            <email>rishubil+blog@gmail.com</email>
            <uri>https://blog.update.sh/about</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[2026-02-09 주간 URL 모음]]></title>
        <id>https://blog.update.sh/weekly-urls/2026-02-09</id>
        <link href="https://blog.update.sh/weekly-urls/2026-02-09"/>
        <updated>2026-02-08T23:00:00.000Z</updated>
        <content type="html"><![CDATA[<div class="mdx-content leading-[1.6]" style="--v2806f315:0.875rem,[object Object],0.875rem,[object Object];--v67bf8b50:#6b7280;--v67bf83ce:#d1d5db;--v67bf878f:#9ca3af;--v67bf92d2:#374151;" data-v-ec58c90e><ul class="my-2 list-outside list-disc" data-v-ec58c90e>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://notepad-plus-plus.org/news/hijacked-incident-info-update/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Notepad++ Hijacked by State-Sponsored Hackers</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260202131049/https://notepad-plus-plus.org/news/hijacked-incident-info-update/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46851548&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://news.hada.io/topic?id=26348&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GeekNews</a> | <a href="https://lobste.rs/s/pt7myu?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Lobsters</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Notepad++ 공식 웹사이트가 <strong class="font-bold dark:font-extrabold">국가 지원 해커(중국 국가 지원 그룹으로 추정)에 의해 하이재킹</strong>당하는 보안 사고 발생</li>
<li class="ms-6 text-pretty" data-v-09555c0e>공격자들은 <strong class="font-bold dark:font-extrabold">호스팅 제공업체의 인프라 수준에서 서버를 침해</strong>하여 특정 사용자의 업데이트 트래픽을 가로채고 악성 업데이트 서버로 리디렉션함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>공격 기간은 <strong class="font-bold dark:font-extrabold">2025년 6월부터 2025년 12월까지</strong> 지속되었으며, 공격자들은 Notepad++를 특정 타겟으로 선정하여 선택적으로 공격함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">2025년 9월 2일</strong> 서버 유지보수(커널 및 펌웨어 업데이트) 이후 공격자들은 서버 접근 권한을 상실했으나, <strong class="font-bold dark:font-extrabold">12월 2일까지 내부 서비스 자격 증명을 유지</strong>하여 트래픽 리디렉션을 계속할 수 있었음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>호스팅 제공업체는 <strong class="font-bold dark:font-extrabold">2025년 12월 2일까지 모든 취약점 수정, 자격 증명 교체, 보안 강화 완료</strong>하여 추가 공격 활동을 성공적으로 차단함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>공격자들은 <strong class="font-bold dark:font-extrabold">구버전 Notepad++의 불충분한 업데이트 검증 메커니즘 취약점을 악용</strong>하려는 목적으로 notepad-plus-plus.org 도메인을 특정 타겟팅함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>보안 강화 조치로 <strong class="font-bold dark:font-extrabold">v8.8.9에서 WinGup(업데이터) 개선</strong>: 다운로드된 설치 프로그램의 인증서 및 서명 검증 추가</li>
<li class="ms-6 text-pretty" data-v-09555c0e>업데이트 서버가 반환하는 <strong class="font-bold dark:font-extrabold">XML에 서명(XMLDSig) 추가</strong>, 약 한 달 후 출시 예정인 <strong class="font-bold dark:font-extrabold">v8.9.2부터 인증서 및 서명 검증 강제 적용</strong> 예정</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Notepad++ 웹사이트는 <strong class="font-bold dark:font-extrabold">더 강력한 보안 관행을 갖춘 새로운 호스팅 제공업체로 이전 완료</strong></li>
<li class="ms-6 text-pretty" data-v-09555c0e>영향받은 사용자들에게 <strong class="font-bold dark:font-extrabold">v8.9.1을 수동으로 다운로드하여 설치할 것을 권장</strong>하며, 구체적인 IoC(침해 지표)는 확보하지 못함</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://github.com/daumPostcode/QnA/issues/1498?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">📢 우편번호 서비스 도메인 및 API 네임스페이스 변경 안내 · Issue #1498 · daumPostcode/QnA</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://news.hada.io/topic?id=26451&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GeekNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>우편번호 서비스의 <strong class="font-bold dark:font-extrabold">도메인 및 JavaScript API 네임스페이스 변경</strong>에 대한 사전 안내 공지</li>
<li class="ms-6 text-pretty" data-v-09555c0e>공식 가이드 페이지는 현재 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">postcode.map.daum.net</code>에서 확인 가능하며, <strong class="font-bold dark:font-extrabold">2026년 3월 10일(화)</strong> 이후 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">postcode.map.kakao.com</code>으로 이전 예정</li>
<li class="ms-6 text-pretty" data-v-09555c0e>CDN 도메인이 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">t1.daumcdn.net</code>에서 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">t1.kakaocdn.net</code>으로 변경 완료되었으며, 기존 도메인도 당분간 사용 가능하나 <strong class="font-bold dark:font-extrabold">신규 도메인 사용 권장</strong></li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">2026년 3월 10일(화)</strong> 서비스 도메인이 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">postcode.map.daum.net</code>에서 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">postcode.map.kakao.com</code>으로 변경되며, 변경 후 일정 기간 병행 운영 예정</li>
<li class="ms-6 text-pretty" data-v-09555c0e>JavaScript API 생성자 네임스페이스가 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">daum.Postcode</code>에서 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">kakao.Postcode</code>로 변경됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">daum.Postcode</code>는 강제 변경되지 않으며 <strong class="font-bold dark:font-extrabold">오랜 기간 호환성 유지 목표</strong>로 지원하지만, 신규 개발 시 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">kakao.Postcode</code> 사용 권장</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">서비스 종료 예정 도메인</strong>: <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">dmaps.daum.net</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">ssl.daumcdn.net</code>은 <strong class="font-bold dark:font-extrabold">2026년 4~5월 도메인 최종 전환 시점에 종료</strong> 예정</li>
<li class="ms-6 text-pretty" data-v-09555c0e>종료 예정 도메인 사용 중인 경우 <strong class="font-bold dark:font-extrabold">반드시 신규 Kakao 도메인 및 API로 이전</strong> 필요</li>
<li class="ms-6 text-pretty" data-v-09555c0e>기존 도메인 종료에 대한 <strong class="font-bold dark:font-extrabold">상세 일정은 3월 10일 전후 재공지</strong> 예정</li>
<li class="ms-6 text-pretty" data-v-09555c0e>서비스 중단 방지를 위해 <strong class="font-bold dark:font-extrabold">사전 점검 및 점진적 전환 권장</strong></li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://velog.io/@typo/4-css-features-every-front-end-developer-should-know-in-2026?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">[번역] 2026년 프런트엔드 개발자라면 알아야 할 4가지 CSS 기능</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>2025년에 출시된 CSS 기능 중 프런트엔드 개발자가 반드시 알아야 할 4가지 핵심 기능을 소개</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold"><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">sibling-index()</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">sibling-count()</code></strong>: 크롬과 사파리에서 안정적으로 사용 가능하며, 형제 요소 간 상대적 위치를 값으로 활용할 수 있음. <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">transition-delay</code>와 결합해 순차적 애니메이션 효과를 쉽게 구현 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">@starting-style</code>과 함께 사용하면 요소가 처음 등장할 때 시간차 애니메이션 효과를 간단하게 적용할 수 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold"><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">scroll-state()</code></strong>: 스크롤러의 네 가지 상태(stuck, snapped, scrollable, scrolled)를 쿼리할 수 있으며, 스크롤 기반 애니메이션에 적합한 점진적 향상 기능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">container-type: scroll-state</code> 지정 후 자식 요소에서 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">@container scroll-state()</code>로 상태 쿼리 가능 (요소는 자기 자신은 쿼리할 수 없지만 가상 요소는 가능)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>stuck 상태로 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">position: sticky</code> 요소가 고정되는 시점 감지, snapped 상태로 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">scroll-snap</code> 정렬 활성화 시점 파악, scrollable로 콘텐츠 오버플로우 방향 감지, scrolled로 스크롤 방향에 따른 UI 제어 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold"><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">text-box</code></strong>: 텍스트 박스의 위아래 줄 간격을 깔끔하게 제거하여 글리프 위아래의 안전한 여백을 없애고, 베이스라인이나 x-height에 픽셀 단위로 정확한 정렬 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">text-box: trim-both cap alphabetic</code> 한 줄로 대문자 높이 위 여백과 알파벳 기준선 아래 여백을 제거할 수 있어, 타이포그래피와 그리드 정렬에 최적화됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">고급 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">attr()</code></strong>: 타입 안정적이며 HTML 속성을 CSS에서 직접 사용 가능. 타입 체크와 기본값 포함하여 색상, 숫자 등 다양한 타입 전달 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">type()</code> 함수로 속성 값을 허용된 키워드 목록과 비교 검증하며, 유효하지 않은 값은 자동으로 안전한 기본값으로 대체되어 HTML과 CSS 간 강력한 연결 고리 생성</li>
</ul>
</li>
</ul>
</li>
</ul></div>]]></content>
        <author>
            <name>Nesswit</name>
            <email>rishubil+blog@gmail.com</email>
            <uri>https://blog.update.sh/about</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[2026-02-02 주간 URL 모음]]></title>
        <id>https://blog.update.sh/weekly-urls/2026-02-02</id>
        <link href="https://blog.update.sh/weekly-urls/2026-02-02"/>
        <updated>2026-02-01T23:00:00.000Z</updated>
        <content type="html"><![CDATA[<div class="mdx-content leading-[1.6]" style="--v2806f315:0.875rem,[object Object],0.875rem,[object Object];--v67bf8b50:#6b7280;--v67bf83ce:#d1d5db;--v67bf878f:#9ca3af;--v67bf92d2:#374151;" data-v-ec58c90e><ul class="my-2 list-outside list-disc" data-v-ec58c90e>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://f1bonacc1.github.io/process-compose/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Process Compose</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260113205343/https://f1bonacc1.github.io/process-compose/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Process Compose는 컨테이너화되지 않은 애플리케이션을 관리하기 위한 간단하고 유연한 스케줄러 및 오케스트레이터임</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Go 언어로 작성된 단일 바이너리 파일로, 도커 파일, 볼륨 정의, 네트워크, 도커 레지스트리 등의 복잡한 설정 없이 사용 가능함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">process-compose.yaml</code> 파일에 간단한 YAML 스키마로 워크플로우를 정의하고 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">process-compose up</code> 명령으로 실행</li>
<li class="ms-6 text-pretty" data-v-09555c0e>주요 프로세스 관리 기능: <strong class="font-bold dark:font-extrabold">병렬/직렬 실행, 의존성 및 시작 순서 관리, 복구 정책, 수동 재시작</strong> 지원</li>
<li class="ms-6 text-pretty" data-v-09555c0e>다양한 설정 옵션: bash/zsh 스타일 프로세스 인자, 환경 변수(envsubst), 프로세스별/전역 로그, 헬스 체크(liveness/readiness)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">TUI(Terminal User Interface) 또는 CLI 모드</strong> 제공, 포그라운드 프로세스 및 인터랙티브 프로세스 실행 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">REST API(OpenAPI/Swagger)</strong> 제공, 서버 및 클라이언트 기능 모두 지원</li>
<li class="ms-6 text-pretty" data-v-09555c0e>고급 기능: 설정 파일 병합, 네임스페이스, 프로세스 다중 복제본 실행, 테마 지원, 즉석 설정 편집</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">스케줄링 기능</strong>(cron 및 interval 기반), 레시피 관리, 의존성 그래프 시각화(CLI, TUI, API) 지원</li>
<li class="ms-6 text-pretty" data-v-09555c0e>로그 캐싱, 설정 가능한 단축키, 포킹 프로세스(서비스/데몬) 등 편의 기능 포함</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://simonwillison.net/2026/Jan/23/fastrender/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Wilson Lin on FastRender: a browser built by thousands of parallel agents</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260126024743/https://simonwillison.net/2026/Jan/23/fastrender/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46738853&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Wilson Lin이 Cursor의 <strong class="font-bold dark:font-extrabold">FastRender 프로젝트</strong>를 소개: 수천 개의 병렬 에이전트를 사용해 <strong class="font-bold dark:font-extrabold">처음부터 웹 브라우저를 구축</strong>한 연구 프로젝트</li>
<li class="ms-6 text-pretty" data-v-09555c0e>FastRender는 Wilson의 개인 사이드 프로젝트로 시작되어 Cursor의 공식 연구 프로젝트로 발전했으며, <strong class="font-bold dark:font-extrabold">프로덕션 브라우저가 아닌 멀티 에이전트 협업 연구가 목표</strong></li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">최대 2,000개의 에이전트가 동시에 실행</strong>되어 시간당 수천 개의 커밋을 생성했으며, 프로젝트는 총 약 30,000개의 커밋을 기록함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>각 대형 머신에서 약 300개의 에이전트를 동시 실행하는 인프라 구조를 사용했으며, 에이전트들이 대부분 &quot;생각하는&quot; 시간을 보내기 때문에 효율적으로 작동함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">계층적 에이전트 구조</strong>: 계획(planning) 에이전트가 작업을 나누고 워커(worker) 에이전트가 실행하며, 작업 범위를 효과적으로 분할해 <strong class="font-bold dark:font-extrabold">병합 충돌이 거의 발생하지 않음</strong></li>
<li class="ms-6 text-pretty" data-v-09555c0e>GPT-5.1/5.2 일반 모델이 코딩 전문 모델(GPT-5.1-Codex)보다 더 나은 성능을 보였으며, 이는 자율적 작동 및 하네스 내 상호작용 등 <strong class="font-bold dark:font-extrabold">더 광범위한 지시사항 처리</strong>에 유리했기 때문</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">피드백 루프가 핵심</strong>: 브라우저 명세(spec) 문서를 git submodule로 포함, 스크린샷을 통한 시각적 검증, Rust 컴파일러의 엄격한 검증 등을 활용</li>
<li class="ms-6 text-pretty" data-v-09555c0e>에이전트들이 대부분의 <strong class="font-bold dark:font-extrabold">의존성(dependency)을 스스로 선택</strong>했으며, 일부는 QuickJS처럼 다른 에이전트 작업 완료를 기다리지 않고 스스로 차단을 해제하기 위해 추가함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">처리량(throughput) 최적화를 위해 작은 오류를 일시적으로 허용</strong>: 모든 커밋이 완벽하게 컴파일되도록 하면 동기화 병목이 발생하므로, 작은 오류가 몇 커밋 후 빠르게 수정되도록 함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>2026년 초 <strong class="font-bold dark:font-extrabold">단일 엔지니어가 에이전트 스웜을 활용해 달성할 수 있는 극단적 사례</strong>를 보여주며, 몇 주 만에 백만 줄 이상의 Rust 코드로 실제 웹 페이지를 렌더링할 수 있는 브라우저를 구현함</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://evilmartians.com/chronicles/how-to-favicon-in-2021-six-files-that-fit-most-needs?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">How to Favicon in 2026: Three files that fit most needs—Martian Chronicles, Evil Martians’ team blog</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260129014613/https://evilmartians.com/chronicles/how-to-favicon-in-2021-six-files-that-fit-most-needs?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>2026년 현재, 웹사이트에 필요한 파비콘은 <strong class="font-bold dark:font-extrabold">단 5개의 이미지 파일과 1개의 JSON 파일</strong>만 있으면 충분함 (기존의 20개 이상 PNG 파일 세트는 불필요)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">최소 파비콘 세트 구성</strong>: <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">favicon.ico</code> (32×32, 레거시 브라우저용), <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">icon.svg</code> (라이트/다크 테마 지원, 현대 브라우저용), <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">apple-touch-icon.png</code> (180×180, Apple 기기용), PWA용 웹 매니페스트에 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">icon-192.png</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">icon-512.png</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">icon-mask.png</code> (512×512, maskable) 포함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">SVG 파비콘의 장점</strong>: 벡터 포맷으로 다양한 크기에 대응 가능하며, CSS 미디어 쿼리 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">@media (prefers-color-scheme: dark)</code>를 활용해 하나의 파일로 라이트/다크 테마 모두 지원 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">성능 우려 해소</strong>: 브라우저가 파비콘을 백그라운드에서 다운로드하므로 웹사이트 성능에 영향 없음, SVG는 로고 같은 이미지에서 PNG보다 파일 크기가 작을 수 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">더 이상 사용하지 않는 파비콘 포맷</strong>: Windows Tile Icon (최신 Edge에서 불필요), Safari Pinned Icon (Safari 12 이후 일반 파비콘 사용), <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">rel=&quot;shortcut&quot;</code> (유효하지 않은 링크 관계), Opera Coast (2017년 단종)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">파비콘 생성 6단계 프로세스</strong>: ① SVG 준비 및 테마 지원 추가 → ② ICO 파일 생성 (GIMP 또는 ImageMagick 사용) → ③ PNG 이미지 생성 (512×512, 192×192, 180×180 등) → ④ SVGO와 Squoosh로 최적화 → ⑤ HTML에 링크 추가 → ⑥ 웹 매니페스트 생성</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">maskable 아이콘 요구사항</strong>: Android 런처의 다양한 디자인에 대응하기 위해 큰 여백(safe zone: 409×409 원) 필요, maskable.app에서 확인 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Webpack 통합 팁</strong>: <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">HtmlWebpackPlugin</code>으로 캐시 버스터(파일명에 해시 추가) 생성, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">copy-webpack-plugin</code>으로 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">favicon.ico</code> 복사, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">webpack-pwa-manifest</code> 플러그인으로 매니페스트 자동 생성</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">보너스 팁</strong>: 프로덕션과 스테이징 환경을 구분하기 위해 색상을 반전시킨 별도의 개발용 파비콘(<code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">favicon-dev.ico</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">icon-dev.svg</code>)을 만들어 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">NODE_ENV</code>에 따라 조건부로 사용</li>
<li class="ms-6 text-pretty" data-v-09555c0e>최신 웹 표준을 활용하면 파비콘 생성 작업이 매우 간단해지며, 파비콘 생성기 도구의 광기에서 벗어나 최소한의 효율적인 세트로 모든 현대 브라우저와 기기를 지원할 수 있음</li>
</ul>
</li>
</ul>
</li>
</ul></div>]]></content>
        <author>
            <name>Nesswit</name>
            <email>rishubil+blog@gmail.com</email>
            <uri>https://blog.update.sh/about</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[2026-01-26 주간 URL 모음]]></title>
        <id>https://blog.update.sh/weekly-urls/2026-01-26</id>
        <link href="https://blog.update.sh/weekly-urls/2026-01-26"/>
        <updated>2026-01-25T23:00:00.000Z</updated>
        <content type="html"><![CDATA[<div class="mdx-content leading-[1.6]" style="--v2806f315:0.875rem,[object Object],0.875rem,[object Object];--v67bf8b50:#6b7280;--v67bf83ce:#d1d5db;--v67bf878f:#9ca3af;--v67bf92d2:#374151;" data-v-ec58c90e><ul class="my-2 list-outside list-disc" data-v-ec58c90e>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://labs.ramp.com/rct?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">AI Plays Rollercoaster Tycoon</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260119131225/https://labs.ramp.com/rct?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46588972&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://news.hada.io/topic?id=25951&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GeekNews</a> | <a href="https://lobste.rs/s/wjbvwq?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Lobsters</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
제목: AI가 롤러코스터 타이쿤을 플레이하다
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Claude Code가 RollerCoaster Tycoon 2(OpenRCT2를 통해)에 통합되어 AI 공원 관리자 역할을 수행함으로써, 복잡한 환경에서 광범위한 범위의 에이전트가 가진 잠재력을 입증했습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>RollerCoaster Tycoon은 고객 중심의 피드백 루프와 관리 인터페이스를 특징으로 하여 B2B SaaS 운영과 강한 유사성을 보이기 때문에 선택되었습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>통합 작업에는 kubectl을 모방한 &#39;rctctl&#39;이라는 명령줄 인터페이스(CLI)를 생성하여 Claude가 모든 게임 기능과 상호작용할 수 있도록 하는 것이 포함되었습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Claude는 정보 수집, 공원 지표 분석, 가격 조정, 직원 고용, 간단한 편의시설 배치와 같은 직접적인 명령 실행에 탁월합니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Claude는 경로 설정, 놀이기구 입구 연결, 롤러코스터와 같은 대형 구조물 배치 또는 수직성 관리와 같은 공간 추론 작업에 어려움을 겪습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>AI 에이전트의 성공은 환경 인터페이스의 가독성과 강도에 크게 의존하며, 텍스트 기반 표현은 공간 작업에 있어 어려운 것으로 입증되었습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>통합 구축에는 AI 지원을 통한 &#39;바이브 코딩(vibe coding)&#39;이 포함되었으며, 이는 개발 가속화에 있어 LLM의 잠재력을 강조하는 동시에 신중한 계획과 반복의 필요성도 보여줍니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>AI 에이전트를 활용한 개발은 경영 시뮬레이션 게임처럼 느껴질 수 있으며, 여러 AI 인스턴스와 그 출력물을 관리하기 위해 상당한 정신적 대역폭이 필요합니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>긴밀한 피드백 루프는 AI 개발에 매우 중요하며, 에이전트가 자체 QA를 수행하고 구현을 검증할 수 있게 해주는데, 이는 이 프로젝트에서 병목 현상이었습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 프로젝트는 AI 에이전트가 순수한 지능이라기보다는 성실함을 자동화하는 도구로 보는 것이 가장 적절하다는 생각을 강화하며, 특히 운영상의 과제에 있어서 그러합니다.</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://lucumr.pocoo.org/2026/1/18/agent-psychosis/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Agent Psychosis: Are We Going Insane?</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260119011347/https://lucumr.pocoo.org/2026/1/18/agent-psychosis/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46666777&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://lobste.rs/s/0pxvyd?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Lobsters</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>AI 코딩 에이전트가 주는 도파민 중독과 과의존 문제를 다루며, 사용자들이 AI와 유사-협업 관계를 형성하고 건강하지 못한 행동을 강화하는 현상을 비판함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Philip Pullman의 &quot;His Dark Materials&quot;에 나오는 데몬(dæmon)에 비유하여, 사람들이 AI 에이전트와 분리 불가능한 관계를 형성하고 정체성의 일부로 여기게 되는 현상을 설명함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>AI 생성 PR과 이슈의 품질 저하가 심각한 문제로, 기여자는 1분 만에 생성하지만 메인테이너는 검토에 1시간 이상 소요되는 비대칭성이 발생함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>사람들이 AI와 상호작용하는 방식(불명확한 지시, 이상한 역할극, 욕설, 의례적 행동 등)이 결과물의 질에 큰 영향을 미침</li>
<li class="ms-6 text-pretty" data-v-09555c0e>토큰 소비 문제도 심각하며, 잘 준비된 세션(예: MiniJinja 포팅에 220만 토큰)과 달리 무분별한 에이전트 실행은 엄청난 토큰을 낭비하고, 현재의 저렴한 가격은 보조금 지원으로 지속 불가능할 수 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Steve Yegge의 Gas Town과 Beads를 극단적 사례로 제시: Beads는 24만 줄의 코드로 마크다운 파일을 관리하며, 품질 관리 없이 에이전트를 병렬 실행하는 &quot;슬롭 루프(slop loop)&quot;의 전형적 예시</li>
<li class="ms-6 text-pretty" data-v-09555c0e>AI 빌더 커뮤니티에서 사람들이 비판적 사고 없이 서로의 창작물을 과대평가하며, 내부자들만 이해하는 은어와 문화를 형성하는 집단 행동이 관찰됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>일부 프로젝트는 이제 실제 코드 대신 프롬프트 제출을 선호하거나, 기여자를 완전히 검증하기 전까지 인간 기여를 받지 않는 등 극단적 조치를 취하고 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>저자는 AI 에이전트가 생산성 도구로 놀라운 잠재력을 가지고 있지만, 비판적 사고 없이 완전히 의존하면 대규모 슬롭 머신이 된다는 양면성을 강조함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>메인테이너들이 AI 슬롭을 거부할 때 기여자들은 진심으로 혼란스러워하며(&quot;왜 부정적이세요? 도우려고 했는데&quot;), 이는 그들의 AI &quot;데몬&quot;이 좋다고 말했기 때문임</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://ghuntley.com/ralph/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Ralph Wiggum as a &quot;software engineer&quot;</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260119131525/https://ghuntley.com/ralph/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=44565028&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Ralph은 AI 코딩 에이전트를 무한 루프로 실행하는 기법으로, 가장 순수한 형태는 Bash 루프 (<code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">while :; do cat PROMPT.md | claude-code ; done</code>)임</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Ralph은 <strong class="font-bold dark:font-extrabold">대부분의 기업에서 그린필드 프로젝트의 아웃소싱을 대체할 수 있는 잠재력</strong>을 가지고 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Ralph의 핵심 특징: <strong class="font-bold dark:font-extrabold">불확정적인 세계에서 결정론적으로 나쁜 방식</strong>으로 작동하며, 이러한 결함은 다양한 프롬프트 스타일을 통해 식별하고 해결 가능함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>도구 호출 및 사용량에 제한이 없는 모든 도구로 Ralph 기법을 사용할 수 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>현재 Ralph는 <strong class="font-bold dark:font-extrabold">전혀 새로운 프로덕션급 난해한 프로그래밍 언어(CURSED)를 구축 중</strong>이며, LLM 훈련 데이터에 없는 언어임에도 불구하고 해당 언어로 프로그래밍까지 가능함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Ralph로 소프트웨어를 구축하려면 <strong class="font-bold dark:font-extrabold">큰 믿음과 최종 일관성(eventual consistency)에 대한 신념</strong>이 필요함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Ralph가 잘못된 방향으로 갈 때마다 도구를 탓하지 않고, 프롬프트를 조정(튜닝)하여 개선하는 방식으로 작동함 (마치 기타 튜닝처럼)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>비유: Ralph에게 놀이터를 만들라고 하면 잘 만들지만 미끄럼틀에서 떨어지므로, &quot;미끄럼틀은 미끄러져 내려가고, 뛰어내리지 말고, 주위를 살펴보라&quot;는 표지판을 추가하여 학습시킴</li>
<li class="ms-6 text-pretty" data-v-09555c0e>저자가 샌프란시스코에서 엔지니어들에게 Ralph를 가르쳤고, 한 엔지니어는 다음 계약에서 Ralph를 사용해 <strong class="font-bold dark:font-extrabold">엄청난 ROI(투자 대비 수익)를 달성</strong>함</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://addyosmani.com/blog/ai-coding-workflow/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">My LLM coding workflow going into 2026</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260119131626/https://addyosmani.com/blog/ai-coding-workflow/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46489061&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://news.hada.io/topic?id=25755&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GeekNews</a> | <a href="https://lobste.rs/s/gmtpog?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Lobsters</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>2025년 AI 코딩 어시스턴트가 게임 체인저가 되었으며, Anthropic에서는 <strong class="font-bold dark:font-extrabold">Claude Code의 약 90%가 Claude Code 자체에 의해 작성</strong>될 정도로 활용도가 높지만, 효과적으로 활용하려면 기술과 체계적 접근이 필요함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">명확한 계획 수립이 우선</strong>: 코드 생성 전에 AI와 함께 상세한 사양서(spec.md)와 단계별 프로젝트 플랜을 작성하는 &quot;15분 안의 폭포수 모델&quot; 방식으로 개발 방향을 정립</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">작업을 작고 반복 가능한 단위로 분할</strong>: 한 번에 하나의 함수나 기능만 구현하도록 하여 AI가 집중된 작업을 수행하고, 대규모 일괄 생성 시 발생하는 혼란과 불일치를 방지</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">광범위한 컨텍스트 제공</strong>: 관련 코드, 문서, 제약사항을 AI에게 충분히 제공하고, gitingest나 repo2txt 같은 도구로 코드베이스를 패키징하며, Claude Skills 같은 재사용 가능한 전문 지식 모듈 활용</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">적절한 모델 선택 및 병행 사용</strong>: 각 작업에 맞는 최적의 LLM을 선택하고(Claude, Gemini, GPT 등), 모델이 막힐 경우 다른 모델로 전환하거나 여러 모델의 의견을 교차 확인</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">개발 전 생애주기에 걸친 AI 활용</strong>: Claude Code, Gemini CLI 같은 CLI 도구와 Jules, GitHub Copilot Agent 같은 비동기 코딩 에이전트를 활용하되, 무인 자동화가 아닌 <strong class="font-bold dark:font-extrabold">감독된 방식으로 사용</strong></li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">철저한 검증, 테스트, 리뷰 필수</strong>: AI가 생성한 코드를 <strong class="font-bold dark:font-extrabold">절대 맹목적으로 신뢰하지 않고</strong>, &quot;과신하고 실수하기 쉬운&quot; 주니어 개발자처럼 취급하여 모든 출력을 검토하고 테스트하며, Chrome DevTools MCP 같은 도구로 디버깅 품질 루프 강화</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">빈번한 커밋과 버전 관리</strong>: AI가 빠르게 코드를 생성할 때 각 작은 작업마다 커밋하여 &quot;게임의 세이브 포인트&quot;처럼 활용하고, 문제 발생 시 쉽게 롤백할 수 있도록 함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">규칙과 예시로 AI 동작 커스터마이징</strong>: CLAUDE.md, GEMINI.md 같은 규칙 파일이나 커스텀 인스트럭션으로 코딩 스타일, 린트 규칙, 선호 패턴을 AI에게 학습시켜 프로젝트 관례에 맞는 코드 생성 유도</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">AI는 개발자의 전문성을 증폭시키는 도구</strong>: 클래식 소프트웨어 엔지니어링 원칙(설계, 테스트, 버전 관리, 표준 유지)이 AI 협업에서 더욱 중요하며, <strong class="font-bold dark:font-extrabold">인간 엔지니어가 쇼의 디렉터로 남아 책임을 지는 &quot;AI 보조 엔지니어링&quot;</strong> 접근법이 핵심</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://simonwillison.net/2026/Jan/19/scaling-long-running-autonomous-coding/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Scaling long-running autonomous coding</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260119131717/https://simonwillison.net/2026/Jan/19/scaling-long-running-autonomous-coding/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46675637&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Cursor는 단일 프로젝트에서 수백 개의 동시 자율 코딩 에이전트를 실행하는 실험을 진행했습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 에이전트들은 총 100만 줄 이상의 코드와 수조 개의 토큰을 작성했습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>시스템은 조정 및 완료 평가를 위해 플래너, 서브 플래너, 작업 에이전트 및 판정 에이전트를 활용했습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Cursor의 에이전트 군집 접근 방식에 대한 테스트 사례는 웹 브라우저를 처음부터 구축하는 것이었습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>에이전트들은 거의 일주일 동안 브라우저 프로젝트를 작업하여 1,000개 파일에 걸쳐 100만 줄 이상의 코드를 생성했습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>브라우저 코드가 포함된 FastRender 저장소에는 이제 빌드 지침이 포함되어 있습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>macOS에서 지침을 따른 결과 작동하는 브라우저 창이 나타났습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>생성된 브라우저는 일부 눈에 띄는 렌더링 결함에도 불구하고 대부분 올바른 레이아웃으로 웹 페이지를 읽기 쉽게 렌더링하는 인상적인 기능을 보여줍니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>FastRender 저장소는 WhatWG 및 CSS-WG 사양을 통합하기 위해 Git 서브모듈을 전략적으로 사용하여 에이전트에게 필요한 참조 자료를 제공합니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 개발은 AI 지원 코딩을 향한 중요한 단계로 간주되며, 결과물의 품질이 초기 예상보다 빠르게 나타나고 있습니다.</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://blog.jquery.com/2026/01/17/jquery-4-0-0/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">jQuery 4.0.0 | Official jQuery Blog</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260118113901/https://blog.jquery.com/2026/01/17/jquery-4-0-0/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46664755&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://news.hada.io/topic?id=25940&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GeekNews</a> | <a href="https://lobste.rs/s/vokwbo?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Lobsters</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>jQuery 4.0.0이 2006년 첫 출시 이후 약 20년, 메이저 버전 기준으로는 거의 10년 만에 정식 릴리스되었으며, 많은 개선사항과 현대화가 포함되어 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">IE 10 이하 지원 중단</strong>: IE 11 지원은 jQuery 5.0에서 단계적으로 제거 예정이며, Edge Legacy, 구형 iOS(최근 3개 버전 이전), Firefox(최근 2개 버전 이전, ESR 제외), Android Browser도 지원 중단</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Trusted Types 및 CSP 지원</strong>: Trusted Types를 지원하여 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">require-trusted-types-for</code> CSP 정책 위반 없이 HTML 조작 가능하며, 대부분의 비동기 스크립트 요청을 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">&lt;script&gt;</code> 태그로 전환하여 CSP 오류 방지</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">소스 코드를 AMD에서 ES 모듈로 마이그레이션</strong>: 빌드 도구를 RequireJS에서 Rollup으로 전환하고, 모던 빌드 도구 및 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">&lt;script type=module&gt;</code>과 호환되도록 개선</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">더 이상 사용되지 않는(deprecated) API 제거</strong>: <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">jQuery.isArray</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">jQuery.parseJSON</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">jQuery.trim</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">jQuery.type</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">jQuery.now</code> 등 여러 함수 제거되었으며, 네이티브 대체 함수(<code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">Array.isArray()</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">JSON.parse()</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">String.prototype.trim()</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">Date.now()</code> 등) 사용 권장</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">내부 전용 메서드 제거</strong>: jQuery 프로토타입에서 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">push</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">sort</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">splice</code> 등 배열 메서드가 제거되었으며, 필요시 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">[].push.call($elems, elem)</code> 형태로 대체 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Focus 이벤트 순서가 W3C 명세를 따름</strong>: 모든 브라우저가 통일된 이벤트 순서(blur → focusout → focus → focusin)를 따르게 되어 jQuery도 네이티브 동작을 따르도록 변경(이전 jQuery 순서: focusout → blur → focusin → focus)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">업데이트된 Slim 빌드</strong>: Deferreds와 Callbacks가 제거되어 약 19.5KB(gzipped)로 축소되었으며, IE11을 제외한 모든 지원 브라우저에서 네이티브 Promise 사용 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e>구형 IE 지원 코드 제거 및 deprecated API 제거로 <strong class="font-bold dark:font-extrabold">gzip 기준 3KB 이상 크기 감소</strong> 달성</li>
<li class="ms-6 text-pretty" data-v-09555c0e>CDN, npm(<code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">npm install jquery@4.0.0</code>)을 통해 다운로드 가능하며, 업그레이드 가이드 및 jQuery Migrate 플러그인을 통해 마이그레이션 지원 제공</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://www.bitecode.dev/p/pydantic-can-do-what?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Pydantic can do what?</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260109080720/https://www.bitecode.dev/p/pydantic-can-do-what?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Pydantic은 단순한 검증 라이브러리에서 environs/dotenv, click/typer/argparse, tomlib/yaml/json과 같은 여러 도구를 대체할 수 있는 포괄적인 설정 관리 시스템으로 발전했습니다</li>
<li class="ms-6 text-pretty" data-v-09555c0e>설정 기능이 너무 많이 성장하여 2023년에 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">pydantic-settings</code>라는 별도의 패키지로 분리되었습니다</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Pydantic settings는 계층적 우선순위를 가진 여러 소스에서 설정을 로드하는 것을 지원합니다: dotenv 파일(<code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">/etc/.env</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">.env</code>), 환경 변수, 그리고 수동 매개변수</li>
<li class="ms-6 text-pretty" data-v-09555c0e>값을 적절한 Python 타입(예: <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">Path</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">HttpUrl</code>)으로 자동으로 역직렬화하고 포괄적인 검증(범위, 허용된 값 등)을 수행합니다</li>
<li class="ms-6 text-pretty" data-v-09555c0e>시스템은 기본적으로 여러 설정 파일 형식을 지원합니다: JSON, TOML, YAML이며, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">PydanticBaseSettingsSource</code>를 상속하여 사용자 정의 로더를 만들 수 있습니다</li>
<li class="ms-6 text-pretty" data-v-09555c0e>최근 추가된 기능으로는 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">ConfigDict</code>에 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">cli_parse_args=True</code>를 추가하기만 하면 되는 CLI 인수 파싱 기능이 있어 argparse/click/typer가 필요 없습니다</li>
<li class="ms-6 text-pretty" data-v-09555c0e>CLI 기능에는 하위 명령, 케밥-케이스(kebab-case), 복잡한 값 전달(리스트/json), 별칭(aliases), <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">--no-flag</code>, 위치 인수, 상호 배타적 그룹, argparse 통합이 포함됩니다</li>
<li class="ms-6 text-pretty" data-v-09555c0e>내장된 비밀 관리 기능은 민감한 값(<code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">SecretStr</code>과 같은)을 표시하고 출력에서 검열하며, 접근하려면 명시적으로 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">get_secret_value()</code> 호출이 필요합니다</li>
<li class="ms-6 text-pretty" data-v-09555c0e>여러 클라우드 공급자 및 시스템에서 비밀을 읽는 것을 지원합니다: Unix secret 파일, Docker secrets, AWS Secret Manager, Google Cloud Secret Manager, Azure Key Vault, 그리고 Hashicorp Vault(커뮤니티 플러그인을 통해)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>라이브러리는 누락된 소스를 우아하게 처리하고, 모든 설정 계층에서 우선순위를 관리하며, 깊게 중첩된 값을 이해하고, 우수한 검증 오류 메시지를 제공합니다</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://www.smashingmagazine.com/2026/01/rethinking-pixel-perfect-web-design/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Rethinking “Pixel Perfect” Web Design — Smashing Magazine</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260121111945/https://www.smashingmagazine.com/2026/01/rethinking-pixel-perfect-web-design/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>2026년 현재, 인쇄 매체 시대부터 이어져 온 <strong class="font-bold dark:font-extrabold">&quot;픽셀 퍼펙트(Pixel Perfect)&quot; 개념이 현대 웹 디자인에서 오히려 오해를 불러일으키고, 모호하며, 역효과를 낸다</strong>는 주장</li>
<li class="ms-6 text-pretty" data-v-09555c0e>픽셀 퍼펙트는 1980~90년대 인쇄 산업과 초기 GUI 디자인에서 유래했으며, 당시 웹 디자이너들은 <strong class="font-bold dark:font-extrabold">&quot;인쇄된 페이지&quot; 사고방식</strong>을 그대로 웹에 적용하여 테이블 레이아웃과 스페이서 GIF로 고정된 레이아웃을 구현했음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>2000년 John Allsopp의 &quot;A Dao of Web Design&quot;에서 웹의 본질적 유동성을 무시한 픽셀 퍼펙트를 비판했으나, 2010년 반응형 웹 디자인이 등장한 이후에도 이 개념은 여전히 남아있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>현대 웹에서 픽셀 퍼펙트가 실패하는 이유
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">근본적으로 모호함</strong>: &quot;모든 것&quot;을 완벽하게 맞추려는 요구는 구체성이 부족</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">다양한 디바이스 현실</strong>: 무한에 가까운 뷰포트, 해상도, 화면비에서 단일 &quot;완벽함&quot;은 기술적으로 불가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">동적 콘텐츠</strong>: 다국어 지원, 긴 텍스트 등 콘텐츠 변화에 취약한 고정 레이아웃</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">접근성 무시</strong>: 사용자 폰트 크기 조정이나 고대비 모드에서 깨지는 레이아웃은 진정한 완벽함이 아님</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">시스템 사고 부재</strong>: 컴포넌트 기반 디자인 시스템과 충돌하며, 확장성을 저해</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">기술 부채 증가</strong>: <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">margin-top: 3px</code> 같은 &quot;매직 넘버&quot; 해킹으로 취약하고 유지보수 어려운 코드 생성</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e>대안으로 <strong class="font-bold dark:font-extrabold">&quot;디자인 의도(Design Intent)&quot;</strong> 중심 접근 제안: 정적 픽셀 값 대신 왜 그 간격이 필요한지 이해하고, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">clamp()</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">rem</code>, CSS Container Queries 등 유연한 단위와 도구 활용</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">디자인 토큰</strong> 사용으로 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">--spacing-large</code> 같은 논리적 값 공유, 디자이너-개발자 간 값이 아닌 로직 동기화</li>
<li class="ms-6 text-pretty" data-v-09555c0e>웹의 <strong class="font-bold dark:font-extrabold">유동성을 기능으로 받아들이고</strong>, &quot;핸드오버&quot; 방식 대신 살아있는 디자인 시스템에서 협업하며, &quot;픽셀 퍼펙트&quot; 대신 &quot;디자인 시스템과 시각적 일관성&quot;, &quot;간격과 위계 일치&quot;, &quot;비율과 정렬 로직 유지&quot; 같은 명확한 용어 사용 권장</li>
<li class="ms-6 text-pretty" data-v-09555c0e>결론: 현대 웹은 고정된 픽셀이 아니라 <strong class="font-bold dark:font-extrabold">적응하고 호흡하는 인터페이스</strong>를 요구하며, 진정한 완벽함은 누가 보든 어떤 기기로 보든 디자인의 본질이 유지되는 것</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://www.nytimes.com/2026/01/19/technology/polymarket-kalshi-prediction-markets.html?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">The Rise of Prediction Markets - The New York Times</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Polymarket과 Kalshi 같은 예측 시장은 사용자들이 정치적 결과와 스포츠 경기부터 연예인 뉴스에 이르기까지 광범위한 이벤트에 베팅할 수 있도록 합니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이러한 플랫폼들은 주로 정치 애호가들 사이의 틈새 관심사에서 미국 정치와 문화에서 보다 주류적인 존재로 이동했습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>인기 급증으로 인해 CNN, CNBC, The Wall Street Journal과 같은 주요 미디어 회사들이 예측 시장과 파트너십을 맺고 그들의 데이터를 뉴스 보도에 통합하게 되었습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Kalshi와 Polymarket에서 거래되는 금액의 규모는 상당히 증가하여, 12월에는 거의 120억 달러가 거래되었으며, 이는 전년 대비 400% 증가한 수치입니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>예측 시장 기업들은 수십억 달러를 유치하며 상당한 투자를 받아 저명한 테크 스타트업이 되었습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Polymarket과 Kalshi 모두 트럼프 가문과 연결되어 있으며, Donald Trump Jr.가 두 회사의 고문으로 활동하고 있습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이란 시위와 같은 사건들은 이러한 플랫폼에서 베팅 기회가 되었으며, 이는 스포츠 팬들이 감독의 미래에 베팅하는 방식과 유사합니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Polymarket 배당률은 골든 글로브 시상식 방송 중에도 소개되어 문화적 관련성이 커지고 있음을 나타냅니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이러한 성장은 정보와 대중 정서가 추적되고 잠재적으로 영향을 받는 방식에 상당한 변화가 있음을 시사합니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 플랫폼들은 정치 마니아를 넘어 다양한 투기적 이벤트에 관심 있는 더 넓은 청중으로 확장되면서 다양한 사용자들을 유치하고 있습니다.</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://www.simonpcouch.com/blog/2026-01-20-cc-impact/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Electricity use of AI coding agents</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260121113238/https://www.simonpcouch.com/blog/2026-01-20-cc-impact/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46695415&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>2025년 데이터에 따르면 일반적인 AI 챗봇 사용(하루 100개 프롬프트)은 개인 전기·물 사용량의 0.01% 수준으로 환경 영향이 미미함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>그러나 <strong class="font-bold dark:font-extrabold">코딩 에이전트(Claude Code 등)를 업무에 활용하는 &quot;극단적 파워 유저&quot;의 경우 에너지 소비량이 수백 배 이상 증가</strong>함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>&quot;중간값 쿼리(median query)&quot;는 약 0.3 Wh를 소비하는 반면, <strong class="font-bold dark:font-extrabold">Claude Code 세션 1회는 약 41 Wh를 소비</strong>—138배 더 많음
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Claude Code는 시스템 프롬프트와 도구 설명만으로 약 20,000 토큰을 사용하며, 한 번의 메시지가 5~10개의 대규모 쿼리를 연쇄적으로 발생시킴</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e>저자의 일반적인 업무일 기준으로 <strong class="font-bold dark:font-extrabold">Claude Code를 통해 하루 약 1,300 Wh를 소비</strong>—&quot;일반 쿼리&quot; 4,400개 분량에 해당하며, 하루 $15-20의 토큰 비용 발생</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이는 <strong class="font-bold dark:font-extrabold">식기세척기 1회 추가 사용, 냉장고 1대 추가 운영, 또는 자동차로 식료품점 1회 왕복 수준</strong>의 에너지 소비량</li>
<li class="ms-6 text-pretty" data-v-09555c0e>에너지 추정 방법: Epoch AI의 GPT-4o 데이터(~240 Wh/MTok)와 Anthropic의 API 가격 비율(출력 토큰 = 입력 토큰의 5배)을 활용해 토큰당 에너지 소비량 역산
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>입력: ~390 Wh/MTok, 출력: ~1,950 Wh/MTok, 캐시 읽기: ~39 Wh/MTok (최대 컨텍스트 기준)</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e>저자는 8,825개의 Claude Code API 호출 로그를 분석했으며, 중간값 세션은 24개 요청과 592,439개 토큰 소비(5개 사용자 메시지 + 19개 도구 호출 응답)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>주요 유의사항
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>프론티어 랩들이 종합 데이터를 공개하지 않아 모두 추정치임</li>
<li class="ms-6 text-pretty" data-v-09555c0e>에너지원(재생 에너지 vs 화석 연료)에 따라 환경 영향이 크게 달라짐</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">개인 배출량 감축보다 녹색 에너지 전환 지지 등의 정책적 접근이 더 효과적</strong>일 수 있음</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e>저자는 이 수준의 에너지 사용량이 코딩 에이전트 사용을 줄일 만큼 심각하다고 보지 않지만, AI 관련 녹색 에너지 전환을 가속화하는 단체들에 기부할 정도로는 중요하다고 판단함</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://simonwillison.net/2026/Jan/21/claudes-new-constitution/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Claude’s new constitution</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260122135611/https://simonwillison.net/2026/Jan/21/claudes-new-constitution/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46713272&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Anthropic은 Claude의 &quot;헌장(constitution)&quot; 문서를 CC0 라이선스 하에 공식적으로 공개했습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 헌장 문서는 이전에 Richard Weiss에 의해 유출되어 &quot;영혼 문서(soul document)&quot;로 불렸으며, Claude의 훈련 절차의 일부였습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 문서는 35,000 토큰 이상의 길이로, Opus 4.5 시스템 프롬프트보다 훨씬 큽니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>문서는 Claude의 핵심 가치를 상세히 설명하고 있습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Anthropic의 Amanda Askell이 문서의 출처를 확인했습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>헌장은 시스템 프롬프트의 일부가 아니라 Claude의 훈련에 내재되어 있습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이번 공개로 Claude의 내부 지침이 대중에게 공개되었습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>감사의 글 섹션에는 문서를 검토한 외부 기여자들의 명단이 나열되어 있습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>특히, 두 명의 가톨릭 성직자인 Brendan McGuire 신부와 Paul Tighe 주교가 외부 기여자로 나열되어 있습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Brendan McGuire 신부는 컴퓨터 과학 및 수학 배경을 가지고 있으며, Paul Tighe 주교는 도덕 신학 배경을 가지고 있습니다.</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://snubi.net/posts/Show-HN/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">The percentage of Show HN posts is increasing, but their scores are decreasing | snubi</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260122140858/https://snubi.net/posts/Show-HN/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46702099&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://news.hada.io/topic?id=26030&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GeekNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>코딩이 가능한 LLM의 등장 이후 Hacker News에서 &#39;Show HN&#39; 게시물의 비율이 크게 증가했습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>2012-2022년에는 &#39;Show HN&#39; 게시물이 전체 스토리의 약 2-3%를 차지했습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>2025년 12월까지 &#39;Show HN&#39; 게시물은 전체 스토리의 12% 이상을 차지했으며, LLM으로 생성된 콘텐츠가 이러한 추세를 가속화했습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Claude Code와 Cursor 1.0과 같은 도구들이 &#39;Show HN&#39; 게시물의 비율을 더욱 증가시킨 것으로 보입니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>&#39;Show HN&#39; 스토리의 평균 점수는 비율이 증가함에 따라 감소하고 있습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>2025년 12월 기준으로, &#39;Show HN&#39;의 평균 점수는 모든 스토리의 평균 점수보다 약 10점 낮습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>점수 하락은 LLM으로 생성된 콘텐츠의 품질이 반드시 낮아서라기보다는, &#39;Show HN&#39; 게시물의 증가된 양으로 인한 독자들의 피로감 때문일 수 있습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>저자는 2022년 평균 점수의 설명되지 않은 증가를 언급하고 있습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 분석은 BigQuery의 Hacker News 데이터셋에서 내보낸 데이터를 사용합니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>게시물 제목이나 설명에 명시적인 언급이 없기 때문에 LLM으로 생성된 &#39;Show HN&#39; 게시물의 정확한 비율을 결정하는 것은 어렵습니다.</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://susam.net/nested-code-fences.html?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Nested Code Fences in Markdown</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://news.ycombinator.com/item?id=46705201&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://lobste.rs/s/itkq4m?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Lobsters</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>CommonMark와 GitHub Flavoured Markdown(GFM)에서 <strong class="font-bold dark:font-extrabold">코드 펜스(code fences) 내부에 백틱(backticks)이나 틸드(tildes)를 중첩하는 방법</strong>을 설명하는 기술 문서</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">기본 코드 펜스 문제</strong>: 삼중 백틱(```)으로 시작한 코드 블록 내부에 다시 삼중 백틱이 나오면, 두 번째 백틱이 코드 블록을 즉시 종료시켜 의도하지 않은 렌더링 결과 발생</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">해결책 1 - 틸드 사용</strong>: 코드 펜스를 백틱 대신 틸드(~~~)로 감싸면 내부에 백틱을 안전하게 포함 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">해결책 2 - 더 많은 문자 사용</strong>: 코드 펜스는 최소 3개 이상의 백틱 또는 틸드로 구성 가능하므로, 내부 백틱보다 더 많은 수의 백틱(예: `````)으로 감싸면 중첩 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">인라인 코드 스팬(code spans) 문제</strong>: 단일 백틱으로 구분되는 인라인 코드 내부에 백틱이 있으면 코드 스팬이 조기 종료됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">인라인 코드 해결책</strong>: 여러 개의 백틱(예: `` 또는 ```)을 구분자로 사용하면 내부에 백틱 포함 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">공백 처리 규칙</strong>: 인라인 코드 스팬 내부 텍스트가 공백으로 시작하고 끝나면, 렌더링 시 양쪽 끝에서 각각 한 칸의 공백이 제거됨 (이를 활용해 백틱을 코드 스팬에 포함 가능)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>CommonMark 스펙 0.30 버전의 <strong class="font-bold dark:font-extrabold">4.5절(Fenced Code Blocks)</strong>과 <strong class="font-bold dark:font-extrabold">6.1절(Code Spans)</strong>에서 이러한 규칙들이 명시되어 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>코드 펜스는 백틱과 틸드를 혼용할 수 없으며, 여는 펜스와 동일한 타입 및 개수 이상의 문자로 닫아야 함</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://keepandroidopen.org/ko/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Keep Android Open</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260122142020/https://keepandroidopen.org/ko/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Google이 2025년 8월, 다음 해부터 <strong class="font-bold dark:font-extrabold">등록하지 않은 개발자는 Android 애플리케이션 개발 불가</strong>라는 새로운 정책을 발표함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 정책은 Google의 승인 절차를 거쳐야만 앱 개발 및 배포가 가능하도록 제한하는 내용을 포함함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">소비자 관점</strong>: Android가 자유로운 컴퓨팅 플랫폼이라는 약속이 깨지며, Google이 강제 시스템 업데이트를 통해 사용자의 소프트웨어 선택권을 차단할 예정</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">개발자 관점</strong>: Google의 승인 없이는 앱 개발 및 공유가 불가능해지며, &quot;개방형&quot;이라는 Android의 핵심 가치와 iPhone과의 차별점이 사라짐</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">국가 관점</strong>: 권위주의 정권의 요구에 순응해 온 기업에 국민의 디지털 주권을 넘겨주게 되며, 필수 소프트웨어가 불투명한 기업의 결정에 좌우될 위험</li>
<li class="ms-6 text-pretty" data-v-09555c0e>전 세계 규제 당국이 기술 독점과 권력 집중화에 우려를 표명하고 있으며, <strong class="font-bold dark:font-extrabold">개인들의 의견을 직접 듣고자 함</strong></li>
<li class="ms-6 text-pretty" data-v-09555c0e>규제 당국에 문의 시, 정책이 소비자 및 경쟁에 미칠 피해를 <strong class="font-bold dark:font-extrabold">정중하고 구체적으로</strong> 설명하고, 공용어(한국어)로 작성하며, 서면 답변을 요청할 것을 권장</li>
<li class="ms-6 text-pretty" data-v-09555c0e>앱 개발자에게 <strong class="font-bold dark:font-extrabold">얼리 엑세스 프로그램 가입 거부, 신분증 미제출, Android Developer Console 초대 거부</strong>를 촉구하며, 개발자들의 반발이 정책 저지의 핵심임을 강조</li>
<li class="ms-6 text-pretty" data-v-09555c0e>커뮤니티, SNS, 블로그를 통해 메시지 확산 및 FreeDroidWarn 라이브러리를 앱에 포함하여 사용자에게 상황을 알릴 것을 요청</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Google 내부 관계자에게 정책 관련 추가 정보 제공을 요청하며, <a href="mailto:tips@keepandroidopen.org" rel="noopener noreferrer" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">tips@keepandroidopen.org</a>로 기밀 연락 가능함을 안내</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://news.hada.io/topic?id=26039&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">전자책 검색기 - 전자책 검색과 대출이 불편해서 만들었습니다 | GeekNews</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260122142320/https://news.hada.io/topic?id=26039&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>전자책 검색과 대출의 불편함을 해결하기 위해 만든 <strong class="font-bold dark:font-extrabold">전자책 검색기(ebook-search.org)</strong> 소개</li>
<li class="ms-6 text-pretty" data-v-09555c0e>공공 도서관의 전자책 무료 대출 서비스가 있지만, 개별 도서관 로그인 후 검색·대출·앱 다운로드 등 복잡한 절차가 필요함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">주요 기능</strong>: 전자책 검색 시 판매 서점/플랫폼, 구독 플랫폼, 대출 가능한 공공 도서관을 한 번에 조회 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e>도서관에서 대출 가능한 경우 <strong class="font-bold dark:font-extrabold">도서관 계정 로그인 및 딥링크 제공</strong>(교보, Yes24 등)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">베스트셀러/신간 도서를 한눈에 조회</strong>할 수 있는 트렌딩 뷰 제공</li>
<li class="ms-6 text-pretty" data-v-09555c0e>사용자 피드백: 일부 서적이 타 플랫폼에서 판매됨에도 누락되는 경우 발견됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>누락 원인은 <strong class="font-bold dark:font-extrabold">모든 플랫폼이 ISBN으로 매칭되지 않고 일부는 제목으로만 매칭</strong>되기 때문이며, 지속적으로 보완 예정</li>
<li class="ms-6 text-pretty" data-v-09555c0e>특정 서점에서만 판매하는 전자책을 찾는 데 유용함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>도서정가제로 가격 차이는 크지 않지만, <strong class="font-bold dark:font-extrabold">구글 플레이스토어에서 구매 후 DeDRM을 통해 킨들 등에서 볼 수 있어</strong> 가격 섹션 유지</li>
<li class="ms-6 text-pretty" data-v-09555c0e>사용자 제안: 로딩 시간이 다소 걸리므로 대기 메시지 추가 요청</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://brooker.co.za/blog/2026/01/21/pass-k.html?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Pass@k is Mostly Bunk</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260123002838/https://brooker.co.za/blog/2026/01/21/pass-k.html?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46711347&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>pass@k 메트릭은 AI 에이전트 평가에서 흔히 사용되지만, <strong class="font-bold dark:font-extrabold">대부분의 경우 잘못된(bunk) 지표</strong>임</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">pass@k의 정의</strong>: k번의 시도 중 최소 1번이라도 성공할 확률을 나타내는 지표 (예: 주사위에서 6이 나올 확률이 5%일 때, pass@100은 99.4%에 달함)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">pass@k의 핵심 문제점</strong>: 지수적으로 관대한(exponentially forgiving) 메트릭이라 낮은 k 값만으로도 어떤 모델이든 좋아 보이게 만들 수 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>실제 성공률이 5%에 불과한 모델도 pass@100에서는 99.4%라는 인상적인 결과를 보일 수 있어 <strong class="font-bold dark:font-extrabold">오해를 불러일으킴</strong></li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">인간 사용자의 실제 경험</strong>과 괴리: 사용자는 &quot;10번 시도해서 1번 성공하면 만족&quot;이 아니라 &quot;10번 중 1번만 되면 형편없는 제품&quot;이라고 평가함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>실제 사용 환경에서는 여러 단계가 모두 성공해야 하므로 <strong class="font-bold dark:font-extrabold">지수적으로 가혹한(exponentially unforgiving)</strong> 상황이며, 이 경우 <strong class="font-bold dark:font-extrabold">pass^k가 더 나은 메트릭</strong>임</li>
<li class="ms-6 text-pretty" data-v-09555c0e>pass@k가 유용한 경우: <strong class="font-bold dark:font-extrabold">작업이 단순하고, 평가가 신뢰할 수 있으며, 인간이 루프 밖에 있는</strong> 특수한 상황 (선형 비용 증가로 지수적 성공률 향상을 얻을 수 있는 경우)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>그러나 이러한 조건을 만족하는 작업은 드물기 때문에, <strong class="font-bold dark:font-extrabold">pass@k는 드물게 사용되어야 하며 사용할 때마다 신중한 정당화가 필요함</strong></li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">에이전트 AI 분야를 발전시키려면 메트릭에 대해 정직해야 함</strong></li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://curl.se/.well-known/security.txt?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">https://curl.se/.well-known/security.txt</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260123004340/https://curl.se/.well-known/security.txt?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46717556&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>curl 오픈 소스 프로젝트는 보안 보고서를 접수합니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>보고된 문제에 대해 보상이나 금전적 대가는 제공되지 않습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>확인된 문제에 대해서는 감사와 acknowledgment(공로 인정)가 제공됩니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">저품질 보고서를 제출하는 사용자는 차단되고 공개적으로 조롱당할 수 있습니다.</strong></li>
<li class="ms-6 text-pretty" data-v-09555c0e>보안 보고서는 <a href="mailto:security@curl.se" rel="noopener noreferrer" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">security@curl.se</a>로 이메일을 통해 제출할 수 있습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>또는 보안 보고서는 GitHub(<a href="https://github.com/curl/curl/security/advisories)%EB%A5%BC?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">https://github.com/curl/curl/security/advisories)를</a> 통해 제출할 수 있습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>취약점 공개 정책은 <a href="https://curl.se/dev/vuln-disclosure.html?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">https://curl.se/dev/vuln-disclosure.html</a> 에서 확인할 수 있습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>보안 보고서의 선호 언어는 영어입니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>보안 문제에 대한 acknowledgment(공로 인정) 목록은 <a href="https://curl.se/docs/security.html?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">https://curl.se/docs/security.html</a> 에서 확인할 수 있습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 security.txt 파일은 2026년 10월 22일에 만료됩니다.</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://blog.sweep.dev/posts/oss-next-edit?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Sweep AI Blog - Insights from building coding agents and autocomplete for JetBrains</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260123075004/https://blog.sweep.dev/posts/oss-next-edit?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Sweep이 <strong class="font-bold dark:font-extrabold">Sweep Next-Edit</strong>이라는 1.5B 파라미터 규모의 next-edit 자동완성 모델을 오픈소스로 공개함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>로컬 랩톱에서 500ms 이하로 실행 가능하며, 4배 이상 큰 모델들보다 next-edit 벤치마크에서 우수한 성능을 보임</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">기존 모델(Zeta, Instinct)의 주요 문제점</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>채팅 템플릿이나 커스텀 토큰 사용으로 인한 비효율적인 토크나이징 (예: <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">&lt;|editable_region_start|&gt;</code> 같은 경계 마커가 7개 토큰으로 분할됨)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>과도한 시스템 프롬프트와 불필요한 지시사항으로 인한 노이즈 및 지연 증가</li>
<li class="ms-6 text-pretty" data-v-09555c0e>부족한 학습 데이터 (Zeta는 수백 개, Instinct는 수천 개 수준이며 대부분 단일 저장소에서 추출)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Zeta는 LoRA 사용으로 기본 패턴 매칭조차 학습에 어려움</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Sweep의 최적화된 포맷</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Qwen2.5 Coder의 프리트레이닝 포맷 기반으로, 최근 변경사항을 diff 형태로 제공하고 커서 주변 고정 윈도우(10줄 위아래)를 재작성하도록 설계</li>
<li class="ms-6 text-pretty" data-v-09555c0e>유전 알고리즘으로 30개 이상의 프롬프트 포맷을 실험한 결과, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">original</code>/<code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">updated</code> 블록 형식이 unified diff보다 LLM이 파싱하기 쉬움을 발견</li>
<li class="ms-6 text-pretty" data-v-09555c0e>고정 윈도우 크기(21줄)를 사용해 모델이 출력 길이를 예측 가능하게 하여 학습 안정성 향상 (AST 기반 동적 경계는 일관성 부족 문제 발생)</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">학습 과정</strong>: 8xH100에서 4시간 동안 ~100k 엔트리로 SFT(Supervised Fine-Tuning) 진행 후, 2000 스텝의 강화학습(RL)으로 파싱 불가능한 코드 생성 및 과도한 diff 크기 등의 문제 해결</li>
<li class="ms-6 text-pretty" data-v-09555c0e>RL 단계에서 tree-sitter로 파싱 가능성 검증 및 변경 크기 정규화 보상 함수 적용</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">성능 평가</strong>: 5개 벤치마크(커서 아래/위 next-edit, tab-to-jump, FIM, noisiness)에서 공백 무시 exact-match 정확도 사용 (CodeBLEU나 LLM-as-a-judge 대신 엄격한 메트릭 선택)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>TensorRT-LLM 포크와 FP8 양자화, n-gram speculative decoding을 적용한 커스텀 추론 엔진으로 평균 sub-100ms의 warm autocomplete 달성</li>
<li class="ms-6 text-pretty" data-v-09555c0e>모델 가중치와 실행 예제를 Hugging Face에 공개하여 VSCode, Neovim, Emacs 등 모든 IDE에서 빠르고 프라이버시 보호되는 자동완성 구축 가능</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://runjak.codes/posts/2026-01-21-adversarial-coding-test/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">runjak.codes: An adversarial coding test</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260123082345/https://runjak.codes/posts/2026-01-21-adversarial-coding-test/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46717472&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://lobste.rs/s/bndnsg?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Lobsters</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>저자가 구직 면접 과정에서 코딩 테스트를 받던 중 <strong class="font-bold dark:font-extrabold">악의적인 공격을 발견한 사례</strong>를 공유함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Fediverse에서 본 보안 경고 게시물이 계기가 되어 의심을 품게 됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Solvolabs</strong>라는 회사로부터 코딩 챌린지를 위한 저장소 접근 권한을 받았으나, 회사 웹사이트가 블록체인/NFT 스캠과 AI 회사의 디자인 언어를 혼합한 형태로 의심스러웠음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>저장소의 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">.vscode/tasks.json</code> 파일 히스토리를 조사한 결과 <strong class="font-bold dark:font-extrabold">원격 서버에서 스크립트를 다운로드하고 실행하는 악성 명령어들을 발견</strong>함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>발견된 명령어들은 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">curl</code>과 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">wget</code>을 사용해 Vercel에 호스팅된 여러 도메인에서 셸 스크립트를 다운로드하고 실행하도록 설계됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>악성 스크립트는 <strong class="font-bold dark:font-extrabold">다단계로 작동</strong>하며, JWT 토큰(3분 유효)을 사용해 추가 스크립트를 다운로드하고 백그라운드에서 실행함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>피싱 공격에 대한 교훈: <strong class="font-bold dark:font-extrabold">충분한 시간과 기회가 주어지면 누구나 실수로 버튼을 클릭할 수 있으며</strong>, 이것이 계층적 보안 통제가 중요한 이유임</li>
<li class="ms-6 text-pretty" data-v-09555c0e>GitHub에 해당 조직을 신고했고 몇 시간 내에 확인 메일을 받았으며, Vercel에도 도메인을 신고하고 응답을 기다리는 중</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">면접 중인 회사의 GitHub 조직이 삭제되는 결과</strong>를 초래했으며, 저자는 이를 예상하지 못했다고 언급</li>
<li class="ms-6 text-pretty" data-v-09555c0e>구직자들에게 주의를 당부하며, 자신도 계속 구직 중임을 밝힘</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://qwen.ai/blog?id=qwen3tts-0115&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Qwen3-TTS Family is Now Open Sourced: Voice Design, Clone, and Generation!</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260124143102/https://qwen.ai/blog?id=qwen3tts-0115&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46719229&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://news.hada.io/topic?id=26049&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GeekNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Qwen3-TTS는 음성 클로닝, 디자인, 그리고 고품질의 인간과 유사한 음성 합성을 제공하는 오픈소스 음성 생성 모델 패밀리입니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 모델들은 효율적인 음성 압축과 고품질 복원을 가능하게 하는 Qwen3-TTS-Tokenizer-12Hz를 기반으로 합니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Qwen3-TTS는 극한의 양방향 스트리밍 생성을 위한 듀얼 트랙(Dual-Track) 모델링 아키텍처를 활용하여 단일 문자 처리 후 첫 번째 오디오 패킷을 전달합니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>오픈소스로 공개된 Qwen3-TTS 모델은 두 가지 크기로 제공됩니다: 최고 성능을 위한 1.7B와 성능과 효율성의 균형을 위한 0.6B입니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 모델들은 10개의 주요 언어와 다양한 방언을 지원하며, 적응형 톤, 리듬, 감정 표현을 위한 강력한 맥락 이해 능력을 보여줍니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Qwen3-TTS-1.7B-VoiceDesign은 사용자가 설명적인 텍스트 지시를 기반으로 맞춤형 음성을 생성할 수 있게 합니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Qwen3-TTS-1.7B-CustomVoice와 Qwen3-TTS-0.6B-CustomVoice는 사용자 지시를 사용한 목표 음색에 대한 스타일 제어를 지원하며 9개의 프리미엄 음색을 제공합니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>기본 모델(1.7B 및 0.6B)은 빠른 3초 음성 클로닝이 가능하며 다른 모델의 미세 조정에 사용할 수 있습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Qwen3-TTS는 음성 디자인, 음성 제어, 음성 클로닝 작업에서 최첨단(SOTA) 성능을 달성하여 여러 선도적인 모델들을 능가했습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Qwen-TTS-Tokenizer-12Hz는 PESQ, STOI, UTMOS 및 화자 유사도와 같은 음성 복원 메트릭에서 SOTA 성능을 입증했습니다.</li>
</ul>
</li>
</ul>
</li>
</ul></div>]]></content>
        <author>
            <name>Nesswit</name>
            <email>rishubil+blog@gmail.com</email>
            <uri>https://blog.update.sh/about</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[2026-01-19 주간 URL 모음]]></title>
        <id>https://blog.update.sh/weekly-urls/2026-01-19</id>
        <link href="https://blog.update.sh/weekly-urls/2026-01-19"/>
        <updated>2026-01-18T23:00:00.000Z</updated>
        <content type="html"><![CDATA[<div class="mdx-content leading-[1.6]" style="--v2806f315:0.875rem,[object Object],0.875rem,[object Object];--v67bf8b50:#6b7280;--v67bf83ce:#d1d5db;--v67bf878f:#9ca3af;--v67bf92d2:#374151;" data-v-ec58c90e><ul class="my-2 list-outside list-disc" data-v-ec58c90e>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://github.com/tailwindlabs/tailwindcss.com/pull/2388?utm_source=blog.update.sh&amp;utm_medium=content#issuecomment-3717222957" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">feat: add llms.txt endpoint for LLM-optimized documentation by quantizor · Pull Request #2388 · tailwindlabs/tailwindcss.com</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260113110746/https://github.com/tailwindlabs/tailwindcss.com/pull/2388?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Tailwind CSS GitHub에 LLM 최적화 문서를 제공하는 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">/llms.txt</code> 엔드포인트 추가 PR이 제출되었으나 거부됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>제안된 기능: MDX 파일에서 텍스트 추출, JSX 컴포넌트 제거, 코드 블록 보존하여 185개 문서를 빌드 타임에 정적 생성</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Tailwind 팀의 거부 이유</strong>: AI로 인해 문서 트래픽이 2023년 초 대비 약 40% 감소했으며, 문서가 유료 제품을 알리는 유일한 경로인데 LLM 최적화 문서는 이를 더 악화시킬 수 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">심각한 비즈니스 위기 공개</strong>: AI 영향으로 매출이 약 80% 감소했고, PR 거부 전날 엔지니어링 팀의 75%를 해고해야 했음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Tailwind는 그 어느 때보다 인기 있고 빠르게 성장하고 있지만, 사용성 증가와 수익 사이에 상관관계가 없는 상황</li>
<li class="ms-6 text-pretty" data-v-09555c0e>PR 제출자와 커뮤니티 일부는 이 결정이 &quot;OSS 비우호적&quot;이며 오히려 비즈니스에 역효과라고 비판</li>
<li class="ms-6 text-pretty" data-v-09555c0e>현재 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">llms.txt</code>는 제안된 표준일 뿐, OpenAI, Google, Anthropic 등 주요 AI 기업들이 공식적으로 따르고 있지 않음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Tailwind은 스폰서십 프로그램의 일부로 AGENTS.md 파일을 제공하고 있으나, Adam은 이것이 전체 문서와는 다르다고 해명</li>
<li class="ms-6 text-pretty" data-v-09555c0e>커뮤니티 내 격렬한 논쟁 발생: 일부는 Tailwind 팀을 지지하며 비즈니스 지속가능성의 중요성 강조, 일부는 오픈소스 정신 위배라고 비판</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Adam은 장기적으로 LLM 최적화 문서를 추가하고 싶지만, 현재는 비즈니스 지속가능성 확보가 최우선이라며 PR을 종료하고 스레드 잠금</li>
</ul>
</li>
</ul>
</li>
</ul></div>]]></content>
        <author>
            <name>Nesswit</name>
            <email>rishubil+blog@gmail.com</email>
            <uri>https://blog.update.sh/about</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[2026-01-12 주간 URL 모음]]></title>
        <id>https://blog.update.sh/weekly-urls/2026-01-12</id>
        <link href="https://blog.update.sh/weekly-urls/2026-01-12"/>
        <updated>2026-01-11T23:00:00.000Z</updated>
        <content type="html"><![CDATA[<div class="mdx-content leading-[1.6]" style="--v2806f315:0.875rem,[object Object],0.875rem,[object Object];--v67bf8b50:#6b7280;--v67bf83ce:#d1d5db;--v67bf878f:#9ca3af;--v67bf92d2:#374151;" data-v-ec58c90e><ul class="my-2 list-outside list-disc" data-v-ec58c90e>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://tonsky.me/blog/tahoe-icons/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">It’s hard to justify Tahoe icons</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260105134749/https://tonsky.me/blog/tahoe-icons/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46497712&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://lobste.rs/s/2gvk2r?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Lobsters</a> | <a href="https://news.hada.io/topic?id=25590&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GeekNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>macOS Tahoe가 모든 메뉴 항목에 아이콘을 추가했지만, 이는 1992년 Macintosh Human Interface Guidelines의 원칙들을 위반하며 사용성을 오히려 저하시킴</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">아이콘의 핵심 기능은 차별화</strong>인데, 모든 항목에 아이콘을 추가하면 아무것도 돋보이지 않게 되어 오히려 찾기 어려워짐. 흑백 아이콘보다 컬러 아이콘이 더 빠르게 인식됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">앱 간 일관성 부재</strong>: &quot;New&quot;, &quot;Open&quot;, &quot;Save&quot;, &quot;Close&quot;, &quot;Find&quot;, &quot;Delete&quot; 등 기본적인 OS 작업들조차 앱마다 전혀 다른 아이콘을 사용함 (예: &quot;New&quot;만 해도 50가지 이상의 다른 아이콘 존재)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">앱 내부 일관성도 결여</strong>: 같은 앱의 툴바와 메뉴에서 동일한 기능이 서로 다른 아이콘으로 표현되는 경우가 빈번함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">아이콘 재사용 문제</strong>: 동일한 아이콘이 전혀 다른 기능을 나타내는 경우가 많아 사용자를 혼란스럽게 함 (예: 같은 아이콘이 &quot;New&quot;, &quot;Quick Look&quot;, &quot;Import&quot;, &quot;Updates&quot; 등을 의미)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">과도한 뉘앙스</strong>: 미세한 차이(화살표 각도, 선 굵기, 점 크기 등)로 다른 의미를 전달하려 하지만, Apple 스스로도 일관성 없이 적용하여 신뢰할 수 없음</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">지나친 세부 표현</strong>: Tahoe 메뉴 아이콘은 12×12 픽셀(실제 24×24 레티나)로 매우 작은데, 카메라 뷰파인더, 창문의 신호등, 2픽셀 높이의 &#39;i&#39; 글자 등 인식 불가능한 디테일을 포함함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">픽셀 그리드 무시</strong>: 벡터 폰트 사용으로 모든 해상도에서 작동하지만, 작은 크기에서는 흐릿하고 평범하게 보임. 비트맵처럼 픽셀 단위로 세심하게 디자인되지 않음</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">혼란스러운 은유</strong>: 명확한 은유가 없거나 잘못된 은유 사용 (예: 텍스트 선택을 나타내는 아이콘이 실제 선택 모양과 다름), 텍스트 자체를 아이콘으로 사용하여 실제 텍스트와 구분 불가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">불가능한 과제</strong>: 모든 메뉴 항목에 아이콘을 추가하는 것 자체가 실현 불가능한 목표이며, 좋은 은유가 충분하지 않음. HIG의 원칙들은 인간의 인지 방식에 기반하므로 1992년이나 2025년이나 여전히 유효함</li>
</ul>
</li>
</ul>
</li>
</ul></div>]]></content>
        <author>
            <name>Nesswit</name>
            <email>rishubil+blog@gmail.com</email>
            <uri>https://blog.update.sh/about</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[2026-01-05 주간 URL 모음]]></title>
        <id>https://blog.update.sh/weekly-urls/2026-01-05</id>
        <link href="https://blog.update.sh/weekly-urls/2026-01-05"/>
        <updated>2026-01-04T23:00:00.000Z</updated>
        <content type="html"><![CDATA[<div class="mdx-content leading-[1.6]" style="--v2806f315:0.875rem,[object Object],0.875rem,[object Object];--v67bf8b50:#6b7280;--v67bf83ce:#d1d5db;--v67bf878f:#9ca3af;--v67bf92d2:#374151;" data-v-ec58c90e><ul class="my-2 list-outside list-disc" data-v-ec58c90e>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://bigdata.2minutestreaming.com/p/mongobleed-explained-simply?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">MongoBleed explained simply</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260101184526/https://bigdata.2minutestreaming.com/p/mongobleed-explained-simply?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46414475&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://news.hada.io/topic?id=25422&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GeekNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">MongoBleed (CVE-2025-14847)</strong>는 2017년부터 현재까지 거의 모든 MongoDB 버전에 영향을 미치는 치명적인 보안 취약점으로, 공격자가 데이터베이스 힙 메모리에서 임의의 민감한 데이터를 읽을 수 있게 함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>취약점은 MongoDB의 <strong class="font-bold dark:font-extrabold">zlib 메시지 압축 경로</strong>에 있는 버그로, 인증 없이도 데이터베이스 연결만으로 쉽게 악용 가능함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">공격 방법 1부분</strong>: 공격자가 OP_COMPRESSED 메시지의 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">uncompressedSize</code> 필드에 과장된 크기(예: 실제 1KB인데 1MB로 표시)를 보내면, 서버는 큰 버퍼를 할당하지만 실제 압축 해제 후 크기를 검증하지 않아 <strong class="font-bold dark:font-extrabold">초기화되지 않은 힙 메모리(이전 작업의 민감한 데이터 포함 가능)</strong>가 메시지에 포함됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">공격 방법 2부분</strong>: 공격자가 null 종료자(\0)가 없는 잘못된 BSON 객체를 보내면, 서버는 C 문자열 파싱 특성상 힙 메모리를 계속 스캔하다가 민감한 데이터(비밀번호, API 키, 세션 토큰, PII 등)를 포함한 에러 메시지를 응답으로 반환함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>취약점의 <strong class="font-bold dark:font-extrabold">심각성</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Pre-Auth 취약점</strong>: 인증 전 요청 파싱 단계에서 발생하여 누구나 악용 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">8년간 존재</strong>: 2017년 5월 PR 머지 시점부터 취약점 존재</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Shodan에 따르면 <strong class="font-bold dark:font-extrabold">213,000개 이상의 공개 접근 가능한 MongoDB 인스턴스</strong>가 잠재적으로 취약함</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">타임라인</strong>: 2017년 6월 버그 도입 → 2025년 12월 17일 수정 코드 작성 → 12월 19일 CVE 공식 발표 및 MongoDB 8.0.17 패치 릴리스 → 12월 22일 공개 저장소에 수정 코드 머지 → 12월 24일 MongoDB가 Atlas 클라우드 전체 패치 완료 발표</li>
<li class="ms-6 text-pretty" data-v-09555c0e>MongoDB는 12월 24일 기준 악용 증거를 발견하지 못했다고 밝혔으나, <strong class="font-bold dark:font-extrabold">8년간 존재한 단순한 취약점</strong>이라는 점에서 이미 악용되었을 가능성이 높음</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">완화 방법</strong>: 최신 패치로 업데이트하거나 zlib 네트워크 압축을 비활성화하면 됨 (단기 완화책으로 후자도 효과적)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Elastic의 보안 기술 리더가 <strong class="font-bold dark:font-extrabold">&quot;MongoBleed&quot;라는 이름을 붙이고 PoC 스크립트를 공개</strong>하여 주목받음 (Elastic은 Vector Search, Text Search 등에서 MongoDB와 경쟁 관계)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>MongoDB는 CVE 발표 5일 후인 12월 24일에야 커뮤니티 공개를 하는 등 <strong class="font-bold dark:font-extrabold">공개적 대응이 늦고 불투명</strong>했으며, 아직 공식 사과나 명확한 타임라인을 발표하지 않음</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://tkdodo.eu/blog/tooltip-components-should-not-exist?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Tooltip Components Should Not Exist</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260101185824/https://tkdodo.eu/blog/tooltip-components-should-not-exist?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=45979727&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>저자는 웹 앱에서 잘못 구현된 툴팁이 큰 불편 요소이며, 툴팁 구현 시 접근성, 키보드 상호작용, 사용자 예측 가능성, 중요 정보 숨김 방지 등 많은 고려사항이 필요하다고 주장함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">핵심 주장: 디자인 시스템에서 독립적인 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">&lt;Tooltip&gt;</code> 컴포넌트는 존재해서는 안 된다</strong>는 것이 이 글의 주요 논지임</li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">&lt;Tooltip&gt;</code> 컴포넌트는 너무 저수준의 추상화로, 개발자들이 의도대로 사용하지 않을 가능성이 높으며, 문서를 읽는 사람이 적고 AI도 기존 안티패턴을 재생산할 수 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">키보드 상호작용 문제</strong>: Material UI 같은 라이브러리에서도 비상호작용 요소(아이콘, 배지 등)에 툴팁을 추가하면 hover 시에만 표시되고 키보드 포커스로는 접근 불가능한 문제 발생</li>
<li class="ms-6 text-pretty" data-v-09555c0e>React Aria는 비상호작용 요소에 툴팁을 표시하지 않는 방식으로 개선했지만, 여전히 다른 문제들이 존재함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">사용자 예측 가능성 문제</strong>: <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">&lt;Tooltip&gt;</code>이 어떤 요소에나 추가 가능하면, 문장 중간 텍스트에 표시 없이 추가되거나, 반대로 아이콘 버튼에 필요한 설명이 누락되는 등 일관성 없는 사용 사례 발생</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">대안으로 제안하는 패턴 기반 컴포넌트들</strong>:
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">&lt;Button&gt;</code>이나 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">&lt;Link&gt;</code> 같은 상호작용 컴포넌트에 선택적 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">title</code> prop 제공</li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">&lt;IconButton&gt;</code>에는 <strong class="font-bold dark:font-extrabold">필수</strong> <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">title</code> prop을 요구하여 아이콘 설명 강제</li>
<li class="ms-6 text-pretty" data-v-09555c0e>추가 정보 표시용 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">&lt;InfoIcon&gt;</code> 컴포넌트 노출 (물음표/정보 아이콘 + 툴팁, 포커스 가능 보장)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>텍스트에 컨텍스트 추가용 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">&lt;InfoText&gt;</code> 컴포넌트 (점선 밑줄 등으로 시각적 구별, 키보드 상호작용 가능)</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e>저수준 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">&lt;Tooltip&gt;</code> 컴포넌트를 공개하는 대신, <strong class="font-bold dark:font-extrabold">일관된 UX와 접근성을 보장하는 고수준 패턴 컴포넌트들을 제공하는 것이 더 나은 접근법</strong>이라고 강조</li>
<li class="ms-6 text-pretty" data-v-09555c0e>제약이 창의성을 낳으며, 화면 공간 부족으로 툴팁에 정보를 숨기는 대신 근본적인 디자인을 재고하게 만드는 효과도 있음</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://primer.style/accessibility/patterns/accessible-notifications-and-messages/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Accessible notifications and messages</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260101190228/https://primer.style/accessibility/patterns/accessible-notifications-and-messages/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>GitHub의 접근성 높은 알림 및 메시지 전달 방식에 대한 가이드라인 문서</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">보조 기술(Assistive Technology) 알림 가이드라인</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>항상 알림: 위치 변경(페이지 내 사용자 위치 인식), 사용자 작업 실패 결과(유효성 검증 실패, 시스템 장애 등)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>상황에 따라 알림: 사용자 위치나 작업과 무관한 변경 사항(예: 다른 사용자의 이슈 댓글은 방해가 될 수 있지만, GitHub Actions 워크플로우의 로그 스트림은 필수적일 수 있음)</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Toast UI는 심각한 접근성 문제로 인해 사용을 권장하지 않음</strong>—GitHub는 더 효과적이고 접근 가능한 대안 사용을 강력히 권고</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Toast UI의 주요 접근성 문제(WCAG 위반 가능성)
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>시간 조절 불가(2.2.1), 의미 있는 순서 위반(1.3.2), 키보드 접근성(2.1.1), 상태 메시지 전달(4.1.3)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>텍스트 크기 조정(1.4.4), 리플로우(1.4.10), 포커스 순서(2.4.3), 일관된 식별(3.2.4) 등</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Toast UI의 사용성 문제: 큰 디스플레이에서 시야 밖 배치, 주의 분산 시 놓칠 위험, UI 가림, 화면 확대 사용자 미인지, 작업 기억 부담, 배너 맹목 현상, 컨텍스트 단절, 우발적 해제 등</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Toast 대안으로 권장하는 방법</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>단순한 성공 작업: 별도 피드백 불필요(결과가 자명해야 함)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>복잡한 성공 작업: 배너나 단계별 진행 표시로 피드백 제공(자동 해제 없이 지속)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>실패한 작업: 배너(수동적 오류 정보) 또는 다이얼로그(적극적 주의 환기) 사용</li>
<li class="ms-6 text-pretty" data-v-09555c0e>장기 실행 작업: 배너 또는 이메일/알림/앱 푸시 등 다른 채널 활용</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Primer는 폼 유효성 검증, 입력 피드백 등을 위한 robust한 컴포넌트와 가이드를 이미 제공하고 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>GitHub 전체 플랫폼의 일관된 사용자 경험을 유지하기 위해 확립된 접근 가능한 UI 패턴 사용을 강조</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://thunderseethe.dev/posts/wasm-not-webassembly/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Wasm Does not Stand for WebAssembly</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260101190513/https://thunderseethe.dev/posts/wasm-not-webassembly/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46376968&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Wasm(WebAssembly)는 이름과 달리 <strong class="font-bold dark:font-extrabold">웹 기술도 아니고 어셈블리 언어도 아님</strong> - 실제로는 JVM이나 .NET과 유사한 <strong class="font-bold dark:font-extrabold">바이트코드</strong>임</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Wasm은 실제 CPU가 아닌 <strong class="font-bold dark:font-extrabold">가상 머신(VM)에서 실행</strong>되며, 브라우저 특화 기능이 없고 DOM 조작도 불가능함 - 서버, 임베디드 디바이스, 심지어 폰트 내부에서도 실행 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Wasm의 핵심 장점은 <strong class="font-bold dark:font-extrabold">샌드박싱을 통한 보안</strong>으로, 호스트가 명시적으로 노출하지 않는 한 파일시스템, 네트워크 등에 접근 불가능하여 임의 코드 실행 환경에서 안전성 제공</li>
<li class="ms-6 text-pretty" data-v-09555c0e>WebAssembly라는 이름은 2015년경 브라우저에서 JavaScript를 피하고 싶었던 개발자들의 요구에서 시작됨 - asm.js의 한계를 극복하기 위해 브라우저 VM에 직접 접근할 수 있는 통합 인터페이스로 탄생</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Wasm 창시자들은 처음부터 <strong class="font-bold dark:font-extrabold">웹 전용 기술이 아닌 범용 계산 명세</strong>를 목표로 했으며, Andreas Rossberg에 따르면 WebAssembly라는 이름은 경영진의 프로젝트 승인을 받기 위한 전략이었음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Wasm은 <strong class="font-bold dark:font-extrabold">고수준 바이트코드</strong>로 예외, 구조체, 고차 함수 등을 기본 지원하며, 타입화된 연속성(typed continuations) 같은 고급 기능 추가도 논의 중</li>
<li class="ms-6 text-pretty" data-v-09555c0e>LLVM을 통해 C, Swift, Rust 등을 Wasm으로 컴파일할 수 있지만, LLVM의 비구조적 제어 흐름을 Wasm의 구조적 제어 흐름으로 변환하는 Relooper 같은 알고리즘이 필요해 비효율적임</li>
<li class="ms-6 text-pretty" data-v-09555c0e>새로운 컴파일러 개발 시 <strong class="font-bold dark:font-extrabold">LLVM을 거치지 않고 Wasm을 직접 타겟</strong>으로 삼으면 더 효율적 - 특히 가비지 컬렉션 제안이 표준화되면서 백엔드 구현 부담을 크게 줄일 수 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Wasm은 <strong class="font-bold dark:font-extrabold">완전히 형식적으로 명세화</strong>되어 있고 <strong class="font-bold dark:font-extrabold">정적 타입 검사</strong>를 제공하며, 비결정성이 발생하는 지점이 명확히 문서화되어 있어 컴파일러 개발 시 디버깅이 용이함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Wasm 시작을 위한 주요 도구로는 <strong class="font-bold dark:font-extrabold">wasmtime</strong>(런타임), <strong class="font-bold dark:font-extrabold">wasm-encoder</strong>(Rust 크레이트), <strong class="font-bold dark:font-extrabold">binaryen</strong>(컴파일 라이브러리), <strong class="font-bold dark:font-extrabold">wasm-opt</strong>(최적화 CLI), <strong class="font-bold dark:font-extrabold">WebAssembly Binary Toolkit</strong>(wasm2wat, wat2wasm 등) 등이 있음</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://tryolabs.com/blog/top-python-libraries-2025?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Top Python libraries of 2025</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260102190756/https://tryolabs.com/blog/top-python-libraries-2025?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.hada.io/topic?id=25458&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GeekNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>VS Code의 AI 기능을 오픈소스화하는 배경과 유사하게, <strong class="font-bold dark:font-extrabold">2025년은 LLM과 AI 에이전트가 폭발적으로 성장한 해</strong>로, Python 라이브러리 생태계도 이에 맞춰 급격히 확장됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">ty</strong>: Astral(Ruff, uv 개발사)이 Rust로 개발한 초고속 Python 타입 체커로, 함수 레벨 증분 분석(Salsa 기반)을 통해 실시간 IDE 피드백 제공하며 점진적 타이핑 채택을 용이하게 함(현재 프리뷰 단계)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">complexipy</strong>: 인지적 복잡도(cognitive complexity) 메트릭을 사용하는 Rust 기반 코드 분석 도구로, 수학적 복잡도가 아닌 개발자가 실제 체감하는 코드 난이도를 측정하여 리팩토링이 필요한 코드를 식별함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Kreuzberg</strong>: 50개 이상의 파일 형식을 지원하는 Rust 기반 문서 인텔리전스 프레임워크로, Python/TypeScript/Ruby/Go/Rust 등 여러 언어에서 일관된 API 제공 및 OCR, 테이블 감지, 스트리밍 파싱 기능 포함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">LLM 및 에이전트 관련 주요 라이브러리</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">spec-kit (GitHub)</strong>: 명세 기반 개발(Spec-Driven Development) 워크플로우로 AI 에이전트가 구조화된 명세서를 기반으로 코드를 생성하도록 유도</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">deepagents (LangChain)</strong>: 계획 수립, 파일시스템 접근, 서브에이전트 위임 기능을 제공하는 LangGraph 기반 에이전트 하네스</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">smolagents (Hugging Face)</strong>: 약 1,000줄의 투명한 코드로 구성된 에이전트 라이브러리로, 코드 에이전트(JSON 대신 Python 코드로 액션 표현)를 우선 지원하여 30% 적은 단계로 작업 완료</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">LlamaIndex Workflows</strong>: 이벤트 기반 프레임워크로 복잡한 AI 애플리케이션의 제어 흐름(루프, 분기, 병렬 실행)을 단순화하며, 단계(step)와 이벤트(event) 두 가지 기본 요소로 구성</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">문서 및 데이터 처리 도구</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">MarkItDown (Microsoft)</strong>: 다양한 파일 형식(PDF, Word, Excel, 이미지 등)을 LLM이 이해하기 쉬운 Markdown으로 변환하며 문서 구조 보존</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">LangExtract (Google)</strong>: 비정형 텍스트에서 구조화된 데이터를 추출하며, 추출된 모든 엔터티를 원본 텍스트의 정확한 문자 위치로 매핑하여 추적 가능성 제공</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">TOON</strong>: JSON보다 40-60% 토큰을 절약하는 경량 인코딩 형식으로, YAML 스타일 들여쓰기와 CSV 기반 테이블 레이아웃을 결합하여 LLM 워크플로우에 최적화</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">보안 및 품질 관리 도구</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">FastAPI Guard</strong>: IP 화이트리스트/블랙리스트, 속도 제한, SQL 인젝션/XSS 탐지 등 포괄적인 보안 미들웨어를 FastAPI에 직접 통합</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Skylos</strong>: 정적 분석 도구로 사용되지 않는 코드 감지(신뢰도 점수 기반), AI 생성 코드의 보안 취약점 패턴 탐지, VS Code 확장 및 CI/CD 통합 지원</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">개발자 생산성 도구</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">throttled-py</strong>: 5가지 속도 제한 알고리즘(Fixed Window, Sliding Window, Token Bucket, Leaky Bucket, GCRA) 지원, 인메모리 및 Redis 백엔드 제공</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">httptap</strong>: HTTP 요청을 DNS 해결, TCP 연결, TLS 핸드셰이크 등 단계별로 분석하여 터미널 워터폴 시각화, JSON 내보내기, 메트릭 모드 제공</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">modshim</strong>: 서드파티 라이브러리를 포크하거나 몽키 패칭 없이, 가상 병합 모듈을 통해 기존 모듈에 수정사항을 오버레이하는 방식</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e>2025년 Python 라이브러리 생태계는 <strong class="font-bold dark:font-extrabold">LLM/에이전트 도구의 급증</strong>과 <strong class="font-bold dark:font-extrabold">전통적인 개발 도구의 Rust 기반 성능 혁신</strong>이라는 두 가지 트렌드로 요약되며, 투명성, 속도, 실용성을 강조하는 방향으로 진화 중</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://tldr.sh/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">tldr pages</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260102192618/https://tldr.sh/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=22117237&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://news.hada.io/topic?id=1352&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GeekNews</a> | <a href="https://lobste.rs/s/qj69du?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Lobsters</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>tldr pages는 실용적인 예제를 통해 man pages를 단순화하는 커뮤니티 주도 프로젝트</li>
<li class="ms-6 text-pretty" data-v-09555c0e>라이브 데모, PDF 버전 제공 및 다양한 설치 방법 안내</li>
<li class="ms-6 text-pretty" data-v-09555c0e>가장 성숙한 클라이언트는 Python 버전으로, pipx를 통해 간편하게 설치 가능 (<code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">pipx install tldr</code>)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>커뮤니티에서 개발한 다양한 클라이언트들이 존재</li>
<li class="ms-6 text-pretty" data-v-09555c0e>UNIX, Linux, macOS, SunOS, Android, Windows 등 가장 일반적인 명령어에 대한 예제를 지속적으로 확장하는 컬렉션</li>
<li class="ms-6 text-pretty" data-v-09555c0e>프로젝트 저장소의 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">pages/</code> 폴더에서 페이지를 생성하거나 편집하고 pull request를 제출하여 기여 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e>기여 시 Contributing guidelines를 준수해야 함</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://noclip.website/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">noclip</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20260102193348/https://noclip.website/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=37043934&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://news.hada.io/topic?id=25202&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GeekNews</a> | <a href="https://lobste.rs/s/z2xzaw?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Lobsters</a></li>
</ul>
</li>
</ul></div>]]></content>
        <author>
            <name>Nesswit</name>
            <email>rishubil+blog@gmail.com</email>
            <uri>https://blog.update.sh/about</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[2025-12-22 주간 URL 모음]]></title>
        <id>https://blog.update.sh/weekly-urls/2025-12-22</id>
        <link href="https://blog.update.sh/weekly-urls/2025-12-22"/>
        <updated>2025-12-21T23:00:00.000Z</updated>
        <content type="html"><![CDATA[<div class="mdx-content leading-[1.6]" style="--v2806f315:0.875rem,[object Object],0.875rem,[object Object];--v67bf8b50:#6b7280;--v67bf83ce:#d1d5db;--v67bf878f:#9ca3af;--v67bf92d2:#374151;" data-v-ec58c90e><ul class="my-2 list-outside list-disc" data-v-ec58c90e>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://www.reddit.com/r/ClaudeAI/comments/1pgxckk/claude_cli_deleted_my_entire_home_directory_wiped/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">https://www.reddit.com/r/ClaudeAI/comments/1pgxckk/claude_cli_deleted_my_entire_home_directory_wiped/</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20251213142903/https://www.reddit.com/r/ClaudeAI/comments/1pgxckk/claude_cli_deleted_my_entire_home_directory_wiped/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
제목: Claude CLI가 내 전체 홈 디렉토리를 삭제했습니다! 맥 전체가 날아갔어요.
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>한 사용자가 Claude CLI가 macOS에서 전체 홈 디렉토리를 삭제하여 치명적인 데이터 손실이 발생했다고 보고했습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>근본 원인은 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">rm -rf tests/ patches/ plan/ ~/</code> 명령어로 확인되었으며, 이는 홈 디렉토리를 나타내는 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">~/</code> 와일드카드를 잘못 포함한 것이었습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 사건은 AI 도구가 생성하거나 실행하는 명령어를 이해하고 신중하게 검토하는 것이 얼마나 중요한지를 강조합니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>여러 사용자들은 Claude CLI와 같은 AI 도구를 Docker 컨테이너나 VM과 같은 격리된 환경에서 실행하는 것이 중요한 안전 조치라고 제안했습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>AI에게 광범위한 접근 권한을 부여하는 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">--dangerously-skip-permissions</code> 플래그나 유사한 설정의 사용이 주요 위험 요인으로 확인되었습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 사건은 사용자가 적절한 검증 없이 AI의 제안을 맹목적으로 신뢰하고 수용하는 &#39;바이브 코더(vibe coder)&#39; 정신에 대한 논의를 촉발시켰습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>권장되는 모범 사례에는 정기적인 백업 유지(예: Time Machine), 엄격한 권한 제어 구현, 파괴적인 명령어를 차단하는 훅(hook) 사용 등이 포함됩니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 사건은 AI 도구에게 파일 시스템에 대한 무제한 접근 권한을 부여하는 것의 잠재적 위험성에 대한 경고의 교훈이 됩니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>일부 사용자들은 이 상황을 AI 자각(sentience)이나 초기 컴퓨팅 포럼에서 발견되는 고전적인 &#39;홈 디렉토리 삭제&#39; 농담에 유머러스하게 비유했습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 사건은 로컬 시스템과 상호작용할 수 있는 강력한 AI 에이전트를 배포할 때 강력한 안전 메커니즘과 사용자 교육의 필요성을 강조합니다.</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://simonwillison.net/2025/Dec/10/html-tools/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Useful patterns for building HTML tools</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20251216092231/https://simonwillison.net/2025/Dec/10/html-tools/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46223882&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://news.hada.io/topic?id=25078&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GeekNews</a> | <a href="https://lobste.rs/s/ufudxi?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Lobsters</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Simon Willison은 <strong class="font-bold dark:font-extrabold">HTML tools</strong>라는 개념을 제시하며, HTML/JavaScript/CSS를 단일 파일로 결합한 웹 애플리케이션을 150개 이상 개발했으며, 대부분 LLM으로 작성됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>HTML tools의 핵심 특징
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">단일 파일 구조</strong>: HTML 파일 하나에 JavaScript와 CSS를 인라인으로 포함하여 호스팅과 배포가 용이하고 LLM 응답에서 복사/붙여넣기가 쉬움</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">React 및 빌드 단계 배제</strong>: JSX 빌드 과정이 없어 편의성이 크게 향상되며, 프롬프트에 &quot;no react&quot; 명시</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">CDN에서 의존성 로드</strong>: cdnjs, jsdelivr 등을 통해 필요한 라이브러리 로드</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">작은 크기 유지</strong>: 수백 줄 수준으로 유지하여 LLM이 쉽게 이해하고 재작성 가능</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Claude Artifacts, ChatGPT/Gemini Canvas</strong>를 사용한 프로토타이핑 및 <strong class="font-bold dark:font-extrabold">Claude Code, Codex CLI</strong> 같은 코딩 에이전트로 복잡한 프로젝트 전환 권장</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">GitHub Pages를 통한 자체 호스팅</strong> 선호: LLM 플랫폼의 샌드박스 제약, 불안정성, 광고 등을 피하고, 빌드 단계 없이 간단히 복사/붙여넣기로 배포 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">복사/붙여넣기 활용</strong>: 클립보드 API를 적극 활용하여 입력 받고 변환된 결과를 클립보드로 복사하는 패턴 사용 (모바일에서는 &quot;Copy to clipboard&quot; 버튼 제공)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">상태 관리 전략</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">URL에 상태 저장</strong>: 북마크/공유 가능한 도구 구축 (예: icon-editor)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">localStorage 활용</strong>: API 키 같은 민감 정보나 대용량 상태 저장 (서버 로그에 노출되지 않음)</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">CORS 지원 API 수집</strong>: iNaturalist, PyPI, GitHub, Bluesky, Mastodon 등 CORS 헤더를 제공하는 공개 API를 활용하여 서버 없이 외부 데이터 접근</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">파일 처리</strong>: <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">&lt;input type=&quot;file&quot;&gt;</code>로 서버 업로드 없이 브라우저에서 직접 파일 열기/처리 가능하며, JavaScript로 다운로드 가능한 파일도 생성 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Pyodide/WebAssembly 활용</strong>: Python을 브라우저에서 실행(Pyodide)하거나 다른 언어로 작성된 소프트웨어를 WebAssembly로 포팅하여 HTML tools에 통합 (예: OCR, SQLite)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">기존 도구 리믹스 및 프롬프트/트랜스크립트 기록</strong>: 100개 이상의 도구 컬렉션을 LLM 컨텍스트로 제공해 재조합하고, 모든 개발 과정의 트랜스크립트를 공개하여 학습 및 재현 가능성 확보</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://github.com/EmilStenstrom/justhtml?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GitHub - EmilStenstrom/justhtml: A pure Python HTML5 parser that just works. No C extensions to compile. No system dependencies to install. No complex API to learn.</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20251216092537/https://github.com/EmilStenstrom/justhtml?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46124443&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>JustHTML은 <strong class="font-bold dark:font-extrabold">순수 Python으로 작성된 HTML5 파서</strong>로, C 확장 컴파일이나 시스템 의존성 설치 없이 간단하게 사용 가능함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">WHATWG HTML5 명세를 정확히 구현</strong>하여 브라우저가 파싱할 수 있는 모든 HTML을 처리하며, 브라우저가 사용하는 복잡한 오류 처리 규칙을 완벽히 지원함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">검증된 준수성</strong>: 공식 html5lib-tests 스위트의 9,000개 이상 테스트를 모두 통과했으며, 100% 코드 커버리지와 600만 개의 무작위 HTML 문서로 퍼즈 테스트를 완료함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">제로 의존성 라이브러리</strong>로 PyPy, WASM(Pyodide) 등 Python이 실행되는 모든 환경에서 작동하며, 의존성 업그레이드 부담이 없음</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">디버깅 용이성</strong>: 순수 Python 코드로 작성되어 디버거로 파싱 과정을 단계별로 추적할 수 있으며, lxml이나 etree 대신 <strong class="font-bold dark:font-extrabold">일반 Python 객체</strong>를 반환하여 API 학습이 간단함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">CSS 선택자 지원</strong>: <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">query()</code> 메서드 하나로 익숙한 CSS 문법을 사용하여 요소를 검색 가능 (예: <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">doc.query(&quot;div.container &gt; p.intro&quot;)</code>)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">성능</strong>: C/Rust 파서보다는 느리지만(10-20배), Wikipedia 홈페이지를 ~0.1초에 파싱할 정도로 충분히 빠르며, 순수 Python 파서 중 가장 빠름 (<code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">html5lib</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">BeautifulSoup</code>보다 우수)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">준수성 비교</strong>: JustHTML은 100% HTML5 준수율을 보이는 반면, html5lib 88%, html5_parser 84%, BeautifulSoup 4%, lxml 1% 수준임</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">설치 및 사용</strong>: Python 3.10 이상에서 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">pip install justhtml</code>로 설치 가능하며, CLI 도구로 HTML 파싱, CSS 선택자 필터링, 텍스트/마크다운/HTML 형식 출력 지원</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">프로젝트 기원</strong>: Mozilla Servo 브라우저 엔진의 html5ever를 Python으로 포팅한 것에서 시작했으며, MIT 라이선스로 상업적/비상업적 사용 모두 자유로움</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://portalvr.io/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">PortalVR | VR on your desktop</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20251003002239/https://portalvr.io/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=45456003&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>PortalVR은 헤드셋을 착용하지 않고 VR 게임을 즐길 수 있게 해주는 수정된 Monado OpenXR 런타임</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Quest를 USB로 PC에 연결하여 책상 위에 놓고, 컨트롤러만 사용하면서 화면을 보며 플레이하는 방식</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">필요 장비</strong>: Windows PC와 개발자 모드가 활성화된 Meta Quest (USB 연결)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">모든 SteamVR 콘텐츠</strong>와 호환되며, WebXR 콘텐츠도 브라우저에서 사용 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">3D 입체 시청 지원</strong>: 적록 안경을 통한 아나글리프 방식 또는 Samsung Odyssey 3D 같은 안경 없는 3D 디스플레이 사용 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e>무료 버전은 워터마크가 있고 개인용 비상업적 용도로 제한되며, 유료 버전은 워터마크 제거 및 상업적 사용 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">시점 조작</strong>: 컨트롤러 조이스틱으로 머리 회전 제어, 웹캠이 있으면 얼굴 추적으로 몸을 기울이거나 숙이는 동작 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">주요 사용 사례</strong>: 편안한 데스크 환경에서 VR 게임 플레이, 개발자의 빠른 빌드 테스트, 콘텐츠 제작자의 VR 영상 녹화</li>
<li class="ms-6 text-pretty" data-v-09555c0e>제작자는 두 어린 아들이 안전하게 VR을 즐길 수 있도록 하기 위해 시작했으며, 현재 아이들은 Beat Saber에 중독됨</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://www.tomshardware.com/tech-industry/cyber-security/north-korean-infiltrator-caught-working-in-amazon-it-department-thanks-to-lag-110ms-keystroke-input-raises-red-flags-over-true-location?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">North Korean infiltrator caught working in Amazon IT department thanks to lag — 110ms keystroke input raises red flags over true location</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20251220165828/https://www.tomshardware.com/tech-industry/cyber-security/north-korean-infiltrator-caught-working-in-amazon-it-department-thanks-to-lag-110ms-keystroke-input-raises-red-flags-over-true-location?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46318494&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Amazon은 키보드 입력 지연(110ms 이상)을 단서로 북한 침투자가 미국 시스템 관리자로 위장 근무하던 사실을 적발함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>일반적으로 미국 내 원격 근무자의 키 입력 지연은 수십 밀리초 수준이지만, 해당 인물은 원격으로 애리조나에 위치한 Amazon 노트북을 조종하고 있었음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Amazon의 Stephen Schmidt 최고보안책임자에 따르면, 2024년 4월 이후 <strong class="font-bold dark:font-extrabold">1,800건 이상의 북한 침투 시도를 차단</strong>했으며, 분기별로 27% 증가 추세임</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Amazon은 <strong class="font-bold dark:font-extrabold">적극적으로 북한 침투자를 탐지하는 정책</strong>을 운영 중이며, &quot;찾으려 하지 않으면 발견할 수 없다&quot;고 강조함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>북한은 이러한 침투 활동을 통해 외화 획득, 간첩 활동, 사회 교란 등을 시도하는 것으로 알려짐</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이번 사건에서 북한 위장 근무자를 돕던 미국 여성이 올해 초 수년간의 징역형을 선고받음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>보안 전문가들은 <strong class="font-bold dark:font-extrabold">컴퓨터 네트워크 이상 징후 외에도 미국식 관용구와 영어 표현의 서툰 사용</strong>이 침투자를 판별하는 단서가 된다고 지적함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>북한뿐 아니라 이란, 러시아, 중국 등 적대국의 미국 기업 침투 시도가 계속되고 있어 빙산의 일각으로 평가됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>일부 전문가들은 Amazon이 적발 방법을 공개한 것이 북한의 우회 전략 개발을 도울 수 있다고 우려함</li>
</ul>
</li>
</ul>
</li>
</ul></div>]]></content>
        <author>
            <name>Nesswit</name>
            <email>rishubil+blog@gmail.com</email>
            <uri>https://blog.update.sh/about</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[2025-12-15 주간 URL 모음]]></title>
        <id>https://blog.update.sh/weekly-urls/2025-12-15</id>
        <link href="https://blog.update.sh/weekly-urls/2025-12-15"/>
        <updated>2025-12-14T23:00:00.000Z</updated>
        <content type="html"><![CDATA[<div class="mdx-content leading-[1.6]" style="--v2806f315:0.875rem,[object Object],0.875rem,[object Object];--v67bf8b50:#6b7280;--v67bf83ce:#d1d5db;--v67bf878f:#9ca3af;--v67bf92d2:#374151;" data-v-ec58c90e><ul class="my-2 list-outside list-disc" data-v-ec58c90e>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://www.rockpapershotgun.com/in-true-roguelike-fashion-slay-the-spire-2-is-only-being-made-because-of-a-5050-coin-flip?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">In true roguelike fashion, Slay the Spire 2 is only being made because of a 50/50 coin flip</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20251210061829/https://www.rockpapershotgun.com/in-true-roguelike-fashion-slay-the-spire-2-is-only-being-made-because-of-a-5050-coin-flip?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Slay the Spire 2의 개발 여부가 <strong class="font-bold dark:font-extrabold">동전 던지기로 결정</strong>되었다는 사실이 밝혀짐</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Mega Crit의 공동 창립자 Anthony Giovannetti가 PC Gamer 인터뷰에서 이 사실을 공개</li>
<li class="ms-6 text-pretty" data-v-09555c0e>코로나 시기에 Giovannetti와 Casey Yano는 여러 작은 프로토타입 프로젝트를 진행하다가 다음 본격적인 프로젝트를 찾고 있었음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>두 가지 개발 방향이 있었음: <strong class="font-bold dark:font-extrabold">완전히 다른 새 프로젝트</strong> vs <strong class="font-bold dark:font-extrabold">Slay the Spire 속편</strong></li>
<li class="ms-6 text-pretty" data-v-09555c0e>Giovannetti는 속편 개발에 흥미로운 디자인 과제가 있다고 생각했지만, 최종 결정을 위해 <strong class="font-bold dark:font-extrabold">동전 던지기를 실행</strong>함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>동전 던지기는 Yano가 Discord 통화 중에 했으며, Slay the Spire 2가 선택됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Giovannetti는 결과가 진실이라고 믿으며, Casey는 카드 게임보다 액션 게임을 선호했기 때문에 반대 결과를 원했을 것이라고 언급</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 에피소드는 Slay the Spire 제작자들이 자신들이 만드는 게임(로그라이크, 확률 기반)의 본질인 <strong class="font-bold dark:font-extrabold">운과 우연</strong>을 실제 개발 결정에도 적용한 아이러니한 사례</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Slay the Spire 2는 <strong class="font-bold dark:font-extrabold">2026년 3월의 &quot;비밀스러운 목요일&quot;에 얼리 액세스로 출시</strong> 예정</li>
<li class="ms-6 text-pretty" data-v-09555c0e>현재 Steam에서 위시리스트 등록 가능</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://www.euronews.com/health/2025/12/10/chemical-in-dark-chocolate-may-help-slow-ageing-new-study-finds?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Could dark chocolate be the key to slower ageing? New study weighs in</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20251214055723/https://www.euronews.com/health/2025/12/10/chemical-in-dark-chocolate-may-help-slow-ageing-new-study-finds?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>다크 초콜릿에 함유된 화학 물질인 <strong class="font-bold dark:font-extrabold">테오브로민(Theobromine)이 생물학적 노화를 늦추는 효과</strong>가 있을 수 있다는 새로운 연구 결과가 발표됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>연구는 학술지 Aging에 게재되었으며, 카카오 콩에서 추출되는 식물 화합물인 테오브로민이 생물학적 노화를 지연시킬 수 있다고 밝힘</li>
<li class="ms-6 text-pretty" data-v-09555c0e>킹스 칼리지 런던의 Jordana Bell 교수는 &quot;다크 초콜릿의 핵심 성분과 더 오래 젊음을 유지하는 것 사이의 연관성을 발견했다&quot;고 설명함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>영국 509명과 독일 1,160명의 참가자를 대상으로 한 연구에서, <strong class="font-bold dark:font-extrabold">혈액 내 테오브로민 수치가 높은 사람들의 생물학적 나이가 실제 나이보다 낮게 나타남</strong></li>
<li class="ms-6 text-pretty" data-v-09555c0e>생물학적 나이는 건강 상태와 기능을 기반으로 평가되며, 세포, 조직, 장기의 손상 정도를 반영하고 생활습관, 환경, 유전적 요인의 영향을 받음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>연구진은 DNA의 메틸화 패턴 변화와 염색체 끝의 텔로미어 길이를 측정하여 참가자들의 생물학적 나이를 판단함 (짧은 텔로미어는 노화 및 노화 관련 질병과 연관됨)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>다크 초콜릿은 이전에도 심장 건강 등 여러 건강상 이점과 연관되어 왔으나, <strong class="font-bold dark:font-extrabold">테오브로민과 노화 간의 연관성을 완전히 이해하기 위해서는 추가 연구가 필요</strong>함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>옥스퍼드 대학의 Dimitrios Koutoukidis 교수는 연구가 흥미로운 연관성을 보여주지만, 초콜릿 섭취량 변화에 따른 테오브로민 수치 변화와 건강 영향은 밝히지 못했다고 지적함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Koutoukidis 교수는 초콜릿의 당분과 지방을 고려하면 건강상 효과가 상쇄될 수 있으므로, <strong class="font-bold dark:font-extrabold">소량씩 가끔 즐기는 것을 권장</strong>함</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://react.dev/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Denial of Service and Source Code Exposure in React Server Components – React</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://news.ycombinator.com/item?id=46236924&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://news.hada.io/topic?id=25030&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GeekNews</a> | <a href="https://lobste.rs/s/et5j8u?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Lobsters</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>React 팀이 React Server Components에서 발견된 <strong class="font-bold dark:font-extrabold">2개의 새로운 보안 취약점</strong>을 공개함 (2025년 12월 11일)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이번 취약점은 지난주 발표된 중요 취약점(React2Shell)의 패치를 악용하려는 시도 중 보안 연구자들이 발견했으며, <strong class="font-bold dark:font-extrabold">원격 코드 실행(RCE)은 불가능함</strong></li>
<li class="ms-6 text-pretty" data-v-09555c0e>새로 공개된 취약점
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">서비스 거부(DoS) - 높은 심각도</strong>: CVE-2025-55184, CVE-2025-67779 (CVSS 7.5) - 악의적인 HTTP 요청으로 서버 프로세스를 무한 루프에 빠뜨려 CPU를 소비시킬 수 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">소스 코드 노출 - 중간 심각도</strong>: CVE-2025-55183 (CVSS 5.3) - Server Function의 소스 코드가 노출될 수 있으며, 민감한 정보(예: 데이터베이스 연결 키)가 유출될 위험 있음</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">즉시 업그레이드 필요</strong>: React 19.0.0~19.2.2 버전의 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">react-server-dom-webpack</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">react-server-dom-parcel</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">react-server-dom-turbopack</code> 패키지가 영향을 받음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>수정 버전은 <strong class="font-bold dark:font-extrabold">19.0.3, 19.1.4, 19.2.3</strong>으로 백포트되었으며, 해당 패키지 사용자는 즉시 업그레이드 필요</li>
<li class="ms-6 text-pretty" data-v-09555c0e>영향을 받는 프레임워크/번들러: next, react-router, waku, @parcel/rsc, @vite/rsc-plugin, rwsdk</li>
<li class="ms-6 text-pretty" data-v-09555c0e>React Native 사용자는 monorepo에서 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">react-dom</code> 사용 시에만 영향받는 패키지만 업데이트하면 되며, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">react</code>와 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">react-dom</code>은 업데이트하지 않아도 됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>일부 호스팅 제공업체가 임시 완화 조치를 적용했으나, <strong class="font-bold dark:font-extrabold">이에 의존하지 말고 즉시 업데이트 권장</strong></li>
<li class="ms-6 text-pretty" data-v-09555c0e>보안 연구자 Andrew MacPherson, RyotaK, Shinsaku Nomura에게 감사 표명</li>
</ul>
</li>
</ul>
</li>
</ul></div>]]></content>
        <author>
            <name>Nesswit</name>
            <email>rishubil+blog@gmail.com</email>
            <uri>https://blog.update.sh/about</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[2025-12-08 주간 URL 모음]]></title>
        <id>https://blog.update.sh/weekly-urls/2025-12-08</id>
        <link href="https://blog.update.sh/weekly-urls/2025-12-08"/>
        <updated>2025-12-07T23:00:00.000Z</updated>
        <content type="html"><![CDATA[<div class="mdx-content leading-[1.6]" style="--v2806f315:0.875rem,[object Object],0.875rem,[object Object];--v67bf8b50:#6b7280;--v67bf83ce:#d1d5db;--v67bf878f:#9ca3af;--v67bf92d2:#374151;" data-v-ec58c90e><ul class="my-2 list-outside list-disc" data-v-ec58c90e>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://maily.so/pepper.note/posts/32z84k21rn4?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">소주병뚜껑을 아무나 못 만드는 이유</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20251201043203/https://maily.so/pepper.note/posts/32z84k21rn4?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>한국에서 소주병뚜껑(참이슬, 처음처럼 등 초록색 소주병)을 생산할 수 있는 업체는 <strong class="font-bold dark:font-extrabold">&#39;삼화왕관&#39;과 &#39;세왕금속공업&#39; 단 두 곳</strong>뿐임</li>
<li class="ms-6 text-pretty" data-v-09555c0e>소주 1병(1,380원)에 세금이 617.1원으로 세금 비중이 매우 크며, 연간 조 단위의 세금이 징수됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>국세청은 주류업체의 세금 탈루를 막기 위해 <strong class="font-bold dark:font-extrabold">1972년 &#39;납세 병마개&#39; 제도를 도입</strong>함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 제도는 주류 제조업체의 술 생산량과 병뚜껑 제조업체의 병뚜껑 생산량을 비교하여 탈루를 방지하는 구조</li>
<li class="ms-6 text-pretty" data-v-09555c0e>프랜차이즈 본사가 가맹점 수익 파악을 위해 원두·컵 등을 공급하는 것과 유사한 원리로, 국세청이 병뚜껑 판매량으로 소주 판매량을 추정함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">1972년 삼화왕관이 최초 지정</strong>되었고, <strong class="font-bold dark:font-extrabold">1985년 세왕금속공업이 추가</strong>된 이후 40년간 새로운 업체는 단 한 곳도 지정받지 못함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 제도로 인해 다른 병마개 제조업체들은 기술력이 있어도 주류 시장 진입이 불가능함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>1997년 이 제도가 헌법에 위배된다며 헌법소원이 제기되었으나(특정 업체 독점권 부여가 다른 기업 활동을 부당 제한), 헌법재판소는 각하함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>두 업체는 수백억 원 규모의 시장을 법적 보호 아래 독식하며 안정적인 수익을 올리고 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>삼화왕관과 세왕금속공업의 경영진·주요 임원 자리를 <strong class="font-bold dark:font-extrabold">대대로 국세청 출신 인사들이 차지</strong>해왔다는 지적이 존재함</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://investors.micron.com/news-releases/news-release-details/micron-announces-exit-crucial-consumer-business?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Micron Announces Exit from Crucial Consumer Business | Micron Technology</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20251205070506/https://investors.micron.com/news-releases/news-release-details/micron-announces-exit-crucial-consumer-business?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46137783&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://news.hada.io/topic?id=24827&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GeekNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Micron Technology는 Crucial 소비자 사업에서 철수합니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>회사는 2026 회계연도 2분기 말(2026년 2월)까지 Crucial 소비자 제품의 출하를 계속할 예정입니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Micron은 Crucial 제품에 대한 지속적인 보증 서비스와 지원을 제공할 것입니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>소비자 사업 철수 결정은 데이터 센터의 AI에 의해 주도되는 더 빠르게 성장하는 부문의 대규모 전략적 고객들을 위한 공급 및 지원을 개선하기 위한 것입니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Micron은 상업용 채널 고객들에게 Micron 브랜드의 엔터프라이즈 제품 판매를 계속할 것입니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이러한 움직임은 Micron의 포트폴리오 변혁 및 수익성 있는 성장 부문과의 정렬의 일환입니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>핵심 엔터프라이즈 및 상업용 부문에 집중함으로써 Micron은 장기적인 사업 성과와 이해관계자 가치를 향상시키는 것을 목표로 합니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Micron은 영향을 받는 팀원들을 회사 내 기존 공석으로 재배치할 계획입니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Crucial 브랜드는 29년 동안 Micron 역사의 중요한 부분이었습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Micron Technology는 AI 및 컴퓨팅 집약적 애플리케이션을 포함한 다양한 시장에 서비스를 제공하는 혁신적인 메모리 및 스토리지 솔루션의 선두주자입니다.</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://github.com/vercel/next.js/security/advisories/GHSA-9qr9-h5gf-34mp?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">RCE in React Server Components</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20251205070904/https://github.com/vercel/next.js/security/advisories/GHSA-9qr9-h5gf-34mp?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46136026&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://news.hada.io/topic?id=24826&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GeekNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>특정 React 패키지에서 보안 취약점이 발견됨 (CVE-2025-5518로 추적)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">영향받는 버전</strong>: React 19.0.0, 19.1.0, 19.1.1, 19.2.0 및 해당 패키지를 사용하는 Next.js 15.x, 16.x (App Router 사용 시)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">영향받는 React 패키지</strong>: react-server-dom-parcel, react-server-dom-turbopack, react-server-dom-webpack</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">React 패치 버전</strong>: 19.0.1, 19.1.2, 19.2.1</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Next.js 패치 버전</strong>: 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7, 16.0.7</li>
<li class="ms-6 text-pretty" data-v-09555c0e>실험적 canary 릴리스 14.3.0-canary.77부터도 취약점의 영향을 받음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>14.3 canary 빌드 사용자는 14.x 안정 버전 또는 14.3.0-canary.76으로 다운그레이드 필요</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Next.js 15.x 또는 16.x 안정 버전 사용자는 즉시 패치된 안정 버전으로 업그레이드해야 함</strong></li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://lyra.horse/blog/2025/12/svg-clickjacking/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">SVG Filters - Clickjacking 2.0</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20251207162841/https://lyra.horse/blog/2025/12/svg-clickjacking/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46155085&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://news.hada.io/topic?id=24877&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GeekNews</a> | <a href="https://lobste.rs/s/omnyrf?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Lobsters</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>SVG 필터를 사용한 새로운 클릭재킹 기법 &quot;SVG clickjacking&quot;을 발견하여 복잡한 다단계 공격과 데이터 유출이 가능해짐</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Apple의 Liquid Glass 디자인을 CSS/SVG로 재현하던 중 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">feColorMatrix</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">feDisplacementMap</code> 등 SVG 필터가 cross-origin iframe에서도 작동한다는 사실을 발견</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">공격 기법의 핵심 구성 요소</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">feDisplacementMap</code>을 이용한 가짜 CAPTCHA 생성으로 사용자가 민감한 코드를 재입력하도록 유도</li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">feComposite</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">feMorphology</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">feColorMatrix</code> 등을 조합하여 텍스트 입력창의 회색 placeholder 텍스트를 숨기고 검은 텍스트만 표시</li>
<li class="ms-6 text-pretty" data-v-09555c0e>픽셀 색상 정보를 읽어내어 버튼 클릭, 체크박스 상태 등을 감지하고 이에 반응하는 UI 생성</li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">feBlend</code>와 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">feComposite</code>로 모든 논리 게이트(NOT, AND, OR, XOR 등)를 구현하여 SVG 필터가 기능적으로 완전(functionally complete)해짐</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e>SVG 필터 내에서 복잡한 로직 프로그래밍이 가능하여 <strong class="font-bold dark:font-extrabold">다단계 클릭재킹 공격에서 조건부 분기, 상태 감지, 인터랙티브한 가짜 UI를 구현</strong> 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Google Docs를 대상으로 한 실제 공격 데모 성공 - 버튼 클릭, CAPTCHA 입력, 텍스트박스 포커스 상태 감지, 아이템 추가 감지 등 여러 단계를 거치는 복잡한 공격을 구현하여 Google VRP에서 $3,133.70 보상 획득</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">QR 코드 생성 공격</strong> - SVG 필터 내에서 Reed-Solomon 오류 정정을 구현하여 iframe에서 추출한 데이터를 QR 코드로 인코딩하고, 사용자가 이를 스캔하도록 유도하여 데이터 유출 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e>기존 클릭재킹 연구들은 SVG 필터를 요소 숨김 용도로만 언급했으며, SVG 필터 타이밍 공격은 현대 브라우저에서 완화됨 - 이 기법은 완전히 새로운 공격 벡터</li>
<li class="ms-6 text-pretty" data-v-09555c0e>SVG 필터는 constant-time으로 구현되어 픽셀 데이터를 외부로 추출할 수 없지만, 필터 내부에서 로직을 실행하고 시각적 출력을 제공하여 복잡한 공격 시나리오 구현 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e>39c3와 Disobey 2026 컨퍼런스에서 CSS/SVG 관련 보안 토크 예정</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://www.ytn.co.kr/_ln/0134_202511281002243559?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">15분만 누워있으면 끝...샤워부터 건조까지 해주는 &#39;인간 세탁기&#39; [지금이뉴스]</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20251207200600/https://www.ytn.co.kr/_ln/0134_202511281002243559?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>야마다홀딩스가 누워서 15분 만에 샤워부터 건조까지 자동으로 완료되는 <strong class="font-bold dark:font-extrabold">&#39;미라이 인간 세탁기&#39;</strong>를 출시 예정</li>
<li class="ms-6 text-pretty" data-v-09555c0e>판매가는 <strong class="font-bold dark:font-extrabold">6000만 엔(약 5억 6500만 원)</strong>으로 책정됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>1970년 오사카 박람회에서 처음 공개됐으나 상품화되지 못했다가, 2025년 4월 오사카간사이 엑스포에서 큰 관심을 받아 판매가 결정됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>도쿄 도시마구 &#39;LABI 이케부쿠로 본점&#39;에서 다음 달 25일부터 전시 및 고객 체험 공간 운영 예정</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">길이 2.3m 캡슐 안에 누워 미세 거품을 이용</strong>해 세정·헹굼·건조 과정이 자동으로 진행됨(전체 소요 시간 15분)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>목욕 중 등 부위 센서가 건강 상태를 측정하고, 영상과 음악도 제공하는 부가 기능 탑재</li>
<li class="ms-6 text-pretty" data-v-09555c0e>현재 <strong class="font-bold dark:font-extrabold">체험 신청이 4만 건을 넘었으며</strong>, 정식 판매일은 아직 미정</li>
</ul>
</li>
</ul>
</li>
</ul></div>]]></content>
        <author>
            <name>Nesswit</name>
            <email>rishubil+blog@gmail.com</email>
            <uri>https://blog.update.sh/about</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[2025-12-01 주간 URL 모음]]></title>
        <id>https://blog.update.sh/weekly-urls/2025-12-01</id>
        <link href="https://blog.update.sh/weekly-urls/2025-12-01"/>
        <updated>2025-11-30T23:00:00.000Z</updated>
        <content type="html"><![CDATA[<div class="mdx-content leading-[1.6]" style="--v2806f315:0.875rem,[object Object],0.875rem,[object Object];--v67bf8b50:#6b7280;--v67bf83ce:#d1d5db;--v67bf878f:#9ca3af;--v67bf92d2:#374151;" data-v-ec58c90e><ul class="my-2 list-outside list-disc" data-v-ec58c90e>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://inventwithpython.com/blog/sweigarts-law-of-pep-8-complaints.html?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Python Violates PEP 8</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20251124152503/https://inventwithpython.com/blog/sweigarts-law-of-pep-8-complaints.html?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=45507766&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Sweigart&#39;s Law of PEP 8 Complaints</strong>: PEP 8 위반에 대한 불만은 <strong class="font-bold dark:font-extrabold">항상</strong> camelCase 대신 snake_case를 사용하지 않았다는 것이며, PEP 8의 다른 부분에 대한 불만은 <strong class="font-bold dark:font-extrabold">결코</strong> 없다는 법칙</li>
<li class="ms-6 text-pretty" data-v-09555c0e>PEP 8은 Python 코드 작성을 위한 스타일 가이드이지만, 가장 중요한 부분은 &quot;A Foolish Consistency is the Hobgoblin of Little Minds&quot; 섹션으로, <strong class="font-bold dark:font-extrabold">프로젝트 내 일관성이 PEP 8 준수보다 더 중요</strong>하며 때로는 PEP 8을 위반해도 괜찮다고 명시함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>&quot;코드는 작성되는 것보다 읽히는 경우가 더 많다&quot;는 통찰에 따라 코드 가독성이 중요하지만, <strong class="font-bold dark:font-extrabold">컴퓨터는 스타일을 신경 쓰지 않으며</strong> 프로그램이 정상 작동하는 데 필수적이지 않음</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Bike Shedding(자전거 창고 논쟁)</strong>: 소프트웨어 개발자들이 복잡한 기술 문제보다 이해하기 쉬운 사소한 코드 스타일 문제에 과도하게 집중하는 경향이 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>저자는 camelCase를 선호하지만, 책 &quot;Automate the Boring Stuff with Python&quot;의 가장 흔한 불만이 &quot;PEP 8을 따르지 않는다&quot;였으며, 3판에서 snake_case로 변경한 후 이러한 불만이 사라짐(다른 PEP 8 위반 사항은 여전히 존재하지만 지적받지 않음)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>코드 스타일 가이드의 목적은 <strong class="font-bold dark:font-extrabold">논쟁을 방지</strong>하고 일관성 있는 규칙을 제공하는 것이며, Black이나 Ruff 같은 코드 포맷팅 도구로 강제할 수 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>스타일 가이드에 대한 호소는 종종 <strong class="font-bold dark:font-extrabold">불평하는 사람의 개인적 선호를 선택적으로 강요</strong>하는 것에 불과함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>PEP 8 불만에 대처하는 저자의 조언
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>무시하거나, 코드 포맷팅 도구 설정을 요구하거나, 하위 호환성 문제를 언급하거나, 최소한의 변경(snake_case로만 변경)을 수용하는 등의 방법 제시</li>
<li class="ms-6 text-pretty" data-v-09555c0e>낮은 노력으로 프로젝트에 기여자 타이틀을 얻으려는 시도를 걸러내기 위한 실용적 접근</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Python 자체도 PEP 8을 위반함</strong>: <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">math.pi</code>(ALL_CAPS 아님), <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">unittest.setUp()</code>(camelCase 사용), <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">int</code>/<code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">str</code>(대문자 시작 안 함), <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">re.IGNORECASE</code>(단어 구분 없음) 등 수많은 예시가 존재하며, 역사적 이유로 &quot;수정&quot;하는 것은 비용 대비 효과가 없음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>소프트웨어 개발은 기술적 작업만큼이나 <strong class="font-bold dark:font-extrabold">사회적 작업</strong>이며, 코드 스타일 논쟁은 생산성을 저해하는 불필요한 장애물이 될 수 있으므로 코드 포맷팅 도구에 맡기는 것이 최선의 해결책</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://www.yna.co.kr/view/AKR20251126129551017?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">네이버, 두나무 인수…20조원 규모 &#39;핀테크 공룡&#39; 탄생(종합) | 연합뉴스</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://archive.md/2TlJq?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>네이버가 두나무를 인수하여 <strong class="font-bold dark:font-extrabold">세계 최초로 가상자산 사업을 동시에 영위하는 글로벌 플랫폼 기업</strong>이 됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>네이버파이낸셜과 두나무가 각각 이사회를 열고 포괄적 주식 교환 안건을 의결하여, <strong class="font-bold dark:font-extrabold">두나무는 네이버파이낸셜의 자회사이자 네이버의 손자회사</strong>가 됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>주식교환 비율은 1대 2.54(두나무 1주를 네이버파이낸셜 2.54주로 교환)이며, <strong class="font-bold dark:font-extrabold">기업가치 20조원 규모의 초대형 금융플랫폼</strong>이 탄생함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이번 합병의 배경은 네이버가 AI 분야에서 글로벌 빅테크의 후발주자이며 광고·커머스 사업의 한정적 확장성에 직면하면서 <strong class="font-bold dark:font-extrabold">새로운 활로를 모색</strong>한 것으로 분석됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>두나무 블록체인 플랫폼(기와체인)에서 <strong class="font-bold dark:font-extrabold">원화 스테이블코인을 발행하고 네이버페이에서 결제수단으로 사용</strong>하는 방안이 거론됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>스테이블코인을 담보로 예치금 운용수익 창출, 대출 서비스 제공 등 <strong class="font-bold dark:font-extrabold">네이버가 디지털 금융 플랫폼으로 도약할 발판</strong>이 마련됐다는 평가</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이해진 의장 복귀 이후 글로벌 진출과 AI 사업에 적극적으로 투자해왔으며, <strong class="font-bold dark:font-extrabold">라쿠텐의 가상자산 거래소 인수 성공 사례</strong>가 이번 합병의 참고가 됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>두나무의 블록체인 기술과 네이버 생성형 AI 서비스 결합으로 <strong class="font-bold dark:font-extrabold">AI가 스스로 거래·정산을 수행하는 온체인 에이전트 구현</strong> 가능성 제기</li>
<li class="ms-6 text-pretty" data-v-09555c0e>금산분리 규제 리스크가 있으나 양사 모두 전통 금융업자가 아니어서 <strong class="font-bold dark:font-extrabold">해당 규제에 저촉되지 않을 전망</strong></li>
<li class="ms-6 text-pretty" data-v-09555c0e>네이버는 AI, 블록체인, 결제 인프라 기술을 통해 <strong class="font-bold dark:font-extrabold">웹3 환경에서의 원동력을 확보하고 디지털 자산 시장 기술 저변을 확대</strong>하겠다고 밝힘</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://thehackernews.com/2025/11/years-of-jsonformatter-and-codebeautify.html?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Years of JSONFormatter and CodeBeautify Leaks Expose Thousands of Passwords and API Keys</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20251126124730/https://thehackernews.com/2025/11/years-of-jsonformatter-and-codebeautify.html?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>보안 회사 watchTowr Labs가 JSONformatter, CodeBeautify 같은 온라인 코드 포맷팅 도구에서 <strong class="font-bold dark:font-extrabold">80,000개 이상의 파일 데이터셋을 수집</strong>하여 심각한 보안 문제를 발견함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>정부, 통신, 금융, 의료, 중요 기반시설 등 민감한 분야 조직들이 이러한 사이트에 <strong class="font-bold dark:font-extrabold">비밀번호, 인증 키, DB 자격증명, AWS 키, Active Directory 자격증명 등을 무분별하게 붙여넣기</strong>하고 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>수집된 데이터는 <strong class="font-bold dark:font-extrabold">5년치 JSONFormatter 콘텐츠와 1년치 CodeBeautify 콘텐츠로 총 5GB 이상의 JSON 데이터</strong>에 해당함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 도구들은 포맷된 JSON이나 코드를 <strong class="font-bold dark:font-extrabold">예측 가능한 URL 형식의 공유 가능한 링크로 저장</strong>하는 기능을 제공하며, &quot;Recent Links&quot; 페이지도 존재해 크롤러로 쉽게 수집 가능함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>URL 형식: <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">jsonformatter.org/{id}</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">jsonformatter.org/{formatter-type}/{id}</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">codebeautify.org/{formatter-type}/{id}</code> 등 <strong class="font-bold dark:font-extrabold">단순하고 예측 가능한 구조</strong></li>
<li class="ms-6 text-pretty" data-v-09555c0e>유출된 정보 사례: Jenkins 비밀키, 사이버보안 회사의 암호화된 자격증명, 은행의 KYC 정보, 주요 금융거래소의 AWS 자격증명, 은행 Active Directory 자격증명 등</li>
<li class="ms-6 text-pretty" data-v-09555c0e>watchTowr가 <strong class="font-bold dark:font-extrabold">가짜 AWS 액세스 키를 업로드한 결과, 48시간 후 악의적 행위자들이 이를 악용 시도</strong>했으며, 이는 이미 공격자들이 이러한 사이트를 적극적으로 스크래핑하고 있음을 증명함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>현재 JSONFormatter와 CodeBeautify는 <strong class="font-bold dark:font-extrabold">저장 기능을 임시 비활성화</strong>하고 &quot;개선 작업 중&quot;이며 &quot;NSFW 콘텐츠 방지 조치 강화&quot; 중이라고 밝힘</li>
<li class="ms-6 text-pretty" data-v-09555c0e>watchTowr는 이 변화가 <strong class="font-bold dark:font-extrabold">2024년 9월경 영향받은 조직들에 대한 알림 이후 발생</strong>한 것으로 추정함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>보안 연구원 Jake Knott는 &quot;AI 에이전트 플랫폼이 더 필요한 게 아니라, <strong class="font-bold dark:font-extrabold">중요 조직들이 임의의 웹사이트에 자격증명을 붙여넣는 행위를 중단</strong>해야 한다&quot;고 지적함</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://sjer.red/blog/2024-12-21/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">TIL: <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">satisfies</code> is my favorite TypeScript keyword</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20251126153932/https://sjer.red/blog/2024-12-21/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=45968310&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://lobste.rs/s/risea0?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Lobsters</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>TypeScript의 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">satisfies</code> 키워드는 타입 시스템에서 매우 유용한 기능으로, 최근 TypeScript 작업을 하며 발견한 저자의 favorite 키워드임</li>
<li class="ms-6 text-pretty" data-v-09555c0e>TypeScript는 항상 가장 정확한(precise) 타입을 추론하지 않음 - 예를 들어 객체 리터럴의 문자열 속성은 literal 타입이 아닌 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">string</code>으로 추론됨(객체가 변경 가능하기 때문)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>변수에 명시적 타입 어노테이션을 사용하면 더 구체적인 타입을 지정할 수 있지만, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">satisfies</code> 키워드가 더 나은 대안이 될 수 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold"><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">satisfies</code>는 값이 특정 타입에 &quot;최소한 할당 가능해야 함&quot;을 보장</strong>하면서도, TypeScript가 실제 값을 기반으로 더 구체적인 타입을 추론하도록 허용함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">satisfies</code>의 핵심 장점: 명시적 타입 어노테이션과 달리 <strong class="font-bold dark:font-extrabold">TypeScript가 제공된 값을 기반으로 더 specific한 타입을 추론</strong>할 수 있게 함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>예시: <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">Person</code> 타입을 만족하면서도 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">isCool: true</code>라는 더 구체적인 literal 타입을 유지해야 하는 경우, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">satisfies Person</code>을 사용하면 간단히 해결됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">satisfies</code>는 타입 안전한 방식으로 값을 캐스팅하는 것과 유사하며, 타입 체크와 정밀한 타입 추론을 동시에 달성할 수 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>할당된 변수의 타입은 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">satisfies</code>에 제공된 타입이 아니라 <strong class="font-bold dark:font-extrabold">실제 값의 타입을 기반</strong>으로 결정됨</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://github.com/unhappychoice/gitlogue?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GitHub - unhappychoice/gitlogue: A cinematic Git commit replay tool for the terminal, turning your Git history into a living, animated story.</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20251126134322/https://github.com/unhappychoice/gitlogue?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=45964956&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">gitlogue</strong>는 Git 커밋 히스토리를 터미널에서 영화처럼 재생하는 도구로, 코드 변경사항을 애니메이션과 함께 시각적으로 보여줌</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Rust로 개발되어 빠르고 가벼우며, 실제 타이핑 애니메이션, 커서 이동, 삭제, 파일 작업을 현실감 있게 재현함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Tree-sitter 기반 구문 강조</strong>(26개 언어 지원), 프로젝트 파일 트리, 9가지 내장 테마 및 커스터마이징 기능 제공</li>
<li class="ms-6 text-pretty" data-v-09555c0e>다양한 설치 방법 지원: curl 스크립트, Homebrew, Cargo, Pacman, Nix, 소스 빌드</li>
<li class="ms-6 text-pretty" data-v-09555c0e>주요 사용 사례
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">스크린세이버 모드</strong>(무한 랜덤 커밋 재생)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>교육 목적(코드 진화 과정 시각화)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>프레젠테이션, 콘텐츠 제작, 터미널 데스크탑 꾸미기, &quot;바쁜 척하기&quot; 모드</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e>커밋 범위 지정, 작성자/날짜 필터링, 재생 순서 변경, 루프 재생, 파일 패턴 무시 등 다양한 옵션 제공</li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">~/.config/gitlogue/config.toml</code>를 통해 기본 테마, 타이핑 속도, 배경 설정 등 구성 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">주의사항</strong>: 전통적인 스크린세이버 기능(전원 관리, 화면 블랭킹)은 없으며, OLED 디스플레이에서 장시간 사용 시 번인 위험 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>ISC 라이선스 오픈소스 프로젝트로, 기여 환영하며 상세한 가이드 문서 제공</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://bringbackdoors.com/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Bring Back Doors</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20251127023512/https://bringbackdoors.com/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46063072&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://news.hada.io/topic?id=24653&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GeekNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>호텔들이 &quot;미학&quot;이라는 명목으로 욕실 문을 제거하는 트렌드에 대한 불만을 표현하며, 이는 침대만큼 기본적이어야 할 요소가 희생된 것이라고 비판함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>호텔들이 재료비 절감과 공간 확대 효과를 위해 욕실 문을 없애지만, <strong class="font-bold dark:font-extrabold">투숙객의 프라이버시와 존엄성은 고려하지 않는다</strong>고 지적함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">욕실 문이 있는 호텔과 없는 호텔을 정리한 웹사이트를 구축</strong>하여 투숙객들이 예약 전에 확인할 수 있도록 함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>수백 개의 호텔에 이메일을 보내 두 가지를 확인함: 문이 완전히 닫히는지, 유리로 만들어졌는지</li>
<li class="ms-6 text-pretty" data-v-09555c0e>문이 완전히 닫히고 유리가 아닌 호텔들을 <strong class="font-bold dark:font-extrabold">가격대와 도시별로 분류</strong>하여 욕실 문이 보장된 숙소를 쉽게 찾을 수 있도록 정리함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>예약하려는 호텔이 이전 투숙객에 의해 문이 없다고 보고되었는지 빠르게 확인 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e>욕실 문이 없는 호텔에 묵었던 사람들이 호텔명을 <a href="mailto:bringbackdoors@gmail.com" rel="noopener noreferrer" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">bringbackdoors@gmail.com</a>으로 이메일 보내거나, Instagram DM으로 호텔명과 사진을 제보할 수 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>제보된 호텔들을 <strong class="font-bold dark:font-extrabold">공개적으로 공유(public shaming)</strong>하여 미래 여행객들의 존엄성을 보호하는 것이 목적</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://www.euronews.com/2025/11/29/travel-disruption-thousands-of-airbus-planes-grounded-after-faulty-software-detected?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Thousands of Airbus planes grounded after faulty software detected</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20251130035136/https://www.euronews.com/2025/11/29/travel-disruption-thousands-of-airbus-planes-grounded-after-faulty-software-detected?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>소프트웨어 문제로 인해 전 세계 항공사들이 <strong class="font-bold dark:font-extrabold">약 6,000대의 에어버스 A320 계열 항공기를 운항 중단</strong>해야 했으며, 주말 동안 항공편 지연 및 취소가 발생함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 문제는 지난달 발생한 <strong class="font-bold dark:font-extrabold">항공기 고도 급강하 사고와 연관</strong>되어 있을 가능성이 있으며, 해당 사고로 15명이 부상을 입음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>에어버스는 10월 30일 JetBlue 사고 조사 결과, <strong class="font-bold dark:font-extrabold">강한 태양 복사선이 A320 계열 항공기의 비행 제어에 중요한 데이터를 손상</strong>시킬 수 있다고 밝힘</li>
<li class="ms-6 text-pretty" data-v-09555c0e>문제의 원인은 <strong class="font-bold dark:font-extrabold">항공기 탑재 컴퓨터의 소프트웨어 업데이트</strong>였으며, 결함이 있는 소프트웨어는 Thales사가 제작한 ELAC(Elevator and Aileron Computer)임</li>
<li class="ms-6 text-pretty" data-v-09555c0e>EU 항공안전청(EASA)과 미국 연방항공청(FAA)은 항공사들에게 <strong class="font-bold dark:font-extrabold">신속한 소프트웨어 업데이트</strong>를 통해 문제를 해결할 것을 요구함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>미국에서는 약 500대의 등록 항공기가 영향을 받았으며, 추수감사절 연휴 귀환 시기인 <strong class="font-bold dark:font-extrabold">미국의 가장 바쁜 여행 시즌과 겹침</strong></li>
<li class="ms-6 text-pretty" data-v-09555c0e>American Airlines는 480대의 A320 계열 항공기 중 209대가 영향을 받았으며, <strong class="font-bold dark:font-extrabold">항공기당 약 2시간의 수정 작업</strong>이 필요하다고 밝힘</li>
<li class="ms-6 text-pretty" data-v-09555c0e>EasyJet은 승객들에게 지연 가능성을 경고했고, Air India는 엔지니어들이 업데이트 작업 중이며 <strong class="font-bold dark:font-extrabold">대상 항공기의 40% 이상 작업을 완료</strong>했다고 발표함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>JetBlue 사고는 멕시코 칸쿤에서 뉴저지 뉴어크로 가는 비행 중 발생했으며, 최소 15명의 승객이 부상당해 병원으로 이송되었고 <strong class="font-bold dark:font-extrabold">항공기는 플로리다 탬파로 회항</strong>함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>에어버스는 보잉과 함께 세계 최대 항공기 제조업체 중 하나임</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://www.yna.co.kr/view/AKR20251129036051030?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">쿠팡 &quot;개인정보 노출계정 3천370만개&quot;…사실상 다 털렸다(종합) | 연합뉴스</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20251130040623/https://www.yna.co.kr/view/AKR20251129036051030?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>쿠팡이 개인정보 유출 규모를 <strong class="font-bold dark:font-extrabold">3천370만 계정</strong>으로 확인했다고 29일 발표</li>
<li class="ms-6 text-pretty" data-v-09555c0e>당초 18일에는 약 4천500개 계정의 정보가 노출됐다고 밝혔으나, 후속 조사 결과 <strong class="font-bold dark:font-extrabold">실제 피해 규모가 7천500배 수준으로 급증</strong></li>
<li class="ms-6 text-pretty" data-v-09555c0e>노출된 정보는 <strong class="font-bold dark:font-extrabold">이름, 이메일 주소, 배송지 주소록(이름·전화번호·주소), 일부 주문정보</strong></li>
<li class="ms-6 text-pretty" data-v-09555c0e>결제정보, 신용카드 번호, 로그인 정보는 별도 관리되어 <strong class="font-bold dark:font-extrabold">노출되지 않았다</strong>고 설명</li>
<li class="ms-6 text-pretty" data-v-09555c0e>쿠팡의 3분기 활성고객 수는 2천470만명, 와우 회원 수는 1천400만명(2023년 말 기준)으로 알려져 있어, <strong class="font-bold dark:font-extrabold">노출 계정 수가 알려진 고객 수보다 많은 상황</strong></li>
<li class="ms-6 text-pretty" data-v-09555c0e>무단 접근은 <strong class="font-bold dark:font-extrabold">6월 24일부터 해외 서버를 통해</strong> 발생한 것으로 추정되며, 쿠팡은 6일 오후 6시 38분 무단 접근 발생 후 <strong class="font-bold dark:font-extrabold">12일이 지난 18일 오후 10시 52분에 인지</strong></li>
<li class="ms-6 text-pretty" data-v-09555c0e>현재 무단 접근 경로를 차단하고 내부 모니터링을 강화했으며, 독립 보안기업 전문가를 영입해 조사 중</li>
<li class="ms-6 text-pretty" data-v-09555c0e>경찰청, 한국인터넷진흥원(KISA), 개인정보보호위원회와 협력하여 사고 대응 진행 중</li>
<li class="ms-6 text-pretty" data-v-09555c0e>쿠팡은 고객에게 사과하며 <strong class="font-bold dark:font-extrabold">쿠팡 사칭 전화, 문자 메시지 등에 주의</strong>할 것을 당부</li>
</ul>
</li>
</ul>
</li>
</ul></div>]]></content>
        <author>
            <name>Nesswit</name>
            <email>rishubil+blog@gmail.com</email>
            <uri>https://blog.update.sh/about</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[2025-11-24 주간 URL 모음]]></title>
        <id>https://blog.update.sh/weekly-urls/2025-11-24</id>
        <link href="https://blog.update.sh/weekly-urls/2025-11-24"/>
        <updated>2025-11-23T23:00:00.000Z</updated>
        <content type="html"><![CDATA[<div class="mdx-content leading-[1.6]" style="--v2806f315:0.875rem,[object Object],0.875rem,[object Object];--v67bf8b50:#6b7280;--v67bf83ce:#d1d5db;--v67bf878f:#9ca3af;--v67bf92d2:#374151;" data-v-ec58c90e><ul class="my-2 list-outside list-disc" data-v-ec58c90e>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://blog.google/products/android/quick-share-airdrop/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Android and iPhone users can now share files, starting with the Pixel 10 family.</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://news.ycombinator.com/item?id=45994854&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://news.hada.io/topic?id=24512&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GeekNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Google이 <strong class="font-bold dark:font-extrabold">Quick Share와 AirDrop 간의 호환성</strong>을 발표하며, iPhone과 Android 기기 간 파일 전송을 더욱 쉽게 만듦</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 기능은 오늘부터 <strong class="font-bold dark:font-extrabold">Pixel 10 제품군에 먼저 출시</strong>되기 시작함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">보안을 핵심에 두고 개발</strong>되었으며, 독립적인 보안 전문가들의 테스트를 거친 강력한 보안 장치로 데이터를 보호함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>RCS 메시징 및 알 수 없는 추적기 경고 작업에 이어, <strong class="font-bold dark:font-extrabold">운영체제 간 호환성 개선</strong>을 위한 지속적인 노력의 일환임</li>
<li class="ms-6 text-pretty" data-v-09555c0e>향후 사용자 경험을 개선하고 <strong class="font-bold dark:font-extrabold">더 많은 Android 기기로 확대</strong>할 계획임</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://mastoreader.io/?url=https%3A%2F%2Fmastodon.gamedev.place%2F%40TomF%2F115589875974658415&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Masto Reader</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://archive.md/BenT6?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=46009962&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://news.hada.io/topic?id=24561&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GeekNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
Title: Masto Reader
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>저자는 Half-Life 2에서 플레이어가 진행하지 못하게 만든 문과 관련된 버그에 대해 설명합니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 버그는 2013년에 Half-Life 2를 VR로 포팅하려는 시도 중에 발견되었습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>문제는 경비병의 바운딩 박스가 문이 열릴 때 문의 경로와 교차하는 것과 관련이 있었습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>경비병이 문에 너무 가까이 배치되어 문이 그의 발가락을 건드렸습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 충돌로 인해 문이 튕겨 나가 잠기면서 플레이어를 가두게 되었습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 버그는 Half-Life 2의 원래 릴리스에 존재했지만 발견되지 않았습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>구형(x87) 명령어 세트와 신형(SSE) 명령어 세트 간의 부동 소수점 정밀도 차이가 중요한 역할을 했습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>x87 명령어 세트의 가변 정밀도는 경비병의 약간의 회전을 허용하여 그의 발가락을 문의 경로에서 벗어나게 했습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>SSE 명령어 세트의 더 일관된 정밀도는 물리 엔진 계산과 결합되어 경비병이 덜 회전하게 만들어 그의 발가락이 문의 경로에 남아 있게 했습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>버그 수정은 경비병을 1밀리미터 뒤로 이동시키는 간단한 조정이었으며, 이는 겉보기에 사소한 문제가 게임 개발에서 어떻게 중대한 결과를 초래할 수 있는지를 보여줍니다.</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://www.space.com/space-exploration/international-space-station/we-were-genuinely-astonished-this-moss-survived-9-months-outside-the-international-space-station-and-could-still-grow-on-earth?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">&#39;We were genuinely astonished&#39;: This moss survived 9 months outside the International Space Station and could still grow on Earth</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20251123170344/https://www.space.com/space-exploration/international-space-station/we-were-genuinely-astonished-this-moss-survived-9-months-outside-the-international-space-station-and-could-still-grow-on-earth?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>일본 홋카이도 대학 연구팀이 이끄는 연구에서 이끼 포자가 <strong class="font-bold dark:font-extrabold">국제우주정거장(ISS) 외부의 극한 우주 환경에서 9개월간 노출된 후에도 생존</strong>하여 지구에서 발아할 수 있음을 확인함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>연구진은 2022년 3월 Cygnus 화물선으로 &quot;spreading earthmoss&quot; 이끼의 포자체(sporophyte)를 ISS로 보냈고, 283일간 우주정거장 외벽에 부착된 후 2023년 1월 Dragon 캡슐로 귀환함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>사전 지상 실험에서 <strong class="font-bold dark:font-extrabold">자외선(UV) 복사가 이끼에 가장 큰 스트레스 요인</strong>임을 확인했으며, 포자체가 어린 이끼나 줄기세포보다 우주 환경을 훨씬 잘 견딜 수 있음을 발견함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>연구 결과 <strong class="font-bold dark:font-extrabold">80% 이상의 포자체가 생존</strong>했고, 생존자 중 89%가 실험실에서 성공적으로 발아함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>우주 비행으로 인해 광합성 주요 색소인 엽록소 a가 20% 감소했지만, 포자는 건강한 상태를 유지함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>연구진이 개발한 수학 모델에 따르면 포자체는 우주에서 <strong class="font-bold dark:font-extrabold">약 5,600일(15년 이상) 생존 가능</strong>할 것으로 예측됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이끼는 지구에서 4억 년 이상 전에 진화한 가장 오래된 식물 중 하나로, 물관계가 없지만 북극 툰드라부터 사하라 사막까지 극한 환경에서 번성하는 강인함을 지님</li>
<li class="ms-6 text-pretty" data-v-09555c0e>연구책임자 후지타는 &quot;지구에서 진화한 생명체가 세포 수준에서 우주 환경을 견딜 수 있는 본질적 메커니즘을 가지고 있다는 놀라운 증거&quot;라고 설명함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 연구는 <strong class="font-bold dark:font-extrabold">달과 화성 같은 외계 환경에서 생태계를 구축하는 새로운 가능성</strong>을 열어줄 수 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이번 연구 결과는 2025년 11월 20일 학술지 iScience에 게재됨</li>
</ul>
</li>
</ul>
</li>
</ul></div>]]></content>
        <author>
            <name>Nesswit</name>
            <email>rishubil+blog@gmail.com</email>
            <uri>https://blog.update.sh/about</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[폰트에 기능이 있다구요? (기본편)]]></title>
        <id>https://blog.update.sh/posts/what-is-font</id>
        <link href="https://blog.update.sh/posts/what-is-font"/>
        <updated>2025-11-22T15:00:00.000Z</updated>
        <summary type="html"><![CDATA[폰트의 기본 개념부터 OpenType 기능, 가변 폰트, 렌더링 방식까지 폰트에 대한 포괄적인 이해를 제공합니다. 실제 인터랙티브 예시를 통해 폰트의 다양한 특성과 활용법을 확인할 수 있습니다.
]]></summary>
        <content type="html"><![CDATA[<div class="mdx-content leading-[1.6]" style="--v2806f315:0.875rem,[object Object],0.875rem,[object Object];--v67bf8b50:#6b7280;--v67bf83ce:#d1d5db;--v67bf878f:#9ca3af;--v67bf92d2:#374151;" data-v-ec58c90e>
<details class="my-2" open><summary class="cursor-pointer font-semibold dark:font-bold"> 목차 열기/닫기 </summary><nav><ul class="my-2 list-outside list-disc"><li class="ms-6 text-pretty" data-v-09555c0e><a href="#1-이-글에-대하여" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">1. 이 글에 대하여</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#2-폰트란-무엇인가" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">2. 폰트란 무엇인가</a><ul class="my-2 list-outside list-disc"><li class="ms-6 text-pretty" data-v-09555c0e><a href="#21-서체typeface-글꼴-가족font-family-글꼴font" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">2.1. 서체(Typeface), 글꼴 가족(Font Family), 글꼴(Font)</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#22-문자character-글리프glyph" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">2.2. 문자(Character), 글리프(Glyph)</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#23-폰트의-종류" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">2.3. 폰트의 종류</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#24-파일-형식" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">2.4. 파일 형식</a></li></ul></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#3-폰트의-크기" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">3. 폰트의 크기</a><ul class="my-2 list-outside list-disc"><li class="ms-6 text-pretty" data-v-09555c0e><a href="#31-em-square" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">3.1. Em Square</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#32-baseline" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">3.2. Baseline</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#33-x-height" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">3.3. x-height</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#34-ascender-descender-cap-height" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">3.4. Ascender, Descender, Cap Height</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#35-한중일-글리프의-크기" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">3.5. 한중일 글리프의 크기</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#36-행간line-height" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">3.6. 행간(Line Height)</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#37-정리" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">3.7. 정리</a></li></ul></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#4-폰트로-할-수-있는-것" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">4. 폰트로 할 수 있는 것</a><ul class="my-2 list-outside list-disc"><li class="ms-6 text-pretty" data-v-09555c0e><a href="#41-크기size" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">4.1. 크기(Size)</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#42-굵기weight" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">4.2. 굵기(Weight)</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#43-이탤릭italic-오블리크oblique" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">4.3. 이탤릭(Italic), 오블리크(Oblique)</a></li></ul></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#5-opentype의-타이포그래피-기능" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">5. OpenType의 타이포그래피 기능</a><ul class="my-2 list-outside list-disc"><li class="ms-6 text-pretty" data-v-09555c0e><a href="#51-합자ligature" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">5.1. 합자(Ligature)</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#52-커닝kerning" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">5.2. 커닝(Kerning)</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#53-opentype-기능opentype-features" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">5.3. OpenType 기능(OpenType Features)</a></li></ul></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#6-가변-폰트variable-fonts" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">6. 가변 폰트(Variable Fonts)</a><ul class="my-2 list-outside list-disc"><li class="ms-6 text-pretty" data-v-09555c0e><a href="#61-굵기-축weight-axis-너비-축width-axis" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">6.1. 굵기 축(Weight Axis), 너비 축(Width Axis)</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#62-기울기-축slant-axis-이탤릭-축italic-axis" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">6.2. 기울기 축(Slant Axis), 이탤릭 축(Italic Axis)</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#63-시각적-크기-축optical-size-axis" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">6.3. 시각적 크기 축(Optical Size Axis)</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#64-커스텀-축custom-axis" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">6.4. 커스텀 축(Custom Axis)</a></li></ul></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#7-특이한-폰트" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">7. 특이한 폰트</a><ul class="my-2 list-outside list-disc"><li class="ms-6 text-pretty" data-v-09555c0e><a href="#71-색상-폰트color-fonts" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">7.1. 색상 폰트(Color Fonts)</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#72-딩뱃dingbat" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">7.2. 딩뱃(Dingbat)</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#73-아이콘-폰트icon-fonts" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">7.3. 아이콘 폰트(Icon Fonts)</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#74-특수-폰트" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">7.4. 특수 폰트</a></li></ul></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#8-렌더링rendering" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">8. 렌더링(Rendering)</a><ul class="my-2 list-outside list-disc"><li class="ms-6 text-pretty" data-v-09555c0e><a href="#81-래스터화rasterization" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">8.1. 래스터화(Rasterization)</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#82-안티앨리어싱anti-aliasing" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">8.2. 안티앨리어싱(Anti-aliasing)</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#83-서브픽셀-렌더링subpixel-rendering" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">8.3. 서브픽셀 렌더링(Subpixel Rendering)</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#84-힌팅hinting" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">8.4. 힌팅(Hinting)</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#85-렌더링-엔진" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">8.5. 렌더링 엔진</a></li></ul></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#9-인코딩encoding" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">9. 인코딩(Encoding)</a><ul class="my-2 list-outside list-disc"><li class="ms-6 text-pretty" data-v-09555c0e><a href="#91-문자-인코딩character-encoding" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">9.1. 문자 인코딩(Character Encoding)</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#92-유니코드unicode" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">9.2. 유니코드(Unicode)</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#93-유니코드-정규화unicode-normalization" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">9.3. 유니코드 정규화(Unicode Normalization)</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#94-제어-문자control-characters" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">9.4. 제어 문자(Control Characters)</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#95-private-use-area-pua" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">9.5. Private Use Area (PUA)</a></li></ul></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#10-폰트-라이선스font-license" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">10. 폰트 라이선스(Font License)</a><ul class="my-2 list-outside list-disc"><li class="ms-6 text-pretty" data-v-09555c0e><a href="#101-주요-확인-사항" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">10.1. 주요 확인 사항</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#102-대표적인-폰트-라이선스" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">10.2. 대표적인 폰트 라이선스</a></li></ul></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#11-마치며" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">11. 마치며</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#12-이-글에서-사용한-폰트" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">12. 이 글에서 사용한 폰트</a></li><li class="ms-6 text-pretty" data-v-09555c0e><a href="#13-참고자료" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">13. 참고자료</a></li></ul></nav></details>
<h2 class="my-6 text-balance text-3xl font-extrabold dark:font-black" id="1-이-글에-대하여"><a class="hover:text-teal-800 dark:hover:text-teal-400" href="#1-이-글에-대하여">1. 이 글에 대하여</a></h2>
<p class="my-2 text-pretty" data-v-9880527e>이 글은 과거 사내 세미나에서 발표했던 내용을 다듬은 것입니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>기획팀, 디자인팀 동료들이 폰트를 사용하면서 궁금했던 점들을 질문해 주었고, 이를
바탕으로 폰트의 기본 개념과 기술적 내용을 정리했습니다.
저 자신도 폰트에 대해 정확히 알지 못했던 부분이 많았기에, 공부하는 마음으로
준비한 발표였습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>발표 자료를 인터랙티브하게 만들어 실제 프레젠테이션에서 직접 텍스트를 수정하고
폰트의 다양한 특성을 시각적으로 확인할 수 있도록 구성했는데, 이 부분을 블로그
포스트로 다듬어 공개하면 많은 분께 도움이 될 것 같아 글로 옮기게 되었습니다.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div class="w-full h-40 relative flex items-center justify-center"><div style="font-palette:--fontname-574362668-undefined-palette;" class="w-full max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div></div><div class="flex gap-1 p-1"><div class="shrink-0 py-1 text-center">굵기</div><div class="min-w-16 shrink-0 py-1 text-center font-mono">400</div><input class="w-full accent-teal-600 dark:accent-teal-500" type="range" min="400" max="1000" step="1" value="400"><button class="w-16 shrink-0 font-medium text-teal-600 hover:bg-teal-700 hover:text-white dark:text-teal-400 dark:hover:bg-teal-600 dark:hover:text-white">Play</button></div><div class="flex gap-1 p-1"><div class="shrink-0 py-1 text-center">크기</div><div class="min-w-16 shrink-0 py-1 text-center font-mono">60px</div><input class="w-full accent-teal-600 dark:accent-teal-500" type="range" min="30" max="60" step="1" value="60"><button class="w-16 shrink-0 font-medium text-teal-600 hover:bg-teal-700 hover:text-white dark:text-teal-400 dark:hover:bg-teal-600 dark:hover:text-white">Play</button></div><div class="text-center mt-2">Wanted Sans</div></div><div class="text-center text-gray-500 dark:text-gray-500">텍스트를 직접 수정하며 확인해 보세요.</div></div>
<p class="my-2 text-pretty" data-v-9880527e>세미나에서 발표한 원본 내용을 블로그 포스트 하나로 담기에는 분량이 많아, 내용을
두 개의 글로 나누어 다루기로 했습니다.
이 글에서는 폰트에 대한 기본적인 개념과 특징에 대해서만 알아볼 것이며, 웹
환경에서의 활용법과 팁 등은 별도의 글에서 소개할 예정입니다.
그러므로 이 글에서 소개하는 내용은 웹 환경에 국한되지 않고, 폰트를 사용할 수
있는 대부분의 환경에 적용될 수 있는 일반적인 내용을 다룹니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>이 글의 내용에는 타이포그래피에 관한 내용이 포함되어 있지만, 디자인적인
측면보다는 기술적인 정의, 특징, 활용법을 중심으로 다룹니다.
또, 타이포그래피나 폰트에 대한 전문적인 지식을 바탕으로 작성된 글이 아니므로,
심도 있는 내용을 원하시는 분들께는 다소 부족할 수 있습니다.</p>
<h2 class="my-6 text-balance text-3xl font-extrabold dark:font-black" id="2-폰트란-무엇인가"><a class="hover:text-teal-800 dark:hover:text-teal-400" href="#2-폰트란-무엇인가">2. 폰트란 무엇인가</a></h2>
<p class="my-2 text-pretty" data-v-9880527e>우리는 다양한 환경에서 다양한 목적으로 폰트를 사용합니다.
폰트를 선택하고 적용하는 과정에서, 폰트의 기본 개념과 특성을 이해하지 못하면
원하는 결과를 얻기 어렵습니다.
폰트는 단순히 문자를 표시하는 도구가 아니라, 시각적 표현과 의사소통의 중요한
수단이기 때문입니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>우리가 폰트에 대해 더 잘 이해하면 더 나은 디자인 결정을 내리고, 텍스트의
가독성과 미적 품질을 향상할 수 있습니다.
폰트로 어떤 일을 할 수 있는지, 그리고 어떻게 활용할 수 있는지 알아보겠습니다.
이를 위해 먼저 폰트의 기본 개념부터 살펴보겠습니다.</p>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="21-서체typeface-글꼴-가족font-family-글꼴font"><a class="hover:text-teal-800" href="#21-서체typeface-글꼴-가족font-family-글꼴font">2.1. 서체(Typeface), 글꼴 가족(Font Family), 글꼴(Font)</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>먼저 서체, 글꼴 가족, 글꼴이 무엇인지 알아보겠습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>일반적으로 &#39;폰트&#39;라고 하는 것은 서체, 글꼴 가족, 글꼴을 구분하지 않고 통칭하는
경우가 많습니다.
그러나 엄밀히 말하면, 서체와 글꼴 가족, 글꼴은 서로 다른 개념입니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>서체란 문자의 디자인 스타일을 의미합니다.
어떠한 디자인 원칙과 미적 기준에 따라 만들어진 문자 모양의 전체 집합을
말한다고도 할 수 있습니다.
예를 들어 &#39;나눔명조&#39;, &#39;Noto Sans KR&#39; 등은 서체의 이름입니다.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname--1213214335-undefined-palette;" class="w-fit max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2"><p class="my-2 text-pretty" data-v-9880527e>나눔명조</p></div></div><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname--1267989792-undefined-palette;" class="w-fit max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2"><p class="my-2 text-pretty" data-v-9880527e>Noto Sans KR</p></div></div><div class="text-center text-gray-500 dark:text-gray-500"><p class="my-2 text-pretty" data-v-9880527e>텍스트를 직접 수정하며 확인해 보세요.</p></div></div>
<p class="my-2 text-pretty" data-v-9880527e>글꼴 가족은 서체의 하위 개념으로, 동일한 서체 내에서 굵기(Weight),
이탤릭(Italic) 등을 포함한 다양한 스타일의 집합을 의미합니다.
&#39;나눔명조&#39; 서체에는 &#39;나눔명조 Regular&#39;, &#39;나눔명조 Bold&#39;, &#39;나눔명조 Extra Bold&#39;
등을 통틀어 &#39;나눔명조&#39; 글꼴 가족이라고 부릅니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>글꼴은 서체의 특정 크기와 스타일의 실제 구현체를 의미합니다.
예를 들어, &#39;나눔명조 Bold 14px&#39;나 &#39;Noto Sans KR Regular 16px&#39; 같은 것들이
글꼴에 해당합니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>앞서 언급한 것처럼 디지털 타이포그래피에서는 이들을 엄밀하게 구분하지 않고,
모두 &#39;폰트&#39;라는 용어로 통칭하는 경우가 많습니다.
활판 인쇄나 사진 식자에서는 이러한 구분이 더 엄격했지만, 디지털 환경에서는
용어 간의 경계가 모호해졌기 때문입니다.
이 글에서도 앞으로 서체, 글꼴 가족, 글꼴을 구분하지 않고 &#39;폰트&#39;라는 용어로
통칭할 것입니다.</p>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="22-문자character-글리프glyph"><a class="hover:text-teal-800" href="#22-문자character-글리프glyph">2.2. 문자(Character), 글리프(Glyph)</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>문자는 텍스트의 기본 단위입니다.
로마자 알파벳 &#39;A&#39;, &#39;B&#39;, &#39;C&#39;나 한글 &#39;ㄱ&#39;, &#39;ㄴ&#39;, &#39;ㄷ&#39; 같은 것들이 문자에
해당합니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>글리프는 이러한 문자를 시각적으로 표현하는 구체적인 모양입니다.
우리가 &#39;A&#39;라는 문자를 화면에 표시한다고 할 때, 어떤 폰트를 사용하느냐에 따라
서로 다른 모양으로 나타납니다.
이것은 서로 다른 폰트에서는 같은 문자를 표현하는 글리프가 다르기 때문입니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>같은 폰트 안에서도 동일한 문자를 여러 개의 글리프로 표현할 수 있다는 점에
유의하세요.
왜냐하면 같은 폰트 내에서도 글꼴에 따라 글리프의 모양이 다를 수 있기
때문입니다.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname-574362668-undefined-palette;" class="w-fit max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">Wanted Sans (기본 글리프)</div></div><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname-574362668-undefined-palette;" class="w-fit max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">Wanted Sans (대체 글리프)</div></div><div class="text-center text-gray-500 dark:text-gray-500">텍스트를 직접 수정하며 확인해 보세요.</div></div>
<p class="my-2 text-pretty" data-v-9880527e>위 예시는 Wanted Sans에서 동일한 문자 &#39;Q&#39;와 &#39;a&#39;를 서로 다른 글리프로 표현한
것입니다.
강조한 문자의 모양이 확연히 다른 것을 볼 수 있습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>폰트마다 지원하는 문자 집합이 다르기 때문에, 특정 폰트로 표현할 수 없는 문자가
있을 수 있습니다.
이 경우 운영체제나 애플리케이션은 대체 폰트를 사용하여 해당 문자를 표현하려고
시도합니다.
그러나 대체 폰트가 없거나, 대체 폰트에서도 해당 문자를 지원하지 않을 때는 빈
사각형이나 물음표와 같은 대체 기호로 표시될 수 있습니다.</p>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="23-폰트의-종류"><a class="hover:text-teal-800" href="#23-폰트의-종류">2.3. 폰트의 종류</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>세상에는 수많은 폰트가 존재하며, 디자인 스타일, 용도, 기술적 특성 등에 따라
다양하게 분류됩니다.
여기서는 이러한 분류 중 가장 대표적인 분류인 세리프(Serif)와 산세리프(Sans
Serif), 가변폭(Variable-width)과 고정폭(Monospace)에 대해서만 알아보겠습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>세리프 폰트는 글리프의 획 끝에 작은 장식(삐침, 꼬리)이 있는 폰트로,
전통적이고 격식 있는 느낌을 줍니다.
우리나라에서 &#39;바탕&#39;, &#39;명조&#39; 등으로 부르는 폰트가 세리프 폰트에 해당합니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>반대로 산세리프 폰트는 이러한 장식이 없는 폰트로, 현대적이고 깔끔한 느낌을
줍니다.
우리나라에서 &#39;돋움&#39;, &#39;고딕&#39; 등으로 부르는 폰트가 산세리프 폰트에 해당합니다.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname--1213214335-undefined-palette;" class="w-fit max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">세리프 폰트: 나눔명조</div></div><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname-574362668-undefined-palette;" class="w-fit max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">산세리프 폰트: Wanted Sans</div></div><div class="text-center text-gray-500 dark:text-gray-500">텍스트를 직접 수정하며 확인해 보세요.</div></div>
<p class="my-2 text-pretty" data-v-9880527e>가변폭 폰트는 각 글리프의 너비가 일정하지 않은 폰트입니다.
대부분의 폰트가 가변폭 폰트에 해당하며, 일반적인 문서 작성이나 웹 페이지에서
사용됩니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>고정폭 폰트는 글리프의 너비가 균일한 폰트입니다.
주로 코드 편집기나 터미널에서 사용되며, 금액을 표에 표시하는 것처럼 텍스트가
세로로 정렬되어야 하는 상황에 적합합니다.
한중일 글리프를 지원하는 고정폭 폰트는 일반적으로 한중일 글리프를 다른 글리프
대비 2배의 너비로 디자인합니다.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname--913515245-undefined-palette;" class="w-fit max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">가변폭 폰트: Pretendard Variable</div></div><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname--80724564-undefined-palette;" class="w-fit max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">고정폭 폰트: D2 Coding</div></div><div class="text-center text-gray-500 dark:text-gray-500">텍스트를 직접 수정하며 확인해 보세요.</div></div>
<p class="my-2 text-pretty" data-v-9880527e>위 예시에서 가변폭 폰트는 각 행의 너비가 다르지만, 고정폭 폰트는 모든 행의
너비가 같은 것을 볼 수 있습니다.
특히 &#39;D2 Coding&#39; 폰트에서는 한글 글리프가 다른 글리프 대비 2배의 너비로
디자인된 것을 확인할 수 있습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>아래는 폰트의 주요 종류와 특징을 정리한 표입니다.</p>
<div class="max-w-full overflow-x-auto"><table class="mx-auto my-2 table-auto border-collapse border border-gray-300 dark:border-gray-700"><thead class="bg-gray-100 dark:bg-gray-800" style="--v255875d0:#e5e7eb;--v255884d4:#4b5563;" data-v-a4655b9c><tr class="text-pretty"><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">구분</th><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">세리프<br>(Serif)</th><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">산세리프<br>(Sans Serif)</th><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">가변폭<br>(Variable-width)</th><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">고정폭<br>(Monospace)</th></tr></thead><tbody style="--b230077a:#f9fafb;--v361793cf:#1f2937;" data-v-a0502667><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><strong class="font-bold dark:font-extrabold">설명</strong></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">글리프의 획 끝에 장식이 있음</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">글리프의 획 끝에 장식이 없음</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">각 글리프의 너비가 일정하지 않음</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">글리프의 너비가 균일함</td></tr><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><strong class="font-bold dark:font-extrabold">예시</strong></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">나눔명조, Times New Roman</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">나눔고딕, Arial</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">대부분의 일반 폰트</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">D2 Coding, Consolas</td></tr><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><strong class="font-bold dark:font-extrabold">용도</strong></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">인쇄물, 책, 신문</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">웹, 모바일, 현대적 디자인</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">문서 작성, 웹 페이지</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">코드 편집기, 터미널, 표</td></tr></tbody></table></div>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="24-파일-형식"><a class="hover:text-teal-800" href="#24-파일-형식">2.4. 파일 형식</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>폰트 파일에는 여러 형식이 있지만, 가장 널리 사용되는 형식은 TrueType(TTF),
OpenType(OTF), WOFF/WOFF2(Web Open Font Format)입니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>TTF와 OTF는 웹을 제외한 대부분의 환경에서 사용되는 기본 폰트 파일 형식입니다.
두 형식 모두 OpenType 표준을 따르며, 일반적인 사용 환경에서는 체감 차이가 거의
없습니다.
어떤 형식을 선택해도 무방하지만, 폰트 제작자가 의도한 형식을 사용하는 것이
좋습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>두 형식 간의 장단점을 비교하자면, 저해상도에서 가독성과 곡선의 정밀도에서
약간의 차이를 보입니다.
TTF는 TrueType 곡선을 사용하여 곡선 처리가 더 단순하고, 저해상도 환경에서 더
나은 가독성을 제공하는 경우가 있습니다.
반면 OTF는 CFF(Compact Font Format)라는 PostScript 기반의 곡선을 사용하여,
더 정밀한 곡선 표현을 지원하여 고해상도 환경에서 더 나은 품질을 제공합니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>웹에서는 WOFF(Web Open Font Format)와 WOFF2를 주로 사용합니다.
WOFF/WOFF2는 TTF나 OTF를 압축한 형식으로, 네트워크를 통한 전송에 최적화되어
있습니다.
WOFF2는 WOFF보다 약 30% 더 나은 압축률을 제공하는 최신 형식입니다.
이전에는 웹에서 다른 형식의 폰트를 사용해야 했지만, 현재는 모든 주요 웹
브라우저가 WOFF2를 지원하므로 이 형식을 사용하는 것이 권장됩니다.</p>
<div class="max-w-full overflow-x-auto"><table class="mx-auto my-2 table-auto border-collapse border border-gray-300 dark:border-gray-700"><thead class="bg-gray-100 dark:bg-gray-800" style="--v255875d0:#e5e7eb;--v255884d4:#4b5563;" data-v-a4655b9c><tr class="text-pretty"><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">구분</th><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">TrueType(TTF)</th><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">OpenType(OTF)</th><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">WOFF/WOFF2</th></tr></thead><tbody style="--b230077a:#f9fafb;--v361793cf:#1f2937;" data-v-a0502667><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><strong class="font-bold dark:font-extrabold">특징</strong></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">TrueType 곡선 사용, 저해상도 가독성 우수</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">CFF 곡선 사용, 고해상도 품질 우수</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">TTF/OTF 압축 형식, 웹 최적화</td></tr><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><strong class="font-bold dark:font-extrabold">적용 범위</strong></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">데스크톱, 모바일</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">데스크톱, 모바일</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">웹 브라우저</td></tr></tbody></table></div>
<h2 class="my-6 text-balance text-3xl font-extrabold dark:font-black" id="3-폰트의-크기"><a class="hover:text-teal-800 dark:hover:text-teal-400" href="#3-폰트의-크기">3. 폰트의 크기</a></h2>
<p class="my-2 text-pretty" data-v-9880527e>폰트를 사용하면서 많이 변경하는 속성 중 하나가 바로 &#39;크기&#39;입니다.
그러나 우리가 폰트의 크기를 조절할 때, 실제로 어떤 기준으로 크기가 결정되는지
직관적으로 이해하기 어려운 경우가 많습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>폰트의 크기와 관련된 주요 개념으로는 Em Square, Baseline, x-height, Ascender,
Descender, Cap height, Line height 등이 있습니다.
각 용어가 무엇을 의미하는지, 그리고 폰트의 시각적 표현에 어떤 영향을 미치는지
살펴보겠습니다.</p>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="31-em-square"><a class="hover:text-teal-800" href="#31-em-square">3.1. Em Square</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>Em Square<sup><a href="#user-content-fn-1" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300" id="user-content-fnref-1" data-footnote-ref="true" aria-describedby="footnote-label">1</a></sup>는 폰트에서 글리프의 크기를 정의하는 기준 길이입니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>활판인쇄에서는 대문자 &#39;M&#39;의 활자 크기를 의미했기 때문에 &#39;Em&#39;이라는 이름이
붙었지만, 디지털 폰트에서는 더 이상 활자가 사용되지 않기 때문에 Em Square가
반드시 대문자 &#39;M&#39;의 크기와 일치하지는 않습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>Em Square의 크기는 폰트 디자이너가 설계 시 결정하며, 일반적으로 1000, 1024,
2048 같은 값을 사용합니다.
Em Square의 크기는 폰트 내부의 좌표 단위로 사용되는 값입니다.
그 자체가 단위이므로, Em Square의 값에는 단위가 붙지 않습니다.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 pt-6 mb-4"><div style="font-palette:--fontname-574362668-undefined-palette;" class="w-fit max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">Wanted Sans (Em Square: 2048)</div></div><div class="bg-gray-100 dark:bg-gray-800 p-2 pt-6 mb-4"><div style="font-palette:--fontname--1213214335-undefined-palette;" class="w-fit max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">나눔명조 (Em Square: 1024)</div></div><div class="text-center text-gray-500 dark:text-gray-500">텍스트를 직접 수정하며 확인해 보세요.</div></div>
<p class="my-2 text-pretty" data-v-9880527e>위 예시에서 직접 텍스트를 수정해 보면 Em Square의 위치가 글리프의 위치와
일치하지 않는다는 것을 알 수 있습니다.
폰트에서 Em Square는 길이 단위를 정의하는 추상적인 개념으로, 실제 Em Square의
구체적인 위치를 정의하지는 않습니다.
따라서 앞으로 이 문서에서 예시로 사용하는 Em Square의 위치는 시각적 이해를 돕기
위한 편의적인 표현이고, 실제 글리프의 Em Square의 위치를 나타내지 않습니다.</p>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="32-baseline"><a class="hover:text-teal-800" href="#32-baseline">3.2. Baseline</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>Baseline은 글리프가 배치되는 가상의 수평 기준선입니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>대부분의 글리프는 이 선을 기준으로 정렬되지만, 일부 글리프는 Baseline 아래로
내려가기도 합니다.
소문자 &#39;g&#39;, &#39;j&#39;, &#39;p&#39;, &#39;q&#39;, &#39;y&#39; 같은 글리프는 Baseline 아래로 내려가는
부분(Descender)을 가지고 있습니다.
이에 대해서는 뒤에서 더 자세히 설명하겠습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>한편, 둥근 모양의 글리프(&#39;o&#39;, &#39;d&#39;, &#39;e&#39; 등)는 시각적 균형을 위해 Baseline을 약간
넘어갑니다.
글리프가 Baseline에 정확히 맞춰지면 시각적으로 떠 있거나 작아 보이기
때문입니다.
이러한 디자인 기법을 Overshoot이라고 합니다.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname-574362668-undefined-palette;" class="w-full max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">Wanted Sans</div></div><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname--1213214335-undefined-palette;" class="w-full max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">나눔명조</div></div><div class="text-center text-gray-500 dark:text-gray-500">텍스트를 직접 수정하며 확인해 보세요.</div></div>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="33-x-height"><a class="hover:text-teal-800" href="#33-x-height">3.3. x-height</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>x-height는 소문자 &#39;x&#39;의 높이를 의미하며, 소문자의 기본 높이를 나타냅니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>소문자 &#39;x&#39;는 소문자 중에서 위아래로 돌출된 부분이 없고, 글리프가 사각형에
가까운 안정적인 모양이기 때문에 소문자의 높이를 정의하는 데 적합합니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>x-height는 baseline부터의 거리로 정의되며, Em Square 값을 기준으로 그 수치를
결정합니다.
앞으로 설명할 Ascender, Descender, Cap height 등 다른 높이 값들도 Em Square를
기준으로 거릿값을 정하게 됩니다.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 pt-6 mb-4"><div style="font-palette:--fontname-574362668-undefined-palette;" class="w-full max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">Wanted Sans</div></div><div class="bg-gray-100 dark:bg-gray-800 p-2 pt-6 mb-4"><div style="font-palette:--fontname--1213214335-undefined-palette;" class="w-full max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">나눔명조</div></div><div class="text-center text-gray-500 dark:text-gray-500">텍스트를 직접 수정하며 확인해 보세요.</div></div>
<p class="my-2 text-pretty" data-v-9880527e>x-height가 큰 폰트는 글리프가 커 보이고 가독성이 향상되는 경향이 있습니다.
동일한 폰트를 사용하되, x-height 값을 다르게 설정한 예시를 아래에서 확인할 수
있습니다.
x-height 변화에 따른 가독성 차이를 직접 확인해 보세요.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname--1563259286-undefined-palette;" class="w-fit max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">Roboto Flex (작은 x-height)</div></div><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname--1563259286-undefined-palette;" class="w-fit max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">Roboto Flex (큰 x-height)</div></div><div class="text-center text-gray-500 dark:text-gray-500">텍스트를 직접 수정하며 확인해 보세요.</div></div>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="34-ascender-descender-cap-height"><a class="hover:text-teal-800" href="#34-ascender-descender-cap-height">3.4. Ascender, Descender, Cap Height</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>Ascender, Descender, Cap height도 x-height와 마찬가지로 Em Square를 기준으로
정의되는 높이 값입니다. 여기서는 간략히 각각을 소개하고 예시를 통해
살펴보겠습니다.</p>
<div class="max-w-full overflow-x-auto"><table class="mx-auto my-2 table-auto border-collapse border border-gray-300 dark:border-gray-700"><thead class="bg-gray-100 dark:bg-gray-800" style="--v255875d0:#e5e7eb;--v255884d4:#4b5563;" data-v-a4655b9c><tr class="text-pretty"><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">구분</th><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">Ascender</th><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">Descender</th><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">Cap height</th></tr></thead><tbody style="--b230077a:#f9fafb;--v361793cf:#1f2937;" data-v-a0502667><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><strong class="font-bold dark:font-extrabold">설명</strong></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">소문자에서 x-height를 넘어 위로 올라가는 부분의 높이</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">소문자에서 Baseline 아래로 내려가는 부분의 높이</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">대문자의 높이</td></tr><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><strong class="font-bold dark:font-extrabold">예시</strong></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">소문자 &#39;b&#39;, &#39;d&#39;, &#39;h&#39;, &#39;k&#39; 등</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">소문자 &#39;g&#39;, &#39;j&#39;, &#39;p&#39;, &#39;q&#39;, &#39;y&#39; 등</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">대문자 &#39;H&#39;, &#39;A&#39;, &#39;T&#39; 등</td></tr></tbody></table></div>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 pt-6 mb-4"><div style="font-palette:--fontname-574362668-undefined-palette;" class="w-full max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">Wanted Sans</div></div><div class="bg-gray-100 dark:bg-gray-800 p-2 pt-6 mb-4"><div style="font-palette:--fontname--1213214335-undefined-palette;" class="w-full max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">나눔명조</div></div><div class="text-center text-gray-500 dark:text-gray-500">텍스트를 직접 수정하며 확인해 보세요.</div></div>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="35-한중일-글리프의-크기"><a class="hover:text-teal-800" href="#35-한중일-글리프의-크기">3.5. 한중일 글리프의 크기</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>폰트에서 한중일(CJK) 문자의 글리프는 라틴 문자와 달리 Baseline과 같은 기준선이
명확하지 않습니다.
한중일 글리프의 크기와 위치는 폰트 디자이너가 라틴 문자와 시각적으로 균형 있게
보이도록 조정하며, 주로 Em Square의 중심에 맞추어 디자인됩니다.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 pt-6 mb-4"><div style="font-palette:--fontname-574362668-undefined-palette;" class="w-full max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">Wanted Sans</div></div><div class="bg-gray-100 dark:bg-gray-800 p-2 pt-6 mb-4"><div style="font-palette:--fontname--1213214335-undefined-palette;" class="w-full max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">나눔명조</div></div><div class="text-center text-gray-500 dark:text-gray-500">텍스트를 직접 수정하며 확인해 보세요.</div></div>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="36-행간line-height"><a class="hover:text-teal-800" href="#36-행간line-height">3.6. 행간(Line Height)</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>행간은 인접한 행의 Baseline 사이 거리를 의미합니다.
폰트의 기본 행간은 Ascent, Descent, Line gap의 합으로 결정됩니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>Line gap은 폰트 디자이너가 폰트 파일에 지정하는 이전 행의 Ascender와 다음 행의
Descender 사이의 추가 간격입니다.
폰트마다 다르게 설정되며, 0으로 설정된 폰트도 있습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>행간은 텍스트의 가독성과 밀접한 관련이 있습니다.
줄 간격이 넓을수록 가독성이 향상되지만, 지나치면 행 간 연결성이 떨어집니다.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 pt-6 mb-4"><div class="w-full min-h-60 relative flex items-center justify-center"><div style="font-palette:--fontname-574362668-undefined-palette;" class="w-full max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div></div><div class="flex gap-1 p-1"><div class="shrink-0 py-1 text-center">행간</div><div class="min-w-16 shrink-0 py-1 text-center font-mono">125px</div><input class="w-full accent-teal-600 dark:accent-teal-500" type="range" min="65" max="125" step="1" value="125"><button class="w-16 shrink-0 font-medium text-teal-600 hover:bg-teal-700 hover:text-white dark:text-teal-400 dark:hover:bg-teal-600 dark:hover:text-white">Play</button></div><div class="text-center mt-2">Wanted Sans</div></div><div class="text-center text-gray-500 dark:text-gray-500">텍스트를 직접 수정하며 확인해 보세요.</div></div>
<p class="my-2 text-pretty" data-v-9880527e>위 예시에서 행간값이 변화함에 따라 실제 Baseline 간의 간격이 달라지는 것을
확인할 수 있습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>파란색 선으로 표시된 Line box 기준선들은 한 행의 시작 위치와 끝 위치를
나타냅니다.
Line box는 Line gap을 절반으로 나누어 위아래에 추가한 영역이 됩니다.
만약 Line gap이 0이라면 Line box는 Ascender와 Descender에 딱 맞게 설정됩니다.</p>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="37-정리"><a class="hover:text-teal-800" href="#37-정리">3.7. 정리</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>지금까지 알아본 용어를 정리하면 다음과 같습니다.</p>
<div class="max-w-full overflow-x-auto"><table class="mx-auto my-2 table-auto border-collapse border border-gray-300 dark:border-gray-700"><thead class="bg-gray-100 dark:bg-gray-800" style="--v255875d0:#e5e7eb;--v255884d4:#4b5563;" data-v-a4655b9c><tr class="text-pretty"><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">용어</th><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:left;">설명</th></tr></thead><tbody style="--b230077a:#f9fafb;--v361793cf:#1f2937;" data-v-a0502667><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">Em Square</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:left;">폰트 내부 좌표계의 기준 격자 (1000, 1024, 2048 등)</td></tr><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">Baseline</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:left;">글리프가 배치되는 가상의 수평 기준선</td></tr><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">x-height</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:left;">소문자 &#39;x&#39;의 높이 (소문자의 기본 높이)</td></tr><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">Ascender</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:left;">소문자에서 x-height를 넘어 올라가는 부분</td></tr><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">Descender</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:left;">소문자에서 Baseline 아래로 내려가는 부분</td></tr><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">Cap height</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:left;">대문자의 높이 (보통 Ascender보다 낮음)</td></tr><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">행간</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:left;">인접한 행의 Baseline 사이 거리 (Ascent + Descent + Line gap)</td></tr></tbody></table></div>
<p class="my-2 text-pretty" data-v-9880527e>이제 이러한 개념들을 바탕으로 폰트에서 조절할 수 있는 다양한 속성들에 대해
살펴보겠습니다.</p>
<h2 class="my-6 text-balance text-3xl font-extrabold dark:font-black" id="4-폰트로-할-수-있는-것"><a class="hover:text-teal-800 dark:hover:text-teal-400" href="#4-폰트로-할-수-있는-것">4. 폰트로 할 수 있는 것</a></h2>
<p class="my-2 text-pretty" data-v-9880527e>먼저 우리가 가장 일반적으로 조절하는 속성인 크기, 굵기, 기울임부터
알아보겠습니다.</p>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="41-크기size"><a class="hover:text-teal-800" href="#41-크기size">4.1. 크기(Size)</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>폰트의 크기를 16px로 지정한다는 것은 어떤 값을 16px로 설정한다는 뜻일까요?</p>
<p class="my-2 text-pretty" data-v-9880527e>폰트의 크기는 Em Square의 크기를 의미합니다.
즉, 폰트 크기를 지정한다는 것은 Em Square의 크기를 지정하는 것과 같습니다.
따라서 폰트 크기를 16px로 지정하면, Em Square의 크기가 16px로 설정됩니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>Em Square 자체에는 단위가 없으므로, 폰트 크기를 지정할 때는 반드시 단위를 함께
명시해야 합니다.
디지털 환경에서는 주로 px 단위를 사용하지만, 인쇄물에서는 pt 단위를 일반적으로
사용합니다.
각 단위에 대한 설명은 대략적인 다음과 같습니다.</p>
<div class="max-w-full overflow-x-auto"><table class="mx-auto my-2 table-auto border-collapse border border-gray-300 dark:border-gray-700"><thead class="bg-gray-100 dark:bg-gray-800" style="--v255875d0:#e5e7eb;--v255884d4:#4b5563;" data-v-a4655b9c><tr class="text-pretty"><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">단위</th><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:left;">이름</th><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">설명</th></tr></thead><tbody style="--b230077a:#f9fafb;--v361793cf:#1f2937;" data-v-a0502667><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">px</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:left;">Pixel</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">화면 기준 단위</td></tr><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">pt</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:left;">Point</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">1/72 inch, 주로 인쇄물에서 사용</td></tr></tbody></table></div>
<p class="my-2 text-pretty" data-v-9880527e>또, 서로 다른 두 폰트를 모두 동일한 크기로 지정한다고 하더라도 글리프의
시각적 크기가 동일하다고 보장할 수는 없습니다.
Em Square는 폰트 디자이너가 임의로 정하는 값이고, x-height, Ascender,
Descender 등의 비율도 폰트마다 다르기 때문입니다.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 pt-6 mb-4"><div style="font-palette:--fontname-574362668-undefined-palette;" class="w-full max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">Wanted Sans, 100px</div></div><div class="bg-gray-100 dark:bg-gray-800 p-2 pt-6 mb-4"><div style="font-palette:--fontname-680605479-undefined-palette;" class="w-full max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">Tangerine, 100px</div></div><div class="text-center text-gray-500 dark:text-gray-500">텍스트를 직접 수정하며 확인해 보세요.</div></div>
<p class="my-2 text-pretty" data-v-9880527e>위 예시에서는 Wanted Sans와 Tangerine 폰트를 각각 동일한 100px 크기로
지정했습니다.
그러므로 Em Square의 크기가 100px로 동일하지만, 글리프의 시각적 크기는 매우
다르게 나타나는 것을 볼 수 있습니다.</p>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="42-굵기weight"><a class="hover:text-teal-800" href="#42-굵기weight">4.2. 굵기(Weight)</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>폰트의 굵기는 숫자로 표현되며, 일반적으로 100부터 900까지 100단위로
조절됩니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>우리가 기본적으로 사용하는 굵기 값은 400으로, 보통(Regular) 굵기에 해당합니다.
만약 우리가 굵은(Bold) 굵기를 사용한다고 하면, 보통 700 값을 사용하게 됩니다.
하지만 만약 폰트가 제공하는 굵기 값이 더 다양하다면, 100부터 900까지
원하는 굵기를 자유롭게 선택할 수 있습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>반대로, 만약 폰트가 특정 굵기 값만 제공한다면, 우리가 지정한 굵기 값이
존재하지 않을 경우 가장 가까운 굵기 값으로 대체됩니다.
만약 폰트에 굵은 굵기를 제공하지 않는다면, 웹 브라우저나 운영체제 등에서는
임의로 만들어낸 가짜 굵은(Faux Bold) 굵기를 사용하게 된다는 점을 유의해야
합니다.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2"><div style="font-palette:--fontname--1563259286-undefined-palette;" class="w-fit max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div></div><div class="bg-gray-100 dark:bg-gray-800 p-2"><div style="font-palette:--fontname--1563259286-undefined-palette;" class="w-fit max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div></div><div class="bg-gray-100 dark:bg-gray-800 p-2"><div style="font-palette:--fontname--1563259286-undefined-palette;" class="w-fit max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div></div><div class="bg-gray-100 dark:bg-gray-800 p-2"><div style="font-palette:--fontname--1563259286-undefined-palette;" class="w-fit max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div></div><div class="bg-gray-100 dark:bg-gray-800 p-2"><div style="font-palette:--fontname--1563259286-undefined-palette;" class="w-fit max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div></div><div class="bg-gray-100 dark:bg-gray-800 p-2"><div style="font-palette:--fontname--1563259286-undefined-palette;" class="w-fit max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div></div><div class="bg-gray-100 dark:bg-gray-800 p-2"><div style="font-palette:--fontname--1563259286-undefined-palette;" class="w-fit max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div></div><div class="bg-gray-100 dark:bg-gray-800 p-2"><div style="font-palette:--fontname--1563259286-undefined-palette;" class="w-fit max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div></div><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname--1563259286-undefined-palette;" class="w-fit max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">Roboto Flex - 굵기 100 ~ 900</div></div><div class="text-center text-gray-500 dark:text-gray-500">텍스트를 직접 수정하며 확인해 보세요.</div></div>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="43-이탤릭italic-오블리크oblique"><a class="hover:text-teal-800" href="#43-이탤릭italic-오블리크oblique">4.3. 이탤릭(Italic), 오블리크(Oblique)</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>글리프를 오른쪽으로 기울여 표현하기 위해 우리는 보통 이탤릭으로 표현한다고
말합니다.
그러나 사실 글리프를 단순히 기울이는 방식은 오블리크라고 부르며, 이탤릭과는
구분되는 개념입니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>이탤릭은 글리프의 형태 자체를 변경하는 별도의 스타일입니다.
15세기 이탈리아에서 유래한 이탤릭체는 필기체의 영향을 받아 글리프의 형태가
독특하게 디자인되었습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>그러나 일반적으로 폰트를 사용할 때는 두 가지 스타일을 구분하지 않고 모두
이탤릭이라고 부르는 경우가 많습니다.
실제로 웹 브라우저나 운영체제에서도 오블리크와 이탤릭을 구분하지 않고 모두
이탤릭 스타일로 처리하는 경우가 많습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>만약 폰트에 오블리크와 이탤릭 스타일 둘 다 존재하지 않는다면, 웹 브라우저나
운영체제에서는 임의로 만들어낸 가짜 이탤릭(Faux Italic) 스타일을 사용하게
됩니다.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname--1499307144-undefined-palette;" class="w-full max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">Geologica, 일반</div></div><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname--1499307144-undefined-palette;" class="w-full max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">Geologica, 오블리크</div></div><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname--1499307144-undefined-palette;" class="w-full max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">Geologica, 이탤릭</div></div><div class="text-center text-gray-500 dark:text-gray-500">텍스트를 직접 수정하며 확인해 보세요.</div></div>
<p class="my-2 text-pretty" data-v-9880527e>위 예시에서 Geologica에서 제공하는 일반, 오블리크, 이탤릭<sup><a href="#user-content-fn-2" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300" id="user-content-fnref-2" data-footnote-ref="true" aria-describedby="footnote-label">2</a></sup> 스타일의 차이점을
확인할 수 있습니다.
특히 소문자 &#39;a&#39;와 &#39;g&#39;에서 스타일별로 글리프 형태가 어떻게 달라지는지
비교해 보세요.</p>
<h2 class="my-6 text-balance text-3xl font-extrabold dark:font-black" id="5-opentype의-타이포그래피-기능"><a class="hover:text-teal-800 dark:hover:text-teal-400" href="#5-opentype의-타이포그래피-기능">5. OpenType의 타이포그래피 기능</a></h2>
<p class="my-2 text-pretty" data-v-9880527e>OpenType은 1990년대에 Adobe와 Microsoft가 공동 개발한 폰트 기술입니다.
우리가 흔히 사용하는 크기, 굵기, 기울임 외에도 다양한 타이포그래피 기능을
지원합니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>OpenType에서 지원하는 타이포그래피 기능들은 폰트 디자이너가 폰트 파일에
직접 정의하며, 폰트마다 다르게 지원하는 기능들이 다릅니다.
따라서 앞으로 설명하는 OpenType 기능들이 모든 폰트에서 동일하게
지원되지 않는다는 점에 주의하세요.</p>
<p class="my-2 text-pretty" data-v-9880527e>그런데도, OpenType으로 지원되는 기능을 사용하면, 더욱 풍부하고 미려한
타이포그래피를 구현할 수 있습니다.
여기서는 먼저 대표적으로 사용되는 OpenType 기능들을 소개하고, 예시를 통해
살펴보겠습니다.</p>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="51-합자ligature"><a class="hover:text-teal-800" href="#51-합자ligature">5.1. 합자(Ligature)</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>합자는 연속된 문자를 하나의 새로운 글리프로 표현하는 기능입니다.
&#39;ff&#39;, &#39;fi&#39;, &#39;fl&#39;, &#39;ffi&#39;, &#39;ffl&#39; 같은 조합에서 자주 사용됩니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>OpenType에서 합자는 네 가지로 구분되지만, 여기서는 자주 사용되는 두 가지 유형을
소개하겠습니다.</p>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Standard Ligature</strong>: 기본적으로 활성화되는 일반적인 합자 (&#39;liga&#39;)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Discretionary Ligature</strong>: 선택적으로 사용하는 장식적인 합자 (&#39;dlig&#39;)</li>
</ul>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname--80724564-undefined-palette;" class="w-full max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="flex items-center gap-x-3 w-fit mx-auto mt-2"><label for="what-is-font-mdx-toggle-switch-liga" class="text-sm">Standard Ligature: </label><label for="what-is-font-mdx-toggle-switch-liga" class="relative inline-block h-6 w-11 cursor-pointer"><input type="checkbox" id="what-is-font-mdx-toggle-switch-liga" checked class="peer sr-only"><span class="absolute inset-0 rounded-full bg-gray-200 transition-colors duration-200 ease-in-out peer-checked:bg-teal-600 peer-disabled:pointer-events-none peer-disabled:opacity-50 dark:bg-neutral-700 dark:peer-checked:bg-teal-500"></span><span class="shadow-xs absolute start-0.5 top-1/2 size-5 -translate-y-1/2 rounded-full bg-white transition-transform duration-200 ease-in-out peer-checked:translate-x-full dark:bg-neutral-400 dark:peer-checked:bg-white"></span></label></div><div class="text-center mt-2">D2 Coding</div></div><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname-574362668-undefined-palette;" class="w-full max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="flex items-center gap-x-3 w-fit mx-auto mt-2"><label for="what-is-font-mdx-toggle-switch-dilg" class="text-sm">Discretionary Ligature: </label><label for="what-is-font-mdx-toggle-switch-dilg" class="relative inline-block h-6 w-11 cursor-pointer"><input type="checkbox" id="what-is-font-mdx-toggle-switch-dilg" checked class="peer sr-only"><span class="absolute inset-0 rounded-full bg-gray-200 transition-colors duration-200 ease-in-out peer-checked:bg-teal-600 peer-disabled:pointer-events-none peer-disabled:opacity-50 dark:bg-neutral-700 dark:peer-checked:bg-teal-500"></span><span class="shadow-xs absolute start-0.5 top-1/2 size-5 -translate-y-1/2 rounded-full bg-white transition-transform duration-200 ease-in-out peer-checked:translate-x-full dark:bg-neutral-400 dark:peer-checked:bg-white"></span></label></div><div class="text-center mt-2">Wanted Sans</div></div><div class="text-center text-gray-500 dark:text-gray-500">텍스트를 직접 수정하며 확인해 보세요. <br>참고: 위 예시에서 하이라이트 되지 않은 다른 문자 조합에서도 합자가 적용될 수 있습니다.</div></div>
<p class="my-2 text-pretty" data-v-9880527e>D2 Coding은 프로그래밍 연산자(&#39;&gt;=&#39;, &#39;!=&#39; 등)를 합자로 처리하여 코드 가독성을
높입니다.
폰트의 목적상 기본적으로 합자가 적용되어야 하므로, Standard Ligature로 적용된
것을 확인할 수 있습니다.
Wanted Sans는 Discretionary Ligature로 &#39;ff&#39;, &#39;fi&#39;, &#39;fl&#39; 조합을 더 미려하게
표현할 수 있도록 합자를 제공합니다.</p>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="52-커닝kerning"><a class="hover:text-teal-800" href="#52-커닝kerning">5.2. 커닝(Kerning)</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>커닝은 특정 글리프 쌍 사이의 공백을 조절하여 시각적으로 균형 있게 표현하는
기능입니다.
&#39;AV&#39;, &#39;Te&#39;, &#39;W.&#39; 등의 문자 조합에서 자주 사용되며, 기본적으로 활성화되어
있습니다.
커닝은 폰트 디자이너가 글리프 쌍마다 개별적으로 설정하는 값이기 때문에,
폰트마다 커닝이 적용되는 글리프 쌍이 다를 수 있습니다.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname-574362668-undefined-palette;" class="w-full max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="flex items-center gap-x-3 w-fit mx-auto mt-2"><label for="what-is-font-mdx-toggle-switch-kern" class="text-sm">커닝: </label><label for="what-is-font-mdx-toggle-switch-kern" class="relative inline-block h-6 w-11 cursor-pointer"><input type="checkbox" id="what-is-font-mdx-toggle-switch-kern" checked class="peer sr-only"><span class="absolute inset-0 rounded-full bg-gray-200 transition-colors duration-200 ease-in-out peer-checked:bg-teal-600 peer-disabled:pointer-events-none peer-disabled:opacity-50 dark:bg-neutral-700 dark:peer-checked:bg-teal-500"></span><span class="shadow-xs absolute start-0.5 top-1/2 size-5 -translate-y-1/2 rounded-full bg-white transition-transform duration-200 ease-in-out peer-checked:translate-x-full dark:bg-neutral-400 dark:peer-checked:bg-white"></span></label></div><div class="text-center mt-2">Wanted Sans</div></div><div class="text-center text-gray-500 dark:text-gray-500">텍스트를 직접 수정하며 확인해 보세요. <br>참고: 위 예시에서 하이라이트 되지 않은 다른 문자 조합에서도 커닝이 적용될 수 있습니다.</div></div>
<p class="my-2 text-pretty" data-v-9880527e>커닝을 토글 하면서 위 예시를 확인해 보세요.
커닝이 적용되지 않았을 때는 &#39;AV&#39;, &#39;Te&#39; 등의 글리프 쌍 사이 간격이 지나치게
넓어져서 어색하게 보이는 것을 알 수 있습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>주제에서는 약간 벗어나지만, 커닝을 주제로 하는 웹 게임도 있습니다.
커닝이 적용되지 않은 글리프 사이 간격을 직접 조절하고, 실제 정확한 커닝 값과
얼마나 가까운지 점수를 매기는 게임입니다.
<a href="https://type.method.ac/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Kern Type</a>에서 플레이할 수 있으니, 관심 있다면 한번
플레이해 보세요!</p>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="53-opentype-기능opentype-features"><a class="hover:text-teal-800" href="#53-opentype-기능opentype-features">5.3. OpenType 기능(OpenType Features)</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>합자와 커닝을 포함하여, OpenType은 다양한 고급 타이포그래피 기능을 제공합니다.
위에서도 언급했던 것처럼, 폰트별로 실제로 사용할 수 있는 기능들은 폰트
디자이너가 정의하기 때문에, 폰트마다 지원하는 기능들이 다릅니다.
따라서 각 폰트의 문서나 설명을 참고하여 어떤 OpenType 기능들을 지원하는지
확인하는 것이 좋습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>OpenType 기능들은 4자리로 된 태그(tag)로 구분됩니다.
예를 들어, 합자 기능은 &#39;liga&#39;, 커닝 기능은 &#39;kern&#39; 태그로 표현됩니다.
또, 미리 정의된 태그 외에도 폰트 디자이너가 원하는 경우 임의로 태그를 정의하여
추가 기능을 구현할 수도 있습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>만약 소유한 폰트가 어떤 OpenType 기능들을 지원하는지 확인하고 싶다면,
<a href="https://fontdrop.info/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">FontDrop!</a> 웹사이트를 이용해 보세요.
폰트 파일을 올리면, 해당 폰트에서 지원하는 OpenType 기능들을 확인할 수
있습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>여기서는 예시를 통해 몇 가지 OpenType 기능들을 살펴보겠습니다.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname-574362668-undefined-palette;" class="w-full max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="flex items-center gap-x-3 w-fit mx-auto mt-2"><label for="what-is-font-mdx-toggle-switch-tnum" class="text-sm">고정폭 숫자(Tabular Figures): </label><label for="what-is-font-mdx-toggle-switch-tnum" class="relative inline-block h-6 w-11 cursor-pointer"><input type="checkbox" id="what-is-font-mdx-toggle-switch-tnum" checked class="peer sr-only"><span class="absolute inset-0 rounded-full bg-gray-200 transition-colors duration-200 ease-in-out peer-checked:bg-teal-600 peer-disabled:pointer-events-none peer-disabled:opacity-50 dark:bg-neutral-700 dark:peer-checked:bg-teal-500"></span><span class="shadow-xs absolute start-0.5 top-1/2 size-5 -translate-y-1/2 rounded-full bg-white transition-transform duration-200 ease-in-out peer-checked:translate-x-full dark:bg-neutral-400 dark:peer-checked:bg-white"></span></label></div><div style="font-palette:--fontname-574362668-undefined-palette;" class="w-full max-w-full mx-auto mt-2"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="flex items-center gap-x-3 w-fit mx-auto mt-2"><label for="what-is-font-mdx-toggle-switch-case" class="text-sm">대문자에 맞춤(Case-sensitive Forms): </label><label for="what-is-font-mdx-toggle-switch-case" class="relative inline-block h-6 w-11 cursor-pointer"><input type="checkbox" id="what-is-font-mdx-toggle-switch-case" checked class="peer sr-only"><span class="absolute inset-0 rounded-full bg-gray-200 transition-colors duration-200 ease-in-out peer-checked:bg-teal-600 peer-disabled:pointer-events-none peer-disabled:opacity-50 dark:bg-neutral-700 dark:peer-checked:bg-teal-500"></span><span class="shadow-xs absolute start-0.5 top-1/2 size-5 -translate-y-1/2 rounded-full bg-white transition-transform duration-200 ease-in-out peer-checked:translate-x-full dark:bg-neutral-400 dark:peer-checked:bg-white"></span></label></div><div style="font-palette:--fontname-574362668-undefined-palette;" class="w-full max-w-full mx-auto mt-2"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="flex items-center gap-x-3 w-fit mx-auto mt-2"><label for="what-is-font-mdx-toggle-switch-frac" class="text-sm">분수(Fractions): </label><label for="what-is-font-mdx-toggle-switch-frac" class="relative inline-block h-6 w-11 cursor-pointer"><input type="checkbox" id="what-is-font-mdx-toggle-switch-frac" checked class="peer sr-only"><span class="absolute inset-0 rounded-full bg-gray-200 transition-colors duration-200 ease-in-out peer-checked:bg-teal-600 peer-disabled:pointer-events-none peer-disabled:opacity-50 dark:bg-neutral-700 dark:peer-checked:bg-teal-500"></span><span class="shadow-xs absolute start-0.5 top-1/2 size-5 -translate-y-1/2 rounded-full bg-white transition-transform duration-200 ease-in-out peer-checked:translate-x-full dark:bg-neutral-400 dark:peer-checked:bg-white"></span></label></div><div style="font-palette:--fontname-574362668-undefined-palette;" class="w-full max-w-full mx-auto mt-2"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="flex items-center gap-x-3 w-fit mx-auto mt-2"><label for="what-is-font-mdx-toggle-switch-ss03" class="text-sm">스타일 세트 3(Stylistic Set 3): </label><label for="what-is-font-mdx-toggle-switch-ss03" class="relative inline-block h-6 w-11 cursor-pointer"><input type="checkbox" id="what-is-font-mdx-toggle-switch-ss03" checked class="peer sr-only"><span class="absolute inset-0 rounded-full bg-gray-200 transition-colors duration-200 ease-in-out peer-checked:bg-teal-600 peer-disabled:pointer-events-none peer-disabled:opacity-50 dark:bg-neutral-700 dark:peer-checked:bg-teal-500"></span><span class="shadow-xs absolute start-0.5 top-1/2 size-5 -translate-y-1/2 rounded-full bg-white transition-transform duration-200 ease-in-out peer-checked:translate-x-full dark:bg-neutral-400 dark:peer-checked:bg-white"></span></label></div><div class="text-center mt-2">Wanted Sans</div></div><div class="text-center text-gray-500 dark:text-gray-500">텍스트를 직접 수정하며 확인해 보세요.</div></div>
<p class="my-2 text-pretty" data-v-9880527e>위 예시에서는 Wanted Sans에서 다음 네 가지 OpenType 기능들을 사용해 볼 수
있습니다.</p>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">고정폭 숫자(Tabular Figures, &#39;tnum&#39;)</strong>: 모든 숫자를 동일한 폭으로
표현하여 표나 재무 문서에서 정렬이 쉽게 합니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">대문자에 맞춤(Case-sensitive Forms, &#39;case&#39;)</strong>: 수학 기호나 특수 문자를
대문자 높이에 맞게 조정하여 시각적 일관성을 높입니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">분수(Fractions, &#39;frac&#39;)</strong>: 슬래시(&#39;/&#39;)를 기준으로 분자와 분모를 작게 조정하여
분수를 표현합니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">스타일 세트 3(Stylistic Set 3, &#39;ss03&#39;)</strong>: 폰트 디자이너가 정의한
대체 글리프 세트를 적용합니다.
예시에서는 숫자 &#39;2&#39;, &#39;3&#39;과 소문자 &#39;a&#39;, &#39;e&#39;, &#39;f&#39;, &#39;g&#39;, &#39;r&#39; 글리프가
변경됩니다.</li>
</ul>
<p class="my-2 text-pretty" data-v-9880527e>이외에도 정말로 다양한 OpenType 기능들이 존재합니다.
더 많은 기능을 살펴보고 싶다면,
<a href="https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Registered features (OpenType 1.9.1) - Typography | Microsoft Learn</a>
문서를 참고하세요.</p>
<h2 class="my-6 text-balance text-3xl font-extrabold dark:font-black" id="6-가변-폰트variable-fonts"><a class="hover:text-teal-800 dark:hover:text-teal-400" href="#6-가변-폰트variable-fonts">6. 가변 폰트(Variable Fonts)</a></h2>
<p class="my-2 text-pretty" data-v-9880527e>가변 폰트는 OpenType Font Variations이라고도 불리며, 2016년에 도입되어 비교적
새로운 폰트 기술입니다.
하나의 폰트 파일에 굵기, 너비, 기울기 등의 다양한 속성들을 포함할 수 있도록
설계되었으며, 폰트를 사용할 때 원하는 속성값을 지정하여 사용할 수 있습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>기존에는 각각의 속성값마다 별도의 폰트 파일이 필요했지만, 가변 폰트는 하나의
파일에서 다양한 속성값을 지원할 수 있기 때문에, 폰트 파일의 크기를 줄이고
관리하기 쉽게 만드는 장점이 있습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>가변 폰트에서는 조절할 수 있는 속성을 축(Axis)이라고 부릅니다.
각 축은 OpenType 기능과 유사하게 4자리 태그로 구분됩니다.
이러한 축 중 미리 정의된 축은 다음의 5가지가 있습니다.</p>
<div class="max-w-full overflow-x-auto"><table class="mx-auto my-2 table-auto border-collapse border border-gray-300 dark:border-gray-700"><thead class="bg-gray-100 dark:bg-gray-800" style="--v255875d0:#e5e7eb;--v255884d4:#4b5563;" data-v-a4655b9c><tr class="text-pretty"><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">이름</th><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">설명</th><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">축 태그</th><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">범위</th><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">기본값</th></tr></thead><tbody style="--b230077a:#f9fafb;--v361793cf:#1f2937;" data-v-a0502667><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><strong class="font-bold dark:font-extrabold">Weight</strong></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">굵기</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">wght</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">1~1000</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">400 (필수)</td></tr><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><strong class="font-bold dark:font-extrabold">Width</strong></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">너비</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">wdth</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">1~</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">100 (필수)</td></tr><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><strong class="font-bold dark:font-extrabold">Slant</strong></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">기울기</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">slnt</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">-90~90</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">0 (필수)</td></tr><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><strong class="font-bold dark:font-extrabold">Italic</strong></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">이탤릭</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">ital</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">0~1</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">0 (필수)</td></tr><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><strong class="font-bold dark:font-extrabold">Optical Size</strong></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">시각적 크기</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">opsz</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">0~</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">10~16 (권장)</td></tr></tbody></table></div>
<p class="my-2 text-pretty" data-v-9880527e>위 다섯 가지 축은 가변 폰트에서 자주 사용되지만, 모든 가변 폰트가 반드시 이
축들을 모두 지원하는 것은 아닙니다.
예를 들어, 어떤 가변 폰트는 굵기 축만 지원할 수도 있고, 또 다른 폰트는 굵기
축과 너비 축만 지원할 수도 있습니다.
또, 범위와 기본값도 폰트마다 다를 수 있습니다.
따라서 사용하기 전에 해당 폰트의 문서를 참고하는 것이 좋습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>OpenType 기능들과 마찬가지로, 소유한 폰트가 어떤 축들을 지원하는지 확인하고
싶다면, <a href="https://fontdrop.info/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">FontDrop!</a> 웹사이트를 이용해 보세요.
폰트 파일을 올리면, 해당 폰트에서 지원하는 축들을 확인할 수 있습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>폰트 디자이너는 이 외에도 필요에 따라 추가적인 축을 정의할 수 있습니다.
예를 들어 Cursive (&#39;CRSV&#39;), Grade (&#39;GRAD&#39;) 등 폰트마다 고유한 축이 존재할 수
있습니다.
여기서는 위에서 소개한 다섯 가지 축을 중심으로, 가변 폰트에서 조절할 수 있는
속성들을 살펴보겠습니다.</p>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="61-굵기-축weight-axis-너비-축width-axis"><a class="hover:text-teal-800" href="#61-굵기-축weight-axis-너비-축width-axis">6.1. 굵기 축(Weight Axis), 너비 축(Width Axis)</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>굵기 축은 글리프의 굵기를, 너비 축은 글리프의 수평 너비(장평)를 조절하기 위한
축입니다.
아래 예시에서 굵기 축과 너비 축을 각각 조절해 보세요.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname-574362668-undefined-palette;" class="w-full max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="flex gap-1 p-1"><div class="shrink-0 py-1 text-center">굵기 축</div><div class="min-w-16 shrink-0 py-1 text-center font-mono">400</div><input class="w-full accent-teal-600 dark:accent-teal-500" type="range" min="400" max="1000" step="1" value="400"><button class="w-16 shrink-0 font-medium text-teal-600 hover:bg-teal-700 hover:text-white dark:text-teal-400 dark:hover:bg-teal-600 dark:hover:text-white">Play</button></div><div class="text-center mt-2">Wanted Sans</div></div><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname--1563259286-undefined-palette;" class="w-full max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="flex gap-1 p-1"><div class="shrink-0 py-1 text-center">너비 축</div><div class="min-w-16 shrink-0 py-1 text-center font-mono">100</div><input class="w-full accent-teal-600 dark:accent-teal-500" type="range" min="25" max="151" step="1" value="100"><button class="w-16 shrink-0 font-medium text-teal-600 hover:bg-teal-700 hover:text-white dark:text-teal-400 dark:hover:bg-teal-600 dark:hover:text-white">Play</button></div><div class="text-center mt-2">Roboto Flex</div></div><div class="text-center text-gray-500 dark:text-gray-500">텍스트를 직접 수정하며 확인해 보세요.</div></div>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="62-기울기-축slant-axis-이탤릭-축italic-axis"><a class="hover:text-teal-800" href="#62-기울기-축slant-axis-이탤릭-축italic-axis">6.2. 기울기 축(Slant Axis), 이탤릭 축(Italic Axis)</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>기울기 축은 글리프의 기울기(오블리크)를 조절하고, 이탤릭 축은 글리프의 이탤릭
형태를 조절합니다.
아래 예시에서 기울기 축과 이탤릭 축을 각각 조절해 보세요.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname--1499307144-undefined-palette;" class="w-full max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="flex gap-1 p-1"><div class="shrink-0 py-1 text-center">기울기 축</div><div class="min-w-16 shrink-0 py-1 text-center font-mono">0.0</div><input class="w-full accent-teal-600 dark:accent-teal-500" type="range" min="-12" max="0" step="0.1" value="0"><button class="w-16 shrink-0 font-medium text-teal-600 hover:bg-teal-700 hover:text-white dark:text-teal-400 dark:hover:bg-teal-600 dark:hover:text-white">Play</button></div><div class="text-center mt-2">Geologica</div></div><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname--431961695-undefined-palette;" class="w-full max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="flex gap-1 p-1"><div class="shrink-0 py-1 text-center">이탤릭 축</div><div class="min-w-16 shrink-0 py-1 text-center font-mono">0.00</div><input class="w-full accent-teal-600 dark:accent-teal-500" type="range" min="0" max="2" step="0.01" value="0"><button class="w-16 shrink-0 font-medium text-teal-600 hover:bg-teal-700 hover:text-white dark:text-teal-400 dark:hover:bg-teal-600 dark:hover:text-white">Play</button></div><div class="text-center mt-2">Jost*</div></div><div class="text-center text-gray-500 dark:text-gray-500">텍스트를 직접 수정하며 확인해 보세요.</div></div>
<p class="my-2 text-pretty" data-v-9880527e>Jost*에서는 이탤릭 축 값이 0.50을 초과하면 소문자 &#39;a&#39;의 형태가 급격히
변경됩니다.
가변 폰트의 축 값이 연속적이더라도, 특정 임곗값에서 글리프 형태가 변경되도록
디자인할 수 있음을 알 수 있습니다.</p>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="63-시각적-크기-축optical-size-axis"><a class="hover:text-teal-800" href="#63-시각적-크기-축optical-size-axis">6.3. 시각적 크기 축(Optical Size Axis)</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>시각적 크기 축은 폰트 크기에 따라 글리프 디자인을 최적화하기 위한 축입니다.
글리프가 작은 크기에서는 더 두껍고 명확하게, 큰 크기에서는 더 섬세하게 보이도록
조절합니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>대부분의 환경에서는 별도로 시각적 크기 축을 조절하지 않아도 폰트 크기에 따라
자동으로 시각적 크기가 조절됩니다.
그러나 폰트를 사용할 때 시각적 크기 축을 수동으로 조절할 수도 있습니다.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname--1563259286-undefined-palette;" class="w-full max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="flex gap-1 p-1"><div class="shrink-0 py-1 text-center">시각적 크기 축</div><div class="min-w-16 shrink-0 py-1 text-center font-mono">14.0</div><input class="w-full accent-teal-600 dark:accent-teal-500" type="range" min="8" max="144" step="0.1" value="14"><button class="w-16 shrink-0 font-medium text-teal-600 hover:bg-teal-700 hover:text-white dark:text-teal-400 dark:hover:bg-teal-600 dark:hover:text-white">Play</button></div><div class="text-center mt-2">Roboto Flex</div></div><div class="text-center text-gray-500 dark:text-gray-500">텍스트를 직접 수정하며 확인해 보세요.</div></div>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div class="w-full h-40 relative flex items-center justify-center"><div style="font-palette:--fontname--1563259286-undefined-palette;" class="w-full max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div></div><div class="flex gap-1 p-1"><div class="shrink-0 py-1 text-center">크기</div><div class="min-w-16 shrink-0 py-1 text-center font-mono">14px</div><input class="w-full accent-teal-600 dark:accent-teal-500" type="range" min="8" max="100" step="1" value="14"><button class="w-16 shrink-0 font-medium text-teal-600 hover:bg-teal-700 hover:text-white dark:text-teal-400 dark:hover:bg-teal-600 dark:hover:text-white">Play</button></div><div class="flex items-center gap-x-3 w-fit mx-auto mt-2"><label for="what-is-font-mdx-toggle-switch-opsz" class="text-sm">시각적 크기 적용: </label><label for="what-is-font-mdx-toggle-switch-opsz" class="relative inline-block h-6 w-11 cursor-pointer"><input type="checkbox" id="what-is-font-mdx-toggle-switch-opsz" checked class="peer sr-only"><span class="absolute inset-0 rounded-full bg-gray-200 transition-colors duration-200 ease-in-out peer-checked:bg-teal-600 peer-disabled:pointer-events-none peer-disabled:opacity-50 dark:bg-neutral-700 dark:peer-checked:bg-teal-500"></span><span class="shadow-xs absolute start-0.5 top-1/2 size-5 -translate-y-1/2 rounded-full bg-white transition-transform duration-200 ease-in-out peer-checked:translate-x-full dark:bg-neutral-400 dark:peer-checked:bg-white"></span></label></div><div class="text-center mt-2">Roboto Flex</div></div><div class="text-center text-gray-500 dark:text-gray-500">텍스트를 직접 수정하며 확인해 보세요.</div></div>
<p class="my-2 text-pretty" data-v-9880527e>두 번째 예시에서 폰트 크기가 변경될 때 자동으로 적용되는 시각적 크기 조절을
켜고 끌 수 있습니다.
시각적 크기 조절이 활성화되어 있을 때, 작은 크기와 큰 크기에서 글리프의 굵기가
비슷하게 유지되는 것을 알 수 있습니다.</p>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="64-커스텀-축custom-axis"><a class="hover:text-teal-800" href="#64-커스텀-축custom-axis">6.4. 커스텀 축(Custom Axis)</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>위에서 설명한 축 외에도, 폰트 디자이너는 커스텀 축을 자유롭게 정의할 수
있습니다.
예를 들어, Roboto Flex는 다음과 같은 커스텀 축이 정의되어 있습니다.</p>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">&#39;YTAS&#39;</strong>: Ascender 높이 조절</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">&#39;YTDE&#39;</strong>: Descender 깊이 조절</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">&#39;YTLC&#39;</strong>: 소문자 높이 조절</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">&#39;YTUC&#39;</strong>: 대문자 높이 조절</li>
</ul>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname--1563259286-undefined-palette;" class="w-full max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="flex gap-1 p-1"><div class="shrink-0 py-1 text-center">Ascender 높이</div><div class="min-w-16 shrink-0 py-1 text-center font-mono">750</div><input class="w-full accent-teal-600 dark:accent-teal-500" type="range" min="649" max="854" step="1" value="750"><button class="w-16 shrink-0 font-medium text-teal-600 hover:bg-teal-700 hover:text-white dark:text-teal-400 dark:hover:bg-teal-600 dark:hover:text-white">Play</button></div><div class="flex gap-1 p-1"><div class="shrink-0 py-1 text-center">Descender 깊이</div><div class="min-w-16 shrink-0 py-1 text-center font-mono">-203</div><input class="w-full accent-teal-600 dark:accent-teal-500" type="range" min="-305" max="-98" step="1" value="-203"><button class="w-16 shrink-0 font-medium text-teal-600 hover:bg-teal-700 hover:text-white dark:text-teal-400 dark:hover:bg-teal-600 dark:hover:text-white">Play</button></div><div class="flex gap-1 p-1"><div class="shrink-0 py-1 text-center">소문자 높이</div><div class="min-w-16 shrink-0 py-1 text-center font-mono">514</div><input class="w-full accent-teal-600 dark:accent-teal-500" type="range" min="416" max="570" step="1" value="514"><button class="w-16 shrink-0 font-medium text-teal-600 hover:bg-teal-700 hover:text-white dark:text-teal-400 dark:hover:bg-teal-600 dark:hover:text-white">Play</button></div><div class="flex gap-1 p-1"><div class="shrink-0 py-1 text-center">대문자 높이</div><div class="min-w-16 shrink-0 py-1 text-center font-mono">712</div><input class="w-full accent-teal-600 dark:accent-teal-500" type="range" min="528" max="760" step="1" value="712"><button class="w-16 shrink-0 font-medium text-teal-600 hover:bg-teal-700 hover:text-white dark:text-teal-400 dark:hover:bg-teal-600 dark:hover:text-white">Play</button></div><div class="text-center mt-2">Roboto Flex</div></div><div class="text-center text-gray-500 dark:text-gray-500">텍스트를 직접 수정하며 확인해 보세요.</div></div>
<p class="my-2 text-pretty" data-v-9880527e>이러한 커스텀 축은 다양하게 활용될 수 있으며, 폰트 디자이너가 창의적으로 정의할
수 있습니다.
더 다양한 가변 폰트의 예시를 살펴보고 싶다면,
<a href="https://v-fonts.com/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Variable Fonts</a>를 참고하세요.</p>
<h2 class="my-6 text-balance text-3xl font-extrabold dark:font-black" id="7-특이한-폰트"><a class="hover:text-teal-800 dark:hover:text-teal-400" href="#7-특이한-폰트">7. 특이한 폰트</a></h2>
<p class="my-2 text-pretty" data-v-9880527e>일반적으로 폰트는 텍스트를 표현하기 위해 사용되지만, 특이한 목적을 위해
설계된 폰트들도 존재합니다.
여기서는 그런 특이한 폰트 중 몇 가지를 소개하겠습니다.</p>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="71-색상-폰트color-fonts"><a class="hover:text-teal-800" href="#71-색상-폰트color-fonts">7.1. 색상 폰트(Color Fonts)</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>색상 폰트는 글리프에 여러 색상을 적용할 수 있는 폰트입니다.
일반적인 폰트는 모든 글리프를 단색으로 표현하지만, 색상 폰트는 둘 이상의 색상을
사용하여 더 다양한 시각적 효과를 제공합니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>가장 널리 알려진 색상 폰트의 예시는 이모지(Emoji)를 지원하는 폰트입니다.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname--1556181116-undefined-palette;" class="w-fit max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2"><p class="my-2 text-pretty" data-v-9880527e>Noto Color Emoji</p></div></div><div class="text-center text-gray-500 dark:text-gray-500"><p class="my-2 text-pretty" data-v-9880527e>텍스트를 직접 수정하며 확인해 보세요.</p></div></div>
<p class="my-2 text-pretty" data-v-9880527e>위 예시에서는 Noto Color Emoji를 사용하여 이모지를 표시하고 있습니다.
Noto Color Emoji는 이모지에 해당하는 글리프만 포함하는 폰트이므로, 일반
텍스트를 입력하면 표시되지 않습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>이모지 외에도 팔레트(Palette)를 사용하여 다양한 색상을 표현하는 색상 폰트도
존재합니다.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname-1025376894-0-palette;" class="w-full max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="flex gap-1 p-1"><div class="shrink-0 py-1 text-center">팔레트</div><div class="min-w-16 shrink-0 py-1 text-center font-mono">0</div><input class="w-full accent-teal-600 dark:accent-teal-500" type="range" min="0" max="10" step="1" value="0"><button class="w-16 shrink-0 font-medium text-teal-600 hover:bg-teal-700 hover:text-white dark:text-teal-400 dark:hover:bg-teal-600 dark:hover:text-white">Play</button></div><div class="text-center mt-2">Rocher Color</div></div><div class="text-center text-gray-500 dark:text-gray-500">텍스트를 직접 수정하며 확인해 보세요.</div></div>
<p class="my-2 text-pretty" data-v-9880527e>Rocher Color는 11가지 팔레트를 제공하며, 팔레트 축을 조절하여 다양한 색상
조합을 확인할 수 있습니다.
만약 가지고 있는 색상 폰트가 어떤 팔레트를 지원하는지 확인하고 싶으시다면
<a href="https://wakamaifondue.com/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Wakamai Fondue</a>에서 폰트 파일을 올려 확인해
보세요.</p>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="72-딩뱃dingbat"><a class="hover:text-teal-800" href="#72-딩뱃dingbat">7.2. 딩뱃(Dingbat)</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>아직 이모지가 널리 사용되기 전, 폰트를 텍스트 대신 그림으로 활용하는 방법이
있었습니다.
딩뱃(Dingbat) 폰트는 특정 문자를 다양한 그림으로 표현하는 폰트입니다.
예를 들어, 소문자 &#39;a&#39;를 입력하면 우리가 알고 있는 소문자 &#39;a&#39;가 아닌, 다른
그림을 글리프로 표시합니다.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname-574362668-undefined-palette;" class="w-fit max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">Wanted Sans</div></div><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname--1340268353-undefined-palette;" class="w-fit max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">Auseklis</div></div><div class="text-center text-gray-500 dark:text-gray-500">텍스트를 직접 수정하며 확인해 보세요.</div></div>
<p class="my-2 text-pretty" data-v-9880527e>동일한 텍스트가 Wanted Sans에서는 일반적인 문자의 글리프로 표시되지만,
Auseklis에서는 완전히 다른 형태의 그림 글리프로 표시되는 것을 알 수 있습니다.</p>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="73-아이콘-폰트icon-fonts"><a class="hover:text-teal-800" href="#73-아이콘-폰트icon-fonts">7.3. 아이콘 폰트(Icon Fonts)</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>딩뱃과 유사하게, 특정 문자 코드에 아이콘을 매핑하여 아이콘을 표시하는 폰트도
있습니다.
이를 아이콘 폰트라고 부르며, 과거 웹에서 널리 사용되었습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>SVG가 웹 브라우저에서 널리 지원되기 전에는 아이콘을 다양한 크기와 색상으로
표현하기 어려웠습니다.
그래서 <a href="https://fontawesome.com/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Font Awesome</a>으로 대표되는 아이콘 폰트가
대중적으로 사용되었습니다.
그러나 최근에는 모든 주요 웹 브라우저가 SVG를 지원하고, SVG가 더 다양한 효과를
적용할 수 있어 아이콘 폰트의 사용이 줄어들고 있습니다.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname-1786832060-undefined-palette;" class="w-fit max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2"><p class="my-2 text-pretty" data-v-9880527e>Material Icons Round</p></div></div></div>
<p class="my-2 text-pretty" data-v-9880527e>위 예시에서는
<a href="https://fonts.google.com/icons?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Material Symbols &amp; Icons - Google Fonts</a>에서
구글이 제공하는 아이콘 폰트를 확인할 수 있습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>아이콘 폰트는 일반적인 키보드로 바로 입력하기 어려운 문자 코드에 대응하는
글리프로 아이콘을 표시하는 경우가 많습니다.
따라서 아이콘 폰트를 사용할 때는 아이콘의 문자 코드를 직접 입력하기보다는 해당
폰트를 제공하는 사이트의 아이콘 목록에서 복사하거나 전용 도구를 사용하는 것이
좋습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>그렇다고 키보드로 입력하는 것이 완전히 불가능한 것은 아닙니다.
Material Icons Round의 &#39;Home&#39; 아이콘에 해당하는 문자는 &#39;U+E88A&#39;<sup><a href="#user-content-fn-3" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300" id="user-content-fnref-3" data-footnote-ref="true" aria-describedby="footnote-label">3</a></sup> 입니다.
직접 입력을 시도해 보고 싶다면
<a href="https://en.wikipedia.org/wiki/Unicode_input?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Unicode input</a> 문서를 참고하여
입력해 보세요.</p>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="74-특수-폰트"><a class="hover:text-teal-800" href="#74-특수-폰트">7.4. 특수 폰트</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>단순한 그림이나 아이콘을 표현하는 것이 아니라, 다른 목적으로 글리프를 특수하게
표현하는 폰트들도 있습니다.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname-1984781063-undefined-palette;" class="w-fit max-w-full mx-auto mt-4"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2"><p class="my-2 text-pretty" data-v-9880527e>Libre Barcode 39 Text</p></div></div></div>
<p class="my-2 text-pretty" data-v-9880527e>Libre Barcode 39 Text는 바코드 문자를 글리프로 표현하여, 바코드 스캐너로 읽을
수 있는 바코드를 생성할 수 있습니다.
위 예시에 입력된 텍스트는 &#39;*9791158392048*&#39;로, 바코드 39 규격에
맞게 시작과 끝에 &#39;*&#39; 문자가 포함되어 있습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>Libre Barcode 39 Text를 사용하면 특별한 바코드 생성 도구 없이도, 간단히 텍스트
입력으로 바코드를 생성할 수 있습니다.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname-836131053-undefined-palette;" class="w-fit max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2"><p class="my-2 text-pretty" data-v-9880527e>Hymnus FG</p></div></div></div>
<p class="my-2 text-pretty" data-v-9880527e>Hymnus FG는 악보를 표현하기 위해 만들어진 폰트입니다.
특정 문자 조합으로 악보에 사용하는 음표와 쉼표 등을 글리프로 표현할 수
있습니다.
위 예시에 입력된 텍스트는 &#39;!—-c--d--e--f-\-G-----G----\&#39;로, 간단한 멜로디를
표현하고 있습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>이 외에도 <a href="https://www.coderelay.io/fontemon.html?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Fontemon</a>처럼 OpenType
기능(합자 등)을 활용하여 폰트 파일 안에 포켓몬 게임을 구현한 사례도 있으니,
더 흥미로운 특수 폰트를 찾아보세요!</p>
<h2 class="my-6 text-balance text-3xl font-extrabold dark:font-black" id="8-렌더링rendering"><a class="hover:text-teal-800 dark:hover:text-teal-400" href="#8-렌더링rendering">8. 렌더링(Rendering)</a></h2>
<p class="my-2 text-pretty" data-v-9880527e>지금까지는 폰트 자체에서 제공하는 기능들에 대해 살펴보았습니다.
하지만 동일한 폰트를 사용하는데도 불구하고, 폰트가 사용되는 환경에 따라 다르게
보이는 경우가 있습니다.
예를 들어, 동일한 폰트를 사용하는 웹 사이트에 접속할 때, macOS와 Windows에서
글리프가 다르게 보일 수 있습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>이러한 현상이 발생하는 이유는 운영체제, 브라우저, 디스플레이에 따라 폰트의
글리프를 화면에 그리는 방식, 즉 렌더링이 달라지기 때문입니다.
렌더링은 폰트 파일의 글리프 정보를 화면에 실제로 표시하는 과정입니다.
이 과정에서 텍스트의 크기, 스타일, 위치 등을 계산하여 디스플레이에 픽셀 단위로
표시합니다.</p>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="81-래스터화rasterization"><a class="hover:text-teal-800" href="#81-래스터화rasterization">8.1. 래스터화(Rasterization)</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>폰트는 글리프의 모양을 벡터로 정의합니다.
벡터는 점과 선의 수학적 좌표로 구성되어 있어, 확대하거나 축소해도 품질이
유지되어 폰트 디자이너가 의도한 글리프의 모양을 정확히 표현할 수 있습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>하지만 우리가 사용하는 디스플레이는 이미지를 픽셀 단위로 표시합니다.
아무리 폰트가 글리프의 모양을 정확하게 정의하더라도, 디스플레이에 표시하려면
픽셀 단위로 변환하는 과정이 필요합니다.
이 과정을 래스터화라고 부릅니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>래스터화 과정에서 어떤 픽셀이 어떤 색으로 채워질지 결정하면서 글리프의 모양을
디스플레이에 맞게 조정합니다.
이 과정에서 운영체제와 소프트웨어마다 래스터화 방식이 달라, 동일한 폰트를
사용하더라도 래스터화된 글리프의 모양이 다르게 보일 수 있습니다.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div class="flex flex-col items-center gap-2 mb-2 max-w-full mx-auto" data-v-c91d4a34><div class="w-full max-w-full" data-v-c91d4a34><svg xmlns="http://www.w3.org/2000/svg" class="h-full max-h-60 w-full" viewBox="0 0 2 2" data-v-c91d4a34></svg></div></div><div style="font-palette:--fontname--913515245-undefined-palette;" class="w-fit max-w-full mx-auto bg-white px-2"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">Pretendard Variable</div></div><div class="text-center text-gray-500 dark:text-gray-500">텍스트를 직접 수정하며 확인해 보세요.</div></div>
<p class="my-2 text-pretty" data-v-9880527e>위 예시에서 래스터화된 글리프의 모양을 확인할 수 있습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>위쪽 영역에는 16px 크기로 래스터화된 글리프 크게 확대하여 볼 수 있습니다.
아래쪽에서는 동일한 글리프를 100px 크기로 표시하고, 실제로 문자를 입력하며
테스트해 볼 수 있습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>래스터화된 글리프가 원본 글리프와 어떻게 다른지 확인해 보세요.</p>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="82-안티앨리어싱anti-aliasing"><a class="hover:text-teal-800" href="#82-안티앨리어싱anti-aliasing">8.2. 안티앨리어싱(Anti-aliasing)</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>래스터화에서 단순히 어떤 픽셀을 채우고 비울지만 결정하면, 글리프의 경계가
거칠게 보이는 계단 현상(Aliasing)이 발생합니다.
이러한 계단 현상은 특히 곡선이나 대각선에서 두드러지게 나타나고, 글리프의
가독성을 저하합니다.
이러한 계단 현상을 완화하기 위한 기술이 안티앨리어싱입니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>안티앨리어싱은 여러 가지 방법이 있지만, 가장 일반적인 방법은 회색조
안티앨리어싱(Grayscale Anti-aliasing)입니다.
회색조 안티앨리어싱은 글리프의 경계에 중간 밝기의 픽셀을 추가하여
계단 현상을 부드럽게 만듭니다.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div class="flex flex-col items-center gap-2 mb-2 max-w-full mx-auto" data-v-c91d4a34><div class="w-full max-w-full" data-v-c91d4a34><svg xmlns="http://www.w3.org/2000/svg" class="h-full max-h-60 w-full" viewBox="0 0 2 2" data-v-c91d4a34></svg></div></div><div style="font-palette:--fontname--913515245-undefined-palette;" class="w-fit max-w-full mx-auto bg-white px-2"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">Pretendard Variable</div></div><div class="text-center text-gray-500 dark:text-gray-500">텍스트를 직접 수정하며 확인해 보세요.</div></div>
<p class="my-2 text-pretty" data-v-9880527e>위 예시에서는 회색조 안티앨리어싱이 적용된 래스터화된 글리프를 확인할 수
있습니다.
안티앨리어싱이 적용되기 전과 비교해 보면 글리프의 경계가 훨씬 부드럽게
표현된다는 것을 알 수 있습니다.</p>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="83-서브픽셀-렌더링subpixel-rendering"><a class="hover:text-teal-800" href="#83-서브픽셀-렌더링subpixel-rendering">8.3. 서브픽셀 렌더링(Subpixel Rendering)</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>서브픽셀 렌더링은 하나의 픽셀을 구성하는 빨강, 초록, 파랑 서브픽셀을
개별적으로 제어하여 더 세밀하게 표현하는 안티앨리어싱 기법입니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>전통적인 LCD 디스플레이의 각 픽셀은 물리적으로 RGB 세 개의 서브픽셀로 구성되어
있습니다.
서브픽셀 렌더링은 이를 독립적으로 제어하여 수평 해상도를 이론적으로 3배
증가시킵니다.
예를 들어, 글리프의 왼쪽 경계가 픽셀 중간에 위치하면, 빨강 서브픽셀만 켜서 더
정밀한 위치를 표현할 수 있습니다.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div class="flex flex-col items-center gap-2 mb-2 max-w-full mx-auto" data-v-c91d4a34><div class="w-full max-w-full" data-v-c91d4a34><svg xmlns="http://www.w3.org/2000/svg" class="h-full max-h-60 w-full" viewBox="0 0 902 512" data-v-c91d4a34><rect x="1" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="31" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="61" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="91" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="121" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="151" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="181" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="211" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="241" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="271" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="301" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="331" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="361" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="391" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="421" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="451" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="481" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="511" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="541" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="571" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="601" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="631" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="661" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="691" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="721" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="751" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="781" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="811" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="841" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="871" y="1" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="1" y="31" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="31" y="31" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="61" y="31" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="91" y="31" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="121" y="31" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="151" y="31" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="181" y="31" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="211" y="31" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="241" y="31" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="271" y="31" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="301" y="31" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="331" y="31" width="30" height="30" class="cell" style="fill:rgb(255, 235, 189);" data-v-c91d4a34></rect><rect x="361" y="31" width="30" height="30" class="cell" style="fill:rgb(140, 117, 165);" data-v-c91d4a34></rect><rect x="391" y="31" width="30" height="30" class="cell" style="fill:rgb(214, 255, 255);" data-v-c91d4a34></rect><rect x="421" y="31" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="451" y="31" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="481" y="31" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="511" y="31" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="541" y="31" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="571" y="31" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="601" y="31" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="631" y="31" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="661" y="31" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="691" y="31" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="721" y="31" width="30" height="30" class="cell" style="fill:rgb(255, 255, 214);" data-v-c91d4a34></rect><rect x="751" y="31" width="30" height="30" class="cell" style="fill:rgb(165, 117, 115);" data-v-c91d4a34></rect><rect x="781" y="31" width="30" height="30" class="cell" style="fill:rgb(165, 211, 255);" data-v-c91d4a34></rect><rect x="811" y="31" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="841" y="31" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="871" y="31" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="1" y="61" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="31" y="61" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="61" y="61" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="91" y="61" width="30" height="30" class="cell" style="fill:rgb(255, 255, 247);" data-v-c91d4a34></rect><rect x="121" y="61" width="30" height="30" class="cell" style="fill:rgb(222, 199, 156);" data-v-c91d4a34></rect><rect x="151" y="61" width="30" height="30" class="cell" style="fill:rgb(140, 117, 123);" data-v-c91d4a34></rect><rect x="181" y="61" width="30" height="30" class="cell" style="fill:rgb(148, 178, 214);" data-v-c91d4a34></rect><rect x="211" y="61" width="30" height="30" class="cell" style="fill:rgb(239, 251, 255);" data-v-c91d4a34></rect><rect x="241" y="61" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="271" y="61" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="301" y="61" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="331" y="61" width="30" height="30" class="cell" style="fill:rgb(255, 219, 148);" data-v-c91d4a34></rect><rect x="361" y="61" width="30" height="30" class="cell" style="fill:rgb(66, 0, 107);" data-v-c91d4a34></rect><rect x="391" y="61" width="30" height="30" class="cell" style="fill:rgb(189, 255, 255);" data-v-c91d4a34></rect><rect x="421" y="61" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="451" y="61" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="481" y="61" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="511" y="61" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="541" y="61" width="30" height="30" class="cell" style="fill:rgb(255, 219, 148);" data-v-c91d4a34></rect><rect x="571" y="61" width="30" height="30" class="cell" style="fill:rgb(66, 0, 107);" data-v-c91d4a34></rect><rect x="601" y="61" width="30" height="30" class="cell" style="fill:rgb(189, 255, 255);" data-v-c91d4a34></rect><rect x="631" y="61" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="661" y="61" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="691" y="61" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="721" y="61" width="30" height="30" class="cell" style="fill:rgb(255, 255, 189);" data-v-c91d4a34></rect><rect x="751" y="61" width="30" height="30" class="cell" style="fill:rgb(107, 0, 0);" data-v-c91d4a34></rect><rect x="781" y="61" width="30" height="30" class="cell" style="fill:rgb(107, 186, 255);" data-v-c91d4a34></rect><rect x="811" y="61" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="841" y="61" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="871" y="61" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="1" y="91" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="31" y="91" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="61" y="91" width="30" height="30" class="cell" style="fill:rgb(255, 255, 239);" data-v-c91d4a34></rect><rect x="91" y="91" width="30" height="30" class="cell" style="fill:rgb(189, 109, 41);" data-v-c91d4a34></rect><rect x="121" y="91" width="30" height="30" class="cell" style="fill:rgb(16, 48, 82);" data-v-c91d4a34></rect><rect x="151" y="91" width="30" height="30" class="cell" style="fill:rgb(107, 117, 115);" data-v-c91d4a34></rect><rect x="181" y="91" width="30" height="30" class="cell" style="fill:rgb(99, 65, 24);" data-v-c91d4a34></rect><rect x="211" y="91" width="30" height="30" class="cell" style="fill:rgb(16, 48, 115);" data-v-c91d4a34></rect><rect x="241" y="91" width="30" height="30" class="cell" style="fill:rgb(189, 239, 255);" data-v-c91d4a34></rect><rect x="271" y="91" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="301" y="91" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="331" y="91" width="30" height="30" class="cell" style="fill:rgb(255, 219, 148);" data-v-c91d4a34></rect><rect x="361" y="91" width="30" height="30" class="cell" style="fill:rgb(66, 0, 107);" data-v-c91d4a34></rect><rect x="391" y="91" width="30" height="30" class="cell" style="fill:rgb(189, 255, 255);" data-v-c91d4a34></rect><rect x="421" y="91" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="451" y="91" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="481" y="91" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="511" y="91" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="541" y="91" width="30" height="30" class="cell" style="fill:rgb(255, 219, 148);" data-v-c91d4a34></rect><rect x="571" y="91" width="30" height="30" class="cell" style="fill:rgb(66, 0, 107);" data-v-c91d4a34></rect><rect x="601" y="91" width="30" height="30" class="cell" style="fill:rgb(189, 255, 255);" data-v-c91d4a34></rect><rect x="631" y="91" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="661" y="91" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="691" y="91" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="721" y="91" width="30" height="30" class="cell" style="fill:rgb(255, 255, 189);" data-v-c91d4a34></rect><rect x="751" y="91" width="30" height="30" class="cell" style="fill:rgb(107, 0, 0);" data-v-c91d4a34></rect><rect x="781" y="91" width="30" height="30" class="cell" style="fill:rgb(107, 186, 255);" data-v-c91d4a34></rect><rect x="811" y="91" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="841" y="91" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="871" y="91" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="1" y="121" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="31" y="121" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="61" y="121" width="30" height="30" class="cell" style="fill:rgb(247, 174, 99);" data-v-c91d4a34></rect><rect x="91" y="121" width="30" height="30" class="cell" style="fill:rgb(16, 44, 107);" data-v-c91d4a34></rect><rect x="121" y="121" width="30" height="30" class="cell" style="fill:rgb(189, 239, 255);" data-v-c91d4a34></rect><rect x="151" y="121" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="181" y="121" width="30" height="30" class="cell" style="fill:rgb(255, 255, 239);" data-v-c91d4a34></rect><rect x="211" y="121" width="30" height="30" class="cell" style="fill:rgb(173, 97, 16);" data-v-c91d4a34></rect><rect x="241" y="121" width="30" height="30" class="cell" style="fill:rgb(41, 125, 198);" data-v-c91d4a34></rect><rect x="271" y="121" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="301" y="121" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="331" y="121" width="30" height="30" class="cell" style="fill:rgb(255, 219, 148);" data-v-c91d4a34></rect><rect x="361" y="121" width="30" height="30" class="cell" style="fill:rgb(66, 0, 107);" data-v-c91d4a34></rect><rect x="391" y="121" width="30" height="30" class="cell" style="fill:rgb(189, 255, 255);" data-v-c91d4a34></rect><rect x="421" y="121" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="451" y="121" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="481" y="121" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="511" y="121" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="541" y="121" width="30" height="30" class="cell" style="fill:rgb(255, 199, 123);" data-v-c91d4a34></rect><rect x="571" y="121" width="30" height="30" class="cell" style="fill:rgb(33, 0, 66);" data-v-c91d4a34></rect><rect x="601" y="121" width="30" height="30" class="cell" style="fill:rgb(148, 219, 255);" data-v-c91d4a34></rect><rect x="631" y="121" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="661" y="121" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="691" y="121" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="721" y="121" width="30" height="30" class="cell" style="fill:rgb(255, 255, 189);" data-v-c91d4a34></rect><rect x="751" y="121" width="30" height="30" class="cell" style="fill:rgb(107, 0, 0);" data-v-c91d4a34></rect><rect x="781" y="121" width="30" height="30" class="cell" style="fill:rgb(107, 186, 255);" data-v-c91d4a34></rect><rect x="811" y="121" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="841" y="121" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="871" y="121" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="1" y="151" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="31" y="151" width="30" height="30" class="cell" style="fill:rgb(255, 255, 247);" data-v-c91d4a34></rect><rect x="61" y="151" width="30" height="30" class="cell" style="fill:rgb(173, 97, 0);" data-v-c91d4a34></rect><rect x="91" y="151" width="30" height="30" class="cell" style="fill:rgb(66, 146, 222);" data-v-c91d4a34></rect><rect x="121" y="151" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="151" y="151" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="181" y="151" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="211" y="151" width="30" height="30" class="cell" style="fill:rgb(255, 199, 123);" data-v-c91d4a34></rect><rect x="241" y="151" width="30" height="30" class="cell" style="fill:rgb(33, 36, 123);" data-v-c91d4a34></rect><rect x="271" y="151" width="30" height="30" class="cell" style="fill:rgb(198, 255, 255);" data-v-c91d4a34></rect><rect x="301" y="151" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="331" y="151" width="30" height="30" class="cell" style="fill:rgb(255, 219, 148);" data-v-c91d4a34></rect><rect x="361" y="151" width="30" height="30" class="cell" style="fill:rgb(66, 0, 107);" data-v-c91d4a34></rect><rect x="391" y="151" width="30" height="30" class="cell" style="fill:rgb(189, 255, 255);" data-v-c91d4a34></rect><rect x="421" y="151" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="451" y="151" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="481" y="151" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="511" y="151" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="541" y="151" width="30" height="30" class="cell" style="fill:rgb(198, 121, 33);" data-v-c91d4a34></rect><rect x="571" y="151" width="30" height="30" class="cell" style="fill:rgb(16, 20, 16);" data-v-c91d4a34></rect><rect x="601" y="151" width="30" height="30" class="cell" style="fill:rgb(57, 134, 206);" data-v-c91d4a34></rect><rect x="631" y="151" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="661" y="151" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="691" y="151" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="721" y="151" width="30" height="30" class="cell" style="fill:rgb(255, 255, 189);" data-v-c91d4a34></rect><rect x="751" y="151" width="30" height="30" class="cell" style="fill:rgb(107, 0, 0);" data-v-c91d4a34></rect><rect x="781" y="151" width="30" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="811" y="151" width="30" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="841" y="151" width="30" height="30" class="cell" style="fill:rgb(107, 186, 255);" data-v-c91d4a34></rect><rect x="871" y="151" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="1" y="181" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="31" y="181" width="30" height="30" class="cell" style="fill:rgb(255, 255, 222);" data-v-c91d4a34></rect><rect x="61" y="181" width="30" height="30" class="cell" style="fill:rgb(148, 69, 0);" data-v-c91d4a34></rect><rect x="91" y="181" width="30" height="30" class="cell" style="fill:rgb(107, 186, 255);" data-v-c91d4a34></rect><rect x="121" y="181" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="151" y="181" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="181" y="181" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="211" y="181" width="30" height="30" class="cell" style="fill:rgb(255, 251, 181);" data-v-c91d4a34></rect><rect x="241" y="181" width="30" height="30" class="cell" style="fill:rgb(107, 0, 66);" data-v-c91d4a34></rect><rect x="271" y="181" width="30" height="30" class="cell" style="fill:rgb(148, 219, 255);" data-v-c91d4a34></rect><rect x="301" y="181" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="331" y="181" width="30" height="30" class="cell" style="fill:rgb(255, 219, 148);" data-v-c91d4a34></rect><rect x="361" y="181" width="30" height="30" class="cell" style="fill:rgb(66, 0, 107);" data-v-c91d4a34></rect><rect x="391" y="181" width="30" height="30" class="cell" style="fill:rgb(189, 255, 255);" data-v-c91d4a34></rect><rect x="421" y="181" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="451" y="181" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="481" y="181" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="511" y="181" width="30" height="30" class="cell" style="fill:rgb(255, 219, 148);" data-v-c91d4a34></rect><rect x="541" y="181" width="30" height="30" class="cell" style="fill:rgb(74, 24, 82);" data-v-c91d4a34></rect><rect x="571" y="181" width="30" height="30" class="cell" style="fill:rgb(165, 195, 148);" data-v-c91d4a34></rect><rect x="601" y="181" width="30" height="30" class="cell" style="fill:rgb(74, 24, 74);" data-v-c91d4a34></rect><rect x="631" y="181" width="30" height="30" class="cell" style="fill:rgb(132, 203, 239);" data-v-c91d4a34></rect><rect x="661" y="181" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="691" y="181" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="721" y="181" width="30" height="30" class="cell" style="fill:rgb(255, 255, 189);" data-v-c91d4a34></rect><rect x="751" y="181" width="30" height="30" class="cell" style="fill:rgb(107, 0, 0);" data-v-c91d4a34></rect><rect x="781" y="181" width="30" height="30" class="cell" style="fill:rgb(107, 186, 255);" data-v-c91d4a34></rect><rect x="811" y="181" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="841" y="181" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="871" y="181" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="1" y="211" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="31" y="211" width="30" height="30" class="cell" style="fill:rgb(255, 255, 198);" data-v-c91d4a34></rect><rect x="61" y="211" width="30" height="30" class="cell" style="fill:rgb(123, 36, 0);" data-v-c91d4a34></rect><rect x="91" y="211" width="30" height="30" class="cell" style="fill:rgb(107, 186, 255);" data-v-c91d4a34></rect><rect x="121" y="211" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="151" y="211" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="181" y="211" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="211" y="211" width="30" height="30" class="cell" style="fill:rgb(255, 255, 189);" data-v-c91d4a34></rect><rect x="241" y="211" width="30" height="30" class="cell" style="fill:rgb(107, 0, 66);" data-v-c91d4a34></rect><rect x="271" y="211" width="30" height="30" class="cell" style="fill:rgb(148, 219, 255);" data-v-c91d4a34></rect><rect x="301" y="211" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="331" y="211" width="30" height="30" class="cell" style="fill:rgb(255, 219, 148);" data-v-c91d4a34></rect><rect x="361" y="211" width="30" height="30" class="cell" style="fill:rgb(66, 0, 107);" data-v-c91d4a34></rect><rect x="391" y="211" width="30" height="30" class="cell" style="fill:rgb(189, 255, 255);" data-v-c91d4a34></rect><rect x="421" y="211" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="451" y="211" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="481" y="211" width="30" height="30" class="cell" style="fill:rgb(239, 199, 140);" data-v-c91d4a34></rect><rect x="511" y="211" width="30" height="30" class="cell" style="fill:rgb(74, 24, 16);" data-v-c91d4a34></rect><rect x="541" y="211" width="30" height="30" class="cell" style="fill:rgb(74, 146, 222);" data-v-c91d4a34></rect><rect x="571" y="211" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="601" y="211" width="30" height="30" class="cell" style="fill:rgb(239, 186, 107);" data-v-c91d4a34></rect><rect x="631" y="211" width="30" height="30" class="cell" style="fill:rgb(41, 20, 49);" data-v-c91d4a34></rect><rect x="661" y="211" width="30" height="30" class="cell" style="fill:rgb(90, 146, 198);" data-v-c91d4a34></rect><rect x="691" y="211" width="30" height="30" class="cell" style="fill:rgb(231, 247, 255);" data-v-c91d4a34></rect><rect x="721" y="211" width="30" height="30" class="cell" style="fill:rgb(255, 255, 189);" data-v-c91d4a34></rect><rect x="751" y="211" width="30" height="30" class="cell" style="fill:rgb(107, 0, 0);" data-v-c91d4a34></rect><rect x="781" y="211" width="30" height="30" class="cell" style="fill:rgb(107, 186, 255);" data-v-c91d4a34></rect><rect x="811" y="211" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="841" y="211" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="871" y="211" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="1" y="241" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="31" y="241" width="30" height="30" class="cell" style="fill:rgb(255, 255, 222);" data-v-c91d4a34></rect><rect x="61" y="241" width="30" height="30" class="cell" style="fill:rgb(148, 69, 0);" data-v-c91d4a34></rect><rect x="91" y="241" width="30" height="30" class="cell" style="fill:rgb(107, 182, 255);" data-v-c91d4a34></rect><rect x="121" y="241" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="151" y="241" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="181" y="241" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="211" y="241" width="30" height="30" class="cell" style="fill:rgb(255, 223, 148);" data-v-c91d4a34></rect><rect x="241" y="241" width="30" height="30" class="cell" style="fill:rgb(74, 0, 82);" data-v-c91d4a34></rect><rect x="271" y="241" width="30" height="30" class="cell" style="fill:rgb(165, 235, 255);" data-v-c91d4a34></rect><rect x="301" y="241" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="331" y="241" width="30" height="30" class="cell" style="fill:rgb(255, 219, 148);" data-v-c91d4a34></rect><rect x="361" y="241" width="30" height="30" class="cell" style="fill:rgb(66, 0, 107);" data-v-c91d4a34></rect><rect x="391" y="241" width="30" height="30" class="cell" style="fill:rgb(189, 255, 255);" data-v-c91d4a34></rect><rect x="421" y="241" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="451" y="241" width="30" height="30" class="cell" style="fill:rgb(231, 162, 82);" data-v-c91d4a34></rect><rect x="481" y="241" width="30" height="30" class="cell" style="fill:rgb(16, 20, 49);" data-v-c91d4a34></rect><rect x="511" y="241" width="30" height="30" class="cell" style="fill:rgb(90, 162, 222);" data-v-c91d4a34></rect><rect x="541" y="241" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="571" y="241" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="601" y="241" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="631" y="241" width="30" height="30" class="cell" style="fill:rgb(247, 223, 181);" data-v-c91d4a34></rect><rect x="661" y="241" width="30" height="30" class="cell" style="fill:rgb(115, 73, 90);" data-v-c91d4a34></rect><rect x="691" y="241" width="30" height="30" class="cell" style="fill:rgb(156, 227, 255);" data-v-c91d4a34></rect><rect x="721" y="241" width="30" height="30" class="cell" style="fill:rgb(255, 255, 189);" data-v-c91d4a34></rect><rect x="751" y="241" width="30" height="30" class="cell" style="fill:rgb(107, 0, 0);" data-v-c91d4a34></rect><rect x="781" y="241" width="30" height="30" class="cell" style="fill:rgb(107, 186, 255);" data-v-c91d4a34></rect><rect x="811" y="241" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="841" y="241" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="871" y="241" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="1" y="271" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="31" y="271" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="61" y="271" width="30" height="30" class="cell" style="fill:rgb(198, 125, 33);" data-v-c91d4a34></rect><rect x="91" y="271" width="30" height="30" class="cell" style="fill:rgb(33, 121, 198);" data-v-c91d4a34></rect><rect x="121" y="271" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="151" y="271" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="181" y="271" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="211" y="271" width="30" height="30" class="cell" style="fill:rgb(239, 166, 90);" data-v-c91d4a34></rect><rect x="241" y="271" width="30" height="30" class="cell" style="fill:rgb(0, 69, 148);" data-v-c91d4a34></rect><rect x="271" y="271" width="30" height="30" class="cell" style="fill:rgb(222, 255, 255);" data-v-c91d4a34></rect><rect x="301" y="271" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="331" y="271" width="30" height="30" class="cell" style="fill:rgb(255, 219, 148);" data-v-c91d4a34></rect><rect x="361" y="271" width="30" height="30" class="cell" style="fill:rgb(66, 0, 107);" data-v-c91d4a34></rect><rect x="391" y="271" width="30" height="30" class="cell" style="fill:rgb(189, 255, 255);" data-v-c91d4a34></rect><rect x="421" y="271" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="451" y="271" width="30" height="30" class="cell" style="fill:rgb(255, 251, 247);" data-v-c91d4a34></rect><rect x="481" y="271" width="30" height="30" class="cell" style="fill:rgb(239, 243, 255);" data-v-c91d4a34></rect><rect x="511" y="271" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="541" y="271" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="571" y="271" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="601" y="271" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="631" y="271" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="661" y="271" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="691" y="271" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="721" y="271" width="30" height="30" class="cell" style="fill:rgb(255, 255, 189);" data-v-c91d4a34></rect><rect x="751" y="271" width="30" height="30" class="cell" style="fill:rgb(123, 52, 49);" data-v-c91d4a34></rect><rect x="781" y="271" width="30" height="30" class="cell" style="fill:rgb(123, 190, 255);" data-v-c91d4a34></rect><rect x="811" y="271" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="841" y="271" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="871" y="271" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="1" y="301" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="31" y="301" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="61" y="301" width="30" height="30" class="cell" style="fill:rgb(255, 219, 148);" data-v-c91d4a34></rect><rect x="91" y="301" width="30" height="30" class="cell" style="fill:rgb(74, 20, 41);" data-v-c91d4a34></rect><rect x="121" y="301" width="30" height="30" class="cell" style="fill:rgb(107, 178, 231);" data-v-c91d4a34></rect><rect x="151" y="301" width="30" height="30" class="cell" style="fill:rgb(247, 255, 255);" data-v-c91d4a34></rect><rect x="181" y="301" width="30" height="30" class="cell" style="fill:rgb(247, 223, 165);" data-v-c91d4a34></rect><rect x="211" y="301" width="30" height="30" class="cell" style="fill:rgb(99, 44, 16);" data-v-c91d4a34></rect><rect x="241" y="301" width="30" height="30" class="cell" style="fill:rgb(99, 170, 239);" data-v-c91d4a34></rect><rect x="271" y="301" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="301" y="301" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="331" y="301" width="30" height="30" class="cell" style="fill:rgb(255, 219, 148);" data-v-c91d4a34></rect><rect x="361" y="301" width="30" height="30" class="cell" style="fill:rgb(66, 0, 107);" data-v-c91d4a34></rect><rect x="391" y="301" width="30" height="30" class="cell" style="fill:rgb(189, 255, 255);" data-v-c91d4a34></rect><rect x="421" y="301" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="451" y="301" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="481" y="301" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="511" y="301" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="541" y="301" width="30" height="30" class="cell" style="fill:rgb(247, 223, 198);" data-v-c91d4a34></rect><rect x="571" y="301" width="30" height="30" class="cell" style="fill:rgb(156, 138, 107);" data-v-c91d4a34></rect><rect x="601" y="301" width="30" height="30" class="cell" style="fill:rgb(82, 65, 49);" data-v-c91d4a34></rect><rect x="631" y="301" width="30" height="30" class="cell" style="fill:rgb(49, 52, 49);" data-v-c91d4a34></rect><rect x="661" y="301" width="30" height="30" class="cell" style="fill:rgb(49, 52, 49);" data-v-c91d4a34></rect><rect x="691" y="301" width="30" height="30" class="cell" style="fill:rgb(74, 97, 115);" data-v-c91d4a34></rect><rect x="721" y="301" width="30" height="30" class="cell" style="fill:rgb(140, 166, 206);" data-v-c91d4a34></rect><rect x="751" y="301" width="30" height="30" class="cell" style="fill:rgb(231, 247, 255);" data-v-c91d4a34></rect><rect x="781" y="301" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="811" y="301" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="841" y="301" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="871" y="301" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="1" y="331" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="31" y="331" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="61" y="331" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="91" y="331" width="30" height="30" class="cell" style="fill:rgb(239, 195, 132);" data-v-c91d4a34></rect><rect x="121" y="331" width="30" height="30" class="cell" style="fill:rgb(74, 32, 16);" data-v-c91d4a34></rect><rect x="151" y="331" width="30" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="181" y="331" width="30" height="30" class="cell" style="fill:rgb(0, 20, 49);" data-v-c91d4a34></rect><rect x="211" y="331" width="30" height="30" class="cell" style="fill:rgb(90, 158, 214);" data-v-c91d4a34></rect><rect x="241" y="331" width="30" height="30" class="cell" style="fill:rgb(247, 255, 255);" data-v-c91d4a34></rect><rect x="271" y="331" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="301" y="331" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="331" y="331" width="30" height="30" class="cell" style="fill:rgb(255, 219, 148);" data-v-c91d4a34></rect><rect x="361" y="331" width="30" height="30" class="cell" style="fill:rgb(66, 0, 107);" data-v-c91d4a34></rect><rect x="391" y="331" width="30" height="30" class="cell" style="fill:rgb(189, 255, 255);" data-v-c91d4a34></rect><rect x="421" y="331" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="451" y="331" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="481" y="331" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="511" y="331" width="30" height="30" class="cell" style="fill:rgb(239, 186, 107);" data-v-c91d4a34></rect><rect x="541" y="331" width="30" height="30" class="cell" style="fill:rgb(41, 20, 49);" data-v-c91d4a34></rect><rect x="571" y="331" width="30" height="30" class="cell" style="fill:rgb(90, 138, 181);" data-v-c91d4a34></rect><rect x="601" y="331" width="30" height="30" class="cell" style="fill:rgb(206, 223, 239);" data-v-c91d4a34></rect><rect x="631" y="331" width="30" height="30" class="cell" style="fill:rgb(239, 235, 239);" data-v-c91d4a34></rect><rect x="661" y="331" width="30" height="30" class="cell" style="fill:rgb(239, 235, 239);" data-v-c91d4a34></rect><rect x="691" y="331" width="30" height="30" class="cell" style="fill:rgb(214, 199, 173);" data-v-c91d4a34></rect><rect x="721" y="331" width="30" height="30" class="cell" style="fill:rgb(140, 93, 49);" data-v-c91d4a34></rect><rect x="751" y="331" width="30" height="30" class="cell" style="fill:rgb(24, 48, 115);" data-v-c91d4a34></rect><rect x="781" y="331" width="30" height="30" class="cell" style="fill:rgb(189, 243, 255);" data-v-c91d4a34></rect><rect x="811" y="331" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="841" y="331" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="871" y="331" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="1" y="361" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="31" y="361" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="61" y="361" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="91" y="361" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="121" y="361" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="151" y="361" width="30" height="30" class="cell" style="fill:rgb(247, 235, 239);" data-v-c91d4a34></rect><rect x="181" y="361" width="30" height="30" class="cell" style="fill:rgb(247, 255, 255);" data-v-c91d4a34></rect><rect x="211" y="361" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="241" y="361" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="271" y="361" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="301" y="361" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="331" y="361" width="30" height="30" class="cell" style="fill:rgb(255, 219, 148);" data-v-c91d4a34></rect><rect x="361" y="361" width="30" height="30" class="cell" style="fill:rgb(66, 0, 107);" data-v-c91d4a34></rect><rect x="391" y="361" width="30" height="30" class="cell" style="fill:rgb(189, 255, 255);" data-v-c91d4a34></rect><rect x="421" y="361" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="451" y="361" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="481" y="361" width="30" height="30" class="cell" style="fill:rgb(255, 255, 222);" data-v-c91d4a34></rect><rect x="511" y="361" width="30" height="30" class="cell" style="fill:rgb(148, 73, 0);" data-v-c91d4a34></rect><rect x="541" y="361" width="30" height="30" class="cell" style="fill:rgb(66, 146, 222);" data-v-c91d4a34></rect><rect x="571" y="361" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="601" y="361" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="631" y="361" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="661" y="361" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="691" y="361" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="721" y="361" width="30" height="30" class="cell" style="fill:rgb(255, 255, 222);" data-v-c91d4a34></rect><rect x="751" y="361" width="30" height="30" class="cell" style="fill:rgb(148, 65, 0);" data-v-c91d4a34></rect><rect x="781" y="361" width="30" height="30" class="cell" style="fill:rgb(107, 186, 255);" data-v-c91d4a34></rect><rect x="811" y="361" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="841" y="361" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="871" y="361" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="1" y="391" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="31" y="391" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="61" y="391" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="91" y="391" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="121" y="391" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="151" y="391" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="181" y="391" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="211" y="391" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="241" y="391" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="271" y="391" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="301" y="391" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="331" y="391" width="30" height="30" class="cell" style="fill:rgb(255, 219, 148);" data-v-c91d4a34></rect><rect x="361" y="391" width="30" height="30" class="cell" style="fill:rgb(66, 0, 107);" data-v-c91d4a34></rect><rect x="391" y="391" width="30" height="30" class="cell" style="fill:rgb(189, 255, 255);" data-v-c91d4a34></rect><rect x="421" y="391" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="451" y="391" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="481" y="391" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="511" y="391" width="30" height="30" class="cell" style="fill:rgb(198, 125, 41);" data-v-c91d4a34></rect><rect x="541" y="391" width="30" height="30" class="cell" style="fill:rgb(16, 73, 148);" data-v-c91d4a34></rect><rect x="571" y="391" width="30" height="30" class="cell" style="fill:rgb(206, 243, 255);" data-v-c91d4a34></rect><rect x="601" y="391" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="631" y="391" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="661" y="391" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="691" y="391" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="721" y="391" width="30" height="30" class="cell" style="fill:rgb(239, 199, 132);" data-v-c91d4a34></rect><rect x="751" y="391" width="30" height="30" class="cell" style="fill:rgb(74, 20, 57);" data-v-c91d4a34></rect><rect x="781" y="391" width="30" height="30" class="cell" style="fill:rgb(140, 211, 255);" data-v-c91d4a34></rect><rect x="811" y="391" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="841" y="391" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="871" y="391" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="1" y="421" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="31" y="421" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="61" y="421" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="91" y="421" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="121" y="421" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="151" y="421" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="181" y="421" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="211" y="421" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="241" y="421" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="271" y="421" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="301" y="421" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="331" y="421" width="30" height="30" class="cell" style="fill:rgb(255, 219, 148);" data-v-c91d4a34></rect><rect x="361" y="421" width="30" height="30" class="cell" style="fill:rgb(66, 0, 107);" data-v-c91d4a34></rect><rect x="391" y="421" width="30" height="30" class="cell" style="fill:rgb(189, 255, 255);" data-v-c91d4a34></rect><rect x="421" y="421" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="451" y="421" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="481" y="421" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="511" y="421" width="30" height="30" class="cell" style="fill:rgb(255, 251, 231);" data-v-c91d4a34></rect><rect x="541" y="421" width="30" height="30" class="cell" style="fill:rgb(181, 117, 74);" data-v-c91d4a34></rect><rect x="571" y="421" width="30" height="30" class="cell" style="fill:rgb(33, 20, 16);" data-v-c91d4a34></rect><rect x="601" y="421" width="30" height="30" class="cell" style="fill:rgb(33, 48, 49);" data-v-c91d4a34></rect><rect x="631" y="421" width="30" height="30" class="cell" style="fill:rgb(49, 52, 49);" data-v-c91d4a34></rect><rect x="661" y="421" width="30" height="30" class="cell" style="fill:rgb(49, 52, 49);" data-v-c91d4a34></rect><rect x="691" y="421" width="30" height="30" class="cell" style="fill:rgb(49, 32, 16);" data-v-c91d4a34></rect><rect x="721" y="421" width="30" height="30" class="cell" style="fill:rgb(24, 56, 82);" data-v-c91d4a34></rect><rect x="751" y="421" width="30" height="30" class="cell" style="fill:rgb(140, 190, 239);" data-v-c91d4a34></rect><rect x="781" y="421" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="811" y="421" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="841" y="421" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="871" y="421" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="1" y="451" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="31" y="451" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="61" y="451" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="91" y="451" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="121" y="451" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="151" y="451" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="181" y="451" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="211" y="451" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="241" y="451" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="271" y="451" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="301" y="451" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="331" y="451" width="30" height="30" class="cell" style="fill:rgb(255, 251, 247);" data-v-c91d4a34></rect><rect x="361" y="451" width="30" height="30" class="cell" style="fill:rgb(239, 235, 239);" data-v-c91d4a34></rect><rect x="391" y="451" width="30" height="30" class="cell" style="fill:rgb(247, 255, 255);" data-v-c91d4a34></rect><rect x="421" y="451" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="451" y="451" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="481" y="451" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="511" y="451" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="541" y="451" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="571" y="451" width="30" height="30" class="cell" style="fill:rgb(255, 255, 247);" data-v-c91d4a34></rect><rect x="601" y="451" width="30" height="30" class="cell" style="fill:rgb(239, 235, 239);" data-v-c91d4a34></rect><rect x="631" y="451" width="30" height="30" class="cell" style="fill:rgb(239, 235, 239);" data-v-c91d4a34></rect><rect x="661" y="451" width="30" height="30" class="cell" style="fill:rgb(239, 235, 239);" data-v-c91d4a34></rect><rect x="691" y="451" width="30" height="30" class="cell" style="fill:rgb(239, 243, 255);" data-v-c91d4a34></rect><rect x="721" y="451" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="751" y="451" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="781" y="451" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="811" y="451" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="841" y="451" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="871" y="451" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="1" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="31" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="61" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="91" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="121" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="151" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="181" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="211" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="241" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="271" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="301" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="331" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="361" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="391" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="421" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="451" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="481" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="511" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="541" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="571" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="601" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="631" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="661" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="691" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="721" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="751" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="781" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="811" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="841" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect><rect x="871" y="481" width="30" height="30" class="cell" style="fill:rgb(255, 255, 255);" data-v-c91d4a34></rect></svg></div></div><div class="flex flex-col items-center gap-2 mb-2 max-w-full mx-auto" data-v-c91d4a34><div class="w-full max-w-full" data-v-c91d4a34><svg xmlns="http://www.w3.org/2000/svg" class="h-full max-h-60 w-full" viewBox="0 0 902 512" data-v-c91d4a34><rect x="1" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="11" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="21" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="31" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="41" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="51" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="61" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="71" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="81" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="91" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="101" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="111" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="121" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="131" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="141" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="151" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="161" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="171" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="181" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="191" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="201" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="211" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="221" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="231" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="241" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="251" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="261" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="271" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="281" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="291" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="301" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="311" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="321" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="331" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="341" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="351" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="361" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="371" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="381" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="391" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="401" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="411" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="421" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="431" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="441" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="451" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="461" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="471" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="481" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="491" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="501" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="511" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="521" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="531" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="541" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="551" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="561" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="571" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="581" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="591" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="601" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="611" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="621" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="631" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="641" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="651" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="661" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="671" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="681" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="691" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="701" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="711" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="721" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="731" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="741" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="751" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="761" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="771" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="781" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="791" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="801" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="811" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="821" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="831" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="841" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="851" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="861" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="871" y="1" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="881" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="891" y="1" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="1" y="31" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="11" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="21" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="31" y="31" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="41" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="51" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="61" y="31" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="71" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="81" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="91" y="31" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="101" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="111" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="121" y="31" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="131" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="141" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="151" y="31" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="161" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="171" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="181" y="31" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="191" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="201" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="211" y="31" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="221" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="231" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="241" y="31" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="251" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="261" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="271" y="31" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="281" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="291" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="301" y="31" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="311" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="321" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="331" y="31" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="341" y="31" width="10" height="30" class="cell" style="fill:rgb(164.5, 235, 164.5);" data-v-c91d4a34></rect><rect x="351" y="31" width="10" height="30" class="cell" style="fill:rgb(132.29999999999998, 132.29999999999998, 189);" data-v-c91d4a34></rect><rect x="361" y="31" width="10" height="30" class="cell" style="fill:rgb(140, 98, 98);" data-v-c91d4a34></rect><rect x="371" y="31" width="10" height="30" class="cell" style="fill:rgb(81.89999999999999, 117, 81.89999999999999);" data-v-c91d4a34></rect><rect x="381" y="31" width="10" height="30" class="cell" style="fill:rgb(115.49999999999999, 115.49999999999999, 165);" data-v-c91d4a34></rect><rect x="391" y="31" width="10" height="30" class="cell" style="fill:rgb(214, 149.79999999999998, 149.79999999999998);" data-v-c91d4a34></rect><rect x="401" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="411" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="421" y="31" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="431" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="441" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="451" y="31" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="461" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="471" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="481" y="31" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="491" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="501" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="511" y="31" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="521" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="531" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="541" y="31" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="551" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="561" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="571" y="31" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="581" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="591" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="601" y="31" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="611" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="621" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="631" y="31" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="641" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="651" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="661" y="31" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="671" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="681" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="691" y="31" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="701" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="711" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="721" y="31" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="731" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="741" y="31" width="10" height="30" class="cell" style="fill:rgb(149.79999999999998, 149.79999999999998, 214);" data-v-c91d4a34></rect><rect x="751" y="31" width="10" height="30" class="cell" style="fill:rgb(165, 115.49999999999999, 115.49999999999999);" data-v-c91d4a34></rect><rect x="761" y="31" width="10" height="30" class="cell" style="fill:rgb(81.89999999999999, 117, 81.89999999999999);" data-v-c91d4a34></rect><rect x="771" y="31" width="10" height="30" class="cell" style="fill:rgb(80.5, 80.5, 115);" data-v-c91d4a34></rect><rect x="781" y="31" width="10" height="30" class="cell" style="fill:rgb(165, 115.49999999999999, 115.49999999999999);" data-v-c91d4a34></rect><rect x="791" y="31" width="10" height="30" class="cell" style="fill:rgb(147.7, 211, 147.7);" data-v-c91d4a34></rect><rect x="801" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="811" y="31" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="821" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="831" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="841" y="31" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="851" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="861" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="871" y="31" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="881" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="891" y="31" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="1" y="61" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="11" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="21" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="31" y="61" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="41" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="51" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="61" y="61" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="71" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="81" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="91" y="61" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="101" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="111" y="61" width="10" height="30" class="cell" style="fill:rgb(172.89999999999998, 172.89999999999998, 247);" data-v-c91d4a34></rect><rect x="121" y="61" width="10" height="30" class="cell" style="fill:rgb(222, 155.39999999999998, 155.39999999999998);" data-v-c91d4a34></rect><rect x="131" y="61" width="10" height="30" class="cell" style="fill:rgb(139.29999999999998, 199, 139.29999999999998);" data-v-c91d4a34></rect><rect x="141" y="61" width="10" height="30" class="cell" style="fill:rgb(109.19999999999999, 109.19999999999999, 156);" data-v-c91d4a34></rect><rect x="151" y="61" width="10" height="30" class="cell" style="fill:rgb(140, 98, 98);" data-v-c91d4a34></rect><rect x="161" y="61" width="10" height="30" class="cell" style="fill:rgb(81.89999999999999, 117, 81.89999999999999);" data-v-c91d4a34></rect><rect x="171" y="61" width="10" height="30" class="cell" style="fill:rgb(86.1, 86.1, 123);" data-v-c91d4a34></rect><rect x="181" y="61" width="10" height="30" class="cell" style="fill:rgb(148, 103.6, 103.6);" data-v-c91d4a34></rect><rect x="191" y="61" width="10" height="30" class="cell" style="fill:rgb(124.6, 178, 124.6);" data-v-c91d4a34></rect><rect x="201" y="61" width="10" height="30" class="cell" style="fill:rgb(149.79999999999998, 149.79999999999998, 214);" data-v-c91d4a34></rect><rect x="211" y="61" width="10" height="30" class="cell" style="fill:rgb(239, 167.29999999999998, 167.29999999999998);" data-v-c91d4a34></rect><rect x="221" y="61" width="10" height="30" class="cell" style="fill:rgb(175.7, 251, 175.7);" data-v-c91d4a34></rect><rect x="231" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="241" y="61" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="251" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="261" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="271" y="61" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="281" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="291" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="301" y="61" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="311" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="321" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="331" y="61" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="341" y="61" width="10" height="30" class="cell" style="fill:rgb(153.29999999999998, 219, 153.29999999999998);" data-v-c91d4a34></rect><rect x="351" y="61" width="10" height="30" class="cell" style="fill:rgb(103.6, 103.6, 148);" data-v-c91d4a34></rect><rect x="361" y="61" width="10" height="30" class="cell" style="fill:rgb(66, 46.199999999999996, 46.199999999999996);" data-v-c91d4a34></rect><rect x="371" y="61" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="381" y="61" width="10" height="30" class="cell" style="fill:rgb(74.89999999999999, 74.89999999999999, 107);" data-v-c91d4a34></rect><rect x="391" y="61" width="10" height="30" class="cell" style="fill:rgb(189, 132.29999999999998, 132.29999999999998);" data-v-c91d4a34></rect><rect x="401" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="411" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="421" y="61" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="431" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="441" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="451" y="61" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="461" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="471" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="481" y="61" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="491" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="501" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="511" y="61" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="521" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="531" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="541" y="61" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="551" y="61" width="10" height="30" class="cell" style="fill:rgb(153.29999999999998, 219, 153.29999999999998);" data-v-c91d4a34></rect><rect x="561" y="61" width="10" height="30" class="cell" style="fill:rgb(103.6, 103.6, 148);" data-v-c91d4a34></rect><rect x="571" y="61" width="10" height="30" class="cell" style="fill:rgb(66, 46.199999999999996, 46.199999999999996);" data-v-c91d4a34></rect><rect x="581" y="61" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="591" y="61" width="10" height="30" class="cell" style="fill:rgb(74.89999999999999, 74.89999999999999, 107);" data-v-c91d4a34></rect><rect x="601" y="61" width="10" height="30" class="cell" style="fill:rgb(189, 132.29999999999998, 132.29999999999998);" data-v-c91d4a34></rect><rect x="611" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="621" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="631" y="61" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="641" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="651" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="661" y="61" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="671" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="681" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="691" y="61" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="701" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="711" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="721" y="61" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="731" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="741" y="61" width="10" height="30" class="cell" style="fill:rgb(132.29999999999998, 132.29999999999998, 189);" data-v-c91d4a34></rect><rect x="751" y="61" width="10" height="30" class="cell" style="fill:rgb(107, 74.89999999999999, 74.89999999999999);" data-v-c91d4a34></rect><rect x="761" y="61" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="771" y="61" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="781" y="61" width="10" height="30" class="cell" style="fill:rgb(107, 74.89999999999999, 74.89999999999999);" data-v-c91d4a34></rect><rect x="791" y="61" width="10" height="30" class="cell" style="fill:rgb(130.2, 186, 130.2);" data-v-c91d4a34></rect><rect x="801" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="811" y="61" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="821" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="831" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="841" y="61" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="851" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="861" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="871" y="61" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="881" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="891" y="61" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="1" y="91" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="11" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="21" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="31" y="91" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="41" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="51" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="61" y="91" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="71" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="81" y="91" width="10" height="30" class="cell" style="fill:rgb(167.29999999999998, 167.29999999999998, 239);" data-v-c91d4a34></rect><rect x="91" y="91" width="10" height="30" class="cell" style="fill:rgb(189, 132.29999999999998, 132.29999999999998);" data-v-c91d4a34></rect><rect x="101" y="91" width="10" height="30" class="cell" style="fill:rgb(76.3, 109, 76.3);" data-v-c91d4a34></rect><rect x="111" y="91" width="10" height="30" class="cell" style="fill:rgb(28.7, 28.7, 41);" data-v-c91d4a34></rect><rect x="121" y="91" width="10" height="30" class="cell" style="fill:rgb(16, 11.2, 11.2);" data-v-c91d4a34></rect><rect x="131" y="91" width="10" height="30" class="cell" style="fill:rgb(33.599999999999994, 48, 33.599999999999994);" data-v-c91d4a34></rect><rect x="141" y="91" width="10" height="30" class="cell" style="fill:rgb(57.4, 57.4, 82);" data-v-c91d4a34></rect><rect x="151" y="91" width="10" height="30" class="cell" style="fill:rgb(107, 74.89999999999999, 74.89999999999999);" data-v-c91d4a34></rect><rect x="161" y="91" width="10" height="30" class="cell" style="fill:rgb(81.89999999999999, 117, 81.89999999999999);" data-v-c91d4a34></rect><rect x="171" y="91" width="10" height="30" class="cell" style="fill:rgb(80.5, 80.5, 115);" data-v-c91d4a34></rect><rect x="181" y="91" width="10" height="30" class="cell" style="fill:rgb(99, 69.3, 69.3);" data-v-c91d4a34></rect><rect x="191" y="91" width="10" height="30" class="cell" style="fill:rgb(45.5, 65, 45.5);" data-v-c91d4a34></rect><rect x="201" y="91" width="10" height="30" class="cell" style="fill:rgb(16.799999999999997, 16.799999999999997, 24);" data-v-c91d4a34></rect><rect x="211" y="91" width="10" height="30" class="cell" style="fill:rgb(16, 11.2, 11.2);" data-v-c91d4a34></rect><rect x="221" y="91" width="10" height="30" class="cell" style="fill:rgb(33.599999999999994, 48, 33.599999999999994);" data-v-c91d4a34></rect><rect x="231" y="91" width="10" height="30" class="cell" style="fill:rgb(80.5, 80.5, 115);" data-v-c91d4a34></rect><rect x="241" y="91" width="10" height="30" class="cell" style="fill:rgb(189, 132.29999999999998, 132.29999999999998);" data-v-c91d4a34></rect><rect x="251" y="91" width="10" height="30" class="cell" style="fill:rgb(167.29999999999998, 239, 167.29999999999998);" data-v-c91d4a34></rect><rect x="261" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="271" y="91" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="281" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="291" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="301" y="91" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="311" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="321" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="331" y="91" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="341" y="91" width="10" height="30" class="cell" style="fill:rgb(153.29999999999998, 219, 153.29999999999998);" data-v-c91d4a34></rect><rect x="351" y="91" width="10" height="30" class="cell" style="fill:rgb(103.6, 103.6, 148);" data-v-c91d4a34></rect><rect x="361" y="91" width="10" height="30" class="cell" style="fill:rgb(66, 46.199999999999996, 46.199999999999996);" data-v-c91d4a34></rect><rect x="371" y="91" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="381" y="91" width="10" height="30" class="cell" style="fill:rgb(74.89999999999999, 74.89999999999999, 107);" data-v-c91d4a34></rect><rect x="391" y="91" width="10" height="30" class="cell" style="fill:rgb(189, 132.29999999999998, 132.29999999999998);" data-v-c91d4a34></rect><rect x="401" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="411" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="421" y="91" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="431" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="441" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="451" y="91" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="461" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="471" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="481" y="91" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="491" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="501" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="511" y="91" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="521" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="531" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="541" y="91" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="551" y="91" width="10" height="30" class="cell" style="fill:rgb(153.29999999999998, 219, 153.29999999999998);" data-v-c91d4a34></rect><rect x="561" y="91" width="10" height="30" class="cell" style="fill:rgb(103.6, 103.6, 148);" data-v-c91d4a34></rect><rect x="571" y="91" width="10" height="30" class="cell" style="fill:rgb(66, 46.199999999999996, 46.199999999999996);" data-v-c91d4a34></rect><rect x="581" y="91" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="591" y="91" width="10" height="30" class="cell" style="fill:rgb(74.89999999999999, 74.89999999999999, 107);" data-v-c91d4a34></rect><rect x="601" y="91" width="10" height="30" class="cell" style="fill:rgb(189, 132.29999999999998, 132.29999999999998);" data-v-c91d4a34></rect><rect x="611" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="621" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="631" y="91" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="641" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="651" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="661" y="91" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="671" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="681" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="691" y="91" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="701" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="711" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="721" y="91" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="731" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="741" y="91" width="10" height="30" class="cell" style="fill:rgb(132.29999999999998, 132.29999999999998, 189);" data-v-c91d4a34></rect><rect x="751" y="91" width="10" height="30" class="cell" style="fill:rgb(107, 74.89999999999999, 74.89999999999999);" data-v-c91d4a34></rect><rect x="761" y="91" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="771" y="91" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="781" y="91" width="10" height="30" class="cell" style="fill:rgb(107, 74.89999999999999, 74.89999999999999);" data-v-c91d4a34></rect><rect x="791" y="91" width="10" height="30" class="cell" style="fill:rgb(130.2, 186, 130.2);" data-v-c91d4a34></rect><rect x="801" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="811" y="91" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="821" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="831" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="841" y="91" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="851" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="861" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="871" y="91" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="881" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="891" y="91" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="1" y="121" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="11" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="21" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="31" y="121" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="41" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="51" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="61" y="121" width="10" height="30" class="cell" style="fill:rgb(247, 172.89999999999998, 172.89999999999998);" data-v-c91d4a34></rect><rect x="71" y="121" width="10" height="30" class="cell" style="fill:rgb(121.8, 174, 121.8);" data-v-c91d4a34></rect><rect x="81" y="121" width="10" height="30" class="cell" style="fill:rgb(69.3, 69.3, 99);" data-v-c91d4a34></rect><rect x="91" y="121" width="10" height="30" class="cell" style="fill:rgb(16, 11.2, 11.2);" data-v-c91d4a34></rect><rect x="101" y="121" width="10" height="30" class="cell" style="fill:rgb(30.799999999999997, 44, 30.799999999999997);" data-v-c91d4a34></rect><rect x="111" y="121" width="10" height="30" class="cell" style="fill:rgb(74.89999999999999, 74.89999999999999, 107);" data-v-c91d4a34></rect><rect x="121" y="121" width="10" height="30" class="cell" style="fill:rgb(189, 132.29999999999998, 132.29999999999998);" data-v-c91d4a34></rect><rect x="131" y="121" width="10" height="30" class="cell" style="fill:rgb(167.29999999999998, 239, 167.29999999999998);" data-v-c91d4a34></rect><rect x="141" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="151" y="121" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="161" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="171" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="181" y="121" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="191" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="201" y="121" width="10" height="30" class="cell" style="fill:rgb(167.29999999999998, 167.29999999999998, 239);" data-v-c91d4a34></rect><rect x="211" y="121" width="10" height="30" class="cell" style="fill:rgb(173, 121.1, 121.1);" data-v-c91d4a34></rect><rect x="221" y="121" width="10" height="30" class="cell" style="fill:rgb(67.89999999999999, 97, 67.89999999999999);" data-v-c91d4a34></rect><rect x="231" y="121" width="10" height="30" class="cell" style="fill:rgb(11.2, 11.2, 16);" data-v-c91d4a34></rect><rect x="241" y="121" width="10" height="30" class="cell" style="fill:rgb(41, 28.7, 28.7);" data-v-c91d4a34></rect><rect x="251" y="121" width="10" height="30" class="cell" style="fill:rgb(87.5, 125, 87.5);" data-v-c91d4a34></rect><rect x="261" y="121" width="10" height="30" class="cell" style="fill:rgb(138.6, 138.6, 198);" data-v-c91d4a34></rect><rect x="271" y="121" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="281" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="291" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="301" y="121" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="311" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="321" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="331" y="121" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="341" y="121" width="10" height="30" class="cell" style="fill:rgb(153.29999999999998, 219, 153.29999999999998);" data-v-c91d4a34></rect><rect x="351" y="121" width="10" height="30" class="cell" style="fill:rgb(103.6, 103.6, 148);" data-v-c91d4a34></rect><rect x="361" y="121" width="10" height="30" class="cell" style="fill:rgb(66, 46.199999999999996, 46.199999999999996);" data-v-c91d4a34></rect><rect x="371" y="121" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="381" y="121" width="10" height="30" class="cell" style="fill:rgb(74.89999999999999, 74.89999999999999, 107);" data-v-c91d4a34></rect><rect x="391" y="121" width="10" height="30" class="cell" style="fill:rgb(189, 132.29999999999998, 132.29999999999998);" data-v-c91d4a34></rect><rect x="401" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="411" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="421" y="121" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="431" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="441" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="451" y="121" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="461" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="471" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="481" y="121" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="491" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="501" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="511" y="121" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="521" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="531" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="541" y="121" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="551" y="121" width="10" height="30" class="cell" style="fill:rgb(139.29999999999998, 199, 139.29999999999998);" data-v-c91d4a34></rect><rect x="561" y="121" width="10" height="30" class="cell" style="fill:rgb(86.1, 86.1, 123);" data-v-c91d4a34></rect><rect x="571" y="121" width="10" height="30" class="cell" style="fill:rgb(33, 23.099999999999998, 23.099999999999998);" data-v-c91d4a34></rect><rect x="581" y="121" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="591" y="121" width="10" height="30" class="cell" style="fill:rgb(46.199999999999996, 46.199999999999996, 66);" data-v-c91d4a34></rect><rect x="601" y="121" width="10" height="30" class="cell" style="fill:rgb(148, 103.6, 103.6);" data-v-c91d4a34></rect><rect x="611" y="121" width="10" height="30" class="cell" style="fill:rgb(153.29999999999998, 219, 153.29999999999998);" data-v-c91d4a34></rect><rect x="621" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="631" y="121" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="641" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="651" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="661" y="121" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="671" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="681" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="691" y="121" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="701" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="711" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="721" y="121" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="731" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="741" y="121" width="10" height="30" class="cell" style="fill:rgb(132.29999999999998, 132.29999999999998, 189);" data-v-c91d4a34></rect><rect x="751" y="121" width="10" height="30" class="cell" style="fill:rgb(107, 74.89999999999999, 74.89999999999999);" data-v-c91d4a34></rect><rect x="761" y="121" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="771" y="121" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="781" y="121" width="10" height="30" class="cell" style="fill:rgb(107, 74.89999999999999, 74.89999999999999);" data-v-c91d4a34></rect><rect x="791" y="121" width="10" height="30" class="cell" style="fill:rgb(130.2, 186, 130.2);" data-v-c91d4a34></rect><rect x="801" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="811" y="121" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="821" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="831" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="841" y="121" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="851" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="861" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="871" y="121" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="881" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="891" y="121" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="1" y="151" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="11" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="21" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="31" y="151" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="41" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="51" y="151" width="10" height="30" class="cell" style="fill:rgb(172.89999999999998, 172.89999999999998, 247);" data-v-c91d4a34></rect><rect x="61" y="151" width="10" height="30" class="cell" style="fill:rgb(173, 121.1, 121.1);" data-v-c91d4a34></rect><rect x="71" y="151" width="10" height="30" class="cell" style="fill:rgb(67.89999999999999, 97, 67.89999999999999);" data-v-c91d4a34></rect><rect x="81" y="151" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="91" y="151" width="10" height="30" class="cell" style="fill:rgb(66, 46.199999999999996, 46.199999999999996);" data-v-c91d4a34></rect><rect x="101" y="151" width="10" height="30" class="cell" style="fill:rgb(102.19999999999999, 146, 102.19999999999999);" data-v-c91d4a34></rect><rect x="111" y="151" width="10" height="30" class="cell" style="fill:rgb(155.39999999999998, 155.39999999999998, 222);" data-v-c91d4a34></rect><rect x="121" y="151" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="131" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="141" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="151" y="151" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="161" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="171" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="181" y="151" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="191" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="201" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="211" y="151" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="221" y="151" width="10" height="30" class="cell" style="fill:rgb(139.29999999999998, 199, 139.29999999999998);" data-v-c91d4a34></rect><rect x="231" y="151" width="10" height="30" class="cell" style="fill:rgb(86.1, 86.1, 123);" data-v-c91d4a34></rect><rect x="241" y="151" width="10" height="30" class="cell" style="fill:rgb(33, 23.099999999999998, 23.099999999999998);" data-v-c91d4a34></rect><rect x="251" y="151" width="10" height="30" class="cell" style="fill:rgb(25.2, 36, 25.2);" data-v-c91d4a34></rect><rect x="261" y="151" width="10" height="30" class="cell" style="fill:rgb(86.1, 86.1, 123);" data-v-c91d4a34></rect><rect x="271" y="151" width="10" height="30" class="cell" style="fill:rgb(198, 138.6, 138.6);" data-v-c91d4a34></rect><rect x="281" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="291" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="301" y="151" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="311" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="321" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="331" y="151" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="341" y="151" width="10" height="30" class="cell" style="fill:rgb(153.29999999999998, 219, 153.29999999999998);" data-v-c91d4a34></rect><rect x="351" y="151" width="10" height="30" class="cell" style="fill:rgb(103.6, 103.6, 148);" data-v-c91d4a34></rect><rect x="361" y="151" width="10" height="30" class="cell" style="fill:rgb(66, 46.199999999999996, 46.199999999999996);" data-v-c91d4a34></rect><rect x="371" y="151" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="381" y="151" width="10" height="30" class="cell" style="fill:rgb(74.89999999999999, 74.89999999999999, 107);" data-v-c91d4a34></rect><rect x="391" y="151" width="10" height="30" class="cell" style="fill:rgb(189, 132.29999999999998, 132.29999999999998);" data-v-c91d4a34></rect><rect x="401" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="411" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="421" y="151" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="431" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="441" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="451" y="151" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="461" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="471" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="481" y="151" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="491" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="501" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="511" y="151" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="521" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="531" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="541" y="151" width="10" height="30" class="cell" style="fill:rgb(198, 138.6, 138.6);" data-v-c91d4a34></rect><rect x="551" y="151" width="10" height="30" class="cell" style="fill:rgb(84.69999999999999, 121, 84.69999999999999);" data-v-c91d4a34></rect><rect x="561" y="151" width="10" height="30" class="cell" style="fill:rgb(23.099999999999998, 23.099999999999998, 33);" data-v-c91d4a34></rect><rect x="571" y="151" width="10" height="30" class="cell" style="fill:rgb(16, 11.2, 11.2);" data-v-c91d4a34></rect><rect x="581" y="151" width="10" height="30" class="cell" style="fill:rgb(14, 20, 14);" data-v-c91d4a34></rect><rect x="591" y="151" width="10" height="30" class="cell" style="fill:rgb(11.2, 11.2, 16);" data-v-c91d4a34></rect><rect x="601" y="151" width="10" height="30" class="cell" style="fill:rgb(57, 39.9, 39.9);" data-v-c91d4a34></rect><rect x="611" y="151" width="10" height="30" class="cell" style="fill:rgb(93.8, 134, 93.8);" data-v-c91d4a34></rect><rect x="621" y="151" width="10" height="30" class="cell" style="fill:rgb(144.2, 144.2, 206);" data-v-c91d4a34></rect><rect x="631" y="151" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="641" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="651" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="661" y="151" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="671" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="681" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="691" y="151" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="701" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="711" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="721" y="151" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="731" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="741" y="151" width="10" height="30" class="cell" style="fill:rgb(132.29999999999998, 132.29999999999998, 189);" data-v-c91d4a34></rect><rect x="751" y="151" width="10" height="30" class="cell" style="fill:rgb(107, 74.89999999999999, 74.89999999999999);" data-v-c91d4a34></rect><rect x="761" y="151" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="771" y="151" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="781" y="151" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="791" y="151" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="801" y="151" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="811" y="151" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="821" y="151" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="831" y="151" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="841" y="151" width="10" height="30" class="cell" style="fill:rgb(107, 74.89999999999999, 74.89999999999999);" data-v-c91d4a34></rect><rect x="851" y="151" width="10" height="30" class="cell" style="fill:rgb(130.2, 186, 130.2);" data-v-c91d4a34></rect><rect x="861" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="871" y="151" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="881" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="891" y="151" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="1" y="181" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="11" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="21" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="31" y="181" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="41" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="51" y="181" width="10" height="30" class="cell" style="fill:rgb(155.39999999999998, 155.39999999999998, 222);" data-v-c91d4a34></rect><rect x="61" y="181" width="10" height="30" class="cell" style="fill:rgb(148, 103.6, 103.6);" data-v-c91d4a34></rect><rect x="71" y="181" width="10" height="30" class="cell" style="fill:rgb(48.3, 69, 48.3);" data-v-c91d4a34></rect><rect x="81" y="181" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="91" y="181" width="10" height="30" class="cell" style="fill:rgb(107, 74.89999999999999, 74.89999999999999);" data-v-c91d4a34></rect><rect x="101" y="181" width="10" height="30" class="cell" style="fill:rgb(130.2, 186, 130.2);" data-v-c91d4a34></rect><rect x="111" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="121" y="181" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="131" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="141" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="151" y="181" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="161" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="171" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="181" y="181" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="191" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="201" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="211" y="181" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="221" y="181" width="10" height="30" class="cell" style="fill:rgb(175.7, 251, 175.7);" data-v-c91d4a34></rect><rect x="231" y="181" width="10" height="30" class="cell" style="fill:rgb(126.69999999999999, 126.69999999999999, 181);" data-v-c91d4a34></rect><rect x="241" y="181" width="10" height="30" class="cell" style="fill:rgb(107, 74.89999999999999, 74.89999999999999);" data-v-c91d4a34></rect><rect x="251" y="181" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="261" y="181" width="10" height="30" class="cell" style="fill:rgb(46.199999999999996, 46.199999999999996, 66);" data-v-c91d4a34></rect><rect x="271" y="181" width="10" height="30" class="cell" style="fill:rgb(148, 103.6, 103.6);" data-v-c91d4a34></rect><rect x="281" y="181" width="10" height="30" class="cell" style="fill:rgb(153.29999999999998, 219, 153.29999999999998);" data-v-c91d4a34></rect><rect x="291" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="301" y="181" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="311" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="321" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="331" y="181" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="341" y="181" width="10" height="30" class="cell" style="fill:rgb(153.29999999999998, 219, 153.29999999999998);" data-v-c91d4a34></rect><rect x="351" y="181" width="10" height="30" class="cell" style="fill:rgb(103.6, 103.6, 148);" data-v-c91d4a34></rect><rect x="361" y="181" width="10" height="30" class="cell" style="fill:rgb(66, 46.199999999999996, 46.199999999999996);" data-v-c91d4a34></rect><rect x="371" y="181" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="381" y="181" width="10" height="30" class="cell" style="fill:rgb(74.89999999999999, 74.89999999999999, 107);" data-v-c91d4a34></rect><rect x="391" y="181" width="10" height="30" class="cell" style="fill:rgb(189, 132.29999999999998, 132.29999999999998);" data-v-c91d4a34></rect><rect x="401" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="411" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="421" y="181" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="431" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="441" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="451" y="181" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="461" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="471" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="481" y="181" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="491" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="501" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="511" y="181" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="521" y="181" width="10" height="30" class="cell" style="fill:rgb(153.29999999999998, 219, 153.29999999999998);" data-v-c91d4a34></rect><rect x="531" y="181" width="10" height="30" class="cell" style="fill:rgb(103.6, 103.6, 148);" data-v-c91d4a34></rect><rect x="541" y="181" width="10" height="30" class="cell" style="fill:rgb(74, 51.8, 51.8);" data-v-c91d4a34></rect><rect x="551" y="181" width="10" height="30" class="cell" style="fill:rgb(16.799999999999997, 24, 16.799999999999997);" data-v-c91d4a34></rect><rect x="561" y="181" width="10" height="30" class="cell" style="fill:rgb(57.4, 57.4, 82);" data-v-c91d4a34></rect><rect x="571" y="181" width="10" height="30" class="cell" style="fill:rgb(165, 115.49999999999999, 115.49999999999999);" data-v-c91d4a34></rect><rect x="581" y="181" width="10" height="30" class="cell" style="fill:rgb(136.5, 195, 136.5);" data-v-c91d4a34></rect><rect x="591" y="181" width="10" height="30" class="cell" style="fill:rgb(103.6, 103.6, 148);" data-v-c91d4a34></rect><rect x="601" y="181" width="10" height="30" class="cell" style="fill:rgb(74, 51.8, 51.8);" data-v-c91d4a34></rect><rect x="611" y="181" width="10" height="30" class="cell" style="fill:rgb(16.799999999999997, 24, 16.799999999999997);" data-v-c91d4a34></rect><rect x="621" y="181" width="10" height="30" class="cell" style="fill:rgb(51.8, 51.8, 74);" data-v-c91d4a34></rect><rect x="631" y="181" width="10" height="30" class="cell" style="fill:rgb(132, 92.39999999999999, 92.39999999999999);" data-v-c91d4a34></rect><rect x="641" y="181" width="10" height="30" class="cell" style="fill:rgb(142.1, 203, 142.1);" data-v-c91d4a34></rect><rect x="651" y="181" width="10" height="30" class="cell" style="fill:rgb(167.29999999999998, 167.29999999999998, 239);" data-v-c91d4a34></rect><rect x="661" y="181" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="671" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="681" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="691" y="181" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="701" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="711" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="721" y="181" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="731" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="741" y="181" width="10" height="30" class="cell" style="fill:rgb(132.29999999999998, 132.29999999999998, 189);" data-v-c91d4a34></rect><rect x="751" y="181" width="10" height="30" class="cell" style="fill:rgb(107, 74.89999999999999, 74.89999999999999);" data-v-c91d4a34></rect><rect x="761" y="181" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="771" y="181" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="781" y="181" width="10" height="30" class="cell" style="fill:rgb(107, 74.89999999999999, 74.89999999999999);" data-v-c91d4a34></rect><rect x="791" y="181" width="10" height="30" class="cell" style="fill:rgb(130.2, 186, 130.2);" data-v-c91d4a34></rect><rect x="801" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="811" y="181" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="821" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="831" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="841" y="181" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="851" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="861" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="871" y="181" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="881" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="891" y="181" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="1" y="211" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="11" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="21" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="31" y="211" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="41" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="51" y="211" width="10" height="30" class="cell" style="fill:rgb(138.6, 138.6, 198);" data-v-c91d4a34></rect><rect x="61" y="211" width="10" height="30" class="cell" style="fill:rgb(123, 86.1, 86.1);" data-v-c91d4a34></rect><rect x="71" y="211" width="10" height="30" class="cell" style="fill:rgb(25.2, 36, 25.2);" data-v-c91d4a34></rect><rect x="81" y="211" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="91" y="211" width="10" height="30" class="cell" style="fill:rgb(107, 74.89999999999999, 74.89999999999999);" data-v-c91d4a34></rect><rect x="101" y="211" width="10" height="30" class="cell" style="fill:rgb(130.2, 186, 130.2);" data-v-c91d4a34></rect><rect x="111" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="121" y="211" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="131" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="141" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="151" y="211" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="161" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="171" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="181" y="211" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="191" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="201" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="211" y="211" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="221" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="231" y="211" width="10" height="30" class="cell" style="fill:rgb(132.29999999999998, 132.29999999999998, 189);" data-v-c91d4a34></rect><rect x="241" y="211" width="10" height="30" class="cell" style="fill:rgb(107, 74.89999999999999, 74.89999999999999);" data-v-c91d4a34></rect><rect x="251" y="211" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="261" y="211" width="10" height="30" class="cell" style="fill:rgb(46.199999999999996, 46.199999999999996, 66);" data-v-c91d4a34></rect><rect x="271" y="211" width="10" height="30" class="cell" style="fill:rgb(148, 103.6, 103.6);" data-v-c91d4a34></rect><rect x="281" y="211" width="10" height="30" class="cell" style="fill:rgb(153.29999999999998, 219, 153.29999999999998);" data-v-c91d4a34></rect><rect x="291" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="301" y="211" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="311" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="321" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="331" y="211" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="341" y="211" width="10" height="30" class="cell" style="fill:rgb(153.29999999999998, 219, 153.29999999999998);" data-v-c91d4a34></rect><rect x="351" y="211" width="10" height="30" class="cell" style="fill:rgb(103.6, 103.6, 148);" data-v-c91d4a34></rect><rect x="361" y="211" width="10" height="30" class="cell" style="fill:rgb(66, 46.199999999999996, 46.199999999999996);" data-v-c91d4a34></rect><rect x="371" y="211" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="381" y="211" width="10" height="30" class="cell" style="fill:rgb(74.89999999999999, 74.89999999999999, 107);" data-v-c91d4a34></rect><rect x="391" y="211" width="10" height="30" class="cell" style="fill:rgb(189, 132.29999999999998, 132.29999999999998);" data-v-c91d4a34></rect><rect x="401" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="411" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="421" y="211" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="431" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="441" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="451" y="211" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="461" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="471" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="481" y="211" width="10" height="30" class="cell" style="fill:rgb(239, 167.29999999999998, 167.29999999999998);" data-v-c91d4a34></rect><rect x="491" y="211" width="10" height="30" class="cell" style="fill:rgb(139.29999999999998, 199, 139.29999999999998);" data-v-c91d4a34></rect><rect x="501" y="211" width="10" height="30" class="cell" style="fill:rgb(98, 98, 140);" data-v-c91d4a34></rect><rect x="511" y="211" width="10" height="30" class="cell" style="fill:rgb(74, 51.8, 51.8);" data-v-c91d4a34></rect><rect x="521" y="211" width="10" height="30" class="cell" style="fill:rgb(16.799999999999997, 24, 16.799999999999997);" data-v-c91d4a34></rect><rect x="531" y="211" width="10" height="30" class="cell" style="fill:rgb(11.2, 11.2, 16);" data-v-c91d4a34></rect><rect x="541" y="211" width="10" height="30" class="cell" style="fill:rgb(74, 51.8, 51.8);" data-v-c91d4a34></rect><rect x="551" y="211" width="10" height="30" class="cell" style="fill:rgb(102.19999999999999, 146, 102.19999999999999);" data-v-c91d4a34></rect><rect x="561" y="211" width="10" height="30" class="cell" style="fill:rgb(155.39999999999998, 155.39999999999998, 222);" data-v-c91d4a34></rect><rect x="571" y="211" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="581" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="591" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="601" y="211" width="10" height="30" class="cell" style="fill:rgb(239, 167.29999999999998, 167.29999999999998);" data-v-c91d4a34></rect><rect x="611" y="211" width="10" height="30" class="cell" style="fill:rgb(130.2, 186, 130.2);" data-v-c91d4a34></rect><rect x="621" y="211" width="10" height="30" class="cell" style="fill:rgb(74.89999999999999, 74.89999999999999, 107);" data-v-c91d4a34></rect><rect x="631" y="211" width="10" height="30" class="cell" style="fill:rgb(41, 28.7, 28.7);" data-v-c91d4a34></rect><rect x="641" y="211" width="10" height="30" class="cell" style="fill:rgb(14, 20, 14);" data-v-c91d4a34></rect><rect x="651" y="211" width="10" height="30" class="cell" style="fill:rgb(34.3, 34.3, 49);" data-v-c91d4a34></rect><rect x="661" y="211" width="10" height="30" class="cell" style="fill:rgb(90, 62.99999999999999, 62.99999999999999);" data-v-c91d4a34></rect><rect x="671" y="211" width="10" height="30" class="cell" style="fill:rgb(102.19999999999999, 146, 102.19999999999999);" data-v-c91d4a34></rect><rect x="681" y="211" width="10" height="30" class="cell" style="fill:rgb(138.6, 138.6, 198);" data-v-c91d4a34></rect><rect x="691" y="211" width="10" height="30" class="cell" style="fill:rgb(231, 161.7, 161.7);" data-v-c91d4a34></rect><rect x="701" y="211" width="10" height="30" class="cell" style="fill:rgb(172.89999999999998, 247, 172.89999999999998);" data-v-c91d4a34></rect><rect x="711" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="721" y="211" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="731" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="741" y="211" width="10" height="30" class="cell" style="fill:rgb(132.29999999999998, 132.29999999999998, 189);" data-v-c91d4a34></rect><rect x="751" y="211" width="10" height="30" class="cell" style="fill:rgb(107, 74.89999999999999, 74.89999999999999);" data-v-c91d4a34></rect><rect x="761" y="211" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="771" y="211" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="781" y="211" width="10" height="30" class="cell" style="fill:rgb(107, 74.89999999999999, 74.89999999999999);" data-v-c91d4a34></rect><rect x="791" y="211" width="10" height="30" class="cell" style="fill:rgb(130.2, 186, 130.2);" data-v-c91d4a34></rect><rect x="801" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="811" y="211" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="821" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="831" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="841" y="211" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="851" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="861" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="871" y="211" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="881" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="891" y="211" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="1" y="241" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="11" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="21" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="31" y="241" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="41" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="51" y="241" width="10" height="30" class="cell" style="fill:rgb(155.39999999999998, 155.39999999999998, 222);" data-v-c91d4a34></rect><rect x="61" y="241" width="10" height="30" class="cell" style="fill:rgb(148, 103.6, 103.6);" data-v-c91d4a34></rect><rect x="71" y="241" width="10" height="30" class="cell" style="fill:rgb(48.3, 69, 48.3);" data-v-c91d4a34></rect><rect x="81" y="241" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="91" y="241" width="10" height="30" class="cell" style="fill:rgb(107, 74.89999999999999, 74.89999999999999);" data-v-c91d4a34></rect><rect x="101" y="241" width="10" height="30" class="cell" style="fill:rgb(127.39999999999999, 182, 127.39999999999999);" data-v-c91d4a34></rect><rect x="111" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="121" y="241" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="131" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="141" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="151" y="241" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="161" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="171" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="181" y="241" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="191" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="201" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="211" y="241" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="221" y="241" width="10" height="30" class="cell" style="fill:rgb(156.1, 223, 156.1);" data-v-c91d4a34></rect><rect x="231" y="241" width="10" height="30" class="cell" style="fill:rgb(103.6, 103.6, 148);" data-v-c91d4a34></rect><rect x="241" y="241" width="10" height="30" class="cell" style="fill:rgb(74, 51.8, 51.8);" data-v-c91d4a34></rect><rect x="251" y="241" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="261" y="241" width="10" height="30" class="cell" style="fill:rgb(57.4, 57.4, 82);" data-v-c91d4a34></rect><rect x="271" y="241" width="10" height="30" class="cell" style="fill:rgb(165, 115.49999999999999, 115.49999999999999);" data-v-c91d4a34></rect><rect x="281" y="241" width="10" height="30" class="cell" style="fill:rgb(164.5, 235, 164.5);" data-v-c91d4a34></rect><rect x="291" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="301" y="241" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="311" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="321" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="331" y="241" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="341" y="241" width="10" height="30" class="cell" style="fill:rgb(153.29999999999998, 219, 153.29999999999998);" data-v-c91d4a34></rect><rect x="351" y="241" width="10" height="30" class="cell" style="fill:rgb(103.6, 103.6, 148);" data-v-c91d4a34></rect><rect x="361" y="241" width="10" height="30" class="cell" style="fill:rgb(66, 46.199999999999996, 46.199999999999996);" data-v-c91d4a34></rect><rect x="371" y="241" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="381" y="241" width="10" height="30" class="cell" style="fill:rgb(74.89999999999999, 74.89999999999999, 107);" data-v-c91d4a34></rect><rect x="391" y="241" width="10" height="30" class="cell" style="fill:rgb(189, 132.29999999999998, 132.29999999999998);" data-v-c91d4a34></rect><rect x="401" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="411" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="421" y="241" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="431" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="441" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="451" y="241" width="10" height="30" class="cell" style="fill:rgb(231, 161.7, 161.7);" data-v-c91d4a34></rect><rect x="461" y="241" width="10" height="30" class="cell" style="fill:rgb(113.39999999999999, 162, 113.39999999999999);" data-v-c91d4a34></rect><rect x="471" y="241" width="10" height="30" class="cell" style="fill:rgb(57.4, 57.4, 82);" data-v-c91d4a34></rect><rect x="481" y="241" width="10" height="30" class="cell" style="fill:rgb(16, 11.2, 11.2);" data-v-c91d4a34></rect><rect x="491" y="241" width="10" height="30" class="cell" style="fill:rgb(14, 20, 14);" data-v-c91d4a34></rect><rect x="501" y="241" width="10" height="30" class="cell" style="fill:rgb(34.3, 34.3, 49);" data-v-c91d4a34></rect><rect x="511" y="241" width="10" height="30" class="cell" style="fill:rgb(90, 62.99999999999999, 62.99999999999999);" data-v-c91d4a34></rect><rect x="521" y="241" width="10" height="30" class="cell" style="fill:rgb(113.39999999999999, 162, 113.39999999999999);" data-v-c91d4a34></rect><rect x="531" y="241" width="10" height="30" class="cell" style="fill:rgb(155.39999999999998, 155.39999999999998, 222);" data-v-c91d4a34></rect><rect x="541" y="241" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="551" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="561" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="571" y="241" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="581" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="591" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="601" y="241" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="611" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="621" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="631" y="241" width="10" height="30" class="cell" style="fill:rgb(247, 172.89999999999998, 172.89999999999998);" data-v-c91d4a34></rect><rect x="641" y="241" width="10" height="30" class="cell" style="fill:rgb(156.1, 223, 156.1);" data-v-c91d4a34></rect><rect x="651" y="241" width="10" height="30" class="cell" style="fill:rgb(126.69999999999999, 126.69999999999999, 181);" data-v-c91d4a34></rect><rect x="661" y="241" width="10" height="30" class="cell" style="fill:rgb(115, 80.5, 80.5);" data-v-c91d4a34></rect><rect x="671" y="241" width="10" height="30" class="cell" style="fill:rgb(51.099999999999994, 73, 51.099999999999994);" data-v-c91d4a34></rect><rect x="681" y="241" width="10" height="30" class="cell" style="fill:rgb(62.99999999999999, 62.99999999999999, 90);" data-v-c91d4a34></rect><rect x="691" y="241" width="10" height="30" class="cell" style="fill:rgb(156, 109.19999999999999, 109.19999999999999);" data-v-c91d4a34></rect><rect x="701" y="241" width="10" height="30" class="cell" style="fill:rgb(158.89999999999998, 227, 158.89999999999998);" data-v-c91d4a34></rect><rect x="711" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="721" y="241" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="731" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="741" y="241" width="10" height="30" class="cell" style="fill:rgb(132.29999999999998, 132.29999999999998, 189);" data-v-c91d4a34></rect><rect x="751" y="241" width="10" height="30" class="cell" style="fill:rgb(107, 74.89999999999999, 74.89999999999999);" data-v-c91d4a34></rect><rect x="761" y="241" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="771" y="241" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="781" y="241" width="10" height="30" class="cell" style="fill:rgb(107, 74.89999999999999, 74.89999999999999);" data-v-c91d4a34></rect><rect x="791" y="241" width="10" height="30" class="cell" style="fill:rgb(130.2, 186, 130.2);" data-v-c91d4a34></rect><rect x="801" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="811" y="241" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="821" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="831" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="841" y="241" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="851" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="861" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="871" y="241" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="881" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="891" y="241" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="1" y="271" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="11" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="21" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="31" y="271" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="41" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="51" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="61" y="271" width="10" height="30" class="cell" style="fill:rgb(198, 138.6, 138.6);" data-v-c91d4a34></rect><rect x="71" y="271" width="10" height="30" class="cell" style="fill:rgb(87.5, 125, 87.5);" data-v-c91d4a34></rect><rect x="81" y="271" width="10" height="30" class="cell" style="fill:rgb(23.099999999999998, 23.099999999999998, 33);" data-v-c91d4a34></rect><rect x="91" y="271" width="10" height="30" class="cell" style="fill:rgb(33, 23.099999999999998, 23.099999999999998);" data-v-c91d4a34></rect><rect x="101" y="271" width="10" height="30" class="cell" style="fill:rgb(84.69999999999999, 121, 84.69999999999999);" data-v-c91d4a34></rect><rect x="111" y="271" width="10" height="30" class="cell" style="fill:rgb(138.6, 138.6, 198);" data-v-c91d4a34></rect><rect x="121" y="271" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="131" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="141" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="151" y="271" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="161" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="171" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="181" y="271" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="191" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="201" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="211" y="271" width="10" height="30" class="cell" style="fill:rgb(239, 167.29999999999998, 167.29999999999998);" data-v-c91d4a34></rect><rect x="221" y="271" width="10" height="30" class="cell" style="fill:rgb(116.19999999999999, 166, 116.19999999999999);" data-v-c91d4a34></rect><rect x="231" y="271" width="10" height="30" class="cell" style="fill:rgb(62.99999999999999, 62.99999999999999, 90);" data-v-c91d4a34></rect><rect x="241" y="271" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="251" y="271" width="10" height="30" class="cell" style="fill:rgb(48.3, 69, 48.3);" data-v-c91d4a34></rect><rect x="261" y="271" width="10" height="30" class="cell" style="fill:rgb(103.6, 103.6, 148);" data-v-c91d4a34></rect><rect x="271" y="271" width="10" height="30" class="cell" style="fill:rgb(222, 155.39999999999998, 155.39999999999998);" data-v-c91d4a34></rect><rect x="281" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="291" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="301" y="271" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="311" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="321" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="331" y="271" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="341" y="271" width="10" height="30" class="cell" style="fill:rgb(153.29999999999998, 219, 153.29999999999998);" data-v-c91d4a34></rect><rect x="351" y="271" width="10" height="30" class="cell" style="fill:rgb(103.6, 103.6, 148);" data-v-c91d4a34></rect><rect x="361" y="271" width="10" height="30" class="cell" style="fill:rgb(66, 46.199999999999996, 46.199999999999996);" data-v-c91d4a34></rect><rect x="371" y="271" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="381" y="271" width="10" height="30" class="cell" style="fill:rgb(74.89999999999999, 74.89999999999999, 107);" data-v-c91d4a34></rect><rect x="391" y="271" width="10" height="30" class="cell" style="fill:rgb(189, 132.29999999999998, 132.29999999999998);" data-v-c91d4a34></rect><rect x="401" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="411" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="421" y="271" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="431" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="441" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="451" y="271" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="461" y="271" width="10" height="30" class="cell" style="fill:rgb(175.7, 251, 175.7);" data-v-c91d4a34></rect><rect x="471" y="271" width="10" height="30" class="cell" style="fill:rgb(172.89999999999998, 172.89999999999998, 247);" data-v-c91d4a34></rect><rect x="481" y="271" width="10" height="30" class="cell" style="fill:rgb(239, 167.29999999999998, 167.29999999999998);" data-v-c91d4a34></rect><rect x="491" y="271" width="10" height="30" class="cell" style="fill:rgb(170.1, 243, 170.1);" data-v-c91d4a34></rect><rect x="501" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="511" y="271" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="521" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="531" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="541" y="271" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="551" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="561" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="571" y="271" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="581" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="591" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="601" y="271" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="611" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="621" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="631" y="271" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="641" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="651" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="661" y="271" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="671" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="681" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="691" y="271" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="701" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="711" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="721" y="271" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="731" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="741" y="271" width="10" height="30" class="cell" style="fill:rgb(132.29999999999998, 132.29999999999998, 189);" data-v-c91d4a34></rect><rect x="751" y="271" width="10" height="30" class="cell" style="fill:rgb(123, 86.1, 86.1);" data-v-c91d4a34></rect><rect x="761" y="271" width="10" height="30" class="cell" style="fill:rgb(36.4, 52, 36.4);" data-v-c91d4a34></rect><rect x="771" y="271" width="10" height="30" class="cell" style="fill:rgb(34.3, 34.3, 49);" data-v-c91d4a34></rect><rect x="781" y="271" width="10" height="30" class="cell" style="fill:rgb(123, 86.1, 86.1);" data-v-c91d4a34></rect><rect x="791" y="271" width="10" height="30" class="cell" style="fill:rgb(133, 190, 133);" data-v-c91d4a34></rect><rect x="801" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="811" y="271" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="821" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="831" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="841" y="271" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="851" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="861" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="871" y="271" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="881" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="891" y="271" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="1" y="301" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="11" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="21" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="31" y="301" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="41" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="51" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="61" y="301" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="71" y="301" width="10" height="30" class="cell" style="fill:rgb(153.29999999999998, 219, 153.29999999999998);" data-v-c91d4a34></rect><rect x="81" y="301" width="10" height="30" class="cell" style="fill:rgb(103.6, 103.6, 148);" data-v-c91d4a34></rect><rect x="91" y="301" width="10" height="30" class="cell" style="fill:rgb(74, 51.8, 51.8);" data-v-c91d4a34></rect><rect x="101" y="301" width="10" height="30" class="cell" style="fill:rgb(14, 20, 14);" data-v-c91d4a34></rect><rect x="111" y="301" width="10" height="30" class="cell" style="fill:rgb(28.7, 28.7, 41);" data-v-c91d4a34></rect><rect x="121" y="301" width="10" height="30" class="cell" style="fill:rgb(107, 74.89999999999999, 74.89999999999999);" data-v-c91d4a34></rect><rect x="131" y="301" width="10" height="30" class="cell" style="fill:rgb(124.6, 178, 124.6);" data-v-c91d4a34></rect><rect x="141" y="301" width="10" height="30" class="cell" style="fill:rgb(161.7, 161.7, 231);" data-v-c91d4a34></rect><rect x="151" y="301" width="10" height="30" class="cell" style="fill:rgb(247, 172.89999999999998, 172.89999999999998);" data-v-c91d4a34></rect><rect x="161" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="171" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="181" y="301" width="10" height="30" class="cell" style="fill:rgb(247, 172.89999999999998, 172.89999999999998);" data-v-c91d4a34></rect><rect x="191" y="301" width="10" height="30" class="cell" style="fill:rgb(156.1, 223, 156.1);" data-v-c91d4a34></rect><rect x="201" y="301" width="10" height="30" class="cell" style="fill:rgb(115.49999999999999, 115.49999999999999, 165);" data-v-c91d4a34></rect><rect x="211" y="301" width="10" height="30" class="cell" style="fill:rgb(99, 69.3, 69.3);" data-v-c91d4a34></rect><rect x="221" y="301" width="10" height="30" class="cell" style="fill:rgb(30.799999999999997, 44, 30.799999999999997);" data-v-c91d4a34></rect><rect x="231" y="301" width="10" height="30" class="cell" style="fill:rgb(11.2, 11.2, 16);" data-v-c91d4a34></rect><rect x="241" y="301" width="10" height="30" class="cell" style="fill:rgb(99, 69.3, 69.3);" data-v-c91d4a34></rect><rect x="251" y="301" width="10" height="30" class="cell" style="fill:rgb(118.99999999999999, 170, 118.99999999999999);" data-v-c91d4a34></rect><rect x="261" y="301" width="10" height="30" class="cell" style="fill:rgb(167.29999999999998, 167.29999999999998, 239);" data-v-c91d4a34></rect><rect x="271" y="301" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="281" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="291" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="301" y="301" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="311" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="321" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="331" y="301" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="341" y="301" width="10" height="30" class="cell" style="fill:rgb(153.29999999999998, 219, 153.29999999999998);" data-v-c91d4a34></rect><rect x="351" y="301" width="10" height="30" class="cell" style="fill:rgb(103.6, 103.6, 148);" data-v-c91d4a34></rect><rect x="361" y="301" width="10" height="30" class="cell" style="fill:rgb(66, 46.199999999999996, 46.199999999999996);" data-v-c91d4a34></rect><rect x="371" y="301" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="381" y="301" width="10" height="30" class="cell" style="fill:rgb(74.89999999999999, 74.89999999999999, 107);" data-v-c91d4a34></rect><rect x="391" y="301" width="10" height="30" class="cell" style="fill:rgb(189, 132.29999999999998, 132.29999999999998);" data-v-c91d4a34></rect><rect x="401" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="411" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="421" y="301" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="431" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="441" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="451" y="301" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="461" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="471" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="481" y="301" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="491" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="501" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="511" y="301" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="521" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="531" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="541" y="301" width="10" height="30" class="cell" style="fill:rgb(247, 172.89999999999998, 172.89999999999998);" data-v-c91d4a34></rect><rect x="551" y="301" width="10" height="30" class="cell" style="fill:rgb(156.1, 223, 156.1);" data-v-c91d4a34></rect><rect x="561" y="301" width="10" height="30" class="cell" style="fill:rgb(138.6, 138.6, 198);" data-v-c91d4a34></rect><rect x="571" y="301" width="10" height="30" class="cell" style="fill:rgb(156, 109.19999999999999, 109.19999999999999);" data-v-c91d4a34></rect><rect x="581" y="301" width="10" height="30" class="cell" style="fill:rgb(96.6, 138, 96.6);" data-v-c91d4a34></rect><rect x="591" y="301" width="10" height="30" class="cell" style="fill:rgb(74.89999999999999, 74.89999999999999, 107);" data-v-c91d4a34></rect><rect x="601" y="301" width="10" height="30" class="cell" style="fill:rgb(82, 57.4, 57.4);" data-v-c91d4a34></rect><rect x="611" y="301" width="10" height="30" class="cell" style="fill:rgb(45.5, 65, 45.5);" data-v-c91d4a34></rect><rect x="621" y="301" width="10" height="30" class="cell" style="fill:rgb(34.3, 34.3, 49);" data-v-c91d4a34></rect><rect x="631" y="301" width="10" height="30" class="cell" style="fill:rgb(49, 34.3, 34.3);" data-v-c91d4a34></rect><rect x="641" y="301" width="10" height="30" class="cell" style="fill:rgb(36.4, 52, 36.4);" data-v-c91d4a34></rect><rect x="651" y="301" width="10" height="30" class="cell" style="fill:rgb(34.3, 34.3, 49);" data-v-c91d4a34></rect><rect x="661" y="301" width="10" height="30" class="cell" style="fill:rgb(49, 34.3, 34.3);" data-v-c91d4a34></rect><rect x="671" y="301" width="10" height="30" class="cell" style="fill:rgb(36.4, 52, 36.4);" data-v-c91d4a34></rect><rect x="681" y="301" width="10" height="30" class="cell" style="fill:rgb(34.3, 34.3, 49);" data-v-c91d4a34></rect><rect x="691" y="301" width="10" height="30" class="cell" style="fill:rgb(74, 51.8, 51.8);" data-v-c91d4a34></rect><rect x="701" y="301" width="10" height="30" class="cell" style="fill:rgb(67.89999999999999, 97, 67.89999999999999);" data-v-c91d4a34></rect><rect x="711" y="301" width="10" height="30" class="cell" style="fill:rgb(80.5, 80.5, 115);" data-v-c91d4a34></rect><rect x="721" y="301" width="10" height="30" class="cell" style="fill:rgb(140, 98, 98);" data-v-c91d4a34></rect><rect x="731" y="301" width="10" height="30" class="cell" style="fill:rgb(116.19999999999999, 166, 116.19999999999999);" data-v-c91d4a34></rect><rect x="741" y="301" width="10" height="30" class="cell" style="fill:rgb(144.2, 144.2, 206);" data-v-c91d4a34></rect><rect x="751" y="301" width="10" height="30" class="cell" style="fill:rgb(231, 161.7, 161.7);" data-v-c91d4a34></rect><rect x="761" y="301" width="10" height="30" class="cell" style="fill:rgb(172.89999999999998, 247, 172.89999999999998);" data-v-c91d4a34></rect><rect x="771" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="781" y="301" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="791" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="801" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="811" y="301" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="821" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="831" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="841" y="301" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="851" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="861" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="871" y="301" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="881" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="891" y="301" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="1" y="331" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="11" y="331" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="21" y="331" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="31" y="331" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="41" y="331" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="51" y="331" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="61" y="331" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="71" y="331" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="81" y="331" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="91" y="331" width="10" height="30" class="cell" style="fill:rgb(239, 167.29999999999998, 167.29999999999998);" data-v-c91d4a34></rect><rect x="101" y="331" width="10" height="30" class="cell" style="fill:rgb(136.5, 195, 136.5);" data-v-c91d4a34></rect><rect x="111" y="331" width="10" height="30" class="cell" style="fill:rgb(92.39999999999999, 92.39999999999999, 132);" data-v-c91d4a34></rect><rect x="121" y="331" width="10" height="30" class="cell" style="fill:rgb(74, 51.8, 51.8);" data-v-c91d4a34></rect><rect x="131" y="331" width="10" height="30" class="cell" style="fill:rgb(22.4, 32, 22.4);" data-v-c91d4a34></rect><rect x="141" y="331" width="10" height="30" class="cell" style="fill:rgb(11.2, 11.2, 16);" data-v-c91d4a34></rect><rect x="151" y="331" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="161" y="331" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="171" y="331" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="181" y="331" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="191" y="331" width="10" height="30" class="cell" style="fill:rgb(14, 20, 14);" data-v-c91d4a34></rect><rect x="201" y="331" width="10" height="30" class="cell" style="fill:rgb(34.3, 34.3, 49);" data-v-c91d4a34></rect><rect x="211" y="331" width="10" height="30" class="cell" style="fill:rgb(90, 62.99999999999999, 62.99999999999999);" data-v-c91d4a34></rect><rect x="221" y="331" width="10" height="30" class="cell" style="fill:rgb(110.6, 158, 110.6);" data-v-c91d4a34></rect><rect x="231" y="331" width="10" height="30" class="cell" style="fill:rgb(149.79999999999998, 149.79999999999998, 214);" data-v-c91d4a34></rect><rect x="241" y="331" width="10" height="30" class="cell" style="fill:rgb(247, 172.89999999999998, 172.89999999999998);" data-v-c91d4a34></rect><rect x="251" y="331" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="261" y="331" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="271" y="331" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="281" y="331" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="291" y="331" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="301" y="331" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="311" y="331" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="321" y="331" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="331" y="331" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="341" y="331" width="10" height="30" class="cell" style="fill:rgb(153.29999999999998, 219, 153.29999999999998);" data-v-c91d4a34></rect><rect x="351" y="331" width="10" height="30" class="cell" style="fill:rgb(103.6, 103.6, 148);" data-v-c91d4a34></rect><rect x="361" y="331" width="10" height="30" class="cell" style="fill:rgb(66, 46.199999999999996, 46.199999999999996);" data-v-c91d4a34></rect><rect x="371" y="331" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="381" y="331" width="10" height="30" class="cell" style="fill:rgb(74.89999999999999, 74.89999999999999, 107);" data-v-c91d4a34></rect><rect x="391" y="331" width="10" height="30" class="cell" style="fill:rgb(189, 132.29999999999998, 132.29999999999998);" data-v-c91d4a34></rect><rect x="401" y="331" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="411" y="331" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="421" y="331" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="431" y="331" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="441" y="331" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="451" y="331" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="461" y="331" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="471" y="331" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="481" y="331" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="491" y="331" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="501" y="331" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="511" y="331" width="10" height="30" class="cell" style="fill:rgb(239, 167.29999999999998, 167.29999999999998);" data-v-c91d4a34></rect><rect x="521" y="331" width="10" height="30" class="cell" style="fill:rgb(130.2, 186, 130.2);" data-v-c91d4a34></rect><rect x="531" y="331" width="10" height="30" class="cell" style="fill:rgb(74.89999999999999, 74.89999999999999, 107);" data-v-c91d4a34></rect><rect x="541" y="331" width="10" height="30" class="cell" style="fill:rgb(41, 28.7, 28.7);" data-v-c91d4a34></rect><rect x="551" y="331" width="10" height="30" class="cell" style="fill:rgb(14, 20, 14);" data-v-c91d4a34></rect><rect x="561" y="331" width="10" height="30" class="cell" style="fill:rgb(34.3, 34.3, 49);" data-v-c91d4a34></rect><rect x="571" y="331" width="10" height="30" class="cell" style="fill:rgb(90, 62.99999999999999, 62.99999999999999);" data-v-c91d4a34></rect><rect x="581" y="331" width="10" height="30" class="cell" style="fill:rgb(96.6, 138, 96.6);" data-v-c91d4a34></rect><rect x="591" y="331" width="10" height="30" class="cell" style="fill:rgb(126.69999999999999, 126.69999999999999, 181);" data-v-c91d4a34></rect><rect x="601" y="331" width="10" height="30" class="cell" style="fill:rgb(206, 144.2, 144.2);" data-v-c91d4a34></rect><rect x="611" y="331" width="10" height="30" class="cell" style="fill:rgb(156.1, 223, 156.1);" data-v-c91d4a34></rect><rect x="621" y="331" width="10" height="30" class="cell" style="fill:rgb(167.29999999999998, 167.29999999999998, 239);" data-v-c91d4a34></rect><rect x="631" y="331" width="10" height="30" class="cell" style="fill:rgb(239, 167.29999999999998, 167.29999999999998);" data-v-c91d4a34></rect><rect x="641" y="331" width="10" height="30" class="cell" style="fill:rgb(164.5, 235, 164.5);" data-v-c91d4a34></rect><rect x="651" y="331" width="10" height="30" class="cell" style="fill:rgb(167.29999999999998, 167.29999999999998, 239);" data-v-c91d4a34></rect><rect x="661" y="331" width="10" height="30" class="cell" style="fill:rgb(239, 167.29999999999998, 167.29999999999998);" data-v-c91d4a34></rect><rect x="671" y="331" width="10" height="30" class="cell" style="fill:rgb(164.5, 235, 164.5);" data-v-c91d4a34></rect><rect x="681" y="331" width="10" height="30" class="cell" style="fill:rgb(167.29999999999998, 167.29999999999998, 239);" data-v-c91d4a34></rect><rect x="691" y="331" width="10" height="30" class="cell" style="fill:rgb(214, 149.79999999999998, 149.79999999999998);" data-v-c91d4a34></rect><rect x="701" y="331" width="10" height="30" class="cell" style="fill:rgb(139.29999999999998, 199, 139.29999999999998);" data-v-c91d4a34></rect><rect x="711" y="331" width="10" height="30" class="cell" style="fill:rgb(121.1, 121.1, 173);" data-v-c91d4a34></rect><rect x="721" y="331" width="10" height="30" class="cell" style="fill:rgb(140, 98, 98);" data-v-c91d4a34></rect><rect x="731" y="331" width="10" height="30" class="cell" style="fill:rgb(65.1, 93, 65.1);" data-v-c91d4a34></rect><rect x="741" y="331" width="10" height="30" class="cell" style="fill:rgb(34.3, 34.3, 49);" data-v-c91d4a34></rect><rect x="751" y="331" width="10" height="30" class="cell" style="fill:rgb(24, 16.799999999999997, 16.799999999999997);" data-v-c91d4a34></rect><rect x="761" y="331" width="10" height="30" class="cell" style="fill:rgb(33.599999999999994, 48, 33.599999999999994);" data-v-c91d4a34></rect><rect x="771" y="331" width="10" height="30" class="cell" style="fill:rgb(80.5, 80.5, 115);" data-v-c91d4a34></rect><rect x="781" y="331" width="10" height="30" class="cell" style="fill:rgb(189, 132.29999999999998, 132.29999999999998);" data-v-c91d4a34></rect><rect x="791" y="331" width="10" height="30" class="cell" style="fill:rgb(170.1, 243, 170.1);" data-v-c91d4a34></rect><rect x="801" y="331" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="811" y="331" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="821" y="331" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="831" y="331" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="841" y="331" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="851" y="331" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="861" y="331" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="871" y="331" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="881" y="331" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="891" y="331" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="1" y="361" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="11" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="21" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="31" y="361" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="41" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="51" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="61" y="361" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="71" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="81" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="91" y="361" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="101" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="111" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="121" y="361" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="131" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="141" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="151" y="361" width="10" height="30" class="cell" style="fill:rgb(247, 172.89999999999998, 172.89999999999998);" data-v-c91d4a34></rect><rect x="161" y="361" width="10" height="30" class="cell" style="fill:rgb(164.5, 235, 164.5);" data-v-c91d4a34></rect><rect x="171" y="361" width="10" height="30" class="cell" style="fill:rgb(167.29999999999998, 167.29999999999998, 239);" data-v-c91d4a34></rect><rect x="181" y="361" width="10" height="30" class="cell" style="fill:rgb(247, 172.89999999999998, 172.89999999999998);" data-v-c91d4a34></rect><rect x="191" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="201" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="211" y="361" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="221" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="231" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="241" y="361" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="251" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="261" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="271" y="361" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="281" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="291" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="301" y="361" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="311" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="321" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="331" y="361" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="341" y="361" width="10" height="30" class="cell" style="fill:rgb(153.29999999999998, 219, 153.29999999999998);" data-v-c91d4a34></rect><rect x="351" y="361" width="10" height="30" class="cell" style="fill:rgb(103.6, 103.6, 148);" data-v-c91d4a34></rect><rect x="361" y="361" width="10" height="30" class="cell" style="fill:rgb(66, 46.199999999999996, 46.199999999999996);" data-v-c91d4a34></rect><rect x="371" y="361" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="381" y="361" width="10" height="30" class="cell" style="fill:rgb(74.89999999999999, 74.89999999999999, 107);" data-v-c91d4a34></rect><rect x="391" y="361" width="10" height="30" class="cell" style="fill:rgb(189, 132.29999999999998, 132.29999999999998);" data-v-c91d4a34></rect><rect x="401" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="411" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="421" y="361" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="431" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="441" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="451" y="361" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="461" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="471" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="481" y="361" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="491" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="501" y="361" width="10" height="30" class="cell" style="fill:rgb(155.39999999999998, 155.39999999999998, 222);" data-v-c91d4a34></rect><rect x="511" y="361" width="10" height="30" class="cell" style="fill:rgb(148, 103.6, 103.6);" data-v-c91d4a34></rect><rect x="521" y="361" width="10" height="30" class="cell" style="fill:rgb(51.099999999999994, 73, 51.099999999999994);" data-v-c91d4a34></rect><rect x="531" y="361" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="541" y="361" width="10" height="30" class="cell" style="fill:rgb(66, 46.199999999999996, 46.199999999999996);" data-v-c91d4a34></rect><rect x="551" y="361" width="10" height="30" class="cell" style="fill:rgb(102.19999999999999, 146, 102.19999999999999);" data-v-c91d4a34></rect><rect x="561" y="361" width="10" height="30" class="cell" style="fill:rgb(155.39999999999998, 155.39999999999998, 222);" data-v-c91d4a34></rect><rect x="571" y="361" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="581" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="591" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="601" y="361" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="611" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="621" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="631" y="361" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="641" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="651" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="661" y="361" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="671" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="681" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="691" y="361" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="701" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="711" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="721" y="361" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="731" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="741" y="361" width="10" height="30" class="cell" style="fill:rgb(155.39999999999998, 155.39999999999998, 222);" data-v-c91d4a34></rect><rect x="751" y="361" width="10" height="30" class="cell" style="fill:rgb(148, 103.6, 103.6);" data-v-c91d4a34></rect><rect x="761" y="361" width="10" height="30" class="cell" style="fill:rgb(45.5, 65, 45.5);" data-v-c91d4a34></rect><rect x="771" y="361" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="781" y="361" width="10" height="30" class="cell" style="fill:rgb(107, 74.89999999999999, 74.89999999999999);" data-v-c91d4a34></rect><rect x="791" y="361" width="10" height="30" class="cell" style="fill:rgb(130.2, 186, 130.2);" data-v-c91d4a34></rect><rect x="801" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="811" y="361" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="821" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="831" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="841" y="361" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="851" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="861" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="871" y="361" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="881" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="891" y="361" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="1" y="391" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="11" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="21" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="31" y="391" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="41" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="51" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="61" y="391" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="71" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="81" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="91" y="391" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="101" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="111" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="121" y="391" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="131" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="141" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="151" y="391" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="161" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="171" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="181" y="391" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="191" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="201" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="211" y="391" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="221" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="231" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="241" y="391" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="251" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="261" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="271" y="391" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="281" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="291" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="301" y="391" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="311" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="321" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="331" y="391" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="341" y="391" width="10" height="30" class="cell" style="fill:rgb(153.29999999999998, 219, 153.29999999999998);" data-v-c91d4a34></rect><rect x="351" y="391" width="10" height="30" class="cell" style="fill:rgb(103.6, 103.6, 148);" data-v-c91d4a34></rect><rect x="361" y="391" width="10" height="30" class="cell" style="fill:rgb(66, 46.199999999999996, 46.199999999999996);" data-v-c91d4a34></rect><rect x="371" y="391" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="381" y="391" width="10" height="30" class="cell" style="fill:rgb(74.89999999999999, 74.89999999999999, 107);" data-v-c91d4a34></rect><rect x="391" y="391" width="10" height="30" class="cell" style="fill:rgb(189, 132.29999999999998, 132.29999999999998);" data-v-c91d4a34></rect><rect x="401" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="411" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="421" y="391" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="431" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="441" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="451" y="391" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="461" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="471" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="481" y="391" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="491" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="501" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="511" y="391" width="10" height="30" class="cell" style="fill:rgb(198, 138.6, 138.6);" data-v-c91d4a34></rect><rect x="521" y="391" width="10" height="30" class="cell" style="fill:rgb(87.5, 125, 87.5);" data-v-c91d4a34></rect><rect x="531" y="391" width="10" height="30" class="cell" style="fill:rgb(28.7, 28.7, 41);" data-v-c91d4a34></rect><rect x="541" y="391" width="10" height="30" class="cell" style="fill:rgb(16, 11.2, 11.2);" data-v-c91d4a34></rect><rect x="551" y="391" width="10" height="30" class="cell" style="fill:rgb(51.099999999999994, 73, 51.099999999999994);" data-v-c91d4a34></rect><rect x="561" y="391" width="10" height="30" class="cell" style="fill:rgb(103.6, 103.6, 148);" data-v-c91d4a34></rect><rect x="571" y="391" width="10" height="30" class="cell" style="fill:rgb(206, 144.2, 144.2);" data-v-c91d4a34></rect><rect x="581" y="391" width="10" height="30" class="cell" style="fill:rgb(170.1, 243, 170.1);" data-v-c91d4a34></rect><rect x="591" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="601" y="391" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="611" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="621" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="631" y="391" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="641" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="651" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="661" y="391" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="671" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="681" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="691" y="391" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="701" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="711" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="721" y="391" width="10" height="30" class="cell" style="fill:rgb(239, 167.29999999999998, 167.29999999999998);" data-v-c91d4a34></rect><rect x="731" y="391" width="10" height="30" class="cell" style="fill:rgb(139.29999999999998, 199, 139.29999999999998);" data-v-c91d4a34></rect><rect x="741" y="391" width="10" height="30" class="cell" style="fill:rgb(92.39999999999999, 92.39999999999999, 132);" data-v-c91d4a34></rect><rect x="751" y="391" width="10" height="30" class="cell" style="fill:rgb(74, 51.8, 51.8);" data-v-c91d4a34></rect><rect x="761" y="391" width="10" height="30" class="cell" style="fill:rgb(14, 20, 14);" data-v-c91d4a34></rect><rect x="771" y="391" width="10" height="30" class="cell" style="fill:rgb(39.9, 39.9, 57);" data-v-c91d4a34></rect><rect x="781" y="391" width="10" height="30" class="cell" style="fill:rgb(140, 98, 98);" data-v-c91d4a34></rect><rect x="791" y="391" width="10" height="30" class="cell" style="fill:rgb(147.7, 211, 147.7);" data-v-c91d4a34></rect><rect x="801" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="811" y="391" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="821" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="831" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="841" y="391" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="851" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="861" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="871" y="391" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="881" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="891" y="391" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="1" y="421" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="11" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="21" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="31" y="421" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="41" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="51" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="61" y="421" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="71" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="81" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="91" y="421" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="101" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="111" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="121" y="421" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="131" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="141" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="151" y="421" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="161" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="171" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="181" y="421" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="191" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="201" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="211" y="421" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="221" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="231" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="241" y="421" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="251" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="261" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="271" y="421" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="281" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="291" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="301" y="421" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="311" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="321" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="331" y="421" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="341" y="421" width="10" height="30" class="cell" style="fill:rgb(153.29999999999998, 219, 153.29999999999998);" data-v-c91d4a34></rect><rect x="351" y="421" width="10" height="30" class="cell" style="fill:rgb(103.6, 103.6, 148);" data-v-c91d4a34></rect><rect x="361" y="421" width="10" height="30" class="cell" style="fill:rgb(66, 46.199999999999996, 46.199999999999996);" data-v-c91d4a34></rect><rect x="371" y="421" width="10" height="30" class="cell" style="fill:rgb(0, 0, 0);" data-v-c91d4a34></rect><rect x="381" y="421" width="10" height="30" class="cell" style="fill:rgb(74.89999999999999, 74.89999999999999, 107);" data-v-c91d4a34></rect><rect x="391" y="421" width="10" height="30" class="cell" style="fill:rgb(189, 132.29999999999998, 132.29999999999998);" data-v-c91d4a34></rect><rect x="401" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="411" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="421" y="421" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="431" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="441" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="451" y="421" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="461" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="471" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="481" y="421" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="491" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="501" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="511" y="421" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="521" y="421" width="10" height="30" class="cell" style="fill:rgb(175.7, 251, 175.7);" data-v-c91d4a34></rect><rect x="531" y="421" width="10" height="30" class="cell" style="fill:rgb(161.7, 161.7, 231);" data-v-c91d4a34></rect><rect x="541" y="421" width="10" height="30" class="cell" style="fill:rgb(181, 126.69999999999999, 126.69999999999999);" data-v-c91d4a34></rect><rect x="551" y="421" width="10" height="30" class="cell" style="fill:rgb(81.89999999999999, 117, 81.89999999999999);" data-v-c91d4a34></rect><rect x="561" y="421" width="10" height="30" class="cell" style="fill:rgb(51.8, 51.8, 74);" data-v-c91d4a34></rect><rect x="571" y="421" width="10" height="30" class="cell" style="fill:rgb(33, 23.099999999999998, 23.099999999999998);" data-v-c91d4a34></rect><rect x="581" y="421" width="10" height="30" class="cell" style="fill:rgb(14, 20, 14);" data-v-c91d4a34></rect><rect x="591" y="421" width="10" height="30" class="cell" style="fill:rgb(11.2, 11.2, 16);" data-v-c91d4a34></rect><rect x="601" y="421" width="10" height="30" class="cell" style="fill:rgb(33, 23.099999999999998, 23.099999999999998);" data-v-c91d4a34></rect><rect x="611" y="421" width="10" height="30" class="cell" style="fill:rgb(33.599999999999994, 48, 33.599999999999994);" data-v-c91d4a34></rect><rect x="621" y="421" width="10" height="30" class="cell" style="fill:rgb(34.3, 34.3, 49);" data-v-c91d4a34></rect><rect x="631" y="421" width="10" height="30" class="cell" style="fill:rgb(49, 34.3, 34.3);" data-v-c91d4a34></rect><rect x="641" y="421" width="10" height="30" class="cell" style="fill:rgb(36.4, 52, 36.4);" data-v-c91d4a34></rect><rect x="651" y="421" width="10" height="30" class="cell" style="fill:rgb(34.3, 34.3, 49);" data-v-c91d4a34></rect><rect x="661" y="421" width="10" height="30" class="cell" style="fill:rgb(49, 34.3, 34.3);" data-v-c91d4a34></rect><rect x="671" y="421" width="10" height="30" class="cell" style="fill:rgb(36.4, 52, 36.4);" data-v-c91d4a34></rect><rect x="681" y="421" width="10" height="30" class="cell" style="fill:rgb(34.3, 34.3, 49);" data-v-c91d4a34></rect><rect x="691" y="421" width="10" height="30" class="cell" style="fill:rgb(49, 34.3, 34.3);" data-v-c91d4a34></rect><rect x="701" y="421" width="10" height="30" class="cell" style="fill:rgb(22.4, 32, 22.4);" data-v-c91d4a34></rect><rect x="711" y="421" width="10" height="30" class="cell" style="fill:rgb(11.2, 11.2, 16);" data-v-c91d4a34></rect><rect x="721" y="421" width="10" height="30" class="cell" style="fill:rgb(24, 16.799999999999997, 16.799999999999997);" data-v-c91d4a34></rect><rect x="731" y="421" width="10" height="30" class="cell" style="fill:rgb(39.199999999999996, 56, 39.199999999999996);" data-v-c91d4a34></rect><rect x="741" y="421" width="10" height="30" class="cell" style="fill:rgb(57.4, 57.4, 82);" data-v-c91d4a34></rect><rect x="751" y="421" width="10" height="30" class="cell" style="fill:rgb(140, 98, 98);" data-v-c91d4a34></rect><rect x="761" y="421" width="10" height="30" class="cell" style="fill:rgb(133, 190, 133);" data-v-c91d4a34></rect><rect x="771" y="421" width="10" height="30" class="cell" style="fill:rgb(167.29999999999998, 167.29999999999998, 239);" data-v-c91d4a34></rect><rect x="781" y="421" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="791" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="801" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="811" y="421" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="821" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="831" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="841" y="421" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="851" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="861" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="871" y="421" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="881" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="891" y="421" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="1" y="451" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="11" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="21" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="31" y="451" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="41" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="51" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="61" y="451" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="71" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="81" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="91" y="451" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="101" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="111" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="121" y="451" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="131" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="141" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="151" y="451" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="161" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="171" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="181" y="451" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="191" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="201" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="211" y="451" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="221" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="231" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="241" y="451" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="251" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="261" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="271" y="451" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="281" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="291" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="301" y="451" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="311" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="321" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="331" y="451" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="341" y="451" width="10" height="30" class="cell" style="fill:rgb(175.7, 251, 175.7);" data-v-c91d4a34></rect><rect x="351" y="451" width="10" height="30" class="cell" style="fill:rgb(172.89999999999998, 172.89999999999998, 247);" data-v-c91d4a34></rect><rect x="361" y="451" width="10" height="30" class="cell" style="fill:rgb(239, 167.29999999999998, 167.29999999999998);" data-v-c91d4a34></rect><rect x="371" y="451" width="10" height="30" class="cell" style="fill:rgb(164.5, 235, 164.5);" data-v-c91d4a34></rect><rect x="381" y="451" width="10" height="30" class="cell" style="fill:rgb(167.29999999999998, 167.29999999999998, 239);" data-v-c91d4a34></rect><rect x="391" y="451" width="10" height="30" class="cell" style="fill:rgb(247, 172.89999999999998, 172.89999999999998);" data-v-c91d4a34></rect><rect x="401" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="411" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="421" y="451" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="431" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="441" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="451" y="451" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="461" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="471" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="481" y="451" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="491" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="501" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="511" y="451" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="521" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="531" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="541" y="451" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="551" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="561" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="571" y="451" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="581" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="591" y="451" width="10" height="30" class="cell" style="fill:rgb(172.89999999999998, 172.89999999999998, 247);" data-v-c91d4a34></rect><rect x="601" y="451" width="10" height="30" class="cell" style="fill:rgb(239, 167.29999999999998, 167.29999999999998);" data-v-c91d4a34></rect><rect x="611" y="451" width="10" height="30" class="cell" style="fill:rgb(164.5, 235, 164.5);" data-v-c91d4a34></rect><rect x="621" y="451" width="10" height="30" class="cell" style="fill:rgb(167.29999999999998, 167.29999999999998, 239);" data-v-c91d4a34></rect><rect x="631" y="451" width="10" height="30" class="cell" style="fill:rgb(239, 167.29999999999998, 167.29999999999998);" data-v-c91d4a34></rect><rect x="641" y="451" width="10" height="30" class="cell" style="fill:rgb(164.5, 235, 164.5);" data-v-c91d4a34></rect><rect x="651" y="451" width="10" height="30" class="cell" style="fill:rgb(167.29999999999998, 167.29999999999998, 239);" data-v-c91d4a34></rect><rect x="661" y="451" width="10" height="30" class="cell" style="fill:rgb(239, 167.29999999999998, 167.29999999999998);" data-v-c91d4a34></rect><rect x="671" y="451" width="10" height="30" class="cell" style="fill:rgb(164.5, 235, 164.5);" data-v-c91d4a34></rect><rect x="681" y="451" width="10" height="30" class="cell" style="fill:rgb(167.29999999999998, 167.29999999999998, 239);" data-v-c91d4a34></rect><rect x="691" y="451" width="10" height="30" class="cell" style="fill:rgb(239, 167.29999999999998, 167.29999999999998);" data-v-c91d4a34></rect><rect x="701" y="451" width="10" height="30" class="cell" style="fill:rgb(170.1, 243, 170.1);" data-v-c91d4a34></rect><rect x="711" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="721" y="451" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="731" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="741" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="751" y="451" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="761" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="771" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="781" y="451" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="791" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="801" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="811" y="451" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="821" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="831" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="841" y="451" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="851" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="861" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="871" y="451" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="881" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="891" y="451" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="1" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="11" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="21" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="31" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="41" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="51" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="61" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="71" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="81" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="91" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="101" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="111" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="121" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="131" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="141" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="151" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="161" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="171" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="181" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="191" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="201" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="211" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="221" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="231" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="241" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="251" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="261" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="271" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="281" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="291" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="301" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="311" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="321" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="331" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="341" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="351" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="361" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="371" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="381" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="391" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="401" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="411" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="421" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="431" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="441" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="451" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="461" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="471" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="481" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="491" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="501" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="511" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="521" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="531" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="541" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="551" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="561" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="571" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="581" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="591" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="601" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="611" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="621" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="631" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="641" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="651" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="661" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="671" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="681" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="691" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="701" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="711" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="721" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="731" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="741" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="751" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="761" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="771" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="781" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="791" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="801" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="811" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="821" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="831" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="841" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="851" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="861" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect><rect x="871" y="481" width="10" height="30" class="cell" style="fill:rgb(255, 178.5, 178.5);" data-v-c91d4a34></rect><rect x="881" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 255, 178.5);" data-v-c91d4a34></rect><rect x="891" y="481" width="10" height="30" class="cell" style="fill:rgb(178.5, 178.5, 255);" data-v-c91d4a34></rect></svg></div><div class="text-center text-sm text-red-600" data-v-c91d4a34> 현재 환경에서는 이 렌더링 방식을 지원하지 않습니다.<br data-v-c91d4a34> 미리 렌더링된 글리프를 확인할 수 있지만, 직접 입력한 텍스트에 대한 렌더링 결과는 볼 수 없습니다. </div></div><div style="font-palette:--fontname--913515245-undefined-palette;" class="w-fit max-w-full mx-auto bg-white px-2"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">Pretendard Variable</div></div><div class="text-center text-gray-500 dark:text-gray-500">텍스트를 직접 수정하며 확인해 보세요.</div></div>
<p class="my-2 text-pretty" data-v-9880527e>위 예시에서는 서브픽셀 렌더링이 적용된 래스터화된 글리프를 확인할 수
있습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>위쪽에서는 일반적인 서브픽셀 렌더링이 적용된 글리프를 확인할 수
있습니다.
래스터화된 글리프의 왼쪽 경계는 빨간색으로, 오른쪽 경계는 파란색으로 약간 번져
보이는 것을 알 수 있습니다.
중간에서는 실제 각 픽셀을 RGB 서브픽셀로 나누고 실제 LCD 디스플레이에서
보이는 것과 유사하게 표현했습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>이 경우, 래스터화된 글리프의 곡선이 눈에 띄게 부드럽게 표현된다는 것을 확인할
수 있습니다.
이처럼 서브픽셀 렌더링은 저해상도 디스플레이에서 글리프의 가독성을 크게
향상합니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>하지만 서브픽셀 렌더링은 색상 번짐 현상을 유발할 수 있습니다.
텍스트 경계에 미세한 색상 테두리가 보일 수 있으며, 특히 검은 배경에 흰색
텍스트에서 두드러집니다.
또한 RGB 배열이 아닌 PenTile이나 RGBW 같은 서브픽셀 구조를 가진 OLED
디스플레이에서는 오히려 글리프가 왜곡될 수 있으므로 주의해야 합니다.</p>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="84-힌팅hinting"><a class="hover:text-teal-800" href="#84-힌팅hinting">8.4. 힌팅(Hinting)</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>저해상도 디스플레이에서는 래스터화 시 왜곡이 심하게 발생할 수 있습니다.
특히 글리프가 픽셀 경계에 걸치면 형태가 크게 왜곡됩니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>힌팅은 글리프가 픽셀에 잘 맞도록 조정하는 정보를 폰트 파일에 포함하는
기술입니다.
힌팅 정보는 특정 크기에서 글리프의 줄기 두께, 대칭성, 정렬 등을 유지하도록
지시합니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>힌팅은 주로 저해상도 디스플레이나 작은 폰트 크기에서 효과가 큽니다.
고해상도 디스플레이에서는 픽셀 밀도가 높아 힌팅의 영향이 상대적으로 적습니다.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div class="flex flex-col items-center gap-2 mb-2 max-w-full mx-auto" data-v-c91d4a34><div class="w-full max-w-full" data-v-c91d4a34><svg xmlns="http://www.w3.org/2000/svg" class="h-full max-h-60 w-full" viewBox="0 0 2 2" data-v-c91d4a34></svg></div></div><div class="flex flex-col items-center gap-2 mb-2 max-w-full mx-auto" data-v-c91d4a34><div class="w-full max-w-full" data-v-c91d4a34><svg xmlns="http://www.w3.org/2000/svg" class="h-full max-h-60 w-full" viewBox="0 0 2 2" data-v-c91d4a34></svg></div></div><div style="font-palette:--fontname--913515245-undefined-palette;" class="w-fit max-w-full mx-auto bg-white px-2"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2">Pretendard Variable</div></div><div class="text-center text-gray-500 dark:text-gray-500">텍스트를 직접 수정하며 확인해 보세요.</div></div>
<p class="my-2 text-pretty" data-v-9880527e>위 예시에서는 위쪽 영역에는 힌팅을 적용하여 래스터화된 글리프를, 중간에는
힌팅을 적용하지 않은 글리프를 확인할 수 있습니다.
힌팅이 적용된 글리프가 픽셀 경계에 더 잘 맞춰져서 형태가 더 명확하게 유지되는
것을 알 수 있습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>폰트 형식에 따라 힌팅 지원 수준이 다릅니다.
TTF 폰트가 OTF 폰트보다 힌팅 정보를 더 잘 지원합니다.
TrueType은 힌팅을 위한 명령어 세트를 제공하는 반면, PostScript 기반 OTF는 더
간단한 힌팅 방식을 사용합니다.
따라서 저해상도 환경을 고려해야 하는 경우라면 TTF 폰트를 선택하는 것이
좋습니다.</p>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="85-렌더링-엔진"><a class="hover:text-teal-800" href="#85-렌더링-엔진">8.5. 렌더링 엔진</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>렌더링 엔진은 폰트를 화면에 표시하는 소프트웨어입니다.
운영체제나 브라우저의 렌더링 엔진이 렌더링 방식을 결정합니다.
여기서는 Windows와 macOS의 렌더링 방식을 비교해 보겠습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>Windows는 클리어타입(ClearType)이라는 서브픽셀 렌더링을 사용하여 가독성을
최적화합니다.
1998년 Microsoft가 개발한 ClearType은 RGB LCD 디스플레이의 서브픽셀을 활용하여
텍스트를 더 선명하게 표현합니다.
특히 저해상도 디스플레이나 작은 폰트 크기에서 가독성이 크게 향상되며,
힌팅 정보를 적극적으로 활용합니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>하지만 ClearType은 RGB 배열에 최적화되어 있어, 다른 서브픽셀 배열을 가진
디스플레이에서는 색상 번짐이나 왜곡이 발생할 수 있습니다.
또한 가독성을 우선시하기 때문에 글리프의 원래 형태가 다소 변형될 수 있습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>macOS는 Mojave 이후 서브픽셀 렌더링을 중단하고, 회색조 안티앨리어싱을
사용합니다.
이전 버전에서는 서브픽셀 렌더링을 사용했지만, Retina 디스플레이의 보급과 함께
단순한 회색조 방식으로 전환했습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>macOS의 렌더링 철학은 폰트의 원래 모양을 최대한 유지하는 것입니다.
디자이너가 의도한 글리프 형태를 충실히 재현하며, 고해상도 디스플레이에
최적화되어 있습니다.
따라서 힌팅 정보가 포함된 폰트라도 macOS에서는 힌팅이 적용되지 않습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>결과적으로 Windows는 가독성과 선명함을, macOS는 디자인 충실도를 우선시합니다.
Windows에서는 작은 크기의 텍스트가 더 읽기 쉽지만, macOS에서는 폰트 본연의
아름다움이 더 잘 드러납니다.</p>
<div class="max-w-full overflow-x-auto"><table class="mx-auto my-2 table-auto border-collapse border border-gray-300 dark:border-gray-700"><thead class="bg-gray-100 dark:bg-gray-800" style="--v255875d0:#e5e7eb;--v255884d4:#4b5563;" data-v-a4655b9c><tr class="text-pretty"><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">구분</th><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">Windows</th><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">macOS</th></tr></thead><tbody style="--b230077a:#f9fafb;--v361793cf:#1f2937;" data-v-a0502667><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><strong class="font-bold dark:font-extrabold">렌더링 방식</strong></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">클리어타입</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">회색조 안티앨리어싱</td></tr><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><strong class="font-bold dark:font-extrabold">서브픽셀 렌더링</strong></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">사용</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">미사용(Mojave 이후)</td></tr><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><strong class="font-bold dark:font-extrabold">힌팅 적용</strong></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">적용</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">미적용</td></tr><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><strong class="font-bold dark:font-extrabold">렌더링 철학</strong></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">가독성 우선</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">디자인 충실도 우선</td></tr><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><strong class="font-bold dark:font-extrabold">특징</strong></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">선명하고 읽기 쉬움, 형태 변형 가능</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">폰트 본연의 형태, 고해상도 최적화</td></tr></tbody></table></div>
<h2 class="my-6 text-balance text-3xl font-extrabold dark:font-black" id="9-인코딩encoding"><a class="hover:text-teal-800 dark:hover:text-teal-400" href="#9-인코딩encoding">9. 인코딩(Encoding)</a></h2>
<p class="my-2 text-pretty" data-v-9880527e>폰트에 대해 더 깊이 이해하려면 텍스트를 빼놓고 설명할 수 없습니다.
폰트는 텍스트를 시각적으로 표현하는 도구이기 때문입니다.
여기서부터는 디지털 환경에서 텍스트가 어떻게 표현되고 처리되는지에 대해 간단히
살펴보겠습니다.</p>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="91-문자-인코딩character-encoding"><a class="hover:text-teal-800" href="#91-문자-인코딩character-encoding">9.1. 문자 인코딩(Character Encoding)</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>컴퓨터는 모든 데이터를 숫자로 처리합니다.
컴퓨터가 문자를 다룰 때도 마찬가지로, 각 문자에 고유한 숫자를 할당하여 컴퓨터가
인식하고 처리할 수 있도록 해야 합니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>문자와 숫자의 대응 관계를 정의하여 컴퓨터가 문자를 이해할 수 있도록 하는 체계가
바로 문자 인코딩입니다.
예를 들어, ASCII라는 문자 인코딩에서 대문자 &#39;A&#39;는 65라는 숫자에 대응하도록
정의되어 있습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>이러한 문자 인코딩은 여러 가지가 존재하며, 인코딩마다 문자를 숫자로 매핑하는
방식이 다릅니다.
한글을 지원하는 주요 문자 인코딩으로는 CP949, UTF-8이 있습니다.
같은 문자라도 문자 인코딩에 따라 다른 숫자 값으로 표현되므로, 어떤 텍스트를
컴퓨터가 해석할 때는 텍스트가 어떤 문자 인코딩으로 작성되었는지 알아야 합니다.</p>
<div class="max-w-full overflow-x-auto"><table class="mx-auto my-2 table-auto border-collapse border border-gray-300 dark:border-gray-700"><thead class="bg-gray-100 dark:bg-gray-800" style="--v255875d0:#e5e7eb;--v255884d4:#4b5563;" data-v-a4655b9c><tr class="text-pretty"><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">문자</th><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">ASCII</th><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">CP949</th><th class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">UTF-8</th></tr></thead><tbody style="--b230077a:#f9fafb;--v361793cf:#1f2937;" data-v-a0502667><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><strong class="font-bold dark:font-extrabold">A</strong></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0x41</code></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0x41</code></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0x41</code></td></tr><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><strong class="font-bold dark:font-extrabold">B</strong></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0x42</code></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0x42</code></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0x42</code></td></tr><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><strong class="font-bold dark:font-extrabold">1</strong></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0x31</code></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0x31</code></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0x31</code></td></tr><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><strong class="font-bold dark:font-extrabold">2</strong></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0x32</code></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0x32</code></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0x32</code></td></tr><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><strong class="font-bold dark:font-extrabold">안</strong></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">-</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0xBE</code> <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0xC8</code></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0xEC</code> <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0x95</code> <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0x88</code></td></tr><tr class="text-pretty"><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><strong class="font-bold dark:font-extrabold">녕</strong></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;">-</td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0xB3</code> <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0xE7</code></td><td class="border border-gray-300 px-4 py-2 dark:border-gray-700" style="text-align:center;"><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0xEB</code> <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0x85</code> <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0x95</code></td></tr></tbody></table></div>
<p class="my-2 text-pretty" data-v-9880527e>위 표는 각 문자가 ASCII, CP949, UTF-8 문자 인코딩에서 어떻게 숫자로
표현되는지 보여줍니다. 각 인코딩에서 대응하는 숫자는 16진수(Hexadecimal)로
표기되어 있습니다.
따라서 위 표에서 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0x41</code>은 16진수로, 10진수 65를 의미합니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>알파벳과 숫자는 ASCII, CP949, UTF-8 모두에서 동일한 숫자로 표현된다는 점이
우선 눈에 띕니다.
이는 대부분의 문자 인코딩이 ASCII와 호환되도록 설계되었기 때문입니다.
따라서 로마자 알파벳과 숫자는 대부분의 문자 인코딩에서 동일한 숫자로
표현됩니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>반면, 한글은 문자 인코딩마다 다른 숫자로 표현됩니다.
ASCII에서는 한글을 표현할 수 없습니다. 따라서 한글은 CP949와 UTF-8에서만
표현할 수 있습니다.
CP949에서는 한글을 표현하기 위해 숫자 2개를 사용해야 합니다. 위 표에서는
&#39;안&#39;을 표현하기 위해 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0xBE</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0xC8</code> 두 개의 숫자를 사용하고 있습니다.
그런데 UTF-8에서는 한글을 표현하기 위해 숫자 3개를 사용합니다. 똑같이 &#39;안&#39;을
표현하기 위해 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0xEC</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0x95</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0x88</code>을 사용하고 있습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>아마 자기소개서처럼 텍스트 길이의 제한이 있는 글을 작성할 때, 한글은 2바이트로
알파벳이나 숫자보다 더 많은 공간을 차지한다는 사실을 경험해 보셨을 것입니다.
이는 문자 인코딩에서 한글을 나타내기 위해 알파벳과 숫자보다 더 많은 숫자를
사용하도록 정의되어 있기 때문에 그렇습니다.
만약 입력받는 텍스트의 문자 인코딩으로 CP949를 사용하는 경우라면 한글 한 문자는
2바이트로, UTF-8을 사용하는 경우라면 3바이트로 계산하게 되는 것입니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>현재는 대부분의 상황에서 UTF-8 문자 인코딩을 사용하고 있지만, Windows 환경에서
한국어를 사용할 때 CP949 문자 인코딩으로 작성된 텍스트를 접할 가능성이 여전히
있습니다.
따라서 텍스트를 다룰 때는 해당 텍스트가 어떤 문자 인코딩으로 작성되었는지
반드시 확인해야 합니다.</p>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="92-유니코드unicode"><a class="hover:text-teal-800" href="#92-유니코드unicode">9.2. 유니코드(Unicode)</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>UTF-8 문자 인코딩을 설명하면서 UTF-8에서는 한글 한 문자를 표현하기 위해 숫자
3개를 사용한다고 설명했습니다.
하지만 이는 엄밀히 말하면 틀린 설명입니다.
UTF-8에서 문자와 숫자를 대응하는 과정에서, 1바이트보다 큰 숫자를 사용해야 하는
경우에 처리하기 위한 규칙이 따로 존재할 뿐입니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>UTF-8 문자 인코딩은 유니코드라고 하는 문자와 숫자의 대응 체계를 기반으로 합니다.
유니코드는 각 문자에 고유한 코드 포인트(Code point)를 할당합니다.
그리고 이 코드 포인트를 실제로 저장하고 전송하기 위한 인코딩 방식 중의 하나가
UTF-8인 것입니다.
유니코드의 코드 포인트를 사용하는 문자 인코딩은 UTF-8 외에도 UTF-16, UTF-32
등이 있지만, 대부분의 상황에서는 UTF-8이 사용되고 있습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>위에서 예를 들었던 &#39;안&#39;, &#39;녕&#39; 이라는 문자는 유니코드에서 각각 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0xC548</code>,
<code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0xB155</code>라는 코드 포인트가 할당되어 있습니다.
유니코드에는 2025년 11월 현재 297,334개의 문자가 할당되어 있으며, 사실상
전 세계의 모든 문자, 기호, 이모지 등을 모두 포함하고 있습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>현재 대부분의 시스템에서 텍스트를 표현할 때 인코딩은 약간 달라도 유니코드를
사용하므로 문자가 깨지는 현상을 거의 발생하지 않습니다.
예를 들어, Windows와 macOS 모두 파일을 저장할 때, 파일명에 유니코드를 사용하여
저장합니다.
그런데, macOS에서 Windows로 한글 파일명을 가진 파일을 전송해 보면 Windows에서
파일명이 이상하게 표현되는 현상을 확인할 수 있습니다.
두 운영체제 모두 동일하게 유니코드를 사용하는데 왜 이런 일이 발생하는 걸까요?</p>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Windows의 파일명</strong>: &#39;안녕.txt&#39;</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">macOS의 파일명</strong>: &#39;안녕.txt&#39;</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Windows에서 본 macOS의 파일명</strong>:
&#39;ᄋᅠᅟᅡᅟᅠᆫᄂᅠᅟᅧᅟᅠᆼ.txt&#39;
(???)</li>
</ul>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="93-유니코드-정규화unicode-normalization"><a class="hover:text-teal-800" href="#93-유니코드-정규화unicode-normalization">9.3. 유니코드 정규화(Unicode Normalization)</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>유니코드에서는 한글을 표현하는 다음의 두 가지 방법이 존재합니다.</p>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">완성형</strong>: 한글 한 문자를 하나의 코드 포인트로 표현
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>예시
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">&#39;안&#39;</strong>: <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0xC548</code>(안)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">&#39;녕&#39;</strong>: <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0xB155</code>(녕)</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">조합형</strong>: 한글 한 문자를 초성, 중성, 종성 코드 포인트의 조합으로 표현
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>예시
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">&#39;안&#39;</strong>: <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0x110B</code>(ᄋ) + <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0x1161</code>(ᅡ) + <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0x11AB</code>(ᆫ)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">&#39;녕&#39;</strong>: <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0x1102</code>(ᄂ) + <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0x1167</code>(ᅧ) + <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0x11BC</code>(ᆼ)</li>
</ul>
</li>
</ul>
</li>
</ul>
<p class="my-2 text-pretty" data-v-9880527e>macOS는 한글 파일명을 조합형으로 저장하고, Windows는 한글 파일명을 완성형으로
저장합니다.
따라서 Windows에서 macOS에서 작성한 한글 파일명을 볼 때에는 Windows에서는
사용하지 않는 조합형 한글로 보이게 되는 것입니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>그런데, 이상한 점이 있습니다.
조합형 한글도 유니코드 표준에 정의된 문자이므로, Windows에서도 조합형 한글을
정상적으로 표시할 수 있어야 합니다.
Windows 탐색기의 파일명에서는 왜 조합형 한글을 합쳐서 하나의 문자로 표시하지
않고 모든 자모를 풀어서 보여주는 걸까요?</p>
<p class="my-2 text-pretty" data-v-9880527e><a href="https://devblogs.microsoft.com/oldnewthing/20201009-00/?p=104351&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Microsoft 개발 블로그의 글</a>에서
그 이유를 짐작해 볼 수 있습니다.
Windows 탐색기에서는 KS X 1026 표준을 이유로 조합형 한글을 합쳐서 표시하지
않는다고 합니다.<sup><a href="#user-content-fn-4" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300" id="user-content-fnref-4" data-footnote-ref="true" aria-describedby="footnote-label">4</a></sup>
따라서 Windows 탐색기에서 조합형 한글을 제대로 표시하려면, 조합형 한글을
완성형 한글로 변환하는 과정을 거쳐야 합니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>유니코드에서는 이러한 과정을 정규화(Normalization)라는 방법으로 제공하고
있습니다.
유니코드 정규화는 같은 문자를 표현하는 여러 방법이 있을 때, 해당 문자를 특정
방법으로 표현하도록 변환하는 방법입니다.
유니코드 정규화 중 NFC(Normalization Form C)를 사용하면 조합형 한글을 완성형
한글로 변환할 수 있고, NFD(Normalization Form D)를 사용하면 완성형 한글을
조합형 한글로 변환할 수 있습니다.</p>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>완성형 한글 → 유니코드 정규화(NFD) → 조합형 한글</li>
<li class="ms-6 text-pretty" data-v-09555c0e>조합형 한글 → 유니코드 정규화(NFC) → 완성형 한글</li>
</ul>
<p class="my-2 text-pretty" data-v-9880527e>따라서 서로 다른 운영체제 간의 파일 교환이 빈번한 환경이라면, 파일명을 유니코드
정규화(NFC)로 변환하여 저장하는 것이 좋습니다.
이를 통해 조합형 한글과 완성형 한글로 인한 파일명 깨짐 현상을 방지할 수
있습니다.</p>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="94-제어-문자control-characters"><a class="hover:text-teal-800" href="#94-제어-문자control-characters">9.4. 제어 문자(Control Characters)</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>폰트를 사용할 때, 텍스트에 사용하는 모든 문자에는 대응하는 글리프가 존재할
것이라고 생각할 수 있습니다.
그러나, 디지털 환경에서 텍스트에 사용하는 문자 중에는 글리프로 표현되지 않고,
특수한 역할을 하는 문자들이 존재합니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>가장 대표적인 예가 줄바꿈입니다.
여러 줄에 걸쳐 텍스트를 작성하기 위해서는 줄바꿈이 필수적입니다.
그러나 이러한 줄바꿈은 우리 눈에 글리프라는 형태로 보이지 않습니다.
하지만 컴퓨터는 이러한 줄바꿈을 특정한 문자로서 인식하고 처리합니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>이러한 특수한 문자들을 제어 문자라고 부릅니다.
줄바꿈과 관련된 제어 문자는 아래의 두 가지입니다.</p>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Line Feed(LF)</strong>: 텍스트의 한 줄이 끝나고 다음 줄로 넘어가도록 지시</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Carriage Return(CR)</strong>: 커서를 현재 줄의 맨 앞으로 이동시키도록 지시</li>
</ul>
<p class="my-2 text-pretty" data-v-9880527e>위 두 문자를 적절히 사용하면 텍스트의 줄바꿈을 표현할 수 있습니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>여기서 두 문자를 &#39;적절히&#39; 사용한다고 표현한 이유는, 텍스트를 사용하는 환경에
따라 어떤 제어 문자를 사용해야 하는지가 달라지기 때문입니다.
대부분의 상황에서는 줄바꿈을 표현하기 위해 LF 문자 하나만 사용하면 충분합니다.
그러나 Windows의 텍스트 파일에서는 줄바꿈을 표현하기 위해 CR 문자와 LF 문자를
함께 사용해야 합니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>이러한 이유로 인해 위에서 설명한 macOS와 Windows 간의 파일명 깨짐 현상과
마찬가지로 다른 운영체제에서 작성한 텍스트 파일(<code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">.txt</code>)을 열 때 줄바꿈이 제대로
표시되지 않는 현상이 발생할 수 있습니다.<sup><a href="#user-content-fn-5" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300" id="user-content-fnref-5" data-footnote-ref="true" aria-describedby="footnote-label">5</a></sup></p>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="95-private-use-area-pua"><a class="hover:text-teal-800" href="#95-private-use-area-pua">9.5. Private Use Area (PUA)</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>위에서 언급했던 아이콘 폰트처럼 특수한 글리프를 표현하기 위해서는 어떤 문자에
아이콘 글리프를 대응시켜야 할까요?
집 모양 아이콘을 글리프로 사용할 때는 집 이모지(🏠)에 할당하면 될까요?</p>
<p class="my-2 text-pretty" data-v-9880527e>물론 집 모양 아이콘을 집 이모지에 대응시켜 사용할 수도 있습니다.
그러나 표현하고자 하는 모든 아이콘에 대응하는 이모지는 존재하지 않을 것이고,
아예 아이콘이 아니라 완전히 다른 기호, 새로운 언어 등을 표현하기 위한 폰트를
만들어야 한다면 완전히 다른 코드 포인트를 사용하는 게 더 좋을 것입니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>유니코드에는 Private Use Area라는 영역을 만들어두고, 개인이 자유롭게 원하는
용도로 사용할 수 있도록 하고 있습니다.
PUA 영역은 유니코드 표준에서 공식적으로 할당된 문자가 아니므로, 시스템이나
소프트웨어마다 다르게 해석될 수 있습니다.</p>
<div class="my-8"><div class="bg-gray-100 dark:bg-gray-800 p-2 mb-4"><div style="font-palette:--fontname-1786832060-undefined-palette;" class="w-fit max-w-full mx-auto"><div role="status" class="mx-auto h-8 w-8"><svg aria-hidden="true" class="animate-spin fill-teal-500 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor"></path><path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill"></path></svg><span class="sr-only">Loading...</span></div></div><div class="text-center mt-2"><p class="my-2 text-pretty" data-v-9880527e>Material Icons Round</p></div></div></div>
<p class="my-2 text-pretty" data-v-9880527e>실제로 Material Icons Round는 PUA 영역의 코드 포인트에 아이콘 글리프를 할당한
아이콘 폰트입니다.
위 예시에서는 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0xE8B6</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0xE88A</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0xE5D2</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">0xE5CD</code> 코드 포인트에 각각
아이콘을 할당하여 표시하고 있습니다.</p>
<h2 class="my-6 text-balance text-3xl font-extrabold dark:font-black" id="10-폰트-라이선스font-license"><a class="hover:text-teal-800 dark:hover:text-teal-400" href="#10-폰트-라이선스font-license">10. 폰트 라이선스(Font License)</a></h2>
<p class="my-2 text-pretty" data-v-9880527e>폰트를 사용하여 어떠한 작업을 할 때에는 해당 폰트를 사용할 수 있는 권한이
있는지 반드시 확인해야 합니다.
폰트는 저작권법으로 보호되는 저작물이며, 폰트 제작자나 배포처가 정한
라이선스 조건에 따라 사용해야 합니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>폰트의 라이선스는 폰트마다 다르며, 동일한 폰트라도 사용 목적에 따라
다른 조건이 적용될 수 있습니다.
따라서 폰트를 사용하기 전에 반드시 해당 폰트의 라이선스를 확인하고, 자신이
사용하고자 하는 목적과 방법 등에 맞는지 꼼꼼히 살펴보아야 합니다.</p>
<blockquote class="my-2 bg-teal-100 px-3 py-2 dark:bg-teal-900 dark:text-gray-100">
<p class="my-2 text-pretty" data-v-9880527e>주의: 이 글에서는 폰트 라이선스에 대한 일반적인 정보를 제공할 뿐,
법적인 조언을 제공하지 않습니다.
특정 폰트의 라이선스 조건에 대해 궁금한 점이 있거나, 법적인 문제가
발생한 경우에는 반드시 전문가의 조언을 구하시기 바랍니다.</p>
</blockquote>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="101-주요-확인-사항"><a class="hover:text-teal-800" href="#101-주요-확인-사항">10.1. 주요 확인 사항</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>폰트를 사용할 때 가장 주의 깊게 살펴보아야 할 라이선스 조건은 다음과 같습니다.</p>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">사용 목적</strong>: 폰트를 사용하고자 하는 목적
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">예시</strong>: 개인용, 상업용, 데스크톱, 웹, 앱, 전자책 등</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">임베딩</strong>: 폰트를 문서, 웹사이트, 앱 등에 직접 포함해 사용하는 것
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">예시</strong>: PDF 문서에 폰트 포함, 웹페이지에서 웹폰트로 사용, 앱에 폰트 포함
등</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">재배포</strong>: 폰트 파일을 다른 사람에게 배포하는 것
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">예시</strong>: 폰트 파일을 다운로드 링크로 제공, 폰트 파일을 포함한 소프트웨어
배포 등</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">수정</strong>: 폰트 파일을 수정하거나 변형하는 것
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">예시</strong>: 글리프를 추가하거나 변경, 폰트 메타데이터 수정 등</li>
</ul>
</li>
</ul>
<p class="my-2 text-pretty" data-v-9880527e>각 폰트의 라이선스 조건은 매우 다양하므로, 위 사항들에 대해 꼼꼼히
확인하는 것이 중요합니다.</p>
<h3 class="my-4 text-balance text-2xl font-bold dark:font-extrabold" id="102-대표적인-폰트-라이선스"><a class="hover:text-teal-800" href="#102-대표적인-폰트-라이선스">10.2. 대표적인 폰트 라이선스</a></h3>
<p class="my-2 text-pretty" data-v-9880527e>다행히도 많은 무료 폰트는 널리 알려진 라이선스를 채택하고 있으므로, 해당
라이선스에 대한 정보를 찾아보는 것도 좋은 방법입니다.
여기서는 몇 가지 대표적인 폰트 라이선스를 소개합니다.</p>
<p class="my-2 text-pretty" data-v-9880527e>이 글에서 설명하는 내용은 라이선스의 주요 특징을 간략히 요약한 것이며,
정확한 라이선스 조건은 각 라이선스의 공식 문서를 반드시 참고하시기 바랍니다.</p>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">SIL Open Font License (OFL)</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>SIL International에서 제공하는 오픈소스 폰트 라이선스</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">사용 목적</strong>: 개인용, 상업용 모두 허용</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">임베딩</strong>: 허용</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">재배포</strong>: 수정하지 않은 폰트 파일은 자유롭게 재배포 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">수정</strong>: 수정된 폰트를 재배포할 때는 OFL로 배포해야 함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">주의사항</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>폰트 자체를 단독으로 판매할 수 없음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>수정된 폰트는 원본과 다른 이름으로 배포해야 함</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Apache License 2.0</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Apache Software Foundation에서 제공하는 오픈소스 라이선스</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">사용 목적</strong>: 개인용, 상업용 모두 허용</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">임베딩</strong>: 허용</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">재배포</strong>: 자유롭게 재배포 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">수정</strong>: 자유롭게 수정 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">주의사항</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>변경 사항을 명시해야 함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>라이선스 사본을 포함해야 함</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">공공누리(KOGL) 제1유형 (출처표시)</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>대한민국 정부에서 제공하는 공공저작물 라이선스</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">사용 목적</strong>: 개인용, 상업용 모두 허용</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">임베딩</strong>: 허용</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">재배포</strong>: 자유롭게 재배포 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">수정</strong>: 자유롭게 수정 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">주의사항</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>출처를 반드시 표시해야 함</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">공공누리(KOGL) 제2유형 (출처표시 + 상업적 이용금지)</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>대한민국 정부에서 제공하는 공공저작물 라이선스</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">사용 목적</strong>: 개인용만 허용, 상업용 불가</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">임베딩</strong>: 허용</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">재배포</strong>: 자유롭게 재배포 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">수정</strong>: 자유롭게 수정 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">주의사항</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>출처를 반드시 표시해야 함</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">공공누리(KOGL) 제3유형 (출처표시 + 변경금지)</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>대한민국 정부에서 제공하는 공공저작물 라이선스</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">사용 목적</strong>: 개인용, 상업용 모두 허용</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">임베딩</strong>: 허용</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">재배포</strong>: 자유롭게 재배포 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">수정</strong>: 수정 불가</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">주의사항</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>출처를 반드시 표시해야 함</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">공공누리(KOGL) 제4유형 (출처표시 + 상업적 이용금지 + 변경금지)</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>대한민국 정부에서 제공하는 공공저작물 라이선스</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">사용 목적</strong>: 개인용만 허용, 상업용 불가</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">임베딩</strong>: 허용</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">재배포</strong>: 자유롭게 재배포 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">수정</strong>: 수정 불가</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">주의사항</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>출처를 반드시 표시해야 함</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Public Domain</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>저작권이 만료되었거나, 저작권자가 저작물을 공공에 기증한 상태</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">사용 목적</strong>: 개인용, 상업용 모두 허용</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">임베딩</strong>: 허용</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">재배포</strong>: 자유롭게 재배포 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">수정</strong>: 자유롭게 수정 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">주의사항</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>특별한 주의사항 없음</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 class="my-6 text-balance text-3xl font-extrabold dark:font-black" id="11-마치며"><a class="hover:text-teal-800 dark:hover:text-teal-400" href="#11-마치며">11. 마치며</a></h2>
<p class="my-2 text-pretty" data-v-9880527e>지금까지 폰트의 기본 개념부터 렌더링, 인코딩, 라이선스에 이르기까지 다양한
주제를 다루어보았습니다.
웹 폰트와 관련된 더 자세한 내용을 추후 작성될 별도 글에서 다룰 예정이니,
많은 관심 부탁드립니다.</p>
<h2 class="my-6 text-balance text-3xl font-extrabold dark:font-black" id="12-이-글에서-사용한-폰트"><a class="hover:text-teal-800 dark:hover:text-teal-400" href="#12-이-글에서-사용한-폰트">12. 이 글에서 사용한 폰트</a></h2>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Adobe NotDef: <a href="https://github.com/adobe-fonts/adobe-notdef?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">https://github.com/adobe-fonts/adobe-notdef</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>Auseklis: <a href="https://www.dafont.com/auseklis.font?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">https://www.dafont.com/auseklis.font</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>D2 Coding: <a href="https://github.com/naver/d2codingfont?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">https://github.com/naver/d2codingfont</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>Geologica: <a href="https://github.com/googlefonts/geologica?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">https://github.com/googlefonts/geologica</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>Hymnus FG: <a href="https://www.dafont.com/hymnus-fg.font?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">https://www.dafont.com/hymnus-fg.font</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>Jost*: <a href="https://indestructibletype.com/Jost.html?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">https://indestructibletype.com/Jost.html</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>Libre Barcode: <a href="https://github.com/graphicore/librebarcode?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">https://github.com/graphicore/librebarcode</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>Material Icons: <a href="https://github.com/marella/material-icons?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">https://github.com/marella/material-icons</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>Noto Color Emoji: <a href="https://github.com/googlefonts/noto-emoji?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">https://github.com/googlefonts/noto-emoji</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>Noto Sans CJK: <a href="https://github.com/notofonts/noto-cjk?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">https://github.com/notofonts/noto-cjk</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>Pretendard: <a href="https://github.com/orioncactus/pretendard?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">https://github.com/orioncactus/pretendard</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>Roboto Flex: <a href="https://github.com/googlefonts/roboto-flex?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">https://github.com/googlefonts/roboto-flex</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>Rocher Color: <a href="https://www.harbortype.com/fonts/rocher-color/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">https://www.harbortype.com/fonts/rocher-color/</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>Tangerine: <a href="https://tosche.net/fonts/tangerine?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">https://tosche.net/fonts/tangerine</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>Wanted Sans: <a href="https://github.com/wanteddev/wanted-sans?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">https://github.com/wanteddev/wanted-sans</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>나눔명조: <a href="https://hangeul.naver.com/font/nanum?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">https://hangeul.naver.com/font/nanum</a></li>
</ul>
<h2 class="my-6 text-balance text-3xl font-extrabold dark:font-black" id="13-참고자료"><a class="hover:text-teal-800 dark:hover:text-teal-400" href="#13-참고자료">13. 참고자료</a></h2>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://devblogs.microsoft.com/oldnewthing/20201009-00/?p=104351&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">A consequence of being the first to adopt a standard is that you may end up being the only one to adopt it: The sad story of Korean jamo - The Old New Thing</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://learn.microsoft.com/en-us/windows/win32/intl/character-sets-used-in-file-names?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Character Sets Used in File Names - Win32 apps | Microsoft Learn</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://css-tricks.com/colrv1-and-css-font-palette-web-typography/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">COLRv1 and CSS font-palette | CSS-Tricks</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://iamvdo.me/en/blog/css-font-metrics-line-height-and-vertical-align?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Deep dive CSS: font metrics, line-height and vertical-align - Vincent De Oliveira</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://fonts.google.com/knowledge?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Fonts Knowledge - Google Fonts</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://developer.apple.com/documentation/fskit/fsfilename?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">FSFileName | Apple Developer Documentation</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://en.wikipedia.org/wiki/List_of_Unicode_characters?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">List of Unicode characters - Wikipedia</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://learn.microsoft.com/en-us/typography/opentype/spec/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">OpenType specification (OpenType 1.9.1) - Typography | Microsoft Learn</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://www.w3.org/TR/klreq/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Requirements for Hangul Text Layout and Typography : 한국어 텍스트 레이아웃 및 타이포그래피를 위한 요구사항</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://www.w3.org/TR/WOFF/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">WOFF File Format 1.0</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://www.w3.org/TR/WOFF2/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">WOFF File Format 2.0</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://koreantypography.org/wp-content/uploads/2016/08/kst_13_8_1_03.pdf.pdf?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">김병조. &quot;다국어 타이포그래피의 기술적 문제&quot; 글짜씨 8, no.1 (2016) : 54-83.</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://typography-dictionary.kr/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">타이포그래피 사전</a></li>
</ul>
<section data-footnotes="true" class="footnotes"><h2 class="my-6 text-balance text-3xl font-extrabold dark:font-black" id="footnote-label" class="sr-only"><a class="hover:text-teal-800 dark:hover:text-teal-400" href="#footnote-label">Footnotes</a></h2>
<ol class="my-2 list-outside list-decimal">
<li class="ms-6 text-pretty" id="user-content-fn-1" data-v-09555c0e>
<p class="my-2 text-pretty" data-v-9880527e>Em Square는 Em Quad라고도 불리며, 단순히 Em이라고도 합니다.
이 글에서는 더 익숙하고 시각적으로 이해하기 쉬운 Em Square라는 용어를
사용하겠습니다. <a href="#user-content-fnref-1" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300" data-footnote-backref aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p>
</li>
<li class="ms-6 text-pretty" id="user-content-fn-2" data-v-09555c0e>
<p class="my-2 text-pretty" data-v-9880527e>사실 Geologica는 별도의 이탤릭 스타일을 별도로 제공하지 않지만, Cursive
기능을 사용하여 유사한 효과를 낼 수 있습니다.
이 예시에서는 Cursive 기능과 오블리크를 함께 적용하여 이탤릭 스타일을
표현했습니다. <a href="#user-content-fnref-2" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300" data-footnote-backref aria-label="Back to reference 2" class="data-footnote-backref">↩</a></p>
</li>
<li class="ms-6 text-pretty" id="user-content-fn-3" data-v-09555c0e>
<p class="my-2 text-pretty" data-v-9880527e>&#39;U+E88A&#39;는 더 뒤에서 설명할 유니코드 문자를 나타내는 방식이며, Private
Use Area (PUA) 영역에 속하는 문자입니다. <a href="#user-content-fnref-3" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300" data-footnote-backref aria-label="Back to reference 3" class="data-footnote-backref">↩</a></p>
</li>
<li class="ms-6 text-pretty" id="user-content-fn-4" data-v-09555c0e>
<p class="my-2 text-pretty" data-v-9880527e>사실 Microsoft 포스트에 작성된 댓글의 내용을 참고해 보면, Microsoft가
표준의 내용을 잘못 이해한 것일 수도 있다는 의혹이 제기되고 있습니다. KS X
1026-1 표준과 Unicode UAX #29 표준에 따르면 조합형 한글을 합쳐서 표시하는
것이 맞습니다. <a href="#user-content-fnref-4" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300" data-footnote-backref aria-label="Back to reference 4" class="data-footnote-backref">↩</a></p>
</li>
<li class="ms-6 text-pretty" id="user-content-fn-5" data-v-09555c0e>
<p class="my-2 text-pretty" data-v-9880527e>Windows 11의 메모장은 이제 자동으로 어떤 줄바꿈 문자를 사용했는지
인식하여 올바르게 표시합니다.
그러나 여전히 일부 텍스트 편집기에서는 줄바꿈 문자를 올바르게 처리하지 못하는
경우가 있으므로 주의해야 합니다. <a href="#user-content-fnref-5" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300" data-footnote-backref aria-label="Back to reference 5" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section></div>]]></content>
        <author>
            <name>Nesswit</name>
            <email>rishubil+blog@gmail.com</email>
            <uri>https://blog.update.sh/about</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[2025-11-17 주간 URL 모음]]></title>
        <id>https://blog.update.sh/weekly-urls/2025-11-17</id>
        <link href="https://blog.update.sh/weekly-urls/2025-11-17"/>
        <updated>2025-11-16T23:00:00.000Z</updated>
        <content type="html"><![CDATA[<div class="mdx-content leading-[1.6]" style="--v2806f315:0.875rem,[object Object],0.875rem,[object Object];--v67bf8b50:#6b7280;--v67bf83ce:#d1d5db;--v67bf878f:#9ca3af;--v67bf92d2:#374151;" data-v-ec58c90e><ul class="my-2 list-outside list-disc" data-v-ec58c90e>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://kotaku.com/pokemon-mario-nintendo-two-versions-2000642053?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Ever Wondered Why There&#39;s Two Of Every Pokémon Game?</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20251111075917/https://kotaku.com/pokemon-mario-nintendo-two-versions-2000642053?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Pokémon 시리즈가 Red/Blue 등 두 가지 버전으로 출시되는 이유는 놀랍도록 단순한 발상에서 시작됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>대부분의 게임이 가격대별 여러 에디션을 내놓지만 <strong class="font-bold dark:font-extrabold">같은 게임</strong>인 반면, Pokémon은 1998년 영어판 출시부터 각 버전이 미묘하게(하지만 팬들에겐 중요하게) 달랐음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>두 버전 전략은 마케팅 관점에서 혼란을 야기할 수 있지만, 시리즈 팬들에게는 <strong class="font-bold dark:font-extrabold">큰 특징이자 판매 포인트</strong>로 작용함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>최근 Nintendo 주주총회에서 <strong class="font-bold dark:font-extrabold">미야모토 시게루</strong>가 그 이유를 밝힘</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Pokémon 창시자 <strong class="font-bold dark:font-extrabold">타지리 사토시</strong>가 미야모토에게 &quot;Mario를 넘어서려면 <strong class="font-bold dark:font-extrabold">고객 한 명당 게임을 두 장씩 팔아야 한다</strong>&quot;고 농담처럼 말했던 것이 계기</li>
<li class="ms-6 text-pretty" data-v-09555c0e>미야모토는 이것이 <strong class="font-bold dark:font-extrabold">Pokémon Red와 Green(일본 최초 버전, 1996년)이 만들어진 이유 중 하나</strong>라고 설명함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>실제로는 이 전략이 판매량에서 Mario를 항상 이긴 것은 아님</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Pokémon이 Mario를 이긴 경우는 <strong class="font-bold dark:font-extrabold">Game Boy Color의 Gold/Silver</strong>와 <strong class="font-bold dark:font-extrabold">Game Boy Advance의 Ruby/Sapphire</strong> 두 번뿐</li>
<li class="ms-6 text-pretty" data-v-09555c0e>DS, 3DS, Switch에서는 Mario가 우세했으며(Wii/Wii U에는 본편 Pokémon 게임 없음), Mario Kart 8은 69.56백만 장을 판매해 Pokémon Sword/Shield(26.84백만)와 Scarlet/Violet(27.15백만)을 크게 앞섬</li>
<li class="ms-6 text-pretty" data-v-09555c0e>그럼에도 두 버전 전략은 Pokémon 시리즈의 <strong class="font-bold dark:font-extrabold">엄청난 성공에 해가 되지 않았으며</strong>, 독특한 판매 방식으로 자리잡음</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://techblog.lycorp.co.jp/ko/p-canvas-a-technique-for-understanding-your-team?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">P-Canvas, 팀을 이해하기 위한 엔지니어링 기법</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20251111080123/https://techblog.lycorp.co.jp/ko/p-canvas-a-technique-for-understanding-your-team?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>ABC Platform 팀은 &#39;재생산 비용을 낮추는 행위&#39;를 엔지니어링으로 정의하며, 이 관점에서 팀 매니징도 시스템화할 수 있다고 보고 <strong class="font-bold dark:font-extrabold">&#39;매니징 엔지니어링&#39;</strong> 개념을 도입함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">P-Canvas</strong>는 개인의 성장과 현재 상태를 한 장의 캔버스에 시각화하는 매니징 프레임워크로, 5개월 단위로 매달 한 번씩 멤버가 직접 작성한 뒤 이를 기반으로 1on1 미팅을 진행하는 방식으로 운영됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>P-Canvas 도입 배경
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>자율성을 중시하다가 자칫 방임으로 흐를 뻔한 경험</li>
<li class="ms-6 text-pretty" data-v-09555c0e>기존 1on1 미팅이 멤버 주도가 아닌 리드 주도로 흐르거나, 대화 주제가 불명확하거나, 추상적 격려로 끝나는 등 효과적으로 활용되지 못함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>멤버의 불만을 조기에 감지하고 구체적인 대화를 나누기 위한 체계적인 도구의 필요성</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e>P-Canvas는 <strong class="font-bold dark:font-extrabold">2차원 좌표계</strong>(소통 적극성, 성장과 성과 관계, 안정/도전 과제 감정 상태), <strong class="font-bold dark:font-extrabold">척도형 지표</strong>(업무 비중, 참여도, 만족도, 동기 부여, 완전한 솔직함), <strong class="font-bold dark:font-extrabold">헥사곤 스킬 차트</strong>(팀/개인/상위 조직 관점의 6가지 역량), <strong class="font-bold dark:font-extrabold">텍스트 영역</strong>(자유 회고 및 목표)으로 구성됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>P-Canvas의 핵심 가치는 <strong class="font-bold dark:font-extrabold">절대 점수가 아닌 변화량 추적</strong>에 있으며, 매월 반복하면서 각 지표의 변화를 관찰하고 &#39;왜 이 부분이 변했는가?&#39;라는 질문에서 시작되는 대화를 통해 서로를 이해함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>P-Canvas 활용 효과
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">조기 신호 감지</strong>: 데이터 패턴 변화를 통해 문제를 조기에 발견(예방적 관리)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">구체적 대화</strong>: 추상적 질문 대신 데이터 기반의 구체적 대화 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">해결책 공동 탐색</strong>: 멤버가 원하는 방향을 명확히 파악하고 함께 대응</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">변화 추적</strong>: 회복과 성장 과정을 관찰하며 효과적인 접근법 학습</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e>첫 번째 5개월 사이클에서는 모든 멤버에게 <strong class="font-bold dark:font-extrabold">동일한 표준 지표</strong>를 적용해 팀 전체 경향과 개인별 차이를 파악하고, 두 번째 사이클부터는 각 멤버의 상황에 맞게 <strong class="font-bold dark:font-extrabold">지표를 개인화</strong>하여 맞춤형 캔버스로 진화시킴</li>
<li class="ms-6 text-pretty" data-v-09555c0e>운영 원칙: P-Canvas는 <strong class="font-bold dark:font-extrabold">평가가 아닌 성장 기록 도구</strong>이며, 1on1 미팅에서는 서로가 &#39;메타 헬퍼&#39;가 되어 동등한 관계에서 대화하고, 가장 중요한 전제 조건은 <strong class="font-bold dark:font-extrabold">솔직한 태도</strong>임</li>
<li class="ms-6 text-pretty" data-v-09555c0e>P-Canvas를 통해 복잡한 인간 관계와 개인의 성장을 시스템화하려는 시도로, 기술 엔지니어링처럼 매니징도 지속적인 리팩토링과 최적화가 필요한 영역이라는 철학을 담고 있음</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://blog.dochia.dev/blog/json-isnt-json/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">JSON is not JSON Across Languages | Dochia CLI Blog</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20251111080404/https://blog.dochia.dev/blog/json-isnt-json/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=45385373&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>JSON은 명세상 단순하고 보편적인 데이터 형식으로 설계되었으나, <strong class="font-bold dark:font-extrabold">실제로는 프로그래밍 언어와 라이브러리마다 해석 방식이 다르다</strong>는 문제를 가지고 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">숫자 정밀도 문제</strong>: JavaScript는 모든 숫자를 64비트 부동소수점으로 처리하여 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">2^53-1</code>보다 큰 정수는 정밀도를 잃지만, Python과 Java는 큰 정수를 올바르게 처리함. Go는 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">interface{}</code>로 언마샬할 때 정밀도를 잃지만 명시적 타입 사용 시 정확함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">소수점 정밀도</strong>: 0.1 + 0.2 같은 부동소수점 연산은 IEEE 754 특성상 모든 언어에서 부정확하며, <strong class="font-bold dark:font-extrabold">금융 데이터 처리 시 반드시 Decimal/BigDecimal 타입을 사용</strong>해야 함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">유니코드 정규화</strong>: &quot;José&quot;를 단일 코드포인트(U+00E9) 또는 결합 형태(e + ́)로 표현 가능하며, 언어마다 정규화 방식이 달라 <strong class="font-bold dark:font-extrabold">동일하게 보이는 문자열이 비교 시 다르게 처리</strong>될 수 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">객체 키 순서</strong>: JSON 명세는 키 순서가 무의미하다고 하지만, JavaScript와 Python 3.7+은 삽입 순서를 보존하고 Go는 알파벳 순으로 정렬하며, 이는 <strong class="font-bold dark:font-extrabold">HMAC/서명 등 암호화 작업에서 치명적인 불일치</strong>를 야기함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Null vs Undefined vs Missing</strong>: JavaScript는 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">null</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">undefined</code>, 없는 키를 구분하지만 Python과 Go는 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">null</code>과 없는 키를 모두 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">None</code>/<code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">nil</code>로 처리하여 <strong class="font-bold dark:font-extrabold">의미적 차이를 구분할 수 없음</strong></li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">날짜/시간 처리</strong>: JSON에 네이티브 날짜 타입이 없어 ISO 8601 문자열, Unix 타임스탬프(초/밀리초), 커스텀 형식 등이 혼재하며, <strong class="font-bold dark:font-extrabold">언어마다 파싱 방식이 달라 혼란 발생</strong></li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">에러 처리 불일치</strong>: 중복 키, 후행 쉼표, 선행 0, 작은따옴표 등 비정상 JSON에 대해 언어와 라이브러리마다 허용/거부 여부가 다름. Jackson은 설정으로 엄격 모드 활성화 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">실제 사례</strong>: Twitter API는 큰 정수 ID 손실 방지를 위해 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">id</code>와 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">id_str</code> 둘 다 제공, PostgreSQL의 JSON은 원본 유지하지만 JSONB는 정규화, MongoDB는 Extended JSON으로 추가 타입 지원</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">해결 전략</strong>: 스키마 검증 도구(Ajv, jsonschema) 사용, 데이터 타입 정규화 규칙 수립, 정밀도를 보존하는 라이브러리 선택(json-bigint, Jackson의 BigDecimal 설정), <strong class="font-bold dark:font-extrabold">언어 간 호환성 테스트를 CI/CD 파이프라인에 포함</strong>하여 프로덕션 배포 전 문제 감지</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://www.jonoalderson.com/performance/youre-loading-fonts-wrong/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">You’re loading fonts wrong (and it’s crippling your performance)</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20251111080554/https://www.jonoalderson.com/performance/youre-loading-fonts-wrong/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=45018144&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://news.hada.io/topic?id=22793&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GeekNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>대부분의 웹사이트는 <strong class="font-bold dark:font-extrabold">폰트를 잘못 로드하고 있으며</strong>, 이는 성능, 접근성, 프라이버시에 심각한 영향을 미침. 폰트는 장식이 아닌 <strong class="font-bold dark:font-extrabold">인프라</strong>로 취급해야 함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">폰트 로딩의 역사적 맥락</strong>: 웹 안전 폰트 시대 → sIFR/Cufón 같은 해킹 → <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">@font-face</code> 등장(포맷/라이선스 혼란) → Typekit/Google Fonts 등장으로 편의성 확보, 하지만 성능/프라이버시 문제 발생</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">폰트 작동 원리</strong>: 브라우저의 폰트 렌더링 파이프라인은 등록 → 스타일 결정 → 폰트 매칭 → 글리프 커버리지 확인 → 요청 → 디스플레이 단계로 진행되며, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">font-display</code> 설정에 따라 FOIT/FOUT 발생</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">성능 최적화 핵심 전략</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">WOFF2만 사용</strong>(99%의 경우 충분, 레거시 포맷은 불필요한 부담)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">서브세팅</strong>: <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">unicode-range</code>로 실제 사용하는 글리프만 제공(수백 KB 절약 가능)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold"><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">font-display: swap</code></strong> 기본 사용, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">size-adjust</code>/<code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">ascent-override</code>/<code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">descent-override</code>로 폴백 폰트 메트릭 조정하여 CLS 제거</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">프리로드</strong>: <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">&lt;link rel=&quot;preload&quot; as=&quot;font&quot; crossorigin&gt;</code>로 중요 폰트를 즉시 요청, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">@font-face</code> 선언은 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">&lt;head&gt;</code>에 인라인</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Variable 폰트는 만능이 아님</strong>: 여러 웨이트가 필요할 때만 유용하며, 2~3개 정적 폰트보다 오히려 클 수 있음. 신중히 평가 후 사용</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">자체 호스팅 필수</strong>: Google Fonts 같은 서드파티 CDN은 GDPR 위반 소지, 레이턴시 증가, 캐시 공유 불가(최신 브라우저는 사이트별 캐시 분리). 자체 호스팅이 빠르고 안전함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">시스템 폰트 스택 활용</strong>: 커스텀 폰트 없이도 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">-apple-system, BlinkMacSystemFont, Segoe UI, Roboto</code> 등 시스템 폰트로 빠르고 안정적인 렌더링 가능. 폴백 설계도 신중히</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">아이콘 폰트 사용 금지</strong>: Font Awesome 같은 아이콘 폰트는 접근성 문제(스크린 리더), 깨짐, 과도한 용량 등 문제 많음. 인라인 SVG나 SVG 스프라이트로 대체해야 함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">비라틴 문자/RTL/이모지 고려</strong>: 아랍어, 태국어, CJK 등은 무분별한 서브세팅 시 깨질 수 있음. 이모지는 시스템 폰트 사용(<code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">Apple Color Emoji</code>, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">Noto Color Emoji</code> 등)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">실행 가능한 체크리스트</strong>: WOFF2 단일 포맷, 서브세팅, 프리로드+인라인, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">font-display: swap</code>, 시스템 폴백 메트릭 조정, SVG 아이콘 전환, 글로벌 스크립트 테스트, DevTools/Lighthouse로 성능 측정</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://www.fastcompany.com/91435192/chatgpt-llm-openai-jobs-amazon?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">AI isn&#39;t replacing jobs. AI spending is - Fast Company</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20251111102457/https://www.fastcompany.com/91435192/chatgpt-llm-openai-jobs-amazon?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=45866243&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://news.hada.io/topic?id=24260&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GeekNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>수십 년간의 예측에도 불구하고, AI는 현재 광범위한 일자리 대체의 원인이 아니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>대규모 언어 모델(LLM)은 글쓰기와 요약 같은 작업을 수행할 수 있지만, 비즈니스 도입과 영향은 제한적이다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>많은 기업들이 정리해고를 발표하고 이를 AI 탓으로 돌리고 있지만, 이러한 주장은 의문시되고 있다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>생성형 AI 파일럿 프로젝트의 상당수가 실패하고 있으며, 기업들은 AI 도입으로 인한 효율성이나 품질의 극적인 개선을 보지 못하고 있다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>기술 부문의 정리해고는 AI보다는 팬데믹 시기의 급격한 채용에 이은 경제적 압박과 더 관련이 있을 가능성이 높다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>기업들은 그에 상응하는 수익 증가 없이 AI 인프라에 막대한 지출을 하여 재정적 압박을 받고 있다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>AI는 정리해고와 남은 직원들의 업무량 증가를 포함한 비용 절감 조치의 편리한 변명거리로 사용되고 있다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>생성형 AI가 창출하는 수익은 현재 AI 인프라에 대한 자본 지출에 비해 미미하여, 경제 전반의 정리해고를 주도할 가능성은 낮다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>투자자들은 AI 창조자들의 투명성 부족과 대형 기술 기업들의 AI 수익을 분리하기 어려운 점으로 인해 AI 투자에 대한 불확실성에 직면하고 있다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>AI가 일자리를 없앨 것이라는 이야기는 신규 졸업자들을 낙담시키며, 역설적으로 그들을 덜 고용 가능하게 만들고 더 유망한 노력에서 자원을 전용하게 만든다.</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://thenewstack.io/ffmpeg-to-google-fund-us-or-stop-sending-bugs/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">FFmpeg to Google: Fund Us or Stop Sending Bugs</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><a href="http://web.archive.org/web/20251112041939/https://thenewstack.io/ffmpeg-to-google-fund-us-or-stop-sending-bugs/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Archive</a> | <a href="https://news.ycombinator.com/item?id=45891016&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">HackerNews</a> | <a href="https://news.hada.io/topic?id=24307&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GeekNews</a></li>
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>FFmpeg는 VLC, Chrome, Firefox, YouTube 등 수많은 플랫폼에서 사용되는 핵심 오픈소스 멀티미디어 프레임워크이지만, 심각하게 자금이 부족한 상태임</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Google AI 에이전트가 FFmpeg에서 1995년 게임 Rebel Assault 2의 특정 코덱 관련 매우 사소한 버그를 발견하면서 논쟁이 촉발됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>FFmpeg 팀은 &quot;수조 달러 규모의 기업이 AI로 취미 코드의 보안 문제를 찾아낸 후, 무급 자원봉사자에게 수정을 기대하는 것이 공정한가&quot;라고 문제 제기</li>
<li class="ms-6 text-pretty" data-v-09555c0e>FFmpeg는 거의 전적으로 자원봉사자들에 의해 작성되고 유지보수되며, 특히 어셈블리 언어로 작성되어 수정 작업이 매우 어려움</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Google Project Zero의 새로운 투명성 정책은 보안 이슈 발견 후 일주일 내에 공개하고 90일 공개 타이머를 시작하는데, 이는 자원봉사 개발자들에게 과도한 압박으로 작용함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>libxml2의 전 관리자 Nick Wellnhofer는 매주 여러 시간을 제3자가 보고한 보안 문제 처리에 할애해야 해서 유지보수를 중단하기로 결정함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Google의 Patch Rewards Program은 월 3개 패치 제한 등으로 FFmpeg와 같은 프로젝트에는 너무 제한적임</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Chainguard CEO Dan Lorenc은 취약점 공개도 디지털 공유지에 대한 기여이며, 이러한 논쟁이 오히려 잠재적 후원자를 멀어지게 할 수 있다고 반박함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>핵심 문제는 FFmpeg 팀이 AI가 생성한 대량의 CVE를 처리할 재정적·개발 자원이 부족하다는 점</li>
<li class="ms-6 text-pretty" data-v-09555c0e>오픈소스로부터 이익을 얻는 수조 달러 규모 기업들의 실질적 지원 없이는, 중요한 오픈소스 프로젝트들이 더 이상 유지보수되지 않을 위험이 있음</li>
</ul>
</li>
</ul>
</li>
</ul></div>]]></content>
        <author>
            <name>Nesswit</name>
            <email>rishubil+blog@gmail.com</email>
            <uri>https://blog.update.sh/about</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[2025-11-10 주간 URL 모음]]></title>
        <id>https://blog.update.sh/weekly-urls/2025-11-10</id>
        <link href="https://blog.update.sh/weekly-urls/2025-11-10"/>
        <updated>2025-11-09T23:00:00.000Z</updated>
        <content type="html"><![CDATA[<div class="mdx-content leading-[1.6]" style="--v2806f315:0.875rem,[object Object],0.875rem,[object Object];--v67bf8b50:#6b7280;--v67bf83ce:#d1d5db;--v67bf878f:#9ca3af;--v67bf92d2:#374151;" data-v-ec58c90e><ul class="my-2 list-outside list-disc" data-v-ec58c90e>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://www.0xkato.xyz/linux-boot/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">The Linux Boot Process: From Power Button to Kernel</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Linux 부팅 과정을 전원 버튼을 누른 시점부터 커널이 실행되기까지 세 단계로 나누어 상세히 설명하는 기술 문서</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Part 1: 전원 버튼부터 커널의 첫 호흡까지</strong> - CPU는 리셋 후 real mode로 시작하여 reset vector(0xFFFFFFF0)로 점프하고, 펌웨어(BIOS 또는 UEFI)가 부트로더(GRUB 등)를 메모리에 로드하여 실행함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>부트로더는 압축된 커널과 setup 프로그램을 메모리에 배치하고, setup 프로그램은 세그먼트 레지스터 정렬, 스택 생성, BSS 영역 초기화, 메모리 맵 수집 등을 수행한 후 첫 C 함수인 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">main</code>을 호출함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Part 2: Real mode 탈출, 32비트 거쳐 64비트 도착</strong> - x86_64 Linux는 long mode(64비트)에서 실행되지만 real mode에서 직접 점프할 수 없어 protected mode(32비트)를 거쳐야 함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Protected mode 전환 시 GDT(Global Descriptor Table)와 IDT(Interrupt Descriptor Table)를 로드하고, 인터럽트를 비활성화한 후 CR0 레지스터의 PE 비트를 설정하여 전환함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Long mode 진입을 위해 페이징을 활성화하고(초기에는 2MB 페이지로 identity map 구성), EFER 레지스터의 LME 비트를 설정한 후 64비트 코드로 far return을 수행함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Part 3: 실제 커널 압축 해제, 주소 수정, 자체 이동</strong> - 64비트 stub이 자신의 위치를 파악하고 필요시 안전한 곳으로 복사한 후, 최소한의 IDT(page fault와 NMI 핸들러)를 로드함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">extract_kernel</code> 함수가 커널을 압축 해제(gzip, xz, zstd 등)하고 ELF 헤더를 읽어 각 섹션을 올바른 위치에 복사하며, 커널이 다른 주소에 로드된 경우 relocation을 적용하여 포인터와 주소를 수정함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">kASLR(Kernel Address Space Layout Randomization)</strong>은 공격을 어렵게 만들기 위해 물리/가상 base 주소를 무작위로 선택하며, 펌웨어 메모리 맵에서 사용 가능한 영역을 스캔하여 적합한 슬롯을 하드웨어 난수로 선택함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>모든 준비가 완료되면 실제 커널의 entry point인 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">start_kernel</code> 함수로 점프하여 본격적인 초기화가 시작되며, 문서 말미에 hexadecimal, register, segment, BIOS/UEFI, paging, ELF 등 핵심 용어에 대한 북마크 가능한 glossary를 제공함</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://lazygyu.net/blog/stolen-copyright?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">저작권 등록제도의 함정</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>작성자가 만든 &#39;마블 룰렛&#39;을 MIT 라이선스로 GitHub에 공개했으나, 누군가가 이를 무단으로 한국저작권위원회에 자신의 이름으로 등록함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>해당 등록자가 유튜버의 스트리밍 영상에 저작권 침해 신고를 넣어 영상이 삭제되는 사태가 발생하여, 피해 유튜버가 원 저작자에게 문의 메일을 보냄</li>
<li class="ms-6 text-pretty" data-v-09555c0e>작성자는 한국저작권위원회에 문의했으나 &quot;등록 시 저작권자 검증 권한이 없으며, 타인이 등록한 저작물을 철회시킬 절차도 없다&quot;는 답변을 받음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>경찰에 고소장을 접수했으나 첫 번째 수사 결과는 &quot;저작권 위원회 등록은 저작물의 공표로 볼 수 없어 저작권 침해가 아니다&quot;라는 이유로 <strong class="font-bold dark:font-extrabold">불송치</strong> 처리됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>작성자는 저작인격권 침해에 대해 재수사를 요청하기 위해 &#39;수사결과이의신청&#39;을 제기하여 사건이 검찰로 넘어감</li>
<li class="ms-6 text-pretty" data-v-09555c0e>검찰의 최종 수사 결과는 <strong class="font-bold dark:font-extrabold">&quot;혐의 없음(증거 불충분)&quot;</strong>으로, 법적으로 아무런 조치를 취할 수 없게 됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>한국저작권위원회의 등록 시스템은 <strong class="font-bold dark:font-extrabold">타인의 도용 여부나 기존 저작물과의 중복 여부를 검증할 권한과 절차가 없음</strong></li>
<li class="ms-6 text-pretty" data-v-09555c0e>작성자가 먼저 저작권을 등록했어도 타인이 똑같이 도용 등록할 수 있으며, 위원회는 이를 막을 수 없는 구조적 문제가 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>변호사를 고용하는 방법도 고려했으나, 해당 프로그램으로 금전적 이익을 얻지 못하는 상황에서 수임료 대비 실익이 없어 포기함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>결국 빤히 저작권 도용과 타인에 대한 횡포를 목격하고도 법적으로 대응할 수 없는 <strong class="font-bold dark:font-extrabold">사이다 없는 결말</strong>로 사건이 종결됨</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://maily.so/pepper.note/posts/wdr93mx1rlx?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">2013년까지 파리에서는 여성이 바지를 입으면 불법이었습니다.</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>역사적으로 치마가 바지보다 먼저 개발되었으며, 그 이유는 제작이 훨씬 간단했기 때문임</li>
<li class="ms-6 text-pretty" data-v-09555c0e>바지는 <strong class="font-bold dark:font-extrabold">말타기의 필요성</strong> 때문에 발명되었으며, 치마를 입고 말을 타면 허벅지가 심하게 쓸리는 문제가 있었음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>중국 춘추시대에는 전차 중심의 전투로 인해 치마가 기본 복장이었으나, 전국시대 조나라 무령왕이 북방 유목민족의 기마 전투 방식을 도입하며 <strong class="font-bold dark:font-extrabold">&#39;호복기사(胡服騎射)&#39;</strong> 혁신을 단행함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>무령왕은 &quot;오랑캐 옷을 입어서는 안 된다&quot;는 대신들의 반발과 태자 폐위라는 초강수를 두면서까지 바지 착용을 밀어붙였고, 결과적으로 조나라는 군사력이 크게 증강되어 전성기를 맞이함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>고대 유럽에서도 바지는 야만인의 문화로 여겨졌으나, 로마 제국이 확장되며 험난한 환경에서 싸우던 군인들로부터 바지가 점차 받아들여지고 민간으로 확산됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>유럽 여성들에게 바지가 퍼진 계기는 <strong class="font-bold dark:font-extrabold">자전거의 등장</strong>이었으며, 말타기처럼 자전거를 타기 위해 바지가 필요했음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>산업혁명 이후 노동에서의 편의성 때문에 바지는 더욱 광범위하게 확산됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>1800년 파리에서는 여성의 바지 착용을 금지하는 조례가 제정되었는데, 이는 특정 직업에 여성이 접근하는 것을 막기 위한 시도로 분석됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>1892년과 1909년에 자전거나 말을 탈 때만 여성의 바지 착용이 허용되도록 수정되었으나, 이 법은 <strong class="font-bold dark:font-extrabold">2013년에 들어서야 완전히 폐지</strong>됨</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://oddatelier.net/a-new-typeface-zen-serif/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">A NEW TYPEFACE, ZEN SERIF</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>JENNIE는 &lt;ZEN&gt;과 &lt;Seoul City&gt;를 통해 한국을 세계에 알린 아티스트로, 한국과 한글에 대한 깊은 자부심을 바탕으로 활동함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>세종대왕이 한글을 창제한 정신을 이어받아, JENNIE는 글로벌 팬들에게 한글의 미학과 가치를 전달하고자 함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">ZEN SERIF</strong>는 전통의 미감과 현대적 감각을 담은 한글 폰트로, 더 많은 사람들이 한글을 편리하고 아름답게 사용할 수 있도록 제작됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>블랙레터(Blackletter)는 중세부터 사용된 서체로 힘, 권위, 전통을 상징하는 서양 전통 서체임</li>
<li class="ms-6 text-pretty" data-v-09555c0e>ZEN SERIF는 블랙레터의 고정된 이미지를 벗어나 <strong class="font-bold dark:font-extrabold">현대적 시각에서 새롭게 재해석한 폰트</strong></li>
<li class="ms-6 text-pretty" data-v-09555c0e>장식을 최소화하여 본질을 살리고, 딱딱한 인상을 완화하며 유연한 곡선을 더해 <strong class="font-bold dark:font-extrabold">OA 특유의 섬세한 예술성</strong>을 담음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>OA와 JENNIE의 태도는 <strong class="font-bold dark:font-extrabold">기존의 길을 답습하지 않고 새로운 길을 개척하는 것</strong>으로, 이번 작업에서도 명확히 드러남</li>
<li class="ms-6 text-pretty" data-v-09555c0e>서양 전통 서체인 블랙레터와 한글을 <strong class="font-bold dark:font-extrabold">과감히 결합</strong>하여, 누구도 시도하지 않았던 낯선 조합을 완성함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>전통성과 현대성이 어우러진 이 서체는 <strong class="font-bold dark:font-extrabold">강렬하면서도 신선한 인상</strong>을 남김</li>
<li class="ms-6 text-pretty" data-v-09555c0e>ZEN SERIF는 전통이 재해석되고 문화가 재탄생한 서체로, 강력하고 독창적인 인상을 제공함</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://lucumr.pocoo.org/2025/11/3/absurd-workflows/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Absurd Workflows: Durable Execution With Just Postgres</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Absurd는 <strong class="font-bold dark:font-extrabold">Postgres만을 사용하여 durable execution(내구성 있는 실행)을 구현하는 매우 간단한 SQL 기반 라이브러리</strong>로, 복잡한 서드파티 서비스나 확장 없이 작동함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Durable execution은 <strong class="font-bold dark:font-extrabold">크래시, 재시작, 네트워크 장애에도 상태를 잃지 않고 작업을 중복 실행하지 않는 장기 실행 함수</strong>를 가능하게 하며, 큐 시스템과 상태 저장소의 조합으로 볼 수 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Postgres의 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">SELECT ... FOR UPDATE SKIP LOCKED</code> 기능으로 큐로 활용하고, 데이터베이스 특성상 상태 저장에도 사용할 수 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>핵심 구조: <strong class="font-bold dark:font-extrabold">Task(작업)가 Queue(큐)에 전달되고, Worker(워커)가 이를 처리하며, Step(단계)으로 세분화되어 순차 실행됨</strong>. 실패 시 재실행(run)되며, 각 단계 결과는 checkpoint로 저장되어 자동으로 재로드됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>AI 에이전트와의 관계: <strong class="font-bold dark:font-extrabold">에이전트는 자체적으로 워크플로우를 정의하는 단일 단계 반복 워크플로우</strong>로 볼 수 있으며, Absurd는 반복되는 단계를 자동으로 카운팅함 (iteration, iteration#2, iteration#3 등)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>단계가 실패하면 작업 전체가 재시도되지만, <strong class="font-bold dark:font-extrabold">checkpoint 덕분에 이전에 완료된 단계는 자동으로 로드되어 중복 실행되지 않음</strong></li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">ctx.sleep()</code>으로 특정 시간 동안 대기하거나, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">ctx.waitForEvent()</code>로 이벤트를 기다릴 수 있으며, 이벤트는 캐시되어 race-free 보장</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">단일 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">.sql</code> 파일만 데이터베이스에 적용하면 되고</strong>, SDK는 언어별 편의성을 제공하는 얇은 래퍼 역할만 수행</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Temporal 같은 복잡한 솔루션과 달리 <strong class="font-bold dark:font-extrabold">컴파일러 플러그인, 별도 서비스, 런타임 통합 없이 Postgres만으로 충분</strong>하며, 특히 셀프 호스팅에 유리함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이름의 유래: <strong class="font-bold dark:font-extrabold">durable workflow는 본질적으로 매우 단순한데(absurdly simple) 최근 몇 년간 지나치게 복잡해졌다</strong>는 의미</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://github.com/Vanilagy/mediabunny?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GitHub - Vanilagy/mediabunny: Pure TypeScript media toolkit for reading, writing, and converting video and audio files, directly in the browser.</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Mediabunny는 브라우저에서 미디어 파일(MP4, WebM, MP3 등)을 읽고, 쓰고, 변환할 수 있는 JavaScript 라이브러리</strong>로, 웹을 위한 고성능 미디어 작업 툴킷을 목표로 함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>순수 TypeScript로 작성되었으며 <strong class="font-bold dark:font-extrabold">의존성이 전혀 없고</strong>, 매우 뛰어난 tree-shaking을 지원하여 사용하는 기능만 번들에 포함 가능 (최소 5KB gzipped)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>주요 기능
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">광범위한 포맷 지원</strong>: MP4, MOV, WebM, MKV, WAVE, MP3, Ogg, ADTS, FLAC 등 읽기/쓰기</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">내장 인코딩/디코딩</strong>: WebCodecs API를 활용한 하드웨어 가속으로 25개 이상의 비디오, 오디오, 자막 코덱 지원</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">고정밀도</strong>: 마이크로초 단위의 정확한 읽기/쓰기 작업</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">변환 API</strong>: transmuxing, transcoding, 크기 조정, 회전, 크롭, 리샘플링, 트리밍 등 다양한 기능 제공</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">스트리밍 I/O</strong>: 메모리 효율적인 스트리밍으로 모든 크기의 파일 처리</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e>브라우저와 Node.js 모두에서 작동하며, ECMAScript 2021 이상, TypeScript 5.7 이상 필요</li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">npm install mediabunny</code>로 설치하거나 script 태그로 직접 포함 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e>사용 예시로 미디어 파일 정보 읽기, Canvas에서 MP4 생성, 파일 포맷 변환(예: WebM으로 변환) 등을 제공</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Mozilla Public License 2.0 (MPL-2.0)</strong> 하에 오픈소스로 공개되어 상업적/비상업적 용도 모두 자유롭게 사용 가능하며, 폐쇄 소스 프로젝트에도 사용 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e>MPL-2.0의 의무사항: Mediabunny의 소스 코드를 수정하여 배포할 경우, 수정 사항을 동일 라이선스로 공개해야 함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>프로젝트 개발 및 유지보수를 위해 스폰서와 기부를 환영하며, 순수 TypeScript로 구현되고 WebCodecs API 추상화를 통해 멀티플렉서/디멀티플렉서를 연결하는 고성능 파이프라인 구조</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://velog.io/@sehyunny/stack-overflow-collapse?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">(번역) 개발자 커뮤니티가 사라질 때 발생하는 일: 서서히 진행되는 스택 오버플로우의 쇠퇴</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>스택 오버플로우는 2008년 출시 이후 2012-2023년 황금기를 거치며 <strong class="font-bold dark:font-extrabold">개발자 커뮤니티의 핵심 Q&amp;A 플랫폼</strong>으로 자리매김했으나, 2022년 말 ChatGPT 출시 이후 사용량이 급격히 감소하기 시작함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>현재 대부분의 개발자들은 <strong class="font-bold dark:font-extrabold">스택 오버플로우 대신 코드 에디터에 내장된 생성형 AI 도구</strong>를 활용해 즉각적으로 문제를 해결하며, 전통적인 온라인 포럼 탐색 방식을 버리고 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">생성형 AI의 장점</strong>: 즉각적인 답변 제공, 대기 시간 없음, 코드 에디터 내 통합으로 빠른 문제 해결 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">스택 오버플로우의 장점</strong>: 인간 전문가가 작성·검토한 답변으로 <strong class="font-bold dark:font-extrabold">품질과 정확성 보장</strong>, 창의적이고 지적인 해결책 제공, 진정성 있는 인간 중심 상호작용</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">생성형 AI의 한계</strong>: 품질과 정확성 보장 불가, 환각(hallucination) 현상, 창의성과 논리적 사고 능력 부재, 훈련 데이터에 국한된 지능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">스택 오버플로우의 문제점</strong>: 답변 대기 시간, 초보자에게 불친화적, 중복 질문 관리의 어려움, AI 생성 답변으로 인한 품질 저하</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">지속 가능성의 딜레마</strong>: 개발자 커뮤니티가 사라지면 AI 모델도 신선한 학습 데이터를 확보하지 못해 결국 함께 쇠퇴할 것이며, 이는 소프트웨어 산업 전체에 부정적 영향을 미침</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">공존 솔루션</strong>: Quora처럼 <strong class="font-bold dark:font-extrabold">생성형 AI와 인간이 작성한 콘텐츠를 통합</strong>하여, 사용자가 질문 성격에 따라 AI 또는 인간 답변을 선택할 수 있도록 하는 것이 유일한 지속 가능한 해결책</li>
<li class="ms-6 text-pretty" data-v-09555c0e>스택 오버플로우는 별도의 AI 웹사이트를 운영하며 대응 중이나, <strong class="font-bold dark:font-extrabold">AI와 개발자 커뮤니티가 완전히 공존하는 생태계 구축까지는 수년이 걸릴 것</strong>으로 예상됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>결론적으로 스택 오버플로우의 쇠퇴는 일시적이며, <strong class="font-bold dark:font-extrabold">AI 도구가 최신 인간 작성 콘텐츠를 지속적으로 확보할 수 있는 지속 가능한 생태계</strong>가 구축되어야 양쪽 모두 살아남을 수 있음</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://news.ycombinator.com/item?id=44977645&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Code formatting comes to uv experimentally</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Astral사의 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">uv</code>에 새로운 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">uv format</code> 명령어가 추가되어, 내부적으로는 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">ruff</code>의 포매터를 실행하는 기능이 제공된다</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 통합은 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">ruff</code>와 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">uv</code>의 병합이 아니라, Rust의 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">cargo fmt</code>가 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">rustfmt</code>를 실행하는 것과 유사하게, 사용자에게 보다 간소화된 경험을 제공하는 것이 목적이다</li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">uv format</code>은 실험적 기능으로, 실행 시 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">ruff</code>를 자동으로 다운로드·설치하기 때문에, 사용하지 않을 경우 영향이 없는 설계이다</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Go나 Rust처럼 단일 툴(<code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">uv</code>)로 &quot;프로젝트 초기화, 실행, 포맷&quot;을 완결할 수 있는 개발 경험을 목표로 하고 있다</li>
<li class="ms-6 text-pretty" data-v-09555c0e>일부 사용자는 기능 비대화(feature creep)를 우려하며, 패키지 매니저에 포맷 기능을 통합하는 것에 부정적인 의견도 존재한다</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Unix 철학의 &quot;단일 목적 툴의 조합&quot;을 중시하는 입장에서는, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">uvx ruff</code>나 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">uv tool run ruff</code>로 충분하다는 의견이 있다</li>
<li class="ms-6 text-pretty" data-v-09555c0e>반면 많은 개발자는, 팀 전체의 코드 포맷 통일이나 초보자의 학습 부담 경감 관점에서, 통합된 툴체인을 지지한다</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Rust의 API-first 백엔드 개발에서의 우위성에 대해서도 논의가 있으며, 리퀘스트-리스폰스 플로우에서는 동시성 프리미티브가 배우기 쉽고, <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">Arc&lt;Mutex&lt;T&gt;&gt;</code>로 대부분의 케이스에 대응할 수 있다</li>
<li class="ms-6 text-pretty" data-v-09555c0e>SQLx와 같은 타입 체크 기능이 있는 SQL 라이브러리나, Rust의 ORM에 대한 기술적인 논의도 전개되고 있다</li>
<li class="ms-6 text-pretty" data-v-09555c0e>향후 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">uv lint</code>나 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">uv test</code>와 같은 추가 명령어도 검토될 가능성이 있으며, Python의 &quot;Cargo화&quot;가 진행 중이다</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://blog.craigie.dev/introducing-glide/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Introducing Glide, an extensible, keyboard-focused web browser | Robert Craigie</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>요약
제목: 확장 가능하고 키보드 중심의 웹 브라우저, Glide 소개
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Glide는 확장 가능하고 키보드 중심의 웹 브라우저로 설계된 Firefox 포크입니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>사용자가 브라우저 동작을 광범위하게 사용자 정의할 수 있는 TypeScript 구성을 제공합니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Glide는 핵심 브라우저 액세스를 제공하여 Firefox 확장 기능의 한계를 해결하며, 기존 확장 기능으로는 불가능한 기능을 구현할 수 있습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>사용자는 Glide 내에서 사용자 정의 키 매핑을 정의하고, 임의의 프로세스를 생성하며, 매크로를 만들 수 있습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 브라우저는 (neo)vim의 모드 개념을 차용하여 사용자 상호작용에 따라 &#39;normal&#39;, &#39;insert&#39;, &#39;ignore&#39;와 같은 모드 간에 자동으로 전환됩니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Glide는 키보드만으로 웹 페이지를 완전히 조작할 수 있는 &#39;hint&#39; 모드를 제공하며, 선택 가능한 요소에 레이블을 오버레이로 표시합니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>주요 기능으로는 가장 크게 보이는 입력 요소에 포커스하기, 퍼지 탭 파인더, 이전에 열었던 탭을 통한 탐색, 구성 변경 사항을 테스트하기 위한 REPL 등이 있습니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>기존 Firefox 확장 기능 및 워크플로우와 통합되어 Firefox 사용자에게 친숙한 환경을 제공합니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Glide는 현재 초기 알파 단계에 있으며 macOS와 Linux에서 사용할 수 있으며, Linux 사용자의 경우 수동 설치가 필요합니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 브라우저는 핵심 기능에 대한 완전한 사용자 제어를 제공하는 것을 목표로 하며, 외부 도구와의 깊은 사용자 정의 및 통합을 가능하게 합니다.</li>
</ul>
</li>
</ul>
</li>
</ul></div>]]></content>
        <author>
            <name>Nesswit</name>
            <email>rishubil+blog@gmail.com</email>
            <uri>https://blog.update.sh/about</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[2025-10-20 주간 URL 모음]]></title>
        <id>https://blog.update.sh/weekly-urls/2025-10-20</id>
        <link href="https://blog.update.sh/weekly-urls/2025-10-20"/>
        <updated>2025-10-19T23:00:00.000Z</updated>
        <content type="html"><![CDATA[<div class="mdx-content leading-[1.6]" style="--v2806f315:0.875rem,[object Object],0.875rem,[object Object];--v67bf8b50:#6b7280;--v67bf83ce:#d1d5db;--v67bf878f:#9ca3af;--v67bf92d2:#374151;" data-v-ec58c90e><ul class="my-2 list-outside list-disc" data-v-ec58c90e>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://voidzero.dev/posts/announcing-vite-plus?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Announcing Vite+</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">Vite+</strong>는 Vite를 기반으로 한 상위 호환 CLI 개발 도구로, npm에서 설치 가능하며 추가 기능을 제공함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>주요 명령어들을 통합 제공
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">vite new</code>: 프로젝트 스캐폴딩 및 모노레포 생성, 코드 생성 지원</li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">vite test</code>: Vitest 기반 단위 테스트 (Jest 호환 API, 브라우저 모드, 시각적 회귀 테스트 등)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">vite lint</code>: Oxlint 기반 린팅 (ESLint보다 최대 100배 빠름, 600+ 규칙 지원)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">vite fmt</code>: Oxfmt 기반 코드 포맷팅 (Prettier 99%+ 호환)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">vite lib</code>: tsdown과 Rolldown 기반 라이브러리 번들링</li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">vite run</code>: 지능형 캐싱을 갖춘 모노레포 태스크 러너</li>
<li class="ms-6 text-pretty" data-v-09555c0e><code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">vite ui</code>: 모듈 분석, 번들 크기 분석 등을 제공하는 GUI 개발도구</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e>React, Vue, Tanstack Start, SvelteKit 등 주요 프레임워크와 호환되며, 복잡한 설정 없이 즉시 사용 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">전체 컴파일러 툴체인을 Rust로 구현</strong>하여 성능을 극대화했으며, Framer, Linear, Atlassian, Shopify 등에서 이미 채택함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>JavaScript 툴링 생태계의 파편화와 대규모 프로젝트의 도구 복잡성 문제를 해결하기 위해 <strong class="font-bold dark:font-extrabold">통합 솔루션</strong>을 제공하는 것이 목표</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">라이선스 모델</strong>: 개인, 오픈소스 프로젝트, 소규모 비즈니스는 무료, 스타트업은 정액제, 엔터프라이즈는 맞춤 가격 (상용 라이선스이지만 소스 공개)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Vite, Vitest, Rolldown, Oxc 등 기존 오픈소스 프로젝트는 <strong class="font-bold dark:font-extrabold">MIT 라이선스로 영구 유지</strong>되며, Vite+는 그 위에 구축된 별도의 추가 레이어임</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">2026년 초 공개 프리뷰 예정</strong>이며, 현재 프로덕션 환경에서 테스트할 얼리 어답터를 모집 중 (viteplus.dev)</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://developer.chrome.com/blog/chrome-devtools-mcp?hl=ko&amp;utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">AI 에이전트를 위한 Chrome DevTools (MCP) | Blog | Chrome for Developers</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Chrome DevTools 모델 컨텍스트 프로토콜(MCP) 서버의 공개 미리보기가 출시되어 AI 코딩 어시스턴트에서 Chrome DevTools 기능을 활용할 수 있게 됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>기존 AI 코딩 에이전트는 생성한 코드가 브라우저에서 실제로 어떻게 작동하는지 확인할 수 없는 근본적인 문제가 있었음(눈을 가리고 프로그래밍하는 것과 같음)</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">모델 컨텍스트 프로토콜(MCP)</strong>은 대규모 언어 모델(LLM)을 외부 도구 및 데이터 소스에 연결하기 위한 오픈소스 표준임</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Chrome DevTools MCP 서버를 통해 AI 어시스턴트가 Chrome에서 직접 웹페이지를 디버그하고, DevTools의 디버깅 기능과 성능 통계를 활용하여 문제 식별 및 수정 정확도를 향상시킬 수 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>주요 활용 사례
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">실시간 코드 변경사항 확인</strong>: AI가 생성한 수정사항이 의도대로 작동하는지 자동 검증</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">네트워크 및 콘솔 오류 진단</strong>: CORS 문제 발견, 콘솔 로그 검사 등</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">사용자 행동 시뮬레이션</strong>: 버그 재현 및 복잡한 사용자 흐름 테스트</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">스타일 및 레이아웃 문제 디버그</strong>: DOM과 CSS 검사를 통한 레이아웃 문제 해결</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">성능 감사 자동화</strong>: 성능 추적 실행 및 분석, LCP 등 성능 지표 개선</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e>사용 시작: MCP 클라이언트에 <code class="bg-teal-100 px-1 py-0.5 font-mono dark:bg-teal-900 dark:text-gray-100">npx chrome-devtools-mcp@latest</code> 명령어로 간단히 구성 추가 가능</li>
<li class="ms-6 text-pretty" data-v-09555c0e>공개 미리보기 단계로 점진적으로 개발 중이며, 개발자와 커뮤니티의 피드백을 적극 수집하여 기능을 개선할 예정</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://www.qualcomm.com/news/releases/2025/10/qualcomm-to-acquire-arduino-accelerating-developers--access-to-i?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Qualcomm to Acquire Arduino—Accelerating Developers’ Access to its Leading Edge Computing and AI | Qualcomm</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Qualcomm은 자사의 최첨단 기술과 Arduino의 방대한 생태계 및 커뮤니티를 결합하기 위해 Arduino를 인수합니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이번 인수는 개발자, 기업, 학생 및 애호가들이 아이디어를 빠르고 쉽게 실현할 수 있도록 지원하는 것을 목표로 합니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Qualcomm Dragonwing 플랫폼으로 구동되는 새로운 Arduino UNO Q는 고성능 컴퓨팅과 실시간 제어를 연결합니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Arduino App Lab은 다양한 플랫폼에서 구축, 테스트 및 배포 프로세스를 단순화하는 새로운 통합 개발 환경입니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이번 인수는 Edge Impulse 및 Foundries.io의 최근 통합을 기반으로 하며, 풀스택 엣지 플랫폼에 대한 Qualcomm의 의지를 강화합니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Arduino는 독립적인 브랜드, 도구 및 미션을 유지하면서 Qualcomm의 기술 스택과 글로벌 영향력에 접근할 수 있게 됩니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Arduino UNO Q는 Linux Debian 지원 마이크로프로세서와 실시간 마이크로컨트롤러를 갖춘 듀얼 브레인 아키텍처를 특징으로 합니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Arduino App Lab은 AI 기반 솔루션의 신속한 아이디어 구상, 프로토타이핑 및 확장을 위한 오픈소스 플랫폼을 제공합니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이번 인수는 Qualcomm의 첨단 기술과 Arduino의 단순성 및 경제성을 결합하여 산업 전반에 걸쳐 개발자 생산성을 크게 향상시킬 것으로 예상됩니다.</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Qualcomm의 비전은 글로벌 개발자 커뮤니티를 위해 자사의 최첨단 AI 및 컴퓨팅 제품에 대한 접근성을 민주화하는 것입니다.</li>
</ul>
</li>
</ul>
</li>
</ul></div>]]></content>
        <author>
            <name>Nesswit</name>
            <email>rishubil+blog@gmail.com</email>
            <uri>https://blog.update.sh/about</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[2025-10-06 주간 URL 모음]]></title>
        <id>https://blog.update.sh/weekly-urls/2025-10-06</id>
        <link href="https://blog.update.sh/weekly-urls/2025-10-06"/>
        <updated>2025-10-05T23:00:00.000Z</updated>
        <content type="html"><![CDATA[<div class="mdx-content leading-[1.6]" style="--v2806f315:0.875rem,[object Object],0.875rem,[object Object];--v67bf8b50:#6b7280;--v67bf83ce:#d1d5db;--v67bf878f:#9ca3af;--v67bf92d2:#374151;" data-v-ec58c90e><ul class="my-2 list-outside list-disc" data-v-ec58c90e>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://www.tomshardware.com/peripherals/gaming-mice/logitech-launches-mx-master-4-flagship-productivity-mouse-the-best-mouse-weve-tested-adds-haptic-feedback-circular-action-ring-shortcuts?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Logitech launches MX Master 4 flagship productivity mouse – the best mouse we&#39;ve tested adds haptic feedback, circular Action Ring shortcuts</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Logitech이 높은 평가를 받은 MX Master 3S 생산성 마우스의 후속작인 MX Master 4를 발표하며, 햅틱 피드백과 Action Ring 기능을 추가했다고 발표했습니다</li>
<li class="ms-6 text-pretty" data-v-09555c0e>햅틱 피드백은 엄지 받침 영역에 위치하며 4단계 강도 설정을 제공하여, 연결 상태, 배터리 부족 경고, 앱별 알림에 대한 미세한 진동을 제공합니다</li>
<li class="ms-6 text-pretty" data-v-09555c0e>엄지 버튼으로 접근할 수 있는 새로운 Action Ring 기능은 Windows 탐색기, 화면 캡처, 미디어 컨트롤, 이모지, AI 어시스턴트(ChatGPT, Perplexity, Gemini, Copilot)에 대한 원형 메뉴 바로가기를 제공합니다</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Action Ring은 Logitech Options+ 소프트웨어를 통해 사용자 정의할 수 있어 파일, 폴더, 매크로를 열거나 연결된 기기 간 전환이 가능합니다(이전에는 마우스를 뒤집어야 했음)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>향상된 칩, USB-C 동글, 개선된 안테나 배치로 인해 연결성이 &quot;2배 강력해졌다&quot;고 주장합니다</li>
<li class="ms-6 text-pretty" data-v-09555c0e>듀얼 모드 MagSpeed 스크롤 휠, 수평 사이드 휠, 유리와 대부분의 표면에서 작동하는 8K DPI 센서 등 시그니처 기능을 유지합니다</li>
<li class="ms-6 text-pretty" data-v-09555c0e>RF USB 또는 Bluetooth를 통해 Windows 10+, macOS 13+, Linux, ChromeOS와 호환되며, 70일 배터리 수명과 빠른 충전을 지원합니다</li>
<li class="ms-6 text-pretty" data-v-09555c0e>마우스 무게는 150그램(전작보다 9g 증가)으로, 약 50그램인 최신 게이밍 마우스보다 상당히 무겁습니다</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Mac 전용 모델과 함께 그래파이트, 페일 그레이, 블랙 색상으로 출시되며, 권장소비자가격은 $119.99입니다</li>
<li class="ms-6 text-pretty" data-v-09555c0e>전체 리뷰는 보류 중이지만, 초기 인상으로는 무게가 장시간 사용 시 주요한 단점이 될 수 있다고 언급했습니다</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://arstechnica.com/gadgets/2025/09/f-droid-calls-for-regulators-to-stop-googles-crackdown-on-sideloading/?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">F-Droid says Google’s new sideloading restrictions will kill the project</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Google은 최근 발표한 Android 개발자 인증 방식을 몇 주 내에 테스트할 예정이지만, 구체적인 진행 방식에 대한 정보는 거의 공개되지 않음</li>
<li class="ms-6 text-pretty" data-v-09555c0e>F-Droid(무료 오픈소스 앱 저장소)는 Google의 계획이 Play Store 외부 개발자들에게 회사 등록을 강제함으로써 대안 앱 스토어들을 죽일 것이라고 반대 입장을 표명</li>
<li class="ms-6 text-pretty" data-v-09555c0e>F-Droid는 약 15년간 운영되어 온 Android용 자유 오픈소스 소프트웨어(FOSS)의 최대 제공처로, Play Store를 통하지 않고 APK를 수동으로 사이드로드하는 방식으로 운영됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Google은 보안을 명목으로 모든 Android 앱 개발자들이 앱과 신원을 Google에 등록하도록 강제할 계획을 발표</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Google의 검증을 받지 않은 앱은 향후 인증된 Android 기기에서 설치할 수 없게 되며, 중국 외 거의 모든 Android 기기가 Google 서비스를 사용하므로 사실상 Google이 Android 소프트웨어 설치를 통제하게 됨</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Google은 실명제가 악성코드 발생률을 줄인다고 주장하지만, F-Droid는 Play Store에도 악성 앱이 존재한다는 점을 들어 이 방식이 사이드로딩 위험을 실제로 제거하지 못할 것이라고 반박</li>
<li class="ms-6 text-pretty" data-v-09555c0e>F-Droid는 추적이나 침해적 광고를 허용하지 않으며, 소스코드를 검증한 후 직접 컴파일하는 방식으로 운영되어 개발자들에게 Google 등록을 요구할 수도, 앱 식별자를 대신 등록할 수도 없다고 설명</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이러한 대안은 개발자들로부터 배포권을 빼앗는 것과 같아 F-Droid의 운영 방식과 근본적으로 충돌한다고 지적</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://www.malwarebytes.com/blog/news/2025/09/apple-fixes-critical-font-processing-bug-update-now?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">Apple fixes critical font processing bug. Update now!</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Apple이 macOS/iOS/iPadOS의 폰트 처리 시스템인 <strong class="font-bold dark:font-extrabold">FontParser의 중대한 보안 취약점(CVE-2025-43400)</strong>을 수정하는 보안 업데이트를 긴급 배포함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이 취약점은 Apple 내부에서 발견되었으며, 공격자가 악성 폰트 파일을 제작하여 <strong class="font-bold dark:font-extrabold">앱 충돌이나 프로세스 메모리 손상을 유발</strong>하고, 최악의 경우 <strong class="font-bold dark:font-extrabold">임의 코드 실행</strong>까지 가능하게 함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Apple은 현재 실제 공격 사례를 확인하지 못했다고 밝혔지만, 과거 유사한 버그가 <strong class="font-bold dark:font-extrabold">탈옥 및 스파이웨어 공격에 악용</strong>된 사례가 있어 신속한 패치를 권장함</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">기술적 세부사항</strong>: Out-of-bounds write 취약점으로, 공격자가 프로그램이 설정한 메모리 범위를 벗어나 읽기/쓰기를 수행할 수 있어 시스템 권한으로 악성 코드 실행이 가능함</li>
<li class="ms-6 text-pretty" data-v-09555c0e>폰트 파일은 일상적으로 앱과 웹사이트에서 사용되며 백그라운드에서 처리되기 때문에, <strong class="font-bold dark:font-extrabold">폰트 취약점은 공격자에게 중요한 공격 벡터</strong>가 될 수 있음</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">업데이트 대상 기기 및 버전</strong>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>iOS/iPadOS: 26.0.1 (iPhone 11 이상), 18.7.1 (iPhone XS 이상)</li>
<li class="ms-6 text-pretty" data-v-09555c0e>macOS: Tahoe 26.0.1, Sequoia 15.7.1, Sonoma 14.8.1</li>
<li class="ms-6 text-pretty" data-v-09555c0e>기타: visionOS 26.0.1, watchOS 26.0.2, tvOS 26.0.1</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e>iPhone/iPad 업데이트: <strong class="font-bold dark:font-extrabold">설정 &gt; 일반 &gt; 소프트웨어 업데이트</strong>로 이동하여 확인 및 설치, 자동 업데이트 활성화 권장</li>
<li class="ms-6 text-pretty" data-v-09555c0e>macOS 업데이트: <strong class="font-bold dark:font-extrabold">Apple 메뉴 &gt; 시스템 설정(또는 시스템 환경설정) &gt; 일반 &gt; 소프트웨어 업데이트</strong>에서 업데이트 확인 및 설치</li>
<li class="ms-6 text-pretty" data-v-09555c0e>Apple Watch/Apple TV도 각각 해당 앱 또는 설정 메뉴를 통해 소프트웨어 업데이트 가능</li>
</ul>
</li>
</ul>
</li>
<li class="ms-6 text-pretty" data-v-09555c0e><a href="https://github.com/google/mozc-devices?utm_source=blog.update.sh&amp;utm_medium=content" rel="noopener noreferrer" target="_blank" class="text-teal-600 underline hover:text-teal-500 dark:text-teal-400 dark:hover:text-teal-300">GitHub - google/mozc-devices: Circuit diagrams and firmware source code for Gboard DIY keyboards</a>
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>요약
<ul class="my-2 list-outside list-disc">
<li class="ms-6 text-pretty" data-v-09555c0e>Gboard DIY 키보드의 <strong class="font-bold dark:font-extrabold">회로도 및 펌웨어 소스 코드</strong>를 제공하는 저장소</li>
<li class="ms-6 text-pretty" data-v-09555c0e>이전에는 <strong class="font-bold dark:font-extrabold">Google Japanese Input / Gboard April Fools</strong>로 알려져 있었음</li>
<li class="ms-6 text-pretty" data-v-09555c0e><strong class="font-bold dark:font-extrabold">공식적으로 지원되는 Google 제품이 아님</strong></li>
<li class="ms-6 text-pretty" data-v-09555c0e>각 디렉토리의 README 파일에서 세부 정보를 확인할 수 있음</li>
</ul>
</li>
</ul>
</li>
</ul></div>]]></content>
        <author>
            <name>Nesswit</name>
            <email>rishubil+blog@gmail.com</email>
            <uri>https://blog.update.sh/about</uri>
        </author>
    </entry>
</feed>