<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Rlog</title>
    <link>https://devroach.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 7 Apr 2026 18:01:50 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>dev_roach</managingEditor>
    <image>
      <title>Rlog</title>
      <url>https://tistory1.daumcdn.net/tistory/4009590/attach/35ef7a1ad8dd48349b5ed1a1759b2aa9</url>
      <link>https://devroach.tistory.com</link>
    </image>
    <item>
      <title>Calculas) Limit</title>
      <link>https://devroach.tistory.com/196</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Limit&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\lim_{x \to a} f(x) = L$$&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;x&lt;/b&gt; 가 &lt;b&gt;a&lt;/b&gt; 로 접근할때 f&lt;b&gt;(x)&lt;/b&gt; 의 극한은 &lt;b&gt;L&lt;/b&gt;&amp;nbsp;이다.&lt;/li&gt;
&lt;li&gt;이 뜻은 x&lt;b&gt; 가 정확히 a 라는 뜻&lt;/b&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;b&gt;좌극한(left-hand limit)&lt;/b&gt;: x 가 a 보다 작은 값을 가지면서 a 에 가까워지는 경우
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$$\lim_{x \to a^-} f(x) = L$$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;우극한(right-hand limit)&lt;/b&gt;: x 가 a 보다 큰 값을 가지면서 a 에 가까워지는 경우
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$$\lim_{x \to a^+} f(x) = L$$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;어떤 점(a) 에서 극한값이 존재하기 위해서는 좌극한, 우극한 값이 동일해야 함.&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;$$\lim_{x&amp;nbsp;\to&amp;nbsp;\infty}&amp;nbsp;\frac{x^2&amp;nbsp;+&amp;nbsp;1}{2x^2&amp;nbsp;+&amp;nbsp;1}&amp;nbsp;=&amp;nbsp;\lim_{x&amp;nbsp;\to&amp;nbsp;\infty}&amp;nbsp;\frac{1&amp;nbsp;+&amp;nbsp;\frac{1}{x^2}}{2&amp;nbsp;+&amp;nbsp;\frac{1}{x^2}}&amp;nbsp;=&amp;nbsp;\frac{1&amp;nbsp;+&amp;nbsp;0}{2&amp;nbsp;+&amp;nbsp;0}&amp;nbsp;=&amp;nbsp;\frac{1}{2}$$&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;고등 수학때가 떠오르는데 유리함수의 극한을 풀때는 보통&amp;nbsp;&lt;b&gt;분모의 최고차항&lt;/b&gt;으로 나눠서 푸는걸 확인할 수 있다.&lt;/p&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;$$\lim_{x \to a} [c f(x)] = c \lim_{x \to a} f(x) (단, c 는 상수)$$&lt;/li&gt;
&lt;li&gt;$$\lim_{x&amp;nbsp;\to&amp;nbsp;a}&amp;nbsp;[f(x)&amp;nbsp;\pm&amp;nbsp;g(x)]&amp;nbsp;=&amp;nbsp;\lim_{x&amp;nbsp;\to&amp;nbsp;a}&amp;nbsp;f(x)&amp;nbsp;\pm&amp;nbsp;\lim_{x&amp;nbsp;\to&amp;nbsp;a}&amp;nbsp;g(x)$$&lt;/li&gt;
&lt;li&gt;$$\lim_{x&amp;nbsp;\to&amp;nbsp;a}&amp;nbsp;[f(x)&amp;nbsp;g(x)]&amp;nbsp;=&amp;nbsp;\lim_{x&amp;nbsp;\to&amp;nbsp;a}&amp;nbsp;f(x)&amp;nbsp;\cdot&amp;nbsp;\lim_{x&amp;nbsp;\to&amp;nbsp;a}&amp;nbsp;g(x)$$&lt;/li&gt;
&lt;li&gt;$$\lim_{x \to a} \frac{f(x)}{g(x)} = \frac{\lim_{x \to a} f(x)}{\lim_{x \to a} g(x)} (단, $\lim_{x \to a} g(x) \neq 0)$$&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;극한의 연속성(continuos)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;극한의 연속성은 아래와 같은 성질을 만족하여야 한다. 연속성은 어떤 성질을 지니기에 이런 정의까지 있을까? 머신러닝을 공부하기 위해 수학을 다시 공부했던 나로서는 연속성은 &lt;b&gt;예측가능성&lt;/b&gt;을 어느정도 보여준다고 생각한다. 중간에 값이 끊기지 않고, 일정한 형태로 흐름이 존재하는 것이므로 예측 가능성을 어느정도 보장해준다고 생각한다. 이것이 이해가 안간다면 불연속적인 특정 부분에서 확확 튀는 것을 생각해보면 쉽다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;f(a) 가 존재한다 (함수 값이 존재해야 한다)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;lim (x to a) f(x) 일때 극한 값이 존재한다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt; lim (x to a) f(x) is equal to f(a)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Math</category>
      <author>dev_roach</author>
      <guid isPermaLink="true">https://devroach.tistory.com/196</guid>
      <comments>https://devroach.tistory.com/196#entry196comment</comments>
      <pubDate>Mon, 31 Mar 2025 11:10:06 +0900</pubDate>
    </item>
    <item>
      <title>Calculas 1</title>
      <link>https://devroach.tistory.com/195</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Function&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;y = f(x) 일때 &lt;b&gt;&quot;y 는 x 의 함수이다&quot;&lt;/b&gt; 라고 읽음. 여기서 x 는 &lt;b&gt;independent variable&lt;/b&gt; 또는 &lt;b&gt;input&lt;/b&gt; 이라고 읽는다. 그리고 y 는 &lt;b&gt;종속변수 (dependent variable)&lt;/b&gt; 또는 output 이라고 읽는다. 그 이유는 x 의 값에 따라 y 의 값이 변경되기 때문이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Domain, Codomain, Range&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Domain&lt;/b&gt;: 함수에 입력될 수 있는 모든 값의 집합&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Codomain&lt;/b&gt;: 함수에서 출력될 수 있는 후보 값들의 집합&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Range&lt;/b&gt;: 함수에서 실제로 출력되는 모든 값 들의 집합. 고로 Codomain 의 subset&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.주어진&amp;nbsp;함수가&amp;nbsp;다음과&amp;nbsp;같을&amp;nbsp;때,&amp;nbsp;$f(3)$,&amp;nbsp;$t(-1)$,&amp;nbsp;$(f&amp;nbsp;\circ&amp;nbsp;t)(0)$,&amp;nbsp;$(t&amp;nbsp;\circ&amp;nbsp;f)(2)$&amp;nbsp;의&amp;nbsp;값을&amp;nbsp;각각&amp;nbsp;구하시오. &lt;br /&gt;◦$f(x)&amp;nbsp;=&amp;nbsp;2x&amp;nbsp;+&amp;nbsp;1$ &lt;br /&gt;-&amp;nbsp;f(3)&amp;nbsp;=&amp;nbsp;7 &lt;br /&gt;-&amp;nbsp;$(f&amp;nbsp;\circ&amp;nbsp;t)(0)$&amp;nbsp;=&amp;nbsp;f(t(0))&amp;nbsp;=&amp;nbsp;f(-3)&amp;nbsp;=&amp;nbsp;f(-5) &lt;br /&gt;-&amp;nbsp;$t(x)&amp;nbsp;=&amp;nbsp;x^2&amp;nbsp;-&amp;nbsp;3$ &lt;br /&gt;-&amp;nbsp;t(-1)&amp;nbsp;=&amp;nbsp;-2 &lt;br /&gt;-&amp;nbsp;$(t&amp;nbsp;\circ&amp;nbsp;f)(2)$&amp;nbsp;=&amp;nbsp;t(f(2))&amp;nbsp;=&amp;nbsp;t(5)&amp;nbsp;=&amp;nbsp;22&amp;nbsp; &lt;br /&gt;&lt;br /&gt;2.주어진&amp;nbsp;두&amp;nbsp;함수&amp;nbsp;$h(x)&amp;nbsp;=&amp;nbsp;x&amp;nbsp;-&amp;nbsp;9$&amp;nbsp;와&amp;nbsp;$t(x)&amp;nbsp;=&amp;nbsp;\cos&amp;nbsp;x$&amp;nbsp;에&amp;nbsp;대해,&amp;nbsp;다음&amp;nbsp;합성&amp;nbsp;함수를&amp;nbsp;구하시오. &lt;br /&gt;◦$(f&amp;nbsp;\circ&amp;nbsp;t&amp;nbsp;\circ&amp;nbsp;h)(x)$,&amp;nbsp;여기서&amp;nbsp;$f(x)&amp;nbsp;=&amp;nbsp;x^2$&amp;nbsp;입니다. &lt;br /&gt;- f(t(h(x))) = f(t((x-9))) = f((cos (x - 9))) = (cos (x - 9))^2&lt;br /&gt;&lt;br /&gt;3.교재에 주어진 함수 $f(x) = \sqrt{x}$ 와 $t(x) = 3 - x$ 에 대해 합성 함수 $(f \circ t)(x)$ 의 정의역을 구하시오. (힌트: 루트 안의 값은 항상 0보다 크거나 같아야 합니다.) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f(t(x))&amp;nbsp;의&amp;nbsp;정의역을&amp;nbsp;구하라.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;f(x)&amp;nbsp;의&amp;nbsp;정의역&amp;nbsp;x&amp;nbsp;&amp;gt;=&amp;nbsp;0&amp;nbsp;(root&amp;nbsp;안이&amp;nbsp;0&amp;nbsp;보다&amp;nbsp;작을수&amp;nbsp;없으므로) &lt;br /&gt;-&amp;nbsp;t(x)&amp;nbsp;정의역이&amp;nbsp;별도로&amp;nbsp;없음 &lt;br /&gt;-&amp;nbsp;f(t(x))&amp;nbsp;는&amp;nbsp;sqrt{3&amp;nbsp;-&amp;nbsp;x}&amp;nbsp;가&amp;nbsp;되므로&amp;nbsp;3&amp;nbsp;-&amp;nbsp;x&amp;nbsp;&amp;gt;=&amp;nbsp;0&amp;nbsp;인게&amp;nbsp;정의역&amp;nbsp;즉&amp;nbsp;3&amp;nbsp;&amp;gt;=&amp;nbsp;x&amp;nbsp;인게&amp;nbsp;정의역이다.&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Math</category>
      <author>dev_roach</author>
      <guid isPermaLink="true">https://devroach.tistory.com/195</guid>
      <comments>https://devroach.tistory.com/195#entry195comment</comments>
      <pubDate>Mon, 31 Mar 2025 10:32:32 +0900</pubDate>
    </item>
    <item>
      <title>JS) Function</title>
      <link>https://devroach.tistory.com/194</link>
      <description>&lt;h1&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Function&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;함수란 일반적으로 프로그래밍 언어에서 다양한 의미가 있다. 예를들면, &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;함수형 언어에서는 함수가 정확한 수학적 의미&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;를 지니고 있으며, 준수해야할 엄격한 규칙의 집합이 된다. 우리는 JS 로 개발할때 우리는 함수보다 좀 더 포괄적인 개념인 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;프로시저&amp;rdquo;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 를 프로그램에 녹여내야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;문(Statement) 로 함수 선언&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Javascript 에서 함수를 선언하기 위해서는 아래와 같이 문으로 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;함수를 선언(declaration)&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;할수 있다.&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743327501573&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function add(a, b) {
    return a + b;
}

console.log(add(1, 2));&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;span style=&quot;color: #000000;&quot;&gt;식(Expression)&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 이 아니라 문(Statement) 이기 때문에 실행단계에서 선언부와 실제 함수 값이 연관되는 것이 아닌, 컴파일 단계에서 맺어진다. JS 는 함수형 프로그래밍을 지원하는 언어이기 때문에 식과 문을 구별하는 것은 꽤나 중요하다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;식(Expression) 으로 함수 선언&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그럼 반대로 식으로 함수를 할당당하는 방법을 알아보자. 식으로 함수를 할당할 수 있다는 건 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;특정 값(value) 로 평가가 가능&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하다는 것이다. 즉, 함수형 언어에서 함수 자체가 값으로 이용되게 하려면 함수를 값으로 할당이 가능해야 한다는 것이다. JS 에서는 아래와 같은 방법으로 식으로서 함수를 할당할수 있다.&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743327516281&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let f;

f = function(name) {
    return `Hello ${name}`;
}

console.log(f(&quot;Kyle&quot;)); // Hello Kyle&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;span style=&quot;color: #000000;&quot;&gt;식으로 할당 가능하다는 것은 생각해보면 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;실행 단계에서 f 와 함수 값의 연관이 이뤄짐&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;을 알 수 있다. 즉, 실행 단계를 진행하다보면 f 가 지닌 함수값이 아래와 같이 다른 함수값일 수도 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743327532131&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let f;

f = function(name) {
    return `Hello ${name}`;
}

console.log(f(&quot;Kyle&quot;)); // Hello Kyle

f = function(name) {
    return `Bye ${name}`;
}

console.log(f(&quot;Kyle&quot;)); // Bye Kyle&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <author>dev_roach</author>
      <guid isPermaLink="true">https://devroach.tistory.com/194</guid>
      <comments>https://devroach.tistory.com/194#entry194comment</comments>
      <pubDate>Sun, 30 Mar 2025 18:39:05 +0900</pubDate>
    </item>
    <item>
      <title>JS) Function scope / Block scope</title>
      <link>https://devroach.tistory.com/193</link>
      <description>&lt;h1&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Function scope / Block scope&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Javascript 에서는 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;function scope&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 와 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;block scope&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 가 있다. 이점이 살짝 다른 언어만 해오던 나에게는 익숙해지지 않았는데, 바로 아래와 같은 이유 때문이다.&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Function scope&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1743321481714&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var adult = true;

if (adult) {
    var myName = &quot;Kyle&quot;;
    let age = 39;
    console.log(&quot;Secret!&quot;);
}

console.log(myName); // Kyle
console.log(age); // ReferenceError: age is not defined&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위의 코드를 보면 if 블럭안에 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;var myName&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 을 선언하고 &amp;ldquo;Kyle&amp;rdquo; 이라는 값을 할당했음에도 if 블록의 바깥 영역에서 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;myName&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 에 접근이 가능하다. 그 이유는 var 이 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;function scope&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 를 따르기 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;function scope 는 쉽게말해 함수 안에서 유효한 값을 가지게 되는데 현재 위 코드에서는 함수가 아닌 if block 안에 들어있으므로 호이스팅에 의해 더 상위인 전역 스코프로 선언부가 올라가게 된다. 할당하는 부분은 그대로 이고 선언부만 올라가게 된다.&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743321546976&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Scope Test&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;Testing var Scope&amp;lt;/h1&amp;gt;
    &amp;lt;script&amp;gt;
        console.log(&quot;Script start&quot;);
        var adult = true;
        console.log(&quot;Before if:&quot;, typeof myName, myName);

        if (adult) {
            console.log(&quot;Inside if, before var:&quot;, typeof myName, myName);
            var myName = &quot;Kyle&quot;;
            let age = 39;
            console.log(&quot;Inside if, after var:&quot;, myName, age);
            console.log(&quot;Secret!&quot;);
        }

        console.log(&quot;After if:&quot;, myName);

        console.log(&quot;Script end&quot;); // 종료점 확인용
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;엔진이 이렇게 실제로 동작하는지 확인해보기 위해서는 브라우저의 디버거를 이용해보면 된다. 위 코드를 브라우저에 입력해보자.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;819&quot; data-origin-height=&quot;647&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxqMk4/btsM0OeyXSU/1BaXCy6miEuGdYKsrEV6I0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxqMk4/btsM0OeyXSU/1BaXCy6miEuGdYKsrEV6I0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxqMk4/btsM0OeyXSU/1BaXCy6miEuGdYKsrEV6I0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxqMk4%2FbtsM0OeyXSU%2F1BaXCy6miEuGdYKsrEV6I0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;602&quot; height=&quot;476&quot; data-origin-width=&quot;819&quot; data-origin-height=&quot;647&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;실제로 브라우저에서 디버깅을 해보면 myName 이 이미 undefined 처리되어 있음을 알수 있다. 즉, &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;선언부가 호이스팅되&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어 글로벌하게 선언됬음을 알수 있다. 그렇다면 function scope 안에 있을때 밖에서 참조하려 할때 에러가 나는지 확인해보자.&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743321578810&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function test() {
    var myName = &quot;Kyle&quot;;
}

console.log(myName); // ReferenceError: myName is not defined&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위와 같이 function scope 에 있을때는 외부에서 참조하려고 할시 에러가 잘 발생함을 확인할 수 있다. 이제 function scope 의 개념을 알았으니 Block scope 로 넘어가보자.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;P.S) var 의 function scope 의 개념이 다른 언어와 혼동을 줄수 있다고 해서 요즘에는 let 과 const 를 이용하라고 권장하는것 같은데 사실 개념만 알고 있다면 크게 문제는 없지 않을까 싶긴하다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Block scope&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;let, const 와 같은 선언문들은 block scope 를 가진다. 우리가 첫번째 예시에서도 봤듯이 let 과 const 로 선언된 변수는 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;동일 block 내에서만 참조 가능&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하다. 둘의 차이점이 있다면 &lt;b&gt;const 는 불변(immutable)&lt;/b&gt; 하다. 아래의 코드를 함께 보자.&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743321596271&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const myBirthday = true;
let age = 39;

if (myBirthday) {
    age += 1;
    myBirthday = false; // TypeError: Assignment to constant variable.
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;코드를 실행시키면 위와 같이 myBirthday 를 false 로 할당시키려는 부분에서 에러가 발생한다. 이 이유는 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;const 로 할당한 값을 바꾸려고 했기 때문&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이다. const 로 된 값을 이용할때 우리는 일반적으로 &lt;b&gt;처음 할당된 이후로 잘 바뀌지 않을 것이라고 예상&lt;/b&gt;한다. 그렇기 때문에 아래와 같이 객체를 할당해서 사용하면 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;유지보수 관점에서 문제를 일으킬수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743321623170&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const actors = [&quot;Kyle&quot;, &quot;Sarah&quot;, &quot;Dr. Evil&quot;];
actors.pop();

assert(actors.includes(&quot;Dr. Evil&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;&lt;span style=&quot;color: #000000;&quot;&gt;위의 코드를 보면 알수 있듯이 const 로 선언했음에도 객체를 할당했기 때문에 객체의 값을 바꾸는 것이 가능하다. 따라서 사용하는 쪽에서 Dr. Evil 이 배열 객체안에 있을거라고 생각하지만, 실제로는 pop 메소드를 수행했기 때문에 존재하지 않는다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <category>block scope</category>
      <category>fuction scope</category>
      <category>hoisting</category>
      <category>JavaScript</category>
      <category>you don't know js yet</category>
      <author>dev_roach</author>
      <guid isPermaLink="true">https://devroach.tistory.com/193</guid>
      <comments>https://devroach.tistory.com/193#entry193comment</comments>
      <pubDate>Sun, 30 Mar 2025 17:00:53 +0900</pubDate>
    </item>
    <item>
      <title>코드포스 2057A) Mex Table</title>
      <link>https://devroach.tistory.com/192</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;Mex Table&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;844&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9Z3GP/btsLRGPlQbJ/wqlZvDnD7rp1p82Hf2Ga10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9Z3GP/btsLRGPlQbJ/wqlZvDnD7rp1p82Hf2Ga10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9Z3GP/btsLRGPlQbJ/wqlZvDnD7rp1p82Hf2Ga10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9Z3GP%2FbtsLRGPlQbJ%2FwqlZvDnD7rp1p82Hf2Ga10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;898&quot; height=&quot;844&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;844&quot;/&gt;&lt;/span&gt;&lt;/figure&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;b&gt;Mex Table&lt;/b&gt; 이 문제는 풀기 쉬운편에 속한다. 일단 문제를 풀기 위해 &lt;b&gt;MEX 함수&lt;/b&gt;에 대해 이해하는 시간을 가져보자. MEX 함수는 0을 포함한 &lt;b&gt;음이 아닌 정수중 collection 에 나열되지 않은 가장 최솟값&lt;/b&gt;을 뜻한다. 예를 들면, 아래식은 반드시 0의 값을 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;$$ MEX({1,2,3,4}) = 0 $$&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 값이 반드시 0을 가지는 이유는 0을 포함한 음이 아닌 정수이므로 0이 가장 작은 값이기때문이다. 이해가 안간다면, 검색을 해봐도 좋고, 문제를 다시 읽어봐도 좋다. 일단 MEX 는 이렇게 설명하고 넘어가겠다.&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;사실 문제에서 페이크인지 일부러 적어둔지는 모르겠지만, 사용할수 있는 가짓수를 정렬해서 값을 최대화 하는 것이라고 하는데 실상 이리저리 막해보면 결국 어떻게 배열하든 다 같은 값이 나온다. 여튼, 그렇게 값을 1*1, 1*2, 1*3, 2*1, 2*2, 2*3, 3*1, 3*2, 3*3 으로 배열하다보면 하나의 규칙이 보인다.&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;결국 0은 한번밖에 등장하지 못하므로 0을 포함시키지 못한 행과열은 모두 값이 0으로 수렴되게 되고, 그러면 최대화 시키기 위해서는 0이 있는 행 또는 열에서 가장 크게 나올수 있는 수인 (max(n, m)) 을 등장시킨다고 했을때, 그러면 다른 열 또는 행(만약 앞에서 행을 골랐다면 열)은 1을 가지게 된다.&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;즉, 그래서 결국 max(n, m) + 1 으로 식이 정리된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1737191930366&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;n = int(input())
sizes = [list(map(int, input().split())) for _ in range(n)]

for size in sizes:
    print(f'{max(size[0], size[1])}\n')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm</category>
      <category>2057</category>
      <category>2057a</category>
      <category>코드포스</category>
      <category>코드포스 2057</category>
      <category>풀이</category>
      <author>dev_roach</author>
      <guid isPermaLink="true">https://devroach.tistory.com/192</guid>
      <comments>https://devroach.tistory.com/192#entry192comment</comments>
      <pubDate>Sat, 18 Jan 2025 18:19:22 +0900</pubDate>
    </item>
    <item>
      <title>[선형대 수학] 벡터의 내적(inner product)</title>
      <link>https://devroach.tistory.com/191</link>
      <description>&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;h3 data-ke-size=&quot;size23&quot;&gt;벡터의 내적&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;벡터의 내적(inner product)&lt;/b&gt; 를 이해하기 위해서는 여러가지 수학적 지식을 필요로 한다. 이 글을 읽는 독자들은 나만큼 수학에 무지하다는 생각으로 글을 작성하겠다. 일단, 벡터의 내적을 이해하기 위해서는 삼각함수의 지식을 필요로 한다. 삼각함수 부터 들어가보자.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;삼각함수&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삼각함수는 쉽게 말해 &lt;b&gt;각(theta)&lt;/b&gt; 를 기준으로 인접한 변사이의 비율을 나타내는 것이다. 예를 들면, 아래 그림에서 삼각비는 어떻게 전개 될까?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1480&quot; data-origin-height=&quot;1348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Op230/btsLFZvpkB0/ZiSyAUCVwyKFleuVoGcFD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Op230/btsLFZvpkB0/ZiSyAUCVwyKFleuVoGcFD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Op230/btsLFZvpkB0/ZiSyAUCVwyKFleuVoGcFD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOp230%2FbtsLFZvpkB0%2FZiSyAUCVwyKFleuVoGcFD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1480&quot; height=&quot;1348&quot; data-origin-width=&quot;1480&quot; data-origin-height=&quot;1348&quot;/&gt;&lt;/span&gt;&lt;/figure&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;b&gt;$$ \cos \theta = 3/5, \sin \theta = 4/5, \tan \theta = 4/3$$&lt;/b&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;b&gt;전개됨&lt;/b&gt;을 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정사영(Projection)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정사영은한 벡터를 다른 벡터의 방향으로 그림자를 내리는 과정이다. &lt;b&gt;수직선을 그어 투영된 부분을 찾고, 그 길이와 방향을 벡터로 나타낸 것이 정사영 벡터&lt;/b&gt;이다. 쉽게 말하면 해당 벡터의 방향으로 &lt;b&gt;90도인 선분(직교하도록&lt;/b&gt;)을 그은 뒤 같은 방향으로 벡터를 하나 그려줬다고 생각하면 된다. 조금 쉽게 이야기 하면, 위의 &lt;b&gt;그림의 a 선분에서 b 선분을 향해 90도인 선을 하나 그리면 된다&lt;/b&gt;. 즉, 아래 그림과 같이 될것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;1380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ptAKv/btsLGiuuOtz/jH2Sl2BGkUkV7nXJXe5e5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ptAKv/btsLGiuuOtz/jH2Sl2BGkUkV7nXJXe5e5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ptAKv/btsLGiuuOtz/jH2Sl2BGkUkV7nXJXe5e5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FptAKv%2FbtsLGiuuOtz%2FjH2Sl2BGkUkV7nXJXe5e5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1400&quot; height=&quot;1380&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;1380&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;눈치가 빠른 사람은 그림만 봐도 알수 있겠지만 정사영(Projection) 시킨것은 사실 아래식과 같음을 알 수 있다.&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;$$\text{proj}_\mathbf{b} \mathbf{a} = \|\mathbf{a}\| * \cos \theta $$&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;b&gt;vector b 를 조금 더 앞으로 가도록 스케일업&lt;/b&gt; 해보도록 하자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1358&quot; data-origin-height=&quot;1366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UVsTj/btsLIlDfpwF/aGXAb97TTtxIUtq2S0ojOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UVsTj/btsLIlDfpwF/aGXAb97TTtxIUtq2S0ojOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UVsTj/btsLIlDfpwF/aGXAb97TTtxIUtq2S0ojOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUVsTj%2FbtsLIlDfpwF%2FaGXAb97TTtxIUtq2S0ojOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1358&quot; height=&quot;1366&quot; data-origin-width=&quot;1358&quot; data-origin-height=&quot;1366&quot;/&gt;&lt;/span&gt;&lt;/figure&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;b&gt;vector a 를 vector b 로 정사영&lt;/b&gt;시키면 조금 더 짧은 길이 이지만 같은 방향을 지닌 벡터를 얻었음을 알 수 있다. 벡터는&lt;b&gt; 방향성&lt;/b&gt;을 지니기 때문에 이러한 &lt;b&gt;정사영(Projection)&lt;/b&gt; 이라는 개념이 조금 중요시 되는데, 쉽게 이야기하면 &lt;b&gt;vector b 로 우리는 물체를 (0, 0) 에서 보내려 했을때 vector a 방향으로 힘을 주게 되면 얼마만큼 효율적일까?&lt;/b&gt; 를 계산하기 위해 정사영의 개념을 사용한다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;벡터의 내적&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 개념이 중요한 이유는 &lt;b&gt;내적&lt;/b&gt;을 알기 위해 중요한 이유를 내적 식과 함께 알아보도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;$$ {a} \cdot {b} = \|{a}\| * \|{b}\| * \cos \theta $$&amp;nbsp;&lt;/b&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: right;&quot;&gt;$$ \mathbf{a} \cdot \mathbf{b} = \|\mathbf{a}\| \cos \theta \|\mathbf{b}\| $$&lt;/span&gt;&lt;/b&gt;&lt;/span&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;b&gt;정사영식&lt;/b&gt;이 보인다. 만약 우리가 &lt;b&gt;정사영된 벡터의 길이&lt;/b&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;b&gt;$$ \text {proj}_\mathbf{b} \mathbf{a} = \frac{\mathbf{a} \cdot \mathbf{b}}{\mathbf{b} \cdot \mathbf{b}} \cdot \mathbf{b} $$&lt;/b&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;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;$$ \|\text {proj}_\mathbf{b} \mathbf{a} \| = |\frac{\mathbf{a} \cdot \mathbf{b}}{\mathbf{b} \cdot \mathbf{b}}| \cdot \|\mathbf{b}\| $$&lt;/b&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;b&gt;$$ \|\text {proj}_\mathbf{b} \mathbf{a} \| = |\frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{b}^2\|}| \cdot \|\mathbf{b}\| $$&lt;/b&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;b&gt;$$ \|\text {proj}_\mathbf{b} \mathbf{a} \| = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{b}\|} $$&lt;/b&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;즉, 이렇게 놓고 보면 정사영된 길이에 벡터 b 의 크기를 곱하면 결국 해당 벡터의 사이즈를 얻을 수 있음을 역순으로 알 수 있다.&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Math</category>
      <category>벡터의 내적</category>
      <category>선형대수학</category>
      <category>의미</category>
      <category>정사영행렬</category>
      <author>dev_roach</author>
      <guid isPermaLink="true">https://devroach.tistory.com/191</guid>
      <comments>https://devroach.tistory.com/191#entry191comment</comments>
      <pubDate>Wed, 8 Jan 2025 22:55:39 +0900</pubDate>
    </item>
    <item>
      <title>Affine 계층 계산 그래프에서 역전파시 전치행렬이 나오는 이유</title>
      <link>https://devroach.tistory.com/190</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2258&quot; data-origin-height=&quot;1066&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cl9ieb/btsLE3CDcFR/05KttjKi0tNFfMLfx1kKdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cl9ieb/btsLE3CDcFR/05KttjKi0tNFfMLfx1kKdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cl9ieb/btsLE3CDcFR/05KttjKi0tNFfMLfx1kKdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcl9ieb%2FbtsLE3CDcFR%2F05KttjKi0tNFfMLfx1kKdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2258&quot; height=&quot;1066&quot; data-origin-width=&quot;2258&quot; data-origin-height=&quot;1066&quot;/&gt;&lt;/span&gt;&lt;/figure&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;Affine 계층을 보면 1번의 네모 박스에서 갑자기 &lt;b&gt;전치행렬&lt;/b&gt;이 등장하는 것을 확인할 수 있다. 물론, 수학적으로 사고가 조금 되시는 분들은 왜 전치행렬이 등장하는지 아실수 있을거 같으나, 이전에 스칼라를 이용해 역전파를 구성했을때는 전치행렬이 아닌 그냥 W 가 곱해져야 하는게 아닌가? 라고 사고할수도 있다고 생각한다.&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;h3 data-ke-size=&quot;size23&quot;&gt;탐구&lt;/h3&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;b&gt;$$Y = W*X$$&lt;/b&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;X, W, Y 에 관한 정의는 아래와 같다&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;X 는 (1,2) 행렬&lt;/b&gt;이다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;W 는 (2,3) 행렬&lt;/b&gt;이다.&lt;/li&gt;
&lt;li&gt;W*X 의 곱의 결과가 Y 이므로 &lt;b&gt;Y 는 (1,3) 의 행렬&lt;/b&gt;이 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;$$X = \begin{bmatrix} x_{11} &amp;amp; x_{12} \end{bmatrix}$$&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;$$W = \begin{bmatrix} w_{11} &amp;amp; w_{12} &amp;amp; w_{13} \\ w_{21} &amp;amp; w_{22} &amp;amp; w_{23} \end{bmatrix}$$&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘을 곱하게 되면 Y 는 아래와 같은 형태가 될것 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;$$Y(X*W) = \begin{bmatrix} x_{11}*w_{11} + x_{12}*w_{21} \\ x_{11}*w_{12} + x_{12}*w_{22} \\ x_{11}*w_{13} + x_{12}*w_{23} \end{bmatrix}$$&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 결과를 각각 &lt;b&gt;x11, x12 로 편미분&lt;/b&gt; 한다고 해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;$$\frac{\partial Y}{\partial X_{11}} = \begin{bmatrix} w_{11} \\ w_{12} \\ w_{13} \end{bmatrix}$$&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;$$\frac{\partial Y}{\partial X_{12}} = \begin{bmatrix} w_{21} \\ w_{22} \\ w_{23} \end{bmatrix}$$&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과 같이 변할 것 이다. 즉, 이 두개를 합쳐보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;$$W^T = \begin{bmatrix} w_{11} &amp;amp; w_{12} \\ w_{13} &amp;amp; w_{21} \\ w_{22} &amp;amp; w_{23} \end{bmatrix}$$&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 식임을 확인할 수 있다.&amp;nbsp;&lt;br /&gt;&lt;b&gt;$$W = \begin{bmatrix} w_{11} &amp;amp; w_{12} &amp;amp; w_{13} \\ w_{21} &amp;amp; w_{22} &amp;amp; w_{23} \end{bmatrix}$$&amp;nbsp;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;W 와 놓고 비교해보면 &lt;b&gt;W 의 전치행렬&lt;/b&gt;임을 더 쉽게 확인할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;결론&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;즉, 연쇄법칙이 일어나는 Affine 계층에서 역전파를 일으킬때 전치행렬이 나오는 이유는 위와 같다. 왜냐면 항상 우리는 위 식의 경우 X 에 관한것은 아래와 같이 Loss 함수의 값을 X 로 미분을 하는 것이기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;$$\frac{\partial L}{\partial X}$$&lt;/b&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI</category>
      <category>affine 계층</category>
      <category>AI</category>
      <category>딥러닝</category>
      <category>전치행렬 나오는 이유</category>
      <category>편미분</category>
      <author>dev_roach</author>
      <guid isPermaLink="true">https://devroach.tistory.com/190</guid>
      <comments>https://devroach.tistory.com/190#entry190comment</comments>
      <pubDate>Sat, 4 Jan 2025 15:00:12 +0900</pubDate>
    </item>
    <item>
      <title>머신러닝 공부 1일차) 지도 학습 VS 비지도 학습</title>
      <link>https://devroach.tistory.com/189</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;시작하며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머신러닝 공부를 시작하는 이유는 요새 LLM 등이 핫한데 이것 저것 만지다보니, 어떻게 이렇게 사고하는 모델을 만들었을까? 되게 궁금증이 많이 들었고 이런 기술을 좀 더 잘 이해하기 위해서는 기초 수학 -&amp;gt; 머신 러닝 -&amp;gt; 딥러닝 -&amp;gt; LLM 순으로 공부해서 조금 이해도를 점진적으로 확장시켜야 겠다는 생각을 했다. 여하튼, 이게 도움이 될지 안될지는 모르겠지만, 지금 당장 AI 를 공부하는것이 흥미 있어서 2025년은 조금 AI 공부에 많은 시간을 쏟지 않을까 싶다.&lt;/p&gt;
&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;h3 data-ke-size=&quot;size23&quot;&gt;지도 학습 vs 비지도 학습&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1288&quot; data-origin-height=&quot;864&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzGZ3C/btsK8tCQ9Ha/flXpml1rbyjZRg35B7mFb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzGZ3C/btsK8tCQ9Ha/flXpml1rbyjZRg35B7mFb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzGZ3C/btsK8tCQ9Ha/flXpml1rbyjZRg35B7mFb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzGZ3C%2FbtsK8tCQ9Ha%2FflXpml1rbyjZRg35B7mFb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;369&quot; height=&quot;248&quot; data-origin-width=&quot;1288&quot; data-origin-height=&quot;864&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지도학습은 정답을 알고 있는 &lt;b&gt;데이터를 기반으로 학습하는 방법&lt;/b&gt;입니다. 이미 데이터에 대한 특성(feature)을 알고 있으며 해당 특성이 어떠한 타겟(Target) 으로 분류되어야 하는지도 알고 있는 상태입니다. 아직은 저도 머신러닝 입문이라 모르겠지만, 주로 초반에 데이터셋을 설정하는게 일련의 이 과정이지 않을까 싶습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;978&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBS6O3/btsK88x9yha/8NYKtiJKTo64VbqwU4krnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBS6O3/btsK88x9yha/8NYKtiJKTo64VbqwU4krnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBS6O3/btsK88x9yha/8NYKtiJKTo64VbqwU4krnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBS6O3%2FbtsK88x9yha%2F8NYKtiJKTo64VbqwU4krnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;458&quot; height=&quot;350&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;978&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비지도 학습은 데이터에 대한 &lt;b&gt;특성(feature)&lt;/b&gt; 만 알고 있는 상태이며 어떤 타겟으로 이뤄져야 하는지는 모르는 상태입니다. 즉, &quot;빨간색&quot;, &quot;주근깨 있음&quot;, &quot;과일&quot; 이라는 특성이 있을때 이 특성이 &quot;딸기&quot; 라는 타겟으로 이어져야 하는지 모르는 상태입니다. 따라서, 비지도 학습의 경우 어떤 타겟 데이터인지 정확하게 알수 없으므로 데이터 분포 형태를 통해 추측만이 가능합니다. 위와 같이 특성 데이터를 통해 데이터를 나누는 것을 &lt;b&gt;군집(clustering)&lt;/b&gt; 이라고 부릅니다.&lt;/p&gt;</description>
      <category>AI</category>
      <category>ai 학습 1일차</category>
      <category>비지도 학습</category>
      <category>지도 학습</category>
      <author>dev_roach</author>
      <guid isPermaLink="true">https://devroach.tistory.com/189</guid>
      <comments>https://devroach.tistory.com/189#entry189comment</comments>
      <pubDate>Thu, 5 Dec 2024 18:59:49 +0900</pubDate>
    </item>
    <item>
      <title>프로그래밍 영어 단어 공부</title>
      <link>https://devroach.tistory.com/188</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;프로그래머를 위한 영어 표현: tailored와 dedicated의 이해&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요!   오늘은 프로그래머들이 프로그래밍 서적이나 기술 문서를 읽다가 자주 접하는 표현들인 tailored와 dedicated에 대해 알아볼게요. 특히 프로그래밍에서 이 두 단어는 특정한 용도나 목적에 맞춘다는 뉘앙스를 담고 있어요. 이 글에서는 이 두 표현의 의미와 차이점, 그리고 활용 사례를 소개하겠습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. &lt;b&gt;Tailored&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tailored는 &quot;특정 요구나 상황에 맞게 조정된&quot; 이라는 뜻이에요. 본래 &quot;재단하다&quot;라는 뜻에서 유래한 단어로, 프로그래밍에서는 특정 도메인(domain)이나 목적에 맞춰 수정되거나 조정된 모델, 시스템, 코드 등을 설명할 때 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주요 특징:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;맞춤형&lt;/li&gt;
&lt;li&gt;특정한 요구사항을 반영&lt;/li&gt;
&lt;li&gt;유연성과 변화 가능성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예문:&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;However, those techniques hit limits when using general models not tailored to specific domains and applications.&quot;&lt;/b&gt;&lt;br /&gt;하지만, 이러한 기법들은 특정 도메인과 애플리케이션에 맞게 조정되지 않은 일반적인 모델을 사용할 때 한계에 도달한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;We need a tailored solution for handling high-frequency trading data.&quot;&lt;/b&gt;&lt;br /&gt;고빈도 거래 데이터를 처리하기 위한 맞춤형 솔루션이 필요하다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. &lt;b&gt;Dedicated&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dedicated는 &quot;특정 목적을 위해 전용된&quot; 또는 &quot;오직 한 가지 용도에만 사용되는&quot;이라는 뜻이에요. 일반적으로 프로그래밍에서 특정 기능, 리소스, 또는 프로세스를 위한 전용 시스템, 팀, 서버 등을 설명할 때 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주요 특징:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 목적에 전적으로 헌신&lt;/li&gt;
&lt;li&gt;다른 용도로 사용되지 않음&lt;/li&gt;
&lt;li&gt;안정성과 효율성 강조&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예문:&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;This application uses a dedicated server for database operations.&quot;&lt;/b&gt;&lt;br /&gt;이 애플리케이션은 데이터베이스 작업을 위해 전용 서버를 사용한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;A dedicated framework simplifies the implementation of machine learning models.&quot;&lt;/b&gt;&lt;br /&gt;전용 프레임워크는 머신러닝 모델 구현을 단순화한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. &lt;b&gt;Tailored vs. Dedicated: 차이점&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징TailoredDedicated&lt;/p&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&gt;&lt;b&gt;목적&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;특정 요구에 맞게 조정된 솔루션&lt;/td&gt;
&lt;td&gt;특정 용도만을 위해 전적으로 설계된 솔루션&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;유연성&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;높음 (다양한 환경에 맞게 조정 가능)&lt;/td&gt;
&lt;td&gt;낮음 (한 가지 용도에 최적화)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;사용 사례&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;모델 조정, 데이터 처리 알고리즘, API 변경&lt;/td&gt;
&lt;td&gt;서버, 팀, 시스템 등 특정 기능을 전담&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;비유로 이해하기:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Tailored: 특정 사람의 몸에 맞춘 맞춤 정장처럼 조정 가능한 솔루션&lt;/li&gt;
&lt;li&gt;Dedicated: 오직 특정 기능만을 수행하는 전용 기계&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. &lt;b&gt;프로그래밍에서 실제 활용&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Tailored&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;Tailored for performance&quot;&lt;br /&gt;성능 향상을 위해 조정된 코드나 알고리즘&lt;/li&gt;
&lt;li&gt;&quot;Tailored models for specific industries&quot;&lt;br /&gt;특정 산업에 맞게 최적화된 AI/ML 모델&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Dedicated&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;Dedicated resources for real-time processing&quot;&lt;br /&gt;실시간 처리를 위한 전용 리소스&lt;/li&gt;
&lt;li&gt;&quot;Dedicated environments for testing and debugging&quot;&lt;br /&gt;테스트와 디버깅을 위한 전용 환경&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. &lt;b&gt;요약 및 응용&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Tailored&lt;/b&gt;는 프로그래밍에서 맞춤화된 유연성을 의미하고, &lt;b&gt;Dedicated&lt;/b&gt;는 특정 기능에 헌신된 안정성을 뜻합니다. 두 표현 모두 전문적인 문맥에서 자주 등장하니, 프로그래밍 서적을 읽거나 기술 문서를 작성할 때 이 표현들을 적절히 사용하면 더 전문적이고 정확한 의사소통이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음번 코드 리뷰나 설계 문서에서 이렇게 말해볼까요?&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;We need a tailored algorithm to handle this specific dataset, but it should run on a dedicated server for optimal performance.&quot;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 tailored와 dedicated를 프로처럼 사용할 준비가 되셨나요? 다음에도 더 유용한 표현들로 돌아올게요! Happy coding!  ✨&lt;/p&gt;</description>
      <category>영어공부</category>
      <category>dedicated 뜻</category>
      <category>tailored 뜻</category>
      <category>개발에서</category>
      <category>개발자 영어 공부</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <category>프로그래밍 영어 단어 공부</category>
      <author>dev_roach</author>
      <guid isPermaLink="true">https://devroach.tistory.com/188</guid>
      <comments>https://devroach.tistory.com/188#entry188comment</comments>
      <pubDate>Wed, 20 Nov 2024 10:58:39 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript 공부용] Webworker 다뤄보기</title>
      <link>https://devroach.tistory.com/187</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;WebWorker?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 프론트 엔드 프로그래밍이나 모바일 프로그래밍을 하다보면 기존 메인 스레드로 UI 를 렌더링 하기 때문에 백그라운드에서 워커 혹은 다른 스레드를 통해 부가 작업들을 진행한다. MDN 공식문서에도 나와 있듯이 웹에서는&amp;nbsp;&lt;b&gt;Web Worker&lt;/b&gt; 가 그 일을 한다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;알아보기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Worker 는 지정한 javascript 파일을 런타임 환경에서 실행시킬수 있다. MDN 공식문서에 따르면 Worker 를 생성하는 방법은 아래와 같다. `import.meta.url` 은 번들러에 의해 위치가 꼬일수도 있으니 넣으라고 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1732022821255&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const myWorker = new Worker(new URL(&quot;worker.js&quot;, import.meta.url));&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;Worker 안에서 대부분의 코드가 실행 가능하나 &lt;b&gt;몇가지 목적을 지닌 코드는 실행 불가능&lt;/b&gt;한데 해당 코드들은 다음과 같다&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;직접 DOM 을 조작(manipulation) 하려는 시도를 가진 코드&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Window 객체의 기본 메소드나 속성들을 사용하려는 코드&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 두가지 목적을 지닌 코드는 실행 불가능 하니 워커를 자신의 프로젝트에 사용하려고 할때 이 두 가지를 행여나 워커가 실행하려고 하지는 않는지 미리 알아두면 좋을것 같다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터 주고 받는 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면, &lt;b&gt;Worker&lt;/b&gt; 와 &lt;b&gt;main thread&lt;/b&gt; 간의 통신은 어떻게 이어질까? 예를 들면 worker 에서 데이터를 fetch 해와서 가져왔는데, main thread 에서 이를 받아와 써야 하는 경우에는 어떻게 해야 할까? 이때는 message 시스템의 &lt;b&gt;`postMessage`&lt;/b&gt; 와 &lt;b&gt;`onMessage`&lt;/b&gt; 메소드를 통해서 데이터를 주고 받을 수 있다. 메소드 명만 보아도 비동기적으로 수행되며 Event 기반임을 대략적으로 예측할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드 작성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 알았으니 코드로 살짝 적어보도록 하자. 예시는 대부분 &lt;a href=&quot;https://github.com/mdn/dom-examples/blob/main/web-workers/simple-web-worker/index.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;MDN 에 있는 예시&lt;/a&gt;를 가져와서 살짝 입맛에 맞게 변경만 했다.&lt;/p&gt;
&lt;pre id=&quot;code_1732024329756&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;kr&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;utf-8&quot; /&amp;gt;
    &amp;lt;title&amp;gt;웹 워커 예시&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;

&amp;lt;div class=&quot;controls&quot; tabindex=&quot;0&quot;&amp;gt;
    &amp;lt;form&amp;gt;
        &amp;lt;div&amp;gt;
            &amp;lt;label for=&quot;number1&quot;&amp;gt;Multiply number 1: &amp;lt;/label&amp;gt;
            &amp;lt;input type=&quot;text&quot; id=&quot;number1&quot; value=&quot;0&quot; /&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div&amp;gt;
            &amp;lt;label for=&quot;number2&quot;&amp;gt;Multiply number 2: &amp;lt;/label&amp;gt;
            &amp;lt;input type=&quot;text&quot; id=&quot;number2&quot; value=&quot;0&quot; /&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/form&amp;gt;

    &amp;lt;p class=&quot;result&quot;&amp;gt;Result: 0&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;script src=&quot;main.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5FNba/btsKO9qV1um/QPuslvAfLchPXV8R2sRKlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5FNba/btsKO9qV1um/QPuslvAfLchPXV8R2sRKlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5FNba/btsKO9qV1um/QPuslvAfLchPXV8R2sRKlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5FNba%2FbtsKO9qV1um%2FQPuslvAfLchPXV8R2sRKlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;358&quot; height=&quot;110&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;224&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드를 보면 간단하다. 입력창이 아래와 같이 두개 존재하고, 결과값을 보여주기 위한 result 라는 식별자 클래스를 가진 p 태그 속성 하나가 존재한다. 스크립트 없이 html 만으로는 아무런 동작을 하지 않는다.&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;일단 단계적으로 조금씩 워커를 이용하는 것으로 마이그레이션 하기 위해서 현재 html 내에서 &lt;b&gt;input(number1, number2)&lt;/b&gt; 값에 변화가 있을때 마다 해당 수를 더해서 Result 를 업데이트 시켜주는 자바스크립트 코드를 작성해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1732024767953&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const number1 = document.querySelector(&quot;#number1&quot;);
const number2 = document.querySelector(&quot;#number2&quot;);
const result = document.querySelector(&quot;.result&quot;);

[number1, number2].forEach((element) =&amp;gt; {
    element.onchange = function () {
        result.textContent = String(Number(number1.value) + Number(number2.value));
    }
})&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;이렇게 하면 아래와 같이 입력값을 입력했을때 result dom 에 직접 수정을 가해서 입력값을 업데이트 시켜주는 형태이다. Back to the basic ㅋㅋ 정말 오랜만에 JQuery 처럼 코딩하고 있다. 여하튼, 이제 여기서 생각해봐야 할점은 다음과 같다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;만약 저 Plus 연산이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;Network 혹은 File I/O&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;작업이라 엄청나게 오래 걸리는 작업이라면 어떻게 될까?&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;만약 main.js 를 돌리는 스레드가 블락킹 되서 다른 작업들을 못하게 된다면?&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Worker 로의 연산 이전&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그래서 우리는 불필요한 작업들을 &lt;b&gt;Worker 스레드&lt;/b&gt;에 조금 분배시킬 수 있도록 작업할 것이다. 우리가 여기서 해야할 것은 Plus 관련된 작업을 워커로 가져간다고 해보자.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1732025074386&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;onmessage = function (event) {
    // main 에서 받는 메세지는 event 의 data 안으로 들어온다
    console.log(&quot;Received message&quot;, event.data);
    
    if (!event.data) {
        postMessage(&quot;You should send data for calculation!&quot;);
    }

    const {first, second} = event.data;
    console.log(&quot;Received Successfully&quot;, first, second);
    const result = Number(first) + Number(second);
    postMessage(result);
}&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;위 worker.js 스크립트는 &lt;b&gt;워커 노드가 해야할 일을 적은 스크립트&lt;/b&gt;로 메인 스레드에서는 해당 워커를 생성(spawn) 할때 파일명을 &quot;worker.js&quot; 로 지정해서 spawn 해주면 된다. 여기서 몇 가지 코드만 짚고 넘어가면 좋은데, 첫번째로는 &lt;b&gt;`onmessage`&lt;/b&gt; 속성이다. `onmessage` 는 위에서도 설명했듯이, &lt;b&gt;이벤트가 들어왔을때 어떠한 작업을 하는 일종의 이벤트 핸들러 리스너&lt;/b&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;추측할 수 있겠지만 `postMessage` 는 반대로 데이터를 보내는 역할을 한다. 즉, &lt;b&gt;mainThread(자신을 spawn 한 쪽으로) 로 데이터를 보내는 것&lt;/b&gt;이다. 따라서 우리는 연산을 마친 뒤, 워커를 소환한 mainThread 로 결과값을 보내줄 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1732025347722&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const number1 = document.querySelector('#number1');
const number2 = document.querySelector('#number2');
const result = document.querySelector(&quot;.result&quot;)

if (window.Worker) {
    const myWorker = new Worker(&quot;./worker.js&quot;);

    [number1, number2].forEach(input =&amp;gt; {
        input.onchange = function() {
            myWorker.postMessage({
                first: number1.value,
                second: number2.value,
            })
        }
    })

    myWorker.onmessage = function(event) {
        result.textContent = event.data;
        console.log(&quot;Message from worker node : &quot; + event.data);
    }
}&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;이제 mainThread 에서 해야할 일은 input 에 변경값이 생겼을때 worker 에게 메세지를 보내고, worker 가 보내준 결과값이 도달하면 onmessage 를 통해 이벤트를 수신하여 Result 를 업데이트 해주면 된다.&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;kakaotv&quot; data-video-url=&quot;https://tv.kakao.com/v/451065458&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/xufA2/hyXzJ7Bozg/t3vXn1GjLOFuJY8clGtEV1/img.jpg?width=744&amp;amp;height=638&amp;amp;face=0_0_744_638,https://scrap.kakaocdn.net/dn/ZQ8l1/hyXzInj1FL/TbSDGKKUZG9KWLI7h2lHk1/img.jpg?width=744&amp;amp;height=638&amp;amp;face=0_0_744_638&quot; data-video-width=&quot;744&quot; data-video-height=&quot;638&quot; data-video-origin-width=&quot;744&quot; data-video-origin-height=&quot;638&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-play-service=&quot;daum_tistory&quot; data-original-url=&quot;&quot; data-video-title=&quot;&quot;&gt;&lt;iframe src=&quot;https://play-tv.kakao.com/embed/player/cliplink/451065458?service=daum_tistory&quot; width=&quot;744&quot; height=&quot;638&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&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;h3 data-ke-size=&quot;size23&quot;&gt;예시코드 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/tmdgusya/web-worker-example&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/tmdgusya/web-worker-example&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1732076352273&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - tmdgusya/web-worker-example&quot; data-og-description=&quot;Contribute to tmdgusya/web-worker-example development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/tmdgusya/web-worker-example&quot; data-og-url=&quot;https://github.com/tmdgusya/web-worker-example&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/br25NY/hyXzRxVG7K/y0Q8k8uEmKztYYWU2YBac1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bE4DMz/hyXDgpgwUR/6JxN7nTZLkHfwXQpwtTsDk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/tmdgusya/web-worker-example&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/tmdgusya/web-worker-example&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/br25NY/hyXzRxVG7K/y0Q8k8uEmKztYYWU2YBac1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bE4DMz/hyXDgpgwUR/6JxN7nTZLkHfwXQpwtTsDk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - tmdgusya/web-worker-example&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Contribute to tmdgusya/web-worker-example development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <category>node</category>
      <category>web worker</category>
      <category>노드</category>
      <category>노드 서비스 워커 공부</category>
      <category>노드 워커 공부</category>
      <category>서비스 워커</category>
      <category>오블완</category>
      <category>워커</category>
      <category>웹 워커</category>
      <category>티스토리챌린지</category>
      <author>dev_roach</author>
      <guid isPermaLink="true">https://devroach.tistory.com/187</guid>
      <comments>https://devroach.tistory.com/187#entry187comment</comments>
      <pubDate>Wed, 20 Nov 2024 00:00:10 +0900</pubDate>
    </item>
  </channel>
</rss>