<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>fileupload</title>
    <link>https://fileupload.tistory.com/</link>
    <description>각종 프로그래밍 정보를 다루는 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Mon, 1 Jun 2026 08:29:55 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>fileupload</managingEditor>
    <item>
      <title>두 AVL 트리 연결/병합/접합</title>
      <link>https://fileupload.tistory.com/751</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;두 AVL 트리 연결/병합/접합&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;두 개의 AVL 트리가 있고 첫 번째 트리의 각 요소가 두 번째 트리의 각 요소보다 작다고 가정합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;단일 AVL 트리로 연결하는 가장 효율적인 방법은 무엇입니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기저기 찾아봤지만 유용한 것을 찾지 못했습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;입력 트리를 파괴할 수 있다고 가정하면 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;왼쪽 트리에 대해 가장 오른쪽에 있는 요소를 제거하고 이를 사용하여 왼쪽 하위가 왼쪽 트리이고 오른쪽 하위가 오른쪽 트리인 새 루트 노드를 구성합니다. O(log n)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;노드의 균형 계수를 결정하고 설정합니다. O(log n).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(일시적으로) 불변성을 위반하는 경우 균형 계수가 {-1, 0, 1} 범위를 벗어날 수 있습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;회전하여 균형 계수를 범위로 되돌립니다. O(log n) 회전: O(log n)&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 O(log n)에서 전체 연산을 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집: 다시 생각해보면 다음 알고리즘에서 회전에 대한 추론이 더 쉽습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 속도가 더 빠를 가능성이 높습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;두 트리의 높이를 결정합니다. O(log n).&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오른쪽 트리가 더 크다는 가정(다른 경우는 대칭):&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가장 오른쪽에 있는 요소를 제거합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;left&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나무(필요한 경우 회전 및 계산 높이 조정). Let&lt;/font&gt;&lt;/font&gt;&lt;code&gt;n&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 요소입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;O(로그n)&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오른쪽 트리에서 하위 트리가 최대 1보다 큰 노드에 도달할 때까지 왼쪽으로 탐색합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;left&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.허락하다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;r&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 노드가 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;O(로그n)&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해당 노드를 값 n과 하위 트리를 가진 새 노드로 바꿉니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;left&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;r&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. O(1)&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구성에 따라, 새로운 노드는 AVL 균형을 이루었고, 하위 트리는 다음보다 1개 더 높았습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;r&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그에 따라 부모의 균형을 증가시킵니다. O(1)&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;삽입한 후에 다시 균형을 잡는 것처럼 말이죠.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;O(로그n)&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(나무 사이의 관계에서 아무런 가정 없이 작동하는) 아주 간단한 해결책은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;두 트리를 병합된 하나의 배열로 병합 정렬합니다(두 트리를 동시에 반복).&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;배열에서 AVL 트리를 작성합니다. 중간 요소를 루트로 하고 왼쪽 및 오른쪽 반에 재귀적으로 적용합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;두 단계 모두 O(n)입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가장 큰 문제는 O(n)개의 여유 공간이 필요하다는 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 문제에 대해 제가 읽은 가장 좋은 해결책은 &lt;a href=&quot;http://www.cs.toronto.edu/%7Eavner/teaching/263/A/2sol.pdf&quot; rel=&quot;nofollow noreferrer&quot;&gt;여기&lt;/a&gt;서 찾을 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 문제를 수정하면 &lt;a href=&quot;https://stackoverflow.com/users/183406/meriton&quot;&gt;메리트론&lt;/a&gt;의 답변에 매우 가깝습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;알고리즘의 세 번째 단계에서 &lt;strong&gt;하위 트리의 높이가 왼쪽 트리와 같은 노드에 도달할 때까지 왼쪽을 탐색&lt;/strong&gt;합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것이 항상 가능한 것은 아닙니다(반례 이미지 참조).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 단계를 수행하는 올바른 방법은 높이가 있는 하위 트리에 대한 두 가지 찾기입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;h&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;h+1&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어디에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;h&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;왼쪽 나무의 높이입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/DGu4t.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/DGu4t.png&quot; alt=&quot;counterexample&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 생각에 여러분은 단지 한 나무를 걷고 (바라건대 작은 나무를) 그 나무의 각각의 요소를 다른 나무에 개별적으로 추가하기만 하면 될 것 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;AVL 삽입/삭제 작업은 한 번에 전체 하위 트리 추가를 처리하도록 설계되지 않았습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/2037212/concatenating-merging-joining-two-avl-trees&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>c</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/751</guid>
      <comments>https://fileupload.tistory.com/751#entry751comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:16:36 +0900</pubDate>
    </item>
    <item>
      <title>PHP에서 동적 정적 메서드 호출?</title>
      <link>https://fileupload.tistory.com/750</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PHP에서 동적 정적 메서드 호출?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PHP 경험이 있는 분이 아래 사항을 도와주실 수 있을까요?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내 코드 어딘가에, 나는 비인스턴트 클래스 내의 공개 정적 메서드에 대한 호출이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$result = myClassName::myFunctionName();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 그런 수업을 많이 해서 사용자의 언어에 맞게 정확한 수업명을 정했으면 좋겠습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;즉, 다음과 같은 것이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$language = 'EN';
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;... 그리고 나는 다음과 같은 일을 해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$result = myClassName_EN::myFunctionName();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언어를 함수의 매개 변수로 전달하여 하나의 공통 클래스 안에서 다룰 수 있다는 것을 알고 있지만 여러 가지 이유로 다른 해결책을 원합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이게 말이 돼요, 누구?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;감사해요.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://php.net/manual/en/function.call-user-func.php&quot; rel=&quot;noreferrer&quot;&gt;call_user_func&lt;/a&gt; 함수 사용:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://php.net/manual/en/function.call-user-func.php&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;http://php.net/manual/en/function.call-user-func.php&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;call_user_func('myClassName_' . $language . '::myFunctionName');
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신이 할 수 있다고 &lt;em&gt;생각&lt;/em&gt;합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$classname = 'myClassName_' . $language;
$result = $classname::myFunctionName();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이를 &lt;a href=&quot;http://uk3.php.net/manual/en/functions.variable-functions.php&quot; rel=&quot;noreferrer&quot;&gt;가변 함수&lt;/a&gt;라고 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;공장에서 당신이 필요로 하는 수업을 만드는 것을 캡슐화하겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 하면 기본 이름을 변경하거나 언어를 올바른 클래스로 매핑하는 규칙을 변경해야 할 때 하나의 진입점을 갖게 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    class YourClassFactory {

        private $_language;
        private $_basename = 'yourclass';

        public YourClassFactory($language) {
            $this-&amp;gt;_language = $language;
        }

        public function getYourClass() {
            return $this-&amp;gt;_basename . '_' . $this-&amp;gt;_language;
        }    
    } 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용해야 할 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$yourClass = $yourClassFactoryInstance-&amp;gt;getYourClass();
$yourClass::myFunctionName();
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;temuri의 말처럼 '$className::functionName'을(를) 시도하면 구문 분석 오류가 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;구문 분석 오류: 구문 오류, 예기치 않은 T_PAAMAYIM_NEKUDOTAYIM...&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 경우(2개의 인수가 있는 정적 방법), 가장 좋은 해결책은 2개의 배열이 있는 &lt;a href=&quot;http://md1.php.net/call_user_func_array&quot; rel=&quot;noreferrer&quot;&gt;call_user_func_array&lt;/a&gt;를 사용하는 것입니다(nikc.org 에서 제안하는 바와 같이).&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$result = call_user_func_array(array($className, $methodName), array($ard1, $arg2));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;BR&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;비록 당신이 처리하는 방식이 매우 나쁜 생각이라고 생각하지만, 해결책이 있을 수도 있다고 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$className = 'myClassName_'.$language;
$result = $className::myFunctionName();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 이것이 당신이 원하는 것이라고 생각합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 작업을 쉽게 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php

class B {

    public static $t = 5;

    public static function t($h) {
        return &quot;Works!&quot; . $h;
    }
}

$g = 't';
$class = 'B';

echo $class::$g('yes'); //Works! Yes
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 PHP 5.2 &amp;gt;=에서 테스트하면 잘 될 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;질문을 이해할 수 있는 한, &lt;a href=&quot;http://php.net/manual/en/function.get-class.php&quot; rel=&quot;nofollow noreferrer&quot;&gt;get_class&lt;/a&gt; 함수를 사용하여 할 수 있는 클래스 이름을 구하셔야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;반면, &lt;a href=&quot;http://php.net/manual/en/book.reflection.php&quot; rel=&quot;nofollow noreferrer&quot;&gt;Reflection 클래스&lt;/a&gt;는 OOP 방식으로 메소드, 인수 등과 관련하여 유용하게 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같은 솔루션:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$yourClass::myFunctionName();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;작동하지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PHP에서 구문 분석 오류가 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;불행하게도, 유일한 방법은 매우 &lt;strong&gt;느리게&lt;/strong&gt; 사용하는 것입니다.&lt;/font&gt;&lt;/font&gt; &lt;code&gt;call_user_func()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오래된 스레드라는 것은 알지만 PHP 5.3.0 현재 &lt;a href=&quot;http://php.net/manual/en/function.forward-static-call.php&quot; rel=&quot;nofollow&quot;&gt;forward_static_call&lt;/a&gt;을 사용해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$result = forward_static_call(array('myClassName_EN', 'myFunctionName'));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;$language 변수를 사용하면 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$result = forward_static_call(array('myClassName_' . $language, 'myFunctionName'));
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/2108795/dynamic-static-method-call-in-php&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>php</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/750</guid>
      <comments>https://fileupload.tistory.com/750#entry750comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:16:30 +0900</pubDate>
    </item>
    <item>
      <title>오라클에서 id의 중복 행마다 하나의 레코드만 얻는 방법은?</title>
      <link>https://fileupload.tistory.com/749</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오라클에서 id의 중복 행마다 하나의 레코드만 얻는 방법은?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내가 이 테이블을 가지고 있다고 가정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;group_id | image | image_id |
-----------------------------
23        blob       1
23        blob       2
23        blob       3
21        blob       4
21        blob       5
25        blob       6
25        blob       7
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;각 그룹 ID 중 1개만 결과를 얻는 방법은?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 경우 하나의 그룹 id에 대해 여러 이미지가 있을 수 있으며, 나는 단지 각 그룹 &lt;strong&gt;id&lt;/strong&gt;의 결과 하나를 원합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 구별을 시도했지만 나는 group_id만 얻을 것입니다. 이미지에 대한 max도 작동하지 않습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Oracle에는 작동하는 표준 Aggregate 함수가 &lt;strong&gt;없습니다&lt;/strong&gt;.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;BLOB&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;s, 그래서&lt;/font&gt;&lt;/font&gt;&lt;code&gt;GROUP BY&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;해결책이 안 될 겁니다&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 기준으로 시도해 보십시오.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ROW_NUMBER()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;query 아래에&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT inn.group_id, inn.image, inn.image_id
FROM
(
    SELECT t.group_id, t.image, t.image_id, 
        ROW_NUMBER() OVER (PARTITION BY t.group_id ORDER BY t.image_id) num
    FROM theTable t
) inn
WHERE inn.num = 1;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위는 첫번째를 반환해야 합니다(기준).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;image_id&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;) 그룹별 행을 지정합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://sqlfiddle.com/#!4/ff076/1&quot; rel=&quot;noreferrer&quot;&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL Fiddle&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;SELECT  group_id, image, image_id
FROM    a_table
WHERE   (group_id, image_id) IN
        (
            SELECT  group_id, MIN(image_id)
            FROM    a_table
            GROUP   BY
                    group_id
        )
;
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;select * from 
  (select t1.*,
   ROW_NUMBER() OVER (PARTITION BY group_id ORDER BY group_id desc) as seqnum
   from tablename t1) 
where seqnum=1;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/19920243/how-to-get-only-one-record-for-each-duplicate-rows-of-the-id-in-oracle&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>Oracle</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/749</guid>
      <comments>https://fileupload.tistory.com/749#entry749comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:16:23 +0900</pubDate>
    </item>
    <item>
      <title>PowerShell로 이메일 보내는 방법</title>
      <link>https://fileupload.tistory.com/748</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PowerShell로 이메일 보내는 방법&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PowerShell에서 이메일을 보내고 싶어서 다음 명령을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$EmailFrom = &quot;customer@yahoo.com&quot;
$EmailTo = &quot;receiver@ymail.com&quot;  
$Subject = &quot;today date&quot;
$Body = &quot;TODAY SYSTEM DATE=01/04/2016  SYSTEM TIME=11:32:05.50&quot;
$SMTPServer = &quot;smtp.mail.yahoo.com&quot;
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)   
$SMTPClient.EnableSsl = $true    
$SMTPClient.Credentials = New-Object 
System.Net.NetworkCredential(&quot;customer@yahoo.com&quot;, &quot;password&quot;)    
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 명령어는 Yahoo 메일이나 Outlook 메일에서는 작동하지 않았지만 Gmail에서는 작동합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 잘못한 게 있나요?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 코드 조각이 저에게 정말 적합합니다.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$Username = &quot;MyUserName&quot;;
$Password = &quot;MyPassword&quot;;
$path = &quot;C:\attachment.txt&quot;;

function Send-ToEmail([string]$email, [string]$attachmentpath){

    $message = new-object Net.Mail.MailMessage;
    $message.From = &quot;YourName@gmail.com&quot;;
    $message.To.Add($email);
    $message.Subject = &quot;subject text here...&quot;;
    $message.Body = &quot;body text here...&quot;;
    $attachment = New-Object Net.Mail.Attachment($attachmentpath);
    $message.Attachments.Add($attachment);

    $smtp = new-object Net.Mail.SmtpClient(&quot;smtp.gmail.com&quot;, &quot;587&quot;);
    $smtp.EnableSSL = $true;
    $smtp.Credentials = New-Object System.Net.NetworkCredential($Username, $Password);
    $smtp.send($message);
    write-host &quot;Mail Sent&quot; ; 
    $attachment.Dispose();
 }
Send-ToEmail  -email &quot;reciever@gmail.com&quot; -attachmentpath $path;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 이것을(를)&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Send-MailMessage -To hi@abc.com -from hi2@abc.com -Subject 'hi' -SmtpServer 10.1.1.1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;간단히 Gmail smtp를 사용하시면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음은 첨부 파일과 함께 gmail 메시지를 보내는 파워셸 코드입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    $Message = new-object Net.Mail.MailMessage 
    $smtp = new-object Net.Mail.SmtpClient(&quot;smtp.gmail.com&quot;, 587) 
    $smtp.Credentials = New-Object System.Net.NetworkCredential(&quot;From@gmail.com&quot;, &quot;password&quot;); 
    $smtp.EnableSsl = $true 
    $smtp.Timeout = 400000  
    $Message.From = &quot;From@gmail.com&quot; 
    $Message.To.Add(&quot;To@gmail.com&quot;) 
    $Message.Attachments.Add(&quot;C:\foo\attach.txt&quot;) 
    $smtp.Send($Message)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;보낸 사람 Google 계정(From@gmail.com )에서,&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Google Account Security Dashboard(구글 계정 보안 대시보드)에서 보안이 덜한 앱에 대한 액세스를 설정했는지 확인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마지막으로 이 스크립트를 메일로 저장합니다.ps1&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;명령 프롬프트 또는 배치 파일에서 아래 스크립트 단순 실행을 호출하려면:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    Powershell.exe -executionpolicy remotesigned -File mail.ps1
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본적으로 큰 첨부 파일 전송의 경우 시간 초과는 약 100초 정도입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 대본에서는 5분에서 6분 정도로 늘어납니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;EnableSsl을 false로 설정해야 하는 경우가 있습니다(이 경우 네트워크를 통해 메시지가 암호화되지 않은 상태로 전송됨).&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/36355271/how-to-send-email-with-powershell&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>powershell</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/748</guid>
      <comments>https://fileupload.tistory.com/748#entry748comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:16:16 +0900</pubDate>
    </item>
    <item>
      <title>CSS to set A4 paper size</title>
      <link>https://fileupload.tistory.com/747</link>
      <description>&lt;h2&gt;CSS to set A4 paper size&lt;/h2&gt;
&lt;p&gt;I need simulate an A4 paper in web and allow to print this page as it is show on browser (Chrome, specifically). I set the element size to 21cm x 29.7cm, but when I send to print (or print preview) it clip my page.&lt;/p&gt; 
&lt;p&gt;See this &lt;a href=&quot;https://jsfiddle.net/2wk6Q/1/&quot; rel=&quot;noreferrer&quot;&gt;&lt;strong&gt;Live example&lt;/strong&gt;&lt;/a&gt;!&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;true&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-css lang-css prettyprint-override&quot;&gt;&lt;code&gt;body {
  margin: 0;
  padding: 0;
  background-color: #FAFAFA;
  font: 12pt &quot;Tahoma&quot;;
}

* {
  box-sizing: border-box;
  -moz-box-sizing: border-box;
}

.page {
  width: 21cm;
  min-height: 29.7cm;
  padding: 2cm;
  margin: 1cm auto;
  border: 1px #D3D3D3 solid;
  border-radius: 5px;
  background: white;
  box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
}

.subpage {
  padding: 1cm;
  border: 5px red solid;
  height: 256mm;
  outline: 2cm #FFEAEA solid;
}

@page {
  size: A4;
  margin: 0;
}

@media print {
  .page {
    margin: 0;
    border: initial;
    border-radius: initial;
    width: initial;
    min-height: initial;
    box-shadow: initial;
    background: initial;
    page-break-after: always;
  }
}&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;div class=&quot;book&quot;&amp;gt;
  &amp;lt;div class=&quot;page&quot;&amp;gt;
    &amp;lt;div class=&quot;subpage&quot;&amp;gt;Page 1/2&amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;div class=&quot;page&quot;&amp;gt;
    &amp;lt;div class=&quot;subpage&quot;&amp;gt;Page 2/2&amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt; 
&lt;p&gt;I think I'm forgetting something. But what would it be?&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Chrome&lt;/strong&gt;: clipping page, double page (&lt;em&gt;it's just what I need it to work&lt;/em&gt;)&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Firefox&lt;/strong&gt;: it works perfectly.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;IE10&lt;/strong&gt;: believe it or not, it's perfect!&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Opera&lt;/strong&gt;: very buggy on print preview&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것을 좀 더 알아봤는데 실제 문제는 할당에 있는 것 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;initial&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;호출하다, 호출하다, 호출하다, 호출하다, 호출하다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;width&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아래에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;print&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;미디어 룰&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;크롬에 있는 것 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;width: initial&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;에서&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.page&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;요소는 특정 길이 값이 정의되지 않은 경우 페이지 내용의 &lt;em&gt;&lt;strong&gt;축척&lt;/strong&gt;&lt;/em&gt; 결과를 가져옵니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;width&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;부모 요소 중 하나(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;width: initial&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 경우에는 하기로 결정합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;width: auto&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;... 그러나 실제로 아래에 정의된 크기보다 작은 값.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@page&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;규칙은 동일한 문제를 야기합니다).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 내용이 페이지에 비해 &lt;em&gt;&lt;strong&gt;너무 길&lt;/strong&gt;&lt;/em&gt; 뿐만 아니라(약), 페이지 패딩도 처음보다 약간 더 길 것입니다(아래 내용을 렌더링하는 것 같습니다).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;width: auto&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;의 너비로 전체 콘텐츠를 ~의 너비까지 축척하지만 이상하게도 동일한 축척 계수가 너비가 )보다 작은 콘텐츠에 적용됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 문제를 해결하려면 간단하게&lt;/font&gt;&lt;/font&gt;&lt;code&gt;print&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;미디어 규칙은 A4 용지 너비와 높이를 다음에 할당합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;html, body&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면 직접&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.page&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 이 경우는 피합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;initial&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;키워드.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h3&gt;&lt;a href=&quot;http://jsfiddle.net/mturjak/2wk6Q/1949/&quot; rel=&quot;noreferrer&quot;&gt;&lt;strong&gt;DEMO&lt;/strong&gt;&lt;/a&gt;&lt;/h3&gt; 
&lt;pre&gt;&lt;code&gt;@page {
  size: A4;
  margin: 0;
}
@media print {
  html, body {
    width: 210mm;
    height: 297mm;
  }
  /* ... the rest of the rules ... */
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;sup&gt;&lt;strong&gt;This seems to keep everything else the way it is in your original CSS and fix the problem in Chrome (tested in different versions of Chrome under Windows, OS X and Ubuntu).&lt;/strong&gt;&lt;/sup&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;CSS&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;body {
  background: rgb(204,204,204); 
}
page[size=&quot;A4&quot;] {
  background: white;
  width: 21cm;
  height: 29.7cm;
  display: block;
  margin: 0 auto;
  margin-bottom: 0.5cm;
  box-shadow: 0 0 0.5cm rgba(0,0,0,0.5);
}
@media print {
  body, page[size=&quot;A4&quot;] {
    margin: 0;
    box-shadow: 0;
  }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;HTML&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;page size=&quot;A4&quot;&amp;gt;&amp;lt;/page&amp;gt;
&amp;lt;page size=&quot;A4&quot;&amp;gt;&amp;lt;/page&amp;gt;
&amp;lt;page size=&quot;A4&quot;&amp;gt;&amp;lt;/page&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;http://jsfiddle.net/oyvhm4p0/&quot;&gt;&lt;strong&gt;DEMO&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/cognitom/paper-css&quot; rel=&quot;noreferrer&quot;&gt;https://github.com/cognitom/paper-css&lt;/a&gt; seems to solve all my needs.&lt;/p&gt; 
&lt;h1&gt;Paper CSS for happy printing&lt;/h1&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;Front-end printing solution - previewable and live-reloadable!&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p&gt;ReferenceURL : &lt;a href=&quot;https://stackoverflow.com/questions/16649943/css-to-set-a4-paper-size&quot; target=&quot;_blank&quot;&gt;https://stackoverflow.com/questions/16649943/css-to-set-a4-paper-size&lt;/a&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>css</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/747</guid>
      <comments>https://fileupload.tistory.com/747#entry747comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:16:10 +0900</pubDate>
    </item>
    <item>
      <title>파워셸: Get-Item vs Get-ChildItem</title>
      <link>https://fileupload.tistory.com/746</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파워셸: Get-Item vs Get-ChildItem&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 다음의 차이점을 이해하고 싶습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Get-Item&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Get-ChildItem&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 한 가지 예로 가능한 경우.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Get-Item&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;지정한 위치에서 항목을 가져옵니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Get-Item .\foo
# returns the item foo
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Get-Child 항목&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하나 이상의 지정된 위치에 있는 항목 및 하위 항목을 가져옵니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Get-ChildItem .\foo
# returns all of the children within foo
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;em&gt;&lt;font papago-translate=&quot;translated&quot;&gt;참고: Get-ChildItem은 자식 디렉토리로 반복될 수도 있습니다.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Get-ChildItem .\foo -Recurse
# returns all of the children within foo AND the children of the children
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/UHJDy.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/UHJDy.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/LDKVz.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/LDKVz.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/SJ6OW.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/SJ6OW.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 당신이 이런 폴더를 가지고 있다면.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Folder
├─ File-A
└─ File-B
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아이템이 폴더일 경우,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Get-ChildItem&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;항목의 자식을 반환합니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre class=&quot;lang-bsh prettyprint-override&quot;&gt;&lt;code&gt;Get-Item Folder
# Folder

Get-ChildItem Folder
# File-A File-B
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;항목이 폴더가 아닌 경우,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Get-ChildItem&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아이템을 반환합니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre class=&quot;lang-bsh prettyprint-override&quot;&gt;&lt;code&gt;Get-Item Folder\File-A
# File-A

Get-ChildItem Folder\File-A
# File-A
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현재 디렉터리 가져오기&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Get-Item .
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현재 디렉터리에 있는 모든 항목 가져오기&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# use Get-Item
Get-Item *
# or use Get-ChildItem
Get-ChildItem
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;모든 txt 파일 가져오기&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# use Get-Item
Get-Item *.txt
# or use Get-ChildItem
Get-ChildItem *.txt
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;참조:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Management/Get-Item?view=powershell-5.1&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://learn.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Management/Get-Item?view=powershell-5.1&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Management/Get-ChildItem?view=powershell-5.1&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://learn.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Management/Get-ChildItem?view=powershell-5.1&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/38663391/powershell-get-item-vs-get-childitem&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>powershell</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/746</guid>
      <comments>https://fileupload.tistory.com/746#entry746comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:16:02 +0900</pubDate>
    </item>
    <item>
      <title>PHP PDO 및 MySQLi</title>
      <link>https://fileupload.tistory.com/745</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PHP PDO 및 MySQLi&lt;/font&gt;&lt;/h2&gt;
&lt;div&gt; 
 &lt;aside class=&quot;s-notice s-notice__info post-notice js-post-notice mb16&quot; role=&quot;status&quot;&gt; 
  &lt;div class=&quot;d-flex fd-column fw-nowrap&quot;&gt; 
   &lt;div class=&quot;d-flex fw-nowrap&quot;&gt; 
    &lt;div class=&quot;flex--item wmn0 fl1 lh-lg&quot;&gt; 
     &lt;div class=&quot;flex--item fl1 lh-lg&quot;&gt; 
      &lt;div&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;b&gt;이 질문에는 이미 다음&lt;/b&gt;과 같은 &lt;b&gt;답변이 있습니다&lt;/b&gt;.&lt;/font&gt;&lt;/div&gt; 
     &lt;/div&gt; 
    &lt;/div&gt; 
   &lt;/div&gt; 
   &lt;div class=&quot;flex--item mb0 mt4&quot;&gt; 
    &lt;a href=&quot;/questions/13569/mysqli-or-pdo-what-are-the-pros-and-cons&quot; dir=&quot;ltr&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;mysqli 또는 PDO - 장단점은 무엇입니까?&lt;/font&gt;&lt;/a&gt; 
    &lt;span class=&quot;question-originals-answer-count&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(13개 답변)&lt;/font&gt;&lt;/span&gt; 
   &lt;/div&gt; 
   &lt;div class=&quot;flex--item mb0 mt8&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;닫힘&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;span class=&quot;relativetime&quot; title=&quot;2013-07-21 13:00:07Z&quot; papago-attr-id=&quot;1&quot;&gt;10년 전&lt;/span&gt;에.&lt;/font&gt;&lt;/div&gt; 
  &lt;/div&gt; 
 &lt;/aside&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 방금 PHP의 소개 과정을 마쳤고, 스택 오버플로우 포럼 내내 사람들은 PDO, 준비된 문 또는 MYSQLi로 전환할 것을 추천했습니다. 설명서를 잠시 확인했지만 대부분은 제 머리 위로 넘어갔습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 지금까지 mysql_* 함수를 사용해왔기 때문에 이 개념들은 나에게 새로운 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터베이스 특정 작업에 액세스하고 수행하는 데 사용되는 것 같은데 잘 모르겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그렇다면 PDO, 준비된 문과 MySQLi의 차이점은 무엇입니까? 같은 작업을 수행하는 서로 다른 기능입니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스크립트에서 호환되나요, 아니면 &quot;한쪽을 선택하거나 다른쪽을 선택&quot;하나요?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 마지막으로 최고의 성능을 제공하는 것은 무엇입니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;업데이트: 답변 감사합니다. 더 많은 PDO 튜토리얼을 찾아보겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;참고로 다음 게시물도 유용했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/10696696/which-one-is-fast-and-light-mysqli-or-pdo&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;빠르고 가벼운 것 - mysqli와 PDO 중 어느 것입니까?&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/13569/mysqli-or-pdo-what-are-the-pros-and-cons&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;mysqli 또는 PDO - 장단점은 무엇입니까?&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본 수준에서 mysql, mysqli 및 PDO 확장자는 모두 &lt;em&gt;데이터베이스와 어떻게 대화합니까?&lt;/em&gt;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이들은 모두 데이터베이스에 연결하고 데이터베이스에서 데이터를 보내고 가져올 수 있는 기능과 기능을 제공합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터베이스에 대한 여러 연결을 동시에 설정할 수 있지만, 이는 일반적으로 말도 안 되는 일입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;mysql*은 기본적으로 데이터베이스에 연결하고 SQL 쿼리를 전송할 수 있는 매우 간단한 확장입니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;mysqli는 (이름에서 알 수 있듯이) 매개 변수화된 쿼리와 몇 가지 다른 것들을 믹스에 추가함으로써 이것을 개선합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PDO는 여러 데이터베이스 드라이버를 하나의 패키지로 추상화하는 확장으로, 데이터베이스를 전환할 때(적어도 이론적으로는) 데이터베이스 특정 확장을 사용하거나 코드를 다시 쓸 필요 없이 동일한 코드를 사용하여 MySQL, Oracle, MS SQL Server 및 기타 여러 데이터베이스에 연결할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;매개 변수화된 쿼리도 지원합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL을 독점적으로 사용할 것을 알고 있다면 mysqli를 선택하는 것이 좋습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;특히 절차적인 방법으로 사용할 수 있기 때문에 mysql 확장자에서 이미 익숙한 것을 사용할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;OOP에 익숙하지 않다면 도움이 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그렇지 않으면 PDO는 객체 지향적이고 유연한 데이터베이스 커넥터입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;* mysql 확장자는 &lt;a href=&quot;http://www.php.net/manual/en/mysqlinfo.api.choosing.php&quot; rel=&quot;noreferrer&quot;&gt;이제&lt;/a&gt; 더 &lt;a href=&quot;http://www.php.net/manual/en/mysqlinfo.api.choosing.php&quot; rel=&quot;noreferrer&quot;&gt;&lt;strong&gt;이상&lt;/strong&gt;&lt;/a&gt; 사용되지 &lt;a href=&quot;http://www.php.net/manual/en/mysqlinfo.api.choosing.php&quot; rel=&quot;noreferrer&quot;&gt;않으며 나중에 언젠가 제거&lt;/a&gt;될 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것은 그것이 고대적이고, 나쁜 관행들로 가득 차 있고, 현대적인 특징들이 결여되어 있기 때문입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;새 코드를 쓸 때 사용하지 마십시오.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;PDO&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;는 &quot;PHP 데이터 개체&quot;입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 주로 PDO를 사용하기 때문에 PDO의 장점에 대해서만 말할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQL보다 더 많은 데이터베이스에서 작동 가능(중요하지 않을 수 있음)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;컴파일된 C, 그래서 더 빠릅니다 (추정)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;준비된 진술서(다른 진술서들은 이것들을 가지고 있습니다.)&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 마음에 드는 것 같으니 적어도 여기서 많은 도움을 받을 수 있을 겁니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;즉시 설정 및 변경할 수 있는 다양한 페치/오류 처리 모드&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;네가 묻는다&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그렇다면 PDO, 준비된 문과 MySQLi의 차이점은 무엇입니까?&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;code&gt;PDO&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;MySQLi&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;DB 포장지입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&quot;준비된 진술&quot;은 완전히 다른 개념입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여러 번 실행할 수 있는 쿼리를 준비할 수 있으며 매개 변수가 적절하게 지정된 문은 SQL-Injection(증명은 아니지만 SQL-Injection) 안전합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;후자의 이유는 대부분 PDO(또는 MySQLi)를 사용해야 하는 이유이지만 준비된 문은 쿼리에 명확성을 제공하기도 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/* mysql_* version */
mysql_connect(&quot;host&quot;);
$query = &quot;SELECT column FROM db1.t1 WHERE id = &quot;;
foreach ($_GET['id'] as $id) {
   $id = mysql_real_escape_string($id);
   $result = mysql_query($query . &quot;'$id'&quot;;
   while ($row = mysql_fetch_assoc($result)) {
      echo &quot;$row[column]\n&quot;;
   }
}
//NOTE: it would probably be better to store the resource returned by
//mysql_connect and use that consistently (in query/escape)

/* PDO version */
$pdo = new PDO('mysql:host=HOST', 'user', 'pass');
$query = $pdo-&amp;gt;prepare(&quot;SELECT column FROM db1.t1 WHERE id = ?&quot;;
foreach ($_GET['id'] as $id) {
   $query-&amp;gt;execute($id);
   echo $query-&amp;gt;fetch(PDO::FETCH_COLUMN);
}
//Notice that you skip the escape step.
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본적으로 동일한 작업을 수행할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;MySQLi&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 하지만 전 더 좋아요&lt;/font&gt;&lt;/font&gt;&lt;code&gt;PDO&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;의 구문.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그게 더 빠를 수도 있지만, 제가 지어낼 수도 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PEAR도 있고요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;MDB2&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 얘기는 거의 안 나오고 더 많이 나올 겁니다&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;부터&lt;/font&gt;&lt;/font&gt;&lt;code&gt;PDO&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내장되어 있어요, 저는 그것으로 하겠습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신이 익숙하다면.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysql_xxx&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기능들, 그리고 나서 나는 그것으로 이동하는 것으로 시작할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;MySQLi&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대신에 연장합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;원하는 경우 PDO를 대신 사용할 수도 있지만, 이는 여러 데이터베이스를 지원해야 할 경우 처음에만 가치가 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 MySQLi로 전환하는 것이 더 쉬워지고 PDO의 이점을 바로 얻을 수 없기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQLi에서 사용할 수 있는 기능은 거의 유사합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysql_xx&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자가 익숙한 함수입니다. 일반적으로 기존 코드를 가져가서 직접 스왑하는 것이 가능하며 코드는 계속 정상적으로 작동합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;시작하기에 좋은 방법입니다. 코드를 사용하여&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysqli_xxx&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;mysql_xxx' 대신에&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가능하다면 절차 구문보다는 객체지향 구문을 사용하는 것이 좋습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQLi는 두 가지를 모두 지원하며 절차 구문은 사용자가 익숙한 것에 더 가깝지만, 장기적으로는 OO 구문이 더 유연하며, 실제로 사용자가 익숙해지면 크게 다르지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;MySQLi 라이브러리를 사용하는 것으로 코드가 변환되고 기본 사항에 대한 만족도가 높아지면 준비된 설명문과 같은 고급 기능을 사용할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 일단 기본적인 것부터 편하게 생각하세요.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신과 같은 관점에서.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제 입장에서는 (용도에 따라) 차이가 별로 없다고 생각합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PDO는 단순히 다른 데이터베이스 api의 모든 것을 하나로 병합하는 데이터베이스 api인 것 같습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 MS Sql 서버와 MySql 서버에 연결해야 할 경우 PDO api를 호출하여 특정 db의 드라이버를 지정하면 됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 MySQL의 향후 기능과 능력은 PDO에서만 사용할 수 있을 것이라고 생각합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 기본적으로 PDO를 사용하여 모든 최신 기능에 액세스할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PDO의 큰 장점 중 하나는 플랫폼 독립성입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;즉, 모든 함수 호출을 다시 녹음할 필요 없이 어느 시점에 다른 DBMS로 마이그레이션할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 일반적으로 Java(JDBC를 통해), .Net(ADO) 및 대부분의 다른 환경에서 작업이 수행되는 방식입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;DBMS 자체를 전환할 수 있다는 것뿐만 아니라, 학습할 수 있는 API가 하나밖에 없다는 것이 장점입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;귀하의 질문과 관련하여 PDO 계층은 준비된 진술을 수행할 수 있는 기능을 제공합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;준비된 문 뒤에 있는 개념은 실행 시간이 지나야 알 수 있는 SQL 문의 부분에 대한 자리 표시자를 만드는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;많은 학습자들이 SQL을 문자열로 생성하는 것으로 시작하며, 이 문자열은 mysqli::query($someQuery)라고 불러 실행됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 여러 가지 이유로 문제가 되며, 그 중 가장 눈에 띄는 것은 SQL 주입에 대한 취약성입니다(유사한 질문과 답변은 stackoverflow.com/questions/5315351 참조).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;PDO를 사용하면 SQL 주입과 따옴표, 백슬래시 등의 문자 처리 문제를 모두 피할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;결과적으로 코드가 더 안전하고 판독 가능하며 예측 가능합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;mysqli를 사용하는 방법을 이미 파악했다면 PDO를 사용하는 것도 크게 다르지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위의 링크된 질문 및 답변은 유용한 가이드 역할을 해야 하는 PDO 준비문을 사용하여 제출된 쿼리의 예를 보여줍니다.&lt;/font&gt;&lt;/p&gt;&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그렇다면 PDO, 준비된 문과 MySQLi의 차이점은 무엇입니까? 같은 작업을 수행하는 서로 다른 기능입니까?&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 차이는 꽤 간단합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt; &lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;PDO&lt;/strong&gt;는 &lt;strong&gt;준비된 문과&lt;/strong&gt; 함께 &lt;strong&gt;사용&lt;/strong&gt;할 수 있고 mysqli는 &lt;strong&gt;사용&lt;/strong&gt;할 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;네이티브 준비된 문을 사용하여 두 API로 몇 가지 일반적인 쿼리를 실행하면 그 차이를 명확하게 알 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/10703426/php-pdo-and-mysqli&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>MySQL</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/745</guid>
      <comments>https://fileupload.tistory.com/745#entry745comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:15:54 +0900</pubDate>
    </item>
    <item>
      <title>jQuery 플러그인을 확장하는 가장 좋은 방법</title>
      <link>https://fileupload.tistory.com/744</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery 플러그인을 확장하는 가장 좋은 방법&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 제가 필요한 것의 약 75%를 수행하는 기존의 jQuery 플러그인을 확장하고자 하는 꽤 새로운 jQuery 사용자입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 이것에 대해 숙제를 하려고 노력했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스택 오버플로에 대한 다음 질문을 확인했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/757515/extending-a-jquery-plugin&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery 플러그인 확장&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/1149274/extend-a-jquery-plugin&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery 플러그인 확장&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/1885364/jquery-extend-plugin-question&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery: 확장 플러그인 질문&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;확장 방법을 읽어 &lt;a href=&quot;http://asimilia.wordpress.com/2008/12/17/jquery-extend-confusion/&quot; rel=&quot;noreferrer&quot;&gt;보았습니다&lt;/a&gt;.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하지만 이 모든 숙제들이 저를 혼란스럽게 만들었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 전체 &lt;a href=&quot;http://arshaw.com/fullcalendar/&quot; rel=&quot;noreferrer&quot;&gt;캘린더&lt;/a&gt; 플러그인으로 작업하고 있으며 일부 동작을 수정하고 새로운 이벤트 후크를 추가해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;플러그인 클로저 자체에서 이 작업을 수행하는 데 문제가 있습니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 뭔가 명백한 걸 놓치고 있는 건가요?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이상적으로 우리는 플러그인 코드로부터 우리의 코드를 분리하여 업그레이드 가능성을 허락할 수 있을 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도움을 주시면 대단히 감사하겠습니다. 특히 제가 정보를 놓치고 있는 부분에 대한 조언이나 다른 스택 오버플로 질문에 이미 제시된 솔루션이 타당한지에 대한 의견을 주시면 감사하겠습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저에게 그들은 서로 모순되고 저는 여전히 혼란에 빠져있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jquery UI 플러그인을 확장하려고 하는 동일한 문제가 발생했습니다. 여기 제가 찾은 해결책이 있습니다(jquery.ui를 통해 발견했습니다).&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;widget.js):&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(기능($) {&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;/**&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;*  네임스페이스: 플러그인이 아래에 위치한 네임스페이스&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;*  pluginName: 플러그인 이름&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;*/&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;var 확장 메서드 = {&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;/*&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;* 요소의 ID를 검색합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;* 이는 기존 플러그인 내의 일부 컨텍스트입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;*/&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;showId: 함수(){&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;반환합니다. element[0].id;&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;}&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;};&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;$.extend(true, $[ 네임스페이스]][pluginName].prototype,&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;확장 방법);&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;}(jQuery);&lt;/font&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것이 도움이 되기를 바랍니다. 질문이 있으시면 물어보세요.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저도 같은 문제를 안고 이곳에 왔는데, 그때 재러드 스콧의 대답이 저에게 영감을 주었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(function($) {

    var fullCalendarOrg = $.fn.fullCalendar;

    $.fn.fullCalendar = function(options) {
        if(typeof options === &quot;object&quot;) {
            options = $.extend(true, options, {
                // locale
                isRTL: false,
                firstDay: 1,
                // some more options
            });
        }

        var args = Array.prototype.slice.call(arguments,0);
        return fullCalendarOrg.apply(this, args);
    }

})(jQuery);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;플러그인이 많은 경우 방법이 보호/비공개(즉, 폐쇄 범위에서)된다는 것을 발견했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;메소드/함수의 기능을 수정해야 하는 경우 포크를 사용할 의사가 없는 한 운이 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 메소드/기능을 변경할 필요가 없다면 다음을 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$.extend($.fn.pluginName, {/*your methods/properties*/};&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이전에 내가 했던 또 다른 일은 플러그인을 확장하는 대신 플러그인을 내 플러그인의 속성으로 사용하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;결국 확장하고자 하는 플러그인이 어떻게 코딩되는지가 중요합니다.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;$.fn.APluginName=function(param1,param2)
{
  return this.each(function()
    {
      //access element like 
      // var elm=$(this);
    });
}

// sample plugin
$.fn.DoubleWidth=function()
  {
    return this.each(function()
      {
        var _doublWidth=$(this).width() * 2;
        $(this).width(_doubleWidth);
      });
  }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;//&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div style=&quot;width:200px&quot; id='div!'&amp;gt;some text&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;// 사용자 지정 플러그인 사용&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('#div1').DoubleWidth();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;/// 위에서 작성된 유틸리티 유형은 주로 돔 요소로 작동합니다. ////////////////////////////////&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(function($){
  var _someLocalVar;
  $.Afunction=function(param1,param2) {
    // do something
  }
})(jquery);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;// 용법 이상의 액세스&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$.Afunction();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;// 이런 종류의 유틸리티들은 보통 자바스크립트를 확장합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery 플러그인을 다시 작성할 때 제 접근 방식은 접근해야 하는 방법과 변수를 옵션 블록으로 이동하고 '확장'을 호출하는 것이었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// in the plugin js file
$.jCal = function (target, opt) {
    opt = $.extend({
       someFunctionWeWantToExpose: function() {
           // 'this' refers to 'opt', which is where are our required members can be found
       }
    }

    // do all sorts of things here to initialize

    return opt; // the plugin initialisation returns an extended options object
}


////// elsewhere /////

var calendar = $(&quot;#cal1&quot;).jCal();
calendar.someFunctionWeWantToExpose();
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Jared Scott의 답변과 유사한 예이지만, 원래 객체 프로토타입의 복사본을 만드는 것은 상위 메서드를 호출할 수 있는 기능을 제공합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(function($) {

    var original = $.extend(true, {}, $.cg.combogrid.prototype);

    var extension = {
        _renderHeader: function(ul, colModel) {
            original._renderHeader.apply(this, arguments);

            //do something else here...
        }
    };

    $.extend(true, $.cg.combogrid.prototype, extension);

})(jQuery);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery Widget Factory를 사용하여 jQuery Widget을 확장할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(function ($) {
    &quot;use strict&quot;;

    define([
        &quot;jquery&quot;,
        &quot;widget&quot;
    ], function ($, widget) {
        $.widget(&quot;custom.yourWidget&quot;, $.fn.fullCalendar, {
            yourFunction: function () {
                // your code here
            }
        });

        return $.custom.yourWidget;
    });
}(jQuery));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자세한 내용은 jQuery Documentation을 확인해 보십시오.&lt;/font&gt;&lt;/font&gt;&lt;br&gt; &lt;font papago-translate=&quot;splitted&quot;&gt;&lt;a href=&quot;https://api.jqueryui.com/jquery.widget/&quot; rel=&quot;nofollow&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위젯 팩토리 API&lt;/font&gt;&lt;/a&gt;&lt;/font&gt;&lt;br&gt; &lt;font papago-translate=&quot;splitted&quot;&gt;&lt;a href=&quot;https://learn.jquery.com/jquery-ui/widget-factory/extending-widgets/&quot; rel=&quot;nofollow&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위젯 팩토리를 사용하여 위젯 확장&lt;/font&gt;&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/2050985/best-way-to-extend-a-jquery-plugin&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>jquery</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/744</guid>
      <comments>https://fileupload.tistory.com/744#entry744comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:15:47 +0900</pubDate>
    </item>
    <item>
      <title>XML에서 &amp;quot;xmlns&amp;quot;는 무엇을 의미합니까?</title>
      <link>https://fileupload.tistory.com/743</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XML에서 &quot;xmlns&quot;는 무엇을 의미합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XML 파일에서 다음 행을 보았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 또한 본적이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;xmlns&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 많은 XML 파일에서 볼 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것은 무엇일까요?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/XML_namespace&quot; rel=&quot;noreferrer&quot;&gt;XML 네임스페이스&lt;/a&gt;를 의미합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본적으로 &lt;a href=&quot;http://en.wikipedia.org/wiki/XML&quot; rel=&quot;noreferrer&quot;&gt;XML&lt;/a&gt;의 모든 요소(또는 속성)는 요소의 이름을 &quot;정격화&quot;하는 방법인 네임스페이스에 속합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신과 나 둘 다 우리만의 XML을 발명한다고 상상해 보세요. 당신은 사람들을 묘사하기 위해 XML을 발명하고, 나는 도시를 묘사하기 위해 나를 발명합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;우리 둘 다 다음과 같은 원소를 포함합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;name&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 당신의 것은 그 사람의 이름을 가리키고, 나의 것은 도시 이름을 가리키고 있습니다. 네, 좀 작위적인 것 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;person&amp;gt;
    &amp;lt;name&amp;gt;Rob&amp;lt;/name&amp;gt;
    &amp;lt;age&amp;gt;37&amp;lt;/age&amp;gt;
    &amp;lt;homecity&amp;gt;
        &amp;lt;name&amp;gt;London&amp;lt;/name&amp;gt;
        &amp;lt;lat&amp;gt;123.000&amp;lt;/lat&amp;gt;
        &amp;lt;long&amp;gt;0.00&amp;lt;/long&amp;gt;
    &amp;lt;/homecity&amp;gt;
&amp;lt;/person&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;만약 우리의 두 XML이 하나의 문서로 합쳐진다면, 우리는 두 이름을 어떻게 구분할 것입니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위에서 보시는 것처럼, 두 가지가 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;name&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;요소들이 있지만 둘 다 다른 의미를 가지고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그에 대한 답은 당신과 저 모두 XML에 네임스페이스를 할당하는 것이며, 이를 통해 우리는 고유한 것을 만들 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;personxml:person xmlns:personxml=&quot;http://www.your.example.com/xml/person&quot;
                  xmlns:cityxml=&quot;http://www.my.example.com/xml/cities&quot;&amp;gt;
    &amp;lt;personxml:name&amp;gt;Rob&amp;lt;/personxml:name&amp;gt;
    &amp;lt;personxml:age&amp;gt;37&amp;lt;/personxml:age&amp;gt;
    &amp;lt;cityxml:homecity&amp;gt;
        &amp;lt;cityxml:name&amp;gt;London&amp;lt;/cityxml:name&amp;gt;
        &amp;lt;cityxml:lat&amp;gt;123.000&amp;lt;/cityxml:lat&amp;gt;
        &amp;lt;cityxml:long&amp;gt;0.00&amp;lt;/cityxml:long&amp;gt;
    &amp;lt;/cityxml:homecity&amp;gt;
&amp;lt;/personxml:person&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 XML에 대한 충분한 검증을 마쳤습니다. 각 항목에 대해 명확한 정보가 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;name&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;요소 수단&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;시작하는 모든 태그가&lt;/font&gt;&lt;/font&gt;&lt;code&gt;personxml:&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;는 당신의 XML에 속하는 태그들이고, 모든 태그들은 시작합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cityxml:&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나의 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;몇 가지 유의할 점이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;네임스페이스 선언을 제외하면 기본 네임스페이스에 있는 것으로 간주됩니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;식별자 없이 네임스페이스를 선언하는 경우, 즉&lt;/font&gt;&lt;/font&gt;&lt;code&gt;xmlns=&quot;http://somenamespace&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,보다는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;xmlns:rob=&quot;somenamespace&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 문서의 기본 네임스페이스를 지정합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실제 네임스페이스 자체, 종종 &lt;a href=&quot;http://en.wikipedia.org/wiki/Internationalized_Resource_Identifier&quot; rel=&quot;noreferrer&quot;&gt;IRI&lt;/a&gt;는 실질적인 결과가 아닙니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;고유해야 하기 때문에 사람들은 자신이 소유한 IRI/URI를 선택하는 경향이 있지만 그 이상의 큰 의미는 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;때때로 사용자는 XML에 대한 스키마(정의)를 지정된 IRI에 배치할 수 있지만, 이는 일부 사용자만의 규칙입니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;접두사도 중요하지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;유일하게 중요한 것은 접두사가 정의된 네임스페이스입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;서로 다른 접두사로 시작하는 여러 태그는 모두 동일한 네임스페이스에 매핑된 것으로 간주됩니다.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어, 만약 접두사가&lt;/font&gt;&lt;/font&gt;&lt;code&gt;personxml&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mycityxml&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;둘 다 동일한 네임스페이스에 매핑됩니다(아래 토막글에서와 같이). 주어진 요소에 접두사를 붙이면 문제가 되지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;personxml&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mycityxml&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 둘 다 XML 파서에 의해 같은 것으로 취급될 겁니다&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;중요한 것은 XML 파서는 접두사로 선택한 것을 신경 쓰지 않고 매핑하는 네임스페이스만 신경 쓴다는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;접두사는 네임스페이스를 가리키는 &lt;em&gt;지시문&lt;/em&gt;일 뿐입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;&amp;lt;personxml:person 
     xmlns:personxml=&quot;http://example.com/same/url&quot;
     xmlns:mycityxml=&quot;http://example.com/same/url&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;속성은 정규화될 수 있지만 일반적으로 그렇지 않습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 요소가 아닌 요소에서 네임스페이스를 상속하지 &lt;em&gt;않습니다&lt;/em&gt;(아래 참조).&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 요소 네임스페이스는 상위 요소에서 상속됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다시 말해서 나는 위의 XML을 똑같이 쓸 수 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;person xmlns=&quot;http://www.your.example.com/xml/person&quot;&amp;gt;
    &amp;lt;name&amp;gt;Rob&amp;lt;/name&amp;gt;
    &amp;lt;age&amp;gt;37&amp;lt;/age&amp;gt;
    &amp;lt;homecity xmlns=&quot;http://www.my.example.com/xml/cities&quot;&amp;gt;
        &amp;lt;name&amp;gt;London&amp;lt;/name&amp;gt;
        &amp;lt;lat&amp;gt;123.000&amp;lt;/lat&amp;gt;
        &amp;lt;long&amp;gt;0.00&amp;lt;/long&amp;gt;
    &amp;lt;/homecity&amp;gt;
&amp;lt;/person&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://www.w3.org/TR/REC-xml-names/&quot; rel=&quot;noreferrer&quot;&gt;XML 네임스페이스&lt;/a&gt;를 정의합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예에서 &lt;strong&gt;네임스페이스 접두사&lt;/strong&gt;는 &quot; android&quot;이고 &lt;strong&gt;네임스페이스&lt;/strong&gt; URI는 &quot;http://schemas.android.com/apk/res/android &quot;입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문서에는 다음과 같은 요소가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;네임스페이스 접두사는 전체 네임스페이스 URI에 대한 짧은 이름 별칭을 가진 변수라고 생각합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 XML 파서가 문서를 읽을 때 &quot;의미&quot;에 관해 쓰는 것과 같은 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;font papago-translate=&quot;translated&quot;&gt;참고:&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XML 인스턴스 문서의 네임스페이스 접두사 대신 전체 네임스페이스 URI를 실제로 사용할 수 없습니다.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;네임스페이스에 대한 이 튜토리얼을 확인해보세요: http://www.sitepoint.com/xml-namespaces-explained/&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가장 큰 혼란은 xml 네임스페이스가 어떤 종류의 URL을 가리킨다는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 진실은 이름 공간 아래에서 발명한 사람은&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이렇게 부를 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;xmlns:android=&quot;asjkl;fhgaslifujhaslkfjhliuqwhrqwjlrknqwljk.rho;il&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 고유 식별자일 뿐입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 고유하고 해당 네임스페이스에서 사용된 태그/속성의 규격을 가리킬 수 있는 URL을 지정해야 한다고 설정되어 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;꼭 필요한 것은 아닙니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;왜 독특해야 합니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;네임스페이스의 목적은 네임스페이스가 고유하도록 하는 것이므로, 네임스페이스의 &lt;em&gt;백그라운드&lt;/em&gt;라는 속성을 다른 네임스페이스의 &lt;em&gt;백그라운드&lt;/em&gt;와 구별할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이러한 고유성 때문에 사용자 지정 특성을 만들 경우 이름 충돌이 발생할 것을 걱정할 필요가 없습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;xmlns - xml 네임스페이스.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;요소 이름 충돌을 피하기 위한 방법일 뿐입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어,&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;config xmlns:rnc=&quot;URI1&quot; xmlns:bsc=&quot;URI2&quot;&amp;gt;
  &amp;lt;rnc:node&amp;gt;
      &amp;lt;rnc:rncId&amp;gt;5&amp;lt;/rnc:rncId&amp;gt;
  &amp;lt;/rnc:node&amp;gt;

  &amp;lt;bsc:node&amp;gt;
      &amp;lt;bsc:cId&amp;gt;5&amp;lt;/bsc:cId&amp;gt;
  &amp;lt;/bsc:node&amp;gt;
&amp;lt;/config&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;두개의 다른&lt;/font&gt;&lt;/font&gt;&lt;code&gt;node&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;요소를 하나의 xml 파일에 저장합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;네임스페이스가 없으면 이 파일은 유효하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이름 공간이 있으므로 전역 고유 요소를 가질 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 99%의 경우 이것은 실제로 중요하지 않지만 &lt;a href=&quot;http://en.wikipedia.org/wiki/Semantic_Web&quot; rel=&quot;nofollow noreferrer&quot;&gt;시맨틱 웹&lt;/a&gt;의 관점에서 볼 때 중요해지기 시작합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어, 다른 스킴의 XML 매시업을 해당 스킴을 사용하는 것만으로 만들 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;xmlns&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 예를 들어 친구의 친구를 &lt;a href=&quot;http://en.wikipedia.org/wiki/VCard&quot; rel=&quot;nofollow noreferrer&quot;&gt;vCard&lt;/a&gt; 등으로 매시업합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;sup&gt;&lt;em&gt;&lt;font papago-translate=&quot;translated&quot;&gt;새롭고, &lt;strong&gt;간결&lt;/strong&gt;하며, &lt;strong&gt;완벽&lt;/strong&gt;한 답은 오래된 질문에...&lt;/font&gt;&lt;/em&gt;&lt;/sup&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;xmnls&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;에서는 &lt;a href=&quot;https://www.w3.org/TR/xml-names/&quot; rel=&quot;nofollow noreferrer&quot;&gt;XML Namespaces&lt;/a&gt;를 지원하므로 별도로 개발된 어휘를 이름 충돌 없이 결합할 수 있도록 XML 요소 및 특성 이름을 지정하는 표준 방법을 제공합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XML 네임스페이스의 용도&lt;/font&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XML 네임스페이스를 사용하면 XML 스키마 작성자가 독립적으로 개발된 스키마에서 동일한 요소와 속성 이름을 구별할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URI에 네임스페이스 이름을 기반으로 하는 것은 도메인 이름의 &lt;em&gt;&lt;strong&gt;고유성&lt;/strong&gt;&lt;/em&gt;과 &lt;em&gt;&lt;strong&gt;소유권&lt;/strong&gt;&lt;/em&gt; 측면을 사용하여 이름 충돌을 방지하고(&lt;em&gt;유일성&lt;/em&gt;), 이름 지정 권한(&lt;em&gt;소유권&lt;/em&gt;)을 설정하는 수단으로 활용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;목적&lt;/font&gt;&lt;/font&gt;&lt;code&gt;xmlns&lt;/code&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;code&gt;xmlns&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;는 XML 네임스페이스에서 두 가지 다른 방식으로 사용됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본 네임스페이스 선언&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;&amp;lt;element xmlns=&quot;http://www.example.org&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;라고 선언합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;element&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 그 후의 모든 요소들은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;http://www.example.org&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;&lt;strong&gt;기본적&lt;/strong&gt;&lt;/em&gt;으로 네임스페이스입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;네임스페이스 접두사 선언&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;&amp;lt;ex:element xmlns:ex=&quot;http://www.example.org&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;라고 선언합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ex:element&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 속성&lt;/font&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 후의 요소.&lt;/font&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 후의 요소의 속성.&lt;/font&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;&lt;strong&gt;가 앞&lt;/strong&gt;&lt;/em&gt;에 붙어있는 것들은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;http://www.example.org&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;네임스페이스.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;밑줄&lt;/font&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;xmlns&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;&lt;strong&gt;기본 네임스페이스 선언&lt;/strong&gt;&lt;/em&gt; 또는 &lt;em&gt;&lt;strong&gt;네임스페이스 접두사 선언&lt;/strong&gt;&lt;/em&gt;을 통해 XML과 XML을 안전하게 혼합할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;http://www.example.org&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;충돌 이름을 지정할 염려가 없는 네임스페이스를 제공합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;참고 항목&lt;/font&gt;&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/q/27613891/290085&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XML 네임스페이스 이름 URI를 검색할 수 있어야 합니까?&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/q/50912350/290085&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XML에서 네임스페이스와 접두사의 차이점은 무엇입니까?&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/q/74498114/290085&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;XML의 사양은 무엇입니까?&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/a/25830482/290085&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;em&gt;namespace-well-formed&lt;/em&gt;는 XML에서 무엇을 의미합니까?&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/1181888/what-does-xmlns-in-xml-mean&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>XML</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/743</guid>
      <comments>https://fileupload.tistory.com/743#entry743comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:15:39 +0900</pubDate>
    </item>
    <item>
      <title>Oracle에서 regexp_replace vs translate의 성능?</title>
      <link>https://fileupload.tistory.com/742</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Oracle에서 regexp_replace vs translate의 성능?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;간단한 것은 사용하는 것이 더 나을까요?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;translate&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;CPU 집약도가 낮거나 다음과 같은 경우를 전제로 기능합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;regexp_replace&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;갈 길?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 질문은 &lt;a href=&quot;https://stackoverflow.com/questions/16054892/how-can-i-replace-brackets-to-hyphens-within-oracle-regexp-replace-function&quot;&gt;Oracle REGEXP_REFACE 함수 내에서 괄호를 하이픈으로 교체하려면 어떻게&lt;/a&gt; 해야 &lt;a href=&quot;https://stackoverflow.com/questions/16054892/how-can-i-replace-brackets-to-hyphens-within-oracle-regexp-replace-function&quot;&gt;합니까?&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;단순한 최적화 작업을 진행하고 있다고 생각합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;정규 표현식은 계산 비용이 너무 많이 들어 결과가 나중에 다시 사용되기를 바라며 캐시됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실제로 서로 다른 문자열을 사용하여 변환을 해보면 전문적인 기능이기 때문에 보통의 번역이 자연스럽게 더 빠르다는 것을 알 수 있을 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기에 제 예시가 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;11.1.0.7.0&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SQL&amp;gt; DECLARE
  2     TYPE t IS TABLE OF VARCHAR2(4000);
  3     l       t;
  4     l_level NUMBER := 1000;
  5     l_time  TIMESTAMP;
  6     l_char  VARCHAR2(4000);
  7  BEGIN
  8     -- init
  9     EXECUTE IMMEDIATE 'ALTER SESSION SET PLSQL_OPTIMIZE_LEVEL=2';
 10     SELECT dbms_random.STRING('p', 2000)
 11       BULK COLLECT
 12       INTO l FROM dual
 13     CONNECT BY LEVEL &amp;lt;= l_level;
 14     -- regex
 15     l_time := systimestamp;
 16     FOR i IN 1 .. l.count LOOP
 17        l_char := regexp_replace(l(i), '[]()[]', '-', 1, 0);
 18     END LOOP;
 19     dbms_output.put_line('regex     :' || (systimestamp - l_time));
 20     -- tranlate
 21     l_time := systimestamp;
 22     FOR i IN 1 .. l.count LOOP
 23        l_char := translate(l(i), '()[]', '----');
 24     END LOOP;
 25     dbms_output.put_line('translate :' || (systimestamp - l_time));
 26  END;
 27  /

regex     :+000000000 00:00:00.979305000
translate :+000000000 00:00:00.238773000

PL/SQL procedure successfully completed
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;11.2.0.3.0&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;regex     :+000000000 00:00:00.617290000
translate :+000000000 00:00:00.138205000
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;결론:&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일반적으로 나는 의심합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;translate&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이길 겁니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;SQL의 경우 다음 스크립트를 사용하여 테스트했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;set timing on

select sum(length(x)) from (
  select translate('(&amp;lt;FIO&amp;gt;)', '()[]', '----') x
  from (
    select *
    from dual
    connect by level &amp;lt;= 2000000
  )
);

select sum(length(x)) from (
  select regexp_replace('[(&amp;lt;FIO&amp;gt;)]', '[\(\)\[]|\]', '-', 1, 0) x
  from (
    select *
    from dual
    connect by level &amp;lt;= 2000000
  )
);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고 그들의 성과가&lt;/font&gt;&lt;/font&gt;&lt;code&gt;translate&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;regexp_replace&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;거의 항상 똑같았지만 다른 작업의 비용이 테스트하려는 기능의 비용을 압도할 수도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음으로 PL/SQL 버전을 시도했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;set timing on

declare
  x varchar2(100);
begin
  for i in 1..2500000 loop
    x := translate('(&amp;lt;FIO&amp;gt;)', '()[]', '----');
  end loop;
end;
/

declare
  x varchar2(100);
begin
  for i in 1..2500000 loop
    x := regexp_replace('[(&amp;lt;FIO&amp;gt;)]', '[\(\)\[]|\]', '-', 1, 0);
  end loop;
end;
/
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;translate&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;버전은 10초도 걸리지 않는 반면,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;regexp_replace&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;버전은 약 0.2초 -- 약 2배 빠른 속도(!)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 결과를 바탕으로 SQL과 PL/SQL 모두 성능에 중요한 코드에서 정규 표현을 훨씬 더 자주 사용할 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/16058279/performance-of-regexp-replace-vs-translate-in-oracle&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>Oracle</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/742</guid>
      <comments>https://fileupload.tistory.com/742#entry742comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:15:32 +0900</pubDate>
    </item>
    <item>
      <title>업로드하기 전에 HTML5를 사용하여 이미지 크기 조정</title>
      <link>https://fileupload.tistory.com/741</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;업로드하기 전에 HTML5를 사용하여 이미지 크기 조정&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 스택 오버플로우에 대한 몇 가지 다른 게시물과 이 질문에 답하는 질문을 발견했습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 기본적으로 이 &lt;a href=&quot;https://stackoverflow.com/questions/10333971/html5-pre-resize-images-before-uploading&quot;&gt;게시물&lt;/a&gt;과 같은 것을 실행하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 여기 제 문제가 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사진을 올릴 때 나머지 양식도 함께 제출해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;html은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;form id=&quot;uploadImageForm&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;
  &amp;lt;input name=&quot;imagefile[]&quot; type=&quot;file&quot; id=&quot;takePictureField&quot; accept=&quot;image/*&quot; onchange=&quot;uploadPhotos(\'#{imageUploadUrl}\')&quot; /&amp;gt;
  &amp;lt;input id=&quot;name&quot; value=&quot;#{name}&quot; /&amp;gt;
  ... a few more inputs ... 
&amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이전에는 이미지 크기를 조정할 필요가 없었기 때문에 자바스크립트는 다음과 같이 생겼습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;window.uploadPhotos = function(url){
    var data = new FormData($(&quot;form[id*='uploadImageForm']&quot;)[0]);

    $.ajax({
        url: url,
        data: data,
        cache: false,
        contentType: false,
        processData: false,
        type: 'POST',
        success: function(data){
            ... handle error...
            }
        }
    });
};
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 모든 것이 잘 통했습니다...&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이제 이미지 크기를 조정해야 하니까...&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;업로드된 이미지가 아닌 리사이징된 이미지가 게시되도록 양식에 있는 이미지를 대체하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;window.uploadPhotos = function(url){

    var resizedImage;

    // Read in file
    var file = event.target.files[0];

    // Ensure it's an image
    if(file.type.match(/image.*/)) {
        console.log('An image has been loaded');

        // Load the image
        var reader = new FileReader();
        reader.onload = function (readerEvent) {
            var image = new Image();
            image.onload = function (imageEvent) {

                // Resize the image
                var canvas = document.createElement('canvas'),
                    max_size = 1200,
                    width = image.width,
                    height = image.height;
                if (width &amp;gt; height) {
                    if (width &amp;gt; max_size) {
                        height *= max_size / width;
                        width = max_size;
                    }
                } else {
                    if (height &amp;gt; max_size) {
                        width *= max_size / height;
                        height = max_size;
                    }
                }
                canvas.width = width;
                canvas.height = height;
                canvas.getContext('2d').drawImage(image, 0, 0, width, height);
                resizedImage = canvas.toDataURL('image/jpeg');
            }
            image.src = readerEvent.target.result;
        }
        reader.readAsDataURL(file);
    }


   // TODO: Need some logic here to switch out which photo is being posted...

    var data = new FormData($(&quot;form[id*='uploadImageForm']&quot;)[0]);

    $.ajax({
        url: url,
        data: data,
        cache: false,
        contentType: false,
        processData: false,
        type: 'POST',
        success: function(data){
            ... handle error...
            }
        }
    });
};
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파일 입력을 양식 밖으로 옮기고 크기를 조정한 이미지의 값으로 설정한 양식에 숨겨진 입력을 갖는 것에 대해 생각해 보았습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런데 이미 양식에 있는 이미지만 교체해도 되는지 궁금합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 제가 한 일이 있는데 정말 잘 되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;먼저 파일 입력을 제출되지 않도록 양식 외부로 이동했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;input name=&quot;imagefile[]&quot; type=&quot;file&quot; id=&quot;takePictureField&quot; accept=&quot;image/*&quot; onchange=&quot;uploadPhotos(\'#{imageUploadUrl}\')&quot; /&amp;gt;
&amp;lt;form id=&quot;uploadImageForm&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;
    &amp;lt;input id=&quot;name&quot; value=&quot;#{name}&quot; /&amp;gt;
    ... a few more inputs ... 
&amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그 다음에 제가 바꿨습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;uploadPhotos&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;크기 조정만 처리하는 기능:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;window.uploadPhotos = function(url){
    // Read in file
    var file = event.target.files[0];

    // Ensure it's an image
    if(file.type.match(/image.*/)) {
        console.log('An image has been loaded');

        // Load the image
        var reader = new FileReader();
        reader.onload = function (readerEvent) {
            var image = new Image();
            image.onload = function (imageEvent) {

                // Resize the image
                var canvas = document.createElement('canvas'),
                    max_size = 544,// TODO : pull max size from a site config
                    width = image.width,
                    height = image.height;
                if (width &amp;gt; height) {
                    if (width &amp;gt; max_size) {
                        height *= max_size / width;
                        width = max_size;
                    }
                } else {
                    if (height &amp;gt; max_size) {
                        width *= max_size / height;
                        height = max_size;
                    }
                }
                canvas.width = width;
                canvas.height = height;
                canvas.getContext('2d').drawImage(image, 0, 0, width, height);
                var dataUrl = canvas.toDataURL('image/jpeg');
                var resizedImage = dataURLToBlob(dataUrl);
                $.event.trigger({
                    type: &quot;imageResized&quot;,
                    blob: resizedImage,
                    url: dataUrl
                });
            }
            image.src = readerEvent.target.result;
        }
        reader.readAsDataURL(file);
    }
};
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;보시다시피 저는.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;canvas.toDataURL('image/jpeg');&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;크기가 조정된 이미지를 데이터로 변경하려면Url을 누른 다음 함수를 호출합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dataURLToBlob(dataUrl);&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터 Url을 blob으로 만들어서 양식에 추가할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;블롭이 생성되면 사용자 지정 이벤트를 트리거합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;블롭을 생성하는 기능은 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/* Utility function to convert a canvas to a BLOB */
var dataURLToBlob = function(dataURL) {
    var BASE64_MARKER = ';base64,';
    if (dataURL.indexOf(BASE64_MARKER) == -1) {
        var parts = dataURL.split(',');
        var contentType = parts[0].split(':')[1];
        var raw = parts[1];

        return new Blob([raw], {type: contentType});
    }

    var parts = dataURL.split(BASE64_MARKER);
    var contentType = parts[0].split(':')[1];
    var raw = window.atob(parts[1]);
    var rawLength = raw.length;

    var uInt8Array = new Uint8Array(rawLength);

    for (var i = 0; i &amp;lt; rawLength; ++i) {
        uInt8Array[i] = raw.charCodeAt(i);
    }

    return new Blob([uInt8Array], {type: contentType});
}
/* End Utility function to convert a canvas to a BLOB      */
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마지막으로, 커스텀 이벤트에서 블랍을 가져와 양식을 추가한 후 제출하는 제 이벤트 핸들러입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/* Handle image resized events */
$(document).on(&quot;imageResized&quot;, function (event) {
    var data = new FormData($(&quot;form[id*='uploadImageForm']&quot;)[0]);
    if (event.blob &amp;amp;&amp;amp; event.url) {
        data.append('image_data', event.blob);

        $.ajax({
            url: event.url,
            data: data,
            cache: false,
            contentType: false,
            processData: false,
            type: 'POST',
            success: function(data){
               //handle errors...
            }
        });
    }
});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;관심있는 사람이 있다면 타이프스크립트 버전을 만들었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;interface IResizeImageOptions {
  maxSize: number;
  file: File;
}
const resizeImage = (settings: IResizeImageOptions) =&amp;gt; {
  const file = settings.file;
  const maxSize = settings.maxSize;
  const reader = new FileReader();
  const image = new Image();
  const canvas = document.createElement('canvas');
  const dataURItoBlob = (dataURI: string) =&amp;gt; {
    const bytes = dataURI.split(',')[0].indexOf('base64') &amp;gt;= 0 ?
        atob(dataURI.split(',')[1]) :
        unescape(dataURI.split(',')[1]);
    const mime = dataURI.split(',')[0].split(':')[1].split(';')[0];
    const max = bytes.length;
    const ia = new Uint8Array(max);
    for (var i = 0; i &amp;lt; max; i++) ia[i] = bytes.charCodeAt(i);
    return new Blob([ia], {type:mime});
  };
  const resize = () =&amp;gt; {
    let width = image.width;
    let height = image.height;

    if (width &amp;gt; height) {
        if (width &amp;gt; maxSize) {
            height *= maxSize / width;
            width = maxSize;
        }
    } else {
        if (height &amp;gt; maxSize) {
            width *= maxSize / height;
            height = maxSize;
        }
    }

    canvas.width = width;
    canvas.height = height;
    canvas.getContext('2d').drawImage(image, 0, 0, width, height);
    let dataUrl = canvas.toDataURL('image/jpeg');
    return dataURItoBlob(dataUrl);
  };

  return new Promise((ok, no) =&amp;gt; {
      if (!file.type.match(/image.*/)) {
        no(new Error(&quot;Not an image&quot;));
        return;
      }

      reader.onload = (readerEvent: any) =&amp;gt; {
        image.onload = () =&amp;gt; ok(resize());
        image.src = readerEvent.target.result;
      };
      reader.readAsDataURL(file);
  })    
};
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바스크립트 결과는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var resizeImage = function (settings) {
    var file = settings.file;
    var maxSize = settings.maxSize;
    var reader = new FileReader();
    var image = new Image();
    var canvas = document.createElement('canvas');
    var dataURItoBlob = function (dataURI) {
        var bytes = dataURI.split(',')[0].indexOf('base64') &amp;gt;= 0 ?
            atob(dataURI.split(',')[1]) :
            unescape(dataURI.split(',')[1]);
        var mime = dataURI.split(',')[0].split(':')[1].split(';')[0];
        var max = bytes.length;
        var ia = new Uint8Array(max);
        for (var i = 0; i &amp;lt; max; i++)
            ia[i] = bytes.charCodeAt(i);
        return new Blob([ia], { type: mime });
    };
    var resize = function () {
        var width = image.width;
        var height = image.height;
        if (width &amp;gt; height) {
            if (width &amp;gt; maxSize) {
                height *= maxSize / width;
                width = maxSize;
            }
        } else {
            if (height &amp;gt; maxSize) {
                width *= maxSize / height;
                height = maxSize;
            }
        }
        canvas.width = width;
        canvas.height = height;
        canvas.getContext('2d').drawImage(image, 0, 0, width, height);
        var dataUrl = canvas.toDataURL('image/jpeg');
        return dataURItoBlob(dataUrl);
    };
    return new Promise(function (ok, no) {
        if (!file.type.match(/image.*/)) {
            no(new Error(&quot;Not an image&quot;));
            return;
        }
        reader.onload = function (readerEvent) {
            image.onload = function () { return ok(resize()); };
            image.src = readerEvent.target.result;
        };
        reader.readAsDataURL(file);
    });
};
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;용법은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;resizeImage({
    file: $image.files[0],
    maxSize: 500
}).then(function (resizedImage) {
    console.log(&quot;upload resized image&quot;)
}).catch(function (err) {
    console.error(err);
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또는 ()&lt;/font&gt;&lt;/font&gt;&lt;code&gt;async&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;/&lt;/font&gt;&lt;/font&gt;&lt;code&gt;await&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;):&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const config = {
    file: $image.files[0],
    maxSize: 500
};
const resizedImage = await resizeImage(config)
console.log(&quot;upload resized image&quot;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저와 같은 몇몇 분들이 오리엔테이션 문제를 겪는다면 저는 여기에 해결책을 조합했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://gist.github.com/SagiMedina/f00a57de4e211456225d3114fd10b0d0&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;https://gist.github.com/SagiMedina/f00a57de4e211456225d3114fd10b0d0&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;2022년에는 우리가 사용할 수 있는 새로운 API가 몇 가지 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것이 제가 생각해낸 해결책입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;우리는 파일 리더 API나 이미지 온로드 콜백을 건드릴 필요가 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음 코드는 파일 객체 또는 Blob 객체를 받아들여서 잘라낸, 중심을 맞춘, 리사이징된 이미지의 Blob을 출력하고 이를 webp로 변환합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;
export default async (file, size) =&amp;gt; {
  size ??= 256

  const canvas = document.createElement('canvas')
  const ctx = canvas.getContext('2d')

  canvas.width = size
  canvas.height = size

  const bitmap = await createImageBitmap(file)
  const { width, height } = bitmap

  const ratio = Math.max(size / width, size / height)

  const x = (size - (width * ratio)) / 2
  const y = (size - (height * ratio)) / 2

  ctx.drawImage(bitmap, 0, 0, width, height, x, y, width * ratio, height * ratio)

  return new Promise(resolve =&amp;gt; {
    canvas.toBlob(blob =&amp;gt; {
      resolve(blob)
    }, 'image/webp', 1)
  })
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 파일 리더기를 실제로 사용하지 않고 저만의 버전을 만들었습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대신 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;createObjectUrl&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대부분의 현대 브라우저가 이를 지원합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/**
 * Function scaling an image from a file input to specified dimensions
 * If the specified dimensions are not proportional to image dimensions the output image will be cropped at center
 *
 * @param file {File} Input file of a form
 * @param dimensions {{width: number, height: number}} Dimenstions of the output image
 * @returns {Promise&amp;lt;Blob | null&amp;gt;} Promise resolving to a scale image or a null if provided an invalid file type
 */
export async function scaleImageBeforeUpload(file: File, dimensions: {width: number, height: number}): Promise&amp;lt;Blob | null&amp;gt; {
    // ensure the file is an image
    if (!file.type.match(/image.*/)) return null;

    const image = new Image();
    image.src = URL.createObjectURL(file);

    await new Promise&amp;lt;Event&amp;gt;((res) =&amp;gt; image.onload = res);
    const canvas = document.createElement(&quot;canvas&quot;);
    const context = canvas.getContext(&quot;2d&quot;, {alpha: true});

    canvas.width = dimensions.width;
    canvas.height = dimensions.height;

    if (image.height &amp;lt;= image.width) {
        const scaleProportions = canvas.height / image.height;
        const scaledWidth = scaleProportions * image.width;
        context.drawImage(image, (canvas.width - scaledWidth)/2, 0, scaledWidth, canvas.height);
    }
    else {
        const scaleProportions = canvas.width / image.width;
        const scaledHeight = scaleProportions * image.height;
        context.drawImage(image, 0, (canvas.height - scaledHeight)/2, canvas.width, scaledHeight);
    }

    return new Promise((res) =&amp;gt; canvas.toBlob(res));
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이미지 크기를 최대 파일 크기에 맞게 조정하는 가장 비효율적인 방법&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    function processImage(base64) {
        return new Promise(function(resolve, reject) {
            var img = new Image();
            img.onload = function() {
                var canvas = document.createElement('canvas');
                var ctx = canvas.getContext('2d');
                var width = img.width;
                var height = img.height;
                var resizedBase64 = null;
                while (resizedBase64 == null) {
                    console.log(&quot;width: &quot; + width + &quot; height: &quot; + height);
                    canvas.width = width;
                    canvas.height = height;
                    ctx.drawImage(img, 0, 0, width, height);
                    if (canvas.toDataURL('image/png').length &amp;gt; maxFileSize) {
                        width = width * 0.9;
                        height = height * 0.9;
                    } else {
                        resizedBase64 = canvas.toDataURL('image/png')
                    }
                }
                console.log(&quot;width: &quot; + width + &quot; height: &quot; + height);
                resolve(resizedBase64);
            };
            img.src = base64;
        });
    }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/23945494/use-html5-to-resize-an-image-before-upload&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>javascript</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/741</guid>
      <comments>https://fileupload.tistory.com/741#entry741comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:15:24 +0900</pubDate>
    </item>
    <item>
      <title>Angular에서 &amp;quot;track by&amp;quot;란 무엇입니까?JS는 어떻게 작동합니까?</title>
      <link>https://fileupload.tistory.com/740</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Angular에서 &quot;track by&quot;란 무엇입니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;JS는 어떻게 작동합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어떻게 그 일을 할 수 있는지 잘 모르겠어요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;track by&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;작품과 그것이 하는 일.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저의 주된 목표는 같이 사용하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ng-repeat&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;정확도를 좀 더 높이기 위해서요.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;h3&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;track by&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문자열과 중복된 값을 추적합니다&lt;/font&gt;&lt;/font&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;보통.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ng-repeat&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;항목 자체별로 각 항목을 추적합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;주어진 배열에 대해&lt;/font&gt;&lt;/font&gt;&lt;code&gt;objs = [ 'one', 'one', 2, 'five', 'string', 'foo']&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ng-repeat&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;각각의 변화를 추적하려는 시도&lt;/font&gt;&lt;/font&gt;&lt;code&gt;obj&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;에서&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ng-repeat=&quot;obj in objs&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 문제는 우리가 중복된 값을 가지고 있고 각이 오차를 낸다는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이를 해결하기 위한 한 가지 방법은 다른 방법으로 물체를 각지게 추적하는 것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문자열의 경우,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;track by $index&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문자열을 추적할 다른 수단이 없기 때문에 좋은 해결책입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h3&gt;&lt;code&gt;track by&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&amp;amp; 다이제스트 &amp;amp; 입력 포커스 트리거&lt;/font&gt;&lt;/font&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신은 당신이 각진 것에 다소 익숙하지 않다는 것을 암시합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다이제스트 사이클은 각도가 해당하는 뷰에 변경 사항을 반영하기 위해 각 감시 속성을 철저하게 검사할 때 발생합니다. 다이제스트 사이클 동안 코드가 다른 감시 속성을 수정하여 각도가 더 이상 변경 사항을 감지하지 않을 때까지 프로시저를 다시 수행해야 하는 경우가 종종 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어,&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;버튼을 클릭하면 다음을 통해 모델을 업데이트할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ng-click&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 그런 다음(즉, 사용자가 클릭할 때 수행하기 위해 콜백에 기록한 내용) 보기를 새로 고치기 위해 각도 트리거 다이제스트 사이클을 수행합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 그것을 설명하는 데 너무 명확하지 않으므로, 그것이 명확하지 않았다면 당신은 더 조사해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그래서 다시.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;track by&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 예를 들어 보겠습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;서비스를 호출하여 일련의 물건을 반환합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;배열 내의 개체를 업데이트하고 개체를 저장합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저장 서비스 후 API가 반환하는 내용에 따라 다음을 수행할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;ol&gt; 
   &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;개체 전체를 바꿉니다. OR&lt;/font&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기존 개체의 값을 업데이트합니다.&lt;/font&gt;&lt;/li&gt; 
  &lt;/ol&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;변화를 반영합니다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ng-repeat&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;UI&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 개체를 추적하는 방법에 따라 UI가 변경 사항을 반영하는 방법이 결정됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;내가 경험한 가장 짜증나는 UX 중 하나는 이것입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;각 셀에는 개체의 속성을 인라인으로 편집할 입력 정보가 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러면 값을 변경하고 싶습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;on-blur&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 응답을 기다리는 동안 편집할 다음 셀로 이동하는 동안 해당 개체를 저장합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것은 자동 저장 타입입니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;설정 방법에 따라&lt;/font&gt;&lt;/font&gt;&lt;code&gt;track by&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문장 응답이 개체 배열에 다시 기록되면 현재 포커스(예: 현재 편집 중인 필드)가 손실될 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;추가할때&lt;/font&gt;&lt;/font&gt;&lt;code&gt;track by&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;기본적으로 주어진 집합에서 데이터 개체당 하나의 DOM 요소를 생성하기 위해 각도를 지정합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;넌 할 수 있다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;track by $index&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;데이터 원본에 중복된 식별자가 있는 경우.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;중복 항목을 반복해야 하는 경우 식별 추적을 사용하여 기본 추적 동작을 자신의 것으로 대체할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;[{id:1,name:'one'}, {id:1,name:'one too'}, {id:2,name:'two'}]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;중복된 값을 사용해 보십시오.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ng-repeat&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 다음과 같은 오류가 발생합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오류: ngRepeat: Repeater에서 중복 키를 중복합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이러한 문제를 방지하려면 사용해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;track by $index&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 예를 들어,&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;ul&amp;gt;
   &amp;lt;li ng-repeat=&quot;item in [1, 2, 3, 3] track by $index&quot;&amp;gt;
       {{ item }}
   &amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기에 당신이 얻는 방법이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$index&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;중첩된&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ng-repeat&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div ng-repeat=&quot;row in matrix&quot;&amp;gt;
    &amp;lt;div ng-repeat=&quot;column in row&quot;&amp;gt;
      &amp;lt;span&amp;gt;outer: {{$parent.$index}} inner: {{$index}}&amp;lt;/span&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음은 귀사에 도움이 될 수 있는 몇 가지 리소스입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://docs.angularjs.org/error/ngRepeat/dupes&quot; rel=&quot;noreferrer&quot;&gt;&lt;code&gt;track by $index&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문서화&lt;/font&gt;&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://docs.angularjs.org/api/ng/directive/ngRepeat&quot; rel=&quot;noreferrer&quot;&gt;&lt;code&gt;ngRepeat&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;문서화&lt;/font&gt;&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.codelord.net/2014/04/15/improving-ng-repeat-performance-with-track-by/&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;2014 codelord.net 에 관한 기사&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ng-repeat&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;퍼포먼스와&lt;/font&gt;&lt;/font&gt;&lt;code&gt;track by&lt;/code&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신은 사용해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;track by&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신이 기본적인 행동에 반대할 필요가 있는 경우에만&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ng-repeat&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;중복되는 항목을 제거하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;스코프 속성을 사용하여 아이템을 추적할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$index&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또는 사용자 지정 함수를 지정합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div ng-repeat=&quot;x in [42, 42, 43, 43] track by $index&quot;&amp;gt;
  {{x}}
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;배열의 모든 값을 표시합니다(42는 두 번 표시됨).&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;참고 : https://docs.angularjs.org/api/ng/directive/ngRepeat&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어, 우리는 다음과 같은 목록을 가지고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;ul&amp;gt;
   &amp;lt;li ng-repeat=&quot;item in items&quot;&amp;gt;
       {{ item }}
   &amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기서 항목은 다음과 같은 구조를 갖습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{ 'id'=&amp;gt;id, 'name'=&amp;gt;name, 'description'=&amp;gt;description }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;우리가 업데이트를 원할 때까지 이 목록에는 아무런 문제가 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;우리는 우리 자신의 편의를 위해 다음과 같은 다른 업데이트된 품목 목록으로 품목 목록을 대체합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;items = newItems;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 이 새 목록에서 변경되는 항목은 거의 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;대부분의 항목은 동일하게 유지됩니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;안타깝게도 Angular는 우리의 상품을 식별하고 그것들을 각각의 상품에 매핑하는 방법을 알지 못합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;elements(요소)를 삭제하고 다시 생성합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 경우에 따라 성능 비용이 매우 많이 소요되며, 여기에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;track by&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용중입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;를 추가하여&lt;/font&gt;&lt;/font&gt;&lt;code&gt;track by&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;요소에 대한 절&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;li ng-repeat=&quot;item in items track by item.id&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;우리는 Angular에게 우리의 상품의 고유한 식별자가&lt;/font&gt;&lt;/font&gt;&lt;code&gt;item.id&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 이제 Angular는 모든 항목을 재생성하지 않고 새로운 ID를 가진 항목만 재생성할 수 있으며 나머지 항목만 업데이트합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;성능 향상은 대부분의 경우 중요합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;또한 개인적으로는 업데이트할 때마다 항목이 사라지지 않기 때문에 브라우저의 개발자 도구에서 항목을 더 쉽게 모니터링할 수 있다는 점이 좋습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/39640160/what-is-track-by-in-angularjs-and-how-does-it-work&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>AngularJS</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/740</guid>
      <comments>https://fileupload.tistory.com/740#entry740comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:15:11 +0900</pubDate>
    </item>
    <item>
      <title>JQuery select2 set default value in list의 옵션에서 기본값을 설정하시겠습니까?</title>
      <link>https://fileupload.tistory.com/739</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;JQuery select2 set default value in list의 옵션에서 기본값을 설정하시겠습니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;JQuery Select2 플러그인을 사용하여 선택 요소의 기본값/선택된 값을 설정할 수 있기를 원합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;한가지 방법만 더 추가하면 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;selected = &quot;selected&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;에 귀속시키다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;select&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마크업과 통화&lt;/font&gt;&lt;/font&gt;&lt;code&gt;select2&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신이 선택한 값을 가져야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;추가 자바스크립트가 필요 없습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이와 같이:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;마크업&lt;/font&gt;&lt;/strong&gt; &lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;select class=&quot;select2&quot;&amp;gt;
   &amp;lt;option id=&quot;foo&quot;&amp;gt;Some Text&amp;lt;/option&amp;gt;
   &amp;lt;option id=&quot;bar&quot; selected=&quot;selected&quot;&amp;gt;Other Text&amp;lt;/option&amp;gt;
&amp;lt;/select&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바스크립트&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('select').select2(); //oh yes just this!
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;fiddle 참조 : http://jsfiddle.net/6hZFU/&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;편집:&lt;/strong&gt; (고마워요, 제이 하세!)&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 방법이 작동하지 않으면 다음을 설정해 보십시오.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;val&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;의 소유물.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;select2&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;로.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;null&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 값을 지우려면 다음과 같이 하십시오.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('select').select2(&quot;val&quot;, null); //a lil' bit more :)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 후에는 설정이 간단합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;val&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;로.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&quot;Whatever You Want&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;위의 해결책들은 저에게 효과가 없었지만, 셀렉트2의 자체 웹사이트에 있는 이 코드는 다음과 같이 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('select').val('US'); // Select the option with a value of 'US'
$('select').trigger('change'); // Notify any JS components that the value changed
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;https://select2.org/programmatic-control/add-select-clear-items#selecting-options&quot; rel=&quot;noreferrer&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;웹 페이지가 여기에 있습니다.&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것이 저처럼 힘든 사람들에게 도움이 되기를 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;$(&quot;#id&quot;).select2(&quot;val&quot;, null); //this will not work..you can try
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신은 정말로 이렇게 해야 합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;초기화한 다음 값을 설정합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저도 이런 식으로 일했어요&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;#id&quot;).select2().select2(&quot;val&quot;, null);
$(&quot;#id&quot;).select2().select2(&quot;val&quot;, 'oneofthevaluehere');
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이를 달성하기 위한 한가지 방법은...&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('select').select2().select2('val', $('.select2 option:eq(1)').val());
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 기본적으로 먼저 플러그인을 초기화한 다음 'val' 파라미터를 사용하여 기본값을 지정합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실제 값은 지정된 옵션(이 경우 #1)에서 가져옵니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;따라서 이 예제에서 선택한 값은 &quot;bar&quot;가 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;select class=&quot;.select2&quot;&amp;gt;
  &amp;lt;option id=&quot;foo&quot;&amp;gt;Some Text&amp;lt;/option&amp;gt;
  &amp;lt;option id=&quot;bar&quot;&amp;gt;Other Text&amp;lt;/option&amp;gt;
&amp;lt;/select&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것이 다른 사람에게 유용하기를 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;4.x&lt;/strong&gt; 버전의 경우&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('#select2Id').val(__INDEX__).trigger('change');
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;INDEX&lt;/strong&gt;로 값을 선택합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('#select2Id').val('').trigger('change');
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아무것도 선택하지 않다(있는 경우 자리 표시자 표시)&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;미래에서 왔습니까?&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ajax 소스 기본값을 찾고 계십니까?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// Set up the Select2 control
$('#mySelect2').select2({
    ajax: {
        url: '/api/students'
    }
});

// Fetch the preselected item, and add to the control
var studentSelect = $('#mySelect2');
$.ajax({
    type: 'GET',
    url: '/api/students/s/' + studentId
}).then(function (data) {
    // create the option and append to Select2
    var option = new Option(data.full_name, data.id, true, true);
    studentSelect.append(option).trigger('change');

    // manually trigger the `select2:select` event
    studentSelect.trigger({
        type: 'select2:select',
        params: {
            data: data
        }
    });
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;천만에요.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;참조 : https://select2.org/programmatic-control/add-select-clear-items#preselecting-options-in-an-remotely-sourced-ajax-select2&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;1단계: 빈칸을 하나 추가해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;option&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;선택한 태그에 빈 값을 입력합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;2단계: 추가&lt;/font&gt;&lt;/font&gt;&lt;code&gt;data-placeholder&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자리 표시자 값을 사용하여 선택 태그에서 속성&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;HTML&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;select class=&quot;select2&quot; data-placeholder='--Select--'&amp;gt;
  &amp;lt;option value=''&amp;gt;--Select--&amp;lt;/option&amp;gt;
  &amp;lt;option value='1'&amp;gt;Option 1&amp;lt;/option&amp;gt;
  &amp;lt;option value='2'&amp;gt;Option 2&amp;lt;/option&amp;gt;
  &amp;lt;option value='3'&amp;gt;Option 3&amp;lt;/option&amp;gt;
&amp;lt;/select&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('.select2').select2({
    placeholder: $(this).data('placeholder')
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;오어&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('.select2').select2({
    placeholder: 'Custom placeholder text'
});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var option = new Option(data.full_name, data.id, true, true);
studentSelect.append(option).trigger('change');
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;여기 https://select2.org/programmatic-control/add-select-clear-items 에서 보실 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;쉬워요.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;예를 들어 기본값이 2인 옵션을 선택합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;HTML:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;select class=&quot;select2&quot; id=&quot;selectBox&quot;&amp;gt;
   &amp;lt;option value=&quot;1&quot;&amp;gt;Some Text&amp;lt;/option&amp;gt;
   &amp;lt;option value=&quot;2&quot;&amp;gt;Other Text&amp;lt;/option&amp;gt;
&amp;lt;/select&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바스크립트:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;#selectBox&quot;).val('2').trigger('change')
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다른 사람들은 몰라요, 이 코드만 저한테 효과가 있었어요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('select').val('').select2();
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;보통은 &lt;strong&gt;active&lt;/strong&gt;를 사용하지만 select2에서는 &lt;strong&gt;selected&lt;/strong&gt;=&quot;&lt;strong&gt;selected&lt;/strong&gt;&quot;로 변경됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Python/Flask 사용 예제&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;HTML:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;select id=&quot;role&quot; name=&quot;role[]&quot; multiple=&quot;multiple&quot; class=&quot;js-example-basic-multiple form-control&quot;&amp;gt;
  {% for x in list%}
  &amp;lt;option selected=&quot;selected&quot; value=&quot;{{x[0]}}&quot;&amp;gt;{{x[1]}}&amp;lt;/option&amp;gt;
  {% endfor %}
&amp;lt;/select&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;JQuery:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(document).ready(function() {
        $('.js-example-basic-multiple').select2();
    });

    $(&quot;.js-example-theme-multiple&quot;).select2({
        theme: &quot;classic&quot;,
        placeholder: 'Select your option...'
    });
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;    $('select').select2(&quot;val&quot;,null);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;배열 데이터 소스를 사용하는 경우 아래와 같은 작업을 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;.select&quot;).select2({
    data: data_names
});
data_names.forEach(function(name) {
    if (name.selected) {
        $(&quot;.select&quot;).select2('val', name.id);
    }
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이는 데이터 세트 중 기본값으로 설정하려는 항목 하나에 selected라는 추가 속성이 있다고 가정하고 이를 사용하여 값을 설정합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;ajax의 경우 select2 multiple select 드롭다운을 선택하면 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  //preset element values
  //topics is an array of format [{&quot;id&quot;:&quot;&quot;,&quot;text&quot;:&quot;&quot;}, .....]
        $(id).val(topics);
          setTimeout(function(){
           ajaxTopicDropdown(id,
                2,location.origin+&quot;/api for gettings topics/&quot;,
                &quot;Pick a topic&quot;, true, 5);                      
            },1);
        // ajaxtopicDropdown is dry fucntion to get topics for diffrent element and url
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/16969666/jquery-select2-set-default-value-from-an-option-in-list&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>jquery</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/739</guid>
      <comments>https://fileupload.tistory.com/739#entry739comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:15:04 +0900</pubDate>
    </item>
    <item>
      <title>npm - 패키지에 대한 종속성을 다른 폴더에 설치하시겠습니까?</title>
      <link>https://fileupload.tistory.com/738</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;npm - 패키지에 대한 종속성을 다른 폴더에 설치하시겠습니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;저는 다음과 같은 디렉토리 구조를 가지고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/some_project
    source.js
    package.json
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;some_project에 대한 종속성을 설치하고 싶습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;some_project에 cd한 다음 npm 설치를 실행할 수 있다는 것을 알고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런데 디렉토리를 변경하지 않고 가능한지 궁금합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;npm install some_project/package.json 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;npm install &amp;lt;folder&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;에 따라 변형된.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;--prefix&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;선택.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;시나리오에서 폴더와 접두사는 동일합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;npm --prefix ./some_project install ./some_project
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;업데이트:&lt;/strong&gt; Since the&lt;/font&gt;&lt;/font&gt;&lt;code&gt;--prefix&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;옵션이 존재합니다. 저는 이 질문에 대한 @coudy의 답변에 투표합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아래의 원래 답변:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;아니요.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;npm&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;는 항상 현재 디렉토리에 설치됩니다. 또는 를 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-g&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;, 시스템 와이드 노드_ modules에서.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;하위 셸을 사용하여 이 작업을 수행할 수 있지만 현재 디렉토리에는 영향을 주지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(cd some_project &amp;amp;&amp;amp; npm install)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;괄호를 &lt;a href=&quot;http://tldp.org/LDP/abs/html/subshells.html&quot; rel=&quot;noreferrer&quot;&gt;사용&lt;/a&gt;하면 하위 셸에서 실행됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;패키지를 만듭니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;루트 디렉터리에 있는 json의 내용은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{
    &quot;dependencies&quot;: {
        &quot;helloworldprojectname&quot;: &quot;file:hello\\world&quot;
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그런 다음 이를 호출하여 설치합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;npm install --prefix ./hello/world
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;설치합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;./hello/world/node_modules&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;./hello/world/package.json&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;(Windows 10, 노드 v10.16.0, npm 7.6.1)&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;Windows 10에서는 얻을 수 없었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;--prefix&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;일을 하기 위해서, 그래서 나는 해야만 했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cd&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;실행합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;cd PATH_TO_FOLDER &amp;amp;&amp;amp; npm install 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;파워셸을 사용하는 윈도우 10에서 이 &lt;a href=&quot;https://nerdymishka.com/blog/run-npm-install-in-a-different-directory/&quot; rel=&quot;nofollow noreferrer&quot;&gt;블로그 게시물&lt;/a&gt;에 언급된 모든 문제와 엣지 케이스 없이 나에게 효과가 있었던 유일한 것은 이것이었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-sh prettyprint-override&quot;&gt;&lt;code&gt;Start-Process -Wait -FilePath &quot;npm&quot; -ArgumentList &quot;install&quot; -WorkingDirectory $web_dir
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/13498403/npm-install-dependencies-for-a-package-in-a-different-folder&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>node.js</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/738</guid>
      <comments>https://fileupload.tistory.com/738#entry738comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:14:56 +0900</pubDate>
    </item>
    <item>
      <title>HTML5 사용자 지정 데이터 속성이 IE 6에서 &amp;quot;작동&amp;quot;합니까?</title>
      <link>https://fileupload.tistory.com/737</link>
      <description>&lt;h2&gt;&lt;font papago-translate=&quot;translated&quot;&gt;HTML5 사용자 지정 데이터 속성이 IE 6에서 &quot;작동&quot;합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용자 지정 데이터 속성: http://dev.w3.org/html5/spec/Overview.html#embedding-custom-non-visible-data&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;제가 &quot;일&quot;이라고 말할 때, 제 말은, 만약 제가 HTML을 가지고 있다면,&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div id=&quot;geoff&quot; data-geoff=&quot;geoff de geoff&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음과 같은 자바스크립트를 실행할 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var geoff = document.getElementById('geoff');
alert(geoff.dataGeoff);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;IE 6에서 &quot;goff de deoff&quot;가 포함된 경보를 생성할 수 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다음을 사용하여 사용자 지정(또는 사용자 고유) 특성 값을 검색할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;getAttribute&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;. 예를 들어 다음과 같이 하십시오.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div id=&quot;geoff&quot; data-geoff=&quot;geoff de geoff&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;나는 가치를 얻을 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;data-geoff&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;사용.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var geoff = document.getElementById(&quot;geoff&quot;);
alert(geoff.getAttribute(&quot;data-geoff&quot;));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx&quot; rel=&quot;noreferrer&quot;&gt;MSDN&lt;/a&gt;을 참조하십시오. 그리고 여기서 이것을 작동시키려면 IE7이 필요하다고 언급되어 있지만, 얼마 전 IE6로 이것을 테스트해 보았는데 (심지어 별난 모드에서도) 올바르게 작동했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그러나 이는 물론 HTML5 고유 속성과는 무관합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;네, 효과가 있습니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;IE에서 지원했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;getAttribute()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery가 내부적으로 사용하는 IE4로부터&lt;/font&gt;&lt;/font&gt;&lt;code&gt;data()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;data = elem.getAttribute( &quot;data-&quot; + key ); // Line 1606, jQuery.1.5.2.js
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery's를 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.data()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;메서드 또는 일반 바닐라 자바스크립트:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;HTML 샘플&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div id=&quot;some-data&quot; data-name=&quot;Tom&quot;&amp;gt;&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;자바스크립트&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var el = document.getElementById(&quot;some-data&quot;);
var name = el.getAttribute(&quot;data-name&quot;);
alert(name);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var name = $(&quot;#some-data&quot;).data(&quot;name&quot;);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;IE6는 HTML5 Data Attribute 기능을 지원하지 않을 뿐만 아니라, 사실상 현재 &lt;em&gt;브라우저&lt;/em&gt;가 지원하지 않습니다!&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;현재 유일한 예외는 크롬입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;당신은 자유롭게 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;data-geoff=&quot;geoff de geoff&quot;&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;속성으로, 그러나 현재 브라우저 버전의 Chrome만이 당신에게 제공할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.dataGeoff&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;소유물.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;다행히 IE6를 포함한 모든 현재 브라우저는 &lt;em&gt;표준&lt;/em&gt; DOM을 사용하여 알려지지 않은 속성을 참조할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.getAttribute()&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;메소드 그래서&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.getAttribute(&quot;data-geoff&quot;)&lt;/code&gt;&lt;font papago-translate=&quot;splitted&quot;&gt;&lt;font papago-translate=&quot;translated&quot;&gt;어디서든 통할 겁니다&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;가까운 미래에 Firefox와 Safari의 새로운 버전이 데이터 속성을 지원하기 시작할 것입니다. 하지만 모든 브라우저에서 작동하는 완벽하게 좋은 액세스 방법이 있기 때문에 일부 방문자에게만 적용되는 HTML5 방법을 사용할 이유가 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 기능의 현재 지원 상태에 대한 자세한 내용은 &lt;a href=&quot;http://caniuse.com/#search=dataset&quot; rel=&quot;noreferrer&quot;&gt;Can&lt;/a&gt;에서 확인할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://caniuse.com/#search=dataset&quot; rel=&quot;noreferrer&quot;&gt;IUse.com&lt;/a&gt; .&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;도움이 되길 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;IE는 항상 이를 지원해왔고(적어도 IE4부터는) JS에서 액세스할 수 있다고 생각합니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;그것들은 '확장 속성'이라고 불렸습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/bb263996(VS.85).aspx&quot; rel=&quot;nofollow noreferrer&quot;&gt;오래된 MSDN 문서&lt;/a&gt; 참조&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이 동작은 DOM 요소에서 expando &lt;em&gt;속성&lt;/em&gt;을 false로 설정하여 비활성화할 수 있습니다(기본적으로 true이므로 expando &lt;em&gt;속성&lt;/em&gt;은 기본적으로 작동함).&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;편집: URL 수정&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;최신 브라우저의 데이터셋 속성처럼 사용자 지정 데이터 속성을 한 번에 모두 검색하려면 다음 작업을 수행할 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;이것이 제가 한 일이고 ie7+에서 저에게 잘 맞는 일입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function getDataSet(node) {
    var dataset = {};
    var attrs = node.attributes;
    for (var i = 0; i &amp;lt; attrs.length; i++) {
        var attr = attrs.item(i);
        // make sure it is a data attribute
        if(attr.nodeName.match(new RegExp(/^data-/))) {
            // remove the 'data-' from the string 
            dataset[attr.nodeName.replace(new RegExp('^data-'), '')] = attr.nodeValue;
        }
    }
    return dataset;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;&lt;strong&gt;IE6&lt;/strong&gt;에서는 작동하지 않을 수 있습니다.&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;참고용 : &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/ie/ms536437%28v=vs.85%29.aspx?f=255&amp;amp;MSPPError=-2147217396&quot; rel=&quot;nofollow&quot;&gt;MSDN&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;jQuery를 사용하여 대부분의 경우를 처리할 것을 제안합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var geoff = $(&quot;#geoff&quot;).data(&quot;data-geoff&quot;);
alert(geoff);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;코딩으로 한번 해보세요.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot;&gt;언급&lt;/font&gt;&lt;font papago-translate=&quot;translated&quot;&gt;URL : https://stackoverflow.com/questions/2412947/do-html5-custom-data-attributes-work-in-ie-6&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>javascript</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/737</guid>
      <comments>https://fileupload.tistory.com/737#entry737comment</comments>
      <pubDate>Sat, 4 Nov 2023 13:14:50 +0900</pubDate>
    </item>
    <item>
      <title>Angular가 HTML을 빠져나가지 못하도록 방지</title>
      <link>https://fileupload.tistory.com/736</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Angular가 HTML을 빠져나가지 못하도록 방지&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Angular가 마크업을 보간하고 범위 변수를 a에 삽입할 때&lt;/font&gt;&lt;/font&gt;&lt;code&gt;{{post}}&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스타일 템플릿은 HTML을 빠져나갑니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 만들고 있는 응용 프로그램은 사용자가 변수 이름을 삽입하기 위해 곱슬곱슬한 중괄호 표기법을 사용하여 템플릿을 작성하도록 요구합니다. 일부 변수에 대한 지시어와 다른 변수에 대한 커서를 가져와 지나치게 복잡하게 만들고 싶지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컬리 템플릿을 통해 탈옥되지 않은 HTML을 렌더링하는 방법이 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 유일한 대안은 사용자가 렌더링을 시도할 때 프록시 요소를 렌더링하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;{{post}}&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, jQLite로 잡고 HTML을 손으로 넣을 수 있지만, 그것은 모든 음영의 지저분한 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;무슨 생각 있어요?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://docs.angularjs.org/api/ng/directive/ngBindHtml&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;7-1&quot;&gt;ngBindHtml&lt;/a&gt;을 보고 싶을 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;이 기능을 활용하려면 ngSanitize를 (핵심 Angular가 아닌) 모듈의 종속성에 포함시켜 $Sanitize를 사용할 수 있도록 해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;)&quot;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/20778709/prevent-angular-from-escaping-html&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>AngularJS</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/736</guid>
      <comments>https://fileupload.tistory.com/736#entry736comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:13:43 +0900</pubDate>
    </item>
    <item>
      <title>C 표준 방식으로 비트 표현을 하는 방법은?</title>
      <link>https://fileupload.tistory.com/735</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C 표준 방식으로 비트 표현을 하는 방법은?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C 표준에 따라 정수형의 값 표현은 정의되어 있습니다. 그래서&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;5&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로 표현되지 않을 수도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;00000000000000000000000000000101&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-1&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;~하듯이&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;11111111111111111111111111111111&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우리가 보통 32비트 2의 보어로 가정하듯이.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 운영자들이&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;~&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;잘 정의되어 있으며, 이들이 작업할 비트 패턴은 구현이 정의되어 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;정의된 비트 &lt;em papago-id=&quot;8-1&quot;&gt;패턴&lt;/em&gt;은 &quot;&lt;em papago-id=&quot;8-1&quot;&gt; &lt;/em&gt;§&lt;em papago-id=&quot;8-1&quot;&gt;5.&lt;/em&gt;2&lt;em papago-id=&quot;8-1&quot;&gt;.&lt;/em&gt;1/3 모든 &lt;em papago-id=&quot;8-1&quot;&gt;비트가 0으로 설정된 null 문자라고 불리는 바이트&lt;/em&gt;가 기본 &lt;em papago-id=&quot;8-1&quot;&gt;실행 문자 집합에 존재해야 합니다. 문자열을 종료&lt;/em&gt;하는 데 &lt;em papago-id=&quot;8-1&quot;&gt;사용&lt;/em&gt;됩니다.&quot;뿐이었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 제 질문은 - &lt;strong papago-id=&quot;9-1&quot;&gt;정수형을 비트 패턴으로 변환하는 구현 독립적인 방법이 있나요?&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;항상 null 문자로 시작해서 원하는 값을 얻을 수 있을 정도의 비트 연산을 수행할 수 있지만 너무 번거롭습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 실질적으로 모든 구현이 2의 보완 표현을 사용할 것이라는 것을 알고 있지만 순수한 C 표준 방식으로 수행하는 방법을 알고 싶습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;개인적으로 지금까지 작성된 모든 코드가 특정 구현을 가정하는 장치 드라이버 프로그래밍 문제 때문에 이 주제는 꽤 흥미롭습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적으로 일반적인 플랫폼을 수용하는 것은 그리 &lt;em papago-id=&quot;11-1&quot;&gt;어렵지&lt;/em&gt; 않습니다(단순히 8비트라고 가정하지 않으려면).&lt;/font&gt;&lt;/font&gt;&lt;code&gt;char&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 2의 보완, 패딩 없음, 트랩 없음, 잘라내기 비부호-서명 변환 등의 기능을 갖춘 표준은 대부분 충분한 보장을 제공합니다(특정 구현 세부 정보를 검사하기 위한 매크로 몇 개가 도움이 될 것입니다).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;엄격하게 일치하는 프로그램이 관찰할 수 있는 한(비트 필드 외부에서), 5는 항상 다음과 같이 인코딩됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;00...0101&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이할 수 있는 &lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 이것은 반드시 물리적 표현(이것이 무엇을 의미하든 간에)이 아니라 휴대용 코드로 관찰할 수 있는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 내부적으로 그레이 코드를 사용하는 기계는 비트 와이즈 연산자 및 시프트에 대한 &quot;순수 이진 표기법&quot;을 에뮬레이트해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부호화된 유형의 음수 값의 경우 서로 다른 인코딩이 허용되며, 이로 인해 해당하는 부호화되지 않은 유형으로 다시 해석할 때 다른(모든 경우에 대해 잘 정의된) 결과가 나타납니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, 엄격하게 준수하는 코드는 다음을 구별해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;(unsigned)n&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;*(unsigned *)&amp;amp;n&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부호가 있는 정수에 대하여&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;n&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;: 이들은 패딩 비트가 없는 2의 보어에 대해서는 동일하지만, 만일 다음과 같은 경우에 다른 부호화에 대해서는 다릅니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;n&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;음입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 패딩 비트가 존재할 수 있으며, 부호화된 정수 타입은 대응하는 비부호 대응 타입보다 패딩 비트 수가 더 많을 수 있습니다. (그러나 그 반대는 아니지만, 부호에서 비부호로의 타입-펀닝은 항상 유효합니다.)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sizeof&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;padding가 아닌 비트의 수를 가져오는 데 사용할 수 없으므로, (해당하는 부호 유형의) 부호 비트만 설정된 부호 없는 값을 얻으려면 다음과 같은 것을 사용해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#define TYPE_PUN(to, from, x) ( *(to *)&amp;amp;(from){(x)} )
unsigned sign_bit = TYPE_PUN(unsigned, int, INT_MIN) &amp;amp;
                    TYPE_PUN(unsigned, int, -1) &amp;amp; ~1u;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(아마도 더 좋은 방법이 있을 것입니다) 대신에&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;unsigned sign_bit = 1u &amp;lt;&amp;lt; sizeof sign_bit * CHAR_BIT - 1;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;폭보다 더 많이 이동할 수 있기 때문입니다. (폭을 나타내는 상수 표현은 모르지만,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;sign_bit&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위에서 0이 될 때까지 오른쪽으로 이동하여 결정할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; Gcc는 이를 일정하게 접을 수 있습니다.)&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;패딩 비트는 다음과 같이 검사할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;memcpy&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;에 들어가기&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;unsigned char&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;배열은 &quot;wobble&quot;처럼 보일 수 있지만: 같은 패딩 비트를 두 번 읽는 것은 다른 결과를 줄 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부호가 있는 정수(작은 엔디언)의 비트 패턴(패딩 비트 없음)을 원하는 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int print_bits_u(unsigned n) {
    for(; n; n&amp;gt;&amp;gt;=1) {
        putchar(n&amp;amp;1 ? '1' : '0'); // n&amp;amp;1 never traps
    }
    return 0;
}

int print_bits(int n) {
    return print_bits_u(*(unsigned *)&amp;amp;n &amp;amp; INT_MAX);
    /* This masks padding bits if int has more of them than unsigned int.
     * Note that INT_MAX is promoted to unsigned int here. */
}

int print_bits_2scomp(int n) {
    return print_bits_u(n);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;print_bits&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용된 표현에 따라 음수에 대해 다른 결과를 제공합니다(원시 비트 패턴을 제공함).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;print_bits_2scomp&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2의 보어 표현(폭이 a보다 큰 possibly)을 제공합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;signed int&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가 있다면, 만일&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;unsigned int&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;패딩 비트(padding bits)가 적습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;비트 와이즈 연산자를 사용할 때와 서명되지 않은 연산자에서 서명된 연산자로 유형 펀칭할 때 트랩 표현이 생성되지 않도록 주의해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 아래에서 이러한 표현이 생성될 가능성이 있는 방법을 참조하십시오(예:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;*(int *)&amp;amp;sign_bit&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 개의 보어로 덫을 놓을 수 있고,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-1 | 1&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자신의 보배를 함정에 빠뜨릴 수 있습니다).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;비부호-서명 정수 변환(변환된 값이 대상 유형에서 표현할 수 없는 경우)은 항상 구현 정의됩니다. 기술적으로는 2의 보완 시스템이 일반적인 정의와 다를 가능성이 높지만, 2의 보완 구현에서 문제가 될 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C11(n1570) 6.2.6.2부터:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(1) 다음 이외의 부호 없는 정수 유형의 경우&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;unsigned char&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 객체 표현의 비트는 값 비트와 패딩 비트(padding bits)의 두 그룹으로 나뉩니다. (뒤의 것은 있을 필요가 없습니다.)&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;38-1&quot;&gt;N개&lt;/strong&gt;의 값 비트가 있는 경우 각 비트는 &lt;strong papago-id=&quot;38-3&quot;&gt;1&lt;/strong&gt;과 2 &lt;strong papago-id=&quot;38-5&quot;&gt;사이&lt;/strong&gt;의&lt;sup papago-id=&quot;38-5-1&quot;&gt;N-1&lt;/sup&gt; 2의 서로 다른 거듭제곱을 나타내야 하며, 따라서 해당 유형의 객체는 순수 이진 표현을 사용하여 &lt;strong papago-id=&quot;38-7&quot;&gt;0&lt;/strong&gt;에서 &lt;strong papago-id=&quot;38-9&quot;&gt;2-1&lt;sup papago-id=&quot;38-9-1&quot;&gt;N&lt;/sup&gt;&lt;/strong&gt; 사이의 값을 나타낼 수 있어야 합니다. 이를 값 표현이라고 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;패딩 비트의 값은 지정되지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(2) 부호가 있는 정수형의 경우 객체 표현의 비트를 값 비트, 패딩 비트, 부호 비트의 세 그룹으로 나눕니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;패딩 비트가 있을 필요는 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;signed char&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;패딩 비트가 없어야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;기호 비트가 정확히 하나일 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;값 비트인 각 비트는 해당 비부호 유형의 객체 표현에서 동일한 비트와 동일한 값을 가져야 합니다(부호 유형에 M 값 &lt;strong papago-id=&quot;33-1&quot;&gt;비트&lt;/strong&gt;가 있고 비부호 유형에 N &lt;strong papago-id=&quot;33-3&quot;&gt;값&lt;/strong&gt; 비트가 있으면 &lt;strong papago-id=&quot;33-5&quot;&gt;M≤N&lt;/strong&gt;입니다).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;부호 비트가 0이면 결과 값에 영향을 주지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;부호 비트가 1이면 다음 중 하나의 방법으로 값을 수정해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부호 비트가 0인 해당 값은 음수입니다(&lt;em papago-id=&quot;41-1&quot;&gt;부호&lt;/em&gt; 및 &lt;em papago-id=&quot;41-1&quot;&gt;크기&lt;/em&gt;).&lt;/font&gt;&lt;/li&gt; 
  &lt;li papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부호 비트는 -&lt;strong papago-id=&quot;42-1&quot;&gt;(2&lt;sup papago-id=&quot;42-1-1&quot;&gt;M&lt;/sup&gt;)(&lt;/strong&gt;&lt;em papago-id=&quot;42-3&quot;&gt;2의 보어&lt;/em&gt;) 값을 갖습니다;&lt;/font&gt;&lt;/li&gt; 
  &lt;li papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부호 비트는 -&lt;strong papago-id=&quot;43-1&quot;&gt;(&lt;/strong&gt;&lt;em papago-id=&quot;43-3&quot;&gt;2-1&lt;sup papago-id=&quot;43-1-1&quot;&gt;M&lt;/sup&gt;&lt;/em&gt;&lt;strong papago-id=&quot;43-1&quot;&gt;)&lt;/strong&gt; 값을 갖습니다(자신의&lt;em papago-id=&quot;43-3&quot;&gt; 보어&lt;/em&gt;).&lt;/font&gt;&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부호 비트가 1이고 모든 값 비트가 0인 값(처음 두 개의 경우) 또는 부호 비트와 모든 값 비트가 1인 값(자신의 보어인 경우)이 트랩 표현인지 정규 값인지 여부와 마찬가지로 이 중 어느 것이 적용되는지가 구현에 정의됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;부호와 크기 그리고 보의 경우, 이 표현이 정상 값이면 음의 0이라고 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;mafso의 훌륭한 답변에 덧붙이자면, &lt;a href=&quot;http://www.lysator.liu.se/c/rat/c1.html&quot; papago-id=&quot;45-1&quot;&gt;ANSIC의 이론적&lt;/a&gt; 근거의 일부가 이에 대해 이야기합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;46&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위원회는 C 언어를 바이너리 아키텍처로 명시적으로 제한하였는데, 이는 이 제약이 어떤 경우에도 암시적이었다는 것을 근거로 합니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;비트 필드는 &quot;잘못된 정수&quot; 표현에 대한 언급 없이 비트 수로 지정됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 비트 필드에 적합한 유일한 인코딩은 이진입니다.&lt;/font&gt;&lt;/li&gt; 
  &lt;li papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;printf의 정수 형식은 &quot;잘못된 정수&quot; 값에 대한 규정이 없음을 의미하며, 이는 비트 와이즈 조작의 결과가 printf에 의해 인쇄될 수 있는 정수 결과를 생성함을 의미합니다.&lt;/font&gt;&lt;/li&gt; 
  &lt;li papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정수 상수를 지정하는 모든 방법(10진수, 16진수 및 8진수)은 정수 값을 지정합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;비트 문자열 상수&quot;를 지정하기 위해 정수와 독립적인 메서드가 정의되지 않았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이진 인코딩만이 비트 문자열과 정수 값 사이의 완전한 일대일 매핑을 제공합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이진 숫자 시스템에 대한 제한은 그레이 코드와 같은 호기심을 배제하고 부호 없는 유형에서 비트 와이즈 연산자의 산술 정의를 가능하게 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;표준과 관련된 부분은 다음 인용문이 될 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;h3 papago-id=&quot;52&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;3.1.2.5 종류&lt;/font&gt;&lt;/h3&gt; 
 &lt;p papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;[...]&lt;/font&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;type char, signed 및 unsigned 정수 type 및 열거된 type을 통합 type이라고 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;적분 형식의 표현은 순수 이진법 숫자 체계를 사용하여 값을 정의해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;34&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;주어진 비트 패턴을 얻으려면&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 그러면 비트 와이즈 연산자는 당신의 친구입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;변환하려면&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;36&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것의 2-comple 표현에 따르면, 산술 연산자는 당신의 친구입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;구현이 정의되었기 때문에 두 가지 표현은 다를 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;58-0&quot;&gt;2011.6.5/4 표준 초안.&lt;/strong&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;일부 연산자(단항 연산자 ~ 및 이진 연산자 &amp;lt;&amp;lt;, &amp;gt;&amp;gt; &amp;amp;, ^ 및 |, 비트 와이즈 연산자로 통칭됨)는 정수형을 갖는 피연산자를 가져야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 연산자는 정수의 내부 표현에 따라 달라지는 값을 산출하고, 서명된 유형에 대해 구현 정의 및 정의되지 않은 측면을 갖습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;37&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러니까 말입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;i&amp;lt;&amp;lt;1&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;비트 pattern를 효과적으로 왼쪽으로 한 위치 이동시키지만 생성된 값은 다음과 다를 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;i*2&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;39&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(작은 값의 경우에도)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;i&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;40&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;63&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/28937523/how-to-do-a-bit-representation-in-a-c-standard-way&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>c</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/735</guid>
      <comments>https://fileupload.tistory.com/735#entry735comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:13:37 +0900</pubDate>
    </item>
    <item>
      <title>AngularJS 1.2 - ng애니메이트가 작동하지 않음</title>
      <link>https://fileupload.tistory.com/734</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;AngularJS 1.2 - ng애니메이트가 작동하지 않음&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;AngularJS 1.2로 ng-animate를 사용하는 것은 처음입니다. 왜 내 ng-animate가 특정 클래스 이름을 작동하지 않지만 예제에서 본 간단한 페이드에 대해 기본값으로 작동하는지 잘 모르겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 예제에서 나는 ng-animate 클래스를 'animation'로 설정하려고 합니다. http://plnkr.co/edit/QWQUUVdcLmzLKRvVibqN?p=preview&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본값을 사용하고 애니메이션의 클래스 이름이 &quot;.ng-enter&quot;와 &quot;.ng-leave&quot;일 때 애니메이션에서 페이드가 잘 되는 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://plnkr.co/edit/lEQhMwd6RWmsdmJbosu0?p=preview&quot; rel=&quot;noreferrer&quot; papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://plnkr.co/edit/lEQhMwd6RWmsdmJbosu0?p=preview&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떤 도움이라도 주시면 대단히 감사하겠습니다, 감사합니다!&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ng-animate 속성은 1.2에서 더 이상 사용되지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;1.2에서는 특별한 명명 규칙을 사용하여 적절한 CSS 클래스를 정의합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;'애니메이션'과 같은 특정 이름을 원할 경우, 해당 클래스를 애니매이션할 요소에 추가해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;올바른 CSS 수업이 있는 한, 일부 지시사항은 자동으로 애니메이션화됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떤 것들이 여기서 찾을 수 있을까요: http://docs.angularjs.org/api/ngAnimate&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 애니메이션이 &quot;.ng-enter&quot; 클래스를 정의할 때 두 번째 예제에서 작동하는 이유입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 이렇게 하면 엔터 애니메이션을 지원하는 모든 지시사항이 자동으로 애니메이션화됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;'애니메이션'이라는 클래스에서 작동할 수 있도록 첫 번째 예제를 업데이트했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;HTML:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;li ng-repeat=&quot;item in items&quot; class=&quot;animation&quot;&amp;gt;{{item}}&amp;lt;/li&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;CSS(&lt;em papago-id=&quot;12-1&quot;&gt;명확성을 위해 셀렉터를 그룹화&lt;/em&gt;하지 않은 상태로 &lt;em papago-id=&quot;12-1&quot;&gt;유지&lt;/em&gt;):&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.animation {
  -webkit-transition: 1s;
}

.animation.ng-enter {
  opacity: 0;
}

.animation.ng-leave {
  opacity: 1;
}

.animation.ng-enter.ng-enter-active {
  opacity: 1;
}

.animation.ng-leave.ng-leave-active {
  opacity: 0;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;플렁커:&lt;/font&gt;&lt;/strong&gt; &lt;a href=&quot;http://plnkr.co/edit/J0qJEMmwdzqXzu733fJf?p=preview&quot; rel=&quot;noreferrer&quot; papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://plnkr.co/edit/J0qJEMmwdzqXzu733fJf?p=preview&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 모듈 정의에 종속 요소로 애니메이션 모듈을 추가해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 사람이 애니메이션을 작동시키는 데 문제가 있을 경우를 대비하여 이 작업을 수행하지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;angular.module('myApp', ['ngAnimate']);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;angular.min.js 버전이 angular-animate.min.js 버전과 일치하는지 확인해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이런 식으로 제 것을 고쳤습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테세가 ng-animate가 더 이상 사용되지 않는다고 말했듯이, 우리는 수업을 사용해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;angularjs 웹 사이트 http://www.nganimate.org/angularjs/ng-repeat/move 에서 CSS를 복사하는 경우 특정 형식으로 CSS를 수정해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://www.advancesharp.com/blog/1183/apply-angularjs-animation-in-2-minutes&quot; papago-id=&quot;19-1&quot; rel=&quot;nofollow&quot;&gt;자세한&lt;/a&gt; 내용은 &lt;a href=&quot;http://www.advancesharp.com/blog/1183/apply-angularjs-animation-in-2-minutes&quot; papago-id=&quot;19-1&quot; rel=&quot;nofollow&quot;&gt;Angularjs&lt;/a&gt; Angularjs Angularjs &lt;a href=&quot;http://www.advancesharp.com/blog/1183/apply-angularjs-animation-in-2-minutes&quot; papago-id=&quot;19-1&quot; rel=&quot;nofollow&quot;&gt;Angularzimation&lt;/a&gt; in 2분 내&lt;a href=&quot;http://www.advancesharp.com/blog/1183/apply-angularjs-animation-in-2-minutes&quot; papago-id=&quot;19-1&quot; rel=&quot;nofollow&quot;&gt; 적용&lt;/a&gt; 확인&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 수용된 답변에 추가하여 다음과 같은 요소를 애니메이션화하려는 사람들을 위해 제공됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ng-show&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지시&lt;/font&gt;의&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt; 스타일을&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 스타일을 사용해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.animation.ng-hide-remove {
  transition:2s linear all;
  opacity:0;
}

.animation.ng-hide-remove.ng-hide-remove-active {
  opacity:1;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 각도 지시어가 추가되는 것은 아닙니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ng-enter, ng-enter-active, ng-leave and ng-leave-active&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.예를들면,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ng-show&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지시적 덧셈&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ng-hide-remove&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;애니메이션을 시작할 때 그리고&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ng-hide-remove-active&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 끝에&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 내용은 다음 링크를 참조하십시오. https://www.w3schools.com/angular/angular_animations.asp&lt;/font&gt;&lt;/font&gt; &lt;/p&gt;&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/19394017/angularjs-1-2-nganimate-not-working&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>AngularJS</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/734</guid>
      <comments>https://fileupload.tistory.com/734#entry734comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:13:29 +0900</pubDate>
    </item>
    <item>
      <title>크롬 디버거의 프로파일러에서 &amp;quot;(프로그램)&amp;quot;이란?</title>
      <link>https://fileupload.tistory.com/733</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;크롬 디버거의 프로파일러에서 &quot;(프로그램)&quot;이란?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;크롬 디버거의 기능란에 있는 &quot;(프로그램)&quot;이란?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;(program)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Chrome 그 자체, 다른 모든 코드를 호출하는 트리의 뿌리... 네이티브 코드에서 자바스크립트로 이동, 리소스 로딩 등이 &lt;em papago-id=&quot;0-1&quot;&gt;어딘가&lt;/em&gt;에서 시작되어야 하기 때문에 거기에 있습니다 :)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://developers.google.com/web/tools/chrome-devtools/rendering-tools/js-execution&quot; rel=&quot;noreferrer&quot; papago-id=&quot;3-1&quot;&gt;Chrome 개발자 도구 문서에서 트리&lt;/a&gt; 보기의 예를 볼 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(프로그램)은 나무의 뿌리가 아니라 네이티브 코드라고 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 스레드 참조:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=88446&quot; papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://bugs.webkit.org/show_bug.cgi?id=88446&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 메인()보다는 시스템 호출을 더 선호합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;보아하니 유휴 시간이 포함된 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 chrome:/profiler/에서 (프로그램)의 일부 프로파일링을 이용할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@Nick이 말하듯이, 그것은 어딘가에서 시작되어야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;CPU Profiler 부분은 &lt;a href=&quot;https://stackoverflow.com/questions/1777556/alternatives-to-gprof/1779343#1779343&quot; papago-id=&quot;10-1&quot;&gt;gprof와 동일&lt;/a&gt;한 개념을 기반으로 하는 다른 수많은 Profiler와 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, 편집할 수 있는 코드에 버블 종류의 숫자 배열과 같은 것이 있지 않는 한, &lt;em papago-id=&quot;11-1&quot;&gt;self&lt;/em&gt;는 거의 쓸모없는 숫자입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그럴 가능성은 거의.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;12-0&quot;&gt;총계&lt;/em&gt;는 캘리를 포함해야 하므로 더 유용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 샘플을 실행 시간뿐만 아니라 차단된 시간에 채취하지 않는 한, 완전히 cpu-bound된 프로그램을 제외하고는 여전히 쓸모가 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드 라인이 아닌 기능별로 이러한 통계를 제공합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;즉, (&lt;em papago-id=&quot;13-1&quot;&gt;Total&lt;/em&gt; percent에 의존할 수 있다면) 어떤 함수를 스텁(stub)하는 것과 같은 방법으로 시간을 0으로 만들 수 있다면 시간을 절약할 수 있다는 의미입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 비용이 많이 드는 기능에 집중하려면 최적화할 수 있는 기능을 찾아내야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러기 위해서는 함수의 코드 라인 중에서 시간이 어떻게 세분화되는지 알아야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드 라인 단위로 비용이 발생하면 해당 라인으로 바로 이동할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;줌(&lt;a href=&quot;http://www.rotateright.com/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;15-1&quot;&gt;Zoom&lt;/a&gt;)과 같이 라인 레벨로 보고하는 벽시계 스택 샘플러와 같은 더 나은 프로파일러를 얻을 수 있을지 모르겠습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/375913/what-can-i-use-to-profile-c-code-in-linux/378024#378024&quot; papago-id=&quot;15-3&quot;&gt;이렇게&lt;/a&gt; 하죠.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/3847954/what-is-program-in-chrome-debugger-s-profiler&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>javascript</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/733</guid>
      <comments>https://fileupload.tistory.com/733#entry733comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:13:22 +0900</pubDate>
    </item>
    <item>
      <title>특정 텍스트가 포함된 모든 앵커 태그를 선택하는 방법</title>
      <link>https://fileupload.tistory.com/732</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;특정 텍스트가 포함된 모든 앵커 태그를 선택하는 방법&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여러 개의 앵커 태그가 지정된 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;a class=&quot;myclass&quot; href=&quot;...&quot;&amp;gt;My Text&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;수업과 일치하는 앵커와 특정 텍스트를 선택하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;eg 클래스가 있는 모든 앵커를 선택합니다. '내 클래스' 및 텍스트: '내 텍스트'&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;$(&quot;a.myclass:contains('My Text')&quot;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 유사한 사용자 지정 선택기를 만들 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;:contains&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정확한 일치 항목:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$.expr[':'].containsexactly = function(obj, index, meta, stack) 
{  
    return $(obj).text() === meta[3];
}; 

var myAs = $(&quot;a.myclass:containsexactly('My Text')&quot;);
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;앵커의 텍스트에 특정 문자열이 &lt;em papago-id=&quot;5-1&quot;&gt;포함&lt;/em&gt;되어 있는 경우에만 신경이 쓰일 경우 @Dave Morton 솔루션을 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 특정 문자열을 &lt;em papago-id=&quot;5-3&quot;&gt;정확히&lt;/em&gt; 일치시키려면 다음과 같은 방법을 제안합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$.fn.textEquals = function(txt) {
    return $(this).text() == txt;
}

$(document).ready(function() {
    console.log($(&quot;a&quot;).textEquals(&quot;Hello&quot;));
    console.log($(&quot;a&quot;).textEquals(&quot;Hefllo&quot;))
});

&amp;lt;a href=&quot;blah&quot;&amp;gt;Hello&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;약간 개선된 버전(세컨드 &lt;em papago-id=&quot;6-1&quot;&gt;트림&lt;/em&gt; 매개 변수 포함):&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$.fn.textEquals = function(txt,trim) {
    var text = (trim) ? $.trim($(this).text()) : $(this).text();
    return text == txt;
}

$(document).ready(function() {
    console.log($(&quot;a.myclass&quot;).textEquals(&quot;Hello&quot;)); // true
    console.log($(&quot;a.anotherClass&quot;).textEquals(&quot;Foo&quot;, true)); // true
    console.log($(&quot;a.anotherClass&quot;).textEquals(&quot;Foo&quot;)); // false
});

&amp;lt;a class=&quot;myclass&quot; href=&quot;blah&quot;&amp;gt;Hello&amp;lt;/a&amp;gt;
&amp;lt;a class=&quot;anotherClass&quot; href=&quot;blah&quot;&amp;gt;   Foo&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;먼저 'MY text'가 포함된 모든 태그를 선택합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 정확한 매치마다 조건과 일치하면 원하는 것을 수행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(document).ready(function () {
    $(&quot;a:contains('My Text')&quot;).each(function () {
        $store = $(this).text();

        if ($store == 'My Text') {
            //do Anything.....
        }
    });
});
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;원하는 객체의 클래스를 모르고 링크 텍스트만 따라가려고 한다면 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;.myClass:contains('My Text')&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떤 요소인지(예: a, p, link, ...)도 모른다면 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;:contains('My Text')&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(그전에 파트를 떠나는 것뿐)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;:&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;공란)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기에 덧붙이자면 모든 요소가 시작됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;- 원하는 요소까지 태그를 지정합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 제공할 수 있는 솔루션은 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.last()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 이것은 오직 하나의 요소만 찾을 수 있을 때만 작동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아마 누군가.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 더 나은 해결책을 알고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사실, 이것은 특히 @Amalgovinus 질문에 수용된 답변에 추가되어야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정확한 일치를 위해서는 이것이 효과가 있을거라 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$(&quot;a.myclass&quot;).html() == &quot;your text&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/2446936/how-to-select-all-anchor-tags-with-specific-text&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>jquery</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/732</guid>
      <comments>https://fileupload.tistory.com/732#entry732comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:13:16 +0900</pubDate>
    </item>
    <item>
      <title>Store and retrieve JavaScript arrays into and from HTML data attributes</title>
      <link>https://fileupload.tistory.com/731</link>
      <description>&lt;h2 papago-id=&quot;0&quot;&gt;Store and retrieve JavaScript arrays into and from HTML data attributes&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot;&gt;How can a JavaScript array be stored in an HTML custom data attribute?&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot;&gt;I've tried every variation of JSON stringification and escaping characters.&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot;&gt;What is the precise method to store the array and retrieve it again?&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 다음과 함께 어레이를 구축합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;[ $(&quot;#firstSelectedElement&quot;).val(), $(&quot;#secondSelectedElement&quot;).val() ]&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 검색합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;id=&quot;storageElement&quot; data-storeIt=&quot;stuff&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;와 함께&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$(&quot;#storageElement&quot;).data('storeit')&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot;&gt;I can never seem to retrieve the data as a true array, only an array of characters.&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;요소에 HTML 이스케이프 문자를 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;data&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;JSON-like 배열(인코딩된 따옴표)을 갖는 특성:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div id=&quot;demo&quot; data-stuff='[&amp;amp;#34;some&amp;amp;#34;, &amp;amp;#34;string&amp;amp;#34;, &amp;amp;#34;here&amp;amp;#34;]'&amp;gt;&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;11&quot;&gt;And then in JavaScript get it without any additional magic:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var ar = $('#demo').data('stuff');
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;12&quot;&gt;See this &lt;a href=&quot;http://jsfiddle.net/3xfez/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;12-1&quot;&gt;JSFiddle demo&lt;/a&gt;.&lt;/p&gt; 
&lt;p papago-id=&quot;13&quot;&gt;However, escaping isn't necessary. You can do this, instead:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div id=&quot;demo&quot; data-stuff='[&quot;some&quot;, &quot;string&quot;, &quot;here&quot;]'&amp;gt;&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;14&quot;&gt;See this &lt;a href=&quot;http://jsfiddle.net/3xfez/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;14-1&quot;&gt;JSFiddle demo&lt;/a&gt;.&lt;/p&gt;&lt;p papago-id=&quot;15&quot;&gt;It depends on what type of data you're storing in the array. If it's just strings (as it appears to be) and you have a character that you &lt;em papago-id=&quot;15-1&quot;&gt;know&lt;/em&gt; will never be a part of your data (like the comma in my example below) then I would forget about JSON serialization and just use string.split:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div id=&quot;storageElement&quot; data-storeIt=&quot;stuff,more stuff&quot;&amp;gt;&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;16&quot;&gt;Then when retrieving:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var storedArray = $(&quot;#storageElement&quot;).data(&quot;storeIt&quot;).split(&quot;,&quot;);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;JSON을 사용하는 것보다 조금 더 잘 다룰 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;보다 적은 문자를 사용하고 &quot;가격&quot;이 저렴합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;JSON.parse&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;19&quot;&gt;But, if you must, your JSON implementation would look something like this:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div id=&quot;storageElement&quot; data-storeIt='[&quot;hello&quot;,&quot;world&quot;]'&amp;gt;&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;20&quot;&gt;And to retrieve:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var storedArray = JSON.parse($(&quot;#storageElement&quot;).data(&quot;storeIt&quot;));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 예에서는 준인용을 사용해야 했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;'&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;) 주변에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;data-storeIt&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;소유물.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 JSON 구문이 데이터의 문자열을 중심으로 따옴표를 사용하도록 요구하기 때문입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;HTML5 데이터 속성은 문자열만 저장할 수 있으므로 배열을 저장하려면 배열을 직렬화해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;JSON은 잘 될 것이고 당신은 옳은 길을 가고 있는 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신은 단지 사용하기만 하면 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;JSON.parse()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;직렬화된 데이터를 가져오면 다음을 수행합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var retrieved_string = $(&quot;#storageElement&quot;).data('storeit');
var retrieved_array = JSON.parse(retrieved_string);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;26&quot;&gt;Reviewing the &lt;a href=&quot;http://api.jquery.com/data/#data-html5&quot; rel=&quot;noreferrer&quot; papago-id=&quot;26-1&quot;&gt;api documentation&lt;/a&gt;, jQuery should try to automatically convert a JSON encoded string provided it is properly encoded. Can you give an example of the value you are storing?&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 HTML5 data attribute 와 jQuery 를 참고합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.data()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메소드는 두개의 구별되는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;상호작용을 하지만 jQuery는 더 강력하고 어떤 데이터 유형이든 저장할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;jQuery를 사용하여 javascript 배열을 직렬화하지 않고 바로 저장할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 HTML5 데이터 속성으로 마크업 자체에 있어야 하는 경우 문자열로만 제한됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기록상으로는 인코딩된 엔티티와 함께 작동하지 않았지만 오브젝트로 파싱하기 위해서는 데이터 속성이 잘&lt;strong papago-id=&quot;29-1&quot;&gt; 형성된 JSON 오브젝트여야 하는&lt;/strong&gt; 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 다음과 같이 객체를 사용할 수 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;data-myarray=&quot;{&amp;amp;quot;key&amp;amp;quot;: &amp;amp;quot;value&amp;amp;quot;}&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 한 개의 인용구를 사용할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;data-myobject='{&quot;key1&quot;: &quot;value1&quot;, &quot;key2&quot;: value2}'
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;즐거운 시간! :D&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 노드에 개체를 저장할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$('#storageElement').data('my-array', ['a', 'b', 'c']);

var myArray = $('#storageElement').data('my-array');
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;중첩 배열 또는 다른 방법이 필요한 경우.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;작동 내용:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;true&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-js lang-js prettyprint-override&quot;&gt;&lt;code&gt;$('[data-example]').each(function (i, e) {
    var json = $(e).data('example');
  for(var index in json){
    console.log(json[index][&quot;name&quot;] + &quot;=&quot; + json[index][&quot;value&quot;]);
  }

});&lt;/code&gt;&lt;/pre&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;div data-example='[{&quot;name&quot;: &quot;A&quot;, &quot;value&quot;: 1}, {&quot;name&quot;: &quot;B&quot;, &quot;value&quot;: 2}]' /&amp;gt;
&amp;lt;div data-example='[{&quot;name&quot;: &quot;C&quot;, &quot;value&quot;: 3}, {&quot;name&quot;: &quot;D&quot;, &quot;value&quot;: 4}]' /&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/users/6320039/ulysse-bn&quot; papago-id=&quot;35-1&quot;&gt;율리세 BN&lt;/a&gt;이 제시한 바와 같이&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면 &lt;a href=&quot;https://stackoverflow.com/users/12964069/bonifacius-sarumpaet&quot; papago-id=&quot;36-1&quot;&gt;보니파시우스 사룸페트&lt;/a&gt;가 지적한 위험한 해결책이지만 작동하는 평가()와 함께.&lt;/font&gt;&lt;/p&gt;
&lt;div class=&quot;snippet&quot; data-lang=&quot;js&quot; data-hide=&quot;false&quot; data-console=&quot;true&quot; data-babel=&quot;false&quot;&gt; 
 &lt;div class=&quot;snippet-code&quot;&gt; 
  &lt;pre class=&quot;snippet-code-html lang-html prettyprint-override&quot;&gt;&lt;code&gt;&amp;lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;div data-example=&quot;[['A', 1], ['B', 2]]&quot; /&amp;gt;
&amp;lt;div data-example=&quot;[['C', 3], ['D', 4]]&quot; /&amp;gt;

&amp;lt;script&amp;gt;
  $('[data-example]').each(function (i, e) {
    var arrayFromText = eval($(e).data('example'));
    console.log(arrayFromText[0][0] + &quot;=&quot; + arrayFromText[0][1]);
    console.log(arrayFromText[1][0] + &quot;=&quot; + arrayFromText[1][1]);
  });
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt; 
 &lt;/div&gt; 
&lt;/div&gt; 
&lt;p&gt;&lt;/p&gt;&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PHP를 사용하는 경우 PHP로 다음을 수행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$arr_test = ['A','C','E'];
$coded = json_encode($arr_test);
// paste coded in data-atribute
print '&amp;lt;div class=&quot;funPlus&quot; data-arr_diensten=&quot;'. $coded . '&quot;&amp;gt;&amp;lt;/div&amp;gt;';
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;검사 시 HTML은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;funPlus&quot; data-arr_diensten=&quot;[&amp;amp;quot;A&amp;amp;quot;,&amp;amp;quot;C&amp;amp;quot;,&amp;amp;quot;E&amp;amp;quot;]&quot;&amp;gt;&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 javascript에서 배열을 검색하지만 값이 하나만 있으면 문자열로 반환됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 이것을 테스트하고 고쳐야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 문자열이라면 우리는 추가 견적을 제거해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;$(이것은) 개체를 가리켜야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var arr_diensten = $(this).data(&quot;arr_diensten&quot;);
if (typeof arr_diensten == &quot;string&quot;) arr_diensten = [arr_diensten.slice(1, -1)];
console.log(arr_diensten);
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/16223786/store-and-retrieve-javascript-arrays-into-and-from-html-data-attributes&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>jquery</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/731</guid>
      <comments>https://fileupload.tistory.com/731#entry731comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:13:09 +0900</pubDate>
    </item>
    <item>
      <title>단위 테스트에서 내 요소가 초점이 맞춰졌는지 확인하려면 어떻게 해야 합니까?</title>
      <link>https://fileupload.tistory.com/730</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단위 테스트에서 내 요소가 초점이 맞춰졌는지 확인하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;필드에 자동 초점을 맞추려면 다음과 같은 지침이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.directive('ngAutofocus', function ($timeout) {
    return {
        restrict: 'A',
        link: function (scope, elm) {
                $timeout(function () {
                elm[0].focus();
            });
        }
    };
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;유닛 테스트는 어떻게 해야 합니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 셀렉터와 같은 몇 가지를 시도해 보았지만 모두 오류나 거짓을 반환합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;console.log($(elm[0]).is(':focus'));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;장치 테스트는 다음과 같이 설정됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;elm = angular.element('&amp;lt;input type=&quot;text&quot;  name=&quot;textfield1&quot; ng-autofocus&amp;gt;');
$scope.$digest();
$compile(elm)($scope);
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 알아냈는데, 사실 꽤 분명했어요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;it('should set the focus on timeout', function () {
    spyOn(elm[0],'focus');
    $timeout.flush();
    expect(elm[0].focus).toHaveBeenCalled();
})
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 문제는 두 가지였습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;타임아웃 플러시 기능을 호출하지 않아서 타임아웃이 발생하지 않았습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 요소의 포커스 속성을 보려고 했는데 포커스() 함수의 호출만 보는 것은 유닛 테스트에 훨씬 가깝습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;포커스 속성은 실제로 e2e 테스트 영역에 속하는 것입니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용가능&lt;/font&gt;&lt;/font&gt;&lt;code&gt;document.activeElement&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;초점을 확인합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;유일한 단점은 HTML을 문서 본문에 추가해야 작동할 수 있다는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Document/activeElement&quot; rel=&quot;noreferrer&quot; papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/API/Document/activeElement&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;바로 실행되는 포커스를 테스트(스파이닝)할 수 있는 아래의 보다 상세한 솔루션(즉, 없음)&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$timeout&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(또는 기타 이벤트).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;핵심은 먼저 A를 렌더링하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;DOM element&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;전에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$compile&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실행:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;'use strict';

describe('Testing the focus call from the link function', function () {

    var $compile;
    var $rootScope;

    beforeEach(angular.mock.module('auto-focus-module'));

    beforeEach(inject(function (_$compile_, _$rootScope_) {

        $compile = _$compile_;
        $rootScope = _$rootScope_;

    }));

    it('should automatically focus when calling the link function', function () {

        var $scope = $rootScope.$new();

        // create an uncompiled DOM element so we can bind the focus spy
        var rawEl = angular.element('&amp;lt;input auto-focus-directive&amp;gt;');

        // set the spy
        spyOn(rawEl[0], 'focus');

        // compile the rawEl so that compile and link functions run
        $compile(rawEl)($scope);

        expect(rawEl[0].focus).toHaveBeenCalled();

    });

});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;A와 함께&lt;/font&gt;&lt;/font&gt;&lt;code&gt;directive&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;link&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 기능이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(function () {

    'use strict';

    angular.module('auto-focus-module')
        .directive('autoFocusDirective', autoFocusDirective);

    function autoFocusDirective () {

        return {
            link: link
        };

        function link (scope, elem) {

            elem[0].focus();

        }

    }

})();
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;angular.element api - jQuery lite - 를 사용하고 triggerHandler() 메서드를 사용해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;it('should have focus', function() {
    elm.triggerHandler('focus');
    expect(elm).toBeInFocus() //PSEUDO CODE - you will need to see how this can be tested
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;a href=&quot;http://docs.angularjs.org/api/ng/function/angular.element&quot; rel=&quot;nofollow&quot; papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://docs.angularjs.org/api/ng/function/angular.element&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://api.jquery.com/triggerhandler/&quot; rel=&quot;nofollow&quot; papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://api.jquery.com/triggerhandler/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일부 테스트 포커스 지식의 잠재적 영역:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://shanetomlinson.com/2014/test-element-focus-javascript&quot; rel=&quot;nofollow&quot; papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://shanetomlinson.com/2014/test-element-focus-javascript&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 단위 테스트와 관련하여 - 본체에 요소를 추가할 필요가 없고, 그렇지 않아도 테스트가 가능합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/22330098/how-do-i-check-if-my-element-has-been-focussed-in-a-unit-test&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>AngularJS</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/730</guid>
      <comments>https://fileupload.tistory.com/730#entry730comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:13:01 +0900</pubDate>
    </item>
    <item>
      <title>문자[]의 일부분을 C로 인쇄하는 가장 간단한 방법</title>
      <link>https://fileupload.tistory.com/729</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자[]의 일부분을 C로 인쇄하는 가장 간단한 방법&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들면 제가.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;char* str = &quot;0123456789&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;처음 세 글자와 마지막 세 글자를 자르고 중간만 인쇄하려고 하는데, 가장 간단하고 안전한 방법은 무엇입니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자, 비결은.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;자를 부분과 인쇄할 부분은 크기가 다양해서 아주 긴 char*, 아니면 아주 작은 char*를 가질 수 있었습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용가능&lt;/font&gt;&lt;/font&gt;&lt;code&gt;printf()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 그리고 특별한 형식 문자열:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;char *str = &quot;0123456789&quot;;
printf(&quot;%.6s\n&quot;, str + 1);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정확도가.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;%s&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;변환 지정자는 인쇄할 최대 문자 수를 지정합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;변수를 사용하여 런타임의 정밀도를 지정할 수도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int length = 6;
char *str = &quot;0123456789&quot;;    
printf(&quot;%.*s\n&quot;, length, str + 1);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 예제에서 *는 다음 인수(&lt;/font&gt;&lt;/font&gt;&lt;code&gt;length&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;)에 대한 정밀도가 포함될 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;%s&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;변환, 해당 인수는 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;포인터 산술을 사용하여 위와 같이 시작 위치를 지정할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;[편집]&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자열이 정밀 지정자보다 짧으면 다음과 같은 문자가 더 적게 인쇄됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int length = 10;
char *str = &quot;0123456789&quot;;
printf(&quot;%.*s\n&quot;, length, str + 5);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인쇄 예정&quot;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;56789&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;. 항상 특정 문자 수만큼 인쇄하려면 최소 필드 너비와 정밀도를 모두 지정합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;printf(&quot;%10.10s\n&quot;, str + 5);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;printf(&quot;%*.*s\n&quot;, length, length, str + 5);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음을 인쇄합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&quot;     56789&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마이너스 기호를 사용하여 필드의 출력을 왼쪽으로 조정할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;printf(&quot;%-10.10s\n&quot;, str + 5);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마지막으로 최소 필드 폭과 정밀도가 다를 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;printf(&quot;%8.5s\n&quot;, str);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 8자 필드에 최대 5자 오른쪽 justified으로 인쇄됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로버트 갬블과 스티브는 대부분의 작품을 따로 가지고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;전체로 조립:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;void print_substring(const char *str, int skip, int tail)
{
    int len = strlen(str);
    assert(skip &amp;gt;= 0);
    assert(tail &amp;gt;= 0 &amp;amp;&amp;amp; tail &amp;lt; len);
    assert(len &amp;gt; skip + tail);
    printf(&quot;%.*s&quot;, len - skip - tail, str + skip);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예제에 대한 호출:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;print_substring(&quot;0123456789&quot;, 1, 3);
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터를 수정하는 것이 괜찮다면 포인터 연산을 할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;str이 배열이 아닌 문자 포인터라고 가정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;char string[] = &quot;0123456789&quot;;
char *str = string;

str += 3; // &quot;removes&quot; the first 3 items
str[4] = '\0'; // sets the 5th item to NULL, effectively truncating the string

printf(str); // prints &quot;3456&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;개인 라이브러리에서 찾은 깨끗하고 간단한 하위 문자열 기능은 유용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;char *
substr(const char *src, size_t start, size_t len)
{
  char *dest = malloc(len+1);
  if (dest) {
    memcpy(dest, src+start, len);
    dest[len] = '\0';
  }
  return dest;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 아마도 스스로 설명할 수 있지만 문자열, 시작 위치(0에서 시작), 길이를 사용하고 malloc이 실패하면 원래 문자열의 하위 문자열이나 null 포인터를 반환합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;반환되는 포인터는 다음과 같을 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;free&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;더 이상 메모리가 필요 없을 때 호출자가 호출합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;C의 정신에서 함수는 제공된 시작 위치와 길이를 검증하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;printf로 할 수 있는 마법 중에 특정한 숫자의 글자만 인쇄할 수 있는 것이 있다고 생각하지만, 그것은 일반적으로 이해되거나 사용되지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;우리는 이전 직장에서 하려고 했지만 지속적으로 작동하지 못했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 할 일은 문자를 저장하고 문자열에 있는 문자를 무효화하고 인쇄한 다음 다시 저장하는 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/256218/the-simplest-way-of-printing-a-portion-of-a-char-in-c&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>c</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/729</guid>
      <comments>https://fileupload.tistory.com/729#entry729comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:12:54 +0900</pubDate>
    </item>
    <item>
      <title>Google Apps 스크립트 쿼리를 Maria에게 보냅니다.DB</title>
      <link>https://fileupload.tistory.com/728</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Google Apps 스크립트 쿼리를 Maria에게 보냅니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;DB&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;최근 새로운 서버로 데이터를 옮겼습니다. 그러나 새로운 서버는 MariaDB를 사용하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우리는 스프레드시트용 Google Apps Script에서 많은 쿼리와 계산을 수행합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;서버 전환 이후 스크립트는 다음 오류를 반환합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;알 수 없는 시스템 변수 'OPTION'(21행, 파일 &quot;)&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;21행은 다음 스크립트 내부의 쿼리를 나타냅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function mysql_invoice() {

// Replace the variables in this block with real values.
var address = 'xxx';
var user = 'xxx';
var userPwd = 'xxx';
var db = 'xxx';

var dbUrl = 'jdbc:mysql://' + address + '/' + db;

// Read up to 100000 rows of data from the table and log them.

     var conn = Jdbc.getConnection(dbUrl, user, userPwd); 
      var stmt = conn.createStatement();


  // Call SO DATA 
      stmt.setMaxRows(10000);
      var start = new Date();

      var rs = stmt.executeQuery(&quot;select * from sales_flat_invoice&quot;);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;무슨 생각 있어요?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신이 setMaxRows를 사용한 방식이 문제라고 생각합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제한을 설정하는 방법을 변경하면 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  // Call SO DATA 
  //      stmt.setMaxRows(10000);
  var start = new Date();

  var rs = stmt.executeQuery(&quot;select * from sales_flat_invoice limit 10000&quot;);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하면 문제가 해결됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 확실히 당신의 MariaDB 버전과 jdbc 커넥터 버전의 미스매치에서 비롯됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;건배.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/33810115/google-apps-script-query-to-mariadb&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>MariaDB</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/728</guid>
      <comments>https://fileupload.tistory.com/728#entry728comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:12:47 +0900</pubDate>
    </item>
    <item>
      <title>Mount-DiskImage와 함께 마운트된 ISOI의 드라이브 문자를 가져오려면 어떻게 해야 합니까?</title>
      <link>https://fileupload.tistory.com/727</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Mount-DiskImage와 함께 마운트된 ISOI의 드라이브 문자를 가져오려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://technet.microsoft.com/en-us/library/hh848706(v=wps.620).aspx&quot; papago-id=&quot;1-1&quot; rel=&quot;noreferrer&quot;&gt;Mount-DiskImage&lt;/a&gt; 명령을 통해 ISO I 마운트를 수행합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 마운트된 디스크 이미지의 드라이브 문자를 어떻게 받아야 하는지 모르겠습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 노력한다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$mountResult = Mount-DiskImage D:\ISOs\clonezilla-live-1.2.12-10-i486.iso -PassThru&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 아래와 같이 반환되는 정보는 드라이브 문자가 아닙니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;PS C:\Windows\system32&amp;gt; $mountResult | fl *


Attached              : False
BlockSize             : 0
DevicePath            : 
FileSize              : 110100480
ImagePath             : D:\ISOs\clonezilla-live-1.2.12-10-i486.iso
LogicalSectorSize     : 2048
Number                : 
Size                  : 110100480
StorageType           : 1
PSComputerName        : 
CimClass              : ROOT/Microsoft/Windows/Storage:MSFT_DiskImage
CimInstanceProperties : {Attached, BlockSize, DevicePath, FileSize...}
CimSystemProperties   : Microsoft.Management.Infrastructure.CimSystemProperties

PS C:\Windows\system32&amp;gt; $mountResult | select -ExpandProperty CimSystemProperties | fl *


Namespace  : ROOT/Microsoft/Windows/Storage
ServerName : ECHO-BASE
ClassName  : MSFT_DiskImage
Path       : 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://technet.microsoft.com/en-us/library/hh848678(v=wps.620).aspx&quot; papago-id=&quot;3-1&quot; rel=&quot;noreferrer&quot;&gt;Get-Disk&lt;/a&gt; 이미지 호출&lt;/font&gt;&lt;/font&gt; &lt;code&gt;D:\ISOs\clonezilla-live-1.2.12-10-i486.iso&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;드라이브 문자도 반환되지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;드라이브 문자는 어떻게 받습니까?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;시도해 보기:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$mountResult = Mount-DiskImage D:\ISOs\clonezilla-live-1.2.12-10-i486.iso -PassThru
$mountResult | Get-Volume
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 ISO가 할당된 드라이브 문자가 다른 정보와 함께 반환됩니다. 따라서 출력을 구문 분석하는 문제가 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편집: 드라이브 문자만 반환됩니다.&lt;/font&gt;&lt;/p&gt;
&lt;pre papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;$driveLetter =($mountResult | Get-Volume).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;드라이브 레터&lt;/font&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 이것이 효과가 있다는 것을 알았습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$beforeMount = (Get-Volume).DriveLetter

$mountResult = Mount-DiskImage $imagePath

$setuppath = (compare $beforeMount (Get-Volume).DriveLetter -PassThru) + &quot;:\&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;참고로 저는 동일한 이미지를 다시 마운트하는 데 문제가 있어서 마운트가 안 되면 이미지가 이미 마운트되었는지 확인하고 볼륨을 주는 작은 변경을 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ImagePath= &quot; &quot; ## Path of ISO image to be mounted 
$ISODrive = (Get-DiskImage -ImagePath $ImagePath | Get-Volume).DriveLetter
IF (!$ISODrive) {
Mount-DiskImage -ImagePath $ImagePath -StorageType ISO
}
$ISODrive = (Get-DiskImage -ImagePath $ImagePath | Get-Volume).DriveLetter
Write-Host (&quot;ISO Drive is &quot; + $ISODrive)
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;흠..왜 이렇게 복잡해요?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Mount-DiskImage D:\cd.iso -PassThru | Get-Volume
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 그것이 여기에 속하는지 완전히 확신할 수는 없지만, 질문과 대답을 고려하면 그렇다고 할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기울임꼴: COMMAND PROCOM에서 복사.&lt;/font&gt;&lt;/p&gt; 
&lt;h1 papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가정&lt;/font&gt;&lt;/h1&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마운트에 대해 이야기할 때는 대개 디스크 파트(DISKPART)가 있는 마운트(가상) 디스크에 대해 이야기합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;EXE 또는 등의 설치 파일.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;WIM이랑.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;우리가 DISM을 가지고 있는 SWM.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;EXE(IMAGEX).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;EXE) 또는 'NTLite'와 같은 타사 소프트웨어, 또는 CD 및 DVD 이미지와 관련된 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ISO. 제가 알기로는.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ISO 파일은 타사 소프트웨어를 사용하지 않는 한 항상 읽기 전용으로 마운트됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;ISO 파일은 가장 융통성이 없는 파일이기 때문에 소스 파일에 대한 명확한 경로에 따라 하나 이상의 복사 명령, 찾기 명령 또는 읽기 명령에 대해 소스 파일에 대한 정확하고 완전한 경로를 제공하기 위해 당시 질문을 받았다는 가정에서 작성했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;반드시 장착된 이미지로 가는 경로는 아닙니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt; &lt;/font&gt;&lt;/p&gt; 
&lt;h1 papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하나의 가능한 해결책#&lt;/font&gt;&lt;/h1&gt; 
&lt;pre&gt;&lt;code&gt;c:\windows\system32&amp;gt;powershell.exe mount-diskimage -imagepath
&quot;d:\blah\vlah.iso&quot; -confirm -passthru

Attached           : True
Blocksize          : 0
Devicepath         : \\.\CDROM0 &amp;lt;&amp;lt;== Object of interest, since COPY.EXE
Filesize           : 4586569728           won't recurse and XCOPY.EXE
Imagepath          : &quot;d:\blah\vlah.iso&quot;   won't accept it as a valid 
Logicalsectorsize  : 2048                 path, however ROBOCOPY.EXE
Number             : 0                 will accept it and then it does 
Size               : 4586569728        do what I demand of it, copy the  
Storagetype        : 1                 contents of the  mounted .ISO
Pscomputername     :

xcopy \\.\CDROM0\*.* C:\new /h /i /c /k /e /r /y /f /b
Invalid drive specification
0 File(s) copied

Robocopy \\.\CDROM0 C:\new /E /ZB /COPYALL /256 /R:3 /W:1 /X /V /TS  
/FP /NP /ETA /LOG:w:\ROBO.LOG /TEE /NJH
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 조합이 질문에 답하고 문제를 해결하는 데 가장 효과적이라는 것은 파워셸 이후 문제를 해결하는 데는 이 조합이 가장 효과적입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;EXE는 'gui'를 열지 않고(허용된 경우 'stdout' 및 'stderr' 피드백이 하나의 창에 모두 표시됨), 파일에 불필요한 드라이브 문자를 입력하거나 명령을 내리는 'stdout'을 제공합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 맞다면 '장치 경로'는 항상 동일하게 적용됩니다. 비록 이를 확인하지는 않았지만, 제 컴퓨터에서만 해당되는지 여부는 알 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h1 papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파워셸의 사용에 관한 문제.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;EXE 명령 PROPMT를 통한 EXE&lt;/font&gt;&lt;/h1&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;한 가지 문제는 제 컴퓨터일 수도 있지만 파워셸을 반복하는 것이 좋습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;EXE 명령은 대부분의 경우 저와 제 배치 파일에서 &lt;em papago-id=&quot;20-1&quot;&gt;'Attached &lt;/em&gt;: &lt;em papago-id=&quot;20-1&quot;&gt;False'&lt;/em&gt;를 첫 번째 시도의 결과로, 마운트 해제(&lt;em papago-id=&quot;20-3&quot;&gt;false&lt;/em&gt;)와 이미지 해제(&lt;em papago-id=&quot;20-5&quot;&gt;false&lt;/em&gt;)를 모두 수행하기 때문입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 '&lt;em papago-id=&quot;20-7&quot;&gt;시스템에서 지정한 경로를 찾을&lt;/em&gt; 수 &lt;em papago-id=&quot;20-7&quot;&gt;없습니다'&lt;/em&gt;와 같은 오류가 발생합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 다른 명령이 의도된 '마운트 포인트' 및 이미지를 참조하는 순간에 이어집니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부록 05-feb-2017: \&quot;를 사용한 해결책을 알게 되었습니다.\&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;CDROMX는 /256을 추가할 때만 작동하는 것으로 보이며, 그렇지 않으면 다음 메시지와 함께 실패할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2017/02/05 01:11:15 ERROR 53 (0x000035)&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;원본 디렉토리에 액세스하는 중 \.\&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;CDROM0\ 네트워크 경로를 찾을 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 이것이 사람들에게 도움이 되기를 바랍니다. 메모장 긴 줄 설정에 따라 72는 스택 오버플로우에 보기 흉한 레이아웃을 만듭니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 VHD를 장착하고 있는데 합격된 답변이 나오지 않았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;몇 가지 추가 명령을 통해 결과를 파이프링하면 그렇게 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$mountResult = Mount-DiskImage C:\some.VHD -PassThru
($mountResult | Get-Disk | Get-Partition | Get-Volume).DriveLetter
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 파워쉘 초보라서 뭔가 잘못하고 있거나 ISO가 아닌 VHD를 사용하고 있기 때문일 수도 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;효과가 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$beforeMount = (Get-Volume).DriveLetter
$imagePath = 'C:\dsc\en_windows_server_2016_x64_dvd_9718492.iso'
$mountResult = Mount-DiskImage $imagePath
$afterMount = (Get-Volume).DriveLetter
$setuppath = &quot;$(($afterMount -join '').replace(($beforeMount -join ''), '')):\&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오늘에서야 파워셸을 보기 시작했는데 동료가 같은 질문을 하는 것을 들었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그게 도움이 된다면, 저는 그것을 하나의 줄로 묶었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그들이 비슷한 질문을 하고 있던 다른 스레드에도 이 글을 올렸습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;mountvol &quot;Y:&quot; (Mount-Disk Image - ImagePath &quot;c:\x.iso&quot; - NoDriveLetter | Get-Volume).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;UniqueId&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 마운트 해제 방법:&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;디스크 이미지 마운트 해제 - 이미지 경로 &quot;c:\x.iso&quot;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;안부 전합니다&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/16452901/how-do-i-get-the-drive-letter-for-the-iso-i-mounted-with-mount-diskimage&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>powershell</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/727</guid>
      <comments>https://fileupload.tistory.com/727#entry727comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:12:40 +0900</pubDate>
    </item>
    <item>
      <title>Swift를 사용하여 iOS에서 뷰 컨트롤러를 오른쪽에서 왼쪽으로 표시하는 방법</title>
      <link>https://fileupload.tistory.com/726</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Swift를 사용하여 iOS에서 뷰 컨트롤러를 오른쪽에서 왼쪽으로 표시하는 방법&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;presentViewController를 사용하여 새 화면을 표시하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let dashboardWorkout = DashboardWorkoutViewController()
presentViewController(dashboardWorkout, animated: true, completion: nil)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 아래에서 위로 새로운 화면을 보여주지만 나는 그것을 사용하지 않고 오른쪽에서 왼쪽으로 보여주길 원합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UINavigationController&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스토리보드 대신 Xib을 사용하고 있는데 어떻게 해야 하나요?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것이 중요한 것이 아닙니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;xib&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;storyboard&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신이 사용하고 있는.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적으로 오른쪽에서 왼쪽으로의 전환은 보기 컨트롤러를 프레젠테이션으로 밀어 넣을 때 사용됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UINavigiationController&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;갱신하다&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;타이밍함수추가&lt;/font&gt;&lt;/font&gt;&lt;code&gt;kCAMediaTimingFunctionEaseInEaseOut&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;GitHub에 &lt;strong papago-id=&quot;11-2&quot;&gt;Swift&lt;/strong&gt; 4 &lt;strong papago-id=&quot;11-2&quot;&gt;구현&lt;/strong&gt;이 추가된 &lt;a href=&quot;https://github.com/mrvincenzo/present-as-push-demo&quot; rel=&quot;noreferrer&quot; papago-id=&quot;11-0&quot;&gt;샘플 프로젝트&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br&gt; &lt;strong papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스위프트 3 &amp;amp; 4.2&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let transition = CATransition()
transition.duration = 0.5
transition.type = CATransitionType.push
transition.subtype = CATransitionSubtype.fromRight
transition.timingFunction = CAMediaTimingFunction(name:CAMediaTimingFunctionName.easeInEaseOut)
view.window!.layer.add(transition, forKey: kCATransition)
present(dashboardWorkout, animated: false, completion: nil)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;br&gt; &lt;strong papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ObjC&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CATransition *transition = [[CATransition alloc] init];
transition.duration = 0.5;
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromRight;
[transition setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[self.view.window.layer addAnimation:transition forKey:kCATransition];
[self presentViewController:dashboardWorkout animated:false completion:nil];
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;br&gt; &lt;strong papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스위프트 2.x&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let transition = CATransition()
transition.duration = 0.5
transition.type = kCATransitionPush
transition.subtype = kCATransitionFromRight
transition.timingFunction = CAMediaTimingFunction(name:kCAMediaTimingFunctionEaseInEaseOut)
view.window!.layer.addAnimation(transition, forKey: kCATransition)
presentViewController(dashboardWorkout, animated: false, completion: nil)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;뭔가.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;animated&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;의 매개 변수&lt;/font&gt;&lt;/font&gt;&lt;code&gt;presentViewController&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자 지정 전환의 경우 메서드는 실제로 중요하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떤 가치라도 있을 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;true&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;false&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재/해체 코드 작성, 스위프트 3&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;extension UIViewController {

    func presentDetail(_ viewControllerToPresent: UIViewController) {
        let transition = CATransition()
        transition.duration = 0.25
        transition.type = kCATransitionPush
        transition.subtype = kCATransitionFromRight
        self.view.window!.layer.add(transition, forKey: kCATransition)

        present(viewControllerToPresent, animated: false)
    }

    func dismissDetail() {
        let transition = CATransition()
        transition.duration = 0.25
        transition.type = kCATransitionPush
        transition.subtype = kCATransitionFromLeft
        self.view.window!.layer.add(transition, forKey: kCATransition)

        dismiss(animated: false)
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 답을 읽고 올바른 해결책을 찾을 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;올바른 방법은 제시된 VC 대리인을 위해 사용자 정의 UIViewController Animated Transitioning을 만드는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 더 많은 단계를 수행해야 한다고 가정하지만, 결과는 사용자 정의가 가능하고, 표시된 뷰와 함께 뷰에서 이동하는 것과 같은 부작용이 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ViewController가 있고 다음을 표시하는 방법이 있다고 가정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var presentTransition: UIViewControllerAnimatedTransitioning?
var dismissTransition: UIViewControllerAnimatedTransitioning?    

func showSettings(animated: Bool) {
    let vc = ... create new vc to present

    presentTransition = RightToLeftTransition()
    dismissTransition = LeftToRightTransition()

    vc.modalPresentationStyle = .custom
    vc.transitioningDelegate = self

    present(vc, animated: true, completion: { [weak self] in
        self?.presentTransition = nil
    })
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;presentTransition&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dismissTransition&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;보기 컨트롤러를 애니메이션화하는 데 사용됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;View Controller를 사용하여&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UIViewControllerTransitioningDelegate&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;extension ViewController: UIViewControllerTransitioningDelegate {
    func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -&amp;gt; UIViewControllerAnimatedTransitioning? {
        return presentTransition
    }

    func animationController(forDismissed dismissed: UIViewController) -&amp;gt; UIViewControllerAnimatedTransitioning? {
        return dismissTransition
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마지막 단계는 맞춤형 전환을 생성하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class RightToLeftTransition: NSObject, UIViewControllerAnimatedTransitioning {
    let duration: TimeInterval = 0.25

    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -&amp;gt; TimeInterval {
        return duration
    }

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        let container = transitionContext.containerView
        let toView = transitionContext.view(forKey: .to)!

        container.addSubview(toView)
        toView.frame.origin = CGPoint(x: toView.frame.width, y: 0)

        UIView.animate(withDuration: duration, delay: 0, options: .curveEaseOut, animations: {
            toView.frame.origin = CGPoint(x: 0, y: 0)
        }, completion: { _ in
            transitionContext.completeTransition(true)
        })
    }
}

class LeftToRightTransition: NSObject, UIViewControllerAnimatedTransitioning {
    let duration: TimeInterval = 0.25

    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -&amp;gt; TimeInterval {
        return duration
    }

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        let container = transitionContext.containerView
        let fromView = transitionContext.view(forKey: .from)!

        container.addSubview(fromView)
        fromView.frame.origin = .zero

        UIView.animate(withDuration: duration, delay: 0, options: .curveEaseIn, animations: {
            fromView.frame.origin = CGPoint(x: fromView.frame.width, y: 0)
        }, completion: { _ in
            fromView.removeFromSuperview()
            transitionContext.completeTransition(true)
        })
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드 뷰 컨트롤러가 현재 컨텍스트를 통해 표시되므로 해당 시점부터 사용자 정의를 수행할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 당신은 관습을 볼수있을것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UIPresentationController&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용할 때도 유용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UIViewControllerTransitioningDelegate&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자 지정 segue를 사용할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스위프트 5&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;class SegueFromRight: UIStoryboardSegue {

    override func perform() {
        let src = self.source
        let dst = self.destination

        src.view.superview?.insertSubview(dst.view, aboveSubview: src.view)
        dst.view.transform = CGAffineTransform(translationX: src.view.frame.size.width, y: 0)

        UIView.animate(withDuration: 0.25,
               delay: 0.0,
               options: UIView.AnimationOptions.curveEaseInOut,
               animations: {
                    dst.view.transform = CGAffineTransform(translationX: 0, y: 0)
            },
                   completion: { finished in
                    src.present(dst, animated: false, completion: nil)
        })
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이거 먹어봐요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    let animation = CATransition()
    animation.duration = 0.5
    animation.type = kCATransitionPush
    animation.subtype = kCATransitionFromRight
     animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
    vc.view.layer.addAnimation(animation, forKey: &quot;SwitchToView&quot;)

    self.presentViewController(vc, animated: false, completion: nil)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서&lt;/font&gt;&lt;/font&gt;&lt;code&gt;vc&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;뷰 컨트롤러,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;dashboardWorkout&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자네 같은 경우에는&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;UIKit을 가져와 UIViewController에 대한 확장자를 하나 만듭니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;extension UIViewController {
func transitionVc(vc: UIViewController, duration: CFTimeInterval, type: CATransitionSubtype) {
    let customVcTransition = vc
    let transition = CATransition()
    transition.duration = duration
    transition.type = CATransitionType.push
    transition.subtype = type
    transition.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
    view.window!.layer.add(transition, forKey: kCATransition)
    present(customVcTransition, animated: false, completion: nil)
}}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;간단한 통화 후에:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let vC = YourViewController()
transitionVc(vc: vC, duration: 0.5, type: .fromRight)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;왼쪽에서 오른쪽으로:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let vC = YourViewController()
transitionVc(vc: vC, duration: 0.5, type: .fromleft)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;원하는 기간으로 기간을 변경할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;h2 papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;업데이트된 2022 구문&lt;/font&gt;&lt;/h2&gt; 
&lt;h2 papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;빠른 수정&quot; CAT 전환 방법을 사용하려면...&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;class AA: UIViewController

 func goToBB() {
    
    let bb = .. instantiateViewcontroller, storyboard etc .. as! AlreadyOnboardLogin
    
    let tr = CATransition()
    tr.duration = 0.25
    tr.type = CATransitionType.moveIn
    tr.subtype = CATransitionSubtype.fromRight
    view.window!.layer.add(tr, forKey: kCATransition)
    
    present(bb, animated: false)
    bb.delegate, etc = set any other needed values
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고는...&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;func dismissingBB() {
    
    let tr = CATransition()
    tr.duration = 0.25
    tr.type = kCATransitionReveal // use &quot;Reveal&quot; here
    tr.subtype = kCATransitionFromLeft
    view.window!.layer.add(tr, forKey: kCATransition)
    
    dismiss(self) .. or dismiss(bb), or whatever
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2 papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;유감스럽게도 이 모든 것이 사실은 정확하지 않습니다 :)&lt;/font&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;code&gt;CATransition&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 일을 하기 위해 만들어진 것이 아닙니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;46&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;참고로 성가신 &lt;strong papago-id=&quot;46-1&quot;&gt;십자가가 검정으로 희미해져&lt;/strong&gt; 불행하게도 효과를 망치게 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;많은 개발자들이 (나처럼) 사용하는 것을 정말로 좋아하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;NavigationController&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 특히 특이하고 복잡한 앱의 경우에는 특정한 방식으로 표시하는 것이 더 유연한 경우가 많습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 내비게이션 컨트롤러를 &quot;추가&quot;하는 것은 어렵지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스토리보드에서 엔트리 VC로 이동하여 &quot;embed -&amp;gt; in nav controller&quot;를 클릭합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;진짜 여기까지입니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면, 당신이 원한다면.&lt;/font&gt;&lt;/p&gt; 
&lt;ol start=&quot;2&quot;&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인에&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;didFinishLaunchingWithOptions&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;nav 컨트롤러를 코드에 쉽게 추가할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신은 그 변수를 어디에도 둘 필요가 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.navigationController&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;항상 속성으로 사용할 수 있습니다. - easy.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내비게이션 컨트롤러가 있으면 화면 간에 전환을 하는 것은 사소한 일입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    let nextScreen = instantiateViewController etc as! NextScreen
    navigationController?
        .pushViewController(nextScreen, animated: true)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;pop&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또 문제가 생겼어요!&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 그건 표준 사과 &quot;듀얼 푸시&quot; 효과를 줄 뿐입니다.&lt;/font&gt;&lt;/h2&gt; 
&lt;p papago-id=&quot;59&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(이전의 것은 새 것이 미끄러지면서 더 낮은 속도로 미끄러집니다.)&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;60&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적으로 그리고 놀랍게도, 여러분은 일반적으로 완전한 사용자 정의 전환을 위해 노력해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;61&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가장 단순하고 일반적인 이동/이동 전환만 원하더라도 전체 사용자 지정 전환을 수행해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;62&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다행히도, 이 QA에 보일러 플레이트 코드를 잘라 붙이기 위해서... https://stackoverflow.com/a/48081504/294884 . 2018년 새해 복 많이 받으세요!&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;let transition = CATransition()
    transition.duration = 0.25
    transition.type = kCATransitionPush
    transition.subtype = kCATransitionFromLeft
    transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
    tabBarController?.view.layer.add(transition, forKey: kCATransition)
    self.navigationController?.popToRootViewController(animated: true)
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;63&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Swift를 사용하여 iOS에서 오른쪽에서 왼쪽으로 보기 컨트롤러를 제시합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;func FrkTransition() 

{
    let transition = CATransition()

    transition.duration = 2

    transition.type = kCATransitionPush

    transitioningLayer.add(transition,forKey: &quot;transition&quot;)

    // Transition to &quot;blue&quot; state

    transitioningLayer.backgroundColor = UIColor.blue.cgColor
    transitioningLayer.string = &quot;Blue&quot;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;64&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;64-0&quot;&gt;참조 기준&lt;/strong&gt; :&lt;strong papago-id=&quot;64-0&quot;&gt; &lt;/strong&gt;[&lt;strong papago-id=&quot;64-0&quot;&gt;https://developer.apple.com/documentation/quartzcore/catransition&lt;/strong&gt; ][&lt;a href=&quot;https://developer.apple.com/documentation/quartzcore/catransition][1]&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;64-2&quot;&gt;1]&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;65&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이거 먹어봐요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let transition: CATransition = CATransition()
transition.duration = 0.3

transition.type = kCATransitionReveal
transition.subtype = kCATransitionFromLeft
self.view.window!.layer.addAnimation(transition, forKey: nil)
self.dismissViewControllerAnimated(false, completion: nil)
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;    // Never Easy than this before :)
     // you just need to add a Static function for navigation transition
     // This Code is recommended for the view controller.
  
     public class CustomNavigation:  UIViewController {
            
            
            public override func loadView() {
                super.loadView();
                
            }
            public override func viewDidLoad() {
                super.viewDidLoad()
                // Do any additional setup after loading the view.
            }
            
            public override func viewDidAppear(_ animated: Bool) {
                super.viewDidAppear(true);
            }
        
        public static func segueNavToLeft(view: UIView) {
                let transition = CATransition()
                transition.duration = 0.3
                transition.type = CATransitionType.push
                transition.subtype = CATransitionSubtype.fromLeft
                transition.timingFunction = CAMediaTimingFunction(name:CAMediaTimingFunctionName.easeInEaseOut)
                view.window!.layer.add(transition, forKey: kCATransition)
            }
            
            public static func segueNavToRight(view: UIView) {
                let transition = CATransition()
                transition.duration = 0.3
                transition.type = CATransitionType.push
                transition.subtype = CATransitionSubtype.fromRight
                transition.timingFunction = CAMediaTimingFunction(name:CAMediaTimingFunctionName.easeInEaseOut)
                view.window!.layer.add(transition, forKey: kCATransition)
            }
            
        }
    
    
    
    // simply call in your viewcontroller:
     func moveToRight()  {
            
            CustomNavigation.segueNavToRight(view: view)
    
            let controller = self.storyboard?.instantiateViewController(withIdentifier: &quot;id&quot;) as! YourViewController
            let navigationController = UINavigationController(rootViewController: YourViewController)
            navigationController.modalPresentationStyle = .fullScreen
            self.present(navigationController, animated: false, completion: nil)
            
          
        }

func moveToLeft() {

       CustomNavigation.segueNavToLeft(view: view)
        self.dismiss(animated: true, completion: nil)
} 
&lt;/code&gt;&lt;/pre&gt;&lt;ol&gt; 
 &lt;li papago-id=&quot;66&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;밀 때 회색 바탕&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;pre&gt;&lt;code&gt;class RightToLeftPresentationController: UIPresentationController {
    lazy var blackView: UIView = {
        let view = UIView()
        view.frame = self.containerView?.bounds ?? .zero
        view.backgroundColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0.5)
        
        return view
    }()
    
    // MARK:- Presentation
    override func presentationTransitionWillBegin() {
        self.containerView?.addSubview(blackView)
        
        self.presentingViewController.transitionCoordinator?
            .animate(alongsideTransition: { _ in
                self.blackView.alpha = 0.5
            }, completion: nil)
    }
    
    // MARK:- Dismiss
    override func dismissalTransitionWillBegin() {
        UIView.animate(withDuration: 0.25) {
            self.blackView.alpha = 0
        }
    }

    override func dismissalTransitionDidEnd(_ completed: Bool) {
        if completed {
            blackView.removeFromSuperview()
        }
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;ol start=&quot;2&quot;&gt; 
 &lt;li papago-id=&quot;67&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지원 스토리보드&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;pre&gt;&lt;code&gt;class RightToLeftPresentationSegue: UIStoryboardSegue {
    override func perform() {
        destination.modalPresentationStyle = .custom
        destination.transitioningDelegate = self
        source.present(destination, animated: true)
    }
}
extension RightToLeftPresentationSegue: UIViewControllerTransitioningDelegate {
    func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -&amp;gt; UIPresentationController? {
        let controller = RightToLeftPresentationController(presentedViewController: presented, presenting: presenting)
        presented.transitioningDelegate = controller
        
        return controller
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;ol start=&quot;3&quot;&gt; 
 &lt;li papago-id=&quot;68&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;support off&lt;a href=&quot;https://stackoverflow.com/a/50213557/3282496&quot; papago-id=&quot;68-1&quot;&gt;(@hotjard&lt;/a&gt; 감사합니다)&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;pre&gt;&lt;code&gt;extension RightToLeftPresentationController: UIViewControllerTransitioningDelegate {
    func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -&amp;gt; UIViewControllerAnimatedTransitioning? {
        return RightToLeftTransition()
    }
    
    func animationController(forDismissed dismissed: UIViewController) -&amp;gt; UIViewControllerAnimatedTransitioning? {
        return LeftToRightTransition()
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code&gt;class RightToLeftTransition: NSObject, UIViewControllerAnimatedTransitioning {
    let duration: TimeInterval = 0.25

    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -&amp;gt; TimeInterval {
        return duration
    }

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        let container = transitionContext.containerView
        let toView = transitionContext.view(forKey: .to)!

        container.addSubview(toView)
        toView.frame.origin = CGPoint(x: toView.frame.width, y: 0)

        UIView.animate(withDuration: duration, delay: 0, options: .curveEaseOut, animations: {
            toView.frame.origin = CGPoint(x: 0, y: 0)
        }, completion: { _ in
            transitionContext.completeTransition(true)
        })
    }
}

class LeftToRightTransition: NSObject, UIViewControllerAnimatedTransitioning {
    let duration: TimeInterval = 0.25

    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -&amp;gt; TimeInterval {
        return duration
    }

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        let container = transitionContext.containerView
        let fromView = transitionContext.view(forKey: .from)!

        container.addSubview(fromView)
        fromView.frame.origin = .zero

        UIView.animate(withDuration: duration, delay: 0, options: .curveEaseIn, animations: {
            fromView.frame.origin = CGPoint(x: fromView.frame.width, y: 0)
        }, completion: { _ in
            fromView.removeFromSuperview()
            transitionContext.completeTransition(true)
        })
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;69&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;CAT Transition()을 사용하여 볼 수 있는 &quot;검은색&quot; 전환을 보지 않고 Apple의 고전 애니메이션을 유지하고 싶다면 제게 효과가 있는 더 나은 솔루션을 제공합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;단순히 popToViewController 메서드를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;70&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;필요한 뷰컨트롤러를 찾을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;self.navigationController.viewControllers // Array of VC that contains all VC of current stack
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;71&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;restoreIdentifier를 검색하여 필요한 보기컨트롤러를 찾을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;72&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;주의: 예를 들어, 3개의 뷰 컨트롤러를 통해 탐색할 때 마지막에 도착하면 첫 번째를 팝업합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 경우 popToViewController가 해당 컨트롤러를 덮어썼기 때문에 을(를) 잃게 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그건 그렇고 해결책이 있습니다. 나중에 필요한 VC인 popToView 컨트롤러 이전에 쉽게 저장할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저한테는 아주 잘 통했어요.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;73&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/37722323/how-to-present-view-controller-from-right-to-left-in-ios-using-swift&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>swift</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/726</guid>
      <comments>https://fileupload.tistory.com/726#entry726comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:12:32 +0900</pubDate>
    </item>
    <item>
      <title>C 내장 소프트웨어에서 룩업 테이블 대 스위치</title>
      <link>https://fileupload.tistory.com/725</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C 내장 소프트웨어에서 룩업 테이블 대 스위치&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또 다른 이야기를 들어보면, 저는 그 말을 들었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;switch&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;속도와 컴팩트성 면에서 &lt;em papago-id=&quot;2-1&quot;&gt;룩업 테이블보&lt;/em&gt;다 더 나을 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 저는 이것의 차이점을 이해하고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;조회표&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;static void func1(){}
static void func2(){}

typedef enum
{
    FUNC1,
    FUNC2,
    FUNC_COUNT
} state_e;

typedef void (*func_t)(void);

const func_t lookUpTable[FUNC_COUNT] =
{
    [FUNC1] = &amp;amp;func1,
    [FUNC2] = &amp;amp;func2
};

void fsm(state_e state)
{
    if (state &amp;lt; FUNC_COUNT) 
        lookUpTable[state]();
    else
        ;// Error handling
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 이것:&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스위치&lt;/font&gt;&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;static void func1(){}
static void func2(){}

void fsm(int state)
{
    switch(state)
    {
        case FUNC1: func1(); break;
        case FUNC2: func2(); break;
        default:    ;// Error handling
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컴파일러들이 가능하면 스위치 문을 점프 테이블로 변환하려고 하기 때문에 룩업 테이블이 더 빠르다고 생각했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 틀렸을 수도 있기 때문에, 저는 왜 그런지 알고 싶습니다!&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도와주셔서 감사합니다!&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 댓글의 원저자였기 때문에, 질문에서 언급하지 않으셨던 아주 중요한 문제를 추가해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;즉, 원본은 임베디드 시스템에 관한 것이었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 시스템이 플래시가 통합된 일반적인 베어 메탈 시스템이라고 가정할 때, 제가 집중할 PC와는 매우 중요한 차이점이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 임베디드 시스템은 일반적으로 다음과 같은 제약 조건을 갖습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;CPU 캐시 없음.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;플래시에는 더 높은 CPU 클럭(예: &amp;gt;ca 32MHz)에 대한 대기 상태가 필요합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;실제 비율은 다이 설계, 저전력/고속 공정, 작동 전압 등에 따라 달라집니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대기 상태를 숨기기 위해 플래시에는 CPU 버스보다 더 넓은 읽기 라인이 있습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;명령 프리페치가 있는 선형 코드에만 적합합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터 액세스는 명령 프리페치를 방해하거나 종료될 때까지 정지됩니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;플래시에는 내부의 매우 작은 명령 캐시가 있을 수 있습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터 캐시가 조금이라도 있다면 데이터 캐시는 훨씬 더 작습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;캐시가 작으면 폐기 빈도가 높아집니다(이전 항목을 다른 시간에 사용하기 전에 교체).&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, STM32F4xxa 판독에는 150MHz/3에서 6개의 클럭이 소요됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;128비트(4단어)에 대해 3V.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 데이터 액세스가 필요한 경우 모든 데이터를 가져올 때 12개 이상의 클럭 지연이 발생할 가능성이 높습니다(추가 사이클이 포함됨).&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실제 문제에 대해 콤팩트한 상태 코드를 가정하면 이 아키텍처(Cortex-M4)에 다음과 같은 효과가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Lookup-table: 함수 주소를 읽는 것은 데이터 액세스입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;위에서 언급한 모든 시사점을 포함하여.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스위치 오토는 코드 공간 데이터를 명령 바로 뒤에 사용하는 특별한 &quot;테이블 룩업&quot; 명령을 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 첫 번째 항목은 이미 프리페치되어 있을 가능성이 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 항목은 프리페치를 깨지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 액세스는 코드 액세스이므로 데이터는 플래시의 명령 캐시로 이동합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 주의할 점은&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;switch&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수를 필요로 하지 않으므로 컴파일러는 코드를 완전히 최적화할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;룩업 테이블에서는 불가능합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수 진입/종료에 대한 코드가 적어도 필요하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;앞서 언급한 것과 다른 요인들 때문에, 추정치를 분간하기 어렵습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;플랫폼과 코드 구조에 따라 크게 달라집니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 위에 제시된 시스템을 가정하면 스위치가 더 빠를 가능성이 매우 높습니다(그런데 말입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;첫째, 일부 &lt;em papago-id=&quot;26-1&quot;&gt;프로세서&lt;/em&gt;에서는 &lt;em papago-id=&quot;26-3&quot;&gt;Lookup Table&lt;/em&gt; 예제와 같이 간접 호출(예: 포인터를 통한) 비용이 많이 듭니다(파이프라인 파손, TLB, 캐시 효과).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;간접 점프의 경우에도 그럴 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면, 좋은 최적화 컴파일러가 호출에 줄을 설 수 &lt;em papago-id=&quot;27-1&quot;&gt;있을&lt;/em&gt; 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;func1()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;28-1&quot;&gt;스위치&lt;/em&gt; 예제에서는 인라인 함수에 대해 프롤로그나 에필로그를 실행하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 많은 요소들이 성능에 중요하기 때문에 &lt;strong papago-id=&quot;29-0&quot;&gt;벤치마킹&lt;/strong&gt;을 해야 &lt;strong papago-id=&quot;29-0&quot;&gt;합니다&lt;/strong&gt;.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/a/35416290/841108&quot; papago-id=&quot;29-2&quot;&gt;이&lt;/a&gt; 항목(및 참조)도 참조하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수 포인터의 LUT를 사용하면 컴파일러가 해당 전략을 사용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이론적으로 스위치 버전을 LUT 버전과 기본적으로 동일한 코드로 컴파일할 수 &lt;em papago-id=&quot;30-1&quot;&gt;있습니다&lt;/em&gt;(이제 두 버전 모두에 아웃오브바운드 검사를 추가했습니다).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;실제로 그것은 gcc나 clang이 선택하는 것이 아니기 때문에 어떤 일이 일어났는지 확인하기 위해 asm 출력을 살펴볼 필요가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(: gcc)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-fpie&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(대부분의 현대 리눅스 배포판에서는 기본적으로) 절대 함수 포인터 대신 상대적 오프셋 표를 만드는 것을 좋아하기 때문에 로데이터도 위치에 무관합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;movsxd 및 &lt;a href=&quot;https://stackoverflow.com/questions/52190313/gcc-jump-table-initialization-code-generating-movsxd-and-add/52192789#52192789&quot; papago-id=&quot;32-1&quot;&gt;add?&lt;/a&gt;를 &lt;a href=&quot;https://stackoverflow.com/questions/52190313/gcc-jump-table-initialization-code-generating-movsxd-and-add/52192789#52192789&quot; papago-id=&quot;32-1&quot;&gt;생성하는 GCC 점프 테이블 초기화 코드&lt;/a&gt;입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;최적화를 놓친 것일 수 있습니다. gcc 버그 보고서에 대한 링크는 거기서 제 답변을 참조하십시오.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수 포인터의 배열을 수동으로 만드는 것이 이를 해결할 수 있습니다.)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실제로 어떻게 컴파일되었는지 보기 위해 두 기능이 하나의 컴파일 단위(gcc와 clang 출력 포함)에 있는 &lt;strong papago-id=&quot;33-1&quot;&gt;&lt;a href=&quot;https://gcc.godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAKxAEZSAbAQwDtRkBSAJgCFufSAZ1QBXYskwgA5NwDMeAGYBqWhwAMAQTlYFeFpiUM8Aa0wMAnhAAeASiX2HSgPpOARiLwMCep5isAHTGQCCDAwyFtSFRt1LS5ZHT0DERYjUwtrO0cXd09vFl8AoJDwiJsotRjNOTNBTFjtTF19QxMzS1tHBysG%2BMSWlLT2zK6e6vjMFnwFBs0AejmlYQBbTAIEPWAlBRJtlOC8VBZBJSIldFQlJgUCTGJThANBAHdCZAQ5hhECKOElZ4MyFYSjQy38TGIBgITE8QIYDCUADdBAA6JQsI4AWmhsKY8JBGHqmj0BCUwAYqFceKciIhHFkfE0iNQeHQSn8kMRkwIThxDDhDAgzNZWXsHAA7HxxQARJQLc6XDHrTZRM54inPU4w/nqpSoZQKfZqFEo2SxeUSnhkilUhg0iFKemyrj0q0S6WzLRMllsw0sZBqIU%2BmIM2LC337WhBkWusM%2Bvb%2BrjR9AhxkacMJ5CyZOpz1x1lLPBghiYXnagUQOyWzNR1OOmWxEn2QRF/wlpwYlh8itVyU1yuupSQghiFgqWMN6qaAjmQI6JSTETLBqS2KOABiAFUAHIAYTUpDXDi3e/oR/sJ93XEPmg3O93shvGjve6cu4A8juACor2WCaG3L4sZTum8YKIIyxOC8bwIBATb/kwtxVFoq63g40EEO8EAIUh9Zpl0DhAnUSiXmoICZoGdauJCTDGMBz4ESCTDEZetDkX6yC1oO1GYLR9GMUxLH3lw7H7EmVE0XRoZoQRREGJesiif62YSbxUn4YxOhMCIXjkQ4rrytgxDELsCCsOgRhsOe9YejJ7KctyZa4vCA7SShtlep5M5zk0SLxhAABUHG8jYOb0bEOF4MgBLHKSwWkhSqDGJu/hfkwrglhwACsPCXm%2Bn7bj%2BWWyk6eHWdluX3mo2UlbIJVcAAbBxB7lTlrE1Y6dWOo1HFnnZFWXi6xWdfVTViU%2BjgDfeZrDaV3Bjcpv7hd6BbgZBXwhDhpZPABmDIZa1mKEoEBDBkW2dbuJH3vl342Fk8qvOsogJW0GTlGSyDRf43wnOsBgADKbl%2Bepjn9WqmGOLZYHqyjKic1GsO81mOIlyWpelmU5VtNWuRp9i1ESDEEQZixGSZ9xmVMlnANZHKYFyXZOTqLm5tUk6ebEUjlAw0hZVIpAsNIaj86g0i7vw/BLKI4gGHItD8wQQtc%2BUxggLIWUog1tBZeKtC0FwWWNVlsgAJyPjzUgACz84LUjC6QotSPzgggAeit21zpBwLASCgv4nh3OQlB%2BwHxAoMwbCyLrpC6F4dwuxArhK6Qrh6BC5jSPLpCgqsXbvqkGce6QWDLKw5KSEX%2BCQgcXIu0XfhBN8FdZySZjJwQxBFpnnsR%2BwEu8IweCuC7kDlKg/jeEcdeYlY0WYgA6rqmIKFyxCuKgdSYsxyxKJi76yLvywjvoTpmS8ZgMM70sSHQ3O8zbyeO1YAAcDWYg1lsgr3SiyCi4oorQY6uBCC7DllEXcqAwSh26rIWgdhxa8H4ArJWd1SCq1kFwFEls1CWwarIKO4osqW3FCbXBjBpDWwFo/aQztXakHdsLco3tEAoEgf7EsZAKAQBDhwkAwBjYHljrcYgCck5F1TiwdO3ds6QNzgQfOFhk4lzLiWJReBq7eFrsnBuyAm7SNbhbe2Hcu5SHltzMuKB%2B4CCMMPeAY8J6HGONIGec9F74mXqvdem9t673fFwQ%2Bx96h1TPgCeEV8xA3zgeQqQfMqFFyfq/d%2Bn9gCfSUBrA%2BEBgFEHuGApQECoEcJgVweBVjkEe1Qeg2gKITYkIakQmptBX4NS1teC2lDbb20drQt2KC75SC4A/eJND6G9NIKvFsRwQCWyAA%3D&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;33-1-0&quot;&gt;Godbolt 컴파일러 탐색기&lt;/a&gt;&lt;/strong&gt;에 코드를 넣었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 기능을 조금 더 확장해서 두 가지 경우가 아니었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;void fsm_switch(int state) {
    switch(state) {
        case FUNC0: func0(); break;
        case FUNC1: func1(); break;
        case FUNC2: func2(); break;
        case FUNC3: func3(); break;
        default:    ;// Error handling
    }
    //prevent_tailcall();
}

void fsm_lut(state_e state) {
    if (likely(state &amp;lt; FUNC_COUNT))  // without likely(), gcc puts the LUT on the taken side of this branch
        lookUpTable[state]();
    else
        ;// Error handling
    //prevent_tailcall();
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;참고 &lt;a href=&quot;https://stackoverflow.com/questions/109710/likely-unlikely-macros-in-the-linux-kernel-how-do-they-work-whats-their/18589638#18589638&quot; papago-id=&quot;34-1&quot;&gt;항목Linux 커널에서 가능성&lt;/a&gt;이 높은&lt;a href=&quot;https://stackoverflow.com/questions/109710/likely-unlikely-macros-in-the-linux-kernel-how-do-they-work-whats-their/18589638#18589638&quot; papago-id=&quot;34-1&quot;&gt;() 매크로와 가능성&lt;/a&gt;이 낮은&lt;a href=&quot;https://stackoverflow.com/questions/109710/likely-unlikely-macros-in-the-linux-kernel-how-do-they-work-whats-their/18589638#18589638&quot; papago-id=&quot;34-1&quot;&gt;() 매크로&lt;/a&gt;는 어떻게 &lt;a href=&quot;https://stackoverflow.com/questions/109710/likely-unlikely-macros-in-the-linux-kernel-how-do-they-work-whats-their/18589638#18589638&quot; papago-id=&quot;34-1&quot;&gt;작동하며 이점은 무엇입니까?&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;h3 papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;x86&lt;/font&gt;&lt;/h3&gt; 
&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;x86에서 clang은 &lt;strong papago-id=&quot;36-1&quot;&gt;스위치에 대한 자체 LUT를 만들지만, 최종 함수&lt;/strong&gt; 포인터가&lt;strong papago-id=&quot;36-1&quot;&gt; 아닌 함수 내에 대한&lt;/strong&gt; 포인터입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 clang-3.7의 경우 스위치가 수동으로 구현된 LUT보다 엄격하게 더 나쁜 코드로 컴파일됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;어느 쪽이든, x86 CPU는 간접 호출/점프를 처리할 수 있는 분기 예측 기능을 갖는 경향이 있습니다. 적어도 예측이 용이하다면 말이죠.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;37-0&quot;&gt;GCC는 일련의 조건부 분기를 사용&lt;/strong&gt;합니다. (&lt;a href=&quot;https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69576&quot; papago-id=&quot;37-2&quot; rel=&quot;nofollow noreferrer&quot;&gt;하지만&lt;/a&gt; 불행히도 &lt;a href=&quot;https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69576&quot; papago-id=&quot;37-2&quot; rel=&quot;nofollow noreferrer&quot;&gt;조건부 분기와 직접 테일콜&lt;/a&gt;을 하지는 &lt;a href=&quot;https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69576&quot; papago-id=&quot;37-2&quot; rel=&quot;nofollow noreferrer&quot;&gt;않습니다.) AFAICT는 x86에서 안전&lt;/a&gt;합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;일치하는 것을 찾을 때까지 대부분 가지를 가져가지 않은 채로 1, &amp;lt;1, 2, 3&amp;gt;을 순서대로 확인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이들은 LUT: 경계 검사를 위해 본질적으로 동일한 코드를 만들고, arg 레지스터의 상위 32비트를 a로 0으로 만듭니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mov&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 그리고 색인화된 주소 지정 모드로 메모리 indirect 점프를 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;h3 papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ARM:&lt;/font&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,  4.8.2&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;-mcpu=cortex-m4 -O2&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;흥미로운 코드를 만듭니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;올라프의 말대로 &lt;strong papago-id=&quot;12-1&quot;&gt;1B 엔트리로 구성된 인라인 테이블&lt;/strong&gt;을 만듭니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;목표 함수로 직접 점프하는 것이 아니라 일반 점프 명령으로 점프합니다(예:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;b func3&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;입니다.)&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 이것은 일반적인 무조건 점프입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 왜냐하면 이것은 테일 콜이기 때문입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;각 테이블 대상 항목에는 &lt;a href=&quot;https://gcc.godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAKxAEZSAbAQwDtRkBSAJgCFufSAZ1QBXYskwgA5NwDMeAGYBqWhwAMAQTlYFeFpiUM8Aa0wMAnhAAeASiX2HSgPpOARiLwMCep5isAHTGQCCDAwyFtSFRt1LS5ZHT0DERYjUwtrO0cXd09vFl8AoJDwiJsotRjNOTNBTFjtTF19QxMzS1tHBysG%2BMSWlLT2zK6e6vjMFnwFBs0AejmlYQBbTAIEPWAlBRJtlOC8VBZBJSIldFQlJgUCTGJThANBAHdCZAQ5hhECKOElZ4MyFYSjQy38TGIBgITE8QIYDCUADdBAA6JQsI4AWmhsKY8JBGHqmj0BCUwAYqFceKciIhHFkfE0iNQeHQSn8kMRkwIThxDDhDAgzNZMQZ9gW9g4AHY%2BFKACJKCUXdGodabKJnPEU56nGH8rVKVDKBT7NQolGyWIS6U8MkUqkMGkQpT0hVcem26Vy2ZaJkstkmljINRC/2ixkaYUB/a0UMij2xKN7INcOPocOJ/3J5CyNMZ6oFyNZwR4MEMTC8vUCiB2G3Z2Phl3y2Ik%2BwlssVjEsPnV2sy%2Bs1j1KSEEMQsFQJ5uFgjmQI6JSTETLBoy2KOABiAFUAHIAYTUpDXDi3e/oR/sJ93XEPmg3O93shvGjve6cu4A8juACorhWCaG3L4CaFkmCiCMsTgvG8CAQK2/5MLcVRaKut4OFBBDvBA8GIU2EZdA4QJ1Eol5qCA2Yho2riQkwxjAc%2B%2BEgkwRGXrQZGBsgDZDlRmA0XRDGMcx95cGx%2ByppR1G0Qy55dIRBiXrIIlBrm4k8ZJeEMToTAiF4ZEOB6ErYMQxC7AgrDoEYbDSV60kcpgXLdpWuLwoOUnVFOvoeTOc5NEiWYQAAVOxvI2HmdGxNheDIASxykkFpIUqgxibv4X5MK45YcAArDwl5vp%2B24/plCqurhVnZSRWXFbIxVcAAbOxB5lTl96qEVLrVS6dXsWeqGSuVQmVe1NX1aJT6OFlzV7pabUldwI1Kb%2BYV%2Bqy2zgU4XwhNhFZPABmBITa0mKEoEBDBkW3tbuxH3nl342FkEqvOsojxW0GTlGSyBRf43wnOsBgADKbl%2Bhrjn9uqmOOJZYIayhqicVGsO80mOAlSUpWlGXZVtlUuep9i1ES9H4fpiyGcZ9ymVMFnADZnLco5%2BrOfmyHeoWsRSOUDDSJlUikCw0hqLzqDSLu/D8EsojiAYci0LzBACxz5TGCAmUHlzUgACy8/zUiC6QwtSLzgggAe8u6xzpBwLASCgv4nh3OQlC2/bxAgBCywIAowCZRrpC6F4dzGxArgK6Qrh6BC5jSLLpCgqs3bvqkUfm6QWDLKw5KSCn%2BCQgcXLGynfhBN8WcxySZihwQxCltHFvMGwKBi7wjB4K4xuQOUqD%2BN4RwF5iVhRZiADqBqYgoXLEK4qB1JiTHLEomLvlwC/LMg32umgxC3FYmLLBrK/rEurhG5LEh0Jz3Pa6HBsaAASgAsh9UWZSi%2B8nXoIidBAuCELsMtRLuVAYIXadVkLQOwoteD8DlgrO6pBlaq0YNILWfNr7SCNibUgZtBZwPVlwK%2BKcDYwPNnAieJYjggA1kAA&quot; papago-id=&quot;14-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;다음&lt;/a&gt;과 같은 경우 &lt;a href=&quot;https://gcc.godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAKxAEZSAbAQwDtRkBSAJgCFufSAZ1QBXYskwgA5NwDMeAGYBqWhwAMAQTlYFeFpiUM8Aa0wMAnhAAeASiX2HSgPpOARiLwMCep5isAHTGQCCDAwyFtSFRt1LS5ZHT0DERYjUwtrO0cXd09vFl8AoJDwiJsotRjNOTNBTFjtTF19QxMzS1tHBysG%2BMSWlLT2zK6e6vjMFnwFBs0AejmlYQBbTAIEPWAlBRJtlOC8VBZBJSIldFQlJgUCTGJThANBAHdCZAQ5hhECKOElZ4MyFYSjQy38TGIBgITE8QIYDCUADdBAA6JQsI4AWmhsKY8JBGHqmj0BCUwAYqFceKciIhHFkfE0iNQeHQSn8kMRkwIThxDDhDAgzNZMQZ9gW9g4AHY%2BFKACJKCUXdGodabKJnPEU56nGH8rVKVDKBT7NQolGyWIS6U8MkUqkMGkQpT0hVcem26Vy2ZaJkstkmljINRC/2ixkaYUB/a0UMij2xKN7INcOPocOJ/3J5CyNMZ6oFyNZwR4MEMTC8vUCiB2G3Z2Phl3y2Ik%2BwlssVjEsPnV2sy%2Bs1j1KSEEMQsFQJ5uFgjmQI6JSTETLBoy2KOABiAFUAHIAYTUpDXDi3e/oR/sJ93XEPmg3O93shvGjve6cu4A8juACorhWCaG3L4CaFkmCiCMsTgvG8CAQK2/5MLcVRaKut4OFBBDvBA8GIU2EZdA4QJ1Eol5qCA2Yho2riQkwxjAc%2B%2BEgkwRGXrQZGBsgDZDlRmA0XRDGMcx95cGx%2ByppR1G0Qy55dIRBiXrIIlBrm4k8ZJeEMToTAiF4ZEOB6ErYMQxC7AgrDoEYbDSV60kcpgXLdpWuLwoOUnVFOvoeTOc5NEiWYQAAVOxvI2HmdGxNheDIASxykkFpIUqgxibv4X5MK45YcAArDwl5vp%2B24/plCqurhVnZSRWXFbIxVcAAbOxB5lTl96qEVLrVS6dXsWeqGSuVQmVe1NX1aJT6OFlzV7pabUldwI1Kb%2BYV%2Bqy2zgU4XwhNhFZPABmBITa0mKEoEBDBkW3tbuxH3nl342FkEqvOsojxW0GTlGSyBRf43wnOsBgADKbl%2Bhrjn9uqmOOJZYIayhqicVGsO80mOAlSUpWlGXZVtlUuep9i1ES9H4fpiyGcZ9ymVMFnADZnLco5%2BrOfmyHeoWsRSOUDDSJlUikCw0hqLzqDSLu/D8EsojiAYci0LzBACxz5TGCAmUHlzUgACy8/zUiC6QwtSLzgggAe8u6xzpBwLASCgv4nh3OQlC2/bxAgBCywIAowCZRrpC6F4dzGxArgK6Qrh6BC5jSLLpCgqs3bvqkUfm6QWDLKw5KSCn%2BCQgcXLGynfhBN8WcxySZihwQxCltHFvMGwKBi7wjB4K4xuQOUqD%2BN4RwF5iVhRZiADqBqYgoXLEK4qB1JiTHLEomLvlwC/LMg32umgxC3FYmLLBrK/rEurhG5LEh0Jz3Pa6HBsaAASgAsh9UWZSi%2B8nXoIidBAuCELsMtRLuVAYIXadVkLQOwoteD8DlgrO6pBlaq0YNILWfNr7SCNibUgZtBZwPVlwK%2BKcDYwPNnAieJYjggA1kAA&quot; papago-id=&quot;14-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;코드&lt;/a&gt;(Godbolt&lt;a href=&quot;https://gcc.godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAKxAEZSAbAQwDtRkBSAJgCFufSAZ1QBXYskwgA5NwDMeAGYBqWhwAMAQTlYFeFpiUM8Aa0wMAnhAAeASiX2HSgPpOARiLwMCep5isAHTGQCCDAwyFtSFRt1LS5ZHT0DERYjUwtrO0cXd09vFl8AoJDwiJsotRjNOTNBTFjtTF19QxMzS1tHBysG%2BMSWlLT2zK6e6vjMFnwFBs0AejmlYQBbTAIEPWAlBRJtlOC8VBZBJSIldFQlJgUCTGJThANBAHdCZAQ5hhECKOElZ4MyFYSjQy38TGIBgITE8QIYDCUADdBAA6JQsI4AWmhsKY8JBGHqmj0BCUwAYqFceKciIhHFkfE0iNQeHQSn8kMRkwIThxDDhDAgzNZMQZ9gW9g4AHY%2BFKACJKCUXdGodabKJnPEU56nGH8rVKVDKBT7NQolGyWIS6U8MkUqkMGkQpT0hVcem26Vy2ZaJkstkmljINRC/2ixkaYUB/a0UMij2xKN7INcOPocOJ/3J5CyNMZ6oFyNZwR4MEMTC8vUCiB2G3Z2Phl3y2Ik%2BwlssVjEsPnV2sy%2Bs1j1KSEEMQsFQJ5uFgjmQI6JSTETLBoy2KOABiAFUAHIAYTUpDXDi3e/oR/sJ93XEPmg3O93shvGjve6cu4A8juACorhWCaG3L4CaFkmCiCMsTgvG8CAQK2/5MLcVRaKut4OFBBDvBA8GIU2EZdA4QJ1Eol5qCA2Yho2riQkwxjAc%2B%2BEgkwRGXrQZGBsgDZDlRmA0XRDGMcx95cGx%2ByppR1G0Qy55dIRBiXrIIlBrm4k8ZJeEMToTAiF4ZEOB6ErYMQxC7AgrDoEYbDSV60kcpgXLdpWuLwoOUnVFOvoeTOc5NEiWYQAAVOxvI2HmdGxNheDIASxykkFpIUqgxibv4X5MK45YcAArDwl5vp%2B24/plCqurhVnZSRWXFbIxVcAAbOxB5lTl96qEVLrVS6dXsWeqGSuVQmVe1NX1aJT6OFlzV7pabUldwI1Kb%2BYV%2Bqy2zgU4XwhNhFZPABmBITa0mKEoEBDBkW3tbuxH3nl342FkEqvOsojxW0GTlGSyBRf43wnOsBgADKbl%2Bhrjn9uqmOOJZYIayhqicVGsO80mOAlSUpWlGXZVtlUuep9i1ES9H4fpiyGcZ9ymVMFnADZnLco5%2BrOfmyHeoWsRSOUDDSJlUikCw0hqLzqDSLu/D8EsojiAYci0LzBACxz5TGCAmUHlzUgACy8/zUiC6QwtSLzgggAe8u6xzpBwLASCgv4nh3OQlC2/bxAgBCywIAowCZRrpC6F4dzGxArgK6Qrh6BC5jSLLpCgqs3bvqkUfm6QWDLKw5KSCn%2BCQgcXLGynfhBN8WcxySZihwQxCltHFvMGwKBi7wjB4K4xuQOUqD%2BN4RwF5iVhRZiADqBqYgoXLEK4qB1JiTHLEomLvlwC/LMg32umgxC3FYmLLBrK/rEurhG5LEh0Jz3Pa6HBsaAASgAsh9UWZSi%2B8nXoIidBAuCELsMtRLuVAYIXadVkLQOwoteD8DlgrO6pBlaq0YNILWfNr7SCNibUgZtBZwPVlwK%2BKcDYwPNnAieJYjggA1kAA&quot; papago-id=&quot;14-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;)가 훨씬&lt;/a&gt; 더 필요합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;fsm_switch&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;통화 후에 모든 작업을 수행합니다(이 경우와 마찬가지로 inline 이외의 기능 호출, 경우).&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;void prevent_tailcall(void);&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;선언되지만 정의되지 않음), 또는 이 함수가 더 큰 함수에 인라인된 경우.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@@ With   void prevent_tailcall(void){} defined so it can inline:
@@ Unlike in the godbolt link, this is doing tailcalls.
fsm_switch:
        cmp     r0, #3    @ state,
        bhi     .L5       @
        tbb     [pc, r0]  @ state
       @@ There's no section .rodata directive here: the table is in-line with the code, so there's no need for base pointer to be loaded into a reg.  And apparently it's even loaded from I-cache, not D-cache
        .byte   (.L7-.L8)/2
        .byte   (.L9-.L8)/2
        .byte   (.L10-.L8)/2
        .byte   (.L11-.L8)/2
.L11:
        b       func3     @ optimized tail-call
.L10:
        b       func2
.L9:
        b       func1
.L7:
        b       func0
.L5:
        bx      lr         @ This is ARM's equivalent of an x86 ret insn
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;분기 예측이 얼마나 잘 작동하는지 간에 많은 차이가 있는지 알 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;tbb&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인 간접  콜 Vs.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 전면적인 간접 점프 또는 호출(&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;blx&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;), 경량 ARM 코어에 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;테이블을 로드하는 데이터 액세스는 분기 명령으로 두 단계 점프하는 것보다 더 중요할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;switch&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;52&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ARM에서 간접지사가 잘 예측되지 않는다고 읽었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;간접지사도 매번 같은 목표를 가지고 있다면 나쁘지 않았으면 좋겠습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 그렇지 않다면 대부분의 ARM 코어는 x86 코어처럼 짧은 패턴도 발견하지 못할 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;x86에서는 명령어 페치/디코드 시간이 더 오래 걸리므로 명령어 스트림에서 버블을 방지하는 것이 더 중요합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 x86 CPU가 이렇게 좋은 분기 예측을 하는 이유 중 하나입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;현대의 분기 예측기는 해당 분기 및/또는 해당 분기에 이르는 다른 분기의 이력에 기초하여 간접 분기에 대한 패턴으로 작업을 잘 수행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;LUT 함수는 LUT의 기본 주소를 레지스터에 로드하는 데 몇 가지 명령을 사용해야 하지만 그렇지 않으면 x86과 거의 유사합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;fsm_lut:
        cmp     r0, #3    @ state,
        bhi     .L13      @,
        movw    r3, #:lower16:.LANCHOR0 @ tmp112,
        movt    r3, #:upper16:.LANCHOR0 @ tmp112,
        ldr     r3, [r3, r0, lsl #2]      @ tmp113, lookUpTable
        bx      r3  @ indirect register sibling call    @ tmp113
.L13:
        bx      lr  @

@ in the .rodata section
lookUpTable:
        .word   func0
        .word   func1
        .word   func2
        .word   func3
&lt;/code&gt;&lt;/pre&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Microchip dsPIC에 대한 유사한 &lt;a href=&quot;https://stackoverflow.com/questions/35838849/lookup-table-vs-switch-in-c-embedded-software/35849713#35849713&quot; papago-id=&quot;55-1&quot;&gt;분석&lt;/a&gt;은 SST의 &lt;a href=&quot;https://stackoverflow.com/questions/35838849/lookup-table-vs-switch-in-c-embedded-software/35849713#35849713&quot; papago-id=&quot;55-1&quot;&gt;Mike&lt;/a&gt;의 답변을&lt;a href=&quot;https://stackoverflow.com/questions/35838849/lookup-table-vs-switch-in-c-embedded-software/35849713#35849713&quot; papago-id=&quot;55-1&quot;&gt; 참조&lt;/a&gt;하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;msc의 답변과 댓글은 왜 성과가 기대하는 것과 다를 수 있는지에 대한 좋은 힌트를 줍니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;벤치마킹이 원칙이지만 결과는 아키텍처마다 다르며 컴파일러의 다른 버전과 물론 선택한 구성 및 옵션에 따라 달라질 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 당신의 코드 2개는 동일한 유효성 검사를 수행하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;state&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스위치는 우아하게 아무것도 하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;state&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정의된 값 중 하나가 아닙니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;점프 테이블 버전은 2개의 값을 제외한 모든 값에 대해 정의되지 않은 동작을 호출합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;FUNC1&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;FUNC2&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 가정을 하지 않고 더미 함수 포인터로 점프 테이블을 초기화하는 일반적인 방법은 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;FUNC_COUNT&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;을 취하십시오. 점프 &lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 동일한 동작을 취하십시오.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 점프 테이블 버전은 다음과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;void fsm(int state) {
    if (state &amp;gt;= 0 &amp;amp;&amp;amp; state &amp;lt; FUNC_COUNT &amp;amp;&amp;amp; lookUpTable[state] != NULL)
        lookUpTable[state]();
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;66&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이를 벤치마킹하여 조립 코드를 검사해 보십시오.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 이것을 위한 편리한 온라인 컴파일러입니다: http://gcc.godbolt.org/ #.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;67&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Microchip dsPIC 장치 제품군에는 조회 테이블이 플래시 자체에 일련의 명령어 주소로 저장됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;조회를 수행하려면 플래시에서 주소를 읽은 다음 루틴을 호출해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;호출을 수행하면 명령 포인터 및 기타 비트를 푸시하는 몇 개의 주기가 추가되며 하우스키핑의 봅(예: 스택 프레임 설정)이 추가됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;68&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 dsPIC33E512의 경우&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;MU810, XC16(v1.24)을 사용하여 조회 코드:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;lookUpTable[state]();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;69&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(MPLAB-X의 분해 창에서) 다음으로 컴파일합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;!        lookUpTable[state]();
0x2D20: MOV [W14], W4    ; get state from stack-frame (not counted)
0x2D22: ADD W4, W4, W5   ; 1 cycle (addresses are 16 bit aligned)
0x2D24: MOV #0xA238, W4  ; 1 cycle (get base address of look-up table)
0x2D26: ADD W5, W4, W4   ; 1 cycle (get address of entry in table)
0x2D28: MOV [W4], W4     ; 1 cycle (get address of the function)
0x2D2A: CALL W4          ; 2 cycles (push PC+2 set PC=W4)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;70&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;... 그리고 각 함수(공백, 수행 없음)는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;!static void func1()
!{}
0x2D0A: LNK #0x0         ; 1 cycle (set up stack frame)
! Function body goes here
0x2D0C: ULNK             ; 1 cycle (un-link frame pointer)
0x2D0E: RETURN           ; 3 cycles
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;71&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 어느 경우든 총 11번의 오버헤드 명령 사이클이며, 모두 동일한 오버헤드를 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;(참고: 테이블이나 테이블에 포함된 기능 중 하나가 동일한 32K 프로그램 워드 플래시 페이지에 없으면 주소 생성 장치를 올바른 페이지에서 읽게 하거나 장시간 통화를 위해 PC를 설정해야 하기 때문에 훨씬 더 큰 오버헤드가 발생합니다.)&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;72&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;반면, 전체 스위치 문이 특정 크기 내에 맞는 경우 컴파일러는 테스트 및 상대 분기를 수행하는 코드를 하나의 경우에 세 번(또는 네 번) 사이클을 수행하는 명령어로 생성합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;73&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, switch 문은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;switch(state)
{
case FUNC1: state++; break;
case FUNC2: state--; break;
default: break;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;74&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컴파일 대상:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;!    switch(state)
0x2D2C: MOV [W14], W4       ; get state from stack-frame (not counted)
0x2D2E: SUB W4, #0x0, [W15] ; 1 cycle (compare with first case)
0x2D30: BRA Z, 0x2D38       ; 1 cycle (if branch not taken, or 2 if it is)
0x2D32: SUB W4, #0x1, [W15] ; 1 cycle (compare with second case)
0x2D34: BRA Z, 0x2D3C       ; 1 cycle (if branch not taken, or 2 if it is)
!    {
!    case FUNC1: state++; break;
0x2D38: INC [W14], [W14]    ; To stop the switch being optimised out
0x2D3A: BRA 0x2D40          ; 2 cycles (go to end of switch)
!    case FUNC2: state--; break;
0x2D3C: DEC [W14], [W14]    ; To stop the switch being optimised out
0x2D3E: NOP                 ; compiler did a fall-through (for some reason)
!    default: break;
0x2D36: BRA 0x2D40          ; 2 cycles (go to end of switch)
!    }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;75&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 첫 번째 케이스가 취해질 경우 5 사이클, 두 번째 케이스가 취해질 경우 7 사이클 등의 오버헤드로, 네 번째 케이스에서도 깨짐을 의미합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;76&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;즉, 설계 시점에 데이터를 파악하는 것이 장기적인 속도에 상당한 영향을 미칠 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;상당한 수(약 4건 이상)를 가지고 있고 모두 비슷한 빈도로 발생하는 경우 장기적으로 조회 테이블이 더 빠릅니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;케이스의 빈도가 현저하게 다른 경우(예: 케이스 1이 케이스 2보다 더 높은 경우, 케이스 3보다 더 높은 경우 등), 케이스가 가장 높은 스위치를 먼저 주문하면 장기적으로 스위치가 더 빨라집니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;엣지 케이스의 경우, 대부분의 실행의 경우 스위치가 (아마도) 더 빠르고 읽기 쉽고 오류 발생률이 낮습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;77&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스위치에 몇 가지 경우만 있거나 어떤 경우는 다른 경우보다 더 자주 발생할 수 있습니다. 그러면 스위치의 테스트와 분기를 수행하는 것이 룩업 테이블을 사용하는 것보다 더 적은 사이클이 걸릴 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;반면, 유사한 빈도로 발생하는 사례가 소수 이상인 경우 검색 속도가 평균적으로 빨라질 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;sub papago-id=&quot;78&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;팁: 검색이 확실히 더 빠르고 실행에 걸리는 시간이 중요하다는 것을 알지 못하면 스위치를 사용하십시오.&lt;/font&gt;&lt;/sub&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;79&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;79-0&quot;&gt;편집:&lt;/strong&gt; 제 스위치 예제는 약간 불공평합니다. 왜냐하면 저는 원래 질문을 무시하고 검색보다 스위치를 사용하는 것의 실제 이점을 강조하기 위해 사례의 '본문'에 줄을 그었기 때문입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;스위치도 통화를 해야 한다면 첫 번째 경우에만 유리합니다!&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;80&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;더 많은 컴파일러 출력을 얻으려면, @PeterCordes 샘플 코드를 사용하여 TIC28x 컴파일러에서 생성된 것은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;_fsm_switch:
        CMPB      AL,#0                 ; [CPU_] |62| 
        BF        $C$L3,EQ              ; [CPU_] |62| 
        ; branchcc occurs ; [] |62| 
        CMPB      AL,#1                 ; [CPU_] |62| 
        BF        $C$L2,EQ              ; [CPU_] |62| 
        ; branchcc occurs ; [] |62| 
        CMPB      AL,#2                 ; [CPU_] |62| 
        BF        $C$L1,EQ              ; [CPU_] |62| 
        ; branchcc occurs ; [] |62| 
        CMPB      AL,#3                 ; [CPU_] |62| 
        BF        $C$L4,NEQ             ; [CPU_] |62| 
        ; branchcc occurs ; [] |62| 
        LCR       #_func3               ; [CPU_] |66| 
        ; call occurs [#_func3] ; [] |66| 
        B         $C$L4,UNC             ; [CPU_] |66| 
        ; branch occurs ; [] |66| 
$C$L1:    
        LCR       #_func2               ; [CPU_] |65| 
        ; call occurs [#_func2] ; [] |65| 
        B         $C$L4,UNC             ; [CPU_] |65| 
        ; branch occurs ; [] |65| 
$C$L2:    
        LCR       #_func1               ; [CPU_] |64| 
        ; call occurs [#_func1] ; [] |64| 
        B         $C$L4,UNC             ; [CPU_] |64| 
        ; branch occurs ; [] |64| 
$C$L3:    
        LCR       #_func0               ; [CPU_] |63| 
        ; call occurs [#_func0] ; [] |63| 
$C$L4:    
        LCR       #_prevent_tailcall    ; [CPU_] |69| 
        ; call occurs [#_prevent_tailcall] ; [] |69| 
        LRETR     ; [CPU_] 
        ; return occurs ; [] 



_fsm_lut:
;* AL    assigned to _state
        CMPB      AL,#4                 ; [CPU_] |84| 
        BF        $C$L5,HIS             ; [CPU_] |84| 
        ; branchcc occurs ; [] |84| 
        CLRC      SXM                   ; [CPU_] 
        MOVL      XAR4,#_lookUpTable    ; [CPU_U] |85| 
        MOV       ACC,AL &amp;lt;&amp;lt; 1           ; [CPU_] |85| 
        ADDL      XAR4,ACC              ; [CPU_] |85| 
        MOVL      XAR7,*+XAR4[0]        ; [CPU_] |85| 
        LCR       *XAR7                 ; [CPU_] |85| 
        ; call occurs [XAR7] ; [] |85| 
$C$L5:    
        LCR       #_prevent_tailcall    ; [CPU_] |88| 
        ; call occurs [#_prevent_tailcall] ; [] |88| 
        LRETR     ; [CPU_] 
        ; return occurs ; [] 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;81&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 -O2 최적화를 사용했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;우리는 컴파일러가 능력이 있다고 해도 스위치가 점프 테이블로 변환되지 않는다는 것을 알 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;82&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/35838849/lookup-table-vs-switch-in-c-embedded-software&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>c</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/725</guid>
      <comments>https://fileupload.tistory.com/725#entry725comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:12:18 +0900</pubDate>
    </item>
    <item>
      <title>도커 컨테이너 실행 시 자동으로 서비스를 시작하는 방법은?</title>
      <link>https://fileupload.tistory.com/724</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도커 컨테이너 실행 시 자동으로 서비스를 시작하는 방법은?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL 서버를 컨테이너에 설치하기 위한 도커 &lt;a href=&quot;https://github.com/larazest/db/blob/master/Dockerfile&quot; papago-id=&quot;1-1&quot;&gt;파일&lt;/a&gt;이 있으며, 다음과 같이 시작합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo docker run -t -i 09d18b9a12be /bin/bash
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 MySQL 서비스가 자동으로 시작되는 것이 아니라 컨테이너 내에서 수동으로 실행해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;service mysql start
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도커 컨테이너를 실행할 때 MySQL 서비스를 자동으로 시작하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;첫째, 당신의 몸에 &lt;strong papago-id=&quot;4-1&quot;&gt;문제&lt;/strong&gt;가 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Dockerfile&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;RUN service mysql restart &amp;amp;&amp;amp; /tmp/setup.sh
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도커 이미지는 실행 중인 프로세스를 저장하지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러므로 당신의&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;RUN&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;명령은 다음 기간 동안만 실행됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker build&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단계 및 빌드가 완료된 후 중지됩니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대신 컨테이너를 시작할 때 명령을 지정해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CMD&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ENTRYPOINT&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 명령:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CMD mysql start
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;둘째, 도커 컨테이너가 계속 실행되기 위해서는 프로세스(마지막 명령)가 필요합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 그렇지 않으면 컨테이너가 종료/정지됩니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 정상적인&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;service mysql start&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;명령은 도커 파일에서 직접 사용할 수 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해결책&lt;/font&gt;&lt;/h2&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로세스를 계속 실행하는 일반적인 세 가지 방법이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;으로.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;service&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;명령 후에 non-end 명령을 추가합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;tail -F&lt;/code&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;CMD service mysql start &amp;amp;&amp;amp; tail -F /var/log/mysql/error.log
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;출력된 로그를 도커가 액세스할 수 있도록 하므로 단일 서비스가 실행 중인 경우 이를 선호하는 경우가 많습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 foreground 명령을 사용하여 이 작업을 수행합니다.&lt;/font&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;CMD /usr/bin/mysqld_safe
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 스크립트가 있는 경우에만 작동합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;mysqld_safe&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 스크립트를 다음으로 래핑합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;start.sh&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 이것을 끝까지 집어넣어라.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;CMD /start.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;명령이 일련의 단계를 다시 수행해야 하는 경우 이 방법이 가장 좋은 방법입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/start.sh&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;계속 뛰어야 합니다&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;h2 papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메모&lt;/font&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용하는 초보자용&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;supervisord&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;권장되지 않습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;솔직히 너무 많이 죽였습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컨테이너는 단일 서비스/단일 명령어를 사용하는 것이 훨씬 좋습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;BTW: https://registry.hub.docker.com 에서 기존의 mysql 도커 이미지를 확인하여 참고하시기 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신의&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Dockerfile&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 마지막 줄에 덧셈&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ENTRYPOINT service ssh restart &amp;amp;&amp;amp; bash
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저한테 효과가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;결과는 이렇습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;root@ubuntu:/home/vagrant/docker/add# docker run -i -t ubuntu
 * Restarting OpenBSD Secure Shell server sshd   [ OK ]                                                                      
root@dccc354e422e:~# service ssh status
 * sshd is running
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;간단! 도커 파일 끝에 추가:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ENTRYPOINT service mysql start &amp;amp;&amp;amp; /bin/bash
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 항상 더 쉽게 읽을 수 있는 또 다른 방법이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실행할 때 rabbitmq와 mongodb를 시작하고 싶다고 말하고 나서 당신의&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CMD&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 모습일 것입니다&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CMD /etc/init.d/rabbitmq-server start &amp;amp;&amp;amp; \
    /etc/init.d/mongod start
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하나만 가질 수 있으니까요.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CMD&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인당의&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Dockerfile&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;요령은 모든 지시를 연결하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 다음에 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;\&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;각 명령에 따라 새 줄을 시작합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 중 많은 것을 추가한다면 @&lt;a href=&quot;https://stackoverflow.com/a/25150809/3621724&quot; papago-id=&quot;42-1&quot;&gt;larry-cai&lt;/a&gt;가 제안한 것처럼 스크립트 파일에 모든 명령을 넣고 시작할 것을 제안합니다&lt;a href=&quot;https://stackoverflow.com/a/25150809/3621724&quot; papago-id=&quot;42-1&quot;&gt;.&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CMD /start.sh
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;안 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CMD service mysql start &amp;amp;&amp;amp; /bin/bash&lt;/code&gt; &lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;안 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CMD service mysql start ; /bin/bash ;&lt;/code&gt; &lt;/p&gt; 
&lt;p papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;-- 대화형 모드는 포그라운드를 지원하지 않을 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;잘 되네요!!&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CMD service nginx start ; while true ; do sleep 100; done;&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;잘 되네요!!&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;CMD service nginx start &amp;amp;&amp;amp; tail -F /var/log/nginx/access.log&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용해야 할 주의.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker run -p 80:80 nginx_bash&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;명령 매개 변수가 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;34&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 경우에는 MYSQL 백엔드 데이터베이스에 연결되는 도커 컨테이너 내에서 Apache2에서 PHP 웹 애플리케이션을 제공하고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Larry Cai의 해결책은 약간의 수정을 거쳤습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 만든 것은.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;entrypoint.sh&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 서비스를 관리하고 있는 파일입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 생각엔 우리가 한 일을.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;entrypoint.sh&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;36&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컨테이너가 시작될 때 실행할 명령이 둘 이상 있을 때 부트스트랩 도커를 실행하는 것이 더 쉬운 방법입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#!/bin/sh

set -e

echo &quot;Starting the mysql daemon&quot;
service mysql start

echo &quot;navigating to volume /var/www&quot;
cd /var/www
echo &quot;Creating soft link&quot;
ln -s /opt/mysite mysite

a2enmod headers
service apache2 restart

a2ensite mysite.conf
a2dissite 000-default.conf
service apache2 reload

if [ -z &quot;$1&quot; ]
then
    exec &quot;/usr/sbin/apache2 -D -foreground&quot;
else
    exec &quot;$1&quot;
fi
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드를 한 번만 실행하기 위해 /root/.bashrc에 다음 코드를 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 스크립트를 실행하기 전에 이미지에 컨테이너를 커밋하십시오. 그렇지 않으면 이미지에 'docker_services' 파일이 생성되고 서비스가 실행되지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if [ ! -e /var/run/docker_services ]; then
    echo &quot;Starting services&quot;
    service mysql start
    service ssh start
    service nginx start
    touch /var/run/docker_services
fi
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ssh 서비스를 자동으로 시작하고 싶을 때도 같은 문제가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 부록을 찾았습니다.&lt;/font&gt;&lt;/p&gt;
&lt;pre papago-id=&quot;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;/etc/init.d/ssh 시작&lt;/font&gt;&lt;/pre&gt; to 
&lt;pre papago-id=&quot;57&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;~/.bashrc&lt;/font&gt;&lt;/pre&gt; can resolve it ,but only you open it with bash will do.
&lt;p&gt;&lt;/p&gt;&lt;p papago-id=&quot;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도커 컨테이너가 실행될 때마다 MySQL 서비스를 자동으로 시작하는 방법은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;59&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 경우에는 MySQL 뿐만 아니라 PHP, Nginx, Memcached 를 실행해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;60&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도커 파일에 다음 행이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;RUN echo &quot;daemon off;&quot; &amp;gt;&amp;gt; /etc/nginx/nginx.conf
EXPOSE 80
EXPOSE 3306
CMD service mysql start &amp;amp;&amp;amp; service php-fpm start &amp;amp;&amp;amp; nginx -g 'daemon off;' &amp;amp;&amp;amp; service memcached start &amp;amp;&amp;amp; bash
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;61&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;61-1&quot;&gt;&amp;amp;bash&lt;/strong&gt;를 추가하면 Nginx, MySQL, PHP 및 Memcached가 컨테이너 내에서 계속 실행됩니다.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;docker export -o &amp;lt;nameOfContainer&amp;gt;.tar &amp;lt;nameOfContainer&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;62&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도커 가지치기를 사용하여 기존 컨테이너를 가지치기해야 할 수 있습니다...&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;63&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;필요한 수정 사항과 함께 가져오기:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;cat &amp;lt;nameOfContainer&amp;gt;.tar | docker import -c &quot;ENTRYPOINT service mysql start &amp;amp;&amp;amp; /bin/bash&quot; - &amp;lt;nameOfContainer&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;64&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같이 항상 재시작 옵션과 함께 컨테이너를 실행하여 호스트/대몬 재활용 후 자동으로 재개되도록 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;docker run -d -t -i --restart always --name &amp;lt;nameOfContainer&amp;gt; &amp;lt;nameOfContainer&amp;gt; /bin/bash
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;65&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사이드 노트:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 생각에는 컨테이너를 가능한 깨끗한 상태에서 cron 서비스만 시작하고 cron tab이나 cron만 수정하는 것이 타당합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;시간당, .daily 등...&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이에 상응하는 점검/모니터링 스크립트를 제공합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이유는 하나의 데몬에만 의존하기 때문이며 변경의 경우 부팅 시 시작되는 서비스를 추적하는 대신 ansible 또는 puppet을 사용하면 cron 스크립트를 재배포하는 것이 더 쉽습니다.&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;ENTRYPOINT name-service
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;66&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도커 파일 안에&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;67&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ENTRYPOINT mysqld_explorer
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;em&gt;&lt;strong papago-id=&quot;68&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;/etc/systemd/system/mysqld_explorer.service&lt;/font&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p papago-id=&quot;69&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도커 웹사이트의 다음 문서는 도커 컨테이너에 SSH 서비스를 구현하는 방법을 보여줍니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;서비스에 쉽게 적응할 수 있어야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://docs.docker.com/engine/examples/running_ssh_service/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;70&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://docs.docker.com/engine/examples/running_ssh_service/&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;71&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 질문에 대해서도 다양한 질문이 제기되고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/22886470/start-sshd-automatically-with-docker-container&quot; papago-id=&quot;72&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도커 컨테이너로 sshd를 자동으로 시작합니다.&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;73&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도커 파일 / docker 이미지를 변경할 수 없는 경우.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;해결 방법은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;74&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;docker run image ID bash -c'service mysql start; while true; do sleep 100; done; done; '&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;37&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용중입니다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(버전: &quot;3.9&quot;)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;39&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 하는 일은 아래와 같은 명령어를 서비스에 추가하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;40&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;서비스를 시작하고 비엔드 프로세스를 실행합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;command: /bin/sh -c &quot;service mysql start; while sleep 1000; do :; done&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;79&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 힌트를 찾기 전에 몇 시간 동안 계속 찾고 있었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;위의 내용을 수정했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;41&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;CMD:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;'/bin/sh' '-c' '/mypath/startup.sh; bash'&lt;/code&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;81&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;mypath&quot;는 지속적인 볼륨에 있으며, 여기에 startup.sh 을 배치했습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;82&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Portainer(2.11.1)에서는 &quot;명령&quot;에 &quot;엔트리포인트&quot;가 여전히 비어 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;83&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신이 당신의 주요 프로세스를 pid 1로 실행하기를 원하지만 또한 cron을 시작하거나 다른 서비스를 시작하고 싶다고 말하면 당신은 다음과 같은 것을 추가할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#make sure some other service starts on container start, tested in Ubuntu 20.04 based container
RUN echo &quot;cron&quot; &amp;gt;&amp;gt; /etc/bash.bashrc

CMD [&quot;myproc&quot;] #should run as 1 to receive sigterm
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;84&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 접근 방식을 사용할 가능성은 높지만 테스트하지는 않았지만 메인 프로세스 외에 서비스를 시작하는 것과 같은 작업을 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;RUN echo &quot;service mysql start&quot; &amp;gt;&amp;gt; /etc/bash.bashrc

CMD [&quot;myproc&quot;] #should run as 1 to receive sigterm
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;42&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본적으로 사용자 정의 엔트리를&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/etc/bash.bashrc&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;43&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;시스템(container) 시작 시 실행됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다시 Ubuntu 20.04, 다른 버전에서는 시스템&lt;/font&gt;&lt;/font&gt;&lt;code&gt;bashrc&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;44&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이름이 다를 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;88&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/25135897/how-to-automatically-start-a-service-when-running-a-docker-container&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>docker</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/724</guid>
      <comments>https://fileupload.tistory.com/724#entry724comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:12:07 +0900</pubDate>
    </item>
    <item>
      <title>프로그래밍 언어에 키워드가 필요한 이유는 무엇입니까?</title>
      <link>https://fileupload.tistory.com/723</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로그래밍 언어에 키워드가 필요한 이유는 무엇입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 (C):&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int break = 1;
int for = 2;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;왜 컴파일러는 그것을 추론하는데 전혀 문제가 없을까요?&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;break&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;for&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;변수가 여기에 있습니까?&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 키워드가 필요한데요.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우리는 그 프로그램들이 읽을 수 있기를 원합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이미 복잡한 오늘날의 컴파일러 작업을 지나치게 complic하고 싶지 않습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 가장 중요한 것은, 만약 어떤 '핵심' 단어들이 어떤 특별한 행동을 위해 남겨져 있다면, 언어는 훨씬 더 강력하다는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면, 이 언어는 명확한 방식으로 for loop을 구현하려고 시도하다가 죽는 것보다 더 높은 수준에서 유용하다고 생각할 수 있습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그럴 필요는 없어요 -- 포트란은 어떤 단어도 예약하지 않았으니까요, 다음과 같은 것들이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;if if .eq. then then if = else else then = if endif
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;완전한 합법입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 &lt;em papago-id=&quot;10-1&quot;&gt;컴파일러&lt;/em&gt;가 언어를 구문 분석하기 어렵게 만들 뿐만 아니라 사람이 오류를 읽거나 발견하는 것을 거의 불가능하게 만듭니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, 고전적인 Fortran을 생각해 보십시오. 예를 들어, Fortran 77을 통해 -- 최근에 사용한 적은 없지만, 적어도 최근 표준에서는 이와 같은 것을 몇 가지 수정했기를 바랍니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;포트란 DO 루프는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;DO 10 I = 1,10
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이들이 나란히 있지 않고서는 이것이 어떻게 달랐는지 알 수 있을 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;DO 10 I = 1.10
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 아닙니다. 는 DO 의 &lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 가치를 단순하게 할당하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;1.10&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이름이 붙은 변수에&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;DO 10 I&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(예, 이름에 공백도 허용합니다.)&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;포트란은 암시적인(언클리어되지 않은) 변수도 지원하므로 이는 모두 완벽하게 합법적인 것이며 일부 컴파일러는 경고 없이 이를 수락할 수도 있습니다!&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 다음과 같은 문구가 나오면 컴퓨터는 무엇을 하게 될까요?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;while(1) {
  ...
  if (condition)
    break;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;진짜 깨질까요?&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면 그것을 그것으로 취급해야 할까요?&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;1;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;?&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;특정한 경우에 언어가 모호해지거나, 아주 똑똑한 파서를 만들어야 하고, 미묘한 구문을 추론할 수 있습니다. 그것은 불필요한 추가 작업일 뿐입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;없어요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;PL/1에는 키워드가 없는 것으로 유명하며, 모든 &quot;키워드&quot;(BEGIN, DO, ...)도 변수 이름으로 사용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 이를 허용하면 정말 모호한 코드를 작성할 수 있습니다. IF DO &amp;gt; BEGINTHEN PRINT:=CALL-GOTO; 이름 집합이 보통(PL/1:-를 제외하고 지금까지 본 모든 언어에서 그러하듯이) 언어로 &quot;문 키워드&quot;를 예약하는 것은 일반적으로 손실이 되지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;APL에도 키워드가 없는 것으로 유명합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 복잡한 연산자를 쓸 수 있는 200여개의 놀라운 상징들이 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;(&quot;domino&quot; 연산자 [묻지마!]는 가운데에 계산기 구분 기호가 있는 네모난 상자입니다.) 이 경우, 랭귀지 설계자들은 키워드 대신 아이콘만을 사용했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;결과적으로 APL은 &quot;쓰기 전용&quot; 언어로 명성을 얻고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;결론: 필수 사항은 아니지만, 키워드가 프로그래머들에게 알려진 작은 집합에서 예약된 식별자일 경우 프로그램을 훨씬 더 쉽게 읽을 수 있게 만드는 경향이 있습니다. (일부 언어학자들은 &quot;키워드&quot;가 &quot;.&quot;와 같은 특별한 구두점 문자로 시작하여 모든 가능한 식별자를 사용할 수 있도록 해야 한다고 주장합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 이는 별도로 입력할 필요가 없거나 페이지에 혼란을 줄 필요가 없습니다. 키워드 세트가 작을 때 키워드와 일치하는 &quot;식별자&quot;를 멀리하기가 매우 쉽습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;태그가 C이므로 원래 C 언어는 기본적으로 모든 변수가 유형으로 정의되도록 했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;라는 뜻입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;foo;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;유형의 변수를 선언할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇다고 치자.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;break;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 그렇다면 컴파일러는 당신이 다음과 같은 이름의 변수를 선언할지 여부를 어떻게 알 수 있습니까?&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;break&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 키워드를 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;break&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;?&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;몇 가지 이유:&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;표본에서 키워드가 모호하지 않은 것처럼 보일 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 변수 'break' 또는 변수 'for'를 사용하는 곳은 이뿐만이 아닙니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파서를 쓰는 것은 훨씬 더 어렵고 실수하기 쉽습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;라이브러리에서 함수 또는 절차 이름으로 키워드를 사용하는 것은 원하지 않거나 보안과 관련된 부작용을 가질 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 사람들이 말했듯이, 이것은 컴파일러가 당신의 소스 코드를 파싱하는 것을 더 쉽게 해줍니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 소스 코드를 보다 쉽게 읽을 수 있도록 해준다는 점에서 좀 더 말씀드리고 싶습니다. 다음 예를 들어 보겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 (만약 &amp;gt; 0이라면) = 10 end if&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 번째 &quot;if&quot;와 두 번째 &quot;then&quot;은 변수이고 다른 변수들은 변수가 아닙니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이런 종류의 코드는 읽을 수 없는 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;:)&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우리가 C++를 말하는 것이라면, C++는 이미 매우 복잡한 문법을 가지고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어 키워드를 변수 이름으로 사용할 수 있도록 허용하면 문제가 더욱 복잡해집니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 내용을 작성하면 컴파일러에 문제가 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;while(*s++);
return(5);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;루프인가요 아니면 이름이 붙은 함수에 대한 호출인가요?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;while&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;? 현재 함수에서 값 5를 반환하시겠습니까, 아니면 이름이 붙은 함수를 호출하시겠습니까?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;return&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;특별한 의미를 가진 구성요소가 단순히 특별한 이름을 가지고 있다면, 그것은 종종 그것들을 명확하게 지칭하는 데 사용될 수 있는 특별한 이름을 가지고 있다면, 그것은 종종 그것들을 단순화시킵니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우리는 약간의 제정신 상태를 유지하고 싶기 때문입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;void myfunction(bool) { .. };

funcp while = &amp;amp;myfunction;
while(true); 
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파서를 쓰는 것이 불가능하지는 않더라도 매우 이상하게 보이는 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int break = 1;
while (true) {
   // code to change break
   if (!break) break;   // not very readable code.
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언어 정의에 따라 컴파일러는 키워드가 필요할 수도 있고 필요하지 않을 수도 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;무엇을 해야 할지 모르는 경우 우선 순위 규칙을 적용하거나 실패할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;void return(int i){printf(&quot;%d&quot;,i);}
public int foo(int a)
{
  if(a &amp;gt; 2)return (a+1)*2;
  return a + 3;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;a가 2보다 크면 어떻게 됩니까?&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언어 사양에 따라 컴파일러에 오류가 발생할 수 있습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언어 사양에 따라 컴파일러가 반환 함수를 사용해야 할 수 있습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언어 사양에 따라 컴파일러가 반환해야 할 수 있습니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;키워드를 사용하지 않는 언어를 정의할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 기호를 바꿀 수 있는 언어를 정의할 수도 있습니다(단, 매우 짧은 키워드만 해당).&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제는 컴파일러가 아닙니다. 사양이 완벽하고 오류가 없으면 작동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제는 PEBCAD인데, 기호 정의를 추적해야 하기 때문에 언어의 이 기능을 사용하는 프로그램은 읽기 어려울 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;FWIW, Tcl에 예약어가 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;if&quot;, &quot;break&quot; 등의 변수와 함수를 가질 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;토큰의 해석은 상황에 따라 전적으로 좌우됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;동일한 토큰은 한 컨텍스트의 명령어, 다른 컨텍스트의 변수 또는 다른 컨텍스트의 리터럴 문자열을 나타낼 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;많은 경우 컴파일러는 예제와 같이 키워드를 일반 식별자로 해석할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int break = 1;
int for = 2;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사실, 나는 이것을 하는 간단한 조립 같은 장난감 언어를 위한 컴파일러를 만들었을 뿐이지만, 그런 경우에는 사용자에게 경고를 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;57&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 때때로 구문은 키워드와 식별자가 모호한 방식으로 정의됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int break;

while(...)
{
    break; // &amp;lt;-- treat this as expression or statement?
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 가장 분명한 이유는 편집자들이 키워드를 강조해서 코드를 사람들이 읽을 수 있도록 할 것이기 때문입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;키워드를 식별자로 취급할 수 있도록 허용하면 코드 강조 표시가 어려워지고 코드의 가독성이 떨어지게 됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;59&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/2452365/why-does-a-programming-language-need-keywords&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>c</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/723</guid>
      <comments>https://fileupload.tistory.com/723#entry723comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:11:58 +0900</pubDate>
    </item>
    <item>
      <title>SonarQuebe가 AngularJS로 멋지게 플레이하게 하는 방법은?</title>
      <link>https://fileupload.tistory.com/722</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SonarQuebe가 AngularJS로 멋지게 플레이하게 하는 방법은?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일부 자바스크립트 코드의 품질 검사를 위해 SonarQuebe를 사용하는 것을 검토해보았지만, 이 코드는 Angular를 사용하여 작성되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;JS.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SonarQuebe 규칙 중 하나는 함수의 줄 수를 확인합니다. 이는 합리적인 것처럼 보이지만 AngularJS에서는 함수를 사용하여 컨트롤러, 서비스 및 지시를 정의하고 이러한 함수는 상당히 커질 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;개념적으로, 이들은 클래스 정의에 더 가까우며, 그 안에 다른 함수들이 내포되어 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이상적으로는 SonarQuebe에서 내부 기능의 길이와 내부 기능을 제외한 외부 기능을 확인하고 싶은데 방법을 모르겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;AngularJS와 함께 SonarQube를 사용하여 이 문제를 겪은 사람이 있거나, 좋은 해결책을 아는 사람이 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;한 가지 해결책은 &lt;a href=&quot;https://stackoverflow.com/questions/592396/what-is-the-purpose-of-a-self-executing-function-in-javascript&quot; papago-id=&quot;5-1&quot;&gt;모든&lt;/a&gt; 방법을 자체 &lt;a href=&quot;https://stackoverflow.com/questions/592396/what-is-the-purpose-of-a-self-executing-function-in-javascript&quot; papago-id=&quot;5-1&quot;&gt;실행 기능&lt;/a&gt;에 별도로 선언하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(function(){
    var controller = function(dependency){
         //...
    },

    someDirective = function(dependency){
        //...
    },

    //Finally, your module
    module = angular.module(&quot;MyMod&quot;, []);

    module.controller(&quot;MyController&quot;, ['dependency', controller]);
    module.directive(&quot;someDirective&quot;, ['dependency', someDirective]);
}());
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 몇몇 개발자들에게는 분명 불편한 패턴일 수 있지만, 소나큐베의 기능을 더 작은 조각으로 쪼개는 것도 한 가지 방법입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/22204885/how-to-get-sonarqube-to-play-nicely-with-angularjs&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>AngularJS</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/722</guid>
      <comments>https://fileupload.tistory.com/722#entry722comment</comments>
      <pubDate>Mon, 30 Oct 2023 21:11:51 +0900</pubDate>
    </item>
    <item>
      <title>디버그는 어디에 있습니까?안드로이드 스튜디오의 키스토어</title>
      <link>https://fileupload.tistory.com/721</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;디버그는 어디에 있습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;안드로이드 스튜디오의 키스토어&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;구글+ api 를 활성화 해야해서 필요합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;debug.keystore&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 안드로이드 스튜디오로 바꿨는데 어디 있는지 모르겠어요.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;~/.android/debug 경로의 일식에서 찾을 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;열쇠점&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;3-0&quot;&gt;EDIT&lt;/strong&gt; 1) 파일 &amp;gt; 프로젝트 구조 &amp;gt; 프로젝트 선택 &amp;gt; 서명으로 이동하여 기본값 또는 원하는 키 저장소를 선택하고 상세 내용을 모두 작성합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;세부사항을 채우지 못할 경우에는 녹색 '+' 버튼을 누르시면 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;스크린샷에서 강조를 했습니다.&lt;/font&gt;&lt;/font&gt;&lt;img src=&quot;https://i.stack.imgur.com/eRGkq.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2단계) 매우 중요: 빌드 유형으로 이동 &amp;gt; 빌드 유형을 선택하고 &quot;서명 구성&quot;을 선택합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 경우에는 &quot;config&quot;를 선택해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;강조 표시된 영역을 확인합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;img src=&quot;https://i.stack.imgur.com/IEVxW.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/p&gt;&lt;ul&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; Windows 의 :&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;C:\Users\USERNAME\.android\debug.keystore&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(USERNAME을 실제 PC 사용자 이름으로 바꿉니다)&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;경우: Linux  Mac OS :&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;~/.android/debug.keystore&lt;/code&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;네가 얻은 후에&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SHA1&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래의 명령 프롬프트를 사용하는 코드:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  keytool -list -v -keystore &quot;C:\Users\USERNAME\.android\debug.keystore&quot; -alias androiddebugkey -storepass android -keypass android
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Android Studio에서는 콘솔 명령 없이 모든 앱 서명 정보를 찾을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로젝트 열기&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오른쪽 패널에서 그라들 클릭&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Gradle projects 패널에서 폴더 열기: Your &lt;strong papago-id=&quot;13-1&quot;&gt;Project&lt;/strong&gt; -&lt;strong papago-id=&quot;13-1&quot;&gt;&amp;gt; Tasks&lt;/strong&gt; -&amp;gt; &lt;strong papago-id=&quot;13-1&quot;&gt;Android&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;signingReport 작업을 실행(두 번 클릭)하면 Gradle 콘솔(키스토어 경로,&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;SHA1, MD5 등).&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/VF3tC.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/VF3tC.png&quot; alt=&quot;signingReport task and its result&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신의 주요 정보를 알아낼 수 있는 또 다른 방법은 java 폴더로 이동하는 것입니다. 나에게 그것은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;C:\Program Files\Java\jdk1.8.0_60\bin
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 명령을 실행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;keytool -list -v -keystore &quot;%USERPROFILE%\.android\debug.keystore&quot; -alias androiddebugkey -storepass android -keypass android
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;em papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;명령어를 통해 키스토어 주소가 &quot;c:\users/&amp;lt;%mylogin%&amp;gt;&quot; android\debug임을 쉽게 알 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;keystore&quot;, 별칭은 &quot;android 디버그키&quot; 스토어 암호는 &quot;android&quot; 키 암호는 &quot;android&quot;입니다.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 Android 'Get API Key' 설명서의 기본 구성입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://developers.google.com/maps/documentation/android-api/signup&quot; rel=&quot;noreferrer&quot; papago-id=&quot;18-1&quot;&gt;https://developers.google.com/maps/documentation/android-api/signup&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 명령을 사용하면 모든 키 저장소를 가져올 수 있으며 단말기로 이동하여 안드로이드 루트 디렉터리에서 다음을 실행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;./gradlew signingReport
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;키스토어 목록과 키스토어 정보는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/poyc2.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/poyc2.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제가 생겼어요.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;debug.keystore&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일이 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 제게 맞는 파일을 만들어 준 유일한 단계는 &lt;strong papago-id=&quot;22-1&quot;&gt;안드로이드 스튜디오에서 새로운 안드로이드 프로젝트를 만드는&lt;/strong&gt; 것이었습니다&lt;strong papago-id=&quot;22-1&quot;&gt;.&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 나를 새로운 것으로 만들었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;debug.keystore&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;길 아래에&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;C:\Users\username\.android\&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 솔루션은 프로젝트를 아직 생성하지 않은 경우에만 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도움이 됐어요.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;키 &lt;strong papago-id=&quot;28-0&quot;&gt;저장소 이름:&lt;/strong&gt; &quot;debug.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;키스토어&quot;&lt;/font&gt;&lt;/font&gt;&lt;br&gt; &lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;29-0&quot;&gt;키스토어 암호:&lt;/strong&gt; &quot;안드로이드&quot;&lt;/font&gt;&lt;/font&gt;&lt;br&gt; &lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;30-0&quot;&gt;키 별칭:&lt;/strong&gt; &quot;androiddebugkey&quot;&lt;/font&gt;&lt;/font&gt;&lt;br&gt; &lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;31-0&quot;&gt;키 암호:&lt;/strong&gt; &quot;안드로이드&quot;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/bOQgO.png&quot; rel=&quot;noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/bOQgO.png&quot; alt=&quot;exapmle&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;USER_NAME_PC - PC 사용자 이름&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;JDK가 설치되어 있지 않은 경우.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Android 단말기로 이동하여 Android Studio와 함께 제공되는 JRE의 빈 폴더로 이동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;C:\Program Files\Android\Android Studio\jre\bin
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 명령을 실행합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자 이름을 실제 PC 사용자 이름으로 바꾸어야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;keytool -list -v -keystore &quot;C:\Users\USERNAME\.android\debug.keystore&quot; -alias androiddebugkey -storepass android -keypass android
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Android Developers 설명서에서 귀하의 &lt;a href=&quot;https://developer.android.com/studio/publish/app-signing#expdebug&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;35-1&quot;&gt;앱에 서명&lt;/a&gt;하기:&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;h3 papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;디버그 인증서 만료&lt;/font&gt;&lt;/h3&gt; 
 &lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;[...] 파일은 다음 위치에 저장됩니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;&lt;code&gt;~/.android/&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; X 및 OS X및 &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
  &lt;li&gt;&lt;code&gt;C:\Documents and Settings\&amp;lt;user&amp;gt;\.android\&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Windows XP( XP)에서&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
  &lt;li&gt;&lt;code&gt;C:\Users\&amp;lt;user&amp;gt;\.android\&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 및 및  Windows Vista및 Windows 7, 8및 10&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;/ul&gt; 
&lt;/blockquote&gt;&lt;p papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Windows에서,&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;명령 프롬프트로 이동하기만 하면 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cd C:\Program Files\Java\jdk-10.0.2\bin&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어디에&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;jdk-10.0.2 or full path&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신의 경우에는 다를 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;빈칸에 있으면 이 코드를 입력합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;keytool -keystore C:\Users\GB\.android/debug.keystore -list -v&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어디에&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;C:\Users\GB\.android/debug.keystore&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 경우 키스토어로 가는 길입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이런 결과가 나올 겁니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/kLQ2P.png&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/kLQ2P.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Windows(윈도우)의 경우 디버그.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;키스토어 파일이 디버그 위치(C:\Users\username\.android)에 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;키스토어 파일은 Android Studio를 설치한 위치에서도 찾을 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본 키 저장소 파일:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;debug.keystore&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;폴더에 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.android&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적으로 Android SDK를 설치한 사용자의 운영 체제의 기본 홈 폴더에 위치합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; Ubuntu PC입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/home/dhananjay/.android&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;반면에 윈도우 PC에는 위치해 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;C:\Users\dhananjay\.android&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;strong papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;=======================================&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;55&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;표준 예술 파일 탐색기에서:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;56&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;=======================================&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/e9WkS.jpg&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/e9WkS.jpg&quot; alt=&quot;in standart File Explorer:&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;57&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;=======================================&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;View(보기) 탭을 열고 Hidden(숨김) 항목을 확인합니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;59&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;=======================================&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/uLt1u.jpg&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/uLt1u.jpg&quot; alt=&quot;open view tab and check Hidden&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;60&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;=======================================&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;61&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 .android 폴더를 볼 수 있습니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;62&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;=======================================&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/ynh7a.jpg&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/ynh7a.jpg&quot; alt=&quot;Now you can see your .android folder&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong papago-id=&quot;63&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;[SOLUED] 동일한 Windows 10 컴퓨터에서 사용자 이름을 변경한 후 앱을 다시 실행하는 방법&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;64&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;안드로이드 스튜디오에서 파일 &amp;gt; Project Structure &amp;gt; app &amp;gt; &quot;+&quot; 클릭하여 새로운 구성 &quot;config&quot; &lt;a href=&quot;https://i.stack.imgur.com/Ke5A0.png&quot; papago-id=&quot;64-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;File &lt;/a&gt;&amp;gt; &lt;a href=&quot;https://i.stack.imgur.com/Ke5A0.png&quot; papago-id=&quot;64-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;Project Structure&lt;/a&gt; &amp;gt;&lt;a href=&quot;https://i.stack.imgur.com/Ke5A0.png&quot; papago-id=&quot;64-1&quot; rel=&quot;nofollow noreferrer&quot;&gt; app &lt;/a&gt;&amp;gt; &lt;a href=&quot;https://i.stack.imgur.com/Ke5A0.png&quot; papago-id=&quot;64-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;Signing&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/Ke5A0.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;65&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;플레이버 탭 &amp;gt; 사인 박스에서 신규 &quot;config&quot; 항목 선택 &lt;a href=&quot;https://i.stack.imgur.com/K4eh1.png&quot; papago-id=&quot;65-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;File &lt;/a&gt;&amp;gt; &lt;a href=&quot;https://i.stack.imgur.com/K4eh1.png&quot; papago-id=&quot;65-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;Project Structure &lt;/a&gt;&amp;gt; &lt;a href=&quot;https://i.stack.imgur.com/K4eh1.png&quot; papago-id=&quot;65-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;App &lt;/a&gt;&amp;gt; &lt;a href=&quot;https://i.stack.imgur.com/K4eh1.png&quot; papago-id=&quot;65-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;플레이버&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://i.stack.imgur.com/K4eh1.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;66&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;앱을 재구성했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;작업실 폐쇄 및 재시작&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;67&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Build &amp;gt; Rebuild Project 클릭&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;앱은 이것을 자동으로 &lt;a href=&quot;https://i.stack.imgur.com/JVLbc.png&quot; papago-id=&quot;31-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;추가&lt;/a&gt;하여 보여주었습니다: build&lt;a href=&quot;https://i.stack.imgur.com/JVLbc.png&quot; papago-id=&quot;31-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;.gradle&lt;/a&gt;&lt;/font&gt;&lt;/font&gt; &lt;img src=&quot;https://i.stack.imgur.com/JVLbc.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;69&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;휴대폰으로 앱을 테스트해보니 스튜디오에서 이 새로운 구성으로 앱을 다시 설치해달라고 요청했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;앱이 이전과 같이 실행됩니다!&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;70&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다이나 마이크&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;71&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내가 생각할 수 있는 가장 쉬운 것은 디버그에서 지문을 가져오는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;keystore(paths는 다른 답변에서 언급됨)를 통해 프로젝트에 추가할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;키 저장소를 복사하거나 새 앱을 추가할 필요가 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;개발하는 각 기계의 지문 목록에 추가하기만 하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;72&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;FWIW, 노트북을 다른 노트북으로 바꾸다가 우연히 이런 일을 당했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 많이 뛰어다녀요.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://support.google.com/firebase/answer/7000104?hl=en#sha1&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;73&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://support.google.com/firebase/answer/7000104?hl=en#sha1&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;74&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것이 몇몇 사람들에게 도움이 되길 바랍니다! :)&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;Go to Build &amp;gt; Clean Project&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;75&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로젝트를 다시 구축합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;76&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Fluter의 경우 프로젝트의 안드로이드 부분만 열어야 합니다 파일-&amp;gt;열기-&amp;gt; 해당 프로젝트의 안드로이드 폴더를 몇 분간 선택하여 오른쪽에서 gradle-&amp;gt;android-&amp;gt;Tasks-&amp;gt;android-&amp;gt;signin Report 를 클릭한 후 그라들 동기화를 완료합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;77&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;디버그가 필요했어요&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;안드로이드 스튜디오를 막 설치한 후 키스토어가 .android 폴더에 없었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;78&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 솔루션은 빈 프로젝트를 새로 만드는 것이었습니다. &lt;strong papago-id=&quot;78-1&quot;&gt;빌드-&amp;gt; 빌드&lt;/strong&gt; 변형 &lt;strong papago-id=&quot;78-1&quot;&gt;선택...&lt;/strong&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;78-5&quot;&gt;그런&lt;/strong&gt; 다음 Active &lt;strong papago-id=&quot;78-3&quot;&gt;Build Variant에서 디버그&lt;/strong&gt;로 설정합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 후 &lt;strong papago-id=&quot;78-7&quot;&gt;프로젝트를 만들고&lt;/strong&gt; &lt;strong papago-id=&quot;78-9&quot;&gt;디버그도 실행&lt;/strong&gt;했습니다(필요한지 확실하지 않음).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이후 .android 폴더를 체크인하고 디버그를 했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;키스토어가 생성되었습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;79&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;때때로 app/build.gradle 파일에 지정됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어,&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;signingConfigs {
    debug {
        storeFile file(System.env.HOME + '/.android/debug.keystore')
        storePassword 'android'
        keyAlias 'androiddebugkey'
        keyPassword 'android'
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;80&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저의 경우 안드로이드 스튜디오의 SDK가 이 위치에 설치되어 있었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;E:\Android\AppData\Local\Sdk&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 나의&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.android&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일 위치:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;%UserProfile%\.android&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;83&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;환경 변수를 올바르게 설정하려면 다음 단계를 따릅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;34&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제거합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ANDROID_HOME&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;35&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ANDROID_SDK_HOME&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;36&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;환경 변수에서 변수를 추출합니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;37&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이름으로 새 변수 만들기&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ANDROID_HOME&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SDK 위치 값(예:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;E:\Android\AppData\Local\Sdk&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;39&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;).&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;40&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이름으로 새 변수 만들기&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ANDROID_USER_HOME&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;41&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 당신이 사용하는 디렉토리의 값.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.android&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;42&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일이 위치합니다(예:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;%UserProfile%\.android&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;43&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;).&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;94&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Android Studio를 다시 시작합니다.&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p papago-id=&quot;95&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;작업의 단계를 완료하기 전에 그라들을 동기화합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;96&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/16965058/where-is-debug-keystore-in-android-studio&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>Android</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/721</guid>
      <comments>https://fileupload.tistory.com/721#entry721comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:42:31 +0900</pubDate>
    </item>
    <item>
      <title>AngularJS에서 구성 단계를 테스트하는 장치</title>
      <link>https://fileupload.tistory.com/720</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;AngularJS에서 구성 단계를 테스트하는 장치&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;AngularJS의 유닛 테스트 작성법을 배우려고 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 처음에 시작했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;angular.module( ... ).config( ... )&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내부 구성을 테스트하고 싶습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;관련 부분은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;angular.module('ogApp', ['ngCookies','ui.router','ogControllers','ogServices','ogDirectives','ogMetricsData'])

.config([
  '$stateProvider', '$locationProvider',
  function ($stateProvider, $locationProvider) {
    $stateProvider.
      state('login', {
        templateUrl: 'connect.html'
      }).state('addViews', {
        templateUrl: 'add-views.html'
      }).state('dashboard', {
        templateUrl: 'dashboard.html'
      });
    $locationProvider.
      html5Mode(true).
      hashPrefix('!');
  }
]);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 코드를 테스트하는 가장 쉬운 방법은 모조품을 주입하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$stateProvider&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$locationProvider&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 그런 다음 구성 단계를 실행합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 다음에는 어떻게 주장합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$stateProvider&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;$locationProvider&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇게 보여야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 생각이 맞다면 문제는 모듈에 해당 모의실험을 어떻게 주입하고 테스트에서 해당 모의실험의 구성 단계를 실행할 수 없다는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 코드를 테스트하는 방법을 보여주시겠습니까?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;장치 테스트를 위해 공급업체에 액세스하는 방법은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;describe('yourProvider', function () {
    var provider;

    // Get the provider
    beforeEach(module('app', function (yourProvider) {
        // This callback is only called during instantiation
        provider = yourProvider;
    });

    // Kick off the above function
    beforeEach(inject(function () {}));

    it('does its thing', function () {
        expect(provider.someMethod()).toEqual('your results');
    });
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 아직 모의실험을 하는 아주 간단한 방법을 생각해내지 못했지만, 여러분은 쉽게 그 방법들을 염탐할 수 있고, 그것은 충분히 가깝습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;종속성 제공자의 .$get() 메서드에서 반환된 모의가 필요한 경우 다른 스파이와 함께 수행할 수도 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 예에서는 모의를 반환하고 추가 스파이를 설정하는 방법을 보여 줍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;describe('yourProvider', function () {
    var dependency, mock, provider;

    beforeEach(module('app', function (dependencyProvider) {
        dependency = dependencyProvider;
        mock = jasmine.createSpyObj('dependency', [
            'methodsGoHere'
        ]);
        spyOn(dependency, 'methodName');
        spyOn(dependency, '$get').andReturn(mock);
    }, function (yourProvider) {
        provider = yourProvider;
    });

    beforeEach(inject(function () {}));

    it('does its thing', function () {
        expect(provider.someMethod()).toEqual('your results');
        expect(dependency.methodName).toHaveBeenCalled();
    });

    it('returns the mock from $get', function () {
        expect(dependency.$get).toBe(mock);
    });
});
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://pivotal.github.io/jasmine/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;5-1&quot;&gt;자스민스를 &lt;/a&gt;사용하시면 됩니다.&lt;/font&gt;&lt;/font&gt; &lt;code&gt;createSpy&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;createSpyObj&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모의 서비스를 만드는 것과&lt;/font&gt;&lt;/font&gt;&lt;code&gt;angular-mocks.js&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;주사를 놓는 겁니다&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모의실험에 대한 자세한 지침은 다음과 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/14773269/injecting-a-mock-into-an-angularjs-service&quot; papago-id=&quot;16-1&quot;&gt;모크를 각도에 주입하기&lt;/a&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/14773269/injecting-a-mock-into-an-angularjs-service&quot; papago-id=&quot;16-1&quot;&gt;JS서비스&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 지시서를 작성한 이 &lt;a href=&quot;https://github.com/logicbomb/lvlfileupload/blob/master/tests/xhr-svc-unit.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;17-1&quot;&gt;테스트&lt;/a&gt;에서는 다음을 확인할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;9행 Google cdn의 angular-mock 포함&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Line 19 &amp;amp; 20 가짜 rootScope 객체 생성&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;라인 21 &amp;amp; 22 가짜 q 서비스 생성&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;라인 42 서비스에 가짜를 주입하도록 공급자를 설정합니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;라인 48 가짜가 있는 서비스 인스턴스화(이 서비스는 테스트 대상 지침에 주입됨)&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;53번 라인 테스트 중인 방법 호출&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;55번 선 - 59번 가짜의 상태에 대한 주장&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기능을 가리키는 공장을 만들 겁니다&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 해당 함수는 config 함수 내에서도 호출됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하면 공장을 단위 테스트할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;angular.module('ogApp', ['ngCookies','ui.router','ogControllers','ogServices','ogDirectives','ogMetricsData']);

// Configuration factory for unit testing
angular.module('ogApp')
.factory('configuration', configuration);

configuration.$inject = ['$stateProvider', '$locationProvider'];

function configuration($stateProvider, $locationProvider) {
  return {
    applyConfig: function () {
      $stateProvider.
        state('login', {
          templateUrl: 'connect.html'
        }).state('addViews', {
          templateUrl: 'add-views.html'
        }).state('dashboard', {
          templateUrl: 'dashboard.html'
        });
      $locationProvider.
        html5Mode(true).
        hashPrefix('!');
    };
}

// Call above configuration function from Angular's config phase
angular.module('ogApp')
.config([
  '$stateProvider', '$locationProvider',
  function ($stateProvider, $locationProvider) {
    var config = configuration($stateProvider, $locationProvider);
    config.applyConfig();
  }
]);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 공장과 마찬가지로 구성 공장을 단위 테스트하고 모의 주입을 할 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/18983280/unit-testing-the-config-phase-in-angularjs&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>AngularJS</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/720</guid>
      <comments>https://fileupload.tistory.com/720#entry720comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:42:15 +0900</pubDate>
    </item>
    <item>
      <title>Spring Webflux : Webclient : 본문 가져오기 오류</title>
      <link>https://fileupload.tistory.com/719</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Spring Webflux : Webclient : 본문 가져오기 오류&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 스프링 웹 플럭스의 웹 클라이언트를 사용하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;WebClient.create()
            .post()
            .uri(url)
            .syncBody(body)
            .accept(MediaType.APPLICATION_JSON)
            .headers(headers)
            .exchange()
            .flatMap(clientResponse -&amp;gt; clientResponse.bodyToMono(tClass));
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;잘 작동하고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 전화하는 웹 서비스의 오류(Ex 500 내부 오류)를 처리하고 싶습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반적으로 저는 &quot;stream&quot;에 doOnError를 추가하고 상태 코드를 테스트하기 위한 Throwable입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 웹 서비스에서 제공하는 본체는 제가 사용하고 싶은 메시지를 제공하기 때문에 제 문제는 그것을 받고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 무슨 일이 있어도 플랫맵을 하고 상태 코드를 스스로 테스트하여 바디를 역직렬화할지 여부를 확인하려고 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http 오류를 처리하고 예외를 처리하려면 클라이언트 응답에서 제공하는 메서드를 사용하는 것이 좋습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;WebClient.create()
         .post()
         .uri( url )
         .body( bodyObject == null ? null : BodyInserters.fromValue( bodyObject ) )
         .accept( MediaType.APPLICATION_JSON )
         .headers( headers )
         .exchange()
         .flatMap( clientResponse -&amp;gt; {
             //Error handling
             if ( clientResponse.statusCode().isError() ) { // or clientResponse.statusCode().value() &amp;gt;= 400
                 return clientResponse.createException().flatMap( Mono::error );
             }
             return clientResponse.bodyToMono( clazz )
         } )
         //You can do your checks: doOnError (..), onErrorReturn (..) ...
         ...
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실제로 DefaultWebClient의 DefaultResponseSpec에서 오류를 처리하는 데 사용된 것과 같은 논리입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;DefaultResponseSpec은 Exchange()가 아닌 retrieve()를 실행한 경우 발생할 ResponseSpec을 구현한 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;있지 않나요?&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;onStatus()&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;?&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-java prettyprint-override&quot;&gt;&lt;code&gt;    public Mono&amp;lt;Void&amp;gt; cancel(SomeDTO requestDto) {
        return webClient.post().uri(SOME_URL)
                .body(fromObject(requestDto))
                .header(&quot;API_KEY&quot;, properties.getApiKey())
                .retrieve()
                .onStatus(HttpStatus::isError, response -&amp;gt; {
                    logTraceResponse(log, response);
                    return Mono.error(new IllegalStateException(
                            String.format(&quot;Failed! %s&quot;, requestDto.getCartId())
                    ));
                })
                .bodyToMono(Void.class)
                .timeout(timeout);
    }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고:&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-java prettyprint-override&quot;&gt;&lt;code&gt;    public static void logTraceResponse(Logger log, ClientResponse response) {
        if (log.isTraceEnabled()) {
            log.trace(&quot;Response status: {}&quot;, response.statusCode());
            log.trace(&quot;Response headers: {}&quot;, response.headers().asHttpHeaders());
            response.bodyToMono(String.class)
                    .publishOn(Schedulers.elastic())
                    .subscribe(body -&amp;gt; log.trace(&quot;Response body: {}&quot;, body));
        }
    }
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 이렇게 해서 오류 본체를 얻었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;webClient
...
.retrieve()    
.onStatus(HttpStatus::isError, response -&amp;gt; response.bodyToMono(String.class) // error body as String or other class
                                                   .flatMap(error -&amp;gt; Mono.error(new RuntimeException(error)))) // throw a functional exception
.bodyToMono(MyResponseType.class)
.block();
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신도 이렇게 할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;return webClient.getWebClient()
 .post()
 .uri(&quot;/api/Card&quot;)
 .body(BodyInserters.fromObject(cardObject))
 .exchange()
 .flatMap(clientResponse -&amp;gt; {
     if (clientResponse.statusCode().is5xxServerError()) {
        clientResponse.body((clientHttpResponse, context) -&amp;gt; {
           return clientHttpResponse.getBody();
        });
     return clientResponse.bodyToMono(String.class);
   }
   else
     return clientResponse.bodyToMono(String.class);
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;더 많은 예를 보려면 이 기사를 읽어 보십시오 &lt;a href=&quot;https://www.callicoder.com/spring-5-reactive-webclient-webtestclient-examples/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;12-1&quot;&gt;링크&lt;/a&gt;, 오류 처리와 관련된 유사한 문제가 발생했을 때 도움이 된다는 것을 알게 되었습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 글을 쓰는 시점에서 5xx 오류는 더 이상 기본 Netty 계층에서 예외가 발생하지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://github.com/spring-projects/spring-framework/commit/b0ab84657b712aac59951420f4e9d696c3d84ba2 참조&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 다음과 같은 일을 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Mono&amp;lt;ClientResponse&amp;gt; responseMono = requestSpec.exchange()
            .doOnNext(response -&amp;gt; {
                HttpStatus httpStatus = response.statusCode();
                if (httpStatus.is4xxClientError() || httpStatus.is5xxServerError()) {
                    throw new WebClientException(
                            &quot;ClientResponse has erroneous status code: &quot; + httpStatus.value() +
                                    &quot; &quot; + httpStatus.getReasonPhrase());
                }
            });
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 다음:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;responseMono.subscribe(v -&amp;gt; { }, ex -&amp;gt; processError(ex));
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;&lt;a href=&quot;https://stackoverflow.com/a/53596358/3191635&quot; papago-id=&quot;16-1&quot;&gt;Reactor와 함께&lt;/a&gt; 예외를 &lt;a href=&quot;https://stackoverflow.com/a/53596358/3191635&quot; papago-id=&quot;16-1&quot;&gt;던지는 올바른 방법&quot;에 대한&lt;/a&gt; 이 &lt;a href=&quot;https://stackoverflow.com/a/53596358/3191635&quot; papago-id=&quot;16-1&quot;&gt;환상적&lt;/a&gt;인 SO 답변을 통해 이 답변을 종합할 수 있었습니다&lt;a href=&quot;https://stackoverflow.com/a/53596358/3191635&quot; papago-id=&quot;16-1&quot;&gt;.&lt;/a&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.onStatus&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.bodyToMono&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.handle&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오류 응답 본문을 예외로 매핑합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// create a chicken
webClient
    .post()
    .uri(urlService.getUrl(customer) + &quot;/chickens&quot;)
    .contentType(MediaType.APPLICATION_JSON)
    .body(Mono.just(chickenCreateDto), ChickenCreateDto.class) // outbound request body
    .retrieve()
    .onStatus(HttpStatus::isError, clientResponse -&amp;gt;
        clientResponse.bodyToMono(ChickenCreateErrorDto.class)
            .handle((error, sink) -&amp;gt; 
                sink.error(new ChickenException(error))
            )
    )
    .bodyToMono(ChickenResponse.class)
    .subscribe(
            this::recordSuccessfulCreationOfChicken, // accepts ChickenResponse
            this::recordUnsuccessfulCreationOfChicken // accepts throwable (ChickenException)
    );
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 방금 비슷한 상황에 직면했고 webClient가 4xx/5xx 응답을 받더라도 예외를 두지 않는다는 것을 알게 되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저의 경우 웹클라이언트를 이용하여 먼저 전화를 걸어 응답을 받고 2xx 응답을 회신하는 경우 응답에서 데이터를 추출하여 두 번째 전화를 걸 때 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;첫 번째 호출이 non-2xx 응답을 수신하는 경우 예외를 적용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예외를 던지는 것이 아니기 때문에 첫 번째 호출이 실패했을 때도 두 번째 호출은 계속 수행됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 제가 한 것은.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;return webClient.post().uri(&quot;URI&quot;)
    .header(HttpHeaders.CONTENT_TYPE, &quot;XXXX&quot;)
    .header(HttpHeaders.ACCEPT, &quot;XXXX&quot;)
    .header(HttpHeaders.AUTHORIZATION, &quot;XXXX&quot;)
    .body(BodyInserters.fromObject(BODY))
    .exchange()
    .doOnSuccess(response -&amp;gt; {
        HttpStatus statusCode = response.statusCode();
        if (statusCode.is4xxClientError()) {
            throw new Exception(statusCode.toString());
        }
        if (statusCode.is5xxServerError()) {
            throw new Exception(statusCode.toString());
        }
    )
    .flatMap(response -&amp;gt; response.bodyToMono(ANY.class))
    .map(response -&amp;gt; response.getSomething())
    .flatMap(something -&amp;gt; callsSecondEndpoint(something));
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Netty의 httpclient(HttpClientRequest)는 기본적으로 클라이언트 오류(4XX)가 아니라 서버 오류(response 5XX)에서 실패하도록 구성되어 있으므로 항상 예외가 발생했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우리가 수행한 작업은 AbstractClientHttpRequest 및 ClientHttpConnector를 확장하여 httpclient가 원하는 방식으로 동작하도록 구성하고 WebClient를 호출할 때 사용자 지정 ClientHttpConnector를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; WebClient.builder().clientConnector(new CommonsReactorClientHttpConnector()).build();
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;WebClient의 retrieve() 메서드는 상태 코드가 4xx 또는 5xx인 응답이 수신될 때마다 WebClientResponseException을 발생시킵니다.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;응답상태코드를확인하여예외처리가가능합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;   Mono&amp;lt;Object&amp;gt; result = webClient.get().uri(URL).exchange().log().flatMap(entity -&amp;gt; {
        HttpStatus statusCode = entity.statusCode();
        if (statusCode.is4xxClientError() || statusCode.is5xxServerError())
        {
            return Mono.error(new Exception(statusCode.toString()));
        }
        return Mono.just(entity);
    }).flatMap(clientResponse -&amp;gt; clientResponse.bodyToMono(JSONObject.class))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;참조:&lt;/font&gt;&lt;/strong&gt; &lt;a href=&quot;https://www.callicoder.com/spring-5-reactive-webclient-webtestclient-examples/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://www.callicoder.com/spring-5-reactive-webclient-webtestclient-examples/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우연히 발견한 거라 코드를 올리는 게 낫겠다고 생각했어요&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 한 일은 웹 클라이언트에서 나오는 요청과 응답 오류를 경력화하는 글로벌 핸들러를 만드는 것이었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 코틀린에 있지만, 당연히 자바로 쉽게 변환할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하면 기본 동작이 확장되므로 고객 처리 외에 모든 자동 구성을 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 사용자가 직접 사용하는 것이 아니라 웹 클라이언트 오류를 적절한 응답으로 변환하는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;응답 오류의 경우 코드와 응답 본문을 클라이언트에 전달하기만 하면 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 요청 오류의 경우 연결 문제만 처리합니다. 그 부분이 제가 신경 쓰는 부분이기 때문입니다. 그러나 보시다시피 쉽게 확장할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-kotlin prettyprint-override&quot;&gt;&lt;code&gt;@Configuration
class WebExceptionConfig(private val serverProperties: ServerProperties) {

    @Bean
    @Order(-2)
    fun errorWebExceptionHandler(
        errorAttributes: ErrorAttributes,
        resourceProperties: ResourceProperties,
        webProperties: WebProperties,
        viewResolvers: ObjectProvider&amp;lt;ViewResolver&amp;gt;,
        serverCodecConfigurer: ServerCodecConfigurer,
        applicationContext: ApplicationContext
    ): ErrorWebExceptionHandler? {
        val exceptionHandler = CustomErrorWebExceptionHandler(
            errorAttributes,
            (if (resourceProperties.hasBeenCustomized()) resourceProperties else webProperties.resources) as WebProperties.Resources,
            serverProperties.error,
            applicationContext
        )
        exceptionHandler.setViewResolvers(viewResolvers.orderedStream().collect(Collectors.toList()))
        exceptionHandler.setMessageWriters(serverCodecConfigurer.writers)
        exceptionHandler.setMessageReaders(serverCodecConfigurer.readers)
        return exceptionHandler
    }
}

class CustomErrorWebExceptionHandler(
    errorAttributes: ErrorAttributes,
    resources: WebProperties.Resources,
    errorProperties: ErrorProperties,
    applicationContext: ApplicationContext
)  : DefaultErrorWebExceptionHandler(errorAttributes, resources, errorProperties, applicationContext) {

    override fun handle(exchange: ServerWebExchange, throwable: Throwable): Mono&amp;lt;Void&amp;gt; =
        when (throwable) {
            is WebClientRequestException -&amp;gt; handleWebClientRequestException(exchange, throwable)
            is WebClientResponseException -&amp;gt; handleWebClientResponseException(exchange, throwable)
            else -&amp;gt; super.handle(exchange, throwable)
        }

    private fun handleWebClientResponseException(exchange: ServerWebExchange, throwable: WebClientResponseException): Mono&amp;lt;Void&amp;gt; {
        exchange.response.headers.add(&quot;Content-Type&quot;, &quot;application/json&quot;)
        exchange.response.statusCode = throwable.statusCode

        val responseBodyBuffer = exchange
            .response
            .bufferFactory()
            .wrap(throwable.responseBodyAsByteArray)

        return exchange.response.writeWith(Mono.just(responseBodyBuffer))
    }

    private fun handleWebClientRequestException(exchange: ServerWebExchange, throwable: WebClientRequestException): Mono&amp;lt;Void&amp;gt; {
        if (throwable.rootCause is ConnectException) {

            exchange.response.headers.add(&quot;Content-Type&quot;, &quot;application/json&quot;)
            exchange.response.statusCode = HttpStatus.BAD_GATEWAY

            val responseBodyBuffer = exchange
                .response
                .bufferFactory()
                .wrap(ObjectMapper().writeValueAsBytes(customErrorWebException(exchange, HttpStatus.BAD_GATEWAY, throwable.message)))

            return exchange.response.writeWith(Mono.just(responseBodyBuffer))

        } else {
            return super.handle(exchange, throwable)
        }
    }

    private fun customErrorWebException(exchange: ServerWebExchange, status: HttpStatus, message: Any?) =
        CustomErrorWebException(
            Instant.now().toString(),
            exchange.request.path.value(),
            status.value(),
            status.reasonPhrase,
            message,
            exchange.request.id
        )
}

data class CustomErrorWebException(
    val timestamp: String,
    val path: String,
    val status: Int,
    val error: String,
    val message: Any?,
    val requestId: String,
)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사실, 당신은 그 시체를 쉽게 로그인 할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;onError&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;호출:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-kotlin prettyprint-override&quot;&gt;&lt;code&gt;            .doOnError {
                logger.warn { body(it) }
            }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고:&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-kotlin prettyprint-override&quot;&gt;&lt;code&gt;    private fun body(it: Throwable) =
        if (it is WebClientResponseException) {
            &quot;, body: ${it.responseBodyAsString}&quot;
        } else {
            &quot;&quot;
        }
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;500 내부 시스템 오류를 트리거한 WebClient 요청의 세부 정보를 원하는 경우 다음과 같이 DefaultErrorWebExceptionHandler를 재정의합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Spring 기본값은 클라이언트에 오류가 발생했음을 알려주는 것이지만 WebClient 호출 본문을 제공하지 않으므로 디버깅 시 매우 귀중할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-java prettyprint-override&quot;&gt;&lt;code&gt;/**
 * Extends the DefaultErrorWebExceptionHandler to log the response body from a failed WebClient
 * response that results in a 500 Internal Server error.
 */
@Component
@Order(-2)
public class ExtendedErrorWebExceptionHandler extends DefaultErrorWebExceptionHandler {

  private static final Log logger = HttpLogging.forLogName(ExtendedErrorWebExceptionHandler.class);

  public FsErrorWebExceptionHandler(
      ErrorAttributes errorAttributes,
      Resources resources,
      ServerProperties serverProperties,
      ApplicationContext applicationContext,
      ServerCodecConfigurer serverCodecConfigurer) {
    super(errorAttributes, resources, serverProperties.getError(), applicationContext);
    super.setMessageWriters(serverCodecConfigurer.getWriters());
    super.setMessageReaders(serverCodecConfigurer.getReaders());
  }

  /**
   * Override the default error log behavior to provide details for WebClientResponseException. This
   * is so that administrators can better debug WebClient errors.
   *
   * @param request The request to the foundation service
   * @param response The response to the foundation service
   * @param throwable The error that occurred during processing the request
   */
  @Override
  protected void logError(ServerRequest request, ServerResponse response, Throwable throwable) {
    // When the throwable is a WebClientResponseException, also log the body
    if (HttpStatus.resolve(response.rawStatusCode()) != null
        &amp;amp;&amp;amp; response.statusCode().equals(HttpStatus.INTERNAL_SERVER_ERROR)
        &amp;amp;&amp;amp; throwable instanceof WebClientResponseException) {
      logger.error(
          LogMessage.of(
              () -&amp;gt;
                  String.format(
                      &quot;%s 500 Server Error for %s\n%s&quot;,
                      request.exchange().getLogPrefix(),
                      formatRequest(request),
                      formatResponseError((WebClientResponseException) throwable))),
          throwable);
    } else {
      super.logError(request, response, throwable);
    }
  }

  private String formatRequest(ServerRequest request) {
    String rawQuery = request.uri().getRawQuery();
    String query = StringUtils.hasText(rawQuery) ? &quot;?&quot; + rawQuery : &quot;&quot;;
    return &quot;HTTP &quot; + request.methodName() + &quot; \&quot;&quot; + request.path() + query + &quot;\&quot;&quot;;
  }

  private String formatResponseError(WebClientResponseException exception) {
    return String.format(
        &quot;%-15s %s\n%-15s %s\n%-15s %d\n%-15s %s\n%-15s '%s'&quot;,
        &quot;  Message:&quot;,
        exception.getMessage(),
        &quot;  Status:&quot;,
        exception.getStatusText(),
        &quot;  Status Code:&quot;,
        exception.getRawStatusCode(),
        &quot;  Headers:&quot;,
        exception.getHeaders(),
        &quot;  Body:&quot;,
        exception.getResponseBodyAsString());
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;Throwable e&quot; 매개 변수를 WebClientResponseException에 캐스팅한 다음 getResponseBodyAsString():&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    WebClient webClient = WebClient.create(&quot;https://httpstat.us/404&quot;);
    Mono&amp;lt;Object&amp;gt; monoObject = webClient.get().retrieve().bodyToMono(Object.class);
    monoObject.doOnError(e -&amp;gt; {
        if( e instanceof WebClientResponseException ){
            System.out.println(
                &quot;ResponseBody = &quot; + 
                    ((WebClientResponseException) e).getResponseBodyAsString() 
            );
        }
    }).subscribe();
    // Display : ResponseBody = 404 Not Found
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/44593066/spring-webflux-webclient-get-body-on-error&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>Spring</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/719</guid>
      <comments>https://fileupload.tistory.com/719#entry719comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:42:08 +0900</pubDate>
    </item>
    <item>
      <title>Sentry 디버깅이 추가되었습니다. 긴 문자열이 정의되지 않음</title>
      <link>https://fileupload.tistory.com/718</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Sentry 디버깅이 추가되었습니다. 긴 문자열이 정의되지 않음&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부트스트랩 구성 요소가 있는 Angular 1.x 앱을 만들고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;최근 Sentry 디버깅을 사이트에 추가했는데 방금 다음 오류가 발생했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;'PAPADDINGXXPADDINGPADD'&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;INGXX 패딩패딩&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;INGXX 패딩패딩&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;INGXX 패딩패딩&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;INGXX 패딩패딩&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;'INGX'가 정의되지 않았습니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;브라우저 = IE 11.0&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;디바이스 = 기타&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;레벨 = 오류&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로거 = 자바스크립트&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;os = 윈도우 8.1&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Mozilla/5.0(윈도우즈 NT 6.3; WOW64; Trident/7.0; .NET4.0)&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;E; .NET4.0C; .&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;NET CLR 3.5.30729; .&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;NET CLR 2.0.50727; .&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Gecko와 같은 NET CLR 3.0.30729; InfoPath.3; MDDCJS; rv:11.0)&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 트위터에서 몇 가지 참고문헌을 찾았지만 다른 것은 없었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이거 본 사람?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이거 어떻게 고쳐요?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 아마도 악성코드가 작동하는 것으로, 대부분 윈도우 플랫폼에서 보고됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;질문, 댓글, 인터넷에서 볼 수 있듯이, 모두 윈도우 시스템용으로 보고됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;악성 활동 기록/분석/보고 서비스(아래 참조 링크 참조)에 따르면 악성 프로그램은 파일을 일련의 &quot;PADDINGPADD&quot;로 기록/종료합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;INGXX&quot; 문자열입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 사이트의 추출된 문자열 섹션에서 검색&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.hybrid-analysis.com/sample/90fa224a030dc8c20e31bc5a6bd02885605e36d01646f40151ba23741830efb7?environmentId=1&quot; rel=&quot;noreferrer&quot; papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://www.hybrid-analysis.com/sample/90fa224a030dc8c20e31bc5a6bd02885605e36d01646f40151ba23741830efb7?environmentId=1&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://totalhash.cymru.com/analysis/?d88d47519bcc49b5c3b345e98e87d20b8928a2c3&quot; rel=&quot;noreferrer&quot; papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://totalhash.cymru.com/analysis/ ?d88d47519bcc49b5c3b345e98e87d20b8928a2c3&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.reverse.it/sample/8cb0a45f5a071c0f521a8afb62335e23fdcc3a3e06bac9a392bff1a89b40cf8c?environmentId=100&quot; rel=&quot;noreferrer&quot; papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://www.reverse.it/sample/8cb0a45f5a071c0f521a8afb62335e23fdcc3a3e06bac9a392bff1a89b40cf8c?environmentId=100&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.reverse.it/sample/3f62bec0770de977b84b61c4f72813120f8d6fb6eb4caf96dc7e8e7b4676e444?environmentId=100&quot; rel=&quot;noreferrer&quot; papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://www.reverse.it/sample/3f62bec0770de977b84b61c4f72813120f8d6fb6eb4caf96dc7e8e7b4676e444?environmentId=100&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.zscaler.com/blogs/research/current-trojan-ambler-activity&quot; rel=&quot;noreferrer&quot; papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://www.zscaler.com/blogs/research/current-trojan-ambler-activity&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://malwr.com/analysis/MzIyYmFkMWM1M2FmNDVlM2JlZjBmYmYwZmM4NDIwMTI/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://malwr.com/analysis/MzIyYmFkMWM1M2FmNDVlM2JlZjBmYmYwZmM4NDIwMTI/&lt;/font&gt;&lt;/a&gt; &lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 추측에 근거한 대답입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 저는 이 문제를 이해하기 위한 링크의 리소스 모음이 될 것이라고 생각합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것을 자유롭게 개선하세요!&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://www.hybrid-analysis.com/sample/90fa224a030dc8c20e31bc5a6bd02885605e36d01646f40151ba23741830efb7?environmentId=1&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;19-1&quot;&gt;rtfn.exe&lt;/a&gt;의 멀웨어 분석&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://social.msdn.microsoft.com/Forums/vstudio/en-US/65abb72a-9d4f-4881-a534-6f75c4b8b498/unknown-error-in-visual-studio-express-2012-for-web?forum=vsdebug&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;20-0&quot;&gt;Visual Studio 오류&lt;/a&gt; :: 원클릭 amazon 도구 모음으로 인해 오류가 발생했습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://social.msdn.microsoft.com/Forums/vstudio/en-US/1e3bc7a2-2de0-4fa0-8ebe-0d02dc7256c8/executable-size-versus-object?forum=vcgeneral&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;팽창된 애플리케이션 크기&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://www.adventuregamestudio.co.uk/wiki/Releasing_a_game_on_iOS&quot; papago-id=&quot;23-0&quot; rel=&quot;nofollow noreferrer&quot;&gt;다양한 플랫폼을 위한 게임 출시&lt;/a&gt; :: 다음과 같은 내용을 담고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;  &lt;/font&gt;&lt;/font&gt;&lt;blockquote&gt; 
   &lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ac2game.dat은 단지 당신의 window.exe의 이름이 바뀌었을 뿐입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;육각형 편집기에서 열고 &quot;PADDING&quot; 문자열을 검색하면 불필요한 실행 가능 부분을 잘라낼 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;PADDINGXX&quot;를 잠시 반복한 다음 &quot;CLIB&quot;를 반복하는 텍스트 블록이 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;CLIB 전에 모든 것을 잘라냅니다(단, CLIB는 그대로 두십시오).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하면 공간이 조금 절약됩니다.&lt;/font&gt;&lt;/p&gt; 
  &lt;/blockquote&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.progtown.com/topic182588-extraction-from-resources-dll-with-resources.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;dll을 사용하여 리소스&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://www.rohitab.com/discuss/topic/34694-paddingxx/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실행 파일 끝에 4줄 패딩XX(PADDINGXX)&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://infobot.rikers.org/%23wowuidev/20080708.html.gz&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;흥미로운 IRC 로그&lt;/font&gt;&lt;/a&gt; 
  &lt;blockquote&gt; 
   &lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;PADDINGXXPADDINGXX&quot;의 좋은 1.8k 블록을 항상 합산하는 것이 좋습니다.&lt;/font&gt;&lt;/p&gt; 
  &lt;/blockquote&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 모든 것이 저로 하여금 &lt;strong papago-id=&quot;28-1&quot;&gt;메모리가 할당되지만 사용&lt;/strong&gt;되지 않을 때 &lt;strong papago-id=&quot;28-1&quot;&gt;이러한&lt;/strong&gt; 현상이 &lt;strong papago-id=&quot;28-1&quot;&gt;발생&lt;/strong&gt;한다고 믿게 만들었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 당신의 경우 IE 스파게티 코드가 이 중 일부를 감지했을 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/37928917/added-sentry-debugging-getting-long-string-as-undefined&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>AngularJS</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/718</guid>
      <comments>https://fileupload.tistory.com/718#entry718comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:41:56 +0900</pubDate>
    </item>
    <item>
      <title>문자열에 숫자가 포함되어 있는지 확인하는 방법</title>
      <link>https://fileupload.tistory.com/717</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자열에 숫자가 포함되어 있는지 확인하는 방법&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자열에 숫자가 포함되어 있는지 확인해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;아무 번호나.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자열이 숫자인지 아닌지가 아니라 문자열이 숫자를 포함하는 경우입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예:&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;'test' = 숫자 없음.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;'test2' =에 숫자가 포함되어 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;http://psoug.org/reference/regexp.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;5-1&quot;&gt;정규식&lt;/a&gt; 사용:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT *
FROM test
WHERE REGEXP_LIKE(testcol, '[[:digit:]]');
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;정규식 사용 안 함:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT *
FROM test
WHERE testcol LIKE '%0%'
    OR testcol LIKE '%1%'
    OR testcol LIKE '%2%'
    OR testcol LIKE '%3%'
    OR testcol LIKE '%4%'
    OR testcol LIKE '%5%'
    OR testcol LIKE '%6%'
    OR testcol LIKE '%7%'
    OR testcol LIKE '%8%'
    OR testcol LIKE '%9%'
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자열에 숫자가 포함되어 있는지 탐지하는 데 사용하는 기술은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select LAST_NAME, 'contains a number'
  FROM names
 where translate(LAST_NAME, '0123456789', '') &amp;lt;&amp;gt; LAST_NAME
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 숫자를 빈 문자열로 변환함으로써 작동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자열이 동일하게 유지되는 경우 숫자를 포함할 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 기법은 또한 문자열이 모두 숫자인지를 테스트하는 데 사용됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select TEL_NUMBER, 'is all numbers'
  FROM names
 where trim(translate(TEL_NUMBER, '-0123456789', '')) = ''
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;전화번호에는 대시가 포함되어 있습니다. 왜냐하면 전화번호에는 대시가 포함되어 있기 때문입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 regex를 사용해보겠습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;좋아요:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;select regexp_instr('%[0-9]%',@str1) from table_name;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;건배 --조크&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;SQL 기능이 제한적이기 때문에 NetSuite 저장 검색에서 REGEXP_INSTR을 사용하는 경우가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;숫자가 없으면 0을 반환하거나 문자열에 있는 첫 번째 숫자의 시작 위치를 반환합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;REGEXP_INSTR(my_var, '[[:digit:]]')
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 예제에서는 0을 반환합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;REGEXP_INSTR('test', '[[:digit:]]')
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 예제에서는 숫자를 찾았기 때문에 0보다 큰 숫자를 반환합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;REGEXP_INSTR('test2', '[[:digit:]]')
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/11341492/how-do-i-check-if-a-string-contains-a-number&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>Oracle</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/717</guid>
      <comments>https://fileupload.tistory.com/717#entry717comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:41:49 +0900</pubDate>
    </item>
    <item>
      <title>스프링 부트 스타터에서 아티팩트 ID 및 버전 가져오기</title>
      <link>https://fileupload.tistory.com/716</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스프링 부트 스타터에서 아티팩트 ID 및 버전 가져오기&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 현재 실행 중인 애플리케이션에 대한 메타 데이터가 포함된 Restful 웹 서비스를 호스팅할 Spring Boot Starter를 개발하고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;mainfest 파일에서 artifactId와 versionId를 추출하는 데 어려움을 겪고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 문제는 메인 테스트 어플리케이션 이전에 자동 구성 클래스가 로드되고 있어서 매니페스트를 아직 검색할 수 없는 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;문제에 대해 잘못된 각도에서 접근하는 것인지에 대한 제 논리가 올바른지 확신할 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 원래 설정을 위해 다음 &lt;a href=&quot;http://www.baeldung.com/spring-boot-custom-starter&quot; rel=&quot;noreferrer&quot; papago-id=&quot;3-1&quot;&gt;자습서&lt;/a&gt;를 따라 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이로써 저는 3개의 프로젝트를 분리하게 되었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;Generic Spring Services with no context AutoConfiguration project for these services Spring Boot starter&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;최종 결과로 스타터와 테스트 프로젝트를 짝지었습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 maven은 manifest 파일을 생성하기 위해 spring boot과 함께 사용되고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;Implementation-Title: MyExampleProjectWithCustomStarter Implementation-Version: 0.0.1-SNAPSHOT Archiver-Version: Plexus Archiver Built-By: mcf Implementation-Vendor-Id: com.coolCompany Spring-Boot-Version: 1.5.4.RELEASE Implementation-Vendor: Pivotal Software, Inc. Main-Class: org.springframework.boot.loader.JarLauncher Start-Class: com.coolcompany.SpringBootExampleApplication Spring-Boot-Classes: BOOT-INF/classes/ Spring-Boot-Lib: BOOT-INF/lib/ Created-By: Apache Maven 3.5.0 Build-Jdk: 1.8.0_131 Implementation-URL: http://someurl&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 일반 서비스 패키지에서 예제 프로젝트의 매니페스트 파일을 찾으려 하면 파일을 찾을 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;  private String getApplicationVersion(String applicationName, List&amp;lt;Attributes&amp;gt; manifests) {
    String unknownVersion = &quot;0.0.0-UNKNOWN&quot;;

    for (Attributes attr : manifests) {
      String title = attr.getValue(IMPL_TITLE);
      String version = attr.getValue(IMPL_VERSION);
      if (version != null) {
        if (applicationName.equalsIgnoreCase(title)) {
          return title + ' ' + version;
        }
      }
    }
    log.warn(
        &quot;Could not find MANIFEST file with '&quot; + applicationName + &quot;' as Implementation-Title.&quot;
        + &quot; Meta-API will return buildVersion '&quot; + unknownVersion + &quot;'.&quot;);

    return applicationName + ' ' + unknownVersion;
  }

  private List&amp;lt;Attributes&amp;gt; loadManifestFiles() {
    List&amp;lt;Attributes&amp;gt; manifests = new ArrayList&amp;lt;&amp;gt;();
    try {
      Enumeration&amp;lt;URL&amp;gt; resources =
          Thread.currentThread().getContextClassLoader().getResources(&quot;/META-INF/MANIFEST.MF&quot;);
      while (resources.hasMoreElements()) {
        URL url = resources.nextElement();
        try (InputStream is = url.openStream()) {
          manifests.add(new Manifest(is).getMainAttributes());
          System.out.println(&quot;Manifest size:&quot; + manifests.size());
        } catch (IOException e) {
          log.error(&quot;Failed to read manifest from &quot; + url, e);
        }
      }
    } catch (IOException e) {
      log.error(&quot;Failed to get manifest resources&quot;, e);
    }
    return manifests;
  }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 매니페스트 구현-제목:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;Spring Boot Web Starter Spring Boot Starter Spring Boot Spring Boot AutoConfigure Spring Boot Logging Starter null null jcl-over-slf4j null log4j-over-slf4j null Spring Boot Tomcat Starter Apache Tomcat Apache Tomcat Apache Tomcat hibernate-validator null JBoss Logging 3 ClassMate jackson-databind Jackson-annotations Jackson-core spring-web spring-aop spring-beans spring-context spring-webmvc spring-expression Spring Boot Actuator Starter Spring Boot Actuator null ** MyCustom-spring-boot-starter ** MyGenericSpringService null null null Metrics Core JVM Integration for Metrics null null Jackson datatype: JSR310 ** MyService-spring-boot-autoconfigure slf4j-api spring-core &lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;** 내 예제 프로젝트 누락&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자 지정 스타터 사용&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;매니페스트 레코드 수: 44&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;많은 노력 끝에 놀랍도록 간단한 답을 찾았습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;스프링 부트 액츄에이터가 정보를 얻는 방법입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Spring Boot Maven 플러그인은 build-info 목표를 갖추고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 목표가 메인 프로젝트에서 트리거되는 한 스프링에는 빌드 속성 클래스가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;spring-boot-maven-plugin&amp;lt;/artifactId&amp;gt;
                &amp;lt;executions&amp;gt;
                    &amp;lt;execution&amp;gt;
                        &amp;lt;id&amp;gt;build-info&amp;lt;/id&amp;gt;
                        &amp;lt;goals&amp;gt;
                            &amp;lt;goal&amp;gt;build-info&amp;lt;/goal&amp;gt;
                        &amp;lt;/goals&amp;gt;
                    &amp;lt;/execution&amp;gt;
                &amp;lt;/executions&amp;gt;
            &amp;lt;/plugin&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같이 스타터의 속성에 액세스할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Autowired
BuildProperties buildProperties;

...
buildProperties.getArtifact();
buildProperties.getVersion();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;플러그인에서 추가 속성을 지정할 수도 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 내용은 플러그인 설명서 참조: https://docs.spring.io/spring-boot/docs/current/maven-plugin/build-info-mojo.html&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;불행히도 올바른 매니페스트에 액세스할 수 없는 이유를 완전히 이해할 수 없었지만, 이 문제를 해결하려는 다른 사람에게 도움이 될 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 대답은 완전히 맞습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;메이븐 대신 그래들을 사용할 경우 다른 사람들이 이 질문을 찾을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;빌드 정보를 생성하는 것은 이것을 당신의 것에 추가하는 것만큼 간단합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;build.gradle&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;plugins {
    id 'org.springframework.boot' version '&amp;lt;your-boot-version&amp;gt;.RELEASE'
}

// ...    

springBoot {
    buildInfo()
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자 지정 속성을 전달하려는 경우:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;springBoot {
    buildInfo {
        properties {
            additional = [
                'property.name': 'property value',
                'other.property': 'different.value'
            ]
        }
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그럼 자바 코드에서 사용하는 것은 사용하는 것과 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;BuildProperties&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 플러그인에 대한 자세한 내용은 이 &lt;a href=&quot;https://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/html/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;4-1&quot;&gt;안내서&lt;/a&gt;에서 확인할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/44786871/getting-artifactid-and-version-in-spring-boot-starter&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>spring-boot</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/716</guid>
      <comments>https://fileupload.tistory.com/716#entry716comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:41:43 +0900</pubDate>
    </item>
    <item>
      <title>치명적 오류: iostream:GCC를 사용하여 C 프로그램을 컴파일할 때 이러한 파일이나 디렉터리가 없습니다.</title>
      <link>https://fileupload.tistory.com/715</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;치명적 오류: iostream:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;GCC를 사용하여 C 프로그램을 컴파일할 때 이러한 파일이나 디렉터리가 없습니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 다중 스레드 병합 정렬 C 프로그램을 컴파일하려는 경우 다음 오류가 발생하는 이유는 무엇입니까?&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;ap@sharifvm:~/forTHE04a$ gcc -g -Wall -o mer mer.c -lpthread
mer.c:4:20: fatal error: iostream: No such file or directory
 #include &amp;lt;iostream&amp;gt;
                    ^
compilation terminated.
ap@sharifvm:~/forTHE04a$ gcc -g -Wall -o mer mer.c -lpthread
mer.c:4:22: fatal error: iostream.h: No such file or directory
 #include &amp;lt;iostream.h&amp;gt;
                      ^
compilation terminated.
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 프로그램:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;pthread.h&amp;gt;
#include &amp;lt;iostream&amp;gt;
using namespace std;

#define N 2  /* # of thread */

int a[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};  /* target array */

/* structure for array index
 * used to keep low/high end of sub arrays
 */
typedef struct Arr {
    int low;
    int high;
} ArrayIndex;

void merge(int low, int high)
{
        int mid = (low+high)/2;
        int left = low;
        int right = mid+1;

        int b[high-low+1];
        int i, cur = 0;

        while(left &amp;lt;= mid &amp;amp;&amp;amp; right &amp;lt;= high) {
                if (a[left] &amp;gt; a[right])
                        b[cur++] = a[right++];
                else
                        b[cur++] = a[right++];
        }

        while(left &amp;lt;= mid) b[cur++] = a[left++];
        while(right &amp;lt;= high) b[cur++] = a[left++];
        for (i = 0; i &amp;lt; (high-low+1) ; i++) a[low+i] = b[i];
}

void * mergesort(void *a)
{
        ArrayIndex *pa = (ArrayIndex *)a;
        int mid = (pa-&amp;gt;low + pa-&amp;gt;high)/2;

        ArrayIndex aIndex[N];
        pthread_t thread[N];

        aIndex[0].low = pa-&amp;gt;low;
        aIndex[0].high = mid;

        aIndex[1].low = mid+1;
        aIndex[1].high = pa-&amp;gt;high;

        if (pa-&amp;gt;low &amp;gt;= pa-&amp;gt;high) return 0;

        int i;
        for(i = 0; i &amp;lt; N; i++) pthread_create(&amp;amp;thread[i], NULL, mergesort, &amp;amp;aIndex[i]);
        for(i = 0; i &amp;lt; N; i++) pthread_join(thread[i], NULL);

        merge(pa-&amp;gt;low, pa-&amp;gt;high);

        //pthread_exit(NULL);
        return 0;
}

int main()
{
        ArrayIndex ai;
        ai.low = 0;
        ai.high = sizeof(a)/sizeof(a[0])-1;
        pthread_t thread;

        pthread_create(&amp;amp;thread, NULL, mergesort, &amp;amp;ai);
        pthread_join(thread, NULL);

        int i;
        for (i = 0; i &amp;lt; 10; i++) printf (&quot;%d &quot;, a[i]);
        cout &amp;lt;&amp;lt; endl;

        return 0;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;둘 다 아니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;iostream&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도 아니다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;iostream.h&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;표준 C 헤더 파일입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신의 코드는 C++가 되어야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;iostream&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 유효한 헤더입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 C++ 컴파일러를 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;clang++&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;g++&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.cpp&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일 확장자)를 입력합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는, 이 프로그램은 C에서 사용할 수 있는 컨스트럭트를 대부분 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;전체 프로그램을 C 컴파일러로 변환하는 것은 충분히 쉽습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;간단히 제거&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;using namespace std;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 교체합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cout &amp;lt;&amp;lt; endl;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;와 함께&lt;/font&gt;&lt;/font&gt;&lt;code&gt;putchar('\n');&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;... C99, C11 또는 C18(예: C99, C11 또는 C18)을 사용하여 컴파일하는 것을 권장합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;gcc -std=c99&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;clang -std=c18&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;등)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신이 다음과 관련된 더 간단한 문제를 다루고 있다는 것을 깨달은 후에 새로운 질문을 올린 것 같습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;size_t&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 당신이 그렇게 해주어서 기쁩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아무튼 여러분들은.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.c&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;소스 파일, 그리고 대부분의 코드는 C 표준에 따라 보입니다. 단, 그것은 제외합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;using namespace std;&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C++ 표준의 내장 기능에 대한 C 등가&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#include&amp;lt;iostream&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;을 통해 이용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#include&amp;lt;stdio.h&amp;gt;&lt;/code&gt; &lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;교체하다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;와 함께&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 삭제&lt;/font&gt;&lt;/font&gt;&lt;code&gt;using namespace std;&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;와 함께&lt;/font&gt;&lt;/font&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;벗으면 당신은 C 표준 대안이 필요할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cout &amp;lt;&amp;lt; endl;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 에 의해 할 수 있는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;printf(&quot;\n&quot;);&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면&lt;/font&gt;&lt;/font&gt;&lt;code&gt;putchar('\n');&lt;/code&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 가지 옵션 중에서&lt;/font&gt;&lt;/font&gt;&lt;code&gt;printf(&quot;\n&quot;);&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내가 관찰한 것처럼 더 빨리 작동합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;30&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용시&lt;/font&gt;&lt;/font&gt;&lt;code&gt;printf(&quot;\n&quot;);&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;31&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대신 위의 암호로&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cout&amp;lt;&amp;lt;endl;&lt;/code&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;$ time ./thread.exe
1 2 3 4 5 6 7 8 9 10

real    0m0.031s
user    0m0.030s
sys     0m0.030s
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;32&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용시&lt;/font&gt;&lt;/font&gt;&lt;code&gt;putchar('\n');&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;33&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대신 위의 암호로&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cout&amp;lt;&amp;lt;endl;&lt;/code&gt;&lt;/p&gt; &lt;pre&gt;&lt;code&gt;$ time ./thread.exe
1 2 3 4 5 6 7 8 9 10

real    0m0.047s
user    0m0.030s
sys     0m0.030s
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;34&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Cygwin과 함께 컴파일됨&lt;/font&gt;&lt;/font&gt;&lt;code&gt;gcc (GCC) 4.8.3&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;버전&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;평균 10개 이상의 샘플 결과(&lt;em papago-id=&quot;38-1&quot;&gt;15분 소요)&lt;/em&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;동일한 오류에 직면했습니다 : -&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;fatal error: iostream: No such file or directory
 #include &amp;lt;iostream&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;36&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;시간이 좀 흐른 후에, 저는 여기서 아주 초보적인 실수를 하고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;사실 나는 내 프로그램 파일을 확장자를 주면서 실행하고 있었습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&quot;.c&quot;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;37&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;only..... :-( 그러니 파일을 적절한 확장명으로 저장하고 있는지 확인해 보세요...&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 경우 C++ 프로그램 파일의 .cpp가 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러니 한 번 확인해보시면 괜찮을 겁니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 이제 먼저 MinGW를 다운받아서 env 변수에 추가했는지 확인합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;38&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용법을 점검하다&lt;/font&gt;&lt;/font&gt;&lt;code&gt;g++ --version&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;39&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;cmd/단말기에&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;40&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 아직도 꼬불꼬불한 선들이 나타나면 설치합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;c++ Intellisense&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;41&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;extension 당신은 대부분 오류를 얻게 될 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;c_cpp_properties.json&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;42&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컴파일러 경로가 올바르지 않을 수 있기 때문에 파일.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 당신이 해야 할 일은 정확한 길을 놓는 것이고 그러면 그 꼬불꼬불한 선들이 사라질 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/30543286/fatal-error-iostream-no-such-file-or-directory-in-compiling-c-program-using-gc&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>c</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/715</guid>
      <comments>https://fileupload.tistory.com/715#entry715comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:41:35 +0900</pubDate>
    </item>
    <item>
      <title>ui 부트스트랩 모드의 컨트롤러 '정의되지 않음'</title>
      <link>https://fileupload.tistory.com/714</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ui 부트스트랩 모드의 컨트롤러 '정의되지 않음'&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ui-bootstrap 0.6의 modal directive를 사용하려고 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 ui-bootstrap 페이지의 작동 기본 플렁커입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://plnkr.co/edit/JGBiBSeRqOnwRhYA9py8?p=preview&quot; rel=&quot;noreferrer&quot; papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://plnkr.co/edit/JGBiBSeRqOnwRhYA9py8?p=preview&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제, 저는 코딩 스타일을 각시드 스타일에 맞게 만들어 이를 하나의 앱에 포함시키려고 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://plnkr.co/edit/Y59rwlcNpQdijKtmjOPy?p=preview&quot; rel=&quot;noreferrer&quot; papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;http://plnkr.co/edit/Y59rwlcNpQdijKtmjOPy?p=preview&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;angular.module('MyModal', ['ui.bootstrap', 'MyModal.controllers']);

angular.module('MyModal.controllers', [])
    .controller('ModalDemoCtrl', [ '$scope', '$modal', '$log', function ($scope, $modal, $log) {
    $scope.items = ['item1', 'item2', 'item3'];

    $scope.open = function () {
        var modalInstance = $modal.open({
            templateUrl: 'myModalContent.html',
            controller: ModalInstanceCtrl,
            resolve: {
                items: function () {
                return $scope.items;
                }
            }
        });

        modalInstance.result.then(function (selectedItem) {
            $scope.selected = selectedItem;
        }, function () {
            $log.info('Modal dismissed at: ' + new Date());
        });
    };
}])
.controller('ModalInstanceCtrl', [ '$scope', '$modalInstance', 'items', function ($scope, $modalInstance, items) {
    $scope.items = items;
    $scope.selected = {
        item: $scope.items[0]
    };

    $scope.ok = function () {
        $modalInstance.close($scope.selected.item);
    };

    $scope.cancel = function () {
        $modalInstance.dismiss('cancel');
    };
}]);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 그것은 오류를 주고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ReferenceError: ModalInstanceCtrl is not defined&lt;/code&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;컨트롤러를 정의하는 이 방법을 사용하여 어떻게 이 작업을 만들 수 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;경로 정의, 지시사항 등과 같이 컨트롤러 이름을 &lt;em papago-id=&quot;8-1&quot;&gt;String&lt;/em&gt;으로 지정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var modalInstance = $modal.open({
        templateUrl: 'myModalContent.html',
        controller: 'ModalInstanceCtrl',
        resolve: {
            items: function () {
            return $scope.items;
            }
        }
    });
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 대답이 암시하는 대로 따옴표를 사용하거나 문서의 예제와 같이 수행하여 변수를 정의할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;var ModalInstanceCtrl = function ($scope, $modalInstance, items) { ... }&lt;/code&gt;&lt;/p&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/19432592/ui-bootstrap-modals-controller-is-not-defined&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>AngularJS</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/714</guid>
      <comments>https://fileupload.tistory.com/714#entry714comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:41:27 +0900</pubDate>
    </item>
    <item>
      <title>연락처 양식 7 수신자의 동적 수</title>
      <link>https://fileupload.tistory.com/713</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;연락처 양식 7 수신자의 동적 수&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 메인과 &quot;기타 수신자&quot;라는 두 개의 필드 집합을 핵심으로 하는 양식을 작성하고 있습니다. &quot;기타 수신자&quot; 필드 집합의 끝에는 &quot;다른 수신자 추가&quot; 링크가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기 필요한 사람이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;3-0&quot;&gt;주 수신자:&lt;/strong&gt; 모든 것&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;4-0&quot;&gt;기타 수신인:&lt;/strong&gt; &quot;기타 수신인&quot; 필드 집합;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;5-0&quot;&gt;후속 수신인:&lt;/strong&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;각 필드 집합&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지금까지 &lt;a href=&quot;http://contactform7.com/docs/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;6-1&quot;&gt;Documentation&lt;/a&gt;을 살펴보았지만 거기서 운이 별로 없었고, 기대했던 것도 아닙니다.&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;h3 papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편집&lt;/font&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 이것이 명확하지 않다고 생각하기 때문에 문맥이 무엇인지 조금 더 명확하게 말씀드리겠습니다. 저의&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;form&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;는 여러 사람을 등록할 수 있는 등록입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 필드 중 하나는 &quot;당신의 이메일&quot;로 표시됩니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;한 번에 한 명 이상 등록이 가능하기 때문에 중복해서 등록해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;fieldset&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;당신의 이메일&quot;을 포함하고 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;hr&gt; 
&lt;h3 papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편집2&lt;/font&gt;&lt;/h3&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;명확한 설명을 돕기 위해, 우리가 여름 캠프에 아이들을 등록한다고 상상해 보세요.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;첫번째&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;fieldset&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부모님의 청구 정보라고 하면 일반적이고, 두 번째는&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;fieldset&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아이의 정보입니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부모는 단일 항목을 작성할 수 있어야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;form&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;부모가 원하는 만큼 동적으로 자녀를 추가할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;각각의 아이들의 집에서&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;fieldset&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 이메일이 필요하고 이 아이와 관련된 정보를 받습니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; 이메일은 다음과 유사합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Hello {children's name},

You've been registered to StackOverflow Summer Camp. Here's the information you need to know:

[...]

Thanks for being a good sport!
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도움이 되길 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이와 같은 특정 사용 사례가 있는 경우 주변 관련 플러그인에 기능을 추가하면 종종 불만이 발생합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇기는 하지만, 특정 플러그인이나 접근 방식과 결혼을 할 때가 있고, 그 위에 기반을 두기만 하면 되는 경우가 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그 주의사항을 무시하고 연락처 양식 7에 대한 &lt;strong papago-id=&quot;20-1&quot;&gt;새로운&lt;/strong&gt; 필드 유형을 &lt;strong papago-id=&quot;20-1&quot;&gt;만드는&lt;/strong&gt; 각도에서 접근해야 한다고 생각합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하면 필드의 HTML, 데이터 유효성 검사 등을 렌더링할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 나중에 다른 답변에 대한 의견에서 언급했듯이 DB 저장 및 알림 전송을 위한 시작 지점을 제공할 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 접근 방식을 실행에 옮깁니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://i.stack.imgur.com/aVf1C.gif&quot; rel=&quot;nofollow noreferrer&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/aVf1C.gif&quot; alt=&quot;Testing CF7 Duplication&quot;&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;새 필드 유형이 호출됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;emailplus&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 그리고 당신은 그것을 다음과 같은 형태로 포함시킵니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;cf7-duplicable-recipients&quot;&amp;gt;
    &amp;lt;label&amp;gt;Main Recipient (required)&amp;lt;/label&amp;gt;
    [emailplus emails]
    [submit &quot;Sign Up&quot;]
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 양식 설정의 &quot;메일&quot; 패널 아래 수신인을 다음과 같이 설정했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;[emails]&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;emailsplus&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;필드가 수신자로 설정되고 클래스는 기본 wpcf7 동작을 재정의하고 메일을 의 각 값으로 보냅니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;email&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;array, 메시지 본문의 [emails] 자리 표시자를 이메일 단위로 대체합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;emailplus&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;fieldtype은 클래스에서 캡슐화되며 자유롭게 주석을 달게 됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;?php

class WPCF7_Duplicable_Email
{
    /**
     * The emails this form's field is addressed to
     *
     * @var array
     */
    public $emails = array();

    /**
     * The name of the tag bearing the emailplus type
     *
     * @var string
     */
    public $tag_name;

    /**
     * Instantiate the class &amp;amp; glom onto the wpcf7 hooks
     *
     * @return void
     */
    public function __construct()
    {
        add_action('wpcf7_init', array($this, 'add_emailplus_tag'));
        add_action('wpcf7_form_tag', array($this, 'assign_values_to_field'));
        add_filter('wpcf7_validate_emailplus', array($this, 'validate'), 2);
        add_action('wpcf7_before_send_mail', array($this, 'send_email'));
        add_action('wp_enqueue_scripts', array($this, 'emailplus_scripts'));
    }

    /**
     * Add our the [emailplus __YOUR_FIELD_NAME__] shortcode for use in wpcf7 forms.
     *
     * @uses wpcf7_add_shortcode
     *
     * @return void
     */
    public function add_emailplus_tag()
    {
        wpcf7_add_shortcode(
            array('emailplus'),
            array($this, 'shortcode_handler'),
            true
        );
    }

    /**
     * Renders the HTML for the [emailplus] shortcode
     *
     * Referenced from wpcf7_text_shortcode_handler in wp-content/plugins/contact-form-7/modules/text.php
     *
     * @param array $tag The data relating to the emailplus form field.
     *
     * @uses wpcf7_get_validation_error
     * @uses wpcf7_form_controls_class
     *
     * @return string
     */
    public function shortcode_handler(array $tag) {
        $tag = new WPCF7_Shortcode($tag);

        if (true === empty($tag-&amp;gt;name)) {
            return '';
        }

        $validation_error = wpcf7_get_validation_error($tag-&amp;gt;name);
        $class            = wpcf7_form_controls_class($tag-&amp;gt;type);

        if ($validation_error) {
            $class .= ' wpcf7-not-valid';
        }

        $atts = array(
            'class'        =&amp;gt; $tag-&amp;gt;get_class_option($class),
            'id'           =&amp;gt; $tag-&amp;gt;get_id_option(),
            'tabindex'     =&amp;gt; $tag-&amp;gt;get_option('tabindex', 'int', true),
            'aria-invalid' =&amp;gt; $validation_error ? 'true' : 'false',
            'type'         =&amp;gt; 'email',
            'name'         =&amp;gt; $tag-&amp;gt;name.'[]', // &amp;lt;-- Important! the trailing [] Tells PHP this is an array of values
            'value'        =&amp;gt; $tag-&amp;gt;get_default_option()
        );

        $atts = wpcf7_format_atts($atts);

        $html = sprintf(
            '&amp;lt;div class=&quot;emailplus-wrapper %1$s&quot;&amp;gt;&amp;lt;input %2$s /&amp;gt;%3$s&amp;lt;/div&amp;gt;',
            sanitize_html_class($tag-&amp;gt;name),
            $atts,
            $validation_error
        );

        // We identify the container that will hold cloned fields with the [data-wpcf7-duplicable-email] attr
        return '&amp;lt;div class=&quot;wpcf7-form-control-wrap %1$s&quot; data-wpcf7-duplicable-email&amp;gt;'.$html.'&amp;lt;/div&amp;gt;';
    }

    /**
     * Validates the value of the emailplus tag.
     *
     * Must be handled separately from other text-based form inputs,
     * since the submitted POST value is an array.
     *
     * We can safely assume emailplus while creating the WPCF7_Shortcode,
     * because we know we hooked this function onto 'wpcf7_validate_emailplus'
     *
     * @uses wpcf7_is_email
     * @uses WPCF7_Validation::invalidate
     *
     * @param WPCF7_Validation $result The validation helper class from wpcf7.
     * @param array            $tag    The array of values making up our emailplus tag
     *
     */
    public function validate(WPCF7_Validation $result, $tag)
    {
        $tag = new WPCF7_Shortcode(
            array(
                'basename' =&amp;gt; 'emailplus',
                'name' =&amp;gt; $this-&amp;gt;tag_name,
                'raw_values' =&amp;gt; $this-&amp;gt;emails
            )
        );

        // Check each value of the form field.
        // Emails must be validated individually.
        foreach($tag-&amp;gt;raw_values as $email) {
            if (false === wpcf7_is_email($email)) {
                $result-&amp;gt;invalidate($tag, wpcf7_get_message('invalid_email'));
            }
        }

        return $result;
    }

    /**
     * For completeness' sake, manually assign the value to the emailplus fieldtype.
     *
     * Wpcf7 doesn't know how to treat our fieldtype's value by default.
     *
     * As a side effect, this sets the email addresses that are up for delivery.
     *
     * @param array $scanned_tag The tag that wpcf7 is scanning through, and processing.
     *
     * @return $array;
     */
    public function assign_values_to_field($scanned_tag)
    {
        if ($scanned_tag['type'] !== 'emailplus') {
            return $scanned_tag;
        }

        $this-&amp;gt;tag_name = $scanned_tag['name'];

        if (key_exists($scanned_tag['name'], $_POST)) {
            // Stores the emails on a class property for use later.
            $this-&amp;gt;emails = $_POST[$scanned_tag['name']];
            $scanned_tag['raw_values'] = $this-&amp;gt;emails;
            $scanned_tag['values']     = $this-&amp;gt;emails;
        }

        return $scanned_tag;
    }

    /**
     * Performs a substitution on the emailplus field's fieldname, on a per-value basis.
     *
     * Ex. in two parts
     *  1 - The shortcode [emailsplus emails] renders into &amp;lt;input type=&quot;email&quot; name=&quot;emails[]&quot; value=&quot;&quot; &amp;gt;
     *      Which the user clones and submits, processing into something like
     *      ['test1@gmail.com', 'test2@gmail.com'].
     *  2 - The user has set [emails] as the recipient in the &quot;mail&quot; panel for the form.
     *
     * Because wpcf7 isn't aware of how to process a field w/ multiple values when emailing,
     * we loop over the values of [emails], replace the tag, and invoke WPCF7_Mail::send()
     * for each value.
     *
     * @param WPCF7_ContactForm $form The contact form object.
     *
     * @uses WPCF7_Mail::send
     *
     * @return void
     */
    public function send_email(WPCF7_ContactForm $form)
    {
        $placeholder = '['.$this-&amp;gt;tag_name.']';

        if (false === strpos($form-&amp;gt;prop('mail'), $placeholder)) {
            return;
        }

        foreach ($this-&amp;gt;emails as $email) {
            $template = $form-&amp;gt;prop('mail');
            $template['recipient'] = str_replace($placeholder, $email, $template['recipient']);
            $template['body']      = str_replace($placeholder, $email, $template['body']);
            WPCF7_Mail::send($template);
        }

        // Tell cf7 to skip over the default sending behaviour in WPCF7_Submission-&amp;gt;mail()
        $form-&amp;gt;skip_mail = true;
    }

    /**
     * Adds our js that will clone the emailplus field.
     *
     * Could be optimized with a conditional that checks if there is a form with the [emailplus]
     * fieldtype somewhere on the page
     *
     * @return void
     */
    public function emailplus_scripts()
    {
        wp_enqueue_script(
            'cf7-duplication',
            get_template_directory_uri() . '/js/cf7-duplication.js',
            array('jquery'),
            '20161006',
            true
        );
    }
}

$wpcf7DuplicableEmail = new WPCF7_Duplicable_Email();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 복제를 처리하는 .js 파일.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;안에서 살아야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;/path/to/your/theme/js/cf7-duplication.js'&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;(function($) {
  $(document).ready(function() {
    var addEmailField = function(inputRow, container) {
      inputRow.find('input[type=email]').val('');

      var removeButton = $('&amp;lt;a href=&quot;#&quot;&amp;gt;&amp;amp;times;&amp;lt;/a&amp;gt;')
        .click(function(e) {
          e.preventDefault();
          inputRow.remove();
        });

      inputRow.append(removeButton);
      inputRow.insertAfter(container.find('.emailplus-wrapper').last());
    }

    $.each($('[data-wpcf7-duplicable-email]'), function(i, el) {
      var container = $(el);
      var inputRow  = container.find('.emailplus-wrapper');
      var addButton = $('&amp;lt;a href=&quot;#&quot;&amp;gt;Add another email&amp;lt;/a&amp;gt;');

      addButton.click(function(e) {
        e.preventDefault();
        var newEmailField = inputRow.clone();
        addEmailField(newEmailField, container);
      });

      container.append(addButton);
    });
  });
})(jQuery);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마지막으로, 유효하고 이메일이 나갔을 때 양식이 사라지도록 하려면 &quot;추가 설정&quot; 패널에 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;on_sent_ok: &quot;jQuery('.cf7-duplicable-recipients').fadeOut();&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 접근 방식은 CF7의 &lt;em papago-id=&quot;20-1&quot;&gt;AJAX&lt;/em&gt; 제출에 가장 적합합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;바닐라 POST 요청을 처리하도록 확장하려면 쇼트코드 핸들러를 여러 개 렌더링하도록 업데이트할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신이 보존해야 할 필드들.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;value&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;잘못된 제출을 시도합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;옵션 1) 설정 메뉴의 메일 탭에서 메일(2)을 누른 후 수신인: 필드에서 이 줄을 추가합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;부모가 명시된 자녀의 수보다 적을 경우 추가 이메일 주소는 아무런 도움이 되지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;[이메일], [이메일]이 기본 형식입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;[parents-email], [kid-email1], [kid-email2], [kid-email3], [kid-email4], [kid-email5], [kid-email6], [kid-email7]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;옵션 2) [대상] 필드에 부모와 같은 전자 메일 주소 1개만 입력하고 [추가 머리글: 코드를 아래에 입력합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;CC: [kid-email1], [kid-email2], [kid-email3], [kid-email4], [kid-email5], [kid-email6], [kid-email7]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;BCC: [kid-email1], [kid-email2], [kid-email3], [kid-email4], [kid-email5], [kid-email6], [kid-email7]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;발생 가능한 문제:&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;많은 호스트들이 스팸을 막기 위해 이와 같은 것들을 차단합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 이것들이 작동하지 않는다면, 아마 이런 경우일 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;블록을 제거하려면 호스팅 공급자에게 문의해야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;연락처 양식 7에는 수신자 필드가 하나만 있지만, 해당 필드에 쉼표로 구분된 여러 개의 전자 메일 주소를 입력할 수 있습니다(예: &quot;email1@domain.com,email2@domain.com,email3@domain.com &quot;).&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러므로 당신의 경우, 자바스크립트를 사용하여 여러 개의 중복 수신자 필드를 동적으로 추가하고, 마지막으로 양식 제출 시 모든 수신자 이메일 주소를 조정하기 위한 자바스크립트 함수를 작성한 후, 그것을 주 수신자 필드에 보관하고 양식을 제출하면 됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신이 내 말을 이해하길 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/39754493/dynamic-number-of-contact-form-7-recipients&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>WordPress</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/713</guid>
      <comments>https://fileupload.tistory.com/713#entry713comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:41:20 +0900</pubDate>
    </item>
    <item>
      <title>워드프레스에서 기본 화면 옵션을 변경하는 방법</title>
      <link>https://fileupload.tistory.com/712</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;워드프레스에서 기본 화면 옵션을 변경하는 방법&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 포스트 에디터에서 기본 화면 옵션을 변경하는 방법을 찾고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본적으로 특정 옵션을 숨기려고 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;패밀리 레시피 사이트를 만들고 있는데 너무 많은 옵션으로 사용자들을 압도하고 싶지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;각 사용자로 로그인하여 수동으로 옵션을 변경하고 싶지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;WP 코어 파일과 테마 파일을 샅샅이 뒤졌지만 스크린 옵션에 대한 참고 자료는 그리 많이 찾을 수 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터베이스 어딘가에 정의되어 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;미리 감사드립니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://developer.wordpress.org/reference/hooks/default_hidden_meta_boxes/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;3-1&quot;&gt;기본_hidden_meta_box&lt;/a&gt; 필터 사용&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;add_filter( 'default_hidden_meta_boxes', 'my_hidden_meta_boxes', 10, 2 );
function my_hidden_meta_boxes( $hidden, $screen ) {
    return array( 'tagsdiv-post_tag', 'tagsdiv', 'postimagediv', 'formatdiv', 'pageparentdiv', ''); // get these from the css class
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아니면&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;add_filter( 'hidden_meta_boxes', 'my_hidden_meta_boxes', 10, 2 );
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;보너스 : 핵심 기능 &lt;a href=&quot;https://codex.wordpress.org/Function_Reference/get_hidden_meta_boxes&quot; rel=&quot;noreferrer&quot; papago-id=&quot;5-1&quot;&gt;get_hidden_meta_boxs&lt;/a&gt;()를 확인해보세요.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;간단한 버전은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function get_hidden_meta_boxes( $screen ) {
    $hidden = get_user_option( &quot;metaboxhidden_{$screen-&amp;gt;id}&quot; );
    if ( $use_defaults ) {
        $hidden = apply_filters( 'default_hidden_meta_boxes', $hidden, $screen );
    }
    return apply_filters( 'hidden_meta_boxes', $hidden, $screen, $use_defaults );
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본 화면 옵션은 에 저장됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;wp_usermeta&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;meta_key&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가&lt;/font&gt;&lt;/font&gt;&lt;code&gt;metaboxhidden_post&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본 옵션(또는 특정 상자 숨기기)을 설정하는 가장 쉬운 방법은 &lt;a href=&quot;http://wordpress.org/plugins/adminimize/&quot; rel=&quot;nofollow&quot; papago-id=&quot;10-1&quot;&gt;adminimize&lt;/a&gt;와 같은 플러그인을 사용하는 것이라고 생각합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;개인적으로 이 &lt;a href=&quot;https://wordpress.org/plugins/advanced-custom-fields/&quot; papago-id=&quot;10-3&quot; rel=&quot;nofollow&quot;&gt;작업&lt;/a&gt;에 고급 &lt;a href=&quot;https://wordpress.org/plugins/advanced-custom-fields/&quot; papago-id=&quot;10-3&quot; rel=&quot;nofollow&quot;&gt;사용자&lt;/a&gt; 지정 필드 플러그인을 사용합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;젠드카의 답변을 약간 수정했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 단지 목록에서 한 항목을 제거하고 그 외에는 배열을 변경하지 않은 채로 두려고 했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;add_filter( 'default_hidden_meta_boxes', 'show_author_metabox', 10, 2 );
function show_author_metabox( $hidden, $screen )
{
    $authorkey = array_search( 'authordiv', $hidden );
    unset( $hidden[ $authorkey ] );

    return $hidden;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 경우에는 숨겨진 목록에서 'author div'를 제거하고 있었는데, 숨겨진 메타박스에서 제거하고 싶은 메타박스와 교체하세요.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;array_search에서 결과가 없으면 PHP notice/errors가 발생하지 않기 때문에 설정을 해제하기 전에 메타박스의 존재 여부를 확인하지 않습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/24471154/how-to-change-default-screen-options-in-wordpress&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>WordPress</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/712</guid>
      <comments>https://fileupload.tistory.com/712#entry712comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:41:08 +0900</pubDate>
    </item>
    <item>
      <title>Oracle: 기존 값에 추가하여 데이터 행 업데이트</title>
      <link>https://fileupload.tistory.com/711</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Oracle: 기존 값에 추가하여 데이터 행 업데이트&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터베이스(Oracle 11g)에 큰 테이블이 있으며 여기서 특정 번호가 있는 테이블의 열을 업데이트합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;a를 설정하여 업데이트하고 싶습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;prefix&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 열의 모든 값 앞에 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;2-0&quot;&gt;예제&lt;/strong&gt;(특정 번호는&lt;/font&gt;&lt;/font&gt;&lt;code&gt;int&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 PK, Value1은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Varchar2&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마지막 열도 마찬가지입니다.):&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;실제 데이터:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    [SpecificNumber] [Value1] [column2gettingupdated]
[1]  123456789        Test     text    
[2]  123456789102     sth      text2    
[3]  12233            text     test3
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;향후 데이터(내 sql 이후):&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    [SpecificNumber] [Value1] [column2gettingupdated]
[1]  123456789        Test     PREFIX-text    
[2]  123456789102     sth      PREFIX-text2    
[3]  12233            text     PREFIX-test3
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 제가 생각한 것은:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Update table
set column2gettingupdated=(&quot;prefix&quot;+
    (select column2gettingupdated from table where SpecificNumber = '12233')
)
where SpecificNumber = '12233';
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 그건 내게 의미가 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ORA-00904: &quot;p&quot;: invalid identifier&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오류를 범실.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내가 이걸 해보면,&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Update table
set column2gettingupdated=(&quot;prefix&quot;+
    (select column2gettingupdated from table where SpecificNumber = '12233')
)
where SpecificNumber = '12233';
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ORA-01722: invalid number&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오류를 범실.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이게 가능하긴 해요?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신의 도움에 벌써 감사합니다!&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;연결 연산자만 사용하면 되고,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;||&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;. 업데이트 구문에는 하위 쿼리를 가져올 필요가 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;column2gettingupdated&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;값의 경우 12233입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 Oracle VARCHAR2에서는 큰따옴표가 아니라 작은따옴표를 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 이 문에 대한 구문은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;UPDATE table
   SET column2gettingupdated = 'prefix' || column2gettingupdated
 WHERE SpecificNumber        = 12233;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예제 스키마 SCOT의 예제는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SCOTT@dev&amp;gt; CREATE TABLE DEPT2 as (
  2          SELECT *
  3            FROM DEPT
  4         );

Table created.

SCOTT@dev&amp;gt; commit;

Commit complete.

SCOTT@dev&amp;gt; UPDATE DEPT2
  2     SET DNAME  = 'PRE '|| DNAME
  3   WHERE DEPTNO = 20;

1 row updated.

SCOTT@dev&amp;gt; commit;

Commit complete.

SCOTT@dev&amp;gt; SELECT *
  2    FROM dept
  3   WHERE deptno = 20
  4   UNION
  5  SELECT *
  6    FROM dept2
  7   WHERE deptno = 20
  8  
SCOTT@dev&amp;gt; /

    DEPTNO DNAME          LOC
========== ============== =============
        20 PRE RESEARCH   DALLAS
        20 RESEARCH       DALLAS
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자열에 연결 사용:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;update &amp;lt;table_name&amp;gt;
   set column2gettingupdated = 'Prefix-' || column2gettingupdated 
 where specificnumber = 12233; -- use NUMBER literal instead of string one
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/26405864/oracle-update-a-datarow-by-adding-to-existing-value&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>Oracle</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/711</guid>
      <comments>https://fileupload.tistory.com/711#entry711comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:41:02 +0900</pubDate>
    </item>
    <item>
      <title>PDF 파일을 외부 액세스로부터 보호합니다.인증된 사용자만 액세스할 수 있습니다.WordPress 업로드 디렉토리</title>
      <link>https://fileupload.tistory.com/710</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PDF 파일을 외부 액세스로부터 보호합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;인증된 사용자만 액세스할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;WordPress 업로드 디렉토리&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;웹사이트를 운영하고 있는데 워드프레스 업로드 폴더 안에 있는 모든 PDF 파일을 외부 접근과 핫링크로부터 보호하고 싶습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이미 사용자 인증을 사용하여 이러한 파일에 첨부된 게시물을 보호하고 있지만, 사용자 인증을 사용하여 PDF 파일에 대한 직접 링크나 검색 엔진에서 이러한 파일의 인덱싱을 보호하지는 못합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;PDF가 1000개 이상이고 임의의 파일명을 가지고 있고 날짜가 다른 다양한 게시물에 첨부되어 있기 때문에 기본 업로드 디렉토리를 변경하지 않았으면 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 사이트는 Nginx, php5-fpm 및 MariaDB와 함께 데비안 VPS에서 호스팅됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;지금까지 다음을 테스트했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;site.conf 1&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;location /wp-content/uploads/ {
    location ~* \.(pdf)$ {
        valid_referers blocked example.com *.example.com;
        if ($invalid_referer) {
            return 301 https://example.com/services/login-error.html;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;site.conf 2&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;location /wp-content/uploads/ {
    location ~* \.(pdf)$ {
        valid_referers blocked example.com *.example.com;
        if ($invalid_referer) {
            deny all;
            return 403;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;안타깝게도 위 구성 중 예상대로 작동하는 구성이 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;외부 액세스를 차단하지만 인증된 사용자를 403 또는 301 오류로 리디렉션하기도 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어떤 도움이나 제안이라도 해주시면 감사하겠습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;감사해요.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 가장 좋은 방법은 http://nginx.org/r/auth_request 을 사용하여 주어진 범위 내에서 결정하는 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;location&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 사용자가 인증되었는지 여부 및 액세스 권한이 부여되어야 하는지 여부.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 워드프레스의 정확한 종점을 알아내야 할 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 옵션은 모든 파일을 http://nginx.org/r/internal 로 이동하는 것입니다.&lt;/font&gt;&lt;/font&gt; &lt;code&gt;location&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 사용.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;X-Accel-Redirect&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기존 스크립트를 처리하는 새 스크립트의 HTTP Response Header 필드&lt;/font&gt;&lt;/font&gt;&lt;code&gt;location&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 외부 링크가 만들어지는 대상: 인증된 클라이언트만 내부로 리디렉션합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;location&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;상술한 바와 같이&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로그인하지 않은 사용자를 오류 URL로 리디렉션하는 대신 파일 경로를 페이지로 전달합니다. 이 페이지는 사용자의 홈 페이지가 될 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음 규칙을 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;rewrite ^/wp-content/uploads/(.*)\.(?!js|css|png|jpe?g|gif)(.*)$ /?dwnld_file=$1.$2
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그런 다음 WordPress를 통해 사용자가 로그인했는지 여부를 확인하고 유효한 경우 액세스를 제공합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;테마의 'functions.php'에 다음을 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;//init hook
add_action( 'init', 'file_init' );
function file_init() {
    if ($_REQUEST[ 'dwnld_file' ] != '' ) {
        if ( ! is_user_logged_in() ) { // if not logged-in
            auth_redirect(); //redirect to login page
            // wp_redirect( 'https://example.com/services/login-error.html' ); // or some other page
            exit;
        }
        else {
            check_download_file( $_REQUEST[ 'dwnld_file' ] ); // if logged-in pass file to download
        }
    }
}

//function to download file
function check_download_file( $file ) {
    $upload = wp_upload_dir();
    $file = $upload[ 'basedir' ] . '/' . $file;
    if ( !is_file( $file ) ) {
        status_header( 404 );
        die( 'File not found.' );
    }
    else {
        $mime = wp_check_filetype( $file ); 
        if( false === $mime[ 'type' ] &amp;amp;&amp;amp; function_exists( 'mime_content_type' ) )
            $mime[ 'type' ] = mime_content_type( $file );

        if( $mime[ 'type' ] )
        {
            $mimetype = $mime[ 'type' ];        

            header( 'Content-type: ' . $mimetype );
            $last_modified = gmdate( 'D, d M Y H:i:s', filemtime( $file ) );
            $etag = '&quot;' . md5( $last_modified ) . '&quot;';
            header( &quot;Last-Modified: $last_modified GMT&quot; );
            header( 'ETag: ' . $etag );
            header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', time() + 100000000 ) . ' GMT' );

            readfile( $file );
            die();
        }
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도움이 되길 바랍니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 결국 제가 찾은 것은 모든 답을 시도한 후에 site.conf #1이 로그인한 사용자와 함께 URL이 https://로 시작하는 PDF 파일을 작업하는 동안 URL에 http://가 있던 이전 업로드에서는 작동하지 않았습니다. wp_ posts 테이블을 https://example.com/wp-content/uploads/ 로 업데이트해야 했고 결국 PDF 파일을 직접 액세스로부터 보호하고 있었습니다(오직).&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;물론 이 방법을 사용하면 일반적으로 사용할 수 있는 PDF 파일도 보호할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;도와주셔서 감사합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나는 그것을 했습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;.htaccess&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;읽고 있어&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;wordpress_logged_in&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;쿠키&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;업로드 폴더의 모든 파일 보호:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;IfModule mod_rewrite.c&amp;gt;
    RewriteEngine On
    RewriteCond %{HTTP_COOKIE} !.*wordpress_logged_in.*$ [NC]
    RewriteCond %{REQUEST_URI} ^(.*?/?)wp-content/uploads/.* [NC]
    RewriteRule . http://%{HTTP_HOST}%1/wp-login.php?redirect_to=%{REQUEST_URI} [L,QSA]
&amp;lt;/IfModule&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;일부 파일 확장자만 보호:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;lt;IfModule mod_rewrite.c&amp;gt;
    RewriteEngine On
    RewriteCond %{HTTP_COOKIE} !.*wordpress_logged_in.*$ [NC]
    RewriteCond %{REQUEST_URI} ^(.*?/?)wp-content/uploads/.*\.(?:gif|png|jpe?g|pdf|txt|rtf|html|htm|xlsx?|docx?|mp3|mp4|mov)$ [NC]
    RewriteRule . http://%{HTTP_HOST}%1/wp-login.php?redirect_to=%{REQUEST_URI} [L,QSA]
&amp;lt;/IfModule&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://www.noupe.com/wordpress/how-to-protect-wordpress-files-and-uploads-folder.html&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;29-1&quot;&gt;여기&lt;/a&gt;서 더 읽어보세요.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/51536381/pdf-files-protection-from-external-access-accessible-only-to-authenticated-user&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>WordPress</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/710</guid>
      <comments>https://fileupload.tistory.com/710#entry710comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:40:55 +0900</pubDate>
    </item>
    <item>
      <title>해스켈 FFI가 C로 들어갔다가 다시 돌아오는데 얼마입니까?</title>
      <link>https://fileupload.tistory.com/709</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해스켈 FFI가 C로 들어갔다가 다시 돌아오는데 얼마입니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;앞의 결과에 따라 각각 1개 이상의 C 기능을 호출하려면 3개의 호출을 처리하는 포장지 C 기능을 만드는 것이 좋습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;종류를 변환하지 않고 하스켈 FFI를 사용하는 것과 같은 비용이 들까요?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내가 다음과 같은 하스켈 코드를 가지고 있다고 가정합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;foo :: CInt -&amp;gt; IO CInt
foo x = do
  a &amp;lt;- cfA x
  b &amp;lt;- cfB a
  c &amp;lt;- cfC c
  return c
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;각기능&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cf*&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C 콜입니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;성능적인 면에서 다음과 같은 단일 C 기능을 만드는 것이 더 나을까요?&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cfABC&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해스켈에서 외국 전화 한 통만 걸었단 말입니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;int cfABC(int x) {
   int a, b, c;
   a = cfA(x);
   b = cfB(a);
   c = cfC(b);
   return c;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해스켈 코드:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;foo :: CInt -&amp;gt; IO CInt
foo x = do
  c &amp;lt;- cfABC x
  return c
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하스켈의 C 통화 수행 비용을 측정하는 방법은?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;C 함수 자체의 비용이 아니라, 하스켈에서 C로 그리고 다시 돌아가는 &quot;맥락 전환&quot;의 비용입니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;답은 대부분 외국 전화가 A인지 여부에 달려 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;safe&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;혹은&lt;/font&gt;&lt;/font&gt;&lt;code&gt;unsafe&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;불러.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;안&lt;/font&gt;&lt;/font&gt;&lt;code&gt;unsafe&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C 호출은 기본적으로 함수 호출일 뿐이므로 (비정상적인) 형태의 변환이 없는 경우, C로의 외호는 GHC에 의해 내선화될 수 없기 때문에 C를 컴파일할 때 구성 요소 함수 중 몇 개를 인라인화할 수 있는지에 따라 세 개의 함수 호출이 있고, C에 래퍼를 작성할 때 하나에서 네 개 사이가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이러한 함수 호출은 일반적으로 매우 저렴합니다(인수를 복사하고 코드로 이동하는 것에 불과합니다). 따라서 어느 쪽이든 차이가 작습니다. C 함수를 래퍼에 인라인할 수 없을 때 래퍼는 약간 느려야 하며 모든 함수를 인라인할 수 있을 때는 약간 빨라야 합니다. [제 벤치마킹에서는 실제로 +1.5ns resp. -3.5ns.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 3개의 외국 전화는 단지 논쟁을 돌려주는 모든 것에 대해 약 12.7ns가 걸렸습니다.].&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;함수가 사소한 것을 수행하는 경우 차이는 무시할 수 있습니다(그리고 사소한 것을 수행하지 않는 경우에는 GHC가 코드를 입력하도록 하기 위해 하스켈로 작성하는 것이 좋을 것입니다).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splited&quot;&gt;A &lt;/font&gt;&lt;code&gt;safe&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;C 호출은 사소하지 않은 양의 상태를 저장하고 잠금을 설정하며 새로운 OS 스레드를 생성할 수 있으므로 훨씬 더 오랜 시간이 걸립니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 C에서 하나의 함수를 더 호출하는 작은 오버헤드는 외부 호출의 비용과 비교하여 무시할 수 있습니다. [인수를 통과하는 데 비정상적인 양의 복사가 필요하지 않는 한, 많은 양의 복사가 필요합니다.]&lt;/font&gt;&lt;/font&gt;&lt;code&gt;struct&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;어느 정도]&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;나의 아무것도 하지 않는 벤치마크에서&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;{-# LANGUAGE ForeignFunctionInterface #-}
module Main (main) where

import Criterion.Main
import Foreign.C.Types
import Control.Monad

foreign import ccall safe &quot;funcs.h cfA&quot; c_cfA :: CInt -&amp;gt; IO CInt
foreign import ccall safe &quot;funcs.h cfB&quot; c_cfB :: CInt -&amp;gt; IO CInt
foreign import ccall safe &quot;funcs.h cfC&quot; c_cfC :: CInt -&amp;gt; IO CInt
foreign import ccall safe &quot;funcs.h cfABC&quot; c_cfABC :: CInt -&amp;gt; IO CInt

wrap :: (CInt -&amp;gt; IO CInt) -&amp;gt; Int -&amp;gt; IO Int
wrap foo arg = fmap fromIntegral $ foo (fromIntegral arg)

cfabc = wrap c_cfABC

foo :: Int -&amp;gt; IO Int
foo = wrap (c_cfA &amp;gt;=&amp;gt; c_cfB &amp;gt;=&amp;gt; c_cfC)

main :: IO ()
main = defaultMain
            [ bench &quot;three calls&quot; $ foo 16
            , bench &quot;single call&quot; $ cfabc 16
            ]
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 C 함수가 단지 인수를 반환하는 경우, 단일 랩핑된 호출의 평균은 100ns[105-112]를 약간 상회하고, 300ns 부근의 세 개의 개별 호출의 경우에는 [290-315]입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;비상대기상태&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;safe&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;c 통화는 대략 100ns가 소요되며, 보통 한 번의 통화로 마무리하는 것이 더 빠릅니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 여전히 호출된 함수가 충분히 사소한 것을 수행한다면 그 차이는 중요하지 않을 것입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 아마도 당신의 정확한 Haskell 컴파일러, C 컴파일러, 그리고 그것들을 결합하는 접착제에 &lt;em papago-id=&quot;19-1&quot;&gt;매우&lt;/em&gt; 달려있을 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;확실히 알 수 있는 유일한 방법은 그것을 측정하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;좀 더 철학적인 곡조로 언어를 섞을 때마다 새로운 고객에게 장벽을 만들어 줍니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 경우 해스켈과 C를 유창하게 구사하는 것은 충분하지 않지만(이미 좁은 집합을 제공함), 호출 규칙과 함께 일하기에는 충분하지 않은 것도 알아야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 종종 처리해야 할 미묘한 문제들이 있습니다(심지어 C++에서 C를 부르는 것조차 매우 &lt;em papago-id=&quot;20-1&quot;&gt;유사&lt;/em&gt;한 언어들은 전혀 사소한 것이 아닙니다).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;20-3&quot;&gt;아주&lt;/em&gt; 설득력 있는 이유가 없는 한, 저는 한 가지 언어를 고수할 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;내가 즉시 생각할 수 있는 유일한 예외는 예를 만드는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;기존의 복잡한 라이브러리에 바인딩된 해스켈(Haskell), 예를 들어 NumPy for Python.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/14519905/how-much-does-it-cost-for-haskell-ffi-to-go-into-c-and-back&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>c</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/709</guid>
      <comments>https://fileupload.tistory.com/709#entry709comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:40:47 +0900</pubDate>
    </item>
    <item>
      <title>':'(콜론)은 자바스크립트에서 무엇을 합니까?</title>
      <link>https://fileupload.tistory.com/708</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;':'(콜론)은 자바스크립트에서 무엇을 합니까?&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 자바스크립트를 배우고 있고 jQuery 라이브러리를 검색하는 동안 볼 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;:&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(colon) 많이 사용되고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 자바스크립트에서 무엇에 사용됩니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// Return an array of filtered elements (r)
// and the modified expression string (t)
   return { r: r, t: t };
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;var o = {
    r: 'some value',
    t: 'some other value'
};
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;와 기능적으로 동치입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var o = new Object();
o.r = 'some value';
o.t = 'some other value';
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 콜론은 문장에 레이블을 붙이는 데 사용될 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를들면&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var i = 100, j = 100;
outerloop:
while(i&amp;gt;0) {
  while(j&amp;gt;0) {
   j++

   if(j&amp;gt;50) {
     break outerloop;
   }
  }
i++

}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여러분은 콜론이 3원 연산자에서도 사용된다는 것을 잊고 있습니다(jquery가 이 목적으로 사용하는지는 모르겠지만).&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;ternary 연산자는 if/then 문의 식(express이온이 값을 반환함)입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같이 쓰입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var result = (condition) ? (value1) : (value2) ;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;if/then과 마찬가지로 3원 연산자를 사용하여 부작용을 발생시킬 수도 있지만, 이는 매우 나쁜 관행입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;':'는 기본적으로 키 값 쌍의 구분 기호입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예제에서는 Javascript Object Literal 표기법입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;javascript에서 Objects는 속성의 식별자를 구분하는 콜론과 그 값으로 정의되므로 다음을 가질 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;return { 
    Property1 : 125,
    Property2 : &quot;something&quot;,
    Method1 : function() { /* do nothing */ },
    array: [5, 3, 6, 7]
};
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같이 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var o =  { 
    property1 : 125,
    property2 : &quot;something&quot;,
    method1 : function() { /* do nothing */ },
    array: [5, 3, 6, 7]
};

alert(o.property1); // Will display &quot;125&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;JSON(Javascript Object Notation)이라고도 불리는 이 서브셋은 서버측 언어에서 콤팩트하고 구문 분석이 빠르기 때문에 AJAX 호출에서 유용하며, 자바스크립트는 JSON 문자열을 객체로 쉽게 디시리얼화할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;// The parenthesis '(' &amp;amp; ')' around the object are important here
var o = eval('(' + &quot;{key: \&quot;value\&quot;}&quot; + ')');
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;특별한 문자나 공백이 포함되어 있는 경우에는 키를 따옴표 안에 넣을 수도 있지만 작업하기가 더 어려워지기 때문에 권장하지는 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자바스크립트 언어의 &lt;a href=&quot;https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Core_Language_Features#Object_Literals&quot; papago-id=&quot;13-1&quot; rel=&quot;noreferrer&quot;&gt;자바스크립트 객체&lt;/a&gt; &lt;a href=&quot;https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Core_Language_Features#Object_Literals&quot; papago-id=&quot;13-1&quot; rel=&quot;noreferrer&quot;&gt;&lt;em papago-id=&quot;13-1-1&quot;&gt;리터럴&lt;/em&gt;&lt;/a&gt; &lt;a href=&quot;https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Core_Language_Features#Object_Literals&quot; papago-id=&quot;13-1&quot; rel=&quot;noreferrer&quot;&gt;노테이션&lt;/a&gt;은 메시지 전달을 위한 JSON 표준과 다릅니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 둘의 주요 차이점은 함수와 생성기가 &lt;a href=&quot;http://json.org/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;13-3&quot;&gt;JSON 표준&lt;/a&gt;의 일부가 아니라 JS 객체 리터럴에서 허용된다는 것입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;개체 리터럴 구문의 일부입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본 형식은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var obj = { field_name: &quot;field value&quot;, other_field: 42 };
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 다음을 통해 이러한 값에 액세스할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;obj.field_name; // -&amp;gt; &quot;field value&quot;
obj[&quot;field_name&quot;]; // -&amp;gt; &quot;field value&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본적으로 객체의 메소드를 제공하는 값으로서 함수를 가질 수도 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;obj['func'] = function(a) { return 5 + a;};
obj.func(4);  // -&amp;gt; 9
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;변수의 개체를 나열하는 데 사용할 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 if 문장의 축약어로 조금 사용됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var something = {face: 'hello',man: 'hey',go: 'sup'};
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 부르는 것도&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;alert(something.man);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;if 문장도:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function something() {  
  (some) ? doathing() : dostuff(); // if some = true doathing();, else dostuff();
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것들은 일반적으로 자바스크립트에서 콜론 ':'이 사용되는 시나리오입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;1- 개체 선언 및 초기화&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var Car = {model:&quot;2015&quot;, color:&quot;blue&quot;}; //car object with model and color properties
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2- Label 설정 (제어 구조 및 스파게티 코드가 복잡하여 권장하지 않음)&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;List: 
while(counter &amp;lt; 50)
{
     userInput += userInput;
     counter++;
     if(userInput &amp;gt; 10000)
     {
          break List;
     }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;3 - 입력 스위치 문&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;switch (new Date().getDay()) {
    case 6:
        text = &quot;Today is Saturday&quot;;
        break; 
    case 0:
        text = &quot;Today is Sunday&quot;;
        break; 
    default: 
        text = &quot;Looking forward to the Weekend&quot;;
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;4 - 인터네셔널 오퍼레이터&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;document.getElementById(&quot;demo&quot;).innerHTML = age&amp;gt;18? &quot;True&quot; : &quot;False&quot;;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;colon이 각 &quot;case&quot; 뒤에 사용되는 switch 문을 잊지 말아야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자바스크립트에서 콜론의 또 다른 용도는 변수의 이름을 바꾸는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;const person = { 
    nickNameThatIUseOnStackOverflow: &quot;schlingel&quot;,
    age: 30,
    firstName: &quot;John&quot;
};
let { nickNameThatIUseOnStackOverflow: nick } = person; // I take nickNameThatIUseOnStackOverflow but want to refer it as &quot;nick&quot; from now on.
nick = &quot;schling&quot;;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;코드에서 이름을 바꾸려는 어색한/긴 변수 이름을 가진 값을 반환하는 타사 라이브러리를 사용하는 경우 유용합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그것은 JSON, 즉 자바스크립트 객체 표기법입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;개체 또는 해시 맵을 빠르게 설명하는 방법입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;대장 앞에 있는 것이 재산명이고 대장 뒤에 있는 것이 가치입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 이 예제에는 변수 r에 있는 값이 무엇이든 &quot;r&quot; 속성이 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;같은 요새.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 얼마 전에 했던 바보 같은 실수 하나가 사람들에게 도움이 될지도 모릅니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이와 같은 경우 &quot;:&quot;를 사용하는 경우 값이 변경되지 않습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var ondrag = (function(event, ui) {
            ...

            nub0x: event.target.offsetLeft + event.target.clientWidth/2;
            nub0y = event.target.offsetTop + event.target.clientHeight/2;

            ...
        });
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;따라서 &quot;nub0x&quot;는 처음 발생하는 이벤트로 초기화되며 값이 변경되지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 &quot;nub0y&quot;는 다음 이벤트 동안 변경됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/418799/what-does-colon-do-in-javascript&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>javascript</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/708</guid>
      <comments>https://fileupload.tistory.com/708#entry708comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:40:40 +0900</pubDate>
    </item>
    <item>
      <title>아이폰 시스템 폰트</title>
      <link>https://fileupload.tistory.com/707</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아이폰 시스템 폰트&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아이폰의 기본 시스템 글꼴 이름은 무엇입니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자 정의를 위해 이것을 검색하고 싶습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UIView&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;blockquote&gt; 
 &lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;폰트 퓨리스트들을 기쁘게도 아이폰 시스템 인터페이스는 헬베티카 또는 그 변형을 사용합니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오리지널 아이폰, 아이폰 3G, 아이폰 3GS 시스템 인터페이스는 헬베티카를 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;항상 뛰어난 Daring Fireball에 의해 처음 언급되었듯이, 아이폰 4는 &quot;Helvetica Neue&quot;라고 불리는 미묘하게 수정된 글꼴을 사용합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Daring Fireball은 또한 이러한 변화가 iOS 4 운영 체제보다는 아이폰 4 디스플레이와 관련이 있으며 iOS 4를 실행하는 구형 아이폰 모델은 여전히 헬베티카를 시스템 글꼴로 사용하고 있다고 언급합니다.&lt;/font&gt;&lt;/p&gt; 
 &lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아이폰 이전에 출시된 아이팟 모델들은 시카고, 에스피 산스, 또는 미리어드 중 하나를 사용하고 아이폰 출시 이후에는 헬베티카를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;출처: http://www.everyipod.com/iphone-faq/iphone-who-designed-iphone-font-used-iphone-ringtones.html&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;8-1&quot;&gt;iOS9&lt;/strong&gt;의 경우 &lt;strong papago-id=&quot;8-3&quot;&gt;샌프란시스코&lt;/strong&gt;로 변경되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 정보는 http://developer.apple.com/fonts 을 참조하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로그램 사용자 지정을 수행하는 경우 시스템 글꼴을 하드 코드화하지 마십시오.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UIFont systemFontOfSize:&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UIFont boldSystemFontOfSize:&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;UIFont italicSystemFontOfSize&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(&lt;a href=&quot;http://developer.apple.com/library/ios/documentation/uikit/reference/UIFont_Class/Reference/Reference.html#//apple_ref/occ/clm/UIFont/systemFontOfSize:&quot; papago-id=&quot;12-1&quot; rel=&quot;noreferrer&quot;&gt;Apple 설명서&lt;/a&gt;).&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이는 시스템 글꼴을 헬베티카 노이에로 변경한 iOS 7 이후로 특히 관련성이 높아졌습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 시스템 글꼴을 샌프란시스코로 &lt;em papago-id=&quot;14-3&quot;&gt;다시&lt;/em&gt; 바꾼 iOS 9 이후로 &lt;em papago-id=&quot;14-1&quot;&gt;특히&lt;/em&gt; 중요해졌습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가짜 아이폰은 &lt;strong papago-id=&quot;15-1&quot;&gt;기본적&lt;/strong&gt;으로 &quot;헬베티카&quot;를 사용합니다 &amp;lt; iOS 10&lt;/font&gt;&lt;/p&gt;&lt;h1 papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스위프트&lt;/font&gt;&lt;/h1&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;특정 글꼴&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Swift에서 특정 글꼴을 설정하는 방법은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let myFont = UIFont(name: &quot;Helvetica&quot;, size: 17)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이름을 모르는 경우 다음과 같이 사용 가능한 글꼴 이름 목록을 얻을 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;print(UIFont.familyNames())
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;더 자세한 목록은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;for familyName in UIFont.familyNames() {
    print(UIFont.fontNamesForFamilyName(familyName))
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 시스템 폰트는 iOS 버전마다 바뀝니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 시스템 폰트를 동적으로 구하는 것이 좋을 것 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;시스템 글꼴&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let myFont = UIFont.systemFontOfSize(17)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 하드 코딩된 사이즈가 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 사용자의 눈이 나빠서 글씨체를 더 크게 만들고 싶다면 어떻게 해야 합니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;물론, 사용자가 글꼴 크기를 변경하도록 앱에 설정할 수 있지만, 사용자가 휴대폰의 모든 앱에 대해 별도로 설정해야 한다면 이는 귀찮을 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;일반 설정을 한 번만 변경하면 더 쉬워집니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;동적 글꼴&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let myFont = UIFont.preferredFont(forTextStyle: .body)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아, 이제 우리가 작업하고 있는 &lt;a href=&quot;https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIFontDescriptor_Class/index.html#//apple_ref/doc/c_ref/UIFontTextStyleHeadline&quot; rel=&quot;noreferrer&quot; papago-id=&quot;25-1&quot;&gt;텍스트&lt;/a&gt; 스타일에 대해 사용자가 선택한 크기의 시스템 글꼴을 갖게 되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것이 글꼴을 설정하는 권장 방법입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 내용은 동적 유형 &lt;a href=&quot;http://useyourloaf.com/blog/supporting-dynamic-type.html&quot; rel=&quot;noreferrer&quot; papago-id=&quot;25-3&quot;&gt;지원&lt;/a&gt;을 참조하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;h1 papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;관련된&lt;/font&gt;&lt;/h1&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/a/34557032/3681880&quot; papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;iOS 글꼴 비주얼 목록&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/a/32269975/3681880&quot; papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스위프트를 사용하여 속성 문자열을 만드는 방법은 무엇입니까?&lt;/font&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언제든지 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;UIFont *systemFont = [UIFont systemFontOfSize:12];
NSLog(@&quot;what is it? %@ %@&quot;, systemFont.familyName, systemFont.fontName);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;답은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;iOS 6까지&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; Helvetica Helvetica
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;iOS 7&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.Helvetica Neue Interface .HelveticaNeueInterface-M3
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 당신은 그냥 사용할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;Helvetica Neue&lt;/code&gt;&lt;/p&gt;&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본 시스템 글꼴 이름을 얻을 수 있는 api가 있는지 잘 모르겠습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 나는 그냥 이런 이름을 얻습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    //get system default font
    UILabel *label = [[UILabel alloc] init];        
    fontname = label.font.fontName;
    [label release];
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;멍청해 보이지만 효과가 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;em papago-id=&quot;36-1&quot;&gt;다음은 iOS&lt;/em&gt; 7을 지원하기 위한 업데이트입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;지금.&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;'다이나믹 타입'을 지원하는 모든 앱은 '설정'의 '일반' 섹션을 방문해 '폰트 사이즈'를 선택하기만 하면 시스템 전체에서 작동하는 iOS 7의 폰트 사이즈를 선택할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;pre&gt;&lt;code&gt;UIFont *dynamicFont  = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 상수 목록, &lt;em papago-id=&quot;38-1&quot;&gt;자세한 설명&lt;/em&gt;은 여기 &lt;em papago-id=&quot;38-1&quot;&gt;&lt;a href=&quot;https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIFontDescriptor_Class/Reference/Reference.html#//apple_ref/doc/constant_group/Text_Styles&quot; rel=&quot;nofollow&quot; papago-id=&quot;38-1-1&quot;&gt;있습니다&lt;/a&gt;&lt;/em&gt;.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;NSString *const UIFontTextStyleHeadline;
NSString *const UIFontTextStyleSubheadline;
NSString *const UIFontTextStyleBody;
NSString *const UIFontTextStyleFootnote;
NSString *const UIFontTextStyleCaption1;
NSString *const UIFontTextStyleCaption2;
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;39-3&quot;&gt;UIFont용&lt;/strong&gt; 카테고리 UIFont &lt;strong papago-id=&quot;39-1&quot;&gt;SystemFonts&lt;/strong&gt;(&lt;em papago-id=&quot;39-5&quot;&gt;UIInterface.h&lt;/em&gt;)는 미리 정의된 몇 가지 편리한 크기를 제공합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@interface UIFont (UIFontSystemFonts)
 + (CGFloat)labelFontSize;
 + (CGFloat)buttonFontSize;
 + (CGFloat)smallSystemFontSize;
 + (CGFloat)systemFontSize;
@end 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;채팅 메시지(라벨)에 사용하는데, 텍스트 블록의 크기를 얻어야 할 때 잘 작동합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; [UIFont systemFontOfSize:[UIFont labelFontSize]];
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;해피코딩!&lt;/font&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;UIFont *systemFont = [UIFont systemFontOfSize:[UIFont systemFontSize]];
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이렇게 하면 기본적으로 라벨 텍스트에 적용된 기본 시스템 글꼴 크기의 시스템 글꼴이 제공됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스위프트&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본 글꼴은 Apple에서 언제든지 변경할 수 있으므로 항상 시스템 기본값을 사용하고 글꼴 이름을 하드 코딩하지 않아야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;크기가 다른 몇 가지 시스템 기본 글꼴(보통 글꼴, &lt;strong papago-id=&quot;45-1&quot;&gt;굵은&lt;/strong&gt; 글꼴, &lt;em papago-id=&quot;45-3&quot;&gt;기울임꼴&lt;/em&gt;)(라벨, 단추 등)이 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let font = UIFont.systemFont(ofSize: UIFont.systemFontSize)
let font2 = UIFont.boldSystemFont(ofSize: UIFont.systemFontSize)
let font3 = UIFont.italicSystemFont(ofSize: UIFont.systemFontSize)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;46&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;기본 글꼴 크기는 대상 보기(라벨, 단추 등)에 따라 달라집니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;let labelFont = UIFont.systemFont(ofSize: UIFont.labelFontSize)
let buttonFont = UIFont.systemFont(ofSize: UIFont.buttonFontSize)
let textFieldFont = UIFont.systemFont(ofSize: UIFont.systemFontSize)
&lt;/code&gt;&lt;/pre&gt;&lt;ol&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;필수 .ttf 파일 다운로드&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;복사 번들 리소스 아래에 .ttf 파일을 추가하고, 리소스 아래에 ttf 파일을 추가하는지 두 번 확인합니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;info.pllist에서 ttf 파일 이름을 그대로 추가합니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 글꼴 북을 여십시오. 글꼴 북에 .ttf 파일을 추가하고, 정보 아이콘을 선택하면 포스트스크립트 이름을 찾을 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;p papago-id=&quot;52&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 폰트 이름 대신에 포스트스크립트 이름을 주세요.&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;p papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;iOS의 기본 글꼴은 샌프란시스코입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 내용은 &lt;a href=&quot;https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/typography/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;53-1&quot;&gt;링크&lt;/a&gt;를 참조하시면 됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/3838336/iphone-system-font&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>iPhone</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/707</guid>
      <comments>https://fileupload.tistory.com/707#entry707comment</comments>
      <pubDate>Wed, 25 Oct 2023 23:40:32 +0900</pubDate>
    </item>
    <item>
      <title>Swift UI에서 텍스트에 대한 사용자 지정 글꼴 크기</title>
      <link>https://fileupload.tistory.com/706</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Swift UI에서 텍스트에 대한 사용자 지정 글꼴 크기&lt;/font&gt;&lt;/h2&gt;
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 보기에는 시스템 글꼴 크기를 21포인트 크기의 중간 크기로 사용하고 싶다는 라벨이 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만든 글꼴을 다시 사용하기 위해 사용자 지정 확장자를 만들었습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;extension Font {
    static var primaryButton: Font {
        return Font.custom(&quot;SFUIDisplay-Light&quot;, size: 21)
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 이것은 아무런 효과가 없습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;문자열을 다음으로 변경했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;HelveticaNeue-UltraLight&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;효과가 있었고 그래서 아마 제 생각엔&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SFUIDisplay-Light&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;단순히 잘못된 글꼴 이름입니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;폰트 북에는 다음과 같이 적혀있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;SFProText-Light&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;, 하지만 그것도 저에겐 통하지 않았습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Swift에서 샌프란시스코 글꼴의 올바른 글꼴 이름은 무엇입니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;UI?&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는: 시스템 글꼴을 사용하여 글꼴 크기를 설정하려면 어떻게 해야 합니까?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음을 사용하여 시스템 글꼴의 명시적 크기를 설정할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.font(.system(size: 60))
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용자 지정 글꼴 크기를 이렇게 설정할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.font(.custom(&quot;FONT_NAME&quot;, size: 20))
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Text(&quot;Default font design&quot;).font(Font.system(size:30, design: .default))
Text(&quot;Monospaced font design&quot;).font(Font.system(size:30, design: .monospaced))
Text(&quot;Rounded font design&quot;).font(Font.system(size:30, design: .rounded))
Text(&quot;Serif font design&quot;).font(Font.system(size:30, design: .serif))

Text(&quot;Large Title&quot;).font(.largeTitle)
Text(&quot;Title&quot;).font(.title)
Text(&quot;Headline&quot;).font(.headline)
Text(&quot;SubHeadline&quot;).font(.subheadline)
Text(&quot;Body&quot;).font(.body)
Text(&quot;Callout&quot;).font(.callout)
Text(&quot;Caption&quot;).font(.caption)
Text(&quot;FootNote&quot;).font(.footnote)

Text(&quot;Custom font&quot;).font(Font.custom(&quot;OpenSans-Bold&quot;, size: 12.3))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자세한 사항은 다음을 참조하시기 바랍니다: https://github.com/arjun011/SwiftUI-Controls&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;텍스트에 대한 사용자 지정 글꼴을 설정하려면 헬베티카 노이에(Helvetica Neue)라고 하면 됩니다. 그러면 다음과 같은 작업을 수행할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Text(&quot;Hello World&quot;)
.font(.custom(&quot;Helvetica Neue&quot;, size: 20))
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;만약 당신이 시스템 폰트를 사용하고 싶다면, 그 경우에 당신은 다음과 같은 것을 할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Text(&quot;Hello World&quot;)
.font(.system(size: 20, weight: .light, design: .default))
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;// Using system font &quot;San Francisco&quot;
let fontSystem = Font.system(size: 13.0)

// Using installed custom font
let fontCustom = Font.custom(&quot;YOUR FONT NAME&quot;, size: 13.0)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;위치를 지정할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;font*&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;글꼴 스타일을 설정해야 하는 위치에 대해 상수를 지정합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;https://developer.apple.com/documentation/swiftui/font 의 &quot;시스템 글꼴 가져오기&quot; 섹션에서 자세히 확인하십시오.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;특정 크기의 시스템 글꼴을 추가하는 옵션을 검색하는 경우 동적 유형으로 확장됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-swift prettyprint-override&quot;&gt;&lt;code&gt;//Usage:
Text(&quot;Hello World&quot;).systemFont(size: 8.0, relativeTo: .caption, weight: .semibold)

extension View {
    func systemFont(size: CGFloat, relativeTo textStyle: Font.TextStyle, weight: Font.Weight = .regular) -&amp;gt; some View {
        modifier(SystemText(size: size, relativeTo: textStyle, weight: weight))
    }
}
struct SystemText: ViewModifier {
    @ScaledMetric var fontSize: CGFloat
    private let weight: Font.Weight

    init(size: CGFloat, relativeTo textStyle: Font.TextStyle, weight: Font.Weight = .regular) {
        _fontSize = ScaledMetric(wrappedValue: size, relativeTo: textStyle)
        self.weight = weight
    }

    func body(content: Content) -&amp;gt; some View {
        content.font(.system(size: fontSize).weight(weight))
    }
}

&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 이렇게 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;HStack {
 Text(&quot;hello world&quot;)
  .customFont(AppFonts.WorkSansSemiBold())
   .foregroundColor(Color(.label))
 }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마법이 여기에 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;import SwiftUI

public enum AppFonts {
    case WorkSansSemiBold(size: CGFloat = 20)
    case WorkSansMedium(size: CGFloat = 17)
    case WorkSansBold(size: CGFloat = 34)
    
    var rawValue: Font? {
        switch self {
        case .WorkSansSemiBold(let size):
            return Font.custom(&quot;WorkSans-SemiBold&quot;, size: size)
        case .WorkSansBold(let size):
            return Font.custom(&quot;WorkSans-Bold&quot;, size: size)
        case .WorkSansMedium(size: let size):
            return Font.custom(&quot;WorkSans-Medium&quot;, size: size)
        }
    }
}

extension View {
    func customFont(_ customFont: AppFonts) -&amp;gt; some View {
        self.font(customFont.rawValue)
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;맞춤 사이즈가 필요할 때는&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;.customFont(AppFonts.WorkSansSemiBold(size: 14))
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/56465083/custom-font-size-for-text-in-swiftui&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>swift</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/706</guid>
      <comments>https://fileupload.tistory.com/706#entry706comment</comments>
      <pubDate>Fri, 20 Oct 2023 14:08:31 +0900</pubDate>
    </item>
    <item>
      <title>Spring Boot @EnableScheduling 조건부</title>
      <link>https://fileupload.tistory.com/705</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Spring Boot @EnableScheduling 조건부&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;애플리케이션 속성에 따라 @EnableScheduling을 조건부로 만드는 방법이 있습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 속성에 따라 컨트롤러를 비활성화하는 것도 가능합니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 이루고자 하는 것은 웹 요청을 처리하는 데 동일한 스프링 부트 응용 프로그램을 사용하고(그러나 동일한 컴퓨터에서 예약된 작업을 실행하지 않는) 백엔드 서버에 동일한 응용 프로그램을 설치하여 예약된 작업만 실행하는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 앱은 이렇게 생겼습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@SpringBootApplication
@EnableScheduling
@EnableTransactionManagement
public class MyApp {

   public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
   }

}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 예정된 샘플 작업은 이렇게 보입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Component
public class MyTask {

   @Scheduled(fixedRate = 60000)
   public void doSomeBackendJob() {
       /* job implementation here */
   }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 문제를 해결했습니다. 다음은 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;앱에서 @EnableScheduling 주석 제거&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;애플리케이션 속성에 따라 스케줄링을 활성화/비활성화하기 위한 새 구성 클래스 및 조건부 추가&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;8&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;-&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt; @Configuration
 public class Scheduler {

    @Conditional(SchedulerCondition.class)
    @Bean(name = TaskManagementConfigUtils.SCHEDULED_ANNOTATION_PROCESSOR_BEAN_NAME)
    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
    public ScheduledAnnotationBeanPostProcessor scheduledAnnotationProcessor() {
        return new ScheduledAnnotationBeanPostProcessor();
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;9&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 조건반은&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;public class SchedulerCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return Boolean.valueOf(context.getEnvironment().getProperty(&quot;com.myapp.config.scheduler.enabled&quot;));
    }

}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;10&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또한 백엔드 서버에서 웹 서버를 비활성화하려면 application.properties 파일에 다음을 추가하기만 하면 됩니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;spring.main.web_environment=false
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;11&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같이 콩 주입에 주석을 달 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Bean
@ConditionalOnProperty(prefix = &quot;your.property&quot;, name = &quot;yes&quot;, matchIfMissing = true)
public void doSomeBackendJob() {
       /* job implementation here */
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;보너스: 서로 다른 기계에서 서로 다른 것을 실행하기를 원하므로, 다른 구성을 가진 동일한 앱을 배포할 수 있으므로 스프링 프로파일을 사용할 수 있습니다. 이 경우 클래스나 메서드에 주석을 달 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Component
@Profile({ Constants.SPRING_PROFILE_PRODUCTION, Constants.SPRING_PROFILE_TEST })
public class TheClass{...}
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스케줄링을 위해 별도의 @Configuration 클래스를 만들고 @ConditionalOnProperty 주석을 사용하여 스케줄링을 전환했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Configuration
@EnableScheduling
@ConditionalOnProperty(prefix = &quot;scheduling&quot;, name=&quot;enabled&quot;, havingValue=&quot;true&quot;, matchIfMissing = true)
public class SchedulerConfig {

}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;내 어플에서 .yml파일을 추가했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;scheduling:
  enabled: true
&lt;/code&gt;&lt;/pre&gt;&lt;ol&gt; 
 &lt;li papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스케줄러가 구성이 아닌 것 같습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;설정할 필요 없음&lt;/font&gt;&lt;/font&gt;&lt;code&gt;prefix&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인에&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@ConditionalOnProperty&lt;/code&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스케줄러를 생성할 필요가 없습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@Bean&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;구성 클래스에 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;나의 변형:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Component
@EnableScheduling
@ConditionalOnProperty(value = &quot;scheduler.enabled&quot;, havingValue = &quot;true&quot;)
public class MyScheduler {

    @Scheduled(...)
    public void doWork() {
        ...
    }
}

&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사용하는 대신&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@ConditionalOnProperty&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스프링 프로파일을 사용하여 조건부로 스케줄링을 켜거나 끌 수도 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;먼저 스케줄링 구성 요소를 활성화할 스프링 프로파일을 정의해야 합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;속성을 추가하여 활성 스프링 프로파일을 정의할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;spring.profiles.active&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;7&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신에게&lt;/font&gt;&lt;/font&gt;&lt;code&gt;application.properties&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파일. 예를 들어 프로파일의 이름을 짓겠습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cron&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;spring.profiles.active=cron
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음으로 다음과 같은 스케줄링 구성 요소에 주석을 달겠습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@Profile(&quot;cron&quot;)&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Service
@EnableScheduling
@Profile(&quot;cron&quot;)
public class ScheduleService {

    @Scheduled(...)
    public void cronJob() {
        ...
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@Profile&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;주석은 다음을 보장합니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ScheduleService&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;클래스는 다음과 같은 경우에만 활성화됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cron&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로파일이 설정되어 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;클래스와 둘 다 설정되지 않은 경우&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@EnableScheduling&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;주석은 에 의해 무시됩니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;spring&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신은 또한 그것을 조합할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cron&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다른 스프링 프로파일을 가진 프로파일입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;예를 들어, 응용 프로그램이 프로덕션 모드에서 실행 중일 때만 cron 작업이 활성화되기를 원한다고 가정합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 경우 다른 스프링 프로파일을 정의할 수 있습니다(예:&lt;/font&gt;&lt;/font&gt;&lt;code&gt;prod&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;)의 두 번째 조건으로 사용합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@Profile&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;21&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;주석.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;먼저 추가합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;prod&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;22&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;스프링 부동산에 대한 프로파일입니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;spring.profiles.active=prod,cron
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;23&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음에 조건을 변경합니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@Profile&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;24&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;대상:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;@Profile(&quot;prod &amp;amp; cron&quot;)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;25&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt; .&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;ScheduleService&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;26&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;둘 다 활성일 때만 활성화됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;prod&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;27&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;cron&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;28&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;프로파일이 활성화됩니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;고급을 정의하는 방법에 대한 자세한 정보&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;@Profile&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;29&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;조건은 &lt;a href=&quot;https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-definition-profiles-java&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;29-1&quot;&gt;여기서 찾을&lt;/a&gt; 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/39182633/spring-boot-enablescheduling-conditionally&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>spring-boot</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/705</guid>
      <comments>https://fileupload.tistory.com/705#entry705comment</comments>
      <pubDate>Fri, 20 Oct 2023 14:08:23 +0900</pubDate>
    </item>
    <item>
      <title>우커머스 주문 복원</title>
      <link>https://fileupload.tistory.com/704</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우커머스 주문 복원&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;최근에 제 서버 팀이 제 데이터베이스를 교체했고 그들은 우리의 이전 데이터베이스를 교체했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 우리는 하루[특정일]의 주문 내역을 잃어버렸습니다. 이제 서버 팀은 잃어버린 하루의 주문 내역이 포함된 백업을 제공합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 어떻게 하면 이 주문들을 복구할 수 있는지 알려주시겠습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;오늘도 주문이 있기 때문에 우리의 데이터베이스를 주어진 백업으로 대체할 수 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;누가 단계별 지시를 구분해 줄 수 있습니까?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;새 데이터베이스를 만들고 백업을 업로드했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;주문은 wp_posts, post meta 에 저장되어 있는 것으로 알고 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그래서 제가 해야 할 일은 무엇입니까? wp_posts에서 해당 날짜의 모든 주문을 내보내고 메타를 sql 파일로 게시합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러면 현재 데이터베이스로 가져오기만 하면 됩니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;무슨 문제라도 있습니까?&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;두 데이터베이스(백업 데이터베이스와 실제 데이터베이스)에 모두 동일한 주문 ID가 있다는 것을 짐작할 수 있듯이, 이 경우는 매우 복잡합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;주문이 이루어지면 데이터베이스 테이블 &quot;post&quot;, &quot;postmeta&quot;(및 일부 woCommerce 플러그인이 만든 wocommerce 관련 추가 테이블)이 채워집니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splited&quot;&gt;&lt;strong papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;누락된 데이터 검색:&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt; &lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;먼저 &quot;post&quot; &lt;strong papago-id=&quot;9-1&quot;&gt;백업&lt;/strong&gt; 테이블에서 &lt;strong papago-id=&quot;9-3&quot;&gt;특정&lt;/strong&gt; 날짜부터 shop_order &quot;post_type&quot;이 있는 모든 &quot;post_id&quot;를 찾아야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt; &lt;code&gt;SELECT * FROM 'posts' WHERE 'post_date' &amp;gt; '2016-03-15 00:00:00' AND 'post_type' LIKE 'shop_order' ORDER BY 'post_id' ASC&lt;/code&gt; &lt;br&gt; &lt;font papago-translate=&quot;splited&quot;&gt;&lt;em papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(여기서 시작 날짜와 시간을 정확하게 설정해야 합니다.)&lt;/font&gt;&lt;/font&gt;&lt;/em&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;모든 &lt;strong papago-id=&quot;11-1&quot;&gt;post_id&lt;/strong&gt;를 사용하면 &quot;postmeta&quot; 테이블에서 모든 관련 데이터를 검색할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt; &lt;code&gt;SELECT * FROM 'postmeta' WHERE 'post_id' &amp;gt; 2059 ORDER BY 'meta_id' ASC&lt;/code&gt; &lt;br&gt; &lt;font papago-translate=&quot;splited&quot;&gt;&lt;em papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(&lt;strong papago-id=&quot;12-1&quot;&gt;post_id&lt;/strong&gt; &quot;2059&quot;를 해당하는 실제 값으로 대체해야 합니다.)&lt;/font&gt;&lt;/em&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;splited&quot;&gt;&lt;strong papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;삽입할 새 데이터 준비 중:&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt; &lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;posts&quot; 테이블의 경우 &quot;post_id&quot;에 대해 다른 ID 번호를 모두 이동한 후 실제 데이터베이스에 삽입해야 하며, 실제 데이터베이스에 이미 사용된 ID에 따라 존재하지 않는 값이 새로 추가됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&quot;postmeta&quot; 테이블의 경우, 모든 이전 &quot;post_id&quot;를 &quot;posts&quot; 테이블에서 방금 생성된 새 값으로 교체해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;새 주문을 피하려면 상점을 유지 보수 모드로 전환해야 합니다(예: 이 무료 &lt;a href=&quot;https://fr.wordpress.org/plugins/lj-maintenance-mode/&quot; papago-id=&quot;16-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;유지&lt;/a&gt; 보수 &lt;a href=&quot;https://fr.wordpress.org/plugins/lj-maintenance-mode/&quot; papago-id=&quot;16-1&quot; rel=&quot;nofollow noreferrer&quot;&gt;모드&lt;/a&gt; 플러그인 사용).&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL에 익숙해야 하며 웹샵의 복제 버전에서 모든 것을 테스트하는 것이 좋다고 생각합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;17-1&quot;&gt;백업하기 전에 먼저...&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;font papago-translate=&quot;splited&quot;&gt;&lt;strong papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;편집&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://wordpress.stackexchange.com/questions/221781/restore-woocommerce-orders&quot; papago-id=&quot;8-1&quot;&gt;당신&lt;/a&gt;의 웹사이트와 데이터베이스는 &lt;a href=&quot;https://wordpress.stackexchange.com/questions/221781/restore-woocommerce-orders&quot; papago-id=&quot;8-1&quot;&gt;당신&lt;/a&gt;이 press&lt;a href=&quot;https://wordpress.stackexchange.com/questions/221781/restore-woocommerce-orders&quot; papago-id=&quot;8-1&quot;&gt;.stack&lt;/a&gt; exchange post라는 단어에서 말하는 것처럼 당신의 웹사이트와 데이터베이스는 매우 무겁습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;br&gt; &lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;가장 &lt;strong papago-id=&quot;9-0&quot;&gt;빠르고 쉬운 방법&lt;/strong&gt;:&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;strong papago-id=&quot;10-3&quot;&gt;따라서&lt;/strong&gt; 주문이 &lt;strong papago-id=&quot;10-3&quot;&gt;누락된 백업을 가져오는&lt;/strong&gt; 동일한 서버에 새&lt;strong papago-id=&quot;10-1&quot;&gt; 데이터베이스를 만드는&lt;/strong&gt; 것이 가장 좋은 방법일 수도 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;작업이 완료되면 아래 단계를 수행할 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;1) 웹 상점을 유지 보수 모드로 설정합니다&lt;em papago-id=&quot;11-1&quot;&gt;(예&lt;/em&gt;: 이 &lt;em papago-id=&quot;11-1&quot;&gt;무료&lt;/em&gt; &lt;em papago-id=&quot;11-1&quot;&gt;&lt;a href=&quot;https://fr.wordpress.org/plugins/lj-maintenance-mode/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;11-1-1&quot;&gt;유지 보수&lt;/a&gt;&lt;/em&gt; 모드 &lt;em papago-id=&quot;11-1&quot;&gt;플러그인 사용).&lt;/em&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;2) 만일의 경우를 대비하여 데이터베이스를 백업합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;3) wp-config. php 파일에서 데이터베이스를 변경합니다(주문 누락이 있는 이전 것으로).&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;14&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;4) 즉시 &lt;strong papago-id=&quot;14-1&quot;&gt;Maintenance Mode&lt;/strong&gt; 플러그인을 활성화하고 활성화합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;5) &lt;a href=&quot;https://wordpress.org/plugins/woocommerce-simply-order-export/&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;15-1&quot;&gt;WooCommerce Simply Order Export&lt;/a&gt; 플러그인을 설치하고 활성화합니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;6) 하루 주문 누락 데이터를 CSV 또는 XML 파일로 내보냅니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;17&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;7) wp-config. php 파일에서 데이터베이스를 변경합니다(모든 새 주문이 있는 실제 데이터베이스로).&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;18&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;8) &lt;strong papago-id=&quot;18-1&quot;&gt;WooCommerce Simply Order Export&lt;/strong&gt;를 활성화하고 CSV(또는 XML) 파일을 가져옵니다.&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;19&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;8) &lt;strong papago-id=&quot;19-1&quot;&gt;WooCommerce Simply Order Export&lt;/strong&gt; and &lt;strong papago-id=&quot;19-3&quot;&gt;Maintenance Mode&lt;/strong&gt; 플러그인을 비활성화합니다(필요한 경우 삭제).&lt;/font&gt;&lt;/font&gt;&lt;br&gt; &lt;br&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;20&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;당신은 해냈어요!&lt;/font&gt;&lt;/font&gt;&lt;br&gt; &lt;font papago-translate=&quot;splited&quot;&gt;&lt;em papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://wordpress.stackexchange.com/questions/221781/restore-woocommerce-orders&quot; papago-id=&quot;21-3&quot;&gt;그 게시물에 있는&lt;/a&gt; &lt;strong papago-id=&quot;21-1&quot;&gt;메훌 고힐&lt;/strong&gt;에게 감사드립니다.&lt;/font&gt;&lt;/em&gt;&lt;/font&gt;&lt;br&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;안부 전해요&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/36234875/restore-woocommerce-orders&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>WordPress</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/704</guid>
      <comments>https://fileupload.tistory.com/704#entry704comment</comments>
      <pubDate>Fri, 20 Oct 2023 14:08:15 +0900</pubDate>
    </item>
    <item>
      <title>localStorage의 크기를 찾는 방법</title>
      <link>https://fileupload.tistory.com/703</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;localStorage의 크기를 찾는 방법&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 HTML5의 로컬 스토리지를 활용할 수 있는 사이트를 개발 중입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;브라우저별 크기 제한에 대해서 다 읽어봤습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 로컬 스토리지 인스턴스의 현재 크기를 확인하는 방법에 대해서는 아무것도 보지 못했습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 &lt;a href=&quot;https://stackoverflow.com/questions/1248302/javascript-object-size&quot; papago-id=&quot;1-1&quot;&gt;질문&lt;/a&gt;은 자바스크립트에 주어진 변수의 크기를 보여주는 내장된 방식이 없다는 것을 나타내는 것 같습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;localStorage에 내가 보지 못한 메모리 크기 속성이 있습니까?&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 놓치고 있는 쉬운 방법이 있을까요?&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제 사이트는 사용자가 '오프라인' 모드로 정보를 입력할 수 있도록 하기 위한 것이므로, 저장 공간이 거의 가득 찼을 때 경고를 줄 수 있는 것은 매우 중요합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;자바스크립트 콘솔(한 줄 버전)에서 이 토막글을 실행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var _lsTotal=0,_xLen,_x;for(_x in localStorage){ if(!localStorage.hasOwnProperty(_x)){continue;} _xLen= ((localStorage[_x].length + _x.length)* 2);_lsTotal+=_xLen; console.log(_x.substr(0,50)+&quot; = &quot;+ (_xLen/1024).toFixed(2)+&quot; KB&quot;)};console.log(&quot;Total = &quot; + (_lsTotal / 1024).toFixed(2) + &quot; KB&quot;);


&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;읽기 위해 여러 줄로 동일한 코드를 사용합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var _lsTotal = 0,
    _xLen, _x;
for (_x in localStorage) {
    if (!localStorage.hasOwnProperty(_x)) {
        continue;
    }
    _xLen = ((localStorage[_x].length + _x.length) * 2);
    _lsTotal += _xLen;
    console.log(_x.substr(0, 50) + &quot; = &quot; + (_xLen / 1024).toFixed(2) + &quot; KB&quot;)
};
console.log(&quot;Total = &quot; + (_lsTotal / 1024).toFixed(2) + &quot; KB&quot;);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;또는 편리하게 사용하기 위해 책갈피의 '위치' 필드에 이 텍스트를 추가합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;javascript: var x, xLen, log=[],total=0;for (x in localStorage){if(!localStorage.hasOwnProperty(x)){continue;} xLen =  ((localStorage[x].length * 2 + x.length * 2)/1024); log.push(x.substr(0,30) + &quot; = &quot; +  xLen.toFixed(2) + &quot; KB&quot;); total+= xLen}; if (total &amp;gt; 1024){log.unshift(&quot;Total = &quot; + (total/1024).toFixed(2)+ &quot; MB&quot;);}else{log.unshift(&quot;Total = &quot; + total.toFixed(2)+ &quot; KB&quot;);}; alert(log.join(&quot;\n&quot;)); 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;추신: 의견 요청에 따라 토막글이 업데이트됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이제 계산에는 키 자체의 길이가 포함됩니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;charin javascript는 UTF-16으로 저장하기 때문에 각각의 길이에 2를 곱합니다(2바이트를 차지합니다).&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;추신. Chrome과 Firefox에서 모두 작동해야 합니다.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;0&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;@Shourav가 위에서 말한 것에서 벗어나, 나는 당신의 모든 것을 정확하게 잡을 수 있는 작은 함수를 썼습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;localStorage&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;1&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;(현재 도메인에 대한) 키와 결합된 크기를 계산하여 사용자가 사용하는 메모리의 양을 정확하게 알 수 있습니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;localStorage&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;2&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;개체:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var localStorageSpace = function(){
        var allStrings = '';
        for(var key in window.localStorage){
            if(window.localStorage.hasOwnProperty(key)){
                allStrings += window.localStorage[key];
            }
        }
        return allStrings ? 3 + ((allStrings.length*16)/(8*1024)) + ' KB' : 'Empty (0 KB)';
    };
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;3&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;반환된 내 것:&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;&quot;30.896484375 KB&quot;&lt;/code&gt;&lt;/p&gt;&lt;p papago-id=&quot;12&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Blob&quot; papago-id=&quot;12-1&quot; rel=&quot;noreferrer&quot; title=&quot;블롭 함수&quot; papago-attr-id=&quot;2&quot;&gt;Blob 기능&lt;/a&gt;을 사용하면 로컬 스토리지 데이터의 현재 크기를 얻을 수 있습니다&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Blob&quot; papago-id=&quot;12-1&quot; rel=&quot;noreferrer&quot; title=&quot;블롭 함수&quot; papago-attr-id=&quot;3&quot;&gt;.&lt;/a&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 기능은 이전 브라우저에서는 작동하지 않을 수 있습니다. 지원 기능 및 캐니유저를 확인하십시오.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;13&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;예:&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;return new Blob(Object.values(localStorage)).size;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Object.values()는 localStorage 개체를 배열로 바꿉니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Blob은 배열을 원시 데이터로 바꿉니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;15&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;IE에는 Storage 개체의 &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/cc197016(v=VS.85).aspx&quot; rel=&quot;nofollow noreferrer&quot; papago-id=&quot;15-1&quot;&gt;Space&lt;/a&gt; 속성이 남아 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;현재 다른 브라우저에는 이와 동등한 브라우저가 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;16&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;개인적으로 테스트를 해본 적은 없지만 기본 공간은 5MB로 알고 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음은 이 &lt;a href=&quot;http://jsfiddle.net/RLyam/&quot; rel=&quot;noreferrer&quot; papago-id=&quot;17-1&quot;&gt;방법&lt;/a&gt;의 간단한 예이며 모든 브라우저에서 작동해야 합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;alert(1024 * 1024 * 5 - unescape(encodeURIComponent(JSON.stringify(localStorage))).length);
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;누군가에게 도움이 되길 바랍니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;jsfiddle의 jas-예문은 저에게 통하지 않기 때문에 저는 이 해결책을 생각해 냈습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;(아래 코드에서 사용한 Serge Selletskyy와 Shourav의 비트에 감사드립니다.)&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래는 localStorage에 사용할 수 있는 공간과 (이미 lS에 있는 키가 있는 경우) 남아 있는 공간을 테스트하는 데 사용할 수 있는 기능입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;21&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이것은 아주 작은 힘이지만 파이어폭스를 제외한 거의 모든 브라우저에서 작동합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;데스크톱 FF에서는 완료하는 데 4-5분이 걸리고 Android에서는 충돌만 발생합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;22&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이 기능 아래에는 여러 플랫폼의 다른 브라우저에서 수행한 테스트에 대한 간단한 요약이 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;맛있게 드세요.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function testLocalStorage() {
    var timeStart = Date.now();
    var timeEnd, countKey, countValue, amountLeft, itemLength;
    var occupied = leftCount = 3; //Shurav's comment on initial overhead
//create localStorage entries until localStorage is totally filled and browser issues a warning.
    var i = 0;
    while (!error) {
        try {
//length of the 'value' was picked to be a compromise between speed and accuracy, 
// the longer the 'value' the quicker script and result less accurate. This one is around 2Kb 
            localStorage.setItem('testKey' + i, '11111111112222222222333333333344444444445555555555666661111111111222222222233333333334444444444555555555566666');
        } catch (e) {
            var error = e;
        }
        i++;
    }
//if the warning was issued - localStorage is full.
    if (error) {
//iterate through all keys and values to count their length
        for (var i = 0; i &amp;lt; localStorage.length; i++) {
            countKey = localStorage.key(i);
            countValue = localStorage.getItem(localStorage.key(i));
            itemLength = countKey.length + countValue.length;
//if the key is one of our 'test' keys count it separately
            if (countKey.indexOf(&quot;testKey&quot;) !== -1) {
                leftCount = leftCount + itemLength;
            }
//count all keys and their values
            occupied = occupied + itemLength;
        }
        ;
//all keys + values lenght recalculated to Mb
        occupied = (((occupied * 16) / (8 * 1024)) / 1024).toFixed(2);
//if there are any other keys then our 'testKeys' it will show how much localStorage is left
        amountLeft = occupied - (((leftCount * 16) / (8 * 1024)) / 1024).toFixed(2);
//iterate through all localStorage keys and remove 'testKeys'
        Object.keys(localStorage).forEach(function(key) {
            if (key.indexOf(&quot;testKey&quot;) !== -1) {
                localStorage.removeItem(key);
            }
        });

    }
//calculate execution time
    var timeEnd = Date.now();
    var time = timeEnd - timeStart;
//create message
    var message = 'Finished in: ' + time + 'ms \n total localStorage: ' + occupied + 'Mb \n localStorage left: ' + amountLeft + &quot;Mb&quot;;
//put the message on the screen
    document.getElementById('scene').innerText = message; //this works with Chrome,Safari, Opera, IE
//document.getElementById('scene').textContent = message;  //Required for Firefox to show messages
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;23&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고 다른 브라우저에서의 몇 가지 테스트 위에서 약속했듯이:&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;24&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;갤럭시탭 10.1&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;25&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;맥스톤패드 1.7~1130ms 5Mb&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;26&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;파이어폭스 20.0(베타 20.0)이 둘 다 충돌했습니다.&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;27&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;크롬 25.0.1364.169~22250ms/5Mb&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;28&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;네이티브(Safari 4.0/Webkit534로 식별됨).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;30) ~995ms/5Mb&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;29&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아이폰4s iOS 6.1.3&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;30&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사파리 ~ 520ms/5Mb&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;31&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;As HomeApp ~525ms/5Mb&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;32&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;iCab ~ 710ms/5mb&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;33&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MacBook Pro OSX 1.8.3 (Core 2 Duo 2.66 8Gb 메모리)&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;34&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사파리 6.0.3 ~105ms/5Mb&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;35&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;크롬 26.0.1410.43 ~3400ms/5Mb&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;36&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Firefox 20.00 300150ms(!)/10Mb (스크립트가 너무 오래 실행된다는 불만이 제기된 후)&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;37&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아이패드3 iOS 6.1.3&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;38&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사파리 ~430ms/5Mb&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;39&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;iCab ~595ms/5mb&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;40&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Windows 7 - 64b (Core 2 Duo 2.936Gb 메모리)&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;41&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사파리 5.1.7~80ms/5Mb&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;42&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;크롬 26.0.1410.43 ~1220ms/5Mb&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;43&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Firefox 20.0 228500ms(!) / 10Mb (스크립트가 너무 오래 실행된다는 불만이 제기된 후)&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;44&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;IE9 ~ 17900ms/9.54Mb (console.logs가 코드에 있는 경우 DevTools가 열릴 때까지 작동하지 않음)&lt;/font&gt;&lt;/li&gt; 
 &lt;li papago-id=&quot;45&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;Opera 12.15 ~4212ms / 3.55Mb (5Mb를 선택한 경우인데, Opera에서 lS의 양을 늘리려고 하는지 친절하게 묻습니다. 안타깝게도 몇 번 연속 테스트를 진행하면 충돌합니다.)&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong papago-id=&quot;46&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우승 8 (병렬 8 아래)&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li papago-id=&quot;47&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;IE10 ~7850ms/9.54Mb&lt;/font&gt;&lt;/li&gt; 
&lt;/ul&gt;&lt;p papago-id=&quot;48&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;로컬 스토리지는 다음과 같은 방법으로 계산할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function sizeofAllStorage(){  // provide the size in bytes of the data currently stored
  var size = 0;
  for (i=0; i&amp;lt;=localStorage.length-1; i++)  
  {  
  key = localStorage.key(i);  
  size += lengthInUtf8Bytes(localStorage.getItem(key));
  }  
  return size;
}

function lengthInUtf8Bytes(str) {
  // Matches only the 10.. bytes that are non-initial characters in a multi-byte sequence.
  var m = encodeURIComponent(str).match(/%[89ABab]/g);
  return str.length + (m ? m.length : 0);
}

console.log(sizeofAllStorage());
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;49&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;최종 크기(바이트)가 브라우저에 기록됩니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;50&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저는 @tennisgen의 코드를 사용해서 모든 것을 얻고 내용을 세지만, 키 자체를 셉니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var localStorageSpace = function(){
        var allStrings = '';
        for(var key in window.localStorage){
            allStrings += key;
            if(window.localStorage.hasOwnProperty(key)){
                allStrings += window.localStorage[key];
            }
        }
        return allStrings ? 3 + ((allStrings.length*16)/(8*1024)) + ' KB' : 'Empty (0 KB)';
    };
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;51&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;제가 이 문제를 해결한 방법은 Local Storage에서 사용된 공간과 남아있는 공간을 찾는 함수를 만들고 그 함수를 호출하여 최대 저장 공간을 결정하는 함수를 만드는 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function getUsedSpaceOfLocalStorageInBytes() {
    // Returns the total number of used space (in Bytes) of the Local Storage
    var b = 0;
    for (var key in window.localStorage) {
        if (window.localStorage.hasOwnProperty(key)) {
            b += key.length + localStorage.getItem(key).length;
        }
    }
    return b;
}

function getUnusedSpaceOfLocalStorageInBytes() {
    var maxByteSize = 10485760; // 10MB
    var minByteSize = 0;
    var tryByteSize = 0;
    var testQuotaKey = 'testQuota';
    var timeout = 20000;
    var startTime = new Date().getTime();
    var unusedSpace = 0;
    do {
        runtime = new Date().getTime() - startTime;
        try {
            tryByteSize = Math.floor((maxByteSize + minByteSize) / 2);
            //localStorage.setItem(testQuotaKey, new Array(tryByteSize).join('1'));
            
            //Recommended by @pkExec and @jrob007
            localStorage.setItem(testQuotaKey, String('1').repeat(tryByteSize));
            minByteSize = tryByteSize;
        } catch (e) {
            maxByteSize = tryByteSize - 1;
        }
    } while ((maxByteSize - minByteSize &amp;gt; 1) &amp;amp;&amp;amp; runtime &amp;lt; timeout);

    localStorage.removeItem(testQuotaKey);

    if (runtime &amp;gt;= timeout) {
        console.log(&quot;Unused space calculation may be off due to timeout.&quot;);
    }

    // Compensate for the byte size of the key that was used, then subtract 1 byte because the last value of the tryByteSize threw the exception
    unusedSpace = tryByteSize + testQuotaKey.length - 1;
    return unusedSpace;
}

function getLocalStorageQuotaInBytes() {
    // Returns the total Bytes of Local Storage Space that the browser supports
    var unused = getUnusedSpaceOfLocalStorageInBytes();
    var used = getUsedSpaceOfLocalStorageInBytes();
    var quota = unused + used;
    return quota;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;4&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;여기서 가장 많이 투표된 @serge의 답변 외에 키의 크기도 고려해야 합니다.&lt;/font&gt;&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;아래 코드에 저장된 키의 크기가 추가됩니다.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;code&gt;localStorage&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var t = 0; 
for (var x in localStorage) { 
    t += (x.length + localStorage[x].length) * 2; 
} 
console.log((t / 1024) + &quot; KB&quot;);
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;53&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;사양에 따라 문자열의 각 문자는 16비트입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;54&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 크롬(Settings &amp;gt; Content Settings &amp;gt; Cookies &amp;amp; Site data)으로 검사하면 로컬 스토리지를 시작하는 데 3kB(오버헤드 크기)가 소요됨을 알 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;5&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저장된 데이터 크기는 이 관계식을 따릅니다(정확하게는 1kB).&lt;/font&gt;&lt;/font&gt;&lt;br&gt; &lt;font papago-translate=&quot;translated&quot; papago-id=&quot;6&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;&lt;b papago-id=&quot;6-0&quot;&gt;3 + ((localStorage.x.length*16)/(8*1024))&lt;/b&gt; kB&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;57&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;localStorage.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;x는 저장 문자열입니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;58&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;네, 이 질문은 10년 전쯤에 한 질문입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;하지만 관심이 있는 사람들(저처럼 로컬 스토리지로 데이터를 저장하는 오프라인 텍스트 편집기를 만들고 있기 때문에)은 다음과 같은 간단한 것을 사용할 수 있습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre class=&quot;lang-js prettyprint-override&quot;&gt;&lt;code&gt;var warning = 1;
var limit = 2000000; //2 million characters, not really taking in account to bytes but for tested number of characters stored
setInterval(function() {
    localStorage[&quot;text&quot;] = document.getElementById(&quot;editor&quot;).innerHTML; //gets text and saves it in local storage under &quot;text&quot;
    if(localStorage[&quot;text&quot;].length &amp;gt; limit &amp;amp;&amp;amp; warning == 1){
            alert(&quot;Local Storage capacity has been filled&quot;); 
            warning = 2; //prevent a stream of alerts
    }
}, 1000);
//setInterval function saves and checks local storage
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;59&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;저장 용량을 채우는 가장 좋은 방법은 사이트 설정(예: 로컬 저장소에 이미지를 저장한 경우)을 보는 것입니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;적어도 크롬에서는 사용된 바이트의 양(즉, 1222바이트)을 볼 수 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그러나 js로 채워진 로컬 스토리지를 볼 수 있는 가장 좋은 방법은 위에서 이미 언급했으므로 이를 사용합니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;60&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;//메모리는 키와 값이 모두 차지하므로 업데이트된 코드입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;var jsonarr=[];
var jobj=null;
for(x in sessionStorage) // Iterate through each session key
{
    jobj={}; 
    jobj[x]=sessionStorage.getItem(x); //because key will also occupy some memory
    jsonarr.push(jobj);
    jobj=null;
}
//https://developer.mozilla.org/en/docs/Web/JavaScript/Data_structures 
//JavaScript's String type is used to represent textual data. It is a set of &quot;elements&quot; of 16-bit unsigned integer values. 
var size=JSON.stringify(jsonarr).length*2; //16-bit that's why multiply by 2
var arr=[&quot;bytes&quot;,&quot;KB&quot;,&quot;MB&quot;,&quot;GB&quot;,&quot;TB&quot;]; // Define Units
var sizeUnit=0;
while(size&amp;gt;1024){ // To get result in Proper Unit
    sizeUnit++;
    size/=1024;
}
alert(size.toFixed(2)+&quot; &quot;+arr[sizeUnit]);
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;61&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;페이지가 로드된 후 또는 다음과 같은 입력 포커스에서 테스트 내용을 사용하여 시도/캐치를 수행합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;function canSetItem(){
    const KEY = &quot;check_available_space&quot;
    try {
        localStorage.setItem(KEY, KEY);
    } catch(e) {
        console.error(e);
        return false;
    }
    localStorage.removeItem(KEY);
    return true;
}
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;window.localStorage.remainingSpace
&lt;/code&gt;&lt;/pre&gt;&lt;p papago-id=&quot;62&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/4391575/how-to-find-the-size-of-localstorage&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>javascript</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/703</guid>
      <comments>https://fileupload.tistory.com/703#entry703comment</comments>
      <pubDate>Fri, 20 Oct 2023 14:08:08 +0900</pubDate>
    </item>
    <item>
      <title>MySQL은 마스터에서는 더 빠르게 선택되지만 슬레이브에서는 더 느리게 선택됩니다.</title>
      <link>https://fileupload.tistory.com/702</link>
      <description>&lt;h2 papago-id=&quot;0&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;MySQL은 마스터에서는 더 빠르게 선택되지만 슬레이브에서는 더 느리게 선택됩니다.&lt;/font&gt;&lt;/h2&gt;
&lt;p papago-id=&quot;1&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우리는 MariaDB 데이터베이스를 실행하여 데이터가 매우 빠르게 축적되는 즉각적인 이벤트를 기록하고 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;MaxScale 클러스터에 이벤트를 삽입하는 1000개 이상의 센서가 서버로 데이터를 전송합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;클러스터에는 한 마스터가 이벤트를 삽입하고 두 슬레이브에 트랜잭션을 복제합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;2&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;이벤트는 시계열로 기록되므로 테이블에는 MySQL datetime 유형인 EventTime이라는 열이 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;Sensor라는 컬럼도 있습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;센서를 구분하는 ID로서, 바카르(20)의 종류를 갖는 것을 특징으로 하는 ID.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터는 두 달 만에 약 4억 행으로 증가했고, 최종적으로는 약 20억 행으로 증가할 것입니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;3&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;다음과 같은 선택 쿼리는 슬레이브 노드에서 마스터 노드보다 훨씬 느립니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;SELECT * FROM `table0` 
WHERE 
    (EventTime &amp;gt;= '2023-03-23 00:00:00' OR '2023-03-23 00:00:00' is null) 
AND 
    (EventTime &amp;lt;= '2023-03-23 23:59:59' OR '2023-03-23 23:59:59' is null) 
AND 
    (SensorID IN ('SL-1031-QL') OR COALESCE('SL-1031-QL') is null) 
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;4&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마스터와 슬레이브에 대한 위의 쿼리에 대한 설명은 동일합니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;MariaDB [db1000]&amp;gt; explain SELECT * FROM `table0` WHERE (EventTime &amp;gt;= '2023-03-23 00:00:00' OR '2023-03-23 00:00:00' is null) AND (EventTime &amp;lt;= '2023-03-23 23:59:59' OR '2023-03-23 23:59:59' is null) AND (EventID IN ('SL-1031-QL') OR COALESCE('SL-1031-QL') is null);
+------+-------------+-------+------+--------------------------+---------+---------+-------+--------+------------------------------------+
| id   | select_type | table | type | possible_keys            | key     | key_len | ref   | rows   | Extra                              |
+------+-------------+-------+------+--------------------------+---------+---------+-------+--------+------------------------------------+
|    1 | SIMPLE      | table0   | ref  | index_3,index_2,cindex_0 | index_2 | 62      | const | 365040 | Using index condition; Using where |
+------+-------------+-------+------+--------------------------+---------+---------+-------+--------+------------------------------------+
1 row in set (0.318 sec)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;5&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;인덱스는 다음과 같습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;MariaDB [db1000]&amp;gt; show index from db1000.table0;
+-------+------------+----------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name     | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| table0   |          0 | PRIMARY  |            1 | SensorID         | A         |   218159126 |     NULL | NULL   |      | BTREE      |         |               |
| table0   |          1 | index_3  |            1 | EventTime | A         |    21815912 |     NULL | NULL   |      | BTREE      |         |               |
| table0   |          1 | index_2  |            1 | EventID          | A         |      433715 |     NULL | NULL   |      | BTREE      |         |               |
| table0   |          1 | cindex_0 |            1 | EventTime | A         |    36359854 |     NULL | NULL   |      | BTREE      |         |               |
| table0   |          1 | cindex_0 |            2 | EventID          | A         |   218159126 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+----------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
6 rows in set (0.000 sec)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p papago-id=&quot;6&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터가 메모리에 이미 캐시되어 있으므로 디스크 어레이에서 데이터를 가져올 필요가 없으므로 마스터 노드가 더 빠른지 궁금합니다(마스터 SELECT는 거의 모두 10초 이내에 완료되는 반면 슬레이브 SELECT는 300초에서 1000초 사이입니다).&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;그렇다면 슬레이브 셀렉트 성능을 향상시키기 위해서는 어떻게 해야 합니까?&lt;/font&gt;&lt;/p&gt; 
&lt;h1 papago-id=&quot;7&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;효율성 문제를 해결하기 위한 이전의 시도:&lt;/font&gt;&lt;/h1&gt; 
&lt;p&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;8&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;조정을 시도했습니다.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;innodb_buffer_pool_size&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;9&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;innodb_buffer_pool_instances=8&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;10&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;버퍼 풀이 슬레이브 노드의 효율성에 영향을 미치는지 확인합니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;조정후&lt;/font&gt;&lt;/font&gt;&lt;code&gt;innodb_buffer_pool_size&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;11&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;메모리의 약 50%에 이르는 슬레이브 노드 모두에서 쿼리 시간이 눈에 띄게 향상되지 않습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;마스터 노드 값&lt;/font&gt;&lt;/font&gt;&lt;code&gt;innodb_buffer_pool_size&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;12&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;128M(메모리의 1% 미만)에 불과하며,&lt;/font&gt;&lt;/font&gt;&lt;code&gt;innodb_buffer_pool_instances=1&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;13&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;; 그러나 마스터 노드는 슬레이브 노드보다 훨씬 더 나은 성능을 유지합니다.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;14&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;우리는 또한 다음 두가지 케이스를 시도했습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;query_cache_type=OFF&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;15&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;query_cache_size=0&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;query_cache_type=ON&lt;/code&gt;&lt;font papago-translate=&quot;translated&quot; papago-id=&quot;16&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;그리고.&lt;/font&gt;&lt;/font&gt;&lt;code&gt;query_cache_size=16777216&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p papago-id=&quot;17&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;쿼리 기간에도 관찰 가능한 차이가 없습니다.&lt;/font&gt;&lt;/p&gt; 
&lt;p papago-id=&quot;18&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;마스터 노드에서 SELECT 쿼리를 실행하면 디스크 어레이에서 데이터를 가져오는 일이 거의 없는 반면 슬레이브 노드에서 실행하면 디스크 어레이에서 상당한 네트워크 트래픽이 발생한다는 것을 알 수 있습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;19&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터는 1Gbps 이더넷을 통해 SAN에 저장되었습니다.&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;데이터를 로컬 SSD로 이동한 후에는 효율성이 훨씬 향상되었습니다.&lt;/font&gt;&lt;/p&gt;&lt;p papago-id=&quot;20&quot; papago-translate=&quot;translated&quot;&gt;&lt;font class=&quot;papago-parent&quot;&gt;언급&lt;/font&gt;&lt;font class=&quot;papago-parent&quot;&gt;URL : https://stackoverflow.com/questions/75830839/mysql-select-faster-in-master-but-slower-in-slaves&lt;/font&gt;&lt;/p&gt;</description>
      <category>sourcetip</category>
      <category>MariaDB</category>
      <author>fileupload</author>
      <guid isPermaLink="true">https://fileupload.tistory.com/702</guid>
      <comments>https://fileupload.tistory.com/702#entry702comment</comments>
      <pubDate>Fri, 20 Oct 2023 14:07:57 +0900</pubDate>
    </item>
  </channel>
</rss>