<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>폴리프레임</title>
    <link>https://polyframe.tistory.com/</link>
    <description>Coding ... 쉽게 접근하지만 막상 지식이 늘면서, 개념은 혼돈되는 경우가 다반사입니다. 이럴 때마다, 개념을 정리해두고 후에 쉽게 참고하고자 정리해봅니다.</description>
    <language>ko</language>
    <pubDate>Tue, 7 Jul 2026 10:20:31 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>폴리프레임</managingEditor>
    <image>
      <title>폴리프레임</title>
      <url>https://tistory1.daumcdn.net/tistory/6341293/attach/de04d3a13f3040ff8fdd09b80f5a12fa</url>
      <link>https://polyframe.tistory.com</link>
    </image>
    <item>
      <title>Public Domain Licence, MIT License</title>
      <link>https://polyframe.tistory.com/254</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;Public Domain License와 MIT License는 모두 소프트웨어의 자유로운 사용, 수정 및 배포를 허용하는 라이선스이지만, 몇 가지 중요한 차이점이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Public Domain License (퍼블릭 도메인 라이선스)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;5:1-5:170&quot;&gt;&lt;b&gt;저작권 포기:&lt;/b&gt; 퍼블릭 도메인은 저작권자가 자신의 저작물에 대한 모든 권리를 포기하고 이를 공중에게 기증하는 것을 의미합니다. 따라서 퍼블릭 도메인으로 배포된 소프트웨어는 누구든지 어떤 목적으로든 자유롭게 사용, 수정 및 배포할 수 있으며, 별도의 라이선스 조항이나 저작권 표시 의무가 없습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;6:1-7:0&quot;&gt;&lt;b&gt;법적 불확실성:&lt;/b&gt; 일부 국가에서는 저작권자가 명시적으로 저작물을 퍼블릭 도메인으로 양도하는 것이 법적으로 인정되지 않을 수 있습니다. 이 때문에 퍼블릭 도메인과 유사한 효과를 내기 위해 별도의 퍼블릭 도메인 유사 라이선스(예: CC0)가 사용되기도 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MIT License&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;10:1-10:112&quot;&gt;&lt;b&gt;허용적 라이선스:&lt;/b&gt; MIT 라이선스는 대표적인 허용적(permissive) 오픈소스 라이선스 중 하나입니다. 이는 소프트웨어의 사용, 수정, 배포 및 상업적 이용을 거의 제한 없이 허용합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;11:1-11:84&quot;&gt;&lt;b&gt;고지 의무:&lt;/b&gt; MIT 라이선스의 주요 조건은 소프트웨어를 복제하거나 배포할 때 저작권 표시와 MIT 라이선스 전문을 포함해야 한다는 것입니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;12:1-13:0&quot;&gt;&lt;b&gt;면책 조항:&lt;/b&gt; MIT 라이선스는 소프트웨어에 대한 어떠한 보증도 제공하지 않으며, 소프트웨어 사용으로 인해 발생하는 문제에 대해 저작자나 배포자가 책임을 지지 않는다는 면책 조항을 포함합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주요 차이점&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.1705%;&quot;&gt;특징&lt;/td&gt;
&lt;td style=&quot;width: 43.3333%;&quot;&gt;Public Domain License&lt;/td&gt;
&lt;td style=&quot;width: 44.4961%;&quot;&gt;MIT License&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.1705%;&quot;&gt;저작권&lt;/td&gt;
&lt;td style=&quot;width: 43.3333%;&quot;&gt;저작권자가 모든 권리 포기&lt;/td&gt;
&lt;td style=&quot;width: 44.4961%;&quot;&gt;저작권은 유지되나, 넓은 범위의 사용 권한을 허용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.1705%;&quot;&gt;고지 의무&lt;/td&gt;
&lt;td style=&quot;width: 43.3333%;&quot;&gt;없음&lt;/td&gt;
&lt;td style=&quot;width: 44.4961%;&quot;&gt;저작권 표시 및 라이선스 전문 포함 의무 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.1705%;&quot;&gt;법적 확실성&lt;/td&gt;
&lt;td style=&quot;width: 43.3333%;&quot;&gt;일부 국가에서 법적 효력이 불확실할 수 있음&lt;/td&gt;
&lt;td style=&quot;width: 44.4961%;&quot;&gt;비교적 명확하고 널리 인정됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.1705%;&quot;&gt;책임 제한&lt;/td&gt;
&lt;td style=&quot;width: 43.3333%;&quot;&gt;일반적으로 명시적인 면책 조항 없음 (법률에 따라 해석)&lt;/td&gt;
&lt;td style=&quot;width: 44.4961%;&quot;&gt;명시적인 면책 조항 포함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT 일반</category>
      <category>MIT license</category>
      <category>public domain license</category>
      <author>폴리프레임</author>
      <guid isPermaLink="true">https://polyframe.tistory.com/254</guid>
      <comments>https://polyframe.tistory.com/254#entry254comment</comments>
      <pubDate>Fri, 16 May 2025 09:38:48 +0900</pubDate>
    </item>
    <item>
      <title>WiFiManger web server 코드 와 html 문서 처리</title>
      <link>https://polyframe.tistory.com/253</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;index.h&lt;/p&gt;
&lt;pre id=&quot;code_1747280724697&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const char index_html[] PROGMEM = R&quot;rawliteral(&amp;lt;html&amp;gt;...&amp;lt;/html&amp;gt;)rawliteral&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;esp32_wm_server.ino&lt;/p&gt;
&lt;pre id=&quot;code_1747280900264&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;WiFiManager.h&amp;gt;
#include &amp;lt;ESPAsyncWebServer.h&amp;gt;
#include &amp;lt;DNSServer.h&amp;gt;
#include &amp;lt;ESPmDNS.h&amp;gt;
#include &amp;lt;Update.h&amp;gt;

#include &quot;index.h&quot;

const char* http_username = &quot;username&quot;; // 웾 접속 용
const char* http_password = &quot;password&quot;; // 웹 접속 용

AsyncWebServer server(80);    // Create an instance of the AsyncWebServer

int nCounter;

void notFound(AsyncWebServerRequest *request) {
  request-&amp;gt;send(404, &quot;text/plain&quot;, &quot;Not found&quot;);
}

void setup() {
    pinMode(LED_BUILTIN, OUTPUT);

    WiFi.mode(WIFI_STA); // explicitly set mode, esp defaults to STA+AP

    // put your setup code here, to run once:
    Serial.begin(115200);
    
    //WiFiManager, Local intialization. Once its business is done, there is no need to keep it around
    WiFiManager wm;
    //wm.resetSettings();

    bool res;
    // res = wm.autoConnect(); // auto generated AP name from chipid
    // res = wm.autoConnect(&quot;AutoConnectAP&quot;); // anonymous ap
    res = wm.autoConnect(&quot;AutoConnectAP&quot;,&quot;password&quot;); // password protected ap

    if(!res) {
        Serial.println(&quot;Failed to connect&quot;);
        // ESP.restart();
    } 
    else {
        Serial.println(&quot;connected...yeey :)&quot;);
    }

    server.on(&quot;/&quot;, HTTP_GET, [](AsyncWebServerRequest * request) {
    if (!request-&amp;gt;authenticate(http_username, http_password))
      return request-&amp;gt;requestAuthentication();
    request-&amp;gt;send_P(200, &quot;text/html&quot;, index_html, NULL);
  });
  
    server.on(&quot;/adc_value&quot;, HTTP_GET, [](AsyncWebServerRequest * request) {
    nCounter ++;
    request-&amp;gt;send(200, &quot;text/html&quot;, String(nCounter));
  });

      server.on(&quot;/led_toggle&quot;, HTTP_GET, [](AsyncWebServerRequest * request) {
    Serial.println(&quot;LED Toggled!!!&quot;);
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
    request-&amp;gt;send(200, &quot;text/html&quot;, &quot;&quot;);
  });

  server.on(&quot;/get&quot;, HTTP_GET, [] (AsyncWebServerRequest * request) {
    String inputMessage;
    String inputParam;

    Serial.println(inputMessage);
    request-&amp;gt;send(200, &quot;text/html&quot;, index_html);
  });
  server.onNotFound(notFound);
  server.begin();
}

void loop() {

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;const char index_html[] &lt;/b&gt;: index.html은 문자열 배열호 선언되었음. 이를 통해 HTML 코드가 저장되었음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PROGRAM &lt;/b&gt;: PROGMEM은 AVR 기반 마이크로컨트롤러(예: ESP8266, ESP32)에서&amp;nbsp;플래시 메모리에 데이터를 저장하도록 하는 키워드입니다. &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;기본적으로 문자열은 RAM에 저장되지만, PROGMEM을 사용하면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;플래시 메모리에 저장&lt;/b&gt;되어 RAM 사용량을 줄일 수 있습니다. esp32 에는 RAM(SRAM)은 320KB~520KB 제공, Flash Memory는 4 MB ~ 1MB 제공&lt;/li&gt;
&lt;li&gt;&lt;b&gt;R&quot;rawliteral(...)&quot;rawliteral&quot; &lt;/b&gt;: Raw String Literal이라는 문법입니다. &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;일반적으로 문자열을 정의할 때 &quot;문자열&quot;처럼&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;따옴표&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;를 사용하지만, HTML 코드에는 &quot;나 \ 같은 특수문자가 많아&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;이스케이프(escape) 처리&lt;/b&gt;가 필요합니다. 그러나, &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;R&quot;rawliteral(...)rawliteral&quot;을 사용하면 HTML 코드를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;그대로 저장&lt;/b&gt;할 수 있어 가독성이 높아집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IoT</category>
      <category>r&amp;quot;rawliteral</category>
      <category>WifiManager</category>
      <author>폴리프레임</author>
      <guid isPermaLink="true">https://polyframe.tistory.com/253</guid>
      <comments>https://polyframe.tistory.com/253#entry253comment</comments>
      <pubDate>Thu, 15 May 2025 13:12:39 +0900</pubDate>
    </item>
    <item>
      <title>nth-child(5n + 5) 패턴 해석</title>
      <link>https://polyframe.tistory.com/252</link>
      <description>&lt;pre id=&quot;code_1747112266814&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#sec .dot:nth-child(5n + 5) { 
  width:20px; 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드는 sec ID를 갖은 요소안에는 많은 요소가 있습니다. 그 중에&amp;nbsp; dot 클라스들에서 5번째 단위로 골라 폭을 20px 로 만들라는 명령어 입니다. 여기서 ()안을 방정식으로 생각하고, n을 0 번부터 계속된다고 보면 됩니다. 즉 5X0 + 5 는 5, 5x1 + 5 = 10 이러한 방식으로 5의 배수를 선택하라는 명령입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1747112762399&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* 목록의 두 번째 &amp;lt;li&amp;gt; 선택 */
li:nth-child(2) {
  color: lime;
}

/* 임의의 그룹에서 네 번째에 위치하는 모든 요소 선택 */
:nth-child(4n) {
  color: lime;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>html + css</category>
      <category>nth-child()</category>
      <category>nth-child(5n + 5)</category>
      <author>폴리프레임</author>
      <guid isPermaLink="true">https://polyframe.tistory.com/252</guid>
      <comments>https://polyframe.tistory.com/252#entry252comment</comments>
      <pubDate>Tue, 13 May 2025 14:07:34 +0900</pubDate>
    </item>
    <item>
      <title>~ (틸트)선택자 , + 선택자 활용</title>
      <link>https://polyframe.tistory.com/251</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;~&amp;nbsp;(틸트)선택자&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;CSS에서 ~(틸드)는 &lt;b&gt;일반 형제(General Sibling) 선택자&lt;/b&gt;입니다. 즉, 특정 요소의 &lt;b&gt;같은 부모를 가진 형제 요소들 중에서, 뒤에 위치한 요소들만 선택&lt;/b&gt;하는 역할을 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1747111807216&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#dots .active.dot ~ .dot {
    background: #555;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;#dots 내부에서 .active.dot 클래스를 가진 요소 &lt;b&gt;뒤에 위치하는 모든 .dot 요소&lt;/b&gt;를 선택하여 background: #555; 스타일을 적용합니다. 즉, 다음 줄 요소들 중에 dot 클래스를 갖은 모든 요소.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;+&amp;nbsp;선택자&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인접 형제 선택자로 뒤에 바로 붙어 있는 .dot 한 개만 적용 됨&lt;/p&gt;
&lt;pre id=&quot;code_1747111997034&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.active.dot + .dot { background: #555; }&lt;/code&gt;&lt;/pre&gt;</description>
      <category>html + css</category>
      <category>+ 선택자</category>
      <category>~ 선택자</category>
      <author>폴리프레임</author>
      <guid isPermaLink="true">https://polyframe.tistory.com/251</guid>
      <comments>https://polyframe.tistory.com/251#entry251comment</comments>
      <pubDate>Tue, 13 May 2025 13:55:11 +0900</pubDate>
    </item>
    <item>
      <title>var(--clr) 전역사용, 개별사용</title>
      <link>https://polyframe.tistory.com/250</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;전역사용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 경우는 모든 요소에서 활용는 되는 경우입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1747106306892&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;:root {
    --clr: #ff2972; /* 모든 요소에 적용할 색상 */
}

#clock div {
    color: var(--clr);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;개별사용&lt;/h3&gt;
&lt;pre id=&quot;code_1747106640211&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; &amp;lt;div id=&quot;clock&quot;&amp;gt;
        &amp;lt;div id=&quot;hr&quot; style=&quot;--clr:#ff2972;&quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div id=&quot;min&quot; style=&quot;--clr:#fee800;&quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div id=&quot;sec&quot; style=&quot;--clr:#04fc43;&quot;&amp;gt;&amp;lt;/div&amp;gt; 
 &amp;lt;/div&amp;gt;
 
 ** css **
#sec,
#min,
#hr { 
    position: absolute;
    display: flex;
    justify-content: center;
    align-items: center;
    inset: 0;
    text-align: center;

    color: var(--clr);
}
// 이 경우는 --clr은 개별 3가지 객상으로 분리되어 사용이 됩니다.&lt;/code&gt;&lt;/pre&gt;</description>
      <category>html + css</category>
      <category>var()</category>
      <category>var(--clr)</category>
      <author>폴리프레임</author>
      <guid isPermaLink="true">https://polyframe.tistory.com/250</guid>
      <comments>https://polyframe.tistory.com/250#entry250comment</comments>
      <pubDate>Tue, 13 May 2025 12:25:45 +0900</pubDate>
    </item>
    <item>
      <title>normalize.css 와 CssBaseline</title>
      <link>https://polyframe.tistory.com/249</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;normalize.css&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브라우저 기본 스타일을 정리하여 모든 브라우저에서 일관된 스타일을 제공하는 css 파일 입니다.&lt;/li&gt;
&lt;li&gt;기본적으로 HTML 요소의 스타일을 조정하여 브라우저 간 차이를 줄입니다.&lt;/li&gt;
&lt;li&gt;예를 들어, &amp;lt;h1&amp;gt; 태그의 크기나 &amp;lt;button&amp;gt;의 기본 스타일을 통일하는 역할을 합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;HTML5 요소 지원 ( &amp;lt;main&amp;gt;, &amp;lt;article&amp;gt; )&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;활용 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. CDN을 사용하여 적용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML 의 &amp;lt;head&amp;gt; 태그 안에 다음 코드를 추가 하면, 별도의 다운로드없이 온라인으로 최신버전을 바로 사용할 수 있음&lt;/p&gt;
&lt;pre id=&quot;code_1747020095347&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.min.css&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 프로젝트에 직접 다운로드하여 적용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식 사이트에서 normalize.css 파일을 다운호드하여 프로젝트의 css 폴더에 저장한 후, HTML에서 불러옵니다.&lt;/p&gt;
&lt;pre id=&quot;code_1747020282326&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;css/normalize.css&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;MUI의 CssBaseline&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Material UI에서 제공하는 CSS 리셋 컴포넌트입니다.&lt;/li&gt;
&lt;li&gt;normalize.css와 유사하지만, &lt;b&gt;Material UI 디자인 시스템에 맞춰 추가적인 스타일을 적용&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li&gt;모든 브라우저에서 &amp;lt;body&amp;gt;의 기본 마진 제거&lt;/li&gt;
&lt;li&gt;폰트 스무딩 적용, 박스 모델 통일 (box-sizing: border-box;) 등 MUI 제공 컴포넌트 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;활용 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. CssBaseline 을 활용하려면 MUI 라이브러리를 가져와야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1747020859640&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import CssBaseline from '@mui/material/CssBaseline';

function MyApp() {
  return (
    &amp;lt;&amp;gt;
      &amp;lt;CssBaseline /&amp;gt;
      {/* 나머지 애플리케이션 코드 */}
    &amp;lt;/&amp;gt;
  );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 주로 Vite React 프로젝트에서는 main.jsx 에 설치하는 것을 추천합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1747020948043&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import App from './App.jsx'
import { CssBaseline } from '@mui/material'

import '@fontsource/roboto/300.css';
import '@fontsource/roboto/400.css';
import '@fontsource/roboto/500.css';
import '@fontsource/roboto/700.css';

createRoot(document.getElementById('root')).render(
  &amp;lt;StrictMode&amp;gt;
    &amp;lt;CssBaseline /&amp;gt;
    &amp;lt;App /&amp;gt;
  &amp;lt;/StrictMode&amp;gt;,
)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>html + css</category>
      <category>cssbaseline</category>
      <category>normalize.css</category>
      <author>폴리프레임</author>
      <guid isPermaLink="true">https://polyframe.tistory.com/249</guid>
      <comments>https://polyframe.tistory.com/249#entry249comment</comments>
      <pubDate>Mon, 12 May 2025 12:37:53 +0900</pubDate>
    </item>
    <item>
      <title>URL 클래스, URL.createObjectURL()</title>
      <link>https://polyframe.tistory.com/248</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Methods&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. URL.createObjectURL(blob)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저 환경에서 Blob 객체나 File 객체를 나타내는 임시 URL을 생성하는 데 사용됩니다. 이를 통해 바이너리 데이터를 직접 표시하거나 다운로드할 수 있는 URL을 만들 수 있습니다. 이 URL은 메모리에 존재하며, 브라우저를 닫거나 명시적으로 해제하지 않는 한 유효합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1739094241617&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const inputElement = document.querySelector('input[type=&quot;file&quot;]');

inputElement.addEventListener('change', (event) =&amp;gt; {
  const file = (event.target as HTMLInputElement).files?.[0];
  if (file) {
    const objectURL = URL.createObjectURL(file);
    console.log(objectURL); // 생성된 URL 출력
    
    // 예: 이미지를 미리보기로 표시
    const img = document.createElement('img');
    img.src = objectURL;
    document.body.appendChild(img);
  }
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. URL.revokeObjectURL(url): 생성된 임시 URL을 해제하여 메모리를 반환합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1739094402640&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;URL.revokeObjectURL(objectURL);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. toString(): URL의 문자열 표현을 반환합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1739094458484&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(url.toString()); // 'https://example.com/path?name=JohnDoe&amp;amp;age=25#section2'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4. toJSON(): URL의 JSON 표현을 반환합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1739094559732&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(url.toJSON()); // 'https://example.com/path?name=JohnDoe&amp;amp;age=25#section2'
// url.href 와 동일&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Properties&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. href: 전체 URL 문자열을 반환하거나 설정합니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739093305866&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const url = new URL('https://example.com/path?name=JohnDoe&amp;amp;age=25#section2');
console.log(url.href); // 'https://example.com/path?name=JohnDoe&amp;amp;age=25#section2'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. protocol: URL의 프로토콜을 반환하거나 설정합니다 (예: http:, https:)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739093363917&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(url.protocol); // 'https:'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. host: URL의 호스트(포트 번호 포함)를 반환하거나 설정합니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739093410645&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(url.host); // 'example.com'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. hostname: 포트를 제외한 호스트 이름을 반환하거나 설정합니다. &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739093441433&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(url.hostname); // 'example.com'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. port: URL의 포트 번호를 반환하거나 설정합니다. &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739093468537&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(url.port); // ''&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6. pathname: URL의 경로를 반환하거나 설정합니다. &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739093498774&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(url.pathname); // '/path'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;7. search: URL의 쿼리 문자열을 반환하거나 설정합니다 (시작 ? 포함). &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739093529969&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(url.search); // '?name=JohnDoe&amp;amp;age=25'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;8. hash: URL의 해시(# 뒤에 오는 부분)를 반환하거나 설정합니다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739093582668&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(url.hash); // '#section2' 
// #section2 부분을 나타내며, 페이지 내 특정 위치를 지정합니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <category>url</category>
      <category>url methods</category>
      <category>url properties</category>
      <category>url.createobjecturl()</category>
      <author>폴리프레임</author>
      <guid isPermaLink="true">https://polyframe.tistory.com/248</guid>
      <comments>https://polyframe.tistory.com/248#entry248comment</comments>
      <pubDate>Sun, 9 Feb 2025 18:54:58 +0900</pubDate>
    </item>
    <item>
      <title>콜론 - 단일 콜론, 이중 콜론</title>
      <link>https://polyframe.tistory.com/247</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;단일 콜론 (:)&lt;/b&gt; - &lt;b&gt;의사 클래스 (pseudo-class)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;b&gt;- 의사 클래스는 요소의 특정 상태&lt;/b&gt;를 나타내는 데 사용됩니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;- 예를 들어, :hover는 마우스 커서를 요소 위에 올렸을 때의 상태를 나타냅니다. 일반적으로 의사 클래스는 요소가 특정 상태에 있을 때 스타일을 적용하는 데 사용됩니다. 즉, &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;a:hover는 링크 요소에 마우스를 올렸을 때 스타일을 적용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;이중 콜론 (::)&lt;/b&gt; - &lt;b&gt;의사 요소 (pseudo-element)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;b&gt;- 의사 요소는 요소의 특정 부분을 스타일링&lt;/b&gt;하는 데 사용됩니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;- 예를 들어, ::before는 요소의 시작 부분에 콘텐츠를 삽입하고, ::placeholder는 입력 요소의 자리 표시자 텍스트를 스타일링합니다. 즉, &lt;/span&gt;&lt;span style=&quot;font-size: 16px; letter-spacing: 0px;&quot;&gt;&amp;nbsp;input::placeholder는 입력 필드의 자리 표시자 텍스트의 스타일을 정의합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;한 가지 중요한 점은, CSS3 이전에는 의사 요소도 단일 콜론을 사용했지만, CSS3부터는 의사 클래스와 의사 요소를 구분하기 위해 이중 콜론을 사용하기로 정해졌습니다. 따라서 최신 표준을 따르는 것이 좋습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>html + css</category>
      <category>:</category>
      <category>::</category>
      <category>단일 콜론</category>
      <category>더블콜론</category>
      <category>이중 콜론</category>
      <category>콜론</category>
      <author>폴리프레임</author>
      <guid isPermaLink="true">https://polyframe.tistory.com/247</guid>
      <comments>https://polyframe.tistory.com/247#entry247comment</comments>
      <pubDate>Tue, 28 Jan 2025 10:55:35 +0900</pubDate>
    </item>
    <item>
      <title>dark mode, light mode  설정 ( 윈도우 )</title>
      <link>https://polyframe.tistory.com/245</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 설정 열기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 윈도우 키 + I 로 설정을 열기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 개인 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 선택 창에서 개인 설정을 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 색&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 왼쪽 메뉴에서 색을 클릭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 색 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 색 모드 선택에서 라이트 또는 다크 모드를 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;활용&lt;/p&gt;
&lt;pre id=&quot;code_1736310969400&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@media (prefers-color-scheme: light) { 
	:root { 
      color: #213547; 
      background-color: #ffffff; 
     } 
    a:hover {
      color: #747bff; 
    } 
    button { 
      background-color: #f9f9f9; 
    } 
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT 일반</category>
      <category>dark mode light mode</category>
      <category>mode setting</category>
      <category>모드 셋팅</category>
      <author>폴리프레임</author>
      <guid isPermaLink="true">https://polyframe.tistory.com/245</guid>
      <comments>https://polyframe.tistory.com/245#entry245comment</comments>
      <pubDate>Wed, 8 Jan 2025 13:34:04 +0900</pubDate>
    </item>
    <item>
      <title>FontLoader()</title>
      <link>https://polyframe.tistory.com/244</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;FontLoader()는 Three.js에서 폰트 파일을 로드하여 3D 텍스트를 생성할 수 있게 해주는 로더입니다. 폰트 파일은 보통 JSON 형식으로 저장됩니다. Three.js의 typeface.js 예제에서 폰트 파일을 다운로드할 수 있습니다. 사용 예제는 아래와 같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1736309609433&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const loader = new THREE.FontLoader();
loader.load('path/to/your/font.json', function (font) {
  // 폰트 로딩 후 텍스트 생성
  const textGeometry = new THREE.TextGeometry('Hello, World!', {
    font: font,
    size: 80,
    height: 5,
    curveSegments: 12,
    bevelEnabled: true,
    bevelThickness: 10,
    bevelSize: 8,
    bevelOffset: 0,
    bevelSegments: 5
  });

  const textMaterial = new THREE.MeshBasicMaterial({ color: 0xff0000 });
  const textMesh = new THREE.Mesh(textGeometry, textMaterial);
  scene.add(textMesh);
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;TextGeometry&lt;/b&gt;를 생성할 때 여러 가지 옵션을 설정할 수 있습니다:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;font&lt;/b&gt;: 로드된 폰트 객체&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;size&lt;/b&gt;: 텍스트 크기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;height&lt;/b&gt;: 텍스트의 깊이&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;curveSegments&lt;/b&gt;: 텍스트 곡선의 세그먼트 수&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;bevelEnabled&lt;/b&gt;: 텍스트의 베벨(경사) 여부&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;bevelThickness&lt;/b&gt;: 베벨의 두께&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;bevelSize&lt;/b&gt;: 베벨의 크기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;bevelOffset&lt;/b&gt;: 베벨의 오프셋&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;bevelSegments&lt;/b&gt;: 베벨의 세그먼트 수&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주의사항&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;폰트 파일 경로가 올바른지 확인하세요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;로드된 폰트를 사용하는 TextGeometry 옵션들을 잘 설정하세요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;텍스트의 크기와 위치를 조절하여 씬에서 적절히 배치하세요.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>three.js</category>
      <category>fontloader</category>
      <category>three.fontloader()</category>
      <author>폴리프레임</author>
      <guid isPermaLink="true">https://polyframe.tistory.com/244</guid>
      <comments>https://polyframe.tistory.com/244#entry244comment</comments>
      <pubDate>Wed, 8 Jan 2025 13:16:49 +0900</pubDate>
    </item>
  </channel>
</rss>